# Vamp by Voosey

> Revamp Your Space

URL: https://vamp.voosey.com

---



## Vamp

URL: https://vamp.voosey.com/

Vamp by Voosey — revamp any space with AI. Generate, transform, and stage rooms in seconds.

![Featured Image](https://cdn.voosey.com/company/assets/Vamp-White-SM.png)

<style id="v-boot-style">#vamp-app{position:fixed;inset:0}.v-boot{position:fixed;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:18px;background:#000;color:#f5f5f7;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;z-index:9999}.v-boot-mark{font:700 34px/1 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.18em;background:linear-gradient(135deg,#5297F8,#82D6FF);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent}.v-boot-spin{width:30px;height:30px;border-radius:50%;border:3px solid rgba(245,245,247,.16);border-top-color:#5297F8;animation:vbootspin .8s linear infinite}@keyframes vbootspin{to{transform:rotate(360deg)}}.v-boot--error .v-boot-spin{display:none}.v-boot-msg{max-width:340px;text-align:center;color:rgba(245,245,247,.72);font-size:15px;line-height:1.5;margin:0 24px}.v-boot-retry{margin-top:6px;padding:10px 22px;border-radius:63px;border:0;cursor:pointer;font:600 15px/1 -apple-system,BlinkMacSystemFont,sans-serif;color:#fff;background:linear-gradient(135deg,#5297F8,#0A84FF)}</style><div id="vamp-app" aria-busy="true"><div class="v-boot"><div class="v-boot-mark">VAMP</div><div class="v-boot-spin" aria-hidden="true"></div><noscript>Vamp requires JavaScript. Please enable it to revamp your space.</noscript></div></div><script>(function () {  "use strict";  var APP_B64 = "LyogVm9vc2V5V2ViIGJ1bmRsZSDigJQgZ2VuZXJhdGVkIGJ5IGRlcGxveS9idWlsZC5zaCBvbiAyMDI2LTA2LTIwVDExOjM0OjIxWiAqLwoidXNlIHN0cmljdCI7CgovKiA9PT09PSBzcmMvanMvdXRpbC5qcyA9PT09PSAqLwoKKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwogIFYuTE9HT19XT1JETUFSSyA9ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQW1vQUFBQmdDQVlBQUFDdDFsNHdBQUFBQVhOU1IwSUFyczRjNlFBQUFIaGxXRWxtVFUwQUtnQUFBQWdBQkFFYUFBVUFBQUFCQUFBQVBnRWJBQVVBQUFBQkFBQUFSZ0VvQUFNQUFBQUJBQUlBQUlkcEFBUUFBQUFCQUFBQVRnQUFBQUFBQUFFc0FBQUFBUUFBQVN3QUFBQUJBQU9nQVFBREFBQUFBUUFCQUFDZ0FnQUVBQUFBQVFBQUFtcWdBd0FFQUFBQUFRQUFBR0FBQUFBQXk2ZXZpQUFBQUFsd1NGbHpBQUF1SXdBQUxpTUJlS1UvZGdBQU1DRkpSRUZVZUFIdG5RZllGTlhWZ0lNZ1l1L1IyRVdNYUdMRGJxTEUzaHZTSkdBaEdMREd4Q1NXMk10dmpUMldSSklJb29pOXhwSVlheXpSS0Jic1ZGRUVRV3lvaVBDL0wrNGlIM3hsZDJkMnArdzl6L04rMjJidVBlZmNtWHZQbkh0bnZsYmZTN0hNbWpWckFkUmJCbGFHOXJBV0xBZExRV3VZRHAvQlpCZ0hiOEY0UDdkcTFjcmY2bGJ3bmY1WkdsYUNOYUVENk12Rm9SMG9uOE1VZUJkZWg3Rit4bmRmOEJva2VDQjRJSGdnZUNCNElIZ2dZUSswU3JqK09kVVRXS2pMWXJBMmRJSXRZUU5ZRFF3NDJrSkw4ZzBiZkFRR0hLL0Njd1hlSlBqNGtQZTVsSUx2RE1BTVpEZUd6V0VqV0JXV2hZV2dKZEYzbjRDQjdtdndQT2cvL1RnUi84M2tOVWp3UVBCQThFRHdRUEJBOEVBTlBaQm9vRmJJK3BqcDJSRjJnQTFoRlNnbEtHT3prbVFHVzAyQWwrRkplQlJlSlBBd0U1ZFp3WGNHWHdhMTI4RTJZSUJtWUZaS1VNWm1KWW5CMnlRbyt1NWgzdXU3VDB2YU8yd1VQQkE4RUR3UVBCQThFRHdReVFPSkJHb0VHWXVnOWQ1d0NHd0JTMEt0NUVzcU1rdDBCd3dpNkREN2xobkJkL3BxRnpnSWZncExRSzNrS3lwNkEyNEhmVGV5VmhXSGVvSUhnZ2VDQjRJSGdnZUNCNnJzQVFNMDZBMVBRZEx5TlFxTWdCUEE2ZFZVQ3pvdUJRZkJmMkFHSkNuV1B4TE9oblZTN2JpZ1hQQkE4RUR3UVBCQThFQ0dQVkNUakJxRHVZdlg5NEJqd0N4UW1zVHB2YmZoU3JpZUxKR0w2MU1qK001MWV6dkJiK0FuVUpNMm81NVN4SFZyM29od0xRekVkKytWc2xNZXRxRmRiSWZsWVdkdzJ0bDJTbHFjcG40V25xWXRKaWF0VEszckwvUXpybXY5R2F3T2JTRHRNZ3NGN1hPZWdmL1Ficlpoa0hrOFFOdTZCdGNsSGx1Qk41UXRBR21VNHF6RC9TZzNodmFjRVplUytNQ2xMbzZmUDRhRjR5cTNEc3B4bkhLY3R5MitCbWZWcHNIbjRCSW8xMlovUEJkVGVmODViWmVhbStxcU91aHpZSGt5ZVhDZENqMGdyU2NYcXMxdXZNZDRQWnNHOGpWUktmaXVJMHFjQUYyaGVLZG1vbm8xVWJrSC8zQzRBRzdGZjU0VXVSWGF4dlBHenZJaWNIMWxtc1M3blcrQmMya0gxeGJXaGRBbVMySG9ZWEEwckpoQm94MDhiZ2JiYlVRRzlhK2F5clN0RjBSL2hQMGdEUmRFcGRqNkpodjlDdjVOZXhxOFJSSjhzQzhGbkFYclFwckgwVWgySnJ5ekFaM0JtUUdjd2RvSE1CNUd3VHZnVXlYR3dJUTQycFJ5U3BhcUJXb2NXQVlXZThJNTBLRmtqWkxmOEYxVWNBQyttc1pJSktMR2Q2N2hNMU56SmhnUVpFVW1vK2hnT0EvZlRjaUswdVhxU2Z1c3lqNEcwQVlHYVJTUDI4dmdmTnJCYkUzdWhUYlpHeU85SU95VVlXTnR0eitCNTgrSEdiWWpOdFZwMTlZVVpqLzRTMWcydG9KclU5QXdxam1SdG5TUXIxandnWUhxRU5nZTlFZVE1RHhnOW0wc3ZBYlBnVE1ZdnA5RU94dm9WVVZpajh3NXFCYUFOZEQyRXJnZXNoU2tvZTdzdTA1UDQvVXE3S2o1K2l2cVhJRzZqd09uRTdNVXBLSHU3STdVNE9VbTdOZ0pZaisrckNSSndTYUQ2RzJnVDVKNnRGRDN3dnplQlhiTFl4dk1henMyT25pdERxdk0rMXZHUHR0dSs4TStCWnN5cG41VjFEVUE3d1paQzlKMGh2MjNtZDZvNGhocWxqZ0VhVkU5R1gzL0pTakNkdldZUEEvK0RTL0NBNXl6SjBObldCeGlUWUxGT3BDaW5JUFl3U29OL1dFaHlLTFlHQTdFZDJEVG9XQUhXbFdoam5hd0E1WGNCS2RBRmpzbWZXU2Jid3RENFhKcytpR3ZlUkx0T1JvV1M3bFJMam5vQ2E2Znk3dllqNW5CWHpBSGhxNkpEVDhIMXlMVnRkQjM2SXVqWUkyTU9zSnhJNDVqY2xIS2FaTlJIOVNEMmdiUk84SVo4REE4QjFjNG5rTXNzVU1zZ1JyS21FVnJqM0ovZ1lHUWg4RlozM1NFQytGcTdIUGdxNHBRdHFudFkrRkc2RnlWU21wZjZESlVhYkErRFB2TUVtUmVzTU1UOGdEWUlpUEdiSStlM2REYnRzaTd6TXFSZ1FacHZXaTMxWEprVTFtbVlIdGJkckJQN0FSWkRsTGlPQzdqS0tNcy80ZU5LL2FBY1lQeHorSHdJRHpCc2Z3YldCbjhyU0twZU1kaWJWUnVCc1gwOUozUXEvaDlqbDdOcm1uWFlHemRPVTY3S0s4MS9JZ3luU1krRXd6WThpU202amNFcDVGOWxJZUJUaVlGM1QzT0RkRDZac2dBTTl3dXdLNkxLZEFNdFV0THFwcUZzZDBNc3MwVTFxUFk1KzRKUGpjeVNQQkFGajFnZk9XRmhqZkNQQW1uY2o2dkFtWEhYV1h2UUdXenhjckF5TkhIV2pqTjllUFpQK1R6ajFkMER0S0RzUGtNV0NHcW1aUmhCOVFidk5QTFRpbldPVzNLUzVNVU00YTNZdmQrRU1kMFFLM3RjeHJHcXlRZkRaQWw4UngxQ3RRT0kwaDJQT0E1WTd1NUhLS3VoUDVoZlF3ZUFLdldsZUhCMkR4N1lIV01jMG5UbzNBWXg3alQyU1ZMUllFYWxYaWwzaGYrV1hnMTIxQVBZb0QyZTNBNnI2SU9sUDJLQWE1WnREL0R1bEFQNGpHeU5md056TEIxeUlyUjZPcDZRYWR2WFllUVJka2VwYnNXN01paS92V3E4eVlZZmhEdHRsNjlPQUJiRjhOVysxZ3YvQ3NhbityRlY4SE9USHFnUFZwZkFiZHhyRzhLSlUzcmwzVWlVR2dyTURLOENBd3k2dkdLeDRERHhmSi94eGRIUThsQkt0dTZzSEJYdUJFT2hyWlFiMkltOFNBWWdqLzBSYW9GSFQyUk5nS3Y4TXM2WDFKa21CZFdYU0JNZ2Fhb1VVcFF4U3o3THRDRDQ3QmVwZ0Q3WWUvMlVGYkdnZTJEQkE5a3lRTXVvN29MRHVUY3RuOXVWa29lZUNpc0hTVjFoL3VnUCtSNXFnN3pXcFJWMk9KTXVCYmZ1TTZzV1dFYjEyY2RENE9nM3FlaERINDJCOWY5WFF4T0s2WlZ2REF4U0xPOXN5emVETk1ORERxRFpNY0RycEYxQ25SUHpwTmM5N25ZOTFQc1BCaFdnaURCQTNuM3dBOHcwSVRYS1J6N251ZE5Tb3VCR2dVNFZlZEFlaTFjRDNXVGhtL1NhOS85VUx6UjRIWjgxT2k4TTk4dkRMdXh5MjNnSExYVGFFRys5WURydlk0RXA1TDNTcHRUME1rc2htMjNiOXAwcTFBZnArdjN4NjZsSzl3LzdKYU1CMXhuNkNNN05rdW0rdXJYeWpIcG1yemZRc2ZxMXhacUNCNUlqUWRhbzhseGNHNXovWEt6Z1JvN212bllGRzRIT3dvL0Iybm9BWDFvdHVJOGNPMlZHWmpad25zRGthUEJBSGVyMlYrR1AvTjZvSGlNWFlPL2ZndXBtQTVHRDl2VlRLbUJaRjZPZTZlVFhHdTNLL2JsT2p1RGpYbVQ3VEdvTisxbVpqNVhVamdXRDhNbzE3Q1d2SlFrVjA0SXh0UzdCenorVCtWY1dLb3hSelFacUxHREo0elpoSnRndzhaMkR0ODE4TURpZkhKcTJPbTgzY0dyMzh2QjZkRmxJRWp6SGpBTjdKV0ZkOVdtWVQyT1U1Mkh3RHFRSjlHZUhoQ21RTFBWcXZiSFBySmpYODZQTE40MTNaeTM5K0JIRXdGbTFZSUVEOVNyQjM2RjRjN01lVU5OQTJrMFU4Q0dya2ZiQjY2R1JpTzhCcVdFRDBVUDJKbHVBMXZBcHhDbU9YRkNHV0lHOG5ENFBzZmdjZnp2dEVsbDdCdmJwdFJ0NXVsbjBDdTJRdE5WMEk2bzh5cDJqc2JISDZWTHRhQk5NeDd3NHFFUHZBTVBOYk5kWm43aUdQU2h2ZzVRN1RPamRGQTBlS0I2SGppUm9sL2l2SGlJdm5sNnNacjVBalUyTU5qd0NpY0VhVVV2bGYvcTlGMEkwc3IzbTN1WW1lenFHNDdGMzNLd1R2RjlyWVE2blJKMFRaQlQxaTNlalZNcnZXS3V4MERVdTBCZndkNmgrSGhXek9XSDRxcm5BUzhDL2E4Rjc5QnVJNnRYVGZWTHhnYkhuMk5nRTVodkxLcStCcUdHR25qZ1dlcDRDa3hjeENFZUoyYVU3WnVYQkxPd3pzYXNWUGpzbXE4c2k5azBaK0ZlNC93WVZleWJHNXdjL0tDUkc4Q2xFREpwT0NGSUloNHdXTnNiUHVDWVBJbUQ5WnNhYXVFYW9ON2c0SkZuY2RGMlQzZ2RYc2l6b1RtenpUN2FHMjllNTl5NG5ITmpXb2J0YzZuSVBoQnVic2x3STdhZytwUDhmaUhINlhzdGJGZnh6NXdISnBlY2pka1FIRGRNTkJtNE5ibTBpOS9TTEJ1alhGODRIejVSMFhrTldZSHZ6b2FWL1RGSThFQ0NIakFqYVNEUnExWTZjTUk3NWU5Tkg1NGs5U0E3WUtUL3BpZ01sTmxxYmMrTkEyRG5iS245bmJZY2Mrdnk2UWhZNDd0dnc3c2Nlc0RzVjFWdlhDSUkvQXJHdzMwd2dQcTJnMHZnUThpcUhJcmk3VGxQWnNkb2N6SnFmTEVFUDJqa1RpbTF6UG5hWitCT0dBR2ZnUWVBMHpobVAvWUVwd1dDTlBTQTJhalJjQ3Zvdjhrd0V3eEtWb1dmZ1ZjZ2Fiemh3VHRvZmFqd0NFN0E1M2xmYldsUEJRNGU5WkpOOXR4eEN2UmxmQnltUUhGRWhzVHNRUi9hYlNUbnhrc1owdHNsRFF1ajc3R3dQc3dlaUxLa2Y5QTEzUjdnZkhnYkRZL2xPSHVWVngrSk5lZEpET25XdklGMjMrZVRpUXFYTjN3eU8xRERJTlBwNjRHRFZOckU5VFB2ZzVtK2dUVENWNDBvK0E5cytEUGYvd0swSVdRRXYzWFN4N3dZb0oyUDM5NzQ5cXVHZi9IYkRYeXpMWndFMnpUOE5mRlBCdUxyd0FEMFBBSWJETmFySXBSdjZueC84R3FzbmtUL09nWGx4Yy93ZWpJOEI3YnVnZzF2Y3V5TzQ5ejRLRVAySElLdTZyNTRoblFPcW1iTUE1d1RmK1hjK0FGcW53QmVsR1pOOWtOaEgxdjFhZkZxWmttKzZBOXB5NnA4aVU3RFlIZWNmaVUwRnFUeE02bTFWcTBtOG5JaG1DRXc2MmJXcUY3bGF3eC9GZzZHL3ZpbTBTQ04zL1RibC9BZ2J3MVNqb054a0NheE05OEtxcFl0NVVRd1BXOVcxb3l5d1dHOXlZNFk3SU53N1FlQ1pNY0REajdkWUcvYXpvdnQxQXQ2Ym82Uy9TQmNUS2UrdFhLaDRFQ3NHQU5aakFjNm9IY25hT3QvSFdqTG01K0NWOVZwRWJObzQrRXc2RTBnVWRLVlB0dDlEUVlvZGdUSHd4U29OL2tFZzRkQU4zeHhCOHdveFFGc040bnRMblkvdUtlVWZXcTRqWjI2Z1VTMUJxTTFLTjhMbFpXZ0hzVTdqUXpVZDhISDlSaW9acm5OMTBMNTNyQmwybzNnMkZvYUhZK0ZqaENPczdRM1dBNzBZMXliZ0JsM3dPY1pOTWRFMmsrZ25XKzhLdHNWRm9FMGlObWdKOEJBNCsrbEJocHpLODQrTGlMOEV4d0V6OC85Vzg3ZnY0dDlwOE5SK0dCc3ViYXlqNEd1NjlnTVdpNkFUOHN0bzByYnUyWnNhMWd6N3ZJWlBDeDdEOWdyN3JJelZ0NTY2T3VhaVBVenBuZFE5OXVsQ3ovbldGNGw1Yzd3d3JzenVFWXRTUEJBclR4d054V2xaU3dyMStaTjJXRjJvTmFPTjV1VXUzY1Z0amVMTmhGT2hMMEpHSjZLVWdmN1QyUC9lOEVNMGVYZ3pRZDVGVzI5QzdwaTkwVVF5VmIyOTFicTA4Q0IrekZJZzNnMUhtc1F3Y0RtaFlwbEhnbHRvTjVsSnh6UUZiK0VLZEJzSFFuT2l1d0hacDE5bnpwQnJ4MVF5c3lmVHhZSUVqeFFTdys4UW1WandCdnJzaWJyb1BEeURsUS9nQjhtclAyWDFHOTZjbGVDQkorNU1qVU9mU2huRm95aXJPUEJUc0pwMGJ5SldUVHQ2NE90WnNOaUVjcWFCdmRSbUlIdXlaRDBOUEp5NkxBdEhYNmNVeWFyVVdaZmNQb295UGUrVjV3QzNUbG1Qd2ZmVnQ4REsxTEZBYkI5OWFzcXJ3YU9KWmN1SEF2aFBDdlBkV0hyR0R6QU9HYmlZaXc0VzVjMWNkeHJiNkRtbElmVFAwbUowNVNud0FFNDlJVnFLR0hRUWJsM3d5L2dWakI3bDNXWmpnRlBRbC9zODhHWHJrMkxYU2pYTE9kRjBBOWVqTDJDMGd0MGl0NnJpMWlPVlFZUGc1THRvQWRFRWR2QjQzWndsRUpTdEsvOWdRUCtCaW5TS2FoU21nYzJaek1mMmVGNWtncEJsOVlvY2pSNE0xQXFzMzJwY0ZSUW90b2VNS0dSeFl5YU1kcHEva21xUXphNmZReWNycnNBdnVKOTFZVHlaNElwMFA3d0t4aFp0Y3FxWDdEQjdSWFFBNXNlcW5aMTFHR2dleWZzRDVmQXgxQnJXWkFLVjRMSTY5UVlQTXpLdWFEWkFTVHFlcGx4bFBGL2NCNDhDbmtRcDBDZFJvc2xLTTZEUXpKaWc4ZjE3dENEdGxzaUpUcnZneDVkWUptVTZCUFVxRThQVE1Mc0xBWnF0dFltQm1yZVNGQnJNVXZqZE5wZUJBRTFIZHlvYnpMMVhnVUdIVU1oUzQxbmNPdjA1c0hnLzhFY3oydE5oTG9NZEExdVhVUFlFMnJhYmdVakYrSjEyY0w3S0M4R2ZFNkZieFNsRVBZMWkva2czQVZ2dzZVd0JiSXVjNlpBczI1SUhlcHZjRzJXZUxla2JTZFk3SUFPUjhHYVNlc1M2cTk3RDloWFoybXNuN3ZCTmpOUVcydnViNnI4ZmdibC94ZTZNT2lmQnpxdjVrSzlNK0JGS2phamNoSVl2S1ZkUGtWQkE4dGU2SDR2SkRKOVM3MWZ3UDNvOFhPNENMNkFXa2tiS2xveVNtVU1IdTNZZjJzNE9FbzU3RHNUWG9NcjhNZDBNQ1A4SDdnRzhpQk9nWGJIWCt2bndaZzZzOEcyNjAzYmJacVUzZFR0UmRXeDBBbGFKNlZIcURkNG9PQUJ4NmxFeHN3WVdtQmxBelhUNWJVU0J6ZURvdmRxVldGejlUQzRtZzQxQzJMUThVUnoyeWI0bXdkWE1aTTFBSjE5bndiNUVpWGVCN044dFJLUDFhaWRmdkVxUDFMQWh4NW1NLzlHZTR3b0dzLzdEM2gvQXlTUmJTeXFFZWZyemhUV2hVRTNMZE5vY2RxVzk3SjJ4TUJldE4zeUNSbHFuMnBXTHh3N0NUVkFxTGFCQjJvNVRqV29PSVlQclEzVXpOVFVTdHBTa1ozL0kzUWd2eXBjZGRXcTdrYnJZWEExUS9RQVB6cGRjQjU4MU9pR3lYejVHZFVPQXpPUVptNWNLNWFvMkdiUUdTVnVnZ3VnbGgyeEdkbUsxOGVoOS9mWjM3dFl0NEVvNHRXWmdiMUIyYnp5Rmwva1pRcDBjV3pwQ3E1Wnk3dE14VURKNmxYM3ZPMWo1cmdMN01keDMyYmVINnY1bWZvMnB2d0JzRm8xNndsbEJ3K1U0WUZhSnFUS1VLdWtUU2NicUxuR3BwWmluWjdBQmtVM2NGS3ZYY3ZLbTZxTElPZzlmanNkRG9MaFRXMVh3Ky9OMkp3Q2g2QmJHdlR4bnltN1B1d29jQXAyQjZpMUdLZ1p2Sll0Nkw0Z08yMEN2eXg3NS9sM2VJT3ZMcU5kNXJ2STRUdW5RSitDZ2ZQdmxzbHZmb3pXQitBL1gvTXNubU5ENEpVY0diazZ0cGpaaW5waFVySkxPRTRNN28rRkgwRWNnNk0zVG8wRno2c2d3UU9WZXFBdE84WnhQRlphZjVUOVhqRm9laXhLQ1JIMmRRMkRkd1RkeGNudFhVcnFrcWd3eUpvcHVROTZneG1qSkJZZjJpRTlBZ2VpejhVRm5maVluTkEyQzhLbWFIQWxuQXMrczZuV01wTUtwOENZQ2l0ZWsvME9nNmk2ZjBBWncyaVhwNXZTZzk4bThKdUQvcE5OYlpPeDczZENYKzhDcldYMnROWXU4dmk2RjI2RytRTHdXaXNUWTMydXh6VFFObWlyaFJ4S0pkdkJJakZVWnB0Y0FaNUhMclVJRWp4UXFRZThRU3FyZ2RyVEJrZE8xU1IxdGVKNm80N3dON2lPenNSRnNJa0tnK3czNEZYMUFIQmdmNjJHQ2sya3J2UEJ4MjQ4WE1ONm02eUtObG1PSDQrQjI2QTdSRjBqUmhFVmlSMzFTSEJkWEZtQ0RVdXp3MTZ3ZTFrN3pyL3hkTDU2RnE2ZC82ZjV2bm1EYnk0QnA5T3lMZ1pvWGNHQUxhOWlYK2d4ZGlzWXNNMkNQSWpUbnZ0Q044NkRoYXRwRU9WM3B2eStzRkpNOVhqUmZDTjQwMW5pRi9JeDJSU0tTY1lEamdGSmpWMVJMUjdwd1Q4YUtzMVNSRldndUw4ZGlDbjZmM0N5OTRYRVQwb0NKUWZZdjBKUHVBdXFLVTdwUFFObTBVNEJBN1pFaFRab0N6OUJpYUZnOExocW9ncDltMDE3RnQvb3E1SUZHenc1TjRRaklPcUpPb295cmtLSFNidzJLMnpqb084NnRyODB1MkYyZnF5TEtWRGFiUVJOY2owOGw1Mm1hVkZUYnlpd0g5dXh4UzByM0lEenpEcCtEUjBxTEdMZTNkN2xpOHZBY3k1SThFQlVENnhBQVZINy82ZzZWTEwvWit3MHhvRElOUDlMbFpRUTh6Nm1KVmVEeStGcVR2eFZZaTYvN09Mb3RNMnU2UnV6YStkQk5iSWpuMUR1RU9oTlhRL3dtcmpnZSsrSTdBT0RZWWZFRmZwV0FhYzlEV2JMRlk4cHAyUFdMSGZIZWJiM0pwTzdvT1ExbmJUbkJMWjMwSGZxSmcreU0wYjR2MER6UEFWcU8vMEx6T1FrZnNHa01qRkpKOG81a0xaejdWaXNRcG1PSTY1ZDljSnVvUmdLLzVveUxvTC9RbGtYWmpIVUhZckltUWNLeDZmeFJKc01tallXbmNkNWdrMERVOHhwU2ZVdmdpNTk0WDRjM0JNU2o0SVpjTjlIbjlPZ0d6d01jY2hNQ25GNnpJVzNQbmJqN1RnS2pWSUd2bll0MnNhVWNSVmNDVkdEbXlqcXpMMnZVL1A2NTgyNXYyenBQYmE0c0hsSDZOTFN0aTM4N2xyRkYrRksyc24zNVlnNlh3elZDUExMMFNPT2JmV252c3p6Rk9qM2FHT3pvYmZBYlpDWFFNRUw0VjNBUG5VcFh1T1VQU21zQjdoTUlnN1I5M2ZTRG5rNForTHdSeWdqbWdmTTlyYUhMQVpxdzlGNzJnS2NERi93NWgvd0dLUkZETTY4OHZ1cjBMR1lGVWxVN0x6aG55alJDODZDVHlJbzlEbjcyaG50UjVuWFduYUVzbUxadGRCNS80TENISndPQU8rU1NZdThoeUszNDZlU0YzbGpqd05UUi9CS3Z4MUVrVEhzYkR1TkxyZVFRdHVhVWN2TEZPajYyT0tEY05jcjF4ZFoycDUyRzRlK1p0WFMxQzlHZGFHQmRuZllrL1piSUdwaDdrODU5czFIZ3dOaEhPS0ZqUmVKbm5OQmdnZmk4TUJXRkxJQ3hITE14NkZRR1dVOHhiWmZGaFYzV3NjcFJ6TVhhWkxpMmpYdkRFM0ZWVHdkK0FjNHlHbFFwME5IVk9Dc0Q5bkhqdWh3eW5xdGd2MWozUVcvdG9JT0ZIb0JYQVpyUUpwa09zcThEUGVYcWRUS2JIOFFHRmhFRVlOREEvUmJLeTJFZHM3YkZLaVpHZThDWGF4U24yUmtQd1BzUVRBeUkvcVdvdVlQMmVqbnNGa3BHemUzRGUzdnhkeHZZQk9JSTF0aDBzQithRGpuVExtWmEzWUxFanpRMEFPT2IzempqVkJaN0tzK1J1L3ZBalZPQ2dPMHgrQkJTSnVZWGRzUWh1SDBzOEEwWnFLQ3YxemdOd3k2d2ZWZ01OR1M2T1BINFdBNG5qSW04NXFvNEVzUFhtMFlDdjFnUVVpYmpFV2g2L0NYQVc1SmdsMEcrRCtGQTB2YW9lbU5YQTVnTU8zRGhxTmV4SmdwdUFUeU1KMnpKSGJZK2FYaTRnazlxaUswdWNIQzNlRDU4WGxWS2ttbTBPMm8xbjh4dFZMRTZudXcvOTRRMTFUcWRaVDFBSDczNGloSThFQWNIdWhFSVI3djdlSW9yTVpsUEVGOVkreUhpaGsxNjU4Qy93ZnYrU0dGWW1kd0hMaDJ6U3Y2UkVYbmdSbTFJK0V3Y0VCdlNnd3lMb1h1N09QLzZaeloxSWExK0I3L0xRQWRxY3ZNbmhrRHI0alRLQjZUWnJMdUtsTzV0ZG4rS0ZpOHpQM20zWHc4WHd5bXZWNmU5NGR5UDFPRzA5di9nYitWdTI5S3Q5OEF2WHorWWQ2blFEMEd2U2hMNDBWc3BZZkdRdXk0bjlCK0ZWMmNGZHA5QUdXc1hxa1M4K3ozQXA4SHdydnpmQjgrQmc5VTVBR08wV1hZOFdoSVBMbFRnUUVtQ2J4QW5IM1JNaWRRWXlEeDZ2RkYrRDFFelI1UVJGV2tEYVVhSVErbEVVNENNeWVKQ240elBmbDMyQnRPQmp0MDE3Y1luRDBIbDBFdk9JRnRKL0NhcU9DemRpaXdLMXdQZmNCT080M3lCVW81NVhnaGZwdFJxb0xZdHdMYjlvU3RTOTJuaWUyczM4QnFjQk8vbC8wMWRuZ1JaR0Q4VE5rN3AzTUhqNlBjVDRIU2JzT3gwMnlQL1dOZXhLVUI5a3RtRzhvU3pyRkYyZUYzNEV6SG5ER2tyRUlhYm13ZmVpR013TmNPVUVHQ0J5SjVvREFPbkVzaCswQkZGeU9SRklpKzg5TVU4VERudyt6MTZ3WStjOFF2TWREc3haa0ZXczM1TVYxdnpLNFpGRzJOdnFlaDk3Tkpxa2Y5WnNqZUJxZG1XL05xSnNjZ2NqSy9UZWMxY1VFdjIzSVZHQUQ5WVZsSXEzeU5ZZ1pKUGxQT2dMY2t3Y2EyYkxnWjlDdHBoK1kzZW91Zkw2ZCtCNUU0NVEwS3V4aitDb3ZFV1hBQ1pTMUpuZnZESzNCN0F2WFhza292R2pyQ2F1Q1ZlaDVrQzR6NE9lZk5PeHpuNzVSaDBDRnN1eE1Zc01VaGY2WVFCNlZwY1JRV3lxaGZEM0FzTDRiMUhwdkh3T2JRRHJJbWpuK1h3dVNpNHZOZERYR3ltR3E3SE00cWJwVFNWd2ZsM2VBZUd1Y29jTkJJWFBDZlU2SlQ0WDFJUzVCbWg3b1AzQVluUXBxRE5JUGVGOEFNcEVGTk9kS2VqWStFcUtudWlaUnhDL1UvVVU3bHBXeExtV2JxSG9lSFM5aytBOXRzaUk0KzhtRzlET2hhc1lxMDIrZnNQQXp1Z0c4cUxpaGRPM3BSdVJjNGhlMEExNkt3M1paczlBdFlxY1dOUzl2Z1VUWWJoSDhubExaNTJDcGpIdkJjcVVxV2xHUFJ4MGt0QWUxaGV6aVZ1dXhYYjRCdElZdEJHbXJQMXY4aHpvazVNNXNOTW1wdW9iREJKeGg5RVcvTlhCM2xkeWtXQitWem9ETTZtMTN6Nmo1SXdRUDQ1QWU4dFEwUGgxUUVzd1hWR252eHBINGVma2M3L3JleERacjZEanZOY3V3TE96YTFUWW5mZXpXakRsN2xWMFd3N1QzMHZZbkMxNEcxcTFKSmJRdmRoZXBleFNiL042MFhlcmtVYkJ1RmpkZGozRnJRT1NkR0xvMGRQZUIxOEVLdVNjRjJnem1YeHBoWmpHTzJaUkxsWEF4bXI0UGswd043WWxaSGpoMHZVS01lTSs1dmNta2hjTVpxY1RCR01mR3dDTXlYZU9LN3JJbm40Ymt3ZFc3Rkd3M1UzSUJPYVNyT1BZRzNvK0JrOElST3F4UXpSa2JXWjZLa0QwczBNMU8zZ2g4OG1EZUY0MkN2RERqaU0zUzhGODZnN1VhVW95KzJtaGt3czNNWStENktlTHo3YjZJK2lGSklDZnZleHpicmd4bEFPNWtzaXhjQSs4RkxjRWVXRFNsQjk4ZlpaZ2lzQ2F1VnNIMFdOdGtBSlEvaVBCckZjZjlDTXdydnpHOWJReHlaQ3Z2bnkrQko2cHlUT2VCemtIeDVZQzNNa1NBdGU4QXg4SGN3a25PaVFmelNiQVRLeHFiN3I0QXU4QXlrV1F3Nk40WnI0Ukk2blRWNHJVdkI5dTlqK0xGd0MyUWhTQnVQbnFkRFA0NjVzb0kwOWxGV2gvNFFkZUQwS3NaZzBTQ3Fxb0tkVTZqZ1puaTRxaFhWcm5BRFpSK0VhN1lsdDBLN3pjQzRPOEZwVUxNRWVSRXowVTVoTjdvc2d1ODM0dmNEWVlXWURQWThHNFkvUDR5cHZGQk04RUNXUGVCTXp2SGdXczNwOHhyU2JLRG14dXhrQVkvQ1BuQTUyRkdsV1p3Q0d3RGVHYnBibWhXTld6ZnM5YkViWGgxZkEyZkRpbkhYRVhONUhsdFB3b0VjWjk3ZDZSVkZXWUs5UzdDRFUyOW1kS0tJMDY1bWhIeG1tdTlySWM5VGlRTitIcVorbkpid2ZPdENtNWpoenExd2ZFekV1S0hnRFFaNUViTzYzV0ZmMnE5QlZwclA5cWs5WUNlSVE4WlF5S1V3TW83Q1FobkJBeG4zZ09QTldlQmF6V21OMmRKaW9PWk83RHdMbkFweUd1MWdlQVBTTEF1aTNCYmd2NTg2R1JxOVNreXpBZVhxaG8yTHMwOVBHQUw3bHJ0L0F0dWJVYm9LZW5Gc1ZaUlZ3bWFQM3grQjA0ZmVYQkpGeHJIelFIU3AyZURoZVVXZFp1OXVoeThnNjdJVUJuU0ZIYkp1U0FuNi80OXRCc0dySld5YmxVM1dRTkVEd09uTjJWSTR4L2JnZysxcU1CZFZ6QlpjQk05ei9LZjlvaitxcldILzRJR1dQR0JnNXV6WEh6a2ZQbTFxNDVJQ3RlTE9GT1JnNGgwVlhsbGRER1ZuUU5pbmxtSkc2VVM0aVE1bnUxcFdYS3U2N0VqaGg5Um41M2N0L0xoV2RWZFl6NWZzWnlhaUo4ZlRyMkJzaGVXNDJ5cHdDS3puaHdqaWNmd3ZjQ3F5cG9MOWs2bndObmlrcGhWWHJ6S255SnhDeS9zVXFFSDIvV0JtYlNya1JiYkZrRjYwbitlVzRnVnZiK2pnaHhqRTVSaDNjOXpueVdjeHVDVVVVWWNlTUxQY0Y2N2hmSENaV1pOU1ZxQm1LUlJvZHMzc3cvSGcyald2TE5NczdWRE9LL3doZEQ3SGc1bW5YQWkyT01XMEx3eURmckF3cEZrbW9OdzUwSU5qNktFb2ltSzdWL2NPS21ZQW9zaE1kbjRaTGtHblJMSmExUHNNOVErR055SHIwZ29EZG9WNm1BSTF3UGZjdXhzOGp2SWd6a2E0ak1EMk0xanJDVCtET0dRRWhWd0pEbEJCZ2dmcTJRTVBZUHplNEdPZ1RGNDBLMjJhL2JXWkh5bDhPaWZ5UDluRVFPRlU2QU5ScDU4b29tcnlBMHIrQTJ5QTNtZWkvMnRWcTZrR0JXUERpbFJ6QkRqdHQxUU5xb3hTaFd2UlhvVFQ4YnVMaU9NUXM0aEh3V0lSQy91WS9WMmJ0aWcrM1RKaVdaWHVibmJHdExjQlkzdW8rTHhrM3pUSTBpamhWTmtyY0ZjYUZLcVdEaHpQYjNMY1hFLzVhOEdjS2NOcTFWZWpjbGVnbmdPaE0yd0NjZlRyVHZGY0NQN0Q5YndFdFpnVEpIaWdMQTlNWkd0bnYzeXl3Q2VsN2hscFFLQWlCNWh4ZEZRR0RIYklwOEhHa0ZaeFVPOE9HNkx6dWJ6ZWpBMHRSck5wTWdhOWZleUcweEVuZ1ZQUWFaZjNVZkRQOEZkOFBUWU9aZkdCUWFxWnRNMWpLTStnb2gvMGo2R3NxRVY0UHVWRk5zS1FBMmlyTjJuMzEvTmlWQk4yUE1MM0JtcXJ3OHFRQnpGQWs3amtPZ3J5SVo1bUlZTUVEOVNiQjd4UWNZbkwrZUMvU2l2cmhyV3lwejRiOHk2VmZzWDNkOE1lY0I2b1ZGcWxOWXF0QjMrQ2F4bElmSjhKUVZldmRJK0hXeUh0UVpySHdIMndQOGZIYVJCWGtGWU1WQTJ1NGhLUGlUU0kwNGFTQjlHT2Vwa0NuWTZ0ZDRBZHNlK0ROUFRBYzN3Y0NPTWJmaDArQlEvazNnTm16WWJDTHRDWGNmQmxLQ3RJMDBPeEJHb1dST1d1WFRON2NocVlObjhIMGl5dVZlc0pnd21BSEZCU0sralhHbjZNZ2xmQWFiQWNwRm04UTlncmg5NGNFMC9GckdoN3lqT0R1MHpNNVliaTR2ZUFVL0pkWVB2NGkwNVhpWVcrYndoYS9TdGRtaVd1elZRMEtHWVI4cFF4VHR5eFFZRlVlK0F0dExzQU9rTWYrb2Nud0NWQUZVbWJpdlpxWmllVStaS2d3c2NOdkFUSGdYY01tUVZKbzVoSjZRUSt4c01NbS9QR1U5S2tLSG90Z1Q3N3dRbXdUcHAwYTBRWHN3blB3cm40TWE2MWFIT3F3UmNHcVB2RGpuTytERy9TN2dIUEx4K0Urd2JIeEp0cFZ6YWlmdjlsZjRNMXAwRmRReG5rMjJjNlBrN2JmeEdjRVR5UWN3K013cjdId096Nm8rRC8vSTdsNGlUMlFBM2x6SzY1V1BRdE9tY3pIMDRIbkFGeHJuZWd1RmpGR3cxYzg5VVpuYjNSNFBGWVM2K2dNUFJ3Nm1odE1FQTdBTklhN0tMYWJKbkEzNnZCWUhmaXQxL0Y5eGQvZUt5Ni9yRS81R1Y2TUQ0SHBiY2syMnAzZUprMjlHSENhVjRXRWNtTDludlllQStGZU43K0dyeklxbWY1TjhZUHhpLzJEVUdDQi9MbUFZL3JWK0ZKTUVEN0g4UVduRkhXSEtsS29GWXNuUlAwS3pxdWYvRDVCVGdaRG9XcTFrbjVsVW83ZHR3SjFrWG5QL0xxczAwU3VRcWtmaCt6NFhUUjZaRG1BQmYxdm1jNjF6VW9wK0t2aC95aVNySUc1ZjRTVnFsUythSFk2bmxnR1lydUJpUEFRQ2Ezd2pud01lZnZVQXcwbytiU2lucTlxSEFRdXhDY0Fnb1NQSkJsRDVoNGNncC9ITmlIdlFpT2VRWnBrempucTM0WGM5V0RKb3d3OWZjK25kZXh2QnA1bmdwclExckZRT0EwV0IrZHowUC9tazdYVU9meTFHMUFld3o0UHMweUJlVnVnQXZ3MDlocUtZcFBscVRzM1dDZmF0VVJ5cTI2Qjd6ZzZFRmJPZ1dhNjhFYisxN0h6aUhZMndFMnE3cG4wMWVCQTljVjhBeStDRGRYcEs5OWdrYmZlY0NGL1Y4VytJUlh4N1JKOEM2TWhwSGdldnZ4OEFISDh3eGVheTVWRDlTS0ZtSGdGM1JlTi9MNUNYRHRXbDlJNjNTZWdjRkJzQlU2ZXhmckRlaHY1cWhxUWozNlltc3c4N2hkMVNxS3AyQTdYOWZqbkFVUDRwdXFYVkhnbHdXbzQwZHdKQ3dJUWJMcGdicVpBaTAwejc5NDdRQ3J3b3FGNytybHhheXBqejZhWEM4R0J6dWI5SURUM3cvQVIwMXVVZjBmSEova0d6QW8rd3BjZ3ZFWk9HdG1nT2I3ejRYajF1UlNxcVJtZ1pwV0Z3YjBNUXkrditHakRYZ1JwSFVxeXhzTjFvV0xvUk02bjRQK3B2TmpGOHAyYXFnM3VCNHQ3WjI2VnhzRDRkSnErWU95NXhhUEQ0UDZzRGg3YnE5azg3M0hlWGVvaHlsUWI2cTZEVnM3UWorb2FWOUxmVW5KS0NxK0JNeEVCQWtlY0pyUWRZcnZCVmRVN2dHekZUVVhHczJvMWs1c0wvRHFLODNpQTFHZGl2d2JIZTlXY1NwS2VhMmdQV1dlQVdidTBoeWtlVFV5SEk2QVA5UWlTTU0zaTFMWDl0QUxndVREQTUwd3d5blEzQWZlbkNPdWFYRUs5QkdvQnpIVDdvWHQvN0E5a1NtaWVuQnl4bXgwRnFSZTEybkcxbFNKQkdwcXo0bjhEUmh0OTRCZndqdVFWbGtZeFhhRllRd3d4OEZTVVJXbGpNVW9vd3ZjREFZLzdTQ3RZdHI2TCtERGE1M1NxTnBVWjlFQitNZVQyOEhjS1UvOUh5UWZIaWhPZ2U1SEd5K1NENU9hdGVJcGZqVllxNGNNMHpEc3ZJZis0ZU5tUFJKK0RCNElIaWpMQTRrRmFrVXRPYW1kSzNZcWJSY1lWUHcrcGE5T3c1MEtQaVMzNGtYQzdMc3FaWndKZndjekRHa1ZzMmd2d1NGd0pHMVZ5MkRhN0tMVHdXbS82eFVWZzVUcGdXWFlmbi80V1puN1pXNXp6aG5Qb2J2Z0puQU5URjdsVlF5N0VzYmsxY0JnVi9CQVVoNUlQRkRUY0Rxem1ZVWc0SEErSGcyVC9ENmxZblpuRHhoRXdOVVZ6QkNVSkd6YkJqWm5ZN05UeDRCWnRiU0tnOHJ0NEg4WHVMTXc0TlJFVjN4a2R0RnBaZ1BFSVBuMFFQRXUwTFh5YWQ1M1ZuSHVUT0hUalhEL2Q5L202cDE5eFlYd0VyWldQZHVlSzg4Rlk0SUhTdkJBS2dLMW9wNmM1Sjd3VjhIZThFRHgreFMrR3B5NVNGaGR6eVd3V0xrbEhkbkdMRUovdUFITUhxWlY3R2pmZ0dQaEVOcms1UVFVYlUrZFI0SHJBNFBrMHdQMlBUNEkxeW5RM0U5dEY4NmpRZGo3UWc2Yjh6cHMrbWVoLzg2aGVjR2s0SUZrUFpDNk81RTQyVjJFK2pTZHQxTWozaTExRWl3SGFSVDEralZzaDc3bjhub3YrbjgxdDZKODM1YlBuZUQzc0Era0tqaEduN25sVXo3Y0RXZGp4NGk1ZjZqVmUveTFQSFYxaGM0UjZ6VGdkSzFNbXJPemxacm9Ha2tELzlTZHYyVWE1UG5URFY2RmY1UzVieFkzL3lkS2U0SG4wb2UwOW1ubCt2VlpkcmdXeHBlN1k5ZytlQ0I0b0RRUHBMYWo5K3FNUWRzMUQ4UEJ0UG9tcFpsVTg2MjhxMlV6OEdyWmY1T2p2dStCZ1lKQmh4Mnp1aThMYVpZSktQY244TEVibnlhaEtMN1RsL3JxTUNoNVNya0pYVjFQWjNDYzVzeHNFNnEzK0xYSDI0bVE1c3hzaTBZVU50aVUxNTYwL1pzY2Q3VmNBMW1xZnJGdGgzM1RzTk1GOTk0a2N6QzBoaXlMTnhsZEFLOWgyNndzR3hKMER4NUlzd2RTRzZqcE5FNytyK25ZSHVXdGovSDREUXlBdEs3cldoVGR0aXpBUzJia0N6UjlBdnhINmc4bnJQVWExTy8wY05USGxEaUEzQVYzWTVPTHVYTWxuQk8ybDR2VDE0YjJHVGZPRExOVG9GN2svSW4yOG5qTXJXRGZhT3djZ29HMjNiWVpOL1FhOUg4Y203N011QjFCL2VDQlZIc2d6ZE53c3gxSEp6QUwzdWZESDhDcHc2ZG0veEQreE9FQk0zK25RMDk4bkdpUXh1RGxkSjQzYVJpVVJ4RURzNWZCZnc2ZnV5Qk54MkNYMmRwNzRVNW9NTlhPNXl4S2NRcDB1eXdxWDRIT2o3T1BHZmd4RmV5YmxsM3NMM3lRNlFkcFVTam9FVHlRVncra1BsQXJPcDRPd1ljcC9odTZ3RUJ3c0FwU21RY01ZSnlpSFlCZi9YK20zcFdXbUJDa09RVzBBUndCVWFlRHhsSEdRR3g2aDlmY0N2Wk54TGhid0l4ekhzUXBVQitFMnlFUHhqUm5BMjNuT2x5RGJLZEJzNWhCOU1MWjVTaHZRWkRnZ2VDQktuc2dNNEdhZnFDRE03dm1XcXFqNFZBWUMwSEs4OERIYkQ0WWV1SEx1OHZidFdwYnIwckp2NENvZy9SbmxHRXdmelBVZ3p5RGtVNkJqczZCc2ZaRlRvSHVTN0RXTGdmMk5Hc0M1OTZIYkRBVXZNRWdTK0pGM21Yd0xEWjhuU1hGZzY3QkExbjFRS1lDdGFLVDZTQ204ZjQ2MkJYczdFSjJEU2UwSUY3Ri93OE1jUHZodzBUdTZweFhSd1psMXh6dUFOM20vYTNNenk1bWZnTXV3N1lzWmluS05IZjJoWXVENWoxd08rUmhuWkJUb1B0RFo2Z0hlUUVqN2NlY3FzK0tlTHpkeWprMk9Tc0tCejJEQjdMdWdVd0dhanFkanNKL1FmVWFidzA4emdlektVRWE5NEMrTWZOUy9CZFFEdkNKQzBGYUs1VG9DR1pJRjQ2b2tOTXgxM05NdkJpeG5FenRqcjFPZ1pwQnpNc1U2T2JZNGhUb21wbHFpQXFVcGUyOHVQQ3VaTS9OcVJVVVVldGRQcURDUzJCa3JTc085UVVQMUxNSE1odW9GUnVOenM0ZzVHeHc2c3gxVjBFYWV1QmRQcDRGaCtPcjBRMS9TdnpUU21qUUIxeWZGa1hNSmowTmY0OVNTSWIzZlFiZFhlODBLc00yRkZXM1Q5b1Q2bVVLdEhnUjVacTFOTThNbUpIM1R1b1g2RWRTY2FHSExrR0NCK3JDQTVrUDFHeWxRckJtVm1GZnVCZytoWG9YcDRmdFdNMmllY1BBSjJseVNHRWQway9RNmFBWTlQSUsvd3BzekVKV0lnWnpHeGFCM1E3d3JqZThBL0l3QmJvOGRqZ1ZYaGRUb0xUZjI5aDZBeGh3cDFYK2cySkQwZFUxcmtHQ0I0SUhhdWlCWEFScStvc094QnNOUnZQMkZQZ2x1RjZwWHNYcHNBdmdRSHp5YkVxZHNEWjZIUWxMUnRUUFJkbTN3U01SeThuMDdyVHpKQXd3cTVhWEtkQXRzS1Y3UFV5QkZnNjhSM2oxSnAveGhjOXBlaG1MTWtQZ3NUUXBGWFFKSHFnWEQrUW1VQ3MyR0FPV1V3bTNRQzh3bzFSUDR2VEU4M0FvZmpnTlVubjF5K0Q3ZlhUc0R0dEFGTkhlRitGcWJIVzlUNzJMUWJucm5mSXlCZW96OWVwbEN0VEhEM2xUaURNRGFYbzJucnA0SVhRSDU1am5XNURnZ2VDQkduc2dkNEdhL3JORGdmL3h0aCtjQ0JNZzcySlFkaDM0OE5yVUJxZ0VhVzNSY1ZPd2JhTEthQXE0Qm52VG1JV0lhbHZaKytNSHAwRHZnVHhOZ1JyUTE4c1VxUDNVamZBd3BFWFV4U2xQcy9SQmdnZUNCeEx3UUM0RHRhSWY2VnljRHZvamRJWDdpdC9uN05YQmVRUTQzZXNOQTY1M1NiTjROOThSc0dKRUpWMXo5eUM0Q0R0SXdRT0ZZOTRwMEVkeTRwVE5zY083UU52bnhKNld6SGlPRFFiQjZ5MXRXSVBmWFQ3aWxLZVoyaURCQThFRENYa2cxNEdhUG1YZ21nNVA4clkvWEE1NWVzYVdDOGNOVmc3QnhtSGF5dnZVQ29QdFVpaTNTNEVvZWhhRFUyOGdDQS9kbk4rVERxd0dheVBuL3lsejM5aEg3UTU3RnJLeG1UT2dISVU1bmoyMnZhaDBDanZKbTZLS1MwanVSYWV3cktDY1JnemJCZy9FN0lIY0IycEZmOUhaK0ppS2srQlFlS1g0ZllaZmZXN1lPZEFIMjdKeXhic2MranFOMVJxaWlGT2QxMkczejlFTE1vOEg4SXVEL1QyUWx5blFGYkJsSTJndUM5dUszNk9JKzBjdEkwcjljL2FsL2N3V0c2alpoa2tGU1E5UnR4ZC9VM2xOV2xMUkxoVTZJUTdkNHlpalF2VmoyUzNyK3NmaWhDaUYxRTJncHBNS0hlQ052TzBLZ3lDTHp3TXlhL1lZK0MrZ3pnRHZlc3lLR0tBdEZGRlpNNktQdy9VUnk4bjE3aHdYVHZ2ZkN2b3FEOUlHSXhac3doQVh1WnQ5TXNOY3FYekdqa2xtc0Jyb1RmdDVFVElZL3R2Z2g5cDhHRTQxZzlEaHBkcFUxM1F0NkdDZzZ2cmJMTjdJb041eDNCanlFZVZrZGVaQTNWTTkwNE4rcVplNkN0UnNEVTc4bWVEYWk5K0NHYllwa0JYeHhMOE96S0k5a2hXbDU5SnpNdStqUGl2cVRjcnczMFE1c0FacDNnUDZlaWlNYW42ejFQL3FjZSthcmZjYjA1Ump3Y0g4TFhpN3NkOUwrTTRMdG5kZ1RBbmIxbktUaDZuTUM1SmEzZ3hsZitneFkwWXRMZUp4Yk4rUk5YR21JdzY5UGE1ZHhwQzFnTWMrZWpoNC9nWUpIcWpNQTZ4NVdSaDJnVWNnemZJTnlyMEdmY0c3SmpNcjZOOEJyb05wVUk3TVlPUGgwRDJ6eGllZ09QNWFDbjRMWXlHTE1oV2xMNE8xbW5NZnZ5OEVmZUFsOEh3cFZiNWd3MXRncytiS1QrbzM5Rm9CVG9VSlVHMzVrQXJPZzFXU3NyZXhldEhIdGowT3hzQk1TTHZZVi8wTE5vSFdqZGxVN25lVXN3VThDQjZ2V1pCSktIazhMRmV1cldINytUMFE1bzd4Q1FlVFQwSS9FTHdiY1UxSWszaUY2M1R0NVlWTVlKcDBxMGdYL0wwd08zYUU5V0RSRWdxWndUYnZ3VXY0d05jZ1pYZ0FmenR0dURwc0FIYWNXVG52aTVtMHQybjN6OUc3UmNGVzE3RzVubTBsME83bXhHbDBNMmtqS0Q4TmE3RWExUldidkRoYkEzNEUxV28vN2ZmdWNYMGRaUXFaSXFvaitNRyt1WGdNeHhJQVZVRlRzMTRlVS82ckxUTktzUW4yKzNEd2RlR0gwQzYyZ3VNdnlESExhZlBSK0NCcldjRDR2UkZLak04RG5BU3R3V3pQT1RBT2toWXpDWU5oeS9pc0RDVUZEd1FQQkE4RUR3UVBCQThFRDJUWUF3UkdCbXdkNFZ3WUNiVk10VHRsTXhFTTBINENhYjFxekhBTEI5V0RCNElIZ2dlQ0I0SUhzdU9CckV5QjFOeWpCRW42Wmxrd283VURiQTFPMVMwR2NZcDNCYmxROUNsNEJCNG5YVHlhMXlEQkE4RUR3UVBCQThFRHdRTjE3b0VRcUpWNEFCQzRMY1NtN1dGajJBSTJLWHcybUhNTlNTbmkzV1d1QlJrTkw0QzMzc3M3QkdjK095bEk4RUR3UVBCQThFRHdRUEJBOE1BY0Q0UkFiWTRyeW50VG1KWmNocjFXaFhWZ2JYQ3g3MXBnOE9hQytROWdETHdLTGpCOUhjeWVUU1l3aStQNU9oUVZKSGdnZUNCNElIZ2dlQ0I0SUs4ZStIK3dTZGg4dmRxS1FRQUFBQUJKUlU1RXJrSmdnZz09JzsKCiAgZnVuY3Rpb24gc2FmZURlY29kZShzKSB7CiAgICBpZiAocyA9PSBudWxsKSByZXR1cm4gJyc7CiAgICB0cnkgewoKICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChTdHJpbmcocykucmVwbGFjZSgvXCsvZywgJyAnKSk7CiAgICB9IGNhdGNoIChfZSkgewogICAgICByZXR1cm4gU3RyaW5nKHMpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcXMoaGFzaCkgewogICAgdmFyIHJhdyA9IGhhc2ggPT0gbnVsbCA/ICh3aW5kb3cubG9jYXRpb24gPyB3aW5kb3cubG9jYXRpb24uaGFzaCA6ICcnKSA6IFN0cmluZyhoYXNoKTsKCiAgICB2YXIgaGFzaElkeCA9IHJhdy5pbmRleE9mKCcjJyk7CiAgICBpZiAoaGFzaElkeCAhPT0gLTEpIHJhdyA9IHJhdy5zbGljZShoYXNoSWR4ICsgMSk7CgogICAgdmFyIHF1ZXJ5U3RyID0gJyc7CiAgICB2YXIgcUlkeCA9IHJhdy5pbmRleE9mKCc/Jyk7CiAgICBpZiAocUlkeCAhPT0gLTEpIHsKICAgICAgcXVlcnlTdHIgPSByYXcuc2xpY2UocUlkeCArIDEpOwogICAgICByYXcgPSByYXcuc2xpY2UoMCwgcUlkeCk7CiAgICB9CgogICAgdmFyIHJvdXRlID0gcmF3LnJlcGxhY2UoL15cLysvLCAnJykucmVwbGFjZSgvXC8rJC8sICcnKTsKICAgIGlmIChyb3V0ZSA9PT0gJycpIHJvdXRlID0gJ2NyZWF0ZSc7CgogICAgdmFyIHBhcmFtcyA9IHt9OwogICAgaWYgKHF1ZXJ5U3RyKSB7CiAgICAgIHZhciBwYWlycyA9IHF1ZXJ5U3RyLnNwbGl0KCcmJyk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2ldOwogICAgICAgIGlmICghcGFpcikgY29udGludWU7CiAgICAgICAgdmFyIGVxID0gcGFpci5pbmRleE9mKCc9Jyk7CiAgICAgICAgdmFyIGtleSwgdmFsOwogICAgICAgIGlmIChlcSA9PT0gLTEpIHsKICAgICAgICAgIGtleSA9IHNhZmVEZWNvZGUocGFpcik7CiAgICAgICAgICB2YWwgPSAnJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAga2V5ID0gc2FmZURlY29kZShwYWlyLnNsaWNlKDAsIGVxKSk7CiAgICAgICAgICB2YWwgPSBzYWZlRGVjb2RlKHBhaXIuc2xpY2UoZXEgKyAxKSk7CiAgICAgICAgfQogICAgICAgIGlmIChrZXkpIHBhcmFtc1trZXldID0gdmFsOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHsgcm91dGU6IHJvdXRlLCBwYXJhbXM6IHBhcmFtcyB9OwogIH0KCiAgZnVuY3Rpb24gcXNTdHJpbmcocGFyYW1zKSB7CiAgICBpZiAoIXBhcmFtcykgcmV0dXJuICcnOwogICAgdmFyIHBhcnRzID0gW107CiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHBhcmFtcyk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGsgPSBrZXlzW2ldOwogICAgICB2YXIgdiA9IHBhcmFtc1trXTsKICAgICAgaWYgKHYgPT0gbnVsbCkgY29udGludWU7CiAgICAgIHBhcnRzLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGspICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyh2KSkpOwogICAgfQogICAgcmV0dXJuIHBhcnRzLmpvaW4oJyYnKTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkSGFzaChyb3V0ZSwgcGFyYW1zKSB7CiAgICB2YXIgciA9IFN0cmluZyhyb3V0ZSB8fCAnY3JlYXRlJykucmVwbGFjZSgvXiM/XC8/LywgJycpOwogICAgdmFyIHF1ZXJ5ID0gcXNTdHJpbmcocGFyYW1zKTsKICAgIHJldHVybiAnIy8nICsgciArIChxdWVyeSA/ICc/JyArIHF1ZXJ5IDogJycpOwogIH0KCiAgZnVuY3Rpb24gZGVib3VuY2UoZm4sIG1zLCBpbW1lZGlhdGUpIHsKICAgIHZhciB3YWl0ID0gdHlwZW9mIG1zID09PSAnbnVtYmVyJyA/IG1zIDogMjAwOwogICAgdmFyIHRpbWVyID0gbnVsbDsKCiAgICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7CiAgICAgIHZhciBjdHggPSB0aGlzOwogICAgICB2YXIgYXJncyA9IGFyZ3VtZW50czsKICAgICAgdmFyIGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgdGltZXIgPT09IG51bGw7CgogICAgICBpZiAodGltZXIgIT09IG51bGwpIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgdGltZXIgPSBudWxsOwogICAgICAgIGlmICghaW1tZWRpYXRlKSBmbi5hcHBseShjdHgsIGFyZ3MpOwogICAgICB9LCB3YWl0KTsKCiAgICAgIGlmIChjYWxsTm93KSBmbi5hcHBseShjdHgsIGFyZ3MpOwogICAgfQoKICAgIGRlYm91bmNlZC5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICh0aW1lciAhPT0gbnVsbCkgewogICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICAgICAgdGltZXIgPSBudWxsOwogICAgICB9CiAgICB9OwoKICAgIHJldHVybiBkZWJvdW5jZWQ7CiAgfQoKICBmdW5jdGlvbiBzbGVlcChtcykgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CiAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgTWF0aC5tYXgoMCwgbXMgfCAwKSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHV1aWQoKSB7CiAgICB2YXIgYyA9ICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8pIHx8CiAgICAgICAgICAgICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY3J5cHRvKSB8fCBudWxsOwoKICAgIGlmIChjICYmIHR5cGVvZiBjLnJhbmRvbVVVSUQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdHJ5IHsgcmV0dXJuIGMucmFuZG9tVVVJRCgpOyB9IGNhdGNoIChfZSkgeyAgfQogICAgfQoKICAgIGlmIChjICYmIHR5cGVvZiBjLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICAgIGMuZ2V0UmFuZG9tVmFsdWVzKGJ5dGVzKTsKCiAgICAgIGJ5dGVzWzZdID0gKGJ5dGVzWzZdICYgMHgwZikgfCAweDQwOwogICAgICBieXRlc1s4XSA9IChieXRlc1s4XSAmIDB4M2YpIHwgMHg4MDsKICAgICAgdmFyIGhleCA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSBoZXhbaV0gPSAoaSArIDB4MTAwKS50b1N0cmluZygxNikuc2xpY2UoMSk7CiAgICAgIHZhciBiID0gYnl0ZXM7CiAgICAgIHJldHVybiAoCiAgICAgICAgaGV4W2JbMF1dICsgaGV4W2JbMV1dICsgaGV4W2JbMl1dICsgaGV4W2JbM11dICsgJy0nICsKICAgICAgICBoZXhbYls0XV0gKyBoZXhbYls1XV0gKyAnLScgKwogICAgICAgIGhleFtiWzZdXSArIGhleFtiWzddXSArICctJyArCiAgICAgICAgaGV4W2JbOF1dICsgaGV4W2JbOV1dICsgJy0nICsKICAgICAgICBoZXhbYlsxMF1dICsgaGV4W2JbMTFdXSArIGhleFtiWzEyXV0gKyBoZXhbYlsxM11dICsgaGV4W2JbMTRdXSArIGhleFtiWzE1XV0KICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoY2gpIHsKICAgICAgdmFyIHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDA7CiAgICAgIHZhciB2ID0gY2ggPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDg7CiAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gc2hvcnRJRChpZCkgewogICAgaWYgKCFpZCkgcmV0dXJuICcnOwogICAgcmV0dXJuIFN0cmluZyhpZCkucmVwbGFjZSgvLS9nLCAnJykuc2xpY2UoMCwgOCk7CiAgfQoKICBmdW5jdGlvbiBjbGFtcChuLCBtaW4sIG1heCkgewogICAgdmFyIGxvID0gbWluLCBoaSA9IG1heDsKICAgIGlmIChsbyA+IGhpKSB7IHZhciB0ID0gbG87IGxvID0gaGk7IGhpID0gdDsgfQogICAgbiA9ICtuOwogICAgaWYgKCFpc0Zpbml0ZShuKSkgcmV0dXJuIGxvOwogICAgcmV0dXJuIG4gPCBsbyA/IGxvIDogbiA+IGhpID8gaGkgOiBuOwogIH0KCiAgZnVuY3Rpb24gcmFuZG9tU2VlZCgpIHsKICAgIHZhciBjID0gKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0bykgfHwKICAgICAgICAgICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8pIHx8IG51bGw7CiAgICBpZiAoYyAmJiB0eXBlb2YgYy5nZXRSYW5kb21WYWx1ZXMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIGFyciA9IG5ldyBVaW50MzJBcnJheSgxKTsKICAgICAgYy5nZXRSYW5kb21WYWx1ZXMoYXJyKTsKICAgICAgcmV0dXJuIGFyclswXSAlIDEwMDAwMDA7CiAgICB9CiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMCk7CiAgfQoKICBmdW5jdGlvbiBwYXJzZURhdGUodmFsdWUpIHsKICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJykgcmV0dXJuIG51bGw7CiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IG51bGwgOiB2YWx1ZTsKCiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAvXlxkKyhcLlxkKyk/JC8udGVzdCh2YWx1ZS50cmltKCkpKSkgewogICAgICB2YXIgbnVtID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogcGFyc2VGbG9hdCh2YWx1ZSk7CiAgICAgIGlmICghaXNGaW5pdGUobnVtKSkgcmV0dXJuIG51bGw7CgogICAgICB2YXIgbXMgPSBudW0gPCAxZTExID8gbnVtICogMTAwMCA6IG51bTsKICAgICAgdmFyIGROdW0gPSBuZXcgRGF0ZShtcyk7CiAgICAgIHJldHVybiBpc05hTihkTnVtLmdldFRpbWUoKSkgPyBudWxsIDogZE51bTsKICAgIH0KCiAgICB2YXIgcyA9IFN0cmluZyh2YWx1ZSkudHJpbSgpOwogICAgdmFyIGQgPSBuZXcgRGF0ZShzKTsKICAgIGlmICghaXNOYU4oZC5nZXRUaW1lKCkpKSByZXR1cm4gZDsKCiAgICB2YXIgY29lcmNlZCA9IHMucmVwbGFjZSgnICcsICdUJyk7CiAgICBpZiAoIS9belpdfFsrLV1cZHsyfTo/XGR7Mn0kLy50ZXN0KGNvZXJjZWQpKSBjb2VyY2VkICs9ICdaJzsKICAgIGQgPSBuZXcgRGF0ZShjb2VyY2VkKTsKICAgIHJldHVybiBpc05hTihkLmdldFRpbWUoKSkgPyBudWxsIDogZDsKICB9CgogIHZhciBfYWJzRm10ID0gbnVsbDsKICBmdW5jdGlvbiBhYnNvbHV0ZUZvcm1hdHRlcigpIHsKICAgIGlmIChfYWJzRm10ICE9PSBudWxsKSByZXR1cm4gX2Fic0ZtdDsKICAgIHRyeSB7CiAgICAgIF9hYnNGbXQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh1bmRlZmluZWQsIHsKICAgICAgICB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywKICAgICAgICBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnCiAgICAgIH0pOwogICAgfSBjYXRjaCAoX2UpIHsKICAgICAgX2Fic0ZtdCA9IGZhbHNlOwogICAgfQogICAgcmV0dXJuIF9hYnNGbXQ7CiAgfQoKICBmdW5jdGlvbiBmbXREYXRlKHZhbHVlLCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBkID0gcGFyc2VEYXRlKHZhbHVlKTsKICAgIGlmICghZCkgcmV0dXJuICcnOwoKICAgIHZhciBub3dNcyA9IG9wdHMubm93ICE9IG51bGwgPyAob3B0cy5ub3cgaW5zdGFuY2VvZiBEYXRlID8gb3B0cy5ub3cuZ2V0VGltZSgpIDogK29wdHMubm93KSA6IERhdGUubm93KCk7CiAgICB2YXIgZGlmZiA9IG5vd01zIC0gZC5nZXRUaW1lKCk7CgogICAgaWYgKG9wdHMuYWJzb2x1dGUpIHJldHVybiBmb3JtYXRBYnNvbHV0ZShkKTsKCiAgICB2YXIgcmVsID0gZm9ybWF0UmVsYXRpdmUoZGlmZik7CiAgICBpZiAob3B0cy5yZWxhdGl2ZSkgcmV0dXJuIHJlbDsKCiAgICB2YXIgU0VWRU5fREFZUyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwOwogICAgaWYgKE1hdGguYWJzKGRpZmYpIDwgU0VWRU5fREFZUykgcmV0dXJuIHJlbDsKICAgIHJldHVybiBmb3JtYXRBYnNvbHV0ZShkKTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdEFic29sdXRlKGQpIHsKICAgIHZhciBmbXQgPSBhYnNvbHV0ZUZvcm1hdHRlcigpOwogICAgaWYgKGZtdCkgewogICAgICB0cnkgeyByZXR1cm4gZm10LmZvcm1hdChkKTsgfSBjYXRjaCAoX2UpIHsgIH0KICAgIH0KCiAgICByZXR1cm4gZC50b0xvY2FsZVN0cmluZwogICAgICA/IGQudG9Mb2NhbGVTdHJpbmcoKQogICAgICA6IGQudG9JU09TdHJpbmcoKS5yZXBsYWNlKCdUJywgJyAnKS5zbGljZSgwLCAxNik7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRSZWxhdGl2ZShkaWZmTXMpIHsKICAgIHZhciBmdXR1cmUgPSBkaWZmTXMgPCAwOwogICAgdmFyIG1zID0gTWF0aC5hYnMoZGlmZk1zKTsKICAgIHZhciBzID0gTWF0aC5yb3VuZChtcyAvIDEwMDApOwoKICAgIGlmIChzIDwgNSkgcmV0dXJuICdqdXN0IG5vdyc7CiAgICBpZiAocyA8IDYwKSByZXR1cm4gc3VmZml4KHMgKyAncycsIGZ1dHVyZSk7CgogICAgdmFyIG0gPSBNYXRoLnJvdW5kKHMgLyA2MCk7CiAgICBpZiAobSA8IDYwKSByZXR1cm4gc3VmZml4KG0gKyAnbScsIGZ1dHVyZSk7CgogICAgdmFyIGggPSBNYXRoLnJvdW5kKG0gLyA2MCk7CiAgICBpZiAoaCA8IDI0KSByZXR1cm4gc3VmZml4KGggKyAnaCcsIGZ1dHVyZSk7CgogICAgdmFyIGR5cyA9IE1hdGgucm91bmQoaCAvIDI0KTsKICAgIGlmIChkeXMgPCA3KSByZXR1cm4gc3VmZml4KGR5cyArICdkJywgZnV0dXJlKTsKCiAgICB2YXIgdyA9IE1hdGgucm91bmQoZHlzIC8gNyk7CiAgICBpZiAodyA8IDUpIHJldHVybiBzdWZmaXgodyArICd3JywgZnV0dXJlKTsKCiAgICB2YXIgbW8gPSBNYXRoLnJvdW5kKGR5cyAvIDMwKTsKICAgIGlmIChtbyA8IDEyKSByZXR1cm4gc3VmZml4KG1vICsgJ21vJywgZnV0dXJlKTsKCiAgICB2YXIgeSA9IE1hdGgucm91bmQoZHlzIC8gMzY1KTsKICAgIHJldHVybiBzdWZmaXgoeSArICd5JywgZnV0dXJlKTsKICB9CgogIGZ1bmN0aW9uIHN1ZmZpeChjb3JlLCBmdXR1cmUpIHsKICAgIHJldHVybiBmdXR1cmUgPyAnaW4gJyArIGNvcmUgOiBjb3JlICsgJyBhZ28nOwogIH0KCiAgZnVuY3Rpb24gaXNvRGF0ZSh2YWx1ZSkgewogICAgdmFyIGQgPSB2YWx1ZSA9PSBudWxsID8gbmV3IERhdGUoKSA6IHBhcnNlRGF0ZSh2YWx1ZSk7CiAgICBpZiAoIWQpIHJldHVybiAnJzsKCiAgICByZXR1cm4gZC50b0lTT1N0cmluZygpLnJlcGxhY2UoL1wuXGR7M31aJC8sICdaJyk7CiAgfQoKICBmdW5jdGlvbiBiNjQoc3RyKSB7CiAgICB2YXIgcyA9IHN0ciA9PSBudWxsID8gJycgOiBTdHJpbmcoc3RyKTsKCiAgICB0cnkgewogICAgICBpZiAodHlwZW9mIGJ0b2EgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICB2YXIgYmluID0gZW5jb2RlVVJJQ29tcG9uZW50KHMpLnJlcGxhY2UoLyUoWzAtOUEtRl17Mn0pL2csIGZ1bmN0aW9uIChfbSwgaGV4KSB7CiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChoZXgsIDE2KSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGJ0b2EoYmluKTsKICAgICAgfQogICAgfSBjYXRjaCAoX2UpIHsgIH0KCiAgICByZXR1cm4gYnl0ZXNUb0Jhc2U2NCh1dGY4Qnl0ZXMocykpOwogIH0KCiAgZnVuY3Rpb24gdW5iNjQoYikgewogICAgdmFyIHMgPSBiID09IG51bGwgPyAnJyA6IFN0cmluZyhiKTsKICAgIHRyeSB7CiAgICAgIGlmICh0eXBlb2YgYXRvYiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHZhciBiaW4gPSBhdG9iKHMpOwogICAgICAgIHZhciBwY3QgPSAnJzsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJpbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgcGN0ICs9ICclJyArICgnMDAnICsgYmluLmNoYXJDb2RlQXQoaSkudG9TdHJpbmcoMTYpKS5zbGljZSgtMik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocGN0KTsKICAgICAgfQogICAgfSBjYXRjaCAoX2UpIHsgIH0KICAgIHJldHVybiBiYXNlNjRUb1V0Zjgocyk7CiAgfQoKICBmdW5jdGlvbiB1dGY4Qnl0ZXMoc3RyKSB7CiAgICBpZiAodHlwZW9mIFRleHRFbmNvZGVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cik7CgogICAgdmFyIG91dCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGMgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgaWYgKGMgPCAweDgwKSBvdXQucHVzaChjKTsKICAgICAgZWxzZSBpZiAoYyA8IDB4ODAwKSB7CiAgICAgICAgb3V0LnB1c2goMHhjMCB8IChjID4+IDYpLCAweDgwIHwgKGMgJiAweDNmKSk7CiAgICAgIH0gZWxzZSBpZiAoYyA+PSAweGQ4MDAgJiYgYyA8PSAweGRiZmYpIHsKICAgICAgICB2YXIgYzIgPSBzdHIuY2hhckNvZGVBdCgrK2kpOwogICAgICAgIHZhciBjcCA9IDB4MTAwMDAgKyAoKChjICYgMHgzZmYpIDw8IDEwKSB8IChjMiAmIDB4M2ZmKSk7CiAgICAgICAgb3V0LnB1c2goMHhmMCB8IChjcCA+PiAxOCksIDB4ODAgfCAoKGNwID4+IDEyKSAmIDB4M2YpLCAweDgwIHwgKChjcCA+PiA2KSAmIDB4M2YpLCAweDgwIHwgKGNwICYgMHgzZikpOwogICAgICB9IGVsc2UgewogICAgICAgIG91dC5wdXNoKDB4ZTAgfCAoYyA+PiAxMiksIDB4ODAgfCAoKGMgPj4gNikgJiAweDNmKSwgMHg4MCB8IChjICYgMHgzZikpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkob3V0KTsKICB9CgogIHZhciBCNjRfQ0hBUlMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CgogIGZ1bmN0aW9uIGJ5dGVzVG9CYXNlNjQoYnl0ZXMpIHsKICAgIHZhciBvdXQgPSAnJzsKICAgIHZhciBpOwogICAgZm9yIChpID0gMDsgaSArIDIgPCBieXRlcy5sZW5ndGg7IGkgKz0gMykgewogICAgICB2YXIgbiA9IChieXRlc1tpXSA8PCAxNikgfCAoYnl0ZXNbaSArIDFdIDw8IDgpIHwgYnl0ZXNbaSArIDJdOwogICAgICBvdXQgKz0gQjY0X0NIQVJTWyhuID4+IDE4KSAmIDYzXSArIEI2NF9DSEFSU1sobiA+PiAxMikgJiA2M10gKyBCNjRfQ0hBUlNbKG4gPj4gNikgJiA2M10gKyBCNjRfQ0hBUlNbbiAmIDYzXTsKICAgIH0KICAgIHZhciByZW0gPSBieXRlcy5sZW5ndGggLSBpOwogICAgaWYgKHJlbSA9PT0gMSkgewogICAgICB2YXIgYSA9IGJ5dGVzW2ldIDw8IDE2OwogICAgICBvdXQgKz0gQjY0X0NIQVJTWyhhID4+IDE4KSAmIDYzXSArIEI2NF9DSEFSU1soYSA+PiAxMikgJiA2M10gKyAnPT0nOwogICAgfSBlbHNlIGlmIChyZW0gPT09IDIpIHsKICAgICAgdmFyIGIgPSAoYnl0ZXNbaV0gPDwgMTYpIHwgKGJ5dGVzW2kgKyAxXSA8PCA4KTsKICAgICAgb3V0ICs9IEI2NF9DSEFSU1soYiA+PiAxOCkgJiA2M10gKyBCNjRfQ0hBUlNbKGIgPj4gMTIpICYgNjNdICsgQjY0X0NIQVJTWyhiID4+IDYpICYgNjNdICsgJz0nOwogICAgfQogICAgcmV0dXJuIG91dDsKICB9CgogIGZ1bmN0aW9uIGJhc2U2NFRvVXRmOChiKSB7CiAgICB2YXIgY2xlYW4gPSBiLnJlcGxhY2UoL1teQS1aYS16MC05Ky89XS9nLCAnJyk7CiAgICB2YXIgYnl0ZXMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xlYW4ubGVuZ3RoOyBpICs9IDQpIHsKICAgICAgdmFyIGUwID0gQjY0X0NIQVJTLmluZGV4T2YoY2xlYW5baV0pOwogICAgICB2YXIgZTEgPSBCNjRfQ0hBUlMuaW5kZXhPZihjbGVhbltpICsgMV0pOwogICAgICB2YXIgZTIgPSBjbGVhbltpICsgMl0gPT09ICc9JyA/IC0xIDogQjY0X0NIQVJTLmluZGV4T2YoY2xlYW5baSArIDJdKTsKICAgICAgdmFyIGUzID0gY2xlYW5baSArIDNdID09PSAnPScgPyAtMSA6IEI2NF9DSEFSUy5pbmRleE9mKGNsZWFuW2kgKyAzXSk7CiAgICAgIHZhciBuID0gKGUwIDw8IDE4KSB8IChlMSA8PCAxMikgfCAoKGUyIDwgMCA/IDAgOiBlMikgPDwgNikgfCAoZTMgPCAwID8gMCA6IGUzKTsKICAgICAgYnl0ZXMucHVzaCgobiA+PiAxNikgJiAweGZmKTsKICAgICAgaWYgKGUyID49IDApIGJ5dGVzLnB1c2goKG4gPj4gOCkgJiAweGZmKTsKICAgICAgaWYgKGUzID49IDApIGJ5dGVzLnB1c2gobiAmIDB4ZmYpOwogICAgfQogICAgaWYgKHR5cGVvZiBUZXh0RGVjb2RlciA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShuZXcgVWludDhBcnJheShieXRlcykpOwogICAgdmFyIHN0ciA9ICcnOwogICAgZm9yICh2YXIgaiA9IDA7IGogPCBieXRlcy5sZW5ndGg7IGorKykgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbal0pOwogICAgdHJ5IHsgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoc3RyKSk7IH0gY2F0Y2ggKF9lKSB7IHJldHVybiBzdHI7IH0KICB9CgogIGZ1bmN0aW9uIGJhc2ljQXV0aEhlYWRlcihlbWFpbCwgcHcpIHsKICAgIHZhciBlID0gKGVtYWlsID09IG51bGwgPyAnJyA6IFN0cmluZyhlbWFpbCkpLnRvTG93ZXJDYXNlKCk7CiAgICB2YXIgcCA9IHB3ID09IG51bGwgPyAnJyA6IFN0cmluZyhwdyk7CiAgICByZXR1cm4gJ0Jhc2ljICcgKyBiNjQoZSArICc6JyArIHApOwogIH0KCiAgdmFyIEhUTUxfRVNDQVBFUyA9IHsKICAgICcmJzogJyZhbXA7JywKICAgICc8JzogJyZsdDsnLAogICAgJz4nOiAnJmd0OycsCiAgICAnIic6ICcmcXVvdDsnLAogICAgIiciOiAnJiMzOTsnLAogICAgJ2AnOiAnJiM5NjsnLAogICAgJz0nOiAnJiM2MTsnCiAgfTsKCiAgZnVuY3Rpb24gZXNjYXBlSHRtbChzKSB7CiAgICBpZiAocyA9PSBudWxsKSByZXR1cm4gJyc7CiAgICByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoL1smPD4iJ2A9XS9nLCBmdW5jdGlvbiAoY2gpIHsKICAgICAgcmV0dXJuIEhUTUxfRVNDQVBFU1tjaF07CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGRvd25sb2FkKHVybCwgZmlsZW5hbWUpIHsKICAgIGlmICghdXJsKSByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdkb3dubG9hZDogbWlzc2luZyB1cmwnKSk7CiAgICB2YXIgbmFtZSA9IGZpbGVuYW1lIHx8IGluZmVyRmlsZW5hbWUodXJsKTsKCiAgICByZXR1cm4gZmV0Y2godXJsLCB7IG1vZGU6ICdjb3JzJywgY3JlZGVudGlhbHM6ICdvbWl0JyB9KQogICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcignZG93bmxvYWQ6IEhUVFAgJyArIHJlcy5zdGF0dXMpOwogICAgICAgIHJldHVybiByZXMuYmxvYigpOwogICAgICB9KQogICAgICAudGhlbihmdW5jdGlvbiAoYmxvYikgewoKICAgICAgICBpZiAobmFtZS5pbmRleE9mKCcuJykgPT09IC0xKSB7CiAgICAgICAgICB2YXIgZXh0ID0gZXh0Rm9yTWltZShibG9iLnR5cGUpOwogICAgICAgICAgaWYgKGV4dCkgbmFtZSArPSAnLicgKyBleHQ7CiAgICAgICAgfQogICAgICAgIHRyaWdnZXJCbG9iRG93bmxvYWQoYmxvYiwgbmFtZSk7CiAgICAgIH0pCiAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CgogICAgICAgIHRyeSB7CiAgICAgICAgICB2YXIgdyA9IHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycsICdub29wZW5lcicpOwogICAgICAgICAgaWYgKHcpIHJldHVybjsKICAgICAgICB9IGNhdGNoIChfZSkgeyAgfQogICAgICAgIHRocm93IGVycjsKICAgICAgfSk7CiAgfQoKICBmdW5jdGlvbiB0cmlnZ2VyQmxvYkRvd25sb2FkKGJsb2IsIG5hbWUpIHsKICAgIHZhciBvYmpVUkwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICBhLmhyZWYgPSBvYmpVUkw7CiAgICBhLmRvd25sb2FkID0gbmFtZSB8fCAnZG93bmxvYWQnOwogICAgYS5yZWwgPSAnbm9vcGVuZXInOwogICAgYS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsKICAgIGEuY2xpY2soKTsKCiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTsKICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChvYmpVUkwpOwogICAgfSwgMTUwMCk7CiAgfQoKICBmdW5jdGlvbiBpbmZlckZpbGVuYW1lKHVybCkgewogICAgdHJ5IHsKICAgICAgdmFyIHUgPSBuZXcgVVJMKHVybCwgd2luZG93LmxvY2F0aW9uID8gd2luZG93LmxvY2F0aW9uLmhyZWYgOiB1bmRlZmluZWQpOwogICAgICB2YXIgbGFzdCA9IHUucGF0aG5hbWUuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbikucG9wKCk7CiAgICAgIGlmIChsYXN0KSByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGxhc3QpOwogICAgfSBjYXRjaCAoX2UpIHsgIH0KICAgIHZhciBzdHJpcHBlZCA9IFN0cmluZyh1cmwpLnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXTsKICAgIHZhciBzZWcgPSBzdHJpcHBlZC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5wb3AoKTsKICAgIHJldHVybiBzZWcgfHwgKCd2YW1wLScgKyBEYXRlLm5vdygpKTsKICB9CgogIGZ1bmN0aW9uIGV4dEZvck1pbWUobWltZSkgewogICAgc3dpdGNoIChtaW1lKSB7CiAgICAgIGNhc2UgJ2ltYWdlL2pwZWcnOiByZXR1cm4gJ2pwZyc7CiAgICAgIGNhc2UgJ2ltYWdlL3BuZyc6IHJldHVybiAncG5nJzsKICAgICAgY2FzZSAnaW1hZ2Uvd2VicCc6IHJldHVybiAnd2VicCc7CiAgICAgIGNhc2UgJ2ltYWdlL2dpZic6IHJldHVybiAnZ2lmJzsKICAgICAgY2FzZSAnaW1hZ2UvaGVpYyc6IHJldHVybiAnaGVpYyc7CiAgICAgIGNhc2UgJ3ZpZGVvL21wNCc6IHJldHVybiAnbXA0JzsKICAgICAgY2FzZSAndmlkZW8vcXVpY2t0aW1lJzogcmV0dXJuICdtb3YnOwogICAgICBjYXNlICd2aWRlby93ZWJtJzogcmV0dXJuICd3ZWJtJzsKICAgICAgZGVmYXVsdDogcmV0dXJuICcnOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29weSh0ZXh0KSB7CiAgICB2YXIgcyA9IHRleHQgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHRleHQpOwogICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQgJiYgd2luZG93LmlzU2VjdXJlQ29udGV4dCkgewogICAgICByZXR1cm4gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQocykudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIGxlZ2FjeUNvcHkocyk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShsZWdhY3lDb3B5KHMpKTsKICB9CgogIGZ1bmN0aW9uIGxlZ2FjeUNvcHkocykgewogICAgdHJ5IHsKICAgICAgdmFyIHRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsKICAgICAgdGEudmFsdWUgPSBzOwogICAgICB0YS5zZXRBdHRyaWJ1dGUoJ3JlYWRvbmx5JywgJycpOwogICAgICB0YS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7CiAgICAgIHRhLnN0eWxlLnRvcCA9ICctMTAwMHB4JzsKICAgICAgdGEuc3R5bGUub3BhY2l0eSA9ICcwJzsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0YSk7CiAgICAgIHRhLnNlbGVjdCgpOwogICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZSgwLCBzLmxlbmd0aCk7CiAgICAgIHZhciBvayA9IGRvY3VtZW50LmV4ZWNDb21tYW5kICYmIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7CiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGEpOwogICAgICByZXR1cm4gISFvazsKICAgIH0gY2F0Y2ggKF9lKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGRhdGFVUkxUb0Jsb2IoZGF0YVVSTCkgewogICAgdmFyIHBhcnRzID0gU3RyaW5nKGRhdGFVUkwpLnNwbGl0KCcsJyk7CiAgICB2YXIgaGVhZGVyID0gcGFydHNbMF0gfHwgJyc7CiAgICB2YXIgYm9keSA9IHBhcnRzWzFdIHx8ICcnOwogICAgdmFyIG1pbWVNYXRjaCA9IGhlYWRlci5tYXRjaCgvZGF0YTooW147XSspLyk7CiAgICB2YXIgbWltZSA9IG1pbWVNYXRjaCA/IG1pbWVNYXRjaFsxXSA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nOwogICAgdmFyIGlzQmFzZTY0ID0gLztiYXNlNjQvaS50ZXN0KGhlYWRlcik7CiAgICB2YXIgYmluYXJ5ID0gaXNCYXNlNjQgPyBhdG9iKGJvZHkpIDogZGVjb2RlVVJJQ29tcG9uZW50KGJvZHkpOwogICAgdmFyIGxlbiA9IGJpbmFyeS5sZW5ndGg7CiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW4pOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgYnl0ZXNbaV0gPSBiaW5hcnkuY2hhckNvZGVBdChpKTsKICAgIHJldHVybiBuZXcgQmxvYihbYnl0ZXNdLCB7IHR5cGU6IG1pbWUgfSk7CiAgfQoKICBmdW5jdGlvbiBibG9iVG9EYXRhVVJMKGJsb2IpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBmciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIGZyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsgcmVzb2x2ZShmci5yZXN1bHQpOyB9OwogICAgICBmci5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyByZWplY3QoZnIuZXJyb3IgfHwgbmV3IEVycm9yKCdGaWxlUmVhZGVyIGZhaWxlZCcpKTsgfTsKICAgICAgZnIucmVhZEFzRGF0YVVSTChibG9iKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gYnl0ZXNUb0Jsb2IoYnl0ZXMsIG1pbWUpIHsKICAgIHJldHVybiBuZXcgQmxvYihbYnl0ZXNdLCB7IHR5cGU6IG1pbWUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfSk7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRCeXRlcyhuKSB7CiAgICBuID0gK247CiAgICBpZiAoIWlzRmluaXRlKG4pIHx8IG4gPD0gMCkgcmV0dXJuICcwIEInOwogICAgdmFyIHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107CiAgICB2YXIgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2cobikgLyBNYXRoLmxvZygxMDI0KSk7CiAgICBpID0gY2xhbXAoaSwgMCwgdW5pdHMubGVuZ3RoIC0gMSk7CiAgICB2YXIgdmFsID0gbiAvIE1hdGgucG93KDEwMjQsIGkpOwogICAgdmFyIHN0ciA9IGkgPT09IDAgPyBTdHJpbmcodmFsKSA6IHZhbC50b0ZpeGVkKHZhbCA8IDEwID8gMSA6IDApOwogICAgcmV0dXJuIHN0ciArICcgJyArIHVuaXRzW2ldOwogIH0KCiAgZnVuY3Rpb24gcGx1cmFsaXplKG4sIG9uZSwgbWFueSkgewogICAgdmFyIGNvdW50ID0gbiB8IDA7CiAgICB2YXIgd29yZCA9IGNvdW50ID09PSAxID8gb25lIDogKG1hbnkgfHwgb25lICsgJ3MnKTsKICAgIHJldHVybiBjb3VudCArICcgJyArIHdvcmQ7CiAgfQoKICBmdW5jdGlvbiB0cnVuY2F0ZShzLCBtYXgpIHsKICAgIGlmIChzID09IG51bGwpIHJldHVybiAnJzsKICAgIHMgPSBTdHJpbmcocyk7CiAgICB2YXIgbGltaXQgPSBtYXggfCAwOwogICAgaWYgKGxpbWl0IDw9IDAgfHwgcy5sZW5ndGggPD0gbGltaXQpIHJldHVybiBzOwogICAgcmV0dXJuIHMuc2xpY2UoMCwgTWF0aC5tYXgoMCwgbGltaXQgLSAxKSkucmVwbGFjZSgvXHMrJC8sICcnKSArICfigKYnOwogIH0KCiAgZnVuY3Rpb24gaXNFbWFpbChzKSB7CiAgICBpZiAoIXMpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiAvXlteXHNAXStAW15cc0BdK1wuW15cc0BdKyQvLnRlc3QoU3RyaW5nKHMpLnRyaW0oKSk7CiAgfQoKICBWLnV0aWwgPSB7CgogICAgcXM6IHFzLAogICAgcXNTdHJpbmc6IHFzU3RyaW5nLAogICAgYnVpbGRIYXNoOiBidWlsZEhhc2gsCgogICAgZGVib3VuY2U6IGRlYm91bmNlLAogICAgc2xlZXA6IHNsZWVwLAoKICAgIHV1aWQ6IHV1aWQsCiAgICBzaG9ydElEOiBzaG9ydElELAoKICAgIGNsYW1wOiBjbGFtcCwKICAgIHJhbmRvbVNlZWQ6IHJhbmRvbVNlZWQsCgogICAgZm10RGF0ZTogZm10RGF0ZSwKICAgIHBhcnNlRGF0ZTogcGFyc2VEYXRlLAogICAgaXNvRGF0ZTogaXNvRGF0ZSwKCiAgICBiNjQ6IGI2NCwKICAgIHVuYjY0OiB1bmI2NCwKICAgIGJhc2ljQXV0aEhlYWRlcjogYmFzaWNBdXRoSGVhZGVyLAoKICAgIGVzY2FwZUh0bWw6IGVzY2FwZUh0bWwsCiAgICBlc2NhcGVBdHRyOiBlc2NhcGVIdG1sLAoKICAgIGRvd25sb2FkOiBkb3dubG9hZCwKICAgIGNvcHk6IGNvcHksCgogICAgZGF0YVVSTFRvQmxvYjogZGF0YVVSTFRvQmxvYiwKICAgIGJsb2JUb0RhdGFVUkw6IGJsb2JUb0RhdGFVUkwsCiAgICBieXRlc1RvQmxvYjogYnl0ZXNUb0Jsb2IsCgogICAgZm9ybWF0Qnl0ZXM6IGZvcm1hdEJ5dGVzLAogICAgcGx1cmFsaXplOiBwbHVyYWxpemUsCiAgICB0cnVuY2F0ZTogdHJ1bmNhdGUsCiAgICBpc0VtYWlsOiBpc0VtYWlsCiAgfTsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvc3RvcmUuanMgPT09PT0gKi8KCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKCiAgZnVuY3Rpb24gcmVzb2x2ZUFQSUJhc2UoKSB7CiAgICB0cnkgewogICAgICB2YXIgaCA9ICh3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKSB8fCAnJzsKICAgICAgaWYgKC8oXnxcLil2b29zZXlcLmNvbSQvaS50ZXN0KGgpKSByZXR1cm4gJyc7CiAgICB9IGNhdGNoIChlKSB7fQogICAgcmV0dXJuICdodHRwczovL2FwaS52b29zZXkuY29tJzsKICB9CiAgVi5jb25maWcgPSBPYmplY3QuYXNzaWduKAogICAgewogICAgICBBUEk6IHJlc29sdmVBUElCYXNlKCksCiAgICAgIENETjogJ2h0dHBzOi8vY2RuLnZvb3NleS5jb20nLAogICAgICBBUFBfU1RPUkVfVVJMOiAnaHR0cHM6Ly9hcHBzLmFwcGxlLmNvbS91cy9hcHAvdmFtcC9pZDY3NDg2NTc2ODUnLAogICAgICBBVVRIX1ZJREVPOiAnaHR0cHM6Ly9jZG4udm9vc2V5LmNvbS9tZWRpYS8wODMxMjUtMy5tcDQnLAogICAgICBERU1PX1ZJREVPOiAnaHR0cHM6Ly9jZG4udm9vc2V5LmNvbS9tZWRpYS8wODMxMjUtMy5tcDQnCiAgICB9LAogICAgVi5jb25maWcgfHwge30KICApOwoKICB2YXIgU1RPUkFHRV9QUkVGSVggPSAndmFtcF93ZWJfJzsKCiAgdmFyIFBFUlNJU1RfV0hJVEVMSVNUID0gWydzZXR0aW5ncycsICdpbmR1c3RyaWVzJywgJ29uYm9hcmRpbmdEb25lJywgJ2N1c3RvbVByZXNldHMnXTsKCiAgdmFyIExJQl9DQUNIRV9LRVkgPSAnbGlicmFyeUNhY2hlJzsKICB2YXIgTUFYX0xJQl9DQUNIRSA9IDI0MDsKCiAgZnVuY3Rpb24gZGVmYXVsdFNldHRpbmdzKCkgewogICAgcmV0dXJuIHsKICAgICAgZGVmYXVsdE1vZGVsOiAnZmx1eEtsZWluJywKICAgICAgZGVmYXVsdEFzcGVjdDogJ2F1dG8nLAogICAgICBkZWZhdWx0Q291bnQ6IDEsCiAgICAgIHRoZW1lOiAnc3lzdGVtJywKICAgICAgYXV0b0JlZm9yZUFmdGVyOiB0cnVlLAogICAgICByZWR1Y2VNb3Rpb246IGZhbHNlLAogICAgICBicmFuZGluZzogdHJ1ZSwKICAgICAgdGFnbGluZTogJycsCiAgICAgIHNoYXJlVGVtcGxhdGU6ICdiZWZvcmUtYWZ0ZXInLAogICAgICBzYXZlT3JpZ2luYWxzOiB0cnVlCiAgICB9OwogIH0KCiAgVi5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oCiAgICB7CgogICAgICB1c2VyOiBudWxsLAogICAgICBjcmVkaXRzOiAwLAoKICAgICAgcm91dGU6ICdjcmVhdGUnLAogICAgICBwYXJhbXM6IHt9LAogICAgICBwcmV2aW91c1JvdXRlOiBudWxsLAoKICAgICAgbGlicmFyeTogW10sCiAgICAgIGxpYnJhcnlQYWdlOiAxLAogICAgICBsaWJyYXJ5SGFzTW9yZTogdHJ1ZSwKICAgICAgZmF2b3JpdGVzOiBbXSwKICAgICAgZmVlZDogW10sCiAgICAgIGZlZWRQYWdlOiAxLAogICAgICBmZWVkSGFzTW9yZTogdHJ1ZSwKICAgICAgZm9sZGVyczogW10sCgogICAgICBwcmVzZXRzOiBbXSwKICAgICAgY3VzdG9tUHJlc2V0czogW10sCgogICAgICBpbmR1c3RyaWVzOiBbXSwKICAgICAgb25ib2FyZGluZ0RvbmU6IGZhbHNlLAoKICAgICAgZHJhZnQ6IHsKICAgICAgICBwcm9tcHQ6ICcnLAogICAgICAgIG5lZ2F0aXZlUHJvbXB0OiAnJywKICAgICAgICBtb2RlbDogJ2ZsdXhLbGVpbicsCiAgICAgICAgYXNwZWN0OiAnYXV0bycsCiAgICAgICAgc2VlZDogbnVsbCwKICAgICAgICBjb3VudDogMSwKICAgICAgICBwcmVzZXRJRDogbnVsbCwKICAgICAgICBpbWFnZVVSTHM6IFtdCiAgICAgIH0sCgogICAgICBnZW5lcmF0aW5nOiBmYWxzZSwKICAgICAgcHJvZ3Jlc3M6IDAsCiAgICAgIHVwbG9hZGluZzogZmFsc2UsCiAgICAgIHVwbG9hZFByb2dyZXNzOiAwLAogICAgICBkcmF3ZXJPcGVuOiBmYWxzZSwKICAgICAgYm9vdGVkOiBmYWxzZSwKCiAgICAgIHNldHRpbmdzOiBkZWZhdWx0U2V0dGluZ3MoKQogICAgfSwKICAgIFYuc3RhdGUgfHwge30KICApOwoKICBWLnN0YXRlLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbihkZWZhdWx0U2V0dGluZ3MoKSwgVi5zdGF0ZS5zZXR0aW5ncyB8fCB7fSk7CgogIFYuYXBpID0gVi5hcGkgfHwge307CiAgVi5hdXRoID0gVi5hdXRoIHx8IHt9OwogIFYuZGF0YSA9IFYuZGF0YSB8fCB7IHN3aXp6bGVzOiBbXSwgbW9kZWxzOiBbXSwgYXNwZWN0czogW10sIGluZHVzdHJpZXM6IFtdIH07CiAgVi51aSA9IFYudWkgfHwge307CiAgVi52aWV3cyA9IFYudmlld3MgfHwge307CiAgVi5yb3V0ZXIgPSBWLnJvdXRlciB8fCB7fTsKICBWLnV0aWwgPSBWLnV0aWwgfHwge307CgogIHZhciBFVkVOVFMgPSBPYmplY3QuZnJlZXplKHsKICAgIEFVVEhfQ0hBTkdFRDogJ2F1dGg6Y2hhbmdlZCcsCiAgICBDUkVESVRTX0NIQU5HRUQ6ICdjcmVkaXRzOmNoYW5nZWQnLAogICAgUk9VVEVfQ0hBTkdFRDogJ3JvdXRlOmNoYW5nZWQnLAogICAgTElCUkFSWV9DSEFOR0VEOiAnbGlicmFyeTpjaGFuZ2VkJywKICAgIFRPQVNUOiAndG9hc3QnLAogICAgRVJST1I6ICdlcnJvcicKICB9KTsKCiAgdmFyIGxpc3RlbmVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CgogIGZ1bmN0aW9uIGlzU3RvcmFnZUF2YWlsYWJsZSgpIHsKICAgIHRyeSB7CiAgICAgIHZhciBrID0gU1RPUkFHRV9QUkVGSVggKyAnX19wcm9iZV9fJzsKICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGssICcxJyk7CiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgdmFyIFNUT1JBR0VfT0sgPSBpc1N0b3JhZ2VBdmFpbGFibGUoKTsKCiAgVi5zdG9yZSA9IHsKCiAgICBldmVudHM6IEVWRU5UUywKICAgIHByZWZpeDogU1RPUkFHRV9QUkVGSVgsCgogICAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7CiAgICAgIHJldHVybiBWLnN0YXRlW2tleV07CiAgICB9LAoKICAgIHNldDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgdmFyIHByZXYgPSBWLnN0YXRlW2tleV07CiAgICAgIFYuc3RhdGVba2V5XSA9IHZhbHVlOwoKICAgICAgdGhpcy5lbWl0KGtleSwgdmFsdWUpOwoKICAgICAgaWYgKGtleSA9PT0gJ2NyZWRpdHMnKSB0aGlzLmVtaXQoRVZFTlRTLkNSRURJVFNfQ0hBTkdFRCwgdmFsdWUpOwogICAgICBlbHNlIGlmIChrZXkgPT09ICd1c2VyJykgdGhpcy5lbWl0KEVWRU5UUy5BVVRIX0NIQU5HRUQsIHZhbHVlKTsKICAgICAgZWxzZSBpZiAoa2V5ID09PSAncm91dGUnKSB0aGlzLmVtaXQoRVZFTlRTLlJPVVRFX0NIQU5HRUQsIHZhbHVlKTsKICAgICAgZWxzZSBpZiAoa2V5ID09PSAnbGlicmFyeScpIHsgdGhpcy5lbWl0KEVWRU5UUy5MSUJSQVJZX0NIQU5HRUQsIHZhbHVlKTsgdGhpcy5zYXZlTGlicmFyeUNhY2hlKHZhbHVlKTsgfQoKICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLCB7IGtleToga2V5LCB2YWx1ZTogdmFsdWUsIHByZXZpb3VzOiBwcmV2IH0pOwogICAgICByZXR1cm4gdmFsdWU7CiAgICB9LAoKICAgIHBhdGNoOiBmdW5jdGlvbiAob2JqKSB7CiAgICAgIGlmICghb2JqKSByZXR1cm47CiAgICAgIGZvciAodmFyIGsgaW4gb2JqKSB7CiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGspKSB0aGlzLnNldChrLCBvYmpba10pOwogICAgICB9CiAgICB9LAoKICAgIG9uOiBmdW5jdGlvbiAoZXZlbnQsIGNiKSB7CiAgICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIHJldHVybiBmdW5jdGlvbiAoKSB7fTsKICAgICAgKGxpc3RlbmVyc1tldmVudF0gfHwgKGxpc3RlbmVyc1tldmVudF0gPSBbXSkpLnB1c2goY2IpOwogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIHJldHVybiBmdW5jdGlvbiBvZmYoKSB7CiAgICAgICAgc2VsZi5vZmYoZXZlbnQsIGNiKTsKICAgICAgfTsKICAgIH0sCgogICAgb25jZTogZnVuY3Rpb24gKGV2ZW50LCBjYikgewogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIHZhciBvZmYgPSB0aGlzLm9uKGV2ZW50LCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgIG9mZigpOwogICAgICAgIGNiKGRhdGEpOwogICAgICB9KTsKICAgICAgcmV0dXJuIG9mZjsKICAgIH0sCgogICAgb2ZmOiBmdW5jdGlvbiAoZXZlbnQsIGNiKSB7CiAgICAgIHZhciBhcnIgPSBsaXN0ZW5lcnNbZXZlbnRdOwogICAgICBpZiAoIWFycikgcmV0dXJuOwogICAgICBpZiAoIWNiKSB7CiAgICAgICAgZGVsZXRlIGxpc3RlbmVyc1tldmVudF07CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBpID0gYXJyLmluZGV4T2YoY2IpOwogICAgICBpZiAoaSAhPT0gLTEpIGFyci5zcGxpY2UoaSwgMSk7CiAgICAgIGlmIChhcnIubGVuZ3RoID09PSAwKSBkZWxldGUgbGlzdGVuZXJzW2V2ZW50XTsKICAgIH0sCgogICAgZW1pdDogZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7CiAgICAgIHZhciBhcnIgPSBsaXN0ZW5lcnNbZXZlbnRdOwogICAgICBpZiAoIWFyciB8fCBhcnIubGVuZ3RoID09PSAwKSByZXR1cm47CgogICAgICB2YXIgc25hcHNob3QgPSBhcnIuc2xpY2UoKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbmFwc2hvdC5sZW5ndGg7IGkrKykgewogICAgICAgIHRyeSB7CiAgICAgICAgICBzbmFwc2hvdFtpXShkYXRhKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIGlmICh3aW5kb3cuY29uc29sZSAmJiBjb25zb2xlLmVycm9yKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tWLnN0b3JlXSBsaXN0ZW5lciBmb3IgIicgKyBldmVudCArICciIHRocmV3OicsIGVycik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIHRvYXN0OiBmdW5jdGlvbiAobXNnLCBraW5kKSB7CiAgICAgIHRoaXMuZW1pdChFVkVOVFMuVE9BU1QsIHsgbXNnOiBtc2csIGtpbmQ6IGtpbmQgfHwgJ2luZm8nIH0pOwogICAgfSwKICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyKSB7CiAgICAgIHZhciBwYXlsb2FkID0KICAgICAgICBlcnIgJiYgdHlwZW9mIGVyciA9PT0gJ29iamVjdCcKICAgICAgICAgID8gZXJyCiAgICAgICAgICA6IHsgbWVzc2FnZTogU3RyaW5nKGVyciA9PSBudWxsID8gJ1NvbWV0aGluZyB3ZW50IHdyb25nJyA6IGVycikgfTsKICAgICAgdGhpcy5lbWl0KEVWRU5UUy5FUlJPUiwgcGF5bG9hZCk7CiAgICB9LAoKICAgIHNhdmVMaWJyYXJ5Q2FjaGU6IGZ1bmN0aW9uIChsaXN0KSB7CiAgICAgIGlmICghU1RPUkFHRV9PSykgcmV0dXJuIGZhbHNlOwogICAgICB0cnkgewogICAgICAgIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSB8fCAhbGlzdC5sZW5ndGgpIHsKICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX1BSRUZJWCArIExJQl9DQUNIRV9LRVkpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHZhciBzbGltID0gbGlzdC5zbGljZSgwLCBNQVhfTElCX0NBQ0hFKTsKICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9QUkVGSVggKyBMSUJfQ0FDSEVfS0VZLCBKU09OLnN0cmluZ2lmeShzbGltKSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIGhhbGYgPSBBcnJheS5pc0FycmF5KGxpc3QpID8gbGlzdC5zbGljZSgwLCBNYXRoLmZsb29yKE1BWF9MSUJfQ0FDSEUgLyAyKSkgOiBbXTsKICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX1BSRUZJWCArIExJQl9DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KGhhbGYpKTsKICAgICAgICB9IGNhdGNoIChlMikgewogICAgICAgICAgdHJ5IHsgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfUFJFRklYICsgTElCX0NBQ0hFX0tFWSk7IH0gY2F0Y2ggKGUzKSB7fQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0sCgogICAgbG9hZExpYnJhcnlDYWNoZTogZnVuY3Rpb24gKCkgewogICAgICBpZiAoIVNUT1JBR0VfT0spIHJldHVybiBbXTsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcmF3ID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfUFJFRklYICsgTElCX0NBQ0hFX0tFWSk7CiAgICAgICAgaWYgKCFyYXcpIHJldHVybiBbXTsKICAgICAgICB2YXIgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpOwogICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcnNlZCkgPyBwYXJzZWQgOiBbXTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBbXTsKICAgICAgfQogICAgfSwKCiAgICBzYXZlOiBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICghU1RPUkFHRV9PSykgcmV0dXJuIGZhbHNlOwogICAgICB0cnkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUEVSU0lTVF9XSElURUxJU1QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBrZXkgPSBQRVJTSVNUX1dISVRFTElTVFtpXTsKICAgICAgICAgIHZhciB2YWwgPSBWLnN0YXRlW2tleV07CiAgICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsKSB7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX1BSRUZJWCArIGtleSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9QUkVGSVggKyBrZXksIEpTT04uc3RyaW5naWZ5KHZhbCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBjYXRjaCAoZSkgewoKICAgICAgICBpZiAod2luZG93LmNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4oJ1tWLnN0b3JlXSBzYXZlIGZhaWxlZDonLCBlKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0sCgogICAgbG9hZDogZnVuY3Rpb24gKCkgewogICAgICBpZiAoIVNUT1JBR0VfT0spIHJldHVybiBmYWxzZTsKICAgICAgdHJ5IHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFBFUlNJU1RfV0hJVEVMSVNULmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIga2V5ID0gUEVSU0lTVF9XSElURUxJU1RbaV07CiAgICAgICAgICB2YXIgcmF3ID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfUFJFRklYICsga2V5KTsKICAgICAgICAgIGlmIChyYXcgPT09IG51bGwgfHwgcmF3ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlOwogICAgICAgICAgdmFyIHBhcnNlZDsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTsKICAgICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyKSB7CgogICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9QUkVGSVggKyBrZXkpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJzZWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7CgogICAgICAgICAgaWYgKGtleSA9PT0gJ3NldHRpbmdzJyAmJiBwYXJzZWQgJiYgdHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgVi5zdGF0ZS5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdFNldHRpbmdzKCksIHBhcnNlZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBWLnN0YXRlW2tleV0gPSBwYXJzZWQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKCdbVi5zdG9yZV0gbG9hZCBmYWlsZWQ6JywgZSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9LAoKICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICghU1RPUkFHRV9PSykgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUEVSU0lTVF9XSElURUxJU1QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX1BSRUZJWCArIFBFUlNJU1RfV0hJVEVMSVNUW2ldKTsKICAgICAgICB9CiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfUFJFRklYICsgTElCX0NBQ0hFX0tFWSk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKCiAgICAgIH0KICAgICAgVi5zdGF0ZS5zZXR0aW5ncyA9IGRlZmF1bHRTZXR0aW5ncygpOwogICAgICBWLnN0YXRlLmluZHVzdHJpZXMgPSBbXTsKICAgICAgVi5zdGF0ZS5vbmJvYXJkaW5nRG9uZSA9IGZhbHNlOwogICAgICBWLnN0YXRlLmN1c3RvbVByZXNldHMgPSBbXTsKICAgICAgVi5zdGF0ZS5saWJyYXJ5ID0gW107CiAgICB9LAoKICAgIGRlZmF1bHRTZXR0aW5nczogZGVmYXVsdFNldHRpbmdzCiAgfTsKCiAgVi5zdG9yZS5sb2FkKCk7CgogIHRyeSB7CiAgICB2YXIgY2FjaGVkTGliID0gVi5zdG9yZS5sb2FkTGlicmFyeUNhY2hlKCk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShjYWNoZWRMaWIpICYmIGNhY2hlZExpYi5sZW5ndGgpIFYuc3RhdGUubGlicmFyeSA9IGNhY2hlZExpYjsKICB9IGNhdGNoIChlKSB7fQp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9hcGkuanMgPT09PT0gKi8KCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKCiAgVi5jb25maWcgPSBPYmplY3QuYXNzaWduKAogICAgewogICAgICBBUEk6ICdodHRwczovL2FwaS52b29zZXkuY29tJywKICAgICAgQ0ROOiAnaHR0cHM6Ly9jZG4udm9vc2V5LmNvbScsCiAgICAgIEFQUF9TVE9SRV9VUkw6ICdodHRwczovL2FwcHMuYXBwbGUuY29tL3VzL2FwcC92YW1wL2lkNjc0ODY1NzY4NScsCiAgICAgIERFTU9fVklERU86ICdodHRwczovL20uandzLmFpL3ZhbXAtbWVhbmV0aXplLWRlbW8tdjQubXA0JwogICAgfSwKICAgIFYuY29uZmlnIHx8IHt9CiAgKTsKCiAgZnVuY3Rpb24gQXBpRXJyb3Ioc3RhdHVzLCBtZXNzYWdlLCBib2R5KSB7CiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlIHx8ICdSZXF1ZXN0IGZhaWxlZCcpOwogICAgZS5uYW1lID0gJ0FwaUVycm9yJzsKICAgIGUuc3RhdHVzID0gc3RhdHVzOwogICAgZS5tZXNzYWdlID0gbWVzc2FnZSB8fCAnUmVxdWVzdCBmYWlsZWQnOwogICAgZS5ib2R5ID0gYm9keTsKICAgIGUuaXNBcGlFcnJvciA9IHRydWU7CiAgICByZXR1cm4gZTsKICB9CiAgVi5BcGlFcnJvciA9IEFwaUVycm9yOwoKICB2YXIgSVNPX0ZSQUMgPSAvXihcZHs0fS1cZHsyfS1cZHsyfVRcZHsyfTpcZHsyfTpcZHsyfSlcLlxkKyhafFsrXC1dXGR7Mn06P1xkezJ9KT8kLzsKCiAgZnVuY3Rpb24gc3RyaXBGcmFjdGlvbmFsKHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHZhbHVlOwogICAgdmFyIHQgPSB0eXBlb2YgdmFsdWU7CiAgICBpZiAodCA9PT0gJ3N0cmluZycpIHsKICAgICAgdmFyIG0gPSB2YWx1ZS5tYXRjaChJU09fRlJBQyk7CiAgICAgIGlmIChtKSByZXR1cm4gbVsxXSArIChtWzJdIHx8ICdaJyk7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXC5cZHszfVokLywgJ1onKTsKICAgIH0KICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICB2YXIgb3V0ID0gbmV3IEFycmF5KHZhbHVlLmxlbmd0aCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIG91dFtpXSA9IHN0cmlwRnJhY3Rpb25hbCh2YWx1ZVtpXSk7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBpZiAodCA9PT0gJ29iamVjdCcpIHsKICAgICAgdmFyIG8gPSB7fTsKICAgICAgZm9yICh2YXIgayBpbiB2YWx1ZSkgewogICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGspKSB7CiAgICAgICAgICBvW2tdID0gc3RyaXBGcmFjdGlvbmFsKHZhbHVlW2tdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG87CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBmdW5jdGlvbiBzYWZlUGFyc2UodGV4dCkgewogICAgaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0ID09PSAnJykgcmV0dXJuIG51bGw7CiAgICB0cnkgewogICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTsKICAgIH0gY2F0Y2ggKF9lKSB7CiAgICAgIHJldHVybiB0ZXh0OwogICAgfQogIH0KCiAgZnVuY3Rpb24gZXJyb3JNZXNzYWdlKGJvZHksIHN0YXR1cykgewogICAgaWYgKGJvZHkgJiYgdHlwZW9mIGJvZHkgPT09ICdvYmplY3QnKSB7CiAgICAgIGlmICh0eXBlb2YgYm9keS5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycgJiYgYm9keS5kZXNjcmlwdGlvbikgcmV0dXJuIGJvZHkuZGVzY3JpcHRpb247CiAgICAgIGlmICh0eXBlb2YgYm9keS5yZWFzb24gPT09ICdzdHJpbmcnICYmIGJvZHkucmVhc29uKSByZXR1cm4gYm9keS5yZWFzb247CiAgICAgIGlmICh0eXBlb2YgYm9keS5tZXNzYWdlID09PSAnc3RyaW5nJyAmJiBib2R5Lm1lc3NhZ2UpIHJldHVybiBib2R5Lm1lc3NhZ2U7CiAgICAgIGlmICh0eXBlb2YgYm9keS5lcnJvciA9PT0gJ3N0cmluZycgJiYgYm9keS5lcnJvcikgcmV0dXJuIGJvZHkuZXJyb3I7CiAgICB9CiAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnICYmIGJvZHkudHJpbSgpKSByZXR1cm4gYm9keS50cmltKCk7CiAgICByZXR1cm4gZGVmYXVsdFN0YXR1c01lc3NhZ2Uoc3RhdHVzKTsKICB9CgogIGZ1bmN0aW9uIGRlZmF1bHRTdGF0dXNNZXNzYWdlKHN0YXR1cykgewogICAgc3dpdGNoIChzdGF0dXMpIHsKICAgICAgY2FzZSA0MDA6IHJldHVybiAnQmFkIHJlcXVlc3QuJzsKICAgICAgY2FzZSA0MDE6IHJldHVybiAnWW91ciBzZXNzaW9uIGhhcyBleHBpcmVkLiBQbGVhc2Ugc2lnbiBpbiBhZ2Fpbi4nOwogICAgICBjYXNlIDQwMjogcmV0dXJuICdOb3QgZW5vdWdoIGNyZWRpdHMuJzsKICAgICAgY2FzZSA0MDM6IHJldHVybiAnWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gZG8gdGhhdC4nOwogICAgICBjYXNlIDQwNDogcmV0dXJuICdOb3QgZm91bmQuJzsKICAgICAgY2FzZSA0MDY6IHJldHVybiAnVGhhdCB2YWx1ZSBpcyBub3QgYWNjZXB0YWJsZS4nOwogICAgICBjYXNlIDQwOTogcmV0dXJuICdUaGF0IGFscmVhZHkgZXhpc3RzLic7CiAgICAgIGNhc2UgNDEzOiByZXR1cm4gJ1RoYXQgZmlsZSBpcyB0b28gbGFyZ2UuJzsKICAgICAgY2FzZSA0MjA6IHJldHVybiAnUmVxdWVzdCByZWplY3RlZC4nOwogICAgICBjYXNlIDQyMjogcmV0dXJuICdDb3VsZCBub3QgcHJvY2VzcyB0aGF0IHJlcXVlc3QuJzsKICAgICAgY2FzZSA0Mjk6IHJldHVybiAnVG9vIG1hbnkgcmVxdWVzdHMuIFBsZWFzZSBzbG93IGRvd24uJzsKICAgICAgY2FzZSA1MDA6IHJldHVybiAnU29tZXRoaW5nIHdlbnQgd3Jvbmcgb24gb3VyIGVuZC4nOwogICAgICBjYXNlIDUwMjoKICAgICAgY2FzZSA1MDM6CiAgICAgIGNhc2UgNTA0OiByZXR1cm4gJ1RoZSBzZXJ2aWNlIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlLic7CiAgICAgIGRlZmF1bHQ6IHJldHVybiBzdGF0dXMgPyAoJ1JlcXVlc3QgZmFpbGVkICgnICsgc3RhdHVzICsgJykuJykgOiAnTmV0d29yayBlcnJvci4nOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYnVpbGRVUkwocGF0aCwgcXVlcnkpIHsKICAgIHZhciB1cmw7CiAgICBpZiAoL15odHRwcz86XC9cLy9pLnRlc3QocGF0aCkpIHsKICAgICAgdXJsID0gcGF0aDsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBiYXNlID0gVi5jb25maWcuQVBJLnJlcGxhY2UoL1wvKyQvLCAnJyk7CiAgICAgIHVybCA9IGJhc2UgKyAocGF0aC5jaGFyQXQoMCkgPT09ICcvJyA/IHBhdGggOiAnLycgKyBwYXRoKTsKICAgIH0KICAgIGlmIChxdWVyeSAmJiB0eXBlb2YgcXVlcnkgPT09ICdvYmplY3QnKSB7CiAgICAgIHZhciBwYXJ0cyA9IFtdOwogICAgICBmb3IgKHZhciBrIGluIHF1ZXJ5KSB7CiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChxdWVyeSwgaykpIHsKICAgICAgICAgIHZhciB2YWwgPSBxdWVyeVtrXTsKICAgICAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09IG51bGwgfHwgdmFsID09PSAnJykgY29udGludWU7CiAgICAgICAgICBwYXJ0cy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHBhcnRzLmxlbmd0aCkgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID49IDAgPyAnJicgOiAnPycpICsgcGFydHMuam9pbignJicpOwogICAgfQogICAgcmV0dXJuIHVybDsKICB9CgogIGZ1bmN0aW9uIGF1dGhUb2tlbigpIHsKICAgIHRyeSB7CiAgICAgIGlmIChWLmF1dGggJiYgdHlwZW9mIFYuYXV0aC50b2tlbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYuYXV0aC50b2tlbigpOwogICAgfSBjYXRjaCAoX2UpIHsgIH0KCiAgICB0cnkgewogICAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKCd2YW1wX3dlYl90b2tlbicpOwogICAgfSBjYXRjaCAoX2UyKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVxdWVzdChwYXRoLCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBtZXRob2QgPSAob3B0cy5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7CiAgICB2YXIgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdHMuaGVhZGVycyB8fCB7fSk7CiAgICB2YXIgZmV0Y2hJbml0ID0geyBtZXRob2Q6IG1ldGhvZCwgaGVhZGVyczogaGVhZGVycyB9OwoKICAgIGlmIChvcHRzLnNpZ25hbCkgZmV0Y2hJbml0LnNpZ25hbCA9IG9wdHMuc2lnbmFsOwoKICAgIHZhciBoYXNCb2R5ID0gb3B0cy5ib2R5ICE9PSB1bmRlZmluZWQgJiYgb3B0cy5ib2R5ICE9PSBudWxsICYmIG1ldGhvZCAhPT0gJ0dFVCcgJiYgbWV0aG9kICE9PSAnSEVBRCc7CiAgICBpZiAoaGFzQm9keSkgewogICAgICBpZiAoCiAgICAgICAgb3B0cy5ib2R5IGluc3RhbmNlb2YgQmxvYiB8fAogICAgICAgIG9wdHMuYm9keSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8CiAgICAgICAgb3B0cy5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEgfHwKICAgICAgICAodHlwZW9mIG9wdHMuYm9keSA9PT0gJ3N0cmluZycpCiAgICAgICkgewoKICAgICAgICBmZXRjaEluaXQuYm9keSA9IG9wdHMuYm9keTsKICAgICAgfSBlbHNlIHsKCiAgICAgICAgaWYgKCFoYXNIZWFkZXIoaGVhZGVycywgJ0NvbnRlbnQtVHlwZScpKSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJzsKICAgICAgICBmZXRjaEluaXQuYm9keSA9IEpTT04uc3RyaW5naWZ5KHN0cmlwRnJhY3Rpb25hbChvcHRzLmJvZHkpKTsKICAgICAgfQogICAgfQoKICAgIGlmIChvcHRzLmF1dGggIT09IGZhbHNlICYmICFoYXNIZWFkZXIoaGVhZGVycywgJ0F1dGhvcml6YXRpb24nKSkgewogICAgICB2YXIgdG9rID0gYXV0aFRva2VuKCk7CiAgICAgIGlmICh0b2spIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9ICdCZWFyZXIgJyArIHRvazsKICAgIH0KCiAgICB2YXIgdXJsID0gYnVpbGRVUkwocGF0aCwgb3B0cy5xdWVyeSk7CgogICAgcmV0dXJuIGZldGNoKHVybCwgZmV0Y2hJbml0KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKCiAgICAgIGlmICgocmVzLnN0YXR1cyA9PT0gNDAxIHx8IHJlcy5zdGF0dXMgPT09IDQwMykgJiYgb3B0cy5hdXRoICE9PSBmYWxzZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAoVi5hdXRoICYmIHR5cGVvZiBWLmF1dGguY2xlYXIgPT09ICdmdW5jdGlvbicpIFYuYXV0aC5jbGVhcigpOwogICAgICAgICAgZWxzZSB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3ZhbXBfd2ViX3Rva2VuJyk7CiAgICAgICAgfSBjYXRjaCAoX2UpIHsgIH0KICAgICAgfQoKICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQyOSAmJiAob3B0cy5fYXR0ZW1wdCB8fCAwKSA8IDIpIHsKICAgICAgICB2YXIgcmEgPSBwYXJzZUZsb2F0KHJlcy5oZWFkZXJzICYmIHJlcy5oZWFkZXJzLmdldCA/IHJlcy5oZWFkZXJzLmdldCgnUmV0cnktQWZ0ZXInKSA6ICcnKTsKICAgICAgICBpZiAoIShpc0Zpbml0ZShyYSkgJiYgcmEgPiAxNSkpIHsKICAgICAgICAgIHZhciB3YWl0TXMgPSAoaXNGaW5pdGUocmEpICYmIHJhID4gMCkKICAgICAgICAgICAgPyByYSAqIDEwMDAKICAgICAgICAgICAgOiAoNzAwICogTWF0aC5wb3coMiwgb3B0cy5fYXR0ZW1wdCB8fCAwKSkgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAzMDApOwogICAgICAgICAgdmFyIG5leHQgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRzLCB7IF9hdHRlbXB0OiAob3B0cy5fYXR0ZW1wdCB8fCAwKSArIDEgfSk7CiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJzKSB7IHNldFRpbWVvdXQocnMsIHdhaXRNcyk7IH0pLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVxdWVzdChwYXRoLCBuZXh0KTsgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAob3B0cy5yYXcpIHsKICAgICAgICBpZiAoIXJlcy5vayAmJiByZXMuc3RhdHVzICE9PSAyMDIpIHsKICAgICAgICAgIHJldHVybiByZXMudGV4dCgpLnRoZW4oZnVuY3Rpb24gKHR4dCkgewogICAgICAgICAgICB2YXIgYm9keSA9IHNhZmVQYXJzZSh0eHQpOwogICAgICAgICAgICB0aHJvdyBBcGlFcnJvcihyZXMuc3RhdHVzLCBlcnJvck1lc3NhZ2UoYm9keSwgcmVzLnN0YXR1cyksIGJvZHkpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXM7CiAgICAgIH0KCiAgICAgIHJldHVybiByZXMudGV4dCgpLnRoZW4oZnVuY3Rpb24gKHR4dCkgewogICAgICAgIHZhciBib2R5ID0gc2FmZVBhcnNlKHR4dCk7CiAgICAgICAgaWYgKHJlcy5vaykgcmV0dXJuIGJvZHk7CiAgICAgICAgdGhyb3cgQXBpRXJyb3IocmVzLnN0YXR1cywgZXJyb3JNZXNzYWdlKGJvZHksIHJlcy5zdGF0dXMpLCBib2R5KTsKICAgICAgfSk7CiAgICB9LCBmdW5jdGlvbiAobmV0d29ya0VycikgewoKICAgICAgaWYgKG5ldHdvcmtFcnIgJiYgbmV0d29ya0Vyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHRocm93IG5ldHdvcmtFcnI7CiAgICAgIHRocm93IEFwaUVycm9yKDAsIG5ldHdvcmtFcnIgJiYgbmV0d29ya0Vyci5tZXNzYWdlID8gbmV0d29ya0Vyci5tZXNzYWdlIDogJ05ldHdvcmsgZXJyb3IuIENoZWNrIHlvdXIgY29ubmVjdGlvbi4nLCBudWxsKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gaGFzSGVhZGVyKGhlYWRlcnMsIG5hbWUpIHsKICAgIHZhciBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKICAgIGZvciAodmFyIGsgaW4gaGVhZGVycykgewogICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGhlYWRlcnMsIGspICYmIGsudG9Mb3dlckNhc2UoKSA9PT0gbG5hbWUpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gcG9sbChzdWJtaXRGbiwgcG9sbEZuLCBvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgIHZhciBpbnRlcnZhbE1zID0gb3B0aW9ucy5pbnRlcnZhbE1zICE9IG51bGwgPyBvcHRpb25zLmludGVydmFsTXMgOiAyMDAwOwogICAgdmFyIHRpbWVvdXRNcyA9IG9wdGlvbnMudGltZW91dE1zICE9IG51bGwgPyBvcHRpb25zLnRpbWVvdXRNcyA6IDE4MDAwMDsKICAgIHZhciBvblByb2dyZXNzID0gdHlwZW9mIG9wdGlvbnMub25Qcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMub25Qcm9ncmVzcyA6IGZ1bmN0aW9uICgpIHt9OwogICAgdmFyIHNpZ25hbCA9IG9wdGlvbnMuc2lnbmFsIHx8IG51bGw7CgogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIHNldHRsZWQgPSBmYWxzZTsKICAgICAgdmFyIHN0YXJ0ZWQgPSBEYXRlLm5vdygpOwogICAgICB2YXIgYXR0ZW1wdCA9IDA7CiAgICAgIHZhciB0aW1lciA9IG51bGw7CgogICAgICBmdW5jdGlvbiBhYm9ydEVycm9yKCkgewogICAgICAgIHZhciBlID0gbmV3IEVycm9yKCdBYm9ydGVkJyk7CiAgICAgICAgZS5uYW1lID0gJ0Fib3J0RXJyb3InOwogICAgICAgIHJldHVybiBlOwogICAgICB9CgogICAgICBmdW5jdGlvbiBjbGVhbnVwKCkgewogICAgICAgIGlmICh0aW1lcikgeyBjbGVhclRpbWVvdXQodGltZXIpOyB0aW1lciA9IG51bGw7IH0KICAgICAgICBpZiAoc2lnbmFsKSBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTsKICAgICAgfQogICAgICBmdW5jdGlvbiBvbkFib3J0KCkgewogICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47CiAgICAgICAgc2V0dGxlZCA9IHRydWU7CiAgICAgICAgY2xlYW51cCgpOwogICAgICAgIHJlamVjdChhYm9ydEVycm9yKCkpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGZhaWwoZXJyKSB7CiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjsKICAgICAgICBzZXR0bGVkID0gdHJ1ZTsKICAgICAgICBjbGVhbnVwKCk7CiAgICAgICAgcmVqZWN0KGVycik7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZG9uZShyZXN1bHQpIHsKICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOwogICAgICAgIHNldHRsZWQgPSB0cnVlOwogICAgICAgIGNsZWFudXAoKTsKICAgICAgICByZXNvbHZlKHJlc3VsdCk7CiAgICAgIH0KCiAgICAgIGlmIChzaWduYWwpIHsKICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHsgb25BYm9ydCgpOyByZXR1cm47IH0KICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTsKICAgICAgfQoKICAgICAgUHJvbWlzZS5yZXNvbHZlKCkKICAgICAgICAudGhlbihzdWJtaXRGbikKICAgICAgICAudGhlbihmdW5jdGlvbiAoc3VibWl0UmVzdWx0KSB7CiAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOwogICAgICAgICAgb25Qcm9ncmVzcyh7IHBoYXNlOiAnc3VibWl0dGVkJywgYXR0ZW1wdDogMCwgc3VibWl0OiBzdWJtaXRSZXN1bHQgfSk7CgogICAgICAgICAgZnVuY3Rpb24gbG9vcCgpIHsKICAgICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjsKICAgICAgICAgICAgaWYgKHNpZ25hbCAmJiBzaWduYWwuYWJvcnRlZCkgeyBvbkFib3J0KCk7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ZWQgPiB0aW1lb3V0TXMpIHsKICAgICAgICAgICAgICBmYWlsKEFwaUVycm9yKDQwOCwgJ1RoaXMgaXMgdGFraW5nIGxvbmdlciB0aGFuIGV4cGVjdGVkLiBQbGVhc2UgdHJ5IGFnYWluLicsIG51bGwpKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXR0ZW1wdCsrOwogICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKQogICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBvbGxGbihzdWJtaXRSZXN1bHQsIGF0dGVtcHQpOyB9KQogICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgb25Qcm9ncmVzcyh7IHBoYXNlOiAncG9sbGluZycsIGF0dGVtcHQ6IGF0dGVtcHQsIHN1Ym1pdDogc3VibWl0UmVzdWx0IH0pOwogICAgICAgICAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQobG9vcCwgaW50ZXJ2YWxNcyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBkb25lKHJlc3VsdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgaWYgKGVyciAmJiBlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7IG9uQWJvcnQoKTsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBmYWlsKGVycik7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CgogICAgICAgICAgbG9vcCgpOwogICAgICAgIH0pCiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykgeyBvbkFib3J0KCk7IHJldHVybjsgfQogICAgICAgICAgZmFpbChlcnIpOwogICAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByYW5kb21TZWVkKCkgewogICAgaWYgKFYudXRpbCAmJiB0eXBlb2YgVi51dGlsLnJhbmRvbVNlZWQgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnV0aWwucmFuZG9tU2VlZCgpOwogICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApOwogIH0KCiAgdmFyIE5BTk9fTU9ERUxTID0geyBuYW5vQmFuYW5hOiB0cnVlLCBuYW5vQmFuYW5hMjogdHJ1ZSwgbmFub0JhbmFuYVBybzogdHJ1ZSB9OwoKICBmdW5jdGlvbiBmbHV4SW1hZ2VVUkwoYm9keSkgewogICAgaWYgKCFib2R5IHx8ICFBcnJheS5pc0FycmF5KGJvZHkuaW1hZ2VzKSB8fCAhYm9keS5pbWFnZXMubGVuZ3RoKSByZXR1cm4gbnVsbDsKICAgIHZhciBmaXJzdCA9IGJvZHkuaW1hZ2VzWzBdOwogICAgaWYgKCFmaXJzdCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gZmlyc3QudXJsIHx8IG51bGw7CiAgfQoKICBmdW5jdGlvbiBpc1BlbmRpbmdSZXN1bHQoYm9keSkgewogICAgaWYgKCFib2R5IHx8IHR5cGVvZiBib2R5ICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlOwogICAgdmFyIHN0ID0gKGJvZHkuc3RhdHVzIHx8IGJvZHkuc3RhdGUgfHwgJycpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKTsKICAgIGlmIChzdCAmJiAvUVVFVUV8UFJPR1JFU1N8UEVORElOR3xQUk9DRVNTfFJVTk5JTkd8U1RBUlRFRHxTVUJNSVRURUQvLnRlc3Qoc3QpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChib2R5LnVybCB8fCBib2R5LnZpZGVvIHx8IGJvZHkudmlkZW9fdXJsIHx8IGJvZHkudmlkZW9VUkwgfHwgYm9keS5lcnJvcikgcmV0dXJuIGZhbHNlOwogICAgaWYgKEFycmF5LmlzQXJyYXkoYm9keS5pbWFnZXMpKSByZXR1cm4gYm9keS5pbWFnZXMubGVuZ3RoID09PSAwOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gcG9sbFJlc3BvbnNlKHJlcywgZXh0cmFjdCkgewogICAgaWYgKHJlcy5zdGF0dXMgPT09IDIwMikgcmV0dXJuIG51bGw7CiAgICBpZiAocmVzLm9rKSB7CiAgICAgIHJldHVybiByZXMudGV4dCgpLnRoZW4oZnVuY3Rpb24gKHR4dCkgewogICAgICAgIHZhciBib2R5ID0gc2FmZVBhcnNlKHR4dCk7CiAgICAgICAgaWYgKGlzUGVuZGluZ1Jlc3VsdChib2R5KSkgcmV0dXJuIG51bGw7CiAgICAgICAgcmV0dXJuIGV4dHJhY3QgPyBleHRyYWN0KGJvZHkpIDogYm9keTsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gcmVzLnRleHQoKS50aGVuKGZ1bmN0aW9uICh0eHQpIHsKICAgICAgdmFyIGJvZHkgPSBzYWZlUGFyc2UodHh0KTsKICAgICAgdGhyb3cgQXBpRXJyb3IocmVzLnN0YXR1cywgZXJyb3JNZXNzYWdlKGJvZHksIHJlcy5zdGF0dXMpLCBib2R5KTsKICAgIH0pOwogIH0KCiAgdmFyIGFwaSA9IHsKCiAgICByZXF1ZXN0OiByZXF1ZXN0LAogICAgcG9sbDogcG9sbCwKICAgIEFwaUVycm9yOiBBcGlFcnJvciwKICAgIF9zdHJpcEZyYWN0aW9uYWw6IHN0cmlwRnJhY3Rpb25hbCwKICAgIF9mbHV4SW1hZ2VVUkw6IGZsdXhJbWFnZVVSTCwKCiAgICBzaWdudXA6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHZhciBib2R5ID0gT2JqZWN0LmFzc2lnbigKICAgICAgICB7CiAgICAgICAgICBoYXNBY2NlcHRlZFRlcm1zQW5kQ29uZGl0aW9uczogdHJ1ZSwKICAgICAgICAgIGhhc0FjY2VwdGVkUHJpdmFjeVBvbGljeTogdHJ1ZSwKICAgICAgICAgIGhhcmR3YXJlOiBudWxsCiAgICAgICAgfSwKICAgICAgICBkYXRhIHx8IHt9CiAgICAgICk7CiAgICAgIGlmIChib2R5LmVtYWlsKSBib2R5LmVtYWlsID0gU3RyaW5nKGJvZHkuZW1haWwpLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvdXNlcnMnLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiBib2R5LCBhdXRoOiBmYWxzZSB9KTsKICAgIH0sCgogICAgbG9naW46IGZ1bmN0aW9uIChlbWFpbCwgcGFzc3dvcmQpIHsKICAgICAgdmFyIGJhc2ljOwogICAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwuYmFzaWNBdXRoSGVhZGVyID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgYmFzaWMgPSBWLnV0aWwuYmFzaWNBdXRoSGVhZGVyKGVtYWlsLCBwYXNzd29yZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYmFzaWMgPSAnQmFzaWMgJyArIGI2NChTdHJpbmcoZW1haWwpLnRvTG93ZXJDYXNlKCkgKyAnOicgKyBwYXNzd29yZCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9hdXRoL2xvZ2luJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGF1dGg6IGZhbHNlLAogICAgICAgIGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYmFzaWMgfQogICAgICB9KTsKICAgIH0sCgogICAgd2hvYW1pOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvYXV0aC90b2tlbicsIHsgbWV0aG9kOiAnR0VUJyB9KTsKICAgIH0sCgogICAgcmVxdWVzdFJlc2V0OiBmdW5jdGlvbiAoZW1haWwpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9hdXRoL3Bhc3N3b3JkL2NvZGUnLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgYXV0aDogZmFsc2UsCiAgICAgICAgYm9keTogeyBlbWFpbDogU3RyaW5nKGVtYWlsKS50b0xvd2VyQ2FzZSgpIH0KICAgICAgfSk7CiAgICB9LAoKICAgIHN1Ym1pdFJlc2V0OiBmdW5jdGlvbiAoZW1haWwsIGNvZGUsIG5ld1Bhc3N3b3JkKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvYXV0aC9wYXNzd29yZC9yZXNldCcsIHsKICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICBhdXRoOiBmYWxzZSwKICAgICAgICBib2R5OiB7IGVtYWlsOiBTdHJpbmcoZW1haWwpLnRvTG93ZXJDYXNlKCksIGNvZGU6IGNvZGUsIG5ld1Bhc3N3b3JkOiBuZXdQYXNzd29yZCB9CiAgICAgIH0pOwogICAgfSwKCiAgICBlbWFpbEF2YWlsYWJsZTogZnVuY3Rpb24gKGVtYWlsKSB7CiAgICAgIHZhciBlbmMgPSBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGVtYWlsKS50b0xvd2VyQ2FzZSgpKTsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9hdXRoL2lzRW1haWxBdmFpbGFibGUvJyArIGVuYywgeyBtZXRob2Q6ICdQT1NUJywgYXV0aDogZmFsc2UgfSkKICAgICAgICAudGhlbihmdW5jdGlvbiAoYm9keSkgewoKICAgICAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gYm9keTsKICAgICAgICAgIGlmIChib2R5ICYmIHR5cGVvZiBib2R5LmF2YWlsYWJsZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gYm9keS5hdmFpbGFibGU7CiAgICAgICAgICByZXR1cm4gYm9keSA9PT0gJ3RydWUnIHx8IGJvZHkgPT09IHRydWU7CiAgICAgICAgfSk7CiAgICB9LAoKICAgIHVzZXJuYW1lQXZhaWxhYmxlOiBmdW5jdGlvbiAodXNlcm5hbWUpIHsKICAgICAgdmFyIGVuYyA9IGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcodXNlcm5hbWUpLnRvTG93ZXJDYXNlKCkpOwogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2F1dGgvaXNVc2VybmFtZUF2YWlsYWJsZS8nICsgZW5jLCB7IG1ldGhvZDogJ1BPU1QnLCBhdXRoOiBmYWxzZSB9KQogICAgICAgIC50aGVuKGZ1bmN0aW9uIChib2R5KSB7CiAgICAgICAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdib29sZWFuJykgcmV0dXJuIGJvZHk7CiAgICAgICAgICBpZiAoYm9keSAmJiB0eXBlb2YgYm9keS5hdmFpbGFibGUgPT09ICdib29sZWFuJykgcmV0dXJuIGJvZHkuYXZhaWxhYmxlOwogICAgICAgICAgcmV0dXJuIGJvZHkgPT09ICd0cnVlJyB8fCBib2R5ID09PSB0cnVlOwogICAgICAgIH0pOwogICAgfSwKCiAgICB1cGRhdGVBY2NvdW50OiBmdW5jdGlvbiAocHV0RGF0YSkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL3VzZXJzJywgeyBtZXRob2Q6ICdQVVQnLCBib2R5OiBwdXREYXRhIH0pOwogICAgfSwKCiAgICBkZWxldGVBY2NvdW50OiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvdXNlcnMnLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7CiAgICB9LAoKICAgIGNyZWRpdHM6IGZ1bmN0aW9uICgpIHsKCiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvdXNlci9jcmVkaXRzJywgeyBtZXRob2Q6ICdHRVQnIH0pLnRoZW4oZnVuY3Rpb24gKGJvZHkpIHsKICAgICAgICB2YXIgbiA9IGJvZHkgJiYgdHlwZW9mIGJvZHkuY3JlZGl0cyA9PT0gJ251bWJlcicgPyBib2R5LmNyZWRpdHMgOiAwOwogICAgICAgIHJldHVybiB7IGNyZWRpdHM6IG4gfTsKICAgICAgfSk7CiAgICB9LAoKICAgIGNoZWNrb3V0OiBmdW5jdGlvbiAocHJvZHVjdElEKSB7CgogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL3BheS9jaGVja291dCcsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IHsgcHJvZHVjdElEOiBwcm9kdWN0SUQgfSB9KTsKICAgIH0sCgogICAgZ2VuVGV4dFRvSW1hZ2U6IGZ1bmN0aW9uIChwYXJhbXMpIHsKICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgICB2YXIgd2lkdGggPSBwYXJhbXMud2lkdGggfHwgKHBhcmFtcy5pbWFnZV9zaXplICYmIHBhcmFtcy5pbWFnZV9zaXplLndpZHRoKSB8fCAxMDI0OwogICAgICB2YXIgaGVpZ2h0ID0gcGFyYW1zLmhlaWdodCB8fCAocGFyYW1zLmltYWdlX3NpemUgJiYgcGFyYW1zLmltYWdlX3NpemUuaGVpZ2h0KSB8fCAxMDI0OwogICAgICB2YXIgc2VlZCA9IHBhcmFtcy5zZWVkICE9IG51bGwgPyBwYXJhbXMuc2VlZCA6IHJhbmRvbVNlZWQoKTsKICAgICAgdmFyIGJvZHkgPSB7CiAgICAgICAgcHJvbXB0OiBwYXJhbXMucHJvbXB0IHx8ICcnLAogICAgICAgIHNlZWQ6IHNlZWQsCiAgICAgICAgaW1hZ2Vfc2l6ZTogeyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH0KICAgICAgfTsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9nZW4vZmx1eC1zY2huZWxsJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogYm9keSwgcmF3OiB0cnVlIH0pCiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcykgeyByZXR1cm4gcGFyc2VTdWJtaXQocmVzKTsgfSk7CiAgICB9LAoKICAgIHBvbGxUZXh0VG9JbWFnZTogZnVuY3Rpb24gKHJlcXVlc3RJRCkgewogICAgICByZXF1ZXN0SUQgPSByZXFJZChyZXF1ZXN0SUQpOwogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2dlbi9mbHV4LXNjaG5lbGwvJyArIGVuY29kZVVSSUNvbXBvbmVudChyZXF1ZXN0SUQpLCB7CiAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICByYXc6IHRydWUKICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7IHJldHVybiBwb2xsUmVzcG9uc2UocmVzKTsgfSk7CiAgICB9LAoKICAgIGdlbkVkaXQ6IGZ1bmN0aW9uIChtb2RlbCwgcGFyYW1zKSB7CiAgICAgIG1vZGVsID0gbW9kZWwgfHwgJ2ZsdXhLbGVpbic7CiAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTsKICAgICAgdmFyIGJvZHkgPSBzaGFwZUVkaXRSZXF1ZXN0KG1vZGVsLCBwYXJhbXMpOwogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2dlbi9lZGl0LWltYWdlJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIHF1ZXJ5OiB7IG1vZGVsOiBtb2RlbCB9LAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgcmF3OiB0cnVlCiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykgeyByZXR1cm4gcGFyc2VTdWJtaXQocmVzKTsgfSk7CiAgICB9LAoKICAgIHBvbGxFZGl0OiBmdW5jdGlvbiAobW9kZWwsIHJlcXVlc3RJRCkgewogICAgICByZXF1ZXN0SUQgPSByZXFJZChyZXF1ZXN0SUQpOwogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2dlbi9lZGl0LWltYWdlLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVxdWVzdElEKSwgewogICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgcXVlcnk6IHsgbW9kZWw6IG1vZGVsIHx8ICdmbHV4S2xlaW4nIH0sCiAgICAgICAgcmF3OiB0cnVlCiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykgeyByZXR1cm4gcG9sbFJlc3BvbnNlKHJlcyk7IH0pOwogICAgfSwKCiAgICBzaGFwZUVkaXRSZXF1ZXN0OiBmdW5jdGlvbiAobW9kZWwsIHBhcmFtcykgeyByZXR1cm4gc2hhcGVFZGl0UmVxdWVzdChtb2RlbCwgcGFyYW1zKTsgfSwKCiAgICBnZW5EeW5hbWljOiBmdW5jdGlvbiAoZW5kcG9pbnRJZCwgcGFyYW1zKSB7CiAgICAgIHZhciBib2R5ID0gc2hhcGVFZGl0UmVxdWVzdChwYXJhbXMgJiYgcGFyYW1zLm1vZGVsID8gcGFyYW1zLm1vZGVsIDogbnVsbCwgcGFyYW1zIHx8IHt9KTsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9nZW4vZHluYW1pYy8nICsgZW5jb2RlU2x1ZyhlbmRwb2ludElkKSwgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgcmF3OiB0cnVlCiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykgeyByZXR1cm4gcGFyc2VTdWJtaXQocmVzKTsgfSk7CiAgICB9LAoKICAgIHBvbGxEeW5hbWljOiBmdW5jdGlvbiAoZW5kcG9pbnRJZCwgcmVxdWVzdElEKSB7CiAgICAgIHJlcXVlc3RJRCA9IHJlcUlkKHJlcXVlc3RJRCk7CiAgICAgIHJldHVybiByZXF1ZXN0KAogICAgICAgICcvdjEvZHJlYW0vZ2VuL2R5bmFtaWMvJyArIGVuY29kZVNsdWcoZW5kcG9pbnRJZCkgKyAnLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVxdWVzdElEKSwKICAgICAgICB7IG1ldGhvZDogJ0dFVCcsIHJhdzogdHJ1ZSB9CiAgICAgICkudGhlbihmdW5jdGlvbiAocmVzKSB7IHJldHVybiBwb2xsUmVzcG9uc2UocmVzKTsgfSk7CiAgICB9LAoKICAgIG1vZGVsczogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL21vZGVscycsIHsgbWV0aG9kOiAnR0VUJyB9KTsKICAgIH0sCgogICAgcmVnaXN0cnk6IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9yZWdpc3RyeScsIHsgbWV0aG9kOiAnR0VUJyB9KTsKICAgIH0sCgogICAgZ2VuVmlkZW9MVFg6IGZ1bmN0aW9uIChwYXJhbXMpIHsKICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgICB2YXIgYm9keSA9IHsKICAgICAgICBpbWFnZV91cmw6IHBhcmFtcy5pbWFnZV91cmwsCiAgICAgICAgcHJvbXB0OiBwYXJhbXMucHJvbXB0IHx8ICcnLAogICAgICAgIGR1cmF0aW9uOiBwYXJhbXMuZHVyYXRpb24gIT0gbnVsbCA/IHBhcmFtcy5kdXJhdGlvbiA6IDgsCiAgICAgICAgc2VlZDogcGFyYW1zLnNlZWQgIT0gbnVsbCA/IHBhcmFtcy5zZWVkIDogcmFuZG9tU2VlZCgpCiAgICAgIH07CiAgICAgIGlmIChwYXJhbXMuZW5kX2ltYWdlX3VybCkgYm9keS5lbmRfaW1hZ2VfdXJsID0gcGFyYW1zLmVuZF9pbWFnZV91cmw7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZ2VuL2x0eC12aWRlbycsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IGJvZHksIHJhdzogdHJ1ZSB9KQogICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIHBhcnNlU3VibWl0KHJlcyk7IH0pOwogICAgfSwKCiAgICBwb2xsVmlkZW9MVFg6IGZ1bmN0aW9uIChyZXF1ZXN0SUQsIGdlbmVyYXRlZEltYWdlSUQpIHsKICAgICAgcmVxdWVzdElEID0gcmVxSWQocmVxdWVzdElEKTsKICAgICAgdmFyIHF1ZXJ5ID0ge307CiAgICAgIGlmIChnZW5lcmF0ZWRJbWFnZUlEKSBxdWVyeS5nZW5lcmF0ZWRJbWFnZUlEID0gZ2VuZXJhdGVkSW1hZ2VJRDsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9nZW4vbHR4LXZpZGVvLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVxdWVzdElEKSwgewogICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgcXVlcnk6IHF1ZXJ5LAogICAgICAgIHJhdzogdHJ1ZQogICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICByZXR1cm4gcG9sbFJlc3BvbnNlKHJlcywgZnVuY3Rpb24gKGJvZHkpIHsKCiAgICAgICAgICByZXR1cm4gYm9keTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9LAoKICAgIHBlcnNpc3RJbWFnZTogZnVuY3Rpb24gKGdlbmVyYXRlZEltYWdlKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vaW1hZ2VzJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogZ2VuZXJhdGVkSW1hZ2UgfSk7CiAgICB9LAoKICAgIGxpYnJhcnk6IGZ1bmN0aW9uIChwYWdlLCBwZXIpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS91c2VyL21lL2dlbmVyYXRlZGltYWdlcycsIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIHF1ZXJ5OiB7IHBhZ2U6IHBhZ2UgIT0gbnVsbCA/IHBhZ2UgOiAxLCBwZXI6IHBlciAhPSBudWxsID8gcGVyIDogMzAgfQogICAgICB9KS50aGVuKHBhZ2luYXRlZCk7CiAgICB9LAoKICAgIGZhdm9yaXRlczogZnVuY3Rpb24gKHBlcikgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL3VzZXIvbWUvZ2VuZXJhdGVkaW1hZ2VzL2Zhdm9yaXRlZCcsIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIHF1ZXJ5OiB7IHBlcjogcGVyICE9IG51bGwgPyBwZXIgOiAyMDAgfQogICAgICB9KS50aGVuKHBhZ2luYXRlZCk7CiAgICB9LAoKICAgIHNldEZhdm9yaXRlOiBmdW5jdGlvbiAocmVtb3RlSUQsIGZhdm9yaXRlZCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ltYWdlcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlbW90ZUlEKSArICcvZmF2b3JpdGVkJywgewogICAgICAgIG1ldGhvZDogJ1BBVENIJywKICAgICAgICBib2R5OiB7IGZhdm9yaXRlZDogISFmYXZvcml0ZWQgfQogICAgICB9KTsKICAgIH0sCgogICAgZGVsZXRlSW1hZ2U6IGZ1bmN0aW9uIChyZW1vdGVJRCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YyL2dlbmVyYXRlZGltYWdlLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVtb3RlSUQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7CiAgICB9LAoKICAgIGRlbGV0ZUxpYnJhcnlJbWFnZTogZnVuY3Rpb24gKHJlbW90ZUlEKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vaW1hZ2VzLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVtb3RlSUQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7CiAgICB9LAoKICAgIHNldFB1Ymxpc2hlZDogZnVuY3Rpb24gKHJlbW90ZUlELCBwdWJsaXNoZWQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9pbWFnZXMvJyArIGVuY29kZVVSSUNvbXBvbmVudChyZW1vdGVJRCksIHsKICAgICAgICBtZXRob2Q6ICdQVVQnLAogICAgICAgIGJvZHk6IHsgcHVibGlzaGVkOiAhIXB1Ymxpc2hlZCB9CiAgICAgIH0pOwogICAgfSwKCiAgICByYXRpbmc6IGZ1bmN0aW9uIChyZW1vdGVJRCwgYWN0aW9uKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vaW1hZ2VzLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVtb3RlSUQpICsgJy9yYXRpbmcnLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgYm9keTogeyBhY3Rpb246IGFjdGlvbiB9CiAgICAgIH0pOwogICAgfSwKCiAgICBoaXN0b3J5OiBmdW5jdGlvbiAocmVtb3RlSUQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9pbWFnZXMvJyArIGVuY29kZVVSSUNvbXBvbmVudChyZW1vdGVJRCkgKyAnL2hpc3RvcnknLCB7CiAgICAgICAgbWV0aG9kOiAnR0VUJwogICAgICB9KTsKICAgIH0sCgogICAgcHVibGljRmVlZDogZnVuY3Rpb24gKHBhZ2UsIHBlciwgdGFnKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vaW1hZ2VzJywgewogICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgYXV0aDogZmFsc2UsCiAgICAgICAgcXVlcnk6IHsgcGFnZTogcGFnZSAhPSBudWxsID8gcGFnZSA6IDEsIHBlcjogcGVyICE9IG51bGwgPyBwZXIgOiAzMCwgdGFnOiB0YWcgfHwgdW5kZWZpbmVkIH0KICAgICAgfSkudGhlbihwYWdpbmF0ZWQpOwogICAgfSwKCiAgICBmb2xkZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZm9sZGVycycsIHsgbWV0aG9kOiAnR0VUJyB9KTsKICAgIH0sCgogICAgY3JlYXRlRm9sZGVyOiBmdW5jdGlvbiAobmFtZSkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ZvbGRlcnMnLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiB7IG5hbWU6IG5hbWUgfSB9KTsKICAgIH0sCgogICAgcmVuYW1lRm9sZGVyOiBmdW5jdGlvbiAoaWQsIG5hbWUpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9mb2xkZXJzLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpLCB7CiAgICAgICAgbWV0aG9kOiAnUEFUQ0gnLAogICAgICAgIGJvZHk6IHsgbmFtZTogbmFtZSB9CiAgICAgIH0pOwogICAgfSwKCiAgICBkZWxldGVGb2xkZXI6IGZ1bmN0aW9uIChpZCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ZvbGRlcnMvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCksIHsgbWV0aG9kOiAnREVMRVRFJyB9KTsKICAgIH0sCgogICAgYXNzaWduRm9sZGVyOiBmdW5jdGlvbiAoZm9sZGVySUQsIGltYWdlSURzKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZm9sZGVycy9hc3NpZ24nLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgYm9keTogeyBmb2xkZXJJRDogZm9sZGVySUQgIT0gbnVsbCA/IGZvbGRlcklEIDogbnVsbCwgaW1hZ2VJRHM6IGltYWdlSURzIHx8IFtdIH0KICAgICAgfSk7CiAgICB9LAoKICAgIGZvbGRlckltYWdlczogZnVuY3Rpb24gKGlkLCBwYWdlLCBwZXIpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9mb2xkZXJzLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpICsgJy9pbWFnZXMnLCB7CiAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICBxdWVyeTogeyBwYWdlOiBwYWdlICE9IG51bGwgPyBwYWdlIDogMSwgcGVyOiBwZXIgIT0gbnVsbCA/IHBlciA6IDMwIH0KICAgICAgfSkudGhlbihwYWdpbmF0ZWQpOwogICAgfSwKCiAgICBwcmVzZXRzOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjMvcHJlc2V0cycsIHsgbWV0aG9kOiAnR0VUJyB9KTsKICAgIH0sCgogICAgY3JlYXRlUHJlc2V0OiBmdW5jdGlvbiAocCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YzL3ByZXNldHMnLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiBub3JtYWxpemVQcmVzZXQocCkgfSk7CiAgICB9LAoKICAgIHVwZGF0ZVByZXNldDogZnVuY3Rpb24gKGlkLCBwKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjMvcHJlc2V0cy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSwgewogICAgICAgIG1ldGhvZDogJ1BVVCcsCiAgICAgICAgYm9keTogbm9ybWFsaXplUHJlc2V0KHApCiAgICAgIH0pOwogICAgfSwKCiAgICBkZWxldGVQcmVzZXQ6IGZ1bmN0aW9uIChpZCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YzL3ByZXNldHMvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCksIHsgbWV0aG9kOiAnREVMRVRFJyB9KTsKICAgIH0sCgogICAgcmVvcmRlclByZXNldHM6IGZ1bmN0aW9uIChpZHMpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92My9wcmVzZXRzL3Jlb3JkZXInLCB7IG1ldGhvZDogJ1BVVCcsIGJvZHk6IHsgb3JkZXJlZElEczogaWRzIHx8IFtdIH0gfSk7CiAgICB9LAoKICAgIHN5bmNQcmVzZXRzOiBmdW5jdGlvbiAocHJlc2V0cykgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YzL3ByZXNldHMvc3luYycsIHsKICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICBib2R5OiB7IHByZXNldHM6IChwcmVzZXRzIHx8IFtdKS5tYXAobm9ybWFsaXplUHJlc2V0KSB9CiAgICAgIH0pOwogICAgfSwKCiAgICBjdXJhdGVkRmVlZDogZnVuY3Rpb24gKHBhZ2UsIHBlciwgdGFnKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjIvY3VyYXRpb24vZ2VuZXJhdGVkaW1hZ2VzJywgewogICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgYXV0aDogZmFsc2UsCiAgICAgICAgcXVlcnk6IHsgcGFnZTogcGFnZSAhPSBudWxsID8gcGFnZSA6IDEsIHBlcjogcGVyICE9IG51bGwgPyBwZXIgOiAzMCwgdGFnOiB0YWcgfHwgdW5kZWZpbmVkIH0KICAgICAgfSkudGhlbihwYWdpbmF0ZWQpOwogICAgfSwKCiAgICBnZXRQcm9maWxlOiBmdW5jdGlvbiAoaWQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92Mi9wcm9maWxlLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIGdldFByaXZhdGVQcm9maWxlOiBmdW5jdGlvbiAoaWQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92Mi9wcm9maWxlL3ByaXZhdGUvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCksIHsgbWV0aG9kOiAnR0VUJyB9KTsKICAgIH0sCgogICAgY3JlYXRlUHJvZmlsZTogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92Mi9wcm9maWxlJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogZGF0YSB9KTsKICAgIH0sCgogICAgdXBkYXRlUHJvZmlsZTogZnVuY3Rpb24gKGlkLCBkYXRhKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjIvcHJvZmlsZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSwgeyBtZXRob2Q6ICdQVVQnLCBib2R5OiBkYXRhIH0pOwogICAgfSwKCiAgICBkZWxldGVQcm9maWxlOiBmdW5jdGlvbiAoaWQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92Mi9wcm9maWxlLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7CiAgICB9LAoKICAgIHByb2ZpbGVJbWFnZXM6IGZ1bmN0aW9uIChpZCwgcGFnZSwgcGVyKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjIvcHJvZmlsZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSArICcvZ2VuZXJhdGVkaW1hZ2VzJywgewogICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgcXVlcnk6IHsgcGFnZTogcGFnZSAhPSBudWxsID8gcGFnZSA6IDEsIHBlcjogcGVyICE9IG51bGwgPyBwZXIgOiAzMCB9CiAgICAgIH0pLnRoZW4ocGFnaW5hdGVkKTsKICAgIH0sCgogICAgcHVibGlzaEltYWdlOiBmdW5jdGlvbiAocHJvZmlsZUlELCBnZW5lcmF0ZWRJbWFnZSkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YyL3Byb2ZpbGUvJyArIGVuY29kZVVSSUNvbXBvbmVudChwcm9maWxlSUQpICsgJy9nZW5lcmF0ZWRpbWFnZScsIHsKICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICBib2R5OiBnZW5lcmF0ZWRJbWFnZQogICAgICB9KTsKICAgIH0sCgogICAgdXBsb2FkSW1hZ2U6IGZ1bmN0aW9uIChibG9iT3JGaWxlLCBtZWRpYVR5cGUsIG9wdHMpIHsKICAgICAgbWVkaWFUeXBlID0gbWVkaWFUeXBlIHx8ICdyZW5kZXInOwogICAgICBvcHRzID0gb3B0cyB8fCB7fTsKCiAgICAgIGlmICghKGJsb2JPckZpbGUgaW5zdGFuY2VvZiBCbG9iKSkgewogICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChBcGlFcnJvcigwLCAndXBsb2FkSW1hZ2UgcmVxdWlyZXMgYSBCbG9iIG9yIEZpbGUuJywgbnVsbCkpOwogICAgICB9CgogICAgICB2YXIgY29udGVudFR5cGUgPSBibG9iT3JGaWxlLnR5cGUgfHwgbWVkaWFUeXBlQ29udGVudFR5cGUobWVkaWFUeXBlKTsKICAgICAgdmFyIGZpbGVuYW1lID0gb3B0cy5maWxlbmFtZSB8fCAoYmxvYk9yRmlsZS5uYW1lKSB8fCAodXVpZCgpICsgZmlsZUV4dChjb250ZW50VHlwZSkpOwogICAgICB2YXIgdG90YWxCeXRlcyA9IGJsb2JPckZpbGUuc2l6ZSAhPSBudWxsID8gYmxvYk9yRmlsZS5zaXplIDogbnVsbDsKCiAgICAgIHZhciBxdWVyeSA9IHsKICAgICAgICBmaWxlbmFtZTogZmlsZW5hbWUsCiAgICAgICAgbWVkaWFUeXBlOiBtZWRpYVR5cGUsCiAgICAgICAgdG90YWxCeXRlczogdG90YWxCeXRlcwogICAgICB9OwogICAgICBpZiAob3B0cy5wcm9maWxlSUQpIHF1ZXJ5LnByb2ZpbGVJRCA9IG9wdHMucHJvZmlsZUlEOwogICAgICBpZiAob3B0cy5wcm9qZWN0SUQpIHF1ZXJ5LnByb2plY3RJRCA9IG9wdHMucHJvamVjdElEOwoKICAgICAgdmFyIHJlcUluaXQgPSB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgcXVlcnk6IHF1ZXJ5LAogICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6IGNvbnRlbnRUeXBlIH0sCiAgICAgICAgYm9keTogYmxvYk9yRmlsZQogICAgICB9OwogICAgICBpZiAob3B0cy5zaWduYWwpIHJlcUluaXQuc2lnbmFsID0gb3B0cy5zaWduYWw7CgogICAgICByZXR1cm4gcmVxdWVzdCgnL21lZGlhL3VwbG9hZCcsIHJlcUluaXQpLnRoZW4oZnVuY3Rpb24gKHBlcnNvbmFsKSB7CiAgICAgICAgdmFyIHB1YmxpY1VSTCA9IHBlcnNvbmFsICYmIHBlcnNvbmFsLmdsb2JhbCAmJiBwZXJzb25hbC5nbG9iYWwubWVkaWFVUkw7CiAgICAgICAgaWYgKCFwdWJsaWNVUkwpIHsKICAgICAgICAgIHRocm93IEFwaUVycm9yKDUwMiwgJ1RoZSB1cGxvYWQgc2VydmljZSByZXR1cm5lZCBhbiB1bmV4cGVjdGVkIHJlc3BvbnNlLicsIHBlcnNvbmFsKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHB1YmxpY1VSTDsKICAgICAgfSk7CiAgICB9LAoKICAgIHJlZmVycmFsQ29kZXM6IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9yZWZlcnJhbC9jb2RlcycsIHsgbWV0aG9kOiAnR0VUJyB9KTsKICAgIH0sCgogICAgcmVmZXJyYWxBdHRyaWJ1dGlvbjogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL3JlZmVycmFsL2F0dHJpYnV0aW9uJywgeyBtZXRob2Q6ICdHRVQnIH0pOwogICAgfSwKCiAgICBhdHRyaWJ1dGVSZWZlcnJhbDogZnVuY3Rpb24gKGNvZGUpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9yZWZlcnJhbC9hdHRyaWJ1dGUnLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgYm9keTogeyBjb2RlOiBjb2RlIH0KICAgICAgfSk7CiAgICB9LAoKICAgIGxvb2t1cFJlZmVycmFsOiBmdW5jdGlvbiAoY29kZSkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL3JlZmVycmFsL2NvZGUvJyArIGVuY29kZVVSSUNvbXBvbmVudChjb2RlKSwgewogICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgYXV0aDogZmFsc2UKICAgICAgfSk7CiAgICB9LAoKICAgIHNlYXJjaDogZnVuY3Rpb24gKHRleHQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy9zZWFyY2gvJyArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgeyBtZXRob2Q6ICdHRVQnIH0pOwogICAgfSwKCiAgICB1c2VyU2VhcmNoOiBmdW5jdGlvbiAodGV4dCwgcGFnZSwgcGVyKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdXNlcnNlYXJjaC8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCB7CiAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICBxdWVyeTogeyBwYWdlOiBwYWdlICE9IG51bGwgPyBwYWdlIDogMSwgcGVyOiBwZXIgIT0gbnVsbCA/IHBlciA6IDMwIH0KICAgICAgfSkudGhlbihwYWdpbmF0ZWQpOwogICAgfSwKCiAgICByZXBvcnQ6IGZ1bmN0aW9uIChwYXlsb2FkKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvbW9kZXJhdGUvcmVwb3J0JywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogcGF5bG9hZCB9KTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiByZXFJZCh4KSB7CiAgICBpZiAoeCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcpIHJldHVybiB4LnJlcXVlc3RfaWQgfHwgeC5yZXF1ZXN0SUQgfHwgeC5pZCB8fCAnJzsKICAgIHJldHVybiB4OwogIH0KCiAgZnVuY3Rpb24gcGFyc2VTdWJtaXQocmVzKSB7CiAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjAyKSB7CgogICAgfQogICAgcmV0dXJuIHJlcy50ZXh0KCkudGhlbihmdW5jdGlvbiAodHh0KSB7CiAgICAgIHZhciBib2R5ID0gc2FmZVBhcnNlKHR4dCk7CiAgICAgIGlmICghcmVzLm9rICYmIHJlcy5zdGF0dXMgIT09IDIwMikgewogICAgICAgIHRocm93IEFwaUVycm9yKHJlcy5zdGF0dXMsIGVycm9yTWVzc2FnZShib2R5LCByZXMuc3RhdHVzKSwgYm9keSk7CiAgICAgIH0KICAgICAgaWYgKCFib2R5IHx8ICghYm9keS5yZXF1ZXN0X2lkICYmICFib2R5LnJlcXVlc3RJRCkpIHsKICAgICAgICB0aHJvdyBBcGlFcnJvcihyZXMuc3RhdHVzIHx8IDUwMiwgZXJyb3JNZXNzYWdlKGJvZHksIHJlcy5zdGF0dXMpIHx8ICdHZW5lcmF0aW9uIGNvdWxkIG5vdCBiZSBzdGFydGVkLicsIGJvZHkpOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgcmVxdWVzdF9pZDogYm9keS5yZXF1ZXN0X2lkIHx8IGJvZHkucmVxdWVzdElELAogICAgICAgIHF1ZXVlX3Bvc2l0aW9uOiBib2R5LnF1ZXVlX3Bvc2l0aW9uICE9IG51bGwgPyBib2R5LnF1ZXVlX3Bvc2l0aW9uIDogKGJvZHkucXVldWVQb3NpdGlvbiAhPSBudWxsID8gYm9keS5xdWV1ZVBvc2l0aW9uIDogMCkKICAgICAgfTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gc2hhcGVFZGl0UmVxdWVzdChtb2RlbCwgcGFyYW1zKSB7CiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307CiAgICB2YXIgc2VlZCA9IHBhcmFtcy5zZWVkICE9IG51bGwgPyBwYXJhbXMuc2VlZCA6IHJhbmRvbVNlZWQoKTsKICAgIHZhciBib2R5ID0gewogICAgICBwcm9tcHQ6IHBhcmFtcy5wcm9tcHQgfHwgJycsCiAgICAgIHNlZWQ6IHNlZWQKICAgIH07CgogICAgdmFyIHVybHMgPSBwYXJhbXMuaW1hZ2VfdXJscyB8fCBwYXJhbXMuaW1hZ2VVUkxzIHx8IG51bGw7CiAgICB2YXIgc2luZ2xlID0gcGFyYW1zLmltYWdlX3VybCB8fCBwYXJhbXMuaW1hZ2VVUkwgfHwgKHVybHMgJiYgdXJscy5sZW5ndGggPyB1cmxzWzBdIDogbnVsbCk7CgogICAgaWYgKHBhcmFtcy5pbWFnZV9zaXplKSBib2R5LmltYWdlX3NpemUgPSBwYXJhbXMuaW1hZ2Vfc2l6ZTsKCiAgICBpZiAoTkFOT19NT0RFTFNbbW9kZWxdKSB7CgogICAgICB2YXIgYXJyID0gdXJscyAmJiB1cmxzLmxlbmd0aCA/IHVybHMuc2xpY2UoKSA6IChzaW5nbGUgPyBbc2luZ2xlXSA6IFtdKTsKICAgICAgYm9keS5pbWFnZV91cmxzID0gYXJyOwogICAgICBpZiAoc2luZ2xlKSBib2R5LmltYWdlX3VybCA9IHNpbmdsZTsKICAgICAgYm9keS5udW1faW1hZ2VzID0gMTsKCiAgICB9IGVsc2UgewoKICAgICAgaWYgKHNpbmdsZSkgYm9keS5pbWFnZV91cmwgPSBzaW5nbGU7CiAgICAgIGlmICh1cmxzICYmIHVybHMubGVuZ3RoID4gMSkgYm9keS5pbWFnZV91cmxzID0gdXJscy5zbGljZSgpOwogICAgICBib2R5LmFjY2VsZXJhdGlvbiA9ICdoaWdoJzsKICAgIH0KCiAgICBpZiAocGFyYW1zLm51bV9pbmZlcmVuY2Vfc3RlcHMgIT0gbnVsbCAmJiBib2R5Lm51bV9pbmZlcmVuY2Vfc3RlcHMgPT0gbnVsbCkgewogICAgICBib2R5Lm51bV9pbmZlcmVuY2Vfc3RlcHMgPSBwYXJhbXMubnVtX2luZmVyZW5jZV9zdGVwczsKICAgIH0KICAgIGlmIChwYXJhbXMuZ3VpZGFuY2Vfc2NhbGUgIT0gbnVsbCAmJiBib2R5Lmd1aWRhbmNlX3NjYWxlID09IG51bGwpIHsKICAgICAgYm9keS5ndWlkYW5jZV9zY2FsZSA9IHBhcmFtcy5ndWlkYW5jZV9zY2FsZTsKICAgIH0KICAgIGlmIChwYXJhbXMubmVnYXRpdmVfcHJvbXB0ICE9IG51bGwgJiYgYm9keS5uZWdhdGl2ZV9wcm9tcHQgPT0gbnVsbCkgewogICAgICBib2R5Lm5lZ2F0aXZlX3Byb21wdCA9IHBhcmFtcy5uZWdhdGl2ZV9wcm9tcHQ7CiAgICB9CiAgICBpZiAocGFyYW1zLm51bV9pbWFnZXMgIT0gbnVsbCAmJiBib2R5Lm51bV9pbWFnZXMgPT0gbnVsbCkgewogICAgICBib2R5Lm51bV9pbWFnZXMgPSBwYXJhbXMubnVtX2ltYWdlczsKICAgIH0KICAgIGlmIChwYXJhbXMubG9yYXMgIT0gbnVsbCkgYm9keS5sb3JhcyA9IHBhcmFtcy5sb3JhczsKICAgIGlmIChwYXJhbXMuYWNjZWxlcmF0aW9uICE9IG51bGwpIGJvZHkuYWNjZWxlcmF0aW9uID0gcGFyYW1zLmFjY2VsZXJhdGlvbjsKCiAgICByZXR1cm4gYm9keTsKICB9CgogIGZ1bmN0aW9uIG5vcm1hbGl6ZVByZXNldChwKSB7CiAgICBwID0gcCB8fCB7fTsKICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXC5cZHszfVokLywgJ1onKTsKICAgIHJldHVybiB7CiAgICAgIGlkOiBwLmlkIHx8IHV1aWQoKSwKICAgICAgbmFtZTogcC5uYW1lIHx8ICcnLAogICAgICBwcm9tcHQ6IHAucHJvbXB0IHx8ICcnLAogICAgICBuZWdhdGl2ZVByb21wdDogcC5uZWdhdGl2ZVByb21wdCAhPSBudWxsID8gcC5uZWdhdGl2ZVByb21wdCA6IG51bGwsCiAgICAgIG1vZGVsOiBwLm1vZGVsICE9IG51bGwgPyBwLm1vZGVsIDogbnVsbCwKICAgICAgZHluYW1pY0VuZHBvaW50SUQ6IHAuZHluYW1pY0VuZHBvaW50SUQgIT0gbnVsbCA/IHAuZHluYW1pY0VuZHBvaW50SUQgOiBudWxsLAogICAgICBjcmVhdGVkQXQ6IHAuY3JlYXRlZEF0IHx8IG5vdywKICAgICAgdXBkYXRlZEF0OiBub3cKICAgIH07CiAgfQoKICBmdW5jdGlvbiBwYWdpbmF0ZWQoYm9keSkgewogICAgaWYgKCFib2R5KSByZXR1cm4geyBpdGVtczogW10sIG1ldGFkYXRhOiB7IHBhZ2U6IDEsIHBlcjogMCwgdG90YWw6IDAgfSB9OwogICAgaWYgKEFycmF5LmlzQXJyYXkoYm9keSkpIHsKICAgICAgcmV0dXJuIHsgaXRlbXM6IGJvZHksIG1ldGFkYXRhOiB7IHBhZ2U6IDEsIHBlcjogYm9keS5sZW5ndGgsIHRvdGFsOiBib2R5Lmxlbmd0aCB9IH07CiAgICB9CiAgICB2YXIgaXRlbXMgPSBBcnJheS5pc0FycmF5KGJvZHkuaXRlbXMpID8gYm9keS5pdGVtcyA6IFtdOwogICAgdmFyIG1ldGEgPSBib2R5Lm1ldGFkYXRhIHx8IHt9OwogICAgcmV0dXJuIHsKICAgICAgaXRlbXM6IGl0ZW1zLAogICAgICBtZXRhZGF0YTogewogICAgICAgIHBhZ2U6IG1ldGEucGFnZSAhPSBudWxsID8gbWV0YS5wYWdlIDogMSwKICAgICAgICBwZXI6IG1ldGEucGVyICE9IG51bGwgPyBtZXRhLnBlciA6IGl0ZW1zLmxlbmd0aCwKICAgICAgICB0b3RhbDogbWV0YS50b3RhbCAhPSBudWxsID8gbWV0YS50b3RhbCA6IGl0ZW1zLmxlbmd0aAogICAgICB9CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gZW5jb2RlU2x1ZyhlbmRwb2ludElkKSB7CiAgICB2YXIgc2x1ZyA9IFN0cmluZyhlbmRwb2ludElkIHx8ICcnKS5yZXBsYWNlKC9eZmFsLWFpXC8vLCAnJyk7CgogICAgcmV0dXJuIHNsdWcuc3BsaXQoJy8nKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKCcvJyk7CiAgfQoKICBmdW5jdGlvbiBtZWRpYVR5cGVDb250ZW50VHlwZShtZWRpYVR5cGUpIHsKICAgIHN3aXRjaCAobWVkaWFUeXBlKSB7CiAgICAgIGNhc2UgJ3BkZic6IHJldHVybiAnYXBwbGljYXRpb24vcGRmJzsKICAgICAgY2FzZSAnanNvbic6IHJldHVybiAnYXBwbGljYXRpb24vanNvbic7CiAgICAgIGNhc2UgJ29ialppcCc6CiAgICAgIGNhc2UgJ3NwYXRpYWxBc3NldCc6IHJldHVybiAnYXBwbGljYXRpb24vemlwJzsKICAgICAgY2FzZSAndXNkeic6IHJldHVybiAnbW9kZWwvdm5kLnVzZHoremlwJzsKICAgICAgY2FzZSAnZGF0YSc6CiAgICAgIGNhc2UgJ2R3Zyc6CiAgICAgIGNhc2UgJ3JlYWxpdHknOiByZXR1cm4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CgogICAgICBkZWZhdWx0OiByZXR1cm4gJ2ltYWdlL2pwZWcnOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZmlsZUV4dChjb250ZW50VHlwZSkgewogICAgaWYgKCFjb250ZW50VHlwZSkgcmV0dXJuICcuanBnJzsKICAgIGlmIChjb250ZW50VHlwZS5pbmRleE9mKCdwbmcnKSA+PSAwKSByZXR1cm4gJy5wbmcnOwogICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoJ3dlYnAnKSA+PSAwKSByZXR1cm4gJy53ZWJwJzsKICAgIGlmIChjb250ZW50VHlwZS5pbmRleE9mKCdqcGVnJykgPj0gMCB8fCBjb250ZW50VHlwZS5pbmRleE9mKCdqcGcnKSA+PSAwKSByZXR1cm4gJy5qcGcnOwogICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoJ21wNCcpID49IDApIHJldHVybiAnLm1wNCc7CiAgICByZXR1cm4gJy5iaW4nOwogIH0KCiAgZnVuY3Rpb24gYjY0KHN0cikgewogICAgaWYgKFYudXRpbCAmJiB0eXBlb2YgVi51dGlsLmI2NCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudXRpbC5iNjQoc3RyKTsKICAgIHRyeSB7CiAgICAgIHJldHVybiB3aW5kb3cuYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSkpOwogICAgfSBjYXRjaCAoX2UpIHsKICAgICAgcmV0dXJuIHdpbmRvdy5idG9hKHN0cik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1dWlkKCkgewogICAgaWYgKFYudXRpbCAmJiB0eXBlb2YgVi51dGlsLnV1aWQgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnV0aWwudXVpZCgpOwogICAgaWYgKHdpbmRvdy5jcnlwdG8gJiYgdHlwZW9mIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICByZXR1cm4gd2luZG93LmNyeXB0by5yYW5kb21VVUlEKCk7CiAgICB9CiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykgewogICAgICB2YXIgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDsKICAgICAgdmFyIHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4OwogICAgICByZXR1cm4gdi50b1N0cmluZygxNik7CiAgICB9KTsKICB9CgogIFYuYXBpID0gYXBpOwp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9hdXRoLmpzID09PT09ICovCgooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIFYgPSB3aW5kb3cuViB8fCAod2luZG93LlYgPSB7fSk7CgogIHZhciBUT0tFTl9LRVkgPSAndmFtcF93ZWJfdG9rZW4nOwoKICBmdW5jdGlvbiBzYWZlR2V0U3RvcmFnZSgpIHsKCiAgICB0cnkgewogICAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZSB8fCBudWxsOwogICAgfSBjYXRjaCAoZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlYWRUb2tlbigpIHsKICAgIHZhciBscyA9IHNhZmVHZXRTdG9yYWdlKCk7CiAgICBpZiAoIWxzKSByZXR1cm4gbnVsbDsKICAgIHRyeSB7CiAgICAgIHZhciB0ID0gbHMuZ2V0SXRlbShUT0tFTl9LRVkpOwogICAgICByZXR1cm4gdCAmJiB0Lmxlbmd0aCA/IHQgOiBudWxsOwogICAgfSBjYXRjaCAoZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHdyaXRlVG9rZW4odCkgewogICAgdmFyIGxzID0gc2FmZUdldFN0b3JhZ2UoKTsKICAgIGlmICghbHMpIHJldHVybjsKICAgIHRyeSB7CiAgICAgIGlmICh0ID09IG51bGwgfHwgdCA9PT0gJycpIGxzLnJlbW92ZUl0ZW0oVE9LRU5fS0VZKTsKICAgICAgZWxzZSBscy5zZXRJdGVtKFRPS0VOX0tFWSwgU3RyaW5nKHQpKTsKICAgIH0gY2F0Y2ggKGUpIHsKCiAgICB9CiAgfQoKICBmdW5jdGlvbiBlbWl0KGV2dCwgcGF5bG9hZCkgewogICAgdHJ5IHsKICAgICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuZW1pdCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIFYuc3RvcmUuZW1pdChldnQsIHBheWxvYWQpOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7CgogICAgfQogIH0KCiAgZnVuY3Rpb24gc2V0U3RhdGUoa2V5LCB2YWx1ZSkgewogICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuc2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIFYuc3RvcmUuc2V0KGtleSwgdmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgVi5zdGF0ZSA9IFYuc3RhdGUgfHwge307CiAgICAgIFYuc3RhdGVba2V5XSA9IHZhbHVlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZ2V0U3RhdGUoa2V5KSB7CiAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5nZXQgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnN0b3JlLmdldChrZXkpOwogICAgcmV0dXJuIFYuc3RhdGUgPyBWLnN0YXRlW2tleV0gOiB1bmRlZmluZWQ7CiAgfQoKICBmdW5jdGlvbiBub3JtYWxpemVVc2VyKHBlcnNvbmFsKSB7CiAgICBpZiAoIXBlcnNvbmFsIHx8IHR5cGVvZiBwZXJzb25hbCAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsOwoKICAgIHZhciBnbG9iYWwgPSBwZXJzb25hbC5nbG9iYWwgJiYgdHlwZW9mIHBlcnNvbmFsLmdsb2JhbCA9PT0gJ29iamVjdCcgPyBwZXJzb25hbC5nbG9iYWwgOiB7fTsKICAgIHZhciBtaWNybyA9IGdsb2JhbC5taWNybyAmJiB0eXBlb2YgZ2xvYmFsLm1pY3JvID09PSAnb2JqZWN0JyA/IGdsb2JhbC5taWNybyA6IHt9OwoKICAgIHZhciBpZCA9IG1pY3JvLmlkICE9IG51bGwgPyBtaWNyby5pZCA6IChwZXJzb25hbC5pZCAhPSBudWxsID8gcGVyc29uYWwuaWQgOiBudWxsKTsKCiAgICB2YXIgdXNlcm5hbWUgPSBtaWNyby51c2VybmFtZSAhPSBudWxsID8gbWljcm8udXNlcm5hbWUKICAgICAgOiAocGVyc29uYWwudXNlcm5hbWUgIT0gbnVsbCA/IHBlcnNvbmFsLnVzZXJuYW1lIDogbnVsbCk7CgogICAgdmFyIGVtYWlsID0gcGVyc29uYWwuZW1haWwgIT0gbnVsbCA/IHBlcnNvbmFsLmVtYWlsIDogbnVsbDsKCiAgICB2YXIgZmlyc3ROYW1lID0gbWljcm8uZmlyc3ROYW1lICE9IG51bGwgPyBtaWNyby5maXJzdE5hbWUKICAgICAgOiAocGVyc29uYWwuZmlyc3ROYW1lICE9IG51bGwgPyBwZXJzb25hbC5maXJzdE5hbWUgOiBudWxsKTsKICAgIHZhciBsYXN0TmFtZSA9IG1pY3JvLmxhc3ROYW1lICE9IG51bGwgPyBtaWNyby5sYXN0TmFtZQogICAgICA6IChwZXJzb25hbC5sYXN0TmFtZSAhPSBudWxsID8gcGVyc29uYWwubGFzdE5hbWUgOiBudWxsKTsKCiAgICB2YXIgbmFtZSA9IG1pY3JvLm5hbWUgIT0gbnVsbCA/IG1pY3JvLm5hbWUKICAgICAgOiAocGVyc29uYWwubmFtZSAhPSBudWxsID8gcGVyc29uYWwubmFtZSA6IG51bGwpOwogICAgaWYgKCFuYW1lKSB7CiAgICAgIHZhciBwYXJ0cyA9IFtdOwogICAgICBpZiAoZmlyc3ROYW1lKSBwYXJ0cy5wdXNoKGZpcnN0TmFtZSk7CiAgICAgIGlmIChsYXN0TmFtZSkgcGFydHMucHVzaChsYXN0TmFtZSk7CiAgICAgIG5hbWUgPSBwYXJ0cy5qb2luKCcgJykgfHwgbnVsbDsKICAgIH0KCiAgICB2YXIgZGlzcGxheU5hbWUgPSBuYW1lIHx8IHVzZXJuYW1lIHx8IChlbWFpbCA/IGVtYWlsLnNwbGl0KCdAJylbMF0gOiBudWxsKSB8fCAnWW91JzsKCiAgICB2YXIgcHJvZmlsZVBpY1VSTCA9IG1pY3JvLnByb2ZpbGVQaWNVUkwgIT0gbnVsbCA/IG1pY3JvLnByb2ZpbGVQaWNVUkwKICAgICAgOiAocGVyc29uYWwucHJvZmlsZVBpY1VSTCAhPSBudWxsID8gcGVyc29uYWwucHJvZmlsZVBpY1VSTCA6IG51bGwpOwoKICAgIHJldHVybiB7CiAgICAgIGlkOiBpZCwKICAgICAgZW1haWw6IGVtYWlsLAogICAgICB1c2VybmFtZTogdXNlcm5hbWUsCiAgICAgIG5hbWU6IG5hbWUsCiAgICAgIGRpc3BsYXlOYW1lOiBkaXNwbGF5TmFtZSwKICAgICAgZmlyc3ROYW1lOiBmaXJzdE5hbWUsCiAgICAgIGxhc3ROYW1lOiBsYXN0TmFtZSwKICAgICAgcHJvZmlsZVBpY1VSTDogcHJvZmlsZVBpY1VSTCwKICAgICAgYWRtaW46IHBlcnNvbmFsLmFkbWluID09PSB0cnVlLAogICAgICBlbWFpbENvbmZpcm1lZDogcGVyc29uYWwuZW1haWxDb25maXJtZWQgPT09IHRydWUsCiAgICAgIGlzQW5vbnltb3VzOiBtaWNyby5pc0Fub255bW91cyA9PT0gdHJ1ZSwKCiAgICAgIGNyZWRpdHM6IHR5cGVvZiBwZXJzb25hbC5jcmVkaXRzID09PSAnbnVtYmVyJyA/IHBlcnNvbmFsLmNyZWRpdHMgOiBudWxsLAoKICAgICAgZ2xvYmFsOiBnbG9iYWwsCiAgICAgIG1pY3JvOiBtaWNybywKICAgICAgcmF3OiBwZXJzb25hbCwKICAgIH07CiAgfQoKICBmdW5jdGlvbiBpc0FwaUVycm9yKGVycikgewogICAgcmV0dXJuIGVyciAmJiAoZXJyLm5hbWUgPT09ICdBcGlFcnJvcicgfHwgdHlwZW9mIGVyci5zdGF0dXMgPT09ICdudW1iZXInKTsKICB9CgogIGZ1bmN0aW9uIHJlZnJlc2hDcmVkaXRzKCkgewogICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkuY3JlZGl0cyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgIHJldHVybiBWLmFwaS5jcmVkaXRzKCkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgIHZhciBuID0gcmVzICYmIHR5cGVvZiByZXMuY3JlZGl0cyA9PT0gJ251bWJlcicgPyByZXMuY3JlZGl0cyA6IG51bGw7CiAgICAgIGlmIChuICE9IG51bGwpIHsKICAgICAgICBzZXRTdGF0ZSgnY3JlZGl0cycsIG4pOwoKICAgICAgICB2YXIgdSA9IGdldFN0YXRlKCd1c2VyJyk7CiAgICAgICAgaWYgKHUgJiYgdHlwZW9mIHUgPT09ICdvYmplY3QnKSB1LmNyZWRpdHMgPSBuOwogICAgICAgIGVtaXQoJ2NyZWRpdHM6Y2hhbmdlZCcsIG4pOwogICAgICB9CiAgICAgIHJldHVybiBuOwogICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewoKICAgICAgaWYgKGlzQXBpRXJyb3IoZXJyKSAmJiAoZXJyLnN0YXR1cyA9PT0gNDAxIHx8IGVyci5zdGF0dXMgPT09IDQwMykpIHsKICAgICAgICBhcGk0MDFDbGVhcigpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBhcGk0MDFDbGVhcigpIHsKICAgIGNsZWFyKCk7CiAgICBlbWl0KCdlcnJvcicsIHsgbWVzc2FnZTogJ1lvdXIgc2Vzc2lvbiBleHBpcmVkLiBQbGVhc2Ugc2lnbiBpbiBhZ2Fpbi4nLCBjb2RlOiAnYXV0aCcgfSk7CiAgfQoKICBmdW5jdGlvbiB0b2tlbigpIHsKICAgIHJldHVybiByZWFkVG9rZW4oKTsKICB9CgogIGZ1bmN0aW9uIGlzQXV0aGVkKCkgewogICAgcmV0dXJuICEhcmVhZFRva2VuKCk7CiAgfQoKICBmdW5jdGlvbiBzZXRUb2tlbih0KSB7CiAgICBpZiAoIXQpIHsKICAgICAgY2xlYXIoKTsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignc2V0VG9rZW4gY2FsbGVkIHdpdGhvdXQgYSB0b2tlbicpKTsKICAgIH0KICAgIHdyaXRlVG9rZW4odCk7CgogICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkud2hvYW1pICE9PSAnZnVuY3Rpb24nKSB7CgogICAgICB2YXIgc2hlbGwgPSBub3JtYWxpemVVc2VyKHsgdG9rZW46IHQgfSk7CiAgICAgIHNldFN0YXRlKCd1c2VyJywgc2hlbGwpOwogICAgICBlbWl0KCdhdXRoOmNoYW5nZWQnLCBzaGVsbCk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc2hlbGwpOwogICAgfQoKICAgIHJldHVybiBWLmFwaS53aG9hbWkoKS50aGVuKGZ1bmN0aW9uIChwZXJzb25hbCkgewogICAgICB2YXIgdXNlciA9IG5vcm1hbGl6ZVVzZXIocGVyc29uYWwpOwogICAgICBzZXRTdGF0ZSgndXNlcicsIHVzZXIpOwoKICAgICAgaWYgKHVzZXIgJiYgdHlwZW9mIHVzZXIuY3JlZGl0cyA9PT0gJ251bWJlcicpIHsKICAgICAgICBzZXRTdGF0ZSgnY3JlZGl0cycsIHVzZXIuY3JlZGl0cyk7CiAgICAgICAgZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgdXNlci5jcmVkaXRzKTsKICAgICAgfQogICAgICBlbWl0KCdhdXRoOmNoYW5nZWQnLCB1c2VyKTsKICAgICAgcmV0dXJuIHVzZXI7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CgogICAgICBpZiAoaXNBcGlFcnJvcihlcnIpICYmIChlcnIuc3RhdHVzID09PSA0MDEgfHwgZXJyLnN0YXR1cyA9PT0gNDAzKSkgewogICAgICAgIGNsZWFyKCk7CiAgICAgIH0gZWxzZSB7CgogICAgICAgIHNldFN0YXRlKCd1c2VyJywgbnVsbCk7CiAgICAgICAgZW1pdCgnYXV0aDpjaGFuZ2VkJywgbnVsbCk7CiAgICAgIH0KICAgICAgdGhyb3cgZXJyOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBjbGVhcigpIHsKICAgIHdyaXRlVG9rZW4obnVsbCk7CiAgICBzZXRTdGF0ZSgndXNlcicsIG51bGwpOwogICAgc2V0U3RhdGUoJ2NyZWRpdHMnLCBudWxsKTsKICAgIHRyeSB7CiAgICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLnNhdmVMaWJyYXJ5Q2FjaGUgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuc2F2ZUxpYnJhcnlDYWNoZShbXSk7CiAgICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLnNldCA9PT0gJ2Z1bmN0aW9uJykgVi5zdG9yZS5zZXQoJ2xpYnJhcnknLCBbXSk7CiAgICB9IGNhdGNoIChlKSB7fQogICAgdHJ5IHsKICAgICAgaWYgKFYuaW1nQ2FjaGUgJiYgdHlwZW9mIFYuaW1nQ2FjaGUuY2xlYXIgPT09ICdmdW5jdGlvbicpIFYuaW1nQ2FjaGUuY2xlYXIoKTsKICAgIH0gY2F0Y2ggKGUyKSB7fQogICAgZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgbnVsbCk7CiAgICBlbWl0KCdhdXRoOmNoYW5nZWQnLCBudWxsKTsKICB9CgogIGZ1bmN0aW9uIHNpZ25JbihlbWFpbCwgcGFzc3dvcmQpIHsKICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLmxvZ2luICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0FQSSBub3QgcmVhZHknKSk7CiAgICB9CiAgICB2YXIgZW0gPSAoZW1haWwgPT0gbnVsbCA/ICcnIDogU3RyaW5nKGVtYWlsKSkudHJpbSgpOwogICAgdmFyIHB3ID0gcGFzc3dvcmQgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHBhc3N3b3JkKTsKICAgIGlmICghZW0pIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0VtYWlsIGlzIHJlcXVpcmVkJykpOwogICAgaWYgKCFwdykgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUGFzc3dvcmQgaXMgcmVxdWlyZWQnKSk7CgogICAgcmV0dXJuIFYuYXBpLmxvZ2luKGVtLCBwdykudGhlbihmdW5jdGlvbiAocGVyc29uYWwpIHsKICAgICAgdmFyIHQgPSBwZXJzb25hbCAmJiBwZXJzb25hbC50b2tlbjsKICAgICAgaWYgKCF0KSB0aHJvdyBuZXcgRXJyb3IoJ0xvZ2luIHJlc3BvbnNlIGRpZCBub3QgaW5jbHVkZSBhIHRva2VuJyk7CiAgICAgIHJldHVybiBzZXRUb2tlbih0KS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7CgogICAgICAgIHJldHVybiByZWZyZXNoQ3JlZGl0cygpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdXNlcjsgfSk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZWdpc3Rlcihmb3JtKSB7CiAgICBpZiAoIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS5zaWdudXAgIT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignQVBJIG5vdCByZWFkeScpKTsKICAgIH0KICAgIGZvcm0gPSBmb3JtIHx8IHt9OwoKICAgIHZhciBlbWFpbCA9IChmb3JtLmVtYWlsID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLmVtYWlsKSkudHJpbSgpOwogICAgdmFyIHBhc3N3b3JkID0gZm9ybS5wYXNzd29yZCA9PSBudWxsID8gJycgOiBTdHJpbmcoZm9ybS5wYXNzd29yZCk7CiAgICBpZiAoIWVtYWlsKSByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdFbWFpbCBpcyByZXF1aXJlZCcpKTsKICAgIGlmICghcGFzc3dvcmQpIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJykpOwogICAgaWYgKHBhc3N3b3JkLmxlbmd0aCA8IDggfHwgcGFzc3dvcmQubGVuZ3RoID4gMjQpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUGFzc3dvcmQgbXVzdCBiZSA44oCTMjQgY2hhcmFjdGVycycpKTsKICAgIH0KCiAgICB2YXIgZmlyc3ROYW1lID0gKGZvcm0uZmlyc3ROYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLmZpcnN0TmFtZSkpLnRyaW0oKTsKICAgIHZhciBsYXN0TmFtZSA9IChmb3JtLmxhc3ROYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLmxhc3ROYW1lKSkudHJpbSgpOwogICAgdmFyIG5hbWUgPSAoZm9ybS5uYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLm5hbWUpKS50cmltKCk7CgogICAgaWYgKCFuYW1lICYmIChmaXJzdE5hbWUgfHwgbGFzdE5hbWUpKSB7CiAgICAgIG5hbWUgPSBbZmlyc3ROYW1lLCBsYXN0TmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTsKICAgIH0KICAgIGlmIChuYW1lICYmICFmaXJzdE5hbWUpIHsKCiAgICAgIHZhciBiaXRzID0gbmFtZS5zcGxpdCgvXHMrLyk7CiAgICAgIGZpcnN0TmFtZSA9IGJpdHNbMF0gfHwgJyc7CiAgICAgIGlmICghbGFzdE5hbWUgJiYgYml0cy5sZW5ndGggPiAxKSBsYXN0TmFtZSA9IGJpdHMuc2xpY2UoMSkuam9pbignICcpOwogICAgfQoKICAgIHZhciBkYXRhID0gewogICAgICBlbWFpbDogZW1haWwsCiAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCwKICAgICAgbmFtZTogbmFtZSB8fCAoZW1haWwuc3BsaXQoJ0AnKVswXSksCiAgICAgIGZpcnN0TmFtZTogZmlyc3ROYW1lIHx8IChuYW1lID8gbmFtZS5zcGxpdCgvXHMrLylbMF0gOiAnJyksCiAgICAgIGxhc3ROYW1lOiBsYXN0TmFtZSB8fCAnJywKICAgICAgaGFzQWNjZXB0ZWRUZXJtc0FuZENvbmRpdGlvbnM6IHRydWUsCiAgICAgIGhhc0FjY2VwdGVkUHJpdmFjeVBvbGljeTogdHJ1ZSwKICAgICAgaGFyZHdhcmU6IG51bGwsCiAgICB9OwoKICAgIHZhciB1c2VybmFtZSA9IChmb3JtLnVzZXJuYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLnVzZXJuYW1lKSkudHJpbSgpOwogICAgaWYgKHVzZXJuYW1lKSBkYXRhLnVzZXJuYW1lID0gdXNlcm5hbWU7CgogICAgcmV0dXJuIFYuYXBpLnNpZ251cChkYXRhKS50aGVuKGZ1bmN0aW9uIChwZXJzb25hbCkgewogICAgICB2YXIgdCA9IHBlcnNvbmFsICYmIHBlcnNvbmFsLnRva2VuOwogICAgICBpZiAoIXQpIHRocm93IG5ldyBFcnJvcignU2lnbnVwIHJlc3BvbnNlIGRpZCBub3QgaW5jbHVkZSBhIHRva2VuJyk7CiAgICAgIHJldHVybiBzZXRUb2tlbih0KS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7CiAgICAgICAgcmV0dXJuIHJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB1c2VyOyB9KTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHsKICAgIHZhciB0ID0gcmVhZFRva2VuKCk7CiAgICBpZiAoIXQpIHsKCiAgICAgIHNldFN0YXRlKCd1c2VyJywgbnVsbCk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwogICAgfQoKICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLndob2FtaSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpOwogICAgfQoKICAgIHJldHVybiBWLmFwaS53aG9hbWkoKS50aGVuKGZ1bmN0aW9uIChwZXJzb25hbCkgewogICAgICB2YXIgdXNlciA9IG5vcm1hbGl6ZVVzZXIocGVyc29uYWwpOwogICAgICBzZXRTdGF0ZSgndXNlcicsIHVzZXIpOwogICAgICBlbWl0KCdhdXRoOmNoYW5nZWQnLCB1c2VyKTsKICAgICAgaWYgKHVzZXIgJiYgdHlwZW9mIHVzZXIuY3JlZGl0cyA9PT0gJ251bWJlcicpIHsKICAgICAgICBzZXRTdGF0ZSgnY3JlZGl0cycsIHVzZXIuY3JlZGl0cyk7CiAgICAgICAgZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgdXNlci5jcmVkaXRzKTsKICAgICAgfQoKICAgICAgcmVmcmVzaENyZWRpdHMoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIGlmIChpc0FwaUVycm9yKGVycikgJiYgKGVyci5zdGF0dXMgPT09IDQwMSB8fCBlcnIuc3RhdHVzID09PSA0MDMpKSB7CgogICAgICAgIGNsZWFyKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICBzZXRTdGF0ZSgndXNlcicsIG51bGwpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0pOwogIH0KCiAgVi5hdXRoID0gewogICAgdG9rZW46IHRva2VuLAogICAgc2V0VG9rZW46IHNldFRva2VuLAogICAgY2xlYXI6IGNsZWFyLAogICAgaXNBdXRoZWQ6IGlzQXV0aGVkLAogICAgc2lnbkluOiBzaWduSW4sCiAgICByZWdpc3RlcjogcmVnaXN0ZXIsCiAgICBib290c3RyYXA6IGJvb3RzdHJhcCwKCiAgICByZWZyZXNoQ3JlZGl0czogcmVmcmVzaENyZWRpdHMsCgogICAgbm9ybWFsaXplVXNlcjogbm9ybWFsaXplVXNlciwKICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9kYXRhL2FzcGVjdHMuanMgPT09PT0gKi8KCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLmRhdGEgPSBWLmRhdGEgfHwge307CgogIFYuZGF0YS5hc3BlY3RzID0gWwogICAgeyByYXc6ICdhdXRvJywgICAgICAgICBrZXk6ICdhdXRvJywgICAgICAgICBsYWJlbDogJ0F1dG8nLCAgICAgICAgICAgIHc6IDEwMjQsIGg6IDEwMjQsIGRlZmF1bHQ6IHRydWUgfSwKICAgIHsgcmF3OiAnc3F1YXJlJywgICAgICAga2V5OiAnc3F1YXJlJywgICAgICAgbGFiZWw6ICdTcXVhcmUnLCAgICAgICAgICB3OiAxMDI0LCBoOiAxMDI0IH0sCiAgICB7IHJhdzogJ3BvcnRyYWl0OTE2JywgIGtleTogJ3BvcnRyYWl0OTE2JywgIGxhYmVsOiAnUG9ydHJhaXQgOToxNicsICAgdzogMTAyNCwgaDogMTgyMCB9LAogICAgeyByYXc6ICdsYW5kc2NhcGUxNjknLCBrZXk6ICdsYW5kc2NhcGUxNjknLCBsYWJlbDogJ0xhbmRzY2FwZSAxNjo5JywgIHc6IDE4MjAsIGg6IDEwMjQgfSwKICAgIHsgcmF3OiAncG9ydHJhaXQ0MycsICAga2V5OiAncG9ydHJhaXQ0MycsICAgbGFiZWw6ICdQb3J0cmFpdCAzOjQnLCAgICB3OiAxMDI0LCBoOiAxMzY1IH0sCiAgICB7IHJhdzogJ2xhbmRzY2FwZTQzJywgIGtleTogJ2xhbmRzY2FwZTQzJywgIGxhYmVsOiAnTGFuZHNjYXBlIDQ6MycsICAgdzogMTM2NSwgaDogMTAyNCB9CiAgXTsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvZGF0YS9pbWdjYWNoZS5qcyA9PT09PSAqLwoKKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwoKICB2YXIgREJfTkFNRSA9ICd2YW1wLWltZy12MSc7CiAgdmFyIFNUT1JFID0gJ2ltYWdlcyc7CiAgdmFyIERCX1ZFUlNJT04gPSAxOwogIHZhciBNQVhfRU5UUklFUyA9IDYwMDsKCiAgdmFyIGhhc0lEQiA9IChmdW5jdGlvbiAoKSB7CiAgICB0cnkgeyByZXR1cm4gdHlwZW9mIHdpbmRvdy5pbmRleGVkREIgIT09ICd1bmRlZmluZWQnICYmICEhd2luZG93LmluZGV4ZWREQjsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0KICB9KSgpOwogIHZhciBoYXNCbG9iVVJMID0gKGZ1bmN0aW9uICgpIHsKICAgIHRyeSB7IHJldHVybiB0eXBlb2YgVVJMICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgVVJMLmNyZWF0ZU9iamVjdFVSTCA9PT0gJ2Z1bmN0aW9uJzsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0KICB9KSgpOwogIHZhciBjYW5GZXRjaCA9IChmdW5jdGlvbiAoKSB7CiAgICB0cnkgeyByZXR1cm4gdHlwZW9mIHdpbmRvdy5mZXRjaCA9PT0gJ2Z1bmN0aW9uJzsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0KICB9KSgpOwoKICB2YXIgb2JqZWN0VVJMcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgdmFyIGluZmxpZ2h0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB2YXIgZGJQcm9taXNlID0gbnVsbDsKCiAgZnVuY3Rpb24gb3BlbkRCKCkgewogICAgaWYgKCFoYXNJREIpIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ25vLWlkYicpKTsKICAgIGlmIChkYlByb21pc2UpIHJldHVybiBkYlByb21pc2U7CiAgICBkYlByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciByZXE7CiAgICAgIHRyeSB7IHJlcSA9IHdpbmRvdy5pbmRleGVkREIub3BlbihEQl9OQU1FLCBEQl9WRVJTSU9OKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IHJldHVybjsgfQogICAgICByZXEub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBkYiA9IHJlcS5yZXN1bHQ7CiAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFNUT1JFKSkgewogICAgICAgICAgdmFyIG9zID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoU1RPUkUsIHsga2V5UGF0aDogJ3VybCcgfSk7CiAgICAgICAgICBvcy5jcmVhdGVJbmRleCgndHMnLCAndHMnLCB7IHVuaXF1ZTogZmFsc2UgfSk7CiAgICAgICAgfQogICAgICB9OwogICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkgeyByZXNvbHZlKHJlcS5yZXN1bHQpOyB9OwogICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHsgcmVqZWN0KHJlcS5lcnJvciB8fCBuZXcgRXJyb3IoJ2lkYi1vcGVuLWZhaWxlZCcpKTsgfTsKICAgICAgcmVxLm9uYmxvY2tlZCA9IGZ1bmN0aW9uICgpIHsgcmVqZWN0KG5ldyBFcnJvcignaWRiLWJsb2NrZWQnKSk7IH07CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIGRiUHJvbWlzZSA9IG51bGw7CiAgICAgIHRocm93IGVycjsKICAgIH0pOwogICAgcmV0dXJuIGRiUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIHR4KG1vZGUpIHsKICAgIHJldHVybiBvcGVuREIoKS50aGVuKGZ1bmN0aW9uIChkYikgewogICAgICByZXR1cm4geyBkYjogZGIsIHN0b3JlOiBkYi50cmFuc2FjdGlvbihTVE9SRSwgbW9kZSkub2JqZWN0U3RvcmUoU1RPUkUpIH07CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGlkYkdldCh1cmwpIHsKICAgIHJldHVybiB0eCgncmVhZG9ubHknKS50aGVuKGZ1bmN0aW9uIChoKSB7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgdmFyIHJlcSA9IGguc3RvcmUuZ2V0KHVybCk7CiAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHsgcmVzb2x2ZShyZXEucmVzdWx0IHx8IG51bGwpOyB9OwogICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyByZWplY3QocmVxLmVycm9yKTsgfTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGlkYlB1dChyZWMpIHsKICAgIHJldHVybiB0eCgncmVhZHdyaXRlJykudGhlbihmdW5jdGlvbiAoaCkgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIHZhciByZXEgPSBoLnN0b3JlLnB1dChyZWMpOwogICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7IHJlc29sdmUodHJ1ZSk7IH07CiAgICAgICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJlamVjdChyZXEuZXJyb3IpOyB9OwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gaWRiQ291bnQoKSB7CiAgICByZXR1cm4gdHgoJ3JlYWRvbmx5JykudGhlbihmdW5jdGlvbiAoaCkgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIHZhciByZXEgPSBoLnN0b3JlLmNvdW50KCk7CiAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHsgcmVzb2x2ZShyZXEucmVzdWx0IHx8IDApOyB9OwogICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyByZWplY3QocmVxLmVycm9yKTsgfTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHRyaW1JZk5lZWRlZCgpIHsKICAgIHJldHVybiBpZGJDb3VudCgpLnRoZW4oZnVuY3Rpb24gKG4pIHsKICAgICAgaWYgKG4gPD0gTUFYX0VOVFJJRVMpIHJldHVybjsKICAgICAgdmFyIHRvUmVtb3ZlID0gbiAtIE1BWF9FTlRSSUVTOwogICAgICByZXR1cm4gdHgoJ3JlYWR3cml0ZScpLnRoZW4oZnVuY3Rpb24gKGgpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgICAgIHZhciBpZHg7CiAgICAgICAgICB0cnkgeyBpZHggPSBoLnN0b3JlLmluZGV4KCd0cycpOyB9IGNhdGNoIChlKSB7IHJlc29sdmUoKTsgcmV0dXJuOyB9CiAgICAgICAgICB2YXIgcmVtb3ZlZCA9IDA7CiAgICAgICAgICB2YXIgY3Vyc29yUmVxID0gaWR4Lm9wZW5DdXJzb3IoKTsKICAgICAgICAgIGN1cnNvclJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBjdXJzb3JSZXEucmVzdWx0OwogICAgICAgICAgICBpZiAoIWN1cnNvciB8fCByZW1vdmVkID49IHRvUmVtb3ZlKSB7IHJlc29sdmUoKTsgcmV0dXJuOyB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgdmFyIGtleSA9IGN1cnNvci52YWx1ZSAmJiBjdXJzb3IudmFsdWUudXJsOwogICAgICAgICAgICAgIGlmIChrZXkgJiYgb2JqZWN0VVJMc1trZXldKSB7CiAgICAgICAgICAgICAgICB0cnkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVSTHNba2V5XSk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICAgICAgICBkZWxldGUgb2JqZWN0VVJMc1trZXldOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZTIpIHt9CiAgICAgICAgICAgIGN1cnNvci5kZWxldGUoKTsKICAgICAgICAgICAgcmVtb3ZlZCsrOwogICAgICAgICAgICBjdXJzb3IuY29udGludWUoKTsKICAgICAgICAgIH07CiAgICAgICAgICBjdXJzb3JSZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHsgcmVzb2x2ZSgpOyB9OwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsKICB9CgogIGZ1bmN0aW9uIGJsb2JUb1VSTCh1cmwsIGJsb2IpIHsKICAgIGlmICghaGFzQmxvYlVSTCB8fCAhYmxvYikgcmV0dXJuIG51bGw7CiAgICBpZiAob2JqZWN0VVJMc1t1cmxdKSByZXR1cm4gb2JqZWN0VVJMc1t1cmxdOwogICAgdmFyIG91OwogICAgdHJ5IHsgb3UgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOyB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgICBvYmplY3RVUkxzW3VybF0gPSBvdTsKICAgIHJldHVybiBvdTsKICB9CgogIGZ1bmN0aW9uIGZldGNoQW5kU3RvcmUodXJsKSB7CiAgICBpZiAoIWNhbkZldGNoIHx8ICFoYXNJREIpIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7CiAgICBpZiAoaW5mbGlnaHRbdXJsXSkgcmV0dXJuIGluZmxpZ2h0W3VybF07CiAgICB2YXIgcCA9IHdpbmRvdy5mZXRjaCh1cmwsIHsgbW9kZTogJ2NvcnMnLCBjcmVkZW50aWFsczogJ29taXQnLCBjYWNoZTogJ2ZvcmNlLWNhY2hlJyB9KQogICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgaWYgKCFyZXMgfHwgIXJlcy5vaykgcmV0dXJuIG51bGw7CiAgICAgICAgcmV0dXJuIHJlcy5ibG9iKCk7CiAgICAgIH0pCiAgICAgIC50aGVuKGZ1bmN0aW9uIChibG9iKSB7CiAgICAgICAgaWYgKCFibG9iIHx8ICFibG9iLnNpemUpIHJldHVybiBudWxsOwogICAgICAgIHZhciByZWMgPSB7IHVybDogdXJsLCBibG9iOiBibG9iLCB0czogRGF0ZS5ub3coKSB9OwogICAgICAgIHJldHVybiBpZGJQdXQocmVjKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHRyaW1JZk5lZWRlZCgpOwogICAgICAgICAgcmV0dXJuIGJsb2I7CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgeyByZXR1cm4gYmxvYjsgfSk7CiAgICAgIH0pCiAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9KQogICAgICAudGhlbihmdW5jdGlvbiAoYmxvYikgewogICAgICAgIGRlbGV0ZSBpbmZsaWdodFt1cmxdOwogICAgICAgIHJldHVybiBibG9iOwogICAgICB9KTsKICAgIGluZmxpZ2h0W3VybF0gPSBwOwogICAgcmV0dXJuIHA7CiAgfQoKICBmdW5jdGlvbiBnZXRVUkwodXJsKSB7CiAgICBpZiAoIXVybCB8fCB0eXBlb2YgdXJsICE9PSAnc3RyaW5nJyB8fCB1cmwuaW5kZXhPZignYmxvYjonKSA9PT0gMCB8fCB1cmwuaW5kZXhPZignZGF0YTonKSA9PT0gMCkgewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVybCB8fCBudWxsKTsKICAgIH0KICAgIGlmIChvYmplY3RVUkxzW3VybF0pIHJldHVybiBQcm9taXNlLnJlc29sdmUob2JqZWN0VVJMc1t1cmxdKTsKICAgIGlmICghaGFzSURCIHx8ICFoYXNCbG9iVVJMKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVybCk7CiAgICByZXR1cm4gaWRiR2V0KHVybCkudGhlbihmdW5jdGlvbiAocmVjKSB7CiAgICAgIGlmIChyZWMgJiYgcmVjLmJsb2IpIHsKICAgICAgICB2YXIgb3UgPSBibG9iVG9VUkwodXJsLCByZWMuYmxvYik7CiAgICAgICAgcmV0dXJuIG91IHx8IHVybDsKICAgICAgfQogICAgICByZXR1cm4gZmV0Y2hBbmRTdG9yZSh1cmwpLnRoZW4oZnVuY3Rpb24gKGJsb2IpIHsKICAgICAgICBpZiAoYmxvYikgewogICAgICAgICAgdmFyIG91MiA9IGJsb2JUb1VSTCh1cmwsIGJsb2IpOwogICAgICAgICAgaWYgKG91MikgcmV0dXJuIG91MjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHVybDsKICAgICAgfSk7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB1cmw7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGFwcGx5KGltZywgdXJsKSB7CiAgICBpZiAoIWltZyB8fCAhdXJsKSByZXR1cm47CiAgICBpZiAodXJsLmluZGV4T2YoJ2Jsb2I6JykgPT09IDAgfHwgdXJsLmluZGV4T2YoJ2RhdGE6JykgPT09IDApIHsgaW1nLnNyYyA9IHVybDsgcmV0dXJuOyB9CiAgICBpZiAoIWhhc0lEQiB8fCAhaGFzQmxvYlVSTCkgeyBpbWcuc3JjID0gdXJsOyByZXR1cm47IH0KICAgIGlmIChvYmplY3RVUkxzW3VybF0pIHsgaW1nLnNyYyA9IG9iamVjdFVSTHNbdXJsXTsgcmV0dXJuOyB9CgogICAgdmFyIHNldHRsZWQgPSBmYWxzZTsKICAgIGZ1bmN0aW9uIGFwcGx5VVJMKHUpIHsKICAgICAgaWYgKHNldHRsZWQpIHJldHVybjsKICAgICAgc2V0dGxlZCA9IHRydWU7CiAgICAgIGltZy5zcmMgPSB1OwogICAgfQogICAgdmFyIGd1YXJkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGFwcGx5VVJMKHVybCk7IH0sIDEyMDApOwoKICAgIGdldFVSTCh1cmwpLnRoZW4oZnVuY3Rpb24gKGNhY2hlZCkgewogICAgICBjbGVhclRpbWVvdXQoZ3VhcmQpOwogICAgICBhcHBseVVSTChjYWNoZWQgfHwgdXJsKTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgY2xlYXJUaW1lb3V0KGd1YXJkKTsKICAgICAgYXBwbHlVUkwodXJsKTsKICAgIH0pOwogIH0KCiAgVi5pbWdDYWNoZSA9IHsKICAgIGF2YWlsYWJsZTogaGFzSURCICYmIGhhc0Jsb2JVUkwsCiAgICBnZXRVUkw6IGdldFVSTCwKICAgIGFwcGx5OiBhcHBseSwKICAgIHByZWZldGNoOiBmdW5jdGlvbiAodXJsKSB7IHRyeSB7IGdldFVSTCh1cmwpOyB9IGNhdGNoIChlKSB7fSB9LAogICAgY2xlYXI6IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgayBpbiBvYmplY3RVUkxzKSB7CiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3RVUkxzLCBrKSkgewogICAgICAgICAgdHJ5IHsgVVJMLnJldm9rZU9iamVjdFVSTChvYmplY3RVUkxzW2tdKTsgfSBjYXRjaCAoZSkge30KICAgICAgICB9CiAgICAgIH0KICAgICAgb2JqZWN0VVJMcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIGlmICghaGFzSURCKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICAgIHJldHVybiB0eCgncmVhZHdyaXRlJykudGhlbihmdW5jdGlvbiAoaCkgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgewogICAgICAgICAgdmFyIHJlcSA9IGguc3RvcmUuY2xlYXIoKTsKICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7IHJlc29sdmUoKTsgfTsKICAgICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyByZXNvbHZlKCk7IH07CiAgICAgICAgfSk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsKICAgIH0KICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9kYXRhL2luZHVzdHJpZXMuanMgPT09PT0gKi8KCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLmRhdGEgPSBWLmRhdGEgfHwge307CgogIFYuZGF0YS5pbmR1c3RyeVByb21wdFBsYWNlaG9sZGVyID0KICAgICdEZXNjcmliZSB0aGUgdHJhbnNmb3JtYXRpb24g4oCUIGUuZy4g4oCcc3RhZ2UgdGhpcyBlbXB0eSBsaXZpbmcgcm9vbSB3aXRoIHdhcm0gbW9kZXJuIGZ1cm5pdHVyZeKAneKApic7CgogIFYuZGF0YS5pbmR1c3RyaWVzID0gWwogICAgewogICAgICBrZXk6ICdhcmNoaXRlY3R1cmUnLAogICAgICBsYWJlbDogJ0FyY2hpdGVjdHVyZScsCiAgICAgIHBsYWNlaG9sZGVyOgogICAgICAgICdEZXNjcmliZSB0aGUgcmVuZGVyIOKAlCBlLmcuIOKAnHBob3RvcmVhbCBleHRlcmlvciBvZiB0aGlzIGNvbmNlcHQgYXQgZ29sZGVuIGhvdXIsIGNsZWFuIG1vZGVybiBtYXRlcmlhbHPigJ3igKYnCiAgICB9LAogICAgewogICAgICBrZXk6ICdpbnRlcmlvckRlc2lnbicsCiAgICAgIGxhYmVsOiAnSW50ZXJpb3IgRGVzaWduJywKICAgICAgcGxhY2Vob2xkZXI6CiAgICAgICAgJ0Rlc2NyaWJlIHRoZSByZXN0eWxlIOKAlCBlLmcuIOKAnHN0YWdlIHRoaXMgcm9vbSB3aXRoIHdhcm0gbWluaW1hbGlzdCBmdXJuaXR1cmUgYW5kIHNvZnQgZGF5bGlnaHTigJ3igKYnCiAgICB9LAogICAgewogICAgICBrZXk6ICdyZWFsRXN0YXRlJywKICAgICAgbGFiZWw6ICdSZWFsIEVzdGF0ZScsCiAgICAgIHBsYWNlaG9sZGVyOgogICAgICAgICdEZXNjcmliZSB0aGUgbGlzdGluZyBzaG90IOKAlCBlLmcuIOKAnHZpcnR1YWxseSBzdGFnZSB0aGlzIGVtcHR5IHJvb20sIE1MUy1yZWFkeSwgYnJpZ2h0IGFuZCBpbnZpdGluZ+KAneKApicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2xhbmRzY2FwaW5nJywKICAgICAgbGFiZWw6ICdMYW5kc2NhcGluZycsCiAgICAgIHBsYWNlaG9sZGVyOgogICAgICAgICdEZXNjcmliZSB0aGUgeWFyZCDigJQgZS5nLiDigJx0cmFuc2Zvcm0gdGhpcyBiYWNreWFyZCB3aXRoIGx1c2ggbGFuZHNjYXBpbmcsIGEgcGF0aW8sIGFuZCBzdHJpbmcgbGlnaHRz4oCd4oCmJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnZnVybmlzaGluZycsCiAgICAgIGxhYmVsOiAnRnVybmlzaGluZycsCiAgICAgIHBsYWNlaG9sZGVyOgogICAgICAgICdEZXNjcmliZSB0aGUgc2NlbmUg4oCUIGUuZy4g4oCccGxhY2UgdGhpcyBzb2ZhIGluIGEgc3R5bGVkLCB3ZWxsLWxpdCBsaXZpbmcgcm9vbSBmb3IgdGhlIGNhdGFsb2figJ3igKYnCiAgICB9LAogICAgewogICAgICBrZXk6ICdjb25zdHJ1Y3Rpb24nLAogICAgICBsYWJlbDogJ0NvbnN0cnVjdGlvbicsCiAgICAgIHBsYWNlaG9sZGVyOgogICAgICAgICdEZXNjcmliZSB0aGUgcmVub3ZhdGlvbiDigJQgZS5nLiDigJxzaG93IHRoaXMga2l0Y2hlbiBmdWxseSByZW1vZGVsZWQgd2l0aCBuZXcgY2FiaW5ldHMgYW5kIGNvdW50ZXJz4oCd4oCmJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnaG9tZU93bmVyJywKICAgICAgbGFiZWw6ICdIb21lIE93bmVyJywKICAgICAgcGxhY2Vob2xkZXI6CiAgICAgICAgJ0Rlc2NyaWJlIHRoZSBpZGVhIOKAlCBlLmcuIOKAnHJlcGFpbnQgdGhlc2Ugd2FsbHMgYSBzb2Z0IHNhZ2UgZ3JlZW4gYW5kIGFkZCBtb2Rlcm4gZGVjb3LigJ3igKYnCiAgICB9CiAgXTsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvZGF0YS9tb2RlbHMuanMgPT09PT0gKi8KCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLmRhdGEgPSBWLmRhdGEgfHwge307CgogIFYuZGF0YS5tb2RlbHMgPSBbCiAgICB7CiAgICAgIHJhdzogJ2ZsdXhLbGVpbicsCiAgICAgIGxhYmVsOiAnU3RhbmRhcmQnLAogICAgICBzdWJoZWFkaW5nOiAnRmFzdCAmIGJhbGFuY2VkJywKICAgICAgY29zdDogMTAsCiAgICAgIG1heFJlZjogMSwKICAgICAgZGVmYXVsdDogdHJ1ZQogICAgfSwKICAgIHsKICAgICAgcmF3OiAnZmx1eDFLb250ZXh0JywKICAgICAgbGFiZWw6ICdMZWdhY3knLAogICAgICBzdWJoZWFkaW5nOiAnVGhlIG9yaWdpbmFsIGVuZ2luZScsCiAgICAgIGNvc3Q6IDEwLAogICAgICBtYXhSZWY6IDEKICAgIH0sCiAgICB7CiAgICAgIHJhdzogJ25hbm9CYW5hbmEnLAogICAgICBsYWJlbDogJ1BybycsCiAgICAgIHN1YmhlYWRpbmc6ICdTbWFydGVyIGVkaXRzLCB1cCB0byA2IHJlZmVyZW5jZXMnLAogICAgICBjb3N0OiAxMCwKICAgICAgbWF4UmVmOiA2CiAgICB9LAogICAgewogICAgICByYXc6ICduYW5vQmFuYW5hMicsCiAgICAgIGxhYmVsOiAnUGx1cycsCiAgICAgIHN1YmhlYWRpbmc6ICdIaWdoZXIgZmlkZWxpdHksIHJpY2hlciBkZXRhaWwnLAogICAgICBjb3N0OiAxNSwKICAgICAgbWF4UmVmOiA2CiAgICB9LAogICAgewogICAgICByYXc6ICduYW5vQmFuYW5hUHJvJywKICAgICAgbGFiZWw6ICdNYXgnLAogICAgICBzdWJoZWFkaW5nOiAnQmVzdCBxdWFsaXR5LCB1cCB0byAxNSByZWZlcmVuY2VzJywKICAgICAgY29zdDogMjAsCiAgICAgIG1heFJlZjogMTUKICAgIH0KICBdOwoKICBWLmRhdGEudDJpTW9kZWwgPSB7IHJhdzogJ2ZsdXgxU2NobmVsbCcsIGNvc3Q6IDEgfTsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvZGF0YS9zd2l6emxlcy5qcyA9PT09PSAqLwoKKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwogIFYuZGF0YSA9IFYuZGF0YSB8fCB7fTsKCiAgVi5kYXRhLnN3aXp6bGVzID0gWwogICAgewogICAgICBrZXk6ICdyZW1vdmVBbGxGdXJuaXR1cmUnLAogICAgICBsYWJlbDogJ0VtcHR5IFJvb20nLAogICAgICBwcm9tcHQ6ICdSZW1vdmUgYWxsIGZ1cm5pdHVyZSwgcGVyc29uYWwgaXRlbXMsIGNsdXR0ZXIsIGFuZCBiZWxvbmdpbmdzIGZyb20gdGhlIHJvb20gd2hpbGUga2VlcGluZyB0aGUgYXJjaGl0ZWN0dXJhbCBmZWF0dXJlcywgd2FsbHMsIHdpbmRvd3MsIGFuZCBmbG9vcmluZyBleGFjdGx5IHRoZSBzYW1lLiBDcmVhdGUgYSBjb21wbGV0ZWx5IGVtcHR5LCBjbGVhbiBzcGFjZSByZWFkeSBmb3IgcHJvZmVzc2lvbmFsIHN0YWdpbmcuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAncmVtb3ZlQ2x1dHRlcicsCiAgICAgIGxhYmVsOiAnRGVjbHV0dGVyJywKICAgICAgcHJvbXB0OiAnUmVtb3ZlIGFsbCBjbHV0dGVyLCBwZXJzb25hbCBpdGVtcywgZXhjZXNzaXZlIGRlY29yYXRpb25zLCBhbmQgdW5uZWNlc3Nhcnkgb2JqZWN0cyB3aGlsZSBrZWVwaW5nIHRoZSBtYWluIGZ1cm5pdHVyZSBwaWVjZXMgaW4gdGhlaXIgY3VycmVudCBwb3NpdGlvbnMuIE1haW50YWluIHRoZSBleGlzdGluZyBmdXJuaXR1cmUgbGF5b3V0IGJ1dCBjcmVhdGUgYSBjbGVhbiwgb3JnYW5pemVkIGFwcGVhcmFuY2UuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAncmVtb3ZlRnVybml0dXJlQW5kQ2x1dHRlcicsCiAgICAgIGxhYmVsOiAnRW1wdHkgJiBDbGVhbicsCiAgICAgIHByb21wdDogJ1JlbW92ZSBhbGwgZnVybml0dXJlLCBwZXJzb25hbCBpdGVtcywgY2x1dHRlciwgZGVjb3JhdGlvbnMsIGFuZCBiZWxvbmdpbmdzIGZyb20gdGhlIHJvb20gd2hpbGUga2VlcGluZyB0aGUgYXJjaGl0ZWN0dXJhbCBmZWF0dXJlcywgd2FsbHMsIHdpbmRvd3MsIGFuZCBmbG9vcmluZyBleGFjdGx5IHRoZSBzYW1lLiBDcmVhdGUgYSBjb21wbGV0ZWx5IGVtcHR5LCBzcG90bGVzcyBzcGFjZSByZWFkeSBmb3IgbmV3IHN0YWdpbmcuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAncmVtb3ZlUGVvcGxlJywKICAgICAgbGFiZWw6ICdSZW1vdmUgUGVvcGxlJywKICAgICAgcHJvbXB0OiAnUmVtb3ZlIGFsbCBwZW9wbGUsIHBlcnNvbnMsIGFuZCBodW1hbiBmaWd1cmVzIGZyb20gdGhlIGltYWdlIHdoaWxlIGtlZXBpbmcgYWxsIGZ1cm5pdHVyZSwgZGVjb3IsIGFuZCByb29tIGVsZW1lbnRzIGV4YWN0bHkgdGhlIHNhbWUuIE1haW50YWluIHRoZSBleGFjdCBsaWdodGluZyBhbmQgY29tcG9zaXRpb24uJwogICAgfSwKICAgIHsKICAgICAga2V5OiAncmVtb3ZlUmVmbGVjdGlvbnMnLAogICAgICBsYWJlbDogJ1JlbW92ZSBSZWZsZWN0aW9ucycsCiAgICAgIHByb21wdDogJ1JlbW92ZSBhbGwgcmVmbGVjdGlvbnMsIG1pcnJvciBpbWFnZXMsIGFuZCB1bndhbnRlZCByZWZsZWN0aXZlIGVsZW1lbnRzIGZyb20gd2luZG93cywgbWlycm9ycywgYW5kIGdsb3NzeSBzdXJmYWNlcyB3aGlsZSBrZWVwaW5nIGFsbCBmdXJuaXR1cmUgYW5kIHJvb20gZWxlbWVudHMgZXhhY3RseSB0aGUgc2FtZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdpbXByb3ZlTGlnaHRpbmcnLAogICAgICBsYWJlbDogJ0JldHRlciBMaWdodCcsCiAgICAgIHByb21wdDogJ0ltcHJvdmUgdGhlIGxpZ2h0aW5nIHRvIGJlIGJyaWdodCwgd2FybSwgYW5kIHdlbGNvbWluZy4gQWRkIG5hdHVyYWwgbGlnaHQgYXBwZWFyYW5jZSwgcmVtb3ZlIGhhcnNoIHNoYWRvd3MsIGFuZCBjcmVhdGUgZXZlbiBpbGx1bWluYXRpb24gdGhyb3VnaG91dCB0aGUgc3BhY2Ugd2hpbGUga2VlcGluZyBhbGwgb2JqZWN0cyBhbmQgZnVybml0dXJlIGV4YWN0bHkgdGhlIHNhbWUuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnaW1wcm92ZVdlYXRoZXInLAogICAgICBsYWJlbDogJ0JldHRlciBXZWF0aGVyJywKICAgICAgcHJvbXB0OiAnQ2hhbmdlIHRoZSB3ZWF0aGVyIGNvbmRpdGlvbnMgdG8gYnJpZ2h0LCBzdW5ueSwgYW5kIGNsZWFyIHNraWVzLiBSZW1vdmUgcmFpbiwgY2xvdWRzLCBzbm93LCBvciBvdmVyY2FzdCBjb25kaXRpb25zIHdoaWxlIGtlZXBpbmcgYWxsIGFyY2hpdGVjdHVyZSwgbGFuZHNjYXBpbmcsIGFuZCBwcm9wZXJ0eSBlbGVtZW50cyBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2NsZWFuTGFuZHNjYXBpbmcnLAogICAgICBsYWJlbDogJ0NsZWFuIExhbmRzY2FwZScsCiAgICAgIHByb21wdDogJ0NsZWFuIHVwIG92ZXJncm93biB2ZWdldGF0aW9uLCByZW1vdmUgd2VlZHMsIHRyaW0gYnVzaGVzIGFuZCB0cmVlcywgY2xlYXIgZGVhZCBwbGFudHMsIGFuZCBvcmdhbml6ZSB0aGUgbGFuZHNjYXBpbmcgd2hpbGUga2VlcGluZyB0aGUgcHJvcGVydHkgYXJjaGl0ZWN0dXJlIGFuZCBoYXJkc2NhcGluZyBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2FkZExhbmRzY2FwaW5nJywKICAgICAgbGFiZWw6ICdBZGQgTGFuZHNjYXBpbmcnLAogICAgICBwcm9tcHQ6ICdBZGQgcHJvZmVzc2lvbmFsIGxhbmRzY2FwaW5nIGluY2x1ZGluZyB3ZWxsLW1haW50YWluZWQgZ3Jhc3MsIHRyaW1tZWQgYnVzaGVzLCBjb2xvcmZ1bCBmbG93ZXJzLCBtYXR1cmUgdHJlZXMsIGFuZCBhdHRyYWN0aXZlIGdhcmRlbiBiZWRzIHdoaWxlIGtlZXBpbmcgYWxsIGFyY2hpdGVjdHVyZSBhbmQgcHJvcGVydHkgc3RydWN0dXJlcyBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2FkZEN1cmJBcHBlYWwnLAogICAgICBsYWJlbDogJ0N1cmIgQXBwZWFsJywKICAgICAgcHJvbXB0OiAiRW5oYW5jZSB0aGUgZnJvbnQgZW50cmFuY2UgYW5kIGN1cmIgYXBwZWFsIHdpdGggYXR0cmFjdGl2ZSBsYW5kc2NhcGluZywgY2xlYW4gd2Fsa3dheXMsIHVwZGF0ZWQgZXh0ZXJpb3IgbGlnaHRpbmcsIGZyZXNoIHBhaW50IG9uIGRvb3JzLCBhbmQgd2VsY29taW5nIGVudHJ5d2F5IGVsZW1lbnRzIHdoaWxlIG1haW50YWluaW5nIHRoZSBwcm9wZXJ0eSdzIGFyY2hpdGVjdHVyYWwgc3R5bGUuIgogICAgfSwKICAgIHsKICAgICAga2V5OiAnaW1wcm92ZUV4dGVyaW9yJywKICAgICAgbGFiZWw6ICdGaXggRXh0ZXJpb3InLAogICAgICBwcm9tcHQ6ICdSZXBhaXIgYW5kIGltcHJvdmUgdGhlIGV4dGVyaW9yIGNvbmRpdGlvbiBpbmNsdWRpbmcgZnJlc2ggcGFpbnQsIGNsZWFuIHNpZGluZywgdXBkYXRlZCB0cmltLCByZXBhaXJlZCByb29maW5nLCBhbmQgd2VsbC1tYWludGFpbmVkIGV4dGVyaW9yIHN1cmZhY2VzIHdoaWxlIGtlZXBpbmcgdGhlIGFyY2hpdGVjdHVyYWwgZGVzaWduIGV4YWN0bHkgdGhlIHNhbWUuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnbW9kZXJuaXplRXh0ZXJpb3InLAogICAgICBsYWJlbDogJ01vZGVybiBFeHRlcmlvcicsCiAgICAgIHByb21wdDogIlVwZGF0ZSB0aGUgZXh0ZXJpb3Igd2l0aCBjb250ZW1wb3JhcnkgbWF0ZXJpYWxzLCBtb2Rlcm4gY29sb3Igc2NoZW1lcywgdXBkYXRlZCBsaWdodGluZyBmaXh0dXJlcywgY29udGVtcG9yYXJ5IGhhcmR3YXJlLCBhbmQgY3VycmVudCBkZXNpZ24gZWxlbWVudHMgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIHByb3BlcnR5J3Mgc3RydWN0dXJhbCBsYXlvdXQuIgogICAgfSwKICAgIHsKICAgICAga2V5OiAnYWRkT3V0ZG9vckxpdmluZycsCiAgICAgIGxhYmVsOiAnT3V0ZG9vciBMaXZpbmcnLAogICAgICBwcm9tcHQ6ICJBZGQgb3V0ZG9vciBsaXZpbmcgc3BhY2VzIGluY2x1ZGluZyBwYXRpb3MsIGRlY2tzLCBvdXRkb29yIGZ1cm5pdHVyZSwgZmlyZSBwaXRzLCBvdXRkb29yIGtpdGNoZW5zLCBvciBzZWF0aW5nIGFyZWFzIHRoYXQgc2hvd2Nhc2UgdGhlIHByb3BlcnR5J3MgcG90ZW50aWFsIGZvciBlbnRlcnRhaW5tZW50IGFuZCByZWxheGF0aW9uLiIKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2ltcHJvdmVFbnRyeXdheScsCiAgICAgIGxhYmVsOiAnQmV0dGVyIEVudHJhbmNlJywKICAgICAgcHJvbXB0OiAnRW5oYW5jZSB0aGUgZnJvbnQgZW50cmFuY2Ugd2l0aCBhbiBhdHRyYWN0aXZlIGRvb3IsIHVwZGF0ZWQgaGFyZHdhcmUsIHdlbGNvbWluZyBsaWdodGluZywgY2xlYW4gc3RlcHMsIHBvdHRlZCBwbGFudHMsIGFuZCBhbiBpbnZpdGluZyBlbnRyeXdheSB0aGF0IGNyZWF0ZXMgYW4gZXhjZWxsZW50IGZpcnN0IGltcHJlc3Npb24uJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnY2hhbmdlU2Vhc29uJywKICAgICAgbGFiZWw6ICdDaGFuZ2UgU2Vhc29uJywKICAgICAgcHJvbXB0OiAnQ2hhbmdlIHRoZSBzZWFzb25hbCBhcHBlYXJhbmNlIHRvIHNob3cgdGhlIHByb3BlcnR5IGluIGlkZWFsIGNvbmRpdGlvbnMgd2l0aCBsdXNoIGdyZWVuIGxhbmRzY2FwaW5nLCBibG9vbWluZyBmbG93ZXJzLCBhbmQgYXR0cmFjdGl2ZSBzZWFzb25hbCBlbGVtZW50cyB3aGlsZSBrZWVwaW5nIGFsbCBzdHJ1Y3R1cmVzIGV4YWN0bHkgdGhlIHNhbWUuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnaW1wcm92ZVNraWVzJywKICAgICAgbGFiZWw6ICdCZXR0ZXIgU2tpZXMnLAogICAgICBwcm9tcHQ6ICdSZXBsYWNlIHRoZSBza3kgd2l0aCBiZWF1dGlmdWwgYmx1ZSBza2llcywgcHVmZnkgd2hpdGUgY2xvdWRzLCBhbmQgaWRlYWwgbGlnaHRpbmcgY29uZGl0aW9ucyB0aGF0IG1ha2UgdGhlIHByb3BlcnR5IGxvb2sgbW9yZSBhdHRyYWN0aXZlIHdoaWxlIGtlZXBpbmcgYWxsIGdyb3VuZC1sZXZlbCBlbGVtZW50cyBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2RlcGVyc29uYWxpemUnLAogICAgICBsYWJlbDogJ0RlcGVyc29uYWxpemUnLAogICAgICBwcm9tcHQ6ICdSZW1vdmUgYWxsIHBlcnNvbmFsIHBob3RvZ3JhcGhzLCBmYW1pbHkgcGljdHVyZXMsIHBlcnNvbmFsIGNvbGxlY3RpYmxlcywgYW5kIGluZGl2aWR1YWwgaXRlbXMgd2hpbGUga2VlcGluZyBmdXJuaXR1cmUgYW5kIGdlbmVyYWwgZGVjb3IuIENyZWF0ZSBhIG5ldXRyYWwgc3BhY2UgYnV5ZXJzIGNhbiBlbnZpc2lvbiBhcyB0aGVpciBvd24uJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnbW9kZXJuaXplJywKICAgICAgbGFiZWw6ICdNb2Rlcm5pemUnLAogICAgICBwcm9tcHQ6ICJVcGRhdGUgYW5kIG1vZGVybml6ZSB0aGUgc3BhY2Ugd2l0aCBjb250ZW1wb3JhcnkgZmluaXNoZXMsIGN1cnJlbnQgY29sb3IgcGFsZXR0ZXMsIGFuZCBtb2Rlcm4gZGVzaWduIGVsZW1lbnRzIHdoaWxlIG1haW50YWluaW5nIHRoZSByb29tJ3MgYXJjaGl0ZWN0dXJhbCBzdHJ1Y3R1cmUgYW5kIGxheW91dC4iCiAgICB9LAogICAgewogICAgICBrZXk6ICdmaXhXYWxscycsCiAgICAgIGxhYmVsOiAnRml4IFdhbGxzJywKICAgICAgcHJvbXB0OiAnUmVwYWlyIGFsbCB2aXNpYmxlIHdhbGwgZGFtYWdlIGluY2x1ZGluZyBjcmFja3MsIGhvbGVzLCBzY3VmZiBtYXJrcywgYW5kIGltcGVyZmVjdGlvbnMuIE1ha2Ugd2FsbHMgbG9vayBmcmVzaGx5IHBhaW50ZWQgYW5kIHByaXN0aW5lIHdoaWxlIGtlZXBpbmcgZXZlcnl0aGluZyBlbHNlIGluIHRoZSByb29tIGV4YWN0bHkgdGhlIHNhbWUuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnbmV1dHJhbFBhaW50JywKICAgICAgbGFiZWw6ICdOZXV0cmFsIFBhaW50JywKICAgICAgcHJvbXB0OiAnQ2hhbmdlIHdhbGwgcGFpbnQgdG8gbmV1dHJhbCBjb2xvcnMgbGlrZSB3YXJtIHdoaXRlLCBsaWdodCBncmV5LCBvciBzb2Z0IGJlaWdlLiBNYWludGFpbiBhbGwgZnVybml0dXJlLCBkZWNvciwgYW5kIHJvb20gbGF5b3V0IGV4YWN0bHkgYXMgdGhleSBhcmUgd2hpbGUgb25seSB1cGRhdGluZyB0aGUgd2FsbCBjb2xvci4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdhZGRQbGFudHMnLAogICAgICBsYWJlbDogJ0FkZCBQbGFudHMnLAogICAgICBwcm9tcHQ6ICdBZGQgdGFzdGVmdWwgcGxhbnRzIGFuZCBncmVlbmVyeSBpbmNsdWRpbmcgcG90dGVkIHBsYW50cywgc21hbGwgdHJlZXMsIG9yIGZyZXNoIGZsb3dlcnMgdG8gYnJpbmcgbGlmZSBhbmQgd2FybXRoIHRvIHRoZSBzcGFjZSB3aGlsZSBrZWVwaW5nIGFsbCBleGlzdGluZyBmdXJuaXR1cmUgYW5kIGRlY29yIGV4YWN0bHkgdGhlIHNhbWUuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnYWRkUG9vbEFyZWEnLAogICAgICBsYWJlbDogJ1Bvb2wgQXJlYScsCiAgICAgIHByb21wdDogJ0FkZCBvciBlbmhhbmNlIHBvb2wgYW5kIGJhY2t5YXJkIGFyZWFzIHdpdGggcG9vbCBmdXJuaXR1cmUsIHVtYnJlbGxhcywgbG91bmdlIGNoYWlycywgb3V0ZG9vciBkaW5pbmcgc2V0cywgYW5kIGF0dHJhY3RpdmUgcG9vbHNpZGUgbGFuZHNjYXBpbmcgdG8gc2hvd2Nhc2Ugb3V0ZG9vciBlbnRlcnRhaW5tZW50IHBvdGVudGlhbC4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdtb2Rlcm5TdGFnaW5nJywKICAgICAgbGFiZWw6ICdNb2Rlcm4gU3RhZ2luZycsCiAgICAgIHByb21wdDogJ0FkZCBtb2Rlcm4gc3RhZ2luZyBmdXJuaXR1cmUgd2l0aCBjbGVhbiBsaW5lcywgbmV1dHJhbCBjb2xvcnMgbGlrZSB3aGl0ZSwgZ3JleSwgYW5kIGJlaWdlLCBtaW5pbWFsIGRlY29yLCBhbmQgY29udGVtcG9yYXJ5IHBpZWNlcy4gQ3JlYXRlIGEgc2xlZWssIHVuY2x1dHRlcmVkIHNwYWNlIHRoYXQgc2hvd2Nhc2VzIGFyY2hpdGVjdHVyYWwgZmVhdHVyZXMuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAndHJhbnNpdGlvbmFsU3RhZ2luZycsCiAgICAgIGxhYmVsOiAnVHJhbnNpdGlvbmFsJywKICAgICAgcHJvbXB0OiAnQWRkIHRyYW5zaXRpb25hbCBzdGFnaW5nIGZ1cm5pdHVyZSB0aGF0IGJsZW5kcyB0cmFkaXRpb25hbCBhbmQgY29udGVtcG9yYXJ5IGVsZW1lbnRzLiBVc2Ugd2FybSwgZWFydGh5IHRvbmVzIHdpdGggdXBob2xzdGVyZWQgZnVybml0dXJlLCBjbGVhbiBsaW5lcywgYW5kIHZpbnRhZ2UgYWNjZW50cyBsaWtlIG9ybmF0ZSBtaXJyb3JzIG9yIHdvb2RlbiBjb2ZmZWUgdGFibGVzLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ21pbmltYWxpc3RTdGFnaW5nJywKICAgICAgbGFiZWw6ICdNaW5pbWFsaXN0JywKICAgICAgcHJvbXB0OiAnQWRkIG1pbmltYWxpc3Qgc3RhZ2luZyBmdXJuaXR1cmUgZW1waGFzaXppbmcgc2ltcGxpY2l0eSBhbmQgZnVuY3Rpb25hbGl0eS4gVXNlIGNsZWFuIGxpbmVzLCBuZXV0cmFsIHRvbmVzLCBhbmQgZnVybml0dXJlIHRoYXQgc2VydmVzIG11bHRpcGxlIHB1cnBvc2VzIHdpdGhvdXQgb3ZlcndoZWxtaW5nIHRoZSBzcGFjZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICd3YXJtTWluaW1hbGlzdFN0YWdpbmcnLAogICAgICBsYWJlbDogJ1dhcm0gTWluaW1hbGlzdCcsCiAgICAgIHByb21wdDogJ0FkZCB3YXJtIG1pbmltYWxpc3Qgc3RhZ2luZyBmdXJuaXR1cmUgYmFsYW5jaW5nIHVuY2x1dHRlcmVkIHNwYWNlcyB3aXRoIHdhcm0gdG9uZXMgbGlrZSB0ZXJyYWNvdHRhLCBicm93bnMsIGFuZCBiZWlnZXMsIHBsdXMgc29mdCB0ZXh0dXJlcyBsaWtlIHBsdXNoIHRocm93cyBhbmQgcGlsbG93cyBmb3IgYSBjb3p5LCB3ZWxjb21pbmcgZmVlbC4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdtaWRDZW50dXJ5TW9kZXJuU3RhZ2luZycsCiAgICAgIGxhYmVsOiAnTWlkLUNlbnR1cnknLAogICAgICBwcm9tcHQ6ICdBZGQgbWlkLWNlbnR1cnkgbW9kZXJuIHN0YWdpbmcgZnVybml0dXJlIHdpdGggaWNvbmljIHBpZWNlcyBmcm9tIHRoZSAxOTUwcy02MHMgaW5jbHVkaW5nIHdhbG51dCB3b29kIGZpbmlzaGVzLCB0YXBlcmVkIGxlZ3MsIGdlb21ldHJpYyBwYXR0ZXJucywgdmludGFnZSBicmFzcyBmaXh0dXJlcywgYW5kIHJpY2ggamV3ZWwgdG9uZXMgbGlrZSBtdXN0YXJkIHllbGxvdyBhbmQgdGVhbC4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdhcnREZWNvU3RhZ2luZycsCiAgICAgIGxhYmVsOiAnQXJ0IERlY28nLAogICAgICBwcm9tcHQ6ICdBZGQgQXJ0IERlY28gc3RhZ2luZyBmdXJuaXR1cmUgd2l0aCBib2xkIGdlb21ldHJpYyBwYXR0ZXJucywgbWV0YWxsaWMgYWNjZW50cyBpbiBnb2xkIGFuZCBicmFzcywgcmljaCBjb2xvcnMgbGlrZSBlbWVyYWxkIGFuZCBuYXZ5LCBsdXh1cmlvdXMgbWF0ZXJpYWxzIGxpa2UgdmVsdmV0IGFuZCBtYXJibGUsIGFuZCBkcmFtYXRpYyBsaWdodGluZyBmaXh0dXJlcy4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdiaW9waGlsaWNTdGFnaW5nJywKICAgICAgbGFiZWw6ICdCaW9waGlsaWMnLAogICAgICBwcm9tcHQ6ICdBZGQgYmlvcGhpbGljIHN0YWdpbmcgZnVybml0dXJlIGVtcGhhc2l6aW5nIG5hdHVyYWwgbWF0ZXJpYWxzIGxpa2Ugd29vZCBhbmQgc3RvbmUsIGFidW5kYW50IGdyZWVuZXJ5IGFuZCBwbGFudHMsIG5hdHVyYWwgbGlnaHRpbmcsIGVhcnRoIHRvbmVzLCBhbmQgc3VzdGFpbmFibGUgbWF0ZXJpYWxzIHRoYXQgYnJpbmcgdGhlIG91dGRvb3JzIGluc2lkZSBmb3Igd2VsbG5lc3MgYW5kIGNvbm5lY3Rpb24gdG8gbmF0dXJlLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3ZpbnRhZ2VFeHRlcmlvcicsCiAgICAgIGxhYmVsOiAnVmludGFnZSBFeHRlcmlvcicsCiAgICAgIHByb21wdDogIlVwZGF0ZSB0aGUgZXh0ZXJpb3IgdG8gc2hvd2Nhc2UgcGVyaW9kLWFwcHJvcHJpYXRlIHZpbnRhZ2UgY2hhcm0gd2l0aCBoaXN0b3JpY2FsbHkgYWNjdXJhdGUgY29sb3JzLCBjbGFzc2ljIGFyY2hpdGVjdHVyYWwgZGV0YWlscywgdHJhZGl0aW9uYWwgbWF0ZXJpYWxzLCBhbmQgdGltZWxlc3MgZGVzaWduIGVsZW1lbnRzIHRoYXQgaGlnaGxpZ2h0IHRoZSBwcm9wZXJ0eSdzIGNoYXJhY3Rlci4iCiAgICB9LAogICAgewogICAgICBrZXk6ICdsdXh1cnlTdGFnaW5nJywKICAgICAgbGFiZWw6ICdMdXh1cnkgU3RhZ2luZycsCiAgICAgIHByb21wdDogIkFkZCBsdXh1cnkgc3RhZ2luZyBmdXJuaXR1cmUgd2l0aCBoaWdoLWVuZCBtYXRlcmlhbHMsIGRlc2lnbmVyIHBpZWNlcywgc29waGlzdGljYXRlZCBjb2xvciBwYWxldHRlcywgcHJlbWl1bSB0ZXh0aWxlcywgZWxlZ2FudCBsaWdodGluZywgYW5kIHVwc2NhbGUgYWNjZXNzb3JpZXMgdGhhdCBhcHBlYWwgdG8gbHV4dXJ5IGJ1eWVycyBhbmQgc2hvd2Nhc2UgdGhlIHByb3BlcnR5J3MgcHJlbWl1bSBwb3RlbnRpYWwuIgogICAgfQogIF07Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL3VpL2NvbXBvbmVudHMuanMgPT09PT0gKi8KKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwogIFYudWkgPSBWLnVpIHx8IHt9OwogIHZhciB1aSA9IFYudWk7CgogIGZ1bmN0aW9uIGVsKHRhZywgYXR0cnMsIGNoaWxkcmVuKSB7CiAgICBpZiAodHlwZW9mIHVpLmVsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgcmV0dXJuIHVpLmVsLmFwcGx5KHVpLCBhcmdzKTsKICAgIH0KICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgaWYgKGF0dHJzKSB7CiAgICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgaykpIGNvbnRpbnVlOwogICAgICAgIHZhciB2YWwgPSBhdHRyc1trXTsKICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZSkgY29udGludWU7CiAgICAgICAgaWYgKGsgPT09ICdjbGFzcycgfHwgayA9PT0gJ2NsYXNzTmFtZScpIG5vZGUuY2xhc3NOYW1lID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICd0ZXh0Jykgbm9kZS50ZXh0Q29udGVudCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAnaHRtbCcpIG5vZGUuaW5uZXJIVE1MID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICdzdHlsZScgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgIGZvciAodmFyIHMgaW4gdmFsKSBub2RlLnN0eWxlLnNldFByb3BlcnR5KHMsIHZhbFtzXSk7CiAgICAgICAgfSBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGsuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgdmFsKTsKICAgICAgICB9IGVsc2UgaWYgKGsgPT09ICdkYXRhc2V0JyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JykgewogICAgICAgICAgZm9yICh2YXIgZCBpbiB2YWwpIG5vZGUuZGF0YXNldFtkXSA9IHZhbFtkXTsKICAgICAgICB9IGVsc2UgaWYgKHZhbCA9PT0gdHJ1ZSkgbm9kZS5zZXRBdHRyaWJ1dGUoaywgJycpOwogICAgICAgIGVsc2Ugbm9kZS5zZXRBdHRyaWJ1dGUoaywgdmFsKTsKICAgICAgfQogICAgfQogICAgdmFyIGtpZHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogICAgYXBwZW5kS2lkcyhub2RlLCBraWRzKTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gYXBwZW5kS2lkcyhub2RlLCBraWRzKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtpZHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGMgPSBraWRzW2ldOwogICAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlIHx8IGMgPT09IHRydWUpIGNvbnRpbnVlOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgYXBwZW5kS2lkcyhub2RlLCBjKTsKICAgICAgZWxzZSBpZiAodHlwZW9mIGMgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjID09PSAnbnVtYmVyJykKICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjKSkpOwogICAgICBlbHNlIGlmIChjICYmIGMubm9kZVR5cGUpIG5vZGUuYXBwZW5kQ2hpbGQoYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpY29uKG5hbWUpIHsKICAgIGlmICh0eXBlb2YgdWkuaWNvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgZ290ID0gdWkuaWNvbihuYW1lKTsKICAgICAgaWYgKGdvdCAmJiBnb3Qubm9kZVR5cGUpIHJldHVybiBnb3Q7CiAgICAgIGlmICh0eXBlb2YgZ290ID09PSAnc3RyaW5nJykgewogICAgICAgIHZhciB3cmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgIHdyYXAuY2xhc3NOYW1lID0gJ3YtaWNvJzsKICAgICAgICB3cmFwLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgICAgIHdyYXAuaW5uZXJIVE1MID0gZ290OwogICAgICAgIHJldHVybiB3cmFwLmZpcnN0RWxlbWVudENoaWxkIHx8IHdyYXA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxsYmFja0ljb24obmFtZSk7CiAgfQoKICB2YXIgRkFMTEJBQ0tfSUNPTlMgPSB7CiAgICBjbG9zZTogJzxwYXRoIGQ9Ik02IDZsMTIgMTJNMTggNkw2IDE4Ii8+JywKICAgIGNoZWNrOiAnPHBhdGggZD0iTTUgMTNsNCA0TDE5IDciLz4nLAogICAgYWxlcnQ6CiAgICAgICc8cGF0aCBkPSJNMTIgOXY0bTAgNGguMDFNMTAuMyAzLjg2bC04IDE0QTIgMiAwIDAgMCA0IDIxaDE2YTIgMiAwIDAgMCAxLjctM2wtOC0xNGEyIDIgMCAwIDAtMy40IDBaIi8+JywKICAgIGluZm86ICc8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI5Ii8+PHBhdGggZD0iTTEyIDExdjVtMC04aC4wMSIvPicsCiAgICBzcGFyazogJzxwYXRoIGQ9Ik0xMiAzbDEuOCA1LjJMMTkgMTBsLTUuMiAxLjhMMTIgMTdsLTEuOC01LjJMNSAxMGw1LjItMS44TDEyIDNaIi8+JywKICAgIGltYWdlOgogICAgICAnPHJlY3QgeD0iMyIgeT0iMyIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4IiByeD0iMyIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjguNSIgcj0iMS42Ii8+PHBhdGggZD0iTTIxIDE1bC01LTVMNSAyMSIvPicsCiAgICBoZWFydDoKICAgICAgJzxwYXRoIGQ9Ik0xMiAyMHMtNy00LjYtOS4zLTkuMUMxLjQgOC4zIDIuNCA1LjMgNSA0LjRjMS45LS43IDMuOS4xIDUgMS44IDEuMS0xLjcgMy4xLTIuNSA1LTEuOCAyLjYuOSAzLjYgMy45IDIuMyA2LjVDMTkgMTUuNCAxMiAyMCAxMiAyMFoiLz4nCiAgfTsKCiAgZnVuY3Rpb24gZmFsbGJhY2tJY29uKG5hbWUpIHsKICAgIHZhciBwYXRoID0gRkFMTEJBQ0tfSUNPTlNbbmFtZV0gfHwgRkFMTEJBQ0tfSUNPTlMuaW5mbzsKICAgIHZhciBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgndmlld0JveCcsICcwIDAgMjQgMjQnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3YtaWNvJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICdjdXJyZW50Q29sb3InKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICcxLjgnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lY2FwJywgJ3JvdW5kJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWpvaW4nLCAncm91bmQnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIHN2Zy5pbm5lckhUTUwgPSBwYXRoOwogICAgcmV0dXJuIHN2ZzsKICB9CgogIGZ1bmN0aW9uIGNsYW1wKG4sIGxvLCBoaSkgewogICAgaWYgKFYudXRpbCAmJiB0eXBlb2YgVi51dGlsLmNsYW1wID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51dGlsLmNsYW1wKG4sIGxvLCBoaSk7CiAgICByZXR1cm4gTWF0aC5taW4oaGksIE1hdGgubWF4KGxvLCBuKSk7CiAgfQoKICBmdW5jdGlvbiBlc2NhcGVIdG1sKHMpIHsKICAgIGlmIChWLnV0aWwgJiYgdHlwZW9mIFYudXRpbC5lc2NhcGVIdG1sID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51dGlsLmVzY2FwZUh0bWwocyk7CiAgICB2YXIgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgZC50ZXh0Q29udGVudCA9IHMgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHMpOwogICAgcmV0dXJuIGQuaW5uZXJIVE1MOwogIH0KCiAgZnVuY3Rpb24gcHJlZmVyc1JlZHVjZWRNb3Rpb24oKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJykubWF0Y2hlczsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZW5zdXJlSG9zdChpZCwgY2xhc3NOYW1lKSB7CiAgICB2YXIgaG9zdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgIGlmICghaG9zdCkgewogICAgICBob3N0ID0gZWwoJ2RpdicsIHsgaWQ6IGlkLCBjbGFzczogY2xhc3NOYW1lIH0pOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhvc3QpOwogICAgfQogICAgcmV0dXJuIGhvc3Q7CiAgfQoKICB2YXIgVE9BU1RfSE9TVF9JRCA9ICd2LXRvYXN0LWhvc3QnOwogIHZhciBUT0FTVF9MSUZFVElNRVMgPSB7IGVycm9yOiA1MjAwLCBzdWNjZXNzOiAzMjAwLCBpbmZvOiAzMDAwLCB3YXJuaW5nOiA0MjAwIH07CgogIGZ1bmN0aW9uIHRvYXN0SG9zdCgpIHsKICAgIHJldHVybiBlbnN1cmVIb3N0KFRPQVNUX0hPU1RfSUQsICd2LXRvYXN0LWhvc3QnKTsKICB9CgogIHVpLnRvYXN0ID0gZnVuY3Rpb24gdG9hc3QobXNnLCBraW5kKSB7CiAgICBraW5kID0ga2luZCB8fCAnaW5mbyc7CiAgICBpZiAoIW1zZykgcmV0dXJuIHsgZGlzbWlzczogZnVuY3Rpb24gKCkge30gfTsKICAgIHZhciBob3N0ID0gdG9hc3RIb3N0KCk7CgogICAgdmFyIGljb25OYW1lID0KICAgICAga2luZCA9PT0gJ3N1Y2Nlc3MnCiAgICAgICAgPyAnY2hlY2snCiAgICAgICAgOiBraW5kID09PSAnZXJyb3InCiAgICAgICAgPyAnYWxlcnQnCiAgICAgICAgOiBraW5kID09PSAnd2FybmluZycKICAgICAgICA/ICdhbGVydCcKICAgICAgICA6ICdpbmZvJzsKCiAgICB2YXIgbm9kZSA9IGVsKAogICAgICAnZGl2JywKICAgICAgewogICAgICAgIGNsYXNzOiAndi10b2FzdCB2LXRvYXN0LS0nICsga2luZCArICcgbGlxdWlkLWdsYXNzLXRoaW4nLAogICAgICAgIHJvbGU6IGtpbmQgPT09ICdlcnJvcicgPyAnYWxlcnQnIDogJ3N0YXR1cycsCiAgICAgICAgJ2FyaWEtbGl2ZSc6IGtpbmQgPT09ICdlcnJvcicgPyAnYXNzZXJ0aXZlJyA6ICdwb2xpdGUnCiAgICAgIH0sCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtdG9hc3RfX2ljb24nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSwgaWNvbihpY29uTmFtZSkpLAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXRvYXN0X19tc2cnIH0sIFN0cmluZyhtc2cpKSwKICAgICAgZWwoCiAgICAgICAgJ2J1dHRvbicsCiAgICAgICAgewogICAgICAgICAgY2xhc3M6ICd2LXRvYXN0X19jbG9zZScsCiAgICAgICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgICAgICdhcmlhLWxhYmVsJzogJ0Rpc21pc3MnLAogICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZW1vdmUoKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGljb24oJ2Nsb3NlJykKICAgICAgKQogICAgKTsKCiAgICBob3N0LmFwcGVuZENoaWxkKG5vZGUpOwogICAgbm9kZS5vZmZzZXRIZWlnaHQ7CiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3YtdG9hc3QtLWluJyk7CgogICAgdmFyIGxpZmV0aW1lID0gVE9BU1RfTElGRVRJTUVTW2tpbmRdIHx8IDMwMDA7CiAgICB2YXIgdGltZXIgPSBudWxsOwogICAgdmFyIHJlbW92ZWQgPSBmYWxzZTsKCiAgICBmdW5jdGlvbiByZW1vdmUoKSB7CiAgICAgIGlmIChyZW1vdmVkKSByZXR1cm47CiAgICAgIHJlbW92ZWQgPSB0cnVlOwogICAgICBpZiAodGltZXIpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICAgIHRpbWVyID0gbnVsbDsKICAgICAgfQogICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoJ3YtdG9hc3QtLWluJyk7CiAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgndi10b2FzdC0tb3V0Jyk7CiAgICAgIHZhciBkb25lID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChub2RlLnBhcmVudE5vZGUpIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgfTsKICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZG9uZSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICBzZXRUaW1lb3V0KGRvbmUsIDYwMCk7CiAgICB9CgogICAgZnVuY3Rpb24gYXJtKCkgewogICAgICBpZiAodGltZXIpIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICAgIHRpbWVyID0gc2V0VGltZW91dChyZW1vdmUsIGxpZmV0aW1lKTsKICAgIH0KICAgIGFybSgpOwoKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHRpbWVyKSBjbGVhclRpbWVvdXQodGltZXIpOwogICAgfSk7CiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBhcm0pOwogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgZnVuY3Rpb24gKCkgewogICAgICBpZiAodGltZXIpIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICB9KTsKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBhcm0pOwoKICAgIHJldHVybiB7IGRpc21pc3M6IHJlbW92ZSwgbm9kZTogbm9kZSB9OwogIH07CgogIChmdW5jdGlvbiBzdWJzY3JpYmVUb2FzdEJ1cygpIHsKICAgIGZ1bmN0aW9uIGJpbmQoKSB7CiAgICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLm9uID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgVi5zdG9yZS5vbigndG9hc3QnLCBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICAgICAgaWYgKCFwYXlsb2FkKSByZXR1cm47CiAgICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHVpLnRvYXN0KHBheWxvYWQsICdpbmZvJyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1aS50b2FzdChwYXlsb2FkLm1zZyB8fCBwYXlsb2FkLm1lc3NhZ2UgfHwgJycsIHBheWxvYWQua2luZCB8fCBwYXlsb2FkLnR5cGUgfHwgJ2luZm8nKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBWLnN0b3JlLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChwYXlsb2FkKSB7CiAgICAgICAgICB2YXIgbSA9CiAgICAgICAgICAgIHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJwogICAgICAgICAgICAgID8gcGF5bG9hZAogICAgICAgICAgICAgIDogKHBheWxvYWQgJiYgKHBheWxvYWQubWVzc2FnZSB8fCBwYXlsb2FkLm1zZykpIHx8ICdTb21ldGhpbmcgd2VudCB3cm9uZy4nOwogICAgICAgICAgdWkudG9hc3QobSwgJ2Vycm9yJyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKCFiaW5kKCkpIHsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGJpbmQpOwogICAgICBzZXRUaW1lb3V0KGJpbmQsIDApOwogICAgfQogIH0pKCk7CgogIHZhciBPVkVSTEFZX0hPU1RfSUQgPSAndi1vdmVybGF5LWhvc3QnOwogIHZhciBvcGVuT3ZlcmxheXMgPSBbXTsKCiAgdmFyIEZPQ1VTQUJMRV9TRUwgPQogICAgJ2FbaHJlZl0sIGFyZWFbaHJlZl0sIGJ1dHRvbjpub3QoW2Rpc2FibGVkXSksIGlucHV0Om5vdChbZGlzYWJsZWRdKTpub3QoW3R5cGU9ImhpZGRlbiJdKSwgJyArCiAgICAnc2VsZWN0Om5vdChbZGlzYWJsZWRdKSwgdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLCBpZnJhbWUsIFt0YWJpbmRleF06bm90KFt0YWJpbmRleD0iLTEiXSksICcgKwogICAgJ1tjb250ZW50ZWRpdGFibGU9InRydWUiXSc7CgogIGZ1bmN0aW9uIG92ZXJsYXlIb3N0KCkgewogICAgcmV0dXJuIGVuc3VyZUhvc3QoT1ZFUkxBWV9IT1NUX0lELCAndi1vdmVybGF5LWhvc3QnKTsKICB9CgogIGZ1bmN0aW9uIGZvY3VzYWJsZShjb250YWluZXIpIHsKICAgIHZhciBsaXN0ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoRk9DVVNBQkxFX1NFTCkpOwogICAgcmV0dXJuIGxpc3QuZmlsdGVyKGZ1bmN0aW9uIChuKSB7CiAgICAgIHJldHVybiAoCiAgICAgICAgbi5vZmZzZXRXaWR0aCA+IDAgfHwKICAgICAgICBuLm9mZnNldEhlaWdodCA+IDAgfHwKICAgICAgICBuID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IHx8CiAgICAgICAgbi5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCA+IDAKICAgICAgKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gbWFrZU92ZXJsYXkobm9kZSwgb3B0cywgdmFyaWFudCkgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgaG9zdCA9IG92ZXJsYXlIb3N0KCk7CiAgICB2YXIgbGFzdEZvY3VzZWQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwogICAgdmFyIGNsb3NlZCA9IGZhbHNlOwoKICAgIHZhciBwYW5lbENsYXNzID0KICAgICAgdmFyaWFudCA9PT0gJ3NoZWV0JyA/ICd2LXNoZWV0IGxpcXVpZC1nbGFzcycgOiAndi1tb2RhbCBsaXF1aWQtZ2xhc3MnOwogICAgaWYgKG9wdHMuY2xhc3NOYW1lKSBwYW5lbENsYXNzICs9ICcgJyArIG9wdHMuY2xhc3NOYW1lOwoKICAgIHZhciBwYW5lbCA9IGVsKCdkaXYnLCB7CiAgICAgIGNsYXNzOiBwYW5lbENsYXNzLAogICAgICByb2xlOiAnZGlhbG9nJywKICAgICAgJ2FyaWEtbW9kYWwnOiAndHJ1ZScsCiAgICAgIHRhYmluZGV4OiAnLTEnCiAgICB9KTsKICAgIGlmIChvcHRzLmFyaWFMYWJlbCkgcGFuZWwuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgb3B0cy5hcmlhTGFiZWwpOwoKICAgIGlmICh2YXJpYW50ID09PSAnc2hlZXQnKSB7CiAgICAgIHBhbmVsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zaGVldF9fZ3JhYicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KSk7CiAgICB9CiAgICBpZiAob3B0cy5kaXNtaXNzQnV0dG9uICE9PSBmYWxzZSkgewogICAgICBwYW5lbC5hcHBlbmRDaGlsZCgKICAgICAgICBlbCgKICAgICAgICAgICdidXR0b24nLAogICAgICAgICAgewogICAgICAgICAgICBjbGFzczogJ3YtbW9kYWxfX2Nsb3NlJywKICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgICAgICdhcmlhLWxhYmVsJzogJ0Nsb3NlJywKICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIGNsb3NlKCdidXR0b24nKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGljb24oJ2Nsb3NlJykKICAgICAgICApCiAgICAgICk7CiAgICB9CgogICAgdmFyIGJvZHkgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtbW9kYWxfX2JvZHknIH0pOwogICAgaWYgKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSkgYm9keS5hcHBlbmRDaGlsZChub2RlKTsKICAgIGVsc2UgaWYgKHR5cGVvZiBub2RlID09PSAnc3RyaW5nJykgYm9keS5pbm5lckhUTUwgPSBub2RlOwogICAgcGFuZWwuYXBwZW5kQ2hpbGQoYm9keSk7CgogICAgdmFyIGJhY2tkcm9wID0gZWwoCiAgICAgICdkaXYnLAogICAgICB7CiAgICAgICAgY2xhc3M6IHZhcmlhbnQgPT09ICdzaGVldCcgPyAndi1vdmVybGF5IHYtb3ZlcmxheS0tc2hlZXQnIDogJ3Ytb3ZlcmxheScsCiAgICAgICAgb25Qb2ludGVyZG93bjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIGlmIChlLnRhcmdldCA9PT0gYmFja2Ryb3AgJiYgb3B0cy5kaXNtaXNzT25CYWNrZHJvcCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgY2xvc2UoJ2JhY2tkcm9wJyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBwYW5lbAogICAgKTsKCiAgICBmdW5jdGlvbiBvbktleWRvd24oZSkgewogICAgICBpZiAob3Blbk92ZXJsYXlzW29wZW5PdmVybGF5cy5sZW5ndGggLSAxXSAhPT0gYXBpKSByZXR1cm47CiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgb3B0cy5kaXNtaXNzT25Fc2MgIT09IGZhbHNlKSB7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICBjbG9zZSgnZXNjYXBlJyk7CiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdUYWInKSB7CiAgICAgICAgdmFyIGl0ZW1zID0gZm9jdXNhYmxlKHBhbmVsKTsKICAgICAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgcGFuZWwuZm9jdXMoKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGZpcnN0ID0gaXRlbXNbMF07CiAgICAgICAgdmFyIGxhc3QgPSBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXTsKICAgICAgICB2YXIgYWN0aXZlID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKICAgICAgICBpZiAoZS5zaGlmdEtleSAmJiAoYWN0aXZlID09PSBmaXJzdCB8fCBhY3RpdmUgPT09IHBhbmVsKSkgewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgbGFzdC5mb2N1cygpOwogICAgICAgIH0gZWxzZSBpZiAoIWUuc2hpZnRLZXkgJiYgYWN0aXZlID09PSBsYXN0KSB7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBmaXJzdC5mb2N1cygpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNsb3NlKHJlYXNvbikgewogICAgICBpZiAoY2xvc2VkKSByZXR1cm47CiAgICAgIGNsb3NlZCA9IHRydWU7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleWRvd24sIHRydWUpOwogICAgICB2YXIgaWR4ID0gb3Blbk92ZXJsYXlzLmluZGV4T2YoYXBpKTsKICAgICAgaWYgKGlkeCAhPT0gLTEpIG9wZW5PdmVybGF5cy5zcGxpY2UoaWR4LCAxKTsKCiAgICAgIGJhY2tkcm9wLmNsYXNzTGlzdC5yZW1vdmUoJ3Ytb3ZlcmxheS0taW4nKTsKICAgICAgYmFja2Ryb3AuY2xhc3NMaXN0LmFkZCgndi1vdmVybGF5LS1vdXQnKTsKICAgICAgdmFyIGZpbmlzaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoYmFja2Ryb3AucGFyZW50Tm9kZSkgYmFja2Ryb3AucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiYWNrZHJvcCk7CiAgICAgICAgaWYgKCFvcGVuT3ZlcmxheXMubGVuZ3RoKSBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3Ytc2Nyb2xsLWxvY2snKTsKICAgICAgICBpZiAobGFzdEZvY3VzZWQgJiYgdHlwZW9mIGxhc3RGb2N1c2VkLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBsYXN0Rm9jdXNlZC5mb2N1cygpOwogICAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgICB9CiAgICAgIH07CiAgICAgIGJhY2tkcm9wLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBmaW5pc2gsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgc2V0VGltZW91dChmaW5pc2gsIDYwMCk7CgogICAgICBpZiAodHlwZW9mIG9wdHMub25DbG9zZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHRyeSB7CiAgICAgICAgICBvcHRzLm9uQ2xvc2UocmVhc29uKTsKICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICB9CiAgICB9CgogICAgdmFyIGFwaSA9IHsgY2xvc2U6IGNsb3NlLCBub2RlOiBwYW5lbCwgYm9keTogYm9keSwgYmFja2Ryb3A6IGJhY2tkcm9wIH07CgogICAgaG9zdC5hcHBlbmRDaGlsZChiYWNrZHJvcCk7CiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3Ytc2Nyb2xsLWxvY2snKTsKICAgIG9wZW5PdmVybGF5cy5wdXNoKGFwaSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlkb3duLCB0cnVlKTsKCiAgICBiYWNrZHJvcC5vZmZzZXRIZWlnaHQ7CiAgICBiYWNrZHJvcC5jbGFzc0xpc3QuYWRkKCd2LW92ZXJsYXktLWluJyk7CgogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGNsb3NlZCkgcmV0dXJuOwogICAgICB2YXIgYXV0byA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJ1thdXRvZm9jdXNdJyk7CiAgICAgIHZhciBpdGVtcyA9IGF1dG8gPyBbYXV0b10gOiBmb2N1c2FibGUocGFuZWwpOwogICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGl0ZW1zWzBdLmZvY3VzKCk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgcGFuZWwuZm9jdXMoKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGFuZWwuZm9jdXMoKTsKICAgICAgfQogICAgfSk7CgogICAgcmV0dXJuIGFwaTsKICB9CgogIHVpLm1vZGFsID0gZnVuY3Rpb24gbW9kYWwobm9kZSwgb3B0cykgewogICAgcmV0dXJuIG1ha2VPdmVybGF5KG5vZGUsIG9wdHMsICdtb2RhbCcpOwogIH07CgogIHVpLnNoZWV0ID0gZnVuY3Rpb24gc2hlZXQobm9kZSwgb3B0cykgewogICAgcmV0dXJuIG1ha2VPdmVybGF5KG5vZGUsIG9wdHMsICdzaGVldCcpOwogIH07CgogIHVpLmNvbmZpcm0gPSBmdW5jdGlvbiBjb25maXJtKG1zZywgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgdmFyIHNldHRsZWQgPSBmYWxzZTsKICAgICAgZnVuY3Rpb24gc2V0dGxlKHZhbCkgewogICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47CiAgICAgICAgc2V0dGxlZCA9IHRydWU7CiAgICAgICAgcmVmLmNsb3NlKCdjb25maXJtJyk7CiAgICAgICAgcmVzb2x2ZSh2YWwpOwogICAgICB9CgogICAgICB2YXIgY29udGVudCA9IGVsKAogICAgICAgICdkaXYnLAogICAgICAgIHsgY2xhc3M6ICd2LWNvbmZpcm0nIH0sCiAgICAgICAgb3B0cy50aXRsZSA/IGVsKCdoMycsIHsgY2xhc3M6ICd2LWNvbmZpcm1fX3RpdGxlJyB9LCBTdHJpbmcob3B0cy50aXRsZSkpIDogbnVsbCwKICAgICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LWNvbmZpcm1fX21zZycgfSwgU3RyaW5nKG1zZyB8fCAnQXJlIHlvdSBzdXJlPycpKSwKICAgICAgICBlbCgKICAgICAgICAgICdkaXYnLAogICAgICAgICAgeyBjbGFzczogJ3YtY29uZmlybV9fYWN0aW9ucycgfSwKICAgICAgICAgIGVsKAogICAgICAgICAgICAnYnV0dG9uJywKICAgICAgICAgICAgewogICAgICAgICAgICAgIGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0JywKICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBzZXR0bGUoZmFsc2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgb3B0cy5jYW5jZWxMYWJlbCB8fCAnQ2FuY2VsJwogICAgICAgICAgKSwKICAgICAgICAgIGVsKAogICAgICAgICAgICAnYnV0dG9uJywKICAgICAgICAgICAgewogICAgICAgICAgICAgIGNsYXNzOiAndi1jdGEgJyArIChvcHRzLmRlc3RydWN0aXZlID8gJ3YtY3RhLS1kYW5nZXInIDogJ3YtY3RhLS1wcmltYXJ5JyksCiAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgICAgICAgYXV0b2ZvY3VzOiAnJywKICAgICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBzZXR0bGUodHJ1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBvcHRzLmNvbmZpcm1MYWJlbCB8fCAob3B0cy5kZXN0cnVjdGl2ZSA/ICdEZWxldGUnIDogJ0NvbmZpcm0nKQogICAgICAgICAgKQogICAgICAgICkKICAgICAgKTsKCiAgICAgIHZhciByZWYgPSBtYWtlT3ZlcmxheSgKICAgICAgICBjb250ZW50LAogICAgICAgIHsKICAgICAgICAgIGNsYXNzTmFtZTogJ3YtbW9kYWwtLWNvbmZpcm0nLAogICAgICAgICAgYXJpYUxhYmVsOiBvcHRzLnRpdGxlIHx8ICdDb25maXJtJywKICAgICAgICAgIGRpc21pc3NCdXR0b246IGZhbHNlLAogICAgICAgICAgb25DbG9zZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBzZXR0bGUoZmFsc2UpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgJ21vZGFsJwogICAgICApOwogICAgfSk7CiAgfTsKCiAgdWkuc3Bpbm5lciA9IGZ1bmN0aW9uIHNwaW5uZXIoc2l6ZSkgewogICAgdmFyIG5vZGUgPSBlbCgnc3BhbicsIHsKICAgICAgY2xhc3M6ICd2LXNwaW5uZXInLAogICAgICByb2xlOiAnc3RhdHVzJywKICAgICAgJ2FyaWEtbGFiZWwnOiAnTG9hZGluZycKICAgIH0pOwogICAgaWYgKHNpemUpIG5vZGUuc3R5bGUuc2V0UHJvcGVydHkoJy0tdi1zcGlubmVyLXNpemUnLCBzaXplICsgJ3B4Jyk7CiAgICBub2RlLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3Bpbm5lcl9fcmluZycsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KSk7CiAgICByZXR1cm4gbm9kZTsKICB9OwoKICBmdW5jdGlvbiBza2VsQmxvY2soZXh0cmFDbGFzcykgewogICAgcmV0dXJuIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbicgKyAoZXh0cmFDbGFzcyA/ICcgJyArIGV4dHJhQ2xhc3MgOiAnJykgfSk7CiAgfQoKICB1aS5za2VsZXRvbiA9IGZ1bmN0aW9uIHNrZWxldG9uKGtpbmQsIGNvdW50KSB7CiAgICBraW5kID0ga2luZCB8fCAnY2FyZCc7CiAgICBjb3VudCA9IGNvdW50IHx8IChraW5kID09PSAnZ3JpZCcgPyA2IDoga2luZCA9PT0gJ2xpbmUnID8gMyA6IDEpOwoKICAgIGlmIChraW5kID09PSAnbGluZScgfHwga2luZCA9PT0gJ3RleHQnKSB7CiAgICAgIHZhciBsaW5lcyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbi1saW5lcycsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgdmFyIHcgPSBpID09PSBjb3VudCAtIDEgPyAnNjIlJyA6IGkgJSAyID8gJzg4JScgOiAnMTAwJSc7CiAgICAgICAgdmFyIGxuID0gc2tlbEJsb2NrKCd2LXNrZWxldG9uLS1saW5lJyk7CiAgICAgICAgbG4uc3R5bGUud2lkdGggPSB3OwogICAgICAgIGxpbmVzLmFwcGVuZENoaWxkKGxuKTsKICAgICAgfQogICAgICByZXR1cm4gbGluZXM7CiAgICB9CgogICAgaWYgKGtpbmQgPT09ICdpbWFnZScpIHsKICAgICAgcmV0dXJuIHNrZWxCbG9jaygndi1za2VsZXRvbi0taW1hZ2UnKTsKICAgIH0KCiAgICBpZiAoa2luZCA9PT0gJ3BpbGwnKSB7CiAgICAgIHJldHVybiBza2VsQmxvY2soJ3Ytc2tlbGV0b24tLXBpbGwnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBza2VsQ2FyZCgpIHsKICAgICAgcmV0dXJuIGVsKAogICAgICAgICdkaXYnLAogICAgICAgIHsgY2xhc3M6ICd2LXNrZWxldG9uLWNhcmQnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSwKICAgICAgICBza2VsQmxvY2soJ3Ytc2tlbGV0b24tLW1lZGlhJyksCiAgICAgICAgZWwoCiAgICAgICAgICAnZGl2JywKICAgICAgICAgIHsgY2xhc3M6ICd2LXNrZWxldG9uLWNhcmRfX21ldGEnIH0sCiAgICAgICAgICBza2VsQmxvY2soJ3Ytc2tlbGV0b24tLWxpbmUnKSwKICAgICAgICAgIHNrZWxCbG9jaygndi1za2VsZXRvbi0tbGluZSB2LXNrZWxldG9uLS1zaG9ydCcpCiAgICAgICAgKQogICAgICApOwogICAgfQoKICAgIGlmIChraW5kID09PSAnY2FyZCcpIHsKICAgICAgcmV0dXJuIHNrZWxDYXJkKCk7CiAgICB9CgogICAgdmFyIGdyaWQgPSBlbCgnZGl2JywgewogICAgICBjbGFzczogJ3Ytc2tlbGV0b24tZ3JpZCB2LWdyaWQgdi1ncmlkLS0zJywKICAgICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLAogICAgICAnYXJpYS1idXN5JzogJ3RydWUnCiAgICB9KTsKICAgIGZvciAodmFyIGcgPSAwOyBnIDwgY291bnQ7IGcrKykgZ3JpZC5hcHBlbmRDaGlsZChza2VsQ2FyZCgpKTsKICAgIHJldHVybiBncmlkOwogIH07CgogIHVpLmVtcHR5ID0gZnVuY3Rpb24gZW1wdHkobXNnLCBhY3Rpb25MYWJlbCwgb25BY3Rpb24pIHsKICAgIHZhciBpY29uTmFtZSA9ICdpbWFnZSc7CiAgICB2YXIgdGl0bGUgPSAnTm90aGluZyBoZXJlIHlldCc7CiAgICB2YXIgc3ViID0gbXNnIHx8ICcnOwogICAgaWYgKG1zZyAmJiB0eXBlb2YgbXNnID09PSAnb2JqZWN0JykgewogICAgICB0aXRsZSA9IG1zZy50aXRsZSB8fCB0aXRsZTsKICAgICAgc3ViID0gbXNnLm1lc3NhZ2UgfHwgbXNnLm1zZyB8fCAnJzsKICAgICAgaWNvbk5hbWUgPSBtc2cuaWNvbiB8fCBpY29uTmFtZTsKICAgICAgYWN0aW9uTGFiZWwgPSBtc2cuYWN0aW9uTGFiZWwgfHwgYWN0aW9uTGFiZWw7CiAgICAgIG9uQWN0aW9uID0gbXNnLm9uQWN0aW9uIHx8IG9uQWN0aW9uOwogICAgfSBlbHNlIHsKICAgICAgdGl0bGUgPSBtc2cgfHwgdGl0bGU7CiAgICAgIHN1YiA9ICcnOwogICAgfQoKICAgIHZhciBub2RlID0gZWwoCiAgICAgICdkaXYnLAogICAgICB7IGNsYXNzOiAndi1lbXB0eScsIHJvbGU6ICdub3RlJyB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHlfX2ljb24nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSwgaWNvbihpY29uTmFtZSkpLAogICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScgfSwgdGl0bGUpLAogICAgICBzdWIgPyBlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19zdWInIH0sIHN1YikgOiBudWxsCiAgICApOwoKICAgIGlmIChhY3Rpb25MYWJlbCAmJiB0eXBlb2Ygb25BY3Rpb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgbm9kZS5hcHBlbmRDaGlsZCgKICAgICAgICBlbCgKICAgICAgICAgICdidXR0b24nLAogICAgICAgICAgewogICAgICAgICAgICBjbGFzczogJ3YtY3RhIHYtY3RhLS1wcmltYXJ5IHYtZW1wdHlfX2FjdGlvbicsCiAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgIG9uQWN0aW9uKGUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgYWN0aW9uTGFiZWwKICAgICAgICApCiAgICAgICk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9OwoKICB1aS5jcmVkaXRzUGlsbCA9IGZ1bmN0aW9uIGNyZWRpdHNQaWxsKG4pIHsKICAgIHZhciB2YWwgPSBuID09IG51bGwgPyAwIDogTnVtYmVyKG4pOwogICAgdmFyIGRpc3BsYXkgPSBpc0Zpbml0ZSh2YWwpID8gZm9ybWF0Q3JlZGl0cyh2YWwpIDogU3RyaW5nKG4pOwogICAgcmV0dXJuIGVsKAogICAgICAnc3BhbicsCiAgICAgIHsKICAgICAgICBjbGFzczogJ3YtY3JlZGl0cyB2LWNyZWRpdHMtcGlsbCcsCiAgICAgICAgdGl0bGU6IGRpc3BsYXkgKyAnIGNyZWRpdHMnLAogICAgICAgICdhcmlhLWxhYmVsJzogZGlzcGxheSArICcgY3JlZGl0cycKICAgICAgfSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVkaXRzX19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oJ3NwYXJrJykpLAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHNfX251bScgfSwgZGlzcGxheSkKICAgICk7CiAgfTsKCiAgZnVuY3Rpb24gZm9ybWF0Q3JlZGl0cyhuKSB7CiAgICBpZiAobiA+PSAxMDAwMDAwKSByZXR1cm4gKG4gLyAxMDAwMDAwKS50b0ZpeGVkKG4gJSAxMDAwMDAwID8gMSA6IDApICsgJ00nOwogICAgaWYgKG4gPj0gMTAwMDApIHJldHVybiBNYXRoLnJvdW5kKG4gLyAxMDAwKSArICdrJzsKICAgIHJldHVybiBTdHJpbmcoTWF0aC5yb3VuZChuKSk7CiAgfQoKICB1aS5pbWdDYXJkID0gZnVuY3Rpb24gaW1nQ2FyZChpbWFnZSwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICBpbWFnZSA9IGltYWdlIHx8IHt9OwoKICAgIHZhciBhZnRlciA9CiAgICAgIGltYWdlLnJlbW90ZUltYWdlVVJMIHx8CiAgICAgIGltYWdlLnJlbW90ZUltYWdlVXJsIHx8CiAgICAgIGltYWdlLmltYWdlVVJMIHx8CiAgICAgIGltYWdlLnVybCB8fAogICAgICAnJzsKICAgIHZhciBiZWZvcmUgPQogICAgICBpbWFnZS5yZW1vdGVPcmlnaW5hbEltYWdlVVJMIHx8CiAgICAgIGltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVcmwgfHwKICAgICAgaW1hZ2Uub3JpZ2luYWxJbWFnZVVSTCB8fAogICAgICAnJzsKICAgIHZhciB3YW50U2NydWIgPSBvcHRzLmJlZm9yZUFmdGVyICE9PSBmYWxzZSAmJiAhIWJlZm9yZSAmJiBiZWZvcmUgIT09IGFmdGVyOwoKICAgIHZhciBjYXJkID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6ICd2LWNhcmQgdi1pbWdjYXJkJywKICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICdhcmlhLWxhYmVsJzogaW1hZ2UucHJvbXB0ID8gJ09wZW46ICcgKyB0cnVuY2F0ZShpbWFnZS5wcm9tcHQsIDgwKSA6ICdPcGVuIGltYWdlJwogICAgfSk7CgogICAgdmFyIG1lZGlhID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWltZ2NhcmRfX21lZGlhJyB9KTsKCiAgICBpZiAod2FudFNjcnViKSB7CiAgICAgIGNhcmQuY2xhc3NMaXN0LmFkZCgndi1pbWdjYXJkLS1zY3J1YicpOwogICAgICB2YXIgc2NydWJOb2RlID0gdWkuc2NydWIoYmVmb3JlLCBhZnRlciwgeyBpbnRlcmFjdGl2ZTogb3B0cy5zY3J1YkludGVyYWN0aXZlICE9PSBmYWxzZSB9KTsKICAgICAgbWVkaWEuYXBwZW5kQ2hpbGQoc2NydWJOb2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIG1lZGlhLmNsYXNzTGlzdC5hZGQoJ3YtaW1nY2FyZF9fbWVkaWEtLXBsYWluJyk7CiAgICAgIHZhciBwaCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbiB2LWltZ2NhcmRfX3BoJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0pOwogICAgICBtZWRpYS5hcHBlbmRDaGlsZChwaCk7CgogICAgICB2YXIgaW1nID0gZWwoJ2ltZycsIHsKICAgICAgICBjbGFzczogJ3YtaW1nY2FyZF9faW1nJywKICAgICAgICBsb2FkaW5nOiAnbGF6eScsCiAgICAgICAgZGVjb2Rpbmc6ICdhc3luYycsCiAgICAgICAgYWx0OiBpbWFnZS5wcm9tcHQgPyB0cnVuY2F0ZShpbWFnZS5wcm9tcHQsIDEyMCkgOiAnR2VuZXJhdGVkIGltYWdlJwogICAgICB9KTsKICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQoJ2lzLWxvYWRlZCcpOwogICAgICAgIGlmIChwaC5wYXJlbnROb2RlKSBwaC5jbGFzc0xpc3QuYWRkKCdpcy1nb25lJyk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBpZiAocGgucGFyZW50Tm9kZSkgcGgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwaCk7CiAgICAgICAgfSwgMzYwKTsKICAgICAgfSk7CiAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICBtZWRpYS5jbGFzc0xpc3QuYWRkKCd2LWltZ2NhcmRfX21lZGlhLS1lcnInKTsKICAgICAgICBwaC5jbGFzc0xpc3QuYWRkKCdpcy1lcnJvcicpOwogICAgICAgIHBoLmlubmVySFRNTCA9ICcnOwogICAgICAgIHBoLmFwcGVuZENoaWxkKGljb24oJ2ltYWdlJykpOwogICAgICB9KTsKICAgICAgc2V0SW1hZ2VTcmMoaW1nLCBhZnRlcik7CiAgICAgIG1lZGlhLmFwcGVuZENoaWxkKGltZyk7CiAgICB9CgogICAgY2FyZC5hcHBlbmRDaGlsZChtZWRpYSk7CgogICAgaWYgKGltYWdlLmZhdm9yaXRlZCkgewogICAgICBjYXJkLmFwcGVuZENoaWxkKAogICAgICAgIGVsKAogICAgICAgICAgJ3NwYW4nLAogICAgICAgICAgeyBjbGFzczogJ3YtaW1nY2FyZF9fZmF2JywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCB0aXRsZTogJ0Zhdm9yaXRlZCcgfSwKICAgICAgICAgIGljb24oJ2hlYXJ0JykKICAgICAgICApCiAgICAgICk7CiAgICB9CgogICAgaWYgKGltYWdlLnByb21wdCAmJiBvcHRzLmNhcHRpb24gIT09IGZhbHNlICYmICFpbWFnZS5oaWRlUHJvbXB0KSB7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQoCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1pbWdjYXJkX19jYXB0aW9uJywgdGl0bGU6IFN0cmluZyhpbWFnZS5wcm9tcHQpIH0sIFN0cmluZyhpbWFnZS5wcm9tcHQpKQogICAgICApOwogICAgfQoKICAgIGlmICh0eXBlb2Ygb3B0cy5vblRhcCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICBpZiAoY2FyZC5kYXRhc2V0LnNjcnViYmVkID09PSAnMScpIHsKICAgICAgICAgIGNhcmQuZGF0YXNldC5zY3J1YmJlZCA9ICcwJzsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgb3B0cy5vblRhcChpbWFnZSwgZSk7CiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiBjYXJkOwogIH07CgogIGZ1bmN0aW9uIHRydW5jYXRlKHMsIG4pIHsKICAgIHMgPSBTdHJpbmcocyB8fCAnJyk7CiAgICByZXR1cm4gcy5sZW5ndGggPiBuID8gcy5zbGljZSgwLCBuIC0gMSkudHJpbUVuZCgpICsgJ+KApicgOiBzOwogIH0KCiAgZnVuY3Rpb24gc2V0SW1hZ2VTcmMoaW1nLCB1cmwpIHsKICAgIGlmICghaW1nKSByZXR1cm47CiAgICBpZiAoIXVybCkgeyBpbWcucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTsgcmV0dXJuOyB9CiAgICBpZiAoVi5pbWdDYWNoZSAmJiBWLmltZ0NhY2hlLmF2YWlsYWJsZSAmJiB0eXBlb2YgVi5pbWdDYWNoZS5hcHBseSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBWLmltZ0NhY2hlLmFwcGx5KGltZywgdXJsKTsKICAgIH0gZWxzZSB7CiAgICAgIGltZy5zcmMgPSB1cmw7CiAgICB9CiAgfQoKICB1aS5zY3J1YiA9IGZ1bmN0aW9uIHNjcnViKGJlZm9yZVVSTCwgYWZ0ZXJVUkwsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGludGVyYWN0aXZlID0gb3B0cy5pbnRlcmFjdGl2ZSAhPT0gZmFsc2U7CgogICAgdmFyIGFmdGVySW1nID0gZWwoJ2ltZycsIHsKICAgICAgY2xhc3M6ICd2YWZ0ZXInLAogICAgICBhbHQ6IG9wdHMuYWZ0ZXJBbHQgfHwgJ0FmdGVyJywKICAgICAgZHJhZ2dhYmxlOiAnZmFsc2UnLAogICAgICBkZWNvZGluZzogJ2FzeW5jJywKICAgICAgbG9hZGluZzogb3B0cy5lYWdlciA/ICdlYWdlcicgOiAnbGF6eScKICAgIH0pOwogICAgc2V0SW1hZ2VTcmMoYWZ0ZXJJbWcsIGFmdGVyVVJMIHx8IGJlZm9yZVVSTCB8fCAnJyk7CiAgICB2YXIgYmVmb3JlSW1nID0gZWwoJ2ltZycsIHsKICAgICAgY2xhc3M6ICd2YmVmb3JlJywKICAgICAgYWx0OiBvcHRzLmJlZm9yZUFsdCB8fCAnQmVmb3JlJywKICAgICAgZHJhZ2dhYmxlOiAnZmFsc2UnLAogICAgICBkZWNvZGluZzogJ2FzeW5jJywKICAgICAgbG9hZGluZzogb3B0cy5lYWdlciA/ICdlYWdlcicgOiAnbGF6eScKICAgIH0pOwogICAgc2V0SW1hZ2VTcmMoYmVmb3JlSW1nLCBiZWZvcmVVUkwgfHwgYWZ0ZXJVUkwgfHwgJycpOwogICAgdmFyIGRpdmlkZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3ZzY3J1YicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKCiAgICB2YXIgY2FyZCA9IGVsKAogICAgICAnZGl2JywKICAgICAgewogICAgICAgIGNsYXNzOiAndmNhcmQnLAogICAgICAgIHJvbGU6IGludGVyYWN0aXZlID8gJ3NsaWRlcicgOiAnaW1nJywKICAgICAgICB0YWJpbmRleDogaW50ZXJhY3RpdmUgPyAnMCcgOiBudWxsLAogICAgICAgICdhcmlhLWxhYmVsJzogaW50ZXJhY3RpdmUKICAgICAgICAgID8gJ0JlZm9yZSBhbmQgYWZ0ZXIgY29tcGFyaXNvbi4gVXNlIGFycm93IGtleXMgdG8gY29tcGFyZS4nCiAgICAgICAgICA6ICdCZWZvcmUgYW5kIGFmdGVyIGNvbXBhcmlzb24nLAogICAgICAgICdhcmlhLXZhbHVlbWluJzogaW50ZXJhY3RpdmUgPyAnMCcgOiBudWxsLAogICAgICAgICdhcmlhLXZhbHVlbWF4JzogaW50ZXJhY3RpdmUgPyAnMTAwJyA6IG51bGwsCiAgICAgICAgJ2FyaWEtdmFsdWVub3cnOiBpbnRlcmFjdGl2ZSA/ICc1MCcgOiBudWxsCiAgICAgIH0sCiAgICAgIGFmdGVySW1nLAogICAgICBiZWZvcmVJbWcsCiAgICAgIGRpdmlkZXIKICAgICk7CgogICAgZnVuY3Rpb24gb25TY3J1YkJyb2tlbigpIHsKICAgICAgaWYgKGNhcmQuY2xhc3NMaXN0LmNvbnRhaW5zKCd2Y2FyZC0tbm9pbWcnKSkgcmV0dXJuOwogICAgICBjYXJkLmNsYXNzTGlzdC5hZGQoJ3ZjYXJkLS1ub2ltZycpOwogICAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndmNhcmRfX25vaW1nJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oJ2ltYWdlJykpKTsKICAgIH0KICAgIGFmdGVySW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25TY3J1YkJyb2tlbik7CiAgICBpZiAoIWFmdGVyVVJMICYmICFiZWZvcmVVUkwpIG9uU2NydWJCcm9rZW4oKTsKCiAgICB2YXIgZmVlZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndmZlZWQgdmZlZWQtLXNpbmdsZScgfSwgY2FyZCk7CgogICAgdmFyIHJldmVhbCA9IDAuNTsKICAgIGZ1bmN0aW9uIGFwcGx5UmV2ZWFsKHIpIHsKICAgICAgcmV2ZWFsID0gY2xhbXAociwgMCwgMSk7CiAgICAgIHZhciBwY3QgPSAocmV2ZWFsICogMTAwKS50b0ZpeGVkKDIpOwogICAgICBiZWZvcmVJbWcuc3R5bGUuY2xpcFBhdGggPSAnaW5zZXQoMCAnICsgKDEwMCAtIHBjdCkgKyAnJSAwIDApJzsKICAgICAgYmVmb3JlSW1nLnN0eWxlLndlYmtpdENsaXBQYXRoID0gJ2luc2V0KDAgJyArICgxMDAgLSBwY3QpICsgJyUgMCAwKSc7CiAgICAgIGRpdmlkZXIuc3R5bGUubGVmdCA9IHBjdCArICclJzsKICAgICAgaWYgKGludGVyYWN0aXZlKSBjYXJkLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIFN0cmluZyhNYXRoLnJvdW5kKHJldmVhbCAqIDEwMCkpKTsKICAgIH0KICAgIGFwcGx5UmV2ZWFsKHJldmVhbCk7CgogICAgdmFyIHJhZklkID0gbnVsbDsKICAgIHZhciBhbmltQWN0aXZlID0gZmFsc2U7CiAgICB2YXIgYW5pbUZyb20gPSAwLjI7CiAgICB2YXIgYW5pbVRvID0gMC44OwogICAgdmFyIGFuaW1TdGFydCA9IDA7CiAgICB2YXIgYW5pbUR1ciA9IDI2MDA7CiAgICB2YXIgYW5pbURpciA9IDE7CiAgICB2YXIgcmVzdW1lVGltZXIgPSBudWxsOwogICAgdmFyIGRlc3Ryb3llZCA9IGZhbHNlOwogICAgdmFyIHJlZHVjZU1vdGlvbiA9IHByZWZlcnNSZWR1Y2VkTW90aW9uKCk7CgogICAgZnVuY3Rpb24gZWFzZUluT3V0KHQpIHsKICAgICAgcmV0dXJuIHQgPCAwLjUgPyAyICogdCAqIHQgOiAxIC0gTWF0aC5wb3coLTIgKiB0ICsgMiwgMikgLyAyOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0ZXAodHMpIHsKICAgICAgaWYgKCFhbmltQWN0aXZlIHx8IGRlc3Ryb3llZCkgcmV0dXJuOwogICAgICBpZiAoIWFuaW1TdGFydCkgYW5pbVN0YXJ0ID0gdHM7CiAgICAgIHZhciBlbGFwc2VkID0gdHMgLSBhbmltU3RhcnQ7CiAgICAgIHZhciB0ID0gY2xhbXAoZWxhcHNlZCAvIGFuaW1EdXIsIDAsIDEpOwogICAgICB2YXIgZWFzZWQgPSBlYXNlSW5PdXQodCk7CiAgICAgIHZhciBmcm9tID0gYW5pbURpciA9PT0gMSA/IGFuaW1Gcm9tIDogYW5pbVRvOwogICAgICB2YXIgdG8gPSBhbmltRGlyID09PSAxID8gYW5pbVRvIDogYW5pbUZyb207CiAgICAgIGFwcGx5UmV2ZWFsKGZyb20gKyAodG8gLSBmcm9tKSAqIGVhc2VkKTsKICAgICAgaWYgKHQgPj0gMSkgewogICAgICAgIGFuaW1EaXIgKj0gLTE7CiAgICAgICAgYW5pbVN0YXJ0ID0gdHM7CiAgICAgIH0KICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RhcnRBbmltKCkgewogICAgICBpZiAoIWludGVyYWN0aXZlKSByZXR1cm47CiAgICAgIGlmIChyZWR1Y2VNb3Rpb24pIHJldHVybjsKICAgICAgaWYgKGFuaW1BY3RpdmUgfHwgZGVzdHJveWVkKSByZXR1cm47CiAgICAgIGlmICghaXNPbnNjcmVlbigpKSByZXR1cm47CiAgICAgIGFuaW1BY3RpdmUgPSB0cnVlOwogICAgICBhbmltU3RhcnQgPSAwOwogICAgICBhbmltRGlyID0gMTsKICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RvcEFuaW0oKSB7CiAgICAgIGFuaW1BY3RpdmUgPSBmYWxzZTsKICAgICAgaWYgKHJhZklkKSB7CiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpOwogICAgICAgIHJhZklkID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmVzdW1lKGRlbGF5KSB7CiAgICAgIGlmIChyZXN1bWVUaW1lcikgY2xlYXJUaW1lb3V0KHJlc3VtZVRpbWVyKTsKICAgICAgcmVzdW1lVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICByZXN1bWVUaW1lciA9IG51bGw7CiAgICAgICAgYW5pbUZyb20gPSAwLjI7CiAgICAgICAgYW5pbVRvID0gMC44OwogICAgICAgIHN0YXJ0QW5pbSgpOwogICAgICB9LCBkZWxheSA9PSBudWxsID8gMTgwMCA6IGRlbGF5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc09uc2NyZWVuKCkgewogICAgICB2YXIgciA9IGZlZWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHJldHVybiByLmJvdHRvbSA+IDAgJiYgci50b3AgPCAod2luZG93LmlubmVySGVpZ2h0IHx8IDApICYmIHIud2lkdGggPiAwOwogICAgfQoKICAgIHZhciBkcmFnZ2luZyA9IGZhbHNlOwogICAgdmFyIHBvaW50ZXJJZCA9IG51bGw7CiAgICB2YXIgbW92ZWREdXJpbmdEcmFnID0gZmFsc2U7CgogICAgZnVuY3Rpb24gcmV2ZWFsRnJvbUNsaWVudFgoY2xpZW50WCkgewogICAgICB2YXIgcmVjdCA9IGNhcmQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGlmICghcmVjdC53aWR0aCkgcmV0dXJuIHJldmVhbDsKICAgICAgcmV0dXJuIChjbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGg7CiAgICB9CgogICAgZnVuY3Rpb24gb25Eb3duKGUpIHsKICAgICAgaWYgKCFpbnRlcmFjdGl2ZSkgcmV0dXJuOwogICAgICBpZiAoZS5idXR0b24gIT0gbnVsbCAmJiBlLmJ1dHRvbiAhPT0gMCAmJiBlLnBvaW50ZXJUeXBlID09PSAnbW91c2UnKSByZXR1cm47CiAgICAgIGRyYWdnaW5nID0gdHJ1ZTsKICAgICAgbW92ZWREdXJpbmdEcmFnID0gZmFsc2U7CiAgICAgIHBvaW50ZXJJZCA9IGUucG9pbnRlcklkICE9IG51bGwgPyBlLnBvaW50ZXJJZCA6IG51bGw7CiAgICAgIGlmIChwb2ludGVySWQgIT0gbnVsbCAmJiBjYXJkLnNldFBvaW50ZXJDYXB0dXJlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNhcmQuc2V0UG9pbnRlckNhcHR1cmUocG9pbnRlcklkKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHt9CiAgICAgIH0KICAgICAgc3RvcEFuaW0oKTsKICAgICAgaWYgKHJlc3VtZVRpbWVyKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHJlc3VtZVRpbWVyKTsKICAgICAgICByZXN1bWVUaW1lciA9IG51bGw7CiAgICAgIH0KICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCdzY3J1YmJpbmcnKTsKICAgICAgYXBwbHlSZXZlYWwocmV2ZWFsRnJvbUNsaWVudFgoZ2V0Q2xpZW50WChlKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIG9uTW92ZShlKSB7CiAgICAgIGlmICghZHJhZ2dpbmcpIHJldHVybjsKICAgICAgbW92ZWREdXJpbmdEcmFnID0gdHJ1ZTsKICAgICAgYXBwbHlSZXZlYWwocmV2ZWFsRnJvbUNsaWVudFgoZ2V0Q2xpZW50WChlKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIG9uVXAoZSkgewogICAgICBpZiAoIWRyYWdnaW5nKSByZXR1cm47CiAgICAgIGRyYWdnaW5nID0gZmFsc2U7CiAgICAgIGlmIChwb2ludGVySWQgIT0gbnVsbCAmJiBjYXJkLnJlbGVhc2VQb2ludGVyQ2FwdHVyZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjYXJkLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShwb2ludGVySWQpOwogICAgICAgIH0gY2F0Y2ggKGVycikge30KICAgICAgfQogICAgICBwb2ludGVySWQgPSBudWxsOwogICAgICBjYXJkLmNsYXNzTGlzdC5yZW1vdmUoJ3NjcnViYmluZycpOwogICAgICBpZiAobW92ZWREdXJpbmdEcmFnKSB7CiAgICAgICAgdmFyIGhvc3QgPSBjYXJkLmNsb3Nlc3QgJiYgY2FyZC5jbG9zZXN0KCcudi1pbWdjYXJkJyk7CiAgICAgICAgaWYgKGhvc3QpIGhvc3QuZGF0YXNldC5zY3J1YmJlZCA9ICcxJzsKICAgICAgfQogICAgICBzY2hlZHVsZVJlc3VtZSgxODAwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRDbGllbnRYKGUpIHsKICAgICAgaWYgKGUuY2xpZW50WCAhPSBudWxsKSByZXR1cm4gZS5jbGllbnRYOwogICAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlc1swXSkgcmV0dXJuIGUudG91Y2hlc1swXS5jbGllbnRYOwogICAgICBpZiAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKSByZXR1cm4gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBmdW5jdGlvbiBvbktleShlKSB7CiAgICAgIGlmICghaW50ZXJhY3RpdmUpIHJldHVybjsKICAgICAgdmFyIGRlbHRhID0gMDsKICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dMZWZ0JykgZGVsdGEgPSAtMC4wNTsKICAgICAgZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1JpZ2h0JykgZGVsdGEgPSAwLjA1OwogICAgICBlbHNlIGlmIChlLmtleSA9PT0gJ0hvbWUnKSB7CiAgICAgICAgYXBwbHlSZXZlYWwoMCk7CiAgICAgICAgYWZ0ZXJGb2N1c0FkanVzdCgpOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdFbmQnKSB7CiAgICAgICAgYXBwbHlSZXZlYWwoMSk7CiAgICAgICAgYWZ0ZXJGb2N1c0FkanVzdCgpOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSByZXR1cm47CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3RvcEFuaW0oKTsKICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCdzY3J1YmJpbmcnKTsKICAgICAgYXBwbHlSZXZlYWwocmV2ZWFsICsgZGVsdGEpOwogICAgICBhZnRlckZvY3VzQWRqdXN0KCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWZ0ZXJGb2N1c0FkanVzdCgpIHsKICAgICAgaWYgKHJlc3VtZVRpbWVyKSBjbGVhclRpbWVvdXQocmVzdW1lVGltZXIpOwogICAgICByZXN1bWVUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGNhcmQuY2xhc3NMaXN0LnJlbW92ZSgnc2NydWJiaW5nJyk7CiAgICAgICAgYW5pbUZyb20gPSAwLjI7CiAgICAgICAgYW5pbVRvID0gMC44OwogICAgICAgIHN0YXJ0QW5pbSgpOwogICAgICB9LCAyMjAwKTsKICAgIH0KCiAgICBpZiAoaW50ZXJhY3RpdmUpIHsKICAgICAgaWYgKHdpbmRvdy5Qb2ludGVyRXZlbnQpIHsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgb25Eb3duKTsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgb25Nb3ZlKTsKICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgb25VcCk7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBvblVwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uRG93bik7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW92ZSk7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblVwKTsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvbkRvd24sIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uTW92ZSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVXApOwogICAgICB9CiAgICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5KTsKICAgICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghZHJhZ2dpbmcpIHN0b3BBbmltKCk7CiAgICAgIH0pOwogICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFkcmFnZ2luZyAmJiAhcmVzdW1lVGltZXIpIHNjaGVkdWxlUmVzdW1lKDQwMCk7CiAgICAgIH0pOwogICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZnVuY3Rpb24gKCkgewogICAgICAgIHN0b3BBbmltKCk7CiAgICAgIH0pOwogICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgY2FyZC5jbGFzc0xpc3QucmVtb3ZlKCdzY3J1YmJpbmcnKTsKICAgICAgICBzY2hlZHVsZVJlc3VtZSg0MDApOwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgaW8gPSBudWxsOwogICAgZnVuY3Rpb24gc2V0dXBWaXNpYmlsaXR5KCkgewogICAgICBpZiAoIWludGVyYWN0aXZlIHx8IHJlZHVjZU1vdGlvbikgcmV0dXJuOwogICAgICBpZiAoJ0ludGVyc2VjdGlvbk9ic2VydmVyJyBpbiB3aW5kb3cpIHsKICAgICAgICBpbyA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigKICAgICAgICAgIGZ1bmN0aW9uIChlbnRyaWVzKSB7CiAgICAgICAgICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW4pIHsKICAgICAgICAgICAgICBpZiAoZW4uaXNJbnRlcnNlY3RpbmcpIHsKICAgICAgICAgICAgICAgIGlmICghZHJhZ2dpbmcgJiYgIXJlc3VtZVRpbWVyKSBzdGFydEFuaW0oKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3RvcEFuaW0oKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIHsgdGhyZXNob2xkOiAwLjI1IH0KICAgICAgICApOwogICAgICAgIGlvLm9ic2VydmUoZmVlZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RhcnRBbmltKCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbml0KCkgewogICAgICBhcHBseVJldmVhbCgwLjUpOwogICAgICBzZXR1cFZpc2liaWxpdHkoKTsKICAgICAgaWYgKCFpbykgewogICAgICAgIHN0YXJ0QW5pbSgpOwogICAgICB9CiAgICB9CiAgICBpZiAoYWZ0ZXJJbWcuY29tcGxldGUpIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGluaXQpOwogICAgfSBlbHNlIHsKICAgICAgYWZ0ZXJJbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaW5pdCk7CiAgICAgIH0pOwogICAgICBhZnRlckltZy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaW5pdCk7CiAgICAgIH0pOwogICAgfQoKICAgIGZlZWQuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3koKSB7CiAgICAgIGRlc3Ryb3llZCA9IHRydWU7CiAgICAgIHN0b3BBbmltKCk7CiAgICAgIGlmIChyZXN1bWVUaW1lcikgY2xlYXJUaW1lb3V0KHJlc3VtZVRpbWVyKTsKICAgICAgaWYgKGlvKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlvLmRpc2Nvbm5lY3QoKTsKICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgIGlvID0gbnVsbDsKICAgICAgfQogICAgICBpZiAoIXdpbmRvdy5Qb2ludGVyRXZlbnQpIHsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlKTsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uVXApOwogICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVXApOwogICAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBvblVwKTsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIG9uVXApOwogICAgICB9CiAgICB9OwogICAgZmVlZC5zZXRSZXZlYWwgPSBhcHBseVJldmVhbDsKCiAgICByZXR1cm4gZmVlZDsKICB9OwoKICB2YXIgQ09ORkVUVElfRkxBRyA9ICd2YW1wX3dlYl9jb25mZXR0aVNob3duJzsKICBmdW5jdGlvbiBjb25mZXR0aUFscmVhZHlTaG93bigpIHsKICAgIHRyeSB7IHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oQ09ORkVUVElfRkxBRykgPT09ICcxJzsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0KICB9CiAgZnVuY3Rpb24gbWFya0NvbmZldHRpU2hvd24oKSB7CiAgICB0cnkgeyB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oQ09ORkVUVElfRkxBRywgJzEnKTsgfSBjYXRjaCAoZSkge30KICB9CgogIHVpLmNvbmZldHRpID0gZnVuY3Rpb24gY29uZmV0dGkob3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICBpZiAocHJlZmVyc1JlZHVjZWRNb3Rpb24oKSkgcmV0dXJuOwogICAgaWYgKGNvbmZldHRpQWxyZWFkeVNob3duKCkpIHJldHVybjsKICAgIG1hcmtDb25mZXR0aVNob3duKCk7CgogICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2LWNvbmZldHRpLWNhbnZhcycpOwogICAgaWYgKCFjYW52YXMpIHsKICAgICAgY2FudmFzID0gZWwoJ2NhbnZhcycsIHsgaWQ6ICd2LWNvbmZldHRpLWNhbnZhcycsIGNsYXNzOiAndi1jb25mZXR0aScsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjYW52YXMpOwogICAgfQogICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpOwogICAgdmFyIGRwciA9IE1hdGgubWluKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEsIDIpOwoKICAgIGZ1bmN0aW9uIHJlc2l6ZSgpIHsKICAgICAgY2FudmFzLndpZHRoID0gTWF0aC5mbG9vcih3aW5kb3cuaW5uZXJXaWR0aCAqIGRwcik7CiAgICAgIGNhbnZhcy5oZWlnaHQgPSBNYXRoLmZsb29yKHdpbmRvdy5pbm5lckhlaWdodCAqIGRwcik7CiAgICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoICsgJ3B4JzsKICAgICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCArICdweCc7CiAgICB9CiAgICByZXNpemUoKTsKCiAgICB2YXIgVyA9IHdpbmRvdy5pbm5lcldpZHRoOwogICAgdmFyIEggPSB3aW5kb3cuaW5uZXJIZWlnaHQ7CgogICAgdmFyIHBhbGV0dGUgPSBvcHRzLmNvbG9ycyB8fCBbCiAgICAgICcjNTI5N0Y4JywKICAgICAgJyM4MkQ2RkYnLAogICAgICAnIzBBODRGRicsCiAgICAgICcjZmZmZmZmJywKICAgICAgJyNDOUU3RkYnLAogICAgICAnIzAwQjI4QicKICAgIF07CgogICAgdmFyIGNvdW50ID0gb3B0cy5jb3VudCB8fCAoVyA8IDY0MCA/IDkwIDogMTUwKTsKICAgIHZhciBvcmlnaW5YID0gb3B0cy54ICE9IG51bGwgPyBvcHRzLnggOiBXIC8gMjsKICAgIHZhciBvcmlnaW5ZID0gb3B0cy55ICE9IG51bGwgPyBvcHRzLnkgOiBIICogMC4zNDsKICAgIHZhciBzcHJlYWQgPSBvcHRzLnNwcmVhZCB8fCBNYXRoLlBJOwogICAgdmFyIHBvd2VyID0gb3B0cy5wb3dlciB8fCAxMzsKICAgIHZhciBncmF2aXR5ID0gMC4zMjsKICAgIHZhciBkcmFnID0gMC4wMDg1OwoKICAgIHZhciBwaWVjZXMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICB2YXIgYW5nbGUgPSAtTWF0aC5QSSAvIDIgKyAoTWF0aC5yYW5kb20oKSAtIDAuNSkgKiBzcHJlYWQ7CiAgICAgIHZhciB2ZWxvY2l0eSA9IHBvd2VyICogKDAuNTUgKyBNYXRoLnJhbmRvbSgpICogMC42NSk7CiAgICAgIHBpZWNlcy5wdXNoKHsKICAgICAgICB4OiBvcmlnaW5YLAogICAgICAgIHk6IG9yaWdpblksCiAgICAgICAgdng6IE1hdGguY29zKGFuZ2xlKSAqIHZlbG9jaXR5ICsgKE1hdGgucmFuZG9tKCkgLSAwLjUpICogMiwKICAgICAgICB2eTogTWF0aC5zaW4oYW5nbGUpICogdmVsb2NpdHksCiAgICAgICAgdzogNiArIE1hdGgucmFuZG9tKCkgKiA2LAogICAgICAgIGg6IDggKyBNYXRoLnJhbmRvbSgpICogOCwKICAgICAgICByb3Q6IE1hdGgucmFuZG9tKCkgKiBNYXRoLlBJICogMiwKICAgICAgICB2cjogKE1hdGgucmFuZG9tKCkgLSAwLjUpICogMC40LAogICAgICAgIGNvbG9yOiBwYWxldHRlWyhNYXRoLnJhbmRvbSgpICogcGFsZXR0ZS5sZW5ndGgpIHwgMF0sCiAgICAgICAgc2hhcGU6IE1hdGgucmFuZG9tKCkgPCAwLjMyID8gJ2NpcmNsZScgOiAncmVjdCcsCiAgICAgICAgd29iYmxlOiBNYXRoLnJhbmRvbSgpICogTWF0aC5QSSAqIDIsCiAgICAgICAgd29iYmxlU3BlZWQ6IDAuMDYgKyBNYXRoLnJhbmRvbSgpICogMC4wNiwKICAgICAgICBsaWZlOiAwLAogICAgICAgIHR0bDogMTUwICsgTWF0aC5yYW5kb20oKSAqIDcwCiAgICAgIH0pOwogICAgfQoKICAgIHZhciBydW5uaW5nID0gdHJ1ZTsKICAgIHZhciBzdGFydFRzID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICB2YXIgbWF4TXMgPSBvcHRzLmR1cmF0aW9uIHx8IDMyMDA7CgogICAgZnVuY3Rpb24gZnJhbWUodHMpIHsKICAgICAgaWYgKCFydW5uaW5nKSByZXR1cm47CiAgICAgIHZhciBhbGl2ZUFueSA9IGZhbHNlOwogICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7CiAgICAgIGN0eC5zYXZlKCk7CiAgICAgIGN0eC5zY2FsZShkcHIsIGRwcik7CgogICAgICBmb3IgKHZhciBwID0gMDsgcCA8IHBpZWNlcy5sZW5ndGg7IHArKykgewogICAgICAgIHZhciBwYyA9IHBpZWNlc1twXTsKICAgICAgICBpZiAocGMubGlmZSA+IHBjLnR0bCkgY29udGludWU7CiAgICAgICAgYWxpdmVBbnkgPSB0cnVlOwogICAgICAgIHBjLmxpZmUrKzsKICAgICAgICBwYy52eSArPSBncmF2aXR5OwogICAgICAgIHBjLnZ4ICo9IDEgLSBkcmFnOwogICAgICAgIHBjLnZ5ICo9IDEgLSBkcmFnOwogICAgICAgIHBjLndvYmJsZSArPSBwYy53b2JibGVTcGVlZDsKICAgICAgICBwYy54ICs9IHBjLnZ4ICsgTWF0aC5zaW4ocGMud29iYmxlKSAqIDAuODsKICAgICAgICBwYy55ICs9IHBjLnZ5OwogICAgICAgIHBjLnJvdCArPSBwYy52cjsKCiAgICAgICAgdmFyIGFscGhhID0gcGMubGlmZSA+IHBjLnR0bCAtIDM2ID8gTWF0aC5tYXgoMCwgKHBjLnR0bCAtIHBjLmxpZmUpIC8gMzYpIDogMTsKICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSBhbHBoYTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gcGMuY29sb3I7CiAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICBjdHgudHJhbnNsYXRlKHBjLngsIHBjLnkpOwogICAgICAgIGN0eC5yb3RhdGUocGMucm90KTsKICAgICAgICBpZiAocGMuc2hhcGUgPT09ICdjaXJjbGUnKSB7CiAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICBjdHguYXJjKDAsIDAsIHBjLncgLyAyLCAwLCBNYXRoLlBJICogMik7CiAgICAgICAgICBjdHguZmlsbCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgc3cgPSBwYy53ICogKDAuNSArIE1hdGguYWJzKE1hdGguY29zKHBjLndvYmJsZSkpICogMC42KTsKICAgICAgICAgIGN0eC5maWxsUmVjdCgtc3cgLyAyLCAtcGMuaCAvIDIsIHN3LCBwYy5oKTsKICAgICAgICB9CiAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgfQogICAgICBjdHgucmVzdG9yZSgpOwoKICAgICAgdmFyIGVsYXBzZWQgPSB0cyAtIHN0YXJ0VHM7CiAgICAgIGlmIChhbGl2ZUFueSAmJiBlbGFwc2VkIDwgbWF4TXMpIHsKICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnJhbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJ1bm5pbmcgPSBmYWxzZTsKICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7CiAgICAgICAgaWYgKGNhbnZhcy5wYXJlbnROb2RlKSBjYW52YXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjYW52YXMpOwogICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblJlc2l6ZSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBvblJlc2l6ZSgpIHsKICAgICAgcmVzaXplKCk7CiAgICB9CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgb25SZXNpemUpOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZyYW1lKTsKICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy91aS9kb20uanMgPT09PT0gKi8KCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICB2YXIgdWkgPSAoVi51aSA9IFYudWkgfHwge30pOwoKICB2YXIgU1ZHX05TID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJzsKCiAgZnVuY3Rpb24gZWwodGFnLCBhdHRycykgewogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CgogICAgaWYgKGF0dHJzICYmIHR5cGVvZiBhdHRycyA9PT0gJ29iamVjdCcgJiYgIWlzTm9kZShhdHRycykgJiYgIUFycmF5LmlzQXJyYXkoYXR0cnMpKSB7CiAgICAgIGFwcGx5QXR0cnMobm9kZSwgYXR0cnMpOwogICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgewoKICAgICAgYXBwZW5kQ2hpbGQobm9kZSwgYXR0cnMpOwogICAgfQoKICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGFwcGVuZENoaWxkKG5vZGUsIGFyZ3VtZW50c1tpXSk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIGFwcGx5QXR0cnMobm9kZSwgYXR0cnMpIHsKICAgIHZhciByZWZGbiA9IG51bGw7CiAgICBmb3IgKHZhciBrZXkgaW4gYXR0cnMpIHsKICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cnMsIGtleSkpIGNvbnRpbnVlOwogICAgICB2YXIgdmFsID0gYXR0cnNba2V5XTsKICAgICAgaWYgKHZhbCA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgIGlmIChrZXkgPT09ICdjbGFzcycgfHwga2V5ID09PSAnY2xhc3NOYW1lJykgewogICAgICAgIG5vZGUuY2xhc3NOYW1lID0gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJykgOiBTdHJpbmcodmFsKTsKICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdzdHlsZScpIHsKICAgICAgICBhcHBseVN0eWxlKG5vZGUsIHZhbCk7CiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnZGF0YXNldCcgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHsKICAgICAgICBmb3IgKHZhciBkayBpbiB2YWwpIHsKICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsLCBkaykgJiYgdmFsW2RrXSAhPSBudWxsKSB7CiAgICAgICAgICAgIG5vZGUuZGF0YXNldFtka10gPSBTdHJpbmcodmFsW2RrXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGtleS5pbmRleE9mKCdkYXRhLScpID09PSAwKSB7CiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcodmFsKSk7CiAgICAgIH0gZWxzZSBpZiAoa2V5LmluZGV4T2YoJ2FyaWEtJykgPT09IDApIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWwpKTsKICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdodG1sJyB8fCBrZXkgPT09ICdpbm5lckhUTUwnKSB7CiAgICAgICAgbm9kZS5pbm5lckhUTUwgPSBTdHJpbmcodmFsKTsKICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICd0ZXh0JyB8fCBrZXkgPT09ICd0ZXh0Q29udGVudCcpIHsKICAgICAgICBub2RlLnRleHRDb250ZW50ID0gU3RyaW5nKHZhbCk7CiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmVmJyAmJiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmVmRm4gPSB2YWw7CiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncm9sZScpIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgncm9sZScsIFN0cmluZyh2YWwpKTsKICAgICAgfSBlbHNlIGlmIChrZXkubGVuZ3RoID4gMiAmJiBrZXkuc2xpY2UoMCwgMikgPT09ICdvbicgJiYga2V5WzJdID09PSBrZXlbMl0udG9VcHBlckNhc2UoKSkgewoKICAgICAgICB2YXIgZXZ0ID0ga2V5LnNsaWNlKDIpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldnQsIHZhbCk7CiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbCkgJiYgdHlwZW9mIHZhbFswXSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2dCwgdmFsWzBdLCB2YWxbMV0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICd2YWx1ZScgfHwga2V5ID09PSAnY2hlY2tlZCcgfHwga2V5ID09PSAnZGlzYWJsZWQnIHx8IGtleSA9PT0gJ3NlbGVjdGVkJykgewoKICAgICAgICBub2RlW2tleV0gPSB2YWw7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKSB7CiAgICAgICAgaWYgKHZhbCkgbm9kZS5zZXRBdHRyaWJ1dGUoa2V5LCAnJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcodmFsKSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChyZWZGbikgcmVmRm4obm9kZSk7CiAgfQoKICBmdW5jdGlvbiBhcHBseVN0eWxlKG5vZGUsIHZhbCkgewogICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7CiAgICAgIG5vZGUuc3R5bGUuY3NzVGV4dCA9IHZhbDsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JykgewogICAgICBmb3IgKHZhciBwcm9wIGluIHZhbCkgewogICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbCwgcHJvcCkpIGNvbnRpbnVlOwogICAgICAgIHZhciBwdiA9IHZhbFtwcm9wXTsKICAgICAgICBpZiAocHYgPT0gbnVsbCkgY29udGludWU7CiAgICAgICAgaWYgKHByb3AuaW5kZXhPZignLS0nKSA9PT0gMCkgewogICAgICAgICAgbm9kZS5zdHlsZS5zZXRQcm9wZXJ0eShwcm9wLCBTdHJpbmcocHYpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZS5zdHlsZVtwcm9wXSA9IHR5cGVvZiBwdiA9PT0gJ251bWJlcicgPyBwdiArICh1bml0bGVzc1N0eWxlW3Byb3BdID8gJycgOiAncHgnKSA6IFN0cmluZyhwdik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICB2YXIgdW5pdGxlc3NTdHlsZSA9IHsKICAgIG9wYWNpdHk6IDEsIHpJbmRleDogMSwgZm9udFdlaWdodDogMSwgbGluZUhlaWdodDogMSwgZmxleDogMSwgZmxleEdyb3c6IDEsCiAgICBmbGV4U2hyaW5rOiAxLCBvcmRlcjogMSwgem9vbTogMSwgZ3JpZFJvdzogMSwgZ3JpZENvbHVtbjogMSwgY29sdW1uQ291bnQ6IDEKICB9OwoKICBmdW5jdGlvbiBhcHBlbmRDaGlsZChub2RlLCBjaGlsZCkgewogICAgaWYgKGNoaWxkID09IG51bGwgfHwgY2hpbGQgPT09IGZhbHNlIHx8IGNoaWxkID09PSB0cnVlKSByZXR1cm47CiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZCkpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZC5sZW5ndGg7IGkrKykgYXBwZW5kQ2hpbGQobm9kZSwgY2hpbGRbaV0pOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaXNOb2RlKGNoaWxkKSkgewogICAgICBub2RlLmFwcGVuZENoaWxkKGNoaWxkKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGNoaWxkKSkpOwogIH0KCiAgZnVuY3Rpb24gaXNOb2RlKHgpIHsKICAgIHJldHVybiB4ICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgeC5ub2RlVHlwZSA9PT0gJ251bWJlcic7CiAgfQoKICB2YXIgSUNPTlMgPSB7CgogICAgJ3NwYXJrbGVzJzogWwogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xMiAzbDEuNiA0LjRMMTggOWwtNC40IDEuNkwxMiAxNWwtMS42LTQuNEw2IDlsNC40LTEuNnonIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTE4LjUgMTQuNWwuNyAxLjkgMS45LjctMS45LjctLjcgMS45LS43LTEuOS0xLjktLjcgMS45LS43eicgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNNS41IDE0LjVsLjU1IDEuNSAxLjUuNTUtMS41LjU1TDUuNSAxOWwtLjU1LTEuNDUtMS41LS41NSAxLjUtLjU1eicgfQogICAgXSwKICAgICd3YW5kJzogWwogICAgICB7IHQ6ICdsaW5lJywgeDE6IDE1LCB5MTogNCwgeDI6IDIwLCB5MjogOSB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xNy41IDYuNUw1IDE5JyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xNi41IDIuMmwuNSAxLjUgMS41LjUtMS41LjUtLjUgMS41LS41LTEuNS0xLjUtLjUgMS41LS41eicgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMjEuNCA5LjRsLjM1IDEuMSAxLjEuMzUtMS4xLjM1LS4zNSAxLjEtLjM1LTEuMS0xLjEtLjM1IDEuMS0uMzV6JyB9CiAgICBdLAogICAgJ3dhbmQtc3RhcnMnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTUgMTlMMTYgOCcgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTQgNmwyIDInIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTE4IDNsLjYgMS43TDIwLjMgNS4zIDE4LjYgNiAxOCA3LjcgMTcuNCA2bC0xLjctLjdMMTcuNCA0Ljd6JyB9LAogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMjAuNSwgY3k6IDExLCByOiAwLjksIGZpbGw6ICdjdXJyZW50Q29sb3InIH0sCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiA4LCBjeTogNCwgcjogMC45LCBmaWxsOiAnY3VycmVudENvbG9yJyB9CiAgICBdLAogICAgJ2JvbHQnOiAnTTEzIDJMNCAxNGg2bC0xIDggOS0xMmgtNmwxLTh6JywKCiAgICAncGhvdG8nOiBbCiAgICAgIHsgdDogJ3JlY3QnLCB4OiAzLCB5OiA0LCB3aWR0aDogMTgsIGhlaWdodDogMTYsIHJ4OiAzIH0sCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiA4LjUsIGN5OiA5LjUsIHI6IDEuNiB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ001IDE4bDQuNS00LjVhMiAyIDAgMCAxIDIuOCAwTDE5IDIwJyB9CiAgICBdLAogICAgJ2dyaWQnOiBbCiAgICAgIHsgdDogJ3JlY3QnLCB4OiAzLjUsIHk6IDMuNSwgd2lkdGg6IDcsIGhlaWdodDogNywgcng6IDEuNiB9LAogICAgICB7IHQ6ICdyZWN0JywgeDogMTMuNSwgeTogMy41LCB3aWR0aDogNywgaGVpZ2h0OiA3LCByeDogMS42IH0sCiAgICAgIHsgdDogJ3JlY3QnLCB4OiAzLjUsIHk6IDEzLjUsIHdpZHRoOiA3LCBoZWlnaHQ6IDcsIHJ4OiAxLjYgfSwKICAgICAgeyB0OiAncmVjdCcsIHg6IDEzLjUsIHk6IDEzLjUsIHdpZHRoOiA3LCBoZWlnaHQ6IDcsIHJ4OiAxLjYgfQogICAgXSwKICAgICdmb2xkZXInOiAnTTMgN2EyIDIgMCAwIDEgMi0yaDRsMiAyLjRoNmEyIDIgMCAwIDEgMiAyVjE4YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yeicsCiAgICAnZmlsbSc6IFsKICAgICAgeyB0OiAncmVjdCcsIHg6IDMsIHk6IDQuNSwgd2lkdGg6IDE4LCBoZWlnaHQ6IDE1LCByeDogMi41IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogNy41LCB5MTogNC41LCB4MjogNy41LCB5MjogMTkuNSB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDE2LjUsIHkxOiA0LjUsIHgyOiAxNi41LCB5MjogMTkuNSB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDMsIHkxOiA5LjIsIHgyOiA3LjUsIHkyOiA5LjIgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAzLCB5MTogMTQuOCwgeDI6IDcuNSwgeTI6IDE0LjggfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxNi41LCB5MTogOS4yLCB4MjogMjEsIHkyOiA5LjIgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxNi41LCB5MTogMTQuOCwgeDI6IDIxLCB5MjogMTQuOCB9CiAgICBdLAogICAgJ3Bob3RvLWJhZGdlLXBsdXMnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTIxIDEyLjVWN2EyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxMGEyIDIgMCAwIDAgMiAyaDcuNScgfSwKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDguNSwgY3k6IDkuNSwgcjogMS40IH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTUgMTYuNWw0LTRhMS44IDEuOCAwIDAgMSAyLjUgMGwyIDInIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTguNSwgeTE6IDE1LCB4MjogMTguNSwgeTI6IDIyIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTUsIHkxOiAxOC41LCB4MjogMjIsIHkyOiAxOC41IH0KICAgIF0sCgogICAgJ3BsdXMnOiBbCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTIsIHkxOiA1LCB4MjogMTIsIHkyOiAxOSB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDUsIHkxOiAxMiwgeDI6IDE5LCB5MjogMTIgfQogICAgXSwKICAgICdhcnJvdy11cCc6IFsKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDIwLCB4MjogMTIsIHkyOiA1IH0sCiAgICAgIHsgdDogJ3BvbHlsaW5lJywgcG9pbnRzOiAnNSwxMiAxMiw1IDE5LDEyJyB9CiAgICBdLAogICAgJ3NxdWFyZS1hcnJvdy11cCc6IFsKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTYgNWgyYTIgMiAwIDAgMSAyIDJ2MTFhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJWN2EyIDIgMCAwIDEgMi0yaDInIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTIsIHkxOiAzLCB4MjogMTIsIHkyOiAxNCB9LAogICAgICB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzguNSw2LjUgMTIsMyAxNS41LDYuNScgfQogICAgXSwKICAgICdhcnJvdy1kb3duLWNpcmNsZSc6IFsKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDEyLCBjeTogMTIsIHI6IDkgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDcuNSwgeDI6IDEyLCB5MjogMTYgfSwKICAgICAgeyB0OiAncG9seWxpbmUnLCBwb2ludHM6ICc4LjUsMTIuNSAxMiwxNiAxNS41LDEyLjUnIH0KICAgIF0sCiAgICAnYXJyb3ctMi1jaXJjbGVwYXRoJzogWwogICAgICB7IHQ6ICdwYXRoJywgZDogJ00yMCAxMWE4IDggMCAwIDAtMTMuNi00LjVMNCA5JyB9LAogICAgICB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzQsNCA0LDkgOSw5JyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ000IDEzYTggOCAwIDAgMCAxMy42IDQuNUwyMCAxNScgfSwKICAgICAgeyB0OiAncG9seWxpbmUnLCBwb2ludHM6ICcyMCwyMCAyMCwxNSAxNSwxNScgfQogICAgXSwKCiAgICAnaGVhcnQnOiAnTTEyIDIwcy03LTQuNi05LjMtOS4xQzEuNCA4LjMgMi40IDUuMyA1IDQuNGMxLjktLjcgMy45LjEgNSAxLjggMS4xLTEuNyAzLjEtMi41IDUtMS44IDIuNi45IDMuNiAzLjkgMi4zIDYuNUMxOSAxNS40IDEyIDIwIDEyIDIweicsCiAgICAnaGVhcnQtZmlsbCc6IFsKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTIgMjAuM3MtNy4yLTQuNy05LjUtOS4zQzEuMiA4LjIgMi4zIDUgNSA0LjFjMi0uNyA0IC4yIDUgMiAxLTEuOCAzLTIuNyA1LTIgMi43LjkgMy44IDQuMSAyLjUgNi45QzE5LjIgMTUuNiAxMiAyMC4zIDEyIDIwLjN6JywgZmlsbDogJ2N1cnJlbnRDb2xvcicsIHN0cm9rZTogJ25vbmUnIH0KICAgIF0sCgogICAgJ3RyYXNoJzogWwogICAgICB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzQsNyAyMCw3JyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ005IDdWNWExLjUgMS41IDAgMCAxIDEuNS0xLjVoM0ExLjUgMS41IDAgMCAxIDE1IDV2MicgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNNiA3bDEgMTIuNUExLjUgMS41IDAgMCAwIDguNSAyMWg3YTEuNSAxLjUgMCAwIDAgMS41LTEuNUwxOCA3JyB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDEwLCB5MTogMTEsIHgyOiAxMCwgeTI6IDE3IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTQsIHkxOiAxMSwgeDI6IDE0LCB5MjogMTcgfQogICAgXSwKICAgICd4bWFyayc6IFsKICAgICAgeyB0OiAnbGluZScsIHgxOiA2LCB5MTogNiwgeDI6IDE4LCB5MjogMTggfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxOCwgeTE6IDYsIHgyOiA2LCB5MjogMTggfQogICAgXSwKCiAgICAnY2hldnJvbi1sZWZ0JzogeyB0OiAncG9seWxpbmUnLCBwb2ludHM6ICcxNSw1IDgsMTIgMTUsMTknIH0sCiAgICAnY2hldnJvbi1yaWdodCc6IHsgdDogJ3BvbHlsaW5lJywgcG9pbnRzOiAnOSw1IDE2LDEyIDksMTknIH0sCiAgICAnY2hldnJvbi1kb3duJzogeyB0OiAncG9seWxpbmUnLCBwb2ludHM6ICc1LDkgMTIsMTYgMTksOScgfSwKICAgICdjaGV2cm9uLXVwJzogeyB0OiAncG9seWxpbmUnLCBwb2ludHM6ICc1LDE1IDEyLDggMTksMTUnIH0sCgogICAgJ21hZ25pZnlpbmdnbGFzcyc6IFsKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDExLCBjeTogMTEsIHI6IDYuNSB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDE1LjgsIHkxOiAxNS44LCB4MjogMjEsIHkyOiAyMSB9CiAgICBdLAogICAgJ3NsaWRlci1ob3Jpem9udGFsJzogWwogICAgICB7IHQ6ICdsaW5lJywgeDE6IDMsIHkxOiA4LCB4MjogMjEsIHkyOiA4IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMywgeTE6IDE2LCB4MjogMjEsIHkyOiAxNiB9LAogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogOSwgY3k6IDgsIHI6IDIuNCwgZmlsbDogJ3ZhcigtLXN1cmZhY2UsIHRyYW5zcGFyZW50KScgfSwKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDE1LCBjeTogMTYsIHI6IDIuNCwgZmlsbDogJ3ZhcigtLXN1cmZhY2UsIHRyYW5zcGFyZW50KScgfQogICAgXSwKCiAgICAnZ2Vhcic6IFsKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDEyLCBjeTogMTIsIHI6IDMuMiB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xMiAyLjVsMS4xIDIuNCAyLjYtLjUuNSAyLjYgMi40IDEuMS0xLjEgMi40IDEuMSAyLjQtMi40IDEuMS0uNSAyLjYtMi42LS41TDEyIDIxLjVsLTEuMS0yLjQtMi42LjUtLjUtMi42LTIuNC0xLjEgMS4xLTIuNC0xLjEtMi40IDIuNC0xLjEuNS0yLjYgMi42LjV6JyB9CiAgICBdLAogICAgJ3BlcnNvbi1jaXJjbGUnOiBbCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiAxMiwgY3k6IDEyLCByOiA5IH0sCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiAxMiwgY3k6IDEwLCByOiAzIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTYuNSAxOC41YTYgNiAwIDAgMSAxMSAwJyB9CiAgICBdLAogICAgJ2Nyb3duJzogWwogICAgICB7IHQ6ICdwYXRoJywgZDogJ00zIDhsMy41IDMuNUwxMiA1bDUuNSA2LjVMMjEgOGwtMS41IDEwLjVoLTE1eicgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiA0LjUsIHkxOiAyMSwgeDI6IDE5LjUsIHkyOiAyMSB9CiAgICBdLAoKICAgICdsaW5lLTMnOiBbCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogNCwgeTE6IDcsIHgyOiAyMCwgeTI6IDcgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiA0LCB5MTogMTIsIHgyOiAyMCwgeTI6IDEyIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogNCwgeTE6IDE3LCB4MjogMjAsIHkyOiAxNyB9CiAgICBdLAogICAgJ2NoZWNrbWFyayc6IHsgdDogJ3BvbHlsaW5lJywgcG9pbnRzOiAnNSwxMi41IDEwLDE3LjUgMTkuNSw2LjUnIH0sCiAgICAncGVuY2lsJzogWwogICAgICB7IHQ6ICdwYXRoJywgZDogJ000IDIwbDEuMi00LjJMMTUuNSA1LjVhMiAyIDAgMCAxIDIuOCAwbC4yLjJhMiAyIDAgMCAxIDAgMi44TDguMiAxOC44eicgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxNCwgeTE6IDcsIHgyOiAxNywgeTI6IDEwIH0KICAgIF0sCgogICAgJ2luZm8tY2lyY2xlJzogWwogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTIsIGN5OiAxMiwgcjogOSB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDEyLCB5MTogMTEsIHgyOiAxMiwgeTI6IDE2IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTIsIHkxOiA4LCB4MjogMTIuMDEsIHkyOiA4IH0KICAgIF0sCiAgICAndHJpYW5nbGUtYWxlcnQnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTEwLjMgMy45IDIgMThhMiAyIDAgMCAwIDEuNyAzaDE2LjZhMiAyIDAgMCAwIDEuNy0zTDEzLjcgMy45YTIgMiAwIDAgMC0zLjQgMHonIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTIsIHkxOiA5LCB4MjogMTIsIHkyOiAxMy41IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTIsIHkxOiAxNywgeDI6IDEyLjAxLCB5MjogMTcgfQogICAgXSwKCiAgICAnYm9va21hcmsnOiB7IHQ6ICdwYXRoJywgZDogJ002IDRhMSAxIDAgMCAxIDEtMWgxMGExIDEgMCAwIDEgMSAxdjE3bC02LTQtNiA0eicgfSwKICAgICdkb2Mtb24tZG9jJzogWwogICAgICB7IHQ6ICdyZWN0JywgeDogOCwgeTogOCwgd2lkdGg6IDEyLCBoZWlnaHQ6IDEzLCByeDogMiB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xNiA4VjVhMiAyIDAgMCAwLTItMkg2YTIgMiAwIDAgMC0yIDJ2MTFhMiAyIDAgMCAwIDIgMmgyJyB9CiAgICBdLAogICAgJ2xpbmsnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTkgMTVsNi02JyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xMC41IDcuNWwxLjgtMS44YTMuNSAzLjUgMCAwIDEgNSA1bC0xLjggMS44JyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xMy41IDE2LjVsLTEuOCAxLjhhMy41IDMuNSAwIDAgMS01LTVsMS44LTEuOCcgfQogICAgXSwKICAgICdnaWZ0JzogWwogICAgICB7IHQ6ICdyZWN0JywgeDogNCwgeTogOSwgd2lkdGg6IDE2LCBoZWlnaHQ6IDExLCByeDogMS41IH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTMuNSA5aDE3djMuNWgtMTd6JyB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDEyLCB5MTogOSwgeDI6IDEyLCB5MjogMjAgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTIgOUMxMiA2IDEwLjUgNC41IDguOCA0LjVBMi4zIDIuMyAwIDAgMCA4LjggOXonIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTEyIDljMC0zIDEuNS00LjUgMy4yLTQuNUEyLjMgMi4zIDAgMCAxIDE1LjIgOXonIH0KICAgIF0sCiAgICAnZmxhbWUnOiB7IHQ6ICdwYXRoJywgZDogJ00xMiAzYzEuNSAzIDQuNSA0LjUgNC41IDguNUE0LjUgNC41IDAgMCAxIDEyIDE2YTQuNSA0LjUgMCAwIDEtNC41LTQuNWMwLTIgMS0zIDEuOC0zLjhDOSA5IDEwIDkuNSAxMC41IDEwYy40LTIuNS0uNS00LjcgMS41LTd6JyB9LAogICAgJ2xvY2snOiBbCiAgICAgIHsgdDogJ3JlY3QnLCB4OiA1LCB5OiAxMSwgd2lkdGg6IDE0LCBoZWlnaHQ6IDksIHJ4OiAyIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTggMTFWOGE0IDQgMCAwIDEgOCAwdjMnIH0KICAgIF0sCiAgICAnbG9nb3V0JzogWwogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xNSA0aDJhMiAyIDAgMCAxIDIgMnYxMmEyIDIgMCAwIDEtMiAyaC0yJyB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDQsIHkxOiAxMiwgeDI6IDE1LCB5MjogMTIgfSwKICAgICAgeyB0OiAncG9seWxpbmUnLCBwb2ludHM6ICc4LDggNCwxMiA4LDE2JyB9CiAgICBdLAogICAgJ2hlbHAtY2lyY2xlJzogWwogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTIsIGN5OiAxMiwgcjogOSB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ005LjUgOS41YTIuNSAyLjUgMCAxIDEgMy40IDIuM2MtLjguNC0xLjQgMS0xLjQgMi4yJyB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDExLjUsIHkxOiAxNywgeDI6IDExLjUxLCB5MjogMTcgfQogICAgXSwKICAgICdlbGxpcHNpcyc6IFsKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDUsIGN5OiAxMiwgcjogMS4yLCBmaWxsOiAnY3VycmVudENvbG9yJywgc3Ryb2tlOiAnbm9uZScgfSwKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDEyLCBjeTogMTIsIHI6IDEuMiwgZmlsbDogJ2N1cnJlbnRDb2xvcicsIHN0cm9rZTogJ25vbmUnIH0sCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiAxOSwgY3k6IDEyLCByOiAxLjIsIGZpbGw6ICdjdXJyZW50Q29sb3InLCBzdHJva2U6ICdub25lJyB9CiAgICBdCiAgfTsKCiAgdmFyIEFMSUFTID0gewogICAgZ2VuZXJhdGU6ICdzcGFya2xlcycsCiAgICBsaWJyYXJ5OiAnZ3JpZCcsCiAgICBhZGQ6ICdwbHVzJywKICAgIHNlbmQ6ICdhcnJvdy11cCcsCiAgICBzZXR0aW5nczogJ2dlYXInLAogICAgYWNjb3VudDogJ3BlcnNvbi1jaXJjbGUnLAogICAgZmF2b3JpdGU6ICdoZWFydCcsCiAgICAnZmF2b3JpdGUtZmlsbCc6ICdoZWFydC1maWxsJywKICAgIGRlbGV0ZTogJ3RyYXNoJywKICAgIHNoYXJlOiAnc3F1YXJlLWFycm93LXVwJywKICAgIGRvd25sb2FkOiAnYXJyb3ctZG93bi1jaXJjbGUnLAogICAgc2F2ZTogJ2Fycm93LWRvd24tY2lyY2xlJywKICAgIGNsb3NlOiAneG1hcmsnLAogICAgc2VhcmNoOiAnbWFnbmlmeWluZ2dsYXNzJywKICAgIGZpbHRlcnM6ICdzbGlkZXItaG9yaXpvbnRhbCcsCiAgICBmaWx0ZXI6ICdzbGlkZXItaG9yaXpvbnRhbCcsCiAgICB2aWRlbzogJ2ZpbG0nLAogICAgYW5pbWF0ZTogJ2ZpbG0nLAogICAgY3JlZGl0czogJ2JvbHQnLAogICAgcGF5d2FsbDogJ2Nyb3duJywKICAgIGhhbWJ1cmdlcjogJ2xpbmUtMycsCiAgICBtZW51OiAnbGluZS0zJywKICAgIGNoZWNrOiAnY2hlY2ttYXJrJywKICAgIGVkaXQ6ICdwZW5jaWwnLAogICAgdXBsb2FkOiAncGhvdG8tYmFkZ2UtcGx1cycsCiAgICB2YXJpYXRpb25zOiAnYXJyb3ctMi1jaXJjbGVwYXRoJywKICAgIHJlZnJlc2g6ICdhcnJvdy0yLWNpcmNsZXBhdGgnLAogICAgYmFjazogJ2NoZXZyb24tbGVmdCcsCiAgICBmb3J3YXJkOiAnY2hldnJvbi1yaWdodCcsCgogICAgaW5mbzogJ2luZm8tY2lyY2xlJywKICAgIGFsZXJ0OiAndHJpYW5nbGUtYWxlcnQnLAogICAgd2FybmluZzogJ3RyaWFuZ2xlLWFsZXJ0JywKICAgIHNwYXJrOiAnc3BhcmtsZXMnLAogICAgaW1hZ2U6ICdwaG90bycsCiAgICAnaGVhcnQuZmlsbCc6ICdoZWFydC1maWxsJywKICAgIGhlYXJ0RmlsbDogJ2hlYXJ0LWZpbGwnLAogICAgY29weTogJ2RvYy1vbi1kb2MnLAogICAgbW9yZTogJ2VsbGlwc2lzJywKICAgIHNvcnQ6ICdzbGlkZXItaG9yaXpvbnRhbCcsCiAgICBjaGV2cm9uOiAnY2hldnJvbi1yaWdodCcsCiAgICBhcnJvd0xlZnQ6ICdjaGV2cm9uLWxlZnQnLAogICAgYXJyb3dSaWdodDogJ2NoZXZyb24tcmlnaHQnLAogICAgJ2Fycm93LWxlZnQnOiAnY2hldnJvbi1sZWZ0JywKICAgICdhcnJvdy1yaWdodCc6ICdjaGV2cm9uLXJpZ2h0JywKICAgIHB1Ymxpc2g6ICdzcXVhcmUtYXJyb3ctdXAnLAogICAgcGhvdG9TdGFjazogJ2dyaWQnLAogICAgJ3Bob3RvLXN0YWNrJzogJ2dyaWQnLAogICAgaGVscDogJ2hlbHAtY2lyY2xlJywKICAgIHByb2ZpbGU6ICdwZXJzb24tY2lyY2xlJwogIH07CgogIHZhciBDQUNIRSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CgogIGZ1bmN0aW9uIGJ1aWxkU3ZnKG5hbWUpIHsKICAgIHZhciBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCAnc3ZnJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgJzAgMCAyNCAyNCcpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMjQnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcyNCcpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnY3VycmVudENvbG9yJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMS42Jyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWNhcCcsICdyb3VuZCcpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWxpbmVqb2luJywgJ3JvdW5kJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdmb2N1c2FibGUnLCAnZmFsc2UnKTsKICAgIHN2Zy5jbGFzc0xpc3QuYWRkKCd2LWljb24nKTsKICAgIHN2Zy5jbGFzc0xpc3QuYWRkKCd2LWljb24tLScgKyBuYW1lKTsKCiAgICB2YXIgc3BlYyA9IElDT05TW25hbWVdOwogICAgdmFyIHBhcnRzID0gdHlwZW9mIHNwZWMgPT09ICdzdHJpbmcnCiAgICAgID8gW3sgdDogJ3BhdGgnLCBkOiBzcGVjIH1dCiAgICAgIDogKEFycmF5LmlzQXJyYXkoc3BlYykgPyBzcGVjIDogW3NwZWNdKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHN2Zy5hcHBlbmRDaGlsZChidWlsZFNoYXBlKHBhcnRzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gc3ZnOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRTaGFwZShwYXJ0KSB7CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIHBhcnQudCB8fCAncGF0aCcpOwogICAgZm9yICh2YXIgayBpbiBwYXJ0KSB7CiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcnQsIGspIHx8IGsgPT09ICd0JykgY29udGludWU7CiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKHRvQXR0cihrKSwgU3RyaW5nKHBhcnRba10pKTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gdG9BdHRyKGspIHsKICAgIHJldHVybiBrOwogIH0KCiAgZnVuY3Rpb24gaWNvbihuYW1lKSB7CiAgICB2YXIga2V5ID0gSUNPTlNbbmFtZV0gPyBuYW1lIDogKEFMSUFTW25hbWVdIHx8IG51bGwpOwogICAgaWYgKCFrZXkpIHsKCiAgICAgIHZhciBmYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsICdzdmcnKTsKICAgICAgZmIuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgJzAgMCAyNCAyNCcpOwogICAgICBmYi5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzI0Jyk7CiAgICAgIGZiLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJzI0Jyk7CiAgICAgIGZiLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgICBmYi5zZXRBdHRyaWJ1dGUoJ2ZvY3VzYWJsZScsICdmYWxzZScpOwogICAgICBmYi5jbGFzc0xpc3QuYWRkKCd2LWljb24nLCAndi1pY29uLS11bmtub3duJyk7CiAgICAgIHZhciBkb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCAnY2lyY2xlJyk7CiAgICAgIGRvdC5zZXRBdHRyaWJ1dGUoJ2N4JywgJzEyJyk7CiAgICAgIGRvdC5zZXRBdHRyaWJ1dGUoJ2N5JywgJzEyJyk7CiAgICAgIGRvdC5zZXRBdHRyaWJ1dGUoJ3InLCAnMi40Jyk7CiAgICAgIGRvdC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnY3VycmVudENvbG9yJyk7CiAgICAgIGZiLmFwcGVuZENoaWxkKGRvdCk7CiAgICAgIGlmICh3aW5kb3cuY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2FybignW1YudWkuaWNvbl0gdW5rbm93biBpY29uOicsIG5hbWUpOwogICAgICByZXR1cm4gZmI7CiAgICB9CiAgICBpZiAoIUNBQ0hFW2tleV0pIENBQ0hFW2tleV0gPSBidWlsZFN2ZyhrZXkpOwogICAgcmV0dXJuIENBQ0hFW2tleV0uY2xvbmVOb2RlKHRydWUpOwogIH0KCiAgaWNvbi5uYW1lcyA9IGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiBPYmplY3Qua2V5cyhJQ09OUykuY29uY2F0KE9iamVjdC5rZXlzKEFMSUFTKSk7CiAgfTsKICBpY29uLmhhcyA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICByZXR1cm4gISEoSUNPTlNbbmFtZV0gfHwgQUxJQVNbbmFtZV0pOwogIH07CgogIHVpLmVsID0gZWw7CiAgdWkuaWNvbiA9IGljb247Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2ZlZWQuanMgPT09PT0gKi8KKGZ1bmN0aW9uICgpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBWID0gd2luZG93LlYgPSB3aW5kb3cuViB8fCB7fTsKICBWLnZpZXdzID0gVi52aWV3cyB8fCB7fTsKCiAgdmFyIFBFUiA9IDMwOwogIHZhciBJTkxJTkVfREVGQVVMVCA9IDEyOwoKICB2YXIgQ1lDTEUgPSA1MjAwOwogIHZhciBGQURFID0gOTAwOwogIHZhciBIT0xEX0FGVEVSID0gMTQwMDsKICB2YXIgU0NSVUJfUkVTVU1FID0gMTUwMDsKICB2YXIgU0NSVUJfVEhSRVNIT0xEID0gODsKCiAgdmFyIFBSRUZJWCA9ICJ2YW1wX3dlYl9jdXJhdGlvbl8iOwoKICB2YXIgVEFHUyA9IFsKICAgIHsga2V5OiAiIiwgbGFiZWw6ICJBbGwiIH0sCiAgICB7IGtleTogImludGVyaW9yIiwgbGFiZWw6ICJJbnRlcmlvcnMiIH0sCiAgICB7IGtleTogImV4dGVyaW9yIiwgbGFiZWw6ICJFeHRlcmlvcnMiIH0sCiAgICB7IGtleTogInN0YWdpbmciLCBsYWJlbDogIlN0YWdpbmciIH0sCiAgICB7IGtleTogImxhbmRzY2FwaW5nIiwgbGFiZWw6ICJMYW5kc2NhcGluZyIgfSwKICAgIHsga2V5OiAiYXJjaGl0ZWN0dXJlIiwgbGFiZWw6ICJBcmNoaXRlY3R1cmUiIH0sCiAgICB7IGtleTogInJlYWxlc3RhdGUiLCBsYWJlbDogIlJlYWwgRXN0YXRlIiB9LAogICAgeyBrZXk6ICJtaW5pbWFsaXN0IiwgbGFiZWw6ICJNaW5pbWFsaXN0IiB9LAogICAgeyBrZXk6ICJsdXh1cnkiLCBsYWJlbDogIkx1eHVyeSIgfQogIF07CgogIHZhciBHUklEX1NUWUxFUyA9IFsKICAgIHsga2V5OiAiYXV0byIsIGxhYmVsOiAiQXV0byIgfSwKICAgIHsga2V5OiAib25lIiwgbGFiZWw6ICIxIiwgY29sczogMSB9LAogICAgeyBrZXk6ICJ0d28iLCBsYWJlbDogIjIiLCBjb2xzOiAyIH0sCiAgICB7IGtleTogInRocmVlIiwgbGFiZWw6ICIzIiwgY29sczogMyB9LAogICAgeyBrZXk6ICJmb3VyIiwgbGFiZWw6ICI0IiwgY29sczogNCB9CiAgXTsKCiAgdmFyIENFTExfTU9ERVMgPSBbCiAgICB7IGtleTogImNyb3NzZmFkZSIsIGxhYmVsOiAiQ3Jvc3NmYWRlIiB9LAogICAgeyBrZXk6ICJhZnRlck9ubHkiLCBsYWJlbDogIkFmdGVyIG9ubHkiIH0sCiAgICB7IGtleTogInNjcnViIiwgbGFiZWw6ICJNYW51YWwgc2NydWIiIH0KICBdOwoKICB2YXIgRUZGRUNUUyA9IFsKICAgIHsga2V5OiAiY3Jvc3NmYWRlIiwgbGFiZWw6ICJDcm9zc2ZhZGUiIH0sCiAgICB7IGtleTogImx1bWFGYWRlIiwgbGFiZWw6ICJMdW1hIEZhZGUiIH0sCiAgICB7IGtleTogImthbGVpZG9zY29wZSIsIGxhYmVsOiAiS2FsZWlkb3Njb3BlIiB9LAogICAgeyBrZXk6ICJibG9vbURpc3NvbHZlIiwgbGFiZWw6ICJCbG9vbSBEaXNzb2x2ZSIgfSwKICAgIHsga2V5OiAiZGlzcGxhY2VtZW50IiwgbGFiZWw6ICJEaXNwbGFjZW1lbnQiIH0sCiAgICB7IGtleTogInZvcnRleCIsIGxhYmVsOiAiVm9ydGV4IiB9LAogICAgeyBrZXk6ICJ6b29tQmx1ciIsIGxhYmVsOiAiWm9vbSBCbHVyIiB9LAogICAgeyBrZXk6ICJjcnlzdGFsbGl6ZSIsIGxhYmVsOiAiQ3J5c3RhbGxpemUiIH0sCiAgICB7IGtleTogImh1ZVNoaWZ0U3dlZXAiLCBsYWJlbDogIkh1ZSBTaGlmdCBTd2VlcCIgfSwKICAgIHsga2V5OiAicHN5Y2hlZGVsaWNDb21ibyIsIGxhYmVsOiAiUHN5Y2hlZGVsaWMgQ29tYm8iIH0KICBdOwoKICB2YXIgREVGQVVMVF9QUkVGUyA9IHsKICAgIGdyaWRTdHlsZTogImF1dG8iLAogICAgY2VsbE1vZGU6ICJjcm9zc2ZhZGUiLAogICAgZWZmZWN0OiAiY3Jvc3NmYWRlIiwKICAgIHNwZWVkOiAxLjAKICB9OwoKICBmdW5jdGlvbiByZWR1Y2VkTW90aW9uKCkgewogICAgcmV0dXJuICEhKHdpbmRvdy5tYXRjaE1lZGlhICYmIHdpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSIpLm1hdGNoZXMpOwogIH0KCiAgZnVuY3Rpb24gcHJlZkdldChrZXksIGZhbGxiYWNrKSB7CiAgICB0cnkgewogICAgICB2YXIgcmF3ID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFBSRUZJWCArIGtleSk7CiAgICAgIGlmIChyYXcgPT0gbnVsbCkgcmV0dXJuIGZhbGxiYWNrOwogICAgICByZXR1cm4gSlNPTi5wYXJzZShyYXcpOwogICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsbGJhY2s7IH0KICB9CgogIGZ1bmN0aW9uIHByZWZTZXQoa2V5LCB2YWwpIHsKICAgIHRyeSB7IHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShQUkVGSVggKyBrZXksIEpTT04uc3RyaW5naWZ5KHZhbCkpOyB9IGNhdGNoIChlKSB7fQogIH0KCiAgZnVuY3Rpb24gbG9hZFByZWZzKCkgewogICAgdmFyIG91dCA9IHsKICAgICAgZ3JpZFN0eWxlOiBwcmVmR2V0KCJncmlkU3R5bGUiLCBERUZBVUxUX1BSRUZTLmdyaWRTdHlsZSksCiAgICAgIGNlbGxNb2RlOiBwcmVmR2V0KCJjZWxsTW9kZSIsIERFRkFVTFRfUFJFRlMuY2VsbE1vZGUpLAogICAgICBlZmZlY3Q6IHByZWZHZXQoImVmZmVjdCIsIERFRkFVTFRfUFJFRlMuZWZmZWN0KSwKICAgICAgc3BlZWQ6IHByZWZHZXQoInNwZWVkIiwgREVGQVVMVF9QUkVGUy5zcGVlZCkKICAgIH07CiAgICBpZiAoIUdSSURfU1RZTEVTLnNvbWUoZnVuY3Rpb24gKGcpIHsgcmV0dXJuIGcua2V5ID09PSBvdXQuZ3JpZFN0eWxlOyB9KSkgb3V0LmdyaWRTdHlsZSA9IERFRkFVTFRfUFJFRlMuZ3JpZFN0eWxlOwogICAgaWYgKCFDRUxMX01PREVTLnNvbWUoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMua2V5ID09PSBvdXQuY2VsbE1vZGU7IH0pKSBvdXQuY2VsbE1vZGUgPSBERUZBVUxUX1BSRUZTLmNlbGxNb2RlOwogICAgaWYgKCFFRkZFQ1RTLnNvbWUoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUua2V5ID09PSBvdXQuZWZmZWN0OyB9KSkgb3V0LmVmZmVjdCA9IERFRkFVTFRfUFJFRlMuZWZmZWN0OwogICAgb3V0LnNwZWVkID0gY2xhbXBOdW0ob3V0LnNwZWVkLCAwLjI1LCAzLjAsIDEuMCk7CiAgICByZXR1cm4gb3V0OwogIH0KCiAgZnVuY3Rpb24gY2xhbXBOdW0obiwgbG8sIGhpLCBmYWxsYmFjaykgewogICAgbiA9IE51bWJlcihuKTsKICAgIGlmICghaXNGaW5pdGUobikpIHJldHVybiBmYWxsYmFjazsKICAgIHJldHVybiBNYXRoLm1pbihoaSwgTWF0aC5tYXgobG8sIG4pKTsKICB9CgogIGZ1bmN0aW9uIGNsYW1wMDEobikgewogICAgcmV0dXJuIG4gPCAwID8gMCA6IChuID4gMSA/IDEgOiBuKTsKICB9CgogIGZ1bmN0aW9uIGVsKHRhZywgYXR0cnMsIGNoaWxkcmVuKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5lbCA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIFYudWkuZWwodGFnLCBhdHRycywgY2hpbGRyZW4pOwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMpIHsKICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICB2YXIgdmFsID0gYXR0cnNba107CiAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICBpZiAoayA9PT0gImNsYXNzIiB8fCBrID09PSAiY2xhc3NOYW1lIikgbm9kZS5jbGFzc05hbWUgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gInRleHQiKSBub2RlLnRleHRDb250ZW50ID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICJodG1sIikgbm9kZS5pbm5lckhUTUwgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCJvbiIpID09PSAwICYmIHR5cGVvZiB2YWwgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHZhbCk7CiAgICAgICAgfSBlbHNlIGlmIChrLmluZGV4T2YoImRhdGEtIikgPT09IDAgfHwgay5pbmRleE9mKCJhcmlhLSIpID09PSAwKSB7CiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShrLCB2YWwpOwogICAgICAgIH0gZWxzZSBpZiAoayBpbiBub2RlKSB7CiAgICAgICAgICB0cnkgeyBub2RlW2tdID0gdmFsOyB9IGNhdGNoIChlKSB7IG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7IH0KICAgICAgICB9IGVsc2Ugbm9kZS5zZXRBdHRyaWJ1dGUoaywgdmFsKTsKICAgICAgfSk7CiAgICB9CiAgICBhcHBlbmRDaGlsZHJlbihub2RlLCBjaGlsZHJlbik7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIGFwcGVuZENoaWxkcmVuKG5vZGUsIGNoaWxkcmVuKSB7CiAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgcmV0dXJuOwogICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgY2hpbGRyZW4gPSBbY2hpbGRyZW5dOwogICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoYykgewogICAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlKSByZXR1cm47CiAgICAgIGlmICh0eXBlb2YgYyA9PT0gInN0cmluZyIgfHwgdHlwZW9mIGMgPT09ICJudW1iZXIiKSB7CiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICAgICAgfSBlbHNlIGlmIChjIGluc3RhbmNlb2YgTm9kZSkgewogICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoYyk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZ28oaGFzaCkgewogICAgaWYgKFYucm91dGVyICYmIHR5cGVvZiBWLnJvdXRlci5nbyA9PT0gImZ1bmN0aW9uIikgVi5yb3V0ZXIuZ28oaGFzaCk7CiAgICBlbHNlIGxvY2F0aW9uLmhhc2ggPSBoYXNoOwogIH0KCiAgZnVuY3Rpb24gdG9hc3QobXNnLCBraW5kKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS50b2FzdCA9PT0gImZ1bmN0aW9uIikgVi51aS50b2FzdChtc2csIGtpbmQgfHwgImluZm8iKTsKICAgIGVsc2UgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuZW1pdCA9PT0gImZ1bmN0aW9uIikgVi5zdG9yZS5lbWl0KCJ0b2FzdCIsIHsgbWVzc2FnZTogbXNnLCBraW5kOiBraW5kIH0pOwogIH0KCiAgZnVuY3Rpb24gZGVib3VuY2UoZm4sIG1zKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwuZGVib3VuY2UgPT09ICJmdW5jdGlvbiIpIHJldHVybiBWLnV0aWwuZGVib3VuY2UoZm4sIG1zKTsKICAgIHZhciB0OwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIGN0eCA9IHRoaXMsIGEgPSBhcmd1bWVudHM7CiAgICAgIGNsZWFyVGltZW91dCh0KTsKICAgICAgdCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBmbi5hcHBseShjdHgsIGEpOyB9LCBtcyk7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gaW1hZ2VPZihpdGVtKSB7CiAgICByZXR1cm4gKGl0ZW0gJiYgKGl0ZW0uZ2VuZXJhdGVkSW1hZ2UgfHwgaXRlbS5pbWFnZSkpIHx8IGl0ZW0gfHwge307CiAgfQoKICBmdW5jdGlvbiBwcm9maWxlT2YoaXRlbSkgewogICAgcmV0dXJuIChpdGVtICYmIGl0ZW0ucHJvZmlsZSkgfHwgKGl0ZW0gJiYgaXRlbS5nZW5lcmF0ZWRJbWFnZSAmJiBpdGVtLmdlbmVyYXRlZEltYWdlLnByb2ZpbGUpIHx8IG51bGw7CiAgfQoKICBmdW5jdGlvbiBhZnRlclVSTChnaSkgewogICAgcmV0dXJuIGdpLnJlbW90ZUltYWdlVVJMIHx8IGdpLnJlbW90ZUltYWdlVXJsIHx8IGdpLmltYWdlVVJMIHx8IGdpLnVybCB8fCAiIjsKICB9CgogIGZ1bmN0aW9uIGJlZm9yZVVSTChnaSkgewogICAgcmV0dXJuIGdpLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwgfHwgZ2kucmVtb3RlT3JpZ2luYWxJbWFnZVVybCB8fCBnaS5vcmlnaW5hbEltYWdlVVJMIHx8ICIiOwogIH0KCiAgZnVuY3Rpb24gYXNwZWN0T2YoZ2kpIHsKICAgIHZhciB3ID0gZ2kud2lkdGggfHwgZ2kuaW1hZ2VXaWR0aCB8fCAoZ2kuaW1hZ2Vfc2l6ZSAmJiBnaS5pbWFnZV9zaXplLndpZHRoKTsKICAgIHZhciBoID0gZ2kuaGVpZ2h0IHx8IGdpLmltYWdlSGVpZ2h0IHx8IChnaS5pbWFnZV9zaXplICYmIGdpLmltYWdlX3NpemUuaGVpZ2h0KTsKICAgIGlmICh3ICYmIGggJiYgaCA+IDApIHJldHVybiB3IC8gaDsKICAgIGlmICh0eXBlb2YgZ2kuYXNwZWN0UmF0aW8gPT09ICJudW1iZXIiICYmIGdpLmFzcGVjdFJhdGlvID4gMCkgcmV0dXJuIGdpLmFzcGVjdFJhdGlvOwogICAgcmV0dXJuIDAuNzU7CiAgfQoKICBmdW5jdGlvbiBhcHBseUV4YW1wbGVUb0NyZWF0b3IoaXRlbSwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgZ2kgPSBpbWFnZU9mKGl0ZW0pOwogICAgdmFyIHByb2ZpbGUgPSBwcm9maWxlT2YoaXRlbSk7CiAgICB2YXIgcHJvbXB0ID0gZ2kucHJvbXB0IHx8ICIiOwogICAgdmFyIG1vZGVsID0gZ2kubW9kZWwgfHwgbnVsbDsKICAgIHZhciByZWZlcmVuY2VVUkwgPSBvcHRzLmFzUmVmZXJlbmNlID8gYWZ0ZXJVUkwoZ2kpIDogbnVsbDsKCiAgICB2YXIgcGF5bG9hZCA9IHsKICAgICAgZ2VuZXJhdGVkSW1hZ2U6IGdpLAogICAgICBwcm9maWxlOiBwcm9maWxlLAogICAgICBwcm9tcHQ6IHByb21wdCwKICAgICAgbW9kZWw6IG1vZGVsLAogICAgICByZWZlcmVuY2VVUkw6IHJlZmVyZW5jZVVSTCwKICAgICAgc291cmNlOiAiaW5zcGlyYXRpb24iCiAgICB9OwoKICAgIGlmICh0eXBlb2Ygb3B0cy5vbkFwcGx5ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHRyeSB7IG9wdHMub25BcHBseShwYXlsb2FkKTsgcmV0dXJuOyB9IGNhdGNoIChlKSB7fQogICAgfQoKICAgIGlmIChWLnZpZXdzICYmIFYudmlld3MuY3JlYXRlICYmIHR5cGVvZiBWLnZpZXdzLmNyZWF0ZS5hcHBseUV4YW1wbGUgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgdHJ5IHsKICAgICAgICBWLnZpZXdzLmNyZWF0ZS5hcHBseUV4YW1wbGUocGF5bG9hZCk7CiAgICAgICAgaWYgKGxvY2F0aW9uLmhhc2guaW5kZXhPZigiIy9jcmVhdGUiKSAhPT0gMCkgewogICAgICAgICAgdmFyIHEgPSAiIy9jcmVhdGU/cHJvbXB0PSIgKyBlbmNvZGVVUklDb21wb25lbnQocHJvbXB0KTsKICAgICAgICAgIGlmIChtb2RlbCkgcSArPSAiJm1vZGVsPSIgKyBlbmNvZGVVUklDb21wb25lbnQobW9kZWwpOwogICAgICAgICAgZ28ocSk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfSBjYXRjaCAoZSkge30KICAgIH0KCiAgICB2YXIgaGFzaCA9ICIjL2NyZWF0ZT9wcm9tcHQ9IiArIGVuY29kZVVSSUNvbXBvbmVudChwcm9tcHQpOwogICAgaWYgKG1vZGVsKSBoYXNoICs9ICImbW9kZWw9IiArIGVuY29kZVVSSUNvbXBvbmVudChtb2RlbCk7CiAgICBnbyhoYXNoKTsKICB9CgogIHZhciBsb29wUnVubmluZyA9IGZhbHNlOwogIHZhciBhY3RpdmVTdGF0ZXMgPSBbXTsKICB2YXIgcGF1c2VkQXQgPSAwOwogIHZhciB2aXNpYmlsaXR5Qm91bmQgPSBmYWxzZTsKICB2YXIgZG9jQ2xhc3NPYnNlcnZlciA9IG51bGw7CgogIGZ1bmN0aW9uIGZlZWRBY3RpdmUoKSB7CiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5oaWRkZW4pIHJldHVybiBmYWxzZTsKICAgIHZhciBkZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKICAgIGlmIChkZSAmJiBkZS5jbGFzc0xpc3QgJiYgKGRlLmNsYXNzTGlzdC5jb250YWlucygidi1oYXMtb3ZlcmxheSIpIHx8IGRlLmNsYXNzTGlzdC5jb250YWlucygidi1kcmF3ZXItb3BlbiIpKSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBiaW5kVmlzaWJpbGl0eSgpIHsKICAgIGlmICh2aXNpYmlsaXR5Qm91bmQpIHJldHVybjsKICAgIHZpc2liaWxpdHlCb3VuZCA9IHRydWU7CiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLCBtYXliZVJlc3VtZSk7CiAgICB9CiAgICBpZiAodHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgewogICAgICBkb2NDbGFzc09ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobWF5YmVSZXN1bWUpOwogICAgICBkb2NDbGFzc09ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7IGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogWyJjbGFzcyJdIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gbWF5YmVSZXN1bWUoKSB7CiAgICBpZiAoIWxvb3BSdW5uaW5nICYmIGFjdGl2ZVN0YXRlcy5sZW5ndGggJiYgZmVlZEFjdGl2ZSgpKSBzdGFydExvb3AoKTsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0TG9vcCgpIHsKICAgIGlmIChsb29wUnVubmluZykgcmV0dXJuOwogICAgYmluZFZpc2liaWxpdHkoKTsKICAgIGxvb3BSdW5uaW5nID0gdHJ1ZTsKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTsKICB9CgogIGZ1bmN0aW9uIHRpY2soKSB7CiAgICBpZiAoIWFjdGl2ZVN0YXRlcy5sZW5ndGgpIHsKICAgICAgbG9vcFJ1bm5pbmcgPSBmYWxzZTsKICAgICAgcGF1c2VkQXQgPSAwOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIWZlZWRBY3RpdmUoKSkgewogICAgICBsb29wUnVubmluZyA9IGZhbHNlOwogICAgICBwYXVzZWRBdCA9IERhdGUubm93KCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChwYXVzZWRBdCkgewogICAgICB2YXIgZWxhcHNlZCA9IERhdGUubm93KCkgLSBwYXVzZWRBdDsKICAgICAgcGF1c2VkQXQgPSAwOwogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFjdGl2ZVN0YXRlcy5sZW5ndGg7IGorKykgewogICAgICAgIHZhciBzdCA9IGFjdGl2ZVN0YXRlc1tqXTsKICAgICAgICBpZiAoc3QgJiYgIXN0LnNjcnViYmluZykgc3QudDAgKz0gZWxhcHNlZDsKICAgICAgfQogICAgfQogICAgdmFyIG5vdyA9IERhdGUubm93KCk7CiAgICB2YXIgbW90aW9uID0gIXJlZHVjZWRNb3Rpb24oKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWN0aXZlU3RhdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzID0gYWN0aXZlU3RhdGVzW2ldOwogICAgICBpZiAocy5kZXN0cm95ZWQgfHwgcy5zY3J1YmJpbmcgfHwgcy5tb2RlID09PSAiYWZ0ZXJPbmx5IiB8fCBzLm1vZGUgPT09ICJzY3J1YiIpIGNvbnRpbnVlOwogICAgICBpZiAoIW1vdGlvbikgeyBzLmJlZm9yZS5zdHlsZS5vcGFjaXR5ID0gIjEiOyBjb250aW51ZTsgfQogICAgICB2YXIgb3AgPSBjeWNsZU9wYWNpdHkoKG5vdyAtIHMudDApICogcy5zcGVlZCk7CiAgICAgIHMuYmVmb3JlLnN0eWxlLm9wYWNpdHkgPSBvcC50b0ZpeGVkKDMpOwogICAgfQogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spOwogIH0KCiAgZnVuY3Rpb24gY3ljbGVPcGFjaXR5KHQpIHsKICAgIHZhciBwID0gdCAlIENZQ0xFOwogICAgaWYgKHAgPCBGQURFKSByZXR1cm4gMSAtIChwIC8gRkFERSk7CiAgICBwIC09IEZBREU7CiAgICBpZiAocCA8IEhPTERfQUZURVIpIHJldHVybiAwOwogICAgcCAtPSBIT0xEX0FGVEVSOwogICAgaWYgKHAgPCBGQURFKSByZXR1cm4gcCAvIEZBREU7CiAgICByZXR1cm4gMTsKICB9CgogIGZ1bmN0aW9uIHJlZ2lzdGVyU3RhdGUoc3RhdGUpIHsKICAgIGFjdGl2ZVN0YXRlcy5wdXNoKHN0YXRlKTsKICAgIHN0YXJ0TG9vcCgpOwogIH0KCiAgZnVuY3Rpb24gdW5yZWdpc3RlclN0YXRlcyhzdGF0ZXMpIHsKICAgIGlmICghc3RhdGVzIHx8ICFzdGF0ZXMubGVuZ3RoKSByZXR1cm47CiAgICB2YXIgc2V0ID0ge307CiAgICBzdGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAocykgeyBzLmRlc3Ryb3llZCA9IHRydWU7IH0pOwogICAgZm9yICh2YXIgaSA9IGFjdGl2ZVN0YXRlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICBpZiAoYWN0aXZlU3RhdGVzW2ldLmRlc3Ryb3llZCkgYWN0aXZlU3RhdGVzLnNwbGljZShpLCAxKTsKICAgIH0KICAgIHZvaWQgc2V0OwogIH0KCiAgZnVuY3Rpb24gYnVpbGRDYXJkKGl0ZW0sIHByZWZzLCBjdHJsKSB7CiAgICB2YXIgZ2kgPSBpbWFnZU9mKGl0ZW0pOwogICAgdmFyIGFmdGVyID0gYWZ0ZXJVUkwoZ2kpOwogICAgdmFyIGJlZm9yZSA9IGJlZm9yZVVSTChnaSk7CiAgICB2YXIgaGFzQmVmb3JlQWZ0ZXIgPSAhIShiZWZvcmUgJiYgYWZ0ZXIgJiYgYmVmb3JlICE9PSBhZnRlcik7CiAgICB2YXIgYWx0ID0gZ2kuaGlkZVByb21wdCA/ICJJbnNwaXJhdGlvbiIgOiAoZ2kucHJvbXB0IHx8ICJJbnNwaXJhdGlvbiIpOwoKICAgIHZhciBjYXJkID0gZWwoImRpdiIsIHsKICAgICAgY2xhc3M6ICJ2Y2FyZCIsCiAgICAgIHJvbGU6ICJsaXN0aXRlbSIsCiAgICAgIHRhYmluZGV4OiAiMCIsCiAgICAgICJhcmlhLWxhYmVsIjogZ2kucHJvbXB0ID8gKCJJbnNwaXJhdGlvbjogIiArIHRydW5jYXRlKGdpLnByb21wdCwgODApKSA6ICJJbnNwaXJhdGlvbiIsCiAgICAgICJkYXRhLXJlbW90ZS1pZCI6IGdpLnJlbW90ZUlEIHx8IGdpLmlkIHx8ICIiCiAgICB9KTsKCiAgICB2YXIgYWZ0ZXJJbWcgPSBlbCgiaW1nIiwgewogICAgICBjbGFzczogInZhZnRlciIsCiAgICAgIHNyYzogYWZ0ZXIgfHwgYmVmb3JlLAogICAgICBhbHQ6IGFsdCwKICAgICAgbG9hZGluZzogImxhenkiLAogICAgICBkZWNvZGluZzogImFzeW5jIgogICAgfSk7CiAgICBtYXJrQnJva2VuT25FcnJvcihhZnRlckltZywgY2FyZCk7CiAgICBjYXJkLmFwcGVuZENoaWxkKGFmdGVySW1nKTsKCiAgICB2YXIgc3RhdGUgPSBudWxsOwoKICAgIGlmIChoYXNCZWZvcmVBZnRlcikgewogICAgICB2YXIgbW9kZSA9IHByZWZzLmNlbGxNb2RlOwogICAgICB2YXIgYmVmb3JlSW1nID0gZWwoImltZyIsIHsKICAgICAgICBjbGFzczogInZiZWZvcmUiLAogICAgICAgIHNyYzogYmVmb3JlLAogICAgICAgIGFsdDogIkJlZm9yZSIsCiAgICAgICAgbG9hZGluZzogImxhenkiLAogICAgICAgIGRlY29kaW5nOiAiYXN5bmMiCiAgICAgIH0pOwogICAgICBtYXJrQnJva2VuT25FcnJvcihiZWZvcmVJbWcsIGNhcmQpOwogICAgICB2YXIgc2NydWIgPSBlbCgic3BhbiIsIHsgY2xhc3M6ICJ2c2NydWIiLCAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIgfSk7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQoYmVmb3JlSW1nKTsKICAgICAgY2FyZC5hcHBlbmRDaGlsZChzY3J1Yik7CiAgICAgIGNhcmQuc2V0QXR0cmlidXRlKCJkYXRhLWVmZmVjdCIsIHByZWZzLmVmZmVjdCk7CiAgICAgIGNhcmQuc2V0QXR0cmlidXRlKCJkYXRhLW1vZGUiLCBtb2RlKTsKCiAgICAgIGlmIChtb2RlID09PSAiYWZ0ZXJPbmx5IikgewogICAgICAgIGJlZm9yZUltZy5zdHlsZS5vcGFjaXR5ID0gIjAiOwogICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICJzY3J1YiIpIHsKICAgICAgICBiZWZvcmVJbWcuc3R5bGUub3BhY2l0eSA9ICIwLjUiOwogICAgICAgIHNjcnViLnN0eWxlLmxlZnQgPSAiNTAlIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBiZWZvcmVJbWcuc3R5bGUub3BhY2l0eSA9ICIxIjsKICAgICAgfQoKICAgICAgc3RhdGUgPSB7CiAgICAgICAgY2FyZDogY2FyZCwKICAgICAgICBiZWZvcmU6IGJlZm9yZUltZywKICAgICAgICBzY3J1Yjogc2NydWIsCiAgICAgICAgbW9kZTogbW9kZSwKICAgICAgICBzcGVlZDogcHJlZnMuc3BlZWQsCiAgICAgICAgdDA6IERhdGUubm93KCkgLSBNYXRoLnJhbmRvbSgpICogNDAwMCwKICAgICAgICBzY3J1YmJpbmc6IGZhbHNlLAogICAgICAgIHNjcnViUG9zOiAwLjUsCiAgICAgICAgcmVzdW1lVGltZXI6IG51bGwsCiAgICAgICAgZGVzdHJveWVkOiBmYWxzZQogICAgICB9OwogICAgICBhdHRhY2hTY3J1YihjYXJkLCBzdGF0ZSk7CiAgICAgIHJlZ2lzdGVyU3RhdGUoc3RhdGUpOwogICAgfSBlbHNlIHsKICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoImRhdGEtbW9kZSIsICJhZnRlck9ubHkiKTsKICAgIH0KCiAgICBiaW5kVGFwKGNhcmQsIGl0ZW0sIGN0cmwpOwogICAgaWYgKGN0cmwpIGN0cmwuc3RhdGVzLnB1c2goc3RhdGUpOwogICAgcmV0dXJuIGNhcmQ7CiAgfQoKICBmdW5jdGlvbiBiaW5kVGFwKGNhcmQsIGl0ZW0sIGN0cmwpIHsKICAgIHZhciBkb3duWCA9IDAsIGRvd25ZID0gMCwgbW92ZWQgPSBmYWxzZSwgZG93biA9IGZhbHNlOwogICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGRvd24gPSB0cnVlOyBtb3ZlZCA9IGZhbHNlOwogICAgICBkb3duWCA9IGUuY2xpZW50WDsgZG93blkgPSBlLmNsaWVudFk7CiAgICB9KTsKICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoIWRvd24pIHJldHVybjsKICAgICAgaWYgKE1hdGguYWJzKGUuY2xpZW50WCAtIGRvd25YKSA+IFNDUlVCX1RIUkVTSE9MRCB8fCBNYXRoLmFicyhlLmNsaWVudFkgLSBkb3duWSkgPiBTQ1JVQl9USFJFU0hPTEQpIG1vdmVkID0gdHJ1ZTsKICAgIH0pOwogICAgZnVuY3Rpb24gcmVsZWFzZShlKSB7CiAgICAgIGlmICghZG93bikgcmV0dXJuOwogICAgICBkb3duID0gZmFsc2U7CiAgICAgIGlmIChtb3ZlZCB8fCBjYXJkLmNsYXNzTGlzdC5jb250YWlucygic2NydWJiaW5nIikpIHJldHVybjsKICAgICAgdmFyIG9uQXBwbHkgPSBjdHJsID8gY3RybC5vbkFwcGx5IDogbnVsbDsKICAgICAgYXBwbHlFeGFtcGxlVG9DcmVhdG9yKGl0ZW0sIHsgb25BcHBseTogb25BcHBseSB9KTsKICAgIH0KICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgcmVsZWFzZSk7CiAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS5rZXkgPT09ICJFbnRlciIgfHwgZS5rZXkgPT09ICIgIikgewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICBhcHBseUV4YW1wbGVUb0NyZWF0b3IoaXRlbSwgeyBvbkFwcGx5OiBjdHJsID8gY3RybC5vbkFwcGx5IDogbnVsbCB9KTsKICAgICAgfQogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBhdHRhY2hTY3J1YihjYXJkLCBzdGF0ZSkgewogICAgdmFyIHN0YXJ0WCA9IDAsIHN0YXJ0WSA9IDAsIGFjdGl2ZSA9IGZhbHNlLCBkZWNpZGVkID0gZmFsc2UsIGRyYWdnaW5nID0gZmFsc2UsIHBpZCA9IG51bGw7CgogICAgZnVuY3Rpb24gc2V0U2NydWIoY2xpZW50WCkgewogICAgICB2YXIgcmVjdCA9IGNhcmQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGlmIChyZWN0LndpZHRoIDw9IDApIHJldHVybjsKICAgICAgdmFyIHBvcyA9IGNsYW1wMDEoKGNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aCk7CiAgICAgIHN0YXRlLnNjcnViUG9zID0gcG9zOwogICAgICBzdGF0ZS5iZWZvcmUuc3R5bGUub3BhY2l0eSA9ICgxIC0gcG9zKS50b0ZpeGVkKDMpOwogICAgICBzdGF0ZS5zY3J1Yi5zdHlsZS5sZWZ0ID0gKHBvcyAqIDEwMCkgKyAiJSI7CiAgICB9CgogICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChlLnBvaW50ZXJUeXBlID09PSAibW91c2UiICYmIGUuYnV0dG9uICE9PSAwKSByZXR1cm47CiAgICAgIGFjdGl2ZSA9IHRydWU7IGRlY2lkZWQgPSBmYWxzZTsgZHJhZ2dpbmcgPSBmYWxzZTsKICAgICAgc3RhcnRYID0gZS5jbGllbnRYOyBzdGFydFkgPSBlLmNsaWVudFk7CiAgICAgIHBpZCA9IGUucG9pbnRlcklkOwogICAgfSk7CgogICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmICghYWN0aXZlKSByZXR1cm47CiAgICAgIHZhciBkeCA9IGUuY2xpZW50WCAtIHN0YXJ0WDsKICAgICAgdmFyIGR5ID0gZS5jbGllbnRZIC0gc3RhcnRZOwogICAgICBpZiAoIWRlY2lkZWQpIHsKICAgICAgICBpZiAoTWF0aC5hYnMoZHgpIDwgU0NSVUJfVEhSRVNIT0xEICYmIE1hdGguYWJzKGR5KSA8IFNDUlVCX1RIUkVTSE9MRCkgcmV0dXJuOwogICAgICAgIGRlY2lkZWQgPSB0cnVlOwogICAgICAgIGRyYWdnaW5nID0gTWF0aC5hYnMoZHgpID4gTWF0aC5hYnMoZHkpOwogICAgICAgIGlmIChkcmFnZ2luZykgewogICAgICAgICAgc3RhdGUuc2NydWJiaW5nID0gdHJ1ZTsKICAgICAgICAgIGNhcmQuY2xhc3NMaXN0LmFkZCgic2NydWJiaW5nIik7CiAgICAgICAgICBpZiAoc3RhdGUucmVzdW1lVGltZXIpIHsgY2xlYXJUaW1lb3V0KHN0YXRlLnJlc3VtZVRpbWVyKTsgc3RhdGUucmVzdW1lVGltZXIgPSBudWxsOyB9CiAgICAgICAgICB0cnkgeyBjYXJkLnNldFBvaW50ZXJDYXB0dXJlKHBpZCk7IH0gY2F0Y2ggKGVycikge30KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRyYWdnaW5nKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHNldFNjcnViKGUuY2xpZW50WCk7CiAgICAgIH0KICAgIH0pOwoKICAgIGZ1bmN0aW9uIGVuZCgpIHsKICAgICAgaWYgKCFhY3RpdmUpIHJldHVybjsKICAgICAgYWN0aXZlID0gZmFsc2U7CiAgICAgIGlmIChkcmFnZ2luZykgewogICAgICAgIHRyeSB7IGNhcmQucmVsZWFzZVBvaW50ZXJDYXB0dXJlKHBpZCk7IH0gY2F0Y2ggKGVycikge30KICAgICAgICBzY2hlZHVsZVJlc3VtZSgpOwogICAgICB9CiAgICAgIGRyYWdnaW5nID0gZmFsc2U7IGRlY2lkZWQgPSBmYWxzZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzY2hlZHVsZVJlc3VtZSgpIHsKICAgICAgaWYgKHN0YXRlLnJlc3VtZVRpbWVyKSBjbGVhclRpbWVvdXQoc3RhdGUucmVzdW1lVGltZXIpOwogICAgICBzdGF0ZS5yZXN1bWVUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGNhcmQuY2xhc3NMaXN0LnJlbW92ZSgic2NydWJiaW5nIik7CiAgICAgICAgc3RhdGUuc2NydWJiaW5nID0gZmFsc2U7CiAgICAgICAgc3RhdGUudDAgPSBEYXRlLm5vdygpOwogICAgICAgIHN0YXRlLmJlZm9yZS5zdHlsZS5vcGFjaXR5ID0gIjEiOwogICAgICB9LCBTQ1JVQl9SRVNVTUUpOwogICAgfQoKICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgZW5kKTsKICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmNhbmNlbCIsIGVuZCk7CiAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoImxvc3Rwb2ludGVyY2FwdHVyZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGRyYWdnaW5nKSB7IGFjdGl2ZSA9IGZhbHNlOyBkcmFnZ2luZyA9IGZhbHNlOyBkZWNpZGVkID0gZmFsc2U7IHNjaGVkdWxlUmVzdW1lKCk7IH0KICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gbWFya0Jyb2tlbk9uRXJyb3IoaW1nLCBjYXJkKSB7CiAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChpbWcuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2YWZ0ZXIiKSkgewogICAgICAgIHZhciBmYWxsYmFjayA9IGNhcmQucXVlcnlTZWxlY3RvcigiLnZiZWZvcmUiKTsKICAgICAgICB2YXIgZmJTcmMgPSBmYWxsYmFjayAmJiBmYWxsYmFjay5nZXRBdHRyaWJ1dGUoInNyYyIpOwogICAgICAgIGlmIChmYlNyYyAmJiBmYlNyYyAhPT0gaW1nLmdldEF0dHJpYnV0ZSgic3JjIikgJiYgIWltZy5kYXRhc2V0LmZlbGxCYWNrKSB7CiAgICAgICAgICBpbWcuZGF0YXNldC5mZWxsQmFjayA9ICIxIjsKICAgICAgICAgIGltZy5zcmMgPSBmYlNyYzsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW1nLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNhcmQuY2xhc3NMaXN0LmFkZCgidmNhcmQtLWJyb2tlbiIpOwogICAgfSwgeyBvbmNlOiBmYWxzZSB9KTsKICB9CgogIGZ1bmN0aW9uIHRydW5jYXRlKHMsIG4pIHsKICAgIHMgPSBTdHJpbmcocyB8fCAiIik7CiAgICByZXR1cm4gcy5sZW5ndGggPiBuID8gcy5zbGljZSgwLCBuIC0gMSkudHJpbUVuZCgpICsgIuKApiIgOiBzOwogIH0KCiAgZnVuY3Rpb24gQ29sdW1uTGF5b3V0KHJvb3QsIGNvbENvdW50KSB7CiAgICB0aGlzLnJvb3QgPSByb290OwogICAgdGhpcy5jb2xzID0gW107CiAgICB0aGlzLmNvbEggPSBbXTsKICAgIHRoaXMubm9kZXMgPSBbXTsKICAgIHRoaXMuc2V0Q29sdW1ucyhjb2xDb3VudCk7CiAgfQogIENvbHVtbkxheW91dC5wcm90b3R5cGUuc2V0Q29sdW1ucyA9IGZ1bmN0aW9uIChuKSB7CiAgICBuID0gTWF0aC5tYXgoMSwgbiB8IDApOwogICAgaWYgKG4gPT09IHRoaXMuY29scy5sZW5ndGgpIHJldHVybjsKICAgIHZhciBleGlzdGluZyA9IHRoaXMubm9kZXMuc2xpY2UoKTsKICAgIHRoaXMucm9vdC5pbm5lckhUTUwgPSAiIjsKICAgIHRoaXMuY29scyA9IFtdOwogICAgdGhpcy5jb2xIID0gW107CiAgICB0aGlzLm5vZGVzID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgY29sID0gZWwoImRpdiIsIHsgY2xhc3M6ICJ2ZmVlZC1jb2wiIH0pOwogICAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoY29sKTsKICAgICAgdGhpcy5jb2xzLnB1c2goY29sKTsKICAgICAgdGhpcy5jb2xILnB1c2goMCk7CiAgICB9CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBleGlzdGluZy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkgeyBzZWxmLmFkZChlbnRyeS5ub2RlLCBlbnRyeS53ZWlnaHQpOyB9KTsKICB9OwogIENvbHVtbkxheW91dC5wcm90b3R5cGUuX3Nob3J0ZXN0ID0gZnVuY3Rpb24gKCkgewogICAgdmFyIGlkeCA9IDAsIG1pbiA9IEluZmluaXR5OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbEgubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRoaXMuY29sSFtpXSA8IG1pbikgeyBtaW4gPSB0aGlzLmNvbEhbaV07IGlkeCA9IGk7IH0KICAgIH0KICAgIHJldHVybiBpZHg7CiAgfTsKICBDb2x1bW5MYXlvdXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChub2RlLCB3ZWlnaHQpIHsKICAgIHdlaWdodCA9ICh0eXBlb2Ygd2VpZ2h0ID09PSAibnVtYmVyIiAmJiB3ZWlnaHQgPiAwKSA/IHdlaWdodCA6IDE7CiAgICB2YXIgaWR4ID0gdGhpcy5fc2hvcnRlc3QoKTsKICAgIHRoaXMuY29sc1tpZHhdLmFwcGVuZENoaWxkKG5vZGUpOwogICAgdGhpcy5jb2xIW2lkeF0gKz0gd2VpZ2h0OwogICAgdGhpcy5ub2Rlcy5wdXNoKHsgbm9kZTogbm9kZSwgd2VpZ2h0OiB3ZWlnaHQgfSk7CiAgfTsKICBDb2x1bW5MYXlvdXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgewogICAgdGhpcy5jb2xzLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgYy5pbm5lckhUTUwgPSAiIjsgfSk7CiAgICB0aGlzLmNvbEggPSB0aGlzLmNvbEgubWFwKGZ1bmN0aW9uICgpIHsgcmV0dXJuIDA7IH0pOwogICAgdGhpcy5ub2RlcyA9IFtdOwogIH07CgogIGZ1bmN0aW9uIGNvbHVtbnNGb3JXaWR0aCh3LCBncmlkU3R5bGUpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgR1JJRF9TVFlMRVMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKEdSSURfU1RZTEVTW2ldLmtleSA9PT0gZ3JpZFN0eWxlICYmIEdSSURfU1RZTEVTW2ldLmNvbHMpIHJldHVybiBHUklEX1NUWUxFU1tpXS5jb2xzOwogICAgfQogICAgaWYgKCh3aW5kb3cuaW5uZXJXaWR0aCB8fCB3KSA8PSA2NDApIHJldHVybiAyOwogICAgaWYgKHcgPCA1NjApIHJldHVybiAyOwogICAgaWYgKHcgPCA5MDApIHJldHVybiAzOwogICAgaWYgKHcgPCAxMzIwKSByZXR1cm4gNDsKICAgIHJldHVybiA1OwogIH0KCiAgZnVuY3Rpb24gY2FyZFdlaWdodChpdGVtKSB7CiAgICB2YXIgZ2kgPSBpbWFnZU9mKGl0ZW0pOwogICAgdmFyIGFyID0gYXNwZWN0T2YoZ2kpOwogICAgcmV0dXJuIDEgLyBNYXRoLm1heCgwLjMsIGFyIHx8IDAuNzUpOwogIH0KCiAgZnVuY3Rpb24gRmVlZENvbnRyb2xsZXIob3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICB0aGlzLm1vdW50ID0gb3B0aW9ucy5tb3VudDsKICAgIHRoaXMudGFnID0gb3B0aW9ucy50YWcgfHwgIiI7CiAgICB0aGlzLmlubGluZSA9ICEhb3B0aW9ucy5pbmxpbmU7CiAgICB0aGlzLmxpbWl0ID0gb3B0aW9ucy5saW1pdCB8fCAwOwogICAgdGhpcy5wZXIgPSBvcHRpb25zLnBlciB8fCAodGhpcy5pbmxpbmUgPyBNYXRoLm1heChJTkxJTkVfREVGQVVMVCwgdGhpcy5saW1pdCB8fCBJTkxJTkVfREVGQVVMVCkgOiBQRVIpOwogICAgdGhpcy5zaG93Q2hpcHMgPSBvcHRpb25zLnNob3dDaGlwcyAhPT0gZmFsc2UgJiYgIXRoaXMuaW5saW5lOwogICAgdGhpcy5zaG93SGVhZGVyID0gb3B0aW9ucy5zaG93SGVhZGVyICE9PSBmYWxzZSAmJiAhdGhpcy5pbmxpbmU7CiAgICB0aGlzLnNob3dPcHRpb25zID0gb3B0aW9ucy5zaG93T3B0aW9ucyAhPT0gZmFsc2UgJiYgIXRoaXMuaW5saW5lOwogICAgdGhpcy5vbkFwcGx5ID0gdHlwZW9mIG9wdGlvbnMub25BcHBseSA9PT0gImZ1bmN0aW9uIiA/IG9wdGlvbnMub25BcHBseSA6IG51bGw7CiAgICB0aGlzLnByZWZzID0gbG9hZFByZWZzKCk7CgogICAgdGhpcy5wYWdlID0gMTsKICAgIHRoaXMuaXRlbXMgPSBbXTsKICAgIHRoaXMudG90YWwgPSBudWxsOwogICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICB0aGlzLmRvbmUgPSBmYWxzZTsKICAgIHRoaXMuZXJyb3JlZCA9IGZhbHNlOwogICAgdGhpcy5zZWVuID0ge307CiAgICB0aGlzLnN0YXRlcyA9IFtdOwoKICAgIHRoaXMubGF5b3V0ID0gbnVsbDsKICAgIHRoaXMuZ3JpZEVsID0gbnVsbDsKICAgIHRoaXMuc2VudGluZWwgPSBudWxsOwogICAgdGhpcy5zdGF0dXNFbCA9IG51bGw7CiAgICB0aGlzLmNoaXBzQmFyID0gbnVsbDsKICAgIHRoaXMub2JzZXJ2ZXIgPSBudWxsOwogICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTsKICAgIHRoaXMuX29uUmVzaXplID0gbnVsbDsKICAgIHRoaXMuX3JlcVRva2VuID0gMDsKICAgIHRoaXMuX29wdHNSZWYgPSBudWxsOwogIH0KCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciByb290ID0gdGhpcy5tb3VudDsKICAgIHJvb3QuaW5uZXJIVE1MID0gIiI7CgogICAgdmFyIHdyYXAgPSBlbCgiZGl2IiwgeyBjbGFzczogInYtc2VjdGlvbiB2ZmVlZC12aWV3IiArICh0aGlzLmlubGluZSA/ICIgdmZlZWQtdmlldy0taW5saW5lIiA6ICIiKSB9KTsKCiAgICBpZiAodGhpcy5zaG93SGVhZGVyKSB7CiAgICAgIHZhciBoZWFkUm93ID0gZWwoImRpdiIsIHsgY2xhc3M6ICJ2ZmVlZC1oZWFkIiB9KTsKICAgICAgaGVhZFJvdy5hcHBlbmRDaGlsZChlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLWhlYWRfX3RleHQiIH0sIFsKICAgICAgICBlbCgic3BhbiIsIHsgY2xhc3M6ICJ2LWV5ZWJyb3ciLCB0ZXh0OiAiSW5zcGlyYXRpb24iIH0pLAogICAgICAgIGVsKCJoMSIsIHsgY2xhc3M6ICJ2LXNlY3Rpb25fX3RpdGxlIHYtZ3JhZGllbnQiLCB0ZXh0OiAiQ3VyYXRlZCB0cmFuc2Zvcm1hdGlvbnMiIH0pLAogICAgICAgIGVsKCJwIiwgeyB0ZXh0OiAiVGFwIGFueSByZXN1bHQgdG8gbG9hZCBpdHMgcHJvbXB0LiBEcmFnIGFjcm9zcyBhIHRpbGUgdG8gc2NydWIgYmVmb3JlIC8gYWZ0ZXIuIiB9KQogICAgICBdKSk7CiAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKSBoZWFkUm93LmFwcGVuZENoaWxkKHRoaXMuX2J1aWxkT3B0aW9uc1RyaWdnZXIoKSk7CiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQoaGVhZFJvdyk7CiAgICB9CgogICAgaWYgKHRoaXMuc2hvd0NoaXBzKSB7CiAgICAgIHRoaXMuY2hpcHNCYXIgPSB0aGlzLl9idWlsZENoaXBzKCk7CiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQodGhpcy5jaGlwc0Jhcik7CiAgICB9CgogICAgdGhpcy5ncmlkRWwgPSBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkIiwgcm9sZTogImxpc3QiLCAiYXJpYS1sYWJlbCI6ICJDdXJhdGVkIGluc3BpcmF0aW9uIGdhbGxlcnkiIH0pOwogICAgd3JhcC5hcHBlbmRDaGlsZCh0aGlzLmdyaWRFbCk7CgogICAgdmFyIGZvb3RlciA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidmZlZWQtY3RhIiB9KTsKICAgIHRoaXMuc3RhdHVzRWwgPSBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLWxvYWRpbmciLCAiYXJpYS1saXZlIjogInBvbGl0ZSIgfSk7CiAgICB0aGlzLnNlbnRpbmVsID0gZWwoImRpdiIsIHsgY2xhc3M6ICJ2ZmVlZC1zZW50aW5lbCIsICJhcmlhLWhpZGRlbiI6ICJ0cnVlIiB9KTsKICAgIGZvb3Rlci5hcHBlbmRDaGlsZCh0aGlzLnN0YXR1c0VsKTsKICAgIGZvb3Rlci5hcHBlbmRDaGlsZCh0aGlzLnNlbnRpbmVsKTsKICAgIHdyYXAuYXBwZW5kQ2hpbGQoZm9vdGVyKTsKCiAgICByb290LmFwcGVuZENoaWxkKHdyYXApOwoKICAgIHRoaXMuX2FwcGx5R3JpZEF0dHJzKCk7CiAgICB2YXIgY29scyA9IGNvbHVtbnNGb3JXaWR0aCh0aGlzLmdyaWRFbC5jbGllbnRXaWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAxMDI0LCB0aGlzLnByZWZzLmdyaWRTdHlsZSk7CiAgICB0aGlzLmxheW91dCA9IG5ldyBDb2x1bW5MYXlvdXQodGhpcy5ncmlkRWwsIGNvbHMpOwogICAgdGhpcy5fc2hvd1NrZWxldG9ucyhNYXRoLm1pbih0aGlzLnBlciwgdGhpcy5pbmxpbmUgPyAodGhpcy5saW1pdCB8fCBJTkxJTkVfREVGQVVMVCkgOiA5KSk7CgogICAgdGhpcy5fc2V0dXBSZXNpemUoKTsKICAgIHRoaXMuX3NldHVwT2JzZXJ2ZXIoKTsKICAgIHRoaXMubG9hZE5leHQodHJ1ZSk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9hcHBseUdyaWRBdHRycyA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdGhpcy5ncmlkRWwpIHJldHVybjsKICAgIHRoaXMuZ3JpZEVsLnNldEF0dHJpYnV0ZSgiZGF0YS1ncmlkIiwgdGhpcy5wcmVmcy5ncmlkU3R5bGUpOwogICAgdGhpcy5ncmlkRWwuc2V0QXR0cmlidXRlKCJkYXRhLWNlbGxtb2RlIiwgdGhpcy5wcmVmcy5jZWxsTW9kZSk7CiAgICB0aGlzLmdyaWRFbC5zZXRBdHRyaWJ1dGUoImRhdGEtZWZmZWN0IiwgdGhpcy5wcmVmcy5lZmZlY3QpOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fYnVpbGRPcHRpb25zVHJpZ2dlciA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciBidG4gPSBlbCgiYnV0dG9uIiwgewogICAgICBjbGFzczogInYtY3RhIHYtY3RhLS1naG9zdCB2ZmVlZC1vcHRpb25zLXRyaWdnZXIiLAogICAgICB0eXBlOiAiYnV0dG9uIiwKICAgICAgImFyaWEtaGFzcG9wdXAiOiAiZGlhbG9nIiwKICAgICAgdGl0bGU6ICJEaXNwbGF5IG9wdGlvbnMiLAogICAgICAiYXJpYS1sYWJlbCI6ICJEaXNwbGF5IG9wdGlvbnMiCiAgICB9LCBbCiAgICAgIGVsKCJzcGFuIiwgeyBjbGFzczogInZmZWVkLW9wdGlvbnMtdHJpZ2dlcl9faWNvIiwgImFyaWEtaGlkZGVuIjogInRydWUiLCBodG1sOiBvcHRpb25zR2x5cGgoKSB9KSwKICAgICAgZWwoInNwYW4iLCB7IHRleHQ6ICJEaXNwbGF5IiB9KQogICAgXSk7CiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IHNlbGYuX29wZW5PcHRpb25zKCk7IH0pOwogICAgcmV0dXJuIGJ0bjsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX29wZW5PcHRpb25zID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIGNvbnRlbnQgPSBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLW9wdHMiIH0pOwoKICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQoZWwoImgyIiwgeyBjbGFzczogInZmZWVkLW9wdHNfX3RpdGxlIiwgdGV4dDogIkRpc3BsYXkgb3B0aW9ucyIgfSkpOwoKICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5fc2VnbWVudFJvdygiR3JpZCIsIEdSSURfU1RZTEVTLCB0aGlzLnByZWZzLmdyaWRTdHlsZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgc2VsZi5fc2V0UHJlZigiZ3JpZFN0eWxlIiwgdik7CiAgICAgIHNlbGYuX3JlZmxvd0NvbHVtbnMoKTsKICAgIH0pKTsKCiAgICBjb250ZW50LmFwcGVuZENoaWxkKHRoaXMuX3NlZ21lbnRSb3coIkNlbGwgbW9kZSIsIENFTExfTU9ERVMsIHRoaXMucHJlZnMuY2VsbE1vZGUsIGZ1bmN0aW9uICh2KSB7CiAgICAgIHNlbGYuX3NldFByZWYoImNlbGxNb2RlIiwgdik7CiAgICAgIHNlbGYuX3JlcmVuZGVyQ2FyZHMoKTsKICAgIH0pKTsKCiAgICBjb250ZW50LmFwcGVuZENoaWxkKHRoaXMuX3NsaWRlclJvdygiU3BlZWQiLCAwLjI1LCAzLjAsIDAuMjUsIHRoaXMucHJlZnMuc3BlZWQsIGZ1bmN0aW9uIChuKSB7IHJldHVybiBuLnRvRml4ZWQoMikgKyAiw5ciOyB9LCBmdW5jdGlvbiAodikgewogICAgICBzZWxmLl9zZXRQcmVmKCJzcGVlZCIsIHYpOwogICAgICBzZWxmLnN0YXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7IGlmIChzKSBzLnNwZWVkID0gdjsgfSk7CiAgICB9KSk7CgogICAgY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLl9zZWxlY3RSb3coIkVmZmVjdCIsIEVGRkVDVFMsIHRoaXMucHJlZnMuZWZmZWN0LCBmdW5jdGlvbiAodikgewogICAgICBzZWxmLl9zZXRQcmVmKCJlZmZlY3QiLCB2KTsKICAgICAgc2VsZi5fYXBwbHlFZmZlY3QoKTsKICAgIH0pKTsKCiAgICB2YXIgcmVzZXRCdG4gPSBlbCgiYnV0dG9uIiwgeyBjbGFzczogInYtY3RhIHYtY3RhLS1naG9zdCB2ZmVlZC1vcHRzX19yZXNldCIsIHR5cGU6ICJidXR0b24iLCB0ZXh0OiAiUmVzZXQgdG8gZGVmYXVsdHMiIH0pOwogICAgcmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgIHNlbGYucHJlZnMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1BSRUZTKTsKICAgICAgT2JqZWN0LmtleXMoREVGQVVMVF9QUkVGUykuZm9yRWFjaChmdW5jdGlvbiAoaykgeyBwcmVmU2V0KGssIERFRkFVTFRfUFJFRlNba10pOyB9KTsKICAgICAgaWYgKHNlbGYuX29wdHNSZWYgJiYgc2VsZi5fb3B0c1JlZi5jbG9zZSkgc2VsZi5fb3B0c1JlZi5jbG9zZSgpOwogICAgICBzZWxmLl9yZWZsb3dDb2x1bW5zKCk7CiAgICAgIHNlbGYuX3JlcmVuZGVyQ2FyZHMoKTsKICAgIH0pOwogICAgY29udGVudC5hcHBlbmRDaGlsZChyZXNldEJ0bik7CgogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuc2hlZXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgdGhpcy5fb3B0c1JlZiA9IFYudWkuc2hlZXQoY29udGVudCwgeyBhcmlhTGFiZWw6ICJEaXNwbGF5IG9wdGlvbnMiLCBjbGFzc05hbWU6ICJ2ZmVlZC1vcHRzLXNoZWV0IiB9KTsKICAgIH0gZWxzZSBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5tb2RhbCA9PT0gImZ1bmN0aW9uIikgewogICAgICB0aGlzLl9vcHRzUmVmID0gVi51aS5tb2RhbChjb250ZW50LCB7IGFyaWFMYWJlbDogIkRpc3BsYXkgb3B0aW9ucyIsIGNsYXNzTmFtZTogInZmZWVkLW9wdHMtc2hlZXQiIH0pOwogICAgfQogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fc2V0UHJlZiA9IGZ1bmN0aW9uIChrZXksIHZhbCkgewogICAgdGhpcy5wcmVmc1trZXldID0gdmFsOwogICAgcHJlZlNldChrZXksIHZhbCk7CiAgICBpZiAoa2V5ID09PSAiZ3JpZFN0eWxlIiB8fCBrZXkgPT09ICJjZWxsTW9kZSIgfHwga2V5ID09PSAiZWZmZWN0IikgdGhpcy5fYXBwbHlHcmlkQXR0cnMoKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX2FwcGx5RWZmZWN0ID0gZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLmdyaWRFbCkgcmV0dXJuOwogICAgdmFyIGVmZiA9IHRoaXMucHJlZnMuZWZmZWN0OwogICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0aGlzLmdyaWRFbC5xdWVyeVNlbGVjdG9yQWxsKCIudmNhcmRbZGF0YS1tb2RlXSIpLCBmdW5jdGlvbiAoYykgewogICAgICBpZiAoYy5nZXRBdHRyaWJ1dGUoImRhdGEtbW9kZSIpICE9PSAiYWZ0ZXJPbmx5IikgYy5zZXRBdHRyaWJ1dGUoImRhdGEtZWZmZWN0IiwgZWZmKTsKICAgIH0pOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fc2VnbWVudFJvdyA9IGZ1bmN0aW9uIChsYWJlbCwgb3B0aW9ucywgdmFsdWUsIG9uUGljaykgewogICAgdmFyIHNlZyA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidmZlZWQtc2VnIiwgcm9sZTogInJhZGlvZ3JvdXAiLCAiYXJpYS1sYWJlbCI6IGxhYmVsIH0pOwogICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvcHQpIHsKICAgICAgdmFyIGFjdGl2ZSA9IG9wdC5rZXkgPT09IHZhbHVlOwogICAgICB2YXIgYiA9IGVsKCJidXR0b24iLCB7CiAgICAgICAgY2xhc3M6ICJ2ZmVlZC1zZWdfX2J0biIgKyAoYWN0aXZlID8gIiBpcy1hY3RpdmUiIDogIiIpLAogICAgICAgIHR5cGU6ICJidXR0b24iLAogICAgICAgIHJvbGU6ICJyYWRpbyIsCiAgICAgICAgImFyaWEtY2hlY2tlZCI6IGFjdGl2ZSA/ICJ0cnVlIiA6ICJmYWxzZSIsCiAgICAgICAgImRhdGEtdmFsIjogb3B0LmtleSwKICAgICAgICB0ZXh0OiBvcHQubGFiZWwKICAgICAgfSk7CiAgICAgIGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzZWcucXVlcnlTZWxlY3RvckFsbCgiLnZmZWVkLXNlZ19fYnRuIiksIGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICB2YXIgb24gPSBuLmdldEF0dHJpYnV0ZSgiZGF0YS12YWwiKSA9PT0gb3B0LmtleTsKICAgICAgICAgIG4uY2xhc3NMaXN0LnRvZ2dsZSgiaXMtYWN0aXZlIiwgb24pOwogICAgICAgICAgbi5zZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIsIG9uID8gInRydWUiIDogImZhbHNlIik7CiAgICAgICAgfSk7CiAgICAgICAgb25QaWNrKG9wdC5rZXkpOwogICAgICB9KTsKICAgICAgc2VnLmFwcGVuZENoaWxkKGIpOwogICAgfSk7CiAgICByZXR1cm4gZWwoImRpdiIsIHsgY2xhc3M6ICJ2ZmVlZC1vcHRzX19yb3ciIH0sIFsKICAgICAgZWwoInNwYW4iLCB7IGNsYXNzOiAidmZlZWQtb3B0c19fbGFiZWwiLCB0ZXh0OiBsYWJlbCB9KSwKICAgICAgc2VnCiAgICBdKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX3NlbGVjdFJvdyA9IGZ1bmN0aW9uIChsYWJlbCwgb3B0aW9ucywgdmFsdWUsIG9uUGljaykgewogICAgdmFyIHNlbCA9IGVsKCJzZWxlY3QiLCB7IGNsYXNzOiAidi1zZWxlY3QgdmZlZWQtb3B0c19fc2VsZWN0IiwgImFyaWEtbGFiZWwiOiBsYWJlbCB9KTsKICAgIG9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob3B0KSB7CiAgICAgIHZhciBvID0gZWwoIm9wdGlvbiIsIHsgdmFsdWU6IG9wdC5rZXksIHRleHQ6IG9wdC5sYWJlbCB9KTsKICAgICAgaWYgKG9wdC5rZXkgPT09IHZhbHVlKSBvLnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgc2VsLmFwcGVuZENoaWxkKG8pOwogICAgfSk7CiAgICBzZWwuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgeyBvblBpY2soc2VsLnZhbHVlKTsgfSk7CiAgICByZXR1cm4gZWwoImRpdiIsIHsgY2xhc3M6ICJ2ZmVlZC1vcHRzX19yb3ciIH0sIFsKICAgICAgZWwoInNwYW4iLCB7IGNsYXNzOiAidmZlZWQtb3B0c19fbGFiZWwiLCB0ZXh0OiBsYWJlbCB9KSwKICAgICAgc2VsCiAgICBdKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX3NsaWRlclJvdyA9IGZ1bmN0aW9uIChsYWJlbCwgbWluLCBtYXgsIHN0ZXAsIHZhbHVlLCBmbXQsIG9uSW5wdXQpIHsKICAgIHZhciB2YWxFbCA9IGVsKCJzcGFuIiwgeyBjbGFzczogInZmZWVkLW9wdHNfX3ZhbCIsIHRleHQ6IGZtdCh2YWx1ZSkgfSk7CiAgICB2YXIgaW5wdXQgPSBlbCgiaW5wdXQiLCB7CiAgICAgIHR5cGU6ICJyYW5nZSIsCiAgICAgIGNsYXNzOiAidmZlZWQtcmFuZ2UiLAogICAgICBtaW46IFN0cmluZyhtaW4pLAogICAgICBtYXg6IFN0cmluZyhtYXgpLAogICAgICBzdGVwOiBTdHJpbmcoc3RlcCksCiAgICAgIHZhbHVlOiBTdHJpbmcodmFsdWUpLAogICAgICAiYXJpYS1sYWJlbCI6IGxhYmVsCiAgICB9KTsKICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gKCkgewogICAgICB2YXIgbiA9IE51bWJlcihpbnB1dC52YWx1ZSk7CiAgICAgIHZhbEVsLnRleHRDb250ZW50ID0gZm10KG4pOwogICAgICBvbklucHV0KG4pOwogICAgfSk7CiAgICByZXR1cm4gZWwoImRpdiIsIHsgY2xhc3M6ICJ2ZmVlZC1vcHRzX19yb3cgdmZlZWQtb3B0c19fcm93LS1zbGlkZXIiIH0sIFsKICAgICAgZWwoImRpdiIsIHsgY2xhc3M6ICJ2ZmVlZC1vcHRzX19zbGlkZXJoZWFkIiB9LCBbCiAgICAgICAgZWwoInNwYW4iLCB7IGNsYXNzOiAidmZlZWQtb3B0c19fbGFiZWwiLCB0ZXh0OiBsYWJlbCB9KSwKICAgICAgICB2YWxFbAogICAgICBdKSwKICAgICAgaW5wdXQKICAgIF0pOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fcmVmbG93Q29sdW1ucyA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLmRlc3Ryb3llZCB8fCAhdGhpcy5sYXlvdXQgfHwgIXRoaXMuZ3JpZEVsKSByZXR1cm47CiAgICB0aGlzLl9hcHBseUdyaWRBdHRycygpOwogICAgdmFyIGNvbHMgPSBjb2x1bW5zRm9yV2lkdGgodGhpcy5ncmlkRWwuY2xpZW50V2lkdGggfHwgd2luZG93LmlubmVyV2lkdGggfHwgMTAyNCwgdGhpcy5wcmVmcy5ncmlkU3R5bGUpOwogICAgdGhpcy5sYXlvdXQuc2V0Q29sdW1ucyhjb2xzKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX3JlcmVuZGVyQ2FyZHMgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMubGF5b3V0KSByZXR1cm47CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB1bnJlZ2lzdGVyU3RhdGVzKHRoaXMuc3RhdGVzKTsKICAgIHRoaXMuc3RhdGVzID0gW107CiAgICB0aGlzLmxheW91dC5jbGVhcigpOwogICAgdGhpcy5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdCkgewogICAgICBzZWxmLmxheW91dC5hZGQoYnVpbGRDYXJkKGl0LCBzZWxmLnByZWZzLCBzZWxmKSwgY2FyZFdlaWdodChpdCkpOwogICAgfSk7CiAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggPT09IDAgJiYgdGhpcy5kb25lICYmICF0aGlzLmVycm9yZWQpIHRoaXMuX3JlbmRlckVtcHR5KCk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9idWlsZENoaXBzID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIGJhciA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidi1jaGlwLXJvdyB2ZmVlZC1jaGlwcyIsIHJvbGU6ICJ0YWJsaXN0IiwgImFyaWEtbGFiZWwiOiAiRmlsdGVyIGJ5IHRoZW1lIiB9KTsKICAgIFRBR1MuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICB2YXIgYWN0aXZlID0gKHQua2V5ID09PSBzZWxmLnRhZyk7CiAgICAgIHZhciBjaGlwID0gZWwoImJ1dHRvbiIsIHsKICAgICAgICBjbGFzczogInYtY2hpcCIgKyAoYWN0aXZlID8gIiB2LWNoaXAtLWFjdGl2ZSIgOiAiIiksCiAgICAgICAgdHlwZTogImJ1dHRvbiIsCiAgICAgICAgcm9sZTogInRhYiIsCiAgICAgICAgImFyaWEtc2VsZWN0ZWQiOiBhY3RpdmUgPyAidHJ1ZSIgOiAiZmFsc2UiLAogICAgICAgICJkYXRhLXRhZyI6IHQua2V5LAogICAgICAgIHRleHQ6IHQubGFiZWwKICAgICAgfSk7CiAgICAgIGNoaXAuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHNlbGYudGFnID09PSB0LmtleSkgcmV0dXJuOwogICAgICAgIHNlbGYuc2V0VGFnKHQua2V5KTsKICAgICAgICB2YXIgbnEgPSAiIy9pbnNwaXJhdGlvbiIgKyAodC5rZXkgPyAiP3RhZz0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHQua2V5KSA6ICIiKTsKICAgICAgICBpZiAobG9jYXRpb24uaGFzaCAhPT0gbnEpIHsKICAgICAgICAgIGlmIChWLnJvdXRlciAmJiB0eXBlb2YgVi5yb3V0ZXIucmVwbGFjZSA9PT0gImZ1bmN0aW9uIikgVi5yb3V0ZXIucmVwbGFjZShucSk7CiAgICAgICAgICBlbHNlIGhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsICIiLCBucSk7CiAgICAgICAgfQogICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYmFyLnF1ZXJ5U2VsZWN0b3JBbGwoIi52LWNoaXAiKSwgZnVuY3Rpb24gKGMpIHsKICAgICAgICAgIHZhciBvbiA9IGMuZ2V0QXR0cmlidXRlKCJkYXRhLXRhZyIpID09PSB0LmtleTsKICAgICAgICAgIGMuY2xhc3NMaXN0LnRvZ2dsZSgidi1jaGlwLS1hY3RpdmUiLCBvbik7CiAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsIG9uID8gInRydWUiIDogImZhbHNlIik7CiAgICAgICAgfSk7CiAgICAgICAgdHJ5IHsgY2hpcC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAic21vb3RoIiwgaW5saW5lOiAiY2VudGVyIiwgYmxvY2s6ICJuZWFyZXN0IiB9KTsgfSBjYXRjaCAoZSkge30KICAgICAgfSk7CiAgICAgIGJhci5hcHBlbmRDaGlsZChjaGlwKTsKICAgIH0pOwogICAgcmV0dXJuIGJhcjsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuc2V0VGFnID0gZnVuY3Rpb24gKHRhZykgewogICAgdGFnID0gdGFnIHx8ICIiOwogICAgaWYgKHRhZyA9PT0gdGhpcy50YWcpIHJldHVybjsKICAgIHRoaXMudGFnID0gdGFnOwogICAgdGhpcy5fcmVsb2FkKCk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9yZWxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICB0aGlzLl9yZXFUb2tlbisrOwogICAgdGhpcy5wYWdlID0gMTsKICAgIHRoaXMuaXRlbXMgPSBbXTsKICAgIHRoaXMudG90YWwgPSBudWxsOwogICAgdGhpcy5kb25lID0gZmFsc2U7CiAgICB0aGlzLmVycm9yZWQgPSBmYWxzZTsKICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgdGhpcy5zZWVuID0ge307CiAgICB1bnJlZ2lzdGVyU3RhdGVzKHRoaXMuc3RhdGVzKTsKICAgIHRoaXMuc3RhdGVzID0gW107CiAgICBpZiAodGhpcy5sYXlvdXQpIHRoaXMubGF5b3V0LmNsZWFyKCk7CiAgICB0aGlzLl9zaG93U2tlbGV0b25zKE1hdGgubWluKHRoaXMucGVyLCA5KSk7CiAgICB0aGlzLmxvYWROZXh0KHRydWUpOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fc2hvd1NrZWxldG9ucyA9IGZ1bmN0aW9uIChuKSB7CiAgICBpZiAoIXRoaXMubGF5b3V0KSByZXR1cm47CiAgICB0aGlzLmxheW91dC5jbGVhcigpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgdmFyIHNrOwogICAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5za2VsZXRvbiA9PT0gImZ1bmN0aW9uIikgc2sgPSBWLnVpLnNrZWxldG9uKCJjYXJkIik7CiAgICAgIGVsc2Ugc2sgPSBlbCgiZGl2IiwgeyBjbGFzczogInYtc2tlbGV0b24iIH0pOwogICAgICBpZiAoc2sgJiYgc2suY2xhc3NMaXN0KSBzay5jbGFzc0xpc3QuYWRkKCJ2ZmVlZC1za2VsIik7CiAgICAgIGlmIChzayAmJiBzay5zdHlsZSkgc2suc3R5bGUubWluSGVpZ2h0ID0gKDE4MCArICgoaSAqIDUzKSAlIDE0MCkpICsgInB4IjsKICAgICAgdGhpcy5sYXlvdXQuYWRkKHNrLCAxICsgKChpICogMC4zNykgJSAwLjkpKTsKICAgIH0KICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX2NsZWFyU2tlbGV0b25zID0gZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLmdyaWRFbCkgcmV0dXJuOwogICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0aGlzLmdyaWRFbC5xdWVyeVNlbGVjdG9yQWxsKCIudmZlZWQtc2tlbCIpLCBmdW5jdGlvbiAobikgewogICAgICBpZiAobi5wYXJlbnROb2RlKSBuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobik7CiAgICB9KTsKICAgIGlmICh0aGlzLmxheW91dCkgewogICAgICB0aGlzLmxheW91dC5jb2xIID0gdGhpcy5sYXlvdXQuY29sSC5tYXAoZnVuY3Rpb24gKCkgeyByZXR1cm4gMDsgfSk7CiAgICAgIHRoaXMubGF5b3V0Lm5vZGVzID0gW107CiAgICB9CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLmxvYWROZXh0ID0gZnVuY3Rpb24gKGlzRmlyc3QpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIGlmICh0aGlzLmxvYWRpbmcgfHwgdGhpcy5kb25lIHx8IHRoaXMuZGVzdHJveWVkKSByZXR1cm47CiAgICBpZiAodGhpcy5saW1pdCAmJiB0aGlzLml0ZW1zLmxlbmd0aCA+PSB0aGlzLmxpbWl0KSB7IHRoaXMuZG9uZSA9IHRydWU7IHRoaXMuX3JlbmRlckZvb3RlcigpOyByZXR1cm47IH0KCiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgdGhpcy5lcnJvcmVkID0gZmFsc2U7CiAgICB2YXIgdG9rZW4gPSArK3RoaXMuX3JlcVRva2VuOwogICAgdGhpcy5fcmVuZGVyRm9vdGVyKCk7CgogICAgdmFyIGZldGNoZXIgPSAoVi5hcGkgJiYgdHlwZW9mIFYuYXBpLmN1cmF0ZWRGZWVkID09PSAiZnVuY3Rpb24iKQogICAgICA/IFYuYXBpLmN1cmF0ZWRGZWVkKHRoaXMucGFnZSwgdGhpcy5wZXIsIHRoaXMudGFnIHx8IG51bGwpCiAgICAgIDogUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJGZWVkIEFQSSB1bmF2YWlsYWJsZSIpKTsKCiAgICBQcm9taXNlLnJlc29sdmUoZmV0Y2hlcikudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgIGlmIChzZWxmLmRlc3Ryb3llZCB8fCB0b2tlbiAhPT0gc2VsZi5fcmVxVG9rZW4pIHJldHVybjsKICAgICAgc2VsZi5sb2FkaW5nID0gZmFsc2U7CgogICAgICB2YXIgaXRlbXMgPSBbXTsKICAgICAgdmFyIG1ldGEgPSBudWxsOwogICAgICBpZiAocmVzICYmIEFycmF5LmlzQXJyYXkocmVzLml0ZW1zKSkgeyBpdGVtcyA9IHJlcy5pdGVtczsgbWV0YSA9IHJlcy5tZXRhZGF0YSB8fCBudWxsOyB9CiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkgeyBpdGVtcyA9IHJlczsgfQoKICAgICAgaWYgKG1ldGEgJiYgdHlwZW9mIG1ldGEudG90YWwgPT09ICJudW1iZXIiKSBzZWxmLnRvdGFsID0gbWV0YS50b3RhbDsKCiAgICAgIGlmIChpc0ZpcnN0KSBzZWxmLl9jbGVhclNrZWxldG9ucygpOwoKICAgICAgdmFyIGFkZGVkID0gMDsKICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXQpIHsKICAgICAgICB2YXIgZ2kgPSBpbWFnZU9mKGl0KTsKICAgICAgICBpZiAoIWFmdGVyVVJMKGdpKSAmJiAhYmVmb3JlVVJMKGdpKSkgcmV0dXJuOwogICAgICAgIHZhciBpZCA9IGdpLnJlbW90ZUlEIHx8IGdpLmlkOwogICAgICAgIHZhciBka2V5ID0gaWQgfHwgKGFmdGVyVVJMKGdpKSArICJ8IiArIChnaS5wcm9tcHQgfHwgIiIpKTsKICAgICAgICBpZiAoc2VsZi5zZWVuW2RrZXldKSByZXR1cm47CiAgICAgICAgc2VsZi5zZWVuW2RrZXldID0gdHJ1ZTsKICAgICAgICBpZiAoc2VsZi5saW1pdCAmJiBzZWxmLml0ZW1zLmxlbmd0aCA+PSBzZWxmLmxpbWl0KSByZXR1cm47CiAgICAgICAgc2VsZi5pdGVtcy5wdXNoKGl0KTsKICAgICAgICBzZWxmLmxheW91dC5hZGQoYnVpbGRDYXJkKGl0LCBzZWxmLnByZWZzLCBzZWxmKSwgY2FyZFdlaWdodChpdCkpOwogICAgICAgIGFkZGVkKys7CiAgICAgIH0pOwoKICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA8IHNlbGYucGVyKSBzZWxmLmRvbmUgPSB0cnVlOwogICAgICBpZiAoc2VsZi5saW1pdCAmJiBzZWxmLml0ZW1zLmxlbmd0aCA+PSBzZWxmLmxpbWl0KSBzZWxmLmRvbmUgPSB0cnVlOwogICAgICBpZiAoc2VsZi50b3RhbCAhPSBudWxsICYmIHNlbGYuaXRlbXMubGVuZ3RoID49IHNlbGYudG90YWwpIHNlbGYuZG9uZSA9IHRydWU7CgogICAgICBpZiAoYWRkZWQgPiAwIHx8IHNlbGYuaXRlbXMubGVuZ3RoID4gMCkgc2VsZi5wYWdlKys7CgogICAgICBpZiAoaXNGaXJzdCAmJiBzZWxmLml0ZW1zLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHNlbGYuZG9uZSA9IHRydWU7CiAgICAgICAgc2VsZi5fcmVuZGVyRW1wdHkoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHNlbGYuX3JlbmRlckZvb3RlcigpOwogICAgICBzZWxmLl9tYXliZUF1dG9Mb2FkKCk7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIGlmIChzZWxmLmRlc3Ryb3llZCB8fCB0b2tlbiAhPT0gc2VsZi5fcmVxVG9rZW4pIHJldHVybjsKICAgICAgc2VsZi5sb2FkaW5nID0gZmFsc2U7CiAgICAgIHNlbGYuZXJyb3JlZCA9IHRydWU7CiAgICAgIGlmIChpc0ZpcnN0KSB7CiAgICAgICAgc2VsZi5fY2xlYXJTa2VsZXRvbnMoKTsKICAgICAgICBpZiAoc2VsZi5pdGVtcy5sZW5ndGggPT09IDApIHsgc2VsZi5fcmVuZGVyRXJyb3IoZXJyKTsgcmV0dXJuOyB9CiAgICAgIH0KICAgICAgc2VsZi5fcmVuZGVyRm9vdGVyKCk7CiAgICB9KTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX21heWJlQXV0b0xvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAodGhpcy5kb25lIHx8IHRoaXMubG9hZGluZyB8fCB0aGlzLmRlc3Ryb3llZCB8fCAhdGhpcy5zZW50aW5lbCkgcmV0dXJuOwogICAgdmFyIHIgPSB0aGlzLnNlbnRpbmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgdmFyIHZoID0gd2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7CiAgICBpZiAoci50b3AgPCB2aCArIDMwMCkgewogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkgeyBzZWxmLmxvYWROZXh0KCk7IH0pOwogICAgfQogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fcmVuZGVyRm9vdGVyID0gZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLnN0YXR1c0VsKSByZXR1cm47CiAgICB2YXIgcyA9IHRoaXMuc3RhdHVzRWw7CiAgICBzLmlubmVySFRNTCA9ICIiOwogICAgaWYgKHRoaXMubG9hZGluZykgewogICAgICB2YXIgc3BpbiA9IChWLnVpICYmIHR5cGVvZiBWLnVpLnNwaW5uZXIgPT09ICJmdW5jdGlvbiIpID8gVi51aS5zcGlubmVyKCkgOiBlbCgic3BhbiIsIHsgY2xhc3M6ICJ2LXNwaW5uZXIiIH0pOwogICAgICBzLmFwcGVuZENoaWxkKHNwaW4pOwogICAgICBzLmFwcGVuZENoaWxkKGVsKCJzcGFuIiwgeyB0ZXh0OiB0aGlzLml0ZW1zLmxlbmd0aCA/ICJMb2FkaW5nIG1vcmXigKYiIDogIkxvYWRpbmcgaW5zcGlyYXRpb27igKYiIH0pKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuZXJyb3JlZCkgewogICAgICBzLmFwcGVuZENoaWxkKGVsKCJzcGFuIiwgeyB0ZXh0OiAiQ291bGRu4oCZdCBsb2FkIG1vcmUgcmVzdWx0cy4iIH0pKTsKICAgICAgdmFyIHJldHJ5ID0gZWwoImJ1dHRvbiIsIHsgY2xhc3M6ICJ2LWN0YSB2LWN0YS0tZ2hvc3QgdmZlZWQtcmV0cnkiLCB0eXBlOiAiYnV0dG9uIiwgdGV4dDogIlJldHJ5IiB9KTsKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICByZXRyeS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsgc2VsZi5sb2FkTmV4dCgpOyB9KTsKICAgICAgcy5hcHBlbmRDaGlsZChyZXRyeSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5pdGVtcy5sZW5ndGggPiAwICYmICF0aGlzLmlubGluZSkgewogICAgICBzLmFwcGVuZENoaWxkKGVsKCJzcGFuIiwgeyB0ZXh0OiAiWW914oCZdmUgcmVhY2hlZCB0aGUgZW5kLiIgfSkpOwogICAgfQogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fcmVuZGVyRW1wdHkgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBpZiAodGhpcy5sYXlvdXQpIHRoaXMubGF5b3V0LmNsZWFyKCk7CiAgICBpZiAodGhpcy5zdGF0dXNFbCkgdGhpcy5zdGF0dXNFbC5pbm5lckhUTUwgPSAiIjsKICAgIHZhciBtc2cgPSB0aGlzLnRhZwogICAgICA/ICJObyBpbnNwaXJhdGlvbiBmb3VuZCBmb3Ig4oCcIiArIHRoaXMudGFnICsgIuKAnSB5ZXQuIgogICAgICA6ICJObyBpbnNwaXJhdGlvbiB0byBzaG93IHlldC4iOwogICAgdmFyIGFjdGlvbkxhYmVsID0gdGhpcy50YWcgPyAiQ2xlYXIgZmlsdGVyIiA6ICJTdGFydCBjcmVhdGluZyI7CiAgICB2YXIgb25BY3Rpb24gPSB0aGlzLnRhZwogICAgICA/IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHNlbGYuc2V0VGFnKCIiKTsKICAgICAgICAgIGlmIChzZWxmLmNoaXBzQmFyKSB7CiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoc2VsZi5jaGlwc0Jhci5xdWVyeVNlbGVjdG9yQWxsKCIudi1jaGlwIiksIGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgICAgdmFyIG9uID0gYy5nZXRBdHRyaWJ1dGUoImRhdGEtdGFnIikgPT09ICIiOwogICAgICAgICAgICAgIGMuY2xhc3NMaXN0LnRvZ2dsZSgidi1jaGlwLS1hY3RpdmUiLCBvbik7CiAgICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGUoImFyaWEtc2VsZWN0ZWQiLCBvbiA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIDogZnVuY3Rpb24gKCkgeyBnbygiIy9jcmVhdGUiKTsgfTsKCiAgICB2YXIgZW1wdHlOb2RlOwogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuZW1wdHkgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgZW1wdHlOb2RlID0gVi51aS5lbXB0eShtc2csIGFjdGlvbkxhYmVsLCBvbkFjdGlvbik7CiAgICB9IGVsc2UgewogICAgICBlbXB0eU5vZGUgPSBlbCgiZGl2IiwgeyBjbGFzczogInYtZW1wdHkiIH0sIFsKICAgICAgICBlbCgicCIsIHsgY2xhc3M6ICJ2LWVtcHR5X190aXRsZSIsIHRleHQ6IG1zZyB9KSwKICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGIgPSBlbCgiYnV0dG9uIiwgeyBjbGFzczogInYtY3RhIHYtY3RhLS1wcmltYXJ5IiwgdHlwZTogImJ1dHRvbiIsIHRleHQ6IGFjdGlvbkxhYmVsIH0pOwogICAgICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIG9uQWN0aW9uKTsKICAgICAgICAgIHJldHVybiBiOwogICAgICAgIH0pKCkKICAgICAgXSk7CiAgICB9CiAgICBpZiAoZW1wdHlOb2RlICYmIGVtcHR5Tm9kZS5jbGFzc0xpc3QpIGVtcHR5Tm9kZS5jbGFzc0xpc3QuYWRkKCJ2ZmVlZC1lbXB0eSIpOwogICAgdGhpcy5ncmlkRWwuYXBwZW5kQ2hpbGQoZW1wdHlOb2RlKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX3JlbmRlckVycm9yID0gZnVuY3Rpb24gKGVycikgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgaWYgKHRoaXMubGF5b3V0KSB0aGlzLmxheW91dC5jbGVhcigpOwogICAgaWYgKHRoaXMuc3RhdHVzRWwpIHRoaXMuc3RhdHVzRWwuaW5uZXJIVE1MID0gIiI7CiAgICB2YXIgZGV0YWlsID0gKGVyciAmJiBlcnIubWVzc2FnZSkgPyBlcnIubWVzc2FnZSA6ICJTb21ldGhpbmcgd2VudCB3cm9uZyBsb2FkaW5nIHRoZSBmZWVkLiI7CgogICAgdmFyIG5vZGUgPSBlbCgiZGl2IiwgeyBjbGFzczogInYtZW1wdHkgdmZlZWQtZXJyb3IiLCByb2xlOiAiYWxlcnQiIH0sIFsKICAgICAgZWwoImRpdiIsIHsgY2xhc3M6ICJ2LWVtcHR5X19pY29uIiwgImFyaWEtaGlkZGVuIjogInRydWUiLCBodG1sOiBlcnJvckdseXBoKCkgfSksCiAgICAgIGVsKCJwIiwgeyBjbGFzczogInYtZW1wdHlfX3RpdGxlIiwgdGV4dDogIldlIGNvdWxkbuKAmXQgbG9hZCBpbnNwaXJhdGlvbi4iIH0pLAogICAgICBlbCgicCIsIHsgY2xhc3M6ICJ2LWVtcHR5X19zdWIiLCB0ZXh0OiBkZXRhaWwgfSksCiAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGIgPSBlbCgiYnV0dG9uIiwgeyBjbGFzczogInYtY3RhIHYtY3RhLS1wcmltYXJ5IiwgdHlwZTogImJ1dHRvbiIsIHRleHQ6ICJUcnkgYWdhaW4iIH0pOwogICAgICAgIGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IHNlbGYuX3JlbG9hZCgpOyB9KTsKICAgICAgICByZXR1cm4gYjsKICAgICAgfSkoKQogICAgXSk7CiAgICB0aGlzLmdyaWRFbC5hcHBlbmRDaGlsZChub2RlKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX3NldHVwT2JzZXJ2ZXIgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBpZiAoISgiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiIGluIHdpbmRvdykgfHwgIXRoaXMuc2VudGluZWwpIHJldHVybjsKICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHsKICAgICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgaWYgKGUuaXNJbnRlcnNlY3RpbmcpIHNlbGYubG9hZE5leHQoKTsKICAgICAgfSk7CiAgICB9LCB7IHJvb3RNYXJnaW46ICI2MDBweCAwcHgiIH0pOwogICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuc2VudGluZWwpOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fc2V0dXBSZXNpemUgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB0aGlzLl9vblJlc2l6ZSA9IGRlYm91bmNlKGZ1bmN0aW9uICgpIHsKICAgICAgc2VsZi5fcmVmbG93Q29sdW1ucygpOwogICAgfSwgMTYwKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLl9vblJlc2l6ZSk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7CiAgICB0aGlzLl9yZXFUb2tlbisrOwogICAgdW5yZWdpc3RlclN0YXRlcyh0aGlzLnN0YXRlcyk7CiAgICB0aGlzLnN0YXRlcyA9IFtdOwogICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHsgdHJ5IHsgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7IH0gY2F0Y2ggKGUpIHt9IHRoaXMub2JzZXJ2ZXIgPSBudWxsOyB9CiAgICBpZiAodGhpcy5fb25SZXNpemUpIHsgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIHRoaXMuX29uUmVzaXplKTsgdGhpcy5fb25SZXNpemUgPSBudWxsOyB9CiAgICBpZiAodGhpcy5fb3B0c1JlZiAmJiB0aGlzLl9vcHRzUmVmLmNsb3NlKSB7IHRyeSB7IHRoaXMuX29wdHNSZWYuY2xvc2UoKTsgfSBjYXRjaCAoZSkge30gdGhpcy5fb3B0c1JlZiA9IG51bGw7IH0KICB9OwoKICBmdW5jdGlvbiBvcHRpb25zR2x5cGgoKSB7CiAgICByZXR1cm4gJzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNNCA2aDEwIi8+PHBhdGggZD0iTTE4IDZoMiIvPjxjaXJjbGUgY3g9IjE2IiBjeT0iNiIgcj0iMiIvPjxwYXRoIGQ9Ik00IDEyaDIiLz48cGF0aCBkPSJNMTAgMTJoMTAiLz48Y2lyY2xlIGN4PSI4IiBjeT0iMTIiIHI9IjIiLz48cGF0aCBkPSJNNCAxOGgxMCIvPjxwYXRoIGQ9Ik0xOCAxOGgyIi8+PGNpcmNsZSBjeD0iMTYiIGN5PSIxOCIgcj0iMiIvPjwvc3ZnPic7CiAgfQoKICBmdW5jdGlvbiBlcnJvckdseXBoKCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaWNvbiA9PT0gImZ1bmN0aW9uIikgewogICAgICB2YXIgciA9IFYudWkuaWNvbigiYWxlcnQiKTsKICAgICAgaWYgKHR5cGVvZiByID09PSAic3RyaW5nIikgcmV0dXJuIHI7CiAgICAgIGlmIChyIGluc3RhbmNlb2YgTm9kZSkgeyB2YXIgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOyBkLmFwcGVuZENoaWxkKHIpOyByZXR1cm4gZC5pbm5lckhUTUw7IH0KICAgIH0KICAgIHJldHVybiAnPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS42IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0xMC4zIDMuNiAxLjggMThhMiAyIDAgMCAwIDEuNyAzaDE3YTIgMiAwIDAgMCAxLjctM0wxMy43IDMuNmEyIDIgMCAwIDAtMy40IDBaIi8+PGxpbmUgeDE9IjEyIiB5MT0iOSIgeDI9IjEyIiB5Mj0iMTMiLz48bGluZSB4MT0iMTIiIHkxPSIxNyIgeDI9IjEyLjAxIiB5Mj0iMTciLz48L3N2Zz4nOwogIH0KCiAgdmFyIGN1cnJlbnQgPSBudWxsOwoKICBWLnZpZXdzLmZlZWQgPSB7CiAgICByZW5kZXI6IGZ1bmN0aW9uIChyb290LCBwYXJhbXMpIHsKICAgICAgaWYgKCFyb290KSByZXR1cm47CiAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTsKICAgICAgaWYgKGN1cnJlbnQpIHsgY3VycmVudC5kZXN0cm95KCk7IGN1cnJlbnQgPSBudWxsOyB9CiAgICAgIHZhciB0YWcgPSAocGFyYW1zLnRhZyB8fCAiIikudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgICAgY3VycmVudCA9IG5ldyBGZWVkQ29udHJvbGxlcih7IG1vdW50OiByb290LCB0YWc6IHRhZywgaW5saW5lOiBmYWxzZSB9KTsKICAgICAgY3VycmVudC5yZW5kZXIoKTsKICAgIH0sCgogICAgdGVhcmRvd246IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGN1cnJlbnQpIHsgY3VycmVudC5kZXN0cm95KCk7IGN1cnJlbnQgPSBudWxsOyB9CiAgICB9LAoKICAgIHJlbmRlcklubGluZTogZnVuY3Rpb24gKGNvbnRhaW5lciwgb3B0cykgewogICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuIG51bGw7CiAgICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgICB2YXIgY3RybCA9IG5ldyBGZWVkQ29udHJvbGxlcih7CiAgICAgICAgbW91bnQ6IGNvbnRhaW5lciwKICAgICAgICB0YWc6IChvcHRzLnRhZyB8fCAiIikudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKSwKICAgICAgICBpbmxpbmU6IHRydWUsCiAgICAgICAgbGltaXQ6IDAsCiAgICAgICAgcGVyOiBJTkxJTkVfREVGQVVMVCwKICAgICAgICBzaG93Q2hpcHM6IGZhbHNlLAogICAgICAgIHNob3dIZWFkZXI6IGZhbHNlLAogICAgICAgIHNob3dPcHRpb25zOiBmYWxzZSwKICAgICAgICBvbkFwcGx5OiBvcHRzLm9uQXBwbHkKICAgICAgfSk7CiAgICAgIGN0cmwucmVuZGVyKCk7CiAgICAgIHJldHVybiBjdHJsOwogICAgfSwKCiAgICBhcHBseUV4YW1wbGVUb0NyZWF0b3I6IGFwcGx5RXhhbXBsZVRvQ3JlYXRvcgogIH07Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL3ByZXNldHMuanMgPT09PT0gKi8KKGZ1bmN0aW9uICgpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBWID0gd2luZG93LlYgPSB3aW5kb3cuViB8fCB7fTsKICBWLnN0YXRlID0gVi5zdGF0ZSB8fCB7fTsKICBpZiAoIUFycmF5LmlzQXJyYXkoVi5zdGF0ZS5jdXN0b21QcmVzZXRzKSkgVi5zdGF0ZS5jdXN0b21QcmVzZXRzID0gW107CgogIGZ1bmN0aW9uIHVpKCkgeyByZXR1cm4gVi51aSB8fCB7fTsgfQogIGZ1bmN0aW9uIGFwaSgpIHsgcmV0dXJuIFYuYXBpIHx8IHt9OyB9CiAgZnVuY3Rpb24gc3RvcmUoKSB7IHJldHVybiBWLnN0b3JlIHx8IHt9OyB9CiAgZnVuY3Rpb24gdXRpbCgpIHsgcmV0dXJuIFYudXRpbCB8fCB7fTsgfQoKICBmdW5jdGlvbiBlbCh0YWcsIGF0dHJzLCBraWRzKSB7CiAgICBpZiAodWkoKS5lbCkgcmV0dXJuIHVpKCkuZWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgaWYgKGF0dHJzICYmIHR5cGVvZiBhdHRycyA9PT0gIm9iamVjdCIpIHsKICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwogICAgICAgIGlmICh2ID09IG51bGwgfHwgdiA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICBpZiAoayA9PT0gImNsYXNzIiB8fCBrID09PSAiY2xhc3NOYW1lIikgbm9kZS5jbGFzc05hbWUgPSB2OwogICAgICAgIGVsc2UgaWYgKGsgPT09ICJ0ZXh0Iikgbm9kZS50ZXh0Q29udGVudCA9IHY7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gImh0bWwiKSBub2RlLmlubmVySFRNTCA9IHY7CiAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCJvbiIpID09PSAwICYmIHR5cGVvZiB2ID09PSAiZnVuY3Rpb24iKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCB2KTsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoImRhdGEtIikgPT09IDApIG5vZGUuc2V0QXR0cmlidXRlKGssIHYpOwogICAgICAgIGVsc2Ugbm9kZS5zZXRBdHRyaWJ1dGUoaywgdiA9PT0gdHJ1ZSA/ICIiIDogdik7CiAgICAgIH0pOwogICAgfQogICAgdmFyIHJlc3QgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICByZXN0LmZvckVhY2goZnVuY3Rpb24gYXBwZW5kS2lkKGMpIHsKICAgICAgaWYgKGMgPT0gbnVsbCB8fCBjID09PSBmYWxzZSkgcmV0dXJuOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgcmV0dXJuIGMuZm9yRWFjaChhcHBlbmRLaWQpOwogICAgICBub2RlLmFwcGVuZENoaWxkKGMubm9kZVR5cGUgPyBjIDogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGMpKSk7CiAgICB9KTsKICAgIHJldHVybiBub2RlOwogIH0KICBmdW5jdGlvbiBpY29uKG5hbWUpIHsKICAgIGlmICghdWkoKS5pY29uKSByZXR1cm4gIiI7CiAgICB2YXIgZ290ID0gdWkoKS5pY29uKG5hbWUpOwogICAgaWYgKHR5cGVvZiBnb3QgPT09ICJzdHJpbmciKSByZXR1cm4gZ290OwogICAgaWYgKGdvdCAmJiBnb3Qubm9kZVR5cGUgJiYgdHlwZW9mIGdvdC5vdXRlckhUTUwgPT09ICJzdHJpbmciKSByZXR1cm4gZ290Lm91dGVySFRNTDsKICAgIHJldHVybiAiIjsKICB9CiAgZnVuY3Rpb24gdG9hc3QobXNnLCBraW5kKSB7IGlmICh1aSgpLnRvYXN0KSB1aSgpLnRvYXN0KG1zZywga2luZCk7IGVsc2UgaWYgKHN0b3JlKCkuZW1pdCkgc3RvcmUoKS5lbWl0KCJ0b2FzdCIsIHsgbXNnOiBtc2csIGtpbmQ6IGtpbmQgfSk7IH0KICBmdW5jdGlvbiB1dWlkKCkgewogICAgaWYgKHV0aWwoKS51dWlkKSByZXR1cm4gdXRpbCgpLnV1aWQoKTsKICAgIGlmICh3aW5kb3cuY3J5cHRvICYmIGNyeXB0by5yYW5kb21VVUlEKSByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTsKICAgIHJldHVybiAieHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Ii5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgIHZhciByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwLCB2ID0gYyA9PT0gIngiID8gciA6IChyICYgMHgzKSB8IDB4ODsgcmV0dXJuIHYudG9TdHJpbmcoMTYpOwogICAgfSk7CiAgfQoKICB2YXIgTFNfS0VZID0gInZhbXBfd2ViX2N1c3RvbVByZXNldHMiOwogIGZ1bmN0aW9uIHBlcnNpc3QoKSB7CiAgICBpZiAoc3RvcmUoKS5zZXQpIHN0b3JlKCkuc2V0KCJjdXN0b21QcmVzZXRzIiwgVi5zdGF0ZS5jdXN0b21QcmVzZXRzKTsKICAgIGlmIChzdG9yZSgpLnNhdmUpIHsgc3RvcmUoKS5zYXZlKCk7IHJldHVybjsgfQogICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTFNfS0VZLCBKU09OLnN0cmluZ2lmeShWLnN0YXRlLmN1c3RvbVByZXNldHMpKTsgfSBjYXRjaCAoZSkge30KICB9CiAgZnVuY3Rpb24gcmVzdG9yZSgpIHsKICAgIHZhciBjYWNoZWQgPSBzdG9yZSgpLmdldCA/IHN0b3JlKCkuZ2V0KCJjdXN0b21QcmVzZXRzIikgOiBudWxsOwogICAgaWYgKEFycmF5LmlzQXJyYXkoY2FjaGVkKSAmJiBjYWNoZWQubGVuZ3RoKSB7IFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IGNhY2hlZC5tYXAobm9ybWFsaXplUHJlc2V0KTsgcmV0dXJuOyB9CiAgICB0cnkgewogICAgICB2YXIgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZKTsKICAgICAgaWYgKHJhdykgVi5zdGF0ZS5jdXN0b21QcmVzZXRzID0gKEpTT04ucGFyc2UocmF3KSB8fCBbXSkubWFwKG5vcm1hbGl6ZVByZXNldCk7CiAgICB9IGNhdGNoIChlKSB7fQogIH0KCiAgZnVuY3Rpb24gbm93SVNPKCkgeyByZXR1cm4gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1wuXGQrLywgIiIpOyB9CiAgZnVuY3Rpb24gbm9ybWFsaXplUHJlc2V0KHApIHsKICAgIHAgPSBwIHx8IHt9OwogICAgcmV0dXJuIHsKICAgICAgaWQ6IHAuaWQgfHwgdXVpZCgpLAogICAgICBuYW1lOiAocC5uYW1lIHx8ICIiKS50cmltKCksCiAgICAgIHByb21wdDogKHAucHJvbXB0IHx8ICIiKS50cmltKCksCiAgICAgIG5lZ2F0aXZlUHJvbXB0OiAocC5uZWdhdGl2ZVByb21wdCB8fCAiIikudHJpbSgpIHx8IG51bGwsCiAgICAgIG1vZGVsOiBwLm1vZGVsIHx8IG51bGwsCiAgICAgIGNyZWF0ZWRBdDogcC5jcmVhdGVkQXQgfHwgbm93SVNPKCksCiAgICAgIHVwZGF0ZWRBdDogcC51cGRhdGVkQXQgfHwgbm93SVNPKCkKICAgIH07CiAgfQoKICB2YXIgSU5EVVNUUllfUkVMRVZBTkNFID0gewogICAgcmVhbEVzdGF0ZTogWyJyZW1vdmVBbGxGdXJuaXR1cmUiLCAicmVtb3ZlQ2x1dHRlciIsICJyZW1vdmVGdXJuaXR1cmVBbmRDbHV0dGVyIiwgInJlbW92ZVBlb3BsZSIsICJyZW1vdmVSZWZsZWN0aW9ucyIsICJpbXByb3ZlTGlnaHRpbmciLCAiZGVwZXJzb25hbGl6ZSIsICJuZXV0cmFsUGFpbnQiLCAiZml4V2FsbHMiLCAiYWRkQ3VyYkFwcGVhbCIsICJpbXByb3ZlRXh0ZXJpb3IiLCAiaW1wcm92ZVNraWVzIiwgIm1vZGVyblN0YWdpbmciLCAidHJhbnNpdGlvbmFsU3RhZ2luZyIsICJtaW5pbWFsaXN0U3RhZ2luZyIsICJ3YXJtTWluaW1hbGlzdFN0YWdpbmciLCAibHV4dXJ5U3RhZ2luZyIsICJhZGRMYW5kc2NhcGluZyIsICJjbGVhbkxhbmRzY2FwaW5nIiwgImltcHJvdmVFbnRyeXdheSJdLAogICAgaW50ZXJpb3JEZXNpZ246IFsicmVtb3ZlQWxsRnVybml0dXJlIiwgInJlbW92ZUNsdXR0ZXIiLCAicmVtb3ZlRnVybml0dXJlQW5kQ2x1dHRlciIsICJpbXByb3ZlTGlnaHRpbmciLCAibmV1dHJhbFBhaW50IiwgImZpeFdhbGxzIiwgIm1vZGVybml6ZSIsICJkZXBlcnNvbmFsaXplIiwgImFkZFBsYW50cyIsICJtb2Rlcm5TdGFnaW5nIiwgInRyYW5zaXRpb25hbFN0YWdpbmciLCAibWluaW1hbGlzdFN0YWdpbmciLCAid2FybU1pbmltYWxpc3RTdGFnaW5nIiwgIm1pZENlbnR1cnlNb2Rlcm5TdGFnaW5nIiwgImFydERlY29TdGFnaW5nIiwgImJpb3BoaWxpY1N0YWdpbmciLCAibHV4dXJ5U3RhZ2luZyJdLAogICAgYXJjaGl0ZWN0dXJlOiBbImltcHJvdmVFeHRlcmlvciIsICJtb2Rlcm5pemVFeHRlcmlvciIsICJpbXByb3ZlRW50cnl3YXkiLCAiaW1wcm92ZVNraWVzIiwgImltcHJvdmVXZWF0aGVyIiwgImZpeFdhbGxzIiwgImFkZE91dGRvb3JMaXZpbmciLCAidmludGFnZUV4dGVyaW9yIiwgIm1vZGVybml6ZSIsICJhZGRDdXJiQXBwZWFsIiwgInJlbW92ZVJlZmxlY3Rpb25zIl0sCiAgICBsYW5kc2NhcGluZzogWyJjbGVhbkxhbmRzY2FwaW5nIiwgImFkZExhbmRzY2FwaW5nIiwgImFkZEN1cmJBcHBlYWwiLCAiYWRkT3V0ZG9vckxpdmluZyIsICJhZGRQbGFudHMiLCAiYWRkUG9vbEFyZWEiLCAiaW1wcm92ZVdlYXRoZXIiLCAiY2hhbmdlU2Vhc29uIiwgImltcHJvdmVTa2llcyIsICJiaW9waGlsaWNTdGFnaW5nIl0sCiAgICBmdXJuaXNoaW5nOiBbInJlbW92ZUFsbEZ1cm5pdHVyZSIsICJyZW1vdmVGdXJuaXR1cmVBbmRDbHV0dGVyIiwgIm1vZGVyblN0YWdpbmciLCAidHJhbnNpdGlvbmFsU3RhZ2luZyIsICJtaW5pbWFsaXN0U3RhZ2luZyIsICJ3YXJtTWluaW1hbGlzdFN0YWdpbmciLCAibWlkQ2VudHVyeU1vZGVyblN0YWdpbmciLCAiYXJ0RGVjb1N0YWdpbmciLCAiYmlvcGhpbGljU3RhZ2luZyIsICJsdXh1cnlTdGFnaW5nIiwgImFkZFBsYW50cyJdLAogICAgY29uc3RydWN0aW9uOiBbImZpeFdhbGxzIiwgIm5ldXRyYWxQYWludCIsICJpbXByb3ZlRXh0ZXJpb3IiLCAibW9kZXJuaXplRXh0ZXJpb3IiLCAicmVtb3ZlQ2x1dHRlciIsICJpbXByb3ZlTGlnaHRpbmciLCAiYWRkT3V0ZG9vckxpdmluZyIsICJpbXByb3ZlRW50cnl3YXkiXSwKICAgIGhvbWVPd25lcjogWyJyZW1vdmVDbHV0dGVyIiwgInJlbW92ZUZ1cm5pdHVyZUFuZENsdXR0ZXIiLCAiaW1wcm92ZUxpZ2h0aW5nIiwgImltcHJvdmVXZWF0aGVyIiwgImNsZWFuTGFuZHNjYXBpbmciLCAiYWRkTGFuZHNjYXBpbmciLCAiYWRkQ3VyYkFwcGVhbCIsICJuZXV0cmFsUGFpbnQiLCAiYWRkUGxhbnRzIiwgImNoYW5nZVNlYXNvbiIsICJhZGRQb29sQXJlYSIsICJpbXByb3ZlRW50cnl3YXkiLCAibW9kZXJuaXplIl0KICB9OwoKICBmdW5jdGlvbiBzd2l6emxlcygpIHsgcmV0dXJuIChWLmRhdGEgJiYgQXJyYXkuaXNBcnJheShWLmRhdGEuc3dpenpsZXMpKSA/IFYuZGF0YS5zd2l6emxlcyA6IFtdOyB9CgogIGZ1bmN0aW9uIGlzUmVsZXZhbnQoc3dpenpsZUtleSwgc2VsZWN0ZWRJbmR1c3RyaWVzKSB7CiAgICBpZiAoIXNlbGVjdGVkSW5kdXN0cmllcyB8fCAhc2VsZWN0ZWRJbmR1c3RyaWVzLmxlbmd0aCkgcmV0dXJuIHRydWU7CiAgICB2YXIgbWFwcGVkQXRBbGwgPSBmYWxzZTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0ZWRJbmR1c3RyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBsaXN0ID0gSU5EVVNUUllfUkVMRVZBTkNFW3NlbGVjdGVkSW5kdXN0cmllc1tpXV07CiAgICAgIGlmICghbGlzdCkgY29udGludWU7CiAgICAgIG1hcHBlZEF0QWxsID0gdHJ1ZTsKICAgICAgaWYgKGxpc3QuaW5kZXhPZihzd2l6emxlS2V5KSAhPT0gLTEpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuICFtYXBwZWRBdEFsbDsKICB9CgogIGZ1bmN0aW9uIHJlbGV2YW50U3dpenpsZXMoKSB7CiAgICB2YXIgc2VsID0gKFYuc3RhdGUgJiYgQXJyYXkuaXNBcnJheShWLnN0YXRlLmluZHVzdHJpZXMpKSA/IFYuc3RhdGUuaW5kdXN0cmllcyA6IFtdOwogICAgdmFyIGxpc3QgPSBzd2l6emxlcygpLmZpbHRlcihmdW5jdGlvbiAocykgeyByZXR1cm4gaXNSZWxldmFudChzLmtleSwgc2VsKTsgfSk7CiAgICByZXR1cm4gbGlzdC5sZW5ndGggPyBsaXN0IDogc3dpenpsZXMoKTsKICB9CgogIHZhciBfbG9hZGluZyA9IGZhbHNlLCBfbG9hZGVkID0gZmFsc2UsIF9sb2FkUHJvbWlzZSA9IG51bGw7CgogIGZ1bmN0aW9uIGxvYWQoZm9yY2UpIHsKICAgIGlmIChfbG9hZGluZykgcmV0dXJuIF9sb2FkUHJvbWlzZTsKICAgIGlmIChfbG9hZGVkICYmICFmb3JjZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShWLnN0YXRlLmN1c3RvbVByZXNldHMpOwogICAgaWYgKCFhcGkoKS5wcmVzZXRzKSB7IHJlc3RvcmUoKTsgX2xvYWRlZCA9IHRydWU7IHJldHVybiBQcm9taXNlLnJlc29sdmUoVi5zdGF0ZS5jdXN0b21QcmVzZXRzKTsgfQogICAgX2xvYWRpbmcgPSB0cnVlOwogICAgdmFyIGNsaWVudE1vZGVscyA9IHt9OwogICAgVi5zdGF0ZS5jdXN0b21QcmVzZXRzLmZvckVhY2goZnVuY3Rpb24gKHApIHsgaWYgKHAubW9kZWwpIGNsaWVudE1vZGVsc1twLmlkXSA9IHAubW9kZWw7IH0pOwogICAgX2xvYWRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGFwaSgpLnByZXNldHMoKSkudGhlbihmdW5jdGlvbiAocm93cykgewogICAgICB2YXIgYXJyID0gKEFycmF5LmlzQXJyYXkocm93cykgPyByb3dzIDogW10pLm1hcChmdW5jdGlvbiAocikgewogICAgICAgIHZhciBuID0gbm9ybWFsaXplUHJlc2V0KHIpOwogICAgICAgIGlmICghbi5tb2RlbCAmJiBjbGllbnRNb2RlbHNbbi5pZF0pIG4ubW9kZWwgPSBjbGllbnRNb2RlbHNbbi5pZF07CiAgICAgICAgcmV0dXJuIG47CiAgICAgIH0pOwogICAgICBWLnN0YXRlLmN1c3RvbVByZXNldHMgPSBhcnI7CiAgICAgIHBlcnNpc3QoKTsKICAgICAgX2xvYWRlZCA9IHRydWU7CiAgICAgIGVtaXRDaGFuZ2VkKCk7CiAgICAgIHJldHVybiBhcnI7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIHJlc3RvcmUoKTsKICAgICAgX2xvYWRlZCA9IHRydWU7CiAgICAgIHJldHVybiBWLnN0YXRlLmN1c3RvbVByZXNldHM7CiAgICB9KS50aGVuKGZ1bmN0aW9uIChyKSB7IF9sb2FkaW5nID0gZmFsc2U7IHJldHVybiByOyB9KTsKICAgIHJldHVybiBfbG9hZFByb21pc2U7CiAgfQoKICBmdW5jdGlvbiBjcmVhdGUoZGF0YSkgewogICAgdmFyIGxvY2FsID0gbm9ybWFsaXplUHJlc2V0KGRhdGEpOwogICAgdmFyIGJvZHkgPSB3aXJlQm9keShsb2NhbCk7CiAgICBWLnN0YXRlLmN1c3RvbVByZXNldHMgPSBWLnN0YXRlLmN1c3RvbVByZXNldHMuY29uY2F0KFtsb2NhbF0pOwogICAgcGVyc2lzdCgpOwogICAgZW1pdENoYW5nZWQoKTsKICAgIGlmICghYXBpKCkuY3JlYXRlUHJlc2V0KSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGxvY2FsKTsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYXBpKCkuY3JlYXRlUHJlc2V0KGJvZHkpKS50aGVuKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgdmFyIHNlcnZlciA9IG5vcm1hbGl6ZVByZXNldChyb3cgfHwge30pOwogICAgICB2YXIgaWR4ID0gVi5zdGF0ZS5jdXN0b21QcmVzZXRzLmluZGV4T2YobG9jYWwpOwogICAgICBzZXJ2ZXIubW9kZWwgPSBsb2NhbC5tb2RlbCB8fCBzZXJ2ZXIubW9kZWw7CiAgICAgIGlmIChpZHggIT09IC0xKSBWLnN0YXRlLmN1c3RvbVByZXNldHNbaWR4XSA9IHNlcnZlcjsgZWxzZSBWLnN0YXRlLmN1c3RvbVByZXNldHMucHVzaChzZXJ2ZXIpOwogICAgICBwZXJzaXN0KCk7IGVtaXRDaGFuZ2VkKCk7CiAgICAgIHJldHVybiBzZXJ2ZXI7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIHJvbGxiYWNrUmVtb3ZlKGxvY2FsLmlkKTsKICAgICAgdG9hc3QoIkNvdWxkbid0IHNhdmUgcHJlc2V0LiAiICsgZXJyTXNnKGVyciksICJlcnJvciIpOwogICAgICB0aHJvdyBlcnI7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZShpZCwgZGF0YSkgewogICAgdmFyIGlkeCA9IGluZGV4T2YoaWQpOwogICAgaWYgKGlkeCA9PT0gLTEpIHJldHVybiBjcmVhdGUoZGF0YSk7CiAgICB2YXIgcHJldiA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0c1tpZHhdOwogICAgdmFyIG5leHQgPSBub3JtYWxpemVQcmVzZXQoT2JqZWN0LmFzc2lnbih7fSwgcHJldiwgZGF0YSwgeyBpZDogaWQsIHVwZGF0ZWRBdDogbm93SVNPKCkgfSkpOwogICAgVi5zdGF0ZS5jdXN0b21QcmVzZXRzW2lkeF0gPSBuZXh0OwogICAgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOwogICAgaWYgKCFhcGkoKS51cGRhdGVQcmVzZXQpIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV4dCk7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaSgpLnVwZGF0ZVByZXNldChpZCwgd2lyZUJvZHkobmV4dCkpKS50aGVuKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgdmFyIHNlcnZlciA9IG5vcm1hbGl6ZVByZXNldChyb3cgfHwgbmV4dCk7CiAgICAgIHNlcnZlci5tb2RlbCA9IG5leHQubW9kZWwgfHwgc2VydmVyLm1vZGVsOwogICAgICB2YXIgaSA9IGluZGV4T2YoaWQpOyBpZiAoaSAhPT0gLTEpIFYuc3RhdGUuY3VzdG9tUHJlc2V0c1tpXSA9IHNlcnZlcjsKICAgICAgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOwogICAgICByZXR1cm4gc2VydmVyOwogICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICB2YXIgaSA9IGluZGV4T2YoaWQpOyBpZiAoaSAhPT0gLTEpIFYuc3RhdGUuY3VzdG9tUHJlc2V0c1tpXSA9IHByZXY7CiAgICAgIHBlcnNpc3QoKTsgZW1pdENoYW5nZWQoKTsKICAgICAgdG9hc3QoIkNvdWxkbid0IHVwZGF0ZSBwcmVzZXQuICIgKyBlcnJNc2coZXJyKSwgImVycm9yIik7CiAgICAgIHRocm93IGVycjsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcmVtb3ZlKGlkKSB7CiAgICB2YXIgaWR4ID0gaW5kZXhPZihpZCk7CiAgICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgdmFyIHByZXYgPSBWLnN0YXRlLmN1c3RvbVByZXNldHNbaWR4XTsKICAgIFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5maWx0ZXIoZnVuY3Rpb24gKHApIHsgcmV0dXJuIHAuaWQgIT09IGlkOyB9KTsKICAgIHBlcnNpc3QoKTsgZW1pdENoYW5nZWQoKTsKICAgIGlmICghYXBpKCkuZGVsZXRlUHJlc2V0KSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaSgpLmRlbGV0ZVByZXNldChpZCkpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgdmFyIGFyciA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5zbGljZSgpOwogICAgICBhcnIuc3BsaWNlKE1hdGgubWluKGlkeCwgYXJyLmxlbmd0aCksIDAsIHByZXYpOwogICAgICBWLnN0YXRlLmN1c3RvbVByZXNldHMgPSBhcnI7CiAgICAgIHBlcnNpc3QoKTsgZW1pdENoYW5nZWQoKTsKICAgICAgdG9hc3QoIkNvdWxkbid0IGRlbGV0ZSBwcmVzZXQuICIgKyBlcnJNc2coZXJyKSwgImVycm9yIik7CiAgICAgIHRocm93IGVycjsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcmVvcmRlcihvcmRlcmVkSWRzKSB7CiAgICB2YXIgYnlJZCA9IHt9OyBWLnN0YXRlLmN1c3RvbVByZXNldHMuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBieUlkW3AuaWRdID0gcDsgfSk7CiAgICB2YXIgcHJldiA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5zbGljZSgpOwogICAgdmFyIG5leHQgPSBvcmRlcmVkSWRzLm1hcChmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIGJ5SWRbaWRdOyB9KS5maWx0ZXIoQm9vbGVhbik7CiAgICBwcmV2LmZvckVhY2goZnVuY3Rpb24gKHApIHsgaWYgKG9yZGVyZWRJZHMuaW5kZXhPZihwLmlkKSA9PT0gLTEpIG5leHQucHVzaChwKTsgfSk7CiAgICBWLnN0YXRlLmN1c3RvbVByZXNldHMgPSBuZXh0OyBwZXJzaXN0KCk7IGVtaXRDaGFuZ2VkKCk7CiAgICBpZiAoIWFwaSgpLnJlb3JkZXJQcmVzZXRzKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5leHQpOwogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkoKS5yZW9yZGVyUHJlc2V0cyhuZXh0Lm1hcChmdW5jdGlvbiAocCkgeyByZXR1cm4gcC5pZDsgfSkpKS50aGVuKGZ1bmN0aW9uIChyb3dzKSB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJvd3MpICYmIHJvd3MubGVuZ3RoKSB7CiAgICAgICAgdmFyIG1vZGVscyA9IHt9OyBwcmV2LmZvckVhY2goZnVuY3Rpb24gKHApIHsgaWYgKHAubW9kZWwpIG1vZGVsc1twLmlkXSA9IHAubW9kZWw7IH0pOwogICAgICAgIFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IHJvd3MubWFwKGZ1bmN0aW9uIChyKSB7IHZhciBuID0gbm9ybWFsaXplUHJlc2V0KHIpOyBpZiAoIW4ubW9kZWwgJiYgbW9kZWxzW24uaWRdKSBuLm1vZGVsID0gbW9kZWxzW24uaWRdOyByZXR1cm4gbjsgfSk7CiAgICAgICAgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOwogICAgICB9CiAgICAgIHJldHVybiBWLnN0YXRlLmN1c3RvbVByZXNldHM7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IHByZXY7IHBlcnNpc3QoKTsgZW1pdENoYW5nZWQoKTsgcmV0dXJuIHByZXY7IH0pOwogIH0KCiAgZnVuY3Rpb24gaW5kZXhPZihpZCkgeyBmb3IgKHZhciBpID0gMDsgaSA8IFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5sZW5ndGg7IGkrKykgaWYgKFYuc3RhdGUuY3VzdG9tUHJlc2V0c1tpXS5pZCA9PT0gaWQpIHJldHVybiBpOyByZXR1cm4gLTE7IH0KICBmdW5jdGlvbiByb2xsYmFja1JlbW92ZShpZCkgeyBWLnN0YXRlLmN1c3RvbVByZXNldHMgPSBWLnN0YXRlLmN1c3RvbVByZXNldHMuZmlsdGVyKGZ1bmN0aW9uIChwKSB7IHJldHVybiBwLmlkICE9PSBpZDsgfSk7IHBlcnNpc3QoKTsgZW1pdENoYW5nZWQoKTsgfQogIGZ1bmN0aW9uIGVtaXRDaGFuZ2VkKCkgeyBpZiAoc3RvcmUoKS5lbWl0KSBzdG9yZSgpLmVtaXQoInByZXNldHM6Y2hhbmdlZCIsIFYuc3RhdGUuY3VzdG9tUHJlc2V0cyk7IH0KICBmdW5jdGlvbiB3aXJlQm9keShwKSB7IHJldHVybiB7IGlkOiBwLmlkLCBuYW1lOiBwLm5hbWUsIHByb21wdDogcC5wcm9tcHQsIG5lZ2F0aXZlUHJvbXB0OiBwLm5lZ2F0aXZlUHJvbXB0IHx8IG51bGwgfTsgfQogIGZ1bmN0aW9uIGVyck1zZyhlcnIpIHsgcmV0dXJuIChlcnIgJiYgZXJyLm1lc3NhZ2UpID8gZXJyLm1lc3NhZ2UgOiAiUGxlYXNlIHRyeSBhZ2Fpbi4iOyB9CgogIGZ1bmN0aW9uIHJlbmRlckNoaXBzKGNvbnRhaW5lciwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICBpZiAodHlwZW9mIGNvbnRhaW5lciA9PT0gInN0cmluZyIpIGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGFpbmVyKTsKICAgIGlmICghY29udGFpbmVyKSByZXR1cm4geyByZWZyZXNoOiBmdW5jdGlvbiAoKSB7fSwgc2V0QWN0aXZlOiBmdW5jdGlvbiAoKSB7fSwgY2xlYXJBY3RpdmU6IGZ1bmN0aW9uICgpIHt9LCBkZXN0cm95OiBmdW5jdGlvbiAoKSB7fSB9OwoKICAgIHZhciBvblBpY2sgPSB0eXBlb2Ygb3B0cy5vblBpY2sgPT09ICJmdW5jdGlvbiIgPyBvcHRzLm9uUGljawogICAgICA6ICh0eXBlb2Ygb3B0cy5vblNlbGVjdCA9PT0gImZ1bmN0aW9uIiA/IG9wdHMub25TZWxlY3QgOiBmdW5jdGlvbiAoKSB7fSk7CiAgICB2YXIgb25JbmR1c3RyaWVzID0gdHlwZW9mIG9wdHMub25JbmR1c3RyaWVzID09PSAiZnVuY3Rpb24iID8gb3B0cy5vbkluZHVzdHJpZXMgOiBudWxsOwogICAgdmFyIGFjdGl2ZUlkID0gb3B0cy5zZWxlY3RlZElkIHx8IG51bGw7CiAgICB2YXIgYWN0aXZlS2V5ID0gb3B0cy5zZWxlY3RlZEtleSB8fCBudWxsOwoKICAgIHZhciBzY3JvbGxlciA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LWNoaXAtcm93Iiwgcm9sZTogImxpc3Rib3giLCAiYXJpYS1sYWJlbCI6ICJTdHlsZSBwcmVzZXRzIiwgdGFiaW5kZXg6ICItMSIgfSk7CiAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCJhcmlhLWJ1c3kiLCAiZmFsc2UiKTsKICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAiIjsKICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzY3JvbGxlcik7CgogICAgZnVuY3Rpb24gcGlja0N1c3RvbShwKSB7CiAgICAgIGFjdGl2ZUlkID0gcC5pZDsgYWN0aXZlS2V5ID0gbnVsbDsgbWFya0FjdGl2ZSgpOwogICAgICBvblBpY2soeyBzb3VyY2U6ICJjdXN0b20iLCBpZDogcC5pZCwgbmFtZTogcC5uYW1lLCBwcm9tcHQ6IHAucHJvbXB0LCBuZWdhdGl2ZVByb21wdDogcC5uZWdhdGl2ZVByb21wdCB8fCBudWxsLCBtb2RlbDogcC5tb2RlbCB8fCBudWxsIH0pOwogICAgfQogICAgZnVuY3Rpb24gcGlja1N3aXp6bGUocykgewogICAgICBhY3RpdmVLZXkgPSBzLmtleTsgYWN0aXZlSWQgPSBudWxsOyBtYXJrQWN0aXZlKCk7CiAgICAgIG9uUGljayh7IHNvdXJjZTogInN3aXp6bGUiLCBpZDogcy5rZXksIGtleTogcy5rZXksIG5hbWU6IHMubGFiZWwsIHByb21wdDogcy5wcm9tcHQsIG5lZ2F0aXZlUHJvbXB0OiBudWxsLCBtb2RlbDogbnVsbCB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIG1hcmtBY3RpdmUoKSB7CiAgICAgIHZhciBub2RlcyA9IHNjcm9sbGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIi52LWNoaXAiKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBuID0gbm9kZXNbaV07CiAgICAgICAgdmFyIG9uID0gKG4uZGF0YXNldC5wcmVzZXRJZCAmJiBuLmRhdGFzZXQucHJlc2V0SWQgPT09IGFjdGl2ZUlkKSB8fAogICAgICAgICAgICAgICAgIChuLmRhdGFzZXQuc3dpenpsZUtleSAmJiBuLmRhdGFzZXQuc3dpenpsZUtleSA9PT0gYWN0aXZlS2V5KTsKICAgICAgICBuLmNsYXNzTGlzdC50b2dnbGUoInYtY2hpcC0tYWN0aXZlIiwgISFvbik7CiAgICAgICAgbi5zZXRBdHRyaWJ1dGUoImFyaWEtc2VsZWN0ZWQiLCBvbiA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY2hpcChsYWJlbCwgYXR0cnMsIG9uQ2xpY2ssIG9uQ29udGV4dCkgewogICAgICB2YXIgYyA9IGVsKCJidXR0b24iLCBPYmplY3QuYXNzaWduKHsKICAgICAgICB0eXBlOiAiYnV0dG9uIiwgImNsYXNzIjogInYtY2hpcCIsIHJvbGU6ICJvcHRpb24iLCAiYXJpYS1zZWxlY3RlZCI6ICJmYWxzZSIKICAgICAgfSwgYXR0cnMgfHwge30pLCBsYWJlbCk7CiAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IG9uQ2xpY2soYyk7IH0pOwogICAgICBpZiAob25Db250ZXh0KSBjLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IiwgZnVuY3Rpb24gKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBvbkNvbnRleHQoYywgZSk7IH0pOwogICAgICByZXR1cm4gYzsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZCgpIHsKICAgICAgc2Nyb2xsZXIuaW5uZXJIVE1MID0gIiI7CgogICAgICB2YXIgYWRkQ2hpcCA9IGNoaXAoCiAgICAgICAgW2VsKCJzcGFuIiwgeyAiY2xhc3MiOiAidi1jaGlwX19pY29uIiwgImFyaWEtaGlkZGVuIjogInRydWUiLCBodG1sOiBpY29uKCJwbHVzIikgfHwgIisiIH0pXSwKICAgICAgICB7ICJjbGFzcyI6ICJ2LWNoaXAgdi1jaGlwLS1hZGQiLCB0aXRsZTogIk5ldyBjdXN0b20gcHJlc2V0IiwgImFyaWEtbGFiZWwiOiAiQ3JlYXRlIGN1c3RvbSBwcmVzZXQiIH0sCiAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgb3BlbkVkaXRvcihudWxsLCB7IG9uU2F2ZWQ6IGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgIGJ1aWxkKCk7CiAgICAgICAgICAgIGlmIChwICYmIHAuaWQpIHsKICAgICAgICAgICAgICBhY3RpdmVJZCA9IHAuaWQ7IGFjdGl2ZUtleSA9IG51bGw7IG1hcmtBY3RpdmUoKTsKICAgICAgICAgICAgICB2YXIgbm9kZSA9IHNjcm9sbGVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByZXNldC1pZD0iJyArIHAuaWQgKyAnIl0nKTsKICAgICAgICAgICAgICBpZiAobm9kZSkgbm9kZS5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAibmVhcmVzdCIsIGlubGluZTogImNlbnRlciIgfSk7CiAgICAgICAgICAgICAgcGlja0N1c3RvbShwKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSB9KTsKICAgICAgICB9CiAgICAgICk7CiAgICAgIHNjcm9sbGVyLmFwcGVuZENoaWxkKGFkZENoaXApOwoKICAgICAgdmFyIGN1c3RvbXMgPSBWLnN0YXRlLmN1c3RvbVByZXNldHMgfHwgW107CiAgICAgIGN1c3RvbXMuZm9yRWFjaChmdW5jdGlvbiAocCkgewogICAgICAgIHZhciBjID0gY2hpcCgKICAgICAgICAgIFtlbCgic3BhbiIsIHsgImNsYXNzIjogInYtY2hpcF9faWNvbiIsICJhcmlhLWhpZGRlbiI6ICJ0cnVlIiwgaHRtbDogaWNvbigiYm9va21hcmsiKSB8fCAiIiB9KSwgZWwoInNwYW4iLCB7fSwgcC5uYW1lIHx8ICJVbnRpdGxlZCIpXSwKICAgICAgICAgIHsgImNsYXNzIjogInYtY2hpcCB2LWNoaXAtLWN1c3RvbSIsICJkYXRhLXByZXNldC1pZCI6IHAuaWQsIHRpdGxlOiBwLnByb21wdCB8fCBwLm5hbWUgfSwKICAgICAgICAgIGZ1bmN0aW9uICgpIHsgcGlja0N1c3RvbShwKTsgfSwKICAgICAgICAgIGZ1bmN0aW9uIChub2RlLCBlKSB7IHNob3dQcmVzZXRNZW51KHAsIG5vZGUsIGUsIGJ1aWxkKTsgfQogICAgICAgICk7CiAgICAgICAgYXR0YWNoTG9uZ1ByZXNzKGMsIGZ1bmN0aW9uIChldikgeyBzaG93UHJlc2V0TWVudShwLCBjLCBldiwgYnVpbGQpOyB9KTsKICAgICAgICBzY3JvbGxlci5hcHBlbmRDaGlsZChjKTsKICAgICAgfSk7CgogICAgICB2YXIgc3d6ID0gcmVsZXZhbnRTd2l6emxlcygpOwogICAgICBzd3ouZm9yRWFjaChmdW5jdGlvbiAocykgewogICAgICAgIHNjcm9sbGVyLmFwcGVuZENoaWxkKGNoaXAocy5sYWJlbCwgeyAiY2xhc3MiOiAidi1jaGlwIHYtY2hpcC0tc3dpenpsZSIsICJkYXRhLXN3aXp6bGUta2V5Ijogcy5rZXksIHRpdGxlOiBzLnByb21wdCB9LCBmdW5jdGlvbiAoKSB7IHBpY2tTd2l6emxlKHMpOyB9KSk7CiAgICAgIH0pOwoKICAgICAgdmFyIHNlbCA9IChWLnN0YXRlICYmIEFycmF5LmlzQXJyYXkoVi5zdGF0ZS5pbmR1c3RyaWVzKSkgPyBWLnN0YXRlLmluZHVzdHJpZXMgOiBbXTsKICAgICAgaWYgKG9uSW5kdXN0cmllcyB8fCAoVi5kYXRhICYmIFYuZGF0YS5pbmR1c3RyaWVzKSkgewogICAgICAgIHZhciBsYWJlbCA9IHNlbC5sZW5ndGggPyAiSW5kdXN0cmllcyDCtyAiICsgc2VsLmxlbmd0aCA6ICJJbmR1c3RyaWVzIjsKICAgICAgICBzY3JvbGxlci5hcHBlbmRDaGlsZChjaGlwKAogICAgICAgICAgW2VsKCJzcGFuIiwgeyAiY2xhc3MiOiAidi1jaGlwX19pY29uIiwgImFyaWEtaGlkZGVuIjogInRydWUiLCBodG1sOiBpY29uKCJlbGxpcHNpcyIpIHx8ICIiIH0pLCBlbCgic3BhbiIsIHt9LCBsYWJlbCldLAogICAgICAgICAgeyAiY2xhc3MiOiAidi1jaGlwIHYtY2hpcC0tbW9yZSIsIHRpdGxlOiAiRmlsdGVyIHByZXNldHMgYnkgaW5kdXN0cnkiIH0sCiAgICAgICAgICBmdW5jdGlvbiAoKSB7IGlmIChvbkluZHVzdHJpZXMpIG9uSW5kdXN0cmllcygpOyBlbHNlIG9wZW5JbmR1c3RyaWVzUGlja2VyKGZ1bmN0aW9uICgpIHsgYnVpbGQoKTsgfSk7IH0KICAgICAgICApKTsKICAgICAgfQoKICAgICAgbWFya0FjdGl2ZSgpOwogICAgfQoKICAgIHNjcm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS5rZXkgIT09ICJBcnJvd1JpZ2h0IiAmJiBlLmtleSAhPT0gIkFycm93TGVmdCIpIHJldHVybjsKICAgICAgdmFyIGNoaXBzID0gW10uc2xpY2UuY2FsbChzY3JvbGxlci5xdWVyeVNlbGVjdG9yQWxsKCIudi1jaGlwIikpOwogICAgICB2YXIgaSA9IGNoaXBzLmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgICAgIGlmIChpID09PSAtMSkgcmV0dXJuOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHZhciBuZXh0ID0gZS5rZXkgPT09ICJBcnJvd1JpZ2h0IiA/IE1hdGgubWluKGNoaXBzLmxlbmd0aCAtIDEsIGkgKyAxKSA6IE1hdGgubWF4KDAsIGkgLSAxKTsKICAgICAgY2hpcHNbbmV4dF0uZm9jdXMoKTsKICAgIH0pOwoKICAgIGJ1aWxkKCk7CiAgICB2YXIgb2ZmMSA9IHN0b3JlKCkub24gPyBzdG9yZSgpLm9uKCJwcmVzZXRzOmNoYW5nZWQiLCBidWlsZCkgOiBudWxsOwogICAgdmFyIG9mZjIgPSBzdG9yZSgpLm9uID8gc3RvcmUoKS5vbigiaW5kdXN0cmllczpjaGFuZ2VkIiwgYnVpbGQpIDogbnVsbDsKCiAgICBsb2FkKCkudGhlbihmdW5jdGlvbiAoKSB7IGJ1aWxkKCk7IH0pOwoKICAgIHJldHVybiB7CiAgICAgIHJlZnJlc2g6IGJ1aWxkLAogICAgICBzZXRBY3RpdmU6IGZ1bmN0aW9uIChzZWwpIHsKICAgICAgICBpZiAoc2VsICYmIHNlbC5pZCkgeyBhY3RpdmVJZCA9IHNlbC5pZDsgYWN0aXZlS2V5ID0gbnVsbDsgfQogICAgICAgIGVsc2UgaWYgKHNlbCAmJiBzZWwua2V5KSB7IGFjdGl2ZUtleSA9IHNlbC5rZXk7IGFjdGl2ZUlkID0gbnVsbDsgfQogICAgICAgIGVsc2UgeyBhY3RpdmVJZCA9IG51bGw7IGFjdGl2ZUtleSA9IG51bGw7IH0KICAgICAgICBtYXJrQWN0aXZlKCk7CiAgICAgIH0sCiAgICAgIGNsZWFyQWN0aXZlOiBmdW5jdGlvbiAoKSB7IGFjdGl2ZUlkID0gbnVsbDsgYWN0aXZlS2V5ID0gbnVsbDsgbWFya0FjdGl2ZSgpOyB9LAogICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7IGlmIChvZmYxKSBvZmYxKCk7IGlmIChvZmYyKSBvZmYyKCk7IGNvbnRhaW5lci5pbm5lckhUTUwgPSAiIjsgfQogICAgfTsKICB9CgogIGZ1bmN0aW9uIGF0dGFjaExvbmdQcmVzcyhub2RlLCBjYikgewogICAgdmFyIHRpbWVyID0gbnVsbCwgbW92ZWQgPSBmYWxzZSwgc3ggPSAwLCBzeSA9IDA7CiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBmdW5jdGlvbiAoZSkgewogICAgICBtb3ZlZCA9IGZhbHNlOyB2YXIgdCA9IGUudG91Y2hlc1swXTsgc3ggPSB0LmNsaWVudFg7IHN5ID0gdC5jbGllbnRZOwogICAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBpZiAoIW1vdmVkKSBjYihlKTsgfSwgNDgwKTsKICAgIH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgdmFyIHQgPSBlLnRvdWNoZXNbMF07CiAgICAgIGlmIChNYXRoLmFicyh0LmNsaWVudFggLSBzeCkgPiAxMCB8fCBNYXRoLmFicyh0LmNsaWVudFkgLSBzeSkgPiAxMCkgeyBtb3ZlZCA9IHRydWU7IGNsZWFyVGltZW91dCh0aW1lcik7IH0KICAgIH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCBmdW5jdGlvbiAoKSB7IGNsZWFyVGltZW91dCh0aW1lcik7IH0pOwogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGNhbmNlbCIsIGZ1bmN0aW9uICgpIHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgfSk7CiAgfQoKICBmdW5jdGlvbiBzaG93UHJlc2V0TWVudShwcmVzZXQsIGFuY2hvciwgZXZ0LCBvbkNoYW5nZWQpIHsKICAgIHZhciBtZW51ID0gZWwoImRpdiIsIHsgImNsYXNzIjogImdsYXNzLWNhcmQgdi1jaGlwLW1lbnUiLCByb2xlOiAibWVudSIgfSk7CiAgICB2YXIgZWRpdEJ0biA9IGVsKCJidXR0b24iLCB7IHR5cGU6ICJidXR0b24iLCAiY2xhc3MiOiAidi1jaGlwLW1lbnVfX2l0ZW0iLCByb2xlOiAibWVudWl0ZW0iIH0sIFtlbCgic3BhbiIsIHsgImNsYXNzIjogInYtY2hpcF9faWNvbiIsIGh0bWw6IGljb24oImVkaXQiKSB8fCAiIiB9KSwgIkVkaXQiXSk7CiAgICB2YXIgZGVsQnRuID0gZWwoImJ1dHRvbiIsIHsgdHlwZTogImJ1dHRvbiIsICJjbGFzcyI6ICJ2LWNoaXAtbWVudV9faXRlbSB2LWNoaXAtbWVudV9faXRlbS0tZGFuZ2VyIiwgcm9sZTogIm1lbnVpdGVtIiB9LCBbZWwoInNwYW4iLCB7ICJjbGFzcyI6ICJ2LWNoaXBfX2ljb24iLCBodG1sOiBpY29uKCJ0cmFzaCIpIHx8ICIiIH0pLCAiRGVsZXRlIl0pOwogICAgbWVudS5hcHBlbmRDaGlsZChlZGl0QnRuKTsgbWVudS5hcHBlbmRDaGlsZChkZWxCdG4pOwoKICAgIHZhciBiYWNrZHJvcCA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LWNoaXAtbWVudV9fYmFja2Ryb3AiIH0pOwogICAgZnVuY3Rpb24gY2xvc2UoKSB7IGlmIChtZW51LnBhcmVudE5vZGUpIG1lbnUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtZW51KTsgaWYgKGJhY2tkcm9wLnBhcmVudE5vZGUpIGJhY2tkcm9wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYmFja2Ryb3ApOyBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgb25LZXksIHRydWUpOyB9CiAgICBmdW5jdGlvbiBvbktleShlKSB7IGlmIChlLmtleSA9PT0gIkVzY2FwZSIpIGNsb3NlKCk7IH0KICAgIGJhY2tkcm9wLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgY2xvc2UpOwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIG9uS2V5LCB0cnVlKTsKCiAgICBlZGl0QnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgeyBjbG9zZSgpOyBvcGVuRWRpdG9yKHByZXNldCwgeyBvblNhdmVkOiBmdW5jdGlvbiAoKSB7IGlmIChvbkNoYW5nZWQpIG9uQ2hhbmdlZCgpOyB9IH0pOyB9KTsKICAgIGRlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgY2xvc2UoKTsKICAgICAgdmFyIGRvRGVsZXRlID0gZnVuY3Rpb24gKCkgeyByZW1vdmUocHJlc2V0LmlkKS50aGVuKGZ1bmN0aW9uICgpIHsgdG9hc3QoIlByZXNldCBkZWxldGVkIiwgInN1Y2Nlc3MiKTsgaWYgKG9uQ2hhbmdlZCkgb25DaGFuZ2VkKCk7IH0pLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsgfTsKICAgICAgaWYgKHVpKCkuY29uZmlybSkgdWkoKS5jb25maXJtKCdEZWxldGUgcHJlc2V0ICInICsgKHByZXNldC5uYW1lIHx8ICJVbnRpdGxlZCIpICsgJyI/JywgeyBkZXN0cnVjdGl2ZTogdHJ1ZSwgY29uZmlybUxhYmVsOiAiRGVsZXRlIiB9KS50aGVuKGZ1bmN0aW9uIChvaykgeyBpZiAob2spIGRvRGVsZXRlKCk7IH0pOwogICAgICBlbHNlIGlmICh3aW5kb3cuY29uZmlybSgnRGVsZXRlIHByZXNldCAiJyArIChwcmVzZXQubmFtZSB8fCAiVW50aXRsZWQiKSArICciPycpKSBkb0RlbGV0ZSgpOwogICAgfSk7CgogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiYWNrZHJvcCk7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lbnUpOwogICAgcG9zaXRpb25NZW51KG1lbnUsIGFuY2hvciwgZXZ0KTsKICAgIGVkaXRCdG4uZm9jdXMoKTsKICB9CgogIGZ1bmN0aW9uIHBvc2l0aW9uTWVudShtZW51LCBhbmNob3IsIGV2dCkgewogICAgdmFyIHIgPSBhbmNob3IgJiYgYW5jaG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCA/IGFuY2hvci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IHsgbGVmdDogKGV2dCAmJiBldnQuY2xpZW50WCkgfHwgMCwgYm90dG9tOiAoZXZ0ICYmIGV2dC5jbGllbnRZKSB8fCAwLCB0b3A6IChldnQgJiYgZXZ0LmNsaWVudFkpIHx8IDAsIHdpZHRoOiAwIH07CiAgICB2YXIgbXcgPSBtZW51Lm9mZnNldFdpZHRoIHx8IDE2OCwgbWggPSBtZW51Lm9mZnNldEhlaWdodCB8fCA5NjsKICAgIHZhciBsZWZ0ID0gTWF0aC5taW4od2luZG93LmlubmVyV2lkdGggLSBtdyAtIDgsIE1hdGgubWF4KDgsIHIubGVmdCkpOwogICAgdmFyIHRvcCA9IHIuYm90dG9tICsgNjsKICAgIGlmICh0b3AgKyBtaCA+IHdpbmRvdy5pbm5lckhlaWdodCAtIDgpIHRvcCA9IE1hdGgubWF4KDgsIHIudG9wIC0gbWggLSA2KTsKICAgIG1lbnUuc3R5bGUucG9zaXRpb24gPSAiZml4ZWQiOwogICAgbWVudS5zdHlsZS5sZWZ0ID0gbGVmdCArICJweCI7CiAgICBtZW51LnN0eWxlLnRvcCA9IHRvcCArICJweCI7CiAgICBtZW51LnN0eWxlLnpJbmRleCA9ICIxMDAwMSI7CiAgfQoKICBmdW5jdGlvbiBvcGVuRWRpdG9yKHByZXNldCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgZWRpdGluZyA9ICEhKHByZXNldCAmJiBwcmVzZXQuaWQpOwogICAgdmFyIGluaXRpYWwgPSBub3JtYWxpemVQcmVzZXQoT2JqZWN0LmFzc2lnbih7fSwgZWRpdGluZyA/IHByZXNldCA6IHt9LCBvcHRzLnByZWZpbGwgfHwge30sIGVkaXRpbmcgPyB7fSA6IHsgaWQ6IG51bGwgfSkpOwogICAgaWYgKCFlZGl0aW5nKSBpbml0aWFsLmlkID0gbnVsbDsKCiAgICB2YXIgbmFtZUlucHV0ID0gZWwoImlucHV0IiwgewogICAgICB0eXBlOiAidGV4dCIsICJjbGFzcyI6ICJ2LWZpZWxkIiwgbWF4bGVuZ3RoOiAiNjAiLCBwbGFjZWhvbGRlcjogIlByZXNldCBuYW1lIChlLmcuIFNjYW5kaSBTdGFnaW5nKSIsCiAgICAgIHZhbHVlOiBpbml0aWFsLm5hbWUgfHwgIiIsICJhcmlhLWxhYmVsIjogIlByZXNldCBuYW1lIiwgYXV0b2NvbXBsZXRlOiAib2ZmIgogICAgfSk7CiAgICB2YXIgcHJvbXB0SW5wdXQgPSBlbCgidGV4dGFyZWEiLCB7CiAgICAgICJjbGFzcyI6ICJ2LXRleHRhcmVhIiwgcm93czogIjUiLCBwbGFjZWhvbGRlcjogIkRlc2NyaWJlIHRoZSB0cmFuc2Zvcm1hdGlvbuKApiAobWluIDggY2hhcmFjdGVycykiLAogICAgICAiYXJpYS1sYWJlbCI6ICJQcm9tcHQiCiAgICB9KTsKICAgIHByb21wdElucHV0LnZhbHVlID0gaW5pdGlhbC5wcm9tcHQgfHwgIiI7CiAgICB2YXIgbmVnSW5wdXQgPSBlbCgidGV4dGFyZWEiLCB7CiAgICAgICJjbGFzcyI6ICJ2LXRleHRhcmVhIiwgcm93czogIjIiLCBwbGFjZWhvbGRlcjogIk5lZ2F0aXZlIHByb21wdCAob3B0aW9uYWwpIOKAlCB3aGF0IHRvIGF2b2lkIiwKICAgICAgImFyaWEtbGFiZWwiOiAiTmVnYXRpdmUgcHJvbXB0IgogICAgfSk7CiAgICBuZWdJbnB1dC52YWx1ZSA9IGluaXRpYWwubmVnYXRpdmVQcm9tcHQgfHwgIiI7CgogICAgdmFyIGNvdW50ZXIgPSBlbCgic3BhbiIsIHsgImNsYXNzIjogInYtbGFiZWwiIH0sICIiKTsKICAgIGZ1bmN0aW9uIHVwZGF0ZUNvdW50KCkgewogICAgICB2YXIgbiA9IChwcm9tcHRJbnB1dC52YWx1ZSB8fCAiIikudHJpbSgpLmxlbmd0aDsKICAgICAgY291bnRlci50ZXh0Q29udGVudCA9IG4gKyAiIGNoYXIiICsgKG4gPT09IDEgPyAiIiA6ICJzIik7CiAgICAgIGNvdW50ZXIuc3R5bGUuY29sb3IgPSAobiA+IDAgJiYgbiA8IDgpID8gInZhcigtLWNvbG9yLXdhcm5pbmcsICNGRkQ2MEEpIiA6ICIiOwogICAgfQogICAgcHJvbXB0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCB1cGRhdGVDb3VudCk7CiAgICB1cGRhdGVDb3VudCgpOwoKICAgIHZhciBlcnJCb3ggPSBlbCgiZGl2IiwgeyAiY2xhc3MiOiAidi1mb3JtLWVycm9yIiwgcm9sZTogImFsZXJ0IiwgImFyaWEtbGl2ZSI6ICJwb2xpdGUiLCBoaWRkZW46IHRydWUgfSk7CiAgICBmdW5jdGlvbiBzaG93RXJyKG0pIHsgZXJyQm94LnRleHRDb250ZW50ID0gbSB8fCAiIjsgZXJyQm94LmhpZGRlbiA9ICFtOyB9CgogICAgdmFyIHNhdmVCdG4gPSBlbCgiYnV0dG9uIiwgeyB0eXBlOiAiYnV0dG9uIiwgImNsYXNzIjogInYtY3RhIHYtY3RhLS1wcmltYXJ5IiB9LCBlZGl0aW5nID8gIlNhdmUgQ2hhbmdlcyIgOiAiQ3JlYXRlIFByZXNldCIpOwogICAgdmFyIGNhbmNlbEJ0biA9IGVsKCJidXR0b24iLCB7IHR5cGU6ICJidXR0b24iLCAiY2xhc3MiOiAidi1jdGEgdi1jdGEtLWdob3N0IiB9LCAiQ2FuY2VsIik7CiAgICB2YXIgZGVsQnRuID0gZWRpdGluZyA/IGVsKCJidXR0b24iLCB7IHR5cGU6ICJidXR0b24iLCAiY2xhc3MiOiAidi1jdGEgdi1jdGEtLWRhbmdlciIgfSwgIkRlbGV0ZSIpIDogbnVsbDsKCiAgICB2YXIgc3Bpbm5lciA9IHVpKCkuc3Bpbm5lciA/IHVpKCkuc3Bpbm5lcigxOCkgOiBlbCgic3BhbiIsIHsgImNsYXNzIjogInYtc3Bpbm5lciIgfSk7CiAgICBzcGlubmVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CgogICAgdmFyIGFjdGlvbnNSaWdodCA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LW1vZGFsX19hY3Rpb25zIiB9LCBbc3Bpbm5lciwgY2FuY2VsQnRuLCBzYXZlQnRuXSk7CiAgICB2YXIgYWN0aW9ucyA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LWN0YS1yb3ciIH0sIFsKICAgICAgZGVsQnRuIHx8IGVsKCJzcGFuIiwge30pLAogICAgICBhY3Rpb25zUmlnaHQKICAgIF0pOwogICAgYWN0aW9ucy5zdHlsZS5qdXN0aWZ5Q29udGVudCA9ICJzcGFjZS1iZXR3ZWVuIjsKICAgIGFjdGlvbnMuc3R5bGUuYWxpZ25JdGVtcyA9ICJjZW50ZXIiOwogICAgYWN0aW9ucy5zdHlsZS5mbGV4V3JhcCA9ICJ3cmFwIjsKICAgIGFjdGlvbnMuc3R5bGUuZ2FwID0gInZhcigtLXNwYWNlLW1kLCAxNXB4KSI7CgogICAgdmFyIGJvZHkgPSBlbCgiZGl2IiwgeyAiY2xhc3MiOiAidi1mb3JtIiB9LCBbCiAgICAgIGVsKCJkaXYiLCB7fSwgWwogICAgICAgIGVsKCJwIiwgeyAiY2xhc3MiOiAidi1leWVicm93IiB9LCBlZGl0aW5nID8gIkVkaXQgUHJlc2V0IiA6ICJOZXcgUHJlc2V0IiksCiAgICAgICAgZWwoImgyIiwgeyAiY2xhc3MiOiAidi1tb2RhbF9fdGl0bGUgdi1ncmFkaWVudCIgfSwgZWRpdGluZyA/ICJSZWZpbmUgeW91ciBzdHlsZSIgOiAiU2F2ZSBhIGN1c3RvbSBzdHlsZSIpCiAgICAgIF0pLAogICAgICBlbCgibGFiZWwiLCB7ICJjbGFzcyI6ICJ2LWZpZWxkLWdyb3VwIiB9LCBbZWwoInNwYW4iLCB7ICJjbGFzcyI6ICJ2LWxhYmVsIiB9LCAiTmFtZSIpLCBuYW1lSW5wdXRdKSwKICAgICAgZWwoImxhYmVsIiwgeyAiY2xhc3MiOiAidi1maWVsZC1ncm91cCIgfSwgWwogICAgICAgIGVsKCJzcGFuIiwgeyAiY2xhc3MiOiAidi1sYWJlbCIsIHN0eWxlOiAiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OXB4OyIgfSwgW2VsKCJzcGFuIiwge30sICJQcm9tcHQiKSwgY291bnRlcl0pLAogICAgICAgIHByb21wdElucHV0CiAgICAgIF0pLAogICAgICBlbCgibGFiZWwiLCB7ICJjbGFzcyI6ICJ2LWZpZWxkLWdyb3VwIiB9LCBbZWwoInNwYW4iLCB7ICJjbGFzcyI6ICJ2LWxhYmVsIiB9LCAiTmVnYXRpdmUgcHJvbXB0IiksIG5lZ0lucHV0XSksCiAgICAgIGVyckJveCwKICAgICAgYWN0aW9ucwogICAgXSk7CiAgICBib2R5LnN0eWxlLmRpc3BsYXkgPSAiZmxleCI7CiAgICBib2R5LnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAiY29sdW1uIjsKICAgIGJvZHkuc3R5bGUuZ2FwID0gInZhcigtLXNwYWNlLW1kLCAxNXB4KSI7CgogICAgdmFyIG1vZGFsUmVmID0gbnVsbDsKICAgIGZ1bmN0aW9uIGNsb3NlKCkgeyBpZiAobW9kYWxSZWYgJiYgbW9kYWxSZWYuY2xvc2UpIG1vZGFsUmVmLmNsb3NlKCk7IH0KCiAgICBmdW5jdGlvbiBzZXRCdXN5KGIpIHsKICAgICAgc3Bpbm5lci5zdHlsZS5kaXNwbGF5ID0gYiA/ICIiIDogIm5vbmUiOwogICAgICBzYXZlQnRuLmRpc2FibGVkID0gYjsgY2FuY2VsQnRuLmRpc2FibGVkID0gYjsgaWYgKGRlbEJ0bikgZGVsQnRuLmRpc2FibGVkID0gYjsKICAgICAgc2F2ZUJ0bi5jbGFzc0xpc3QudG9nZ2xlKCJpcy1idXN5IiwgYik7CiAgICB9CgogICAgZnVuY3Rpb24gZG9TYXZlKCkgewogICAgICB2YXIgbmFtZSA9IChuYW1lSW5wdXQudmFsdWUgfHwgIiIpLnRyaW0oKTsKICAgICAgdmFyIHByb21wdCA9IChwcm9tcHRJbnB1dC52YWx1ZSB8fCAiIikudHJpbSgpOwogICAgICB2YXIgbmVnID0gKG5lZ0lucHV0LnZhbHVlIHx8ICIiKS50cmltKCk7CiAgICAgIGlmICghbmFtZSkgeyBzaG93RXJyKCJHaXZlIHlvdXIgcHJlc2V0IGEgbmFtZS4iKTsgbmFtZUlucHV0LmZvY3VzKCk7IHJldHVybjsgfQogICAgICBpZiAocHJvbXB0Lmxlbmd0aCA8IDgpIHsgc2hvd0VycigiUHJvbXB0IG5lZWRzIGF0IGxlYXN0IDggY2hhcmFjdGVycy4iKTsgcHJvbXB0SW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIHNob3dFcnIoIiIpOwogICAgICBzZXRCdXN5KHRydWUpOwogICAgICB2YXIgcGF5bG9hZCA9IHsgbmFtZTogbmFtZSwgcHJvbXB0OiBwcm9tcHQsIG5lZ2F0aXZlUHJvbXB0OiBuZWcgfHwgbnVsbCwgbW9kZWw6IGluaXRpYWwubW9kZWwgfHwgbnVsbCB9OwogICAgICB2YXIgb3AgPSBlZGl0aW5nID8gdXBkYXRlKGluaXRpYWwuaWQsIHBheWxvYWQpIDogY3JlYXRlKHBheWxvYWQpOwogICAgICBvcC50aGVuKGZ1bmN0aW9uIChzYXZlZCkgewogICAgICAgIHNldEJ1c3koZmFsc2UpOwogICAgICAgIHRvYXN0KGVkaXRpbmcgPyAiUHJlc2V0IHVwZGF0ZWQiIDogIlByZXNldCBjcmVhdGVkIiwgInN1Y2Nlc3MiKTsKICAgICAgICBjbG9zZSgpOwogICAgICAgIGlmICh0eXBlb2Ygb3B0cy5vblNhdmVkID09PSAiZnVuY3Rpb24iKSBvcHRzLm9uU2F2ZWQoc2F2ZWQpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgc2V0QnVzeShmYWxzZSk7CiAgICAgICAgc2hvd0VycigiQ291bGRuJ3Qgc2F2ZS4gIiArIGVyck1zZyhlcnIpKTsKICAgICAgfSk7CiAgICB9CgogICAgc2F2ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGRvU2F2ZSk7CiAgICBjYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBjbG9zZSk7CiAgICBpZiAoZGVsQnRuKSBkZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBydW4gPSBmdW5jdGlvbiAoKSB7IHNldEJ1c3kodHJ1ZSk7IHJlbW92ZShpbml0aWFsLmlkKS50aGVuKGZ1bmN0aW9uICgpIHsgdG9hc3QoIlByZXNldCBkZWxldGVkIiwgInN1Y2Nlc3MiKTsgY2xvc2UoKTsgaWYgKHR5cGVvZiBvcHRzLm9uU2F2ZWQgPT09ICJmdW5jdGlvbiIpIG9wdHMub25TYXZlZChudWxsKTsgfSkuY2F0Y2goZnVuY3Rpb24gKCkgeyBzZXRCdXN5KGZhbHNlKTsgfSk7IH07CiAgICAgIGlmICh1aSgpLmNvbmZpcm0pIHVpKCkuY29uZmlybSgnRGVsZXRlICInICsgKGluaXRpYWwubmFtZSB8fCAidGhpcyBwcmVzZXQiKSArICciPycsIHsgZGVzdHJ1Y3RpdmU6IHRydWUsIGNvbmZpcm1MYWJlbDogIkRlbGV0ZSIgfSkudGhlbihmdW5jdGlvbiAob2spIHsgaWYgKG9rKSBydW4oKTsgfSk7CiAgICAgIGVsc2UgaWYgKHdpbmRvdy5jb25maXJtKCdEZWxldGUgIicgKyAoaW5pdGlhbC5uYW1lIHx8ICJ0aGlzIHByZXNldCIpICsgJyI/JykpIHJ1bigpOwogICAgfSk7CgogICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKChlLm1ldGFLZXkgfHwgZS5jdHJsS2V5KSAmJiBlLmtleSA9PT0gIkVudGVyIikgeyBlLnByZXZlbnREZWZhdWx0KCk7IGRvU2F2ZSgpOyB9CiAgICB9KTsKCiAgICBpZiAodWkoKS5tb2RhbCkgewogICAgICBtb2RhbFJlZiA9IHVpKCkubW9kYWwoYm9keSwgeyBhcmlhTGFiZWw6IGVkaXRpbmcgPyAiRWRpdCBwcmVzZXQiIDogIk5ldyBwcmVzZXQiLCBvbkNsb3NlOiBmdW5jdGlvbiAoKSB7fSB9KTsKICAgIH0gZWxzZSB7CiAgICAgIG1vZGFsUmVmID0gZmFsbGJhY2tNb2RhbChib2R5KTsKICAgIH0KICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyAoZWRpdGluZyA/IHByb21wdElucHV0IDogbmFtZUlucHV0KS5mb2N1cygpOyB9LCAzMCk7CiAgICByZXR1cm4gbW9kYWxSZWY7CiAgfQoKICBmdW5jdGlvbiBmYWxsYmFja01vZGFsKG5vZGUpIHsKICAgIHZhciBvdmVybGF5ID0gZWwoImRpdiIsIHsgImNsYXNzIjogInYtb3ZlcmxheS1zY3JpbSIsIHJvbGU6ICJwcmVzZW50YXRpb24iIH0pOwogICAgdmFyIHNoZWV0ID0gZWwoImRpdiIsIHsgImNsYXNzIjogInYtbW9kYWwgZ2xhc3MtY2FyZCIsIHJvbGU6ICJkaWFsb2ciLCAiYXJpYS1tb2RhbCI6ICJ0cnVlIiB9LCBub2RlKTsKICAgIG92ZXJsYXkuYXBwZW5kQ2hpbGQoc2hlZXQpOwogICAgZnVuY3Rpb24gY2xvc2UoKSB7IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBvbktleSwgdHJ1ZSk7IGlmIChvdmVybGF5LnBhcmVudE5vZGUpIG92ZXJsYXkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvdmVybGF5KTsgfQogICAgZnVuY3Rpb24gb25LZXkoZSkgeyBpZiAoZS5rZXkgPT09ICJFc2NhcGUiKSBjbG9zZSgpOyB9CiAgICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsgaWYgKGUudGFyZ2V0ID09PSBvdmVybGF5KSBjbG9zZSgpOyB9KTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBvbktleSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpOwogICAgcmV0dXJuIHsgY2xvc2U6IGNsb3NlIH07CiAgfQoKICBmdW5jdGlvbiBvcGVuSW5kdXN0cmllc1BpY2tlcihvbkRvbmUpIHsKICAgIHZhciBpbmRzID0gKFYuZGF0YSAmJiBBcnJheS5pc0FycmF5KFYuZGF0YS5pbmR1c3RyaWVzKSkgPyBWLmRhdGEuaW5kdXN0cmllcyA6IFtdOwogICAgaWYgKCFpbmRzLmxlbmd0aCkgeyB0b2FzdCgiTm8gaW5kdXN0cmllcyBhdmFpbGFibGUiKTsgaWYgKG9uRG9uZSkgb25Eb25lKCk7IHJldHVybjsgfQogICAgdmFyIHNlbGVjdGVkID0gKChWLnN0YXRlICYmIFYuc3RhdGUuaW5kdXN0cmllcykgfHwgW10pLnNsaWNlKCk7CgogICAgdmFyIGdyaWQgPSBlbCgiZGl2IiwgeyAiY2xhc3MiOiAidi1jaGlwLXJvdyIsIHJvbGU6ICJncm91cCIsICJhcmlhLWxhYmVsIjogIkluZHVzdHJpZXMiIH0pOwogICAgZ3JpZC5zdHlsZS5mbGV4V3JhcCA9ICJ3cmFwIjsKICAgIGdyaWQuc3R5bGUub3ZlcmZsb3dYID0gInZpc2libGUiOwogICAgaW5kcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmQpIHsKICAgICAgdmFyIG9uID0gc2VsZWN0ZWQuaW5kZXhPZihpbmQua2V5KSAhPT0gLTE7CiAgICAgIHZhciBiID0gZWwoImJ1dHRvbiIsIHsgdHlwZTogImJ1dHRvbiIsICJjbGFzcyI6ICJ2LWNoaXAiICsgKG9uID8gIiB2LWNoaXAtLWFjdGl2ZSIgOiAiIiksICJkYXRhLWtleSI6IGluZC5rZXksICJhcmlhLXByZXNzZWQiOiBvbiA/ICJ0cnVlIiA6ICJmYWxzZSIgfSwgaW5kLmxhYmVsIHx8IGluZC5rZXkpOwogICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBpID0gc2VsZWN0ZWQuaW5kZXhPZihpbmQua2V5KTsKICAgICAgICBpZiAoaSA9PT0gLTEpIHNlbGVjdGVkLnB1c2goaW5kLmtleSk7IGVsc2Ugc2VsZWN0ZWQuc3BsaWNlKGksIDEpOwogICAgICAgIHZhciBub3dPbiA9IHNlbGVjdGVkLmluZGV4T2YoaW5kLmtleSkgIT09IC0xOwogICAgICAgIGIuY2xhc3NMaXN0LnRvZ2dsZSgidi1jaGlwLS1hY3RpdmUiLCBub3dPbik7CiAgICAgICAgYi5zZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIsIG5vd09uID8gInRydWUiIDogImZhbHNlIik7CiAgICAgIH0pOwogICAgICBncmlkLmFwcGVuZENoaWxkKGIpOwogICAgfSk7CgogICAgdmFyIHNhdmVCdG4gPSBlbCgiYnV0dG9uIiwgeyB0eXBlOiAiYnV0dG9uIiwgImNsYXNzIjogInYtY3RhIHYtY3RhLS1wcmltYXJ5IiB9LCAiQXBwbHkiKTsKICAgIHZhciBhbGxCdG4gPSBlbCgiYnV0dG9uIiwgeyB0eXBlOiAiYnV0dG9uIiwgImNsYXNzIjogInYtY3RhIHYtY3RhLS1naG9zdCIgfSwgIlNob3cgYWxsIik7CgogICAgdmFyIGJvZHkgPSBlbCgiZGl2IiwgeyAiY2xhc3MiOiAidi1mb3JtIiB9LCBbCiAgICAgIGVsKCJkaXYiLCB7fSwgWwogICAgICAgIGVsKCJwIiwgeyAiY2xhc3MiOiAidi1leWVicm93IiB9LCAiRmlsdGVyIFByZXNldHMiKSwKICAgICAgICBlbCgiaDIiLCB7ICJjbGFzcyI6ICJ2LW1vZGFsX190aXRsZSB2LWdyYWRpZW50IiB9LCAiWW91ciBpbmR1c3RyaWVzIikKICAgICAgXSksCiAgICAgIGVsKCJwIiwgeyAiY2xhc3MiOiAidi1sYWJlbCIgfSwgIlRhaWxvciB0aGUgc3R5bGUgcHJlc2V0cyB0byB3aGF0IHlvdSB3b3JrIG9uLiIpLAogICAgICBncmlkLAogICAgICBlbCgiZGl2IiwgeyAiY2xhc3MiOiAidi1tb2RhbF9fYWN0aW9ucyIgfSwgW2FsbEJ0biwgc2F2ZUJ0bl0pCiAgICBdKTsKICAgIGJvZHkuc3R5bGUuZGlzcGxheSA9ICJmbGV4IjsKICAgIGJvZHkuc3R5bGUuZmxleERpcmVjdGlvbiA9ICJjb2x1bW4iOwogICAgYm9keS5zdHlsZS5nYXAgPSAidmFyKC0tc3BhY2UtbWQsIDE1cHgpIjsKCiAgICB2YXIgbW9kYWxSZWYgPSB1aSgpLm1vZGFsID8gdWkoKS5tb2RhbChib2R5LCB7IGFyaWFMYWJlbDogIkZpbHRlciBwcmVzZXRzIGJ5IGluZHVzdHJ5IiB9KSA6IGZhbGxiYWNrTW9kYWwoYm9keSk7CiAgICBmdW5jdGlvbiBjb21taXQoYXJyKSB7CiAgICAgIGlmIChzdG9yZSgpLnNldCkgc3RvcmUoKS5zZXQoImluZHVzdHJpZXMiLCBhcnIpOyBlbHNlIFYuc3RhdGUuaW5kdXN0cmllcyA9IGFycjsKICAgICAgaWYgKHN0b3JlKCkuc2F2ZSkgc3RvcmUoKS5zYXZlKCk7CiAgICAgIGlmIChzdG9yZSgpLmVtaXQpIHN0b3JlKCkuZW1pdCgiaW5kdXN0cmllczpjaGFuZ2VkIiwgYXJyKTsKICAgICAgaWYgKG1vZGFsUmVmICYmIG1vZGFsUmVmLmNsb3NlKSBtb2RhbFJlZi5jbG9zZSgpOwogICAgICBpZiAob25Eb25lKSBvbkRvbmUoKTsKICAgIH0KICAgIHNhdmVCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IGNvbW1pdChzZWxlY3RlZCk7IH0pOwogICAgYWxsQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgeyBjb21taXQoW10pOyB9KTsKICB9CgogIGZ1bmN0aW9uIHNhdmVQcmVzZXQoc2VlZCwgb3B0cykgewogICAgc2VlZCA9IHNlZWQgfHwge307CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBwcmVmaWxsID0gewogICAgICBuYW1lOiBzZWVkLm5hbWUgfHwgc3VnZ2VzdE5hbWUoc2VlZC5wcm9tcHQpLAogICAgICBwcm9tcHQ6IHNlZWQucHJvbXB0IHx8ICIiLAogICAgICBuZWdhdGl2ZVByb21wdDogc2VlZC5uZWdhdGl2ZVByb21wdCB8fCBudWxsLAogICAgICBtb2RlbDogc2VlZC5tb2RlbCB8fCBudWxsCiAgICB9OwogICAgcmV0dXJuIG9wZW5FZGl0b3IobnVsbCwgeyBwcmVmaWxsOiBwcmVmaWxsLCBvblNhdmVkOiBvcHRzLm9uU2F2ZWQgfSk7CiAgfQoKICBmdW5jdGlvbiBzdWdnZXN0TmFtZShwcm9tcHQpIHsKICAgIGlmICghcHJvbXB0KSByZXR1cm4gIiI7CiAgICB2YXIgd29yZHMgPSBTdHJpbmcocHJvbXB0KS50cmltKCkuc3BsaXQoL1xzKy8pLnNsaWNlKDAsIDQpLmpvaW4oIiAiKTsKICAgIHJldHVybiB3b3Jkcy5sZW5ndGggPiA0MCA/IHdvcmRzLnNsaWNlKDAsIDQwKSA6IHdvcmRzOwogIH0KCiAgVi5wcmVzZXRzID0gewogICAgYWxsOiBmdW5jdGlvbiAoKSB7IHJldHVybiBWLnN0YXRlLmN1c3RvbVByZXNldHMuc2xpY2UoKTsgfSwKICAgIHN3aXp6bGVzOiByZWxldmFudFN3aXp6bGVzLAogICAgaXNSZWxldmFudDogaXNSZWxldmFudCwKICAgIGxvYWQ6IGxvYWQsCiAgICBjcmVhdGU6IGNyZWF0ZSwKICAgIHVwZGF0ZTogdXBkYXRlLAogICAgcmVtb3ZlOiByZW1vdmUsCiAgICAiZGVsZXRlIjogcmVtb3ZlLAogICAgcmVvcmRlcjogcmVvcmRlciwKICAgIHJlbmRlckNoaXBzOiByZW5kZXJDaGlwcywKICAgIG9wZW5FZGl0b3I6IG9wZW5FZGl0b3IsCiAgICBvcGVuSW5kdXN0cmllczogb3BlbkluZHVzdHJpZXNQaWNrZXIsCiAgICBzYXZlUHJlc2V0OiBzYXZlUHJlc2V0CiAgfTsKCiAgcmVzdG9yZSgpOwp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9nZW5lcmF0ZS5qcyA9PT09PSAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIFYgPSB3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9OwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwoKICBmdW5jdGlvbiB1aSgpIHsgcmV0dXJuIFYudWkgfHwge307IH0KICBmdW5jdGlvbiBhcGkoKSB7IHJldHVybiBWLmFwaSB8fCB7fTsgfQogIGZ1bmN0aW9uIHV0aWwoKSB7IHJldHVybiBWLnV0aWwgfHwge307IH0KICBmdW5jdGlvbiBkYXRhKCkgeyByZXR1cm4gVi5kYXRhIHx8IHt9OyB9CiAgZnVuY3Rpb24gc3RhdGUoKSB7IHJldHVybiAoVi5zdGF0ZSA9IFYuc3RhdGUgfHwge30pOyB9CgogIGZ1bmN0aW9uIGVsKHRhZywgYXR0cnMpIHsKICAgIGlmICh1aSgpLmVsKSByZXR1cm4gdWkoKS5lbC5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICB2YXIgaSA9IDEsIGtpZHMgPSBbXTsKICAgIGlmIChhdHRycyAmJiB0eXBlb2YgYXR0cnMgPT09ICdvYmplY3QnICYmICEoYXR0cnMgaW5zdGFuY2VvZiBOb2RlKSAmJiB0eXBlb2YgYXR0cnMgIT09ICdzdHJpbmcnKSB7CiAgICAgIGkgPSAyOwogICAgICBmb3IgKHZhciBrIGluIGF0dHJzKSB7CiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cnMsIGspKSBjb250aW51ZTsKICAgICAgICB2YXIgdmFsID0gYXR0cnNba107CiAgICAgICAgaWYgKGsgPT09ICdjbGFzcycgfHwgayA9PT0gJ2NsYXNzTmFtZScpIG5vZGUuY2xhc3NOYW1lID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICd0ZXh0Jykgbm9kZS50ZXh0Q29udGVudCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAnaHRtbCcpIG5vZGUuaW5uZXJIVE1MID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsuaW5kZXhPZignb24nKSA9PT0gMCAmJiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCB2YWwpOwogICAgICAgIGVsc2UgaWYgKGsuaW5kZXhPZignZGF0YS0nKSA9PT0gMCkgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdmFsKTsKICAgICAgICBlbHNlIGlmICh2YWwgPT09IHRydWUpIG5vZGUuc2V0QXR0cmlidXRlKGssICcnKTsKICAgICAgICBlbHNlIGlmICh2YWwgIT0gbnVsbCAmJiB2YWwgIT09IGZhbHNlKSBub2RlLnNldEF0dHJpYnV0ZShrLCB2YWwpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGF0dHJzICE9IG51bGwpIHsga2lkcy5wdXNoKGF0dHJzKTsgfQogICAgZm9yICg7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGtpZHMucHVzaChhcmd1bWVudHNbaV0pOwogICAga2lkcy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGFwcGVuZENoaWxkKG5vZGUsIGMpOyB9KTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gYXBwZW5kQ2hpbGQobm9kZSwgYykgewogICAgaWYgKGMgPT0gbnVsbCB8fCBjID09PSBmYWxzZSkgcmV0dXJuOwogICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHsgYy5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7IGFwcGVuZENoaWxkKG5vZGUsIHgpOyB9KTsgcmV0dXJuOyB9CiAgICBpZiAoYyBpbnN0YW5jZW9mIE5vZGUpIHsgbm9kZS5hcHBlbmRDaGlsZChjKTsgcmV0dXJuOyB9CiAgICBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjKSkpOwogIH0KCiAgZnVuY3Rpb24gaWNvbihuYW1lKSB7CiAgICB0cnkgewogICAgICBpZiAodWkoKS5pY29uKSB7CiAgICAgICAgdmFyIGdvdCA9IHVpKCkuaWNvbihuYW1lKTsKICAgICAgICBpZiAodHlwZW9mIGdvdCA9PT0gJ3N0cmluZycpIHJldHVybiBnb3Q7CiAgICAgICAgaWYgKGdvdCAmJiBnb3Qubm9kZVR5cGUgJiYgdHlwZW9mIGdvdC5vdXRlckhUTUwgPT09ICdzdHJpbmcnKSByZXR1cm4gZ290Lm91dGVySFRNTDsKICAgICAgfQogICAgfSBjYXRjaCAoZSkge30KICAgIHJldHVybiAnJzsKICB9CgogIGZ1bmN0aW9uIGljb25Ob2RlKG5hbWUsIGdseXBoKSB7CiAgICB2YXIgaHRtbCA9IGljb24obmFtZSk7CiAgICBpZiAoaHRtbCkgeyB2YXIgc3BhbiA9IGVsKCdzcGFuJywgeyBjbGFzczogJ3YtaWNvJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBodG1sOiBodG1sIH0pOyByZXR1cm4gc3BhbjsgfQogICAgcmV0dXJuIGVsKCdzcGFuJywgeyAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSwgZ2x5cGggfHwgJycpOwogIH0KCiAgZnVuY3Rpb24gdG9hc3QobXNnLCBraW5kKSB7CiAgICBpZiAodWkoKS50b2FzdCkgeyB1aSgpLnRvYXN0KG1zZywga2luZCB8fCAnaW5mbycpOyByZXR1cm47IH0KICAgIGlmIChWLnN0b3JlICYmIFYuc3RvcmUuZW1pdCkgVi5zdG9yZS5lbWl0KCd0b2FzdCcsIHsgbXNnOiBtc2csIGtpbmQ6IGtpbmQgfHwgJ2luZm8nIH0pOwogIH0KCiAgZnVuY3Rpb24gZ28oaGFzaCkgewogICAgaWYgKFYucm91dGVyICYmIFYucm91dGVyLmdvKSBWLnJvdXRlci5nbyhoYXNoKTsKICAgIGVsc2Ugd2luZG93LmxvY2F0aW9uLmhhc2ggPSBoYXNoOwogIH0KCiAgZnVuY3Rpb24gdXVpZCgpIHsKICAgIGlmICh1dGlsKCkudXVpZCkgcmV0dXJuIHV0aWwoKS51dWlkKCk7CiAgICBpZiAod2luZG93LmNyeXB0byAmJiBjcnlwdG8ucmFuZG9tVVVJRCkgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7CiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykgewogICAgICB2YXIgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMCwgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDg7CiAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcmFuZG9tU2VlZCgpIHsKICAgIGlmICh1dGlsKCkucmFuZG9tU2VlZCkgcmV0dXJuIHV0aWwoKS5yYW5kb21TZWVkKCk7CiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMCk7CiAgfQoKICBmdW5jdGlvbiBub3dJU08oKSB7CiAgICByZXR1cm4gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1wuXGR7M31aJC8sICdaJyk7CiAgfQoKICBmdW5jdGlvbiBlc2MocykgewogICAgaWYgKHV0aWwoKS5lc2NhcGVIdG1sKSByZXR1cm4gdXRpbCgpLmVzY2FwZUh0bWwocyk7CiAgICByZXR1cm4gU3RyaW5nKHMgPT0gbnVsbCA/ICcnIDogcykucmVwbGFjZSgvWyY8PiInXS9nLCBmdW5jdGlvbiAoYykgewogICAgICByZXR1cm4geyAnJic6ICcmYW1wOycsICc8JzogJyZsdDsnLCAnPic6ICcmZ3Q7JywgJyInOiAnJnF1b3Q7JywgIiciOiAnJiMzOTsnIH1bY107CiAgICB9KTsKICB9CgogIHZhciBGQUxMQkFDS19NT0RFTFMgPSBbCiAgICB7IHJhdzogJ2ZsdXhLbGVpbicsICAgICBsYWJlbDogJ1N0YW5kYXJkJywgc3ViaGVhZGluZzogJ0ZsdXggS2xlaW4nLCAgICAgY29zdDogMTAsIG1heFJlZjogMSwgdDJpOiAnZmx1eDFTY2huZWxsJywgZGVmYXVsdDogdHJ1ZSB9LAogICAgeyByYXc6ICdmbHV4MUtvbnRleHQnLCAgbGFiZWw6ICdMZWdhY3knLCAgIHN1YmhlYWRpbmc6ICdGbHV4IEtvbnRleHQnLCAgIGNvc3Q6IDEwLCBtYXhSZWY6IDEgfSwKICAgIHsgcmF3OiAnbmFub0JhbmFuYScsICAgIGxhYmVsOiAnUHJvJywgICAgICBzdWJoZWFkaW5nOiAnTmFubyBCYW5hbmEnLCAgICBjb3N0OiAxMCwgbWF4UmVmOiA2IH0sCiAgICB7IHJhdzogJ25hbm9CYW5hbmEyJywgICBsYWJlbDogJ1BsdXMnLCAgICAgc3ViaGVhZGluZzogJ05hbm8gQmFuYW5hIDInLCAgY29zdDogMTUsIG1heFJlZjogNiB9LAogICAgeyByYXc6ICduYW5vQmFuYW5hUHJvJywgbGFiZWw6ICdNYXgnLCAgICAgIHN1YmhlYWRpbmc6ICdOYW5vIEJhbmFuYSBQcm8nLCBjb3N0OiAyMCwgbWF4UmVmOiAxNSB9CiAgXTsKICB2YXIgRkFMTEJBQ0tfQVNQRUNUUyA9IFsKICAgIHsgcmF3OiAnYXV0bycsICAgICAgICAgIGxhYmVsOiAnQXV0bycsICAgICAgICAgICB3OiAxMDI0LCBoOiAxMDI0IH0sCiAgICB7IHJhdzogJ3NxdWFyZScsICAgICAgICBsYWJlbDogJ1NxdWFyZScsICAgICAgICAgdzogMTAyNCwgaDogMTAyNCB9LAogICAgeyByYXc6ICdwb3J0cmFpdDkxNicsICAgbGFiZWw6ICdQb3J0cmFpdCA5OjE2JywgIHc6IDEwMjQsIGg6IDE4MjAgfSwKICAgIHsgcmF3OiAnbGFuZHNjYXBlMTY5JywgIGxhYmVsOiAnTGFuZHNjYXBlIDE2OjknLCB3OiAxODIwLCBoOiAxMDI0IH0sCiAgICB7IHJhdzogJ3BvcnRyYWl0NDMnLCAgICBsYWJlbDogJ1BvcnRyYWl0IDM6NCcsICAgdzogMTAyNCwgaDogMTM2NSB9LAogICAgeyByYXc6ICdsYW5kc2NhcGU0MycsICAgbGFiZWw6ICdMYW5kc2NhcGUgNDozJywgIHc6IDEzNjUsIGg6IDEwMjQgfQogIF07CgogIGZ1bmN0aW9uIG1vZGVscygpIHsKICAgIHZhciBtID0gZGF0YSgpLm1vZGVsczsKICAgIHJldHVybiAoQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCkgPyBtIDogRkFMTEJBQ0tfTU9ERUxTOwogIH0KICBmdW5jdGlvbiBhc3BlY3RzKCkgewogICAgdmFyIGEgPSBkYXRhKCkuYXNwZWN0czsKICAgIHJldHVybiAoQXJyYXkuaXNBcnJheShhKSAmJiBhLmxlbmd0aCkgPyBhIDogRkFMTEJBQ0tfQVNQRUNUUzsKICB9CgogIGZ1bmN0aW9uIG1vZGVsQnlSYXcocmF3KSB7CiAgICB2YXIgbGlzdCA9IG1vZGVscygpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSBpZiAobGlzdFtpXS5yYXcgPT09IHJhdykgcmV0dXJuIGxpc3RbaV07CiAgICByZXR1cm4gbGlzdFswXTsKICB9CgogIGZ1bmN0aW9uIG1heFJlZkZvcihtb2RlbCkgewogICAgdmFyIG4gPSBtb2RlbCAmJiAobW9kZWwubWF4UmVmICE9IG51bGwgPyBtb2RlbC5tYXhSZWYgOiBtb2RlbC5tYXhJbnB1dEltYWdlcyk7CiAgICByZXR1cm4gKHR5cGVvZiBuID09PSAnbnVtYmVyJyAmJiBuID4gMCkgPyBuIDogMTsKICB9CgogIHZhciBJTkRVU1RSWV9QTEFDRUhPTERFUlMgPSB7CiAgICByZWFsRXN0YXRlOiAnU3RhZ2UgdGhpcyBlbXB0eSBsaXZpbmcgcm9vbSB3aXRoIHdhcm0gbW9kZXJuIGZ1cm5pdHVyZSBhbmQgc29mdCBkYXlsaWdodOKApicsCiAgICBpbnRlcmlvckRlc2lnbjogJ1JlaW1hZ2luZSB0aGlzIHJvb20gaW4gYSB0cmFuc2l0aW9uYWwgc3R5bGUgd2l0aCBuYXR1cmFsIHRleHR1cmVz4oCmJywKICAgIGFyY2hpdGVjdHVyZTogJ1Zpc3VhbGl6ZSBhIG1vZGVybiBmYWNhZGUgd2l0aCBmbG9vci10by1jZWlsaW5nIGdsYXNzIGFuZCBjbGVhbiBsaW5lc+KApicsCiAgICBsYW5kc2NhcGluZzogJ0FkZCBsdXNoIGxhbmRzY2FwaW5nLCBhIHN0b25lIHBhdGgsIGFuZCBldmVuaW5nIGdhcmRlbiBsaWdodGluZ+KApicsCiAgICBmdXJuaXNoaW5nOiAnRnVybmlzaCB0aGlzIHNwYWNlIHdpdGggbWlkLWNlbnR1cnkgc2VhdGluZyBhbmQgYSBzdGF0ZW1lbnQgcnVn4oCmJywKICAgIGNvbnN0cnVjdGlvbjogJ1Nob3cgdGhlIGZpbmlzaGVkIGJ1aWxkIHdpdGggY29tcGxldGVkIHNpZGluZyBhbmQgYSBtYW5pY3VyZWQgbGF3buKApicsCiAgICBob21lT3duZXI6ICdSZXBhaW50IHRoZXNlIHdhbGxzIGEgd2FybSBuZXV0cmFsIGFuZCBicmlnaHRlbiB0aGUgbGlnaHRpbmfigKYnCiAgfTsKCiAgZnVuY3Rpb24gcGxhY2Vob2xkZXJUZXh0KCkgewogICAgdmFyIHMgPSBzdGF0ZSgpOwogICAgdmFyIGluZHMgPSBzLmluZHVzdHJpZXMgfHwgKHMuc2V0dGluZ3MgJiYgcy5zZXR0aW5ncy5pbmR1c3RyaWVzKSB8fCBbXTsKICAgIHZhciBrZXkgPSBudWxsOwogICAgaWYgKEFycmF5LmlzQXJyYXkoaW5kcykgJiYgaW5kcy5sZW5ndGgpIHsKICAgICAga2V5ID0gKHR5cGVvZiBpbmRzWzBdID09PSAnc3RyaW5nJykgPyBpbmRzWzBdIDogKGluZHNbMF0gJiYgKGluZHNbMF0ua2V5IHx8IGluZHNbMF0ucmF3KSk7CiAgICB9CiAgICBpZiAoa2V5ICYmIElORFVTVFJZX1BMQUNFSE9MREVSU1trZXldKSByZXR1cm4gSU5EVVNUUllfUExBQ0VIT0xERVJTW2tleV07CiAgICByZXR1cm4gJ0Rlc2NyaWJlIHdoYXQgeW91IHdhbnQgdG8gY3JlYXRlIG9yIHRyYW5zZm9ybeKApic7CiAgfQoKICB2YXIgY3VycmVudCA9IG51bGw7CgogIFYudmlld3MuY3JlYXRlID0gewogICAgcmVuZGVyOiBmdW5jdGlvbiAocm9vdCwgcGFyYW1zKSB7CiAgICAgIGlmIChjdXJyZW50KSB7IHRyeSB7IGN1cnJlbnQuZGVzdHJveSgpOyB9IGNhdGNoIChlKSB7fSBjdXJyZW50ID0gbnVsbDsgfQogICAgICBjdXJyZW50ID0gbmV3IENyZWF0b3Iocm9vdCwgcGFyYW1zIHx8IHt9KTsKICAgICAgY3VycmVudC5tb3VudCgpOwogICAgfSwKICAgIHRlYXJkb3duOiBmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChjdXJyZW50KSB7IHRyeSB7IGN1cnJlbnQuZGVzdHJveSgpOyB9IGNhdGNoIChlKSB7fSBjdXJyZW50ID0gbnVsbDsgfQogICAgfSwKICAgIGFwcGx5RXhhbXBsZTogZnVuY3Rpb24gKGV4YW1wbGUpIHsKICAgICAgZXhhbXBsZSA9IGV4YW1wbGUgfHwge307CiAgICAgIGlmIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50LmFwcGx5RXhhbXBsZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGN1cnJlbnQuYXBwbHlFeGFtcGxlKGV4YW1wbGUpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgcGFydHMgPSBbXTsKICAgICAgaWYgKGV4YW1wbGUucHJvbXB0KSBwYXJ0cy5wdXNoKCdwcm9tcHQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChleGFtcGxlLnByb21wdCkpOwogICAgICBpZiAoZXhhbXBsZS5tb2RlbCkgcGFydHMucHVzaCgnbW9kZWw9JyArIGVuY29kZVVSSUNvbXBvbmVudChleGFtcGxlLm1vZGVsKSk7CiAgICAgIGlmIChleGFtcGxlLnJlZmVyZW5jZVVSTCkgcGFydHMucHVzaCgnaW1hZ2U9JyArIGVuY29kZVVSSUNvbXBvbmVudChleGFtcGxlLnJlZmVyZW5jZVVSTCkpOwogICAgICBnbygnIy9jcmVhdGUnICsgKHBhcnRzLmxlbmd0aCA/ICc/JyArIHBhcnRzLmpvaW4oJyYnKSA6ICcnKSk7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gQ3JlYXRvcihyb290LCBwYXJhbXMpIHsKICAgIHRoaXMucm9vdCA9IHJvb3Q7CiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKCiAgICB0aGlzLnByb21wdCA9IHR5cGVvZiBwYXJhbXMucHJvbXB0ID09PSAnc3RyaW5nJyA/IHBhcmFtcy5wcm9tcHQgOiAnJzsKICAgIHRoaXMubW9kZWxSYXcgPSAocGFyYW1zLm1vZGVsICYmIG1vZGVsQnlSYXcocGFyYW1zLm1vZGVsKS5yYXcgPT09IHBhcmFtcy5tb2RlbCkgPyBwYXJhbXMubW9kZWwgOiBwaWNrRGVmYXVsdE1vZGVsKCk7CiAgICB0aGlzLmFzcGVjdFJhdyA9IHJlYWRQZXJzaXN0ZWQoJ2FzcGVjdCcpIHx8IGFzcGVjdHMoKVswXS5yYXc7CiAgICB0aGlzLmFjdGl2ZVByZXNldCA9IG51bGw7CiAgICB0aGlzLnJlZnMgPSBbXTsKCiAgICB2YXIgc2VlZEltYWdlID0gcGFyYW1zLmltYWdlIHx8IHBhcmFtcy5pbWFnZVVSTCB8fCBwYXJhbXMuaW1hZ2VfdXJsOwogICAgaWYgKHNlZWRJbWFnZSkgewogICAgICB0aGlzLnJlZnMucHVzaCh7IHVybDogc2VlZEltYWdlLCByZW1vdGVVUkw6IHNlZWRJbWFnZSwgbmFtZTogJ3JlZmVyZW5jZScgfSk7CiAgICB9CiAgICB0aGlzLnZhcmlhdGlvbnMgPSBmYWxzZTsKICAgIHRoaXMuYnVzeSA9IGZhbHNlOwogICAgdGhpcy5hYm9ydCA9IG51bGw7CgogICAgdGhpcy5fbGlzdGVuZXJzID0gW107CiAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTsKICAgIHRoaXMuX3ByZXNldEN0bCA9IG51bGw7CiAgfQoKICBmdW5jdGlvbiBwaWNrRGVmYXVsdE1vZGVsKCkgewogICAgdmFyIHNhdmVkID0gcmVhZFBlcnNpc3RlZCgnbW9kZWwnKTsKICAgIGlmIChzYXZlZCAmJiBtb2RlbEJ5UmF3KHNhdmVkKS5yYXcgPT09IHNhdmVkKSByZXR1cm4gc2F2ZWQ7CiAgICB2YXIgbGlzdCA9IG1vZGVscygpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSBpZiAobGlzdFtpXS5kZWZhdWx0KSByZXR1cm4gbGlzdFtpXS5yYXc7CiAgICByZXR1cm4gbGlzdFswXS5yYXc7CiAgfQoKICBmdW5jdGlvbiByZWFkUGVyc2lzdGVkKGspIHsKICAgIHRyeSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndmFtcF93ZWJfY3JlYXRlXycgKyBrKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogIH0KICBmdW5jdGlvbiB3cml0ZVBlcnNpc3RlZChrLCB2KSB7CiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndmFtcF93ZWJfY3JlYXRlXycgKyBrLCB2KTsgfSBjYXRjaCAoZSkge30KICB9CgogIENyZWF0b3IucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKHRhcmdldCwgZXZ0LCBmbiwgb3B0cykgewogICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCBmbiwgb3B0cyB8fCBmYWxzZSk7CiAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChbdGFyZ2V0LCBldnQsIGZuLCBvcHRzIHx8IGZhbHNlXSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7CiAgICBpZiAodGhpcy5hYm9ydCkgeyB0cnkgeyB0aGlzLmFib3J0LmFib3J0KCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIGlmICh0aGlzLl9wcmVzZXRDdGwgJiYgdHlwZW9mIHRoaXMuX3ByZXNldEN0bC5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IHRoaXMuX3ByZXNldEN0bC5kZXN0cm95KCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIHRoaXMuX3ByZXNldEN0bCA9IG51bGw7CiAgICB0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobCkgeyB0cnkgeyBsWzBdLnJlbW92ZUV2ZW50TGlzdGVuZXIobFsxXSwgbFsyXSwgbFszXSk7IH0gY2F0Y2ggKGUpIHt9IH0pOwogICAgdGhpcy5fbGlzdGVuZXJzID0gW107CiAgICB0aGlzLmNsZWFyUmVmcygpOwogICAgaWYgKHRoaXMuX3NjcmltICYmIHRoaXMuX3NjcmltLnBhcmVudE5vZGUpIHRoaXMuX3NjcmltLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fc2NyaW0pOwogICAgdGhpcy5fc2NyaW0gPSBudWxsOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmN1cnJlbnRNb2RlbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1vZGVsQnlSYXcodGhpcy5tb2RlbFJhdyk7IH07CiAgQ3JlYXRvci5wcm90b3R5cGUuaGFzSW5wdXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnJlZnMubGVuZ3RoID4gMDsgfTsKICBDcmVhdG9yLnByb3RvdHlwZS5pc1QySSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICF0aGlzLmhhc0lucHV0KCk7IH07CgogIENyZWF0b3IucHJvdG90eXBlLnVuaXRDb3N0ID0gZnVuY3Rpb24gKCkgewogICAgaWYgKHRoaXMuaXNUMkkoKSkgcmV0dXJuIDE7CiAgICB2YXIgbSA9IHRoaXMuY3VycmVudE1vZGVsKCk7CiAgICByZXR1cm4gKG0gJiYgdHlwZW9mIG0uY29zdCA9PT0gJ251bWJlcicpID8gbS5jb3N0IDogMTA7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUudG90YWxDb3N0ID0gZnVuY3Rpb24gKCkgewogICAgdmFyIGNvdW50ID0gdGhpcy52YXJpYXRpb25zID8gNCA6IDE7CiAgICByZXR1cm4gdGhpcy51bml0Q29zdCgpICogY291bnQ7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuZmluYWxQcm9tcHQgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgdHlwZWQgPSAodGhpcy5wcm9tcHQgfHwgJycpLnRyaW0oKTsKICAgIGlmICh0aGlzLmFjdGl2ZVByZXNldCAmJiB0aGlzLmFjdGl2ZVByZXNldC5wcm9tcHQpIHsKICAgICAgdmFyIHByZSA9IHRoaXMuYWN0aXZlUHJlc2V0LnByb21wdC50cmltKCk7CiAgICAgIHJldHVybiB0eXBlZCA/IChwcmUgKyAnICcgKyB0eXBlZCkgOiBwcmU7CiAgICB9CiAgICByZXR1cm4gdHlwZWQ7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuY2FuU3VibWl0ID0gZnVuY3Rpb24gKCkgewogICAgaWYgKHRoaXMuYnVzeSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKHRoaXMuaGFzSW5wdXQoKSkgcmV0dXJuIHRydWU7CiAgICBpZiAodGhpcy5hY3RpdmVQcmVzZXQgJiYgdGhpcy5hY3RpdmVQcmVzZXQucHJvbXB0KSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiAodGhpcy5wcm9tcHQgfHwgJycpLnRyaW0oKS5sZW5ndGggPj0gODsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5tb3VudCA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciByb290ID0gdGhpcy5yb290OwogICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgIHJvb3QuY2xhc3NOYW1lID0gJ3YtdmlldyB2LWNyZWF0ZSc7CgogICAgdmFyIGxpYnJhcnlFbXB0eSA9ICEoc3RhdGUoKS5saWJyYXJ5ICYmIHN0YXRlKCkubGlicmFyeS5sZW5ndGgpOwoKICAgIHZhciBjb250cm9scyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX21haW4nIH0pOwogICAgdGhpcy5idWlsZENvbnRyb2xzKGNvbnRyb2xzKTsKCiAgICB2YXIgc2lkZSA9IGVsKCdhc2lkZScsIHsgY2xhc3M6ICd2LXNpZGUtcGFuZWwgdi1jcmVhdGVfX3NpZGUnIH0pOwogICAgdHJ5IHsgc2lkZS5hcHBlbmRDaGlsZCh0aGlzLmJ1aWxkU2lkZShsaWJyYXJ5RW1wdHkpKTsgfSBjYXRjaCAoZSkge30KCiAgICB2YXIgbGF5b3V0ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNwbGl0LWxheW91dCcgfSwgY29udHJvbHMsIHNpZGUpOwogICAgcm9vdC5hcHBlbmRDaGlsZChsYXlvdXQpOwoKICAgIHRoaXMuX3NpZGVOb2RlID0gc2lkZTsKICAgIHRoaXMucmVmcmVzaENUQSgpOwogICAgdGhpcy5yZWZyZXNoQXNwZWN0VmlzaWJpbGl0eSgpOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmJ1aWxkQ29udHJvbHMgPSBmdW5jdGlvbiAoaG9zdCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgZnVuY3Rpb24gYWRkKGZuKSB7CiAgICAgIHZhciBub2RlID0gbnVsbDsKICAgICAgdHJ5IHsgbm9kZSA9IGZuLmNhbGwoc2VsZik7IH0gY2F0Y2ggKGUpIHsgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmVycm9yKCdbY3JlYXRlXSBzZWN0aW9uIGZhaWxlZCcsIGUpOyB9CiAgICAgIGlmIChub2RlKSBob3N0LmFwcGVuZENoaWxkKG5vZGUpOwogICAgfQoKICAgIGFkZCh0aGlzLmJ1aWxkSGVhZGVyKTsKICAgIGFkZCh0aGlzLmJ1aWxkSW1hZ2Vab25lKTsKICAgIGFkZCh0aGlzLmJ1aWxkUHJvbXB0KTsKICAgIGFkZCh0aGlzLmJ1aWxkUHJlc2V0cyk7CiAgICBhZGQodGhpcy5idWlsZFNlbGVjdG9ycyk7CiAgICBhZGQodGhpcy5idWlsZEFjdGlvbnMpOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmJ1aWxkSGVhZGVyID0gZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIGVsKCdoZWFkZXInLCB7IGNsYXNzOiAndi1zZWN0aW9uX19oZWFkIHYtY3JlYXRlX19oZWFkJyB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3JlYXRlX19oZWFkdGV4dCcgfSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnIH0sICdWYW1wIFN0dWRpbycpLAogICAgICAgIGVsKCdoMScsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fdGl0bGUgdi1ncmFkaWVudCcgfSwgJ0NyZWF0ZSBvciB0cmFuc2Zvcm0nKSwKICAgICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YicgfSwgJ0Rlc2NyaWJlIGEgc2NlbmUsIG9yIGRyb3AgYW4gaW1hZ2UgdG8gcmVzdHlsZSwgc3RhZ2UsIGFuZCByZWltYWdpbmUgaXQuJykKICAgICAgKSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRJbWFnZVpvbmUgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgc2VjdGlvbiA9IGVsKCdzZWN0aW9uJywgeyBjbGFzczogJ3YtZmllbGQtZ3JvdXAgdi1jcmVhdGVfX2ltZ3pvbmUnLCAnYXJpYS1sYWJlbCc6ICdSZWZlcmVuY2UgaW1hZ2VzJyB9KTsKICAgIHRoaXMuX2ltZ3pvbmUgPSBzZWN0aW9uOwoKICAgIHZhciBmaWxlSW5wdXQgPSBlbCgnaW5wdXQnLCB7CiAgICAgIHR5cGU6ICdmaWxlJywgYWNjZXB0OiAnaW1hZ2UvKicsIG11bHRpcGxlOiB0cnVlLAogICAgICBjbGFzczogJ3YtdmlzdWFsbHktaGlkZGVuJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCB0YWJpbmRleDogJy0xJywKICAgICAgc3R5bGU6ICdwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7aGVpZ2h0OjFweDtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZScKICAgIH0pOwogICAgdGhpcy5vbihmaWxlSW5wdXQsICdjaGFuZ2UnLCBmdW5jdGlvbiAoZSkgewogICAgICBzZWxmLmFkZEZpbGVzKGUudGFyZ2V0LmZpbGVzKTsKICAgICAgZmlsZUlucHV0LnZhbHVlID0gJyc7CiAgICB9KTsKICAgIHRoaXMuX2ZpbGVJbnB1dCA9IGZpbGVJbnB1dDsKICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQoZmlsZUlucHV0KTsKCiAgICB0aGlzLm9uKGRvY3VtZW50LCAncGFzdGUnLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoc2VsZi5fZGVzdHJveWVkIHx8IHNlbGYuYnVzeSkgcmV0dXJuOwogICAgICB2YXIgaXRlbXMgPSAoZS5jbGlwYm9hcmREYXRhICYmIGUuY2xpcGJvYXJkRGF0YS5pdGVtcykgfHwgW107CiAgICAgIHZhciBmaWxlcyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGl0ZW1zW2ldLmtpbmQgPT09ICdmaWxlJyAmJiBpdGVtc1tpXS50eXBlLmluZGV4T2YoJ2ltYWdlLycpID09PSAwKSB7CiAgICAgICAgICB2YXIgZiA9IGl0ZW1zW2ldLmdldEFzRmlsZSgpOwogICAgICAgICAgaWYgKGYpIGZpbGVzLnB1c2goZik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChmaWxlcy5sZW5ndGgpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzZWxmLmFkZEZpbGVzKGZpbGVzKTsgfQogICAgfSk7CgogICAgdGhpcy5yZW5kZXJJbWFnZVpvbmUoKTsKICAgIHJldHVybiBzZWN0aW9uOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmJpbmREbmQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBbJ2RyYWdlbnRlcicsICdkcmFnb3ZlciddLmZvckVhY2goZnVuY3Rpb24gKGV2dCkgewogICAgICBzZWxmLm9uKHRhcmdldCwgZXZ0LCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRhcmdldC5jbGFzc0xpc3QuYWRkKCdkcmFnb3ZlcicpOyB9KTsKICAgIH0pOwogICAgWydkcmFnbGVhdmUnLCAnZHJhZ2VuZCddLmZvckVhY2goZnVuY3Rpb24gKGV2dCkgewogICAgICBzZWxmLm9uKHRhcmdldCwgZXZ0LCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnb3ZlcicpOyB9KTsKICAgIH0pOwogICAgdGhpcy5vbih0YXJnZXQsICdkcm9wJywgZnVuY3Rpb24gKGUpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZ292ZXInKTsKICAgICAgdmFyIGR0ID0gZS5kYXRhVHJhbnNmZXI7CiAgICAgIGlmIChkdCAmJiBkdC5maWxlcyAmJiBkdC5maWxlcy5sZW5ndGgpIHNlbGYuYWRkRmlsZXMoZHQuZmlsZXMpOwogICAgfSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUucmVuZGVySW1hZ2Vab25lID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9pbWd6b25lOwogICAgaWYgKCFzZWN0aW9uKSByZXR1cm47CiAgICBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzZWN0aW9uLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjICE9PSBzZWxmLl9maWxlSW5wdXQpIHNlY3Rpb24ucmVtb3ZlQ2hpbGQoYyk7CiAgICB9KTsKCiAgICB2YXIgbW9kZWwgPSB0aGlzLmN1cnJlbnRNb2RlbCgpOwogICAgdmFyIG1heCA9IG1heFJlZkZvcihtb2RlbCk7CgogICAgaWYgKCF0aGlzLnJlZnMubGVuZ3RoKSB7CiAgICAgIHZhciB6b25lID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyb3B6b25lJywgcm9sZTogJ2J1dHRvbicsIHRhYmluZGV4OiAnMCcsCiAgICAgICAgJ2FyaWEtbGFiZWwnOiAnQWRkIGEgcmVmZXJlbmNlIGltYWdlJyB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eV9faWNvbicsIGh0bWw6IGljb24oJ3Bob3RvJykgfHwgZHJvcEdseXBoKCkgfSksCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fZHJvcHRpdGxlJyB9LCAnRHJvcCBhbiBpbWFnZSwgcGFzdGUsIG9yIGJyb3dzZScpLAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zZWN0aW9uX19zdWInIH0sCiAgICAgICAgICAnT3B0aW9uYWwg4oCUIGxlYXZlIGVtcHR5IHRvIGdlbmVyYXRlIGZyb20gdGV4dC4gJyArCiAgICAgICAgICAobWF4ID4gMSA/ICgnVXAgdG8gJyArIG1heCArICcgcmVmZXJlbmNlcyBmb3IgJyArIChtb2RlbC5sYWJlbCB8fCAndGhpcyBtb2RlbCcpICsgJy4nKSA6ICcnKSkpOwogICAgICB0aGlzLmJpbmREbmQoem9uZSk7CiAgICAgIHRoaXMub24oem9uZSwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBzZWxmLl9maWxlSW5wdXQuY2xpY2soKTsgfSk7CiAgICAgIHRoaXMub24oem9uZSwgJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkgewogICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJyAnKSB7IGUucHJldmVudERlZmF1bHQoKTsgc2VsZi5fZmlsZUlucHV0LmNsaWNrKCk7IH0KICAgICAgfSk7CiAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQoem9uZSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgb3ZlckxpbWl0ID0gdGhpcy5yZWZzLmxlbmd0aCA+IG1heDsKICAgIHZhciBoZWFkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX2hlYWQgdi1jcmVhdGVfX2ltZ2hlYWQnIH0sCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZXllYnJvdycgfSwgKHRoaXMucmVmcy5sZW5ndGggPiAxID8gJ1JlZmVyZW5jZXMnIDogJ1NvdXJjZSBpbWFnZScpKSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1sYWJlbCB2LWNyZWF0ZV9faW1nY291bnQnICsgKG92ZXJMaW1pdCA/ICcgaXMtb3ZlcicgOiAnJykgfSwKICAgICAgICB0aGlzLnJlZnMubGVuZ3RoICsgJyAvICcgKyBtYXgpKTsKICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQoaGVhZCk7CgogICAgdmFyIGdyaWQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZ3JpZCB2LWdyaWQtLWF1dG8gdi1jcmVhdGVfX3RodW1icycgfSk7CiAgICB0aGlzLmJpbmREbmQoZ3JpZCk7CiAgICB0aGlzLnJlZnMuZm9yRWFjaChmdW5jdGlvbiAocmVmLCBpZHgpIHsKICAgICAgdmFyIHRodW1iID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fdGh1bWInICsgKGlkeCA9PT0gMCAmJiBzZWxmLnJlZnMubGVuZ3RoID4gMSA/ICcgaXMtcHJpbWFyeScgOiAnJykgfSk7CiAgICAgIHZhciB0aHVtYkltZyA9IGVsKCdpbWcnLCB7IHNyYzogcmVmLnVybCwgYWx0OiByZWYubmFtZSB8fCAoJ3JlZmVyZW5jZSAnICsgKGlkeCArIDEpKSwgbG9hZGluZzogJ2xhenknIH0pOwogICAgICB0aHVtYkltZy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHsgdGh1bWIuY2xhc3NMaXN0LmFkZCgnaXMtYnJva2VuJyk7IH0pOwogICAgICB0aHVtYi5hcHBlbmRDaGlsZCh0aHVtYkltZyk7CiAgICAgIGlmIChpZHggPT09IDAgJiYgc2VsZi5yZWZzLmxlbmd0aCA+IDEpIHsKICAgICAgICB0aHVtYi5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXRodW1iX19iYWRnZSB2LWNyZWF0ZV9fdGh1bWItYmFkZ2UnIH0sICdCZWZvcmUnKSk7CiAgICAgIH0KICAgICAgdmFyIHJtID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fdGh1bWItcm0nLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiAnUmVtb3ZlIGltYWdlJywgdGl0bGU6ICdSZW1vdmUgaW1hZ2UnIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7ICdhcmlhLWhpZGRlbic6ICd0cnVlJywgaHRtbDogaWNvbigneG1hcmsnKSB8fCAnw5cnIH0pKTsKICAgICAgc2VsZi5vbihybSwgJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgc2VsZi5yZW1vdmVSZWYoaWR4KTsgfSk7CiAgICAgIHRodW1iLmFwcGVuZENoaWxkKHJtKTsKICAgICAgZ3JpZC5hcHBlbmRDaGlsZCh0aHVtYik7CiAgICB9KTsKCiAgICBpZiAodGhpcy5yZWZzLmxlbmd0aCA8IG1heCkgewogICAgICB2YXIgYWRkID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fdGh1bWIgdi1jcmVhdGVfX3RodW1iLWFkZCcsIHR5cGU6ICdidXR0b24nLCAnYXJpYS1sYWJlbCc6ICdBZGQgYW5vdGhlciBpbWFnZScgfSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fcGx1cycsICdhcmlhLWhpZGRlbic6ICd0cnVlJywgaHRtbDogaWNvbigncGx1cycpIHx8ICcrJyB9KSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWxhYmVsJyB9LCAnKycgKyAobWF4IC0gdGhpcy5yZWZzLmxlbmd0aCkpKTsKICAgICAgc2VsZi5vbihhZGQsICdjbGljaycsIGZ1bmN0aW9uICgpIHsgc2VsZi5fZmlsZUlucHV0LmNsaWNrKCk7IH0pOwogICAgICBncmlkLmFwcGVuZENoaWxkKGFkZCk7CiAgICB9CiAgICBzZWN0aW9uLmFwcGVuZENoaWxkKGdyaWQpOwoKICAgIGlmICh0aGlzLnJlZnMubGVuZ3RoID4gbWF4KSB7CiAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVycm9yJyB9LAogICAgICAgIGVsKCdzcGFuJywgeyAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIGh0bWw6IGljb24oJ2V4Y2xhbWF0aW9uJykgfHwgJyEnIH0pLAogICAgICAgIGVsKCdzcGFuJywgbnVsbCwgJ09ubHkgdGhlIGZpcnN0ICcgKyBtYXggKyAnIHdpbGwgYmUgdXNlZCBieSAnICsgKG1vZGVsLmxhYmVsIHx8ICd0aGlzIG1vZGVsJykgKyAnLiBQaWNrIGEgaGlnaGVyIHRpZXIgZm9yIG1vcmUuJykpKTsKICAgIH0KICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YicgfSwKICAgICAgJ0VkaXRpbmcgbW9kZSDigJQgb3V0cHV0IHNpemUgZm9sbG93cyB5b3VyIHNvdXJjZSBpbWFnZS4nKSk7CiAgfTsKCiAgZnVuY3Rpb24gZHJvcEdseXBoKCkgewogICAgcmV0dXJuICc8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI2IiBoZWlnaHQ9IjI2IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgJyArCiAgICAgICdzdHJva2Utd2lkdGg9IjEuNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JyArCiAgICAgICc8cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHJ4PSIzIi8+PGNpcmNsZSBjeD0iOC41IiBjeT0iOSIgcj0iMS44Ii8+JyArCiAgICAgICc8cGF0aCBkPSJNMjEgMTZsLTUtNS03IDciLz48L3N2Zz4nOwogIH0KCiAgQ3JlYXRvci5wcm90b3R5cGUuYWRkRmlsZXMgPSBmdW5jdGlvbiAoZmlsZUxpc3QpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciBmaWxlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZpbGVMaXN0IHx8IFtdKS5maWx0ZXIoZnVuY3Rpb24gKGYpIHsKICAgICAgcmV0dXJuIGYgJiYgZi50eXBlICYmIGYudHlwZS5pbmRleE9mKCdpbWFnZS8nKSA9PT0gMDsKICAgIH0pOwogICAgaWYgKCFmaWxlcy5sZW5ndGgpIHsgdG9hc3QoJ05vIGltYWdlIGZvdW5kIGluIHRoYXQgZHJvcC4nLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICB2YXIgbW9kZWwgPSB0aGlzLmN1cnJlbnRNb2RlbCgpOwogICAgdmFyIG1heCA9IG1heFJlZkZvcihtb2RlbCk7CiAgICB2YXIgcm9vbSA9IG1heCAtIHRoaXMucmVmcy5sZW5ndGg7CiAgICBpZiAocm9vbSA8PSAwKSB7IHRvYXN0KCdUaGlzIG1vZGVsIGFjY2VwdHMgdXAgdG8gJyArIG1heCArICcgaW1hZ2UnICsgKG1heCA+IDEgPyAncycgOiAnJykgKyAnLicsICdpbmZvJyk7IHJldHVybjsgfQogICAgZmlsZXMuc2xpY2UoMCwgcm9vbSkuZm9yRWFjaChmdW5jdGlvbiAoZikgewogICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmKTsKICAgICAgc2VsZi5yZWZzLnB1c2goeyBmaWxlOiBmLCB1cmw6IHVybCwgbmFtZTogZi5uYW1lIHx8ICdpbWFnZScgfSk7CiAgICB9KTsKICAgIGlmIChmaWxlcy5sZW5ndGggPiByb29tKSB0b2FzdCgnQWRkZWQgJyArIHJvb20gKyAnOyB0aGlzIG1vZGVsIG1heGVzIGF0ICcgKyBtYXggKyAnLicsICdpbmZvJyk7CiAgICB0aGlzLmFmdGVySW5wdXRDaGFuZ2UoKTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZW1vdmVSZWYgPSBmdW5jdGlvbiAoaWR4KSB7CiAgICB2YXIgcmVmID0gdGhpcy5yZWZzW2lkeF07CiAgICBpZiAocmVmICYmIHJlZi51cmwgJiYgcmVmLnVybC5pbmRleE9mKCdibG9iOicpID09PSAwKSB7IHRyeSB7IFVSTC5yZXZva2VPYmplY3RVUkwocmVmLnVybCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIHRoaXMucmVmcy5zcGxpY2UoaWR4LCAxKTsKICAgIHRoaXMuYWZ0ZXJJbnB1dENoYW5nZSgpOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmNsZWFyUmVmcyA9IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMucmVmcy5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IGlmIChyLnVybCAmJiByLnVybC5pbmRleE9mKCdibG9iOicpID09PSAwKSB7IHRyeSB7IFVSTC5yZXZva2VPYmplY3RVUkwoci51cmwpOyB9IGNhdGNoIChlKSB7fSB9IH0pOwogICAgdGhpcy5yZWZzID0gW107CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYWZ0ZXJJbnB1dENoYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMucmVuZGVySW1hZ2Vab25lKCk7CiAgICB0aGlzLnJlZnJlc2hBc3BlY3RWaXNpYmlsaXR5KCk7CiAgICB0aGlzLnJlZnJlc2hDVEEoKTsKICAgIGlmICh0aGlzLl9wcm9tcHRGaWVsZCkgdGhpcy5fcHJvbXB0RmllbGQucGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyRm9yTW9kZSgpOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnBsYWNlaG9sZGVyRm9yTW9kZSA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLmhhc0lucHV0KCkpIHJldHVybiAnRGVzY3JpYmUgdGhlIGNoYW5nZSDigJQgZS5nLiAic3RhZ2Ugd2l0aCB3YXJtIG1vZGVybiBmdXJuaXR1cmUi4oCmIChvcHRpb25hbCB3aXRoIGEgcHJlc2V0KSc7CiAgICByZXR1cm4gcGxhY2Vob2xkZXJUZXh0KCk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRQcm9tcHQgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgZ3JvdXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZmllbGQtZ3JvdXAgdi1jcmVhdGVfX3Byb21wdCcgfSk7CiAgICBncm91cC5hcHBlbmRDaGlsZChlbCgnbGFiZWwnLCB7IGNsYXNzOiAndi1leWVicm93JywgZm9yOiAndi1wcm9tcHQnIH0sICdQcm9tcHQnKSk7CgogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3JlYXRlX190YS13cmFwJyB9KTsKICAgIHZhciB0YSA9IGVsKCd0ZXh0YXJlYScsIHsKICAgICAgaWQ6ICd2LXByb21wdCcsIGNsYXNzOiAndi10ZXh0YXJlYSB2LXRleHRhcmVhLS1sZyB2LWNyZWF0ZV9fdGEnLCByb3dzOiAnMycsCiAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnBsYWNlaG9sZGVyRm9yTW9kZSgpLAogICAgICAnYXJpYS1kZXNjcmliZWRieSc6ICd2LXByb21wdC1oZWxwJwogICAgfSk7CiAgICB0YS52YWx1ZSA9IHRoaXMucHJvbXB0OwogICAgdGhpcy5fcHJvbXB0RmllbGQgPSB0YTsKCiAgICB2YXIgY2xlYXJCdG4gPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3JlYXRlX190YS1jbGVhcicsIHR5cGU6ICdidXR0b24nLCAnYXJpYS1sYWJlbCc6ICdDbGVhciBwcm9tcHQnLCB0aXRsZTogJ0NsZWFyIHByb21wdCcgfSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVhdGVfX3RhLWNsZWFyLWdseXBoJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBodG1sOiBpY29uKCd4bWFyaycpIHx8ICfDlycgfSkpOwogICAgY2xlYXJCdG4uaGlkZGVuID0gIXRoaXMucHJvbXB0OwoKICAgIHZhciBhdXRvID0gZnVuY3Rpb24gKCkgewogICAgICB0YS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7CiAgICAgIHRhLnN0eWxlLmhlaWdodCA9IE1hdGgubWluKHRhLnNjcm9sbEhlaWdodCwgMzIwKSArICdweCc7CiAgICB9OwogICAgdGhpcy5vbih0YSwgJ2lucHV0JywgZnVuY3Rpb24gKCkgewogICAgICBzZWxmLnByb21wdCA9IHRhLnZhbHVlOwogICAgICBhdXRvKCk7CiAgICAgIHNlbGYucmVmcmVzaENUQSgpOwogICAgICBjbGVhckJ0bi5oaWRkZW4gPSAhdGEudmFsdWU7CiAgICB9KTsKICAgIHRoaXMub24odGEsICdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKChlLm1ldGFLZXkgfHwgZS5jdHJsS2V5KSAmJiBlLmtleSA9PT0gJ0VudGVyJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IHNlbGYuZ2VuZXJhdGUoKTsgfQogICAgfSk7CiAgICB0aGlzLm9uKGNsZWFyQnRuLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgIHRhLnZhbHVlID0gJyc7IHNlbGYucHJvbXB0ID0gJyc7IGF1dG8oKTsgc2VsZi5yZWZyZXNoQ1RBKCk7CiAgICAgIGNsZWFyQnRuLmhpZGRlbiA9IHRydWU7IHRhLmZvY3VzKCk7CiAgICB9KTsKCiAgICB3cmFwLmFwcGVuZENoaWxkKHRhKTsKICAgIHdyYXAuYXBwZW5kQ2hpbGQoY2xlYXJCdG4pOwogICAgZ3JvdXAuYXBwZW5kQ2hpbGQod3JhcCk7CgogICAgdmFyIGhlbHAgPSBlbCgnZGl2JywgeyBpZDogJ3YtcHJvbXB0LWhlbHAnLCBjbGFzczogJ3YtY3JlYXRlX19oZWxwIHYtc2VjdGlvbl9fc3ViJyB9KTsKICAgIHRoaXMuX3Byb21wdEhlbHAgPSBoZWxwOwogICAgZ3JvdXAuYXBwZW5kQ2hpbGQoaGVscCk7CgogICAgc2V0VGltZW91dChhdXRvLCAwKTsKICAgIHRoaXMucmVmcmVzaFByb21wdEhlbHAoKTsKICAgIHJldHVybiBncm91cDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZWZyZXNoUHJvbXB0SGVscCA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdGhpcy5fcHJvbXB0SGVscCkgcmV0dXJuOwogICAgdmFyIG4gPSAodGhpcy5wcm9tcHQgfHwgJycpLnRyaW0oKS5sZW5ndGg7CiAgICB2YXIgbXNnLCBjbHMgPSAndi1jcmVhdGVfX2hlbHAgdi1zZWN0aW9uX19zdWInOwogICAgaWYgKHRoaXMuaGFzSW5wdXQoKSkgewogICAgICBtc2cgPSB0aGlzLmFjdGl2ZVByZXNldCA/ICgnVXNpbmcgcHJlc2V0IOKAnCcgKyBlc2ModGhpcy5hY3RpdmVQcmVzZXQubmFtZSkgKyAn4oCdICsgeW91ciB0ZXh0LicpCiAgICAgICAgOiAnRGVzY3JpYmUgdGhlIHRyYW5zZm9ybWF0aW9uLCBvciBwaWNrIGEgcHJlc2V0Lic7CiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlUHJlc2V0KSB7CiAgICAgIG1zZyA9ICdQcmVzZXQg4oCcJyArIGVzYyh0aGlzLmFjdGl2ZVByZXNldC5uYW1lKSArICfigJ0gYWN0aXZlLiBBZGQgdGV4dCB0byByZWZpbmUuJzsKICAgIH0gZWxzZSBpZiAobiA9PT0gMCkgewogICAgICBtc2cgPSAnVGV4dC10by1pbWFnZSBuZWVkcyBhdCBsZWFzdCA4IGNoYXJhY3RlcnMuJzsKICAgIH0gZWxzZSBpZiAobiA8IDgpIHsKICAgICAgbXNnID0gKDggLSBuKSArICcgbW9yZSBjaGFyYWN0ZXInICsgKCg4IC0gbikgPT09IDEgPyAnJyA6ICdzJykgKyAnIHRvIGdlbmVyYXRlLic7CiAgICAgIGNscyArPSAnIGlzLXdhcm4nOwogICAgfSBlbHNlIHsKICAgICAgbXNnID0gJ1JlYWR5LiAnICsgbiArICcgY2hhcmFjdGVycy4nOwogICAgICBjbHMgKz0gJyBpcy1vayc7CiAgICB9CiAgICB0aGlzLl9wcm9tcHRIZWxwLmNsYXNzTmFtZSA9IGNsczsKICAgIHRoaXMuX3Byb21wdEhlbHAuaW5uZXJIVE1MID0gbXNnOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmJ1aWxkUHJlc2V0cyA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWN0aW9uID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWZpZWxkLWdyb3VwIHYtY3JlYXRlX19wcmVzZXRzJyB9KTsKICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1leWVicm93JyB9LCAnU3R5bGUgcHJlc2V0cycpKTsKCiAgICB2YXIgaG9zdCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX3ByZXNldGhvc3QnIH0pOwogICAgdGhpcy5fcHJlc2V0SG9zdCA9IGhvc3Q7CiAgICBzZWN0aW9uLmFwcGVuZENoaWxkKGhvc3QpOwoKICAgIHRoaXMuaW5pdFByZXNldENoaXBzKCk7CiAgICByZXR1cm4gc2VjdGlvbjsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5pbml0UHJlc2V0Q2hpcHMgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgaG9zdCA9IHRoaXMuX3ByZXNldEhvc3Q7CiAgICBpZiAoIWhvc3QpIHJldHVybjsKCiAgICB2YXIgb25TZWxlY3QgPSBmdW5jdGlvbiAocHJlc2V0KSB7CiAgICAgIGlmIChzZWxmLmFjdGl2ZVByZXNldCAmJiBwcmVzZXQgJiYgc2VsZi5hY3RpdmVQcmVzZXQuaWQgPT09IHByZXNldC5pZCkgewogICAgICAgIHNlbGYuYWN0aXZlUHJlc2V0ID0gbnVsbDsKICAgICAgICBpZiAoc2VsZi5fcHJlc2V0Q3RsICYmIHNlbGYuX3ByZXNldEN0bC5zZXRBY3RpdmUpIHNlbGYuX3ByZXNldEN0bC5zZXRBY3RpdmUobnVsbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2VsZi5hY3RpdmVQcmVzZXQgPSBwcmVzZXQgfHwgbnVsbDsKICAgICAgfQogICAgICBzZWxmLnJlZnJlc2hDVEEoKTsKICAgICAgc2VsZi5yZWZyZXNoUHJvbXB0SGVscCgpOwogICAgfTsKCiAgICB2YXIgcmVuZGVyZWQgPSBmYWxzZTsKICAgIGlmIChWLnByZXNldHMgJiYgdHlwZW9mIFYucHJlc2V0cy5yZW5kZXJDaGlwcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgewogICAgICAgIHRoaXMuX3ByZXNldEN0bCA9IFYucHJlc2V0cy5yZW5kZXJDaGlwcyhob3N0LCB7CiAgICAgICAgICBzZWxlY3RlZElkOiBzZWxmLmFjdGl2ZVByZXNldCA/IHNlbGYuYWN0aXZlUHJlc2V0LmlkIDogbnVsbCwKICAgICAgICAgIHNlbGVjdGVkS2V5OiBzZWxmLmFjdGl2ZVByZXNldCA/IChzZWxmLmFjdGl2ZVByZXNldC5rZXkgfHwgc2VsZi5hY3RpdmVQcmVzZXQuaWQpIDogbnVsbCwKICAgICAgICAgIG9uU2VsZWN0OiBvblNlbGVjdAogICAgICAgIH0pIHx8IG51bGw7CiAgICAgICAgcmVuZGVyZWQgPSBob3N0LmNoaWxkTm9kZXMubGVuZ3RoID4gMDsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJlbmRlcmVkID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmICghcmVuZGVyZWQpIHRoaXMucmVuZGVyRmFsbGJhY2tDaGlwcyhob3N0LCBvblNlbGVjdCk7CiAgfTsKCiAgdmFyIEZBTExCQUNLX1BSRVNFVFMgPSBbCiAgICB7IGlkOiAncmVtb3ZlQWxsRnVybml0dXJlJywgbmFtZTogJ0VtcHR5IFJvb20nLCBwcm9tcHQ6ICdSZW1vdmUgYWxsIGZ1cm5pdHVyZSwgcGVyc29uYWwgaXRlbXMsIGNsdXR0ZXIsIGFuZCBiZWxvbmdpbmdzIGZyb20gdGhlIHJvb20gd2hpbGUga2VlcGluZyB0aGUgYXJjaGl0ZWN0dXJhbCBmZWF0dXJlcywgd2FsbHMsIHdpbmRvd3MsIGFuZCBmbG9vcmluZyBleGFjdGx5IHRoZSBzYW1lLiBDcmVhdGUgYSBjb21wbGV0ZWx5IGVtcHR5LCBjbGVhbiBzcGFjZSByZWFkeSBmb3IgcHJvZmVzc2lvbmFsIHN0YWdpbmcuJyB9LAogICAgeyBpZDogJ3JlbW92ZUNsdXR0ZXInLCBuYW1lOiAnRGVjbHV0dGVyJywgcHJvbXB0OiAnUmVtb3ZlIGNsdXR0ZXIsIHBlcnNvbmFsIGl0ZW1zLCBhbmQgc21hbGwgYmVsb25naW5ncyB3aGlsZSBrZWVwaW5nIHRoZSBleGlzdGluZyBmdXJuaXR1cmUgYW5kIGxheW91dCBpbnRhY3QuIE1ha2UgdGhlIHNwYWNlIGxvb2sgdGlkeSBhbmQgY2xlYW4uJyB9LAogICAgeyBpZDogJ21vZGVyblN0YWdpbmcnLCBuYW1lOiAnTW9kZXJuIFN0YWdpbmcnLCBwcm9tcHQ6ICdTdGFnZSB0aGlzIHJvb20gd2l0aCBjbGVhbiBtb2Rlcm4gZnVybml0dXJlLCBuZXV0cmFsIHRvbmVzLCBhbmQgdGFzdGVmdWwgZGVjb3IgZm9yIGEgcHJvZmVzc2lvbmFsIHJlYWwtZXN0YXRlIGxpc3RpbmcuJyB9LAogICAgeyBpZDogJ2ltcHJvdmVMaWdodGluZycsIG5hbWU6ICdCZXR0ZXIgTGlnaHQnLCBwcm9tcHQ6ICdJbXByb3ZlIHRoZSBsaWdodGluZyB0byBicmlnaHQsIHdhcm0sIG5hdHVyYWwgZGF5bGlnaHQgd2hpbGUga2VlcGluZyBldmVyeXRoaW5nIGVsc2UgdGhlIHNhbWUuJyB9LAogICAgeyBpZDogJ2FkZExhbmRzY2FwaW5nJywgbmFtZTogJ0FkZCBMYW5kc2NhcGluZycsIHByb21wdDogJ0FkZCBsdXNoLCB3ZWxsLW1haW50YWluZWQgbGFuZHNjYXBpbmcgd2l0aCBoZWFsdGh5IHBsYW50cywgZnJlc2ggbXVsY2gsIGFuZCBjbGVhbiBlZGdlcyB0byB0aGUgZXh0ZXJpb3IuJyB9LAogICAgeyBpZDogJ2ltcHJvdmVFeHRlcmlvcicsIG5hbWU6ICdGaXggRXh0ZXJpb3InLCBwcm9tcHQ6ICdSZXBhaXIgYW5kIHJlZnJlc2ggdGhlIGV4dGVyaW9yIOKAlCBjbGVhbiBzaWRpbmcsIGNyaXNwIHRyaW0sIGFuZCBhIHRpZHksIHdlbGwta2VwdCBmYWNhZGUuJyB9CiAgXTsKCiAgQ3JlYXRvci5wcm90b3R5cGUucmVuZGVyRmFsbGJhY2tDaGlwcyA9IGZ1bmN0aW9uIChob3N0LCBvblNlbGVjdCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgaG9zdC5pbm5lckhUTUwgPSAnJzsKICAgIHZhciBzY3JvbGxlciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jaGlwLXJvdycsIHJvbGU6ICdsaXN0Ym94JywgJ2FyaWEtbGFiZWwnOiAnU3R5bGUgcHJlc2V0cycgfSk7CiAgICBob3N0LmFwcGVuZENoaWxkKHNjcm9sbGVyKTsKICAgIEZBTExCQUNLX1BSRVNFVFMuZm9yRWFjaChmdW5jdGlvbiAocCkgewogICAgICB2YXIgYWN0aXZlID0gc2VsZi5hY3RpdmVQcmVzZXQgJiYgc2VsZi5hY3RpdmVQcmVzZXQuaWQgPT09IHAuaWQ7CiAgICAgIHZhciBjaGlwID0gZWwoJ2J1dHRvbicsIHsKICAgICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgICBjbGFzczogJ3YtY2hpcCcgKyAoYWN0aXZlID8gJyB2LWNoaXAtLWFjdGl2ZScgOiAnJyksCiAgICAgICAgcm9sZTogJ29wdGlvbicsICdhcmlhLXNlbGVjdGVkJzogYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJwogICAgICB9LCBwLm5hbWUpOwogICAgICBzZWxmLm9uKGNoaXAsICdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICBvblNlbGVjdChwKTsKICAgICAgICB2YXIgbm9kZXMgPSBzY3JvbGxlci5xdWVyeVNlbGVjdG9yQWxsKCcudi1jaGlwJyk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgbm9kZXNbaV0uY2xhc3NMaXN0LnJlbW92ZSgndi1jaGlwLS1hY3RpdmUnKTsKICAgICAgICAgIG5vZGVzW2ldLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsICdmYWxzZScpOwogICAgICAgIH0KICAgICAgICBpZiAoc2VsZi5hY3RpdmVQcmVzZXQgJiYgc2VsZi5hY3RpdmVQcmVzZXQuaWQgPT09IHAuaWQpIHsKICAgICAgICAgIGNoaXAuY2xhc3NMaXN0LmFkZCgndi1jaGlwLS1hY3RpdmUnKTsKICAgICAgICAgIGNoaXAuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgJ3RydWUnKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBzY3JvbGxlci5hcHBlbmRDaGlsZChjaGlwKTsKICAgIH0pOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmJ1aWxkU2VsZWN0b3JzID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIHJvdyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX3NlbGVjdG9ycycgfSk7CgogICAgdmFyIG1vZGVsRmllbGQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZmllbGQtZ3JvdXAnIH0sCiAgICAgIGVsKCdsYWJlbCcsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnLCBmb3I6ICd2LW1vZGVsJyB9LCAnTW9kZWwnKSk7CiAgICB2YXIgbW9kZWxTZWwgPSBlbCgnc2VsZWN0JywgeyBpZDogJ3YtbW9kZWwnLCBjbGFzczogJ3Ytc2VsZWN0JywgJ2FyaWEtbGFiZWwnOiAnTW9kZWwnIH0pOwogICAgbW9kZWxzKCkuZm9yRWFjaChmdW5jdGlvbiAobSkgewogICAgICB2YXIgYml0cyA9IFttLmxhYmVsIHx8IG0ucmF3XTsKICAgICAgaWYgKG0uc3ViaGVhZGluZykgYml0cy5wdXNoKG0uc3ViaGVhZGluZyk7CiAgICAgIGlmICh0eXBlb2YgbS5jb3N0ID09PSAnbnVtYmVyJykgYml0cy5wdXNoKG0uY29zdCArICcgY3InKTsKICAgICAgdmFyIG9wdCA9IGVsKCdvcHRpb24nLCB7IHZhbHVlOiBtLnJhdyB9LCBiaXRzLmpvaW4oJyAgwrcgICcpKTsKICAgICAgaWYgKG0ucmF3ID09PSBzZWxmLm1vZGVsUmF3KSBvcHQuc2VsZWN0ZWQgPSB0cnVlOwogICAgICBtb2RlbFNlbC5hcHBlbmRDaGlsZChvcHQpOwogICAgfSk7CiAgICB0aGlzLm9uKG1vZGVsU2VsLCAnY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICBzZWxmLm1vZGVsUmF3ID0gbW9kZWxTZWwudmFsdWU7CiAgICAgIHdyaXRlUGVyc2lzdGVkKCdtb2RlbCcsIHNlbGYubW9kZWxSYXcpOwogICAgICB2YXIgbWF4ID0gbWF4UmVmRm9yKHNlbGYuY3VycmVudE1vZGVsKCkpOwogICAgICBpZiAoc2VsZi5yZWZzLmxlbmd0aCA+IG1heCkgewogICAgICAgIHdoaWxlIChzZWxmLnJlZnMubGVuZ3RoID4gbWF4KSB7CiAgICAgICAgICB2YXIgciA9IHNlbGYucmVmcy5wb3AoKTsKICAgICAgICAgIGlmIChyICYmIHIudXJsICYmIHIudXJsLmluZGV4T2YoJ2Jsb2I6JykgPT09IDApIHsgdHJ5IHsgVVJMLnJldm9rZU9iamVjdFVSTChyLnVybCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgICAgICB9CiAgICAgICAgdG9hc3QoJ1RyaW1tZWQgdG8gJyArIG1heCArICcgaW1hZ2UnICsgKG1heCA+IDEgPyAncycgOiAnJykgKyAnIGZvciAnICsgKHNlbGYuY3VycmVudE1vZGVsKCkubGFiZWwgfHwgJ21vZGVsJykgKyAnLicsICdpbmZvJyk7CiAgICAgIH0KICAgICAgc2VsZi5yZW5kZXJJbWFnZVpvbmUoKTsKICAgICAgc2VsZi5yZWZyZXNoQ1RBKCk7CiAgICB9KTsKICAgIG1vZGVsRmllbGQuYXBwZW5kQ2hpbGQobW9kZWxTZWwpOwogICAgdmFyIG1vZGVsSGludCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zZWN0aW9uX19zdWIgdi1jcmVhdGVfX3NlbG5vdGUnIH0pOwogICAgdGhpcy5fbW9kZWxIaW50ID0gbW9kZWxIaW50OwogICAgbW9kZWxGaWVsZC5hcHBlbmRDaGlsZChtb2RlbEhpbnQpOwogICAgcm93LmFwcGVuZENoaWxkKG1vZGVsRmllbGQpOwoKICAgIHZhciBhc3BlY3RGaWVsZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCB2LWNyZWF0ZV9fYXNwZWN0JyB9LAogICAgICBlbCgnbGFiZWwnLCB7IGNsYXNzOiAndi1leWVicm93JywgZm9yOiAndi1hc3BlY3QnIH0sICdBc3BlY3QgcmF0aW8nKSk7CiAgICB2YXIgYXNwZWN0U2VsID0gZWwoJ3NlbGVjdCcsIHsgaWQ6ICd2LWFzcGVjdCcsIGNsYXNzOiAndi1zZWxlY3QnLCAnYXJpYS1sYWJlbCc6ICdBc3BlY3QgcmF0aW8nIH0pOwogICAgYXNwZWN0cygpLmZvckVhY2goZnVuY3Rpb24gKGEpIHsKICAgICAgdmFyIG9wdCA9IGVsKCdvcHRpb24nLCB7IHZhbHVlOiBhLnJhdyB9LCAoYS5sYWJlbCB8fCBhLnJhdykgKyAnICDCtyAgJyArIGEudyArICfDlycgKyBhLmgpOwogICAgICBpZiAoYS5yYXcgPT09IHNlbGYuYXNwZWN0UmF3KSBvcHQuc2VsZWN0ZWQgPSB0cnVlOwogICAgICBhc3BlY3RTZWwuYXBwZW5kQ2hpbGQob3B0KTsKICAgIH0pOwogICAgdGhpcy5vbihhc3BlY3RTZWwsICdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHNlbGYuYXNwZWN0UmF3ID0gYXNwZWN0U2VsLnZhbHVlOwogICAgICB3cml0ZVBlcnNpc3RlZCgnYXNwZWN0Jywgc2VsZi5hc3BlY3RSYXcpOwogICAgfSk7CiAgICBhc3BlY3RGaWVsZC5hcHBlbmRDaGlsZChhc3BlY3RTZWwpOwogICAgdmFyIGFzcGVjdE5vdGUgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViIHYtY3JlYXRlX19zZWxub3RlJyB9LCAnT3V0cHV0IGRpbWVuc2lvbnMgZm9yIHRleHQtdG8taW1hZ2UuJyk7CiAgICBhc3BlY3RGaWVsZC5hcHBlbmRDaGlsZChhc3BlY3ROb3RlKTsKICAgIHRoaXMuX2FzcGVjdEZpZWxkID0gYXNwZWN0RmllbGQ7CiAgICB0aGlzLl9hc3BlY3RTZWwgPSBhc3BlY3RTZWw7CiAgICB0aGlzLl9hc3BlY3ROb3RlID0gYXNwZWN0Tm90ZTsKICAgIHJvdy5hcHBlbmRDaGlsZChhc3BlY3RGaWVsZCk7CgogICAgdGhpcy5yZWZyZXNoTW9kZWxIaW50KCk7CiAgICByZXR1cm4gcm93OwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnJlZnJlc2hNb2RlbEhpbnQgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMuX21vZGVsSGludCkgcmV0dXJuOwogICAgdmFyIGMgPSB0aGlzLnVuaXRDb3N0KCk7CiAgICB2YXIgY3JlZHMgPSBjICsgJyBjcmVkaXQnICsgKGMgPT09IDEgPyAnJyA6ICdzJykgKyAnIHBlciBnZW5lcmF0aW9uJzsKICAgIGlmICh0aGlzLmlzVDJJKCkpIHsKICAgICAgdGhpcy5fbW9kZWxIaW50LnRleHRDb250ZW50ID0gJ0dlbmVyYXRlcyBmcm9tIHRleHQgwrcgJyArIGNyZWRzOwogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgbSA9IHRoaXMuY3VycmVudE1vZGVsKCk7CiAgICB2YXIgbWF4ID0gbWF4UmVmRm9yKG0pOwogICAgdGhpcy5fbW9kZWxIaW50LnRleHRDb250ZW50ID0gKG1heCA+IDEpCiAgICAgID8gKCdVcCB0byAnICsgbWF4ICsgJyByZWZlcmVuY2UgaW1hZ2VzIMK3ICcgKyBjcmVkcykKICAgICAgOiBjcmVkczsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZWZyZXNoQXNwZWN0VmlzaWJpbGl0eSA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdGhpcy5fYXNwZWN0RmllbGQpIHJldHVybjsKICAgIHZhciBlZGl0aW5nID0gdGhpcy5oYXNJbnB1dCgpOwogICAgdGhpcy5fYXNwZWN0RmllbGQuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtZGlzYWJsZWQnLCBlZGl0aW5nKTsKICAgIGlmICh0aGlzLl9hc3BlY3RTZWwpIHRoaXMuX2FzcGVjdFNlbC5kaXNhYmxlZCA9IGVkaXRpbmc7CiAgICBpZiAodGhpcy5fYXNwZWN0Tm90ZSkgewogICAgICB0aGlzLl9hc3BlY3ROb3RlLnRleHRDb250ZW50ID0gZWRpdGluZwogICAgICAgID8gJ0xvY2tlZCDigJQgZWRpdHMga2VlcCB0aGUgc291cmNlIGltYWdlIHByb3BvcnRpb25zLicKICAgICAgICA6ICdPdXRwdXQgZGltZW5zaW9ucyBmb3IgdGV4dC10by1pbWFnZS4nOwogICAgfQogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmJ1aWxkQWN0aW9ucyA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciBiYXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3JlYXRlX19hY3Rpb25zJyB9KTsKCiAgICB2YXIgY3RhID0gZWwoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnkgdi1jcmVhdGVfX2dvJyB9KTsKICAgIHRoaXMuX2N0YSA9IGN0YTsKICAgIHRoaXMub24oY3RhLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7IHNlbGYuZ2VuZXJhdGUoKTsgfSk7CiAgICBiYXIuYXBwZW5kQ2hpbGQoY3RhKTsKCiAgICB2YXIgdmFyQnRuID0gZWwoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3JlYXRlX192YXInLAogICAgICAnYXJpYS1wcmVzc2VkJzogJ2ZhbHNlJywgdGl0bGU6ICdHZW5lcmF0ZSBmb3VyIGF0IG9uY2UnIH0sCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3RhX19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBodG1sOiBpY29uKCdzcGFya2xlcycpIHx8ICfinKYnIH0pLAogICAgICBlbCgnc3BhbicsIG51bGwsICfDlzQnKSk7CiAgICB0aGlzLm9uKHZhckJ0biwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICBzZWxmLnZhcmlhdGlvbnMgPSAhc2VsZi52YXJpYXRpb25zOwogICAgICB2YXJCdG4uY2xhc3NMaXN0LnRvZ2dsZSgndi1jdGEtLWJyYW5kJywgc2VsZi52YXJpYXRpb25zKTsKICAgICAgdmFyQnRuLmNsYXNzTGlzdC50b2dnbGUoJ3YtY3RhLS1naG9zdCcsICFzZWxmLnZhcmlhdGlvbnMpOwogICAgICB2YXJCdG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCBzZWxmLnZhcmlhdGlvbnMgPyAndHJ1ZScgOiAnZmFsc2UnKTsKICAgICAgc2VsZi5yZWZyZXNoQ1RBKCk7CiAgICB9KTsKICAgIHRoaXMuX3ZhckJ0biA9IHZhckJ0bjsKICAgIGJhci5hcHBlbmRDaGlsZCh2YXJCdG4pOwoKICAgIHZhciB3cmFwID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fYWN0aW9ud3JhcCcgfSwgYmFyLAogICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YiB2LWNyZWF0ZV9fbGVnYWwnIH0sCiAgICAgICAgJ0NyZWRpdHMgYXJlIHNwZW50IHBlciBnZW5lcmF0aW9uLiAnLAogICAgICAgIGVsKCdhJywgeyBocmVmOiAnIy9hY2NvdW50JywgY2xhc3M6ICd2LWxpbmsnIH0sICdNYW5hZ2UgY3JlZGl0cycpKSk7CgogICAgcmV0dXJuIHdyYXA7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUucmVmcmVzaENUQSA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLl9jdGEpIHsKICAgICAgdmFyIG9rID0gdGhpcy5jYW5TdWJtaXQoKTsKICAgICAgdGhpcy5fY3RhLmRpc2FibGVkID0gIW9rOwogICAgICB0aGlzLl9jdGEuc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgb2sgPyAnZmFsc2UnIDogJ3RydWUnKTsKICAgICAgdGhpcy5fY3RhLmNsYXNzTGlzdC50b2dnbGUoJ2lzLWJ1c3knLCAhIXRoaXMuYnVzeSk7CiAgICAgIHZhciBjb3N0ID0gdGhpcy50b3RhbENvc3QoKTsKICAgICAgdmFyIGNvdW50ID0gdGhpcy52YXJpYXRpb25zID8gNCA6IDE7CiAgICAgIHZhciBsYWJlbCA9IHRoaXMuaGFzSW5wdXQoKSA/ICdUcmFuc2Zvcm0nIDogJ0dlbmVyYXRlJzsKICAgICAgdGhpcy5fY3RhLmlubmVySFRNTCA9ICcnOwogICAgICBpZiAodGhpcy5idXN5KSB7CiAgICAgICAgdGhpcy5fY3RhLnNldEF0dHJpYnV0ZSgnYXJpYS1idXN5JywgJ3RydWUnKTsKICAgICAgICB0aGlzLl9jdGEuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVhdGVfX2dvLXNwaW4nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSkpOwogICAgICAgIHRoaXMuX2N0YS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fZ28tbGFiZWwnIH0sICdXb3JraW5n4oCmJykpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuX2N0YS5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtYnVzeScpOwogICAgICAgIHRoaXMuX2N0YS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWN0YV9faWNvbicsICdhcmlhLWhpZGRlbic6ICd0cnVlJywgaHRtbDogaWNvbignYm9sdCcpIHx8ICfimqEnIH0pKTsKICAgICAgICB0aGlzLl9jdGEuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVhdGVfX2dvLWxhYmVsJyB9LAogICAgICAgICAgbGFiZWwgKyAoY291bnQgPiAxID8gKCcgw5cnICsgY291bnQpIDogJycpKSk7CiAgICAgICAgdGhpcy5fY3RhLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3JlYXRlX19nby1jb3N0JyB9LCBjb3N0ICsgJyBjcicpKTsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMuX3ZhckJ0bikgdGhpcy5fdmFyQnRuLmRpc2FibGVkID0gISF0aGlzLmJ1c3k7CiAgICB0aGlzLnJlZnJlc2hNb2RlbEhpbnQoKTsKICAgIHRoaXMucmVmcmVzaFByb21wdEhlbHAoKTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5idWlsZFNpZGUgPSBmdW5jdGlvbiAobGlicmFyeUVtcHR5KSB7CiAgICB2YXIgY29sID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwoKICAgIGlmIChsaWJyYXJ5RW1wdHkpIHsKICAgICAgY29sLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zZWN0aW9uX19oZWFkJyB9LAogICAgICAgIGVsKCdkaXYnLCBudWxsLAogICAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1leWVicm93JyB9LCAnSW5zcGlyYXRpb24nKSwKICAgICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViJyB9LCAnVGFwIGFueSBsb29rIHRvIGxvYWQgaXRzIHByb21wdC4nKSkpKTsKCiAgICAgIHZhciBmZWVkSG9zdCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX2ZlZWQnIH0pOwogICAgICB0aGlzLl9mZWVkSG9zdCA9IGZlZWRIb3N0OwogICAgICBjb2wuYXBwZW5kQ2hpbGQoZmVlZEhvc3QpOwogICAgICB0aGlzLnJlbmRlcklubGluZUZlZWQoZmVlZEhvc3QpOwogICAgfSBlbHNlIHsKICAgICAgY29sLmFwcGVuZENoaWxkKHRoaXMuYnVpbGRSZWNlbnRTdHJpcCgpKTsKICAgIH0KICAgIHJldHVybiBjb2w7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUucmVuZGVySW5saW5lRmVlZCA9IGZ1bmN0aW9uIChob3N0KSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgcmVuZGVyZWQgPSBmYWxzZTsKICAgIGlmIChWLnZpZXdzLmZlZWQgJiYgdHlwZW9mIFYudmlld3MuZmVlZC5yZW5kZXJJbmxpbmUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgb3V0ID0gVi52aWV3cy5mZWVkLnJlbmRlcklubGluZShob3N0LCB7CiAgICAgICAgICBvbkFwcGx5OiBmdW5jdGlvbiAoZXhhbXBsZSkgeyBzZWxmLmFwcGx5RXhhbXBsZShleGFtcGxlKTsgfQogICAgICAgIH0pOwogICAgICAgIGlmIChvdXQgaW5zdGFuY2VvZiBOb2RlICYmIG91dCAhPT0gaG9zdCkgaG9zdC5hcHBlbmRDaGlsZChvdXQpOwogICAgICAgIHJlbmRlcmVkID0gaG9zdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDAgfHwgb3V0ICE9IG51bGw7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICByZW5kZXJlZCA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpZiAoIXJlbmRlcmVkKSB0aGlzLnJlbmRlckZlZWRGYWxsYmFjayhob3N0KTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZW5kZXJGZWVkRmFsbGJhY2sgPSBmdW5jdGlvbiAoaG9zdCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgaG9zdC5pbm5lckhUTUwgPSAnJzsKICAgIHZhciBzayA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1ncmlkIHYtZ3JpZC0tYXV0bycgfSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICBpZiAodWkoKS5za2VsZXRvbikgeyB0cnkgeyBzay5hcHBlbmRDaGlsZCh1aSgpLnNrZWxldG9uKCdjYXJkJykpOyBjb250aW51ZTsgfSBjYXRjaCAoZSkge30gfQogICAgICBzay5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24nLCBzdHlsZTogJ2FzcGVjdC1yYXRpbzoxLzEnIH0pKTsKICAgIH0KICAgIGhvc3QuYXBwZW5kQ2hpbGQoc2spOwoKICAgIGlmICghYXBpKCkuY3VyYXRlZEZlZWQpIHsKICAgICAgaG9zdC5pbm5lckhUTUwgPSAnJzsKICAgICAgaG9zdC5hcHBlbmRDaGlsZChlbXB0eUJsb2NrKCdZb3VyIGNyZWF0aW9ucyB3aWxsIGFwcGVhciBoZXJlLicsICdTdGFydCBieSB3cml0aW5nIGEgcHJvbXB0IG9yIGRyb3BwaW5nIGFuIGltYWdlLicsICdpbWFnZScpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYXBpKCkuY3VyYXRlZEZlZWQoMCwgMTIpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICBpZiAoc2VsZi5fZGVzdHJveWVkKSByZXR1cm47CiAgICAgIHZhciBpdGVtcyA9IChyZXMgJiYgKHJlcy5pdGVtcyB8fCByZXMpKSB8fCBbXTsKICAgICAgaG9zdC5pbm5lckhUTUwgPSAnJzsKICAgICAgaWYgKCFpdGVtcy5sZW5ndGgpIHsKICAgICAgICBob3N0LmFwcGVuZENoaWxkKGVtcHR5QmxvY2soJ05vIGluc3BpcmF0aW9uIHlldC4nLCAnQmUgdGhlIGZpcnN0IHRvIGNyZWF0ZSBzb21ldGhpbmcuJywgJ3NwYXJrbGVzJykpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgZ3JpZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1ncmlkIHYtZ3JpZC0tYXV0byB2LWNyZWF0ZV9fZmVlZGdyaWQnIH0pOwogICAgICB2YXIgc2hvd24gPSAwOwogICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChyYXcpIHsKICAgICAgICB2YXIgaW1hZ2UgPSBub3JtYWxpemVGZWVkSW1hZ2UocmF3KTsKICAgICAgICBpZiAoIWltYWdlVVJMT2YoaW1hZ2UpKSByZXR1cm47CiAgICAgICAgdmFyIGNhcmQgPSBzZWxmLmZlZWRDYXJkKGltYWdlKTsKICAgICAgICBpZiAoY2FyZCkgeyBncmlkLmFwcGVuZENoaWxkKGNhcmQpOyBzaG93bisrOyB9CiAgICAgIH0pOwogICAgICBpZiAoIXNob3duKSB7CiAgICAgICAgaG9zdC5hcHBlbmRDaGlsZChlbXB0eUJsb2NrKCdObyBpbnNwaXJhdGlvbiB5ZXQuJywgJ0JlIHRoZSBmaXJzdCB0byBjcmVhdGUgc29tZXRoaW5nLicsICdzcGFya2xlcycpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaG9zdC5hcHBlbmRDaGlsZChncmlkKTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHNlbGYuX2Rlc3Ryb3llZCkgcmV0dXJuOwogICAgICBob3N0LmlubmVySFRNTCA9ICcnOwogICAgICBob3N0LmFwcGVuZENoaWxkKGVtcHR5QmxvY2soJ0NvdWxkbuKAmXQgbG9hZCBpbnNwaXJhdGlvbi4nLCAnQ2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uJywgJ3dhcm5pbmcnKSk7CiAgICB9KTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5mZWVkQ2FyZCA9IGZ1bmN0aW9uIChpbWFnZSkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgaWYgKCFpbWFnZVVSTE9mKGltYWdlKSkgcmV0dXJuIG51bGw7CiAgICB2YXIgbm9kZTsKICAgIGlmICh1aSgpLmltZ0NhcmQpIHsKICAgICAgdHJ5IHsKICAgICAgICBub2RlID0gdWkoKS5pbWdDYXJkKGltYWdlLCB7IG9uVGFwOiBmdW5jdGlvbiAoKSB7IHNlbGYuYXBwbHlFeGFtcGxlKGltYWdlKTsgfSwgYmVmb3JlQWZ0ZXI6IHRydWUgfSk7CiAgICAgIH0gY2F0Y2ggKGUpIHsgbm9kZSA9IG51bGw7IH0KICAgIH0KICAgIGlmICghbm9kZSkgewogICAgICB2YXIgdXJsID0gaW1hZ2UucmVtb3RlSW1hZ2VVUkw7CiAgICAgIGlmICghdXJsKSByZXR1cm4gbnVsbDsKICAgICAgbm9kZSA9IGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtY2FyZCB2LWNhcmQtLXBhZC0wIHYtY2FyZC0tdGFwcGFibGUnIH0sCiAgICAgICAgZWwoJ2ltZycsIHsgY2xhc3M6ICd2LWNhcmRfX21lZGlhJywgc3JjOiB1cmwsIGFsdDogaW1hZ2UucHJvbXB0ID8gZXNjKGltYWdlLnByb21wdCkuc2xpY2UoMCwgODApIDogJ2luc3BpcmF0aW9uJywgbG9hZGluZzogJ2xhenknIH0pKTsKICAgICAgdGhpcy5vbihub2RlLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7IHNlbGYuYXBwbHlFeGFtcGxlKGltYWdlKTsgfSk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5idWlsZFJlY2VudFN0cmlwID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIGNvbCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKICAgIGNvbC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2VjdGlvbl9faGVhZCcgfSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1leWVicm93JyB9LCAnUmVjZW50JyksCiAgICAgIGVsKCdhJywgeyBocmVmOiAnIy9saWJyYXJ5JywgY2xhc3M6ICd2LWxpbmsnIH0sICdTZWUgYWxsJykpKTsKCiAgICB2YXIgZ3JpZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1ncmlkIHYtZ3JpZC0tYXV0byB2LWNyZWF0ZV9fcmVjZW50JyB9KTsKICAgIHZhciBsaWIgPSAoc3RhdGUoKS5saWJyYXJ5IHx8IFtdKS5maWx0ZXIoZnVuY3Rpb24gKGltZykgewogICAgICByZXR1cm4gISFpbWFnZVVSTE9mKGltZyk7CiAgICB9KS5zbGljZSgwLCA2KTsKICAgIGlmICghbGliLmxlbmd0aCkgewogICAgICBjb2wuYXBwZW5kQ2hpbGQoZW1wdHlCbG9jaygnWW91ciBjcmVhdGlvbnMgd2lsbCBhcHBlYXIgaGVyZS4nLCAnR2VuZXJhdGUgc29tZXRoaW5nIHRvIGZpbGwgeW91ciBsaWJyYXJ5LicsICdpbWFnZScpKTsKICAgICAgcmV0dXJuIGNvbDsKICAgIH0KICAgIGxpYi5mb3JFYWNoKGZ1bmN0aW9uIChpbWcpIHsKICAgICAgdmFyIHVybCA9IGltYWdlVVJMT2YoaW1nKTsKICAgICAgdmFyIG5vZGU7CiAgICAgIGlmICh1aSgpLmltZ0NhcmQpIHsKICAgICAgICB0cnkgeyBub2RlID0gdWkoKS5pbWdDYXJkKGltZywgeyBvblRhcDogZnVuY3Rpb24gKCkgeyBnbygnIy9pbWFnZS8nICsgKGltZy5yZW1vdGVJRCB8fCBpbWcuaWQpKTsgfSwgYmVmb3JlQWZ0ZXI6IHRydWUgfSk7IH0KICAgICAgICBjYXRjaCAoZSkgeyBub2RlID0gbnVsbDsgfQogICAgICB9CiAgICAgIGlmICghbm9kZSkgewogICAgICAgIG5vZGUgPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWNhcmQgdi1jYXJkLS1wYWQtMCB2LWNhcmQtLXRhcHBhYmxlJyB9LAogICAgICAgICAgZWwoJ2ltZycsIHsgY2xhc3M6ICd2LWNhcmRfX21lZGlhJywgc3JjOiB1cmwsIGFsdDogaW1nLnByb21wdCA/IGVzYyhpbWcucHJvbXB0KS5zbGljZSgwLCA2MCkgOiAnY3JlYXRpb24nLCBsb2FkaW5nOiAnbGF6eScgfSkpOwogICAgICAgIHNlbGYub24obm9kZSwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBnbygnIy9pbWFnZS8nICsgKGltZy5yZW1vdGVJRCB8fCBpbWcuaWQpKTsgfSk7CiAgICAgIH0KICAgICAgZ3JpZC5hcHBlbmRDaGlsZChub2RlKTsKICAgIH0pOwogICAgY29sLmFwcGVuZENoaWxkKGdyaWQpOwogICAgcmV0dXJuIGNvbDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5hcHBseUV4YW1wbGUgPSBmdW5jdGlvbiAoZXhhbXBsZSkgewogICAgaWYgKCFleGFtcGxlKSByZXR1cm47CiAgICB2YXIgZXggPSBub3JtYWxpemVGZWVkSW1hZ2UoZXhhbXBsZSk7CiAgICB2YXIgcmVmVVJMID0gZXhhbXBsZS5yZWZlcmVuY2VVUkwgfHwgbnVsbDsKICAgIHRoaXMuYWN0aXZlUHJlc2V0ID0gbnVsbDsKICAgIGlmICh0aGlzLl9wcmVzZXRDdGwgJiYgdGhpcy5fcHJlc2V0Q3RsLnNldEFjdGl2ZSkgeyB0cnkgeyB0aGlzLl9wcmVzZXRDdGwuc2V0QWN0aXZlKG51bGwpOyB9IGNhdGNoIChlKSB7fSB9CiAgICB0aGlzLnByb21wdCA9IGV4LnByb21wdCB8fCAnJzsKICAgIGlmICh0aGlzLl9wcm9tcHRGaWVsZCkgeyB0aGlzLl9wcm9tcHRGaWVsZC52YWx1ZSA9IHRoaXMucHJvbXB0OyB9CiAgICBpZiAoZXgubW9kZWwgJiYgbW9kZWxCeVJhdyhleC5tb2RlbCkucmF3ID09PSBleC5tb2RlbCkgewogICAgICB0aGlzLm1vZGVsUmF3ID0gZXgubW9kZWw7CiAgICAgIHZhciBzZWwgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignI3YtbW9kZWwnKTsKICAgICAgaWYgKHNlbCkgc2VsLnZhbHVlID0gdGhpcy5tb2RlbFJhdzsKICAgICAgd3JpdGVQZXJzaXN0ZWQoJ21vZGVsJywgdGhpcy5tb2RlbFJhdyk7CiAgICB9CiAgICBpZiAocmVmVVJMKSB7CiAgICAgIHZhciBtYXggPSBtYXhSZWZGb3IodGhpcy5jdXJyZW50TW9kZWwoKSk7CiAgICAgIHZhciBkdXAgPSB0aGlzLnJlZnMuc29tZShmdW5jdGlvbiAocikgeyByZXR1cm4gci5yZW1vdGVVUkwgPT09IHJlZlVSTCB8fCByLnVybCA9PT0gcmVmVVJMOyB9KTsKICAgICAgaWYgKCFkdXAgJiYgdGhpcy5yZWZzLmxlbmd0aCA8IG1heCkgewogICAgICAgIHRoaXMucmVmcy5wdXNoKHsgdXJsOiByZWZVUkwsIHJlbW90ZVVSTDogcmVmVVJMLCBuYW1lOiAncmVmZXJlbmNlJyB9KTsKICAgICAgfQogICAgICB0aGlzLmFmdGVySW5wdXRDaGFuZ2UoKTsKICAgIH0KICAgIHRoaXMucmVmcmVzaENUQSgpOwogICAgdGhpcy5yZWZyZXNoTW9kZWxIaW50KCk7CiAgICBpZiAodGhpcy5fcHJvbXB0RmllbGQpIHsgdGhpcy5fcHJvbXB0RmllbGQuZm9jdXMoKTsgdGhpcy5fcHJvbXB0RmllbGQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JykpOyB9CiAgICB0b2FzdChyZWZVUkwgPyAnUmVmZXJlbmNlIGFkZGVkIOKAlCB0d2VhayB0aGUgcHJvbXB0IGFuZCBUcmFuc2Zvcm0uJyA6ICdQcm9tcHQgbG9hZGVkIOKAlCB0d2VhayBpdCBhbmQgR2VuZXJhdGUuJywgJ2luZm8nKTsKICAgIHRyeSB7IHRoaXMucm9vdC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSk7IH0gY2F0Y2ggKGUpIHt9CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuZ2VuZXJhdGUgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAodGhpcy5idXN5KSByZXR1cm47CiAgICBpZiAoIXRoaXMuY2FuU3VibWl0KCkpIHsKICAgICAgaWYgKCF0aGlzLmhhc0lucHV0KCkgJiYgKHRoaXMucHJvbXB0IHx8ICcnKS50cmltKCkubGVuZ3RoIDwgOCkgewogICAgICAgIHRvYXN0KCdBZGQgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIG9yIGRyb3AgYW4gaW1hZ2UgdG8gZ2VuZXJhdGUuJywgJ2Vycm9yJyk7CiAgICAgICAgaWYgKHRoaXMuX3Byb21wdEZpZWxkKSB0aGlzLl9wcm9tcHRGaWVsZC5mb2N1cygpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBjb3VudCA9IHRoaXMudmFyaWF0aW9ucyA/IDQgOiAxOwogICAgdGhpcy5ydW5CYXRjaChjb3VudCk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUucnVuQmF0Y2ggPSBmdW5jdGlvbiAoY291bnQpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHRoaXMuYnVzeSA9IHRydWU7CiAgICB0aGlzLnJlZnJlc2hDVEEoKTsKCiAgICB2YXIgdG90YWxDb3N0ID0gdGhpcy50b3RhbENvc3QoKTsKCiAgICB0aGlzLmVuc3VyZUNyZWRpdHModG90YWxDb3N0KS50aGVuKGZ1bmN0aW9uIChoYXZlRW5vdWdoKSB7CiAgICAgIGlmICghaGF2ZUVub3VnaCkgewogICAgICAgIHNlbGYuYnVzeSA9IGZhbHNlOyBzZWxmLnJlZnJlc2hDVEEoKTsKICAgICAgICB0b2FzdCgnTm90IGVub3VnaCBjcmVkaXRzIOKAlCBhZGQgbW9yZSB0byBrZWVwIGNyZWF0aW5nLicsICdpbmZvJyk7CiAgICAgICAgZ28oJyMvcGF5d2FsbCcpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICByZXR1cm4gc2VsZi5kb0dlbmVyYXRpb25zKGNvdW50KTsKICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHsKICAgICAgc2VsZi5idXN5ID0gZmFsc2U7CiAgICAgIHNlbGYucmVmcmVzaENUQSgpOwogICAgICBpZiAocmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCkgewogICAgICAgIHZhciBmaXJzdCA9IHJlc3VsdHNbMF07CiAgICAgICAgZ28oJyMvaW1hZ2UvJyArIChmaXJzdC5yZW1vdGVJRCB8fCBmaXJzdC5pZCkpOwogICAgICAgIGlmICh1aSgpLmNvbmZldHRpKSB7IHRyeSB7IHVpKCkuY29uZmV0dGkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgICB9CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIHNlbGYuYnVzeSA9IGZhbHNlOwogICAgICBzZWxmLnJlZnJlc2hDVEEoKTsKICAgICAgc2VsZi5oaWRlT3ZlcmxheSgpOwogICAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHsgdG9hc3QoJ0dlbmVyYXRpb24gY2FuY2VsbGVkLicsICdpbmZvJyk7IHJldHVybjsgfQogICAgICB2YXIgbXNnID0gKGVyciAmJiAoZXJyLmRlc2NyaXB0aW9uIHx8IGVyci5tZXNzYWdlKSkgfHwgJ0dlbmVyYXRpb24gZmFpbGVkLiBQbGVhc2UgdHJ5IGFnYWluLic7CiAgICAgIHRvYXN0KG1zZywgJ2Vycm9yJyk7CiAgICB9KTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5lbnN1cmVDcmVkaXRzID0gZnVuY3Rpb24gKGNvc3QpIHsKICAgIHZhciBzID0gc3RhdGUoKTsKICAgIGZ1bmN0aW9uIGVub3VnaChuKSB7IHJldHVybiB0eXBlb2YgbiA9PT0gJ251bWJlcicgJiYgbiA+PSBjb3N0OyB9CiAgICBpZiAoZW5vdWdoKHMuY3JlZGl0cykpIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7CiAgICBpZiAoIWFwaSgpLmNyZWRpdHMpIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7CiAgICByZXR1cm4gYXBpKCkuY3JlZGl0cygpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICB2YXIgbiA9IHJlcyAmJiAodHlwZW9mIHJlcy5jcmVkaXRzID09PSAnbnVtYmVyJyA/IHJlcy5jcmVkaXRzIDogcmVzKTsKICAgICAgcy5jcmVkaXRzID0gKHR5cGVvZiBuID09PSAnbnVtYmVyJykgPyBuIDogcy5jcmVkaXRzOwogICAgICBpZiAoVi5zdG9yZSAmJiBWLnN0b3JlLmVtaXQpIFYuc3RvcmUuZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgcy5jcmVkaXRzKTsKICAgICAgcmV0dXJuIGVub3VnaChzLmNyZWRpdHMpOwogICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0pOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmRvR2VuZXJhdGlvbnMgPSBmdW5jdGlvbiAoY291bnQpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB0aGlzLmFib3J0ID0gKHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgIT09ICd1bmRlZmluZWQnKSA/IG5ldyBBYm9ydENvbnRyb2xsZXIoKSA6IG51bGw7CiAgICB2YXIgc2lnbmFsID0gdGhpcy5hYm9ydCA/IHRoaXMuYWJvcnQuc2lnbmFsIDogdW5kZWZpbmVkOwoKICAgIHRoaXMuc2hvd092ZXJsYXkoY291bnQpOwoKICAgIHZhciBwcmVwID0gdGhpcy5oYXNJbnB1dCgpID8gdGhpcy51cGxvYWRBbGwoc2lnbmFsKSA6IFByb21pc2UucmVzb2x2ZShudWxsKTsKCiAgICB2YXIgY2hhaW4gPSBwcmVwLnRoZW4oZnVuY3Rpb24gKHVwbG9hZGVkKSB7CiAgICAgIHZhciBzZXEgPSBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgdmFyIGRvbmUgPSAwOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAoZnVuY3Rpb24gKGlkeCkgewogICAgICAgICAgc2VxID0gc2VxLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoc2VsZi5hYm9ydCAmJiBzZWxmLmFib3J0LnNpZ25hbC5hYm9ydGVkKSB7IHZhciBlID0gbmV3IEVycm9yKCdhYm9ydGVkJyk7IGUubmFtZSA9ICdBYm9ydEVycm9yJzsgdGhyb3cgZTsgfQogICAgICAgICAgICBzZWxmLnNldE92ZXJsYXlTdGVwKGRvbmUsIGNvdW50KTsKICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2luZ2xlR2VuZXJhdGlvbih1cGxvYWRlZCwgc2lnbmFsLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgc2VsZi5zZXRPdmVybGF5UHJvZ3Jlc3MoZG9uZSwgY291bnQpOwogICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChpbWcpIHsKICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaW1nKTsKICAgICAgICAgICAgICBkb25lKys7CiAgICAgICAgICAgICAgc2VsZi5zZXRPdmVybGF5UHJvZ3Jlc3MoZG9uZSwgY291bnQpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0pKGkpOwogICAgICB9CiAgICAgIHJldHVybiBzZXE7CiAgICB9KTsKCiAgICByZXR1cm4gY2hhaW4udGhlbihmdW5jdGlvbiAoKSB7CiAgICAgIHNlbGYuaGlkZU92ZXJsYXkoKTsKICAgICAgc2VsZi5hYm9ydCA9IG51bGw7CiAgICAgIHJldHVybiByZXN1bHRzOwogICAgfSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUudXBsb2FkQWxsID0gZnVuY3Rpb24gKHNpZ25hbCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIG1heCA9IG1heFJlZkZvcih0aGlzLmN1cnJlbnRNb2RlbCgpKTsKICAgIHZhciB1c2UgPSB0aGlzLnJlZnMuc2xpY2UoMCwgbWF4KTsKICAgIGlmICghYXBpKCkudXBsb2FkSW1hZ2UpIHJldHVybiBQcm9taXNlLnJlamVjdChhcGlFcnIoJ1VwbG9hZCBpcyB1bmF2YWlsYWJsZS4nKSk7CgogICAgdGhpcy5zZXRPdmVybGF5TGFiZWwoJ1VwbG9hZGluZyB5b3VyIGltYWdlJyArICh1c2UubGVuZ3RoID4gMSA/ICdzJyA6ICcnKSArICfigKYnKTsKCiAgICB2YXIgc2VxID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB2YXIgdXJscyA9IFtdOwogICAgdXNlLmZvckVhY2goZnVuY3Rpb24gKHJlZikgewogICAgICBzZXEgPSBzZXEudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHNpZ25hbCAmJiBzaWduYWwuYWJvcnRlZCkgeyB2YXIgZSA9IG5ldyBFcnJvcignYWJvcnRlZCcpOyBlLm5hbWUgPSAnQWJvcnRFcnJvcic7IHRocm93IGU7IH0KICAgICAgICBpZiAocmVmLnJlbW90ZVVSTCkgeyB1cmxzLnB1c2gocmVmLnJlbW90ZVVSTCk7IHJldHVybjsgfQogICAgICAgIHJldHVybiBhcGkoKS51cGxvYWRJbWFnZShyZWYuZmlsZSwgJ3JlbmRlcicpLnRoZW4oZnVuY3Rpb24gKG1lZGlhVVJMKSB7CiAgICAgICAgICByZWYucmVtb3RlVVJMID0gbWVkaWFVUkw7CiAgICAgICAgICB1cmxzLnB1c2gobWVkaWFVUkwpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0pOwogICAgcmV0dXJuIHNlcS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKCF1cmxzLmxlbmd0aCkgdGhyb3cgYXBpRXJyKCdJbWFnZSB1cGxvYWQgcmV0dXJuZWQgbm8gVVJMLicpOwogICAgICByZXR1cm4geyBwcmltYXJ5OiB1cmxzWzBdLCBhbGw6IHVybHMgfTsKICAgIH0pOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnNpbmdsZUdlbmVyYXRpb24gPSBmdW5jdGlvbiAodXBsb2FkZWQsIHNpZ25hbCwgb25Qcm9ncmVzcykgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIHNlZWQgPSByYW5kb21TZWVkKCk7CiAgICB2YXIgcHJvbXB0ID0gdGhpcy5maW5hbFByb21wdCgpOwogICAgdmFyIG1vZGVsID0gdGhpcy5jdXJyZW50TW9kZWwoKTsKCiAgICBpZiAoIWFwaSgpLnBvbGwpIHJldHVybiBQcm9taXNlLnJlamVjdChhcGlFcnIoJ0dlbmVyYXRvciBjbGllbnQgdW5hdmFpbGFibGUuJykpOwoKICAgIHZhciBzdWJtaXRGbiwgcG9sbEZuOwogICAgdmFyIGlzRWRpdCA9ICEhdXBsb2FkZWQ7CgogICAgaWYgKGlzRWRpdCkgewogICAgICB0aGlzLnNldE92ZXJsYXlMYWJlbCh1cGxvYWRlZC5hbGwubGVuZ3RoID4gMSA/ICdBcHBseWluZyB5b3VyIHJlZmVyZW5jZSBpbWFnZXPigKYnIDogJ1JlaW1hZ2luaW5nIHlvdXIgaW1hZ2XigKYnKTsKICAgICAgdmFyIGJvZHkgPSBidWlsZEVkaXRCb2R5KG1vZGVsLCBwcm9tcHQsIHVwbG9hZGVkLCBzZWVkKTsKICAgICAgc3VibWl0Rm4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBhcGkoKS5nZW5FZGl0KG1vZGVsLnJhdywgYm9keSk7IH07CiAgICAgIHBvbGxGbiA9IGZ1bmN0aW9uIChyZXF1ZXN0SUQpIHsgcmV0dXJuIGFwaSgpLnBvbGxFZGl0KG1vZGVsLnJhdywgcmVxdWVzdElEKTsgfTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuc2V0T3ZlcmxheUxhYmVsKCdDcmVhdGluZyB5b3VyIGltYWdl4oCmJyk7CiAgICAgIHZhciBhc3AgPSBhc3BlY3RCeVJhdyh0aGlzLmFzcGVjdFJhdyk7CiAgICAgIHZhciB0MmlCb2R5ID0geyBwcm9tcHQ6IHByb21wdCwgc2VlZDogc2VlZCwgd2lkdGg6IGFzcC53LCBoZWlnaHQ6IGFzcC5oIH07CiAgICAgIHN1Ym1pdEZuID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gYXBpKCkuZ2VuVGV4dFRvSW1hZ2UodDJpQm9keSk7IH07CiAgICAgIHBvbGxGbiA9IGZ1bmN0aW9uIChyZXF1ZXN0SUQpIHsgcmV0dXJuIGFwaSgpLnBvbGxUZXh0VG9JbWFnZShyZXF1ZXN0SUQpOyB9OwogICAgfQoKICAgIHJldHVybiBhcGkoKS5wb2xsKHN1Ym1pdEZuLCBwb2xsRm4sIHsgb25Qcm9ncmVzczogb25Qcm9ncmVzcywgc2lnbmFsOiBzaWduYWwgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHRocm93IGVycjsKICAgICAgaWYgKGlzRWRpdCkgewogICAgICAgIHZhciBtb2RlbE5hbWUgPSAobW9kZWwgJiYgbW9kZWwubGFiZWwpID8gbW9kZWwubGFiZWwgOiAndGhpcyBtb2RlbCc7CiAgICAgICAgdmFyIGJhc2UgPSAoZXJyICYmIChlcnIuZGVzY3JpcHRpb24gfHwgZXJyLm1lc3NhZ2UpKSB8fCAnJzsKICAgICAgICB2YXIgc3RhdHVzID0gZXJyICYmIGVyci5zdGF0dXM7CiAgICAgICAgaWYgKHN0YXR1cyA9PT0gNDA4IHx8IC9sb25nZXIgdGhhbiBleHBlY3RlZC9pLnRlc3QoYmFzZSkpIHsKICAgICAgICAgIHRocm93IGFwaUVycihtb2RlbE5hbWUgKyAnIGlzIHRha2luZyB0b28gbG9uZyByaWdodCBub3cuIFRyeSBhZ2Fpbiwgb3Igc3dpdGNoIHRvIGEgZmFzdGVyIG1vZGVsLicpOwogICAgICAgIH0KICAgICAgICB0aHJvdyBhcGlFcnIoYmFzZSA/IChiYXNlICsgJyBUcnkgYSBkaWZmZXJlbnQgbW9kZWwuJykgOiAobW9kZWxOYW1lICsgJyBjb3VsZCBub3QgZmluaXNoIHRoaXMgZWRpdC4gVHJ5IGEgZGlmZmVyZW50IG1vZGVsLicpKTsKICAgICAgfQogICAgICB0aHJvdyBlcnI7CiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgdmFyIHVybCA9IGV4dHJhY3RSZXN1bHRVUkwocmVzdWx0KTsKICAgICAgaWYgKCF1cmwpIHsKICAgICAgICB2YXIgZGVzYyA9IHJlc3VsdCAmJiByZXN1bHQuZGVzY3JpcHRpb247CiAgICAgICAgdGhyb3cgYXBpRXJyKGRlc2MgfHwgJ1RoZSBtb2RlbCByZXR1cm5lZCBubyBpbWFnZS4gVHJ5IGEgZGlmZmVyZW50IHByb21wdCBvciBtb2RlbC4nKTsKICAgICAgfQogICAgICB2YXIgaW1hZ2UgPSBzZWxmLmJ1aWxkR2VuZXJhdGVkSW1hZ2UoewogICAgICAgIHByb21wdDogcHJvbXB0LAogICAgICAgIG1vZGVsUmF3OiBpc0VkaXQgPyBtb2RlbC5yYXcgOiAnZmx1eDFTY2huZWxsJywKICAgICAgICBzZWVkOiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQuc2VlZCA9PT0gJ251bWJlcicpID8gcmVzdWx0LnNlZWQgOiBzZWVkLAogICAgICAgIHJlc3VsdFVSTDogdXJsLAogICAgICAgIG9yaWdpbmFsVVJMOiBpc0VkaXQgPyB1cGxvYWRlZC5wcmltYXJ5IDogbnVsbAogICAgICB9KTsKICAgICAgcmV0dXJuIHNlbGYucGVyc2lzdChpbWFnZSk7CiAgICB9KTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5idWlsZEdlbmVyYXRlZEltYWdlID0gZnVuY3Rpb24gKG8pIHsKICAgIHJldHVybiB7CiAgICAgIGlkOiB1dWlkKCksCiAgICAgIHByb21wdDogby5wcm9tcHQsCiAgICAgIG5lZ2F0aXZlUHJvbXB0OiBudWxsLAogICAgICBzdGVwQ291bnQ6IDQsCiAgICAgIHNlZWQ6IG8uc2VlZCwKICAgICAgZGlzYWJsZVNhZmV0eTogZmFsc2UsCiAgICAgIGNyZWF0ZWREYXRlOiBub3dJU08oKSwKICAgICAgcmVtb3RlSW1hZ2VVUkw6IG8ucmVzdWx0VVJMLAogICAgICByZW1vdGVPcmlnaW5hbEltYWdlVVJMOiBvLm9yaWdpbmFsVVJMIHx8IHVuZGVmaW5lZCwKICAgICAgbW9kZWw6IG8ubW9kZWxSYXcsCiAgICAgIHB1Ymxpc2hlZDogZmFsc2UsCiAgICAgIGZhdm9yaXRlZDogZmFsc2UsCiAgICAgIHByZXNldElEOiB0aGlzLmFjdGl2ZVByZXNldCA/IHRoaXMuYWN0aXZlUHJlc2V0LmlkIDogdW5kZWZpbmVkCiAgICB9OwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnBlcnNpc3QgPSBmdW5jdGlvbiAoaW1hZ2UpIHsKICAgIGZ1bmN0aW9uIGNvbW1pdChzYXZlZCkgewogICAgICB2YXIgZ2kgPSAoc2F2ZWQgJiYgc2F2ZWQuZ2VuZXJhdGVkSW1hZ2UpID8gc2F2ZWQuZ2VuZXJhdGVkSW1hZ2UgOiAoc2F2ZWQgfHwgaW1hZ2UpOwogICAgICBpZiAoZ2kgJiYgZ2kucmVtb3RlSUQgJiYgIWltYWdlLnJlbW90ZUlEKSBpbWFnZS5yZW1vdGVJRCA9IGdpLnJlbW90ZUlEOwogICAgICBpZiAoZ2kgJiYgZ2kuaWQgJiYgZ2kucmVtb3RlSUQgJiYgaW1hZ2UuaWQgIT09IGdpLmlkKSBpbWFnZS5yZW1vdGVJRCA9IGdpLnJlbW90ZUlEOwogICAgICB2YXIgZmluYWxJbWFnZSA9IG1lcmdlSW1hZ2UoaW1hZ2UsIGdpKTsKICAgICAgc3RhdGUoKS5saWJyYXJ5ID0gc3RhdGUoKS5saWJyYXJ5IHx8IFtdOwogICAgICBzdGF0ZSgpLmxpYnJhcnkudW5zaGlmdChmaW5hbEltYWdlKTsKICAgICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5lbWl0KSBWLnN0b3JlLmVtaXQoJ2xpYnJhcnk6Y2hhbmdlZCcsIHN0YXRlKCkubGlicmFyeSk7CiAgICAgIGlmIChhcGkoKS5jcmVkaXRzKSB7CiAgICAgICAgYXBpKCkuY3JlZGl0cygpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgdmFyIG4gPSByZXMgJiYgKHR5cGVvZiByZXMuY3JlZGl0cyA9PT0gJ251bWJlcicgPyByZXMuY3JlZGl0cyA6IHJlcyk7CiAgICAgICAgICBpZiAodHlwZW9mIG4gPT09ICdudW1iZXInKSB7IHN0YXRlKCkuY3JlZGl0cyA9IG47IGlmIChWLnN0b3JlICYmIFYuc3RvcmUuZW1pdCkgVi5zdG9yZS5lbWl0KCdjcmVkaXRzOmNoYW5nZWQnLCBuKTsgfQogICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsKICAgICAgfQogICAgICByZXR1cm4gZmluYWxJbWFnZTsKICAgIH0KCiAgICBpZiAoIWFwaSgpLnBlcnNpc3RJbWFnZSkgewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbW1pdChudWxsKSk7CiAgICB9CiAgICByZXR1cm4gYXBpKCkucGVyc2lzdEltYWdlKGltYWdlKS50aGVuKGZ1bmN0aW9uIChzYXZlZCkgewogICAgICByZXR1cm4gY29tbWl0KHNhdmVkKTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgdG9hc3QoJ1NhdmVkIGxvY2FsbHkg4oCUIGNvdWxkbuKAmXQgc3luYyB0byB5b3VyIGxpYnJhcnkuJywgJ2luZm8nKTsKICAgICAgcmV0dXJuIGNvbW1pdChudWxsKTsKICAgIH0pOwogIH07CgogIGZ1bmN0aW9uIG1lcmdlSW1hZ2UobG9jYWwsIHNlcnZlcikgewogICAgaWYgKCFzZXJ2ZXIgfHwgdHlwZW9mIHNlcnZlciAhPT0gJ29iamVjdCcpIHJldHVybiBsb2NhbDsKICAgIHZhciBvdXQgPSB7fTsKICAgIHZhciBrOwogICAgZm9yIChrIGluIGxvY2FsKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGxvY2FsLCBrKSkgb3V0W2tdID0gbG9jYWxba107CiAgICBmb3IgKGsgaW4gc2VydmVyKSB7CiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlcnZlciwgaykpIGNvbnRpbnVlOwogICAgICBpZiAoc2VydmVyW2tdICE9IG51bGwpIG91dFtrXSA9IHNlcnZlcltrXTsKICAgIH0KICAgIGlmICghb3V0LnJlbW90ZUltYWdlVVJMKSBvdXQucmVtb3RlSW1hZ2VVUkwgPSBsb2NhbC5yZW1vdGVJbWFnZVVSTDsKICAgIGlmIChsb2NhbC5yZW1vdGVPcmlnaW5hbEltYWdlVVJMICYmICFvdXQucmVtb3RlT3JpZ2luYWxJbWFnZVVSTCkgb3V0LnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwgPSBsb2NhbC5yZW1vdGVPcmlnaW5hbEltYWdlVVJMOwogICAgcmV0dXJuIG91dDsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkRWRpdEJvZHkobW9kZWwsIHByb21wdCwgdXBsb2FkZWQsIHNlZWQpIHsKICAgIHZhciBtYXggPSBtYXhSZWZGb3IobW9kZWwpOwogICAgdmFyIG11bHRpID0gbWF4ID4gMTsKICAgIHZhciBib2R5ID0geyBwcm9tcHQ6IHByb21wdCwgc2VlZDogc2VlZCB9OwoKICAgIGlmIChtdWx0aSkgewogICAgICBib2R5LmltYWdlX3VybCA9IHVwbG9hZGVkLnByaW1hcnk7CiAgICAgIGJvZHkuaW1hZ2VfdXJscyA9IHVwbG9hZGVkLmFsbDsKICAgICAgYm9keS5udW1faW1hZ2VzID0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGJvZHkuaW1hZ2VfdXJsID0gdXBsb2FkZWQucHJpbWFyeTsKICAgIH0KCiAgICBpZiAoIW11bHRpKSB7CiAgICAgIGJvZHkuYWNjZWxlcmF0aW9uID0gJ2hpZ2gnOwogICAgfQogICAgcmV0dXJuIGJvZHk7CiAgfQoKICBmdW5jdGlvbiBhc3BlY3RCeVJhdyhyYXcpIHsKICAgIHZhciBsaXN0ID0gYXNwZWN0cygpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSBpZiAobGlzdFtpXS5yYXcgPT09IHJhdykgcmV0dXJuIGxpc3RbaV07CiAgICByZXR1cm4gbGlzdFswXTsKICB9CgogIGZ1bmN0aW9uIGV4dHJhY3RSZXN1bHRVUkwocmVzdWx0KSB7CiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7CiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHJldHVybiByZXN1bHQ7CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQuaW1hZ2VzKSAmJiByZXN1bHQuaW1hZ2VzLmxlbmd0aCkgewogICAgICB2YXIgaW1nID0gcmVzdWx0LmltYWdlc1swXTsKICAgICAgaWYgKHR5cGVvZiBpbWcgPT09ICdzdHJpbmcnKSByZXR1cm4gaW1nOwogICAgICBpZiAoaW1nICYmIGltZy51cmwpIHJldHVybiBpbWcudXJsOwogICAgfQogICAgaWYgKHJlc3VsdC51cmwpIHJldHVybiByZXN1bHQudXJsOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiBub3JtYWxpemVGZWVkSW1hZ2UocmF3KSB7CiAgICBpZiAoIXJhdykgcmV0dXJuIHt9OwogICAgdmFyIGdpID0gcmF3LmdlbmVyYXRlZEltYWdlIHx8IHJhdy5pbWFnZSB8fCByYXc7CiAgICByZXR1cm4gewogICAgICBpZDogZ2kuaWQsIHJlbW90ZUlEOiBnaS5yZW1vdGVJRCwgcHJvbXB0OiBnaS5wcm9tcHQsCiAgICAgIG1vZGVsOiBnaS5tb2RlbCwKICAgICAgcmVtb3RlSW1hZ2VVUkw6IGdpLnJlbW90ZUltYWdlVVJMIHx8IGdpLmltYWdlVVJMIHx8IGdpLnVybCwKICAgICAgcmVtb3RlT3JpZ2luYWxJbWFnZVVSTDogZ2kucmVtb3RlT3JpZ2luYWxJbWFnZVVSTCB8fCBnaS5vcmlnaW5hbEltYWdlVVJMLAogICAgICBmYXZvcml0ZWQ6IGdpLmZhdm9yaXRlZAogICAgfTsKICB9CgogIGZ1bmN0aW9uIGltYWdlVVJMT2YoaW1hZ2UpIHsKICAgIGlmICghaW1hZ2UpIHJldHVybiAnJzsKICAgIHJldHVybiBpbWFnZS5yZW1vdGVJbWFnZVVSTCB8fCBpbWFnZS5yZW1vdGVJbWFnZVVybCB8fCBpbWFnZS5pbWFnZVVSTCB8fCBpbWFnZS51cmwgfHwgJyc7CiAgfQoKICBmdW5jdGlvbiBhcGlFcnIobXNnKSB7CiAgICB2YXIgZSA9IG5ldyBFcnJvcihtc2cpOwogICAgZS5kZXNjcmlwdGlvbiA9IG1zZzsKICAgIHJldHVybiBlOwogIH0KCiAgZnVuY3Rpb24gZW1wdHlCbG9jayh0aXRsZSwgc3ViLCBpY29uTmFtZSkgewogICAgaWYgKHVpKCkuZW1wdHkpIHsKICAgICAgdHJ5IHsgcmV0dXJuIHVpKCkuZW1wdHkoeyB0aXRsZTogdGl0bGUsIG1lc3NhZ2U6IHN1YiwgaWNvbjogaWNvbk5hbWUgfHwgJ2ltYWdlJyB9KTsgfSBjYXRjaCAoZSkge30KICAgIH0KICAgIHJldHVybiBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHknIH0sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eV9faWNvbicsIGh0bWw6IGljb24oaWNvbk5hbWUgfHwgJ2ltYWdlJykgfSksCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eV9fdGl0bGUnIH0sIHRpdGxlKSwKICAgICAgc3ViID8gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19tc2cnIH0sIHN1YikgOiBudWxsKTsKICB9CgogIENyZWF0b3IucHJvdG90eXBlLnNob3dPdmVybGF5ID0gZnVuY3Rpb24gKGNvdW50KSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB0aGlzLmhpZGVPdmVybGF5KCk7CgogICAgdmFyIHNjcmltID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW92ZXJsYXktc2NyaW0gdi1jcmVhdGVfX3NjcmltJywgcm9sZTogJ2RpYWxvZycsICdhcmlhLW1vZGFsJzogJ3RydWUnLAogICAgICAnYXJpYS1sYWJlbCc6ICdHZW5lcmF0aW5nJyB9KTsKCiAgICB2YXIgcGFuZWwgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtbW9kYWwgdi1jcmVhdGVfX292ZXJsYXknIH0pOwoKICAgIHBhbmVsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX29yYicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3JlYXRlX19vcmItY29yZScsIGh0bWw6IGljb24oJ3NwYXJrbGVzJykgfHwgJ+KcpicgfSkpKTsKCiAgICB2YXIgbGFiZWwgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtbW9kYWxfX3RpdGxlIHYtY3JlYXRlX19vdmVybGF5LWxhYmVsJyB9LCAnU3RhcnRpbmfigKYnKTsKICAgIHRoaXMuX292TGFiZWwgPSBsYWJlbDsKICAgIHBhbmVsLmFwcGVuZENoaWxkKGxhYmVsKTsKCiAgICB2YXIgYmF0Y2hJbmZvID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YiB2LWNyZWF0ZV9fb3ZlcmxheS1iYXRjaCcgfSk7CiAgICB0aGlzLl9vdkJhdGNoID0gYmF0Y2hJbmZvOwogICAgaWYgKGNvdW50ID4gMSkgYmF0Y2hJbmZvLnRleHRDb250ZW50ID0gJzAgb2YgJyArIGNvdW50ICsgJyBkb25lJzsKICAgIHBhbmVsLmFwcGVuZENoaWxkKGJhdGNoSW5mbyk7CgogICAgdmFyIHRyYWNrID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXByb2dyZXNzJywgcm9sZTogJ3Byb2dyZXNzYmFyJywgJ2FyaWEtbGFiZWwnOiAnV29ya2luZycgfSk7CiAgICB2YXIgYmFyID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXByb2dyZXNzX19iYXInIH0pOwogICAgdHJhY2suYXBwZW5kQ2hpbGQoYmFyKTsKICAgIHRoaXMuX292QmFyID0gYmFyOwogICAgdGhpcy5fb3ZDb3VudCA9IGNvdW50OwogICAgcGFuZWwuYXBwZW5kQ2hpbGQodHJhY2spOwoKICAgIHZhciBjYW5jZWwgPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jcmVhdGVfX292ZXJsYXktY2FuY2VsJyB9LCAnQ2FuY2VsJyk7CiAgICB0aGlzLm9uKGNhbmNlbCwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBzZWxmLmNhbmNlbEdlbmVyYXRpb24oKTsgfSk7CiAgICBwYW5lbC5hcHBlbmRDaGlsZChjYW5jZWwpOwoKICAgIHNjcmltLmFwcGVuZENoaWxkKHBhbmVsKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaW0pOwogICAgdGhpcy5fc2NyaW0gPSBzY3JpbTsKICAgIHRoaXMuc2V0T3ZlcmxheVN0ZXAoMCwgY291bnQpOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnNldE92ZXJsYXlMYWJlbCA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAgICBpZiAodGhpcy5fb3ZMYWJlbCkgdGhpcy5fb3ZMYWJlbC50ZXh0Q29udGVudCA9IHRleHQ7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuc2V0T3ZlcmxheVN0ZXAgPSBmdW5jdGlvbiAoZG9uZSwgY291bnQpIHsKICAgIGlmICh0aGlzLl9vdkJhdGNoICYmIGNvdW50ID4gMSkgdGhpcy5fb3ZCYXRjaC50ZXh0Q29udGVudCA9IGRvbmUgKyAnIG9mICcgKyBjb3VudCArICcgZG9uZSc7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuc2V0T3ZlcmxheVByb2dyZXNzID0gZnVuY3Rpb24gKGRvbmUsIGNvdW50KSB7CiAgICBpZiAodGhpcy5fb3ZCYXRjaCAmJiBjb3VudCA+IDEpIHRoaXMuX292QmF0Y2gudGV4dENvbnRlbnQgPSBkb25lICsgJyBvZiAnICsgY291bnQgKyAnIGRvbmUnOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmhpZGVPdmVybGF5ID0gZnVuY3Rpb24gKCkgewogICAgaWYgKHRoaXMuX3NjcmltKSB7CiAgICAgIHZhciBvID0gdGhpcy5fc2NyaW07CiAgICAgIHRoaXMuX3NjcmltID0gbnVsbDsKICAgICAgby5jbGFzc0xpc3QuYWRkKCdjbG9zaW5nJyk7CiAgICAgIHZhciByZW1vdmVkID0gZmFsc2U7CiAgICAgIHZhciBkb25lID0gZnVuY3Rpb24gKCkgeyBpZiAoIXJlbW92ZWQgJiYgby5wYXJlbnROb2RlKSB7IG8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKTsgcmVtb3ZlZCA9IHRydWU7IH0gfTsKICAgICAgdGhpcy5vbihvLCAnYW5pbWF0aW9uZW5kJywgZG9uZSk7CiAgICAgIHNldFRpbWVvdXQoZG9uZSwgMzYwKTsKICAgIH0KICAgIHRoaXMuX292TGFiZWwgPSB0aGlzLl9vdkJhciA9IHRoaXMuX292QmF0Y2ggPSBudWxsOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmNhbmNlbEdlbmVyYXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAodGhpcy5hYm9ydCkgeyB0cnkgeyB0aGlzLmFib3J0LmFib3J0KCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIHRoaXMuc2V0T3ZlcmxheUxhYmVsKCdDYW5jZWxsaW5n4oCmJyk7CiAgfTsKCn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2xpYnJhcnkuanMgPT09PT0gKi8KKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gd2luZG93LlYgfHwgKHdpbmRvdy5WID0ge30pOwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwoKICBmdW5jdGlvbiBlbCgpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51aS5lbC5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgdmFyIHRhZyA9IGFyZ3VtZW50c1swXTsKICAgIHZhciBhdHRycyA9IGFyZ3VtZW50c1sxXSB8fCB7fTsKICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgZm9yICh2YXIgayBpbiBhdHRycykgewogICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgaykpIGNvbnRpbnVlOwogICAgICB2YXIgdmFsID0gYXR0cnNba107CiAgICAgIGlmICh2YWwgPT0gbnVsbCkgY29udGludWU7CiAgICAgIGlmIChrID09PSAnY2xhc3MnIHx8IGsgPT09ICdjbGFzc05hbWUnKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgZWxzZSBpZiAoayA9PT0gJ3RleHQnKSBub2RlLnRleHRDb250ZW50ID0gdmFsOwogICAgICBlbHNlIGlmIChrID09PSAnaHRtbCcpIG5vZGUuaW5uZXJIVE1MID0gdmFsOwogICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHZhbCk7CiAgICAgIH0gZWxzZSBpZiAoayA9PT0gJ2RhdGFzZXQnICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7CiAgICAgICAgZm9yICh2YXIgZGsgaW4gdmFsKSBub2RlLmRhdGFzZXRbZGtdID0gdmFsW2RrXTsKICAgICAgfSBlbHNlIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICB9CiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY2hpbGQgPSBhcmd1bWVudHNbaV07CiAgICAgIGlmIChjaGlsZCA9PSBudWxsIHx8IGNoaWxkID09PSBmYWxzZSkgY29udGludWU7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkgewogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hpbGQubGVuZ3RoOyBqKyspIHsKICAgICAgICAgIGlmIChjaGlsZFtqXSA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodHlwZW9mIGNoaWxkW2pdID09PSAnc3RyaW5nJyA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoaWxkW2pdKSA6IGNoaWxkW2pdKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQpIDogY2hpbGQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIFMobm9kZSwgY3NzKSB7IGlmIChub2RlKSBub2RlLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAobm9kZS5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykgfHwgJycpICsgJzsnICsgY3NzKTsgcmV0dXJuIG5vZGU7IH0KCiAgdmFyIEFDQ0VOVCA9ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknOwogIHZhciBHUkFESUVOVCA9ICd2YXIoLS1ncmFkaWVudC12YW1wLCBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjNTI5N0Y4LCAjODJENkZGKSknOwogIHZhciBCQURHRV9CRyA9ICdyZ2JhKDEwLDEyLDE0LC41NSknOwogIHZhciBHTEFTU19CRyA9ICd2YXIoLS1jb2xvci1iZy1vbiwgIzIwMjIyMSknOwogIHZhciBMSU5FID0gJ3ZhcigtLXYtbGluZSwgcmdiYSgyNDUsMjQ1LDI0NywuMTUpKSc7CgogIGZ1bmN0aW9uIGljb24obmFtZSkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaWNvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgciA9IFYudWkuaWNvbihuYW1lKTsKICAgICAgaWYgKHR5cGVvZiByID09PSAnc3RyaW5nJykgewogICAgICAgIHZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgIHNwYW4uY2xhc3NOYW1lID0gJ3YtaWNvJzsKICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgICAgIHNwYW4uaW5uZXJIVE1MID0gcjsKICAgICAgICByZXR1cm4gc3BhbjsKICAgICAgfQogICAgICByZXR1cm4gcjsKICAgIH0KICAgIHZhciBmYWxsYmFjayA9IHsgc2VhcmNoOiAn4oyVJywgc29ydDogJ+KHhScsIGZvbGRlcjogJ+KWpCcsIGhlYXJ0OiAn4pmhJywgaGVhcnRGaWxsOiAn4pmlJywgdHJhc2g6ICfijKsnLCBjbG9zZTogJ+KclScsIGNoZWNrOiAn4pyTJywgbW9yZTogJ+KLrycsIGRvd25sb2FkOiAn4qSTJywgY29weTogJ+KOmCcsIHBsdXM6ICcrJywgZ3JpZDogJ+KWpicsIGltYWdlOiAn4pajJyB9OwogICAgdmFyIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICBzLmNsYXNzTmFtZSA9ICd2LWljbyc7CiAgICBzLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgcy50ZXh0Q29udGVudCA9IGZhbGxiYWNrW25hbWVdIHx8ICfigKInOwogICAgcmV0dXJuIHM7CiAgfQoKICBmdW5jdGlvbiB0b2FzdChtc2csIGtpbmQpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnRvYXN0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51aS50b2FzdChtc2csIGtpbmQgfHwgJ2luZm8nKTsKICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLmVtaXQgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuZW1pdCgndG9hc3QnLCB7IG1zZzogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsKICB9CgogIGZ1bmN0aW9uIGNvbmZpcm1EaWFsb2cobXNnKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jb25maXJtID09PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFYudWkuY29uZmlybShtc2cpKTsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0obXNnKSk7CiAgfQoKICBmdW5jdGlvbiBtb2RhbChub2RlLCBvcHRzKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5tb2RhbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudWkubW9kYWwobm9kZSwgb3B0cyB8fCB7fSk7CiAgICB2YXIgYmFjayA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbC1iYWNrJyB9KTsKICAgIHZhciBwYW5lbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbCBnbGFzcy1jYXJkJyB9LCBub2RlKTsKICAgIGJhY2suYXBwZW5kQ2hpbGQocGFuZWwpOwogICAgZnVuY3Rpb24gY2xvc2UoKSB7IGlmIChiYWNrLnBhcmVudE5vZGUpIGJhY2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiYWNrKTsgaWYgKG9wdHMgJiYgb3B0cy5vbkNsb3NlKSBvcHRzLm9uQ2xvc2UoKTsgfQogICAgYmFjay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGlmIChlLnRhcmdldCA9PT0gYmFjaykgY2xvc2UoKTsgfSk7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJhY2spOwogICAgcmV0dXJuIHsgY2xvc2U6IGNsb3NlIH07CiAgfQoKICB2YXIgZGVib3VuY2UgPSAoVi51dGlsICYmIFYudXRpbC5kZWJvdW5jZSkgPyBWLnV0aWwuZGVib3VuY2UgOiBmdW5jdGlvbiAoZm4sIG1zKSB7CiAgICB2YXIgdDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBhID0gYXJndW1lbnRzLCBjID0gdGhpczsKICAgICAgY2xlYXJUaW1lb3V0KHQpOwogICAgICB0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGZuLmFwcGx5KGMsIGEpOyB9LCBtcyk7CiAgICB9OwogIH07CgogIGZ1bmN0aW9uIGVzY2FwZUh0bWwocykgewogICAgaWYgKFYudXRpbCAmJiB0eXBlb2YgVi51dGlsLmVzY2FwZUh0bWwgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnV0aWwuZXNjYXBlSHRtbChzKTsKICAgIHJldHVybiBTdHJpbmcocyA9PSBudWxsID8gJycgOiBzKS5yZXBsYWNlKC9bJjw+IiddL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgIHJldHVybiB7ICcmJzogJyZhbXA7JywgJzwnOiAnJmx0OycsICc+JzogJyZndDsnLCAnIic6ICcmcXVvdDsnLCAiJyI6ICcmIzM5OycgfVtjXTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZG93bmxvYWQodXJsLCBuYW1lKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwuZG93bmxvYWQgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnV0aWwuZG93bmxvYWQodXJsLCBuYW1lKTsKICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgYS5ocmVmID0gdXJsOyBhLmRvd25sb2FkID0gbmFtZSB8fCAnaW1hZ2UnOyBhLnRhcmdldCA9ICdfYmxhbmsnOyBhLnJlbCA9ICdub29wZW5lcic7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOyBhLmNsaWNrKCk7IGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICBpZiAoVi5yb3V0ZXIgJiYgdHlwZW9mIFYucm91dGVyLmdvID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi5yb3V0ZXIuZ28oaGFzaCk7CiAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiBpbWdJZChpbWcpIHsgcmV0dXJuIGltZyAmJiAoaW1nLnJlbW90ZUlEIHx8IGltZy5pZCk7IH0KICBmdW5jdGlvbiBpbWdLZXkoaW1nKSB7IHJldHVybiBTdHJpbmcoaW1nSWQoaW1nKSB8fCAnJyk7IH0KCiAgZnVuY3Rpb24gZGF0ZU1zKGltZykgewogICAgdmFyIGQgPSBpbWcgJiYgaW1nLmNyZWF0ZWREYXRlOwogICAgaWYgKGQgPT0gbnVsbCkgcmV0dXJuIDA7CiAgICBpZiAodHlwZW9mIGQgPT09ICdudW1iZXInKSByZXR1cm4gZCA8IDFlMTIgPyBkICogMTAwMCA6IGQ7CiAgICB2YXIgdCA9IERhdGUucGFyc2UoZCk7CiAgICByZXR1cm4gaXNOYU4odCkgPyAwIDogdDsKICB9CgogIGZ1bmN0aW9uIGZ1enp5U2NvcmUobmVlZGxlLCBoYXkpIHsKICAgIGlmICghbmVlZGxlKSByZXR1cm4gMTsKICAgIGlmICghaGF5KSByZXR1cm4gMDsKICAgIG5lZWRsZSA9IG5lZWRsZS50b0xvd2VyQ2FzZSgpOwogICAgaGF5ID0gaGF5LnRvTG93ZXJDYXNlKCk7CiAgICB2YXIgZXhhY3QgPSBoYXkuaW5kZXhPZihuZWVkbGUpOwogICAgaWYgKGV4YWN0ICE9PSAtMSkgcmV0dXJuIDEwMDAgLSBleGFjdDsKICAgIHZhciBoaSA9IDAsIG5pID0gMCwgc2NvcmUgPSAwLCBzdHJlYWsgPSAwOwogICAgd2hpbGUgKGhpIDwgaGF5Lmxlbmd0aCAmJiBuaSA8IG5lZWRsZS5sZW5ndGgpIHsKICAgICAgaWYgKGhheVtoaV0gPT09IG5lZWRsZVtuaV0pIHsKICAgICAgICBzdHJlYWsgKz0gMTsKICAgICAgICBzY29yZSArPSAxICsgc3RyZWFrOwogICAgICAgIG5pICs9IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFrID0gMDsKICAgICAgfQogICAgICBoaSArPSAxOwogICAgfQogICAgcmV0dXJuIG5pID09PSBuZWVkbGUubGVuZ3RoID8gc2NvcmUgOiAwOwogIH0KCiAgZnVuY3Rpb24gc2VhcmNoSGF5c3RhY2soaW1nKSB7CiAgICB2YXIgcGFydHMgPSBbaW1nLnByb21wdCB8fCAnJywgaW1nLm1vZGVsIHx8ICcnLCBtb2RlbExhYmVsKGltZy5tb2RlbCkgfHwgJyddOwogICAgaWYgKEFycmF5LmlzQXJyYXkoaW1nLnRhZ3MpKSBwYXJ0cyA9IHBhcnRzLmNvbmNhdChpbWcudGFncyk7CiAgICByZXR1cm4gcGFydHMuam9pbignICcpOwogIH0KCiAgdmFyIFNPUlRTID0gWwogICAgeyBrZXk6ICduZXdlc3QnLCBsYWJlbDogJ05ld2VzdCcsIGNtcDogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGRhdGVNcyhiKSAtIGRhdGVNcyhhKTsgfSB9LAogICAgeyBrZXk6ICdvbGRlc3QnLCBsYWJlbDogJ09sZGVzdCcsIGNtcDogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGRhdGVNcyhhKSAtIGRhdGVNcyhiKTsgfSB9LAogICAgeyBrZXk6ICdheicsIGxhYmVsOiAnQSDihpIgWicsIGNtcDogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIChhLnByb21wdCB8fCAnJykubG9jYWxlQ29tcGFyZShiLnByb21wdCB8fCAnJyk7IH0gfSwKICAgIHsga2V5OiAnbW9kZWwnLCBsYWJlbDogJ0J5IE1vZGVsJywgY21wOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKG1vZGVsTGFiZWwoYS5tb2RlbCkgfHwgJycpLmxvY2FsZUNvbXBhcmUobW9kZWxMYWJlbChiLm1vZGVsKSB8fCAnJykgfHwgZGF0ZU1zKGIpIC0gZGF0ZU1zKGEpOyB9IH0sCiAgICB7IGtleTogJ2Zhdm9yaXRlcycsIGxhYmVsOiAnRmF2b3JpdGVzIEZpcnN0JywgY21wOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKGIuZmF2b3JpdGVkID8gMSA6IDApIC0gKGEuZmF2b3JpdGVkID8gMSA6IDApIHx8IGRhdGVNcyhiKSAtIGRhdGVNcyhhKTsgfSB9CiAgXTsKCiAgZnVuY3Rpb24gbW9kZWxMYWJlbChyYXcpIHsKICAgIGlmIChyYXcgJiYgVi5kYXRhICYmIEFycmF5LmlzQXJyYXkoVi5kYXRhLm1vZGVscykpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBWLmRhdGEubW9kZWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKFYuZGF0YS5tb2RlbHNbaV0ucmF3ID09PSByYXcpIHJldHVybiBWLmRhdGEubW9kZWxzW2ldLmxhYmVsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmF3IHx8ICcnOwogIH0KCiAgdmFyIFBFUiA9IDMwOwoKICB2YXIgY3R4ID0gbnVsbDsKCiAgZnVuY3Rpb24gZnJlc2hDdHgoKSB7CiAgICByZXR1cm4gewogICAgICByb290OiBudWxsLAogICAgICBncmlkRWw6IG51bGwsCiAgICAgIHNlbnRpbmVsOiBudWxsLAogICAgICBzdGF0dXNFbDogbnVsbCwKICAgICAgdG9vbGJhckVsOiBudWxsLAogICAgICBjb3VudEVsOiBudWxsLAogICAgICBpdGVtczogW10sCiAgICAgIHBhZ2U6IDAsCiAgICAgIHRvdGFsOiBudWxsLAogICAgICBsb2FkaW5nOiBmYWxzZSwKICAgICAgZG9uZTogZmFsc2UsCiAgICAgIGVycm9yZWQ6IGZhbHNlLAogICAgICBmZXRjaGVkOiBmYWxzZSwKICAgICAgc291cmNlOiAnbGlicmFyeScsCiAgICAgIGZvbGRlcklEOiBudWxsLAogICAgICBmb2xkZXJzOiBbXSwKICAgICAgZm9sZGVyc0xvYWRlZDogZmFsc2UsCiAgICAgIHF1ZXJ5OiAnJywKICAgICAgc29ydDogJ25ld2VzdCcsCiAgICAgIGluZHVzdHJ5OiBudWxsLAogICAgICBzZWxlY3RNb2RlOiBmYWxzZSwKICAgICAgc2VsZWN0ZWQ6IHt9LAogICAgICBvYnNlcnZlcjogbnVsbCwKICAgICAgbWVudUVsOiBudWxsLAogICAgICBzY3JvbGxZOiAwLAogICAgICBzY3JvbGxUYXJnZXQ6IG51bGwKICAgIH07CiAgfQoKICBmdW5jdGlvbiBhY3RpdmVGZXRjaChwYWdlKSB7CiAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2Zhdm9yaXRlcycpIHJldHVybiBWLmFwaS5mYXZvcml0ZXMoMjAwKTsKICAgIGlmIChjdHguc291cmNlID09PSAnZm9sZGVyJyAmJiBjdHguZm9sZGVySUQpIHJldHVybiBWLmFwaS5mb2xkZXJJbWFnZXMoY3R4LmZvbGRlcklELCBwYWdlLCBQRVIpOwogICAgcmV0dXJuIFYuYXBpLmxpYnJhcnkocGFnZSwgUEVSKTsKICB9CgogIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhZ2UocmVzcCkgewogICAgaWYgKCFyZXNwKSByZXR1cm4geyBpdGVtczogW10sIHRvdGFsOiBudWxsIH07CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwKSkgcmV0dXJuIHsgaXRlbXM6IHJlc3AsIHRvdGFsOiByZXNwLmxlbmd0aCB9OwogICAgdmFyIGl0ZW1zID0gQXJyYXkuaXNBcnJheShyZXNwLml0ZW1zKSA/IHJlc3AuaXRlbXMgOiBbXTsKICAgIHZhciB0b3RhbCA9IHJlc3AubWV0YWRhdGEgJiYgdHlwZW9mIHJlc3AubWV0YWRhdGEudG90YWwgPT09ICdudW1iZXInID8gcmVzcC5tZXRhZGF0YS50b3RhbCA6IG51bGw7CiAgICByZXR1cm4geyBpdGVtczogaXRlbXMsIHRvdGFsOiB0b3RhbCB9OwogIH0KCiAgZnVuY3Rpb24gbWVyZ2VVbmlxdWUoaW50bywgaW5jb21pbmcpIHsKICAgIHZhciBzZWVuID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGludG8ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGVrID0gaW1nS2V5KGludG9baV0pOwogICAgICBpZiAoZWspIHNlZW5bZWtdID0gdHJ1ZTsKICAgIH0KICAgIGZvciAodmFyIGogPSAwOyBqIDwgaW5jb21pbmcubGVuZ3RoOyBqKyspIHsKICAgICAgdmFyIGl0ZW0gPSBpbmNvbWluZ1tqXTsKICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgY29udGludWU7CiAgICAgIHZhciBrID0gaW1nS2V5KGl0ZW0pOwogICAgICBpZiAoayAmJiBzZWVuW2tdKSBjb250aW51ZTsKICAgICAgaWYgKGspIHNlZW5ba10gPSB0cnVlOwogICAgICBpbnRvLnB1c2goaXRlbSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBsb2FkTmV4dChyZXNldCkgewogICAgaWYgKCFjdHgpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgIGlmIChjdHgubG9hZGluZykgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgaWYgKCFyZXNldCAmJiBjdHguZG9uZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgY3R4LmxvYWRpbmcgPSB0cnVlOwogICAgY3R4LmVycm9yZWQgPSBmYWxzZTsKICAgIHZhciBzdGFydEN0eCA9IGN0eDsKCiAgICB2YXIgbmV4dFBhZ2UgPSByZXNldCA/IDEgOiBjdHgucGFnZSArIDE7CiAgICB2YXIgaGFkU2VlZCA9IHJlc2V0ICYmIGN0eC5pdGVtcy5sZW5ndGggPiAwOwogICAgaWYgKHJlc2V0KSB7CiAgICAgIGlmICghaGFkU2VlZCkgY3R4Lml0ZW1zID0gW107CiAgICAgIGN0eC5wYWdlID0gMDsKICAgICAgY3R4LnRvdGFsID0gbnVsbDsKICAgICAgY3R4LmRvbmUgPSBmYWxzZTsKICAgICAgY3R4LmZldGNoZWQgPSBmYWxzZTsKICAgIH0KCiAgICBpZiAocmVzZXQgJiYgIWN0eC5pdGVtcy5sZW5ndGgpIHNob3dTa2VsZXRvbnMoKTsKICAgIHJlbmRlclN0YXR1cygpOwoKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKQogICAgICAudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkubGlicmFyeSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVycm9yKCdBUEkgdW5hdmFpbGFibGUnKTsKICAgICAgICByZXR1cm4gYWN0aXZlRmV0Y2gobmV4dFBhZ2UpOwogICAgICB9KQogICAgICAudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgIGlmICghY3R4IHx8IGN0eCAhPT0gc3RhcnRDdHgpIHJldHVybjsKICAgICAgICB2YXIgbm9ybSA9IG5vcm1hbGl6ZVBhZ2UocmVzcCk7CiAgICAgICAgaWYgKGhhZFNlZWQpIGN0eC5pdGVtcyA9IG5vcm0uaXRlbXMuc2xpY2UoKTsKICAgICAgICBlbHNlIG1lcmdlVW5pcXVlKGN0eC5pdGVtcywgbm9ybS5pdGVtcyk7CiAgICAgICAgY3R4LnBhZ2UgPSBuZXh0UGFnZTsKICAgICAgICBpZiAobm9ybS50b3RhbCAhPSBudWxsKSBjdHgudG90YWwgPSBub3JtLnRvdGFsOwoKICAgICAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2Zhdm9yaXRlcycpIGN0eC5kb25lID0gdHJ1ZTsKICAgICAgICBlbHNlIGlmIChub3JtLml0ZW1zLmxlbmd0aCA8IFBFUikgY3R4LmRvbmUgPSB0cnVlOwogICAgICAgIGVsc2UgaWYgKGN0eC50b3RhbCAhPSBudWxsICYmIGN0eC5pdGVtcy5sZW5ndGggPj0gY3R4LnRvdGFsKSBjdHguZG9uZSA9IHRydWU7CgogICAgICAgIGN0eC5sb2FkaW5nID0gZmFsc2U7CiAgICAgICAgY3R4LmVycm9yZWQgPSBmYWxzZTsKICAgICAgICBjdHguZmV0Y2hlZCA9IHRydWU7CiAgICAgICAgaWYgKGN0eC5zb3VyY2UgPT09ICdsaWJyYXJ5JyAmJiBWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLnNldCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgY3R4Ll9zZWxmV3JpdGUgPSB0cnVlOwogICAgICAgICAgdHJ5IHsgVi5zdG9yZS5zZXQoJ2xpYnJhcnknLCBjdHguaXRlbXMuc2xpY2UoKSk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICBjdHguX3NlbGZXcml0ZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgcmVuZGVyR3JpZCgpOwogICAgICAgICAgcmVuZGVyU3RhdHVzKCk7CiAgICAgICAgICBlbnN1cmVGaWxsKCk7CiAgICAgICAgfSBjYXRjaCAocmVuZGVyRXJyKSB7CiAgICAgICAgICBpZiAod2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5lcnJvcikgY29uc29sZS5lcnJvcignW2xpYnJhcnldIHJlbmRlciBmYWlsZWQnLCByZW5kZXJFcnIpOwogICAgICAgIH0KICAgICAgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBpZiAoIWN0eCB8fCBjdHggIT09IHN0YXJ0Q3R4KSByZXR1cm47CiAgICAgICAgY3R4LmxvYWRpbmcgPSBmYWxzZTsKICAgICAgICBjdHguZXJyb3JlZCA9IHRydWU7CiAgICAgICAgdHJ5IHsgcmVuZGVyR3JpZCgpOyB9IGNhdGNoIChlKSB7fQogICAgICAgIHJlbmRlclN0YXR1cyhlcnIpOwogICAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGVuc3VyZUZpbGwoKSB7CiAgICBpZiAoY3R4LmRvbmUgfHwgY3R4LmxvYWRpbmcgfHwgY3R4LmVycm9yZWQpIHJldHVybjsKICAgIGlmICghY3R4LmdyaWRFbCkgcmV0dXJuOwogICAgaWYgKGN0eC5xdWVyeSB8fCBjdHguc291cmNlID09PSAnZmF2b3JpdGVzJykgcmV0dXJuOwogICAgdmFyIGRvY0ggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IHdpbmRvdy5pbm5lckhlaWdodCB8fCAwOwogICAgdmFyIGdyaWRCb3R0b20gPSBjdHguZ3JpZEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTsKICAgIGlmIChncmlkQm90dG9tIDwgZG9jSCArIDIwMCkgbG9hZE5leHQoZmFsc2UpOwogIH0KCiAgZnVuY3Rpb24gdmlzaWJsZUl0ZW1zKCkgewogICAgdmFyIGxpc3QgPSBjdHguaXRlbXMuc2xpY2UoKTsKCiAgICBpZiAoY3R4LmluZHVzdHJ5KSB7CiAgICAgIHZhciBrZXkgPSBjdHguaW5kdXN0cnk7CiAgICAgIGxpc3QgPSBsaXN0LmZpbHRlcihmdW5jdGlvbiAoaW1nKSB7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGltZy50YWdzKSB8fCAhaW1nLnRhZ3MubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbWcudGFncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKFN0cmluZyhpbWcudGFnc1tpXSkudG9Mb3dlckNhc2UoKSA9PT0ga2V5LnRvTG93ZXJDYXNlKCkpIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0pOwogICAgfQoKICAgIGlmIChjdHgucXVlcnkpIHsKICAgICAgdmFyIHEgPSBjdHgucXVlcnk7CiAgICAgIHZhciBzY29yZWQgPSBbXTsKICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCBsaXN0Lmxlbmd0aDsgcysrKSB7CiAgICAgICAgdmFyIHNjID0gZnV6enlTY29yZShxLCBzZWFyY2hIYXlzdGFjayhsaXN0W3NdKSk7CiAgICAgICAgaWYgKHNjID4gMCkgc2NvcmVkLnB1c2goeyBpbWc6IGxpc3Rbc10sIHNjOiBzYyB9KTsKICAgICAgfQogICAgICBzY29yZWQuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYi5zYyAtIGEuc2M7IH0pOwogICAgICByZXR1cm4gc2NvcmVkLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5pbWc7IH0pOwogICAgfQoKICAgIHZhciBkZWYgPSBudWxsOwogICAgZm9yICh2YXIgayA9IDA7IGsgPCBTT1JUUy5sZW5ndGg7IGsrKykgaWYgKFNPUlRTW2tdLmtleSA9PT0gY3R4LnNvcnQpIGRlZiA9IFNPUlRTW2tdOwogICAgaWYgKGRlZikgbGlzdC5zb3J0KGRlZi5jbXApOwogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBmdW5jdGlvbiBhdmFpbGFibGVUYWdzKCkgewogICAgdmFyIHNldCA9IHt9OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdHguaXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHQgPSBjdHguaXRlbXNbaV0udGFnczsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpIGZvciAodmFyIGogPSAwOyBqIDwgdC5sZW5ndGg7IGorKykgaWYgKHRbal0pIHNldFtTdHJpbmcodFtqXSkudG9Mb3dlckNhc2UoKV0gPSB0cnVlOwogICAgfQogICAgcmV0dXJuIHNldDsKICB9CgogIGZ1bmN0aW9uIGxvYWRGb2xkZXJzKCkgewogICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkuZm9sZGVycyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7CiAgICByZXR1cm4gVi5hcGkuZm9sZGVycygpLnRoZW4oZnVuY3Rpb24gKGxpc3QpIHsKICAgICAgY3R4LmZvbGRlcnMgPSBBcnJheS5pc0FycmF5KGxpc3QpID8gbGlzdCA6IFtdOwogICAgICBjdHguZm9sZGVyc0xvYWRlZCA9IHRydWU7CiAgICAgIHJldHVybiBjdHguZm9sZGVyczsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgY3R4LmZvbGRlcnNMb2FkZWQgPSB0cnVlOwogICAgICByZXR1cm4gY3R4LmZvbGRlcnM7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIG9wZW5Gb2xkZXJzTWFuYWdlcigpIHsKICAgIHZhciB3cmFwID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vZGFsLWJvZHknIH0pOwogICAgd3JhcC5hcHBlbmRDaGlsZChlbCgnaDMnLCB7IGNsYXNzOiAndi1tb2RhbC10aXRsZScsIHRleHQ6ICdGb2xkZXJzJyB9KSk7CgogICAgdmFyIGxpc3RFbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1tZCcgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKGxpc3RFbCk7CgogICAgZnVuY3Rpb24gcmVwYWludCgpIHsKICAgICAgbGlzdEVsLmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWN0eC5mb2xkZXJzLmxlbmd0aCkgewogICAgICAgIGxpc3RFbC5hcHBlbmRDaGlsZChlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19zdWInLCB0ZXh0OiAnTm8gZm9sZGVycyB5ZXQuIENyZWF0ZSBvbmUgYmVsb3cuJyB9KSk7CiAgICAgIH0KICAgICAgY3R4LmZvbGRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZikgewogICAgICAgIHZhciByb3cgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytcm93IHYtcm93LS1iZXR3ZWVuJyB9LAogICAgICAgICAgZWwoJ2J1dHRvbicsIHsKICAgICAgICAgICAgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgICAgIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgbS5jbG9zZSgpOyBvcGVuRm9sZGVyKGYuaWQsIGYubmFtZSk7IH0KICAgICAgICAgIH0sIGljb24oJ2ZvbGRlcicpLCBlbCgnc3BhbicsIHsgdGV4dDogZi5uYW1lIH0pLCBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHNfX251bScsIHRleHQ6ICcoJyArIChmLmltYWdlQ291bnQgfHwgMCkgKyAnKScgfSkpLAogICAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXJvdycgfSwKICAgICAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIHRpdGxlOiAnUmVuYW1lJywgJ2FyaWEtbGFiZWwnOiAnUmVuYW1lIGZvbGRlcicsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgcmVuYW1lRm9sZGVyRmxvdyhmLCByZXBhaW50KTsgfSB9LCBpY29uKCdlZGl0JykpLAogICAgICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1kYW5nZXIgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIHRpdGxlOiAnRGVsZXRlJywgJ2FyaWEtbGFiZWwnOiAnRGVsZXRlIGZvbGRlcicsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgZGVsZXRlRm9sZGVyRmxvdyhmLCByZXBhaW50KTsgfSB9LCBpY29uKCd0cmFzaCcpKQogICAgICAgICAgKQogICAgICAgICk7CiAgICAgICAgbGlzdEVsLmFwcGVuZENoaWxkKHJvdyk7CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBuYW1lSW5wdXQgPSBlbCgnaW5wdXQnLCB7IGNsYXNzOiAndi1maWVsZCcsIHR5cGU6ICd0ZXh0JywgcGxhY2Vob2xkZXI6ICdOZXcgZm9sZGVyIG5hbWUnLCBtYXhsZW5ndGg6ICc2MCcgfSk7CiAgICB2YXIgY3JlYXRlQnRuID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJyB9LCBpY29uKCdwbHVzJyksICdDcmVhdGUnKTsKICAgIGNyZWF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG4gPSAobmFtZUlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIGlmICghbikgeyBuYW1lSW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIGNyZWF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICAgIFYuYXBpLmNyZWF0ZUZvbGRlcihuKS50aGVuKGZ1bmN0aW9uIChmKSB7CiAgICAgICAgaWYgKGYpIGN0eC5mb2xkZXJzLnB1c2goZik7CiAgICAgICAgbmFtZUlucHV0LnZhbHVlID0gJyc7CiAgICAgICAgY3JlYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgcmVwYWludCgpOwogICAgICAgIHRvYXN0KCdGb2xkZXIgY3JlYXRlZCcsICdzdWNjZXNzJyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgY3JlYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7IHRvYXN0KCdDb3VsZCBub3QgY3JlYXRlIGZvbGRlcicsICdlcnJvcicpOyB9KTsKICAgIH0pOwogICAgbmFtZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkgeyBpZiAoZS5rZXkgPT09ICdFbnRlcicpIGNyZWF0ZUJ0bi5jbGljaygpOyB9KTsKCiAgICB3cmFwLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1yb3cgdi1tb2RhbC1hY3Rpb25zJyB9LCBuYW1lSW5wdXQsIGNyZWF0ZUJ0bikpOwoKICAgIHZhciBtID0gbW9kYWwod3JhcCwge30pOwoKICAgIGlmICghY3R4LmZvbGRlcnNMb2FkZWQpIHsKICAgICAgbGlzdEVsLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtZW1wdHlfX3N1YicsIHRleHQ6ICdMb2FkaW5n4oCmJyB9KSk7CiAgICAgIGxvYWRGb2xkZXJzKCkudGhlbihyZXBhaW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlcGFpbnQoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbmFtZUZvbGRlckZsb3coZm9sZGVyLCBhZnRlcikgewogICAgdmFyIGlucHV0ID0gZWwoJ2lucHV0JywgeyBjbGFzczogJ3YtZmllbGQnLCB0eXBlOiAndGV4dCcsIHZhbHVlOiBmb2xkZXIubmFtZSwgbWF4bGVuZ3RoOiAnNjAnIH0pOwogICAgdmFyIHNhdmUgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1wcmltYXJ5IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nLCB0ZXh0OiAnU2F2ZScgfSk7CiAgICB2YXIgY2FuY2VsID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIHRleHQ6ICdDYW5jZWwnIH0pOwogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtbW9kYWwtYm9keScgfSwKICAgICAgZWwoJ2gzJywgeyBjbGFzczogJ3YtbW9kYWwtdGl0bGUnLCB0ZXh0OiAnUmVuYW1lIEZvbGRlcicgfSksCiAgICAgIGlucHV0LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytcm93IHYtbW9kYWwtYWN0aW9ucycgfSwgY2FuY2VsLCBzYXZlKSk7CiAgICB2YXIgbSA9IG1vZGFsKHdyYXAsIHt9KTsKICAgIGNhbmNlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgbS5jbG9zZSgpOyB9KTsKICAgIHNhdmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBuID0gKGlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIGlmICghbikgeyBpbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgc2F2ZS5kaXNhYmxlZCA9IHRydWU7CiAgICAgIFYuYXBpLnJlbmFtZUZvbGRlcihmb2xkZXIuaWQsIG4pLnRoZW4oZnVuY3Rpb24gKGYpIHsKICAgICAgICBmb2xkZXIubmFtZSA9IChmICYmIGYubmFtZSkgfHwgbjsKICAgICAgICBtLmNsb3NlKCk7CiAgICAgICAgaWYgKGFmdGVyKSBhZnRlcigpOwogICAgICAgIHRvYXN0KCdGb2xkZXIgcmVuYW1lZCcsICdzdWNjZXNzJyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgc2F2ZS5kaXNhYmxlZCA9IGZhbHNlOyB0b2FzdCgnUmVuYW1lIGZhaWxlZCcsICdlcnJvcicpOyB9KTsKICAgIH0pOwogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGlucHV0LmZvY3VzKCk7IGlucHV0LnNlbGVjdCgpOyB9LCAzMCk7CiAgfQoKICBmdW5jdGlvbiBkZWxldGVGb2xkZXJGbG93KGZvbGRlciwgYWZ0ZXIpIHsKICAgIGNvbmZpcm1EaWFsb2coJ0RlbGV0ZSBmb2xkZXIgIicgKyBmb2xkZXIubmFtZSArICciPyBJbWFnZXMgaW5zaWRlIGFyZSBrZXB0IChqdXN0IHVuLWZpbGVkKS4nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIFYuYXBpLmRlbGV0ZUZvbGRlcihmb2xkZXIuaWQpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIGN0eC5mb2xkZXJzID0gY3R4LmZvbGRlcnMuZmlsdGVyKGZ1bmN0aW9uIChmKSB7IHJldHVybiBmLmlkICE9PSBmb2xkZXIuaWQ7IH0pOwogICAgICAgIGlmIChjdHguc291cmNlID09PSAnZm9sZGVyJyAmJiBjdHguZm9sZGVySUQgPT09IGZvbGRlci5pZCkgb3BlbkxpYnJhcnkoKTsKICAgICAgICBpZiAoYWZ0ZXIpIGFmdGVyKCk7CiAgICAgICAgdG9hc3QoJ0ZvbGRlciBkZWxldGVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgeyB0b2FzdCgnRGVsZXRlIGZhaWxlZCcsICdlcnJvcicpOyB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gYXNzaWduVG9Gb2xkZXJGbG93KGltYWdlSURzLCBvbkRvbmUpIHsKICAgIHZhciB3cmFwID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vZGFsLWJvZHknIH0pOwogICAgd3JhcC5hcHBlbmRDaGlsZChlbCgnaDMnLCB7IGNsYXNzOiAndi1tb2RhbC10aXRsZScsIHRleHQ6ICdBZGQgJyArIGltYWdlSURzLmxlbmd0aCArICcgdG8gRm9sZGVyJyB9KSk7CiAgICB2YXIgbGlzdEVsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLW1kJyB9KTsKICAgIHdyYXAuYXBwZW5kQ2hpbGQobGlzdEVsKTsKCiAgICBmdW5jdGlvbiBwYWludCgpIHsKICAgICAgbGlzdEVsLmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWN0eC5mb2xkZXJzLmxlbmd0aCkgewogICAgICAgIGxpc3RFbC5hcHBlbmRDaGlsZChlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19zdWInLCB0ZXh0OiAnTm8gZm9sZGVycyB5ZXQg4oCUIGNyZWF0ZSBvbmUgYmVsb3cuJyB9KSk7CiAgICAgIH0KICAgICAgY3R4LmZvbGRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZikgewogICAgICAgIHZhciBiID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicgfSwKICAgICAgICAgIGljb24oJ2ZvbGRlcicpLCBlbCgnc3BhbicsIHsgdGV4dDogZi5uYW1lIH0pLCBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHNfX251bScsIHRleHQ6ICcoJyArIChmLmltYWdlQ291bnQgfHwgMCkgKyAnKScgfSkpOwogICAgICAgIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBiLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgIFYuYXBpLmFzc2lnbkZvbGRlcihmLmlkLCBpbWFnZUlEcykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGYuaW1hZ2VDb3VudCA9IChmLmltYWdlQ291bnQgfHwgMCkgKyBpbWFnZUlEcy5sZW5ndGg7CiAgICAgICAgICAgIG0uY2xvc2UoKTsKICAgICAgICAgICAgdG9hc3QoJ0FkZGVkIHRvICInICsgZi5uYW1lICsgJyInLCAnc3VjY2VzcycpOwogICAgICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoKTsKICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgYi5kaXNhYmxlZCA9IGZhbHNlOyB0b2FzdCgnQ291bGQgbm90IGFkZCB0byBmb2xkZXInLCAnZXJyb3InKTsgfSk7CiAgICAgICAgfSk7CiAgICAgICAgbGlzdEVsLmFwcGVuZENoaWxkKGIpOwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgbmFtZUlucHV0ID0gZWwoJ2lucHV0JywgeyBjbGFzczogJ3YtZmllbGQnLCB0eXBlOiAndGV4dCcsIHBsYWNlaG9sZGVyOiAnTmV3IGZvbGRlciBuYW1lJywgbWF4bGVuZ3RoOiAnNjAnIH0pOwogICAgdmFyIGNyZWF0ZUJ0biA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nIH0sIGljb24oJ3BsdXMnKSwgJ05ldycpOwogICAgY3JlYXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICB2YXIgbiA9IChuYW1lSW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTsKICAgICAgaWYgKCFuKSB7IG5hbWVJbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgY3JlYXRlQnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgVi5hcGkuY3JlYXRlRm9sZGVyKG4pLnRoZW4oZnVuY3Rpb24gKGYpIHsKICAgICAgICBpZiAoZikgY3R4LmZvbGRlcnMucHVzaChmKTsKICAgICAgICBuYW1lSW5wdXQudmFsdWUgPSAnJzsKICAgICAgICBjcmVhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICBwYWludCgpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IGNyZWF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlOyB0b2FzdCgnQ291bGQgbm90IGNyZWF0ZSBmb2xkZXInLCAnZXJyb3InKTsgfSk7CiAgICB9KTsKICAgIG5hbWVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHsgaWYgKGUua2V5ID09PSAnRW50ZXInKSBjcmVhdGVCdG4uY2xpY2soKTsgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1yb3cgdi1tb2RhbC1hY3Rpb25zJyB9LCBuYW1lSW5wdXQsIGNyZWF0ZUJ0bikpOwoKICAgIHZhciBtID0gbW9kYWwod3JhcCwge30pOwogICAgaWYgKCFjdHguZm9sZGVyc0xvYWRlZCkgewogICAgICBsaXN0RWwuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fc3ViJywgdGV4dDogJ0xvYWRpbmfigKYnIH0pKTsKICAgICAgbG9hZEZvbGRlcnMoKS50aGVuKHBhaW50KTsKICAgIH0gZWxzZSBwYWludCgpOwogIH0KCiAgZnVuY3Rpb24gdG9nZ2xlRmF2b3JpdGUoaW1nLCBvbkNoYW5nZSkgewogICAgdmFyIGlkID0gaW1nSWQoaW1nKTsKICAgIGlmICghaWQpIHsgdG9hc3QoJ1RoaXMgaW1hZ2UgaGFzIG5vIHNlcnZlciBpZCB5ZXQnLCAnZXJyb3InKTsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOyB9CiAgICB2YXIgbmV4dCA9ICFpbWcuZmF2b3JpdGVkOwogICAgaW1nLmZhdm9yaXRlZCA9IG5leHQ7CiAgICBpZiAob25DaGFuZ2UpIG9uQ2hhbmdlKCk7CiAgICByZXR1cm4gVi5hcGkuc2V0RmF2b3JpdGUoaWQsIG5leHQpLnRoZW4oZnVuY3Rpb24gKHVwZGF0ZWQpIHsKICAgICAgaWYgKHVwZGF0ZWQgJiYgdHlwZW9mIHVwZGF0ZWQuZmF2b3JpdGVkID09PSAnYm9vbGVhbicpIGltZy5mYXZvcml0ZWQgPSB1cGRhdGVkLmZhdm9yaXRlZDsKICAgICAgdG9hc3QobmV4dCA/ICdBZGRlZCB0byBmYXZvcml0ZXMnIDogJ1JlbW92ZWQgZnJvbSBmYXZvcml0ZXMnLCAnc3VjY2VzcycpOwogICAgICBpZiAob25DaGFuZ2UpIG9uQ2hhbmdlKCk7CiAgICAgIGlmIChjdHguc291cmNlID09PSAnZmF2b3JpdGVzJyAmJiAhaW1nLmZhdm9yaXRlZCkgewogICAgICAgIGN0eC5pdGVtcyA9IGN0eC5pdGVtcy5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGltZ0tleSh4KSAhPT0gaW1nS2V5KGltZyk7IH0pOwogICAgICAgIHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgaW1nLmZhdm9yaXRlZCA9ICFuZXh0OwogICAgICBpZiAob25DaGFuZ2UpIG9uQ2hhbmdlKCk7CiAgICAgIHRvYXN0KCdDb3VsZCBub3QgdXBkYXRlIGZhdm9yaXRlJywgJ2Vycm9yJyk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGRlbGV0ZUltYWdlRmxvdyhpbWcpIHsKICAgIHZhciBpZCA9IGltZ0lkKGltZyk7CiAgICBpZiAoIWlkKSB7IHRvYXN0KCdDYW5ub3QgZGVsZXRlIOKAlCBtaXNzaW5nIGlkJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgY29uZmlybURpYWxvZygnRGVsZXRlIHRoaXMgY3JlYXRpb24/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIFYuYXBpLmRlbGV0ZUltYWdlKGlkKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICBjdHguaXRlbXMgPSBjdHguaXRlbXMuZmlsdGVyKGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWdLZXkoeCkgIT09IGltZ0tleShpbWcpOyB9KTsKICAgICAgICBkZWxldGUgY3R4LnNlbGVjdGVkW2ltZ0tleShpbWcpXTsKICAgICAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2xpYnJhcnknICYmIFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuc2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBjdHguX3NlbGZXcml0ZSA9IHRydWU7CiAgICAgICAgICB0cnkgeyBWLnN0b3JlLnNldCgnbGlicmFyeScsIGN0eC5pdGVtcy5zbGljZSgpKTsgfSBjYXRjaCAoZSkge30KICAgICAgICAgIGN0eC5fc2VsZldyaXRlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7CiAgICAgICAgdG9hc3QoJ0RlbGV0ZWQnLCAnc3VjY2VzcycpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHRvYXN0KCdEZWxldGUgZmFpbGVkJywgJ2Vycm9yJyk7IH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBjb3B5UHJvbXB0KGltZykgewogICAgdmFyIHRleHQgPSBpbWcucHJvbXB0IHx8ICcnOwogICAgaWYgKCF0ZXh0KSB7IHRvYXN0KCdObyBwcm9tcHQgdG8gY29weScsICdpbmZvJyk7IHJldHVybjsgfQogICAgdmFyIGRvbmUgPSBmdW5jdGlvbiAoKSB7IHRvYXN0KCdQcm9tcHQgY29waWVkJywgJ3N1Y2Nlc3MnKTsgfTsKICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7CiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oZG9uZSwgZnVuY3Rpb24gKCkgeyBmYWxsYmFja0NvcHkodGV4dCwgZG9uZSk7IH0pOwogICAgfSBlbHNlIGZhbGxiYWNrQ29weSh0ZXh0LCBkb25lKTsKICB9CgogIGZ1bmN0aW9uIGZhbGxiYWNrQ29weSh0ZXh0LCBkb25lKSB7CiAgICB2YXIgdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogICAgdGEudmFsdWUgPSB0ZXh0OyB0YS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7IHRhLnN0eWxlLm9wYWNpdHkgPSAnMCc7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhKTsgdGEuZm9jdXMoKTsgdGEuc2VsZWN0KCk7CiAgICB0cnkgeyBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOyBkb25lKCk7IH0gY2F0Y2ggKGUpIHsgdG9hc3QoJ0NvcHkgZmFpbGVkJywgJ2Vycm9yJyk7IH0KICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGEpOwogIH0KCiAgZnVuY3Rpb24gZG93bmxvYWRJbWFnZShpbWcpIHsKICAgIHZhciB1cmwgPSBpbWcucmVtb3RlSW1hZ2VVUkwgfHwgaW1nLnZpZGVvVVJMIHx8IGltZy5yZW1vdGVPcmlnaW5hbEltYWdlVVJMOwogICAgaWYgKCF1cmwpIHsgdG9hc3QoJ05vdGhpbmcgdG8gZG93bmxvYWQnLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICB2YXIgZXh0ID0gaW1nLnZpZGVvVVJMID8gJ21wNCcgOiAnanBnJzsKICAgIGRvd25sb2FkKHVybCwgJ3ZhbXAtJyArIChpbWdLZXkoaW1nKSB8fCAnaW1hZ2UnKS5zbGljZSgwLCA4KSArICcuJyArIGV4dCk7CiAgfQoKICBmdW5jdGlvbiBpc1ZpZGVvKGltZykgeyByZXR1cm4gISEoaW1nICYmIGltZy52aWRlb1VSTCk7IH0KCiAgZnVuY3Rpb24gY29weVNoYXJlVGV4dChzdHIpIHsKICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7CiAgICAgIHJldHVybiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzdHIpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH0pOwogICAgfQogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsKICAgICAgICB0YS52YWx1ZSA9IHN0cjsgdGEuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnOyB0YS5zdHlsZS5vcGFjaXR5ID0gJzAnOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOyB0YS5mb2N1cygpOyB0YS5zZWxlY3QoKTsKICAgICAgICB2YXIgb2sgPSBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOwogICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGEpOwogICAgICAgIHJlc29sdmUob2spOwogICAgICB9IGNhdGNoIChlKSB7IHJlc29sdmUoZmFsc2UpOyB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHNoYXJlVVJMRm9yKGltZykgewogICAgdmFyIGlkID0gaW1nSWQoaW1nKTsKICAgIGlmICghaWQpIHJldHVybiBudWxsOwogICAgdmFyIGJhc2UgPSAoVi5jb25maWcgJiYgVi5jb25maWcuQVBJKSA/IFYuY29uZmlnLkFQSSA6ICdodHRwczovL2FwaS52b29zZXkuY29tJzsKICAgIHJldHVybiBiYXNlLnJlcGxhY2UoL1wvKyQvLCAnJykgKyAnL2dlbmVyYXRlZC9yZW5kZXIvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCk7CiAgfQoKICBmdW5jdGlvbiBzaGFyZUltYWdlKGltZykgewogICAgdmFyIHVybCA9IHNoYXJlVVJMRm9yKGltZyk7CiAgICB2YXIgdGV4dCA9IChpbWcucHJvbXB0ID8gaW1nLnByb21wdCArICdcblxuJyA6ICcnKSArICdNYWRlIHdpdGggVmFtcCBieSBWb29zZXkuJzsKICAgIGlmIChuYXZpZ2F0b3Iuc2hhcmUgJiYgdXJsKSB7CiAgICAgIG5hdmlnYXRvci5zaGFyZSh7IHRpdGxlOiAnVmFtcCcsIHRleHQ6IHRleHQsIHVybDogdXJsIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHJldHVybjsKICAgICAgICBjb3B5U2hhcmVMaW5rKHVybCk7CiAgICAgIH0pOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodXJsKSB7IGNvcHlTaGFyZUxpbmsodXJsKTsgcmV0dXJuOyB9CiAgICBpZiAoaW1nLnJlbW90ZUltYWdlVVJMIHx8IGltZy52aWRlb1VSTCkgeyBkb3dubG9hZEltYWdlKGltZyk7IHJldHVybjsgfQogICAgdG9hc3QoJ05vdGhpbmcgdG8gc2hhcmUnLCAnZXJyb3InKTsKICB9CgogIGZ1bmN0aW9uIGNvcHlTaGFyZUxpbmsodXJsKSB7CiAgICBjb3B5U2hhcmVUZXh0KHVybCkudGhlbihmdW5jdGlvbiAob2spIHsKICAgICAgdG9hc3Qob2sgPyAnU2hhcmUgbGluayBjb3BpZWQnIDogJ0NvcHkgdGhpcyBsaW5rOiAnICsgdXJsLCBvayA/ICdzdWNjZXNzJyA6ICdpbmZvJyk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHJlbWl4SW1hZ2UoaW1nKSB7CiAgICB2YXIgcGFyYW1zID0gW107CiAgICBpZiAoaW1nLnByb21wdCkgcGFyYW1zLnB1c2goJ3Byb21wdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGltZy5wcm9tcHQpKTsKICAgIGlmIChpbWcubW9kZWwpIHBhcmFtcy5wdXNoKCdtb2RlbD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGltZy5tb2RlbCkpOwogICAgdmFyIHNyYyA9IGltZy5yZW1vdGVJbWFnZVVSTCB8fCBpbWcucmVtb3RlT3JpZ2luYWxJbWFnZVVSTDsKICAgIGlmIChzcmMpIHBhcmFtcy5wdXNoKCdpbWFnZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHNyYykpOwogICAgY2FwdHVyZVNjcm9sbCgpOwogICAgZ28oJyMvY3JlYXRlJyArIChwYXJhbXMubGVuZ3RoID8gJz8nICsgcGFyYW1zLmpvaW4oJyYnKSA6ICcnKSk7CiAgfQoKICBmdW5jdGlvbiBjbG9zZU1lbnUoKSB7CiAgICBpZiAoY3R4ICYmIGN0eC5tZW51RWwgJiYgY3R4Lm1lbnVFbC5wYXJlbnROb2RlKSBjdHgubWVudUVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY3R4Lm1lbnVFbCk7CiAgICBpZiAoY3R4KSBjdHgubWVudUVsID0gbnVsbDsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25Eb2NDbGlja0Nsb3NlTWVudSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25NZW51S2V5LCB0cnVlKTsKICB9CgogIGZ1bmN0aW9uIG9uRG9jQ2xpY2tDbG9zZU1lbnUoZSkgewogICAgaWYgKGN0eCAmJiBjdHgubWVudUVsICYmICFjdHgubWVudUVsLmNvbnRhaW5zKGUudGFyZ2V0KSkgY2xvc2VNZW51KCk7CiAgfQogIGZ1bmN0aW9uIG9uTWVudUtleShlKSB7IGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNsb3NlTWVudSgpOyB9CgogIGZ1bmN0aW9uIG9wZW5Db250ZXh0TWVudShpbWcsIHgsIHksIG9uQ2hhbmdlKSB7CiAgICBjbG9zZU1lbnUoKTsKICAgIHZhciBtZW51ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1lbnUgZ2xhc3MtY2FyZCcsIHJvbGU6ICdtZW51JyB9KTsKICAgIFMobWVudSwgJ21pbi13aWR0aDoyMDBweDtwYWRkaW5nOjZweDtib3JkZXItcmFkaXVzOnZhcigtLXYtcmFkaXVzLXNtLDE1cHgpO2JhY2tncm91bmQ6JyArIEdMQVNTX0JHICsgJztib3JkZXI6MXB4IHNvbGlkICcgKyBMSU5FICsgJztib3gtc2hhZG93OjAgMTZweCA0OHB4IHJnYmEoMCwwLDAsLjQ1KTtvdmVyZmxvdzpoaWRkZW4nKTsKCiAgICBmdW5jdGlvbiBpdGVtKGxhYmVsLCBpYywgZm4sIGRhbmdlcikgewogICAgICB2YXIgYiA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1tZW51X19pdGVtJyArIChkYW5nZXIgPyAnIHYtbWVudV9faXRlbS0tZGFuZ2VyJyA6ICcnKSwgdHlwZTogJ2J1dHRvbicsIHJvbGU6ICdtZW51aXRlbScgfSwKICAgICAgICBpYyA/IGljb24oaWMpIDogbnVsbCwgZWwoJ3NwYW4nLCB7IHRleHQ6IGxhYmVsIH0pKTsKICAgICAgUyhiLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDt3aWR0aDoxMDAlO3BhZGRpbmc6MTBweCAxMnB4O2JvcmRlcjowO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6JyArIChkYW5nZXIgPyAndmFyKC0tY29sb3ItZXJyb3IsICNGNzMzNjMpJyA6ICd2YXIoLS12LWluaywgI2Y1ZjVmNyknKSArICc7Zm9udDppbmhlcml0O2ZvbnQtc2l6ZToxNHB4O3RleHQtYWxpZ246bGVmdDtib3JkZXItcmFkaXVzOjlweDtjdXJzb3I6cG9pbnRlcicpOwogICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBmdW5jdGlvbiAoKSB7IGIuc3R5bGUuYmFja2dyb3VuZCA9IGRhbmdlciA/ICdyZ2JhKDI0Nyw1MSw5OSwuMTQpJyA6ICdyZ2JhKDI1NSwyNTUsMjU1LC4wNyknOyB9KTsKICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKCkgeyBiLnN0eWxlLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnOyB9KTsKICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGZ1bmN0aW9uICgpIHsgYi5zdHlsZS5iYWNrZ3JvdW5kID0gZGFuZ2VyID8gJ3JnYmEoMjQ3LDUxLDk5LC4xNCknIDogJ3JnYmEoMjU1LDI1NSwyNTUsLjA3KSc7IH0pOwogICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbiAoKSB7IGIuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7IH0pOwogICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBjbG9zZU1lbnUoKTsgZm4oKTsgfSk7CiAgICAgIHJldHVybiBiOwogICAgfQoKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbSgnT3BlbicsICdncmlkJywgZnVuY3Rpb24gKCkgeyBvcGVuSW1hZ2UoaW1nKTsgfSkpOwogICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKCdSZW1peCcsICd2YXJpYXRpb25zJywgZnVuY3Rpb24gKCkgeyByZW1peEltYWdlKGltZyk7IH0pKTsKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbShpbWcuZmF2b3JpdGVkID8gJ1VuZmF2b3JpdGUnIDogJ0Zhdm9yaXRlJywgaW1nLmZhdm9yaXRlZCA/ICdoZWFydEZpbGwnIDogJ2hlYXJ0JywgZnVuY3Rpb24gKCkgeyB0b2dnbGVGYXZvcml0ZShpbWcsIG9uQ2hhbmdlKTsgfSkpOwogICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKCdBZGQgdG8gRm9sZGVyJywgJ2ZvbGRlcicsIGZ1bmN0aW9uICgpIHsgYXNzaWduVG9Gb2xkZXJGbG93KFtpbWdJZChpbWcpXSk7IH0pKTsKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbSgnQ29weSBQcm9tcHQnLCAnY29weScsIGZ1bmN0aW9uICgpIHsgY29weVByb21wdChpbWcpOyB9KSk7CiAgICBtZW51LmFwcGVuZENoaWxkKGl0ZW0oJ1NoYXJlJywgJ3NoYXJlJywgZnVuY3Rpb24gKCkgeyBzaGFyZUltYWdlKGltZyk7IH0pKTsKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbSgnRG93bmxvYWQnLCAnZG93bmxvYWQnLCBmdW5jdGlvbiAoKSB7IGRvd25sb2FkSW1hZ2UoaW1nKTsgfSkpOwogICAgbWVudS5hcHBlbmRDaGlsZChTKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tZW51X19zZXAnIH0pLCAnaGVpZ2h0OjFweDttYXJnaW46NnB4IDhweDtiYWNrZ3JvdW5kOicgKyBMSU5FKSk7CiAgICBtZW51LmFwcGVuZENoaWxkKGl0ZW0oJ0RlbGV0ZScsICd0cmFzaCcsIGZ1bmN0aW9uICgpIHsgZGVsZXRlSW1hZ2VGbG93KGltZyk7IH0sIHRydWUpKTsKCiAgICBtZW51LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJzsKICAgIG1lbnUuc3R5bGUuekluZGV4ID0gJzEyMDAnOwogICAgbWVudS5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnOwogICAgbWVudS5zdHlsZS50b3AgPSAnMCc7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lbnUpOwogICAgY3R4Lm1lbnVFbCA9IG1lbnU7CgogICAgdmFyIHJlY3QgPSBtZW51LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgdmFyIHZ3ID0gd2luZG93LmlubmVyV2lkdGgsIHZoID0gd2luZG93LmlubmVySGVpZ2h0OwogICAgdmFyIHB4ID0gTWF0aC5taW4oeCwgdncgLSByZWN0LndpZHRoIC0gOCk7CiAgICB2YXIgcHkgPSBNYXRoLm1pbih5LCB2aCAtIHJlY3QuaGVpZ2h0IC0gOCk7CiAgICBtZW51LnN0eWxlLmxlZnQgPSBNYXRoLm1heCg4LCBweCkgKyAncHgnOwogICAgbWVudS5zdHlsZS50b3AgPSBNYXRoLm1heCg4LCBweSkgKyAncHgnOwoKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uRG9jQ2xpY2tDbG9zZU1lbnUsIHRydWUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25NZW51S2V5LCB0cnVlKTsKICAgIH0sIDApOwogIH0KCiAgZnVuY3Rpb24gb3BlbkltYWdlKGltZykgewogICAgdmFyIGlkID0gaW1nSWQoaW1nKTsKICAgIGlmICghaWQpIHsgdG9hc3QoJ1RoaXMgY3JlYXRpb24gaXMgbm90IHNhdmVkIHlldCcsICdpbmZvJyk7IHJldHVybjsgfQogICAgY2FwdHVyZVNjcm9sbCgpOwogICAgZ28oJyMvaW1hZ2UvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCkpOwogIH0KCiAgZnVuY3Rpb24gY2FwdHVyZVNjcm9sbCgpIHsKICAgIGN0eC5zY3JvbGxZID0gKGN0eC5zY3JvbGxUYXJnZXQgJiYgY3R4LnNjcm9sbFRhcmdldCAhPT0gd2luZG93KQogICAgICA/IGN0eC5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wCiAgICAgIDogKHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IDApOwogICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuc2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7IFYuc3RvcmUuc2V0KCdsaWJyYXJ5U2Nyb2xsWScsIGN0eC5zY3JvbGxZKTsgfSBjYXRjaCAoZSkge30KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlc3RvcmVTY3JvbGwoKSB7CiAgICB2YXIgeSA9IGN0eC5zY3JvbGxZOwogICAgaWYgKCF5ICYmIFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuZ2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7IHkgPSBWLnN0b3JlLmdldCgnbGlicmFyeVNjcm9sbFknKSB8fCAwOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgaWYgKCF5KSByZXR1cm47CiAgICB2YXIgYXBwbHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChjdHguc2Nyb2xsVGFyZ2V0ICYmIGN0eC5zY3JvbGxUYXJnZXQgIT09IHdpbmRvdykgY3R4LnNjcm9sbFRhcmdldC5zY3JvbGxUb3AgPSB5OwogICAgICBlbHNlIHdpbmRvdy5zY3JvbGxUbygwLCB5KTsKICAgIH07CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkgeyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYXBwbHkpOyB9KTsKICB9CgogIGZ1bmN0aW9uIGVudGVyU2VsZWN0KGluaXRpYWxJbWcpIHsKICAgIGN0eC5zZWxlY3RNb2RlID0gdHJ1ZTsKICAgIGlmIChpbml0aWFsSW1nKSBjdHguc2VsZWN0ZWRbaW1nS2V5KGluaXRpYWxJbWcpXSA9IHRydWU7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICByZW5kZXJHcmlkKCk7CiAgfQogIGZ1bmN0aW9uIGV4aXRTZWxlY3QoKSB7CiAgICBjdHguc2VsZWN0TW9kZSA9IGZhbHNlOwogICAgY3R4LnNlbGVjdGVkID0ge307CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICByZW5kZXJHcmlkKCk7CiAgfQogIGZ1bmN0aW9uIHRvZ2dsZVNlbGVjdChpbWcpIHsKICAgIHZhciBrID0gaW1nS2V5KGltZyk7CiAgICBpZiAoY3R4LnNlbGVjdGVkW2tdKSBkZWxldGUgY3R4LnNlbGVjdGVkW2tdOwogICAgZWxzZSBjdHguc2VsZWN0ZWRba10gPSB0cnVlOwogICAgcmVuZGVyVG9vbGJhcigpOwogICAgcmVuZGVyU2VsZWN0aW9uU3RhdGVGb3Ioayk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGVkQ291bnQoKSB7IHJldHVybiBPYmplY3Qua2V5cyhjdHguc2VsZWN0ZWQpLmxlbmd0aDsgfQogIGZ1bmN0aW9uIHNlbGVjdGVkSW1hZ2VzKCkgewogICAgdmFyIG91dCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdHguaXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGN0eC5zZWxlY3RlZFtpbWdLZXkoY3R4Lml0ZW1zW2ldKV0pIG91dC5wdXNoKGN0eC5pdGVtc1tpXSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBmdW5jdGlvbiBzZWxlY3RBbGxWaXNpYmxlKCkgewogICAgdmFyIHZpcyA9IHZpc2libGVJdGVtcygpOwogICAgdmFyIGFsbFNlbGVjdGVkID0gdmlzLmxlbmd0aCAmJiB2aXMuZXZlcnkoZnVuY3Rpb24gKGltZykgeyByZXR1cm4gY3R4LnNlbGVjdGVkW2ltZ0tleShpbWcpXTsgfSk7CiAgICBpZiAoYWxsU2VsZWN0ZWQpIGN0eC5zZWxlY3RlZCA9IHt9OwogICAgZWxzZSB2aXMuZm9yRWFjaChmdW5jdGlvbiAoaW1nKSB7IGN0eC5zZWxlY3RlZFtpbWdLZXkoaW1nKV0gPSB0cnVlOyB9KTsKICAgIHJlbmRlclRvb2xiYXIoKTsKICAgIHJlbmRlckdyaWQoKTsKICB9CgogIGZ1bmN0aW9uIHJlbmRlclNlbGVjdGlvblN0YXRlRm9yKGtleSkgewogICAgaWYgKCFjdHguZ3JpZEVsKSByZXR1cm47CiAgICB2YXIgY2VsbCA9IGN0eC5ncmlkRWwucXVlcnlTZWxlY3RvcignW2RhdGEta2V5PSInICsgY3NzRXNjKGtleSkgKyAnIl0nKTsKICAgIGlmICghY2VsbCkgcmV0dXJuOwogICAgdmFyIG9uID0gISFjdHguc2VsZWN0ZWRba2V5XTsKICAgIGNlbGwuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtc2VsZWN0ZWQnLCBvbik7CiAgICB2YXIgY2IgPSBjZWxsLnF1ZXJ5U2VsZWN0b3IoJy52LWxpYi1jaGVjaycpOwogICAgaWYgKGNiKSB7CiAgICAgIGNiLmNsYXNzTGlzdC50b2dnbGUoJ2lzLW9uJywgb24pOwogICAgICBjYi5zZXRBdHRyaWJ1dGUoJ2FyaWEtY2hlY2tlZCcsIG9uID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgICAgIGNiLnN0eWxlLmJhY2tncm91bmQgPSBvbiA/IEdSQURJRU5UIDogQkFER0VfQkc7CiAgICAgIGNiLmlubmVySFRNTCA9ICcnOwogICAgICBpZiAob24pIGNiLmFwcGVuZENoaWxkKGljb24oJ2NoZWNrJykpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3NzRXNjKHMpIHsKICAgIGlmICh3aW5kb3cuQ1NTICYmIENTUy5lc2NhcGUpIHJldHVybiBDU1MuZXNjYXBlKHMpOwogICAgcmV0dXJuIFN0cmluZyhzKS5yZXBsYWNlKC9bIlxcXF1cW10vZywgJ1xcJCYnKTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoRGVsZXRlKCkgewogICAgdmFyIGltZ3MgPSBzZWxlY3RlZEltYWdlcygpOwogICAgaWYgKCFpbWdzLmxlbmd0aCkgcmV0dXJuOwogICAgY29uZmlybURpYWxvZygnRGVsZXRlICcgKyBpbWdzLmxlbmd0aCArICcgY3JlYXRpb24nICsgKGltZ3MubGVuZ3RoID4gMSA/ICdzJyA6ICcnKSArICc/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIHZhciBqb2JzID0gaW1ncy5tYXAoZnVuY3Rpb24gKGltZykgewogICAgICAgIHZhciBpZCA9IGltZ0lkKGltZyk7CiAgICAgICAgaWYgKCFpZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgICAgICByZXR1cm4gVi5hcGkuZGVsZXRlSW1hZ2UoaWQpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gaW1nS2V5KGltZyk7IH0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH0pOwogICAgICB9KTsKICAgICAgUHJvbWlzZS5hbGwoam9icykudGhlbihmdW5jdGlvbiAocmVzdWx0cykgewogICAgICAgIHZhciByZW1vdmVkID0ge307CiAgICAgICAgcmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IGlmIChrKSByZW1vdmVkW2tdID0gdHJ1ZTsgfSk7CiAgICAgICAgY3R4Lml0ZW1zID0gY3R4Lml0ZW1zLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4gIXJlbW92ZWRbaW1nS2V5KHgpXTsgfSk7CiAgICAgICAgdmFyIGZhaWxlZCA9IHJlc3VsdHMuZmlsdGVyKGZ1bmN0aW9uIChrKSB7IHJldHVybiAhazsgfSkubGVuZ3RoOwogICAgICAgIGlmIChjdHguc291cmNlID09PSAnbGlicmFyeScgJiYgVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5zZXQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGN0eC5fc2VsZldyaXRlID0gdHJ1ZTsKICAgICAgICAgIHRyeSB7IFYuc3RvcmUuc2V0KCdsaWJyYXJ5JywgY3R4Lml0ZW1zLnNsaWNlKCkpOyB9IGNhdGNoIChlKSB7fQogICAgICAgICAgY3R4Ll9zZWxmV3JpdGUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZXhpdFNlbGVjdCgpOwogICAgICAgIHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7CiAgICAgICAgaWYgKGZhaWxlZCkgdG9hc3QoZmFpbGVkICsgJyBjb3VsZCBub3QgYmUgZGVsZXRlZCcsICdlcnJvcicpOwogICAgICAgIGVsc2UgdG9hc3QoJ0RlbGV0ZWQgJyArIE9iamVjdC5rZXlzKHJlbW92ZWQpLmxlbmd0aCwgJ3N1Y2Nlc3MnKTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoQXNzaWduKCkgewogICAgdmFyIGlkcyA9IHNlbGVjdGVkSW1hZ2VzKCkubWFwKGltZ0lkKS5maWx0ZXIoQm9vbGVhbik7CiAgICBpZiAoIWlkcy5sZW5ndGgpIHJldHVybjsKICAgIGFzc2lnblRvRm9sZGVyRmxvdyhpZHMsIGZ1bmN0aW9uICgpIHsgZXhpdFNlbGVjdCgpOyB9KTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoRG93bmxvYWQoKSB7CiAgICB2YXIgaW1ncyA9IHNlbGVjdGVkSW1hZ2VzKCk7CiAgICBpZiAoIWltZ3MubGVuZ3RoKSByZXR1cm47CiAgICBpbWdzLmZvckVhY2goZnVuY3Rpb24gKGltZywgaSkgewogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgZG93bmxvYWRJbWFnZShpbWcpOyB9LCBpICogMjUwKTsKICAgIH0pOwogICAgdG9hc3QoJ0Rvd25sb2FkaW5nICcgKyBpbWdzLmxlbmd0aCwgJ2luZm8nKTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoU2hhcmUoKSB7CiAgICB2YXIgaW1ncyA9IHNlbGVjdGVkSW1hZ2VzKCk7CiAgICBpZiAoIWltZ3MubGVuZ3RoKSByZXR1cm47CiAgICBpZiAoaW1ncy5sZW5ndGggPT09IDEpIHsgc2hhcmVJbWFnZShpbWdzWzBdKTsgcmV0dXJuOyB9CiAgICB2YXIgbGluZXMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1ncy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgdXJsID0gc2hhcmVVUkxGb3IoaW1nc1tpXSk7CiAgICAgIGlmICh1cmwpIGxpbmVzLnB1c2godXJsKTsKICAgIH0KICAgIGlmICghbGluZXMubGVuZ3RoKSB7IHRvYXN0KCdUaGVzZSBjcmVhdGlvbnMgaGF2ZSBubyBzaGFyZSBsaW5rcyB5ZXQnLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICB2YXIgdGV4dCA9IGxpbmVzLmpvaW4oJ1xuJyk7CiAgICBpZiAobmF2aWdhdG9yLnNoYXJlKSB7CiAgICAgIG5hdmlnYXRvci5zaGFyZSh7IHRpdGxlOiAnVmFtcCcsIHRleHQ6ICdNYWRlIHdpdGggVmFtcCBieSBWb29zZXkuJywgdXJsOiBsaW5lc1swXSB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgaWYgKGVyciAmJiBlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47CiAgICAgICAgY29weVNoYXJlVGV4dCh0ZXh0KS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/IGxpbmVzLmxlbmd0aCArICcgbGlua3MgY29waWVkJyA6ICdDb3VsZCBub3QgY29weSBsaW5rcycsIG9rID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJyk7IH0pOwogICAgICB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29weVNoYXJlVGV4dCh0ZXh0KS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/IGxpbmVzLmxlbmd0aCArICcgbGlua3MgY29waWVkJyA6ICdDb3VsZCBub3QgY29weSBsaW5rcycsIG9rID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJyk7IH0pOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyVG9vbGJhcigpIHsKICAgIGlmICghY3R4LnRvb2xiYXJFbCkgcmV0dXJuOwogICAgY3R4LnRvb2xiYXJFbC5pbm5lckhUTUwgPSAnJzsKCiAgICBpZiAoY3R4LnNlbGVjdE1vZGUpIHsKICAgICAgdmFyIGJhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItc2VsYmFyIGdsYXNzLWNhcmQnIH0sCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsICdhcmlhLWxhYmVsJzogJ0V4aXQgc2VsZWN0aW9uJywgdGl0bGU6ICdEb25lJywgb25jbGljazogZXhpdFNlbGVjdCB9LCBpY29uKCdjbG9zZScpLCAnRG9uZScpLAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6IHNlbGVjdGVkQ291bnQoKSArICcgc2VsZWN0ZWQnIH0pLAogICAgICAgIFMoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1saWItc3BhY2VyJyB9KSwgJ2ZsZXg6MSAxIGF1dG8nKSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgb25jbGljazogc2VsZWN0QWxsVmlzaWJsZSB9LCAnU2VsZWN0IEFsbCcpLAogICAgICAgIGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nLCBkaXNhYmxlZDogc2VsZWN0ZWRDb3VudCgpID8gbnVsbCA6ICdkaXNhYmxlZCcsIG9uY2xpY2s6IGJhdGNoU2hhcmUgfSwgaWNvbignc2hhcmUnKSwgJ1NoYXJlJyksCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIGRpc2FibGVkOiBzZWxlY3RlZENvdW50KCkgPyBudWxsIDogJ2Rpc2FibGVkJywgb25jbGljazogYmF0Y2hEb3dubG9hZCB9LCBpY29uKCdkb3dubG9hZCcpLCAnRG93bmxvYWQnKSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgZGlzYWJsZWQ6IHNlbGVjdGVkQ291bnQoKSA/IG51bGwgOiAnZGlzYWJsZWQnLCBvbmNsaWNrOiBiYXRjaEFzc2lnbiB9LCBpY29uKCdmb2xkZXInKSwgJ0ZvbGRlcicpLAogICAgICAgIGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWRhbmdlciB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgZGlzYWJsZWQ6IHNlbGVjdGVkQ291bnQoKSA/IG51bGwgOiAnZGlzYWJsZWQnLCBvbmNsaWNrOiBiYXRjaERlbGV0ZSB9LCBpY29uKCd0cmFzaCcpLCAnRGVsZXRlJykKICAgICAgKTsKICAgICAgUyhiYXIsICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZsZXgtd3JhcDp3cmFwO2dhcDo5cHg7cGFkZGluZzoxMHB4IDE0cHg7Ym9yZGVyLXJhZGl1czp2YXIoLS12LXJhZGl1cy1zbSwxNXB4KTttYXJnaW4tYm90dG9tOnZhcigtLXNwYWNlLW1kLDE1cHgpJyk7CiAgICAgIGN0eC50b29sYmFyRWwuYXBwZW5kQ2hpbGQoYmFyKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciB0YWJzID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNoaXAtcm93Jywgcm9sZTogJ3RhYmxpc3QnLCAnYXJpYS1sYWJlbCc6ICdMaWJyYXJ5IHNvdXJjZScgfSk7CiAgICBmdW5jdGlvbiB0YWIobGFiZWwsIHNyYywgaWMsIG9uQ2xpY2spIHsKICAgICAgdmFyIGFjdGl2ZSA9IGN0eC5zb3VyY2UgPT09IHNyYzsKICAgICAgdmFyIGIgPSBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAndi1jaGlwJyArIChhY3RpdmUgPyAnIHYtY2hpcC0tYWN0aXZlJyA6ICcnKSwKICAgICAgICB0eXBlOiAnYnV0dG9uJywgcm9sZTogJ3RhYicsICdhcmlhLXNlbGVjdGVkJzogYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJwogICAgICB9LCBpYyA/IGljb24oaWMpIDogbnVsbCwgZWwoJ3NwYW4nLCB7IHRleHQ6IGxhYmVsIH0pKTsKICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2spOwogICAgICByZXR1cm4gYjsKICAgIH0KICAgIHRhYnMuYXBwZW5kQ2hpbGQodGFiKCdBbGwnLCAnbGlicmFyeScsICdncmlkJywgb3BlbkxpYnJhcnkpKTsKICAgIHRhYnMuYXBwZW5kQ2hpbGQodGFiKCdGYXZvcml0ZXMnLCAnZmF2b3JpdGVzJywgJ2hlYXJ0Jywgb3BlbkZhdm9yaXRlcykpOwogICAgdGFicy5hcHBlbmRDaGlsZCh0YWIoJ0ZvbGRlcnMnLCAnZm9sZGVyJywgJ2ZvbGRlcicsIG9wZW5Gb2xkZXJzTWFuYWdlcikpOwoKICAgIGlmIChjdHguc291cmNlID09PSAnZm9sZGVyJyAmJiBjdHguZm9sZGVySUQpIHsKICAgICAgdmFyIGZuYW1lID0gJyc7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3R4LmZvbGRlcnMubGVuZ3RoOyBpKyspIGlmIChjdHguZm9sZGVyc1tpXS5pZCA9PT0gY3R4LmZvbGRlcklEKSBmbmFtZSA9IGN0eC5mb2xkZXJzW2ldLm5hbWU7CiAgICAgIHZhciBwaWxsID0gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jaGlwIHYtY2hpcC0tYWN0aXZlJyB9LAogICAgICAgIGljb24oJ2ZvbGRlcicpLCBlbCgnc3BhbicsIHsgdGV4dDogZm5hbWUgfHwgJ0ZvbGRlcicgfSksCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWNoaXBfX3gnLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiAnTGVhdmUgZm9sZGVyJywgb25jbGljazogb3BlbkxpYnJhcnkgfSwgaWNvbignY2xvc2UnKSkpOwogICAgICB0YWJzLmFwcGVuZENoaWxkKHBpbGwpOwogICAgfQoKICAgIHZhciBzZWFyY2hJbnB1dCA9IGVsKCdpbnB1dCcsIHsKICAgICAgY2xhc3M6ICd2LWZpZWxkIHYtbGliLXNlYXJjaCcsIHR5cGU6ICdzZWFyY2gnLCBwbGFjZWhvbGRlcjogJ1NlYXJjaCBwcm9tcHRzLCBtb2RlbHMsIHRhZ3PigKYnLAogICAgICB2YWx1ZTogY3R4LnF1ZXJ5LCAnYXJpYS1sYWJlbCc6ICdTZWFyY2ggbGlicmFyeScKICAgIH0pOwogICAgdmFyIG9uU2VhcmNoID0gZGVib3VuY2UoZnVuY3Rpb24gKHZhbCkgewogICAgICBjdHgucXVlcnkgPSB2YWwudHJpbSgpOwogICAgICByZW5kZXJHcmlkKCk7IHJlbmRlclN0YXR1cygpOwogICAgfSwgMjAwKTsKICAgIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24gKCkgeyBvblNlYXJjaChzZWFyY2hJbnB1dC52YWx1ZSk7IH0pOwogICAgUyhzZWFyY2hJbnB1dCwgJ2ZsZXg6MSAxIGF1dG87bWluLXdpZHRoOjAnKTsKICAgIHZhciBzZWFyY2hJY29uID0gaWNvbignc2VhcmNoJyk7CiAgICBTKHNlYXJjaEljb24sICdwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjEycHg7dG9wOjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTtvcGFjaXR5Oi41NTtwb2ludGVyLWV2ZW50czpub25lO2xpbmUtaGVpZ2h0OjAnKTsKICAgIFMoc2VhcmNoSW5wdXQsICdwYWRkaW5nLWxlZnQ6MzZweCcpOwogICAgdmFyIHNlYXJjaFdyYXAgPSBlbCgnbGFiZWwnLCB7IGNsYXNzOiAndi1saWItc2VhcmNod3JhcCcgfSwgc2VhcmNoSWNvbiwgc2VhcmNoSW5wdXQpOwogICAgUyhzZWFyY2hXcmFwLCAncG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4OjEgMSAyMjBweDttaW4td2lkdGg6MTYwcHgnKTsKCiAgICB2YXIgc29ydFNlbCA9IGVsKCdzZWxlY3QnLCB7IGNsYXNzOiAndi1zZWxlY3Qgdi1saWItc29ydCcsICdhcmlhLWxhYmVsJzogJ1NvcnQgbGlicmFyeScgfSk7CiAgICBTT1JUUy5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7CiAgICAgIHZhciBvID0gZWwoJ29wdGlvbicsIHsgdmFsdWU6IHMua2V5LCB0ZXh0OiBzLmxhYmVsIH0pOwogICAgICBpZiAocy5rZXkgPT09IGN0eC5zb3J0KSBvLnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgc29ydFNlbC5hcHBlbmRDaGlsZChvKTsKICAgIH0pOwogICAgc29ydFNlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7IGN0eC5zb3J0ID0gc29ydFNlbC52YWx1ZTsgcmVuZGVyR3JpZCgpOyByZW5kZXJTdGF0dXMoKTsgfSk7CgogICAgdmFyIHNlbEJ0biA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IGVudGVyU2VsZWN0KCk7IH0gfSwgaWNvbignY2hlY2snKSwgJ1NlbGVjdCcpOwoKICAgIHZhciBjb250cm9scyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItY29udHJvbHMnIH0sIHNlYXJjaFdyYXAsIHNvcnRTZWwsIHNlbEJ0bik7CiAgICBTKGNvbnRyb2xzLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LXdyYXA6d3JhcDtnYXA6OXB4O2ZsZXg6MSAxIDMyMHB4O21pbi13aWR0aDowJyk7CiAgICBTKHRhYnMsICdmbGV4OjAgMCBhdXRvJyk7CgogICAgdmFyIHRvb2xiYXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtbGliLXRvb2xiYXInIH0sIHRhYnMsIGNvbnRyb2xzKTsKICAgIFModG9vbGJhciwgJ2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7ZmxleC13cmFwOndyYXA7Z2FwOjEycHg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47bWFyZ2luLWJvdHRvbTp2YXIoLS1zcGFjZS1tZCwxNXB4KScpOwogICAgY3R4LnRvb2xiYXJFbC5hcHBlbmRDaGlsZCh0b29sYmFyKTsKCiAgICB2YXIgcHJlc2VudCA9IGF2YWlsYWJsZVRhZ3MoKTsKICAgIHZhciBpbmR1c3RyaWVzID0gKFYuZGF0YSAmJiBBcnJheS5pc0FycmF5KFYuZGF0YS5pbmR1c3RyaWVzKSkgPyBWLmRhdGEuaW5kdXN0cmllcyA6IFtdOwogICAgdmFyIGNoaXBzID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNoaXAtcm93Jywgcm9sZTogJ2dyb3VwJywgJ2FyaWEtbGFiZWwnOiAnRmlsdGVyIGJ5IHRhZycgfSk7CiAgICB2YXIgYWxsQ2hpcCA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jaGlwJyArIChjdHguaW5kdXN0cnkgPyAnJyA6ICcgdi1jaGlwLS1hY3RpdmUnKSwgdHlwZTogJ2J1dHRvbicsIHRleHQ6ICdBbGwnLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IGN0eC5pbmR1c3RyeSA9IG51bGw7IHJlbmRlclRvb2xiYXIoKTsgcmVuZGVyR3JpZCgpOyByZW5kZXJTdGF0dXMoKTsgfSB9KTsKICAgIGNoaXBzLmFwcGVuZENoaWxkKGFsbENoaXApOwogICAgdmFyIGFkZGVkID0ge307CiAgICBpbmR1c3RyaWVzLmZvckVhY2goZnVuY3Rpb24gKGluZCkgewogICAgICBpZiAoIXByZXNlbnRbU3RyaW5nKGluZC5rZXkpLnRvTG93ZXJDYXNlKCldICYmICFwcmVzZW50W1N0cmluZyhpbmQubGFiZWwpLnRvTG93ZXJDYXNlKCldKSByZXR1cm47CiAgICAgIHZhciBrZXkgPSBwcmVzZW50W1N0cmluZyhpbmQua2V5KS50b0xvd2VyQ2FzZSgpXSA/IGluZC5rZXkgOiBpbmQubGFiZWw7CiAgICAgIGFkZGVkW1N0cmluZyhrZXkpLnRvTG93ZXJDYXNlKCldID0gdHJ1ZTsKICAgICAgdmFyIGFjdGl2ZSA9IGN0eC5pbmR1c3RyeSAmJiBjdHguaW5kdXN0cnkudG9Mb3dlckNhc2UoKSA9PT0gU3RyaW5nKGtleSkudG9Mb3dlckNhc2UoKTsKICAgICAgdmFyIGMgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY2hpcCcgKyAoYWN0aXZlID8gJyB2LWNoaXAtLWFjdGl2ZScgOiAnJyksIHR5cGU6ICdidXR0b24nLCB0ZXh0OiBpbmQubGFiZWwgfSk7CiAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7IGN0eC5pbmR1c3RyeSA9IGFjdGl2ZSA/IG51bGwgOiBrZXk7IHJlbmRlclRvb2xiYXIoKTsgcmVuZGVyR3JpZCgpOyByZW5kZXJTdGF0dXMoKTsgfSk7CiAgICAgIGNoaXBzLmFwcGVuZENoaWxkKGMpOwogICAgfSk7CiAgICBPYmplY3Qua2V5cyhwcmVzZW50KS5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHsKICAgICAgaWYgKGFkZGVkW3RhZ10pIHJldHVybjsKICAgICAgdmFyIGFjdGl2ZSA9IGN0eC5pbmR1c3RyeSAmJiBjdHguaW5kdXN0cnkudG9Mb3dlckNhc2UoKSA9PT0gdGFnOwogICAgICB2YXIgYyA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jaGlwJyArIChhY3RpdmUgPyAnIHYtY2hpcC0tYWN0aXZlJyA6ICcnKSwgdHlwZTogJ2J1dHRvbicsIHRleHQ6IHRhZyB9KTsKICAgICAgYy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgY3R4LmluZHVzdHJ5ID0gYWN0aXZlID8gbnVsbCA6IHRhZzsgcmVuZGVyVG9vbGJhcigpOyByZW5kZXJHcmlkKCk7IHJlbmRlclN0YXR1cygpOyB9KTsKICAgICAgY2hpcHMuYXBwZW5kQ2hpbGQoYyk7CiAgICB9KTsKICAgIGlmIChjaGlwcy5jaGlsZHJlbi5sZW5ndGggPiAxKSB7IFMoY2hpcHMsICdtYXJnaW4tYm90dG9tOnZhcigtLXNwYWNlLW1kLDE1cHgpJyk7IGN0eC50b29sYmFyRWwuYXBwZW5kQ2hpbGQoY2hpcHMpOyB9CiAgfQoKICBmdW5jdGlvbiBzaG93U2tlbGV0b25zKCkgewogICAgaWYgKCFjdHguZ3JpZEVsKSByZXR1cm47CiAgICBjdHguZ3JpZEVsLmlubmVySFRNTCA9ICcnOwogICAgY3R4LmdyaWRFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtYnVzeScsICd0cnVlJyk7CiAgICB2YXIgbiA9IDk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgc2s7CiAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnNrZWxldG9uID09PSAnZnVuY3Rpb24nKSBzayA9IFYudWkuc2tlbGV0b24oJ2NhcmQnKTsKICAgICAgZWxzZSBzayA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbiB2LXNrZWxldG9uLS10aWxlJyB9KTsKICAgICAgY3R4LmdyaWRFbC5hcHBlbmRDaGlsZChzayk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBidWlsZENlbGwoaW1nKSB7CiAgICB2YXIga2V5ID0gaW1nS2V5KGltZyk7CiAgICB2YXIgY2VsbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItY2VsbCcsIGRhdGFzZXQ6IHsga2V5OiBrZXkgfSB9KTsKICAgIFMoY2VsbCwgJ3Bvc2l0aW9uOnJlbGF0aXZlO2JvcmRlci1yYWRpdXM6dmFyKC0tdi1yYWRpdXMtc20sMTVweCk7b3ZlcmZsb3c6aGlkZGVuJyk7CiAgICB2YXIgb25DaGFuZ2UgPSBmdW5jdGlvbiAoKSB7IHJlbmRlckZhdkJhZGdlKGNlbGwsIGltZyk7IH07CgogICAgdmFyIGNhcmROb2RlOwogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaW1nQ2FyZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBjYXJkTm9kZSA9IFYudWkuaW1nQ2FyZChpbWcsIHsgYmVmb3JlQWZ0ZXI6IHRydWUsIG9uVGFwOiBmdW5jdGlvbiAoKSB7IGlmIChjdHguc2VsZWN0TW9kZSkgdG9nZ2xlU2VsZWN0KGltZyk7IGVsc2Ugb3BlbkltYWdlKGltZyk7IH0gfSk7CiAgICB9IGVsc2UgewogICAgICBjYXJkTm9kZSA9IGJ1aWxkRmFsbGJhY2tDYXJkKGltZyk7CiAgICB9CiAgICBjZWxsLmFwcGVuZENoaWxkKGNhcmROb2RlKTsKCiAgICBpZiAoaXNWaWRlbyhpbWcpKSB7CiAgICAgIHZhciB2YmFkZ2UgPSBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWxpYi12aWRlb2JhZGdlJywgJ2FyaWEtbGFiZWwnOiAnVmlkZW8nIH0sIGljb24oJ2ZpbG0nKSk7CiAgICAgIGNlbGwuYXBwZW5kQ2hpbGQodmJhZGdlKTsKICAgIH0KCiAgICB2YXIgQlROID0gJ2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6MzBweDtoZWlnaHQ6MzBweDtib3JkZXItcmFkaXVzOjUwJTtib3JkZXI6MXB4IHNvbGlkICcgKyBMSU5FICsgJztjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyO2JhY2tkcm9wLWZpbHRlcjpibHVyKDhweCk7LXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6Ymx1cig4cHgpO3RyYW5zaXRpb246dHJhbnNmb3JtIC4xMnMgZWFzZSxiYWNrZ3JvdW5kIC4xMnMgZWFzZTtsaW5lLWhlaWdodDowJzsKCiAgICB2YXIgY2hlY2sgPSBlbCgnYnV0dG9uJywgewogICAgICBjbGFzczogJ3YtbGliLWNoZWNrJyArIChjdHguc2VsZWN0ZWRba2V5XSA/ICcgaXMtb24nIDogJycpLCB0eXBlOiAnYnV0dG9uJywgcm9sZTogJ2NoZWNrYm94JywKICAgICAgJ2FyaWEtY2hlY2tlZCc6IGN0eC5zZWxlY3RlZFtrZXldID8gJ3RydWUnIDogJ2ZhbHNlJywgJ2FyaWEtbGFiZWwnOiAnU2VsZWN0IGNyZWF0aW9uJywKICAgICAgdGFiaW5kZXg6IGN0eC5zZWxlY3RNb2RlID8gJzAnIDogJy0xJwogICAgfSk7CiAgICBTKGNoZWNrLCAncG9zaXRpb246YWJzb2x1dGU7dG9wOjhweDtsZWZ0OjhweDt6LWluZGV4OjM7JyArIEJUTiArICc7YmFja2dyb3VuZDonICsgKGN0eC5zZWxlY3RlZFtrZXldID8gR1JBRElFTlQgOiBCQURHRV9CRykgKyAoY3R4LnNlbGVjdE1vZGUgPyAnJyA6ICc7b3BhY2l0eTowO3BvaW50ZXItZXZlbnRzOm5vbmUnKSk7CiAgICBpZiAoY3R4LnNlbGVjdGVkW2tleV0pIGNoZWNrLmFwcGVuZENoaWxkKGljb24oJ2NoZWNrJykpOwogICAgY2hlY2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBlLnByZXZlbnREZWZhdWx0KCk7IHRvZ2dsZVNlbGVjdChpbWcpOyB9KTsKICAgIGNlbGwuYXBwZW5kQ2hpbGQoY2hlY2spOwoKICAgIHZhciBmYXYgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtbGliLWZhdicgKyAoaW1nLmZhdm9yaXRlZCA/ICcgaXMtb24nIDogJycpLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiBpbWcuZmF2b3JpdGVkID8gJ1VuZmF2b3JpdGUnIDogJ0Zhdm9yaXRlJywgJ2FyaWEtcHJlc3NlZCc6IGltZy5mYXZvcml0ZWQgPyAndHJ1ZScgOiAnZmFsc2UnIH0pOwogICAgUyhmYXYsICdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6OHB4O3JpZ2h0OjQ0cHg7ei1pbmRleDozOycgKyBCVE4gKyAnO2JhY2tncm91bmQ6JyArIChpbWcuZmF2b3JpdGVkID8gR1JBRElFTlQgOiBCQURHRV9CRykpOwogICAgZmF2LmFwcGVuZENoaWxkKGljb24oaW1nLmZhdm9yaXRlZCA/ICdoZWFydEZpbGwnIDogJ2hlYXJ0JykpOwogICAgZmF2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgZS5wcmV2ZW50RGVmYXVsdCgpOyB0b2dnbGVGYXZvcml0ZShpbWcsIG9uQ2hhbmdlKTsgfSk7CiAgICBjZWxsLmFwcGVuZENoaWxkKGZhdik7CgogICAgdmFyIG1vcmUgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtbGliLW1vcmUnLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiAnTW9yZSBhY3Rpb25zJyB9KTsKICAgIFMobW9yZSwgJ3Bvc2l0aW9uOmFic29sdXRlO3RvcDo4cHg7cmlnaHQ6OHB4O3otaW5kZXg6MzsnICsgQlROICsgJztiYWNrZ3JvdW5kOicgKyBCQURHRV9CRyk7CiAgICBtb3JlLmFwcGVuZENoaWxkKGljb24oJ21vcmUnKSk7CiAgICBtb3JlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsKICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB2YXIgciA9IG1vcmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIG9wZW5Db250ZXh0TWVudShpbWcsIHIucmlnaHQsIHIuYm90dG9tICsgNCwgb25DaGFuZ2UpOwogICAgfSk7CiAgICBjZWxsLmFwcGVuZENoaWxkKG1vcmUpOwoKICAgIGlmIChjdHguc2VsZWN0ZWRba2V5XSkgY2VsbC5jbGFzc0xpc3QuYWRkKCdpcy1zZWxlY3RlZCcpOwoKICAgIGNlbGwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgnLnYtbGliLWNoZWNrLCAudi1saWItZmF2LCAudi1saWItbW9yZScpKSByZXR1cm47CiAgICAgIGlmIChjdHguc2VsZWN0TW9kZSkgeyB0b2dnbGVTZWxlY3QoaW1nKTsgcmV0dXJuOyB9CiAgICAgIGlmICghKFYudWkgJiYgdHlwZW9mIFYudWkuaW1nQ2FyZCA9PT0gJ2Z1bmN0aW9uJykpIG9wZW5JbWFnZShpbWcpOwogICAgfSk7CgogICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgb3BlbkNvbnRleHRNZW51KGltZywgZS5jbGllbnRYLCBlLmNsaWVudFksIG9uQ2hhbmdlKTsKICAgIH0pOwoKICAgIHZhciBscFRpbWVyID0gbnVsbCwgbW92ZWQgPSBmYWxzZSwgc3RhcnRYID0gMCwgc3RhcnRZID0gMDsKICAgIGNlbGwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgIG1vdmVkID0gZmFsc2U7CiAgICAgIGlmIChlLnRvdWNoZXMgJiYgZS50b3VjaGVzWzBdKSB7IHN0YXJ0WCA9IGUudG91Y2hlc1swXS5jbGllbnRYOyBzdGFydFkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WTsgfQogICAgICBscFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFtb3ZlZCkgewogICAgICAgICAgaWYgKCFjdHguc2VsZWN0TW9kZSkgZW50ZXJTZWxlY3QoaW1nKTsKICAgICAgICAgIGVsc2UgdG9nZ2xlU2VsZWN0KGltZyk7CiAgICAgICAgICBpZiAobmF2aWdhdG9yLnZpYnJhdGUpIHRyeSB7IG5hdmlnYXRvci52aWJyYXRlKDEyKTsgfSBjYXRjaCAoZXIpIHt9CiAgICAgICAgfQogICAgICB9LCA0NTApOwogICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlc1swXSkgewogICAgICAgIGlmIChNYXRoLmFicyhlLnRvdWNoZXNbMF0uY2xpZW50WCAtIHN0YXJ0WCkgPiAxMCB8fCBNYXRoLmFicyhlLnRvdWNoZXNbMF0uY2xpZW50WSAtIHN0YXJ0WSkgPiAxMCkgbW92ZWQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChtb3ZlZCkgY2xlYXJUaW1lb3V0KGxwVGltZXIpOwogICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGZ1bmN0aW9uICgpIHsgY2xlYXJUaW1lb3V0KGxwVGltZXIpOyB9LCB7IHBhc3NpdmU6IHRydWUgfSk7CiAgICBjZWxsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgZnVuY3Rpb24gKCkgeyBjbGVhclRpbWVvdXQobHBUaW1lcik7IH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKCiAgICByZXR1cm4gY2VsbDsKICB9CgogIGZ1bmN0aW9uIHJlbmRlckZhdkJhZGdlKGNlbGwsIGltZykgewogICAgaWYgKCFjZWxsKSByZXR1cm47CiAgICB2YXIgZmF2ID0gY2VsbC5xdWVyeVNlbGVjdG9yKCcudi1saWItZmF2Jyk7CiAgICBpZiAoIWZhdikgcmV0dXJuOwogICAgZmF2LmNsYXNzTGlzdC50b2dnbGUoJ2lzLW9uJywgISFpbWcuZmF2b3JpdGVkKTsKICAgIGZhdi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIGltZy5mYXZvcml0ZWQgPyAndHJ1ZScgOiAnZmFsc2UnKTsKICAgIGZhdi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBpbWcuZmF2b3JpdGVkID8gJ1VuZmF2b3JpdGUnIDogJ0Zhdm9yaXRlJyk7CiAgICBmYXYuc3R5bGUuYmFja2dyb3VuZCA9IGltZy5mYXZvcml0ZWQgPyBHUkFESUVOVCA6IEJBREdFX0JHOwogICAgZmF2LmlubmVySFRNTCA9ICcnOwogICAgZmF2LmFwcGVuZENoaWxkKGljb24oaW1nLmZhdm9yaXRlZCA/ICdoZWFydEZpbGwnIDogJ2hlYXJ0JykpOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRGYWxsYmFja0NhcmQoaW1nKSB7CiAgICB2YXIgYWZ0ZXIgPSBpbWcucmVtb3RlSW1hZ2VVUkwgfHwgaW1nLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwgfHwgJyc7CiAgICB2YXIgYmVmb3JlID0gaW1nLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkw7CiAgICB2YXIgY2FyZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jYXJkIHYtY2FyZC0tcGFkLTAgdi1jYXJkLS10YXBwYWJsZSB2Y2FyZCcgfSk7CiAgICBTKGNhcmQsICdwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2Rpc3BsYXk6YmxvY2s7Ym9yZGVyLXJhZGl1czp2YXIoLS12LXJhZGl1cy1zbSwxNXB4KTtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZDp2YXIoLS12LWNhcmQtYmcsIHJnYmEoMjU1LDI1NSwyNTUsLjA0KSknKTsKICAgIHZhciBhZnRlckltZyA9IGVsKCdpbWcnLCB7IGNsYXNzOiAndmFmdGVyJywgc3JjOiBhZnRlciwgYWx0OiBlc2NhcGVIdG1sKGltZy5wcm9tcHQgfHwgJ0NyZWF0aW9uJyksIGxvYWRpbmc6ICdsYXp5JyB9KTsKICAgIFMoYWZ0ZXJJbWcsICdkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OmF1dG8nKTsKICAgIGFmdGVySW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyBjYXJkLmNsYXNzTGlzdC5hZGQoJ2lzLWJyb2tlbicpOyB9KTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoYWZ0ZXJJbWcpOwogICAgaWYgKGJlZm9yZSAmJiBiZWZvcmUgIT09IGFmdGVyKSB7CiAgICAgIHZhciBiZWZvcmVJbWcgPSBlbCgnaW1nJywgeyBjbGFzczogJ3ZiZWZvcmUnLCBzcmM6IGJlZm9yZSwgYWx0OiAnJywgbG9hZGluZzogJ2xhenknIH0pOwogICAgICBTKGJlZm9yZUltZywgJ3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvdmVyO3RyYW5zaXRpb246b3BhY2l0eSAuNnMgZWFzZScpOwogICAgICBjYXJkLmFwcGVuZENoaWxkKGJlZm9yZUltZyk7CiAgICAgIHZhciBvbiA9IGZhbHNlOwogICAgICB2YXIgaXYgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFjYXJkLmlzQ29ubmVjdGVkKSB7IGNsZWFySW50ZXJ2YWwoaXYpOyByZXR1cm47IH0KICAgICAgICBvbiA9ICFvbjsKICAgICAgICBiZWZvcmVJbWcuc3R5bGUub3BhY2l0eSA9IG9uID8gJzAnIDogJzEnOwogICAgICB9LCAyNjAwKTsKICAgIH0KICAgIHJldHVybiBjYXJkOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyR3JpZCgpIHsKICAgIGlmICghY3R4LmdyaWRFbCkgcmV0dXJuOwogICAgY3R4LmdyaWRFbC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtYnVzeScpOwoKICAgIGlmIChjdHgubG9hZGluZyAmJiAhY3R4Lml0ZW1zLmxlbmd0aCkgeyBzaG93U2tlbGV0b25zKCk7IHJldHVybjsgfQoKICAgIHZhciBsaXN0ID0gdmlzaWJsZUl0ZW1zKCk7CiAgICBjdHguZ3JpZEVsLmlubmVySFRNTCA9ICcnOwoKICAgIGlmICghbGlzdC5sZW5ndGgpIHsKICAgICAgaWYgKGN0eC5sb2FkaW5nKSB7IHNob3dTa2VsZXRvbnMoKTsgcmV0dXJuOyB9CiAgICAgIGlmIChjdHguZXJyb3JlZCkgeyByZW1vdmVTZW50aW5lbCgpOyByZXR1cm47IH0KICAgICAgdmFyIGZpbHRlcmVkID0gY3R4LnF1ZXJ5IHx8IGN0eC5pbmR1c3RyeTsKICAgICAgaWYgKCFmaWx0ZXJlZCAmJiAhY3R4LmZldGNoZWQpIHsgc2hvd1NrZWxldG9ucygpOyByZXR1cm47IH0KICAgICAgcmVtb3ZlU2VudGluZWwoKTsKICAgICAgY3R4LmdyaWRFbC5hcHBlbmRDaGlsZChlbXB0eVN0YXRlKCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgdHJ5IHsgZnJhZy5hcHBlbmRDaGlsZChidWlsZENlbGwobGlzdFtpXSkpOyB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIGNvbnNvbGUuZXJyb3IoJ1tsaWJyYXJ5XSBjZWxsIHJlbmRlciBmYWlsZWQnLCBlKTsKICAgICAgfQogICAgfQogICAgY3R4LmdyaWRFbC5hcHBlbmRDaGlsZChmcmFnKTsKICAgIGN0eC5ncmlkRWwuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtc2VsZWN0aW5nJywgY3R4LnNlbGVjdE1vZGUpOwogICAgYXR0YWNoU2VudGluZWwoKTsKICB9CgogIGZ1bmN0aW9uIGhhc01vcmVUb0xvYWQoKSB7CiAgICBpZiAoY3R4LmRvbmUgfHwgY3R4LmxvYWRpbmcpIHJldHVybiBmYWxzZTsKICAgIGlmIChjdHguc291cmNlID09PSAnZmF2b3JpdGVzJykgcmV0dXJuIGZhbHNlOwogICAgaWYgKGN0eC50b3RhbCAhPSBudWxsICYmIGN0eC50b3RhbCA+IDAgJiYgY3R4Lml0ZW1zLmxlbmd0aCA8IGN0eC50b3RhbCkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBlbXB0eVN0YXRlKCkgewogICAgdmFyIGhhc0VtcHR5ID0gVi51aSAmJiB0eXBlb2YgVi51aS5lbXB0eSA9PT0gJ2Z1bmN0aW9uJzsKICAgIHZhciBpc0ZpbHRlcmVkID0gY3R4LnF1ZXJ5IHx8IGN0eC5pbmR1c3RyeTsKCiAgICBpZiAoaXNGaWx0ZXJlZCkgewogICAgICB2YXIgY2xlYXIgPSBmdW5jdGlvbiAoKSB7IGN0eC5xdWVyeSA9ICcnOyBjdHguaW5kdXN0cnkgPSBudWxsOyByZW5kZXJUb29sYmFyKCk7IHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7IH07CiAgICAgIGlmIChoYXNFbXB0eSkgcmV0dXJuIFYudWkuZW1wdHkoeyB0aXRsZTogJ05vIG1hdGNoZXMnLCBtZXNzYWdlOiAnTm90aGluZyBtYXRjaGVzIHlvdXIgc2VhcmNoIG9yIGZpbHRlcnMuJywgaWNvbjogJ3NlYXJjaCcgfSwgJ0NsZWFyIGZpbHRlcnMnLCBjbGVhcik7CiAgICAgIHJldHVybiBmYWxsYmFja0VtcHR5KCdObyBtYXRjaGVzJywgJ05vdGhpbmcgbWF0Y2hlcyB5b3VyIHNlYXJjaCBvciBmaWx0ZXJzLicsICdDbGVhciBmaWx0ZXJzJywgY2xlYXIpOwogICAgfQogICAgaWYgKGN0eC5zb3VyY2UgPT09ICdmYXZvcml0ZXMnKSB7CiAgICAgIGlmIChoYXNFbXB0eSkgcmV0dXJuIFYudWkuZW1wdHkoeyB0aXRsZTogJ05vIGZhdm9yaXRlcyB5ZXQnLCBtZXNzYWdlOiAnVGFwIHRoZSBoZWFydCBvbiBhbnkgY3JlYXRpb24gdG8gc2F2ZSBpdCBoZXJlLicsIGljb246ICdoZWFydCcgfSwgJ0Jyb3dzZSBMaWJyYXJ5Jywgb3BlbkxpYnJhcnkpOwogICAgICByZXR1cm4gZmFsbGJhY2tFbXB0eSgnTm8gZmF2b3JpdGVzIHlldCcsICdUYXAgdGhlIGhlYXJ0IG9uIGFueSBjcmVhdGlvbiB0byBzYXZlIGl0IGhlcmUuJywgJ0Jyb3dzZSBMaWJyYXJ5Jywgb3BlbkxpYnJhcnkpOwogICAgfQogICAgaWYgKGN0eC5zb3VyY2UgPT09ICdmb2xkZXInKSB7CiAgICAgIGlmIChoYXNFbXB0eSkgcmV0dXJuIFYudWkuZW1wdHkoeyB0aXRsZTogJ1RoaXMgZm9sZGVyIGlzIGVtcHR5JywgbWVzc2FnZTogJ0FkZCBjcmVhdGlvbnMgZnJvbSBhbnkgaW1hZ2XigJlzIG1lbnUuJywgaWNvbjogJ2ZvbGRlcicgfSwgJ0JhY2sgdG8gTGlicmFyeScsIG9wZW5MaWJyYXJ5KTsKICAgICAgcmV0dXJuIGZhbGxiYWNrRW1wdHkoJ1RoaXMgZm9sZGVyIGlzIGVtcHR5JywgJ0FkZCBjcmVhdGlvbnMgZnJvbSBhbnkgaW1hZ2XigJlzIG1lbnUuJywgJ0JhY2sgdG8gTGlicmFyeScsIG9wZW5MaWJyYXJ5KTsKICAgIH0KICAgIHZhciBjcmVhdGUgPSBmdW5jdGlvbiAoKSB7IGdvKCcjL2NyZWF0ZScpOyB9OwogICAgaWYgKGhhc0VtcHR5KSByZXR1cm4gVi51aS5lbXB0eSh7IHRpdGxlOiAnTm8gY3JlYXRpb25zIHlldCcsIG1lc3NhZ2U6ICdHZW5lcmF0ZSB5b3VyIGZpcnN0IGltYWdlIHRvIHN0YXJ0IHlvdXIgbGlicmFyeS4nLCBpY29uOiAnaW1hZ2UnIH0sICdDcmVhdGUnLCBjcmVhdGUpOwogICAgcmV0dXJuIGZhbGxiYWNrRW1wdHkoJ05vIGNyZWF0aW9ucyB5ZXQnLCAnR2VuZXJhdGUgeW91ciBmaXJzdCBpbWFnZSB0byBzdGFydCB5b3VyIGxpYnJhcnkuJywgJ0NyZWF0ZScsIGNyZWF0ZSk7CiAgfQoKICBmdW5jdGlvbiBmYWxsYmFja0VtcHR5KHRpdGxlLCBzdWIsIGFjdGlvbkxhYmVsLCBvbkFjdGlvbikgewogICAgdmFyIG5vZGUgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHknLCByb2xlOiAnbm90ZScgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oJ2ltYWdlJykpLAogICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScsIHRleHQ6IHRpdGxlIH0pLAogICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19zdWInLCB0ZXh0OiBzdWIgfSkpOwogICAgaWYgKGFjdGlvbkxhYmVsICYmIHR5cGVvZiBvbkFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBub2RlLmFwcGVuZENoaWxkKGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnkgdi1lbXB0eV9fYWN0aW9uJywgdHlwZTogJ2J1dHRvbicsIHRleHQ6IGFjdGlvbkxhYmVsLCBvbmNsaWNrOiBvbkFjdGlvbiB9KSk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZVNlbnRpbmVsKCkgewogICAgaWYgKGN0eC5vYnNlcnZlcikgeyB0cnkgeyBjdHgub2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyB9IGNhdGNoIChlKSB7fSBjdHgub2JzZXJ2ZXIgPSBudWxsOyB9CiAgICBpZiAoY3R4LnNlbnRpbmVsICYmIGN0eC5zZW50aW5lbC5wYXJlbnROb2RlKSBjdHguc2VudGluZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjdHguc2VudGluZWwpOwogICAgY3R4LnNlbnRpbmVsID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIGF0dGFjaFNlbnRpbmVsKCkgewogICAgaWYgKCFjdHguZ3JpZEVsKSByZXR1cm47CiAgICByZW1vdmVTZW50aW5lbCgpOwogICAgaWYgKGN0eC5kb25lIHx8IGN0eC5zb3VyY2UgPT09ICdmYXZvcml0ZXMnIHx8IGN0eC5xdWVyeSkgcmV0dXJuOwogICAgY3R4LnNlbnRpbmVsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi1zZW50aW5lbCcsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKICAgIFMoY3R4LnNlbnRpbmVsLCAnd2lkdGg6MTAwJTtoZWlnaHQ6MXB4Jyk7CiAgICBpZiAoY3R4LmdyaWRFbC5wYXJlbnROb2RlKSBjdHguZ3JpZEVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGN0eC5zZW50aW5lbCwgY3R4LmdyaWRFbC5uZXh0U2libGluZyk7CiAgICBvYnNlcnZlU2VudGluZWwoKTsKICB9CgogIGZ1bmN0aW9uIG9ic2VydmVTZW50aW5lbCgpIHsKICAgIGlmICghKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicgaW4gd2luZG93KSB8fCAhY3R4LnNlbnRpbmVsKSByZXR1cm47CiAgICBjdHgub2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGVudHJpZXNbaV0uaXNJbnRlcnNlY3RpbmcpIGxvYWROZXh0KGZhbHNlKTsKICAgICAgfQogICAgfSwgeyByb290TWFyZ2luOiAnNjAwcHggMHB4JyB9KTsKICAgIGN0eC5vYnNlcnZlci5vYnNlcnZlKGN0eC5zZW50aW5lbCk7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJTdGF0dXMoZXJyKSB7CiAgICBpZiAoIWN0eC5zdGF0dXNFbCkgcmV0dXJuOwogICAgY3R4LnN0YXR1c0VsLmlubmVySFRNTCA9ICcnOwoKICAgIGlmIChjdHguZXJyb3JlZCB8fCBlcnIpIHsKICAgICAgY3R4LnN0YXR1c0VsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eSB2LWxpYi1zdGF0dXNib3gnLCByb2xlOiAnYWxlcnQnIH0sCiAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fdGl0bGUnLCB0ZXh0OiAnQ291bGQgbm90IGxvYWQgeW91ciBsaWJyYXJ5LicgfSksCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgdGV4dDogJ1JldHJ5Jywgb25jbGljazogZnVuY3Rpb24gKCkgeyBsb2FkTmV4dCh0cnVlKTsgfSB9KSkpOwogICAgfSBlbHNlIGlmIChjdHgubG9hZGluZyAmJiBjdHguaXRlbXMubGVuZ3RoKSB7CiAgICAgIGN0eC5zdGF0dXNFbC5hcHBlbmRDaGlsZChTKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItbG9hZG1vcmUnIH0sIHNwaW5uZXJOb2RlKCksIGVsKCdzcGFuJywgeyB0ZXh0OiAnTG9hZGluZyBtb3Jl4oCmJyB9KSksICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Z2FwOjEwcHg7cGFkZGluZzoyNHB4IDA7Y29sb3I6dmFyKC0tdi1pbmstc29mdCwgcmdiYSgyNDUsMjQ1LDI0NywuNjYpKTtmb250LXNpemU6MTRweCcpKTsKICAgIH0gZWxzZSBpZiAoY3R4LmRvbmUgJiYgY3R4Lml0ZW1zLmxlbmd0aCkgewogICAgICB2YXIgbiA9IGN0eC50b3RhbCAhPSBudWxsID8gY3R4LnRvdGFsIDogY3R4Lml0ZW1zLmxlbmd0aDsKICAgICAgY3R4LnN0YXR1c0VsLmFwcGVuZENoaWxkKFMoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi1lbmQnLCB0ZXh0OiBuICsgJyBjcmVhdGlvbicgKyAobiA9PT0gMSA/ICcnIDogJ3MnKSB9KSwgJ3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MjRweCAwIDhweDtjb2xvcjp2YXIoLS12LWluay1zb2Z0LCByZ2JhKDI0NSwyNDUsMjQ3LC41KSk7Zm9udC1zaXplOjEzcHg7bGV0dGVyLXNwYWNpbmc6LjAyZW0nKSk7CiAgICB9CgogICAgaWYgKGN0eC5jb3VudEVsKSB7CiAgICAgIHZhciB0b3RhbExvYWRlZCA9IGN0eC5pdGVtcy5sZW5ndGg7CiAgICAgIHZhciBsYWJlbDsKICAgICAgaWYgKGN0eC5xdWVyeSB8fCBjdHguaW5kdXN0cnkpIGxhYmVsID0gdmlzaWJsZUl0ZW1zKCkubGVuZ3RoICsgJyBvZiAnICsgdG90YWxMb2FkZWQ7CiAgICAgIGVsc2UgaWYgKGN0eC50b3RhbCAhPSBudWxsKSBsYWJlbCA9IChjdHguZG9uZSA/IGN0eC50b3RhbCA6IHRvdGFsTG9hZGVkICsgJysnKSArICcnOwogICAgICBlbHNlIGxhYmVsID0gdG90YWxMb2FkZWQgKyAoY3R4LmRvbmUgPyAnJyA6ICcrJyk7CiAgICAgIGN0eC5jb3VudEVsLnRleHRDb250ZW50ID0gdG90YWxMb2FkZWQgfHwgKGN0eC5xdWVyeSB8fCBjdHguaW5kdXN0cnkpID8gbGFiZWwgOiAnJzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNwaW5uZXJOb2RlKCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuc3Bpbm5lciA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudWkuc3Bpbm5lcigpOwogICAgcmV0dXJuIGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3Bpbm5lcicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKICB9CgogIGZ1bmN0aW9uIG9wZW5MaWJyYXJ5KCkgewogICAgY3R4LnNvdXJjZSA9ICdsaWJyYXJ5JzsKICAgIGN0eC5mb2xkZXJJRCA9IG51bGw7CiAgICBjdHgucXVlcnkgPSAnJzsgY3R4LmluZHVzdHJ5ID0gbnVsbDsKICAgIGNsb3NlTWVudSgpOwogICAgaWYgKGN0eC5zZWxlY3RNb2RlKSBleGl0U2VsZWN0KCk7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICBsb2FkTmV4dCh0cnVlKTsKICB9CiAgZnVuY3Rpb24gb3BlbkZhdm9yaXRlcygpIHsKICAgIGN0eC5zb3VyY2UgPSAnZmF2b3JpdGVzJzsKICAgIGN0eC5mb2xkZXJJRCA9IG51bGw7CiAgICBjdHgucXVlcnkgPSAnJzsgY3R4LmluZHVzdHJ5ID0gbnVsbDsKICAgIGNsb3NlTWVudSgpOwogICAgaWYgKGN0eC5zZWxlY3RNb2RlKSBleGl0U2VsZWN0KCk7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICBsb2FkTmV4dCh0cnVlKTsKICB9CiAgZnVuY3Rpb24gb3BlbkZvbGRlcihpZCkgewogICAgY3R4LnNvdXJjZSA9ICdmb2xkZXInOwogICAgY3R4LmZvbGRlcklEID0gaWQ7CiAgICBjdHgucXVlcnkgPSAnJzsgY3R4LmluZHVzdHJ5ID0gbnVsbDsKICAgIGNsb3NlTWVudSgpOwogICAgaWYgKGN0eC5zZWxlY3RNb2RlKSBleGl0U2VsZWN0KCk7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICBsb2FkTmV4dCh0cnVlKTsKICB9CgogIGZ1bmN0aW9uIG9uS2V5KGUpIHsKICAgIGlmICghY3R4IHx8ICFjdHgucm9vdCB8fCAhY3R4LnJvb3QuaXNDb25uZWN0ZWQpIHJldHVybjsKICAgIHZhciB0YWcgPSAoZS50YXJnZXQgJiYgZS50YXJnZXQudGFnTmFtZSkgfHwgJyc7CiAgICB2YXIgdHlwaW5nID0gdGFnID09PSAnSU5QVVQnIHx8IHRhZyA9PT0gJ1RFWFRBUkVBJyB8fCB0YWcgPT09ICdTRUxFQ1QnIHx8IChlLnRhcmdldCAmJiBlLnRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSk7CiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7CiAgICAgIGlmIChjdHgubWVudUVsKSB7IGNsb3NlTWVudSgpOyByZXR1cm47IH0KICAgICAgaWYgKGN0eC5zZWxlY3RNb2RlKSB7IGV4aXRTZWxlY3QoKTsgcmV0dXJuOyB9CiAgICB9CiAgICBpZiAodHlwaW5nKSByZXR1cm47CiAgICBpZiAoY3R4LnNlbGVjdE1vZGUgJiYgKGUua2V5ID09PSAnYScgfHwgZS5rZXkgPT09ICdBJykgJiYgKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgc2VsZWN0QWxsVmlzaWJsZSgpOyByZXR1cm47CiAgICB9CiAgICBpZiAoY3R4LnNlbGVjdE1vZGUgJiYgKGUua2V5ID09PSAnRGVsZXRlJyB8fCBlLmtleSA9PT0gJ0JhY2tzcGFjZScpKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgYmF0Y2hEZWxldGUoKTsgcmV0dXJuOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVuZGVyKHJvb3QsIHBhcmFtcykgewogICAgdGVhcmRvd24oKTsKICAgIGN0eCA9IGZyZXNoQ3R4KCk7CiAgICBjdHgucm9vdCA9IHJvb3Q7CgogICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgndi12aWV3LWxpYnJhcnknKTsKCiAgICBjdHguc2Nyb2xsVGFyZ2V0ID0gZmluZFNjcm9sbFBhcmVudChyb290KSB8fCB3aW5kb3c7CgogICAgdmFyIHRpdGxlID0gZWwoJ2gxJywgeyBjbGFzczogJ3YtbGliLXRpdGxlJyB9LCBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWdyYWRpZW50JywgdGV4dDogJ0xpYnJhcnknIH0pLCBjdHguY291bnRFbCA9IGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbGliLWNvdW50JyB9KSk7CiAgICBTKHRpdGxlLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmJhc2VsaW5lO2dhcDoxMHB4O21hcmdpbjowO2ZvbnQtc2l6ZTpjbGFtcCgyOHB4LDV2dyw0MHB4KTtsZXR0ZXItc3BhY2luZzotMC4wMmVtJyk7CiAgICBTKGN0eC5jb3VudEVsLCAnZm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NTAwO2NvbG9yOnZhcigtLXYtaW5rLXNvZnQsIHJnYmEoMjQ1LDI0NSwyNDcsLjU1KSknKTsKICAgIHZhciBoZWFkZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtbGliLWhlYWRlcicgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi10aXRsZXdyYXAnIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1leWVicm93JywgdGV4dDogJ1lvdXIgV29yaycgfSksCiAgICAgICAgdGl0bGUKICAgICAgKSwKICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgb25jbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9jcmVhdGUnKTsgfSB9LCBpY29uKCdwbHVzJyksICdDcmVhdGUnKQogICAgKTsKICAgIFMoaGVhZGVyLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtZW5kO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2dhcDoxNnB4O2ZsZXgtd3JhcDp3cmFwO21hcmdpbi1ib3R0b206dmFyKC0tc3BhY2UtbGcsMjRweCknKTsKCiAgICBjdHgudG9vbGJhckVsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi10b29sYmFyLXdyYXAnIH0pOwogICAgY3R4LmdyaWRFbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tYXNvbnJ5IHYtbGliLWdyaWQnIH0pOwogICAgY3R4LnN0YXR1c0VsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi1zdGF0dXMnLCAnYXJpYS1saXZlJzogJ3BvbGl0ZScgfSk7CgogICAgcm9vdC5hcHBlbmRDaGlsZChoZWFkZXIpOwogICAgcm9vdC5hcHBlbmRDaGlsZChjdHgudG9vbGJhckVsKTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQoY3R4LmdyaWRFbCk7CiAgICByb290LmFwcGVuZENoaWxkKGN0eC5zdGF0dXNFbCk7CgogICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgaWYgKHBhcmFtcy5mYXYgPT09ICcxJyB8fCBwYXJhbXMuZmF2ID09PSAndHJ1ZScpIGN0eC5zb3VyY2UgPSAnZmF2b3JpdGVzJzsKICAgIGlmIChwYXJhbXMuZm9sZGVyKSB7IGN0eC5zb3VyY2UgPSAnZm9sZGVyJzsgY3R4LmZvbGRlcklEID0gcGFyYW1zLmZvbGRlcjsgfQogICAgaWYgKHBhcmFtcy5zb3J0KSBjdHguc29ydCA9IHBhcmFtcy5zb3J0OwogICAgaWYgKHBhcmFtcy5xKSBjdHgucXVlcnkgPSBwYXJhbXMucTsKCiAgICByZW5kZXJUb29sYmFyKCk7CgogICAgbG9hZEZvbGRlcnMoKS50aGVuKGZ1bmN0aW9uICgpIHsgaWYgKGN0eCAmJiBjdHguc291cmNlID09PSAnZm9sZGVyJykgcmVuZGVyVG9vbGJhcigpOyB9KTsKCiAgICB2YXIgc2VlZGVkID0gZmFsc2U7CiAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2xpYnJhcnknICYmIFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuZ2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGNhY2hlZCA9IFYuc3RvcmUuZ2V0KCdsaWJyYXJ5Jyk7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2FjaGVkKSAmJiBjYWNoZWQubGVuZ3RoKSB7CiAgICAgICAgICBjdHguaXRlbXMgPSBjYWNoZWQuc2xpY2UoKTsKICAgICAgICAgIHNlZWRlZCA9IHRydWU7CiAgICAgICAgICByZW5kZXJHcmlkKCk7CiAgICAgICAgICByZW5kZXJTdGF0dXMoKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9CgogICAgbG9hZE5leHQodHJ1ZSkudGhlbihmdW5jdGlvbiAoKSB7IHJlc3RvcmVTY3JvbGwoKTsgfSk7CiAgICBpZiAoc2VlZGVkKSByZXN0b3JlU2Nyb2xsKCk7CgogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5LCBmYWxzZSk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZW5zdXJlRmlsbCwgZmFsc2UpOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uV2luZG93U2Nyb2xsLCB0cnVlKTsKCiAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBjdHguX3Vuc3ViID0gVi5zdG9yZS5vbignbGlicmFyeTpjaGFuZ2VkJywgZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChjdHggJiYgIWN0eC5fc2VsZldyaXRlICYmICFjdHgubG9hZGluZyAmJiBjdHgucm9vdCAmJiBjdHgucm9vdC5pc0Nvbm5lY3RlZCkgbG9hZE5leHQodHJ1ZSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gb25XaW5kb3dTY3JvbGwoKSB7CiAgICBpZiAoIWN0eCB8fCBjdHgubG9hZGluZyB8fCBjdHguZG9uZSB8fCAhY3R4LmdyaWRFbCkgcmV0dXJuOwogICAgaWYgKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicgaW4gd2luZG93KSByZXR1cm47CiAgICBpZiAoY3R4LnF1ZXJ5IHx8IGN0eC5zb3VyY2UgPT09ICdmYXZvcml0ZXMnKSByZXR1cm47CiAgICB2YXIgZG9jSCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgfHwgd2luZG93LmlubmVySGVpZ2h0OwogICAgaWYgKGN0eC5ncmlkRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIDwgZG9jSCArIDYwMCkgbG9hZE5leHQoZmFsc2UpOwogIH0KCiAgZnVuY3Rpb24gZmluZFNjcm9sbFBhcmVudChub2RlKSB7CiAgICB2YXIgcCA9IG5vZGUgJiYgbm9kZS5wYXJlbnRFbGVtZW50OwogICAgd2hpbGUgKHAgJiYgcCAhPT0gZG9jdW1lbnQuYm9keSkgewogICAgICB2YXIgb3kgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwKS5vdmVyZmxvd1k7CiAgICAgIGlmICgob3kgPT09ICdhdXRvJyB8fCBveSA9PT0gJ3Njcm9sbCcpICYmIHAuc2Nyb2xsSGVpZ2h0ID4gcC5jbGllbnRIZWlnaHQpIHJldHVybiBwOwogICAgICBwID0gcC5wYXJlbnRFbGVtZW50OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiB0ZWFyZG93bigpIHsKICAgIGlmICghY3R4KSByZXR1cm47CiAgICBjbG9zZU1lbnUoKTsKICAgIHJlbW92ZVNlbnRpbmVsKCk7CiAgICBpZiAodHlwZW9mIGN0eC5fdW5zdWIgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgY3R4Ll91bnN1YigpOyB9IGNhdGNoIChlKSB7fSB9CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXksIGZhbHNlKTsKICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBlbnN1cmVGaWxsLCBmYWxzZSk7CiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25XaW5kb3dTY3JvbGwsIHRydWUpOwogICAgaWYgKGN0eC5yb290KSBjdHgucm9vdC5jbGFzc0xpc3QucmVtb3ZlKCd2LXZpZXctbGlicmFyeScpOwogICAgY3R4ID0gbnVsbDsKICB9CgogIFYudmlld3MubGlicmFyeSA9IHsgcmVuZGVyOiByZW5kZXIsIHRlYXJkb3duOiB0ZWFyZG93biB9OwoKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvc3R1ZGlvLmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLnZpZXdzID0gVi52aWV3cyB8fCB7fTsKCiAgdmFyIEFDQ0VOVCA9ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknOwogIHZhciBBQ0NFTlRfU09GVCA9ICd2YXIoLS12YW1wLWFjY2VudC1zb2Z0LCAjODJENkZGKSc7CiAgdmFyIEVSUk9SID0gJ3ZhcigtLWNvbG9yLWVycm9yLCAjRjczMzYzKSc7CiAgdmFyIElOSyA9ICd2YXIoLS12LWluaywgI2Y1ZjVmNyknOwogIHZhciBJTktfU09GVCA9ICd2YXIoLS12LWluay1zb2Z0LCByZ2JhKDI0NSwyNDUsMjQ3LC42NikpJzsKICB2YXIgTElORSA9ICd2YXIoLS12LWxpbmUsIHJnYmEoMjQ1LDI0NSwyNDcsLjE1KSknOwogIHZhciBDQVJEX0JHID0gJ3ZhcigtLXYtY2FyZC1iZywgcmdiYSgyNTUsMjU1LDI1NSwuMDQpKSc7CgogIHZhciBfcm9vdCA9IG51bGw7CiAgdmFyIF9ub2RlID0gbnVsbDsKICB2YXIgX2ltYWdlID0gbnVsbDsKICB2YXIgX3NpYmxpbmdzID0gW107CiAgdmFyIF9pbmRleCA9IC0xOwogIHZhciBfc2NydWJOb2RlID0gbnVsbDsKICB2YXIgX3BvbGxBYm9ydCA9IG51bGw7CiAgdmFyIF9rZXlIYW5kbGVyID0gbnVsbDsKICB2YXIgX3Bhc3RlSGFuZGxlciA9IG51bGw7CiAgdmFyIF9yZXNpemVIYW5kbGVyID0gbnVsbDsKICB2YXIgX2Rpc3Bvc2VkID0gZmFsc2U7CgogIGZ1bmN0aW9uIFUoKSB7IHJldHVybiBWLnV0aWwgfHwge307IH0KICBmdW5jdGlvbiBVSSgpIHsgcmV0dXJuIFYudWkgfHwge307IH0KICBmdW5jdGlvbiBBUEkoKSB7IHJldHVybiBWLmFwaSB8fCB7fTsgfQogIGZ1bmN0aW9uIFNUKCkgeyByZXR1cm4gVi5zdGF0ZSB8fCB7fTsgfQoKICBmdW5jdGlvbiBlbCh0YWcsIGF0dHJzKSB7CiAgICB2YXIgdWkgPSBVSSgpOwogICAgaWYgKHVpICYmIHR5cGVvZiB1aS5lbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHVpLmVsLmFwcGx5KHVpLCBhcmd1bWVudHMpOwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMpIHsKICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwogICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybjsKICAgICAgICBpZiAoayA9PT0gJ2NsYXNzJykgbm9kZS5jbGFzc05hbWUgPSB2OwogICAgICAgIGVsc2UgaWYgKGsgPT09ICd0ZXh0Jykgbm9kZS50ZXh0Q29udGVudCA9IHY7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ3N0eWxlJyAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcpIE9iamVjdC5hc3NpZ24obm9kZS5zdHlsZSwgdik7CiAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdvbicpID09PSAwICYmIHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCB2KTsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ2RhdGEtJykgPT09IDAgfHwgay5pbmRleE9mKCdhcmlhLScpID09PSAwKSBub2RlLnNldEF0dHJpYnV0ZShrLCB2KTsKICAgICAgICBlbHNlIGlmIChrIGluIG5vZGUpIHsgdHJ5IHsgbm9kZVtrXSA9IHY7IH0gY2F0Y2ggKGUpIHsgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdik7IH0gfQogICAgICAgIGVsc2Ugbm9kZS5zZXRBdHRyaWJ1dGUoaywgdik7CiAgICAgIH0pOwogICAgfQogICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGMgPSBhcmd1bWVudHNbaV07CiAgICAgIGlmIChjID09IG51bGwpIGNvbnRpbnVlOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgYy5mb3JFYWNoKGZ1bmN0aW9uIChjYykgeyBpZiAoY2MgIT0gbnVsbCkgbm9kZS5hcHBlbmRDaGlsZCh0ZXh0T3JOb2RlKGNjKSk7IH0pOwogICAgICBlbHNlIG5vZGUuYXBwZW5kQ2hpbGQodGV4dE9yTm9kZShjKSk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CiAgZnVuY3Rpb24gdGV4dE9yTm9kZShjKSB7CiAgICByZXR1cm4gKHR5cGVvZiBjID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYyA9PT0gJ251bWJlcicpID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGMpKSA6IGM7CiAgfQoKICBmdW5jdGlvbiBjYWNoZVNyYyhpbWcsIHVybCkgewogICAgaWYgKCFpbWcgfHwgIXVybCkgcmV0dXJuOwogICAgaWYgKFYuaW1nQ2FjaGUgJiYgVi5pbWdDYWNoZS5hdmFpbGFibGUgJiYgdHlwZW9mIFYuaW1nQ2FjaGUuYXBwbHkgPT09ICdmdW5jdGlvbicpIHsKICAgICAgVi5pbWdDYWNoZS5hcHBseShpbWcsIHVybCk7CiAgICB9IGVsc2UgewogICAgICBpbWcuc3JjID0gdXJsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaWNvbihuYW1lKSB7CiAgICB2YXIgdWkgPSBVSSgpOwogICAgaWYgKHVpICYmIHR5cGVvZiB1aS5pY29uID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciByID0gdWkuaWNvbihuYW1lKTsKICAgICAgaWYgKHR5cGVvZiByID09PSAnc3RyaW5nJykgewogICAgICAgIHZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgICAgc3Bhbi5pbm5lckhUTUwgPSByOwogICAgICAgIHJldHVybiBzcGFuOwogICAgICB9CiAgICAgIGlmIChyICYmIHIubm9kZVR5cGUpIHJldHVybiByOwogICAgfQogICAgdmFyIGZhbGxiYWNrID0gewogICAgICBlZGl0OiAn4pyOJywgdmFyaWF0aW9uczogJ+KGuycsIGFuaW1hdGU6ICfilrYnLCBkb3dubG9hZDogJ+KkkycsCiAgICAgIGhlYXJ0OiAn4pmhJywgJ2hlYXJ0LmZpbGwnOiAn4pmlJywgdHJhc2g6ICfinJUnLCBzaGFyZTogJ+KGlycsCiAgICAgIHB1Ymxpc2g6ICfimIEnLCBib29rbWFyazogJ+KYhicsIGNvcHk6ICfip4knLCBjbG9zZTogJ+KclScsCiAgICAgIHBob3RvOiAn4pajJywgdmlkZW86ICfilrYnLCBhcnJvd0xlZnQ6ICfigLknLCBhcnJvd1JpZ2h0OiAn4oC6JywKICAgICAgaW5mbzogJ2knLCBzcGFya2xlczogJ+KcqCcKICAgIH07CiAgICB2YXIgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgIHMuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICBzLnRleHRDb250ZW50ID0gZmFsbGJhY2tbbmFtZV0gfHwgJ+KAoic7CiAgICByZXR1cm4gczsKICB9CgogIGZ1bmN0aW9uIHRvYXN0KG1zZywga2luZCkgewogICAgdmFyIHVpID0gVUkoKTsKICAgIGlmICh1aSAmJiB0eXBlb2YgdWkudG9hc3QgPT09ICdmdW5jdGlvbicpIHsgdWkudG9hc3QobXNnLCBraW5kIHx8ICdpbmZvJyk7IHJldHVybjsgfQogICAgdHJ5IHsgKFYuc3RvcmUgJiYgVi5zdG9yZS5lbWl0KSAmJiBWLnN0b3JlLmVtaXQoJ3RvYXN0JywgeyBtc2c6IG1zZywga2luZDoga2luZCB8fCAnaW5mbycgfSk7IH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiBjb25maXJtRGlhbG9nKG1zZywgb3B0cykgewogICAgdmFyIHVpID0gVUkoKTsKICAgIGlmICh1aSAmJiB0eXBlb2YgdWkuY29uZmlybSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1aS5jb25maXJtKG1zZywgb3B0cyB8fCB7fSkpOwogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh3aW5kb3cuY29uZmlybShtc2cpKTsKICB9CgogIGZ1bmN0aW9uIGdvKGhhc2gpIHsKICAgIGlmIChWLnJvdXRlciAmJiB0eXBlb2YgVi5yb3V0ZXIuZ28gPT09ICdmdW5jdGlvbicpIFYucm91dGVyLmdvKGhhc2gpOwogICAgZWxzZSB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiBmbXREYXRlKGQpIHsKICAgIHZhciB1ID0gVSgpOwogICAgaWYgKHUgJiYgdHlwZW9mIHUuZm10RGF0ZSA9PT0gJ2Z1bmN0aW9uJykgeyB0cnkgeyByZXR1cm4gdS5mbXREYXRlKGQpOyB9IGNhdGNoIChlKSB7fSB9CiAgICB2YXIgZGF0ZSA9IHBhcnNlRGF0ZShkKTsKICAgIGlmICghZGF0ZSkgcmV0dXJuICcnOwogICAgdHJ5IHsgcmV0dXJuIGRhdGUudG9Mb2NhbGVTdHJpbmcoKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gU3RyaW5nKGQpOyB9CiAgfQoKICBmdW5jdGlvbiBwYXJzZURhdGUoZCkgewogICAgaWYgKGQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAoZCBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBpc05hTihkLmdldFRpbWUoKSkgPyBudWxsIDogZDsKICAgIGlmICh0eXBlb2YgZCA9PT0gJ251bWJlcicpIHsKICAgICAgdmFyIG1zID0gZCA+IDFlMTIgPyBkIDogZCAqIDEwMDA7CiAgICAgIHZhciBkdCA9IG5ldyBEYXRlKG1zKTsKICAgICAgcmV0dXJuIGlzTmFOKGR0LmdldFRpbWUoKSkgPyBudWxsIDogZHQ7CiAgICB9CiAgICBpZiAodHlwZW9mIGQgPT09ICdzdHJpbmcnKSB7CiAgICAgIHZhciBwID0gbmV3IERhdGUoZCk7CiAgICAgIGlmICghaXNOYU4ocC5nZXRUaW1lKCkpKSByZXR1cm4gcDsKICAgICAgdmFyIG4gPSBOdW1iZXIoZCk7CiAgICAgIGlmICghaXNOYU4obikpIHJldHVybiBwYXJzZURhdGUobik7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIGRvd25sb2FkKHVybCwgZmlsZW5hbWUpIHsKICAgIHZhciB1ID0gVSgpOwogICAgaWYgKHUgJiYgdHlwZW9mIHUuZG93bmxvYWQgPT09ICdmdW5jdGlvbicpIHsgdS5kb3dubG9hZCh1cmwsIGZpbGVuYW1lKTsgcmV0dXJuOyB9CiAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgIGEuaHJlZiA9IHVybDsgYS5kb3dubG9hZCA9IGZpbGVuYW1lIHx8ICcnOyBhLnJlbCA9ICdub29wZW5lcic7IGEudGFyZ2V0ID0gJ19ibGFuayc7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOyBhLmNsaWNrKCk7IGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7CiAgfQoKICBmdW5jdGlvbiBpbWFnZUlEKGltZykgeyByZXR1cm4gaW1nID8gKGltZy5yZW1vdGVJRCB8fCBpbWcuaWQgfHwgbnVsbCkgOiBudWxsOyB9CgogIGZ1bmN0aW9uIGlzT3duSW1hZ2UoaW1nKSB7CiAgICBpZiAoIWltZykgcmV0dXJuIGZhbHNlOwogICAgdmFyIGxpYiA9IFNUKCkubGlicmFyeSB8fCBbXTsKICAgIHZhciBpZCA9IGltYWdlSUQoaW1nKTsKICAgIHJldHVybiBsaWIuc29tZShmdW5jdGlvbiAoeCkgeyByZXR1cm4gaW1hZ2VJRCh1bndyYXAoeCkpID09PSBpZDsgfSk7CiAgfQoKICBmdW5jdGlvbiBtb2RlbExhYmVsKHJhdykgewogICAgaWYgKCFyYXcpIHJldHVybiAnJzsKICAgIHZhciBtb2RlbHMgPSAoVi5kYXRhICYmIFYuZGF0YS5tb2RlbHMpIHx8IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbHMubGVuZ3RoOyBpKyspIHsgaWYgKG1vZGVsc1tpXS5yYXcgPT09IHJhdykgcmV0dXJuIG1vZGVsc1tpXS5sYWJlbDsgfQogICAgcmV0dXJuIHJhdzsKICB9CgogIGZ1bmN0aW9uIG1vZGVsQ29zdChyYXcpIHsKICAgIHZhciBtb2RlbHMgPSAoVi5kYXRhICYmIFYuZGF0YS5tb2RlbHMpIHx8IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbHMubGVuZ3RoOyBpKyspIHsgaWYgKG1vZGVsc1tpXS5yYXcgPT09IHJhdyAmJiB0eXBlb2YgbW9kZWxzW2ldLmNvc3QgPT09ICdudW1iZXInKSByZXR1cm4gbW9kZWxzW2ldLmNvc3Q7IH0KICAgIHZhciB0MmkgPSBWLmRhdGEgJiYgVi5kYXRhLnQyaU1vZGVsOwogICAgaWYgKHQyaSAmJiB0MmkucmF3ID09PSByYXcgJiYgdHlwZW9mIHQyaS5jb3N0ID09PSAnbnVtYmVyJykgcmV0dXJuIHQyaS5jb3N0OwogICAgcmV0dXJuIDEwOwogIH0KCiAgZnVuY3Rpb24gaW1hZ2VEaW1lbnNpb25zKGltZykgewogICAgaWYgKCFpbWcpIHJldHVybiBudWxsOwogICAgdmFyIHcgPSBpbWcud2lkdGggfHwgaW1nLmltYWdlV2lkdGggfHwgKGltZy5pbWFnZV9zaXplICYmIGltZy5pbWFnZV9zaXplLndpZHRoKSB8fCAoaW1nLmltYWdlU2l6ZSAmJiBpbWcuaW1hZ2VTaXplLndpZHRoKSB8fCBudWxsOwogICAgdmFyIGggPSBpbWcuaGVpZ2h0IHx8IGltZy5pbWFnZUhlaWdodCB8fCAoaW1nLmltYWdlX3NpemUgJiYgaW1nLmltYWdlX3NpemUuaGVpZ2h0KSB8fCAoaW1nLmltYWdlU2l6ZSAmJiBpbWcuaW1hZ2VTaXplLmhlaWdodCkgfHwgbnVsbDsKICAgIGlmICh3ICYmIGgpIHJldHVybiBNYXRoLnJvdW5kKHcpICsgJyDDlyAnICsgTWF0aC5yb3VuZChoKTsKICAgIGlmICh0eXBlb2YgaW1nLmFzcGVjdFJhdGlvID09PSAnbnVtYmVyJyAmJiBpbWcuYXNwZWN0UmF0aW8gPiAwKSB7CiAgICAgIHJldHVybiBpbWcuYXNwZWN0UmF0aW8gPj0gMSA/ICdMYW5kc2NhcGUnIDogJ1BvcnRyYWl0JzsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gY3JlZGl0Q29zdChpbWcpIHsKICAgIGlmICghaW1nKSByZXR1cm4gbnVsbDsKICAgIGlmICh0eXBlb2YgaW1nLmNyZWRpdHNDb3N0ID09PSAnbnVtYmVyJykgcmV0dXJuIGltZy5jcmVkaXRzQ29zdDsKICAgIGlmICh0eXBlb2YgaW1nLmNyZWRpdENvc3QgPT09ICdudW1iZXInKSByZXR1cm4gaW1nLmNyZWRpdENvc3Q7CiAgICBpZiAodHlwZW9mIGltZy5jb3N0ID09PSAnbnVtYmVyJykgcmV0dXJuIGltZy5jb3N0OwogICAgaWYgKGltZy52aWRlb1VSTCkgcmV0dXJuIDUwOwogICAgaWYgKGltZy5tb2RlbCkgcmV0dXJuIG1vZGVsQ29zdChpbWcubW9kZWwpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiByYXRlKHJlbW90ZUlELCBhY3Rpb24pIHsKICAgIGlmICghcmVtb3RlSUQpIHJldHVybjsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIGlmIChhcGkgJiYgdHlwZW9mIGFwaS5yYXRpbmcgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdHJ5IHsgUHJvbWlzZS5yZXNvbHZlKGFwaS5yYXRpbmcocmVtb3RlSUQsIGFjdGlvbikpLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsgfSBjYXRjaCAoZSkge30KICAgIH0KICB9CgogIGZ1bmN0aW9uIGJ1c3koYnRuLCBvbikgewogICAgaWYgKCFidG4pIHJldHVybjsKICAgIGJ0bi5kaXNhYmxlZCA9ICEhb247CiAgICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLWJ1c3knLCBvbiA/ICd0cnVlJyA6ICdmYWxzZScpOwogICAgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2lzLWJ1c3knLCAhIW9uKTsKICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gb24gPyAnMC42JyA6ICcnOwogICAgYnRuLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBvbiA/ICdub25lJyA6ICcnOwogIH0KCiAgZnVuY3Rpb24gZmluZEluU3RhdGUoaWQpIHsKICAgIGlmICghaWQpIHJldHVybiBudWxsOwogICAgdmFyIHBvb2xzID0gW1NUKCkubGlicmFyeSB8fCBbXSwgU1QoKS5mZWVkIHx8IFtdXTsKICAgIGZvciAodmFyIHAgPSAwOyBwIDwgcG9vbHMubGVuZ3RoOyBwKyspIHsKICAgICAgdmFyIHBvb2wgPSBwb29sc1twXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb29sLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGltZyA9IHVud3JhcChwb29sW2ldKTsKICAgICAgICBpZiAoaW1hZ2VJRChpbWcpID09PSBpZCB8fCAoaW1nICYmIGltZy5pZCA9PT0gaWQpIHx8IChpbWcgJiYgaW1nLnJlbW90ZUlEID09PSBpZCkpIHJldHVybiBpbWc7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gdW53cmFwKGl0ZW0pIHsKICAgIGlmICghaXRlbSkgcmV0dXJuIGl0ZW07CiAgICBpZiAoaXRlbS5nZW5lcmF0ZWRJbWFnZSkgcmV0dXJuIGl0ZW0uZ2VuZXJhdGVkSW1hZ2U7CiAgICByZXR1cm4gaXRlbTsKICB9CgogIGZ1bmN0aW9uIHJlc29sdmVJbWFnZShpZCkgewogICAgdmFyIGxvY2FsID0gZmluZEluU3RhdGUoaWQpOwogICAgaWYgKGxvY2FsKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGxvY2FsKTsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIGlmIChhcGkgJiYgdHlwZW9mIGFwaS5saWJyYXJ5ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciBwYWdlID0gMSwgcGVyID0gNjAsIG1heFBhZ2VzID0gNTsKICAgICAgdmFyIHN0ZXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkubGlicmFyeShwYWdlLCBwZXIpKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgIHZhciBpdGVtcyA9IChyZXMgJiYgKHJlcy5pdGVtcyB8fCByZXMpKSB8fCBbXTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGltZyA9IHVud3JhcChpdGVtc1tpXSk7CiAgICAgICAgICAgIGlmIChpbWFnZUlEKGltZykgPT09IGlkKSByZXR1cm4gaW1nOwogICAgICAgICAgfQogICAgICAgICAgdmFyIG1ldGEgPSByZXMgJiYgcmVzLm1ldGFkYXRhOwogICAgICAgICAgdmFyIG1vcmUgPSBpdGVtcy5sZW5ndGggPj0gcGVyICYmICghbWV0YSB8fCBwYWdlICogcGVyIDwgbWV0YS50b3RhbCkgJiYgcGFnZSA8IG1heFBhZ2VzOwogICAgICAgICAgaWYgKG1vcmUpIHsgcGFnZSsrOyByZXR1cm4gc3RlcCgpOyB9CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9KTsKICAgICAgfTsKICAgICAgcmV0dXJuIHN0ZXAoKTsKICAgIH0KICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7CiAgfQoKICBmdW5jdGlvbiBidWlsZFNpYmxpbmdzKGltZykgewogICAgdmFyIGxpYiA9IChTVCgpLmxpYnJhcnkgfHwgW10pLm1hcCh1bndyYXApOwogICAgdmFyIGZlZWQgPSAoU1QoKS5mZWVkIHx8IFtdKS5tYXAodW53cmFwKTsKICAgIHZhciBpZCA9IGltYWdlSUQoaW1nKTsKICAgIGlmIChsaWIuc29tZShmdW5jdGlvbiAoeCkgeyByZXR1cm4gaW1hZ2VJRCh4KSA9PT0gaWQ7IH0pKSByZXR1cm4gbGliOwogICAgaWYgKGZlZWQuc29tZShmdW5jdGlvbiAoeCkgeyByZXR1cm4gaW1hZ2VJRCh4KSA9PT0gaWQ7IH0pKSByZXR1cm4gZmVlZDsKICAgIHJldHVybiBsaWIubGVuZ3RoID8gbGliIDogZmVlZDsKICB9CgogIGZ1bmN0aW9uIG5hdmlnYXRlKGRlbHRhKSB7CiAgICBpZiAoIV9zaWJsaW5ncy5sZW5ndGgpIHJldHVybjsKICAgIHZhciBuZXh0ID0gX2luZGV4ICsgZGVsdGE7CiAgICBpZiAobmV4dCA8IDAgfHwgbmV4dCA+PSBfc2libGluZ3MubGVuZ3RoKSByZXR1cm47CiAgICB2YXIgdGFyZ2V0ID0gX3NpYmxpbmdzW25leHRdOwogICAgdmFyIHRpZCA9IGltYWdlSUQodGFyZ2V0KTsKICAgIGlmICghdGlkKSByZXR1cm47CiAgICBnbygnIy9pbWFnZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHRpZCkpOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRNZWRpYSgpIHsKICAgIHZhciBzdGFnZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX3N0YWdlJywgJ2RhdGEtcm9sZSc6ICdzdGFnZScsIHN0eWxlOiB7CiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLCBmbGV4OiAnMSAxIGF1dG8nLCBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLAogICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsIG1pbkhlaWdodDogJzAnLCBtaW5XaWR0aDogJzAnLCB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICcxMDAlJwogICAgfSB9KTsKCiAgICB2YXIgaGFzVmlkZW8gPSAhIV9pbWFnZS52aWRlb1VSTDsKICAgIHZhciBoYXNCZWZvcmUgPSAhIV9pbWFnZS5yZW1vdGVPcmlnaW5hbEltYWdlVVJMICYmICEhX2ltYWdlLnJlbW90ZUltYWdlVVJMOwoKICAgIGlmIChoYXNWaWRlbykgewogICAgICB2YXIgdmlkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTsKICAgICAgdmlkLmNsYXNzTmFtZSA9ICd2LXN0dWRpb19fdmlkZW8nOwogICAgICB2aWQubXV0ZWQgPSB0cnVlOyB2aWQubG9vcCA9IHRydWU7IHZpZC5hdXRvcGxheSA9IHRydWU7CiAgICAgIHZpZC5zZXRBdHRyaWJ1dGUoJ3BsYXlzaW5saW5lJywgJycpOyB2aWQuc2V0QXR0cmlidXRlKCd3ZWJraXQtcGxheXNpbmxpbmUnLCAnJyk7CiAgICAgIHZpZC5wcmVsb2FkID0gJ2F1dG8nOwogICAgICB2aWQucG9zdGVyID0gX2ltYWdlLnJlbW90ZUltYWdlVVJMIHx8ICcnOwogICAgICB2aWQuc3JjID0gX2ltYWdlLnZpZGVvVVJMOwogICAgICB2aWQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0FuaW1hdGVkIHJlc3VsdCcpOwogICAgICBPYmplY3QuYXNzaWduKHZpZC5zdHlsZSwgbWVkaWFGaXRTdHlsZSgpKTsKICAgICAgdmlkLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkgewogICAgICAgIHN0YWdlLmNsYXNzTGlzdC5hZGQoJ2lzLWVycm9yJyk7CiAgICAgICAgc3RhZ2UuYXBwZW5kQ2hpbGQobWVkaWFFcnJvcignQ291bGRu4oCZdCBsb2FkIHRoZSB2aWRlby4nKSk7CiAgICAgIH0pOwogICAgICB2aWQucGxheSAmJiB2aWQucGxheSgpLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsKICAgICAgc3RhZ2UuYXBwZW5kQ2hpbGQodmlkKTsKICAgICAgaWYgKF9pbWFnZS5yZW1vdGVJbWFnZVVSTCkgc3RhZ2UuYXBwZW5kQ2hpbGQobWVkaWFUb2dnbGUoJ3Bob3RvJywgJ1Nob3cgc3RpbGwnLCBmdW5jdGlvbiAoKSB7IHNob3dTdGlsbChzdGFnZSk7IH0pKTsKICAgIH0gZWxzZSBpZiAoaGFzQmVmb3JlKSB7CiAgICAgIF9zY3J1Yk5vZGUgPSBidWlsZFNjcnViKCk7CiAgICAgIHN0YWdlLmFwcGVuZENoaWxkKF9zY3J1Yk5vZGUpOwogICAgfSBlbHNlIGlmIChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwpIHsKICAgICAgc3RhZ2UuYXBwZW5kQ2hpbGQoYnVpbGRTaW5nbGVJbWFnZShzdGFnZSkpOwogICAgfSBlbHNlIHsKICAgICAgc3RhZ2UuYXBwZW5kQ2hpbGQobWVkaWFFcnJvcignTm8gaW1hZ2UgYXZhaWxhYmxlLicpKTsKICAgIH0KICAgIHJldHVybiBzdGFnZTsKICB9CgogIGZ1bmN0aW9uIG1lZGlhRml0U3R5bGUoKSB7CiAgICByZXR1cm4gewogICAgICBtYXhXaWR0aDogJzEwMCUnLCBtYXhIZWlnaHQ6ICcxMDAlJywgd2lkdGg6ICdhdXRvJywgaGVpZ2h0OiAnYXV0bycsCiAgICAgIG9iamVjdEZpdDogJ2NvbnRhaW4nLCBib3JkZXJSYWRpdXM6ICd2YXIoLS12LXJhZGl1cywgMjRweCknLAogICAgICBib3hTaGFkb3c6ICcwIDMwcHggOTBweCAtMzBweCByZ2JhKDAsMCwwLC43KScsIGRpc3BsYXk6ICdibG9jaycKICAgIH07CiAgfQoKICBmdW5jdGlvbiBtZWRpYVRvZ2dsZShpY29uTmFtZSwgbGFiZWwsIG9uQ2xpY2spIHsKICAgIHZhciBidG4gPSBnbGFzc0J0bihpY29uTmFtZSwgbGFiZWwsIG9uQ2xpY2ssIHsgY29tcGFjdDogdHJ1ZSB9KTsKICAgIE9iamVjdC5hc3NpZ24oYnRuLnN0eWxlLCB7CiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLCBib3R0b206ICcxNnB4JywgbGVmdDogJzUwJScsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTUwJSknLCB6SW5kZXg6ICc0JwogICAgfSk7CiAgICByZXR1cm4gYnRuOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRTY3J1YigpIHsKICAgIHZhciB1aSA9IFVJKCk7CiAgICBpZiAodWkgJiYgdHlwZW9mIHVpLnNjcnViID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciBuID0gdWkuc2NydWIoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwsIF9pbWFnZS5yZW1vdGVJbWFnZVVSTCwgewogICAgICAgIGVhZ2VyOiB0cnVlLCBiZWZvcmVBbHQ6ICdCZWZvcmUgdHJhbnNmb3JtYXRpb24nLCBhZnRlckFsdDogJ0FmdGVyIHRyYW5zZm9ybWF0aW9uJwogICAgICB9KTsKICAgICAgaWYgKG4pIHsKICAgICAgICBPYmplY3QuYXNzaWduKG4uc3R5bGUsIHsKICAgICAgICAgIHdpZHRoOiAnMTAwJScsIG1heFdpZHRoOiAnbWluKDEwMCUsIDc4dmgpJywgbWF4SGVpZ2h0OiAnMTAwJScsIG1hcmdpbjogJzAgYXV0bycKICAgICAgICB9KTsKICAgICAgICBuLmNsYXNzTGlzdC5hZGQoJ3Ytc3R1ZGlvX19zY3J1YicpOwogICAgICAgIGRlY29yYXRlU2NydWIobik7CiAgICAgICAgcmV0dXJuIG47CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxsYmFja1NjcnViKF9pbWFnZS5yZW1vdGVPcmlnaW5hbEltYWdlVVJMLCBfaW1hZ2UucmVtb3RlSW1hZ2VVUkwpOwogIH0KCiAgZnVuY3Rpb24gZGVjb3JhdGVTY3J1YihmZWVkKSB7CiAgICB2YXIgY2FyZCA9IGZlZWQucXVlcnlTZWxlY3RvcignLnZjYXJkJyk7CiAgICBpZiAoIWNhcmQgfHwgY2FyZC5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX3NjcnViLWxhYmVsJykpIHJldHVybjsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX3NjcnViLWxhYmVsIHYtc3R1ZGlvX19zY3J1Yi1sYWJlbC0tYmVmb3JlJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCB0ZXh0OiAnQmVmb3JlJyB9KSk7CiAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3R1ZGlvX19zY3J1Yi1sYWJlbCB2LXN0dWRpb19fc2NydWItbGFiZWwtLWFmdGVyJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCB0ZXh0OiAnQWZ0ZXInIH0pKTsKICB9CgogIGZ1bmN0aW9uIGZhbGxiYWNrU2NydWIoYmVmb3JlVVJMLCBhZnRlclVSTCkgewogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3ZjYXJkJywgc3R5bGU6IHsKICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsIHdpZHRoOiAnMTAwJScsIG1heFdpZHRoOiAnbWluKDEwMCUsIDc4dmgpJywgbWF4SGVpZ2h0OiAnMTAwJScsCiAgICAgIG1hcmdpbjogJzAgYXV0bycsIGJvcmRlclJhZGl1czogJ3ZhcigtLXYtcmFkaXVzLCAyNHB4KScsIG92ZXJmbG93OiAnaGlkZGVuJywKICAgICAgYm94U2hhZG93OiAnMCAzMHB4IDkwcHggLTMwcHggcmdiYSgwLDAsMCwuNyknLCB0b3VjaEFjdGlvbjogJ25vbmUnLCBjdXJzb3I6ICdldy1yZXNpemUnCiAgICB9IH0pOwogICAgdmFyIGFmdGVyID0gZWwoJ2ltZycsIHsgY2xhc3M6ICd2YWZ0ZXInLCBhbHQ6ICdBZnRlcicsIGRyYWdnYWJsZTogZmFsc2UsCiAgICAgIHN0eWxlOiB7IGRpc3BsYXk6ICdibG9jaycsIHdpZHRoOiAnMTAwJScsIGhlaWdodDogJ2F1dG8nIH0gfSk7CiAgICBjYWNoZVNyYyhhZnRlciwgYWZ0ZXJVUkwpOwogICAgdmFyIGJlZm9yZSA9IGVsKCdpbWcnLCB7IGNsYXNzOiAndmJlZm9yZScsIGFsdDogJ0JlZm9yZScsIGRyYWdnYWJsZTogZmFsc2UsCiAgICAgIHN0eWxlOiB7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCBpbnNldDogJzAnLCB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICcxMDAlJywgb2JqZWN0Rml0OiAnY292ZXInIH0gfSk7CiAgICBjYWNoZVNyYyhiZWZvcmUsIGJlZm9yZVVSTCk7CiAgICB2YXIgaGFuZGxlID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2c2NydWInLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIHN0eWxlOiB7CiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB0b3A6ICcwJywgYm90dG9tOiAnMCcsIHdpZHRoOiAnMnB4JywgYmFja2dyb3VuZDogJ3JnYmEoMjU1LDI1NSwyNTUsLjkpJywKICAgICAgYm94U2hhZG93OiAnMCAwIDEycHggcmdiYSgwLDAsMCwuNSknLCBwb2ludGVyRXZlbnRzOiAnbm9uZScKICAgIH0gfSk7CiAgICB2YXIgYmVmb3JlTGFiZWwgPSBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXN0dWRpb19fc2NydWItbGFiZWwgdi1zdHVkaW9fX3NjcnViLWxhYmVsLS1iZWZvcmUnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIHRleHQ6ICdCZWZvcmUnIH0pOwogICAgdmFyIGFmdGVyTGFiZWwgPSBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXN0dWRpb19fc2NydWItbGFiZWwgdi1zdHVkaW9fX3NjcnViLWxhYmVsLS1hZnRlcicsICdhcmlhLWhpZGRlbic6ICd0cnVlJywgdGV4dDogJ0FmdGVyJyB9KTsKICAgIHdyYXAuYXBwZW5kQ2hpbGQoYWZ0ZXIpOyB3cmFwLmFwcGVuZENoaWxkKGJlZm9yZSk7IHdyYXAuYXBwZW5kQ2hpbGQoaGFuZGxlKTsKICAgIHdyYXAuYXBwZW5kQ2hpbGQoYmVmb3JlTGFiZWwpOyB3cmFwLmFwcGVuZENoaWxkKGFmdGVyTGFiZWwpOwogICAgdmFyIHBvcyA9IDAuNSwgZHJhZ2dpbmcgPSBmYWxzZSwgaWRsZSA9IG51bGwsIHQwID0gMDsKICAgIGZ1bmN0aW9uIHNldChwKSB7CiAgICAgIHBvcyA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHApKTsKICAgICAgYmVmb3JlLnN0eWxlLmNsaXBQYXRoID0gJ2luc2V0KDAgJyArICgoMSAtIHBvcykgKiAxMDApICsgJyUgMCAwKSc7CiAgICAgIGhhbmRsZS5zdHlsZS5sZWZ0ID0gKHBvcyAqIDEwMCkgKyAnJSc7CiAgICB9CiAgICBmdW5jdGlvbiBmcm9tRXZlbnQoZSkgewogICAgICB2YXIgciA9IHdyYXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHZhciB4ID0gKGUudG91Y2hlcyA/IGUudG91Y2hlc1swXS5jbGllbnRYIDogZS5jbGllbnRYKSAtIHIubGVmdDsKICAgICAgc2V0KHggLyByLndpZHRoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YXJ0SWRsZSgpIHsKICAgICAgc3RvcElkbGUoKTsKICAgICAgaWRsZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiBsb29wKHQpIHsKICAgICAgICBpZiAoZHJhZ2dpbmcpIHJldHVybjsKICAgICAgICBpZiAoIXQwKSB0MCA9IHQ7CiAgICAgICAgdmFyIHBoYXNlID0gKCh0IC0gdDApIC8gMjYwMCkgJSAxOwogICAgICAgIHNldCgwLjUgKyAwLjMgKiBNYXRoLnNpbihwaGFzZSAqIE1hdGguUEkgKiAyKSk7CiAgICAgICAgaWRsZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTsKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBzdG9wSWRsZSgpIHsgaWYgKGlkbGUpIHsgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWRsZSk7IGlkbGUgPSBudWxsOyB9IH0KICAgIHdyYXAuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBmdW5jdGlvbiAoZSkgewogICAgICBkcmFnZ2luZyA9IHRydWU7IHdyYXAuY2xhc3NMaXN0LmFkZCgnc2NydWJiaW5nJyk7IHN0b3BJZGxlKCk7CiAgICAgIGZyb21FdmVudChlKTsgdHJ5IHsgd3JhcC5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7IH0gY2F0Y2ggKGVyKSB7fQogICAgfSk7CiAgICB3cmFwLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgZnVuY3Rpb24gKGUpIHsgaWYgKGRyYWdnaW5nKSBmcm9tRXZlbnQoZSk7IH0pOwogICAgdmFyIGVuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKCFkcmFnZ2luZykgcmV0dXJuOwogICAgICBkcmFnZ2luZyA9IGZhbHNlOyB3cmFwLmNsYXNzTGlzdC5yZW1vdmUoJ3NjcnViYmluZycpOwogICAgICB0MCA9IDA7IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBpZiAoIWRyYWdnaW5nKSBzdGFydElkbGUoKTsgfSwgMjQwMCk7CiAgICB9OwogICAgd3JhcC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBlbmQpOwogICAgd3JhcC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTsKICAgIHNldCgwLjUpOyBzdGFydElkbGUoKTsKICAgIHdyYXAuZGVzdHJveSA9IHN0b3BJZGxlOwogICAgcmV0dXJuIHdyYXA7CiAgfQoKICBmdW5jdGlvbiBidWlsZFNpbmdsZUltYWdlKHN0YWdlKSB7CiAgICB2YXIgaW1nID0gZWwoJ2ltZycsIHsKICAgICAgY2xhc3M6ICd2LXN0dWRpb19faW1nJywgZHJhZ2dhYmxlOiBmYWxzZSwKICAgICAgYWx0OiBfaW1hZ2UucHJvbXB0ID8gKCdHZW5lcmF0ZWQgaW1hZ2U6ICcgKyBfaW1hZ2UucHJvbXB0KSA6ICdHZW5lcmF0ZWQgaW1hZ2UnLAogICAgICBzdHlsZTogbWVkaWFGaXRTdHlsZSgpCiAgICB9KTsKICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKCkgeyBzdGFnZS5jbGFzc0xpc3QuYWRkKCdpcy1sb2FkZWQnKTsgfSk7CiAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoKSB7CiAgICAgIHN0YWdlLmNsYXNzTGlzdC5hZGQoJ2lzLWVycm9yJyk7CiAgICAgIGltZy5yZXBsYWNlV2l0aChtZWRpYUVycm9yKCdDb3VsZG7igJl0IGxvYWQgdGhlIGltYWdlLicpKTsKICAgIH0pOwogICAgY2FjaGVTcmMoaW1nLCBfaW1hZ2UucmVtb3RlSW1hZ2VVUkwpOwogICAgcmV0dXJuIGltZzsKICB9CgogIGZ1bmN0aW9uIHNob3dTdGlsbChzdGFnZSkgewogICAgdmFyIGV4aXN0aW5nID0gc3RhZ2UucXVlcnlTZWxlY3RvcignLnYtc3R1ZGlvX192aWRlbycpOwogICAgaWYgKGV4aXN0aW5nKSBleGlzdGluZy5yZW1vdmUoKTsKICAgIHZhciBvbGRUb2dnbGUgPSBzdGFnZS5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX21lZGlhLXRvZ2dsZScpOwogICAgaWYgKG9sZFRvZ2dsZSkgb2xkVG9nZ2xlLnJlbW92ZSgpOwogICAgdmFyIGltZyA9IGJ1aWxkU2luZ2xlSW1hZ2Uoc3RhZ2UpOwogICAgc3RhZ2UuaW5zZXJ0QmVmb3JlKGltZywgc3RhZ2UuZmlyc3RDaGlsZCk7CiAgICB2YXIgYmFjayA9IG1lZGlhVG9nZ2xlKCd2aWRlbycsICdTaG93IHZpZGVvJywgZnVuY3Rpb24gKCkgeyByZWJ1aWxkTWVkaWEoKTsgfSk7CiAgICBzdGFnZS5hcHBlbmRDaGlsZChiYWNrKTsKICB9CgogIGZ1bmN0aW9uIG1lZGlhRXJyb3IobXNnKSB7CiAgICByZXR1cm4gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0dWRpb19fbWVkaWEtZXJyb3Igdi1lbXB0eScsIHJvbGU6ICdhbGVydCcsIHN0eWxlOiB7CiAgICAgIGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBnYXA6ICcxMHB4JywKICAgICAgY29sb3I6IElOS19TT0ZULCBwYWRkaW5nOiAnMjRweCcsIHRleHRBbGlnbjogJ2NlbnRlcicKICAgIH0gfSwgaWNvbignaW5mbycpLCBlbCgnc3BhbicsIHsgdGV4dDogbXNnIH0pKTsKICB9CgogIGZ1bmN0aW9uIGdsYXNzQnRuKGljb25OYW1lLCBsYWJlbCwgb25DbGljaywgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgYnRuID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6ICdnbGFzcy1idXR0b24gdi1zdHVkaW9fX2FjdGlvbicsCiAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICB0aXRsZTogbGFiZWwsCiAgICAgICdhcmlhLWxhYmVsJzogbGFiZWwsCiAgICAgICdhcmlhLXByZXNzZWQnOiBvcHRzLnRvZ2dsZSA/IChvcHRzLmFjdGl2ZSA/ICd0cnVlJyA6ICdmYWxzZScpIDogbnVsbAogICAgfSk7CiAgICBPYmplY3QuYXNzaWduKGJ0bi5zdHlsZSwgewogICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgYWxpZ25JdGVtczogJ2NlbnRlcicsCiAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJywgZ2FwOiAnNXB4JywgbWluV2lkdGg6ICc2NHB4JywKICAgICAgcGFkZGluZzogb3B0cy5jb21wYWN0ID8gJzlweCAxMnB4JyA6ICcxMXB4IDEwcHgnLAogICAgICBib3JkZXJSYWRpdXM6ICd2YXIoLS1yYWRpdXMtY29udGVudCwgMTJweCknLCBjdXJzb3I6ICdwb2ludGVyJywKICAgICAgY29sb3I6IElOSywgbGluZUhlaWdodDogJzEnLCBmbGV4OiAnMCAwIGF1dG8nLAogICAgICB0cmFuc2l0aW9uOiAndHJhbnNmb3JtIHZhcigtLWR1ci1pbnRlcmFjdGl2ZSwxNDBtcykgdmFyKC0tZ2xhc3MtZWFzZSksIGNvbG9yIHZhcigtLWR1ci1mYXN0LDkwbXMpIGVhc2UsIGJhY2tncm91bmQgdmFyKC0tZHVyLWZhc3QsOTBtcykgZWFzZScKICAgIH0pOwogICAgdmFyIGljb25XcmFwID0gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX2FjdGlvbi1pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBzdHlsZTogewogICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLCB3aWR0aDogJzI0cHgnLCBoZWlnaHQ6ICcyNHB4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJwogICAgfSB9LCBpY29uKGljb25OYW1lKSk7CiAgICBidG4uYXBwZW5kQ2hpbGQoaWNvbldyYXApOwogICAgaWYgKCFvcHRzLmNvbXBhY3QpIHsKICAgICAgYnRuLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3R1ZGlvX19hY3Rpb24tbGFiZWwnLCB0ZXh0OiBsYWJlbCwgc3R5bGU6IHsKICAgICAgICBmb250U2l6ZTogJzExcHgnLCBmb250V2VpZ2h0OiAnNjAwJywgY29sb3I6IElOS19TT0ZULCBsZXR0ZXJTcGFjaW5nOiAnLTAuMDFlbScKICAgICAgfSB9KSk7CiAgICB9CiAgICBhcHBseUFjdGlvblRvbmUoYnRuLCBvcHRzKTsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKCkgeyBpZiAoIWJ0bi5kaXNhYmxlZCkgYnRuLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKC0ycHgpJzsgfSk7CiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIGZ1bmN0aW9uICgpIHsgYnRuLnN0eWxlLnRyYW5zZm9ybSA9ICcnOyB9KTsKICAgIGlmICh0eXBlb2Ygb25DbGljayA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IG9uQ2xpY2soYnRuLCBlKTsgfSk7CiAgICB9CiAgICByZXR1cm4gYnRuOwogIH0KCiAgZnVuY3Rpb24gYXBwbHlBY3Rpb25Ub25lKGJ0biwgb3B0cykgewogICAgdmFyIGljb25XcmFwID0gYnRuLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uLWljb24nKTsKICAgIHZhciBsYWJlbCA9IGJ0bi5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX2FjdGlvbi1sYWJlbCcpOwogICAgaWYgKG9wdHMuZGFuZ2VyKSB7CiAgICAgIGJ0bi5zdHlsZS5jb2xvciA9IEVSUk9SOwogICAgICBpZiAoaWNvbldyYXApIGljb25XcmFwLnN0eWxlLmNvbG9yID0gRVJST1I7CiAgICAgIGlmIChsYWJlbCkgbGFiZWwuc3R5bGUuY29sb3IgPSBFUlJPUjsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG9wdHMucHJpbWFyeSB8fCBvcHRzLmFjdGl2ZSkgewogICAgICBidG4uc3R5bGUuY29sb3IgPSBBQ0NFTlQ7CiAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCAnICsgQUNDRU5UICsgJyAxNiUsIHRyYW5zcGFyZW50KSc7CiAgICAgIGlmIChpY29uV3JhcCkgaWNvbldyYXAuc3R5bGUuY29sb3IgPSBBQ0NFTlQ7CiAgICAgIGlmIChsYWJlbCkgbGFiZWwuc3R5bGUuY29sb3IgPSBBQ0NFTlQ7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpY29uV3JhcCkgaWNvbldyYXAuc3R5bGUuY29sb3IgPSBBQ0NFTlRfU09GVDsKICB9CgogIGZ1bmN0aW9uIGFjdEVkaXQoKSB7CiAgICB2YXIgcGFyYW1zID0gW107CiAgICBpZiAoX2ltYWdlLnByb21wdCkgcGFyYW1zLnB1c2goJ3Byb21wdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KF9pbWFnZS5wcm9tcHQpKTsKICAgIGlmIChfaW1hZ2UubW9kZWwpIHBhcmFtcy5wdXNoKCdtb2RlbD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KF9pbWFnZS5tb2RlbCkpOwogICAgaWYgKF9pbWFnZS5yZW1vdGVJbWFnZVVSTCkgcGFyYW1zLnB1c2goJ2ltYWdlPScgKyBlbmNvZGVVUklDb21wb25lbnQoX2ltYWdlLnJlbW90ZUltYWdlVVJMKSk7CiAgICBnbygnIy9jcmVhdGUnICsgKHBhcmFtcy5sZW5ndGggPyAnPycgKyBwYXJhbXMuam9pbignJicpIDogJycpKTsKICB9CgogIGZ1bmN0aW9uIGFjdFZhcmlhdGlvbnMoYnRuKSB7CiAgICB2YXIgbiA9IDQ7CiAgICB2YXIgbW9kZWwgPSBfaW1hZ2UubW9kZWwgfHwgKChWLmRhdGEgJiYgVi5kYXRhLm1vZGVscyAmJiBWLmRhdGEubW9kZWxzWzBdICYmIFYuZGF0YS5tb2RlbHNbMF0ucmF3KSB8fCAnZmx1eEtsZWluJyk7CiAgICB2YXIgdG90YWwgPSBtb2RlbENvc3QobW9kZWwpICogbjsKICAgIGNvbmZpcm1EaWFsb2coJ0dlbmVyYXRlICcgKyBuICsgJyB2YXJpYXRpb25zIG9mIHRoaXMgaW1hZ2U/IEFib3V0ICcgKyB0b3RhbCArICcgY3JlZGl0cy4nLCB7IHRpdGxlOiAnVmFyaWF0aW9ucycsIGNvbmZpcm1MYWJlbDogJ0dlbmVyYXRlJyB9KS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIGlmICghX2ltYWdlLnJlbW90ZUltYWdlVVJMIHx8ICFfaW1hZ2UucHJvbXB0KSB7IHRvYXN0KCdUaGlzIGltYWdlIGNhbuKAmXQgYmUgcmUtdmFyaWVkLicsICdlcnJvcicpOyByZXR1cm47IH0KICAgICAgYnVzeShidG4sIHRydWUpOwogICAgICBydW5WYXJpYXRpb25zKG1vZGVsLCBuKS50aGVuKGZ1bmN0aW9uIChtYWRlKSB7CiAgICAgICAgYnVzeShidG4sIGZhbHNlKTsKICAgICAgICBpZiAobWFkZSA+IDApIHsKICAgICAgICAgIHRvYXN0KG1hZGUgKyAnIHZhcmlhdGlvbicgKyAobWFkZSA9PT0gMSA/ICcnIDogJ3MnKSArICcgY3JlYXRlZC4nLCAnc3VjY2VzcycpOwogICAgICAgICAgaWYgKFYudWkgJiYgVi51aS5jb25mZXR0aSkgdHJ5IHsgVi51aS5jb25mZXR0aSgpOyB9IGNhdGNoIChlKSB7fQogICAgICAgICAgZ28oJyMvbGlicmFyeScpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0b2FzdCgnQ291bGRu4oCZdCBjcmVhdGUgdmFyaWF0aW9ucy4nLCAnZXJyb3InKTsKICAgICAgICB9CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBidXN5KGJ0biwgZmFsc2UpOwogICAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdWYXJpYXRpb24gZ2VuZXJhdGlvbiBmYWlsZWQuJywgJ2Vycm9yJyk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBydW5WYXJpYXRpb25zKG1vZGVsLCBuKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICBpZiAoIWFwaSB8fCB0eXBlb2YgYXBpLmdlbkVkaXQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGFwaS5wb2xsRWRpdCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgYXBpLnBvbGwgIT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignR2VuZXJhdGlvbiBBUEkgdW5hdmFpbGFibGUuJykpOwogICAgfQogICAgdmFyIHNlZWRCYXNlID0gKFUoKS5yYW5kb21TZWVkID8gVSgpLnJhbmRvbVNlZWQoKSA6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDFlNikpOwogICAgdmFyIG1hZGUgPSAwOwogICAgdmFyIGNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAoZnVuY3Rpb24gKGspIHsKICAgICAgICBjaGFpbiA9IGNoYWluLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIHNlZWQgPSAoc2VlZEJhc2UgKyBrICogOTE3MykgJSAxMDAwMDAwOwogICAgICAgICAgdmFyIGJvZHkgPSB7CiAgICAgICAgICAgIHByb21wdDogX2ltYWdlLnByb21wdCwKICAgICAgICAgICAgaW1hZ2VfdXJsOiBfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsCiAgICAgICAgICAgIGltYWdlX3VybHM6IFtfaW1hZ2UucmVtb3RlSW1hZ2VVUkxdLAogICAgICAgICAgICBzZWVkOiBzZWVkCiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIGFwaS5wb2xsKAogICAgICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBhcGkuZ2VuRWRpdChtb2RlbCwgYm9keSk7IH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gYXBpLnBvbGxFZGl0KG1vZGVsLCBpZCk7IH0sCiAgICAgICAgICAgIHt9CiAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICB2YXIgdXJsID0gcmVzdWx0ICYmIHJlc3VsdC5pbWFnZXMgJiYgcmVzdWx0LmltYWdlc1swXSAmJiByZXN1bHQuaW1hZ2VzWzBdLnVybDsKICAgICAgICAgICAgaWYgKCF1cmwpIHJldHVybjsKICAgICAgICAgICAgbWFkZSsrOwogICAgICAgICAgICByZXR1cm4gcGVyc2lzdFJlc3VsdCh1cmwsIHNlZWQsIG1vZGVsKTsKICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsKICAgICAgICB9KTsKICAgICAgfSkoaSk7CiAgICB9CiAgICByZXR1cm4gY2hhaW4udGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiBtYWRlOyB9KTsKICB9CgogIGZ1bmN0aW9uIHBlcnNpc3RSZXN1bHQodXJsLCBzZWVkLCBtb2RlbCkgewogICAgdmFyIGFwaSA9IEFQSSgpOwogICAgdmFyIGdlbiA9IHsKICAgICAgaWQ6IChVKCkudXVpZCA/IFUoKS51dWlkKCkgOiBTdHJpbmcoRGF0ZS5ub3coKSkgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyKSksCiAgICAgIHByb21wdDogX2ltYWdlLnByb21wdCwKICAgICAgcmVtb3RlSW1hZ2VVUkw6IHVybCwKICAgICAgcmVtb3RlT3JpZ2luYWxJbWFnZVVSTDogX2ltYWdlLnJlbW90ZUltYWdlVVJMLAogICAgICBwYXJlbnRJRDogaW1hZ2VJRChfaW1hZ2UpLAogICAgICBzZWVkOiBzZWVkLAogICAgICBtb2RlbDogbW9kZWwsCiAgICAgIGNyZWF0ZWREYXRlOiBEYXRlLm5vdygpIC8gMTAwMAogICAgfTsKICAgIGlmIChhcGkgJiYgdHlwZW9mIGFwaS5wZXJzaXN0SW1hZ2UgPT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkucGVyc2lzdEltYWdlKGdlbikpLnRoZW4oZnVuY3Rpb24gKHNhdmVkKSB7CiAgICAgICAgdmFyIGltZyA9IHVud3JhcChzYXZlZCkgfHwgZ2VuOwogICAgICAgIHB1c2hUb0xpYnJhcnkoaW1nKTsKICAgICAgICByZXR1cm4gaW1nOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHB1c2hUb0xpYnJhcnkoZ2VuKTsgcmV0dXJuIGdlbjsgfSk7CiAgICB9CiAgICBwdXNoVG9MaWJyYXJ5KGdlbik7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGdlbik7CiAgfQoKICBmdW5jdGlvbiBwdXNoVG9MaWJyYXJ5KGltZykgewogICAgdHJ5IHsKICAgICAgdmFyIGxpYiA9IFNUKCkubGlicmFyeSB8fCBbXTsKICAgICAgbGliLnVuc2hpZnQoaW1nKTsKICAgICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5zZXQpIFYuc3RvcmUuc2V0KCdsaWJyYXJ5JywgbGliKTsKICAgICAgZWxzZSBWLnN0YXRlLmxpYnJhcnkgPSBsaWI7CiAgICAgIGlmIChWLnN0b3JlICYmIFYuc3RvcmUuZW1pdCkgVi5zdG9yZS5lbWl0KCdsaWJyYXJ5OmNoYW5nZWQnLCBsaWIpOwogICAgfSBjYXRjaCAoZSkge30KICB9CgogIGZ1bmN0aW9uIGFjdEFuaW1hdGUoYnRuKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICBpZiAoIWFwaSB8fCB0eXBlb2YgYXBpLmdlblZpZGVvTFRYICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBhcGkucG9sbFZpZGVvTFRYICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBhcGkucG9sbCAhPT0gJ2Z1bmN0aW9uJykgewogICAgICB0b2FzdCgnQW5pbWF0aW9uIGlzbuKAmXQgYXZhaWxhYmxlIHJpZ2h0IG5vdy4nLCAnZXJyb3InKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCFfaW1hZ2UucmVtb3RlSW1hZ2VVUkwpIHsgdG9hc3QoJ05vIGltYWdlIHRvIGFuaW1hdGUuJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgY29uZmlybURpYWxvZygnQW5pbWF0ZSB0aGlzIGltYWdlIGludG8gYSBzaG9ydCB2aWRlbz8gQWJvdXQgNTAgY3JlZGl0cy4nLCB7IHRpdGxlOiAnQW5pbWF0ZScsIGNvbmZpcm1MYWJlbDogJ0FuaW1hdGUnIH0pLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgYnVzeShidG4sIHRydWUpOwogICAgICB0b2FzdCgnQW5pbWF0aW5n4oCmIHRoaXMgY2FuIHRha2UgYSBtaW51dGUuJywgJ2luZm8nKTsKICAgICAgX3BvbGxBYm9ydCA9ICh0eXBlb2YgQWJvcnRDb250cm9sbGVyICE9PSAndW5kZWZpbmVkJykgPyBuZXcgQWJvcnRDb250cm9sbGVyKCkgOiBudWxsOwogICAgICB2YXIgc2lnbmFsID0gX3BvbGxBYm9ydCA/IF9wb2xsQWJvcnQuc2lnbmFsIDogdW5kZWZpbmVkOwogICAgICB2YXIgc2VlZCA9IChVKCkucmFuZG9tU2VlZCA/IFUoKS5yYW5kb21TZWVkKCkgOiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTYpKTsKICAgICAgdmFyIHJlcUJvZHkgPSB7IGltYWdlX3VybDogX2ltYWdlLnJlbW90ZUltYWdlVVJMLCBwcm9tcHQ6IF9pbWFnZS5wcm9tcHQgfHwgJycsIHNlZWQ6IHNlZWQgfTsKICAgICAgdmFyIGdlbkltZ0lEID0gaW1hZ2VJRChfaW1hZ2UpOwogICAgICBhcGkucG9sbCgKICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBhcGkuZ2VuVmlkZW9MVFgocmVxQm9keSk7IH0sCiAgICAgICAgZnVuY3Rpb24gKGlkKSB7IHJldHVybiAoYXBpLnBvbGxWaWRlb0xUWC5sZW5ndGggPj0gMikgPyBhcGkucG9sbFZpZGVvTFRYKGlkLCBnZW5JbWdJRCkgOiBhcGkucG9sbFZpZGVvTFRYKGlkKTsgfSwKICAgICAgICB7IHNpZ25hbDogc2lnbmFsLCBvblByb2dyZXNzOiBmdW5jdGlvbiAoKSB7fSB9CiAgICAgICkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgYnVzeShidG4sIGZhbHNlKTsKICAgICAgICBfcG9sbEFib3J0ID0gbnVsbDsKICAgICAgICB2YXIgdXJsID0gKHJlc3VsdCAmJiAocmVzdWx0LnZpZGVvVVJMIHx8IHJlc3VsdC52aWRlb191cmwgfHwKICAgICAgICAgIChyZXN1bHQudmlkZW8gJiYgcmVzdWx0LnZpZGVvLnVybCkgfHwKICAgICAgICAgIChyZXN1bHQuaW1hZ2VzICYmIHJlc3VsdC5pbWFnZXNbMF0gJiYgcmVzdWx0LmltYWdlc1swXS51cmwpKSkgfHwgbnVsbDsKICAgICAgICBpZiAoIXVybCkgeyB0b2FzdCgnQW5pbWF0aW9uIGZpbmlzaGVkIGJ1dCBubyB2aWRlbyBjYW1lIGJhY2suJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgICAgIF9pbWFnZS52aWRlb1VSTCA9IHVybDsKICAgICAgICBhcHBseUltYWdlTXV0YXRpb24oX2ltYWdlKTsKICAgICAgICByZWJ1aWxkTWVkaWEoKTsKICAgICAgICByZWJ1aWxkUGFuZWwoKTsKICAgICAgICB0b2FzdCgnWW91ciBhbmltYXRpb24gaXMgcmVhZHkuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICBpZiAoVi51aSAmJiBWLnVpLmNvbmZldHRpKSB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBidXN5KGJ0biwgZmFsc2UpOwogICAgICAgIF9wb2xsQWJvcnQgPSBudWxsOwogICAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykgcmV0dXJuOwogICAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdBbmltYXRpb24gZmFpbGVkLicsICdlcnJvcicpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gYWN0RG93bmxvYWQoYnRuKSB7CiAgICB2YXIgdXJsID0gX2ltYWdlLnJlbW90ZUltYWdlVVJMIHx8IF9pbWFnZS52aWRlb1VSTDsKICAgIGlmICghdXJsKSB7IHRvYXN0KCdOb3RoaW5nIHRvIGRvd25sb2FkLicsICdlcnJvcicpOyByZXR1cm47IH0KICAgIHZhciBuYW1lID0gJ3ZhbXAtJyArIChpbWFnZUlEKF9pbWFnZSkgfHwgRGF0ZS5ub3coKSk7CiAgICBpZiAoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwgJiYgX2ltYWdlLnJlbW90ZUltYWdlVVJMKSB7CiAgICAgIHZhciB1aSA9IFVJKCk7CiAgICAgIHZhciBtb2RhbFJlZiA9IG51bGw7CiAgICAgIGZ1bmN0aW9uIGRvbmVEbCgpIHsgaWYgKG1vZGFsUmVmICYmIG1vZGFsUmVmLmNsb3NlKSBtb2RhbFJlZi5jbG9zZSgpOyByYXRlKGltYWdlSUQoX2ltYWdlKSwgJ3NhdmUnKTsgfQogICAgICB2YXIgbWVudSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1zbScsIHN0eWxlOiB7IHBhZGRpbmc6ICc0cHgnIH0gfSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdEb3dubG9hZCcsIHN0eWxlOiB7IG1hcmdpbkJvdHRvbTogJzRweCcgfSB9KSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1wcmltYXJ5IHYtY3RhLS1ibG9jaycsIHR5cGU6ICdidXR0b24nLAogICAgICAgICAgb25jbGljazogZnVuY3Rpb24gKCkgeyBkb3dubG9hZChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsIG5hbWUgKyAnLWFmdGVyLmpwZycpOyBkb25lRGwoKTsgfSB9LCAnRG93bmxvYWQgYWZ0ZXInKSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCB2LWN0YS0tYmxvY2snLCB0eXBlOiAnYnV0dG9uJywKICAgICAgICAgIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgZG93bmxvYWQoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwsIG5hbWUgKyAnLWJlZm9yZS5qcGcnKTsgZG9uZURsKCk7IH0gfSwgJ0Rvd25sb2FkIGJlZm9yZScpLAogICAgICAgIGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1ibG9jaycsIHR5cGU6ICdidXR0b24nLAogICAgICAgICAgb25jbGljazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBkb3dubG9hZChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsIG5hbWUgKyAnLWFmdGVyLmpwZycpOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgZG93bmxvYWQoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwsIG5hbWUgKyAnLWJlZm9yZS5qcGcnKTsgfSwgMzUwKTsKICAgICAgICAgICAgZG9uZURsKCk7CiAgICAgICAgICB9IH0sICdEb3dubG9hZCBib3RoJykKICAgICAgKTsKICAgICAgaWYgKHVpICYmIHR5cGVvZiB1aS5tb2RhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIG1vZGFsUmVmID0gdWkubW9kYWwobWVudSwgeyBhcmlhTGFiZWw6ICdEb3dubG9hZCBvcHRpb25zJyB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkb3dubG9hZChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsIG5hbWUgKyAnLWFmdGVyLmpwZycpOwogICAgICAgIHJhdGUoaW1hZ2VJRChfaW1hZ2UpLCAnc2F2ZScpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBleHQgPSBfaW1hZ2UudmlkZW9VUkwgJiYgdXJsID09PSBfaW1hZ2UudmlkZW9VUkwgPyAnLm1wNCcgOiAnLmpwZyc7CiAgICBkb3dubG9hZCh1cmwsIG5hbWUgKyBleHQpOwogICAgcmF0ZShpbWFnZUlEKF9pbWFnZSksICdzYXZlJyk7CiAgICB0b2FzdCgnU2F2ZWQuJywgJ3N1Y2Nlc3MnKTsKICB9CgogIGZ1bmN0aW9uIGFjdEZhdm9yaXRlKGJ0bikgewogICAgdmFyIGFwaSA9IEFQSSgpOwogICAgdmFyIGlkID0gaW1hZ2VJRChfaW1hZ2UpOwogICAgaWYgKCFpZCB8fCAhYXBpIHx8IHR5cGVvZiBhcGkuc2V0RmF2b3JpdGUgIT09ICdmdW5jdGlvbicpIHsgdG9hc3QoJ0Zhdm9yaXRlcyB1bmF2YWlsYWJsZS4nLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICB2YXIgbmV4dCA9ICFfaW1hZ2UuZmF2b3JpdGVkOwogICAgX2ltYWdlLmZhdm9yaXRlZCA9IG5leHQ7CiAgICByZWZsZWN0RmF2b3JpdGUoYnRuLCBuZXh0KTsKICAgIGJ1c3koYnRuLCB0cnVlKTsKICAgIFByb21pc2UucmVzb2x2ZShhcGkuc2V0RmF2b3JpdGUoaWQsIG5leHQpKS50aGVuKGZ1bmN0aW9uICh1cGRhdGVkKSB7CiAgICAgIGJ1c3koYnRuLCBmYWxzZSk7CiAgICAgIHZhciBpbWcgPSB1bndyYXAodXBkYXRlZCk7CiAgICAgIGlmIChpbWcgJiYgdHlwZW9mIGltZy5mYXZvcml0ZWQgPT09ICdib29sZWFuJykgeyBfaW1hZ2UuZmF2b3JpdGVkID0gaW1nLmZhdm9yaXRlZDsgcmVmbGVjdEZhdm9yaXRlKGJ0biwgaW1nLmZhdm9yaXRlZCk7IH0KICAgICAgYXBwbHlJbWFnZU11dGF0aW9uKF9pbWFnZSk7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIGJ1c3koYnRuLCBmYWxzZSk7CiAgICAgIF9pbWFnZS5mYXZvcml0ZWQgPSAhbmV4dDsKICAgICAgcmVmbGVjdEZhdm9yaXRlKGJ0biwgX2ltYWdlLmZhdm9yaXRlZCk7CiAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdDb3VsZG7igJl0IHVwZGF0ZSBmYXZvcml0ZS4nLCAnZXJyb3InKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcmVmbGVjdEZhdm9yaXRlKGJ0biwgb24pIHsKICAgIGlmICghYnRuKSByZXR1cm47CiAgICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCBvbiA/ICd0cnVlJyA6ICdmYWxzZScpOwogICAgdmFyIGljb25XcmFwID0gYnRuLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uLWljb24nKTsKICAgIGlmIChpY29uV3JhcCkgeyBpY29uV3JhcC5pbm5lckhUTUwgPSAnJzsgaWNvbldyYXAuYXBwZW5kQ2hpbGQoaWNvbihvbiA/ICdoZWFydC5maWxsJyA6ICdoZWFydCcpKTsgfQogICAgdmFyIGxibCA9IGJ0bi5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX2FjdGlvbi1sYWJlbCcpOwogICAgaWYgKGxibCkgbGJsLnRleHRDb250ZW50ID0gb24gPyAnRmF2b3JpdGVkJyA6ICdGYXZvcml0ZSc7CiAgICBhcHBseUFjdGlvblRvbmUoYnRuLCB7IGFjdGl2ZTogb24gfSk7CiAgICBpZiAoIW9uICYmIGljb25XcmFwKSBpY29uV3JhcC5zdHlsZS5jb2xvciA9IEFDQ0VOVF9TT0ZUOwogICAgaWYgKCFvbiAmJiBsYmwpIGxibC5zdHlsZS5jb2xvciA9IElOS19TT0ZUOwogICAgaWYgKCFvbikgeyBidG4uc3R5bGUuY29sb3IgPSBJTks7IGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJyc7IH0KICB9CgogIGZ1bmN0aW9uIGFjdERlbGV0ZShidG4pIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIHZhciBpZCA9IGltYWdlSUQoX2ltYWdlKTsKICAgIGlmICghaWQgfHwgIWFwaSB8fCB0eXBlb2YgYXBpLmRlbGV0ZUltYWdlICE9PSAnZnVuY3Rpb24nKSB7IHRvYXN0KCdEZWxldGUgdW5hdmFpbGFibGUuJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgY29uZmlybURpYWxvZygnRGVsZXRlIHRoaXMgaW1hZ2U/IFRoaXMgY2Fu4oCZdCBiZSB1bmRvbmUuJywgeyB0aXRsZTogJ0RlbGV0ZSBpbWFnZScsIGRlc3RydWN0aXZlOiB0cnVlLCBjb25maXJtTGFiZWw6ICdEZWxldGUnIH0pLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgYnVzeShidG4sIHRydWUpOwogICAgICBQcm9taXNlLnJlc29sdmUoYXBpLmRlbGV0ZUltYWdlKGlkKSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgcmF0ZShpZCwgJ2RlbGV0ZScpOwogICAgICAgIHJlbW92ZUZyb21TdGF0ZShpZCk7CiAgICAgICAgdG9hc3QoJ0ltYWdlIGRlbGV0ZWQuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICB2YXIgZnJlc2ggPSAoU1QoKS5saWJyYXJ5IHx8IFtdKS5tYXAodW53cmFwKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGltYWdlSUQoeCk7IH0pOwogICAgICAgIGlmIChmcmVzaC5sZW5ndGgpIHsKICAgICAgICAgIHZhciB0YXJnZXQgPSBmcmVzaFtNYXRoLm1pbihfaW5kZXgsIGZyZXNoLmxlbmd0aCAtIDEpXTsKICAgICAgICAgIGlmICh0YXJnZXQgJiYgaW1hZ2VJRCh0YXJnZXQpICE9PSBpZCkgeyBnbygnIy9pbWFnZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGltYWdlSUQodGFyZ2V0KSkpOyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgY2xvc2UoKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgIGJ1c3koYnRuLCBmYWxzZSk7CiAgICAgICAgdG9hc3QoKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ0RlbGV0ZSBmYWlsZWQuJywgJ2Vycm9yJyk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZW1vdmVGcm9tU3RhdGUoaWQpIHsKICAgIHRyeSB7CiAgICAgIFsnbGlicmFyeScsICdmZWVkJ10uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgdmFyIGFyciA9IFNUKClba2V5XTsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuOwogICAgICAgIHZhciBmaWx0ZXJlZCA9IGFyci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGltYWdlSUQodW53cmFwKHgpKSAhPT0gaWQ7IH0pOwogICAgICAgIGlmIChWLnN0b3JlICYmIFYuc3RvcmUuc2V0KSBWLnN0b3JlLnNldChrZXksIGZpbHRlcmVkKTsKICAgICAgICBlbHNlIFYuc3RhdGVba2V5XSA9IGZpbHRlcmVkOwogICAgICB9KTsKICAgICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5lbWl0KSBWLnN0b3JlLmVtaXQoJ2xpYnJhcnk6Y2hhbmdlZCcsIFNUKCkubGlicmFyeSk7CiAgICB9IGNhdGNoIChlKSB7fQogIH0KCiAgZnVuY3Rpb24gYWN0U2hhcmUoYnRuKSB7CiAgICB2YXIgaWQgPSBpbWFnZUlEKF9pbWFnZSk7CiAgICB2YXIgYmFzZSA9IChWLmNvbmZpZyAmJiBWLmNvbmZpZy5BUEkpID8gVi5jb25maWcuQVBJIDogJ2h0dHBzOi8vYXBpLnZvb3NleS5jb20nOwogICAgdmFyIHJlbmRlclVSTCA9IGlkID8gYmFzZSArICcvZ2VuZXJhdGVkL3JlbmRlci8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSA6IG51bGw7CiAgICB2YXIgdGV4dCA9IChfaW1hZ2UucHJvbXB0ID8gX2ltYWdlLnByb21wdCArICdcblxuJyA6ICcnKSArICdNYWRlIHdpdGggVmFtcCBieSBWb29zZXkuJzsKICAgIHJhdGUoaWQsICdzaGFyZScpOwogICAgaWYgKG5hdmlnYXRvci5zaGFyZSAmJiByZW5kZXJVUkwpIHsKICAgICAgbmF2aWdhdG9yLnNoYXJlKHsgdGl0bGU6ICdWYW1wJywgdGV4dDogdGV4dCwgdXJsOiByZW5kZXJVUkwgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykgcmV0dXJuOwogICAgICAgIGNvcHlTaGFyZUxpbmsocmVuZGVyVVJMKTsKICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChyZW5kZXJVUkwpIHsgY29weVNoYXJlTGluayhyZW5kZXJVUkwpOyB9CiAgICBlbHNlIGlmIChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwpIHsgZG93bmxvYWQoX2ltYWdlLnJlbW90ZUltYWdlVVJMLCAndmFtcC0nICsgKGlkIHx8IERhdGUubm93KCkpICsgJy5qcGcnKTsgdG9hc3QoJ0ltYWdlIGRvd25sb2FkZWQuJywgJ3N1Y2Nlc3MnKTsgfQogICAgZWxzZSB7IHRvYXN0KCdOb3RoaW5nIHRvIHNoYXJlLicsICdlcnJvcicpOyB9CiAgfQoKICBmdW5jdGlvbiBjb3B5U2hhcmVMaW5rKHVybCkgewogICAgY29weVRleHQodXJsKS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/ICdTaGFyZSBsaW5rIGNvcGllZC4nIDogJ0NvcHkgdGhpcyBsaW5rOiAnICsgdXJsLCBvayA/ICdzdWNjZXNzJyA6ICdpbmZvJyk7IH0pOwogIH0KCiAgZnVuY3Rpb24gY29weVRleHQoc3RyKSB7CiAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkgewogICAgICByZXR1cm4gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc3RyKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9KTsKICAgIH0KICAgIHRyeSB7CiAgICAgIHZhciB0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICAgIHRhLnZhbHVlID0gc3RyOyB0YS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7IHRhLnN0eWxlLm9wYWNpdHkgPSAnMCc7CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOyB0YS5zZWxlY3QoKTsKICAgICAgdmFyIG9rID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsKICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0YSk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUob2spOwogICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsgfQogIH0KCiAgZnVuY3Rpb24gYWN0Q29weVByb21wdCgpIHsKICAgIGlmICghX2ltYWdlLnByb21wdCkgeyB0b2FzdCgnTm8gcHJvbXB0IHRvIGNvcHkuJywgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICBjb3B5VGV4dChfaW1hZ2UucHJvbXB0KS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/ICdQcm9tcHQgY29waWVkLicgOiAnQ291bGRu4oCZdCBjb3B5LicsIG9rID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJyk7IH0pOwogIH0KCiAgZnVuY3Rpb24gYWN0UHVibGlzaChidG4pIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIGlmICghYXBpKSB7IHRvYXN0KCdQdWJsaXNoaW5nIHVuYXZhaWxhYmxlLicsICdlcnJvcicpOyByZXR1cm47IH0KICAgIGNvbmZpcm1EaWFsb2coJ1B1Ymxpc2ggdGhpcyBpbWFnZSB0byB0aGUgcHVibGljIGZlZWQ/JywgeyB0aXRsZTogJ1B1Ymxpc2gnLCBjb25maXJtTGFiZWw6ICdQdWJsaXNoJyB9KS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIGJ1c3koYnRuLCB0cnVlKTsKICAgICAgZW5zdXJlUHJvZmlsZSgpLnRoZW4oZnVuY3Rpb24gKHByb2ZpbGVJRCkgewogICAgICAgIGlmICghcHJvZmlsZUlEKSB0aHJvdyBuZXcgRXJyb3IoJ05vIHByb2ZpbGUgYXZhaWxhYmxlLicpOwogICAgICAgIHJldHVybiBkb1B1Ymxpc2gocHJvZmlsZUlEKTsKICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgYnVzeShidG4sIGZhbHNlKTsKICAgICAgICBfaW1hZ2UucHVibGlzaGVkID0gdHJ1ZTsKICAgICAgICBhcHBseUltYWdlTXV0YXRpb24oX2ltYWdlKTsKICAgICAgICBhcHBseUFjdGlvblRvbmUoYnRuLCB7IGFjdGl2ZTogdHJ1ZSB9KTsKICAgICAgICB2YXIgbGJsID0gYnRuLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uLWxhYmVsJyk7CiAgICAgICAgaWYgKGxibCkgbGJsLnRleHRDb250ZW50ID0gJ1B1Ymxpc2hlZCc7CiAgICAgICAgdG9hc3QoJ1B1Ymxpc2hlZCB0byB5b3VyIGZlZWQuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICBpZiAoVi51aSAmJiBWLnVpLmNvbmZldHRpKSB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBidXN5KGJ0biwgZmFsc2UpOwogICAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdQdWJsaXNoIGZhaWxlZC4nLCAnZXJyb3InKTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGVuc3VyZVByb2ZpbGUoKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICB2YXIgcGlkID0gKFNUKCkucHJvZmlsZSAmJiAoU1QoKS5wcm9maWxlLmlkIHx8IChTVCgpLnByb2ZpbGUubWljcm8gJiYgU1QoKS5wcm9maWxlLm1pY3JvLmlkKSkpIHx8CiAgICAgIChTVCgpLnVzZXIgJiYgKFNUKCkudXNlci5wcm9maWxlSUQgfHwgKFNUKCkudXNlci5wcm9maWxlICYmIFNUKCkudXNlci5wcm9maWxlLmlkKSkpIHx8IG51bGw7CiAgICBpZiAocGlkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBpZCk7CiAgICBpZiAodHlwZW9mIGFwaS5nZXRQcml2YXRlUHJvZmlsZSA9PT0gJ2Z1bmN0aW9uJyAmJiAoU1QoKS51c2VyICYmIChTVCgpLnVzZXIucHJvZmlsZUlEIHx8IFNUKCkudXNlci5pZCkpKSB7CiAgICAgIHZhciB0cnlJRCA9IFNUKCkudXNlci5wcm9maWxlSUQgfHwgU1QoKS51c2VyLmlkOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaS5nZXRQcml2YXRlUHJvZmlsZSh0cnlJRCkpLnRoZW4oZnVuY3Rpb24gKHApIHsKICAgICAgICB2YXIgaWQgPSBwICYmIChwLmlkIHx8IChwLmdsb2JhbCAmJiBwLmdsb2JhbC5taWNybyAmJiBwLmdsb2JhbC5taWNyby5pZCkgfHwgKHAubWljcm8gJiYgcC5taWNyby5pZCkpOwogICAgICAgIGlmIChpZCkgcmV0dXJuIGlkOwogICAgICAgIHJldHVybiBjcmVhdGVQcm9maWxlRmxvdygpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBjcmVhdGVQcm9maWxlRmxvdygpOyB9KTsKICAgIH0KICAgIHJldHVybiBjcmVhdGVQcm9maWxlRmxvdygpOwogIH0KCiAgZnVuY3Rpb24gY3JlYXRlUHJvZmlsZUZsb3coKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICBpZiAodHlwZW9mIGFwaS5jcmVhdGVQcm9maWxlICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgdmFyIG5hbWUgPSAoU1QoKS51c2VyICYmIChTVCgpLnVzZXIubmFtZSB8fCBTVCgpLnVzZXIudXNlcm5hbWUgfHwgU1QoKS51c2VyLmZpcnN0TmFtZSkpIHx8ICdNeSBTdHVkaW8nOwogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkuY3JlYXRlUHJvZmlsZSh7IGRpc3BsYXlOYW1lOiBuYW1lIH0pKS50aGVuKGZ1bmN0aW9uIChwKSB7CiAgICAgIHZhciBpZCA9IHAgJiYgKHAuaWQgfHwgKHAuZ2xvYmFsICYmIHAuZ2xvYmFsLm1pY3JvICYmIHAuZ2xvYmFsLm1pY3JvLmlkKSB8fCAocC5taWNybyAmJiBwLm1pY3JvLmlkKSk7CiAgICAgIGlmIChpZCAmJiBWLnN0b3JlICYmIFYuc3RvcmUuc2V0KSBWLnN0b3JlLnNldCgncHJvZmlsZScsIHApOwogICAgICByZXR1cm4gaWQ7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9KTsKICB9CgogIGZ1bmN0aW9uIGRvUHVibGlzaChwcm9maWxlSUQpIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIGlmICh0eXBlb2YgYXBpLnB1Ymxpc2hJbWFnZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVycm9yKCdQdWJsaXNoaW5nIHVuYXZhaWxhYmxlLicpOwogICAgdmFyIHBheWxvYWQgPSB7CiAgICAgIGlkOiBfaW1hZ2UuaWQgfHwgaW1hZ2VJRChfaW1hZ2UpLAogICAgICByZW1vdGVJRDogX2ltYWdlLnJlbW90ZUlELAogICAgICBwcm9tcHQ6IF9pbWFnZS5wcm9tcHQsCiAgICAgIHJlbW90ZUltYWdlVVJMOiBfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsCiAgICAgIHJlbW90ZU9yaWdpbmFsSW1hZ2VVUkw6IF9pbWFnZS5yZW1vdGVPcmlnaW5hbEltYWdlVVJMLAogICAgICBtb2RlbDogX2ltYWdlLm1vZGVsLAogICAgICBzZWVkOiBfaW1hZ2Uuc2VlZCwKICAgICAgdmlkZW9VUkw6IF9pbWFnZS52aWRlb1VSTCwKICAgICAgdGFnczogX2ltYWdlLnRhZ3MsCiAgICAgIGNyZWF0ZWREYXRlOiBfaW1hZ2UuY3JlYXRlZERhdGUKICAgIH07CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaS5wdWJsaXNoSW1hZ2UocHJvZmlsZUlELCBwYXlsb2FkKSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBpZCA9IGltYWdlSUQoX2ltYWdlKTsKICAgICAgaWYgKGlkICYmIHR5cGVvZiBhcGkuc2V0UHVibGlzaGVkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkuc2V0UHVibGlzaGVkKGlkLCB0cnVlKSkuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgICB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGFjdFNhdmVQcmVzZXQoKSB7CiAgICBpZiAoIV9pbWFnZS5wcm9tcHQpIHsgdG9hc3QoJ05vIHByb21wdCB0byBzYXZlLicsICdpbmZvJyk7IHJldHVybjsgfQogICAgdmFyIHVpID0gVUkoKTsKICAgIHZhciBuYW1lSW5wdXQgPSBlbCgnaW5wdXQnLCB7IGNsYXNzOiAndi1maWVsZCcsIHR5cGU6ICd0ZXh0JywgcGxhY2Vob2xkZXI6ICdQcmVzZXQgbmFtZScsIHZhbHVlOiAoX2ltYWdlLnByb21wdCB8fCAnJykuc2xpY2UoMCwgNDApIH0pOwogICAgdmFyIHByb21wdEFyZWEgPSBlbCgndGV4dGFyZWEnLCB7IGNsYXNzOiAndi10ZXh0YXJlYScsIHJvd3M6IDQgfSk7CiAgICBwcm9tcHRBcmVhLnZhbHVlID0gX2ltYWdlLnByb21wdCB8fCAnJzsKICAgIHZhciBzdGF0dXMgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZmllbGQtaGludCcsICdhcmlhLWxpdmUnOiAncG9saXRlJywgc3R5bGU6IHsgbWluSGVpZ2h0OiAnMTZweCcgfSB9KTsKICAgIHZhciBzYXZlQnRuID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tYmxvY2snLCB0eXBlOiAnYnV0dG9uJyB9LCAnU2F2ZSBwcmVzZXQnKTsKICAgIHZhciBib2R5ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLXNtJywgc3R5bGU6IHsgcGFkZGluZzogJzRweCcsIG1pbldpZHRoOiAnbWluKDg2dncsIDM4MHB4KScgfSB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdTYXZlIGFzIHByZXNldCcgfSksCiAgICAgIGVsKCdsYWJlbCcsIHsgY2xhc3M6ICd2LWxhYmVsJywgdGV4dDogJ05hbWUnIH0pLCBuYW1lSW5wdXQsCiAgICAgIGVsKCdsYWJlbCcsIHsgY2xhc3M6ICd2LWxhYmVsJywgdGV4dDogJ1Byb21wdCcgfSksIHByb21wdEFyZWEsCiAgICAgIHN0YXR1cywKICAgICAgc2F2ZUJ0bgogICAgKTsKICAgIHZhciBtb2RhbFJlZiA9ICh1aSAmJiB0eXBlb2YgdWkubW9kYWwgPT09ICdmdW5jdGlvbicpID8gdWkubW9kYWwoYm9keSwgeyBhcmlhTGFiZWw6ICdTYXZlIHByZXNldCcgfSkgOiBudWxsOwogICAgc2F2ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG5hbWUgPSAobmFtZUlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIHZhciBwcm9tcHQgPSAocHJvbXB0QXJlYS52YWx1ZSB8fCAnJykudHJpbSgpOwogICAgICBpZiAoIW5hbWUpIHsgc3RhdHVzLnRleHRDb250ZW50ID0gJ0dpdmUgeW91ciBwcmVzZXQgYSBuYW1lLic7IG5hbWVJbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgaWYgKCFwcm9tcHQpIHsgc3RhdHVzLnRleHRDb250ZW50ID0gJ0EgcHJvbXB0IGlzIHJlcXVpcmVkLic7IHByb21wdEFyZWEuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSB0cnVlOyBzdGF0dXMudGV4dENvbnRlbnQgPSAnU2F2aW5n4oCmJzsKICAgICAgc2F2ZVByZXNldCh7IG5hbWU6IG5hbWUsIHByb21wdDogcHJvbXB0LCBtb2RlbDogX2ltYWdlLm1vZGVsIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChtb2RhbFJlZiAmJiBtb2RhbFJlZi5jbG9zZSkgbW9kYWxSZWYuY2xvc2UoKTsKICAgICAgICB0b2FzdCgnUHJlc2V0IHNhdmVkLicsICdzdWNjZXNzJyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ0NvdWxkbuKAmXQgc2F2ZSBwcmVzZXQuJzsKICAgICAgfSk7CiAgICB9KTsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBuYW1lSW5wdXQuZm9jdXMoKTsgbmFtZUlucHV0LnNlbGVjdCgpOyB9LCAzMCk7CiAgfQoKICBmdW5jdGlvbiBzYXZlUHJlc2V0KHApIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIHZhciBwcmVzZXQgPSB7CiAgICAgIGlkOiAoVSgpLnV1aWQgPyBVKCkudXVpZCgpIDogU3RyaW5nKERhdGUubm93KCkpKSwKICAgICAgbmFtZTogcC5uYW1lLCBwcm9tcHQ6IHAucHJvbXB0LCBuZWdhdGl2ZVByb21wdDogbnVsbCwgbW9kZWw6IHAubW9kZWwgfHwgbnVsbAogICAgfTsKICAgIHRyeSB7CiAgICAgIHZhciBsaXN0ID0gU1QoKS5wcmVzZXRzIHx8IFtdOwogICAgICBsaXN0LnB1c2gocHJlc2V0KTsKICAgICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5zZXQpIFYuc3RvcmUuc2V0KCdwcmVzZXRzJywgbGlzdCk7CiAgICAgIGVsc2UgVi5zdGF0ZS5wcmVzZXRzID0gbGlzdDsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgICBpZiAoVi5wcmVzZXRzICYmIHR5cGVvZiBWLnByZXNldHMuY3JlYXRlID09PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFYucHJlc2V0cy5jcmVhdGUocHJlc2V0KSk7CiAgICBpZiAoYXBpICYmIHR5cGVvZiBhcGkuY3JlYXRlUHJlc2V0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaS5jcmVhdGVQcmVzZXQocHJlc2V0KSk7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByZXNldCk7CiAgfQoKICBmdW5jdGlvbiBhcHBseUltYWdlTXV0YXRpb24oaW1nKSB7CiAgICB0cnkgewogICAgICB2YXIgaWQgPSBpbWFnZUlEKGltZyk7CiAgICAgIFsnbGlicmFyeScsICdmZWVkJ10uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgdmFyIGFyciA9IFNUKClba2V5XTsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgdSA9IHVud3JhcChhcnJbaV0pOwogICAgICAgICAgaWYgKGltYWdlSUQodSkgPT09IGlkKSB7IE9iamVjdC5hc3NpZ24odSwgaW1nKTsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBpZiAoVi5zdG9yZSAmJiBWLnN0b3JlLmVtaXQpIFYuc3RvcmUuZW1pdCgnbGlicmFyeTpjaGFuZ2VkJywgU1QoKS5saWJyYXJ5KTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiByZWJ1aWxkTWVkaWEoKSB7CiAgICBpZiAoIV9ub2RlKSByZXR1cm47CiAgICB2YXIgbW91bnQgPSBfbm9kZS5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX21lZGlhJyk7CiAgICBpZiAoIW1vdW50KSByZXR1cm47CiAgICBkZXN0cm95U2NydWIoKTsKICAgIG1vdW50LmlubmVySFRNTCA9ICcnOwogICAgbW91bnQuYXBwZW5kQ2hpbGQoYnVpbGRNZWRpYSgpKTsKICB9CgogIGZ1bmN0aW9uIHJlYnVpbGRQYW5lbCgpIHsKICAgIGlmICghX25vZGUpIHJldHVybjsKICAgIHZhciBvbGQgPSBfbm9kZS5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX3BhbmVsJyk7CiAgICBpZiAoIW9sZCkgcmV0dXJuOwogICAgdmFyIGZyZXNoID0gYnVpbGRQYW5lbCgpOwogICAgb2xkLnJlcGxhY2VXaXRoKGZyZXNoKTsKICB9CgogIGZ1bmN0aW9uIGRlc3Ryb3lTY3J1YigpIHsKICAgIGlmIChfc2NydWJOb2RlKSB7CiAgICAgIGlmICh0eXBlb2YgX3NjcnViTm9kZS5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IF9zY3J1Yk5vZGUuZGVzdHJveSgpOyB9IGNhdGNoIChlKSB7fSB9CiAgICB9CiAgICBfc2NydWJOb2RlID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkUGFuZWwoKSB7CiAgICB2YXIgcGFuZWwgPSBlbCgnYXNpZGUnLCB7IGNsYXNzOiAndi1zdHVkaW9fX3BhbmVsIGdsYXNzLWNhcmQnLCAnYXJpYS1sYWJlbCc6ICdJbWFnZSBkZXRhaWxzJywgc3R5bGU6IHBhbmVsU3R5bGUoKSB9KTsKCiAgICBpZiAoX2ltYWdlLnByb21wdCAmJiAhX2ltYWdlLmhpZGVQcm9tcHQpIHsKICAgICAgdmFyIHByb21wdEJ0biA9IGVsKCdidXR0b24nLCB7CiAgICAgICAgY2xhc3M6ICd2LXN0dWRpb19fcHJvbXB0JywgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgdGl0bGU6ICdDb3B5IHByb21wdCcsICdhcmlhLWxhYmVsJzogJ0NvcHkgcHJvbXB0IHRvIGNsaXBib2FyZCcsCiAgICAgICAgc3R5bGU6IHsKICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzhweCcsIHdpZHRoOiAnMTAwJScsIHRleHRBbGlnbjogJ2xlZnQnLAogICAgICAgICAgYmFja2dyb3VuZDogQ0FSRF9CRywgYm9yZGVyOiAnMXB4IHNvbGlkICcgKyBMSU5FLCBib3JkZXJSYWRpdXM6ICd2YXIoLS1yYWRpdXMtY29udGVudCwgMTJweCknLAogICAgICAgICAgcGFkZGluZzogJzE0cHggMTZweCcsIGN1cnNvcjogJ3BvaW50ZXInLCBjb2xvcjogSU5LLCBmb250OiAnaW5oZXJpdCcKICAgICAgICB9CiAgICAgIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX3Byb21wdC10ZXh0JywgdGV4dDogX2ltYWdlLnByb21wdCwgc3R5bGU6IHsKICAgICAgICAgIGZvbnRTaXplOiAnMTVweCcsIGxpbmVIZWlnaHQ6ICcxLjQ1JywgY29sb3I6IElOSywgd2hpdGVTcGFjZTogJ3ByZS13cmFwJwogICAgICAgIH0gfSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX3Byb21wdC1jb3B5Jywgc3R5bGU6IHsKICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBnYXA6ICc2cHgnLCBmb250U2l6ZTogJzEycHgnLAogICAgICAgICAgZm9udFdlaWdodDogJzYwMCcsIGNvbG9yOiBBQ0NFTlRfU09GVAogICAgICAgIH0gfSwgaWNvbignY29weScpLCBlbCgnc3BhbicsIHsgdGV4dDogJ0NvcHkgcHJvbXB0JyB9KSkKICAgICAgKTsKICAgICAgcHJvbXB0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWN0Q29weVByb21wdCk7CiAgICAgIHBhbmVsLmFwcGVuZENoaWxkKHByb21wdEJ0bik7CiAgICB9IGVsc2UgaWYgKF9pbWFnZS5oaWRlUHJvbXB0KSB7CiAgICAgIHBhbmVsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX3Byb21wdCB2LW11dGVkJywgdGV4dDogJ1Byb21wdCBoaWRkZW4nLCBzdHlsZTogewogICAgICAgIHBhZGRpbmc6ICcxNHB4IDE2cHgnLCBib3JkZXI6ICcxcHggZGFzaGVkICcgKyBMSU5FLCBib3JkZXJSYWRpdXM6ICd2YXIoLS1yYWRpdXMtY29udGVudCwgMTJweCknLCBjb2xvcjogSU5LX1NPRlQKICAgICAgfSB9KSk7CiAgICB9CgogICAgdmFyIG1ldGEgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19tZXRhJywgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBmbGV4V3JhcDogJ3dyYXAnLCBnYXA6ICc4cHgnIH0gfSk7CiAgICBpZiAoX2ltYWdlLm1vZGVsKSBtZXRhLmFwcGVuZENoaWxkKG1ldGFDaGlwKCdNb2RlbCcsIG1vZGVsTGFiZWwoX2ltYWdlLm1vZGVsKSkpOwogICAgdmFyIGRpbXMgPSBpbWFnZURpbWVuc2lvbnMoX2ltYWdlKTsKICAgIGlmIChkaW1zKSBtZXRhLmFwcGVuZENoaWxkKG1ldGFDaGlwKCdTaXplJywgZGltcykpOwogICAgaWYgKF9pbWFnZS5zZWVkICE9IG51bGwpIG1ldGEuYXBwZW5kQ2hpbGQobWV0YUNoaXAoJ1NlZWQnLCBTdHJpbmcoX2ltYWdlLnNlZWQpKSk7CiAgICB2YXIgY29zdCA9IGNyZWRpdENvc3QoX2ltYWdlKTsKICAgIGlmIChjb3N0ICE9IG51bGwpIG1ldGEuYXBwZW5kQ2hpbGQobWV0YUNoaXAoJ0NyZWRpdHMnLCBTdHJpbmcoY29zdCkpKTsKICAgIHZhciBkdCA9IGZtdERhdGUoX2ltYWdlLmNyZWF0ZWREYXRlKTsKICAgIGlmIChkdCkgbWV0YS5hcHBlbmRDaGlsZChtZXRhQ2hpcCgnQ3JlYXRlZCcsIGR0KSk7CiAgICBpZiAoX2ltYWdlLmZhdm9yaXRlZCkgbWV0YS5hcHBlbmRDaGlsZChtZXRhQ2hpcCgnJywgJ0Zhdm9yaXRlZCcsIEFDQ0VOVCkpOwogICAgaWYgKF9pbWFnZS5wdWJsaXNoZWQpIG1ldGEuYXBwZW5kQ2hpbGQobWV0YUNoaXAoJycsICdQdWJsaXNoZWQnLCBBQ0NFTlQpKTsKICAgIGlmIChtZXRhLmNoaWxkTm9kZXMubGVuZ3RoKSB7CiAgICAgIHBhbmVsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2dyb3VwJyB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2dyb3VwLWhlYWQgdi1leWVicm93JywgdGV4dDogJ0RldGFpbHMnIH0pLAogICAgICAgIG1ldGEKICAgICAgKSk7CiAgICB9CgogICAgcGFuZWwuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0dWRpb19fZ3JvdXAnIH0sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2dyb3VwLWhlYWQgdi1leWVicm93JywgdGV4dDogJ0FjdGlvbnMnIH0pLAogICAgICBidWlsZEFjdGlvbkJhcigpCiAgICApKTsKICAgIHJldHVybiBwYW5lbDsKICB9CgogIGZ1bmN0aW9uIHBhbmVsU3R5bGUoKSB7CiAgICByZXR1cm4gewogICAgICBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcxNHB4JywKICAgICAgd2lkdGg6ICdtaW4oMzgwcHgsIDkydncpJywgZmxleDogJzAgMCBhdXRvJywKICAgICAgbWF4SGVpZ2h0OiAnMTAwJScsIG92ZXJmbG93WTogJ2F1dG8nLCBvdmVyZmxvd1g6ICdoaWRkZW4nLAogICAgICBwYWRkaW5nOiAnMjBweCcsIGJvcmRlclJhZGl1czogJ3ZhcigtLXJhZGl1cy1wYW5lbCwgMjIuNXB4KScsCiAgICAgIFdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiAndG91Y2gnCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gbWV0YUNoaXAobGFiZWwsIHZhbHVlLCB0b25lKSB7CiAgICByZXR1cm4gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jaGlwJywgc3R5bGU6IHsKICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGdhcDogJzZweCcsCiAgICAgIHBhZGRpbmc6ICc2cHggMTJweCcsIGJvcmRlclJhZGl1czogJ3ZhcigtLXJhZGl1cy1waWxsLCA2M3B4KScsCiAgICAgIGJhY2tncm91bmQ6IHRvbmUgPyAnY29sb3ItbWl4KGluIHNyZ2IsICcgKyB0b25lICsgJyAxNiUsIHRyYW5zcGFyZW50KScgOiBDQVJEX0JHLAogICAgICBib3JkZXI6ICcxcHggc29saWQgJyArICh0b25lID8gJ2NvbG9yLW1peChpbiBzcmdiLCAnICsgdG9uZSArICcgNDUlLCB0cmFuc3BhcmVudCknIDogTElORSksCiAgICAgIGZvbnRTaXplOiAnMTJweCcsIHdoaXRlU3BhY2U6ICdub3dyYXAnCiAgICB9IH0sCiAgICAgIGxhYmVsID8gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tb25vJywgdGV4dDogbGFiZWwsIHN0eWxlOiB7IGNvbG9yOiBJTktfU09GVCwgdGV4dFRyYW5zZm9ybTogJ3VwcGVyY2FzZScsIGxldHRlclNwYWNpbmc6ICcwLjA4ZW0nLCBmb250U2l6ZTogJzEwcHgnIH0gfSkgOiBudWxsLAogICAgICBlbCgnc3BhbicsIHsgdGV4dDogdmFsdWUsIHN0eWxlOiB7IGNvbG9yOiB0b25lID8gdG9uZSA6IElOSywgZm9udFdlaWdodDogJzYwMCcgfSB9KQogICAgKTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkQWN0aW9uQmFyKCkgewogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19hY3Rpb25zLXdyYXAnLCBzdHlsZTogewogICAgICBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcxMHB4JwogICAgfSB9KTsKICAgIHZhciBvd24gPSBpc093bkltYWdlKF9pbWFnZSk7CgogICAgdmFyIHJldmFtcCA9IGVsKCdidXR0b24nLCB7CiAgICAgIGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnkgdi1jdGEtLWJsb2NrIHYtc3R1ZGlvX19yZXZhbXAnLCB0eXBlOiAnYnV0dG9uJywKICAgICAgdGl0bGU6ICdSZXZhbXAnLCAnYXJpYS1sYWJlbCc6ICdSZXZhbXAgdGhpcyBpbWFnZSBpbiBDcmVhdGUnCiAgICB9LCBpY29uKCdlZGl0JyksIGVsKCdzcGFuJywgeyB0ZXh0OiAnUmV2YW1wJyB9KSk7CiAgICByZXZhbXAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGFjdEVkaXQoKTsgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKHJldmFtcCk7CgogICAgdmFyIGJhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2FjdGlvbnMgZ2xhc3MtbmF2Jywgcm9sZTogJ3Rvb2xiYXInLCAnYXJpYS1sYWJlbCc6ICdJbWFnZSBhY3Rpb25zJywgc3R5bGU6IHsKICAgICAgZGlzcGxheTogJ2dyaWQnLCBncmlkVGVtcGxhdGVDb2x1bW5zOiAncmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoNjRweCwgMWZyKSknLCBnYXA6ICc2cHgnLAogICAgICBwYWRkaW5nOiAnMTBweCcsIGJvcmRlclJhZGl1czogJ3ZhcigtLXJhZGl1cy1wYW5lbCwgMjIuNXB4KScKICAgIH0gfSk7CgogICAgYmFyLmFwcGVuZENoaWxkKGdsYXNzQnRuKCd2YXJpYXRpb25zJywgJ1ZhcmlhdGlvbnMnLCBhY3RWYXJpYXRpb25zKSk7CiAgICBpZiAoIV9pbWFnZS52aWRlb1VSTCkgYmFyLmFwcGVuZENoaWxkKGdsYXNzQnRuKCdhbmltYXRlJywgJ0FuaW1hdGUnLCBhY3RBbmltYXRlKSk7CiAgICBiYXIuYXBwZW5kQ2hpbGQoZ2xhc3NCdG4oJ2Rvd25sb2FkJywgJ1NhdmUnLCBhY3REb3dubG9hZCkpOwogICAgaWYgKG93bikgewogICAgICBiYXIuYXBwZW5kQ2hpbGQoZ2xhc3NCdG4oX2ltYWdlLmZhdm9yaXRlZCA/ICdoZWFydC5maWxsJyA6ICdoZWFydCcsCiAgICAgICAgX2ltYWdlLmZhdm9yaXRlZCA/ICdGYXZvcml0ZWQnIDogJ0Zhdm9yaXRlJywgYWN0RmF2b3JpdGUsCiAgICAgICAgeyB0b2dnbGU6IHRydWUsIGFjdGl2ZTogISFfaW1hZ2UuZmF2b3JpdGVkIH0pKTsKICAgIH0KICAgIGJhci5hcHBlbmRDaGlsZChnbGFzc0J0bignc2hhcmUnLCAnU2hhcmUnLCBhY3RTaGFyZSkpOwogICAgaWYgKG93bikgewogICAgICBiYXIuYXBwZW5kQ2hpbGQoZ2xhc3NCdG4oJ3B1Ymxpc2gnLCBfaW1hZ2UucHVibGlzaGVkID8gJ1B1Ymxpc2hlZCcgOiAnUHVibGlzaCcsIGFjdFB1Ymxpc2gsIHsgYWN0aXZlOiAhIV9pbWFnZS5wdWJsaXNoZWQgfSkpOwogICAgfQogICAgaWYgKF9pbWFnZS5wcm9tcHQpIGJhci5hcHBlbmRDaGlsZChnbGFzc0J0bignYm9va21hcmsnLCAnUHJlc2V0JywgYWN0U2F2ZVByZXNldCkpOwogICAgaWYgKG93bikgYmFyLmFwcGVuZENoaWxkKGdsYXNzQnRuKCd0cmFzaCcsICdEZWxldGUnLCBhY3REZWxldGUsIHsgZGFuZ2VyOiB0cnVlIH0pKTsKICAgIHdyYXAuYXBwZW5kQ2hpbGQoYmFyKTsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gd2lyZVN3aXBlRGlzbWlzcyhub2RlKSB7CiAgICB2YXIgc3RhcnRZID0gMCwgc3RhcnRYID0gMCwgY3VyWSA9IDAsIGRyYWdnaW5nID0gZmFsc2UsIGxvY2tlZCA9IGZhbHNlOwogICAgdmFyIHRocmVzaG9sZCA9IDExMDsKICAgIGZ1bmN0aW9uIG9uU3RhcnQoZSkgewogICAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlcy5sZW5ndGggPiAxKSByZXR1cm47CiAgICAgIHZhciB0ID0gZS50YXJnZXQ7CiAgICAgIHdoaWxlICh0ICYmIHQgIT09IG5vZGUpIHsKICAgICAgICBpZiAodC5jbGFzc0xpc3QgJiYgKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCd2c2NydWInKSB8fCB0LmNsYXNzTGlzdC5jb250YWlucygndmNhcmQnKSB8fAogICAgICAgICAgdC5jbGFzc0xpc3QuY29udGFpbnMoJ3Ytc3R1ZGlvX19hY3Rpb25zJykgfHwgdC5jbGFzc0xpc3QuY29udGFpbnMoJ3Ytc3R1ZGlvX19wYW5lbCcpIHx8CiAgICAgICAgICB0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8IHQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fCB0LnRhZ05hbWUgPT09ICdJTlBVVCcpKSByZXR1cm47CiAgICAgICAgdCA9IHQucGFyZW50Tm9kZTsKICAgICAgfQogICAgICBzdGFydFkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WTsgc3RhcnRYID0gZS50b3VjaGVzWzBdLmNsaWVudFg7CiAgICAgIGN1clkgPSBzdGFydFk7IGRyYWdnaW5nID0gdHJ1ZTsgbG9ja2VkID0gZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiBvbk1vdmUoZSkgewogICAgICBpZiAoIWRyYWdnaW5nKSByZXR1cm47CiAgICAgIHZhciB5ID0gZS50b3VjaGVzWzBdLmNsaWVudFksIHggPSBlLnRvdWNoZXNbMF0uY2xpZW50WDsKICAgICAgdmFyIGR5ID0geSAtIHN0YXJ0WSwgZHggPSB4IC0gc3RhcnRYOwogICAgICBpZiAoIWxvY2tlZCkgewogICAgICAgIGlmIChNYXRoLmFicyhkeCkgPiBNYXRoLmFicyhkeSkpIHsgZHJhZ2dpbmcgPSBmYWxzZTsgcmV0dXJuOyB9CiAgICAgICAgbG9ja2VkID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoZHkgPCAwKSBkeSA9IGR5ICogMC4yNTsKICAgICAgY3VyWSA9IHN0YXJ0WSArIGR5OwogICAgICB2YXIgb3AgPSBNYXRoLm1heCgwLjI1LCAxIC0gTWF0aC5hYnMoZHkpIC8gNTAwKTsKICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWSgnICsgZHkgKyAncHgpJzsKICAgICAgbm9kZS5zdHlsZS5vcGFjaXR5ID0gU3RyaW5nKG9wKTsKICAgICAgaWYgKGUuY2FuY2VsYWJsZSkgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgfQogICAgZnVuY3Rpb24gb25FbmQoKSB7CiAgICAgIGlmICghZHJhZ2dpbmcpIHJldHVybjsKICAgICAgZHJhZ2dpbmcgPSBmYWxzZTsKICAgICAgdmFyIGR5ID0gY3VyWSAtIHN0YXJ0WTsKICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSAnJzsKICAgICAgbm9kZS5zdHlsZS5vcGFjaXR5ID0gJyc7CiAgICAgIGlmIChkeSA+IHRocmVzaG9sZCkgY2xvc2UoKTsKICAgIH0KICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uU3RhcnQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Nb3ZlLCB7IHBhc3NpdmU6IGZhbHNlIH0pOwogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uRW5kLCB7IHBhc3NpdmU6IHRydWUgfSk7CiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgb25FbmQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKICB9CgogIGZ1bmN0aW9uIHdpcmVEcm9wUGFzdGUoc3RhZ2VFbCkgewogICAgc3RhZ2VFbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChlLmRhdGFUcmFuc2ZlciAmJiBBcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKGUuZGF0YVRyYW5zZmVyLml0ZW1zIHx8IFtdLCBmdW5jdGlvbiAoaXQpIHsgcmV0dXJuIGl0LmtpbmQgPT09ICdmaWxlJzsgfSkpIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgc3RhZ2VFbC5zdHlsZS5vdXRsaW5lID0gJzJweCBkYXNoZWQgJyArIEFDQ0VOVDsKICAgICAgICBzdGFnZUVsLnN0eWxlLm91dGxpbmVPZmZzZXQgPSAnLThweCc7CiAgICAgIH0KICAgIH0pOwogICAgc3RhZ2VFbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCBmdW5jdGlvbiAoKSB7IHN0YWdlRWwuc3R5bGUub3V0bGluZSA9ICcnOyB9KTsKICAgIHN0YWdlRWwuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgIHN0YWdlRWwuc3R5bGUub3V0bGluZSA9ICcnOwogICAgICB2YXIgZmlsZXMgPSBlLmRhdGFUcmFuc2ZlciAmJiBlLmRhdGFUcmFuc2Zlci5maWxlczsKICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IHN0YXJ0UmV2YW1wRnJvbUZpbGUoZmlsZXNbMF0pOyB9CiAgICB9KTsKICAgIF9wYXN0ZUhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoX2Rpc3Bvc2VkKSByZXR1cm47CiAgICAgIHZhciBpdGVtcyA9IChlLmNsaXBib2FyZERhdGEgJiYgZS5jbGlwYm9hcmREYXRhLml0ZW1zKSB8fCBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChpdGVtc1tpXS50eXBlICYmIGl0ZW1zW2ldLnR5cGUuaW5kZXhPZignaW1hZ2UnKSA9PT0gMCkgewogICAgICAgICAgdmFyIGZpbGUgPSBpdGVtc1tpXS5nZXRBc0ZpbGUoKTsKICAgICAgICAgIGlmIChmaWxlKSB7IHN0YXJ0UmV2YW1wRnJvbUZpbGUoZmlsZSk7IGJyZWFrOyB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBfcGFzdGVIYW5kbGVyKTsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0UmV2YW1wRnJvbUZpbGUoZmlsZSkgewogICAgaWYgKCFmaWxlKSByZXR1cm47CiAgICB0b2FzdCgnT3BlbmluZyBDcmVhdGUgd2l0aCB5b3VyIGltYWdl4oCmJywgJ2luZm8nKTsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIGlmIChhcGkgJiYgdHlwZW9mIGFwaS51cGxvYWRJbWFnZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBQcm9taXNlLnJlc29sdmUoYXBpLnVwbG9hZEltYWdlKGZpbGUsICdyZW5kZXInKSkudGhlbihmdW5jdGlvbiAodXJsKSB7CiAgICAgICAgdmFyIHBhcmFtcyA9IFsnaW1hZ2U9JyArIGVuY29kZVVSSUNvbXBvbmVudCh1cmwpXTsKICAgICAgICBpZiAoX2ltYWdlICYmIF9pbWFnZS5tb2RlbCkgcGFyYW1zLnB1c2goJ21vZGVsPScgKyBlbmNvZGVVUklDb21wb25lbnQoX2ltYWdlLm1vZGVsKSk7CiAgICAgICAgZ28oJyMvY3JlYXRlPycgKyBwYXJhbXMuam9pbignJicpKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgeyBnbygnIy9jcmVhdGUnKTsgfSk7CiAgICB9IGVsc2UgeyBnbygnIy9jcmVhdGUnKTsgfQogIH0KCiAgZnVuY3Rpb24gY2xvc2UoKSB7IGJhY2soKTsgfQoKICBmdW5jdGlvbiBiYWNrKCkgewogICAgdmFyIHByZXYgPSBTVCgpLnByZXZpb3VzUm91dGU7CiAgICBpZiAocHJldiAmJiBwcmV2LmluZGV4T2YoJ2ltYWdlJykgPT09IC0xKSB7IGdvKHByZXYuY2hhckF0KDApID09PSAnIycgPyBwcmV2IDogJyMvJyArIHByZXYpOyByZXR1cm47IH0KICAgIGdvKCcjL2xpYnJhcnknKTsKICB9CgogIGZ1bmN0aW9uIHdpcmVLZXlzKCkgewogICAgX2tleUhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoX2Rpc3Bvc2VkKSByZXR1cm47CiAgICAgIHZhciB0ID0gZS50YXJnZXQ7CiAgICAgIHZhciB0eXBpbmcgPSB0ICYmICh0LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgdC50YWdOYW1lID09PSAnVEVYVEFSRUEnIHx8IHQuaXNDb250ZW50RWRpdGFibGUpOwogICAgICBpZiAodHlwaW5nICYmIGUua2V5ICE9PSAnRXNjYXBlJykgcmV0dXJuOwogICAgICBzd2l0Y2ggKGUua2V5KSB7CiAgICAgICAgY2FzZSAnRXNjYXBlJzogZS5wcmV2ZW50RGVmYXVsdCgpOyBjbG9zZSgpOyBicmVhazsKICAgICAgICBjYXNlICdBcnJvd0xlZnQnOiBlLnByZXZlbnREZWZhdWx0KCk7IG5hdmlnYXRlKC0xKTsgYnJlYWs7CiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6IGUucHJldmVudERlZmF1bHQoKTsgbmF2aWdhdGUoMSk7IGJyZWFrOwogICAgICAgIGNhc2UgJ2UnOiBjYXNlICdFJzogaWYgKCFlLm1ldGFLZXkgJiYgIWUuY3RybEtleSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGFjdEVkaXQoKTsgfSBicmVhazsKICAgICAgICBjYXNlICdmJzogY2FzZSAnRic6CiAgICAgICAgICBpZiAoIWUubWV0YUtleSAmJiAhZS5jdHJsS2V5ICYmIGlzT3duSW1hZ2UoX2ltYWdlKSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGFjdEZhdm9yaXRlKF9ub2RlICYmIF9ub2RlLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uW2FyaWEtcHJlc3NlZF0nKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OiBicmVhazsKICAgICAgfQogICAgICBpZiAoKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpICYmIChlLmtleSA9PT0gJ3MnIHx8IGUua2V5ID09PSAnUycpKSB7IGUucHJldmVudERlZmF1bHQoKTsgYWN0RG93bmxvYWQoKTsgfQogICAgfTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfa2V5SGFuZGxlcik7CiAgfQoKICBmdW5jdGlvbiBidWlsZENocm9tZSgpIHsKICAgIHZhciBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogICAgdmFyIGNsb3NlQnRuID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6ICdnbGFzcy1idXR0b24gdi1zdHVkaW9fX2Nsb3NlJywgdHlwZTogJ2J1dHRvbicsIHRpdGxlOiAnQ2xvc2UnLCAnYXJpYS1sYWJlbCc6ICdDbG9zZScsCiAgICAgIHN0eWxlOiBjbG9zZUJ0blN0eWxlKCkKICAgIH0pOwogICAgY2xvc2VCdG4uYXBwZW5kQ2hpbGQoaWNvbignY2xvc2UnKSk7CiAgICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgY2xvc2UoKTsgfSk7CiAgICBmcmFnLmFwcGVuZENoaWxkKGNsb3NlQnRuKTsKCiAgICBpZiAoX3NpYmxpbmdzLmxlbmd0aCA+IDEpIHsKICAgICAgdmFyIHByZXYgPSBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAnZ2xhc3MtYnV0dG9uIHYtc3R1ZGlvX19uYXYnLCB0eXBlOiAnYnV0dG9uJywgdGl0bGU6ICdQcmV2aW91cycsICdhcmlhLWxhYmVsJzogJ1ByZXZpb3VzIGltYWdlJywKICAgICAgICBkaXNhYmxlZDogX2luZGV4IDw9IDAsIHN0eWxlOiBjaHJvbWVCdG5TdHlsZSh7IHRvcDogJzUwJScsIGxlZnQ6ICcxNnB4JywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtNTAlKScgfSkKICAgICAgfSk7CiAgICAgIHByZXYuYXBwZW5kQ2hpbGQoaWNvbignYXJyb3dMZWZ0JykpOwogICAgICBwcmV2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBuYXZpZ2F0ZSgtMSk7IH0pOwoKICAgICAgdmFyIG5leHQgPSBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAnZ2xhc3MtYnV0dG9uIHYtc3R1ZGlvX19uYXYnLCB0eXBlOiAnYnV0dG9uJywgdGl0bGU6ICdOZXh0JywgJ2FyaWEtbGFiZWwnOiAnTmV4dCBpbWFnZScsCiAgICAgICAgZGlzYWJsZWQ6IF9pbmRleCA+PSBfc2libGluZ3MubGVuZ3RoIC0gMSwgc3R5bGU6IGNocm9tZUJ0blN0eWxlKHsgdG9wOiAnNTAlJywgcmlnaHQ6ICcxNnB4JywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtNTAlKScgfSkKICAgICAgfSk7CiAgICAgIG5leHQuYXBwZW5kQ2hpbGQoaWNvbignYXJyb3dSaWdodCcpKTsKICAgICAgbmV4dC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgbmF2aWdhdGUoMSk7IH0pOwoKICAgICAgdmFyIGNvdW50ZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19jb3VudGVyIHYtbW9ubycsICdhcmlhLWhpZGRlbic6ICd0cnVlJywKICAgICAgICB0ZXh0OiAoX2luZGV4ICsgMSkgKyAnIC8gJyArIF9zaWJsaW5ncy5sZW5ndGgsIHN0eWxlOiB7CiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJywgdG9wOiAnY2FsYyhlbnYoc2FmZS1hcmVhLWluc2V0LXRvcCwgMHB4KSArIDIycHgpJywgbGVmdDogJzUwJScsCiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC01MCUpJywgcGFkZGluZzogJzVweCAxMnB4JywgYm9yZGVyUmFkaXVzOiAndmFyKC0tcmFkaXVzLXBpbGwsIDYzcHgpJywKICAgICAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsMCwwLC40NSknLCBjb2xvcjogSU5LX1NPRlQsIGZvbnRTaXplOiAnMTJweCcsIHpJbmRleDogJzYnCiAgICAgICAgfSB9KTsKICAgICAgZnJhZy5hcHBlbmRDaGlsZChwcmV2KTsgZnJhZy5hcHBlbmRDaGlsZChuZXh0KTsgZnJhZy5hcHBlbmRDaGlsZChjb3VudGVyKTsKICAgIH0KICAgIHJldHVybiBmcmFnOwogIH0KCiAgZnVuY3Rpb24gY2hyb21lQnRuU3R5bGUocG9zKSB7CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7CiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB6SW5kZXg6ICc2Jywgd2lkdGg6ICc0NHB4JywgaGVpZ2h0OiAnNDRweCcsCiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsCiAgICAgIGJvcmRlclJhZGl1czogJzUwJScsIGNvbG9yOiBJTkssIGN1cnNvcjogJ3BvaW50ZXInCiAgICB9LCBwb3MgfHwge30pOwogIH0KCiAgZnVuY3Rpb24gY2xvc2VCdG5TdHlsZSgpIHsKICAgIHJldHVybiB7CiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB6SW5kZXg6ICcyMCcsIHdpZHRoOiAnNTBweCcsIGhlaWdodDogJzUwcHgnLAogICAgICB0b3A6ICdjYWxjKGVudihzYWZlLWFyZWEtaW5zZXQtdG9wLCAwcHgpICsgMTZweCknLCByaWdodDogJzE2cHgnLAogICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLCBhbGlnbkl0ZW1zOiAnY2VudGVyJywganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLAogICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLCBjdXJzb3I6ICdwb2ludGVyJwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHJvb3RTdHlsZSgpIHsKICAgIHJldHVybiB7CiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLCB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICcxMDAlJywKICAgICAgZGlzcGxheTogJ2ZsZXgnLCBhbGlnbkl0ZW1zOiAnc3RyZXRjaCcsIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJywKICAgICAgZ2FwOiAnMjBweCcsIHBhZGRpbmc6ICdjYWxjKGVudihzYWZlLWFyZWEtaW5zZXQtdG9wLCAwcHgpICsgNjRweCkgMjBweCBjYWxjKGVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tLCAwcHgpICsgMjBweCknLAogICAgICBib3hTaXppbmc6ICdib3JkZXItYm94Jywgb3V0bGluZTogJ25vbmUnCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gYXBwbHlSZXNwb25zaXZlTGF5b3V0KG5vZGUsIG1lZGlhLCBwYW5lbCkgewogICAgaWYgKCFub2RlIHx8ICFtZWRpYSB8fCAhcGFuZWwpIHJldHVybjsKICAgIHZhciBuYXJyb3cgPSAod2luZG93LmlubmVyV2lkdGggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIHx8IDApIDwgODgwOwogICAgaWYgKG5hcnJvdykgewogICAgICBub2RlLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAnY29sdW1uJzsKICAgICAgbm9kZS5zdHlsZS5hbGlnbkl0ZW1zID0gJ3N0cmV0Y2gnOwogICAgICBub2RlLnN0eWxlLnBhZGRpbmcgPSAnY2FsYyhlbnYoc2FmZS1hcmVhLWluc2V0LXRvcCwgMHB4KSArIDYwcHgpIDE0cHggY2FsYyhlbnYoc2FmZS1hcmVhLWluc2V0LWJvdHRvbSwgMHB4KSArIDE0cHgpJzsKICAgICAgbWVkaWEuc3R5bGUuZmxleCA9ICcxIDEgYXV0byc7CiAgICAgIHBhbmVsLnN0eWxlLndpZHRoID0gJzEwMCUnOwogICAgICBwYW5lbC5zdHlsZS5tYXhIZWlnaHQgPSAnNDV2aCc7CiAgICAgIHBhbmVsLnN0eWxlLmZsZXggPSAnMCAwIGF1dG8nOwogICAgfSBlbHNlIHsKICAgICAgbm9kZS5zdHlsZS5mbGV4RGlyZWN0aW9uID0gJ3Jvdyc7CiAgICAgIG5vZGUuc3R5bGUuYWxpZ25JdGVtcyA9ICdzdHJldGNoJzsKICAgICAgbWVkaWEuc3R5bGUuZmxleCA9ICcxIDEgYXV0byc7CiAgICAgIHBhbmVsLnN0eWxlLndpZHRoID0gJ21pbigzODBweCwgOTJ2dyknOwogICAgICBwYW5lbC5zdHlsZS5tYXhIZWlnaHQgPSAnMTAwJSc7CiAgICAgIHBhbmVsLnN0eWxlLmZsZXggPSAnMCAwIGF1dG8nOwogICAgfQogIH0KCiAgZnVuY3Rpb24gbW91bnRTa2VsZXRvbihyb290KSB7CiAgICB2YXIgdWkgPSBVSSgpOwogICAgdmFyIG5vZGUgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvIHYtc3R1ZGlvLS1sb2FkaW5nJywgcm9sZTogJ2RpYWxvZycsICdhcmlhLW1vZGFsJzogJ3RydWUnLCAnYXJpYS1sYWJlbCc6ICdMb2FkaW5nIGltYWdlJywgc3R5bGU6IHJvb3RTdHlsZSgpIH0pOwogICAgdmFyIG1lZGlhID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0dWRpb19fbWVkaWEnLCBzdHlsZTogeyBmbGV4OiAnMSAxIGF1dG8nLCBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsIG1pbkhlaWdodDogJzAnLCBtaW5XaWR0aDogJzAnIH0gfSk7CiAgICB2YXIgc2tlbCA9ICh1aSAmJiB0eXBlb2YgdWkuc2tlbGV0b24gPT09ICdmdW5jdGlvbicpID8gdWkuc2tlbGV0b24oJ3NxdWFyZScpIDogZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNrZWxldG9uJywgc3R5bGU6IHsgd2lkdGg6ICc2MHZoJywgbWF4V2lkdGg6ICc5MCUnLCBhc3BlY3RSYXRpbzogJzEgLyAxJyB9IH0pOwogICAgaWYgKHNrZWwpIG1lZGlhLmFwcGVuZENoaWxkKHNrZWwpOwogICAgdmFyIHBhbmVsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0dWRpb19fcGFuZWwgZ2xhc3MtY2FyZCcsIHN0eWxlOiBwYW5lbFN0eWxlKCkgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNrZWxldG9uJywgc3R5bGU6IHsgaGVpZ2h0OiAnNjRweCcsIHdpZHRoOiAnMTAwJScgfSB9KSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNrZWxldG9uJywgc3R5bGU6IHsgaGVpZ2h0OiAnMjhweCcsIHdpZHRoOiAnNzAlJyB9IH0pLAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24nLCBzdHlsZTogeyBoZWlnaHQ6ICc4OHB4Jywgd2lkdGg6ICcxMDAlJyB9IH0pCiAgICApOwogICAgdmFyIGNsb3NlQnRuID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICdnbGFzcy1idXR0b24gdi1zdHVkaW9fX2Nsb3NlJywgdHlwZTogJ2J1dHRvbicsICdhcmlhLWxhYmVsJzogJ0Nsb3NlJywgc3R5bGU6IGNsb3NlQnRuU3R5bGUoKSB9KTsKICAgIGNsb3NlQnRuLmFwcGVuZENoaWxkKGljb24oJ2Nsb3NlJykpOwogICAgY2xvc2VCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7IGNsb3NlKCk7IH0pOwogICAgbm9kZS5hcHBlbmRDaGlsZChjbG9zZUJ0bik7CiAgICBub2RlLmFwcGVuZENoaWxkKG1lZGlhKTsKICAgIG5vZGUuYXBwZW5kQ2hpbGQocGFuZWwpOwogICAgYXBwbHlSZXNwb25zaXZlTGF5b3V0KG5vZGUsIG1lZGlhLCBwYW5lbCk7CiAgICByb290LmFwcGVuZENoaWxkKG5vZGUpOwogICAgX25vZGUgPSBub2RlOwogIH0KCiAgZnVuY3Rpb24gbW91bnROb3RGb3VuZChyb290KSB7CiAgICB2YXIgdWkgPSBVSSgpOwogICAgdmFyIG5vZGUgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvIHYtc3R1ZGlvLS1lbXB0eScsIHJvbGU6ICdkaWFsb2cnLCAnYXJpYS1tb2RhbCc6ICd0cnVlJywgc3R5bGU6IE9iamVjdC5hc3NpZ24ocm9vdFN0eWxlKCksIHsgYWxpZ25JdGVtczogJ2NlbnRlcicgfSkgfSk7CiAgICB2YXIgY2xvc2VCdG4gPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ2dsYXNzLWJ1dHRvbiB2LXN0dWRpb19fY2xvc2UnLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiAnQ2xvc2UnLCBzdHlsZTogY2xvc2VCdG5TdHlsZSgpIH0pOwogICAgY2xvc2VCdG4uYXBwZW5kQ2hpbGQoaWNvbignY2xvc2UnKSk7CiAgICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgY2xvc2UoKTsgfSk7CiAgICBub2RlLmFwcGVuZENoaWxkKGNsb3NlQnRuKTsKICAgIHZhciBjb250ZW50OwogICAgaWYgKHVpICYmIHR5cGVvZiB1aS5lbXB0eSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBjb250ZW50ID0gdWkuZW1wdHkoJ1dlIGNvdWxkbuKAmXQgZmluZCB0aGF0IGltYWdlLicsICdCYWNrIHRvIExpYnJhcnknLCBmdW5jdGlvbiAoKSB7IGdvKCcjL2xpYnJhcnknKTsgfSk7CiAgICB9IGVsc2UgewogICAgICBjb250ZW50ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5Jywgc3R5bGU6IHsgbWFyZ2luOiAnYXV0bycsIHRleHRBbGlnbjogJ2NlbnRlcicgfSB9LAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZW1wdHlfX21zZycsIHRleHQ6ICdXZSBjb3VsZG7igJl0IGZpbmQgdGhhdCBpbWFnZS4nIH0pLAogICAgICAgIGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0JywgdHlwZTogJ2J1dHRvbicsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvbGlicmFyeScpOyB9IH0sICdCYWNrIHRvIExpYnJhcnknKQogICAgICApOwogICAgfQogICAgbm9kZS5hcHBlbmRDaGlsZChjb250ZW50KTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICBfbm9kZSA9IG5vZGU7CiAgfQoKICBmdW5jdGlvbiBtb3VudFN0dWRpbyhyb290KSB7CiAgICBfc2libGluZ3MgPSBidWlsZFNpYmxpbmdzKF9pbWFnZSk7CiAgICB2YXIgaWQgPSBpbWFnZUlEKF9pbWFnZSk7CiAgICBfaW5kZXggPSBfc2libGluZ3MuZmluZEluZGV4ID8gX3NpYmxpbmdzLmZpbmRJbmRleChmdW5jdGlvbiAoeCkgeyByZXR1cm4gaW1hZ2VJRCh4KSA9PT0gaWQ7IH0pIDogaW5kZXhPZihfc2libGluZ3MsIGlkKTsKCiAgICB2YXIgbm9kZSA9IGVsKCdkaXYnLCB7CiAgICAgIGNsYXNzOiAndi1zdHVkaW8nLCByb2xlOiAnZGlhbG9nJywgJ2FyaWEtbW9kYWwnOiAndHJ1ZScsCiAgICAgICdhcmlhLWxhYmVsJzogX2ltYWdlLnByb21wdCA/ICgnSW1hZ2U6ICcgKyBfaW1hZ2UucHJvbXB0LnNsaWNlKDAsIDYwKSkgOiAnSW1hZ2UgZGV0YWlsJywKICAgICAgdGFiaW5kZXg6ICctMScsIHN0eWxlOiByb290U3R5bGUoKQogICAgfSk7CgogICAgdmFyIG1lZGlhID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0dWRpb19fbWVkaWEnLCBzdHlsZTogeyBmbGV4OiAnMSAxIGF1dG8nLCBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsIG1pbkhlaWdodDogJzAnLCBtaW5XaWR0aDogJzAnIH0gfSk7CiAgICB2YXIgc3RhZ2VFbCA9IGJ1aWxkTWVkaWEoKTsKICAgIG1lZGlhLmFwcGVuZENoaWxkKHN0YWdlRWwpOwoKICAgIHZhciBwYW5lbCA9IGJ1aWxkUGFuZWwoKTsKCiAgICBub2RlLmFwcGVuZENoaWxkKGJ1aWxkQ2hyb21lKCkpOwogICAgbm9kZS5hcHBlbmRDaGlsZChtZWRpYSk7CiAgICBub2RlLmFwcGVuZENoaWxkKHBhbmVsKTsKCiAgICBhcHBseVJlc3BvbnNpdmVMYXlvdXQobm9kZSwgbWVkaWEsIHBhbmVsKTsKCiAgICByb290LmFwcGVuZENoaWxkKG5vZGUpOwogICAgX25vZGUgPSBub2RlOwoKICAgIHdpcmVLZXlzKCk7CiAgICB3aXJlU3dpcGVEaXNtaXNzKG5vZGUpOwogICAgd2lyZURyb3BQYXN0ZShzdGFnZUVsKTsKICAgIF9yZXNpemVIYW5kbGVyID0gZnVuY3Rpb24gKCkgeyBpZiAoIV9kaXNwb3NlZCAmJiBfbm9kZSkgYXBwbHlSZXNwb25zaXZlTGF5b3V0KF9ub2RlLCBfbm9kZS5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX21lZGlhJyksIF9ub2RlLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fcGFuZWwnKSk7IH07CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgX3Jlc2l6ZUhhbmRsZXIpOwoKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB0cnkgeyBub2RlLmZvY3VzKCk7IH0gY2F0Y2ggKGUpIHt9IH0sIDIwKTsKICB9CgogIGZ1bmN0aW9uIGluZGV4T2YoYXJyLCBpZCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgaWYgKGltYWdlSUQoYXJyW2ldKSA9PT0gaWQpIHJldHVybiBpOyB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBWLnZpZXdzLnN0dWRpbyA9IHsKICAgIHJlbmRlcjogZnVuY3Rpb24gKHJvb3QsIHBhcmFtcykgewogICAgICB0aGlzLnRlYXJkb3duKCk7CiAgICAgIF9kaXNwb3NlZCA9IGZhbHNlOwogICAgICBfcm9vdCA9IHJvb3Q7CiAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTsKICAgICAgdmFyIGlkID0gcGFyYW1zLmlkIHx8IHBhcmFtcy5pbWFnZUlEIHx8IHBhcmFtcy5pbWFnZUlkIHx8IHBhcmFtcy5pbWFnZSB8fCBudWxsOwogICAgICBpZiAoaWQpIGlkID0gU3RyaW5nKGlkKTsKCiAgICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICAgIF9ub2RlID0gbnVsbDsKCiAgICAgIGlmICghaWQpIHsgbW91bnROb3RGb3VuZChyb290KTsgcmV0dXJuOyB9CgogICAgICB2YXIgbG9jYWwgPSBmaW5kSW5TdGF0ZShpZCk7CiAgICAgIGlmIChsb2NhbCkgeyBfaW1hZ2UgPSBsb2NhbDsgbW91bnRTdHVkaW8ocm9vdCk7IHJldHVybjsgfQoKICAgICAgbW91bnRTa2VsZXRvbihyb290KTsKICAgICAgcmVzb2x2ZUltYWdlKGlkKS50aGVuKGZ1bmN0aW9uIChpbWcpIHsKICAgICAgICBpZiAoX2Rpc3Bvc2VkKSByZXR1cm47CiAgICAgICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgICAgICBfbm9kZSA9IG51bGw7CiAgICAgICAgaWYgKCFpbWcpIHsgbW91bnROb3RGb3VuZChyb290KTsgcmV0dXJuOyB9CiAgICAgICAgX2ltYWdlID0gaW1nOwogICAgICAgIG1vdW50U3R1ZGlvKHJvb3QpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKF9kaXNwb3NlZCkgcmV0dXJuOwogICAgICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgX25vZGUgPSBudWxsOwogICAgICAgIG1vdW50Tm90Rm91bmQocm9vdCk7CiAgICAgIH0pOwogICAgfSwKCiAgICB0ZWFyZG93bjogZnVuY3Rpb24gKCkgewogICAgICBfZGlzcG9zZWQgPSB0cnVlOwogICAgICBpZiAoX2tleUhhbmRsZXIpIHsgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9rZXlIYW5kbGVyKTsgX2tleUhhbmRsZXIgPSBudWxsOyB9CiAgICAgIGlmIChfcGFzdGVIYW5kbGVyKSB7IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgX3Bhc3RlSGFuZGxlcik7IF9wYXN0ZUhhbmRsZXIgPSBudWxsOyB9CiAgICAgIGlmIChfcmVzaXplSGFuZGxlcikgeyB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgX3Jlc2l6ZUhhbmRsZXIpOyBfcmVzaXplSGFuZGxlciA9IG51bGw7IH0KICAgICAgaWYgKF9wb2xsQWJvcnQpIHsgdHJ5IHsgX3BvbGxBYm9ydC5hYm9ydCgpOyB9IGNhdGNoIChlKSB7fSBfcG9sbEFib3J0ID0gbnVsbDsgfQogICAgICBkZXN0cm95U2NydWIoKTsKICAgICAgX25vZGUgPSBudWxsOwogICAgICBfaW1hZ2UgPSBudWxsOwogICAgICBfc2libGluZ3MgPSBbXTsKICAgICAgX2luZGV4ID0gLTE7CiAgICB9CiAgfTsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvcHJvZmlsZS5qcyA9PT09PSAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIFYgPSB3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9OwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwoKICBmdW5jdGlvbiBlbCh0YWcsIGF0dHJzKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5lbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICByZXR1cm4gVi51aS5lbC5hcHBseShWLnVpLCBhcmd1bWVudHMpOwogICAgfQogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICB2YXIgY2hpbGRyZW4gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogICAgaWYgKG5vZGUgJiYgYXR0cnMpIHsKICAgICAgZm9yICh2YXIgayBpbiBhdHRycykgewogICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGF0dHJzLCBrKSkgY29udGludWU7CiAgICAgICAgdmFyIHZhbCA9IGF0dHJzW2tdOwogICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCB2YWwgPT09IGZhbHNlKSBjb250aW51ZTsKICAgICAgICBpZiAoayA9PT0gJ2NsYXNzJyB8fCBrID09PSAnY2xhc3NOYW1lJykgbm9kZS5jbGFzc05hbWUgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ3RleHQnKSBub2RlLnRleHRDb250ZW50ID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICdodG1sJykgbm9kZS5pbm5lckhUTUwgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ3N0eWxlJyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JykgewogICAgICAgICAgZm9yICh2YXIgc2sgaW4gdmFsKSBub2RlLnN0eWxlW3NrXSA9IHZhbFtza107CiAgICAgICAgfSBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGsuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgdmFsKTsKICAgICAgICB9IGVsc2UgaWYgKGsgPT09ICd2YWx1ZScgfHwgayA9PT0gJ2NoZWNrZWQnIHx8IGsgPT09ICdkaXNhYmxlZCcgfHwgayA9PT0gJ3NlbGVjdGVkJykgewogICAgICAgICAgbm9kZVtrXSA9IHZhbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdmFsKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGFwcGVuZENoaWxkcmVuKG5vZGUsIGNoaWxkcmVuKTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gYXBwZW5kQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW4pIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGMgPSBjaGlsZHJlbltpXTsKICAgICAgaWYgKGMgPT0gbnVsbCB8fCBjID09PSBmYWxzZSB8fCBjID09PSB0cnVlKSBjb250aW51ZTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHsgYXBwZW5kQ2hpbGRyZW4obm9kZSwgYyk7IGNvbnRpbnVlOyB9CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodHlwZW9mIGMgPT09ICdvYmplY3QnICYmIGMubm9kZVR5cGUgPyBjIDogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGMpKSk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIGljb24obmFtZSkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaWNvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgb3V0ID0gVi51aS5pY29uKG5hbWUpOwogICAgICBpZiAob3V0ICYmIG91dC5ub2RlVHlwZSkgcmV0dXJuIG91dDsKICAgICAgdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIHNwYW4uY2xhc3NOYW1lID0gJ3YtaWNvJzsKICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgc3Bhbi5pbm5lckhUTUwgPSBvdXQgfHwgJyc7CiAgICAgIHJldHVybiBzcGFuOwogICAgfQogICAgdmFyIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICBzLmNsYXNzTmFtZSA9ICd2LWljbyc7CiAgICBzLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgcy50ZXh0Q29udGVudCA9ICcnOwogICAgcmV0dXJuIHM7CiAgfQoKICBmdW5jdGlvbiB0b2FzdChtc2csIGtpbmQpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnRvYXN0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51aS50b2FzdChtc2csIGtpbmQpOwogICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuZW1pdCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYuc3RvcmUuZW1pdCgndG9hc3QnLCB7IG1lc3NhZ2U6IG1zZywga2luZDoga2luZCB8fCAnaW5mbycgfSk7CiAgfQoKICBmdW5jdGlvbiBjb25maXJtRGlhbG9nKG1zZykgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuY29uZmlybSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgciA9IFYudWkuY29uZmlybShtc2cpOwogICAgICByZXR1cm4gKHIgJiYgdHlwZW9mIHIudGhlbiA9PT0gJ2Z1bmN0aW9uJykgPyByIDogUHJvbWlzZS5yZXNvbHZlKCEhcik7CiAgICB9CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5jb25maXJtKG1zZykpOwogIH0KCiAgZnVuY3Rpb24gZ28oaGFzaCkgewogICAgaWYgKFYucm91dGVyICYmIHR5cGVvZiBWLnJvdXRlci5nbyA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYucm91dGVyLmdvKGhhc2gpOwogICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSBoYXNoOwogIH0KCiAgZnVuY3Rpb24gY2xvc2VEcmF3ZXIoKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5yb3V0ZXIgJiYgdHlwZW9mIFYucm91dGVyLmNsb3NlRHJhd2VyID09PSAnZnVuY3Rpb24nKSB7IFYucm91dGVyLmNsb3NlRHJhd2VyKCk7IHJldHVybjsgfQogICAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jbG9zZURyYXdlciA9PT0gJ2Z1bmN0aW9uJykgeyBWLnVpLmNsb3NlRHJhd2VyKCk7IHJldHVybjsgfQogICAgICBpZiAoVi5hcHAgJiYgdHlwZW9mIFYuYXBwLmNsb3NlRHJhd2VyID09PSAnZnVuY3Rpb24nKSB7IFYuYXBwLmNsb3NlRHJhd2VyKCk7IHJldHVybjsgfQogICAgICBpZiAodHlwZW9mIFYuY2xvc2VEcmF3ZXIgPT09ICdmdW5jdGlvbicpIHsgVi5jbG9zZURyYXdlcigpOyByZXR1cm47IH0KICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB0cnkgeyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndi1kcmF3ZXItb3BlbicpOyB9IGNhdGNoIChlKSB7fQogICAgdmFyIGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndi1hY2NvdW50LWRyYXdlcicpOwogICAgdmFyIHNjcmltID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnYtc2NyaW0nKTsKICAgIGlmIChkKSB7IGQuY2xhc3NMaXN0LnJlbW92ZSgndi1kcmF3ZXItLWluJyk7IGQuaGlkZGVuID0gdHJ1ZTsgfQogICAgaWYgKHNjcmltKSB7IHNjcmltLmNsYXNzTGlzdC5yZW1vdmUoJ3Ytc2NyaW0tLWluJyk7IHNjcmltLmhpZGRlbiA9IHRydWU7IH0KICB9CgogIGZ1bmN0aW9uIG5hdmlnYXRlKGhhc2gpIHsKICAgIGNsb3NlRHJhd2VyKCk7CiAgICBnbyhoYXNoKTsKICB9CgogIGZ1bmN0aW9uIHNnZXQoa2V5LCBmYWxsYmFjaykgewogICAgdHJ5IHsKICAgICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuZ2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdmFyIHYgPSBWLnN0b3JlLmdldChrZXkpOwogICAgICAgIHJldHVybiB2ID09IG51bGwgPyBmYWxsYmFjayA6IHY7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHt9CiAgICByZXR1cm4gZmFsbGJhY2s7CiAgfQogIGZ1bmN0aW9uIHNzZXQoa2V5LCB2YWx1ZSkgewogICAgdHJ5IHsKICAgICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuc2V0ID09PSAnZnVuY3Rpb24nKSBWLnN0b3JlLnNldChrZXksIHZhbHVlKTsKICAgICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuc2F2ZSA9PT0gJ2Z1bmN0aW9uJykgVi5zdG9yZS5zYXZlKCk7CiAgICB9IGNhdGNoIChlKSB7fQogIH0KCiAgZnVuY3Rpb24gc2V0dGluZ3MoKSB7CiAgICB2YXIgcyA9IHNnZXQoJ3NldHRpbmdzJywgbnVsbCk7CiAgICBpZiAoIXMgfHwgdHlwZW9mIHMgIT09ICdvYmplY3QnKSB7CiAgICAgIHMgPSB7fTsKICAgICAgdHJ5IHsgaWYgKFYuc3RhdGUpIFYuc3RhdGUuc2V0dGluZ3MgPSBzOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgcmV0dXJuIHM7CiAgfQogIGZ1bmN0aW9uIHNldHRpbmdDaGFuZ2Uoa2V5LCB2YWx1ZSkgewogICAgdmFyIHMgPSBzZXR0aW5ncygpOwogICAgc1trZXldID0gdmFsdWU7CiAgICBzc2V0KCdzZXR0aW5ncycsIHMpOwogIH0KCiAgdmFyIExTX1BSRUZJWCA9ICd2YW1wX3dlYl8nOwogIGZ1bmN0aW9uIGxzR2V0KGtleSwgZmFsbGJhY2spIHsKICAgIHRyeSB7CiAgICAgIHZhciByYXcgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfUFJFRklYICsga2V5KTsKICAgICAgaWYgKHJhdyA9PSBudWxsKSByZXR1cm4gZmFsbGJhY2s7CiAgICAgIHRyeSB7IHJldHVybiBKU09OLnBhcnNlKHJhdyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIHJhdzsgfQogICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsbGJhY2s7IH0KICB9CiAgZnVuY3Rpb24gbHNTZXQoa2V5LCB2YWx1ZSkgewogICAgdHJ5IHsgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKExTX1BSRUZJWCArIGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsgfSBjYXRjaCAoZSkge30KICB9CgogIGZ1bmN0aW9uIGN1cnJlbnRVc2VyKCkgewogICAgdHJ5IHsgcmV0dXJuIChWLnN0YXRlICYmIFYuc3RhdGUudXNlcikgfHwgbnVsbDsgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogIH0KICBmdW5jdGlvbiB1c2VySWRlbnRpdHkodSkgewogICAgdSA9IHUgfHwgY3VycmVudFVzZXIoKSB8fCB7fTsKICAgIHZhciBtaWNybyA9ICh1Lmdsb2JhbCAmJiB1Lmdsb2JhbC5taWNybykgfHwge307CiAgICB2YXIgaWQgPSBtaWNyby5pZCB8fCB1LmlkIHx8IG51bGw7CiAgICB2YXIgdXNlcm5hbWUgPSBtaWNyby51c2VybmFtZSB8fCB1LnVzZXJuYW1lIHx8ICcnOwogICAgdmFyIG5hbWUgPSB1Lm5hbWUgfHwgKHUuZmlyc3ROYW1lID8gKHUuZmlyc3ROYW1lICsgKHUubGFzdE5hbWUgPyAnICcgKyB1Lmxhc3ROYW1lIDogJycpKSA6ICcnKSB8fCB1c2VybmFtZSB8fCAnJzsKICAgIHZhciBlbWFpbCA9IHUuZW1haWwgfHwgKHUuZ2xvYmFsICYmIHUuZ2xvYmFsLmVtYWlsKSB8fCAnJzsKICAgIHZhciBhdmF0YXIgPSBtaWNyby5wcm9maWxlUGljVVJMIHx8IHUucHJvZmlsZVBpY1VSTCB8fCAodS5nbG9iYWwgJiYgdS5nbG9iYWwucHJvZmlsZVBpY1VSTCkgfHwgJyc7CiAgICB2YXIgYWRtaW4gPSAhISh1LmFkbWluIHx8ICh1Lmdsb2JhbCAmJiB1Lmdsb2JhbC5hZG1pbikpOwogICAgcmV0dXJuIHsgaWQ6IGlkLCB1c2VybmFtZTogdXNlcm5hbWUsIG5hbWU6IG5hbWUsIGVtYWlsOiBlbWFpbCwgYXZhdGFyOiBhdmF0YXIsIGFkbWluOiBhZG1pbiB9OwogIH0KCiAgZnVuY3Rpb24gY3JlZGl0c1ZhbHVlKCkgewogICAgdHJ5IHsKICAgICAgaWYgKFYuc3RhdGUgJiYgVi5zdGF0ZS5jcmVkaXRzICE9IG51bGwpIHJldHVybiBWLnN0YXRlLmNyZWRpdHM7CiAgICAgIHZhciB1ID0gY3VycmVudFVzZXIoKTsKICAgICAgaWYgKHUgJiYgdS5jcmVkaXRzICE9IG51bGwpIHJldHVybiB1LmNyZWRpdHM7CiAgICB9IGNhdGNoIChlKSB7fQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiByZWZyZXNoQ3JlZGl0cygpIHsKICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLmNyZWRpdHMgIT09ICdmdW5jdGlvbicpIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7CiAgICByZXR1cm4gVi5hcGkuY3JlZGl0cygpLnRoZW4oZnVuY3Rpb24gKHIpIHsKICAgICAgdmFyIG4gPSAociAmJiAoci5jcmVkaXRzICE9IG51bGwgPyByLmNyZWRpdHMgOiByKSkgfHwgMDsKICAgICAgdHJ5IHsgaWYgKFYuc3RhdGUpIFYuc3RhdGUuY3JlZGl0cyA9IG47IH0gY2F0Y2ggKGUpIHt9CiAgICAgIHRyeSB7IGlmIChWLnN0b3JlKSB7IFYuc3RvcmUuc2V0KCdjcmVkaXRzJywgbik7IFYuc3RvcmUuZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgbik7IH0gfSBjYXRjaCAoZSkge30KICAgICAgcmV0dXJuIG47CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9KTsKICB9CgogIGZ1bmN0aW9uIGF2YXRhck5vZGUoaWRlbnQsIHNpemUpIHsKICAgIHNpemUgPSBzaXplIHx8IDU2OwogICAgdmFyIGJveCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2F2YXRhcicsIHN0eWxlOiB7IHdpZHRoOiBzaXplICsgJ3B4JywgaGVpZ2h0OiBzaXplICsgJ3B4JywgYm9yZGVyUmFkaXVzOiAnNTAlJyB9IH0pOwogICAgaWYgKGlkZW50LmF2YXRhcikgewogICAgICB2YXIgaW1nID0gZWwoJ2ltZycsIHsKICAgICAgICBzcmM6IGlkZW50LmF2YXRhciwKICAgICAgICBhbHQ6IChpZGVudC5uYW1lIHx8IGlkZW50LnVzZXJuYW1lIHx8ICdBdmF0YXInKQogICAgICB9KTsKICAgICAgaWYgKGltZyAmJiBpbWcuc2V0QXR0cmlidXRlKSBpbWcuc2V0QXR0cmlidXRlKCdsb2FkaW5nJywgJ2xhenknKTsKICAgICAgaWYgKGltZyAmJiBpbWcuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGltZy5yZW1vdmUoKTsKICAgICAgICAgIGJveC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIG51bGwsIGluaXRpYWxzKGlkZW50KSkpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmIChpbWcpIGJveC5hcHBlbmRDaGlsZChpbWcpOwogICAgfSBlbHNlIHsKICAgICAgYm94LmFwcGVuZENoaWxkKGVsKCdzcGFuJywgbnVsbCwgaW5pdGlhbHMoaWRlbnQpKSk7CiAgICB9CiAgICByZXR1cm4gYm94OwogIH0KICBmdW5jdGlvbiBpbml0aWFscyhpZGVudCkgewogICAgdmFyIGJhc2UgPSAoaWRlbnQubmFtZSB8fCBpZGVudC51c2VybmFtZSB8fCBpZGVudC5lbWFpbCB8fCAnVicpLnRyaW0oKTsKICAgIHZhciBwYXJ0cyA9IGJhc2Uuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKTsKICAgIHZhciBpbml0cyA9IHBhcnRzLmxlbmd0aCA+PSAyCiAgICAgID8gKHBhcnRzWzBdWzBdICsgcGFydHNbcGFydHMubGVuZ3RoIC0gMV1bMF0pCiAgICAgIDogYmFzZS5zbGljZSgwLCAyKTsKICAgIHJldHVybiAoaW5pdHMgfHwgJ1YnKS50b1VwcGVyQ2FzZSgpOwogIH0KCiAgZnVuY3Rpb24gc2VjdGlvbih0aXRsZSwgc3VidGl0bGUsIGNoaWxkcmVuKSB7CiAgICB2YXIgaGVhZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zZWN0aW9uX19oZWFkJyB9LAogICAgICBlbCgnaDInLCB7IGNsYXNzOiAndi1zZWN0aW9uX190aXRsZScsIHRleHQ6IHRpdGxlIH0pKTsKICAgIGlmIChzdWJ0aXRsZSkgaGVhZC5hcHBlbmRDaGlsZChlbCgncCcsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YicsIHRleHQ6IHN1YnRpdGxlIH0pKTsKICAgIHJldHVybiBlbCgnc2VjdGlvbicsIHsgY2xhc3M6ICd2LXNlY3Rpb24gZ2xhc3MtY2FyZCcgfSwgaGVhZCwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLW1kJyB9LCBjaGlsZHJlbiB8fCBbXSkpOwogIH0KCiAgZnVuY3Rpb24gc2V0dGluZ1JvdyhsYWJlbCwgY29udHJvbCwgaGludCkgewogICAgdmFyIGxhYmVsU3RhY2sgPSBlbCgnZGl2JywgewogICAgICBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcycHgnLCBtaW5XaWR0aDogJzAnLCBmbGV4OiAnMSAxIGF1dG8nIH0KICAgIH0sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1sYWJlbCcsIHRleHQ6IGxhYmVsIH0pKTsKICAgIGlmIChoaW50KSBsYWJlbFN0YWNrLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcgfSwgdGV4dDogaGludCB9KSk7CiAgICByZXR1cm4gZWwoJ2RpdicsIHsKICAgICAgY2xhc3M6ICd2LXJvdyB2LXJvdy0tYmV0d2VlbiB2LXJvdy0td3JhcCcsCiAgICAgIHN0eWxlOiB7IGdhcDogJ3ZhcigtLXNwYWNlLW1kLCAxNXB4KScsIGFsaWduSXRlbXM6ICdjZW50ZXInIH0KICAgIH0sIGxhYmVsU3RhY2ssIGVsKCdkaXYnLCB7IHN0eWxlOiB7IGZsZXg6ICcwIDAgYXV0bycgfSB9LCBjb250cm9sKSk7CiAgfQoKICBmdW5jdGlvbiB0b2dnbGUoY2hlY2tlZCwgb25DaGFuZ2UsIGFyaWFMYWJlbCkgewogICAgdmFyIGlucHV0ID0gZWwoJ2lucHV0JywgewogICAgICB0eXBlOiAnY2hlY2tib3gnLCBjaGVja2VkOiAhIWNoZWNrZWQsICdhcmlhLWxhYmVsJzogYXJpYUxhYmVsIHx8ICdUb2dnbGUnLAogICAgICByb2xlOiAnc3dpdGNoJywgJ2FyaWEtY2hlY2tlZCc6IGNoZWNrZWQgPyAndHJ1ZScgOiAnZmFsc2UnLAogICAgICBzdHlsZTogeyBwb3NpdGlvbjogJ2Fic29sdXRlJywgb3BhY2l0eTogJzAnLCB3aWR0aDogJzFweCcsIGhlaWdodDogJzFweCcsIHBvaW50ZXJFdmVudHM6ICdub25lJyB9CiAgICB9KTsKICAgIHZhciB0aHVtYiA9IGVsKCdzcGFuJywgewogICAgICBzdHlsZTogewogICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB0b3A6ICcycHgnLCBsZWZ0OiBjaGVja2VkID8gJzI0cHgnIDogJzJweCcsCiAgICAgICAgd2lkdGg6ICcyNHB4JywgaGVpZ2h0OiAnMjRweCcsIGJvcmRlclJhZGl1czogJzUwJScsIGJhY2tncm91bmQ6ICcjZmZmJywKICAgICAgICBib3hTaGFkb3c6ICcwIDFweCAzcHggcmdiYSgwLDAsMCwuMzUpJywKICAgICAgICB0cmFuc2l0aW9uOiAnbGVmdCB2YXIoLS1kdXItaW50ZXJhY3RpdmUsIDE0MG1zKSB2YXIoLS1lYXNlLXNwcmluZywgY3ViaWMtYmV6aWVyKDAuMzQsMS41NiwwLjY0LDEpKScKICAgICAgfQogICAgfSk7CiAgICB2YXIgdHJhY2sgPSBlbCgnc3BhbicsIHsKICAgICAgc3R5bGU6IHsKICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJywgZGlzcGxheTogJ2lubGluZS1ibG9jaycsIHdpZHRoOiAnNTBweCcsIGhlaWdodDogJzI4cHgnLAogICAgICAgIGJvcmRlclJhZGl1czogJzk5OXB4JywKICAgICAgICBiYWNrZ3JvdW5kOiBjaGVja2VkID8gJ3ZhcigtLXZhbXAtYWNjZW50LCAjNTI5N0Y4KScgOiAndmFyKC0tdi1saW5lLCByZ2JhKDI0NSwyNDUsMjQ3LC4xOCkpJywKICAgICAgICB0cmFuc2l0aW9uOiAnYmFja2dyb3VuZCB2YXIoLS1kdXItaW50ZXJhY3RpdmUsIDE0MG1zKSB2YXIoLS1nbGFzcy1lYXNlLCBjdWJpYy1iZXppZXIoMC40LDAsMC4yLDEpKScKICAgICAgfQogICAgfSwgdGh1bWIpOwogICAgdmFyIHdyYXAgPSBlbCgnbGFiZWwnLCB7CiAgICAgIHN0eWxlOiB7IGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBjdXJzb3I6ICdwb2ludGVyJyB9CiAgICB9LCBpbnB1dCwgdHJhY2spOwogICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICB2YXIgb24gPSBpbnB1dC5jaGVja2VkOwogICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtY2hlY2tlZCcsIG9uID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgICAgIHRodW1iLnN0eWxlLmxlZnQgPSBvbiA/ICcyNHB4JyA6ICcycHgnOwogICAgICB0cmFjay5zdHlsZS5iYWNrZ3JvdW5kID0gb24gPyAndmFyKC0tdmFtcC1hY2NlbnQsICM1Mjk3RjgpJyA6ICd2YXIoLS12LWxpbmUsIHJnYmEoMjQ1LDI0NSwyNDcsLjE4KSknOwogICAgICBvbkNoYW5nZShvbik7CiAgICB9KTsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0Q29udHJvbChvcHRpb25zLCB2YWx1ZSwgb25DaGFuZ2UsIGFyaWFMYWJlbCkgewogICAgdmFyIHNlbCA9IGVsKCdzZWxlY3QnLCB7IGNsYXNzOiAndi1zZWxlY3QnLCAnYXJpYS1sYWJlbCc6IGFyaWFMYWJlbCB8fCAnU2VsZWN0Jywgc3R5bGU6IHsgbWluV2lkdGg6ICcxODBweCcgfSB9KTsKICAgIG9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAobykgewogICAgICB2YXIgb3B0ID0gZWwoJ29wdGlvbicsIHsgdmFsdWU6IG8udmFsdWUsIHRleHQ6IG8ubGFiZWwgfSk7CiAgICAgIGlmIChTdHJpbmcoby52YWx1ZSkgPT09IFN0cmluZyh2YWx1ZSkpIG9wdC5zZWxlY3RlZCA9IHRydWU7CiAgICAgIHNlbC5hcHBlbmRDaGlsZChvcHQpOwogICAgfSk7CiAgICBzZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkgeyBvbkNoYW5nZShzZWwudmFsdWUpOyB9KTsKICAgIHJldHVybiBzZWw7CiAgfQoKICBmdW5jdGlvbiBpbmR1c3RyeUNsb3VkKHNlbGVjdGVkS2V5cywgb25Ub2dnbGUpIHsKICAgIHZhciBsaXN0ID0gKFYuZGF0YSAmJiBWLmRhdGEuaW5kdXN0cmllcykgfHwgW107CiAgICB2YXIgc2VsZWN0ZWQgPSB7fTsKICAgIChzZWxlY3RlZEtleXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGspIHsgc2VsZWN0ZWRba10gPSB0cnVlOyB9KTsKICAgIHZhciB3cmFwID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNoaXAtcm93Jywgc3R5bGU6IHsgZmxleFdyYXA6ICd3cmFwJywgb3ZlcmZsb3c6ICd2aXNpYmxlJyB9IH0pOwogICAgaWYgKCFsaXN0Lmxlbmd0aCkgewogICAgICB3cmFwLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCB0ZXh0OiAnTm8gaW5kdXN0cmllcyBhdmFpbGFibGUuJyB9KSk7CiAgICAgIHJldHVybiB3cmFwOwogICAgfQogICAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpbmQpIHsKICAgICAgdmFyIGtleSA9IGluZC5rZXk7CiAgICAgIHZhciBjaGlwID0gZWwoJ2J1dHRvbicsIHsKICAgICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgICBjbGFzczogJ3YtY2hpcCcgKyAoc2VsZWN0ZWRba2V5XSA/ICcgdi1jaGlwLS1hY3RpdmUnIDogJycpLAogICAgICAgICdhcmlhLXByZXNzZWQnOiBzZWxlY3RlZFtrZXldID8gJ3RydWUnIDogJ2ZhbHNlJwogICAgICB9LCBpbmQubGFiZWwgfHwga2V5KTsKICAgICAgY2hpcC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICBzZWxlY3RlZFtrZXldID0gIXNlbGVjdGVkW2tleV07CiAgICAgICAgY2hpcC5jbGFzc0xpc3QudG9nZ2xlKCd2LWNoaXAtLWFjdGl2ZScsIHNlbGVjdGVkW2tleV0pOwogICAgICAgIGNoaXAuc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCBzZWxlY3RlZFtrZXldID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzZWxlY3RlZCkuZmlsdGVyKGZ1bmN0aW9uIChrKSB7IHJldHVybiBzZWxlY3RlZFtrXTsgfSk7CiAgICAgICAgb25Ub2dnbGUoa2V5cyk7CiAgICAgIH0pOwogICAgICB3cmFwLmFwcGVuZENoaWxkKGNoaXApOwogICAgfSk7CiAgICByZXR1cm4gd3JhcDsKICB9CgogIGZ1bmN0aW9uIGluZHVzdHJ5QnViYmxlR3JpZChzZWxlY3RlZEtleXMsIG9uVG9nZ2xlKSB7CiAgICB2YXIgbGlzdCA9IChWLmRhdGEgJiYgVi5kYXRhLmluZHVzdHJpZXMpIHx8IFtdOwogICAgdmFyIHNlbGVjdGVkID0ge307CiAgICAoc2VsZWN0ZWRLZXlzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IHNlbGVjdGVkW2tdID0gdHJ1ZTsgfSk7CiAgICB2YXIgZ3JpZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1vbmJfX2dyaWQnLCByb2xlOiAnZ3JvdXAnLCAnYXJpYS1sYWJlbCc6ICdJbmR1c3RyaWVzJyB9KTsKICAgIGlmICghbGlzdC5sZW5ndGgpIHsKICAgICAgZ3JpZC5hcHBlbmRDaGlsZChlbCgncCcsIHsgY2xhc3M6ICd2LW11dGVkJywgdGV4dDogJ05vIGluZHVzdHJpZXMgYXZhaWxhYmxlLicgfSkpOwogICAgICByZXR1cm4gZ3JpZDsKICAgIH0KICAgIGZ1bmN0aW9uIGVtaXQoKSB7CiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc2VsZWN0ZWQpLmZpbHRlcihmdW5jdGlvbiAoaykgeyByZXR1cm4gc2VsZWN0ZWRba107IH0pOwogICAgICBvblRvZ2dsZShrZXlzKTsKICAgIH0KICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaW5kKSB7CiAgICAgIHZhciBrZXkgPSBpbmQua2V5OwogICAgICB2YXIgYnViYmxlID0gZWwoJ2J1dHRvbicsIHsKICAgICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgICBjbGFzczogJ3Ytb25iX19idWJibGUnICsgKHNlbGVjdGVkW2tleV0gPyAnIHYtb25iX19idWJibGUtLW9uJyA6ICcnKSwKICAgICAgICAnYXJpYS1wcmVzc2VkJzogc2VsZWN0ZWRba2V5XSA/ICd0cnVlJyA6ICdmYWxzZScKICAgICAgfSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LW9uYl9fYnViYmxlLW1hcmsnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSwgaWNvbignY2hlY2ttYXJrJykpLAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytb25iX19idWJibGUtdGl0bGUnLCB0ZXh0OiBpbmQubGFiZWwgfHwga2V5IH0pLAogICAgICAgIGluZC5wbGFjZWhvbGRlciA/IGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytb25iX19idWJibGUtZGVzYycsIHRleHQ6IGJ1YmJsZUhpbnQoaW5kLnBsYWNlaG9sZGVyKSB9KSA6IG51bGwpOwogICAgICBidWJibGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgc2VsZWN0ZWRba2V5XSA9ICFzZWxlY3RlZFtrZXldOwogICAgICAgIGJ1YmJsZS5jbGFzc0xpc3QudG9nZ2xlKCd2LW9uYl9fYnViYmxlLS1vbicsIHNlbGVjdGVkW2tleV0pOwogICAgICAgIGJ1YmJsZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIHNlbGVjdGVkW2tleV0gPyAndHJ1ZScgOiAnZmFsc2UnKTsKICAgICAgICBidWJibGUuY2xhc3NMaXN0LnJlbW92ZSgndi1vbmJfX2J1YmJsZS0tcHVsc2UnKTsKICAgICAgICB2b2lkIGJ1YmJsZS5vZmZzZXRXaWR0aDsKICAgICAgICBidWJibGUuY2xhc3NMaXN0LmFkZCgndi1vbmJfX2J1YmJsZS0tcHVsc2UnKTsKICAgICAgICBlbWl0KCk7CiAgICAgIH0pOwogICAgICBncmlkLmFwcGVuZENoaWxkKGJ1YmJsZSk7CiAgICB9KTsKICAgIHJldHVybiBncmlkOwogIH0KICBmdW5jdGlvbiBidWJibGVIaW50KHBsYWNlaG9sZGVyKSB7CiAgICB2YXIgcyA9IFN0cmluZyhwbGFjZWhvbGRlciB8fCAnJykucmVwbGFjZSgvXkRlc2NyaWJlXHMrdGhlXHMrL2ksICcnKS5zcGxpdCgn4oCUJylbMF0udHJpbSgpOwogICAgaWYgKCFzKSByZXR1cm4gJyc7CiAgICBzID0gcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSk7CiAgICByZXR1cm4gcy5sZW5ndGggPiA0MiA/IHMuc2xpY2UoMCwgNDApLnRyaW0oKSArICfigKYnIDogczsKICB9CgogIGZ1bmN0aW9uIHJlY29tbWVuZGVkTW9kZWwoaW5kdXN0cnlLZXlzKSB7CiAgICB2YXIgbW9kZWxzID0gKChWLmRhdGEgJiYgVi5kYXRhLm1vZGVscykgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAobSkgeyByZXR1cm4gbSAmJiBtLnJhdyAhPT0gJ3VubGltaXRlZCc7IH0pOwogICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gbnVsbDsKICAgIHZhciBwcmVmZXIgPSAoaW5kdXN0cnlLZXlzICYmIGluZHVzdHJ5S2V5cy5sZW5ndGgpID8gWydmbHV4JywgJ3BybycsICdlZGl0J10gOiBbJ3NjaG5lbGwnLCAnZmFzdCddOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmZXIubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGhpdCA9IG1vZGVscy5maWx0ZXIoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIFN0cmluZyhtLnJhdyB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmRleE9mKHByZWZlcltpXSkgPj0gMDsgfSlbMF07CiAgICAgIGlmIChoaXQpIHJldHVybiBoaXQucmF3OwogICAgfQogICAgcmV0dXJuIG1vZGVsc1swXS5yYXc7CiAgfQoKICBmdW5jdGlvbiBjdGFCdXR0b24obGFiZWwsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGNscyA9ICd2LWN0YSc7CiAgICBpZiAob3B0cy5wcmltYXJ5KSBjbHMgKz0gJyB2LWN0YS0tcHJpbWFyeSc7CiAgICBlbHNlIGlmIChvcHRzLmdob3N0KSBjbHMgKz0gJyB2LWN0YS0tZ2hvc3QnOwogICAgaWYgKG9wdHMuZGFuZ2VyKSBjbHMgKz0gJyB2LWN0YS0tZGFuZ2VyJzsKICAgIGlmIChvcHRzLmJsb2NrKSBjbHMgKz0gJyB2LWN0YS0tYmxvY2snOwogICAgaWYgKG9wdHMuc21hbGwpIGNscyArPSAnIHYtY3RhLS1zbSc7CiAgICB2YXIgYnRuID0gZWwoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzOiBjbHMgfSk7CiAgICBpZiAob3B0cy5pY29uKSBidG4uYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jdGFfX2ljb24nIH0sIGljb24ob3B0cy5pY29uKSkpOwogICAgYnRuLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyB0ZXh0OiBsYWJlbCB9KSk7CiAgICBpZiAob3B0cy5vbkNsaWNrKSBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcHRzLm9uQ2xpY2spOwogICAgcmV0dXJuIGJ0bjsKICB9CgogIGZ1bmN0aW9uIGxpbmtCdXR0b24obGFiZWwsIGhyZWYsIGljKSB7CiAgICB2YXIgYSA9IGVsKCdhJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCB2LWN0YS0tc20nLCBocmVmOiBocmVmLCB0YXJnZXQ6ICdfYmxhbmsnLCByZWw6ICdub29wZW5lciBub3JlZmVycmVyJyB9KTsKICAgIGlmIChpYykgYS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWN0YV9faWNvbicgfSwgaWNvbihpYykpKTsKICAgIGEuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IHRleHQ6IGxhYmVsIH0pKTsKICAgIHJldHVybiBhOwogIH0KCiAgZnVuY3Rpb24gYXV0aEd1YXJkKHJvb3QpIHsKICAgIHZhciBhdXRoZWQgPSBmYWxzZTsKICAgIHRyeSB7IGF1dGhlZCA9IFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLmlzQXV0aGVkID09PSAnZnVuY3Rpb24nID8gVi5hdXRoLmlzQXV0aGVkKCkgOiAhIWN1cnJlbnRVc2VyKCk7IH0gY2F0Y2ggKGUpIHsgYXV0aGVkID0gISFjdXJyZW50VXNlcigpOyB9CiAgICBpZiAoIWF1dGhlZCkgewogICAgICBtb3VudEVtcHR5KHJvb3QsICdTaWduIGluIHRvIGNvbnRpbnVlJywgJ1lvdSBuZWVkIGFuIGFjY291bnQgdG8gdmlldyB0aGlzIHBhZ2UuJywgJ1NpZ24gSW4nLCBmdW5jdGlvbiAoKSB7IG5hdmlnYXRlKCcjL2F1dGgnKTsgfSk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgZnVuY3Rpb24gbW91bnRFbXB0eShyb290LCB0aXRsZSwgbXNnLCBhY3Rpb25MYWJlbCwgb25BY3Rpb24pIHsKICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICB2YXIgY2FyZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eSBnbGFzcy1jYXJkJyB9LAogICAgICBlbCgnaDInLCB7IGNsYXNzOiAndi1lbXB0eV9fdGl0bGUnLCB0ZXh0OiB0aXRsZSB9KSwKICAgICAgbXNnID8gZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fbXNnJywgdGV4dDogbXNnIH0pIDogbnVsbCk7CiAgICBpZiAoYWN0aW9uTGFiZWwgJiYgb25BY3Rpb24pIGNhcmQuYXBwZW5kQ2hpbGQoY3RhQnV0dG9uKGFjdGlvbkxhYmVsLCB7IHByaW1hcnk6IHRydWUsIG9uQ2xpY2s6IG9uQWN0aW9uIH0pKTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBhZ2UnIH0sIGNhcmQpKTsKICB9CgogIFYudmlld3Muc2V0dGluZ3MgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIHVuc3ViID0gW107CgogICAgZnVuY3Rpb24gcmVuZGVyKHJvb3QpIHsKICAgICAgdGVhcmRvd24oKTsKICAgICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgICAgaWYgKCFhdXRoR3VhcmQocm9vdCkpIHJldHVybjsKCiAgICAgIHZhciBpZGVudCA9IHVzZXJJZGVudGl0eSgpOwogICAgICB2YXIgdmlldyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wYWdlIHYtdmlldy0tc2V0dGluZ3MnIH0pOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChlbCgnaGVhZGVyJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9faGVhZCcgfSwKICAgICAgICBlbCgnZGl2JywgbnVsbCwKICAgICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdBY2NvdW50JyB9KSwKICAgICAgICAgIGVsKCdoMScsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3RpdGxlJywgc3R5bGU6IHsgZm9udFNpemU6ICd2YXIoLS1mb250LWxhcmdlLXRpdGxlLCAzNHB4KScgfSwgdGV4dDogJ1NldHRpbmdzJyB9KSkpKTsKCiAgICAgIHZhciBjcmVkaXRzRWwgPSBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInIH0gfSk7CiAgICAgIGZ1bmN0aW9uIHBhaW50Q3JlZGl0cyhuKSB7CiAgICAgICAgY3JlZGl0c0VsLmlubmVySFRNTCA9ICcnOwogICAgICAgIHZhciBwaWxsID0gKFYudWkgJiYgdHlwZW9mIFYudWkuY3JlZGl0c1BpbGwgPT09ICdmdW5jdGlvbicpID8gVi51aS5jcmVkaXRzUGlsbChuID09IG51bGwgPyAwIDogbikgOiBudWxsOwogICAgICAgIGlmIChwaWxsKSBjcmVkaXRzRWwuYXBwZW5kQ2hpbGQocGlsbCk7CiAgICAgICAgZWxzZSBjcmVkaXRzRWwuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tb25vJywgdGV4dDogKG4gPT0gbnVsbCA/ICfigJQnIDogbikgKyAnIENyZWRpdHMnIH0pKTsKICAgICAgfQogICAgICBwYWludENyZWRpdHMoY3JlZGl0c1ZhbHVlKCkpOwoKICAgICAgdmFyIHByb2ZpbGVNZXRhID0gZWwoJ2RpdicsIHsgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgZ2FwOiAnMnB4JywgbWluV2lkdGg6ICcwJyB9IH0sCiAgICAgICAgZWwoJ2RpdicsIHsgc3R5bGU6IHsgZm9udFdlaWdodDogJzcwMCcsIGZvbnRTaXplOiAndmFyKC0tZm9udC10aXRsZTMsIDIwcHgpJyB9LCB0ZXh0OiBpZGVudC5uYW1lIHx8IGlkZW50LnVzZXJuYW1lIHx8ICdWYW1wIENyZWF0b3InIH0pKTsKICAgICAgaWYgKGlkZW50LmVtYWlsKSBwcm9maWxlTWV0YS5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzE0cHgnIH0sIHRleHQ6IGlkZW50LmVtYWlsIH0pKTsKICAgICAgaWYgKGlkZW50LnVzZXJuYW1lKSBwcm9maWxlTWV0YS5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEzcHgnIH0sIHRleHQ6ICdAJyArIGlkZW50LnVzZXJuYW1lIH0pKTsKICAgICAgaWYgKGlkZW50LmFkbWluKSBwcm9maWxlTWV0YS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsKICAgICAgICBjbGFzczogJ3YtbW9ubycsCiAgICAgICAgc3R5bGU6IHsgbWFyZ2luVG9wOiAnNHB4JywgZm9udFNpemU6ICcxMXB4JywgY29sb3I6ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknLCB0ZXh0VHJhbnNmb3JtOiAndXBwZXJjYXNlJywgbGV0dGVyU3BhY2luZzogJzAuMTJlbScgfSwKICAgICAgICB0ZXh0OiAnQWRtaW4nCiAgICAgIH0pKTsKCiAgICAgIHZhciBwcm9maWxlUmlnaHQgPSBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICd2YXIoLS1zcGFjZS1zbSwgOXB4KScsIGFsaWduSXRlbXM6ICdmbGV4LWVuZCcsIGZsZXg6ICcwIDAgYXV0bycgfSB9LAogICAgICAgIGNyZWRpdHNFbCwKICAgICAgICBjdGFCdXR0b24oJ0FkZCBDcmVkaXRzJywgeyBwcmltYXJ5OiB0cnVlLCBzbWFsbDogdHJ1ZSwgaWNvbjogJ3BsdXMnLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IGdvKCcjL3BheXdhbGwnKTsgfSB9KSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKGVsKCdzZWN0aW9uJywgeyBjbGFzczogJ2dsYXNzLWNhcmQnLCBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGdhcDogJ3ZhcigtLXNwYWNlLW1kLCAxNXB4KScsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBmbGV4V3JhcDogJ3dyYXAnIH0gfSwKICAgICAgICBhdmF0YXJOb2RlKGlkZW50LCA2NCksCiAgICAgICAgZWwoJ2RpdicsIHsgc3R5bGU6IHsgZmxleDogJzEgMSAyMDBweCcsIG1pbldpZHRoOiAnMCcgfSB9LCBwcm9maWxlTWV0YSksCiAgICAgICAgcHJvZmlsZVJpZ2h0KSk7CgogICAgICByZWZyZXNoQ3JlZGl0cygpLnRoZW4oZnVuY3Rpb24gKG4pIHsgaWYgKG4gIT0gbnVsbCkgcGFpbnRDcmVkaXRzKG4pOyB9KTsKICAgICAgdmFyIGNyZWRpdENiID0gZnVuY3Rpb24gKG4pIHsgcGFpbnRDcmVkaXRzKG4pOyB9OwogICAgICB0cnkgeyBpZiAoVi5zdG9yZSAmJiBWLnN0b3JlLm9uKSB7IFYuc3RvcmUub24oJ2NyZWRpdHM6Y2hhbmdlZCcsIGNyZWRpdENiKTsgdW5zdWIucHVzaChmdW5jdGlvbiAoKSB7IFYuc3RvcmUub2ZmICYmIFYuc3RvcmUub2ZmKCdjcmVkaXRzOmNoYW5nZWQnLCBjcmVkaXRDYik7IH0pOyB9IH0gY2F0Y2ggKGUpIHt9CgogICAgICB2YXIgbW9kZWxzID0gKChWLmRhdGEgJiYgVi5kYXRhLm1vZGVscykgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAobSkgeyByZXR1cm4gbSAmJiBtLnJhdyAhPT0gJ3VubGltaXRlZCc7IH0pOwogICAgICB2YXIgbW9kZWxPcHRzID0gbW9kZWxzLm1hcChmdW5jdGlvbiAobSkgewogICAgICAgIHJldHVybiB7IHZhbHVlOiBtLnJhdywgbGFiZWw6IChtLmxhYmVsIHx8IG0ucmF3KSArIChtLnN1YmhlYWRpbmcgPyAnIOKAlCAnICsgbS5zdWJoZWFkaW5nIDogJycpICsgKG0uY29zdCAhPSBudWxsID8gJyAoJyArIG0uY29zdCArICcgY3IpJyA6ICcnKSB9OwogICAgICB9KTsKICAgICAgdmFyIGFzcGVjdHMgPSAoVi5kYXRhICYmIFYuZGF0YS5hc3BlY3RzKSB8fCBbXTsKICAgICAgdmFyIGFzcGVjdE9wdHMgPSBhc3BlY3RzLm1hcChmdW5jdGlvbiAoYSkgeyByZXR1cm4geyB2YWx1ZTogYS5yYXcsIGxhYmVsOiBhLmxhYmVsIHx8IGEucmF3IH07IH0pOwoKICAgICAgdmFyIHMgPSBzZXR0aW5ncygpOwogICAgICB2YXIgZGVmTW9kZWwgPSBzLmRlZmF1bHRNb2RlbCB8fCAobW9kZWxzWzBdICYmIG1vZGVsc1swXS5yYXcpIHx8ICcnOwogICAgICB2YXIgZGVmQXNwZWN0ID0gcy5kZWZhdWx0QXNwZWN0IHx8IChhc3BlY3RzWzBdICYmIGFzcGVjdHNbMF0ucmF3KSB8fCAnYXV0byc7CgogICAgICB2YXIgZGVmYXVsdHNCb2R5ID0gW107CiAgICAgIGlmIChtb2RlbE9wdHMubGVuZ3RoKSB7CiAgICAgICAgZGVmYXVsdHNCb2R5LnB1c2goc2V0dGluZ1JvdygnRGVmYXVsdCBtb2RlbCcsCiAgICAgICAgICBzZWxlY3RDb250cm9sKG1vZGVsT3B0cywgZGVmTW9kZWwsIGZ1bmN0aW9uICh2KSB7IHNldHRpbmdDaGFuZ2UoJ2RlZmF1bHRNb2RlbCcsIHYpOyB0b2FzdCgnRGVmYXVsdCBtb2RlbCBzYXZlZCcsICdzdWNjZXNzJyk7IH0sICdEZWZhdWx0IG1vZGVsJyksCiAgICAgICAgICAnVGhlIHN0YXJ0aW5nIG1vZGVsIGZvciBuZXcgZ2VuZXJhdGlvbnMuJykpOwogICAgICB9CiAgICAgIGlmIChhc3BlY3RPcHRzLmxlbmd0aCkgewogICAgICAgIGRlZmF1bHRzQm9keS5wdXNoKHNldHRpbmdSb3coJ0RlZmF1bHQgYXNwZWN0IHJhdGlvJywKICAgICAgICAgIHNlbGVjdENvbnRyb2woYXNwZWN0T3B0cywgZGVmQXNwZWN0LCBmdW5jdGlvbiAodikgeyBzZXR0aW5nQ2hhbmdlKCdkZWZhdWx0QXNwZWN0Jywgdik7IHRvYXN0KCdEZWZhdWx0IGFzcGVjdCBzYXZlZCcsICdzdWNjZXNzJyk7IH0sICdEZWZhdWx0IGFzcGVjdCByYXRpbycpLAogICAgICAgICAgJ0FwcGxpZXMgdG8gdGV4dC10by1pbWFnZSBnZW5lcmF0aW9ucy4nKSk7CiAgICAgIH0KICAgICAgaWYgKGRlZmF1bHRzQm9keS5sZW5ndGgpIHZpZXcuYXBwZW5kQ2hpbGQoc2VjdGlvbignR2VuZXJhdGlvbiBkZWZhdWx0cycsICdQaWNrIHRoZSBtb2RlbCBhbmQgYXNwZWN0IHlvdSBzdGFydCB3aXRoLicsIGRlZmF1bHRzQm9keSkpOwoKICAgICAgdmFyIHNlbEluZHVzdHJpZXMgPSBzZ2V0KCdpbmR1c3RyaWVzJywgcy5pbmR1c3RyaWVzIHx8IFtdKSB8fCBbXTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNlbEluZHVzdHJpZXMpKSBzZWxJbmR1c3RyaWVzID0gW107CiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoc2VjdGlvbignSW5kdXN0cmllcycsCiAgICAgICAgJ1RhaWxvcnMgcHJlc2V0IGNoaXBzIGFuZCBwbGFjZWhvbGRlcnMgdG8gd2hhdCB5b3UgY3JlYXRlLicsCiAgICAgICAgW2luZHVzdHJ5Q2xvdWQoc2VsSW5kdXN0cmllcywgZnVuY3Rpb24gKGtleXMpIHsKICAgICAgICAgIHNldHRpbmdDaGFuZ2UoJ2luZHVzdHJpZXMnLCBrZXlzKTsKICAgICAgICAgIHNzZXQoJ2luZHVzdHJpZXMnLCBrZXlzKTsKICAgICAgICB9KV0pKTsKCiAgICAgIHZhciB3YXRlcm1hcmsgPSBsc0dldCgnd2F0ZXJtYXJrRW5hYmxlZCcsIHRydWUpOwogICAgICB2YXIgYXV0b1NhdmUgPSBsc0dldCgnYXV0b1NhdmVPbkNvbXBsZXRlJywgZmFsc2UpOwogICAgICB2YXIgY2hpbWUgPSBsc0dldCgnY2hpbWVPbkNvbXBsZXRlJywgZmFsc2UpOwogICAgICB2YXIgdGFnbGluZSA9IGxzR2V0KCdicmFuZFRhZ2xpbmUnLCAnJyk7CiAgICAgIHZhciBzaGFyZVRwbCA9IGxzR2V0KCdzaGFyZVRlbXBsYXRlJywgJ01hZGUgd2l0aCBAVm9vc2V5QUkgVmFtcC4gVHJ5IGl0OiB7e3VybH19Jyk7CgogICAgICB2YXIgdGFnbGluZUZpZWxkID0gZWwoJ2lucHV0JywgewogICAgICAgIHR5cGU6ICd0ZXh0JywgY2xhc3M6ICd2LWZpZWxkJywgdmFsdWU6IHRhZ2xpbmUsCiAgICAgICAgcGxhY2Vob2xkZXI6ICdlLmcuIENyYWZ0ZWQgYnkgeW91ciBzdHVkaW8nLCBtYXhsZW5ndGg6IDEyMCwgJ2FyaWEtbGFiZWwnOiAnQnJhbmQgdGFnbGluZScKICAgICAgfSk7CiAgICAgIHRhZ2xpbmVGaWVsZC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7IGxzU2V0KCdicmFuZFRhZ2xpbmUnLCB0YWdsaW5lRmllbGQudmFsdWUudHJpbSgpKTsgdG9hc3QoJ1RhZ2xpbmUgc2F2ZWQnLCAnc3VjY2VzcycpOyB9KTsKCiAgICAgIHZhciBzaGFyZUZpZWxkID0gZWwoJ3RleHRhcmVhJywgewogICAgICAgIGNsYXNzOiAndi10ZXh0YXJlYScsIHJvd3M6IDIsICdhcmlhLWxhYmVsJzogJ1NoYXJlIHRlbXBsYXRlJywKICAgICAgICBwbGFjZWhvbGRlcjogJ1Rva2Vuczoge3t1cmx9fSB7e3Byb21wdH19IHt7YWRkcmVzc319JwogICAgICB9KTsKICAgICAgc2hhcmVGaWVsZC52YWx1ZSA9IHNoYXJlVHBsOwogICAgICBzaGFyZUZpZWxkLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgdmFsID0gc2hhcmVGaWVsZC52YWx1ZS50cmltKCk7CiAgICAgICAgaWYgKCEve3tccyp1cmxccyp9fS8udGVzdCh2YWwpKSB2YWwgPSAodmFsID8gdmFsICsgJyAnIDogJycpICsgJ3t7dXJsfX0nOwogICAgICAgIHNoYXJlRmllbGQudmFsdWUgPSB2YWw7CiAgICAgICAgbHNTZXQoJ3NoYXJlVGVtcGxhdGUnLCB2YWwpOwogICAgICAgIHRvYXN0KCdTaGFyZSB0ZW1wbGF0ZSBzYXZlZCcsICdzdWNjZXNzJyk7CiAgICAgIH0pOwoKICAgICAgdmFyIGJyYW5kU3RhY2sgPSBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICc2cHgnIH0gfSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbGFiZWwnLCB0ZXh0OiAnU2hhcmUgdGFnbGluZScgfSksCiAgICAgICAgdGFnbGluZUZpZWxkLAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcgfSwgdGV4dDogJ0FwcGVuZGVkIHRvIHlvdXIgc2hhcmUgdGV4dC4nIH0pKTsKICAgICAgdmFyIHNoYXJlU3RhY2sgPSBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICc2cHgnIH0gfSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbGFiZWwnLCB0ZXh0OiAnU2hhcmUgdGVtcGxhdGUnIH0pLAogICAgICAgIHNoYXJlRmllbGQsCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW11dGVkJywgc3R5bGU6IHsgZm9udFNpemU6ICcxM3B4JyB9LCB0ZXh0OiAnU3VwcG9ydHMge3t1cmx9fSwge3twcm9tcHR9fSwge3thZGRyZXNzfX0uJyB9KSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKHNlY3Rpb24oJ0JyYW5kaW5nICYgb3V0cHV0JywgJ0hvdyB5b3VyIHNoYXJlZCBpbWFnZXMgYW5kIGRvd25sb2FkcyBhcmUgcHJlc2VudGVkLicsIFsKICAgICAgICBzZXR0aW5nUm93KCdXYXRlcm1hcmsgZXhwb3J0cycsIHRvZ2dsZSh3YXRlcm1hcmssIGZ1bmN0aW9uICh2KSB7IGxzU2V0KCd3YXRlcm1hcmtFbmFibGVkJywgdik7IH0sICdXYXRlcm1hcmsgZXhwb3J0cycpLAogICAgICAgICAgJ0FkZCBhIHN1YnRsZSBWYW1wIG1hcmsgdG8gYmVmb3JlL2FmdGVyIHNoYXJlcy4nKSwKICAgICAgICBzZXR0aW5nUm93KCdBdXRvLWRvd25sb2FkIG9uIGNvbXBsZXRlJywgdG9nZ2xlKGF1dG9TYXZlLCBmdW5jdGlvbiAodikgeyBsc1NldCgnYXV0b1NhdmVPbkNvbXBsZXRlJywgdik7IH0sICdBdXRvIGRvd25sb2FkJyksCiAgICAgICAgICAnU2F2ZSBlYWNoIHJlc3VsdCBhdXRvbWF0aWNhbGx5IHdoZW4gaXQgZmluaXNoZXMuJyksCiAgICAgICAgc2V0dGluZ1JvdygnUGxheSBjaGltZSBvbiBjb21wbGV0ZScsIHRvZ2dsZShjaGltZSwgZnVuY3Rpb24gKHYpIHsgbHNTZXQoJ2NoaW1lT25Db21wbGV0ZScsIHYpOyB9LCAnQ29tcGxldGlvbiBjaGltZScpLAogICAgICAgICAgJ0Egc29mdCBzb3VuZCB3aGVuIGEgZ2VuZXJhdGlvbiBsYW5kcy4nKSwKICAgICAgICBicmFuZFN0YWNrLAogICAgICAgIHNoYXJlU3RhY2sKICAgICAgXSkpOwoKICAgICAgdmFyIG5vdGlmeUNvbXBsZXRlID0gbHNHZXQoJ25vdGlmeU9uQ29tcGxldGUnLCB0cnVlKTsKICAgICAgdmFyIG5vdGlmeUNyZWRpdHMgPSBsc0dldCgnbm90aWZ5TG93Q3JlZGl0cycsIHRydWUpOwogICAgICB2YXIgbm90aWZ5RGlnZXN0ID0gbHNHZXQoJ25vdGlmeVdlZWtseURpZ2VzdCcsIGZhbHNlKTsKICAgICAgdmFyIGxpdmVBY3Rpdml0aWVzID0gbHNHZXQoJ2xpdmVBY3Rpdml0aWVzJywgdHJ1ZSk7CgogICAgICB2YXIgcGVybVJvdyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hY2Mtcm93IHYtYWNjLXJvdy0tbm90aWNlJyB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hY2Mtcm93X19tYWluJyB9LAogICAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxhYmVsJywgdGV4dDogJ0Jyb3dzZXIgbm90aWZpY2F0aW9ucycgfSksCiAgICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEzcHgnIH0sIHRleHQ6IG5vdGlmeVBlcm1pc3Npb25MYWJlbCgpIH0pKSwKICAgICAgICBub3RpZnlQZXJtaXNzaW9uQ29udHJvbCgpKTsKICAgICAgdmlldy5hcHBlbmRDaGlsZChzZWN0aW9uKCdOb3RpZmljYXRpb25zJywgJ0Nob29zZSB3aGF0IFZhbXAgcGluZ3MgeW91IGFib3V0LicsIFsKICAgICAgICBwZXJtUm93LAogICAgICAgIHNldHRpbmdSb3coJ0dlbmVyYXRpb24gY29tcGxldGUnLCB0b2dnbGUobm90aWZ5Q29tcGxldGUsIGZ1bmN0aW9uICh2KSB7IGxzU2V0KCdub3RpZnlPbkNvbXBsZXRlJywgdik7IG1heWJlUmVxdWVzdE5vdGlmeVBlcm1pc3Npb24odik7IH0sICdOb3RpZnkgb24gY29tcGxldGUnKSwKICAgICAgICAgICdBbGVydCBtZSB0aGUgbW9tZW50IGEgcmVuZGVyIGxhbmRzLicpLAogICAgICAgIHNldHRpbmdSb3coJ0xvdyBjcmVkaXQgd2FybmluZ3MnLCB0b2dnbGUobm90aWZ5Q3JlZGl0cywgZnVuY3Rpb24gKHYpIHsgbHNTZXQoJ25vdGlmeUxvd0NyZWRpdHMnLCB2KTsgfSwgJ0xvdyBjcmVkaXQgd2FybmluZ3MnKSwKICAgICAgICAgICdIZWFkcy11cCBiZWZvcmUgeW91IHJ1biBvdXQgb2YgY3JlZGl0cy4nKSwKICAgICAgICBzZXR0aW5nUm93KCdMaXZlIHByb2dyZXNzIGFjdGl2aXR5JywgdG9nZ2xlKGxpdmVBY3Rpdml0aWVzLCBmdW5jdGlvbiAodikgeyBsc1NldCgnbGl2ZUFjdGl2aXRpZXMnLCB2KTsgfSwgJ0xpdmUgYWN0aXZpdGllcycpLAogICAgICAgICAgJ1Nob3cgYSBsaXZlIHByb2dyZXNzIGluZGljYXRvciB3aGlsZSBnZW5lcmF0aW5nLicpLAogICAgICAgIHNldHRpbmdSb3coJ1dlZWtseSBkaWdlc3QnLCB0b2dnbGUobm90aWZ5RGlnZXN0LCBmdW5jdGlvbiAodikgeyBsc1NldCgnbm90aWZ5V2Vla2x5RGlnZXN0Jywgdik7IH0sICdXZWVrbHkgZGlnZXN0JyksCiAgICAgICAgICAnQSB3ZWVrbHkgcmVjYXAgb2Ygd2hhdCB5b3UgY3JlYXRlZC4nKQogICAgICBdKSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKHNlY3Rpb24oJ1N1YnNjcmlwdGlvbiAmIGJpbGxpbmcnLCAnTWFuYWdlIGNyZWRpdHMsIHBsYW5zIGFuZCBwYXltZW50LicsIFsKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3RhLXJvdycgfSwKICAgICAgICAgIGN0YUJ1dHRvbignQnV5IGNyZWRpdHMnLCB7IHByaW1hcnk6IHRydWUsIGljb246ICdzcGFya2xlcycsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvcGF5d2FsbCcpOyB9IH0pLAogICAgICAgICAgY3RhQnV0dG9uKCdNYW5hZ2Ugc3Vic2NyaXB0aW9uJywgeyBnaG9zdDogdHJ1ZSwgb25DbGljazogbWFuYWdlU3Vic2NyaXB0aW9uIH0pKSwKICAgICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LW11dGVkJywgc3R5bGU6IHsgZm9udFNpemU6ICcxM3B4JyB9LCB0ZXh0OiAnUHVyY2hhc2VzIGFyZSBoYW5kbGVkIHNlY3VyZWx5IHZpYSBTdHJpcGUuJyB9KQogICAgICBdKSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKHNlY3Rpb24oJ0dyb3cgd2l0aCBWYW1wJywgJ0Vhcm4gY3JlZGl0cyBieSBzaGFyaW5nIGFuZCBwb3N0aW5nLicsIFsKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3RhLXJvdycgfSwKICAgICAgICAgIGN0YUJ1dHRvbignUmVmZXJyYWwgZGFzaGJvYXJkJywgeyBnaG9zdDogdHJ1ZSwgaWNvbjogJ2dpZnQnLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IGdvKCcjL3JlZmVycmFsJyk7IH0gfSksCiAgICAgICAgICBjdGFCdXR0b24oJ0RhaWx5IGNoYWxsZW5nZScsIHsgZ2hvc3Q6IHRydWUsIGljb246ICdmbGFtZScsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvY2hhbGxlbmdlJyk7IH0gfSkpCiAgICAgIF0pKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoc2VjdGlvbignSGVscCAmIHN1cHBvcnQnLCAnRkFRLCBwcml2YWN5IGFuZCB0ZXJtcy4nLCBbCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWN0YS1yb3cnIH0sCiAgICAgICAgICBsaW5rQnV0dG9uKCdIZWxwIGNlbnRlcicsICdodHRwczovL3Zvb3NleS5jb20vaGVscCcsICdoZWxwJyksCiAgICAgICAgICBsaW5rQnV0dG9uKCdQcml2YWN5JywgJ2h0dHBzOi8vdm9vc2V5LmNvbS9wcml2YWN5JyksCiAgICAgICAgICBsaW5rQnV0dG9uKCdUZXJtcycsICdodHRwczovL3Zvb3NleS5jb20vdGVybXMnKSkKICAgICAgXSkpOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChzZWN0aW9uKCdEYXRhICYgcmVzZXQnLCAnRXhwb3J0IHlvdXIgZGF0YSwgY2xlYXIgY2FjaGUgb3IgcmVwbGF5IG9uYm9hcmRpbmcuJywgWwogICAgICAgIHNldHRpbmdSb3coJ0V4cG9ydCBteSBkYXRhJywKICAgICAgICAgIGN0YUJ1dHRvbignRXhwb3J0JywgeyBnaG9zdDogdHJ1ZSwgc21hbGw6IHRydWUsIGljb246ICdkb3dubG9hZCcsIG9uQ2xpY2s6IGV4cG9ydE15RGF0YSB9KSwKICAgICAgICAgICdEb3dubG9hZCB5b3VyIHByZWZlcmVuY2VzIGFuZCBsaWJyYXJ5IGFzIGEgSlNPTiBmaWxlLicpLAogICAgICAgIHNldHRpbmdSb3coJ0NsZWFyIGxvY2FsIGNhY2hlJywKICAgICAgICAgIGN0YUJ1dHRvbignQ2xlYXIgY2FjaGUnLCB7IGdob3N0OiB0cnVlLCBzbWFsbDogdHJ1ZSwgaWNvbjogJ3RyYXNoJywgb25DbGljazogY2xlYXJMb2NhbENhY2hlIH0pLAogICAgICAgICAgJ0ZyZWVzIHNwYWNlIHVzZWQgYnkgY2FjaGVkIGltYWdlcyBhbmQgc3RvcmVkIHByZWZzLicpLAogICAgICAgIHNldHRpbmdSb3coJ1JlcGxheSBvbmJvYXJkaW5nJywgY3RhQnV0dG9uKCdSZXNldCBvbmJvYXJkaW5nJywgeyBnaG9zdDogdHJ1ZSwgc21hbGw6IHRydWUsIG9uQ2xpY2s6IHJlc2V0T25ib2FyZGluZyB9KSwKICAgICAgICAgICdDbGVhcnMgaW5kdXN0cmllcyBhbmQgc2hvd3MgdGhlIGZpcnN0LXJ1biBmbG93IGFnYWluLicpCiAgICAgIF0pKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoc2VjdGlvbignQWNjb3VudCcsICdVcGRhdGUgeW91ciBkZXRhaWxzIG9yIHNpZ24gb3V0LicsIFsKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3RhLXJvdycgfSwKICAgICAgICAgIGN0YUJ1dHRvbignVXBkYXRlIGFjY291bnQnLCB7IGdob3N0OiB0cnVlLCBpY29uOiAncGVuY2lsJywgb25DbGljazogZnVuY3Rpb24gKCkgeyBvcGVuVXBkYXRlQWNjb3VudChpZGVudCk7IH0gfSksCiAgICAgICAgICBjdGFCdXR0b24oJ0xvZyBvdXQnLCB7IGdob3N0OiB0cnVlLCBpY29uOiAnbG9nb3V0Jywgb25DbGljazogbG9nb3V0IH0pKSwKICAgICAgICBlbCgnaHInLCB7IGNsYXNzOiAndi1ocicgfSksCiAgICAgICAgc2V0dGluZ1JvdygnRGVsZXRlIGFjY291bnQnLAogICAgICAgICAgY3RhQnV0dG9uKCdEZWxldGUnLCB7IGRhbmdlcjogdHJ1ZSwgc21hbGw6IHRydWUsIG9uQ2xpY2s6IGRlbGV0ZUFjY291bnQgfSksCiAgICAgICAgICAnUGVybWFuZW50bHkgcmVtb3ZlcyB5b3VyIGFjY291bnQgYW5kIGFsbCBkYXRhLicpCiAgICAgIF0pKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoZWwoJ2Zvb3RlcicsIHsgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBqdXN0aWZ5Q29udGVudDogJ3NwYWNlLWJldHdlZW4nLCBhbGlnbkl0ZW1zOiAnY2VudGVyJywgZmxleFdyYXA6ICd3cmFwJywgZ2FwOiAndmFyKC0tc3BhY2Utc20sIDlweCknLCBwYWRkaW5nVG9wOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJyB9IH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tb25vJywgc3R5bGU6IHsgZm9udFNpemU6ICcxMnB4JywgY29sb3I6ICd2YXIoLS12LWluay1zb2Z0LCByZ2JhKDI0NSwyNDUsMjQ3LC42NikpJyB9LCB0ZXh0OiAnVmFtcCBieSBWb29zZXknIH0pLAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbW9ubycsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTJweCcsIGNvbG9yOiAndmFyKC0tdi1pbmstc29mdCwgcmdiYSgyNDUsMjQ1LDI0NywuNjYpKScgfSwgdGV4dDogJ0hhdmUgdGhlIE1lYW5zLicgfSkpKTsKCiAgICAgIHJvb3QuYXBwZW5kQ2hpbGQodmlldyk7CiAgICB9CgogICAgZnVuY3Rpb24gbWFuYWdlU3Vic2NyaXB0aW9uKCkgewogICAgICB0cnkgewogICAgICAgIGlmIChWLnBheSAmJiB0eXBlb2YgVi5wYXkub3BlblBvcnRhbCA9PT0gJ2Z1bmN0aW9uJykgeyBWLnBheS5vcGVuUG9ydGFsKCk7IHJldHVybjsgfQogICAgICAgIGlmIChWLmFwaSAmJiB0eXBlb2YgVi5hcGkuYmlsbGluZ1BvcnRhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgdG9hc3QoJ09wZW5pbmcgYmlsbGluZyBwb3J0YWzigKYnLCAnaW5mbycpOwogICAgICAgICAgVi5hcGkuYmlsbGluZ1BvcnRhbCgpLnRoZW4oZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgaWYgKHIgJiYgci51cmwpIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gci51cmw7CiAgICAgICAgICAgIGVsc2UgZmFsbGJhY2tDb250YWN0KCk7CiAgICAgICAgICB9KS5jYXRjaChmYWxsYmFja0NvbnRhY3QpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgZmFsbGJhY2tDb250YWN0KCk7CiAgICB9CiAgICBmdW5jdGlvbiBmYWxsYmFja0NvbnRhY3QoKSB7CiAgICAgIHRvYXN0KCdUbyBtYW5hZ2UgeW91ciBzdWJzY3JpcHRpb24sIGNvbnRhY3Qgc3VwcG9ydEB2b29zZXkuY29tJywgJ2luZm8nKTsKICAgICAgd2luZG93Lm9wZW4oJ21haWx0bzpzdXBwb3J0QHZvb3NleS5jb20/c3ViamVjdD1WYW1wJTIwU3Vic2NyaXB0aW9uJywgJ19ibGFuaycpOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vdGlmeVBlcm1pc3Npb24oKSB7CiAgICAgIHRyeSB7IHJldHVybiAodHlwZW9mIE5vdGlmaWNhdGlvbiAhPT0gJ3VuZGVmaW5lZCcpID8gTm90aWZpY2F0aW9uLnBlcm1pc3Npb24gOiAndW5zdXBwb3J0ZWQnOyB9CiAgICAgIGNhdGNoIChlKSB7IHJldHVybiAndW5zdXBwb3J0ZWQnOyB9CiAgICB9CiAgICBmdW5jdGlvbiBub3RpZnlQZXJtaXNzaW9uTGFiZWwoKSB7CiAgICAgIHZhciBwID0gbm90aWZ5UGVybWlzc2lvbigpOwogICAgICBpZiAocCA9PT0gJ2dyYW50ZWQnKSByZXR1cm4gJ0FsbG93ZWQgaW4gdGhpcyBicm93c2VyLic7CiAgICAgIGlmIChwID09PSAnZGVuaWVkJykgcmV0dXJuICdCbG9ja2VkIOKAlCBlbmFibGUgaW4gYnJvd3NlciBzZXR0aW5ncy4nOwogICAgICBpZiAocCA9PT0gJ3Vuc3VwcG9ydGVkJykgcmV0dXJuICdOb3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3Nlci4nOwogICAgICByZXR1cm4gJ1RhcCB0byBhbGxvdyBhbGVydHMgaW4gdGhpcyBicm93c2VyLic7CiAgICB9CiAgICBmdW5jdGlvbiBub3RpZnlQZXJtaXNzaW9uQ29udHJvbCgpIHsKICAgICAgdmFyIHAgPSBub3RpZnlQZXJtaXNzaW9uKCk7CiAgICAgIGlmIChwID09PSAnZ3JhbnRlZCcpIHsKICAgICAgICByZXR1cm4gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1hY2MtcGlsbCB2LWFjYy1waWxsLS1vbicgfSwgaWNvbignY2hlY2ttYXJrJyksIGVsKCdzcGFuJywgeyB0ZXh0OiAnQWxsb3dlZCcgfSkpOwogICAgICB9CiAgICAgIGlmIChwID09PSAndW5zdXBwb3J0ZWQnIHx8IHAgPT09ICdkZW5pZWQnKSB7CiAgICAgICAgcmV0dXJuIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtYWNjLXBpbGwnIH0sIGVsKCdzcGFuJywgeyB0ZXh0OiBwID09PSAnZGVuaWVkJyA/ICdCbG9ja2VkJyA6ICdVbmF2YWlsYWJsZScgfSkpOwogICAgICB9CiAgICAgIHZhciBidG4gPSBjdGFCdXR0b24oJ0FsbG93JywgeyBnaG9zdDogdHJ1ZSwgc21hbGw6IHRydWUgfSk7CiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgcmVxdWVzdE5vdGlmeVBlcm1pc3Npb24oYnRuKTsgfSk7CiAgICAgIHJldHVybiBidG47CiAgICB9CiAgICBmdW5jdGlvbiByZXF1ZXN0Tm90aWZ5UGVybWlzc2lvbihidG4pIHsKICAgICAgaWYgKG5vdGlmeVBlcm1pc3Npb24oKSA9PT0gJ3Vuc3VwcG9ydGVkJykgeyB0b2FzdCgnTm90aWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBoZXJlLicsICdpbmZvJyk7IHJldHVybjsgfQogICAgICB0cnkgewogICAgICAgIE5vdGlmaWNhdGlvbi5yZXF1ZXN0UGVybWlzc2lvbigpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgaWYgKHJlcyA9PT0gJ2dyYW50ZWQnKSB7IHRvYXN0KCdOb3RpZmljYXRpb25zIGFsbG93ZWQnLCAnc3VjY2VzcycpOyB9CiAgICAgICAgICBlbHNlIGlmIChyZXMgPT09ICdkZW5pZWQnKSB7IHRvYXN0KCdOb3RpZmljYXRpb25zIGJsb2NrZWQnLCAnaW5mbycpOyB9CiAgICAgICAgICBpZiAoYnRuICYmIGJ0bi5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgIHZhciBmcmVzaCA9IG5vdGlmeVBlcm1pc3Npb25Db250cm9sKCk7CiAgICAgICAgICAgIGJ0bi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmcmVzaCwgYnRuKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSBjYXRjaCAoZSkge30KICAgIH0KICAgIGZ1bmN0aW9uIG1heWJlUmVxdWVzdE5vdGlmeVBlcm1pc3Npb24oZW5hYmxlZCkgewogICAgICBpZiAoZW5hYmxlZCAmJiBub3RpZnlQZXJtaXNzaW9uKCkgPT09ICdkZWZhdWx0JykgcmVxdWVzdE5vdGlmeVBlcm1pc3Npb24obnVsbCk7CiAgICB9CgogICAgZnVuY3Rpb24gZXhwb3J0TXlEYXRhKCkgewogICAgICB2YXIgaWRlbnQgPSB1c2VySWRlbnRpdHkoKTsKICAgICAgdmFyIGJ1bmRsZSA9IHsKICAgICAgICBleHBvcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgcHJvZmlsZTogeyBuYW1lOiBpZGVudC5uYW1lLCB1c2VybmFtZTogaWRlbnQudXNlcm5hbWUsIGVtYWlsOiBpZGVudC5lbWFpbCwgYWRtaW46IGlkZW50LmFkbWluIH0sCiAgICAgICAgc2V0dGluZ3M6IHNldHRpbmdzKCksCiAgICAgICAgcHJlZmVyZW5jZXM6IGNvbGxlY3RQcmVmZXJlbmNlcygpCiAgICAgIH07CiAgICAgIHRvYXN0KCdQcmVwYXJpbmcgeW91ciBleHBvcnTigKYnLCAnaW5mbycpOwogICAgICB2YXIgZmluaXNoID0gZnVuY3Rpb24gKGxpYnJhcnkpIHsKICAgICAgICBpZiAobGlicmFyeSkgYnVuZGxlLmxpYnJhcnkgPSBsaWJyYXJ5OwogICAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGJ1bmRsZSwgbnVsbCwgMildLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTsKICAgICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKICAgICAgICB2YXIgYSA9IGVsKCdhJywgeyBocmVmOiB1cmwsIGRvd25sb2FkOiAndmFtcC1kYXRhLScgKyBEYXRlLm5vdygpICsgJy5qc29uJyB9KTsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOwogICAgICAgIGEuY2xpY2soKTsKICAgICAgICBhLnJlbW92ZSgpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB0cnkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7IH0gY2F0Y2ggKGUpIHt9IH0sIDQwMDApOwogICAgICAgIHRvYXN0KCdFeHBvcnQgZG93bmxvYWRlZCcsICdzdWNjZXNzJyk7CiAgICAgIH07CiAgICAgIGlmIChWLmFwaSAmJiB0eXBlb2YgVi5hcGkubGlicmFyeSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIFYuYXBpLmxpYnJhcnkoMSwgMjAwKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgIHZhciBpdGVtcyA9IChyZXMgJiYgKHJlcy5pdGVtcyB8fCByZXMuaW1hZ2VzIHx8IHJlcykpIHx8IFtdOwogICAgICAgICAgZmluaXNoKEFycmF5LmlzQXJyYXkoaXRlbXMpID8gaXRlbXMgOiBbXSk7CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgeyBmaW5pc2gobnVsbCk7IH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGZpbmlzaChudWxsKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNvbGxlY3RQcmVmZXJlbmNlcygpIHsKICAgICAgdmFyIGtleXMgPSBbJ3dhdGVybWFya0VuYWJsZWQnLCAnYXV0b1NhdmVPbkNvbXBsZXRlJywgJ2NoaW1lT25Db21wbGV0ZScsICdicmFuZFRhZ2xpbmUnLCAnc2hhcmVUZW1wbGF0ZScsCiAgICAgICAgJ25vdGlmeU9uQ29tcGxldGUnLCAnbm90aWZ5TG93Q3JlZGl0cycsICdub3RpZnlXZWVrbHlEaWdlc3QnLCAnbGl2ZUFjdGl2aXRpZXMnLCAnY2hhbGxlbmdlJ107CiAgICAgIHZhciBvdXQgPSB7fTsKICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IG91dFtrXSA9IGxzR2V0KGssIG51bGwpOyB9KTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGVhckxvY2FsQ2FjaGUoKSB7CiAgICAgIGNvbmZpcm1EaWFsb2coJ0NsZWFyIGxvY2FsbHkgY2FjaGVkIGRhdGE/IFlvdXIgYWNjb3VudCBhbmQgY3JlZGl0cyBhcmUgdW5hZmZlY3RlZC4nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIHByZXNlcnZlID0ge307CiAgICAgICAgICBbJ29uYm9hcmRpbmdEb25lJywgJ3JlZmVycmFsQ29kZScsICdyZWZlcnJhbEFwcGxpZWQnXS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IHByZXNlcnZlW2tdID0gbHNHZXQoaywgbnVsbCk7IH0pOwogICAgICAgICAgdmFyIGRvb21lZCA9IFtdOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3aW5kb3cubG9jYWxTdG9yYWdlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBrZXkgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmtleShpKTsKICAgICAgICAgICAgaWYgKGtleSAmJiBrZXkuaW5kZXhPZihMU19QUkVGSVgpID09PSAwKSBkb29tZWQucHVzaChrZXkpOwogICAgICAgICAgfQogICAgICAgICAgZG9vbWVkLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyB0cnkgeyB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTsgfSBjYXRjaCAoZSkge30gfSk7CiAgICAgICAgICBPYmplY3Qua2V5cyhwcmVzZXJ2ZSkuZm9yRWFjaChmdW5jdGlvbiAoaykgeyBpZiAocHJlc2VydmVba10gIT0gbnVsbCkgbHNTZXQoaywgcHJlc2VydmVba10pOyB9KTsKICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgIHRvYXN0KCdMb2NhbCBjYWNoZSBjbGVhcmVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgICB2YXIgb3V0bGV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Ytb3V0bGV0JykgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnYtb3V0bGV0Jyk7CiAgICAgICAgaWYgKG91dGxldCkgcmVuZGVyKG91dGxldCk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlc2V0T25ib2FyZGluZygpIHsKICAgICAgY29uZmlybURpYWxvZygnUmVzZXQgb25ib2FyZGluZz8gWW91ciBzZWxlY3RlZCBpbmR1c3RyaWVzIHdpbGwgYmUgY2xlYXJlZC4nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgICBzc2V0KCdpbmR1c3RyaWVzJywgW10pOwogICAgICAgIHNldHRpbmdDaGFuZ2UoJ2luZHVzdHJpZXMnLCBbXSk7CiAgICAgICAgc3NldCgnb25ib2FyZGluZ0RvbmUnLCBmYWxzZSk7CiAgICAgICAgdHJ5IHsgaWYgKFYuc3RhdGUpIFYuc3RhdGUub25ib2FyZGluZ0RvbmUgPSBmYWxzZTsgfSBjYXRjaCAoZSkge30KICAgICAgICBsc1NldCgnc2VlbkNyZWRpdFdlbGNvbWUnLCBmYWxzZSk7CiAgICAgICAgdG9hc3QoJ09uYm9hcmRpbmcgcmVzZXQnLCAnc3VjY2VzcycpOwogICAgICAgIGdvKCcjL29uYm9hcmRpbmcnKTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gbG9nb3V0KCkgewogICAgICBjb25maXJtRGlhbG9nKCdMb2cgb3V0IG9mIFZhbXA/JykudGhlbihmdW5jdGlvbiAob2spIHsKICAgICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgICAgdHJ5IHsgaWYgKFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLmNsZWFyID09PSAnZnVuY3Rpb24nKSBWLmF1dGguY2xlYXIoKTsgfSBjYXRjaCAoZSkge30KICAgICAgICB0b2FzdCgnU2lnbmVkIG91dCcsICdpbmZvJyk7CiAgICAgICAgbmF2aWdhdGUoJyMvYXV0aCcpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBvcGVuVXBkYXRlQWNjb3VudChpZGVudCkgewogICAgICB2YXIgbmFtZUZpZWxkID0gZWwoJ2lucHV0JywgeyB0eXBlOiAndGV4dCcsIGNsYXNzOiAndi1maWVsZCcsIHZhbHVlOiBpZGVudC5uYW1lIHx8ICcnLCBwbGFjZWhvbGRlcjogJ0Z1bGwgbmFtZScsICdhcmlhLWxhYmVsJzogJ0Z1bGwgbmFtZScgfSk7CiAgICAgIHZhciBlbWFpbEZpZWxkID0gZWwoJ2lucHV0JywgeyB0eXBlOiAnZW1haWwnLCBjbGFzczogJ3YtZmllbGQnLCB2YWx1ZTogaWRlbnQuZW1haWwgfHwgJycsIHBsYWNlaG9sZGVyOiAnRW1haWwnLCAnYXJpYS1sYWJlbCc6ICdFbWFpbCcgfSk7CiAgICAgIHZhciBwd0ZpZWxkID0gZWwoJ2lucHV0JywgeyB0eXBlOiAncGFzc3dvcmQnLCBjbGFzczogJ3YtZmllbGQnLCBwbGFjZWhvbGRlcjogJ05ldyBwYXNzd29yZCAob3B0aW9uYWwpJywgYXV0b2NvbXBsZXRlOiAnbmV3LXBhc3N3b3JkJywgJ2FyaWEtbGFiZWwnOiAnTmV3IHBhc3N3b3JkJyB9KTsKICAgICAgdmFyIHN0YXR1cyA9IGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEzcHgnLCBtaW5IZWlnaHQ6ICcxOHB4JyB9IH0pOwogICAgICB2YXIgc2F2ZUJ0biA9IGN0YUJ1dHRvbignU2F2ZSBjaGFuZ2VzJywgeyBwcmltYXJ5OiB0cnVlLCBibG9jazogdHJ1ZSB9KTsKCiAgICAgIHZhciBmb3JtID0gZWwoJ2Zvcm0nLCB7IGNsYXNzOiAndi1zdGFjay1tZCcgfSwKICAgICAgICBlbCgnaDInLCB7IGNsYXNzOiAndi1tb2RhbF9fdGl0bGUnLCB0ZXh0OiAnVXBkYXRlIGFjY291bnQnIH0pLAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCcgfSwgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1sYWJlbCcsIHRleHQ6ICdOYW1lJyB9KSwgbmFtZUZpZWxkKSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZmllbGQtZ3JvdXAnIH0sIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbGFiZWwnLCB0ZXh0OiAnRW1haWwnIH0pLCBlbWFpbEZpZWxkKSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZmllbGQtZ3JvdXAnIH0sIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbGFiZWwnLCB0ZXh0OiAnUGFzc3dvcmQnIH0pLCBwd0ZpZWxkKSwKICAgICAgICBzdGF0dXMsCiAgICAgICAgc2F2ZUJ0bgogICAgICApOwoKICAgICAgdmFyIGhhbmRsZSA9IG51bGw7CiAgICAgIGZ1bmN0aW9uIGNsb3NlKCkgeyBpZiAoaGFuZGxlICYmIGhhbmRsZS5jbG9zZSkgaGFuZGxlLmNsb3NlKCk7IH0KCiAgICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgZnVuY3Rpb24gKGUpIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkudXBkYXRlQWNjb3VudCAhPT0gJ2Z1bmN0aW9uJykgeyBzdGF0dXMudGV4dENvbnRlbnQgPSAnVXBkYXRpbmcgYWNjb3VudHMgaXMgdW5hdmFpbGFibGUuJzsgcmV0dXJuOyB9CiAgICAgICAgdmFyIG5tID0gbmFtZUZpZWxkLnZhbHVlLnRyaW0oKTsKICAgICAgICB2YXIgZW0gPSBlbWFpbEZpZWxkLnZhbHVlLnRyaW0oKTsKICAgICAgICBpZiAoIW5tKSB7IHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1jb2xvci1lcnJvciwgI0Y3MzM2MyknOyBzdGF0dXMudGV4dENvbnRlbnQgPSAnTmFtZSBpcyByZXF1aXJlZC4nOyByZXR1cm47IH0KICAgICAgICBpZiAoIWVtIHx8IGVtLmluZGV4T2YoJ0AnKSA8IDApIHsgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWNvbG9yLWVycm9yLCAjRjczMzYzKSc7IHN0YXR1cy50ZXh0Q29udGVudCA9ICdBIHZhbGlkIGVtYWlsIGlzIHJlcXVpcmVkLic7IHJldHVybjsgfQogICAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSB0cnVlOwogICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcnOwogICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdTYXZpbmfigKYnOwogICAgICAgIHZhciBwZXJzb25hbCA9IHsgbmFtZTogbm0sIGVtYWlsOiBlbSB9OwogICAgICAgIHZhciBubTIgPSBubS5zcGxpdCgvXHMrLyk7CiAgICAgICAgcGVyc29uYWwuZmlyc3ROYW1lID0gbm0yWzBdIHx8IG5tOwogICAgICAgIHBlcnNvbmFsLmxhc3ROYW1lID0gbm0yLnNsaWNlKDEpLmpvaW4oJyAnKSB8fCAnJzsKICAgICAgICB2YXIgcHV0ID0geyBwZXJzb25hbDogcGVyc29uYWwgfTsKICAgICAgICB2YXIgcHcgPSBwd0ZpZWxkLnZhbHVlOwogICAgICAgIGlmIChwdykgcHV0LnBhc3N3b3JkID0gcHc7CiAgICAgICAgVi5hcGkudXBkYXRlQWNjb3VudChwdXQpLnRoZW4oZnVuY3Rpb24gKHVwZGF0ZWQpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICh1cGRhdGVkICYmIFYuc3RhdGUpIFYuc3RhdGUudXNlciA9IHVwZGF0ZWQ7CiAgICAgICAgICAgIGlmIChWLnN0b3JlKSBWLnN0b3JlLmVtaXQoJ2F1dGg6Y2hhbmdlZCcsIHVwZGF0ZWQgfHwgY3VycmVudFVzZXIoKSk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgdG9hc3QoJ0FjY291bnQgdXBkYXRlZCcsICdzdWNjZXNzJyk7CiAgICAgICAgICBjbG9zZSgpOwogICAgICAgICAgdmFyIG91dGxldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2LW91dGxldCcpIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52LW91dGxldCcpOwogICAgICAgICAgaWYgKG91dGxldCkgcmVuZGVyKG91dGxldCk7CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgICAgc2F2ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWNvbG9yLWVycm9yLCAjRjczMzYzKSc7CiAgICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAoZXJyICYmIGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogJ0NvdWxkIG5vdCB1cGRhdGUgYWNjb3VudC4nOwogICAgICAgIH0pOwogICAgICB9KTsKCiAgICAgIHZhciBzYXZlU3VibWl0ID0gZnVuY3Rpb24gKCkgeyBmb3JtLnJlcXVlc3RTdWJtaXQgPyBmb3JtLnJlcXVlc3RTdWJtaXQoKSA6IGZvcm0uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3N1Ym1pdCcsIHsgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7IH07CiAgICAgIHNhdmVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzYXZlU3VibWl0KTsKCiAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLm1vZGFsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgaGFuZGxlID0gVi51aS5tb2RhbChlbCgnZGl2JywgeyBjbGFzczogJ3YtbW9kYWwnIH0sIGZvcm0pLCB7IG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHt9IH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBvdmVybGF5ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW92ZXJsYXktc2NyaW0nIH0sIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbCBnbGFzcy1jYXJkJyB9LCBmb3JtKSk7CiAgICAgICAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGlmIChlLnRhcmdldCA9PT0gb3ZlcmxheSkgb3ZlcmxheS5yZW1vdmUoKTsgfSk7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdmVybGF5KTsKICAgICAgICBoYW5kbGUgPSB7IGNsb3NlOiBmdW5jdGlvbiAoKSB7IG92ZXJsYXkucmVtb3ZlKCk7IH0gfTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRlbGV0ZUFjY291bnQoKSB7CiAgICAgIGNvbmZpcm1EaWFsb2coJ0RlbGV0ZSB5b3VyIGFjY291bnQgcGVybWFuZW50bHk/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgICBjb25maXJtRGlhbG9nKCdBcmUgeW91IGFic29sdXRlbHkgc3VyZT8gQWxsIHlvdXIgaW1hZ2VzIGFuZCBkYXRhIHdpbGwgYmUgZXJhc2VkLicpLnRoZW4oZnVuY3Rpb24gKG9rMikgewogICAgICAgICAgaWYgKCFvazIpIHJldHVybjsKICAgICAgICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLmRlbGV0ZUFjY291bnQgIT09ICdmdW5jdGlvbicpIHsgdG9hc3QoJ0FjY291bnQgZGVsZXRpb24gaXMgdW5hdmFpbGFibGUuJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgICAgICAgdG9hc3QoJ0RlbGV0aW5nIGFjY291bnTigKYnLCAnaW5mbycpOwogICAgICAgICAgVi5hcGkuZGVsZXRlQWNjb3VudCgpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0cnkgeyBpZiAoVi5hdXRoICYmIFYuYXV0aC5jbGVhcikgVi5hdXRoLmNsZWFyKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICAgIHRvYXN0KCdBY2NvdW50IGRlbGV0ZWQnLCAnaW5mbycpOwogICAgICAgICAgICBuYXZpZ2F0ZSgnIy9hdXRoJyk7CiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpID8gZXJyLm1lc3NhZ2UgOiAnQ291bGQgbm90IGRlbGV0ZSBhY2NvdW50LicsICdlcnJvcicpOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHRlYXJkb3duKCkgewogICAgICB3aGlsZSAodW5zdWIubGVuZ3RoKSB7IHRyeSB7IHVuc3ViLnBvcCgpKCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIH0KCiAgICByZXR1cm4geyByZW5kZXI6IHJlbmRlciwgdGVhcmRvd246IHRlYXJkb3duIH07CiAgfSkoKTsKCiAgVi52aWV3cy5hY2NvdW50ID0gKGZ1bmN0aW9uICgpIHsKICAgIHZhciB1bnN1YiA9IFtdOwoKICAgIGZ1bmN0aW9uIHJlbmRlcihyb290LCBwYXJhbXMpIHsKICAgICAgdGVhcmRvd24oKTsKICAgICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgICAgaWYgKCFhdXRoR3VhcmQocm9vdCkpIHJldHVybjsKCiAgICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLnB1cmNoYXNlID09PSAnc3VjY2VzcycpIHsKICAgICAgICB0b2FzdCgnUHVyY2hhc2UgY29tcGxldGUg4oCUIGNyZWRpdHMgYWRkZWQhJywgJ3N1Y2Nlc3MnKTsKICAgICAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jb25mZXR0aSA9PT0gJ2Z1bmN0aW9uJykgeyB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgICAgfQoKICAgICAgdmFyIHZpZXcgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3RhY2stbWQgdi12aWV3LS1hY2NvdW50JyB9KTsKCiAgICAgIHZhciBjcmVkaXRzQmlnID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9fY3JlZGl0cycsIHRleHQ6ICfigJQnIH0pOwogICAgICBmdW5jdGlvbiBwYWludChuKSB7CiAgICAgICAgY3JlZGl0c0JpZy50ZXh0Q29udGVudCA9IChuID09IG51bGwpID8gJ+KAlCcgOiBTdHJpbmcobik7CiAgICAgIH0KICAgICAgcGFpbnQoY3JlZGl0c1ZhbHVlKCkpOwoKICAgICAgdmFyIGJhbGFuY2VDYXJkID0gZWwoJ3NlY3Rpb24nLCB7CiAgICAgICAgY2xhc3M6ICdnbGFzcy1jYXJkJywKICAgICAgICBzdHlsZTogeyBwYWRkaW5nOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgZ2FwOiAndmFyKC0tc3BhY2Utc20sIDlweCknIH0KICAgICAgfSwKICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdmbGV4LWVuZCcsIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsIGdhcDogJ3ZhcigtLXNwYWNlLW1kLCAxNXB4KScsIGZsZXhXcmFwOiAnd3JhcCcgfSB9LAogICAgICAgICAgZWwoJ2RpdicsIHsgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgZ2FwOiAnMnB4JywgbWluV2lkdGg6ICcwJyB9IH0sCiAgICAgICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZHJhd2VyX19jcmVkaXRzLWxhYmVsJywgdGV4dDogJ0NyZWRpdCBiYWxhbmNlJyB9KSwKICAgICAgICAgICAgZWwoJ2RpdicsIHsgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBhbGlnbkl0ZW1zOiAnYmFzZWxpbmUnLCBnYXA6ICc2cHgnIH0gfSwKICAgICAgICAgICAgICBjcmVkaXRzQmlnLAogICAgICAgICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEzcHgnIH0sIHRleHQ6ICdjcmVkaXRzJyB9KSkpLAogICAgICAgICAgY3RhQnV0dG9uKCdBZGQgY3JlZGl0cycsIHsgcHJpbWFyeTogdHJ1ZSwgc21hbGw6IHRydWUsIGljb246ICdwbHVzJywgb25DbGljazogZnVuY3Rpb24gKCkgeyBuYXZpZ2F0ZSgnIy9wYXl3YWxsJyk7IH0gfSkpLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEycHgnLCBtYXJnaW46ICcwJyB9LCB0ZXh0OiAnQ3JlZGl0cyBwb3dlciBldmVyeSBnZW5lcmF0aW9uLiBTdGFuZGFyZCBlZGl0cyBjb3N0IDEwLicgfSkKICAgICAgKTsKICAgICAgdmlldy5hcHBlbmRDaGlsZChiYWxhbmNlQ2FyZCk7CgogICAgICByZWZyZXNoQ3JlZGl0cygpLnRoZW4oZnVuY3Rpb24gKG4pIHsgaWYgKG4gIT0gbnVsbCkgcGFpbnQobik7IH0pOwogICAgICB2YXIgY2IgPSBmdW5jdGlvbiAobikgeyBwYWludChuKTsgfTsKICAgICAgdHJ5IHsgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5vbikgeyBWLnN0b3JlLm9uKCdjcmVkaXRzOmNoYW5nZWQnLCBjYik7IHVuc3ViLnB1c2goZnVuY3Rpb24gKCkgeyBWLnN0b3JlLm9mZiAmJiBWLnN0b3JlLm9mZignY3JlZGl0czpjaGFuZ2VkJywgY2IpOyB9KTsgfSB9IGNhdGNoIChlKSB7fQoKICAgICAgdmFyIG1lbnUgPSBlbCgnbmF2JywgeyBjbGFzczogJ3YtZHJhd2VyX19zZWN0aW9uJywgJ2FyaWEtbGFiZWwnOiAnQWNjb3VudCBtZW51Jywgc3R5bGU6IHsgZ2FwOiAnNHB4JyB9IH0pOwogICAgICBtZW51LmFwcGVuZENoaWxkKG1lbnVJdGVtKCdnaWZ0JywgJ1JlZmVycmFsIHByb2dyYW0nLCAnRWFybiBjcmVkaXRzIGJ5IGludml0aW5nIGNyZWF0b3JzJywgZnVuY3Rpb24gKCkgeyBuYXZpZ2F0ZSgnIy9yZWZlcnJhbCcpOyB9KSk7CiAgICAgIG1lbnUuYXBwZW5kQ2hpbGQobWVudUl0ZW0oJ2ZsYW1lJywgJ0RhaWx5IGNoYWxsZW5nZScsICdQb3N0IGEgZGF5LCBidWlsZCB5b3VyIHN0cmVhaycsIGZ1bmN0aW9uICgpIHsgbmF2aWdhdGUoJyMvY2hhbGxlbmdlJyk7IH0pKTsKICAgICAgbWVudS5hcHBlbmRDaGlsZChtZW51SXRlbSgnZ2VhcicsICdTZXR0aW5ncycsICdEZWZhdWx0cywgYnJhbmRpbmcgYW5kIGFjY291bnQnLCBmdW5jdGlvbiAoKSB7IG5hdmlnYXRlKCcjL3NldHRpbmdzJyk7IH0pKTsKICAgICAgbWVudS5hcHBlbmRDaGlsZChtZW51SXRlbSgnaGVscCcsICdIZWxwICYgc3VwcG9ydCcsICdGQVEgYW5kIGNvbnRhY3QnLCBmdW5jdGlvbiAoKSB7IGNsb3NlRHJhd2VyKCk7IHdpbmRvdy5vcGVuKCdodHRwczovL3Zvb3NleS5jb20vaGVscCcsICdfYmxhbmsnLCAnbm9vcGVuZXInKTsgfSkpOwogICAgICB2aWV3LmFwcGVuZENoaWxkKG1lbnUpOwoKICAgICAgdmFyIGxvZ291dEJ0biA9IGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtZHJhd2VyX19pdGVtIHYtZHJhd2VyX19pdGVtLS1kYW5nZXInIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2l0ZW0taWNvbicgfSwgaWNvbignbG9nb3V0JykpLAogICAgICAgIGVsKCdzcGFuJywgeyBzdHlsZTogeyBmb250V2VpZ2h0OiAnNjAwJyB9LCB0ZXh0OiAnTG9nIG91dCcgfSkpOwogICAgICBsb2dvdXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgY29uZmlybURpYWxvZygnTG9nIG91dCBvZiBWYW1wPycpLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgICAgICB0cnkgeyBpZiAoVi5hdXRoICYmIFYuYXV0aC5jbGVhcikgVi5hdXRoLmNsZWFyKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICB0b2FzdCgnU2lnbmVkIG91dCcsICdpbmZvJyk7CiAgICAgICAgICBuYXZpZ2F0ZSgnIy9hdXRoJyk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICB2aWV3LmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX3NlY3Rpb24nLCBzdHlsZTogeyBib3JkZXJCb3R0b206ICdub25lJyB9IH0sIGxvZ291dEJ0bikpOwoKICAgICAgcm9vdC5hcHBlbmRDaGlsZCh2aWV3KTsKICAgIH0KCiAgICBmdW5jdGlvbiBtZW51SXRlbShpYywgdGl0bGUsIHN1Yiwgb25DbGljaykgewogICAgICB2YXIgdGV4dFN0YWNrID0gZWwoJ3NwYW4nLCB7CiAgICAgICAgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgZ2FwOiAnMnB4JywgbWluV2lkdGg6ICcwJywgZmxleDogJzEgMSBhdXRvJywgdGV4dEFsaWduOiAnbGVmdCcgfQogICAgICB9LAogICAgICAgIGVsKCdzcGFuJywgeyBzdHlsZTogeyBkaXNwbGF5OiAnYmxvY2snLCBmb250V2VpZ2h0OiAnNjAwJywgZm9udFNpemU6ICcxNXB4JywgbGluZUhlaWdodDogJzEuMjUnLCBjb2xvcjogJ3ZhcigtLXYtaW5rLCAjZjVmNWY3KScgfSwgdGV4dDogdGl0bGUgfSkpOwogICAgICBpZiAoc3ViKSB7CiAgICAgICAgdGV4dFN0YWNrLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgewogICAgICAgICAgc3R5bGU6IHsgZGlzcGxheTogJ2Jsb2NrJywgZm9udFNpemU6ICcxM3B4JywgbGluZUhlaWdodDogJzEuMycsIGNvbG9yOiAndmFyKC0tdi1pbmstc29mdCwgcmdiYSgyNDUsMjQ1LDI0NywuNikpJyB9LAogICAgICAgICAgdGV4dDogc3ViCiAgICAgICAgfSkpOwogICAgICB9CiAgICAgIHZhciBidG4gPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWRyYXdlcl9faXRlbScsIHN0eWxlOiB7IGFsaWduSXRlbXM6ICdjZW50ZXInIH0gfSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWRyYXdlcl9faXRlbS1pY29uJyB9LCBpY29uKGljKSksCiAgICAgICAgdGV4dFN0YWNrLAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZHJhd2VyX19pdGVtLWljb24nLCBzdHlsZTogeyBjb2xvcjogJ3ZhcigtLXYtaW5rLXNvZnQsIHJnYmEoMjQ1LDI0NSwyNDcsLjUpKScsIHdpZHRoOiAnMThweCcsIGhlaWdodDogJzE4cHgnIH0gfSwgaWNvbignY2hldnJvbicpKSk7CiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2spOwogICAgICByZXR1cm4gYnRuOwogICAgfQoKICAgIGZ1bmN0aW9uIHRlYXJkb3duKCkgewogICAgICB3aGlsZSAodW5zdWIubGVuZ3RoKSB7IHRyeSB7IHVuc3ViLnBvcCgpKCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIH0KCiAgICByZXR1cm4geyByZW5kZXI6IHJlbmRlciwgdGVhcmRvd246IHRlYXJkb3duIH07CiAgfSkoKTsKCiAgVi52aWV3cy5vbmJvYXJkaW5nID0gKGZ1bmN0aW9uICgpIHsKICAgIHZhciBzdGF0ZSA9IHsgc3RlcDogMCwgaW5kdXN0cmllczogW10sIHJlZkNvZGU6ICcnIH07CgogICAgZnVuY3Rpb24gcmVuZGVyKHJvb3QsIHBhcmFtcykgewogICAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgICBtYXliZUFwcGx5UXVlcnlSZWZlcnJhbChwYXJhbXMpOwoKICAgICAgc3RhdGUuc3RlcCA9IDA7CiAgICAgIHN0YXRlLmluZHVzdHJpZXMgPSAoc2dldCgnaW5kdXN0cmllcycsIFtdKSB8fCBbXSkuc2xpY2UoKTsKICAgICAgc3RhdGUucmVmQ29kZSA9IGxzR2V0KCdyZWZlcnJhbENvZGUnLCAnJykgfHwgJyc7CgogICAgICB2YXIgdmlldyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wYWdlIHYtdmlldy0tb25ib2FyZGluZycsIHN0eWxlOiB7IG1heFdpZHRoOiAnNjQwcHgnIH0gfSk7CiAgICAgIHZhciBzdGFnZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAnZ2xhc3MtY2FyZCB2LW9uYl9fc3RhZ2UnIH0pOwogICAgICB2aWV3LmFwcGVuZENoaWxkKHN0YWdlKTsKICAgICAgcm9vdC5hcHBlbmRDaGlsZCh2aWV3KTsKCiAgICAgIHBhaW50KHN0YWdlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYWludChzdGFnZSkgewogICAgICBzdGFnZS5pbm5lckhUTUwgPSAnJzsKICAgICAgdmFyIGRvdHMgPSBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGdhcDogJzhweCcsIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJywgbWFyZ2luQm90dG9tOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJyB9IH0sCiAgICAgICAgZG90KHN0YXRlLnN0ZXAgPj0gMCksCiAgICAgICAgZG90KHN0YXRlLnN0ZXAgPj0gMSkpOwogICAgICBzdGFnZS5hcHBlbmRDaGlsZChkb3RzKTsKCiAgICAgIGlmIChzdGF0ZS5zdGVwID09PSAwKSBzdGFnZS5hcHBlbmRDaGlsZChzdGVwSW5kdXN0cmllcygpKTsKICAgICAgZWxzZSBzdGFnZS5hcHBlbmRDaGlsZChzdGVwUmVmZXJyYWwoKSk7CiAgICB9CgogICAgZnVuY3Rpb24gZG90KGFjdGl2ZSkgewogICAgICByZXR1cm4gZWwoJ3NwYW4nLCB7CiAgICAgICAgc3R5bGU6IHsKICAgICAgICAgIHdpZHRoOiBhY3RpdmUgPyAnMjRweCcgOiAnOHB4JywgaGVpZ2h0OiAnOHB4JywgYm9yZGVyUmFkaXVzOiAnOTk5cHgnLAogICAgICAgICAgYmFja2dyb3VuZDogYWN0aXZlID8gJ3ZhcigtLXZhbXAtYWNjZW50LCAjNTI5N0Y4KScgOiAndmFyKC0tdi1saW5lLCByZ2JhKDI0NSwyNDUsMjQ3LC4yKSknLAogICAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCB2YXIoLS1kdXItYmFzZSwgMjAwbXMpIHZhcigtLWVhc2Utc3ByaW5nLCBjdWJpYy1iZXppZXIoMC4zNCwxLjU2LDAuNjQsMSkpJwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RlcEluZHVzdHJpZXMoKSB7CiAgICAgIHZhciBmcmFnID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLW1kJyB9KTsKICAgICAgZnJhZy5hcHBlbmRDaGlsZChlbCgncCcsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnLCB0ZXh0OiAnV2VsY29tZSB0byBWYW1wJyB9KSk7CiAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwoJ2gxJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fdGl0bGUnLCBzdHlsZTogeyBmb250U2l6ZTogJ3ZhcigtLWZvbnQtdGl0bGUsIDI4cHgpJyB9LCB0ZXh0OiAnV2hhdCBkbyB5b3UgY3JlYXRlPycgfSkpOwogICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCB0ZXh0OiAnUGljayBhIGZldyBzbyB3ZSBjYW4gdGFpbG9yIHByZXNldHMgYW5kIHByb21wdHMuIFlvdSBjYW4gY2hhbmdlIHRoaXMgYW55dGltZS4nIH0pKTsKCiAgICAgIHZhciBjb250aW51ZUxhYmVsID0gZWwoJ3NwYW4nKTsKICAgICAgZnVuY3Rpb24gdXBkYXRlQ291bnQoKSB7CiAgICAgICAgdmFyIG4gPSBzdGF0ZS5pbmR1c3RyaWVzLmxlbmd0aDsKICAgICAgICBjb250aW51ZUxhYmVsLnRleHRDb250ZW50ID0gbiA/ICgnQ29udGludWUgKCcgKyBuICsgJyknKSA6ICdDb250aW51ZSc7CiAgICAgIH0KCiAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoaW5kdXN0cnlCdWJibGVHcmlkKHN0YXRlLmluZHVzdHJpZXMsIGZ1bmN0aW9uIChrZXlzKSB7IHN0YXRlLmluZHVzdHJpZXMgPSBrZXlzOyB1cGRhdGVDb3VudCgpOyB9KSk7CgogICAgICBmdW5jdGlvbiBhZHZhbmNlKCkgewogICAgICAgIHNzZXQoJ2luZHVzdHJpZXMnLCBzdGF0ZS5pbmR1c3RyaWVzKTsKICAgICAgICBzZXR0aW5nQ2hhbmdlKCdpbmR1c3RyaWVzJywgc3RhdGUuaW5kdXN0cmllcyk7CiAgICAgICAgaWYgKHN0YXRlLmluZHVzdHJpZXMubGVuZ3RoKSB7CiAgICAgICAgICB2YXIgcmVjID0gcmVjb21tZW5kZWRNb2RlbChzdGF0ZS5pbmR1c3RyaWVzKTsKICAgICAgICAgIGlmIChyZWMgJiYgIXNldHRpbmdzKCkuZGVmYXVsdE1vZGVsKSBzZXR0aW5nQ2hhbmdlKCdkZWZhdWx0TW9kZWwnLCByZWMpOwogICAgICAgIH0KICAgICAgICB2YXIgc3RhZ2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudi1vbmJfX3N0YWdlJyk7CiAgICAgICAgc3RhdGUuc3RlcCA9IDE7CiAgICAgICAgaWYgKHN0YWdlKSBwYWludChzdGFnZSk7CiAgICAgIH0KCiAgICAgIHZhciBjb250aW51ZUJ0biA9IGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtY3RhIHYtY3RhLS1wcmltYXJ5IHYtY3RhLS1ibG9jaycgfSwgY29udGludWVMYWJlbCk7CiAgICAgIGNvbnRpbnVlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWR2YW5jZSk7CiAgICAgIHVwZGF0ZUNvdW50KCk7CgogICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1zbScgfSwKICAgICAgICBjb250aW51ZUJ0biwKICAgICAgICBjdGFCdXR0b24oJ1NraXAgZm9yIG5vdycsIHsgZ2hvc3Q6IHRydWUsIGJsb2NrOiB0cnVlLCBvbkNsaWNrOiBhZHZhbmNlIH0pKSk7CiAgICAgIHJldHVybiBmcmFnOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0ZXBSZWZlcnJhbCgpIHsKICAgICAgdmFyIGZyYWcgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3RhY2stbWQnIH0pOwogICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdBbG1vc3QgdGhlcmUnIH0pKTsKICAgICAgZnJhZy5hcHBlbmRDaGlsZChlbCgnaDEnLCB7IGNsYXNzOiAndi1zZWN0aW9uX190aXRsZScsIHN0eWxlOiB7IGZvbnRTaXplOiAndmFyKC0tZm9udC10aXRsZSwgMjhweCknIH0sIHRleHQ6ICdHb3QgYSByZWZlcnJhbCBjb2RlPycgfSkpOwogICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCB0ZXh0OiAnRW50ZXIgYSBjcmVhdG9yIGNvZGUgdG8gdW5sb2NrIGJvbnVzIGNyZWRpdHMuIE9wdGlvbmFsLicgfSkpOwoKICAgICAgdmFyIGlucHV0ID0gZWwoJ2lucHV0JywgewogICAgICAgIHR5cGU6ICd0ZXh0JywgY2xhc3M6ICd2LWZpZWxkJywgdmFsdWU6IHN0YXRlLnJlZkNvZGUsCiAgICAgICAgcGxhY2Vob2xkZXI6ICdDUkVBVE9SQ09ERScsIGF1dG9jYXBpdGFsaXplOiAnY2hhcmFjdGVycycsIHNwZWxsY2hlY2s6ICdmYWxzZScsICdhcmlhLWxhYmVsJzogJ1JlZmVycmFsIGNvZGUnCiAgICAgIH0pOwogICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uICgpIHsgaW5wdXQudmFsdWUgPSBpbnB1dC52YWx1ZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoL1xzKy9nLCAnJyk7IHN0YXRlLnJlZkNvZGUgPSBpbnB1dC52YWx1ZTsgfSk7CiAgICAgIHZhciBzdGF0dXMgPSBlbCgncCcsIHsgY2xhc3M6ICd2LW11dGVkJywgc3R5bGU6IHsgZm9udFNpemU6ICcxM3B4JywgbWluSGVpZ2h0OiAnMThweCcgfSB9KTsKICAgICAgZnJhZy5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtZmllbGQtZ3JvdXAnIH0sIGlucHV0LCBzdGF0dXMpKTsKCiAgICAgIHZhciBmaW5pc2ggPSBjdGFCdXR0b24oJ0dldCBzdGFydGVkJywgeyBwcmltYXJ5OiB0cnVlLCBibG9jazogdHJ1ZSwgb25DbGljazogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjb2RlID0gKGlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgICAgdmFyIGRvbmUgPSBmdW5jdGlvbiAoKSB7IGNvbXBsZXRlT25ib2FyZGluZygpOyB9OwogICAgICAgIGlmIChjb2RlICYmIFYuYXBpICYmIHR5cGVvZiBWLmFwaS5hdHRyaWJ1dGVSZWZlcnJhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyc7CiAgICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnQXBwbHlpbmcgY29kZeKApic7CiAgICAgICAgICBsc1NldCgncmVmZXJyYWxDb2RlJywgY29kZSk7CiAgICAgICAgICBWLmFwaS5hdHRyaWJ1dGVSZWZlcnJhbChjb2RlKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdG9hc3QoJ1JlZmVycmFsIGFwcGxpZWQhJywgJ3N1Y2Nlc3MnKTsKICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tY29sb3ItZXJyb3IsICNGNzMzNjMpJzsKICAgICAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gKGVyciAmJiBlcnIubWVzc2FnZSkgPyBlcnIubWVzc2FnZSA6ICdDb3VsZCBub3QgYXBwbHkgdGhhdCBjb2RlLCBidXQgeW91IGFyZSBhbGwgc2V0Lic7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZG9uZSwgMTIwMCk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZG9uZSgpOwogICAgICAgIH0KICAgICAgfSB9KTsKCiAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLXNtJyB9LAogICAgICAgIGZpbmlzaCwKICAgICAgICBjdGFCdXR0b24oJ1NraXAnLCB7IGdob3N0OiB0cnVlLCBibG9jazogdHJ1ZSwgb25DbGljazogZnVuY3Rpb24gKCkgeyBjb21wbGV0ZU9uYm9hcmRpbmcoKTsgfSB9KSkpOwogICAgICByZXR1cm4gZnJhZzsKICAgIH0KCiAgICBmdW5jdGlvbiBjb21wbGV0ZU9uYm9hcmRpbmcoKSB7CiAgICAgIHNzZXQoJ29uYm9hcmRpbmdEb25lJywgdHJ1ZSk7CiAgICAgIHRyeSB7IGlmIChWLnN0YXRlKSBWLnN0YXRlLm9uYm9hcmRpbmdEb25lID0gdHJ1ZTsgfSBjYXRjaCAoZSkge30KICAgICAgc2hvd0ZyZWVDcmVkaXRzV2VsY29tZSgpOwogICAgICBnbygnIy9jcmVhdGUnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93RnJlZUNyZWRpdHNXZWxjb21lKCkgewogICAgICBpZiAobHNHZXQoJ3NlZW5DcmVkaXRXZWxjb21lJywgZmFsc2UpKSByZXR1cm47CiAgICAgIGxzU2V0KCdzZWVuQ3JlZGl0V2VsY29tZScsIHRydWUpOwogICAgICByZWZyZXNoQ3JlZGl0cygpLnRoZW4oZnVuY3Rpb24gKG4pIHsKICAgICAgICB2YXIgYW1vdW50ID0gKG4gIT0gbnVsbCAmJiBuID4gMCkgPyBuIDogNTA7CiAgICAgICAgdG9hc3QoJ1dlbGNvbWUhIFlvdSBoYXZlICcgKyBhbW91bnQgKyAnIGZyZWUgY3JlZGl0cyB0byBzdGFydCBjcmVhdGluZy4nLCAnc3VjY2VzcycpOwogICAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmNvbmZldHRpID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IFYudWkuY29uZmV0dGkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgICB9KTsKICAgIH0KCiAgICByZXR1cm4geyByZW5kZXI6IHJlbmRlciB9OwogIH0pKCk7CgogIFYudmlld3MucmVmZXJyYWwgPSAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gcmVuZGVyKHJvb3QsIHBhcmFtcykgewogICAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWF1dGhHdWFyZChyb290KSkgcmV0dXJuOwoKICAgICAgbWF5YmVBcHBseVF1ZXJ5UmVmZXJyYWwocGFyYW1zKTsKCiAgICAgIHZhciB2aWV3ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBhZ2Ugdi12aWV3LS1yZWZlcnJhbCcgfSk7CiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoZWwoJ2hlYWRlcicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX2hlYWQnIH0sCiAgICAgICAgZWwoJ2RpdicsIG51bGwsCiAgICAgICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnLCB0ZXh0OiAnR3Jvd3RoJyB9KSwKICAgICAgICAgIGVsKCdoMScsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3RpdGxlJywgc3R5bGU6IHsgZm9udFNpemU6ICd2YXIoLS1mb250LWxhcmdlLXRpdGxlLCAzNHB4KScgfSwgdGV4dDogJ1JlZmVycmFsIHByb2dyYW0nIH0pLAogICAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1zZWN0aW9uX19zdWInLCB0ZXh0OiAnU2hhcmUgeW91ciBjb2RlLCBlYXJuIGNyZWRpdHMgd2hlbiBjcmVhdG9ycyBzaWduIHVwIGFuZCBjcmVhdGUuJyB9KSkpKTsKCiAgICAgIHZhciBsaXN0V3JhcCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1tZCcgfSk7CiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQobGlzdFdyYXApOwogICAgICByb290LmFwcGVuZENoaWxkKHZpZXcpOwoKICAgICAgbGlzdFdyYXAuYXBwZW5kQ2hpbGQoc2tlbCgpKTsKICAgICAgbGlzdFdyYXAuYXBwZW5kQ2hpbGQoc2tlbCgpKTsKCiAgICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLnJlZmVycmFsQ29kZXMgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICByZW5kZXJFbXB0eShsaXN0V3JhcCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBWLmFwaS5yZWZlcnJhbENvZGVzKCkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgdmFyIGNvZGVzID0gbm9ybWFsaXplTGlzdChyZXMpOwogICAgICAgIGxpc3RXcmFwLmlubmVySFRNTCA9ICcnOwogICAgICAgIGlmICghY29kZXMubGVuZ3RoKSB7IHJlbmRlckVtcHR5KGxpc3RXcmFwKTsgcmV0dXJuOyB9CiAgICAgICAgY29kZXMuZm9yRWFjaChmdW5jdGlvbiAoYykgeyBsaXN0V3JhcC5hcHBlbmRDaGlsZChjb2RlQ2FyZChjKSk7IH0pOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgbGlzdFdyYXAuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgcmVuZGVyRXJyb3IobGlzdFdyYXAsIGVyciwgZnVuY3Rpb24gKCkgeyByZW5kZXIocm9vdCwgcGFyYW1zKTsgfSk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUxpc3QocmVzKSB7CiAgICAgIGlmICghcmVzKSByZXR1cm4gW107CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHJldHVybiByZXM7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcy5pdGVtcykpIHJldHVybiByZXMuaXRlbXM7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcy5jb2RlcykpIHJldHVybiByZXMuY29kZXM7CiAgICAgIHJldHVybiBbXTsKICAgIH0KCiAgICBmdW5jdGlvbiBza2VsKCkgewogICAgICB2YXIgY2FyZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAnZ2xhc3MtY2FyZCcgfSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24gdi1za2VsZXRvbi0tdGl0bGUnLCBzdHlsZTogeyB3aWR0aDogJzUwJScgfSB9KSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24gdi1za2VsZXRvbi0tdGV4dCcsIHN0eWxlOiB7IHdpZHRoOiAnODAlJywgbWFyZ2luVG9wOiAnMTJweCcgfSB9KSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24gdi1za2VsZXRvbi0tdGV4dCcsIHN0eWxlOiB7IHdpZHRoOiAnNjAlJywgbWFyZ2luVG9wOiAnOHB4JyB9IH0pKTsKICAgICAgcmV0dXJuIGNhcmQ7CiAgICB9CgogICAgZnVuY3Rpb24gY29kZUNhcmQoYykgewogICAgICB2YXIgY29kZSA9IGMuY29kZSB8fCBjLnJlZmVycmFsQ29kZSB8fCBjLmlkIHx8ICfigJQnOwogICAgICB2YXIgcGxhdGZvcm0gPSBjLnBsYXRmb3JtIHx8IGMuY2hhbm5lbCB8fCAnJzsKICAgICAgdmFyIGNvbW1pc3Npb24gPSAoYy5jb21taXNzaW9uICE9IG51bGwgPyBjLmNvbW1pc3Npb24gOiAoYy5jb21taXNzaW9uUGVyY2VudCAhPSBudWxsID8gYy5jb21taXNzaW9uUGVyY2VudCA6IG51bGwpKTsKICAgICAgdmFyIHN0YXR1cyA9IGMuc3RhdHVzIHx8IChjLmFjdGl2ZSA9PT0gZmFsc2UgPyAnaW5hY3RpdmUnIDogJ2FjdGl2ZScpOwogICAgICB2YXIgc2lnbnVwcyA9IG51bShjLnNpZ251cHMgIT0gbnVsbCA/IGMuc2lnbnVwcyA6IChjLnN0YXRzICYmIGMuc3RhdHMuc2lnbnVwcykpOwogICAgICB2YXIgZWFybmVkID0gbnVtKGMuY3JlZGl0c0Vhcm5lZCAhPSBudWxsID8gYy5jcmVkaXRzRWFybmVkIDogKGMuc3RhdHMgJiYgYy5zdGF0cy5jcmVkaXRzRWFybmVkKSk7CiAgICAgIHZhciBzZWVkZWQgPSBudW0oYy5jcmVkaXRzU2VlZGVkICE9IG51bGwgPyBjLmNyZWRpdHNTZWVkZWQgOiAoYy5zdGF0cyAmJiBjLnN0YXRzLmNyZWRpdHNTZWVkZWQpKTsKCiAgICAgIHZhciBzaGFyZVVSTCA9ICdodHRwczovL2FwcHMuYXBwbGUuY29tL3VzL2FwcC92YW1wL2lkNjc0ODY1NzY4NT9yPScgKyBlbmNvZGVVUklDb21wb25lbnQoY29kZSk7CiAgICAgIHZhciBpc0FjdGl2ZSA9IFN0cmluZyhzdGF0dXMpLnRvTG93ZXJDYXNlKCkgPT09ICdhY3RpdmUnOwoKICAgICAgdmFyIGNvZGVMaW5lID0gZWwoJ2RpdicsIHsgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBhbGlnbkl0ZW1zOiAnY2VudGVyJywgZ2FwOiAndmFyKC0tc3BhY2Utc20sIDlweCknLCBmbGV4V3JhcDogJ3dyYXAnIH0gfSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LW1vbm8nLCBzdHlsZTogeyBmb250U2l6ZTogJzIycHgnLCBmb250V2VpZ2h0OiAnNzAwJywgbGV0dGVyU3BhY2luZzogJzAuMDRlbScgfSwgdGV4dDogY29kZSB9KSk7CiAgICAgIGlmIChwbGF0Zm9ybSkgY29kZUxpbmUuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcgfSwgdGV4dDogcGxhdGZvcm0gfSkpOwoKICAgICAgdmFyIGJhZGdlID0gZWwoJ3NwYW4nLCB7CiAgICAgICAgY2xhc3M6ICd2LW1vbm8nLAogICAgICAgIHN0eWxlOiB7CiAgICAgICAgICBmb250U2l6ZTogJzExcHgnLCB0ZXh0VHJhbnNmb3JtOiAndXBwZXJjYXNlJywgbGV0dGVyU3BhY2luZzogJzAuMWVtJywKICAgICAgICAgIHBhZGRpbmc6ICc0cHggMTBweCcsIGJvcmRlclJhZGl1czogJzk5OXB4JywKICAgICAgICAgIGNvbG9yOiBpc0FjdGl2ZSA/ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknIDogJ3ZhcigtLXYtaW5rLXNvZnQsIHJnYmEoMjQ1LDI0NSwyNDcsLjYpKScsCiAgICAgICAgICBib3JkZXI6ICcxcHggc29saWQgJyArIChpc0FjdGl2ZSA/ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknIDogJ3ZhcigtLXYtbGluZSwgcmdiYSgyNDUsMjQ1LDI0NywuMTUpKScpCiAgICAgICAgfSwKICAgICAgICB0ZXh0OiBjYXAoc3RhdHVzKQogICAgICB9KTsKCiAgICAgIHZhciBoZWFkID0gZWwoJ2RpdicsIHsgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBhbGlnbkl0ZW1zOiAnZmxleC1zdGFydCcsIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsIGdhcDogJ3ZhcigtLXNwYWNlLW1kLCAxNXB4KScsIGZsZXhXcmFwOiAnd3JhcCcgfSB9LCBjb2RlTGluZSwgYmFkZ2UpOwoKICAgICAgdmFyIHN0YXRzUm93ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWdyaWQgdi1ncmlkLS0zJywgc3R5bGU6IHsgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJyB9IH0sCiAgICAgICAgc3RhdEJveChzaWdudXBzLCAnU2lnbnVwcycpLAogICAgICAgIHN0YXRCb3goZWFybmVkLCAnQ3JlZGl0cyBlYXJuZWQnKSwKICAgICAgICBzdGF0Qm94KHNlZWRlZCwgJ0NyZWRpdHMgc2VlZGVkJykpOwogICAgICBpZiAoY29tbWlzc2lvbiAhPSBudWxsKSBzdGF0c1Jvdy5hcHBlbmRDaGlsZChzdGF0Qm94KGNvbW1pc3Npb24gKyAnJScsICdDb21taXNzaW9uJykpOwoKICAgICAgdmFyIGFjdGlvbnMgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3RhLXJvdycgfSwKICAgICAgICBjdGFCdXR0b24oJ0NvcHkgbGluaycsIHsgcHJpbWFyeTogdHJ1ZSwgc21hbGw6IHRydWUsIGljb246ICdsaW5rJywgb25DbGljazogZnVuY3Rpb24gKCkgeyBjb3B5KHNoYXJlVVJMLCAnU2hhcmUgbGluayBjb3BpZWQnKTsgfSB9KSwKICAgICAgICBjdGFCdXR0b24oJ0NvcHkgY29kZScsIHsgZ2hvc3Q6IHRydWUsIHNtYWxsOiB0cnVlLCBpY29uOiAnY29weScsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgY29weShjb2RlLCAnQ29kZSBjb3BpZWQnKTsgfSB9KSk7CgogICAgICB2YXIgY2FyZCA9IGVsKCdzZWN0aW9uJywgeyBjbGFzczogJ3Ytc2VjdGlvbiBnbGFzcy1jYXJkJyB9LCBoZWFkLCBzdGF0c1JvdywgYWN0aW9ucyk7CgogICAgICB2YXIgbGVkZ2VyID0gYy5sZWRnZXIgfHwgYy5hY3Rpdml0eSB8fCBjLnJlY2VudEFjdGl2aXR5OwogICAgICBpZiAoQXJyYXkuaXNBcnJheShsZWRnZXIpICYmIGxlZGdlci5sZW5ndGgpIHsKICAgICAgICB2YXIgbGlzdCA9IGVsKCd1bCcsIHsgc3R5bGU6IHsgbGlzdFN0eWxlOiAnbm9uZScsIG1hcmdpbjogJzAnLCBwYWRkaW5nOiAnMCcsIGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzhweCcgfSB9KTsKICAgICAgICBsZWRnZXIuc2xpY2UoMCwgNSkuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHsKICAgICAgICAgIHZhciBsYWJlbCA9IGVudHJ5LmxhYmVsIHx8IGVudHJ5LmV2ZW50IHx8IGVudHJ5LnR5cGUgfHwgJ0FjdGl2aXR5JzsKICAgICAgICAgIHZhciBhbXQgPSBlbnRyeS5jcmVkaXRzICE9IG51bGwgPyAoJysnICsgZW50cnkuY3JlZGl0cyArICcgY3InKSA6IChlbnRyeS5hbW91bnQgIT0gbnVsbCA/IGVudHJ5LmFtb3VudCA6ICcnKTsKICAgICAgICAgIHZhciB3aGVuID0gZW50cnkuZGF0ZSB8fCBlbnRyeS5jcmVhdGVkRGF0ZSB8fCBlbnRyeS50aW1lc3RhbXA7CiAgICAgICAgICBpZiAod2hlbiAmJiBWLnV0aWwgJiYgVi51dGlsLmZtdERhdGUpIHdoZW4gPSBWLnV0aWwuZm10RGF0ZSh3aGVuKTsKICAgICAgICAgIGxpc3QuYXBwZW5kQ2hpbGQoZWwoJ2xpJywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsIGdhcDogJ3ZhcigtLXNwYWNlLW1kLCAxNXB4KScsIGZvbnRTaXplOiAnMTRweCcgfSB9LAogICAgICAgICAgICBlbCgnc3BhbicsIHsgdGV4dDogbGFiZWwgfSksCiAgICAgICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbXV0ZWQnLCB0ZXh0OiBbYW10LCB3aGVuXS5maWx0ZXIoQm9vbGVhbikuam9pbignIMK3ICcpIH0pKSk7CiAgICAgICAgfSk7CiAgICAgICAgdmFyIGRldGFpbHMgPSBlbCgnZGV0YWlscycsIG51bGwsCiAgICAgICAgICBlbCgnc3VtbWFyeScsIHsgc3R5bGU6IHsgY3Vyc29yOiAncG9pbnRlcicsIGZvbnRTaXplOiAnMTRweCcsIGNvbG9yOiAndmFyKC0tdmFtcC1hY2NlbnQsICM1Mjk3RjgpJyB9LCB0ZXh0OiAnUmVjZW50IGFjdGl2aXR5JyB9KSwKICAgICAgICAgIGVsKCdkaXYnLCB7IHN0eWxlOiB7IHBhZGRpbmdUb3A6ICd2YXIoLS1zcGFjZS1zbSwgOXB4KScgfSB9LCBsaXN0KSk7CiAgICAgICAgY2FyZC5hcHBlbmRDaGlsZChkZXRhaWxzKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGNhcmQ7CiAgICB9CgogICAgZnVuY3Rpb24gc3RhdEJveCh2YWx1ZSwgbGFiZWwpIHsKICAgICAgcmV0dXJuIGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzJweCcgfSB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb25vJywgc3R5bGU6IHsgZm9udFNpemU6ICcyMnB4JywgZm9udFdlaWdodDogJzcwMCcgfSwgdGV4dDogdmFsdWUgfSksCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW11dGVkJywgc3R5bGU6IHsgZm9udFNpemU6ICcxMnB4JyB9LCB0ZXh0OiBsYWJlbCB9KSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVyRW1wdHkod3JhcCkgewogICAgICB3cmFwLmlubmVySFRNTCA9ICcnOwogICAgICB2YXIgY2FyZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eSBnbGFzcy1jYXJkJyB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eV9faWNvbicgfSwgaWNvbignZ2lmdCcpKSwKICAgICAgICBlbCgnaDInLCB7IGNsYXNzOiAndi1lbXB0eV9fdGl0bGUnLCB0ZXh0OiAnQmVjb21lIGEgVmFtcCBDcmVhdG9yJyB9KSwKICAgICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19tc2cnLCB0ZXh0OiAnWW91IGRvIG5vdCBoYXZlIGEgcmVmZXJyYWwgY29kZSB5ZXQuIEFwcGx5IHRvIGVhcm4gY3JlZGl0cyBhbmQgY29tbWlzc2lvbiB3aGVuIGNyZWF0b3JzIHlvdSByZWZlciBzaWduIHVwLicgfSksCiAgICAgICAgY3RhQnV0dG9uKCdBcHBseSB0byBiZWNvbWUgYSBjcmVhdG9yJywgeyBwcmltYXJ5OiB0cnVlLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB3aW5kb3cub3BlbignaHR0cHM6Ly92b29zZXkuY29tL3ZhbXAvY3JlYXRvcnMnLCAnX2JsYW5rJywgJ25vb3BlbmVyJyk7CiAgICAgICAgfSB9KSk7CiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQoY2FyZCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVyRXJyb3Iod3JhcCwgZXJyLCByZXRyeSkgewogICAgICB3cmFwLmlubmVySFRNTCA9ICcnOwogICAgICB2YXIgbXNnID0gKGVyciAmJiBlcnIubWVzc2FnZSkgPyBlcnIubWVzc2FnZSA6ICdDb3VsZCBub3QgbG9hZCB5b3VyIHJlZmVycmFsIGNvZGVzLic7CiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5IGdsYXNzLWNhcmQnIH0sCiAgICAgICAgZWwoJ2gyJywgeyBjbGFzczogJ3YtZW1wdHlfX3RpdGxlJywgdGV4dDogJ1NvbWV0aGluZyB3ZW50IHdyb25nJyB9KSwKICAgICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19tc2cnLCB0ZXh0OiBtc2cgfSksCiAgICAgICAgY3RhQnV0dG9uKCdSZXRyeScsIHsgZ2hvc3Q6IHRydWUsIG9uQ2xpY2s6IHJldHJ5IH0pKSk7CiAgICB9CgogICAgZnVuY3Rpb24gY29weSh0ZXh0LCBvaykgewogICAgICB0cnkgewogICAgICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7CiAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KS50aGVuKGZ1bmN0aW9uICgpIHsgdG9hc3Qob2sgfHwgJ0NvcGllZCcsICdzdWNjZXNzJyk7IH0sIGZ1bmN0aW9uICgpIHsgbGVnYWN5Q29weSh0ZXh0LCBvayk7IH0pOwogICAgICAgIH0gZWxzZSB7IGxlZ2FjeUNvcHkodGV4dCwgb2spOyB9CiAgICAgIH0gY2F0Y2ggKGUpIHsgbGVnYWN5Q29weSh0ZXh0LCBvayk7IH0KICAgIH0KICAgIGZ1bmN0aW9uIGxlZ2FjeUNvcHkodGV4dCwgb2spIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogICAgICAgIHRhLnZhbHVlID0gdGV4dDsgdGEuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnOyB0YS5zdHlsZS5vcGFjaXR5ID0gJzAnOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOyB0YS5zZWxlY3QoKTsgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsgdGEucmVtb3ZlKCk7CiAgICAgICAgdG9hc3Qob2sgfHwgJ0NvcGllZCcsICdzdWNjZXNzJyk7CiAgICAgIH0gY2F0Y2ggKGUpIHsgdG9hc3QoJ0NvcHkgZmFpbGVkIOKAlCAnICsgdGV4dCwgJ2Vycm9yJyk7IH0KICAgIH0KCiAgICBmdW5jdGlvbiBudW0obikgeyByZXR1cm4gKG4gPT0gbnVsbCB8fCBpc05hTihOdW1iZXIobikpKSA/ICcwJyA6IFN0cmluZyhOdW1iZXIobikpOyB9CiAgICBmdW5jdGlvbiBjYXAocykgeyBzID0gU3RyaW5nKHMgfHwgJycpOyByZXR1cm4gcyA/IHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpIDogczsgfQoKICAgIHJldHVybiB7IHJlbmRlcjogcmVuZGVyIH07CiAgfSkoKTsKCiAgVi52aWV3cy5jaGFsbGVuZ2UgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIEdPQUwgPSAzMDsKICAgIHZhciBHUkFDRV9EQVlTID0gNTsKICAgIHZhciBEQUlMWV9DUkVESVRTID0gMTAwOwogICAgdmFyIEJPTlVTX0NSRURJVFMgPSAxMDAwOwoKICAgIGZ1bmN0aW9uIGdldFN0cmVhaygpIHsKICAgICAgdmFyIHMgPSBsc0dldCgnY2hhbGxlbmdlJywgbnVsbCk7CiAgICAgIGlmICghcyB8fCB0eXBlb2YgcyAhPT0gJ29iamVjdCcpIHMgPSB7IGNvdW50OiAwLCBsYXN0RGF5OiBudWxsLCBiZXN0OiAwLCB0b3RhbDogMCB9OwogICAgICByZXR1cm4gczsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFN0cmVhayhzKSB7IGxzU2V0KCdjaGFsbGVuZ2UnLCBzKTsgfQoKICAgIGZ1bmN0aW9uIHRvZGF5S2V5KCkgewogICAgICB2YXIgZCA9IG5ldyBEYXRlKCk7CiAgICAgIHJldHVybiBkLmdldEZ1bGxZZWFyKCkgKyAnLScgKyBwYWQoZC5nZXRNb250aCgpICsgMSkgKyAnLScgKyBwYWQoZC5nZXREYXRlKCkpOwogICAgfQogICAgZnVuY3Rpb24gcGFkKG4pIHsgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4gOiAnJyArIG47IH0KICAgIGZ1bmN0aW9uIGRheURpZmYoYUtleSwgYktleSkgewogICAgICBpZiAoIWFLZXkgfHwgIWJLZXkpIHJldHVybiBJbmZpbml0eTsKICAgICAgdmFyIGEgPSBwYXJzZUtleShhS2V5KSwgYiA9IHBhcnNlS2V5KGJLZXkpOwogICAgICByZXR1cm4gTWF0aC5yb3VuZCgoYiAtIGEpIC8gODY0MDAwMDApOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VLZXkoaykgewogICAgICB2YXIgcCA9IFN0cmluZyhrKS5zcGxpdCgnLScpOwogICAgICByZXR1cm4gRGF0ZS5VVEMoK3BbMF0sICgrcFsxXSkgLSAxLCArcFsyXSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVyKHJvb3QpIHsKICAgICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgICAgaWYgKCFhdXRoR3VhcmQocm9vdCkpIHJldHVybjsKCiAgICAgIHZhciBzID0gZ2V0U3RyZWFrKCk7CiAgICAgIHZhciB2aWV3ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBhZ2Ugdi12aWV3LS1jaGFsbGVuZ2UnIH0pOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChlbCgnaGVhZGVyJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9faGVhZCcgfSwKICAgICAgICBlbCgnZGl2JywgbnVsbCwKICAgICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdHcm93dGgnIH0pLAogICAgICAgICAgZWwoJ2gxJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fdGl0bGUnLCBzdHlsZTogeyBmb250U2l6ZTogJ3ZhcigtLWZvbnQtbGFyZ2UtdGl0bGUsIDM0cHgpJyB9LCB0ZXh0OiAnUG9zdC1hLWRheSBjaGFsbGVuZ2UnIH0pLAogICAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1zZWN0aW9uX19zdWInLCB0ZXh0OiAnQ3JlYXRlIGFuZCBzaGFyZSBkYWlseS4gRWFybiAnICsgREFJTFlfQ1JFRElUUyArICcgY3JlZGl0cyBlYWNoIGRheSBhbmQgYSAnICsgQk9OVVNfQ1JFRElUUyArICctY3JlZGl0IGJvbnVzIGF0IGRheSAnICsgR09BTCArICcuJyB9KSkpKTsKCiAgICAgIHZhciB0b2RheSA9IHRvZGF5S2V5KCk7CiAgICAgIHZhciBsb2dnZWRUb2RheSA9IHMubGFzdERheSA9PT0gdG9kYXk7CiAgICAgIHZhciBicm9rZW4gPSBzLmxhc3REYXkgJiYgZGF5RGlmZihzLmxhc3REYXksIHRvZGF5KSA+IChHUkFDRV9EQVlTICsgMSk7CiAgICAgIHZhciBsaXZlQ291bnQgPSBicm9rZW4gPyAwIDogcy5jb3VudDsKICAgICAgdmFyIHBjdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGxpdmVDb3VudCAvIEdPQUwpKTsKCiAgICAgIHZhciBoZXJvID0gZWwoJ3NlY3Rpb24nLCB7CiAgICAgICAgY2xhc3M6ICdnbGFzcy1jYXJkJywKICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGdhcDogJ3ZhcigtLXNwYWNlLWxnLCAyNHB4KScsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBmbGV4V3JhcDogJ3dyYXAnIH0KICAgICAgfSwKICAgICAgICByaW5nTm9kZShwY3QsIGxpdmVDb3VudCksCiAgICAgICAgZWwoJ2RpdicsIHsgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgZ2FwOiAnNnB4JywgZmxleDogJzEgMSAyMDBweCcsIG1pbldpZHRoOiAnMCcgfSB9LAogICAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vbm8nLCBzdHlsZTogeyBmb250U2l6ZTogJ3ZhcigtLWZvbnQtdGl0bGUzLCAyMHB4KScsIGZvbnRXZWlnaHQ6ICc3MDAnIH0sIHRleHQ6ICdEYXkgJyArIGxpdmVDb3VudCArICcgLyAnICsgR09BTCB9KSwKICAgICAgICAgIGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGdhcDogJzZweCcsIGNvbG9yOiAndmFyKC0tdmFtcC1hY2NlbnQsICM1Mjk3RjgpJyB9IH0sCiAgICAgICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3RhX19pY29uJywgc3R5bGU6IHsgd2lkdGg6ICcxOHB4JywgaGVpZ2h0OiAnMThweCcgfSB9LCBpY29uKCdmbGFtZScpKSwKICAgICAgICAgICAgZWwoJ3NwYW4nLCB7IHRleHQ6IGxpdmVDb3VudCA+IDAgPyAobGl2ZUNvdW50ICsgJy1kYXkgc3RyZWFrJykgOiAnU3RhcnQgeW91ciBzdHJlYWsnIH0pKSwKICAgICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzE0cHgnLCBtYXJnaW46ICcwJyB9LCB0ZXh0OiBicm9rZW4KICAgICAgICAgICAgPyAnWW91ciBzdHJlYWsgbGFwc2VkIHBhc3QgdGhlICcgKyBHUkFDRV9EQVlTICsgJy1kYXkgZ3JhY2Ugd2luZG93LiBQb3N0IHRvZGF5IHRvIGJlZ2luIGFnYWluLicKICAgICAgICAgICAgOiAobG9nZ2VkVG9kYXkgPyAnTG9nZ2VkIGZvciB0b2RheSDigJQgY29tZSBiYWNrIHRvbW9ycm93IHRvIGtlZXAgaXQgZ29pbmcuJyA6ICdQb3N0IHRvZGF5IHRvIGV4dGVuZCB5b3VyIHN0cmVhay4nKSB9KSkKICAgICAgKTsKICAgICAgdmlldy5hcHBlbmRDaGlsZChoZXJvKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoZWwoJ3NlY3Rpb24nLCB7IGNsYXNzOiAndi1ncmlkIHYtZ3JpZC0tNCBnbGFzcy1jYXJkJywgc3R5bGU6IHsgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJyB9IH0sCiAgICAgICAgc3RhdEJveChsaXZlQ291bnQsICdDdXJyZW50IHN0cmVhaycpLAogICAgICAgIHN0YXRCb3goTWF0aC5tYXgocy5iZXN0IHx8IDAsIGxpdmVDb3VudCksICdCZXN0IHN0cmVhaycpLAogICAgICAgIHN0YXRCb3goKHMudG90YWwgfHwgMCksICdEYXlzIHBvc3RlZCcpLAogICAgICAgIHN0YXRCb3goKChzLnRvdGFsIHx8IDApICogREFJTFlfQ1JFRElUUyksICdDcmVkaXRzIGVhcm5lZCcpKSk7CgogICAgICB2YXIgbG9nQnRuID0gY3RhQnV0dG9uKGxvZ2dlZFRvZGF5ID8gJ1Bvc3RlZCB0b2RheScgOiAnSSBwb3N0ZWQgdG9kYXknLCB7CiAgICAgICAgcHJpbWFyeTogIWxvZ2dlZFRvZGF5LCBnaG9zdDogbG9nZ2VkVG9kYXksIGJsb2NrOiB0cnVlLCBpY29uOiBsb2dnZWRUb2RheSA/ICdjaGVja21hcmsnIDogJ3BsdXMnCiAgICAgIH0pOwogICAgICBsb2dCdG4uZGlzYWJsZWQgPSBsb2dnZWRUb2RheTsKICAgICAgbG9nQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBzdCA9IGdldFN0cmVhaygpOwogICAgICAgIHZhciB0ID0gdG9kYXlLZXkoKTsKICAgICAgICBpZiAoc3QubGFzdERheSA9PT0gdCkgcmV0dXJuOwogICAgICAgIHZhciBicmsgPSBzdC5sYXN0RGF5ICYmIGRheURpZmYoc3QubGFzdERheSwgdCkgPiAoR1JBQ0VfREFZUyArIDEpOwogICAgICAgIHN0LmNvdW50ID0gYnJrID8gMSA6IChzdC5jb3VudCB8fCAwKSArIDE7CiAgICAgICAgc3QubGFzdERheSA9IHQ7CiAgICAgICAgc3QudG90YWwgPSAoc3QudG90YWwgfHwgMCkgKyAxOwogICAgICAgIHN0LmJlc3QgPSBNYXRoLm1heChzdC5iZXN0IHx8IDAsIHN0LmNvdW50KTsKICAgICAgICBzZXRTdHJlYWsoc3QpOwogICAgICAgIGlmIChzdC5jb3VudCA+PSBHT0FMKSB7CiAgICAgICAgICB0b2FzdChHT0FMICsgJy1kYXkgY2hhbGxlbmdlIGNvbXBsZXRlISAnICsgQk9OVVNfQ1JFRElUUyArICcgYm9udXMgY3JlZGl0cyB1bmxvY2tlZC4nLCAnc3VjY2VzcycpOwogICAgICAgICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuY29uZmV0dGkgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgVi51aS5jb25mZXR0aSgpOyB9IGNhdGNoIChlKSB7fSB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRvYXN0KCdEYXkgJyArIHN0LmNvdW50ICsgJyBsb2dnZWQgwrcgKycgKyBEQUlMWV9DUkVESVRTICsgJyBjcmVkaXRzJywgJ3N1Y2Nlc3MnKTsKICAgICAgICAgIGlmIChzdC5jb3VudCA+IDEgJiYgVi51aSAmJiB0eXBlb2YgVi51aS5jb25mZXR0aSA9PT0gJ2Z1bmN0aW9uJykgeyB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgICAgICB9CiAgICAgICAgcmVuZGVyKHJvb3QpOwogICAgICB9KTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLXNtJyB9LAogICAgICAgIGxvZ0J0biwKICAgICAgICBjdGFCdXR0b24oJ0NyZWF0ZSBzb21ldGhpbmcgbm93JywgeyBnaG9zdDogdHJ1ZSwgYmxvY2s6IHRydWUsIGljb246ICdzcGFya2xlcycsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvY3JlYXRlJyk7IH0gfSkpKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoY2FsZW5kYXJOb2RlKGxpdmVDb3VudCkpOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChlbCgncCcsIHsgY2xhc3M6ICd2LW11dGVkJywgc3R5bGU6IHsgZm9udFNpemU6ICcxMnB4JyB9LCB0ZXh0OiAnRGFpbHkgYW5kIGJvbnVzIGNyZWRpdHMgYXJlIGNvbmZpcm1lZCBzZXJ2ZXItc2lkZS4gUG9zdHMgbXVzdCBpbmNsdWRlIHRoZSBAdmFtcCBvciAjdmFtcCB0YWcgdG8gcXVhbGlmeS4nIH0pKTsKCiAgICAgIHJvb3QuYXBwZW5kQ2hpbGQodmlldyk7CiAgICB9CgogICAgZnVuY3Rpb24gcmluZ05vZGUocGN0LCBjb3VudCkgewogICAgICB2YXIgc2l6ZSA9IDEzMiwgc3Ryb2tlID0gMTIsIHIgPSAoc2l6ZSAtIHN0cm9rZSkgLyAyLCBjID0gMiAqIE1hdGguUEkgKiByOwogICAgICB2YXIgb2ZmID0gYyAqICgxIC0gcGN0KTsKICAgICAgdmFyIHN2Z05TID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJzsKICAgICAgdmFyIHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzdmdOUywgJ3N2ZycpOwogICAgICBzdmcuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgJzAgMCAnICsgc2l6ZSArICcgJyArIHNpemUpOwogICAgICBzdmcuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHNpemUpOyBzdmcuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBzaXplKTsKICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgICB2YXIgYmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoc3ZnTlMsICdjaXJjbGUnKTsKICAgICAgYmcuc2V0QXR0cmlidXRlKCdjeCcsIHNpemUgLyAyKTsgYmcuc2V0QXR0cmlidXRlKCdjeScsIHNpemUgLyAyKTsgYmcuc2V0QXR0cmlidXRlKCdyJywgcik7CiAgICAgIGJnLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7IGJnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgc3Ryb2tlKTsKICAgICAgYmcuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAndmFyKC0tdi1saW5lLCByZ2JhKDI0NSwyNDUsMjQ3LC4xNSkpJyk7CiAgICAgIHZhciBmZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzdmdOUywgJ2NpcmNsZScpOwogICAgICBmZy5zZXRBdHRyaWJ1dGUoJ2N4Jywgc2l6ZSAvIDIpOyBmZy5zZXRBdHRyaWJ1dGUoJ2N5Jywgc2l6ZSAvIDIpOyBmZy5zZXRBdHRyaWJ1dGUoJ3InLCByKTsKICAgICAgZmcuc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTsgZmcuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBzdHJva2UpOwogICAgICBmZy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknKTsKICAgICAgZmcuc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWNhcCcsICdyb3VuZCcpOwogICAgICBmZy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1kYXNoYXJyYXknLCBjKTsKICAgICAgZmcuc2V0QXR0cmlidXRlKCdzdHJva2UtZGFzaG9mZnNldCcsIGMpOwogICAgICBmZy5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTkwICcgKyAoc2l6ZSAvIDIpICsgJyAnICsgKHNpemUgLyAyKSArICcpJyk7CiAgICAgIHN2Zy5hcHBlbmRDaGlsZChiZyk7IHN2Zy5hcHBlbmRDaGlsZChmZyk7CiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7IGZnLnN0eWxlLnRyYW5zaXRpb24gPSAnc3Ryb2tlLWRhc2hvZmZzZXQgOTAwbXMgY3ViaWMtYmV6aWVyKC4yMiwxLC4zNiwxKSc7IGZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWRhc2hvZmZzZXQnLCBvZmYpOyB9KTsKICAgICAgdmFyIGxhYmVsID0gZWwoJ2RpdicsIHsKICAgICAgICBzdHlsZTogeyBwb3NpdGlvbjogJ2Fic29sdXRlJywgaW5zZXQ6ICcwJywgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyB9CiAgICAgIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tb25vJywgc3R5bGU6IHsgZm9udFNpemU6ICczNHB4JywgZm9udFdlaWdodDogJzcwMCcsIGxpbmVIZWlnaHQ6ICcxJyB9LCB0ZXh0OiBTdHJpbmcoY291bnQpIH0pLAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEzcHgnIH0sIHRleHQ6ICcvICcgKyBHT0FMIH0pKTsKICAgICAgcmV0dXJuIGVsKCdkaXYnLCB7IHN0eWxlOiB7IHBvc2l0aW9uOiAncmVsYXRpdmUnLCB3aWR0aDogc2l6ZSArICdweCcsIGhlaWdodDogc2l6ZSArICdweCcsIGZsZXg6ICcwIDAgYXV0bycgfSB9LCBzdmcsIGxhYmVsKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYWxlbmRhck5vZGUoY291bnQpIHsKICAgICAgdmFyIGdyaWQgPSBlbCgnZGl2JywgeyBjbGFzczogJ2dsYXNzLWNhcmQnLCBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICd2YXIoLS1zcGFjZS1zbSwgOXB4KScgfSB9KTsKICAgICAgZ3JpZC5hcHBlbmRDaGlsZChlbCgncCcsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnLCB0ZXh0OiAnUHJvZ3Jlc3MnIH0pKTsKICAgICAgdmFyIGRvdHMgPSBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZ3JpZCcsIGdyaWRUZW1wbGF0ZUNvbHVtbnM6ICdyZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMjJweCwgMWZyKSknLCBnYXA6ICc4cHgnIH0gfSk7CiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IEdPQUw7IGkrKykgewogICAgICAgIHZhciBkb25lID0gaSA8PSBjb3VudDsKICAgICAgICBkb3RzLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgewogICAgICAgICAgc3R5bGU6IHsKICAgICAgICAgICAgd2lkdGg6ICcyMnB4JywgaGVpZ2h0OiAnMjJweCcsIGJvcmRlclJhZGl1czogJzZweCcsCiAgICAgICAgICAgIGJhY2tncm91bmQ6IGRvbmUgPyAndmFyKC0tdmFtcC1hY2NlbnQsICM1Mjk3RjgpJyA6ICd2YXIoLS12LWNhcmQtYmcsIHJnYmEoMjU1LDI1NSwyNTUsLjA0KSknLAogICAgICAgICAgICBib3JkZXI6ICcxcHggc29saWQgJyArIChkb25lID8gJ3RyYW5zcGFyZW50JyA6ICd2YXIoLS12LWxpbmUsIHJnYmEoMjQ1LDI0NSwyNDcsLjE1KSknKQogICAgICAgICAgfSwKICAgICAgICAgIHRpdGxlOiAnRGF5ICcgKyBpLCAnYXJpYS1sYWJlbCc6ICdEYXkgJyArIGkgKyAoZG9uZSA/ICcgY29tcGxldGUnIDogJycpCiAgICAgICAgfSkpOwogICAgICB9CiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoZG90cyk7CiAgICAgIHJldHVybiBncmlkOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0YXRCb3godmFsdWUsIGxhYmVsKSB7CiAgICAgIHJldHVybiBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcycHgnIH0gfSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbW9ubycsIHN0eWxlOiB7IGZvbnRTaXplOiAnMjJweCcsIGZvbnRXZWlnaHQ6ICc3MDAnIH0sIHRleHQ6IFN0cmluZyh2YWx1ZSkgfSksCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW11dGVkJywgc3R5bGU6IHsgZm9udFNpemU6ICcxMnB4JyB9LCB0ZXh0OiBsYWJlbCB9KSk7CiAgICB9CgogICAgcmV0dXJuIHsgcmVuZGVyOiByZW5kZXIgfTsKICB9KSgpOwoKICBmdW5jdGlvbiBtYXliZUFwcGx5UXVlcnlSZWZlcnJhbChwYXJhbXMpIHsKICAgIHZhciBjb2RlID0gbnVsbDsKICAgIGlmIChwYXJhbXMgJiYgKHBhcmFtcy5yIHx8IHBhcmFtcy5yZWYpKSBjb2RlID0gcGFyYW1zLnIgfHwgcGFyYW1zLnJlZjsKICAgIGlmICghY29kZSkgewogICAgICB0cnkgewogICAgICAgIHZhciBzcCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7CiAgICAgICAgY29kZSA9IHNwLmdldCgncicpIHx8IHNwLmdldCgncmVmJyk7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9CiAgICBpZiAoIWNvZGUpIHJldHVybjsKICAgIGNvZGUgPSBTdHJpbmcoY29kZSkudHJpbSgpLnRvVXBwZXJDYXNlKCk7CiAgICBpZiAoIWNvZGUpIHJldHVybjsKICAgIGlmIChsc0dldCgncmVmZXJyYWxBcHBsaWVkJywgJycpID09PSBjb2RlKSByZXR1cm47CiAgICBsc1NldCgncmVmZXJyYWxDb2RlJywgY29kZSk7CiAgICBpZiAoVi5hcGkgJiYgdHlwZW9mIFYuYXBpLmF0dHJpYnV0ZVJlZmVycmFsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIFYuYXBpLmF0dHJpYnV0ZVJlZmVycmFsKGNvZGUpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIGxzU2V0KCdyZWZlcnJhbEFwcGxpZWQnLCBjb2RlKTsKICAgICAgICB0b2FzdCgnUmVmZXJyYWwgY29kZSBhcHBsaWVkOiAnICsgY29kZSwgJ3N1Y2Nlc3MnKTsKICAgICAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jb25mZXR0aSA9PT0gJ2Z1bmN0aW9uJykgeyB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgfQogIH0KCiAgVi5hcHBseVBlbmRpbmdSZWZlcnJhbCA9IG1heWJlQXBwbHlRdWVyeVJlZmVycmFsOwoKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvcGF5LmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLnZpZXdzID0gVi52aWV3cyB8fCB7fTsKICBWLnBheSA9IFYucGF5IHx8IHt9OwoKICB2YXIgUEFDS1MgPSBbCiAgICB7CiAgICAgIGlkOiAnY3JlZGl0c18xMDAwJywKICAgICAgY3JlZGl0czogMTAwMCwKICAgICAgcHJpY2U6IDkuOTksCiAgICAgIHByaWNlTGFiZWw6ICckOS45OScsCiAgICAgIGhlYWRsaW5lOiAnU3RhcnRlcicsCiAgICAgIGJsdXJiOiAnQSBzb2xpZCBydW4gb2YgZ2VuZXJhdGlvbnMgdG8gZ2V0IGdvaW5nLicsCiAgICAgIGFjY2VudFZhcjogJy0tdi1hY2NlbnQnCiAgICB9LAogICAgewogICAgICBpZDogJ2NyZWRpdHNfMjUwMCcsCiAgICAgIGNyZWRpdHM6IDI1MDAsCiAgICAgIHByaWNlOiAxOS45OSwKICAgICAgcHJpY2VMYWJlbDogJyQxOS45OScsCiAgICAgIGhlYWRsaW5lOiAnQ3JlYXRvcicsCiAgICAgIGJsdXJiOiAnT3VyIG1vc3QgcG9wdWxhciBwYWNrIOKAlCBiZXR0ZXIgdmFsdWUgcGVyIGNyZWRpdC4nLAogICAgICBwb3B1bGFyOiB0cnVlLAogICAgICBib251c0xhYmVsOiAnKzI1JSBjcmVkaXRzJywKICAgICAgYWNjZW50VmFyOiAnLS12YW1wLWFjY2VudCcKICAgIH0sCiAgICB7CiAgICAgIGlkOiAnY3JlZGl0c182MDAwJywKICAgICAgY3JlZGl0czogNjAwMCwKICAgICAgcHJpY2U6IDM5Ljk5LAogICAgICBwcmljZUxhYmVsOiAnJDM5Ljk5JywKICAgICAgaGVhZGxpbmU6ICdTdHVkaW8nLAogICAgICBibHVyYjogJ0Jlc3QgdmFsdWUuIEZvciBoZWF2eSwgYmF0Y2ggYW5kIHBybyB3b3JrZmxvd3MuJywKICAgICAgYm9udXNMYWJlbDogJys1MCUgY3JlZGl0cycsCiAgICAgIGFjY2VudFZhcjogJy0tdi1hY2NlbnQtZGVlcCcKICAgIH0KICBdOwoKICBQQUNLUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7CiAgICBwLnBlckNyZWRpdCA9IHAucHJpY2UgLyBwLmNyZWRpdHM7CiAgfSk7CiAgdmFyIEJFU1QgPSBQQUNLUy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHsKICAgIHJldHVybiBiLnBlckNyZWRpdCA8IGEucGVyQ3JlZGl0ID8gYiA6IGE7CiAgfSwgUEFDS1NbMF0pOwoKICBWLnBheS5wYWNrcyA9IFBBQ0tTOwoKICBWLnBheS5wYWNrID0gZnVuY3Rpb24gKHByb2R1Y3RJRCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBQQUNLUy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoUEFDS1NbaV0uaWQgPT09IHByb2R1Y3RJRCkgcmV0dXJuIFBBQ0tTW2ldOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfTsKCiAgZnVuY3Rpb24gZWwoKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5lbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICByZXR1cm4gVi51aS5lbC5hcHBseShWLnVpLCBhcmd1bWVudHMpOwogICAgfQogICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgdmFyIHRhZyA9IGFyZ3Muc2hpZnQoKTsKICAgIHZhciBhdHRycyA9IChhcmdzWzBdICYmIHR5cGVvZiBhcmdzWzBdID09PSAnb2JqZWN0JyAmJiAhKGFyZ3NbMF0gaW5zdGFuY2VvZiBOb2RlKSkgPyBhcmdzLnNoaWZ0KCkgOiB7fTsKICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgT2JqZWN0LmtleXMoYXR0cnMgfHwge30pLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgdmFyIHYgPSBhdHRyc1trXTsKICAgICAgaWYgKHYgPT0gbnVsbCB8fCB2ID09PSBmYWxzZSkgcmV0dXJuOwogICAgICBpZiAoayA9PT0gJ2NsYXNzJykgbm9kZS5jbGFzc05hbWUgPSB2OwogICAgICBlbHNlIGlmIChrID09PSAndGV4dCcpIG5vZGUudGV4dENvbnRlbnQgPSB2OwogICAgICBlbHNlIGlmIChrID09PSAnaHRtbCcpIG5vZGUuaW5uZXJIVE1MID0gdjsKICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdvbicpID09PSAwICYmIHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCB2KTsKICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdkYXRhLScpID09PSAwIHx8IGsuaW5kZXhPZignYXJpYS0nKSA9PT0gMCkgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdik7CiAgICAgIGVsc2Ugbm9kZVtrXSA9IHY7CiAgICB9KTsKICAgIGFyZ3MuZm9yRWFjaChmdW5jdGlvbiAoYykgewogICAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlKSByZXR1cm47CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoYy5ub2RlVHlwZSA/IGMgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICAgIH0pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiBpY29uKG5hbWUpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmljb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIG91dCA9IFYudWkuaWNvbihuYW1lKTsKICAgICAgaWYgKHR5cGVvZiBvdXQgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgc3Bhbi5jbGFzc05hbWUgPSAndi1pY28nOwogICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgICAgc3Bhbi5pbm5lckhUTUwgPSBvdXQ7CiAgICAgICAgcmV0dXJuIHNwYW47CiAgICAgIH0KICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7CiAgfQoKICBmdW5jdGlvbiB0b2FzdChtc2csIGtpbmQpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnRvYXN0ID09PSAnZnVuY3Rpb24nKSBWLnVpLnRvYXN0KG1zZywga2luZCB8fCAnaW5mbycpOwogICAgZWxzZSBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5lbWl0ID09PSAnZnVuY3Rpb24nKSBWLnN0b3JlLmVtaXQoJ3RvYXN0JywgeyBtZXNzYWdlOiBtc2csIGtpbmQ6IGtpbmQgfHwgJ2luZm8nIH0pOwogIH0KCiAgZnVuY3Rpb24gY29uZmV0dGkoKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jb25mZXR0aSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICBpZiAoVi5yb3V0ZXIgJiYgdHlwZW9mIFYucm91dGVyLmdvID09PSAnZnVuY3Rpb24nKSBWLnJvdXRlci5nbyhoYXNoKTsKICAgIGVsc2Ugd2luZG93LmxvY2F0aW9uLmhhc2ggPSBoYXNoOwogIH0KCiAgZnVuY3Rpb24gYmFsYW5jZSgpIHsKICAgIHZhciBjID0gKFYuc3RhdGUgJiYgVi5zdGF0ZS5jcmVkaXRzKTsKICAgIGMgPSAodHlwZW9mIGMgPT09ICdudW1iZXInICYmIGlzRmluaXRlKGMpKSA/IGMgOiAoVi5zdG9yZSAmJiBWLnN0b3JlLmdldCA/IFYuc3RvcmUuZ2V0KCdjcmVkaXRzJykgOiAwKTsKICAgIHJldHVybiAodHlwZW9mIGMgPT09ICdudW1iZXInICYmIGlzRmluaXRlKGMpKSA/IGMgOiAwOwogIH0KCiAgZnVuY3Rpb24gaXNBdXRoZWQoKSB7CiAgICByZXR1cm4gISEoVi5hdXRoICYmIHR5cGVvZiBWLmF1dGguaXNBdXRoZWQgPT09ICdmdW5jdGlvbicgJiYgVi5hdXRoLmlzQXV0aGVkKCkpOwogIH0KCiAgZnVuY3Rpb24gZm10SW50KG4pIHsKICAgIHRyeSB7IHJldHVybiBOdW1iZXIobikudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFN0cmluZyhuKTsgfQogIH0KCiAgVi5wYXkucmVmcmVzaENyZWRpdHMgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIWlzQXV0aGVkKCkgfHwgIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS5jcmVkaXRzICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYmFsYW5jZSgpKTsKICAgIH0KICAgIHJldHVybiBWLmFwaS5jcmVkaXRzKCkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgIHZhciBuID0gcmVzICYmIHR5cGVvZiByZXMuY3JlZGl0cyAhPT0gJ3VuZGVmaW5lZCcgPyBwYXJzZUludChyZXMuY3JlZGl0cywgMTApIDogTmFOOwogICAgICBpZiAoIWlzRmluaXRlKG4pKSBuID0gYmFsYW5jZSgpOwogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5zZXQgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuc2V0KCdjcmVkaXRzJywgbik7CiAgICAgIGVsc2UgaWYgKFYuc3RhdGUpIFYuc3RhdGUuY3JlZGl0cyA9IG47CiAgICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLmVtaXQgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgbik7CiAgICAgIHJldHVybiBuOwogICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gYmFsYW5jZSgpOwogICAgfSk7CiAgfTsKCiAgVi5wYXkucmVxdWlyZUNyZWRpdHMgPSBmdW5jdGlvbiAoY29zdCkgewogICAgdmFyIG5lZWQgPSBwYXJzZUludChjb3N0LCAxMCk7CiAgICBpZiAoIWlzRmluaXRlKG5lZWQpIHx8IG5lZWQgPD0gMCkgcmV0dXJuIHRydWU7CiAgICB2YXIgaGF2ZSA9IGJhbGFuY2UoKTsKICAgIGlmIChoYXZlID49IG5lZWQpIHJldHVybiB0cnVlOwogICAgdmFyIHNob3J0ID0gbmVlZCAtIGhhdmU7CiAgICB0b2FzdCgKICAgICAgaGF2ZSA8PSAwCiAgICAgICAgPyAiWW91J3JlIG91dCBvZiBjcmVkaXRzIOKAlCBhZGQgbW9yZSB0byBrZWVwIGNyZWF0aW5nLiIKICAgICAgICA6ICdOb3QgZW5vdWdoIGNyZWRpdHMg4oCUIHlvdSBuZWVkICcgKyBmbXRJbnQoc2hvcnQpICsgJyBtb3JlLicsCiAgICAgICd3YXJuaW5nJwogICAgKTsKICAgIFYucGF5Lm9wZW4oeyBuZWVkOiBuZWVkLCBjb3N0OiBuZWVkIH0pOwogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIFYucGF5Lm9wZW4gPSBmdW5jdGlvbiAob3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgbmVlZCA9IHBhcnNlSW50KG9wdHMubmVlZCAhPSBudWxsID8gb3B0cy5uZWVkIDogb3B0cy5jb3N0LCAxMCk7CiAgICB2YXIgcSA9ICcnOwogICAgaWYgKGlzRmluaXRlKG5lZWQpICYmIG5lZWQgPiAwKSBxID0gJz9uZWVkPScgKyBuZWVkOwogICAgZ28oJyMvcGF5d2FsbCcgKyBxKTsKICB9OwoKICBWLnBheS5idXkgPSBmdW5jdGlvbiAocHJvZHVjdElELCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBwYWNrID0gVi5wYXkucGFjayhwcm9kdWN0SUQpOwogICAgaWYgKCFwYWNrKSB7CiAgICAgIHRvYXN0KCdUaGF0IHBhY2sgaXMgdW5hdmFpbGFibGUgcmlnaHQgbm93LicsICdlcnJvcicpOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsKICAgIH0KICAgIGlmICghaXNBdXRoZWQoKSkgewogICAgICB0b2FzdCgnU2lnbiBpbiB0byBhZGQgY3JlZGl0cy4nLCAnaW5mbycpOwogICAgICBnbygnIy9hdXRoP25leHQ9JyArIGVuY29kZVVSSUNvbXBvbmVudCgnIy9wYXl3YWxsJykpOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsKICAgIH0KICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLmNoZWNrb3V0ICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRvYXN0KCdDaGVja291dCBpc27igJl0IGF2YWlsYWJsZSB5ZXQuIFBsZWFzZSB0cnkgYWdhaW4gc29vbi4nLCAnZXJyb3InKTsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7CiAgICB9CgogICAgdmFyIGJ0biA9IG9wdHMuYnV0dG9uIHx8IG51bGw7CiAgICB2YXIgcmVzdG9yZSA9IGxvY2tCdXR0b24oYnRuLCAnUmVkaXJlY3RpbmfigKYnKTsKCiAgICByZXR1cm4gVi5hcGkuY2hlY2tvdXQocHJvZHVjdElEKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgdmFyIHVybCA9IHJlcyAmJiByZXMudXJsOwogICAgICBpZiAoIXVybCB8fCB0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykgewogICAgICAgIHRocm93IG5ldyBFcnJvcignbm8tdXJsJyk7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCd2YW1wX3BheV9wZW5kaW5nJywgSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgcHJvZHVjdElEOiBwcm9kdWN0SUQsIGNyZWRpdHM6IHBhY2suY3JlZGl0cywgYXQ6IERhdGUubm93KCkKICAgICAgICB9KSk7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgIHRvYXN0KCdPcGVuaW5nIHNlY3VyZSBjaGVja291dOKApicsICdpbmZvJyk7CiAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odXJsKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIHJlc3RvcmUoKTsKICAgICAgdmFyIHN0YXR1cyA9IGVyciAmJiAoZXJyLnN0YXR1cyB8fCBlcnIuY29kZSk7CiAgICAgIGlmIChzdGF0dXMgPT09IDQwNCB8fCBzdGF0dXMgPT09IDQwNSB8fCBzdGF0dXMgPT09IDUwMSB8fCBzdGF0dXMgPT09IDUwMykgewogICAgICAgIHRvYXN0KCdDcmVkaXQgcHVyY2hhc2VzIGFyZSBsYXVuY2hpbmcgc29vbiDigJQgY2hlY2tvdXQgaXNu4oCZdCBsaXZlIHlldC4nLCAnd2FybmluZycpOwogICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7CiAgICAgICAgdG9hc3QoJ1lvdXIgc2Vzc2lvbiBleHBpcmVkLiBQbGVhc2Ugc2lnbiBpbiBhZ2Fpbi4nLCAnZXJyb3InKTsKICAgICAgICBnbygnIy9hdXRoP25leHQ9JyArIGVuY29kZVVSSUNvbXBvbmVudCgnIy9wYXl3YWxsJykpOwogICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDI5KSB7CiAgICAgICAgdG9hc3QoJ1RvbyBtYW55IGF0dGVtcHRzIOKAlCBnaXZlIGl0IGEgbW9tZW50IGFuZCByZXRyeS4nLCAnd2FybmluZycpOwogICAgICB9IGVsc2UgewogICAgICAgIHRvYXN0KCdDb3VsZG7igJl0IHN0YXJ0IGNoZWNrb3V0LiBQbGVhc2UgdHJ5IGFnYWluLicsICdlcnJvcicpOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwogIH07CgogIGZ1bmN0aW9uIGxvY2tCdXR0b24oYnRuLCBsYWJlbCkgewogICAgaWYgKCFidG4pIHJldHVybiBmdW5jdGlvbiAoKSB7fTsKICAgIHZhciBwcmV2SHRtbCA9IGJ0bi5pbm5lckhUTUw7CiAgICB2YXIgcHJldkRpc2FibGVkID0gYnRuLmRpc2FibGVkOwogICAgYnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtYnVzeScsICd0cnVlJyk7CiAgICBidG4uY2xhc3NMaXN0LmFkZCgnaXMtbG9hZGluZycpOwogICAgdmFyIHNwID0gKFYudWkgJiYgdHlwZW9mIFYudWkuc3Bpbm5lciA9PT0gJ2Z1bmN0aW9uJykgPyBWLnVpLnNwaW5uZXIoKSA6IG51bGw7CiAgICBidG4uaW5uZXJIVE1MID0gJyc7CiAgICBpZiAoc3ApIGJ0bi5hcHBlbmRDaGlsZChzcC5ub2RlVHlwZSA/IHNwIDogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpKTsKICAgIGJ0bi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnICcgKyAobGFiZWwgfHwgJ1dvcmtpbmfigKYnKSkpOwogICAgcmV0dXJuIGZ1bmN0aW9uIHJlc3RvcmUoKSB7CiAgICAgIGJ0bi5kaXNhYmxlZCA9IHByZXZEaXNhYmxlZDsKICAgICAgYnRuLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1idXN5Jyk7CiAgICAgIGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1sb2FkaW5nJyk7CiAgICAgIGJ0bi5pbm5lckhUTUwgPSBwcmV2SHRtbDsKICAgIH07CiAgfQoKICBWLnBheS5oYW5kbGVQdXJjaGFzZVJldHVybiA9IGZ1bmN0aW9uIChwYXJhbXMpIHsKICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTsKICAgIHZhciBzdGF0dXMgPSBwYXJhbXMucHVyY2hhc2UgfHwgcGFyYW1zLmNoZWNrb3V0OwoKICAgIGlmIChzdGF0dXMgPT09ICdjYW5jZWwnIHx8IHN0YXR1cyA9PT0gJ2NhbmNlbGxlZCcgfHwgc3RhdHVzID09PSAnY2FuY2VsZWQnKSB7CiAgICAgIGNsZWFyUGVuZGluZygpOwogICAgICB0b2FzdCgnQ2hlY2tvdXQgY2FuY2VsZWQg4oCUIG5vIGNoYXJnZSB3YXMgbWFkZS4nLCAnaW5mbycpOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJhbGFuY2UoKSk7CiAgICB9CiAgICBpZiAoc3RhdHVzICE9PSAnc3VjY2VzcycpIHJldHVybiBQcm9taXNlLnJlc29sdmUoYmFsYW5jZSgpKTsKCiAgICB2YXIgcGVuZGluZyA9IHJlYWRQZW5kaW5nKCk7CiAgICBjbGVhclBlbmRpbmcoKTsKICAgIHZhciBiZWZvcmUgPSBiYWxhbmNlKCk7CgogICAgcmV0dXJuIHBvbGxDcmVkaXRzVW50aWxDaGFuZ2VkKGJlZm9yZSwgcGVuZGluZyA/IHBlbmRpbmcuY3JlZGl0cyA6IDApLnRoZW4oZnVuY3Rpb24gKGFmdGVyKSB7CiAgICAgIHZhciBnYWluZWQgPSAodHlwZW9mIGFmdGVyID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYmVmb3JlID09PSAnbnVtYmVyJykgPyAoYWZ0ZXIgLSBiZWZvcmUpIDogMDsKICAgICAgY29uZmV0dGkoKTsKICAgICAgaWYgKGdhaW5lZCA+IDApIHsKICAgICAgICB0b2FzdCgnUGF5bWVudCBjb21wbGV0ZSDigJQgJyArIGZtdEludChnYWluZWQpICsgJyBjcmVkaXRzIGFkZGVkLicsICdzdWNjZXNzJyk7CiAgICAgIH0gZWxzZSBpZiAocGVuZGluZyAmJiBwZW5kaW5nLmNyZWRpdHMpIHsKICAgICAgICB0b2FzdCgnUGF5bWVudCByZWNlaXZlZCDigJQgJyArIGZtdEludChwZW5kaW5nLmNyZWRpdHMpICsgJyBjcmVkaXRzIGFyZSBvbiB0aGUgd2F5LicsICdzdWNjZXNzJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9hc3QoJ1BheW1lbnQgY29tcGxldGUg4oCUIGNyZWRpdHMgYWRkZWQuJywgJ3N1Y2Nlc3MnKTsKICAgICAgfQogICAgICByZXR1cm4gYWZ0ZXI7CiAgICB9KTsKICB9OwoKICBmdW5jdGlvbiBwb2xsQ3JlZGl0c1VudGlsQ2hhbmdlZChiZWZvcmUsIGV4cGVjdGVkR2FpbikgewogICAgdmFyIGF0dGVtcHRzID0gMDsKICAgIHZhciBtYXggPSA2OwogICAgZnVuY3Rpb24gdGljaygpIHsKICAgICAgcmV0dXJuIFYucGF5LnJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgewogICAgICAgIGF0dGVtcHRzKys7CiAgICAgICAgdmFyIGNoYW5nZWQgPSAodHlwZW9mIG4gPT09ICdudW1iZXInICYmIG4gPiBiZWZvcmUpOwogICAgICAgIGlmIChjaGFuZ2VkIHx8IGF0dGVtcHRzID49IG1heCkgcmV0dXJuIG47CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmVzb2x2ZSh0aWNrKCkpOyB9LCAxNTAwKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gdGljaygpOwogIH0KCiAgZnVuY3Rpb24gcmVhZFBlbmRpbmcoKSB7CiAgICB0cnkgewogICAgICB2YXIgcmF3ID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgndmFtcF9wYXlfcGVuZGluZycpOwogICAgICByZXR1cm4gcmF3ID8gSlNPTi5wYXJzZShyYXcpIDogbnVsbDsKICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGw7IH0KICB9CiAgZnVuY3Rpb24gY2xlYXJQZW5kaW5nKCkgewogICAgdHJ5IHsgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgndmFtcF9wYXlfcGVuZGluZycpOyB9IGNhdGNoIChlKSB7fQogIH0KCiAgdmFyIHZpZXcgPSB7fTsKICB2YXIgX2NsZWFudXAgPSBbXTsKICB2YXIgX2hvc3RFbCA9IG51bGw7CgogIGZ1bmN0aW9uIG9uKHRhcmdldCwgZXZ0LCBmbiwgb3B0cykgewogICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCBmbiwgb3B0cyk7CiAgICBfY2xlYW51cC5wdXNoKGZ1bmN0aW9uICgpIHsgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0LCBmbiwgb3B0cyk7IH0pOwogIH0KCiAgdmlldy5yZW5kZXIgPSBmdW5jdGlvbiAocm9vdCwgcGFyYW1zKSB7CiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307CiAgICB0ZWFyZG93bkludGVybmFsKCk7CiAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgcm9vdC5jbGFzc0xpc3QuYWRkKCd2LXBheXdhbGwtaG9zdCcpOwogICAgX2hvc3RFbCA9IHJvb3Q7CgogICAgdmFyIG5lZWQgPSBwYXJzZUludChwYXJhbXMubmVlZCwgMTApOwogICAgdmFyIGhhc05lZWQgPSBpc0Zpbml0ZShuZWVkKSAmJiBuZWVkID4gMDsKICAgIHZhciBoYXZlID0gYmFsYW5jZSgpOwogICAgdmFyIHNob3J0ZmFsbCA9IGhhc05lZWQgPyBNYXRoLm1heCgwLCBuZWVkIC0gaGF2ZSkgOiAwOwoKICAgIHJvb3QuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2JhY2tkcm9wJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0pKTsKCiAgICB2YXIgcGFnZSA9IGVsKCdzZWN0aW9uJywgeyBjbGFzczogJ3YtcGF5d2FsbCcsICdhcmlhLWxhYmVsJzogJ0FkZCBjcmVkaXRzJyB9KTsKCiAgICB2YXIgaGVhZGVyID0gZWwoJ2hlYWRlcicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2hlYWQnIH0pOwogICAgaGVhZGVyLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1leWVicm93JyB9LCAnQ3JlZGl0cycpKTsKICAgIGhlYWRlci5hcHBlbmRDaGlsZChlbCgnaDEnLCB7IGNsYXNzOiAndi1wYXl3YWxsX190aXRsZSB2LWdyYWRpZW50JyB9LCAnUG93ZXIgeW91ciBpbWFnaW5hdGlvbicpKTsKCiAgICB2YXIgc3ViID0gaGFzTmVlZAogICAgICA/IChzaG9ydGZhbGwgPiAwCiAgICAgICAgICA/ICdUaGlzIGdlbmVyYXRpb24gbmVlZHMgJyArIGZtdEludChuZWVkKSArICcgY3JlZGl0cyDigJQgeW91IGhhdmUgJyArIGZtdEludChoYXZlKSArICcuIEFkZCAnICsgZm10SW50KHNob3J0ZmFsbCkgKyAnIG9yIG1vcmUgdG8gY29udGludWUuJwogICAgICAgICAgOiAiWW91J3JlIHNldCDigJQgYnV0IGhlcmUncyBtb3JlIGlmIHlvdSB3YW50IGEgYmlnZ2VyIHJ1bi4iKQogICAgICA6ICdCdXkgY3JlZGl0cyBvbmNlLCB1c2UgdGhlbSBhbnl0aW1lLiBFdmVyeSBnZW5lcmF0aW9uIHNwZW5kcyBjcmVkaXRzIGJhc2VkIG9uIHRoZSBtb2RlbCBhbmQgaW1hZ2UgY291bnQuJzsKICAgIGhlYWRlci5hcHBlbmRDaGlsZChlbCgncCcsIHsgY2xhc3M6ICd2LXBheXdhbGxfX3N1YicgfSwgc3ViKSk7CgogICAgdmFyIGJhbFJvdyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19iYWxhbmNlJyB9KTsKICAgIHZhciBwaWxsID0gKFYudWkgJiYgdHlwZW9mIFYudWkuY3JlZGl0c1BpbGwgPT09ICdmdW5jdGlvbicpID8gVi51aS5jcmVkaXRzUGlsbChoYXZlKSA6IGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3JlZGl0cycgfSwgZm10SW50KGhhdmUpICsgJyBjcmVkaXRzJyk7CiAgICBiYWxSb3cuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1wYXl3YWxsX19iYWxhbmNlLWxhYmVsJyB9LCAnQ3VycmVudCBiYWxhbmNlJykpOwogICAgYmFsUm93LmFwcGVuZENoaWxkKHBpbGwpOwogICAgaGVhZGVyLmFwcGVuZENoaWxkKGJhbFJvdyk7CgogICAgcGFnZS5hcHBlbmRDaGlsZChoZWFkZXIpOwoKICAgIHZhciBncmlkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWdyaWQgdi1ncmlkLS0zIHYtcGF5d2FsbF9fZ3JpZCcgfSk7CiAgICBQQUNLUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7CiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQocGFja0NhcmQocCwgeyByZWNvbW1lbmRTaG9ydGZhbGw6IHNob3J0ZmFsbCB9KSk7CiAgICB9KTsKICAgIHBhZ2UuYXBwZW5kQ2hpbGQoZ3JpZCk7CgogICAgdmFyIGZpbmUgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcGF5d2FsbF9fZmluZSBnbGFzcy1jYXJkJyB9KTsKICAgIFsKICAgICAgeyBpYzogJ3NwYXJrbGVzJywgdDogJ0NyZWRpdHMgbmV2ZXIgZXhwaXJlJywgZDogJ1VzZSB0aGVtIHdoZW5ldmVyIGluc3BpcmF0aW9uIHN0cmlrZXMuJyB9LAogICAgICB7IGljOiAnbG9jaycsIHQ6ICdTZWN1cmUgY2hlY2tvdXQnLCBkOiAnUGF5bWVudHMgaGFuZGxlZCBieSBTdHJpcGUuIFdlIG5ldmVyIHNlZSB5b3VyIGNhcmQuJyB9LAogICAgICB7IGljOiAnYm9sdCcsIHQ6ICdJbnN0YW50IHRvcC11cCcsIGQ6ICdDcmVkaXRzIGxhbmQgb24geW91ciBhY2NvdW50IG1vbWVudHMgYWZ0ZXIgcGF5bWVudC4nIH0KICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZikgewogICAgICB2YXIgaXRlbSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19maW5lLWl0ZW0nIH0pOwogICAgICBpdGVtLmFwcGVuZENoaWxkKGljb24oZi5pYykpOwogICAgICB2YXIgdHh0ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2ZpbmUtdGV4dCcgfSk7CiAgICAgIHR4dC5hcHBlbmRDaGlsZChlbCgnc3Ryb25nJywge30sIGYudCkpOwogICAgICB0eHQuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7fSwgZi5kKSk7CiAgICAgIGl0ZW0uYXBwZW5kQ2hpbGQodHh0KTsKICAgICAgZmluZS5hcHBlbmRDaGlsZChpdGVtKTsKICAgIH0pOwogICAgcGFnZS5hcHBlbmRDaGlsZChmaW5lKTsKCiAgICB2YXIgZm9vdGVyID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2Zvb3QnIH0pOwogICAgdmFyIGJhY2sgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCcsIHR5cGU6ICdidXR0b24nIH0sICdNYXliZSBsYXRlcicpOwogICAgb24oYmFjaywgJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICBpZiAod2luZG93Lmhpc3RvcnkubGVuZ3RoID4gMSkgd2luZG93Lmhpc3RvcnkuYmFjaygpOwogICAgICBlbHNlIGdvKCcjL2NyZWF0ZScpOwogICAgfSk7CiAgICBmb290ZXIuYXBwZW5kQ2hpbGQoYmFjayk7CgogICAgdmFyIHJlc3RvcmVOb3RlID0gZWwoJ3AnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19ub3RlJyB9KTsKICAgIHJlc3RvcmVOb3RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdBbHJlYWR5IHBhaWQgYnV0IGRvbuKAmXQgc2VlIHlvdXIgY3JlZGl0cz8gJykpOwogICAgdmFyIHJlZnJlc2hCdG4gPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWxpbmsnLCAnZGF0YS1yZWZyZXNoJzogJ3RydWUnIH0sICdSZWZyZXNoIGJhbGFuY2UnKTsKICAgIHJlc3RvcmVOb3RlLmFwcGVuZENoaWxkKHJlZnJlc2hCdG4pOwogICAgZm9vdGVyLmFwcGVuZENoaWxkKHJlc3RvcmVOb3RlKTsKICAgIHBhZ2UuYXBwZW5kQ2hpbGQoZm9vdGVyKTsKCiAgICBpZiAocmVmcmVzaEJ0bikgewogICAgICBvbihyZWZyZXNoQnRuLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmVmcmVzaEJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgcmVmcmVzaEJ0bi50ZXh0Q29udGVudCA9ICdSZWZyZXNoaW5n4oCmJzsKICAgICAgICBWLnBheS5yZWZyZXNoQ3JlZGl0cygpLnRoZW4oZnVuY3Rpb24gKG4pIHsKICAgICAgICAgIHJlZnJlc2hCdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgIHJlZnJlc2hCdG4udGV4dENvbnRlbnQgPSAnUmVmcmVzaCBiYWxhbmNlJzsKICAgICAgICAgIHVwZGF0ZUJhbGFuY2VQaWxsKHBhZ2UsIG4pOwogICAgICAgICAgdG9hc3QoJ0JhbGFuY2UgdXBkYXRlZDogJyArIGZtdEludChuKSArICcgY3JlZGl0cy4nLCAnaW5mbycpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KCiAgICByb290LmFwcGVuZENoaWxkKHBhZ2UpOwoKICAgIHZhciBvbkNyZWRpdHMgPSBmdW5jdGlvbiAobikgeyB1cGRhdGVCYWxhbmNlUGlsbChwYWdlLCB0eXBlb2YgbiA9PT0gJ251bWJlcicgPyBuIDogYmFsYW5jZSgpKTsgfTsKICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLm9uID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIFYuc3RvcmUub24oJ2NyZWRpdHM6Y2hhbmdlZCcsIG9uQ3JlZGl0cyk7CiAgICAgIF9jbGVhbnVwLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgIGlmICh0eXBlb2YgVi5zdG9yZS5vZmYgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUub2ZmKCdjcmVkaXRzOmNoYW5nZWQnLCBvbkNyZWRpdHMpOwogICAgICB9KTsKICAgIH0KCiAgICBWLnBheS5yZWZyZXNoQ3JlZGl0cygpLnRoZW4oZnVuY3Rpb24gKG4pIHsgdXBkYXRlQmFsYW5jZVBpbGwocGFnZSwgbik7IH0pOwoKICAgIHZhciBwcmltYXJ5Q3RhID0gcGFnZS5xdWVyeVNlbGVjdG9yKCcudi1jYXJkLS1wb3B1bGFyIC52LWN0YS0tcHJpbWFyeScpIHx8IHBhZ2UucXVlcnlTZWxlY3RvcignLnYtY3RhLS1wcmltYXJ5Jyk7CiAgICBpZiAocHJpbWFyeUN0YSkgewogICAgICB0cnkgeyBwcmltYXJ5Q3RhLmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsgfSBjYXRjaCAoZSkgeyBwcmltYXJ5Q3RhLmZvY3VzKCk7IH0KICAgIH0KICB9OwoKICBmdW5jdGlvbiB1cGRhdGVCYWxhbmNlUGlsbChwYWdlLCBuKSB7CiAgICBpZiAoIXBhZ2UpIHJldHVybjsKICAgIHZhciBob2xkZXIgPSBwYWdlLnF1ZXJ5U2VsZWN0b3IoJy52LXBheXdhbGxfX2JhbGFuY2UnKTsKICAgIGlmICghaG9sZGVyKSByZXR1cm47CiAgICB2YXIgZnJlc2ggPSAoVi51aSAmJiB0eXBlb2YgVi51aS5jcmVkaXRzUGlsbCA9PT0gJ2Z1bmN0aW9uJykgPyBWLnVpLmNyZWRpdHNQaWxsKG4pIDogZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVkaXRzJyB9LCBmbXRJbnQobikgKyAnIGNyZWRpdHMnKTsKICAgIHZhciBvbGQgPSBob2xkZXIucXVlcnlTZWxlY3RvcignLnYtY3JlZGl0cywgW2RhdGEtY3JlZGl0cy1waWxsXScpOwogICAgaWYgKG9sZCkgaG9sZGVyLnJlcGxhY2VDaGlsZChmcmVzaCwgb2xkKTsKICAgIGVsc2UgaG9sZGVyLmFwcGVuZENoaWxkKGZyZXNoKTsKICB9CgogIGZ1bmN0aW9uIHBhY2tDYXJkKHAsIGN0eCkgewogICAgY3R4ID0gY3R4IHx8IHt9OwogICAgdmFyIGNsYXNzZXMgPSAndi1jYXJkIGdsYXNzLWNhcmQgdi1wYXl3YWxsX19wYWNrJzsKICAgIGlmIChwLnBvcHVsYXIpIGNsYXNzZXMgKz0gJyB2LWNhcmQtLXBvcHVsYXInOwogICAgaWYgKHAuaWQgPT09IEJFU1QuaWQpIGNsYXNzZXMgKz0gJyB2LWNhcmQtLWJlc3QnOwoKICAgIHZhciBjYXJkID0gZWwoJ2FydGljbGUnLCB7CiAgICAgIGNsYXNzOiBjbGFzc2VzLAogICAgICAnZGF0YS1wcm9kdWN0JzogcC5pZCwKICAgICAgc3R5bGU6ICctLXBhY2stYWNjZW50OiB2YXIoJyArIHAuYWNjZW50VmFyICsgJyknCiAgICB9KTsKCiAgICBpZiAocC5wb3B1bGFyKSB7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1wYXl3YWxsX19iYWRnZSB2LXBheXdhbGxfX2JhZGdlLS1wb3B1bGFyJyB9LCAnTW9zdCBwb3B1bGFyJykpOwogICAgfSBlbHNlIGlmIChwLmlkID09PSBCRVNULmlkKSB7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1wYXl3YWxsX19iYWRnZSB2LXBheXdhbGxfX2JhZGdlLS1iZXN0JyB9LCAnQmVzdCB2YWx1ZScpKTsKICAgIH0KCiAgICB2YXIgaGVhZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19wYWNrLWhlYWQnIH0pOwogICAgaGVhZC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtZXllYnJvdycgfSwgcC5oZWFkbGluZSkpOwogICAgdmFyIGNyZWRpdHNCaWcgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcGF5d2FsbF9fY3JlZGl0cycgfSk7CiAgICBjcmVkaXRzQmlnLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtcGF5d2FsbF9fY3JlZGl0cy1udW0nIH0sIGZtdEludChwLmNyZWRpdHMpKSk7CiAgICBjcmVkaXRzQmlnLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtcGF5d2FsbF9fY3JlZGl0cy11bml0JyB9LCAnY3JlZGl0cycpKTsKICAgIGhlYWQuYXBwZW5kQ2hpbGQoY3JlZGl0c0JpZyk7CiAgICBpZiAocC5ib251c0xhYmVsKSBoZWFkLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtcGF5d2FsbF9fYm9udXMnIH0sIHAuYm9udXNMYWJlbCkpOwogICAgY2FyZC5hcHBlbmRDaGlsZChoZWFkKTsKCiAgICB2YXIgcHJpY2VSb3cgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcGF5d2FsbF9fcHJpY2UnIH0pOwogICAgcHJpY2VSb3cuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1wYXl3YWxsX19wcmljZS1hbXQnIH0sIHAucHJpY2VMYWJlbCkpOwogICAgdmFyIHBlciA9IChwLnByaWNlIC8gcC5jcmVkaXRzICogMTAwMCk7CiAgICBwcmljZVJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX3ByaWNlLXBlcicgfSwgJyQnICsgcGVyLnRvRml4ZWQoMikgKyAnIC8gMSwwMDAnKSk7CiAgICBjYXJkLmFwcGVuZENoaWxkKHByaWNlUm93KTsKCiAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtcGF5d2FsbF9fcGFjay1ibHVyYicgfSwgcC5ibHVyYikpOwoKICAgIHZhciBhcHByb3ggPSBNYXRoLmZsb29yKHAuY3JlZGl0cyAvIDEwKTsKICAgIHZhciBmZWF0ID0gZWwoJ3VsJywgeyBjbGFzczogJ3YtcGF5d2FsbF9fZmVhdHMnIH0pOwogICAgWwogICAgICAnficgKyBmbXRJbnQoYXBwcm94KSArICcgU3RhbmRhcmQgZ2VuZXJhdGlvbnMnLAogICAgICAnV29ya3Mgd2l0aCBldmVyeSBtb2RlbCcsCiAgICAgICdDcmVkaXRzIG5ldmVyIGV4cGlyZScKICAgIF0uZm9yRWFjaChmdW5jdGlvbiAobGluZSkgewogICAgICB2YXIgbGkgPSBlbCgnbGknLCB7fSk7CiAgICAgIGxpLmFwcGVuZENoaWxkKGljb24oJ2NoZWNrJykpOwogICAgICBsaS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHt9LCBsaW5lKSk7CiAgICAgIGZlYXQuYXBwZW5kQ2hpbGQobGkpOwogICAgfSk7CiAgICBjYXJkLmFwcGVuZENoaWxkKGZlYXQpOwoKICAgIHZhciBidXlDbGFzcyA9IHAucG9wdWxhciA/ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tYmxvY2snIDogJ3YtY3RhIHYtY3RhLS1naG9zdCB2LWN0YS0tYmxvY2snOwogICAgdmFyIGJ1eSA9IGVsKCdidXR0b24nLCB7CiAgICAgIGNsYXNzOiBidXlDbGFzcywKICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICdhcmlhLWxhYmVsJzogJ0J1eSAnICsgZm10SW50KHAuY3JlZGl0cykgKyAnIGNyZWRpdHMgZm9yICcgKyBwLnByaWNlTGFiZWwKICAgIH0sICdHZXQgJyArIGZtdEludChwLmNyZWRpdHMpICsgJyBjcmVkaXRzJyk7CiAgICBvbihidXksICdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGJ1eS5kaXNhYmxlZCkgcmV0dXJuOwogICAgICBWLnBheS5idXkocC5pZCwgeyBidXR0b246IGJ1eSB9KTsKICAgIH0pOwogICAgY2FyZC5hcHBlbmRDaGlsZChidXkpOwoKICAgIGlmIChjdHgucmVjb21tZW5kU2hvcnRmYWxsICYmIHAuY3JlZGl0cyA+PSBjdHgucmVjb21tZW5kU2hvcnRmYWxsICYmICFwLnBvcHVsYXIpIHsKICAgICAgdmFyIGhpbnQgPSBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2NvdmVyJyB9LCAnQ292ZXJzIHdoYXQgeW91IG5lZWQnKTsKICAgICAgdmFyIHNtYWxsZXIgPSBQQUNLUy5maWx0ZXIoZnVuY3Rpb24gKHEpIHsgcmV0dXJuIHEuY3JlZGl0cyA+PSBjdHgucmVjb21tZW5kU2hvcnRmYWxsOyB9KTsKICAgICAgaWYgKHNtYWxsZXIubGVuZ3RoICYmIHNtYWxsZXJbMF0uaWQgPT09IHAuaWQpIGNhcmQuYXBwZW5kQ2hpbGQoaGludCk7CiAgICB9CgogICAgcmV0dXJuIGNhcmQ7CiAgfQoKICBmdW5jdGlvbiB0ZWFyZG93bkludGVybmFsKCkgewogICAgd2hpbGUgKF9jbGVhbnVwLmxlbmd0aCkgewogICAgICB2YXIgZm4gPSBfY2xlYW51cC5wb3AoKTsKICAgICAgdHJ5IHsgZm4oKTsgfSBjYXRjaCAoZSkge30KICAgIH0KICAgIGlmIChfaG9zdEVsKSB7CiAgICAgIF9ob3N0RWwuY2xhc3NMaXN0LnJlbW92ZSgndi1wYXl3YWxsLWhvc3QnKTsKICAgICAgX2hvc3RFbCA9IG51bGw7CiAgICB9CiAgfQoKICB2aWV3LnRlYXJkb3duID0gZnVuY3Rpb24gKCkgeyB0ZWFyZG93bkludGVybmFsKCk7IH07CgogIFYudmlld3MucGF5d2FsbCA9IHZpZXc7Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2F1dGgtdmlldy5qcyA9PT09PSAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIFYgPSAod2luZG93LlYgPSB3aW5kb3cuViB8fCB7fSk7CiAgVi52aWV3cyA9IFYudmlld3MgfHwge307CgogIGZ1bmN0aW9uIGVsKHRhZywgYXR0cnMpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51aS5lbC5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICB2YXIgaSA9IDE7CiAgICBpZiAoYXR0cnMgJiYgdHlwZW9mIGF0dHJzID09PSAnb2JqZWN0JyAmJiAhKGF0dHJzIGluc3RhbmNlb2YgTm9kZSkgJiYgdHlwZW9mIGF0dHJzICE9PSAnc3RyaW5nJykgewogICAgICBpID0gMjsKICAgICAgZm9yICh2YXIgayBpbiBhdHRycykgewogICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGF0dHJzLCBrKSkgY29udGludWU7CiAgICAgICAgdmFyIHZhbCA9IGF0dHJzW2tdOwogICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCB2YWwgPT09IGZhbHNlKSBjb250aW51ZTsKICAgICAgICBpZiAoayA9PT0gJ2NsYXNzJyB8fCBrID09PSAnY2xhc3NOYW1lJykgbm9kZS5jbGFzc05hbWUgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ3RleHQnKSBub2RlLnRleHRDb250ZW50ID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICdodG1sJykgbm9kZS5pbm5lckhUTUwgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdvbicpID09PSAwICYmIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHZhbCk7CiAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdkYXRhLScpID09PSAwIHx8IGsuaW5kZXhPZignYXJpYS0nKSA9PT0gMCkgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdmFsKTsKICAgICAgICBlbHNlIGlmICh2YWwgPT09IHRydWUpIG5vZGUuc2V0QXR0cmlidXRlKGssICcnKTsKICAgICAgICBlbHNlIHsgdHJ5IHsgbm9kZVtrXSA9IHZhbDsgfSBjYXRjaCAoZSkgeyBub2RlLnNldEF0dHJpYnV0ZShrLCB2YWwpOyB9IH0KICAgICAgfQogICAgfSBlbHNlIGlmIChhdHRycyAhPSBudWxsKSB7IGFwcGVuZENoaWxkKG5vZGUsIGF0dHJzKTsgfQogICAgZm9yICg7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFwcGVuZENoaWxkKG5vZGUsIGFyZ3VtZW50c1tpXSk7CiAgICByZXR1cm4gbm9kZTsKICB9CiAgZnVuY3Rpb24gYXBwZW5kQ2hpbGQobm9kZSwgYykgewogICAgaWYgKGMgPT0gbnVsbCB8fCBjID09PSBmYWxzZSB8fCBjID09PSB0cnVlKSByZXR1cm47CiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgeyBjLmZvckVhY2goZnVuY3Rpb24gKHgpIHsgYXBwZW5kQ2hpbGQobm9kZSwgeCk7IH0pOyByZXR1cm47IH0KICAgIG5vZGUuYXBwZW5kQ2hpbGQoYy5ub2RlVHlwZSA/IGMgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICB9CgogIGZ1bmN0aW9uIHRvYXN0KG1zZywga2luZCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkudG9hc3QgPT09ICdmdW5jdGlvbicpIHsgVi51aS50b2FzdChtc2csIGtpbmQgfHwgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5lbWl0ID09PSAnZnVuY3Rpb24nKSBWLnN0b3JlLmVtaXQoJ3RvYXN0JywgeyBtc2c6IG1zZywga2luZDoga2luZCB8fCAnaW5mbycgfSk7CiAgfQogIGZ1bmN0aW9uIGdvKGhhc2gpIHsKICAgIGlmIChWLnJvdXRlciAmJiB0eXBlb2YgVi5yb3V0ZXIuZ28gPT09ICdmdW5jdGlvbicpIFYucm91dGVyLmdvKGhhc2gpOwogICAgZWxzZSB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQogIGZ1bmN0aW9uIGlzRW1haWwocykgewogICAgaWYgKFYudXRpbCAmJiB0eXBlb2YgVi51dGlsLmlzRW1haWwgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnV0aWwuaXNFbWFpbChzKTsKICAgIHJldHVybiAvXlteXHNAXStAW15cc0BdK1wuW15cc0BdKyQvLnRlc3QoU3RyaW5nKHMgfHwgJycpLnRyaW0oKSk7CiAgfQogIGZ1bmN0aW9uIHNwaW5uZXIoKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5zcGlubmVyID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IHZhciBzID0gVi51aS5zcGlubmVyKCk7IGlmIChzICYmIHMubm9kZVR5cGUpIHJldHVybiBzOyB9IGNhdGNoIChlKSB7fSB9CiAgICByZXR1cm4gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zcGlubmVyJyB9KTsKICB9CiAgZnVuY3Rpb24gYXV0aFZpZGVvVVJMKCkgewogICAgdmFyIGNmZyA9IChWLmNvbmZpZyB8fCB7fSk7CiAgICByZXR1cm4gY2ZnLkFVVEhfVklERU8gfHwgY2ZnLkRFTU9fVklERU8gfHwgJyc7CiAgfQoKICB2YXIgX3Jvb3QgPSBudWxsOwogIHZhciBfbW9kZSA9ICdzaWduaW4nOwogIHZhciBfbmV4dCA9IG51bGw7CiAgdmFyIF92aWRlbyA9IG51bGw7CgogIGZ1bmN0aW9uIGxhbmRBZnRlckF1dGgoKSB7CiAgICB2YXIgZGVzdCA9IF9uZXh0OwogICAgaWYgKCFkZXN0KSB7CiAgICAgIHZhciBvbmJvYXJkZWQgPSBWLnN0YXRlICYmIFYuc3RhdGUub25ib2FyZGluZ0RvbmUgPT09IHRydWU7CiAgICAgIGRlc3QgPSBvbmJvYXJkZWQgPyAnIy9jcmVhdGUnIDogJyMvb25ib2FyZGluZyc7CiAgICB9CiAgICBnbyhkZXN0KTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkQmFja2dyb3VuZChzdGFnZSkgewogICAgdmFyIHNyYyA9IGF1dGhWaWRlb1VSTCgpOwogICAgaWYgKHNyYykgewogICAgICB2YXIgdmlkZW8gPSBlbCgndmlkZW8nLCB7CiAgICAgICAgY2xhc3M6ICd2LWF1dGhfX3ZpZGVvJywKICAgICAgICBtdXRlZDogdHJ1ZSwKICAgICAgICBsb29wOiB0cnVlLAogICAgICAgIGF1dG9wbGF5OiB0cnVlLAogICAgICAgIHBsYXlzaW5saW5lOiB0cnVlLAogICAgICAgIHByZWxvYWQ6ICdhdXRvJywKICAgICAgICB0YWJpbmRleDogJy0xJywKICAgICAgICAnYXJpYS1oaWRkZW4nOiAndHJ1ZScKICAgICAgfSk7CiAgICAgIHZpZGVvLm11dGVkID0gdHJ1ZTsKICAgICAgdmlkZW8uZGVmYXVsdE11dGVkID0gdHJ1ZTsKICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdtdXRlZCcsICcnKTsKICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdwbGF5c2lubGluZScsICcnKTsKICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCd3ZWJraXQtcGxheXNpbmxpbmUnLCAnJyk7CiAgICAgIHZpZGVvLnNldEF0dHJpYnV0ZSgnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnLCAnJyk7CiAgICAgIHZpZGVvLnNldEF0dHJpYnV0ZSgnZGlzYWJsZXJlbW90ZXBsYXliYWNrJywgJycpOwogICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAodmlkZW8ucGFyZW50Tm9kZSkgdmlkZW8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh2aWRlbyk7CiAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgdmFyIGF0dGVtcHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciBwID0gdmlkZW8ucGxheSgpOwogICAgICAgICAgaWYgKHAgJiYgdHlwZW9mIHAuY2F0Y2ggPT09ICdmdW5jdGlvbicpIHAuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgIH07CiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2NhbnBsYXknLCBhdHRlbXB0LCB7IG9uY2U6IHRydWUgfSk7CiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCBhdHRlbXB0LCB7IG9uY2U6IHRydWUgfSk7CiAgICAgIHRyeSB7IHZpZGVvLnNyYyA9IHNyYzsgfSBjYXRjaCAoZTIpIHsgdmlkZW8uc2V0QXR0cmlidXRlKCdzcmMnLCBzcmMpOyB9CiAgICAgIHRyeSB7IHZpZGVvLmxvYWQoKTsgfSBjYXRjaCAoZTMpIHt9CiAgICAgIF92aWRlbyA9IHZpZGVvOwogICAgICBzdGFnZS5hcHBlbmRDaGlsZCh2aWRlbyk7CiAgICB9CiAgICBzdGFnZS5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtYXV0aF9fc2NyaW0nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSkpOwogIH0KCiAgZnVuY3Rpb24gZmllbGQob3B0cykgewogICAgdmFyIGlucHV0ID0gZWwoJ2lucHV0JywgewogICAgICB0eXBlOiBvcHRzLnR5cGUgfHwgJ3RleHQnLAogICAgICBjbGFzczogJ3YtZmllbGQnLAogICAgICBuYW1lOiBvcHRzLm5hbWUsCiAgICAgIGlkOiAndi1hdXRoLScgKyBvcHRzLm5hbWUsCiAgICAgIHBsYWNlaG9sZGVyOiBvcHRzLnBsYWNlaG9sZGVyIHx8ICcnLAogICAgICBhdXRvY29tcGxldGU6IG9wdHMuYXV0b2NvbXBsZXRlIHx8ICdvZmYnLAogICAgICAnYXJpYS1sYWJlbCc6IG9wdHMubGFiZWwgfHwgb3B0cy5wbGFjZWhvbGRlciB8fCBvcHRzLm5hbWUsCiAgICAgIHJlcXVpcmVkOiBvcHRzLnJlcXVpcmVkID8gJycgOiBudWxsLAogICAgICB2YWx1ZTogb3B0cy52YWx1ZSB8fCAnJwogICAgfSk7CiAgICBpZiAob3B0cy5pbnB1dG1vZGUpIGlucHV0LnNldEF0dHJpYnV0ZSgnaW5wdXRtb2RlJywgb3B0cy5pbnB1dG1vZGUpOwogICAgaWYgKG9wdHMuYXV0b2NhcGl0YWxpemUpIGlucHV0LnNldEF0dHJpYnV0ZSgnYXV0b2NhcGl0YWxpemUnLCBvcHRzLmF1dG9jYXBpdGFsaXplKTsKICAgIGlmIChvcHRzLnNwZWxsY2hlY2sgPT09IGZhbHNlKSBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3NwZWxsY2hlY2snLCAnZmFsc2UnKTsKICAgIGlmIChvcHRzLm1pbmxlbmd0aCkgaW5wdXQuc2V0QXR0cmlidXRlKCdtaW5sZW5ndGgnLCBTdHJpbmcob3B0cy5taW5sZW5ndGgpKTsKICAgIGlmIChvcHRzLm1heGxlbmd0aCkgaW5wdXQuc2V0QXR0cmlidXRlKCdtYXhsZW5ndGgnLCBTdHJpbmcob3B0cy5tYXhsZW5ndGgpKTsKICAgIHZhciB3cmFwID0gZWwoJ2xhYmVsJywgeyBjbGFzczogJ3YtYXV0aF9fZ3JvdXAnIH0sCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtYXV0aF9fbGFiZWwnLCB0ZXh0OiBvcHRzLmxhYmVsIHx8ICcnIH0pLAogICAgICBpbnB1dCk7CiAgICB3cmFwLmlucHV0ID0gaW5wdXQ7CiAgICByZXR1cm4gd3JhcDsKICB9CgogIGZ1bmN0aW9uIHN0YXR1c0xpbmUoKSB7CiAgICByZXR1cm4gZWwoJ3AnLCB7IGNsYXNzOiAndi1hdXRoX19zdGF0dXMnLCByb2xlOiAnYWxlcnQnLCAnYXJpYS1saXZlJzogJ3BvbGl0ZScgfSk7CiAgfQoKICBmdW5jdGlvbiBzaG93U3RhdHVzKG5vZGUsIG1zZywgaXNFcnJvcikgewogICAgaWYgKCFub2RlKSByZXR1cm47CiAgICBub2RlLnRleHRDb250ZW50ID0gbXNnIHx8ICcnOwogICAgbm9kZS5jbGFzc0xpc3QudG9nZ2xlKCd2LWF1dGhfX3N0YXR1cy0tZXJyb3InLCAhIWlzRXJyb3IpOwogIH0KCiAgZnVuY3Rpb24gc3VibWl0QnV0dG9uKGxhYmVsKSB7CiAgICB2YXIgYnRuID0gZWwoJ2J1dHRvbicsIHsgdHlwZTogJ3N1Ym1pdCcsIGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnkgdi1jdGEtLWJsb2NrJyB9LCBlbCgnc3BhbicsIHsgdGV4dDogbGFiZWwgfSkpOwogICAgYnRuLnNldExvYWRpbmcgPSBmdW5jdGlvbiAob24sIGJ1c3lMYWJlbCkgewogICAgICBidG4uZGlzYWJsZWQgPSAhIW9uOwogICAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnaXMtbG9hZGluZycsICEhb24pOwogICAgICBidG4uaW5uZXJIVE1MID0gJyc7CiAgICAgIGlmIChvbikgeyBidG4uYXBwZW5kQ2hpbGQoc3Bpbm5lcigpKTsgYnRuLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyB0ZXh0OiAnICcgKyAoYnVzeUxhYmVsIHx8ICdXb3JraW5n4oCmJykgfSkpOyB9CiAgICAgIGVsc2UgYnRuLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyB0ZXh0OiBsYWJlbCB9KSk7CiAgICB9OwogICAgcmV0dXJuIGJ0bjsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkU2lnbkluKCkgewogICAgdmFyIGVtYWlsRiA9IGZpZWxkKHsgbmFtZTogJ2VtYWlsJywgdHlwZTogJ2VtYWlsJywgbGFiZWw6ICdFbWFpbCcsIHBsYWNlaG9sZGVyOiAneW91QHN0dWRpby5jb20nLCBhdXRvY29tcGxldGU6ICd1c2VybmFtZScsIGlucHV0bW9kZTogJ2VtYWlsJywgYXV0b2NhcGl0YWxpemU6ICdub25lJywgc3BlbGxjaGVjazogZmFsc2UsIHJlcXVpcmVkOiB0cnVlIH0pOwogICAgdmFyIHB3RiA9IGZpZWxkKHsgbmFtZTogJ3Bhc3N3b3JkJywgdHlwZTogJ3Bhc3N3b3JkJywgbGFiZWw6ICdQYXNzd29yZCcsIHBsYWNlaG9sZGVyOiAnWW91ciBwYXNzd29yZCcsIGF1dG9jb21wbGV0ZTogJ2N1cnJlbnQtcGFzc3dvcmQnLCByZXF1aXJlZDogdHJ1ZSB9KTsKICAgIHZhciBzdGF0dXMgPSBzdGF0dXNMaW5lKCk7CiAgICB2YXIgYnRuID0gc3VibWl0QnV0dG9uKCdTaWduIGluJyk7CgogICAgdmFyIGZvcm0gPSBlbCgnZm9ybScsIHsgY2xhc3M6ICd2LWF1dGhfX2Zvcm0nLCBub3ZhbGlkYXRlOiAnJyB9LAogICAgICBlbWFpbEYsIHB3Riwgc3RhdHVzLCBidG4sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19yb3cnIH0sCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzOiAndi1saW5rIHYtYXV0aF9fZm9yZ290Jywgb25DbGljazogZnVuY3Rpb24gKCkgeyBzZXRNb2RlKCdyZXNldCcsIGVtYWlsRi5pbnB1dC52YWx1ZSk7IH0gfSwgJ0ZvcmdvdCBwYXNzd29yZD8nKQogICAgICApCiAgICApOwoKICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgZnVuY3Rpb24gKGUpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB2YXIgZW1haWwgPSAoZW1haWxGLmlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIHZhciBwdyA9IHB3Ri5pbnB1dC52YWx1ZSB8fCAnJzsKICAgICAgaWYgKCFpc0VtYWlsKGVtYWlsKSkgeyBzaG93U3RhdHVzKHN0YXR1cywgJ0VudGVyIGEgdmFsaWQgZW1haWwuJywgdHJ1ZSk7IGVtYWlsRi5pbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgaWYgKCFwdykgeyBzaG93U3RhdHVzKHN0YXR1cywgJ0VudGVyIHlvdXIgcGFzc3dvcmQuJywgdHJ1ZSk7IHB3Ri5pbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgaWYgKCFWLmF1dGggfHwgdHlwZW9mIFYuYXV0aC5zaWduSW4gIT09ICdmdW5jdGlvbicpIHsgc2hvd1N0YXR1cyhzdGF0dXMsICdTaWduLWluIGlzIHVuYXZhaWxhYmxlIHJpZ2h0IG5vdy4nLCB0cnVlKTsgcmV0dXJuOyB9CgogICAgICBzaG93U3RhdHVzKHN0YXR1cywgJycpOwogICAgICBidG4uc2V0TG9hZGluZyh0cnVlLCAnU2lnbmluZyBpbuKApicpOwogICAgICBWLmF1dGguc2lnbkluKGVtYWlsLCBwdykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgdG9hc3QoJ1dlbGNvbWUgYmFjay4nLCAnc3VjY2VzcycpOwogICAgICAgIGxhbmRBZnRlckF1dGgoKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgIGJ0bi5zZXRMb2FkaW5nKGZhbHNlKTsKICAgICAgICB2YXIgc3RhdHVzNDAxID0gZXJyICYmIChlcnIuc3RhdHVzID09PSA0MDEgfHwgZXJyLnN0YXR1cyA9PT0gNDAzKTsKICAgICAgICBzaG93U3RhdHVzKHN0YXR1cywgc3RhdHVzNDAxID8gJ0VtYWlsIG9yIHBhc3N3b3JkIGlzIGluY29ycmVjdC4nIDogKChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdDb3VsZCBub3Qgc2lnbiBpbi4gUGxlYXNlIHRyeSBhZ2Fpbi4nKSwgdHJ1ZSk7CiAgICAgIH0pOwogICAgfSk7CiAgICByZXR1cm4gZm9ybTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkUmVnaXN0ZXIoKSB7CiAgICB2YXIgbmFtZUYgPSBmaWVsZCh7IG5hbWU6ICduYW1lJywgbGFiZWw6ICdOYW1lJywgcGxhY2Vob2xkZXI6ICdZb3VyIG5hbWUnLCBhdXRvY29tcGxldGU6ICduYW1lJyB9KTsKICAgIHZhciBlbWFpbEYgPSBmaWVsZCh7IG5hbWU6ICdlbWFpbCcsIHR5cGU6ICdlbWFpbCcsIGxhYmVsOiAnRW1haWwnLCBwbGFjZWhvbGRlcjogJ3lvdUBzdHVkaW8uY29tJywgYXV0b2NvbXBsZXRlOiAndXNlcm5hbWUnLCBpbnB1dG1vZGU6ICdlbWFpbCcsIGF1dG9jYXBpdGFsaXplOiAnbm9uZScsIHNwZWxsY2hlY2s6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZSB9KTsKICAgIHZhciBwd0YgPSBmaWVsZCh7IG5hbWU6ICdwYXNzd29yZCcsIHR5cGU6ICdwYXNzd29yZCcsIGxhYmVsOiAnUGFzc3dvcmQnLCBwbGFjZWhvbGRlcjogJzjigJMyNCBjaGFyYWN0ZXJzJywgYXV0b2NvbXBsZXRlOiAnbmV3LXBhc3N3b3JkJywgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6IDI0LCByZXF1aXJlZDogdHJ1ZSB9KTsKICAgIHZhciBzdGF0dXMgPSBzdGF0dXNMaW5lKCk7CiAgICB2YXIgYnRuID0gc3VibWl0QnV0dG9uKCdDcmVhdGUgYWNjb3VudCcpOwoKICAgIHZhciBsZWdhbCA9IGVsKCdwJywgeyBjbGFzczogJ3YtYXV0aF9fbGVnYWwnIH0sCiAgICAgICdCeSBjcmVhdGluZyBhbiBhY2NvdW50IHlvdSBhZ3JlZSB0byBvdXIgJywKICAgICAgZWwoJ2EnLCB7IGhyZWY6ICdodHRwczovL3Zvb3NleS5jb20vdGVybXMnLCB0YXJnZXQ6ICdfYmxhbmsnLCByZWw6ICdub29wZW5lcicsIGNsYXNzOiAndi1saW5rJyB9LCAnVGVybXMnKSwKICAgICAgJyBhbmQgJywKICAgICAgZWwoJ2EnLCB7IGhyZWY6ICdodHRwczovL3Zvb3NleS5jb20vcHJpdmFjeScsIHRhcmdldDogJ19ibGFuaycsIHJlbDogJ25vb3BlbmVyJywgY2xhc3M6ICd2LWxpbmsnIH0sICdQcml2YWN5IFBvbGljeScpLAogICAgICAnLicpOwoKICAgIHZhciBmb3JtID0gZWwoJ2Zvcm0nLCB7IGNsYXNzOiAndi1hdXRoX19mb3JtJywgbm92YWxpZGF0ZTogJycgfSwgbmFtZUYsIGVtYWlsRiwgcHdGLCBzdGF0dXMsIGJ0biwgbGVnYWwpOwoKICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgZnVuY3Rpb24gKGUpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB2YXIgbmFtZSA9IChuYW1lRi5pbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpOwogICAgICB2YXIgZW1haWwgPSAoZW1haWxGLmlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIHZhciBwdyA9IHB3Ri5pbnB1dC52YWx1ZSB8fCAnJzsKICAgICAgaWYgKCFpc0VtYWlsKGVtYWlsKSkgeyBzaG93U3RhdHVzKHN0YXR1cywgJ0VudGVyIGEgdmFsaWQgZW1haWwuJywgdHJ1ZSk7IGVtYWlsRi5pbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgaWYgKHB3Lmxlbmd0aCA8IDggfHwgcHcubGVuZ3RoID4gMjQpIHsgc2hvd1N0YXR1cyhzdGF0dXMsICdQYXNzd29yZCBtdXN0IGJlIDjigJMyNCBjaGFyYWN0ZXJzLicsIHRydWUpOyBwd0YuaW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIGlmICghVi5hdXRoIHx8IHR5cGVvZiBWLmF1dGgucmVnaXN0ZXIgIT09ICdmdW5jdGlvbicpIHsgc2hvd1N0YXR1cyhzdGF0dXMsICdTaWduLXVwIGlzIHVuYXZhaWxhYmxlIHJpZ2h0IG5vdy4nLCB0cnVlKTsgcmV0dXJuOyB9CgogICAgICBzaG93U3RhdHVzKHN0YXR1cywgJycpOwogICAgICBidG4uc2V0TG9hZGluZyh0cnVlLCAnQ3JlYXRpbmfigKYnKTsKICAgICAgVi5hdXRoLnJlZ2lzdGVyKHsgbmFtZTogbmFtZSwgZW1haWw6IGVtYWlsLCBwYXNzd29yZDogcHcgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgdG9hc3QoJ0FjY291bnQgY3JlYXRlZCDigJQgd2VsY29tZSB0byBWYW1wLicsICdzdWNjZXNzJyk7CiAgICAgICAgbGFuZEFmdGVyQXV0aCgpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgYnRuLnNldExvYWRpbmcoZmFsc2UpOwogICAgICAgIHZhciBjb25mbGljdCA9IGVyciAmJiBlcnIuc3RhdHVzID09PSA0MDk7CiAgICAgICAgc2hvd1N0YXR1cyhzdGF0dXMsIGNvbmZsaWN0ID8gJ1RoYXQgZW1haWwgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBUcnkgc2lnbmluZyBpbi4nIDogKChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdDb3VsZCBub3QgY3JlYXRlIHlvdXIgYWNjb3VudC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKSwgdHJ1ZSk7CiAgICAgIH0pOwogICAgfSk7CiAgICByZXR1cm4gZm9ybTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkUmVzZXQocHJlZmlsbEVtYWlsKSB7CiAgICB2YXIgZW1haWxGID0gZmllbGQoeyBuYW1lOiAnZW1haWwnLCB0eXBlOiAnZW1haWwnLCBsYWJlbDogJ0VtYWlsJywgcGxhY2Vob2xkZXI6ICd5b3VAc3R1ZGlvLmNvbScsIGF1dG9jb21wbGV0ZTogJ3VzZXJuYW1lJywgaW5wdXRtb2RlOiAnZW1haWwnLCBhdXRvY2FwaXRhbGl6ZTogJ25vbmUnLCBzcGVsbGNoZWNrOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWUsIHZhbHVlOiBwcmVmaWxsRW1haWwgfHwgJycgfSk7CiAgICB2YXIgc3RhdHVzID0gc3RhdHVzTGluZSgpOwogICAgdmFyIHNlbmRCdG4gPSBzdWJtaXRCdXR0b24oJ1NlbmQgcmVzZXQgY29kZScpOwoKICAgIHZhciBjb2RlRiA9IGZpZWxkKHsgbmFtZTogJ2NvZGUnLCBsYWJlbDogJ1Jlc2V0IGNvZGUnLCBwbGFjZWhvbGRlcjogJ0NvZGUgZnJvbSB5b3VyIGVtYWlsJywgYXV0b2NvbXBsZXRlOiAnb25lLXRpbWUtY29kZScgfSk7CiAgICB2YXIgbmV3UHdGID0gZmllbGQoeyBuYW1lOiAnbmV3UGFzc3dvcmQnLCB0eXBlOiAncGFzc3dvcmQnLCBsYWJlbDogJ05ldyBwYXNzd29yZCcsIHBsYWNlaG9sZGVyOiAnOOKAkzI0IGNoYXJhY3RlcnMnLCBhdXRvY29tcGxldGU6ICduZXctcGFzc3dvcmQnLCBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDogMjQgfSk7CiAgICB2YXIgcmVzZXRCdG4gPSBzdWJtaXRCdXR0b24oJ1NldCBuZXcgcGFzc3dvcmQnKTsKICAgIHZhciBzdGFnZTIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtYXV0aF9fc3RhZ2UyJywgaGlkZGVuOiAnJyB9LCBjb2RlRiwgbmV3UHdGLCByZXNldEJ0bik7CgogICAgdmFyIGZvcm0gPSBlbCgnZm9ybScsIHsgY2xhc3M6ICd2LWF1dGhfX2Zvcm0nLCBub3ZhbGlkYXRlOiAnJyB9LCBlbWFpbEYsIHNlbmRCdG4sIHN0YWdlMiwgc3RhdHVzKTsKCiAgICB2YXIgcmVxdWVzdGVkID0gZmFsc2U7CgogICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBmdW5jdGlvbiAoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGlmICghcmVxdWVzdGVkKSByZXR1cm4gZG9SZXF1ZXN0KCk7CiAgICAgIHJldHVybiBkb1Jlc2V0KCk7CiAgICB9KTsKICAgIHNlbmRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGRvUmVxdWVzdCgpOyB9KTsKICAgIHJlc2V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBkb1Jlc2V0KCk7IH0pOwoKICAgIGZ1bmN0aW9uIGRvUmVxdWVzdCgpIHsKICAgICAgdmFyIGVtYWlsID0gKGVtYWlsRi5pbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpOwogICAgICBpZiAoIWlzRW1haWwoZW1haWwpKSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnRW50ZXIgYSB2YWxpZCBlbWFpbC4nLCB0cnVlKTsgZW1haWxGLmlucHV0LmZvY3VzKCk7IHJldHVybjsgfQogICAgICBpZiAoIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS5yZXF1ZXN0UmVzZXQgIT09ICdmdW5jdGlvbicpIHsgc2hvd1N0YXR1cyhzdGF0dXMsICdQYXNzd29yZCByZXNldCBpcyB1bmF2YWlsYWJsZSByaWdodCBub3cuJywgdHJ1ZSk7IHJldHVybjsgfQogICAgICBzaG93U3RhdHVzKHN0YXR1cywgJycpOwogICAgICBzZW5kQnRuLnNldExvYWRpbmcodHJ1ZSwgJ1NlbmRpbmfigKYnKTsKICAgICAgVi5hcGkucmVxdWVzdFJlc2V0KGVtYWlsKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICBzZW5kQnRuLnNldExvYWRpbmcoZmFsc2UpOwogICAgICAgIHJlcXVlc3RlZCA9IHRydWU7CiAgICAgICAgc3RhZ2UyLmhpZGRlbiA9IGZhbHNlOwogICAgICAgIHNlbmRCdG4uaW5uZXJIVE1MID0gJyc7IHNlbmRCdG4uYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IHRleHQ6ICdSZXNlbmQgY29kZScgfSkpOwogICAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAnQ2hlY2sgeW91ciBlbWFpbCBmb3IgYSByZXNldCBjb2RlLicsIGZhbHNlKTsKICAgICAgICBjb2RlRi5pbnB1dC5mb2N1cygpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgc2VuZEJ0bi5zZXRMb2FkaW5nKGZhbHNlKTsKICAgICAgICBzaG93U3RhdHVzKHN0YXR1cywgKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ0NvdWxkIG5vdCBzZW5kIGEgcmVzZXQgY29kZS4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCB0cnVlKTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gZG9SZXNldCgpIHsKICAgICAgdmFyIGVtYWlsID0gKGVtYWlsRi5pbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpOwogICAgICB2YXIgY29kZSA9IChjb2RlRi5pbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpOwogICAgICB2YXIgbmV3UHcgPSBuZXdQd0YuaW5wdXQudmFsdWUgfHwgJyc7CiAgICAgIGlmICghY29kZSkgeyBzaG93U3RhdHVzKHN0YXR1cywgJ0VudGVyIHRoZSBjb2RlIGZyb20geW91ciBlbWFpbC4nLCB0cnVlKTsgY29kZUYuaW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIGlmIChuZXdQdy5sZW5ndGggPCA4IHx8IG5ld1B3Lmxlbmd0aCA+IDI0KSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnUGFzc3dvcmQgbXVzdCBiZSA44oCTMjQgY2hhcmFjdGVycy4nLCB0cnVlKTsgbmV3UHdGLmlucHV0LmZvY3VzKCk7IHJldHVybjsgfQogICAgICBpZiAoIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS5zdWJtaXRSZXNldCAhPT0gJ2Z1bmN0aW9uJykgeyBzaG93U3RhdHVzKHN0YXR1cywgJ1Bhc3N3b3JkIHJlc2V0IGlzIHVuYXZhaWxhYmxlIHJpZ2h0IG5vdy4nLCB0cnVlKTsgcmV0dXJuOyB9CiAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAnJyk7CiAgICAgIHJlc2V0QnRuLnNldExvYWRpbmcodHJ1ZSwgJ1VwZGF0aW5n4oCmJyk7CiAgICAgIFYuYXBpLnN1Ym1pdFJlc2V0KGVtYWlsLCBjb2RlLCBuZXdQdykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgdG9hc3QoJ1Bhc3N3b3JkIHVwZGF0ZWQg4oCUIHlvdSBjYW4gc2lnbiBpbiBub3cuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICBzZXRNb2RlKCdzaWduaW4nLCBlbWFpbCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICByZXNldEJ0bi5zZXRMb2FkaW5nKGZhbHNlKTsKICAgICAgICBzaG93U3RhdHVzKHN0YXR1cywgKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ1RoYXQgY29kZSBkaWRu4oCZdCB3b3JrLiBSZXF1ZXN0IGEgbmV3IG9uZSBhbmQgdHJ5IGFnYWluLicsIHRydWUpOwogICAgICB9KTsKICAgIH0KCiAgICByZXR1cm4gZm9ybTsKICB9CgogIGZ1bmN0aW9uIHNldE1vZGUobW9kZSwgY2FycnlFbWFpbCkgewogICAgX21vZGUgPSBtb2RlOwogICAgaWYgKF9yb290KSBwYWludChjYXJyeUVtYWlsKTsKICB9CgogIGZ1bmN0aW9uIHBhaW50KGNhcnJ5RW1haWwpIHsKICAgIHZhciByb290ID0gX3Jvb3Q7CiAgICBpZiAoIXJvb3QpIHJldHVybjsKICAgIHN0b3BWaWRlbygpOwogICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKCiAgICB2YXIgc3RhZ2UgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtYXV0aCcgfSk7CiAgICBidWlsZEJhY2tncm91bmQoc3RhZ2UpOwoKICAgIHZhciBjYXJkID0gZWwoJ3NlY3Rpb24nLCB7IGNsYXNzOiAndi1hdXRoX19jYXJkIGdsYXNzLWNhcmQnLCByb2xlOiAnZm9ybScsICdhcmlhLWxhYmVsJzogJ1NpZ24gaW4gdG8gVmFtcCcgfSk7CgogICAgY2FyZC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtYXV0aF9fYnJhbmQnIH0sCiAgICAgIGVsKCdpbWcnLCB7IGNsYXNzOiAndi1hdXRoX19sb2dvJywgc3JjOiBWLkxPR09fV09SRE1BUkssIGFsdDogJ1ZhbXAnLCB3aWR0aDogMzA5LCBoZWlnaHQ6IDQ4LCBkZWNvZGluZzogJ2FzeW5jJyB9KSwKICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1hdXRoX190YWdsaW5lJywgdGV4dDogJ1N0YWdlLCByZXN0eWxlLCBhbmQgcmVpbWFnaW5lIGFueSBzcGFjZS4nIH0pCiAgICApKTsKCiAgICBpZiAoX21vZGUgIT09ICdyZXNldCcpIHsKICAgICAgdmFyIHRhYnMgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtYXV0aF9fdGFicycsIHJvbGU6ICd0YWJsaXN0JyB9KTsKICAgICAgdGFicy5hcHBlbmRDaGlsZCh0YWJCdG4oJ1NpZ24gaW4nLCAnc2lnbmluJykpOwogICAgICB0YWJzLmFwcGVuZENoaWxkKHRhYkJ0bignQ3JlYXRlIGFjY291bnQnLCAncmVnaXN0ZXInKSk7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQodGFicyk7CiAgICB9IGVsc2UgewogICAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19yZXNldGhlYWQnIH0sCiAgICAgICAgZWwoJ2gyJywgeyBjbGFzczogJ3YtYXV0aF9fdGl0bGUnLCB0ZXh0OiAnUmVzZXQgcGFzc3dvcmQnIH0pLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtYXV0aF9fc3ViJywgdGV4dDogJ0VudGVyIHlvdXIgZW1haWwgYW5kIHdl4oCZbGwgc2VuZCBhIHJlc2V0IGNvZGUuJyB9KQogICAgICApKTsKICAgIH0KCiAgICB2YXIgYm9keTsKICAgIGlmIChfbW9kZSA9PT0gJ3JlZ2lzdGVyJykgYm9keSA9IGJ1aWxkUmVnaXN0ZXIoKTsKICAgIGVsc2UgaWYgKF9tb2RlID09PSAncmVzZXQnKSBib2R5ID0gYnVpbGRSZXNldChjYXJyeUVtYWlsKTsKICAgIGVsc2UgYm9keSA9IGJ1aWxkU2lnbkluKCk7CiAgICBjYXJkLmFwcGVuZENoaWxkKGJvZHkpOwoKICAgIGlmIChfbW9kZSA9PT0gJ3Jlc2V0JykgewogICAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19mb290JyB9LAogICAgICAgIGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtbGluaycsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgc2V0TW9kZSgnc2lnbmluJywgY2FycnlFbWFpbCk7IH0gfSwgJ+KGkCBCYWNrIHRvIHNpZ24gaW4nKSkpOwogICAgfQoKICAgIHN0YWdlLmFwcGVuZENoaWxkKGNhcmQpOwogICAgcm9vdC5hcHBlbmRDaGlsZChzdGFnZSk7CgogICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICB2YXIgZmlyc3QgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7CiAgICAgIGlmIChmaXJzdCkgeyB0cnkgeyBmaXJzdC5mb2N1cygpOyB9IGNhdGNoIChlKSB7fSB9CiAgICB9LCA0MCk7CiAgfQoKICBmdW5jdGlvbiB0YWJCdG4obGFiZWwsIG1vZGUpIHsKICAgIHZhciBhY3RpdmUgPSBfbW9kZSA9PT0gbW9kZTsKICAgIHZhciBidG4gPSBlbCgnYnV0dG9uJywgewogICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgcm9sZTogJ3RhYicsCiAgICAgIGNsYXNzOiAndi1hdXRoX190YWInICsgKGFjdGl2ZSA/ICcgdi1hdXRoX190YWItLWFjdGl2ZScgOiAnJyksCiAgICAgICdhcmlhLXNlbGVjdGVkJzogYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJwogICAgfSwgbGFiZWwpOwogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBpZiAoX21vZGUgIT09IG1vZGUpIHNldE1vZGUobW9kZSk7IH0pOwogICAgcmV0dXJuIGJ0bjsKICB9CgogIGZ1bmN0aW9uIHN0b3BWaWRlbygpIHsKICAgIGlmICghX3ZpZGVvKSByZXR1cm47CiAgICB0cnkgeyBfdmlkZW8ucGF1c2UoKTsgfSBjYXRjaCAoZSkge30KICAgIHRyeSB7IF92aWRlby5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpOyBfdmlkZW8ubG9hZCgpOyB9IGNhdGNoIChlMikge30KICAgIF92aWRlbyA9IG51bGw7CiAgfQoKICBWLnZpZXdzLmF1dGggPSB7CiAgICByZW5kZXI6IGZ1bmN0aW9uIChyb290LCBwYXJhbXMpIHsKICAgICAgX3Jvb3QgPSByb290OwogICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307CiAgICAgIF9uZXh0ID0gcGFyYW1zLm5leHQgPyBTdHJpbmcocGFyYW1zLm5leHQpIDogbnVsbDsKICAgICAgdmFyIG0gPSAocGFyYW1zLm1vZGUgfHwgJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTsKICAgICAgX21vZGUgPSAobSA9PT0gJ3JlZ2lzdGVyJyB8fCBtID09PSAncmVzZXQnIHx8IG0gPT09ICdzaWduaW4nKSA/IG0gOiAnc2lnbmluJzsKICAgICAgcm9vdC5jbGFzc0xpc3QgJiYgcm9vdC5jbGFzc0xpc3QuYWRkKCd2LXZpZXctYXV0aCcpOwogICAgICBwYWludChwYXJhbXMuZW1haWwgfHwgJycpOwogICAgfSwKICAgIHRlYXJkb3duOiBmdW5jdGlvbiAoKSB7CiAgICAgIHN0b3BWaWRlbygpOwogICAgICBfcm9vdCA9IG51bGw7CiAgICAgIF9tb2RlID0gJ3NpZ25pbic7CiAgICAgIF9uZXh0ID0gbnVsbDsKICAgIH0KICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9hcHAuanMgPT09PT0gKi8KKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwoKICB2YXIgREVGQVVMVF9ST1VURSA9ICdjcmVhdGUnOwoKICB2YXIgUFVCTElDX1JPVVRFUyA9IHsgYXV0aDogdHJ1ZSB9OwoKICB2YXIgUk9VVEVfVklFVyA9IHsKICAgIGNyZWF0ZTogJ2NyZWF0ZScsCiAgICBsaWJyYXJ5OiAnbGlicmFyeScsCiAgICBpbnNwaXJhdGlvbjogJ2ZlZWQnLAogICAgZmVlZDogJ2ZlZWQnLAogICAgc2V0dGluZ3M6ICdzZXR0aW5ncycsCiAgICBhY2NvdW50OiAnYWNjb3VudCcsCiAgICBwYXl3YWxsOiAncGF5d2FsbCcsCiAgICByZWZlcnJhbDogJ3JlZmVycmFsJywKICAgIGNoYWxsZW5nZTogJ2NoYWxsZW5nZScsCiAgICBvbmJvYXJkaW5nOiAnb25ib2FyZGluZycsCiAgICBhdXRoOiAnYXV0aCcKICB9OwoKICB2YXIgTkFWX0lURU1TID0gWwogICAgeyByb3V0ZTogJ2NyZWF0ZScsIGxhYmVsOiAnQ3JlYXRlJywgaWNvbjogJ3NwYXJrbGVzJyB9LAogICAgeyByb3V0ZTogJ2luc3BpcmF0aW9uJywgbGFiZWw6ICdFeHBsb3JlJywgaWNvbjogJ2dyaWQnIH0sCiAgICB7IHJvdXRlOiAnbGlicmFyeScsIGxhYmVsOiAnTGlicmFyeScsIGljb246ICdwaG90b1N0YWNrJyB9CiAgXTsKCiAgdmFyIGFwcFJvb3QgPSBudWxsOwogIHZhciBvdXRsZXRFbCA9IG51bGw7CiAgdmFyIHRvcGJhckVsID0gbnVsbDsKICB2YXIgYm90dG9tYmFyRWwgPSBudWxsOwogIHZhciBkcmF3ZXJFbCA9IG51bGw7CiAgdmFyIGRyYXdlclNjcmltRWwgPSBudWxsOwogIHZhciBvdmVybGF5SG9zdEVsID0gbnVsbDsKCiAgdmFyIGN1cnJlbnRCYXNlVmlldyA9IG51bGw7CiAgdmFyIGN1cnJlbnRPdmVybGF5VmlldyA9IG51bGw7CiAgdmFyIGxhc3RGb2N1c0JlZm9yZURyYXdlciA9IG51bGw7CiAgdmFyIGJvb3RpbmcgPSB0cnVlOwogIHZhciBuYXZpZ2F0aW5nID0gZmFsc2U7CgogIGZ1bmN0aW9uIHNhZmVVdGlsKCkgewogICAgcmV0dXJuIFYudXRpbCAmJiB0eXBlb2YgVi51dGlsID09PSAnb2JqZWN0JyA/IFYudXRpbCA6IHt9OwogIH0KCiAgZnVuY3Rpb24gZWwodGFnLCBhdHRycykgewogICAgdmFyIGNoaWxkcmVuID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBWLnVpLmVsLmFwcGx5KG51bGwsIFt0YWcsIGF0dHJzXS5jb25jYXQoY2hpbGRyZW4pKTsKICAgIH0KICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgaWYgKGF0dHJzKSB7CiAgICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgaykpIGNvbnRpbnVlOwogICAgICAgIHZhciB2YWwgPSBhdHRyc1trXTsKICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZSkgY29udGludWU7CiAgICAgICAgaWYgKGsgPT09ICdjbGFzcycgfHwgayA9PT0gJ2NsYXNzTmFtZScpIG5vZGUuY2xhc3NOYW1lID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICd0ZXh0Jykgbm9kZS50ZXh0Q29udGVudCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAnaHRtbCcpIG5vZGUuaW5uZXJIVE1MID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICdzdHlsZScgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgIGZvciAodmFyIHMgaW4gdmFsKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbCwgcykpIG5vZGUuc3R5bGVbc10gPSB2YWxbc107CiAgICAgICAgfSBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGsuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgdmFsKTsKICAgICAgICB9IGVsc2UgaWYgKGsuaW5kZXhPZignZGF0YS0nKSA9PT0gMCB8fCBrLmluZGV4T2YoJ2FyaWEtJykgPT09IDApIHsKICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRyeSB7IG5vZGVba10gPSB2YWw7IH0gY2F0Y2ggKGUpIHsgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdmFsKTsgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXBwZW5kQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW4pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiBhcHBlbmRDaGlsZHJlbihub2RlLCBjaGlsZHJlbikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldOwogICAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlKSBjb250aW51ZTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHsgYXBwZW5kQ2hpbGRyZW4obm9kZSwgYyk7IGNvbnRpbnVlOyB9CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoYy5ub2RlVHlwZSA/IGMgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGljb24obmFtZSkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaWNvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgciA9IFYudWkuaWNvbihuYW1lKTsKICAgICAgaWYgKHIgJiYgci5ub2RlVHlwZSkgcmV0dXJuIHI7CiAgICAgIGlmICh0eXBlb2YgciA9PT0gJ3N0cmluZycpIHsKICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICBzcGFuLmNsYXNzTmFtZSA9ICd2LWljbyc7CiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICBzcGFuLmlubmVySFRNTCA9IHI7CiAgICAgICAgcmV0dXJuIHNwYW47CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxsYmFja0ljb24obmFtZSk7CiAgfQoKICBmdW5jdGlvbiBmYWxsYmFja0ljb24obmFtZSkgewogICAgdmFyIHBhdGhzID0gewogICAgICBzcGFya2xlczoKICAgICAgICAnPHBhdGggZD0iTTEyIDNsMS42IDQuNEwxOCA5bC00LjQgMS42TDEyIDE1bC0xLjYtNC40TDYgOWw0LjQtMS42TDEyIDN6Ii8+PHBhdGggZD0iTTE5IDE0bC44IDIuMkwyMiAxN2wtMi4yLjhMMTkgMjBsLS44LTIuMkwxNiAxN2wyLjItLjhMMTkgMTR6Ii8+JywKICAgICAgcGhvdG9TdGFjazoKICAgICAgICAnPHJlY3QgeD0iMyIgeT0iNiIgd2lkdGg9IjE4IiBoZWlnaHQ9IjEzIiByeD0iMiIvPjxwYXRoIGQ9Ik0zIDE2bDQuNS00IDQgMy41TDE1IDExbDYgNSIvPjxjaXJjbGUgY3g9IjkiIGN5PSIxMC41IiByPSIxLjQiLz48cGF0aCBkPSJNNiAzLjVoMTIiLz4nLAogICAgICBtZW51OiAnPHBhdGggZD0iTTQgN2gxNk00IDEyaDE2TTQgMTdoMTYiLz4nLAogICAgICBjbG9zZTogJzxwYXRoIGQ9Ik02IDZsMTIgMTJNMTggNkw2IDE4Ii8+JywKICAgICAgYm9sdDogJzxwYXRoIGQ9Ik0xMyAyTDQuNSAxM0gxMWwtMSA5IDguNS0xMUgxMmwxLTl6Ii8+JywKICAgICAgY3JlZGl0czogJzxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjkiLz48cGF0aCBkPSJNMTUgOS41YTMgMyAwIDAgMC02IC41YzAgMyA2IDEuNSA2IDQuNWEzIDMgMCAwIDEtNiAuNSIvPjxwYXRoIGQ9Ik0xMiA2LjV2MTEiLz4nCiAgICB9OwogICAgdmFyIGQgPSBwYXRoc1tuYW1lXSB8fCBwYXRocy5zcGFya2xlczsKICAgIHZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgc3Bhbi5jbGFzc05hbWUgPSAndi1pY28nOwogICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIHNwYW4uaW5uZXJIVE1MID0KICAgICAgJzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiAnICsKICAgICAgJ3N0cm9rZS13aWR0aD0iMS43IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPicgKyBkICsgJzwvc3ZnPic7CiAgICByZXR1cm4gc3BhbjsKICB9CgogIGZ1bmN0aW9uIHRvYXN0KG1zZywga2luZCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkudG9hc3QgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgVi51aS50b2FzdChtc2csIGtpbmQpOyByZXR1cm47IH0gY2F0Y2ggKGUpIHt9IH0KICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLnRvYXN0ID09PSAnZnVuY3Rpb24nKSB7IFYuc3RvcmUudG9hc3QobXNnLCBraW5kKTsgcmV0dXJuOyB9CiAgICBpZiAod2luZG93LmNvbnNvbGUpIGNvbnNvbGUubG9nKCdbdG9hc3RdJywga2luZCB8fCAnaW5mbycsIG1zZyk7CiAgfQoKICBmdW5jdGlvbiBlc2NhcGVIdG1sKHMpIHsKICAgIHZhciB1ID0gc2FmZVV0aWwoKTsKICAgIGlmICh0eXBlb2YgdS5lc2NhcGVIdG1sID09PSAnZnVuY3Rpb24nKSByZXR1cm4gdS5lc2NhcGVIdG1sKHMpOwogICAgcmV0dXJuIFN0cmluZyhzID09IG51bGwgPyAnJyA6IHMpLnJlcGxhY2UoL1smPD4iJ10vZywgZnVuY3Rpb24gKGMpIHsKICAgICAgcmV0dXJuIHsgJyYnOiAnJmFtcDsnLCAnPCc6ICcmbHQ7JywgJz4nOiAnJmd0OycsICciJzogJyZxdW90OycsICInIjogJyYjMzk7JyB9W2NdOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBwYXJzZShoYXNoU3RyKSB7CiAgICB2YXIgcmF3ID0gaGFzaFN0ciAhPSBudWxsID8gU3RyaW5nKGhhc2hTdHIpIDogKHdpbmRvdy5sb2NhdGlvbi5oYXNoIHx8ICcnKTsKICAgIHZhciBoID0gcmF3LmNoYXJBdCgwKSA9PT0gJyMnID8gcmF3LnNsaWNlKDEpIDogcmF3OwogICAgaWYgKGguY2hhckF0KDApID09PSAnLycpIGggPSBoLnNsaWNlKDEpOwoKICAgIHZhciBxSW5kZXggPSBoLmluZGV4T2YoJz8nKTsKICAgIHZhciBwYXRoUGFydCA9IHFJbmRleCA9PT0gLTEgPyBoIDogaC5zbGljZSgwLCBxSW5kZXgpOwogICAgdmFyIHF1ZXJ5UGFydCA9IHFJbmRleCA9PT0gLTEgPyAnJyA6IGguc2xpY2UocUluZGV4ICsgMSk7CgogICAgdmFyIHNlZ21lbnRzID0gcGF0aFBhcnQuc3BsaXQoJy8nKS5maWx0ZXIoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMubGVuZ3RoID4gMDsgfSk7CiAgICB2YXIgcm91dGUgPSBzZWdtZW50cy5sZW5ndGggPyBkZWNvZGVVUklDb21wb25lbnQoc2VnbWVudHNbMF0pIDogREVGQVVMVF9ST1VURTsKICAgIGlmICghcm91dGUpIHJvdXRlID0gREVGQVVMVF9ST1VURTsKCiAgICB2YXIgcGFyYW1zID0gcGFyc2VRdWVyeShxdWVyeVBhcnQpOwoKICAgIGlmIChyb3V0ZSA9PT0gJ2ltYWdlJykgewogICAgICBwYXJhbXMuaWQgPSBzZWdtZW50c1sxXSA/IGRlY29kZVVSSUNvbXBvbmVudChzZWdtZW50c1sxXSkgOiBwYXJhbXMuaWQgfHwgJyc7CiAgICAgIHBhcmFtcy5fX292ZXJsYXkgPSAnc3R1ZGlvJzsKICAgIH0gZWxzZSBpZiAocm91dGUgPT09ICdpbnNwaXJhdGlvbicgfHwgcm91dGUgPT09ICdmZWVkJykgewogICAgICBpZiAoc2VnbWVudHNbMV0pIHBhcmFtcy5pZCA9IGRlY29kZVVSSUNvbXBvbmVudChzZWdtZW50c1sxXSk7CiAgICB9IGVsc2UgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgaWYgKHBhcmFtcy5pZCA9PSBudWxsKSBwYXJhbXMuaWQgPSBkZWNvZGVVUklDb21wb25lbnQoc2VnbWVudHNbMV0pOwogICAgfQoKICAgIHJldHVybiB7IHJvdXRlOiByb3V0ZSwgcGFyYW1zOiBwYXJhbXMsIHNlZ21lbnRzOiBzZWdtZW50cywgcGF0aDogcGF0aFBhcnQgfTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlUXVlcnkocXVlcnlQYXJ0KSB7CiAgICB2YXIgdSA9IHNhZmVVdGlsKCk7CiAgICBpZiAodHlwZW9mIHUucXMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcGFyc2VkID0gdS5xcygnIy9fPycgKyAocXVlcnlQYXJ0IHx8ICcnKSk7CiAgICAgICAgaWYgKHBhcnNlZCAmJiBwYXJzZWQucGFyYW1zICYmIHR5cGVvZiBwYXJzZWQucGFyYW1zID09PSAnb2JqZWN0JykgcmV0dXJuIHBhcnNlZC5wYXJhbXM7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9CiAgICB2YXIgb3V0ID0ge307CiAgICBpZiAoIXF1ZXJ5UGFydCkgcmV0dXJuIG91dDsKICAgIHZhciBwYWlycyA9IHF1ZXJ5UGFydC5zcGxpdCgnJicpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIXBhaXJzW2ldKSBjb250aW51ZTsKICAgICAgdmFyIGVxID0gcGFpcnNbaV0uaW5kZXhPZignPScpOwogICAgICB2YXIga2V5ID0gZXEgPT09IC0xID8gcGFpcnNbaV0gOiBwYWlyc1tpXS5zbGljZSgwLCBlcSk7CiAgICAgIHZhciB2YWwgPSBlcSA9PT0gLTEgPyAnJyA6IHBhaXJzW2ldLnNsaWNlKGVxICsgMSk7CiAgICAgIHRyeSB7IGtleSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXkucmVwbGFjZSgvXCsvZywgJyAnKSk7IH0gY2F0Y2ggKGUyKSB7fQogICAgICB0cnkgeyB2YWwgPSBkZWNvZGVVUklDb21wb25lbnQodmFsLnJlcGxhY2UoL1wrL2csICcgJykpOyB9IGNhdGNoIChlMykge30KICAgICAgaWYgKGtleSkgb3V0W2tleV0gPSB2YWw7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KCiAgZnVuY3Rpb24gY3VycmVudCgpIHsKICAgIHJldHVybiBwYXJzZSh3aW5kb3cubG9jYXRpb24uaGFzaCk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICB2YXIgdGFyZ2V0ID0gbm9ybWFsaXplSGFzaChoYXNoKTsKICAgIHZhciBjdXIgPSB3aW5kb3cubG9jYXRpb24uaGFzaCB8fCAnJzsKICAgIHZhciBjdXJOb3JtID0gbm9ybWFsaXplSGFzaChjdXIpOwogICAgaWYgKGN1ck5vcm0gPT09IHRhcmdldCkgewogICAgICBoYW5kbGVSb3V0ZSgpOwogICAgfSBlbHNlIHsKICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSB0YXJnZXQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBub3JtYWxpemVIYXNoKGhhc2gpIHsKICAgIHZhciBzID0gaGFzaCA9PSBudWxsID8gJycgOiBTdHJpbmcoaGFzaCk7CiAgICBpZiAoIXMpIHJldHVybiAnIy8nICsgREVGQVVMVF9ST1VURTsKICAgIGlmIChzLmNoYXJBdCgwKSA9PT0gJyMnKSBzID0gcy5zbGljZSgxKTsKICAgIGlmIChzLmNoYXJBdCgwKSAhPT0gJy8nKSBzID0gJy8nICsgczsKICAgIHJldHVybiAnIycgKyBzOwogIH0KCiAgVi5yb3V0ZXIgPSBPYmplY3QuYXNzaWduKFYucm91dGVyIHx8IHt9LCB7CiAgICBnbzogZ28sCiAgICBjdXJyZW50OiBjdXJyZW50LAogICAgcGFyc2U6IHBhcnNlCiAgfSk7CgogIGZ1bmN0aW9uIGJvb3QoKSB7CiAgICBhcHBSb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbXAtYXBwJyk7CiAgICBpZiAoIWFwcFJvb3QpIHsKICAgICAgYXBwUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBhcHBSb290LmlkID0gJ3ZhbXAtYXBwJzsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhcHBSb290KTsKICAgIH0KICAgIGFwcFJvb3QuY2xhc3NMaXN0LmFkZCgndi1hcHAnKTsKCiAgICB0cnkgeyBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5sb2FkID09PSAnZnVuY3Rpb24nKSBWLnN0b3JlLmxvYWQoKTsgfSBjYXRjaCAoZSkge30KCiAgICBhcHBseVRoZW1lKCk7CgogICAgYnVpbGRDaHJvbWUoKTsKICAgIHNob3dCb290TG9hZGVyKCk7CgogICAgd2lyZVN0b3JlRXZlbnRzKCk7CiAgICB3aXJlR2xvYmFsSGFuZGxlcnMoKTsKCiAgICBjYXB0dXJlR2xvYmFsSW50ZW50cygpOwoKICAgIHZhciBib290UCA9CiAgICAgIFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLmJvb3RzdHJhcCA9PT0gJ2Z1bmN0aW9uJwogICAgICAgID8gVi5hdXRoLmJvb3RzdHJhcCgpCiAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwoKICAgIGJvb3RQCiAgICAgIC50aGVuKGZ1bmN0aW9uIChhdXRoZWQpIHsKICAgICAgICBmaW5pc2hCb290KCEhYXV0aGVkKTsKICAgICAgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICBmaW5pc2hCb290KFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLmlzQXV0aGVkID09PSAnZnVuY3Rpb24nID8gVi5hdXRoLmlzQXV0aGVkKCkgOiBmYWxzZSk7CiAgICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZmluaXNoQm9vdChhdXRoZWQpIHsKICAgIGJvb3RpbmcgPSBmYWxzZTsKICAgIHRyeSB7IGlmIChWLnN0b3JlKSBWLnN0b3JlLnNldCgnYm9vdGVkJywgdHJ1ZSk7IH0gY2F0Y2ggKGUpIHt9CgogICAgdmFyIGRlc2MgPSBjdXJyZW50KCk7CiAgICB2YXIgcm91dGUgPSBkZXNjLnJvdXRlOwoKICAgIGlmICghYXV0aGVkICYmICFQVUJMSUNfUk9VVEVTW3JvdXRlXSkgewogICAgICByZXBsYWNlSGFzaCgnIy9hdXRoJyk7CiAgICB9IGVsc2UgaWYgKGF1dGhlZCAmJiByb3V0ZSA9PT0gJ2F1dGgnKSB7CiAgICAgIHJlcGxhY2VIYXNoKGxhbmRpbmdIYXNoKCkpOwogICAgfSBlbHNlIGlmIChhdXRoZWQgJiYgbmVlZHNPbmJvYXJkaW5nKCkgJiYgcm91dGUgIT09ICdvbmJvYXJkaW5nJyAmJiByb3V0ZSAhPT0gJ2F1dGgnKSB7CiAgICAgIHJlcGxhY2VIYXNoKCcjL29uYm9hcmRpbmcnKTsKICAgIH0gZWxzZSBpZiAoIWRlc2MucGF0aCB8fCByb3V0ZSA9PT0gJycpIHsKICAgICAgcmVwbGFjZUhhc2goJyMvJyArIERFRkFVTFRfUk9VVEUpOwogICAgfQoKICAgIGhhbmRsZVJvdXRlKCk7CgogICAgZmx1c2hHbG9iYWxJbnRlbnRzKGF1dGhlZCk7CiAgfQoKICBmdW5jdGlvbiBsYW5kaW5nSGFzaCgpIHsKICAgIHJldHVybiBuZWVkc09uYm9hcmRpbmcoKSA/ICcjL29uYm9hcmRpbmcnIDogJyMvJyArIERFRkFVTFRfUk9VVEU7CiAgfQoKICBmdW5jdGlvbiBuZWVkc09uYm9hcmRpbmcoKSB7CiAgICByZXR1cm4gIShWLnN0YXRlICYmIFYuc3RhdGUub25ib2FyZGluZ0RvbmUgPT09IHRydWUpOwogIH0KCiAgZnVuY3Rpb24gcmVwbGFjZUhhc2goaGFzaCkgewogICAgdmFyIHRhcmdldCA9IG5vcm1hbGl6ZUhhc2goaGFzaCk7CiAgICB0cnkgewogICAgICB2YXIgYmFzZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCcjJylbMF07CiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgYmFzZSArIHRhcmdldCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gdGFyZ2V0OwogICAgfQogIH0KCiAgZnVuY3Rpb24gaGFuZGxlUm91dGUoKSB7CiAgICBpZiAoYm9vdGluZyB8fCBuYXZpZ2F0aW5nKSByZXR1cm47CiAgICBuYXZpZ2F0aW5nID0gdHJ1ZTsKICAgIHRyeSB7CiAgICAgIHZhciBkZXNjID0gY3VycmVudCgpOwogICAgICB2YXIgcm91dGUgPSBkZXNjLnJvdXRlOwogICAgICB2YXIgcGFyYW1zID0gZGVzYy5wYXJhbXMgfHwge307CgogICAgICB2YXIgYXV0aGVkID0gVi5hdXRoICYmIHR5cGVvZiBWLmF1dGguaXNBdXRoZWQgPT09ICdmdW5jdGlvbicgPyBWLmF1dGguaXNBdXRoZWQoKSA6IGZhbHNlOwoKICAgICAgaWYgKCFhdXRoZWQgJiYgIVBVQkxJQ19ST1VURVNbcm91dGVdKSB7CiAgICAgICAgcmVwbGFjZUhhc2goJyMvYXV0aCcpOwogICAgICAgIG1vdW50QmFzZVZpZXcoJ2F1dGgnLCBjdXJyZW50KCkucGFyYW1zKTsKICAgICAgICBzeW5jQ2hyb21lKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChhdXRoZWQgJiYgcm91dGUgPT09ICdhdXRoJykgewogICAgICAgIHJlcGxhY2VIYXNoKGxhbmRpbmdIYXNoKCkpOwogICAgICAgIHZhciBsZCA9IGN1cnJlbnQoKTsKICAgICAgICBtb3VudEJhc2VWaWV3KGxkLnJvdXRlLCBsZC5wYXJhbXMpOwogICAgICAgIHN5bmNDaHJvbWUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGF1dGhlZCAmJiBuZWVkc09uYm9hcmRpbmcoKSAmJiByb3V0ZSAhPT0gJ29uYm9hcmRpbmcnKSB7CiAgICAgICAgcmVwbGFjZUhhc2goJyMvb25ib2FyZGluZycpOwogICAgICAgIG1vdW50QmFzZVZpZXcoJ29uYm9hcmRpbmcnLCB7fSk7CiAgICAgICAgc3luY0Nocm9tZSgpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgaWYgKHJvdXRlID09PSAnaW1hZ2UnKSB7CiAgICAgICAgaWYgKCFjdXJyZW50QmFzZVZpZXcpIHsKICAgICAgICAgIG1vdW50QmFzZVZpZXcoJ2xpYnJhcnknLCB7fSk7CiAgICAgICAgfQogICAgICAgIG1vdW50T3ZlcmxheSgnc3R1ZGlvJywgcGFyYW1zKTsKICAgICAgICBzeW5jQ2hyb21lKCk7CiAgICAgICAgc2V0Um91dGVTdGF0ZShyb3V0ZSwgcGFyYW1zKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmIChjdXJyZW50T3ZlcmxheVZpZXcpIGRpc21pc3NPdmVybGF5KCk7CgogICAgICB2YXIgdmlld05hbWUgPSBST1VURV9WSUVXW3JvdXRlXTsKICAgICAgaWYgKCF2aWV3TmFtZSB8fCAhVi52aWV3c1t2aWV3TmFtZV0gfHwgdHlwZW9mIFYudmlld3Nbdmlld05hbWVdLnJlbmRlciAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIG1vdW50Tm90Rm91bmQocm91dGUpOwogICAgICB9IGVsc2UgewogICAgICAgIG1vdW50QmFzZVZpZXcodmlld05hbWUsIHBhcmFtcyk7CiAgICAgIH0KCiAgICAgIGlmIChyb3V0ZSAhPT0gJ2FjY291bnQnKSBjbG9zZURyYXdlcigpOwoKICAgICAgc3luY0Nocm9tZSgpOwogICAgICBzZXRSb3V0ZVN0YXRlKHJvdXRlLCBwYXJhbXMpOwogICAgfSBmaW5hbGx5IHsKICAgICAgbmF2aWdhdGluZyA9IGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gc2V0Um91dGVTdGF0ZShyb3V0ZSwgcGFyYW1zKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdG9yZSkgewogICAgICAgIGlmIChWLnN0YXRlKSBWLnN0YXRlLnByZXZpb3VzUm91dGUgPSBWLnN0YXRlLnJvdXRlOwogICAgICAgIFYuc3RvcmUuc2V0KCdyb3V0ZScsIHJvdXRlKTsKICAgICAgICBWLnN0b3JlLnNldCgncGFyYW1zJywgcGFyYW1zIHx8IHt9KTsKICAgICAgfQogICAgfSBjYXRjaCAoZSkge30KICB9CgogIGZ1bmN0aW9uIG1vdW50QmFzZVZpZXcodmlld05hbWUsIHBhcmFtcykgewogICAgaWYgKCFvdXRsZXRFbCkgcmV0dXJuOwogICAgdmFyIHZpZXcgPSBWLnZpZXdzW3ZpZXdOYW1lXTsKICAgIGlmICghdmlldyB8fCB0eXBlb2Ygdmlldy5yZW5kZXIgIT09ICdmdW5jdGlvbicpIHsKICAgICAgbW91bnROb3RGb3VuZCh2aWV3TmFtZSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoY3VycmVudEJhc2VWaWV3ICYmIGN1cnJlbnRCYXNlVmlldyAhPT0gdmlld05hbWUpIHsKICAgICAgdmFyIHByZXYgPSBWLnZpZXdzW2N1cnJlbnRCYXNlVmlld107CiAgICAgIGlmIChwcmV2ICYmIHR5cGVvZiBwcmV2LnRlYXJkb3duID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdHJ5IHsgcHJldi50ZWFyZG93bigpOyB9IGNhdGNoIChlKSB7IGlmICh3aW5kb3cuY29uc29sZSkgY29uc29sZS5lcnJvcihlKTsgfQogICAgICB9CiAgICB9CgogICAgdmFyIHN3YXBwaW5nID0gY3VycmVudEJhc2VWaWV3ICE9PSB2aWV3TmFtZTsKICAgIGN1cnJlbnRCYXNlVmlldyA9IHZpZXdOYW1lOwoKICAgIHZhciBhbmltYXRlID0gc3dhcHBpbmcgJiYgIXByZWZlcnNSZWR1Y2VkTW90aW9uKCk7CiAgICB2YXIgZG9SZW5kZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmlldy5yZW5kZXIob3V0bGV0RWwsIHBhcmFtcyB8fCB7fSk7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIHJlbmRlclZpZXdFcnJvcihvdXRsZXRFbCwgdmlld05hbWUsIGVycik7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmVycm9yKCdbVi5yb3V0ZXJdIHZpZXcgIicgKyB2aWV3TmFtZSArICciIHJlbmRlciBmYWlsZWQ6JywgZXJyKTsKICAgICAgfQogICAgICBvdXRsZXRFbC5pZCA9ICd2LW91dGxldCc7CiAgICAgIGlmICghb3V0bGV0RWwuY2xhc3NMaXN0LmNvbnRhaW5zKCd2LW91dGxldCcpKSBvdXRsZXRFbC5jbGFzc0xpc3QuYWRkKCd2LW91dGxldCcpOwogICAgICB0cnkgeyBvdXRsZXRFbC5zY3JvbGxUb3AgPSAwOyB9IGNhdGNoIChlKSB7fQogICAgICBpZiAoYW5pbWF0ZSkgewogICAgICAgIG91dGxldEVsLmNsYXNzTGlzdC5yZW1vdmUoJ3Ytb3V0bGV0LS1sZWF2aW5nJyk7CiAgICAgICAgdm9pZCBvdXRsZXRFbC5vZmZzZXRXaWR0aDsKICAgICAgICBvdXRsZXRFbC5jbGFzc0xpc3QuYWRkKCd2LW91dGxldC0tZW50ZXJpbmcnKTsKICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBvdXRsZXRFbC5jbGFzc0xpc3QucmVtb3ZlKCd2LW91dGxldC0tZW50ZXJpbmcnKTsKICAgICAgICB9LCAyNDApOwogICAgICB9CiAgICB9OwoKICAgIGlmIChhbmltYXRlKSB7CiAgICAgIG91dGxldEVsLmNsYXNzTGlzdC5hZGQoJ3Ytb3V0bGV0LS1sZWF2aW5nJyk7CiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGRvUmVuZGVyLCA5MCk7CiAgICB9IGVsc2UgewogICAgICBkb1JlbmRlcigpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVuZGVyVmlld0Vycm9yKGhvc3QsIHZpZXdOYW1lLCBlcnIpIHsKICAgIGlmICghaG9zdCkgcmV0dXJuOwogICAgaG9zdC5pbm5lckhUTUwgPSAnJzsKICAgIHZhciBtc2cgPSAoZXJyICYmIGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogJ1RoaXMgc2NyZWVuIGZhaWxlZCB0byBsb2FkLic7CiAgICB2YXIgYm94ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5IHYtZW1wdHktLWVycm9yJywgcm9sZTogJ2FsZXJ0JyB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHlfX2ljb24nIH0sIGljb24oJ2JvbHQnKSksCiAgICAgIGVsKCdoMycsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScgfSwgJ1NvbWV0aGluZyB3ZW50IHdyb25nJyksCiAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZW1wdHlfX21zZycgfSwgZXNjYXBlSHRtbChtc2cpKSwKICAgICAgZWwoJ2J1dHRvbicsIHsKICAgICAgICBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCcsCiAgICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgeyBoYW5kbGVSb3V0ZSgpOyB9CiAgICAgIH0sICdUcnkgYWdhaW4nKQogICAgKTsKICAgIGhvc3QuYXBwZW5kQ2hpbGQoYm94KTsKICB9CgogIGZ1bmN0aW9uIG1vdW50Tm90Rm91bmQocm91dGUpIHsKICAgIGlmICghb3V0bGV0RWwpIHJldHVybjsKICAgIGlmIChjdXJyZW50QmFzZVZpZXcpIHsKICAgICAgdmFyIHByZXYgPSBWLnZpZXdzW2N1cnJlbnRCYXNlVmlld107CiAgICAgIGlmIChwcmV2ICYmIHR5cGVvZiBwcmV2LnRlYXJkb3duID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IHByZXYudGVhcmRvd24oKTsgfSBjYXRjaCAoZSkge30gfQogICAgfQogICAgY3VycmVudEJhc2VWaWV3ID0gbnVsbDsKICAgIG91dGxldEVsLmlubmVySFRNTCA9ICcnOwogICAgdmFyIGJveCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eScgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJyB9LCBpY29uKCdzcGFya2xlcycpKSwKICAgICAgZWwoJ2gzJywgeyBjbGFzczogJ3YtZW1wdHlfX3RpdGxlJyB9LCAnUGFnZSBub3QgZm91bmQnKSwKICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fbXNnJyB9LAogICAgICAgICdXZSBjb3VsZG7igJl0IGZpbmQgJywgZWwoJ2NvZGUnLCBudWxsLCAnIy8nICsgZXNjYXBlSHRtbChyb3V0ZSB8fCAnJykpLCAnLicpLAogICAgICBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnknLAogICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvJyArIERFRkFVTFRfUk9VVEUpOyB9CiAgICAgIH0sICdHbyB0byBDcmVhdGUnKQogICAgKTsKICAgIG91dGxldEVsLmFwcGVuZENoaWxkKGJveCk7CiAgfQoKICBmdW5jdGlvbiBtb3VudE92ZXJsYXkodmlld05hbWUsIHBhcmFtcykgewogICAgdmFyIHZpZXcgPSBWLnZpZXdzW3ZpZXdOYW1lXTsKICAgIGlmICghdmlldyB8fCB0eXBlb2Ygdmlldy5yZW5kZXIgIT09ICdmdW5jdGlvbicpIHsKICAgICAgZ28oJyMvbGlicmFyeScpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIW92ZXJsYXlIb3N0RWwpIHJldHVybjsKCiAgICB2YXIgcmVvcGVuaW5nID0gY3VycmVudE92ZXJsYXlWaWV3ICE9PSB2aWV3TmFtZTsKICAgIGN1cnJlbnRPdmVybGF5VmlldyA9IHZpZXdOYW1lOwoKICAgIG92ZXJsYXlIb3N0RWwuaW5uZXJIVE1MID0gJyc7CiAgICBvdmVybGF5SG9zdEVsLmhpZGRlbiA9IGZhbHNlOwogICAgb3ZlcmxheUhvc3RFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7CiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndi1oYXMtb3ZlcmxheScpOwoKICAgIHZhciBwYW5lbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1vdmVybGF5X19wYW5lbCcsIHJvbGU6ICdkaWFsb2cnLCAnYXJpYS1tb2RhbCc6ICd0cnVlJyB9KTsKICAgIHZhciBiYWNrZHJvcCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1vdmVybGF5X19iYWNrZHJvcCcsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgY2xvc2VPdmVybGF5VG9CYXNlKCk7IH0gfSk7CiAgICBvdmVybGF5SG9zdEVsLmFwcGVuZENoaWxkKGJhY2tkcm9wKTsKICAgIG92ZXJsYXlIb3N0RWwuYXBwZW5kQ2hpbGQocGFuZWwpOwoKICAgIHRyeSB7CiAgICAgIHZpZXcucmVuZGVyKHBhbmVsLCBwYXJhbXMgfHwge30pOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIHJlbmRlclZpZXdFcnJvcihwYW5lbCwgdmlld05hbWUsIGVycik7CiAgICAgIGlmICh3aW5kb3cuY29uc29sZSkgY29uc29sZS5lcnJvcignW1Yucm91dGVyXSBvdmVybGF5ICInICsgdmlld05hbWUgKyAnIiByZW5kZXIgZmFpbGVkOicsIGVycik7CiAgICB9CgogICAgaWYgKHJlb3BlbmluZyAmJiAhcHJlZmVyc1JlZHVjZWRNb3Rpb24oKSkgewogICAgICBvdmVybGF5SG9zdEVsLmNsYXNzTGlzdC5yZW1vdmUoJ3Ytb3ZlcmxheS0taW4nKTsKICAgICAgdm9pZCBvdmVybGF5SG9zdEVsLm9mZnNldFdpZHRoOwogICAgICBvdmVybGF5SG9zdEVsLmNsYXNzTGlzdC5hZGQoJ3Ytb3ZlcmxheS0taW4nKTsKICAgIH0gZWxzZSB7CiAgICAgIG92ZXJsYXlIb3N0RWwuY2xhc3NMaXN0LmFkZCgndi1vdmVybGF5LS1pbicpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZGlzbWlzc092ZXJsYXkoKSB7CiAgICBpZiAoIWN1cnJlbnRPdmVybGF5VmlldykgcmV0dXJuOwogICAgdmFyIHZpZXcgPSBWLnZpZXdzW2N1cnJlbnRPdmVybGF5Vmlld107CiAgICBpZiAodmlldyAmJiB0eXBlb2Ygdmlldy50ZWFyZG93biA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgeyB2aWV3LnRlYXJkb3duKCk7IH0gY2F0Y2ggKGUpIHsgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmVycm9yKGUpOyB9CiAgICB9CiAgICBjdXJyZW50T3ZlcmxheVZpZXcgPSBudWxsOwogICAgaWYgKG92ZXJsYXlIb3N0RWwpIHsKICAgICAgb3ZlcmxheUhvc3RFbC5jbGFzc0xpc3QucmVtb3ZlKCd2LW92ZXJsYXktLWluJyk7CiAgICAgIG92ZXJsYXlIb3N0RWwuaW5uZXJIVE1MID0gJyc7CiAgICAgIG92ZXJsYXlIb3N0RWwuaGlkZGVuID0gdHJ1ZTsKICAgICAgb3ZlcmxheUhvc3RFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIH0KICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd2LWhhcy1vdmVybGF5Jyk7CiAgfQoKICBmdW5jdGlvbiBjbG9zZU92ZXJsYXlUb0Jhc2UoKSB7CiAgICB2YXIgYmFjayA9ICcjLycgKyAoY3VycmVudEJhc2VWaWV3ID8gcm91dGVGb3JWaWV3KGN1cnJlbnRCYXNlVmlldykgOiAnbGlicmFyeScpOwogICAgZ28oYmFjayk7CiAgfQoKICBmdW5jdGlvbiByb3V0ZUZvclZpZXcodmlld05hbWUpIHsKICAgIGZvciAodmFyIHIgaW4gUk9VVEVfVklFVykgewogICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFJPVVRFX1ZJRVcsIHIpICYmIFJPVVRFX1ZJRVdbcl0gPT09IHZpZXdOYW1lKSByZXR1cm4gcjsKICAgIH0KICAgIHJldHVybiB2aWV3TmFtZTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkQ2hyb21lKCkgewogICAgaWYgKCFhcHBSb290KSByZXR1cm47CiAgICBhcHBSb290LmlubmVySFRNTCA9ICcnOwoKICAgIHZhciBiZyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1iZycsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKCiAgICB0b3BiYXJFbCA9IGJ1aWxkVG9wQmFyKCk7CgogICAgb3V0bGV0RWwgPSBlbCgnbWFpbicsIHsgaWQ6ICd2LW91dGxldCcsIGNsYXNzOiAndi1vdXRsZXQnLCByb2xlOiAnbWFpbicsIHRhYkluZGV4OiAtMSB9KTsKCiAgICBib3R0b21iYXJFbCA9IGJ1aWxkQm90dG9tQmFyKCk7CgogICAgZHJhd2VyU2NyaW1FbCA9IGVsKCdkaXYnLCB7CiAgICAgIGNsYXNzOiAndi1zY3JpbScsCiAgICAgIGhpZGRlbjogdHJ1ZSwKICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgeyBjbG9zZURyYXdlcigpOyB9CiAgICB9KTsKICAgIGRyYXdlckVsID0gZWwoJ2FzaWRlJywgewogICAgICBjbGFzczogJ3YtZHJhd2VyJywKICAgICAgaWQ6ICd2LWFjY291bnQtZHJhd2VyJywKICAgICAgcm9sZTogJ2RpYWxvZycsCiAgICAgICdhcmlhLW1vZGFsJzogJ3RydWUnLAogICAgICAnYXJpYS1sYWJlbCc6ICdBY2NvdW50IG1lbnUnLAogICAgICBoaWRkZW46IHRydWUKICAgIH0pOwoKICAgIG92ZXJsYXlIb3N0RWwgPSBlbCgnZGl2JywgewogICAgICBjbGFzczogJ3Ytb3ZlcmxheScsCiAgICAgIGlkOiAndi1zdHVkaW8tb3ZlcmxheScsCiAgICAgIGhpZGRlbjogdHJ1ZSwKICAgICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnCiAgICB9KTsKCiAgICBhcHBSb290LmFwcGVuZENoaWxkKGJnKTsKICAgIGFwcFJvb3QuYXBwZW5kQ2hpbGQodG9wYmFyRWwpOwogICAgYXBwUm9vdC5hcHBlbmRDaGlsZChvdXRsZXRFbCk7CiAgICBhcHBSb290LmFwcGVuZENoaWxkKGJvdHRvbWJhckVsKTsKICAgIGFwcFJvb3QuYXBwZW5kQ2hpbGQoZHJhd2VyU2NyaW1FbCk7CiAgICBhcHBSb290LmFwcGVuZENoaWxkKGRyYXdlckVsKTsKICAgIGFwcFJvb3QuYXBwZW5kQ2hpbGQob3ZlcmxheUhvc3RFbCk7CiAgfQoKICBmdW5jdGlvbiBidWlsZFRvcEJhcigpIHsKICAgIHZhciBiYXIgPSBlbCgnaGVhZGVyJywgeyBjbGFzczogJ3YtdG9wYmFyIGxpcXVpZC1nbGFzcyBsaXF1aWQtZ2xhc3MtbmF2IGdsYXNzLW5hdicsIHJvbGU6ICdiYW5uZXInIH0pOwoKICAgIHZhciB3b3JkbWFyayA9IGVsKCdhJywgewogICAgICBjbGFzczogJ3Ytd29yZG1hcmsnLAogICAgICBocmVmOiAnIy9jcmVhdGUnLAogICAgICAnYXJpYS1sYWJlbCc6ICdWYW1wIOKAlCBnbyB0byBDcmVhdGUnLAogICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGdvKCcjL2NyZWF0ZScpOyB9CiAgICB9LCBlbCgnaW1nJywgeyBjbGFzczogJ3Ytd29yZG1hcmtfX2ltZycsIHNyYzogVi5MT0dPX1dPUkRNQVJLLCBhbHQ6ICdWYW1wJywgd2lkdGg6IDE4MCwgaGVpZ2h0OiAyOCwgZGVjb2Rpbmc6ICdhc3luYycgfSkpOwoKICAgIHZhciBuYXYgPSBlbCgnbmF2JywgeyBjbGFzczogJ3YtdG9wbmF2JywgJ2FyaWEtbGFiZWwnOiAnUHJpbWFyeScgfSk7CiAgICBOQVZfSVRFTVMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICB2YXIgbGluayA9IGVsKCdhJywgewogICAgICAgIGNsYXNzOiAndi10b3BuYXZfX2l0ZW0nLAogICAgICAgIGhyZWY6ICcjLycgKyBpdGVtLnJvdXRlLAogICAgICAgICdkYXRhLXJvdXRlJzogaXRlbS5yb3V0ZSwKICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGdvKCcjLycgKyBpdGVtLnJvdXRlKTsgfQogICAgICB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtdGFiX19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oaXRlbS5pY29uKSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi10b3BuYXZfX2xhYmVsJyB9LCBpdGVtLmxhYmVsKSk7CiAgICAgIG5hdi5hcHBlbmRDaGlsZChsaW5rKTsKICAgIH0pOwoKICAgIHZhciBjcmVkaXRzQnRuID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6ICd2LWNyZWRpdHMnLAogICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgJ2FyaWEtbGFiZWwnOiAnQ3JlZGl0cyDigJQgYWRkIG1vcmUnLAogICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IGdvKCcjL3BheXdhbGwnKTsgfQogICAgfSk7CiAgICBjcmVkaXRzQnRuLmFwcGVuZENoaWxkKGNyZWRpdHNQaWxsQ29udGVudChjdXJyZW50Q3JlZGl0cygpKSk7CgogICAgdmFyIGhhbWJ1cmdlciA9IGVsKCdidXR0b24nLCB7CiAgICAgIGNsYXNzOiAndi1oYW1idXJnZXIgZ2xhc3MtYnV0dG9uJywKICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICdhcmlhLWxhYmVsJzogJ0FjY291bnQgbWVudScsCiAgICAgICdhcmlhLWhhc3BvcHVwJzogJ2RpYWxvZycsCiAgICAgICdhcmlhLWV4cGFuZGVkJzogJ2ZhbHNlJywKICAgICAgJ2FyaWEtY29udHJvbHMnOiAndi1hY2NvdW50LWRyYXdlcicsCiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgdG9nZ2xlRHJhd2VyKCk7IH0KICAgIH0sIGljb24oJ21lbnUnKSk7CgogICAgdmFyIHJpZ2h0ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXRvcGJhcl9fcmlnaHQnIH0sIGNyZWRpdHNCdG4sIGhhbWJ1cmdlcik7CgogICAgYmFyLmFwcGVuZENoaWxkKHdvcmRtYXJrKTsKICAgIGJhci5hcHBlbmRDaGlsZChuYXYpOwogICAgYmFyLmFwcGVuZENoaWxkKHJpZ2h0KTsKCiAgICBiYXIuX19jcmVkaXRzQnRuID0gY3JlZGl0c0J0bjsKICAgIGJhci5fX2hhbWJ1cmdlciA9IGhhbWJ1cmdlcjsKICAgIGJhci5fX25hdiA9IG5hdjsKICAgIHJldHVybiBiYXI7CiAgfQoKICBmdW5jdGlvbiBjcmVkaXRzUGlsbENvbnRlbnQobikgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuY3JlZGl0c1BpbGwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIG5vZGUgPSBWLnVpLmNyZWRpdHNQaWxsKG4pOwogICAgICBpZiAobm9kZSAmJiBub2RlLm5vZGVUeXBlKSByZXR1cm4gbm9kZTsKICAgIH0KICAgIHZhciB3cmFwID0gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVkaXRzX19pbm5lcicgfSwKICAgICAgaWNvbignYm9sdCcpLAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHNfX251bScgfSwgZm9ybWF0Q3JlZGl0cyhuKSksCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3JlZGl0c19fbGFiZWwnIH0sICdjcmVkaXRzJykKICAgICk7CiAgICByZXR1cm4gd3JhcDsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkQm90dG9tQmFyKCkgewogICAgdmFyIGJhciA9IGVsKCduYXYnLCB7IGNsYXNzOiAndi1ib3R0b21iYXIgbGlxdWlkLWdsYXNzIGdsYXNzLW5hdicsICdhcmlhLWxhYmVsJzogJ1ByaW1hcnknIH0pOwogICAgTkFWX0lURU1TLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgdmFyIHRhYiA9IGVsKCdidXR0b24nLCB7CiAgICAgICAgY2xhc3M6ICd2LXRhYicsCiAgICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgJ2RhdGEtcm91dGUnOiBpdGVtLnJvdXRlLAogICAgICAgICdhcmlhLWxhYmVsJzogaXRlbS5sYWJlbCwKICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IGdvKCcjLycgKyBpdGVtLnJvdXRlKTsgfQogICAgICB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtdGFiX19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oaXRlbS5pY29uKSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi10YWJfX2xhYmVsJyB9LCBpdGVtLmxhYmVsKSk7CiAgICAgIGJhci5hcHBlbmRDaGlsZCh0YWIpOwogICAgfSk7CiAgICByZXR1cm4gYmFyOwogIH0KCiAgZnVuY3Rpb24gYnVpbGREcmF3ZXJIZWFkZXIoKSB7CiAgICB2YXIgdSA9IFYuc3RhdGUgJiYgVi5zdGF0ZS51c2VyOwogICAgdmFyIG5hbWUgPSAodSAmJiAodS5kaXNwbGF5TmFtZSB8fCB1Lm5hbWUgfHwgdS51c2VybmFtZSkpIHx8ICdBY2NvdW50JzsKICAgIHZhciBlbWFpbCA9ICh1ICYmIHUuZW1haWwpIHx8ICcnOwoKICAgIHZhciBhdmF0YXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZHJhd2VyX19hdmF0YXInLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSwKICAgICAgZWwoJ3NwYW4nLCBudWxsLCBpbml0aWFsc0Zvcih1KSkpOwogICAgaWYgKHUgJiYgdS5wcm9maWxlUGljVVJMKSB7CiAgICAgIGF2YXRhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2F2YXRhcicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9LAogICAgICAgIGVsKCdpbWcnLCB7IHNyYzogdS5wcm9maWxlUGljVVJMLCBhbHQ6ICcnLCBsb2FkaW5nOiAnbGF6eScgfSkpOwogICAgfQoKICAgIHZhciBpZGVudCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2lkZW50JyB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZHJhd2VyX19uYW1lJyB9LCBlc2NhcGVIdG1sKG5hbWUpKSwKICAgICAgZW1haWwgPyBlbCgnZGl2JywgeyBjbGFzczogJ3YtZHJhd2VyX19lbWFpbCcgfSwgZXNjYXBlSHRtbChlbWFpbCkpIDogbnVsbCk7CgogICAgdmFyIGNsb3NlQnRuID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6ICd2LWRyYXdlcl9fY2xvc2UnLAogICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgJ2FyaWEtbGFiZWwnOiAnQ2xvc2UgbWVudScsCiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgY2xvc2VEcmF3ZXIoKTsgfQogICAgfSwgaWNvbignY2xvc2UnKSk7CgogICAgcmV0dXJuIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2hlYWRlcicgfSwgYXZhdGFyLCBpZGVudCwgY2xvc2VCdG4pOwogIH0KCiAgZnVuY3Rpb24gaW5pdGlhbHNGb3IodSkgewogICAgaWYgKCF1KSByZXR1cm4gJ+KcqCc7CiAgICB2YXIgc3JjID0gdS5kaXNwbGF5TmFtZSB8fCB1Lm5hbWUgfHwgdS51c2VybmFtZSB8fCB1LmVtYWlsIHx8ICcnOwogICAgdmFyIHBhcnRzID0gU3RyaW5nKHNyYykudHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoQm9vbGVhbik7CiAgICBpZiAoIXBhcnRzLmxlbmd0aCkgcmV0dXJuICfinKgnOwogICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHBhcnRzWzBdLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpOwogICAgcmV0dXJuIChwYXJ0c1swXS5jaGFyQXQoMCkgKyBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXS5jaGFyQXQoMCkpLnRvVXBwZXJDYXNlKCk7CiAgfQoKICBmdW5jdGlvbiBvcGVuRHJhd2VyKCkgewogICAgaWYgKCFkcmF3ZXJFbCkgcmV0dXJuOwogICAgbGFzdEZvY3VzQmVmb3JlRHJhd2VyID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCiAgICBkcmF3ZXJFbC5pbm5lckhUTUwgPSAnJzsKICAgIGRyYXdlckVsLmFwcGVuZENoaWxkKGJ1aWxkRHJhd2VySGVhZGVyKCkpOwogICAgdmFyIGJvZHkgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZHJhd2VyX19ib2R5JyB9KTsKICAgIGRyYXdlckVsLmFwcGVuZENoaWxkKGJvZHkpOwoKICAgIGlmIChWLnZpZXdzLmFjY291bnQgJiYgdHlwZW9mIFYudmlld3MuYWNjb3VudC5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdHJ5IHsKICAgICAgICBWLnZpZXdzLmFjY291bnQucmVuZGVyKGJvZHksIGN1cnJlbnQoKS5wYXJhbXMpOwogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICByZW5kZXJWaWV3RXJyb3IoYm9keSwgJ2FjY291bnQnLCBlcnIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBib2R5LmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtZHJhd2VyX19lbXB0eScgfSwgJ0FjY291bnQgbWVudSB1bmF2YWlsYWJsZS4nKSk7CiAgICB9CgogICAgZHJhd2VyRWwuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9fZm9vdGVyJyB9LAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWRyYXdlcl9fYnJhbmQgdi1ncmFkaWVudCcgfSwgJ1Zvb3NleScpLAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWRyYXdlcl9fY29weScgfSwKICAgICAgICAnwqkgJyArIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSArICcgVm9vc2V5IExMQyDigKIgQWxsIFJpZ2h0cyBSZXNlcnZlZCcpKSk7CgogICAgZHJhd2VyU2NyaW1FbC5oaWRkZW4gPSBmYWxzZTsKICAgIGRyYXdlckVsLmhpZGRlbiA9IGZhbHNlOwogICAgdm9pZCBkcmF3ZXJFbC5vZmZzZXRXaWR0aDsKICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd2LWRyYXdlci1vcGVuJyk7CiAgICBkcmF3ZXJTY3JpbUVsLmNsYXNzTGlzdC5hZGQoJ3Ytc2NyaW0tLWluJyk7CiAgICBkcmF3ZXJFbC5jbGFzc0xpc3QuYWRkKCd2LWRyYXdlci0taW4nKTsKCiAgICBpZiAoVi5zdG9yZSkgVi5zdG9yZS5zZXQoJ2RyYXdlck9wZW4nLCB0cnVlKTsKICAgIGlmICh0b3BiYXJFbCAmJiB0b3BiYXJFbC5fX2hhbWJ1cmdlcikgdG9wYmFyRWwuX19oYW1idXJnZXIuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTsKCiAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBmb2N1c2FibGUgPSBkcmF3ZXJFbC5xdWVyeVNlbGVjdG9yKCdidXR0b24sIGEsIGlucHV0LCBbdGFiaW5kZXhdJyk7CiAgICAgIGlmIChmb2N1c2FibGUpIHRyeSB7IGZvY3VzYWJsZS5mb2N1cygpOyB9IGNhdGNoIChlKSB7fQogICAgfSwgNjApOwogIH0KCiAgZnVuY3Rpb24gY2xvc2VEcmF3ZXIoKSB7CiAgICBpZiAoIWRyYXdlckVsIHx8IGRyYXdlckVsLmhpZGRlbikgcmV0dXJuOwogICAgZHJhd2VyRWwuY2xhc3NMaXN0LnJlbW92ZSgndi1kcmF3ZXItLWluJyk7CiAgICBkcmF3ZXJTY3JpbUVsLmNsYXNzTGlzdC5yZW1vdmUoJ3Ytc2NyaW0tLWluJyk7CiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndi1kcmF3ZXItb3BlbicpOwogICAgaWYgKHRvcGJhckVsICYmIHRvcGJhckVsLl9faGFtYnVyZ2VyKSB0b3BiYXJFbC5fX2hhbWJ1cmdlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTsKICAgIGlmIChWLnN0b3JlKSBWLnN0b3JlLnNldCgnZHJhd2VyT3BlbicsIGZhbHNlKTsKCiAgICB2YXIgZmluYWxpemUgPSBmdW5jdGlvbiAoKSB7CiAgICAgIGRyYXdlckVsLmhpZGRlbiA9IHRydWU7CiAgICAgIGRyYXdlclNjcmltRWwuaGlkZGVuID0gdHJ1ZTsKICAgICAgZHJhd2VyRWwuaW5uZXJIVE1MID0gJyc7CiAgICB9OwogICAgaWYgKHByZWZlcnNSZWR1Y2VkTW90aW9uKCkpIGZpbmFsaXplKCk7CiAgICBlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZpbmFsaXplLCAyNjApOwoKICAgIGlmIChsYXN0Rm9jdXNCZWZvcmVEcmF3ZXIgJiYgdHlwZW9mIGxhc3RGb2N1c0JlZm9yZURyYXdlci5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgeyBsYXN0Rm9jdXNCZWZvcmVEcmF3ZXIuZm9jdXMoKTsgfSBjYXRjaCAoZSkge30KICAgIH0KICAgIGxhc3RGb2N1c0JlZm9yZURyYXdlciA9IG51bGw7CiAgfQoKICBmdW5jdGlvbiB0b2dnbGVEcmF3ZXIoKSB7CiAgICBpZiAoZHJhd2VyRWwgJiYgIWRyYXdlckVsLmhpZGRlbikgY2xvc2VEcmF3ZXIoKTsKICAgIGVsc2Ugb3BlbkRyYXdlcigpOwogIH0KCiAgZnVuY3Rpb24gc3luY0Nocm9tZSgpIHsKICAgIGlmICghYXBwUm9vdCkgcmV0dXJuOwogICAgdmFyIGRlc2MgPSBjdXJyZW50KCk7CiAgICB2YXIgcm91dGUgPSBkZXNjLnJvdXRlOwogICAgdmFyIGJhcmVWaWV3ID0gcm91dGUgPT09ICdhdXRoJyB8fCByb3V0ZSA9PT0gJ29uYm9hcmRpbmcnOwogICAgdmFyIG92ZXJsYXlBY3RpdmUgPSAhIWN1cnJlbnRPdmVybGF5VmlldzsKCiAgICBhcHBSb290LmNsYXNzTGlzdC50b2dnbGUoJ3YtYXBwLS1iYXJlJywgYmFyZVZpZXcpOwoKICAgIGlmICh0b3BiYXJFbCkgdG9wYmFyRWwuaGlkZGVuID0gYmFyZVZpZXc7CiAgICBpZiAoYm90dG9tYmFyRWwpIGJvdHRvbWJhckVsLmhpZGRlbiA9IGJhcmVWaWV3IHx8IG92ZXJsYXlBY3RpdmU7CgogICAgdmFyIGFjdGl2ZVJvdXRlID0gcm91dGUgPT09ICdpbWFnZScgPyByb3V0ZUZvclZpZXcoY3VycmVudEJhc2VWaWV3IHx8ICdsaWJyYXJ5JykgOiByb3V0ZTsKICAgIHNldEFjdGl2ZU5hdihhY3RpdmVSb3V0ZSk7CgogICAgcmVmcmVzaENyZWRpdHNQaWxsKCk7CiAgfQoKICBmdW5jdGlvbiBzZXRBY3RpdmVOYXYoYWN0aXZlUm91dGUpIHsKICAgIGlmIChib3R0b21iYXJFbCkgewogICAgICB2YXIgdGFicyA9IGJvdHRvbWJhckVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy52LXRhYicpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgciA9IHRhYnNbaV0uZ2V0QXR0cmlidXRlKCdkYXRhLXJvdXRlJyk7CiAgICAgICAgdmFyIG9uID0gciA9PT0gYWN0aXZlUm91dGU7CiAgICAgICAgdGFic1tpXS5jbGFzc0xpc3QudG9nZ2xlKCd2LXRhYi0tYWN0aXZlJywgb24pOwogICAgICAgIGlmIChvbikgdGFic1tpXS5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICdwYWdlJyk7CiAgICAgICAgZWxzZSB0YWJzW2ldLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50Jyk7CiAgICAgIH0KICAgIH0KICAgIGlmICh0b3BiYXJFbCAmJiB0b3BiYXJFbC5fX25hdikgewogICAgICB2YXIgaXRlbXMgPSB0b3BiYXJFbC5fX25hdi5xdWVyeVNlbGVjdG9yQWxsKCcudi10b3BuYXZfX2l0ZW0nKTsKICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpdGVtcy5sZW5ndGg7IGorKykgewogICAgICAgIHZhciByMiA9IGl0ZW1zW2pdLmdldEF0dHJpYnV0ZSgnZGF0YS1yb3V0ZScpOwogICAgICAgIHZhciBvbjIgPSByMiA9PT0gYWN0aXZlUm91dGU7CiAgICAgICAgaXRlbXNbal0uY2xhc3NMaXN0LnRvZ2dsZSgndi10b3BuYXZfX2l0ZW0tLWFjdGl2ZScsIG9uMik7CiAgICAgICAgaWYgKG9uMikgaXRlbXNbal0uc2V0QXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnLCAncGFnZScpOwogICAgICAgIGVsc2UgaXRlbXNbal0ucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVmcmVzaENyZWRpdHNQaWxsKCkgewogICAgaWYgKCF0b3BiYXJFbCB8fCAhdG9wYmFyRWwuX19jcmVkaXRzQnRuKSByZXR1cm47CiAgICB2YXIgYnRuID0gdG9wYmFyRWwuX19jcmVkaXRzQnRuOwogICAgYnRuLmlubmVySFRNTCA9ICcnOwogICAgYnRuLmFwcGVuZENoaWxkKGNyZWRpdHNQaWxsQ29udGVudChjdXJyZW50Q3JlZGl0cygpKSk7CiAgfQoKICBmdW5jdGlvbiBjdXJyZW50Q3JlZGl0cygpIHsKICAgIHZhciBjID0gVi5zdGF0ZSA/IFYuc3RhdGUuY3JlZGl0cyA6IG51bGw7CiAgICByZXR1cm4gdHlwZW9mIGMgPT09ICdudW1iZXInID8gYyA6IDA7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRDcmVkaXRzKG4pIHsKICAgIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgIWlzRmluaXRlKG4pKSByZXR1cm4gJzAnOwogICAgdHJ5IHsgcmV0dXJuIG4udG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFN0cmluZyhuKTsgfQogIH0KCiAgZnVuY3Rpb24gc2hvd0Jvb3RMb2FkZXIoKSB7CiAgICBpZiAoIW91dGxldEVsKSByZXR1cm47CiAgICBvdXRsZXRFbC5pbm5lckhUTUwgPSAnJzsKICAgIHZhciBsb2FkZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtYm9vdCcgfSwKICAgICAgZWwoJ2ltZycsIHsgY2xhc3M6ICd2LWJvb3RfX21hcmsnLCBzcmM6IFYuTE9HT19XT1JETUFSSywgYWx0OiAnVmFtcCcgfSksCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1ib290X19zcGlubmVyJywgJ2FyaWEtbGFiZWwnOiAnTG9hZGluZycsIHJvbGU6ICdzdGF0dXMnIH0sCiAgICAgICAgVi51aSAmJiB0eXBlb2YgVi51aS5zcGlubmVyID09PSAnZnVuY3Rpb24nID8gc2FmZVNwaW5uZXIoKSA6IGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3Bpbm5lcicgfSkpCiAgICApOwogICAgb3V0bGV0RWwuYXBwZW5kQ2hpbGQobG9hZGVyKTsKICB9CgogIGZ1bmN0aW9uIHNhZmVTcGlubmVyKCkgewogICAgdHJ5IHsKICAgICAgdmFyIHMgPSBWLnVpLnNwaW5uZXIoKTsKICAgICAgaWYgKHMgJiYgcy5ub2RlVHlwZSkgcmV0dXJuIHM7CiAgICB9IGNhdGNoIChlKSB7fQogICAgcmV0dXJuIGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3Bpbm5lcicgfSk7CiAgfQoKICBmdW5jdGlvbiB3aXJlU3RvcmVFdmVudHMoKSB7CiAgICBpZiAoIVYuc3RvcmUgfHwgdHlwZW9mIFYuc3RvcmUub24gIT09ICdmdW5jdGlvbicpIHJldHVybjsKCiAgICBWLnN0b3JlLm9uKCdhdXRoOmNoYW5nZWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBhdXRoZWQgPSBWLmF1dGggJiYgdHlwZW9mIFYuYXV0aC5pc0F1dGhlZCA9PT0gJ2Z1bmN0aW9uJyA/IFYuYXV0aC5pc0F1dGhlZCgpIDogZmFsc2U7CiAgICAgIGlmICghYm9vdGluZykgewogICAgICAgIGlmICghYXV0aGVkKSB7CiAgICAgICAgICBjbG9zZURyYXdlcigpOwogICAgICAgICAgZGlzbWlzc092ZXJsYXkoKTsKICAgICAgICAgIGhhbmRsZVJvdXRlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN5bmNDaHJvbWUoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIFYuc3RvcmUub24oJ2NyZWRpdHM6Y2hhbmdlZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgcmVmcmVzaENyZWRpdHNQaWxsKCk7CiAgICB9KTsKCiAgICBWLnN0b3JlLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChwYXlsb2FkKSB7CiAgICAgIHZhciBtc2cgPSBwYXlsb2FkICYmIHBheWxvYWQubWVzc2FnZSA/IHBheWxvYWQubWVzc2FnZSA6ICdTb21ldGhpbmcgd2VudCB3cm9uZy4nOwogICAgICB0b2FzdChtc2csICdlcnJvcicpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiB3aXJlR2xvYmFsSGFuZGxlcnMoKSB7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIGZ1bmN0aW9uICgpIHsgaGFuZGxlUm91dGUoKTsgfSwgZmFsc2UpOwoKICAgIHdpbmRvdy5vbmVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UsIHNvdXJjZSwgbGluZW5vLCBjb2xubywgZXJyb3IpIHsKICAgICAgdHJ5IHsKICAgICAgICBpZiAod2luZG93LmNvbnNvbGUpIGNvbnNvbGUuZXJyb3IoJ1tWLm9uZXJyb3JdJywgbWVzc2FnZSwgZXJyb3IgfHwgJycpOwogICAgICAgIHRvYXN0KGZyaWVuZGx5RXJyb3IobWVzc2FnZSksICdlcnJvcicpOwogICAgICB9IGNhdGNoIChlKSB7fQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwoKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd1bmhhbmRsZWRyZWplY3Rpb24nLCBmdW5jdGlvbiAoZXYpIHsKICAgICAgdmFyIHJlYXNvbiA9IGV2ICYmIGV2LnJlYXNvbjsKICAgICAgdmFyIG1zZyA9IHJlYXNvbiAmJiByZWFzb24ubWVzc2FnZSA/IHJlYXNvbi5tZXNzYWdlIDogJ0EgYmFja2dyb3VuZCB0YXNrIGZhaWxlZC4nOwogICAgICBpZiAod2luZG93LmNvbnNvbGUpIGNvbnNvbGUuZXJyb3IoJ1tWLnVuaGFuZGxlZHJlamVjdGlvbl0nLCByZWFzb24gfHwgJycpOwogICAgICBpZiAocmVhc29uICYmIChyZWFzb24ubmFtZSA9PT0gJ0Fib3J0RXJyb3InIHx8IHJlYXNvbi5hYm9ydGVkID09PSB0cnVlKSkgcmV0dXJuOwogICAgICB0b2FzdChmcmllbmRseUVycm9yKG1zZyksICdlcnJvcicpOwogICAgfSk7CgogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCBmdW5jdGlvbiAoKSB7IHRvYXN0KCdZb3XigJlyZSBvZmZsaW5lLiBDaGFuZ2VzIHdpbGwgcmV0cnkuJywgJ3dhcm5pbmcnKTsgfSk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb25saW5lJywgZnVuY3Rpb24gKCkgeyB0b2FzdCgnQmFjayBvbmxpbmUuJywgJ3N1Y2Nlc3MnKTsgfSk7CgogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgfHwgZS5rZXlDb2RlID09PSAyNykgewogICAgICAgIGlmIChjdXJyZW50T3ZlcmxheVZpZXcpIHsgY2xvc2VPdmVybGF5VG9CYXNlKCk7IGUucHJldmVudERlZmF1bHQoKTsgcmV0dXJuOyB9CiAgICAgICAgaWYgKGRyYXdlckVsICYmICFkcmF3ZXJFbC5oaWRkZW4pIHsgY2xvc2VEcmF3ZXIoKTsgZS5wcmV2ZW50RGVmYXVsdCgpOyByZXR1cm47IH0KICAgICAgfQogICAgfSwgZmFsc2UpOwoKICAgIGlmICh3aW5kb3cubWF0Y2hNZWRpYSkgewogICAgICB0cnkgewogICAgICAgIHZhciBtcSA9IHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJyk7CiAgICAgICAgdmFyIG9uVGhlbWVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7IGFwcGx5VGhlbWUoKTsgfTsKICAgICAgICBpZiAobXEuYWRkRXZlbnRMaXN0ZW5lcikgbXEuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25UaGVtZUNoYW5nZSk7CiAgICAgICAgZWxzZSBpZiAobXEuYWRkTGlzdGVuZXIpIG1xLmFkZExpc3RlbmVyKG9uVGhlbWVDaGFuZ2UpOwogICAgICB9IGNhdGNoIChlKSB7fQogICAgfQogIH0KCiAgZnVuY3Rpb24gZnJpZW5kbHlFcnJvcihtc2cpIHsKICAgIHZhciBtID0gU3RyaW5nKG1zZyA9PSBudWxsID8gJycgOiBtc2cpOwogICAgaWYgKC9uZXR3b3JrfGZldGNofGxvYWQgZmFpbGVkfGZhaWxlZCB0byBmZXRjaC9pLnRlc3QobSkpIHsKICAgICAgcmV0dXJuICdOZXR3b3JrIGhpY2N1cCDigJQgcGxlYXNlIHRyeSBhZ2Fpbi4nOwogICAgfQogICAgaWYgKG0ubGVuZ3RoID4gMTYwKSBtID0gbS5zbGljZSgwLCAxNTcpICsgJ+KApic7CiAgICByZXR1cm4gbSB8fCAnU29tZXRoaW5nIHdlbnQgd3JvbmcuJzsKICB9CgogIHZhciBwZW5kaW5nUmVmZXJyYWwgPSBudWxsOwogIHZhciBwZW5kaW5nUHVyY2hhc2VTdWNjZXNzID0gZmFsc2U7CgogIGZ1bmN0aW9uIGNhcHR1cmVHbG9iYWxJbnRlbnRzKCkgewogICAgdmFyIHNlYXJjaCA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggfHwgJyc7CiAgICB2YXIgc2VhcmNoUGFyYW1zID0gcGFyc2VRdWVyeShzZWFyY2guY2hhckF0KDApID09PSAnPycgPyBzZWFyY2guc2xpY2UoMSkgOiBzZWFyY2gpOwogICAgdmFyIGhhc2hQYXJhbXMgPSBjdXJyZW50KCkucGFyYW1zIHx8IHt9OwoKICAgIHZhciByZWYgPSBzZWFyY2hQYXJhbXMuciB8fCBoYXNoUGFyYW1zLnIgfHwgbnVsbDsKICAgIGlmIChyZWYpIHBlbmRpbmdSZWZlcnJhbCA9IFN0cmluZyhyZWYpLnRyaW0oKTsKCiAgICB2YXIgcHVyY2hhc2UgPSAoc2VhcmNoUGFyYW1zLnB1cmNoYXNlIHx8IGhhc2hQYXJhbXMucHVyY2hhc2UgfHwgJycpLnRvU3RyaW5nKCk7CiAgICBpZiAocHVyY2hhc2UgPT09ICdzdWNjZXNzJykgcGVuZGluZ1B1cmNoYXNlU3VjY2VzcyA9IHRydWU7CiAgfQoKICBmdW5jdGlvbiBmbHVzaEdsb2JhbEludGVudHMoYXV0aGVkKSB7CiAgICBpZiAocGVuZGluZ1B1cmNoYXNlU3VjY2VzcykgewogICAgICBwZW5kaW5nUHVyY2hhc2VTdWNjZXNzID0gZmFsc2U7CiAgICAgIGlmIChhdXRoZWQgJiYgVi5hdXRoICYmIHR5cGVvZiBWLmF1dGgucmVmcmVzaENyZWRpdHMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBWLmF1dGgucmVmcmVzaENyZWRpdHMoKTsKICAgICAgfQogICAgICB0b2FzdCgnUHVyY2hhc2UgY29tcGxldGUg4oCUIGNyZWRpdHMgYWRkZWQhJywgJ3N1Y2Nlc3MnKTsKICAgICAgY2VsZWJyYXRlKCk7CiAgICAgIHN0cmlwR2xvYmFsUXVlcnlQYXJhbSgncHVyY2hhc2UnKTsKICAgIH0KCiAgICBpZiAocGVuZGluZ1JlZmVycmFsKSB7CiAgICAgIHZhciBjb2RlID0gcGVuZGluZ1JlZmVycmFsOwogICAgICBwZW5kaW5nUmVmZXJyYWwgPSBudWxsOwogICAgICBhdHRyaWJ1dGVSZWZlcnJhbChjb2RlLCBhdXRoZWQpOwogICAgICBzdHJpcEdsb2JhbFF1ZXJ5UGFyYW0oJ3InKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGF0dHJpYnV0ZVJlZmVycmFsKGNvZGUsIGF1dGhlZCkgewogICAgaWYgKCFjb2RlKSByZXR1cm47CiAgICBpZiAoIWF1dGhlZCkgewogICAgICB0cnkgewogICAgICAgIGlmIChWLnN0b3JlKSB7CiAgICAgICAgICB2YXIgcyA9IFYuc3RhdGUuc2V0dGluZ3MgfHwge307CiAgICAgICAgICBzLnBlbmRpbmdSZWZlcnJhbCA9IGNvZGU7CiAgICAgICAgICBWLnN0b3JlLnNldCgnc2V0dGluZ3MnLCBzKTsKICAgICAgICAgIFYuc3RvcmUuc2F2ZSgpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKFYuYXBpICYmIHR5cGVvZiBWLmFwaS5hdHRyaWJ1dGVSZWZlcnJhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBWLmFwaS5hdHRyaWJ1dGVSZWZlcnJhbChjb2RlKQogICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHRvYXN0KCdSZWZlcnJhbCBhcHBsaWVkIOKAlCB3ZWxjb21lIGFib2FyZCEnLCAnc3VjY2VzcycpOwogICAgICAgICAgY2VsZWJyYXRlKCk7CiAgICAgICAgICBpZiAoVi5hdXRoICYmIHR5cGVvZiBWLmF1dGgucmVmcmVzaENyZWRpdHMgPT09ICdmdW5jdGlvbicpIFYuYXV0aC5yZWZyZXNoQ3JlZGl0cygpOwogICAgICAgIH0pCiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNlbGVicmF0ZSgpIHsKICAgIGlmIChwcmVmZXJzUmVkdWNlZE1vdGlvbigpKSByZXR1cm47CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jb25mZXR0aSA9PT0gJ2Z1bmN0aW9uJykgeyB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9IH0KICB9CgogIGZ1bmN0aW9uIHN0cmlwR2xvYmFsUXVlcnlQYXJhbShrZXkpIHsKICAgIHRyeSB7CiAgICAgIHZhciBsb2MgPSB3aW5kb3cubG9jYXRpb247CiAgICAgIHZhciBiYXNlID0gbG9jLmhyZWYuc3BsaXQoJyMnKVswXS5zcGxpdCgnPycpWzBdOwoKICAgICAgdmFyIHNlYXJjaFBhcmFtcyA9IHBhcnNlUXVlcnkoKGxvYy5zZWFyY2ggfHwgJycpLnJlcGxhY2UoL15cPy8sICcnKSk7CiAgICAgIGRlbGV0ZSBzZWFyY2hQYXJhbXNba2V5XTsKICAgICAgdmFyIG5ld1NlYXJjaCA9IGJ1aWxkUXVlcnkoc2VhcmNoUGFyYW1zKTsKCiAgICAgIHZhciBkZXNjID0gY3VycmVudCgpOwogICAgICB2YXIgaHAgPSBPYmplY3QuYXNzaWduKHt9LCBkZXNjLnBhcmFtcyB8fCB7fSk7CiAgICAgIGRlbGV0ZSBocFtrZXldOwogICAgICBkZWxldGUgaHAuX19vdmVybGF5OwogICAgICB2YXIgaGFzaFF1ZXJ5ID0gYnVpbGRRdWVyeShocCk7CiAgICAgIHZhciBuZXdIYXNoID0gJyMvJyArIChkZXNjLnBhdGggfHwgREVGQVVMVF9ST1VURSkgKyAoaGFzaFF1ZXJ5ID8gJz8nICsgaGFzaFF1ZXJ5IDogJycpOwoKICAgICAgdmFyIG5ld1VybCA9IGJhc2UgKyAobmV3U2VhcmNoID8gJz8nICsgbmV3U2VhcmNoIDogJycpICsgbmV3SGFzaDsKICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsICcnLCBuZXdVcmwpOwogICAgfSBjYXRjaCAoZSkge30KICB9CgogIGZ1bmN0aW9uIGJ1aWxkUXVlcnkob2JqKSB7CiAgICB2YXIgcGFydHMgPSBbXTsKICAgIGZvciAodmFyIGsgaW4gb2JqKSB7CiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaykpIGNvbnRpbnVlOwogICAgICBpZiAob2JqW2tdID09IG51bGwgfHwgb2JqW2tdID09PSAnJykgeyBwYXJ0cy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrKSk7IGNvbnRpbnVlOyB9CiAgICAgIHBhcnRzLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGspICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KG9ialtrXSkpOwogICAgfQogICAgcmV0dXJuIHBhcnRzLmpvaW4oJyYnKTsKICB9CgogIGZ1bmN0aW9uIGFwcGx5VGhlbWUoKSB7CiAgICB2YXIgcHJlZiA9IChWLnN0YXRlICYmIFYuc3RhdGUuc2V0dGluZ3MgJiYgVi5zdGF0ZS5zZXR0aW5ncy50aGVtZSkgfHwgJ3N5c3RlbSc7CiAgICB2YXIgcmVzb2x2ZWQgPSBwcmVmOwogICAgaWYgKHByZWYgPT09ICdzeXN0ZW0nKSB7CiAgICAgIHJlc29sdmVkID0KICAgICAgICB3aW5kb3cubWF0Y2hNZWRpYSAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCknKS5tYXRjaGVzCiAgICAgICAgICA/ICdsaWdodCcKICAgICAgICAgIDogJ2RhcmsnOwogICAgfQogICAgdmFyIHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CiAgICByb290LnNldEF0dHJpYnV0ZSgnZGF0YS10aGVtZScsIHJlc29sdmVkKTsKICAgIHJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgndi10aGVtZS1saWdodCcsIHJlc29sdmVkID09PSAnbGlnaHQnKTsKICAgIHJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgndi10aGVtZS1kYXJrJywgcmVzb2x2ZWQgIT09ICdsaWdodCcpOwogIH0KCiAgZnVuY3Rpb24gcHJlZmVyc1JlZHVjZWRNb3Rpb24oKSB7CiAgICBpZiAoVi5zdGF0ZSAmJiBWLnN0YXRlLnNldHRpbmdzICYmIFYuc3RhdGUuc2V0dGluZ3MucmVkdWNlTW90aW9uID09PSB0cnVlKSByZXR1cm4gdHJ1ZTsKICAgIHRyeSB7CiAgICAgIHJldHVybiAhISh3aW5kb3cubWF0Y2hNZWRpYSAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSknKS5tYXRjaGVzKTsKICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9CiAgfQoKICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgYm9vdCwgeyBvbmNlOiB0cnVlIH0pOwogIH0gZWxzZSB7CiAgICB3aW5kb3cuc2V0VGltZW91dChib290LCAwKTsKICB9CgogIFYucm91dGVyLm9wZW5EcmF3ZXIgPSBvcGVuRHJhd2VyOwogIFYucm91dGVyLmNsb3NlRHJhd2VyID0gY2xvc2VEcmF3ZXI7CiAgVi5yb3V0ZXIudG9nZ2xlRHJhd2VyID0gdG9nZ2xlRHJhd2VyOwogIFYucm91dGVyLnJlZnJlc2hDaHJvbWUgPSBzeW5jQ2hyb21lOwp9KSgpOwoK";  var CSS_B64 = "";  var UNFILLED = function (t) { return !t || t.charAt(0) === "_" || t.indexOf("VAMP_") !== -1 && t.indexOf("_B64__") !== -1; };  function fatal(msg) {    try {      var m = document.getElementById("vamp-app");      if (!m) return;      m.removeAttribute("aria-busy");      m.innerHTML =        '<div class="v-boot v-boot--error" role="alert">' +          '<div class="v-boot-mark">VAMP</div>' +          '<p class="v-boot-msg"></p>' +          '<button class="v-boot-retry" type="button" onclick="location.reload()">Reload</button>' +        '</div>';      m.querySelector(".v-boot-msg").textContent = msg;    } catch (e) { /* last resort: leave the static loader */ }  }  function inject(src, kind) {    var node;    if (kind === "css") {      node = document.createElement("style");      node.textContent = src;      document.head.appendChild(node);    } else {      node = document.createElement("script");      node.textContent = src;          /* execute the decoded app bundle */      document.body.appendChild(node);    }    return node;  }  function decode(b64) {    /* atob -> UTF-8 safe decode (handles non-ASCII in the bundle) */    var bin = atob(b64), bytes = new Uint8Array(bin.length), i = 0;    for (; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);    return new TextDecoder("utf-8").decode(bytes);  }  function boot() {    try {      if (UNFILLED(APP_B64)) {        fatal("Vamp is not deployed yet — the app bundle placeholder was not replaced by the build.");        return;      }      if (!UNFILLED(CSS_B64)) { inject(decode(CSS_B64), "css"); } /* optional inlined CSS */      inject(decode(APP_B64), "js");                              /* the real app boots from here */    } catch (err) {      fatal("Vamp failed to start. " + (err && err.message ? err.message : "Unknown error") + " — try reloading.");    }  }  if (document.readyState === "loading") {    document.addEventListener("DOMContentLoaded", boot, { once: true });  } else {    boot();  }})();</script>


---


## Page Not Found

URL: https://vamp.voosey.com/404

Vamp by Voosey — page not found.

<div id="vamp-app" aria-busy="true"><div class="v-boot"><div class="v-boot-mark">VAMP</div><div class="v-boot-spin" aria-hidden="true"></div><noscript>Vamp requires JavaScript. Please enable it to revamp your space.</noscript></div></div><!--  Bootstrap loader. Single-line-safe (no `</script>` literals; the closing tag  for THIS block is a normal tag, not inside a JS string). It:    (a) optionally decodes + injects an inlined CSS bundle (),    (b) decodes the base64 app bundle (LyogVm9vc2V5V2ViIGJ1bmRsZSDigJQgZ2VuZXJhdGVkIGJ5IGRlcGxveS9idWlsZC5zaCBvbiAyMDI2LTA1LTMxVDE3OjAwOjUwWiAqLwoidXNlIHN0cmljdCI7CgovKiA9PT09PSBzcmMvanMvdXRpbC5qcyA9PT09PSAqLwoKKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwoKICBmdW5jdGlvbiBzYWZlRGVjb2RlKHMpIHsKICAgIGlmIChzID09IG51bGwpIHJldHVybiAnJzsKICAgIHRyeSB7CgogICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KFN0cmluZyhzKS5yZXBsYWNlKC9cKy9nLCAnICcpKTsKICAgIH0gY2F0Y2ggKF9lKSB7CiAgICAgIHJldHVybiBTdHJpbmcocyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBxcyhoYXNoKSB7CiAgICB2YXIgcmF3ID0gaGFzaCA9PSBudWxsID8gKHdpbmRvdy5sb2NhdGlvbiA/IHdpbmRvdy5sb2NhdGlvbi5oYXNoIDogJycpIDogU3RyaW5nKGhhc2gpOwoKICAgIHZhciBoYXNoSWR4ID0gcmF3LmluZGV4T2YoJyMnKTsKICAgIGlmIChoYXNoSWR4ICE9PSAtMSkgcmF3ID0gcmF3LnNsaWNlKGhhc2hJZHggKyAxKTsKCiAgICB2YXIgcXVlcnlTdHIgPSAnJzsKICAgIHZhciBxSWR4ID0gcmF3LmluZGV4T2YoJz8nKTsKICAgIGlmIChxSWR4ICE9PSAtMSkgewogICAgICBxdWVyeVN0ciA9IHJhdy5zbGljZShxSWR4ICsgMSk7CiAgICAgIHJhdyA9IHJhdy5zbGljZSgwLCBxSWR4KTsKICAgIH0KCiAgICB2YXIgcm91dGUgPSByYXcucmVwbGFjZSgvXlwvKy8sICcnKS5yZXBsYWNlKC9cLyskLywgJycpOwogICAgaWYgKHJvdXRlID09PSAnJykgcm91dGUgPSAnY3JlYXRlJzsKCiAgICB2YXIgcGFyYW1zID0ge307CiAgICBpZiAocXVlcnlTdHIpIHsKICAgICAgdmFyIHBhaXJzID0gcXVlcnlTdHIuc3BsaXQoJyYnKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBwYWlyID0gcGFpcnNbaV07CiAgICAgICAgaWYgKCFwYWlyKSBjb250aW51ZTsKICAgICAgICB2YXIgZXEgPSBwYWlyLmluZGV4T2YoJz0nKTsKICAgICAgICB2YXIga2V5LCB2YWw7CiAgICAgICAgaWYgKGVxID09PSAtMSkgewogICAgICAgICAga2V5ID0gc2FmZURlY29kZShwYWlyKTsKICAgICAgICAgIHZhbCA9ICcnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBrZXkgPSBzYWZlRGVjb2RlKHBhaXIuc2xpY2UoMCwgZXEpKTsKICAgICAgICAgIHZhbCA9IHNhZmVEZWNvZGUocGFpci5zbGljZShlcSArIDEpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGtleSkgcGFyYW1zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4geyByb3V0ZTogcm91dGUsIHBhcmFtczogcGFyYW1zIH07CiAgfQoKICBmdW5jdGlvbiBxc1N0cmluZyhwYXJhbXMpIHsKICAgIGlmICghcGFyYW1zKSByZXR1cm4gJyc7CiAgICB2YXIgcGFydHMgPSBbXTsKICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocGFyYW1zKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgayA9IGtleXNbaV07CiAgICAgIHZhciB2ID0gcGFyYW1zW2tdOwogICAgICBpZiAodiA9PSBudWxsKSBjb250aW51ZTsKICAgICAgcGFydHMucHVzaChlbmNvZGVVUklDb21wb25lbnQoaykgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKHYpKSk7CiAgICB9CiAgICByZXR1cm4gcGFydHMuam9pbignJicpOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRIYXNoKHJvdXRlLCBwYXJhbXMpIHsKICAgIHZhciByID0gU3RyaW5nKHJvdXRlIHx8ICdjcmVhdGUnKS5yZXBsYWNlKC9eIz9cLz8vLCAnJyk7CiAgICB2YXIgcXVlcnkgPSBxc1N0cmluZyhwYXJhbXMpOwogICAgcmV0dXJuICcjLycgKyByICsgKHF1ZXJ5ID8gJz8nICsgcXVlcnkgOiAnJyk7CiAgfQoKICBmdW5jdGlvbiBkZWJvdW5jZShmbiwgbXMsIGltbWVkaWF0ZSkgewogICAgdmFyIHdhaXQgPSB0eXBlb2YgbXMgPT09ICdudW1iZXInID8gbXMgOiAyMDA7CiAgICB2YXIgdGltZXIgPSBudWxsOwoKICAgIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHsKICAgICAgdmFyIGN0eCA9IHRoaXM7CiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzOwogICAgICB2YXIgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiB0aW1lciA9PT0gbnVsbDsKCiAgICAgIGlmICh0aW1lciAhPT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgICAgaWYgKCFpbW1lZGlhdGUpIGZuLmFwcGx5KGN0eCwgYXJncyk7CiAgICAgIH0sIHdhaXQpOwoKICAgICAgaWYgKGNhbGxOb3cpIGZuLmFwcGx5KGN0eCwgYXJncyk7CiAgICB9CgogICAgZGVib3VuY2VkLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHRpbWVyICE9PSBudWxsKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgIH0KICAgIH07CgogICAgcmV0dXJuIGRlYm91bmNlZDsKICB9CgogIGZ1bmN0aW9uIHNsZWVwKG1zKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBNYXRoLm1heCgwLCBtcyB8IDApKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gdXVpZCgpIHsKICAgIHZhciBjID0gKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0bykgfHwKICAgICAgICAgICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8pIHx8IG51bGw7CgogICAgaWYgKGMgJiYgdHlwZW9mIGMucmFuZG9tVVVJRCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgeyByZXR1cm4gYy5yYW5kb21VVUlEKCk7IH0gY2F0Y2ggKF9lKSB7ICB9CiAgICB9CgogICAgaWYgKGMgJiYgdHlwZW9mIGMuZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgICAgYy5nZXRSYW5kb21WYWx1ZXMoYnl0ZXMpOwoKICAgICAgYnl0ZXNbNl0gPSAoYnl0ZXNbNl0gJiAweDBmKSB8IDB4NDA7CiAgICAgIGJ5dGVzWzhdID0gKGJ5dGVzWzhdICYgMHgzZikgfCAweDgwOwogICAgICB2YXIgaGV4ID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIGhleFtpXSA9IChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zbGljZSgxKTsKICAgICAgdmFyIGIgPSBieXRlczsKICAgICAgcmV0dXJuICgKICAgICAgICBoZXhbYlswXV0gKyBoZXhbYlsxXV0gKyBoZXhbYlsyXV0gKyBoZXhbYlszXV0gKyAnLScgKwogICAgICAgIGhleFtiWzRdXSArIGhleFtiWzVdXSArICctJyArCiAgICAgICAgaGV4W2JbNl1dICsgaGV4W2JbN11dICsgJy0nICsKICAgICAgICBoZXhbYls4XV0gKyBoZXhbYls5XV0gKyAnLScgKwogICAgICAgIGhleFtiWzEwXV0gKyBoZXhbYlsxMV1dICsgaGV4W2JbMTJdXSArIGhleFtiWzEzXV0gKyBoZXhbYlsxNF1dICsgaGV4W2JbMTVdXQogICAgICApOwogICAgfQoKICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjaCkgewogICAgICB2YXIgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDsKICAgICAgdmFyIHYgPSBjaCA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODsKICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzaG9ydElEKGlkKSB7CiAgICBpZiAoIWlkKSByZXR1cm4gJyc7CiAgICByZXR1cm4gU3RyaW5nKGlkKS5yZXBsYWNlKC8tL2csICcnKS5zbGljZSgwLCA4KTsKICB9CgogIGZ1bmN0aW9uIGNsYW1wKG4sIG1pbiwgbWF4KSB7CiAgICB2YXIgbG8gPSBtaW4sIGhpID0gbWF4OwogICAgaWYgKGxvID4gaGkpIHsgdmFyIHQgPSBsbzsgbG8gPSBoaTsgaGkgPSB0OyB9CiAgICBuID0gK247CiAgICBpZiAoIWlzRmluaXRlKG4pKSByZXR1cm4gbG87CiAgICByZXR1cm4gbiA8IGxvID8gbG8gOiBuID4gaGkgPyBoaSA6IG47CiAgfQoKICBmdW5jdGlvbiByYW5kb21TZWVkKCkgewogICAgdmFyIGMgPSAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvKSB8fAogICAgICAgICAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNyeXB0bykgfHwgbnVsbDsKICAgIGlmIChjICYmIHR5cGVvZiBjLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgYXJyID0gbmV3IFVpbnQzMkFycmF5KDEpOwogICAgICBjLmdldFJhbmRvbVZhbHVlcyhhcnIpOwogICAgICByZXR1cm4gYXJyWzBdICUgMTAwMDAwMDsKICAgIH0KICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlRGF0ZSh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gbnVsbDsKICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBpc05hTih2YWx1ZS5nZXRUaW1lKCkpID8gbnVsbCA6IHZhbHVlOwoKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8ICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIC9eXGQrKFwuXGQrKT8kLy50ZXN0KHZhbHVlLnRyaW0oKSkpKSB7CiAgICAgIHZhciBudW0gPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBwYXJzZUZsb2F0KHZhbHVlKTsKICAgICAgaWYgKCFpc0Zpbml0ZShudW0pKSByZXR1cm4gbnVsbDsKCiAgICAgIHZhciBtcyA9IG51bSA8IDFlMTEgPyBudW0gKiAxMDAwIDogbnVtOwogICAgICB2YXIgZE51bSA9IG5ldyBEYXRlKG1zKTsKICAgICAgcmV0dXJuIGlzTmFOKGROdW0uZ2V0VGltZSgpKSA/IG51bGwgOiBkTnVtOwogICAgfQoKICAgIHZhciBzID0gU3RyaW5nKHZhbHVlKS50cmltKCk7CiAgICB2YXIgZCA9IG5ldyBEYXRlKHMpOwogICAgaWYgKCFpc05hTihkLmdldFRpbWUoKSkpIHJldHVybiBkOwoKICAgIHZhciBjb2VyY2VkID0gcy5yZXBsYWNlKCcgJywgJ1QnKTsKICAgIGlmICghL1t6Wl18WystXVxkezJ9Oj9cZHsyfSQvLnRlc3QoY29lcmNlZCkpIGNvZXJjZWQgKz0gJ1onOwogICAgZCA9IG5ldyBEYXRlKGNvZXJjZWQpOwogICAgcmV0dXJuIGlzTmFOKGQuZ2V0VGltZSgpKSA/IG51bGwgOiBkOwogIH0KCiAgdmFyIF9hYnNGbXQgPSBudWxsOwogIGZ1bmN0aW9uIGFic29sdXRlRm9ybWF0dGVyKCkgewogICAgaWYgKF9hYnNGbXQgIT09IG51bGwpIHJldHVybiBfYWJzRm10OwogICAgdHJ5IHsKICAgICAgX2Fic0ZtdCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHVuZGVmaW5lZCwgewogICAgICAgIHllYXI6ICdudW1lcmljJywgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLAogICAgICAgIGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcKICAgICAgfSk7CiAgICB9IGNhdGNoIChfZSkgewogICAgICBfYWJzRm10ID0gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gX2Fic0ZtdDsKICB9CgogIGZ1bmN0aW9uIGZtdERhdGUodmFsdWUsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGQgPSBwYXJzZURhdGUodmFsdWUpOwogICAgaWYgKCFkKSByZXR1cm4gJyc7CgogICAgdmFyIG5vd01zID0gb3B0cy5ub3cgIT0gbnVsbCA/IChvcHRzLm5vdyBpbnN0YW5jZW9mIERhdGUgPyBvcHRzLm5vdy5nZXRUaW1lKCkgOiArb3B0cy5ub3cpIDogRGF0ZS5ub3coKTsKICAgIHZhciBkaWZmID0gbm93TXMgLSBkLmdldFRpbWUoKTsKCiAgICBpZiAob3B0cy5hYnNvbHV0ZSkgcmV0dXJuIGZvcm1hdEFic29sdXRlKGQpOwoKICAgIHZhciByZWwgPSBmb3JtYXRSZWxhdGl2ZShkaWZmKTsKICAgIGlmIChvcHRzLnJlbGF0aXZlKSByZXR1cm4gcmVsOwoKICAgIHZhciBTRVZFTl9EQVlTID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7CiAgICBpZiAoTWF0aC5hYnMoZGlmZikgPCBTRVZFTl9EQVlTKSByZXR1cm4gcmVsOwogICAgcmV0dXJuIGZvcm1hdEFic29sdXRlKGQpOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0QWJzb2x1dGUoZCkgewogICAgdmFyIGZtdCA9IGFic29sdXRlRm9ybWF0dGVyKCk7CiAgICBpZiAoZm10KSB7CiAgICAgIHRyeSB7IHJldHVybiBmbXQuZm9ybWF0KGQpOyB9IGNhdGNoIChfZSkgeyAgfQogICAgfQoKICAgIHJldHVybiBkLnRvTG9jYWxlU3RyaW5nCiAgICAgID8gZC50b0xvY2FsZVN0cmluZygpCiAgICAgIDogZC50b0lTT1N0cmluZygpLnJlcGxhY2UoJ1QnLCAnICcpLnNsaWNlKDAsIDE2KTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlKGRpZmZNcykgewogICAgdmFyIGZ1dHVyZSA9IGRpZmZNcyA8IDA7CiAgICB2YXIgbXMgPSBNYXRoLmFicyhkaWZmTXMpOwogICAgdmFyIHMgPSBNYXRoLnJvdW5kKG1zIC8gMTAwMCk7CgogICAgaWYgKHMgPCA1KSByZXR1cm4gJ2p1c3Qgbm93JzsKICAgIGlmIChzIDwgNjApIHJldHVybiBzdWZmaXgocyArICdzJywgZnV0dXJlKTsKCiAgICB2YXIgbSA9IE1hdGgucm91bmQocyAvIDYwKTsKICAgIGlmIChtIDwgNjApIHJldHVybiBzdWZmaXgobSArICdtJywgZnV0dXJlKTsKCiAgICB2YXIgaCA9IE1hdGgucm91bmQobSAvIDYwKTsKICAgIGlmIChoIDwgMjQpIHJldHVybiBzdWZmaXgoaCArICdoJywgZnV0dXJlKTsKCiAgICB2YXIgZHlzID0gTWF0aC5yb3VuZChoIC8gMjQpOwogICAgaWYgKGR5cyA8IDcpIHJldHVybiBzdWZmaXgoZHlzICsgJ2QnLCBmdXR1cmUpOwoKICAgIHZhciB3ID0gTWF0aC5yb3VuZChkeXMgLyA3KTsKICAgIGlmICh3IDwgNSkgcmV0dXJuIHN1ZmZpeCh3ICsgJ3cnLCBmdXR1cmUpOwoKICAgIHZhciBtbyA9IE1hdGgucm91bmQoZHlzIC8gMzApOwogICAgaWYgKG1vIDwgMTIpIHJldHVybiBzdWZmaXgobW8gKyAnbW8nLCBmdXR1cmUpOwoKICAgIHZhciB5ID0gTWF0aC5yb3VuZChkeXMgLyAzNjUpOwogICAgcmV0dXJuIHN1ZmZpeCh5ICsgJ3knLCBmdXR1cmUpOwogIH0KCiAgZnVuY3Rpb24gc3VmZml4KGNvcmUsIGZ1dHVyZSkgewogICAgcmV0dXJuIGZ1dHVyZSA/ICdpbiAnICsgY29yZSA6IGNvcmUgKyAnIGFnbyc7CiAgfQoKICBmdW5jdGlvbiBpc29EYXRlKHZhbHVlKSB7CiAgICB2YXIgZCA9IHZhbHVlID09IG51bGwgPyBuZXcgRGF0ZSgpIDogcGFyc2VEYXRlKHZhbHVlKTsKICAgIGlmICghZCkgcmV0dXJuICcnOwoKICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXC5cZHszfVokLywgJ1onKTsKICB9CgogIGZ1bmN0aW9uIGI2NChzdHIpIHsKICAgIHZhciBzID0gc3RyID09IG51bGwgPyAnJyA6IFN0cmluZyhzdHIpOwoKICAgIHRyeSB7CiAgICAgIGlmICh0eXBlb2YgYnRvYSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHZhciBiaW4gPSBlbmNvZGVVUklDb21wb25lbnQocykucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZywgZnVuY3Rpb24gKF9tLCBoZXgpIHsKICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGhleCwgMTYpKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gYnRvYShiaW4pOwogICAgICB9CiAgICB9IGNhdGNoIChfZSkgeyAgfQoKICAgIHJldHVybiBieXRlc1RvQmFzZTY0KHV0ZjhCeXRlcyhzKSk7CiAgfQoKICBmdW5jdGlvbiB1bmI2NChiKSB7CiAgICB2YXIgcyA9IGIgPT0gbnVsbCA/ICcnIDogU3RyaW5nKGIpOwogICAgdHJ5IHsKICAgICAgaWYgKHR5cGVvZiBhdG9iID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdmFyIGJpbiA9IGF0b2Iocyk7CiAgICAgICAgdmFyIHBjdCA9ICcnOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmluLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBwY3QgKz0gJyUnICsgKCcwMCcgKyBiaW4uY2hhckNvZGVBdChpKS50b1N0cmluZygxNikpLnNsaWNlKC0yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChwY3QpOwogICAgICB9CiAgICB9IGNhdGNoIChfZSkgeyAgfQogICAgcmV0dXJuIGJhc2U2NFRvVXRmOChzKTsKICB9CgogIGZ1bmN0aW9uIHV0ZjhCeXRlcyhzdHIpIHsKICAgIGlmICh0eXBlb2YgVGV4dEVuY29kZXIgPT09ICdmdW5jdGlvbicpIHJldHVybiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTsKCiAgICB2YXIgb3V0ID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICBpZiAoYyA8IDB4ODApIG91dC5wdXNoKGMpOwogICAgICBlbHNlIGlmIChjIDwgMHg4MDApIHsKICAgICAgICBvdXQucHVzaCgweGMwIHwgKGMgPj4gNiksIDB4ODAgfCAoYyAmIDB4M2YpKTsKICAgICAgfSBlbHNlIGlmIChjID49IDB4ZDgwMCAmJiBjIDw9IDB4ZGJmZikgewogICAgICAgIHZhciBjMiA9IHN0ci5jaGFyQ29kZUF0KCsraSk7CiAgICAgICAgdmFyIGNwID0gMHgxMDAwMCArICgoKGMgJiAweDNmZikgPDwgMTApIHwgKGMyICYgMHgzZmYpKTsKICAgICAgICBvdXQucHVzaCgweGYwIHwgKGNwID4+IDE4KSwgMHg4MCB8ICgoY3AgPj4gMTIpICYgMHgzZiksIDB4ODAgfCAoKGNwID4+IDYpICYgMHgzZiksIDB4ODAgfCAoY3AgJiAweDNmKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3V0LnB1c2goMHhlMCB8IChjID4+IDEyKSwgMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpLCAweDgwIHwgKGMgJiAweDNmKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgVWludDhBcnJheShvdXQpOwogIH0KCiAgdmFyIEI2NF9DSEFSUyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJzsKCiAgZnVuY3Rpb24gYnl0ZXNUb0Jhc2U2NChieXRlcykgewogICAgdmFyIG91dCA9ICcnOwogICAgdmFyIGk7CiAgICBmb3IgKGkgPSAwOyBpICsgMiA8IGJ5dGVzLmxlbmd0aDsgaSArPSAzKSB7CiAgICAgIHZhciBuID0gKGJ5dGVzW2ldIDw8IDE2KSB8IChieXRlc1tpICsgMV0gPDwgOCkgfCBieXRlc1tpICsgMl07CiAgICAgIG91dCArPSBCNjRfQ0hBUlNbKG4gPj4gMTgpICYgNjNdICsgQjY0X0NIQVJTWyhuID4+IDEyKSAmIDYzXSArIEI2NF9DSEFSU1sobiA+PiA2KSAmIDYzXSArIEI2NF9DSEFSU1tuICYgNjNdOwogICAgfQogICAgdmFyIHJlbSA9IGJ5dGVzLmxlbmd0aCAtIGk7CiAgICBpZiAocmVtID09PSAxKSB7CiAgICAgIHZhciBhID0gYnl0ZXNbaV0gPDwgMTY7CiAgICAgIG91dCArPSBCNjRfQ0hBUlNbKGEgPj4gMTgpICYgNjNdICsgQjY0X0NIQVJTWyhhID4+IDEyKSAmIDYzXSArICc9PSc7CiAgICB9IGVsc2UgaWYgKHJlbSA9PT0gMikgewogICAgICB2YXIgYiA9IChieXRlc1tpXSA8PCAxNikgfCAoYnl0ZXNbaSArIDFdIDw8IDgpOwogICAgICBvdXQgKz0gQjY0X0NIQVJTWyhiID4+IDE4KSAmIDYzXSArIEI2NF9DSEFSU1soYiA+PiAxMikgJiA2M10gKyBCNjRfQ0hBUlNbKGIgPj4gNikgJiA2M10gKyAnPSc7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KCiAgZnVuY3Rpb24gYmFzZTY0VG9VdGY4KGIpIHsKICAgIHZhciBjbGVhbiA9IGIucmVwbGFjZSgvW15BLVphLXowLTkrLz1dL2csICcnKTsKICAgIHZhciBieXRlcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGVhbi5sZW5ndGg7IGkgKz0gNCkgewogICAgICB2YXIgZTAgPSBCNjRfQ0hBUlMuaW5kZXhPZihjbGVhbltpXSk7CiAgICAgIHZhciBlMSA9IEI2NF9DSEFSUy5pbmRleE9mKGNsZWFuW2kgKyAxXSk7CiAgICAgIHZhciBlMiA9IGNsZWFuW2kgKyAyXSA9PT0gJz0nID8gLTEgOiBCNjRfQ0hBUlMuaW5kZXhPZihjbGVhbltpICsgMl0pOwogICAgICB2YXIgZTMgPSBjbGVhbltpICsgM10gPT09ICc9JyA/IC0xIDogQjY0X0NIQVJTLmluZGV4T2YoY2xlYW5baSArIDNdKTsKICAgICAgdmFyIG4gPSAoZTAgPDwgMTgpIHwgKGUxIDw8IDEyKSB8ICgoZTIgPCAwID8gMCA6IGUyKSA8PCA2KSB8IChlMyA8IDAgPyAwIDogZTMpOwogICAgICBieXRlcy5wdXNoKChuID4+IDE2KSAmIDB4ZmYpOwogICAgICBpZiAoZTIgPj0gMCkgYnl0ZXMucHVzaCgobiA+PiA4KSAmIDB4ZmYpOwogICAgICBpZiAoZTMgPj0gMCkgYnl0ZXMucHVzaChuICYgMHhmZik7CiAgICB9CiAgICBpZiAodHlwZW9mIFRleHREZWNvZGVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKG5ldyBVaW50OEFycmF5KGJ5dGVzKSk7CiAgICB2YXIgc3RyID0gJyc7CiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGJ5dGVzLmxlbmd0aDsgaisrKSBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tqXSk7CiAgICB0cnkgeyByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShzdHIpKTsgfSBjYXRjaCAoX2UpIHsgcmV0dXJuIHN0cjsgfQogIH0KCiAgZnVuY3Rpb24gYmFzaWNBdXRoSGVhZGVyKGVtYWlsLCBwdykgewogICAgdmFyIGUgPSAoZW1haWwgPT0gbnVsbCA/ICcnIDogU3RyaW5nKGVtYWlsKSkudG9Mb3dlckNhc2UoKTsKICAgIHZhciBwID0gcHcgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHB3KTsKICAgIHJldHVybiAnQmFzaWMgJyArIGI2NChlICsgJzonICsgcCk7CiAgfQoKICB2YXIgSFRNTF9FU0NBUEVTID0gewogICAgJyYnOiAnJmFtcDsnLAogICAgJzwnOiAnJmx0OycsCiAgICAnPic6ICcmZ3Q7JywKICAgICciJzogJyZxdW90OycsCiAgICAiJyI6ICcmIzM5OycsCiAgICAnYCc6ICcmIzk2OycsCiAgICAnPSc6ICcmIzYxOycKICB9OwoKICBmdW5jdGlvbiBlc2NhcGVIdG1sKHMpIHsKICAgIGlmIChzID09IG51bGwpIHJldHVybiAnJzsKICAgIHJldHVybiBTdHJpbmcocykucmVwbGFjZSgvWyY8PiInYD1dL2csIGZ1bmN0aW9uIChjaCkgewogICAgICByZXR1cm4gSFRNTF9FU0NBUEVTW2NoXTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZG93bmxvYWQodXJsLCBmaWxlbmFtZSkgewogICAgaWYgKCF1cmwpIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ2Rvd25sb2FkOiBtaXNzaW5nIHVybCcpKTsKICAgIHZhciBuYW1lID0gZmlsZW5hbWUgfHwgaW5mZXJGaWxlbmFtZSh1cmwpOwoKICAgIHJldHVybiBmZXRjaCh1cmwsIHsgbW9kZTogJ2NvcnMnLCBjcmVkZW50aWFsczogJ29taXQnIH0pCiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKCdkb3dubG9hZDogSFRUUCAnICsgcmVzLnN0YXR1cyk7CiAgICAgICAgcmV0dXJuIHJlcy5ibG9iKCk7CiAgICAgIH0pCiAgICAgIC50aGVuKGZ1bmN0aW9uIChibG9iKSB7CgogICAgICAgIGlmIChuYW1lLmluZGV4T2YoJy4nKSA9PT0gLTEpIHsKICAgICAgICAgIHZhciBleHQgPSBleHRGb3JNaW1lKGJsb2IudHlwZSk7CiAgICAgICAgICBpZiAoZXh0KSBuYW1lICs9ICcuJyArIGV4dDsKICAgICAgICB9CiAgICAgICAgdHJpZ2dlckJsb2JEb3dubG9hZChibG9iLCBuYW1lKTsKICAgICAgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciB3ID0gd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJywgJ25vb3BlbmVyJyk7CiAgICAgICAgICBpZiAodykgcmV0dXJuOwogICAgICAgIH0gY2F0Y2ggKF9lKSB7ICB9CiAgICAgICAgdGhyb3cgZXJyOwogICAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHRyaWdnZXJCbG9iRG93bmxvYWQoYmxvYiwgbmFtZSkgewogICAgdmFyIG9ialVSTCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CiAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgIGEuaHJlZiA9IG9ialVSTDsKICAgIGEuZG93bmxvYWQgPSBuYW1lIHx8ICdkb3dubG9hZCc7CiAgICBhLnJlbCA9ICdub29wZW5lcic7CiAgICBhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOwogICAgYS5jbGljaygpOwoKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwogICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKG9ialVSTCk7CiAgICB9LCAxNTAwKTsKICB9CgogIGZ1bmN0aW9uIGluZmVyRmlsZW5hbWUodXJsKSB7CiAgICB0cnkgewogICAgICB2YXIgdSA9IG5ldyBVUkwodXJsLCB3aW5kb3cubG9jYXRpb24gPyB3aW5kb3cubG9jYXRpb24uaHJlZiA6IHVuZGVmaW5lZCk7CiAgICAgIHZhciBsYXN0ID0gdS5wYXRobmFtZS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5wb3AoKTsKICAgICAgaWYgKGxhc3QpIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQobGFzdCk7CiAgICB9IGNhdGNoIChfZSkgeyAgfQogICAgdmFyIHN0cmlwcGVkID0gU3RyaW5nKHVybCkuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdOwogICAgdmFyIHNlZyA9IHN0cmlwcGVkLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pLnBvcCgpOwogICAgcmV0dXJuIHNlZyB8fCAoJ3ZhbXAtJyArIERhdGUubm93KCkpOwogIH0KCiAgZnVuY3Rpb24gZXh0Rm9yTWltZShtaW1lKSB7CiAgICBzd2l0Y2ggKG1pbWUpIHsKICAgICAgY2FzZSAnaW1hZ2UvanBlZyc6IHJldHVybiAnanBnJzsKICAgICAgY2FzZSAnaW1hZ2UvcG5nJzogcmV0dXJuICdwbmcnOwogICAgICBjYXNlICdpbWFnZS93ZWJwJzogcmV0dXJuICd3ZWJwJzsKICAgICAgY2FzZSAnaW1hZ2UvZ2lmJzogcmV0dXJuICdnaWYnOwogICAgICBjYXNlICdpbWFnZS9oZWljJzogcmV0dXJuICdoZWljJzsKICAgICAgY2FzZSAndmlkZW8vbXA0JzogcmV0dXJuICdtcDQnOwogICAgICBjYXNlICd2aWRlby9xdWlja3RpbWUnOiByZXR1cm4gJ21vdic7CiAgICAgIGNhc2UgJ3ZpZGVvL3dlYm0nOiByZXR1cm4gJ3dlYm0nOwogICAgICBkZWZhdWx0OiByZXR1cm4gJyc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb3B5KHRleHQpIHsKICAgIHZhciBzID0gdGV4dCA9PSBudWxsID8gJycgOiBTdHJpbmcodGV4dCk7CiAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCAmJiB3aW5kb3cuaXNTZWN1cmVDb250ZXh0KSB7CiAgICAgIHJldHVybiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0sIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gbGVnYWN5Q29weShzKTsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGxlZ2FjeUNvcHkocykpOwogIH0KCiAgZnVuY3Rpb24gbGVnYWN5Q29weShzKSB7CiAgICB0cnkgewogICAgICB2YXIgdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogICAgICB0YS52YWx1ZSA9IHM7CiAgICAgIHRhLnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAnJyk7CiAgICAgIHRhLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJzsKICAgICAgdGEuc3R5bGUudG9wID0gJy0xMDAwcHgnOwogICAgICB0YS5zdHlsZS5vcGFjaXR5ID0gJzAnOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhKTsKICAgICAgdGEuc2VsZWN0KCk7CiAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKDAsIHMubGVuZ3RoKTsKICAgICAgdmFyIG9rID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQgJiYgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsKICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0YSk7CiAgICAgIHJldHVybiAhIW9rOwogICAgfSBjYXRjaCAoX2UpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZGF0YVVSTFRvQmxvYihkYXRhVVJMKSB7CiAgICB2YXIgcGFydHMgPSBTdHJpbmcoZGF0YVVSTCkuc3BsaXQoJywnKTsKICAgIHZhciBoZWFkZXIgPSBwYXJ0c1swXSB8fCAnJzsKICAgIHZhciBib2R5ID0gcGFydHNbMV0gfHwgJyc7CiAgICB2YXIgbWltZU1hdGNoID0gaGVhZGVyLm1hdGNoKC9kYXRhOihbXjtdKykvKTsKICAgIHZhciBtaW1lID0gbWltZU1hdGNoID8gbWltZU1hdGNoWzFdIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICB2YXIgaXNCYXNlNjQgPSAvO2Jhc2U2NC9pLnRlc3QoaGVhZGVyKTsKICAgIHZhciBiaW5hcnkgPSBpc0Jhc2U2NCA/IGF0b2IoYm9keSkgOiBkZWNvZGVVUklDb21wb25lbnQoYm9keSk7CiAgICB2YXIgbGVuID0gYmluYXJ5Lmxlbmd0aDsKICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBieXRlc1tpXSA9IGJpbmFyeS5jaGFyQ29kZUF0KGkpOwogICAgcmV0dXJuIG5ldyBCbG9iKFtieXRlc10sIHsgdHlwZTogbWltZSB9KTsKICB9CgogIGZ1bmN0aW9uIGJsb2JUb0RhdGFVUkwoYmxvYikgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGZyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgZnIub25sb2FkID0gZnVuY3Rpb24gKCkgeyByZXNvbHZlKGZyLnJlc3VsdCk7IH07CiAgICAgIGZyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJlamVjdChmci5lcnJvciB8fCBuZXcgRXJyb3IoJ0ZpbGVSZWFkZXIgZmFpbGVkJykpOyB9OwogICAgICBmci5yZWFkQXNEYXRhVVJMKGJsb2IpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBieXRlc1RvQmxvYihieXRlcywgbWltZSkgewogICAgcmV0dXJuIG5ldyBCbG9iKFtieXRlc10sIHsgdHlwZTogbWltZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9KTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdEJ5dGVzKG4pIHsKICAgIG4gPSArbjsKICAgIGlmICghaXNGaW5pdGUobikgfHwgbiA8PSAwKSByZXR1cm4gJzAgQic7CiAgICB2YXIgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInXTsKICAgIHZhciBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhuKSAvIE1hdGgubG9nKDEwMjQpKTsKICAgIGkgPSBjbGFtcChpLCAwLCB1bml0cy5sZW5ndGggLSAxKTsKICAgIHZhciB2YWwgPSBuIC8gTWF0aC5wb3coMTAyNCwgaSk7CiAgICB2YXIgc3RyID0gaSA9PT0gMCA/IFN0cmluZyh2YWwpIDogdmFsLnRvRml4ZWQodmFsIDwgMTAgPyAxIDogMCk7CiAgICByZXR1cm4gc3RyICsgJyAnICsgdW5pdHNbaV07CiAgfQoKICBmdW5jdGlvbiBwbHVyYWxpemUobiwgb25lLCBtYW55KSB7CiAgICB2YXIgY291bnQgPSBuIHwgMDsKICAgIHZhciB3b3JkID0gY291bnQgPT09IDEgPyBvbmUgOiAobWFueSB8fCBvbmUgKyAncycpOwogICAgcmV0dXJuIGNvdW50ICsgJyAnICsgd29yZDsKICB9CgogIGZ1bmN0aW9uIHRydW5jYXRlKHMsIG1heCkgewogICAgaWYgKHMgPT0gbnVsbCkgcmV0dXJuICcnOwogICAgcyA9IFN0cmluZyhzKTsKICAgIHZhciBsaW1pdCA9IG1heCB8IDA7CiAgICBpZiAobGltaXQgPD0gMCB8fCBzLmxlbmd0aCA8PSBsaW1pdCkgcmV0dXJuIHM7CiAgICByZXR1cm4gcy5zbGljZSgwLCBNYXRoLm1heCgwLCBsaW1pdCAtIDEpKS5yZXBsYWNlKC9ccyskLywgJycpICsgJ+KApic7CiAgfQoKICBmdW5jdGlvbiBpc0VtYWlsKHMpIHsKICAgIGlmICghcykgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIC9eW15cc0BdK0BbXlxzQF0rXC5bXlxzQF0rJC8udGVzdChTdHJpbmcocykudHJpbSgpKTsKICB9CgogIFYudXRpbCA9IHsKCiAgICBxczogcXMsCiAgICBxc1N0cmluZzogcXNTdHJpbmcsCiAgICBidWlsZEhhc2g6IGJ1aWxkSGFzaCwKCiAgICBkZWJvdW5jZTogZGVib3VuY2UsCiAgICBzbGVlcDogc2xlZXAsCgogICAgdXVpZDogdXVpZCwKICAgIHNob3J0SUQ6IHNob3J0SUQsCgogICAgY2xhbXA6IGNsYW1wLAogICAgcmFuZG9tU2VlZDogcmFuZG9tU2VlZCwKCiAgICBmbXREYXRlOiBmbXREYXRlLAogICAgcGFyc2VEYXRlOiBwYXJzZURhdGUsCiAgICBpc29EYXRlOiBpc29EYXRlLAoKICAgIGI2NDogYjY0LAogICAgdW5iNjQ6IHVuYjY0LAogICAgYmFzaWNBdXRoSGVhZGVyOiBiYXNpY0F1dGhIZWFkZXIsCgogICAgZXNjYXBlSHRtbDogZXNjYXBlSHRtbCwKICAgIGVzY2FwZUF0dHI6IGVzY2FwZUh0bWwsCgogICAgZG93bmxvYWQ6IGRvd25sb2FkLAogICAgY29weTogY29weSwKCiAgICBkYXRhVVJMVG9CbG9iOiBkYXRhVVJMVG9CbG9iLAogICAgYmxvYlRvRGF0YVVSTDogYmxvYlRvRGF0YVVSTCwKICAgIGJ5dGVzVG9CbG9iOiBieXRlc1RvQmxvYiwKCiAgICBmb3JtYXRCeXRlczogZm9ybWF0Qnl0ZXMsCiAgICBwbHVyYWxpemU6IHBsdXJhbGl6ZSwKICAgIHRydW5jYXRlOiB0cnVuY2F0ZSwKICAgIGlzRW1haWw6IGlzRW1haWwKICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9zdG9yZS5qcyA9PT09PSAqLwoKKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwoKICBmdW5jdGlvbiByZXNvbHZlQVBJQmFzZSgpIHsKICAgIHRyeSB7CiAgICAgIHZhciBoID0gKHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpIHx8ICcnOwogICAgICBpZiAoLyhefFwuKXZvb3NleVwuY29tJC9pLnRlc3QoaCkpIHJldHVybiAnJzsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgICByZXR1cm4gJ2h0dHBzOi8vYXBpLnZvb3NleS5jb20nOwogIH0KICBWLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oCiAgICB7CiAgICAgIEFQSTogcmVzb2x2ZUFQSUJhc2UoKSwKICAgICAgQ0ROOiAnaHR0cHM6Ly9jZG4udm9vc2V5LmNvbScsCiAgICAgIEFQUF9TVE9SRV9VUkw6ICdodHRwczovL2FwcHMuYXBwbGUuY29tL3VzL2FwcC92YW1wL2lkNjc0ODY1NzY4NScsCiAgICAgIEFVVEhfVklERU86ICdodHRwczovL2Nkbi52b29zZXkuY29tL21lZGlhLzA4MzEyNS0zLm1wNCcsCiAgICAgIERFTU9fVklERU86ICdodHRwczovL2Nkbi52b29zZXkuY29tL21lZGlhLzA4MzEyNS0zLm1wNCcKICAgIH0sCiAgICBWLmNvbmZpZyB8fCB7fQogICk7CgogIHZhciBTVE9SQUdFX1BSRUZJWCA9ICd2YW1wX3dlYl8nOwoKICB2YXIgUEVSU0lTVF9XSElURUxJU1QgPSBbJ3NldHRpbmdzJywgJ2luZHVzdHJpZXMnLCAnb25ib2FyZGluZ0RvbmUnLCAnY3VzdG9tUHJlc2V0cyddOwoKICBmdW5jdGlvbiBkZWZhdWx0U2V0dGluZ3MoKSB7CiAgICByZXR1cm4gewogICAgICBkZWZhdWx0TW9kZWw6ICdmbHV4S2xlaW4nLAogICAgICBkZWZhdWx0QXNwZWN0OiAnYXV0bycsCiAgICAgIGRlZmF1bHRDb3VudDogMSwKICAgICAgdGhlbWU6ICdzeXN0ZW0nLAogICAgICBhdXRvQmVmb3JlQWZ0ZXI6IHRydWUsCiAgICAgIHJlZHVjZU1vdGlvbjogZmFsc2UsCiAgICAgIGJyYW5kaW5nOiB0cnVlLAogICAgICB0YWdsaW5lOiAnJywKICAgICAgc2hhcmVUZW1wbGF0ZTogJ2JlZm9yZS1hZnRlcicsCiAgICAgIHNhdmVPcmlnaW5hbHM6IHRydWUKICAgIH07CiAgfQoKICBWLnN0YXRlID0gT2JqZWN0LmFzc2lnbigKICAgIHsKCiAgICAgIHVzZXI6IG51bGwsCiAgICAgIGNyZWRpdHM6IDAsCgogICAgICByb3V0ZTogJ2NyZWF0ZScsCiAgICAgIHBhcmFtczoge30sCiAgICAgIHByZXZpb3VzUm91dGU6IG51bGwsCgogICAgICBsaWJyYXJ5OiBbXSwKICAgICAgbGlicmFyeVBhZ2U6IDEsCiAgICAgIGxpYnJhcnlIYXNNb3JlOiB0cnVlLAogICAgICBmYXZvcml0ZXM6IFtdLAogICAgICBmZWVkOiBbXSwKICAgICAgZmVlZFBhZ2U6IDEsCiAgICAgIGZlZWRIYXNNb3JlOiB0cnVlLAogICAgICBmb2xkZXJzOiBbXSwKCiAgICAgIHByZXNldHM6IFtdLAogICAgICBjdXN0b21QcmVzZXRzOiBbXSwKCiAgICAgIGluZHVzdHJpZXM6IFtdLAogICAgICBvbmJvYXJkaW5nRG9uZTogZmFsc2UsCgogICAgICBkcmFmdDogewogICAgICAgIHByb21wdDogJycsCiAgICAgICAgbmVnYXRpdmVQcm9tcHQ6ICcnLAogICAgICAgIG1vZGVsOiAnZmx1eEtsZWluJywKICAgICAgICBhc3BlY3Q6ICdhdXRvJywKICAgICAgICBzZWVkOiBudWxsLAogICAgICAgIGNvdW50OiAxLAogICAgICAgIHByZXNldElEOiBudWxsLAogICAgICAgIGltYWdlVVJMczogW10KICAgICAgfSwKCiAgICAgIGdlbmVyYXRpbmc6IGZhbHNlLAogICAgICBwcm9ncmVzczogMCwKICAgICAgdXBsb2FkaW5nOiBmYWxzZSwKICAgICAgdXBsb2FkUHJvZ3Jlc3M6IDAsCiAgICAgIGRyYXdlck9wZW46IGZhbHNlLAogICAgICBib290ZWQ6IGZhbHNlLAoKICAgICAgc2V0dGluZ3M6IGRlZmF1bHRTZXR0aW5ncygpCiAgICB9LAogICAgVi5zdGF0ZSB8fCB7fQogICk7CgogIFYuc3RhdGUuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKGRlZmF1bHRTZXR0aW5ncygpLCBWLnN0YXRlLnNldHRpbmdzIHx8IHt9KTsKCiAgVi5hcGkgPSBWLmFwaSB8fCB7fTsKICBWLmF1dGggPSBWLmF1dGggfHwge307CiAgVi5kYXRhID0gVi5kYXRhIHx8IHsgc3dpenpsZXM6IFtdLCBtb2RlbHM6IFtdLCBhc3BlY3RzOiBbXSwgaW5kdXN0cmllczogW10gfTsKICBWLnVpID0gVi51aSB8fCB7fTsKICBWLnZpZXdzID0gVi52aWV3cyB8fCB7fTsKICBWLnJvdXRlciA9IFYucm91dGVyIHx8IHt9OwogIFYudXRpbCA9IFYudXRpbCB8fCB7fTsKCiAgdmFyIEVWRU5UUyA9IE9iamVjdC5mcmVlemUoewogICAgQVVUSF9DSEFOR0VEOiAnYXV0aDpjaGFuZ2VkJywKICAgIENSRURJVFNfQ0hBTkdFRDogJ2NyZWRpdHM6Y2hhbmdlZCcsCiAgICBST1VURV9DSEFOR0VEOiAncm91dGU6Y2hhbmdlZCcsCiAgICBMSUJSQVJZX0NIQU5HRUQ6ICdsaWJyYXJ5OmNoYW5nZWQnLAogICAgVE9BU1Q6ICd0b2FzdCcsCiAgICBFUlJPUjogJ2Vycm9yJwogIH0pOwoKICB2YXIgbGlzdGVuZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgZnVuY3Rpb24gaXNTdG9yYWdlQXZhaWxhYmxlKCkgewogICAgdHJ5IHsKICAgICAgdmFyIGsgPSBTVE9SQUdFX1BSRUZJWCArICdfX3Byb2JlX18nOwogICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oaywgJzEnKTsKICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGspOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICB2YXIgU1RPUkFHRV9PSyA9IGlzU3RvcmFnZUF2YWlsYWJsZSgpOwoKICBWLnN0b3JlID0gewoKICAgIGV2ZW50czogRVZFTlRTLAogICAgcHJlZml4OiBTVE9SQUdFX1BSRUZJWCwKCiAgICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHsKICAgICAgcmV0dXJuIFYuc3RhdGVba2V5XTsKICAgIH0sCgogICAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICB2YXIgcHJldiA9IFYuc3RhdGVba2V5XTsKICAgICAgVi5zdGF0ZVtrZXldID0gdmFsdWU7CgogICAgICB0aGlzLmVtaXQoa2V5LCB2YWx1ZSk7CgogICAgICBpZiAoa2V5ID09PSAnY3JlZGl0cycpIHRoaXMuZW1pdChFVkVOVFMuQ1JFRElUU19DSEFOR0VELCB2YWx1ZSk7CiAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ3VzZXInKSB0aGlzLmVtaXQoRVZFTlRTLkFVVEhfQ0hBTkdFRCwgdmFsdWUpOwogICAgICBlbHNlIGlmIChrZXkgPT09ICdyb3V0ZScpIHRoaXMuZW1pdChFVkVOVFMuUk9VVEVfQ0hBTkdFRCwgdmFsdWUpOwogICAgICBlbHNlIGlmIChrZXkgPT09ICdsaWJyYXJ5JykgdGhpcy5lbWl0KEVWRU5UUy5MSUJSQVJZX0NIQU5HRUQsIHZhbHVlKTsKCiAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJywgeyBrZXk6IGtleSwgdmFsdWU6IHZhbHVlLCBwcmV2aW91czogcHJldiB9KTsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfSwKCiAgICBwYXRjaDogZnVuY3Rpb24gKG9iaikgewogICAgICBpZiAoIW9iaikgcmV0dXJuOwogICAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrKSkgdGhpcy5zZXQoaywgb2JqW2tdKTsKICAgICAgfQogICAgfSwKCiAgICBvbjogZnVuY3Rpb24gKGV2ZW50LCBjYikgewogICAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZnVuY3Rpb24gKCkge307CiAgICAgIChsaXN0ZW5lcnNbZXZlbnRdIHx8IChsaXN0ZW5lcnNbZXZlbnRdID0gW10pKS5wdXNoKGNiKTsKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICByZXR1cm4gZnVuY3Rpb24gb2ZmKCkgewogICAgICAgIHNlbGYub2ZmKGV2ZW50LCBjYik7CiAgICAgIH07CiAgICB9LAoKICAgIG9uY2U6IGZ1bmN0aW9uIChldmVudCwgY2IpIHsKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICB2YXIgb2ZmID0gdGhpcy5vbihldmVudCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICBvZmYoKTsKICAgICAgICBjYihkYXRhKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBvZmY7CiAgICB9LAoKICAgIG9mZjogZnVuY3Rpb24gKGV2ZW50LCBjYikgewogICAgICB2YXIgYXJyID0gbGlzdGVuZXJzW2V2ZW50XTsKICAgICAgaWYgKCFhcnIpIHJldHVybjsKICAgICAgaWYgKCFjYikgewogICAgICAgIGRlbGV0ZSBsaXN0ZW5lcnNbZXZlbnRdOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgaSA9IGFyci5pbmRleE9mKGNiKTsKICAgICAgaWYgKGkgIT09IC0xKSBhcnIuc3BsaWNlKGksIDEpOwogICAgICBpZiAoYXJyLmxlbmd0aCA9PT0gMCkgZGVsZXRlIGxpc3RlbmVyc1tldmVudF07CiAgICB9LAoKICAgIGVtaXQ6IGZ1bmN0aW9uIChldmVudCwgZGF0YSkgewogICAgICB2YXIgYXJyID0gbGlzdGVuZXJzW2V2ZW50XTsKICAgICAgaWYgKCFhcnIgfHwgYXJyLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKICAgICAgdmFyIHNuYXBzaG90ID0gYXJyLnNsaWNlKCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc25hcHNob3QubGVuZ3RoOyBpKyspIHsKICAgICAgICB0cnkgewogICAgICAgICAgc25hcHNob3RbaV0oZGF0YSk7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICBpZiAod2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5lcnJvcikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVi5zdG9yZV0gbGlzdGVuZXIgZm9yICInICsgZXZlbnQgKyAnIiB0aHJldzonLCBlcnIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICB0b2FzdDogZnVuY3Rpb24gKG1zZywga2luZCkgewogICAgICB0aGlzLmVtaXQoRVZFTlRTLlRPQVNULCB7IG1zZzogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsKICAgIH0sCiAgICBlcnJvcjogZnVuY3Rpb24gKGVycikgewogICAgICB2YXIgcGF5bG9hZCA9CiAgICAgICAgZXJyICYmIHR5cGVvZiBlcnIgPT09ICdvYmplY3QnCiAgICAgICAgICA/IGVycgogICAgICAgICAgOiB7IG1lc3NhZ2U6IFN0cmluZyhlcnIgPT0gbnVsbCA/ICdTb21ldGhpbmcgd2VudCB3cm9uZycgOiBlcnIpIH07CiAgICAgIHRoaXMuZW1pdChFVkVOVFMuRVJST1IsIHBheWxvYWQpOwogICAgfSwKCiAgICBzYXZlOiBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICghU1RPUkFHRV9PSykgcmV0dXJuIGZhbHNlOwogICAgICB0cnkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUEVSU0lTVF9XSElURUxJU1QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBrZXkgPSBQRVJTSVNUX1dISVRFTElTVFtpXTsKICAgICAgICAgIHZhciB2YWwgPSBWLnN0YXRlW2tleV07CiAgICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsKSB7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX1BSRUZJWCArIGtleSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9QUkVGSVggKyBrZXksIEpTT04uc3RyaW5naWZ5KHZhbCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBjYXRjaCAoZSkgewoKICAgICAgICBpZiAod2luZG93LmNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4oJ1tWLnN0b3JlXSBzYXZlIGZhaWxlZDonLCBlKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0sCgogICAgbG9hZDogZnVuY3Rpb24gKCkgewogICAgICBpZiAoIVNUT1JBR0VfT0spIHJldHVybiBmYWxzZTsKICAgICAgdHJ5IHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFBFUlNJU1RfV0hJVEVMSVNULmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIga2V5ID0gUEVSU0lTVF9XSElURUxJU1RbaV07CiAgICAgICAgICB2YXIgcmF3ID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfUFJFRklYICsga2V5KTsKICAgICAgICAgIGlmIChyYXcgPT09IG51bGwgfHwgcmF3ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlOwogICAgICAgICAgdmFyIHBhcnNlZDsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTsKICAgICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyKSB7CgogICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9QUkVGSVggKyBrZXkpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJzZWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7CgogICAgICAgICAgaWYgKGtleSA9PT0gJ3NldHRpbmdzJyAmJiBwYXJzZWQgJiYgdHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgVi5zdGF0ZS5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdFNldHRpbmdzKCksIHBhcnNlZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBWLnN0YXRlW2tleV0gPSBwYXJzZWQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKCdbVi5zdG9yZV0gbG9hZCBmYWlsZWQ6JywgZSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9LAoKICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICghU1RPUkFHRV9PSykgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUEVSU0lTVF9XSElURUxJU1QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX1BSRUZJWCArIFBFUlNJU1RfV0hJVEVMSVNUW2ldKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHsKCiAgICAgIH0KICAgICAgVi5zdGF0ZS5zZXR0aW5ncyA9IGRlZmF1bHRTZXR0aW5ncygpOwogICAgICBWLnN0YXRlLmluZHVzdHJpZXMgPSBbXTsKICAgICAgVi5zdGF0ZS5vbmJvYXJkaW5nRG9uZSA9IGZhbHNlOwogICAgICBWLnN0YXRlLmN1c3RvbVByZXNldHMgPSBbXTsKICAgIH0sCgogICAgZGVmYXVsdFNldHRpbmdzOiBkZWZhdWx0U2V0dGluZ3MKICB9OwoKICBWLnN0b3JlLmxvYWQoKTsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvYXBpLmpzID09PT09ICovCgooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIFYgPSAod2luZG93LlYgPSB3aW5kb3cuViB8fCB7fSk7CgogIFYuY29uZmlnID0gT2JqZWN0LmFzc2lnbigKICAgIHsKICAgICAgQVBJOiAnaHR0cHM6Ly9hcGkudm9vc2V5LmNvbScsCiAgICAgIENETjogJ2h0dHBzOi8vY2RuLnZvb3NleS5jb20nLAogICAgICBBUFBfU1RPUkVfVVJMOiAnaHR0cHM6Ly9hcHBzLmFwcGxlLmNvbS91cy9hcHAvdmFtcC9pZDY3NDg2NTc2ODUnLAogICAgICBERU1PX1ZJREVPOiAnaHR0cHM6Ly9tLmp3cy5haS92YW1wLW1lYW5ldGl6ZS1kZW1vLXY0Lm1wNCcKICAgIH0sCiAgICBWLmNvbmZpZyB8fCB7fQogICk7CgogIGZ1bmN0aW9uIEFwaUVycm9yKHN0YXR1cywgbWVzc2FnZSwgYm9keSkgewogICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSB8fCAnUmVxdWVzdCBmYWlsZWQnKTsKICAgIGUubmFtZSA9ICdBcGlFcnJvcic7CiAgICBlLnN0YXR1cyA9IHN0YXR1czsKICAgIGUubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1JlcXVlc3QgZmFpbGVkJzsKICAgIGUuYm9keSA9IGJvZHk7CiAgICBlLmlzQXBpRXJyb3IgPSB0cnVlOwogICAgcmV0dXJuIGU7CiAgfQogIFYuQXBpRXJyb3IgPSBBcGlFcnJvcjsKCiAgdmFyIElTT19GUkFDID0gL14oXGR7NH0tXGR7Mn0tXGR7Mn1UXGR7Mn06XGR7Mn06XGR7Mn0pXC5cZCsoWnxbK1wtXVxkezJ9Oj9cZHsyfSk/JC87CgogIGZ1bmN0aW9uIHN0cmlwRnJhY3Rpb25hbCh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB2YWx1ZTsKICAgIHZhciB0ID0gdHlwZW9mIHZhbHVlOwogICAgaWYgKHQgPT09ICdzdHJpbmcnKSB7CiAgICAgIHZhciBtID0gdmFsdWUubWF0Y2goSVNPX0ZSQUMpOwogICAgICBpZiAobSkgcmV0dXJuIG1bMV0gKyAobVsyXSB8fCAnWicpOwogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7CiAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1wuXGR7M31aJC8sICdaJyk7CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgdmFyIG91dCA9IG5ldyBBcnJheSh2YWx1ZS5sZW5ndGgpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBzdHJpcEZyYWN0aW9uYWwodmFsdWVbaV0pOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgaWYgKHQgPT09ICdvYmplY3QnKSB7CiAgICAgIHZhciBvID0ge307CiAgICAgIGZvciAodmFyIGsgaW4gdmFsdWUpIHsKICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrKSkgewogICAgICAgICAgb1trXSA9IHN0cmlwRnJhY3Rpb25hbCh2YWx1ZVtrXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBvOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgZnVuY3Rpb24gc2FmZVBhcnNlKHRleHQpIHsKICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dCA9PT0gJycpIHJldHVybiBudWxsOwogICAgdHJ5IHsKICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7CiAgICB9IGNhdGNoIChfZSkgewogICAgICByZXR1cm4gdGV4dDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGVycm9yTWVzc2FnZShib2R5LCBzdGF0dXMpIHsKICAgIGlmIChib2R5ICYmIHR5cGVvZiBib2R5ID09PSAnb2JqZWN0JykgewogICAgICBpZiAodHlwZW9mIGJvZHkuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnICYmIGJvZHkuZGVzY3JpcHRpb24pIHJldHVybiBib2R5LmRlc2NyaXB0aW9uOwogICAgICBpZiAodHlwZW9mIGJvZHkucmVhc29uID09PSAnc3RyaW5nJyAmJiBib2R5LnJlYXNvbikgcmV0dXJuIGJvZHkucmVhc29uOwogICAgICBpZiAodHlwZW9mIGJvZHkubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgYm9keS5tZXNzYWdlKSByZXR1cm4gYm9keS5tZXNzYWdlOwogICAgICBpZiAodHlwZW9mIGJvZHkuZXJyb3IgPT09ICdzdHJpbmcnICYmIGJvZHkuZXJyb3IpIHJldHVybiBib2R5LmVycm9yOwogICAgfQogICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJyAmJiBib2R5LnRyaW0oKSkgcmV0dXJuIGJvZHkudHJpbSgpOwogICAgcmV0dXJuIGRlZmF1bHRTdGF0dXNNZXNzYWdlKHN0YXR1cyk7CiAgfQoKICBmdW5jdGlvbiBkZWZhdWx0U3RhdHVzTWVzc2FnZShzdGF0dXMpIHsKICAgIHN3aXRjaCAoc3RhdHVzKSB7CiAgICAgIGNhc2UgNDAwOiByZXR1cm4gJ0JhZCByZXF1ZXN0Lic7CiAgICAgIGNhc2UgNDAxOiByZXR1cm4gJ1lvdXIgc2Vzc2lvbiBoYXMgZXhwaXJlZC4gUGxlYXNlIHNpZ24gaW4gYWdhaW4uJzsKICAgICAgY2FzZSA0MDI6IHJldHVybiAnTm90IGVub3VnaCBjcmVkaXRzLic7CiAgICAgIGNhc2UgNDAzOiByZXR1cm4gJ1lvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGRvIHRoYXQuJzsKICAgICAgY2FzZSA0MDQ6IHJldHVybiAnTm90IGZvdW5kLic7CiAgICAgIGNhc2UgNDA2OiByZXR1cm4gJ1RoYXQgdmFsdWUgaXMgbm90IGFjY2VwdGFibGUuJzsKICAgICAgY2FzZSA0MDk6IHJldHVybiAnVGhhdCBhbHJlYWR5IGV4aXN0cy4nOwogICAgICBjYXNlIDQxMzogcmV0dXJuICdUaGF0IGZpbGUgaXMgdG9vIGxhcmdlLic7CiAgICAgIGNhc2UgNDIwOiByZXR1cm4gJ1JlcXVlc3QgcmVqZWN0ZWQuJzsKICAgICAgY2FzZSA0MjI6IHJldHVybiAnQ291bGQgbm90IHByb2Nlc3MgdGhhdCByZXF1ZXN0Lic7CiAgICAgIGNhc2UgNDI5OiByZXR1cm4gJ1RvbyBtYW55IHJlcXVlc3RzLiBQbGVhc2Ugc2xvdyBkb3duLic7CiAgICAgIGNhc2UgNTAwOiByZXR1cm4gJ1NvbWV0aGluZyB3ZW50IHdyb25nIG9uIG91ciBlbmQuJzsKICAgICAgY2FzZSA1MDI6CiAgICAgIGNhc2UgNTAzOgogICAgICBjYXNlIDUwNDogcmV0dXJuICdUaGUgc2VydmljZSBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZS4nOwogICAgICBkZWZhdWx0OiByZXR1cm4gc3RhdHVzID8gKCdSZXF1ZXN0IGZhaWxlZCAoJyArIHN0YXR1cyArICcpLicpIDogJ05ldHdvcmsgZXJyb3IuJzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGJ1aWxkVVJMKHBhdGgsIHF1ZXJ5KSB7CiAgICB2YXIgdXJsOwogICAgaWYgKC9eaHR0cHM/OlwvXC8vaS50ZXN0KHBhdGgpKSB7CiAgICAgIHVybCA9IHBhdGg7CiAgICB9IGVsc2UgewogICAgICB2YXIgYmFzZSA9IFYuY29uZmlnLkFQSS5yZXBsYWNlKC9cLyskLywgJycpOwogICAgICB1cmwgPSBiYXNlICsgKHBhdGguY2hhckF0KDApID09PSAnLycgPyBwYXRoIDogJy8nICsgcGF0aCk7CiAgICB9CiAgICBpZiAocXVlcnkgJiYgdHlwZW9mIHF1ZXJ5ID09PSAnb2JqZWN0JykgewogICAgICB2YXIgcGFydHMgPSBbXTsKICAgICAgZm9yICh2YXIgayBpbiBxdWVyeSkgewogICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocXVlcnksIGspKSB7CiAgICAgICAgICB2YXIgdmFsID0gcXVlcnlba107CiAgICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsIHx8IHZhbCA9PT0gJycpIGNvbnRpbnVlOwogICAgICAgICAgcGFydHMucHVzaChlbmNvZGVVUklDb21wb25lbnQoaykgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwYXJ0cy5sZW5ndGgpIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA+PSAwID8gJyYnIDogJz8nKSArIHBhcnRzLmpvaW4oJyYnKTsKICAgIH0KICAgIHJldHVybiB1cmw7CiAgfQoKICBmdW5jdGlvbiBhdXRoVG9rZW4oKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5hdXRoICYmIHR5cGVvZiBWLmF1dGgudG9rZW4gPT09ICdmdW5jdGlvbicpIHJldHVybiBWLmF1dGgudG9rZW4oKTsKICAgIH0gY2F0Y2ggKF9lKSB7ICB9CgogICAgdHJ5IHsKICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndmFtcF93ZWJfdG9rZW4nKTsKICAgIH0gY2F0Y2ggKF9lMikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlcXVlc3QocGF0aCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgbWV0aG9kID0gKG9wdHMubWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpOwogICAgdmFyIGhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRzLmhlYWRlcnMgfHwge30pOwogICAgdmFyIGZldGNoSW5pdCA9IHsgbWV0aG9kOiBtZXRob2QsIGhlYWRlcnM6IGhlYWRlcnMgfTsKCiAgICBpZiAob3B0cy5zaWduYWwpIGZldGNoSW5pdC5zaWduYWwgPSBvcHRzLnNpZ25hbDsKCiAgICB2YXIgaGFzQm9keSA9IG9wdHMuYm9keSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuYm9keSAhPT0gbnVsbCAmJiBtZXRob2QgIT09ICdHRVQnICYmIG1ldGhvZCAhPT0gJ0hFQUQnOwogICAgaWYgKGhhc0JvZHkpIHsKICAgICAgaWYgKAogICAgICAgIG9wdHMuYm9keSBpbnN0YW5jZW9mIEJsb2IgfHwKICAgICAgICBvcHRzLmJvZHkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fAogICAgICAgIG9wdHMuYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhIHx8CiAgICAgICAgKHR5cGVvZiBvcHRzLmJvZHkgPT09ICdzdHJpbmcnKQogICAgICApIHsKCiAgICAgICAgZmV0Y2hJbml0LmJvZHkgPSBvcHRzLmJvZHk7CiAgICAgIH0gZWxzZSB7CgogICAgICAgIGlmICghaGFzSGVhZGVyKGhlYWRlcnMsICdDb250ZW50LVR5cGUnKSkgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7CiAgICAgICAgZmV0Y2hJbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShzdHJpcEZyYWN0aW9uYWwob3B0cy5ib2R5KSk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAob3B0cy5hdXRoICE9PSBmYWxzZSAmJiAhaGFzSGVhZGVyKGhlYWRlcnMsICdBdXRob3JpemF0aW9uJykpIHsKICAgICAgdmFyIHRvayA9IGF1dGhUb2tlbigpOwogICAgICBpZiAodG9rKSBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSAnQmVhcmVyICcgKyB0b2s7CiAgICB9CgogICAgdmFyIHVybCA9IGJ1aWxkVVJMKHBhdGgsIG9wdHMucXVlcnkpOwoKICAgIHJldHVybiBmZXRjaCh1cmwsIGZldGNoSW5pdCkudGhlbihmdW5jdGlvbiAocmVzKSB7CgogICAgICBpZiAoKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpICYmIG9wdHMuYXV0aCAhPT0gZmFsc2UpIHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLmNsZWFyID09PSAnZnVuY3Rpb24nKSBWLmF1dGguY2xlYXIoKTsKICAgICAgICAgIGVsc2Ugd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd2YW1wX3dlYl90b2tlbicpOwogICAgICAgIH0gY2F0Y2ggKF9lKSB7ICB9CiAgICAgIH0KCiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MjkgJiYgKG9wdHMuX2F0dGVtcHQgfHwgMCkgPCAyKSB7CiAgICAgICAgdmFyIHJhID0gcGFyc2VGbG9hdChyZXMuaGVhZGVycyAmJiByZXMuaGVhZGVycy5nZXQgPyByZXMuaGVhZGVycy5nZXQoJ1JldHJ5LUFmdGVyJykgOiAnJyk7CiAgICAgICAgaWYgKCEoaXNGaW5pdGUocmEpICYmIHJhID4gMTUpKSB7CiAgICAgICAgICB2YXIgd2FpdE1zID0gKGlzRmluaXRlKHJhKSAmJiByYSA+IDApCiAgICAgICAgICAgID8gcmEgKiAxMDAwCiAgICAgICAgICAgIDogKDcwMCAqIE1hdGgucG93KDIsIG9wdHMuX2F0dGVtcHQgfHwgMCkpICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMzAwKTsKICAgICAgICAgIHZhciBuZXh0ID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0cywgeyBfYXR0ZW1wdDogKG9wdHMuX2F0dGVtcHQgfHwgMCkgKyAxIH0pOwogICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChycykgeyBzZXRUaW1lb3V0KHJzLCB3YWl0TXMpOyB9KS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlcXVlc3QocGF0aCwgbmV4dCk7IH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKG9wdHMucmF3KSB7CiAgICAgICAgaWYgKCFyZXMub2sgJiYgcmVzLnN0YXR1cyAhPT0gMjAyKSB7CiAgICAgICAgICByZXR1cm4gcmVzLnRleHQoKS50aGVuKGZ1bmN0aW9uICh0eHQpIHsKICAgICAgICAgICAgdmFyIGJvZHkgPSBzYWZlUGFyc2UodHh0KTsKICAgICAgICAgICAgdGhyb3cgQXBpRXJyb3IocmVzLnN0YXR1cywgZXJyb3JNZXNzYWdlKGJvZHksIHJlcy5zdGF0dXMpLCBib2R5KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgICB9CgogICAgICByZXR1cm4gcmVzLnRleHQoKS50aGVuKGZ1bmN0aW9uICh0eHQpIHsKICAgICAgICB2YXIgYm9keSA9IHNhZmVQYXJzZSh0eHQpOwogICAgICAgIGlmIChyZXMub2spIHJldHVybiBib2R5OwogICAgICAgIHRocm93IEFwaUVycm9yKHJlcy5zdGF0dXMsIGVycm9yTWVzc2FnZShib2R5LCByZXMuc3RhdHVzKSwgYm9keSk7CiAgICAgIH0pOwogICAgfSwgZnVuY3Rpb24gKG5ldHdvcmtFcnIpIHsKCiAgICAgIGlmIChuZXR3b3JrRXJyICYmIG5ldHdvcmtFcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB0aHJvdyBuZXR3b3JrRXJyOwogICAgICB0aHJvdyBBcGlFcnJvcigwLCBuZXR3b3JrRXJyICYmIG5ldHdvcmtFcnIubWVzc2FnZSA/IG5ldHdvcmtFcnIubWVzc2FnZSA6ICdOZXR3b3JrIGVycm9yLiBDaGVjayB5b3VyIGNvbm5lY3Rpb24uJywgbnVsbCk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGhhc0hlYWRlcihoZWFkZXJzLCBuYW1lKSB7CiAgICB2YXIgbG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICBmb3IgKHZhciBrIGluIGhlYWRlcnMpIHsKICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoZWFkZXJzLCBrKSAmJiBrLnRvTG93ZXJDYXNlKCkgPT09IGxuYW1lKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIHBvbGwoc3VibWl0Rm4sIHBvbGxGbiwgb3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICB2YXIgaW50ZXJ2YWxNcyA9IG9wdGlvbnMuaW50ZXJ2YWxNcyAhPSBudWxsID8gb3B0aW9ucy5pbnRlcnZhbE1zIDogMjAwMDsKICAgIHZhciB0aW1lb3V0TXMgPSBvcHRpb25zLnRpbWVvdXRNcyAhPSBudWxsID8gb3B0aW9ucy50aW1lb3V0TXMgOiAxODAwMDA7CiAgICB2YXIgb25Qcm9ncmVzcyA9IHR5cGVvZiBvcHRpb25zLm9uUHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLm9uUHJvZ3Jlc3MgOiBmdW5jdGlvbiAoKSB7fTsKICAgIHZhciBzaWduYWwgPSBvcHRpb25zLnNpZ25hbCB8fCBudWxsOwoKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBzZXR0bGVkID0gZmFsc2U7CiAgICAgIHZhciBzdGFydGVkID0gRGF0ZS5ub3coKTsKICAgICAgdmFyIGF0dGVtcHQgPSAwOwogICAgICB2YXIgdGltZXIgPSBudWxsOwoKICAgICAgZnVuY3Rpb24gYWJvcnRFcnJvcigpIHsKICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcignQWJvcnRlZCcpOwogICAgICAgIGUubmFtZSA9ICdBYm9ydEVycm9yJzsKICAgICAgICByZXR1cm4gZTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY2xlYW51cCgpIHsKICAgICAgICBpZiAodGltZXIpIHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgdGltZXIgPSBudWxsOyB9CiAgICAgICAgaWYgKHNpZ25hbCkgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gb25BYm9ydCgpIHsKICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOwogICAgICAgIHNldHRsZWQgPSB0cnVlOwogICAgICAgIGNsZWFudXAoKTsKICAgICAgICByZWplY3QoYWJvcnRFcnJvcigpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBmYWlsKGVycikgewogICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47CiAgICAgICAgc2V0dGxlZCA9IHRydWU7CiAgICAgICAgY2xlYW51cCgpOwogICAgICAgIHJlamVjdChlcnIpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGRvbmUocmVzdWx0KSB7CiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjsKICAgICAgICBzZXR0bGVkID0gdHJ1ZTsKICAgICAgICBjbGVhbnVwKCk7CiAgICAgICAgcmVzb2x2ZShyZXN1bHQpOwogICAgICB9CgogICAgICBpZiAoc2lnbmFsKSB7CiAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7IG9uQWJvcnQoKTsgcmV0dXJuOyB9CiAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7CiAgICAgIH0KCiAgICAgIFByb21pc2UucmVzb2x2ZSgpCiAgICAgICAgLnRoZW4oc3VibWl0Rm4pCiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHN1Ym1pdFJlc3VsdCkgewogICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjsKICAgICAgICAgIG9uUHJvZ3Jlc3MoeyBwaGFzZTogJ3N1Ym1pdHRlZCcsIGF0dGVtcHQ6IDAsIHN1Ym1pdDogc3VibWl0UmVzdWx0IH0pOwoKICAgICAgICAgIGZ1bmN0aW9uIGxvb3AoKSB7CiAgICAgICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47CiAgICAgICAgICAgIGlmIChzaWduYWwgJiYgc2lnbmFsLmFib3J0ZWQpIHsgb25BYm9ydCgpOyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydGVkID4gdGltZW91dE1zKSB7CiAgICAgICAgICAgICAgZmFpbChBcGlFcnJvcig0MDgsICdUaGlzIGlzIHRha2luZyBsb25nZXIgdGhhbiBleHBlY3RlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCBudWxsKSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF0dGVtcHQrKzsKICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkKICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiBwb2xsRm4oc3VibWl0UmVzdWx0LCBhdHRlbXB0KTsgfSkKICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOwogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIG9uUHJvZ3Jlc3MoeyBwaGFzZTogJ3BvbGxpbmcnLCBhdHRlbXB0OiBhdHRlbXB0LCBzdWJtaXQ6IHN1Ym1pdFJlc3VsdCB9KTsKICAgICAgICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGxvb3AsIGludGVydmFsTXMpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgZG9uZShyZXN1bHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykgeyBvbkFib3J0KCk7IHJldHVybjsgfQogICAgICAgICAgICAgICAgZmFpbChlcnIpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgfQoKICAgICAgICAgIGxvb3AoKTsKICAgICAgICB9KQogICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHsgb25BYm9ydCgpOyByZXR1cm47IH0KICAgICAgICAgIGZhaWwoZXJyKTsKICAgICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcmFuZG9tU2VlZCgpIHsKICAgIGlmIChWLnV0aWwgJiYgdHlwZW9mIFYudXRpbC5yYW5kb21TZWVkID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51dGlsLnJhbmRvbVNlZWQoKTsKICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKTsKICB9CgogIHZhciBOQU5PX01PREVMUyA9IHsgbmFub0JhbmFuYTogdHJ1ZSwgbmFub0JhbmFuYTI6IHRydWUsIG5hbm9CYW5hbmFQcm86IHRydWUgfTsKCiAgZnVuY3Rpb24gZmx1eEltYWdlVVJMKGJvZHkpIHsKICAgIGlmICghYm9keSB8fCAhQXJyYXkuaXNBcnJheShib2R5LmltYWdlcykgfHwgIWJvZHkuaW1hZ2VzLmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICB2YXIgZmlyc3QgPSBib2R5LmltYWdlc1swXTsKICAgIGlmICghZmlyc3QpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGZpcnN0LnVybCB8fCBudWxsOwogIH0KCiAgZnVuY3Rpb24gaXNQZW5kaW5nUmVzdWx0KGJvZHkpIHsKICAgIGlmICghYm9keSB8fCB0eXBlb2YgYm9keSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTsKICAgIHZhciBzdCA9IChib2R5LnN0YXR1cyB8fCBib2R5LnN0YXRlIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7CiAgICBpZiAoc3QgJiYgL1FVRVVFfFBST0dSRVNTfFBFTkRJTkd8UFJPQ0VTU3xSVU5OSU5HfFNUQVJURUR8U1VCTUlUVEVELy50ZXN0KHN0KSkgcmV0dXJuIHRydWU7CiAgICBpZiAoYm9keS51cmwgfHwgYm9keS52aWRlbyB8fCBib2R5LnZpZGVvX3VybCB8fCBib2R5LnZpZGVvVVJMIHx8IGJvZHkuZXJyb3IpIHJldHVybiBmYWxzZTsKICAgIGlmIChBcnJheS5pc0FycmF5KGJvZHkuaW1hZ2VzKSkgcmV0dXJuIGJvZHkuaW1hZ2VzLmxlbmd0aCA9PT0gMDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIHBvbGxSZXNwb25zZShyZXMsIGV4dHJhY3QpIHsKICAgIGlmIChyZXMuc3RhdHVzID09PSAyMDIpIHJldHVybiBudWxsOwogICAgaWYgKHJlcy5vaykgewogICAgICByZXR1cm4gcmVzLnRleHQoKS50aGVuKGZ1bmN0aW9uICh0eHQpIHsKICAgICAgICB2YXIgYm9keSA9IHNhZmVQYXJzZSh0eHQpOwogICAgICAgIGlmIChpc1BlbmRpbmdSZXN1bHQoYm9keSkpIHJldHVybiBudWxsOwogICAgICAgIHJldHVybiBleHRyYWN0ID8gZXh0cmFjdChib2R5KSA6IGJvZHk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHJlcy50ZXh0KCkudGhlbihmdW5jdGlvbiAodHh0KSB7CiAgICAgIHZhciBib2R5ID0gc2FmZVBhcnNlKHR4dCk7CiAgICAgIHRocm93IEFwaUVycm9yKHJlcy5zdGF0dXMsIGVycm9yTWVzc2FnZShib2R5LCByZXMuc3RhdHVzKSwgYm9keSk7CiAgICB9KTsKICB9CgogIHZhciBhcGkgPSB7CgogICAgcmVxdWVzdDogcmVxdWVzdCwKICAgIHBvbGw6IHBvbGwsCiAgICBBcGlFcnJvcjogQXBpRXJyb3IsCiAgICBfc3RyaXBGcmFjdGlvbmFsOiBzdHJpcEZyYWN0aW9uYWwsCiAgICBfZmx1eEltYWdlVVJMOiBmbHV4SW1hZ2VVUkwsCgogICAgc2lnbnVwOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICB2YXIgYm9keSA9IE9iamVjdC5hc3NpZ24oCiAgICAgICAgewogICAgICAgICAgaGFzQWNjZXB0ZWRUZXJtc0FuZENvbmRpdGlvbnM6IHRydWUsCiAgICAgICAgICBoYXNBY2NlcHRlZFByaXZhY3lQb2xpY3k6IHRydWUsCiAgICAgICAgICBoYXJkd2FyZTogbnVsbAogICAgICAgIH0sCiAgICAgICAgZGF0YSB8fCB7fQogICAgICApOwogICAgICBpZiAoYm9keS5lbWFpbCkgYm9keS5lbWFpbCA9IFN0cmluZyhib2R5LmVtYWlsKS50b0xvd2VyQ2FzZSgpOwogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL3VzZXJzJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogYm9keSwgYXV0aDogZmFsc2UgfSk7CiAgICB9LAoKICAgIGxvZ2luOiBmdW5jdGlvbiAoZW1haWwsIHBhc3N3b3JkKSB7CiAgICAgIHZhciBiYXNpYzsKICAgICAgaWYgKFYudXRpbCAmJiB0eXBlb2YgVi51dGlsLmJhc2ljQXV0aEhlYWRlciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGJhc2ljID0gVi51dGlsLmJhc2ljQXV0aEhlYWRlcihlbWFpbCwgcGFzc3dvcmQpOwogICAgICB9IGVsc2UgewogICAgICAgIGJhc2ljID0gJ0Jhc2ljICcgKyBiNjQoU3RyaW5nKGVtYWlsKS50b0xvd2VyQ2FzZSgpICsgJzonICsgcGFzc3dvcmQpOwogICAgICB9CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvYXV0aC9sb2dpbicsIHsKICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICBhdXRoOiBmYWxzZSwKICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGJhc2ljIH0KICAgICAgfSk7CiAgICB9LAoKICAgIHdob2FtaTogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2F1dGgvdG9rZW4nLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIHJlcXVlc3RSZXNldDogZnVuY3Rpb24gKGVtYWlsKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvYXV0aC9wYXNzd29yZC9jb2RlJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGF1dGg6IGZhbHNlLAogICAgICAgIGJvZHk6IHsgZW1haWw6IFN0cmluZyhlbWFpbCkudG9Mb3dlckNhc2UoKSB9CiAgICAgIH0pOwogICAgfSwKCiAgICBzdWJtaXRSZXNldDogZnVuY3Rpb24gKGVtYWlsLCBjb2RlLCBuZXdQYXNzd29yZCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2F1dGgvcGFzc3dvcmQvcmVzZXQnLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgYXV0aDogZmFsc2UsCiAgICAgICAgYm9keTogeyBlbWFpbDogU3RyaW5nKGVtYWlsKS50b0xvd2VyQ2FzZSgpLCBjb2RlOiBjb2RlLCBuZXdQYXNzd29yZDogbmV3UGFzc3dvcmQgfQogICAgICB9KTsKICAgIH0sCgogICAgZW1haWxBdmFpbGFibGU6IGZ1bmN0aW9uIChlbWFpbCkgewogICAgICB2YXIgZW5jID0gZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhlbWFpbCkudG9Mb3dlckNhc2UoKSk7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvYXV0aC9pc0VtYWlsQXZhaWxhYmxlLycgKyBlbmMsIHsgbWV0aG9kOiAnUE9TVCcsIGF1dGg6IGZhbHNlIH0pCiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGJvZHkpIHsKCiAgICAgICAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdib29sZWFuJykgcmV0dXJuIGJvZHk7CiAgICAgICAgICBpZiAoYm9keSAmJiB0eXBlb2YgYm9keS5hdmFpbGFibGUgPT09ICdib29sZWFuJykgcmV0dXJuIGJvZHkuYXZhaWxhYmxlOwogICAgICAgICAgcmV0dXJuIGJvZHkgPT09ICd0cnVlJyB8fCBib2R5ID09PSB0cnVlOwogICAgICAgIH0pOwogICAgfSwKCiAgICB1c2VybmFtZUF2YWlsYWJsZTogZnVuY3Rpb24gKHVzZXJuYW1lKSB7CiAgICAgIHZhciBlbmMgPSBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKHVzZXJuYW1lKS50b0xvd2VyQ2FzZSgpKTsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9hdXRoL2lzVXNlcm5hbWVBdmFpbGFibGUvJyArIGVuYywgeyBtZXRob2Q6ICdQT1NUJywgYXV0aDogZmFsc2UgfSkKICAgICAgICAudGhlbihmdW5jdGlvbiAoYm9keSkgewogICAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnYm9vbGVhbicpIHJldHVybiBib2R5OwogICAgICAgICAgaWYgKGJvZHkgJiYgdHlwZW9mIGJvZHkuYXZhaWxhYmxlID09PSAnYm9vbGVhbicpIHJldHVybiBib2R5LmF2YWlsYWJsZTsKICAgICAgICAgIHJldHVybiBib2R5ID09PSAndHJ1ZScgfHwgYm9keSA9PT0gdHJ1ZTsKICAgICAgICB9KTsKICAgIH0sCgogICAgdXBkYXRlQWNjb3VudDogZnVuY3Rpb24gKHB1dERhdGEpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS91c2VycycsIHsgbWV0aG9kOiAnUFVUJywgYm9keTogcHV0RGF0YSB9KTsKICAgIH0sCgogICAgZGVsZXRlQWNjb3VudDogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL3VzZXJzJywgeyBtZXRob2Q6ICdERUxFVEUnIH0pOwogICAgfSwKCiAgICBjcmVkaXRzOiBmdW5jdGlvbiAoKSB7CgogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL3VzZXIvY3JlZGl0cycsIHsgbWV0aG9kOiAnR0VUJyB9KS50aGVuKGZ1bmN0aW9uIChib2R5KSB7CiAgICAgICAgdmFyIG4gPSBib2R5ICYmIHR5cGVvZiBib2R5LmNyZWRpdHMgPT09ICdudW1iZXInID8gYm9keS5jcmVkaXRzIDogMDsKICAgICAgICByZXR1cm4geyBjcmVkaXRzOiBuIH07CiAgICAgIH0pOwogICAgfSwKCiAgICBjaGVja291dDogZnVuY3Rpb24gKHByb2R1Y3RJRCkgewoKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9wYXkvY2hlY2tvdXQnLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiB7IHByb2R1Y3RJRDogcHJvZHVjdElEIH0gfSk7CiAgICB9LAoKICAgIGdlblRleHRUb0ltYWdlOiBmdW5jdGlvbiAocGFyYW1zKSB7CiAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTsKICAgICAgdmFyIHdpZHRoID0gcGFyYW1zLndpZHRoIHx8IChwYXJhbXMuaW1hZ2Vfc2l6ZSAmJiBwYXJhbXMuaW1hZ2Vfc2l6ZS53aWR0aCkgfHwgMTAyNDsKICAgICAgdmFyIGhlaWdodCA9IHBhcmFtcy5oZWlnaHQgfHwgKHBhcmFtcy5pbWFnZV9zaXplICYmIHBhcmFtcy5pbWFnZV9zaXplLmhlaWdodCkgfHwgMTAyNDsKICAgICAgdmFyIHNlZWQgPSBwYXJhbXMuc2VlZCAhPSBudWxsID8gcGFyYW1zLnNlZWQgOiByYW5kb21TZWVkKCk7CiAgICAgIHZhciBib2R5ID0gewogICAgICAgIHByb21wdDogcGFyYW1zLnByb21wdCB8fCAnJywKICAgICAgICBzZWVkOiBzZWVkLAogICAgICAgIGltYWdlX3NpemU6IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9CiAgICAgIH07CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZ2VuL2ZsdXgtc2NobmVsbCcsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IGJvZHksIHJhdzogdHJ1ZSB9KQogICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIHBhcnNlU3VibWl0KHJlcyk7IH0pOwogICAgfSwKCiAgICBwb2xsVGV4dFRvSW1hZ2U6IGZ1bmN0aW9uIChyZXF1ZXN0SUQpIHsKICAgICAgcmVxdWVzdElEID0gcmVxSWQocmVxdWVzdElEKTsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9nZW4vZmx1eC1zY2huZWxsLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVxdWVzdElEKSwgewogICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgcmF3OiB0cnVlCiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykgeyByZXR1cm4gcG9sbFJlc3BvbnNlKHJlcyk7IH0pOwogICAgfSwKCiAgICBnZW5FZGl0OiBmdW5jdGlvbiAobW9kZWwsIHBhcmFtcykgewogICAgICBtb2RlbCA9IG1vZGVsIHx8ICdmbHV4S2xlaW4nOwogICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307CiAgICAgIHZhciBib2R5ID0gc2hhcGVFZGl0UmVxdWVzdChtb2RlbCwgcGFyYW1zKTsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9nZW4vZWRpdC1pbWFnZScsIHsKICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICBxdWVyeTogeyBtb2RlbDogbW9kZWwgfSwKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHJhdzogdHJ1ZQogICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIHBhcnNlU3VibWl0KHJlcyk7IH0pOwogICAgfSwKCiAgICBwb2xsRWRpdDogZnVuY3Rpb24gKG1vZGVsLCByZXF1ZXN0SUQpIHsKICAgICAgcmVxdWVzdElEID0gcmVxSWQocmVxdWVzdElEKTsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9nZW4vZWRpdC1pbWFnZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlcXVlc3RJRCksIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIHF1ZXJ5OiB7IG1vZGVsOiBtb2RlbCB8fCAnZmx1eEtsZWluJyB9LAogICAgICAgIHJhdzogdHJ1ZQogICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIHBvbGxSZXNwb25zZShyZXMpOyB9KTsKICAgIH0sCgogICAgc2hhcGVFZGl0UmVxdWVzdDogZnVuY3Rpb24gKG1vZGVsLCBwYXJhbXMpIHsgcmV0dXJuIHNoYXBlRWRpdFJlcXVlc3QobW9kZWwsIHBhcmFtcyk7IH0sCgogICAgZ2VuRHluYW1pYzogZnVuY3Rpb24gKGVuZHBvaW50SWQsIHBhcmFtcykgewogICAgICB2YXIgYm9keSA9IHNoYXBlRWRpdFJlcXVlc3QocGFyYW1zICYmIHBhcmFtcy5tb2RlbCA/IHBhcmFtcy5tb2RlbCA6IG51bGwsIHBhcmFtcyB8fCB7fSk7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZ2VuL2R5bmFtaWMvJyArIGVuY29kZVNsdWcoZW5kcG9pbnRJZCksIHsKICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHJhdzogdHJ1ZQogICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIHBhcnNlU3VibWl0KHJlcyk7IH0pOwogICAgfSwKCiAgICBwb2xsRHluYW1pYzogZnVuY3Rpb24gKGVuZHBvaW50SWQsIHJlcXVlc3RJRCkgewogICAgICByZXF1ZXN0SUQgPSByZXFJZChyZXF1ZXN0SUQpOwogICAgICByZXR1cm4gcmVxdWVzdCgKICAgICAgICAnL3YxL2RyZWFtL2dlbi9keW5hbWljLycgKyBlbmNvZGVTbHVnKGVuZHBvaW50SWQpICsgJy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlcXVlc3RJRCksCiAgICAgICAgeyBtZXRob2Q6ICdHRVQnLCByYXc6IHRydWUgfQogICAgICApLnRoZW4oZnVuY3Rpb24gKHJlcykgeyByZXR1cm4gcG9sbFJlc3BvbnNlKHJlcyk7IH0pOwogICAgfSwKCiAgICBtb2RlbHM6IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9tb2RlbHMnLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIHJlZ2lzdHJ5OiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vcmVnaXN0cnknLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIGdlblZpZGVvTFRYOiBmdW5jdGlvbiAocGFyYW1zKSB7CiAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTsKICAgICAgdmFyIGJvZHkgPSB7CiAgICAgICAgaW1hZ2VfdXJsOiBwYXJhbXMuaW1hZ2VfdXJsLAogICAgICAgIHByb21wdDogcGFyYW1zLnByb21wdCB8fCAnJywKICAgICAgICBkdXJhdGlvbjogcGFyYW1zLmR1cmF0aW9uICE9IG51bGwgPyBwYXJhbXMuZHVyYXRpb24gOiA4LAogICAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkICE9IG51bGwgPyBwYXJhbXMuc2VlZCA6IHJhbmRvbVNlZWQoKQogICAgICB9OwogICAgICBpZiAocGFyYW1zLmVuZF9pbWFnZV91cmwpIGJvZHkuZW5kX2ltYWdlX3VybCA9IHBhcmFtcy5lbmRfaW1hZ2VfdXJsOwogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2dlbi9sdHgtdmlkZW8nLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiBib2R5LCByYXc6IHRydWUgfSkKICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7IHJldHVybiBwYXJzZVN1Ym1pdChyZXMpOyB9KTsKICAgIH0sCgogICAgcG9sbFZpZGVvTFRYOiBmdW5jdGlvbiAocmVxdWVzdElELCBnZW5lcmF0ZWRJbWFnZUlEKSB7CiAgICAgIHJlcXVlc3RJRCA9IHJlcUlkKHJlcXVlc3RJRCk7CiAgICAgIHZhciBxdWVyeSA9IHt9OwogICAgICBpZiAoZ2VuZXJhdGVkSW1hZ2VJRCkgcXVlcnkuZ2VuZXJhdGVkSW1hZ2VJRCA9IGdlbmVyYXRlZEltYWdlSUQ7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZ2VuL2x0eC12aWRlby8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlcXVlc3RJRCksIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIHF1ZXJ5OiBxdWVyeSwKICAgICAgICByYXc6IHRydWUKICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgcmV0dXJuIHBvbGxSZXNwb25zZShyZXMsIGZ1bmN0aW9uIChib2R5KSB7CgogICAgICAgICAgcmV0dXJuIGJvZHk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSwKCiAgICBwZXJzaXN0SW1hZ2U6IGZ1bmN0aW9uIChnZW5lcmF0ZWRJbWFnZSkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ltYWdlcycsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IGdlbmVyYXRlZEltYWdlIH0pOwogICAgfSwKCiAgICBsaWJyYXJ5OiBmdW5jdGlvbiAocGFnZSwgcGVyKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vdXNlci9tZS9nZW5lcmF0ZWRpbWFnZXMnLCB7CiAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICBxdWVyeTogeyBwYWdlOiBwYWdlICE9IG51bGwgPyBwYWdlIDogMSwgcGVyOiBwZXIgIT0gbnVsbCA/IHBlciA6IDMwIH0KICAgICAgfSkudGhlbihwYWdpbmF0ZWQpOwogICAgfSwKCiAgICBmYXZvcml0ZXM6IGZ1bmN0aW9uIChwZXIpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS91c2VyL21lL2dlbmVyYXRlZGltYWdlcy9mYXZvcml0ZWQnLCB7CiAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICBxdWVyeTogeyBwZXI6IHBlciAhPSBudWxsID8gcGVyIDogMjAwIH0KICAgICAgfSkudGhlbihwYWdpbmF0ZWQpOwogICAgfSwKCiAgICBzZXRGYXZvcml0ZTogZnVuY3Rpb24gKHJlbW90ZUlELCBmYXZvcml0ZWQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9pbWFnZXMvJyArIGVuY29kZVVSSUNvbXBvbmVudChyZW1vdGVJRCkgKyAnL2Zhdm9yaXRlZCcsIHsKICAgICAgICBtZXRob2Q6ICdQQVRDSCcsCiAgICAgICAgYm9keTogeyBmYXZvcml0ZWQ6ICEhZmF2b3JpdGVkIH0KICAgICAgfSk7CiAgICB9LAoKICAgIGRlbGV0ZUltYWdlOiBmdW5jdGlvbiAocmVtb3RlSUQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92Mi9nZW5lcmF0ZWRpbWFnZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlbW90ZUlEKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pOwogICAgfSwKCiAgICBkZWxldGVMaWJyYXJ5SW1hZ2U6IGZ1bmN0aW9uIChyZW1vdGVJRCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ltYWdlcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlbW90ZUlEKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pOwogICAgfSwKCiAgICBzZXRQdWJsaXNoZWQ6IGZ1bmN0aW9uIChyZW1vdGVJRCwgcHVibGlzaGVkKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vaW1hZ2VzLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVtb3RlSUQpLCB7CiAgICAgICAgbWV0aG9kOiAnUFVUJywKICAgICAgICBib2R5OiB7IHB1Ymxpc2hlZDogISFwdWJsaXNoZWQgfQogICAgICB9KTsKICAgIH0sCgogICAgcmF0aW5nOiBmdW5jdGlvbiAocmVtb3RlSUQsIGFjdGlvbikgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ltYWdlcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlbW90ZUlEKSArICcvcmF0aW5nJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGJvZHk6IHsgYWN0aW9uOiBhY3Rpb24gfQogICAgICB9KTsKICAgIH0sCgogICAgaGlzdG9yeTogZnVuY3Rpb24gKHJlbW90ZUlEKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vaW1hZ2VzLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVtb3RlSUQpICsgJy9oaXN0b3J5JywgewogICAgICAgIG1ldGhvZDogJ0dFVCcKICAgICAgfSk7CiAgICB9LAoKICAgIHB1YmxpY0ZlZWQ6IGZ1bmN0aW9uIChwYWdlLCBwZXIsIHRhZykgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ltYWdlcycsIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIGF1dGg6IGZhbHNlLAogICAgICAgIHF1ZXJ5OiB7IHBhZ2U6IHBhZ2UgIT0gbnVsbCA/IHBhZ2UgOiAxLCBwZXI6IHBlciAhPSBudWxsID8gcGVyIDogMzAsIHRhZzogdGFnIHx8IHVuZGVmaW5lZCB9CiAgICAgIH0pLnRoZW4ocGFnaW5hdGVkKTsKICAgIH0sCgogICAgZm9sZGVyczogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ZvbGRlcnMnLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIGNyZWF0ZUZvbGRlcjogZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9mb2xkZXJzJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogeyBuYW1lOiBuYW1lIH0gfSk7CiAgICB9LAoKICAgIHJlbmFtZUZvbGRlcjogZnVuY3Rpb24gKGlkLCBuYW1lKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZm9sZGVycy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSwgewogICAgICAgIG1ldGhvZDogJ1BBVENIJywKICAgICAgICBib2R5OiB7IG5hbWU6IG5hbWUgfQogICAgICB9KTsKICAgIH0sCgogICAgZGVsZXRlRm9sZGVyOiBmdW5jdGlvbiAoaWQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9mb2xkZXJzLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7CiAgICB9LAoKICAgIGFzc2lnbkZvbGRlcjogZnVuY3Rpb24gKGZvbGRlcklELCBpbWFnZUlEcykgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ZvbGRlcnMvYXNzaWduJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGJvZHk6IHsgZm9sZGVySUQ6IGZvbGRlcklEICE9IG51bGwgPyBmb2xkZXJJRCA6IG51bGwsIGltYWdlSURzOiBpbWFnZUlEcyB8fCBbXSB9CiAgICAgIH0pOwogICAgfSwKCiAgICBmb2xkZXJJbWFnZXM6IGZ1bmN0aW9uIChpZCwgcGFnZSwgcGVyKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZm9sZGVycy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSArICcvaW1hZ2VzJywgewogICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgcXVlcnk6IHsgcGFnZTogcGFnZSAhPSBudWxsID8gcGFnZSA6IDEsIHBlcjogcGVyICE9IG51bGwgPyBwZXIgOiAzMCB9CiAgICAgIH0pLnRoZW4ocGFnaW5hdGVkKTsKICAgIH0sCgogICAgcHJlc2V0czogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YzL3ByZXNldHMnLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIGNyZWF0ZVByZXNldDogZnVuY3Rpb24gKHApIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92My9wcmVzZXRzJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogbm9ybWFsaXplUHJlc2V0KHApIH0pOwogICAgfSwKCiAgICB1cGRhdGVQcmVzZXQ6IGZ1bmN0aW9uIChpZCwgcCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YzL3ByZXNldHMvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCksIHsKICAgICAgICBtZXRob2Q6ICdQVVQnLAogICAgICAgIGJvZHk6IG5vcm1hbGl6ZVByZXNldChwKQogICAgICB9KTsKICAgIH0sCgogICAgZGVsZXRlUHJlc2V0OiBmdW5jdGlvbiAoaWQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92My9wcmVzZXRzLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7CiAgICB9LAoKICAgIHJlb3JkZXJQcmVzZXRzOiBmdW5jdGlvbiAoaWRzKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjMvcHJlc2V0cy9yZW9yZGVyJywgeyBtZXRob2Q6ICdQVVQnLCBib2R5OiB7IG9yZGVyZWRJRHM6IGlkcyB8fCBbXSB9IH0pOwogICAgfSwKCiAgICBzeW5jUHJlc2V0czogZnVuY3Rpb24gKHByZXNldHMpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92My9wcmVzZXRzL3N5bmMnLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgYm9keTogeyBwcmVzZXRzOiAocHJlc2V0cyB8fCBbXSkubWFwKG5vcm1hbGl6ZVByZXNldCkgfQogICAgICB9KTsKICAgIH0sCgogICAgY3VyYXRlZEZlZWQ6IGZ1bmN0aW9uIChwYWdlLCBwZXIsIHRhZykgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YyL2N1cmF0aW9uL2dlbmVyYXRlZGltYWdlcycsIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIGF1dGg6IGZhbHNlLAogICAgICAgIHF1ZXJ5OiB7IHBhZ2U6IHBhZ2UgIT0gbnVsbCA/IHBhZ2UgOiAxLCBwZXI6IHBlciAhPSBudWxsID8gcGVyIDogMzAsIHRhZzogdGFnIHx8IHVuZGVmaW5lZCB9CiAgICAgIH0pLnRoZW4ocGFnaW5hdGVkKTsKICAgIH0sCgogICAgZ2V0UHJvZmlsZTogZnVuY3Rpb24gKGlkKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjIvcHJvZmlsZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSwgeyBtZXRob2Q6ICdHRVQnIH0pOwogICAgfSwKCiAgICBnZXRQcml2YXRlUHJvZmlsZTogZnVuY3Rpb24gKGlkKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjIvcHJvZmlsZS9wcml2YXRlLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIGNyZWF0ZVByb2ZpbGU6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjIvcHJvZmlsZScsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IGRhdGEgfSk7CiAgICB9LAoKICAgIHVwZGF0ZVByb2ZpbGU6IGZ1bmN0aW9uIChpZCwgZGF0YSkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YyL3Byb2ZpbGUvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCksIHsgbWV0aG9kOiAnUFVUJywgYm9keTogZGF0YSB9KTsKICAgIH0sCgogICAgZGVsZXRlUHJvZmlsZTogZnVuY3Rpb24gKGlkKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjIvcHJvZmlsZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pOwogICAgfSwKCiAgICBwcm9maWxlSW1hZ2VzOiBmdW5jdGlvbiAoaWQsIHBhZ2UsIHBlcikgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YyL3Byb2ZpbGUvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCkgKyAnL2dlbmVyYXRlZGltYWdlcycsIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIHF1ZXJ5OiB7IHBhZ2U6IHBhZ2UgIT0gbnVsbCA/IHBhZ2UgOiAxLCBwZXI6IHBlciAhPSBudWxsID8gcGVyIDogMzAgfQogICAgICB9KS50aGVuKHBhZ2luYXRlZCk7CiAgICB9LAoKICAgIHB1Ymxpc2hJbWFnZTogZnVuY3Rpb24gKHByb2ZpbGVJRCwgZ2VuZXJhdGVkSW1hZ2UpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92Mi9wcm9maWxlLycgKyBlbmNvZGVVUklDb21wb25lbnQocHJvZmlsZUlEKSArICcvZ2VuZXJhdGVkaW1hZ2UnLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgYm9keTogZ2VuZXJhdGVkSW1hZ2UKICAgICAgfSk7CiAgICB9LAoKICAgIHVwbG9hZEltYWdlOiBmdW5jdGlvbiAoYmxvYk9yRmlsZSwgbWVkaWFUeXBlLCBvcHRzKSB7CiAgICAgIG1lZGlhVHlwZSA9IG1lZGlhVHlwZSB8fCAncmVuZGVyJzsKICAgICAgb3B0cyA9IG9wdHMgfHwge307CgogICAgICBpZiAoIShibG9iT3JGaWxlIGluc3RhbmNlb2YgQmxvYikpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoQXBpRXJyb3IoMCwgJ3VwbG9hZEltYWdlIHJlcXVpcmVzIGEgQmxvYiBvciBGaWxlLicsIG51bGwpKTsKICAgICAgfQoKICAgICAgdmFyIGNvbnRlbnRUeXBlID0gYmxvYk9yRmlsZS50eXBlIHx8IG1lZGlhVHlwZUNvbnRlbnRUeXBlKG1lZGlhVHlwZSk7CiAgICAgIHZhciBmaWxlbmFtZSA9IG9wdHMuZmlsZW5hbWUgfHwgKGJsb2JPckZpbGUubmFtZSkgfHwgKHV1aWQoKSArIGZpbGVFeHQoY29udGVudFR5cGUpKTsKICAgICAgdmFyIHRvdGFsQnl0ZXMgPSBibG9iT3JGaWxlLnNpemUgIT0gbnVsbCA/IGJsb2JPckZpbGUuc2l6ZSA6IG51bGw7CgogICAgICB2YXIgcXVlcnkgPSB7CiAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lLAogICAgICAgIG1lZGlhVHlwZTogbWVkaWFUeXBlLAogICAgICAgIHRvdGFsQnl0ZXM6IHRvdGFsQnl0ZXMKICAgICAgfTsKICAgICAgaWYgKG9wdHMucHJvZmlsZUlEKSBxdWVyeS5wcm9maWxlSUQgPSBvcHRzLnByb2ZpbGVJRDsKICAgICAgaWYgKG9wdHMucHJvamVjdElEKSBxdWVyeS5wcm9qZWN0SUQgPSBvcHRzLnByb2plY3RJRDsKCiAgICAgIHZhciByZXFJbml0ID0gewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIHF1ZXJ5OiBxdWVyeSwKICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiBjb250ZW50VHlwZSB9LAogICAgICAgIGJvZHk6IGJsb2JPckZpbGUKICAgICAgfTsKICAgICAgaWYgKG9wdHMuc2lnbmFsKSByZXFJbml0LnNpZ25hbCA9IG9wdHMuc2lnbmFsOwoKICAgICAgcmV0dXJuIHJlcXVlc3QoJy9tZWRpYS91cGxvYWQnLCByZXFJbml0KS50aGVuKGZ1bmN0aW9uIChwZXJzb25hbCkgewogICAgICAgIHZhciBwdWJsaWNVUkwgPSBwZXJzb25hbCAmJiBwZXJzb25hbC5nbG9iYWwgJiYgcGVyc29uYWwuZ2xvYmFsLm1lZGlhVVJMOwogICAgICAgIGlmICghcHVibGljVVJMKSB7CiAgICAgICAgICB0aHJvdyBBcGlFcnJvcig1MDIsICdUaGUgdXBsb2FkIHNlcnZpY2UgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCByZXNwb25zZS4nLCBwZXJzb25hbCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwdWJsaWNVUkw7CiAgICAgIH0pOwogICAgfSwKCiAgICByZWZlcnJhbENvZGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vcmVmZXJyYWwvY29kZXMnLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIHJlZmVycmFsQXR0cmlidXRpb246IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9yZWZlcnJhbC9hdHRyaWJ1dGlvbicsIHsgbWV0aG9kOiAnR0VUJyB9KTsKICAgIH0sCgogICAgYXR0cmlidXRlUmVmZXJyYWw6IGZ1bmN0aW9uIChjb2RlKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vcmVmZXJyYWwvYXR0cmlidXRlJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGJvZHk6IHsgY29kZTogY29kZSB9CiAgICAgIH0pOwogICAgfSwKCiAgICBsb29rdXBSZWZlcnJhbDogZnVuY3Rpb24gKGNvZGUpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9yZWZlcnJhbC9jb2RlLycgKyBlbmNvZGVVUklDb21wb25lbnQoY29kZSksIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIGF1dGg6IGZhbHNlCiAgICAgIH0pOwogICAgfSwKCiAgICBzZWFyY2g6IGZ1bmN0aW9uICh0ZXh0KSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvc2VhcmNoLycgKyBlbmNvZGVVUklDb21wb25lbnQodGV4dCksIHsgbWV0aG9kOiAnR0VUJyB9KTsKICAgIH0sCgogICAgdXNlclNlYXJjaDogZnVuY3Rpb24gKHRleHQsIHBhZ2UsIHBlcikgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3VzZXJzZWFyY2gvJyArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgewogICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgcXVlcnk6IHsgcGFnZTogcGFnZSAhPSBudWxsID8gcGFnZSA6IDEsIHBlcjogcGVyICE9IG51bGwgPyBwZXIgOiAzMCB9CiAgICAgIH0pLnRoZW4ocGFnaW5hdGVkKTsKICAgIH0sCgogICAgcmVwb3J0OiBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL21vZGVyYXRlL3JlcG9ydCcsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IHBheWxvYWQgfSk7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gcmVxSWQoeCkgewogICAgaWYgKHggJiYgdHlwZW9mIHggPT09ICdvYmplY3QnKSByZXR1cm4geC5yZXF1ZXN0X2lkIHx8IHgucmVxdWVzdElEIHx8IHguaWQgfHwgJyc7CiAgICByZXR1cm4geDsKICB9CgogIGZ1bmN0aW9uIHBhcnNlU3VibWl0KHJlcykgewogICAgaWYgKHJlcy5zdGF0dXMgPT09IDIwMikgewoKICAgIH0KICAgIHJldHVybiByZXMudGV4dCgpLnRoZW4oZnVuY3Rpb24gKHR4dCkgewogICAgICB2YXIgYm9keSA9IHNhZmVQYXJzZSh0eHQpOwogICAgICBpZiAoIXJlcy5vayAmJiByZXMuc3RhdHVzICE9PSAyMDIpIHsKICAgICAgICB0aHJvdyBBcGlFcnJvcihyZXMuc3RhdHVzLCBlcnJvck1lc3NhZ2UoYm9keSwgcmVzLnN0YXR1cyksIGJvZHkpOwogICAgICB9CiAgICAgIGlmICghYm9keSB8fCAoIWJvZHkucmVxdWVzdF9pZCAmJiAhYm9keS5yZXF1ZXN0SUQpKSB7CiAgICAgICAgdGhyb3cgQXBpRXJyb3IocmVzLnN0YXR1cyB8fCA1MDIsIGVycm9yTWVzc2FnZShib2R5LCByZXMuc3RhdHVzKSB8fCAnR2VuZXJhdGlvbiBjb3VsZCBub3QgYmUgc3RhcnRlZC4nLCBib2R5KTsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIHJlcXVlc3RfaWQ6IGJvZHkucmVxdWVzdF9pZCB8fCBib2R5LnJlcXVlc3RJRCwKICAgICAgICBxdWV1ZV9wb3NpdGlvbjogYm9keS5xdWV1ZV9wb3NpdGlvbiAhPSBudWxsID8gYm9keS5xdWV1ZV9wb3NpdGlvbiA6IChib2R5LnF1ZXVlUG9zaXRpb24gIT0gbnVsbCA/IGJvZHkucXVldWVQb3NpdGlvbiA6IDApCiAgICAgIH07CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHNoYXBlRWRpdFJlcXVlc3QobW9kZWwsIHBhcmFtcykgewogICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgdmFyIHNlZWQgPSBwYXJhbXMuc2VlZCAhPSBudWxsID8gcGFyYW1zLnNlZWQgOiByYW5kb21TZWVkKCk7CiAgICB2YXIgYm9keSA9IHsKICAgICAgcHJvbXB0OiBwYXJhbXMucHJvbXB0IHx8ICcnLAogICAgICBzZWVkOiBzZWVkCiAgICB9OwoKICAgIHZhciB1cmxzID0gcGFyYW1zLmltYWdlX3VybHMgfHwgcGFyYW1zLmltYWdlVVJMcyB8fCBudWxsOwogICAgdmFyIHNpbmdsZSA9IHBhcmFtcy5pbWFnZV91cmwgfHwgcGFyYW1zLmltYWdlVVJMIHx8ICh1cmxzICYmIHVybHMubGVuZ3RoID8gdXJsc1swXSA6IG51bGwpOwoKICAgIGlmIChwYXJhbXMuaW1hZ2Vfc2l6ZSkgYm9keS5pbWFnZV9zaXplID0gcGFyYW1zLmltYWdlX3NpemU7CgogICAgaWYgKE5BTk9fTU9ERUxTW21vZGVsXSkgewoKICAgICAgdmFyIGFyciA9IHVybHMgJiYgdXJscy5sZW5ndGggPyB1cmxzLnNsaWNlKCkgOiAoc2luZ2xlID8gW3NpbmdsZV0gOiBbXSk7CiAgICAgIGJvZHkuaW1hZ2VfdXJscyA9IGFycjsKICAgICAgaWYgKHNpbmdsZSkgYm9keS5pbWFnZV91cmwgPSBzaW5nbGU7CiAgICAgIGJvZHkubnVtX2ltYWdlcyA9IDE7CgogICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gJ3F3ZW5JbWFnZUVkaXQnKSB7CiAgICAgIGlmIChzaW5nbGUpIGJvZHkuaW1hZ2VfdXJsID0gc2luZ2xlOwogICAgICBib2R5Lm51bV9pbmZlcmVuY2Vfc3RlcHMgPSAzMDsKICAgICAgYm9keS5ndWlkYW5jZV9zY2FsZSA9IDQ7CiAgICAgIGJvZHkubmVnYXRpdmVfcHJvbXB0ID0gJyAnOwogICAgICBib2R5LmFjY2VsZXJhdGlvbiA9ICdoaWdoJzsKICAgIH0gZWxzZSB7CgogICAgICBpZiAoc2luZ2xlKSBib2R5LmltYWdlX3VybCA9IHNpbmdsZTsKICAgICAgaWYgKHVybHMgJiYgdXJscy5sZW5ndGggPiAxKSBib2R5LmltYWdlX3VybHMgPSB1cmxzLnNsaWNlKCk7CiAgICAgIGJvZHkuYWNjZWxlcmF0aW9uID0gJ2hpZ2gnOwogICAgfQoKICAgIGlmIChwYXJhbXMubnVtX2luZmVyZW5jZV9zdGVwcyAhPSBudWxsICYmIGJvZHkubnVtX2luZmVyZW5jZV9zdGVwcyA9PSBudWxsKSB7CiAgICAgIGJvZHkubnVtX2luZmVyZW5jZV9zdGVwcyA9IHBhcmFtcy5udW1faW5mZXJlbmNlX3N0ZXBzOwogICAgfQogICAgaWYgKHBhcmFtcy5ndWlkYW5jZV9zY2FsZSAhPSBudWxsICYmIGJvZHkuZ3VpZGFuY2Vfc2NhbGUgPT0gbnVsbCkgewogICAgICBib2R5Lmd1aWRhbmNlX3NjYWxlID0gcGFyYW1zLmd1aWRhbmNlX3NjYWxlOwogICAgfQogICAgaWYgKHBhcmFtcy5uZWdhdGl2ZV9wcm9tcHQgIT0gbnVsbCAmJiBib2R5Lm5lZ2F0aXZlX3Byb21wdCA9PSBudWxsKSB7CiAgICAgIGJvZHkubmVnYXRpdmVfcHJvbXB0ID0gcGFyYW1zLm5lZ2F0aXZlX3Byb21wdDsKICAgIH0KICAgIGlmIChwYXJhbXMubnVtX2ltYWdlcyAhPSBudWxsICYmIGJvZHkubnVtX2ltYWdlcyA9PSBudWxsKSB7CiAgICAgIGJvZHkubnVtX2ltYWdlcyA9IHBhcmFtcy5udW1faW1hZ2VzOwogICAgfQogICAgaWYgKHBhcmFtcy5sb3JhcyAhPSBudWxsKSBib2R5LmxvcmFzID0gcGFyYW1zLmxvcmFzOwogICAgaWYgKHBhcmFtcy5hY2NlbGVyYXRpb24gIT0gbnVsbCkgYm9keS5hY2NlbGVyYXRpb24gPSBwYXJhbXMuYWNjZWxlcmF0aW9uOwoKICAgIHJldHVybiBib2R5OwogIH0KCiAgZnVuY3Rpb24gbm9ybWFsaXplUHJlc2V0KHApIHsKICAgIHAgPSBwIHx8IHt9OwogICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9cLlxkezN9WiQvLCAnWicpOwogICAgcmV0dXJuIHsKICAgICAgaWQ6IHAuaWQgfHwgdXVpZCgpLAogICAgICBuYW1lOiBwLm5hbWUgfHwgJycsCiAgICAgIHByb21wdDogcC5wcm9tcHQgfHwgJycsCiAgICAgIG5lZ2F0aXZlUHJvbXB0OiBwLm5lZ2F0aXZlUHJvbXB0ICE9IG51bGwgPyBwLm5lZ2F0aXZlUHJvbXB0IDogbnVsbCwKICAgICAgbW9kZWw6IHAubW9kZWwgIT0gbnVsbCA/IHAubW9kZWwgOiBudWxsLAogICAgICBkeW5hbWljRW5kcG9pbnRJRDogcC5keW5hbWljRW5kcG9pbnRJRCAhPSBudWxsID8gcC5keW5hbWljRW5kcG9pbnRJRCA6IG51bGwsCiAgICAgIGNyZWF0ZWRBdDogcC5jcmVhdGVkQXQgfHwgbm93LAogICAgICB1cGRhdGVkQXQ6IG5vdwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHBhZ2luYXRlZChib2R5KSB7CiAgICBpZiAoIWJvZHkpIHJldHVybiB7IGl0ZW1zOiBbXSwgbWV0YWRhdGE6IHsgcGFnZTogMSwgcGVyOiAwLCB0b3RhbDogMCB9IH07CiAgICBpZiAoQXJyYXkuaXNBcnJheShib2R5KSkgewogICAgICByZXR1cm4geyBpdGVtczogYm9keSwgbWV0YWRhdGE6IHsgcGFnZTogMSwgcGVyOiBib2R5Lmxlbmd0aCwgdG90YWw6IGJvZHkubGVuZ3RoIH0gfTsKICAgIH0KICAgIHZhciBpdGVtcyA9IEFycmF5LmlzQXJyYXkoYm9keS5pdGVtcykgPyBib2R5Lml0ZW1zIDogW107CiAgICB2YXIgbWV0YSA9IGJvZHkubWV0YWRhdGEgfHwge307CiAgICByZXR1cm4gewogICAgICBpdGVtczogaXRlbXMsCiAgICAgIG1ldGFkYXRhOiB7CiAgICAgICAgcGFnZTogbWV0YS5wYWdlICE9IG51bGwgPyBtZXRhLnBhZ2UgOiAxLAogICAgICAgIHBlcjogbWV0YS5wZXIgIT0gbnVsbCA/IG1ldGEucGVyIDogaXRlbXMubGVuZ3RoLAogICAgICAgIHRvdGFsOiBtZXRhLnRvdGFsICE9IG51bGwgPyBtZXRhLnRvdGFsIDogaXRlbXMubGVuZ3RoCiAgICAgIH0KICAgIH07CiAgfQoKICBmdW5jdGlvbiBlbmNvZGVTbHVnKGVuZHBvaW50SWQpIHsKICAgIHZhciBzbHVnID0gU3RyaW5nKGVuZHBvaW50SWQgfHwgJycpLnJlcGxhY2UoL15mYWwtYWlcLy8sICcnKTsKCiAgICByZXR1cm4gc2x1Zy5zcGxpdCgnLycpLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJy8nKTsKICB9CgogIGZ1bmN0aW9uIG1lZGlhVHlwZUNvbnRlbnRUeXBlKG1lZGlhVHlwZSkgewogICAgc3dpdGNoIChtZWRpYVR5cGUpIHsKICAgICAgY2FzZSAncGRmJzogcmV0dXJuICdhcHBsaWNhdGlvbi9wZGYnOwogICAgICBjYXNlICdqc29uJzogcmV0dXJuICdhcHBsaWNhdGlvbi9qc29uJzsKICAgICAgY2FzZSAnb2JqWmlwJzoKICAgICAgY2FzZSAnc3BhdGlhbEFzc2V0JzogcmV0dXJuICdhcHBsaWNhdGlvbi96aXAnOwogICAgICBjYXNlICd1c2R6JzogcmV0dXJuICdtb2RlbC92bmQudXNkeit6aXAnOwogICAgICBjYXNlICdkYXRhJzoKICAgICAgY2FzZSAnZHdnJzoKICAgICAgY2FzZSAncmVhbGl0eSc6IHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKCiAgICAgIGRlZmF1bHQ6IHJldHVybiAnaW1hZ2UvanBlZyc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBmaWxlRXh0KGNvbnRlbnRUeXBlKSB7CiAgICBpZiAoIWNvbnRlbnRUeXBlKSByZXR1cm4gJy5qcGcnOwogICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoJ3BuZycpID49IDApIHJldHVybiAnLnBuZyc7CiAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignd2VicCcpID49IDApIHJldHVybiAnLndlYnAnOwogICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoJ2pwZWcnKSA+PSAwIHx8IGNvbnRlbnRUeXBlLmluZGV4T2YoJ2pwZycpID49IDApIHJldHVybiAnLmpwZyc7CiAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignbXA0JykgPj0gMCkgcmV0dXJuICcubXA0JzsKICAgIHJldHVybiAnLmJpbic7CiAgfQoKICBmdW5jdGlvbiBiNjQoc3RyKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwuYjY0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51dGlsLmI2NChzdHIpOwogICAgdHJ5IHsKICAgICAgcmV0dXJuIHdpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7CiAgICB9IGNhdGNoIChfZSkgewogICAgICByZXR1cm4gd2luZG93LmJ0b2Eoc3RyKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHV1aWQoKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwudXVpZCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudXRpbC51dWlkKCk7CiAgICBpZiAod2luZG93LmNyeXB0byAmJiB0eXBlb2Ygd2luZG93LmNyeXB0by5yYW5kb21VVUlEID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKTsKICAgIH0KICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgIHZhciByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwOwogICAgICB2YXIgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDg7CiAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTsKICAgIH0pOwogIH0KCiAgVi5hcGkgPSBhcGk7Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2F1dGguanMgPT09PT0gKi8KCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9IHdpbmRvdy5WIHx8ICh3aW5kb3cuViA9IHt9KTsKCiAgdmFyIFRPS0VOX0tFWSA9ICd2YW1wX3dlYl90b2tlbic7CgogIGZ1bmN0aW9uIHNhZmVHZXRTdG9yYWdlKCkgewoKICAgIHRyeSB7CiAgICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlIHx8IG51bGw7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVhZFRva2VuKCkgewogICAgdmFyIGxzID0gc2FmZUdldFN0b3JhZ2UoKTsKICAgIGlmICghbHMpIHJldHVybiBudWxsOwogICAgdHJ5IHsKICAgICAgdmFyIHQgPSBscy5nZXRJdGVtKFRPS0VOX0tFWSk7CiAgICAgIHJldHVybiB0ICYmIHQubGVuZ3RoID8gdCA6IG51bGw7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gd3JpdGVUb2tlbih0KSB7CiAgICB2YXIgbHMgPSBzYWZlR2V0U3RvcmFnZSgpOwogICAgaWYgKCFscykgcmV0dXJuOwogICAgdHJ5IHsKICAgICAgaWYgKHQgPT0gbnVsbCB8fCB0ID09PSAnJykgbHMucmVtb3ZlSXRlbShUT0tFTl9LRVkpOwogICAgICBlbHNlIGxzLnNldEl0ZW0oVE9LRU5fS0VZLCBTdHJpbmcodCkpOwogICAgfSBjYXRjaCAoZSkgewoKICAgIH0KICB9CgogIGZ1bmN0aW9uIGVtaXQoZXZ0LCBwYXlsb2FkKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5lbWl0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgVi5zdG9yZS5lbWl0KGV2dCwgcGF5bG9hZCk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKCiAgICB9CiAgfQoKICBmdW5jdGlvbiBzZXRTdGF0ZShrZXksIHZhbHVlKSB7CiAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5zZXQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgVi5zdG9yZS5zZXQoa2V5LCB2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICBWLnN0YXRlID0gVi5zdGF0ZSB8fCB7fTsKICAgICAgVi5zdGF0ZVtrZXldID0gdmFsdWU7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXRTdGF0ZShrZXkpIHsKICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLmdldCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYuc3RvcmUuZ2V0KGtleSk7CiAgICByZXR1cm4gVi5zdGF0ZSA/IFYuc3RhdGVba2V5XSA6IHVuZGVmaW5lZDsKICB9CgogIGZ1bmN0aW9uIG5vcm1hbGl6ZVVzZXIocGVyc29uYWwpIHsKICAgIGlmICghcGVyc29uYWwgfHwgdHlwZW9mIHBlcnNvbmFsICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7CgogICAgdmFyIGdsb2JhbCA9IHBlcnNvbmFsLmdsb2JhbCAmJiB0eXBlb2YgcGVyc29uYWwuZ2xvYmFsID09PSAnb2JqZWN0JyA/IHBlcnNvbmFsLmdsb2JhbCA6IHt9OwogICAgdmFyIG1pY3JvID0gZ2xvYmFsLm1pY3JvICYmIHR5cGVvZiBnbG9iYWwubWljcm8gPT09ICdvYmplY3QnID8gZ2xvYmFsLm1pY3JvIDoge307CgogICAgdmFyIGlkID0gbWljcm8uaWQgIT0gbnVsbCA/IG1pY3JvLmlkIDogKHBlcnNvbmFsLmlkICE9IG51bGwgPyBwZXJzb25hbC5pZCA6IG51bGwpOwoKICAgIHZhciB1c2VybmFtZSA9IG1pY3JvLnVzZXJuYW1lICE9IG51bGwgPyBtaWNyby51c2VybmFtZQogICAgICA6IChwZXJzb25hbC51c2VybmFtZSAhPSBudWxsID8gcGVyc29uYWwudXNlcm5hbWUgOiBudWxsKTsKCiAgICB2YXIgZW1haWwgPSBwZXJzb25hbC5lbWFpbCAhPSBudWxsID8gcGVyc29uYWwuZW1haWwgOiBudWxsOwoKICAgIHZhciBmaXJzdE5hbWUgPSBtaWNyby5maXJzdE5hbWUgIT0gbnVsbCA/IG1pY3JvLmZpcnN0TmFtZQogICAgICA6IChwZXJzb25hbC5maXJzdE5hbWUgIT0gbnVsbCA/IHBlcnNvbmFsLmZpcnN0TmFtZSA6IG51bGwpOwogICAgdmFyIGxhc3ROYW1lID0gbWljcm8ubGFzdE5hbWUgIT0gbnVsbCA/IG1pY3JvLmxhc3ROYW1lCiAgICAgIDogKHBlcnNvbmFsLmxhc3ROYW1lICE9IG51bGwgPyBwZXJzb25hbC5sYXN0TmFtZSA6IG51bGwpOwoKICAgIHZhciBuYW1lID0gbWljcm8ubmFtZSAhPSBudWxsID8gbWljcm8ubmFtZQogICAgICA6IChwZXJzb25hbC5uYW1lICE9IG51bGwgPyBwZXJzb25hbC5uYW1lIDogbnVsbCk7CiAgICBpZiAoIW5hbWUpIHsKICAgICAgdmFyIHBhcnRzID0gW107CiAgICAgIGlmIChmaXJzdE5hbWUpIHBhcnRzLnB1c2goZmlyc3ROYW1lKTsKICAgICAgaWYgKGxhc3ROYW1lKSBwYXJ0cy5wdXNoKGxhc3ROYW1lKTsKICAgICAgbmFtZSA9IHBhcnRzLmpvaW4oJyAnKSB8fCBudWxsOwogICAgfQoKICAgIHZhciBkaXNwbGF5TmFtZSA9IG5hbWUgfHwgdXNlcm5hbWUgfHwgKGVtYWlsID8gZW1haWwuc3BsaXQoJ0AnKVswXSA6IG51bGwpIHx8ICdZb3UnOwoKICAgIHZhciBwcm9maWxlUGljVVJMID0gbWljcm8ucHJvZmlsZVBpY1VSTCAhPSBudWxsID8gbWljcm8ucHJvZmlsZVBpY1VSTAogICAgICA6IChwZXJzb25hbC5wcm9maWxlUGljVVJMICE9IG51bGwgPyBwZXJzb25hbC5wcm9maWxlUGljVVJMIDogbnVsbCk7CgogICAgcmV0dXJuIHsKICAgICAgaWQ6IGlkLAogICAgICBlbWFpbDogZW1haWwsCiAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSwKICAgICAgbmFtZTogbmFtZSwKICAgICAgZGlzcGxheU5hbWU6IGRpc3BsYXlOYW1lLAogICAgICBmaXJzdE5hbWU6IGZpcnN0TmFtZSwKICAgICAgbGFzdE5hbWU6IGxhc3ROYW1lLAogICAgICBwcm9maWxlUGljVVJMOiBwcm9maWxlUGljVVJMLAogICAgICBhZG1pbjogcGVyc29uYWwuYWRtaW4gPT09IHRydWUsCiAgICAgIGVtYWlsQ29uZmlybWVkOiBwZXJzb25hbC5lbWFpbENvbmZpcm1lZCA9PT0gdHJ1ZSwKICAgICAgaXNBbm9ueW1vdXM6IG1pY3JvLmlzQW5vbnltb3VzID09PSB0cnVlLAoKICAgICAgY3JlZGl0czogdHlwZW9mIHBlcnNvbmFsLmNyZWRpdHMgPT09ICdudW1iZXInID8gcGVyc29uYWwuY3JlZGl0cyA6IG51bGwsCgogICAgICBnbG9iYWw6IGdsb2JhbCwKICAgICAgbWljcm86IG1pY3JvLAogICAgICByYXc6IHBlcnNvbmFsLAogICAgfTsKICB9CgogIGZ1bmN0aW9uIGlzQXBpRXJyb3IoZXJyKSB7CiAgICByZXR1cm4gZXJyICYmIChlcnIubmFtZSA9PT0gJ0FwaUVycm9yJyB8fCB0eXBlb2YgZXJyLnN0YXR1cyA9PT0gJ251bWJlcicpOwogIH0KCiAgZnVuY3Rpb24gcmVmcmVzaENyZWRpdHMoKSB7CiAgICBpZiAoIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS5jcmVkaXRzICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgcmV0dXJuIFYuYXBpLmNyZWRpdHMoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgdmFyIG4gPSByZXMgJiYgdHlwZW9mIHJlcy5jcmVkaXRzID09PSAnbnVtYmVyJyA/IHJlcy5jcmVkaXRzIDogbnVsbDsKICAgICAgaWYgKG4gIT0gbnVsbCkgewogICAgICAgIHNldFN0YXRlKCdjcmVkaXRzJywgbik7CgogICAgICAgIHZhciB1ID0gZ2V0U3RhdGUoJ3VzZXInKTsKICAgICAgICBpZiAodSAmJiB0eXBlb2YgdSA9PT0gJ29iamVjdCcpIHUuY3JlZGl0cyA9IG47CiAgICAgICAgZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgbik7CiAgICAgIH0KICAgICAgcmV0dXJuIG47CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CgogICAgICBpZiAoaXNBcGlFcnJvcihlcnIpICYmIChlcnIuc3RhdHVzID09PSA0MDEgfHwgZXJyLnN0YXR1cyA9PT0gNDAzKSkgewogICAgICAgIGFwaTQwMUNsZWFyKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGFwaTQwMUNsZWFyKCkgewogICAgY2xlYXIoKTsKICAgIGVtaXQoJ2Vycm9yJywgeyBtZXNzYWdlOiAnWW91ciBzZXNzaW9uIGV4cGlyZWQuIFBsZWFzZSBzaWduIGluIGFnYWluLicsIGNvZGU6ICdhdXRoJyB9KTsKICB9CgogIGZ1bmN0aW9uIHRva2VuKCkgewogICAgcmV0dXJuIHJlYWRUb2tlbigpOwogIH0KCiAgZnVuY3Rpb24gaXNBdXRoZWQoKSB7CiAgICByZXR1cm4gISFyZWFkVG9rZW4oKTsKICB9CgogIGZ1bmN0aW9uIHNldFRva2VuKHQpIHsKICAgIGlmICghdCkgewogICAgICBjbGVhcigpOwogICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdzZXRUb2tlbiBjYWxsZWQgd2l0aG91dCBhIHRva2VuJykpOwogICAgfQogICAgd3JpdGVUb2tlbih0KTsKCiAgICBpZiAoIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS53aG9hbWkgIT09ICdmdW5jdGlvbicpIHsKCiAgICAgIHZhciBzaGVsbCA9IG5vcm1hbGl6ZVVzZXIoeyB0b2tlbjogdCB9KTsKICAgICAgc2V0U3RhdGUoJ3VzZXInLCBzaGVsbCk7CiAgICAgIGVtaXQoJ2F1dGg6Y2hhbmdlZCcsIHNoZWxsKTsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzaGVsbCk7CiAgICB9CgogICAgcmV0dXJuIFYuYXBpLndob2FtaSgpLnRoZW4oZnVuY3Rpb24gKHBlcnNvbmFsKSB7CiAgICAgIHZhciB1c2VyID0gbm9ybWFsaXplVXNlcihwZXJzb25hbCk7CiAgICAgIHNldFN0YXRlKCd1c2VyJywgdXNlcik7CgogICAgICBpZiAodXNlciAmJiB0eXBlb2YgdXNlci5jcmVkaXRzID09PSAnbnVtYmVyJykgewogICAgICAgIHNldFN0YXRlKCdjcmVkaXRzJywgdXNlci5jcmVkaXRzKTsKICAgICAgICBlbWl0KCdjcmVkaXRzOmNoYW5nZWQnLCB1c2VyLmNyZWRpdHMpOwogICAgICB9CiAgICAgIGVtaXQoJ2F1dGg6Y2hhbmdlZCcsIHVzZXIpOwogICAgICByZXR1cm4gdXNlcjsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKCiAgICAgIGlmIChpc0FwaUVycm9yKGVycikgJiYgKGVyci5zdGF0dXMgPT09IDQwMSB8fCBlcnIuc3RhdHVzID09PSA0MDMpKSB7CiAgICAgICAgY2xlYXIoKTsKICAgICAgfSBlbHNlIHsKCiAgICAgICAgc2V0U3RhdGUoJ3VzZXInLCBudWxsKTsKICAgICAgICBlbWl0KCdhdXRoOmNoYW5nZWQnLCBudWxsKTsKICAgICAgfQogICAgICB0aHJvdyBlcnI7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGNsZWFyKCkgewogICAgd3JpdGVUb2tlbihudWxsKTsKICAgIHNldFN0YXRlKCd1c2VyJywgbnVsbCk7CiAgICBzZXRTdGF0ZSgnY3JlZGl0cycsIG51bGwpOwogICAgZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgbnVsbCk7CiAgICBlbWl0KCdhdXRoOmNoYW5nZWQnLCBudWxsKTsKICB9CgogIGZ1bmN0aW9uIHNpZ25JbihlbWFpbCwgcGFzc3dvcmQpIHsKICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLmxvZ2luICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0FQSSBub3QgcmVhZHknKSk7CiAgICB9CiAgICB2YXIgZW0gPSAoZW1haWwgPT0gbnVsbCA/ICcnIDogU3RyaW5nKGVtYWlsKSkudHJpbSgpOwogICAgdmFyIHB3ID0gcGFzc3dvcmQgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHBhc3N3b3JkKTsKICAgIGlmICghZW0pIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0VtYWlsIGlzIHJlcXVpcmVkJykpOwogICAgaWYgKCFwdykgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUGFzc3dvcmQgaXMgcmVxdWlyZWQnKSk7CgogICAgcmV0dXJuIFYuYXBpLmxvZ2luKGVtLCBwdykudGhlbihmdW5jdGlvbiAocGVyc29uYWwpIHsKICAgICAgdmFyIHQgPSBwZXJzb25hbCAmJiBwZXJzb25hbC50b2tlbjsKICAgICAgaWYgKCF0KSB0aHJvdyBuZXcgRXJyb3IoJ0xvZ2luIHJlc3BvbnNlIGRpZCBub3QgaW5jbHVkZSBhIHRva2VuJyk7CiAgICAgIHJldHVybiBzZXRUb2tlbih0KS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7CgogICAgICAgIHJldHVybiByZWZyZXNoQ3JlZGl0cygpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdXNlcjsgfSk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZWdpc3Rlcihmb3JtKSB7CiAgICBpZiAoIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS5zaWdudXAgIT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignQVBJIG5vdCByZWFkeScpKTsKICAgIH0KICAgIGZvcm0gPSBmb3JtIHx8IHt9OwoKICAgIHZhciBlbWFpbCA9IChmb3JtLmVtYWlsID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLmVtYWlsKSkudHJpbSgpOwogICAgdmFyIHBhc3N3b3JkID0gZm9ybS5wYXNzd29yZCA9PSBudWxsID8gJycgOiBTdHJpbmcoZm9ybS5wYXNzd29yZCk7CiAgICBpZiAoIWVtYWlsKSByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdFbWFpbCBpcyByZXF1aXJlZCcpKTsKICAgIGlmICghcGFzc3dvcmQpIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJykpOwogICAgaWYgKHBhc3N3b3JkLmxlbmd0aCA8IDggfHwgcGFzc3dvcmQubGVuZ3RoID4gMjQpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUGFzc3dvcmQgbXVzdCBiZSA44oCTMjQgY2hhcmFjdGVycycpKTsKICAgIH0KCiAgICB2YXIgZmlyc3ROYW1lID0gKGZvcm0uZmlyc3ROYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLmZpcnN0TmFtZSkpLnRyaW0oKTsKICAgIHZhciBsYXN0TmFtZSA9IChmb3JtLmxhc3ROYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLmxhc3ROYW1lKSkudHJpbSgpOwogICAgdmFyIG5hbWUgPSAoZm9ybS5uYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLm5hbWUpKS50cmltKCk7CgogICAgaWYgKCFuYW1lICYmIChmaXJzdE5hbWUgfHwgbGFzdE5hbWUpKSB7CiAgICAgIG5hbWUgPSBbZmlyc3ROYW1lLCBsYXN0TmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTsKICAgIH0KICAgIGlmIChuYW1lICYmICFmaXJzdE5hbWUpIHsKCiAgICAgIHZhciBiaXRzID0gbmFtZS5zcGxpdCgvXHMrLyk7CiAgICAgIGZpcnN0TmFtZSA9IGJpdHNbMF0gfHwgJyc7CiAgICAgIGlmICghbGFzdE5hbWUgJiYgYml0cy5sZW5ndGggPiAxKSBsYXN0TmFtZSA9IGJpdHMuc2xpY2UoMSkuam9pbignICcpOwogICAgfQoKICAgIHZhciBkYXRhID0gewogICAgICBlbWFpbDogZW1haWwsCiAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCwKICAgICAgbmFtZTogbmFtZSB8fCAoZW1haWwuc3BsaXQoJ0AnKVswXSksCiAgICAgIGZpcnN0TmFtZTogZmlyc3ROYW1lIHx8IChuYW1lID8gbmFtZS5zcGxpdCgvXHMrLylbMF0gOiAnJyksCiAgICAgIGxhc3ROYW1lOiBsYXN0TmFtZSB8fCAnJywKICAgICAgaGFzQWNjZXB0ZWRUZXJtc0FuZENvbmRpdGlvbnM6IHRydWUsCiAgICAgIGhhc0FjY2VwdGVkUHJpdmFjeVBvbGljeTogdHJ1ZSwKICAgICAgaGFyZHdhcmU6IG51bGwsCiAgICB9OwoKICAgIHZhciB1c2VybmFtZSA9IChmb3JtLnVzZXJuYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLnVzZXJuYW1lKSkudHJpbSgpOwogICAgaWYgKHVzZXJuYW1lKSBkYXRhLnVzZXJuYW1lID0gdXNlcm5hbWU7CgogICAgcmV0dXJuIFYuYXBpLnNpZ251cChkYXRhKS50aGVuKGZ1bmN0aW9uIChwZXJzb25hbCkgewogICAgICB2YXIgdCA9IHBlcnNvbmFsICYmIHBlcnNvbmFsLnRva2VuOwogICAgICBpZiAoIXQpIHRocm93IG5ldyBFcnJvcignU2lnbnVwIHJlc3BvbnNlIGRpZCBub3QgaW5jbHVkZSBhIHRva2VuJyk7CiAgICAgIHJldHVybiBzZXRUb2tlbih0KS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7CiAgICAgICAgcmV0dXJuIHJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB1c2VyOyB9KTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHsKICAgIHZhciB0ID0gcmVhZFRva2VuKCk7CiAgICBpZiAoIXQpIHsKCiAgICAgIHNldFN0YXRlKCd1c2VyJywgbnVsbCk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwogICAgfQoKICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLndob2FtaSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpOwogICAgfQoKICAgIHJldHVybiBWLmFwaS53aG9hbWkoKS50aGVuKGZ1bmN0aW9uIChwZXJzb25hbCkgewogICAgICB2YXIgdXNlciA9IG5vcm1hbGl6ZVVzZXIocGVyc29uYWwpOwogICAgICBzZXRTdGF0ZSgndXNlcicsIHVzZXIpOwogICAgICBlbWl0KCdhdXRoOmNoYW5nZWQnLCB1c2VyKTsKICAgICAgaWYgKHVzZXIgJiYgdHlwZW9mIHVzZXIuY3JlZGl0cyA9PT0gJ251bWJlcicpIHsKICAgICAgICBzZXRTdGF0ZSgnY3JlZGl0cycsIHVzZXIuY3JlZGl0cyk7CiAgICAgICAgZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgdXNlci5jcmVkaXRzKTsKICAgICAgfQoKICAgICAgcmVmcmVzaENyZWRpdHMoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIGlmIChpc0FwaUVycm9yKGVycikgJiYgKGVyci5zdGF0dXMgPT09IDQwMSB8fCBlcnIuc3RhdHVzID09PSA0MDMpKSB7CgogICAgICAgIGNsZWFyKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICBzZXRTdGF0ZSgndXNlcicsIG51bGwpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0pOwogIH0KCiAgVi5hdXRoID0gewogICAgdG9rZW46IHRva2VuLAogICAgc2V0VG9rZW46IHNldFRva2VuLAogICAgY2xlYXI6IGNsZWFyLAogICAgaXNBdXRoZWQ6IGlzQXV0aGVkLAogICAgc2lnbkluOiBzaWduSW4sCiAgICByZWdpc3RlcjogcmVnaXN0ZXIsCiAgICBib290c3RyYXA6IGJvb3RzdHJhcCwKCiAgICByZWZyZXNoQ3JlZGl0czogcmVmcmVzaENyZWRpdHMsCgogICAgbm9ybWFsaXplVXNlcjogbm9ybWFsaXplVXNlciwKICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9kYXRhL2FzcGVjdHMuanMgPT09PT0gKi8KCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLmRhdGEgPSBWLmRhdGEgfHwge307CgogIFYuZGF0YS5hc3BlY3RzID0gWwogICAgeyByYXc6ICdhdXRvJywgICAgICAgICBrZXk6ICdhdXRvJywgICAgICAgICBsYWJlbDogJ0F1dG8nLCAgICAgICAgICAgIHc6IDEwMjQsIGg6IDEwMjQsIGRlZmF1bHQ6IHRydWUgfSwKICAgIHsgcmF3OiAnc3F1YXJlJywgICAgICAga2V5OiAnc3F1YXJlJywgICAgICAgbGFiZWw6ICdTcXVhcmUnLCAgICAgICAgICB3OiAxMDI0LCBoOiAxMDI0IH0sCiAgICB7IHJhdzogJ3BvcnRyYWl0OTE2JywgIGtleTogJ3BvcnRyYWl0OTE2JywgIGxhYmVsOiAnUG9ydHJhaXQgOToxNicsICAgdzogMTAyNCwgaDogMTgyMCB9LAogICAgeyByYXc6ICdsYW5kc2NhcGUxNjknLCBrZXk6ICdsYW5kc2NhcGUxNjknLCBsYWJlbDogJ0xhbmRzY2FwZSAxNjo5JywgIHc6IDE4MjAsIGg6IDEwMjQgfSwKICAgIHsgcmF3OiAncG9ydHJhaXQ0MycsICAga2V5OiAncG9ydHJhaXQ0MycsICAgbGFiZWw6ICdQb3J0cmFpdCAzOjQnLCAgICB3OiAxMDI0LCBoOiAxMzY1IH0sCiAgICB7IHJhdzogJ2xhbmRzY2FwZTQzJywgIGtleTogJ2xhbmRzY2FwZTQzJywgIGxhYmVsOiAnTGFuZHNjYXBlIDQ6MycsICAgdzogMTM2NSwgaDogMTAyNCB9CiAgXTsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvZGF0YS9pbmR1c3RyaWVzLmpzID09PT09ICovCgooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIFYgPSAod2luZG93LlYgPSB3aW5kb3cuViB8fCB7fSk7CiAgVi5kYXRhID0gVi5kYXRhIHx8IHt9OwoKICBWLmRhdGEuaW5kdXN0cnlQcm9tcHRQbGFjZWhvbGRlciA9CiAgICAnRGVzY3JpYmUgdGhlIHRyYW5zZm9ybWF0aW9uIOKAlCBlLmcuIOKAnHN0YWdlIHRoaXMgZW1wdHkgbGl2aW5nIHJvb20gd2l0aCB3YXJtIG1vZGVybiBmdXJuaXR1cmXigJ3igKYnOwoKICBWLmRhdGEuaW5kdXN0cmllcyA9IFsKICAgIHsKICAgICAga2V5OiAnYXJjaGl0ZWN0dXJlJywKICAgICAgbGFiZWw6ICdBcmNoaXRlY3R1cmUnLAogICAgICBwbGFjZWhvbGRlcjoKICAgICAgICAnRGVzY3JpYmUgdGhlIHJlbmRlciDigJQgZS5nLiDigJxwaG90b3JlYWwgZXh0ZXJpb3Igb2YgdGhpcyBjb25jZXB0IGF0IGdvbGRlbiBob3VyLCBjbGVhbiBtb2Rlcm4gbWF0ZXJpYWxz4oCd4oCmJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnaW50ZXJpb3JEZXNpZ24nLAogICAgICBsYWJlbDogJ0ludGVyaW9yIERlc2lnbicsCiAgICAgIHBsYWNlaG9sZGVyOgogICAgICAgICdEZXNjcmliZSB0aGUgcmVzdHlsZSDigJQgZS5nLiDigJxzdGFnZSB0aGlzIHJvb20gd2l0aCB3YXJtIG1pbmltYWxpc3QgZnVybml0dXJlIGFuZCBzb2Z0IGRheWxpZ2h04oCd4oCmJwogICAgfSwKICAgIHsKICAgICAga2V5OiAncmVhbEVzdGF0ZScsCiAgICAgIGxhYmVsOiAnUmVhbCBFc3RhdGUnLAogICAgICBwbGFjZWhvbGRlcjoKICAgICAgICAnRGVzY3JpYmUgdGhlIGxpc3Rpbmcgc2hvdCDigJQgZS5nLiDigJx2aXJ0dWFsbHkgc3RhZ2UgdGhpcyBlbXB0eSByb29tLCBNTFMtcmVhZHksIGJyaWdodCBhbmQgaW52aXRpbmfigJ3igKYnCiAgICB9LAogICAgewogICAgICBrZXk6ICdsYW5kc2NhcGluZycsCiAgICAgIGxhYmVsOiAnTGFuZHNjYXBpbmcnLAogICAgICBwbGFjZWhvbGRlcjoKICAgICAgICAnRGVzY3JpYmUgdGhlIHlhcmQg4oCUIGUuZy4g4oCcdHJhbnNmb3JtIHRoaXMgYmFja3lhcmQgd2l0aCBsdXNoIGxhbmRzY2FwaW5nLCBhIHBhdGlvLCBhbmQgc3RyaW5nIGxpZ2h0c+KAneKApicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2Z1cm5pc2hpbmcnLAogICAgICBsYWJlbDogJ0Z1cm5pc2hpbmcnLAogICAgICBwbGFjZWhvbGRlcjoKICAgICAgICAnRGVzY3JpYmUgdGhlIHNjZW5lIOKAlCBlLmcuIOKAnHBsYWNlIHRoaXMgc29mYSBpbiBhIHN0eWxlZCwgd2VsbC1saXQgbGl2aW5nIHJvb20gZm9yIHRoZSBjYXRhbG9n4oCd4oCmJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnY29uc3RydWN0aW9uJywKICAgICAgbGFiZWw6ICdDb25zdHJ1Y3Rpb24nLAogICAgICBwbGFjZWhvbGRlcjoKICAgICAgICAnRGVzY3JpYmUgdGhlIHJlbm92YXRpb24g4oCUIGUuZy4g4oCcc2hvdyB0aGlzIGtpdGNoZW4gZnVsbHkgcmVtb2RlbGVkIHdpdGggbmV3IGNhYmluZXRzIGFuZCBjb3VudGVyc+KAneKApicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2hvbWVPd25lcicsCiAgICAgIGxhYmVsOiAnSG9tZSBPd25lcicsCiAgICAgIHBsYWNlaG9sZGVyOgogICAgICAgICdEZXNjcmliZSB0aGUgaWRlYSDigJQgZS5nLiDigJxyZXBhaW50IHRoZXNlIHdhbGxzIGEgc29mdCBzYWdlIGdyZWVuIGFuZCBhZGQgbW9kZXJuIGRlY29y4oCd4oCmJwogICAgfQogIF07Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2RhdGEvbW9kZWxzLmpzID09PT09ICovCgooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIFYgPSAod2luZG93LlYgPSB3aW5kb3cuViB8fCB7fSk7CiAgVi5kYXRhID0gVi5kYXRhIHx8IHt9OwoKICBWLmRhdGEubW9kZWxzID0gWwogICAgewogICAgICByYXc6ICdmbHV4S2xlaW4nLAogICAgICBsYWJlbDogJ1N0YW5kYXJkJywKICAgICAgc3ViaGVhZGluZzogJ0Zhc3QgJiBiYWxhbmNlZCcsCiAgICAgIGNvc3Q6IDEwLAogICAgICBtYXhSZWY6IDEsCiAgICAgIGRlZmF1bHQ6IHRydWUKICAgIH0sCiAgICB7CiAgICAgIHJhdzogJ2ZsdXgxS29udGV4dCcsCiAgICAgIGxhYmVsOiAnTGVnYWN5JywKICAgICAgc3ViaGVhZGluZzogJ1RoZSBvcmlnaW5hbCBlbmdpbmUnLAogICAgICBjb3N0OiAxMCwKICAgICAgbWF4UmVmOiAxCiAgICB9LAogICAgewogICAgICByYXc6ICduYW5vQmFuYW5hJywKICAgICAgbGFiZWw6ICdQcm8nLAogICAgICBzdWJoZWFkaW5nOiAnU21hcnRlciBlZGl0cywgdXAgdG8gNiByZWZlcmVuY2VzJywKICAgICAgY29zdDogMTAsCiAgICAgIG1heFJlZjogNgogICAgfSwKICAgIHsKICAgICAgcmF3OiAnbmFub0JhbmFuYTInLAogICAgICBsYWJlbDogJ1BsdXMnLAogICAgICBzdWJoZWFkaW5nOiAnSGlnaGVyIGZpZGVsaXR5LCByaWNoZXIgZGV0YWlsJywKICAgICAgY29zdDogMTUsCiAgICAgIG1heFJlZjogNgogICAgfSwKICAgIHsKICAgICAgcmF3OiAnbmFub0JhbmFuYVBybycsCiAgICAgIGxhYmVsOiAnTWF4JywKICAgICAgc3ViaGVhZGluZzogJ0Jlc3QgcXVhbGl0eSwgdXAgdG8gMTUgcmVmZXJlbmNlcycsCiAgICAgIGNvc3Q6IDIwLAogICAgICBtYXhSZWY6IDE1CiAgICB9CiAgXTsKCiAgVi5kYXRhLnQyaU1vZGVsID0geyByYXc6ICdmbHV4MVNjaG5lbGwnLCBjb3N0OiAxIH07Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2RhdGEvc3dpenpsZXMuanMgPT09PT0gKi8KCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLmRhdGEgPSBWLmRhdGEgfHwge307CgogIFYuZGF0YS5zd2l6emxlcyA9IFsKICAgIHsKICAgICAga2V5OiAncmVtb3ZlQWxsRnVybml0dXJlJywKICAgICAgbGFiZWw6ICdFbXB0eSBSb29tJywKICAgICAgcHJvbXB0OiAnUmVtb3ZlIGFsbCBmdXJuaXR1cmUsIHBlcnNvbmFsIGl0ZW1zLCBjbHV0dGVyLCBhbmQgYmVsb25naW5ncyBmcm9tIHRoZSByb29tIHdoaWxlIGtlZXBpbmcgdGhlIGFyY2hpdGVjdHVyYWwgZmVhdHVyZXMsIHdhbGxzLCB3aW5kb3dzLCBhbmQgZmxvb3JpbmcgZXhhY3RseSB0aGUgc2FtZS4gQ3JlYXRlIGEgY29tcGxldGVseSBlbXB0eSwgY2xlYW4gc3BhY2UgcmVhZHkgZm9yIHByb2Zlc3Npb25hbCBzdGFnaW5nLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3JlbW92ZUNsdXR0ZXInLAogICAgICBsYWJlbDogJ0RlY2x1dHRlcicsCiAgICAgIHByb21wdDogJ1JlbW92ZSBhbGwgY2x1dHRlciwgcGVyc29uYWwgaXRlbXMsIGV4Y2Vzc2l2ZSBkZWNvcmF0aW9ucywgYW5kIHVubmVjZXNzYXJ5IG9iamVjdHMgd2hpbGUga2VlcGluZyB0aGUgbWFpbiBmdXJuaXR1cmUgcGllY2VzIGluIHRoZWlyIGN1cnJlbnQgcG9zaXRpb25zLiBNYWludGFpbiB0aGUgZXhpc3RpbmcgZnVybml0dXJlIGxheW91dCBidXQgY3JlYXRlIGEgY2xlYW4sIG9yZ2FuaXplZCBhcHBlYXJhbmNlLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3JlbW92ZUZ1cm5pdHVyZUFuZENsdXR0ZXInLAogICAgICBsYWJlbDogJ0VtcHR5ICYgQ2xlYW4nLAogICAgICBwcm9tcHQ6ICdSZW1vdmUgYWxsIGZ1cm5pdHVyZSwgcGVyc29uYWwgaXRlbXMsIGNsdXR0ZXIsIGRlY29yYXRpb25zLCBhbmQgYmVsb25naW5ncyBmcm9tIHRoZSByb29tIHdoaWxlIGtlZXBpbmcgdGhlIGFyY2hpdGVjdHVyYWwgZmVhdHVyZXMsIHdhbGxzLCB3aW5kb3dzLCBhbmQgZmxvb3JpbmcgZXhhY3RseSB0aGUgc2FtZS4gQ3JlYXRlIGEgY29tcGxldGVseSBlbXB0eSwgc3BvdGxlc3Mgc3BhY2UgcmVhZHkgZm9yIG5ldyBzdGFnaW5nLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3JlbW92ZVBlb3BsZScsCiAgICAgIGxhYmVsOiAnUmVtb3ZlIFBlb3BsZScsCiAgICAgIHByb21wdDogJ1JlbW92ZSBhbGwgcGVvcGxlLCBwZXJzb25zLCBhbmQgaHVtYW4gZmlndXJlcyBmcm9tIHRoZSBpbWFnZSB3aGlsZSBrZWVwaW5nIGFsbCBmdXJuaXR1cmUsIGRlY29yLCBhbmQgcm9vbSBlbGVtZW50cyBleGFjdGx5IHRoZSBzYW1lLiBNYWludGFpbiB0aGUgZXhhY3QgbGlnaHRpbmcgYW5kIGNvbXBvc2l0aW9uLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3JlbW92ZVJlZmxlY3Rpb25zJywKICAgICAgbGFiZWw6ICdSZW1vdmUgUmVmbGVjdGlvbnMnLAogICAgICBwcm9tcHQ6ICdSZW1vdmUgYWxsIHJlZmxlY3Rpb25zLCBtaXJyb3IgaW1hZ2VzLCBhbmQgdW53YW50ZWQgcmVmbGVjdGl2ZSBlbGVtZW50cyBmcm9tIHdpbmRvd3MsIG1pcnJvcnMsIGFuZCBnbG9zc3kgc3VyZmFjZXMgd2hpbGUga2VlcGluZyBhbGwgZnVybml0dXJlIGFuZCByb29tIGVsZW1lbnRzIGV4YWN0bHkgdGhlIHNhbWUuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnaW1wcm92ZUxpZ2h0aW5nJywKICAgICAgbGFiZWw6ICdCZXR0ZXIgTGlnaHQnLAogICAgICBwcm9tcHQ6ICdJbXByb3ZlIHRoZSBsaWdodGluZyB0byBiZSBicmlnaHQsIHdhcm0sIGFuZCB3ZWxjb21pbmcuIEFkZCBuYXR1cmFsIGxpZ2h0IGFwcGVhcmFuY2UsIHJlbW92ZSBoYXJzaCBzaGFkb3dzLCBhbmQgY3JlYXRlIGV2ZW4gaWxsdW1pbmF0aW9uIHRocm91Z2hvdXQgdGhlIHNwYWNlIHdoaWxlIGtlZXBpbmcgYWxsIG9iamVjdHMgYW5kIGZ1cm5pdHVyZSBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2ltcHJvdmVXZWF0aGVyJywKICAgICAgbGFiZWw6ICdCZXR0ZXIgV2VhdGhlcicsCiAgICAgIHByb21wdDogJ0NoYW5nZSB0aGUgd2VhdGhlciBjb25kaXRpb25zIHRvIGJyaWdodCwgc3VubnksIGFuZCBjbGVhciBza2llcy4gUmVtb3ZlIHJhaW4sIGNsb3Vkcywgc25vdywgb3Igb3ZlcmNhc3QgY29uZGl0aW9ucyB3aGlsZSBrZWVwaW5nIGFsbCBhcmNoaXRlY3R1cmUsIGxhbmRzY2FwaW5nLCBhbmQgcHJvcGVydHkgZWxlbWVudHMgZXhhY3RseSB0aGUgc2FtZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdjbGVhbkxhbmRzY2FwaW5nJywKICAgICAgbGFiZWw6ICdDbGVhbiBMYW5kc2NhcGUnLAogICAgICBwcm9tcHQ6ICdDbGVhbiB1cCBvdmVyZ3Jvd24gdmVnZXRhdGlvbiwgcmVtb3ZlIHdlZWRzLCB0cmltIGJ1c2hlcyBhbmQgdHJlZXMsIGNsZWFyIGRlYWQgcGxhbnRzLCBhbmQgb3JnYW5pemUgdGhlIGxhbmRzY2FwaW5nIHdoaWxlIGtlZXBpbmcgdGhlIHByb3BlcnR5IGFyY2hpdGVjdHVyZSBhbmQgaGFyZHNjYXBpbmcgZXhhY3RseSB0aGUgc2FtZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdhZGRMYW5kc2NhcGluZycsCiAgICAgIGxhYmVsOiAnQWRkIExhbmRzY2FwaW5nJywKICAgICAgcHJvbXB0OiAnQWRkIHByb2Zlc3Npb25hbCBsYW5kc2NhcGluZyBpbmNsdWRpbmcgd2VsbC1tYWludGFpbmVkIGdyYXNzLCB0cmltbWVkIGJ1c2hlcywgY29sb3JmdWwgZmxvd2VycywgbWF0dXJlIHRyZWVzLCBhbmQgYXR0cmFjdGl2ZSBnYXJkZW4gYmVkcyB3aGlsZSBrZWVwaW5nIGFsbCBhcmNoaXRlY3R1cmUgYW5kIHByb3BlcnR5IHN0cnVjdHVyZXMgZXhhY3RseSB0aGUgc2FtZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdhZGRDdXJiQXBwZWFsJywKICAgICAgbGFiZWw6ICdDdXJiIEFwcGVhbCcsCiAgICAgIHByb21wdDogIkVuaGFuY2UgdGhlIGZyb250IGVudHJhbmNlIGFuZCBjdXJiIGFwcGVhbCB3aXRoIGF0dHJhY3RpdmUgbGFuZHNjYXBpbmcsIGNsZWFuIHdhbGt3YXlzLCB1cGRhdGVkIGV4dGVyaW9yIGxpZ2h0aW5nLCBmcmVzaCBwYWludCBvbiBkb29ycywgYW5kIHdlbGNvbWluZyBlbnRyeXdheSBlbGVtZW50cyB3aGlsZSBtYWludGFpbmluZyB0aGUgcHJvcGVydHkncyBhcmNoaXRlY3R1cmFsIHN0eWxlLiIKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2ltcHJvdmVFeHRlcmlvcicsCiAgICAgIGxhYmVsOiAnRml4IEV4dGVyaW9yJywKICAgICAgcHJvbXB0OiAnUmVwYWlyIGFuZCBpbXByb3ZlIHRoZSBleHRlcmlvciBjb25kaXRpb24gaW5jbHVkaW5nIGZyZXNoIHBhaW50LCBjbGVhbiBzaWRpbmcsIHVwZGF0ZWQgdHJpbSwgcmVwYWlyZWQgcm9vZmluZywgYW5kIHdlbGwtbWFpbnRhaW5lZCBleHRlcmlvciBzdXJmYWNlcyB3aGlsZSBrZWVwaW5nIHRoZSBhcmNoaXRlY3R1cmFsIGRlc2lnbiBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ21vZGVybml6ZUV4dGVyaW9yJywKICAgICAgbGFiZWw6ICdNb2Rlcm4gRXh0ZXJpb3InLAogICAgICBwcm9tcHQ6ICJVcGRhdGUgdGhlIGV4dGVyaW9yIHdpdGggY29udGVtcG9yYXJ5IG1hdGVyaWFscywgbW9kZXJuIGNvbG9yIHNjaGVtZXMsIHVwZGF0ZWQgbGlnaHRpbmcgZml4dHVyZXMsIGNvbnRlbXBvcmFyeSBoYXJkd2FyZSwgYW5kIGN1cnJlbnQgZGVzaWduIGVsZW1lbnRzIHdoaWxlIG1haW50YWluaW5nIHRoZSBwcm9wZXJ0eSdzIHN0cnVjdHVyYWwgbGF5b3V0LiIKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2FkZE91dGRvb3JMaXZpbmcnLAogICAgICBsYWJlbDogJ091dGRvb3IgTGl2aW5nJywKICAgICAgcHJvbXB0OiAiQWRkIG91dGRvb3IgbGl2aW5nIHNwYWNlcyBpbmNsdWRpbmcgcGF0aW9zLCBkZWNrcywgb3V0ZG9vciBmdXJuaXR1cmUsIGZpcmUgcGl0cywgb3V0ZG9vciBraXRjaGVucywgb3Igc2VhdGluZyBhcmVhcyB0aGF0IHNob3djYXNlIHRoZSBwcm9wZXJ0eSdzIHBvdGVudGlhbCBmb3IgZW50ZXJ0YWlubWVudCBhbmQgcmVsYXhhdGlvbi4iCiAgICB9LAogICAgewogICAgICBrZXk6ICdpbXByb3ZlRW50cnl3YXknLAogICAgICBsYWJlbDogJ0JldHRlciBFbnRyYW5jZScsCiAgICAgIHByb21wdDogJ0VuaGFuY2UgdGhlIGZyb250IGVudHJhbmNlIHdpdGggYW4gYXR0cmFjdGl2ZSBkb29yLCB1cGRhdGVkIGhhcmR3YXJlLCB3ZWxjb21pbmcgbGlnaHRpbmcsIGNsZWFuIHN0ZXBzLCBwb3R0ZWQgcGxhbnRzLCBhbmQgYW4gaW52aXRpbmcgZW50cnl3YXkgdGhhdCBjcmVhdGVzIGFuIGV4Y2VsbGVudCBmaXJzdCBpbXByZXNzaW9uLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2NoYW5nZVNlYXNvbicsCiAgICAgIGxhYmVsOiAnQ2hhbmdlIFNlYXNvbicsCiAgICAgIHByb21wdDogJ0NoYW5nZSB0aGUgc2Vhc29uYWwgYXBwZWFyYW5jZSB0byBzaG93IHRoZSBwcm9wZXJ0eSBpbiBpZGVhbCBjb25kaXRpb25zIHdpdGggbHVzaCBncmVlbiBsYW5kc2NhcGluZywgYmxvb21pbmcgZmxvd2VycywgYW5kIGF0dHJhY3RpdmUgc2Vhc29uYWwgZWxlbWVudHMgd2hpbGUga2VlcGluZyBhbGwgc3RydWN0dXJlcyBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2ltcHJvdmVTa2llcycsCiAgICAgIGxhYmVsOiAnQmV0dGVyIFNraWVzJywKICAgICAgcHJvbXB0OiAnUmVwbGFjZSB0aGUgc2t5IHdpdGggYmVhdXRpZnVsIGJsdWUgc2tpZXMsIHB1ZmZ5IHdoaXRlIGNsb3VkcywgYW5kIGlkZWFsIGxpZ2h0aW5nIGNvbmRpdGlvbnMgdGhhdCBtYWtlIHRoZSBwcm9wZXJ0eSBsb29rIG1vcmUgYXR0cmFjdGl2ZSB3aGlsZSBrZWVwaW5nIGFsbCBncm91bmQtbGV2ZWwgZWxlbWVudHMgZXhhY3RseSB0aGUgc2FtZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdkZXBlcnNvbmFsaXplJywKICAgICAgbGFiZWw6ICdEZXBlcnNvbmFsaXplJywKICAgICAgcHJvbXB0OiAnUmVtb3ZlIGFsbCBwZXJzb25hbCBwaG90b2dyYXBocywgZmFtaWx5IHBpY3R1cmVzLCBwZXJzb25hbCBjb2xsZWN0aWJsZXMsIGFuZCBpbmRpdmlkdWFsIGl0ZW1zIHdoaWxlIGtlZXBpbmcgZnVybml0dXJlIGFuZCBnZW5lcmFsIGRlY29yLiBDcmVhdGUgYSBuZXV0cmFsIHNwYWNlIGJ1eWVycyBjYW4gZW52aXNpb24gYXMgdGhlaXIgb3duLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ21vZGVybml6ZScsCiAgICAgIGxhYmVsOiAnTW9kZXJuaXplJywKICAgICAgcHJvbXB0OiAiVXBkYXRlIGFuZCBtb2Rlcm5pemUgdGhlIHNwYWNlIHdpdGggY29udGVtcG9yYXJ5IGZpbmlzaGVzLCBjdXJyZW50IGNvbG9yIHBhbGV0dGVzLCBhbmQgbW9kZXJuIGRlc2lnbiBlbGVtZW50cyB3aGlsZSBtYWludGFpbmluZyB0aGUgcm9vbSdzIGFyY2hpdGVjdHVyYWwgc3RydWN0dXJlIGFuZCBsYXlvdXQuIgogICAgfSwKICAgIHsKICAgICAga2V5OiAnZml4V2FsbHMnLAogICAgICBsYWJlbDogJ0ZpeCBXYWxscycsCiAgICAgIHByb21wdDogJ1JlcGFpciBhbGwgdmlzaWJsZSB3YWxsIGRhbWFnZSBpbmNsdWRpbmcgY3JhY2tzLCBob2xlcywgc2N1ZmYgbWFya3MsIGFuZCBpbXBlcmZlY3Rpb25zLiBNYWtlIHdhbGxzIGxvb2sgZnJlc2hseSBwYWludGVkIGFuZCBwcmlzdGluZSB3aGlsZSBrZWVwaW5nIGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgcm9vbSBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ25ldXRyYWxQYWludCcsCiAgICAgIGxhYmVsOiAnTmV1dHJhbCBQYWludCcsCiAgICAgIHByb21wdDogJ0NoYW5nZSB3YWxsIHBhaW50IHRvIG5ldXRyYWwgY29sb3JzIGxpa2Ugd2FybSB3aGl0ZSwgbGlnaHQgZ3JleSwgb3Igc29mdCBiZWlnZS4gTWFpbnRhaW4gYWxsIGZ1cm5pdHVyZSwgZGVjb3IsIGFuZCByb29tIGxheW91dCBleGFjdGx5IGFzIHRoZXkgYXJlIHdoaWxlIG9ubHkgdXBkYXRpbmcgdGhlIHdhbGwgY29sb3IuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnYWRkUGxhbnRzJywKICAgICAgbGFiZWw6ICdBZGQgUGxhbnRzJywKICAgICAgcHJvbXB0OiAnQWRkIHRhc3RlZnVsIHBsYW50cyBhbmQgZ3JlZW5lcnkgaW5jbHVkaW5nIHBvdHRlZCBwbGFudHMsIHNtYWxsIHRyZWVzLCBvciBmcmVzaCBmbG93ZXJzIHRvIGJyaW5nIGxpZmUgYW5kIHdhcm10aCB0byB0aGUgc3BhY2Ugd2hpbGUga2VlcGluZyBhbGwgZXhpc3RpbmcgZnVybml0dXJlIGFuZCBkZWNvciBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2FkZFBvb2xBcmVhJywKICAgICAgbGFiZWw6ICdQb29sIEFyZWEnLAogICAgICBwcm9tcHQ6ICdBZGQgb3IgZW5oYW5jZSBwb29sIGFuZCBiYWNreWFyZCBhcmVhcyB3aXRoIHBvb2wgZnVybml0dXJlLCB1bWJyZWxsYXMsIGxvdW5nZSBjaGFpcnMsIG91dGRvb3IgZGluaW5nIHNldHMsIGFuZCBhdHRyYWN0aXZlIHBvb2xzaWRlIGxhbmRzY2FwaW5nIHRvIHNob3djYXNlIG91dGRvb3IgZW50ZXJ0YWlubWVudCBwb3RlbnRpYWwuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnbW9kZXJuU3RhZ2luZycsCiAgICAgIGxhYmVsOiAnTW9kZXJuIFN0YWdpbmcnLAogICAgICBwcm9tcHQ6ICdBZGQgbW9kZXJuIHN0YWdpbmcgZnVybml0dXJlIHdpdGggY2xlYW4gbGluZXMsIG5ldXRyYWwgY29sb3JzIGxpa2Ugd2hpdGUsIGdyZXksIGFuZCBiZWlnZSwgbWluaW1hbCBkZWNvciwgYW5kIGNvbnRlbXBvcmFyeSBwaWVjZXMuIENyZWF0ZSBhIHNsZWVrLCB1bmNsdXR0ZXJlZCBzcGFjZSB0aGF0IHNob3djYXNlcyBhcmNoaXRlY3R1cmFsIGZlYXR1cmVzLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3RyYW5zaXRpb25hbFN0YWdpbmcnLAogICAgICBsYWJlbDogJ1RyYW5zaXRpb25hbCcsCiAgICAgIHByb21wdDogJ0FkZCB0cmFuc2l0aW9uYWwgc3RhZ2luZyBmdXJuaXR1cmUgdGhhdCBibGVuZHMgdHJhZGl0aW9uYWwgYW5kIGNvbnRlbXBvcmFyeSBlbGVtZW50cy4gVXNlIHdhcm0sIGVhcnRoeSB0b25lcyB3aXRoIHVwaG9sc3RlcmVkIGZ1cm5pdHVyZSwgY2xlYW4gbGluZXMsIGFuZCB2aW50YWdlIGFjY2VudHMgbGlrZSBvcm5hdGUgbWlycm9ycyBvciB3b29kZW4gY29mZmVlIHRhYmxlcy4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdtaW5pbWFsaXN0U3RhZ2luZycsCiAgICAgIGxhYmVsOiAnTWluaW1hbGlzdCcsCiAgICAgIHByb21wdDogJ0FkZCBtaW5pbWFsaXN0IHN0YWdpbmcgZnVybml0dXJlIGVtcGhhc2l6aW5nIHNpbXBsaWNpdHkgYW5kIGZ1bmN0aW9uYWxpdHkuIFVzZSBjbGVhbiBsaW5lcywgbmV1dHJhbCB0b25lcywgYW5kIGZ1cm5pdHVyZSB0aGF0IHNlcnZlcyBtdWx0aXBsZSBwdXJwb3NlcyB3aXRob3V0IG92ZXJ3aGVsbWluZyB0aGUgc3BhY2UuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnd2FybU1pbmltYWxpc3RTdGFnaW5nJywKICAgICAgbGFiZWw6ICdXYXJtIE1pbmltYWxpc3QnLAogICAgICBwcm9tcHQ6ICdBZGQgd2FybSBtaW5pbWFsaXN0IHN0YWdpbmcgZnVybml0dXJlIGJhbGFuY2luZyB1bmNsdXR0ZXJlZCBzcGFjZXMgd2l0aCB3YXJtIHRvbmVzIGxpa2UgdGVycmFjb3R0YSwgYnJvd25zLCBhbmQgYmVpZ2VzLCBwbHVzIHNvZnQgdGV4dHVyZXMgbGlrZSBwbHVzaCB0aHJvd3MgYW5kIHBpbGxvd3MgZm9yIGEgY296eSwgd2VsY29taW5nIGZlZWwuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnbWlkQ2VudHVyeU1vZGVyblN0YWdpbmcnLAogICAgICBsYWJlbDogJ01pZC1DZW50dXJ5JywKICAgICAgcHJvbXB0OiAnQWRkIG1pZC1jZW50dXJ5IG1vZGVybiBzdGFnaW5nIGZ1cm5pdHVyZSB3aXRoIGljb25pYyBwaWVjZXMgZnJvbSB0aGUgMTk1MHMtNjBzIGluY2x1ZGluZyB3YWxudXQgd29vZCBmaW5pc2hlcywgdGFwZXJlZCBsZWdzLCBnZW9tZXRyaWMgcGF0dGVybnMsIHZpbnRhZ2UgYnJhc3MgZml4dHVyZXMsIGFuZCByaWNoIGpld2VsIHRvbmVzIGxpa2UgbXVzdGFyZCB5ZWxsb3cgYW5kIHRlYWwuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnYXJ0RGVjb1N0YWdpbmcnLAogICAgICBsYWJlbDogJ0FydCBEZWNvJywKICAgICAgcHJvbXB0OiAnQWRkIEFydCBEZWNvIHN0YWdpbmcgZnVybml0dXJlIHdpdGggYm9sZCBnZW9tZXRyaWMgcGF0dGVybnMsIG1ldGFsbGljIGFjY2VudHMgaW4gZ29sZCBhbmQgYnJhc3MsIHJpY2ggY29sb3JzIGxpa2UgZW1lcmFsZCBhbmQgbmF2eSwgbHV4dXJpb3VzIG1hdGVyaWFscyBsaWtlIHZlbHZldCBhbmQgbWFyYmxlLCBhbmQgZHJhbWF0aWMgbGlnaHRpbmcgZml4dHVyZXMuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnYmlvcGhpbGljU3RhZ2luZycsCiAgICAgIGxhYmVsOiAnQmlvcGhpbGljJywKICAgICAgcHJvbXB0OiAnQWRkIGJpb3BoaWxpYyBzdGFnaW5nIGZ1cm5pdHVyZSBlbXBoYXNpemluZyBuYXR1cmFsIG1hdGVyaWFscyBsaWtlIHdvb2QgYW5kIHN0b25lLCBhYnVuZGFudCBncmVlbmVyeSBhbmQgcGxhbnRzLCBuYXR1cmFsIGxpZ2h0aW5nLCBlYXJ0aCB0b25lcywgYW5kIHN1c3RhaW5hYmxlIG1hdGVyaWFscyB0aGF0IGJyaW5nIHRoZSBvdXRkb29ycyBpbnNpZGUgZm9yIHdlbGxuZXNzIGFuZCBjb25uZWN0aW9uIHRvIG5hdHVyZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICd2aW50YWdlRXh0ZXJpb3InLAogICAgICBsYWJlbDogJ1ZpbnRhZ2UgRXh0ZXJpb3InLAogICAgICBwcm9tcHQ6ICJVcGRhdGUgdGhlIGV4dGVyaW9yIHRvIHNob3djYXNlIHBlcmlvZC1hcHByb3ByaWF0ZSB2aW50YWdlIGNoYXJtIHdpdGggaGlzdG9yaWNhbGx5IGFjY3VyYXRlIGNvbG9ycywgY2xhc3NpYyBhcmNoaXRlY3R1cmFsIGRldGFpbHMsIHRyYWRpdGlvbmFsIG1hdGVyaWFscywgYW5kIHRpbWVsZXNzIGRlc2lnbiBlbGVtZW50cyB0aGF0IGhpZ2hsaWdodCB0aGUgcHJvcGVydHkncyBjaGFyYWN0ZXIuIgogICAgfSwKICAgIHsKICAgICAga2V5OiAnbHV4dXJ5U3RhZ2luZycsCiAgICAgIGxhYmVsOiAnTHV4dXJ5IFN0YWdpbmcnLAogICAgICBwcm9tcHQ6ICJBZGQgbHV4dXJ5IHN0YWdpbmcgZnVybml0dXJlIHdpdGggaGlnaC1lbmQgbWF0ZXJpYWxzLCBkZXNpZ25lciBwaWVjZXMsIHNvcGhpc3RpY2F0ZWQgY29sb3IgcGFsZXR0ZXMsIHByZW1pdW0gdGV4dGlsZXMsIGVsZWdhbnQgbGlnaHRpbmcsIGFuZCB1cHNjYWxlIGFjY2Vzc29yaWVzIHRoYXQgYXBwZWFsIHRvIGx1eHVyeSBidXllcnMgYW5kIHNob3djYXNlIHRoZSBwcm9wZXJ0eSdzIHByZW1pdW0gcG90ZW50aWFsLiIKICAgIH0KICBdOwp9KSgpOwoKCi8qID09PT09IHNyYy9qcy91aS9jb21wb25lbnRzLmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLnVpID0gVi51aSB8fCB7fTsKICB2YXIgdWkgPSBWLnVpOwoKICBmdW5jdGlvbiBlbCh0YWcsIGF0dHJzLCBjaGlsZHJlbikgewogICAgaWYgKHR5cGVvZiB1aS5lbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiB1aS5lbC5hcHBseSh1aSwgYXJncyk7CiAgICB9CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIGlmIChhdHRycykgewogICAgICBmb3IgKHZhciBrIGluIGF0dHJzKSB7CiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cnMsIGspKSBjb250aW51ZTsKICAgICAgICB2YXIgdmFsID0gYXR0cnNba107CiAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gZmFsc2UpIGNvbnRpbnVlOwogICAgICAgIGlmIChrID09PSAnY2xhc3MnIHx8IGsgPT09ICdjbGFzc05hbWUnKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAndGV4dCcpIG5vZGUudGV4dENvbnRlbnQgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ2h0bWwnKSBub2RlLmlubmVySFRNTCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAnc3R5bGUnICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICBmb3IgKHZhciBzIGluIHZhbCkgbm9kZS5zdHlsZS5zZXRQcm9wZXJ0eShzLCB2YWxbc10pOwogICAgICAgIH0gZWxzZSBpZiAoay5pbmRleE9mKCdvbicpID09PSAwICYmIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHZhbCk7CiAgICAgICAgfSBlbHNlIGlmIChrID09PSAnZGF0YXNldCcgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgIGZvciAodmFyIGQgaW4gdmFsKSBub2RlLmRhdGFzZXRbZF0gPSB2YWxbZF07CiAgICAgICAgfSBlbHNlIGlmICh2YWwgPT09IHRydWUpIG5vZGUuc2V0QXR0cmlidXRlKGssICcnKTsKICAgICAgICBlbHNlIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICAgIH0KICAgIH0KICAgIHZhciBraWRzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgIGFwcGVuZEtpZHMobm9kZSwga2lkcyk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIGFwcGVuZEtpZHMobm9kZSwga2lkcykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBraWRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjID0ga2lkc1tpXTsKICAgICAgaWYgKGMgPT0gbnVsbCB8fCBjID09PSBmYWxzZSB8fCBjID09PSB0cnVlKSBjb250aW51ZTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIGFwcGVuZEtpZHMobm9kZSwgYyk7CiAgICAgIGVsc2UgaWYgKHR5cGVvZiBjID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYyA9PT0gJ251bWJlcicpCiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICAgICAgZWxzZSBpZiAoYyAmJiBjLm5vZGVUeXBlKSBub2RlLmFwcGVuZENoaWxkKGMpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaWNvbihuYW1lKSB7CiAgICBpZiAodHlwZW9mIHVpLmljb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIGdvdCA9IHVpLmljb24obmFtZSk7CiAgICAgIGlmIChnb3QgJiYgZ290Lm5vZGVUeXBlKSByZXR1cm4gZ290OwogICAgICBpZiAodHlwZW9mIGdvdCA9PT0gJ3N0cmluZycpIHsKICAgICAgICB2YXIgd3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICB3cmFwLmNsYXNzTmFtZSA9ICd2LWljbyc7CiAgICAgICAgd3JhcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICB3cmFwLmlubmVySFRNTCA9IGdvdDsKICAgICAgICByZXR1cm4gd3JhcC5maXJzdEVsZW1lbnRDaGlsZCB8fCB3cmFwOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsbGJhY2tJY29uKG5hbWUpOwogIH0KCiAgdmFyIEZBTExCQUNLX0lDT05TID0gewogICAgY2xvc2U6ICc8cGF0aCBkPSJNNiA2bDEyIDEyTTE4IDZMNiAxOCIvPicsCiAgICBjaGVjazogJzxwYXRoIGQ9Ik01IDEzbDQgNEwxOSA3Ii8+JywKICAgIGFsZXJ0OgogICAgICAnPHBhdGggZD0iTTEyIDl2NG0wIDRoLjAxTTEwLjMgMy44NmwtOCAxNEEyIDIgMCAwIDAgNCAyMWgxNmEyIDIgMCAwIDAgMS43LTNsLTgtMTRhMiAyIDAgMCAwLTMuNCAwWiIvPicsCiAgICBpbmZvOiAnPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iOSIvPjxwYXRoIGQ9Ik0xMiAxMXY1bTAtOGguMDEiLz4nLAogICAgc3Bhcms6ICc8cGF0aCBkPSJNMTIgM2wxLjggNS4yTDE5IDEwbC01LjIgMS44TDEyIDE3bC0xLjgtNS4yTDUgMTBsNS4yLTEuOEwxMiAzWiIvPicsCiAgICBpbWFnZToKICAgICAgJzxyZWN0IHg9IjMiIHk9IjMiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjMiLz48Y2lyY2xlIGN4PSI4LjUiIGN5PSI4LjUiIHI9IjEuNiIvPjxwYXRoIGQ9Ik0yMSAxNWwtNS01TDUgMjEiLz4nLAogICAgaGVhcnQ6CiAgICAgICc8cGF0aCBkPSJNMTIgMjBzLTctNC42LTkuMy05LjFDMS40IDguMyAyLjQgNS4zIDUgNC40YzEuOS0uNyAzLjkuMSA1IDEuOCAxLjEtMS43IDMuMS0yLjUgNS0xLjggMi42LjkgMy42IDMuOSAyLjMgNi41QzE5IDE1LjQgMTIgMjAgMTIgMjBaIi8+JwogIH07CgogIGZ1bmN0aW9uIGZhbGxiYWNrSWNvbihuYW1lKSB7CiAgICB2YXIgcGF0aCA9IEZBTExCQUNLX0lDT05TW25hbWVdIHx8IEZBTExCQUNLX0lDT05TLmluZm87CiAgICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCAnMCAwIDI0IDI0Jyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdjbGFzcycsICd2LWljbycpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnY3VycmVudENvbG9yJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMS44Jyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWNhcCcsICdyb3VuZCcpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWxpbmVqb2luJywgJ3JvdW5kJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICBzdmcuaW5uZXJIVE1MID0gcGF0aDsKICAgIHJldHVybiBzdmc7CiAgfQoKICBmdW5jdGlvbiBjbGFtcChuLCBsbywgaGkpIHsKICAgIGlmIChWLnV0aWwgJiYgdHlwZW9mIFYudXRpbC5jbGFtcCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudXRpbC5jbGFtcChuLCBsbywgaGkpOwogICAgcmV0dXJuIE1hdGgubWluKGhpLCBNYXRoLm1heChsbywgbikpOwogIH0KCiAgZnVuY3Rpb24gZXNjYXBlSHRtbChzKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwuZXNjYXBlSHRtbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudXRpbC5lc2NhcGVIdG1sKHMpOwogICAgdmFyIGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGQudGV4dENvbnRlbnQgPSBzID09IG51bGwgPyAnJyA6IFN0cmluZyhzKTsKICAgIHJldHVybiBkLmlubmVySFRNTDsKICB9CgogIGZ1bmN0aW9uIHByZWZlcnNSZWR1Y2VkTW90aW9uKCkgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScpLm1hdGNoZXM7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGVuc3VyZUhvc3QoaWQsIGNsYXNzTmFtZSkgewogICAgdmFyIGhvc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7CiAgICBpZiAoIWhvc3QpIHsKICAgICAgaG9zdCA9IGVsKCdkaXYnLCB7IGlkOiBpZCwgY2xhc3M6IGNsYXNzTmFtZSB9KTsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChob3N0KTsKICAgIH0KICAgIHJldHVybiBob3N0OwogIH0KCiAgdmFyIFRPQVNUX0hPU1RfSUQgPSAndi10b2FzdC1ob3N0JzsKICB2YXIgVE9BU1RfTElGRVRJTUVTID0geyBlcnJvcjogNTIwMCwgc3VjY2VzczogMzIwMCwgaW5mbzogMzAwMCwgd2FybmluZzogNDIwMCB9OwoKICBmdW5jdGlvbiB0b2FzdEhvc3QoKSB7CiAgICByZXR1cm4gZW5zdXJlSG9zdChUT0FTVF9IT1NUX0lELCAndi10b2FzdC1ob3N0Jyk7CiAgfQoKICB1aS50b2FzdCA9IGZ1bmN0aW9uIHRvYXN0KG1zZywga2luZCkgewogICAga2luZCA9IGtpbmQgfHwgJ2luZm8nOwogICAgaWYgKCFtc2cpIHJldHVybiB7IGRpc21pc3M6IGZ1bmN0aW9uICgpIHt9IH07CiAgICB2YXIgaG9zdCA9IHRvYXN0SG9zdCgpOwoKICAgIHZhciBpY29uTmFtZSA9CiAgICAgIGtpbmQgPT09ICdzdWNjZXNzJwogICAgICAgID8gJ2NoZWNrJwogICAgICAgIDoga2luZCA9PT0gJ2Vycm9yJwogICAgICAgID8gJ2FsZXJ0JwogICAgICAgIDoga2luZCA9PT0gJ3dhcm5pbmcnCiAgICAgICAgPyAnYWxlcnQnCiAgICAgICAgOiAnaW5mbyc7CgogICAgdmFyIG5vZGUgPSBlbCgKICAgICAgJ2RpdicsCiAgICAgIHsKICAgICAgICBjbGFzczogJ3YtdG9hc3Qgdi10b2FzdC0tJyArIGtpbmQgKyAnIGxpcXVpZC1nbGFzcy10aGluJywKICAgICAgICByb2xlOiBraW5kID09PSAnZXJyb3InID8gJ2FsZXJ0JyA6ICdzdGF0dXMnLAogICAgICAgICdhcmlhLWxpdmUnOiBraW5kID09PSAnZXJyb3InID8gJ2Fzc2VydGl2ZScgOiAncG9saXRlJwogICAgICB9LAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXRvYXN0X19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oaWNvbk5hbWUpKSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi10b2FzdF9fbXNnJyB9LCBTdHJpbmcobXNnKSksCiAgICAgIGVsKAogICAgICAgICdidXR0b24nLAogICAgICAgIHsKICAgICAgICAgIGNsYXNzOiAndi10b2FzdF9fY2xvc2UnLAogICAgICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgICAnYXJpYS1sYWJlbCc6ICdEaXNtaXNzJywKICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmVtb3ZlKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBpY29uKCdjbG9zZScpCiAgICAgICkKICAgICk7CgogICAgaG9zdC5hcHBlbmRDaGlsZChub2RlKTsKICAgIG5vZGUub2Zmc2V0SGVpZ2h0OwogICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd2LXRvYXN0LS1pbicpOwoKICAgIHZhciBsaWZldGltZSA9IFRPQVNUX0xJRkVUSU1FU1traW5kXSB8fCAzMDAwOwogICAgdmFyIHRpbWVyID0gbnVsbDsKICAgIHZhciByZW1vdmVkID0gZmFsc2U7CgogICAgZnVuY3Rpb24gcmVtb3ZlKCkgewogICAgICBpZiAocmVtb3ZlZCkgcmV0dXJuOwogICAgICByZW1vdmVkID0gdHJ1ZTsKICAgICAgaWYgKHRpbWVyKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgIH0KICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKCd2LXRvYXN0LS1pbicpOwogICAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3YtdG9hc3QtLW91dCcpOwogICAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlKSBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgIH07CiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGRvbmUsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgc2V0VGltZW91dChkb25lLCA2MDApOwogICAgfQoKICAgIGZ1bmN0aW9uIGFybSgpIHsKICAgICAgaWYgKHRpbWVyKSBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICB0aW1lciA9IHNldFRpbWVvdXQocmVtb3ZlLCBsaWZldGltZSk7CiAgICB9CiAgICBhcm0oKTsKCiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICh0aW1lcikgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgIH0pOwogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgYXJtKTsKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHRpbWVyKSBjbGVhclRpbWVvdXQodGltZXIpOwogICAgfSk7CiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgYXJtKTsKCiAgICByZXR1cm4geyBkaXNtaXNzOiByZW1vdmUsIG5vZGU6IG5vZGUgfTsKICB9OwoKICAoZnVuY3Rpb24gc3Vic2NyaWJlVG9hc3RCdXMoKSB7CiAgICBmdW5jdGlvbiBiaW5kKCkgewogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIFYuc3RvcmUub24oJ3RvYXN0JywgZnVuY3Rpb24gKHBheWxvYWQpIHsKICAgICAgICAgIGlmICghcGF5bG9hZCkgcmV0dXJuOwogICAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJykgewogICAgICAgICAgICB1aS50b2FzdChwYXlsb2FkLCAnaW5mbycpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdWkudG9hc3QocGF5bG9hZC5tc2cgfHwgcGF5bG9hZC5tZXNzYWdlIHx8ICcnLCBwYXlsb2FkLmtpbmQgfHwgcGF5bG9hZC50eXBlIHx8ICdpbmZvJyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgVi5zdG9yZS5vbignZXJyb3InLCBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICAgICAgdmFyIG0gPQogICAgICAgICAgICB0eXBlb2YgcGF5bG9hZCA9PT0gJ3N0cmluZycKICAgICAgICAgICAgICA/IHBheWxvYWQKICAgICAgICAgICAgICA6IChwYXlsb2FkICYmIChwYXlsb2FkLm1lc3NhZ2UgfHwgcGF5bG9hZC5tc2cpKSB8fCAnU29tZXRoaW5nIHdlbnQgd3JvbmcuJzsKICAgICAgICAgIHVpLnRvYXN0KG0sICdlcnJvcicpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICghYmluZCgpKSB7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBiaW5kKTsKICAgICAgc2V0VGltZW91dChiaW5kLCAwKTsKICAgIH0KICB9KSgpOwoKICB2YXIgT1ZFUkxBWV9IT1NUX0lEID0gJ3Ytb3ZlcmxheS1ob3N0JzsKICB2YXIgb3Blbk92ZXJsYXlzID0gW107CgogIHZhciBGT0NVU0FCTEVfU0VMID0KICAgICdhW2hyZWZdLCBhcmVhW2hyZWZdLCBidXR0b246bm90KFtkaXNhYmxlZF0pLCBpbnB1dDpub3QoW2Rpc2FibGVkXSk6bm90KFt0eXBlPSJoaWRkZW4iXSksICcgKwogICAgJ3NlbGVjdDpub3QoW2Rpc2FibGVkXSksIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSwgaWZyYW1lLCBbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9Ii0xIl0pLCAnICsKICAgICdbY29udGVudGVkaXRhYmxlPSJ0cnVlIl0nOwoKICBmdW5jdGlvbiBvdmVybGF5SG9zdCgpIHsKICAgIHJldHVybiBlbnN1cmVIb3N0KE9WRVJMQVlfSE9TVF9JRCwgJ3Ytb3ZlcmxheS1ob3N0Jyk7CiAgfQoKICBmdW5jdGlvbiBmb2N1c2FibGUoY29udGFpbmVyKSB7CiAgICB2YXIgbGlzdCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKEZPQ1VTQUJMRV9TRUwpKTsKICAgIHJldHVybiBsaXN0LmZpbHRlcihmdW5jdGlvbiAobikgewogICAgICByZXR1cm4gKAogICAgICAgIG4ub2Zmc2V0V2lkdGggPiAwIHx8CiAgICAgICAgbi5vZmZzZXRIZWlnaHQgPiAwIHx8CiAgICAgICAgbiA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCB8fAogICAgICAgIG4uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPiAwCiAgICAgICk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIG1ha2VPdmVybGF5KG5vZGUsIG9wdHMsIHZhcmlhbnQpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGhvc3QgPSBvdmVybGF5SG9zdCgpOwogICAgdmFyIGxhc3RGb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKICAgIHZhciBjbG9zZWQgPSBmYWxzZTsKCiAgICB2YXIgcGFuZWxDbGFzcyA9CiAgICAgIHZhcmlhbnQgPT09ICdzaGVldCcgPyAndi1zaGVldCBsaXF1aWQtZ2xhc3MnIDogJ3YtbW9kYWwgbGlxdWlkLWdsYXNzJzsKICAgIGlmIChvcHRzLmNsYXNzTmFtZSkgcGFuZWxDbGFzcyArPSAnICcgKyBvcHRzLmNsYXNzTmFtZTsKCiAgICB2YXIgcGFuZWwgPSBlbCgnZGl2JywgewogICAgICBjbGFzczogcGFuZWxDbGFzcywKICAgICAgcm9sZTogJ2RpYWxvZycsCiAgICAgICdhcmlhLW1vZGFsJzogJ3RydWUnLAogICAgICB0YWJpbmRleDogJy0xJwogICAgfSk7CiAgICBpZiAob3B0cy5hcmlhTGFiZWwpIHBhbmVsLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIG9wdHMuYXJpYUxhYmVsKTsKCiAgICBpZiAodmFyaWFudCA9PT0gJ3NoZWV0JykgewogICAgICBwYW5lbC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2hlZXRfX2dyYWInLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSkpOwogICAgfQogICAgaWYgKG9wdHMuZGlzbWlzc0J1dHRvbiAhPT0gZmFsc2UpIHsKICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQoCiAgICAgICAgZWwoCiAgICAgICAgICAnYnV0dG9uJywKICAgICAgICAgIHsKICAgICAgICAgICAgY2xhc3M6ICd2LW1vZGFsX19jbG9zZScsCiAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgICAgICAnYXJpYS1sYWJlbCc6ICdDbG9zZScsCiAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBjbG9zZSgnYnV0dG9uJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBpY29uKCdjbG9zZScpCiAgICAgICAgKQogICAgICApOwogICAgfQoKICAgIHZhciBib2R5ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vZGFsX19ib2R5JyB9KTsKICAgIGlmIChub2RlICYmIG5vZGUubm9kZVR5cGUpIGJvZHkuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICBlbHNlIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycpIGJvZHkuaW5uZXJIVE1MID0gbm9kZTsKICAgIHBhbmVsLmFwcGVuZENoaWxkKGJvZHkpOwoKICAgIHZhciBiYWNrZHJvcCA9IGVsKAogICAgICAnZGl2JywKICAgICAgewogICAgICAgIGNsYXNzOiB2YXJpYW50ID09PSAnc2hlZXQnID8gJ3Ytb3ZlcmxheSB2LW92ZXJsYXktLXNoZWV0JyA6ICd2LW92ZXJsYXknLAogICAgICAgIG9uUG9pbnRlcmRvd246IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IGJhY2tkcm9wICYmIG9wdHMuZGlzbWlzc09uQmFja2Ryb3AgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIGNsb3NlKCdiYWNrZHJvcCcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgcGFuZWwKICAgICk7CgogICAgZnVuY3Rpb24gb25LZXlkb3duKGUpIHsKICAgICAgaWYgKG9wZW5PdmVybGF5c1tvcGVuT3ZlcmxheXMubGVuZ3RoIC0gMV0gIT09IGFwaSkgcmV0dXJuOwogICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIG9wdHMuZGlzbWlzc09uRXNjICE9PSBmYWxzZSkgewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgY2xvc2UoJ2VzY2FwZScpOwogICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnVGFiJykgewogICAgICAgIHZhciBpdGVtcyA9IGZvY3VzYWJsZShwYW5lbCk7CiAgICAgICAgaWYgKCFpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHBhbmVsLmZvY3VzKCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBmaXJzdCA9IGl0ZW1zWzBdOwogICAgICAgIHZhciBsYXN0ID0gaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV07CiAgICAgICAgdmFyIGFjdGl2ZSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7CiAgICAgICAgaWYgKGUuc2hpZnRLZXkgJiYgKGFjdGl2ZSA9PT0gZmlyc3QgfHwgYWN0aXZlID09PSBwYW5lbCkpIHsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGxhc3QuZm9jdXMoKTsKICAgICAgICB9IGVsc2UgaWYgKCFlLnNoaWZ0S2V5ICYmIGFjdGl2ZSA9PT0gbGFzdCkgewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgZmlyc3QuZm9jdXMoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjbG9zZShyZWFzb24pIHsKICAgICAgaWYgKGNsb3NlZCkgcmV0dXJuOwogICAgICBjbG9zZWQgPSB0cnVlOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlkb3duLCB0cnVlKTsKICAgICAgdmFyIGlkeCA9IG9wZW5PdmVybGF5cy5pbmRleE9mKGFwaSk7CiAgICAgIGlmIChpZHggIT09IC0xKSBvcGVuT3ZlcmxheXMuc3BsaWNlKGlkeCwgMSk7CgogICAgICBiYWNrZHJvcC5jbGFzc0xpc3QucmVtb3ZlKCd2LW92ZXJsYXktLWluJyk7CiAgICAgIGJhY2tkcm9wLmNsYXNzTGlzdC5hZGQoJ3Ytb3ZlcmxheS0tb3V0Jyk7CiAgICAgIHZhciBmaW5pc2ggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKGJhY2tkcm9wLnBhcmVudE5vZGUpIGJhY2tkcm9wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYmFja2Ryb3ApOwogICAgICAgIGlmICghb3Blbk92ZXJsYXlzLmxlbmd0aCkgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCd2LXNjcm9sbC1sb2NrJyk7CiAgICAgICAgaWYgKGxhc3RGb2N1c2VkICYmIHR5cGVvZiBsYXN0Rm9jdXNlZC5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbGFzdEZvY3VzZWQuZm9jdXMoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgfQogICAgICB9OwogICAgICBiYWNrZHJvcC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZmluaXNoLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgIHNldFRpbWVvdXQoZmluaXNoLCA2MDApOwoKICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ2xvc2UgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICB0cnkgewogICAgICAgICAgb3B0cy5vbkNsb3NlKHJlYXNvbik7CiAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgfQogICAgfQoKICAgIHZhciBhcGkgPSB7IGNsb3NlOiBjbG9zZSwgbm9kZTogcGFuZWwsIGJvZHk6IGJvZHksIGJhY2tkcm9wOiBiYWNrZHJvcCB9OwoKICAgIGhvc3QuYXBwZW5kQ2hpbGQoYmFja2Ryb3ApOwogICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCd2LXNjcm9sbC1sb2NrJyk7CiAgICBvcGVuT3ZlcmxheXMucHVzaChhcGkpOwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5ZG93biwgdHJ1ZSk7CgogICAgYmFja2Ryb3Aub2Zmc2V0SGVpZ2h0OwogICAgYmFja2Ryb3AuY2xhc3NMaXN0LmFkZCgndi1vdmVybGF5LS1pbicpOwoKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChjbG9zZWQpIHJldHVybjsKICAgICAgdmFyIGF1dG8gPSBwYW5lbC5xdWVyeVNlbGVjdG9yKCdbYXV0b2ZvY3VzXScpOwogICAgICB2YXIgaXRlbXMgPSBhdXRvID8gW2F1dG9dIDogZm9jdXNhYmxlKHBhbmVsKTsKICAgICAgaWYgKGl0ZW1zLmxlbmd0aCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpdGVtc1swXS5mb2N1cygpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHBhbmVsLmZvY3VzKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHBhbmVsLmZvY3VzKCk7CiAgICAgIH0KICAgIH0pOwoKICAgIHJldHVybiBhcGk7CiAgfQoKICB1aS5tb2RhbCA9IGZ1bmN0aW9uIG1vZGFsKG5vZGUsIG9wdHMpIHsKICAgIHJldHVybiBtYWtlT3ZlcmxheShub2RlLCBvcHRzLCAnbW9kYWwnKTsKICB9OwoKICB1aS5zaGVldCA9IGZ1bmN0aW9uIHNoZWV0KG5vZGUsIG9wdHMpIHsKICAgIHJldHVybiBtYWtlT3ZlcmxheShub2RlLCBvcHRzLCAnc2hlZXQnKTsKICB9OwoKICB1aS5jb25maXJtID0gZnVuY3Rpb24gY29uZmlybShtc2csIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CiAgICAgIHZhciBzZXR0bGVkID0gZmFsc2U7CiAgICAgIGZ1bmN0aW9uIHNldHRsZSh2YWwpIHsKICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOwogICAgICAgIHNldHRsZWQgPSB0cnVlOwogICAgICAgIHJlZi5jbG9zZSgnY29uZmlybScpOwogICAgICAgIHJlc29sdmUodmFsKTsKICAgICAgfQoKICAgICAgdmFyIGNvbnRlbnQgPSBlbCgKICAgICAgICAnZGl2JywKICAgICAgICB7IGNsYXNzOiAndi1jb25maXJtJyB9LAogICAgICAgIG9wdHMudGl0bGUgPyBlbCgnaDMnLCB7IGNsYXNzOiAndi1jb25maXJtX190aXRsZScgfSwgU3RyaW5nKG9wdHMudGl0bGUpKSA6IG51bGwsCiAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1jb25maXJtX19tc2cnIH0sIFN0cmluZyhtc2cgfHwgJ0FyZSB5b3Ugc3VyZT8nKSksCiAgICAgICAgZWwoCiAgICAgICAgICAnZGl2JywKICAgICAgICAgIHsgY2xhc3M6ICd2LWNvbmZpcm1fX2FjdGlvbnMnIH0sCiAgICAgICAgICBlbCgKICAgICAgICAgICAgJ2J1dHRvbicsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCcsCiAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgc2V0dGxlKGZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9wdHMuY2FuY2VsTGFiZWwgfHwgJ0NhbmNlbCcKICAgICAgICAgICksCiAgICAgICAgICBlbCgKICAgICAgICAgICAgJ2J1dHRvbicsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjbGFzczogJ3YtY3RhICcgKyAob3B0cy5kZXN0cnVjdGl2ZSA/ICd2LWN0YS0tZGFuZ2VyJyA6ICd2LWN0YS0tcHJpbWFyeScpLAogICAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgICAgICAgIGF1dG9mb2N1czogJycsCiAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgc2V0dGxlKHRydWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgb3B0cy5jb25maXJtTGFiZWwgfHwgKG9wdHMuZGVzdHJ1Y3RpdmUgPyAnRGVsZXRlJyA6ICdDb25maXJtJykKICAgICAgICAgICkKICAgICAgICApCiAgICAgICk7CgogICAgICB2YXIgcmVmID0gbWFrZU92ZXJsYXkoCiAgICAgICAgY29udGVudCwKICAgICAgICB7CiAgICAgICAgICBjbGFzc05hbWU6ICd2LW1vZGFsLS1jb25maXJtJywKICAgICAgICAgIGFyaWFMYWJlbDogb3B0cy50aXRsZSB8fCAnQ29uZmlybScsCiAgICAgICAgICBkaXNtaXNzQnV0dG9uOiBmYWxzZSwKICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgc2V0dGxlKGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICdtb2RhbCcKICAgICAgKTsKICAgIH0pOwogIH07CgogIHVpLnNwaW5uZXIgPSBmdW5jdGlvbiBzcGlubmVyKHNpemUpIHsKICAgIHZhciBub2RlID0gZWwoJ3NwYW4nLCB7CiAgICAgIGNsYXNzOiAndi1zcGlubmVyJywKICAgICAgcm9sZTogJ3N0YXR1cycsCiAgICAgICdhcmlhLWxhYmVsJzogJ0xvYWRpbmcnCiAgICB9KTsKICAgIGlmIChzaXplKSBub2RlLnN0eWxlLnNldFByb3BlcnR5KCctLXYtc3Bpbm5lci1zaXplJywgc2l6ZSArICdweCcpOwogICAgbm9kZS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXNwaW5uZXJfX3JpbmcnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSkpOwogICAgcmV0dXJuIG5vZGU7CiAgfTsKCiAgZnVuY3Rpb24gc2tlbEJsb2NrKGV4dHJhQ2xhc3MpIHsKICAgIHJldHVybiBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24nICsgKGV4dHJhQ2xhc3MgPyAnICcgKyBleHRyYUNsYXNzIDogJycpIH0pOwogIH0KCiAgdWkuc2tlbGV0b24gPSBmdW5jdGlvbiBza2VsZXRvbihraW5kLCBjb3VudCkgewogICAga2luZCA9IGtpbmQgfHwgJ2NhcmQnOwogICAgY291bnQgPSBjb3VudCB8fCAoa2luZCA9PT0gJ2dyaWQnID8gNiA6IGtpbmQgPT09ICdsaW5lJyA/IDMgOiAxKTsKCiAgICBpZiAoa2luZCA9PT0gJ2xpbmUnIHx8IGtpbmQgPT09ICd0ZXh0JykgewogICAgICB2YXIgbGluZXMgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24tbGluZXMnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgIHZhciB3ID0gaSA9PT0gY291bnQgLSAxID8gJzYyJScgOiBpICUgMiA/ICc4OCUnIDogJzEwMCUnOwogICAgICAgIHZhciBsbiA9IHNrZWxCbG9jaygndi1za2VsZXRvbi0tbGluZScpOwogICAgICAgIGxuLnN0eWxlLndpZHRoID0gdzsKICAgICAgICBsaW5lcy5hcHBlbmRDaGlsZChsbik7CiAgICAgIH0KICAgICAgcmV0dXJuIGxpbmVzOwogICAgfQoKICAgIGlmIChraW5kID09PSAnaW1hZ2UnKSB7CiAgICAgIHJldHVybiBza2VsQmxvY2soJ3Ytc2tlbGV0b24tLWltYWdlJyk7CiAgICB9CgogICAgaWYgKGtpbmQgPT09ICdwaWxsJykgewogICAgICByZXR1cm4gc2tlbEJsb2NrKCd2LXNrZWxldG9uLS1waWxsJyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2tlbENhcmQoKSB7CiAgICAgIHJldHVybiBlbCgKICAgICAgICAnZGl2JywKICAgICAgICB7IGNsYXNzOiAndi1za2VsZXRvbi1jYXJkJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sCiAgICAgICAgc2tlbEJsb2NrKCd2LXNrZWxldG9uLS1tZWRpYScpLAogICAgICAgIGVsKAogICAgICAgICAgJ2RpdicsCiAgICAgICAgICB7IGNsYXNzOiAndi1za2VsZXRvbi1jYXJkX19tZXRhJyB9LAogICAgICAgICAgc2tlbEJsb2NrKCd2LXNrZWxldG9uLS1saW5lJyksCiAgICAgICAgICBza2VsQmxvY2soJ3Ytc2tlbGV0b24tLWxpbmUgdi1za2VsZXRvbi0tc2hvcnQnKQogICAgICAgICkKICAgICAgKTsKICAgIH0KCiAgICBpZiAoa2luZCA9PT0gJ2NhcmQnKSB7CiAgICAgIHJldHVybiBza2VsQ2FyZCgpOwogICAgfQoKICAgIHZhciBncmlkID0gZWwoJ2RpdicsIHsKICAgICAgY2xhc3M6ICd2LXNrZWxldG9uLWdyaWQgdi1ncmlkIHYtZ3JpZC0tMycsCiAgICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJywKICAgICAgJ2FyaWEtYnVzeSc6ICd0cnVlJwogICAgfSk7CiAgICBmb3IgKHZhciBnID0gMDsgZyA8IGNvdW50OyBnKyspIGdyaWQuYXBwZW5kQ2hpbGQoc2tlbENhcmQoKSk7CiAgICByZXR1cm4gZ3JpZDsKICB9OwoKICB1aS5lbXB0eSA9IGZ1bmN0aW9uIGVtcHR5KG1zZywgYWN0aW9uTGFiZWwsIG9uQWN0aW9uKSB7CiAgICB2YXIgaWNvbk5hbWUgPSAnaW1hZ2UnOwogICAgdmFyIHRpdGxlID0gJ05vdGhpbmcgaGVyZSB5ZXQnOwogICAgdmFyIHN1YiA9IG1zZyB8fCAnJzsKICAgIGlmIChtc2cgJiYgdHlwZW9mIG1zZyA9PT0gJ29iamVjdCcpIHsKICAgICAgdGl0bGUgPSBtc2cudGl0bGUgfHwgdGl0bGU7CiAgICAgIHN1YiA9IG1zZy5tZXNzYWdlIHx8IG1zZy5tc2cgfHwgJyc7CiAgICAgIGljb25OYW1lID0gbXNnLmljb24gfHwgaWNvbk5hbWU7CiAgICAgIGFjdGlvbkxhYmVsID0gbXNnLmFjdGlvbkxhYmVsIHx8IGFjdGlvbkxhYmVsOwogICAgICBvbkFjdGlvbiA9IG1zZy5vbkFjdGlvbiB8fCBvbkFjdGlvbjsKICAgIH0gZWxzZSB7CiAgICAgIHRpdGxlID0gbXNnIHx8IHRpdGxlOwogICAgICBzdWIgPSAnJzsKICAgIH0KCiAgICB2YXIgbm9kZSA9IGVsKAogICAgICAnZGl2JywKICAgICAgeyBjbGFzczogJ3YtZW1wdHknLCByb2xlOiAnbm90ZScgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oaWNvbk5hbWUpKSwKICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fdGl0bGUnIH0sIHRpdGxlKSwKICAgICAgc3ViID8gZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fc3ViJyB9LCBzdWIpIDogbnVsbAogICAgKTsKCiAgICBpZiAoYWN0aW9uTGFiZWwgJiYgdHlwZW9mIG9uQWN0aW9uID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoCiAgICAgICAgZWwoCiAgICAgICAgICAnYnV0dG9uJywKICAgICAgICAgIHsKICAgICAgICAgICAgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWVtcHR5X19hY3Rpb24nLAogICAgICAgICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICBvbkFjdGlvbihlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGFjdGlvbkxhYmVsCiAgICAgICAgKQogICAgICApOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfTsKCiAgdWkuY3JlZGl0c1BpbGwgPSBmdW5jdGlvbiBjcmVkaXRzUGlsbChuKSB7CiAgICB2YXIgdmFsID0gbiA9PSBudWxsID8gMCA6IE51bWJlcihuKTsKICAgIHZhciBkaXNwbGF5ID0gaXNGaW5pdGUodmFsKSA/IGZvcm1hdENyZWRpdHModmFsKSA6IFN0cmluZyhuKTsKICAgIHJldHVybiBlbCgKICAgICAgJ3NwYW4nLAogICAgICB7CiAgICAgICAgY2xhc3M6ICd2LWNyZWRpdHMgdi1jcmVkaXRzLXBpbGwnLAogICAgICAgIHRpdGxlOiBkaXNwbGF5ICsgJyBjcmVkaXRzJywKICAgICAgICAnYXJpYS1sYWJlbCc6IGRpc3BsYXkgKyAnIGNyZWRpdHMnCiAgICAgIH0sCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3JlZGl0c19faWNvbicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9LCBpY29uKCdzcGFyaycpKSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVkaXRzX19udW0nIH0sIGRpc3BsYXkpCiAgICApOwogIH07CgogIGZ1bmN0aW9uIGZvcm1hdENyZWRpdHMobikgewogICAgaWYgKG4gPj0gMTAwMDAwMCkgcmV0dXJuIChuIC8gMTAwMDAwMCkudG9GaXhlZChuICUgMTAwMDAwMCA/IDEgOiAwKSArICdNJzsKICAgIGlmIChuID49IDEwMDAwKSByZXR1cm4gTWF0aC5yb3VuZChuIC8gMTAwMCkgKyAnayc7CiAgICByZXR1cm4gU3RyaW5nKE1hdGgucm91bmQobikpOwogIH0KCiAgdWkuaW1nQ2FyZCA9IGZ1bmN0aW9uIGltZ0NhcmQoaW1hZ2UsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgaW1hZ2UgPSBpbWFnZSB8fCB7fTsKCiAgICB2YXIgYWZ0ZXIgPQogICAgICBpbWFnZS5yZW1vdGVJbWFnZVVSTCB8fAogICAgICBpbWFnZS5yZW1vdGVJbWFnZVVybCB8fAogICAgICBpbWFnZS5pbWFnZVVSTCB8fAogICAgICBpbWFnZS51cmwgfHwKICAgICAgJyc7CiAgICB2YXIgYmVmb3JlID0KICAgICAgaW1hZ2UucmVtb3RlT3JpZ2luYWxJbWFnZVVSTCB8fAogICAgICBpbWFnZS5yZW1vdGVPcmlnaW5hbEltYWdlVXJsIHx8CiAgICAgIGltYWdlLm9yaWdpbmFsSW1hZ2VVUkwgfHwKICAgICAgJyc7CiAgICB2YXIgd2FudFNjcnViID0gb3B0cy5iZWZvcmVBZnRlciAhPT0gZmFsc2UgJiYgISFiZWZvcmUgJiYgYmVmb3JlICE9PSBhZnRlcjsKCiAgICB2YXIgY2FyZCA9IGVsKCdidXR0b24nLCB7CiAgICAgIGNsYXNzOiAndi1jYXJkIHYtaW1nY2FyZCcsCiAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAnYXJpYS1sYWJlbCc6IGltYWdlLnByb21wdCA/ICdPcGVuOiAnICsgdHJ1bmNhdGUoaW1hZ2UucHJvbXB0LCA4MCkgOiAnT3BlbiBpbWFnZScKICAgIH0pOwoKICAgIHZhciBtZWRpYSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1pbWdjYXJkX19tZWRpYScgfSk7CgogICAgaWYgKHdhbnRTY3J1YikgewogICAgICBjYXJkLmNsYXNzTGlzdC5hZGQoJ3YtaW1nY2FyZC0tc2NydWInKTsKICAgICAgdmFyIHNjcnViTm9kZSA9IHVpLnNjcnViKGJlZm9yZSwgYWZ0ZXIsIHsgaW50ZXJhY3RpdmU6IG9wdHMuc2NydWJJbnRlcmFjdGl2ZSAhPT0gZmFsc2UgfSk7CiAgICAgIG1lZGlhLmFwcGVuZENoaWxkKHNjcnViTm9kZSk7CiAgICB9IGVsc2UgewogICAgICBtZWRpYS5jbGFzc0xpc3QuYWRkKCd2LWltZ2NhcmRfX21lZGlhLS1wbGFpbicpOwogICAgICB2YXIgcGggPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24gdi1pbWdjYXJkX19waCcsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKICAgICAgbWVkaWEuYXBwZW5kQ2hpbGQocGgpOwoKICAgICAgdmFyIGltZyA9IGVsKCdpbWcnLCB7CiAgICAgICAgY2xhc3M6ICd2LWltZ2NhcmRfX2ltZycsCiAgICAgICAgbG9hZGluZzogJ2xhenknLAogICAgICAgIGRlY29kaW5nOiAnYXN5bmMnLAogICAgICAgIGFsdDogaW1hZ2UucHJvbXB0ID8gdHJ1bmNhdGUoaW1hZ2UucHJvbXB0LCAxMjApIDogJ0dlbmVyYXRlZCBpbWFnZScsCiAgICAgICAgc3JjOiBhZnRlcgogICAgICB9KTsKICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQoJ2lzLWxvYWRlZCcpOwogICAgICAgIGlmIChwaC5wYXJlbnROb2RlKSBwaC5jbGFzc0xpc3QuYWRkKCdpcy1nb25lJyk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBpZiAocGgucGFyZW50Tm9kZSkgcGgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwaCk7CiAgICAgICAgfSwgMzYwKTsKICAgICAgfSk7CiAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICBtZWRpYS5jbGFzc0xpc3QuYWRkKCd2LWltZ2NhcmRfX21lZGlhLS1lcnInKTsKICAgICAgICBwaC5jbGFzc0xpc3QuYWRkKCdpcy1lcnJvcicpOwogICAgICAgIHBoLmlubmVySFRNTCA9ICcnOwogICAgICAgIHBoLmFwcGVuZENoaWxkKGljb24oJ2ltYWdlJykpOwogICAgICB9KTsKICAgICAgbWVkaWEuYXBwZW5kQ2hpbGQoaW1nKTsKICAgIH0KCiAgICBjYXJkLmFwcGVuZENoaWxkKG1lZGlhKTsKCiAgICBpZiAoaW1hZ2UuZmF2b3JpdGVkKSB7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQoCiAgICAgICAgZWwoCiAgICAgICAgICAnc3BhbicsCiAgICAgICAgICB7IGNsYXNzOiAndi1pbWdjYXJkX19mYXYnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIHRpdGxlOiAnRmF2b3JpdGVkJyB9LAogICAgICAgICAgaWNvbignaGVhcnQnKQogICAgICAgICkKICAgICAgKTsKICAgIH0KCiAgICBpZiAoaW1hZ2UucHJvbXB0ICYmIG9wdHMuY2FwdGlvbiAhPT0gZmFsc2UgJiYgIWltYWdlLmhpZGVQcm9tcHQpIHsKICAgICAgY2FyZC5hcHBlbmRDaGlsZCgKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWltZ2NhcmRfX2NhcHRpb24nLCB0aXRsZTogU3RyaW5nKGltYWdlLnByb21wdCkgfSwgU3RyaW5nKGltYWdlLnByb21wdCkpCiAgICAgICk7CiAgICB9CgogICAgaWYgKHR5cGVvZiBvcHRzLm9uVGFwID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgewogICAgICAgIGlmIChjYXJkLmRhdGFzZXQuc2NydWJiZWQgPT09ICcxJykgewogICAgICAgICAgY2FyZC5kYXRhc2V0LnNjcnViYmVkID0gJzAnOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBvcHRzLm9uVGFwKGltYWdlLCBlKTsKICAgICAgfSk7CiAgICB9CgogICAgcmV0dXJuIGNhcmQ7CiAgfTsKCiAgZnVuY3Rpb24gdHJ1bmNhdGUocywgbikgewogICAgcyA9IFN0cmluZyhzIHx8ICcnKTsKICAgIHJldHVybiBzLmxlbmd0aCA+IG4gPyBzLnNsaWNlKDAsIG4gLSAxKS50cmltRW5kKCkgKyAn4oCmJyA6IHM7CiAgfQoKICB1aS5zY3J1YiA9IGZ1bmN0aW9uIHNjcnViKGJlZm9yZVVSTCwgYWZ0ZXJVUkwsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGludGVyYWN0aXZlID0gb3B0cy5pbnRlcmFjdGl2ZSAhPT0gZmFsc2U7CgogICAgdmFyIGFmdGVySW1nID0gZWwoJ2ltZycsIHsKICAgICAgY2xhc3M6ICd2YWZ0ZXInLAogICAgICBzcmM6IGFmdGVyVVJMIHx8IGJlZm9yZVVSTCB8fCAnJywKICAgICAgYWx0OiBvcHRzLmFmdGVyQWx0IHx8ICdBZnRlcicsCiAgICAgIGRyYWdnYWJsZTogJ2ZhbHNlJywKICAgICAgZGVjb2Rpbmc6ICdhc3luYycsCiAgICAgIGxvYWRpbmc6IG9wdHMuZWFnZXIgPyAnZWFnZXInIDogJ2xhenknCiAgICB9KTsKICAgIHZhciBiZWZvcmVJbWcgPSBlbCgnaW1nJywgewogICAgICBjbGFzczogJ3ZiZWZvcmUnLAogICAgICBzcmM6IGJlZm9yZVVSTCB8fCBhZnRlclVSTCB8fCAnJywKICAgICAgYWx0OiBvcHRzLmJlZm9yZUFsdCB8fCAnQmVmb3JlJywKICAgICAgZHJhZ2dhYmxlOiAnZmFsc2UnLAogICAgICBkZWNvZGluZzogJ2FzeW5jJywKICAgICAgbG9hZGluZzogb3B0cy5lYWdlciA/ICdlYWdlcicgOiAnbGF6eScKICAgIH0pOwogICAgdmFyIGRpdmlkZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3ZzY3J1YicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKCiAgICB2YXIgY2FyZCA9IGVsKAogICAgICAnZGl2JywKICAgICAgewogICAgICAgIGNsYXNzOiAndmNhcmQnLAogICAgICAgIHJvbGU6IGludGVyYWN0aXZlID8gJ3NsaWRlcicgOiAnaW1nJywKICAgICAgICB0YWJpbmRleDogaW50ZXJhY3RpdmUgPyAnMCcgOiBudWxsLAogICAgICAgICdhcmlhLWxhYmVsJzogaW50ZXJhY3RpdmUKICAgICAgICAgID8gJ0JlZm9yZSBhbmQgYWZ0ZXIgY29tcGFyaXNvbi4gVXNlIGFycm93IGtleXMgdG8gY29tcGFyZS4nCiAgICAgICAgICA6ICdCZWZvcmUgYW5kIGFmdGVyIGNvbXBhcmlzb24nLAogICAgICAgICdhcmlhLXZhbHVlbWluJzogaW50ZXJhY3RpdmUgPyAnMCcgOiBudWxsLAogICAgICAgICdhcmlhLXZhbHVlbWF4JzogaW50ZXJhY3RpdmUgPyAnMTAwJyA6IG51bGwsCiAgICAgICAgJ2FyaWEtdmFsdWVub3cnOiBpbnRlcmFjdGl2ZSA/ICc1MCcgOiBudWxsCiAgICAgIH0sCiAgICAgIGFmdGVySW1nLAogICAgICBiZWZvcmVJbWcsCiAgICAgIGRpdmlkZXIKICAgICk7CgogICAgZnVuY3Rpb24gb25TY3J1YkJyb2tlbigpIHsKICAgICAgaWYgKGNhcmQuY2xhc3NMaXN0LmNvbnRhaW5zKCd2Y2FyZC0tbm9pbWcnKSkgcmV0dXJuOwogICAgICBjYXJkLmNsYXNzTGlzdC5hZGQoJ3ZjYXJkLS1ub2ltZycpOwogICAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndmNhcmRfX25vaW1nJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oJ2ltYWdlJykpKTsKICAgIH0KICAgIGFmdGVySW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25TY3J1YkJyb2tlbik7CiAgICBpZiAoIWFmdGVyVVJMICYmICFiZWZvcmVVUkwpIG9uU2NydWJCcm9rZW4oKTsKCiAgICB2YXIgZmVlZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndmZlZWQgdmZlZWQtLXNpbmdsZScgfSwgY2FyZCk7CgogICAgdmFyIHJldmVhbCA9IDAuNTsKICAgIGZ1bmN0aW9uIGFwcGx5UmV2ZWFsKHIpIHsKICAgICAgcmV2ZWFsID0gY2xhbXAociwgMCwgMSk7CiAgICAgIHZhciBwY3QgPSAocmV2ZWFsICogMTAwKS50b0ZpeGVkKDIpOwogICAgICBiZWZvcmVJbWcuc3R5bGUuY2xpcFBhdGggPSAnaW5zZXQoMCAnICsgKDEwMCAtIHBjdCkgKyAnJSAwIDApJzsKICAgICAgYmVmb3JlSW1nLnN0eWxlLndlYmtpdENsaXBQYXRoID0gJ2luc2V0KDAgJyArICgxMDAgLSBwY3QpICsgJyUgMCAwKSc7CiAgICAgIGRpdmlkZXIuc3R5bGUubGVmdCA9IHBjdCArICclJzsKICAgICAgaWYgKGludGVyYWN0aXZlKSBjYXJkLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIFN0cmluZyhNYXRoLnJvdW5kKHJldmVhbCAqIDEwMCkpKTsKICAgIH0KICAgIGFwcGx5UmV2ZWFsKHJldmVhbCk7CgogICAgdmFyIHJhZklkID0gbnVsbDsKICAgIHZhciBhbmltQWN0aXZlID0gZmFsc2U7CiAgICB2YXIgYW5pbUZyb20gPSAwLjI7CiAgICB2YXIgYW5pbVRvID0gMC44OwogICAgdmFyIGFuaW1TdGFydCA9IDA7CiAgICB2YXIgYW5pbUR1ciA9IDI2MDA7CiAgICB2YXIgYW5pbURpciA9IDE7CiAgICB2YXIgcmVzdW1lVGltZXIgPSBudWxsOwogICAgdmFyIGRlc3Ryb3llZCA9IGZhbHNlOwogICAgdmFyIHJlZHVjZU1vdGlvbiA9IHByZWZlcnNSZWR1Y2VkTW90aW9uKCk7CgogICAgZnVuY3Rpb24gZWFzZUluT3V0KHQpIHsKICAgICAgcmV0dXJuIHQgPCAwLjUgPyAyICogdCAqIHQgOiAxIC0gTWF0aC5wb3coLTIgKiB0ICsgMiwgMikgLyAyOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0ZXAodHMpIHsKICAgICAgaWYgKCFhbmltQWN0aXZlIHx8IGRlc3Ryb3llZCkgcmV0dXJuOwogICAgICBpZiAoIWFuaW1TdGFydCkgYW5pbVN0YXJ0ID0gdHM7CiAgICAgIHZhciBlbGFwc2VkID0gdHMgLSBhbmltU3RhcnQ7CiAgICAgIHZhciB0ID0gY2xhbXAoZWxhcHNlZCAvIGFuaW1EdXIsIDAsIDEpOwogICAgICB2YXIgZWFzZWQgPSBlYXNlSW5PdXQodCk7CiAgICAgIHZhciBmcm9tID0gYW5pbURpciA9PT0gMSA/IGFuaW1Gcm9tIDogYW5pbVRvOwogICAgICB2YXIgdG8gPSBhbmltRGlyID09PSAxID8gYW5pbVRvIDogYW5pbUZyb207CiAgICAgIGFwcGx5UmV2ZWFsKGZyb20gKyAodG8gLSBmcm9tKSAqIGVhc2VkKTsKICAgICAgaWYgKHQgPj0gMSkgewogICAgICAgIGFuaW1EaXIgKj0gLTE7CiAgICAgICAgYW5pbVN0YXJ0ID0gdHM7CiAgICAgIH0KICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RhcnRBbmltKCkgewogICAgICBpZiAoIWludGVyYWN0aXZlKSByZXR1cm47CiAgICAgIGlmIChyZWR1Y2VNb3Rpb24pIHJldHVybjsKICAgICAgaWYgKGFuaW1BY3RpdmUgfHwgZGVzdHJveWVkKSByZXR1cm47CiAgICAgIGlmICghaXNPbnNjcmVlbigpKSByZXR1cm47CiAgICAgIGFuaW1BY3RpdmUgPSB0cnVlOwogICAgICBhbmltU3RhcnQgPSAwOwogICAgICBhbmltRGlyID0gMTsKICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RvcEFuaW0oKSB7CiAgICAgIGFuaW1BY3RpdmUgPSBmYWxzZTsKICAgICAgaWYgKHJhZklkKSB7CiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpOwogICAgICAgIHJhZklkID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmVzdW1lKGRlbGF5KSB7CiAgICAgIGlmIChyZXN1bWVUaW1lcikgY2xlYXJUaW1lb3V0KHJlc3VtZVRpbWVyKTsKICAgICAgcmVzdW1lVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICByZXN1bWVUaW1lciA9IG51bGw7CiAgICAgICAgYW5pbUZyb20gPSAwLjI7CiAgICAgICAgYW5pbVRvID0gMC44OwogICAgICAgIHN0YXJ0QW5pbSgpOwogICAgICB9LCBkZWxheSA9PSBudWxsID8gMTgwMCA6IGRlbGF5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc09uc2NyZWVuKCkgewogICAgICB2YXIgciA9IGZlZWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHJldHVybiByLmJvdHRvbSA+IDAgJiYgci50b3AgPCAod2luZG93LmlubmVySGVpZ2h0IHx8IDApICYmIHIud2lkdGggPiAwOwogICAgfQoKICAgIHZhciBkcmFnZ2luZyA9IGZhbHNlOwogICAgdmFyIHBvaW50ZXJJZCA9IG51bGw7CiAgICB2YXIgbW92ZWREdXJpbmdEcmFnID0gZmFsc2U7CgogICAgZnVuY3Rpb24gcmV2ZWFsRnJvbUNsaWVudFgoY2xpZW50WCkgewogICAgICB2YXIgcmVjdCA9IGNhcmQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGlmICghcmVjdC53aWR0aCkgcmV0dXJuIHJldmVhbDsKICAgICAgcmV0dXJuIChjbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGg7CiAgICB9CgogICAgZnVuY3Rpb24gb25Eb3duKGUpIHsKICAgICAgaWYgKCFpbnRlcmFjdGl2ZSkgcmV0dXJuOwogICAgICBpZiAoZS5idXR0b24gIT0gbnVsbCAmJiBlLmJ1dHRvbiAhPT0gMCAmJiBlLnBvaW50ZXJUeXBlID09PSAnbW91c2UnKSByZXR1cm47CiAgICAgIGRyYWdnaW5nID0gdHJ1ZTsKICAgICAgbW92ZWREdXJpbmdEcmFnID0gZmFsc2U7CiAgICAgIHBvaW50ZXJJZCA9IGUucG9pbnRlcklkICE9IG51bGwgPyBlLnBvaW50ZXJJZCA6IG51bGw7CiAgICAgIGlmIChwb2ludGVySWQgIT0gbnVsbCAmJiBjYXJkLnNldFBvaW50ZXJDYXB0dXJlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNhcmQuc2V0UG9pbnRlckNhcHR1cmUocG9pbnRlcklkKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHt9CiAgICAgIH0KICAgICAgc3RvcEFuaW0oKTsKICAgICAgaWYgKHJlc3VtZVRpbWVyKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHJlc3VtZVRpbWVyKTsKICAgICAgICByZXN1bWVUaW1lciA9IG51bGw7CiAgICAgIH0KICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCdzY3J1YmJpbmcnKTsKICAgICAgYXBwbHlSZXZlYWwocmV2ZWFsRnJvbUNsaWVudFgoZ2V0Q2xpZW50WChlKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIG9uTW92ZShlKSB7CiAgICAgIGlmICghZHJhZ2dpbmcpIHJldHVybjsKICAgICAgbW92ZWREdXJpbmdEcmFnID0gdHJ1ZTsKICAgICAgYXBwbHlSZXZlYWwocmV2ZWFsRnJvbUNsaWVudFgoZ2V0Q2xpZW50WChlKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIG9uVXAoZSkgewogICAgICBpZiAoIWRyYWdnaW5nKSByZXR1cm47CiAgICAgIGRyYWdnaW5nID0gZmFsc2U7CiAgICAgIGlmIChwb2ludGVySWQgIT0gbnVsbCAmJiBjYXJkLnJlbGVhc2VQb2ludGVyQ2FwdHVyZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjYXJkLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShwb2ludGVySWQpOwogICAgICAgIH0gY2F0Y2ggKGVycikge30KICAgICAgfQogICAgICBwb2ludGVySWQgPSBudWxsOwogICAgICBjYXJkLmNsYXNzTGlzdC5yZW1vdmUoJ3NjcnViYmluZycpOwogICAgICBpZiAobW92ZWREdXJpbmdEcmFnKSB7CiAgICAgICAgdmFyIGhvc3QgPSBjYXJkLmNsb3Nlc3QgJiYgY2FyZC5jbG9zZXN0KCcudi1pbWdjYXJkJyk7CiAgICAgICAgaWYgKGhvc3QpIGhvc3QuZGF0YXNldC5zY3J1YmJlZCA9ICcxJzsKICAgICAgfQogICAgICBzY2hlZHVsZVJlc3VtZSgxODAwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRDbGllbnRYKGUpIHsKICAgICAgaWYgKGUuY2xpZW50WCAhPSBudWxsKSByZXR1cm4gZS5jbGllbnRYOwogICAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlc1swXSkgcmV0dXJuIGUudG91Y2hlc1swXS5jbGllbnRYOwogICAgICBpZiAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKSByZXR1cm4gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBmdW5jdGlvbiBvbktleShlKSB7CiAgICAgIGlmICghaW50ZXJhY3RpdmUpIHJldHVybjsKICAgICAgdmFyIGRlbHRhID0gMDsKICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dMZWZ0JykgZGVsdGEgPSAtMC4wNTsKICAgICAgZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1JpZ2h0JykgZGVsdGEgPSAwLjA1OwogICAgICBlbHNlIGlmIChlLmtleSA9PT0gJ0hvbWUnKSB7CiAgICAgICAgYXBwbHlSZXZlYWwoMCk7CiAgICAgICAgYWZ0ZXJGb2N1c0FkanVzdCgpOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdFbmQnKSB7CiAgICAgICAgYXBwbHlSZXZlYWwoMSk7CiAgICAgICAgYWZ0ZXJGb2N1c0FkanVzdCgpOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSByZXR1cm47CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3RvcEFuaW0oKTsKICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCdzY3J1YmJpbmcnKTsKICAgICAgYXBwbHlSZXZlYWwocmV2ZWFsICsgZGVsdGEpOwogICAgICBhZnRlckZvY3VzQWRqdXN0KCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWZ0ZXJGb2N1c0FkanVzdCgpIHsKICAgICAgaWYgKHJlc3VtZVRpbWVyKSBjbGVhclRpbWVvdXQocmVzdW1lVGltZXIpOwogICAgICByZXN1bWVUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGNhcmQuY2xhc3NMaXN0LnJlbW92ZSgnc2NydWJiaW5nJyk7CiAgICAgICAgYW5pbUZyb20gPSAwLjI7CiAgICAgICAgYW5pbVRvID0gMC44OwogICAgICAgIHN0YXJ0QW5pbSgpOwogICAgICB9LCAyMjAwKTsKICAgIH0KCiAgICBpZiAoaW50ZXJhY3RpdmUpIHsKICAgICAgaWYgKHdpbmRvdy5Qb2ludGVyRXZlbnQpIHsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgb25Eb3duKTsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgb25Nb3ZlKTsKICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgb25VcCk7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBvblVwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uRG93bik7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW92ZSk7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblVwKTsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvbkRvd24sIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uTW92ZSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVXApOwogICAgICB9CiAgICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5KTsKICAgICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghZHJhZ2dpbmcpIHN0b3BBbmltKCk7CiAgICAgIH0pOwogICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFkcmFnZ2luZyAmJiAhcmVzdW1lVGltZXIpIHNjaGVkdWxlUmVzdW1lKDQwMCk7CiAgICAgIH0pOwogICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZnVuY3Rpb24gKCkgewogICAgICAgIHN0b3BBbmltKCk7CiAgICAgIH0pOwogICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgY2FyZC5jbGFzc0xpc3QucmVtb3ZlKCdzY3J1YmJpbmcnKTsKICAgICAgICBzY2hlZHVsZVJlc3VtZSg0MDApOwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgaW8gPSBudWxsOwogICAgZnVuY3Rpb24gc2V0dXBWaXNpYmlsaXR5KCkgewogICAgICBpZiAoIWludGVyYWN0aXZlIHx8IHJlZHVjZU1vdGlvbikgcmV0dXJuOwogICAgICBpZiAoJ0ludGVyc2VjdGlvbk9ic2VydmVyJyBpbiB3aW5kb3cpIHsKICAgICAgICBpbyA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigKICAgICAgICAgIGZ1bmN0aW9uIChlbnRyaWVzKSB7CiAgICAgICAgICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW4pIHsKICAgICAgICAgICAgICBpZiAoZW4uaXNJbnRlcnNlY3RpbmcpIHsKICAgICAgICAgICAgICAgIGlmICghZHJhZ2dpbmcgJiYgIXJlc3VtZVRpbWVyKSBzdGFydEFuaW0oKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3RvcEFuaW0oKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIHsgdGhyZXNob2xkOiAwLjI1IH0KICAgICAgICApOwogICAgICAgIGlvLm9ic2VydmUoZmVlZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RhcnRBbmltKCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbml0KCkgewogICAgICBhcHBseVJldmVhbCgwLjUpOwogICAgICBzZXR1cFZpc2liaWxpdHkoKTsKICAgICAgaWYgKCFpbykgewogICAgICAgIHN0YXJ0QW5pbSgpOwogICAgICB9CiAgICB9CiAgICBpZiAoYWZ0ZXJJbWcuY29tcGxldGUpIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGluaXQpOwogICAgfSBlbHNlIHsKICAgICAgYWZ0ZXJJbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaW5pdCk7CiAgICAgIH0pOwogICAgICBhZnRlckltZy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaW5pdCk7CiAgICAgIH0pOwogICAgfQoKICAgIGZlZWQuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3koKSB7CiAgICAgIGRlc3Ryb3llZCA9IHRydWU7CiAgICAgIHN0b3BBbmltKCk7CiAgICAgIGlmIChyZXN1bWVUaW1lcikgY2xlYXJUaW1lb3V0KHJlc3VtZVRpbWVyKTsKICAgICAgaWYgKGlvKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlvLmRpc2Nvbm5lY3QoKTsKICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgIGlvID0gbnVsbDsKICAgICAgfQogICAgICBpZiAoIXdpbmRvdy5Qb2ludGVyRXZlbnQpIHsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlKTsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uVXApOwogICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVXApOwogICAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBvblVwKTsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIG9uVXApOwogICAgICB9CiAgICB9OwogICAgZmVlZC5zZXRSZXZlYWwgPSBhcHBseVJldmVhbDsKCiAgICByZXR1cm4gZmVlZDsKICB9OwoKICB1aS5jb25mZXR0aSA9IGZ1bmN0aW9uIGNvbmZldHRpKG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgaWYgKHByZWZlcnNSZWR1Y2VkTW90aW9uKCkpIHJldHVybjsKCiAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3YtY29uZmV0dGktY2FudmFzJyk7CiAgICBpZiAoIWNhbnZhcykgewogICAgICBjYW52YXMgPSBlbCgnY2FudmFzJywgeyBpZDogJ3YtY29uZmV0dGktY2FudmFzJywgY2xhc3M6ICd2LWNvbmZldHRpJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0pOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7CiAgICB9CiAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CiAgICB2YXIgZHByID0gTWF0aC5taW4od2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSwgMik7CgogICAgZnVuY3Rpb24gcmVzaXplKCkgewogICAgICBjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKHdpbmRvdy5pbm5lcldpZHRoICogZHByKTsKICAgICAgY2FudmFzLmhlaWdodCA9IE1hdGguZmxvb3Iod2luZG93LmlubmVySGVpZ2h0ICogZHByKTsKICAgICAgY2FudmFzLnN0eWxlLndpZHRoID0gd2luZG93LmlubmVyV2lkdGggKyAncHgnOwogICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0ICsgJ3B4JzsKICAgIH0KICAgIHJlc2l6ZSgpOwoKICAgIHZhciBXID0gd2luZG93LmlubmVyV2lkdGg7CiAgICB2YXIgSCA9IHdpbmRvdy5pbm5lckhlaWdodDsKCiAgICB2YXIgcGFsZXR0ZSA9IG9wdHMuY29sb3JzIHx8IFsKICAgICAgJyM1Mjk3RjgnLAogICAgICAnIzgyRDZGRicsCiAgICAgICcjMEE4NEZGJywKICAgICAgJyNmZmZmZmYnLAogICAgICAnI0M5RTdGRicsCiAgICAgICcjMDBCMjhCJwogICAgXTsKCiAgICB2YXIgY291bnQgPSBvcHRzLmNvdW50IHx8IChXIDwgNjQwID8gOTAgOiAxNTApOwogICAgdmFyIG9yaWdpblggPSBvcHRzLnggIT0gbnVsbCA/IG9wdHMueCA6IFcgLyAyOwogICAgdmFyIG9yaWdpblkgPSBvcHRzLnkgIT0gbnVsbCA/IG9wdHMueSA6IEggKiAwLjM0OwogICAgdmFyIHNwcmVhZCA9IG9wdHMuc3ByZWFkIHx8IE1hdGguUEk7CiAgICB2YXIgcG93ZXIgPSBvcHRzLnBvd2VyIHx8IDEzOwogICAgdmFyIGdyYXZpdHkgPSAwLjMyOwogICAgdmFyIGRyYWcgPSAwLjAwODU7CgogICAgdmFyIHBpZWNlcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIHZhciBhbmdsZSA9IC1NYXRoLlBJIC8gMiArIChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIHNwcmVhZDsKICAgICAgdmFyIHZlbG9jaXR5ID0gcG93ZXIgKiAoMC41NSArIE1hdGgucmFuZG9tKCkgKiAwLjY1KTsKICAgICAgcGllY2VzLnB1c2goewogICAgICAgIHg6IG9yaWdpblgsCiAgICAgICAgeTogb3JpZ2luWSwKICAgICAgICB2eDogTWF0aC5jb3MoYW5nbGUpICogdmVsb2NpdHkgKyAoTWF0aC5yYW5kb20oKSAtIDAuNSkgKiAyLAogICAgICAgIHZ5OiBNYXRoLnNpbihhbmdsZSkgKiB2ZWxvY2l0eSwKICAgICAgICB3OiA2ICsgTWF0aC5yYW5kb20oKSAqIDYsCiAgICAgICAgaDogOCArIE1hdGgucmFuZG9tKCkgKiA4LAogICAgICAgIHJvdDogTWF0aC5yYW5kb20oKSAqIE1hdGguUEkgKiAyLAogICAgICAgIHZyOiAoTWF0aC5yYW5kb20oKSAtIDAuNSkgKiAwLjQsCiAgICAgICAgY29sb3I6IHBhbGV0dGVbKE1hdGgucmFuZG9tKCkgKiBwYWxldHRlLmxlbmd0aCkgfCAwXSwKICAgICAgICBzaGFwZTogTWF0aC5yYW5kb20oKSA8IDAuMzIgPyAnY2lyY2xlJyA6ICdyZWN0JywKICAgICAgICB3b2JibGU6IE1hdGgucmFuZG9tKCkgKiBNYXRoLlBJICogMiwKICAgICAgICB3b2JibGVTcGVlZDogMC4wNiArIE1hdGgucmFuZG9tKCkgKiAwLjA2LAogICAgICAgIGxpZmU6IDAsCiAgICAgICAgdHRsOiAxNTAgKyBNYXRoLnJhbmRvbSgpICogNzAKICAgICAgfSk7CiAgICB9CgogICAgdmFyIHJ1bm5pbmcgPSB0cnVlOwogICAgdmFyIHN0YXJ0VHMgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIHZhciBtYXhNcyA9IG9wdHMuZHVyYXRpb24gfHwgMzIwMDsKCiAgICBmdW5jdGlvbiBmcmFtZSh0cykgewogICAgICBpZiAoIXJ1bm5pbmcpIHJldHVybjsKICAgICAgdmFyIGFsaXZlQW55ID0gZmFsc2U7CiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKICAgICAgY3R4LnNhdmUoKTsKICAgICAgY3R4LnNjYWxlKGRwciwgZHByKTsKCiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgcGllY2VzLmxlbmd0aDsgcCsrKSB7CiAgICAgICAgdmFyIHBjID0gcGllY2VzW3BdOwogICAgICAgIGlmIChwYy5saWZlID4gcGMudHRsKSBjb250aW51ZTsKICAgICAgICBhbGl2ZUFueSA9IHRydWU7CiAgICAgICAgcGMubGlmZSsrOwogICAgICAgIHBjLnZ5ICs9IGdyYXZpdHk7CiAgICAgICAgcGMudnggKj0gMSAtIGRyYWc7CiAgICAgICAgcGMudnkgKj0gMSAtIGRyYWc7CiAgICAgICAgcGMud29iYmxlICs9IHBjLndvYmJsZVNwZWVkOwogICAgICAgIHBjLnggKz0gcGMudnggKyBNYXRoLnNpbihwYy53b2JibGUpICogMC44OwogICAgICAgIHBjLnkgKz0gcGMudnk7CiAgICAgICAgcGMucm90ICs9IHBjLnZyOwoKICAgICAgICB2YXIgYWxwaGEgPSBwYy5saWZlID4gcGMudHRsIC0gMzYgPyBNYXRoLm1heCgwLCAocGMudHRsIC0gcGMubGlmZSkgLyAzNikgOiAxOwogICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IGFscGhhOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSBwYy5jb2xvcjsKICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgIGN0eC50cmFuc2xhdGUocGMueCwgcGMueSk7CiAgICAgICAgY3R4LnJvdGF0ZShwYy5yb3QpOwogICAgICAgIGlmIChwYy5zaGFwZSA9PT0gJ2NpcmNsZScpIHsKICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICAgIGN0eC5hcmMoMCwgMCwgcGMudyAvIDIsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgICAgIGN0eC5maWxsKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBzdyA9IHBjLncgKiAoMC41ICsgTWF0aC5hYnMoTWF0aC5jb3MocGMud29iYmxlKSkgKiAwLjYpOwogICAgICAgICAgY3R4LmZpbGxSZWN0KC1zdyAvIDIsIC1wYy5oIC8gMiwgc3csIHBjLmgpOwogICAgICAgIH0KICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICB9CiAgICAgIGN0eC5yZXN0b3JlKCk7CgogICAgICB2YXIgZWxhcHNlZCA9IHRzIC0gc3RhcnRUczsKICAgICAgaWYgKGFsaXZlQW55ICYmIGVsYXBzZWQgPCBtYXhNcykgewogICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcnVubmluZyA9IGZhbHNlOwogICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKICAgICAgICBpZiAoY2FudmFzLnBhcmVudE5vZGUpIGNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNhbnZhcyk7CiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uUmVzaXplKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIG9uUmVzaXplKCkgewogICAgICByZXNpemUoKTsKICAgIH0KICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblJlc2l6ZSk7CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnJhbWUpOwogIH07Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL3VpL2RvbS5qcyA9PT09PSAqLwoKKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwogIHZhciB1aSA9IChWLnVpID0gVi51aSB8fCB7fSk7CgogIHZhciBTVkdfTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOwoKICBmdW5jdGlvbiBlbCh0YWcsIGF0dHJzKSB7CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKCiAgICBpZiAoYXR0cnMgJiYgdHlwZW9mIGF0dHJzID09PSAnb2JqZWN0JyAmJiAhaXNOb2RlKGF0dHJzKSAmJiAhQXJyYXkuaXNBcnJheShhdHRycykpIHsKICAgICAgYXBwbHlBdHRycyhub2RlLCBhdHRycyk7CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CgogICAgICBhcHBlbmRDaGlsZChub2RlLCBhdHRycyk7CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgYXBwZW5kQ2hpbGQobm9kZSwgYXJndW1lbnRzW2ldKTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gYXBwbHlBdHRycyhub2RlLCBhdHRycykgewogICAgdmFyIHJlZkZuID0gbnVsbDsKICAgIGZvciAodmFyIGtleSBpbiBhdHRycykgewogICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywga2V5KSkgY29udGludWU7CiAgICAgIHZhciB2YWwgPSBhdHRyc1trZXldOwogICAgICBpZiAodmFsID09IG51bGwpIGNvbnRpbnVlOwoKICAgICAgaWYgKGtleSA9PT0gJ2NsYXNzJyB8fCBrZXkgPT09ICdjbGFzc05hbWUnKSB7CiAgICAgICAgbm9kZS5jbGFzc05hbWUgPSBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKSA6IFN0cmluZyh2YWwpOwogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3N0eWxlJykgewogICAgICAgIGFwcGx5U3R5bGUobm9kZSwgdmFsKTsKICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdkYXRhc2V0JyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JykgewogICAgICAgIGZvciAodmFyIGRrIGluIHZhbCkgewogICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWwsIGRrKSAmJiB2YWxbZGtdICE9IG51bGwpIHsKICAgICAgICAgICAgbm9kZS5kYXRhc2V0W2RrXSA9IFN0cmluZyh2YWxbZGtdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoa2V5LmluZGV4T2YoJ2RhdGEtJykgPT09IDApIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWwpKTsKICAgICAgfSBlbHNlIGlmIChrZXkuaW5kZXhPZignYXJpYS0nKSA9PT0gMCkgewogICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGtleSwgU3RyaW5nKHZhbCkpOwogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2h0bWwnIHx8IGtleSA9PT0gJ2lubmVySFRNTCcpIHsKICAgICAgICBub2RlLmlubmVySFRNTCA9IFN0cmluZyh2YWwpOwogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3RleHQnIHx8IGtleSA9PT0gJ3RleHRDb250ZW50JykgewogICAgICAgIG5vZGUudGV4dENvbnRlbnQgPSBTdHJpbmcodmFsKTsKICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyZWYnICYmIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICByZWZGbiA9IHZhbDsKICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyb2xlJykgewogICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdyb2xlJywgU3RyaW5nKHZhbCkpOwogICAgICB9IGVsc2UgaWYgKGtleS5sZW5ndGggPiAyICYmIGtleS5zbGljZSgwLCAyKSA9PT0gJ29uJyAmJiBrZXlbMl0gPT09IGtleVsyXS50b1VwcGVyQ2FzZSgpKSB7CgogICAgICAgIHZhciBldnQgPSBrZXkuc2xpY2UoMikudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2dCwgdmFsKTsKICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJiB0eXBlb2YgdmFsWzBdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCB2YWxbMF0sIHZhbFsxXSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3ZhbHVlJyB8fCBrZXkgPT09ICdjaGVja2VkJyB8fCBrZXkgPT09ICdkaXNhYmxlZCcgfHwga2V5ID09PSAnc2VsZWN0ZWQnKSB7CgogICAgICAgIG5vZGVba2V5XSA9IHZhbDsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHsKICAgICAgICBpZiAodmFsKSBub2RlLnNldEF0dHJpYnV0ZShrZXksICcnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWwpKTsKICAgICAgfQogICAgfQogICAgaWYgKHJlZkZuKSByZWZGbihub2RlKTsKICB9CgogIGZ1bmN0aW9uIGFwcGx5U3R5bGUobm9kZSwgdmFsKSB7CiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHsKICAgICAgbm9kZS5zdHlsZS5jc3NUZXh0ID0gdmFsOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7CiAgICAgIGZvciAodmFyIHByb3AgaW4gdmFsKSB7CiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsLCBwcm9wKSkgY29udGludWU7CiAgICAgICAgdmFyIHB2ID0gdmFsW3Byb3BdOwogICAgICAgIGlmIChwdiA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICBpZiAocHJvcC5pbmRleE9mKCctLScpID09PSAwKSB7CiAgICAgICAgICBub2RlLnN0eWxlLnNldFByb3BlcnR5KHByb3AsIFN0cmluZyhwdikpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnN0eWxlW3Byb3BdID0gdHlwZW9mIHB2ID09PSAnbnVtYmVyJyA/IHB2ICsgKHVuaXRsZXNzU3R5bGVbcHJvcF0gPyAnJyA6ICdweCcpIDogU3RyaW5nKHB2KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZhciB1bml0bGVzc1N0eWxlID0gewogICAgb3BhY2l0eTogMSwgekluZGV4OiAxLCBmb250V2VpZ2h0OiAxLCBsaW5lSGVpZ2h0OiAxLCBmbGV4OiAxLCBmbGV4R3JvdzogMSwKICAgIGZsZXhTaHJpbms6IDEsIG9yZGVyOiAxLCB6b29tOiAxLCBncmlkUm93OiAxLCBncmlkQ29sdW1uOiAxLCBjb2x1bW5Db3VudDogMQogIH07CgogIGZ1bmN0aW9uIGFwcGVuZENoaWxkKG5vZGUsIGNoaWxkKSB7CiAgICBpZiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZCA9PT0gZmFsc2UgfHwgY2hpbGQgPT09IHRydWUpIHJldHVybjsKICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkLmxlbmd0aDsgaSsrKSBhcHBlbmRDaGlsZChub2RlLCBjaGlsZFtpXSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpc05vZGUoY2hpbGQpKSB7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpOwogICAgICByZXR1cm47CiAgICB9CgogICAgbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoY2hpbGQpKSk7CiAgfQoKICBmdW5jdGlvbiBpc05vZGUoeCkgewogICAgcmV0dXJuIHggJiYgdHlwZW9mIHggPT09ICdvYmplY3QnICYmIHR5cGVvZiB4Lm5vZGVUeXBlID09PSAnbnVtYmVyJzsKICB9CgogIHZhciBJQ09OUyA9IHsKCiAgICAnc3BhcmtsZXMnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTEyIDNsMS42IDQuNEwxOCA5bC00LjQgMS42TDEyIDE1bC0xLjYtNC40TDYgOWw0LjQtMS42eicgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTguNSAxNC41bC43IDEuOSAxLjkuNy0xLjkuNy0uNyAxLjktLjctMS45LTEuOS0uNyAxLjktLjd6JyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ001LjUgMTQuNWwuNTUgMS41IDEuNS41NS0xLjUuNTVMNS41IDE5bC0uNTUtMS40NS0xLjUtLjU1IDEuNS0uNTV6JyB9CiAgICBdLAogICAgJ3dhbmQnOiBbCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTUsIHkxOiA0LCB4MjogMjAsIHkyOiA5IH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTE3LjUgNi41TDUgMTknIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTE2LjUgMi4ybC41IDEuNSAxLjUuNS0xLjUuNS0uNSAxLjUtLjUtMS41LTEuNS0uNSAxLjUtLjV6JyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ00yMS40IDkuNGwuMzUgMS4xIDEuMS4zNS0xLjEuMzUtLjM1IDEuMS0uMzUtMS4xLTEuMS0uMzUgMS4xLS4zNXonIH0KICAgIF0sCiAgICAnd2FuZC1zdGFycyc6IFsKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNNSAxOUwxNiA4JyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xNCA2bDIgMicgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTggM2wuNiAxLjdMMjAuMyA1LjMgMTguNiA2IDE4IDcuNyAxNy40IDZsLTEuNy0uN0wxNy40IDQuN3onIH0sCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiAyMC41LCBjeTogMTEsIHI6IDAuOSwgZmlsbDogJ2N1cnJlbnRDb2xvcicgfSwKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDgsIGN5OiA0LCByOiAwLjksIGZpbGw6ICdjdXJyZW50Q29sb3InIH0KICAgIF0sCiAgICAnYm9sdCc6ICdNMTMgMkw0IDE0aDZsLTEgOCA5LTEyaC02bDEtOHonLAoKICAgICdwaG90byc6IFsKICAgICAgeyB0OiAncmVjdCcsIHg6IDMsIHk6IDQsIHdpZHRoOiAxOCwgaGVpZ2h0OiAxNiwgcng6IDMgfSwKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDguNSwgY3k6IDkuNSwgcjogMS42IH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTUgMThsNC41LTQuNWEyIDIgMCAwIDEgMi44IDBMMTkgMjAnIH0KICAgIF0sCiAgICAnZ3JpZCc6IFsKICAgICAgeyB0OiAncmVjdCcsIHg6IDMuNSwgeTogMy41LCB3aWR0aDogNywgaGVpZ2h0OiA3LCByeDogMS42IH0sCiAgICAgIHsgdDogJ3JlY3QnLCB4OiAxMy41LCB5OiAzLjUsIHdpZHRoOiA3LCBoZWlnaHQ6IDcsIHJ4OiAxLjYgfSwKICAgICAgeyB0OiAncmVjdCcsIHg6IDMuNSwgeTogMTMuNSwgd2lkdGg6IDcsIGhlaWdodDogNywgcng6IDEuNiB9LAogICAgICB7IHQ6ICdyZWN0JywgeDogMTMuNSwgeTogMTMuNSwgd2lkdGg6IDcsIGhlaWdodDogNywgcng6IDEuNiB9CiAgICBdLAogICAgJ2ZvbGRlcic6ICdNMyA3YTIgMiAwIDAgMSAyLTJoNGwyIDIuNGg2YTIgMiAwIDAgMSAyIDJWMThhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ6JywKICAgICdmaWxtJzogWwogICAgICB7IHQ6ICdyZWN0JywgeDogMywgeTogNC41LCB3aWR0aDogMTgsIGhlaWdodDogMTUsIHJ4OiAyLjUgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiA3LjUsIHkxOiA0LjUsIHgyOiA3LjUsIHkyOiAxOS41IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTYuNSwgeTE6IDQuNSwgeDI6IDE2LjUsIHkyOiAxOS41IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMywgeTE6IDkuMiwgeDI6IDcuNSwgeTI6IDkuMiB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDMsIHkxOiAxNC44LCB4MjogNy41LCB5MjogMTQuOCB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDE2LjUsIHkxOiA5LjIsIHgyOiAyMSwgeTI6IDkuMiB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDE2LjUsIHkxOiAxNC44LCB4MjogMjEsIHkyOiAxNC44IH0KICAgIF0sCiAgICAncGhvdG8tYmFkZ2UtcGx1cyc6IFsKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMjEgMTIuNVY3YTIgMiAwIDAgMC0yLTJINWEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoNy41JyB9LAogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogOC41LCBjeTogOS41LCByOiAxLjQgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNNSAxNi41bDQtNGExLjggMS44IDAgMCAxIDIuNSAwbDIgMicgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxOC41LCB5MTogMTUsIHgyOiAxOC41LCB5MjogMjIgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxNSwgeTE6IDE4LjUsIHgyOiAyMiwgeTI6IDE4LjUgfQogICAgXSwKCiAgICAncGx1cyc6IFsKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDUsIHgyOiAxMiwgeTI6IDE5IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogNSwgeTE6IDEyLCB4MjogMTksIHkyOiAxMiB9CiAgICBdLAogICAgJ2Fycm93LXVwJzogWwogICAgICB7IHQ6ICdsaW5lJywgeDE6IDEyLCB5MTogMjAsIHgyOiAxMiwgeTI6IDUgfSwKICAgICAgeyB0OiAncG9seWxpbmUnLCBwb2ludHM6ICc1LDEyIDEyLDUgMTksMTInIH0KICAgIF0sCiAgICAnc3F1YXJlLWFycm93LXVwJzogWwogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xNiA1aDJhMiAyIDAgMCAxIDIgMnYxMWEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTItMlY3YTIgMiAwIDAgMSAyLTJoMicgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDMsIHgyOiAxMiwgeTI6IDE0IH0sCiAgICAgIHsgdDogJ3BvbHlsaW5lJywgcG9pbnRzOiAnOC41LDYuNSAxMiwzIDE1LjUsNi41JyB9CiAgICBdLAogICAgJ2Fycm93LWRvd24tY2lyY2xlJzogWwogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTIsIGN5OiAxMiwgcjogOSB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDEyLCB5MTogNy41LCB4MjogMTIsIHkyOiAxNiB9LAogICAgICB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzguNSwxMi41IDEyLDE2IDE1LjUsMTIuNScgfQogICAgXSwKICAgICdhcnJvdy0yLWNpcmNsZXBhdGgnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTIwIDExYTggOCAwIDAgMC0xMy42LTQuNUw0IDknIH0sCiAgICAgIHsgdDogJ3BvbHlsaW5lJywgcG9pbnRzOiAnNCw0IDQsOSA5LDknIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTQgMTNhOCA4IDAgMCAwIDEzLjYgNC41TDIwIDE1JyB9LAogICAgICB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzIwLDIwIDIwLDE1IDE1LDE1JyB9CiAgICBdLAoKICAgICdoZWFydCc6ICdNMTIgMjBzLTctNC42LTkuMy05LjFDMS40IDguMyAyLjQgNS4zIDUgNC40YzEuOS0uNyAzLjkuMSA1IDEuOCAxLjEtMS43IDMuMS0yLjUgNS0xLjggMi42LjkgMy42IDMuOSAyLjMgNi41QzE5IDE1LjQgMTIgMjAgMTIgMjB6JywKICAgICdoZWFydC1maWxsJzogWwogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xMiAyMC4zcy03LjItNC43LTkuNS05LjNDMS4yIDguMiAyLjMgNSA1IDQuMWMyLS43IDQgLjIgNSAyIDEtMS44IDMtMi43IDUtMiAyLjcuOSAzLjggNC4xIDIuNSA2LjlDMTkuMiAxNS42IDEyIDIwLjMgMTIgMjAuM3onLCBmaWxsOiAnY3VycmVudENvbG9yJywgc3Ryb2tlOiAnbm9uZScgfQogICAgXSwKCiAgICAndHJhc2gnOiBbCiAgICAgIHsgdDogJ3BvbHlsaW5lJywgcG9pbnRzOiAnNCw3IDIwLDcnIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTkgN1Y1YTEuNSAxLjUgMCAwIDEgMS41LTEuNWgzQTEuNSAxLjUgMCAwIDEgMTUgNXYyJyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ002IDdsMSAxMi41QTEuNSAxLjUgMCAwIDAgOC41IDIxaDdhMS41IDEuNSAwIDAgMCAxLjUtMS41TDE4IDcnIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTAsIHkxOiAxMSwgeDI6IDEwLCB5MjogMTcgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxNCwgeTE6IDExLCB4MjogMTQsIHkyOiAxNyB9CiAgICBdLAogICAgJ3htYXJrJzogWwogICAgICB7IHQ6ICdsaW5lJywgeDE6IDYsIHkxOiA2LCB4MjogMTgsIHkyOiAxOCB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDE4LCB5MTogNiwgeDI6IDYsIHkyOiAxOCB9CiAgICBdLAoKICAgICdjaGV2cm9uLWxlZnQnOiB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzE1LDUgOCwxMiAxNSwxOScgfSwKICAgICdjaGV2cm9uLXJpZ2h0JzogeyB0OiAncG9seWxpbmUnLCBwb2ludHM6ICc5LDUgMTYsMTIgOSwxOScgfSwKICAgICdjaGV2cm9uLWRvd24nOiB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzUsOSAxMiwxNiAxOSw5JyB9LAogICAgJ2NoZXZyb24tdXAnOiB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzUsMTUgMTIsOCAxOSwxNScgfSwKCiAgICAnbWFnbmlmeWluZ2dsYXNzJzogWwogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTEsIGN5OiAxMSwgcjogNi41IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTUuOCwgeTE6IDE1LjgsIHgyOiAyMSwgeTI6IDIxIH0KICAgIF0sCiAgICAnc2xpZGVyLWhvcml6b250YWwnOiBbCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMywgeTE6IDgsIHgyOiAyMSwgeTI6IDggfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAzLCB5MTogMTYsIHgyOiAyMSwgeTI6IDE2IH0sCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiA5LCBjeTogOCwgcjogMi40LCBmaWxsOiAndmFyKC0tc3VyZmFjZSwgdHJhbnNwYXJlbnQpJyB9LAogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTUsIGN5OiAxNiwgcjogMi40LCBmaWxsOiAndmFyKC0tc3VyZmFjZSwgdHJhbnNwYXJlbnQpJyB9CiAgICBdLAoKICAgICdnZWFyJzogWwogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTIsIGN5OiAxMiwgcjogMy4yIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTEyIDIuNWwxLjEgMi40IDIuNi0uNS41IDIuNiAyLjQgMS4xLTEuMSAyLjQgMS4xIDIuNC0yLjQgMS4xLS41IDIuNi0yLjYtLjVMMTIgMjEuNWwtMS4xLTIuNC0yLjYuNS0uNS0yLjYtMi40LTEuMSAxLjEtMi40LTEuMS0yLjQgMi40LTEuMS41LTIuNiAyLjYuNXonIH0KICAgIF0sCiAgICAncGVyc29uLWNpcmNsZSc6IFsKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDEyLCBjeTogMTIsIHI6IDkgfSwKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDEyLCBjeTogMTAsIHI6IDMgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNNi41IDE4LjVhNiA2IDAgMCAxIDExIDAnIH0KICAgIF0sCiAgICAnY3Jvd24nOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTMgOGwzLjUgMy41TDEyIDVsNS41IDYuNUwyMSA4bC0xLjUgMTAuNWgtMTV6JyB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDQuNSwgeTE6IDIxLCB4MjogMTkuNSwgeTI6IDIxIH0KICAgIF0sCgogICAgJ2xpbmUtMyc6IFsKICAgICAgeyB0OiAnbGluZScsIHgxOiA0LCB5MTogNywgeDI6IDIwLCB5MjogNyB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDQsIHkxOiAxMiwgeDI6IDIwLCB5MjogMTIgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiA0LCB5MTogMTcsIHgyOiAyMCwgeTI6IDE3IH0KICAgIF0sCiAgICAnY2hlY2ttYXJrJzogeyB0OiAncG9seWxpbmUnLCBwb2ludHM6ICc1LDEyLjUgMTAsMTcuNSAxOS41LDYuNScgfSwKICAgICdwZW5jaWwnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTQgMjBsMS4yLTQuMkwxNS41IDUuNWEyIDIgMCAwIDEgMi44IDBsLjIuMmEyIDIgMCAwIDEgMCAyLjhMOC4yIDE4Ljh6JyB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDE0LCB5MTogNywgeDI6IDE3LCB5MjogMTAgfQogICAgXSwKCiAgICAnaW5mby1jaXJjbGUnOiBbCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiAxMiwgY3k6IDEyLCByOiA5IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTIsIHkxOiAxMSwgeDI6IDEyLCB5MjogMTYgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDgsIHgyOiAxMi4wMSwgeTI6IDggfQogICAgXSwKICAgICd0cmlhbmdsZS1hbGVydCc6IFsKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTAuMyAzLjkgMiAxOGEyIDIgMCAwIDAgMS43IDNoMTYuNmEyIDIgMCAwIDAgMS43LTNMMTMuNyAzLjlhMiAyIDAgMCAwLTMuNCAweicgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDksIHgyOiAxMiwgeTI6IDEzLjUgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDE3LCB4MjogMTIuMDEsIHkyOiAxNyB9CiAgICBdLAoKICAgICdib29rbWFyayc6IHsgdDogJ3BhdGgnLCBkOiAnTTYgNGExIDEgMCAwIDEgMS0xaDEwYTEgMSAwIDAgMSAxIDF2MTdsLTYtNC02IDR6JyB9LAogICAgJ2RvYy1vbi1kb2MnOiBbCiAgICAgIHsgdDogJ3JlY3QnLCB4OiA4LCB5OiA4LCB3aWR0aDogMTIsIGhlaWdodDogMTMsIHJ4OiAyIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTE2IDhWNWEyIDIgMCAwIDAtMi0ySDZhMiAyIDAgMCAwLTIgMnYxMWEyIDIgMCAwIDAgMiAyaDInIH0KICAgIF0sCiAgICAnbGluayc6IFsKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNOSAxNWw2LTYnIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTEwLjUgNy41bDEuOC0xLjhhMy41IDMuNSAwIDAgMSA1IDVsLTEuOCAxLjgnIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTEzLjUgMTYuNWwtMS44IDEuOGEzLjUgMy41IDAgMCAxLTUtNWwxLjgtMS44JyB9CiAgICBdLAogICAgJ2dpZnQnOiBbCiAgICAgIHsgdDogJ3JlY3QnLCB4OiA0LCB5OiA5LCB3aWR0aDogMTYsIGhlaWdodDogMTEsIHJ4OiAxLjUgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMy41IDloMTd2My41aC0xN3onIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTIsIHkxOiA5LCB4MjogMTIsIHkyOiAyMCB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xMiA5QzEyIDYgMTAuNSA0LjUgOC44IDQuNUEyLjMgMi4zIDAgMCAwIDguOCA5eicgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTIgOWMwLTMgMS41LTQuNSAzLjItNC41QTIuMyAyLjMgMCAwIDEgMTUuMiA5eicgfQogICAgXSwKICAgICdmbGFtZSc6IHsgdDogJ3BhdGgnLCBkOiAnTTEyIDNjMS41IDMgNC41IDQuNSA0LjUgOC41QTQuNSA0LjUgMCAwIDEgMTIgMTZhNC41IDQuNSAwIDAgMS00LjUtNC41YzAtMiAxLTMgMS44LTMuOEM5IDkgMTAgOS41IDEwLjUgMTBjLjQtMi41LS41LTQuNyAxLjUtN3onIH0sCiAgICAnbG9jayc6IFsKICAgICAgeyB0OiAncmVjdCcsIHg6IDUsIHk6IDExLCB3aWR0aDogMTQsIGhlaWdodDogOSwgcng6IDIgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNOCAxMVY4YTQgNCAwIDAgMSA4IDB2MycgfQogICAgXSwKICAgICdsb2dvdXQnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTE1IDRoMmEyIDIgMCAwIDEgMiAydjEyYTIgMiAwIDAgMS0yIDJoLTInIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogNCwgeTE6IDEyLCB4MjogMTUsIHkyOiAxMiB9LAogICAgICB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzgsOCA0LDEyIDgsMTYnIH0KICAgIF0sCiAgICAnaGVscC1jaXJjbGUnOiBbCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiAxMiwgY3k6IDEyLCByOiA5IH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTkuNSA5LjVhMi41IDIuNSAwIDEgMSAzLjQgMi4zYy0uOC40LTEuNCAxLTEuNCAyLjInIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTEuNSwgeTE6IDE3LCB4MjogMTEuNTEsIHkyOiAxNyB9CiAgICBdLAogICAgJ2VsbGlwc2lzJzogWwogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogNSwgY3k6IDEyLCByOiAxLjIsIGZpbGw6ICdjdXJyZW50Q29sb3InLCBzdHJva2U6ICdub25lJyB9LAogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTIsIGN5OiAxMiwgcjogMS4yLCBmaWxsOiAnY3VycmVudENvbG9yJywgc3Ryb2tlOiAnbm9uZScgfSwKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDE5LCBjeTogMTIsIHI6IDEuMiwgZmlsbDogJ2N1cnJlbnRDb2xvcicsIHN0cm9rZTogJ25vbmUnIH0KICAgIF0KICB9OwoKICB2YXIgQUxJQVMgPSB7CiAgICBnZW5lcmF0ZTogJ3NwYXJrbGVzJywKICAgIGxpYnJhcnk6ICdncmlkJywKICAgIGFkZDogJ3BsdXMnLAogICAgc2VuZDogJ2Fycm93LXVwJywKICAgIHNldHRpbmdzOiAnZ2VhcicsCiAgICBhY2NvdW50OiAncGVyc29uLWNpcmNsZScsCiAgICBmYXZvcml0ZTogJ2hlYXJ0JywKICAgICdmYXZvcml0ZS1maWxsJzogJ2hlYXJ0LWZpbGwnLAogICAgZGVsZXRlOiAndHJhc2gnLAogICAgc2hhcmU6ICdzcXVhcmUtYXJyb3ctdXAnLAogICAgZG93bmxvYWQ6ICdhcnJvdy1kb3duLWNpcmNsZScsCiAgICBzYXZlOiAnYXJyb3ctZG93bi1jaXJjbGUnLAogICAgY2xvc2U6ICd4bWFyaycsCiAgICBzZWFyY2g6ICdtYWduaWZ5aW5nZ2xhc3MnLAogICAgZmlsdGVyczogJ3NsaWRlci1ob3Jpem9udGFsJywKICAgIGZpbHRlcjogJ3NsaWRlci1ob3Jpem9udGFsJywKICAgIHZpZGVvOiAnZmlsbScsCiAgICBhbmltYXRlOiAnZmlsbScsCiAgICBjcmVkaXRzOiAnYm9sdCcsCiAgICBwYXl3YWxsOiAnY3Jvd24nLAogICAgaGFtYnVyZ2VyOiAnbGluZS0zJywKICAgIG1lbnU6ICdsaW5lLTMnLAogICAgY2hlY2s6ICdjaGVja21hcmsnLAogICAgZWRpdDogJ3BlbmNpbCcsCiAgICB1cGxvYWQ6ICdwaG90by1iYWRnZS1wbHVzJywKICAgIHZhcmlhdGlvbnM6ICdhcnJvdy0yLWNpcmNsZXBhdGgnLAogICAgcmVmcmVzaDogJ2Fycm93LTItY2lyY2xlcGF0aCcsCiAgICBiYWNrOiAnY2hldnJvbi1sZWZ0JywKICAgIGZvcndhcmQ6ICdjaGV2cm9uLXJpZ2h0JywKCiAgICBpbmZvOiAnaW5mby1jaXJjbGUnLAogICAgYWxlcnQ6ICd0cmlhbmdsZS1hbGVydCcsCiAgICB3YXJuaW5nOiAndHJpYW5nbGUtYWxlcnQnLAogICAgc3Bhcms6ICdzcGFya2xlcycsCiAgICBpbWFnZTogJ3Bob3RvJywKICAgICdoZWFydC5maWxsJzogJ2hlYXJ0LWZpbGwnLAogICAgaGVhcnRGaWxsOiAnaGVhcnQtZmlsbCcsCiAgICBjb3B5OiAnZG9jLW9uLWRvYycsCiAgICBtb3JlOiAnZWxsaXBzaXMnLAogICAgc29ydDogJ3NsaWRlci1ob3Jpem9udGFsJywKICAgIGNoZXZyb246ICdjaGV2cm9uLXJpZ2h0JywKICAgIGFycm93TGVmdDogJ2NoZXZyb24tbGVmdCcsCiAgICBhcnJvd1JpZ2h0OiAnY2hldnJvbi1yaWdodCcsCiAgICAnYXJyb3ctbGVmdCc6ICdjaGV2cm9uLWxlZnQnLAogICAgJ2Fycm93LXJpZ2h0JzogJ2NoZXZyb24tcmlnaHQnLAogICAgcHVibGlzaDogJ3NxdWFyZS1hcnJvdy11cCcsCiAgICBwaG90b1N0YWNrOiAnZ3JpZCcsCiAgICAncGhvdG8tc3RhY2snOiAnZ3JpZCcsCiAgICBoZWxwOiAnaGVscC1jaXJjbGUnLAogICAgcHJvZmlsZTogJ3BlcnNvbi1jaXJjbGUnCiAgfTsKCiAgdmFyIENBQ0hFID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgZnVuY3Rpb24gYnVpbGRTdmcobmFtZSkgewogICAgdmFyIHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsICdzdmcnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCAnMCAwIDI0IDI0Jyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcyNCcpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJzI0Jyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICdjdXJyZW50Q29sb3InKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICcxLjYnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lY2FwJywgJ3JvdW5kJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWpvaW4nLCAncm91bmQnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2ZvY3VzYWJsZScsICdmYWxzZScpOwogICAgc3ZnLmNsYXNzTGlzdC5hZGQoJ3YtaWNvbicpOwogICAgc3ZnLmNsYXNzTGlzdC5hZGQoJ3YtaWNvbi0tJyArIG5hbWUpOwoKICAgIHZhciBzcGVjID0gSUNPTlNbbmFtZV07CiAgICB2YXIgcGFydHMgPSB0eXBlb2Ygc3BlYyA9PT0gJ3N0cmluZycKICAgICAgPyBbeyB0OiAncGF0aCcsIGQ6IHNwZWMgfV0KICAgICAgOiAoQXJyYXkuaXNBcnJheShzcGVjKSA/IHNwZWMgOiBbc3BlY10pOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKICAgICAgc3ZnLmFwcGVuZENoaWxkKGJ1aWxkU2hhcGUocGFydHNbaV0pKTsKICAgIH0KICAgIHJldHVybiBzdmc7CiAgfQoKICBmdW5jdGlvbiBidWlsZFNoYXBlKHBhcnQpIHsKICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgcGFydC50IHx8ICdwYXRoJyk7CiAgICBmb3IgKHZhciBrIGluIHBhcnQpIHsKICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFydCwgaykgfHwgayA9PT0gJ3QnKSBjb250aW51ZTsKICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUodG9BdHRyKGspLCBTdHJpbmcocGFydFtrXSkpOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiB0b0F0dHIoaykgewogICAgcmV0dXJuIGs7CiAgfQoKICBmdW5jdGlvbiBpY29uKG5hbWUpIHsKICAgIHZhciBrZXkgPSBJQ09OU1tuYW1lXSA/IG5hbWUgOiAoQUxJQVNbbmFtZV0gfHwgbnVsbCk7CiAgICBpZiAoIWtleSkgewoKICAgICAgdmFyIGZiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgJ3N2ZycpOwogICAgICBmYi5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCAnMCAwIDI0IDI0Jyk7CiAgICAgIGZiLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMjQnKTsKICAgICAgZmIuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnMjQnKTsKICAgICAgZmIuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgIGZiLnNldEF0dHJpYnV0ZSgnZm9jdXNhYmxlJywgJ2ZhbHNlJyk7CiAgICAgIGZiLmNsYXNzTGlzdC5hZGQoJ3YtaWNvbicsICd2LWljb24tLXVua25vd24nKTsKICAgICAgdmFyIGRvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsICdjaXJjbGUnKTsKICAgICAgZG90LnNldEF0dHJpYnV0ZSgnY3gnLCAnMTInKTsKICAgICAgZG90LnNldEF0dHJpYnV0ZSgnY3knLCAnMTInKTsKICAgICAgZG90LnNldEF0dHJpYnV0ZSgncicsICcyLjQnKTsKICAgICAgZG90LnNldEF0dHJpYnV0ZSgnZmlsbCcsICdjdXJyZW50Q29sb3InKTsKICAgICAgZmIuYXBwZW5kQ2hpbGQoZG90KTsKICAgICAgaWYgKHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKCdbVi51aS5pY29uXSB1bmtub3duIGljb246JywgbmFtZSk7CiAgICAgIHJldHVybiBmYjsKICAgIH0KICAgIGlmICghQ0FDSEVba2V5XSkgQ0FDSEVba2V5XSA9IGJ1aWxkU3ZnKGtleSk7CiAgICByZXR1cm4gQ0FDSEVba2V5XS5jbG9uZU5vZGUodHJ1ZSk7CiAgfQoKICBpY29uLm5hbWVzID0gZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIE9iamVjdC5rZXlzKElDT05TKS5jb25jYXQoT2JqZWN0LmtleXMoQUxJQVMpKTsKICB9OwogIGljb24uaGFzID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgIHJldHVybiAhIShJQ09OU1tuYW1lXSB8fCBBTElBU1tuYW1lXSk7CiAgfTsKCiAgdWkuZWwgPSBlbDsKICB1aS5pY29uID0gaWNvbjsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvZmVlZC5qcyA9PT09PSAqLwooZnVuY3Rpb24gKCkgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIFYgPSB3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9OwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwoKICB2YXIgUEVSID0gMzA7CiAgdmFyIElOTElORV9ERUZBVUxUID0gMTI7CgogIHZhciBDWUNMRSA9IDUyMDA7CiAgdmFyIEZBREUgPSA5MDA7CiAgdmFyIEhPTERfQUZURVIgPSAxNDAwOwogIHZhciBTQ1JVQl9SRVNVTUUgPSAxNTAwOwogIHZhciBTQ1JVQl9USFJFU0hPTEQgPSA4OwoKICB2YXIgUFJFRklYID0gInZhbXBfd2ViX2N1cmF0aW9uXyI7CgogIHZhciBUQUdTID0gWwogICAgeyBrZXk6ICIiLCBsYWJlbDogIkFsbCIgfSwKICAgIHsga2V5OiAiaW50ZXJpb3IiLCBsYWJlbDogIkludGVyaW9ycyIgfSwKICAgIHsga2V5OiAiZXh0ZXJpb3IiLCBsYWJlbDogIkV4dGVyaW9ycyIgfSwKICAgIHsga2V5OiAic3RhZ2luZyIsIGxhYmVsOiAiU3RhZ2luZyIgfSwKICAgIHsga2V5OiAibGFuZHNjYXBpbmciLCBsYWJlbDogIkxhbmRzY2FwaW5nIiB9LAogICAgeyBrZXk6ICJhcmNoaXRlY3R1cmUiLCBsYWJlbDogIkFyY2hpdGVjdHVyZSIgfSwKICAgIHsga2V5OiAicmVhbGVzdGF0ZSIsIGxhYmVsOiAiUmVhbCBFc3RhdGUiIH0sCiAgICB7IGtleTogIm1pbmltYWxpc3QiLCBsYWJlbDogIk1pbmltYWxpc3QiIH0sCiAgICB7IGtleTogImx1eHVyeSIsIGxhYmVsOiAiTHV4dXJ5IiB9CiAgXTsKCiAgdmFyIEdSSURfU1RZTEVTID0gWwogICAgeyBrZXk6ICJhdXRvIiwgbGFiZWw6ICJBdXRvIiB9LAogICAgeyBrZXk6ICJvbmUiLCBsYWJlbDogIjEiLCBjb2xzOiAxIH0sCiAgICB7IGtleTogInR3byIsIGxhYmVsOiAiMiIsIGNvbHM6IDIgfSwKICAgIHsga2V5OiAidGhyZWUiLCBsYWJlbDogIjMiLCBjb2xzOiAzIH0sCiAgICB7IGtleTogImZvdXIiLCBsYWJlbDogIjQiLCBjb2xzOiA0IH0KICBdOwoKICB2YXIgQ0VMTF9NT0RFUyA9IFsKICAgIHsga2V5OiAiY3Jvc3NmYWRlIiwgbGFiZWw6ICJDcm9zc2ZhZGUiIH0sCiAgICB7IGtleTogImFmdGVyT25seSIsIGxhYmVsOiAiQWZ0ZXIgb25seSIgfSwKICAgIHsga2V5OiAic2NydWIiLCBsYWJlbDogIk1hbnVhbCBzY3J1YiIgfQogIF07CgogIHZhciBFRkZFQ1RTID0gWwogICAgeyBrZXk6ICJjcm9zc2ZhZGUiLCBsYWJlbDogIkNyb3NzZmFkZSIgfSwKICAgIHsga2V5OiAibHVtYUZhZGUiLCBsYWJlbDogIkx1bWEgRmFkZSIgfSwKICAgIHsga2V5OiAia2FsZWlkb3Njb3BlIiwgbGFiZWw6ICJLYWxlaWRvc2NvcGUiIH0sCiAgICB7IGtleTogImJsb29tRGlzc29sdmUiLCBsYWJlbDogIkJsb29tIERpc3NvbHZlIiB9LAogICAgeyBrZXk6ICJkaXNwbGFjZW1lbnQiLCBsYWJlbDogIkRpc3BsYWNlbWVudCIgfSwKICAgIHsga2V5OiAidm9ydGV4IiwgbGFiZWw6ICJWb3J0ZXgiIH0sCiAgICB7IGtleTogInpvb21CbHVyIiwgbGFiZWw6ICJab29tIEJsdXIiIH0sCiAgICB7IGtleTogImNyeXN0YWxsaXplIiwgbGFiZWw6ICJDcnlzdGFsbGl6ZSIgfSwKICAgIHsga2V5OiAiaHVlU2hpZnRTd2VlcCIsIGxhYmVsOiAiSHVlIFNoaWZ0IFN3ZWVwIiB9LAogICAgeyBrZXk6ICJwc3ljaGVkZWxpY0NvbWJvIiwgbGFiZWw6ICJQc3ljaGVkZWxpYyBDb21ibyIgfQogIF07CgogIHZhciBERUZBVUxUX1BSRUZTID0gewogICAgZ3JpZFN0eWxlOiAiYXV0byIsCiAgICBjZWxsTW9kZTogImNyb3NzZmFkZSIsCiAgICBlZmZlY3Q6ICJjcm9zc2ZhZGUiLAogICAgc3BlZWQ6IDEuMAogIH07CgogIGZ1bmN0aW9uIHJlZHVjZWRNb3Rpb24oKSB7CiAgICByZXR1cm4gISEod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIikubWF0Y2hlcyk7CiAgfQoKICBmdW5jdGlvbiBwcmVmR2V0KGtleSwgZmFsbGJhY2spIHsKICAgIHRyeSB7CiAgICAgIHZhciByYXcgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oUFJFRklYICsga2V5KTsKICAgICAgaWYgKHJhdyA9PSBudWxsKSByZXR1cm4gZmFsbGJhY2s7CiAgICAgIHJldHVybiBKU09OLnBhcnNlKHJhdyk7CiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxsYmFjazsgfQogIH0KCiAgZnVuY3Rpb24gcHJlZlNldChrZXksIHZhbCkgewogICAgdHJ5IHsgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFBSRUZJWCArIGtleSwgSlNPTi5zdHJpbmdpZnkodmFsKSk7IH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiBsb2FkUHJlZnMoKSB7CiAgICB2YXIgb3V0ID0gewogICAgICBncmlkU3R5bGU6IHByZWZHZXQoImdyaWRTdHlsZSIsIERFRkFVTFRfUFJFRlMuZ3JpZFN0eWxlKSwKICAgICAgY2VsbE1vZGU6IHByZWZHZXQoImNlbGxNb2RlIiwgREVGQVVMVF9QUkVGUy5jZWxsTW9kZSksCiAgICAgIGVmZmVjdDogcHJlZkdldCgiZWZmZWN0IiwgREVGQVVMVF9QUkVGUy5lZmZlY3QpLAogICAgICBzcGVlZDogcHJlZkdldCgic3BlZWQiLCBERUZBVUxUX1BSRUZTLnNwZWVkKQogICAgfTsKICAgIGlmICghR1JJRF9TVFlMRVMuc29tZShmdW5jdGlvbiAoZykgeyByZXR1cm4gZy5rZXkgPT09IG91dC5ncmlkU3R5bGU7IH0pKSBvdXQuZ3JpZFN0eWxlID0gREVGQVVMVF9QUkVGUy5ncmlkU3R5bGU7CiAgICBpZiAoIUNFTExfTU9ERVMuc29tZShmdW5jdGlvbiAoYykgeyByZXR1cm4gYy5rZXkgPT09IG91dC5jZWxsTW9kZTsgfSkpIG91dC5jZWxsTW9kZSA9IERFRkFVTFRfUFJFRlMuY2VsbE1vZGU7CiAgICBpZiAoIUVGRkVDVFMuc29tZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5rZXkgPT09IG91dC5lZmZlY3Q7IH0pKSBvdXQuZWZmZWN0ID0gREVGQVVMVF9QUkVGUy5lZmZlY3Q7CiAgICBvdXQuc3BlZWQgPSBjbGFtcE51bShvdXQuc3BlZWQsIDAuMjUsIDMuMCwgMS4wKTsKICAgIHJldHVybiBvdXQ7CiAgfQoKICBmdW5jdGlvbiBjbGFtcE51bShuLCBsbywgaGksIGZhbGxiYWNrKSB7CiAgICBuID0gTnVtYmVyKG4pOwogICAgaWYgKCFpc0Zpbml0ZShuKSkgcmV0dXJuIGZhbGxiYWNrOwogICAgcmV0dXJuIE1hdGgubWluKGhpLCBNYXRoLm1heChsbywgbikpOwogIH0KCiAgZnVuY3Rpb24gY2xhbXAwMShuKSB7CiAgICByZXR1cm4gbiA8IDAgPyAwIDogKG4gPiAxID8gMSA6IG4pOwogIH0KCiAgZnVuY3Rpb24gZWwodGFnLCBhdHRycywgY2hpbGRyZW4pIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAiZnVuY3Rpb24iKSByZXR1cm4gVi51aS5lbCh0YWcsIGF0dHJzLCBjaGlsZHJlbik7CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIGlmIChhdHRycykgewogICAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICAgIHZhciB2YWwgPSBhdHRyc1trXTsKICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgIGlmIChrID09PSAiY2xhc3MiIHx8IGsgPT09ICJjbGFzc05hbWUiKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAidGV4dCIpIG5vZGUudGV4dENvbnRlbnQgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gImh0bWwiKSBub2RlLmlubmVySFRNTCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoIm9uIikgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGsuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgdmFsKTsKICAgICAgICB9IGVsc2UgaWYgKGsuaW5kZXhPZigiZGF0YS0iKSA9PT0gMCB8fCBrLmluZGV4T2YoImFyaWEtIikgPT09IDApIHsKICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICAgICAgfSBlbHNlIGlmIChrIGluIG5vZGUpIHsKICAgICAgICAgIHRyeSB7IG5vZGVba10gPSB2YWw7IH0gY2F0Y2ggKGUpIHsgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdmFsKTsgfQogICAgICAgIH0gZWxzZSBub2RlLnNldEF0dHJpYnV0ZShrLCB2YWwpOwogICAgICB9KTsKICAgIH0KICAgIGFwcGVuZENoaWxkcmVuKG5vZGUsIGNoaWxkcmVuKTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gYXBwZW5kQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW4pIHsKICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKSByZXR1cm47CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSBjaGlsZHJlbiA9IFtjaGlsZHJlbl07CiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjID09IG51bGwgfHwgYyA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgaWYgKHR5cGVvZiBjID09PSAic3RyaW5nIiB8fCB0eXBlb2YgYyA9PT0gIm51bWJlciIpIHsKICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjKSkpOwogICAgICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBOb2RlKSB7CiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChjKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICBpZiAoVi5yb3V0ZXIgJiYgdHlwZW9mIFYucm91dGVyLmdvID09PSAiZnVuY3Rpb24iKSBWLnJvdXRlci5nbyhoYXNoKTsKICAgIGVsc2UgbG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiB0b2FzdChtc2csIGtpbmQpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnRvYXN0ID09PSAiZnVuY3Rpb24iKSBWLnVpLnRvYXN0KG1zZywga2luZCB8fCAiaW5mbyIpOwogICAgZWxzZSBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5lbWl0ID09PSAiZnVuY3Rpb24iKSBWLnN0b3JlLmVtaXQoInRvYXN0IiwgeyBtZXNzYWdlOiBtc2csIGtpbmQ6IGtpbmQgfSk7CiAgfQoKICBmdW5jdGlvbiBkZWJvdW5jZShmbiwgbXMpIHsKICAgIGlmIChWLnV0aWwgJiYgdHlwZW9mIFYudXRpbC5kZWJvdW5jZSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIFYudXRpbC5kZWJvdW5jZShmbiwgbXMpOwogICAgdmFyIHQ7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgY3R4ID0gdGhpcywgYSA9IGFyZ3VtZW50czsKICAgICAgY2xlYXJUaW1lb3V0KHQpOwogICAgICB0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGZuLmFwcGx5KGN0eCwgYSk7IH0sIG1zKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBpbWFnZU9mKGl0ZW0pIHsKICAgIHJldHVybiAoaXRlbSAmJiAoaXRlbS5nZW5lcmF0ZWRJbWFnZSB8fCBpdGVtLmltYWdlKSkgfHwgaXRlbSB8fCB7fTsKICB9CgogIGZ1bmN0aW9uIHByb2ZpbGVPZihpdGVtKSB7CiAgICByZXR1cm4gKGl0ZW0gJiYgaXRlbS5wcm9maWxlKSB8fCAoaXRlbSAmJiBpdGVtLmdlbmVyYXRlZEltYWdlICYmIGl0ZW0uZ2VuZXJhdGVkSW1hZ2UucHJvZmlsZSkgfHwgbnVsbDsKICB9CgogIGZ1bmN0aW9uIGFmdGVyVVJMKGdpKSB7CiAgICByZXR1cm4gZ2kucmVtb3RlSW1hZ2VVUkwgfHwgZ2kucmVtb3RlSW1hZ2VVcmwgfHwgZ2kuaW1hZ2VVUkwgfHwgZ2kudXJsIHx8ICIiOwogIH0KCiAgZnVuY3Rpb24gYmVmb3JlVVJMKGdpKSB7CiAgICByZXR1cm4gZ2kucmVtb3RlT3JpZ2luYWxJbWFnZVVSTCB8fCBnaS5yZW1vdGVPcmlnaW5hbEltYWdlVXJsIHx8IGdpLm9yaWdpbmFsSW1hZ2VVUkwgfHwgIiI7CiAgfQoKICBmdW5jdGlvbiBhc3BlY3RPZihnaSkgewogICAgdmFyIHcgPSBnaS53aWR0aCB8fCBnaS5pbWFnZVdpZHRoIHx8IChnaS5pbWFnZV9zaXplICYmIGdpLmltYWdlX3NpemUud2lkdGgpOwogICAgdmFyIGggPSBnaS5oZWlnaHQgfHwgZ2kuaW1hZ2VIZWlnaHQgfHwgKGdpLmltYWdlX3NpemUgJiYgZ2kuaW1hZ2Vfc2l6ZS5oZWlnaHQpOwogICAgaWYgKHcgJiYgaCAmJiBoID4gMCkgcmV0dXJuIHcgLyBoOwogICAgaWYgKHR5cGVvZiBnaS5hc3BlY3RSYXRpbyA9PT0gIm51bWJlciIgJiYgZ2kuYXNwZWN0UmF0aW8gPiAwKSByZXR1cm4gZ2kuYXNwZWN0UmF0aW87CiAgICByZXR1cm4gMC43NTsKICB9CgogIGZ1bmN0aW9uIGFwcGx5RXhhbXBsZVRvQ3JlYXRvcihpdGVtLCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBnaSA9IGltYWdlT2YoaXRlbSk7CiAgICB2YXIgcHJvZmlsZSA9IHByb2ZpbGVPZihpdGVtKTsKICAgIHZhciBwcm9tcHQgPSBnaS5wcm9tcHQgfHwgIiI7CiAgICB2YXIgbW9kZWwgPSBnaS5tb2RlbCB8fCBudWxsOwogICAgdmFyIHJlZmVyZW5jZVVSTCA9IG9wdHMuYXNSZWZlcmVuY2UgPyBhZnRlclVSTChnaSkgOiBudWxsOwoKICAgIHZhciBwYXlsb2FkID0gewogICAgICBnZW5lcmF0ZWRJbWFnZTogZ2ksCiAgICAgIHByb2ZpbGU6IHByb2ZpbGUsCiAgICAgIHByb21wdDogcHJvbXB0LAogICAgICBtb2RlbDogbW9kZWwsCiAgICAgIHJlZmVyZW5jZVVSTDogcmVmZXJlbmNlVVJMLAogICAgICBzb3VyY2U6ICJpbnNwaXJhdGlvbiIKICAgIH07CgogICAgaWYgKHR5cGVvZiBvcHRzLm9uQXBwbHkgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgdHJ5IHsgb3B0cy5vbkFwcGx5KHBheWxvYWQpOyByZXR1cm47IH0gY2F0Y2ggKGUpIHt9CiAgICB9CgogICAgaWYgKFYudmlld3MgJiYgVi52aWV3cy5jcmVhdGUgJiYgdHlwZW9mIFYudmlld3MuY3JlYXRlLmFwcGx5RXhhbXBsZSA9PT0gImZ1bmN0aW9uIikgewogICAgICB0cnkgewogICAgICAgIFYudmlld3MuY3JlYXRlLmFwcGx5RXhhbXBsZShwYXlsb2FkKTsKICAgICAgICBpZiAobG9jYXRpb24uaGFzaC5pbmRleE9mKCIjL2NyZWF0ZSIpICE9PSAwKSB7CiAgICAgICAgICB2YXIgcSA9ICIjL2NyZWF0ZT9wcm9tcHQ9IiArIGVuY29kZVVSSUNvbXBvbmVudChwcm9tcHQpOwogICAgICAgICAgaWYgKG1vZGVsKSBxICs9ICImbW9kZWw9IiArIGVuY29kZVVSSUNvbXBvbmVudChtb2RlbCk7CiAgICAgICAgICBnbyhxKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9IGNhdGNoIChlKSB7fQogICAgfQoKICAgIHZhciBoYXNoID0gIiMvY3JlYXRlP3Byb21wdD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHByb21wdCk7CiAgICBpZiAobW9kZWwpIGhhc2ggKz0gIiZtb2RlbD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KG1vZGVsKTsKICAgIGdvKGhhc2gpOwogIH0KCiAgdmFyIGxvb3BSdW5uaW5nID0gZmFsc2U7CiAgdmFyIGFjdGl2ZVN0YXRlcyA9IFtdOwogIHZhciBwYXVzZWRBdCA9IDA7CiAgdmFyIHZpc2liaWxpdHlCb3VuZCA9IGZhbHNlOwogIHZhciBkb2NDbGFzc09ic2VydmVyID0gbnVsbDsKCiAgZnVuY3Rpb24gZmVlZEFjdGl2ZSgpIHsKICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmhpZGRlbikgcmV0dXJuIGZhbHNlOwogICAgdmFyIGRlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgaWYgKGRlICYmIGRlLmNsYXNzTGlzdCAmJiAoZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2LWhhcy1vdmVybGF5IikgfHwgZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2LWRyYXdlci1vcGVuIikpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIGJpbmRWaXNpYmlsaXR5KCkgewogICAgaWYgKHZpc2liaWxpdHlCb3VuZCkgcmV0dXJuOwogICAgdmlzaWJpbGl0eUJvdW5kID0gdHJ1ZTsKICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsIG1heWJlUmVzdW1lKTsKICAgIH0KICAgIGlmICh0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7CiAgICAgIGRvY0NsYXNzT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtYXliZVJlc3VtZSk7CiAgICAgIGRvY0NsYXNzT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbImNsYXNzIl0gfSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtYXliZVJlc3VtZSgpIHsKICAgIGlmICghbG9vcFJ1bm5pbmcgJiYgYWN0aXZlU3RhdGVzLmxlbmd0aCAmJiBmZWVkQWN0aXZlKCkpIHN0YXJ0TG9vcCgpOwogIH0KCiAgZnVuY3Rpb24gc3RhcnRMb29wKCkgewogICAgaWYgKGxvb3BSdW5uaW5nKSByZXR1cm47CiAgICBiaW5kVmlzaWJpbGl0eSgpOwogICAgbG9vcFJ1bm5pbmcgPSB0cnVlOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spOwogIH0KCiAgZnVuY3Rpb24gdGljaygpIHsKICAgIGlmICghYWN0aXZlU3RhdGVzLmxlbmd0aCkgewogICAgICBsb29wUnVubmluZyA9IGZhbHNlOwogICAgICBwYXVzZWRBdCA9IDA7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghZmVlZEFjdGl2ZSgpKSB7CiAgICAgIGxvb3BSdW5uaW5nID0gZmFsc2U7CiAgICAgIHBhdXNlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHBhdXNlZEF0KSB7CiAgICAgIHZhciBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHBhdXNlZEF0OwogICAgICBwYXVzZWRBdCA9IDA7CiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYWN0aXZlU3RhdGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgdmFyIHN0ID0gYWN0aXZlU3RhdGVzW2pdOwogICAgICAgIGlmIChzdCAmJiAhc3Quc2NydWJiaW5nKSBzdC50MCArPSBlbGFwc2VkOwogICAgICB9CiAgICB9CiAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTsKICAgIHZhciBtb3Rpb24gPSAhcmVkdWNlZE1vdGlvbigpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhY3RpdmVTdGF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHMgPSBhY3RpdmVTdGF0ZXNbaV07CiAgICAgIGlmIChzLmRlc3Ryb3llZCB8fCBzLnNjcnViYmluZyB8fCBzLm1vZGUgPT09ICJhZnRlck9ubHkiIHx8IHMubW9kZSA9PT0gInNjcnViIikgY29udGludWU7CiAgICAgIGlmICghbW90aW9uKSB7IHMuYmVmb3JlLnN0eWxlLm9wYWNpdHkgPSAiMSI7IGNvbnRpbnVlOyB9CiAgICAgIHZhciBvcCA9IGN5Y2xlT3BhY2l0eSgobm93IC0gcy50MCkgKiBzLnNwZWVkKTsKICAgICAgcy5iZWZvcmUuc3R5bGUub3BhY2l0eSA9IG9wLnRvRml4ZWQoMyk7CiAgICB9CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7CiAgfQoKICBmdW5jdGlvbiBjeWNsZU9wYWNpdHkodCkgewogICAgdmFyIHAgPSB0ICUgQ1lDTEU7CiAgICBpZiAocCA8IEZBREUpIHJldHVybiAxIC0gKHAgLyBGQURFKTsKICAgIHAgLT0gRkFERTsKICAgIGlmIChwIDwgSE9MRF9BRlRFUikgcmV0dXJuIDA7CiAgICBwIC09IEhPTERfQUZURVI7CiAgICBpZiAocCA8IEZBREUpIHJldHVybiBwIC8gRkFERTsKICAgIHJldHVybiAxOwogIH0KCiAgZnVuY3Rpb24gcmVnaXN0ZXJTdGF0ZShzdGF0ZSkgewogICAgYWN0aXZlU3RhdGVzLnB1c2goc3RhdGUpOwogICAgc3RhcnRMb29wKCk7CiAgfQoKICBmdW5jdGlvbiB1bnJlZ2lzdGVyU3RhdGVzKHN0YXRlcykgewogICAgaWYgKCFzdGF0ZXMgfHwgIXN0YXRlcy5sZW5ndGgpIHJldHVybjsKICAgIHZhciBzZXQgPSB7fTsKICAgIHN0YXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7IHMuZGVzdHJveWVkID0gdHJ1ZTsgfSk7CiAgICBmb3IgKHZhciBpID0gYWN0aXZlU3RhdGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGlmIChhY3RpdmVTdGF0ZXNbaV0uZGVzdHJveWVkKSBhY3RpdmVTdGF0ZXMuc3BsaWNlKGksIDEpOwogICAgfQogICAgdm9pZCBzZXQ7CiAgfQoKICBmdW5jdGlvbiBidWlsZENhcmQoaXRlbSwgcHJlZnMsIGN0cmwpIHsKICAgIHZhciBnaSA9IGltYWdlT2YoaXRlbSk7CiAgICB2YXIgYWZ0ZXIgPSBhZnRlclVSTChnaSk7CiAgICB2YXIgYmVmb3JlID0gYmVmb3JlVVJMKGdpKTsKICAgIHZhciBoYXNCZWZvcmVBZnRlciA9ICEhKGJlZm9yZSAmJiBhZnRlciAmJiBiZWZvcmUgIT09IGFmdGVyKTsKICAgIHZhciBhbHQgPSBnaS5oaWRlUHJvbXB0ID8gIkluc3BpcmF0aW9uIiA6IChnaS5wcm9tcHQgfHwgIkluc3BpcmF0aW9uIik7CgogICAgdmFyIGNhcmQgPSBlbCgiZGl2IiwgewogICAgICBjbGFzczogInZjYXJkIiwKICAgICAgcm9sZTogImxpc3RpdGVtIiwKICAgICAgdGFiaW5kZXg6ICIwIiwKICAgICAgImFyaWEtbGFiZWwiOiBnaS5wcm9tcHQgPyAoIkluc3BpcmF0aW9uOiAiICsgdHJ1bmNhdGUoZ2kucHJvbXB0LCA4MCkpIDogIkluc3BpcmF0aW9uIiwKICAgICAgImRhdGEtcmVtb3RlLWlkIjogZ2kucmVtb3RlSUQgfHwgZ2kuaWQgfHwgIiIKICAgIH0pOwoKICAgIHZhciBhZnRlckltZyA9IGVsKCJpbWciLCB7CiAgICAgIGNsYXNzOiAidmFmdGVyIiwKICAgICAgc3JjOiBhZnRlciB8fCBiZWZvcmUsCiAgICAgIGFsdDogYWx0LAogICAgICBsb2FkaW5nOiAibGF6eSIsCiAgICAgIGRlY29kaW5nOiAiYXN5bmMiCiAgICB9KTsKICAgIG1hcmtCcm9rZW5PbkVycm9yKGFmdGVySW1nLCBjYXJkKTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoYWZ0ZXJJbWcpOwoKICAgIHZhciBzdGF0ZSA9IG51bGw7CgogICAgaWYgKGhhc0JlZm9yZUFmdGVyKSB7CiAgICAgIHZhciBtb2RlID0gcHJlZnMuY2VsbE1vZGU7CiAgICAgIHZhciBiZWZvcmVJbWcgPSBlbCgiaW1nIiwgewogICAgICAgIGNsYXNzOiAidmJlZm9yZSIsCiAgICAgICAgc3JjOiBiZWZvcmUsCiAgICAgICAgYWx0OiAiQmVmb3JlIiwKICAgICAgICBsb2FkaW5nOiAibGF6eSIsCiAgICAgICAgZGVjb2Rpbmc6ICJhc3luYyIKICAgICAgfSk7CiAgICAgIG1hcmtCcm9rZW5PbkVycm9yKGJlZm9yZUltZywgY2FyZCk7CiAgICAgIHZhciBzY3J1YiA9IGVsKCJzcGFuIiwgeyBjbGFzczogInZzY3J1YiIsICJhcmlhLWhpZGRlbiI6ICJ0cnVlIiB9KTsKICAgICAgY2FyZC5hcHBlbmRDaGlsZChiZWZvcmVJbWcpOwogICAgICBjYXJkLmFwcGVuZENoaWxkKHNjcnViKTsKICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoImRhdGEtZWZmZWN0IiwgcHJlZnMuZWZmZWN0KTsKICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoImRhdGEtbW9kZSIsIG1vZGUpOwoKICAgICAgaWYgKG1vZGUgPT09ICJhZnRlck9ubHkiKSB7CiAgICAgICAgYmVmb3JlSW1nLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gInNjcnViIikgewogICAgICAgIGJlZm9yZUltZy5zdHlsZS5vcGFjaXR5ID0gIjAuNSI7CiAgICAgICAgc2NydWIuc3R5bGUubGVmdCA9ICI1MCUiOwogICAgICB9IGVsc2UgewogICAgICAgIGJlZm9yZUltZy5zdHlsZS5vcGFjaXR5ID0gIjEiOwogICAgICB9CgogICAgICBzdGF0ZSA9IHsKICAgICAgICBjYXJkOiBjYXJkLAogICAgICAgIGJlZm9yZTogYmVmb3JlSW1nLAogICAgICAgIHNjcnViOiBzY3J1YiwKICAgICAgICBtb2RlOiBtb2RlLAogICAgICAgIHNwZWVkOiBwcmVmcy5zcGVlZCwKICAgICAgICB0MDogRGF0ZS5ub3coKSAtIE1hdGgucmFuZG9tKCkgKiA0MDAwLAogICAgICAgIHNjcnViYmluZzogZmFsc2UsCiAgICAgICAgc2NydWJQb3M6IDAuNSwKICAgICAgICByZXN1bWVUaW1lcjogbnVsbCwKICAgICAgICBkZXN0cm95ZWQ6IGZhbHNlCiAgICAgIH07CiAgICAgIGF0dGFjaFNjcnViKGNhcmQsIHN0YXRlKTsKICAgICAgcmVnaXN0ZXJTdGF0ZShzdGF0ZSk7CiAgICB9IGVsc2UgewogICAgICBjYXJkLnNldEF0dHJpYnV0ZSgiZGF0YS1tb2RlIiwgImFmdGVyT25seSIpOwogICAgfQoKICAgIGJpbmRUYXAoY2FyZCwgaXRlbSwgY3RybCk7CiAgICBpZiAoY3RybCkgY3RybC5zdGF0ZXMucHVzaChzdGF0ZSk7CiAgICByZXR1cm4gY2FyZDsKICB9CgogIGZ1bmN0aW9uIGJpbmRUYXAoY2FyZCwgaXRlbSwgY3RybCkgewogICAgdmFyIGRvd25YID0gMCwgZG93blkgPSAwLCBtb3ZlZCA9IGZhbHNlLCBkb3duID0gZmFsc2U7CiAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgZG93biA9IHRydWU7IG1vdmVkID0gZmFsc2U7CiAgICAgIGRvd25YID0gZS5jbGllbnRYOyBkb3duWSA9IGUuY2xpZW50WTsKICAgIH0pOwogICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmICghZG93bikgcmV0dXJuOwogICAgICBpZiAoTWF0aC5hYnMoZS5jbGllbnRYIC0gZG93blgpID4gU0NSVUJfVEhSRVNIT0xEIHx8IE1hdGguYWJzKGUuY2xpZW50WSAtIGRvd25ZKSA+IFNDUlVCX1RIUkVTSE9MRCkgbW92ZWQgPSB0cnVlOwogICAgfSk7CiAgICBmdW5jdGlvbiByZWxlYXNlKGUpIHsKICAgICAgaWYgKCFkb3duKSByZXR1cm47CiAgICAgIGRvd24gPSBmYWxzZTsKICAgICAgaWYgKG1vdmVkIHx8IGNhcmQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzY3J1YmJpbmciKSkgcmV0dXJuOwogICAgICB2YXIgb25BcHBseSA9IGN0cmwgPyBjdHJsLm9uQXBwbHkgOiBudWxsOwogICAgICBhcHBseUV4YW1wbGVUb0NyZWF0b3IoaXRlbSwgeyBvbkFwcGx5OiBvbkFwcGx5IH0pOwogICAgfQogICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCByZWxlYXNlKTsKICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChlLmtleSA9PT0gIkVudGVyIiB8fCBlLmtleSA9PT0gIiAiKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGFwcGx5RXhhbXBsZVRvQ3JlYXRvcihpdGVtLCB7IG9uQXBwbHk6IGN0cmwgPyBjdHJsLm9uQXBwbHkgOiBudWxsIH0pOwogICAgICB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGF0dGFjaFNjcnViKGNhcmQsIHN0YXRlKSB7CiAgICB2YXIgc3RhcnRYID0gMCwgc3RhcnRZID0gMCwgYWN0aXZlID0gZmFsc2UsIGRlY2lkZWQgPSBmYWxzZSwgZHJhZ2dpbmcgPSBmYWxzZSwgcGlkID0gbnVsbDsKCiAgICBmdW5jdGlvbiBzZXRTY3J1YihjbGllbnRYKSB7CiAgICAgIHZhciByZWN0ID0gY2FyZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgaWYgKHJlY3Qud2lkdGggPD0gMCkgcmV0dXJuOwogICAgICB2YXIgcG9zID0gY2xhbXAwMSgoY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKTsKICAgICAgc3RhdGUuc2NydWJQb3MgPSBwb3M7CiAgICAgIHN0YXRlLmJlZm9yZS5zdHlsZS5vcGFjaXR5ID0gKDEgLSBwb3MpLnRvRml4ZWQoMyk7CiAgICAgIHN0YXRlLnNjcnViLnN0eWxlLmxlZnQgPSAocG9zICogMTAwKSArICIlIjsKICAgIH0KCiAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKGUucG9pbnRlclR5cGUgPT09ICJtb3VzZSIgJiYgZS5idXR0b24gIT09IDApIHJldHVybjsKICAgICAgYWN0aXZlID0gdHJ1ZTsgZGVjaWRlZCA9IGZhbHNlOyBkcmFnZ2luZyA9IGZhbHNlOwogICAgICBzdGFydFggPSBlLmNsaWVudFg7IHN0YXJ0WSA9IGUuY2xpZW50WTsKICAgICAgcGlkID0gZS5wb2ludGVySWQ7CiAgICB9KTsKCiAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKCFhY3RpdmUpIHJldHVybjsKICAgICAgdmFyIGR4ID0gZS5jbGllbnRYIC0gc3RhcnRYOwogICAgICB2YXIgZHkgPSBlLmNsaWVudFkgLSBzdGFydFk7CiAgICAgIGlmICghZGVjaWRlZCkgewogICAgICAgIGlmIChNYXRoLmFicyhkeCkgPCBTQ1JVQl9USFJFU0hPTEQgJiYgTWF0aC5hYnMoZHkpIDwgU0NSVUJfVEhSRVNIT0xEKSByZXR1cm47CiAgICAgICAgZGVjaWRlZCA9IHRydWU7CiAgICAgICAgZHJhZ2dpbmcgPSBNYXRoLmFicyhkeCkgPiBNYXRoLmFicyhkeSk7CiAgICAgICAgaWYgKGRyYWdnaW5nKSB7CiAgICAgICAgICBzdGF0ZS5zY3J1YmJpbmcgPSB0cnVlOwogICAgICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCJzY3J1YmJpbmciKTsKICAgICAgICAgIGlmIChzdGF0ZS5yZXN1bWVUaW1lcikgeyBjbGVhclRpbWVvdXQoc3RhdGUucmVzdW1lVGltZXIpOyBzdGF0ZS5yZXN1bWVUaW1lciA9IG51bGw7IH0KICAgICAgICAgIHRyeSB7IGNhcmQuc2V0UG9pbnRlckNhcHR1cmUocGlkKTsgfSBjYXRjaCAoZXJyKSB7fQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZHJhZ2dpbmcpIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgc2V0U2NydWIoZS5jbGllbnRYKTsKICAgICAgfQogICAgfSk7CgogICAgZnVuY3Rpb24gZW5kKCkgewogICAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuOwogICAgICBhY3RpdmUgPSBmYWxzZTsKICAgICAgaWYgKGRyYWdnaW5nKSB7CiAgICAgICAgdHJ5IHsgY2FyZC5yZWxlYXNlUG9pbnRlckNhcHR1cmUocGlkKTsgfSBjYXRjaCAoZXJyKSB7fQogICAgICAgIHNjaGVkdWxlUmVzdW1lKCk7CiAgICAgIH0KICAgICAgZHJhZ2dpbmcgPSBmYWxzZTsgZGVjaWRlZCA9IGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmVzdW1lKCkgewogICAgICBpZiAoc3RhdGUucmVzdW1lVGltZXIpIGNsZWFyVGltZW91dChzdGF0ZS5yZXN1bWVUaW1lcik7CiAgICAgIHN0YXRlLnJlc3VtZVRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgY2FyZC5jbGFzc0xpc3QucmVtb3ZlKCJzY3J1YmJpbmciKTsKICAgICAgICBzdGF0ZS5zY3J1YmJpbmcgPSBmYWxzZTsKICAgICAgICBzdGF0ZS50MCA9IERhdGUubm93KCk7CiAgICAgICAgc3RhdGUuYmVmb3JlLnN0eWxlLm9wYWNpdHkgPSAiMSI7CiAgICAgIH0sIFNDUlVCX1JFU1VNRSk7CiAgICB9CgogICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBlbmQpOwogICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyY2FuY2VsIiwgZW5kKTsKICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigibG9zdHBvaW50ZXJjYXB0dXJlIiwgZnVuY3Rpb24gKCkgewogICAgICBpZiAoZHJhZ2dpbmcpIHsgYWN0aXZlID0gZmFsc2U7IGRyYWdnaW5nID0gZmFsc2U7IGRlY2lkZWQgPSBmYWxzZTsgc2NoZWR1bGVSZXN1bWUoKTsgfQogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBtYXJrQnJva2VuT25FcnJvcihpbWcsIGNhcmQpIHsKICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsIGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGltZy5jbGFzc0xpc3QuY29udGFpbnMoInZhZnRlciIpKSB7CiAgICAgICAgdmFyIGZhbGxiYWNrID0gY2FyZC5xdWVyeVNlbGVjdG9yKCIudmJlZm9yZSIpOwogICAgICAgIHZhciBmYlNyYyA9IGZhbGxiYWNrICYmIGZhbGxiYWNrLmdldEF0dHJpYnV0ZSgic3JjIik7CiAgICAgICAgaWYgKGZiU3JjICYmIGZiU3JjICE9PSBpbWcuZ2V0QXR0cmlidXRlKCJzcmMiKSAmJiAhaW1nLmRhdGFzZXQuZmVsbEJhY2spIHsKICAgICAgICAgIGltZy5kYXRhc2V0LmZlbGxCYWNrID0gIjEiOwogICAgICAgICAgaW1nLnNyYyA9IGZiU3JjOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpbWcuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCJ2Y2FyZC0tYnJva2VuIik7CiAgICB9LCB7IG9uY2U6IGZhbHNlIH0pOwogIH0KCiAgZnVuY3Rpb24gdHJ1bmNhdGUocywgbikgewogICAgcyA9IFN0cmluZyhzIHx8ICIiKTsKICAgIHJldHVybiBzLmxlbmd0aCA+IG4gPyBzLnNsaWNlKDAsIG4gLSAxKS50cmltRW5kKCkgKyAi4oCmIiA6IHM7CiAgfQoKICBmdW5jdGlvbiBDb2x1bW5MYXlvdXQocm9vdCwgY29sQ291bnQpIHsKICAgIHRoaXMucm9vdCA9IHJvb3Q7CiAgICB0aGlzLmNvbHMgPSBbXTsKICAgIHRoaXMuY29sSCA9IFtdOwogICAgdGhpcy5ub2RlcyA9IFtdOwogICAgdGhpcy5zZXRDb2x1bW5zKGNvbENvdW50KTsKICB9CiAgQ29sdW1uTGF5b3V0LnByb3RvdHlwZS5zZXRDb2x1bW5zID0gZnVuY3Rpb24gKG4pIHsKICAgIG4gPSBNYXRoLm1heCgxLCBuIHwgMCk7CiAgICBpZiAobiA9PT0gdGhpcy5jb2xzLmxlbmd0aCkgcmV0dXJuOwogICAgdmFyIGV4aXN0aW5nID0gdGhpcy5ub2Rlcy5zbGljZSgpOwogICAgdGhpcy5yb290LmlubmVySFRNTCA9ICIiOwogICAgdGhpcy5jb2xzID0gW107CiAgICB0aGlzLmNvbEggPSBbXTsKICAgIHRoaXMubm9kZXMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIHZhciBjb2wgPSBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLWNvbCIgfSk7CiAgICAgIHRoaXMucm9vdC5hcHBlbmRDaGlsZChjb2wpOwogICAgICB0aGlzLmNvbHMucHVzaChjb2wpOwogICAgICB0aGlzLmNvbEgucHVzaCgwKTsKICAgIH0KICAgIHZhciBzZWxmID0gdGhpczsKICAgIGV4aXN0aW5nLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7IHNlbGYuYWRkKGVudHJ5Lm5vZGUsIGVudHJ5LndlaWdodCk7IH0pOwogIH07CiAgQ29sdW1uTGF5b3V0LnByb3RvdHlwZS5fc2hvcnRlc3QgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgaWR4ID0gMCwgbWluID0gSW5maW5pdHk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sSC5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpcy5jb2xIW2ldIDwgbWluKSB7IG1pbiA9IHRoaXMuY29sSFtpXTsgaWR4ID0gaTsgfQogICAgfQogICAgcmV0dXJuIGlkeDsKICB9OwogIENvbHVtbkxheW91dC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKG5vZGUsIHdlaWdodCkgewogICAgd2VpZ2h0ID0gKHR5cGVvZiB3ZWlnaHQgPT09ICJudW1iZXIiICYmIHdlaWdodCA+IDApID8gd2VpZ2h0IDogMTsKICAgIHZhciBpZHggPSB0aGlzLl9zaG9ydGVzdCgpOwogICAgdGhpcy5jb2xzW2lkeF0uYXBwZW5kQ2hpbGQobm9kZSk7CiAgICB0aGlzLmNvbEhbaWR4XSArPSB3ZWlnaHQ7CiAgICB0aGlzLm5vZGVzLnB1c2goeyBub2RlOiBub2RlLCB3ZWlnaHQ6IHdlaWdodCB9KTsKICB9OwogIENvbHVtbkxheW91dC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CiAgICB0aGlzLmNvbHMuZm9yRWFjaChmdW5jdGlvbiAoYykgeyBjLmlubmVySFRNTCA9ICIiOyB9KTsKICAgIHRoaXMuY29sSCA9IHRoaXMuY29sSC5tYXAoZnVuY3Rpb24gKCkgeyByZXR1cm4gMDsgfSk7CiAgICB0aGlzLm5vZGVzID0gW107CiAgfTsKCiAgZnVuY3Rpb24gY29sdW1uc0ZvcldpZHRoKHcsIGdyaWRTdHlsZSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBHUklEX1NUWUxFUy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoR1JJRF9TVFlMRVNbaV0ua2V5ID09PSBncmlkU3R5bGUgJiYgR1JJRF9TVFlMRVNbaV0uY29scykgcmV0dXJuIEdSSURfU1RZTEVTW2ldLmNvbHM7CiAgICB9CiAgICBpZiAoKHdpbmRvdy5pbm5lcldpZHRoIHx8IHcpIDw9IDY0MCkgcmV0dXJuIDI7CiAgICBpZiAodyA8IDU2MCkgcmV0dXJuIDI7CiAgICBpZiAodyA8IDkwMCkgcmV0dXJuIDM7CiAgICBpZiAodyA8IDEzMjApIHJldHVybiA0OwogICAgcmV0dXJuIDU7CiAgfQoKICBmdW5jdGlvbiBjYXJkV2VpZ2h0KGl0ZW0pIHsKICAgIHZhciBnaSA9IGltYWdlT2YoaXRlbSk7CiAgICB2YXIgYXIgPSBhc3BlY3RPZihnaSk7CiAgICByZXR1cm4gMSAvIE1hdGgubWF4KDAuMywgYXIgfHwgMC43NSk7CiAgfQoKICBmdW5jdGlvbiBGZWVkQ29udHJvbGxlcihvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgIHRoaXMubW91bnQgPSBvcHRpb25zLm1vdW50OwogICAgdGhpcy50YWcgPSBvcHRpb25zLnRhZyB8fCAiIjsKICAgIHRoaXMuaW5saW5lID0gISFvcHRpb25zLmlubGluZTsKICAgIHRoaXMubGltaXQgPSBvcHRpb25zLmxpbWl0IHx8IDA7CiAgICB0aGlzLnBlciA9IG9wdGlvbnMucGVyIHx8ICh0aGlzLmlubGluZSA/IE1hdGgubWF4KElOTElORV9ERUZBVUxULCB0aGlzLmxpbWl0IHx8IElOTElORV9ERUZBVUxUKSA6IFBFUik7CiAgICB0aGlzLnNob3dDaGlwcyA9IG9wdGlvbnMuc2hvd0NoaXBzICE9PSBmYWxzZSAmJiAhdGhpcy5pbmxpbmU7CiAgICB0aGlzLnNob3dIZWFkZXIgPSBvcHRpb25zLnNob3dIZWFkZXIgIT09IGZhbHNlICYmICF0aGlzLmlubGluZTsKICAgIHRoaXMuc2hvd09wdGlvbnMgPSBvcHRpb25zLnNob3dPcHRpb25zICE9PSBmYWxzZSAmJiAhdGhpcy5pbmxpbmU7CiAgICB0aGlzLm9uQXBwbHkgPSB0eXBlb2Ygb3B0aW9ucy5vbkFwcGx5ID09PSAiZnVuY3Rpb24iID8gb3B0aW9ucy5vbkFwcGx5IDogbnVsbDsKICAgIHRoaXMucHJlZnMgPSBsb2FkUHJlZnMoKTsKCiAgICB0aGlzLnBhZ2UgPSAxOwogICAgdGhpcy5pdGVtcyA9IFtdOwogICAgdGhpcy50b3RhbCA9IG51bGw7CiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgIHRoaXMuZG9uZSA9IGZhbHNlOwogICAgdGhpcy5lcnJvcmVkID0gZmFsc2U7CiAgICB0aGlzLnNlZW4gPSB7fTsKICAgIHRoaXMuc3RhdGVzID0gW107CgogICAgdGhpcy5sYXlvdXQgPSBudWxsOwogICAgdGhpcy5ncmlkRWwgPSBudWxsOwogICAgdGhpcy5zZW50aW5lbCA9IG51bGw7CiAgICB0aGlzLnN0YXR1c0VsID0gbnVsbDsKICAgIHRoaXMuY2hpcHNCYXIgPSBudWxsOwogICAgdGhpcy5vYnNlcnZlciA9IG51bGw7CiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlOwogICAgdGhpcy5fb25SZXNpemUgPSBudWxsOwogICAgdGhpcy5fcmVxVG9rZW4gPSAwOwogICAgdGhpcy5fb3B0c1JlZiA9IG51bGw7CiAgfQoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIHJvb3QgPSB0aGlzLm1vdW50OwogICAgcm9vdC5pbm5lckhUTUwgPSAiIjsKCiAgICB2YXIgd3JhcCA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidi1zZWN0aW9uIHZmZWVkLXZpZXciICsgKHRoaXMuaW5saW5lID8gIiB2ZmVlZC12aWV3LS1pbmxpbmUiIDogIiIpIH0pOwoKICAgIGlmICh0aGlzLnNob3dIZWFkZXIpIHsKICAgICAgdmFyIGhlYWRSb3cgPSBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLWhlYWQiIH0pOwogICAgICBoZWFkUm93LmFwcGVuZENoaWxkKGVsKCJkaXYiLCB7IGNsYXNzOiAidmZlZWQtaGVhZF9fdGV4dCIgfSwgWwogICAgICAgIGVsKCJzcGFuIiwgeyBjbGFzczogInYtZXllYnJvdyIsIHRleHQ6ICJJbnNwaXJhdGlvbiIgfSksCiAgICAgICAgZWwoImgxIiwgeyBjbGFzczogInYtc2VjdGlvbl9fdGl0bGUgdi1ncmFkaWVudCIsIHRleHQ6ICJDdXJhdGVkIHRyYW5zZm9ybWF0aW9ucyIgfSksCiAgICAgICAgZWwoInAiLCB7IHRleHQ6ICJUYXAgYW55IHJlc3VsdCB0byBsb2FkIGl0cyBwcm9tcHQuIERyYWcgYWNyb3NzIGEgdGlsZSB0byBzY3J1YiBiZWZvcmUgLyBhZnRlci4iIH0pCiAgICAgIF0pKTsKICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMpIGhlYWRSb3cuYXBwZW5kQ2hpbGQodGhpcy5fYnVpbGRPcHRpb25zVHJpZ2dlcigpKTsKICAgICAgd3JhcC5hcHBlbmRDaGlsZChoZWFkUm93KTsKICAgIH0KCiAgICBpZiAodGhpcy5zaG93Q2hpcHMpIHsKICAgICAgdGhpcy5jaGlwc0JhciA9IHRoaXMuX2J1aWxkQ2hpcHMoKTsKICAgICAgd3JhcC5hcHBlbmRDaGlsZCh0aGlzLmNoaXBzQmFyKTsKICAgIH0KCiAgICB0aGlzLmdyaWRFbCA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidmZlZWQiLCByb2xlOiAibGlzdCIsICJhcmlhLWxhYmVsIjogIkN1cmF0ZWQgaW5zcGlyYXRpb24gZ2FsbGVyeSIgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKHRoaXMuZ3JpZEVsKTsKCiAgICB2YXIgZm9vdGVyID0gZWwoImRpdiIsIHsgY2xhc3M6ICJ2ZmVlZC1jdGEiIH0pOwogICAgdGhpcy5zdGF0dXNFbCA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidmZlZWQtbG9hZGluZyIsICJhcmlhLWxpdmUiOiAicG9saXRlIiB9KTsKICAgIHRoaXMuc2VudGluZWwgPSBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLXNlbnRpbmVsIiwgImFyaWEtaGlkZGVuIjogInRydWUiIH0pOwogICAgZm9vdGVyLmFwcGVuZENoaWxkKHRoaXMuc3RhdHVzRWwpOwogICAgZm9vdGVyLmFwcGVuZENoaWxkKHRoaXMuc2VudGluZWwpOwogICAgd3JhcC5hcHBlbmRDaGlsZChmb290ZXIpOwoKICAgIHJvb3QuYXBwZW5kQ2hpbGQod3JhcCk7CgogICAgdGhpcy5fYXBwbHlHcmlkQXR0cnMoKTsKICAgIHZhciBjb2xzID0gY29sdW1uc0ZvcldpZHRoKHRoaXMuZ3JpZEVsLmNsaWVudFdpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoIHx8IDEwMjQsIHRoaXMucHJlZnMuZ3JpZFN0eWxlKTsKICAgIHRoaXMubGF5b3V0ID0gbmV3IENvbHVtbkxheW91dCh0aGlzLmdyaWRFbCwgY29scyk7CiAgICB0aGlzLl9zaG93U2tlbGV0b25zKE1hdGgubWluKHRoaXMucGVyLCB0aGlzLmlubGluZSA/ICh0aGlzLmxpbWl0IHx8IElOTElORV9ERUZBVUxUKSA6IDkpKTsKCiAgICB0aGlzLl9zZXR1cFJlc2l6ZSgpOwogICAgdGhpcy5fc2V0dXBPYnNlcnZlcigpOwogICAgdGhpcy5sb2FkTmV4dCh0cnVlKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX2FwcGx5R3JpZEF0dHJzID0gZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLmdyaWRFbCkgcmV0dXJuOwogICAgdGhpcy5ncmlkRWwuc2V0QXR0cmlidXRlKCJkYXRhLWdyaWQiLCB0aGlzLnByZWZzLmdyaWRTdHlsZSk7CiAgICB0aGlzLmdyaWRFbC5zZXRBdHRyaWJ1dGUoImRhdGEtY2VsbG1vZGUiLCB0aGlzLnByZWZzLmNlbGxNb2RlKTsKICAgIHRoaXMuZ3JpZEVsLnNldEF0dHJpYnV0ZSgiZGF0YS1lZmZlY3QiLCB0aGlzLnByZWZzLmVmZmVjdCk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9idWlsZE9wdGlvbnNUcmlnZ2VyID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIGJ0biA9IGVsKCJidXR0b24iLCB7CiAgICAgIGNsYXNzOiAidi1jdGEgdi1jdGEtLWdob3N0IHZmZWVkLW9wdGlvbnMtdHJpZ2dlciIsCiAgICAgIHR5cGU6ICJidXR0b24iLAogICAgICAiYXJpYS1oYXNwb3B1cCI6ICJkaWFsb2ciLAogICAgICB0aXRsZTogIkRpc3BsYXkgb3B0aW9ucyIsCiAgICAgICJhcmlhLWxhYmVsIjogIkRpc3BsYXkgb3B0aW9ucyIKICAgIH0sIFsKICAgICAgZWwoInNwYW4iLCB7IGNsYXNzOiAidmZlZWQtb3B0aW9ucy10cmlnZ2VyX19pY28iLCAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIsIGh0bWw6IG9wdGlvbnNHbHlwaCgpIH0pLAogICAgICBlbCgic3BhbiIsIHsgdGV4dDogIkRpc3BsYXkiIH0pCiAgICBdKTsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsgc2VsZi5fb3Blbk9wdGlvbnMoKTsgfSk7CiAgICByZXR1cm4gYnRuOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fb3Blbk9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgY29udGVudCA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidmZlZWQtb3B0cyIgfSk7CgogICAgY29udGVudC5hcHBlbmRDaGlsZChlbCgiaDIiLCB7IGNsYXNzOiAidmZlZWQtb3B0c19fdGl0bGUiLCB0ZXh0OiAiRGlzcGxheSBvcHRpb25zIiB9KSk7CgogICAgY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLl9zZWdtZW50Um93KCJHcmlkIiwgR1JJRF9TVFlMRVMsIHRoaXMucHJlZnMuZ3JpZFN0eWxlLCBmdW5jdGlvbiAodikgewogICAgICBzZWxmLl9zZXRQcmVmKCJncmlkU3R5bGUiLCB2KTsKICAgICAgc2VsZi5fcmVmbG93Q29sdW1ucygpOwogICAgfSkpOwoKICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5fc2VnbWVudFJvdygiQ2VsbCBtb2RlIiwgQ0VMTF9NT0RFUywgdGhpcy5wcmVmcy5jZWxsTW9kZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgc2VsZi5fc2V0UHJlZigiY2VsbE1vZGUiLCB2KTsKICAgICAgc2VsZi5fcmVyZW5kZXJDYXJkcygpOwogICAgfSkpOwoKICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5fc2xpZGVyUm93KCJTcGVlZCIsIDAuMjUsIDMuMCwgMC4yNSwgdGhpcy5wcmVmcy5zcGVlZCwgZnVuY3Rpb24gKG4pIHsgcmV0dXJuIG4udG9GaXhlZCgyKSArICLDlyI7IH0sIGZ1bmN0aW9uICh2KSB7CiAgICAgIHNlbGYuX3NldFByZWYoInNwZWVkIiwgdik7CiAgICAgIHNlbGYuc3RhdGVzLmZvckVhY2goZnVuY3Rpb24gKHMpIHsgaWYgKHMpIHMuc3BlZWQgPSB2OyB9KTsKICAgIH0pKTsKCiAgICBjb250ZW50LmFwcGVuZENoaWxkKHRoaXMuX3NlbGVjdFJvdygiRWZmZWN0IiwgRUZGRUNUUywgdGhpcy5wcmVmcy5lZmZlY3QsIGZ1bmN0aW9uICh2KSB7CiAgICAgIHNlbGYuX3NldFByZWYoImVmZmVjdCIsIHYpOwogICAgICBzZWxmLl9hcHBseUVmZmVjdCgpOwogICAgfSkpOwoKICAgIHZhciByZXNldEJ0biA9IGVsKCJidXR0b24iLCB7IGNsYXNzOiAidi1jdGEgdi1jdGEtLWdob3N0IHZmZWVkLW9wdHNfX3Jlc2V0IiwgdHlwZTogImJ1dHRvbiIsIHRleHQ6ICJSZXNldCB0byBkZWZhdWx0cyIgfSk7CiAgICByZXNldEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgc2VsZi5wcmVmcyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfUFJFRlMpOwogICAgICBPYmplY3Qua2V5cyhERUZBVUxUX1BSRUZTKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IHByZWZTZXQoaywgREVGQVVMVF9QUkVGU1trXSk7IH0pOwogICAgICBpZiAoc2VsZi5fb3B0c1JlZiAmJiBzZWxmLl9vcHRzUmVmLmNsb3NlKSBzZWxmLl9vcHRzUmVmLmNsb3NlKCk7CiAgICAgIHNlbGYuX3JlZmxvd0NvbHVtbnMoKTsKICAgICAgc2VsZi5fcmVyZW5kZXJDYXJkcygpOwogICAgfSk7CiAgICBjb250ZW50LmFwcGVuZENoaWxkKHJlc2V0QnRuKTsKCiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5zaGVldCA9PT0gImZ1bmN0aW9uIikgewogICAgICB0aGlzLl9vcHRzUmVmID0gVi51aS5zaGVldChjb250ZW50LCB7IGFyaWFMYWJlbDogIkRpc3BsYXkgb3B0aW9ucyIsIGNsYXNzTmFtZTogInZmZWVkLW9wdHMtc2hlZXQiIH0pOwogICAgfSBlbHNlIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLm1vZGFsID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHRoaXMuX29wdHNSZWYgPSBWLnVpLm1vZGFsKGNvbnRlbnQsIHsgYXJpYUxhYmVsOiAiRGlzcGxheSBvcHRpb25zIiwgY2xhc3NOYW1lOiAidmZlZWQtb3B0cy1zaGVldCIgfSk7CiAgICB9CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9zZXRQcmVmID0gZnVuY3Rpb24gKGtleSwgdmFsKSB7CiAgICB0aGlzLnByZWZzW2tleV0gPSB2YWw7CiAgICBwcmVmU2V0KGtleSwgdmFsKTsKICAgIGlmIChrZXkgPT09ICJncmlkU3R5bGUiIHx8IGtleSA9PT0gImNlbGxNb2RlIiB8fCBrZXkgPT09ICJlZmZlY3QiKSB0aGlzLl9hcHBseUdyaWRBdHRycygpOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fYXBwbHlFZmZlY3QgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMuZ3JpZEVsKSByZXR1cm47CiAgICB2YXIgZWZmID0gdGhpcy5wcmVmcy5lZmZlY3Q7CiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRoaXMuZ3JpZEVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi52Y2FyZFtkYXRhLW1vZGVdIiksIGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjLmdldEF0dHJpYnV0ZSgiZGF0YS1tb2RlIikgIT09ICJhZnRlck9ubHkiKSBjLnNldEF0dHJpYnV0ZSgiZGF0YS1lZmZlY3QiLCBlZmYpOwogICAgfSk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9zZWdtZW50Um93ID0gZnVuY3Rpb24gKGxhYmVsLCBvcHRpb25zLCB2YWx1ZSwgb25QaWNrKSB7CiAgICB2YXIgc2VnID0gZWwoImRpdiIsIHsgY2xhc3M6ICJ2ZmVlZC1zZWciLCByb2xlOiAicmFkaW9ncm91cCIsICJhcmlhLWxhYmVsIjogbGFiZWwgfSk7CiAgICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9wdCkgewogICAgICB2YXIgYWN0aXZlID0gb3B0LmtleSA9PT0gdmFsdWU7CiAgICAgIHZhciBiID0gZWwoImJ1dHRvbiIsIHsKICAgICAgICBjbGFzczogInZmZWVkLXNlZ19fYnRuIiArIChhY3RpdmUgPyAiIGlzLWFjdGl2ZSIgOiAiIiksCiAgICAgICAgdHlwZTogImJ1dHRvbiIsCiAgICAgICAgcm9sZTogInJhZGlvIiwKICAgICAgICAiYXJpYS1jaGVja2VkIjogYWN0aXZlID8gInRydWUiIDogImZhbHNlIiwKICAgICAgICAiZGF0YS12YWwiOiBvcHQua2V5LAogICAgICAgIHRleHQ6IG9wdC5sYWJlbAogICAgICB9KTsKICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHNlZy5xdWVyeVNlbGVjdG9yQWxsKCIudmZlZWQtc2VnX19idG4iKSwgZnVuY3Rpb24gKG4pIHsKICAgICAgICAgIHZhciBvbiA9IG4uZ2V0QXR0cmlidXRlKCJkYXRhLXZhbCIpID09PSBvcHQua2V5OwogICAgICAgICAgbi5jbGFzc0xpc3QudG9nZ2xlKCJpcy1hY3RpdmUiLCBvbik7CiAgICAgICAgICBuLnNldEF0dHJpYnV0ZSgiYXJpYS1jaGVja2VkIiwgb24gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICAgICB9KTsKICAgICAgICBvblBpY2sob3B0LmtleSk7CiAgICAgIH0pOwogICAgICBzZWcuYXBwZW5kQ2hpbGQoYik7CiAgICB9KTsKICAgIHJldHVybiBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLW9wdHNfX3JvdyIgfSwgWwogICAgICBlbCgic3BhbiIsIHsgY2xhc3M6ICJ2ZmVlZC1vcHRzX19sYWJlbCIsIHRleHQ6IGxhYmVsIH0pLAogICAgICBzZWcKICAgIF0pOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fc2VsZWN0Um93ID0gZnVuY3Rpb24gKGxhYmVsLCBvcHRpb25zLCB2YWx1ZSwgb25QaWNrKSB7CiAgICB2YXIgc2VsID0gZWwoInNlbGVjdCIsIHsgY2xhc3M6ICJ2LXNlbGVjdCB2ZmVlZC1vcHRzX19zZWxlY3QiLCAiYXJpYS1sYWJlbCI6IGxhYmVsIH0pOwogICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvcHQpIHsKICAgICAgdmFyIG8gPSBlbCgib3B0aW9uIiwgeyB2YWx1ZTogb3B0LmtleSwgdGV4dDogb3B0LmxhYmVsIH0pOwogICAgICBpZiAob3B0LmtleSA9PT0gdmFsdWUpIG8uc2VsZWN0ZWQgPSB0cnVlOwogICAgICBzZWwuYXBwZW5kQ2hpbGQobyk7CiAgICB9KTsKICAgIHNlbC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7IG9uUGljayhzZWwudmFsdWUpOyB9KTsKICAgIHJldHVybiBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLW9wdHNfX3JvdyIgfSwgWwogICAgICBlbCgic3BhbiIsIHsgY2xhc3M6ICJ2ZmVlZC1vcHRzX19sYWJlbCIsIHRleHQ6IGxhYmVsIH0pLAogICAgICBzZWwKICAgIF0pOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fc2xpZGVyUm93ID0gZnVuY3Rpb24gKGxhYmVsLCBtaW4sIG1heCwgc3RlcCwgdmFsdWUsIGZtdCwgb25JbnB1dCkgewogICAgdmFyIHZhbEVsID0gZWwoInNwYW4iLCB7IGNsYXNzOiAidmZlZWQtb3B0c19fdmFsIiwgdGV4dDogZm10KHZhbHVlKSB9KTsKICAgIHZhciBpbnB1dCA9IGVsKCJpbnB1dCIsIHsKICAgICAgdHlwZTogInJhbmdlIiwKICAgICAgY2xhc3M6ICJ2ZmVlZC1yYW5nZSIsCiAgICAgIG1pbjogU3RyaW5nKG1pbiksCiAgICAgIG1heDogU3RyaW5nKG1heCksCiAgICAgIHN0ZXA6IFN0cmluZyhzdGVwKSwKICAgICAgdmFsdWU6IFN0cmluZyh2YWx1ZSksCiAgICAgICJhcmlhLWxhYmVsIjogbGFiZWwKICAgIH0pOwogICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBuID0gTnVtYmVyKGlucHV0LnZhbHVlKTsKICAgICAgdmFsRWwudGV4dENvbnRlbnQgPSBmbXQobik7CiAgICAgIG9uSW5wdXQobik7CiAgICB9KTsKICAgIHJldHVybiBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLW9wdHNfX3JvdyB2ZmVlZC1vcHRzX19yb3ctLXNsaWRlciIgfSwgWwogICAgICBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLW9wdHNfX3NsaWRlcmhlYWQiIH0sIFsKICAgICAgICBlbCgic3BhbiIsIHsgY2xhc3M6ICJ2ZmVlZC1vcHRzX19sYWJlbCIsIHRleHQ6IGxhYmVsIH0pLAogICAgICAgIHZhbEVsCiAgICAgIF0pLAogICAgICBpbnB1dAogICAgXSk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9yZWZsb3dDb2x1bW5zID0gZnVuY3Rpb24gKCkgewogICAgaWYgKHRoaXMuZGVzdHJveWVkIHx8ICF0aGlzLmxheW91dCB8fCAhdGhpcy5ncmlkRWwpIHJldHVybjsKICAgIHRoaXMuX2FwcGx5R3JpZEF0dHJzKCk7CiAgICB2YXIgY29scyA9IGNvbHVtbnNGb3JXaWR0aCh0aGlzLmdyaWRFbC5jbGllbnRXaWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAxMDI0LCB0aGlzLnByZWZzLmdyaWRTdHlsZSk7CiAgICB0aGlzLmxheW91dC5zZXRDb2x1bW5zKGNvbHMpOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fcmVyZW5kZXJDYXJkcyA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdGhpcy5sYXlvdXQpIHJldHVybjsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHVucmVnaXN0ZXJTdGF0ZXModGhpcy5zdGF0ZXMpOwogICAgdGhpcy5zdGF0ZXMgPSBbXTsKICAgIHRoaXMubGF5b3V0LmNsZWFyKCk7CiAgICB0aGlzLml0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0KSB7CiAgICAgIHNlbGYubGF5b3V0LmFkZChidWlsZENhcmQoaXQsIHNlbGYucHJlZnMsIHNlbGYpLCBjYXJkV2VpZ2h0KGl0KSk7CiAgICB9KTsKICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmRvbmUgJiYgIXRoaXMuZXJyb3JlZCkgdGhpcy5fcmVuZGVyRW1wdHkoKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX2J1aWxkQ2hpcHMgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgYmFyID0gZWwoImRpdiIsIHsgY2xhc3M6ICJ2LWNoaXAtcm93IHZmZWVkLWNoaXBzIiwgcm9sZTogInRhYmxpc3QiLCAiYXJpYS1sYWJlbCI6ICJGaWx0ZXIgYnkgdGhlbWUiIH0pOwogICAgVEFHUy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgIHZhciBhY3RpdmUgPSAodC5rZXkgPT09IHNlbGYudGFnKTsKICAgICAgdmFyIGNoaXAgPSBlbCgiYnV0dG9uIiwgewogICAgICAgIGNsYXNzOiAidi1jaGlwIiArIChhY3RpdmUgPyAiIHYtY2hpcC0tYWN0aXZlIiA6ICIiKSwKICAgICAgICB0eXBlOiAiYnV0dG9uIiwKICAgICAgICByb2xlOiAidGFiIiwKICAgICAgICAiYXJpYS1zZWxlY3RlZCI6IGFjdGl2ZSA/ICJ0cnVlIiA6ICJmYWxzZSIsCiAgICAgICAgImRhdGEtdGFnIjogdC5rZXksCiAgICAgICAgdGV4dDogdC5sYWJlbAogICAgICB9KTsKICAgICAgY2hpcC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoc2VsZi50YWcgPT09IHQua2V5KSByZXR1cm47CiAgICAgICAgc2VsZi5zZXRUYWcodC5rZXkpOwogICAgICAgIHZhciBucSA9ICIjL2luc3BpcmF0aW9uIiArICh0LmtleSA/ICI/dGFnPSIgKyBlbmNvZGVVUklDb21wb25lbnQodC5rZXkpIDogIiIpOwogICAgICAgIGlmIChsb2NhdGlvbi5oYXNoICE9PSBucSkgewogICAgICAgICAgaWYgKFYucm91dGVyICYmIHR5cGVvZiBWLnJvdXRlci5yZXBsYWNlID09PSAiZnVuY3Rpb24iKSBWLnJvdXRlci5yZXBsYWNlKG5xKTsKICAgICAgICAgIGVsc2UgaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgIiIsIG5xKTsKICAgICAgICB9CiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiYXIucXVlcnlTZWxlY3RvckFsbCgiLnYtY2hpcCIpLCBmdW5jdGlvbiAoYykgewogICAgICAgICAgdmFyIG9uID0gYy5nZXRBdHRyaWJ1dGUoImRhdGEtdGFnIikgPT09IHQua2V5OwogICAgICAgICAgYy5jbGFzc0xpc3QudG9nZ2xlKCJ2LWNoaXAtLWFjdGl2ZSIsIG9uKTsKICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwgb24gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICAgICB9KTsKICAgICAgICB0cnkgeyBjaGlwLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICJzbW9vdGgiLCBpbmxpbmU6ICJjZW50ZXIiLCBibG9jazogIm5lYXJlc3QiIH0pOyB9IGNhdGNoIChlKSB7fQogICAgICB9KTsKICAgICAgYmFyLmFwcGVuZENoaWxkKGNoaXApOwogICAgfSk7CiAgICByZXR1cm4gYmFyOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5zZXRUYWcgPSBmdW5jdGlvbiAodGFnKSB7CiAgICB0YWcgPSB0YWcgfHwgIiI7CiAgICBpZiAodGFnID09PSB0aGlzLnRhZykgcmV0dXJuOwogICAgdGhpcy50YWcgPSB0YWc7CiAgICB0aGlzLl9yZWxvYWQoKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX3JlbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuX3JlcVRva2VuKys7CiAgICB0aGlzLnBhZ2UgPSAxOwogICAgdGhpcy5pdGVtcyA9IFtdOwogICAgdGhpcy50b3RhbCA9IG51bGw7CiAgICB0aGlzLmRvbmUgPSBmYWxzZTsKICAgIHRoaXMuZXJyb3JlZCA9IGZhbHNlOwogICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICB0aGlzLnNlZW4gPSB7fTsKICAgIHVucmVnaXN0ZXJTdGF0ZXModGhpcy5zdGF0ZXMpOwogICAgdGhpcy5zdGF0ZXMgPSBbXTsKICAgIGlmICh0aGlzLmxheW91dCkgdGhpcy5sYXlvdXQuY2xlYXIoKTsKICAgIHRoaXMuX3Nob3dTa2VsZXRvbnMoTWF0aC5taW4odGhpcy5wZXIsIDkpKTsKICAgIHRoaXMubG9hZE5leHQodHJ1ZSk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9zaG93U2tlbGV0b25zID0gZnVuY3Rpb24gKG4pIHsKICAgIGlmICghdGhpcy5sYXlvdXQpIHJldHVybjsKICAgIHRoaXMubGF5b3V0LmNsZWFyKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgc2s7CiAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnNrZWxldG9uID09PSAiZnVuY3Rpb24iKSBzayA9IFYudWkuc2tlbGV0b24oImNhcmQiKTsKICAgICAgZWxzZSBzayA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidi1za2VsZXRvbiIgfSk7CiAgICAgIGlmIChzayAmJiBzay5jbGFzc0xpc3QpIHNrLmNsYXNzTGlzdC5hZGQoInZmZWVkLXNrZWwiKTsKICAgICAgaWYgKHNrICYmIHNrLnN0eWxlKSBzay5zdHlsZS5taW5IZWlnaHQgPSAoMTgwICsgKChpICogNTMpICUgMTQwKSkgKyAicHgiOwogICAgICB0aGlzLmxheW91dC5hZGQoc2ssIDEgKyAoKGkgKiAwLjM3KSAlIDAuOSkpOwogICAgfQogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fY2xlYXJTa2VsZXRvbnMgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMuZ3JpZEVsKSByZXR1cm47CiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRoaXMuZ3JpZEVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi52ZmVlZC1za2VsIiksIGZ1bmN0aW9uIChuKSB7CiAgICAgIGlmIChuLnBhcmVudE5vZGUpIG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTsKICAgIH0pOwogICAgaWYgKHRoaXMubGF5b3V0KSB7CiAgICAgIHRoaXMubGF5b3V0LmNvbEggPSB0aGlzLmxheW91dC5jb2xILm1hcChmdW5jdGlvbiAoKSB7IHJldHVybiAwOyB9KTsKICAgICAgdGhpcy5sYXlvdXQubm9kZXMgPSBbXTsKICAgIH0KICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUubG9hZE5leHQgPSBmdW5jdGlvbiAoaXNGaXJzdCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgaWYgKHRoaXMubG9hZGluZyB8fCB0aGlzLmRvbmUgfHwgdGhpcy5kZXN0cm95ZWQpIHJldHVybjsKICAgIGlmICh0aGlzLmxpbWl0ICYmIHRoaXMuaXRlbXMubGVuZ3RoID49IHRoaXMubGltaXQpIHsgdGhpcy5kb25lID0gdHJ1ZTsgdGhpcy5fcmVuZGVyRm9vdGVyKCk7IHJldHVybjsgfQoKICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICB0aGlzLmVycm9yZWQgPSBmYWxzZTsKICAgIHZhciB0b2tlbiA9ICsrdGhpcy5fcmVxVG9rZW47CiAgICB0aGlzLl9yZW5kZXJGb290ZXIoKTsKCiAgICB2YXIgZmV0Y2hlciA9IChWLmFwaSAmJiB0eXBlb2YgVi5hcGkuY3VyYXRlZEZlZWQgPT09ICJmdW5jdGlvbiIpCiAgICAgID8gVi5hcGkuY3VyYXRlZEZlZWQodGhpcy5wYWdlLCB0aGlzLnBlciwgdGhpcy50YWcgfHwgbnVsbCkKICAgICAgOiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkZlZWQgQVBJIHVuYXZhaWxhYmxlIikpOwoKICAgIFByb21pc2UucmVzb2x2ZShmZXRjaGVyKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgaWYgKHNlbGYuZGVzdHJveWVkIHx8IHRva2VuICE9PSBzZWxmLl9yZXFUb2tlbikgcmV0dXJuOwogICAgICBzZWxmLmxvYWRpbmcgPSBmYWxzZTsKCiAgICAgIHZhciBpdGVtcyA9IFtdOwogICAgICB2YXIgbWV0YSA9IG51bGw7CiAgICAgIGlmIChyZXMgJiYgQXJyYXkuaXNBcnJheShyZXMuaXRlbXMpKSB7IGl0ZW1zID0gcmVzLml0ZW1zOyBtZXRhID0gcmVzLm1ldGFkYXRhIHx8IG51bGw7IH0KICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXMpKSB7IGl0ZW1zID0gcmVzOyB9CgogICAgICBpZiAobWV0YSAmJiB0eXBlb2YgbWV0YS50b3RhbCA9PT0gIm51bWJlciIpIHNlbGYudG90YWwgPSBtZXRhLnRvdGFsOwoKICAgICAgaWYgKGlzRmlyc3QpIHNlbGYuX2NsZWFyU2tlbGV0b25zKCk7CgogICAgICB2YXIgYWRkZWQgPSAwOwogICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdCkgewogICAgICAgIHZhciBnaSA9IGltYWdlT2YoaXQpOwogICAgICAgIGlmICghYWZ0ZXJVUkwoZ2kpICYmICFiZWZvcmVVUkwoZ2kpKSByZXR1cm47CiAgICAgICAgdmFyIGlkID0gZ2kucmVtb3RlSUQgfHwgZ2kuaWQ7CiAgICAgICAgdmFyIGRrZXkgPSBpZCB8fCAoYWZ0ZXJVUkwoZ2kpICsgInwiICsgKGdpLnByb21wdCB8fCAiIikpOwogICAgICAgIGlmIChzZWxmLnNlZW5bZGtleV0pIHJldHVybjsKICAgICAgICBzZWxmLnNlZW5bZGtleV0gPSB0cnVlOwogICAgICAgIGlmIChzZWxmLmxpbWl0ICYmIHNlbGYuaXRlbXMubGVuZ3RoID49IHNlbGYubGltaXQpIHJldHVybjsKICAgICAgICBzZWxmLml0ZW1zLnB1c2goaXQpOwogICAgICAgIHNlbGYubGF5b3V0LmFkZChidWlsZENhcmQoaXQsIHNlbGYucHJlZnMsIHNlbGYpLCBjYXJkV2VpZ2h0KGl0KSk7CiAgICAgICAgYWRkZWQrKzsKICAgICAgfSk7CgogICAgICBpZiAoaXRlbXMubGVuZ3RoIDwgc2VsZi5wZXIpIHNlbGYuZG9uZSA9IHRydWU7CiAgICAgIGlmIChzZWxmLmxpbWl0ICYmIHNlbGYuaXRlbXMubGVuZ3RoID49IHNlbGYubGltaXQpIHNlbGYuZG9uZSA9IHRydWU7CiAgICAgIGlmIChzZWxmLnRvdGFsICE9IG51bGwgJiYgc2VsZi5pdGVtcy5sZW5ndGggPj0gc2VsZi50b3RhbCkgc2VsZi5kb25lID0gdHJ1ZTsKCiAgICAgIGlmIChhZGRlZCA+IDAgfHwgc2VsZi5pdGVtcy5sZW5ndGggPiAwKSBzZWxmLnBhZ2UrKzsKCiAgICAgIGlmIChpc0ZpcnN0ICYmIHNlbGYuaXRlbXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgc2VsZi5kb25lID0gdHJ1ZTsKICAgICAgICBzZWxmLl9yZW5kZXJFbXB0eSgpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgc2VsZi5fcmVuZGVyRm9vdGVyKCk7CiAgICAgIHNlbGYuX21heWJlQXV0b0xvYWQoKTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgaWYgKHNlbGYuZGVzdHJveWVkIHx8IHRva2VuICE9PSBzZWxmLl9yZXFUb2tlbikgcmV0dXJuOwogICAgICBzZWxmLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgc2VsZi5lcnJvcmVkID0gdHJ1ZTsKICAgICAgaWYgKGlzRmlyc3QpIHsKICAgICAgICBzZWxmLl9jbGVhclNrZWxldG9ucygpOwogICAgICAgIGlmIChzZWxmLml0ZW1zLmxlbmd0aCA9PT0gMCkgeyBzZWxmLl9yZW5kZXJFcnJvcihlcnIpOyByZXR1cm47IH0KICAgICAgfQogICAgICBzZWxmLl9yZW5kZXJGb290ZXIoKTsKICAgIH0pOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fbWF5YmVBdXRvTG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLmRvbmUgfHwgdGhpcy5sb2FkaW5nIHx8IHRoaXMuZGVzdHJveWVkIHx8ICF0aGlzLnNlbnRpbmVsKSByZXR1cm47CiAgICB2YXIgciA9IHRoaXMuc2VudGluZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICB2YXIgdmggPSB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDsKICAgIGlmIChyLnRvcCA8IHZoICsgMzAwKSB7CiAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7IHNlbGYubG9hZE5leHQoKTsgfSk7CiAgICB9CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9yZW5kZXJGb290ZXIgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMuc3RhdHVzRWwpIHJldHVybjsKICAgIHZhciBzID0gdGhpcy5zdGF0dXNFbDsKICAgIHMuaW5uZXJIVE1MID0gIiI7CiAgICBpZiAodGhpcy5sb2FkaW5nKSB7CiAgICAgIHZhciBzcGluID0gKFYudWkgJiYgdHlwZW9mIFYudWkuc3Bpbm5lciA9PT0gImZ1bmN0aW9uIikgPyBWLnVpLnNwaW5uZXIoKSA6IGVsKCJzcGFuIiwgeyBjbGFzczogInYtc3Bpbm5lciIgfSk7CiAgICAgIHMuYXBwZW5kQ2hpbGQoc3Bpbik7CiAgICAgIHMuYXBwZW5kQ2hpbGQoZWwoInNwYW4iLCB7IHRleHQ6IHRoaXMuaXRlbXMubGVuZ3RoID8gIkxvYWRpbmcgbW9yZeKApiIgOiAiTG9hZGluZyBpbnNwaXJhdGlvbuKApiIgfSkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5lcnJvcmVkKSB7CiAgICAgIHMuYXBwZW5kQ2hpbGQoZWwoInNwYW4iLCB7IHRleHQ6ICJDb3VsZG7igJl0IGxvYWQgbW9yZSByZXN1bHRzLiIgfSkpOwogICAgICB2YXIgcmV0cnkgPSBlbCgiYnV0dG9uIiwgeyBjbGFzczogInYtY3RhIHYtY3RhLS1naG9zdCB2ZmVlZC1yZXRyeSIsIHR5cGU6ICJidXR0b24iLCB0ZXh0OiAiUmV0cnkiIH0pOwogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIHJldHJ5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgeyBzZWxmLmxvYWROZXh0KCk7IH0pOwogICAgICBzLmFwcGVuZENoaWxkKHJldHJ5KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuZG9uZSAmJiB0aGlzLml0ZW1zLmxlbmd0aCA+IDAgJiYgIXRoaXMuaW5saW5lKSB7CiAgICAgIHMuYXBwZW5kQ2hpbGQoZWwoInNwYW4iLCB7IHRleHQ6ICJZb3XigJl2ZSByZWFjaGVkIHRoZSBlbmQuIiB9KSk7CiAgICB9CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9yZW5kZXJFbXB0eSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIGlmICh0aGlzLmxheW91dCkgdGhpcy5sYXlvdXQuY2xlYXIoKTsKICAgIGlmICh0aGlzLnN0YXR1c0VsKSB0aGlzLnN0YXR1c0VsLmlubmVySFRNTCA9ICIiOwogICAgdmFyIG1zZyA9IHRoaXMudGFnCiAgICAgID8gIk5vIGluc3BpcmF0aW9uIGZvdW5kIGZvciDigJwiICsgdGhpcy50YWcgKyAi4oCdIHlldC4iCiAgICAgIDogIk5vIGluc3BpcmF0aW9uIHRvIHNob3cgeWV0LiI7CiAgICB2YXIgYWN0aW9uTGFiZWwgPSB0aGlzLnRhZyA/ICJDbGVhciBmaWx0ZXIiIDogIlN0YXJ0IGNyZWF0aW5nIjsKICAgIHZhciBvbkFjdGlvbiA9IHRoaXMudGFnCiAgICAgID8gZnVuY3Rpb24gKCkgewogICAgICAgICAgc2VsZi5zZXRUYWcoIiIpOwogICAgICAgICAgaWYgKHNlbGYuY2hpcHNCYXIpIHsKICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzZWxmLmNoaXBzQmFyLnF1ZXJ5U2VsZWN0b3JBbGwoIi52LWNoaXAiKSwgZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICB2YXIgb24gPSBjLmdldEF0dHJpYnV0ZSgiZGF0YS10YWciKSA9PT0gIiI7CiAgICAgICAgICAgICAgYy5jbGFzc0xpc3QudG9nZ2xlKCJ2LWNoaXAtLWFjdGl2ZSIsIG9uKTsKICAgICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsIG9uID8gInRydWUiIDogImZhbHNlIik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgOiBmdW5jdGlvbiAoKSB7IGdvKCIjL2NyZWF0ZSIpOyB9OwoKICAgIHZhciBlbXB0eU5vZGU7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5lbXB0eSA9PT0gImZ1bmN0aW9uIikgewogICAgICBlbXB0eU5vZGUgPSBWLnVpLmVtcHR5KG1zZywgYWN0aW9uTGFiZWwsIG9uQWN0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIGVtcHR5Tm9kZSA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidi1lbXB0eSIgfSwgWwogICAgICAgIGVsKCJwIiwgeyBjbGFzczogInYtZW1wdHlfX3RpdGxlIiwgdGV4dDogbXNnIH0pLAogICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgYiA9IGVsKCJidXR0b24iLCB7IGNsYXNzOiAidi1jdGEgdi1jdGEtLXByaW1hcnkiLCB0eXBlOiAiYnV0dG9uIiwgdGV4dDogYWN0aW9uTGFiZWwgfSk7CiAgICAgICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgb25BY3Rpb24pOwogICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgfSkoKQogICAgICBdKTsKICAgIH0KICAgIGlmIChlbXB0eU5vZGUgJiYgZW1wdHlOb2RlLmNsYXNzTGlzdCkgZW1wdHlOb2RlLmNsYXNzTGlzdC5hZGQoInZmZWVkLWVtcHR5Iik7CiAgICB0aGlzLmdyaWRFbC5hcHBlbmRDaGlsZChlbXB0eU5vZGUpOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fcmVuZGVyRXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBpZiAodGhpcy5sYXlvdXQpIHRoaXMubGF5b3V0LmNsZWFyKCk7CiAgICBpZiAodGhpcy5zdGF0dXNFbCkgdGhpcy5zdGF0dXNFbC5pbm5lckhUTUwgPSAiIjsKICAgIHZhciBkZXRhaWwgPSAoZXJyICYmIGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogIlNvbWV0aGluZyB3ZW50IHdyb25nIGxvYWRpbmcgdGhlIGZlZWQuIjsKCiAgICB2YXIgbm9kZSA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidi1lbXB0eSB2ZmVlZC1lcnJvciIsIHJvbGU6ICJhbGVydCIgfSwgWwogICAgICBlbCgiZGl2IiwgeyBjbGFzczogInYtZW1wdHlfX2ljb24iLCAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIsIGh0bWw6IGVycm9yR2x5cGgoKSB9KSwKICAgICAgZWwoInAiLCB7IGNsYXNzOiAidi1lbXB0eV9fdGl0bGUiLCB0ZXh0OiAiV2UgY291bGRu4oCZdCBsb2FkIGluc3BpcmF0aW9uLiIgfSksCiAgICAgIGVsKCJwIiwgeyBjbGFzczogInYtZW1wdHlfX3N1YiIsIHRleHQ6IGRldGFpbCB9KSwKICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgYiA9IGVsKCJidXR0b24iLCB7IGNsYXNzOiAidi1jdGEgdi1jdGEtLXByaW1hcnkiLCB0eXBlOiAiYnV0dG9uIiwgdGV4dDogIlRyeSBhZ2FpbiIgfSk7CiAgICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsgc2VsZi5fcmVsb2FkKCk7IH0pOwogICAgICAgIHJldHVybiBiOwogICAgICB9KSgpCiAgICBdKTsKICAgIHRoaXMuZ3JpZEVsLmFwcGVuZENoaWxkKG5vZGUpOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fc2V0dXBPYnNlcnZlciA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIGlmICghKCJJbnRlcnNlY3Rpb25PYnNlcnZlciIgaW4gd2luZG93KSB8fCAhdGhpcy5zZW50aW5lbCkgcmV0dXJuOwogICAgdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbiAoZW50cmllcykgewogICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICBpZiAoZS5pc0ludGVyc2VjdGluZykgc2VsZi5sb2FkTmV4dCgpOwogICAgICB9KTsKICAgIH0sIHsgcm9vdE1hcmdpbjogIjYwMHB4IDBweCIgfSk7CiAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy5zZW50aW5lbCk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9zZXR1cFJlc2l6ZSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHRoaXMuX29uUmVzaXplID0gZGVib3VuY2UoZnVuY3Rpb24gKCkgewogICAgICBzZWxmLl9yZWZsb3dDb2x1bW5zKCk7CiAgICB9LCAxNjApOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIHRoaXMuX29uUmVzaXplKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTsKICAgIHRoaXMuX3JlcVRva2VuKys7CiAgICB1bnJlZ2lzdGVyU3RhdGVzKHRoaXMuc3RhdGVzKTsKICAgIHRoaXMuc3RhdGVzID0gW107CiAgICBpZiAodGhpcy5vYnNlcnZlcikgeyB0cnkgeyB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTsgfSBjYXRjaCAoZSkge30gdGhpcy5vYnNlcnZlciA9IG51bGw7IH0KICAgIGlmICh0aGlzLl9vblJlc2l6ZSkgeyB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIiwgdGhpcy5fb25SZXNpemUpOyB0aGlzLl9vblJlc2l6ZSA9IG51bGw7IH0KICAgIGlmICh0aGlzLl9vcHRzUmVmICYmIHRoaXMuX29wdHNSZWYuY2xvc2UpIHsgdHJ5IHsgdGhpcy5fb3B0c1JlZi5jbG9zZSgpOyB9IGNhdGNoIChlKSB7fSB0aGlzLl9vcHRzUmVmID0gbnVsbDsgfQogIH07CgogIGZ1bmN0aW9uIG9wdGlvbnNHbHlwaCgpIHsKICAgIHJldHVybiAnPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS43IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik00IDZoMTAiLz48cGF0aCBkPSJNMTggNmgyIi8+PGNpcmNsZSBjeD0iMTYiIGN5PSI2IiByPSIyIi8+PHBhdGggZD0iTTQgMTJoMiIvPjxwYXRoIGQ9Ik0xMCAxMmgxMCIvPjxjaXJjbGUgY3g9IjgiIGN5PSIxMiIgcj0iMiIvPjxwYXRoIGQ9Ik00IDE4aDEwIi8+PHBhdGggZD0iTTE4IDE4aDIiLz48Y2lyY2xlIGN4PSIxNiIgY3k9IjE4IiByPSIyIi8+PC9zdmc+JzsKICB9CgogIGZ1bmN0aW9uIGVycm9yR2x5cGgoKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5pY29uID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHZhciByID0gVi51aS5pY29uKCJhbGVydCIpOwogICAgICBpZiAodHlwZW9mIHIgPT09ICJzdHJpbmciKSByZXR1cm4gcjsKICAgICAgaWYgKHIgaW5zdGFuY2VvZiBOb2RlKSB7IHZhciBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7IGQuYXBwZW5kQ2hpbGQocik7IHJldHVybiBkLmlubmVySFRNTDsgfQogICAgfQogICAgcmV0dXJuICc8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTEwLjMgMy42IDEuOCAxOGEyIDIgMCAwIDAgMS43IDNoMTdhMiAyIDAgMCAwIDEuNy0zTDEzLjcgMy42YTIgMiAwIDAgMC0zLjQgMFoiLz48bGluZSB4MT0iMTIiIHkxPSI5IiB4Mj0iMTIiIHkyPSIxMyIvPjxsaW5lIHgxPSIxMiIgeTE9IjE3IiB4Mj0iMTIuMDEiIHkyPSIxNyIvPjwvc3ZnPic7CiAgfQoKICB2YXIgY3VycmVudCA9IG51bGw7CgogIFYudmlld3MuZmVlZCA9IHsKICAgIHJlbmRlcjogZnVuY3Rpb24gKHJvb3QsIHBhcmFtcykgewogICAgICBpZiAoIXJvb3QpIHJldHVybjsKICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgICBpZiAoY3VycmVudCkgeyBjdXJyZW50LmRlc3Ryb3koKTsgY3VycmVudCA9IG51bGw7IH0KICAgICAgdmFyIHRhZyA9IChwYXJhbXMudGFnIHx8ICIiKS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICBjdXJyZW50ID0gbmV3IEZlZWRDb250cm9sbGVyKHsgbW91bnQ6IHJvb3QsIHRhZzogdGFnLCBpbmxpbmU6IGZhbHNlIH0pOwogICAgICBjdXJyZW50LnJlbmRlcigpOwogICAgfSwKCiAgICB0ZWFyZG93bjogZnVuY3Rpb24gKCkgewogICAgICBpZiAoY3VycmVudCkgeyBjdXJyZW50LmRlc3Ryb3koKTsgY3VycmVudCA9IG51bGw7IH0KICAgIH0sCgogICAgcmVuZGVySW5saW5lOiBmdW5jdGlvbiAoY29udGFpbmVyLCBvcHRzKSB7CiAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm4gbnVsbDsKICAgICAgb3B0cyA9IG9wdHMgfHwge307CiAgICAgIHZhciBjdHJsID0gbmV3IEZlZWRDb250cm9sbGVyKHsKICAgICAgICBtb3VudDogY29udGFpbmVyLAogICAgICAgIHRhZzogKG9wdHMudGFnIHx8ICIiKS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLAogICAgICAgIGlubGluZTogdHJ1ZSwKICAgICAgICBsaW1pdDogMCwKICAgICAgICBwZXI6IElOTElORV9ERUZBVUxULAogICAgICAgIHNob3dDaGlwczogZmFsc2UsCiAgICAgICAgc2hvd0hlYWRlcjogZmFsc2UsCiAgICAgICAgc2hvd09wdGlvbnM6IGZhbHNlLAogICAgICAgIG9uQXBwbHk6IG9wdHMub25BcHBseQogICAgICB9KTsKICAgICAgY3RybC5yZW5kZXIoKTsKICAgICAgcmV0dXJuIGN0cmw7CiAgICB9LAoKICAgIGFwcGx5RXhhbXBsZVRvQ3JlYXRvcjogYXBwbHlFeGFtcGxlVG9DcmVhdG9yCiAgfTsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvcHJlc2V0cy5qcyA9PT09PSAqLwooZnVuY3Rpb24gKCkgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIFYgPSB3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9OwogIFYuc3RhdGUgPSBWLnN0YXRlIHx8IHt9OwogIGlmICghQXJyYXkuaXNBcnJheShWLnN0YXRlLmN1c3RvbVByZXNldHMpKSBWLnN0YXRlLmN1c3RvbVByZXNldHMgPSBbXTsKCiAgZnVuY3Rpb24gdWkoKSB7IHJldHVybiBWLnVpIHx8IHt9OyB9CiAgZnVuY3Rpb24gYXBpKCkgeyByZXR1cm4gVi5hcGkgfHwge307IH0KICBmdW5jdGlvbiBzdG9yZSgpIHsgcmV0dXJuIFYuc3RvcmUgfHwge307IH0KICBmdW5jdGlvbiB1dGlsKCkgeyByZXR1cm4gVi51dGlsIHx8IHt9OyB9CgogIGZ1bmN0aW9uIGVsKHRhZywgYXR0cnMsIGtpZHMpIHsKICAgIGlmICh1aSgpLmVsKSByZXR1cm4gdWkoKS5lbC5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMgJiYgdHlwZW9mIGF0dHJzID09PSAib2JqZWN0IikgewogICAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICAgIHZhciB2ID0gYXR0cnNba107CiAgICAgICAgaWYgKHYgPT0gbnVsbCB8fCB2ID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgIGlmIChrID09PSAiY2xhc3MiIHx8IGsgPT09ICJjbGFzc05hbWUiKSBub2RlLmNsYXNzTmFtZSA9IHY7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gInRleHQiKSBub2RlLnRleHRDb250ZW50ID0gdjsKICAgICAgICBlbHNlIGlmIChrID09PSAiaHRtbCIpIG5vZGUuaW5uZXJIVE1MID0gdjsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoIm9uIikgPT09IDAgJiYgdHlwZW9mIHYgPT09ICJmdW5jdGlvbiIpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHYpOwogICAgICAgIGVsc2UgaWYgKGsuaW5kZXhPZigiZGF0YS0iKSA9PT0gMCkgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdik7CiAgICAgICAgZWxzZSBub2RlLnNldEF0dHJpYnV0ZShrLCB2ID09PSB0cnVlID8gIiIgOiB2KTsKICAgICAgfSk7CiAgICB9CiAgICB2YXIgcmVzdCA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgIHJlc3QuZm9yRWFjaChmdW5jdGlvbiBhcHBlbmRLaWQoYykgewogICAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlKSByZXR1cm47CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGMpKSByZXR1cm4gYy5mb3JFYWNoKGFwcGVuZEtpZCk7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoYy5ub2RlVHlwZSA/IGMgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICAgIH0pOwogICAgcmV0dXJuIG5vZGU7CiAgfQogIGZ1bmN0aW9uIGljb24obmFtZSkgewogICAgaWYgKCF1aSgpLmljb24pIHJldHVybiAiIjsKICAgIHZhciBnb3QgPSB1aSgpLmljb24obmFtZSk7CiAgICBpZiAodHlwZW9mIGdvdCA9PT0gInN0cmluZyIpIHJldHVybiBnb3Q7CiAgICBpZiAoZ290ICYmIGdvdC5ub2RlVHlwZSAmJiB0eXBlb2YgZ290Lm91dGVySFRNTCA9PT0gInN0cmluZyIpIHJldHVybiBnb3Qub3V0ZXJIVE1MOwogICAgcmV0dXJuICIiOwogIH0KICBmdW5jdGlvbiB0b2FzdChtc2csIGtpbmQpIHsgaWYgKHVpKCkudG9hc3QpIHVpKCkudG9hc3QobXNnLCBraW5kKTsgZWxzZSBpZiAoc3RvcmUoKS5lbWl0KSBzdG9yZSgpLmVtaXQoInRvYXN0IiwgeyBtc2c6IG1zZywga2luZDoga2luZCB9KTsgfQogIGZ1bmN0aW9uIHV1aWQoKSB7CiAgICBpZiAodXRpbCgpLnV1aWQpIHJldHVybiB1dGlsKCkudXVpZCgpOwogICAgaWYgKHdpbmRvdy5jcnlwdG8gJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpOwogICAgcmV0dXJuICJ4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgiLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHsKICAgICAgdmFyIHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDAsIHYgPSBjID09PSAieCIgPyByIDogKHIgJiAweDMpIHwgMHg4OyByZXR1cm4gdi50b1N0cmluZygxNik7CiAgICB9KTsKICB9CgogIHZhciBMU19LRVkgPSAidmFtcF93ZWJfY3VzdG9tUHJlc2V0cyI7CiAgZnVuY3Rpb24gcGVyc2lzdCgpIHsKICAgIGlmIChzdG9yZSgpLnNldCkgc3RvcmUoKS5zZXQoImN1c3RvbVByZXNldHMiLCBWLnN0YXRlLmN1c3RvbVByZXNldHMpOwogICAgaWYgKHN0b3JlKCkuc2F2ZSkgeyBzdG9yZSgpLnNhdmUoKTsgcmV0dXJuOyB9CiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMU19LRVksIEpTT04uc3RyaW5naWZ5KFYuc3RhdGUuY3VzdG9tUHJlc2V0cykpOyB9IGNhdGNoIChlKSB7fQogIH0KICBmdW5jdGlvbiByZXN0b3JlKCkgewogICAgdmFyIGNhY2hlZCA9IHN0b3JlKCkuZ2V0ID8gc3RvcmUoKS5nZXQoImN1c3RvbVByZXNldHMiKSA6IG51bGw7CiAgICBpZiAoQXJyYXkuaXNBcnJheShjYWNoZWQpICYmIGNhY2hlZC5sZW5ndGgpIHsgVi5zdGF0ZS5jdXN0b21QcmVzZXRzID0gY2FjaGVkLm1hcChub3JtYWxpemVQcmVzZXQpOyByZXR1cm47IH0KICAgIHRyeSB7CiAgICAgIHZhciByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19LRVkpOwogICAgICBpZiAocmF3KSBWLnN0YXRlLmN1c3RvbVByZXNldHMgPSAoSlNPTi5wYXJzZShyYXcpIHx8IFtdKS5tYXAobm9ybWFsaXplUHJlc2V0KTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiBub3dJU08oKSB7IHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXC5cZCsvLCAiIik7IH0KICBmdW5jdGlvbiBub3JtYWxpemVQcmVzZXQocCkgewogICAgcCA9IHAgfHwge307CiAgICByZXR1cm4gewogICAgICBpZDogcC5pZCB8fCB1dWlkKCksCiAgICAgIG5hbWU6IChwLm5hbWUgfHwgIiIpLnRyaW0oKSwKICAgICAgcHJvbXB0OiAocC5wcm9tcHQgfHwgIiIpLnRyaW0oKSwKICAgICAgbmVnYXRpdmVQcm9tcHQ6IChwLm5lZ2F0aXZlUHJvbXB0IHx8ICIiKS50cmltKCkgfHwgbnVsbCwKICAgICAgbW9kZWw6IHAubW9kZWwgfHwgbnVsbCwKICAgICAgY3JlYXRlZEF0OiBwLmNyZWF0ZWRBdCB8fCBub3dJU08oKSwKICAgICAgdXBkYXRlZEF0OiBwLnVwZGF0ZWRBdCB8fCBub3dJU08oKQogICAgfTsKICB9CgogIHZhciBJTkRVU1RSWV9SRUxFVkFOQ0UgPSB7CiAgICByZWFsRXN0YXRlOiBbInJlbW92ZUFsbEZ1cm5pdHVyZSIsICJyZW1vdmVDbHV0dGVyIiwgInJlbW92ZUZ1cm5pdHVyZUFuZENsdXR0ZXIiLCAicmVtb3ZlUGVvcGxlIiwgInJlbW92ZVJlZmxlY3Rpb25zIiwgImltcHJvdmVMaWdodGluZyIsICJkZXBlcnNvbmFsaXplIiwgIm5ldXRyYWxQYWludCIsICJmaXhXYWxscyIsICJhZGRDdXJiQXBwZWFsIiwgImltcHJvdmVFeHRlcmlvciIsICJpbXByb3ZlU2tpZXMiLCAibW9kZXJuU3RhZ2luZyIsICJ0cmFuc2l0aW9uYWxTdGFnaW5nIiwgIm1pbmltYWxpc3RTdGFnaW5nIiwgIndhcm1NaW5pbWFsaXN0U3RhZ2luZyIsICJsdXh1cnlTdGFnaW5nIiwgImFkZExhbmRzY2FwaW5nIiwgImNsZWFuTGFuZHNjYXBpbmciLCAiaW1wcm92ZUVudHJ5d2F5Il0sCiAgICBpbnRlcmlvckRlc2lnbjogWyJyZW1vdmVBbGxGdXJuaXR1cmUiLCAicmVtb3ZlQ2x1dHRlciIsICJyZW1vdmVGdXJuaXR1cmVBbmRDbHV0dGVyIiwgImltcHJvdmVMaWdodGluZyIsICJuZXV0cmFsUGFpbnQiLCAiZml4V2FsbHMiLCAibW9kZXJuaXplIiwgImRlcGVyc29uYWxpemUiLCAiYWRkUGxhbnRzIiwgIm1vZGVyblN0YWdpbmciLCAidHJhbnNpdGlvbmFsU3RhZ2luZyIsICJtaW5pbWFsaXN0U3RhZ2luZyIsICJ3YXJtTWluaW1hbGlzdFN0YWdpbmciLCAibWlkQ2VudHVyeU1vZGVyblN0YWdpbmciLCAiYXJ0RGVjb1N0YWdpbmciLCAiYmlvcGhpbGljU3RhZ2luZyIsICJsdXh1cnlTdGFnaW5nIl0sCiAgICBhcmNoaXRlY3R1cmU6IFsiaW1wcm92ZUV4dGVyaW9yIiwgIm1vZGVybml6ZUV4dGVyaW9yIiwgImltcHJvdmVFbnRyeXdheSIsICJpbXByb3ZlU2tpZXMiLCAiaW1wcm92ZVdlYXRoZXIiLCAiZml4V2FsbHMiLCAiYWRkT3V0ZG9vckxpdmluZyIsICJ2aW50YWdlRXh0ZXJpb3IiLCAibW9kZXJuaXplIiwgImFkZEN1cmJBcHBlYWwiLCAicmVtb3ZlUmVmbGVjdGlvbnMiXSwKICAgIGxhbmRzY2FwaW5nOiBbImNsZWFuTGFuZHNjYXBpbmciLCAiYWRkTGFuZHNjYXBpbmciLCAiYWRkQ3VyYkFwcGVhbCIsICJhZGRPdXRkb29yTGl2aW5nIiwgImFkZFBsYW50cyIsICJhZGRQb29sQXJlYSIsICJpbXByb3ZlV2VhdGhlciIsICJjaGFuZ2VTZWFzb24iLCAiaW1wcm92ZVNraWVzIiwgImJpb3BoaWxpY1N0YWdpbmciXSwKICAgIGZ1cm5pc2hpbmc6IFsicmVtb3ZlQWxsRnVybml0dXJlIiwgInJlbW92ZUZ1cm5pdHVyZUFuZENsdXR0ZXIiLCAibW9kZXJuU3RhZ2luZyIsICJ0cmFuc2l0aW9uYWxTdGFnaW5nIiwgIm1pbmltYWxpc3RTdGFnaW5nIiwgIndhcm1NaW5pbWFsaXN0U3RhZ2luZyIsICJtaWRDZW50dXJ5TW9kZXJuU3RhZ2luZyIsICJhcnREZWNvU3RhZ2luZyIsICJiaW9waGlsaWNTdGFnaW5nIiwgImx1eHVyeVN0YWdpbmciLCAiYWRkUGxhbnRzIl0sCiAgICBjb25zdHJ1Y3Rpb246IFsiZml4V2FsbHMiLCAibmV1dHJhbFBhaW50IiwgImltcHJvdmVFeHRlcmlvciIsICJtb2Rlcm5pemVFeHRlcmlvciIsICJyZW1vdmVDbHV0dGVyIiwgImltcHJvdmVMaWdodGluZyIsICJhZGRPdXRkb29yTGl2aW5nIiwgImltcHJvdmVFbnRyeXdheSJdLAogICAgaG9tZU93bmVyOiBbInJlbW92ZUNsdXR0ZXIiLCAicmVtb3ZlRnVybml0dXJlQW5kQ2x1dHRlciIsICJpbXByb3ZlTGlnaHRpbmciLCAiaW1wcm92ZVdlYXRoZXIiLCAiY2xlYW5MYW5kc2NhcGluZyIsICJhZGRMYW5kc2NhcGluZyIsICJhZGRDdXJiQXBwZWFsIiwgIm5ldXRyYWxQYWludCIsICJhZGRQbGFudHMiLCAiY2hhbmdlU2Vhc29uIiwgImFkZFBvb2xBcmVhIiwgImltcHJvdmVFbnRyeXdheSIsICJtb2Rlcm5pemUiXQogIH07CgogIGZ1bmN0aW9uIHN3aXp6bGVzKCkgeyByZXR1cm4gKFYuZGF0YSAmJiBBcnJheS5pc0FycmF5KFYuZGF0YS5zd2l6emxlcykpID8gVi5kYXRhLnN3aXp6bGVzIDogW107IH0KCiAgZnVuY3Rpb24gaXNSZWxldmFudChzd2l6emxlS2V5LCBzZWxlY3RlZEluZHVzdHJpZXMpIHsKICAgIGlmICghc2VsZWN0ZWRJbmR1c3RyaWVzIHx8ICFzZWxlY3RlZEluZHVzdHJpZXMubGVuZ3RoKSByZXR1cm4gdHJ1ZTsKICAgIHZhciBtYXBwZWRBdEFsbCA9IGZhbHNlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZEluZHVzdHJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGxpc3QgPSBJTkRVU1RSWV9SRUxFVkFOQ0Vbc2VsZWN0ZWRJbmR1c3RyaWVzW2ldXTsKICAgICAgaWYgKCFsaXN0KSBjb250aW51ZTsKICAgICAgbWFwcGVkQXRBbGwgPSB0cnVlOwogICAgICBpZiAobGlzdC5pbmRleE9mKHN3aXp6bGVLZXkpICE9PSAtMSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gIW1hcHBlZEF0QWxsOwogIH0KCiAgZnVuY3Rpb24gcmVsZXZhbnRTd2l6emxlcygpIHsKICAgIHZhciBzZWwgPSAoVi5zdGF0ZSAmJiBBcnJheS5pc0FycmF5KFYuc3RhdGUuaW5kdXN0cmllcykpID8gVi5zdGF0ZS5pbmR1c3RyaWVzIDogW107CiAgICB2YXIgbGlzdCA9IHN3aXp6bGVzKCkuZmlsdGVyKGZ1bmN0aW9uIChzKSB7IHJldHVybiBpc1JlbGV2YW50KHMua2V5LCBzZWwpOyB9KTsKICAgIHJldHVybiBsaXN0Lmxlbmd0aCA/IGxpc3QgOiBzd2l6emxlcygpOwogIH0KCiAgdmFyIF9sb2FkaW5nID0gZmFsc2UsIF9sb2FkZWQgPSBmYWxzZSwgX2xvYWRQcm9taXNlID0gbnVsbDsKCiAgZnVuY3Rpb24gbG9hZChmb3JjZSkgewogICAgaWYgKF9sb2FkaW5nKSByZXR1cm4gX2xvYWRQcm9taXNlOwogICAgaWYgKF9sb2FkZWQgJiYgIWZvcmNlKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFYuc3RhdGUuY3VzdG9tUHJlc2V0cyk7CiAgICBpZiAoIWFwaSgpLnByZXNldHMpIHsgcmVzdG9yZSgpOyBfbG9hZGVkID0gdHJ1ZTsgcmV0dXJuIFByb21pc2UucmVzb2x2ZShWLnN0YXRlLmN1c3RvbVByZXNldHMpOyB9CiAgICBfbG9hZGluZyA9IHRydWU7CiAgICB2YXIgY2xpZW50TW9kZWxzID0ge307CiAgICBWLnN0YXRlLmN1c3RvbVByZXNldHMuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAocC5tb2RlbCkgY2xpZW50TW9kZWxzW3AuaWRdID0gcC5tb2RlbDsgfSk7CiAgICBfbG9hZFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoYXBpKCkucHJlc2V0cygpKS50aGVuKGZ1bmN0aW9uIChyb3dzKSB7CiAgICAgIHZhciBhcnIgPSAoQXJyYXkuaXNBcnJheShyb3dzKSA/IHJvd3MgOiBbXSkubWFwKGZ1bmN0aW9uIChyKSB7CiAgICAgICAgdmFyIG4gPSBub3JtYWxpemVQcmVzZXQocik7CiAgICAgICAgaWYgKCFuLm1vZGVsICYmIGNsaWVudE1vZGVsc1tuLmlkXSkgbi5tb2RlbCA9IGNsaWVudE1vZGVsc1tuLmlkXTsKICAgICAgICByZXR1cm4gbjsKICAgICAgfSk7CiAgICAgIFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IGFycjsKICAgICAgcGVyc2lzdCgpOwogICAgICBfbG9hZGVkID0gdHJ1ZTsKICAgICAgZW1pdENoYW5nZWQoKTsKICAgICAgcmV0dXJuIGFycjsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgcmVzdG9yZSgpOwogICAgICBfbG9hZGVkID0gdHJ1ZTsKICAgICAgcmV0dXJuIFYuc3RhdGUuY3VzdG9tUHJlc2V0czsKICAgIH0pLnRoZW4oZnVuY3Rpb24gKHIpIHsgX2xvYWRpbmcgPSBmYWxzZTsgcmV0dXJuIHI7IH0pOwogICAgcmV0dXJuIF9sb2FkUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZShkYXRhKSB7CiAgICB2YXIgbG9jYWwgPSBub3JtYWxpemVQcmVzZXQoZGF0YSk7CiAgICB2YXIgYm9keSA9IHdpcmVCb2R5KGxvY2FsKTsKICAgIFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5jb25jYXQoW2xvY2FsXSk7CiAgICBwZXJzaXN0KCk7CiAgICBlbWl0Q2hhbmdlZCgpOwogICAgaWYgKCFhcGkoKS5jcmVhdGVQcmVzZXQpIHJldHVybiBQcm9taXNlLnJlc29sdmUobG9jYWwpOwogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkoKS5jcmVhdGVQcmVzZXQoYm9keSkpLnRoZW4oZnVuY3Rpb24gKHJvdykgewogICAgICB2YXIgc2VydmVyID0gbm9ybWFsaXplUHJlc2V0KHJvdyB8fCB7fSk7CiAgICAgIHZhciBpZHggPSBWLnN0YXRlLmN1c3RvbVByZXNldHMuaW5kZXhPZihsb2NhbCk7CiAgICAgIHNlcnZlci5tb2RlbCA9IGxvY2FsLm1vZGVsIHx8IHNlcnZlci5tb2RlbDsKICAgICAgaWYgKGlkeCAhPT0gLTEpIFYuc3RhdGUuY3VzdG9tUHJlc2V0c1tpZHhdID0gc2VydmVyOyBlbHNlIFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5wdXNoKHNlcnZlcik7CiAgICAgIHBlcnNpc3QoKTsgZW1pdENoYW5nZWQoKTsKICAgICAgcmV0dXJuIHNlcnZlcjsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgcm9sbGJhY2tSZW1vdmUobG9jYWwuaWQpOwogICAgICB0b2FzdCgiQ291bGRuJ3Qgc2F2ZSBwcmVzZXQuICIgKyBlcnJNc2coZXJyKSwgImVycm9yIik7CiAgICAgIHRocm93IGVycjsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlKGlkLCBkYXRhKSB7CiAgICB2YXIgaWR4ID0gaW5kZXhPZihpZCk7CiAgICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGNyZWF0ZShkYXRhKTsKICAgIHZhciBwcmV2ID0gVi5zdGF0ZS5jdXN0b21QcmVzZXRzW2lkeF07CiAgICB2YXIgbmV4dCA9IG5vcm1hbGl6ZVByZXNldChPYmplY3QuYXNzaWduKHt9LCBwcmV2LCBkYXRhLCB7IGlkOiBpZCwgdXBkYXRlZEF0OiBub3dJU08oKSB9KSk7CiAgICBWLnN0YXRlLmN1c3RvbVByZXNldHNbaWR4XSA9IG5leHQ7CiAgICBwZXJzaXN0KCk7IGVtaXRDaGFuZ2VkKCk7CiAgICBpZiAoIWFwaSgpLnVwZGF0ZVByZXNldCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0KTsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYXBpKCkudXBkYXRlUHJlc2V0KGlkLCB3aXJlQm9keShuZXh0KSkpLnRoZW4oZnVuY3Rpb24gKHJvdykgewogICAgICB2YXIgc2VydmVyID0gbm9ybWFsaXplUHJlc2V0KHJvdyB8fCBuZXh0KTsKICAgICAgc2VydmVyLm1vZGVsID0gbmV4dC5tb2RlbCB8fCBzZXJ2ZXIubW9kZWw7CiAgICAgIHZhciBpID0gaW5kZXhPZihpZCk7IGlmIChpICE9PSAtMSkgVi5zdGF0ZS5jdXN0b21QcmVzZXRzW2ldID0gc2VydmVyOwogICAgICBwZXJzaXN0KCk7IGVtaXRDaGFuZ2VkKCk7CiAgICAgIHJldHVybiBzZXJ2ZXI7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIHZhciBpID0gaW5kZXhPZihpZCk7IGlmIChpICE9PSAtMSkgVi5zdGF0ZS5jdXN0b21QcmVzZXRzW2ldID0gcHJldjsKICAgICAgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOwogICAgICB0b2FzdCgiQ291bGRuJ3QgdXBkYXRlIHByZXNldC4gIiArIGVyck1zZyhlcnIpLCAiZXJyb3IiKTsKICAgICAgdGhyb3cgZXJyOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZW1vdmUoaWQpIHsKICAgIHZhciBpZHggPSBpbmRleE9mKGlkKTsKICAgIGlmIChpZHggPT09IC0xKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB2YXIgcHJldiA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0c1tpZHhdOwogICAgVi5zdGF0ZS5jdXN0b21QcmVzZXRzID0gVi5zdGF0ZS5jdXN0b21QcmVzZXRzLmZpbHRlcihmdW5jdGlvbiAocCkgeyByZXR1cm4gcC5pZCAhPT0gaWQ7IH0pOwogICAgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOwogICAgaWYgKCFhcGkoKS5kZWxldGVQcmVzZXQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYXBpKCkuZGVsZXRlUHJlc2V0KGlkKSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICB2YXIgYXJyID0gVi5zdGF0ZS5jdXN0b21QcmVzZXRzLnNsaWNlKCk7CiAgICAgIGFyci5zcGxpY2UoTWF0aC5taW4oaWR4LCBhcnIubGVuZ3RoKSwgMCwgcHJldik7CiAgICAgIFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IGFycjsKICAgICAgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOwogICAgICB0b2FzdCgiQ291bGRuJ3QgZGVsZXRlIHByZXNldC4gIiArIGVyck1zZyhlcnIpLCAiZXJyb3IiKTsKICAgICAgdGhyb3cgZXJyOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZW9yZGVyKG9yZGVyZWRJZHMpIHsKICAgIHZhciBieUlkID0ge307IFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7IGJ5SWRbcC5pZF0gPSBwOyB9KTsKICAgIHZhciBwcmV2ID0gVi5zdGF0ZS5jdXN0b21QcmVzZXRzLnNsaWNlKCk7CiAgICB2YXIgbmV4dCA9IG9yZGVyZWRJZHMubWFwKGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gYnlJZFtpZF07IH0pLmZpbHRlcihCb29sZWFuKTsKICAgIHByZXYuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAob3JkZXJlZElkcy5pbmRleE9mKHAuaWQpID09PSAtMSkgbmV4dC5wdXNoKHApOyB9KTsKICAgIFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IG5leHQ7IHBlcnNpc3QoKTsgZW1pdENoYW5nZWQoKTsKICAgIGlmICghYXBpKCkucmVvcmRlclByZXNldHMpIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV4dCk7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaSgpLnJlb3JkZXJQcmVzZXRzKG5leHQubWFwKGZ1bmN0aW9uIChwKSB7IHJldHVybiBwLmlkOyB9KSkpLnRoZW4oZnVuY3Rpb24gKHJvd3MpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocm93cykgJiYgcm93cy5sZW5ndGgpIHsKICAgICAgICB2YXIgbW9kZWxzID0ge307IHByZXYuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAocC5tb2RlbCkgbW9kZWxzW3AuaWRdID0gcC5tb2RlbDsgfSk7CiAgICAgICAgVi5zdGF0ZS5jdXN0b21QcmVzZXRzID0gcm93cy5tYXAoZnVuY3Rpb24gKHIpIHsgdmFyIG4gPSBub3JtYWxpemVQcmVzZXQocik7IGlmICghbi5tb2RlbCAmJiBtb2RlbHNbbi5pZF0pIG4ubW9kZWwgPSBtb2RlbHNbbi5pZF07IHJldHVybiBuOyB9KTsKICAgICAgICBwZXJzaXN0KCk7IGVtaXRDaGFuZ2VkKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIFYuc3RhdGUuY3VzdG9tUHJlc2V0czsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgVi5zdGF0ZS5jdXN0b21QcmVzZXRzID0gcHJldjsgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOyByZXR1cm4gcHJldjsgfSk7CiAgfQoKICBmdW5jdGlvbiBpbmRleE9mKGlkKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgVi5zdGF0ZS5jdXN0b21QcmVzZXRzLmxlbmd0aDsgaSsrKSBpZiAoVi5zdGF0ZS5jdXN0b21QcmVzZXRzW2ldLmlkID09PSBpZCkgcmV0dXJuIGk7IHJldHVybiAtMTsgfQogIGZ1bmN0aW9uIHJvbGxiYWNrUmVtb3ZlKGlkKSB7IFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5maWx0ZXIoZnVuY3Rpb24gKHApIHsgcmV0dXJuIHAuaWQgIT09IGlkOyB9KTsgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOyB9CiAgZnVuY3Rpb24gZW1pdENoYW5nZWQoKSB7IGlmIChzdG9yZSgpLmVtaXQpIHN0b3JlKCkuZW1pdCgicHJlc2V0czpjaGFuZ2VkIiwgVi5zdGF0ZS5jdXN0b21QcmVzZXRzKTsgfQogIGZ1bmN0aW9uIHdpcmVCb2R5KHApIHsgcmV0dXJuIHsgaWQ6IHAuaWQsIG5hbWU6IHAubmFtZSwgcHJvbXB0OiBwLnByb21wdCwgbmVnYXRpdmVQcm9tcHQ6IHAubmVnYXRpdmVQcm9tcHQgfHwgbnVsbCB9OyB9CiAgZnVuY3Rpb24gZXJyTXNnKGVycikgeyByZXR1cm4gKGVyciAmJiBlcnIubWVzc2FnZSkgPyBlcnIubWVzc2FnZSA6ICJQbGVhc2UgdHJ5IGFnYWluLiI7IH0KCiAgZnVuY3Rpb24gcmVuZGVyQ2hpcHMoY29udGFpbmVyLCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIGlmICh0eXBlb2YgY29udGFpbmVyID09PSAic3RyaW5nIikgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250YWluZXIpOwogICAgaWYgKCFjb250YWluZXIpIHJldHVybiB7IHJlZnJlc2g6IGZ1bmN0aW9uICgpIHt9LCBzZXRBY3RpdmU6IGZ1bmN0aW9uICgpIHt9LCBjbGVhckFjdGl2ZTogZnVuY3Rpb24gKCkge30sIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHt9IH07CgogICAgdmFyIG9uUGljayA9IHR5cGVvZiBvcHRzLm9uUGljayA9PT0gImZ1bmN0aW9uIiA/IG9wdHMub25QaWNrCiAgICAgIDogKHR5cGVvZiBvcHRzLm9uU2VsZWN0ID09PSAiZnVuY3Rpb24iID8gb3B0cy5vblNlbGVjdCA6IGZ1bmN0aW9uICgpIHt9KTsKICAgIHZhciBvbkluZHVzdHJpZXMgPSB0eXBlb2Ygb3B0cy5vbkluZHVzdHJpZXMgPT09ICJmdW5jdGlvbiIgPyBvcHRzLm9uSW5kdXN0cmllcyA6IG51bGw7CiAgICB2YXIgYWN0aXZlSWQgPSBvcHRzLnNlbGVjdGVkSWQgfHwgbnVsbDsKICAgIHZhciBhY3RpdmVLZXkgPSBvcHRzLnNlbGVjdGVkS2V5IHx8IG51bGw7CgogICAgdmFyIHNjcm9sbGVyID0gZWwoImRpdiIsIHsgImNsYXNzIjogInYtY2hpcC1yb3ciLCByb2xlOiAibGlzdGJveCIsICJhcmlhLWxhYmVsIjogIlN0eWxlIHByZXNldHMiLCB0YWJpbmRleDogIi0xIiB9KTsKICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoImFyaWEtYnVzeSIsICJmYWxzZSIpOwogICAgY29udGFpbmVyLmlubmVySFRNTCA9ICIiOwogICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHNjcm9sbGVyKTsKCiAgICBmdW5jdGlvbiBwaWNrQ3VzdG9tKHApIHsKICAgICAgYWN0aXZlSWQgPSBwLmlkOyBhY3RpdmVLZXkgPSBudWxsOyBtYXJrQWN0aXZlKCk7CiAgICAgIG9uUGljayh7IHNvdXJjZTogImN1c3RvbSIsIGlkOiBwLmlkLCBuYW1lOiBwLm5hbWUsIHByb21wdDogcC5wcm9tcHQsIG5lZ2F0aXZlUHJvbXB0OiBwLm5lZ2F0aXZlUHJvbXB0IHx8IG51bGwsIG1vZGVsOiBwLm1vZGVsIHx8IG51bGwgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBwaWNrU3dpenpsZShzKSB7CiAgICAgIGFjdGl2ZUtleSA9IHMua2V5OyBhY3RpdmVJZCA9IG51bGw7IG1hcmtBY3RpdmUoKTsKICAgICAgb25QaWNrKHsgc291cmNlOiAic3dpenpsZSIsIGlkOiBzLmtleSwga2V5OiBzLmtleSwgbmFtZTogcy5sYWJlbCwgcHJvbXB0OiBzLnByb21wdCwgbmVnYXRpdmVQcm9tcHQ6IG51bGwsIG1vZGVsOiBudWxsIH0pOwogICAgfQogICAgZnVuY3Rpb24gbWFya0FjdGl2ZSgpIHsKICAgICAgdmFyIG5vZGVzID0gc2Nyb2xsZXIucXVlcnlTZWxlY3RvckFsbCgiLnYtY2hpcCIpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIG4gPSBub2Rlc1tpXTsKICAgICAgICB2YXIgb24gPSAobi5kYXRhc2V0LnByZXNldElkICYmIG4uZGF0YXNldC5wcmVzZXRJZCA9PT0gYWN0aXZlSWQpIHx8CiAgICAgICAgICAgICAgICAgKG4uZGF0YXNldC5zd2l6emxlS2V5ICYmIG4uZGF0YXNldC5zd2l6emxlS2V5ID09PSBhY3RpdmVLZXkpOwogICAgICAgIG4uY2xhc3NMaXN0LnRvZ2dsZSgidi1jaGlwLS1hY3RpdmUiLCAhIW9uKTsKICAgICAgICBuLnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsIG9uID8gInRydWUiIDogImZhbHNlIik7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjaGlwKGxhYmVsLCBhdHRycywgb25DbGljaywgb25Db250ZXh0KSB7CiAgICAgIHZhciBjID0gZWwoImJ1dHRvbiIsIE9iamVjdC5hc3NpZ24oewogICAgICAgIHR5cGU6ICJidXR0b24iLCAiY2xhc3MiOiAidi1jaGlwIiwgcm9sZTogIm9wdGlvbiIsICJhcmlhLXNlbGVjdGVkIjogImZhbHNlIgogICAgICB9LCBhdHRycyB8fCB7fSksIGxhYmVsKTsKICAgICAgYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgb25DbGljayhjKTsgfSk7CiAgICAgIGlmIChvbkNvbnRleHQpIGMuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IG9uQ29udGV4dChjLCBlKTsgfSk7CiAgICAgIHJldHVybiBjOwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkKCkgewogICAgICBzY3JvbGxlci5pbm5lckhUTUwgPSAiIjsKCiAgICAgIHZhciBhZGRDaGlwID0gY2hpcCgKICAgICAgICBbZWwoInNwYW4iLCB7ICJjbGFzcyI6ICJ2LWNoaXBfX2ljb24iLCAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIsIGh0bWw6IGljb24oInBsdXMiKSB8fCAiKyIgfSldLAogICAgICAgIHsgImNsYXNzIjogInYtY2hpcCB2LWNoaXAtLWFkZCIsIHRpdGxlOiAiTmV3IGN1c3RvbSBwcmVzZXQiLCAiYXJpYS1sYWJlbCI6ICJDcmVhdGUgY3VzdG9tIHByZXNldCIgfSwKICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBvcGVuRWRpdG9yKG51bGwsIHsgb25TYXZlZDogZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgYnVpbGQoKTsKICAgICAgICAgICAgaWYgKHAgJiYgcC5pZCkgewogICAgICAgICAgICAgIGFjdGl2ZUlkID0gcC5pZDsgYWN0aXZlS2V5ID0gbnVsbDsgbWFya0FjdGl2ZSgpOwogICAgICAgICAgICAgIHZhciBub2RlID0gc2Nyb2xsZXIucXVlcnlTZWxlY3RvcignW2RhdGEtcHJlc2V0LWlkPSInICsgcC5pZCArICciXScpOwogICAgICAgICAgICAgIGlmIChub2RlKSBub2RlLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICJuZWFyZXN0IiwgaW5saW5lOiAiY2VudGVyIiB9KTsKICAgICAgICAgICAgICBwaWNrQ3VzdG9tKHApOwogICAgICAgICAgICB9CiAgICAgICAgICB9IH0pOwogICAgICAgIH0KICAgICAgKTsKICAgICAgc2Nyb2xsZXIuYXBwZW5kQ2hpbGQoYWRkQ2hpcCk7CgogICAgICB2YXIgY3VzdG9tcyA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0cyB8fCBbXTsKICAgICAgY3VzdG9tcy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7CiAgICAgICAgdmFyIGMgPSBjaGlwKAogICAgICAgICAgW2VsKCJzcGFuIiwgeyAiY2xhc3MiOiAidi1jaGlwX19pY29uIiwgImFyaWEtaGlkZGVuIjogInRydWUiLCBodG1sOiBpY29uKCJib29rbWFyayIpIHx8ICIiIH0pLCBlbCgic3BhbiIsIHt9LCBwLm5hbWUgfHwgIlVudGl0bGVkIildLAogICAgICAgICAgeyAiY2xhc3MiOiAidi1jaGlwIHYtY2hpcC0tY3VzdG9tIiwgImRhdGEtcHJlc2V0LWlkIjogcC5pZCwgdGl0bGU6IHAucHJvbXB0IHx8IHAubmFtZSB9LAogICAgICAgICAgZnVuY3Rpb24gKCkgeyBwaWNrQ3VzdG9tKHApOyB9LAogICAgICAgICAgZnVuY3Rpb24gKG5vZGUsIGUpIHsgc2hvd1ByZXNldE1lbnUocCwgbm9kZSwgZSwgYnVpbGQpOyB9CiAgICAgICAgKTsKICAgICAgICBhdHRhY2hMb25nUHJlc3MoYywgZnVuY3Rpb24gKGV2KSB7IHNob3dQcmVzZXRNZW51KHAsIGMsIGV2LCBidWlsZCk7IH0pOwogICAgICAgIHNjcm9sbGVyLmFwcGVuZENoaWxkKGMpOwogICAgICB9KTsKCiAgICAgIHZhciBzd3ogPSByZWxldmFudFN3aXp6bGVzKCk7CiAgICAgIHN3ei5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7CiAgICAgICAgc2Nyb2xsZXIuYXBwZW5kQ2hpbGQoY2hpcChzLmxhYmVsLCB7ICJjbGFzcyI6ICJ2LWNoaXAgdi1jaGlwLS1zd2l6emxlIiwgImRhdGEtc3dpenpsZS1rZXkiOiBzLmtleSwgdGl0bGU6IHMucHJvbXB0IH0sIGZ1bmN0aW9uICgpIHsgcGlja1N3aXp6bGUocyk7IH0pKTsKICAgICAgfSk7CgogICAgICB2YXIgc2VsID0gKFYuc3RhdGUgJiYgQXJyYXkuaXNBcnJheShWLnN0YXRlLmluZHVzdHJpZXMpKSA/IFYuc3RhdGUuaW5kdXN0cmllcyA6IFtdOwogICAgICBpZiAob25JbmR1c3RyaWVzIHx8IChWLmRhdGEgJiYgVi5kYXRhLmluZHVzdHJpZXMpKSB7CiAgICAgICAgdmFyIGxhYmVsID0gc2VsLmxlbmd0aCA/ICJJbmR1c3RyaWVzIMK3ICIgKyBzZWwubGVuZ3RoIDogIkluZHVzdHJpZXMiOwogICAgICAgIHNjcm9sbGVyLmFwcGVuZENoaWxkKGNoaXAoCiAgICAgICAgICBbZWwoInNwYW4iLCB7ICJjbGFzcyI6ICJ2LWNoaXBfX2ljb24iLCAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIsIGh0bWw6IGljb24oImVsbGlwc2lzIikgfHwgIiIgfSksIGVsKCJzcGFuIiwge30sIGxhYmVsKV0sCiAgICAgICAgICB7ICJjbGFzcyI6ICJ2LWNoaXAgdi1jaGlwLS1tb3JlIiwgdGl0bGU6ICJGaWx0ZXIgcHJlc2V0cyBieSBpbmR1c3RyeSIgfSwKICAgICAgICAgIGZ1bmN0aW9uICgpIHsgaWYgKG9uSW5kdXN0cmllcykgb25JbmR1c3RyaWVzKCk7IGVsc2Ugb3BlbkluZHVzdHJpZXNQaWNrZXIoZnVuY3Rpb24gKCkgeyBidWlsZCgpOyB9KTsgfQogICAgICAgICkpOwogICAgICB9CgogICAgICBtYXJrQWN0aXZlKCk7CiAgICB9CgogICAgc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChlLmtleSAhPT0gIkFycm93UmlnaHQiICYmIGUua2V5ICE9PSAiQXJyb3dMZWZ0IikgcmV0dXJuOwogICAgICB2YXIgY2hpcHMgPSBbXS5zbGljZS5jYWxsKHNjcm9sbGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIi52LWNoaXAiKSk7CiAgICAgIHZhciBpID0gY2hpcHMuaW5kZXhPZihkb2N1bWVudC5hY3RpdmVFbGVtZW50KTsKICAgICAgaWYgKGkgPT09IC0xKSByZXR1cm47CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgdmFyIG5leHQgPSBlLmtleSA9PT0gIkFycm93UmlnaHQiID8gTWF0aC5taW4oY2hpcHMubGVuZ3RoIC0gMSwgaSArIDEpIDogTWF0aC5tYXgoMCwgaSAtIDEpOwogICAgICBjaGlwc1tuZXh0XS5mb2N1cygpOwogICAgfSk7CgogICAgYnVpbGQoKTsKICAgIHZhciBvZmYxID0gc3RvcmUoKS5vbiA/IHN0b3JlKCkub24oInByZXNldHM6Y2hhbmdlZCIsIGJ1aWxkKSA6IG51bGw7CiAgICB2YXIgb2ZmMiA9IHN0b3JlKCkub24gPyBzdG9yZSgpLm9uKCJpbmR1c3RyaWVzOmNoYW5nZWQiLCBidWlsZCkgOiBudWxsOwoKICAgIGxvYWQoKS50aGVuKGZ1bmN0aW9uICgpIHsgYnVpbGQoKTsgfSk7CgogICAgcmV0dXJuIHsKICAgICAgcmVmcmVzaDogYnVpbGQsCiAgICAgIHNldEFjdGl2ZTogZnVuY3Rpb24gKHNlbCkgewogICAgICAgIGlmIChzZWwgJiYgc2VsLmlkKSB7IGFjdGl2ZUlkID0gc2VsLmlkOyBhY3RpdmVLZXkgPSBudWxsOyB9CiAgICAgICAgZWxzZSBpZiAoc2VsICYmIHNlbC5rZXkpIHsgYWN0aXZlS2V5ID0gc2VsLmtleTsgYWN0aXZlSWQgPSBudWxsOyB9CiAgICAgICAgZWxzZSB7IGFjdGl2ZUlkID0gbnVsbDsgYWN0aXZlS2V5ID0gbnVsbDsgfQogICAgICAgIG1hcmtBY3RpdmUoKTsKICAgICAgfSwKICAgICAgY2xlYXJBY3RpdmU6IGZ1bmN0aW9uICgpIHsgYWN0aXZlSWQgPSBudWxsOyBhY3RpdmVLZXkgPSBudWxsOyBtYXJrQWN0aXZlKCk7IH0sCiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHsgaWYgKG9mZjEpIG9mZjEoKTsgaWYgKG9mZjIpIG9mZjIoKTsgY29udGFpbmVyLmlubmVySFRNTCA9ICIiOyB9CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gYXR0YWNoTG9uZ1ByZXNzKG5vZGUsIGNiKSB7CiAgICB2YXIgdGltZXIgPSBudWxsLCBtb3ZlZCA9IGZhbHNlLCBzeCA9IDAsIHN5ID0gMDsKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIG1vdmVkID0gZmFsc2U7IHZhciB0ID0gZS50b3VjaGVzWzBdOyBzeCA9IHQuY2xpZW50WDsgc3kgPSB0LmNsaWVudFk7CiAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGlmICghbW92ZWQpIGNiKGUpOyB9LCA0ODApOwogICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLCBmdW5jdGlvbiAoZSkgewogICAgICB2YXIgdCA9IGUudG91Y2hlc1swXTsKICAgICAgaWYgKE1hdGguYWJzKHQuY2xpZW50WCAtIHN4KSA+IDEwIHx8IE1hdGguYWJzKHQuY2xpZW50WSAtIHN5KSA+IDEwKSB7IG1vdmVkID0gdHJ1ZTsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgfQogICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIGZ1bmN0aW9uICgpIHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgfSk7CiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoY2FuY2VsIiwgZnVuY3Rpb24gKCkgeyBjbGVhclRpbWVvdXQodGltZXIpOyB9KTsKICB9CgogIGZ1bmN0aW9uIHNob3dQcmVzZXRNZW51KHByZXNldCwgYW5jaG9yLCBldnQsIG9uQ2hhbmdlZCkgewogICAgdmFyIG1lbnUgPSBlbCgiZGl2IiwgeyAiY2xhc3MiOiAiZ2xhc3MtY2FyZCB2LWNoaXAtbWVudSIsIHJvbGU6ICJtZW51IiB9KTsKICAgIHZhciBlZGl0QnRuID0gZWwoImJ1dHRvbiIsIHsgdHlwZTogImJ1dHRvbiIsICJjbGFzcyI6ICJ2LWNoaXAtbWVudV9faXRlbSIsIHJvbGU6ICJtZW51aXRlbSIgfSwgW2VsKCJzcGFuIiwgeyAiY2xhc3MiOiAidi1jaGlwX19pY29uIiwgaHRtbDogaWNvbigiZWRpdCIpIHx8ICIiIH0pLCAiRWRpdCJdKTsKICAgIHZhciBkZWxCdG4gPSBlbCgiYnV0dG9uIiwgeyB0eXBlOiAiYnV0dG9uIiwgImNsYXNzIjogInYtY2hpcC1tZW51X19pdGVtIHYtY2hpcC1tZW51X19pdGVtLS1kYW5nZXIiLCByb2xlOiAibWVudWl0ZW0iIH0sIFtlbCgic3BhbiIsIHsgImNsYXNzIjogInYtY2hpcF9faWNvbiIsIGh0bWw6IGljb24oInRyYXNoIikgfHwgIiIgfSksICJEZWxldGUiXSk7CiAgICBtZW51LmFwcGVuZENoaWxkKGVkaXRCdG4pOyBtZW51LmFwcGVuZENoaWxkKGRlbEJ0bik7CgogICAgdmFyIGJhY2tkcm9wID0gZWwoImRpdiIsIHsgImNsYXNzIjogInYtY2hpcC1tZW51X19iYWNrZHJvcCIgfSk7CiAgICBmdW5jdGlvbiBjbG9zZSgpIHsgaWYgKG1lbnUucGFyZW50Tm9kZSkgbWVudS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG1lbnUpOyBpZiAoYmFja2Ryb3AucGFyZW50Tm9kZSkgYmFja2Ryb3AucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiYWNrZHJvcCk7IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBvbktleSwgdHJ1ZSk7IH0KICAgIGZ1bmN0aW9uIG9uS2V5KGUpIHsgaWYgKGUua2V5ID09PSAiRXNjYXBlIikgY2xvc2UoKTsgfQogICAgYmFja2Ryb3AuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBjbG9zZSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgb25LZXksIHRydWUpOwoKICAgIGVkaXRCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IGNsb3NlKCk7IG9wZW5FZGl0b3IocHJlc2V0LCB7IG9uU2F2ZWQ6IGZ1bmN0aW9uICgpIHsgaWYgKG9uQ2hhbmdlZCkgb25DaGFuZ2VkKCk7IH0gfSk7IH0pOwogICAgZGVsQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgICBjbG9zZSgpOwogICAgICB2YXIgZG9EZWxldGUgPSBmdW5jdGlvbiAoKSB7IHJlbW92ZShwcmVzZXQuaWQpLnRoZW4oZnVuY3Rpb24gKCkgeyB0b2FzdCgiUHJlc2V0IGRlbGV0ZWQiLCAic3VjY2VzcyIpOyBpZiAob25DaGFuZ2VkKSBvbkNoYW5nZWQoKTsgfSkuY2F0Y2goZnVuY3Rpb24gKCkge30pOyB9OwogICAgICBpZiAodWkoKS5jb25maXJtKSB1aSgpLmNvbmZpcm0oJ0RlbGV0ZSBwcmVzZXQgIicgKyAocHJlc2V0Lm5hbWUgfHwgIlVudGl0bGVkIikgKyAnIj8nLCB7IGRlc3RydWN0aXZlOiB0cnVlLCBjb25maXJtTGFiZWw6ICJEZWxldGUiIH0pLnRoZW4oZnVuY3Rpb24gKG9rKSB7IGlmIChvaykgZG9EZWxldGUoKTsgfSk7CiAgICAgIGVsc2UgaWYgKHdpbmRvdy5jb25maXJtKCdEZWxldGUgcHJlc2V0ICInICsgKHByZXNldC5uYW1lIHx8ICJVbnRpdGxlZCIpICsgJyI/JykpIGRvRGVsZXRlKCk7CiAgICB9KTsKCiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJhY2tkcm9wKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobWVudSk7CiAgICBwb3NpdGlvbk1lbnUobWVudSwgYW5jaG9yLCBldnQpOwogICAgZWRpdEJ0bi5mb2N1cygpOwogIH0KCiAgZnVuY3Rpb24gcG9zaXRpb25NZW51KG1lbnUsIGFuY2hvciwgZXZ0KSB7CiAgICB2YXIgciA9IGFuY2hvciAmJiBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID8gYW5jaG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogeyBsZWZ0OiAoZXZ0ICYmIGV2dC5jbGllbnRYKSB8fCAwLCBib3R0b206IChldnQgJiYgZXZ0LmNsaWVudFkpIHx8IDAsIHRvcDogKGV2dCAmJiBldnQuY2xpZW50WSkgfHwgMCwgd2lkdGg6IDAgfTsKICAgIHZhciBtdyA9IG1lbnUub2Zmc2V0V2lkdGggfHwgMTY4LCBtaCA9IG1lbnUub2Zmc2V0SGVpZ2h0IHx8IDk2OwogICAgdmFyIGxlZnQgPSBNYXRoLm1pbih3aW5kb3cuaW5uZXJXaWR0aCAtIG13IC0gOCwgTWF0aC5tYXgoOCwgci5sZWZ0KSk7CiAgICB2YXIgdG9wID0gci5ib3R0b20gKyA2OwogICAgaWYgKHRvcCArIG1oID4gd2luZG93LmlubmVySGVpZ2h0IC0gOCkgdG9wID0gTWF0aC5tYXgoOCwgci50b3AgLSBtaCAtIDYpOwogICAgbWVudS5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7CiAgICBtZW51LnN0eWxlLmxlZnQgPSBsZWZ0ICsgInB4IjsKICAgIG1lbnUuc3R5bGUudG9wID0gdG9wICsgInB4IjsKICAgIG1lbnUuc3R5bGUuekluZGV4ID0gIjEwMDAxIjsKICB9CgogIGZ1bmN0aW9uIG9wZW5FZGl0b3IocHJlc2V0LCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBlZGl0aW5nID0gISEocHJlc2V0ICYmIHByZXNldC5pZCk7CiAgICB2YXIgaW5pdGlhbCA9IG5vcm1hbGl6ZVByZXNldChPYmplY3QuYXNzaWduKHt9LCBlZGl0aW5nID8gcHJlc2V0IDoge30sIG9wdHMucHJlZmlsbCB8fCB7fSwgZWRpdGluZyA/IHt9IDogeyBpZDogbnVsbCB9KSk7CiAgICBpZiAoIWVkaXRpbmcpIGluaXRpYWwuaWQgPSBudWxsOwoKICAgIHZhciBuYW1lSW5wdXQgPSBlbCgiaW5wdXQiLCB7CiAgICAgIHR5cGU6ICJ0ZXh0IiwgImNsYXNzIjogInYtZmllbGQiLCBtYXhsZW5ndGg6ICI2MCIsIHBsYWNlaG9sZGVyOiAiUHJlc2V0IG5hbWUgKGUuZy4gU2NhbmRpIFN0YWdpbmcpIiwKICAgICAgdmFsdWU6IGluaXRpYWwubmFtZSB8fCAiIiwgImFyaWEtbGFiZWwiOiAiUHJlc2V0IG5hbWUiLCBhdXRvY29tcGxldGU6ICJvZmYiCiAgICB9KTsKICAgIHZhciBwcm9tcHRJbnB1dCA9IGVsKCJ0ZXh0YXJlYSIsIHsKICAgICAgImNsYXNzIjogInYtdGV4dGFyZWEiLCByb3dzOiAiNSIsIHBsYWNlaG9sZGVyOiAiRGVzY3JpYmUgdGhlIHRyYW5zZm9ybWF0aW9u4oCmIChtaW4gOCBjaGFyYWN0ZXJzKSIsCiAgICAgICJhcmlhLWxhYmVsIjogIlByb21wdCIKICAgIH0pOwogICAgcHJvbXB0SW5wdXQudmFsdWUgPSBpbml0aWFsLnByb21wdCB8fCAiIjsKICAgIHZhciBuZWdJbnB1dCA9IGVsKCJ0ZXh0YXJlYSIsIHsKICAgICAgImNsYXNzIjogInYtdGV4dGFyZWEiLCByb3dzOiAiMiIsIHBsYWNlaG9sZGVyOiAiTmVnYXRpdmUgcHJvbXB0IChvcHRpb25hbCkg4oCUIHdoYXQgdG8gYXZvaWQiLAogICAgICAiYXJpYS1sYWJlbCI6ICJOZWdhdGl2ZSBwcm9tcHQiCiAgICB9KTsKICAgIG5lZ0lucHV0LnZhbHVlID0gaW5pdGlhbC5uZWdhdGl2ZVByb21wdCB8fCAiIjsKCiAgICB2YXIgY291bnRlciA9IGVsKCJzcGFuIiwgeyAiY2xhc3MiOiAidi1sYWJlbCIgfSwgIiIpOwogICAgZnVuY3Rpb24gdXBkYXRlQ291bnQoKSB7CiAgICAgIHZhciBuID0gKHByb21wdElucHV0LnZhbHVlIHx8ICIiKS50cmltKCkubGVuZ3RoOwogICAgICBjb3VudGVyLnRleHRDb250ZW50ID0gbiArICIgY2hhciIgKyAobiA9PT0gMSA/ICIiIDogInMiKTsKICAgICAgY291bnRlci5zdHlsZS5jb2xvciA9IChuID4gMCAmJiBuIDwgOCkgPyAidmFyKC0tY29sb3Itd2FybmluZywgI0ZGRDYwQSkiIDogIiI7CiAgICB9CiAgICBwcm9tcHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIHVwZGF0ZUNvdW50KTsKICAgIHVwZGF0ZUNvdW50KCk7CgogICAgdmFyIGVyckJveCA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LWZvcm0tZXJyb3IiLCByb2xlOiAiYWxlcnQiLCAiYXJpYS1saXZlIjogInBvbGl0ZSIsIGhpZGRlbjogdHJ1ZSB9KTsKICAgIGZ1bmN0aW9uIHNob3dFcnIobSkgeyBlcnJCb3gudGV4dENvbnRlbnQgPSBtIHx8ICIiOyBlcnJCb3guaGlkZGVuID0gIW07IH0KCiAgICB2YXIgc2F2ZUJ0biA9IGVsKCJidXR0b24iLCB7IHR5cGU6ICJidXR0b24iLCAiY2xhc3MiOiAidi1jdGEgdi1jdGEtLXByaW1hcnkiIH0sIGVkaXRpbmcgPyAiU2F2ZSBDaGFuZ2VzIiA6ICJDcmVhdGUgUHJlc2V0Iik7CiAgICB2YXIgY2FuY2VsQnRuID0gZWwoImJ1dHRvbiIsIHsgdHlwZTogImJ1dHRvbiIsICJjbGFzcyI6ICJ2LWN0YSB2LWN0YS0tZ2hvc3QiIH0sICJDYW5jZWwiKTsKICAgIHZhciBkZWxCdG4gPSBlZGl0aW5nID8gZWwoImJ1dHRvbiIsIHsgdHlwZTogImJ1dHRvbiIsICJjbGFzcyI6ICJ2LWN0YSB2LWN0YS0tZGFuZ2VyIiB9LCAiRGVsZXRlIikgOiBudWxsOwoKICAgIHZhciBzcGlubmVyID0gdWkoKS5zcGlubmVyID8gdWkoKS5zcGlubmVyKDE4KSA6IGVsKCJzcGFuIiwgeyAiY2xhc3MiOiAidi1zcGlubmVyIiB9KTsKICAgIHNwaW5uZXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCiAgICB2YXIgYWN0aW9uc1JpZ2h0ID0gZWwoImRpdiIsIHsgImNsYXNzIjogInYtbW9kYWxfX2FjdGlvbnMiIH0sIFtzcGlubmVyLCBjYW5jZWxCdG4sIHNhdmVCdG5dKTsKICAgIHZhciBhY3Rpb25zID0gZWwoImRpdiIsIHsgImNsYXNzIjogInYtY3RhLXJvdyIgfSwgWwogICAgICBkZWxCdG4gfHwgZWwoInNwYW4iLCB7fSksCiAgICAgIGFjdGlvbnNSaWdodAogICAgXSk7CiAgICBhY3Rpb25zLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gInNwYWNlLWJldHdlZW4iOwogICAgYWN0aW9ucy5zdHlsZS5hbGlnbkl0ZW1zID0gImNlbnRlciI7CiAgICBhY3Rpb25zLnN0eWxlLmZsZXhXcmFwID0gIndyYXAiOwogICAgYWN0aW9ucy5zdHlsZS5nYXAgPSAidmFyKC0tc3BhY2UtbWQsIDE1cHgpIjsKCiAgICB2YXIgYm9keSA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LWZvcm0iIH0sIFsKICAgICAgZWwoImRpdiIsIHt9LCBbCiAgICAgICAgZWwoInAiLCB7ICJjbGFzcyI6ICJ2LWV5ZWJyb3ciIH0sIGVkaXRpbmcgPyAiRWRpdCBQcmVzZXQiIDogIk5ldyBQcmVzZXQiKSwKICAgICAgICBlbCgiaDIiLCB7ICJjbGFzcyI6ICJ2LW1vZGFsX190aXRsZSB2LWdyYWRpZW50IiB9LCBlZGl0aW5nID8gIlJlZmluZSB5b3VyIHN0eWxlIiA6ICJTYXZlIGEgY3VzdG9tIHN0eWxlIikKICAgICAgXSksCiAgICAgIGVsKCJsYWJlbCIsIHsgImNsYXNzIjogInYtZmllbGQtZ3JvdXAiIH0sIFtlbCgic3BhbiIsIHsgImNsYXNzIjogInYtbGFiZWwiIH0sICJOYW1lIiksIG5hbWVJbnB1dF0pLAogICAgICBlbCgibGFiZWwiLCB7ICJjbGFzcyI6ICJ2LWZpZWxkLWdyb3VwIiB9LCBbCiAgICAgICAgZWwoInNwYW4iLCB7ICJjbGFzcyI6ICJ2LWxhYmVsIiwgc3R5bGU6ICJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo5cHg7IiB9LCBbZWwoInNwYW4iLCB7fSwgIlByb21wdCIpLCBjb3VudGVyXSksCiAgICAgICAgcHJvbXB0SW5wdXQKICAgICAgXSksCiAgICAgIGVsKCJsYWJlbCIsIHsgImNsYXNzIjogInYtZmllbGQtZ3JvdXAiIH0sIFtlbCgic3BhbiIsIHsgImNsYXNzIjogInYtbGFiZWwiIH0sICJOZWdhdGl2ZSBwcm9tcHQiKSwgbmVnSW5wdXRdKSwKICAgICAgZXJyQm94LAogICAgICBhY3Rpb25zCiAgICBdKTsKICAgIGJvZHkuc3R5bGUuZGlzcGxheSA9ICJmbGV4IjsKICAgIGJvZHkuc3R5bGUuZmxleERpcmVjdGlvbiA9ICJjb2x1bW4iOwogICAgYm9keS5zdHlsZS5nYXAgPSAidmFyKC0tc3BhY2UtbWQsIDE1cHgpIjsKCiAgICB2YXIgbW9kYWxSZWYgPSBudWxsOwogICAgZnVuY3Rpb24gY2xvc2UoKSB7IGlmIChtb2RhbFJlZiAmJiBtb2RhbFJlZi5jbG9zZSkgbW9kYWxSZWYuY2xvc2UoKTsgfQoKICAgIGZ1bmN0aW9uIHNldEJ1c3koYikgewogICAgICBzcGlubmVyLnN0eWxlLmRpc3BsYXkgPSBiID8gIiIgOiAibm9uZSI7CiAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSBiOyBjYW5jZWxCdG4uZGlzYWJsZWQgPSBiOyBpZiAoZGVsQnRuKSBkZWxCdG4uZGlzYWJsZWQgPSBiOwogICAgICBzYXZlQnRuLmNsYXNzTGlzdC50b2dnbGUoImlzLWJ1c3kiLCBiKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkb1NhdmUoKSB7CiAgICAgIHZhciBuYW1lID0gKG5hbWVJbnB1dC52YWx1ZSB8fCAiIikudHJpbSgpOwogICAgICB2YXIgcHJvbXB0ID0gKHByb21wdElucHV0LnZhbHVlIHx8ICIiKS50cmltKCk7CiAgICAgIHZhciBuZWcgPSAobmVnSW5wdXQudmFsdWUgfHwgIiIpLnRyaW0oKTsKICAgICAgaWYgKCFuYW1lKSB7IHNob3dFcnIoIkdpdmUgeW91ciBwcmVzZXQgYSBuYW1lLiIpOyBuYW1lSW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIGlmIChwcm9tcHQubGVuZ3RoIDwgOCkgeyBzaG93RXJyKCJQcm9tcHQgbmVlZHMgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzLiIpOyBwcm9tcHRJbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgc2hvd0VycigiIik7CiAgICAgIHNldEJ1c3kodHJ1ZSk7CiAgICAgIHZhciBwYXlsb2FkID0geyBuYW1lOiBuYW1lLCBwcm9tcHQ6IHByb21wdCwgbmVnYXRpdmVQcm9tcHQ6IG5lZyB8fCBudWxsLCBtb2RlbDogaW5pdGlhbC5tb2RlbCB8fCBudWxsIH07CiAgICAgIHZhciBvcCA9IGVkaXRpbmcgPyB1cGRhdGUoaW5pdGlhbC5pZCwgcGF5bG9hZCkgOiBjcmVhdGUocGF5bG9hZCk7CiAgICAgIG9wLnRoZW4oZnVuY3Rpb24gKHNhdmVkKSB7CiAgICAgICAgc2V0QnVzeShmYWxzZSk7CiAgICAgICAgdG9hc3QoZWRpdGluZyA/ICJQcmVzZXQgdXBkYXRlZCIgOiAiUHJlc2V0IGNyZWF0ZWQiLCAic3VjY2VzcyIpOwogICAgICAgIGNsb3NlKCk7CiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uU2F2ZWQgPT09ICJmdW5jdGlvbiIpIG9wdHMub25TYXZlZChzYXZlZCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBzZXRCdXN5KGZhbHNlKTsKICAgICAgICBzaG93RXJyKCJDb3VsZG4ndCBzYXZlLiAiICsgZXJyTXNnKGVycikpOwogICAgICB9KTsKICAgIH0KCiAgICBzYXZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZG9TYXZlKTsKICAgIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGNsb3NlKTsKICAgIGlmIChkZWxCdG4pIGRlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHJ1biA9IGZ1bmN0aW9uICgpIHsgc2V0QnVzeSh0cnVlKTsgcmVtb3ZlKGluaXRpYWwuaWQpLnRoZW4oZnVuY3Rpb24gKCkgeyB0b2FzdCgiUHJlc2V0IGRlbGV0ZWQiLCAic3VjY2VzcyIpOyBjbG9zZSgpOyBpZiAodHlwZW9mIG9wdHMub25TYXZlZCA9PT0gImZ1bmN0aW9uIikgb3B0cy5vblNhdmVkKG51bGwpOyB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHNldEJ1c3koZmFsc2UpOyB9KTsgfTsKICAgICAgaWYgKHVpKCkuY29uZmlybSkgdWkoKS5jb25maXJtKCdEZWxldGUgIicgKyAoaW5pdGlhbC5uYW1lIHx8ICJ0aGlzIHByZXNldCIpICsgJyI/JywgeyBkZXN0cnVjdGl2ZTogdHJ1ZSwgY29uZmlybUxhYmVsOiAiRGVsZXRlIiB9KS50aGVuKGZ1bmN0aW9uIChvaykgeyBpZiAob2spIHJ1bigpOyB9KTsKICAgICAgZWxzZSBpZiAod2luZG93LmNvbmZpcm0oJ0RlbGV0ZSAiJyArIChpbml0aWFsLm5hbWUgfHwgInRoaXMgcHJlc2V0IikgKyAnIj8nKSkgcnVuKCk7CiAgICB9KTsKCiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpICYmIGUua2V5ID09PSAiRW50ZXIiKSB7IGUucHJldmVudERlZmF1bHQoKTsgZG9TYXZlKCk7IH0KICAgIH0pOwoKICAgIGlmICh1aSgpLm1vZGFsKSB7CiAgICAgIG1vZGFsUmVmID0gdWkoKS5tb2RhbChib2R5LCB7IGFyaWFMYWJlbDogZWRpdGluZyA/ICJFZGl0IHByZXNldCIgOiAiTmV3IHByZXNldCIsIG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHt9IH0pOwogICAgfSBlbHNlIHsKICAgICAgbW9kYWxSZWYgPSBmYWxsYmFja01vZGFsKGJvZHkpOwogICAgfQogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IChlZGl0aW5nID8gcHJvbXB0SW5wdXQgOiBuYW1lSW5wdXQpLmZvY3VzKCk7IH0sIDMwKTsKICAgIHJldHVybiBtb2RhbFJlZjsKICB9CgogIGZ1bmN0aW9uIGZhbGxiYWNrTW9kYWwobm9kZSkgewogICAgdmFyIG92ZXJsYXkgPSBlbCgiZGl2IiwgeyAiY2xhc3MiOiAidi1vdmVybGF5LXNjcmltIiwgcm9sZTogInByZXNlbnRhdGlvbiIgfSk7CiAgICB2YXIgc2hlZXQgPSBlbCgiZGl2IiwgeyAiY2xhc3MiOiAidi1tb2RhbCBnbGFzcy1jYXJkIiwgcm9sZTogImRpYWxvZyIsICJhcmlhLW1vZGFsIjogInRydWUiIH0sIG5vZGUpOwogICAgb3ZlcmxheS5hcHBlbmRDaGlsZChzaGVldCk7CiAgICBmdW5jdGlvbiBjbG9zZSgpIHsgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIG9uS2V5LCB0cnVlKTsgaWYgKG92ZXJsYXkucGFyZW50Tm9kZSkgb3ZlcmxheS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG92ZXJsYXkpOyB9CiAgICBmdW5jdGlvbiBvbktleShlKSB7IGlmIChlLmtleSA9PT0gIkVzY2FwZSIpIGNsb3NlKCk7IH0KICAgIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoZSkgeyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlKCk7IH0pOwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIG9uS2V5LCB0cnVlKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7CiAgICByZXR1cm4geyBjbG9zZTogY2xvc2UgfTsKICB9CgogIGZ1bmN0aW9uIG9wZW5JbmR1c3RyaWVzUGlja2VyKG9uRG9uZSkgewogICAgdmFyIGluZHMgPSAoVi5kYXRhICYmIEFycmF5LmlzQXJyYXkoVi5kYXRhLmluZHVzdHJpZXMpKSA/IFYuZGF0YS5pbmR1c3RyaWVzIDogW107CiAgICBpZiAoIWluZHMubGVuZ3RoKSB7IHRvYXN0KCJObyBpbmR1c3RyaWVzIGF2YWlsYWJsZSIpOyBpZiAob25Eb25lKSBvbkRvbmUoKTsgcmV0dXJuOyB9CiAgICB2YXIgc2VsZWN0ZWQgPSAoKFYuc3RhdGUgJiYgVi5zdGF0ZS5pbmR1c3RyaWVzKSB8fCBbXSkuc2xpY2UoKTsKCiAgICB2YXIgZ3JpZCA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LWNoaXAtcm93Iiwgcm9sZTogImdyb3VwIiwgImFyaWEtbGFiZWwiOiAiSW5kdXN0cmllcyIgfSk7CiAgICBncmlkLnN0eWxlLmZsZXhXcmFwID0gIndyYXAiOwogICAgZ3JpZC5zdHlsZS5vdmVyZmxvd1ggPSAidmlzaWJsZSI7CiAgICBpbmRzLmZvckVhY2goZnVuY3Rpb24gKGluZCkgewogICAgICB2YXIgb24gPSBzZWxlY3RlZC5pbmRleE9mKGluZC5rZXkpICE9PSAtMTsKICAgICAgdmFyIGIgPSBlbCgiYnV0dG9uIiwgeyB0eXBlOiAiYnV0dG9uIiwgImNsYXNzIjogInYtY2hpcCIgKyAob24gPyAiIHYtY2hpcC0tYWN0aXZlIiA6ICIiKSwgImRhdGEta2V5IjogaW5kLmtleSwgImFyaWEtcHJlc3NlZCI6IG9uID8gInRydWUiIDogImZhbHNlIiB9LCBpbmQubGFiZWwgfHwgaW5kLmtleSk7CiAgICAgIGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGkgPSBzZWxlY3RlZC5pbmRleE9mKGluZC5rZXkpOwogICAgICAgIGlmIChpID09PSAtMSkgc2VsZWN0ZWQucHVzaChpbmQua2V5KTsgZWxzZSBzZWxlY3RlZC5zcGxpY2UoaSwgMSk7CiAgICAgICAgdmFyIG5vd09uID0gc2VsZWN0ZWQuaW5kZXhPZihpbmQua2V5KSAhPT0gLTE7CiAgICAgICAgYi5jbGFzc0xpc3QudG9nZ2xlKCJ2LWNoaXAtLWFjdGl2ZSIsIG5vd09uKTsKICAgICAgICBiLnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwgbm93T24gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICAgfSk7CiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoYik7CiAgICB9KTsKCiAgICB2YXIgc2F2ZUJ0biA9IGVsKCJidXR0b24iLCB7IHR5cGU6ICJidXR0b24iLCAiY2xhc3MiOiAidi1jdGEgdi1jdGEtLXByaW1hcnkiIH0sICJBcHBseSIpOwogICAgdmFyIGFsbEJ0biA9IGVsKCJidXR0b24iLCB7IHR5cGU6ICJidXR0b24iLCAiY2xhc3MiOiAidi1jdGEgdi1jdGEtLWdob3N0IiB9LCAiU2hvdyBhbGwiKTsKCiAgICB2YXIgYm9keSA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LWZvcm0iIH0sIFsKICAgICAgZWwoImRpdiIsIHt9LCBbCiAgICAgICAgZWwoInAiLCB7ICJjbGFzcyI6ICJ2LWV5ZWJyb3ciIH0sICJGaWx0ZXIgUHJlc2V0cyIpLAogICAgICAgIGVsKCJoMiIsIHsgImNsYXNzIjogInYtbW9kYWxfX3RpdGxlIHYtZ3JhZGllbnQiIH0sICJZb3VyIGluZHVzdHJpZXMiKQogICAgICBdKSwKICAgICAgZWwoInAiLCB7ICJjbGFzcyI6ICJ2LWxhYmVsIiB9LCAiVGFpbG9yIHRoZSBzdHlsZSBwcmVzZXRzIHRvIHdoYXQgeW91IHdvcmsgb24uIiksCiAgICAgIGdyaWQsCiAgICAgIGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LW1vZGFsX19hY3Rpb25zIiB9LCBbYWxsQnRuLCBzYXZlQnRuXSkKICAgIF0pOwogICAgYm9keS5zdHlsZS5kaXNwbGF5ID0gImZsZXgiOwogICAgYm9keS5zdHlsZS5mbGV4RGlyZWN0aW9uID0gImNvbHVtbiI7CiAgICBib2R5LnN0eWxlLmdhcCA9ICJ2YXIoLS1zcGFjZS1tZCwgMTVweCkiOwoKICAgIHZhciBtb2RhbFJlZiA9IHVpKCkubW9kYWwgPyB1aSgpLm1vZGFsKGJvZHksIHsgYXJpYUxhYmVsOiAiRmlsdGVyIHByZXNldHMgYnkgaW5kdXN0cnkiIH0pIDogZmFsbGJhY2tNb2RhbChib2R5KTsKICAgIGZ1bmN0aW9uIGNvbW1pdChhcnIpIHsKICAgICAgaWYgKHN0b3JlKCkuc2V0KSBzdG9yZSgpLnNldCgiaW5kdXN0cmllcyIsIGFycik7IGVsc2UgVi5zdGF0ZS5pbmR1c3RyaWVzID0gYXJyOwogICAgICBpZiAoc3RvcmUoKS5zYXZlKSBzdG9yZSgpLnNhdmUoKTsKICAgICAgaWYgKHN0b3JlKCkuZW1pdCkgc3RvcmUoKS5lbWl0KCJpbmR1c3RyaWVzOmNoYW5nZWQiLCBhcnIpOwogICAgICBpZiAobW9kYWxSZWYgJiYgbW9kYWxSZWYuY2xvc2UpIG1vZGFsUmVmLmNsb3NlKCk7CiAgICAgIGlmIChvbkRvbmUpIG9uRG9uZSgpOwogICAgfQogICAgc2F2ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsgY29tbWl0KHNlbGVjdGVkKTsgfSk7CiAgICBhbGxCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IGNvbW1pdChbXSk7IH0pOwogIH0KCiAgZnVuY3Rpb24gc2F2ZVByZXNldChzZWVkLCBvcHRzKSB7CiAgICBzZWVkID0gc2VlZCB8fCB7fTsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIHByZWZpbGwgPSB7CiAgICAgIG5hbWU6IHNlZWQubmFtZSB8fCBzdWdnZXN0TmFtZShzZWVkLnByb21wdCksCiAgICAgIHByb21wdDogc2VlZC5wcm9tcHQgfHwgIiIsCiAgICAgIG5lZ2F0aXZlUHJvbXB0OiBzZWVkLm5lZ2F0aXZlUHJvbXB0IHx8IG51bGwsCiAgICAgIG1vZGVsOiBzZWVkLm1vZGVsIHx8IG51bGwKICAgIH07CiAgICByZXR1cm4gb3BlbkVkaXRvcihudWxsLCB7IHByZWZpbGw6IHByZWZpbGwsIG9uU2F2ZWQ6IG9wdHMub25TYXZlZCB9KTsKICB9CgogIGZ1bmN0aW9uIHN1Z2dlc3ROYW1lKHByb21wdCkgewogICAgaWYgKCFwcm9tcHQpIHJldHVybiAiIjsKICAgIHZhciB3b3JkcyA9IFN0cmluZyhwcm9tcHQpLnRyaW0oKS5zcGxpdCgvXHMrLykuc2xpY2UoMCwgNCkuam9pbigiICIpOwogICAgcmV0dXJuIHdvcmRzLmxlbmd0aCA+IDQwID8gd29yZHMuc2xpY2UoMCwgNDApIDogd29yZHM7CiAgfQoKICBWLnByZXNldHMgPSB7CiAgICBhbGw6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5zbGljZSgpOyB9LAogICAgc3dpenpsZXM6IHJlbGV2YW50U3dpenpsZXMsCiAgICBpc1JlbGV2YW50OiBpc1JlbGV2YW50LAogICAgbG9hZDogbG9hZCwKICAgIGNyZWF0ZTogY3JlYXRlLAogICAgdXBkYXRlOiB1cGRhdGUsCiAgICByZW1vdmU6IHJlbW92ZSwKICAgICJkZWxldGUiOiByZW1vdmUsCiAgICByZW9yZGVyOiByZW9yZGVyLAogICAgcmVuZGVyQ2hpcHM6IHJlbmRlckNoaXBzLAogICAgb3BlbkVkaXRvcjogb3BlbkVkaXRvciwKICAgIG9wZW5JbmR1c3RyaWVzOiBvcGVuSW5kdXN0cmllc1BpY2tlciwKICAgIHNhdmVQcmVzZXQ6IHNhdmVQcmVzZXQKICB9OwoKICByZXN0b3JlKCk7Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2dlbmVyYXRlLmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9IHdpbmRvdy5WID0gd2luZG93LlYgfHwge307CiAgVi52aWV3cyA9IFYudmlld3MgfHwge307CgogIGZ1bmN0aW9uIHVpKCkgeyByZXR1cm4gVi51aSB8fCB7fTsgfQogIGZ1bmN0aW9uIGFwaSgpIHsgcmV0dXJuIFYuYXBpIHx8IHt9OyB9CiAgZnVuY3Rpb24gdXRpbCgpIHsgcmV0dXJuIFYudXRpbCB8fCB7fTsgfQogIGZ1bmN0aW9uIGRhdGEoKSB7IHJldHVybiBWLmRhdGEgfHwge307IH0KICBmdW5jdGlvbiBzdGF0ZSgpIHsgcmV0dXJuIChWLnN0YXRlID0gVi5zdGF0ZSB8fCB7fSk7IH0KCiAgZnVuY3Rpb24gZWwodGFnLCBhdHRycykgewogICAgaWYgKHVpKCkuZWwpIHJldHVybiB1aSgpLmVsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIHZhciBpID0gMSwga2lkcyA9IFtdOwogICAgaWYgKGF0dHJzICYmIHR5cGVvZiBhdHRycyA9PT0gJ29iamVjdCcgJiYgIShhdHRycyBpbnN0YW5jZW9mIE5vZGUpICYmIHR5cGVvZiBhdHRycyAhPT0gJ3N0cmluZycpIHsKICAgICAgaSA9IDI7CiAgICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgaykpIGNvbnRpbnVlOwogICAgICAgIHZhciB2YWwgPSBhdHRyc1trXTsKICAgICAgICBpZiAoayA9PT0gJ2NsYXNzJyB8fCBrID09PSAnY2xhc3NOYW1lJykgbm9kZS5jbGFzc05hbWUgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ3RleHQnKSBub2RlLnRleHRDb250ZW50ID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICdodG1sJykgbm9kZS5pbm5lckhUTUwgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdvbicpID09PSAwICYmIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHZhbCk7CiAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdkYXRhLScpID09PSAwKSBub2RlLnNldEF0dHJpYnV0ZShrLCB2YWwpOwogICAgICAgIGVsc2UgaWYgKHZhbCA9PT0gdHJ1ZSkgbm9kZS5zZXRBdHRyaWJ1dGUoaywgJycpOwogICAgICAgIGVsc2UgaWYgKHZhbCAhPSBudWxsICYmIHZhbCAhPT0gZmFsc2UpIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYXR0cnMgIT0gbnVsbCkgeyBraWRzLnB1c2goYXR0cnMpOyB9CiAgICBmb3IgKDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykga2lkcy5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgICBraWRzLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgYXBwZW5kQ2hpbGQobm9kZSwgYyk7IH0pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiBhcHBlbmRDaGlsZChub2RlLCBjKSB7CiAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlKSByZXR1cm47CiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgeyBjLmZvckVhY2goZnVuY3Rpb24gKHgpIHsgYXBwZW5kQ2hpbGQobm9kZSwgeCk7IH0pOyByZXR1cm47IH0KICAgIGlmIChjIGluc3RhbmNlb2YgTm9kZSkgeyBub2RlLmFwcGVuZENoaWxkKGMpOyByZXR1cm47IH0KICAgIG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGMpKSk7CiAgfQoKICBmdW5jdGlvbiBpY29uKG5hbWUpIHsKICAgIHRyeSB7CiAgICAgIGlmICh1aSgpLmljb24pIHsKICAgICAgICB2YXIgZ290ID0gdWkoKS5pY29uKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YgZ290ID09PSAnc3RyaW5nJykgcmV0dXJuIGdvdDsKICAgICAgICBpZiAoZ290ICYmIGdvdC5ub2RlVHlwZSAmJiB0eXBlb2YgZ290Lm91dGVySFRNTCA9PT0gJ3N0cmluZycpIHJldHVybiBnb3Qub3V0ZXJIVE1MOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQogICAgcmV0dXJuICcnOwogIH0KCiAgZnVuY3Rpb24gaWNvbk5vZGUobmFtZSwgZ2x5cGgpIHsKICAgIHZhciBodG1sID0gaWNvbihuYW1lKTsKICAgIGlmIChodG1sKSB7IHZhciBzcGFuID0gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1pY28nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIGh0bWw6IGh0bWwgfSk7IHJldHVybiBzcGFuOyB9CiAgICByZXR1cm4gZWwoJ3NwYW4nLCB7ICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9LCBnbHlwaCB8fCAnJyk7CiAgfQoKICBmdW5jdGlvbiB0b2FzdChtc2csIGtpbmQpIHsKICAgIGlmICh1aSgpLnRvYXN0KSB7IHVpKCkudG9hc3QobXNnLCBraW5kIHx8ICdpbmZvJyk7IHJldHVybjsgfQogICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5lbWl0KSBWLnN0b3JlLmVtaXQoJ3RvYXN0JywgeyBtc2c6IG1zZywga2luZDoga2luZCB8fCAnaW5mbycgfSk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICBpZiAoVi5yb3V0ZXIgJiYgVi5yb3V0ZXIuZ28pIFYucm91dGVyLmdvKGhhc2gpOwogICAgZWxzZSB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiB1dWlkKCkgewogICAgaWYgKHV0aWwoKS51dWlkKSByZXR1cm4gdXRpbCgpLnV1aWQoKTsKICAgIGlmICh3aW5kb3cuY3J5cHRvICYmIGNyeXB0by5yYW5kb21VVUlEKSByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTsKICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgIHZhciByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwLCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODsKICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByYW5kb21TZWVkKCkgewogICAgaWYgKHV0aWwoKS5yYW5kb21TZWVkKSByZXR1cm4gdXRpbCgpLnJhbmRvbVNlZWQoKTsKICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKTsKICB9CgogIGZ1bmN0aW9uIG5vd0lTTygpIHsKICAgIHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXC5cZHszfVokLywgJ1onKTsKICB9CgogIGZ1bmN0aW9uIGVzYyhzKSB7CiAgICBpZiAodXRpbCgpLmVzY2FwZUh0bWwpIHJldHVybiB1dGlsKCkuZXNjYXBlSHRtbChzKTsKICAgIHJldHVybiBTdHJpbmcocyA9PSBudWxsID8gJycgOiBzKS5yZXBsYWNlKC9bJjw+IiddL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgIHJldHVybiB7ICcmJzogJyZhbXA7JywgJzwnOiAnJmx0OycsICc+JzogJyZndDsnLCAnIic6ICcmcXVvdDsnLCAiJyI6ICcmIzM5OycgfVtjXTsKICAgIH0pOwogIH0KCiAgdmFyIEZBTExCQUNLX01PREVMUyA9IFsKICAgIHsgcmF3OiAnZmx1eEtsZWluJywgICAgIGxhYmVsOiAnU3RhbmRhcmQnLCBzdWJoZWFkaW5nOiAnRmx1eCBLbGVpbicsICAgICBjb3N0OiAxMCwgbWF4UmVmOiAxLCB0Mmk6ICdmbHV4MVNjaG5lbGwnLCBkZWZhdWx0OiB0cnVlIH0sCiAgICB7IHJhdzogJ2ZsdXgxS29udGV4dCcsICBsYWJlbDogJ0xlZ2FjeScsICAgc3ViaGVhZGluZzogJ0ZsdXggS29udGV4dCcsICAgY29zdDogMTAsIG1heFJlZjogMSB9LAogICAgeyByYXc6ICduYW5vQmFuYW5hJywgICAgbGFiZWw6ICdQcm8nLCAgICAgIHN1YmhlYWRpbmc6ICdOYW5vIEJhbmFuYScsICAgIGNvc3Q6IDEwLCBtYXhSZWY6IDYgfSwKICAgIHsgcmF3OiAnbmFub0JhbmFuYTInLCAgIGxhYmVsOiAnUGx1cycsICAgICBzdWJoZWFkaW5nOiAnTmFubyBCYW5hbmEgMicsICBjb3N0OiAxNSwgbWF4UmVmOiA2IH0sCiAgICB7IHJhdzogJ25hbm9CYW5hbmFQcm8nLCBsYWJlbDogJ01heCcsICAgICAgc3ViaGVhZGluZzogJ05hbm8gQmFuYW5hIFBybycsIGNvc3Q6IDIwLCBtYXhSZWY6IDE1IH0KICBdOwogIHZhciBGQUxMQkFDS19BU1BFQ1RTID0gWwogICAgeyByYXc6ICdhdXRvJywgICAgICAgICAgbGFiZWw6ICdBdXRvJywgICAgICAgICAgIHc6IDEwMjQsIGg6IDEwMjQgfSwKICAgIHsgcmF3OiAnc3F1YXJlJywgICAgICAgIGxhYmVsOiAnU3F1YXJlJywgICAgICAgICB3OiAxMDI0LCBoOiAxMDI0IH0sCiAgICB7IHJhdzogJ3BvcnRyYWl0OTE2JywgICBsYWJlbDogJ1BvcnRyYWl0IDk6MTYnLCAgdzogMTAyNCwgaDogMTgyMCB9LAogICAgeyByYXc6ICdsYW5kc2NhcGUxNjknLCAgbGFiZWw6ICdMYW5kc2NhcGUgMTY6OScsIHc6IDE4MjAsIGg6IDEwMjQgfSwKICAgIHsgcmF3OiAncG9ydHJhaXQ0MycsICAgIGxhYmVsOiAnUG9ydHJhaXQgMzo0JywgICB3OiAxMDI0LCBoOiAxMzY1IH0sCiAgICB7IHJhdzogJ2xhbmRzY2FwZTQzJywgICBsYWJlbDogJ0xhbmRzY2FwZSA0OjMnLCAgdzogMTM2NSwgaDogMTAyNCB9CiAgXTsKCiAgZnVuY3Rpb24gbW9kZWxzKCkgewogICAgdmFyIG0gPSBkYXRhKCkubW9kZWxzOwogICAgcmV0dXJuIChBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoKSA/IG0gOiBGQUxMQkFDS19NT0RFTFM7CiAgfQogIGZ1bmN0aW9uIGFzcGVjdHMoKSB7CiAgICB2YXIgYSA9IGRhdGEoKS5hc3BlY3RzOwogICAgcmV0dXJuIChBcnJheS5pc0FycmF5KGEpICYmIGEubGVuZ3RoKSA/IGEgOiBGQUxMQkFDS19BU1BFQ1RTOwogIH0KCiAgZnVuY3Rpb24gbW9kZWxCeVJhdyhyYXcpIHsKICAgIHZhciBsaXN0ID0gbW9kZWxzKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIGlmIChsaXN0W2ldLnJhdyA9PT0gcmF3KSByZXR1cm4gbGlzdFtpXTsKICAgIHJldHVybiBsaXN0WzBdOwogIH0KCiAgZnVuY3Rpb24gbWF4UmVmRm9yKG1vZGVsKSB7CiAgICB2YXIgbiA9IG1vZGVsICYmIChtb2RlbC5tYXhSZWYgIT0gbnVsbCA/IG1vZGVsLm1heFJlZiA6IG1vZGVsLm1heElucHV0SW1hZ2VzKTsKICAgIHJldHVybiAodHlwZW9mIG4gPT09ICdudW1iZXInICYmIG4gPiAwKSA/IG4gOiAxOwogIH0KCiAgdmFyIElORFVTVFJZX1BMQUNFSE9MREVSUyA9IHsKICAgIHJlYWxFc3RhdGU6ICdTdGFnZSB0aGlzIGVtcHR5IGxpdmluZyByb29tIHdpdGggd2FybSBtb2Rlcm4gZnVybml0dXJlIGFuZCBzb2Z0IGRheWxpZ2h04oCmJywKICAgIGludGVyaW9yRGVzaWduOiAnUmVpbWFnaW5lIHRoaXMgcm9vbSBpbiBhIHRyYW5zaXRpb25hbCBzdHlsZSB3aXRoIG5hdHVyYWwgdGV4dHVyZXPigKYnLAogICAgYXJjaGl0ZWN0dXJlOiAnVmlzdWFsaXplIGEgbW9kZXJuIGZhY2FkZSB3aXRoIGZsb29yLXRvLWNlaWxpbmcgZ2xhc3MgYW5kIGNsZWFuIGxpbmVz4oCmJywKICAgIGxhbmRzY2FwaW5nOiAnQWRkIGx1c2ggbGFuZHNjYXBpbmcsIGEgc3RvbmUgcGF0aCwgYW5kIGV2ZW5pbmcgZ2FyZGVuIGxpZ2h0aW5n4oCmJywKICAgIGZ1cm5pc2hpbmc6ICdGdXJuaXNoIHRoaXMgc3BhY2Ugd2l0aCBtaWQtY2VudHVyeSBzZWF0aW5nIGFuZCBhIHN0YXRlbWVudCBydWfigKYnLAogICAgY29uc3RydWN0aW9uOiAnU2hvdyB0aGUgZmluaXNoZWQgYnVpbGQgd2l0aCBjb21wbGV0ZWQgc2lkaW5nIGFuZCBhIG1hbmljdXJlZCBsYXdu4oCmJywKICAgIGhvbWVPd25lcjogJ1JlcGFpbnQgdGhlc2Ugd2FsbHMgYSB3YXJtIG5ldXRyYWwgYW5kIGJyaWdodGVuIHRoZSBsaWdodGluZ+KApicKICB9OwoKICBmdW5jdGlvbiBwbGFjZWhvbGRlclRleHQoKSB7CiAgICB2YXIgcyA9IHN0YXRlKCk7CiAgICB2YXIgaW5kcyA9IHMuaW5kdXN0cmllcyB8fCAocy5zZXR0aW5ncyAmJiBzLnNldHRpbmdzLmluZHVzdHJpZXMpIHx8IFtdOwogICAgdmFyIGtleSA9IG51bGw7CiAgICBpZiAoQXJyYXkuaXNBcnJheShpbmRzKSAmJiBpbmRzLmxlbmd0aCkgewogICAgICBrZXkgPSAodHlwZW9mIGluZHNbMF0gPT09ICdzdHJpbmcnKSA/IGluZHNbMF0gOiAoaW5kc1swXSAmJiAoaW5kc1swXS5rZXkgfHwgaW5kc1swXS5yYXcpKTsKICAgIH0KICAgIGlmIChrZXkgJiYgSU5EVVNUUllfUExBQ0VIT0xERVJTW2tleV0pIHJldHVybiBJTkRVU1RSWV9QTEFDRUhPTERFUlNba2V5XTsKICAgIHJldHVybiAnRGVzY3JpYmUgd2hhdCB5b3Ugd2FudCB0byBjcmVhdGUgb3IgdHJhbnNmb3Jt4oCmJzsKICB9CgogIHZhciBjdXJyZW50ID0gbnVsbDsKCiAgVi52aWV3cy5jcmVhdGUgPSB7CiAgICByZW5kZXI6IGZ1bmN0aW9uIChyb290LCBwYXJhbXMpIHsKICAgICAgaWYgKGN1cnJlbnQpIHsgdHJ5IHsgY3VycmVudC5kZXN0cm95KCk7IH0gY2F0Y2ggKGUpIHt9IGN1cnJlbnQgPSBudWxsOyB9CiAgICAgIGN1cnJlbnQgPSBuZXcgQ3JlYXRvcihyb290LCBwYXJhbXMgfHwge30pOwogICAgICBjdXJyZW50Lm1vdW50KCk7CiAgICB9LAogICAgdGVhcmRvd246IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGN1cnJlbnQpIHsgdHJ5IHsgY3VycmVudC5kZXN0cm95KCk7IH0gY2F0Y2ggKGUpIHt9IGN1cnJlbnQgPSBudWxsOyB9CiAgICB9LAogICAgYXBwbHlFeGFtcGxlOiBmdW5jdGlvbiAoZXhhbXBsZSkgewogICAgICBleGFtcGxlID0gZXhhbXBsZSB8fCB7fTsKICAgICAgaWYgKGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQuYXBwbHlFeGFtcGxlID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgY3VycmVudC5hcHBseUV4YW1wbGUoZXhhbXBsZSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBwYXJ0cyA9IFtdOwogICAgICBpZiAoZXhhbXBsZS5wcm9tcHQpIHBhcnRzLnB1c2goJ3Byb21wdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGV4YW1wbGUucHJvbXB0KSk7CiAgICAgIGlmIChleGFtcGxlLm1vZGVsKSBwYXJ0cy5wdXNoKCdtb2RlbD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGV4YW1wbGUubW9kZWwpKTsKICAgICAgaWYgKGV4YW1wbGUucmVmZXJlbmNlVVJMKSBwYXJ0cy5wdXNoKCdpbWFnZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGV4YW1wbGUucmVmZXJlbmNlVVJMKSk7CiAgICAgIGdvKCcjL2NyZWF0ZScgKyAocGFydHMubGVuZ3RoID8gJz8nICsgcGFydHMuam9pbignJicpIDogJycpKTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiBDcmVhdG9yKHJvb3QsIHBhcmFtcykgewogICAgdGhpcy5yb290ID0gcm9vdDsKICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwoKICAgIHRoaXMucHJvbXB0ID0gdHlwZW9mIHBhcmFtcy5wcm9tcHQgPT09ICdzdHJpbmcnID8gcGFyYW1zLnByb21wdCA6ICcnOwogICAgdGhpcy5tb2RlbFJhdyA9IChwYXJhbXMubW9kZWwgJiYgbW9kZWxCeVJhdyhwYXJhbXMubW9kZWwpLnJhdyA9PT0gcGFyYW1zLm1vZGVsKSA/IHBhcmFtcy5tb2RlbCA6IHBpY2tEZWZhdWx0TW9kZWwoKTsKICAgIHRoaXMuYXNwZWN0UmF3ID0gcmVhZFBlcnNpc3RlZCgnYXNwZWN0JykgfHwgYXNwZWN0cygpWzBdLnJhdzsKICAgIHRoaXMuYWN0aXZlUHJlc2V0ID0gbnVsbDsKICAgIHRoaXMucmVmcyA9IFtdOwoKICAgIHZhciBzZWVkSW1hZ2UgPSBwYXJhbXMuaW1hZ2UgfHwgcGFyYW1zLmltYWdlVVJMIHx8IHBhcmFtcy5pbWFnZV91cmw7CiAgICBpZiAoc2VlZEltYWdlKSB7CiAgICAgIHRoaXMucmVmcy5wdXNoKHsgdXJsOiBzZWVkSW1hZ2UsIHJlbW90ZVVSTDogc2VlZEltYWdlLCBuYW1lOiAncmVmZXJlbmNlJyB9KTsKICAgIH0KICAgIHRoaXMudmFyaWF0aW9ucyA9IGZhbHNlOwogICAgdGhpcy5idXN5ID0gZmFsc2U7CiAgICB0aGlzLmFib3J0ID0gbnVsbDsKCiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTsKICAgIHRoaXMuX2Rlc3Ryb3llZCA9IGZhbHNlOwogICAgdGhpcy5fcHJlc2V0Q3RsID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHBpY2tEZWZhdWx0TW9kZWwoKSB7CiAgICB2YXIgc2F2ZWQgPSByZWFkUGVyc2lzdGVkKCdtb2RlbCcpOwogICAgaWYgKHNhdmVkICYmIG1vZGVsQnlSYXcoc2F2ZWQpLnJhdyA9PT0gc2F2ZWQpIHJldHVybiBzYXZlZDsKICAgIHZhciBsaXN0ID0gbW9kZWxzKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIGlmIChsaXN0W2ldLmRlZmF1bHQpIHJldHVybiBsaXN0W2ldLnJhdzsKICAgIHJldHVybiBsaXN0WzBdLnJhdzsKICB9CgogIGZ1bmN0aW9uIHJlYWRQZXJzaXN0ZWQoaykgewogICAgdHJ5IHsgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd2YW1wX3dlYl9jcmVhdGVfJyArIGspOyB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgfQogIGZ1bmN0aW9uIHdyaXRlUGVyc2lzdGVkKGssIHYpIHsKICAgIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd2YW1wX3dlYl9jcmVhdGVfJyArIGssIHYpOyB9IGNhdGNoIChlKSB7fQogIH0KCiAgQ3JlYXRvci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAodGFyZ2V0LCBldnQsIGZuLCBvcHRzKSB7CiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldnQsIGZuLCBvcHRzIHx8IGZhbHNlKTsKICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKFt0YXJnZXQsIGV2dCwgZm4sIG9wdHMgfHwgZmFsc2VdKTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgewogICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTsKICAgIGlmICh0aGlzLmFib3J0KSB7IHRyeSB7IHRoaXMuYWJvcnQuYWJvcnQoKTsgfSBjYXRjaCAoZSkge30gfQogICAgaWYgKHRoaXMuX3ByZXNldEN0bCAmJiB0eXBlb2YgdGhpcy5fcHJlc2V0Q3RsLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgdGhpcy5fcHJlc2V0Q3RsLmRlc3Ryb3koKTsgfSBjYXRjaCAoZSkge30gfQogICAgdGhpcy5fcHJlc2V0Q3RsID0gbnVsbDsKICAgIHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsKSB7IHRyeSB7IGxbMF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihsWzFdLCBsWzJdLCBsWzNdKTsgfSBjYXRjaCAoZSkge30gfSk7CiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTsKICAgIHRoaXMuY2xlYXJSZWZzKCk7CiAgICBpZiAodGhpcy5fc2NyaW0gJiYgdGhpcy5fc2NyaW0ucGFyZW50Tm9kZSkgdGhpcy5fc2NyaW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9zY3JpbSk7CiAgICB0aGlzLl9zY3JpbSA9IG51bGw7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuY3VycmVudE1vZGVsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbW9kZWxCeVJhdyh0aGlzLm1vZGVsUmF3KTsgfTsKICBDcmVhdG9yLnByb3RvdHlwZS5oYXNJbnB1dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucmVmcy5sZW5ndGggPiAwOyB9OwogIENyZWF0b3IucHJvdG90eXBlLmlzVDJJID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gIXRoaXMuaGFzSW5wdXQoKTsgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUudW5pdENvc3QgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAodGhpcy5pc1QySSgpKSByZXR1cm4gMTsKICAgIHZhciBtID0gdGhpcy5jdXJyZW50TW9kZWwoKTsKICAgIHJldHVybiAobSAmJiB0eXBlb2YgbS5jb3N0ID09PSAnbnVtYmVyJykgPyBtLmNvc3QgOiAxMDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS50b3RhbENvc3QgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgY291bnQgPSB0aGlzLnZhcmlhdGlvbnMgPyA0IDogMTsKICAgIHJldHVybiB0aGlzLnVuaXRDb3N0KCkgKiBjb3VudDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5maW5hbFByb21wdCA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB0eXBlZCA9ICh0aGlzLnByb21wdCB8fCAnJykudHJpbSgpOwogICAgaWYgKHRoaXMuYWN0aXZlUHJlc2V0ICYmIHRoaXMuYWN0aXZlUHJlc2V0LnByb21wdCkgewogICAgICB2YXIgcHJlID0gdGhpcy5hY3RpdmVQcmVzZXQucHJvbXB0LnRyaW0oKTsKICAgICAgcmV0dXJuIHR5cGVkID8gKHByZSArICcgJyArIHR5cGVkKSA6IHByZTsKICAgIH0KICAgIHJldHVybiB0eXBlZDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5jYW5TdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAodGhpcy5idXN5KSByZXR1cm4gZmFsc2U7CiAgICBpZiAodGhpcy5oYXNJbnB1dCgpKSByZXR1cm4gdHJ1ZTsKICAgIGlmICh0aGlzLmFjdGl2ZVByZXNldCAmJiB0aGlzLmFjdGl2ZVByZXNldC5wcm9tcHQpIHJldHVybiB0cnVlOwogICAgcmV0dXJuICh0aGlzLnByb21wdCB8fCAnJykudHJpbSgpLmxlbmd0aCA+PSA4OwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLm1vdW50ID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHJvb3QgPSB0aGlzLnJvb3Q7CiAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgcm9vdC5jbGFzc05hbWUgPSAndi12aWV3IHYtY3JlYXRlJzsKCiAgICB2YXIgbGlicmFyeUVtcHR5ID0gIShzdGF0ZSgpLmxpYnJhcnkgJiYgc3RhdGUoKS5saWJyYXJ5Lmxlbmd0aCk7CgogICAgdmFyIGNvbnRyb2xzID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fbWFpbicgfSk7CiAgICB0aGlzLmJ1aWxkQ29udHJvbHMoY29udHJvbHMpOwoKICAgIHZhciBzaWRlID0gZWwoJ2FzaWRlJywgeyBjbGFzczogJ3Ytc2lkZS1wYW5lbCB2LWNyZWF0ZV9fc2lkZScgfSk7CiAgICB0cnkgeyBzaWRlLmFwcGVuZENoaWxkKHRoaXMuYnVpbGRTaWRlKGxpYnJhcnlFbXB0eSkpOyB9IGNhdGNoIChlKSB7fQoKICAgIHZhciBsYXlvdXQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3BsaXQtbGF5b3V0JyB9LCBjb250cm9scywgc2lkZSk7CiAgICByb290LmFwcGVuZENoaWxkKGxheW91dCk7CgogICAgdGhpcy5fc2lkZU5vZGUgPSBzaWRlOwogICAgdGhpcy5yZWZyZXNoQ1RBKCk7CiAgICB0aGlzLnJlZnJlc2hBc3BlY3RWaXNpYmlsaXR5KCk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRDb250cm9scyA9IGZ1bmN0aW9uIChob3N0KSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBmdW5jdGlvbiBhZGQoZm4pIHsKICAgICAgdmFyIG5vZGUgPSBudWxsOwogICAgICB0cnkgeyBub2RlID0gZm4uY2FsbChzZWxmKTsgfSBjYXRjaCAoZSkgeyBpZiAod2luZG93LmNvbnNvbGUpIGNvbnNvbGUuZXJyb3IoJ1tjcmVhdGVdIHNlY3Rpb24gZmFpbGVkJywgZSk7IH0KICAgICAgaWYgKG5vZGUpIGhvc3QuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICB9CgogICAgYWRkKHRoaXMuYnVpbGRIZWFkZXIpOwogICAgYWRkKHRoaXMuYnVpbGRJbWFnZVpvbmUpOwogICAgYWRkKHRoaXMuYnVpbGRQcm9tcHQpOwogICAgYWRkKHRoaXMuYnVpbGRQcmVzZXRzKTsKICAgIGFkZCh0aGlzLmJ1aWxkU2VsZWN0b3JzKTsKICAgIGFkZCh0aGlzLmJ1aWxkQWN0aW9ucyk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRIZWFkZXIgPSBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gZWwoJ2hlYWRlcicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX2hlYWQgdi1jcmVhdGVfX2hlYWQnIH0sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX2hlYWR0ZXh0JyB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZXllYnJvdycgfSwgJ1ZhbXAgU3R1ZGlvJyksCiAgICAgICAgZWwoJ2gxJywgeyBjbGFzczogJ3YtY3JlYXRlX190aXRsZSB2LWdyYWRpZW50JyB9LCAnQ3JlYXRlIG9yIHRyYW5zZm9ybScpLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViJyB9LCAnRGVzY3JpYmUgYSBzY2VuZSwgb3IgZHJvcCBhbiBpbWFnZSB0byByZXN0eWxlLCBzdGFnZSwgYW5kIHJlaW1hZ2luZSBpdC4nKQogICAgICApKTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5idWlsZEltYWdlWm9uZSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciBzZWN0aW9uID0gZWwoJ3NlY3Rpb24nLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCB2LWNyZWF0ZV9faW1nem9uZScsICdhcmlhLWxhYmVsJzogJ1JlZmVyZW5jZSBpbWFnZXMnIH0pOwogICAgdGhpcy5faW1nem9uZSA9IHNlY3Rpb247CgogICAgdmFyIGZpbGVJbnB1dCA9IGVsKCdpbnB1dCcsIHsKICAgICAgdHlwZTogJ2ZpbGUnLCBhY2NlcHQ6ICdpbWFnZS8qJywgbXVsdGlwbGU6IHRydWUsCiAgICAgIGNsYXNzOiAndi12aXN1YWxseS1oaWRkZW4nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIHRhYmluZGV4OiAnLTEnLAogICAgICBzdHlsZTogJ3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtoZWlnaHQ6MXB4O29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lJwogICAgfSk7CiAgICB0aGlzLm9uKGZpbGVJbnB1dCwgJ2NoYW5nZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgIHNlbGYuYWRkRmlsZXMoZS50YXJnZXQuZmlsZXMpOwogICAgICBmaWxlSW5wdXQudmFsdWUgPSAnJzsKICAgIH0pOwogICAgdGhpcy5fZmlsZUlucHV0ID0gZmlsZUlucHV0OwogICAgc2VjdGlvbi5hcHBlbmRDaGlsZChmaWxlSW5wdXQpOwoKICAgIHRoaXMub24oZG9jdW1lbnQsICdwYXN0ZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChzZWxmLl9kZXN0cm95ZWQgfHwgc2VsZi5idXN5KSByZXR1cm47CiAgICAgIHZhciBpdGVtcyA9IChlLmNsaXBib2FyZERhdGEgJiYgZS5jbGlwYm9hcmREYXRhLml0ZW1zKSB8fCBbXTsKICAgICAgdmFyIGZpbGVzID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoaXRlbXNbaV0ua2luZCA9PT0gJ2ZpbGUnICYmIGl0ZW1zW2ldLnR5cGUuaW5kZXhPZignaW1hZ2UvJykgPT09IDApIHsKICAgICAgICAgIHZhciBmID0gaXRlbXNbaV0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICBpZiAoZikgZmlsZXMucHVzaChmKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGZpbGVzLmxlbmd0aCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IHNlbGYuYWRkRmlsZXMoZmlsZXMpOyB9CiAgICB9KTsKCiAgICB0aGlzLnJlbmRlckltYWdlWm9uZSgpOwogICAgcmV0dXJuIHNlY3Rpb247CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYmluZERuZCA9IGZ1bmN0aW9uICh0YXJnZXQpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIFsnZHJhZ2VudGVyJywgJ2RyYWdvdmVyJ10uZm9yRWFjaChmdW5jdGlvbiAoZXZ0KSB7CiAgICAgIHNlbGYub24odGFyZ2V0LCBldnQsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2RyYWdvdmVyJyk7IH0pOwogICAgfSk7CiAgICBbJ2RyYWdsZWF2ZScsICdkcmFnZW5kJ10uZm9yRWFjaChmdW5jdGlvbiAoZXZ0KSB7CiAgICAgIHNlbGYub24odGFyZ2V0LCBldnQsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdvdmVyJyk7IH0pOwogICAgfSk7CiAgICB0aGlzLm9uKHRhcmdldCwgJ2Ryb3AnLCBmdW5jdGlvbiAoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnb3ZlcicpOwogICAgICB2YXIgZHQgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgaWYgKGR0ICYmIGR0LmZpbGVzICYmIGR0LmZpbGVzLmxlbmd0aCkgc2VsZi5hZGRGaWxlcyhkdC5maWxlcyk7CiAgICB9KTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZW5kZXJJbWFnZVpvbmUgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX2ltZ3pvbmU7CiAgICBpZiAoIXNlY3Rpb24pIHJldHVybjsKICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHNlY3Rpb24uY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsKICAgICAgaWYgKGMgIT09IHNlbGYuX2ZpbGVJbnB1dCkgc2VjdGlvbi5yZW1vdmVDaGlsZChjKTsKICAgIH0pOwoKICAgIHZhciBtb2RlbCA9IHRoaXMuY3VycmVudE1vZGVsKCk7CiAgICB2YXIgbWF4ID0gbWF4UmVmRm9yKG1vZGVsKTsKCiAgICBpZiAoIXRoaXMucmVmcy5sZW5ndGgpIHsKICAgICAgdmFyIHpvbmUgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZHJvcHpvbmUnLCByb2xlOiAnYnV0dG9uJywgdGFiaW5kZXg6ICcwJywKICAgICAgICAnYXJpYS1sYWJlbCc6ICdBZGQgYSByZWZlcmVuY2UgaW1hZ2UnIH0sCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJywgaHRtbDogaWNvbigncGhvdG8nKSB8fCBkcm9wR2x5cGgoKSB9KSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3JlYXRlX19kcm9wdGl0bGUnIH0sICdEcm9wIGFuIGltYWdlLCBwYXN0ZSwgb3IgYnJvd3NlJyksCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YicgfSwKICAgICAgICAgICdPcHRpb25hbCDigJQgbGVhdmUgZW1wdHkgdG8gZ2VuZXJhdGUgZnJvbSB0ZXh0LiAnICsKICAgICAgICAgIChtYXggPiAxID8gKCdVcCB0byAnICsgbWF4ICsgJyByZWZlcmVuY2VzIGZvciAnICsgKG1vZGVsLmxhYmVsIHx8ICd0aGlzIG1vZGVsJykgKyAnLicpIDogJycpKSk7CiAgICAgIHRoaXMuYmluZERuZCh6b25lKTsKICAgICAgdGhpcy5vbih6b25lLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7IHNlbGYuX2ZpbGVJbnB1dC5jbGljaygpOyB9KTsKICAgICAgdGhpcy5vbih6b25lLCAna2V5ZG93bicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInIHx8IGUua2V5ID09PSAnICcpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzZWxmLl9maWxlSW5wdXQuY2xpY2soKTsgfQogICAgICB9KTsKICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZCh6b25lKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBvdmVyTGltaXQgPSB0aGlzLnJlZnMubGVuZ3RoID4gbWF4OwogICAgdmFyIGhlYWQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2VjdGlvbl9faGVhZCB2LWNyZWF0ZV9faW1naGVhZCcgfSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1leWVicm93JyB9LCAodGhpcy5yZWZzLmxlbmd0aCA+IDEgPyAnUmVmZXJlbmNlcycgOiAnU291cmNlIGltYWdlJykpLAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWxhYmVsIHYtY3JlYXRlX19pbWdjb3VudCcgKyAob3ZlckxpbWl0ID8gJyBpcy1vdmVyJyA6ICcnKSB9LAogICAgICAgIHRoaXMucmVmcy5sZW5ndGggKyAnIC8gJyArIG1heCkpOwogICAgc2VjdGlvbi5hcHBlbmRDaGlsZChoZWFkKTsKCiAgICB2YXIgZ3JpZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1ncmlkIHYtZ3JpZC0tYXV0byB2LWNyZWF0ZV9fdGh1bWJzJyB9KTsKICAgIHRoaXMuYmluZERuZChncmlkKTsKICAgIHRoaXMucmVmcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWYsIGlkeCkgewogICAgICB2YXIgdGh1bWIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3JlYXRlX190aHVtYicgKyAoaWR4ID09PSAwICYmIHNlbGYucmVmcy5sZW5ndGggPiAxID8gJyBpcy1wcmltYXJ5JyA6ICcnKSB9KTsKICAgICAgdmFyIHRodW1iSW1nID0gZWwoJ2ltZycsIHsgc3JjOiByZWYudXJsLCBhbHQ6IHJlZi5uYW1lIHx8ICgncmVmZXJlbmNlICcgKyAoaWR4ICsgMSkpLCBsb2FkaW5nOiAnbGF6eScgfSk7CiAgICAgIHRodW1iSW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyB0aHVtYi5jbGFzc0xpc3QuYWRkKCdpcy1icm9rZW4nKTsgfSk7CiAgICAgIHRodW1iLmFwcGVuZENoaWxkKHRodW1iSW1nKTsKICAgICAgaWYgKGlkeCA9PT0gMCAmJiBzZWxmLnJlZnMubGVuZ3RoID4gMSkgewogICAgICAgIHRodW1iLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtdGh1bWJfX2JhZGdlIHYtY3JlYXRlX190aHVtYi1iYWRnZScgfSwgJ0JlZm9yZScpKTsKICAgICAgfQogICAgICB2YXIgcm0gPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3JlYXRlX190aHVtYi1ybScsIHR5cGU6ICdidXR0b24nLCAnYXJpYS1sYWJlbCc6ICdSZW1vdmUgaW1hZ2UnLCB0aXRsZTogJ1JlbW92ZSBpbWFnZScgfSwKICAgICAgICBlbCgnc3BhbicsIHsgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBodG1sOiBpY29uKCd4bWFyaycpIHx8ICfDlycgfSkpOwogICAgICBzZWxmLm9uKHJtLCAnY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBzZWxmLnJlbW92ZVJlZihpZHgpOyB9KTsKICAgICAgdGh1bWIuYXBwZW5kQ2hpbGQocm0pOwogICAgICBncmlkLmFwcGVuZENoaWxkKHRodW1iKTsKICAgIH0pOwoKICAgIGlmICh0aGlzLnJlZnMubGVuZ3RoIDwgbWF4KSB7CiAgICAgIHZhciBhZGQgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3JlYXRlX190aHVtYiB2LWNyZWF0ZV9fdGh1bWItYWRkJywgdHlwZTogJ2J1dHRvbicsICdhcmlhLWxhYmVsJzogJ0FkZCBhbm90aGVyIGltYWdlJyB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3JlYXRlX19wbHVzJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBodG1sOiBpY29uKCdwbHVzJykgfHwgJysnIH0pLAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbGFiZWwnIH0sICcrJyArIChtYXggLSB0aGlzLnJlZnMubGVuZ3RoKSkpOwogICAgICBzZWxmLm9uKGFkZCwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBzZWxmLl9maWxlSW5wdXQuY2xpY2soKTsgfSk7CiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoYWRkKTsKICAgIH0KICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQoZ3JpZCk7CgogICAgaWYgKHRoaXMucmVmcy5sZW5ndGggPiBtYXgpIHsKICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtZXJyb3InIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7ICdhcmlhLWhpZGRlbic6ICd0cnVlJywgaHRtbDogaWNvbignZXhjbGFtYXRpb24nKSB8fCAnIScgfSksCiAgICAgICAgZWwoJ3NwYW4nLCBudWxsLCAnT25seSB0aGUgZmlyc3QgJyArIG1heCArICcgd2lsbCBiZSB1c2VkIGJ5ICcgKyAobW9kZWwubGFiZWwgfHwgJ3RoaXMgbW9kZWwnKSArICcuIFBpY2sgYSBoaWdoZXIgdGllciBmb3IgbW9yZS4nKSkpOwogICAgfQogICAgc2VjdGlvbi5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViJyB9LAogICAgICAnRWRpdGluZyBtb2RlIOKAlCBvdXRwdXQgc2l6ZSBmb2xsb3dzIHlvdXIgc291cmNlIGltYWdlLicpKTsKICB9OwoKICBmdW5jdGlvbiBkcm9wR2x5cGgoKSB7CiAgICByZXR1cm4gJzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjYiIGhlaWdodD0iMjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiAnICsKICAgICAgJ3N0cm9rZS13aWR0aD0iMS42IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGFyaWEtaGlkZGVuPSJ0cnVlIj4nICsKICAgICAgJzxyZWN0IHg9IjMiIHk9IjMiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjMiLz48Y2lyY2xlIGN4PSI4LjUiIGN5PSI5IiByPSIxLjgiLz4nICsKICAgICAgJzxwYXRoIGQ9Ik0yMSAxNmwtNS01LTcgNyIvPjwvc3ZnPic7CiAgfQoKICBDcmVhdG9yLnByb3RvdHlwZS5hZGRGaWxlcyA9IGZ1bmN0aW9uIChmaWxlTGlzdCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIGZpbGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZmlsZUxpc3QgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoZikgewogICAgICByZXR1cm4gZiAmJiBmLnR5cGUgJiYgZi50eXBlLmluZGV4T2YoJ2ltYWdlLycpID09PSAwOwogICAgfSk7CiAgICBpZiAoIWZpbGVzLmxlbmd0aCkgeyB0b2FzdCgnTm8gaW1hZ2UgZm91bmQgaW4gdGhhdCBkcm9wLicsICdlcnJvcicpOyByZXR1cm47IH0KICAgIHZhciBtb2RlbCA9IHRoaXMuY3VycmVudE1vZGVsKCk7CiAgICB2YXIgbWF4ID0gbWF4UmVmRm9yKG1vZGVsKTsKICAgIHZhciByb29tID0gbWF4IC0gdGhpcy5yZWZzLmxlbmd0aDsKICAgIGlmIChyb29tIDw9IDApIHsgdG9hc3QoJ1RoaXMgbW9kZWwgYWNjZXB0cyB1cCB0byAnICsgbWF4ICsgJyBpbWFnZScgKyAobWF4ID4gMSA/ICdzJyA6ICcnKSArICcuJywgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICBmaWxlcy5zbGljZSgwLCByb29tKS5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7CiAgICAgIHZhciB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGYpOwogICAgICBzZWxmLnJlZnMucHVzaCh7IGZpbGU6IGYsIHVybDogdXJsLCBuYW1lOiBmLm5hbWUgfHwgJ2ltYWdlJyB9KTsKICAgIH0pOwogICAgaWYgKGZpbGVzLmxlbmd0aCA+IHJvb20pIHRvYXN0KCdBZGRlZCAnICsgcm9vbSArICc7IHRoaXMgbW9kZWwgbWF4ZXMgYXQgJyArIG1heCArICcuJywgJ2luZm8nKTsKICAgIHRoaXMuYWZ0ZXJJbnB1dENoYW5nZSgpOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnJlbW92ZVJlZiA9IGZ1bmN0aW9uIChpZHgpIHsKICAgIHZhciByZWYgPSB0aGlzLnJlZnNbaWR4XTsKICAgIGlmIChyZWYgJiYgcmVmLnVybCAmJiByZWYudXJsLmluZGV4T2YoJ2Jsb2I6JykgPT09IDApIHsgdHJ5IHsgVVJMLnJldm9rZU9iamVjdFVSTChyZWYudXJsKTsgfSBjYXRjaCAoZSkge30gfQogICAgdGhpcy5yZWZzLnNwbGljZShpZHgsIDEpOwogICAgdGhpcy5hZnRlcklucHV0Q2hhbmdlKCk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuY2xlYXJSZWZzID0gZnVuY3Rpb24gKCkgewogICAgdGhpcy5yZWZzLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgaWYgKHIudXJsICYmIHIudXJsLmluZGV4T2YoJ2Jsb2I6JykgPT09IDApIHsgdHJ5IHsgVVJMLnJldm9rZU9iamVjdFVSTChyLnVybCk7IH0gY2F0Y2ggKGUpIHt9IH0gfSk7CiAgICB0aGlzLnJlZnMgPSBbXTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5hZnRlcklucHV0Q2hhbmdlID0gZnVuY3Rpb24gKCkgewogICAgdGhpcy5yZW5kZXJJbWFnZVpvbmUoKTsKICAgIHRoaXMucmVmcmVzaEFzcGVjdFZpc2liaWxpdHkoKTsKICAgIHRoaXMucmVmcmVzaENUQSgpOwogICAgaWYgKHRoaXMuX3Byb21wdEZpZWxkKSB0aGlzLl9wcm9tcHRGaWVsZC5wbGFjZWhvbGRlciA9IHRoaXMucGxhY2Vob2xkZXJGb3JNb2RlKCk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUucGxhY2Vob2xkZXJGb3JNb2RlID0gZnVuY3Rpb24gKCkgewogICAgaWYgKHRoaXMuaGFzSW5wdXQoKSkgcmV0dXJuICdEZXNjcmliZSB0aGUgY2hhbmdlIOKAlCBlLmcuICJzdGFnZSB3aXRoIHdhcm0gbW9kZXJuIGZ1cm5pdHVyZSLigKYgKG9wdGlvbmFsIHdpdGggYSBwcmVzZXQpJzsKICAgIHJldHVybiBwbGFjZWhvbGRlclRleHQoKTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5idWlsZFByb21wdCA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciBncm91cCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCB2LWNyZWF0ZV9fcHJvbXB0JyB9KTsKICAgIGdyb3VwLmFwcGVuZENoaWxkKGVsKCdsYWJlbCcsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnLCBmb3I6ICd2LXByb21wdCcgfSwgJ1Byb21wdCcpKTsKCiAgICB2YXIgd3JhcCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX3RhLXdyYXAnIH0pOwogICAgdmFyIHRhID0gZWwoJ3RleHRhcmVhJywgewogICAgICBpZDogJ3YtcHJvbXB0JywgY2xhc3M6ICd2LXRleHRhcmVhIHYtdGV4dGFyZWEtLWxnIHYtY3JlYXRlX190YScsIHJvd3M6ICczJywKICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXJGb3JNb2RlKCksCiAgICAgICdhcmlhLWRlc2NyaWJlZGJ5JzogJ3YtcHJvbXB0LWhlbHAnCiAgICB9KTsKICAgIHRhLnZhbHVlID0gdGhpcy5wcm9tcHQ7CiAgICB0aGlzLl9wcm9tcHRGaWVsZCA9IHRhOwoKICAgIHZhciBjbGVhckJ0biA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jcmVhdGVfX3RhLWNsZWFyJywgdHlwZTogJ2J1dHRvbicsICdhcmlhLWxhYmVsJzogJ0NsZWFyIHByb21wdCcsIHRpdGxlOiAnQ2xlYXIgcHJvbXB0JyB9LAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fdGEtY2xlYXItZ2x5cGgnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIGh0bWw6IGljb24oJ3htYXJrJykgfHwgJ8OXJyB9KSk7CiAgICBjbGVhckJ0bi5oaWRkZW4gPSAhdGhpcy5wcm9tcHQ7CgogICAgdmFyIGF1dG8gPSBmdW5jdGlvbiAoKSB7CiAgICAgIHRhLnN0eWxlLmhlaWdodCA9ICdhdXRvJzsKICAgICAgdGEuc3R5bGUuaGVpZ2h0ID0gTWF0aC5taW4odGEuc2Nyb2xsSGVpZ2h0LCAzMjApICsgJ3B4JzsKICAgIH07CiAgICB0aGlzLm9uKHRhLCAnaW5wdXQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHNlbGYucHJvbXB0ID0gdGEudmFsdWU7CiAgICAgIGF1dG8oKTsKICAgICAgc2VsZi5yZWZyZXNoQ1RBKCk7CiAgICAgIGNsZWFyQnRuLmhpZGRlbiA9ICF0YS52YWx1ZTsKICAgIH0pOwogICAgdGhpcy5vbih0YSwgJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpICYmIGUua2V5ID09PSAnRW50ZXInKSB7IGUucHJldmVudERlZmF1bHQoKTsgc2VsZi5nZW5lcmF0ZSgpOyB9CiAgICB9KTsKICAgIHRoaXMub24oY2xlYXJCdG4sICdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgdGEudmFsdWUgPSAnJzsgc2VsZi5wcm9tcHQgPSAnJzsgYXV0bygpOyBzZWxmLnJlZnJlc2hDVEEoKTsKICAgICAgY2xlYXJCdG4uaGlkZGVuID0gdHJ1ZTsgdGEuZm9jdXMoKTsKICAgIH0pOwoKICAgIHdyYXAuYXBwZW5kQ2hpbGQodGEpOwogICAgd3JhcC5hcHBlbmRDaGlsZChjbGVhckJ0bik7CiAgICBncm91cC5hcHBlbmRDaGlsZCh3cmFwKTsKCiAgICB2YXIgaGVscCA9IGVsKCdkaXYnLCB7IGlkOiAndi1wcm9tcHQtaGVscCcsIGNsYXNzOiAndi1jcmVhdGVfX2hlbHAgdi1zZWN0aW9uX19zdWInIH0pOwogICAgdGhpcy5fcHJvbXB0SGVscCA9IGhlbHA7CiAgICBncm91cC5hcHBlbmRDaGlsZChoZWxwKTsKCiAgICBzZXRUaW1lb3V0KGF1dG8sIDApOwogICAgdGhpcy5yZWZyZXNoUHJvbXB0SGVscCgpOwogICAgcmV0dXJuIGdyb3VwOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnJlZnJlc2hQcm9tcHRIZWxwID0gZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLl9wcm9tcHRIZWxwKSByZXR1cm47CiAgICB2YXIgbiA9ICh0aGlzLnByb21wdCB8fCAnJykudHJpbSgpLmxlbmd0aDsKICAgIHZhciBtc2csIGNscyA9ICd2LWNyZWF0ZV9faGVscCB2LXNlY3Rpb25fX3N1Yic7CiAgICBpZiAodGhpcy5oYXNJbnB1dCgpKSB7CiAgICAgIG1zZyA9IHRoaXMuYWN0aXZlUHJlc2V0ID8gKCdVc2luZyBwcmVzZXQg4oCcJyArIGVzYyh0aGlzLmFjdGl2ZVByZXNldC5uYW1lKSArICfigJ0gKyB5b3VyIHRleHQuJykKICAgICAgICA6ICdEZXNjcmliZSB0aGUgdHJhbnNmb3JtYXRpb24sIG9yIHBpY2sgYSBwcmVzZXQuJzsKICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVQcmVzZXQpIHsKICAgICAgbXNnID0gJ1ByZXNldCDigJwnICsgZXNjKHRoaXMuYWN0aXZlUHJlc2V0Lm5hbWUpICsgJ+KAnSBhY3RpdmUuIEFkZCB0ZXh0IHRvIHJlZmluZS4nOwogICAgfSBlbHNlIGlmIChuID09PSAwKSB7CiAgICAgIG1zZyA9ICdUZXh0LXRvLWltYWdlIG5lZWRzIGF0IGxlYXN0IDggY2hhcmFjdGVycy4nOwogICAgfSBlbHNlIGlmIChuIDwgOCkgewogICAgICBtc2cgPSAoOCAtIG4pICsgJyBtb3JlIGNoYXJhY3RlcicgKyAoKDggLSBuKSA9PT0gMSA/ICcnIDogJ3MnKSArICcgdG8gZ2VuZXJhdGUuJzsKICAgICAgY2xzICs9ICcgaXMtd2Fybic7CiAgICB9IGVsc2UgewogICAgICBtc2cgPSAnUmVhZHkuICcgKyBuICsgJyBjaGFyYWN0ZXJzLic7CiAgICAgIGNscyArPSAnIGlzLW9rJzsKICAgIH0KICAgIHRoaXMuX3Byb21wdEhlbHAuY2xhc3NOYW1lID0gY2xzOwogICAgdGhpcy5fcHJvbXB0SGVscC5pbm5lckhUTUwgPSBtc2c7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRQcmVzZXRzID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlY3Rpb24gPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZmllbGQtZ3JvdXAgdi1jcmVhdGVfX3ByZXNldHMnIH0pOwogICAgc2VjdGlvbi5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnIH0sICdTdHlsZSBwcmVzZXRzJykpOwoKICAgIHZhciBob3N0ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fcHJlc2V0aG9zdCcgfSk7CiAgICB0aGlzLl9wcmVzZXRIb3N0ID0gaG9zdDsKICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQoaG9zdCk7CgogICAgdGhpcy5pbml0UHJlc2V0Q2hpcHMoKTsKICAgIHJldHVybiBzZWN0aW9uOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmluaXRQcmVzZXRDaGlwcyA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciBob3N0ID0gdGhpcy5fcHJlc2V0SG9zdDsKICAgIGlmICghaG9zdCkgcmV0dXJuOwoKICAgIHZhciBvblNlbGVjdCA9IGZ1bmN0aW9uIChwcmVzZXQpIHsKICAgICAgaWYgKHNlbGYuYWN0aXZlUHJlc2V0ICYmIHByZXNldCAmJiBzZWxmLmFjdGl2ZVByZXNldC5pZCA9PT0gcHJlc2V0LmlkKSB7CiAgICAgICAgc2VsZi5hY3RpdmVQcmVzZXQgPSBudWxsOwogICAgICAgIGlmIChzZWxmLl9wcmVzZXRDdGwgJiYgc2VsZi5fcHJlc2V0Q3RsLnNldEFjdGl2ZSkgc2VsZi5fcHJlc2V0Q3RsLnNldEFjdGl2ZShudWxsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZWxmLmFjdGl2ZVByZXNldCA9IHByZXNldCB8fCBudWxsOwogICAgICB9CiAgICAgIHNlbGYucmVmcmVzaENUQSgpOwogICAgICBzZWxmLnJlZnJlc2hQcm9tcHRIZWxwKCk7CiAgICB9OwoKICAgIHZhciByZW5kZXJlZCA9IGZhbHNlOwogICAgaWYgKFYucHJlc2V0cyAmJiB0eXBlb2YgVi5wcmVzZXRzLnJlbmRlckNoaXBzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdGhpcy5fcHJlc2V0Q3RsID0gVi5wcmVzZXRzLnJlbmRlckNoaXBzKGhvc3QsIHsKICAgICAgICAgIHNlbGVjdGVkSWQ6IHNlbGYuYWN0aXZlUHJlc2V0ID8gc2VsZi5hY3RpdmVQcmVzZXQuaWQgOiBudWxsLAogICAgICAgICAgc2VsZWN0ZWRLZXk6IHNlbGYuYWN0aXZlUHJlc2V0ID8gKHNlbGYuYWN0aXZlUHJlc2V0LmtleSB8fCBzZWxmLmFjdGl2ZVByZXNldC5pZCkgOiBudWxsLAogICAgICAgICAgb25TZWxlY3Q6IG9uU2VsZWN0CiAgICAgICAgfSkgfHwgbnVsbDsKICAgICAgICByZW5kZXJlZCA9IGhvc3QuY2hpbGROb2Rlcy5sZW5ndGggPiAwOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmVuZGVyZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKCFyZW5kZXJlZCkgdGhpcy5yZW5kZXJGYWxsYmFja0NoaXBzKGhvc3QsIG9uU2VsZWN0KTsKICB9OwoKICB2YXIgRkFMTEJBQ0tfUFJFU0VUUyA9IFsKICAgIHsgaWQ6ICdyZW1vdmVBbGxGdXJuaXR1cmUnLCBuYW1lOiAnRW1wdHkgUm9vbScsIHByb21wdDogJ1JlbW92ZSBhbGwgZnVybml0dXJlLCBwZXJzb25hbCBpdGVtcywgY2x1dHRlciwgYW5kIGJlbG9uZ2luZ3MgZnJvbSB0aGUgcm9vbSB3aGlsZSBrZWVwaW5nIHRoZSBhcmNoaXRlY3R1cmFsIGZlYXR1cmVzLCB3YWxscywgd2luZG93cywgYW5kIGZsb29yaW5nIGV4YWN0bHkgdGhlIHNhbWUuIENyZWF0ZSBhIGNvbXBsZXRlbHkgZW1wdHksIGNsZWFuIHNwYWNlIHJlYWR5IGZvciBwcm9mZXNzaW9uYWwgc3RhZ2luZy4nIH0sCiAgICB7IGlkOiAncmVtb3ZlQ2x1dHRlcicsIG5hbWU6ICdEZWNsdXR0ZXInLCBwcm9tcHQ6ICdSZW1vdmUgY2x1dHRlciwgcGVyc29uYWwgaXRlbXMsIGFuZCBzbWFsbCBiZWxvbmdpbmdzIHdoaWxlIGtlZXBpbmcgdGhlIGV4aXN0aW5nIGZ1cm5pdHVyZSBhbmQgbGF5b3V0IGludGFjdC4gTWFrZSB0aGUgc3BhY2UgbG9vayB0aWR5IGFuZCBjbGVhbi4nIH0sCiAgICB7IGlkOiAnbW9kZXJuU3RhZ2luZycsIG5hbWU6ICdNb2Rlcm4gU3RhZ2luZycsIHByb21wdDogJ1N0YWdlIHRoaXMgcm9vbSB3aXRoIGNsZWFuIG1vZGVybiBmdXJuaXR1cmUsIG5ldXRyYWwgdG9uZXMsIGFuZCB0YXN0ZWZ1bCBkZWNvciBmb3IgYSBwcm9mZXNzaW9uYWwgcmVhbC1lc3RhdGUgbGlzdGluZy4nIH0sCiAgICB7IGlkOiAnaW1wcm92ZUxpZ2h0aW5nJywgbmFtZTogJ0JldHRlciBMaWdodCcsIHByb21wdDogJ0ltcHJvdmUgdGhlIGxpZ2h0aW5nIHRvIGJyaWdodCwgd2FybSwgbmF0dXJhbCBkYXlsaWdodCB3aGlsZSBrZWVwaW5nIGV2ZXJ5dGhpbmcgZWxzZSB0aGUgc2FtZS4nIH0sCiAgICB7IGlkOiAnYWRkTGFuZHNjYXBpbmcnLCBuYW1lOiAnQWRkIExhbmRzY2FwaW5nJywgcHJvbXB0OiAnQWRkIGx1c2gsIHdlbGwtbWFpbnRhaW5lZCBsYW5kc2NhcGluZyB3aXRoIGhlYWx0aHkgcGxhbnRzLCBmcmVzaCBtdWxjaCwgYW5kIGNsZWFuIGVkZ2VzIHRvIHRoZSBleHRlcmlvci4nIH0sCiAgICB7IGlkOiAnaW1wcm92ZUV4dGVyaW9yJywgbmFtZTogJ0ZpeCBFeHRlcmlvcicsIHByb21wdDogJ1JlcGFpciBhbmQgcmVmcmVzaCB0aGUgZXh0ZXJpb3Ig4oCUIGNsZWFuIHNpZGluZywgY3Jpc3AgdHJpbSwgYW5kIGEgdGlkeSwgd2VsbC1rZXB0IGZhY2FkZS4nIH0KICBdOwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZW5kZXJGYWxsYmFja0NoaXBzID0gZnVuY3Rpb24gKGhvc3QsIG9uU2VsZWN0KSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBob3N0LmlubmVySFRNTCA9ICcnOwogICAgdmFyIHNjcm9sbGVyID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNoaXAtcm93Jywgcm9sZTogJ2xpc3Rib3gnLCAnYXJpYS1sYWJlbCc6ICdTdHlsZSBwcmVzZXRzJyB9KTsKICAgIGhvc3QuYXBwZW5kQ2hpbGQoc2Nyb2xsZXIpOwogICAgRkFMTEJBQ0tfUFJFU0VUUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7CiAgICAgIHZhciBhY3RpdmUgPSBzZWxmLmFjdGl2ZVByZXNldCAmJiBzZWxmLmFjdGl2ZVByZXNldC5pZCA9PT0gcC5pZDsKICAgICAgdmFyIGNoaXAgPSBlbCgnYnV0dG9uJywgewogICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgIGNsYXNzOiAndi1jaGlwJyArIChhY3RpdmUgPyAnIHYtY2hpcC0tYWN0aXZlJyA6ICcnKSwKICAgICAgICByb2xlOiAnb3B0aW9uJywgJ2FyaWEtc2VsZWN0ZWQnOiBhY3RpdmUgPyAndHJ1ZScgOiAnZmFsc2UnCiAgICAgIH0sIHAubmFtZSk7CiAgICAgIHNlbGYub24oY2hpcCwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgIG9uU2VsZWN0KHApOwogICAgICAgIHZhciBub2RlcyA9IHNjcm9sbGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy52LWNoaXAnKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBub2Rlc1tpXS5jbGFzc0xpc3QucmVtb3ZlKCd2LWNoaXAtLWFjdGl2ZScpOwogICAgICAgICAgbm9kZXNbaV0uc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgJ2ZhbHNlJyk7CiAgICAgICAgfQogICAgICAgIGlmIChzZWxmLmFjdGl2ZVByZXNldCAmJiBzZWxmLmFjdGl2ZVByZXNldC5pZCA9PT0gcC5pZCkgewogICAgICAgICAgY2hpcC5jbGFzc0xpc3QuYWRkKCd2LWNoaXAtLWFjdGl2ZScpOwogICAgICAgICAgY2hpcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCAndHJ1ZScpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHNjcm9sbGVyLmFwcGVuZENoaWxkKGNoaXApOwogICAgfSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRTZWxlY3RvcnMgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgcm93ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fc2VsZWN0b3JzJyB9KTsKCiAgICB2YXIgbW9kZWxGaWVsZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCcgfSwKICAgICAgZWwoJ2xhYmVsJywgeyBjbGFzczogJ3YtZXllYnJvdycsIGZvcjogJ3YtbW9kZWwnIH0sICdNb2RlbCcpKTsKICAgIHZhciBtb2RlbFNlbCA9IGVsKCdzZWxlY3QnLCB7IGlkOiAndi1tb2RlbCcsIGNsYXNzOiAndi1zZWxlY3QnLCAnYXJpYS1sYWJlbCc6ICdNb2RlbCcgfSk7CiAgICBtb2RlbHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgIHZhciBiaXRzID0gW20ubGFiZWwgfHwgbS5yYXddOwogICAgICBpZiAobS5zdWJoZWFkaW5nKSBiaXRzLnB1c2gobS5zdWJoZWFkaW5nKTsKICAgICAgaWYgKHR5cGVvZiBtLmNvc3QgPT09ICdudW1iZXInKSBiaXRzLnB1c2gobS5jb3N0ICsgJyBjcicpOwogICAgICB2YXIgb3B0ID0gZWwoJ29wdGlvbicsIHsgdmFsdWU6IG0ucmF3IH0sIGJpdHMuam9pbignICDCtyAgJykpOwogICAgICBpZiAobS5yYXcgPT09IHNlbGYubW9kZWxSYXcpIG9wdC5zZWxlY3RlZCA9IHRydWU7CiAgICAgIG1vZGVsU2VsLmFwcGVuZENoaWxkKG9wdCk7CiAgICB9KTsKICAgIHRoaXMub24obW9kZWxTZWwsICdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHNlbGYubW9kZWxSYXcgPSBtb2RlbFNlbC52YWx1ZTsKICAgICAgd3JpdGVQZXJzaXN0ZWQoJ21vZGVsJywgc2VsZi5tb2RlbFJhdyk7CiAgICAgIHZhciBtYXggPSBtYXhSZWZGb3Ioc2VsZi5jdXJyZW50TW9kZWwoKSk7CiAgICAgIGlmIChzZWxmLnJlZnMubGVuZ3RoID4gbWF4KSB7CiAgICAgICAgd2hpbGUgKHNlbGYucmVmcy5sZW5ndGggPiBtYXgpIHsKICAgICAgICAgIHZhciByID0gc2VsZi5yZWZzLnBvcCgpOwogICAgICAgICAgaWYgKHIgJiYgci51cmwgJiYgci51cmwuaW5kZXhPZignYmxvYjonKSA9PT0gMCkgeyB0cnkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHIudXJsKTsgfSBjYXRjaCAoZSkge30gfQogICAgICAgIH0KICAgICAgICB0b2FzdCgnVHJpbW1lZCB0byAnICsgbWF4ICsgJyBpbWFnZScgKyAobWF4ID4gMSA/ICdzJyA6ICcnKSArICcgZm9yICcgKyAoc2VsZi5jdXJyZW50TW9kZWwoKS5sYWJlbCB8fCAnbW9kZWwnKSArICcuJywgJ2luZm8nKTsKICAgICAgfQogICAgICBzZWxmLnJlbmRlckltYWdlWm9uZSgpOwogICAgICBzZWxmLnJlZnJlc2hDVEEoKTsKICAgIH0pOwogICAgbW9kZWxGaWVsZC5hcHBlbmRDaGlsZChtb2RlbFNlbCk7CiAgICB2YXIgbW9kZWxIaW50ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YiB2LWNyZWF0ZV9fc2Vsbm90ZScgfSk7CiAgICB0aGlzLl9tb2RlbEhpbnQgPSBtb2RlbEhpbnQ7CiAgICBtb2RlbEZpZWxkLmFwcGVuZENoaWxkKG1vZGVsSGludCk7CiAgICByb3cuYXBwZW5kQ2hpbGQobW9kZWxGaWVsZCk7CgogICAgdmFyIGFzcGVjdEZpZWxkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWZpZWxkLWdyb3VwIHYtY3JlYXRlX19hc3BlY3QnIH0sCiAgICAgIGVsKCdsYWJlbCcsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnLCBmb3I6ICd2LWFzcGVjdCcgfSwgJ0FzcGVjdCByYXRpbycpKTsKICAgIHZhciBhc3BlY3RTZWwgPSBlbCgnc2VsZWN0JywgeyBpZDogJ3YtYXNwZWN0JywgY2xhc3M6ICd2LXNlbGVjdCcsICdhcmlhLWxhYmVsJzogJ0FzcGVjdCByYXRpbycgfSk7CiAgICBhc3BlY3RzKCkuZm9yRWFjaChmdW5jdGlvbiAoYSkgewogICAgICB2YXIgb3B0ID0gZWwoJ29wdGlvbicsIHsgdmFsdWU6IGEucmF3IH0sIChhLmxhYmVsIHx8IGEucmF3KSArICcgIMK3ICAnICsgYS53ICsgJ8OXJyArIGEuaCk7CiAgICAgIGlmIChhLnJhdyA9PT0gc2VsZi5hc3BlY3RSYXcpIG9wdC5zZWxlY3RlZCA9IHRydWU7CiAgICAgIGFzcGVjdFNlbC5hcHBlbmRDaGlsZChvcHQpOwogICAgfSk7CiAgICB0aGlzLm9uKGFzcGVjdFNlbCwgJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgc2VsZi5hc3BlY3RSYXcgPSBhc3BlY3RTZWwudmFsdWU7CiAgICAgIHdyaXRlUGVyc2lzdGVkKCdhc3BlY3QnLCBzZWxmLmFzcGVjdFJhdyk7CiAgICB9KTsKICAgIGFzcGVjdEZpZWxkLmFwcGVuZENoaWxkKGFzcGVjdFNlbCk7CiAgICB2YXIgYXNwZWN0Tm90ZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zZWN0aW9uX19zdWIgdi1jcmVhdGVfX3NlbG5vdGUnIH0sICdPdXRwdXQgZGltZW5zaW9ucyBmb3IgdGV4dC10by1pbWFnZS4nKTsKICAgIGFzcGVjdEZpZWxkLmFwcGVuZENoaWxkKGFzcGVjdE5vdGUpOwogICAgdGhpcy5fYXNwZWN0RmllbGQgPSBhc3BlY3RGaWVsZDsKICAgIHRoaXMuX2FzcGVjdFNlbCA9IGFzcGVjdFNlbDsKICAgIHRoaXMuX2FzcGVjdE5vdGUgPSBhc3BlY3ROb3RlOwogICAgcm93LmFwcGVuZENoaWxkKGFzcGVjdEZpZWxkKTsKCiAgICB0aGlzLnJlZnJlc2hNb2RlbEhpbnQoKTsKICAgIHJldHVybiByb3c7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUucmVmcmVzaE1vZGVsSGludCA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdGhpcy5fbW9kZWxIaW50KSByZXR1cm47CiAgICB2YXIgYyA9IHRoaXMudW5pdENvc3QoKTsKICAgIHZhciBjcmVkcyA9IGMgKyAnIGNyZWRpdCcgKyAoYyA9PT0gMSA/ICcnIDogJ3MnKSArICcgcGVyIGdlbmVyYXRpb24nOwogICAgaWYgKHRoaXMuaXNUMkkoKSkgewogICAgICB0aGlzLl9tb2RlbEhpbnQudGV4dENvbnRlbnQgPSAnR2VuZXJhdGVzIGZyb20gdGV4dCDCtyAnICsgY3JlZHM7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBtID0gdGhpcy5jdXJyZW50TW9kZWwoKTsKICAgIHZhciBtYXggPSBtYXhSZWZGb3IobSk7CiAgICB0aGlzLl9tb2RlbEhpbnQudGV4dENvbnRlbnQgPSAobWF4ID4gMSkKICAgICAgPyAoJ1VwIHRvICcgKyBtYXggKyAnIHJlZmVyZW5jZSBpbWFnZXMgwrcgJyArIGNyZWRzKQogICAgICA6IGNyZWRzOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnJlZnJlc2hBc3BlY3RWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLl9hc3BlY3RGaWVsZCkgcmV0dXJuOwogICAgdmFyIGVkaXRpbmcgPSB0aGlzLmhhc0lucHV0KCk7CiAgICB0aGlzLl9hc3BlY3RGaWVsZC5jbGFzc0xpc3QudG9nZ2xlKCdpcy1kaXNhYmxlZCcsIGVkaXRpbmcpOwogICAgaWYgKHRoaXMuX2FzcGVjdFNlbCkgdGhpcy5fYXNwZWN0U2VsLmRpc2FibGVkID0gZWRpdGluZzsKICAgIGlmICh0aGlzLl9hc3BlY3ROb3RlKSB7CiAgICAgIHRoaXMuX2FzcGVjdE5vdGUudGV4dENvbnRlbnQgPSBlZGl0aW5nCiAgICAgICAgPyAnTG9ja2VkIOKAlCBlZGl0cyBrZWVwIHRoZSBzb3VyY2UgaW1hZ2UgcHJvcG9ydGlvbnMuJwogICAgICAgIDogJ091dHB1dCBkaW1lbnNpb25zIGZvciB0ZXh0LXRvLWltYWdlLic7CiAgICB9CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRBY3Rpb25zID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIGJhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX2FjdGlvbnMnIH0pOwoKICAgIHZhciBjdGEgPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWNyZWF0ZV9fZ28nIH0pOwogICAgdGhpcy5fY3RhID0gY3RhOwogICAgdGhpcy5vbihjdGEsICdjbGljaycsIGZ1bmN0aW9uICgpIHsgc2VsZi5nZW5lcmF0ZSgpOyB9KTsKICAgIGJhci5hcHBlbmRDaGlsZChjdGEpOwoKICAgIHZhciB2YXJCdG4gPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jcmVhdGVfX3ZhcicsCiAgICAgICdhcmlhLXByZXNzZWQnOiAnZmFsc2UnLCB0aXRsZTogJ0dlbmVyYXRlIGZvdXIgYXQgb25jZScgfSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jdGFfX2ljb24nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIGh0bWw6IGljb24oJ3NwYXJrbGVzJykgfHwgJ+KcpicgfSksCiAgICAgIGVsKCdzcGFuJywgbnVsbCwgJ8OXNCcpKTsKICAgIHRoaXMub24odmFyQnRuLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgIHNlbGYudmFyaWF0aW9ucyA9ICFzZWxmLnZhcmlhdGlvbnM7CiAgICAgIHZhckJ0bi5jbGFzc0xpc3QudG9nZ2xlKCd2LWN0YS0tYnJhbmQnLCBzZWxmLnZhcmlhdGlvbnMpOwogICAgICB2YXJCdG4uY2xhc3NMaXN0LnRvZ2dsZSgndi1jdGEtLWdob3N0JywgIXNlbGYudmFyaWF0aW9ucyk7CiAgICAgIHZhckJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIHNlbGYudmFyaWF0aW9ucyA/ICd0cnVlJyA6ICdmYWxzZScpOwogICAgICBzZWxmLnJlZnJlc2hDVEEoKTsKICAgIH0pOwogICAgdGhpcy5fdmFyQnRuID0gdmFyQnRuOwogICAgYmFyLmFwcGVuZENoaWxkKHZhckJ0bik7CgogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3JlYXRlX19hY3Rpb253cmFwJyB9LCBiYXIsCiAgICAgIGVsKCdwJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViIHYtY3JlYXRlX19sZWdhbCcgfSwKICAgICAgICAnQ3JlZGl0cyBhcmUgc3BlbnQgcGVyIGdlbmVyYXRpb24uICcsCiAgICAgICAgZWwoJ2EnLCB7IGhyZWY6ICcjL2FjY291bnQnLCBjbGFzczogJ3YtbGluaycgfSwgJ01hbmFnZSBjcmVkaXRzJykpKTsKCiAgICByZXR1cm4gd3JhcDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZWZyZXNoQ1RBID0gZnVuY3Rpb24gKCkgewogICAgaWYgKHRoaXMuX2N0YSkgewogICAgICB2YXIgb2sgPSB0aGlzLmNhblN1Ym1pdCgpOwogICAgICB0aGlzLl9jdGEuZGlzYWJsZWQgPSAhb2s7CiAgICAgIHRoaXMuX2N0YS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnLCBvayA/ICdmYWxzZScgOiAndHJ1ZScpOwogICAgICB0aGlzLl9jdGEuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtYnVzeScsICEhdGhpcy5idXN5KTsKICAgICAgdmFyIGNvc3QgPSB0aGlzLnRvdGFsQ29zdCgpOwogICAgICB2YXIgY291bnQgPSB0aGlzLnZhcmlhdGlvbnMgPyA0IDogMTsKICAgICAgdmFyIGxhYmVsID0gdGhpcy5oYXNJbnB1dCgpID8gJ1RyYW5zZm9ybScgOiAnR2VuZXJhdGUnOwogICAgICB0aGlzLl9jdGEuaW5uZXJIVE1MID0gJyc7CiAgICAgIGlmICh0aGlzLmJ1c3kpIHsKICAgICAgICB0aGlzLl9jdGEuc2V0QXR0cmlidXRlKCdhcmlhLWJ1c3knLCAndHJ1ZScpOwogICAgICAgIHRoaXMuX2N0YS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fZ28tc3BpbicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KSk7CiAgICAgICAgdGhpcy5fY3RhLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3JlYXRlX19nby1sYWJlbCcgfSwgJ1dvcmtpbmfigKYnKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5fY3RhLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1idXN5Jyk7CiAgICAgICAgdGhpcy5fY3RhLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3RhX19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBodG1sOiBpY29uKCdib2x0JykgfHwgJ+KaoScgfSkpOwogICAgICAgIHRoaXMuX2N0YS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fZ28tbGFiZWwnIH0sCiAgICAgICAgICBsYWJlbCArIChjb3VudCA+IDEgPyAoJyDDlycgKyBjb3VudCkgOiAnJykpKTsKICAgICAgICB0aGlzLl9jdGEuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVhdGVfX2dvLWNvc3QnIH0sIGNvc3QgKyAnIGNyJykpOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5fdmFyQnRuKSB0aGlzLl92YXJCdG4uZGlzYWJsZWQgPSAhIXRoaXMuYnVzeTsKICAgIHRoaXMucmVmcmVzaE1vZGVsSGludCgpOwogICAgdGhpcy5yZWZyZXNoUHJvbXB0SGVscCgpOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmJ1aWxkU2lkZSA9IGZ1bmN0aW9uIChsaWJyYXJ5RW1wdHkpIHsKICAgIHZhciBjb2wgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CgogICAgaWYgKGxpYnJhcnlFbXB0eSkgewogICAgICBjb2wuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX2hlYWQnIH0sCiAgICAgICAgZWwoJ2RpdicsIG51bGwsCiAgICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnIH0sICdJbnNwaXJhdGlvbicpLAogICAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1zZWN0aW9uX19zdWInIH0sICdUYXAgYW55IGxvb2sgdG8gbG9hZCBpdHMgcHJvbXB0LicpKSkpOwoKICAgICAgdmFyIGZlZWRIb3N0ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fZmVlZCcgfSk7CiAgICAgIHRoaXMuX2ZlZWRIb3N0ID0gZmVlZEhvc3Q7CiAgICAgIGNvbC5hcHBlbmRDaGlsZChmZWVkSG9zdCk7CiAgICAgIHRoaXMucmVuZGVySW5saW5lRmVlZChmZWVkSG9zdCk7CiAgICB9IGVsc2UgewogICAgICBjb2wuYXBwZW5kQ2hpbGQodGhpcy5idWlsZFJlY2VudFN0cmlwKCkpOwogICAgfQogICAgcmV0dXJuIGNvbDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZW5kZXJJbmxpbmVGZWVkID0gZnVuY3Rpb24gKGhvc3QpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciByZW5kZXJlZCA9IGZhbHNlOwogICAgaWYgKFYudmlld3MuZmVlZCAmJiB0eXBlb2YgVi52aWV3cy5mZWVkLnJlbmRlcklubGluZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgewogICAgICAgIHZhciBvdXQgPSBWLnZpZXdzLmZlZWQucmVuZGVySW5saW5lKGhvc3QsIHsKICAgICAgICAgIG9uQXBwbHk6IGZ1bmN0aW9uIChleGFtcGxlKSB7IHNlbGYuYXBwbHlFeGFtcGxlKGV4YW1wbGUpOyB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKG91dCBpbnN0YW5jZW9mIE5vZGUgJiYgb3V0ICE9PSBob3N0KSBob3N0LmFwcGVuZENoaWxkKG91dCk7CiAgICAgICAgcmVuZGVyZWQgPSBob3N0LmNoaWxkTm9kZXMubGVuZ3RoID4gMCB8fCBvdXQgIT0gbnVsbDsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJlbmRlcmVkID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmICghcmVuZGVyZWQpIHRoaXMucmVuZGVyRmVlZEZhbGxiYWNrKGhvc3QpOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnJlbmRlckZlZWRGYWxsYmFjayA9IGZ1bmN0aW9uIChob3N0KSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBob3N0LmlubmVySFRNTCA9ICcnOwogICAgdmFyIHNrID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWdyaWQgdi1ncmlkLS1hdXRvJyB9KTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgIGlmICh1aSgpLnNrZWxldG9uKSB7IHRyeSB7IHNrLmFwcGVuZENoaWxkKHVpKCkuc2tlbGV0b24oJ2NhcmQnKSk7IGNvbnRpbnVlOyB9IGNhdGNoIChlKSB7fSB9CiAgICAgIHNrLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbicsIHN0eWxlOiAnYXNwZWN0LXJhdGlvOjEvMScgfSkpOwogICAgfQogICAgaG9zdC5hcHBlbmRDaGlsZChzayk7CgogICAgaWYgKCFhcGkoKS5jdXJhdGVkRmVlZCkgewogICAgICBob3N0LmlubmVySFRNTCA9ICcnOwogICAgICBob3N0LmFwcGVuZENoaWxkKGVtcHR5QmxvY2soJ1lvdXIgY3JlYXRpb25zIHdpbGwgYXBwZWFyIGhlcmUuJywgJ1N0YXJ0IGJ5IHdyaXRpbmcgYSBwcm9tcHQgb3IgZHJvcHBpbmcgYW4gaW1hZ2UuJywgJ2ltYWdlJykpOwogICAgICByZXR1cm47CiAgICB9CiAgICBhcGkoKS5jdXJhdGVkRmVlZCgwLCAxMikudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgIGlmIChzZWxmLl9kZXN0cm95ZWQpIHJldHVybjsKICAgICAgdmFyIGl0ZW1zID0gKHJlcyAmJiAocmVzLml0ZW1zIHx8IHJlcykpIHx8IFtdOwogICAgICBob3N0LmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgewogICAgICAgIGhvc3QuYXBwZW5kQ2hpbGQoZW1wdHlCbG9jaygnTm8gaW5zcGlyYXRpb24geWV0LicsICdCZSB0aGUgZmlyc3QgdG8gY3JlYXRlIHNvbWV0aGluZy4nLCAnc3BhcmtsZXMnKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBncmlkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWdyaWQgdi1ncmlkLS1hdXRvIHYtY3JlYXRlX19mZWVkZ3JpZCcgfSk7CiAgICAgIHZhciBzaG93biA9IDA7CiAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKHJhdykgewogICAgICAgIHZhciBpbWFnZSA9IG5vcm1hbGl6ZUZlZWRJbWFnZShyYXcpOwogICAgICAgIGlmICghaW1hZ2VVUkxPZihpbWFnZSkpIHJldHVybjsKICAgICAgICB2YXIgY2FyZCA9IHNlbGYuZmVlZENhcmQoaW1hZ2UpOwogICAgICAgIGlmIChjYXJkKSB7IGdyaWQuYXBwZW5kQ2hpbGQoY2FyZCk7IHNob3duKys7IH0KICAgICAgfSk7CiAgICAgIGlmICghc2hvd24pIHsKICAgICAgICBob3N0LmFwcGVuZENoaWxkKGVtcHR5QmxvY2soJ05vIGluc3BpcmF0aW9uIHlldC4nLCAnQmUgdGhlIGZpcnN0IHRvIGNyZWF0ZSBzb21ldGhpbmcuJywgJ3NwYXJrbGVzJykpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBob3N0LmFwcGVuZENoaWxkKGdyaWQpOwogICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICBpZiAoc2VsZi5fZGVzdHJveWVkKSByZXR1cm47CiAgICAgIGhvc3QuaW5uZXJIVE1MID0gJyc7CiAgICAgIGhvc3QuYXBwZW5kQ2hpbGQoZW1wdHlCbG9jaygnQ291bGRu4oCZdCBsb2FkIGluc3BpcmF0aW9uLicsICdDaGVjayB5b3VyIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4nLCAnd2FybmluZycpKTsKICAgIH0pOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmZlZWRDYXJkID0gZnVuY3Rpb24gKGltYWdlKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBpZiAoIWltYWdlVVJMT2YoaW1hZ2UpKSByZXR1cm4gbnVsbDsKICAgIHZhciBub2RlOwogICAgaWYgKHVpKCkuaW1nQ2FyZCkgewogICAgICB0cnkgewogICAgICAgIG5vZGUgPSB1aSgpLmltZ0NhcmQoaW1hZ2UsIHsgb25UYXA6IGZ1bmN0aW9uICgpIHsgc2VsZi5hcHBseUV4YW1wbGUoaW1hZ2UpOyB9LCBiZWZvcmVBZnRlcjogdHJ1ZSB9KTsKICAgICAgfSBjYXRjaCAoZSkgeyBub2RlID0gbnVsbDsgfQogICAgfQogICAgaWYgKCFub2RlKSB7CiAgICAgIHZhciB1cmwgPSBpbWFnZS5yZW1vdGVJbWFnZVVSTDsKICAgICAgaWYgKCF1cmwpIHJldHVybiBudWxsOwogICAgICBub2RlID0gZWwoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzOiAndi1jYXJkIHYtY2FyZC0tcGFkLTAgdi1jYXJkLS10YXBwYWJsZScgfSwKICAgICAgICBlbCgnaW1nJywgeyBjbGFzczogJ3YtY2FyZF9fbWVkaWEnLCBzcmM6IHVybCwgYWx0OiBpbWFnZS5wcm9tcHQgPyBlc2MoaW1hZ2UucHJvbXB0KS5zbGljZSgwLCA4MCkgOiAnaW5zcGlyYXRpb24nLCBsb2FkaW5nOiAnbGF6eScgfSkpOwogICAgICB0aGlzLm9uKG5vZGUsICdjbGljaycsIGZ1bmN0aW9uICgpIHsgc2VsZi5hcHBseUV4YW1wbGUoaW1hZ2UpOyB9KTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmJ1aWxkUmVjZW50U3RyaXAgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgY29sID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogICAgY29sLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zZWN0aW9uX19oZWFkJyB9LAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnIH0sICdSZWNlbnQnKSwKICAgICAgZWwoJ2EnLCB7IGhyZWY6ICcjL2xpYnJhcnknLCBjbGFzczogJ3YtbGluaycgfSwgJ1NlZSBhbGwnKSkpOwoKICAgIHZhciBncmlkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWdyaWQgdi1ncmlkLS1hdXRvIHYtY3JlYXRlX19yZWNlbnQnIH0pOwogICAgdmFyIGxpYiA9IChzdGF0ZSgpLmxpYnJhcnkgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoaW1nKSB7CiAgICAgIHJldHVybiAhIWltYWdlVVJMT2YoaW1nKTsKICAgIH0pLnNsaWNlKDAsIDYpOwogICAgaWYgKCFsaWIubGVuZ3RoKSB7CiAgICAgIGNvbC5hcHBlbmRDaGlsZChlbXB0eUJsb2NrKCdZb3VyIGNyZWF0aW9ucyB3aWxsIGFwcGVhciBoZXJlLicsICdHZW5lcmF0ZSBzb21ldGhpbmcgdG8gZmlsbCB5b3VyIGxpYnJhcnkuJywgJ2ltYWdlJykpOwogICAgICByZXR1cm4gY29sOwogICAgfQogICAgbGliLmZvckVhY2goZnVuY3Rpb24gKGltZykgewogICAgICB2YXIgdXJsID0gaW1hZ2VVUkxPZihpbWcpOwogICAgICB2YXIgbm9kZTsKICAgICAgaWYgKHVpKCkuaW1nQ2FyZCkgewogICAgICAgIHRyeSB7IG5vZGUgPSB1aSgpLmltZ0NhcmQoaW1nLCB7IG9uVGFwOiBmdW5jdGlvbiAoKSB7IGdvKCcjL2ltYWdlLycgKyAoaW1nLnJlbW90ZUlEIHx8IGltZy5pZCkpOyB9LCBiZWZvcmVBZnRlcjogdHJ1ZSB9KTsgfQogICAgICAgIGNhdGNoIChlKSB7IG5vZGUgPSBudWxsOyB9CiAgICAgIH0KICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgbm9kZSA9IGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtY2FyZCB2LWNhcmQtLXBhZC0wIHYtY2FyZC0tdGFwcGFibGUnIH0sCiAgICAgICAgICBlbCgnaW1nJywgeyBjbGFzczogJ3YtY2FyZF9fbWVkaWEnLCBzcmM6IHVybCwgYWx0OiBpbWcucHJvbXB0ID8gZXNjKGltZy5wcm9tcHQpLnNsaWNlKDAsIDYwKSA6ICdjcmVhdGlvbicsIGxvYWRpbmc6ICdsYXp5JyB9KSk7CiAgICAgICAgc2VsZi5vbihub2RlLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7IGdvKCcjL2ltYWdlLycgKyAoaW1nLnJlbW90ZUlEIHx8IGltZy5pZCkpOyB9KTsKICAgICAgfQogICAgICBncmlkLmFwcGVuZENoaWxkKG5vZGUpOwogICAgfSk7CiAgICBjb2wuYXBwZW5kQ2hpbGQoZ3JpZCk7CiAgICByZXR1cm4gY29sOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmFwcGx5RXhhbXBsZSA9IGZ1bmN0aW9uIChleGFtcGxlKSB7CiAgICBpZiAoIWV4YW1wbGUpIHJldHVybjsKICAgIHZhciBleCA9IG5vcm1hbGl6ZUZlZWRJbWFnZShleGFtcGxlKTsKICAgIHZhciByZWZVUkwgPSBleGFtcGxlLnJlZmVyZW5jZVVSTCB8fCBudWxsOwogICAgdGhpcy5hY3RpdmVQcmVzZXQgPSBudWxsOwogICAgaWYgKHRoaXMuX3ByZXNldEN0bCAmJiB0aGlzLl9wcmVzZXRDdGwuc2V0QWN0aXZlKSB7IHRyeSB7IHRoaXMuX3ByZXNldEN0bC5zZXRBY3RpdmUobnVsbCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIHRoaXMucHJvbXB0ID0gZXgucHJvbXB0IHx8ICcnOwogICAgaWYgKHRoaXMuX3Byb21wdEZpZWxkKSB7IHRoaXMuX3Byb21wdEZpZWxkLnZhbHVlID0gdGhpcy5wcm9tcHQ7IH0KICAgIGlmIChleC5tb2RlbCAmJiBtb2RlbEJ5UmF3KGV4Lm1vZGVsKS5yYXcgPT09IGV4Lm1vZGVsKSB7CiAgICAgIHRoaXMubW9kZWxSYXcgPSBleC5tb2RlbDsKICAgICAgdmFyIHNlbCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcjdi1tb2RlbCcpOwogICAgICBpZiAoc2VsKSBzZWwudmFsdWUgPSB0aGlzLm1vZGVsUmF3OwogICAgICB3cml0ZVBlcnNpc3RlZCgnbW9kZWwnLCB0aGlzLm1vZGVsUmF3KTsKICAgIH0KICAgIGlmIChyZWZVUkwpIHsKICAgICAgdmFyIG1heCA9IG1heFJlZkZvcih0aGlzLmN1cnJlbnRNb2RlbCgpKTsKICAgICAgdmFyIGR1cCA9IHRoaXMucmVmcy5zb21lKGZ1bmN0aW9uIChyKSB7IHJldHVybiByLnJlbW90ZVVSTCA9PT0gcmVmVVJMIHx8IHIudXJsID09PSByZWZVUkw7IH0pOwogICAgICBpZiAoIWR1cCAmJiB0aGlzLnJlZnMubGVuZ3RoIDwgbWF4KSB7CiAgICAgICAgdGhpcy5yZWZzLnB1c2goeyB1cmw6IHJlZlVSTCwgcmVtb3RlVVJMOiByZWZVUkwsIG5hbWU6ICdyZWZlcmVuY2UnIH0pOwogICAgICB9CiAgICAgIHRoaXMuYWZ0ZXJJbnB1dENoYW5nZSgpOwogICAgfQogICAgdGhpcy5yZWZyZXNoQ1RBKCk7CiAgICB0aGlzLnJlZnJlc2hNb2RlbEhpbnQoKTsKICAgIGlmICh0aGlzLl9wcm9tcHRGaWVsZCkgeyB0aGlzLl9wcm9tcHRGaWVsZC5mb2N1cygpOyB0aGlzLl9wcm9tcHRGaWVsZC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnKSk7IH0KICAgIHRvYXN0KHJlZlVSTCA/ICdSZWZlcmVuY2UgYWRkZWQg4oCUIHR3ZWFrIHRoZSBwcm9tcHQgYW5kIFRyYW5zZm9ybS4nIDogJ1Byb21wdCBsb2FkZWQg4oCUIHR3ZWFrIGl0IGFuZCBHZW5lcmF0ZS4nLCAnaW5mbycpOwogICAgdHJ5IHsgdGhpcy5yb290LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KTsgfSBjYXRjaCAoZSkge30KICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLmJ1c3kpIHJldHVybjsKICAgIGlmICghdGhpcy5jYW5TdWJtaXQoKSkgewogICAgICBpZiAoIXRoaXMuaGFzSW5wdXQoKSAmJiAodGhpcy5wcm9tcHQgfHwgJycpLnRyaW0oKS5sZW5ndGggPCA4KSB7CiAgICAgICAgdG9hc3QoJ0FkZCBhdCBsZWFzdCA4IGNoYXJhY3RlcnMgb3IgZHJvcCBhbiBpbWFnZSB0byBnZW5lcmF0ZS4nLCAnZXJyb3InKTsKICAgICAgICBpZiAodGhpcy5fcHJvbXB0RmllbGQpIHRoaXMuX3Byb21wdEZpZWxkLmZvY3VzKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIGNvdW50ID0gdGhpcy52YXJpYXRpb25zID8gNCA6IDE7CiAgICB0aGlzLnJ1bkJhdGNoKGNvdW50KTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5ydW5CYXRjaCA9IGZ1bmN0aW9uIChjb3VudCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdGhpcy5idXN5ID0gdHJ1ZTsKICAgIHRoaXMucmVmcmVzaENUQSgpOwoKICAgIHZhciB0b3RhbENvc3QgPSB0aGlzLnRvdGFsQ29zdCgpOwoKICAgIHRoaXMuZW5zdXJlQ3JlZGl0cyh0b3RhbENvc3QpLnRoZW4oZnVuY3Rpb24gKGhhdmVFbm91Z2gpIHsKICAgICAgaWYgKCFoYXZlRW5vdWdoKSB7CiAgICAgICAgc2VsZi5idXN5ID0gZmFsc2U7IHNlbGYucmVmcmVzaENUQSgpOwogICAgICAgIHRvYXN0KCdOb3QgZW5vdWdoIGNyZWRpdHMg4oCUIGFkZCBtb3JlIHRvIGtlZXAgY3JlYXRpbmcuJywgJ2luZm8nKTsKICAgICAgICBnbygnIy9wYXl3YWxsJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiBzZWxmLmRvR2VuZXJhdGlvbnMoY291bnQpOwogICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0cykgewogICAgICBzZWxmLmJ1c3kgPSBmYWxzZTsKICAgICAgc2VsZi5yZWZyZXNoQ1RBKCk7CiAgICAgIGlmIChyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoKSB7CiAgICAgICAgdmFyIGZpcnN0ID0gcmVzdWx0c1swXTsKICAgICAgICBnbygnIy9pbWFnZS8nICsgKGZpcnN0LnJlbW90ZUlEIHx8IGZpcnN0LmlkKSk7CiAgICAgICAgaWYgKHVpKCkuY29uZmV0dGkpIHsgdHJ5IHsgdWkoKS5jb25mZXR0aSgpOyB9IGNhdGNoIChlKSB7fSB9CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgc2VsZi5idXN5ID0gZmFsc2U7CiAgICAgIHNlbGYucmVmcmVzaENUQSgpOwogICAgICBzZWxmLmhpZGVPdmVybGF5KCk7CiAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykgeyB0b2FzdCgnR2VuZXJhdGlvbiBjYW5jZWxsZWQuJywgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICAgIHZhciBtc2cgPSAoZXJyICYmIChlcnIuZGVzY3JpcHRpb24gfHwgZXJyLm1lc3NhZ2UpKSB8fCAnR2VuZXJhdGlvbiBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uJzsKICAgICAgdG9hc3QobXNnLCAnZXJyb3InKTsKICAgIH0pOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmVuc3VyZUNyZWRpdHMgPSBmdW5jdGlvbiAoY29zdCkgewogICAgdmFyIHMgPSBzdGF0ZSgpOwogICAgZnVuY3Rpb24gZW5vdWdoKG4pIHsgcmV0dXJuIHR5cGVvZiBuID09PSAnbnVtYmVyJyAmJiBuID49IGNvc3Q7IH0KICAgIGlmIChlbm91Z2gocy5jcmVkaXRzKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTsKICAgIGlmICghYXBpKCkuY3JlZGl0cykgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTsKICAgIHJldHVybiBhcGkoKS5jcmVkaXRzKCkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgIHZhciBuID0gcmVzICYmICh0eXBlb2YgcmVzLmNyZWRpdHMgPT09ICdudW1iZXInID8gcmVzLmNyZWRpdHMgOiByZXMpOwogICAgICBzLmNyZWRpdHMgPSAodHlwZW9mIG4gPT09ICdudW1iZXInKSA/IG4gOiBzLmNyZWRpdHM7CiAgICAgIGlmIChWLnN0b3JlICYmIFYuc3RvcmUuZW1pdCkgVi5zdG9yZS5lbWl0KCdjcmVkaXRzOmNoYW5nZWQnLCBzLmNyZWRpdHMpOwogICAgICByZXR1cm4gZW5vdWdoKHMuY3JlZGl0cyk7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuZG9HZW5lcmF0aW9ucyA9IGZ1bmN0aW9uIChjb3VudCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHRoaXMuYWJvcnQgPSAodHlwZW9mIEFib3J0Q29udHJvbGxlciAhPT0gJ3VuZGVmaW5lZCcpID8gbmV3IEFib3J0Q29udHJvbGxlcigpIDogbnVsbDsKICAgIHZhciBzaWduYWwgPSB0aGlzLmFib3J0ID8gdGhpcy5hYm9ydC5zaWduYWwgOiB1bmRlZmluZWQ7CgogICAgdGhpcy5zaG93T3ZlcmxheShjb3VudCk7CgogICAgdmFyIHByZXAgPSB0aGlzLmhhc0lucHV0KCkgPyB0aGlzLnVwbG9hZEFsbChzaWduYWwpIDogUHJvbWlzZS5yZXNvbHZlKG51bGwpOwoKICAgIHZhciBjaGFpbiA9IHByZXAudGhlbihmdW5jdGlvbiAodXBsb2FkZWQpIHsKICAgICAgdmFyIHNlcSA9IFByb21pc2UucmVzb2x2ZSgpOwogICAgICB2YXIgZG9uZSA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgIChmdW5jdGlvbiAoaWR4KSB7CiAgICAgICAgICBzZXEgPSBzZXEudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmIChzZWxmLmFib3J0ICYmIHNlbGYuYWJvcnQuc2lnbmFsLmFib3J0ZWQpIHsgdmFyIGUgPSBuZXcgRXJyb3IoJ2Fib3J0ZWQnKTsgZS5uYW1lID0gJ0Fib3J0RXJyb3InOyB0aHJvdyBlOyB9CiAgICAgICAgICAgIHNlbGYuc2V0T3ZlcmxheVN0ZXAoZG9uZSwgY291bnQpOwogICAgICAgICAgICByZXR1cm4gc2VsZi5zaW5nbGVHZW5lcmF0aW9uKHVwbG9hZGVkLCBzaWduYWwsIGZ1bmN0aW9uIChmcmFjKSB7CiAgICAgICAgICAgICAgc2VsZi5zZXRPdmVybGF5UHJvZ3Jlc3MoZG9uZSwgY291bnQsIGZyYWMpOwogICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChpbWcpIHsKICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaW1nKTsKICAgICAgICAgICAgICBkb25lKys7CiAgICAgICAgICAgICAgc2VsZi5zZXRPdmVybGF5UHJvZ3Jlc3MoZG9uZSwgY291bnQsIDApOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0pKGkpOwogICAgICB9CiAgICAgIHJldHVybiBzZXE7CiAgICB9KTsKCiAgICByZXR1cm4gY2hhaW4udGhlbihmdW5jdGlvbiAoKSB7CiAgICAgIHNlbGYuaGlkZU92ZXJsYXkoKTsKICAgICAgc2VsZi5hYm9ydCA9IG51bGw7CiAgICAgIHJldHVybiByZXN1bHRzOwogICAgfSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUudXBsb2FkQWxsID0gZnVuY3Rpb24gKHNpZ25hbCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIG1heCA9IG1heFJlZkZvcih0aGlzLmN1cnJlbnRNb2RlbCgpKTsKICAgIHZhciB1c2UgPSB0aGlzLnJlZnMuc2xpY2UoMCwgbWF4KTsKICAgIGlmICghYXBpKCkudXBsb2FkSW1hZ2UpIHJldHVybiBQcm9taXNlLnJlamVjdChhcGlFcnIoJ1VwbG9hZCBpcyB1bmF2YWlsYWJsZS4nKSk7CgogICAgdGhpcy5zZXRPdmVybGF5TGFiZWwoJ1VwbG9hZGluZyB5b3VyIGltYWdlJyArICh1c2UubGVuZ3RoID4gMSA/ICdzJyA6ICcnKSArICfigKYnKTsKCiAgICB2YXIgc2VxID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB2YXIgdXJscyA9IFtdOwogICAgdXNlLmZvckVhY2goZnVuY3Rpb24gKHJlZikgewogICAgICBzZXEgPSBzZXEudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHNpZ25hbCAmJiBzaWduYWwuYWJvcnRlZCkgeyB2YXIgZSA9IG5ldyBFcnJvcignYWJvcnRlZCcpOyBlLm5hbWUgPSAnQWJvcnRFcnJvcic7IHRocm93IGU7IH0KICAgICAgICBpZiAocmVmLnJlbW90ZVVSTCkgeyB1cmxzLnB1c2gocmVmLnJlbW90ZVVSTCk7IHJldHVybjsgfQogICAgICAgIHJldHVybiBhcGkoKS51cGxvYWRJbWFnZShyZWYuZmlsZSwgJ3JlbmRlcicpLnRoZW4oZnVuY3Rpb24gKG1lZGlhVVJMKSB7CiAgICAgICAgICByZWYucmVtb3RlVVJMID0gbWVkaWFVUkw7CiAgICAgICAgICB1cmxzLnB1c2gobWVkaWFVUkwpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0pOwogICAgcmV0dXJuIHNlcS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKCF1cmxzLmxlbmd0aCkgdGhyb3cgYXBpRXJyKCdJbWFnZSB1cGxvYWQgcmV0dXJuZWQgbm8gVVJMLicpOwogICAgICByZXR1cm4geyBwcmltYXJ5OiB1cmxzWzBdLCBhbGw6IHVybHMgfTsKICAgIH0pOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnNpbmdsZUdlbmVyYXRpb24gPSBmdW5jdGlvbiAodXBsb2FkZWQsIHNpZ25hbCwgb25Qcm9ncmVzcykgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIHNlZWQgPSByYW5kb21TZWVkKCk7CiAgICB2YXIgcHJvbXB0ID0gdGhpcy5maW5hbFByb21wdCgpOwogICAgdmFyIG1vZGVsID0gdGhpcy5jdXJyZW50TW9kZWwoKTsKCiAgICBpZiAoIWFwaSgpLnBvbGwpIHJldHVybiBQcm9taXNlLnJlamVjdChhcGlFcnIoJ0dlbmVyYXRvciBjbGllbnQgdW5hdmFpbGFibGUuJykpOwoKICAgIHZhciBzdWJtaXRGbiwgcG9sbEZuOwogICAgdmFyIGlzRWRpdCA9ICEhdXBsb2FkZWQ7CgogICAgaWYgKGlzRWRpdCkgewogICAgICB0aGlzLnNldE92ZXJsYXlMYWJlbCh1cGxvYWRlZC5hbGwubGVuZ3RoID4gMSA/ICdBcHBseWluZyB5b3VyIHJlZmVyZW5jZSBpbWFnZXPigKYnIDogJ1JlaW1hZ2luaW5nIHlvdXIgaW1hZ2XigKYnKTsKICAgICAgdmFyIGJvZHkgPSBidWlsZEVkaXRCb2R5KG1vZGVsLCBwcm9tcHQsIHVwbG9hZGVkLCBzZWVkKTsKICAgICAgc3VibWl0Rm4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBhcGkoKS5nZW5FZGl0KG1vZGVsLnJhdywgYm9keSk7IH07CiAgICAgIHBvbGxGbiA9IGZ1bmN0aW9uIChyZXF1ZXN0SUQpIHsgcmV0dXJuIGFwaSgpLnBvbGxFZGl0KG1vZGVsLnJhdywgcmVxdWVzdElEKTsgfTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuc2V0T3ZlcmxheUxhYmVsKCdDcmVhdGluZyB5b3VyIGltYWdl4oCmJyk7CiAgICAgIHZhciBhc3AgPSBhc3BlY3RCeVJhdyh0aGlzLmFzcGVjdFJhdyk7CiAgICAgIHZhciB0MmlCb2R5ID0geyBwcm9tcHQ6IHByb21wdCwgc2VlZDogc2VlZCwgd2lkdGg6IGFzcC53LCBoZWlnaHQ6IGFzcC5oIH07CiAgICAgIHN1Ym1pdEZuID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gYXBpKCkuZ2VuVGV4dFRvSW1hZ2UodDJpQm9keSk7IH07CiAgICAgIHBvbGxGbiA9IGZ1bmN0aW9uIChyZXF1ZXN0SUQpIHsgcmV0dXJuIGFwaSgpLnBvbGxUZXh0VG9JbWFnZShyZXF1ZXN0SUQpOyB9OwogICAgfQoKICAgIHJldHVybiBhcGkoKS5wb2xsKHN1Ym1pdEZuLCBwb2xsRm4sIHsgb25Qcm9ncmVzczogb25Qcm9ncmVzcywgc2lnbmFsOiBzaWduYWwgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgIHZhciB1cmwgPSBleHRyYWN0UmVzdWx0VVJMKHJlc3VsdCk7CiAgICAgIGlmICghdXJsKSB7CiAgICAgICAgdmFyIGRlc2MgPSByZXN1bHQgJiYgcmVzdWx0LmRlc2NyaXB0aW9uOwogICAgICAgIHRocm93IGFwaUVycihkZXNjIHx8ICdUaGUgbW9kZWwgcmV0dXJuZWQgbm8gaW1hZ2UuIFRyeSBhIGRpZmZlcmVudCBwcm9tcHQgb3IgbW9kZWwuJyk7CiAgICAgIH0KICAgICAgdmFyIGltYWdlID0gc2VsZi5idWlsZEdlbmVyYXRlZEltYWdlKHsKICAgICAgICBwcm9tcHQ6IHByb21wdCwKICAgICAgICBtb2RlbFJhdzogaXNFZGl0ID8gbW9kZWwucmF3IDogJ2ZsdXgxU2NobmVsbCcsCiAgICAgICAgc2VlZDogKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnNlZWQgPT09ICdudW1iZXInKSA/IHJlc3VsdC5zZWVkIDogc2VlZCwKICAgICAgICByZXN1bHRVUkw6IHVybCwKICAgICAgICBvcmlnaW5hbFVSTDogaXNFZGl0ID8gdXBsb2FkZWQucHJpbWFyeSA6IG51bGwKICAgICAgfSk7CiAgICAgIHJldHVybiBzZWxmLnBlcnNpc3QoaW1hZ2UpOwogICAgfSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRHZW5lcmF0ZWRJbWFnZSA9IGZ1bmN0aW9uIChvKSB7CiAgICByZXR1cm4gewogICAgICBpZDogdXVpZCgpLAogICAgICBwcm9tcHQ6IG8ucHJvbXB0LAogICAgICBuZWdhdGl2ZVByb21wdDogbnVsbCwKICAgICAgc3RlcENvdW50OiA0LAogICAgICBzZWVkOiBvLnNlZWQsCiAgICAgIGRpc2FibGVTYWZldHk6IGZhbHNlLAogICAgICBjcmVhdGVkRGF0ZTogbm93SVNPKCksCiAgICAgIHJlbW90ZUltYWdlVVJMOiBvLnJlc3VsdFVSTCwKICAgICAgcmVtb3RlT3JpZ2luYWxJbWFnZVVSTDogby5vcmlnaW5hbFVSTCB8fCB1bmRlZmluZWQsCiAgICAgIG1vZGVsOiBvLm1vZGVsUmF3LAogICAgICBwdWJsaXNoZWQ6IGZhbHNlLAogICAgICBmYXZvcml0ZWQ6IGZhbHNlLAogICAgICBwcmVzZXRJRDogdGhpcy5hY3RpdmVQcmVzZXQgPyB0aGlzLmFjdGl2ZVByZXNldC5pZCA6IHVuZGVmaW5lZAogICAgfTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5wZXJzaXN0ID0gZnVuY3Rpb24gKGltYWdlKSB7CiAgICBmdW5jdGlvbiBjb21taXQoc2F2ZWQpIHsKICAgICAgdmFyIGdpID0gKHNhdmVkICYmIHNhdmVkLmdlbmVyYXRlZEltYWdlKSA/IHNhdmVkLmdlbmVyYXRlZEltYWdlIDogKHNhdmVkIHx8IGltYWdlKTsKICAgICAgaWYgKGdpICYmIGdpLnJlbW90ZUlEICYmICFpbWFnZS5yZW1vdGVJRCkgaW1hZ2UucmVtb3RlSUQgPSBnaS5yZW1vdGVJRDsKICAgICAgaWYgKGdpICYmIGdpLmlkICYmIGdpLnJlbW90ZUlEICYmIGltYWdlLmlkICE9PSBnaS5pZCkgaW1hZ2UucmVtb3RlSUQgPSBnaS5yZW1vdGVJRDsKICAgICAgdmFyIGZpbmFsSW1hZ2UgPSBtZXJnZUltYWdlKGltYWdlLCBnaSk7CiAgICAgIHN0YXRlKCkubGlicmFyeSA9IHN0YXRlKCkubGlicmFyeSB8fCBbXTsKICAgICAgc3RhdGUoKS5saWJyYXJ5LnVuc2hpZnQoZmluYWxJbWFnZSk7CiAgICAgIGlmIChWLnN0b3JlICYmIFYuc3RvcmUuZW1pdCkgVi5zdG9yZS5lbWl0KCdsaWJyYXJ5OmNoYW5nZWQnLCBzdGF0ZSgpLmxpYnJhcnkpOwogICAgICBpZiAoYXBpKCkuY3JlZGl0cykgewogICAgICAgIGFwaSgpLmNyZWRpdHMoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgIHZhciBuID0gcmVzICYmICh0eXBlb2YgcmVzLmNyZWRpdHMgPT09ICdudW1iZXInID8gcmVzLmNyZWRpdHMgOiByZXMpOwogICAgICAgICAgaWYgKHR5cGVvZiBuID09PSAnbnVtYmVyJykgeyBzdGF0ZSgpLmNyZWRpdHMgPSBuOyBpZiAoVi5zdG9yZSAmJiBWLnN0b3JlLmVtaXQpIFYuc3RvcmUuZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgbik7IH0KICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZpbmFsSW1hZ2U7CiAgICB9CgogICAgaWYgKCFhcGkoKS5wZXJzaXN0SW1hZ2UpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb21taXQobnVsbCkpOwogICAgfQogICAgcmV0dXJuIGFwaSgpLnBlcnNpc3RJbWFnZShpbWFnZSkudGhlbihmdW5jdGlvbiAoc2F2ZWQpIHsKICAgICAgcmV0dXJuIGNvbW1pdChzYXZlZCk7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgIHRvYXN0KCdTYXZlZCBsb2NhbGx5IOKAlCBjb3VsZG7igJl0IHN5bmMgdG8geW91ciBsaWJyYXJ5LicsICdpbmZvJyk7CiAgICAgIHJldHVybiBjb21taXQobnVsbCk7CiAgICB9KTsKICB9OwoKICBmdW5jdGlvbiBtZXJnZUltYWdlKGxvY2FsLCBzZXJ2ZXIpIHsKICAgIGlmICghc2VydmVyIHx8IHR5cGVvZiBzZXJ2ZXIgIT09ICdvYmplY3QnKSByZXR1cm4gbG9jYWw7CiAgICB2YXIgb3V0ID0ge307CiAgICB2YXIgazsKICAgIGZvciAoayBpbiBsb2NhbCkgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChsb2NhbCwgaykpIG91dFtrXSA9IGxvY2FsW2tdOwogICAgZm9yIChrIGluIHNlcnZlcikgewogICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXJ2ZXIsIGspKSBjb250aW51ZTsKICAgICAgaWYgKHNlcnZlcltrXSAhPSBudWxsKSBvdXRba10gPSBzZXJ2ZXJba107CiAgICB9CiAgICBpZiAoIW91dC5yZW1vdGVJbWFnZVVSTCkgb3V0LnJlbW90ZUltYWdlVVJMID0gbG9jYWwucmVtb3RlSW1hZ2VVUkw7CiAgICBpZiAobG9jYWwucmVtb3RlT3JpZ2luYWxJbWFnZVVSTCAmJiAhb3V0LnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwpIG91dC5yZW1vdGVPcmlnaW5hbEltYWdlVVJMID0gbG9jYWwucmVtb3RlT3JpZ2luYWxJbWFnZVVSTDsKICAgIHJldHVybiBvdXQ7CiAgfQoKICBmdW5jdGlvbiBidWlsZEVkaXRCb2R5KG1vZGVsLCBwcm9tcHQsIHVwbG9hZGVkLCBzZWVkKSB7CiAgICB2YXIgcmF3ID0gbW9kZWwucmF3OwogICAgdmFyIG1heCA9IG1heFJlZkZvcihtb2RlbCk7CiAgICB2YXIgbXVsdGkgPSBtYXggPiAxOwogICAgdmFyIGJvZHkgPSB7IHByb21wdDogcHJvbXB0LCBzZWVkOiBzZWVkIH07CgogICAgaWYgKG11bHRpKSB7CiAgICAgIGJvZHkuaW1hZ2VfdXJsID0gdXBsb2FkZWQucHJpbWFyeTsKICAgICAgYm9keS5pbWFnZV91cmxzID0gdXBsb2FkZWQuYWxsOwogICAgICBib2R5Lm51bV9pbWFnZXMgPSAxOwogICAgfSBlbHNlIHsKICAgICAgYm9keS5pbWFnZV91cmwgPSB1cGxvYWRlZC5wcmltYXJ5OwogICAgfQoKICAgIGlmIChyYXcgPT09ICdxd2VuSW1hZ2VFZGl0JykgewogICAgICBib2R5Lm51bV9pbmZlcmVuY2Vfc3RlcHMgPSAzMDsKICAgICAgYm9keS5ndWlkYW5jZV9zY2FsZSA9IDQuMDsKICAgICAgYm9keS5uZWdhdGl2ZV9wcm9tcHQgPSAnICc7CiAgICAgIGJvZHkuYWNjZWxlcmF0aW9uID0gJ2hpZ2gnOwogICAgfSBlbHNlIGlmICghbXVsdGkpIHsKICAgICAgYm9keS5hY2NlbGVyYXRpb24gPSAnaGlnaCc7CiAgICB9CiAgICByZXR1cm4gYm9keTsKICB9CgogIGZ1bmN0aW9uIGFzcGVjdEJ5UmF3KHJhdykgewogICAgdmFyIGxpc3QgPSBhc3BlY3RzKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIGlmIChsaXN0W2ldLnJhdyA9PT0gcmF3KSByZXR1cm4gbGlzdFtpXTsKICAgIHJldHVybiBsaXN0WzBdOwogIH0KCiAgZnVuY3Rpb24gZXh0cmFjdFJlc3VsdFVSTChyZXN1bHQpIHsKICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDsKICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdC5pbWFnZXMpICYmIHJlc3VsdC5pbWFnZXMubGVuZ3RoKSB7CiAgICAgIHZhciBpbWcgPSByZXN1bHQuaW1hZ2VzWzBdOwogICAgICBpZiAodHlwZW9mIGltZyA9PT0gJ3N0cmluZycpIHJldHVybiBpbWc7CiAgICAgIGlmIChpbWcgJiYgaW1nLnVybCkgcmV0dXJuIGltZy51cmw7CiAgICB9CiAgICBpZiAocmVzdWx0LnVybCkgcmV0dXJuIHJlc3VsdC51cmw7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIG5vcm1hbGl6ZUZlZWRJbWFnZShyYXcpIHsKICAgIGlmICghcmF3KSByZXR1cm4ge307CiAgICB2YXIgZ2kgPSByYXcuZ2VuZXJhdGVkSW1hZ2UgfHwgcmF3LmltYWdlIHx8IHJhdzsKICAgIHJldHVybiB7CiAgICAgIGlkOiBnaS5pZCwgcmVtb3RlSUQ6IGdpLnJlbW90ZUlELCBwcm9tcHQ6IGdpLnByb21wdCwKICAgICAgbW9kZWw6IGdpLm1vZGVsLAogICAgICByZW1vdGVJbWFnZVVSTDogZ2kucmVtb3RlSW1hZ2VVUkwgfHwgZ2kuaW1hZ2VVUkwgfHwgZ2kudXJsLAogICAgICByZW1vdGVPcmlnaW5hbEltYWdlVVJMOiBnaS5yZW1vdGVPcmlnaW5hbEltYWdlVVJMIHx8IGdpLm9yaWdpbmFsSW1hZ2VVUkwsCiAgICAgIGZhdm9yaXRlZDogZ2kuZmF2b3JpdGVkCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gaW1hZ2VVUkxPZihpbWFnZSkgewogICAgaWYgKCFpbWFnZSkgcmV0dXJuICcnOwogICAgcmV0dXJuIGltYWdlLnJlbW90ZUltYWdlVVJMIHx8IGltYWdlLnJlbW90ZUltYWdlVXJsIHx8IGltYWdlLmltYWdlVVJMIHx8IGltYWdlLnVybCB8fCAnJzsKICB9CgogIGZ1bmN0aW9uIGFwaUVycihtc2cpIHsKICAgIHZhciBlID0gbmV3IEVycm9yKG1zZyk7CiAgICBlLmRlc2NyaXB0aW9uID0gbXNnOwogICAgcmV0dXJuIGU7CiAgfQoKICBmdW5jdGlvbiBlbXB0eUJsb2NrKHRpdGxlLCBzdWIsIGljb25OYW1lKSB7CiAgICBpZiAodWkoKS5lbXB0eSkgewogICAgICB0cnkgeyByZXR1cm4gdWkoKS5lbXB0eSh7IHRpdGxlOiB0aXRsZSwgbWVzc2FnZTogc3ViLCBpY29uOiBpY29uTmFtZSB8fCAnaW1hZ2UnIH0pOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgcmV0dXJuIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eScgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJywgaHRtbDogaWNvbihpY29uTmFtZSB8fCAnaW1hZ2UnKSB9KSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScgfSwgdGl0bGUpLAogICAgICBzdWIgPyBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHlfX21zZycgfSwgc3ViKSA6IG51bGwpOwogIH0KCiAgQ3JlYXRvci5wcm90b3R5cGUuc2hvd092ZXJsYXkgPSBmdW5jdGlvbiAoY291bnQpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHRoaXMuaGlkZU92ZXJsYXkoKTsKCiAgICB2YXIgc2NyaW0gPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytb3ZlcmxheS1zY3JpbSB2LWNyZWF0ZV9fc2NyaW0nLCByb2xlOiAnZGlhbG9nJywgJ2FyaWEtbW9kYWwnOiAndHJ1ZScsCiAgICAgICdhcmlhLWxhYmVsJzogJ0dlbmVyYXRpbmcnIH0pOwoKICAgIHZhciBwYW5lbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbCB2LWNyZWF0ZV9fb3ZlcmxheScgfSk7CgogICAgcGFuZWwuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fb3JiJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX29yYi1jb3JlJywgaHRtbDogaWNvbignc3BhcmtsZXMnKSB8fCAn4pymJyB9KSkpOwoKICAgIHZhciBsYWJlbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbF9fdGl0bGUgdi1jcmVhdGVfX292ZXJsYXktbGFiZWwnIH0sICdTdGFydGluZ+KApicpOwogICAgdGhpcy5fb3ZMYWJlbCA9IGxhYmVsOwogICAgcGFuZWwuYXBwZW5kQ2hpbGQobGFiZWwpOwoKICAgIHZhciBiYXRjaEluZm8gPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViIHYtY3JlYXRlX19vdmVybGF5LWJhdGNoJyB9KTsKICAgIHRoaXMuX292QmF0Y2ggPSBiYXRjaEluZm87CiAgICBpZiAoY291bnQgPiAxKSBiYXRjaEluZm8udGV4dENvbnRlbnQgPSAnMCBvZiAnICsgY291bnQgKyAnIGRvbmUnOwogICAgcGFuZWwuYXBwZW5kQ2hpbGQoYmF0Y2hJbmZvKTsKCiAgICB2YXIgdHJhY2sgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcHJvZ3Jlc3Mgdi1wcm9ncmVzcy0tZGV0ZXJtaW5hdGUnIH0pOwogICAgdmFyIGJhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wcm9ncmVzc19fYmFyJyB9KTsKICAgIHRyYWNrLmFwcGVuZENoaWxkKGJhcik7CiAgICB0aGlzLl9vdkJhciA9IGJhcjsKICAgIHRoaXMuX292Q291bnQgPSBjb3VudDsKICAgIHBhbmVsLmFwcGVuZENoaWxkKHRyYWNrKTsKCiAgICB2YXIgcGN0ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxhYmVsIHYtY3JlYXRlX19vdmVybGF5LXBjdCcgfSwgJycpOwogICAgdGhpcy5fb3ZQY3QgPSBwY3Q7CiAgICBwYW5lbC5hcHBlbmRDaGlsZChwY3QpOwoKICAgIHZhciBjYW5jZWwgPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jcmVhdGVfX292ZXJsYXktY2FuY2VsJyB9LCAnQ2FuY2VsJyk7CiAgICB0aGlzLm9uKGNhbmNlbCwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBzZWxmLmNhbmNlbEdlbmVyYXRpb24oKTsgfSk7CiAgICBwYW5lbC5hcHBlbmRDaGlsZChjYW5jZWwpOwoKICAgIHNjcmltLmFwcGVuZENoaWxkKHBhbmVsKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaW0pOwogICAgdGhpcy5fc2NyaW0gPSBzY3JpbTsKICAgIHRoaXMuc2V0T3ZlcmxheVByb2dyZXNzKDAsIGNvdW50LCAwLjA0KTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5zZXRPdmVybGF5TGFiZWwgPSBmdW5jdGlvbiAodGV4dCkgewogICAgaWYgKHRoaXMuX292TGFiZWwpIHRoaXMuX292TGFiZWwudGV4dENvbnRlbnQgPSB0ZXh0OwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnNldE92ZXJsYXlTdGVwID0gZnVuY3Rpb24gKGRvbmUsIGNvdW50KSB7CiAgICBpZiAodGhpcy5fb3ZCYXRjaCAmJiBjb3VudCA+IDEpIHRoaXMuX292QmF0Y2gudGV4dENvbnRlbnQgPSBkb25lICsgJyBvZiAnICsgY291bnQgKyAnIGRvbmUnOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnNldE92ZXJsYXlQcm9ncmVzcyA9IGZ1bmN0aW9uIChkb25lLCBjb3VudCwgZnJhYykgewogICAgaWYgKHR5cGVvZiBmcmFjICE9PSAnbnVtYmVyJyB8fCBpc05hTihmcmFjKSkgZnJhYyA9IDA7CiAgICBmcmFjID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgZnJhYykpOwogICAgdmFyIG92ZXJhbGwgPSAoY291bnQgPiAwKSA/ICgoZG9uZSArIGZyYWMpIC8gY291bnQpIDogZnJhYzsKICAgIG92ZXJhbGwgPSBNYXRoLm1heCgwLjAzLCBNYXRoLm1pbigwLjk4LCBvdmVyYWxsKSk7CiAgICBpZiAodGhpcy5fb3ZCYXIpIHRoaXMuX292QmFyLnN0eWxlLndpZHRoID0gTWF0aC5yb3VuZChvdmVyYWxsICogMTAwKSArICclJzsKICAgIGlmICh0aGlzLl9vdlBjdCkgdGhpcy5fb3ZQY3QudGV4dENvbnRlbnQgPSBNYXRoLnJvdW5kKG92ZXJhbGwgKiAxMDApICsgJyUnOwogICAgaWYgKHRoaXMuX292QmF0Y2ggJiYgY291bnQgPiAxKSB0aGlzLl9vdkJhdGNoLnRleHRDb250ZW50ID0gZG9uZSArICcgb2YgJyArIGNvdW50ICsgJyBkb25lJzsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5oaWRlT3ZlcmxheSA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLl9zY3JpbSkgewogICAgICB2YXIgbyA9IHRoaXMuX3NjcmltOwogICAgICB0aGlzLl9zY3JpbSA9IG51bGw7CiAgICAgIG8uY2xhc3NMaXN0LmFkZCgnY2xvc2luZycpOwogICAgICB2YXIgcmVtb3ZlZCA9IGZhbHNlOwogICAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uICgpIHsgaWYgKCFyZW1vdmVkICYmIG8ucGFyZW50Tm9kZSkgeyBvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyk7IHJlbW92ZWQgPSB0cnVlOyB9IH07CiAgICAgIHRoaXMub24obywgJ2FuaW1hdGlvbmVuZCcsIGRvbmUpOwogICAgICBzZXRUaW1lb3V0KGRvbmUsIDM2MCk7CiAgICB9CiAgICB0aGlzLl9vdkxhYmVsID0gdGhpcy5fb3ZCYXIgPSB0aGlzLl9vdlBjdCA9IHRoaXMuX292QmF0Y2ggPSBudWxsOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmNhbmNlbEdlbmVyYXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAodGhpcy5hYm9ydCkgeyB0cnkgeyB0aGlzLmFib3J0LmFib3J0KCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIHRoaXMuc2V0T3ZlcmxheUxhYmVsKCdDYW5jZWxsaW5n4oCmJyk7CiAgfTsKCn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2xpYnJhcnkuanMgPT09PT0gKi8KKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gd2luZG93LlYgfHwgKHdpbmRvdy5WID0ge30pOwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwoKICBmdW5jdGlvbiBlbCgpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51aS5lbC5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgdmFyIHRhZyA9IGFyZ3VtZW50c1swXTsKICAgIHZhciBhdHRycyA9IGFyZ3VtZW50c1sxXSB8fCB7fTsKICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgZm9yICh2YXIgayBpbiBhdHRycykgewogICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgaykpIGNvbnRpbnVlOwogICAgICB2YXIgdmFsID0gYXR0cnNba107CiAgICAgIGlmICh2YWwgPT0gbnVsbCkgY29udGludWU7CiAgICAgIGlmIChrID09PSAnY2xhc3MnIHx8IGsgPT09ICdjbGFzc05hbWUnKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgZWxzZSBpZiAoayA9PT0gJ3RleHQnKSBub2RlLnRleHRDb250ZW50ID0gdmFsOwogICAgICBlbHNlIGlmIChrID09PSAnaHRtbCcpIG5vZGUuaW5uZXJIVE1MID0gdmFsOwogICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHZhbCk7CiAgICAgIH0gZWxzZSBpZiAoayA9PT0gJ2RhdGFzZXQnICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7CiAgICAgICAgZm9yICh2YXIgZGsgaW4gdmFsKSBub2RlLmRhdGFzZXRbZGtdID0gdmFsW2RrXTsKICAgICAgfSBlbHNlIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICB9CiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY2hpbGQgPSBhcmd1bWVudHNbaV07CiAgICAgIGlmIChjaGlsZCA9PSBudWxsIHx8IGNoaWxkID09PSBmYWxzZSkgY29udGludWU7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkgewogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hpbGQubGVuZ3RoOyBqKyspIHsKICAgICAgICAgIGlmIChjaGlsZFtqXSA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodHlwZW9mIGNoaWxkW2pdID09PSAnc3RyaW5nJyA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoaWxkW2pdKSA6IGNoaWxkW2pdKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQpIDogY2hpbGQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIFMobm9kZSwgY3NzKSB7IGlmIChub2RlKSBub2RlLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAobm9kZS5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykgfHwgJycpICsgJzsnICsgY3NzKTsgcmV0dXJuIG5vZGU7IH0KCiAgdmFyIEFDQ0VOVCA9ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknOwogIHZhciBHUkFESUVOVCA9ICd2YXIoLS1ncmFkaWVudC12YW1wLCBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjNTI5N0Y4LCAjODJENkZGKSknOwogIHZhciBCQURHRV9CRyA9ICdyZ2JhKDEwLDEyLDE0LC41NSknOwogIHZhciBHTEFTU19CRyA9ICd2YXIoLS1jb2xvci1iZy1vbiwgIzIwMjIyMSknOwogIHZhciBMSU5FID0gJ3ZhcigtLXYtbGluZSwgcmdiYSgyNDUsMjQ1LDI0NywuMTUpKSc7CgogIGZ1bmN0aW9uIGljb24obmFtZSkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaWNvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgciA9IFYudWkuaWNvbihuYW1lKTsKICAgICAgaWYgKHR5cGVvZiByID09PSAnc3RyaW5nJykgewogICAgICAgIHZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgIHNwYW4uY2xhc3NOYW1lID0gJ3YtaWNvJzsKICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgICAgIHNwYW4uaW5uZXJIVE1MID0gcjsKICAgICAgICByZXR1cm4gc3BhbjsKICAgICAgfQogICAgICByZXR1cm4gcjsKICAgIH0KICAgIHZhciBmYWxsYmFjayA9IHsgc2VhcmNoOiAn4oyVJywgc29ydDogJ+KHhScsIGZvbGRlcjogJ+KWpCcsIGhlYXJ0OiAn4pmhJywgaGVhcnRGaWxsOiAn4pmlJywgdHJhc2g6ICfijKsnLCBjbG9zZTogJ+KclScsIGNoZWNrOiAn4pyTJywgbW9yZTogJ+KLrycsIGRvd25sb2FkOiAn4qSTJywgY29weTogJ+KOmCcsIHBsdXM6ICcrJywgZ3JpZDogJ+KWpicsIGltYWdlOiAn4pajJyB9OwogICAgdmFyIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICBzLmNsYXNzTmFtZSA9ICd2LWljbyc7CiAgICBzLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgcy50ZXh0Q29udGVudCA9IGZhbGxiYWNrW25hbWVdIHx8ICfigKInOwogICAgcmV0dXJuIHM7CiAgfQoKICBmdW5jdGlvbiB0b2FzdChtc2csIGtpbmQpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnRvYXN0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51aS50b2FzdChtc2csIGtpbmQgfHwgJ2luZm8nKTsKICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLmVtaXQgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuZW1pdCgndG9hc3QnLCB7IG1zZzogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsKICB9CgogIGZ1bmN0aW9uIGNvbmZpcm1EaWFsb2cobXNnKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jb25maXJtID09PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFYudWkuY29uZmlybShtc2cpKTsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0obXNnKSk7CiAgfQoKICBmdW5jdGlvbiBtb2RhbChub2RlLCBvcHRzKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5tb2RhbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudWkubW9kYWwobm9kZSwgb3B0cyB8fCB7fSk7CiAgICB2YXIgYmFjayA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbC1iYWNrJyB9KTsKICAgIHZhciBwYW5lbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbCBnbGFzcy1jYXJkJyB9LCBub2RlKTsKICAgIGJhY2suYXBwZW5kQ2hpbGQocGFuZWwpOwogICAgZnVuY3Rpb24gY2xvc2UoKSB7IGlmIChiYWNrLnBhcmVudE5vZGUpIGJhY2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiYWNrKTsgaWYgKG9wdHMgJiYgb3B0cy5vbkNsb3NlKSBvcHRzLm9uQ2xvc2UoKTsgfQogICAgYmFjay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGlmIChlLnRhcmdldCA9PT0gYmFjaykgY2xvc2UoKTsgfSk7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJhY2spOwogICAgcmV0dXJuIHsgY2xvc2U6IGNsb3NlIH07CiAgfQoKICB2YXIgZGVib3VuY2UgPSAoVi51dGlsICYmIFYudXRpbC5kZWJvdW5jZSkgPyBWLnV0aWwuZGVib3VuY2UgOiBmdW5jdGlvbiAoZm4sIG1zKSB7CiAgICB2YXIgdDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBhID0gYXJndW1lbnRzLCBjID0gdGhpczsKICAgICAgY2xlYXJUaW1lb3V0KHQpOwogICAgICB0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGZuLmFwcGx5KGMsIGEpOyB9LCBtcyk7CiAgICB9OwogIH07CgogIGZ1bmN0aW9uIGVzY2FwZUh0bWwocykgewogICAgaWYgKFYudXRpbCAmJiB0eXBlb2YgVi51dGlsLmVzY2FwZUh0bWwgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnV0aWwuZXNjYXBlSHRtbChzKTsKICAgIHJldHVybiBTdHJpbmcocyA9PSBudWxsID8gJycgOiBzKS5yZXBsYWNlKC9bJjw+IiddL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgIHJldHVybiB7ICcmJzogJyZhbXA7JywgJzwnOiAnJmx0OycsICc+JzogJyZndDsnLCAnIic6ICcmcXVvdDsnLCAiJyI6ICcmIzM5OycgfVtjXTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZG93bmxvYWQodXJsLCBuYW1lKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwuZG93bmxvYWQgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnV0aWwuZG93bmxvYWQodXJsLCBuYW1lKTsKICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgYS5ocmVmID0gdXJsOyBhLmRvd25sb2FkID0gbmFtZSB8fCAnaW1hZ2UnOyBhLnRhcmdldCA9ICdfYmxhbmsnOyBhLnJlbCA9ICdub29wZW5lcic7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOyBhLmNsaWNrKCk7IGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICBpZiAoVi5yb3V0ZXIgJiYgdHlwZW9mIFYucm91dGVyLmdvID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi5yb3V0ZXIuZ28oaGFzaCk7CiAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiBpbWdJZChpbWcpIHsgcmV0dXJuIGltZyAmJiAoaW1nLnJlbW90ZUlEIHx8IGltZy5pZCk7IH0KICBmdW5jdGlvbiBpbWdLZXkoaW1nKSB7IHJldHVybiBTdHJpbmcoaW1nSWQoaW1nKSB8fCAnJyk7IH0KCiAgZnVuY3Rpb24gZGF0ZU1zKGltZykgewogICAgdmFyIGQgPSBpbWcgJiYgaW1nLmNyZWF0ZWREYXRlOwogICAgaWYgKGQgPT0gbnVsbCkgcmV0dXJuIDA7CiAgICBpZiAodHlwZW9mIGQgPT09ICdudW1iZXInKSByZXR1cm4gZCA8IDFlMTIgPyBkICogMTAwMCA6IGQ7CiAgICB2YXIgdCA9IERhdGUucGFyc2UoZCk7CiAgICByZXR1cm4gaXNOYU4odCkgPyAwIDogdDsKICB9CgogIGZ1bmN0aW9uIGZ1enp5U2NvcmUobmVlZGxlLCBoYXkpIHsKICAgIGlmICghbmVlZGxlKSByZXR1cm4gMTsKICAgIGlmICghaGF5KSByZXR1cm4gMDsKICAgIG5lZWRsZSA9IG5lZWRsZS50b0xvd2VyQ2FzZSgpOwogICAgaGF5ID0gaGF5LnRvTG93ZXJDYXNlKCk7CiAgICB2YXIgZXhhY3QgPSBoYXkuaW5kZXhPZihuZWVkbGUpOwogICAgaWYgKGV4YWN0ICE9PSAtMSkgcmV0dXJuIDEwMDAgLSBleGFjdDsKICAgIHZhciBoaSA9IDAsIG5pID0gMCwgc2NvcmUgPSAwLCBzdHJlYWsgPSAwOwogICAgd2hpbGUgKGhpIDwgaGF5Lmxlbmd0aCAmJiBuaSA8IG5lZWRsZS5sZW5ndGgpIHsKICAgICAgaWYgKGhheVtoaV0gPT09IG5lZWRsZVtuaV0pIHsKICAgICAgICBzdHJlYWsgKz0gMTsKICAgICAgICBzY29yZSArPSAxICsgc3RyZWFrOwogICAgICAgIG5pICs9IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFrID0gMDsKICAgICAgfQogICAgICBoaSArPSAxOwogICAgfQogICAgcmV0dXJuIG5pID09PSBuZWVkbGUubGVuZ3RoID8gc2NvcmUgOiAwOwogIH0KCiAgZnVuY3Rpb24gc2VhcmNoSGF5c3RhY2soaW1nKSB7CiAgICB2YXIgcGFydHMgPSBbaW1nLnByb21wdCB8fCAnJywgaW1nLm1vZGVsIHx8ICcnLCBtb2RlbExhYmVsKGltZy5tb2RlbCkgfHwgJyddOwogICAgaWYgKEFycmF5LmlzQXJyYXkoaW1nLnRhZ3MpKSBwYXJ0cyA9IHBhcnRzLmNvbmNhdChpbWcudGFncyk7CiAgICByZXR1cm4gcGFydHMuam9pbignICcpOwogIH0KCiAgdmFyIFNPUlRTID0gWwogICAgeyBrZXk6ICduZXdlc3QnLCBsYWJlbDogJ05ld2VzdCcsIGNtcDogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGRhdGVNcyhiKSAtIGRhdGVNcyhhKTsgfSB9LAogICAgeyBrZXk6ICdvbGRlc3QnLCBsYWJlbDogJ09sZGVzdCcsIGNtcDogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGRhdGVNcyhhKSAtIGRhdGVNcyhiKTsgfSB9LAogICAgeyBrZXk6ICdheicsIGxhYmVsOiAnQSDihpIgWicsIGNtcDogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIChhLnByb21wdCB8fCAnJykubG9jYWxlQ29tcGFyZShiLnByb21wdCB8fCAnJyk7IH0gfSwKICAgIHsga2V5OiAnbW9kZWwnLCBsYWJlbDogJ0J5IE1vZGVsJywgY21wOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKG1vZGVsTGFiZWwoYS5tb2RlbCkgfHwgJycpLmxvY2FsZUNvbXBhcmUobW9kZWxMYWJlbChiLm1vZGVsKSB8fCAnJykgfHwgZGF0ZU1zKGIpIC0gZGF0ZU1zKGEpOyB9IH0sCiAgICB7IGtleTogJ2Zhdm9yaXRlcycsIGxhYmVsOiAnRmF2b3JpdGVzIEZpcnN0JywgY21wOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKGIuZmF2b3JpdGVkID8gMSA6IDApIC0gKGEuZmF2b3JpdGVkID8gMSA6IDApIHx8IGRhdGVNcyhiKSAtIGRhdGVNcyhhKTsgfSB9CiAgXTsKCiAgZnVuY3Rpb24gbW9kZWxMYWJlbChyYXcpIHsKICAgIGlmIChyYXcgJiYgVi5kYXRhICYmIEFycmF5LmlzQXJyYXkoVi5kYXRhLm1vZGVscykpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBWLmRhdGEubW9kZWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKFYuZGF0YS5tb2RlbHNbaV0ucmF3ID09PSByYXcpIHJldHVybiBWLmRhdGEubW9kZWxzW2ldLmxhYmVsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmF3IHx8ICcnOwogIH0KCiAgdmFyIFBFUiA9IDMwOwoKICB2YXIgY3R4ID0gbnVsbDsKCiAgZnVuY3Rpb24gZnJlc2hDdHgoKSB7CiAgICByZXR1cm4gewogICAgICByb290OiBudWxsLAogICAgICBncmlkRWw6IG51bGwsCiAgICAgIHNlbnRpbmVsOiBudWxsLAogICAgICBzdGF0dXNFbDogbnVsbCwKICAgICAgdG9vbGJhckVsOiBudWxsLAogICAgICBjb3VudEVsOiBudWxsLAogICAgICBpdGVtczogW10sCiAgICAgIHBhZ2U6IDAsCiAgICAgIHRvdGFsOiBudWxsLAogICAgICBsb2FkaW5nOiBmYWxzZSwKICAgICAgZG9uZTogZmFsc2UsCiAgICAgIGVycm9yZWQ6IGZhbHNlLAogICAgICBmZXRjaGVkOiBmYWxzZSwKICAgICAgc291cmNlOiAnbGlicmFyeScsCiAgICAgIGZvbGRlcklEOiBudWxsLAogICAgICBmb2xkZXJzOiBbXSwKICAgICAgZm9sZGVyc0xvYWRlZDogZmFsc2UsCiAgICAgIHF1ZXJ5OiAnJywKICAgICAgc29ydDogJ25ld2VzdCcsCiAgICAgIGluZHVzdHJ5OiBudWxsLAogICAgICBzZWxlY3RNb2RlOiBmYWxzZSwKICAgICAgc2VsZWN0ZWQ6IHt9LAogICAgICBvYnNlcnZlcjogbnVsbCwKICAgICAgbWVudUVsOiBudWxsLAogICAgICBzY3JvbGxZOiAwLAogICAgICBzY3JvbGxUYXJnZXQ6IG51bGwKICAgIH07CiAgfQoKICBmdW5jdGlvbiBhY3RpdmVGZXRjaChwYWdlKSB7CiAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2Zhdm9yaXRlcycpIHJldHVybiBWLmFwaS5mYXZvcml0ZXMoMjAwKTsKICAgIGlmIChjdHguc291cmNlID09PSAnZm9sZGVyJyAmJiBjdHguZm9sZGVySUQpIHJldHVybiBWLmFwaS5mb2xkZXJJbWFnZXMoY3R4LmZvbGRlcklELCBwYWdlLCBQRVIpOwogICAgcmV0dXJuIFYuYXBpLmxpYnJhcnkocGFnZSwgUEVSKTsKICB9CgogIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhZ2UocmVzcCkgewogICAgaWYgKCFyZXNwKSByZXR1cm4geyBpdGVtczogW10sIHRvdGFsOiBudWxsIH07CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwKSkgcmV0dXJuIHsgaXRlbXM6IHJlc3AsIHRvdGFsOiByZXNwLmxlbmd0aCB9OwogICAgdmFyIGl0ZW1zID0gQXJyYXkuaXNBcnJheShyZXNwLml0ZW1zKSA/IHJlc3AuaXRlbXMgOiBbXTsKICAgIHZhciB0b3RhbCA9IHJlc3AubWV0YWRhdGEgJiYgdHlwZW9mIHJlc3AubWV0YWRhdGEudG90YWwgPT09ICdudW1iZXInID8gcmVzcC5tZXRhZGF0YS50b3RhbCA6IG51bGw7CiAgICByZXR1cm4geyBpdGVtczogaXRlbXMsIHRvdGFsOiB0b3RhbCB9OwogIH0KCiAgZnVuY3Rpb24gbWVyZ2VVbmlxdWUoaW50bywgaW5jb21pbmcpIHsKICAgIHZhciBzZWVuID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGludG8ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGVrID0gaW1nS2V5KGludG9baV0pOwogICAgICBpZiAoZWspIHNlZW5bZWtdID0gdHJ1ZTsKICAgIH0KICAgIGZvciAodmFyIGogPSAwOyBqIDwgaW5jb21pbmcubGVuZ3RoOyBqKyspIHsKICAgICAgdmFyIGl0ZW0gPSBpbmNvbWluZ1tqXTsKICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgY29udGludWU7CiAgICAgIHZhciBrID0gaW1nS2V5KGl0ZW0pOwogICAgICBpZiAoayAmJiBzZWVuW2tdKSBjb250aW51ZTsKICAgICAgaWYgKGspIHNlZW5ba10gPSB0cnVlOwogICAgICBpbnRvLnB1c2goaXRlbSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBsb2FkTmV4dChyZXNldCkgewogICAgaWYgKCFjdHgpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgIGlmIChjdHgubG9hZGluZykgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgaWYgKCFyZXNldCAmJiBjdHguZG9uZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgY3R4LmxvYWRpbmcgPSB0cnVlOwogICAgY3R4LmVycm9yZWQgPSBmYWxzZTsKICAgIHZhciBzdGFydEN0eCA9IGN0eDsKCiAgICB2YXIgbmV4dFBhZ2UgPSByZXNldCA/IDEgOiBjdHgucGFnZSArIDE7CiAgICB2YXIgaGFkU2VlZCA9IHJlc2V0ICYmIGN0eC5pdGVtcy5sZW5ndGggPiAwOwogICAgaWYgKHJlc2V0KSB7CiAgICAgIGlmICghaGFkU2VlZCkgY3R4Lml0ZW1zID0gW107CiAgICAgIGN0eC5wYWdlID0gMDsKICAgICAgY3R4LnRvdGFsID0gbnVsbDsKICAgICAgY3R4LmRvbmUgPSBmYWxzZTsKICAgICAgY3R4LmZldGNoZWQgPSBmYWxzZTsKICAgIH0KCiAgICBpZiAocmVzZXQgJiYgIWN0eC5pdGVtcy5sZW5ndGgpIHNob3dTa2VsZXRvbnMoKTsKICAgIHJlbmRlclN0YXR1cygpOwoKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKQogICAgICAudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkubGlicmFyeSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVycm9yKCdBUEkgdW5hdmFpbGFibGUnKTsKICAgICAgICByZXR1cm4gYWN0aXZlRmV0Y2gobmV4dFBhZ2UpOwogICAgICB9KQogICAgICAudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgIGlmICghY3R4IHx8IGN0eCAhPT0gc3RhcnRDdHgpIHJldHVybjsKICAgICAgICB2YXIgbm9ybSA9IG5vcm1hbGl6ZVBhZ2UocmVzcCk7CiAgICAgICAgaWYgKGhhZFNlZWQpIGN0eC5pdGVtcyA9IG5vcm0uaXRlbXMuc2xpY2UoKTsKICAgICAgICBlbHNlIG1lcmdlVW5pcXVlKGN0eC5pdGVtcywgbm9ybS5pdGVtcyk7CiAgICAgICAgY3R4LnBhZ2UgPSBuZXh0UGFnZTsKICAgICAgICBpZiAobm9ybS50b3RhbCAhPSBudWxsKSBjdHgudG90YWwgPSBub3JtLnRvdGFsOwoKICAgICAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2Zhdm9yaXRlcycpIGN0eC5kb25lID0gdHJ1ZTsKICAgICAgICBlbHNlIGlmIChub3JtLml0ZW1zLmxlbmd0aCA8IFBFUikgY3R4LmRvbmUgPSB0cnVlOwogICAgICAgIGVsc2UgaWYgKGN0eC50b3RhbCAhPSBudWxsICYmIGN0eC5pdGVtcy5sZW5ndGggPj0gY3R4LnRvdGFsKSBjdHguZG9uZSA9IHRydWU7CgogICAgICAgIGN0eC5sb2FkaW5nID0gZmFsc2U7CiAgICAgICAgY3R4LmVycm9yZWQgPSBmYWxzZTsKICAgICAgICBjdHguZmV0Y2hlZCA9IHRydWU7CiAgICAgICAgaWYgKGN0eC5zb3VyY2UgPT09ICdsaWJyYXJ5JyAmJiBWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLnNldCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgY3R4Ll9zZWxmV3JpdGUgPSB0cnVlOwogICAgICAgICAgdHJ5IHsgVi5zdG9yZS5zZXQoJ2xpYnJhcnknLCBjdHguaXRlbXMuc2xpY2UoKSk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICBjdHguX3NlbGZXcml0ZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgcmVuZGVyR3JpZCgpOwogICAgICAgICAgcmVuZGVyU3RhdHVzKCk7CiAgICAgICAgICBlbnN1cmVGaWxsKCk7CiAgICAgICAgfSBjYXRjaCAocmVuZGVyRXJyKSB7CiAgICAgICAgICBpZiAod2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5lcnJvcikgY29uc29sZS5lcnJvcignW2xpYnJhcnldIHJlbmRlciBmYWlsZWQnLCByZW5kZXJFcnIpOwogICAgICAgIH0KICAgICAgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBpZiAoIWN0eCB8fCBjdHggIT09IHN0YXJ0Q3R4KSByZXR1cm47CiAgICAgICAgY3R4LmxvYWRpbmcgPSBmYWxzZTsKICAgICAgICBjdHguZXJyb3JlZCA9IHRydWU7CiAgICAgICAgdHJ5IHsgcmVuZGVyR3JpZCgpOyB9IGNhdGNoIChlKSB7fQogICAgICAgIHJlbmRlclN0YXR1cyhlcnIpOwogICAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGVuc3VyZUZpbGwoKSB7CiAgICBpZiAoY3R4LmRvbmUgfHwgY3R4LmxvYWRpbmcgfHwgY3R4LmVycm9yZWQpIHJldHVybjsKICAgIGlmICghY3R4LmdyaWRFbCkgcmV0dXJuOwogICAgaWYgKGN0eC5xdWVyeSB8fCBjdHguc291cmNlID09PSAnZmF2b3JpdGVzJykgcmV0dXJuOwogICAgdmFyIGRvY0ggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IHdpbmRvdy5pbm5lckhlaWdodCB8fCAwOwogICAgdmFyIGdyaWRCb3R0b20gPSBjdHguZ3JpZEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTsKICAgIGlmIChncmlkQm90dG9tIDwgZG9jSCArIDIwMCkgbG9hZE5leHQoZmFsc2UpOwogIH0KCiAgZnVuY3Rpb24gdmlzaWJsZUl0ZW1zKCkgewogICAgdmFyIGxpc3QgPSBjdHguaXRlbXMuc2xpY2UoKTsKCiAgICBpZiAoY3R4LmluZHVzdHJ5KSB7CiAgICAgIHZhciBrZXkgPSBjdHguaW5kdXN0cnk7CiAgICAgIGxpc3QgPSBsaXN0LmZpbHRlcihmdW5jdGlvbiAoaW1nKSB7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGltZy50YWdzKSB8fCAhaW1nLnRhZ3MubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbWcudGFncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKFN0cmluZyhpbWcudGFnc1tpXSkudG9Mb3dlckNhc2UoKSA9PT0ga2V5LnRvTG93ZXJDYXNlKCkpIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0pOwogICAgfQoKICAgIGlmIChjdHgucXVlcnkpIHsKICAgICAgdmFyIHEgPSBjdHgucXVlcnk7CiAgICAgIHZhciBzY29yZWQgPSBbXTsKICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCBsaXN0Lmxlbmd0aDsgcysrKSB7CiAgICAgICAgdmFyIHNjID0gZnV6enlTY29yZShxLCBzZWFyY2hIYXlzdGFjayhsaXN0W3NdKSk7CiAgICAgICAgaWYgKHNjID4gMCkgc2NvcmVkLnB1c2goeyBpbWc6IGxpc3Rbc10sIHNjOiBzYyB9KTsKICAgICAgfQogICAgICBzY29yZWQuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYi5zYyAtIGEuc2M7IH0pOwogICAgICByZXR1cm4gc2NvcmVkLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5pbWc7IH0pOwogICAgfQoKICAgIHZhciBkZWYgPSBudWxsOwogICAgZm9yICh2YXIgayA9IDA7IGsgPCBTT1JUUy5sZW5ndGg7IGsrKykgaWYgKFNPUlRTW2tdLmtleSA9PT0gY3R4LnNvcnQpIGRlZiA9IFNPUlRTW2tdOwogICAgaWYgKGRlZikgbGlzdC5zb3J0KGRlZi5jbXApOwogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBmdW5jdGlvbiBhdmFpbGFibGVUYWdzKCkgewogICAgdmFyIHNldCA9IHt9OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdHguaXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHQgPSBjdHguaXRlbXNbaV0udGFnczsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpIGZvciAodmFyIGogPSAwOyBqIDwgdC5sZW5ndGg7IGorKykgaWYgKHRbal0pIHNldFtTdHJpbmcodFtqXSkudG9Mb3dlckNhc2UoKV0gPSB0cnVlOwogICAgfQogICAgcmV0dXJuIHNldDsKICB9CgogIGZ1bmN0aW9uIGxvYWRGb2xkZXJzKCkgewogICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkuZm9sZGVycyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7CiAgICByZXR1cm4gVi5hcGkuZm9sZGVycygpLnRoZW4oZnVuY3Rpb24gKGxpc3QpIHsKICAgICAgY3R4LmZvbGRlcnMgPSBBcnJheS5pc0FycmF5KGxpc3QpID8gbGlzdCA6IFtdOwogICAgICBjdHguZm9sZGVyc0xvYWRlZCA9IHRydWU7CiAgICAgIHJldHVybiBjdHguZm9sZGVyczsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgY3R4LmZvbGRlcnNMb2FkZWQgPSB0cnVlOwogICAgICByZXR1cm4gY3R4LmZvbGRlcnM7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIG9wZW5Gb2xkZXJzTWFuYWdlcigpIHsKICAgIHZhciB3cmFwID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vZGFsLWJvZHknIH0pOwogICAgd3JhcC5hcHBlbmRDaGlsZChlbCgnaDMnLCB7IGNsYXNzOiAndi1tb2RhbC10aXRsZScsIHRleHQ6ICdGb2xkZXJzJyB9KSk7CgogICAgdmFyIGxpc3RFbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1tZCcgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKGxpc3RFbCk7CgogICAgZnVuY3Rpb24gcmVwYWludCgpIHsKICAgICAgbGlzdEVsLmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWN0eC5mb2xkZXJzLmxlbmd0aCkgewogICAgICAgIGxpc3RFbC5hcHBlbmRDaGlsZChlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19zdWInLCB0ZXh0OiAnTm8gZm9sZGVycyB5ZXQuIENyZWF0ZSBvbmUgYmVsb3cuJyB9KSk7CiAgICAgIH0KICAgICAgY3R4LmZvbGRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZikgewogICAgICAgIHZhciByb3cgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytcm93IHYtcm93LS1iZXR3ZWVuJyB9LAogICAgICAgICAgZWwoJ2J1dHRvbicsIHsKICAgICAgICAgICAgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgICAgIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgbS5jbG9zZSgpOyBvcGVuRm9sZGVyKGYuaWQsIGYubmFtZSk7IH0KICAgICAgICAgIH0sIGljb24oJ2ZvbGRlcicpLCBlbCgnc3BhbicsIHsgdGV4dDogZi5uYW1lIH0pLCBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHNfX251bScsIHRleHQ6ICcoJyArIChmLmltYWdlQ291bnQgfHwgMCkgKyAnKScgfSkpLAogICAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXJvdycgfSwKICAgICAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIHRpdGxlOiAnUmVuYW1lJywgJ2FyaWEtbGFiZWwnOiAnUmVuYW1lIGZvbGRlcicsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgcmVuYW1lRm9sZGVyRmxvdyhmLCByZXBhaW50KTsgfSB9LCBpY29uKCdlZGl0JykpLAogICAgICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1kYW5nZXIgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIHRpdGxlOiAnRGVsZXRlJywgJ2FyaWEtbGFiZWwnOiAnRGVsZXRlIGZvbGRlcicsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgZGVsZXRlRm9sZGVyRmxvdyhmLCByZXBhaW50KTsgfSB9LCBpY29uKCd0cmFzaCcpKQogICAgICAgICAgKQogICAgICAgICk7CiAgICAgICAgbGlzdEVsLmFwcGVuZENoaWxkKHJvdyk7CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBuYW1lSW5wdXQgPSBlbCgnaW5wdXQnLCB7IGNsYXNzOiAndi1maWVsZCcsIHR5cGU6ICd0ZXh0JywgcGxhY2Vob2xkZXI6ICdOZXcgZm9sZGVyIG5hbWUnLCBtYXhsZW5ndGg6ICc2MCcgfSk7CiAgICB2YXIgY3JlYXRlQnRuID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJyB9LCBpY29uKCdwbHVzJyksICdDcmVhdGUnKTsKICAgIGNyZWF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG4gPSAobmFtZUlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIGlmICghbikgeyBuYW1lSW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIGNyZWF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICAgIFYuYXBpLmNyZWF0ZUZvbGRlcihuKS50aGVuKGZ1bmN0aW9uIChmKSB7CiAgICAgICAgaWYgKGYpIGN0eC5mb2xkZXJzLnB1c2goZik7CiAgICAgICAgbmFtZUlucHV0LnZhbHVlID0gJyc7CiAgICAgICAgY3JlYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgcmVwYWludCgpOwogICAgICAgIHRvYXN0KCdGb2xkZXIgY3JlYXRlZCcsICdzdWNjZXNzJyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgY3JlYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7IHRvYXN0KCdDb3VsZCBub3QgY3JlYXRlIGZvbGRlcicsICdlcnJvcicpOyB9KTsKICAgIH0pOwogICAgbmFtZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkgeyBpZiAoZS5rZXkgPT09ICdFbnRlcicpIGNyZWF0ZUJ0bi5jbGljaygpOyB9KTsKCiAgICB3cmFwLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1yb3cgdi1tb2RhbC1hY3Rpb25zJyB9LCBuYW1lSW5wdXQsIGNyZWF0ZUJ0bikpOwoKICAgIHZhciBtID0gbW9kYWwod3JhcCwge30pOwoKICAgIGlmICghY3R4LmZvbGRlcnNMb2FkZWQpIHsKICAgICAgbGlzdEVsLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtZW1wdHlfX3N1YicsIHRleHQ6ICdMb2FkaW5n4oCmJyB9KSk7CiAgICAgIGxvYWRGb2xkZXJzKCkudGhlbihyZXBhaW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlcGFpbnQoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbmFtZUZvbGRlckZsb3coZm9sZGVyLCBhZnRlcikgewogICAgdmFyIGlucHV0ID0gZWwoJ2lucHV0JywgeyBjbGFzczogJ3YtZmllbGQnLCB0eXBlOiAndGV4dCcsIHZhbHVlOiBmb2xkZXIubmFtZSwgbWF4bGVuZ3RoOiAnNjAnIH0pOwogICAgdmFyIHNhdmUgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1wcmltYXJ5IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nLCB0ZXh0OiAnU2F2ZScgfSk7CiAgICB2YXIgY2FuY2VsID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIHRleHQ6ICdDYW5jZWwnIH0pOwogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtbW9kYWwtYm9keScgfSwKICAgICAgZWwoJ2gzJywgeyBjbGFzczogJ3YtbW9kYWwtdGl0bGUnLCB0ZXh0OiAnUmVuYW1lIEZvbGRlcicgfSksCiAgICAgIGlucHV0LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytcm93IHYtbW9kYWwtYWN0aW9ucycgfSwgY2FuY2VsLCBzYXZlKSk7CiAgICB2YXIgbSA9IG1vZGFsKHdyYXAsIHt9KTsKICAgIGNhbmNlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgbS5jbG9zZSgpOyB9KTsKICAgIHNhdmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBuID0gKGlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIGlmICghbikgeyBpbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgc2F2ZS5kaXNhYmxlZCA9IHRydWU7CiAgICAgIFYuYXBpLnJlbmFtZUZvbGRlcihmb2xkZXIuaWQsIG4pLnRoZW4oZnVuY3Rpb24gKGYpIHsKICAgICAgICBmb2xkZXIubmFtZSA9IChmICYmIGYubmFtZSkgfHwgbjsKICAgICAgICBtLmNsb3NlKCk7CiAgICAgICAgaWYgKGFmdGVyKSBhZnRlcigpOwogICAgICAgIHRvYXN0KCdGb2xkZXIgcmVuYW1lZCcsICdzdWNjZXNzJyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgc2F2ZS5kaXNhYmxlZCA9IGZhbHNlOyB0b2FzdCgnUmVuYW1lIGZhaWxlZCcsICdlcnJvcicpOyB9KTsKICAgIH0pOwogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGlucHV0LmZvY3VzKCk7IGlucHV0LnNlbGVjdCgpOyB9LCAzMCk7CiAgfQoKICBmdW5jdGlvbiBkZWxldGVGb2xkZXJGbG93KGZvbGRlciwgYWZ0ZXIpIHsKICAgIGNvbmZpcm1EaWFsb2coJ0RlbGV0ZSBmb2xkZXIgIicgKyBmb2xkZXIubmFtZSArICciPyBJbWFnZXMgaW5zaWRlIGFyZSBrZXB0IChqdXN0IHVuLWZpbGVkKS4nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIFYuYXBpLmRlbGV0ZUZvbGRlcihmb2xkZXIuaWQpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIGN0eC5mb2xkZXJzID0gY3R4LmZvbGRlcnMuZmlsdGVyKGZ1bmN0aW9uIChmKSB7IHJldHVybiBmLmlkICE9PSBmb2xkZXIuaWQ7IH0pOwogICAgICAgIGlmIChjdHguc291cmNlID09PSAnZm9sZGVyJyAmJiBjdHguZm9sZGVySUQgPT09IGZvbGRlci5pZCkgb3BlbkxpYnJhcnkoKTsKICAgICAgICBpZiAoYWZ0ZXIpIGFmdGVyKCk7CiAgICAgICAgdG9hc3QoJ0ZvbGRlciBkZWxldGVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgeyB0b2FzdCgnRGVsZXRlIGZhaWxlZCcsICdlcnJvcicpOyB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gYXNzaWduVG9Gb2xkZXJGbG93KGltYWdlSURzLCBvbkRvbmUpIHsKICAgIHZhciB3cmFwID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vZGFsLWJvZHknIH0pOwogICAgd3JhcC5hcHBlbmRDaGlsZChlbCgnaDMnLCB7IGNsYXNzOiAndi1tb2RhbC10aXRsZScsIHRleHQ6ICdBZGQgJyArIGltYWdlSURzLmxlbmd0aCArICcgdG8gRm9sZGVyJyB9KSk7CiAgICB2YXIgbGlzdEVsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLW1kJyB9KTsKICAgIHdyYXAuYXBwZW5kQ2hpbGQobGlzdEVsKTsKCiAgICBmdW5jdGlvbiBwYWludCgpIHsKICAgICAgbGlzdEVsLmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWN0eC5mb2xkZXJzLmxlbmd0aCkgewogICAgICAgIGxpc3RFbC5hcHBlbmRDaGlsZChlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19zdWInLCB0ZXh0OiAnTm8gZm9sZGVycyB5ZXQg4oCUIGNyZWF0ZSBvbmUgYmVsb3cuJyB9KSk7CiAgICAgIH0KICAgICAgY3R4LmZvbGRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZikgewogICAgICAgIHZhciBiID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicgfSwKICAgICAgICAgIGljb24oJ2ZvbGRlcicpLCBlbCgnc3BhbicsIHsgdGV4dDogZi5uYW1lIH0pLCBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHNfX251bScsIHRleHQ6ICcoJyArIChmLmltYWdlQ291bnQgfHwgMCkgKyAnKScgfSkpOwogICAgICAgIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBiLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgIFYuYXBpLmFzc2lnbkZvbGRlcihmLmlkLCBpbWFnZUlEcykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGYuaW1hZ2VDb3VudCA9IChmLmltYWdlQ291bnQgfHwgMCkgKyBpbWFnZUlEcy5sZW5ndGg7CiAgICAgICAgICAgIG0uY2xvc2UoKTsKICAgICAgICAgICAgdG9hc3QoJ0FkZGVkIHRvICInICsgZi5uYW1lICsgJyInLCAnc3VjY2VzcycpOwogICAgICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoKTsKICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgYi5kaXNhYmxlZCA9IGZhbHNlOyB0b2FzdCgnQ291bGQgbm90IGFkZCB0byBmb2xkZXInLCAnZXJyb3InKTsgfSk7CiAgICAgICAgfSk7CiAgICAgICAgbGlzdEVsLmFwcGVuZENoaWxkKGIpOwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgbmFtZUlucHV0ID0gZWwoJ2lucHV0JywgeyBjbGFzczogJ3YtZmllbGQnLCB0eXBlOiAndGV4dCcsIHBsYWNlaG9sZGVyOiAnTmV3IGZvbGRlciBuYW1lJywgbWF4bGVuZ3RoOiAnNjAnIH0pOwogICAgdmFyIGNyZWF0ZUJ0biA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nIH0sIGljb24oJ3BsdXMnKSwgJ05ldycpOwogICAgY3JlYXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICB2YXIgbiA9IChuYW1lSW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTsKICAgICAgaWYgKCFuKSB7IG5hbWVJbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgY3JlYXRlQnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgVi5hcGkuY3JlYXRlRm9sZGVyKG4pLnRoZW4oZnVuY3Rpb24gKGYpIHsKICAgICAgICBpZiAoZikgY3R4LmZvbGRlcnMucHVzaChmKTsKICAgICAgICBuYW1lSW5wdXQudmFsdWUgPSAnJzsKICAgICAgICBjcmVhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICBwYWludCgpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IGNyZWF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlOyB0b2FzdCgnQ291bGQgbm90IGNyZWF0ZSBmb2xkZXInLCAnZXJyb3InKTsgfSk7CiAgICB9KTsKICAgIG5hbWVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHsgaWYgKGUua2V5ID09PSAnRW50ZXInKSBjcmVhdGVCdG4uY2xpY2soKTsgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1yb3cgdi1tb2RhbC1hY3Rpb25zJyB9LCBuYW1lSW5wdXQsIGNyZWF0ZUJ0bikpOwoKICAgIHZhciBtID0gbW9kYWwod3JhcCwge30pOwogICAgaWYgKCFjdHguZm9sZGVyc0xvYWRlZCkgewogICAgICBsaXN0RWwuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fc3ViJywgdGV4dDogJ0xvYWRpbmfigKYnIH0pKTsKICAgICAgbG9hZEZvbGRlcnMoKS50aGVuKHBhaW50KTsKICAgIH0gZWxzZSBwYWludCgpOwogIH0KCiAgZnVuY3Rpb24gdG9nZ2xlRmF2b3JpdGUoaW1nLCBvbkNoYW5nZSkgewogICAgdmFyIGlkID0gaW1nSWQoaW1nKTsKICAgIGlmICghaWQpIHsgdG9hc3QoJ1RoaXMgaW1hZ2UgaGFzIG5vIHNlcnZlciBpZCB5ZXQnLCAnZXJyb3InKTsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOyB9CiAgICB2YXIgbmV4dCA9ICFpbWcuZmF2b3JpdGVkOwogICAgaW1nLmZhdm9yaXRlZCA9IG5leHQ7CiAgICBpZiAob25DaGFuZ2UpIG9uQ2hhbmdlKCk7CiAgICByZXR1cm4gVi5hcGkuc2V0RmF2b3JpdGUoaWQsIG5leHQpLnRoZW4oZnVuY3Rpb24gKHVwZGF0ZWQpIHsKICAgICAgaWYgKHVwZGF0ZWQgJiYgdHlwZW9mIHVwZGF0ZWQuZmF2b3JpdGVkID09PSAnYm9vbGVhbicpIGltZy5mYXZvcml0ZWQgPSB1cGRhdGVkLmZhdm9yaXRlZDsKICAgICAgdG9hc3QobmV4dCA/ICdBZGRlZCB0byBmYXZvcml0ZXMnIDogJ1JlbW92ZWQgZnJvbSBmYXZvcml0ZXMnLCAnc3VjY2VzcycpOwogICAgICBpZiAob25DaGFuZ2UpIG9uQ2hhbmdlKCk7CiAgICAgIGlmIChjdHguc291cmNlID09PSAnZmF2b3JpdGVzJyAmJiAhaW1nLmZhdm9yaXRlZCkgewogICAgICAgIGN0eC5pdGVtcyA9IGN0eC5pdGVtcy5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGltZ0tleSh4KSAhPT0gaW1nS2V5KGltZyk7IH0pOwogICAgICAgIHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgaW1nLmZhdm9yaXRlZCA9ICFuZXh0OwogICAgICBpZiAob25DaGFuZ2UpIG9uQ2hhbmdlKCk7CiAgICAgIHRvYXN0KCdDb3VsZCBub3QgdXBkYXRlIGZhdm9yaXRlJywgJ2Vycm9yJyk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGRlbGV0ZUltYWdlRmxvdyhpbWcpIHsKICAgIHZhciBpZCA9IGltZ0lkKGltZyk7CiAgICBpZiAoIWlkKSB7IHRvYXN0KCdDYW5ub3QgZGVsZXRlIOKAlCBtaXNzaW5nIGlkJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgY29uZmlybURpYWxvZygnRGVsZXRlIHRoaXMgY3JlYXRpb24/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIFYuYXBpLmRlbGV0ZUltYWdlKGlkKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICBjdHguaXRlbXMgPSBjdHguaXRlbXMuZmlsdGVyKGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWdLZXkoeCkgIT09IGltZ0tleShpbWcpOyB9KTsKICAgICAgICBkZWxldGUgY3R4LnNlbGVjdGVkW2ltZ0tleShpbWcpXTsKICAgICAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2xpYnJhcnknICYmIFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuc2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBjdHguX3NlbGZXcml0ZSA9IHRydWU7CiAgICAgICAgICB0cnkgeyBWLnN0b3JlLnNldCgnbGlicmFyeScsIGN0eC5pdGVtcy5zbGljZSgpKTsgfSBjYXRjaCAoZSkge30KICAgICAgICAgIGN0eC5fc2VsZldyaXRlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7CiAgICAgICAgdG9hc3QoJ0RlbGV0ZWQnLCAnc3VjY2VzcycpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHRvYXN0KCdEZWxldGUgZmFpbGVkJywgJ2Vycm9yJyk7IH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBjb3B5UHJvbXB0KGltZykgewogICAgdmFyIHRleHQgPSBpbWcucHJvbXB0IHx8ICcnOwogICAgaWYgKCF0ZXh0KSB7IHRvYXN0KCdObyBwcm9tcHQgdG8gY29weScsICdpbmZvJyk7IHJldHVybjsgfQogICAgdmFyIGRvbmUgPSBmdW5jdGlvbiAoKSB7IHRvYXN0KCdQcm9tcHQgY29waWVkJywgJ3N1Y2Nlc3MnKTsgfTsKICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7CiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oZG9uZSwgZnVuY3Rpb24gKCkgeyBmYWxsYmFja0NvcHkodGV4dCwgZG9uZSk7IH0pOwogICAgfSBlbHNlIGZhbGxiYWNrQ29weSh0ZXh0LCBkb25lKTsKICB9CgogIGZ1bmN0aW9uIGZhbGxiYWNrQ29weSh0ZXh0LCBkb25lKSB7CiAgICB2YXIgdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogICAgdGEudmFsdWUgPSB0ZXh0OyB0YS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7IHRhLnN0eWxlLm9wYWNpdHkgPSAnMCc7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhKTsgdGEuZm9jdXMoKTsgdGEuc2VsZWN0KCk7CiAgICB0cnkgeyBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOyBkb25lKCk7IH0gY2F0Y2ggKGUpIHsgdG9hc3QoJ0NvcHkgZmFpbGVkJywgJ2Vycm9yJyk7IH0KICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGEpOwogIH0KCiAgZnVuY3Rpb24gZG93bmxvYWRJbWFnZShpbWcpIHsKICAgIHZhciB1cmwgPSBpbWcucmVtb3RlSW1hZ2VVUkwgfHwgaW1nLnZpZGVvVVJMIHx8IGltZy5yZW1vdGVPcmlnaW5hbEltYWdlVVJMOwogICAgaWYgKCF1cmwpIHsgdG9hc3QoJ05vdGhpbmcgdG8gZG93bmxvYWQnLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICB2YXIgZXh0ID0gaW1nLnZpZGVvVVJMID8gJ21wNCcgOiAnanBnJzsKICAgIGRvd25sb2FkKHVybCwgJ3ZhbXAtJyArIChpbWdLZXkoaW1nKSB8fCAnaW1hZ2UnKS5zbGljZSgwLCA4KSArICcuJyArIGV4dCk7CiAgfQoKICBmdW5jdGlvbiBpc1ZpZGVvKGltZykgeyByZXR1cm4gISEoaW1nICYmIGltZy52aWRlb1VSTCk7IH0KCiAgZnVuY3Rpb24gY29weVNoYXJlVGV4dChzdHIpIHsKICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7CiAgICAgIHJldHVybiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzdHIpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH0pOwogICAgfQogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsKICAgICAgICB0YS52YWx1ZSA9IHN0cjsgdGEuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnOyB0YS5zdHlsZS5vcGFjaXR5ID0gJzAnOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOyB0YS5mb2N1cygpOyB0YS5zZWxlY3QoKTsKICAgICAgICB2YXIgb2sgPSBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOwogICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGEpOwogICAgICAgIHJlc29sdmUob2spOwogICAgICB9IGNhdGNoIChlKSB7IHJlc29sdmUoZmFsc2UpOyB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHNoYXJlVVJMRm9yKGltZykgewogICAgdmFyIGlkID0gaW1nSWQoaW1nKTsKICAgIGlmICghaWQpIHJldHVybiBudWxsOwogICAgdmFyIGJhc2UgPSAoVi5jb25maWcgJiYgVi5jb25maWcuQVBJKSA/IFYuY29uZmlnLkFQSSA6ICdodHRwczovL2FwaS52b29zZXkuY29tJzsKICAgIHJldHVybiBiYXNlLnJlcGxhY2UoL1wvKyQvLCAnJykgKyAnL2dlbmVyYXRlZC9yZW5kZXIvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCk7CiAgfQoKICBmdW5jdGlvbiBzaGFyZUltYWdlKGltZykgewogICAgdmFyIHVybCA9IHNoYXJlVVJMRm9yKGltZyk7CiAgICB2YXIgdGV4dCA9IChpbWcucHJvbXB0ID8gaW1nLnByb21wdCArICdcblxuJyA6ICcnKSArICdNYWRlIHdpdGggVmFtcCBieSBWb29zZXkuJzsKICAgIGlmIChuYXZpZ2F0b3Iuc2hhcmUgJiYgdXJsKSB7CiAgICAgIG5hdmlnYXRvci5zaGFyZSh7IHRpdGxlOiAnVmFtcCcsIHRleHQ6IHRleHQsIHVybDogdXJsIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHJldHVybjsKICAgICAgICBjb3B5U2hhcmVMaW5rKHVybCk7CiAgICAgIH0pOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodXJsKSB7IGNvcHlTaGFyZUxpbmsodXJsKTsgcmV0dXJuOyB9CiAgICBpZiAoaW1nLnJlbW90ZUltYWdlVVJMIHx8IGltZy52aWRlb1VSTCkgeyBkb3dubG9hZEltYWdlKGltZyk7IHJldHVybjsgfQogICAgdG9hc3QoJ05vdGhpbmcgdG8gc2hhcmUnLCAnZXJyb3InKTsKICB9CgogIGZ1bmN0aW9uIGNvcHlTaGFyZUxpbmsodXJsKSB7CiAgICBjb3B5U2hhcmVUZXh0KHVybCkudGhlbihmdW5jdGlvbiAob2spIHsKICAgICAgdG9hc3Qob2sgPyAnU2hhcmUgbGluayBjb3BpZWQnIDogJ0NvcHkgdGhpcyBsaW5rOiAnICsgdXJsLCBvayA/ICdzdWNjZXNzJyA6ICdpbmZvJyk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHJlbWl4SW1hZ2UoaW1nKSB7CiAgICB2YXIgcGFyYW1zID0gW107CiAgICBpZiAoaW1nLnByb21wdCkgcGFyYW1zLnB1c2goJ3Byb21wdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGltZy5wcm9tcHQpKTsKICAgIGlmIChpbWcubW9kZWwpIHBhcmFtcy5wdXNoKCdtb2RlbD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGltZy5tb2RlbCkpOwogICAgdmFyIHNyYyA9IGltZy5yZW1vdGVJbWFnZVVSTCB8fCBpbWcucmVtb3RlT3JpZ2luYWxJbWFnZVVSTDsKICAgIGlmIChzcmMpIHBhcmFtcy5wdXNoKCdpbWFnZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHNyYykpOwogICAgY2FwdHVyZVNjcm9sbCgpOwogICAgZ28oJyMvY3JlYXRlJyArIChwYXJhbXMubGVuZ3RoID8gJz8nICsgcGFyYW1zLmpvaW4oJyYnKSA6ICcnKSk7CiAgfQoKICBmdW5jdGlvbiBjbG9zZU1lbnUoKSB7CiAgICBpZiAoY3R4ICYmIGN0eC5tZW51RWwgJiYgY3R4Lm1lbnVFbC5wYXJlbnROb2RlKSBjdHgubWVudUVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY3R4Lm1lbnVFbCk7CiAgICBpZiAoY3R4KSBjdHgubWVudUVsID0gbnVsbDsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25Eb2NDbGlja0Nsb3NlTWVudSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25NZW51S2V5LCB0cnVlKTsKICB9CgogIGZ1bmN0aW9uIG9uRG9jQ2xpY2tDbG9zZU1lbnUoZSkgewogICAgaWYgKGN0eCAmJiBjdHgubWVudUVsICYmICFjdHgubWVudUVsLmNvbnRhaW5zKGUudGFyZ2V0KSkgY2xvc2VNZW51KCk7CiAgfQogIGZ1bmN0aW9uIG9uTWVudUtleShlKSB7IGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNsb3NlTWVudSgpOyB9CgogIGZ1bmN0aW9uIG9wZW5Db250ZXh0TWVudShpbWcsIHgsIHksIG9uQ2hhbmdlKSB7CiAgICBjbG9zZU1lbnUoKTsKICAgIHZhciBtZW51ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1lbnUgZ2xhc3MtY2FyZCcsIHJvbGU6ICdtZW51JyB9KTsKICAgIFMobWVudSwgJ21pbi13aWR0aDoyMDBweDtwYWRkaW5nOjZweDtib3JkZXItcmFkaXVzOnZhcigtLXYtcmFkaXVzLXNtLDE1cHgpO2JhY2tncm91bmQ6JyArIEdMQVNTX0JHICsgJztib3JkZXI6MXB4IHNvbGlkICcgKyBMSU5FICsgJztib3gtc2hhZG93OjAgMTZweCA0OHB4IHJnYmEoMCwwLDAsLjQ1KTtvdmVyZmxvdzpoaWRkZW4nKTsKCiAgICBmdW5jdGlvbiBpdGVtKGxhYmVsLCBpYywgZm4sIGRhbmdlcikgewogICAgICB2YXIgYiA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1tZW51X19pdGVtJyArIChkYW5nZXIgPyAnIHYtbWVudV9faXRlbS0tZGFuZ2VyJyA6ICcnKSwgdHlwZTogJ2J1dHRvbicsIHJvbGU6ICdtZW51aXRlbScgfSwKICAgICAgICBpYyA/IGljb24oaWMpIDogbnVsbCwgZWwoJ3NwYW4nLCB7IHRleHQ6IGxhYmVsIH0pKTsKICAgICAgUyhiLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDt3aWR0aDoxMDAlO3BhZGRpbmc6MTBweCAxMnB4O2JvcmRlcjowO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6JyArIChkYW5nZXIgPyAndmFyKC0tY29sb3ItZXJyb3IsICNGNzMzNjMpJyA6ICd2YXIoLS12LWluaywgI2Y1ZjVmNyknKSArICc7Zm9udDppbmhlcml0O2ZvbnQtc2l6ZToxNHB4O3RleHQtYWxpZ246bGVmdDtib3JkZXItcmFkaXVzOjlweDtjdXJzb3I6cG9pbnRlcicpOwogICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBmdW5jdGlvbiAoKSB7IGIuc3R5bGUuYmFja2dyb3VuZCA9IGRhbmdlciA/ICdyZ2JhKDI0Nyw1MSw5OSwuMTQpJyA6ICdyZ2JhKDI1NSwyNTUsMjU1LC4wNyknOyB9KTsKICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKCkgeyBiLnN0eWxlLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnOyB9KTsKICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGZ1bmN0aW9uICgpIHsgYi5zdHlsZS5iYWNrZ3JvdW5kID0gZGFuZ2VyID8gJ3JnYmEoMjQ3LDUxLDk5LC4xNCknIDogJ3JnYmEoMjU1LDI1NSwyNTUsLjA3KSc7IH0pOwogICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbiAoKSB7IGIuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7IH0pOwogICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBjbG9zZU1lbnUoKTsgZm4oKTsgfSk7CiAgICAgIHJldHVybiBiOwogICAgfQoKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbSgnT3BlbicsICdncmlkJywgZnVuY3Rpb24gKCkgeyBvcGVuSW1hZ2UoaW1nKTsgfSkpOwogICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKCdSZW1peCcsICd2YXJpYXRpb25zJywgZnVuY3Rpb24gKCkgeyByZW1peEltYWdlKGltZyk7IH0pKTsKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbShpbWcuZmF2b3JpdGVkID8gJ1VuZmF2b3JpdGUnIDogJ0Zhdm9yaXRlJywgaW1nLmZhdm9yaXRlZCA/ICdoZWFydEZpbGwnIDogJ2hlYXJ0JywgZnVuY3Rpb24gKCkgeyB0b2dnbGVGYXZvcml0ZShpbWcsIG9uQ2hhbmdlKTsgfSkpOwogICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKCdBZGQgdG8gRm9sZGVyJywgJ2ZvbGRlcicsIGZ1bmN0aW9uICgpIHsgYXNzaWduVG9Gb2xkZXJGbG93KFtpbWdJZChpbWcpXSk7IH0pKTsKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbSgnQ29weSBQcm9tcHQnLCAnY29weScsIGZ1bmN0aW9uICgpIHsgY29weVByb21wdChpbWcpOyB9KSk7CiAgICBtZW51LmFwcGVuZENoaWxkKGl0ZW0oJ1NoYXJlJywgJ3NoYXJlJywgZnVuY3Rpb24gKCkgeyBzaGFyZUltYWdlKGltZyk7IH0pKTsKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbSgnRG93bmxvYWQnLCAnZG93bmxvYWQnLCBmdW5jdGlvbiAoKSB7IGRvd25sb2FkSW1hZ2UoaW1nKTsgfSkpOwogICAgbWVudS5hcHBlbmRDaGlsZChTKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tZW51X19zZXAnIH0pLCAnaGVpZ2h0OjFweDttYXJnaW46NnB4IDhweDtiYWNrZ3JvdW5kOicgKyBMSU5FKSk7CiAgICBtZW51LmFwcGVuZENoaWxkKGl0ZW0oJ0RlbGV0ZScsICd0cmFzaCcsIGZ1bmN0aW9uICgpIHsgZGVsZXRlSW1hZ2VGbG93KGltZyk7IH0sIHRydWUpKTsKCiAgICBtZW51LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJzsKICAgIG1lbnUuc3R5bGUuekluZGV4ID0gJzEyMDAnOwogICAgbWVudS5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnOwogICAgbWVudS5zdHlsZS50b3AgPSAnMCc7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lbnUpOwogICAgY3R4Lm1lbnVFbCA9IG1lbnU7CgogICAgdmFyIHJlY3QgPSBtZW51LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgdmFyIHZ3ID0gd2luZG93LmlubmVyV2lkdGgsIHZoID0gd2luZG93LmlubmVySGVpZ2h0OwogICAgdmFyIHB4ID0gTWF0aC5taW4oeCwgdncgLSByZWN0LndpZHRoIC0gOCk7CiAgICB2YXIgcHkgPSBNYXRoLm1pbih5LCB2aCAtIHJlY3QuaGVpZ2h0IC0gOCk7CiAgICBtZW51LnN0eWxlLmxlZnQgPSBNYXRoLm1heCg4LCBweCkgKyAncHgnOwogICAgbWVudS5zdHlsZS50b3AgPSBNYXRoLm1heCg4LCBweSkgKyAncHgnOwoKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uRG9jQ2xpY2tDbG9zZU1lbnUsIHRydWUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25NZW51S2V5LCB0cnVlKTsKICAgIH0sIDApOwogIH0KCiAgZnVuY3Rpb24gb3BlbkltYWdlKGltZykgewogICAgdmFyIGlkID0gaW1nSWQoaW1nKTsKICAgIGlmICghaWQpIHsgdG9hc3QoJ1RoaXMgY3JlYXRpb24gaXMgbm90IHNhdmVkIHlldCcsICdpbmZvJyk7IHJldHVybjsgfQogICAgY2FwdHVyZVNjcm9sbCgpOwogICAgZ28oJyMvaW1hZ2UvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCkpOwogIH0KCiAgZnVuY3Rpb24gY2FwdHVyZVNjcm9sbCgpIHsKICAgIGN0eC5zY3JvbGxZID0gKGN0eC5zY3JvbGxUYXJnZXQgJiYgY3R4LnNjcm9sbFRhcmdldCAhPT0gd2luZG93KQogICAgICA/IGN0eC5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wCiAgICAgIDogKHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IDApOwogICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuc2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7IFYuc3RvcmUuc2V0KCdsaWJyYXJ5U2Nyb2xsWScsIGN0eC5zY3JvbGxZKTsgfSBjYXRjaCAoZSkge30KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlc3RvcmVTY3JvbGwoKSB7CiAgICB2YXIgeSA9IGN0eC5zY3JvbGxZOwogICAgaWYgKCF5ICYmIFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuZ2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7IHkgPSBWLnN0b3JlLmdldCgnbGlicmFyeVNjcm9sbFknKSB8fCAwOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgaWYgKCF5KSByZXR1cm47CiAgICB2YXIgYXBwbHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChjdHguc2Nyb2xsVGFyZ2V0ICYmIGN0eC5zY3JvbGxUYXJnZXQgIT09IHdpbmRvdykgY3R4LnNjcm9sbFRhcmdldC5zY3JvbGxUb3AgPSB5OwogICAgICBlbHNlIHdpbmRvdy5zY3JvbGxUbygwLCB5KTsKICAgIH07CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkgeyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYXBwbHkpOyB9KTsKICB9CgogIGZ1bmN0aW9uIGVudGVyU2VsZWN0KGluaXRpYWxJbWcpIHsKICAgIGN0eC5zZWxlY3RNb2RlID0gdHJ1ZTsKICAgIGlmIChpbml0aWFsSW1nKSBjdHguc2VsZWN0ZWRbaW1nS2V5KGluaXRpYWxJbWcpXSA9IHRydWU7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICByZW5kZXJHcmlkKCk7CiAgfQogIGZ1bmN0aW9uIGV4aXRTZWxlY3QoKSB7CiAgICBjdHguc2VsZWN0TW9kZSA9IGZhbHNlOwogICAgY3R4LnNlbGVjdGVkID0ge307CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICByZW5kZXJHcmlkKCk7CiAgfQogIGZ1bmN0aW9uIHRvZ2dsZVNlbGVjdChpbWcpIHsKICAgIHZhciBrID0gaW1nS2V5KGltZyk7CiAgICBpZiAoY3R4LnNlbGVjdGVkW2tdKSBkZWxldGUgY3R4LnNlbGVjdGVkW2tdOwogICAgZWxzZSBjdHguc2VsZWN0ZWRba10gPSB0cnVlOwogICAgcmVuZGVyVG9vbGJhcigpOwogICAgcmVuZGVyU2VsZWN0aW9uU3RhdGVGb3Ioayk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGVkQ291bnQoKSB7IHJldHVybiBPYmplY3Qua2V5cyhjdHguc2VsZWN0ZWQpLmxlbmd0aDsgfQogIGZ1bmN0aW9uIHNlbGVjdGVkSW1hZ2VzKCkgewogICAgdmFyIG91dCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdHguaXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGN0eC5zZWxlY3RlZFtpbWdLZXkoY3R4Lml0ZW1zW2ldKV0pIG91dC5wdXNoKGN0eC5pdGVtc1tpXSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBmdW5jdGlvbiBzZWxlY3RBbGxWaXNpYmxlKCkgewogICAgdmFyIHZpcyA9IHZpc2libGVJdGVtcygpOwogICAgdmFyIGFsbFNlbGVjdGVkID0gdmlzLmxlbmd0aCAmJiB2aXMuZXZlcnkoZnVuY3Rpb24gKGltZykgeyByZXR1cm4gY3R4LnNlbGVjdGVkW2ltZ0tleShpbWcpXTsgfSk7CiAgICBpZiAoYWxsU2VsZWN0ZWQpIGN0eC5zZWxlY3RlZCA9IHt9OwogICAgZWxzZSB2aXMuZm9yRWFjaChmdW5jdGlvbiAoaW1nKSB7IGN0eC5zZWxlY3RlZFtpbWdLZXkoaW1nKV0gPSB0cnVlOyB9KTsKICAgIHJlbmRlclRvb2xiYXIoKTsKICAgIHJlbmRlckdyaWQoKTsKICB9CgogIGZ1bmN0aW9uIHJlbmRlclNlbGVjdGlvblN0YXRlRm9yKGtleSkgewogICAgaWYgKCFjdHguZ3JpZEVsKSByZXR1cm47CiAgICB2YXIgY2VsbCA9IGN0eC5ncmlkRWwucXVlcnlTZWxlY3RvcignW2RhdGEta2V5PSInICsgY3NzRXNjKGtleSkgKyAnIl0nKTsKICAgIGlmICghY2VsbCkgcmV0dXJuOwogICAgdmFyIG9uID0gISFjdHguc2VsZWN0ZWRba2V5XTsKICAgIGNlbGwuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtc2VsZWN0ZWQnLCBvbik7CiAgICB2YXIgY2IgPSBjZWxsLnF1ZXJ5U2VsZWN0b3IoJy52LWxpYi1jaGVjaycpOwogICAgaWYgKGNiKSB7CiAgICAgIGNiLmNsYXNzTGlzdC50b2dnbGUoJ2lzLW9uJywgb24pOwogICAgICBjYi5zZXRBdHRyaWJ1dGUoJ2FyaWEtY2hlY2tlZCcsIG9uID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgICAgIGNiLnN0eWxlLmJhY2tncm91bmQgPSBvbiA/IEdSQURJRU5UIDogQkFER0VfQkc7CiAgICAgIGNiLmlubmVySFRNTCA9ICcnOwogICAgICBpZiAob24pIGNiLmFwcGVuZENoaWxkKGljb24oJ2NoZWNrJykpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3NzRXNjKHMpIHsKICAgIGlmICh3aW5kb3cuQ1NTICYmIENTUy5lc2NhcGUpIHJldHVybiBDU1MuZXNjYXBlKHMpOwogICAgcmV0dXJuIFN0cmluZyhzKS5yZXBsYWNlKC9bIlxcXF1cW10vZywgJ1xcJCYnKTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoRGVsZXRlKCkgewogICAgdmFyIGltZ3MgPSBzZWxlY3RlZEltYWdlcygpOwogICAgaWYgKCFpbWdzLmxlbmd0aCkgcmV0dXJuOwogICAgY29uZmlybURpYWxvZygnRGVsZXRlICcgKyBpbWdzLmxlbmd0aCArICcgY3JlYXRpb24nICsgKGltZ3MubGVuZ3RoID4gMSA/ICdzJyA6ICcnKSArICc/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIHZhciBqb2JzID0gaW1ncy5tYXAoZnVuY3Rpb24gKGltZykgewogICAgICAgIHZhciBpZCA9IGltZ0lkKGltZyk7CiAgICAgICAgaWYgKCFpZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgICAgICByZXR1cm4gVi5hcGkuZGVsZXRlSW1hZ2UoaWQpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gaW1nS2V5KGltZyk7IH0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH0pOwogICAgICB9KTsKICAgICAgUHJvbWlzZS5hbGwoam9icykudGhlbihmdW5jdGlvbiAocmVzdWx0cykgewogICAgICAgIHZhciByZW1vdmVkID0ge307CiAgICAgICAgcmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IGlmIChrKSByZW1vdmVkW2tdID0gdHJ1ZTsgfSk7CiAgICAgICAgY3R4Lml0ZW1zID0gY3R4Lml0ZW1zLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4gIXJlbW92ZWRbaW1nS2V5KHgpXTsgfSk7CiAgICAgICAgdmFyIGZhaWxlZCA9IHJlc3VsdHMuZmlsdGVyKGZ1bmN0aW9uIChrKSB7IHJldHVybiAhazsgfSkubGVuZ3RoOwogICAgICAgIGlmIChjdHguc291cmNlID09PSAnbGlicmFyeScgJiYgVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5zZXQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGN0eC5fc2VsZldyaXRlID0gdHJ1ZTsKICAgICAgICAgIHRyeSB7IFYuc3RvcmUuc2V0KCdsaWJyYXJ5JywgY3R4Lml0ZW1zLnNsaWNlKCkpOyB9IGNhdGNoIChlKSB7fQogICAgICAgICAgY3R4Ll9zZWxmV3JpdGUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZXhpdFNlbGVjdCgpOwogICAgICAgIHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7CiAgICAgICAgaWYgKGZhaWxlZCkgdG9hc3QoZmFpbGVkICsgJyBjb3VsZCBub3QgYmUgZGVsZXRlZCcsICdlcnJvcicpOwogICAgICAgIGVsc2UgdG9hc3QoJ0RlbGV0ZWQgJyArIE9iamVjdC5rZXlzKHJlbW92ZWQpLmxlbmd0aCwgJ3N1Y2Nlc3MnKTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoQXNzaWduKCkgewogICAgdmFyIGlkcyA9IHNlbGVjdGVkSW1hZ2VzKCkubWFwKGltZ0lkKS5maWx0ZXIoQm9vbGVhbik7CiAgICBpZiAoIWlkcy5sZW5ndGgpIHJldHVybjsKICAgIGFzc2lnblRvRm9sZGVyRmxvdyhpZHMsIGZ1bmN0aW9uICgpIHsgZXhpdFNlbGVjdCgpOyB9KTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoRG93bmxvYWQoKSB7CiAgICB2YXIgaW1ncyA9IHNlbGVjdGVkSW1hZ2VzKCk7CiAgICBpZiAoIWltZ3MubGVuZ3RoKSByZXR1cm47CiAgICBpbWdzLmZvckVhY2goZnVuY3Rpb24gKGltZywgaSkgewogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgZG93bmxvYWRJbWFnZShpbWcpOyB9LCBpICogMjUwKTsKICAgIH0pOwogICAgdG9hc3QoJ0Rvd25sb2FkaW5nICcgKyBpbWdzLmxlbmd0aCwgJ2luZm8nKTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoU2hhcmUoKSB7CiAgICB2YXIgaW1ncyA9IHNlbGVjdGVkSW1hZ2VzKCk7CiAgICBpZiAoIWltZ3MubGVuZ3RoKSByZXR1cm47CiAgICBpZiAoaW1ncy5sZW5ndGggPT09IDEpIHsgc2hhcmVJbWFnZShpbWdzWzBdKTsgcmV0dXJuOyB9CiAgICB2YXIgbGluZXMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1ncy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgdXJsID0gc2hhcmVVUkxGb3IoaW1nc1tpXSk7CiAgICAgIGlmICh1cmwpIGxpbmVzLnB1c2godXJsKTsKICAgIH0KICAgIGlmICghbGluZXMubGVuZ3RoKSB7IHRvYXN0KCdUaGVzZSBjcmVhdGlvbnMgaGF2ZSBubyBzaGFyZSBsaW5rcyB5ZXQnLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICB2YXIgdGV4dCA9IGxpbmVzLmpvaW4oJ1xuJyk7CiAgICBpZiAobmF2aWdhdG9yLnNoYXJlKSB7CiAgICAgIG5hdmlnYXRvci5zaGFyZSh7IHRpdGxlOiAnVmFtcCcsIHRleHQ6ICdNYWRlIHdpdGggVmFtcCBieSBWb29zZXkuJywgdXJsOiBsaW5lc1swXSB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgaWYgKGVyciAmJiBlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47CiAgICAgICAgY29weVNoYXJlVGV4dCh0ZXh0KS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/IGxpbmVzLmxlbmd0aCArICcgbGlua3MgY29waWVkJyA6ICdDb3VsZCBub3QgY29weSBsaW5rcycsIG9rID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJyk7IH0pOwogICAgICB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29weVNoYXJlVGV4dCh0ZXh0KS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/IGxpbmVzLmxlbmd0aCArICcgbGlua3MgY29waWVkJyA6ICdDb3VsZCBub3QgY29weSBsaW5rcycsIG9rID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJyk7IH0pOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyVG9vbGJhcigpIHsKICAgIGlmICghY3R4LnRvb2xiYXJFbCkgcmV0dXJuOwogICAgY3R4LnRvb2xiYXJFbC5pbm5lckhUTUwgPSAnJzsKCiAgICBpZiAoY3R4LnNlbGVjdE1vZGUpIHsKICAgICAgdmFyIGJhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItc2VsYmFyIGdsYXNzLWNhcmQnIH0sCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsICdhcmlhLWxhYmVsJzogJ0V4aXQgc2VsZWN0aW9uJywgdGl0bGU6ICdEb25lJywgb25jbGljazogZXhpdFNlbGVjdCB9LCBpY29uKCdjbG9zZScpLCAnRG9uZScpLAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6IHNlbGVjdGVkQ291bnQoKSArICcgc2VsZWN0ZWQnIH0pLAogICAgICAgIFMoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1saWItc3BhY2VyJyB9KSwgJ2ZsZXg6MSAxIGF1dG8nKSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgb25jbGljazogc2VsZWN0QWxsVmlzaWJsZSB9LCAnU2VsZWN0IEFsbCcpLAogICAgICAgIGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nLCBkaXNhYmxlZDogc2VsZWN0ZWRDb3VudCgpID8gbnVsbCA6ICdkaXNhYmxlZCcsIG9uY2xpY2s6IGJhdGNoU2hhcmUgfSwgaWNvbignc2hhcmUnKSwgJ1NoYXJlJyksCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIGRpc2FibGVkOiBzZWxlY3RlZENvdW50KCkgPyBudWxsIDogJ2Rpc2FibGVkJywgb25jbGljazogYmF0Y2hEb3dubG9hZCB9LCBpY29uKCdkb3dubG9hZCcpLCAnRG93bmxvYWQnKSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgZGlzYWJsZWQ6IHNlbGVjdGVkQ291bnQoKSA/IG51bGwgOiAnZGlzYWJsZWQnLCBvbmNsaWNrOiBiYXRjaEFzc2lnbiB9LCBpY29uKCdmb2xkZXInKSwgJ0ZvbGRlcicpLAogICAgICAgIGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWRhbmdlciB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgZGlzYWJsZWQ6IHNlbGVjdGVkQ291bnQoKSA/IG51bGwgOiAnZGlzYWJsZWQnLCBvbmNsaWNrOiBiYXRjaERlbGV0ZSB9LCBpY29uKCd0cmFzaCcpLCAnRGVsZXRlJykKICAgICAgKTsKICAgICAgUyhiYXIsICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZsZXgtd3JhcDp3cmFwO2dhcDo5cHg7cGFkZGluZzoxMHB4IDE0cHg7Ym9yZGVyLXJhZGl1czp2YXIoLS12LXJhZGl1cy1zbSwxNXB4KTttYXJnaW4tYm90dG9tOnZhcigtLXNwYWNlLW1kLDE1cHgpJyk7CiAgICAgIGN0eC50b29sYmFyRWwuYXBwZW5kQ2hpbGQoYmFyKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciB0YWJzID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNoaXAtcm93Jywgcm9sZTogJ3RhYmxpc3QnLCAnYXJpYS1sYWJlbCc6ICdMaWJyYXJ5IHNvdXJjZScgfSk7CiAgICBmdW5jdGlvbiB0YWIobGFiZWwsIHNyYywgaWMsIG9uQ2xpY2spIHsKICAgICAgdmFyIGFjdGl2ZSA9IGN0eC5zb3VyY2UgPT09IHNyYzsKICAgICAgdmFyIGIgPSBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAndi1jaGlwJyArIChhY3RpdmUgPyAnIHYtY2hpcC0tYWN0aXZlJyA6ICcnKSwKICAgICAgICB0eXBlOiAnYnV0dG9uJywgcm9sZTogJ3RhYicsICdhcmlhLXNlbGVjdGVkJzogYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJwogICAgICB9LCBpYyA/IGljb24oaWMpIDogbnVsbCwgZWwoJ3NwYW4nLCB7IHRleHQ6IGxhYmVsIH0pKTsKICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2spOwogICAgICByZXR1cm4gYjsKICAgIH0KICAgIHRhYnMuYXBwZW5kQ2hpbGQodGFiKCdBbGwnLCAnbGlicmFyeScsICdncmlkJywgb3BlbkxpYnJhcnkpKTsKICAgIHRhYnMuYXBwZW5kQ2hpbGQodGFiKCdGYXZvcml0ZXMnLCAnZmF2b3JpdGVzJywgJ2hlYXJ0Jywgb3BlbkZhdm9yaXRlcykpOwogICAgdGFicy5hcHBlbmRDaGlsZCh0YWIoJ0ZvbGRlcnMnLCAnZm9sZGVyJywgJ2ZvbGRlcicsIG9wZW5Gb2xkZXJzTWFuYWdlcikpOwoKICAgIGlmIChjdHguc291cmNlID09PSAnZm9sZGVyJyAmJiBjdHguZm9sZGVySUQpIHsKICAgICAgdmFyIGZuYW1lID0gJyc7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3R4LmZvbGRlcnMubGVuZ3RoOyBpKyspIGlmIChjdHguZm9sZGVyc1tpXS5pZCA9PT0gY3R4LmZvbGRlcklEKSBmbmFtZSA9IGN0eC5mb2xkZXJzW2ldLm5hbWU7CiAgICAgIHZhciBwaWxsID0gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jaGlwIHYtY2hpcC0tYWN0aXZlJyB9LAogICAgICAgIGljb24oJ2ZvbGRlcicpLCBlbCgnc3BhbicsIHsgdGV4dDogZm5hbWUgfHwgJ0ZvbGRlcicgfSksCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWNoaXBfX3gnLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiAnTGVhdmUgZm9sZGVyJywgb25jbGljazogb3BlbkxpYnJhcnkgfSwgaWNvbignY2xvc2UnKSkpOwogICAgICB0YWJzLmFwcGVuZENoaWxkKHBpbGwpOwogICAgfQoKICAgIHZhciBzZWFyY2hJbnB1dCA9IGVsKCdpbnB1dCcsIHsKICAgICAgY2xhc3M6ICd2LWZpZWxkIHYtbGliLXNlYXJjaCcsIHR5cGU6ICdzZWFyY2gnLCBwbGFjZWhvbGRlcjogJ1NlYXJjaCBwcm9tcHRzLCBtb2RlbHMsIHRhZ3PigKYnLAogICAgICB2YWx1ZTogY3R4LnF1ZXJ5LCAnYXJpYS1sYWJlbCc6ICdTZWFyY2ggbGlicmFyeScKICAgIH0pOwogICAgdmFyIG9uU2VhcmNoID0gZGVib3VuY2UoZnVuY3Rpb24gKHZhbCkgewogICAgICBjdHgucXVlcnkgPSB2YWwudHJpbSgpOwogICAgICByZW5kZXJHcmlkKCk7IHJlbmRlclN0YXR1cygpOwogICAgfSwgMjAwKTsKICAgIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24gKCkgeyBvblNlYXJjaChzZWFyY2hJbnB1dC52YWx1ZSk7IH0pOwogICAgUyhzZWFyY2hJbnB1dCwgJ2ZsZXg6MSAxIGF1dG87bWluLXdpZHRoOjAnKTsKICAgIHZhciBzZWFyY2hJY29uID0gaWNvbignc2VhcmNoJyk7CiAgICBTKHNlYXJjaEljb24sICdwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjEycHg7dG9wOjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTtvcGFjaXR5Oi41NTtwb2ludGVyLWV2ZW50czpub25lO2xpbmUtaGVpZ2h0OjAnKTsKICAgIFMoc2VhcmNoSW5wdXQsICdwYWRkaW5nLWxlZnQ6MzZweCcpOwogICAgdmFyIHNlYXJjaFdyYXAgPSBlbCgnbGFiZWwnLCB7IGNsYXNzOiAndi1saWItc2VhcmNod3JhcCcgfSwgc2VhcmNoSWNvbiwgc2VhcmNoSW5wdXQpOwogICAgUyhzZWFyY2hXcmFwLCAncG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4OjEgMSAyMjBweDttaW4td2lkdGg6MTYwcHgnKTsKCiAgICB2YXIgc29ydFNlbCA9IGVsKCdzZWxlY3QnLCB7IGNsYXNzOiAndi1zZWxlY3Qgdi1saWItc29ydCcsICdhcmlhLWxhYmVsJzogJ1NvcnQgbGlicmFyeScgfSk7CiAgICBTT1JUUy5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7CiAgICAgIHZhciBvID0gZWwoJ29wdGlvbicsIHsgdmFsdWU6IHMua2V5LCB0ZXh0OiBzLmxhYmVsIH0pOwogICAgICBpZiAocy5rZXkgPT09IGN0eC5zb3J0KSBvLnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgc29ydFNlbC5hcHBlbmRDaGlsZChvKTsKICAgIH0pOwogICAgc29ydFNlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7IGN0eC5zb3J0ID0gc29ydFNlbC52YWx1ZTsgcmVuZGVyR3JpZCgpOyByZW5kZXJTdGF0dXMoKTsgfSk7CgogICAgdmFyIHNlbEJ0biA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IGVudGVyU2VsZWN0KCk7IH0gfSwgaWNvbignY2hlY2snKSwgJ1NlbGVjdCcpOwoKICAgIHZhciBjb250cm9scyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItY29udHJvbHMnIH0sIHNlYXJjaFdyYXAsIHNvcnRTZWwsIHNlbEJ0bik7CiAgICBTKGNvbnRyb2xzLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LXdyYXA6d3JhcDtnYXA6OXB4O2ZsZXg6MSAxIDMyMHB4O21pbi13aWR0aDowJyk7CiAgICBTKHRhYnMsICdmbGV4OjAgMCBhdXRvJyk7CgogICAgdmFyIHRvb2xiYXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtbGliLXRvb2xiYXInIH0sIHRhYnMsIGNvbnRyb2xzKTsKICAgIFModG9vbGJhciwgJ2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7ZmxleC13cmFwOndyYXA7Z2FwOjEycHg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47bWFyZ2luLWJvdHRvbTp2YXIoLS1zcGFjZS1tZCwxNXB4KScpOwogICAgY3R4LnRvb2xiYXJFbC5hcHBlbmRDaGlsZCh0b29sYmFyKTsKCiAgICB2YXIgcHJlc2VudCA9IGF2YWlsYWJsZVRhZ3MoKTsKICAgIHZhciBpbmR1c3RyaWVzID0gKFYuZGF0YSAmJiBBcnJheS5pc0FycmF5KFYuZGF0YS5pbmR1c3RyaWVzKSkgPyBWLmRhdGEuaW5kdXN0cmllcyA6IFtdOwogICAgdmFyIGNoaXBzID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNoaXAtcm93Jywgcm9sZTogJ2dyb3VwJywgJ2FyaWEtbGFiZWwnOiAnRmlsdGVyIGJ5IHRhZycgfSk7CiAgICB2YXIgYWxsQ2hpcCA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jaGlwJyArIChjdHguaW5kdXN0cnkgPyAnJyA6ICcgdi1jaGlwLS1hY3RpdmUnKSwgdHlwZTogJ2J1dHRvbicsIHRleHQ6ICdBbGwnLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IGN0eC5pbmR1c3RyeSA9IG51bGw7IHJlbmRlclRvb2xiYXIoKTsgcmVuZGVyR3JpZCgpOyByZW5kZXJTdGF0dXMoKTsgfSB9KTsKICAgIGNoaXBzLmFwcGVuZENoaWxkKGFsbENoaXApOwogICAgdmFyIGFkZGVkID0ge307CiAgICBpbmR1c3RyaWVzLmZvckVhY2goZnVuY3Rpb24gKGluZCkgewogICAgICBpZiAoIXByZXNlbnRbU3RyaW5nKGluZC5rZXkpLnRvTG93ZXJDYXNlKCldICYmICFwcmVzZW50W1N0cmluZyhpbmQubGFiZWwpLnRvTG93ZXJDYXNlKCldKSByZXR1cm47CiAgICAgIHZhciBrZXkgPSBwcmVzZW50W1N0cmluZyhpbmQua2V5KS50b0xvd2VyQ2FzZSgpXSA/IGluZC5rZXkgOiBpbmQubGFiZWw7CiAgICAgIGFkZGVkW1N0cmluZyhrZXkpLnRvTG93ZXJDYXNlKCldID0gdHJ1ZTsKICAgICAgdmFyIGFjdGl2ZSA9IGN0eC5pbmR1c3RyeSAmJiBjdHguaW5kdXN0cnkudG9Mb3dlckNhc2UoKSA9PT0gU3RyaW5nKGtleSkudG9Mb3dlckNhc2UoKTsKICAgICAgdmFyIGMgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY2hpcCcgKyAoYWN0aXZlID8gJyB2LWNoaXAtLWFjdGl2ZScgOiAnJyksIHR5cGU6ICdidXR0b24nLCB0ZXh0OiBpbmQubGFiZWwgfSk7CiAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7IGN0eC5pbmR1c3RyeSA9IGFjdGl2ZSA/IG51bGwgOiBrZXk7IHJlbmRlclRvb2xiYXIoKTsgcmVuZGVyR3JpZCgpOyByZW5kZXJTdGF0dXMoKTsgfSk7CiAgICAgIGNoaXBzLmFwcGVuZENoaWxkKGMpOwogICAgfSk7CiAgICBPYmplY3Qua2V5cyhwcmVzZW50KS5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHsKICAgICAgaWYgKGFkZGVkW3RhZ10pIHJldHVybjsKICAgICAgdmFyIGFjdGl2ZSA9IGN0eC5pbmR1c3RyeSAmJiBjdHguaW5kdXN0cnkudG9Mb3dlckNhc2UoKSA9PT0gdGFnOwogICAgICB2YXIgYyA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jaGlwJyArIChhY3RpdmUgPyAnIHYtY2hpcC0tYWN0aXZlJyA6ICcnKSwgdHlwZTogJ2J1dHRvbicsIHRleHQ6IHRhZyB9KTsKICAgICAgYy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgY3R4LmluZHVzdHJ5ID0gYWN0aXZlID8gbnVsbCA6IHRhZzsgcmVuZGVyVG9vbGJhcigpOyByZW5kZXJHcmlkKCk7IHJlbmRlclN0YXR1cygpOyB9KTsKICAgICAgY2hpcHMuYXBwZW5kQ2hpbGQoYyk7CiAgICB9KTsKICAgIGlmIChjaGlwcy5jaGlsZHJlbi5sZW5ndGggPiAxKSB7IFMoY2hpcHMsICdtYXJnaW4tYm90dG9tOnZhcigtLXNwYWNlLW1kLDE1cHgpJyk7IGN0eC50b29sYmFyRWwuYXBwZW5kQ2hpbGQoY2hpcHMpOyB9CiAgfQoKICBmdW5jdGlvbiBzaG93U2tlbGV0b25zKCkgewogICAgaWYgKCFjdHguZ3JpZEVsKSByZXR1cm47CiAgICBjdHguZ3JpZEVsLmlubmVySFRNTCA9ICcnOwogICAgY3R4LmdyaWRFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtYnVzeScsICd0cnVlJyk7CiAgICB2YXIgbiA9IDk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgc2s7CiAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnNrZWxldG9uID09PSAnZnVuY3Rpb24nKSBzayA9IFYudWkuc2tlbGV0b24oJ2NhcmQnKTsKICAgICAgZWxzZSBzayA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbiB2LXNrZWxldG9uLS10aWxlJyB9KTsKICAgICAgY3R4LmdyaWRFbC5hcHBlbmRDaGlsZChzayk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBidWlsZENlbGwoaW1nKSB7CiAgICB2YXIga2V5ID0gaW1nS2V5KGltZyk7CiAgICB2YXIgY2VsbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItY2VsbCcsIGRhdGFzZXQ6IHsga2V5OiBrZXkgfSB9KTsKICAgIFMoY2VsbCwgJ3Bvc2l0aW9uOnJlbGF0aXZlO2JvcmRlci1yYWRpdXM6dmFyKC0tdi1yYWRpdXMtc20sMTVweCk7b3ZlcmZsb3c6aGlkZGVuJyk7CiAgICB2YXIgb25DaGFuZ2UgPSBmdW5jdGlvbiAoKSB7IHJlbmRlckZhdkJhZGdlKGNlbGwsIGltZyk7IH07CgogICAgdmFyIGNhcmROb2RlOwogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaW1nQ2FyZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBjYXJkTm9kZSA9IFYudWkuaW1nQ2FyZChpbWcsIHsgYmVmb3JlQWZ0ZXI6IHRydWUsIG9uVGFwOiBmdW5jdGlvbiAoKSB7IGlmIChjdHguc2VsZWN0TW9kZSkgdG9nZ2xlU2VsZWN0KGltZyk7IGVsc2Ugb3BlbkltYWdlKGltZyk7IH0gfSk7CiAgICB9IGVsc2UgewogICAgICBjYXJkTm9kZSA9IGJ1aWxkRmFsbGJhY2tDYXJkKGltZyk7CiAgICB9CiAgICBjZWxsLmFwcGVuZENoaWxkKGNhcmROb2RlKTsKCiAgICBpZiAoaXNWaWRlbyhpbWcpKSB7CiAgICAgIHZhciB2YmFkZ2UgPSBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWxpYi12aWRlb2JhZGdlJywgJ2FyaWEtbGFiZWwnOiAnVmlkZW8nIH0sIGljb24oJ2ZpbG0nKSk7CiAgICAgIGNlbGwuYXBwZW5kQ2hpbGQodmJhZGdlKTsKICAgIH0KCiAgICB2YXIgQlROID0gJ2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6MzBweDtoZWlnaHQ6MzBweDtib3JkZXItcmFkaXVzOjUwJTtib3JkZXI6MXB4IHNvbGlkICcgKyBMSU5FICsgJztjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyO2JhY2tkcm9wLWZpbHRlcjpibHVyKDhweCk7LXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6Ymx1cig4cHgpO3RyYW5zaXRpb246dHJhbnNmb3JtIC4xMnMgZWFzZSxiYWNrZ3JvdW5kIC4xMnMgZWFzZTtsaW5lLWhlaWdodDowJzsKCiAgICB2YXIgY2hlY2sgPSBlbCgnYnV0dG9uJywgewogICAgICBjbGFzczogJ3YtbGliLWNoZWNrJyArIChjdHguc2VsZWN0ZWRba2V5XSA/ICcgaXMtb24nIDogJycpLCB0eXBlOiAnYnV0dG9uJywgcm9sZTogJ2NoZWNrYm94JywKICAgICAgJ2FyaWEtY2hlY2tlZCc6IGN0eC5zZWxlY3RlZFtrZXldID8gJ3RydWUnIDogJ2ZhbHNlJywgJ2FyaWEtbGFiZWwnOiAnU2VsZWN0IGNyZWF0aW9uJywKICAgICAgdGFiaW5kZXg6IGN0eC5zZWxlY3RNb2RlID8gJzAnIDogJy0xJwogICAgfSk7CiAgICBTKGNoZWNrLCAncG9zaXRpb246YWJzb2x1dGU7dG9wOjhweDtsZWZ0OjhweDt6LWluZGV4OjM7JyArIEJUTiArICc7YmFja2dyb3VuZDonICsgKGN0eC5zZWxlY3RlZFtrZXldID8gR1JBRElFTlQgOiBCQURHRV9CRykgKyAoY3R4LnNlbGVjdE1vZGUgPyAnJyA6ICc7b3BhY2l0eTowO3BvaW50ZXItZXZlbnRzOm5vbmUnKSk7CiAgICBpZiAoY3R4LnNlbGVjdGVkW2tleV0pIGNoZWNrLmFwcGVuZENoaWxkKGljb24oJ2NoZWNrJykpOwogICAgY2hlY2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBlLnByZXZlbnREZWZhdWx0KCk7IHRvZ2dsZVNlbGVjdChpbWcpOyB9KTsKICAgIGNlbGwuYXBwZW5kQ2hpbGQoY2hlY2spOwoKICAgIHZhciBmYXYgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtbGliLWZhdicgKyAoaW1nLmZhdm9yaXRlZCA/ICcgaXMtb24nIDogJycpLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiBpbWcuZmF2b3JpdGVkID8gJ1VuZmF2b3JpdGUnIDogJ0Zhdm9yaXRlJywgJ2FyaWEtcHJlc3NlZCc6IGltZy5mYXZvcml0ZWQgPyAndHJ1ZScgOiAnZmFsc2UnIH0pOwogICAgUyhmYXYsICdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6OHB4O3JpZ2h0OjQ0cHg7ei1pbmRleDozOycgKyBCVE4gKyAnO2JhY2tncm91bmQ6JyArIChpbWcuZmF2b3JpdGVkID8gR1JBRElFTlQgOiBCQURHRV9CRykpOwogICAgZmF2LmFwcGVuZENoaWxkKGljb24oaW1nLmZhdm9yaXRlZCA/ICdoZWFydEZpbGwnIDogJ2hlYXJ0JykpOwogICAgZmF2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgZS5wcmV2ZW50RGVmYXVsdCgpOyB0b2dnbGVGYXZvcml0ZShpbWcsIG9uQ2hhbmdlKTsgfSk7CiAgICBjZWxsLmFwcGVuZENoaWxkKGZhdik7CgogICAgdmFyIG1vcmUgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtbGliLW1vcmUnLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiAnTW9yZSBhY3Rpb25zJyB9KTsKICAgIFMobW9yZSwgJ3Bvc2l0aW9uOmFic29sdXRlO3RvcDo4cHg7cmlnaHQ6OHB4O3otaW5kZXg6MzsnICsgQlROICsgJztiYWNrZ3JvdW5kOicgKyBCQURHRV9CRyk7CiAgICBtb3JlLmFwcGVuZENoaWxkKGljb24oJ21vcmUnKSk7CiAgICBtb3JlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsKICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB2YXIgciA9IG1vcmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIG9wZW5Db250ZXh0TWVudShpbWcsIHIucmlnaHQsIHIuYm90dG9tICsgNCwgb25DaGFuZ2UpOwogICAgfSk7CiAgICBjZWxsLmFwcGVuZENoaWxkKG1vcmUpOwoKICAgIGlmIChjdHguc2VsZWN0ZWRba2V5XSkgY2VsbC5jbGFzc0xpc3QuYWRkKCdpcy1zZWxlY3RlZCcpOwoKICAgIGNlbGwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgnLnYtbGliLWNoZWNrLCAudi1saWItZmF2LCAudi1saWItbW9yZScpKSByZXR1cm47CiAgICAgIGlmIChjdHguc2VsZWN0TW9kZSkgeyB0b2dnbGVTZWxlY3QoaW1nKTsgcmV0dXJuOyB9CiAgICAgIGlmICghKFYudWkgJiYgdHlwZW9mIFYudWkuaW1nQ2FyZCA9PT0gJ2Z1bmN0aW9uJykpIG9wZW5JbWFnZShpbWcpOwogICAgfSk7CgogICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgb3BlbkNvbnRleHRNZW51KGltZywgZS5jbGllbnRYLCBlLmNsaWVudFksIG9uQ2hhbmdlKTsKICAgIH0pOwoKICAgIHZhciBscFRpbWVyID0gbnVsbCwgbW92ZWQgPSBmYWxzZSwgc3RhcnRYID0gMCwgc3RhcnRZID0gMDsKICAgIGNlbGwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgIG1vdmVkID0gZmFsc2U7CiAgICAgIGlmIChlLnRvdWNoZXMgJiYgZS50b3VjaGVzWzBdKSB7IHN0YXJ0WCA9IGUudG91Y2hlc1swXS5jbGllbnRYOyBzdGFydFkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WTsgfQogICAgICBscFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFtb3ZlZCkgewogICAgICAgICAgaWYgKCFjdHguc2VsZWN0TW9kZSkgZW50ZXJTZWxlY3QoaW1nKTsKICAgICAgICAgIGVsc2UgdG9nZ2xlU2VsZWN0KGltZyk7CiAgICAgICAgICBpZiAobmF2aWdhdG9yLnZpYnJhdGUpIHRyeSB7IG5hdmlnYXRvci52aWJyYXRlKDEyKTsgfSBjYXRjaCAoZXIpIHt9CiAgICAgICAgfQogICAgICB9LCA0NTApOwogICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlc1swXSkgewogICAgICAgIGlmIChNYXRoLmFicyhlLnRvdWNoZXNbMF0uY2xpZW50WCAtIHN0YXJ0WCkgPiAxMCB8fCBNYXRoLmFicyhlLnRvdWNoZXNbMF0uY2xpZW50WSAtIHN0YXJ0WSkgPiAxMCkgbW92ZWQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChtb3ZlZCkgY2xlYXJUaW1lb3V0KGxwVGltZXIpOwogICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGZ1bmN0aW9uICgpIHsgY2xlYXJUaW1lb3V0KGxwVGltZXIpOyB9LCB7IHBhc3NpdmU6IHRydWUgfSk7CiAgICBjZWxsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgZnVuY3Rpb24gKCkgeyBjbGVhclRpbWVvdXQobHBUaW1lcik7IH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKCiAgICByZXR1cm4gY2VsbDsKICB9CgogIGZ1bmN0aW9uIHJlbmRlckZhdkJhZGdlKGNlbGwsIGltZykgewogICAgaWYgKCFjZWxsKSByZXR1cm47CiAgICB2YXIgZmF2ID0gY2VsbC5xdWVyeVNlbGVjdG9yKCcudi1saWItZmF2Jyk7CiAgICBpZiAoIWZhdikgcmV0dXJuOwogICAgZmF2LmNsYXNzTGlzdC50b2dnbGUoJ2lzLW9uJywgISFpbWcuZmF2b3JpdGVkKTsKICAgIGZhdi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIGltZy5mYXZvcml0ZWQgPyAndHJ1ZScgOiAnZmFsc2UnKTsKICAgIGZhdi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBpbWcuZmF2b3JpdGVkID8gJ1VuZmF2b3JpdGUnIDogJ0Zhdm9yaXRlJyk7CiAgICBmYXYuc3R5bGUuYmFja2dyb3VuZCA9IGltZy5mYXZvcml0ZWQgPyBHUkFESUVOVCA6IEJBREdFX0JHOwogICAgZmF2LmlubmVySFRNTCA9ICcnOwogICAgZmF2LmFwcGVuZENoaWxkKGljb24oaW1nLmZhdm9yaXRlZCA/ICdoZWFydEZpbGwnIDogJ2hlYXJ0JykpOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRGYWxsYmFja0NhcmQoaW1nKSB7CiAgICB2YXIgYWZ0ZXIgPSBpbWcucmVtb3RlSW1hZ2VVUkwgfHwgaW1nLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwgfHwgJyc7CiAgICB2YXIgYmVmb3JlID0gaW1nLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkw7CiAgICB2YXIgY2FyZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jYXJkIHYtY2FyZC0tcGFkLTAgdi1jYXJkLS10YXBwYWJsZSB2Y2FyZCcgfSk7CiAgICBTKGNhcmQsICdwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2Rpc3BsYXk6YmxvY2s7Ym9yZGVyLXJhZGl1czp2YXIoLS12LXJhZGl1cy1zbSwxNXB4KTtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZDp2YXIoLS12LWNhcmQtYmcsIHJnYmEoMjU1LDI1NSwyNTUsLjA0KSknKTsKICAgIHZhciBhZnRlckltZyA9IGVsKCdpbWcnLCB7IGNsYXNzOiAndmFmdGVyJywgc3JjOiBhZnRlciwgYWx0OiBlc2NhcGVIdG1sKGltZy5wcm9tcHQgfHwgJ0NyZWF0aW9uJyksIGxvYWRpbmc6ICdsYXp5JyB9KTsKICAgIFMoYWZ0ZXJJbWcsICdkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OmF1dG8nKTsKICAgIGFmdGVySW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyBjYXJkLmNsYXNzTGlzdC5hZGQoJ2lzLWJyb2tlbicpOyB9KTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoYWZ0ZXJJbWcpOwogICAgaWYgKGJlZm9yZSAmJiBiZWZvcmUgIT09IGFmdGVyKSB7CiAgICAgIHZhciBiZWZvcmVJbWcgPSBlbCgnaW1nJywgeyBjbGFzczogJ3ZiZWZvcmUnLCBzcmM6IGJlZm9yZSwgYWx0OiAnJywgbG9hZGluZzogJ2xhenknIH0pOwogICAgICBTKGJlZm9yZUltZywgJ3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvdmVyO3RyYW5zaXRpb246b3BhY2l0eSAuNnMgZWFzZScpOwogICAgICBjYXJkLmFwcGVuZENoaWxkKGJlZm9yZUltZyk7CiAgICAgIHZhciBvbiA9IGZhbHNlOwogICAgICB2YXIgaXYgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFjYXJkLmlzQ29ubmVjdGVkKSB7IGNsZWFySW50ZXJ2YWwoaXYpOyByZXR1cm47IH0KICAgICAgICBvbiA9ICFvbjsKICAgICAgICBiZWZvcmVJbWcuc3R5bGUub3BhY2l0eSA9IG9uID8gJzAnIDogJzEnOwogICAgICB9LCAyNjAwKTsKICAgIH0KICAgIHJldHVybiBjYXJkOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyR3JpZCgpIHsKICAgIGlmICghY3R4LmdyaWRFbCkgcmV0dXJuOwogICAgY3R4LmdyaWRFbC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtYnVzeScpOwoKICAgIGlmIChjdHgubG9hZGluZyAmJiAhY3R4Lml0ZW1zLmxlbmd0aCkgeyBzaG93U2tlbGV0b25zKCk7IHJldHVybjsgfQoKICAgIHZhciBsaXN0ID0gdmlzaWJsZUl0ZW1zKCk7CiAgICBjdHguZ3JpZEVsLmlubmVySFRNTCA9ICcnOwoKICAgIGlmICghbGlzdC5sZW5ndGgpIHsKICAgICAgaWYgKGN0eC5sb2FkaW5nKSB7IHNob3dTa2VsZXRvbnMoKTsgcmV0dXJuOyB9CiAgICAgIGlmIChjdHguZXJyb3JlZCkgeyByZW1vdmVTZW50aW5lbCgpOyByZXR1cm47IH0KICAgICAgdmFyIGZpbHRlcmVkID0gY3R4LnF1ZXJ5IHx8IGN0eC5pbmR1c3RyeTsKICAgICAgaWYgKCFmaWx0ZXJlZCAmJiAhY3R4LmZldGNoZWQpIHsgc2hvd1NrZWxldG9ucygpOyByZXR1cm47IH0KICAgICAgcmVtb3ZlU2VudGluZWwoKTsKICAgICAgY3R4LmdyaWRFbC5hcHBlbmRDaGlsZChlbXB0eVN0YXRlKCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgdHJ5IHsgZnJhZy5hcHBlbmRDaGlsZChidWlsZENlbGwobGlzdFtpXSkpOyB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIGNvbnNvbGUuZXJyb3IoJ1tsaWJyYXJ5XSBjZWxsIHJlbmRlciBmYWlsZWQnLCBlKTsKICAgICAgfQogICAgfQogICAgY3R4LmdyaWRFbC5hcHBlbmRDaGlsZChmcmFnKTsKICAgIGN0eC5ncmlkRWwuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtc2VsZWN0aW5nJywgY3R4LnNlbGVjdE1vZGUpOwogICAgYXR0YWNoU2VudGluZWwoKTsKICB9CgogIGZ1bmN0aW9uIGhhc01vcmVUb0xvYWQoKSB7CiAgICBpZiAoY3R4LmRvbmUgfHwgY3R4LmxvYWRpbmcpIHJldHVybiBmYWxzZTsKICAgIGlmIChjdHguc291cmNlID09PSAnZmF2b3JpdGVzJykgcmV0dXJuIGZhbHNlOwogICAgaWYgKGN0eC50b3RhbCAhPSBudWxsICYmIGN0eC50b3RhbCA+IDAgJiYgY3R4Lml0ZW1zLmxlbmd0aCA8IGN0eC50b3RhbCkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBlbXB0eVN0YXRlKCkgewogICAgdmFyIGhhc0VtcHR5ID0gVi51aSAmJiB0eXBlb2YgVi51aS5lbXB0eSA9PT0gJ2Z1bmN0aW9uJzsKICAgIHZhciBpc0ZpbHRlcmVkID0gY3R4LnF1ZXJ5IHx8IGN0eC5pbmR1c3RyeTsKCiAgICBpZiAoaXNGaWx0ZXJlZCkgewogICAgICB2YXIgY2xlYXIgPSBmdW5jdGlvbiAoKSB7IGN0eC5xdWVyeSA9ICcnOyBjdHguaW5kdXN0cnkgPSBudWxsOyByZW5kZXJUb29sYmFyKCk7IHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7IH07CiAgICAgIGlmIChoYXNFbXB0eSkgcmV0dXJuIFYudWkuZW1wdHkoeyB0aXRsZTogJ05vIG1hdGNoZXMnLCBtZXNzYWdlOiAnTm90aGluZyBtYXRjaGVzIHlvdXIgc2VhcmNoIG9yIGZpbHRlcnMuJywgaWNvbjogJ3NlYXJjaCcgfSwgJ0NsZWFyIGZpbHRlcnMnLCBjbGVhcik7CiAgICAgIHJldHVybiBmYWxsYmFja0VtcHR5KCdObyBtYXRjaGVzJywgJ05vdGhpbmcgbWF0Y2hlcyB5b3VyIHNlYXJjaCBvciBmaWx0ZXJzLicsICdDbGVhciBmaWx0ZXJzJywgY2xlYXIpOwogICAgfQogICAgaWYgKGN0eC5zb3VyY2UgPT09ICdmYXZvcml0ZXMnKSB7CiAgICAgIGlmIChoYXNFbXB0eSkgcmV0dXJuIFYudWkuZW1wdHkoeyB0aXRsZTogJ05vIGZhdm9yaXRlcyB5ZXQnLCBtZXNzYWdlOiAnVGFwIHRoZSBoZWFydCBvbiBhbnkgY3JlYXRpb24gdG8gc2F2ZSBpdCBoZXJlLicsIGljb246ICdoZWFydCcgfSwgJ0Jyb3dzZSBMaWJyYXJ5Jywgb3BlbkxpYnJhcnkpOwogICAgICByZXR1cm4gZmFsbGJhY2tFbXB0eSgnTm8gZmF2b3JpdGVzIHlldCcsICdUYXAgdGhlIGhlYXJ0IG9uIGFueSBjcmVhdGlvbiB0byBzYXZlIGl0IGhlcmUuJywgJ0Jyb3dzZSBMaWJyYXJ5Jywgb3BlbkxpYnJhcnkpOwogICAgfQogICAgaWYgKGN0eC5zb3VyY2UgPT09ICdmb2xkZXInKSB7CiAgICAgIGlmIChoYXNFbXB0eSkgcmV0dXJuIFYudWkuZW1wdHkoeyB0aXRsZTogJ1RoaXMgZm9sZGVyIGlzIGVtcHR5JywgbWVzc2FnZTogJ0FkZCBjcmVhdGlvbnMgZnJvbSBhbnkgaW1hZ2XigJlzIG1lbnUuJywgaWNvbjogJ2ZvbGRlcicgfSwgJ0JhY2sgdG8gTGlicmFyeScsIG9wZW5MaWJyYXJ5KTsKICAgICAgcmV0dXJuIGZhbGxiYWNrRW1wdHkoJ1RoaXMgZm9sZGVyIGlzIGVtcHR5JywgJ0FkZCBjcmVhdGlvbnMgZnJvbSBhbnkgaW1hZ2XigJlzIG1lbnUuJywgJ0JhY2sgdG8gTGlicmFyeScsIG9wZW5MaWJyYXJ5KTsKICAgIH0KICAgIHZhciBjcmVhdGUgPSBmdW5jdGlvbiAoKSB7IGdvKCcjL2NyZWF0ZScpOyB9OwogICAgaWYgKGhhc0VtcHR5KSByZXR1cm4gVi51aS5lbXB0eSh7IHRpdGxlOiAnTm8gY3JlYXRpb25zIHlldCcsIG1lc3NhZ2U6ICdHZW5lcmF0ZSB5b3VyIGZpcnN0IGltYWdlIHRvIHN0YXJ0IHlvdXIgbGlicmFyeS4nLCBpY29uOiAnaW1hZ2UnIH0sICdDcmVhdGUnLCBjcmVhdGUpOwogICAgcmV0dXJuIGZhbGxiYWNrRW1wdHkoJ05vIGNyZWF0aW9ucyB5ZXQnLCAnR2VuZXJhdGUgeW91ciBmaXJzdCBpbWFnZSB0byBzdGFydCB5b3VyIGxpYnJhcnkuJywgJ0NyZWF0ZScsIGNyZWF0ZSk7CiAgfQoKICBmdW5jdGlvbiBmYWxsYmFja0VtcHR5KHRpdGxlLCBzdWIsIGFjdGlvbkxhYmVsLCBvbkFjdGlvbikgewogICAgdmFyIG5vZGUgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHknLCByb2xlOiAnbm90ZScgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oJ2ltYWdlJykpLAogICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScsIHRleHQ6IHRpdGxlIH0pLAogICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19zdWInLCB0ZXh0OiBzdWIgfSkpOwogICAgaWYgKGFjdGlvbkxhYmVsICYmIHR5cGVvZiBvbkFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBub2RlLmFwcGVuZENoaWxkKGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnkgdi1lbXB0eV9fYWN0aW9uJywgdHlwZTogJ2J1dHRvbicsIHRleHQ6IGFjdGlvbkxhYmVsLCBvbmNsaWNrOiBvbkFjdGlvbiB9KSk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZVNlbnRpbmVsKCkgewogICAgaWYgKGN0eC5vYnNlcnZlcikgeyB0cnkgeyBjdHgub2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyB9IGNhdGNoIChlKSB7fSBjdHgub2JzZXJ2ZXIgPSBudWxsOyB9CiAgICBpZiAoY3R4LnNlbnRpbmVsICYmIGN0eC5zZW50aW5lbC5wYXJlbnROb2RlKSBjdHguc2VudGluZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjdHguc2VudGluZWwpOwogICAgY3R4LnNlbnRpbmVsID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIGF0dGFjaFNlbnRpbmVsKCkgewogICAgaWYgKCFjdHguZ3JpZEVsKSByZXR1cm47CiAgICByZW1vdmVTZW50aW5lbCgpOwogICAgaWYgKGN0eC5kb25lIHx8IGN0eC5zb3VyY2UgPT09ICdmYXZvcml0ZXMnIHx8IGN0eC5xdWVyeSkgcmV0dXJuOwogICAgY3R4LnNlbnRpbmVsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi1zZW50aW5lbCcsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKICAgIFMoY3R4LnNlbnRpbmVsLCAnd2lkdGg6MTAwJTtoZWlnaHQ6MXB4Jyk7CiAgICBpZiAoY3R4LmdyaWRFbC5wYXJlbnROb2RlKSBjdHguZ3JpZEVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGN0eC5zZW50aW5lbCwgY3R4LmdyaWRFbC5uZXh0U2libGluZyk7CiAgICBvYnNlcnZlU2VudGluZWwoKTsKICB9CgogIGZ1bmN0aW9uIG9ic2VydmVTZW50aW5lbCgpIHsKICAgIGlmICghKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicgaW4gd2luZG93KSB8fCAhY3R4LnNlbnRpbmVsKSByZXR1cm47CiAgICBjdHgub2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGVudHJpZXNbaV0uaXNJbnRlcnNlY3RpbmcpIGxvYWROZXh0KGZhbHNlKTsKICAgICAgfQogICAgfSwgeyByb290TWFyZ2luOiAnNjAwcHggMHB4JyB9KTsKICAgIGN0eC5vYnNlcnZlci5vYnNlcnZlKGN0eC5zZW50aW5lbCk7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJTdGF0dXMoZXJyKSB7CiAgICBpZiAoIWN0eC5zdGF0dXNFbCkgcmV0dXJuOwogICAgY3R4LnN0YXR1c0VsLmlubmVySFRNTCA9ICcnOwoKICAgIGlmIChjdHguZXJyb3JlZCB8fCBlcnIpIHsKICAgICAgY3R4LnN0YXR1c0VsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eSB2LWxpYi1zdGF0dXNib3gnLCByb2xlOiAnYWxlcnQnIH0sCiAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fdGl0bGUnLCB0ZXh0OiAnQ291bGQgbm90IGxvYWQgeW91ciBsaWJyYXJ5LicgfSksCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgdGV4dDogJ1JldHJ5Jywgb25jbGljazogZnVuY3Rpb24gKCkgeyBsb2FkTmV4dCh0cnVlKTsgfSB9KSkpOwogICAgfSBlbHNlIGlmIChjdHgubG9hZGluZyAmJiBjdHguaXRlbXMubGVuZ3RoKSB7CiAgICAgIGN0eC5zdGF0dXNFbC5hcHBlbmRDaGlsZChTKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItbG9hZG1vcmUnIH0sIHNwaW5uZXJOb2RlKCksIGVsKCdzcGFuJywgeyB0ZXh0OiAnTG9hZGluZyBtb3Jl4oCmJyB9KSksICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Z2FwOjEwcHg7cGFkZGluZzoyNHB4IDA7Y29sb3I6dmFyKC0tdi1pbmstc29mdCwgcmdiYSgyNDUsMjQ1LDI0NywuNjYpKTtmb250LXNpemU6MTRweCcpKTsKICAgIH0gZWxzZSBpZiAoY3R4LmRvbmUgJiYgY3R4Lml0ZW1zLmxlbmd0aCkgewogICAgICB2YXIgbiA9IGN0eC50b3RhbCAhPSBudWxsID8gY3R4LnRvdGFsIDogY3R4Lml0ZW1zLmxlbmd0aDsKICAgICAgY3R4LnN0YXR1c0VsLmFwcGVuZENoaWxkKFMoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi1lbmQnLCB0ZXh0OiBuICsgJyBjcmVhdGlvbicgKyAobiA9PT0gMSA/ICcnIDogJ3MnKSB9KSwgJ3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MjRweCAwIDhweDtjb2xvcjp2YXIoLS12LWluay1zb2Z0LCByZ2JhKDI0NSwyNDUsMjQ3LC41KSk7Zm9udC1zaXplOjEzcHg7bGV0dGVyLXNwYWNpbmc6LjAyZW0nKSk7CiAgICB9CgogICAgaWYgKGN0eC5jb3VudEVsKSB7CiAgICAgIHZhciB0b3RhbExvYWRlZCA9IGN0eC5pdGVtcy5sZW5ndGg7CiAgICAgIHZhciBsYWJlbDsKICAgICAgaWYgKGN0eC5xdWVyeSB8fCBjdHguaW5kdXN0cnkpIGxhYmVsID0gdmlzaWJsZUl0ZW1zKCkubGVuZ3RoICsgJyBvZiAnICsgdG90YWxMb2FkZWQ7CiAgICAgIGVsc2UgaWYgKGN0eC50b3RhbCAhPSBudWxsKSBsYWJlbCA9IChjdHguZG9uZSA/IGN0eC50b3RhbCA6IHRvdGFsTG9hZGVkICsgJysnKSArICcnOwogICAgICBlbHNlIGxhYmVsID0gdG90YWxMb2FkZWQgKyAoY3R4LmRvbmUgPyAnJyA6ICcrJyk7CiAgICAgIGN0eC5jb3VudEVsLnRleHRDb250ZW50ID0gdG90YWxMb2FkZWQgfHwgKGN0eC5xdWVyeSB8fCBjdHguaW5kdXN0cnkpID8gbGFiZWwgOiAnJzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNwaW5uZXJOb2RlKCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuc3Bpbm5lciA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudWkuc3Bpbm5lcigpOwogICAgcmV0dXJuIGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3Bpbm5lcicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKICB9CgogIGZ1bmN0aW9uIG9wZW5MaWJyYXJ5KCkgewogICAgY3R4LnNvdXJjZSA9ICdsaWJyYXJ5JzsKICAgIGN0eC5mb2xkZXJJRCA9IG51bGw7CiAgICBjdHgucXVlcnkgPSAnJzsgY3R4LmluZHVzdHJ5ID0gbnVsbDsKICAgIGNsb3NlTWVudSgpOwogICAgaWYgKGN0eC5zZWxlY3RNb2RlKSBleGl0U2VsZWN0KCk7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICBsb2FkTmV4dCh0cnVlKTsKICB9CiAgZnVuY3Rpb24gb3BlbkZhdm9yaXRlcygpIHsKICAgIGN0eC5zb3VyY2UgPSAnZmF2b3JpdGVzJzsKICAgIGN0eC5mb2xkZXJJRCA9IG51bGw7CiAgICBjdHgucXVlcnkgPSAnJzsgY3R4LmluZHVzdHJ5ID0gbnVsbDsKICAgIGNsb3NlTWVudSgpOwogICAgaWYgKGN0eC5zZWxlY3RNb2RlKSBleGl0U2VsZWN0KCk7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICBsb2FkTmV4dCh0cnVlKTsKICB9CiAgZnVuY3Rpb24gb3BlbkZvbGRlcihpZCkgewogICAgY3R4LnNvdXJjZSA9ICdmb2xkZXInOwogICAgY3R4LmZvbGRlcklEID0gaWQ7CiAgICBjdHgucXVlcnkgPSAnJzsgY3R4LmluZHVzdHJ5ID0gbnVsbDsKICAgIGNsb3NlTWVudSgpOwogICAgaWYgKGN0eC5zZWxlY3RNb2RlKSBleGl0U2VsZWN0KCk7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICBsb2FkTmV4dCh0cnVlKTsKICB9CgogIGZ1bmN0aW9uIG9uS2V5KGUpIHsKICAgIGlmICghY3R4IHx8ICFjdHgucm9vdCB8fCAhY3R4LnJvb3QuaXNDb25uZWN0ZWQpIHJldHVybjsKICAgIHZhciB0YWcgPSAoZS50YXJnZXQgJiYgZS50YXJnZXQudGFnTmFtZSkgfHwgJyc7CiAgICB2YXIgdHlwaW5nID0gdGFnID09PSAnSU5QVVQnIHx8IHRhZyA9PT0gJ1RFWFRBUkVBJyB8fCB0YWcgPT09ICdTRUxFQ1QnIHx8IChlLnRhcmdldCAmJiBlLnRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSk7CiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7CiAgICAgIGlmIChjdHgubWVudUVsKSB7IGNsb3NlTWVudSgpOyByZXR1cm47IH0KICAgICAgaWYgKGN0eC5zZWxlY3RNb2RlKSB7IGV4aXRTZWxlY3QoKTsgcmV0dXJuOyB9CiAgICB9CiAgICBpZiAodHlwaW5nKSByZXR1cm47CiAgICBpZiAoY3R4LnNlbGVjdE1vZGUgJiYgKGUua2V5ID09PSAnYScgfHwgZS5rZXkgPT09ICdBJykgJiYgKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgc2VsZWN0QWxsVmlzaWJsZSgpOyByZXR1cm47CiAgICB9CiAgICBpZiAoY3R4LnNlbGVjdE1vZGUgJiYgKGUua2V5ID09PSAnRGVsZXRlJyB8fCBlLmtleSA9PT0gJ0JhY2tzcGFjZScpKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgYmF0Y2hEZWxldGUoKTsgcmV0dXJuOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVuZGVyKHJvb3QsIHBhcmFtcykgewogICAgdGVhcmRvd24oKTsKICAgIGN0eCA9IGZyZXNoQ3R4KCk7CiAgICBjdHgucm9vdCA9IHJvb3Q7CgogICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgndi12aWV3LWxpYnJhcnknKTsKCiAgICBjdHguc2Nyb2xsVGFyZ2V0ID0gZmluZFNjcm9sbFBhcmVudChyb290KSB8fCB3aW5kb3c7CgogICAgdmFyIHRpdGxlID0gZWwoJ2gxJywgeyBjbGFzczogJ3YtbGliLXRpdGxlJyB9LCBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWdyYWRpZW50JywgdGV4dDogJ0xpYnJhcnknIH0pLCBjdHguY291bnRFbCA9IGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbGliLWNvdW50JyB9KSk7CiAgICBTKHRpdGxlLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmJhc2VsaW5lO2dhcDoxMHB4O21hcmdpbjowO2ZvbnQtc2l6ZTpjbGFtcCgyOHB4LDV2dyw0MHB4KTtsZXR0ZXItc3BhY2luZzotMC4wMmVtJyk7CiAgICBTKGN0eC5jb3VudEVsLCAnZm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NTAwO2NvbG9yOnZhcigtLXYtaW5rLXNvZnQsIHJnYmEoMjQ1LDI0NSwyNDcsLjU1KSknKTsKICAgIHZhciBoZWFkZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtbGliLWhlYWRlcicgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi10aXRsZXdyYXAnIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1leWVicm93JywgdGV4dDogJ1lvdXIgV29yaycgfSksCiAgICAgICAgdGl0bGUKICAgICAgKSwKICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgb25jbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9jcmVhdGUnKTsgfSB9LCBpY29uKCdwbHVzJyksICdDcmVhdGUnKQogICAgKTsKICAgIFMoaGVhZGVyLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtZW5kO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2dhcDoxNnB4O2ZsZXgtd3JhcDp3cmFwO21hcmdpbi1ib3R0b206dmFyKC0tc3BhY2UtbGcsMjRweCknKTsKCiAgICBjdHgudG9vbGJhckVsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi10b29sYmFyLXdyYXAnIH0pOwogICAgY3R4LmdyaWRFbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tYXNvbnJ5IHYtbGliLWdyaWQnIH0pOwogICAgY3R4LnN0YXR1c0VsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi1zdGF0dXMnLCAnYXJpYS1saXZlJzogJ3BvbGl0ZScgfSk7CgogICAgcm9vdC5hcHBlbmRDaGlsZChoZWFkZXIpOwogICAgcm9vdC5hcHBlbmRDaGlsZChjdHgudG9vbGJhckVsKTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQoY3R4LmdyaWRFbCk7CiAgICByb290LmFwcGVuZENoaWxkKGN0eC5zdGF0dXNFbCk7CgogICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgaWYgKHBhcmFtcy5mYXYgPT09ICcxJyB8fCBwYXJhbXMuZmF2ID09PSAndHJ1ZScpIGN0eC5zb3VyY2UgPSAnZmF2b3JpdGVzJzsKICAgIGlmIChwYXJhbXMuZm9sZGVyKSB7IGN0eC5zb3VyY2UgPSAnZm9sZGVyJzsgY3R4LmZvbGRlcklEID0gcGFyYW1zLmZvbGRlcjsgfQogICAgaWYgKHBhcmFtcy5zb3J0KSBjdHguc29ydCA9IHBhcmFtcy5zb3J0OwogICAgaWYgKHBhcmFtcy5xKSBjdHgucXVlcnkgPSBwYXJhbXMucTsKCiAgICByZW5kZXJUb29sYmFyKCk7CgogICAgbG9hZEZvbGRlcnMoKS50aGVuKGZ1bmN0aW9uICgpIHsgaWYgKGN0eCAmJiBjdHguc291cmNlID09PSAnZm9sZGVyJykgcmVuZGVyVG9vbGJhcigpOyB9KTsKCiAgICB2YXIgc2VlZGVkID0gZmFsc2U7CiAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2xpYnJhcnknICYmIFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuZ2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGNhY2hlZCA9IFYuc3RvcmUuZ2V0KCdsaWJyYXJ5Jyk7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2FjaGVkKSAmJiBjYWNoZWQubGVuZ3RoKSB7CiAgICAgICAgICBjdHguaXRlbXMgPSBjYWNoZWQuc2xpY2UoKTsKICAgICAgICAgIHNlZWRlZCA9IHRydWU7CiAgICAgICAgICByZW5kZXJHcmlkKCk7CiAgICAgICAgICByZW5kZXJTdGF0dXMoKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9CgogICAgbG9hZE5leHQodHJ1ZSkudGhlbihmdW5jdGlvbiAoKSB7IHJlc3RvcmVTY3JvbGwoKTsgfSk7CiAgICBpZiAoc2VlZGVkKSByZXN0b3JlU2Nyb2xsKCk7CgogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5LCBmYWxzZSk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZW5zdXJlRmlsbCwgZmFsc2UpOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uV2luZG93U2Nyb2xsLCB0cnVlKTsKCiAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBjdHguX3Vuc3ViID0gVi5zdG9yZS5vbignbGlicmFyeTpjaGFuZ2VkJywgZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChjdHggJiYgIWN0eC5fc2VsZldyaXRlICYmICFjdHgubG9hZGluZyAmJiBjdHgucm9vdCAmJiBjdHgucm9vdC5pc0Nvbm5lY3RlZCkgbG9hZE5leHQodHJ1ZSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gb25XaW5kb3dTY3JvbGwoKSB7CiAgICBpZiAoIWN0eCB8fCBjdHgubG9hZGluZyB8fCBjdHguZG9uZSB8fCAhY3R4LmdyaWRFbCkgcmV0dXJuOwogICAgaWYgKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicgaW4gd2luZG93KSByZXR1cm47CiAgICBpZiAoY3R4LnF1ZXJ5IHx8IGN0eC5zb3VyY2UgPT09ICdmYXZvcml0ZXMnKSByZXR1cm47CiAgICB2YXIgZG9jSCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgfHwgd2luZG93LmlubmVySGVpZ2h0OwogICAgaWYgKGN0eC5ncmlkRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIDwgZG9jSCArIDYwMCkgbG9hZE5leHQoZmFsc2UpOwogIH0KCiAgZnVuY3Rpb24gZmluZFNjcm9sbFBhcmVudChub2RlKSB7CiAgICB2YXIgcCA9IG5vZGUgJiYgbm9kZS5wYXJlbnRFbGVtZW50OwogICAgd2hpbGUgKHAgJiYgcCAhPT0gZG9jdW1lbnQuYm9keSkgewogICAgICB2YXIgb3kgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwKS5vdmVyZmxvd1k7CiAgICAgIGlmICgob3kgPT09ICdhdXRvJyB8fCBveSA9PT0gJ3Njcm9sbCcpICYmIHAuc2Nyb2xsSGVpZ2h0ID4gcC5jbGllbnRIZWlnaHQpIHJldHVybiBwOwogICAgICBwID0gcC5wYXJlbnRFbGVtZW50OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiB0ZWFyZG93bigpIHsKICAgIGlmICghY3R4KSByZXR1cm47CiAgICBjbG9zZU1lbnUoKTsKICAgIHJlbW92ZVNlbnRpbmVsKCk7CiAgICBpZiAodHlwZW9mIGN0eC5fdW5zdWIgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgY3R4Ll91bnN1YigpOyB9IGNhdGNoIChlKSB7fSB9CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXksIGZhbHNlKTsKICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBlbnN1cmVGaWxsLCBmYWxzZSk7CiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25XaW5kb3dTY3JvbGwsIHRydWUpOwogICAgaWYgKGN0eC5yb290KSBjdHgucm9vdC5jbGFzc0xpc3QucmVtb3ZlKCd2LXZpZXctbGlicmFyeScpOwogICAgY3R4ID0gbnVsbDsKICB9CgogIFYudmlld3MubGlicmFyeSA9IHsgcmVuZGVyOiByZW5kZXIsIHRlYXJkb3duOiB0ZWFyZG93biB9OwoKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvc3R1ZGlvLmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLnZpZXdzID0gVi52aWV3cyB8fCB7fTsKCiAgdmFyIEFDQ0VOVCA9ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknOwogIHZhciBBQ0NFTlRfU09GVCA9ICd2YXIoLS12YW1wLWFjY2VudC1zb2Z0LCAjODJENkZGKSc7CiAgdmFyIEVSUk9SID0gJ3ZhcigtLWNvbG9yLWVycm9yLCAjRjczMzYzKSc7CiAgdmFyIElOSyA9ICd2YXIoLS12LWluaywgI2Y1ZjVmNyknOwogIHZhciBJTktfU09GVCA9ICd2YXIoLS12LWluay1zb2Z0LCByZ2JhKDI0NSwyNDUsMjQ3LC42NikpJzsKICB2YXIgTElORSA9ICd2YXIoLS12LWxpbmUsIHJnYmEoMjQ1LDI0NSwyNDcsLjE1KSknOwogIHZhciBDQVJEX0JHID0gJ3ZhcigtLXYtY2FyZC1iZywgcmdiYSgyNTUsMjU1LDI1NSwuMDQpKSc7CgogIHZhciBfcm9vdCA9IG51bGw7CiAgdmFyIF9ub2RlID0gbnVsbDsKICB2YXIgX2ltYWdlID0gbnVsbDsKICB2YXIgX3NpYmxpbmdzID0gW107CiAgdmFyIF9pbmRleCA9IC0xOwogIHZhciBfc2NydWJOb2RlID0gbnVsbDsKICB2YXIgX3BvbGxBYm9ydCA9IG51bGw7CiAgdmFyIF9rZXlIYW5kbGVyID0gbnVsbDsKICB2YXIgX3Bhc3RlSGFuZGxlciA9IG51bGw7CiAgdmFyIF9yZXNpemVIYW5kbGVyID0gbnVsbDsKICB2YXIgX2Rpc3Bvc2VkID0gZmFsc2U7CgogIGZ1bmN0aW9uIFUoKSB7IHJldHVybiBWLnV0aWwgfHwge307IH0KICBmdW5jdGlvbiBVSSgpIHsgcmV0dXJuIFYudWkgfHwge307IH0KICBmdW5jdGlvbiBBUEkoKSB7IHJldHVybiBWLmFwaSB8fCB7fTsgfQogIGZ1bmN0aW9uIFNUKCkgeyByZXR1cm4gVi5zdGF0ZSB8fCB7fTsgfQoKICBmdW5jdGlvbiBlbCh0YWcsIGF0dHJzKSB7CiAgICB2YXIgdWkgPSBVSSgpOwogICAgaWYgKHVpICYmIHR5cGVvZiB1aS5lbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHVpLmVsLmFwcGx5KHVpLCBhcmd1bWVudHMpOwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMpIHsKICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwogICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybjsKICAgICAgICBpZiAoayA9PT0gJ2NsYXNzJykgbm9kZS5jbGFzc05hbWUgPSB2OwogICAgICAgIGVsc2UgaWYgKGsgPT09ICd0ZXh0Jykgbm9kZS50ZXh0Q29udGVudCA9IHY7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ3N0eWxlJyAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcpIE9iamVjdC5hc3NpZ24obm9kZS5zdHlsZSwgdik7CiAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdvbicpID09PSAwICYmIHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCB2KTsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ2RhdGEtJykgPT09IDAgfHwgay5pbmRleE9mKCdhcmlhLScpID09PSAwKSBub2RlLnNldEF0dHJpYnV0ZShrLCB2KTsKICAgICAgICBlbHNlIGlmIChrIGluIG5vZGUpIHsgdHJ5IHsgbm9kZVtrXSA9IHY7IH0gY2F0Y2ggKGUpIHsgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdik7IH0gfQogICAgICAgIGVsc2Ugbm9kZS5zZXRBdHRyaWJ1dGUoaywgdik7CiAgICAgIH0pOwogICAgfQogICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGMgPSBhcmd1bWVudHNbaV07CiAgICAgIGlmIChjID09IG51bGwpIGNvbnRpbnVlOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgYy5mb3JFYWNoKGZ1bmN0aW9uIChjYykgeyBpZiAoY2MgIT0gbnVsbCkgbm9kZS5hcHBlbmRDaGlsZCh0ZXh0T3JOb2RlKGNjKSk7IH0pOwogICAgICBlbHNlIG5vZGUuYXBwZW5kQ2hpbGQodGV4dE9yTm9kZShjKSk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CiAgZnVuY3Rpb24gdGV4dE9yTm9kZShjKSB7CiAgICByZXR1cm4gKHR5cGVvZiBjID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYyA9PT0gJ251bWJlcicpID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGMpKSA6IGM7CiAgfQoKICBmdW5jdGlvbiBpY29uKG5hbWUpIHsKICAgIHZhciB1aSA9IFVJKCk7CiAgICBpZiAodWkgJiYgdHlwZW9mIHVpLmljb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIHIgPSB1aS5pY29uKG5hbWUpOwogICAgICBpZiAodHlwZW9mIHIgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICBzcGFuLmlubmVySFRNTCA9IHI7CiAgICAgICAgcmV0dXJuIHNwYW47CiAgICAgIH0KICAgICAgaWYgKHIgJiYgci5ub2RlVHlwZSkgcmV0dXJuIHI7CiAgICB9CiAgICB2YXIgZmFsbGJhY2sgPSB7CiAgICAgIGVkaXQ6ICfinI4nLCB2YXJpYXRpb25zOiAn4oa7JywgYW5pbWF0ZTogJ+KWticsIGRvd25sb2FkOiAn4qSTJywKICAgICAgaGVhcnQ6ICfimaEnLCAnaGVhcnQuZmlsbCc6ICfimaUnLCB0cmFzaDogJ+KclScsIHNoYXJlOiAn4oaXJywKICAgICAgcHVibGlzaDogJ+KYgScsIGJvb2ttYXJrOiAn4piGJywgY29weTogJ+KniScsIGNsb3NlOiAn4pyVJywKICAgICAgcGhvdG86ICfilqMnLCB2aWRlbzogJ+KWticsIGFycm93TGVmdDogJ+KAuScsIGFycm93UmlnaHQ6ICfigLonLAogICAgICBpbmZvOiAnaScsIHNwYXJrbGVzOiAn4pyoJwogICAgfTsKICAgIHZhciBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIHMudGV4dENvbnRlbnQgPSBmYWxsYmFja1tuYW1lXSB8fCAn4oCiJzsKICAgIHJldHVybiBzOwogIH0KCiAgZnVuY3Rpb24gdG9hc3QobXNnLCBraW5kKSB7CiAgICB2YXIgdWkgPSBVSSgpOwogICAgaWYgKHVpICYmIHR5cGVvZiB1aS50b2FzdCA9PT0gJ2Z1bmN0aW9uJykgeyB1aS50b2FzdChtc2csIGtpbmQgfHwgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICB0cnkgeyAoVi5zdG9yZSAmJiBWLnN0b3JlLmVtaXQpICYmIFYuc3RvcmUuZW1pdCgndG9hc3QnLCB7IG1zZzogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsgfSBjYXRjaCAoZSkge30KICB9CgogIGZ1bmN0aW9uIGNvbmZpcm1EaWFsb2cobXNnLCBvcHRzKSB7CiAgICB2YXIgdWkgPSBVSSgpOwogICAgaWYgKHVpICYmIHR5cGVvZiB1aS5jb25maXJtID09PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVpLmNvbmZpcm0obXNnLCBvcHRzIHx8IHt9KSk7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5jb25maXJtKG1zZykpOwogIH0KCiAgZnVuY3Rpb24gZ28oaGFzaCkgewogICAgaWYgKFYucm91dGVyICYmIHR5cGVvZiBWLnJvdXRlci5nbyA9PT0gJ2Z1bmN0aW9uJykgVi5yb3V0ZXIuZ28oaGFzaCk7CiAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gaGFzaDsKICB9CgogIGZ1bmN0aW9uIGZtdERhdGUoZCkgewogICAgdmFyIHUgPSBVKCk7CiAgICBpZiAodSAmJiB0eXBlb2YgdS5mbXREYXRlID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IHJldHVybiB1LmZtdERhdGUoZCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIHZhciBkYXRlID0gcGFyc2VEYXRlKGQpOwogICAgaWYgKCFkYXRlKSByZXR1cm4gJyc7CiAgICB0cnkgeyByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZygpOyB9IGNhdGNoIChlKSB7IHJldHVybiBTdHJpbmcoZCk7IH0KICB9CgogIGZ1bmN0aW9uIHBhcnNlRGF0ZShkKSB7CiAgICBpZiAoZCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChkIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGlzTmFOKGQuZ2V0VGltZSgpKSA/IG51bGwgOiBkOwogICAgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJykgewogICAgICB2YXIgbXMgPSBkID4gMWUxMiA/IGQgOiBkICogMTAwMDsKICAgICAgdmFyIGR0ID0gbmV3IERhdGUobXMpOwogICAgICByZXR1cm4gaXNOYU4oZHQuZ2V0VGltZSgpKSA/IG51bGwgOiBkdDsKICAgIH0KICAgIGlmICh0eXBlb2YgZCA9PT0gJ3N0cmluZycpIHsKICAgICAgdmFyIHAgPSBuZXcgRGF0ZShkKTsKICAgICAgaWYgKCFpc05hTihwLmdldFRpbWUoKSkpIHJldHVybiBwOwogICAgICB2YXIgbiA9IE51bWJlcihkKTsKICAgICAgaWYgKCFpc05hTihuKSkgcmV0dXJuIHBhcnNlRGF0ZShuKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gZG93bmxvYWQodXJsLCBmaWxlbmFtZSkgewogICAgdmFyIHUgPSBVKCk7CiAgICBpZiAodSAmJiB0eXBlb2YgdS5kb3dubG9hZCA9PT0gJ2Z1bmN0aW9uJykgeyB1LmRvd25sb2FkKHVybCwgZmlsZW5hbWUpOyByZXR1cm47IH0KICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgYS5ocmVmID0gdXJsOyBhLmRvd25sb2FkID0gZmlsZW5hbWUgfHwgJyc7IGEucmVsID0gJ25vb3BlbmVyJzsgYS50YXJnZXQgPSAnX2JsYW5rJzsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7IGEuY2xpY2soKTsgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTsKICB9CgogIGZ1bmN0aW9uIGltYWdlSUQoaW1nKSB7IHJldHVybiBpbWcgPyAoaW1nLnJlbW90ZUlEIHx8IGltZy5pZCB8fCBudWxsKSA6IG51bGw7IH0KCiAgZnVuY3Rpb24gaXNPd25JbWFnZShpbWcpIHsKICAgIGlmICghaW1nKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgbGliID0gU1QoKS5saWJyYXJ5IHx8IFtdOwogICAgdmFyIGlkID0gaW1hZ2VJRChpbWcpOwogICAgcmV0dXJuIGxpYi5zb21lKGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWFnZUlEKHVud3JhcCh4KSkgPT09IGlkOyB9KTsKICB9CgogIGZ1bmN0aW9uIG1vZGVsTGFiZWwocmF3KSB7CiAgICBpZiAoIXJhdykgcmV0dXJuICcnOwogICAgdmFyIG1vZGVscyA9IChWLmRhdGEgJiYgVi5kYXRhLm1vZGVscykgfHwgW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVscy5sZW5ndGg7IGkrKykgeyBpZiAobW9kZWxzW2ldLnJhdyA9PT0gcmF3KSByZXR1cm4gbW9kZWxzW2ldLmxhYmVsOyB9CiAgICByZXR1cm4gcmF3OwogIH0KCiAgZnVuY3Rpb24gbW9kZWxDb3N0KHJhdykgewogICAgdmFyIG1vZGVscyA9IChWLmRhdGEgJiYgVi5kYXRhLm1vZGVscykgfHwgW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVscy5sZW5ndGg7IGkrKykgeyBpZiAobW9kZWxzW2ldLnJhdyA9PT0gcmF3ICYmIHR5cGVvZiBtb2RlbHNbaV0uY29zdCA9PT0gJ251bWJlcicpIHJldHVybiBtb2RlbHNbaV0uY29zdDsgfQogICAgdmFyIHQyaSA9IFYuZGF0YSAmJiBWLmRhdGEudDJpTW9kZWw7CiAgICBpZiAodDJpICYmIHQyaS5yYXcgPT09IHJhdyAmJiB0eXBlb2YgdDJpLmNvc3QgPT09ICdudW1iZXInKSByZXR1cm4gdDJpLmNvc3Q7CiAgICByZXR1cm4gMTA7CiAgfQoKICBmdW5jdGlvbiBpbWFnZURpbWVuc2lvbnMoaW1nKSB7CiAgICBpZiAoIWltZykgcmV0dXJuIG51bGw7CiAgICB2YXIgdyA9IGltZy53aWR0aCB8fCBpbWcuaW1hZ2VXaWR0aCB8fCAoaW1nLmltYWdlX3NpemUgJiYgaW1nLmltYWdlX3NpemUud2lkdGgpIHx8IChpbWcuaW1hZ2VTaXplICYmIGltZy5pbWFnZVNpemUud2lkdGgpIHx8IG51bGw7CiAgICB2YXIgaCA9IGltZy5oZWlnaHQgfHwgaW1nLmltYWdlSGVpZ2h0IHx8IChpbWcuaW1hZ2Vfc2l6ZSAmJiBpbWcuaW1hZ2Vfc2l6ZS5oZWlnaHQpIHx8IChpbWcuaW1hZ2VTaXplICYmIGltZy5pbWFnZVNpemUuaGVpZ2h0KSB8fCBudWxsOwogICAgaWYgKHcgJiYgaCkgcmV0dXJuIE1hdGgucm91bmQodykgKyAnIMOXICcgKyBNYXRoLnJvdW5kKGgpOwogICAgaWYgKHR5cGVvZiBpbWcuYXNwZWN0UmF0aW8gPT09ICdudW1iZXInICYmIGltZy5hc3BlY3RSYXRpbyA+IDApIHsKICAgICAgcmV0dXJuIGltZy5hc3BlY3RSYXRpbyA+PSAxID8gJ0xhbmRzY2FwZScgOiAnUG9ydHJhaXQnOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiBjcmVkaXRDb3N0KGltZykgewogICAgaWYgKCFpbWcpIHJldHVybiBudWxsOwogICAgaWYgKHR5cGVvZiBpbWcuY3JlZGl0c0Nvc3QgPT09ICdudW1iZXInKSByZXR1cm4gaW1nLmNyZWRpdHNDb3N0OwogICAgaWYgKHR5cGVvZiBpbWcuY3JlZGl0Q29zdCA9PT0gJ251bWJlcicpIHJldHVybiBpbWcuY3JlZGl0Q29zdDsKICAgIGlmICh0eXBlb2YgaW1nLmNvc3QgPT09ICdudW1iZXInKSByZXR1cm4gaW1nLmNvc3Q7CiAgICBpZiAoaW1nLnZpZGVvVVJMKSByZXR1cm4gNTA7CiAgICBpZiAoaW1nLm1vZGVsKSByZXR1cm4gbW9kZWxDb3N0KGltZy5tb2RlbCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHJhdGUocmVtb3RlSUQsIGFjdGlvbikgewogICAgaWYgKCFyZW1vdGVJRCkgcmV0dXJuOwogICAgdmFyIGFwaSA9IEFQSSgpOwogICAgaWYgKGFwaSAmJiB0eXBlb2YgYXBpLnJhdGluZyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgeyBQcm9taXNlLnJlc29sdmUoYXBpLnJhdGluZyhyZW1vdGVJRCwgYWN0aW9uKSkuY2F0Y2goZnVuY3Rpb24gKCkge30pOyB9IGNhdGNoIChlKSB7fQogICAgfQogIH0KCiAgZnVuY3Rpb24gYnVzeShidG4sIG9uKSB7CiAgICBpZiAoIWJ0bikgcmV0dXJuOwogICAgYnRuLmRpc2FibGVkID0gISFvbjsKICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtYnVzeScsIG9uID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnaXMtYnVzeScsICEhb24pOwogICAgYnRuLnN0eWxlLm9wYWNpdHkgPSBvbiA/ICcwLjYnIDogJyc7CiAgICBidG4uc3R5bGUucG9pbnRlckV2ZW50cyA9IG9uID8gJ25vbmUnIDogJyc7CiAgfQoKICBmdW5jdGlvbiBmaW5kSW5TdGF0ZShpZCkgewogICAgaWYgKCFpZCkgcmV0dXJuIG51bGw7CiAgICB2YXIgcG9vbHMgPSBbU1QoKS5saWJyYXJ5IHx8IFtdLCBTVCgpLmZlZWQgfHwgW11dOwogICAgZm9yICh2YXIgcCA9IDA7IHAgPCBwb29scy5sZW5ndGg7IHArKykgewogICAgICB2YXIgcG9vbCA9IHBvb2xzW3BdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvb2wubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgaW1nID0gdW53cmFwKHBvb2xbaV0pOwogICAgICAgIGlmIChpbWFnZUlEKGltZykgPT09IGlkIHx8IChpbWcgJiYgaW1nLmlkID09PSBpZCkgfHwgKGltZyAmJiBpbWcucmVtb3RlSUQgPT09IGlkKSkgcmV0dXJuIGltZzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiB1bndyYXAoaXRlbSkgewogICAgaWYgKCFpdGVtKSByZXR1cm4gaXRlbTsKICAgIGlmIChpdGVtLmdlbmVyYXRlZEltYWdlKSByZXR1cm4gaXRlbS5nZW5lcmF0ZWRJbWFnZTsKICAgIHJldHVybiBpdGVtOwogIH0KCiAgZnVuY3Rpb24gcmVzb2x2ZUltYWdlKGlkKSB7CiAgICB2YXIgbG9jYWwgPSBmaW5kSW5TdGF0ZShpZCk7CiAgICBpZiAobG9jYWwpIHJldHVybiBQcm9taXNlLnJlc29sdmUobG9jYWwpOwogICAgdmFyIGFwaSA9IEFQSSgpOwogICAgaWYgKGFwaSAmJiB0eXBlb2YgYXBpLmxpYnJhcnkgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIHBhZ2UgPSAxLCBwZXIgPSA2MCwgbWF4UGFnZXMgPSA1OwogICAgICB2YXIgc3RlcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaS5saWJyYXJ5KHBhZ2UsIHBlcikpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgdmFyIGl0ZW1zID0gKHJlcyAmJiAocmVzLml0ZW1zIHx8IHJlcykpIHx8IFtdOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgaW1nID0gdW53cmFwKGl0ZW1zW2ldKTsKICAgICAgICAgICAgaWYgKGltYWdlSUQoaW1nKSA9PT0gaWQpIHJldHVybiBpbWc7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgbWV0YSA9IHJlcyAmJiByZXMubWV0YWRhdGE7CiAgICAgICAgICB2YXIgbW9yZSA9IGl0ZW1zLmxlbmd0aCA+PSBwZXIgJiYgKCFtZXRhIHx8IHBhZ2UgKiBwZXIgPCBtZXRhLnRvdGFsKSAmJiBwYWdlIDwgbWF4UGFnZXM7CiAgICAgICAgICBpZiAobW9yZSkgeyBwYWdlKys7IHJldHVybiBzdGVwKCk7IH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH0pOwogICAgICB9OwogICAgICByZXR1cm4gc3RlcCgpOwogICAgfQogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkU2libGluZ3MoaW1nKSB7CiAgICB2YXIgbGliID0gKFNUKCkubGlicmFyeSB8fCBbXSkubWFwKHVud3JhcCk7CiAgICB2YXIgZmVlZCA9IChTVCgpLmZlZWQgfHwgW10pLm1hcCh1bndyYXApOwogICAgdmFyIGlkID0gaW1hZ2VJRChpbWcpOwogICAgaWYgKGxpYi5zb21lKGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWFnZUlEKHgpID09PSBpZDsgfSkpIHJldHVybiBsaWI7CiAgICBpZiAoZmVlZC5zb21lKGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWFnZUlEKHgpID09PSBpZDsgfSkpIHJldHVybiBmZWVkOwogICAgcmV0dXJuIGxpYi5sZW5ndGggPyBsaWIgOiBmZWVkOwogIH0KCiAgZnVuY3Rpb24gbmF2aWdhdGUoZGVsdGEpIHsKICAgIGlmICghX3NpYmxpbmdzLmxlbmd0aCkgcmV0dXJuOwogICAgdmFyIG5leHQgPSBfaW5kZXggKyBkZWx0YTsKICAgIGlmIChuZXh0IDwgMCB8fCBuZXh0ID49IF9zaWJsaW5ncy5sZW5ndGgpIHJldHVybjsKICAgIHZhciB0YXJnZXQgPSBfc2libGluZ3NbbmV4dF07CiAgICB2YXIgdGlkID0gaW1hZ2VJRCh0YXJnZXQpOwogICAgaWYgKCF0aWQpIHJldHVybjsKICAgIGdvKCcjL2ltYWdlLycgKyBlbmNvZGVVUklDb21wb25lbnQodGlkKSk7CiAgfQoKICBmdW5jdGlvbiBidWlsZE1lZGlhKCkgewogICAgdmFyIHN0YWdlID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0dWRpb19fc3RhZ2UnLCAnZGF0YS1yb2xlJzogJ3N0YWdlJywgc3R5bGU6IHsKICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsIGZsZXg6ICcxIDEgYXV0bycsIGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsCiAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJywgbWluSGVpZ2h0OiAnMCcsIG1pbldpZHRoOiAnMCcsIHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnCiAgICB9IH0pOwoKICAgIHZhciBoYXNWaWRlbyA9ICEhX2ltYWdlLnZpZGVvVVJMOwogICAgdmFyIGhhc0JlZm9yZSA9ICEhX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwgJiYgISFfaW1hZ2UucmVtb3RlSW1hZ2VVUkw7CgogICAgaWYgKGhhc1ZpZGVvKSB7CiAgICAgIHZhciB2aWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpOwogICAgICB2aWQuY2xhc3NOYW1lID0gJ3Ytc3R1ZGlvX192aWRlbyc7CiAgICAgIHZpZC5tdXRlZCA9IHRydWU7IHZpZC5sb29wID0gdHJ1ZTsgdmlkLmF1dG9wbGF5ID0gdHJ1ZTsKICAgICAgdmlkLnNldEF0dHJpYnV0ZSgncGxheXNpbmxpbmUnLCAnJyk7IHZpZC5zZXRBdHRyaWJ1dGUoJ3dlYmtpdC1wbGF5c2lubGluZScsICcnKTsKICAgICAgdmlkLnByZWxvYWQgPSAnYXV0byc7CiAgICAgIHZpZC5wb3N0ZXIgPSBfaW1hZ2UucmVtb3RlSW1hZ2VVUkwgfHwgJyc7CiAgICAgIHZpZC5zcmMgPSBfaW1hZ2UudmlkZW9VUkw7CiAgICAgIHZpZC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnQW5pbWF0ZWQgcmVzdWx0Jyk7CiAgICAgIE9iamVjdC5hc3NpZ24odmlkLnN0eWxlLCBtZWRpYUZpdFN0eWxlKCkpOwogICAgICB2aWQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgc3RhZ2UuY2xhc3NMaXN0LmFkZCgnaXMtZXJyb3InKTsKICAgICAgICBzdGFnZS5hcHBlbmRDaGlsZChtZWRpYUVycm9yKCdDb3VsZG7igJl0IGxvYWQgdGhlIHZpZGVvLicpKTsKICAgICAgfSk7CiAgICAgIHZpZC5wbGF5ICYmIHZpZC5wbGF5KCkuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgICBzdGFnZS5hcHBlbmRDaGlsZCh2aWQpOwogICAgICBpZiAoX2ltYWdlLnJlbW90ZUltYWdlVVJMKSBzdGFnZS5hcHBlbmRDaGlsZChtZWRpYVRvZ2dsZSgncGhvdG8nLCAnU2hvdyBzdGlsbCcsIGZ1bmN0aW9uICgpIHsgc2hvd1N0aWxsKHN0YWdlKTsgfSkpOwogICAgfSBlbHNlIGlmIChoYXNCZWZvcmUpIHsKICAgICAgX3NjcnViTm9kZSA9IGJ1aWxkU2NydWIoKTsKICAgICAgc3RhZ2UuYXBwZW5kQ2hpbGQoX3NjcnViTm9kZSk7CiAgICB9IGVsc2UgaWYgKF9pbWFnZS5yZW1vdGVJbWFnZVVSTCkgewogICAgICBzdGFnZS5hcHBlbmRDaGlsZChidWlsZFNpbmdsZUltYWdlKHN0YWdlKSk7CiAgICB9IGVsc2UgewogICAgICBzdGFnZS5hcHBlbmRDaGlsZChtZWRpYUVycm9yKCdObyBpbWFnZSBhdmFpbGFibGUuJykpOwogICAgfQogICAgcmV0dXJuIHN0YWdlOwogIH0KCiAgZnVuY3Rpb24gbWVkaWFGaXRTdHlsZSgpIHsKICAgIHJldHVybiB7CiAgICAgIG1heFdpZHRoOiAnMTAwJScsIG1heEhlaWdodDogJzEwMCUnLCB3aWR0aDogJ2F1dG8nLCBoZWlnaHQ6ICdhdXRvJywKICAgICAgb2JqZWN0Rml0OiAnY29udGFpbicsIGJvcmRlclJhZGl1czogJ3ZhcigtLXYtcmFkaXVzLCAyNHB4KScsCiAgICAgIGJveFNoYWRvdzogJzAgMzBweCA5MHB4IC0zMHB4IHJnYmEoMCwwLDAsLjcpJywgZGlzcGxheTogJ2Jsb2NrJwogICAgfTsKICB9CgogIGZ1bmN0aW9uIG1lZGlhVG9nZ2xlKGljb25OYW1lLCBsYWJlbCwgb25DbGljaykgewogICAgdmFyIGJ0biA9IGdsYXNzQnRuKGljb25OYW1lLCBsYWJlbCwgb25DbGljaywgeyBjb21wYWN0OiB0cnVlIH0pOwogICAgT2JqZWN0LmFzc2lnbihidG4uc3R5bGUsIHsKICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsIGJvdHRvbTogJzE2cHgnLCBsZWZ0OiAnNTAlJywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNTAlKScsIHpJbmRleDogJzQnCiAgICB9KTsKICAgIHJldHVybiBidG47CiAgfQoKICBmdW5jdGlvbiBidWlsZFNjcnViKCkgewogICAgdmFyIHVpID0gVUkoKTsKICAgIGlmICh1aSAmJiB0eXBlb2YgdWkuc2NydWIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIG4gPSB1aS5zY3J1YihfaW1hZ2UucmVtb3RlT3JpZ2luYWxJbWFnZVVSTCwgX2ltYWdlLnJlbW90ZUltYWdlVVJMLCB7CiAgICAgICAgZWFnZXI6IHRydWUsIGJlZm9yZUFsdDogJ0JlZm9yZSB0cmFuc2Zvcm1hdGlvbicsIGFmdGVyQWx0OiAnQWZ0ZXIgdHJhbnNmb3JtYXRpb24nCiAgICAgIH0pOwogICAgICBpZiAobikgewogICAgICAgIE9iamVjdC5hc3NpZ24obi5zdHlsZSwgewogICAgICAgICAgd2lkdGg6ICcxMDAlJywgbWF4V2lkdGg6ICdtaW4oMTAwJSwgNzh2aCknLCBtYXhIZWlnaHQ6ICcxMDAlJywgbWFyZ2luOiAnMCBhdXRvJwogICAgICAgIH0pOwogICAgICAgIG4uY2xhc3NMaXN0LmFkZCgndi1zdHVkaW9fX3NjcnViJyk7CiAgICAgICAgZGVjb3JhdGVTY3J1YihuKTsKICAgICAgICByZXR1cm4gbjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbGxiYWNrU2NydWIoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwsIF9pbWFnZS5yZW1vdGVJbWFnZVVSTCk7CiAgfQoKICBmdW5jdGlvbiBkZWNvcmF0ZVNjcnViKGZlZWQpIHsKICAgIHZhciBjYXJkID0gZmVlZC5xdWVyeVNlbGVjdG9yKCcudmNhcmQnKTsKICAgIGlmICghY2FyZCB8fCBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fc2NydWItbGFiZWwnKSkgcmV0dXJuOwogICAgY2FyZC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXN0dWRpb19fc2NydWItbGFiZWwgdi1zdHVkaW9fX3NjcnViLWxhYmVsLS1iZWZvcmUnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIHRleHQ6ICdCZWZvcmUnIH0pKTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX3NjcnViLWxhYmVsIHYtc3R1ZGlvX19zY3J1Yi1sYWJlbC0tYWZ0ZXInLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIHRleHQ6ICdBZnRlcicgfSkpOwogIH0KCiAgZnVuY3Rpb24gZmFsbGJhY2tTY3J1YihiZWZvcmVVUkwsIGFmdGVyVVJMKSB7CiAgICB2YXIgd3JhcCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndmNhcmQnLCBzdHlsZTogewogICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJywgd2lkdGg6ICcxMDAlJywgbWF4V2lkdGg6ICdtaW4oMTAwJSwgNzh2aCknLCBtYXhIZWlnaHQ6ICcxMDAlJywKICAgICAgbWFyZ2luOiAnMCBhdXRvJywgYm9yZGVyUmFkaXVzOiAndmFyKC0tdi1yYWRpdXMsIDI0cHgpJywgb3ZlcmZsb3c6ICdoaWRkZW4nLAogICAgICBib3hTaGFkb3c6ICcwIDMwcHggOTBweCAtMzBweCByZ2JhKDAsMCwwLC43KScsIHRvdWNoQWN0aW9uOiAnbm9uZScsIGN1cnNvcjogJ2V3LXJlc2l6ZScKICAgIH0gfSk7CiAgICB2YXIgYWZ0ZXIgPSBlbCgnaW1nJywgeyBjbGFzczogJ3ZhZnRlcicsIHNyYzogYWZ0ZXJVUkwsIGFsdDogJ0FmdGVyJywgZHJhZ2dhYmxlOiBmYWxzZSwKICAgICAgc3R5bGU6IHsgZGlzcGxheTogJ2Jsb2NrJywgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnYXV0bycgfSB9KTsKICAgIHZhciBiZWZvcmUgPSBlbCgnaW1nJywgeyBjbGFzczogJ3ZiZWZvcmUnLCBzcmM6IGJlZm9yZVVSTCwgYWx0OiAnQmVmb3JlJywgZHJhZ2dhYmxlOiBmYWxzZSwKICAgICAgc3R5bGU6IHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIGluc2V0OiAnMCcsIHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnLCBvYmplY3RGaXQ6ICdjb3ZlcicgfSB9KTsKICAgIHZhciBoYW5kbGUgPSBlbCgnZGl2JywgeyBjbGFzczogJ3ZzY3J1YicsICdhcmlhLWhpZGRlbic6ICd0cnVlJywgc3R5bGU6IHsKICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogJzAnLCBib3R0b206ICcwJywgd2lkdGg6ICcycHgnLCBiYWNrZ3JvdW5kOiAncmdiYSgyNTUsMjU1LDI1NSwuOSknLAogICAgICBib3hTaGFkb3c6ICcwIDAgMTJweCByZ2JhKDAsMCwwLC41KScsIHBvaW50ZXJFdmVudHM6ICdub25lJwogICAgfSB9KTsKICAgIHZhciBiZWZvcmVMYWJlbCA9IGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3R1ZGlvX19zY3J1Yi1sYWJlbCB2LXN0dWRpb19fc2NydWItbGFiZWwtLWJlZm9yZScsICdhcmlhLWhpZGRlbic6ICd0cnVlJywgdGV4dDogJ0JlZm9yZScgfSk7CiAgICB2YXIgYWZ0ZXJMYWJlbCA9IGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3R1ZGlvX19zY3J1Yi1sYWJlbCB2LXN0dWRpb19fc2NydWItbGFiZWwtLWFmdGVyJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCB0ZXh0OiAnQWZ0ZXInIH0pOwogICAgd3JhcC5hcHBlbmRDaGlsZChhZnRlcik7IHdyYXAuYXBwZW5kQ2hpbGQoYmVmb3JlKTsgd3JhcC5hcHBlbmRDaGlsZChoYW5kbGUpOwogICAgd3JhcC5hcHBlbmRDaGlsZChiZWZvcmVMYWJlbCk7IHdyYXAuYXBwZW5kQ2hpbGQoYWZ0ZXJMYWJlbCk7CiAgICB2YXIgcG9zID0gMC41LCBkcmFnZ2luZyA9IGZhbHNlLCBpZGxlID0gbnVsbCwgdDAgPSAwOwogICAgZnVuY3Rpb24gc2V0KHApIHsKICAgICAgcG9zID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgcCkpOwogICAgICBiZWZvcmUuc3R5bGUuY2xpcFBhdGggPSAnaW5zZXQoMCAnICsgKCgxIC0gcG9zKSAqIDEwMCkgKyAnJSAwIDApJzsKICAgICAgaGFuZGxlLnN0eWxlLmxlZnQgPSAocG9zICogMTAwKSArICclJzsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21FdmVudChlKSB7CiAgICAgIHZhciByID0gd3JhcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgdmFyIHggPSAoZS50b3VjaGVzID8gZS50b3VjaGVzWzBdLmNsaWVudFggOiBlLmNsaWVudFgpIC0gci5sZWZ0OwogICAgICBzZXQoeCAvIHIud2lkdGgpOwogICAgfQogICAgZnVuY3Rpb24gc3RhcnRJZGxlKCkgewogICAgICBzdG9wSWRsZSgpOwogICAgICBpZGxlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIGxvb3AodCkgewogICAgICAgIGlmIChkcmFnZ2luZykgcmV0dXJuOwogICAgICAgIGlmICghdDApIHQwID0gdDsKICAgICAgICB2YXIgcGhhc2UgPSAoKHQgLSB0MCkgLyAyNjAwKSAlIDE7CiAgICAgICAgc2V0KDAuNSArIDAuMyAqIE1hdGguc2luKHBoYXNlICogTWF0aC5QSSAqIDIpKTsKICAgICAgICBpZGxlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApOwogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0b3BJZGxlKCkgeyBpZiAoaWRsZSkgeyBjYW5jZWxBbmltYXRpb25GcmFtZShpZGxlKTsgaWRsZSA9IG51bGw7IH0gfQogICAgd3JhcC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGRyYWdnaW5nID0gdHJ1ZTsgd3JhcC5jbGFzc0xpc3QuYWRkKCdzY3J1YmJpbmcnKTsgc3RvcElkbGUoKTsKICAgICAgZnJvbUV2ZW50KGUpOyB0cnkgeyB3cmFwLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTsgfSBjYXRjaCAoZXIpIHt9CiAgICB9KTsKICAgIHdyYXAuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBmdW5jdGlvbiAoZSkgeyBpZiAoZHJhZ2dpbmcpIGZyb21FdmVudChlKTsgfSk7CiAgICB2YXIgZW5kID0gZnVuY3Rpb24gKCkgewogICAgICBpZiAoIWRyYWdnaW5nKSByZXR1cm47CiAgICAgIGRyYWdnaW5nID0gZmFsc2U7IHdyYXAuY2xhc3NMaXN0LnJlbW92ZSgnc2NydWJiaW5nJyk7CiAgICAgIHQwID0gMDsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGlmICghZHJhZ2dpbmcpIHN0YXJ0SWRsZSgpOyB9LCAyNDAwKTsKICAgIH07CiAgICB3cmFwLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7CiAgICB3cmFwLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBlbmQpOwogICAgc2V0KDAuNSk7IHN0YXJ0SWRsZSgpOwogICAgd3JhcC5kZXN0cm95ID0gc3RvcElkbGU7CiAgICByZXR1cm4gd3JhcDsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkU2luZ2xlSW1hZ2Uoc3RhZ2UpIHsKICAgIHZhciBpbWcgPSBlbCgnaW1nJywgewogICAgICBjbGFzczogJ3Ytc3R1ZGlvX19pbWcnLCBzcmM6IF9pbWFnZS5yZW1vdGVJbWFnZVVSTCwgZHJhZ2dhYmxlOiBmYWxzZSwKICAgICAgYWx0OiBfaW1hZ2UucHJvbXB0ID8gKCdHZW5lcmF0ZWQgaW1hZ2U6ICcgKyBfaW1hZ2UucHJvbXB0KSA6ICdHZW5lcmF0ZWQgaW1hZ2UnLAogICAgICBzdHlsZTogbWVkaWFGaXRTdHlsZSgpCiAgICB9KTsKICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKCkgeyBzdGFnZS5jbGFzc0xpc3QuYWRkKCdpcy1sb2FkZWQnKTsgfSk7CiAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoKSB7CiAgICAgIHN0YWdlLmNsYXNzTGlzdC5hZGQoJ2lzLWVycm9yJyk7CiAgICAgIGltZy5yZXBsYWNlV2l0aChtZWRpYUVycm9yKCdDb3VsZG7igJl0IGxvYWQgdGhlIGltYWdlLicpKTsKICAgIH0pOwogICAgcmV0dXJuIGltZzsKICB9CgogIGZ1bmN0aW9uIHNob3dTdGlsbChzdGFnZSkgewogICAgdmFyIGV4aXN0aW5nID0gc3RhZ2UucXVlcnlTZWxlY3RvcignLnYtc3R1ZGlvX192aWRlbycpOwogICAgaWYgKGV4aXN0aW5nKSBleGlzdGluZy5yZW1vdmUoKTsKICAgIHZhciBvbGRUb2dnbGUgPSBzdGFnZS5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX21lZGlhLXRvZ2dsZScpOwogICAgaWYgKG9sZFRvZ2dsZSkgb2xkVG9nZ2xlLnJlbW92ZSgpOwogICAgdmFyIGltZyA9IGJ1aWxkU2luZ2xlSW1hZ2Uoc3RhZ2UpOwogICAgc3RhZ2UuaW5zZXJ0QmVmb3JlKGltZywgc3RhZ2UuZmlyc3RDaGlsZCk7CiAgICB2YXIgYmFjayA9IG1lZGlhVG9nZ2xlKCd2aWRlbycsICdTaG93IHZpZGVvJywgZnVuY3Rpb24gKCkgeyByZWJ1aWxkTWVkaWEoKTsgfSk7CiAgICBzdGFnZS5hcHBlbmRDaGlsZChiYWNrKTsKICB9CgogIGZ1bmN0aW9uIG1lZGlhRXJyb3IobXNnKSB7CiAgICByZXR1cm4gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0dWRpb19fbWVkaWEtZXJyb3Igdi1lbXB0eScsIHJvbGU6ICdhbGVydCcsIHN0eWxlOiB7CiAgICAgIGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBnYXA6ICcxMHB4JywKICAgICAgY29sb3I6IElOS19TT0ZULCBwYWRkaW5nOiAnMjRweCcsIHRleHRBbGlnbjogJ2NlbnRlcicKICAgIH0gfSwgaWNvbignaW5mbycpLCBlbCgnc3BhbicsIHsgdGV4dDogbXNnIH0pKTsKICB9CgogIGZ1bmN0aW9uIGdsYXNzQnRuKGljb25OYW1lLCBsYWJlbCwgb25DbGljaywgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgYnRuID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6ICdnbGFzcy1idXR0b24gdi1zdHVkaW9fX2FjdGlvbicsCiAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICB0aXRsZTogbGFiZWwsCiAgICAgICdhcmlhLWxhYmVsJzogbGFiZWwsCiAgICAgICdhcmlhLXByZXNzZWQnOiBvcHRzLnRvZ2dsZSA/IChvcHRzLmFjdGl2ZSA/ICd0cnVlJyA6ICdmYWxzZScpIDogbnVsbAogICAgfSk7CiAgICBPYmplY3QuYXNzaWduKGJ0bi5zdHlsZSwgewogICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgYWxpZ25JdGVtczogJ2NlbnRlcicsCiAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJywgZ2FwOiAnNXB4JywgbWluV2lkdGg6ICc2NHB4JywKICAgICAgcGFkZGluZzogb3B0cy5jb21wYWN0ID8gJzlweCAxMnB4JyA6ICcxMXB4IDEwcHgnLAogICAgICBib3JkZXJSYWRpdXM6ICd2YXIoLS1yYWRpdXMtY29udGVudCwgMTJweCknLCBjdXJzb3I6ICdwb2ludGVyJywKICAgICAgY29sb3I6IElOSywgbGluZUhlaWdodDogJzEnLCBmbGV4OiAnMCAwIGF1dG8nLAogICAgICB0cmFuc2l0aW9uOiAndHJhbnNmb3JtIHZhcigtLWR1ci1pbnRlcmFjdGl2ZSwxNDBtcykgdmFyKC0tZ2xhc3MtZWFzZSksIGNvbG9yIHZhcigtLWR1ci1mYXN0LDkwbXMpIGVhc2UsIGJhY2tncm91bmQgdmFyKC0tZHVyLWZhc3QsOTBtcykgZWFzZScKICAgIH0pOwogICAgdmFyIGljb25XcmFwID0gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX2FjdGlvbi1pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBzdHlsZTogewogICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLCB3aWR0aDogJzI0cHgnLCBoZWlnaHQ6ICcyNHB4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJwogICAgfSB9LCBpY29uKGljb25OYW1lKSk7CiAgICBidG4uYXBwZW5kQ2hpbGQoaWNvbldyYXApOwogICAgaWYgKCFvcHRzLmNvbXBhY3QpIHsKICAgICAgYnRuLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3R1ZGlvX19hY3Rpb24tbGFiZWwnLCB0ZXh0OiBsYWJlbCwgc3R5bGU6IHsKICAgICAgICBmb250U2l6ZTogJzExcHgnLCBmb250V2VpZ2h0OiAnNjAwJywgY29sb3I6IElOS19TT0ZULCBsZXR0ZXJTcGFjaW5nOiAnLTAuMDFlbScKICAgICAgfSB9KSk7CiAgICB9CiAgICBhcHBseUFjdGlvblRvbmUoYnRuLCBvcHRzKTsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKCkgeyBpZiAoIWJ0bi5kaXNhYmxlZCkgYnRuLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKC0ycHgpJzsgfSk7CiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIGZ1bmN0aW9uICgpIHsgYnRuLnN0eWxlLnRyYW5zZm9ybSA9ICcnOyB9KTsKICAgIGlmICh0eXBlb2Ygb25DbGljayA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IG9uQ2xpY2soYnRuLCBlKTsgfSk7CiAgICB9CiAgICByZXR1cm4gYnRuOwogIH0KCiAgZnVuY3Rpb24gYXBwbHlBY3Rpb25Ub25lKGJ0biwgb3B0cykgewogICAgdmFyIGljb25XcmFwID0gYnRuLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uLWljb24nKTsKICAgIHZhciBsYWJlbCA9IGJ0bi5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX2FjdGlvbi1sYWJlbCcpOwogICAgaWYgKG9wdHMuZGFuZ2VyKSB7CiAgICAgIGJ0bi5zdHlsZS5jb2xvciA9IEVSUk9SOwogICAgICBpZiAoaWNvbldyYXApIGljb25XcmFwLnN0eWxlLmNvbG9yID0gRVJST1I7CiAgICAgIGlmIChsYWJlbCkgbGFiZWwuc3R5bGUuY29sb3IgPSBFUlJPUjsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG9wdHMucHJpbWFyeSB8fCBvcHRzLmFjdGl2ZSkgewogICAgICBidG4uc3R5bGUuY29sb3IgPSBBQ0NFTlQ7CiAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCAnICsgQUNDRU5UICsgJyAxNiUsIHRyYW5zcGFyZW50KSc7CiAgICAgIGlmIChpY29uV3JhcCkgaWNvbldyYXAuc3R5bGUuY29sb3IgPSBBQ0NFTlQ7CiAgICAgIGlmIChsYWJlbCkgbGFiZWwuc3R5bGUuY29sb3IgPSBBQ0NFTlQ7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpY29uV3JhcCkgaWNvbldyYXAuc3R5bGUuY29sb3IgPSBBQ0NFTlRfU09GVDsKICB9CgogIGZ1bmN0aW9uIGFjdEVkaXQoKSB7CiAgICB2YXIgcGFyYW1zID0gW107CiAgICBpZiAoX2ltYWdlLnByb21wdCkgcGFyYW1zLnB1c2goJ3Byb21wdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KF9pbWFnZS5wcm9tcHQpKTsKICAgIGlmIChfaW1hZ2UubW9kZWwpIHBhcmFtcy5wdXNoKCdtb2RlbD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KF9pbWFnZS5tb2RlbCkpOwogICAgaWYgKF9pbWFnZS5yZW1vdGVJbWFnZVVSTCkgcGFyYW1zLnB1c2goJ2ltYWdlPScgKyBlbmNvZGVVUklDb21wb25lbnQoX2ltYWdlLnJlbW90ZUltYWdlVVJMKSk7CiAgICBnbygnIy9jcmVhdGUnICsgKHBhcmFtcy5sZW5ndGggPyAnPycgKyBwYXJhbXMuam9pbignJicpIDogJycpKTsKICB9CgogIGZ1bmN0aW9uIGFjdFZhcmlhdGlvbnMoYnRuKSB7CiAgICB2YXIgbiA9IDQ7CiAgICB2YXIgbW9kZWwgPSBfaW1hZ2UubW9kZWwgfHwgKChWLmRhdGEgJiYgVi5kYXRhLm1vZGVscyAmJiBWLmRhdGEubW9kZWxzWzBdICYmIFYuZGF0YS5tb2RlbHNbMF0ucmF3KSB8fCAnZmx1eEtsZWluJyk7CiAgICB2YXIgdG90YWwgPSBtb2RlbENvc3QobW9kZWwpICogbjsKICAgIGNvbmZpcm1EaWFsb2coJ0dlbmVyYXRlICcgKyBuICsgJyB2YXJpYXRpb25zIG9mIHRoaXMgaW1hZ2U/IEFib3V0ICcgKyB0b3RhbCArICcgY3JlZGl0cy4nLCB7IHRpdGxlOiAnVmFyaWF0aW9ucycsIGNvbmZpcm1MYWJlbDogJ0dlbmVyYXRlJyB9KS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIGlmICghX2ltYWdlLnJlbW90ZUltYWdlVVJMIHx8ICFfaW1hZ2UucHJvbXB0KSB7IHRvYXN0KCdUaGlzIGltYWdlIGNhbuKAmXQgYmUgcmUtdmFyaWVkLicsICdlcnJvcicpOyByZXR1cm47IH0KICAgICAgYnVzeShidG4sIHRydWUpOwogICAgICBydW5WYXJpYXRpb25zKG1vZGVsLCBuKS50aGVuKGZ1bmN0aW9uIChtYWRlKSB7CiAgICAgICAgYnVzeShidG4sIGZhbHNlKTsKICAgICAgICBpZiAobWFkZSA+IDApIHsKICAgICAgICAgIHRvYXN0KG1hZGUgKyAnIHZhcmlhdGlvbicgKyAobWFkZSA9PT0gMSA/ICcnIDogJ3MnKSArICcgY3JlYXRlZC4nLCAnc3VjY2VzcycpOwogICAgICAgICAgaWYgKFYudWkgJiYgVi51aS5jb25mZXR0aSkgdHJ5IHsgVi51aS5jb25mZXR0aSgpOyB9IGNhdGNoIChlKSB7fQogICAgICAgICAgZ28oJyMvbGlicmFyeScpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0b2FzdCgnQ291bGRu4oCZdCBjcmVhdGUgdmFyaWF0aW9ucy4nLCAnZXJyb3InKTsKICAgICAgICB9CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBidXN5KGJ0biwgZmFsc2UpOwogICAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdWYXJpYXRpb24gZ2VuZXJhdGlvbiBmYWlsZWQuJywgJ2Vycm9yJyk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBydW5WYXJpYXRpb25zKG1vZGVsLCBuKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICBpZiAoIWFwaSB8fCB0eXBlb2YgYXBpLmdlbkVkaXQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGFwaS5wb2xsRWRpdCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgYXBpLnBvbGwgIT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignR2VuZXJhdGlvbiBBUEkgdW5hdmFpbGFibGUuJykpOwogICAgfQogICAgdmFyIHNlZWRCYXNlID0gKFUoKS5yYW5kb21TZWVkID8gVSgpLnJhbmRvbVNlZWQoKSA6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDFlNikpOwogICAgdmFyIG1hZGUgPSAwOwogICAgdmFyIGNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAoZnVuY3Rpb24gKGspIHsKICAgICAgICBjaGFpbiA9IGNoYWluLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIHNlZWQgPSAoc2VlZEJhc2UgKyBrICogOTE3MykgJSAxMDAwMDAwOwogICAgICAgICAgdmFyIGJvZHkgPSB7CiAgICAgICAgICAgIHByb21wdDogX2ltYWdlLnByb21wdCwKICAgICAgICAgICAgaW1hZ2VfdXJsOiBfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsCiAgICAgICAgICAgIGltYWdlX3VybHM6IFtfaW1hZ2UucmVtb3RlSW1hZ2VVUkxdLAogICAgICAgICAgICBzZWVkOiBzZWVkCiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIGFwaS5wb2xsKAogICAgICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBhcGkuZ2VuRWRpdChtb2RlbCwgYm9keSk7IH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gYXBpLnBvbGxFZGl0KG1vZGVsLCBpZCk7IH0sCiAgICAgICAgICAgIHt9CiAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICB2YXIgdXJsID0gcmVzdWx0ICYmIHJlc3VsdC5pbWFnZXMgJiYgcmVzdWx0LmltYWdlc1swXSAmJiByZXN1bHQuaW1hZ2VzWzBdLnVybDsKICAgICAgICAgICAgaWYgKCF1cmwpIHJldHVybjsKICAgICAgICAgICAgbWFkZSsrOwogICAgICAgICAgICByZXR1cm4gcGVyc2lzdFJlc3VsdCh1cmwsIHNlZWQsIG1vZGVsKTsKICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsKICAgICAgICB9KTsKICAgICAgfSkoaSk7CiAgICB9CiAgICByZXR1cm4gY2hhaW4udGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiBtYWRlOyB9KTsKICB9CgogIGZ1bmN0aW9uIHBlcnNpc3RSZXN1bHQodXJsLCBzZWVkLCBtb2RlbCkgewogICAgdmFyIGFwaSA9IEFQSSgpOwogICAgdmFyIGdlbiA9IHsKICAgICAgaWQ6IChVKCkudXVpZCA/IFUoKS51dWlkKCkgOiBTdHJpbmcoRGF0ZS5ub3coKSkgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyKSksCiAgICAgIHByb21wdDogX2ltYWdlLnByb21wdCwKICAgICAgcmVtb3RlSW1hZ2VVUkw6IHVybCwKICAgICAgcmVtb3RlT3JpZ2luYWxJbWFnZVVSTDogX2ltYWdlLnJlbW90ZUltYWdlVVJMLAogICAgICBwYXJlbnRJRDogaW1hZ2VJRChfaW1hZ2UpLAogICAgICBzZWVkOiBzZWVkLAogICAgICBtb2RlbDogbW9kZWwsCiAgICAgIGNyZWF0ZWREYXRlOiBEYXRlLm5vdygpIC8gMTAwMAogICAgfTsKICAgIGlmIChhcGkgJiYgdHlwZW9mIGFwaS5wZXJzaXN0SW1hZ2UgPT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkucGVyc2lzdEltYWdlKGdlbikpLnRoZW4oZnVuY3Rpb24gKHNhdmVkKSB7CiAgICAgICAgdmFyIGltZyA9IHVud3JhcChzYXZlZCkgfHwgZ2VuOwogICAgICAgIHB1c2hUb0xpYnJhcnkoaW1nKTsKICAgICAgICByZXR1cm4gaW1nOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHB1c2hUb0xpYnJhcnkoZ2VuKTsgcmV0dXJuIGdlbjsgfSk7CiAgICB9CiAgICBwdXNoVG9MaWJyYXJ5KGdlbik7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGdlbik7CiAgfQoKICBmdW5jdGlvbiBwdXNoVG9MaWJyYXJ5KGltZykgewogICAgdHJ5IHsKICAgICAgdmFyIGxpYiA9IFNUKCkubGlicmFyeSB8fCBbXTsKICAgICAgbGliLnVuc2hpZnQoaW1nKTsKICAgICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5zZXQpIFYuc3RvcmUuc2V0KCdsaWJyYXJ5JywgbGliKTsKICAgICAgZWxzZSBWLnN0YXRlLmxpYnJhcnkgPSBsaWI7CiAgICAgIGlmIChWLnN0b3JlICYmIFYuc3RvcmUuZW1pdCkgVi5zdG9yZS5lbWl0KCdsaWJyYXJ5OmNoYW5nZWQnLCBsaWIpOwogICAgfSBjYXRjaCAoZSkge30KICB9CgogIGZ1bmN0aW9uIGFjdEFuaW1hdGUoYnRuKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICBpZiAoIWFwaSB8fCB0eXBlb2YgYXBpLmdlblZpZGVvTFRYICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBhcGkucG9sbFZpZGVvTFRYICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBhcGkucG9sbCAhPT0gJ2Z1bmN0aW9uJykgewogICAgICB0b2FzdCgnQW5pbWF0aW9uIGlzbuKAmXQgYXZhaWxhYmxlIHJpZ2h0IG5vdy4nLCAnZXJyb3InKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCFfaW1hZ2UucmVtb3RlSW1hZ2VVUkwpIHsgdG9hc3QoJ05vIGltYWdlIHRvIGFuaW1hdGUuJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgY29uZmlybURpYWxvZygnQW5pbWF0ZSB0aGlzIGltYWdlIGludG8gYSBzaG9ydCB2aWRlbz8gQWJvdXQgNTAgY3JlZGl0cy4nLCB7IHRpdGxlOiAnQW5pbWF0ZScsIGNvbmZpcm1MYWJlbDogJ0FuaW1hdGUnIH0pLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgYnVzeShidG4sIHRydWUpOwogICAgICB0b2FzdCgnQW5pbWF0aW5n4oCmIHRoaXMgY2FuIHRha2UgYSBtaW51dGUuJywgJ2luZm8nKTsKICAgICAgX3BvbGxBYm9ydCA9ICh0eXBlb2YgQWJvcnRDb250cm9sbGVyICE9PSAndW5kZWZpbmVkJykgPyBuZXcgQWJvcnRDb250cm9sbGVyKCkgOiBudWxsOwogICAgICB2YXIgc2lnbmFsID0gX3BvbGxBYm9ydCA/IF9wb2xsQWJvcnQuc2lnbmFsIDogdW5kZWZpbmVkOwogICAgICB2YXIgc2VlZCA9IChVKCkucmFuZG9tU2VlZCA/IFUoKS5yYW5kb21TZWVkKCkgOiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTYpKTsKICAgICAgdmFyIHJlcUJvZHkgPSB7IGltYWdlX3VybDogX2ltYWdlLnJlbW90ZUltYWdlVVJMLCBwcm9tcHQ6IF9pbWFnZS5wcm9tcHQgfHwgJycsIHNlZWQ6IHNlZWQgfTsKICAgICAgdmFyIGdlbkltZ0lEID0gaW1hZ2VJRChfaW1hZ2UpOwogICAgICBhcGkucG9sbCgKICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBhcGkuZ2VuVmlkZW9MVFgocmVxQm9keSk7IH0sCiAgICAgICAgZnVuY3Rpb24gKGlkKSB7IHJldHVybiAoYXBpLnBvbGxWaWRlb0xUWC5sZW5ndGggPj0gMikgPyBhcGkucG9sbFZpZGVvTFRYKGlkLCBnZW5JbWdJRCkgOiBhcGkucG9sbFZpZGVvTFRYKGlkKTsgfSwKICAgICAgICB7IHNpZ25hbDogc2lnbmFsLCBvblByb2dyZXNzOiBmdW5jdGlvbiAoKSB7fSB9CiAgICAgICkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgYnVzeShidG4sIGZhbHNlKTsKICAgICAgICBfcG9sbEFib3J0ID0gbnVsbDsKICAgICAgICB2YXIgdXJsID0gKHJlc3VsdCAmJiAocmVzdWx0LnZpZGVvVVJMIHx8IHJlc3VsdC52aWRlb191cmwgfHwKICAgICAgICAgIChyZXN1bHQudmlkZW8gJiYgcmVzdWx0LnZpZGVvLnVybCkgfHwKICAgICAgICAgIChyZXN1bHQuaW1hZ2VzICYmIHJlc3VsdC5pbWFnZXNbMF0gJiYgcmVzdWx0LmltYWdlc1swXS51cmwpKSkgfHwgbnVsbDsKICAgICAgICBpZiAoIXVybCkgeyB0b2FzdCgnQW5pbWF0aW9uIGZpbmlzaGVkIGJ1dCBubyB2aWRlbyBjYW1lIGJhY2suJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgICAgIF9pbWFnZS52aWRlb1VSTCA9IHVybDsKICAgICAgICBhcHBseUltYWdlTXV0YXRpb24oX2ltYWdlKTsKICAgICAgICByZWJ1aWxkTWVkaWEoKTsKICAgICAgICByZWJ1aWxkUGFuZWwoKTsKICAgICAgICB0b2FzdCgnWW91ciBhbmltYXRpb24gaXMgcmVhZHkuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICBpZiAoVi51aSAmJiBWLnVpLmNvbmZldHRpKSB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBidXN5KGJ0biwgZmFsc2UpOwogICAgICAgIF9wb2xsQWJvcnQgPSBudWxsOwogICAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykgcmV0dXJuOwogICAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdBbmltYXRpb24gZmFpbGVkLicsICdlcnJvcicpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gYWN0RG93bmxvYWQoYnRuKSB7CiAgICB2YXIgdXJsID0gX2ltYWdlLnJlbW90ZUltYWdlVVJMIHx8IF9pbWFnZS52aWRlb1VSTDsKICAgIGlmICghdXJsKSB7IHRvYXN0KCdOb3RoaW5nIHRvIGRvd25sb2FkLicsICdlcnJvcicpOyByZXR1cm47IH0KICAgIHZhciBuYW1lID0gJ3ZhbXAtJyArIChpbWFnZUlEKF9pbWFnZSkgfHwgRGF0ZS5ub3coKSk7CiAgICBpZiAoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwgJiYgX2ltYWdlLnJlbW90ZUltYWdlVVJMKSB7CiAgICAgIHZhciB1aSA9IFVJKCk7CiAgICAgIHZhciBtb2RhbFJlZiA9IG51bGw7CiAgICAgIGZ1bmN0aW9uIGRvbmVEbCgpIHsgaWYgKG1vZGFsUmVmICYmIG1vZGFsUmVmLmNsb3NlKSBtb2RhbFJlZi5jbG9zZSgpOyByYXRlKGltYWdlSUQoX2ltYWdlKSwgJ3NhdmUnKTsgfQogICAgICB2YXIgbWVudSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1zbScsIHN0eWxlOiB7IHBhZGRpbmc6ICc0cHgnIH0gfSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdEb3dubG9hZCcsIHN0eWxlOiB7IG1hcmdpbkJvdHRvbTogJzRweCcgfSB9KSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1wcmltYXJ5IHYtY3RhLS1ibG9jaycsIHR5cGU6ICdidXR0b24nLAogICAgICAgICAgb25jbGljazogZnVuY3Rpb24gKCkgeyBkb3dubG9hZChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsIG5hbWUgKyAnLWFmdGVyLmpwZycpOyBkb25lRGwoKTsgfSB9LCAnRG93bmxvYWQgYWZ0ZXInKSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCB2LWN0YS0tYmxvY2snLCB0eXBlOiAnYnV0dG9uJywKICAgICAgICAgIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgZG93bmxvYWQoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwsIG5hbWUgKyAnLWJlZm9yZS5qcGcnKTsgZG9uZURsKCk7IH0gfSwgJ0Rvd25sb2FkIGJlZm9yZScpLAogICAgICAgIGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1ibG9jaycsIHR5cGU6ICdidXR0b24nLAogICAgICAgICAgb25jbGljazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBkb3dubG9hZChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsIG5hbWUgKyAnLWFmdGVyLmpwZycpOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgZG93bmxvYWQoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwsIG5hbWUgKyAnLWJlZm9yZS5qcGcnKTsgfSwgMzUwKTsKICAgICAgICAgICAgZG9uZURsKCk7CiAgICAgICAgICB9IH0sICdEb3dubG9hZCBib3RoJykKICAgICAgKTsKICAgICAgaWYgKHVpICYmIHR5cGVvZiB1aS5tb2RhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIG1vZGFsUmVmID0gdWkubW9kYWwobWVudSwgeyBhcmlhTGFiZWw6ICdEb3dubG9hZCBvcHRpb25zJyB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkb3dubG9hZChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsIG5hbWUgKyAnLWFmdGVyLmpwZycpOwogICAgICAgIHJhdGUoaW1hZ2VJRChfaW1hZ2UpLCAnc2F2ZScpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBleHQgPSBfaW1hZ2UudmlkZW9VUkwgJiYgdXJsID09PSBfaW1hZ2UudmlkZW9VUkwgPyAnLm1wNCcgOiAnLmpwZyc7CiAgICBkb3dubG9hZCh1cmwsIG5hbWUgKyBleHQpOwogICAgcmF0ZShpbWFnZUlEKF9pbWFnZSksICdzYXZlJyk7CiAgICB0b2FzdCgnU2F2ZWQuJywgJ3N1Y2Nlc3MnKTsKICB9CgogIGZ1bmN0aW9uIGFjdEZhdm9yaXRlKGJ0bikgewogICAgdmFyIGFwaSA9IEFQSSgpOwogICAgdmFyIGlkID0gaW1hZ2VJRChfaW1hZ2UpOwogICAgaWYgKCFpZCB8fCAhYXBpIHx8IHR5cGVvZiBhcGkuc2V0RmF2b3JpdGUgIT09ICdmdW5jdGlvbicpIHsgdG9hc3QoJ0Zhdm9yaXRlcyB1bmF2YWlsYWJsZS4nLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICB2YXIgbmV4dCA9ICFfaW1hZ2UuZmF2b3JpdGVkOwogICAgX2ltYWdlLmZhdm9yaXRlZCA9IG5leHQ7CiAgICByZWZsZWN0RmF2b3JpdGUoYnRuLCBuZXh0KTsKICAgIGJ1c3koYnRuLCB0cnVlKTsKICAgIFByb21pc2UucmVzb2x2ZShhcGkuc2V0RmF2b3JpdGUoaWQsIG5leHQpKS50aGVuKGZ1bmN0aW9uICh1cGRhdGVkKSB7CiAgICAgIGJ1c3koYnRuLCBmYWxzZSk7CiAgICAgIHZhciBpbWcgPSB1bndyYXAodXBkYXRlZCk7CiAgICAgIGlmIChpbWcgJiYgdHlwZW9mIGltZy5mYXZvcml0ZWQgPT09ICdib29sZWFuJykgeyBfaW1hZ2UuZmF2b3JpdGVkID0gaW1nLmZhdm9yaXRlZDsgcmVmbGVjdEZhdm9yaXRlKGJ0biwgaW1nLmZhdm9yaXRlZCk7IH0KICAgICAgYXBwbHlJbWFnZU11dGF0aW9uKF9pbWFnZSk7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIGJ1c3koYnRuLCBmYWxzZSk7CiAgICAgIF9pbWFnZS5mYXZvcml0ZWQgPSAhbmV4dDsKICAgICAgcmVmbGVjdEZhdm9yaXRlKGJ0biwgX2ltYWdlLmZhdm9yaXRlZCk7CiAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdDb3VsZG7igJl0IHVwZGF0ZSBmYXZvcml0ZS4nLCAnZXJyb3InKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcmVmbGVjdEZhdm9yaXRlKGJ0biwgb24pIHsKICAgIGlmICghYnRuKSByZXR1cm47CiAgICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCBvbiA/ICd0cnVlJyA6ICdmYWxzZScpOwogICAgdmFyIGljb25XcmFwID0gYnRuLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uLWljb24nKTsKICAgIGlmIChpY29uV3JhcCkgeyBpY29uV3JhcC5pbm5lckhUTUwgPSAnJzsgaWNvbldyYXAuYXBwZW5kQ2hpbGQoaWNvbihvbiA/ICdoZWFydC5maWxsJyA6ICdoZWFydCcpKTsgfQogICAgdmFyIGxibCA9IGJ0bi5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX2FjdGlvbi1sYWJlbCcpOwogICAgaWYgKGxibCkgbGJsLnRleHRDb250ZW50ID0gb24gPyAnRmF2b3JpdGVkJyA6ICdGYXZvcml0ZSc7CiAgICBhcHBseUFjdGlvblRvbmUoYnRuLCB7IGFjdGl2ZTogb24gfSk7CiAgICBpZiAoIW9uICYmIGljb25XcmFwKSBpY29uV3JhcC5zdHlsZS5jb2xvciA9IEFDQ0VOVF9TT0ZUOwogICAgaWYgKCFvbiAmJiBsYmwpIGxibC5zdHlsZS5jb2xvciA9IElOS19TT0ZUOwogICAgaWYgKCFvbikgeyBidG4uc3R5bGUuY29sb3IgPSBJTks7IGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJyc7IH0KICB9CgogIGZ1bmN0aW9uIGFjdERlbGV0ZShidG4pIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIHZhciBpZCA9IGltYWdlSUQoX2ltYWdlKTsKICAgIGlmICghaWQgfHwgIWFwaSB8fCB0eXBlb2YgYXBpLmRlbGV0ZUltYWdlICE9PSAnZnVuY3Rpb24nKSB7IHRvYXN0KCdEZWxldGUgdW5hdmFpbGFibGUuJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgY29uZmlybURpYWxvZygnRGVsZXRlIHRoaXMgaW1hZ2U/IFRoaXMgY2Fu4oCZdCBiZSB1bmRvbmUuJywgeyB0aXRsZTogJ0RlbGV0ZSBpbWFnZScsIGRlc3RydWN0aXZlOiB0cnVlLCBjb25maXJtTGFiZWw6ICdEZWxldGUnIH0pLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgYnVzeShidG4sIHRydWUpOwogICAgICBQcm9taXNlLnJlc29sdmUoYXBpLmRlbGV0ZUltYWdlKGlkKSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgcmF0ZShpZCwgJ2RlbGV0ZScpOwogICAgICAgIHJlbW92ZUZyb21TdGF0ZShpZCk7CiAgICAgICAgdG9hc3QoJ0ltYWdlIGRlbGV0ZWQuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICB2YXIgZnJlc2ggPSAoU1QoKS5saWJyYXJ5IHx8IFtdKS5tYXAodW53cmFwKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGltYWdlSUQoeCk7IH0pOwogICAgICAgIGlmIChmcmVzaC5sZW5ndGgpIHsKICAgICAgICAgIHZhciB0YXJnZXQgPSBmcmVzaFtNYXRoLm1pbihfaW5kZXgsIGZyZXNoLmxlbmd0aCAtIDEpXTsKICAgICAgICAgIGlmICh0YXJnZXQgJiYgaW1hZ2VJRCh0YXJnZXQpICE9PSBpZCkgeyBnbygnIy9pbWFnZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGltYWdlSUQodGFyZ2V0KSkpOyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgY2xvc2UoKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgIGJ1c3koYnRuLCBmYWxzZSk7CiAgICAgICAgdG9hc3QoKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ0RlbGV0ZSBmYWlsZWQuJywgJ2Vycm9yJyk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZW1vdmVGcm9tU3RhdGUoaWQpIHsKICAgIHRyeSB7CiAgICAgIFsnbGlicmFyeScsICdmZWVkJ10uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgdmFyIGFyciA9IFNUKClba2V5XTsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuOwogICAgICAgIHZhciBmaWx0ZXJlZCA9IGFyci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGltYWdlSUQodW53cmFwKHgpKSAhPT0gaWQ7IH0pOwogICAgICAgIGlmIChWLnN0b3JlICYmIFYuc3RvcmUuc2V0KSBWLnN0b3JlLnNldChrZXksIGZpbHRlcmVkKTsKICAgICAgICBlbHNlIFYuc3RhdGVba2V5XSA9IGZpbHRlcmVkOwogICAgICB9KTsKICAgICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5lbWl0KSBWLnN0b3JlLmVtaXQoJ2xpYnJhcnk6Y2hhbmdlZCcsIFNUKCkubGlicmFyeSk7CiAgICB9IGNhdGNoIChlKSB7fQogIH0KCiAgZnVuY3Rpb24gYWN0U2hhcmUoYnRuKSB7CiAgICB2YXIgaWQgPSBpbWFnZUlEKF9pbWFnZSk7CiAgICB2YXIgYmFzZSA9IChWLmNvbmZpZyAmJiBWLmNvbmZpZy5BUEkpID8gVi5jb25maWcuQVBJIDogJ2h0dHBzOi8vYXBpLnZvb3NleS5jb20nOwogICAgdmFyIHJlbmRlclVSTCA9IGlkID8gYmFzZSArICcvZ2VuZXJhdGVkL3JlbmRlci8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSA6IG51bGw7CiAgICB2YXIgdGV4dCA9IChfaW1hZ2UucHJvbXB0ID8gX2ltYWdlLnByb21wdCArICdcblxuJyA6ICcnKSArICdNYWRlIHdpdGggVmFtcCBieSBWb29zZXkuJzsKICAgIHJhdGUoaWQsICdzaGFyZScpOwogICAgaWYgKG5hdmlnYXRvci5zaGFyZSAmJiByZW5kZXJVUkwpIHsKICAgICAgbmF2aWdhdG9yLnNoYXJlKHsgdGl0bGU6ICdWYW1wJywgdGV4dDogdGV4dCwgdXJsOiByZW5kZXJVUkwgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykgcmV0dXJuOwogICAgICAgIGNvcHlTaGFyZUxpbmsocmVuZGVyVVJMKTsKICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChyZW5kZXJVUkwpIHsgY29weVNoYXJlTGluayhyZW5kZXJVUkwpOyB9CiAgICBlbHNlIGlmIChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwpIHsgZG93bmxvYWQoX2ltYWdlLnJlbW90ZUltYWdlVVJMLCAndmFtcC0nICsgKGlkIHx8IERhdGUubm93KCkpICsgJy5qcGcnKTsgdG9hc3QoJ0ltYWdlIGRvd25sb2FkZWQuJywgJ3N1Y2Nlc3MnKTsgfQogICAgZWxzZSB7IHRvYXN0KCdOb3RoaW5nIHRvIHNoYXJlLicsICdlcnJvcicpOyB9CiAgfQoKICBmdW5jdGlvbiBjb3B5U2hhcmVMaW5rKHVybCkgewogICAgY29weVRleHQodXJsKS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/ICdTaGFyZSBsaW5rIGNvcGllZC4nIDogJ0NvcHkgdGhpcyBsaW5rOiAnICsgdXJsLCBvayA/ICdzdWNjZXNzJyA6ICdpbmZvJyk7IH0pOwogIH0KCiAgZnVuY3Rpb24gY29weVRleHQoc3RyKSB7CiAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkgewogICAgICByZXR1cm4gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc3RyKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9KTsKICAgIH0KICAgIHRyeSB7CiAgICAgIHZhciB0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICAgIHRhLnZhbHVlID0gc3RyOyB0YS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7IHRhLnN0eWxlLm9wYWNpdHkgPSAnMCc7CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOyB0YS5zZWxlY3QoKTsKICAgICAgdmFyIG9rID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsKICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0YSk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUob2spOwogICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsgfQogIH0KCiAgZnVuY3Rpb24gYWN0Q29weVByb21wdCgpIHsKICAgIGlmICghX2ltYWdlLnByb21wdCkgeyB0b2FzdCgnTm8gcHJvbXB0IHRvIGNvcHkuJywgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICBjb3B5VGV4dChfaW1hZ2UucHJvbXB0KS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/ICdQcm9tcHQgY29waWVkLicgOiAnQ291bGRu4oCZdCBjb3B5LicsIG9rID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJyk7IH0pOwogIH0KCiAgZnVuY3Rpb24gYWN0UHVibGlzaChidG4pIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIGlmICghYXBpKSB7IHRvYXN0KCdQdWJsaXNoaW5nIHVuYXZhaWxhYmxlLicsICdlcnJvcicpOyByZXR1cm47IH0KICAgIGNvbmZpcm1EaWFsb2coJ1B1Ymxpc2ggdGhpcyBpbWFnZSB0byB0aGUgcHVibGljIGZlZWQ/JywgeyB0aXRsZTogJ1B1Ymxpc2gnLCBjb25maXJtTGFiZWw6ICdQdWJsaXNoJyB9KS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIGJ1c3koYnRuLCB0cnVlKTsKICAgICAgZW5zdXJlUHJvZmlsZSgpLnRoZW4oZnVuY3Rpb24gKHByb2ZpbGVJRCkgewogICAgICAgIGlmICghcHJvZmlsZUlEKSB0aHJvdyBuZXcgRXJyb3IoJ05vIHByb2ZpbGUgYXZhaWxhYmxlLicpOwogICAgICAgIHJldHVybiBkb1B1Ymxpc2gocHJvZmlsZUlEKTsKICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgYnVzeShidG4sIGZhbHNlKTsKICAgICAgICBfaW1hZ2UucHVibGlzaGVkID0gdHJ1ZTsKICAgICAgICBhcHBseUltYWdlTXV0YXRpb24oX2ltYWdlKTsKICAgICAgICBhcHBseUFjdGlvblRvbmUoYnRuLCB7IGFjdGl2ZTogdHJ1ZSB9KTsKICAgICAgICB2YXIgbGJsID0gYnRuLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uLWxhYmVsJyk7CiAgICAgICAgaWYgKGxibCkgbGJsLnRleHRDb250ZW50ID0gJ1B1Ymxpc2hlZCc7CiAgICAgICAgdG9hc3QoJ1B1Ymxpc2hlZCB0byB5b3VyIGZlZWQuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICBpZiAoVi51aSAmJiBWLnVpLmNvbmZldHRpKSB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBidXN5KGJ0biwgZmFsc2UpOwogICAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdQdWJsaXNoIGZhaWxlZC4nLCAnZXJyb3InKTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGVuc3VyZVByb2ZpbGUoKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICB2YXIgcGlkID0gKFNUKCkucHJvZmlsZSAmJiAoU1QoKS5wcm9maWxlLmlkIHx8IChTVCgpLnByb2ZpbGUubWljcm8gJiYgU1QoKS5wcm9maWxlLm1pY3JvLmlkKSkpIHx8CiAgICAgIChTVCgpLnVzZXIgJiYgKFNUKCkudXNlci5wcm9maWxlSUQgfHwgKFNUKCkudXNlci5wcm9maWxlICYmIFNUKCkudXNlci5wcm9maWxlLmlkKSkpIHx8IG51bGw7CiAgICBpZiAocGlkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBpZCk7CiAgICBpZiAodHlwZW9mIGFwaS5nZXRQcml2YXRlUHJvZmlsZSA9PT0gJ2Z1bmN0aW9uJyAmJiAoU1QoKS51c2VyICYmIChTVCgpLnVzZXIucHJvZmlsZUlEIHx8IFNUKCkudXNlci5pZCkpKSB7CiAgICAgIHZhciB0cnlJRCA9IFNUKCkudXNlci5wcm9maWxlSUQgfHwgU1QoKS51c2VyLmlkOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaS5nZXRQcml2YXRlUHJvZmlsZSh0cnlJRCkpLnRoZW4oZnVuY3Rpb24gKHApIHsKICAgICAgICB2YXIgaWQgPSBwICYmIChwLmlkIHx8IChwLmdsb2JhbCAmJiBwLmdsb2JhbC5taWNybyAmJiBwLmdsb2JhbC5taWNyby5pZCkgfHwgKHAubWljcm8gJiYgcC5taWNyby5pZCkpOwogICAgICAgIGlmIChpZCkgcmV0dXJuIGlkOwogICAgICAgIHJldHVybiBjcmVhdGVQcm9maWxlRmxvdygpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBjcmVhdGVQcm9maWxlRmxvdygpOyB9KTsKICAgIH0KICAgIHJldHVybiBjcmVhdGVQcm9maWxlRmxvdygpOwogIH0KCiAgZnVuY3Rpb24gY3JlYXRlUHJvZmlsZUZsb3coKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICBpZiAodHlwZW9mIGFwaS5jcmVhdGVQcm9maWxlICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgdmFyIG5hbWUgPSAoU1QoKS51c2VyICYmIChTVCgpLnVzZXIubmFtZSB8fCBTVCgpLnVzZXIudXNlcm5hbWUgfHwgU1QoKS51c2VyLmZpcnN0TmFtZSkpIHx8ICdNeSBTdHVkaW8nOwogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkuY3JlYXRlUHJvZmlsZSh7IGRpc3BsYXlOYW1lOiBuYW1lIH0pKS50aGVuKGZ1bmN0aW9uIChwKSB7CiAgICAgIHZhciBpZCA9IHAgJiYgKHAuaWQgfHwgKHAuZ2xvYmFsICYmIHAuZ2xvYmFsLm1pY3JvICYmIHAuZ2xvYmFsLm1pY3JvLmlkKSB8fCAocC5taWNybyAmJiBwLm1pY3JvLmlkKSk7CiAgICAgIGlmIChpZCAmJiBWLnN0b3JlICYmIFYuc3RvcmUuc2V0KSBWLnN0b3JlLnNldCgncHJvZmlsZScsIHApOwogICAgICByZXR1cm4gaWQ7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9KTsKICB9CgogIGZ1bmN0aW9uIGRvUHVibGlzaChwcm9maWxlSUQpIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIGlmICh0eXBlb2YgYXBpLnB1Ymxpc2hJbWFnZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVycm9yKCdQdWJsaXNoaW5nIHVuYXZhaWxhYmxlLicpOwogICAgdmFyIHBheWxvYWQgPSB7CiAgICAgIGlkOiBfaW1hZ2UuaWQgfHwgaW1hZ2VJRChfaW1hZ2UpLAogICAgICByZW1vdGVJRDogX2ltYWdlLnJlbW90ZUlELAogICAgICBwcm9tcHQ6IF9pbWFnZS5wcm9tcHQsCiAgICAgIHJlbW90ZUltYWdlVVJMOiBfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsCiAgICAgIHJlbW90ZU9yaWdpbmFsSW1hZ2VVUkw6IF9pbWFnZS5yZW1vdGVPcmlnaW5hbEltYWdlVVJMLAogICAgICBtb2RlbDogX2ltYWdlLm1vZGVsLAogICAgICBzZWVkOiBfaW1hZ2Uuc2VlZCwKICAgICAgdmlkZW9VUkw6IF9pbWFnZS52aWRlb1VSTCwKICAgICAgdGFnczogX2ltYWdlLnRhZ3MsCiAgICAgIGNyZWF0ZWREYXRlOiBfaW1hZ2UuY3JlYXRlZERhdGUKICAgIH07CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaS5wdWJsaXNoSW1hZ2UocHJvZmlsZUlELCBwYXlsb2FkKSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBpZCA9IGltYWdlSUQoX2ltYWdlKTsKICAgICAgaWYgKGlkICYmIHR5cGVvZiBhcGkuc2V0UHVibGlzaGVkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkuc2V0UHVibGlzaGVkKGlkLCB0cnVlKSkuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgICB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGFjdFNhdmVQcmVzZXQoKSB7CiAgICBpZiAoIV9pbWFnZS5wcm9tcHQpIHsgdG9hc3QoJ05vIHByb21wdCB0byBzYXZlLicsICdpbmZvJyk7IHJldHVybjsgfQogICAgdmFyIHVpID0gVUkoKTsKICAgIHZhciBuYW1lSW5wdXQgPSBlbCgnaW5wdXQnLCB7IGNsYXNzOiAndi1maWVsZCcsIHR5cGU6ICd0ZXh0JywgcGxhY2Vob2xkZXI6ICdQcmVzZXQgbmFtZScsIHZhbHVlOiAoX2ltYWdlLnByb21wdCB8fCAnJykuc2xpY2UoMCwgNDApIH0pOwogICAgdmFyIHByb21wdEFyZWEgPSBlbCgndGV4dGFyZWEnLCB7IGNsYXNzOiAndi10ZXh0YXJlYScsIHJvd3M6IDQgfSk7CiAgICBwcm9tcHRBcmVhLnZhbHVlID0gX2ltYWdlLnByb21wdCB8fCAnJzsKICAgIHZhciBzdGF0dXMgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZmllbGQtaGludCcsICdhcmlhLWxpdmUnOiAncG9saXRlJywgc3R5bGU6IHsgbWluSGVpZ2h0OiAnMTZweCcgfSB9KTsKICAgIHZhciBzYXZlQnRuID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tYmxvY2snLCB0eXBlOiAnYnV0dG9uJyB9LCAnU2F2ZSBwcmVzZXQnKTsKICAgIHZhciBib2R5ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLXNtJywgc3R5bGU6IHsgcGFkZGluZzogJzRweCcsIG1pbldpZHRoOiAnbWluKDg2dncsIDM4MHB4KScgfSB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdTYXZlIGFzIHByZXNldCcgfSksCiAgICAgIGVsKCdsYWJlbCcsIHsgY2xhc3M6ICd2LWxhYmVsJywgdGV4dDogJ05hbWUnIH0pLCBuYW1lSW5wdXQsCiAgICAgIGVsKCdsYWJlbCcsIHsgY2xhc3M6ICd2LWxhYmVsJywgdGV4dDogJ1Byb21wdCcgfSksIHByb21wdEFyZWEsCiAgICAgIHN0YXR1cywKICAgICAgc2F2ZUJ0bgogICAgKTsKICAgIHZhciBtb2RhbFJlZiA9ICh1aSAmJiB0eXBlb2YgdWkubW9kYWwgPT09ICdmdW5jdGlvbicpID8gdWkubW9kYWwoYm9keSwgeyBhcmlhTGFiZWw6ICdTYXZlIHByZXNldCcgfSkgOiBudWxsOwogICAgc2F2ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG5hbWUgPSAobmFtZUlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIHZhciBwcm9tcHQgPSAocHJvbXB0QXJlYS52YWx1ZSB8fCAnJykudHJpbSgpOwogICAgICBpZiAoIW5hbWUpIHsgc3RhdHVzLnRleHRDb250ZW50ID0gJ0dpdmUgeW91ciBwcmVzZXQgYSBuYW1lLic7IG5hbWVJbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgaWYgKCFwcm9tcHQpIHsgc3RhdHVzLnRleHRDb250ZW50ID0gJ0EgcHJvbXB0IGlzIHJlcXVpcmVkLic7IHByb21wdEFyZWEuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSB0cnVlOyBzdGF0dXMudGV4dENvbnRlbnQgPSAnU2F2aW5n4oCmJzsKICAgICAgc2F2ZVByZXNldCh7IG5hbWU6IG5hbWUsIHByb21wdDogcHJvbXB0LCBtb2RlbDogX2ltYWdlLm1vZGVsIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChtb2RhbFJlZiAmJiBtb2RhbFJlZi5jbG9zZSkgbW9kYWxSZWYuY2xvc2UoKTsKICAgICAgICB0b2FzdCgnUHJlc2V0IHNhdmVkLicsICdzdWNjZXNzJyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ0NvdWxkbuKAmXQgc2F2ZSBwcmVzZXQuJzsKICAgICAgfSk7CiAgICB9KTsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBuYW1lSW5wdXQuZm9jdXMoKTsgbmFtZUlucHV0LnNlbGVjdCgpOyB9LCAzMCk7CiAgfQoKICBmdW5jdGlvbiBzYXZlUHJlc2V0KHApIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIHZhciBwcmVzZXQgPSB7CiAgICAgIGlkOiAoVSgpLnV1aWQgPyBVKCkudXVpZCgpIDogU3RyaW5nKERhdGUubm93KCkpKSwKICAgICAgbmFtZTogcC5uYW1lLCBwcm9tcHQ6IHAucHJvbXB0LCBuZWdhdGl2ZVByb21wdDogbnVsbCwgbW9kZWw6IHAubW9kZWwgfHwgbnVsbAogICAgfTsKICAgIHRyeSB7CiAgICAgIHZhciBsaXN0ID0gU1QoKS5wcmVzZXRzIHx8IFtdOwogICAgICBsaXN0LnB1c2gocHJlc2V0KTsKICAgICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5zZXQpIFYuc3RvcmUuc2V0KCdwcmVzZXRzJywgbGlzdCk7CiAgICAgIGVsc2UgVi5zdGF0ZS5wcmVzZXRzID0gbGlzdDsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgICBpZiAoVi5wcmVzZXRzICYmIHR5cGVvZiBWLnByZXNldHMuY3JlYXRlID09PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFYucHJlc2V0cy5jcmVhdGUocHJlc2V0KSk7CiAgICBpZiAoYXBpICYmIHR5cGVvZiBhcGkuY3JlYXRlUHJlc2V0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaS5jcmVhdGVQcmVzZXQocHJlc2V0KSk7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByZXNldCk7CiAgfQoKICBmdW5jdGlvbiBhcHBseUltYWdlTXV0YXRpb24oaW1nKSB7CiAgICB0cnkgewogICAgICB2YXIgaWQgPSBpbWFnZUlEKGltZyk7CiAgICAgIFsnbGlicmFyeScsICdmZWVkJ10uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgdmFyIGFyciA9IFNUKClba2V5XTsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgdSA9IHVud3JhcChhcnJbaV0pOwogICAgICAgICAgaWYgKGltYWdlSUQodSkgPT09IGlkKSB7IE9iamVjdC5hc3NpZ24odSwgaW1nKTsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBpZiAoVi5zdG9yZSAmJiBWLnN0b3JlLmVtaXQpIFYuc3RvcmUuZW1pdCgnbGlicmFyeTpjaGFuZ2VkJywgU1QoKS5saWJyYXJ5KTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiByZWJ1aWxkTWVkaWEoKSB7CiAgICBpZiAoIV9ub2RlKSByZXR1cm47CiAgICB2YXIgbW91bnQgPSBfbm9kZS5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX21lZGlhJyk7CiAgICBpZiAoIW1vdW50KSByZXR1cm47CiAgICBkZXN0cm95U2NydWIoKTsKICAgIG1vdW50LmlubmVySFRNTCA9ICcnOwogICAgbW91bnQuYXBwZW5kQ2hpbGQoYnVpbGRNZWRpYSgpKTsKICB9CgogIGZ1bmN0aW9uIHJlYnVpbGRQYW5lbCgpIHsKICAgIGlmICghX25vZGUpIHJldHVybjsKICAgIHZhciBvbGQgPSBfbm9kZS5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX3BhbmVsJyk7CiAgICBpZiAoIW9sZCkgcmV0dXJuOwogICAgdmFyIGZyZXNoID0gYnVpbGRQYW5lbCgpOwogICAgb2xkLnJlcGxhY2VXaXRoKGZyZXNoKTsKICB9CgogIGZ1bmN0aW9uIGRlc3Ryb3lTY3J1YigpIHsKICAgIGlmIChfc2NydWJOb2RlKSB7CiAgICAgIGlmICh0eXBlb2YgX3NjcnViTm9kZS5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IF9zY3J1Yk5vZGUuZGVzdHJveSgpOyB9IGNhdGNoIChlKSB7fSB9CiAgICB9CiAgICBfc2NydWJOb2RlID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkUGFuZWwoKSB7CiAgICB2YXIgcGFuZWwgPSBlbCgnYXNpZGUnLCB7IGNsYXNzOiAndi1zdHVkaW9fX3BhbmVsIGdsYXNzLWNhcmQnLCAnYXJpYS1sYWJlbCc6ICdJbWFnZSBkZXRhaWxzJywgc3R5bGU6IHBhbmVsU3R5bGUoKSB9KTsKCiAgICBpZiAoX2ltYWdlLnByb21wdCAmJiAhX2ltYWdlLmhpZGVQcm9tcHQpIHsKICAgICAgdmFyIHByb21wdEJ0biA9IGVsKCdidXR0b24nLCB7CiAgICAgICAgY2xhc3M6ICd2LXN0dWRpb19fcHJvbXB0JywgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgdGl0bGU6ICdDb3B5IHByb21wdCcsICdhcmlhLWxhYmVsJzogJ0NvcHkgcHJvbXB0IHRvIGNsaXBib2FyZCcsCiAgICAgICAgc3R5bGU6IHsKICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzhweCcsIHdpZHRoOiAnMTAwJScsIHRleHRBbGlnbjogJ2xlZnQnLAogICAgICAgICAgYmFja2dyb3VuZDogQ0FSRF9CRywgYm9yZGVyOiAnMXB4IHNvbGlkICcgKyBMSU5FLCBib3JkZXJSYWRpdXM6ICd2YXIoLS1yYWRpdXMtY29udGVudCwgMTJweCknLAogICAgICAgICAgcGFkZGluZzogJzE0cHggMTZweCcsIGN1cnNvcjogJ3BvaW50ZXInLCBjb2xvcjogSU5LLCBmb250OiAnaW5oZXJpdCcKICAgICAgICB9CiAgICAgIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX3Byb21wdC10ZXh0JywgdGV4dDogX2ltYWdlLnByb21wdCwgc3R5bGU6IHsKICAgICAgICAgIGZvbnRTaXplOiAnMTVweCcsIGxpbmVIZWlnaHQ6ICcxLjQ1JywgY29sb3I6IElOSywgd2hpdGVTcGFjZTogJ3ByZS13cmFwJwogICAgICAgIH0gfSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX3Byb21wdC1jb3B5Jywgc3R5bGU6IHsKICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBnYXA6ICc2cHgnLCBmb250U2l6ZTogJzEycHgnLAogICAgICAgICAgZm9udFdlaWdodDogJzYwMCcsIGNvbG9yOiBBQ0NFTlRfU09GVAogICAgICAgIH0gfSwgaWNvbignY29weScpLCBlbCgnc3BhbicsIHsgdGV4dDogJ0NvcHkgcHJvbXB0JyB9KSkKICAgICAgKTsKICAgICAgcHJvbXB0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWN0Q29weVByb21wdCk7CiAgICAgIHBhbmVsLmFwcGVuZENoaWxkKHByb21wdEJ0bik7CiAgICB9IGVsc2UgaWYgKF9pbWFnZS5oaWRlUHJvbXB0KSB7CiAgICAgIHBhbmVsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX3Byb21wdCB2LW11dGVkJywgdGV4dDogJ1Byb21wdCBoaWRkZW4nLCBzdHlsZTogewogICAgICAgIHBhZGRpbmc6ICcxNHB4IDE2cHgnLCBib3JkZXI6ICcxcHggZGFzaGVkICcgKyBMSU5FLCBib3JkZXJSYWRpdXM6ICd2YXIoLS1yYWRpdXMtY29udGVudCwgMTJweCknLCBjb2xvcjogSU5LX1NPRlQKICAgICAgfSB9KSk7CiAgICB9CgogICAgdmFyIG1ldGEgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19tZXRhJywgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBmbGV4V3JhcDogJ3dyYXAnLCBnYXA6ICc4cHgnIH0gfSk7CiAgICBpZiAoX2ltYWdlLm1vZGVsKSBtZXRhLmFwcGVuZENoaWxkKG1ldGFDaGlwKCdNb2RlbCcsIG1vZGVsTGFiZWwoX2ltYWdlLm1vZGVsKSkpOwogICAgdmFyIGRpbXMgPSBpbWFnZURpbWVuc2lvbnMoX2ltYWdlKTsKICAgIGlmIChkaW1zKSBtZXRhLmFwcGVuZENoaWxkKG1ldGFDaGlwKCdTaXplJywgZGltcykpOwogICAgaWYgKF9pbWFnZS5zZWVkICE9IG51bGwpIG1ldGEuYXBwZW5kQ2hpbGQobWV0YUNoaXAoJ1NlZWQnLCBTdHJpbmcoX2ltYWdlLnNlZWQpKSk7CiAgICB2YXIgY29zdCA9IGNyZWRpdENvc3QoX2ltYWdlKTsKICAgIGlmIChjb3N0ICE9IG51bGwpIG1ldGEuYXBwZW5kQ2hpbGQobWV0YUNoaXAoJ0NyZWRpdHMnLCBTdHJpbmcoY29zdCkpKTsKICAgIHZhciBkdCA9IGZtdERhdGUoX2ltYWdlLmNyZWF0ZWREYXRlKTsKICAgIGlmIChkdCkgbWV0YS5hcHBlbmRDaGlsZChtZXRhQ2hpcCgnQ3JlYXRlZCcsIGR0KSk7CiAgICBpZiAoX2ltYWdlLmZhdm9yaXRlZCkgbWV0YS5hcHBlbmRDaGlsZChtZXRhQ2hpcCgnJywgJ0Zhdm9yaXRlZCcsIEFDQ0VOVCkpOwogICAgaWYgKF9pbWFnZS5wdWJsaXNoZWQpIG1ldGEuYXBwZW5kQ2hpbGQobWV0YUNoaXAoJycsICdQdWJsaXNoZWQnLCBBQ0NFTlQpKTsKICAgIGlmIChtZXRhLmNoaWxkTm9kZXMubGVuZ3RoKSB7CiAgICAgIHBhbmVsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2dyb3VwJyB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2dyb3VwLWhlYWQgdi1leWVicm93JywgdGV4dDogJ0RldGFpbHMnIH0pLAogICAgICAgIG1ldGEKICAgICAgKSk7CiAgICB9CgogICAgcGFuZWwuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0dWRpb19fZ3JvdXAnIH0sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2dyb3VwLWhlYWQgdi1leWVicm93JywgdGV4dDogJ0FjdGlvbnMnIH0pLAogICAgICBidWlsZEFjdGlvbkJhcigpCiAgICApKTsKICAgIHJldHVybiBwYW5lbDsKICB9CgogIGZ1bmN0aW9uIHBhbmVsU3R5bGUoKSB7CiAgICByZXR1cm4gewogICAgICBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcxNHB4JywKICAgICAgd2lkdGg6ICdtaW4oMzgwcHgsIDkydncpJywgZmxleDogJzAgMCBhdXRvJywKICAgICAgbWF4SGVpZ2h0OiAnMTAwJScsIG92ZXJmbG93WTogJ2F1dG8nLCBvdmVyZmxvd1g6ICdoaWRkZW4nLAogICAgICBwYWRkaW5nOiAnMjBweCcsIGJvcmRlclJhZGl1czogJ3ZhcigtLXJhZGl1cy1wYW5lbCwgMjIuNXB4KScsCiAgICAgIFdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiAndG91Y2gnCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gbWV0YUNoaXAobGFiZWwsIHZhbHVlLCB0b25lKSB7CiAgICByZXR1cm4gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jaGlwJywgc3R5bGU6IHsKICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGdhcDogJzZweCcsCiAgICAgIHBhZGRpbmc6ICc2cHggMTJweCcsIGJvcmRlclJhZGl1czogJ3ZhcigtLXJhZGl1cy1waWxsLCA2M3B4KScsCiAgICAgIGJhY2tncm91bmQ6IHRvbmUgPyAnY29sb3ItbWl4KGluIHNyZ2IsICcgKyB0b25lICsgJyAxNiUsIHRyYW5zcGFyZW50KScgOiBDQVJEX0JHLAogICAgICBib3JkZXI6ICcxcHggc29saWQgJyArICh0b25lID8gJ2NvbG9yLW1peChpbiBzcmdiLCAnICsgdG9uZSArICcgNDUlLCB0cmFuc3BhcmVudCknIDogTElORSksCiAgICAgIGZvbnRTaXplOiAnMTJweCcsIHdoaXRlU3BhY2U6ICdub3dyYXAnCiAgICB9IH0sCiAgICAgIGxhYmVsID8gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tb25vJywgdGV4dDogbGFiZWwsIHN0eWxlOiB7IGNvbG9yOiBJTktfU09GVCwgdGV4dFRyYW5zZm9ybTogJ3VwcGVyY2FzZScsIGxldHRlclNwYWNpbmc6ICcwLjA4ZW0nLCBmb250U2l6ZTogJzEwcHgnIH0gfSkgOiBudWxsLAogICAgICBlbCgnc3BhbicsIHsgdGV4dDogdmFsdWUsIHN0eWxlOiB7IGNvbG9yOiB0b25lID8gdG9uZSA6IElOSywgZm9udFdlaWdodDogJzYwMCcgfSB9KQogICAgKTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkQWN0aW9uQmFyKCkgewogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19hY3Rpb25zLXdyYXAnLCBzdHlsZTogewogICAgICBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcxMHB4JwogICAgfSB9KTsKICAgIHZhciBvd24gPSBpc093bkltYWdlKF9pbWFnZSk7CgogICAgdmFyIHJldmFtcCA9IGVsKCdidXR0b24nLCB7CiAgICAgIGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnkgdi1jdGEtLWJsb2NrIHYtc3R1ZGlvX19yZXZhbXAnLCB0eXBlOiAnYnV0dG9uJywKICAgICAgdGl0bGU6ICdSZXZhbXAnLCAnYXJpYS1sYWJlbCc6ICdSZXZhbXAgdGhpcyBpbWFnZSBpbiBDcmVhdGUnCiAgICB9LCBpY29uKCdlZGl0JyksIGVsKCdzcGFuJywgeyB0ZXh0OiAnUmV2YW1wJyB9KSk7CiAgICByZXZhbXAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGFjdEVkaXQoKTsgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKHJldmFtcCk7CgogICAgdmFyIGJhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2FjdGlvbnMgZ2xhc3MtbmF2Jywgcm9sZTogJ3Rvb2xiYXInLCAnYXJpYS1sYWJlbCc6ICdJbWFnZSBhY3Rpb25zJywgc3R5bGU6IHsKICAgICAgZGlzcGxheTogJ2dyaWQnLCBncmlkVGVtcGxhdGVDb2x1bW5zOiAncmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoNjRweCwgMWZyKSknLCBnYXA6ICc2cHgnLAogICAgICBwYWRkaW5nOiAnMTBweCcsIGJvcmRlclJhZGl1czogJ3ZhcigtLXJhZGl1cy1wYW5lbCwgMjIuNXB4KScKICAgIH0gfSk7CgogICAgYmFyLmFwcGVuZENoaWxkKGdsYXNzQnRuKCd2YXJpYXRpb25zJywgJ1ZhcmlhdGlvbnMnLCBhY3RWYXJpYXRpb25zKSk7CiAgICBpZiAoIV9pbWFnZS52aWRlb1VSTCkgYmFyLmFwcGVuZENoaWxkKGdsYXNzQnRuKCdhbmltYXRlJywgJ0FuaW1hdGUnLCBhY3RBbmltYXRlKSk7CiAgICBiYXIuYXBwZW5kQ2hpbGQoZ2xhc3NCdG4oJ2Rvd25sb2FkJywgJ1NhdmUnLCBhY3REb3dubG9hZCkpOwogICAgaWYgKG93bikgewogICAgICBiYXIuYXBwZW5kQ2hpbGQoZ2xhc3NCdG4oX2ltYWdlLmZhdm9yaXRlZCA/ICdoZWFydC5maWxsJyA6ICdoZWFydCcsCiAgICAgICAgX2ltYWdlLmZhdm9yaXRlZCA/ICdGYXZvcml0ZWQnIDogJ0Zhdm9yaXRlJywgYWN0RmF2b3JpdGUsCiAgICAgICAgeyB0b2dnbGU6IHRydWUsIGFjdGl2ZTogISFfaW1hZ2UuZmF2b3JpdGVkIH0pKTsKICAgIH0KICAgIGJhci5hcHBlbmRDaGlsZChnbGFzc0J0bignc2hhcmUnLCAnU2hhcmUnLCBhY3RTaGFyZSkpOwogICAgaWYgKG93bikgewogICAgICBiYXIuYXBwZW5kQ2hpbGQoZ2xhc3NCdG4oJ3B1Ymxpc2gnLCBfaW1hZ2UucHVibGlzaGVkID8gJ1B1Ymxpc2hlZCcgOiAnUHVibGlzaCcsIGFjdFB1Ymxpc2gsIHsgYWN0aXZlOiAhIV9pbWFnZS5wdWJsaXNoZWQgfSkpOwogICAgfQogICAgaWYgKF9pbWFnZS5wcm9tcHQpIGJhci5hcHBlbmRDaGlsZChnbGFzc0J0bignYm9va21hcmsnLCAnUHJlc2V0JywgYWN0U2F2ZVByZXNldCkpOwogICAgaWYgKG93bikgYmFyLmFwcGVuZENoaWxkKGdsYXNzQnRuKCd0cmFzaCcsICdEZWxldGUnLCBhY3REZWxldGUsIHsgZGFuZ2VyOiB0cnVlIH0pKTsKICAgIHdyYXAuYXBwZW5kQ2hpbGQoYmFyKTsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gd2lyZVN3aXBlRGlzbWlzcyhub2RlKSB7CiAgICB2YXIgc3RhcnRZID0gMCwgc3RhcnRYID0gMCwgY3VyWSA9IDAsIGRyYWdnaW5nID0gZmFsc2UsIGxvY2tlZCA9IGZhbHNlOwogICAgdmFyIHRocmVzaG9sZCA9IDExMDsKICAgIGZ1bmN0aW9uIG9uU3RhcnQoZSkgewogICAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlcy5sZW5ndGggPiAxKSByZXR1cm47CiAgICAgIHZhciB0ID0gZS50YXJnZXQ7CiAgICAgIHdoaWxlICh0ICYmIHQgIT09IG5vZGUpIHsKICAgICAgICBpZiAodC5jbGFzc0xpc3QgJiYgKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCd2c2NydWInKSB8fCB0LmNsYXNzTGlzdC5jb250YWlucygndmNhcmQnKSB8fAogICAgICAgICAgdC5jbGFzc0xpc3QuY29udGFpbnMoJ3Ytc3R1ZGlvX19hY3Rpb25zJykgfHwgdC5jbGFzc0xpc3QuY29udGFpbnMoJ3Ytc3R1ZGlvX19wYW5lbCcpIHx8CiAgICAgICAgICB0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8IHQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fCB0LnRhZ05hbWUgPT09ICdJTlBVVCcpKSByZXR1cm47CiAgICAgICAgdCA9IHQucGFyZW50Tm9kZTsKICAgICAgfQogICAgICBzdGFydFkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WTsgc3RhcnRYID0gZS50b3VjaGVzWzBdLmNsaWVudFg7CiAgICAgIGN1clkgPSBzdGFydFk7IGRyYWdnaW5nID0gdHJ1ZTsgbG9ja2VkID0gZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiBvbk1vdmUoZSkgewogICAgICBpZiAoIWRyYWdnaW5nKSByZXR1cm47CiAgICAgIHZhciB5ID0gZS50b3VjaGVzWzBdLmNsaWVudFksIHggPSBlLnRvdWNoZXNbMF0uY2xpZW50WDsKICAgICAgdmFyIGR5ID0geSAtIHN0YXJ0WSwgZHggPSB4IC0gc3RhcnRYOwogICAgICBpZiAoIWxvY2tlZCkgewogICAgICAgIGlmIChNYXRoLmFicyhkeCkgPiBNYXRoLmFicyhkeSkpIHsgZHJhZ2dpbmcgPSBmYWxzZTsgcmV0dXJuOyB9CiAgICAgICAgbG9ja2VkID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoZHkgPCAwKSBkeSA9IGR5ICogMC4yNTsKICAgICAgY3VyWSA9IHN0YXJ0WSArIGR5OwogICAgICB2YXIgb3AgPSBNYXRoLm1heCgwLjI1LCAxIC0gTWF0aC5hYnMoZHkpIC8gNTAwKTsKICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWSgnICsgZHkgKyAncHgpJzsKICAgICAgbm9kZS5zdHlsZS5vcGFjaXR5ID0gU3RyaW5nKG9wKTsKICAgICAgaWYgKGUuY2FuY2VsYWJsZSkgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgfQogICAgZnVuY3Rpb24gb25FbmQoKSB7CiAgICAgIGlmICghZHJhZ2dpbmcpIHJldHVybjsKICAgICAgZHJhZ2dpbmcgPSBmYWxzZTsKICAgICAgdmFyIGR5ID0gY3VyWSAtIHN0YXJ0WTsKICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSAnJzsKICAgICAgbm9kZS5zdHlsZS5vcGFjaXR5ID0gJyc7CiAgICAgIGlmIChkeSA+IHRocmVzaG9sZCkgY2xvc2UoKTsKICAgIH0KICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uU3RhcnQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Nb3ZlLCB7IHBhc3NpdmU6IGZhbHNlIH0pOwogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uRW5kLCB7IHBhc3NpdmU6IHRydWUgfSk7CiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgb25FbmQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKICB9CgogIGZ1bmN0aW9uIHdpcmVEcm9wUGFzdGUoc3RhZ2VFbCkgewogICAgc3RhZ2VFbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChlLmRhdGFUcmFuc2ZlciAmJiBBcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKGUuZGF0YVRyYW5zZmVyLml0ZW1zIHx8IFtdLCBmdW5jdGlvbiAoaXQpIHsgcmV0dXJuIGl0LmtpbmQgPT09ICdmaWxlJzsgfSkpIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgc3RhZ2VFbC5zdHlsZS5vdXRsaW5lID0gJzJweCBkYXNoZWQgJyArIEFDQ0VOVDsKICAgICAgICBzdGFnZUVsLnN0eWxlLm91dGxpbmVPZmZzZXQgPSAnLThweCc7CiAgICAgIH0KICAgIH0pOwogICAgc3RhZ2VFbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCBmdW5jdGlvbiAoKSB7IHN0YWdlRWwuc3R5bGUub3V0bGluZSA9ICcnOyB9KTsKICAgIHN0YWdlRWwuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgIHN0YWdlRWwuc3R5bGUub3V0bGluZSA9ICcnOwogICAgICB2YXIgZmlsZXMgPSBlLmRhdGFUcmFuc2ZlciAmJiBlLmRhdGFUcmFuc2Zlci5maWxlczsKICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IHN0YXJ0UmV2YW1wRnJvbUZpbGUoZmlsZXNbMF0pOyB9CiAgICB9KTsKICAgIF9wYXN0ZUhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoX2Rpc3Bvc2VkKSByZXR1cm47CiAgICAgIHZhciBpdGVtcyA9IChlLmNsaXBib2FyZERhdGEgJiYgZS5jbGlwYm9hcmREYXRhLml0ZW1zKSB8fCBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChpdGVtc1tpXS50eXBlICYmIGl0ZW1zW2ldLnR5cGUuaW5kZXhPZignaW1hZ2UnKSA9PT0gMCkgewogICAgICAgICAgdmFyIGZpbGUgPSBpdGVtc1tpXS5nZXRBc0ZpbGUoKTsKICAgICAgICAgIGlmIChmaWxlKSB7IHN0YXJ0UmV2YW1wRnJvbUZpbGUoZmlsZSk7IGJyZWFrOyB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBfcGFzdGVIYW5kbGVyKTsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0UmV2YW1wRnJvbUZpbGUoZmlsZSkgewogICAgaWYgKCFmaWxlKSByZXR1cm47CiAgICB0b2FzdCgnT3BlbmluZyBDcmVhdGUgd2l0aCB5b3VyIGltYWdl4oCmJywgJ2luZm8nKTsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIGlmIChhcGkgJiYgdHlwZW9mIGFwaS51cGxvYWRJbWFnZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBQcm9taXNlLnJlc29sdmUoYXBpLnVwbG9hZEltYWdlKGZpbGUsICdyZW5kZXInKSkudGhlbihmdW5jdGlvbiAodXJsKSB7CiAgICAgICAgdmFyIHBhcmFtcyA9IFsnaW1hZ2U9JyArIGVuY29kZVVSSUNvbXBvbmVudCh1cmwpXTsKICAgICAgICBpZiAoX2ltYWdlICYmIF9pbWFnZS5tb2RlbCkgcGFyYW1zLnB1c2goJ21vZGVsPScgKyBlbmNvZGVVUklDb21wb25lbnQoX2ltYWdlLm1vZGVsKSk7CiAgICAgICAgZ28oJyMvY3JlYXRlPycgKyBwYXJhbXMuam9pbignJicpKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgeyBnbygnIy9jcmVhdGUnKTsgfSk7CiAgICB9IGVsc2UgeyBnbygnIy9jcmVhdGUnKTsgfQogIH0KCiAgZnVuY3Rpb24gY2xvc2UoKSB7IGJhY2soKTsgfQoKICBmdW5jdGlvbiBiYWNrKCkgewogICAgdmFyIHByZXYgPSBTVCgpLnByZXZpb3VzUm91dGU7CiAgICBpZiAocHJldiAmJiBwcmV2LmluZGV4T2YoJ2ltYWdlJykgPT09IC0xKSB7IGdvKHByZXYuY2hhckF0KDApID09PSAnIycgPyBwcmV2IDogJyMvJyArIHByZXYpOyByZXR1cm47IH0KICAgIGdvKCcjL2xpYnJhcnknKTsKICB9CgogIGZ1bmN0aW9uIHdpcmVLZXlzKCkgewogICAgX2tleUhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoX2Rpc3Bvc2VkKSByZXR1cm47CiAgICAgIHZhciB0ID0gZS50YXJnZXQ7CiAgICAgIHZhciB0eXBpbmcgPSB0ICYmICh0LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgdC50YWdOYW1lID09PSAnVEVYVEFSRUEnIHx8IHQuaXNDb250ZW50RWRpdGFibGUpOwogICAgICBpZiAodHlwaW5nICYmIGUua2V5ICE9PSAnRXNjYXBlJykgcmV0dXJuOwogICAgICBzd2l0Y2ggKGUua2V5KSB7CiAgICAgICAgY2FzZSAnRXNjYXBlJzogZS5wcmV2ZW50RGVmYXVsdCgpOyBjbG9zZSgpOyBicmVhazsKICAgICAgICBjYXNlICdBcnJvd0xlZnQnOiBlLnByZXZlbnREZWZhdWx0KCk7IG5hdmlnYXRlKC0xKTsgYnJlYWs7CiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6IGUucHJldmVudERlZmF1bHQoKTsgbmF2aWdhdGUoMSk7IGJyZWFrOwogICAgICAgIGNhc2UgJ2UnOiBjYXNlICdFJzogaWYgKCFlLm1ldGFLZXkgJiYgIWUuY3RybEtleSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGFjdEVkaXQoKTsgfSBicmVhazsKICAgICAgICBjYXNlICdmJzogY2FzZSAnRic6CiAgICAgICAgICBpZiAoIWUubWV0YUtleSAmJiAhZS5jdHJsS2V5ICYmIGlzT3duSW1hZ2UoX2ltYWdlKSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGFjdEZhdm9yaXRlKF9ub2RlICYmIF9ub2RlLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uW2FyaWEtcHJlc3NlZF0nKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OiBicmVhazsKICAgICAgfQogICAgICBpZiAoKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpICYmIChlLmtleSA9PT0gJ3MnIHx8IGUua2V5ID09PSAnUycpKSB7IGUucHJldmVudERlZmF1bHQoKTsgYWN0RG93bmxvYWQoKTsgfQogICAgfTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfa2V5SGFuZGxlcik7CiAgfQoKICBmdW5jdGlvbiBidWlsZENocm9tZSgpIHsKICAgIHZhciBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogICAgdmFyIGNsb3NlQnRuID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6ICdnbGFzcy1idXR0b24gdi1zdHVkaW9fX2Nsb3NlJywgdHlwZTogJ2J1dHRvbicsIHRpdGxlOiAnQ2xvc2UnLCAnYXJpYS1sYWJlbCc6ICdDbG9zZScsCiAgICAgIHN0eWxlOiBjaHJvbWVCdG5TdHlsZSh7IHRvcDogJ2NhbGMoZW52KHNhZmUtYXJlYS1pbnNldC10b3AsIDBweCkgKyAxNnB4KScsIHJpZ2h0OiAnMTZweCcgfSkKICAgIH0pOwogICAgY2xvc2VCdG4uYXBwZW5kQ2hpbGQoaWNvbignY2xvc2UnKSk7CiAgICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgY2xvc2UoKTsgfSk7CiAgICBmcmFnLmFwcGVuZENoaWxkKGNsb3NlQnRuKTsKCiAgICBpZiAoX3NpYmxpbmdzLmxlbmd0aCA+IDEpIHsKICAgICAgdmFyIHByZXYgPSBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAnZ2xhc3MtYnV0dG9uIHYtc3R1ZGlvX19uYXYnLCB0eXBlOiAnYnV0dG9uJywgdGl0bGU6ICdQcmV2aW91cycsICdhcmlhLWxhYmVsJzogJ1ByZXZpb3VzIGltYWdlJywKICAgICAgICBkaXNhYmxlZDogX2luZGV4IDw9IDAsIHN0eWxlOiBjaHJvbWVCdG5TdHlsZSh7IHRvcDogJzUwJScsIGxlZnQ6ICcxNnB4JywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtNTAlKScgfSkKICAgICAgfSk7CiAgICAgIHByZXYuYXBwZW5kQ2hpbGQoaWNvbignYXJyb3dMZWZ0JykpOwogICAgICBwcmV2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBuYXZpZ2F0ZSgtMSk7IH0pOwoKICAgICAgdmFyIG5leHQgPSBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAnZ2xhc3MtYnV0dG9uIHYtc3R1ZGlvX19uYXYnLCB0eXBlOiAnYnV0dG9uJywgdGl0bGU6ICdOZXh0JywgJ2FyaWEtbGFiZWwnOiAnTmV4dCBpbWFnZScsCiAgICAgICAgZGlzYWJsZWQ6IF9pbmRleCA+PSBfc2libGluZ3MubGVuZ3RoIC0gMSwgc3R5bGU6IGNocm9tZUJ0blN0eWxlKHsgdG9wOiAnNTAlJywgcmlnaHQ6ICcxNnB4JywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtNTAlKScgfSkKICAgICAgfSk7CiAgICAgIG5leHQuYXBwZW5kQ2hpbGQoaWNvbignYXJyb3dSaWdodCcpKTsKICAgICAgbmV4dC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgbmF2aWdhdGUoMSk7IH0pOwoKICAgICAgdmFyIGNvdW50ZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19jb3VudGVyIHYtbW9ubycsICdhcmlhLWhpZGRlbic6ICd0cnVlJywKICAgICAgICB0ZXh0OiAoX2luZGV4ICsgMSkgKyAnIC8gJyArIF9zaWJsaW5ncy5sZW5ndGgsIHN0eWxlOiB7CiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJywgdG9wOiAnY2FsYyhlbnYoc2FmZS1hcmVhLWluc2V0LXRvcCwgMHB4KSArIDIycHgpJywgbGVmdDogJzUwJScsCiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC01MCUpJywgcGFkZGluZzogJzVweCAxMnB4JywgYm9yZGVyUmFkaXVzOiAndmFyKC0tcmFkaXVzLXBpbGwsIDYzcHgpJywKICAgICAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsMCwwLC40NSknLCBjb2xvcjogSU5LX1NPRlQsIGZvbnRTaXplOiAnMTJweCcsIHpJbmRleDogJzYnCiAgICAgICAgfSB9KTsKICAgICAgZnJhZy5hcHBlbmRDaGlsZChwcmV2KTsgZnJhZy5hcHBlbmRDaGlsZChuZXh0KTsgZnJhZy5hcHBlbmRDaGlsZChjb3VudGVyKTsKICAgIH0KICAgIHJldHVybiBmcmFnOwogIH0KCiAgZnVuY3Rpb24gY2hyb21lQnRuU3R5bGUocG9zKSB7CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7CiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB6SW5kZXg6ICc2Jywgd2lkdGg6ICc0NHB4JywgaGVpZ2h0OiAnNDRweCcsCiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsCiAgICAgIGJvcmRlclJhZGl1czogJzUwJScsIGNvbG9yOiBJTkssIGN1cnNvcjogJ3BvaW50ZXInCiAgICB9LCBwb3MgfHwge30pOwogIH0KCiAgZnVuY3Rpb24gcm9vdFN0eWxlKCkgewogICAgcmV0dXJuIHsKICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsIHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnLAogICAgICBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdzdHJldGNoJywganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLAogICAgICBnYXA6ICcyMHB4JywgcGFkZGluZzogJ2NhbGMoZW52KHNhZmUtYXJlYS1pbnNldC10b3AsIDBweCkgKyA2NHB4KSAyMHB4IGNhbGMoZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20sIDBweCkgKyAyMHB4KScsCiAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLCBvdXRsaW5lOiAnbm9uZScKICAgIH07CiAgfQoKICBmdW5jdGlvbiBhcHBseVJlc3BvbnNpdmVMYXlvdXQobm9kZSwgbWVkaWEsIHBhbmVsKSB7CiAgICBpZiAoIW5vZGUgfHwgIW1lZGlhIHx8ICFwYW5lbCkgcmV0dXJuOwogICAgdmFyIG5hcnJvdyA9ICh3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggfHwgMCkgPCA4ODA7CiAgICBpZiAobmFycm93KSB7CiAgICAgIG5vZGUuc3R5bGUuZmxleERpcmVjdGlvbiA9ICdjb2x1bW4nOwogICAgICBub2RlLnN0eWxlLmFsaWduSXRlbXMgPSAnc3RyZXRjaCc7CiAgICAgIG5vZGUuc3R5bGUucGFkZGluZyA9ICdjYWxjKGVudihzYWZlLWFyZWEtaW5zZXQtdG9wLCAwcHgpICsgNjBweCkgMTRweCBjYWxjKGVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tLCAwcHgpICsgMTRweCknOwogICAgICBtZWRpYS5zdHlsZS5mbGV4ID0gJzEgMSBhdXRvJzsKICAgICAgcGFuZWwuc3R5bGUud2lkdGggPSAnMTAwJSc7CiAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9ICc0NXZoJzsKICAgICAgcGFuZWwuc3R5bGUuZmxleCA9ICcwIDAgYXV0byc7CiAgICB9IGVsc2UgewogICAgICBub2RlLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAncm93JzsKICAgICAgbm9kZS5zdHlsZS5hbGlnbkl0ZW1zID0gJ3N0cmV0Y2gnOwogICAgICBtZWRpYS5zdHlsZS5mbGV4ID0gJzEgMSBhdXRvJzsKICAgICAgcGFuZWwuc3R5bGUud2lkdGggPSAnbWluKDM4MHB4LCA5MnZ3KSc7CiAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9ICcxMDAlJzsKICAgICAgcGFuZWwuc3R5bGUuZmxleCA9ICcwIDAgYXV0byc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtb3VudFNrZWxldG9uKHJvb3QpIHsKICAgIHZhciB1aSA9IFVJKCk7CiAgICB2YXIgbm9kZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW8gdi1zdHVkaW8tLWxvYWRpbmcnLCByb2xlOiAnZGlhbG9nJywgJ2FyaWEtbW9kYWwnOiAndHJ1ZScsICdhcmlhLWxhYmVsJzogJ0xvYWRpbmcgaW1hZ2UnLCBzdHlsZTogcm9vdFN0eWxlKCkgfSk7CiAgICB2YXIgbWVkaWEgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19tZWRpYScsIHN0eWxlOiB7IGZsZXg6ICcxIDEgYXV0bycsIGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJywgbWluSGVpZ2h0OiAnMCcsIG1pbldpZHRoOiAnMCcgfSB9KTsKICAgIHZhciBza2VsID0gKHVpICYmIHR5cGVvZiB1aS5za2VsZXRvbiA9PT0gJ2Z1bmN0aW9uJykgPyB1aS5za2VsZXRvbignc3F1YXJlJykgOiBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24nLCBzdHlsZTogeyB3aWR0aDogJzYwdmgnLCBtYXhXaWR0aDogJzkwJScsIGFzcGVjdFJhdGlvOiAnMSAvIDEnIH0gfSk7CiAgICBpZiAoc2tlbCkgbWVkaWEuYXBwZW5kQ2hpbGQoc2tlbCk7CiAgICB2YXIgcGFuZWwgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19wYW5lbCBnbGFzcy1jYXJkJywgc3R5bGU6IHBhbmVsU3R5bGUoKSB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24nLCBzdHlsZTogeyBoZWlnaHQ6ICc2NHB4Jywgd2lkdGg6ICcxMDAlJyB9IH0pLAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24nLCBzdHlsZTogeyBoZWlnaHQ6ICcyOHB4Jywgd2lkdGg6ICc3MCUnIH0gfSksCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbicsIHN0eWxlOiB7IGhlaWdodDogJzg4cHgnLCB3aWR0aDogJzEwMCUnIH0gfSkKICAgICk7CiAgICB2YXIgY2xvc2VCdG4gPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ2dsYXNzLWJ1dHRvbiB2LXN0dWRpb19fY2xvc2UnLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiAnQ2xvc2UnLCBzdHlsZTogY2hyb21lQnRuU3R5bGUoeyB0b3A6ICdjYWxjKGVudihzYWZlLWFyZWEtaW5zZXQtdG9wLCAwcHgpICsgMTZweCknLCByaWdodDogJzE2cHgnIH0pIH0pOwogICAgY2xvc2VCdG4uYXBwZW5kQ2hpbGQoaWNvbignY2xvc2UnKSk7CiAgICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgY2xvc2UoKTsgfSk7CiAgICBub2RlLmFwcGVuZENoaWxkKGNsb3NlQnRuKTsKICAgIG5vZGUuYXBwZW5kQ2hpbGQobWVkaWEpOwogICAgbm9kZS5hcHBlbmRDaGlsZChwYW5lbCk7CiAgICBhcHBseVJlc3BvbnNpdmVMYXlvdXQobm9kZSwgbWVkaWEsIHBhbmVsKTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICBfbm9kZSA9IG5vZGU7CiAgfQoKICBmdW5jdGlvbiBtb3VudE5vdEZvdW5kKHJvb3QpIHsKICAgIHZhciB1aSA9IFVJKCk7CiAgICB2YXIgbm9kZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW8gdi1zdHVkaW8tLWVtcHR5Jywgcm9sZTogJ2RpYWxvZycsICdhcmlhLW1vZGFsJzogJ3RydWUnLCBzdHlsZTogT2JqZWN0LmFzc2lnbihyb290U3R5bGUoKSwgeyBhbGlnbkl0ZW1zOiAnY2VudGVyJyB9KSB9KTsKICAgIHZhciBjbG9zZUJ0biA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAnZ2xhc3MtYnV0dG9uIHYtc3R1ZGlvX19jbG9zZScsIHR5cGU6ICdidXR0b24nLCAnYXJpYS1sYWJlbCc6ICdDbG9zZScsIHN0eWxlOiBjaHJvbWVCdG5TdHlsZSh7IHRvcDogJ2NhbGMoZW52KHNhZmUtYXJlYS1pbnNldC10b3AsIDBweCkgKyAxNnB4KScsIHJpZ2h0OiAnMTZweCcgfSkgfSk7CiAgICBjbG9zZUJ0bi5hcHBlbmRDaGlsZChpY29uKCdjbG9zZScpKTsKICAgIGNsb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBjbG9zZSgpOyB9KTsKICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2xvc2VCdG4pOwogICAgdmFyIGNvbnRlbnQ7CiAgICBpZiAodWkgJiYgdHlwZW9mIHVpLmVtcHR5ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIGNvbnRlbnQgPSB1aS5lbXB0eSgnV2UgY291bGRu4oCZdCBmaW5kIHRoYXQgaW1hZ2UuJywgJ0JhY2sgdG8gTGlicmFyeScsIGZ1bmN0aW9uICgpIHsgZ28oJyMvbGlicmFyeScpOyB9KTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnRlbnQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHknLCBzdHlsZTogeyBtYXJnaW46ICdhdXRvJywgdGV4dEFsaWduOiAnY2VudGVyJyB9IH0sCiAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fbXNnJywgdGV4dDogJ1dlIGNvdWxkbuKAmXQgZmluZCB0aGF0IGltYWdlLicgfSksCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3QnLCB0eXBlOiAnYnV0dG9uJywgb25jbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9saWJyYXJ5Jyk7IH0gfSwgJ0JhY2sgdG8gTGlicmFyeScpCiAgICAgICk7CiAgICB9CiAgICBub2RlLmFwcGVuZENoaWxkKGNvbnRlbnQpOwogICAgcm9vdC5hcHBlbmRDaGlsZChub2RlKTsKICAgIF9ub2RlID0gbm9kZTsKICB9CgogIGZ1bmN0aW9uIG1vdW50U3R1ZGlvKHJvb3QpIHsKICAgIF9zaWJsaW5ncyA9IGJ1aWxkU2libGluZ3MoX2ltYWdlKTsKICAgIHZhciBpZCA9IGltYWdlSUQoX2ltYWdlKTsKICAgIF9pbmRleCA9IF9zaWJsaW5ncy5maW5kSW5kZXggPyBfc2libGluZ3MuZmluZEluZGV4KGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWFnZUlEKHgpID09PSBpZDsgfSkgOiBpbmRleE9mKF9zaWJsaW5ncywgaWQpOwoKICAgIHZhciBub2RlID0gZWwoJ2RpdicsIHsKICAgICAgY2xhc3M6ICd2LXN0dWRpbycsIHJvbGU6ICdkaWFsb2cnLCAnYXJpYS1tb2RhbCc6ICd0cnVlJywKICAgICAgJ2FyaWEtbGFiZWwnOiBfaW1hZ2UucHJvbXB0ID8gKCdJbWFnZTogJyArIF9pbWFnZS5wcm9tcHQuc2xpY2UoMCwgNjApKSA6ICdJbWFnZSBkZXRhaWwnLAogICAgICB0YWJpbmRleDogJy0xJywgc3R5bGU6IHJvb3RTdHlsZSgpCiAgICB9KTsKCiAgICB2YXIgbWVkaWEgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19tZWRpYScsIHN0eWxlOiB7IGZsZXg6ICcxIDEgYXV0bycsIGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJywgbWluSGVpZ2h0OiAnMCcsIG1pbldpZHRoOiAnMCcgfSB9KTsKICAgIHZhciBzdGFnZUVsID0gYnVpbGRNZWRpYSgpOwogICAgbWVkaWEuYXBwZW5kQ2hpbGQoc3RhZ2VFbCk7CgogICAgdmFyIHBhbmVsID0gYnVpbGRQYW5lbCgpOwoKICAgIG5vZGUuYXBwZW5kQ2hpbGQoYnVpbGRDaHJvbWUoKSk7CiAgICBub2RlLmFwcGVuZENoaWxkKG1lZGlhKTsKICAgIG5vZGUuYXBwZW5kQ2hpbGQocGFuZWwpOwoKICAgIGFwcGx5UmVzcG9uc2l2ZUxheW91dChub2RlLCBtZWRpYSwgcGFuZWwpOwoKICAgIHJvb3QuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICBfbm9kZSA9IG5vZGU7CgogICAgd2lyZUtleXMoKTsKICAgIHdpcmVTd2lwZURpc21pc3Mobm9kZSk7CiAgICB3aXJlRHJvcFBhc3RlKHN0YWdlRWwpOwogICAgX3Jlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7IGlmICghX2Rpc3Bvc2VkICYmIF9ub2RlKSBhcHBseVJlc3BvbnNpdmVMYXlvdXQoX25vZGUsIF9ub2RlLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fbWVkaWEnKSwgX25vZGUucXVlcnlTZWxlY3RvcignLnYtc3R1ZGlvX19wYW5lbCcpKTsgfTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBfcmVzaXplSGFuZGxlcik7CgogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHRyeSB7IG5vZGUuZm9jdXMoKTsgfSBjYXRjaCAoZSkge30gfSwgMjApOwogIH0KCiAgZnVuY3Rpb24gaW5kZXhPZihhcnIsIGlkKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBpZiAoaW1hZ2VJRChhcnJbaV0pID09PSBpZCkgcmV0dXJuIGk7IH0KICAgIHJldHVybiAtMTsKICB9CgogIFYudmlld3Muc3R1ZGlvID0gewogICAgcmVuZGVyOiBmdW5jdGlvbiAocm9vdCwgcGFyYW1zKSB7CiAgICAgIHRoaXMudGVhcmRvd24oKTsKICAgICAgX2Rpc3Bvc2VkID0gZmFsc2U7CiAgICAgIF9yb290ID0gcm9vdDsKICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgICB2YXIgaWQgPSBwYXJhbXMuaWQgfHwgcGFyYW1zLmltYWdlSUQgfHwgcGFyYW1zLmltYWdlSWQgfHwgcGFyYW1zLmltYWdlIHx8IG51bGw7CiAgICAgIGlmIChpZCkgaWQgPSBTdHJpbmcoaWQpOwoKICAgICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgICAgX25vZGUgPSBudWxsOwoKICAgICAgaWYgKCFpZCkgeyBtb3VudE5vdEZvdW5kKHJvb3QpOyByZXR1cm47IH0KCiAgICAgIHZhciBsb2NhbCA9IGZpbmRJblN0YXRlKGlkKTsKICAgICAgaWYgKGxvY2FsKSB7IF9pbWFnZSA9IGxvY2FsOyBtb3VudFN0dWRpbyhyb290KTsgcmV0dXJuOyB9CgogICAgICBtb3VudFNrZWxldG9uKHJvb3QpOwogICAgICByZXNvbHZlSW1hZ2UoaWQpLnRoZW4oZnVuY3Rpb24gKGltZykgewogICAgICAgIGlmIChfZGlzcG9zZWQpIHJldHVybjsKICAgICAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgICAgIF9ub2RlID0gbnVsbDsKICAgICAgICBpZiAoIWltZykgeyBtb3VudE5vdEZvdW5kKHJvb3QpOyByZXR1cm47IH0KICAgICAgICBfaW1hZ2UgPSBpbWc7CiAgICAgICAgbW91bnRTdHVkaW8ocm9vdCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoX2Rpc3Bvc2VkKSByZXR1cm47CiAgICAgICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgICAgICBfbm9kZSA9IG51bGw7CiAgICAgICAgbW91bnROb3RGb3VuZChyb290KTsKICAgICAgfSk7CiAgICB9LAoKICAgIHRlYXJkb3duOiBmdW5jdGlvbiAoKSB7CiAgICAgIF9kaXNwb3NlZCA9IHRydWU7CiAgICAgIGlmIChfa2V5SGFuZGxlcikgeyBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2tleUhhbmRsZXIpOyBfa2V5SGFuZGxlciA9IG51bGw7IH0KICAgICAgaWYgKF9wYXN0ZUhhbmRsZXIpIHsgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBfcGFzdGVIYW5kbGVyKTsgX3Bhc3RlSGFuZGxlciA9IG51bGw7IH0KICAgICAgaWYgKF9yZXNpemVIYW5kbGVyKSB7IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBfcmVzaXplSGFuZGxlcik7IF9yZXNpemVIYW5kbGVyID0gbnVsbDsgfQogICAgICBpZiAoX3BvbGxBYm9ydCkgeyB0cnkgeyBfcG9sbEFib3J0LmFib3J0KCk7IH0gY2F0Y2ggKGUpIHt9IF9wb2xsQWJvcnQgPSBudWxsOyB9CiAgICAgIGRlc3Ryb3lTY3J1YigpOwogICAgICBfbm9kZSA9IG51bGw7CiAgICAgIF9pbWFnZSA9IG51bGw7CiAgICAgIF9zaWJsaW5ncyA9IFtdOwogICAgICBfaW5kZXggPSAtMTsKICAgIH0KICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9wcm9maWxlLmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9IHdpbmRvdy5WID0gd2luZG93LlYgfHwge307CiAgVi52aWV3cyA9IFYudmlld3MgfHwge307CgogIGZ1bmN0aW9uIGVsKHRhZywgYXR0cnMpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBWLnVpLmVsLmFwcGx5KFYudWksIGFyZ3VtZW50cyk7CiAgICB9CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIHZhciBjaGlsZHJlbiA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICBpZiAobm9kZSAmJiBhdHRycykgewogICAgICBmb3IgKHZhciBrIGluIGF0dHJzKSB7CiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cnMsIGspKSBjb250aW51ZTsKICAgICAgICB2YXIgdmFsID0gYXR0cnNba107CiAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gZmFsc2UpIGNvbnRpbnVlOwogICAgICAgIGlmIChrID09PSAnY2xhc3MnIHx8IGsgPT09ICdjbGFzc05hbWUnKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAndGV4dCcpIG5vZGUudGV4dENvbnRlbnQgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ2h0bWwnKSBub2RlLmlubmVySFRNTCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAnc3R5bGUnICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICBmb3IgKHZhciBzayBpbiB2YWwpIG5vZGUuc3R5bGVbc2tdID0gdmFsW3NrXTsKICAgICAgICB9IGVsc2UgaWYgKGsuaW5kZXhPZignb24nKSA9PT0gMCAmJiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCB2YWwpOwogICAgICAgIH0gZWxzZSBpZiAoayA9PT0gJ3ZhbHVlJyB8fCBrID09PSAnY2hlY2tlZCcgfHwgayA9PT0gJ2Rpc2FibGVkJyB8fCBrID09PSAnc2VsZWN0ZWQnKSB7CiAgICAgICAgICBub2RlW2tdID0gdmFsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShrLCB2YWwpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXBwZW5kQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW4pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiBhcHBlbmRDaGlsZHJlbihub2RlLCBjaGlsZHJlbikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldOwogICAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlIHx8IGMgPT09IHRydWUpIGNvbnRpbnVlOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgeyBhcHBlbmRDaGlsZHJlbihub2RlLCBjKTsgY29udGludWU7IH0KICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0eXBlb2YgYyA9PT0gJ29iamVjdCcgJiYgYy5ub2RlVHlwZSA/IGMgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gaWNvbihuYW1lKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5pY29uID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciBvdXQgPSBWLnVpLmljb24obmFtZSk7CiAgICAgIGlmIChvdXQgJiYgb3V0Lm5vZGVUeXBlKSByZXR1cm4gb3V0OwogICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgc3Bhbi5jbGFzc05hbWUgPSAndi1pY28nOwogICAgICBzcGFuLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgICBzcGFuLmlubmVySFRNTCA9IG91dCB8fCAnJzsKICAgICAgcmV0dXJuIHNwYW47CiAgICB9CiAgICB2YXIgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgIHMuY2xhc3NOYW1lID0gJ3YtaWNvJzsKICAgIHMuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICBzLnRleHRDb250ZW50ID0gJyc7CiAgICByZXR1cm4gczsKICB9CgogIGZ1bmN0aW9uIHRvYXN0KG1zZywga2luZCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkudG9hc3QgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnVpLnRvYXN0KG1zZywga2luZCk7CiAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5lbWl0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi5zdG9yZS5lbWl0KCd0b2FzdCcsIHsgbWVzc2FnZTogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsKICB9CgogIGZ1bmN0aW9uIGNvbmZpcm1EaWFsb2cobXNnKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jb25maXJtID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciByID0gVi51aS5jb25maXJtKG1zZyk7CiAgICAgIHJldHVybiAociAmJiB0eXBlb2Ygci50aGVuID09PSAnZnVuY3Rpb24nKSA/IHIgOiBQcm9taXNlLnJlc29sdmUoISFyKTsKICAgIH0KICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0obXNnKSk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICBpZiAoVi5yb3V0ZXIgJiYgdHlwZW9mIFYucm91dGVyLmdvID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi5yb3V0ZXIuZ28oaGFzaCk7CiAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiBjbG9zZURyYXdlcigpIHsKICAgIHRyeSB7CiAgICAgIGlmIChWLnJvdXRlciAmJiB0eXBlb2YgVi5yb3V0ZXIuY2xvc2VEcmF3ZXIgPT09ICdmdW5jdGlvbicpIHsgVi5yb3V0ZXIuY2xvc2VEcmF3ZXIoKTsgcmV0dXJuOyB9CiAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmNsb3NlRHJhd2VyID09PSAnZnVuY3Rpb24nKSB7IFYudWkuY2xvc2VEcmF3ZXIoKTsgcmV0dXJuOyB9CiAgICAgIGlmIChWLmFwcCAmJiB0eXBlb2YgVi5hcHAuY2xvc2VEcmF3ZXIgPT09ICdmdW5jdGlvbicpIHsgVi5hcHAuY2xvc2VEcmF3ZXIoKTsgcmV0dXJuOyB9CiAgICAgIGlmICh0eXBlb2YgVi5jbG9zZURyYXdlciA9PT0gJ2Z1bmN0aW9uJykgeyBWLmNsb3NlRHJhd2VyKCk7IHJldHVybjsgfQogICAgfSBjYXRjaCAoZSkge30KICAgIHRyeSB7IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd2LWRyYXdlci1vcGVuJyk7IH0gY2F0Y2ggKGUpIHt9CiAgICB2YXIgZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2LWFjY291bnQtZHJhd2VyJyk7CiAgICB2YXIgc2NyaW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudi1zY3JpbScpOwogICAgaWYgKGQpIHsgZC5jbGFzc0xpc3QucmVtb3ZlKCd2LWRyYXdlci0taW4nKTsgZC5oaWRkZW4gPSB0cnVlOyB9CiAgICBpZiAoc2NyaW0pIHsgc2NyaW0uY2xhc3NMaXN0LnJlbW92ZSgndi1zY3JpbS0taW4nKTsgc2NyaW0uaGlkZGVuID0gdHJ1ZTsgfQogIH0KCiAgZnVuY3Rpb24gbmF2aWdhdGUoaGFzaCkgewogICAgY2xvc2VEcmF3ZXIoKTsKICAgIGdvKGhhc2gpOwogIH0KCiAgZnVuY3Rpb24gc2dldChrZXksIGZhbGxiYWNrKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5nZXQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICB2YXIgdiA9IFYuc3RvcmUuZ2V0KGtleSk7CiAgICAgICAgcmV0dXJuIHYgPT0gbnVsbCA/IGZhbGxiYWNrIDogdjsKICAgICAgfQogICAgfSBjYXRjaCAoZSkge30KICAgIHJldHVybiBmYWxsYmFjazsKICB9CiAgZnVuY3Rpb24gc3NldChrZXksIHZhbHVlKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5zZXQgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuc2V0KGtleSwgdmFsdWUpOwogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5zYXZlID09PSAnZnVuY3Rpb24nKSBWLnN0b3JlLnNhdmUoKTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiBzZXR0aW5ncygpIHsKICAgIHZhciBzID0gc2dldCgnc2V0dGluZ3MnLCBudWxsKTsKICAgIGlmICghcyB8fCB0eXBlb2YgcyAhPT0gJ29iamVjdCcpIHsKICAgICAgcyA9IHt9OwogICAgICB0cnkgeyBpZiAoVi5zdGF0ZSkgVi5zdGF0ZS5zZXR0aW5ncyA9IHM7IH0gY2F0Y2ggKGUpIHt9CiAgICB9CiAgICByZXR1cm4gczsKICB9CiAgZnVuY3Rpb24gc2V0dGluZ0NoYW5nZShrZXksIHZhbHVlKSB7CiAgICB2YXIgcyA9IHNldHRpbmdzKCk7CiAgICBzW2tleV0gPSB2YWx1ZTsKICAgIHNzZXQoJ3NldHRpbmdzJywgcyk7CiAgfQoKICB2YXIgTFNfUFJFRklYID0gJ3ZhbXBfd2ViXyc7CiAgZnVuY3Rpb24gbHNHZXQoa2V5LCBmYWxsYmFjaykgewogICAgdHJ5IHsKICAgICAgdmFyIHJhdyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19QUkVGSVggKyBrZXkpOwogICAgICBpZiAocmF3ID09IG51bGwpIHJldHVybiBmYWxsYmFjazsKICAgICAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UocmF3KTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gcmF3OyB9CiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxsYmFjazsgfQogIH0KICBmdW5jdGlvbiBsc1NldChrZXksIHZhbHVlKSB7CiAgICB0cnkgeyB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oTFNfUFJFRklYICsga2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7fQogIH0KCiAgZnVuY3Rpb24gY3VycmVudFVzZXIoKSB7CiAgICB0cnkgeyByZXR1cm4gKFYuc3RhdGUgJiYgVi5zdGF0ZS51c2VyKSB8fCBudWxsOyB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgfQogIGZ1bmN0aW9uIHVzZXJJZGVudGl0eSh1KSB7CiAgICB1ID0gdSB8fCBjdXJyZW50VXNlcigpIHx8IHt9OwogICAgdmFyIG1pY3JvID0gKHUuZ2xvYmFsICYmIHUuZ2xvYmFsLm1pY3JvKSB8fCB7fTsKICAgIHZhciBpZCA9IG1pY3JvLmlkIHx8IHUuaWQgfHwgbnVsbDsKICAgIHZhciB1c2VybmFtZSA9IG1pY3JvLnVzZXJuYW1lIHx8IHUudXNlcm5hbWUgfHwgJyc7CiAgICB2YXIgbmFtZSA9IHUubmFtZSB8fCAodS5maXJzdE5hbWUgPyAodS5maXJzdE5hbWUgKyAodS5sYXN0TmFtZSA/ICcgJyArIHUubGFzdE5hbWUgOiAnJykpIDogJycpIHx8IHVzZXJuYW1lIHx8ICcnOwogICAgdmFyIGVtYWlsID0gdS5lbWFpbCB8fCAodS5nbG9iYWwgJiYgdS5nbG9iYWwuZW1haWwpIHx8ICcnOwogICAgdmFyIGF2YXRhciA9IG1pY3JvLnByb2ZpbGVQaWNVUkwgfHwgdS5wcm9maWxlUGljVVJMIHx8ICh1Lmdsb2JhbCAmJiB1Lmdsb2JhbC5wcm9maWxlUGljVVJMKSB8fCAnJzsKICAgIHZhciBhZG1pbiA9ICEhKHUuYWRtaW4gfHwgKHUuZ2xvYmFsICYmIHUuZ2xvYmFsLmFkbWluKSk7CiAgICByZXR1cm4geyBpZDogaWQsIHVzZXJuYW1lOiB1c2VybmFtZSwgbmFtZTogbmFtZSwgZW1haWw6IGVtYWlsLCBhdmF0YXI6IGF2YXRhciwgYWRtaW46IGFkbWluIH07CiAgfQoKICBmdW5jdGlvbiBjcmVkaXRzVmFsdWUoKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdGF0ZSAmJiBWLnN0YXRlLmNyZWRpdHMgIT0gbnVsbCkgcmV0dXJuIFYuc3RhdGUuY3JlZGl0czsKICAgICAgdmFyIHUgPSBjdXJyZW50VXNlcigpOwogICAgICBpZiAodSAmJiB1LmNyZWRpdHMgIT0gbnVsbCkgcmV0dXJuIHUuY3JlZGl0czsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHJlZnJlc2hDcmVkaXRzKCkgewogICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkuY3JlZGl0cyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgIHJldHVybiBWLmFwaS5jcmVkaXRzKCkudGhlbihmdW5jdGlvbiAocikgewogICAgICB2YXIgbiA9IChyICYmIChyLmNyZWRpdHMgIT0gbnVsbCA/IHIuY3JlZGl0cyA6IHIpKSB8fCAwOwogICAgICB0cnkgeyBpZiAoVi5zdGF0ZSkgVi5zdGF0ZS5jcmVkaXRzID0gbjsgfSBjYXRjaCAoZSkge30KICAgICAgdHJ5IHsgaWYgKFYuc3RvcmUpIHsgVi5zdG9yZS5zZXQoJ2NyZWRpdHMnLCBuKTsgVi5zdG9yZS5lbWl0KCdjcmVkaXRzOmNoYW5nZWQnLCBuKTsgfSB9IGNhdGNoIChlKSB7fQogICAgICByZXR1cm4gbjsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH0pOwogIH0KCiAgZnVuY3Rpb24gYXZhdGFyTm9kZShpZGVudCwgc2l6ZSkgewogICAgc2l6ZSA9IHNpemUgfHwgNTY7CiAgICB2YXIgYm94ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9fYXZhdGFyJywgc3R5bGU6IHsgd2lkdGg6IHNpemUgKyAncHgnLCBoZWlnaHQ6IHNpemUgKyAncHgnLCBib3JkZXJSYWRpdXM6ICc1MCUnIH0gfSk7CiAgICBpZiAoaWRlbnQuYXZhdGFyKSB7CiAgICAgIHZhciBpbWcgPSBlbCgnaW1nJywgewogICAgICAgIHNyYzogaWRlbnQuYXZhdGFyLAogICAgICAgIGFsdDogKGlkZW50Lm5hbWUgfHwgaWRlbnQudXNlcm5hbWUgfHwgJ0F2YXRhcicpCiAgICAgIH0pOwogICAgICBpZiAoaW1nICYmIGltZy5zZXRBdHRyaWJ1dGUpIGltZy5zZXRBdHRyaWJ1dGUoJ2xvYWRpbmcnLCAnbGF6eScpOwogICAgICBpZiAoaW1nICYmIGltZy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgaW1nLnJlbW92ZSgpOwogICAgICAgICAgYm94LmFwcGVuZENoaWxkKGVsKCdzcGFuJywgbnVsbCwgaW5pdGlhbHMoaWRlbnQpKSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKGltZykgYm94LmFwcGVuZENoaWxkKGltZyk7CiAgICB9IGVsc2UgewogICAgICBib3guYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCBudWxsLCBpbml0aWFscyhpZGVudCkpKTsKICAgIH0KICAgIHJldHVybiBib3g7CiAgfQogIGZ1bmN0aW9uIGluaXRpYWxzKGlkZW50KSB7CiAgICB2YXIgYmFzZSA9IChpZGVudC5uYW1lIHx8IGlkZW50LnVzZXJuYW1lIHx8IGlkZW50LmVtYWlsIHx8ICdWJykudHJpbSgpOwogICAgdmFyIHBhcnRzID0gYmFzZS5zcGxpdCgvXHMrLykuZmlsdGVyKEJvb2xlYW4pOwogICAgdmFyIGluaXRzID0gcGFydHMubGVuZ3RoID49IDIKICAgICAgPyAocGFydHNbMF1bMF0gKyBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXVswXSkKICAgICAgOiBiYXNlLnNsaWNlKDAsIDIpOwogICAgcmV0dXJuIChpbml0cyB8fCAnVicpLnRvVXBwZXJDYXNlKCk7CiAgfQoKICBmdW5jdGlvbiBzZWN0aW9uKHRpdGxlLCBzdWJ0aXRsZSwgY2hpbGRyZW4pIHsKICAgIHZhciBoZWFkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX2hlYWQnIH0sCiAgICAgIGVsKCdoMicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3RpdGxlJywgdGV4dDogdGl0bGUgfSkpOwogICAgaWYgKHN1YnRpdGxlKSBoZWFkLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViJywgdGV4dDogc3VidGl0bGUgfSkpOwogICAgcmV0dXJuIGVsKCdzZWN0aW9uJywgeyBjbGFzczogJ3Ytc2VjdGlvbiBnbGFzcy1jYXJkJyB9LCBoZWFkLAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3RhY2stbWQnIH0sIGNoaWxkcmVuIHx8IFtdKSk7CiAgfQoKICBmdW5jdGlvbiBzZXR0aW5nUm93KGxhYmVsLCBjb250cm9sLCBoaW50KSB7CiAgICB2YXIgbGFiZWxTdGFjayA9IGVsKCdkaXYnLCB7CiAgICAgIHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzJweCcsIG1pbldpZHRoOiAnMCcsIGZsZXg6ICcxIDEgYXV0bycgfQogICAgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxhYmVsJywgdGV4dDogbGFiZWwgfSkpOwogICAgaWYgKGhpbnQpIGxhYmVsU3RhY2suYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW11dGVkJywgc3R5bGU6IHsgZm9udFNpemU6ICcxM3B4JyB9LCB0ZXh0OiBoaW50IH0pKTsKICAgIHJldHVybiBlbCgnZGl2JywgewogICAgICBjbGFzczogJ3Ytcm93IHYtcm93LS1iZXR3ZWVuIHYtcm93LS13cmFwJywKICAgICAgc3R5bGU6IHsgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgYWxpZ25JdGVtczogJ2NlbnRlcicgfQogICAgfSwgbGFiZWxTdGFjaywgZWwoJ2RpdicsIHsgc3R5bGU6IHsgZmxleDogJzAgMCBhdXRvJyB9IH0sIGNvbnRyb2wpKTsKICB9CgogIGZ1bmN0aW9uIHRvZ2dsZShjaGVja2VkLCBvbkNoYW5nZSwgYXJpYUxhYmVsKSB7CiAgICB2YXIgaW5wdXQgPSBlbCgnaW5wdXQnLCB7CiAgICAgIHR5cGU6ICdjaGVja2JveCcsIGNoZWNrZWQ6ICEhY2hlY2tlZCwgJ2FyaWEtbGFiZWwnOiBhcmlhTGFiZWwgfHwgJ1RvZ2dsZScsCiAgICAgIHJvbGU6ICdzd2l0Y2gnLCAnYXJpYS1jaGVja2VkJzogY2hlY2tlZCA/ICd0cnVlJyA6ICdmYWxzZScsCiAgICAgIHN0eWxlOiB7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCBvcGFjaXR5OiAnMCcsIHdpZHRoOiAnMXB4JywgaGVpZ2h0OiAnMXB4JywgcG9pbnRlckV2ZW50czogJ25vbmUnIH0KICAgIH0pOwogICAgdmFyIHRodW1iID0gZWwoJ3NwYW4nLCB7CiAgICAgIHN0eWxlOiB7CiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogJzJweCcsIGxlZnQ6IGNoZWNrZWQgPyAnMjRweCcgOiAnMnB4JywKICAgICAgICB3aWR0aDogJzI0cHgnLCBoZWlnaHQ6ICcyNHB4JywgYm9yZGVyUmFkaXVzOiAnNTAlJywgYmFja2dyb3VuZDogJyNmZmYnLAogICAgICAgIGJveFNoYWRvdzogJzAgMXB4IDNweCByZ2JhKDAsMCwwLC4zNSknLAogICAgICAgIHRyYW5zaXRpb246ICdsZWZ0IHZhcigtLWR1ci1pbnRlcmFjdGl2ZSwgMTQwbXMpIHZhcigtLWVhc2Utc3ByaW5nLCBjdWJpYy1iZXppZXIoMC4zNCwxLjU2LDAuNjQsMSkpJwogICAgICB9CiAgICB9KTsKICAgIHZhciB0cmFjayA9IGVsKCdzcGFuJywgewogICAgICBzdHlsZTogewogICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLCBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJywgd2lkdGg6ICc1MHB4JywgaGVpZ2h0OiAnMjhweCcsCiAgICAgICAgYm9yZGVyUmFkaXVzOiAnOTk5cHgnLAogICAgICAgIGJhY2tncm91bmQ6IGNoZWNrZWQgPyAndmFyKC0tdmFtcC1hY2NlbnQsICM1Mjk3RjgpJyA6ICd2YXIoLS12LWxpbmUsIHJnYmEoMjQ1LDI0NSwyNDcsLjE4KSknLAogICAgICAgIHRyYW5zaXRpb246ICdiYWNrZ3JvdW5kIHZhcigtLWR1ci1pbnRlcmFjdGl2ZSwgMTQwbXMpIHZhcigtLWdsYXNzLWVhc2UsIGN1YmljLWJlemllcigwLjQsMCwwLjIsMSkpJwogICAgICB9CiAgICB9LCB0aHVtYik7CiAgICB2YXIgd3JhcCA9IGVsKCdsYWJlbCcsIHsKICAgICAgc3R5bGU6IHsgZGlzcGxheTogJ2lubGluZS1mbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGN1cnNvcjogJ3BvaW50ZXInIH0KICAgIH0sIGlucHV0LCB0cmFjayk7CiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBvbiA9IGlucHV0LmNoZWNrZWQ7CiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1jaGVja2VkJywgb24gPyAndHJ1ZScgOiAnZmFsc2UnKTsKICAgICAgdGh1bWIuc3R5bGUubGVmdCA9IG9uID8gJzI0cHgnIDogJzJweCc7CiAgICAgIHRyYWNrLnN0eWxlLmJhY2tncm91bmQgPSBvbiA/ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknIDogJ3ZhcigtLXYtbGluZSwgcmdiYSgyNDUsMjQ1LDI0NywuMTgpKSc7CiAgICAgIG9uQ2hhbmdlKG9uKTsKICAgIH0pOwogICAgcmV0dXJuIHdyYXA7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3RDb250cm9sKG9wdGlvbnMsIHZhbHVlLCBvbkNoYW5nZSwgYXJpYUxhYmVsKSB7CiAgICB2YXIgc2VsID0gZWwoJ3NlbGVjdCcsIHsgY2xhc3M6ICd2LXNlbGVjdCcsICdhcmlhLWxhYmVsJzogYXJpYUxhYmVsIHx8ICdTZWxlY3QnLCBzdHlsZTogeyBtaW5XaWR0aDogJzE4MHB4JyB9IH0pOwogICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7CiAgICAgIHZhciBvcHQgPSBlbCgnb3B0aW9uJywgeyB2YWx1ZTogby52YWx1ZSwgdGV4dDogby5sYWJlbCB9KTsKICAgICAgaWYgKFN0cmluZyhvLnZhbHVlKSA9PT0gU3RyaW5nKHZhbHVlKSkgb3B0LnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgc2VsLmFwcGVuZENoaWxkKG9wdCk7CiAgICB9KTsKICAgIHNlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7IG9uQ2hhbmdlKHNlbC52YWx1ZSk7IH0pOwogICAgcmV0dXJuIHNlbDsKICB9CgogIGZ1bmN0aW9uIGluZHVzdHJ5Q2xvdWQoc2VsZWN0ZWRLZXlzLCBvblRvZ2dsZSkgewogICAgdmFyIGxpc3QgPSAoVi5kYXRhICYmIFYuZGF0YS5pbmR1c3RyaWVzKSB8fCBbXTsKICAgIHZhciBzZWxlY3RlZCA9IHt9OwogICAgKHNlbGVjdGVkS2V5cyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoaykgeyBzZWxlY3RlZFtrXSA9IHRydWU7IH0pOwogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtY2hpcC1yb3cnLCBzdHlsZTogeyBmbGV4V3JhcDogJ3dyYXAnLCBvdmVyZmxvdzogJ3Zpc2libGUnIH0gfSk7CiAgICBpZiAoIWxpc3QubGVuZ3RoKSB7CiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHRleHQ6ICdObyBpbmR1c3RyaWVzIGF2YWlsYWJsZS4nIH0pKTsKICAgICAgcmV0dXJuIHdyYXA7CiAgICB9CiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGluZCkgewogICAgICB2YXIga2V5ID0gaW5kLmtleTsKICAgICAgdmFyIGNoaXAgPSBlbCgnYnV0dG9uJywgewogICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgIGNsYXNzOiAndi1jaGlwJyArIChzZWxlY3RlZFtrZXldID8gJyB2LWNoaXAtLWFjdGl2ZScgOiAnJyksCiAgICAgICAgJ2FyaWEtcHJlc3NlZCc6IHNlbGVjdGVkW2tleV0gPyAndHJ1ZScgOiAnZmFsc2UnCiAgICAgIH0sIGluZC5sYWJlbCB8fCBrZXkpOwogICAgICBjaGlwLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgIHNlbGVjdGVkW2tleV0gPSAhc2VsZWN0ZWRba2V5XTsKICAgICAgICBjaGlwLmNsYXNzTGlzdC50b2dnbGUoJ3YtY2hpcC0tYWN0aXZlJywgc2VsZWN0ZWRba2V5XSk7CiAgICAgICAgY2hpcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIHNlbGVjdGVkW2tleV0gPyAndHJ1ZScgOiAnZmFsc2UnKTsKICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHNlbGVjdGVkKS5maWx0ZXIoZnVuY3Rpb24gKGspIHsgcmV0dXJuIHNlbGVjdGVkW2tdOyB9KTsKICAgICAgICBvblRvZ2dsZShrZXlzKTsKICAgICAgfSk7CiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQoY2hpcCk7CiAgICB9KTsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gaW5kdXN0cnlCdWJibGVHcmlkKHNlbGVjdGVkS2V5cywgb25Ub2dnbGUpIHsKICAgIHZhciBsaXN0ID0gKFYuZGF0YSAmJiBWLmRhdGEuaW5kdXN0cmllcykgfHwgW107CiAgICB2YXIgc2VsZWN0ZWQgPSB7fTsKICAgIChzZWxlY3RlZEtleXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGspIHsgc2VsZWN0ZWRba10gPSB0cnVlOyB9KTsKICAgIHZhciBncmlkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW9uYl9fZ3JpZCcsIHJvbGU6ICdncm91cCcsICdhcmlhLWxhYmVsJzogJ0luZHVzdHJpZXMnIH0pOwogICAgaWYgKCFsaXN0Lmxlbmd0aCkgewogICAgICBncmlkLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCB0ZXh0OiAnTm8gaW5kdXN0cmllcyBhdmFpbGFibGUuJyB9KSk7CiAgICAgIHJldHVybiBncmlkOwogICAgfQogICAgZnVuY3Rpb24gZW1pdCgpIHsKICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzZWxlY3RlZCkuZmlsdGVyKGZ1bmN0aW9uIChrKSB7IHJldHVybiBzZWxlY3RlZFtrXTsgfSk7CiAgICAgIG9uVG9nZ2xlKGtleXMpOwogICAgfQogICAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpbmQpIHsKICAgICAgdmFyIGtleSA9IGluZC5rZXk7CiAgICAgIHZhciBidWJibGUgPSBlbCgnYnV0dG9uJywgewogICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgIGNsYXNzOiAndi1vbmJfX2J1YmJsZScgKyAoc2VsZWN0ZWRba2V5XSA/ICcgdi1vbmJfX2J1YmJsZS0tb24nIDogJycpLAogICAgICAgICdhcmlhLXByZXNzZWQnOiBzZWxlY3RlZFtrZXldID8gJ3RydWUnIDogJ2ZhbHNlJwogICAgICB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytb25iX19idWJibGUtbWFyaycsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9LCBpY29uKCdjaGVja21hcmsnKSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1vbmJfX2J1YmJsZS10aXRsZScsIHRleHQ6IGluZC5sYWJlbCB8fCBrZXkgfSksCiAgICAgICAgaW5kLnBsYWNlaG9sZGVyID8gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1vbmJfX2J1YmJsZS1kZXNjJywgdGV4dDogYnViYmxlSGludChpbmQucGxhY2Vob2xkZXIpIH0pIDogbnVsbCk7CiAgICAgIGJ1YmJsZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICBzZWxlY3RlZFtrZXldID0gIXNlbGVjdGVkW2tleV07CiAgICAgICAgYnViYmxlLmNsYXNzTGlzdC50b2dnbGUoJ3Ytb25iX19idWJibGUtLW9uJywgc2VsZWN0ZWRba2V5XSk7CiAgICAgICAgYnViYmxlLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgc2VsZWN0ZWRba2V5XSA/ICd0cnVlJyA6ICdmYWxzZScpOwogICAgICAgIGJ1YmJsZS5jbGFzc0xpc3QucmVtb3ZlKCd2LW9uYl9fYnViYmxlLS1wdWxzZScpOwogICAgICAgIHZvaWQgYnViYmxlLm9mZnNldFdpZHRoOwogICAgICAgIGJ1YmJsZS5jbGFzc0xpc3QuYWRkKCd2LW9uYl9fYnViYmxlLS1wdWxzZScpOwogICAgICAgIGVtaXQoKTsKICAgICAgfSk7CiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoYnViYmxlKTsKICAgIH0pOwogICAgcmV0dXJuIGdyaWQ7CiAgfQogIGZ1bmN0aW9uIGJ1YmJsZUhpbnQocGxhY2Vob2xkZXIpIHsKICAgIHZhciBzID0gU3RyaW5nKHBsYWNlaG9sZGVyIHx8ICcnKS5yZXBsYWNlKC9eRGVzY3JpYmVccyt0aGVccysvaSwgJycpLnNwbGl0KCfigJQnKVswXS50cmltKCk7CiAgICBpZiAoIXMpIHJldHVybiAnJzsKICAgIHMgPSBzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKTsKICAgIHJldHVybiBzLmxlbmd0aCA+IDQyID8gcy5zbGljZSgwLCA0MCkudHJpbSgpICsgJ+KApicgOiBzOwogIH0KCiAgZnVuY3Rpb24gcmVjb21tZW5kZWRNb2RlbChpbmR1c3RyeUtleXMpIHsKICAgIHZhciBtb2RlbHMgPSAoKFYuZGF0YSAmJiBWLmRhdGEubW9kZWxzKSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtICYmIG0ucmF3ICE9PSAndW5saW1pdGVkJzsgfSk7CiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBudWxsOwogICAgdmFyIHByZWZlciA9IChpbmR1c3RyeUtleXMgJiYgaW5kdXN0cnlLZXlzLmxlbmd0aCkgPyBbJ2ZsdXgnLCAncHJvJywgJ2VkaXQnXSA6IFsnc2NobmVsbCcsICdmYXN0J107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWZlci5sZW5ndGg7IGkrKykgewogICAgICB2YXIgaGl0ID0gbW9kZWxzLmZpbHRlcihmdW5jdGlvbiAobSkgeyByZXR1cm4gU3RyaW5nKG0ucmF3IHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocHJlZmVyW2ldKSA+PSAwOyB9KVswXTsKICAgICAgaWYgKGhpdCkgcmV0dXJuIGhpdC5yYXc7CiAgICB9CiAgICByZXR1cm4gbW9kZWxzWzBdLnJhdzsKICB9CgogIGZ1bmN0aW9uIGN0YUJ1dHRvbihsYWJlbCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgY2xzID0gJ3YtY3RhJzsKICAgIGlmIChvcHRzLnByaW1hcnkpIGNscyArPSAnIHYtY3RhLS1wcmltYXJ5JzsKICAgIGVsc2UgaWYgKG9wdHMuZ2hvc3QpIGNscyArPSAnIHYtY3RhLS1naG9zdCc7CiAgICBpZiAob3B0cy5kYW5nZXIpIGNscyArPSAnIHYtY3RhLS1kYW5nZXInOwogICAgaWYgKG9wdHMuYmxvY2spIGNscyArPSAnIHYtY3RhLS1ibG9jayc7CiAgICBpZiAob3B0cy5zbWFsbCkgY2xzICs9ICcgdi1jdGEtLXNtJzsKICAgIHZhciBidG4gPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6IGNscyB9KTsKICAgIGlmIChvcHRzLmljb24pIGJ0bi5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWN0YV9faWNvbicgfSwgaWNvbihvcHRzLmljb24pKSk7CiAgICBidG4uYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IHRleHQ6IGxhYmVsIH0pKTsKICAgIGlmIChvcHRzLm9uQ2xpY2spIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wdHMub25DbGljayk7CiAgICByZXR1cm4gYnRuOwogIH0KCiAgZnVuY3Rpb24gbGlua0J1dHRvbihsYWJlbCwgaHJlZiwgaWMpIHsKICAgIHZhciBhID0gZWwoJ2EnLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1zbScsIGhyZWY6IGhyZWYsIHRhcmdldDogJ19ibGFuaycsIHJlbDogJ25vb3BlbmVyIG5vcmVmZXJyZXInIH0pOwogICAgaWYgKGljKSBhLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3RhX19pY29uJyB9LCBpY29uKGljKSkpOwogICAgYS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgdGV4dDogbGFiZWwgfSkpOwogICAgcmV0dXJuIGE7CiAgfQoKICBmdW5jdGlvbiBhdXRoR3VhcmQocm9vdCkgewogICAgdmFyIGF1dGhlZCA9IGZhbHNlOwogICAgdHJ5IHsgYXV0aGVkID0gVi5hdXRoICYmIHR5cGVvZiBWLmF1dGguaXNBdXRoZWQgPT09ICdmdW5jdGlvbicgPyBWLmF1dGguaXNBdXRoZWQoKSA6ICEhY3VycmVudFVzZXIoKTsgfSBjYXRjaCAoZSkgeyBhdXRoZWQgPSAhIWN1cnJlbnRVc2VyKCk7IH0KICAgIGlmICghYXV0aGVkKSB7CiAgICAgIG1vdW50RW1wdHkocm9vdCwgJ1NpZ24gaW4gdG8gY29udGludWUnLCAnWW91IG5lZWQgYW4gYWNjb3VudCB0byB2aWV3IHRoaXMgcGFnZS4nLCAnU2lnbiBJbicsIGZ1bmN0aW9uICgpIHsgbmF2aWdhdGUoJyMvYXV0aCcpOyB9KTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBtb3VudEVtcHR5KHJvb3QsIHRpdGxlLCBtc2csIGFjdGlvbkxhYmVsLCBvbkFjdGlvbikgewogICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgIHZhciBjYXJkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5IGdsYXNzLWNhcmQnIH0sCiAgICAgIGVsKCdoMicsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScsIHRleHQ6IHRpdGxlIH0pLAogICAgICBtc2cgPyBlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19tc2cnLCB0ZXh0OiBtc2cgfSkgOiBudWxsKTsKICAgIGlmIChhY3Rpb25MYWJlbCAmJiBvbkFjdGlvbikgY2FyZC5hcHBlbmRDaGlsZChjdGFCdXR0b24oYWN0aW9uTGFiZWwsIHsgcHJpbWFyeTogdHJ1ZSwgb25DbGljazogb25BY3Rpb24gfSkpOwogICAgcm9vdC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtcGFnZScgfSwgY2FyZCkpOwogIH0KCiAgVi52aWV3cy5zZXR0aW5ncyA9IChmdW5jdGlvbiAoKSB7CiAgICB2YXIgdW5zdWIgPSBbXTsKCiAgICBmdW5jdGlvbiByZW5kZXIocm9vdCkgewogICAgICB0ZWFyZG93bigpOwogICAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWF1dGhHdWFyZChyb290KSkgcmV0dXJuOwoKICAgICAgdmFyIGlkZW50ID0gdXNlcklkZW50aXR5KCk7CiAgICAgIHZhciB2aWV3ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBhZ2Ugdi12aWV3LS1zZXR0aW5ncycgfSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKGVsKCdoZWFkZXInLCB7IGNsYXNzOiAndi1zZWN0aW9uX19oZWFkJyB9LAogICAgICAgIGVsKCdkaXYnLCBudWxsLAogICAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1leWVicm93JywgdGV4dDogJ0FjY291bnQnIH0pLAogICAgICAgICAgZWwoJ2gxJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fdGl0bGUnLCBzdHlsZTogeyBmb250U2l6ZTogJ3ZhcigtLWZvbnQtbGFyZ2UtdGl0bGUsIDM0cHgpJyB9LCB0ZXh0OiAnU2V0dGluZ3MnIH0pKSkpOwoKICAgICAgdmFyIGNyZWRpdHNFbCA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicgfSB9KTsKICAgICAgZnVuY3Rpb24gcGFpbnRDcmVkaXRzKG4pIHsKICAgICAgICBjcmVkaXRzRWwuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgdmFyIHBpbGwgPSAoVi51aSAmJiB0eXBlb2YgVi51aS5jcmVkaXRzUGlsbCA9PT0gJ2Z1bmN0aW9uJykgPyBWLnVpLmNyZWRpdHNQaWxsKG4gPT0gbnVsbCA/IDAgOiBuKSA6IG51bGw7CiAgICAgICAgaWYgKHBpbGwpIGNyZWRpdHNFbC5hcHBlbmRDaGlsZChwaWxsKTsKICAgICAgICBlbHNlIGNyZWRpdHNFbC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LW1vbm8nLCB0ZXh0OiAobiA9PSBudWxsID8gJ+KAlCcgOiBuKSArICcgQ3JlZGl0cycgfSkpOwogICAgICB9CiAgICAgIHBhaW50Q3JlZGl0cyhjcmVkaXRzVmFsdWUoKSk7CgogICAgICB2YXIgcHJvZmlsZU1ldGEgPSBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcycHgnLCBtaW5XaWR0aDogJzAnIH0gfSwKICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBmb250V2VpZ2h0OiAnNzAwJywgZm9udFNpemU6ICd2YXIoLS1mb250LXRpdGxlMywgMjBweCknIH0sIHRleHQ6IGlkZW50Lm5hbWUgfHwgaWRlbnQudXNlcm5hbWUgfHwgJ1ZhbXAgQ3JlYXRvcicgfSkpOwogICAgICBpZiAoaWRlbnQuZW1haWwpIHByb2ZpbGVNZXRhLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTRweCcgfSwgdGV4dDogaWRlbnQuZW1haWwgfSkpOwogICAgICBpZiAoaWRlbnQudXNlcm5hbWUpIHByb2ZpbGVNZXRhLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcgfSwgdGV4dDogJ0AnICsgaWRlbnQudXNlcm5hbWUgfSkpOwogICAgICBpZiAoaWRlbnQuYWRtaW4pIHByb2ZpbGVNZXRhLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgewogICAgICAgIGNsYXNzOiAndi1tb25vJywKICAgICAgICBzdHlsZTogeyBtYXJnaW5Ub3A6ICc0cHgnLCBmb250U2l6ZTogJzExcHgnLCBjb2xvcjogJ3ZhcigtLXZhbXAtYWNjZW50LCAjNTI5N0Y4KScsIHRleHRUcmFuc2Zvcm06ICd1cHBlcmNhc2UnLCBsZXR0ZXJTcGFjaW5nOiAnMC4xMmVtJyB9LAogICAgICAgIHRleHQ6ICdBZG1pbicKICAgICAgfSkpOwoKICAgICAgdmFyIHByb2ZpbGVSaWdodCA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJ3ZhcigtLXNwYWNlLXNtLCA5cHgpJywgYWxpZ25JdGVtczogJ2ZsZXgtZW5kJywgZmxleDogJzAgMCBhdXRvJyB9IH0sCiAgICAgICAgY3JlZGl0c0VsLAogICAgICAgIGN0YUJ1dHRvbignQWRkIENyZWRpdHMnLCB7IHByaW1hcnk6IHRydWUsIHNtYWxsOiB0cnVlLCBpY29uOiAncGx1cycsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvcGF5d2FsbCcpOyB9IH0pKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoZWwoJ3NlY3Rpb24nLCB7IGNsYXNzOiAnZ2xhc3MtY2FyZCcsIHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGZsZXhXcmFwOiAnd3JhcCcgfSB9LAogICAgICAgIGF2YXRhck5vZGUoaWRlbnQsIDY0KSwKICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBmbGV4OiAnMSAxIDIwMHB4JywgbWluV2lkdGg6ICcwJyB9IH0sIHByb2ZpbGVNZXRhKSwKICAgICAgICBwcm9maWxlUmlnaHQpKTsKCiAgICAgIHJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgeyBpZiAobiAhPSBudWxsKSBwYWludENyZWRpdHMobik7IH0pOwogICAgICB2YXIgY3JlZGl0Q2IgPSBmdW5jdGlvbiAobikgeyBwYWludENyZWRpdHMobik7IH07CiAgICAgIHRyeSB7IGlmIChWLnN0b3JlICYmIFYuc3RvcmUub24pIHsgVi5zdG9yZS5vbignY3JlZGl0czpjaGFuZ2VkJywgY3JlZGl0Q2IpOyB1bnN1Yi5wdXNoKGZ1bmN0aW9uICgpIHsgVi5zdG9yZS5vZmYgJiYgVi5zdG9yZS5vZmYoJ2NyZWRpdHM6Y2hhbmdlZCcsIGNyZWRpdENiKTsgfSk7IH0gfSBjYXRjaCAoZSkge30KCiAgICAgIHZhciBtb2RlbHMgPSAoKFYuZGF0YSAmJiBWLmRhdGEubW9kZWxzKSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtICYmIG0ucmF3ICE9PSAndW5saW1pdGVkJzsgfSk7CiAgICAgIHZhciBtb2RlbE9wdHMgPSBtb2RlbHMubWFwKGZ1bmN0aW9uIChtKSB7CiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG0ucmF3LCBsYWJlbDogKG0ubGFiZWwgfHwgbS5yYXcpICsgKG0uc3ViaGVhZGluZyA/ICcg4oCUICcgKyBtLnN1YmhlYWRpbmcgOiAnJykgKyAobS5jb3N0ICE9IG51bGwgPyAnICgnICsgbS5jb3N0ICsgJyBjciknIDogJycpIH07CiAgICAgIH0pOwogICAgICB2YXIgYXNwZWN0cyA9IChWLmRhdGEgJiYgVi5kYXRhLmFzcGVjdHMpIHx8IFtdOwogICAgICB2YXIgYXNwZWN0T3B0cyA9IGFzcGVjdHMubWFwKGZ1bmN0aW9uIChhKSB7IHJldHVybiB7IHZhbHVlOiBhLnJhdywgbGFiZWw6IGEubGFiZWwgfHwgYS5yYXcgfTsgfSk7CgogICAgICB2YXIgcyA9IHNldHRpbmdzKCk7CiAgICAgIHZhciBkZWZNb2RlbCA9IHMuZGVmYXVsdE1vZGVsIHx8IChtb2RlbHNbMF0gJiYgbW9kZWxzWzBdLnJhdykgfHwgJyc7CiAgICAgIHZhciBkZWZBc3BlY3QgPSBzLmRlZmF1bHRBc3BlY3QgfHwgKGFzcGVjdHNbMF0gJiYgYXNwZWN0c1swXS5yYXcpIHx8ICdhdXRvJzsKCiAgICAgIHZhciBkZWZhdWx0c0JvZHkgPSBbXTsKICAgICAgaWYgKG1vZGVsT3B0cy5sZW5ndGgpIHsKICAgICAgICBkZWZhdWx0c0JvZHkucHVzaChzZXR0aW5nUm93KCdEZWZhdWx0IG1vZGVsJywKICAgICAgICAgIHNlbGVjdENvbnRyb2wobW9kZWxPcHRzLCBkZWZNb2RlbCwgZnVuY3Rpb24gKHYpIHsgc2V0dGluZ0NoYW5nZSgnZGVmYXVsdE1vZGVsJywgdik7IHRvYXN0KCdEZWZhdWx0IG1vZGVsIHNhdmVkJywgJ3N1Y2Nlc3MnKTsgfSwgJ0RlZmF1bHQgbW9kZWwnKSwKICAgICAgICAgICdUaGUgc3RhcnRpbmcgbW9kZWwgZm9yIG5ldyBnZW5lcmF0aW9ucy4nKSk7CiAgICAgIH0KICAgICAgaWYgKGFzcGVjdE9wdHMubGVuZ3RoKSB7CiAgICAgICAgZGVmYXVsdHNCb2R5LnB1c2goc2V0dGluZ1JvdygnRGVmYXVsdCBhc3BlY3QgcmF0aW8nLAogICAgICAgICAgc2VsZWN0Q29udHJvbChhc3BlY3RPcHRzLCBkZWZBc3BlY3QsIGZ1bmN0aW9uICh2KSB7IHNldHRpbmdDaGFuZ2UoJ2RlZmF1bHRBc3BlY3QnLCB2KTsgdG9hc3QoJ0RlZmF1bHQgYXNwZWN0IHNhdmVkJywgJ3N1Y2Nlc3MnKTsgfSwgJ0RlZmF1bHQgYXNwZWN0IHJhdGlvJyksCiAgICAgICAgICAnQXBwbGllcyB0byB0ZXh0LXRvLWltYWdlIGdlbmVyYXRpb25zLicpKTsKICAgICAgfQogICAgICBpZiAoZGVmYXVsdHNCb2R5Lmxlbmd0aCkgdmlldy5hcHBlbmRDaGlsZChzZWN0aW9uKCdHZW5lcmF0aW9uIGRlZmF1bHRzJywgJ1BpY2sgdGhlIG1vZGVsIGFuZCBhc3BlY3QgeW91IHN0YXJ0IHdpdGguJywgZGVmYXVsdHNCb2R5KSk7CgogICAgICB2YXIgc2VsSW5kdXN0cmllcyA9IHNnZXQoJ2luZHVzdHJpZXMnLCBzLmluZHVzdHJpZXMgfHwgW10pIHx8IFtdOwogICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2VsSW5kdXN0cmllcykpIHNlbEluZHVzdHJpZXMgPSBbXTsKICAgICAgdmlldy5hcHBlbmRDaGlsZChzZWN0aW9uKCdJbmR1c3RyaWVzJywKICAgICAgICAnVGFpbG9ycyBwcmVzZXQgY2hpcHMgYW5kIHBsYWNlaG9sZGVycyB0byB3aGF0IHlvdSBjcmVhdGUuJywKICAgICAgICBbaW5kdXN0cnlDbG91ZChzZWxJbmR1c3RyaWVzLCBmdW5jdGlvbiAoa2V5cykgewogICAgICAgICAgc2V0dGluZ0NoYW5nZSgnaW5kdXN0cmllcycsIGtleXMpOwogICAgICAgICAgc3NldCgnaW5kdXN0cmllcycsIGtleXMpOwogICAgICAgIH0pXSkpOwoKICAgICAgdmFyIHdhdGVybWFyayA9IGxzR2V0KCd3YXRlcm1hcmtFbmFibGVkJywgdHJ1ZSk7CiAgICAgIHZhciBhdXRvU2F2ZSA9IGxzR2V0KCdhdXRvU2F2ZU9uQ29tcGxldGUnLCBmYWxzZSk7CiAgICAgIHZhciBjaGltZSA9IGxzR2V0KCdjaGltZU9uQ29tcGxldGUnLCBmYWxzZSk7CiAgICAgIHZhciB0YWdsaW5lID0gbHNHZXQoJ2JyYW5kVGFnbGluZScsICcnKTsKICAgICAgdmFyIHNoYXJlVHBsID0gbHNHZXQoJ3NoYXJlVGVtcGxhdGUnLCAnTWFkZSB3aXRoIEBWb29zZXlBSSBWYW1wLiBUcnkgaXQ6IHt7dXJsfX0nKTsKCiAgICAgIHZhciB0YWdsaW5lRmllbGQgPSBlbCgnaW5wdXQnLCB7CiAgICAgICAgdHlwZTogJ3RleHQnLCBjbGFzczogJ3YtZmllbGQnLCB2YWx1ZTogdGFnbGluZSwKICAgICAgICBwbGFjZWhvbGRlcjogJ2UuZy4gQ3JhZnRlZCBieSB5b3VyIHN0dWRpbycsIG1heGxlbmd0aDogMTIwLCAnYXJpYS1sYWJlbCc6ICdCcmFuZCB0YWdsaW5lJwogICAgICB9KTsKICAgICAgdGFnbGluZUZpZWxkLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsgbHNTZXQoJ2JyYW5kVGFnbGluZScsIHRhZ2xpbmVGaWVsZC52YWx1ZS50cmltKCkpOyB0b2FzdCgnVGFnbGluZSBzYXZlZCcsICdzdWNjZXNzJyk7IH0pOwoKICAgICAgdmFyIHNoYXJlRmllbGQgPSBlbCgndGV4dGFyZWEnLCB7CiAgICAgICAgY2xhc3M6ICd2LXRleHRhcmVhJywgcm93czogMiwgJ2FyaWEtbGFiZWwnOiAnU2hhcmUgdGVtcGxhdGUnLAogICAgICAgIHBsYWNlaG9sZGVyOiAnVG9rZW5zOiB7e3VybH19IHt7cHJvbXB0fX0ge3thZGRyZXNzfX0nCiAgICAgIH0pOwogICAgICBzaGFyZUZpZWxkLnZhbHVlID0gc2hhcmVUcGw7CiAgICAgIHNoYXJlRmllbGQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciB2YWwgPSBzaGFyZUZpZWxkLnZhbHVlLnRyaW0oKTsKICAgICAgICBpZiAoIS97e1xzKnVybFxzKn19Ly50ZXN0KHZhbCkpIHZhbCA9ICh2YWwgPyB2YWwgKyAnICcgOiAnJykgKyAne3t1cmx9fSc7CiAgICAgICAgc2hhcmVGaWVsZC52YWx1ZSA9IHZhbDsKICAgICAgICBsc1NldCgnc2hhcmVUZW1wbGF0ZScsIHZhbCk7CiAgICAgICAgdG9hc3QoJ1NoYXJlIHRlbXBsYXRlIHNhdmVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSk7CgogICAgICB2YXIgYnJhbmRTdGFjayA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzZweCcgfSB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1sYWJlbCcsIHRleHQ6ICdTaGFyZSB0YWdsaW5lJyB9KSwKICAgICAgICB0YWdsaW5lRmllbGQsCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW11dGVkJywgc3R5bGU6IHsgZm9udFNpemU6ICcxM3B4JyB9LCB0ZXh0OiAnQXBwZW5kZWQgdG8geW91ciBzaGFyZSB0ZXh0LicgfSkpOwogICAgICB2YXIgc2hhcmVTdGFjayA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzZweCcgfSB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1sYWJlbCcsIHRleHQ6ICdTaGFyZSB0ZW1wbGF0ZScgfSksCiAgICAgICAgc2hhcmVGaWVsZCwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEzcHgnIH0sIHRleHQ6ICdTdXBwb3J0cyB7e3VybH19LCB7e3Byb21wdH19LCB7e2FkZHJlc3N9fS4nIH0pKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoc2VjdGlvbignQnJhbmRpbmcgJiBvdXRwdXQnLCAnSG93IHlvdXIgc2hhcmVkIGltYWdlcyBhbmQgZG93bmxvYWRzIGFyZSBwcmVzZW50ZWQuJywgWwogICAgICAgIHNldHRpbmdSb3coJ1dhdGVybWFyayBleHBvcnRzJywgdG9nZ2xlKHdhdGVybWFyaywgZnVuY3Rpb24gKHYpIHsgbHNTZXQoJ3dhdGVybWFya0VuYWJsZWQnLCB2KTsgfSwgJ1dhdGVybWFyayBleHBvcnRzJyksCiAgICAgICAgICAnQWRkIGEgc3VidGxlIFZhbXAgbWFyayB0byBiZWZvcmUvYWZ0ZXIgc2hhcmVzLicpLAogICAgICAgIHNldHRpbmdSb3coJ0F1dG8tZG93bmxvYWQgb24gY29tcGxldGUnLCB0b2dnbGUoYXV0b1NhdmUsIGZ1bmN0aW9uICh2KSB7IGxzU2V0KCdhdXRvU2F2ZU9uQ29tcGxldGUnLCB2KTsgfSwgJ0F1dG8gZG93bmxvYWQnKSwKICAgICAgICAgICdTYXZlIGVhY2ggcmVzdWx0IGF1dG9tYXRpY2FsbHkgd2hlbiBpdCBmaW5pc2hlcy4nKSwKICAgICAgICBzZXR0aW5nUm93KCdQbGF5IGNoaW1lIG9uIGNvbXBsZXRlJywgdG9nZ2xlKGNoaW1lLCBmdW5jdGlvbiAodikgeyBsc1NldCgnY2hpbWVPbkNvbXBsZXRlJywgdik7IH0sICdDb21wbGV0aW9uIGNoaW1lJyksCiAgICAgICAgICAnQSBzb2Z0IHNvdW5kIHdoZW4gYSBnZW5lcmF0aW9uIGxhbmRzLicpLAogICAgICAgIGJyYW5kU3RhY2ssCiAgICAgICAgc2hhcmVTdGFjawogICAgICBdKSk7CgogICAgICB2YXIgbm90aWZ5Q29tcGxldGUgPSBsc0dldCgnbm90aWZ5T25Db21wbGV0ZScsIHRydWUpOwogICAgICB2YXIgbm90aWZ5Q3JlZGl0cyA9IGxzR2V0KCdub3RpZnlMb3dDcmVkaXRzJywgdHJ1ZSk7CiAgICAgIHZhciBub3RpZnlEaWdlc3QgPSBsc0dldCgnbm90aWZ5V2Vla2x5RGlnZXN0JywgZmFsc2UpOwogICAgICB2YXIgbGl2ZUFjdGl2aXRpZXMgPSBsc0dldCgnbGl2ZUFjdGl2aXRpZXMnLCB0cnVlKTsKCiAgICAgIHZhciBwZXJtUm93ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWFjYy1yb3cgdi1hY2Mtcm93LS1ub3RpY2UnIH0sCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWFjYy1yb3dfX21haW4nIH0sCiAgICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbGFiZWwnLCB0ZXh0OiAnQnJvd3NlciBub3RpZmljYXRpb25zJyB9KSwKICAgICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcgfSwgdGV4dDogbm90aWZ5UGVybWlzc2lvbkxhYmVsKCkgfSkpLAogICAgICAgIG5vdGlmeVBlcm1pc3Npb25Db250cm9sKCkpOwogICAgICB2aWV3LmFwcGVuZENoaWxkKHNlY3Rpb24oJ05vdGlmaWNhdGlvbnMnLCAnQ2hvb3NlIHdoYXQgVmFtcCBwaW5ncyB5b3UgYWJvdXQuJywgWwogICAgICAgIHBlcm1Sb3csCiAgICAgICAgc2V0dGluZ1JvdygnR2VuZXJhdGlvbiBjb21wbGV0ZScsIHRvZ2dsZShub3RpZnlDb21wbGV0ZSwgZnVuY3Rpb24gKHYpIHsgbHNTZXQoJ25vdGlmeU9uQ29tcGxldGUnLCB2KTsgbWF5YmVSZXF1ZXN0Tm90aWZ5UGVybWlzc2lvbih2KTsgfSwgJ05vdGlmeSBvbiBjb21wbGV0ZScpLAogICAgICAgICAgJ0FsZXJ0IG1lIHRoZSBtb21lbnQgYSByZW5kZXIgbGFuZHMuJyksCiAgICAgICAgc2V0dGluZ1JvdygnTG93IGNyZWRpdCB3YXJuaW5ncycsIHRvZ2dsZShub3RpZnlDcmVkaXRzLCBmdW5jdGlvbiAodikgeyBsc1NldCgnbm90aWZ5TG93Q3JlZGl0cycsIHYpOyB9LCAnTG93IGNyZWRpdCB3YXJuaW5ncycpLAogICAgICAgICAgJ0hlYWRzLXVwIGJlZm9yZSB5b3UgcnVuIG91dCBvZiBjcmVkaXRzLicpLAogICAgICAgIHNldHRpbmdSb3coJ0xpdmUgcHJvZ3Jlc3MgYWN0aXZpdHknLCB0b2dnbGUobGl2ZUFjdGl2aXRpZXMsIGZ1bmN0aW9uICh2KSB7IGxzU2V0KCdsaXZlQWN0aXZpdGllcycsIHYpOyB9LCAnTGl2ZSBhY3Rpdml0aWVzJyksCiAgICAgICAgICAnU2hvdyBhIGxpdmUgcHJvZ3Jlc3MgaW5kaWNhdG9yIHdoaWxlIGdlbmVyYXRpbmcuJyksCiAgICAgICAgc2V0dGluZ1JvdygnV2Vla2x5IGRpZ2VzdCcsIHRvZ2dsZShub3RpZnlEaWdlc3QsIGZ1bmN0aW9uICh2KSB7IGxzU2V0KCdub3RpZnlXZWVrbHlEaWdlc3QnLCB2KTsgfSwgJ1dlZWtseSBkaWdlc3QnKSwKICAgICAgICAgICdBIHdlZWtseSByZWNhcCBvZiB3aGF0IHlvdSBjcmVhdGVkLicpCiAgICAgIF0pKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoc2VjdGlvbignU3Vic2NyaXB0aW9uICYgYmlsbGluZycsICdNYW5hZ2UgY3JlZGl0cywgcGxhbnMgYW5kIHBheW1lbnQuJywgWwogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jdGEtcm93JyB9LAogICAgICAgICAgY3RhQnV0dG9uKCdCdXkgY3JlZGl0cycsIHsgcHJpbWFyeTogdHJ1ZSwgaWNvbjogJ3NwYXJrbGVzJywgb25DbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9wYXl3YWxsJyk7IH0gfSksCiAgICAgICAgICBjdGFCdXR0b24oJ01hbmFnZSBzdWJzY3JpcHRpb24nLCB7IGdob3N0OiB0cnVlLCBvbkNsaWNrOiBtYW5hZ2VTdWJzY3JpcHRpb24gfSkpLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEzcHgnIH0sIHRleHQ6ICdQdXJjaGFzZXMgYXJlIGhhbmRsZWQgc2VjdXJlbHkgdmlhIFN0cmlwZS4nIH0pCiAgICAgIF0pKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoc2VjdGlvbignR3JvdyB3aXRoIFZhbXAnLCAnRWFybiBjcmVkaXRzIGJ5IHNoYXJpbmcgYW5kIHBvc3RpbmcuJywgWwogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jdGEtcm93JyB9LAogICAgICAgICAgY3RhQnV0dG9uKCdSZWZlcnJhbCBkYXNoYm9hcmQnLCB7IGdob3N0OiB0cnVlLCBpY29uOiAnZ2lmdCcsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvcmVmZXJyYWwnKTsgfSB9KSwKICAgICAgICAgIGN0YUJ1dHRvbignRGFpbHkgY2hhbGxlbmdlJywgeyBnaG9zdDogdHJ1ZSwgaWNvbjogJ2ZsYW1lJywgb25DbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9jaGFsbGVuZ2UnKTsgfSB9KSkKICAgICAgXSkpOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChzZWN0aW9uKCdIZWxwICYgc3VwcG9ydCcsICdGQVEsIHByaXZhY3kgYW5kIHRlcm1zLicsIFsKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3RhLXJvdycgfSwKICAgICAgICAgIGxpbmtCdXR0b24oJ0hlbHAgY2VudGVyJywgJ2h0dHBzOi8vdm9vc2V5LmNvbS9oZWxwJywgJ2hlbHAnKSwKICAgICAgICAgIGxpbmtCdXR0b24oJ1ByaXZhY3knLCAnaHR0cHM6Ly92b29zZXkuY29tL3ByaXZhY3knKSwKICAgICAgICAgIGxpbmtCdXR0b24oJ1Rlcm1zJywgJ2h0dHBzOi8vdm9vc2V5LmNvbS90ZXJtcycpKQogICAgICBdKSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKHNlY3Rpb24oJ0RhdGEgJiByZXNldCcsICdFeHBvcnQgeW91ciBkYXRhLCBjbGVhciBjYWNoZSBvciByZXBsYXkgb25ib2FyZGluZy4nLCBbCiAgICAgICAgc2V0dGluZ1JvdygnRXhwb3J0IG15IGRhdGEnLAogICAgICAgICAgY3RhQnV0dG9uKCdFeHBvcnQnLCB7IGdob3N0OiB0cnVlLCBzbWFsbDogdHJ1ZSwgaWNvbjogJ2Rvd25sb2FkJywgb25DbGljazogZXhwb3J0TXlEYXRhIH0pLAogICAgICAgICAgJ0Rvd25sb2FkIHlvdXIgcHJlZmVyZW5jZXMgYW5kIGxpYnJhcnkgYXMgYSBKU09OIGZpbGUuJyksCiAgICAgICAgc2V0dGluZ1JvdygnQ2xlYXIgbG9jYWwgY2FjaGUnLAogICAgICAgICAgY3RhQnV0dG9uKCdDbGVhciBjYWNoZScsIHsgZ2hvc3Q6IHRydWUsIHNtYWxsOiB0cnVlLCBpY29uOiAndHJhc2gnLCBvbkNsaWNrOiBjbGVhckxvY2FsQ2FjaGUgfSksCiAgICAgICAgICAnRnJlZXMgc3BhY2UgdXNlZCBieSBjYWNoZWQgaW1hZ2VzIGFuZCBzdG9yZWQgcHJlZnMuJyksCiAgICAgICAgc2V0dGluZ1JvdygnUmVwbGF5IG9uYm9hcmRpbmcnLCBjdGFCdXR0b24oJ1Jlc2V0IG9uYm9hcmRpbmcnLCB7IGdob3N0OiB0cnVlLCBzbWFsbDogdHJ1ZSwgb25DbGljazogcmVzZXRPbmJvYXJkaW5nIH0pLAogICAgICAgICAgJ0NsZWFycyBpbmR1c3RyaWVzIGFuZCBzaG93cyB0aGUgZmlyc3QtcnVuIGZsb3cgYWdhaW4uJykKICAgICAgXSkpOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChzZWN0aW9uKCdBY2NvdW50JywgJ1VwZGF0ZSB5b3VyIGRldGFpbHMgb3Igc2lnbiBvdXQuJywgWwogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jdGEtcm93JyB9LAogICAgICAgICAgY3RhQnV0dG9uKCdVcGRhdGUgYWNjb3VudCcsIHsgZ2hvc3Q6IHRydWUsIGljb246ICdwZW5jaWwnLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IG9wZW5VcGRhdGVBY2NvdW50KGlkZW50KTsgfSB9KSwKICAgICAgICAgIGN0YUJ1dHRvbignTG9nIG91dCcsIHsgZ2hvc3Q6IHRydWUsIGljb246ICdsb2dvdXQnLCBvbkNsaWNrOiBsb2dvdXQgfSkpLAogICAgICAgIGVsKCdocicsIHsgY2xhc3M6ICd2LWhyJyB9KSwKICAgICAgICBzZXR0aW5nUm93KCdEZWxldGUgYWNjb3VudCcsCiAgICAgICAgICBjdGFCdXR0b24oJ0RlbGV0ZScsIHsgZGFuZ2VyOiB0cnVlLCBzbWFsbDogdHJ1ZSwgb25DbGljazogZGVsZXRlQWNjb3VudCB9KSwKICAgICAgICAgICdQZXJtYW5lbnRseSByZW1vdmVzIHlvdXIgYWNjb3VudCBhbmQgYWxsIGRhdGEuJykKICAgICAgXSkpOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChlbCgnZm9vdGVyJywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBmbGV4V3JhcDogJ3dyYXAnLCBnYXA6ICd2YXIoLS1zcGFjZS1zbSwgOXB4KScsIHBhZGRpbmdUb3A6ICd2YXIoLS1zcGFjZS1tZCwgMTVweCknIH0gfSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LW1vbm8nLCBzdHlsZTogeyBmb250U2l6ZTogJzEycHgnLCBjb2xvcjogJ3ZhcigtLXYtaW5rLXNvZnQsIHJnYmEoMjQ1LDI0NSwyNDcsLjY2KSknIH0sIHRleHQ6ICdWYW1wIGJ5IFZvb3NleScgfSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tb25vJywgc3R5bGU6IHsgZm9udFNpemU6ICcxMnB4JywgY29sb3I6ICd2YXIoLS12LWluay1zb2Z0LCByZ2JhKDI0NSwyNDUsMjQ3LC42NikpJyB9LCB0ZXh0OiAnSGF2ZSB0aGUgTWVhbnMuJyB9KSkpOwoKICAgICAgcm9vdC5hcHBlbmRDaGlsZCh2aWV3KTsKICAgIH0KCiAgICBmdW5jdGlvbiBtYW5hZ2VTdWJzY3JpcHRpb24oKSB7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKFYucGF5ICYmIHR5cGVvZiBWLnBheS5vcGVuUG9ydGFsID09PSAnZnVuY3Rpb24nKSB7IFYucGF5Lm9wZW5Qb3J0YWwoKTsgcmV0dXJuOyB9CiAgICAgICAgaWYgKFYuYXBpICYmIHR5cGVvZiBWLmFwaS5iaWxsaW5nUG9ydGFsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICB0b2FzdCgnT3BlbmluZyBiaWxsaW5nIHBvcnRhbOKApicsICdpbmZvJyk7CiAgICAgICAgICBWLmFwaS5iaWxsaW5nUG9ydGFsKCkudGhlbihmdW5jdGlvbiAocikgewogICAgICAgICAgICBpZiAociAmJiByLnVybCkgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByLnVybDsKICAgICAgICAgICAgZWxzZSBmYWxsYmFja0NvbnRhY3QoKTsKICAgICAgICAgIH0pLmNhdGNoKGZhbGxiYWNrQ29udGFjdCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7fQogICAgICBmYWxsYmFja0NvbnRhY3QoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZhbGxiYWNrQ29udGFjdCgpIHsKICAgICAgdG9hc3QoJ1RvIG1hbmFnZSB5b3VyIHN1YnNjcmlwdGlvbiwgY29udGFjdCBzdXBwb3J0QHZvb3NleS5jb20nLCAnaW5mbycpOwogICAgICB3aW5kb3cub3BlbignbWFpbHRvOnN1cHBvcnRAdm9vc2V5LmNvbT9zdWJqZWN0PVZhbXAlMjBTdWJzY3JpcHRpb24nLCAnX2JsYW5rJyk7CiAgICB9CgogICAgZnVuY3Rpb24gbm90aWZ5UGVybWlzc2lvbigpIHsKICAgICAgdHJ5IHsgcmV0dXJuICh0eXBlb2YgTm90aWZpY2F0aW9uICE9PSAndW5kZWZpbmVkJykgPyBOb3RpZmljYXRpb24ucGVybWlzc2lvbiA6ICd1bnN1cHBvcnRlZCc7IH0KICAgICAgY2F0Y2ggKGUpIHsgcmV0dXJuICd1bnN1cHBvcnRlZCc7IH0KICAgIH0KICAgIGZ1bmN0aW9uIG5vdGlmeVBlcm1pc3Npb25MYWJlbCgpIHsKICAgICAgdmFyIHAgPSBub3RpZnlQZXJtaXNzaW9uKCk7CiAgICAgIGlmIChwID09PSAnZ3JhbnRlZCcpIHJldHVybiAnQWxsb3dlZCBpbiB0aGlzIGJyb3dzZXIuJzsKICAgICAgaWYgKHAgPT09ICdkZW5pZWQnKSByZXR1cm4gJ0Jsb2NrZWQg4oCUIGVuYWJsZSBpbiBicm93c2VyIHNldHRpbmdzLic7CiAgICAgIGlmIChwID09PSAndW5zdXBwb3J0ZWQnKSByZXR1cm4gJ05vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyLic7CiAgICAgIHJldHVybiAnVGFwIHRvIGFsbG93IGFsZXJ0cyBpbiB0aGlzIGJyb3dzZXIuJzsKICAgIH0KICAgIGZ1bmN0aW9uIG5vdGlmeVBlcm1pc3Npb25Db250cm9sKCkgewogICAgICB2YXIgcCA9IG5vdGlmeVBlcm1pc3Npb24oKTsKICAgICAgaWYgKHAgPT09ICdncmFudGVkJykgewogICAgICAgIHJldHVybiBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWFjYy1waWxsIHYtYWNjLXBpbGwtLW9uJyB9LCBpY29uKCdjaGVja21hcmsnKSwgZWwoJ3NwYW4nLCB7IHRleHQ6ICdBbGxvd2VkJyB9KSk7CiAgICAgIH0KICAgICAgaWYgKHAgPT09ICd1bnN1cHBvcnRlZCcgfHwgcCA9PT0gJ2RlbmllZCcpIHsKICAgICAgICByZXR1cm4gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1hY2MtcGlsbCcgfSwgZWwoJ3NwYW4nLCB7IHRleHQ6IHAgPT09ICdkZW5pZWQnID8gJ0Jsb2NrZWQnIDogJ1VuYXZhaWxhYmxlJyB9KSk7CiAgICAgIH0KICAgICAgdmFyIGJ0biA9IGN0YUJ1dHRvbignQWxsb3cnLCB7IGdob3N0OiB0cnVlLCBzbWFsbDogdHJ1ZSB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyByZXF1ZXN0Tm90aWZ5UGVybWlzc2lvbihidG4pOyB9KTsKICAgICAgcmV0dXJuIGJ0bjsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcXVlc3ROb3RpZnlQZXJtaXNzaW9uKGJ0bikgewogICAgICBpZiAobm90aWZ5UGVybWlzc2lvbigpID09PSAndW5zdXBwb3J0ZWQnKSB7IHRvYXN0KCdOb3RpZmljYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGhlcmUuJywgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICAgIHRyeSB7CiAgICAgICAgTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKCkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICBpZiAocmVzID09PSAnZ3JhbnRlZCcpIHsgdG9hc3QoJ05vdGlmaWNhdGlvbnMgYWxsb3dlZCcsICdzdWNjZXNzJyk7IH0KICAgICAgICAgIGVsc2UgaWYgKHJlcyA9PT0gJ2RlbmllZCcpIHsgdG9hc3QoJ05vdGlmaWNhdGlvbnMgYmxvY2tlZCcsICdpbmZvJyk7IH0KICAgICAgICAgIGlmIChidG4gJiYgYnRuLnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgdmFyIGZyZXNoID0gbm90aWZ5UGVybWlzc2lvbkNvbnRyb2woKTsKICAgICAgICAgICAgYnRuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGZyZXNoLCBidG4pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGNhdGNoIChlKSB7fQogICAgfQogICAgZnVuY3Rpb24gbWF5YmVSZXF1ZXN0Tm90aWZ5UGVybWlzc2lvbihlbmFibGVkKSB7CiAgICAgIGlmIChlbmFibGVkICYmIG5vdGlmeVBlcm1pc3Npb24oKSA9PT0gJ2RlZmF1bHQnKSByZXF1ZXN0Tm90aWZ5UGVybWlzc2lvbihudWxsKTsKICAgIH0KCiAgICBmdW5jdGlvbiBleHBvcnRNeURhdGEoKSB7CiAgICAgIHZhciBpZGVudCA9IHVzZXJJZGVudGl0eSgpOwogICAgICB2YXIgYnVuZGxlID0gewogICAgICAgIGV4cG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICBwcm9maWxlOiB7IG5hbWU6IGlkZW50Lm5hbWUsIHVzZXJuYW1lOiBpZGVudC51c2VybmFtZSwgZW1haWw6IGlkZW50LmVtYWlsLCBhZG1pbjogaWRlbnQuYWRtaW4gfSwKICAgICAgICBzZXR0aW5nczogc2V0dGluZ3MoKSwKICAgICAgICBwcmVmZXJlbmNlczogY29sbGVjdFByZWZlcmVuY2VzKCkKICAgICAgfTsKICAgICAgdG9hc3QoJ1ByZXBhcmluZyB5b3VyIGV4cG9ydOKApicsICdpbmZvJyk7CiAgICAgIHZhciBmaW5pc2ggPSBmdW5jdGlvbiAobGlicmFyeSkgewogICAgICAgIGlmIChsaWJyYXJ5KSBidW5kbGUubGlicmFyeSA9IGxpYnJhcnk7CiAgICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoYnVuZGxlLCBudWxsLCAyKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pOwogICAgICAgIHZhciB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgICAgIHZhciBhID0gZWwoJ2EnLCB7IGhyZWY6IHVybCwgZG93bmxvYWQ6ICd2YW1wLWRhdGEtJyArIERhdGUubm93KCkgKyAnLmpzb24nIH0pOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7CiAgICAgICAgYS5jbGljaygpOwogICAgICAgIGEucmVtb3ZlKCk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHRyeSB7IFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsgfSBjYXRjaCAoZSkge30gfSwgNDAwMCk7CiAgICAgICAgdG9hc3QoJ0V4cG9ydCBkb3dubG9hZGVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgfTsKICAgICAgaWYgKFYuYXBpICYmIHR5cGVvZiBWLmFwaS5saWJyYXJ5ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgVi5hcGkubGlicmFyeSgxLCAyMDApLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgdmFyIGl0ZW1zID0gKHJlcyAmJiAocmVzLml0ZW1zIHx8IHJlcy5pbWFnZXMgfHwgcmVzKSkgfHwgW107CiAgICAgICAgICBmaW5pc2goQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtdKTsKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IGZpbmlzaChudWxsKTsgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmluaXNoKG51bGwpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY29sbGVjdFByZWZlcmVuY2VzKCkgewogICAgICB2YXIga2V5cyA9IFsnd2F0ZXJtYXJrRW5hYmxlZCcsICdhdXRvU2F2ZU9uQ29tcGxldGUnLCAnY2hpbWVPbkNvbXBsZXRlJywgJ2JyYW5kVGFnbGluZScsICdzaGFyZVRlbXBsYXRlJywKICAgICAgICAnbm90aWZ5T25Db21wbGV0ZScsICdub3RpZnlMb3dDcmVkaXRzJywgJ25vdGlmeVdlZWtseURpZ2VzdCcsICdsaXZlQWN0aXZpdGllcycsICdjaGFsbGVuZ2UnXTsKICAgICAgdmFyIG91dCA9IHt9OwogICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGspIHsgb3V0W2tdID0gbHNHZXQoaywgbnVsbCk7IH0pOwogICAgICByZXR1cm4gb3V0OwogICAgfQoKICAgIGZ1bmN0aW9uIGNsZWFyTG9jYWxDYWNoZSgpIHsKICAgICAgY29uZmlybURpYWxvZygnQ2xlYXIgbG9jYWxseSBjYWNoZWQgZGF0YT8gWW91ciBhY2NvdW50IGFuZCBjcmVkaXRzIGFyZSB1bmFmZmVjdGVkLicpLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgICAgaWYgKCFvaykgcmV0dXJuOwogICAgICAgIHRyeSB7CiAgICAgICAgICB2YXIgcHJlc2VydmUgPSB7fTsKICAgICAgICAgIFsnb25ib2FyZGluZ0RvbmUnLCAncmVmZXJyYWxDb2RlJywgJ3JlZmVycmFsQXBwbGllZCddLmZvckVhY2goZnVuY3Rpb24gKGspIHsgcHJlc2VydmVba10gPSBsc0dldChrLCBudWxsKTsgfSk7CiAgICAgICAgICB2YXIgZG9vbWVkID0gW107CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdpbmRvdy5sb2NhbFN0b3JhZ2UubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGtleSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2Uua2V5KGkpOwogICAgICAgICAgICBpZiAoa2V5ICYmIGtleS5pbmRleE9mKExTX1BSRUZJWCkgPT09IDApIGRvb21lZC5wdXNoKGtleSk7CiAgICAgICAgICB9CiAgICAgICAgICBkb29tZWQuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IHRyeSB7IHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpOyB9IGNhdGNoIChlKSB7fSB9KTsKICAgICAgICAgIE9iamVjdC5rZXlzKHByZXNlcnZlKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IGlmIChwcmVzZXJ2ZVtrXSAhPSBudWxsKSBsc1NldChrLCBwcmVzZXJ2ZVtrXSk7IH0pOwogICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgdG9hc3QoJ0xvY2FsIGNhY2hlIGNsZWFyZWQnLCAnc3VjY2VzcycpOwogICAgICAgIHZhciBvdXRsZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndi1vdXRsZXQnKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudi1vdXRsZXQnKTsKICAgICAgICBpZiAob3V0bGV0KSByZW5kZXIob3V0bGV0KTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzZXRPbmJvYXJkaW5nKCkgewogICAgICBjb25maXJtRGlhbG9nKCdSZXNldCBvbmJvYXJkaW5nPyBZb3VyIHNlbGVjdGVkIGluZHVzdHJpZXMgd2lsbCBiZSBjbGVhcmVkLicpLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgICAgaWYgKCFvaykgcmV0dXJuOwogICAgICAgIHNzZXQoJ2luZHVzdHJpZXMnLCBbXSk7CiAgICAgICAgc2V0dGluZ0NoYW5nZSgnaW5kdXN0cmllcycsIFtdKTsKICAgICAgICBzc2V0KCdvbmJvYXJkaW5nRG9uZScsIGZhbHNlKTsKICAgICAgICB0cnkgeyBpZiAoVi5zdGF0ZSkgVi5zdGF0ZS5vbmJvYXJkaW5nRG9uZSA9IGZhbHNlOyB9IGNhdGNoIChlKSB7fQogICAgICAgIGxzU2V0KCdzZWVuQ3JlZGl0V2VsY29tZScsIGZhbHNlKTsKICAgICAgICB0b2FzdCgnT25ib2FyZGluZyByZXNldCcsICdzdWNjZXNzJyk7CiAgICAgICAgZ28oJyMvb25ib2FyZGluZycpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBsb2dvdXQoKSB7CiAgICAgIGNvbmZpcm1EaWFsb2coJ0xvZyBvdXQgb2YgVmFtcD8nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgICB0cnkgeyBpZiAoVi5hdXRoICYmIHR5cGVvZiBWLmF1dGguY2xlYXIgPT09ICdmdW5jdGlvbicpIFYuYXV0aC5jbGVhcigpOyB9IGNhdGNoIChlKSB7fQogICAgICAgIHRvYXN0KCdTaWduZWQgb3V0JywgJ2luZm8nKTsKICAgICAgICBuYXZpZ2F0ZSgnIy9hdXRoJyk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIG9wZW5VcGRhdGVBY2NvdW50KGlkZW50KSB7CiAgICAgIHZhciBuYW1lRmllbGQgPSBlbCgnaW5wdXQnLCB7IHR5cGU6ICd0ZXh0JywgY2xhc3M6ICd2LWZpZWxkJywgdmFsdWU6IGlkZW50Lm5hbWUgfHwgJycsIHBsYWNlaG9sZGVyOiAnRnVsbCBuYW1lJywgJ2FyaWEtbGFiZWwnOiAnRnVsbCBuYW1lJyB9KTsKICAgICAgdmFyIGVtYWlsRmllbGQgPSBlbCgnaW5wdXQnLCB7IHR5cGU6ICdlbWFpbCcsIGNsYXNzOiAndi1maWVsZCcsIHZhbHVlOiBpZGVudC5lbWFpbCB8fCAnJywgcGxhY2Vob2xkZXI6ICdFbWFpbCcsICdhcmlhLWxhYmVsJzogJ0VtYWlsJyB9KTsKICAgICAgdmFyIHB3RmllbGQgPSBlbCgnaW5wdXQnLCB7IHR5cGU6ICdwYXNzd29yZCcsIGNsYXNzOiAndi1maWVsZCcsIHBsYWNlaG9sZGVyOiAnTmV3IHBhc3N3b3JkIChvcHRpb25hbCknLCBhdXRvY29tcGxldGU6ICduZXctcGFzc3dvcmQnLCAnYXJpYS1sYWJlbCc6ICdOZXcgcGFzc3dvcmQnIH0pOwogICAgICB2YXIgc3RhdHVzID0gZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcsIG1pbkhlaWdodDogJzE4cHgnIH0gfSk7CiAgICAgIHZhciBzYXZlQnRuID0gY3RhQnV0dG9uKCdTYXZlIGNoYW5nZXMnLCB7IHByaW1hcnk6IHRydWUsIGJsb2NrOiB0cnVlIH0pOwoKICAgICAgdmFyIGZvcm0gPSBlbCgnZm9ybScsIHsgY2xhc3M6ICd2LXN0YWNrLW1kJyB9LAogICAgICAgIGVsKCdoMicsIHsgY2xhc3M6ICd2LW1vZGFsX190aXRsZScsIHRleHQ6ICdVcGRhdGUgYWNjb3VudCcgfSksCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWZpZWxkLWdyb3VwJyB9LCBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWxhYmVsJywgdGV4dDogJ05hbWUnIH0pLCBuYW1lRmllbGQpLAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCcgfSwgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1sYWJlbCcsIHRleHQ6ICdFbWFpbCcgfSksIGVtYWlsRmllbGQpLAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCcgfSwgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1sYWJlbCcsIHRleHQ6ICdQYXNzd29yZCcgfSksIHB3RmllbGQpLAogICAgICAgIHN0YXR1cywKICAgICAgICBzYXZlQnRuCiAgICAgICk7CgogICAgICB2YXIgaGFuZGxlID0gbnVsbDsKICAgICAgZnVuY3Rpb24gY2xvc2UoKSB7IGlmIChoYW5kbGUgJiYgaGFuZGxlLmNsb3NlKSBoYW5kbGUuY2xvc2UoKTsgfQoKICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICBpZiAoIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS51cGRhdGVBY2NvdW50ICE9PSAnZnVuY3Rpb24nKSB7IHN0YXR1cy50ZXh0Q29udGVudCA9ICdVcGRhdGluZyBhY2NvdW50cyBpcyB1bmF2YWlsYWJsZS4nOyByZXR1cm47IH0KICAgICAgICB2YXIgbm0gPSBuYW1lRmllbGQudmFsdWUudHJpbSgpOwogICAgICAgIHZhciBlbSA9IGVtYWlsRmllbGQudmFsdWUudHJpbSgpOwogICAgICAgIGlmICghbm0pIHsgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWNvbG9yLWVycm9yLCAjRjczMzYzKSc7IHN0YXR1cy50ZXh0Q29udGVudCA9ICdOYW1lIGlzIHJlcXVpcmVkLic7IHJldHVybjsgfQogICAgICAgIGlmICghZW0gfHwgZW0uaW5kZXhPZignQCcpIDwgMCkgeyBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tY29sb3ItZXJyb3IsICNGNzMzNjMpJzsgc3RhdHVzLnRleHRDb250ZW50ID0gJ0EgdmFsaWQgZW1haWwgaXMgcmVxdWlyZWQuJzsgcmV0dXJuOyB9CiAgICAgICAgc2F2ZUJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyc7CiAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1NhdmluZ+KApic7CiAgICAgICAgdmFyIHBlcnNvbmFsID0geyBuYW1lOiBubSwgZW1haWw6IGVtIH07CiAgICAgICAgdmFyIG5tMiA9IG5tLnNwbGl0KC9ccysvKTsKICAgICAgICBwZXJzb25hbC5maXJzdE5hbWUgPSBubTJbMF0gfHwgbm07CiAgICAgICAgcGVyc29uYWwubGFzdE5hbWUgPSBubTIuc2xpY2UoMSkuam9pbignICcpIHx8ICcnOwogICAgICAgIHZhciBwdXQgPSB7IHBlcnNvbmFsOiBwZXJzb25hbCB9OwogICAgICAgIHZhciBwdyA9IHB3RmllbGQudmFsdWU7CiAgICAgICAgaWYgKHB3KSBwdXQucGFzc3dvcmQgPSBwdzsKICAgICAgICBWLmFwaS51cGRhdGVBY2NvdW50KHB1dCkudGhlbihmdW5jdGlvbiAodXBkYXRlZCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKHVwZGF0ZWQgJiYgVi5zdGF0ZSkgVi5zdGF0ZS51c2VyID0gdXBkYXRlZDsKICAgICAgICAgICAgaWYgKFYuc3RvcmUpIFYuc3RvcmUuZW1pdCgnYXV0aDpjaGFuZ2VkJywgdXBkYXRlZCB8fCBjdXJyZW50VXNlcigpKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICB0b2FzdCgnQWNjb3VudCB1cGRhdGVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgICB2YXIgb3V0bGV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Ytb3V0bGV0JykgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnYtb3V0bGV0Jyk7CiAgICAgICAgICBpZiAob3V0bGV0KSByZW5kZXIob3V0bGV0KTsKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tY29sb3ItZXJyb3IsICNGNzMzNjMpJzsKICAgICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9IChlcnIgJiYgZXJyLm1lc3NhZ2UpID8gZXJyLm1lc3NhZ2UgOiAnQ291bGQgbm90IHVwZGF0ZSBhY2NvdW50Lic7CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgdmFyIHNhdmVTdWJtaXQgPSBmdW5jdGlvbiAoKSB7IGZvcm0ucmVxdWVzdFN1Ym1pdCA/IGZvcm0ucmVxdWVzdFN1Ym1pdCgpIDogZm9ybS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnc3VibWl0JywgeyBjYW5jZWxhYmxlOiB0cnVlIH0pKTsgfTsKICAgICAgc2F2ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNhdmVTdWJtaXQpOwoKICAgICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkubW9kYWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBoYW5kbGUgPSBWLnVpLm1vZGFsKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbCcgfSwgZm9ybSksIHsgb25DbG9zZTogZnVuY3Rpb24gKCkge30gfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG92ZXJsYXkgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytb3ZlcmxheS1zY3JpbScgfSwgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vZGFsIGdsYXNzLWNhcmQnIH0sIGZvcm0pKTsKICAgICAgICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsgaWYgKGUudGFyZ2V0ID09PSBvdmVybGF5KSBvdmVybGF5LnJlbW92ZSgpOyB9KTsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpOwogICAgICAgIGhhbmRsZSA9IHsgY2xvc2U6IGZ1bmN0aW9uICgpIHsgb3ZlcmxheS5yZW1vdmUoKTsgfSB9OwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGVsZXRlQWNjb3VudCgpIHsKICAgICAgY29uZmlybURpYWxvZygnRGVsZXRlIHlvdXIgYWNjb3VudCBwZXJtYW5lbnRseT8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLicpLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgICAgaWYgKCFvaykgcmV0dXJuOwogICAgICAgIGNvbmZpcm1EaWFsb2coJ0FyZSB5b3UgYWJzb2x1dGVseSBzdXJlPyBBbGwgeW91ciBpbWFnZXMgYW5kIGRhdGEgd2lsbCBiZSBlcmFzZWQuJykudGhlbihmdW5jdGlvbiAob2syKSB7CiAgICAgICAgICBpZiAoIW9rMikgcmV0dXJuOwogICAgICAgICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkuZGVsZXRlQWNjb3VudCAhPT0gJ2Z1bmN0aW9uJykgeyB0b2FzdCgnQWNjb3VudCBkZWxldGlvbiBpcyB1bmF2YWlsYWJsZS4nLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICAgICAgICB0b2FzdCgnRGVsZXRpbmcgYWNjb3VudOKApicsICdpbmZvJyk7CiAgICAgICAgICBWLmFwaS5kZWxldGVBY2NvdW50KCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRyeSB7IGlmIChWLmF1dGggJiYgVi5hdXRoLmNsZWFyKSBWLmF1dGguY2xlYXIoKTsgfSBjYXRjaCAoZSkge30KICAgICAgICAgICAgdG9hc3QoJ0FjY291bnQgZGVsZXRlZCcsICdpbmZvJyk7CiAgICAgICAgICAgIG5hdmlnYXRlKCcjL2F1dGgnKTsKICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgdG9hc3QoKGVyciAmJiBlcnIubWVzc2FnZSkgPyBlcnIubWVzc2FnZSA6ICdDb3VsZCBub3QgZGVsZXRlIGFjY291bnQuJywgJ2Vycm9yJyk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGVhcmRvd24oKSB7CiAgICAgIHdoaWxlICh1bnN1Yi5sZW5ndGgpIHsgdHJ5IHsgdW5zdWIucG9wKCkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgfQoKICAgIHJldHVybiB7IHJlbmRlcjogcmVuZGVyLCB0ZWFyZG93bjogdGVhcmRvd24gfTsKICB9KSgpOwoKICBWLnZpZXdzLmFjY291bnQgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIHVuc3ViID0gW107CgogICAgZnVuY3Rpb24gcmVuZGVyKHJvb3QsIHBhcmFtcykgewogICAgICB0ZWFyZG93bigpOwogICAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWF1dGhHdWFyZChyb290KSkgcmV0dXJuOwoKICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMucHVyY2hhc2UgPT09ICdzdWNjZXNzJykgewogICAgICAgIHRvYXN0KCdQdXJjaGFzZSBjb21wbGV0ZSDigJQgY3JlZGl0cyBhZGRlZCEnLCAnc3VjY2VzcycpOwogICAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmNvbmZldHRpID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IFYudWkuY29uZmV0dGkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgICB9CgogICAgICB2YXIgdmlldyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1tZCB2LXZpZXctLWFjY291bnQnIH0pOwoKICAgICAgdmFyIGNyZWRpdHNCaWcgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZHJhd2VyX19jcmVkaXRzJywgdGV4dDogJ+KAlCcgfSk7CiAgICAgIGZ1bmN0aW9uIHBhaW50KG4pIHsKICAgICAgICBjcmVkaXRzQmlnLnRleHRDb250ZW50ID0gKG4gPT0gbnVsbCkgPyAn4oCUJyA6IFN0cmluZyhuKTsKICAgICAgfQogICAgICBwYWludChjcmVkaXRzVmFsdWUoKSk7CgogICAgICB2YXIgYmFsYW5jZUNhcmQgPSBlbCgnc2VjdGlvbicsIHsKICAgICAgICBjbGFzczogJ2dsYXNzLWNhcmQnLAogICAgICAgIHN0eWxlOiB7IHBhZGRpbmc6ICd2YXIoLS1zcGFjZS1tZCwgMTVweCknLCBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICd2YXIoLS1zcGFjZS1zbSwgOXB4KScgfQogICAgICB9LAogICAgICAgIGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2ZsZXgtZW5kJywganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJywgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgZmxleFdyYXA6ICd3cmFwJyB9IH0sCiAgICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcycHgnLCBtaW5XaWR0aDogJzAnIH0gfSwKICAgICAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2NyZWRpdHMtbGFiZWwnLCB0ZXh0OiAnQ3JlZGl0IGJhbGFuY2UnIH0pLAogICAgICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdiYXNlbGluZScsIGdhcDogJzZweCcgfSB9LAogICAgICAgICAgICAgIGNyZWRpdHNCaWcsCiAgICAgICAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcgfSwgdGV4dDogJ2NyZWRpdHMnIH0pKSksCiAgICAgICAgICBjdGFCdXR0b24oJ0FkZCBjcmVkaXRzJywgeyBwcmltYXJ5OiB0cnVlLCBzbWFsbDogdHJ1ZSwgaWNvbjogJ3BsdXMnLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IG5hdmlnYXRlKCcjL3BheXdhbGwnKTsgfSB9KSksCiAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTJweCcsIG1hcmdpbjogJzAnIH0sIHRleHQ6ICdDcmVkaXRzIHBvd2VyIGV2ZXJ5IGdlbmVyYXRpb24uIFN0YW5kYXJkIGVkaXRzIGNvc3QgMTAuJyB9KQogICAgICApOwogICAgICB2aWV3LmFwcGVuZENoaWxkKGJhbGFuY2VDYXJkKTsKCiAgICAgIHJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgeyBpZiAobiAhPSBudWxsKSBwYWludChuKTsgfSk7CiAgICAgIHZhciBjYiA9IGZ1bmN0aW9uIChuKSB7IHBhaW50KG4pOyB9OwogICAgICB0cnkgeyBpZiAoVi5zdG9yZSAmJiBWLnN0b3JlLm9uKSB7IFYuc3RvcmUub24oJ2NyZWRpdHM6Y2hhbmdlZCcsIGNiKTsgdW5zdWIucHVzaChmdW5jdGlvbiAoKSB7IFYuc3RvcmUub2ZmICYmIFYuc3RvcmUub2ZmKCdjcmVkaXRzOmNoYW5nZWQnLCBjYik7IH0pOyB9IH0gY2F0Y2ggKGUpIHt9CgogICAgICB2YXIgbWVudSA9IGVsKCduYXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX3NlY3Rpb24nLCAnYXJpYS1sYWJlbCc6ICdBY2NvdW50IG1lbnUnLCBzdHlsZTogeyBnYXA6ICc0cHgnIH0gfSk7CiAgICAgIG1lbnUuYXBwZW5kQ2hpbGQobWVudUl0ZW0oJ2dpZnQnLCAnUmVmZXJyYWwgcHJvZ3JhbScsICdFYXJuIGNyZWRpdHMgYnkgaW52aXRpbmcgY3JlYXRvcnMnLCBmdW5jdGlvbiAoKSB7IG5hdmlnYXRlKCcjL3JlZmVycmFsJyk7IH0pKTsKICAgICAgbWVudS5hcHBlbmRDaGlsZChtZW51SXRlbSgnZmxhbWUnLCAnRGFpbHkgY2hhbGxlbmdlJywgJ1Bvc3QgYSBkYXksIGJ1aWxkIHlvdXIgc3RyZWFrJywgZnVuY3Rpb24gKCkgeyBuYXZpZ2F0ZSgnIy9jaGFsbGVuZ2UnKTsgfSkpOwogICAgICBtZW51LmFwcGVuZENoaWxkKG1lbnVJdGVtKCdnZWFyJywgJ1NldHRpbmdzJywgJ0RlZmF1bHRzLCBicmFuZGluZyBhbmQgYWNjb3VudCcsIGZ1bmN0aW9uICgpIHsgbmF2aWdhdGUoJyMvc2V0dGluZ3MnKTsgfSkpOwogICAgICBtZW51LmFwcGVuZENoaWxkKG1lbnVJdGVtKCdoZWxwJywgJ0hlbHAgJiBzdXBwb3J0JywgJ0ZBUSBhbmQgY29udGFjdCcsIGZ1bmN0aW9uICgpIHsgY2xvc2VEcmF3ZXIoKTsgd2luZG93Lm9wZW4oJ2h0dHBzOi8vdm9vc2V5LmNvbS9oZWxwJywgJ19ibGFuaycsICdub29wZW5lcicpOyB9KSk7CiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQobWVudSk7CgogICAgICB2YXIgbG9nb3V0QnRuID0gZWwoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzOiAndi1kcmF3ZXJfX2l0ZW0gdi1kcmF3ZXJfX2l0ZW0tLWRhbmdlcicgfSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWRyYXdlcl9faXRlbS1pY29uJyB9LCBpY29uKCdsb2dvdXQnKSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IHN0eWxlOiB7IGZvbnRXZWlnaHQ6ICc2MDAnIH0sIHRleHQ6ICdMb2cgb3V0JyB9KSk7CiAgICAgIGxvZ291dEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25maXJtRGlhbG9nKCdMb2cgb3V0IG9mIFZhbXA/JykudGhlbihmdW5jdGlvbiAob2spIHsKICAgICAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgICAgIHRyeSB7IGlmIChWLmF1dGggJiYgVi5hdXRoLmNsZWFyKSBWLmF1dGguY2xlYXIoKTsgfSBjYXRjaCAoZSkge30KICAgICAgICAgIHRvYXN0KCdTaWduZWQgb3V0JywgJ2luZm8nKTsKICAgICAgICAgIG5hdmlnYXRlKCcjL2F1dGgnKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9fc2VjdGlvbicsIHN0eWxlOiB7IGJvcmRlckJvdHRvbTogJ25vbmUnIH0gfSwgbG9nb3V0QnRuKSk7CgogICAgICByb290LmFwcGVuZENoaWxkKHZpZXcpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1lbnVJdGVtKGljLCB0aXRsZSwgc3ViLCBvbkNsaWNrKSB7CiAgICAgIHZhciB0ZXh0U3RhY2sgPSBlbCgnc3BhbicsIHsKICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcycHgnLCBtaW5XaWR0aDogJzAnLCBmbGV4OiAnMSAxIGF1dG8nLCB0ZXh0QWxpZ246ICdsZWZ0JyB9CiAgICAgIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdibG9jaycsIGZvbnRXZWlnaHQ6ICc2MDAnLCBmb250U2l6ZTogJzE1cHgnLCBsaW5lSGVpZ2h0OiAnMS4yNScsIGNvbG9yOiAndmFyKC0tdi1pbmssICNmNWY1ZjcpJyB9LCB0ZXh0OiB0aXRsZSB9KSk7CiAgICAgIGlmIChzdWIpIHsKICAgICAgICB0ZXh0U3RhY2suYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7CiAgICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiAnYmxvY2snLCBmb250U2l6ZTogJzEzcHgnLCBsaW5lSGVpZ2h0OiAnMS4zJywgY29sb3I6ICd2YXIoLS12LWluay1zb2Z0LCByZ2JhKDI0NSwyNDUsMjQ3LC42KSknIH0sCiAgICAgICAgICB0ZXh0OiBzdWIKICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgdmFyIGJ0biA9IGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtZHJhd2VyX19pdGVtJywgc3R5bGU6IHsgYWxpZ25JdGVtczogJ2NlbnRlcicgfSB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZHJhd2VyX19pdGVtLWljb24nIH0sIGljb24oaWMpKSwKICAgICAgICB0ZXh0U3RhY2ssCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2l0ZW0taWNvbicsIHN0eWxlOiB7IGNvbG9yOiAndmFyKC0tdi1pbmstc29mdCwgcmdiYSgyNDUsMjQ1LDI0NywuNSkpJywgd2lkdGg6ICcxOHB4JywgaGVpZ2h0OiAnMThweCcgfSB9LCBpY29uKCdjaGV2cm9uJykpKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGljayk7CiAgICAgIHJldHVybiBidG47CiAgICB9CgogICAgZnVuY3Rpb24gdGVhcmRvd24oKSB7CiAgICAgIHdoaWxlICh1bnN1Yi5sZW5ndGgpIHsgdHJ5IHsgdW5zdWIucG9wKCkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgfQoKICAgIHJldHVybiB7IHJlbmRlcjogcmVuZGVyLCB0ZWFyZG93bjogdGVhcmRvd24gfTsKICB9KSgpOwoKICBWLnZpZXdzLm9uYm9hcmRpbmcgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIHN0YXRlID0geyBzdGVwOiAwLCBpbmR1c3RyaWVzOiBbXSwgcmVmQ29kZTogJycgfTsKCiAgICBmdW5jdGlvbiByZW5kZXIocm9vdCwgcGFyYW1zKSB7CiAgICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICAgIG1heWJlQXBwbHlRdWVyeVJlZmVycmFsKHBhcmFtcyk7CgogICAgICBzdGF0ZS5zdGVwID0gMDsKICAgICAgc3RhdGUuaW5kdXN0cmllcyA9IChzZ2V0KCdpbmR1c3RyaWVzJywgW10pIHx8IFtdKS5zbGljZSgpOwogICAgICBzdGF0ZS5yZWZDb2RlID0gbHNHZXQoJ3JlZmVycmFsQ29kZScsICcnKSB8fCAnJzsKCiAgICAgIHZhciB2aWV3ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBhZ2Ugdi12aWV3LS1vbmJvYXJkaW5nJywgc3R5bGU6IHsgbWF4V2lkdGg6ICc2NDBweCcgfSB9KTsKICAgICAgdmFyIHN0YWdlID0gZWwoJ2RpdicsIHsgY2xhc3M6ICdnbGFzcy1jYXJkIHYtb25iX19zdGFnZScgfSk7CiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoc3RhZ2UpOwogICAgICByb290LmFwcGVuZENoaWxkKHZpZXcpOwoKICAgICAgcGFpbnQoc3RhZ2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhaW50KHN0YWdlKSB7CiAgICAgIHN0YWdlLmlubmVySFRNTCA9ICcnOwogICAgICB2YXIgZG90cyA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZ2FwOiAnOHB4JywganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLCBtYXJnaW5Cb3R0b206ICd2YXIoLS1zcGFjZS1tZCwgMTVweCknIH0gfSwKICAgICAgICBkb3Qoc3RhdGUuc3RlcCA+PSAwKSwKICAgICAgICBkb3Qoc3RhdGUuc3RlcCA+PSAxKSk7CiAgICAgIHN0YWdlLmFwcGVuZENoaWxkKGRvdHMpOwoKICAgICAgaWYgKHN0YXRlLnN0ZXAgPT09IDApIHN0YWdlLmFwcGVuZENoaWxkKHN0ZXBJbmR1c3RyaWVzKCkpOwogICAgICBlbHNlIHN0YWdlLmFwcGVuZENoaWxkKHN0ZXBSZWZlcnJhbCgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkb3QoYWN0aXZlKSB7CiAgICAgIHJldHVybiBlbCgnc3BhbicsIHsKICAgICAgICBzdHlsZTogewogICAgICAgICAgd2lkdGg6IGFjdGl2ZSA/ICcyNHB4JyA6ICc4cHgnLCBoZWlnaHQ6ICc4cHgnLCBib3JkZXJSYWRpdXM6ICc5OTlweCcsCiAgICAgICAgICBiYWNrZ3JvdW5kOiBhY3RpdmUgPyAndmFyKC0tdmFtcC1hY2NlbnQsICM1Mjk3RjgpJyA6ICd2YXIoLS12LWxpbmUsIHJnYmEoMjQ1LDI0NSwyNDcsLjIpKScsCiAgICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIHZhcigtLWR1ci1iYXNlLCAyMDBtcykgdmFyKC0tZWFzZS1zcHJpbmcsIGN1YmljLWJlemllcigwLjM0LDEuNTYsMC42NCwxKSknCiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGVwSW5kdXN0cmllcygpIHsKICAgICAgdmFyIGZyYWcgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3RhY2stbWQnIH0pOwogICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdXZWxjb21lIHRvIFZhbXAnIH0pKTsKICAgICAgZnJhZy5hcHBlbmRDaGlsZChlbCgnaDEnLCB7IGNsYXNzOiAndi1zZWN0aW9uX190aXRsZScsIHN0eWxlOiB7IGZvbnRTaXplOiAndmFyKC0tZm9udC10aXRsZSwgMjhweCknIH0sIHRleHQ6ICdXaGF0IGRvIHlvdSBjcmVhdGU/JyB9KSk7CiAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHRleHQ6ICdQaWNrIGEgZmV3IHNvIHdlIGNhbiB0YWlsb3IgcHJlc2V0cyBhbmQgcHJvbXB0cy4gWW91IGNhbiBjaGFuZ2UgdGhpcyBhbnl0aW1lLicgfSkpOwoKICAgICAgdmFyIGNvbnRpbnVlTGFiZWwgPSBlbCgnc3BhbicpOwogICAgICBmdW5jdGlvbiB1cGRhdGVDb3VudCgpIHsKICAgICAgICB2YXIgbiA9IHN0YXRlLmluZHVzdHJpZXMubGVuZ3RoOwogICAgICAgIGNvbnRpbnVlTGFiZWwudGV4dENvbnRlbnQgPSBuID8gKCdDb250aW51ZSAoJyArIG4gKyAnKScpIDogJ0NvbnRpbnVlJzsKICAgICAgfQoKICAgICAgZnJhZy5hcHBlbmRDaGlsZChpbmR1c3RyeUJ1YmJsZUdyaWQoc3RhdGUuaW5kdXN0cmllcywgZnVuY3Rpb24gKGtleXMpIHsgc3RhdGUuaW5kdXN0cmllcyA9IGtleXM7IHVwZGF0ZUNvdW50KCk7IH0pKTsKCiAgICAgIGZ1bmN0aW9uIGFkdmFuY2UoKSB7CiAgICAgICAgc3NldCgnaW5kdXN0cmllcycsIHN0YXRlLmluZHVzdHJpZXMpOwogICAgICAgIHNldHRpbmdDaGFuZ2UoJ2luZHVzdHJpZXMnLCBzdGF0ZS5pbmR1c3RyaWVzKTsKICAgICAgICBpZiAoc3RhdGUuaW5kdXN0cmllcy5sZW5ndGgpIHsKICAgICAgICAgIHZhciByZWMgPSByZWNvbW1lbmRlZE1vZGVsKHN0YXRlLmluZHVzdHJpZXMpOwogICAgICAgICAgaWYgKHJlYyAmJiAhc2V0dGluZ3MoKS5kZWZhdWx0TW9kZWwpIHNldHRpbmdDaGFuZ2UoJ2RlZmF1bHRNb2RlbCcsIHJlYyk7CiAgICAgICAgfQogICAgICAgIHZhciBzdGFnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52LW9uYl9fc3RhZ2UnKTsKICAgICAgICBzdGF0ZS5zdGVwID0gMTsKICAgICAgICBpZiAoc3RhZ2UpIHBhaW50KHN0YWdlKTsKICAgICAgfQoKICAgICAgdmFyIGNvbnRpbnVlQnRuID0gZWwoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnkgdi1jdGEtLWJsb2NrJyB9LCBjb250aW51ZUxhYmVsKTsKICAgICAgY29udGludWVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhZHZhbmNlKTsKICAgICAgdXBkYXRlQ291bnQoKTsKCiAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLXNtJyB9LAogICAgICAgIGNvbnRpbnVlQnRuLAogICAgICAgIGN0YUJ1dHRvbignU2tpcCBmb3Igbm93JywgeyBnaG9zdDogdHJ1ZSwgYmxvY2s6IHRydWUsIG9uQ2xpY2s6IGFkdmFuY2UgfSkpKTsKICAgICAgcmV0dXJuIGZyYWc7CiAgICB9CgogICAgZnVuY3Rpb24gc3RlcFJlZmVycmFsKCkgewogICAgICB2YXIgZnJhZyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1tZCcgfSk7CiAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1leWVicm93JywgdGV4dDogJ0FsbW9zdCB0aGVyZScgfSkpOwogICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKCdoMScsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3RpdGxlJywgc3R5bGU6IHsgZm9udFNpemU6ICd2YXIoLS1mb250LXRpdGxlLCAyOHB4KScgfSwgdGV4dDogJ0dvdCBhIHJlZmVycmFsIGNvZGU/JyB9KSk7CiAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHRleHQ6ICdFbnRlciBhIGNyZWF0b3IgY29kZSB0byB1bmxvY2sgYm9udXMgY3JlZGl0cy4gT3B0aW9uYWwuJyB9KSk7CgogICAgICB2YXIgaW5wdXQgPSBlbCgnaW5wdXQnLCB7CiAgICAgICAgdHlwZTogJ3RleHQnLCBjbGFzczogJ3YtZmllbGQnLCB2YWx1ZTogc3RhdGUucmVmQ29kZSwKICAgICAgICBwbGFjZWhvbGRlcjogJ0NSRUFUT1JDT0RFJywgYXV0b2NhcGl0YWxpemU6ICdjaGFyYWN0ZXJzJywgc3BlbGxjaGVjazogJ2ZhbHNlJywgJ2FyaWEtbGFiZWwnOiAnUmVmZXJyYWwgY29kZScKICAgICAgfSk7CiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24gKCkgeyBpbnB1dC52YWx1ZSA9IGlucHV0LnZhbHVlLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvXHMrL2csICcnKTsgc3RhdGUucmVmQ29kZSA9IGlucHV0LnZhbHVlOyB9KTsKICAgICAgdmFyIHN0YXR1cyA9IGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEzcHgnLCBtaW5IZWlnaHQ6ICcxOHB4JyB9IH0pOwogICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCcgfSwgaW5wdXQsIHN0YXR1cykpOwoKICAgICAgdmFyIGZpbmlzaCA9IGN0YUJ1dHRvbignR2V0IHN0YXJ0ZWQnLCB7IHByaW1hcnk6IHRydWUsIGJsb2NrOiB0cnVlLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGNvZGUgPSAoaW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTsKICAgICAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uICgpIHsgY29tcGxldGVPbmJvYXJkaW5nKCk7IH07CiAgICAgICAgaWYgKGNvZGUgJiYgVi5hcGkgJiYgdHlwZW9mIFYuYXBpLmF0dHJpYnV0ZVJlZmVycmFsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnJzsKICAgICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdBcHBseWluZyBjb2Rl4oCmJzsKICAgICAgICAgIGxzU2V0KCdyZWZlcnJhbENvZGUnLCBjb2RlKTsKICAgICAgICAgIFYuYXBpLmF0dHJpYnV0ZVJlZmVycmFsKGNvZGUpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0b2FzdCgnUmVmZXJyYWwgYXBwbGllZCEnLCAnc3VjY2VzcycpOwogICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1jb2xvci1lcnJvciwgI0Y3MzM2MyknOwogICAgICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAoZXJyICYmIGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogJ0NvdWxkIG5vdCBhcHBseSB0aGF0IGNvZGUsIGJ1dCB5b3UgYXJlIGFsbCBzZXQuJzsKICAgICAgICAgICAgc2V0VGltZW91dChkb25lLCAxMjAwKTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkb25lKCk7CiAgICAgICAgfQogICAgICB9IH0pOwoKICAgICAgZnJhZy5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3RhY2stc20nIH0sCiAgICAgICAgZmluaXNoLAogICAgICAgIGN0YUJ1dHRvbignU2tpcCcsIHsgZ2hvc3Q6IHRydWUsIGJsb2NrOiB0cnVlLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IGNvbXBsZXRlT25ib2FyZGluZygpOyB9IH0pKSk7CiAgICAgIHJldHVybiBmcmFnOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbXBsZXRlT25ib2FyZGluZygpIHsKICAgICAgc3NldCgnb25ib2FyZGluZ0RvbmUnLCB0cnVlKTsKICAgICAgdHJ5IHsgaWYgKFYuc3RhdGUpIFYuc3RhdGUub25ib2FyZGluZ0RvbmUgPSB0cnVlOyB9IGNhdGNoIChlKSB7fQogICAgICBzaG93RnJlZUNyZWRpdHNXZWxjb21lKCk7CiAgICAgIGdvKCcjL2NyZWF0ZScpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dGcmVlQ3JlZGl0c1dlbGNvbWUoKSB7CiAgICAgIGlmIChsc0dldCgnc2VlbkNyZWRpdFdlbGNvbWUnLCBmYWxzZSkpIHJldHVybjsKICAgICAgbHNTZXQoJ3NlZW5DcmVkaXRXZWxjb21lJywgdHJ1ZSk7CiAgICAgIHJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgewogICAgICAgIHZhciBhbW91bnQgPSAobiAhPSBudWxsICYmIG4gPiAwKSA/IG4gOiA1MDsKICAgICAgICB0b2FzdCgnV2VsY29tZSEgWW91IGhhdmUgJyArIGFtb3VudCArICcgZnJlZSBjcmVkaXRzIHRvIHN0YXJ0IGNyZWF0aW5nLicsICdzdWNjZXNzJyk7CiAgICAgICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuY29uZmV0dGkgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgVi51aS5jb25mZXR0aSgpOyB9IGNhdGNoIChlKSB7fSB9CiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiB7IHJlbmRlcjogcmVuZGVyIH07CiAgfSkoKTsKCiAgVi52aWV3cy5yZWZlcnJhbCA9IChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiByZW5kZXIocm9vdCwgcGFyYW1zKSB7CiAgICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICAgIGlmICghYXV0aEd1YXJkKHJvb3QpKSByZXR1cm47CgogICAgICBtYXliZUFwcGx5UXVlcnlSZWZlcnJhbChwYXJhbXMpOwoKICAgICAgdmFyIHZpZXcgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcGFnZSB2LXZpZXctLXJlZmVycmFsJyB9KTsKICAgICAgdmlldy5hcHBlbmRDaGlsZChlbCgnaGVhZGVyJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9faGVhZCcgfSwKICAgICAgICBlbCgnZGl2JywgbnVsbCwKICAgICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdHcm93dGgnIH0pLAogICAgICAgICAgZWwoJ2gxJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fdGl0bGUnLCBzdHlsZTogeyBmb250U2l6ZTogJ3ZhcigtLWZvbnQtbGFyZ2UtdGl0bGUsIDM0cHgpJyB9LCB0ZXh0OiAnUmVmZXJyYWwgcHJvZ3JhbScgfSksCiAgICAgICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YicsIHRleHQ6ICdTaGFyZSB5b3VyIGNvZGUsIGVhcm4gY3JlZGl0cyB3aGVuIGNyZWF0b3JzIHNpZ24gdXAgYW5kIGNyZWF0ZS4nIH0pKSkpOwoKICAgICAgdmFyIGxpc3RXcmFwID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLW1kJyB9KTsKICAgICAgdmlldy5hcHBlbmRDaGlsZChsaXN0V3JhcCk7CiAgICAgIHJvb3QuYXBwZW5kQ2hpbGQodmlldyk7CgogICAgICBsaXN0V3JhcC5hcHBlbmRDaGlsZChza2VsKCkpOwogICAgICBsaXN0V3JhcC5hcHBlbmRDaGlsZChza2VsKCkpOwoKICAgICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkucmVmZXJyYWxDb2RlcyAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHJlbmRlckVtcHR5KGxpc3RXcmFwKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIFYuYXBpLnJlZmVycmFsQ29kZXMoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICB2YXIgY29kZXMgPSBub3JtYWxpemVMaXN0KHJlcyk7CiAgICAgICAgbGlzdFdyYXAuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgaWYgKCFjb2Rlcy5sZW5ndGgpIHsgcmVuZGVyRW1wdHkobGlzdFdyYXApOyByZXR1cm47IH0KICAgICAgICBjb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGxpc3RXcmFwLmFwcGVuZENoaWxkKGNvZGVDYXJkKGMpKTsgfSk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBsaXN0V3JhcC5pbm5lckhUTUwgPSAnJzsKICAgICAgICByZW5kZXJFcnJvcihsaXN0V3JhcCwgZXJyLCBmdW5jdGlvbiAoKSB7IHJlbmRlcihyb290LCBwYXJhbXMpOyB9KTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gbm9ybWFsaXplTGlzdChyZXMpIHsKICAgICAgaWYgKCFyZXMpIHJldHVybiBbXTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkgcmV0dXJuIHJlczsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzLml0ZW1zKSkgcmV0dXJuIHJlcy5pdGVtczsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzLmNvZGVzKSkgcmV0dXJuIHJlcy5jb2RlczsKICAgICAgcmV0dXJuIFtdOwogICAgfQoKICAgIGZ1bmN0aW9uIHNrZWwoKSB7CiAgICAgIHZhciBjYXJkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICdnbGFzcy1jYXJkJyB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbiB2LXNrZWxldG9uLS10aXRsZScsIHN0eWxlOiB7IHdpZHRoOiAnNTAlJyB9IH0pLAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbiB2LXNrZWxldG9uLS10ZXh0Jywgc3R5bGU6IHsgd2lkdGg6ICc4MCUnLCBtYXJnaW5Ub3A6ICcxMnB4JyB9IH0pLAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbiB2LXNrZWxldG9uLS10ZXh0Jywgc3R5bGU6IHsgd2lkdGg6ICc2MCUnLCBtYXJnaW5Ub3A6ICc4cHgnIH0gfSkpOwogICAgICByZXR1cm4gY2FyZDsKICAgIH0KCiAgICBmdW5jdGlvbiBjb2RlQ2FyZChjKSB7CiAgICAgIHZhciBjb2RlID0gYy5jb2RlIHx8IGMucmVmZXJyYWxDb2RlIHx8IGMuaWQgfHwgJ+KAlCc7CiAgICAgIHZhciBwbGF0Zm9ybSA9IGMucGxhdGZvcm0gfHwgYy5jaGFubmVsIHx8ICcnOwogICAgICB2YXIgY29tbWlzc2lvbiA9IChjLmNvbW1pc3Npb24gIT0gbnVsbCA/IGMuY29tbWlzc2lvbiA6IChjLmNvbW1pc3Npb25QZXJjZW50ICE9IG51bGwgPyBjLmNvbW1pc3Npb25QZXJjZW50IDogbnVsbCkpOwogICAgICB2YXIgc3RhdHVzID0gYy5zdGF0dXMgfHwgKGMuYWN0aXZlID09PSBmYWxzZSA/ICdpbmFjdGl2ZScgOiAnYWN0aXZlJyk7CiAgICAgIHZhciBzaWdudXBzID0gbnVtKGMuc2lnbnVwcyAhPSBudWxsID8gYy5zaWdudXBzIDogKGMuc3RhdHMgJiYgYy5zdGF0cy5zaWdudXBzKSk7CiAgICAgIHZhciBlYXJuZWQgPSBudW0oYy5jcmVkaXRzRWFybmVkICE9IG51bGwgPyBjLmNyZWRpdHNFYXJuZWQgOiAoYy5zdGF0cyAmJiBjLnN0YXRzLmNyZWRpdHNFYXJuZWQpKTsKICAgICAgdmFyIHNlZWRlZCA9IG51bShjLmNyZWRpdHNTZWVkZWQgIT0gbnVsbCA/IGMuY3JlZGl0c1NlZWRlZCA6IChjLnN0YXRzICYmIGMuc3RhdHMuY3JlZGl0c1NlZWRlZCkpOwoKICAgICAgdmFyIHNoYXJlVVJMID0gJ2h0dHBzOi8vYXBwcy5hcHBsZS5jb20vdXMvYXBwL3ZhbXAvaWQ2NzQ4NjU3Njg1P3I9JyArIGVuY29kZVVSSUNvbXBvbmVudChjb2RlKTsKICAgICAgdmFyIGlzQWN0aXZlID0gU3RyaW5nKHN0YXR1cykudG9Mb3dlckNhc2UoKSA9PT0gJ2FjdGl2ZSc7CgogICAgICB2YXIgY29kZUxpbmUgPSBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBnYXA6ICd2YXIoLS1zcGFjZS1zbSwgOXB4KScsIGZsZXhXcmFwOiAnd3JhcCcgfSB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbW9ubycsIHN0eWxlOiB7IGZvbnRTaXplOiAnMjJweCcsIGZvbnRXZWlnaHQ6ICc3MDAnLCBsZXR0ZXJTcGFjaW5nOiAnMC4wNGVtJyB9LCB0ZXh0OiBjb2RlIH0pKTsKICAgICAgaWYgKHBsYXRmb3JtKSBjb2RlTGluZS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LW11dGVkJywgc3R5bGU6IHsgZm9udFNpemU6ICcxM3B4JyB9LCB0ZXh0OiBwbGF0Zm9ybSB9KSk7CgogICAgICB2YXIgYmFkZ2UgPSBlbCgnc3BhbicsIHsKICAgICAgICBjbGFzczogJ3YtbW9ubycsCiAgICAgICAgc3R5bGU6IHsKICAgICAgICAgIGZvbnRTaXplOiAnMTFweCcsIHRleHRUcmFuc2Zvcm06ICd1cHBlcmNhc2UnLCBsZXR0ZXJTcGFjaW5nOiAnMC4xZW0nLAogICAgICAgICAgcGFkZGluZzogJzRweCAxMHB4JywgYm9yZGVyUmFkaXVzOiAnOTk5cHgnLAogICAgICAgICAgY29sb3I6IGlzQWN0aXZlID8gJ3ZhcigtLXZhbXAtYWNjZW50LCAjNTI5N0Y4KScgOiAndmFyKC0tdi1pbmstc29mdCwgcmdiYSgyNDUsMjQ1LDI0NywuNikpJywKICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAnICsgKGlzQWN0aXZlID8gJ3ZhcigtLXZhbXAtYWNjZW50LCAjNTI5N0Y4KScgOiAndmFyKC0tdi1saW5lLCByZ2JhKDI0NSwyNDUsMjQ3LC4xNSkpJykKICAgICAgICB9LAogICAgICAgIHRleHQ6IGNhcChzdGF0dXMpCiAgICAgIH0pOwoKICAgICAgdmFyIGhlYWQgPSBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdmbGV4LXN0YXJ0JywganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJywgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgZmxleFdyYXA6ICd3cmFwJyB9IH0sIGNvZGVMaW5lLCBiYWRnZSk7CgogICAgICB2YXIgc3RhdHNSb3cgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZ3JpZCB2LWdyaWQtLTMnLCBzdHlsZTogeyBnYXA6ICd2YXIoLS1zcGFjZS1tZCwgMTVweCknIH0gfSwKICAgICAgICBzdGF0Qm94KHNpZ251cHMsICdTaWdudXBzJyksCiAgICAgICAgc3RhdEJveChlYXJuZWQsICdDcmVkaXRzIGVhcm5lZCcpLAogICAgICAgIHN0YXRCb3goc2VlZGVkLCAnQ3JlZGl0cyBzZWVkZWQnKSk7CiAgICAgIGlmIChjb21taXNzaW9uICE9IG51bGwpIHN0YXRzUm93LmFwcGVuZENoaWxkKHN0YXRCb3goY29tbWlzc2lvbiArICclJywgJ0NvbW1pc3Npb24nKSk7CgogICAgICB2YXIgYWN0aW9ucyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jdGEtcm93JyB9LAogICAgICAgIGN0YUJ1dHRvbignQ29weSBsaW5rJywgeyBwcmltYXJ5OiB0cnVlLCBzbWFsbDogdHJ1ZSwgaWNvbjogJ2xpbmsnLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IGNvcHkoc2hhcmVVUkwsICdTaGFyZSBsaW5rIGNvcGllZCcpOyB9IH0pLAogICAgICAgIGN0YUJ1dHRvbignQ29weSBjb2RlJywgeyBnaG9zdDogdHJ1ZSwgc21hbGw6IHRydWUsIGljb246ICdjb3B5Jywgb25DbGljazogZnVuY3Rpb24gKCkgeyBjb3B5KGNvZGUsICdDb2RlIGNvcGllZCcpOyB9IH0pKTsKCiAgICAgIHZhciBjYXJkID0gZWwoJ3NlY3Rpb24nLCB7IGNsYXNzOiAndi1zZWN0aW9uIGdsYXNzLWNhcmQnIH0sIGhlYWQsIHN0YXRzUm93LCBhY3Rpb25zKTsKCiAgICAgIHZhciBsZWRnZXIgPSBjLmxlZGdlciB8fCBjLmFjdGl2aXR5IHx8IGMucmVjZW50QWN0aXZpdHk7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxlZGdlcikgJiYgbGVkZ2VyLmxlbmd0aCkgewogICAgICAgIHZhciBsaXN0ID0gZWwoJ3VsJywgeyBzdHlsZTogeyBsaXN0U3R5bGU6ICdub25lJywgbWFyZ2luOiAnMCcsIHBhZGRpbmc6ICcwJywgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgZ2FwOiAnOHB4JyB9IH0pOwogICAgICAgIGxlZGdlci5zbGljZSgwLCA1KS5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkgewogICAgICAgICAgdmFyIGxhYmVsID0gZW50cnkubGFiZWwgfHwgZW50cnkuZXZlbnQgfHwgZW50cnkudHlwZSB8fCAnQWN0aXZpdHknOwogICAgICAgICAgdmFyIGFtdCA9IGVudHJ5LmNyZWRpdHMgIT0gbnVsbCA/ICgnKycgKyBlbnRyeS5jcmVkaXRzICsgJyBjcicpIDogKGVudHJ5LmFtb3VudCAhPSBudWxsID8gZW50cnkuYW1vdW50IDogJycpOwogICAgICAgICAgdmFyIHdoZW4gPSBlbnRyeS5kYXRlIHx8IGVudHJ5LmNyZWF0ZWREYXRlIHx8IGVudHJ5LnRpbWVzdGFtcDsKICAgICAgICAgIGlmICh3aGVuICYmIFYudXRpbCAmJiBWLnV0aWwuZm10RGF0ZSkgd2hlbiA9IFYudXRpbC5mbXREYXRlKHdoZW4pOwogICAgICAgICAgbGlzdC5hcHBlbmRDaGlsZChlbCgnbGknLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJywgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgZm9udFNpemU6ICcxNHB4JyB9IH0sCiAgICAgICAgICAgIGVsKCdzcGFuJywgeyB0ZXh0OiBsYWJlbCB9KSwKICAgICAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tdXRlZCcsIHRleHQ6IFthbXQsIHdoZW5dLmZpbHRlcihCb29sZWFuKS5qb2luKCcgwrcgJykgfSkpKTsKICAgICAgICB9KTsKICAgICAgICB2YXIgZGV0YWlscyA9IGVsKCdkZXRhaWxzJywgbnVsbCwKICAgICAgICAgIGVsKCdzdW1tYXJ5JywgeyBzdHlsZTogeyBjdXJzb3I6ICdwb2ludGVyJywgZm9udFNpemU6ICcxNHB4JywgY29sb3I6ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknIH0sIHRleHQ6ICdSZWNlbnQgYWN0aXZpdHknIH0pLAogICAgICAgICAgZWwoJ2RpdicsIHsgc3R5bGU6IHsgcGFkZGluZ1RvcDogJ3ZhcigtLXNwYWNlLXNtLCA5cHgpJyB9IH0sIGxpc3QpKTsKICAgICAgICBjYXJkLmFwcGVuZENoaWxkKGRldGFpbHMpOwogICAgICB9CgogICAgICByZXR1cm4gY2FyZDsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGF0Qm94KHZhbHVlLCBsYWJlbCkgewogICAgICByZXR1cm4gZWwoJ2RpdicsIHsgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgZ2FwOiAnMnB4JyB9IH0sCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vbm8nLCBzdHlsZTogeyBmb250U2l6ZTogJzIycHgnLCBmb250V2VpZ2h0OiAnNzAwJyB9LCB0ZXh0OiB2YWx1ZSB9KSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEycHgnIH0sIHRleHQ6IGxhYmVsIH0pKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJFbXB0eSh3cmFwKSB7CiAgICAgIHdyYXAuaW5uZXJIVE1MID0gJyc7CiAgICAgIHZhciBjYXJkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5IGdsYXNzLWNhcmQnIH0sCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJyB9LCBpY29uKCdnaWZ0JykpLAogICAgICAgIGVsKCdoMicsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScsIHRleHQ6ICdCZWNvbWUgYSBWYW1wIENyZWF0b3InIH0pLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZW1wdHlfX21zZycsIHRleHQ6ICdZb3UgZG8gbm90IGhhdmUgYSByZWZlcnJhbCBjb2RlIHlldC4gQXBwbHkgdG8gZWFybiBjcmVkaXRzIGFuZCBjb21taXNzaW9uIHdoZW4gY3JlYXRvcnMgeW91IHJlZmVyIHNpZ24gdXAuJyB9KSwKICAgICAgICBjdGFCdXR0b24oJ0FwcGx5IHRvIGJlY29tZSBhIGNyZWF0b3InLCB7IHByaW1hcnk6IHRydWUsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHdpbmRvdy5vcGVuKCdodHRwczovL3Zvb3NleS5jb20vdmFtcC9jcmVhdG9ycycsICdfYmxhbmsnLCAnbm9vcGVuZXInKTsKICAgICAgICB9IH0pKTsKICAgICAgd3JhcC5hcHBlbmRDaGlsZChjYXJkKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJFcnJvcih3cmFwLCBlcnIsIHJldHJ5KSB7CiAgICAgIHdyYXAuaW5uZXJIVE1MID0gJyc7CiAgICAgIHZhciBtc2cgPSAoZXJyICYmIGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogJ0NvdWxkIG5vdCBsb2FkIHlvdXIgcmVmZXJyYWwgY29kZXMuJzsKICAgICAgd3JhcC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHkgZ2xhc3MtY2FyZCcgfSwKICAgICAgICBlbCgnaDInLCB7IGNsYXNzOiAndi1lbXB0eV9fdGl0bGUnLCB0ZXh0OiAnU29tZXRoaW5nIHdlbnQgd3JvbmcnIH0pLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZW1wdHlfX21zZycsIHRleHQ6IG1zZyB9KSwKICAgICAgICBjdGFCdXR0b24oJ1JldHJ5JywgeyBnaG9zdDogdHJ1ZSwgb25DbGljazogcmV0cnkgfSkpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb3B5KHRleHQsIG9rKSB7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpIHsKICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oZnVuY3Rpb24gKCkgeyB0b2FzdChvayB8fCAnQ29waWVkJywgJ3N1Y2Nlc3MnKTsgfSwgZnVuY3Rpb24gKCkgeyBsZWdhY3lDb3B5KHRleHQsIG9rKTsgfSk7CiAgICAgICAgfSBlbHNlIHsgbGVnYWN5Q29weSh0ZXh0LCBvayk7IH0KICAgICAgfSBjYXRjaCAoZSkgeyBsZWdhY3lDb3B5KHRleHQsIG9rKTsgfQogICAgfQogICAgZnVuY3Rpb24gbGVnYWN5Q29weSh0ZXh0LCBvaykgewogICAgICB0cnkgewogICAgICAgIHZhciB0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICAgICAgdGEudmFsdWUgPSB0ZXh0OyB0YS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7IHRhLnN0eWxlLm9wYWNpdHkgPSAnMCc7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0YSk7IHRhLnNlbGVjdCgpOyBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOyB0YS5yZW1vdmUoKTsKICAgICAgICB0b2FzdChvayB8fCAnQ29waWVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSBjYXRjaCAoZSkgeyB0b2FzdCgnQ29weSBmYWlsZWQg4oCUICcgKyB0ZXh0LCAnZXJyb3InKTsgfQogICAgfQoKICAgIGZ1bmN0aW9uIG51bShuKSB7IHJldHVybiAobiA9PSBudWxsIHx8IGlzTmFOKE51bWJlcihuKSkpID8gJzAnIDogU3RyaW5nKE51bWJlcihuKSk7IH0KICAgIGZ1bmN0aW9uIGNhcChzKSB7IHMgPSBTdHJpbmcocyB8fCAnJyk7IHJldHVybiBzID8gcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzOyB9CgogICAgcmV0dXJuIHsgcmVuZGVyOiByZW5kZXIgfTsKICB9KSgpOwoKICBWLnZpZXdzLmNoYWxsZW5nZSA9IChmdW5jdGlvbiAoKSB7CiAgICB2YXIgR09BTCA9IDMwOwogICAgdmFyIEdSQUNFX0RBWVMgPSA1OwogICAgdmFyIERBSUxZX0NSRURJVFMgPSAxMDA7CiAgICB2YXIgQk9OVVNfQ1JFRElUUyA9IDEwMDA7CgogICAgZnVuY3Rpb24gZ2V0U3RyZWFrKCkgewogICAgICB2YXIgcyA9IGxzR2V0KCdjaGFsbGVuZ2UnLCBudWxsKTsKICAgICAgaWYgKCFzIHx8IHR5cGVvZiBzICE9PSAnb2JqZWN0JykgcyA9IHsgY291bnQ6IDAsIGxhc3REYXk6IG51bGwsIGJlc3Q6IDAsIHRvdGFsOiAwIH07CiAgICAgIHJldHVybiBzOwogICAgfQogICAgZnVuY3Rpb24gc2V0U3RyZWFrKHMpIHsgbHNTZXQoJ2NoYWxsZW5nZScsIHMpOyB9CgogICAgZnVuY3Rpb24gdG9kYXlLZXkoKSB7CiAgICAgIHZhciBkID0gbmV3IERhdGUoKTsKICAgICAgcmV0dXJuIGQuZ2V0RnVsbFllYXIoKSArICctJyArIHBhZChkLmdldE1vbnRoKCkgKyAxKSArICctJyArIHBhZChkLmdldERhdGUoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBwYWQobikgeyByZXR1cm4gbiA8IDEwID8gJzAnICsgbiA6ICcnICsgbjsgfQogICAgZnVuY3Rpb24gZGF5RGlmZihhS2V5LCBiS2V5KSB7CiAgICAgIGlmICghYUtleSB8fCAhYktleSkgcmV0dXJuIEluZmluaXR5OwogICAgICB2YXIgYSA9IHBhcnNlS2V5KGFLZXkpLCBiID0gcGFyc2VLZXkoYktleSk7CiAgICAgIHJldHVybiBNYXRoLnJvdW5kKChiIC0gYSkgLyA4NjQwMDAwMCk7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZUtleShrKSB7CiAgICAgIHZhciBwID0gU3RyaW5nKGspLnNwbGl0KCctJyk7CiAgICAgIHJldHVybiBEYXRlLlVUQygrcFswXSwgKCtwWzFdKSAtIDEsICtwWzJdKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXIocm9vdCkgewogICAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWF1dGhHdWFyZChyb290KSkgcmV0dXJuOwoKICAgICAgdmFyIHMgPSBnZXRTdHJlYWsoKTsKICAgICAgdmFyIHZpZXcgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcGFnZSB2LXZpZXctLWNoYWxsZW5nZScgfSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKGVsKCdoZWFkZXInLCB7IGNsYXNzOiAndi1zZWN0aW9uX19oZWFkJyB9LAogICAgICAgIGVsKCdkaXYnLCBudWxsLAogICAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1leWVicm93JywgdGV4dDogJ0dyb3d0aCcgfSksCiAgICAgICAgICBlbCgnaDEnLCB7IGNsYXNzOiAndi1zZWN0aW9uX190aXRsZScsIHN0eWxlOiB7IGZvbnRTaXplOiAndmFyKC0tZm9udC1sYXJnZS10aXRsZSwgMzRweCknIH0sIHRleHQ6ICdQb3N0LWEtZGF5IGNoYWxsZW5nZScgfSksCiAgICAgICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YicsIHRleHQ6ICdDcmVhdGUgYW5kIHNoYXJlIGRhaWx5LiBFYXJuICcgKyBEQUlMWV9DUkVESVRTICsgJyBjcmVkaXRzIGVhY2ggZGF5IGFuZCBhICcgKyBCT05VU19DUkVESVRTICsgJy1jcmVkaXQgYm9udXMgYXQgZGF5ICcgKyBHT0FMICsgJy4nIH0pKSkpOwoKICAgICAgdmFyIHRvZGF5ID0gdG9kYXlLZXkoKTsKICAgICAgdmFyIGxvZ2dlZFRvZGF5ID0gcy5sYXN0RGF5ID09PSB0b2RheTsKICAgICAgdmFyIGJyb2tlbiA9IHMubGFzdERheSAmJiBkYXlEaWZmKHMubGFzdERheSwgdG9kYXkpID4gKEdSQUNFX0RBWVMgKyAxKTsKICAgICAgdmFyIGxpdmVDb3VudCA9IGJyb2tlbiA/IDAgOiBzLmNvdW50OwogICAgICB2YXIgcGN0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgbGl2ZUNvdW50IC8gR09BTCkpOwoKICAgICAgdmFyIGhlcm8gPSBlbCgnc2VjdGlvbicsIHsKICAgICAgICBjbGFzczogJ2dsYXNzLWNhcmQnLAogICAgICAgIHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZ2FwOiAndmFyKC0tc3BhY2UtbGcsIDI0cHgpJywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGZsZXhXcmFwOiAnd3JhcCcgfQogICAgICB9LAogICAgICAgIHJpbmdOb2RlKHBjdCwgbGl2ZUNvdW50KSwKICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICc2cHgnLCBmbGV4OiAnMSAxIDIwMHB4JywgbWluV2lkdGg6ICcwJyB9IH0sCiAgICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbW9ubycsIHN0eWxlOiB7IGZvbnRTaXplOiAndmFyKC0tZm9udC10aXRsZTMsIDIwcHgpJywgZm9udFdlaWdodDogJzcwMCcgfSwgdGV4dDogJ0RheSAnICsgbGl2ZUNvdW50ICsgJyAvICcgKyBHT0FMIH0pLAogICAgICAgICAgZWwoJ2RpdicsIHsgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBhbGlnbkl0ZW1zOiAnY2VudGVyJywgZ2FwOiAnNnB4JywgY29sb3I6ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknIH0gfSwKICAgICAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jdGFfX2ljb24nLCBzdHlsZTogeyB3aWR0aDogJzE4cHgnLCBoZWlnaHQ6ICcxOHB4JyB9IH0sIGljb24oJ2ZsYW1lJykpLAogICAgICAgICAgICBlbCgnc3BhbicsIHsgdGV4dDogbGl2ZUNvdW50ID4gMCA/IChsaXZlQ291bnQgKyAnLWRheSBzdHJlYWsnKSA6ICdTdGFydCB5b3VyIHN0cmVhaycgfSkpLAogICAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTRweCcsIG1hcmdpbjogJzAnIH0sIHRleHQ6IGJyb2tlbgogICAgICAgICAgICA/ICdZb3VyIHN0cmVhayBsYXBzZWQgcGFzdCB0aGUgJyArIEdSQUNFX0RBWVMgKyAnLWRheSBncmFjZSB3aW5kb3cuIFBvc3QgdG9kYXkgdG8gYmVnaW4gYWdhaW4uJwogICAgICAgICAgICA6IChsb2dnZWRUb2RheSA/ICdMb2dnZWQgZm9yIHRvZGF5IOKAlCBjb21lIGJhY2sgdG9tb3Jyb3cgdG8ga2VlcCBpdCBnb2luZy4nIDogJ1Bvc3QgdG9kYXkgdG8gZXh0ZW5kIHlvdXIgc3RyZWFrLicpIH0pKQogICAgICApOwogICAgICB2aWV3LmFwcGVuZENoaWxkKGhlcm8pOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChlbCgnc2VjdGlvbicsIHsgY2xhc3M6ICd2LWdyaWQgdi1ncmlkLS00IGdsYXNzLWNhcmQnLCBzdHlsZTogeyBnYXA6ICd2YXIoLS1zcGFjZS1tZCwgMTVweCknIH0gfSwKICAgICAgICBzdGF0Qm94KGxpdmVDb3VudCwgJ0N1cnJlbnQgc3RyZWFrJyksCiAgICAgICAgc3RhdEJveChNYXRoLm1heChzLmJlc3QgfHwgMCwgbGl2ZUNvdW50KSwgJ0Jlc3Qgc3RyZWFrJyksCiAgICAgICAgc3RhdEJveCgocy50b3RhbCB8fCAwKSwgJ0RheXMgcG9zdGVkJyksCiAgICAgICAgc3RhdEJveCgoKHMudG90YWwgfHwgMCkgKiBEQUlMWV9DUkVESVRTKSwgJ0NyZWRpdHMgZWFybmVkJykpKTsKCiAgICAgIHZhciBsb2dCdG4gPSBjdGFCdXR0b24obG9nZ2VkVG9kYXkgPyAnUG9zdGVkIHRvZGF5JyA6ICdJIHBvc3RlZCB0b2RheScsIHsKICAgICAgICBwcmltYXJ5OiAhbG9nZ2VkVG9kYXksIGdob3N0OiBsb2dnZWRUb2RheSwgYmxvY2s6IHRydWUsIGljb246IGxvZ2dlZFRvZGF5ID8gJ2NoZWNrbWFyaycgOiAncGx1cycKICAgICAgfSk7CiAgICAgIGxvZ0J0bi5kaXNhYmxlZCA9IGxvZ2dlZFRvZGF5OwogICAgICBsb2dCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHN0ID0gZ2V0U3RyZWFrKCk7CiAgICAgICAgdmFyIHQgPSB0b2RheUtleSgpOwogICAgICAgIGlmIChzdC5sYXN0RGF5ID09PSB0KSByZXR1cm47CiAgICAgICAgdmFyIGJyayA9IHN0Lmxhc3REYXkgJiYgZGF5RGlmZihzdC5sYXN0RGF5LCB0KSA+IChHUkFDRV9EQVlTICsgMSk7CiAgICAgICAgc3QuY291bnQgPSBicmsgPyAxIDogKHN0LmNvdW50IHx8IDApICsgMTsKICAgICAgICBzdC5sYXN0RGF5ID0gdDsKICAgICAgICBzdC50b3RhbCA9IChzdC50b3RhbCB8fCAwKSArIDE7CiAgICAgICAgc3QuYmVzdCA9IE1hdGgubWF4KHN0LmJlc3QgfHwgMCwgc3QuY291bnQpOwogICAgICAgIHNldFN0cmVhayhzdCk7CiAgICAgICAgaWYgKHN0LmNvdW50ID49IEdPQUwpIHsKICAgICAgICAgIHRvYXN0KEdPQUwgKyAnLWRheSBjaGFsbGVuZ2UgY29tcGxldGUhICcgKyBCT05VU19DUkVESVRTICsgJyBib251cyBjcmVkaXRzIHVubG9ja2VkLicsICdzdWNjZXNzJyk7CiAgICAgICAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jb25mZXR0aSA9PT0gJ2Z1bmN0aW9uJykgeyB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG9hc3QoJ0RheSAnICsgc3QuY291bnQgKyAnIGxvZ2dlZCDCtyArJyArIERBSUxZX0NSRURJVFMgKyAnIGNyZWRpdHMnLCAnc3VjY2VzcycpOwogICAgICAgICAgaWYgKHN0LmNvdW50ID4gMSAmJiBWLnVpICYmIHR5cGVvZiBWLnVpLmNvbmZldHRpID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IFYudWkuY29uZmV0dGkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgICAgIH0KICAgICAgICByZW5kZXIocm9vdCk7CiAgICAgIH0pOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3RhY2stc20nIH0sCiAgICAgICAgbG9nQnRuLAogICAgICAgIGN0YUJ1dHRvbignQ3JlYXRlIHNvbWV0aGluZyBub3cnLCB7IGdob3N0OiB0cnVlLCBibG9jazogdHJ1ZSwgaWNvbjogJ3NwYXJrbGVzJywgb25DbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9jcmVhdGUnKTsgfSB9KSkpOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChjYWxlbmRhck5vZGUobGl2ZUNvdW50KSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEycHgnIH0sIHRleHQ6ICdEYWlseSBhbmQgYm9udXMgY3JlZGl0cyBhcmUgY29uZmlybWVkIHNlcnZlci1zaWRlLiBQb3N0cyBtdXN0IGluY2x1ZGUgdGhlIEB2YW1wIG9yICN2YW1wIHRhZyB0byBxdWFsaWZ5LicgfSkpOwoKICAgICAgcm9vdC5hcHBlbmRDaGlsZCh2aWV3KTsKICAgIH0KCiAgICBmdW5jdGlvbiByaW5nTm9kZShwY3QsIGNvdW50KSB7CiAgICAgIHZhciBzaXplID0gMTMyLCBzdHJva2UgPSAxMiwgciA9IChzaXplIC0gc3Ryb2tlKSAvIDIsIGMgPSAyICogTWF0aC5QSSAqIHI7CiAgICAgIHZhciBvZmYgPSBjICogKDEgLSBwY3QpOwogICAgICB2YXIgc3ZnTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOwogICAgICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCAnc3ZnJyk7CiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCAnMCAwICcgKyBzaXplICsgJyAnICsgc2l6ZSk7CiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgc2l6ZSk7IHN2Zy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHNpemUpOwogICAgICBzdmcuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgIHZhciBiZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzdmdOUywgJ2NpcmNsZScpOwogICAgICBiZy5zZXRBdHRyaWJ1dGUoJ2N4Jywgc2l6ZSAvIDIpOyBiZy5zZXRBdHRyaWJ1dGUoJ2N5Jywgc2l6ZSAvIDIpOyBiZy5zZXRBdHRyaWJ1dGUoJ3InLCByKTsKICAgICAgYmcuc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTsgYmcuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBzdHJva2UpOwogICAgICBiZy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICd2YXIoLS12LWxpbmUsIHJnYmEoMjQ1LDI0NSwyNDcsLjE1KSknKTsKICAgICAgdmFyIGZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCAnY2lyY2xlJyk7CiAgICAgIGZnLnNldEF0dHJpYnV0ZSgnY3gnLCBzaXplIC8gMik7IGZnLnNldEF0dHJpYnV0ZSgnY3knLCBzaXplIC8gMik7IGZnLnNldEF0dHJpYnV0ZSgncicsIHIpOwogICAgICBmZy5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnbm9uZScpOyBmZy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsIHN0cm9rZSk7CiAgICAgIGZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgJ3ZhcigtLXZhbXAtYWNjZW50LCAjNTI5N0Y4KScpOwogICAgICBmZy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lY2FwJywgJ3JvdW5kJyk7CiAgICAgIGZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWRhc2hhcnJheScsIGMpOwogICAgICBmZy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1kYXNob2Zmc2V0JywgYyk7CiAgICAgIGZnLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgJ3JvdGF0ZSgtOTAgJyArIChzaXplIC8gMikgKyAnICcgKyAoc2l6ZSAvIDIpICsgJyknKTsKICAgICAgc3ZnLmFwcGVuZENoaWxkKGJnKTsgc3ZnLmFwcGVuZENoaWxkKGZnKTsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHsgZmcuc3R5bGUudHJhbnNpdGlvbiA9ICdzdHJva2UtZGFzaG9mZnNldCA5MDBtcyBjdWJpYy1iZXppZXIoLjIyLDEsLjM2LDEpJzsgZmcuc2V0QXR0cmlidXRlKCdzdHJva2UtZGFzaG9mZnNldCcsIG9mZik7IH0pOwogICAgICB2YXIgbGFiZWwgPSBlbCgnZGl2JywgewogICAgICAgIHN0eWxlOiB7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCBpbnNldDogJzAnLCBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBhbGlnbkl0ZW1zOiAnY2VudGVyJywganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInIH0KICAgICAgfSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LW1vbm8nLCBzdHlsZTogeyBmb250U2l6ZTogJzM0cHgnLCBmb250V2VpZ2h0OiAnNzAwJywgbGluZUhlaWdodDogJzEnIH0sIHRleHQ6IFN0cmluZyhjb3VudCkgfSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcgfSwgdGV4dDogJy8gJyArIEdPQUwgfSkpOwogICAgICByZXR1cm4gZWwoJ2RpdicsIHsgc3R5bGU6IHsgcG9zaXRpb246ICdyZWxhdGl2ZScsIHdpZHRoOiBzaXplICsgJ3B4JywgaGVpZ2h0OiBzaXplICsgJ3B4JywgZmxleDogJzAgMCBhdXRvJyB9IH0sIHN2ZywgbGFiZWwpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNhbGVuZGFyTm9kZShjb3VudCkgewogICAgICB2YXIgZ3JpZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAnZ2xhc3MtY2FyZCcsIHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJ3ZhcigtLXNwYWNlLXNtLCA5cHgpJyB9IH0pOwogICAgICBncmlkLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdQcm9ncmVzcycgfSkpOwogICAgICB2YXIgZG90cyA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdncmlkJywgZ3JpZFRlbXBsYXRlQ29sdW1uczogJ3JlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgyMnB4LCAxZnIpKScsIGdhcDogJzhweCcgfSB9KTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gR09BTDsgaSsrKSB7CiAgICAgICAgdmFyIGRvbmUgPSBpIDw9IGNvdW50OwogICAgICAgIGRvdHMuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7CiAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICB3aWR0aDogJzIycHgnLCBoZWlnaHQ6ICcyMnB4JywgYm9yZGVyUmFkaXVzOiAnNnB4JywKICAgICAgICAgICAgYmFja2dyb3VuZDogZG9uZSA/ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknIDogJ3ZhcigtLXYtY2FyZC1iZywgcmdiYSgyNTUsMjU1LDI1NSwuMDQpKScsCiAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAnICsgKGRvbmUgPyAndHJhbnNwYXJlbnQnIDogJ3ZhcigtLXYtbGluZSwgcmdiYSgyNDUsMjQ1LDI0NywuMTUpKScpCiAgICAgICAgICB9LAogICAgICAgICAgdGl0bGU6ICdEYXkgJyArIGksICdhcmlhLWxhYmVsJzogJ0RheSAnICsgaSArIChkb25lID8gJyBjb21wbGV0ZScgOiAnJykKICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgZ3JpZC5hcHBlbmRDaGlsZChkb3RzKTsKICAgICAgcmV0dXJuIGdyaWQ7CiAgICB9CgogICAgZnVuY3Rpb24gc3RhdEJveCh2YWx1ZSwgbGFiZWwpIHsKICAgICAgcmV0dXJuIGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzJweCcgfSB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb25vJywgc3R5bGU6IHsgZm9udFNpemU6ICcyMnB4JywgZm9udFdlaWdodDogJzcwMCcgfSwgdGV4dDogU3RyaW5nKHZhbHVlKSB9KSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEycHgnIH0sIHRleHQ6IGxhYmVsIH0pKTsKICAgIH0KCiAgICByZXR1cm4geyByZW5kZXI6IHJlbmRlciB9OwogIH0pKCk7CgogIGZ1bmN0aW9uIG1heWJlQXBwbHlRdWVyeVJlZmVycmFsKHBhcmFtcykgewogICAgdmFyIGNvZGUgPSBudWxsOwogICAgaWYgKHBhcmFtcyAmJiAocGFyYW1zLnIgfHwgcGFyYW1zLnJlZikpIGNvZGUgPSBwYXJhbXMuciB8fCBwYXJhbXMucmVmOwogICAgaWYgKCFjb2RlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHNwID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTsKICAgICAgICBjb2RlID0gc3AuZ2V0KCdyJykgfHwgc3AuZ2V0KCdyZWYnKTsKICAgICAgfSBjYXRjaCAoZSkge30KICAgIH0KICAgIGlmICghY29kZSkgcmV0dXJuOwogICAgY29kZSA9IFN0cmluZyhjb2RlKS50cmltKCkudG9VcHBlckNhc2UoKTsKICAgIGlmICghY29kZSkgcmV0dXJuOwogICAgaWYgKGxzR2V0KCdyZWZlcnJhbEFwcGxpZWQnLCAnJykgPT09IGNvZGUpIHJldHVybjsKICAgIGxzU2V0KCdyZWZlcnJhbENvZGUnLCBjb2RlKTsKICAgIGlmIChWLmFwaSAmJiB0eXBlb2YgVi5hcGkuYXR0cmlidXRlUmVmZXJyYWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgVi5hcGkuYXR0cmlidXRlUmVmZXJyYWwoY29kZSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgbHNTZXQoJ3JlZmVycmFsQXBwbGllZCcsIGNvZGUpOwogICAgICAgIHRvYXN0KCdSZWZlcnJhbCBjb2RlIGFwcGxpZWQ6ICcgKyBjb2RlLCAnc3VjY2VzcycpOwogICAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmNvbmZldHRpID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IFYudWkuY29uZmV0dGkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CiAgICB9CiAgfQoKICBWLmFwcGx5UGVuZGluZ1JlZmVycmFsID0gbWF5YmVBcHBseVF1ZXJ5UmVmZXJyYWw7Cgp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9wYXkuanMgPT09PT0gKi8KKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwogIFYucGF5ID0gVi5wYXkgfHwge307CgogIHZhciBQQUNLUyA9IFsKICAgIHsKICAgICAgaWQ6ICdjcmVkaXRzXzEwMDAnLAogICAgICBjcmVkaXRzOiAxMDAwLAogICAgICBwcmljZTogOS45OSwKICAgICAgcHJpY2VMYWJlbDogJyQ5Ljk5JywKICAgICAgaGVhZGxpbmU6ICdTdGFydGVyJywKICAgICAgYmx1cmI6ICdBIHNvbGlkIHJ1biBvZiBnZW5lcmF0aW9ucyB0byBnZXQgZ29pbmcuJywKICAgICAgYWNjZW50VmFyOiAnLS12LWFjY2VudCcKICAgIH0sCiAgICB7CiAgICAgIGlkOiAnY3JlZGl0c18yNTAwJywKICAgICAgY3JlZGl0czogMjUwMCwKICAgICAgcHJpY2U6IDE5Ljk5LAogICAgICBwcmljZUxhYmVsOiAnJDE5Ljk5JywKICAgICAgaGVhZGxpbmU6ICdDcmVhdG9yJywKICAgICAgYmx1cmI6ICdPdXIgbW9zdCBwb3B1bGFyIHBhY2sg4oCUIGJldHRlciB2YWx1ZSBwZXIgY3JlZGl0LicsCiAgICAgIHBvcHVsYXI6IHRydWUsCiAgICAgIGJvbnVzTGFiZWw6ICcrMjUlIGNyZWRpdHMnLAogICAgICBhY2NlbnRWYXI6ICctLXZhbXAtYWNjZW50JwogICAgfSwKICAgIHsKICAgICAgaWQ6ICdjcmVkaXRzXzYwMDAnLAogICAgICBjcmVkaXRzOiA2MDAwLAogICAgICBwcmljZTogMzkuOTksCiAgICAgIHByaWNlTGFiZWw6ICckMzkuOTknLAogICAgICBoZWFkbGluZTogJ1N0dWRpbycsCiAgICAgIGJsdXJiOiAnQmVzdCB2YWx1ZS4gRm9yIGhlYXZ5LCBiYXRjaCBhbmQgcHJvIHdvcmtmbG93cy4nLAogICAgICBib251c0xhYmVsOiAnKzUwJSBjcmVkaXRzJywKICAgICAgYWNjZW50VmFyOiAnLS12LWFjY2VudC1kZWVwJwogICAgfQogIF07CgogIFBBQ0tTLmZvckVhY2goZnVuY3Rpb24gKHApIHsKICAgIHAucGVyQ3JlZGl0ID0gcC5wcmljZSAvIHAuY3JlZGl0czsKICB9KTsKICB2YXIgQkVTVCA9IFBBQ0tTLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgewogICAgcmV0dXJuIGIucGVyQ3JlZGl0IDwgYS5wZXJDcmVkaXQgPyBiIDogYTsKICB9LCBQQUNLU1swXSk7CgogIFYucGF5LnBhY2tzID0gUEFDS1M7CgogIFYucGF5LnBhY2sgPSBmdW5jdGlvbiAocHJvZHVjdElEKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IFBBQ0tTLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChQQUNLU1tpXS5pZCA9PT0gcHJvZHVjdElEKSByZXR1cm4gUEFDS1NbaV07CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9OwoKICBmdW5jdGlvbiBlbCgpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBWLnVpLmVsLmFwcGx5KFYudWksIGFyZ3VtZW50cyk7CiAgICB9CiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICB2YXIgdGFnID0gYXJncy5zaGlmdCgpOwogICAgdmFyIGF0dHJzID0gKGFyZ3NbMF0gJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdvYmplY3QnICYmICEoYXJnc1swXSBpbnN0YW5jZW9mIE5vZGUpKSA/IGFyZ3Muc2hpZnQoKSA6IHt9OwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBPYmplY3Qua2V5cyhhdHRycyB8fCB7fSkuZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICB2YXIgdiA9IGF0dHJzW2tdOwogICAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09IGZhbHNlKSByZXR1cm47CiAgICAgIGlmIChrID09PSAnY2xhc3MnKSBub2RlLmNsYXNzTmFtZSA9IHY7CiAgICAgIGVsc2UgaWYgKGsgPT09ICd0ZXh0Jykgbm9kZS50ZXh0Q29udGVudCA9IHY7CiAgICAgIGVsc2UgaWYgKGsgPT09ICdodG1sJykgbm9kZS5pbm5lckhUTUwgPSB2OwogICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHYpOwogICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ2RhdGEtJykgPT09IDAgfHwgay5pbmRleE9mKCdhcmlhLScpID09PSAwKSBub2RlLnNldEF0dHJpYnV0ZShrLCB2KTsKICAgICAgZWxzZSBub2RlW2tdID0gdjsKICAgIH0pOwogICAgYXJncy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjID09IG51bGwgfHwgYyA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgbm9kZS5hcHBlbmRDaGlsZChjLm5vZGVUeXBlID8gYyA6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjKSkpOwogICAgfSk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIGljb24obmFtZSkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaWNvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgb3V0ID0gVi51aS5pY29uKG5hbWUpOwogICAgICBpZiAodHlwZW9mIG91dCA9PT0gJ3N0cmluZycpIHsKICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICBzcGFuLmNsYXNzTmFtZSA9ICd2LWljbyc7CiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICBzcGFuLmlubmVySFRNTCA9IG91dDsKICAgICAgICByZXR1cm4gc3BhbjsKICAgICAgfQogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKICB9CgogIGZ1bmN0aW9uIHRvYXN0KG1zZywga2luZCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkudG9hc3QgPT09ICdmdW5jdGlvbicpIFYudWkudG9hc3QobXNnLCBraW5kIHx8ICdpbmZvJyk7CiAgICBlbHNlIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLmVtaXQgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuZW1pdCgndG9hc3QnLCB7IG1lc3NhZ2U6IG1zZywga2luZDoga2luZCB8fCAnaW5mbycgfSk7CiAgfQoKICBmdW5jdGlvbiBjb25mZXR0aSgpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmNvbmZldHRpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7IFYudWkuY29uZmV0dGkoKTsgfSBjYXRjaCAoZSkge30KICAgIH0KICB9CgogIGZ1bmN0aW9uIGdvKGhhc2gpIHsKICAgIGlmIChWLnJvdXRlciAmJiB0eXBlb2YgVi5yb3V0ZXIuZ28gPT09ICdmdW5jdGlvbicpIFYucm91dGVyLmdvKGhhc2gpOwogICAgZWxzZSB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiBiYWxhbmNlKCkgewogICAgdmFyIGMgPSAoVi5zdGF0ZSAmJiBWLnN0YXRlLmNyZWRpdHMpOwogICAgYyA9ICh0eXBlb2YgYyA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoYykpID8gYyA6IChWLnN0b3JlICYmIFYuc3RvcmUuZ2V0ID8gVi5zdG9yZS5nZXQoJ2NyZWRpdHMnKSA6IDApOwogICAgcmV0dXJuICh0eXBlb2YgYyA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoYykpID8gYyA6IDA7CiAgfQoKICBmdW5jdGlvbiBpc0F1dGhlZCgpIHsKICAgIHJldHVybiAhIShWLmF1dGggJiYgdHlwZW9mIFYuYXV0aC5pc0F1dGhlZCA9PT0gJ2Z1bmN0aW9uJyAmJiBWLmF1dGguaXNBdXRoZWQoKSk7CiAgfQoKICBmdW5jdGlvbiBmbXRJbnQobikgewogICAgdHJ5IHsgcmV0dXJuIE51bWJlcihuKS50b0xvY2FsZVN0cmluZygnZW4tVVMnKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gU3RyaW5nKG4pOyB9CiAgfQoKICBWLnBheS5yZWZyZXNoQ3JlZGl0cyA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICghaXNBdXRoZWQoKSB8fCAhVi5hcGkgfHwgdHlwZW9mIFYuYXBpLmNyZWRpdHMgIT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShiYWxhbmNlKCkpOwogICAgfQogICAgcmV0dXJuIFYuYXBpLmNyZWRpdHMoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgdmFyIG4gPSByZXMgJiYgdHlwZW9mIHJlcy5jcmVkaXRzICE9PSAndW5kZWZpbmVkJyA/IHBhcnNlSW50KHJlcy5jcmVkaXRzLCAxMCkgOiBOYU47CiAgICAgIGlmICghaXNGaW5pdGUobikpIG4gPSBiYWxhbmNlKCk7CiAgICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLnNldCA9PT0gJ2Z1bmN0aW9uJykgVi5zdG9yZS5zZXQoJ2NyZWRpdHMnLCBuKTsKICAgICAgZWxzZSBpZiAoVi5zdGF0ZSkgVi5zdGF0ZS5jcmVkaXRzID0gbjsKICAgICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuZW1pdCA9PT0gJ2Z1bmN0aW9uJykgVi5zdG9yZS5lbWl0KCdjcmVkaXRzOmNoYW5nZWQnLCBuKTsKICAgICAgcmV0dXJuIG47CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBiYWxhbmNlKCk7CiAgICB9KTsKICB9OwoKICBWLnBheS5yZXF1aXJlQ3JlZGl0cyA9IGZ1bmN0aW9uIChjb3N0KSB7CiAgICB2YXIgbmVlZCA9IHBhcnNlSW50KGNvc3QsIDEwKTsKICAgIGlmICghaXNGaW5pdGUobmVlZCkgfHwgbmVlZCA8PSAwKSByZXR1cm4gdHJ1ZTsKICAgIHZhciBoYXZlID0gYmFsYW5jZSgpOwogICAgaWYgKGhhdmUgPj0gbmVlZCkgcmV0dXJuIHRydWU7CiAgICB2YXIgc2hvcnQgPSBuZWVkIC0gaGF2ZTsKICAgIHRvYXN0KAogICAgICBoYXZlIDw9IDAKICAgICAgICA/ICJZb3UncmUgb3V0IG9mIGNyZWRpdHMg4oCUIGFkZCBtb3JlIHRvIGtlZXAgY3JlYXRpbmcuIgogICAgICAgIDogJ05vdCBlbm91Z2ggY3JlZGl0cyDigJQgeW91IG5lZWQgJyArIGZtdEludChzaG9ydCkgKyAnIG1vcmUuJywKICAgICAgJ3dhcm5pbmcnCiAgICApOwogICAgVi5wYXkub3Blbih7IG5lZWQ6IG5lZWQsIGNvc3Q6IG5lZWQgfSk7CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgVi5wYXkub3BlbiA9IGZ1bmN0aW9uIChvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBuZWVkID0gcGFyc2VJbnQob3B0cy5uZWVkICE9IG51bGwgPyBvcHRzLm5lZWQgOiBvcHRzLmNvc3QsIDEwKTsKICAgIHZhciBxID0gJyc7CiAgICBpZiAoaXNGaW5pdGUobmVlZCkgJiYgbmVlZCA+IDApIHEgPSAnP25lZWQ9JyArIG5lZWQ7CiAgICBnbygnIy9wYXl3YWxsJyArIHEpOwogIH07CgogIFYucGF5LmJ1eSA9IGZ1bmN0aW9uIChwcm9kdWN0SUQsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIHBhY2sgPSBWLnBheS5wYWNrKHByb2R1Y3RJRCk7CiAgICBpZiAoIXBhY2spIHsKICAgICAgdG9hc3QoJ1RoYXQgcGFjayBpcyB1bmF2YWlsYWJsZSByaWdodCBub3cuJywgJ2Vycm9yJyk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwogICAgfQogICAgaWYgKCFpc0F1dGhlZCgpKSB7CiAgICAgIHRvYXN0KCdTaWduIGluIHRvIGFkZCBjcmVkaXRzLicsICdpbmZvJyk7CiAgICAgIGdvKCcjL2F1dGg/bmV4dD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KCcjL3BheXdhbGwnKSk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwogICAgfQogICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkuY2hlY2tvdXQgIT09ICdmdW5jdGlvbicpIHsKICAgICAgdG9hc3QoJ0NoZWNrb3V0IGlzbuKAmXQgYXZhaWxhYmxlIHlldC4gUGxlYXNlIHRyeSBhZ2FpbiBzb29uLicsICdlcnJvcicpOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsKICAgIH0KCiAgICB2YXIgYnRuID0gb3B0cy5idXR0b24gfHwgbnVsbDsKICAgIHZhciByZXN0b3JlID0gbG9ja0J1dHRvbihidG4sICdSZWRpcmVjdGluZ+KApicpOwoKICAgIHJldHVybiBWLmFwaS5jaGVja291dChwcm9kdWN0SUQpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICB2YXIgdXJsID0gcmVzICYmIHJlcy51cmw7CiAgICAgIGlmICghdXJsIHx8IHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduby11cmwnKTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3ZhbXBfcGF5X3BlbmRpbmcnLCBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICBwcm9kdWN0SUQ6IHByb2R1Y3RJRCwgY3JlZGl0czogcGFjay5jcmVkaXRzLCBhdDogRGF0ZS5ub3coKQogICAgICAgIH0pKTsKICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgdG9hc3QoJ09wZW5pbmcgc2VjdXJlIGNoZWNrb3V04oCmJywgJ2luZm8nKTsKICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmwpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgcmVzdG9yZSgpOwogICAgICB2YXIgc3RhdHVzID0gZXJyICYmIChlcnIuc3RhdHVzIHx8IGVyci5jb2RlKTsKICAgICAgaWYgKHN0YXR1cyA9PT0gNDA0IHx8IHN0YXR1cyA9PT0gNDA1IHx8IHN0YXR1cyA9PT0gNTAxIHx8IHN0YXR1cyA9PT0gNTAzKSB7CiAgICAgICAgdG9hc3QoJ0NyZWRpdCBwdXJjaGFzZXMgYXJlIGxhdW5jaGluZyBzb29uIOKAlCBjaGVja291dCBpc27igJl0IGxpdmUgeWV0LicsICd3YXJuaW5nJyk7CiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHsKICAgICAgICB0b2FzdCgnWW91ciBzZXNzaW9uIGV4cGlyZWQuIFBsZWFzZSBzaWduIGluIGFnYWluLicsICdlcnJvcicpOwogICAgICAgIGdvKCcjL2F1dGg/bmV4dD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KCcjL3BheXdhbGwnKSk7CiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MjkpIHsKICAgICAgICB0b2FzdCgnVG9vIG1hbnkgYXR0ZW1wdHMg4oCUIGdpdmUgaXQgYSBtb21lbnQgYW5kIHJldHJ5LicsICd3YXJuaW5nJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9hc3QoJ0NvdWxkbuKAmXQgc3RhcnQgY2hlY2tvdXQuIFBsZWFzZSB0cnkgYWdhaW4uJywgJ2Vycm9yJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CiAgfTsKCiAgZnVuY3Rpb24gbG9ja0J1dHRvbihidG4sIGxhYmVsKSB7CiAgICBpZiAoIWJ0bikgcmV0dXJuIGZ1bmN0aW9uICgpIHt9OwogICAgdmFyIHByZXZIdG1sID0gYnRuLmlubmVySFRNTDsKICAgIHZhciBwcmV2RGlzYWJsZWQgPSBidG4uZGlzYWJsZWQ7CiAgICBidG4uZGlzYWJsZWQgPSB0cnVlOwogICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1idXN5JywgJ3RydWUnKTsKICAgIGJ0bi5jbGFzc0xpc3QuYWRkKCdpcy1sb2FkaW5nJyk7CiAgICB2YXIgc3AgPSAoVi51aSAmJiB0eXBlb2YgVi51aS5zcGlubmVyID09PSAnZnVuY3Rpb24nKSA/IFYudWkuc3Bpbm5lcigpIDogbnVsbDsKICAgIGJ0bi5pbm5lckhUTUwgPSAnJzsKICAgIGlmIChzcCkgYnRuLmFwcGVuZENoaWxkKHNwLm5vZGVUeXBlID8gc3AgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJykpOwogICAgYnRuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgJyArIChsYWJlbCB8fCAnV29ya2luZ+KApicpKSk7CiAgICByZXR1cm4gZnVuY3Rpb24gcmVzdG9yZSgpIHsKICAgICAgYnRuLmRpc2FibGVkID0gcHJldkRpc2FibGVkOwogICAgICBidG4ucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWJ1c3knKTsKICAgICAgYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWxvYWRpbmcnKTsKICAgICAgYnRuLmlubmVySFRNTCA9IHByZXZIdG1sOwogICAgfTsKICB9CgogIFYucGF5LmhhbmRsZVB1cmNoYXNlUmV0dXJuID0gZnVuY3Rpb24gKHBhcmFtcykgewogICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgdmFyIHN0YXR1cyA9IHBhcmFtcy5wdXJjaGFzZSB8fCBwYXJhbXMuY2hlY2tvdXQ7CgogICAgaWYgKHN0YXR1cyA9PT0gJ2NhbmNlbCcgfHwgc3RhdHVzID09PSAnY2FuY2VsbGVkJyB8fCBzdGF0dXMgPT09ICdjYW5jZWxlZCcpIHsKICAgICAgY2xlYXJQZW5kaW5nKCk7CiAgICAgIHRvYXN0KCdDaGVja291dCBjYW5jZWxlZCDigJQgbm8gY2hhcmdlIHdhcyBtYWRlLicsICdpbmZvJyk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYmFsYW5jZSgpKTsKICAgIH0KICAgIGlmIChzdGF0dXMgIT09ICdzdWNjZXNzJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShiYWxhbmNlKCkpOwoKICAgIHZhciBwZW5kaW5nID0gcmVhZFBlbmRpbmcoKTsKICAgIGNsZWFyUGVuZGluZygpOwogICAgdmFyIGJlZm9yZSA9IGJhbGFuY2UoKTsKCiAgICByZXR1cm4gcG9sbENyZWRpdHNVbnRpbENoYW5nZWQoYmVmb3JlLCBwZW5kaW5nID8gcGVuZGluZy5jcmVkaXRzIDogMCkudGhlbihmdW5jdGlvbiAoYWZ0ZXIpIHsKICAgICAgdmFyIGdhaW5lZCA9ICh0eXBlb2YgYWZ0ZXIgPT09ICdudW1iZXInICYmIHR5cGVvZiBiZWZvcmUgPT09ICdudW1iZXInKSA/IChhZnRlciAtIGJlZm9yZSkgOiAwOwogICAgICBjb25mZXR0aSgpOwogICAgICBpZiAoZ2FpbmVkID4gMCkgewogICAgICAgIHRvYXN0KCdQYXltZW50IGNvbXBsZXRlIOKAlCAnICsgZm10SW50KGdhaW5lZCkgKyAnIGNyZWRpdHMgYWRkZWQuJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSBlbHNlIGlmIChwZW5kaW5nICYmIHBlbmRpbmcuY3JlZGl0cykgewogICAgICAgIHRvYXN0KCdQYXltZW50IHJlY2VpdmVkIOKAlCAnICsgZm10SW50KHBlbmRpbmcuY3JlZGl0cykgKyAnIGNyZWRpdHMgYXJlIG9uIHRoZSB3YXkuJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2FzdCgnUGF5bWVudCBjb21wbGV0ZSDigJQgY3JlZGl0cyBhZGRlZC4nLCAnc3VjY2VzcycpOwogICAgICB9CiAgICAgIHJldHVybiBhZnRlcjsKICAgIH0pOwogIH07CgogIGZ1bmN0aW9uIHBvbGxDcmVkaXRzVW50aWxDaGFuZ2VkKGJlZm9yZSwgZXhwZWN0ZWRHYWluKSB7CiAgICB2YXIgYXR0ZW1wdHMgPSAwOwogICAgdmFyIG1heCA9IDY7CiAgICBmdW5jdGlvbiB0aWNrKCkgewogICAgICByZXR1cm4gVi5wYXkucmVmcmVzaENyZWRpdHMoKS50aGVuKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgYXR0ZW1wdHMrKzsKICAgICAgICB2YXIgY2hhbmdlZCA9ICh0eXBlb2YgbiA9PT0gJ251bWJlcicgJiYgbiA+IGJlZm9yZSk7CiAgICAgICAgaWYgKGNoYW5nZWQgfHwgYXR0ZW1wdHMgPj0gbWF4KSByZXR1cm4gbjsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXNvbHZlKHRpY2soKSk7IH0sIDE1MDApOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiB0aWNrKCk7CiAgfQoKICBmdW5jdGlvbiByZWFkUGVuZGluZygpIHsKICAgIHRyeSB7CiAgICAgIHZhciByYXcgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd2YW1wX3BheV9wZW5kaW5nJyk7CiAgICAgIHJldHVybiByYXcgPyBKU09OLnBhcnNlKHJhdykgOiBudWxsOwogICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogIH0KICBmdW5jdGlvbiBjbGVhclBlbmRpbmcoKSB7CiAgICB0cnkgeyBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCd2YW1wX3BheV9wZW5kaW5nJyk7IH0gY2F0Y2ggKGUpIHt9CiAgfQoKICB2YXIgdmlldyA9IHt9OwogIHZhciBfY2xlYW51cCA9IFtdOwogIHZhciBfaG9zdEVsID0gbnVsbDsKCiAgZnVuY3Rpb24gb24odGFyZ2V0LCBldnQsIGZuLCBvcHRzKSB7CiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldnQsIGZuLCBvcHRzKTsKICAgIF9jbGVhbnVwLnB1c2goZnVuY3Rpb24gKCkgeyB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnQsIGZuLCBvcHRzKTsgfSk7CiAgfQoKICB2aWV3LnJlbmRlciA9IGZ1bmN0aW9uIChyb290LCBwYXJhbXMpIHsKICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTsKICAgIHRlYXJkb3duSW50ZXJuYWwoKTsKICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICByb290LmNsYXNzTGlzdC5hZGQoJ3YtcGF5d2FsbC1ob3N0Jyk7CiAgICBfaG9zdEVsID0gcm9vdDsKCiAgICB2YXIgbmVlZCA9IHBhcnNlSW50KHBhcmFtcy5uZWVkLCAxMCk7CiAgICB2YXIgaGFzTmVlZCA9IGlzRmluaXRlKG5lZWQpICYmIG5lZWQgPiAwOwogICAgdmFyIGhhdmUgPSBiYWxhbmNlKCk7CiAgICB2YXIgc2hvcnRmYWxsID0gaGFzTmVlZCA/IE1hdGgubWF4KDAsIG5lZWQgLSBoYXZlKSA6IDA7CgogICAgcm9vdC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtcGF5d2FsbF9fYmFja2Ryb3AnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSkpOwoKICAgIHZhciBwYWdlID0gZWwoJ3NlY3Rpb24nLCB7IGNsYXNzOiAndi1wYXl3YWxsJywgJ2FyaWEtbGFiZWwnOiAnQWRkIGNyZWRpdHMnIH0pOwoKICAgIHZhciBoZWFkZXIgPSBlbCgnaGVhZGVyJywgeyBjbGFzczogJ3YtcGF5d2FsbF9faGVhZCcgfSk7CiAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnIH0sICdDcmVkaXRzJykpOwogICAgaGVhZGVyLmFwcGVuZENoaWxkKGVsKCdoMScsIHsgY2xhc3M6ICd2LXBheXdhbGxfX3RpdGxlIHYtZ3JhZGllbnQnIH0sICdQb3dlciB5b3VyIGltYWdpbmF0aW9uJykpOwoKICAgIHZhciBzdWIgPSBoYXNOZWVkCiAgICAgID8gKHNob3J0ZmFsbCA+IDAKICAgICAgICAgID8gJ1RoaXMgZ2VuZXJhdGlvbiBuZWVkcyAnICsgZm10SW50KG5lZWQpICsgJyBjcmVkaXRzIOKAlCB5b3UgaGF2ZSAnICsgZm10SW50KGhhdmUpICsgJy4gQWRkICcgKyBmbXRJbnQoc2hvcnRmYWxsKSArICcgb3IgbW9yZSB0byBjb250aW51ZS4nCiAgICAgICAgICA6ICJZb3UncmUgc2V0IOKAlCBidXQgaGVyZSdzIG1vcmUgaWYgeW91IHdhbnQgYSBiaWdnZXIgcnVuLiIpCiAgICAgIDogJ0J1eSBjcmVkaXRzIG9uY2UsIHVzZSB0aGVtIGFueXRpbWUuIEV2ZXJ5IGdlbmVyYXRpb24gc3BlbmRzIGNyZWRpdHMgYmFzZWQgb24gdGhlIG1vZGVsIGFuZCBpbWFnZSBjb3VudC4nOwogICAgaGVhZGVyLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtcGF5d2FsbF9fc3ViJyB9LCBzdWIpKTsKCiAgICB2YXIgYmFsUm93ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2JhbGFuY2UnIH0pOwogICAgdmFyIHBpbGwgPSAoVi51aSAmJiB0eXBlb2YgVi51aS5jcmVkaXRzUGlsbCA9PT0gJ2Z1bmN0aW9uJykgPyBWLnVpLmNyZWRpdHNQaWxsKGhhdmUpIDogZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVkaXRzJyB9LCBmbXRJbnQoaGF2ZSkgKyAnIGNyZWRpdHMnKTsKICAgIGJhbFJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2JhbGFuY2UtbGFiZWwnIH0sICdDdXJyZW50IGJhbGFuY2UnKSk7CiAgICBiYWxSb3cuYXBwZW5kQ2hpbGQocGlsbCk7CiAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoYmFsUm93KTsKCiAgICBwYWdlLmFwcGVuZENoaWxkKGhlYWRlcik7CgogICAgdmFyIGdyaWQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZ3JpZCB2LWdyaWQtLTMgdi1wYXl3YWxsX19ncmlkJyB9KTsKICAgIFBBQ0tTLmZvckVhY2goZnVuY3Rpb24gKHApIHsKICAgICAgZ3JpZC5hcHBlbmRDaGlsZChwYWNrQ2FyZChwLCB7IHJlY29tbWVuZFNob3J0ZmFsbDogc2hvcnRmYWxsIH0pKTsKICAgIH0pOwogICAgcGFnZS5hcHBlbmRDaGlsZChncmlkKTsKCiAgICB2YXIgZmluZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19maW5lIGdsYXNzLWNhcmQnIH0pOwogICAgWwogICAgICB7IGljOiAnc3BhcmtsZXMnLCB0OiAnQ3JlZGl0cyBuZXZlciBleHBpcmUnLCBkOiAnVXNlIHRoZW0gd2hlbmV2ZXIgaW5zcGlyYXRpb24gc3RyaWtlcy4nIH0sCiAgICAgIHsgaWM6ICdsb2NrJywgdDogJ1NlY3VyZSBjaGVja291dCcsIGQ6ICdQYXltZW50cyBoYW5kbGVkIGJ5IFN0cmlwZS4gV2UgbmV2ZXIgc2VlIHlvdXIgY2FyZC4nIH0sCiAgICAgIHsgaWM6ICdib2x0JywgdDogJ0luc3RhbnQgdG9wLXVwJywgZDogJ0NyZWRpdHMgbGFuZCBvbiB5b3VyIGFjY291bnQgbW9tZW50cyBhZnRlciBwYXltZW50LicgfQogICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7CiAgICAgIHZhciBpdGVtID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2ZpbmUtaXRlbScgfSk7CiAgICAgIGl0ZW0uYXBwZW5kQ2hpbGQoaWNvbihmLmljKSk7CiAgICAgIHZhciB0eHQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcGF5d2FsbF9fZmluZS10ZXh0JyB9KTsKICAgICAgdHh0LmFwcGVuZENoaWxkKGVsKCdzdHJvbmcnLCB7fSwgZi50KSk7CiAgICAgIHR4dC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHt9LCBmLmQpKTsKICAgICAgaXRlbS5hcHBlbmRDaGlsZCh0eHQpOwogICAgICBmaW5lLmFwcGVuZENoaWxkKGl0ZW0pOwogICAgfSk7CiAgICBwYWdlLmFwcGVuZENoaWxkKGZpbmUpOwoKICAgIHZhciBmb290ZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcGF5d2FsbF9fZm9vdCcgfSk7CiAgICB2YXIgYmFjayA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0JywgdHlwZTogJ2J1dHRvbicgfSwgJ01heWJlIGxhdGVyJyk7CiAgICBvbihiYWNrLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICh3aW5kb3cuaGlzdG9yeS5sZW5ndGggPiAxKSB3aW5kb3cuaGlzdG9yeS5iYWNrKCk7CiAgICAgIGVsc2UgZ28oJyMvY3JlYXRlJyk7CiAgICB9KTsKICAgIGZvb3Rlci5hcHBlbmRDaGlsZChiYWNrKTsKCiAgICB2YXIgcmVzdG9yZU5vdGUgPSBlbCgncCcsIHsgY2xhc3M6ICd2LXBheXdhbGxfX25vdGUnIH0pOwogICAgcmVzdG9yZU5vdGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ0FscmVhZHkgcGFpZCBidXQgZG9u4oCZdCBzZWUgeW91ciBjcmVkaXRzPyAnKSk7CiAgICB2YXIgcmVmcmVzaEJ0biA9IGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtbGluaycsICdkYXRhLXJlZnJlc2gnOiAndHJ1ZScgfSwgJ1JlZnJlc2ggYmFsYW5jZScpOwogICAgcmVzdG9yZU5vdGUuYXBwZW5kQ2hpbGQocmVmcmVzaEJ0bik7CiAgICBmb290ZXIuYXBwZW5kQ2hpbGQocmVzdG9yZU5vdGUpOwogICAgcGFnZS5hcHBlbmRDaGlsZChmb290ZXIpOwoKICAgIGlmIChyZWZyZXNoQnRuKSB7CiAgICAgIG9uKHJlZnJlc2hCdG4sICdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZWZyZXNoQnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICByZWZyZXNoQnRuLnRleHRDb250ZW50ID0gJ1JlZnJlc2hpbmfigKYnOwogICAgICAgIFYucGF5LnJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgewogICAgICAgICAgcmVmcmVzaEJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgcmVmcmVzaEJ0bi50ZXh0Q29udGVudCA9ICdSZWZyZXNoIGJhbGFuY2UnOwogICAgICAgICAgdXBkYXRlQmFsYW5jZVBpbGwocGFnZSwgbik7CiAgICAgICAgICB0b2FzdCgnQmFsYW5jZSB1cGRhdGVkOiAnICsgZm10SW50KG4pICsgJyBjcmVkaXRzLicsICdpbmZvJyk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQoKICAgIHJvb3QuYXBwZW5kQ2hpbGQocGFnZSk7CgogICAgdmFyIG9uQ3JlZGl0cyA9IGZ1bmN0aW9uIChuKSB7IHVwZGF0ZUJhbGFuY2VQaWxsKHBhZ2UsIHR5cGVvZiBuID09PSAnbnVtYmVyJyA/IG4gOiBiYWxhbmNlKCkpOyB9OwogICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUub24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgVi5zdG9yZS5vbignY3JlZGl0czpjaGFuZ2VkJywgb25DcmVkaXRzKTsKICAgICAgX2NsZWFudXAucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHR5cGVvZiBWLnN0b3JlLm9mZiA9PT0gJ2Z1bmN0aW9uJykgVi5zdG9yZS5vZmYoJ2NyZWRpdHM6Y2hhbmdlZCcsIG9uQ3JlZGl0cyk7CiAgICAgIH0pOwogICAgfQoKICAgIFYucGF5LnJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgeyB1cGRhdGVCYWxhbmNlUGlsbChwYWdlLCBuKTsgfSk7CgogICAgdmFyIHByaW1hcnlDdGEgPSBwYWdlLnF1ZXJ5U2VsZWN0b3IoJy52LWNhcmQtLXBvcHVsYXIgLnYtY3RhLS1wcmltYXJ5JykgfHwgcGFnZS5xdWVyeVNlbGVjdG9yKCcudi1jdGEtLXByaW1hcnknKTsKICAgIGlmIChwcmltYXJ5Q3RhKSB7CiAgICAgIHRyeSB7IHByaW1hcnlDdGEuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pOyB9IGNhdGNoIChlKSB7IHByaW1hcnlDdGEuZm9jdXMoKTsgfQogICAgfQogIH07CgogIGZ1bmN0aW9uIHVwZGF0ZUJhbGFuY2VQaWxsKHBhZ2UsIG4pIHsKICAgIGlmICghcGFnZSkgcmV0dXJuOwogICAgdmFyIGhvbGRlciA9IHBhZ2UucXVlcnlTZWxlY3RvcignLnYtcGF5d2FsbF9fYmFsYW5jZScpOwogICAgaWYgKCFob2xkZXIpIHJldHVybjsKICAgIHZhciBmcmVzaCA9IChWLnVpICYmIHR5cGVvZiBWLnVpLmNyZWRpdHNQaWxsID09PSAnZnVuY3Rpb24nKSA/IFYudWkuY3JlZGl0c1BpbGwobikgOiBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHMnIH0sIGZtdEludChuKSArICcgY3JlZGl0cycpOwogICAgdmFyIG9sZCA9IGhvbGRlci5xdWVyeVNlbGVjdG9yKCcudi1jcmVkaXRzLCBbZGF0YS1jcmVkaXRzLXBpbGxdJyk7CiAgICBpZiAob2xkKSBob2xkZXIucmVwbGFjZUNoaWxkKGZyZXNoLCBvbGQpOwogICAgZWxzZSBob2xkZXIuYXBwZW5kQ2hpbGQoZnJlc2gpOwogIH0KCiAgZnVuY3Rpb24gcGFja0NhcmQocCwgY3R4KSB7CiAgICBjdHggPSBjdHggfHwge307CiAgICB2YXIgY2xhc3NlcyA9ICd2LWNhcmQgZ2xhc3MtY2FyZCB2LXBheXdhbGxfX3BhY2snOwogICAgaWYgKHAucG9wdWxhcikgY2xhc3NlcyArPSAnIHYtY2FyZC0tcG9wdWxhcic7CiAgICBpZiAocC5pZCA9PT0gQkVTVC5pZCkgY2xhc3NlcyArPSAnIHYtY2FyZC0tYmVzdCc7CgogICAgdmFyIGNhcmQgPSBlbCgnYXJ0aWNsZScsIHsKICAgICAgY2xhc3M6IGNsYXNzZXMsCiAgICAgICdkYXRhLXByb2R1Y3QnOiBwLmlkLAogICAgICBzdHlsZTogJy0tcGFjay1hY2NlbnQ6IHZhcignICsgcC5hY2NlbnRWYXIgKyAnKScKICAgIH0pOwoKICAgIGlmIChwLnBvcHVsYXIpIHsKICAgICAgY2FyZC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2JhZGdlIHYtcGF5d2FsbF9fYmFkZ2UtLXBvcHVsYXInIH0sICdNb3N0IHBvcHVsYXInKSk7CiAgICB9IGVsc2UgaWYgKHAuaWQgPT09IEJFU1QuaWQpIHsKICAgICAgY2FyZC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2JhZGdlIHYtcGF5d2FsbF9fYmFkZ2UtLWJlc3QnIH0sICdCZXN0IHZhbHVlJykpOwogICAgfQoKICAgIHZhciBoZWFkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX3BhY2staGVhZCcgfSk7CiAgICBoZWFkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1leWVicm93JyB9LCBwLmhlYWRsaW5lKSk7CiAgICB2YXIgY3JlZGl0c0JpZyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19jcmVkaXRzJyB9KTsKICAgIGNyZWRpdHNCaWcuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1wYXl3YWxsX19jcmVkaXRzLW51bScgfSwgZm10SW50KHAuY3JlZGl0cykpKTsKICAgIGNyZWRpdHNCaWcuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1wYXl3YWxsX19jcmVkaXRzLXVuaXQnIH0sICdjcmVkaXRzJykpOwogICAgaGVhZC5hcHBlbmRDaGlsZChjcmVkaXRzQmlnKTsKICAgIGlmIChwLmJvbnVzTGFiZWwpIGhlYWQuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1wYXl3YWxsX19ib251cycgfSwgcC5ib251c0xhYmVsKSk7CiAgICBjYXJkLmFwcGVuZENoaWxkKGhlYWQpOwoKICAgIHZhciBwcmljZVJvdyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19wcmljZScgfSk7CiAgICBwcmljZVJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX3ByaWNlLWFtdCcgfSwgcC5wcmljZUxhYmVsKSk7CiAgICB2YXIgcGVyID0gKHAucHJpY2UgLyBwLmNyZWRpdHMgKiAxMDAwKTsKICAgIHByaWNlUm93LmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtcGF5d2FsbF9fcHJpY2UtcGVyJyB9LCAnJCcgKyBwZXIudG9GaXhlZCgyKSArICcgLyAxLDAwMCcpKTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQocHJpY2VSb3cpOwoKICAgIGNhcmQuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19wYWNrLWJsdXJiJyB9LCBwLmJsdXJiKSk7CgogICAgdmFyIGFwcHJveCA9IE1hdGguZmxvb3IocC5jcmVkaXRzIC8gMTApOwogICAgdmFyIGZlYXQgPSBlbCgndWwnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19mZWF0cycgfSk7CiAgICBbCiAgICAgICd+JyArIGZtdEludChhcHByb3gpICsgJyBTdGFuZGFyZCBnZW5lcmF0aW9ucycsCiAgICAgICdXb3JrcyB3aXRoIGV2ZXJ5IG1vZGVsJywKICAgICAgJ0NyZWRpdHMgbmV2ZXIgZXhwaXJlJwogICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7CiAgICAgIHZhciBsaSA9IGVsKCdsaScsIHt9KTsKICAgICAgbGkuYXBwZW5kQ2hpbGQoaWNvbignY2hlY2snKSk7CiAgICAgIGxpLmFwcGVuZENoaWxkKGVsKCdzcGFuJywge30sIGxpbmUpKTsKICAgICAgZmVhdC5hcHBlbmRDaGlsZChsaSk7CiAgICB9KTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoZmVhdCk7CgogICAgdmFyIGJ1eUNsYXNzID0gcC5wb3B1bGFyID8gJ3YtY3RhIHYtY3RhLS1wcmltYXJ5IHYtY3RhLS1ibG9jaycgOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1ibG9jayc7CiAgICB2YXIgYnV5ID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6IGJ1eUNsYXNzLAogICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgJ2FyaWEtbGFiZWwnOiAnQnV5ICcgKyBmbXRJbnQocC5jcmVkaXRzKSArICcgY3JlZGl0cyBmb3IgJyArIHAucHJpY2VMYWJlbAogICAgfSwgJ0dldCAnICsgZm10SW50KHAuY3JlZGl0cykgKyAnIGNyZWRpdHMnKTsKICAgIG9uKGJ1eSwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICBpZiAoYnV5LmRpc2FibGVkKSByZXR1cm47CiAgICAgIFYucGF5LmJ1eShwLmlkLCB7IGJ1dHRvbjogYnV5IH0pOwogICAgfSk7CiAgICBjYXJkLmFwcGVuZENoaWxkKGJ1eSk7CgogICAgaWYgKGN0eC5yZWNvbW1lbmRTaG9ydGZhbGwgJiYgcC5jcmVkaXRzID49IGN0eC5yZWNvbW1lbmRTaG9ydGZhbGwgJiYgIXAucG9wdWxhcikgewogICAgICB2YXIgaGludCA9IGVsKCdzcGFuJywgeyBjbGFzczogJ3YtcGF5d2FsbF9fY292ZXInIH0sICdDb3ZlcnMgd2hhdCB5b3UgbmVlZCcpOwogICAgICB2YXIgc21hbGxlciA9IFBBQ0tTLmZpbHRlcihmdW5jdGlvbiAocSkgeyByZXR1cm4gcS5jcmVkaXRzID49IGN0eC5yZWNvbW1lbmRTaG9ydGZhbGw7IH0pOwogICAgICBpZiAoc21hbGxlci5sZW5ndGggJiYgc21hbGxlclswXS5pZCA9PT0gcC5pZCkgY2FyZC5hcHBlbmRDaGlsZChoaW50KTsKICAgIH0KCiAgICByZXR1cm4gY2FyZDsKICB9CgogIGZ1bmN0aW9uIHRlYXJkb3duSW50ZXJuYWwoKSB7CiAgICB3aGlsZSAoX2NsZWFudXAubGVuZ3RoKSB7CiAgICAgIHZhciBmbiA9IF9jbGVhbnVwLnBvcCgpOwogICAgICB0cnkgeyBmbigpOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgaWYgKF9ob3N0RWwpIHsKICAgICAgX2hvc3RFbC5jbGFzc0xpc3QucmVtb3ZlKCd2LXBheXdhbGwtaG9zdCcpOwogICAgICBfaG9zdEVsID0gbnVsbDsKICAgIH0KICB9CgogIHZpZXcudGVhcmRvd24gPSBmdW5jdGlvbiAoKSB7IHRlYXJkb3duSW50ZXJuYWwoKTsgfTsKCiAgVi52aWV3cy5wYXl3YWxsID0gdmlldzsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvYXV0aC12aWV3LmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLnZpZXdzID0gVi52aWV3cyB8fCB7fTsKCiAgZnVuY3Rpb24gZWwodGFnLCBhdHRycykgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuZWwgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnVpLmVsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIHZhciBpID0gMTsKICAgIGlmIChhdHRycyAmJiB0eXBlb2YgYXR0cnMgPT09ICdvYmplY3QnICYmICEoYXR0cnMgaW5zdGFuY2VvZiBOb2RlKSAmJiB0eXBlb2YgYXR0cnMgIT09ICdzdHJpbmcnKSB7CiAgICAgIGkgPSAyOwogICAgICBmb3IgKHZhciBrIGluIGF0dHJzKSB7CiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cnMsIGspKSBjb250aW51ZTsKICAgICAgICB2YXIgdmFsID0gYXR0cnNba107CiAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gZmFsc2UpIGNvbnRpbnVlOwogICAgICAgIGlmIChrID09PSAnY2xhc3MnIHx8IGsgPT09ICdjbGFzc05hbWUnKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAndGV4dCcpIG5vZGUudGV4dENvbnRlbnQgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ2h0bWwnKSBub2RlLmlubmVySFRNTCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgbm9kZS5hZGRFdmVudExpc3RlbmVyKGsuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgdmFsKTsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ2RhdGEtJykgPT09IDAgfHwgay5pbmRleE9mKCdhcmlhLScpID09PSAwKSBub2RlLnNldEF0dHJpYnV0ZShrLCB2YWwpOwogICAgICAgIGVsc2UgaWYgKHZhbCA9PT0gdHJ1ZSkgbm9kZS5zZXRBdHRyaWJ1dGUoaywgJycpOwogICAgICAgIGVsc2UgeyB0cnkgeyBub2RlW2tdID0gdmFsOyB9IGNhdGNoIChlKSB7IG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7IH0gfQogICAgICB9CiAgICB9IGVsc2UgaWYgKGF0dHJzICE9IG51bGwpIHsgYXBwZW5kQ2hpbGQobm9kZSwgYXR0cnMpOyB9CiAgICBmb3IgKDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXBwZW5kQ2hpbGQobm9kZSwgYXJndW1lbnRzW2ldKTsKICAgIHJldHVybiBub2RlOwogIH0KICBmdW5jdGlvbiBhcHBlbmRDaGlsZChub2RlLCBjKSB7CiAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlIHx8IGMgPT09IHRydWUpIHJldHVybjsKICAgIGlmIChBcnJheS5pc0FycmF5KGMpKSB7IGMuZm9yRWFjaChmdW5jdGlvbiAoeCkgeyBhcHBlbmRDaGlsZChub2RlLCB4KTsgfSk7IHJldHVybjsgfQogICAgbm9kZS5hcHBlbmRDaGlsZChjLm5vZGVUeXBlID8gYyA6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjKSkpOwogIH0KCiAgZnVuY3Rpb24gdG9hc3QobXNnLCBraW5kKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS50b2FzdCA9PT0gJ2Z1bmN0aW9uJykgeyBWLnVpLnRvYXN0KG1zZywga2luZCB8fCAnaW5mbycpOyByZXR1cm47IH0KICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLmVtaXQgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuZW1pdCgndG9hc3QnLCB7IG1zZzogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsKICB9CiAgZnVuY3Rpb24gZ28oaGFzaCkgewogICAgaWYgKFYucm91dGVyICYmIHR5cGVvZiBWLnJvdXRlci5nbyA9PT0gJ2Z1bmN0aW9uJykgVi5yb3V0ZXIuZ28oaGFzaCk7CiAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gaGFzaDsKICB9CiAgZnVuY3Rpb24gaXNFbWFpbChzKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwuaXNFbWFpbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudXRpbC5pc0VtYWlsKHMpOwogICAgcmV0dXJuIC9eW15cc0BdK0BbXlxzQF0rXC5bXlxzQF0rJC8udGVzdChTdHJpbmcocyB8fCAnJykudHJpbSgpKTsKICB9CiAgZnVuY3Rpb24gc3Bpbm5lcigpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnNwaW5uZXIgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgdmFyIHMgPSBWLnVpLnNwaW5uZXIoKTsgaWYgKHMgJiYgcy5ub2RlVHlwZSkgcmV0dXJuIHM7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIHJldHVybiBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXNwaW5uZXInIH0pOwogIH0KICBmdW5jdGlvbiBhdXRoVmlkZW9VUkwoKSB7CiAgICB2YXIgY2ZnID0gKFYuY29uZmlnIHx8IHt9KTsKICAgIHJldHVybiBjZmcuQVVUSF9WSURFTyB8fCBjZmcuREVNT19WSURFTyB8fCAnJzsKICB9CgogIHZhciBfcm9vdCA9IG51bGw7CiAgdmFyIF9tb2RlID0gJ3NpZ25pbic7CiAgdmFyIF9uZXh0ID0gbnVsbDsKICB2YXIgX3ZpZGVvID0gbnVsbDsKCiAgZnVuY3Rpb24gbGFuZEFmdGVyQXV0aCgpIHsKICAgIHZhciBkZXN0ID0gX25leHQ7CiAgICBpZiAoIWRlc3QpIHsKICAgICAgdmFyIG9uYm9hcmRlZCA9IFYuc3RhdGUgJiYgVi5zdGF0ZS5vbmJvYXJkaW5nRG9uZSA9PT0gdHJ1ZTsKICAgICAgZGVzdCA9IG9uYm9hcmRlZCA/ICcjL2NyZWF0ZScgOiAnIy9vbmJvYXJkaW5nJzsKICAgIH0KICAgIGdvKGRlc3QpOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRCYWNrZ3JvdW5kKHN0YWdlKSB7CiAgICB2YXIgc3JjID0gYXV0aFZpZGVvVVJMKCk7CiAgICBpZiAoc3JjKSB7CiAgICAgIHZhciB2aWRlbyA9IGVsKCd2aWRlbycsIHsKICAgICAgICBjbGFzczogJ3YtYXV0aF9fdmlkZW8nLAogICAgICAgIG11dGVkOiB0cnVlLAogICAgICAgIGxvb3A6IHRydWUsCiAgICAgICAgYXV0b3BsYXk6IHRydWUsCiAgICAgICAgcGxheXNpbmxpbmU6IHRydWUsCiAgICAgICAgcHJlbG9hZDogJ2F1dG8nLAogICAgICAgIHRhYmluZGV4OiAnLTEnLAogICAgICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJwogICAgICB9KTsKICAgICAgdmlkZW8ubXV0ZWQgPSB0cnVlOwogICAgICB2aWRlby5kZWZhdWx0TXV0ZWQgPSB0cnVlOwogICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ211dGVkJywgJycpOwogICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ3BsYXlzaW5saW5lJywgJycpOwogICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ3dlYmtpdC1wbGF5c2lubGluZScsICcnKTsKICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdkaXNhYmxlcGljdHVyZWlucGljdHVyZScsICcnKTsKICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdkaXNhYmxlcmVtb3RlcGxheWJhY2snLCAnJyk7CiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkgewogICAgICAgIGlmICh2aWRlby5wYXJlbnROb2RlKSB2aWRlby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHZpZGVvKTsKICAgICAgfSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICB2YXIgYXR0ZW1wdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIHAgPSB2aWRlby5wbGF5KCk7CiAgICAgICAgICBpZiAocCAmJiB0eXBlb2YgcC5jYXRjaCA9PT0gJ2Z1bmN0aW9uJykgcC5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CiAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgfTsKICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignY2FucGxheScsIGF0dGVtcHQsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIGF0dGVtcHQsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgdHJ5IHsgdmlkZW8uc3JjID0gc3JjOyB9IGNhdGNoIChlMikgeyB2aWRlby5zZXRBdHRyaWJ1dGUoJ3NyYycsIHNyYyk7IH0KICAgICAgdHJ5IHsgdmlkZW8ubG9hZCgpOyB9IGNhdGNoIChlMykge30KICAgICAgX3ZpZGVvID0gdmlkZW87CiAgICAgIHN0YWdlLmFwcGVuZENoaWxkKHZpZGVvKTsKICAgIH0KICAgIHN0YWdlLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19zY3JpbScsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KSk7CiAgfQoKICBmdW5jdGlvbiBmaWVsZChvcHRzKSB7CiAgICB2YXIgaW5wdXQgPSBlbCgnaW5wdXQnLCB7CiAgICAgIHR5cGU6IG9wdHMudHlwZSB8fCAndGV4dCcsCiAgICAgIGNsYXNzOiAndi1maWVsZCcsCiAgICAgIG5hbWU6IG9wdHMubmFtZSwKICAgICAgaWQ6ICd2LWF1dGgtJyArIG9wdHMubmFtZSwKICAgICAgcGxhY2Vob2xkZXI6IG9wdHMucGxhY2Vob2xkZXIgfHwgJycsCiAgICAgIGF1dG9jb21wbGV0ZTogb3B0cy5hdXRvY29tcGxldGUgfHwgJ29mZicsCiAgICAgICdhcmlhLWxhYmVsJzogb3B0cy5sYWJlbCB8fCBvcHRzLnBsYWNlaG9sZGVyIHx8IG9wdHMubmFtZSwKICAgICAgcmVxdWlyZWQ6IG9wdHMucmVxdWlyZWQgPyAnJyA6IG51bGwsCiAgICAgIHZhbHVlOiBvcHRzLnZhbHVlIHx8ICcnCiAgICB9KTsKICAgIGlmIChvcHRzLmlucHV0bW9kZSkgaW5wdXQuc2V0QXR0cmlidXRlKCdpbnB1dG1vZGUnLCBvcHRzLmlucHV0bW9kZSk7CiAgICBpZiAob3B0cy5hdXRvY2FwaXRhbGl6ZSkgaW5wdXQuc2V0QXR0cmlidXRlKCdhdXRvY2FwaXRhbGl6ZScsIG9wdHMuYXV0b2NhcGl0YWxpemUpOwogICAgaWYgKG9wdHMuc3BlbGxjaGVjayA9PT0gZmFsc2UpIGlucHV0LnNldEF0dHJpYnV0ZSgnc3BlbGxjaGVjaycsICdmYWxzZScpOwogICAgaWYgKG9wdHMubWlubGVuZ3RoKSBpbnB1dC5zZXRBdHRyaWJ1dGUoJ21pbmxlbmd0aCcsIFN0cmluZyhvcHRzLm1pbmxlbmd0aCkpOwogICAgaWYgKG9wdHMubWF4bGVuZ3RoKSBpbnB1dC5zZXRBdHRyaWJ1dGUoJ21heGxlbmd0aCcsIFN0cmluZyhvcHRzLm1heGxlbmd0aCkpOwogICAgdmFyIHdyYXAgPSBlbCgnbGFiZWwnLCB7IGNsYXNzOiAndi1hdXRoX19ncm91cCcgfSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1hdXRoX19sYWJlbCcsIHRleHQ6IG9wdHMubGFiZWwgfHwgJycgfSksCiAgICAgIGlucHV0KTsKICAgIHdyYXAuaW5wdXQgPSBpbnB1dDsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gc3RhdHVzTGluZSgpIHsKICAgIHJldHVybiBlbCgncCcsIHsgY2xhc3M6ICd2LWF1dGhfX3N0YXR1cycsIHJvbGU6ICdhbGVydCcsICdhcmlhLWxpdmUnOiAncG9saXRlJyB9KTsKICB9CgogIGZ1bmN0aW9uIHNob3dTdGF0dXMobm9kZSwgbXNnLCBpc0Vycm9yKSB7CiAgICBpZiAoIW5vZGUpIHJldHVybjsKICAgIG5vZGUudGV4dENvbnRlbnQgPSBtc2cgfHwgJyc7CiAgICBub2RlLmNsYXNzTGlzdC50b2dnbGUoJ3YtYXV0aF9fc3RhdHVzLS1lcnJvcicsICEhaXNFcnJvcik7CiAgfQoKICBmdW5jdGlvbiBzdWJtaXRCdXR0b24obGFiZWwpIHsKICAgIHZhciBidG4gPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnc3VibWl0JywgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tYmxvY2snIH0sIGVsKCdzcGFuJywgeyB0ZXh0OiBsYWJlbCB9KSk7CiAgICBidG4uc2V0TG9hZGluZyA9IGZ1bmN0aW9uIChvbiwgYnVzeUxhYmVsKSB7CiAgICAgIGJ0bi5kaXNhYmxlZCA9ICEhb247CiAgICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdpcy1sb2FkaW5nJywgISFvbik7CiAgICAgIGJ0bi5pbm5lckhUTUwgPSAnJzsKICAgICAgaWYgKG9uKSB7IGJ0bi5hcHBlbmRDaGlsZChzcGlubmVyKCkpOyBidG4uYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IHRleHQ6ICcgJyArIChidXN5TGFiZWwgfHwgJ1dvcmtpbmfigKYnKSB9KSk7IH0KICAgICAgZWxzZSBidG4uYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IHRleHQ6IGxhYmVsIH0pKTsKICAgIH07CiAgICByZXR1cm4gYnRuOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRTaWduSW4oKSB7CiAgICB2YXIgZW1haWxGID0gZmllbGQoeyBuYW1lOiAnZW1haWwnLCB0eXBlOiAnZW1haWwnLCBsYWJlbDogJ0VtYWlsJywgcGxhY2Vob2xkZXI6ICd5b3VAc3R1ZGlvLmNvbScsIGF1dG9jb21wbGV0ZTogJ3VzZXJuYW1lJywgaW5wdXRtb2RlOiAnZW1haWwnLCBhdXRvY2FwaXRhbGl6ZTogJ25vbmUnLCBzcGVsbGNoZWNrOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWUgfSk7CiAgICB2YXIgcHdGID0gZmllbGQoeyBuYW1lOiAncGFzc3dvcmQnLCB0eXBlOiAncGFzc3dvcmQnLCBsYWJlbDogJ1Bhc3N3b3JkJywgcGxhY2Vob2xkZXI6ICdZb3VyIHBhc3N3b3JkJywgYXV0b2NvbXBsZXRlOiAnY3VycmVudC1wYXNzd29yZCcsIHJlcXVpcmVkOiB0cnVlIH0pOwogICAgdmFyIHN0YXR1cyA9IHN0YXR1c0xpbmUoKTsKICAgIHZhciBidG4gPSBzdWJtaXRCdXR0b24oJ1NpZ24gaW4nKTsKCiAgICB2YXIgZm9ybSA9IGVsKCdmb3JtJywgeyBjbGFzczogJ3YtYXV0aF9fZm9ybScsIG5vdmFsaWRhdGU6ICcnIH0sCiAgICAgIGVtYWlsRiwgcHdGLCBzdGF0dXMsIGJ0biwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWF1dGhfX3JvdycgfSwKICAgICAgICBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWxpbmsgdi1hdXRoX19mb3Jnb3QnLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IHNldE1vZGUoJ3Jlc2V0JywgZW1haWxGLmlucHV0LnZhbHVlKTsgfSB9LCAnRm9yZ290IHBhc3N3b3JkPycpCiAgICAgICkKICAgICk7CgogICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBmdW5jdGlvbiAoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHZhciBlbWFpbCA9IChlbWFpbEYuaW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTsKICAgICAgdmFyIHB3ID0gcHdGLmlucHV0LnZhbHVlIHx8ICcnOwogICAgICBpZiAoIWlzRW1haWwoZW1haWwpKSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnRW50ZXIgYSB2YWxpZCBlbWFpbC4nLCB0cnVlKTsgZW1haWxGLmlucHV0LmZvY3VzKCk7IHJldHVybjsgfQogICAgICBpZiAoIXB3KSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnRW50ZXIgeW91ciBwYXNzd29yZC4nLCB0cnVlKTsgcHdGLmlucHV0LmZvY3VzKCk7IHJldHVybjsgfQogICAgICBpZiAoIVYuYXV0aCB8fCB0eXBlb2YgVi5hdXRoLnNpZ25JbiAhPT0gJ2Z1bmN0aW9uJykgeyBzaG93U3RhdHVzKHN0YXR1cywgJ1NpZ24taW4gaXMgdW5hdmFpbGFibGUgcmlnaHQgbm93LicsIHRydWUpOyByZXR1cm47IH0KCiAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAnJyk7CiAgICAgIGJ0bi5zZXRMb2FkaW5nKHRydWUsICdTaWduaW5nIGlu4oCmJyk7CiAgICAgIFYuYXV0aC5zaWduSW4oZW1haWwsIHB3KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICB0b2FzdCgnV2VsY29tZSBiYWNrLicsICdzdWNjZXNzJyk7CiAgICAgICAgbGFuZEFmdGVyQXV0aCgpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgYnRuLnNldExvYWRpbmcoZmFsc2UpOwogICAgICAgIHZhciBzdGF0dXM0MDEgPSBlcnIgJiYgKGVyci5zdGF0dXMgPT09IDQwMSB8fCBlcnIuc3RhdHVzID09PSA0MDMpOwogICAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCBzdGF0dXM0MDEgPyAnRW1haWwgb3IgcGFzc3dvcmQgaXMgaW5jb3JyZWN0LicgOiAoKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ0NvdWxkIG5vdCBzaWduIGluLiBQbGVhc2UgdHJ5IGFnYWluLicpLCB0cnVlKTsKICAgICAgfSk7CiAgICB9KTsKICAgIHJldHVybiBmb3JtOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRSZWdpc3RlcigpIHsKICAgIHZhciBuYW1lRiA9IGZpZWxkKHsgbmFtZTogJ25hbWUnLCBsYWJlbDogJ05hbWUnLCBwbGFjZWhvbGRlcjogJ1lvdXIgbmFtZScsIGF1dG9jb21wbGV0ZTogJ25hbWUnIH0pOwogICAgdmFyIGVtYWlsRiA9IGZpZWxkKHsgbmFtZTogJ2VtYWlsJywgdHlwZTogJ2VtYWlsJywgbGFiZWw6ICdFbWFpbCcsIHBsYWNlaG9sZGVyOiAneW91QHN0dWRpby5jb20nLCBhdXRvY29tcGxldGU6ICd1c2VybmFtZScsIGlucHV0bW9kZTogJ2VtYWlsJywgYXV0b2NhcGl0YWxpemU6ICdub25lJywgc3BlbGxjaGVjazogZmFsc2UsIHJlcXVpcmVkOiB0cnVlIH0pOwogICAgdmFyIHB3RiA9IGZpZWxkKHsgbmFtZTogJ3Bhc3N3b3JkJywgdHlwZTogJ3Bhc3N3b3JkJywgbGFiZWw6ICdQYXNzd29yZCcsIHBsYWNlaG9sZGVyOiAnOOKAkzI0IGNoYXJhY3RlcnMnLCBhdXRvY29tcGxldGU6ICduZXctcGFzc3dvcmQnLCBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDogMjQsIHJlcXVpcmVkOiB0cnVlIH0pOwogICAgdmFyIHN0YXR1cyA9IHN0YXR1c0xpbmUoKTsKICAgIHZhciBidG4gPSBzdWJtaXRCdXR0b24oJ0NyZWF0ZSBhY2NvdW50Jyk7CgogICAgdmFyIGxlZ2FsID0gZWwoJ3AnLCB7IGNsYXNzOiAndi1hdXRoX19sZWdhbCcgfSwKICAgICAgJ0J5IGNyZWF0aW5nIGFuIGFjY291bnQgeW91IGFncmVlIHRvIG91ciAnLAogICAgICBlbCgnYScsIHsgaHJlZjogJ2h0dHBzOi8vdm9vc2V5LmNvbS90ZXJtcycsIHRhcmdldDogJ19ibGFuaycsIHJlbDogJ25vb3BlbmVyJywgY2xhc3M6ICd2LWxpbmsnIH0sICdUZXJtcycpLAogICAgICAnIGFuZCAnLAogICAgICBlbCgnYScsIHsgaHJlZjogJ2h0dHBzOi8vdm9vc2V5LmNvbS9wcml2YWN5JywgdGFyZ2V0OiAnX2JsYW5rJywgcmVsOiAnbm9vcGVuZXInLCBjbGFzczogJ3YtbGluaycgfSwgJ1ByaXZhY3kgUG9saWN5JyksCiAgICAgICcuJyk7CgogICAgdmFyIGZvcm0gPSBlbCgnZm9ybScsIHsgY2xhc3M6ICd2LWF1dGhfX2Zvcm0nLCBub3ZhbGlkYXRlOiAnJyB9LCBuYW1lRiwgZW1haWxGLCBwd0YsIHN0YXR1cywgYnRuLCBsZWdhbCk7CgogICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBmdW5jdGlvbiAoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHZhciBuYW1lID0gKG5hbWVGLmlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIHZhciBlbWFpbCA9IChlbWFpbEYuaW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTsKICAgICAgdmFyIHB3ID0gcHdGLmlucHV0LnZhbHVlIHx8ICcnOwogICAgICBpZiAoIWlzRW1haWwoZW1haWwpKSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnRW50ZXIgYSB2YWxpZCBlbWFpbC4nLCB0cnVlKTsgZW1haWxGLmlucHV0LmZvY3VzKCk7IHJldHVybjsgfQogICAgICBpZiAocHcubGVuZ3RoIDwgOCB8fCBwdy5sZW5ndGggPiAyNCkgeyBzaG93U3RhdHVzKHN0YXR1cywgJ1Bhc3N3b3JkIG11c3QgYmUgOOKAkzI0IGNoYXJhY3RlcnMuJywgdHJ1ZSk7IHB3Ri5pbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgaWYgKCFWLmF1dGggfHwgdHlwZW9mIFYuYXV0aC5yZWdpc3RlciAhPT0gJ2Z1bmN0aW9uJykgeyBzaG93U3RhdHVzKHN0YXR1cywgJ1NpZ24tdXAgaXMgdW5hdmFpbGFibGUgcmlnaHQgbm93LicsIHRydWUpOyByZXR1cm47IH0KCiAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAnJyk7CiAgICAgIGJ0bi5zZXRMb2FkaW5nKHRydWUsICdDcmVhdGluZ+KApicpOwogICAgICBWLmF1dGgucmVnaXN0ZXIoeyBuYW1lOiBuYW1lLCBlbWFpbDogZW1haWwsIHBhc3N3b3JkOiBwdyB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICB0b2FzdCgnQWNjb3VudCBjcmVhdGVkIOKAlCB3ZWxjb21lIHRvIFZhbXAuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICBsYW5kQWZ0ZXJBdXRoKCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBidG4uc2V0TG9hZGluZyhmYWxzZSk7CiAgICAgICAgdmFyIGNvbmZsaWN0ID0gZXJyICYmIGVyci5zdGF0dXMgPT09IDQwOTsKICAgICAgICBzaG93U3RhdHVzKHN0YXR1cywgY29uZmxpY3QgPyAnVGhhdCBlbWFpbCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuIFRyeSBzaWduaW5nIGluLicgOiAoKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ0NvdWxkIG5vdCBjcmVhdGUgeW91ciBhY2NvdW50LiBQbGVhc2UgdHJ5IGFnYWluLicpLCB0cnVlKTsKICAgICAgfSk7CiAgICB9KTsKICAgIHJldHVybiBmb3JtOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRSZXNldChwcmVmaWxsRW1haWwpIHsKICAgIHZhciBlbWFpbEYgPSBmaWVsZCh7IG5hbWU6ICdlbWFpbCcsIHR5cGU6ICdlbWFpbCcsIGxhYmVsOiAnRW1haWwnLCBwbGFjZWhvbGRlcjogJ3lvdUBzdHVkaW8uY29tJywgYXV0b2NvbXBsZXRlOiAndXNlcm5hbWUnLCBpbnB1dG1vZGU6ICdlbWFpbCcsIGF1dG9jYXBpdGFsaXplOiAnbm9uZScsIHNwZWxsY2hlY2s6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZSwgdmFsdWU6IHByZWZpbGxFbWFpbCB8fCAnJyB9KTsKICAgIHZhciBzdGF0dXMgPSBzdGF0dXNMaW5lKCk7CiAgICB2YXIgc2VuZEJ0biA9IHN1Ym1pdEJ1dHRvbignU2VuZCByZXNldCBjb2RlJyk7CgogICAgdmFyIGNvZGVGID0gZmllbGQoeyBuYW1lOiAnY29kZScsIGxhYmVsOiAnUmVzZXQgY29kZScsIHBsYWNlaG9sZGVyOiAnQ29kZSBmcm9tIHlvdXIgZW1haWwnLCBhdXRvY29tcGxldGU6ICdvbmUtdGltZS1jb2RlJyB9KTsKICAgIHZhciBuZXdQd0YgPSBmaWVsZCh7IG5hbWU6ICduZXdQYXNzd29yZCcsIHR5cGU6ICdwYXNzd29yZCcsIGxhYmVsOiAnTmV3IHBhc3N3b3JkJywgcGxhY2Vob2xkZXI6ICc44oCTMjQgY2hhcmFjdGVycycsIGF1dG9jb21wbGV0ZTogJ25ldy1wYXNzd29yZCcsIG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOiAyNCB9KTsKICAgIHZhciByZXNldEJ0biA9IHN1Ym1pdEJ1dHRvbignU2V0IG5ldyBwYXNzd29yZCcpOwogICAgdmFyIHN0YWdlMiA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19zdGFnZTInLCBoaWRkZW46ICcnIH0sIGNvZGVGLCBuZXdQd0YsIHJlc2V0QnRuKTsKCiAgICB2YXIgZm9ybSA9IGVsKCdmb3JtJywgeyBjbGFzczogJ3YtYXV0aF9fZm9ybScsIG5vdmFsaWRhdGU6ICcnIH0sIGVtYWlsRiwgc2VuZEJ0biwgc3RhZ2UyLCBzdGF0dXMpOwoKICAgIHZhciByZXF1ZXN0ZWQgPSBmYWxzZTsKCiAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgaWYgKCFyZXF1ZXN0ZWQpIHJldHVybiBkb1JlcXVlc3QoKTsKICAgICAgcmV0dXJuIGRvUmVzZXQoKTsKICAgIH0pOwogICAgc2VuZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZG9SZXF1ZXN0KCk7IH0pOwogICAgcmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGRvUmVzZXQoKTsgfSk7CgogICAgZnVuY3Rpb24gZG9SZXF1ZXN0KCkgewogICAgICB2YXIgZW1haWwgPSAoZW1haWxGLmlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIGlmICghaXNFbWFpbChlbWFpbCkpIHsgc2hvd1N0YXR1cyhzdGF0dXMsICdFbnRlciBhIHZhbGlkIGVtYWlsLicsIHRydWUpOyBlbWFpbEYuaW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLnJlcXVlc3RSZXNldCAhPT0gJ2Z1bmN0aW9uJykgeyBzaG93U3RhdHVzKHN0YXR1cywgJ1Bhc3N3b3JkIHJlc2V0IGlzIHVuYXZhaWxhYmxlIHJpZ2h0IG5vdy4nLCB0cnVlKTsgcmV0dXJuOyB9CiAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAnJyk7CiAgICAgIHNlbmRCdG4uc2V0TG9hZGluZyh0cnVlLCAnU2VuZGluZ+KApicpOwogICAgICBWLmFwaS5yZXF1ZXN0UmVzZXQoZW1haWwpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHNlbmRCdG4uc2V0TG9hZGluZyhmYWxzZSk7CiAgICAgICAgcmVxdWVzdGVkID0gdHJ1ZTsKICAgICAgICBzdGFnZTIuaGlkZGVuID0gZmFsc2U7CiAgICAgICAgc2VuZEJ0bi5pbm5lckhUTUwgPSAnJzsgc2VuZEJ0bi5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgdGV4dDogJ1Jlc2VuZCBjb2RlJyB9KSk7CiAgICAgICAgc2hvd1N0YXR1cyhzdGF0dXMsICdDaGVjayB5b3VyIGVtYWlsIGZvciBhIHJlc2V0IGNvZGUuJywgZmFsc2UpOwogICAgICAgIGNvZGVGLmlucHV0LmZvY3VzKCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBzZW5kQnRuLnNldExvYWRpbmcoZmFsc2UpOwogICAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAoZXJyICYmIGVyci5tZXNzYWdlKSB8fCAnQ291bGQgbm90IHNlbmQgYSByZXNldCBjb2RlLiBQbGVhc2UgdHJ5IGFnYWluLicsIHRydWUpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBkb1Jlc2V0KCkgewogICAgICB2YXIgZW1haWwgPSAoZW1haWxGLmlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIHZhciBjb2RlID0gKGNvZGVGLmlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIHZhciBuZXdQdyA9IG5ld1B3Ri5pbnB1dC52YWx1ZSB8fCAnJzsKICAgICAgaWYgKCFjb2RlKSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnRW50ZXIgdGhlIGNvZGUgZnJvbSB5b3VyIGVtYWlsLicsIHRydWUpOyBjb2RlRi5pbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgaWYgKG5ld1B3Lmxlbmd0aCA8IDggfHwgbmV3UHcubGVuZ3RoID4gMjQpIHsgc2hvd1N0YXR1cyhzdGF0dXMsICdQYXNzd29yZCBtdXN0IGJlIDjigJMyNCBjaGFyYWN0ZXJzLicsIHRydWUpOyBuZXdQd0YuaW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLnN1Ym1pdFJlc2V0ICE9PSAnZnVuY3Rpb24nKSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnUGFzc3dvcmQgcmVzZXQgaXMgdW5hdmFpbGFibGUgcmlnaHQgbm93LicsIHRydWUpOyByZXR1cm47IH0KICAgICAgc2hvd1N0YXR1cyhzdGF0dXMsICcnKTsKICAgICAgcmVzZXRCdG4uc2V0TG9hZGluZyh0cnVlLCAnVXBkYXRpbmfigKYnKTsKICAgICAgVi5hcGkuc3VibWl0UmVzZXQoZW1haWwsIGNvZGUsIG5ld1B3KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICB0b2FzdCgnUGFzc3dvcmQgdXBkYXRlZCDigJQgeW91IGNhbiBzaWduIGluIG5vdy4nLCAnc3VjY2VzcycpOwogICAgICAgIHNldE1vZGUoJ3NpZ25pbicsIGVtYWlsKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgIHJlc2V0QnRuLnNldExvYWRpbmcoZmFsc2UpOwogICAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAoZXJyICYmIGVyci5tZXNzYWdlKSB8fCAnVGhhdCBjb2RlIGRpZG7igJl0IHdvcmsuIFJlcXVlc3QgYSBuZXcgb25lIGFuZCB0cnkgYWdhaW4uJywgdHJ1ZSk7CiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiBmb3JtOwogIH0KCiAgZnVuY3Rpb24gc2V0TW9kZShtb2RlLCBjYXJyeUVtYWlsKSB7CiAgICBfbW9kZSA9IG1vZGU7CiAgICBpZiAoX3Jvb3QpIHBhaW50KGNhcnJ5RW1haWwpOwogIH0KCiAgZnVuY3Rpb24gcGFpbnQoY2FycnlFbWFpbCkgewogICAgdmFyIHJvb3QgPSBfcm9vdDsKICAgIGlmICghcm9vdCkgcmV0dXJuOwogICAgc3RvcFZpZGVvKCk7CiAgICByb290LmlubmVySFRNTCA9ICcnOwoKICAgIHZhciBzdGFnZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoJyB9KTsKICAgIGJ1aWxkQmFja2dyb3VuZChzdGFnZSk7CgogICAgdmFyIGNhcmQgPSBlbCgnc2VjdGlvbicsIHsgY2xhc3M6ICd2LWF1dGhfX2NhcmQgZ2xhc3MtY2FyZCcsIHJvbGU6ICdmb3JtJywgJ2FyaWEtbGFiZWwnOiAnU2lnbiBpbiB0byBWYW1wJyB9KTsKCiAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19icmFuZCcgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWF1dGhfX2xvZ28gdi1ncmFkaWVudCcsIHRleHQ6ICdWQU1QJyB9KSwKICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1hdXRoX190YWdsaW5lJywgdGV4dDogJ1N0YWdlLCByZXN0eWxlLCBhbmQgcmVpbWFnaW5lIGFueSBzcGFjZS4nIH0pCiAgICApKTsKCiAgICBpZiAoX21vZGUgIT09ICdyZXNldCcpIHsKICAgICAgdmFyIHRhYnMgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtYXV0aF9fdGFicycsIHJvbGU6ICd0YWJsaXN0JyB9KTsKICAgICAgdGFicy5hcHBlbmRDaGlsZCh0YWJCdG4oJ1NpZ24gaW4nLCAnc2lnbmluJykpOwogICAgICB0YWJzLmFwcGVuZENoaWxkKHRhYkJ0bignQ3JlYXRlIGFjY291bnQnLCAncmVnaXN0ZXInKSk7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQodGFicyk7CiAgICB9IGVsc2UgewogICAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19yZXNldGhlYWQnIH0sCiAgICAgICAgZWwoJ2gyJywgeyBjbGFzczogJ3YtYXV0aF9fdGl0bGUnLCB0ZXh0OiAnUmVzZXQgcGFzc3dvcmQnIH0pLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtYXV0aF9fc3ViJywgdGV4dDogJ0VudGVyIHlvdXIgZW1haWwgYW5kIHdl4oCZbGwgc2VuZCBhIHJlc2V0IGNvZGUuJyB9KQogICAgICApKTsKICAgIH0KCiAgICB2YXIgYm9keTsKICAgIGlmIChfbW9kZSA9PT0gJ3JlZ2lzdGVyJykgYm9keSA9IGJ1aWxkUmVnaXN0ZXIoKTsKICAgIGVsc2UgaWYgKF9tb2RlID09PSAncmVzZXQnKSBib2R5ID0gYnVpbGRSZXNldChjYXJyeUVtYWlsKTsKICAgIGVsc2UgYm9keSA9IGJ1aWxkU2lnbkluKCk7CiAgICBjYXJkLmFwcGVuZENoaWxkKGJvZHkpOwoKICAgIGlmIChfbW9kZSA9PT0gJ3Jlc2V0JykgewogICAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19mb290JyB9LAogICAgICAgIGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtbGluaycsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgc2V0TW9kZSgnc2lnbmluJywgY2FycnlFbWFpbCk7IH0gfSwgJ+KGkCBCYWNrIHRvIHNpZ24gaW4nKSkpOwogICAgfQoKICAgIHN0YWdlLmFwcGVuZENoaWxkKGNhcmQpOwogICAgcm9vdC5hcHBlbmRDaGlsZChzdGFnZSk7CgogICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICB2YXIgZmlyc3QgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7CiAgICAgIGlmIChmaXJzdCkgeyB0cnkgeyBmaXJzdC5mb2N1cygpOyB9IGNhdGNoIChlKSB7fSB9CiAgICB9LCA0MCk7CiAgfQoKICBmdW5jdGlvbiB0YWJCdG4obGFiZWwsIG1vZGUpIHsKICAgIHZhciBhY3RpdmUgPSBfbW9kZSA9PT0gbW9kZTsKICAgIHZhciBidG4gPSBlbCgnYnV0dG9uJywgewogICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgcm9sZTogJ3RhYicsCiAgICAgIGNsYXNzOiAndi1hdXRoX190YWInICsgKGFjdGl2ZSA/ICcgdi1hdXRoX190YWItLWFjdGl2ZScgOiAnJyksCiAgICAgICdhcmlhLXNlbGVjdGVkJzogYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJwogICAgfSwgbGFiZWwpOwogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBpZiAoX21vZGUgIT09IG1vZGUpIHNldE1vZGUobW9kZSk7IH0pOwogICAgcmV0dXJuIGJ0bjsKICB9CgogIGZ1bmN0aW9uIHN0b3BWaWRlbygpIHsKICAgIGlmICghX3ZpZGVvKSByZXR1cm47CiAgICB0cnkgeyBfdmlkZW8ucGF1c2UoKTsgfSBjYXRjaCAoZSkge30KICAgIHRyeSB7IF92aWRlby5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpOyBfdmlkZW8ubG9hZCgpOyB9IGNhdGNoIChlMikge30KICAgIF92aWRlbyA9IG51bGw7CiAgfQoKICBWLnZpZXdzLmF1dGggPSB7CiAgICByZW5kZXI6IGZ1bmN0aW9uIChyb290LCBwYXJhbXMpIHsKICAgICAgX3Jvb3QgPSByb290OwogICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307CiAgICAgIF9uZXh0ID0gcGFyYW1zLm5leHQgPyBTdHJpbmcocGFyYW1zLm5leHQpIDogbnVsbDsKICAgICAgdmFyIG0gPSAocGFyYW1zLm1vZGUgfHwgJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTsKICAgICAgX21vZGUgPSAobSA9PT0gJ3JlZ2lzdGVyJyB8fCBtID09PSAncmVzZXQnIHx8IG0gPT09ICdzaWduaW4nKSA/IG0gOiAnc2lnbmluJzsKICAgICAgcm9vdC5jbGFzc0xpc3QgJiYgcm9vdC5jbGFzc0xpc3QuYWRkKCd2LXZpZXctYXV0aCcpOwogICAgICBwYWludChwYXJhbXMuZW1haWwgfHwgJycpOwogICAgfSwKICAgIHRlYXJkb3duOiBmdW5jdGlvbiAoKSB7CiAgICAgIHN0b3BWaWRlbygpOwogICAgICBfcm9vdCA9IG51bGw7CiAgICAgIF9tb2RlID0gJ3NpZ25pbic7CiAgICAgIF9uZXh0ID0gbnVsbDsKICAgIH0KICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9hcHAuanMgPT09PT0gKi8KKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwoKICB2YXIgREVGQVVMVF9ST1VURSA9ICdjcmVhdGUnOwoKICB2YXIgUFVCTElDX1JPVVRFUyA9IHsgYXV0aDogdHJ1ZSB9OwoKICB2YXIgUk9VVEVfVklFVyA9IHsKICAgIGNyZWF0ZTogJ2NyZWF0ZScsCiAgICBsaWJyYXJ5OiAnbGlicmFyeScsCiAgICBpbnNwaXJhdGlvbjogJ2ZlZWQnLAogICAgZmVlZDogJ2ZlZWQnLAogICAgc2V0dGluZ3M6ICdzZXR0aW5ncycsCiAgICBhY2NvdW50OiAnYWNjb3VudCcsCiAgICBwYXl3YWxsOiAncGF5d2FsbCcsCiAgICByZWZlcnJhbDogJ3JlZmVycmFsJywKICAgIGNoYWxsZW5nZTogJ2NoYWxsZW5nZScsCiAgICBvbmJvYXJkaW5nOiAnb25ib2FyZGluZycsCiAgICBhdXRoOiAnYXV0aCcKICB9OwoKICB2YXIgTkFWX0lURU1TID0gWwogICAgeyByb3V0ZTogJ2NyZWF0ZScsIGxhYmVsOiAnQ3JlYXRlJywgaWNvbjogJ3NwYXJrbGVzJyB9LAogICAgeyByb3V0ZTogJ2luc3BpcmF0aW9uJywgbGFiZWw6ICdFeHBsb3JlJywgaWNvbjogJ2dyaWQnIH0sCiAgICB7IHJvdXRlOiAnbGlicmFyeScsIGxhYmVsOiAnTGlicmFyeScsIGljb246ICdwaG90b1N0YWNrJyB9CiAgXTsKCiAgdmFyIGFwcFJvb3QgPSBudWxsOwogIHZhciBvdXRsZXRFbCA9IG51bGw7CiAgdmFyIHRvcGJhckVsID0gbnVsbDsKICB2YXIgYm90dG9tYmFyRWwgPSBudWxsOwogIHZhciBkcmF3ZXJFbCA9IG51bGw7CiAgdmFyIGRyYXdlclNjcmltRWwgPSBudWxsOwogIHZhciBvdmVybGF5SG9zdEVsID0gbnVsbDsKCiAgdmFyIGN1cnJlbnRCYXNlVmlldyA9IG51bGw7CiAgdmFyIGN1cnJlbnRPdmVybGF5VmlldyA9IG51bGw7CiAgdmFyIGxhc3RGb2N1c0JlZm9yZURyYXdlciA9IG51bGw7CiAgdmFyIGJvb3RpbmcgPSB0cnVlOwogIHZhciBuYXZpZ2F0aW5nID0gZmFsc2U7CgogIGZ1bmN0aW9uIHNhZmVVdGlsKCkgewogICAgcmV0dXJuIFYudXRpbCAmJiB0eXBlb2YgVi51dGlsID09PSAnb2JqZWN0JyA/IFYudXRpbCA6IHt9OwogIH0KCiAgZnVuY3Rpb24gZWwodGFnLCBhdHRycykgewogICAgdmFyIGNoaWxkcmVuID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBWLnVpLmVsLmFwcGx5KG51bGwsIFt0YWcsIGF0dHJzXS5jb25jYXQoY2hpbGRyZW4pKTsKICAgIH0KICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgaWYgKGF0dHJzKSB7CiAgICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgaykpIGNvbnRpbnVlOwogICAgICAgIHZhciB2YWwgPSBhdHRyc1trXTsKICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZSkgY29udGludWU7CiAgICAgICAgaWYgKGsgPT09ICdjbGFzcycgfHwgayA9PT0gJ2NsYXNzTmFtZScpIG5vZGUuY2xhc3NOYW1lID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICd0ZXh0Jykgbm9kZS50ZXh0Q29udGVudCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAnaHRtbCcpIG5vZGUuaW5uZXJIVE1MID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICdzdHlsZScgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgIGZvciAodmFyIHMgaW4gdmFsKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbCwgcykpIG5vZGUuc3R5bGVbc10gPSB2YWxbc107CiAgICAgICAgfSBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGsuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgdmFsKTsKICAgICAgICB9IGVsc2UgaWYgKGsuaW5kZXhPZignZGF0YS0nKSA9PT0gMCB8fCBrLmluZGV4T2YoJ2FyaWEtJykgPT09IDApIHsKICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRyeSB7IG5vZGVba10gPSB2YWw7IH0gY2F0Y2ggKGUpIHsgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdmFsKTsgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXBwZW5kQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW4pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiBhcHBlbmRDaGlsZHJlbihub2RlLCBjaGlsZHJlbikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldOwogICAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlKSBjb250aW51ZTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHsgYXBwZW5kQ2hpbGRyZW4obm9kZSwgYyk7IGNvbnRpbnVlOyB9CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoYy5ub2RlVHlwZSA/IGMgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGljb24obmFtZSkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaWNvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgciA9IFYudWkuaWNvbihuYW1lKTsKICAgICAgaWYgKHIgJiYgci5ub2RlVHlwZSkgcmV0dXJuIHI7CiAgICAgIGlmICh0eXBlb2YgciA9PT0gJ3N0cmluZycpIHsKICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICBzcGFuLmNsYXNzTmFtZSA9ICd2LWljbyc7CiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICBzcGFuLmlubmVySFRNTCA9IHI7CiAgICAgICAgcmV0dXJuIHNwYW47CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxsYmFja0ljb24obmFtZSk7CiAgfQoKICBmdW5jdGlvbiBmYWxsYmFja0ljb24obmFtZSkgewogICAgdmFyIHBhdGhzID0gewogICAgICBzcGFya2xlczoKICAgICAgICAnPHBhdGggZD0iTTEyIDNsMS42IDQuNEwxOCA5bC00LjQgMS42TDEyIDE1bC0xLjYtNC40TDYgOWw0LjQtMS42TDEyIDN6Ii8+PHBhdGggZD0iTTE5IDE0bC44IDIuMkwyMiAxN2wtMi4yLjhMMTkgMjBsLS44LTIuMkwxNiAxN2wyLjItLjhMMTkgMTR6Ii8+JywKICAgICAgcGhvdG9TdGFjazoKICAgICAgICAnPHJlY3QgeD0iMyIgeT0iNiIgd2lkdGg9IjE4IiBoZWlnaHQ9IjEzIiByeD0iMiIvPjxwYXRoIGQ9Ik0zIDE2bDQuNS00IDQgMy41TDE1IDExbDYgNSIvPjxjaXJjbGUgY3g9IjkiIGN5PSIxMC41IiByPSIxLjQiLz48cGF0aCBkPSJNNiAzLjVoMTIiLz4nLAogICAgICBtZW51OiAnPHBhdGggZD0iTTQgN2gxNk00IDEyaDE2TTQgMTdoMTYiLz4nLAogICAgICBjbG9zZTogJzxwYXRoIGQ9Ik02IDZsMTIgMTJNMTggNkw2IDE4Ii8+JywKICAgICAgYm9sdDogJzxwYXRoIGQ9Ik0xMyAyTDQuNSAxM0gxMWwtMSA5IDguNS0xMUgxMmwxLTl6Ii8+JywKICAgICAgY3JlZGl0czogJzxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjkiLz48cGF0aCBkPSJNMTUgOS41YTMgMyAwIDAgMC02IC41YzAgMyA2IDEuNSA2IDQuNWEzIDMgMCAwIDEtNiAuNSIvPjxwYXRoIGQ9Ik0xMiA2LjV2MTEiLz4nCiAgICB9OwogICAgdmFyIGQgPSBwYXRoc1tuYW1lXSB8fCBwYXRocy5zcGFya2xlczsKICAgIHZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgc3Bhbi5jbGFzc05hbWUgPSAndi1pY28nOwogICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIHNwYW4uaW5uZXJIVE1MID0KICAgICAgJzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiAnICsKICAgICAgJ3N0cm9rZS13aWR0aD0iMS43IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPicgKyBkICsgJzwvc3ZnPic7CiAgICByZXR1cm4gc3BhbjsKICB9CgogIGZ1bmN0aW9uIHRvYXN0KG1zZywga2luZCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkudG9hc3QgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgVi51aS50b2FzdChtc2csIGtpbmQpOyByZXR1cm47IH0gY2F0Y2ggKGUpIHt9IH0KICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLnRvYXN0ID09PSAnZnVuY3Rpb24nKSB7IFYuc3RvcmUudG9hc3QobXNnLCBraW5kKTsgcmV0dXJuOyB9CiAgICBpZiAod2luZG93LmNvbnNvbGUpIGNvbnNvbGUubG9nKCdbdG9hc3RdJywga2luZCB8fCAnaW5mbycsIG1zZyk7CiAgfQoKICBmdW5jdGlvbiBlc2NhcGVIdG1sKHMpIHsKICAgIHZhciB1ID0gc2FmZVV0aWwoKTsKICAgIGlmICh0eXBlb2YgdS5lc2NhcGVIdG1sID09PSAnZnVuY3Rpb24nKSByZXR1cm4gdS5lc2NhcGVIdG1sKHMpOwogICAgcmV0dXJuIFN0cmluZyhzID09IG51bGwgPyAnJyA6IHMpLnJlcGxhY2UoL1smPD4iJ10vZywgZnVuY3Rpb24gKGMpIHsKICAgICAgcmV0dXJuIHsgJyYnOiAnJmFtcDsnLCAnPCc6ICcmbHQ7JywgJz4nOiAnJmd0OycsICciJzogJyZxdW90OycsICInIjogJyYjMzk7JyB9W2NdOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBwYXJzZShoYXNoU3RyKSB7CiAgICB2YXIgcmF3ID0gaGFzaFN0ciAhPSBudWxsID8gU3RyaW5nKGhhc2hTdHIpIDogKHdpbmRvdy5sb2NhdGlvbi5oYXNoIHx8ICcnKTsKICAgIHZhciBoID0gcmF3LmNoYXJBdCgwKSA9PT0gJyMnID8gcmF3LnNsaWNlKDEpIDogcmF3OwogICAgaWYgKGguY2hhckF0KDApID09PSAnLycpIGggPSBoLnNsaWNlKDEpOwoKICAgIHZhciBxSW5kZXggPSBoLmluZGV4T2YoJz8nKTsKICAgIHZhciBwYXRoUGFydCA9IHFJbmRleCA9PT0gLTEgPyBoIDogaC5zbGljZSgwLCBxSW5kZXgpOwogICAgdmFyIHF1ZXJ5UGFydCA9IHFJbmRleCA9PT0gLTEgPyAnJyA6IGguc2xpY2UocUluZGV4ICsgMSk7CgogICAgdmFyIHNlZ21lbnRzID0gcGF0aFBhcnQuc3BsaXQoJy8nKS5maWx0ZXIoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMubGVuZ3RoID4gMDsgfSk7CiAgICB2YXIgcm91dGUgPSBzZWdtZW50cy5sZW5ndGggPyBkZWNvZGVVUklDb21wb25lbnQoc2VnbWVudHNbMF0pIDogREVGQVVMVF9ST1VURTsKICAgIGlmICghcm91dGUpIHJvdXRlID0gREVGQVVMVF9ST1VURTsKCiAgICB2YXIgcGFyYW1zID0gcGFyc2VRdWVyeShxdWVyeVBhcnQpOwoKICAgIGlmIChyb3V0ZSA9PT0gJ2ltYWdlJykgewogICAgICBwYXJhbXMuaWQgPSBzZWdtZW50c1sxXSA/IGRlY29kZVVSSUNvbXBvbmVudChzZWdtZW50c1sxXSkgOiBwYXJhbXMuaWQgfHwgJyc7CiAgICAgIHBhcmFtcy5fX292ZXJsYXkgPSAnc3R1ZGlvJzsKICAgIH0gZWxzZSBpZiAocm91dGUgPT09ICdpbnNwaXJhdGlvbicgfHwgcm91dGUgPT09ICdmZWVkJykgewogICAgICBpZiAoc2VnbWVudHNbMV0pIHBhcmFtcy5pZCA9IGRlY29kZVVSSUNvbXBvbmVudChzZWdtZW50c1sxXSk7CiAgICB9IGVsc2UgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgaWYgKHBhcmFtcy5pZCA9PSBudWxsKSBwYXJhbXMuaWQgPSBkZWNvZGVVUklDb21wb25lbnQoc2VnbWVudHNbMV0pOwogICAgfQoKICAgIHJldHVybiB7IHJvdXRlOiByb3V0ZSwgcGFyYW1zOiBwYXJhbXMsIHNlZ21lbnRzOiBzZWdtZW50cywgcGF0aDogcGF0aFBhcnQgfTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlUXVlcnkocXVlcnlQYXJ0KSB7CiAgICB2YXIgdSA9IHNhZmVVdGlsKCk7CiAgICBpZiAodHlwZW9mIHUucXMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcGFyc2VkID0gdS5xcygnIy9fPycgKyAocXVlcnlQYXJ0IHx8ICcnKSk7CiAgICAgICAgaWYgKHBhcnNlZCAmJiBwYXJzZWQucGFyYW1zICYmIHR5cGVvZiBwYXJzZWQucGFyYW1zID09PSAnb2JqZWN0JykgcmV0dXJuIHBhcnNlZC5wYXJhbXM7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9CiAgICB2YXIgb3V0ID0ge307CiAgICBpZiAoIXF1ZXJ5UGFydCkgcmV0dXJuIG91dDsKICAgIHZhciBwYWlycyA9IHF1ZXJ5UGFydC5zcGxpdCgnJicpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIXBhaXJzW2ldKSBjb250aW51ZTsKICAgICAgdmFyIGVxID0gcGFpcnNbaV0uaW5kZXhPZignPScpOwogICAgICB2YXIga2V5ID0gZXEgPT09IC0xID8gcGFpcnNbaV0gOiBwYWlyc1tpXS5zbGljZSgwLCBlcSk7CiAgICAgIHZhciB2YWwgPSBlcSA9PT0gLTEgPyAnJyA6IHBhaXJzW2ldLnNsaWNlKGVxICsgMSk7CiAgICAgIHRyeSB7IGtleSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXkucmVwbGFjZSgvXCsvZywgJyAnKSk7IH0gY2F0Y2ggKGUyKSB7fQogICAgICB0cnkgeyB2YWwgPSBkZWNvZGVVUklDb21wb25lbnQodmFsLnJlcGxhY2UoL1wrL2csICcgJykpOyB9IGNhdGNoIChlMykge30KICAgICAgaWYgKGtleSkgb3V0W2tleV0gPSB2YWw7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KCiAgZnVuY3Rpb24gY3VycmVudCgpIHsKICAgIHJldHVybiBwYXJzZSh3aW5kb3cubG9jYXRpb24uaGFzaCk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICB2YXIgdGFyZ2V0ID0gbm9ybWFsaXplSGFzaChoYXNoKTsKICAgIHZhciBjdXIgPSB3aW5kb3cubG9jYXRpb24uaGFzaCB8fCAnJzsKICAgIHZhciBjdXJOb3JtID0gbm9ybWFsaXplSGFzaChjdXIpOwogICAgaWYgKGN1ck5vcm0gPT09IHRhcmdldCkgewogICAgICBoYW5kbGVSb3V0ZSgpOwogICAgfSBlbHNlIHsKICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSB0YXJnZXQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBub3JtYWxpemVIYXNoKGhhc2gpIHsKICAgIHZhciBzID0gaGFzaCA9PSBudWxsID8gJycgOiBTdHJpbmcoaGFzaCk7CiAgICBpZiAoIXMpIHJldHVybiAnIy8nICsgREVGQVVMVF9ST1VURTsKICAgIGlmIChzLmNoYXJBdCgwKSA9PT0gJyMnKSBzID0gcy5zbGljZSgxKTsKICAgIGlmIChzLmNoYXJBdCgwKSAhPT0gJy8nKSBzID0gJy8nICsgczsKICAgIHJldHVybiAnIycgKyBzOwogIH0KCiAgVi5yb3V0ZXIgPSBPYmplY3QuYXNzaWduKFYucm91dGVyIHx8IHt9LCB7CiAgICBnbzogZ28sCiAgICBjdXJyZW50OiBjdXJyZW50LAogICAgcGFyc2U6IHBhcnNlCiAgfSk7CgogIGZ1bmN0aW9uIGJvb3QoKSB7CiAgICBhcHBSb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbXAtYXBwJyk7CiAgICBpZiAoIWFwcFJvb3QpIHsKICAgICAgYXBwUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBhcHBSb290LmlkID0gJ3ZhbXAtYXBwJzsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhcHBSb290KTsKICAgIH0KICAgIGFwcFJvb3QuY2xhc3NMaXN0LmFkZCgndi1hcHAnKTsKCiAgICB0cnkgeyBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5sb2FkID09PSAnZnVuY3Rpb24nKSBWLnN0b3JlLmxvYWQoKTsgfSBjYXRjaCAoZSkge30KCiAgICBhcHBseVRoZW1lKCk7CgogICAgYnVpbGRDaHJvbWUoKTsKICAgIHNob3dCb290TG9hZGVyKCk7CgogICAgd2lyZVN0b3JlRXZlbnRzKCk7CiAgICB3aXJlR2xvYmFsSGFuZGxlcnMoKTsKCiAgICBjYXB0dXJlR2xvYmFsSW50ZW50cygpOwoKICAgIHZhciBib290UCA9CiAgICAgIFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLmJvb3RzdHJhcCA9PT0gJ2Z1bmN0aW9uJwogICAgICAgID8gVi5hdXRoLmJvb3RzdHJhcCgpCiAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwoKICAgIGJvb3RQCiAgICAgIC50aGVuKGZ1bmN0aW9uIChhdXRoZWQpIHsKICAgICAgICBmaW5pc2hCb290KCEhYXV0aGVkKTsKICAgICAgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICBmaW5pc2hCb290KFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLmlzQXV0aGVkID09PSAnZnVuY3Rpb24nID8gVi5hdXRoLmlzQXV0aGVkKCkgOiBmYWxzZSk7CiAgICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZmluaXNoQm9vdChhdXRoZWQpIHsKICAgIGJvb3RpbmcgPSBmYWxzZTsKICAgIHRyeSB7IGlmIChWLnN0b3JlKSBWLnN0b3JlLnNldCgnYm9vdGVkJywgdHJ1ZSk7IH0gY2F0Y2ggKGUpIHt9CgogICAgdmFyIGRlc2MgPSBjdXJyZW50KCk7CiAgICB2YXIgcm91dGUgPSBkZXNjLnJvdXRlOwoKICAgIGlmICghYXV0aGVkICYmICFQVUJMSUNfUk9VVEVTW3JvdXRlXSkgewogICAgICByZXBsYWNlSGFzaCgnIy9hdXRoJyk7CiAgICB9IGVsc2UgaWYgKGF1dGhlZCAmJiByb3V0ZSA9PT0gJ2F1dGgnKSB7CiAgICAgIHJlcGxhY2VIYXNoKGxhbmRpbmdIYXNoKCkpOwogICAgfSBlbHNlIGlmIChhdXRoZWQgJiYgbmVlZHNPbmJvYXJkaW5nKCkgJiYgcm91dGUgIT09ICdvbmJvYXJkaW5nJyAmJiByb3V0ZSAhPT0gJ2F1dGgnKSB7CiAgICAgIHJlcGxhY2VIYXNoKCcjL29uYm9hcmRpbmcnKTsKICAgIH0gZWxzZSBpZiAoIWRlc2MucGF0aCB8fCByb3V0ZSA9PT0gJycpIHsKICAgICAgcmVwbGFjZUhhc2goJyMvJyArIERFRkFVTFRfUk9VVEUpOwogICAgfQoKICAgIGhhbmRsZVJvdXRlKCk7CgogICAgZmx1c2hHbG9iYWxJbnRlbnRzKGF1dGhlZCk7CiAgfQoKICBmdW5jdGlvbiBsYW5kaW5nSGFzaCgpIHsKICAgIHJldHVybiBuZWVkc09uYm9hcmRpbmcoKSA/ICcjL29uYm9hcmRpbmcnIDogJyMvJyArIERFRkFVTFRfUk9VVEU7CiAgfQoKICBmdW5jdGlvbiBuZWVkc09uYm9hcmRpbmcoKSB7CiAgICByZXR1cm4gIShWLnN0YXRlICYmIFYuc3RhdGUub25ib2FyZGluZ0RvbmUgPT09IHRydWUpOwogIH0KCiAgZnVuY3Rpb24gcmVwbGFjZUhhc2goaGFzaCkgewogICAgdmFyIHRhcmdldCA9IG5vcm1hbGl6ZUhhc2goaGFzaCk7CiAgICB0cnkgewogICAgICB2YXIgYmFzZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCcjJylbMF07CiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgYmFzZSArIHRhcmdldCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gdGFyZ2V0OwogICAgfQogIH0KCiAgZnVuY3Rpb24gaGFuZGxlUm91dGUoKSB7CiAgICBpZiAoYm9vdGluZyB8fCBuYXZpZ2F0aW5nKSByZXR1cm47CiAgICBuYXZpZ2F0aW5nID0gdHJ1ZTsKICAgIHRyeSB7CiAgICAgIHZhciBkZXNjID0gY3VycmVudCgpOwogICAgICB2YXIgcm91dGUgPSBkZXNjLnJvdXRlOwogICAgICB2YXIgcGFyYW1zID0gZGVzYy5wYXJhbXMgfHwge307CgogICAgICB2YXIgYXV0aGVkID0gVi5hdXRoICYmIHR5cGVvZiBWLmF1dGguaXNBdXRoZWQgPT09ICdmdW5jdGlvbicgPyBWLmF1dGguaXNBdXRoZWQoKSA6IGZhbHNlOwoKICAgICAgaWYgKCFhdXRoZWQgJiYgIVBVQkxJQ19ST1VURVNbcm91dGVdKSB7CiAgICAgICAgcmVwbGFjZUhhc2goJyMvYXV0aCcpOwogICAgICAgIG1vdW50QmFzZVZpZXcoJ2F1dGgnLCBjdXJyZW50KCkucGFyYW1zKTsKICAgICAgICBzeW5jQ2hyb21lKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChhdXRoZWQgJiYgcm91dGUgPT09ICdhdXRoJykgewogICAgICAgIHJlcGxhY2VIYXNoKGxhbmRpbmdIYXNoKCkpOwogICAgICAgIHZhciBsZCA9IGN1cnJlbnQoKTsKICAgICAgICBtb3VudEJhc2VWaWV3KGxkLnJvdXRlLCBsZC5wYXJhbXMpOwogICAgICAgIHN5bmNDaHJvbWUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGF1dGhlZCAmJiBuZWVkc09uYm9hcmRpbmcoKSAmJiByb3V0ZSAhPT0gJ29uYm9hcmRpbmcnKSB7CiAgICAgICAgcmVwbGFjZUhhc2goJyMvb25ib2FyZGluZycpOwogICAgICAgIG1vdW50QmFzZVZpZXcoJ29uYm9hcmRpbmcnLCB7fSk7CiAgICAgICAgc3luY0Nocm9tZSgpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgaWYgKHJvdXRlID09PSAnaW1hZ2UnKSB7CiAgICAgICAgaWYgKCFjdXJyZW50QmFzZVZpZXcpIHsKICAgICAgICAgIG1vdW50QmFzZVZpZXcoJ2xpYnJhcnknLCB7fSk7CiAgICAgICAgfQogICAgICAgIG1vdW50T3ZlcmxheSgnc3R1ZGlvJywgcGFyYW1zKTsKICAgICAgICBzeW5jQ2hyb21lKCk7CiAgICAgICAgc2V0Um91dGVTdGF0ZShyb3V0ZSwgcGFyYW1zKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmIChjdXJyZW50T3ZlcmxheVZpZXcpIGRpc21pc3NPdmVybGF5KCk7CgogICAgICB2YXIgdmlld05hbWUgPSBST1VURV9WSUVXW3JvdXRlXTsKICAgICAgaWYgKCF2aWV3TmFtZSB8fCAhVi52aWV3c1t2aWV3TmFtZV0gfHwgdHlwZW9mIFYudmlld3Nbdmlld05hbWVdLnJlbmRlciAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIG1vdW50Tm90Rm91bmQocm91dGUpOwogICAgICB9IGVsc2UgewogICAgICAgIG1vdW50QmFzZVZpZXcodmlld05hbWUsIHBhcmFtcyk7CiAgICAgIH0KCiAgICAgIGlmIChyb3V0ZSAhPT0gJ2FjY291bnQnKSBjbG9zZURyYXdlcigpOwoKICAgICAgc3luY0Nocm9tZSgpOwogICAgICBzZXRSb3V0ZVN0YXRlKHJvdXRlLCBwYXJhbXMpOwogICAgfSBmaW5hbGx5IHsKICAgICAgbmF2aWdhdGluZyA9IGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gc2V0Um91dGVTdGF0ZShyb3V0ZSwgcGFyYW1zKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdG9yZSkgewogICAgICAgIGlmIChWLnN0YXRlKSBWLnN0YXRlLnByZXZpb3VzUm91dGUgPSBWLnN0YXRlLnJvdXRlOwogICAgICAgIFYuc3RvcmUuc2V0KCdyb3V0ZScsIHJvdXRlKTsKICAgICAgICBWLnN0b3JlLnNldCgncGFyYW1zJywgcGFyYW1zIHx8IHt9KTsKICAgICAgfQogICAgfSBjYXRjaCAoZSkge30KICB9CgogIGZ1bmN0aW9uIG1vdW50QmFzZVZpZXcodmlld05hbWUsIHBhcmFtcykgewogICAgaWYgKCFvdXRsZXRFbCkgcmV0dXJuOwogICAgdmFyIHZpZXcgPSBWLnZpZXdzW3ZpZXdOYW1lXTsKICAgIGlmICghdmlldyB8fCB0eXBlb2Ygdmlldy5yZW5kZXIgIT09ICdmdW5jdGlvbicpIHsKICAgICAgbW91bnROb3RGb3VuZCh2aWV3TmFtZSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoY3VycmVudEJhc2VWaWV3ICYmIGN1cnJlbnRCYXNlVmlldyAhPT0gdmlld05hbWUpIHsKICAgICAgdmFyIHByZXYgPSBWLnZpZXdzW2N1cnJlbnRCYXNlVmlld107CiAgICAgIGlmIChwcmV2ICYmIHR5cGVvZiBwcmV2LnRlYXJkb3duID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdHJ5IHsgcHJldi50ZWFyZG93bigpOyB9IGNhdGNoIChlKSB7IGlmICh3aW5kb3cuY29uc29sZSkgY29uc29sZS5lcnJvcihlKTsgfQogICAgICB9CiAgICB9CgogICAgdmFyIHN3YXBwaW5nID0gY3VycmVudEJhc2VWaWV3ICE9PSB2aWV3TmFtZTsKICAgIGN1cnJlbnRCYXNlVmlldyA9IHZpZXdOYW1lOwoKICAgIHZhciBhbmltYXRlID0gc3dhcHBpbmcgJiYgIXByZWZlcnNSZWR1Y2VkTW90aW9uKCk7CiAgICB2YXIgZG9SZW5kZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmlldy5yZW5kZXIob3V0bGV0RWwsIHBhcmFtcyB8fCB7fSk7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIHJlbmRlclZpZXdFcnJvcihvdXRsZXRFbCwgdmlld05hbWUsIGVycik7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmVycm9yKCdbVi5yb3V0ZXJdIHZpZXcgIicgKyB2aWV3TmFtZSArICciIHJlbmRlciBmYWlsZWQ6JywgZXJyKTsKICAgICAgfQogICAgICBvdXRsZXRFbC5pZCA9ICd2LW91dGxldCc7CiAgICAgIGlmICghb3V0bGV0RWwuY2xhc3NMaXN0LmNvbnRhaW5zKCd2LW91dGxldCcpKSBvdXRsZXRFbC5jbGFzc0xpc3QuYWRkKCd2LW91dGxldCcpOwogICAgICB0cnkgeyBvdXRsZXRFbC5zY3JvbGxUb3AgPSAwOyB9IGNhdGNoIChlKSB7fQogICAgICBpZiAoYW5pbWF0ZSkgewogICAgICAgIG91dGxldEVsLmNsYXNzTGlzdC5yZW1vdmUoJ3Ytb3V0bGV0LS1sZWF2aW5nJyk7CiAgICAgICAgdm9pZCBvdXRsZXRFbC5vZmZzZXRXaWR0aDsKICAgICAgICBvdXRsZXRFbC5jbGFzc0xpc3QuYWRkKCd2LW91dGxldC0tZW50ZXJpbmcnKTsKICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBvdXRsZXRFbC5jbGFzc0xpc3QucmVtb3ZlKCd2LW91dGxldC0tZW50ZXJpbmcnKTsKICAgICAgICB9LCAyNDApOwogICAgICB9CiAgICB9OwoKICAgIGlmIChhbmltYXRlKSB7CiAgICAgIG91dGxldEVsLmNsYXNzTGlzdC5hZGQoJ3Ytb3V0bGV0LS1sZWF2aW5nJyk7CiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGRvUmVuZGVyLCA5MCk7CiAgICB9IGVsc2UgewogICAgICBkb1JlbmRlcigpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVuZGVyVmlld0Vycm9yKGhvc3QsIHZpZXdOYW1lLCBlcnIpIHsKICAgIGlmICghaG9zdCkgcmV0dXJuOwogICAgaG9zdC5pbm5lckhUTUwgPSAnJzsKICAgIHZhciBtc2cgPSAoZXJyICYmIGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogJ1RoaXMgc2NyZWVuIGZhaWxlZCB0byBsb2FkLic7CiAgICB2YXIgYm94ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5IHYtZW1wdHktLWVycm9yJywgcm9sZTogJ2FsZXJ0JyB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHlfX2ljb24nIH0sIGljb24oJ2JvbHQnKSksCiAgICAgIGVsKCdoMycsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScgfSwgJ1NvbWV0aGluZyB3ZW50IHdyb25nJyksCiAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZW1wdHlfX21zZycgfSwgZXNjYXBlSHRtbChtc2cpKSwKICAgICAgZWwoJ2J1dHRvbicsIHsKICAgICAgICBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCcsCiAgICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgeyBoYW5kbGVSb3V0ZSgpOyB9CiAgICAgIH0sICdUcnkgYWdhaW4nKQogICAgKTsKICAgIGhvc3QuYXBwZW5kQ2hpbGQoYm94KTsKICB9CgogIGZ1bmN0aW9uIG1vdW50Tm90Rm91bmQocm91dGUpIHsKICAgIGlmICghb3V0bGV0RWwpIHJldHVybjsKICAgIGlmIChjdXJyZW50QmFzZVZpZXcpIHsKICAgICAgdmFyIHByZXYgPSBWLnZpZXdzW2N1cnJlbnRCYXNlVmlld107CiAgICAgIGlmIChwcmV2ICYmIHR5cGVvZiBwcmV2LnRlYXJkb3duID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IHByZXYudGVhcmRvd24oKTsgfSBjYXRjaCAoZSkge30gfQogICAgfQogICAgY3VycmVudEJhc2VWaWV3ID0gbnVsbDsKICAgIG91dGxldEVsLmlubmVySFRNTCA9ICcnOwogICAgdmFyIGJveCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eScgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJyB9LCBpY29uKCdzcGFya2xlcycpKSwKICAgICAgZWwoJ2gzJywgeyBjbGFzczogJ3YtZW1wdHlfX3RpdGxlJyB9LCAnUGFnZSBub3QgZm91bmQnKSwKICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fbXNnJyB9LAogICAgICAgICdXZSBjb3VsZG7igJl0IGZpbmQgJywgZWwoJ2NvZGUnLCBudWxsLCAnIy8nICsgZXNjYXBlSHRtbChyb3V0ZSB8fCAnJykpLCAnLicpLAogICAgICBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnknLAogICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvJyArIERFRkFVTFRfUk9VVEUpOyB9CiAgICAgIH0sICdHbyB0byBDcmVhdGUnKQogICAgKTsKICAgIG91dGxldEVsLmFwcGVuZENoaWxkKGJveCk7CiAgfQoKICBmdW5jdGlvbiBtb3VudE92ZXJsYXkodmlld05hbWUsIHBhcmFtcykgewogICAgdmFyIHZpZXcgPSBWLnZpZXdzW3ZpZXdOYW1lXTsKICAgIGlmICghdmlldyB8fCB0eXBlb2Ygdmlldy5yZW5kZXIgIT09ICdmdW5jdGlvbicpIHsKICAgICAgZ28oJyMvbGlicmFyeScpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIW92ZXJsYXlIb3N0RWwpIHJldHVybjsKCiAgICB2YXIgcmVvcGVuaW5nID0gY3VycmVudE92ZXJsYXlWaWV3ICE9PSB2aWV3TmFtZTsKICAgIGN1cnJlbnRPdmVybGF5VmlldyA9IHZpZXdOYW1lOwoKICAgIG92ZXJsYXlIb3N0RWwuaW5uZXJIVE1MID0gJyc7CiAgICBvdmVybGF5SG9zdEVsLmhpZGRlbiA9IGZhbHNlOwogICAgb3ZlcmxheUhvc3RFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7CiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndi1oYXMtb3ZlcmxheScpOwoKICAgIHZhciBwYW5lbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1vdmVybGF5X19wYW5lbCcsIHJvbGU6ICdkaWFsb2cnLCAnYXJpYS1tb2RhbCc6ICd0cnVlJyB9KTsKICAgIHZhciBiYWNrZHJvcCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1vdmVybGF5X19iYWNrZHJvcCcsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgY2xvc2VPdmVybGF5VG9CYXNlKCk7IH0gfSk7CiAgICBvdmVybGF5SG9zdEVsLmFwcGVuZENoaWxkKGJhY2tkcm9wKTsKICAgIG92ZXJsYXlIb3N0RWwuYXBwZW5kQ2hpbGQocGFuZWwpOwoKICAgIHRyeSB7CiAgICAgIHZpZXcucmVuZGVyKHBhbmVsLCBwYXJhbXMgfHwge30pOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIHJlbmRlclZpZXdFcnJvcihwYW5lbCwgdmlld05hbWUsIGVycik7CiAgICAgIGlmICh3aW5kb3cuY29uc29sZSkgY29uc29sZS5lcnJvcignW1Yucm91dGVyXSBvdmVybGF5ICInICsgdmlld05hbWUgKyAnIiByZW5kZXIgZmFpbGVkOicsIGVycik7CiAgICB9CgogICAgaWYgKHJlb3BlbmluZyAmJiAhcHJlZmVyc1JlZHVjZWRNb3Rpb24oKSkgewogICAgICBvdmVybGF5SG9zdEVsLmNsYXNzTGlzdC5yZW1vdmUoJ3Ytb3ZlcmxheS0taW4nKTsKICAgICAgdm9pZCBvdmVybGF5SG9zdEVsLm9mZnNldFdpZHRoOwogICAgICBvdmVybGF5SG9zdEVsLmNsYXNzTGlzdC5hZGQoJ3Ytb3ZlcmxheS0taW4nKTsKICAgIH0gZWxzZSB7CiAgICAgIG92ZXJsYXlIb3N0RWwuY2xhc3NMaXN0LmFkZCgndi1vdmVybGF5LS1pbicpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZGlzbWlzc092ZXJsYXkoKSB7CiAgICBpZiAoIWN1cnJlbnRPdmVybGF5VmlldykgcmV0dXJuOwogICAgdmFyIHZpZXcgPSBWLnZpZXdzW2N1cnJlbnRPdmVybGF5Vmlld107CiAgICBpZiAodmlldyAmJiB0eXBlb2Ygdmlldy50ZWFyZG93biA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgeyB2aWV3LnRlYXJkb3duKCk7IH0gY2F0Y2ggKGUpIHsgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmVycm9yKGUpOyB9CiAgICB9CiAgICBjdXJyZW50T3ZlcmxheVZpZXcgPSBudWxsOwogICAgaWYgKG92ZXJsYXlIb3N0RWwpIHsKICAgICAgb3ZlcmxheUhvc3RFbC5jbGFzc0xpc3QucmVtb3ZlKCd2LW92ZXJsYXktLWluJyk7CiAgICAgIG92ZXJsYXlIb3N0RWwuaW5uZXJIVE1MID0gJyc7CiAgICAgIG92ZXJsYXlIb3N0RWwuaGlkZGVuID0gdHJ1ZTsKICAgICAgb3ZlcmxheUhvc3RFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIH0KICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd2LWhhcy1vdmVybGF5Jyk7CiAgfQoKICBmdW5jdGlvbiBjbG9zZU92ZXJsYXlUb0Jhc2UoKSB7CiAgICB2YXIgYmFjayA9ICcjLycgKyAoY3VycmVudEJhc2VWaWV3ID8gcm91dGVGb3JWaWV3KGN1cnJlbnRCYXNlVmlldykgOiAnbGlicmFyeScpOwogICAgZ28oYmFjayk7CiAgfQoKICBmdW5jdGlvbiByb3V0ZUZvclZpZXcodmlld05hbWUpIHsKICAgIGZvciAodmFyIHIgaW4gUk9VVEVfVklFVykgewogICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFJPVVRFX1ZJRVcsIHIpICYmIFJPVVRFX1ZJRVdbcl0gPT09IHZpZXdOYW1lKSByZXR1cm4gcjsKICAgIH0KICAgIHJldHVybiB2aWV3TmFtZTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkQ2hyb21lKCkgewogICAgaWYgKCFhcHBSb290KSByZXR1cm47CiAgICBhcHBSb290LmlubmVySFRNTCA9ICcnOwoKICAgIHZhciBiZyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1iZycsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKCiAgICB0b3BiYXJFbCA9IGJ1aWxkVG9wQmFyKCk7CgogICAgb3V0bGV0RWwgPSBlbCgnbWFpbicsIHsgaWQ6ICd2LW91dGxldCcsIGNsYXNzOiAndi1vdXRsZXQnLCByb2xlOiAnbWFpbicsIHRhYkluZGV4OiAtMSB9KTsKCiAgICBib3R0b21iYXJFbCA9IGJ1aWxkQm90dG9tQmFyKCk7CgogICAgZHJhd2VyU2NyaW1FbCA9IGVsKCdkaXYnLCB7CiAgICAgIGNsYXNzOiAndi1zY3JpbScsCiAgICAgIGhpZGRlbjogdHJ1ZSwKICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgeyBjbG9zZURyYXdlcigpOyB9CiAgICB9KTsKICAgIGRyYXdlckVsID0gZWwoJ2FzaWRlJywgewogICAgICBjbGFzczogJ3YtZHJhd2VyJywKICAgICAgaWQ6ICd2LWFjY291bnQtZHJhd2VyJywKICAgICAgcm9sZTogJ2RpYWxvZycsCiAgICAgICdhcmlhLW1vZGFsJzogJ3RydWUnLAogICAgICAnYXJpYS1sYWJlbCc6ICdBY2NvdW50IG1lbnUnLAogICAgICBoaWRkZW46IHRydWUKICAgIH0pOwoKICAgIG92ZXJsYXlIb3N0RWwgPSBlbCgnZGl2JywgewogICAgICBjbGFzczogJ3Ytb3ZlcmxheScsCiAgICAgIGlkOiAndi1zdHVkaW8tb3ZlcmxheScsCiAgICAgIGhpZGRlbjogdHJ1ZSwKICAgICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnCiAgICB9KTsKCiAgICBhcHBSb290LmFwcGVuZENoaWxkKGJnKTsKICAgIGFwcFJvb3QuYXBwZW5kQ2hpbGQodG9wYmFyRWwpOwogICAgYXBwUm9vdC5hcHBlbmRDaGlsZChvdXRsZXRFbCk7CiAgICBhcHBSb290LmFwcGVuZENoaWxkKGJvdHRvbWJhckVsKTsKICAgIGFwcFJvb3QuYXBwZW5kQ2hpbGQoZHJhd2VyU2NyaW1FbCk7CiAgICBhcHBSb290LmFwcGVuZENoaWxkKGRyYXdlckVsKTsKICAgIGFwcFJvb3QuYXBwZW5kQ2hpbGQob3ZlcmxheUhvc3RFbCk7CiAgfQoKICBmdW5jdGlvbiBidWlsZFRvcEJhcigpIHsKICAgIHZhciBiYXIgPSBlbCgnaGVhZGVyJywgeyBjbGFzczogJ3YtdG9wYmFyIGxpcXVpZC1nbGFzcyBsaXF1aWQtZ2xhc3MtbmF2IGdsYXNzLW5hdicsIHJvbGU6ICdiYW5uZXInIH0pOwoKICAgIHZhciB3b3JkbWFyayA9IGVsKCdhJywgewogICAgICBjbGFzczogJ3Ytd29yZG1hcmsgdi1ncmFkaWVudCcsCiAgICAgIGhyZWY6ICcjL2NyZWF0ZScsCiAgICAgICdhcmlhLWxhYmVsJzogJ1ZhbXAg4oCUIGdvIHRvIENyZWF0ZScsCiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZ28oJyMvY3JlYXRlJyk7IH0KICAgIH0sICdWQU1QJyk7CgogICAgdmFyIG5hdiA9IGVsKCduYXYnLCB7IGNsYXNzOiAndi10b3BuYXYnLCAnYXJpYS1sYWJlbCc6ICdQcmltYXJ5JyB9KTsKICAgIE5BVl9JVEVNUy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgIHZhciBsaW5rID0gZWwoJ2EnLCB7CiAgICAgICAgY2xhc3M6ICd2LXRvcG5hdl9faXRlbScsCiAgICAgICAgaHJlZjogJyMvJyArIGl0ZW0ucm91dGUsCiAgICAgICAgJ2RhdGEtcm91dGUnOiBpdGVtLnJvdXRlLAogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZ28oJyMvJyArIGl0ZW0ucm91dGUpOyB9CiAgICAgIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi10YWJfX2ljb24nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSwgaWNvbihpdGVtLmljb24pKSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXRvcG5hdl9fbGFiZWwnIH0sIGl0ZW0ubGFiZWwpKTsKICAgICAgbmF2LmFwcGVuZENoaWxkKGxpbmspOwogICAgfSk7CgogICAgdmFyIGNyZWRpdHNCdG4gPSBlbCgnYnV0dG9uJywgewogICAgICBjbGFzczogJ3YtY3JlZGl0cycsCiAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAnYXJpYS1sYWJlbCc6ICdDcmVkaXRzIOKAlCBhZGQgbW9yZScsCiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvcGF5d2FsbCcpOyB9CiAgICB9KTsKICAgIGNyZWRpdHNCdG4uYXBwZW5kQ2hpbGQoY3JlZGl0c1BpbGxDb250ZW50KGN1cnJlbnRDcmVkaXRzKCkpKTsKCiAgICB2YXIgaGFtYnVyZ2VyID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6ICd2LWhhbWJ1cmdlciBnbGFzcy1idXR0b24nLAogICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgJ2FyaWEtbGFiZWwnOiAnQWNjb3VudCBtZW51JywKICAgICAgJ2FyaWEtaGFzcG9wdXAnOiAnZGlhbG9nJywKICAgICAgJ2FyaWEtZXhwYW5kZWQnOiAnZmFsc2UnLAogICAgICAnYXJpYS1jb250cm9scyc6ICd2LWFjY291bnQtZHJhd2VyJywKICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgeyB0b2dnbGVEcmF3ZXIoKTsgfQogICAgfSwgaWNvbignbWVudScpKTsKCiAgICB2YXIgcmlnaHQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtdG9wYmFyX19yaWdodCcgfSwgY3JlZGl0c0J0biwgaGFtYnVyZ2VyKTsKCiAgICBiYXIuYXBwZW5kQ2hpbGQod29yZG1hcmspOwogICAgYmFyLmFwcGVuZENoaWxkKG5hdik7CiAgICBiYXIuYXBwZW5kQ2hpbGQocmlnaHQpOwoKICAgIGJhci5fX2NyZWRpdHNCdG4gPSBjcmVkaXRzQnRuOwogICAgYmFyLl9faGFtYnVyZ2VyID0gaGFtYnVyZ2VyOwogICAgYmFyLl9fbmF2ID0gbmF2OwogICAgcmV0dXJuIGJhcjsKICB9CgogIGZ1bmN0aW9uIGNyZWRpdHNQaWxsQ29udGVudChuKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jcmVkaXRzUGlsbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgbm9kZSA9IFYudWkuY3JlZGl0c1BpbGwobik7CiAgICAgIGlmIChub2RlICYmIG5vZGUubm9kZVR5cGUpIHJldHVybiBub2RlOwogICAgfQogICAgdmFyIHdyYXAgPSBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHNfX2lubmVyJyB9LAogICAgICBpY29uKCdib2x0JyksCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3JlZGl0c19fbnVtJyB9LCBmb3JtYXRDcmVkaXRzKG4pKSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVkaXRzX19sYWJlbCcgfSwgJ2NyZWRpdHMnKQogICAgKTsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRCb3R0b21CYXIoKSB7CiAgICB2YXIgYmFyID0gZWwoJ25hdicsIHsgY2xhc3M6ICd2LWJvdHRvbWJhciBsaXF1aWQtZ2xhc3MgZ2xhc3MtbmF2JywgJ2FyaWEtbGFiZWwnOiAnUHJpbWFyeScgfSk7CiAgICBOQVZfSVRFTVMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICB2YXIgdGFiID0gZWwoJ2J1dHRvbicsIHsKICAgICAgICBjbGFzczogJ3YtdGFiJywKICAgICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgICAnZGF0YS1yb3V0ZSc6IGl0ZW0ucm91dGUsCiAgICAgICAgJ2FyaWEtbGFiZWwnOiBpdGVtLmxhYmVsLAogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvJyArIGl0ZW0ucm91dGUpOyB9CiAgICAgIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi10YWJfX2ljb24nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSwgaWNvbihpdGVtLmljb24pKSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXRhYl9fbGFiZWwnIH0sIGl0ZW0ubGFiZWwpKTsKICAgICAgYmFyLmFwcGVuZENoaWxkKHRhYik7CiAgICB9KTsKICAgIHJldHVybiBiYXI7CiAgfQoKICBmdW5jdGlvbiBidWlsZERyYXdlckhlYWRlcigpIHsKICAgIHZhciB1ID0gVi5zdGF0ZSAmJiBWLnN0YXRlLnVzZXI7CiAgICB2YXIgbmFtZSA9ICh1ICYmICh1LmRpc3BsYXlOYW1lIHx8IHUubmFtZSB8fCB1LnVzZXJuYW1lKSkgfHwgJ0FjY291bnQnOwogICAgdmFyIGVtYWlsID0gKHUgJiYgdS5lbWFpbCkgfHwgJyc7CgogICAgdmFyIGF2YXRhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2F2YXRhcicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9LAogICAgICBlbCgnc3BhbicsIG51bGwsIGluaXRpYWxzRm9yKHUpKSk7CiAgICBpZiAodSAmJiB1LnByb2ZpbGVQaWNVUkwpIHsKICAgICAgYXZhdGFyID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9fYXZhdGFyJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sCiAgICAgICAgZWwoJ2ltZycsIHsgc3JjOiB1LnByb2ZpbGVQaWNVUkwsIGFsdDogJycsIGxvYWRpbmc6ICdsYXp5JyB9KSk7CiAgICB9CgogICAgdmFyIGlkZW50ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9faWRlbnQnIH0sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX25hbWUnIH0sIGVzY2FwZUh0bWwobmFtZSkpLAogICAgICBlbWFpbCA/IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2VtYWlsJyB9LCBlc2NhcGVIdG1sKGVtYWlsKSkgOiBudWxsKTsKCiAgICB2YXIgY2xvc2VCdG4gPSBlbCgnYnV0dG9uJywgewogICAgICBjbGFzczogJ3YtZHJhd2VyX19jbG9zZScsCiAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAnYXJpYS1sYWJlbCc6ICdDbG9zZSBtZW51JywKICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgeyBjbG9zZURyYXdlcigpOyB9CiAgICB9LCBpY29uKCdjbG9zZScpKTsKCiAgICByZXR1cm4gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9faGVhZGVyJyB9LCBhdmF0YXIsIGlkZW50LCBjbG9zZUJ0bik7CiAgfQoKICBmdW5jdGlvbiBpbml0aWFsc0Zvcih1KSB7CiAgICBpZiAoIXUpIHJldHVybiAn4pyoJzsKICAgIHZhciBzcmMgPSB1LmRpc3BsYXlOYW1lIHx8IHUubmFtZSB8fCB1LnVzZXJuYW1lIHx8IHUuZW1haWwgfHwgJyc7CiAgICB2YXIgcGFydHMgPSBTdHJpbmcoc3JjKS50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKTsKICAgIGlmICghcGFydHMubGVuZ3RoKSByZXR1cm4gJ+KcqCc7CiAgICBpZiAocGFydHMubGVuZ3RoID09PSAxKSByZXR1cm4gcGFydHNbMF0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCk7CiAgICByZXR1cm4gKHBhcnRzWzBdLmNoYXJBdCgwKSArIHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdLmNoYXJBdCgwKSkudG9VcHBlckNhc2UoKTsKICB9CgogIGZ1bmN0aW9uIG9wZW5EcmF3ZXIoKSB7CiAgICBpZiAoIWRyYXdlckVsKSByZXR1cm47CiAgICBsYXN0Rm9jdXNCZWZvcmVEcmF3ZXIgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwoKICAgIGRyYXdlckVsLmlubmVySFRNTCA9ICcnOwogICAgZHJhd2VyRWwuYXBwZW5kQ2hpbGQoYnVpbGREcmF3ZXJIZWFkZXIoKSk7CiAgICB2YXIgYm9keSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2JvZHknIH0pOwogICAgZHJhd2VyRWwuYXBwZW5kQ2hpbGQoYm9keSk7CgogICAgaWYgKFYudmlld3MuYWNjb3VudCAmJiB0eXBlb2YgVi52aWV3cy5hY2NvdW50LnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgewogICAgICAgIFYudmlld3MuYWNjb3VudC5yZW5kZXIoYm9keSwgY3VycmVudCgpLnBhcmFtcyk7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIHJlbmRlclZpZXdFcnJvcihib2R5LCAnYWNjb3VudCcsIGVycik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2VtcHR5JyB9LCAnQWNjb3VudCBtZW51IHVuYXZhaWxhYmxlLicpKTsKICAgIH0KCiAgICBkcmF3ZXJFbC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtZHJhd2VyX19mb290ZXInIH0sCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZHJhd2VyX19icmFuZCB2LWdyYWRpZW50JyB9LCAnVm9vc2V5JyksCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZHJhd2VyX19jb3B5JyB9LAogICAgICAgICfCqSAnICsgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpICsgJyBWb29zZXkgTExDIOKAoiBBbGwgUmlnaHRzIFJlc2VydmVkJykpKTsKCiAgICBkcmF3ZXJTY3JpbUVsLmhpZGRlbiA9IGZhbHNlOwogICAgZHJhd2VyRWwuaGlkZGVuID0gZmFsc2U7CiAgICB2b2lkIGRyYXdlckVsLm9mZnNldFdpZHRoOwogICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3YtZHJhd2VyLW9wZW4nKTsKICAgIGRyYXdlclNjcmltRWwuY2xhc3NMaXN0LmFkZCgndi1zY3JpbS0taW4nKTsKICAgIGRyYXdlckVsLmNsYXNzTGlzdC5hZGQoJ3YtZHJhd2VyLS1pbicpOwoKICAgIGlmIChWLnN0b3JlKSBWLnN0b3JlLnNldCgnZHJhd2VyT3BlbicsIHRydWUpOwogICAgaWYgKHRvcGJhckVsICYmIHRvcGJhckVsLl9faGFtYnVyZ2VyKSB0b3BiYXJFbC5fX2hhbWJ1cmdlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpOwoKICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIGZvY3VzYWJsZSA9IGRyYXdlckVsLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbiwgYSwgaW5wdXQsIFt0YWJpbmRleF0nKTsKICAgICAgaWYgKGZvY3VzYWJsZSkgdHJ5IHsgZm9jdXNhYmxlLmZvY3VzKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICB9LCA2MCk7CiAgfQoKICBmdW5jdGlvbiBjbG9zZURyYXdlcigpIHsKICAgIGlmICghZHJhd2VyRWwgfHwgZHJhd2VyRWwuaGlkZGVuKSByZXR1cm47CiAgICBkcmF3ZXJFbC5jbGFzc0xpc3QucmVtb3ZlKCd2LWRyYXdlci0taW4nKTsKICAgIGRyYXdlclNjcmltRWwuY2xhc3NMaXN0LnJlbW92ZSgndi1zY3JpbS0taW4nKTsKICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd2LWRyYXdlci1vcGVuJyk7CiAgICBpZiAodG9wYmFyRWwgJiYgdG9wYmFyRWwuX19oYW1idXJnZXIpIHRvcGJhckVsLl9faGFtYnVyZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpOwogICAgaWYgKFYuc3RvcmUpIFYuc3RvcmUuc2V0KCdkcmF3ZXJPcGVuJywgZmFsc2UpOwoKICAgIHZhciBmaW5hbGl6ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgZHJhd2VyRWwuaGlkZGVuID0gdHJ1ZTsKICAgICAgZHJhd2VyU2NyaW1FbC5oaWRkZW4gPSB0cnVlOwogICAgICBkcmF3ZXJFbC5pbm5lckhUTUwgPSAnJzsKICAgIH07CiAgICBpZiAocHJlZmVyc1JlZHVjZWRNb3Rpb24oKSkgZmluYWxpemUoKTsKICAgIGVsc2Ugd2luZG93LnNldFRpbWVvdXQoZmluYWxpemUsIDI2MCk7CgogICAgaWYgKGxhc3RGb2N1c0JlZm9yZURyYXdlciAmJiB0eXBlb2YgbGFzdEZvY3VzQmVmb3JlRHJhd2VyLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7IGxhc3RGb2N1c0JlZm9yZURyYXdlci5mb2N1cygpOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgbGFzdEZvY3VzQmVmb3JlRHJhd2VyID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHRvZ2dsZURyYXdlcigpIHsKICAgIGlmIChkcmF3ZXJFbCAmJiAhZHJhd2VyRWwuaGlkZGVuKSBjbG9zZURyYXdlcigpOwogICAgZWxzZSBvcGVuRHJhd2VyKCk7CiAgfQoKICBmdW5jdGlvbiBzeW5jQ2hyb21lKCkgewogICAgaWYgKCFhcHBSb290KSByZXR1cm47CiAgICB2YXIgZGVzYyA9IGN1cnJlbnQoKTsKICAgIHZhciByb3V0ZSA9IGRlc2Mucm91dGU7CiAgICB2YXIgYmFyZVZpZXcgPSByb3V0ZSA9PT0gJ2F1dGgnIHx8IHJvdXRlID09PSAnb25ib2FyZGluZyc7CiAgICB2YXIgb3ZlcmxheUFjdGl2ZSA9ICEhY3VycmVudE92ZXJsYXlWaWV3OwoKICAgIGFwcFJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgndi1hcHAtLWJhcmUnLCBiYXJlVmlldyk7CgogICAgaWYgKHRvcGJhckVsKSB0b3BiYXJFbC5oaWRkZW4gPSBiYXJlVmlldzsKICAgIGlmIChib3R0b21iYXJFbCkgYm90dG9tYmFyRWwuaGlkZGVuID0gYmFyZVZpZXcgfHwgb3ZlcmxheUFjdGl2ZTsKCiAgICB2YXIgYWN0aXZlUm91dGUgPSByb3V0ZSA9PT0gJ2ltYWdlJyA/IHJvdXRlRm9yVmlldyhjdXJyZW50QmFzZVZpZXcgfHwgJ2xpYnJhcnknKSA6IHJvdXRlOwogICAgc2V0QWN0aXZlTmF2KGFjdGl2ZVJvdXRlKTsKCiAgICByZWZyZXNoQ3JlZGl0c1BpbGwoKTsKICB9CgogIGZ1bmN0aW9uIHNldEFjdGl2ZU5hdihhY3RpdmVSb3V0ZSkgewogICAgaWYgKGJvdHRvbWJhckVsKSB7CiAgICAgIHZhciB0YWJzID0gYm90dG9tYmFyRWwucXVlcnlTZWxlY3RvckFsbCgnLnYtdGFiJyk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciByID0gdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcm91dGUnKTsKICAgICAgICB2YXIgb24gPSByID09PSBhY3RpdmVSb3V0ZTsKICAgICAgICB0YWJzW2ldLmNsYXNzTGlzdC50b2dnbGUoJ3YtdGFiLS1hY3RpdmUnLCBvbik7CiAgICAgICAgaWYgKG9uKSB0YWJzW2ldLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywgJ3BhZ2UnKTsKICAgICAgICBlbHNlIHRhYnNbaV0ucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnKTsKICAgICAgfQogICAgfQogICAgaWYgKHRvcGJhckVsICYmIHRvcGJhckVsLl9fbmF2KSB7CiAgICAgIHZhciBpdGVtcyA9IHRvcGJhckVsLl9fbmF2LnF1ZXJ5U2VsZWN0b3JBbGwoJy52LXRvcG5hdl9faXRlbScpOwogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGl0ZW1zLmxlbmd0aDsgaisrKSB7CiAgICAgICAgdmFyIHIyID0gaXRlbXNbal0uZ2V0QXR0cmlidXRlKCdkYXRhLXJvdXRlJyk7CiAgICAgICAgdmFyIG9uMiA9IHIyID09PSBhY3RpdmVSb3V0ZTsKICAgICAgICBpdGVtc1tqXS5jbGFzc0xpc3QudG9nZ2xlKCd2LXRvcG5hdl9faXRlbS0tYWN0aXZlJywgb24yKTsKICAgICAgICBpZiAob24yKSBpdGVtc1tqXS5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICdwYWdlJyk7CiAgICAgICAgZWxzZSBpdGVtc1tqXS5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZWZyZXNoQ3JlZGl0c1BpbGwoKSB7CiAgICBpZiAoIXRvcGJhckVsIHx8ICF0b3BiYXJFbC5fX2NyZWRpdHNCdG4pIHJldHVybjsKICAgIHZhciBidG4gPSB0b3BiYXJFbC5fX2NyZWRpdHNCdG47CiAgICBidG4uaW5uZXJIVE1MID0gJyc7CiAgICBidG4uYXBwZW5kQ2hpbGQoY3JlZGl0c1BpbGxDb250ZW50KGN1cnJlbnRDcmVkaXRzKCkpKTsKICB9CgogIGZ1bmN0aW9uIGN1cnJlbnRDcmVkaXRzKCkgewogICAgdmFyIGMgPSBWLnN0YXRlID8gVi5zdGF0ZS5jcmVkaXRzIDogbnVsbDsKICAgIHJldHVybiB0eXBlb2YgYyA9PT0gJ251bWJlcicgPyBjIDogMDsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdENyZWRpdHMobikgewogICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCAhaXNGaW5pdGUobikpIHJldHVybiAnMCc7CiAgICB0cnkgeyByZXR1cm4gbi50b0xvY2FsZVN0cmluZygnZW4tVVMnKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gU3RyaW5nKG4pOyB9CiAgfQoKICBmdW5jdGlvbiBzaG93Qm9vdExvYWRlcigpIHsKICAgIGlmICghb3V0bGV0RWwpIHJldHVybjsKICAgIG91dGxldEVsLmlubmVySFRNTCA9ICcnOwogICAgdmFyIGxvYWRlciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1ib290JyB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtYm9vdF9fbWFyayB2LWdyYWRpZW50JyB9LCAnVkFNUCcpLAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtYm9vdF9fc3Bpbm5lcicsICdhcmlhLWxhYmVsJzogJ0xvYWRpbmcnLCByb2xlOiAnc3RhdHVzJyB9LAogICAgICAgIFYudWkgJiYgdHlwZW9mIFYudWkuc3Bpbm5lciA9PT0gJ2Z1bmN0aW9uJyA/IHNhZmVTcGlubmVyKCkgOiBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXNwaW5uZXInIH0pKQogICAgKTsKICAgIG91dGxldEVsLmFwcGVuZENoaWxkKGxvYWRlcik7CiAgfQoKICBmdW5jdGlvbiBzYWZlU3Bpbm5lcigpIHsKICAgIHRyeSB7CiAgICAgIHZhciBzID0gVi51aS5zcGlubmVyKCk7CiAgICAgIGlmIChzICYmIHMubm9kZVR5cGUpIHJldHVybiBzOwogICAgfSBjYXRjaCAoZSkge30KICAgIHJldHVybiBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXNwaW5uZXInIH0pOwogIH0KCiAgZnVuY3Rpb24gd2lyZVN0b3JlRXZlbnRzKCkgewogICAgaWYgKCFWLnN0b3JlIHx8IHR5cGVvZiBWLnN0b3JlLm9uICE9PSAnZnVuY3Rpb24nKSByZXR1cm47CgogICAgVi5zdG9yZS5vbignYXV0aDpjaGFuZ2VkJywgZnVuY3Rpb24gKCkgewogICAgICB2YXIgYXV0aGVkID0gVi5hdXRoICYmIHR5cGVvZiBWLmF1dGguaXNBdXRoZWQgPT09ICdmdW5jdGlvbicgPyBWLmF1dGguaXNBdXRoZWQoKSA6IGZhbHNlOwogICAgICBpZiAoIWJvb3RpbmcpIHsKICAgICAgICBpZiAoIWF1dGhlZCkgewogICAgICAgICAgY2xvc2VEcmF3ZXIoKTsKICAgICAgICAgIGRpc21pc3NPdmVybGF5KCk7CiAgICAgICAgICBoYW5kbGVSb3V0ZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzeW5jQ2hyb21lKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICBWLnN0b3JlLm9uKCdjcmVkaXRzOmNoYW5nZWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHJlZnJlc2hDcmVkaXRzUGlsbCgpOwogICAgfSk7CgogICAgVi5zdG9yZS5vbignZXJyb3InLCBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICB2YXIgbXNnID0gcGF5bG9hZCAmJiBwYXlsb2FkLm1lc3NhZ2UgPyBwYXlsb2FkLm1lc3NhZ2UgOiAnU29tZXRoaW5nIHdlbnQgd3JvbmcuJzsKICAgICAgdG9hc3QobXNnLCAnZXJyb3InKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gd2lyZUdsb2JhbEhhbmRsZXJzKCkgewogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7IGhhbmRsZVJvdXRlKCk7IH0sIGZhbHNlKTsKCiAgICB3aW5kb3cub25lcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBzb3VyY2UsIGxpbmVubywgY29sbm8sIGVycm9yKSB7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmVycm9yKCdbVi5vbmVycm9yXScsIG1lc3NhZ2UsIGVycm9yIHx8ICcnKTsKICAgICAgICB0b2FzdChmcmllbmRseUVycm9yKG1lc3NhZ2UpLCAnZXJyb3InKTsKICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKCiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5oYW5kbGVkcmVqZWN0aW9uJywgZnVuY3Rpb24gKGV2KSB7CiAgICAgIHZhciByZWFzb24gPSBldiAmJiBldi5yZWFzb247CiAgICAgIHZhciBtc2cgPSByZWFzb24gJiYgcmVhc29uLm1lc3NhZ2UgPyByZWFzb24ubWVzc2FnZSA6ICdBIGJhY2tncm91bmQgdGFzayBmYWlsZWQuJzsKICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmVycm9yKCdbVi51bmhhbmRsZWRyZWplY3Rpb25dJywgcmVhc29uIHx8ICcnKTsKICAgICAgaWYgKHJlYXNvbiAmJiAocmVhc29uLm5hbWUgPT09ICdBYm9ydEVycm9yJyB8fCByZWFzb24uYWJvcnRlZCA9PT0gdHJ1ZSkpIHJldHVybjsKICAgICAgdG9hc3QoZnJpZW5kbHlFcnJvcihtc2cpLCAnZXJyb3InKTsKICAgIH0pOwoKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvZmZsaW5lJywgZnVuY3Rpb24gKCkgeyB0b2FzdCgnWW914oCZcmUgb2ZmbGluZS4gQ2hhbmdlcyB3aWxsIHJldHJ5LicsICd3YXJuaW5nJyk7IH0pOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29ubGluZScsIGZ1bmN0aW9uICgpIHsgdG9hc3QoJ0JhY2sgb25saW5lLicsICdzdWNjZXNzJyk7IH0pOwoKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnIHx8IGUua2V5Q29kZSA9PT0gMjcpIHsKICAgICAgICBpZiAoY3VycmVudE92ZXJsYXlWaWV3KSB7IGNsb3NlT3ZlcmxheVRvQmFzZSgpOyBlLnByZXZlbnREZWZhdWx0KCk7IHJldHVybjsgfQogICAgICAgIGlmIChkcmF3ZXJFbCAmJiAhZHJhd2VyRWwuaGlkZGVuKSB7IGNsb3NlRHJhd2VyKCk7IGUucHJldmVudERlZmF1bHQoKTsgcmV0dXJuOyB9CiAgICAgIH0KICAgIH0sIGZhbHNlKTsKCiAgICBpZiAod2luZG93Lm1hdGNoTWVkaWEpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgbXEgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpOwogICAgICAgIHZhciBvblRoZW1lQ2hhbmdlID0gZnVuY3Rpb24gKCkgeyBhcHBseVRoZW1lKCk7IH07CiAgICAgICAgaWYgKG1xLmFkZEV2ZW50TGlzdGVuZXIpIG1xLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIG9uVGhlbWVDaGFuZ2UpOwogICAgICAgIGVsc2UgaWYgKG1xLmFkZExpc3RlbmVyKSBtcS5hZGRMaXN0ZW5lcihvblRoZW1lQ2hhbmdlKTsKICAgICAgfSBjYXRjaCAoZSkge30KICAgIH0KICB9CgogIGZ1bmN0aW9uIGZyaWVuZGx5RXJyb3IobXNnKSB7CiAgICB2YXIgbSA9IFN0cmluZyhtc2cgPT0gbnVsbCA/ICcnIDogbXNnKTsKICAgIGlmICgvbmV0d29ya3xmZXRjaHxsb2FkIGZhaWxlZHxmYWlsZWQgdG8gZmV0Y2gvaS50ZXN0KG0pKSB7CiAgICAgIHJldHVybiAnTmV0d29yayBoaWNjdXAg4oCUIHBsZWFzZSB0cnkgYWdhaW4uJzsKICAgIH0KICAgIGlmIChtLmxlbmd0aCA+IDE2MCkgbSA9IG0uc2xpY2UoMCwgMTU3KSArICfigKYnOwogICAgcmV0dXJuIG0gfHwgJ1NvbWV0aGluZyB3ZW50IHdyb25nLic7CiAgfQoKICB2YXIgcGVuZGluZ1JlZmVycmFsID0gbnVsbDsKICB2YXIgcGVuZGluZ1B1cmNoYXNlU3VjY2VzcyA9IGZhbHNlOwoKICBmdW5jdGlvbiBjYXB0dXJlR2xvYmFsSW50ZW50cygpIHsKICAgIHZhciBzZWFyY2ggPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoIHx8ICcnOwogICAgdmFyIHNlYXJjaFBhcmFtcyA9IHBhcnNlUXVlcnkoc2VhcmNoLmNoYXJBdCgwKSA9PT0gJz8nID8gc2VhcmNoLnNsaWNlKDEpIDogc2VhcmNoKTsKICAgIHZhciBoYXNoUGFyYW1zID0gY3VycmVudCgpLnBhcmFtcyB8fCB7fTsKCiAgICB2YXIgcmVmID0gc2VhcmNoUGFyYW1zLnIgfHwgaGFzaFBhcmFtcy5yIHx8IG51bGw7CiAgICBpZiAocmVmKSBwZW5kaW5nUmVmZXJyYWwgPSBTdHJpbmcocmVmKS50cmltKCk7CgogICAgdmFyIHB1cmNoYXNlID0gKHNlYXJjaFBhcmFtcy5wdXJjaGFzZSB8fCBoYXNoUGFyYW1zLnB1cmNoYXNlIHx8ICcnKS50b1N0cmluZygpOwogICAgaWYgKHB1cmNoYXNlID09PSAnc3VjY2VzcycpIHBlbmRpbmdQdXJjaGFzZVN1Y2Nlc3MgPSB0cnVlOwogIH0KCiAgZnVuY3Rpb24gZmx1c2hHbG9iYWxJbnRlbnRzKGF1dGhlZCkgewogICAgaWYgKHBlbmRpbmdQdXJjaGFzZVN1Y2Nlc3MpIHsKICAgICAgcGVuZGluZ1B1cmNoYXNlU3VjY2VzcyA9IGZhbHNlOwogICAgICBpZiAoYXV0aGVkICYmIFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLnJlZnJlc2hDcmVkaXRzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgVi5hdXRoLnJlZnJlc2hDcmVkaXRzKCk7CiAgICAgIH0KICAgICAgdG9hc3QoJ1B1cmNoYXNlIGNvbXBsZXRlIOKAlCBjcmVkaXRzIGFkZGVkIScsICdzdWNjZXNzJyk7CiAgICAgIGNlbGVicmF0ZSgpOwogICAgICBzdHJpcEdsb2JhbFF1ZXJ5UGFyYW0oJ3B1cmNoYXNlJyk7CiAgICB9CgogICAgaWYgKHBlbmRpbmdSZWZlcnJhbCkgewogICAgICB2YXIgY29kZSA9IHBlbmRpbmdSZWZlcnJhbDsKICAgICAgcGVuZGluZ1JlZmVycmFsID0gbnVsbDsKICAgICAgYXR0cmlidXRlUmVmZXJyYWwoY29kZSwgYXV0aGVkKTsKICAgICAgc3RyaXBHbG9iYWxRdWVyeVBhcmFtKCdyJyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhdHRyaWJ1dGVSZWZlcnJhbChjb2RlLCBhdXRoZWQpIHsKICAgIGlmICghY29kZSkgcmV0dXJuOwogICAgaWYgKCFhdXRoZWQpIHsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoVi5zdG9yZSkgewogICAgICAgICAgdmFyIHMgPSBWLnN0YXRlLnNldHRpbmdzIHx8IHt9OwogICAgICAgICAgcy5wZW5kaW5nUmVmZXJyYWwgPSBjb2RlOwogICAgICAgICAgVi5zdG9yZS5zZXQoJ3NldHRpbmdzJywgcyk7CiAgICAgICAgICBWLnN0b3JlLnNhdmUoKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChWLmFwaSAmJiB0eXBlb2YgVi5hcGkuYXR0cmlidXRlUmVmZXJyYWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgVi5hcGkuYXR0cmlidXRlUmVmZXJyYWwoY29kZSkKICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICB0b2FzdCgnUmVmZXJyYWwgYXBwbGllZCDigJQgd2VsY29tZSBhYm9hcmQhJywgJ3N1Y2Nlc3MnKTsKICAgICAgICAgIGNlbGVicmF0ZSgpOwogICAgICAgICAgaWYgKFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLnJlZnJlc2hDcmVkaXRzID09PSAnZnVuY3Rpb24nKSBWLmF1dGgucmVmcmVzaENyZWRpdHMoKTsKICAgICAgICB9KQogICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjZWxlYnJhdGUoKSB7CiAgICBpZiAocHJlZmVyc1JlZHVjZWRNb3Rpb24oKSkgcmV0dXJuOwogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuY29uZmV0dGkgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgVi51aS5jb25mZXR0aSgpOyB9IGNhdGNoIChlKSB7fSB9CiAgfQoKICBmdW5jdGlvbiBzdHJpcEdsb2JhbFF1ZXJ5UGFyYW0oa2V5KSB7CiAgICB0cnkgewogICAgICB2YXIgbG9jID0gd2luZG93LmxvY2F0aW9uOwogICAgICB2YXIgYmFzZSA9IGxvYy5ocmVmLnNwbGl0KCcjJylbMF0uc3BsaXQoJz8nKVswXTsKCiAgICAgIHZhciBzZWFyY2hQYXJhbXMgPSBwYXJzZVF1ZXJ5KChsb2Muc2VhcmNoIHx8ICcnKS5yZXBsYWNlKC9eXD8vLCAnJykpOwogICAgICBkZWxldGUgc2VhcmNoUGFyYW1zW2tleV07CiAgICAgIHZhciBuZXdTZWFyY2ggPSBidWlsZFF1ZXJ5KHNlYXJjaFBhcmFtcyk7CgogICAgICB2YXIgZGVzYyA9IGN1cnJlbnQoKTsKICAgICAgdmFyIGhwID0gT2JqZWN0LmFzc2lnbih7fSwgZGVzYy5wYXJhbXMgfHwge30pOwogICAgICBkZWxldGUgaHBba2V5XTsKICAgICAgZGVsZXRlIGhwLl9fb3ZlcmxheTsKICAgICAgdmFyIGhhc2hRdWVyeSA9IGJ1aWxkUXVlcnkoaHApOwogICAgICB2YXIgbmV3SGFzaCA9ICcjLycgKyAoZGVzYy5wYXRoIHx8IERFRkFVTFRfUk9VVEUpICsgKGhhc2hRdWVyeSA/ICc/JyArIGhhc2hRdWVyeSA6ICcnKTsKCiAgICAgIHZhciBuZXdVcmwgPSBiYXNlICsgKG5ld1NlYXJjaCA/ICc/JyArIG5ld1NlYXJjaCA6ICcnKSArIG5ld0hhc2g7CiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgbmV3VXJsKTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiBidWlsZFF1ZXJ5KG9iaikgewogICAgdmFyIHBhcnRzID0gW107CiAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGspKSBjb250aW51ZTsKICAgICAgaWYgKG9ialtrXSA9PSBudWxsIHx8IG9ialtrXSA9PT0gJycpIHsgcGFydHMucHVzaChlbmNvZGVVUklDb21wb25lbnQoaykpOyBjb250aW51ZTsgfQogICAgICBwYXJ0cy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChvYmpba10pKTsKICAgIH0KICAgIHJldHVybiBwYXJ0cy5qb2luKCcmJyk7CiAgfQoKICBmdW5jdGlvbiBhcHBseVRoZW1lKCkgewogICAgdmFyIHByZWYgPSAoVi5zdGF0ZSAmJiBWLnN0YXRlLnNldHRpbmdzICYmIFYuc3RhdGUuc2V0dGluZ3MudGhlbWUpIHx8ICdzeXN0ZW0nOwogICAgdmFyIHJlc29sdmVkID0gcHJlZjsKICAgIGlmIChwcmVmID09PSAnc3lzdGVtJykgewogICAgICByZXNvbHZlZCA9CiAgICAgICAgd2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpJykubWF0Y2hlcwogICAgICAgICAgPyAnbGlnaHQnCiAgICAgICAgICA6ICdkYXJrJzsKICAgIH0KICAgIHZhciByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnLCByZXNvbHZlZCk7CiAgICByb290LmNsYXNzTGlzdC50b2dnbGUoJ3YtdGhlbWUtbGlnaHQnLCByZXNvbHZlZCA9PT0gJ2xpZ2h0Jyk7CiAgICByb290LmNsYXNzTGlzdC50b2dnbGUoJ3YtdGhlbWUtZGFyaycsIHJlc29sdmVkICE9PSAnbGlnaHQnKTsKICB9CgogIGZ1bmN0aW9uIHByZWZlcnNSZWR1Y2VkTW90aW9uKCkgewogICAgaWYgKFYuc3RhdGUgJiYgVi5zdGF0ZS5zZXR0aW5ncyAmJiBWLnN0YXRlLnNldHRpbmdzLnJlZHVjZU1vdGlvbiA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7CiAgICB0cnkgewogICAgICByZXR1cm4gISEod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJykubWF0Y2hlcyk7CiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfQogIH0KCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGJvb3QsIHsgb25jZTogdHJ1ZSB9KTsKICB9IGVsc2UgewogICAgd2luZG93LnNldFRpbWVvdXQoYm9vdCwgMCk7CiAgfQoKICBWLnJvdXRlci5vcGVuRHJhd2VyID0gb3BlbkRyYXdlcjsKICBWLnJvdXRlci5jbG9zZURyYXdlciA9IGNsb3NlRHJhd2VyOwogIFYucm91dGVyLnRvZ2dsZURyYXdlciA9IHRvZ2dsZURyYXdlcjsKICBWLnJvdXRlci5yZWZyZXNoQ2hyb21lID0gc3luY0Nocm9tZTsKfSkoKTsKCg==) and injects it as a        <script> element so the browser parses/executes the real app,    (c) surfaces a graceful fatal-error panel if anything throws.  LyogVm9vc2V5V2ViIGJ1bmRsZSDigJQgZ2VuZXJhdGVkIGJ5IGRlcGxveS9idWlsZC5zaCBvbiAyMDI2LTA1LTMxVDE3OjAwOjUwWiAqLwoidXNlIHN0cmljdCI7CgovKiA9PT09PSBzcmMvanMvdXRpbC5qcyA9PT09PSAqLwoKKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwoKICBmdW5jdGlvbiBzYWZlRGVjb2RlKHMpIHsKICAgIGlmIChzID09IG51bGwpIHJldHVybiAnJzsKICAgIHRyeSB7CgogICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KFN0cmluZyhzKS5yZXBsYWNlKC9cKy9nLCAnICcpKTsKICAgIH0gY2F0Y2ggKF9lKSB7CiAgICAgIHJldHVybiBTdHJpbmcocyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBxcyhoYXNoKSB7CiAgICB2YXIgcmF3ID0gaGFzaCA9PSBudWxsID8gKHdpbmRvdy5sb2NhdGlvbiA/IHdpbmRvdy5sb2NhdGlvbi5oYXNoIDogJycpIDogU3RyaW5nKGhhc2gpOwoKICAgIHZhciBoYXNoSWR4ID0gcmF3LmluZGV4T2YoJyMnKTsKICAgIGlmIChoYXNoSWR4ICE9PSAtMSkgcmF3ID0gcmF3LnNsaWNlKGhhc2hJZHggKyAxKTsKCiAgICB2YXIgcXVlcnlTdHIgPSAnJzsKICAgIHZhciBxSWR4ID0gcmF3LmluZGV4T2YoJz8nKTsKICAgIGlmIChxSWR4ICE9PSAtMSkgewogICAgICBxdWVyeVN0ciA9IHJhdy5zbGljZShxSWR4ICsgMSk7CiAgICAgIHJhdyA9IHJhdy5zbGljZSgwLCBxSWR4KTsKICAgIH0KCiAgICB2YXIgcm91dGUgPSByYXcucmVwbGFjZSgvXlwvKy8sICcnKS5yZXBsYWNlKC9cLyskLywgJycpOwogICAgaWYgKHJvdXRlID09PSAnJykgcm91dGUgPSAnY3JlYXRlJzsKCiAgICB2YXIgcGFyYW1zID0ge307CiAgICBpZiAocXVlcnlTdHIpIHsKICAgICAgdmFyIHBhaXJzID0gcXVlcnlTdHIuc3BsaXQoJyYnKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBwYWlyID0gcGFpcnNbaV07CiAgICAgICAgaWYgKCFwYWlyKSBjb250aW51ZTsKICAgICAgICB2YXIgZXEgPSBwYWlyLmluZGV4T2YoJz0nKTsKICAgICAgICB2YXIga2V5LCB2YWw7CiAgICAgICAgaWYgKGVxID09PSAtMSkgewogICAgICAgICAga2V5ID0gc2FmZURlY29kZShwYWlyKTsKICAgICAgICAgIHZhbCA9ICcnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBrZXkgPSBzYWZlRGVjb2RlKHBhaXIuc2xpY2UoMCwgZXEpKTsKICAgICAgICAgIHZhbCA9IHNhZmVEZWNvZGUocGFpci5zbGljZShlcSArIDEpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGtleSkgcGFyYW1zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4geyByb3V0ZTogcm91dGUsIHBhcmFtczogcGFyYW1zIH07CiAgfQoKICBmdW5jdGlvbiBxc1N0cmluZyhwYXJhbXMpIHsKICAgIGlmICghcGFyYW1zKSByZXR1cm4gJyc7CiAgICB2YXIgcGFydHMgPSBbXTsKICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocGFyYW1zKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgayA9IGtleXNbaV07CiAgICAgIHZhciB2ID0gcGFyYW1zW2tdOwogICAgICBpZiAodiA9PSBudWxsKSBjb250aW51ZTsKICAgICAgcGFydHMucHVzaChlbmNvZGVVUklDb21wb25lbnQoaykgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKHYpKSk7CiAgICB9CiAgICByZXR1cm4gcGFydHMuam9pbignJicpOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRIYXNoKHJvdXRlLCBwYXJhbXMpIHsKICAgIHZhciByID0gU3RyaW5nKHJvdXRlIHx8ICdjcmVhdGUnKS5yZXBsYWNlKC9eIz9cLz8vLCAnJyk7CiAgICB2YXIgcXVlcnkgPSBxc1N0cmluZyhwYXJhbXMpOwogICAgcmV0dXJuICcjLycgKyByICsgKHF1ZXJ5ID8gJz8nICsgcXVlcnkgOiAnJyk7CiAgfQoKICBmdW5jdGlvbiBkZWJvdW5jZShmbiwgbXMsIGltbWVkaWF0ZSkgewogICAgdmFyIHdhaXQgPSB0eXBlb2YgbXMgPT09ICdudW1iZXInID8gbXMgOiAyMDA7CiAgICB2YXIgdGltZXIgPSBudWxsOwoKICAgIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHsKICAgICAgdmFyIGN0eCA9IHRoaXM7CiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzOwogICAgICB2YXIgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiB0aW1lciA9PT0gbnVsbDsKCiAgICAgIGlmICh0aW1lciAhPT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgICAgaWYgKCFpbW1lZGlhdGUpIGZuLmFwcGx5KGN0eCwgYXJncyk7CiAgICAgIH0sIHdhaXQpOwoKICAgICAgaWYgKGNhbGxOb3cpIGZuLmFwcGx5KGN0eCwgYXJncyk7CiAgICB9CgogICAgZGVib3VuY2VkLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHRpbWVyICE9PSBudWxsKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgIH0KICAgIH07CgogICAgcmV0dXJuIGRlYm91bmNlZDsKICB9CgogIGZ1bmN0aW9uIHNsZWVwKG1zKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBNYXRoLm1heCgwLCBtcyB8IDApKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gdXVpZCgpIHsKICAgIHZhciBjID0gKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0bykgfHwKICAgICAgICAgICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8pIHx8IG51bGw7CgogICAgaWYgKGMgJiYgdHlwZW9mIGMucmFuZG9tVVVJRCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgeyByZXR1cm4gYy5yYW5kb21VVUlEKCk7IH0gY2F0Y2ggKF9lKSB7ICB9CiAgICB9CgogICAgaWYgKGMgJiYgdHlwZW9mIGMuZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgICAgYy5nZXRSYW5kb21WYWx1ZXMoYnl0ZXMpOwoKICAgICAgYnl0ZXNbNl0gPSAoYnl0ZXNbNl0gJiAweDBmKSB8IDB4NDA7CiAgICAgIGJ5dGVzWzhdID0gKGJ5dGVzWzhdICYgMHgzZikgfCAweDgwOwogICAgICB2YXIgaGV4ID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIGhleFtpXSA9IChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zbGljZSgxKTsKICAgICAgdmFyIGIgPSBieXRlczsKICAgICAgcmV0dXJuICgKICAgICAgICBoZXhbYlswXV0gKyBoZXhbYlsxXV0gKyBoZXhbYlsyXV0gKyBoZXhbYlszXV0gKyAnLScgKwogICAgICAgIGhleFtiWzRdXSArIGhleFtiWzVdXSArICctJyArCiAgICAgICAgaGV4W2JbNl1dICsgaGV4W2JbN11dICsgJy0nICsKICAgICAgICBoZXhbYls4XV0gKyBoZXhbYls5XV0gKyAnLScgKwogICAgICAgIGhleFtiWzEwXV0gKyBoZXhbYlsxMV1dICsgaGV4W2JbMTJdXSArIGhleFtiWzEzXV0gKyBoZXhbYlsxNF1dICsgaGV4W2JbMTVdXQogICAgICApOwogICAgfQoKICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjaCkgewogICAgICB2YXIgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDsKICAgICAgdmFyIHYgPSBjaCA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODsKICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzaG9ydElEKGlkKSB7CiAgICBpZiAoIWlkKSByZXR1cm4gJyc7CiAgICByZXR1cm4gU3RyaW5nKGlkKS5yZXBsYWNlKC8tL2csICcnKS5zbGljZSgwLCA4KTsKICB9CgogIGZ1bmN0aW9uIGNsYW1wKG4sIG1pbiwgbWF4KSB7CiAgICB2YXIgbG8gPSBtaW4sIGhpID0gbWF4OwogICAgaWYgKGxvID4gaGkpIHsgdmFyIHQgPSBsbzsgbG8gPSBoaTsgaGkgPSB0OyB9CiAgICBuID0gK247CiAgICBpZiAoIWlzRmluaXRlKG4pKSByZXR1cm4gbG87CiAgICByZXR1cm4gbiA8IGxvID8gbG8gOiBuID4gaGkgPyBoaSA6IG47CiAgfQoKICBmdW5jdGlvbiByYW5kb21TZWVkKCkgewogICAgdmFyIGMgPSAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvKSB8fAogICAgICAgICAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNyeXB0bykgfHwgbnVsbDsKICAgIGlmIChjICYmIHR5cGVvZiBjLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgYXJyID0gbmV3IFVpbnQzMkFycmF5KDEpOwogICAgICBjLmdldFJhbmRvbVZhbHVlcyhhcnIpOwogICAgICByZXR1cm4gYXJyWzBdICUgMTAwMDAwMDsKICAgIH0KICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlRGF0ZSh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gbnVsbDsKICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBpc05hTih2YWx1ZS5nZXRUaW1lKCkpID8gbnVsbCA6IHZhbHVlOwoKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8ICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIC9eXGQrKFwuXGQrKT8kLy50ZXN0KHZhbHVlLnRyaW0oKSkpKSB7CiAgICAgIHZhciBudW0gPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBwYXJzZUZsb2F0KHZhbHVlKTsKICAgICAgaWYgKCFpc0Zpbml0ZShudW0pKSByZXR1cm4gbnVsbDsKCiAgICAgIHZhciBtcyA9IG51bSA8IDFlMTEgPyBudW0gKiAxMDAwIDogbnVtOwogICAgICB2YXIgZE51bSA9IG5ldyBEYXRlKG1zKTsKICAgICAgcmV0dXJuIGlzTmFOKGROdW0uZ2V0VGltZSgpKSA/IG51bGwgOiBkTnVtOwogICAgfQoKICAgIHZhciBzID0gU3RyaW5nKHZhbHVlKS50cmltKCk7CiAgICB2YXIgZCA9IG5ldyBEYXRlKHMpOwogICAgaWYgKCFpc05hTihkLmdldFRpbWUoKSkpIHJldHVybiBkOwoKICAgIHZhciBjb2VyY2VkID0gcy5yZXBsYWNlKCcgJywgJ1QnKTsKICAgIGlmICghL1t6Wl18WystXVxkezJ9Oj9cZHsyfSQvLnRlc3QoY29lcmNlZCkpIGNvZXJjZWQgKz0gJ1onOwogICAgZCA9IG5ldyBEYXRlKGNvZXJjZWQpOwogICAgcmV0dXJuIGlzTmFOKGQuZ2V0VGltZSgpKSA/IG51bGwgOiBkOwogIH0KCiAgdmFyIF9hYnNGbXQgPSBudWxsOwogIGZ1bmN0aW9uIGFic29sdXRlRm9ybWF0dGVyKCkgewogICAgaWYgKF9hYnNGbXQgIT09IG51bGwpIHJldHVybiBfYWJzRm10OwogICAgdHJ5IHsKICAgICAgX2Fic0ZtdCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHVuZGVmaW5lZCwgewogICAgICAgIHllYXI6ICdudW1lcmljJywgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLAogICAgICAgIGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcKICAgICAgfSk7CiAgICB9IGNhdGNoIChfZSkgewogICAgICBfYWJzRm10ID0gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gX2Fic0ZtdDsKICB9CgogIGZ1bmN0aW9uIGZtdERhdGUodmFsdWUsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGQgPSBwYXJzZURhdGUodmFsdWUpOwogICAgaWYgKCFkKSByZXR1cm4gJyc7CgogICAgdmFyIG5vd01zID0gb3B0cy5ub3cgIT0gbnVsbCA/IChvcHRzLm5vdyBpbnN0YW5jZW9mIERhdGUgPyBvcHRzLm5vdy5nZXRUaW1lKCkgOiArb3B0cy5ub3cpIDogRGF0ZS5ub3coKTsKICAgIHZhciBkaWZmID0gbm93TXMgLSBkLmdldFRpbWUoKTsKCiAgICBpZiAob3B0cy5hYnNvbHV0ZSkgcmV0dXJuIGZvcm1hdEFic29sdXRlKGQpOwoKICAgIHZhciByZWwgPSBmb3JtYXRSZWxhdGl2ZShkaWZmKTsKICAgIGlmIChvcHRzLnJlbGF0aXZlKSByZXR1cm4gcmVsOwoKICAgIHZhciBTRVZFTl9EQVlTID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7CiAgICBpZiAoTWF0aC5hYnMoZGlmZikgPCBTRVZFTl9EQVlTKSByZXR1cm4gcmVsOwogICAgcmV0dXJuIGZvcm1hdEFic29sdXRlKGQpOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0QWJzb2x1dGUoZCkgewogICAgdmFyIGZtdCA9IGFic29sdXRlRm9ybWF0dGVyKCk7CiAgICBpZiAoZm10KSB7CiAgICAgIHRyeSB7IHJldHVybiBmbXQuZm9ybWF0KGQpOyB9IGNhdGNoIChfZSkgeyAgfQogICAgfQoKICAgIHJldHVybiBkLnRvTG9jYWxlU3RyaW5nCiAgICAgID8gZC50b0xvY2FsZVN0cmluZygpCiAgICAgIDogZC50b0lTT1N0cmluZygpLnJlcGxhY2UoJ1QnLCAnICcpLnNsaWNlKDAsIDE2KTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlKGRpZmZNcykgewogICAgdmFyIGZ1dHVyZSA9IGRpZmZNcyA8IDA7CiAgICB2YXIgbXMgPSBNYXRoLmFicyhkaWZmTXMpOwogICAgdmFyIHMgPSBNYXRoLnJvdW5kKG1zIC8gMTAwMCk7CgogICAgaWYgKHMgPCA1KSByZXR1cm4gJ2p1c3Qgbm93JzsKICAgIGlmIChzIDwgNjApIHJldHVybiBzdWZmaXgocyArICdzJywgZnV0dXJlKTsKCiAgICB2YXIgbSA9IE1hdGgucm91bmQocyAvIDYwKTsKICAgIGlmIChtIDwgNjApIHJldHVybiBzdWZmaXgobSArICdtJywgZnV0dXJlKTsKCiAgICB2YXIgaCA9IE1hdGgucm91bmQobSAvIDYwKTsKICAgIGlmIChoIDwgMjQpIHJldHVybiBzdWZmaXgoaCArICdoJywgZnV0dXJlKTsKCiAgICB2YXIgZHlzID0gTWF0aC5yb3VuZChoIC8gMjQpOwogICAgaWYgKGR5cyA8IDcpIHJldHVybiBzdWZmaXgoZHlzICsgJ2QnLCBmdXR1cmUpOwoKICAgIHZhciB3ID0gTWF0aC5yb3VuZChkeXMgLyA3KTsKICAgIGlmICh3IDwgNSkgcmV0dXJuIHN1ZmZpeCh3ICsgJ3cnLCBmdXR1cmUpOwoKICAgIHZhciBtbyA9IE1hdGgucm91bmQoZHlzIC8gMzApOwogICAgaWYgKG1vIDwgMTIpIHJldHVybiBzdWZmaXgobW8gKyAnbW8nLCBmdXR1cmUpOwoKICAgIHZhciB5ID0gTWF0aC5yb3VuZChkeXMgLyAzNjUpOwogICAgcmV0dXJuIHN1ZmZpeCh5ICsgJ3knLCBmdXR1cmUpOwogIH0KCiAgZnVuY3Rpb24gc3VmZml4KGNvcmUsIGZ1dHVyZSkgewogICAgcmV0dXJuIGZ1dHVyZSA/ICdpbiAnICsgY29yZSA6IGNvcmUgKyAnIGFnbyc7CiAgfQoKICBmdW5jdGlvbiBpc29EYXRlKHZhbHVlKSB7CiAgICB2YXIgZCA9IHZhbHVlID09IG51bGwgPyBuZXcgRGF0ZSgpIDogcGFyc2VEYXRlKHZhbHVlKTsKICAgIGlmICghZCkgcmV0dXJuICcnOwoKICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXC5cZHszfVokLywgJ1onKTsKICB9CgogIGZ1bmN0aW9uIGI2NChzdHIpIHsKICAgIHZhciBzID0gc3RyID09IG51bGwgPyAnJyA6IFN0cmluZyhzdHIpOwoKICAgIHRyeSB7CiAgICAgIGlmICh0eXBlb2YgYnRvYSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHZhciBiaW4gPSBlbmNvZGVVUklDb21wb25lbnQocykucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZywgZnVuY3Rpb24gKF9tLCBoZXgpIHsKICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGhleCwgMTYpKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gYnRvYShiaW4pOwogICAgICB9CiAgICB9IGNhdGNoIChfZSkgeyAgfQoKICAgIHJldHVybiBieXRlc1RvQmFzZTY0KHV0ZjhCeXRlcyhzKSk7CiAgfQoKICBmdW5jdGlvbiB1bmI2NChiKSB7CiAgICB2YXIgcyA9IGIgPT0gbnVsbCA/ICcnIDogU3RyaW5nKGIpOwogICAgdHJ5IHsKICAgICAgaWYgKHR5cGVvZiBhdG9iID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdmFyIGJpbiA9IGF0b2Iocyk7CiAgICAgICAgdmFyIHBjdCA9ICcnOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmluLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBwY3QgKz0gJyUnICsgKCcwMCcgKyBiaW4uY2hhckNvZGVBdChpKS50b1N0cmluZygxNikpLnNsaWNlKC0yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChwY3QpOwogICAgICB9CiAgICB9IGNhdGNoIChfZSkgeyAgfQogICAgcmV0dXJuIGJhc2U2NFRvVXRmOChzKTsKICB9CgogIGZ1bmN0aW9uIHV0ZjhCeXRlcyhzdHIpIHsKICAgIGlmICh0eXBlb2YgVGV4dEVuY29kZXIgPT09ICdmdW5jdGlvbicpIHJldHVybiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTsKCiAgICB2YXIgb3V0ID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICBpZiAoYyA8IDB4ODApIG91dC5wdXNoKGMpOwogICAgICBlbHNlIGlmIChjIDwgMHg4MDApIHsKICAgICAgICBvdXQucHVzaCgweGMwIHwgKGMgPj4gNiksIDB4ODAgfCAoYyAmIDB4M2YpKTsKICAgICAgfSBlbHNlIGlmIChjID49IDB4ZDgwMCAmJiBjIDw9IDB4ZGJmZikgewogICAgICAgIHZhciBjMiA9IHN0ci5jaGFyQ29kZUF0KCsraSk7CiAgICAgICAgdmFyIGNwID0gMHgxMDAwMCArICgoKGMgJiAweDNmZikgPDwgMTApIHwgKGMyICYgMHgzZmYpKTsKICAgICAgICBvdXQucHVzaCgweGYwIHwgKGNwID4+IDE4KSwgMHg4MCB8ICgoY3AgPj4gMTIpICYgMHgzZiksIDB4ODAgfCAoKGNwID4+IDYpICYgMHgzZiksIDB4ODAgfCAoY3AgJiAweDNmKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3V0LnB1c2goMHhlMCB8IChjID4+IDEyKSwgMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpLCAweDgwIHwgKGMgJiAweDNmKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgVWludDhBcnJheShvdXQpOwogIH0KCiAgdmFyIEI2NF9DSEFSUyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJzsKCiAgZnVuY3Rpb24gYnl0ZXNUb0Jhc2U2NChieXRlcykgewogICAgdmFyIG91dCA9ICcnOwogICAgdmFyIGk7CiAgICBmb3IgKGkgPSAwOyBpICsgMiA8IGJ5dGVzLmxlbmd0aDsgaSArPSAzKSB7CiAgICAgIHZhciBuID0gKGJ5dGVzW2ldIDw8IDE2KSB8IChieXRlc1tpICsgMV0gPDwgOCkgfCBieXRlc1tpICsgMl07CiAgICAgIG91dCArPSBCNjRfQ0hBUlNbKG4gPj4gMTgpICYgNjNdICsgQjY0X0NIQVJTWyhuID4+IDEyKSAmIDYzXSArIEI2NF9DSEFSU1sobiA+PiA2KSAmIDYzXSArIEI2NF9DSEFSU1tuICYgNjNdOwogICAgfQogICAgdmFyIHJlbSA9IGJ5dGVzLmxlbmd0aCAtIGk7CiAgICBpZiAocmVtID09PSAxKSB7CiAgICAgIHZhciBhID0gYnl0ZXNbaV0gPDwgMTY7CiAgICAgIG91dCArPSBCNjRfQ0hBUlNbKGEgPj4gMTgpICYgNjNdICsgQjY0X0NIQVJTWyhhID4+IDEyKSAmIDYzXSArICc9PSc7CiAgICB9IGVsc2UgaWYgKHJlbSA9PT0gMikgewogICAgICB2YXIgYiA9IChieXRlc1tpXSA8PCAxNikgfCAoYnl0ZXNbaSArIDFdIDw8IDgpOwogICAgICBvdXQgKz0gQjY0X0NIQVJTWyhiID4+IDE4KSAmIDYzXSArIEI2NF9DSEFSU1soYiA+PiAxMikgJiA2M10gKyBCNjRfQ0hBUlNbKGIgPj4gNikgJiA2M10gKyAnPSc7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KCiAgZnVuY3Rpb24gYmFzZTY0VG9VdGY4KGIpIHsKICAgIHZhciBjbGVhbiA9IGIucmVwbGFjZSgvW15BLVphLXowLTkrLz1dL2csICcnKTsKICAgIHZhciBieXRlcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGVhbi5sZW5ndGg7IGkgKz0gNCkgewogICAgICB2YXIgZTAgPSBCNjRfQ0hBUlMuaW5kZXhPZihjbGVhbltpXSk7CiAgICAgIHZhciBlMSA9IEI2NF9DSEFSUy5pbmRleE9mKGNsZWFuW2kgKyAxXSk7CiAgICAgIHZhciBlMiA9IGNsZWFuW2kgKyAyXSA9PT0gJz0nID8gLTEgOiBCNjRfQ0hBUlMuaW5kZXhPZihjbGVhbltpICsgMl0pOwogICAgICB2YXIgZTMgPSBjbGVhbltpICsgM10gPT09ICc9JyA/IC0xIDogQjY0X0NIQVJTLmluZGV4T2YoY2xlYW5baSArIDNdKTsKICAgICAgdmFyIG4gPSAoZTAgPDwgMTgpIHwgKGUxIDw8IDEyKSB8ICgoZTIgPCAwID8gMCA6IGUyKSA8PCA2KSB8IChlMyA8IDAgPyAwIDogZTMpOwogICAgICBieXRlcy5wdXNoKChuID4+IDE2KSAmIDB4ZmYpOwogICAgICBpZiAoZTIgPj0gMCkgYnl0ZXMucHVzaCgobiA+PiA4KSAmIDB4ZmYpOwogICAgICBpZiAoZTMgPj0gMCkgYnl0ZXMucHVzaChuICYgMHhmZik7CiAgICB9CiAgICBpZiAodHlwZW9mIFRleHREZWNvZGVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKG5ldyBVaW50OEFycmF5KGJ5dGVzKSk7CiAgICB2YXIgc3RyID0gJyc7CiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGJ5dGVzLmxlbmd0aDsgaisrKSBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tqXSk7CiAgICB0cnkgeyByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShzdHIpKTsgfSBjYXRjaCAoX2UpIHsgcmV0dXJuIHN0cjsgfQogIH0KCiAgZnVuY3Rpb24gYmFzaWNBdXRoSGVhZGVyKGVtYWlsLCBwdykgewogICAgdmFyIGUgPSAoZW1haWwgPT0gbnVsbCA/ICcnIDogU3RyaW5nKGVtYWlsKSkudG9Mb3dlckNhc2UoKTsKICAgIHZhciBwID0gcHcgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHB3KTsKICAgIHJldHVybiAnQmFzaWMgJyArIGI2NChlICsgJzonICsgcCk7CiAgfQoKICB2YXIgSFRNTF9FU0NBUEVTID0gewogICAgJyYnOiAnJmFtcDsnLAogICAgJzwnOiAnJmx0OycsCiAgICAnPic6ICcmZ3Q7JywKICAgICciJzogJyZxdW90OycsCiAgICAiJyI6ICcmIzM5OycsCiAgICAnYCc6ICcmIzk2OycsCiAgICAnPSc6ICcmIzYxOycKICB9OwoKICBmdW5jdGlvbiBlc2NhcGVIdG1sKHMpIHsKICAgIGlmIChzID09IG51bGwpIHJldHVybiAnJzsKICAgIHJldHVybiBTdHJpbmcocykucmVwbGFjZSgvWyY8PiInYD1dL2csIGZ1bmN0aW9uIChjaCkgewogICAgICByZXR1cm4gSFRNTF9FU0NBUEVTW2NoXTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZG93bmxvYWQodXJsLCBmaWxlbmFtZSkgewogICAgaWYgKCF1cmwpIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ2Rvd25sb2FkOiBtaXNzaW5nIHVybCcpKTsKICAgIHZhciBuYW1lID0gZmlsZW5hbWUgfHwgaW5mZXJGaWxlbmFtZSh1cmwpOwoKICAgIHJldHVybiBmZXRjaCh1cmwsIHsgbW9kZTogJ2NvcnMnLCBjcmVkZW50aWFsczogJ29taXQnIH0pCiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKCdkb3dubG9hZDogSFRUUCAnICsgcmVzLnN0YXR1cyk7CiAgICAgICAgcmV0dXJuIHJlcy5ibG9iKCk7CiAgICAgIH0pCiAgICAgIC50aGVuKGZ1bmN0aW9uIChibG9iKSB7CgogICAgICAgIGlmIChuYW1lLmluZGV4T2YoJy4nKSA9PT0gLTEpIHsKICAgICAgICAgIHZhciBleHQgPSBleHRGb3JNaW1lKGJsb2IudHlwZSk7CiAgICAgICAgICBpZiAoZXh0KSBuYW1lICs9ICcuJyArIGV4dDsKICAgICAgICB9CiAgICAgICAgdHJpZ2dlckJsb2JEb3dubG9hZChibG9iLCBuYW1lKTsKICAgICAgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciB3ID0gd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJywgJ25vb3BlbmVyJyk7CiAgICAgICAgICBpZiAodykgcmV0dXJuOwogICAgICAgIH0gY2F0Y2ggKF9lKSB7ICB9CiAgICAgICAgdGhyb3cgZXJyOwogICAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHRyaWdnZXJCbG9iRG93bmxvYWQoYmxvYiwgbmFtZSkgewogICAgdmFyIG9ialVSTCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CiAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgIGEuaHJlZiA9IG9ialVSTDsKICAgIGEuZG93bmxvYWQgPSBuYW1lIHx8ICdkb3dubG9hZCc7CiAgICBhLnJlbCA9ICdub29wZW5lcic7CiAgICBhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOwogICAgYS5jbGljaygpOwoKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwogICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKG9ialVSTCk7CiAgICB9LCAxNTAwKTsKICB9CgogIGZ1bmN0aW9uIGluZmVyRmlsZW5hbWUodXJsKSB7CiAgICB0cnkgewogICAgICB2YXIgdSA9IG5ldyBVUkwodXJsLCB3aW5kb3cubG9jYXRpb24gPyB3aW5kb3cubG9jYXRpb24uaHJlZiA6IHVuZGVmaW5lZCk7CiAgICAgIHZhciBsYXN0ID0gdS5wYXRobmFtZS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5wb3AoKTsKICAgICAgaWYgKGxhc3QpIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQobGFzdCk7CiAgICB9IGNhdGNoIChfZSkgeyAgfQogICAgdmFyIHN0cmlwcGVkID0gU3RyaW5nKHVybCkuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdOwogICAgdmFyIHNlZyA9IHN0cmlwcGVkLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pLnBvcCgpOwogICAgcmV0dXJuIHNlZyB8fCAoJ3ZhbXAtJyArIERhdGUubm93KCkpOwogIH0KCiAgZnVuY3Rpb24gZXh0Rm9yTWltZShtaW1lKSB7CiAgICBzd2l0Y2ggKG1pbWUpIHsKICAgICAgY2FzZSAnaW1hZ2UvanBlZyc6IHJldHVybiAnanBnJzsKICAgICAgY2FzZSAnaW1hZ2UvcG5nJzogcmV0dXJuICdwbmcnOwogICAgICBjYXNlICdpbWFnZS93ZWJwJzogcmV0dXJuICd3ZWJwJzsKICAgICAgY2FzZSAnaW1hZ2UvZ2lmJzogcmV0dXJuICdnaWYnOwogICAgICBjYXNlICdpbWFnZS9oZWljJzogcmV0dXJuICdoZWljJzsKICAgICAgY2FzZSAndmlkZW8vbXA0JzogcmV0dXJuICdtcDQnOwogICAgICBjYXNlICd2aWRlby9xdWlja3RpbWUnOiByZXR1cm4gJ21vdic7CiAgICAgIGNhc2UgJ3ZpZGVvL3dlYm0nOiByZXR1cm4gJ3dlYm0nOwogICAgICBkZWZhdWx0OiByZXR1cm4gJyc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb3B5KHRleHQpIHsKICAgIHZhciBzID0gdGV4dCA9PSBudWxsID8gJycgOiBTdHJpbmcodGV4dCk7CiAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCAmJiB3aW5kb3cuaXNTZWN1cmVDb250ZXh0KSB7CiAgICAgIHJldHVybiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0sIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gbGVnYWN5Q29weShzKTsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGxlZ2FjeUNvcHkocykpOwogIH0KCiAgZnVuY3Rpb24gbGVnYWN5Q29weShzKSB7CiAgICB0cnkgewogICAgICB2YXIgdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogICAgICB0YS52YWx1ZSA9IHM7CiAgICAgIHRhLnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAnJyk7CiAgICAgIHRhLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJzsKICAgICAgdGEuc3R5bGUudG9wID0gJy0xMDAwcHgnOwogICAgICB0YS5zdHlsZS5vcGFjaXR5ID0gJzAnOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhKTsKICAgICAgdGEuc2VsZWN0KCk7CiAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKDAsIHMubGVuZ3RoKTsKICAgICAgdmFyIG9rID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQgJiYgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsKICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0YSk7CiAgICAgIHJldHVybiAhIW9rOwogICAgfSBjYXRjaCAoX2UpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZGF0YVVSTFRvQmxvYihkYXRhVVJMKSB7CiAgICB2YXIgcGFydHMgPSBTdHJpbmcoZGF0YVVSTCkuc3BsaXQoJywnKTsKICAgIHZhciBoZWFkZXIgPSBwYXJ0c1swXSB8fCAnJzsKICAgIHZhciBib2R5ID0gcGFydHNbMV0gfHwgJyc7CiAgICB2YXIgbWltZU1hdGNoID0gaGVhZGVyLm1hdGNoKC9kYXRhOihbXjtdKykvKTsKICAgIHZhciBtaW1lID0gbWltZU1hdGNoID8gbWltZU1hdGNoWzFdIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICB2YXIgaXNCYXNlNjQgPSAvO2Jhc2U2NC9pLnRlc3QoaGVhZGVyKTsKICAgIHZhciBiaW5hcnkgPSBpc0Jhc2U2NCA/IGF0b2IoYm9keSkgOiBkZWNvZGVVUklDb21wb25lbnQoYm9keSk7CiAgICB2YXIgbGVuID0gYmluYXJ5Lmxlbmd0aDsKICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBieXRlc1tpXSA9IGJpbmFyeS5jaGFyQ29kZUF0KGkpOwogICAgcmV0dXJuIG5ldyBCbG9iKFtieXRlc10sIHsgdHlwZTogbWltZSB9KTsKICB9CgogIGZ1bmN0aW9uIGJsb2JUb0RhdGFVUkwoYmxvYikgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGZyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgZnIub25sb2FkID0gZnVuY3Rpb24gKCkgeyByZXNvbHZlKGZyLnJlc3VsdCk7IH07CiAgICAgIGZyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJlamVjdChmci5lcnJvciB8fCBuZXcgRXJyb3IoJ0ZpbGVSZWFkZXIgZmFpbGVkJykpOyB9OwogICAgICBmci5yZWFkQXNEYXRhVVJMKGJsb2IpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBieXRlc1RvQmxvYihieXRlcywgbWltZSkgewogICAgcmV0dXJuIG5ldyBCbG9iKFtieXRlc10sIHsgdHlwZTogbWltZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9KTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdEJ5dGVzKG4pIHsKICAgIG4gPSArbjsKICAgIGlmICghaXNGaW5pdGUobikgfHwgbiA8PSAwKSByZXR1cm4gJzAgQic7CiAgICB2YXIgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInXTsKICAgIHZhciBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhuKSAvIE1hdGgubG9nKDEwMjQpKTsKICAgIGkgPSBjbGFtcChpLCAwLCB1bml0cy5sZW5ndGggLSAxKTsKICAgIHZhciB2YWwgPSBuIC8gTWF0aC5wb3coMTAyNCwgaSk7CiAgICB2YXIgc3RyID0gaSA9PT0gMCA/IFN0cmluZyh2YWwpIDogdmFsLnRvRml4ZWQodmFsIDwgMTAgPyAxIDogMCk7CiAgICByZXR1cm4gc3RyICsgJyAnICsgdW5pdHNbaV07CiAgfQoKICBmdW5jdGlvbiBwbHVyYWxpemUobiwgb25lLCBtYW55KSB7CiAgICB2YXIgY291bnQgPSBuIHwgMDsKICAgIHZhciB3b3JkID0gY291bnQgPT09IDEgPyBvbmUgOiAobWFueSB8fCBvbmUgKyAncycpOwogICAgcmV0dXJuIGNvdW50ICsgJyAnICsgd29yZDsKICB9CgogIGZ1bmN0aW9uIHRydW5jYXRlKHMsIG1heCkgewogICAgaWYgKHMgPT0gbnVsbCkgcmV0dXJuICcnOwogICAgcyA9IFN0cmluZyhzKTsKICAgIHZhciBsaW1pdCA9IG1heCB8IDA7CiAgICBpZiAobGltaXQgPD0gMCB8fCBzLmxlbmd0aCA8PSBsaW1pdCkgcmV0dXJuIHM7CiAgICByZXR1cm4gcy5zbGljZSgwLCBNYXRoLm1heCgwLCBsaW1pdCAtIDEpKS5yZXBsYWNlKC9ccyskLywgJycpICsgJ+KApic7CiAgfQoKICBmdW5jdGlvbiBpc0VtYWlsKHMpIHsKICAgIGlmICghcykgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIC9eW15cc0BdK0BbXlxzQF0rXC5bXlxzQF0rJC8udGVzdChTdHJpbmcocykudHJpbSgpKTsKICB9CgogIFYudXRpbCA9IHsKCiAgICBxczogcXMsCiAgICBxc1N0cmluZzogcXNTdHJpbmcsCiAgICBidWlsZEhhc2g6IGJ1aWxkSGFzaCwKCiAgICBkZWJvdW5jZTogZGVib3VuY2UsCiAgICBzbGVlcDogc2xlZXAsCgogICAgdXVpZDogdXVpZCwKICAgIHNob3J0SUQ6IHNob3J0SUQsCgogICAgY2xhbXA6IGNsYW1wLAogICAgcmFuZG9tU2VlZDogcmFuZG9tU2VlZCwKCiAgICBmbXREYXRlOiBmbXREYXRlLAogICAgcGFyc2VEYXRlOiBwYXJzZURhdGUsCiAgICBpc29EYXRlOiBpc29EYXRlLAoKICAgIGI2NDogYjY0LAogICAgdW5iNjQ6IHVuYjY0LAogICAgYmFzaWNBdXRoSGVhZGVyOiBiYXNpY0F1dGhIZWFkZXIsCgogICAgZXNjYXBlSHRtbDogZXNjYXBlSHRtbCwKICAgIGVzY2FwZUF0dHI6IGVzY2FwZUh0bWwsCgogICAgZG93bmxvYWQ6IGRvd25sb2FkLAogICAgY29weTogY29weSwKCiAgICBkYXRhVVJMVG9CbG9iOiBkYXRhVVJMVG9CbG9iLAogICAgYmxvYlRvRGF0YVVSTDogYmxvYlRvRGF0YVVSTCwKICAgIGJ5dGVzVG9CbG9iOiBieXRlc1RvQmxvYiwKCiAgICBmb3JtYXRCeXRlczogZm9ybWF0Qnl0ZXMsCiAgICBwbHVyYWxpemU6IHBsdXJhbGl6ZSwKICAgIHRydW5jYXRlOiB0cnVuY2F0ZSwKICAgIGlzRW1haWw6IGlzRW1haWwKICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9zdG9yZS5qcyA9PT09PSAqLwoKKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwoKICBmdW5jdGlvbiByZXNvbHZlQVBJQmFzZSgpIHsKICAgIHRyeSB7CiAgICAgIHZhciBoID0gKHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpIHx8ICcnOwogICAgICBpZiAoLyhefFwuKXZvb3NleVwuY29tJC9pLnRlc3QoaCkpIHJldHVybiAnJzsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgICByZXR1cm4gJ2h0dHBzOi8vYXBpLnZvb3NleS5jb20nOwogIH0KICBWLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oCiAgICB7CiAgICAgIEFQSTogcmVzb2x2ZUFQSUJhc2UoKSwKICAgICAgQ0ROOiAnaHR0cHM6Ly9jZG4udm9vc2V5LmNvbScsCiAgICAgIEFQUF9TVE9SRV9VUkw6ICdodHRwczovL2FwcHMuYXBwbGUuY29tL3VzL2FwcC92YW1wL2lkNjc0ODY1NzY4NScsCiAgICAgIEFVVEhfVklERU86ICdodHRwczovL2Nkbi52b29zZXkuY29tL21lZGlhLzA4MzEyNS0zLm1wNCcsCiAgICAgIERFTU9fVklERU86ICdodHRwczovL2Nkbi52b29zZXkuY29tL21lZGlhLzA4MzEyNS0zLm1wNCcKICAgIH0sCiAgICBWLmNvbmZpZyB8fCB7fQogICk7CgogIHZhciBTVE9SQUdFX1BSRUZJWCA9ICd2YW1wX3dlYl8nOwoKICB2YXIgUEVSU0lTVF9XSElURUxJU1QgPSBbJ3NldHRpbmdzJywgJ2luZHVzdHJpZXMnLCAnb25ib2FyZGluZ0RvbmUnLCAnY3VzdG9tUHJlc2V0cyddOwoKICBmdW5jdGlvbiBkZWZhdWx0U2V0dGluZ3MoKSB7CiAgICByZXR1cm4gewogICAgICBkZWZhdWx0TW9kZWw6ICdmbHV4S2xlaW4nLAogICAgICBkZWZhdWx0QXNwZWN0OiAnYXV0bycsCiAgICAgIGRlZmF1bHRDb3VudDogMSwKICAgICAgdGhlbWU6ICdzeXN0ZW0nLAogICAgICBhdXRvQmVmb3JlQWZ0ZXI6IHRydWUsCiAgICAgIHJlZHVjZU1vdGlvbjogZmFsc2UsCiAgICAgIGJyYW5kaW5nOiB0cnVlLAogICAgICB0YWdsaW5lOiAnJywKICAgICAgc2hhcmVUZW1wbGF0ZTogJ2JlZm9yZS1hZnRlcicsCiAgICAgIHNhdmVPcmlnaW5hbHM6IHRydWUKICAgIH07CiAgfQoKICBWLnN0YXRlID0gT2JqZWN0LmFzc2lnbigKICAgIHsKCiAgICAgIHVzZXI6IG51bGwsCiAgICAgIGNyZWRpdHM6IDAsCgogICAgICByb3V0ZTogJ2NyZWF0ZScsCiAgICAgIHBhcmFtczoge30sCiAgICAgIHByZXZpb3VzUm91dGU6IG51bGwsCgogICAgICBsaWJyYXJ5OiBbXSwKICAgICAgbGlicmFyeVBhZ2U6IDEsCiAgICAgIGxpYnJhcnlIYXNNb3JlOiB0cnVlLAogICAgICBmYXZvcml0ZXM6IFtdLAogICAgICBmZWVkOiBbXSwKICAgICAgZmVlZFBhZ2U6IDEsCiAgICAgIGZlZWRIYXNNb3JlOiB0cnVlLAogICAgICBmb2xkZXJzOiBbXSwKCiAgICAgIHByZXNldHM6IFtdLAogICAgICBjdXN0b21QcmVzZXRzOiBbXSwKCiAgICAgIGluZHVzdHJpZXM6IFtdLAogICAgICBvbmJvYXJkaW5nRG9uZTogZmFsc2UsCgogICAgICBkcmFmdDogewogICAgICAgIHByb21wdDogJycsCiAgICAgICAgbmVnYXRpdmVQcm9tcHQ6ICcnLAogICAgICAgIG1vZGVsOiAnZmx1eEtsZWluJywKICAgICAgICBhc3BlY3Q6ICdhdXRvJywKICAgICAgICBzZWVkOiBudWxsLAogICAgICAgIGNvdW50OiAxLAogICAgICAgIHByZXNldElEOiBudWxsLAogICAgICAgIGltYWdlVVJMczogW10KICAgICAgfSwKCiAgICAgIGdlbmVyYXRpbmc6IGZhbHNlLAogICAgICBwcm9ncmVzczogMCwKICAgICAgdXBsb2FkaW5nOiBmYWxzZSwKICAgICAgdXBsb2FkUHJvZ3Jlc3M6IDAsCiAgICAgIGRyYXdlck9wZW46IGZhbHNlLAogICAgICBib290ZWQ6IGZhbHNlLAoKICAgICAgc2V0dGluZ3M6IGRlZmF1bHRTZXR0aW5ncygpCiAgICB9LAogICAgVi5zdGF0ZSB8fCB7fQogICk7CgogIFYuc3RhdGUuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKGRlZmF1bHRTZXR0aW5ncygpLCBWLnN0YXRlLnNldHRpbmdzIHx8IHt9KTsKCiAgVi5hcGkgPSBWLmFwaSB8fCB7fTsKICBWLmF1dGggPSBWLmF1dGggfHwge307CiAgVi5kYXRhID0gVi5kYXRhIHx8IHsgc3dpenpsZXM6IFtdLCBtb2RlbHM6IFtdLCBhc3BlY3RzOiBbXSwgaW5kdXN0cmllczogW10gfTsKICBWLnVpID0gVi51aSB8fCB7fTsKICBWLnZpZXdzID0gVi52aWV3cyB8fCB7fTsKICBWLnJvdXRlciA9IFYucm91dGVyIHx8IHt9OwogIFYudXRpbCA9IFYudXRpbCB8fCB7fTsKCiAgdmFyIEVWRU5UUyA9IE9iamVjdC5mcmVlemUoewogICAgQVVUSF9DSEFOR0VEOiAnYXV0aDpjaGFuZ2VkJywKICAgIENSRURJVFNfQ0hBTkdFRDogJ2NyZWRpdHM6Y2hhbmdlZCcsCiAgICBST1VURV9DSEFOR0VEOiAncm91dGU6Y2hhbmdlZCcsCiAgICBMSUJSQVJZX0NIQU5HRUQ6ICdsaWJyYXJ5OmNoYW5nZWQnLAogICAgVE9BU1Q6ICd0b2FzdCcsCiAgICBFUlJPUjogJ2Vycm9yJwogIH0pOwoKICB2YXIgbGlzdGVuZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgZnVuY3Rpb24gaXNTdG9yYWdlQXZhaWxhYmxlKCkgewogICAgdHJ5IHsKICAgICAgdmFyIGsgPSBTVE9SQUdFX1BSRUZJWCArICdfX3Byb2JlX18nOwogICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oaywgJzEnKTsKICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGspOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICB2YXIgU1RPUkFHRV9PSyA9IGlzU3RvcmFnZUF2YWlsYWJsZSgpOwoKICBWLnN0b3JlID0gewoKICAgIGV2ZW50czogRVZFTlRTLAogICAgcHJlZml4OiBTVE9SQUdFX1BSRUZJWCwKCiAgICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHsKICAgICAgcmV0dXJuIFYuc3RhdGVba2V5XTsKICAgIH0sCgogICAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICB2YXIgcHJldiA9IFYuc3RhdGVba2V5XTsKICAgICAgVi5zdGF0ZVtrZXldID0gdmFsdWU7CgogICAgICB0aGlzLmVtaXQoa2V5LCB2YWx1ZSk7CgogICAgICBpZiAoa2V5ID09PSAnY3JlZGl0cycpIHRoaXMuZW1pdChFVkVOVFMuQ1JFRElUU19DSEFOR0VELCB2YWx1ZSk7CiAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ3VzZXInKSB0aGlzLmVtaXQoRVZFTlRTLkFVVEhfQ0hBTkdFRCwgdmFsdWUpOwogICAgICBlbHNlIGlmIChrZXkgPT09ICdyb3V0ZScpIHRoaXMuZW1pdChFVkVOVFMuUk9VVEVfQ0hBTkdFRCwgdmFsdWUpOwogICAgICBlbHNlIGlmIChrZXkgPT09ICdsaWJyYXJ5JykgdGhpcy5lbWl0KEVWRU5UUy5MSUJSQVJZX0NIQU5HRUQsIHZhbHVlKTsKCiAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJywgeyBrZXk6IGtleSwgdmFsdWU6IHZhbHVlLCBwcmV2aW91czogcHJldiB9KTsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfSwKCiAgICBwYXRjaDogZnVuY3Rpb24gKG9iaikgewogICAgICBpZiAoIW9iaikgcmV0dXJuOwogICAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrKSkgdGhpcy5zZXQoaywgb2JqW2tdKTsKICAgICAgfQogICAgfSwKCiAgICBvbjogZnVuY3Rpb24gKGV2ZW50LCBjYikgewogICAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZnVuY3Rpb24gKCkge307CiAgICAgIChsaXN0ZW5lcnNbZXZlbnRdIHx8IChsaXN0ZW5lcnNbZXZlbnRdID0gW10pKS5wdXNoKGNiKTsKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICByZXR1cm4gZnVuY3Rpb24gb2ZmKCkgewogICAgICAgIHNlbGYub2ZmKGV2ZW50LCBjYik7CiAgICAgIH07CiAgICB9LAoKICAgIG9uY2U6IGZ1bmN0aW9uIChldmVudCwgY2IpIHsKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICB2YXIgb2ZmID0gdGhpcy5vbihldmVudCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICBvZmYoKTsKICAgICAgICBjYihkYXRhKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBvZmY7CiAgICB9LAoKICAgIG9mZjogZnVuY3Rpb24gKGV2ZW50LCBjYikgewogICAgICB2YXIgYXJyID0gbGlzdGVuZXJzW2V2ZW50XTsKICAgICAgaWYgKCFhcnIpIHJldHVybjsKICAgICAgaWYgKCFjYikgewogICAgICAgIGRlbGV0ZSBsaXN0ZW5lcnNbZXZlbnRdOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgaSA9IGFyci5pbmRleE9mKGNiKTsKICAgICAgaWYgKGkgIT09IC0xKSBhcnIuc3BsaWNlKGksIDEpOwogICAgICBpZiAoYXJyLmxlbmd0aCA9PT0gMCkgZGVsZXRlIGxpc3RlbmVyc1tldmVudF07CiAgICB9LAoKICAgIGVtaXQ6IGZ1bmN0aW9uIChldmVudCwgZGF0YSkgewogICAgICB2YXIgYXJyID0gbGlzdGVuZXJzW2V2ZW50XTsKICAgICAgaWYgKCFhcnIgfHwgYXJyLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKICAgICAgdmFyIHNuYXBzaG90ID0gYXJyLnNsaWNlKCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc25hcHNob3QubGVuZ3RoOyBpKyspIHsKICAgICAgICB0cnkgewogICAgICAgICAgc25hcHNob3RbaV0oZGF0YSk7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICBpZiAod2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5lcnJvcikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVi5zdG9yZV0gbGlzdGVuZXIgZm9yICInICsgZXZlbnQgKyAnIiB0aHJldzonLCBlcnIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICB0b2FzdDogZnVuY3Rpb24gKG1zZywga2luZCkgewogICAgICB0aGlzLmVtaXQoRVZFTlRTLlRPQVNULCB7IG1zZzogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsKICAgIH0sCiAgICBlcnJvcjogZnVuY3Rpb24gKGVycikgewogICAgICB2YXIgcGF5bG9hZCA9CiAgICAgICAgZXJyICYmIHR5cGVvZiBlcnIgPT09ICdvYmplY3QnCiAgICAgICAgICA/IGVycgogICAgICAgICAgOiB7IG1lc3NhZ2U6IFN0cmluZyhlcnIgPT0gbnVsbCA/ICdTb21ldGhpbmcgd2VudCB3cm9uZycgOiBlcnIpIH07CiAgICAgIHRoaXMuZW1pdChFVkVOVFMuRVJST1IsIHBheWxvYWQpOwogICAgfSwKCiAgICBzYXZlOiBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICghU1RPUkFHRV9PSykgcmV0dXJuIGZhbHNlOwogICAgICB0cnkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUEVSU0lTVF9XSElURUxJU1QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBrZXkgPSBQRVJTSVNUX1dISVRFTElTVFtpXTsKICAgICAgICAgIHZhciB2YWwgPSBWLnN0YXRlW2tleV07CiAgICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsKSB7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX1BSRUZJWCArIGtleSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9QUkVGSVggKyBrZXksIEpTT04uc3RyaW5naWZ5KHZhbCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBjYXRjaCAoZSkgewoKICAgICAgICBpZiAod2luZG93LmNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4oJ1tWLnN0b3JlXSBzYXZlIGZhaWxlZDonLCBlKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0sCgogICAgbG9hZDogZnVuY3Rpb24gKCkgewogICAgICBpZiAoIVNUT1JBR0VfT0spIHJldHVybiBmYWxzZTsKICAgICAgdHJ5IHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFBFUlNJU1RfV0hJVEVMSVNULmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIga2V5ID0gUEVSU0lTVF9XSElURUxJU1RbaV07CiAgICAgICAgICB2YXIgcmF3ID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfUFJFRklYICsga2V5KTsKICAgICAgICAgIGlmIChyYXcgPT09IG51bGwgfHwgcmF3ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlOwogICAgICAgICAgdmFyIHBhcnNlZDsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTsKICAgICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyKSB7CgogICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9QUkVGSVggKyBrZXkpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJzZWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7CgogICAgICAgICAgaWYgKGtleSA9PT0gJ3NldHRpbmdzJyAmJiBwYXJzZWQgJiYgdHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgVi5zdGF0ZS5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdFNldHRpbmdzKCksIHBhcnNlZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBWLnN0YXRlW2tleV0gPSBwYXJzZWQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKCdbVi5zdG9yZV0gbG9hZCBmYWlsZWQ6JywgZSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9LAoKICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICghU1RPUkFHRV9PSykgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUEVSU0lTVF9XSElURUxJU1QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX1BSRUZJWCArIFBFUlNJU1RfV0hJVEVMSVNUW2ldKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHsKCiAgICAgIH0KICAgICAgVi5zdGF0ZS5zZXR0aW5ncyA9IGRlZmF1bHRTZXR0aW5ncygpOwogICAgICBWLnN0YXRlLmluZHVzdHJpZXMgPSBbXTsKICAgICAgVi5zdGF0ZS5vbmJvYXJkaW5nRG9uZSA9IGZhbHNlOwogICAgICBWLnN0YXRlLmN1c3RvbVByZXNldHMgPSBbXTsKICAgIH0sCgogICAgZGVmYXVsdFNldHRpbmdzOiBkZWZhdWx0U2V0dGluZ3MKICB9OwoKICBWLnN0b3JlLmxvYWQoKTsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvYXBpLmpzID09PT09ICovCgooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIFYgPSAod2luZG93LlYgPSB3aW5kb3cuViB8fCB7fSk7CgogIFYuY29uZmlnID0gT2JqZWN0LmFzc2lnbigKICAgIHsKICAgICAgQVBJOiAnaHR0cHM6Ly9hcGkudm9vc2V5LmNvbScsCiAgICAgIENETjogJ2h0dHBzOi8vY2RuLnZvb3NleS5jb20nLAogICAgICBBUFBfU1RPUkVfVVJMOiAnaHR0cHM6Ly9hcHBzLmFwcGxlLmNvbS91cy9hcHAvdmFtcC9pZDY3NDg2NTc2ODUnLAogICAgICBERU1PX1ZJREVPOiAnaHR0cHM6Ly9tLmp3cy5haS92YW1wLW1lYW5ldGl6ZS1kZW1vLXY0Lm1wNCcKICAgIH0sCiAgICBWLmNvbmZpZyB8fCB7fQogICk7CgogIGZ1bmN0aW9uIEFwaUVycm9yKHN0YXR1cywgbWVzc2FnZSwgYm9keSkgewogICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSB8fCAnUmVxdWVzdCBmYWlsZWQnKTsKICAgIGUubmFtZSA9ICdBcGlFcnJvcic7CiAgICBlLnN0YXR1cyA9IHN0YXR1czsKICAgIGUubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1JlcXVlc3QgZmFpbGVkJzsKICAgIGUuYm9keSA9IGJvZHk7CiAgICBlLmlzQXBpRXJyb3IgPSB0cnVlOwogICAgcmV0dXJuIGU7CiAgfQogIFYuQXBpRXJyb3IgPSBBcGlFcnJvcjsKCiAgdmFyIElTT19GUkFDID0gL14oXGR7NH0tXGR7Mn0tXGR7Mn1UXGR7Mn06XGR7Mn06XGR7Mn0pXC5cZCsoWnxbK1wtXVxkezJ9Oj9cZHsyfSk/JC87CgogIGZ1bmN0aW9uIHN0cmlwRnJhY3Rpb25hbCh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB2YWx1ZTsKICAgIHZhciB0ID0gdHlwZW9mIHZhbHVlOwogICAgaWYgKHQgPT09ICdzdHJpbmcnKSB7CiAgICAgIHZhciBtID0gdmFsdWUubWF0Y2goSVNPX0ZSQUMpOwogICAgICBpZiAobSkgcmV0dXJuIG1bMV0gKyAobVsyXSB8fCAnWicpOwogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7CiAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1wuXGR7M31aJC8sICdaJyk7CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgdmFyIG91dCA9IG5ldyBBcnJheSh2YWx1ZS5sZW5ndGgpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBzdHJpcEZyYWN0aW9uYWwodmFsdWVbaV0pOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgaWYgKHQgPT09ICdvYmplY3QnKSB7CiAgICAgIHZhciBvID0ge307CiAgICAgIGZvciAodmFyIGsgaW4gdmFsdWUpIHsKICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrKSkgewogICAgICAgICAgb1trXSA9IHN0cmlwRnJhY3Rpb25hbCh2YWx1ZVtrXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBvOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgZnVuY3Rpb24gc2FmZVBhcnNlKHRleHQpIHsKICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dCA9PT0gJycpIHJldHVybiBudWxsOwogICAgdHJ5IHsKICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7CiAgICB9IGNhdGNoIChfZSkgewogICAgICByZXR1cm4gdGV4dDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGVycm9yTWVzc2FnZShib2R5LCBzdGF0dXMpIHsKICAgIGlmIChib2R5ICYmIHR5cGVvZiBib2R5ID09PSAnb2JqZWN0JykgewogICAgICBpZiAodHlwZW9mIGJvZHkuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnICYmIGJvZHkuZGVzY3JpcHRpb24pIHJldHVybiBib2R5LmRlc2NyaXB0aW9uOwogICAgICBpZiAodHlwZW9mIGJvZHkucmVhc29uID09PSAnc3RyaW5nJyAmJiBib2R5LnJlYXNvbikgcmV0dXJuIGJvZHkucmVhc29uOwogICAgICBpZiAodHlwZW9mIGJvZHkubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgYm9keS5tZXNzYWdlKSByZXR1cm4gYm9keS5tZXNzYWdlOwogICAgICBpZiAodHlwZW9mIGJvZHkuZXJyb3IgPT09ICdzdHJpbmcnICYmIGJvZHkuZXJyb3IpIHJldHVybiBib2R5LmVycm9yOwogICAgfQogICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJyAmJiBib2R5LnRyaW0oKSkgcmV0dXJuIGJvZHkudHJpbSgpOwogICAgcmV0dXJuIGRlZmF1bHRTdGF0dXNNZXNzYWdlKHN0YXR1cyk7CiAgfQoKICBmdW5jdGlvbiBkZWZhdWx0U3RhdHVzTWVzc2FnZShzdGF0dXMpIHsKICAgIHN3aXRjaCAoc3RhdHVzKSB7CiAgICAgIGNhc2UgNDAwOiByZXR1cm4gJ0JhZCByZXF1ZXN0Lic7CiAgICAgIGNhc2UgNDAxOiByZXR1cm4gJ1lvdXIgc2Vzc2lvbiBoYXMgZXhwaXJlZC4gUGxlYXNlIHNpZ24gaW4gYWdhaW4uJzsKICAgICAgY2FzZSA0MDI6IHJldHVybiAnTm90IGVub3VnaCBjcmVkaXRzLic7CiAgICAgIGNhc2UgNDAzOiByZXR1cm4gJ1lvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGRvIHRoYXQuJzsKICAgICAgY2FzZSA0MDQ6IHJldHVybiAnTm90IGZvdW5kLic7CiAgICAgIGNhc2UgNDA2OiByZXR1cm4gJ1RoYXQgdmFsdWUgaXMgbm90IGFjY2VwdGFibGUuJzsKICAgICAgY2FzZSA0MDk6IHJldHVybiAnVGhhdCBhbHJlYWR5IGV4aXN0cy4nOwogICAgICBjYXNlIDQxMzogcmV0dXJuICdUaGF0IGZpbGUgaXMgdG9vIGxhcmdlLic7CiAgICAgIGNhc2UgNDIwOiByZXR1cm4gJ1JlcXVlc3QgcmVqZWN0ZWQuJzsKICAgICAgY2FzZSA0MjI6IHJldHVybiAnQ291bGQgbm90IHByb2Nlc3MgdGhhdCByZXF1ZXN0Lic7CiAgICAgIGNhc2UgNDI5OiByZXR1cm4gJ1RvbyBtYW55IHJlcXVlc3RzLiBQbGVhc2Ugc2xvdyBkb3duLic7CiAgICAgIGNhc2UgNTAwOiByZXR1cm4gJ1NvbWV0aGluZyB3ZW50IHdyb25nIG9uIG91ciBlbmQuJzsKICAgICAgY2FzZSA1MDI6CiAgICAgIGNhc2UgNTAzOgogICAgICBjYXNlIDUwNDogcmV0dXJuICdUaGUgc2VydmljZSBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZS4nOwogICAgICBkZWZhdWx0OiByZXR1cm4gc3RhdHVzID8gKCdSZXF1ZXN0IGZhaWxlZCAoJyArIHN0YXR1cyArICcpLicpIDogJ05ldHdvcmsgZXJyb3IuJzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGJ1aWxkVVJMKHBhdGgsIHF1ZXJ5KSB7CiAgICB2YXIgdXJsOwogICAgaWYgKC9eaHR0cHM/OlwvXC8vaS50ZXN0KHBhdGgpKSB7CiAgICAgIHVybCA9IHBhdGg7CiAgICB9IGVsc2UgewogICAgICB2YXIgYmFzZSA9IFYuY29uZmlnLkFQSS5yZXBsYWNlKC9cLyskLywgJycpOwogICAgICB1cmwgPSBiYXNlICsgKHBhdGguY2hhckF0KDApID09PSAnLycgPyBwYXRoIDogJy8nICsgcGF0aCk7CiAgICB9CiAgICBpZiAocXVlcnkgJiYgdHlwZW9mIHF1ZXJ5ID09PSAnb2JqZWN0JykgewogICAgICB2YXIgcGFydHMgPSBbXTsKICAgICAgZm9yICh2YXIgayBpbiBxdWVyeSkgewogICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocXVlcnksIGspKSB7CiAgICAgICAgICB2YXIgdmFsID0gcXVlcnlba107CiAgICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsIHx8IHZhbCA9PT0gJycpIGNvbnRpbnVlOwogICAgICAgICAgcGFydHMucHVzaChlbmNvZGVVUklDb21wb25lbnQoaykgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwYXJ0cy5sZW5ndGgpIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA+PSAwID8gJyYnIDogJz8nKSArIHBhcnRzLmpvaW4oJyYnKTsKICAgIH0KICAgIHJldHVybiB1cmw7CiAgfQoKICBmdW5jdGlvbiBhdXRoVG9rZW4oKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5hdXRoICYmIHR5cGVvZiBWLmF1dGgudG9rZW4gPT09ICdmdW5jdGlvbicpIHJldHVybiBWLmF1dGgudG9rZW4oKTsKICAgIH0gY2F0Y2ggKF9lKSB7ICB9CgogICAgdHJ5IHsKICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndmFtcF93ZWJfdG9rZW4nKTsKICAgIH0gY2F0Y2ggKF9lMikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlcXVlc3QocGF0aCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgbWV0aG9kID0gKG9wdHMubWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpOwogICAgdmFyIGhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRzLmhlYWRlcnMgfHwge30pOwogICAgdmFyIGZldGNoSW5pdCA9IHsgbWV0aG9kOiBtZXRob2QsIGhlYWRlcnM6IGhlYWRlcnMgfTsKCiAgICBpZiAob3B0cy5zaWduYWwpIGZldGNoSW5pdC5zaWduYWwgPSBvcHRzLnNpZ25hbDsKCiAgICB2YXIgaGFzQm9keSA9IG9wdHMuYm9keSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuYm9keSAhPT0gbnVsbCAmJiBtZXRob2QgIT09ICdHRVQnICYmIG1ldGhvZCAhPT0gJ0hFQUQnOwogICAgaWYgKGhhc0JvZHkpIHsKICAgICAgaWYgKAogICAgICAgIG9wdHMuYm9keSBpbnN0YW5jZW9mIEJsb2IgfHwKICAgICAgICBvcHRzLmJvZHkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fAogICAgICAgIG9wdHMuYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhIHx8CiAgICAgICAgKHR5cGVvZiBvcHRzLmJvZHkgPT09ICdzdHJpbmcnKQogICAgICApIHsKCiAgICAgICAgZmV0Y2hJbml0LmJvZHkgPSBvcHRzLmJvZHk7CiAgICAgIH0gZWxzZSB7CgogICAgICAgIGlmICghaGFzSGVhZGVyKGhlYWRlcnMsICdDb250ZW50LVR5cGUnKSkgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7CiAgICAgICAgZmV0Y2hJbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShzdHJpcEZyYWN0aW9uYWwob3B0cy5ib2R5KSk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAob3B0cy5hdXRoICE9PSBmYWxzZSAmJiAhaGFzSGVhZGVyKGhlYWRlcnMsICdBdXRob3JpemF0aW9uJykpIHsKICAgICAgdmFyIHRvayA9IGF1dGhUb2tlbigpOwogICAgICBpZiAodG9rKSBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSAnQmVhcmVyICcgKyB0b2s7CiAgICB9CgogICAgdmFyIHVybCA9IGJ1aWxkVVJMKHBhdGgsIG9wdHMucXVlcnkpOwoKICAgIHJldHVybiBmZXRjaCh1cmwsIGZldGNoSW5pdCkudGhlbihmdW5jdGlvbiAocmVzKSB7CgogICAgICBpZiAoKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpICYmIG9wdHMuYXV0aCAhPT0gZmFsc2UpIHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLmNsZWFyID09PSAnZnVuY3Rpb24nKSBWLmF1dGguY2xlYXIoKTsKICAgICAgICAgIGVsc2Ugd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd2YW1wX3dlYl90b2tlbicpOwogICAgICAgIH0gY2F0Y2ggKF9lKSB7ICB9CiAgICAgIH0KCiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MjkgJiYgKG9wdHMuX2F0dGVtcHQgfHwgMCkgPCAyKSB7CiAgICAgICAgdmFyIHJhID0gcGFyc2VGbG9hdChyZXMuaGVhZGVycyAmJiByZXMuaGVhZGVycy5nZXQgPyByZXMuaGVhZGVycy5nZXQoJ1JldHJ5LUFmdGVyJykgOiAnJyk7CiAgICAgICAgaWYgKCEoaXNGaW5pdGUocmEpICYmIHJhID4gMTUpKSB7CiAgICAgICAgICB2YXIgd2FpdE1zID0gKGlzRmluaXRlKHJhKSAmJiByYSA+IDApCiAgICAgICAgICAgID8gcmEgKiAxMDAwCiAgICAgICAgICAgIDogKDcwMCAqIE1hdGgucG93KDIsIG9wdHMuX2F0dGVtcHQgfHwgMCkpICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMzAwKTsKICAgICAgICAgIHZhciBuZXh0ID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0cywgeyBfYXR0ZW1wdDogKG9wdHMuX2F0dGVtcHQgfHwgMCkgKyAxIH0pOwogICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChycykgeyBzZXRUaW1lb3V0KHJzLCB3YWl0TXMpOyB9KS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlcXVlc3QocGF0aCwgbmV4dCk7IH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKG9wdHMucmF3KSB7CiAgICAgICAgaWYgKCFyZXMub2sgJiYgcmVzLnN0YXR1cyAhPT0gMjAyKSB7CiAgICAgICAgICByZXR1cm4gcmVzLnRleHQoKS50aGVuKGZ1bmN0aW9uICh0eHQpIHsKICAgICAgICAgICAgdmFyIGJvZHkgPSBzYWZlUGFyc2UodHh0KTsKICAgICAgICAgICAgdGhyb3cgQXBpRXJyb3IocmVzLnN0YXR1cywgZXJyb3JNZXNzYWdlKGJvZHksIHJlcy5zdGF0dXMpLCBib2R5KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgICB9CgogICAgICByZXR1cm4gcmVzLnRleHQoKS50aGVuKGZ1bmN0aW9uICh0eHQpIHsKICAgICAgICB2YXIgYm9keSA9IHNhZmVQYXJzZSh0eHQpOwogICAgICAgIGlmIChyZXMub2spIHJldHVybiBib2R5OwogICAgICAgIHRocm93IEFwaUVycm9yKHJlcy5zdGF0dXMsIGVycm9yTWVzc2FnZShib2R5LCByZXMuc3RhdHVzKSwgYm9keSk7CiAgICAgIH0pOwogICAgfSwgZnVuY3Rpb24gKG5ldHdvcmtFcnIpIHsKCiAgICAgIGlmIChuZXR3b3JrRXJyICYmIG5ldHdvcmtFcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB0aHJvdyBuZXR3b3JrRXJyOwogICAgICB0aHJvdyBBcGlFcnJvcigwLCBuZXR3b3JrRXJyICYmIG5ldHdvcmtFcnIubWVzc2FnZSA/IG5ldHdvcmtFcnIubWVzc2FnZSA6ICdOZXR3b3JrIGVycm9yLiBDaGVjayB5b3VyIGNvbm5lY3Rpb24uJywgbnVsbCk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGhhc0hlYWRlcihoZWFkZXJzLCBuYW1lKSB7CiAgICB2YXIgbG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICBmb3IgKHZhciBrIGluIGhlYWRlcnMpIHsKICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoZWFkZXJzLCBrKSAmJiBrLnRvTG93ZXJDYXNlKCkgPT09IGxuYW1lKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIHBvbGwoc3VibWl0Rm4sIHBvbGxGbiwgb3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICB2YXIgaW50ZXJ2YWxNcyA9IG9wdGlvbnMuaW50ZXJ2YWxNcyAhPSBudWxsID8gb3B0aW9ucy5pbnRlcnZhbE1zIDogMjAwMDsKICAgIHZhciB0aW1lb3V0TXMgPSBvcHRpb25zLnRpbWVvdXRNcyAhPSBudWxsID8gb3B0aW9ucy50aW1lb3V0TXMgOiAxODAwMDA7CiAgICB2YXIgb25Qcm9ncmVzcyA9IHR5cGVvZiBvcHRpb25zLm9uUHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLm9uUHJvZ3Jlc3MgOiBmdW5jdGlvbiAoKSB7fTsKICAgIHZhciBzaWduYWwgPSBvcHRpb25zLnNpZ25hbCB8fCBudWxsOwoKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBzZXR0bGVkID0gZmFsc2U7CiAgICAgIHZhciBzdGFydGVkID0gRGF0ZS5ub3coKTsKICAgICAgdmFyIGF0dGVtcHQgPSAwOwogICAgICB2YXIgdGltZXIgPSBudWxsOwoKICAgICAgZnVuY3Rpb24gYWJvcnRFcnJvcigpIHsKICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcignQWJvcnRlZCcpOwogICAgICAgIGUubmFtZSA9ICdBYm9ydEVycm9yJzsKICAgICAgICByZXR1cm4gZTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY2xlYW51cCgpIHsKICAgICAgICBpZiAodGltZXIpIHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgdGltZXIgPSBudWxsOyB9CiAgICAgICAgaWYgKHNpZ25hbCkgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gb25BYm9ydCgpIHsKICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOwogICAgICAgIHNldHRsZWQgPSB0cnVlOwogICAgICAgIGNsZWFudXAoKTsKICAgICAgICByZWplY3QoYWJvcnRFcnJvcigpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBmYWlsKGVycikgewogICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47CiAgICAgICAgc2V0dGxlZCA9IHRydWU7CiAgICAgICAgY2xlYW51cCgpOwogICAgICAgIHJlamVjdChlcnIpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGRvbmUocmVzdWx0KSB7CiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjsKICAgICAgICBzZXR0bGVkID0gdHJ1ZTsKICAgICAgICBjbGVhbnVwKCk7CiAgICAgICAgcmVzb2x2ZShyZXN1bHQpOwogICAgICB9CgogICAgICBpZiAoc2lnbmFsKSB7CiAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7IG9uQWJvcnQoKTsgcmV0dXJuOyB9CiAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7CiAgICAgIH0KCiAgICAgIFByb21pc2UucmVzb2x2ZSgpCiAgICAgICAgLnRoZW4oc3VibWl0Rm4pCiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHN1Ym1pdFJlc3VsdCkgewogICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjsKICAgICAgICAgIG9uUHJvZ3Jlc3MoeyBwaGFzZTogJ3N1Ym1pdHRlZCcsIGF0dGVtcHQ6IDAsIHN1Ym1pdDogc3VibWl0UmVzdWx0IH0pOwoKICAgICAgICAgIGZ1bmN0aW9uIGxvb3AoKSB7CiAgICAgICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47CiAgICAgICAgICAgIGlmIChzaWduYWwgJiYgc2lnbmFsLmFib3J0ZWQpIHsgb25BYm9ydCgpOyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydGVkID4gdGltZW91dE1zKSB7CiAgICAgICAgICAgICAgZmFpbChBcGlFcnJvcig0MDgsICdUaGlzIGlzIHRha2luZyBsb25nZXIgdGhhbiBleHBlY3RlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCBudWxsKSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF0dGVtcHQrKzsKICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkKICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiBwb2xsRm4oc3VibWl0UmVzdWx0LCBhdHRlbXB0KTsgfSkKICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOwogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIG9uUHJvZ3Jlc3MoeyBwaGFzZTogJ3BvbGxpbmcnLCBhdHRlbXB0OiBhdHRlbXB0LCBzdWJtaXQ6IHN1Ym1pdFJlc3VsdCB9KTsKICAgICAgICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGxvb3AsIGludGVydmFsTXMpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgZG9uZShyZXN1bHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykgeyBvbkFib3J0KCk7IHJldHVybjsgfQogICAgICAgICAgICAgICAgZmFpbChlcnIpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgfQoKICAgICAgICAgIGxvb3AoKTsKICAgICAgICB9KQogICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHsgb25BYm9ydCgpOyByZXR1cm47IH0KICAgICAgICAgIGZhaWwoZXJyKTsKICAgICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcmFuZG9tU2VlZCgpIHsKICAgIGlmIChWLnV0aWwgJiYgdHlwZW9mIFYudXRpbC5yYW5kb21TZWVkID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51dGlsLnJhbmRvbVNlZWQoKTsKICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKTsKICB9CgogIHZhciBOQU5PX01PREVMUyA9IHsgbmFub0JhbmFuYTogdHJ1ZSwgbmFub0JhbmFuYTI6IHRydWUsIG5hbm9CYW5hbmFQcm86IHRydWUgfTsKCiAgZnVuY3Rpb24gZmx1eEltYWdlVVJMKGJvZHkpIHsKICAgIGlmICghYm9keSB8fCAhQXJyYXkuaXNBcnJheShib2R5LmltYWdlcykgfHwgIWJvZHkuaW1hZ2VzLmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICB2YXIgZmlyc3QgPSBib2R5LmltYWdlc1swXTsKICAgIGlmICghZmlyc3QpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGZpcnN0LnVybCB8fCBudWxsOwogIH0KCiAgZnVuY3Rpb24gaXNQZW5kaW5nUmVzdWx0KGJvZHkpIHsKICAgIGlmICghYm9keSB8fCB0eXBlb2YgYm9keSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTsKICAgIHZhciBzdCA9IChib2R5LnN0YXR1cyB8fCBib2R5LnN0YXRlIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7CiAgICBpZiAoc3QgJiYgL1FVRVVFfFBST0dSRVNTfFBFTkRJTkd8UFJPQ0VTU3xSVU5OSU5HfFNUQVJURUR8U1VCTUlUVEVELy50ZXN0KHN0KSkgcmV0dXJuIHRydWU7CiAgICBpZiAoYm9keS51cmwgfHwgYm9keS52aWRlbyB8fCBib2R5LnZpZGVvX3VybCB8fCBib2R5LnZpZGVvVVJMIHx8IGJvZHkuZXJyb3IpIHJldHVybiBmYWxzZTsKICAgIGlmIChBcnJheS5pc0FycmF5KGJvZHkuaW1hZ2VzKSkgcmV0dXJuIGJvZHkuaW1hZ2VzLmxlbmd0aCA9PT0gMDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIHBvbGxSZXNwb25zZShyZXMsIGV4dHJhY3QpIHsKICAgIGlmIChyZXMuc3RhdHVzID09PSAyMDIpIHJldHVybiBudWxsOwogICAgaWYgKHJlcy5vaykgewogICAgICByZXR1cm4gcmVzLnRleHQoKS50aGVuKGZ1bmN0aW9uICh0eHQpIHsKICAgICAgICB2YXIgYm9keSA9IHNhZmVQYXJzZSh0eHQpOwogICAgICAgIGlmIChpc1BlbmRpbmdSZXN1bHQoYm9keSkpIHJldHVybiBudWxsOwogICAgICAgIHJldHVybiBleHRyYWN0ID8gZXh0cmFjdChib2R5KSA6IGJvZHk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHJlcy50ZXh0KCkudGhlbihmdW5jdGlvbiAodHh0KSB7CiAgICAgIHZhciBib2R5ID0gc2FmZVBhcnNlKHR4dCk7CiAgICAgIHRocm93IEFwaUVycm9yKHJlcy5zdGF0dXMsIGVycm9yTWVzc2FnZShib2R5LCByZXMuc3RhdHVzKSwgYm9keSk7CiAgICB9KTsKICB9CgogIHZhciBhcGkgPSB7CgogICAgcmVxdWVzdDogcmVxdWVzdCwKICAgIHBvbGw6IHBvbGwsCiAgICBBcGlFcnJvcjogQXBpRXJyb3IsCiAgICBfc3RyaXBGcmFjdGlvbmFsOiBzdHJpcEZyYWN0aW9uYWwsCiAgICBfZmx1eEltYWdlVVJMOiBmbHV4SW1hZ2VVUkwsCgogICAgc2lnbnVwOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICB2YXIgYm9keSA9IE9iamVjdC5hc3NpZ24oCiAgICAgICAgewogICAgICAgICAgaGFzQWNjZXB0ZWRUZXJtc0FuZENvbmRpdGlvbnM6IHRydWUsCiAgICAgICAgICBoYXNBY2NlcHRlZFByaXZhY3lQb2xpY3k6IHRydWUsCiAgICAgICAgICBoYXJkd2FyZTogbnVsbAogICAgICAgIH0sCiAgICAgICAgZGF0YSB8fCB7fQogICAgICApOwogICAgICBpZiAoYm9keS5lbWFpbCkgYm9keS5lbWFpbCA9IFN0cmluZyhib2R5LmVtYWlsKS50b0xvd2VyQ2FzZSgpOwogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL3VzZXJzJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogYm9keSwgYXV0aDogZmFsc2UgfSk7CiAgICB9LAoKICAgIGxvZ2luOiBmdW5jdGlvbiAoZW1haWwsIHBhc3N3b3JkKSB7CiAgICAgIHZhciBiYXNpYzsKICAgICAgaWYgKFYudXRpbCAmJiB0eXBlb2YgVi51dGlsLmJhc2ljQXV0aEhlYWRlciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGJhc2ljID0gVi51dGlsLmJhc2ljQXV0aEhlYWRlcihlbWFpbCwgcGFzc3dvcmQpOwogICAgICB9IGVsc2UgewogICAgICAgIGJhc2ljID0gJ0Jhc2ljICcgKyBiNjQoU3RyaW5nKGVtYWlsKS50b0xvd2VyQ2FzZSgpICsgJzonICsgcGFzc3dvcmQpOwogICAgICB9CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvYXV0aC9sb2dpbicsIHsKICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICBhdXRoOiBmYWxzZSwKICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGJhc2ljIH0KICAgICAgfSk7CiAgICB9LAoKICAgIHdob2FtaTogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2F1dGgvdG9rZW4nLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIHJlcXVlc3RSZXNldDogZnVuY3Rpb24gKGVtYWlsKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvYXV0aC9wYXNzd29yZC9jb2RlJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGF1dGg6IGZhbHNlLAogICAgICAgIGJvZHk6IHsgZW1haWw6IFN0cmluZyhlbWFpbCkudG9Mb3dlckNhc2UoKSB9CiAgICAgIH0pOwogICAgfSwKCiAgICBzdWJtaXRSZXNldDogZnVuY3Rpb24gKGVtYWlsLCBjb2RlLCBuZXdQYXNzd29yZCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2F1dGgvcGFzc3dvcmQvcmVzZXQnLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgYXV0aDogZmFsc2UsCiAgICAgICAgYm9keTogeyBlbWFpbDogU3RyaW5nKGVtYWlsKS50b0xvd2VyQ2FzZSgpLCBjb2RlOiBjb2RlLCBuZXdQYXNzd29yZDogbmV3UGFzc3dvcmQgfQogICAgICB9KTsKICAgIH0sCgogICAgZW1haWxBdmFpbGFibGU6IGZ1bmN0aW9uIChlbWFpbCkgewogICAgICB2YXIgZW5jID0gZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhlbWFpbCkudG9Mb3dlckNhc2UoKSk7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvYXV0aC9pc0VtYWlsQXZhaWxhYmxlLycgKyBlbmMsIHsgbWV0aG9kOiAnUE9TVCcsIGF1dGg6IGZhbHNlIH0pCiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGJvZHkpIHsKCiAgICAgICAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdib29sZWFuJykgcmV0dXJuIGJvZHk7CiAgICAgICAgICBpZiAoYm9keSAmJiB0eXBlb2YgYm9keS5hdmFpbGFibGUgPT09ICdib29sZWFuJykgcmV0dXJuIGJvZHkuYXZhaWxhYmxlOwogICAgICAgICAgcmV0dXJuIGJvZHkgPT09ICd0cnVlJyB8fCBib2R5ID09PSB0cnVlOwogICAgICAgIH0pOwogICAgfSwKCiAgICB1c2VybmFtZUF2YWlsYWJsZTogZnVuY3Rpb24gKHVzZXJuYW1lKSB7CiAgICAgIHZhciBlbmMgPSBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKHVzZXJuYW1lKS50b0xvd2VyQ2FzZSgpKTsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9hdXRoL2lzVXNlcm5hbWVBdmFpbGFibGUvJyArIGVuYywgeyBtZXRob2Q6ICdQT1NUJywgYXV0aDogZmFsc2UgfSkKICAgICAgICAudGhlbihmdW5jdGlvbiAoYm9keSkgewogICAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnYm9vbGVhbicpIHJldHVybiBib2R5OwogICAgICAgICAgaWYgKGJvZHkgJiYgdHlwZW9mIGJvZHkuYXZhaWxhYmxlID09PSAnYm9vbGVhbicpIHJldHVybiBib2R5LmF2YWlsYWJsZTsKICAgICAgICAgIHJldHVybiBib2R5ID09PSAndHJ1ZScgfHwgYm9keSA9PT0gdHJ1ZTsKICAgICAgICB9KTsKICAgIH0sCgogICAgdXBkYXRlQWNjb3VudDogZnVuY3Rpb24gKHB1dERhdGEpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS91c2VycycsIHsgbWV0aG9kOiAnUFVUJywgYm9keTogcHV0RGF0YSB9KTsKICAgIH0sCgogICAgZGVsZXRlQWNjb3VudDogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL3VzZXJzJywgeyBtZXRob2Q6ICdERUxFVEUnIH0pOwogICAgfSwKCiAgICBjcmVkaXRzOiBmdW5jdGlvbiAoKSB7CgogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL3VzZXIvY3JlZGl0cycsIHsgbWV0aG9kOiAnR0VUJyB9KS50aGVuKGZ1bmN0aW9uIChib2R5KSB7CiAgICAgICAgdmFyIG4gPSBib2R5ICYmIHR5cGVvZiBib2R5LmNyZWRpdHMgPT09ICdudW1iZXInID8gYm9keS5jcmVkaXRzIDogMDsKICAgICAgICByZXR1cm4geyBjcmVkaXRzOiBuIH07CiAgICAgIH0pOwogICAgfSwKCiAgICBjaGVja291dDogZnVuY3Rpb24gKHByb2R1Y3RJRCkgewoKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9wYXkvY2hlY2tvdXQnLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiB7IHByb2R1Y3RJRDogcHJvZHVjdElEIH0gfSk7CiAgICB9LAoKICAgIGdlblRleHRUb0ltYWdlOiBmdW5jdGlvbiAocGFyYW1zKSB7CiAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTsKICAgICAgdmFyIHdpZHRoID0gcGFyYW1zLndpZHRoIHx8IChwYXJhbXMuaW1hZ2Vfc2l6ZSAmJiBwYXJhbXMuaW1hZ2Vfc2l6ZS53aWR0aCkgfHwgMTAyNDsKICAgICAgdmFyIGhlaWdodCA9IHBhcmFtcy5oZWlnaHQgfHwgKHBhcmFtcy5pbWFnZV9zaXplICYmIHBhcmFtcy5pbWFnZV9zaXplLmhlaWdodCkgfHwgMTAyNDsKICAgICAgdmFyIHNlZWQgPSBwYXJhbXMuc2VlZCAhPSBudWxsID8gcGFyYW1zLnNlZWQgOiByYW5kb21TZWVkKCk7CiAgICAgIHZhciBib2R5ID0gewogICAgICAgIHByb21wdDogcGFyYW1zLnByb21wdCB8fCAnJywKICAgICAgICBzZWVkOiBzZWVkLAogICAgICAgIGltYWdlX3NpemU6IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9CiAgICAgIH07CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZ2VuL2ZsdXgtc2NobmVsbCcsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IGJvZHksIHJhdzogdHJ1ZSB9KQogICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIHBhcnNlU3VibWl0KHJlcyk7IH0pOwogICAgfSwKCiAgICBwb2xsVGV4dFRvSW1hZ2U6IGZ1bmN0aW9uIChyZXF1ZXN0SUQpIHsKICAgICAgcmVxdWVzdElEID0gcmVxSWQocmVxdWVzdElEKTsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9nZW4vZmx1eC1zY2huZWxsLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVxdWVzdElEKSwgewogICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgcmF3OiB0cnVlCiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykgeyByZXR1cm4gcG9sbFJlc3BvbnNlKHJlcyk7IH0pOwogICAgfSwKCiAgICBnZW5FZGl0OiBmdW5jdGlvbiAobW9kZWwsIHBhcmFtcykgewogICAgICBtb2RlbCA9IG1vZGVsIHx8ICdmbHV4S2xlaW4nOwogICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307CiAgICAgIHZhciBib2R5ID0gc2hhcGVFZGl0UmVxdWVzdChtb2RlbCwgcGFyYW1zKTsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9nZW4vZWRpdC1pbWFnZScsIHsKICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICBxdWVyeTogeyBtb2RlbDogbW9kZWwgfSwKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHJhdzogdHJ1ZQogICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIHBhcnNlU3VibWl0KHJlcyk7IH0pOwogICAgfSwKCiAgICBwb2xsRWRpdDogZnVuY3Rpb24gKG1vZGVsLCByZXF1ZXN0SUQpIHsKICAgICAgcmVxdWVzdElEID0gcmVxSWQocmVxdWVzdElEKTsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9nZW4vZWRpdC1pbWFnZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlcXVlc3RJRCksIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIHF1ZXJ5OiB7IG1vZGVsOiBtb2RlbCB8fCAnZmx1eEtsZWluJyB9LAogICAgICAgIHJhdzogdHJ1ZQogICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIHBvbGxSZXNwb25zZShyZXMpOyB9KTsKICAgIH0sCgogICAgc2hhcGVFZGl0UmVxdWVzdDogZnVuY3Rpb24gKG1vZGVsLCBwYXJhbXMpIHsgcmV0dXJuIHNoYXBlRWRpdFJlcXVlc3QobW9kZWwsIHBhcmFtcyk7IH0sCgogICAgZ2VuRHluYW1pYzogZnVuY3Rpb24gKGVuZHBvaW50SWQsIHBhcmFtcykgewogICAgICB2YXIgYm9keSA9IHNoYXBlRWRpdFJlcXVlc3QocGFyYW1zICYmIHBhcmFtcy5tb2RlbCA/IHBhcmFtcy5tb2RlbCA6IG51bGwsIHBhcmFtcyB8fCB7fSk7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZ2VuL2R5bmFtaWMvJyArIGVuY29kZVNsdWcoZW5kcG9pbnRJZCksIHsKICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHJhdzogdHJ1ZQogICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIHBhcnNlU3VibWl0KHJlcyk7IH0pOwogICAgfSwKCiAgICBwb2xsRHluYW1pYzogZnVuY3Rpb24gKGVuZHBvaW50SWQsIHJlcXVlc3RJRCkgewogICAgICByZXF1ZXN0SUQgPSByZXFJZChyZXF1ZXN0SUQpOwogICAgICByZXR1cm4gcmVxdWVzdCgKICAgICAgICAnL3YxL2RyZWFtL2dlbi9keW5hbWljLycgKyBlbmNvZGVTbHVnKGVuZHBvaW50SWQpICsgJy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlcXVlc3RJRCksCiAgICAgICAgeyBtZXRob2Q6ICdHRVQnLCByYXc6IHRydWUgfQogICAgICApLnRoZW4oZnVuY3Rpb24gKHJlcykgeyByZXR1cm4gcG9sbFJlc3BvbnNlKHJlcyk7IH0pOwogICAgfSwKCiAgICBtb2RlbHM6IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9tb2RlbHMnLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIHJlZ2lzdHJ5OiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vcmVnaXN0cnknLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIGdlblZpZGVvTFRYOiBmdW5jdGlvbiAocGFyYW1zKSB7CiAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTsKICAgICAgdmFyIGJvZHkgPSB7CiAgICAgICAgaW1hZ2VfdXJsOiBwYXJhbXMuaW1hZ2VfdXJsLAogICAgICAgIHByb21wdDogcGFyYW1zLnByb21wdCB8fCAnJywKICAgICAgICBkdXJhdGlvbjogcGFyYW1zLmR1cmF0aW9uICE9IG51bGwgPyBwYXJhbXMuZHVyYXRpb24gOiA4LAogICAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkICE9IG51bGwgPyBwYXJhbXMuc2VlZCA6IHJhbmRvbVNlZWQoKQogICAgICB9OwogICAgICBpZiAocGFyYW1zLmVuZF9pbWFnZV91cmwpIGJvZHkuZW5kX2ltYWdlX3VybCA9IHBhcmFtcy5lbmRfaW1hZ2VfdXJsOwogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2dlbi9sdHgtdmlkZW8nLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiBib2R5LCByYXc6IHRydWUgfSkKICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7IHJldHVybiBwYXJzZVN1Ym1pdChyZXMpOyB9KTsKICAgIH0sCgogICAgcG9sbFZpZGVvTFRYOiBmdW5jdGlvbiAocmVxdWVzdElELCBnZW5lcmF0ZWRJbWFnZUlEKSB7CiAgICAgIHJlcXVlc3RJRCA9IHJlcUlkKHJlcXVlc3RJRCk7CiAgICAgIHZhciBxdWVyeSA9IHt9OwogICAgICBpZiAoZ2VuZXJhdGVkSW1hZ2VJRCkgcXVlcnkuZ2VuZXJhdGVkSW1hZ2VJRCA9IGdlbmVyYXRlZEltYWdlSUQ7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZ2VuL2x0eC12aWRlby8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlcXVlc3RJRCksIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIHF1ZXJ5OiBxdWVyeSwKICAgICAgICByYXc6IHRydWUKICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgcmV0dXJuIHBvbGxSZXNwb25zZShyZXMsIGZ1bmN0aW9uIChib2R5KSB7CgogICAgICAgICAgcmV0dXJuIGJvZHk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSwKCiAgICBwZXJzaXN0SW1hZ2U6IGZ1bmN0aW9uIChnZW5lcmF0ZWRJbWFnZSkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ltYWdlcycsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IGdlbmVyYXRlZEltYWdlIH0pOwogICAgfSwKCiAgICBsaWJyYXJ5OiBmdW5jdGlvbiAocGFnZSwgcGVyKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vdXNlci9tZS9nZW5lcmF0ZWRpbWFnZXMnLCB7CiAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICBxdWVyeTogeyBwYWdlOiBwYWdlICE9IG51bGwgPyBwYWdlIDogMSwgcGVyOiBwZXIgIT0gbnVsbCA/IHBlciA6IDMwIH0KICAgICAgfSkudGhlbihwYWdpbmF0ZWQpOwogICAgfSwKCiAgICBmYXZvcml0ZXM6IGZ1bmN0aW9uIChwZXIpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS91c2VyL21lL2dlbmVyYXRlZGltYWdlcy9mYXZvcml0ZWQnLCB7CiAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICBxdWVyeTogeyBwZXI6IHBlciAhPSBudWxsID8gcGVyIDogMjAwIH0KICAgICAgfSkudGhlbihwYWdpbmF0ZWQpOwogICAgfSwKCiAgICBzZXRGYXZvcml0ZTogZnVuY3Rpb24gKHJlbW90ZUlELCBmYXZvcml0ZWQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9pbWFnZXMvJyArIGVuY29kZVVSSUNvbXBvbmVudChyZW1vdGVJRCkgKyAnL2Zhdm9yaXRlZCcsIHsKICAgICAgICBtZXRob2Q6ICdQQVRDSCcsCiAgICAgICAgYm9keTogeyBmYXZvcml0ZWQ6ICEhZmF2b3JpdGVkIH0KICAgICAgfSk7CiAgICB9LAoKICAgIGRlbGV0ZUltYWdlOiBmdW5jdGlvbiAocmVtb3RlSUQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92Mi9nZW5lcmF0ZWRpbWFnZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlbW90ZUlEKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pOwogICAgfSwKCiAgICBkZWxldGVMaWJyYXJ5SW1hZ2U6IGZ1bmN0aW9uIChyZW1vdGVJRCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ltYWdlcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlbW90ZUlEKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pOwogICAgfSwKCiAgICBzZXRQdWJsaXNoZWQ6IGZ1bmN0aW9uIChyZW1vdGVJRCwgcHVibGlzaGVkKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vaW1hZ2VzLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVtb3RlSUQpLCB7CiAgICAgICAgbWV0aG9kOiAnUFVUJywKICAgICAgICBib2R5OiB7IHB1Ymxpc2hlZDogISFwdWJsaXNoZWQgfQogICAgICB9KTsKICAgIH0sCgogICAgcmF0aW5nOiBmdW5jdGlvbiAocmVtb3RlSUQsIGFjdGlvbikgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ltYWdlcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlbW90ZUlEKSArICcvcmF0aW5nJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGJvZHk6IHsgYWN0aW9uOiBhY3Rpb24gfQogICAgICB9KTsKICAgIH0sCgogICAgaGlzdG9yeTogZnVuY3Rpb24gKHJlbW90ZUlEKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vaW1hZ2VzLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVtb3RlSUQpICsgJy9oaXN0b3J5JywgewogICAgICAgIG1ldGhvZDogJ0dFVCcKICAgICAgfSk7CiAgICB9LAoKICAgIHB1YmxpY0ZlZWQ6IGZ1bmN0aW9uIChwYWdlLCBwZXIsIHRhZykgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ltYWdlcycsIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIGF1dGg6IGZhbHNlLAogICAgICAgIHF1ZXJ5OiB7IHBhZ2U6IHBhZ2UgIT0gbnVsbCA/IHBhZ2UgOiAxLCBwZXI6IHBlciAhPSBudWxsID8gcGVyIDogMzAsIHRhZzogdGFnIHx8IHVuZGVmaW5lZCB9CiAgICAgIH0pLnRoZW4ocGFnaW5hdGVkKTsKICAgIH0sCgogICAgZm9sZGVyczogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ZvbGRlcnMnLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIGNyZWF0ZUZvbGRlcjogZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9mb2xkZXJzJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogeyBuYW1lOiBuYW1lIH0gfSk7CiAgICB9LAoKICAgIHJlbmFtZUZvbGRlcjogZnVuY3Rpb24gKGlkLCBuYW1lKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZm9sZGVycy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSwgewogICAgICAgIG1ldGhvZDogJ1BBVENIJywKICAgICAgICBib2R5OiB7IG5hbWU6IG5hbWUgfQogICAgICB9KTsKICAgIH0sCgogICAgZGVsZXRlRm9sZGVyOiBmdW5jdGlvbiAoaWQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9mb2xkZXJzLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7CiAgICB9LAoKICAgIGFzc2lnbkZvbGRlcjogZnVuY3Rpb24gKGZvbGRlcklELCBpbWFnZUlEcykgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ZvbGRlcnMvYXNzaWduJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGJvZHk6IHsgZm9sZGVySUQ6IGZvbGRlcklEICE9IG51bGwgPyBmb2xkZXJJRCA6IG51bGwsIGltYWdlSURzOiBpbWFnZUlEcyB8fCBbXSB9CiAgICAgIH0pOwogICAgfSwKCiAgICBmb2xkZXJJbWFnZXM6IGZ1bmN0aW9uIChpZCwgcGFnZSwgcGVyKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZm9sZGVycy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSArICcvaW1hZ2VzJywgewogICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgcXVlcnk6IHsgcGFnZTogcGFnZSAhPSBudWxsID8gcGFnZSA6IDEsIHBlcjogcGVyICE9IG51bGwgPyBwZXIgOiAzMCB9CiAgICAgIH0pLnRoZW4ocGFnaW5hdGVkKTsKICAgIH0sCgogICAgcHJlc2V0czogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YzL3ByZXNldHMnLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIGNyZWF0ZVByZXNldDogZnVuY3Rpb24gKHApIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92My9wcmVzZXRzJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogbm9ybWFsaXplUHJlc2V0KHApIH0pOwogICAgfSwKCiAgICB1cGRhdGVQcmVzZXQ6IGZ1bmN0aW9uIChpZCwgcCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YzL3ByZXNldHMvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCksIHsKICAgICAgICBtZXRob2Q6ICdQVVQnLAogICAgICAgIGJvZHk6IG5vcm1hbGl6ZVByZXNldChwKQogICAgICB9KTsKICAgIH0sCgogICAgZGVsZXRlUHJlc2V0OiBmdW5jdGlvbiAoaWQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92My9wcmVzZXRzLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7CiAgICB9LAoKICAgIHJlb3JkZXJQcmVzZXRzOiBmdW5jdGlvbiAoaWRzKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjMvcHJlc2V0cy9yZW9yZGVyJywgeyBtZXRob2Q6ICdQVVQnLCBib2R5OiB7IG9yZGVyZWRJRHM6IGlkcyB8fCBbXSB9IH0pOwogICAgfSwKCiAgICBzeW5jUHJlc2V0czogZnVuY3Rpb24gKHByZXNldHMpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92My9wcmVzZXRzL3N5bmMnLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgYm9keTogeyBwcmVzZXRzOiAocHJlc2V0cyB8fCBbXSkubWFwKG5vcm1hbGl6ZVByZXNldCkgfQogICAgICB9KTsKICAgIH0sCgogICAgY3VyYXRlZEZlZWQ6IGZ1bmN0aW9uIChwYWdlLCBwZXIsIHRhZykgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YyL2N1cmF0aW9uL2dlbmVyYXRlZGltYWdlcycsIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIGF1dGg6IGZhbHNlLAogICAgICAgIHF1ZXJ5OiB7IHBhZ2U6IHBhZ2UgIT0gbnVsbCA/IHBhZ2UgOiAxLCBwZXI6IHBlciAhPSBudWxsID8gcGVyIDogMzAsIHRhZzogdGFnIHx8IHVuZGVmaW5lZCB9CiAgICAgIH0pLnRoZW4ocGFnaW5hdGVkKTsKICAgIH0sCgogICAgZ2V0UHJvZmlsZTogZnVuY3Rpb24gKGlkKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjIvcHJvZmlsZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSwgeyBtZXRob2Q6ICdHRVQnIH0pOwogICAgfSwKCiAgICBnZXRQcml2YXRlUHJvZmlsZTogZnVuY3Rpb24gKGlkKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjIvcHJvZmlsZS9wcml2YXRlLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIGNyZWF0ZVByb2ZpbGU6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjIvcHJvZmlsZScsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IGRhdGEgfSk7CiAgICB9LAoKICAgIHVwZGF0ZVByb2ZpbGU6IGZ1bmN0aW9uIChpZCwgZGF0YSkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YyL3Byb2ZpbGUvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCksIHsgbWV0aG9kOiAnUFVUJywgYm9keTogZGF0YSB9KTsKICAgIH0sCgogICAgZGVsZXRlUHJvZmlsZTogZnVuY3Rpb24gKGlkKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjIvcHJvZmlsZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pOwogICAgfSwKCiAgICBwcm9maWxlSW1hZ2VzOiBmdW5jdGlvbiAoaWQsIHBhZ2UsIHBlcikgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YyL3Byb2ZpbGUvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCkgKyAnL2dlbmVyYXRlZGltYWdlcycsIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIHF1ZXJ5OiB7IHBhZ2U6IHBhZ2UgIT0gbnVsbCA/IHBhZ2UgOiAxLCBwZXI6IHBlciAhPSBudWxsID8gcGVyIDogMzAgfQogICAgICB9KS50aGVuKHBhZ2luYXRlZCk7CiAgICB9LAoKICAgIHB1Ymxpc2hJbWFnZTogZnVuY3Rpb24gKHByb2ZpbGVJRCwgZ2VuZXJhdGVkSW1hZ2UpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92Mi9wcm9maWxlLycgKyBlbmNvZGVVUklDb21wb25lbnQocHJvZmlsZUlEKSArICcvZ2VuZXJhdGVkaW1hZ2UnLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgYm9keTogZ2VuZXJhdGVkSW1hZ2UKICAgICAgfSk7CiAgICB9LAoKICAgIHVwbG9hZEltYWdlOiBmdW5jdGlvbiAoYmxvYk9yRmlsZSwgbWVkaWFUeXBlLCBvcHRzKSB7CiAgICAgIG1lZGlhVHlwZSA9IG1lZGlhVHlwZSB8fCAncmVuZGVyJzsKICAgICAgb3B0cyA9IG9wdHMgfHwge307CgogICAgICBpZiAoIShibG9iT3JGaWxlIGluc3RhbmNlb2YgQmxvYikpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoQXBpRXJyb3IoMCwgJ3VwbG9hZEltYWdlIHJlcXVpcmVzIGEgQmxvYiBvciBGaWxlLicsIG51bGwpKTsKICAgICAgfQoKICAgICAgdmFyIGNvbnRlbnRUeXBlID0gYmxvYk9yRmlsZS50eXBlIHx8IG1lZGlhVHlwZUNvbnRlbnRUeXBlKG1lZGlhVHlwZSk7CiAgICAgIHZhciBmaWxlbmFtZSA9IG9wdHMuZmlsZW5hbWUgfHwgKGJsb2JPckZpbGUubmFtZSkgfHwgKHV1aWQoKSArIGZpbGVFeHQoY29udGVudFR5cGUpKTsKICAgICAgdmFyIHRvdGFsQnl0ZXMgPSBibG9iT3JGaWxlLnNpemUgIT0gbnVsbCA/IGJsb2JPckZpbGUuc2l6ZSA6IG51bGw7CgogICAgICB2YXIgcXVlcnkgPSB7CiAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lLAogICAgICAgIG1lZGlhVHlwZTogbWVkaWFUeXBlLAogICAgICAgIHRvdGFsQnl0ZXM6IHRvdGFsQnl0ZXMKICAgICAgfTsKICAgICAgaWYgKG9wdHMucHJvZmlsZUlEKSBxdWVyeS5wcm9maWxlSUQgPSBvcHRzLnByb2ZpbGVJRDsKICAgICAgaWYgKG9wdHMucHJvamVjdElEKSBxdWVyeS5wcm9qZWN0SUQgPSBvcHRzLnByb2plY3RJRDsKCiAgICAgIHZhciByZXFJbml0ID0gewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIHF1ZXJ5OiBxdWVyeSwKICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiBjb250ZW50VHlwZSB9LAogICAgICAgIGJvZHk6IGJsb2JPckZpbGUKICAgICAgfTsKICAgICAgaWYgKG9wdHMuc2lnbmFsKSByZXFJbml0LnNpZ25hbCA9IG9wdHMuc2lnbmFsOwoKICAgICAgcmV0dXJuIHJlcXVlc3QoJy9tZWRpYS91cGxvYWQnLCByZXFJbml0KS50aGVuKGZ1bmN0aW9uIChwZXJzb25hbCkgewogICAgICAgIHZhciBwdWJsaWNVUkwgPSBwZXJzb25hbCAmJiBwZXJzb25hbC5nbG9iYWwgJiYgcGVyc29uYWwuZ2xvYmFsLm1lZGlhVVJMOwogICAgICAgIGlmICghcHVibGljVVJMKSB7CiAgICAgICAgICB0aHJvdyBBcGlFcnJvcig1MDIsICdUaGUgdXBsb2FkIHNlcnZpY2UgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCByZXNwb25zZS4nLCBwZXJzb25hbCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwdWJsaWNVUkw7CiAgICAgIH0pOwogICAgfSwKCiAgICByZWZlcnJhbENvZGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vcmVmZXJyYWwvY29kZXMnLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIHJlZmVycmFsQXR0cmlidXRpb246IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9yZWZlcnJhbC9hdHRyaWJ1dGlvbicsIHsgbWV0aG9kOiAnR0VUJyB9KTsKICAgIH0sCgogICAgYXR0cmlidXRlUmVmZXJyYWw6IGZ1bmN0aW9uIChjb2RlKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vcmVmZXJyYWwvYXR0cmlidXRlJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGJvZHk6IHsgY29kZTogY29kZSB9CiAgICAgIH0pOwogICAgfSwKCiAgICBsb29rdXBSZWZlcnJhbDogZnVuY3Rpb24gKGNvZGUpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9yZWZlcnJhbC9jb2RlLycgKyBlbmNvZGVVUklDb21wb25lbnQoY29kZSksIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIGF1dGg6IGZhbHNlCiAgICAgIH0pOwogICAgfSwKCiAgICBzZWFyY2g6IGZ1bmN0aW9uICh0ZXh0KSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvc2VhcmNoLycgKyBlbmNvZGVVUklDb21wb25lbnQodGV4dCksIHsgbWV0aG9kOiAnR0VUJyB9KTsKICAgIH0sCgogICAgdXNlclNlYXJjaDogZnVuY3Rpb24gKHRleHQsIHBhZ2UsIHBlcikgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3VzZXJzZWFyY2gvJyArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgewogICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgcXVlcnk6IHsgcGFnZTogcGFnZSAhPSBudWxsID8gcGFnZSA6IDEsIHBlcjogcGVyICE9IG51bGwgPyBwZXIgOiAzMCB9CiAgICAgIH0pLnRoZW4ocGFnaW5hdGVkKTsKICAgIH0sCgogICAgcmVwb3J0OiBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL21vZGVyYXRlL3JlcG9ydCcsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IHBheWxvYWQgfSk7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gcmVxSWQoeCkgewogICAgaWYgKHggJiYgdHlwZW9mIHggPT09ICdvYmplY3QnKSByZXR1cm4geC5yZXF1ZXN0X2lkIHx8IHgucmVxdWVzdElEIHx8IHguaWQgfHwgJyc7CiAgICByZXR1cm4geDsKICB9CgogIGZ1bmN0aW9uIHBhcnNlU3VibWl0KHJlcykgewogICAgaWYgKHJlcy5zdGF0dXMgPT09IDIwMikgewoKICAgIH0KICAgIHJldHVybiByZXMudGV4dCgpLnRoZW4oZnVuY3Rpb24gKHR4dCkgewogICAgICB2YXIgYm9keSA9IHNhZmVQYXJzZSh0eHQpOwogICAgICBpZiAoIXJlcy5vayAmJiByZXMuc3RhdHVzICE9PSAyMDIpIHsKICAgICAgICB0aHJvdyBBcGlFcnJvcihyZXMuc3RhdHVzLCBlcnJvck1lc3NhZ2UoYm9keSwgcmVzLnN0YXR1cyksIGJvZHkpOwogICAgICB9CiAgICAgIGlmICghYm9keSB8fCAoIWJvZHkucmVxdWVzdF9pZCAmJiAhYm9keS5yZXF1ZXN0SUQpKSB7CiAgICAgICAgdGhyb3cgQXBpRXJyb3IocmVzLnN0YXR1cyB8fCA1MDIsIGVycm9yTWVzc2FnZShib2R5LCByZXMuc3RhdHVzKSB8fCAnR2VuZXJhdGlvbiBjb3VsZCBub3QgYmUgc3RhcnRlZC4nLCBib2R5KTsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIHJlcXVlc3RfaWQ6IGJvZHkucmVxdWVzdF9pZCB8fCBib2R5LnJlcXVlc3RJRCwKICAgICAgICBxdWV1ZV9wb3NpdGlvbjogYm9keS5xdWV1ZV9wb3NpdGlvbiAhPSBudWxsID8gYm9keS5xdWV1ZV9wb3NpdGlvbiA6IChib2R5LnF1ZXVlUG9zaXRpb24gIT0gbnVsbCA/IGJvZHkucXVldWVQb3NpdGlvbiA6IDApCiAgICAgIH07CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHNoYXBlRWRpdFJlcXVlc3QobW9kZWwsIHBhcmFtcykgewogICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgdmFyIHNlZWQgPSBwYXJhbXMuc2VlZCAhPSBudWxsID8gcGFyYW1zLnNlZWQgOiByYW5kb21TZWVkKCk7CiAgICB2YXIgYm9keSA9IHsKICAgICAgcHJvbXB0OiBwYXJhbXMucHJvbXB0IHx8ICcnLAogICAgICBzZWVkOiBzZWVkCiAgICB9OwoKICAgIHZhciB1cmxzID0gcGFyYW1zLmltYWdlX3VybHMgfHwgcGFyYW1zLmltYWdlVVJMcyB8fCBudWxsOwogICAgdmFyIHNpbmdsZSA9IHBhcmFtcy5pbWFnZV91cmwgfHwgcGFyYW1zLmltYWdlVVJMIHx8ICh1cmxzICYmIHVybHMubGVuZ3RoID8gdXJsc1swXSA6IG51bGwpOwoKICAgIGlmIChwYXJhbXMuaW1hZ2Vfc2l6ZSkgYm9keS5pbWFnZV9zaXplID0gcGFyYW1zLmltYWdlX3NpemU7CgogICAgaWYgKE5BTk9fTU9ERUxTW21vZGVsXSkgewoKICAgICAgdmFyIGFyciA9IHVybHMgJiYgdXJscy5sZW5ndGggPyB1cmxzLnNsaWNlKCkgOiAoc2luZ2xlID8gW3NpbmdsZV0gOiBbXSk7CiAgICAgIGJvZHkuaW1hZ2VfdXJscyA9IGFycjsKICAgICAgaWYgKHNpbmdsZSkgYm9keS5pbWFnZV91cmwgPSBzaW5nbGU7CiAgICAgIGJvZHkubnVtX2ltYWdlcyA9IDE7CgogICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gJ3F3ZW5JbWFnZUVkaXQnKSB7CiAgICAgIGlmIChzaW5nbGUpIGJvZHkuaW1hZ2VfdXJsID0gc2luZ2xlOwogICAgICBib2R5Lm51bV9pbmZlcmVuY2Vfc3RlcHMgPSAzMDsKICAgICAgYm9keS5ndWlkYW5jZV9zY2FsZSA9IDQ7CiAgICAgIGJvZHkubmVnYXRpdmVfcHJvbXB0ID0gJyAnOwogICAgICBib2R5LmFjY2VsZXJhdGlvbiA9ICdoaWdoJzsKICAgIH0gZWxzZSB7CgogICAgICBpZiAoc2luZ2xlKSBib2R5LmltYWdlX3VybCA9IHNpbmdsZTsKICAgICAgaWYgKHVybHMgJiYgdXJscy5sZW5ndGggPiAxKSBib2R5LmltYWdlX3VybHMgPSB1cmxzLnNsaWNlKCk7CiAgICAgIGJvZHkuYWNjZWxlcmF0aW9uID0gJ2hpZ2gnOwogICAgfQoKICAgIGlmIChwYXJhbXMubnVtX2luZmVyZW5jZV9zdGVwcyAhPSBudWxsICYmIGJvZHkubnVtX2luZmVyZW5jZV9zdGVwcyA9PSBudWxsKSB7CiAgICAgIGJvZHkubnVtX2luZmVyZW5jZV9zdGVwcyA9IHBhcmFtcy5udW1faW5mZXJlbmNlX3N0ZXBzOwogICAgfQogICAgaWYgKHBhcmFtcy5ndWlkYW5jZV9zY2FsZSAhPSBudWxsICYmIGJvZHkuZ3VpZGFuY2Vfc2NhbGUgPT0gbnVsbCkgewogICAgICBib2R5Lmd1aWRhbmNlX3NjYWxlID0gcGFyYW1zLmd1aWRhbmNlX3NjYWxlOwogICAgfQogICAgaWYgKHBhcmFtcy5uZWdhdGl2ZV9wcm9tcHQgIT0gbnVsbCAmJiBib2R5Lm5lZ2F0aXZlX3Byb21wdCA9PSBudWxsKSB7CiAgICAgIGJvZHkubmVnYXRpdmVfcHJvbXB0ID0gcGFyYW1zLm5lZ2F0aXZlX3Byb21wdDsKICAgIH0KICAgIGlmIChwYXJhbXMubnVtX2ltYWdlcyAhPSBudWxsICYmIGJvZHkubnVtX2ltYWdlcyA9PSBudWxsKSB7CiAgICAgIGJvZHkubnVtX2ltYWdlcyA9IHBhcmFtcy5udW1faW1hZ2VzOwogICAgfQogICAgaWYgKHBhcmFtcy5sb3JhcyAhPSBudWxsKSBib2R5LmxvcmFzID0gcGFyYW1zLmxvcmFzOwogICAgaWYgKHBhcmFtcy5hY2NlbGVyYXRpb24gIT0gbnVsbCkgYm9keS5hY2NlbGVyYXRpb24gPSBwYXJhbXMuYWNjZWxlcmF0aW9uOwoKICAgIHJldHVybiBib2R5OwogIH0KCiAgZnVuY3Rpb24gbm9ybWFsaXplUHJlc2V0KHApIHsKICAgIHAgPSBwIHx8IHt9OwogICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9cLlxkezN9WiQvLCAnWicpOwogICAgcmV0dXJuIHsKICAgICAgaWQ6IHAuaWQgfHwgdXVpZCgpLAogICAgICBuYW1lOiBwLm5hbWUgfHwgJycsCiAgICAgIHByb21wdDogcC5wcm9tcHQgfHwgJycsCiAgICAgIG5lZ2F0aXZlUHJvbXB0OiBwLm5lZ2F0aXZlUHJvbXB0ICE9IG51bGwgPyBwLm5lZ2F0aXZlUHJvbXB0IDogbnVsbCwKICAgICAgbW9kZWw6IHAubW9kZWwgIT0gbnVsbCA/IHAubW9kZWwgOiBudWxsLAogICAgICBkeW5hbWljRW5kcG9pbnRJRDogcC5keW5hbWljRW5kcG9pbnRJRCAhPSBudWxsID8gcC5keW5hbWljRW5kcG9pbnRJRCA6IG51bGwsCiAgICAgIGNyZWF0ZWRBdDogcC5jcmVhdGVkQXQgfHwgbm93LAogICAgICB1cGRhdGVkQXQ6IG5vdwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHBhZ2luYXRlZChib2R5KSB7CiAgICBpZiAoIWJvZHkpIHJldHVybiB7IGl0ZW1zOiBbXSwgbWV0YWRhdGE6IHsgcGFnZTogMSwgcGVyOiAwLCB0b3RhbDogMCB9IH07CiAgICBpZiAoQXJyYXkuaXNBcnJheShib2R5KSkgewogICAgICByZXR1cm4geyBpdGVtczogYm9keSwgbWV0YWRhdGE6IHsgcGFnZTogMSwgcGVyOiBib2R5Lmxlbmd0aCwgdG90YWw6IGJvZHkubGVuZ3RoIH0gfTsKICAgIH0KICAgIHZhciBpdGVtcyA9IEFycmF5LmlzQXJyYXkoYm9keS5pdGVtcykgPyBib2R5Lml0ZW1zIDogW107CiAgICB2YXIgbWV0YSA9IGJvZHkubWV0YWRhdGEgfHwge307CiAgICByZXR1cm4gewogICAgICBpdGVtczogaXRlbXMsCiAgICAgIG1ldGFkYXRhOiB7CiAgICAgICAgcGFnZTogbWV0YS5wYWdlICE9IG51bGwgPyBtZXRhLnBhZ2UgOiAxLAogICAgICAgIHBlcjogbWV0YS5wZXIgIT0gbnVsbCA/IG1ldGEucGVyIDogaXRlbXMubGVuZ3RoLAogICAgICAgIHRvdGFsOiBtZXRhLnRvdGFsICE9IG51bGwgPyBtZXRhLnRvdGFsIDogaXRlbXMubGVuZ3RoCiAgICAgIH0KICAgIH07CiAgfQoKICBmdW5jdGlvbiBlbmNvZGVTbHVnKGVuZHBvaW50SWQpIHsKICAgIHZhciBzbHVnID0gU3RyaW5nKGVuZHBvaW50SWQgfHwgJycpLnJlcGxhY2UoL15mYWwtYWlcLy8sICcnKTsKCiAgICByZXR1cm4gc2x1Zy5zcGxpdCgnLycpLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJy8nKTsKICB9CgogIGZ1bmN0aW9uIG1lZGlhVHlwZUNvbnRlbnRUeXBlKG1lZGlhVHlwZSkgewogICAgc3dpdGNoIChtZWRpYVR5cGUpIHsKICAgICAgY2FzZSAncGRmJzogcmV0dXJuICdhcHBsaWNhdGlvbi9wZGYnOwogICAgICBjYXNlICdqc29uJzogcmV0dXJuICdhcHBsaWNhdGlvbi9qc29uJzsKICAgICAgY2FzZSAnb2JqWmlwJzoKICAgICAgY2FzZSAnc3BhdGlhbEFzc2V0JzogcmV0dXJuICdhcHBsaWNhdGlvbi96aXAnOwogICAgICBjYXNlICd1c2R6JzogcmV0dXJuICdtb2RlbC92bmQudXNkeit6aXAnOwogICAgICBjYXNlICdkYXRhJzoKICAgICAgY2FzZSAnZHdnJzoKICAgICAgY2FzZSAncmVhbGl0eSc6IHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKCiAgICAgIGRlZmF1bHQ6IHJldHVybiAnaW1hZ2UvanBlZyc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBmaWxlRXh0KGNvbnRlbnRUeXBlKSB7CiAgICBpZiAoIWNvbnRlbnRUeXBlKSByZXR1cm4gJy5qcGcnOwogICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoJ3BuZycpID49IDApIHJldHVybiAnLnBuZyc7CiAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignd2VicCcpID49IDApIHJldHVybiAnLndlYnAnOwogICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoJ2pwZWcnKSA+PSAwIHx8IGNvbnRlbnRUeXBlLmluZGV4T2YoJ2pwZycpID49IDApIHJldHVybiAnLmpwZyc7CiAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignbXA0JykgPj0gMCkgcmV0dXJuICcubXA0JzsKICAgIHJldHVybiAnLmJpbic7CiAgfQoKICBmdW5jdGlvbiBiNjQoc3RyKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwuYjY0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51dGlsLmI2NChzdHIpOwogICAgdHJ5IHsKICAgICAgcmV0dXJuIHdpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7CiAgICB9IGNhdGNoIChfZSkgewogICAgICByZXR1cm4gd2luZG93LmJ0b2Eoc3RyKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHV1aWQoKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwudXVpZCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudXRpbC51dWlkKCk7CiAgICBpZiAod2luZG93LmNyeXB0byAmJiB0eXBlb2Ygd2luZG93LmNyeXB0by5yYW5kb21VVUlEID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKTsKICAgIH0KICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgIHZhciByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwOwogICAgICB2YXIgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDg7CiAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTsKICAgIH0pOwogIH0KCiAgVi5hcGkgPSBhcGk7Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2F1dGguanMgPT09PT0gKi8KCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9IHdpbmRvdy5WIHx8ICh3aW5kb3cuViA9IHt9KTsKCiAgdmFyIFRPS0VOX0tFWSA9ICd2YW1wX3dlYl90b2tlbic7CgogIGZ1bmN0aW9uIHNhZmVHZXRTdG9yYWdlKCkgewoKICAgIHRyeSB7CiAgICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlIHx8IG51bGw7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVhZFRva2VuKCkgewogICAgdmFyIGxzID0gc2FmZUdldFN0b3JhZ2UoKTsKICAgIGlmICghbHMpIHJldHVybiBudWxsOwogICAgdHJ5IHsKICAgICAgdmFyIHQgPSBscy5nZXRJdGVtKFRPS0VOX0tFWSk7CiAgICAgIHJldHVybiB0ICYmIHQubGVuZ3RoID8gdCA6IG51bGw7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gd3JpdGVUb2tlbih0KSB7CiAgICB2YXIgbHMgPSBzYWZlR2V0U3RvcmFnZSgpOwogICAgaWYgKCFscykgcmV0dXJuOwogICAgdHJ5IHsKICAgICAgaWYgKHQgPT0gbnVsbCB8fCB0ID09PSAnJykgbHMucmVtb3ZlSXRlbShUT0tFTl9LRVkpOwogICAgICBlbHNlIGxzLnNldEl0ZW0oVE9LRU5fS0VZLCBTdHJpbmcodCkpOwogICAgfSBjYXRjaCAoZSkgewoKICAgIH0KICB9CgogIGZ1bmN0aW9uIGVtaXQoZXZ0LCBwYXlsb2FkKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5lbWl0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgVi5zdG9yZS5lbWl0KGV2dCwgcGF5bG9hZCk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKCiAgICB9CiAgfQoKICBmdW5jdGlvbiBzZXRTdGF0ZShrZXksIHZhbHVlKSB7CiAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5zZXQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgVi5zdG9yZS5zZXQoa2V5LCB2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICBWLnN0YXRlID0gVi5zdGF0ZSB8fCB7fTsKICAgICAgVi5zdGF0ZVtrZXldID0gdmFsdWU7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXRTdGF0ZShrZXkpIHsKICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLmdldCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYuc3RvcmUuZ2V0KGtleSk7CiAgICByZXR1cm4gVi5zdGF0ZSA/IFYuc3RhdGVba2V5XSA6IHVuZGVmaW5lZDsKICB9CgogIGZ1bmN0aW9uIG5vcm1hbGl6ZVVzZXIocGVyc29uYWwpIHsKICAgIGlmICghcGVyc29uYWwgfHwgdHlwZW9mIHBlcnNvbmFsICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7CgogICAgdmFyIGdsb2JhbCA9IHBlcnNvbmFsLmdsb2JhbCAmJiB0eXBlb2YgcGVyc29uYWwuZ2xvYmFsID09PSAnb2JqZWN0JyA/IHBlcnNvbmFsLmdsb2JhbCA6IHt9OwogICAgdmFyIG1pY3JvID0gZ2xvYmFsLm1pY3JvICYmIHR5cGVvZiBnbG9iYWwubWljcm8gPT09ICdvYmplY3QnID8gZ2xvYmFsLm1pY3JvIDoge307CgogICAgdmFyIGlkID0gbWljcm8uaWQgIT0gbnVsbCA/IG1pY3JvLmlkIDogKHBlcnNvbmFsLmlkICE9IG51bGwgPyBwZXJzb25hbC5pZCA6IG51bGwpOwoKICAgIHZhciB1c2VybmFtZSA9IG1pY3JvLnVzZXJuYW1lICE9IG51bGwgPyBtaWNyby51c2VybmFtZQogICAgICA6IChwZXJzb25hbC51c2VybmFtZSAhPSBudWxsID8gcGVyc29uYWwudXNlcm5hbWUgOiBudWxsKTsKCiAgICB2YXIgZW1haWwgPSBwZXJzb25hbC5lbWFpbCAhPSBudWxsID8gcGVyc29uYWwuZW1haWwgOiBudWxsOwoKICAgIHZhciBmaXJzdE5hbWUgPSBtaWNyby5maXJzdE5hbWUgIT0gbnVsbCA/IG1pY3JvLmZpcnN0TmFtZQogICAgICA6IChwZXJzb25hbC5maXJzdE5hbWUgIT0gbnVsbCA/IHBlcnNvbmFsLmZpcnN0TmFtZSA6IG51bGwpOwogICAgdmFyIGxhc3ROYW1lID0gbWljcm8ubGFzdE5hbWUgIT0gbnVsbCA/IG1pY3JvLmxhc3ROYW1lCiAgICAgIDogKHBlcnNvbmFsLmxhc3ROYW1lICE9IG51bGwgPyBwZXJzb25hbC5sYXN0TmFtZSA6IG51bGwpOwoKICAgIHZhciBuYW1lID0gbWljcm8ubmFtZSAhPSBudWxsID8gbWljcm8ubmFtZQogICAgICA6IChwZXJzb25hbC5uYW1lICE9IG51bGwgPyBwZXJzb25hbC5uYW1lIDogbnVsbCk7CiAgICBpZiAoIW5hbWUpIHsKICAgICAgdmFyIHBhcnRzID0gW107CiAgICAgIGlmIChmaXJzdE5hbWUpIHBhcnRzLnB1c2goZmlyc3ROYW1lKTsKICAgICAgaWYgKGxhc3ROYW1lKSBwYXJ0cy5wdXNoKGxhc3ROYW1lKTsKICAgICAgbmFtZSA9IHBhcnRzLmpvaW4oJyAnKSB8fCBudWxsOwogICAgfQoKICAgIHZhciBkaXNwbGF5TmFtZSA9IG5hbWUgfHwgdXNlcm5hbWUgfHwgKGVtYWlsID8gZW1haWwuc3BsaXQoJ0AnKVswXSA6IG51bGwpIHx8ICdZb3UnOwoKICAgIHZhciBwcm9maWxlUGljVVJMID0gbWljcm8ucHJvZmlsZVBpY1VSTCAhPSBudWxsID8gbWljcm8ucHJvZmlsZVBpY1VSTAogICAgICA6IChwZXJzb25hbC5wcm9maWxlUGljVVJMICE9IG51bGwgPyBwZXJzb25hbC5wcm9maWxlUGljVVJMIDogbnVsbCk7CgogICAgcmV0dXJuIHsKICAgICAgaWQ6IGlkLAogICAgICBlbWFpbDogZW1haWwsCiAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSwKICAgICAgbmFtZTogbmFtZSwKICAgICAgZGlzcGxheU5hbWU6IGRpc3BsYXlOYW1lLAogICAgICBmaXJzdE5hbWU6IGZpcnN0TmFtZSwKICAgICAgbGFzdE5hbWU6IGxhc3ROYW1lLAogICAgICBwcm9maWxlUGljVVJMOiBwcm9maWxlUGljVVJMLAogICAgICBhZG1pbjogcGVyc29uYWwuYWRtaW4gPT09IHRydWUsCiAgICAgIGVtYWlsQ29uZmlybWVkOiBwZXJzb25hbC5lbWFpbENvbmZpcm1lZCA9PT0gdHJ1ZSwKICAgICAgaXNBbm9ueW1vdXM6IG1pY3JvLmlzQW5vbnltb3VzID09PSB0cnVlLAoKICAgICAgY3JlZGl0czogdHlwZW9mIHBlcnNvbmFsLmNyZWRpdHMgPT09ICdudW1iZXInID8gcGVyc29uYWwuY3JlZGl0cyA6IG51bGwsCgogICAgICBnbG9iYWw6IGdsb2JhbCwKICAgICAgbWljcm86IG1pY3JvLAogICAgICByYXc6IHBlcnNvbmFsLAogICAgfTsKICB9CgogIGZ1bmN0aW9uIGlzQXBpRXJyb3IoZXJyKSB7CiAgICByZXR1cm4gZXJyICYmIChlcnIubmFtZSA9PT0gJ0FwaUVycm9yJyB8fCB0eXBlb2YgZXJyLnN0YXR1cyA9PT0gJ251bWJlcicpOwogIH0KCiAgZnVuY3Rpb24gcmVmcmVzaENyZWRpdHMoKSB7CiAgICBpZiAoIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS5jcmVkaXRzICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgcmV0dXJuIFYuYXBpLmNyZWRpdHMoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgdmFyIG4gPSByZXMgJiYgdHlwZW9mIHJlcy5jcmVkaXRzID09PSAnbnVtYmVyJyA/IHJlcy5jcmVkaXRzIDogbnVsbDsKICAgICAgaWYgKG4gIT0gbnVsbCkgewogICAgICAgIHNldFN0YXRlKCdjcmVkaXRzJywgbik7CgogICAgICAgIHZhciB1ID0gZ2V0U3RhdGUoJ3VzZXInKTsKICAgICAgICBpZiAodSAmJiB0eXBlb2YgdSA9PT0gJ29iamVjdCcpIHUuY3JlZGl0cyA9IG47CiAgICAgICAgZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgbik7CiAgICAgIH0KICAgICAgcmV0dXJuIG47CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CgogICAgICBpZiAoaXNBcGlFcnJvcihlcnIpICYmIChlcnIuc3RhdHVzID09PSA0MDEgfHwgZXJyLnN0YXR1cyA9PT0gNDAzKSkgewogICAgICAgIGFwaTQwMUNsZWFyKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGFwaTQwMUNsZWFyKCkgewogICAgY2xlYXIoKTsKICAgIGVtaXQoJ2Vycm9yJywgeyBtZXNzYWdlOiAnWW91ciBzZXNzaW9uIGV4cGlyZWQuIFBsZWFzZSBzaWduIGluIGFnYWluLicsIGNvZGU6ICdhdXRoJyB9KTsKICB9CgogIGZ1bmN0aW9uIHRva2VuKCkgewogICAgcmV0dXJuIHJlYWRUb2tlbigpOwogIH0KCiAgZnVuY3Rpb24gaXNBdXRoZWQoKSB7CiAgICByZXR1cm4gISFyZWFkVG9rZW4oKTsKICB9CgogIGZ1bmN0aW9uIHNldFRva2VuKHQpIHsKICAgIGlmICghdCkgewogICAgICBjbGVhcigpOwogICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdzZXRUb2tlbiBjYWxsZWQgd2l0aG91dCBhIHRva2VuJykpOwogICAgfQogICAgd3JpdGVUb2tlbih0KTsKCiAgICBpZiAoIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS53aG9hbWkgIT09ICdmdW5jdGlvbicpIHsKCiAgICAgIHZhciBzaGVsbCA9IG5vcm1hbGl6ZVVzZXIoeyB0b2tlbjogdCB9KTsKICAgICAgc2V0U3RhdGUoJ3VzZXInLCBzaGVsbCk7CiAgICAgIGVtaXQoJ2F1dGg6Y2hhbmdlZCcsIHNoZWxsKTsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzaGVsbCk7CiAgICB9CgogICAgcmV0dXJuIFYuYXBpLndob2FtaSgpLnRoZW4oZnVuY3Rpb24gKHBlcnNvbmFsKSB7CiAgICAgIHZhciB1c2VyID0gbm9ybWFsaXplVXNlcihwZXJzb25hbCk7CiAgICAgIHNldFN0YXRlKCd1c2VyJywgdXNlcik7CgogICAgICBpZiAodXNlciAmJiB0eXBlb2YgdXNlci5jcmVkaXRzID09PSAnbnVtYmVyJykgewogICAgICAgIHNldFN0YXRlKCdjcmVkaXRzJywgdXNlci5jcmVkaXRzKTsKICAgICAgICBlbWl0KCdjcmVkaXRzOmNoYW5nZWQnLCB1c2VyLmNyZWRpdHMpOwogICAgICB9CiAgICAgIGVtaXQoJ2F1dGg6Y2hhbmdlZCcsIHVzZXIpOwogICAgICByZXR1cm4gdXNlcjsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKCiAgICAgIGlmIChpc0FwaUVycm9yKGVycikgJiYgKGVyci5zdGF0dXMgPT09IDQwMSB8fCBlcnIuc3RhdHVzID09PSA0MDMpKSB7CiAgICAgICAgY2xlYXIoKTsKICAgICAgfSBlbHNlIHsKCiAgICAgICAgc2V0U3RhdGUoJ3VzZXInLCBudWxsKTsKICAgICAgICBlbWl0KCdhdXRoOmNoYW5nZWQnLCBudWxsKTsKICAgICAgfQogICAgICB0aHJvdyBlcnI7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGNsZWFyKCkgewogICAgd3JpdGVUb2tlbihudWxsKTsKICAgIHNldFN0YXRlKCd1c2VyJywgbnVsbCk7CiAgICBzZXRTdGF0ZSgnY3JlZGl0cycsIG51bGwpOwogICAgZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgbnVsbCk7CiAgICBlbWl0KCdhdXRoOmNoYW5nZWQnLCBudWxsKTsKICB9CgogIGZ1bmN0aW9uIHNpZ25JbihlbWFpbCwgcGFzc3dvcmQpIHsKICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLmxvZ2luICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0FQSSBub3QgcmVhZHknKSk7CiAgICB9CiAgICB2YXIgZW0gPSAoZW1haWwgPT0gbnVsbCA/ICcnIDogU3RyaW5nKGVtYWlsKSkudHJpbSgpOwogICAgdmFyIHB3ID0gcGFzc3dvcmQgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHBhc3N3b3JkKTsKICAgIGlmICghZW0pIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0VtYWlsIGlzIHJlcXVpcmVkJykpOwogICAgaWYgKCFwdykgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUGFzc3dvcmQgaXMgcmVxdWlyZWQnKSk7CgogICAgcmV0dXJuIFYuYXBpLmxvZ2luKGVtLCBwdykudGhlbihmdW5jdGlvbiAocGVyc29uYWwpIHsKICAgICAgdmFyIHQgPSBwZXJzb25hbCAmJiBwZXJzb25hbC50b2tlbjsKICAgICAgaWYgKCF0KSB0aHJvdyBuZXcgRXJyb3IoJ0xvZ2luIHJlc3BvbnNlIGRpZCBub3QgaW5jbHVkZSBhIHRva2VuJyk7CiAgICAgIHJldHVybiBzZXRUb2tlbih0KS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7CgogICAgICAgIHJldHVybiByZWZyZXNoQ3JlZGl0cygpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdXNlcjsgfSk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZWdpc3Rlcihmb3JtKSB7CiAgICBpZiAoIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS5zaWdudXAgIT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignQVBJIG5vdCByZWFkeScpKTsKICAgIH0KICAgIGZvcm0gPSBmb3JtIHx8IHt9OwoKICAgIHZhciBlbWFpbCA9IChmb3JtLmVtYWlsID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLmVtYWlsKSkudHJpbSgpOwogICAgdmFyIHBhc3N3b3JkID0gZm9ybS5wYXNzd29yZCA9PSBudWxsID8gJycgOiBTdHJpbmcoZm9ybS5wYXNzd29yZCk7CiAgICBpZiAoIWVtYWlsKSByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdFbWFpbCBpcyByZXF1aXJlZCcpKTsKICAgIGlmICghcGFzc3dvcmQpIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJykpOwogICAgaWYgKHBhc3N3b3JkLmxlbmd0aCA8IDggfHwgcGFzc3dvcmQubGVuZ3RoID4gMjQpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUGFzc3dvcmQgbXVzdCBiZSA44oCTMjQgY2hhcmFjdGVycycpKTsKICAgIH0KCiAgICB2YXIgZmlyc3ROYW1lID0gKGZvcm0uZmlyc3ROYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLmZpcnN0TmFtZSkpLnRyaW0oKTsKICAgIHZhciBsYXN0TmFtZSA9IChmb3JtLmxhc3ROYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLmxhc3ROYW1lKSkudHJpbSgpOwogICAgdmFyIG5hbWUgPSAoZm9ybS5uYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLm5hbWUpKS50cmltKCk7CgogICAgaWYgKCFuYW1lICYmIChmaXJzdE5hbWUgfHwgbGFzdE5hbWUpKSB7CiAgICAgIG5hbWUgPSBbZmlyc3ROYW1lLCBsYXN0TmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTsKICAgIH0KICAgIGlmIChuYW1lICYmICFmaXJzdE5hbWUpIHsKCiAgICAgIHZhciBiaXRzID0gbmFtZS5zcGxpdCgvXHMrLyk7CiAgICAgIGZpcnN0TmFtZSA9IGJpdHNbMF0gfHwgJyc7CiAgICAgIGlmICghbGFzdE5hbWUgJiYgYml0cy5sZW5ndGggPiAxKSBsYXN0TmFtZSA9IGJpdHMuc2xpY2UoMSkuam9pbignICcpOwogICAgfQoKICAgIHZhciBkYXRhID0gewogICAgICBlbWFpbDogZW1haWwsCiAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCwKICAgICAgbmFtZTogbmFtZSB8fCAoZW1haWwuc3BsaXQoJ0AnKVswXSksCiAgICAgIGZpcnN0TmFtZTogZmlyc3ROYW1lIHx8IChuYW1lID8gbmFtZS5zcGxpdCgvXHMrLylbMF0gOiAnJyksCiAgICAgIGxhc3ROYW1lOiBsYXN0TmFtZSB8fCAnJywKICAgICAgaGFzQWNjZXB0ZWRUZXJtc0FuZENvbmRpdGlvbnM6IHRydWUsCiAgICAgIGhhc0FjY2VwdGVkUHJpdmFjeVBvbGljeTogdHJ1ZSwKICAgICAgaGFyZHdhcmU6IG51bGwsCiAgICB9OwoKICAgIHZhciB1c2VybmFtZSA9IChmb3JtLnVzZXJuYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLnVzZXJuYW1lKSkudHJpbSgpOwogICAgaWYgKHVzZXJuYW1lKSBkYXRhLnVzZXJuYW1lID0gdXNlcm5hbWU7CgogICAgcmV0dXJuIFYuYXBpLnNpZ251cChkYXRhKS50aGVuKGZ1bmN0aW9uIChwZXJzb25hbCkgewogICAgICB2YXIgdCA9IHBlcnNvbmFsICYmIHBlcnNvbmFsLnRva2VuOwogICAgICBpZiAoIXQpIHRocm93IG5ldyBFcnJvcignU2lnbnVwIHJlc3BvbnNlIGRpZCBub3QgaW5jbHVkZSBhIHRva2VuJyk7CiAgICAgIHJldHVybiBzZXRUb2tlbih0KS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7CiAgICAgICAgcmV0dXJuIHJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB1c2VyOyB9KTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHsKICAgIHZhciB0ID0gcmVhZFRva2VuKCk7CiAgICBpZiAoIXQpIHsKCiAgICAgIHNldFN0YXRlKCd1c2VyJywgbnVsbCk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwogICAgfQoKICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLndob2FtaSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpOwogICAgfQoKICAgIHJldHVybiBWLmFwaS53aG9hbWkoKS50aGVuKGZ1bmN0aW9uIChwZXJzb25hbCkgewogICAgICB2YXIgdXNlciA9IG5vcm1hbGl6ZVVzZXIocGVyc29uYWwpOwogICAgICBzZXRTdGF0ZSgndXNlcicsIHVzZXIpOwogICAgICBlbWl0KCdhdXRoOmNoYW5nZWQnLCB1c2VyKTsKICAgICAgaWYgKHVzZXIgJiYgdHlwZW9mIHVzZXIuY3JlZGl0cyA9PT0gJ251bWJlcicpIHsKICAgICAgICBzZXRTdGF0ZSgnY3JlZGl0cycsIHVzZXIuY3JlZGl0cyk7CiAgICAgICAgZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgdXNlci5jcmVkaXRzKTsKICAgICAgfQoKICAgICAgcmVmcmVzaENyZWRpdHMoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIGlmIChpc0FwaUVycm9yKGVycikgJiYgKGVyci5zdGF0dXMgPT09IDQwMSB8fCBlcnIuc3RhdHVzID09PSA0MDMpKSB7CgogICAgICAgIGNsZWFyKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICBzZXRTdGF0ZSgndXNlcicsIG51bGwpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0pOwogIH0KCiAgVi5hdXRoID0gewogICAgdG9rZW46IHRva2VuLAogICAgc2V0VG9rZW46IHNldFRva2VuLAogICAgY2xlYXI6IGNsZWFyLAogICAgaXNBdXRoZWQ6IGlzQXV0aGVkLAogICAgc2lnbkluOiBzaWduSW4sCiAgICByZWdpc3RlcjogcmVnaXN0ZXIsCiAgICBib290c3RyYXA6IGJvb3RzdHJhcCwKCiAgICByZWZyZXNoQ3JlZGl0czogcmVmcmVzaENyZWRpdHMsCgogICAgbm9ybWFsaXplVXNlcjogbm9ybWFsaXplVXNlciwKICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9kYXRhL2FzcGVjdHMuanMgPT09PT0gKi8KCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLmRhdGEgPSBWLmRhdGEgfHwge307CgogIFYuZGF0YS5hc3BlY3RzID0gWwogICAgeyByYXc6ICdhdXRvJywgICAgICAgICBrZXk6ICdhdXRvJywgICAgICAgICBsYWJlbDogJ0F1dG8nLCAgICAgICAgICAgIHc6IDEwMjQsIGg6IDEwMjQsIGRlZmF1bHQ6IHRydWUgfSwKICAgIHsgcmF3OiAnc3F1YXJlJywgICAgICAga2V5OiAnc3F1YXJlJywgICAgICAgbGFiZWw6ICdTcXVhcmUnLCAgICAgICAgICB3OiAxMDI0LCBoOiAxMDI0IH0sCiAgICB7IHJhdzogJ3BvcnRyYWl0OTE2JywgIGtleTogJ3BvcnRyYWl0OTE2JywgIGxhYmVsOiAnUG9ydHJhaXQgOToxNicsICAgdzogMTAyNCwgaDogMTgyMCB9LAogICAgeyByYXc6ICdsYW5kc2NhcGUxNjknLCBrZXk6ICdsYW5kc2NhcGUxNjknLCBsYWJlbDogJ0xhbmRzY2FwZSAxNjo5JywgIHc6IDE4MjAsIGg6IDEwMjQgfSwKICAgIHsgcmF3OiAncG9ydHJhaXQ0MycsICAga2V5OiAncG9ydHJhaXQ0MycsICAgbGFiZWw6ICdQb3J0cmFpdCAzOjQnLCAgICB3OiAxMDI0LCBoOiAxMzY1IH0sCiAgICB7IHJhdzogJ2xhbmRzY2FwZTQzJywgIGtleTogJ2xhbmRzY2FwZTQzJywgIGxhYmVsOiAnTGFuZHNjYXBlIDQ6MycsICAgdzogMTM2NSwgaDogMTAyNCB9CiAgXTsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvZGF0YS9pbmR1c3RyaWVzLmpzID09PT09ICovCgooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIFYgPSAod2luZG93LlYgPSB3aW5kb3cuViB8fCB7fSk7CiAgVi5kYXRhID0gVi5kYXRhIHx8IHt9OwoKICBWLmRhdGEuaW5kdXN0cnlQcm9tcHRQbGFjZWhvbGRlciA9CiAgICAnRGVzY3JpYmUgdGhlIHRyYW5zZm9ybWF0aW9uIOKAlCBlLmcuIOKAnHN0YWdlIHRoaXMgZW1wdHkgbGl2aW5nIHJvb20gd2l0aCB3YXJtIG1vZGVybiBmdXJuaXR1cmXigJ3igKYnOwoKICBWLmRhdGEuaW5kdXN0cmllcyA9IFsKICAgIHsKICAgICAga2V5OiAnYXJjaGl0ZWN0dXJlJywKICAgICAgbGFiZWw6ICdBcmNoaXRlY3R1cmUnLAogICAgICBwbGFjZWhvbGRlcjoKICAgICAgICAnRGVzY3JpYmUgdGhlIHJlbmRlciDigJQgZS5nLiDigJxwaG90b3JlYWwgZXh0ZXJpb3Igb2YgdGhpcyBjb25jZXB0IGF0IGdvbGRlbiBob3VyLCBjbGVhbiBtb2Rlcm4gbWF0ZXJpYWxz4oCd4oCmJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnaW50ZXJpb3JEZXNpZ24nLAogICAgICBsYWJlbDogJ0ludGVyaW9yIERlc2lnbicsCiAgICAgIHBsYWNlaG9sZGVyOgogICAgICAgICdEZXNjcmliZSB0aGUgcmVzdHlsZSDigJQgZS5nLiDigJxzdGFnZSB0aGlzIHJvb20gd2l0aCB3YXJtIG1pbmltYWxpc3QgZnVybml0dXJlIGFuZCBzb2Z0IGRheWxpZ2h04oCd4oCmJwogICAgfSwKICAgIHsKICAgICAga2V5OiAncmVhbEVzdGF0ZScsCiAgICAgIGxhYmVsOiAnUmVhbCBFc3RhdGUnLAogICAgICBwbGFjZWhvbGRlcjoKICAgICAgICAnRGVzY3JpYmUgdGhlIGxpc3Rpbmcgc2hvdCDigJQgZS5nLiDigJx2aXJ0dWFsbHkgc3RhZ2UgdGhpcyBlbXB0eSByb29tLCBNTFMtcmVhZHksIGJyaWdodCBhbmQgaW52aXRpbmfigJ3igKYnCiAgICB9LAogICAgewogICAgICBrZXk6ICdsYW5kc2NhcGluZycsCiAgICAgIGxhYmVsOiAnTGFuZHNjYXBpbmcnLAogICAgICBwbGFjZWhvbGRlcjoKICAgICAgICAnRGVzY3JpYmUgdGhlIHlhcmQg4oCUIGUuZy4g4oCcdHJhbnNmb3JtIHRoaXMgYmFja3lhcmQgd2l0aCBsdXNoIGxhbmRzY2FwaW5nLCBhIHBhdGlvLCBhbmQgc3RyaW5nIGxpZ2h0c+KAneKApicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2Z1cm5pc2hpbmcnLAogICAgICBsYWJlbDogJ0Z1cm5pc2hpbmcnLAogICAgICBwbGFjZWhvbGRlcjoKICAgICAgICAnRGVzY3JpYmUgdGhlIHNjZW5lIOKAlCBlLmcuIOKAnHBsYWNlIHRoaXMgc29mYSBpbiBhIHN0eWxlZCwgd2VsbC1saXQgbGl2aW5nIHJvb20gZm9yIHRoZSBjYXRhbG9n4oCd4oCmJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnY29uc3RydWN0aW9uJywKICAgICAgbGFiZWw6ICdDb25zdHJ1Y3Rpb24nLAogICAgICBwbGFjZWhvbGRlcjoKICAgICAgICAnRGVzY3JpYmUgdGhlIHJlbm92YXRpb24g4oCUIGUuZy4g4oCcc2hvdyB0aGlzIGtpdGNoZW4gZnVsbHkgcmVtb2RlbGVkIHdpdGggbmV3IGNhYmluZXRzIGFuZCBjb3VudGVyc+KAneKApicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2hvbWVPd25lcicsCiAgICAgIGxhYmVsOiAnSG9tZSBPd25lcicsCiAgICAgIHBsYWNlaG9sZGVyOgogICAgICAgICdEZXNjcmliZSB0aGUgaWRlYSDigJQgZS5nLiDigJxyZXBhaW50IHRoZXNlIHdhbGxzIGEgc29mdCBzYWdlIGdyZWVuIGFuZCBhZGQgbW9kZXJuIGRlY29y4oCd4oCmJwogICAgfQogIF07Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2RhdGEvbW9kZWxzLmpzID09PT09ICovCgooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIFYgPSAod2luZG93LlYgPSB3aW5kb3cuViB8fCB7fSk7CiAgVi5kYXRhID0gVi5kYXRhIHx8IHt9OwoKICBWLmRhdGEubW9kZWxzID0gWwogICAgewogICAgICByYXc6ICdmbHV4S2xlaW4nLAogICAgICBsYWJlbDogJ1N0YW5kYXJkJywKICAgICAgc3ViaGVhZGluZzogJ0Zhc3QgJiBiYWxhbmNlZCcsCiAgICAgIGNvc3Q6IDEwLAogICAgICBtYXhSZWY6IDEsCiAgICAgIGRlZmF1bHQ6IHRydWUKICAgIH0sCiAgICB7CiAgICAgIHJhdzogJ2ZsdXgxS29udGV4dCcsCiAgICAgIGxhYmVsOiAnTGVnYWN5JywKICAgICAgc3ViaGVhZGluZzogJ1RoZSBvcmlnaW5hbCBlbmdpbmUnLAogICAgICBjb3N0OiAxMCwKICAgICAgbWF4UmVmOiAxCiAgICB9LAogICAgewogICAgICByYXc6ICduYW5vQmFuYW5hJywKICAgICAgbGFiZWw6ICdQcm8nLAogICAgICBzdWJoZWFkaW5nOiAnU21hcnRlciBlZGl0cywgdXAgdG8gNiByZWZlcmVuY2VzJywKICAgICAgY29zdDogMTAsCiAgICAgIG1heFJlZjogNgogICAgfSwKICAgIHsKICAgICAgcmF3OiAnbmFub0JhbmFuYTInLAogICAgICBsYWJlbDogJ1BsdXMnLAogICAgICBzdWJoZWFkaW5nOiAnSGlnaGVyIGZpZGVsaXR5LCByaWNoZXIgZGV0YWlsJywKICAgICAgY29zdDogMTUsCiAgICAgIG1heFJlZjogNgogICAgfSwKICAgIHsKICAgICAgcmF3OiAnbmFub0JhbmFuYVBybycsCiAgICAgIGxhYmVsOiAnTWF4JywKICAgICAgc3ViaGVhZGluZzogJ0Jlc3QgcXVhbGl0eSwgdXAgdG8gMTUgcmVmZXJlbmNlcycsCiAgICAgIGNvc3Q6IDIwLAogICAgICBtYXhSZWY6IDE1CiAgICB9CiAgXTsKCiAgVi5kYXRhLnQyaU1vZGVsID0geyByYXc6ICdmbHV4MVNjaG5lbGwnLCBjb3N0OiAxIH07Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2RhdGEvc3dpenpsZXMuanMgPT09PT0gKi8KCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLmRhdGEgPSBWLmRhdGEgfHwge307CgogIFYuZGF0YS5zd2l6emxlcyA9IFsKICAgIHsKICAgICAga2V5OiAncmVtb3ZlQWxsRnVybml0dXJlJywKICAgICAgbGFiZWw6ICdFbXB0eSBSb29tJywKICAgICAgcHJvbXB0OiAnUmVtb3ZlIGFsbCBmdXJuaXR1cmUsIHBlcnNvbmFsIGl0ZW1zLCBjbHV0dGVyLCBhbmQgYmVsb25naW5ncyBmcm9tIHRoZSByb29tIHdoaWxlIGtlZXBpbmcgdGhlIGFyY2hpdGVjdHVyYWwgZmVhdHVyZXMsIHdhbGxzLCB3aW5kb3dzLCBhbmQgZmxvb3JpbmcgZXhhY3RseSB0aGUgc2FtZS4gQ3JlYXRlIGEgY29tcGxldGVseSBlbXB0eSwgY2xlYW4gc3BhY2UgcmVhZHkgZm9yIHByb2Zlc3Npb25hbCBzdGFnaW5nLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3JlbW92ZUNsdXR0ZXInLAogICAgICBsYWJlbDogJ0RlY2x1dHRlcicsCiAgICAgIHByb21wdDogJ1JlbW92ZSBhbGwgY2x1dHRlciwgcGVyc29uYWwgaXRlbXMsIGV4Y2Vzc2l2ZSBkZWNvcmF0aW9ucywgYW5kIHVubmVjZXNzYXJ5IG9iamVjdHMgd2hpbGUga2VlcGluZyB0aGUgbWFpbiBmdXJuaXR1cmUgcGllY2VzIGluIHRoZWlyIGN1cnJlbnQgcG9zaXRpb25zLiBNYWludGFpbiB0aGUgZXhpc3RpbmcgZnVybml0dXJlIGxheW91dCBidXQgY3JlYXRlIGEgY2xlYW4sIG9yZ2FuaXplZCBhcHBlYXJhbmNlLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3JlbW92ZUZ1cm5pdHVyZUFuZENsdXR0ZXInLAogICAgICBsYWJlbDogJ0VtcHR5ICYgQ2xlYW4nLAogICAgICBwcm9tcHQ6ICdSZW1vdmUgYWxsIGZ1cm5pdHVyZSwgcGVyc29uYWwgaXRlbXMsIGNsdXR0ZXIsIGRlY29yYXRpb25zLCBhbmQgYmVsb25naW5ncyBmcm9tIHRoZSByb29tIHdoaWxlIGtlZXBpbmcgdGhlIGFyY2hpdGVjdHVyYWwgZmVhdHVyZXMsIHdhbGxzLCB3aW5kb3dzLCBhbmQgZmxvb3JpbmcgZXhhY3RseSB0aGUgc2FtZS4gQ3JlYXRlIGEgY29tcGxldGVseSBlbXB0eSwgc3BvdGxlc3Mgc3BhY2UgcmVhZHkgZm9yIG5ldyBzdGFnaW5nLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3JlbW92ZVBlb3BsZScsCiAgICAgIGxhYmVsOiAnUmVtb3ZlIFBlb3BsZScsCiAgICAgIHByb21wdDogJ1JlbW92ZSBhbGwgcGVvcGxlLCBwZXJzb25zLCBhbmQgaHVtYW4gZmlndXJlcyBmcm9tIHRoZSBpbWFnZSB3aGlsZSBrZWVwaW5nIGFsbCBmdXJuaXR1cmUsIGRlY29yLCBhbmQgcm9vbSBlbGVtZW50cyBleGFjdGx5IHRoZSBzYW1lLiBNYWludGFpbiB0aGUgZXhhY3QgbGlnaHRpbmcgYW5kIGNvbXBvc2l0aW9uLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3JlbW92ZVJlZmxlY3Rpb25zJywKICAgICAgbGFiZWw6ICdSZW1vdmUgUmVmbGVjdGlvbnMnLAogICAgICBwcm9tcHQ6ICdSZW1vdmUgYWxsIHJlZmxlY3Rpb25zLCBtaXJyb3IgaW1hZ2VzLCBhbmQgdW53YW50ZWQgcmVmbGVjdGl2ZSBlbGVtZW50cyBmcm9tIHdpbmRvd3MsIG1pcnJvcnMsIGFuZCBnbG9zc3kgc3VyZmFjZXMgd2hpbGUga2VlcGluZyBhbGwgZnVybml0dXJlIGFuZCByb29tIGVsZW1lbnRzIGV4YWN0bHkgdGhlIHNhbWUuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnaW1wcm92ZUxpZ2h0aW5nJywKICAgICAgbGFiZWw6ICdCZXR0ZXIgTGlnaHQnLAogICAgICBwcm9tcHQ6ICdJbXByb3ZlIHRoZSBsaWdodGluZyB0byBiZSBicmlnaHQsIHdhcm0sIGFuZCB3ZWxjb21pbmcuIEFkZCBuYXR1cmFsIGxpZ2h0IGFwcGVhcmFuY2UsIHJlbW92ZSBoYXJzaCBzaGFkb3dzLCBhbmQgY3JlYXRlIGV2ZW4gaWxsdW1pbmF0aW9uIHRocm91Z2hvdXQgdGhlIHNwYWNlIHdoaWxlIGtlZXBpbmcgYWxsIG9iamVjdHMgYW5kIGZ1cm5pdHVyZSBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2ltcHJvdmVXZWF0aGVyJywKICAgICAgbGFiZWw6ICdCZXR0ZXIgV2VhdGhlcicsCiAgICAgIHByb21wdDogJ0NoYW5nZSB0aGUgd2VhdGhlciBjb25kaXRpb25zIHRvIGJyaWdodCwgc3VubnksIGFuZCBjbGVhciBza2llcy4gUmVtb3ZlIHJhaW4sIGNsb3Vkcywgc25vdywgb3Igb3ZlcmNhc3QgY29uZGl0aW9ucyB3aGlsZSBrZWVwaW5nIGFsbCBhcmNoaXRlY3R1cmUsIGxhbmRzY2FwaW5nLCBhbmQgcHJvcGVydHkgZWxlbWVudHMgZXhhY3RseSB0aGUgc2FtZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdjbGVhbkxhbmRzY2FwaW5nJywKICAgICAgbGFiZWw6ICdDbGVhbiBMYW5kc2NhcGUnLAogICAgICBwcm9tcHQ6ICdDbGVhbiB1cCBvdmVyZ3Jvd24gdmVnZXRhdGlvbiwgcmVtb3ZlIHdlZWRzLCB0cmltIGJ1c2hlcyBhbmQgdHJlZXMsIGNsZWFyIGRlYWQgcGxhbnRzLCBhbmQgb3JnYW5pemUgdGhlIGxhbmRzY2FwaW5nIHdoaWxlIGtlZXBpbmcgdGhlIHByb3BlcnR5IGFyY2hpdGVjdHVyZSBhbmQgaGFyZHNjYXBpbmcgZXhhY3RseSB0aGUgc2FtZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdhZGRMYW5kc2NhcGluZycsCiAgICAgIGxhYmVsOiAnQWRkIExhbmRzY2FwaW5nJywKICAgICAgcHJvbXB0OiAnQWRkIHByb2Zlc3Npb25hbCBsYW5kc2NhcGluZyBpbmNsdWRpbmcgd2VsbC1tYWludGFpbmVkIGdyYXNzLCB0cmltbWVkIGJ1c2hlcywgY29sb3JmdWwgZmxvd2VycywgbWF0dXJlIHRyZWVzLCBhbmQgYXR0cmFjdGl2ZSBnYXJkZW4gYmVkcyB3aGlsZSBrZWVwaW5nIGFsbCBhcmNoaXRlY3R1cmUgYW5kIHByb3BlcnR5IHN0cnVjdHVyZXMgZXhhY3RseSB0aGUgc2FtZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdhZGRDdXJiQXBwZWFsJywKICAgICAgbGFiZWw6ICdDdXJiIEFwcGVhbCcsCiAgICAgIHByb21wdDogIkVuaGFuY2UgdGhlIGZyb250IGVudHJhbmNlIGFuZCBjdXJiIGFwcGVhbCB3aXRoIGF0dHJhY3RpdmUgbGFuZHNjYXBpbmcsIGNsZWFuIHdhbGt3YXlzLCB1cGRhdGVkIGV4dGVyaW9yIGxpZ2h0aW5nLCBmcmVzaCBwYWludCBvbiBkb29ycywgYW5kIHdlbGNvbWluZyBlbnRyeXdheSBlbGVtZW50cyB3aGlsZSBtYWludGFpbmluZyB0aGUgcHJvcGVydHkncyBhcmNoaXRlY3R1cmFsIHN0eWxlLiIKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2ltcHJvdmVFeHRlcmlvcicsCiAgICAgIGxhYmVsOiAnRml4IEV4dGVyaW9yJywKICAgICAgcHJvbXB0OiAnUmVwYWlyIGFuZCBpbXByb3ZlIHRoZSBleHRlcmlvciBjb25kaXRpb24gaW5jbHVkaW5nIGZyZXNoIHBhaW50LCBjbGVhbiBzaWRpbmcsIHVwZGF0ZWQgdHJpbSwgcmVwYWlyZWQgcm9vZmluZywgYW5kIHdlbGwtbWFpbnRhaW5lZCBleHRlcmlvciBzdXJmYWNlcyB3aGlsZSBrZWVwaW5nIHRoZSBhcmNoaXRlY3R1cmFsIGRlc2lnbiBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ21vZGVybml6ZUV4dGVyaW9yJywKICAgICAgbGFiZWw6ICdNb2Rlcm4gRXh0ZXJpb3InLAogICAgICBwcm9tcHQ6ICJVcGRhdGUgdGhlIGV4dGVyaW9yIHdpdGggY29udGVtcG9yYXJ5IG1hdGVyaWFscywgbW9kZXJuIGNvbG9yIHNjaGVtZXMsIHVwZGF0ZWQgbGlnaHRpbmcgZml4dHVyZXMsIGNvbnRlbXBvcmFyeSBoYXJkd2FyZSwgYW5kIGN1cnJlbnQgZGVzaWduIGVsZW1lbnRzIHdoaWxlIG1haW50YWluaW5nIHRoZSBwcm9wZXJ0eSdzIHN0cnVjdHVyYWwgbGF5b3V0LiIKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2FkZE91dGRvb3JMaXZpbmcnLAogICAgICBsYWJlbDogJ091dGRvb3IgTGl2aW5nJywKICAgICAgcHJvbXB0OiAiQWRkIG91dGRvb3IgbGl2aW5nIHNwYWNlcyBpbmNsdWRpbmcgcGF0aW9zLCBkZWNrcywgb3V0ZG9vciBmdXJuaXR1cmUsIGZpcmUgcGl0cywgb3V0ZG9vciBraXRjaGVucywgb3Igc2VhdGluZyBhcmVhcyB0aGF0IHNob3djYXNlIHRoZSBwcm9wZXJ0eSdzIHBvdGVudGlhbCBmb3IgZW50ZXJ0YWlubWVudCBhbmQgcmVsYXhhdGlvbi4iCiAgICB9LAogICAgewogICAgICBrZXk6ICdpbXByb3ZlRW50cnl3YXknLAogICAgICBsYWJlbDogJ0JldHRlciBFbnRyYW5jZScsCiAgICAgIHByb21wdDogJ0VuaGFuY2UgdGhlIGZyb250IGVudHJhbmNlIHdpdGggYW4gYXR0cmFjdGl2ZSBkb29yLCB1cGRhdGVkIGhhcmR3YXJlLCB3ZWxjb21pbmcgbGlnaHRpbmcsIGNsZWFuIHN0ZXBzLCBwb3R0ZWQgcGxhbnRzLCBhbmQgYW4gaW52aXRpbmcgZW50cnl3YXkgdGhhdCBjcmVhdGVzIGFuIGV4Y2VsbGVudCBmaXJzdCBpbXByZXNzaW9uLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2NoYW5nZVNlYXNvbicsCiAgICAgIGxhYmVsOiAnQ2hhbmdlIFNlYXNvbicsCiAgICAgIHByb21wdDogJ0NoYW5nZSB0aGUgc2Vhc29uYWwgYXBwZWFyYW5jZSB0byBzaG93IHRoZSBwcm9wZXJ0eSBpbiBpZGVhbCBjb25kaXRpb25zIHdpdGggbHVzaCBncmVlbiBsYW5kc2NhcGluZywgYmxvb21pbmcgZmxvd2VycywgYW5kIGF0dHJhY3RpdmUgc2Vhc29uYWwgZWxlbWVudHMgd2hpbGUga2VlcGluZyBhbGwgc3RydWN0dXJlcyBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2ltcHJvdmVTa2llcycsCiAgICAgIGxhYmVsOiAnQmV0dGVyIFNraWVzJywKICAgICAgcHJvbXB0OiAnUmVwbGFjZSB0aGUgc2t5IHdpdGggYmVhdXRpZnVsIGJsdWUgc2tpZXMsIHB1ZmZ5IHdoaXRlIGNsb3VkcywgYW5kIGlkZWFsIGxpZ2h0aW5nIGNvbmRpdGlvbnMgdGhhdCBtYWtlIHRoZSBwcm9wZXJ0eSBsb29rIG1vcmUgYXR0cmFjdGl2ZSB3aGlsZSBrZWVwaW5nIGFsbCBncm91bmQtbGV2ZWwgZWxlbWVudHMgZXhhY3RseSB0aGUgc2FtZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdkZXBlcnNvbmFsaXplJywKICAgICAgbGFiZWw6ICdEZXBlcnNvbmFsaXplJywKICAgICAgcHJvbXB0OiAnUmVtb3ZlIGFsbCBwZXJzb25hbCBwaG90b2dyYXBocywgZmFtaWx5IHBpY3R1cmVzLCBwZXJzb25hbCBjb2xsZWN0aWJsZXMsIGFuZCBpbmRpdmlkdWFsIGl0ZW1zIHdoaWxlIGtlZXBpbmcgZnVybml0dXJlIGFuZCBnZW5lcmFsIGRlY29yLiBDcmVhdGUgYSBuZXV0cmFsIHNwYWNlIGJ1eWVycyBjYW4gZW52aXNpb24gYXMgdGhlaXIgb3duLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ21vZGVybml6ZScsCiAgICAgIGxhYmVsOiAnTW9kZXJuaXplJywKICAgICAgcHJvbXB0OiAiVXBkYXRlIGFuZCBtb2Rlcm5pemUgdGhlIHNwYWNlIHdpdGggY29udGVtcG9yYXJ5IGZpbmlzaGVzLCBjdXJyZW50IGNvbG9yIHBhbGV0dGVzLCBhbmQgbW9kZXJuIGRlc2lnbiBlbGVtZW50cyB3aGlsZSBtYWludGFpbmluZyB0aGUgcm9vbSdzIGFyY2hpdGVjdHVyYWwgc3RydWN0dXJlIGFuZCBsYXlvdXQuIgogICAgfSwKICAgIHsKICAgICAga2V5OiAnZml4V2FsbHMnLAogICAgICBsYWJlbDogJ0ZpeCBXYWxscycsCiAgICAgIHByb21wdDogJ1JlcGFpciBhbGwgdmlzaWJsZSB3YWxsIGRhbWFnZSBpbmNsdWRpbmcgY3JhY2tzLCBob2xlcywgc2N1ZmYgbWFya3MsIGFuZCBpbXBlcmZlY3Rpb25zLiBNYWtlIHdhbGxzIGxvb2sgZnJlc2hseSBwYWludGVkIGFuZCBwcmlzdGluZSB3aGlsZSBrZWVwaW5nIGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgcm9vbSBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ25ldXRyYWxQYWludCcsCiAgICAgIGxhYmVsOiAnTmV1dHJhbCBQYWludCcsCiAgICAgIHByb21wdDogJ0NoYW5nZSB3YWxsIHBhaW50IHRvIG5ldXRyYWwgY29sb3JzIGxpa2Ugd2FybSB3aGl0ZSwgbGlnaHQgZ3JleSwgb3Igc29mdCBiZWlnZS4gTWFpbnRhaW4gYWxsIGZ1cm5pdHVyZSwgZGVjb3IsIGFuZCByb29tIGxheW91dCBleGFjdGx5IGFzIHRoZXkgYXJlIHdoaWxlIG9ubHkgdXBkYXRpbmcgdGhlIHdhbGwgY29sb3IuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnYWRkUGxhbnRzJywKICAgICAgbGFiZWw6ICdBZGQgUGxhbnRzJywKICAgICAgcHJvbXB0OiAnQWRkIHRhc3RlZnVsIHBsYW50cyBhbmQgZ3JlZW5lcnkgaW5jbHVkaW5nIHBvdHRlZCBwbGFudHMsIHNtYWxsIHRyZWVzLCBvciBmcmVzaCBmbG93ZXJzIHRvIGJyaW5nIGxpZmUgYW5kIHdhcm10aCB0byB0aGUgc3BhY2Ugd2hpbGUga2VlcGluZyBhbGwgZXhpc3RpbmcgZnVybml0dXJlIGFuZCBkZWNvciBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2FkZFBvb2xBcmVhJywKICAgICAgbGFiZWw6ICdQb29sIEFyZWEnLAogICAgICBwcm9tcHQ6ICdBZGQgb3IgZW5oYW5jZSBwb29sIGFuZCBiYWNreWFyZCBhcmVhcyB3aXRoIHBvb2wgZnVybml0dXJlLCB1bWJyZWxsYXMsIGxvdW5nZSBjaGFpcnMsIG91dGRvb3IgZGluaW5nIHNldHMsIGFuZCBhdHRyYWN0aXZlIHBvb2xzaWRlIGxhbmRzY2FwaW5nIHRvIHNob3djYXNlIG91dGRvb3IgZW50ZXJ0YWlubWVudCBwb3RlbnRpYWwuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnbW9kZXJuU3RhZ2luZycsCiAgICAgIGxhYmVsOiAnTW9kZXJuIFN0YWdpbmcnLAogICAgICBwcm9tcHQ6ICdBZGQgbW9kZXJuIHN0YWdpbmcgZnVybml0dXJlIHdpdGggY2xlYW4gbGluZXMsIG5ldXRyYWwgY29sb3JzIGxpa2Ugd2hpdGUsIGdyZXksIGFuZCBiZWlnZSwgbWluaW1hbCBkZWNvciwgYW5kIGNvbnRlbXBvcmFyeSBwaWVjZXMuIENyZWF0ZSBhIHNsZWVrLCB1bmNsdXR0ZXJlZCBzcGFjZSB0aGF0IHNob3djYXNlcyBhcmNoaXRlY3R1cmFsIGZlYXR1cmVzLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3RyYW5zaXRpb25hbFN0YWdpbmcnLAogICAgICBsYWJlbDogJ1RyYW5zaXRpb25hbCcsCiAgICAgIHByb21wdDogJ0FkZCB0cmFuc2l0aW9uYWwgc3RhZ2luZyBmdXJuaXR1cmUgdGhhdCBibGVuZHMgdHJhZGl0aW9uYWwgYW5kIGNvbnRlbXBvcmFyeSBlbGVtZW50cy4gVXNlIHdhcm0sIGVhcnRoeSB0b25lcyB3aXRoIHVwaG9sc3RlcmVkIGZ1cm5pdHVyZSwgY2xlYW4gbGluZXMsIGFuZCB2aW50YWdlIGFjY2VudHMgbGlrZSBvcm5hdGUgbWlycm9ycyBvciB3b29kZW4gY29mZmVlIHRhYmxlcy4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdtaW5pbWFsaXN0U3RhZ2luZycsCiAgICAgIGxhYmVsOiAnTWluaW1hbGlzdCcsCiAgICAgIHByb21wdDogJ0FkZCBtaW5pbWFsaXN0IHN0YWdpbmcgZnVybml0dXJlIGVtcGhhc2l6aW5nIHNpbXBsaWNpdHkgYW5kIGZ1bmN0aW9uYWxpdHkuIFVzZSBjbGVhbiBsaW5lcywgbmV1dHJhbCB0b25lcywgYW5kIGZ1cm5pdHVyZSB0aGF0IHNlcnZlcyBtdWx0aXBsZSBwdXJwb3NlcyB3aXRob3V0IG92ZXJ3aGVsbWluZyB0aGUgc3BhY2UuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnd2FybU1pbmltYWxpc3RTdGFnaW5nJywKICAgICAgbGFiZWw6ICdXYXJtIE1pbmltYWxpc3QnLAogICAgICBwcm9tcHQ6ICdBZGQgd2FybSBtaW5pbWFsaXN0IHN0YWdpbmcgZnVybml0dXJlIGJhbGFuY2luZyB1bmNsdXR0ZXJlZCBzcGFjZXMgd2l0aCB3YXJtIHRvbmVzIGxpa2UgdGVycmFjb3R0YSwgYnJvd25zLCBhbmQgYmVpZ2VzLCBwbHVzIHNvZnQgdGV4dHVyZXMgbGlrZSBwbHVzaCB0aHJvd3MgYW5kIHBpbGxvd3MgZm9yIGEgY296eSwgd2VsY29taW5nIGZlZWwuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnbWlkQ2VudHVyeU1vZGVyblN0YWdpbmcnLAogICAgICBsYWJlbDogJ01pZC1DZW50dXJ5JywKICAgICAgcHJvbXB0OiAnQWRkIG1pZC1jZW50dXJ5IG1vZGVybiBzdGFnaW5nIGZ1cm5pdHVyZSB3aXRoIGljb25pYyBwaWVjZXMgZnJvbSB0aGUgMTk1MHMtNjBzIGluY2x1ZGluZyB3YWxudXQgd29vZCBmaW5pc2hlcywgdGFwZXJlZCBsZWdzLCBnZW9tZXRyaWMgcGF0dGVybnMsIHZpbnRhZ2UgYnJhc3MgZml4dHVyZXMsIGFuZCByaWNoIGpld2VsIHRvbmVzIGxpa2UgbXVzdGFyZCB5ZWxsb3cgYW5kIHRlYWwuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnYXJ0RGVjb1N0YWdpbmcnLAogICAgICBsYWJlbDogJ0FydCBEZWNvJywKICAgICAgcHJvbXB0OiAnQWRkIEFydCBEZWNvIHN0YWdpbmcgZnVybml0dXJlIHdpdGggYm9sZCBnZW9tZXRyaWMgcGF0dGVybnMsIG1ldGFsbGljIGFjY2VudHMgaW4gZ29sZCBhbmQgYnJhc3MsIHJpY2ggY29sb3JzIGxpa2UgZW1lcmFsZCBhbmQgbmF2eSwgbHV4dXJpb3VzIG1hdGVyaWFscyBsaWtlIHZlbHZldCBhbmQgbWFyYmxlLCBhbmQgZHJhbWF0aWMgbGlnaHRpbmcgZml4dHVyZXMuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnYmlvcGhpbGljU3RhZ2luZycsCiAgICAgIGxhYmVsOiAnQmlvcGhpbGljJywKICAgICAgcHJvbXB0OiAnQWRkIGJpb3BoaWxpYyBzdGFnaW5nIGZ1cm5pdHVyZSBlbXBoYXNpemluZyBuYXR1cmFsIG1hdGVyaWFscyBsaWtlIHdvb2QgYW5kIHN0b25lLCBhYnVuZGFudCBncmVlbmVyeSBhbmQgcGxhbnRzLCBuYXR1cmFsIGxpZ2h0aW5nLCBlYXJ0aCB0b25lcywgYW5kIHN1c3RhaW5hYmxlIG1hdGVyaWFscyB0aGF0IGJyaW5nIHRoZSBvdXRkb29ycyBpbnNpZGUgZm9yIHdlbGxuZXNzIGFuZCBjb25uZWN0aW9uIHRvIG5hdHVyZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICd2aW50YWdlRXh0ZXJpb3InLAogICAgICBsYWJlbDogJ1ZpbnRhZ2UgRXh0ZXJpb3InLAogICAgICBwcm9tcHQ6ICJVcGRhdGUgdGhlIGV4dGVyaW9yIHRvIHNob3djYXNlIHBlcmlvZC1hcHByb3ByaWF0ZSB2aW50YWdlIGNoYXJtIHdpdGggaGlzdG9yaWNhbGx5IGFjY3VyYXRlIGNvbG9ycywgY2xhc3NpYyBhcmNoaXRlY3R1cmFsIGRldGFpbHMsIHRyYWRpdGlvbmFsIG1hdGVyaWFscywgYW5kIHRpbWVsZXNzIGRlc2lnbiBlbGVtZW50cyB0aGF0IGhpZ2hsaWdodCB0aGUgcHJvcGVydHkncyBjaGFyYWN0ZXIuIgogICAgfSwKICAgIHsKICAgICAga2V5OiAnbHV4dXJ5U3RhZ2luZycsCiAgICAgIGxhYmVsOiAnTHV4dXJ5IFN0YWdpbmcnLAogICAgICBwcm9tcHQ6ICJBZGQgbHV4dXJ5IHN0YWdpbmcgZnVybml0dXJlIHdpdGggaGlnaC1lbmQgbWF0ZXJpYWxzLCBkZXNpZ25lciBwaWVjZXMsIHNvcGhpc3RpY2F0ZWQgY29sb3IgcGFsZXR0ZXMsIHByZW1pdW0gdGV4dGlsZXMsIGVsZWdhbnQgbGlnaHRpbmcsIGFuZCB1cHNjYWxlIGFjY2Vzc29yaWVzIHRoYXQgYXBwZWFsIHRvIGx1eHVyeSBidXllcnMgYW5kIHNob3djYXNlIHRoZSBwcm9wZXJ0eSdzIHByZW1pdW0gcG90ZW50aWFsLiIKICAgIH0KICBdOwp9KSgpOwoKCi8qID09PT09IHNyYy9qcy91aS9jb21wb25lbnRzLmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLnVpID0gVi51aSB8fCB7fTsKICB2YXIgdWkgPSBWLnVpOwoKICBmdW5jdGlvbiBlbCh0YWcsIGF0dHJzLCBjaGlsZHJlbikgewogICAgaWYgKHR5cGVvZiB1aS5lbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiB1aS5lbC5hcHBseSh1aSwgYXJncyk7CiAgICB9CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIGlmIChhdHRycykgewogICAgICBmb3IgKHZhciBrIGluIGF0dHJzKSB7CiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cnMsIGspKSBjb250aW51ZTsKICAgICAgICB2YXIgdmFsID0gYXR0cnNba107CiAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gZmFsc2UpIGNvbnRpbnVlOwogICAgICAgIGlmIChrID09PSAnY2xhc3MnIHx8IGsgPT09ICdjbGFzc05hbWUnKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAndGV4dCcpIG5vZGUudGV4dENvbnRlbnQgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ2h0bWwnKSBub2RlLmlubmVySFRNTCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAnc3R5bGUnICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICBmb3IgKHZhciBzIGluIHZhbCkgbm9kZS5zdHlsZS5zZXRQcm9wZXJ0eShzLCB2YWxbc10pOwogICAgICAgIH0gZWxzZSBpZiAoay5pbmRleE9mKCdvbicpID09PSAwICYmIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHZhbCk7CiAgICAgICAgfSBlbHNlIGlmIChrID09PSAnZGF0YXNldCcgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgIGZvciAodmFyIGQgaW4gdmFsKSBub2RlLmRhdGFzZXRbZF0gPSB2YWxbZF07CiAgICAgICAgfSBlbHNlIGlmICh2YWwgPT09IHRydWUpIG5vZGUuc2V0QXR0cmlidXRlKGssICcnKTsKICAgICAgICBlbHNlIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICAgIH0KICAgIH0KICAgIHZhciBraWRzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgIGFwcGVuZEtpZHMobm9kZSwga2lkcyk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIGFwcGVuZEtpZHMobm9kZSwga2lkcykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBraWRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjID0ga2lkc1tpXTsKICAgICAgaWYgKGMgPT0gbnVsbCB8fCBjID09PSBmYWxzZSB8fCBjID09PSB0cnVlKSBjb250aW51ZTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIGFwcGVuZEtpZHMobm9kZSwgYyk7CiAgICAgIGVsc2UgaWYgKHR5cGVvZiBjID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYyA9PT0gJ251bWJlcicpCiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICAgICAgZWxzZSBpZiAoYyAmJiBjLm5vZGVUeXBlKSBub2RlLmFwcGVuZENoaWxkKGMpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaWNvbihuYW1lKSB7CiAgICBpZiAodHlwZW9mIHVpLmljb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIGdvdCA9IHVpLmljb24obmFtZSk7CiAgICAgIGlmIChnb3QgJiYgZ290Lm5vZGVUeXBlKSByZXR1cm4gZ290OwogICAgICBpZiAodHlwZW9mIGdvdCA9PT0gJ3N0cmluZycpIHsKICAgICAgICB2YXIgd3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICB3cmFwLmNsYXNzTmFtZSA9ICd2LWljbyc7CiAgICAgICAgd3JhcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICB3cmFwLmlubmVySFRNTCA9IGdvdDsKICAgICAgICByZXR1cm4gd3JhcC5maXJzdEVsZW1lbnRDaGlsZCB8fCB3cmFwOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsbGJhY2tJY29uKG5hbWUpOwogIH0KCiAgdmFyIEZBTExCQUNLX0lDT05TID0gewogICAgY2xvc2U6ICc8cGF0aCBkPSJNNiA2bDEyIDEyTTE4IDZMNiAxOCIvPicsCiAgICBjaGVjazogJzxwYXRoIGQ9Ik01IDEzbDQgNEwxOSA3Ii8+JywKICAgIGFsZXJ0OgogICAgICAnPHBhdGggZD0iTTEyIDl2NG0wIDRoLjAxTTEwLjMgMy44NmwtOCAxNEEyIDIgMCAwIDAgNCAyMWgxNmEyIDIgMCAwIDAgMS43LTNsLTgtMTRhMiAyIDAgMCAwLTMuNCAwWiIvPicsCiAgICBpbmZvOiAnPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iOSIvPjxwYXRoIGQ9Ik0xMiAxMXY1bTAtOGguMDEiLz4nLAogICAgc3Bhcms6ICc8cGF0aCBkPSJNMTIgM2wxLjggNS4yTDE5IDEwbC01LjIgMS44TDEyIDE3bC0xLjgtNS4yTDUgMTBsNS4yLTEuOEwxMiAzWiIvPicsCiAgICBpbWFnZToKICAgICAgJzxyZWN0IHg9IjMiIHk9IjMiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjMiLz48Y2lyY2xlIGN4PSI4LjUiIGN5PSI4LjUiIHI9IjEuNiIvPjxwYXRoIGQ9Ik0yMSAxNWwtNS01TDUgMjEiLz4nLAogICAgaGVhcnQ6CiAgICAgICc8cGF0aCBkPSJNMTIgMjBzLTctNC42LTkuMy05LjFDMS40IDguMyAyLjQgNS4zIDUgNC40YzEuOS0uNyAzLjkuMSA1IDEuOCAxLjEtMS43IDMuMS0yLjUgNS0xLjggMi42LjkgMy42IDMuOSAyLjMgNi41QzE5IDE1LjQgMTIgMjAgMTIgMjBaIi8+JwogIH07CgogIGZ1bmN0aW9uIGZhbGxiYWNrSWNvbihuYW1lKSB7CiAgICB2YXIgcGF0aCA9IEZBTExCQUNLX0lDT05TW25hbWVdIHx8IEZBTExCQUNLX0lDT05TLmluZm87CiAgICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCAnMCAwIDI0IDI0Jyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdjbGFzcycsICd2LWljbycpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnY3VycmVudENvbG9yJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMS44Jyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWNhcCcsICdyb3VuZCcpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWxpbmVqb2luJywgJ3JvdW5kJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICBzdmcuaW5uZXJIVE1MID0gcGF0aDsKICAgIHJldHVybiBzdmc7CiAgfQoKICBmdW5jdGlvbiBjbGFtcChuLCBsbywgaGkpIHsKICAgIGlmIChWLnV0aWwgJiYgdHlwZW9mIFYudXRpbC5jbGFtcCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudXRpbC5jbGFtcChuLCBsbywgaGkpOwogICAgcmV0dXJuIE1hdGgubWluKGhpLCBNYXRoLm1heChsbywgbikpOwogIH0KCiAgZnVuY3Rpb24gZXNjYXBlSHRtbChzKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwuZXNjYXBlSHRtbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudXRpbC5lc2NhcGVIdG1sKHMpOwogICAgdmFyIGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGQudGV4dENvbnRlbnQgPSBzID09IG51bGwgPyAnJyA6IFN0cmluZyhzKTsKICAgIHJldHVybiBkLmlubmVySFRNTDsKICB9CgogIGZ1bmN0aW9uIHByZWZlcnNSZWR1Y2VkTW90aW9uKCkgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScpLm1hdGNoZXM7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGVuc3VyZUhvc3QoaWQsIGNsYXNzTmFtZSkgewogICAgdmFyIGhvc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7CiAgICBpZiAoIWhvc3QpIHsKICAgICAgaG9zdCA9IGVsKCdkaXYnLCB7IGlkOiBpZCwgY2xhc3M6IGNsYXNzTmFtZSB9KTsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChob3N0KTsKICAgIH0KICAgIHJldHVybiBob3N0OwogIH0KCiAgdmFyIFRPQVNUX0hPU1RfSUQgPSAndi10b2FzdC1ob3N0JzsKICB2YXIgVE9BU1RfTElGRVRJTUVTID0geyBlcnJvcjogNTIwMCwgc3VjY2VzczogMzIwMCwgaW5mbzogMzAwMCwgd2FybmluZzogNDIwMCB9OwoKICBmdW5jdGlvbiB0b2FzdEhvc3QoKSB7CiAgICByZXR1cm4gZW5zdXJlSG9zdChUT0FTVF9IT1NUX0lELCAndi10b2FzdC1ob3N0Jyk7CiAgfQoKICB1aS50b2FzdCA9IGZ1bmN0aW9uIHRvYXN0KG1zZywga2luZCkgewogICAga2luZCA9IGtpbmQgfHwgJ2luZm8nOwogICAgaWYgKCFtc2cpIHJldHVybiB7IGRpc21pc3M6IGZ1bmN0aW9uICgpIHt9IH07CiAgICB2YXIgaG9zdCA9IHRvYXN0SG9zdCgpOwoKICAgIHZhciBpY29uTmFtZSA9CiAgICAgIGtpbmQgPT09ICdzdWNjZXNzJwogICAgICAgID8gJ2NoZWNrJwogICAgICAgIDoga2luZCA9PT0gJ2Vycm9yJwogICAgICAgID8gJ2FsZXJ0JwogICAgICAgIDoga2luZCA9PT0gJ3dhcm5pbmcnCiAgICAgICAgPyAnYWxlcnQnCiAgICAgICAgOiAnaW5mbyc7CgogICAgdmFyIG5vZGUgPSBlbCgKICAgICAgJ2RpdicsCiAgICAgIHsKICAgICAgICBjbGFzczogJ3YtdG9hc3Qgdi10b2FzdC0tJyArIGtpbmQgKyAnIGxpcXVpZC1nbGFzcy10aGluJywKICAgICAgICByb2xlOiBraW5kID09PSAnZXJyb3InID8gJ2FsZXJ0JyA6ICdzdGF0dXMnLAogICAgICAgICdhcmlhLWxpdmUnOiBraW5kID09PSAnZXJyb3InID8gJ2Fzc2VydGl2ZScgOiAncG9saXRlJwogICAgICB9LAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXRvYXN0X19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oaWNvbk5hbWUpKSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi10b2FzdF9fbXNnJyB9LCBTdHJpbmcobXNnKSksCiAgICAgIGVsKAogICAgICAgICdidXR0b24nLAogICAgICAgIHsKICAgICAgICAgIGNsYXNzOiAndi10b2FzdF9fY2xvc2UnLAogICAgICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgICAnYXJpYS1sYWJlbCc6ICdEaXNtaXNzJywKICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmVtb3ZlKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBpY29uKCdjbG9zZScpCiAgICAgICkKICAgICk7CgogICAgaG9zdC5hcHBlbmRDaGlsZChub2RlKTsKICAgIG5vZGUub2Zmc2V0SGVpZ2h0OwogICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd2LXRvYXN0LS1pbicpOwoKICAgIHZhciBsaWZldGltZSA9IFRPQVNUX0xJRkVUSU1FU1traW5kXSB8fCAzMDAwOwogICAgdmFyIHRpbWVyID0gbnVsbDsKICAgIHZhciByZW1vdmVkID0gZmFsc2U7CgogICAgZnVuY3Rpb24gcmVtb3ZlKCkgewogICAgICBpZiAocmVtb3ZlZCkgcmV0dXJuOwogICAgICByZW1vdmVkID0gdHJ1ZTsKICAgICAgaWYgKHRpbWVyKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgIH0KICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKCd2LXRvYXN0LS1pbicpOwogICAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3YtdG9hc3QtLW91dCcpOwogICAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlKSBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgIH07CiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGRvbmUsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgc2V0VGltZW91dChkb25lLCA2MDApOwogICAgfQoKICAgIGZ1bmN0aW9uIGFybSgpIHsKICAgICAgaWYgKHRpbWVyKSBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICB0aW1lciA9IHNldFRpbWVvdXQocmVtb3ZlLCBsaWZldGltZSk7CiAgICB9CiAgICBhcm0oKTsKCiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICh0aW1lcikgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgIH0pOwogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgYXJtKTsKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHRpbWVyKSBjbGVhclRpbWVvdXQodGltZXIpOwogICAgfSk7CiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgYXJtKTsKCiAgICByZXR1cm4geyBkaXNtaXNzOiByZW1vdmUsIG5vZGU6IG5vZGUgfTsKICB9OwoKICAoZnVuY3Rpb24gc3Vic2NyaWJlVG9hc3RCdXMoKSB7CiAgICBmdW5jdGlvbiBiaW5kKCkgewogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIFYuc3RvcmUub24oJ3RvYXN0JywgZnVuY3Rpb24gKHBheWxvYWQpIHsKICAgICAgICAgIGlmICghcGF5bG9hZCkgcmV0dXJuOwogICAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJykgewogICAgICAgICAgICB1aS50b2FzdChwYXlsb2FkLCAnaW5mbycpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdWkudG9hc3QocGF5bG9hZC5tc2cgfHwgcGF5bG9hZC5tZXNzYWdlIHx8ICcnLCBwYXlsb2FkLmtpbmQgfHwgcGF5bG9hZC50eXBlIHx8ICdpbmZvJyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgVi5zdG9yZS5vbignZXJyb3InLCBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICAgICAgdmFyIG0gPQogICAgICAgICAgICB0eXBlb2YgcGF5bG9hZCA9PT0gJ3N0cmluZycKICAgICAgICAgICAgICA/IHBheWxvYWQKICAgICAgICAgICAgICA6IChwYXlsb2FkICYmIChwYXlsb2FkLm1lc3NhZ2UgfHwgcGF5bG9hZC5tc2cpKSB8fCAnU29tZXRoaW5nIHdlbnQgd3JvbmcuJzsKICAgICAgICAgIHVpLnRvYXN0KG0sICdlcnJvcicpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICghYmluZCgpKSB7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBiaW5kKTsKICAgICAgc2V0VGltZW91dChiaW5kLCAwKTsKICAgIH0KICB9KSgpOwoKICB2YXIgT1ZFUkxBWV9IT1NUX0lEID0gJ3Ytb3ZlcmxheS1ob3N0JzsKICB2YXIgb3Blbk92ZXJsYXlzID0gW107CgogIHZhciBGT0NVU0FCTEVfU0VMID0KICAgICdhW2hyZWZdLCBhcmVhW2hyZWZdLCBidXR0b246bm90KFtkaXNhYmxlZF0pLCBpbnB1dDpub3QoW2Rpc2FibGVkXSk6bm90KFt0eXBlPSJoaWRkZW4iXSksICcgKwogICAgJ3NlbGVjdDpub3QoW2Rpc2FibGVkXSksIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSwgaWZyYW1lLCBbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9Ii0xIl0pLCAnICsKICAgICdbY29udGVudGVkaXRhYmxlPSJ0cnVlIl0nOwoKICBmdW5jdGlvbiBvdmVybGF5SG9zdCgpIHsKICAgIHJldHVybiBlbnN1cmVIb3N0KE9WRVJMQVlfSE9TVF9JRCwgJ3Ytb3ZlcmxheS1ob3N0Jyk7CiAgfQoKICBmdW5jdGlvbiBmb2N1c2FibGUoY29udGFpbmVyKSB7CiAgICB2YXIgbGlzdCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKEZPQ1VTQUJMRV9TRUwpKTsKICAgIHJldHVybiBsaXN0LmZpbHRlcihmdW5jdGlvbiAobikgewogICAgICByZXR1cm4gKAogICAgICAgIG4ub2Zmc2V0V2lkdGggPiAwIHx8CiAgICAgICAgbi5vZmZzZXRIZWlnaHQgPiAwIHx8CiAgICAgICAgbiA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCB8fAogICAgICAgIG4uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPiAwCiAgICAgICk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIG1ha2VPdmVybGF5KG5vZGUsIG9wdHMsIHZhcmlhbnQpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGhvc3QgPSBvdmVybGF5SG9zdCgpOwogICAgdmFyIGxhc3RGb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKICAgIHZhciBjbG9zZWQgPSBmYWxzZTsKCiAgICB2YXIgcGFuZWxDbGFzcyA9CiAgICAgIHZhcmlhbnQgPT09ICdzaGVldCcgPyAndi1zaGVldCBsaXF1aWQtZ2xhc3MnIDogJ3YtbW9kYWwgbGlxdWlkLWdsYXNzJzsKICAgIGlmIChvcHRzLmNsYXNzTmFtZSkgcGFuZWxDbGFzcyArPSAnICcgKyBvcHRzLmNsYXNzTmFtZTsKCiAgICB2YXIgcGFuZWwgPSBlbCgnZGl2JywgewogICAgICBjbGFzczogcGFuZWxDbGFzcywKICAgICAgcm9sZTogJ2RpYWxvZycsCiAgICAgICdhcmlhLW1vZGFsJzogJ3RydWUnLAogICAgICB0YWJpbmRleDogJy0xJwogICAgfSk7CiAgICBpZiAob3B0cy5hcmlhTGFiZWwpIHBhbmVsLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIG9wdHMuYXJpYUxhYmVsKTsKCiAgICBpZiAodmFyaWFudCA9PT0gJ3NoZWV0JykgewogICAgICBwYW5lbC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2hlZXRfX2dyYWInLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSkpOwogICAgfQogICAgaWYgKG9wdHMuZGlzbWlzc0J1dHRvbiAhPT0gZmFsc2UpIHsKICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQoCiAgICAgICAgZWwoCiAgICAgICAgICAnYnV0dG9uJywKICAgICAgICAgIHsKICAgICAgICAgICAgY2xhc3M6ICd2LW1vZGFsX19jbG9zZScsCiAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgICAgICAnYXJpYS1sYWJlbCc6ICdDbG9zZScsCiAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBjbG9zZSgnYnV0dG9uJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBpY29uKCdjbG9zZScpCiAgICAgICAgKQogICAgICApOwogICAgfQoKICAgIHZhciBib2R5ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vZGFsX19ib2R5JyB9KTsKICAgIGlmIChub2RlICYmIG5vZGUubm9kZVR5cGUpIGJvZHkuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICBlbHNlIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycpIGJvZHkuaW5uZXJIVE1MID0gbm9kZTsKICAgIHBhbmVsLmFwcGVuZENoaWxkKGJvZHkpOwoKICAgIHZhciBiYWNrZHJvcCA9IGVsKAogICAgICAnZGl2JywKICAgICAgewogICAgICAgIGNsYXNzOiB2YXJpYW50ID09PSAnc2hlZXQnID8gJ3Ytb3ZlcmxheSB2LW92ZXJsYXktLXNoZWV0JyA6ICd2LW92ZXJsYXknLAogICAgICAgIG9uUG9pbnRlcmRvd246IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IGJhY2tkcm9wICYmIG9wdHMuZGlzbWlzc09uQmFja2Ryb3AgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIGNsb3NlKCdiYWNrZHJvcCcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgcGFuZWwKICAgICk7CgogICAgZnVuY3Rpb24gb25LZXlkb3duKGUpIHsKICAgICAgaWYgKG9wZW5PdmVybGF5c1tvcGVuT3ZlcmxheXMubGVuZ3RoIC0gMV0gIT09IGFwaSkgcmV0dXJuOwogICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIG9wdHMuZGlzbWlzc09uRXNjICE9PSBmYWxzZSkgewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgY2xvc2UoJ2VzY2FwZScpOwogICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnVGFiJykgewogICAgICAgIHZhciBpdGVtcyA9IGZvY3VzYWJsZShwYW5lbCk7CiAgICAgICAgaWYgKCFpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHBhbmVsLmZvY3VzKCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBmaXJzdCA9IGl0ZW1zWzBdOwogICAgICAgIHZhciBsYXN0ID0gaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV07CiAgICAgICAgdmFyIGFjdGl2ZSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7CiAgICAgICAgaWYgKGUuc2hpZnRLZXkgJiYgKGFjdGl2ZSA9PT0gZmlyc3QgfHwgYWN0aXZlID09PSBwYW5lbCkpIHsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGxhc3QuZm9jdXMoKTsKICAgICAgICB9IGVsc2UgaWYgKCFlLnNoaWZ0S2V5ICYmIGFjdGl2ZSA9PT0gbGFzdCkgewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgZmlyc3QuZm9jdXMoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjbG9zZShyZWFzb24pIHsKICAgICAgaWYgKGNsb3NlZCkgcmV0dXJuOwogICAgICBjbG9zZWQgPSB0cnVlOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlkb3duLCB0cnVlKTsKICAgICAgdmFyIGlkeCA9IG9wZW5PdmVybGF5cy5pbmRleE9mKGFwaSk7CiAgICAgIGlmIChpZHggIT09IC0xKSBvcGVuT3ZlcmxheXMuc3BsaWNlKGlkeCwgMSk7CgogICAgICBiYWNrZHJvcC5jbGFzc0xpc3QucmVtb3ZlKCd2LW92ZXJsYXktLWluJyk7CiAgICAgIGJhY2tkcm9wLmNsYXNzTGlzdC5hZGQoJ3Ytb3ZlcmxheS0tb3V0Jyk7CiAgICAgIHZhciBmaW5pc2ggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKGJhY2tkcm9wLnBhcmVudE5vZGUpIGJhY2tkcm9wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYmFja2Ryb3ApOwogICAgICAgIGlmICghb3Blbk92ZXJsYXlzLmxlbmd0aCkgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCd2LXNjcm9sbC1sb2NrJyk7CiAgICAgICAgaWYgKGxhc3RGb2N1c2VkICYmIHR5cGVvZiBsYXN0Rm9jdXNlZC5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbGFzdEZvY3VzZWQuZm9jdXMoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgfQogICAgICB9OwogICAgICBiYWNrZHJvcC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZmluaXNoLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgIHNldFRpbWVvdXQoZmluaXNoLCA2MDApOwoKICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ2xvc2UgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICB0cnkgewogICAgICAgICAgb3B0cy5vbkNsb3NlKHJlYXNvbik7CiAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgfQogICAgfQoKICAgIHZhciBhcGkgPSB7IGNsb3NlOiBjbG9zZSwgbm9kZTogcGFuZWwsIGJvZHk6IGJvZHksIGJhY2tkcm9wOiBiYWNrZHJvcCB9OwoKICAgIGhvc3QuYXBwZW5kQ2hpbGQoYmFja2Ryb3ApOwogICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCd2LXNjcm9sbC1sb2NrJyk7CiAgICBvcGVuT3ZlcmxheXMucHVzaChhcGkpOwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5ZG93biwgdHJ1ZSk7CgogICAgYmFja2Ryb3Aub2Zmc2V0SGVpZ2h0OwogICAgYmFja2Ryb3AuY2xhc3NMaXN0LmFkZCgndi1vdmVybGF5LS1pbicpOwoKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChjbG9zZWQpIHJldHVybjsKICAgICAgdmFyIGF1dG8gPSBwYW5lbC5xdWVyeVNlbGVjdG9yKCdbYXV0b2ZvY3VzXScpOwogICAgICB2YXIgaXRlbXMgPSBhdXRvID8gW2F1dG9dIDogZm9jdXNhYmxlKHBhbmVsKTsKICAgICAgaWYgKGl0ZW1zLmxlbmd0aCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpdGVtc1swXS5mb2N1cygpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHBhbmVsLmZvY3VzKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHBhbmVsLmZvY3VzKCk7CiAgICAgIH0KICAgIH0pOwoKICAgIHJldHVybiBhcGk7CiAgfQoKICB1aS5tb2RhbCA9IGZ1bmN0aW9uIG1vZGFsKG5vZGUsIG9wdHMpIHsKICAgIHJldHVybiBtYWtlT3ZlcmxheShub2RlLCBvcHRzLCAnbW9kYWwnKTsKICB9OwoKICB1aS5zaGVldCA9IGZ1bmN0aW9uIHNoZWV0KG5vZGUsIG9wdHMpIHsKICAgIHJldHVybiBtYWtlT3ZlcmxheShub2RlLCBvcHRzLCAnc2hlZXQnKTsKICB9OwoKICB1aS5jb25maXJtID0gZnVuY3Rpb24gY29uZmlybShtc2csIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CiAgICAgIHZhciBzZXR0bGVkID0gZmFsc2U7CiAgICAgIGZ1bmN0aW9uIHNldHRsZSh2YWwpIHsKICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOwogICAgICAgIHNldHRsZWQgPSB0cnVlOwogICAgICAgIHJlZi5jbG9zZSgnY29uZmlybScpOwogICAgICAgIHJlc29sdmUodmFsKTsKICAgICAgfQoKICAgICAgdmFyIGNvbnRlbnQgPSBlbCgKICAgICAgICAnZGl2JywKICAgICAgICB7IGNsYXNzOiAndi1jb25maXJtJyB9LAogICAgICAgIG9wdHMudGl0bGUgPyBlbCgnaDMnLCB7IGNsYXNzOiAndi1jb25maXJtX190aXRsZScgfSwgU3RyaW5nKG9wdHMudGl0bGUpKSA6IG51bGwsCiAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1jb25maXJtX19tc2cnIH0sIFN0cmluZyhtc2cgfHwgJ0FyZSB5b3Ugc3VyZT8nKSksCiAgICAgICAgZWwoCiAgICAgICAgICAnZGl2JywKICAgICAgICAgIHsgY2xhc3M6ICd2LWNvbmZpcm1fX2FjdGlvbnMnIH0sCiAgICAgICAgICBlbCgKICAgICAgICAgICAgJ2J1dHRvbicsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCcsCiAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgc2V0dGxlKGZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9wdHMuY2FuY2VsTGFiZWwgfHwgJ0NhbmNlbCcKICAgICAgICAgICksCiAgICAgICAgICBlbCgKICAgICAgICAgICAgJ2J1dHRvbicsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjbGFzczogJ3YtY3RhICcgKyAob3B0cy5kZXN0cnVjdGl2ZSA/ICd2LWN0YS0tZGFuZ2VyJyA6ICd2LWN0YS0tcHJpbWFyeScpLAogICAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgICAgICAgIGF1dG9mb2N1czogJycsCiAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgc2V0dGxlKHRydWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgb3B0cy5jb25maXJtTGFiZWwgfHwgKG9wdHMuZGVzdHJ1Y3RpdmUgPyAnRGVsZXRlJyA6ICdDb25maXJtJykKICAgICAgICAgICkKICAgICAgICApCiAgICAgICk7CgogICAgICB2YXIgcmVmID0gbWFrZU92ZXJsYXkoCiAgICAgICAgY29udGVudCwKICAgICAgICB7CiAgICAgICAgICBjbGFzc05hbWU6ICd2LW1vZGFsLS1jb25maXJtJywKICAgICAgICAgIGFyaWFMYWJlbDogb3B0cy50aXRsZSB8fCAnQ29uZmlybScsCiAgICAgICAgICBkaXNtaXNzQnV0dG9uOiBmYWxzZSwKICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgc2V0dGxlKGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICdtb2RhbCcKICAgICAgKTsKICAgIH0pOwogIH07CgogIHVpLnNwaW5uZXIgPSBmdW5jdGlvbiBzcGlubmVyKHNpemUpIHsKICAgIHZhciBub2RlID0gZWwoJ3NwYW4nLCB7CiAgICAgIGNsYXNzOiAndi1zcGlubmVyJywKICAgICAgcm9sZTogJ3N0YXR1cycsCiAgICAgICdhcmlhLWxhYmVsJzogJ0xvYWRpbmcnCiAgICB9KTsKICAgIGlmIChzaXplKSBub2RlLnN0eWxlLnNldFByb3BlcnR5KCctLXYtc3Bpbm5lci1zaXplJywgc2l6ZSArICdweCcpOwogICAgbm9kZS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXNwaW5uZXJfX3JpbmcnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSkpOwogICAgcmV0dXJuIG5vZGU7CiAgfTsKCiAgZnVuY3Rpb24gc2tlbEJsb2NrKGV4dHJhQ2xhc3MpIHsKICAgIHJldHVybiBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24nICsgKGV4dHJhQ2xhc3MgPyAnICcgKyBleHRyYUNsYXNzIDogJycpIH0pOwogIH0KCiAgdWkuc2tlbGV0b24gPSBmdW5jdGlvbiBza2VsZXRvbihraW5kLCBjb3VudCkgewogICAga2luZCA9IGtpbmQgfHwgJ2NhcmQnOwogICAgY291bnQgPSBjb3VudCB8fCAoa2luZCA9PT0gJ2dyaWQnID8gNiA6IGtpbmQgPT09ICdsaW5lJyA/IDMgOiAxKTsKCiAgICBpZiAoa2luZCA9PT0gJ2xpbmUnIHx8IGtpbmQgPT09ICd0ZXh0JykgewogICAgICB2YXIgbGluZXMgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24tbGluZXMnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgIHZhciB3ID0gaSA9PT0gY291bnQgLSAxID8gJzYyJScgOiBpICUgMiA/ICc4OCUnIDogJzEwMCUnOwogICAgICAgIHZhciBsbiA9IHNrZWxCbG9jaygndi1za2VsZXRvbi0tbGluZScpOwogICAgICAgIGxuLnN0eWxlLndpZHRoID0gdzsKICAgICAgICBsaW5lcy5hcHBlbmRDaGlsZChsbik7CiAgICAgIH0KICAgICAgcmV0dXJuIGxpbmVzOwogICAgfQoKICAgIGlmIChraW5kID09PSAnaW1hZ2UnKSB7CiAgICAgIHJldHVybiBza2VsQmxvY2soJ3Ytc2tlbGV0b24tLWltYWdlJyk7CiAgICB9CgogICAgaWYgKGtpbmQgPT09ICdwaWxsJykgewogICAgICByZXR1cm4gc2tlbEJsb2NrKCd2LXNrZWxldG9uLS1waWxsJyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2tlbENhcmQoKSB7CiAgICAgIHJldHVybiBlbCgKICAgICAgICAnZGl2JywKICAgICAgICB7IGNsYXNzOiAndi1za2VsZXRvbi1jYXJkJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sCiAgICAgICAgc2tlbEJsb2NrKCd2LXNrZWxldG9uLS1tZWRpYScpLAogICAgICAgIGVsKAogICAgICAgICAgJ2RpdicsCiAgICAgICAgICB7IGNsYXNzOiAndi1za2VsZXRvbi1jYXJkX19tZXRhJyB9LAogICAgICAgICAgc2tlbEJsb2NrKCd2LXNrZWxldG9uLS1saW5lJyksCiAgICAgICAgICBza2VsQmxvY2soJ3Ytc2tlbGV0b24tLWxpbmUgdi1za2VsZXRvbi0tc2hvcnQnKQogICAgICAgICkKICAgICAgKTsKICAgIH0KCiAgICBpZiAoa2luZCA9PT0gJ2NhcmQnKSB7CiAgICAgIHJldHVybiBza2VsQ2FyZCgpOwogICAgfQoKICAgIHZhciBncmlkID0gZWwoJ2RpdicsIHsKICAgICAgY2xhc3M6ICd2LXNrZWxldG9uLWdyaWQgdi1ncmlkIHYtZ3JpZC0tMycsCiAgICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJywKICAgICAgJ2FyaWEtYnVzeSc6ICd0cnVlJwogICAgfSk7CiAgICBmb3IgKHZhciBnID0gMDsgZyA8IGNvdW50OyBnKyspIGdyaWQuYXBwZW5kQ2hpbGQoc2tlbENhcmQoKSk7CiAgICByZXR1cm4gZ3JpZDsKICB9OwoKICB1aS5lbXB0eSA9IGZ1bmN0aW9uIGVtcHR5KG1zZywgYWN0aW9uTGFiZWwsIG9uQWN0aW9uKSB7CiAgICB2YXIgaWNvbk5hbWUgPSAnaW1hZ2UnOwogICAgdmFyIHRpdGxlID0gJ05vdGhpbmcgaGVyZSB5ZXQnOwogICAgdmFyIHN1YiA9IG1zZyB8fCAnJzsKICAgIGlmIChtc2cgJiYgdHlwZW9mIG1zZyA9PT0gJ29iamVjdCcpIHsKICAgICAgdGl0bGUgPSBtc2cudGl0bGUgfHwgdGl0bGU7CiAgICAgIHN1YiA9IG1zZy5tZXNzYWdlIHx8IG1zZy5tc2cgfHwgJyc7CiAgICAgIGljb25OYW1lID0gbXNnLmljb24gfHwgaWNvbk5hbWU7CiAgICAgIGFjdGlvbkxhYmVsID0gbXNnLmFjdGlvbkxhYmVsIHx8IGFjdGlvbkxhYmVsOwogICAgICBvbkFjdGlvbiA9IG1zZy5vbkFjdGlvbiB8fCBvbkFjdGlvbjsKICAgIH0gZWxzZSB7CiAgICAgIHRpdGxlID0gbXNnIHx8IHRpdGxlOwogICAgICBzdWIgPSAnJzsKICAgIH0KCiAgICB2YXIgbm9kZSA9IGVsKAogICAgICAnZGl2JywKICAgICAgeyBjbGFzczogJ3YtZW1wdHknLCByb2xlOiAnbm90ZScgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oaWNvbk5hbWUpKSwKICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fdGl0bGUnIH0sIHRpdGxlKSwKICAgICAgc3ViID8gZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fc3ViJyB9LCBzdWIpIDogbnVsbAogICAgKTsKCiAgICBpZiAoYWN0aW9uTGFiZWwgJiYgdHlwZW9mIG9uQWN0aW9uID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoCiAgICAgICAgZWwoCiAgICAgICAgICAnYnV0dG9uJywKICAgICAgICAgIHsKICAgICAgICAgICAgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWVtcHR5X19hY3Rpb24nLAogICAgICAgICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICBvbkFjdGlvbihlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGFjdGlvbkxhYmVsCiAgICAgICAgKQogICAgICApOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfTsKCiAgdWkuY3JlZGl0c1BpbGwgPSBmdW5jdGlvbiBjcmVkaXRzUGlsbChuKSB7CiAgICB2YXIgdmFsID0gbiA9PSBudWxsID8gMCA6IE51bWJlcihuKTsKICAgIHZhciBkaXNwbGF5ID0gaXNGaW5pdGUodmFsKSA/IGZvcm1hdENyZWRpdHModmFsKSA6IFN0cmluZyhuKTsKICAgIHJldHVybiBlbCgKICAgICAgJ3NwYW4nLAogICAgICB7CiAgICAgICAgY2xhc3M6ICd2LWNyZWRpdHMgdi1jcmVkaXRzLXBpbGwnLAogICAgICAgIHRpdGxlOiBkaXNwbGF5ICsgJyBjcmVkaXRzJywKICAgICAgICAnYXJpYS1sYWJlbCc6IGRpc3BsYXkgKyAnIGNyZWRpdHMnCiAgICAgIH0sCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3JlZGl0c19faWNvbicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9LCBpY29uKCdzcGFyaycpKSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVkaXRzX19udW0nIH0sIGRpc3BsYXkpCiAgICApOwogIH07CgogIGZ1bmN0aW9uIGZvcm1hdENyZWRpdHMobikgewogICAgaWYgKG4gPj0gMTAwMDAwMCkgcmV0dXJuIChuIC8gMTAwMDAwMCkudG9GaXhlZChuICUgMTAwMDAwMCA/IDEgOiAwKSArICdNJzsKICAgIGlmIChuID49IDEwMDAwKSByZXR1cm4gTWF0aC5yb3VuZChuIC8gMTAwMCkgKyAnayc7CiAgICByZXR1cm4gU3RyaW5nKE1hdGgucm91bmQobikpOwogIH0KCiAgdWkuaW1nQ2FyZCA9IGZ1bmN0aW9uIGltZ0NhcmQoaW1hZ2UsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgaW1hZ2UgPSBpbWFnZSB8fCB7fTsKCiAgICB2YXIgYWZ0ZXIgPQogICAgICBpbWFnZS5yZW1vdGVJbWFnZVVSTCB8fAogICAgICBpbWFnZS5yZW1vdGVJbWFnZVVybCB8fAogICAgICBpbWFnZS5pbWFnZVVSTCB8fAogICAgICBpbWFnZS51cmwgfHwKICAgICAgJyc7CiAgICB2YXIgYmVmb3JlID0KICAgICAgaW1hZ2UucmVtb3RlT3JpZ2luYWxJbWFnZVVSTCB8fAogICAgICBpbWFnZS5yZW1vdGVPcmlnaW5hbEltYWdlVXJsIHx8CiAgICAgIGltYWdlLm9yaWdpbmFsSW1hZ2VVUkwgfHwKICAgICAgJyc7CiAgICB2YXIgd2FudFNjcnViID0gb3B0cy5iZWZvcmVBZnRlciAhPT0gZmFsc2UgJiYgISFiZWZvcmUgJiYgYmVmb3JlICE9PSBhZnRlcjsKCiAgICB2YXIgY2FyZCA9IGVsKCdidXR0b24nLCB7CiAgICAgIGNsYXNzOiAndi1jYXJkIHYtaW1nY2FyZCcsCiAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAnYXJpYS1sYWJlbCc6IGltYWdlLnByb21wdCA/ICdPcGVuOiAnICsgdHJ1bmNhdGUoaW1hZ2UucHJvbXB0LCA4MCkgOiAnT3BlbiBpbWFnZScKICAgIH0pOwoKICAgIHZhciBtZWRpYSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1pbWdjYXJkX19tZWRpYScgfSk7CgogICAgaWYgKHdhbnRTY3J1YikgewogICAgICBjYXJkLmNsYXNzTGlzdC5hZGQoJ3YtaW1nY2FyZC0tc2NydWInKTsKICAgICAgdmFyIHNjcnViTm9kZSA9IHVpLnNjcnViKGJlZm9yZSwgYWZ0ZXIsIHsgaW50ZXJhY3RpdmU6IG9wdHMuc2NydWJJbnRlcmFjdGl2ZSAhPT0gZmFsc2UgfSk7CiAgICAgIG1lZGlhLmFwcGVuZENoaWxkKHNjcnViTm9kZSk7CiAgICB9IGVsc2UgewogICAgICBtZWRpYS5jbGFzc0xpc3QuYWRkKCd2LWltZ2NhcmRfX21lZGlhLS1wbGFpbicpOwogICAgICB2YXIgcGggPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24gdi1pbWdjYXJkX19waCcsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKICAgICAgbWVkaWEuYXBwZW5kQ2hpbGQocGgpOwoKICAgICAgdmFyIGltZyA9IGVsKCdpbWcnLCB7CiAgICAgICAgY2xhc3M6ICd2LWltZ2NhcmRfX2ltZycsCiAgICAgICAgbG9hZGluZzogJ2xhenknLAogICAgICAgIGRlY29kaW5nOiAnYXN5bmMnLAogICAgICAgIGFsdDogaW1hZ2UucHJvbXB0ID8gdHJ1bmNhdGUoaW1hZ2UucHJvbXB0LCAxMjApIDogJ0dlbmVyYXRlZCBpbWFnZScsCiAgICAgICAgc3JjOiBhZnRlcgogICAgICB9KTsKICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQoJ2lzLWxvYWRlZCcpOwogICAgICAgIGlmIChwaC5wYXJlbnROb2RlKSBwaC5jbGFzc0xpc3QuYWRkKCdpcy1nb25lJyk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBpZiAocGgucGFyZW50Tm9kZSkgcGgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwaCk7CiAgICAgICAgfSwgMzYwKTsKICAgICAgfSk7CiAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICBtZWRpYS5jbGFzc0xpc3QuYWRkKCd2LWltZ2NhcmRfX21lZGlhLS1lcnInKTsKICAgICAgICBwaC5jbGFzc0xpc3QuYWRkKCdpcy1lcnJvcicpOwogICAgICAgIHBoLmlubmVySFRNTCA9ICcnOwogICAgICAgIHBoLmFwcGVuZENoaWxkKGljb24oJ2ltYWdlJykpOwogICAgICB9KTsKICAgICAgbWVkaWEuYXBwZW5kQ2hpbGQoaW1nKTsKICAgIH0KCiAgICBjYXJkLmFwcGVuZENoaWxkKG1lZGlhKTsKCiAgICBpZiAoaW1hZ2UuZmF2b3JpdGVkKSB7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQoCiAgICAgICAgZWwoCiAgICAgICAgICAnc3BhbicsCiAgICAgICAgICB7IGNsYXNzOiAndi1pbWdjYXJkX19mYXYnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIHRpdGxlOiAnRmF2b3JpdGVkJyB9LAogICAgICAgICAgaWNvbignaGVhcnQnKQogICAgICAgICkKICAgICAgKTsKICAgIH0KCiAgICBpZiAoaW1hZ2UucHJvbXB0ICYmIG9wdHMuY2FwdGlvbiAhPT0gZmFsc2UgJiYgIWltYWdlLmhpZGVQcm9tcHQpIHsKICAgICAgY2FyZC5hcHBlbmRDaGlsZCgKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWltZ2NhcmRfX2NhcHRpb24nLCB0aXRsZTogU3RyaW5nKGltYWdlLnByb21wdCkgfSwgU3RyaW5nKGltYWdlLnByb21wdCkpCiAgICAgICk7CiAgICB9CgogICAgaWYgKHR5cGVvZiBvcHRzLm9uVGFwID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgewogICAgICAgIGlmIChjYXJkLmRhdGFzZXQuc2NydWJiZWQgPT09ICcxJykgewogICAgICAgICAgY2FyZC5kYXRhc2V0LnNjcnViYmVkID0gJzAnOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBvcHRzLm9uVGFwKGltYWdlLCBlKTsKICAgICAgfSk7CiAgICB9CgogICAgcmV0dXJuIGNhcmQ7CiAgfTsKCiAgZnVuY3Rpb24gdHJ1bmNhdGUocywgbikgewogICAgcyA9IFN0cmluZyhzIHx8ICcnKTsKICAgIHJldHVybiBzLmxlbmd0aCA+IG4gPyBzLnNsaWNlKDAsIG4gLSAxKS50cmltRW5kKCkgKyAn4oCmJyA6IHM7CiAgfQoKICB1aS5zY3J1YiA9IGZ1bmN0aW9uIHNjcnViKGJlZm9yZVVSTCwgYWZ0ZXJVUkwsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGludGVyYWN0aXZlID0gb3B0cy5pbnRlcmFjdGl2ZSAhPT0gZmFsc2U7CgogICAgdmFyIGFmdGVySW1nID0gZWwoJ2ltZycsIHsKICAgICAgY2xhc3M6ICd2YWZ0ZXInLAogICAgICBzcmM6IGFmdGVyVVJMIHx8IGJlZm9yZVVSTCB8fCAnJywKICAgICAgYWx0OiBvcHRzLmFmdGVyQWx0IHx8ICdBZnRlcicsCiAgICAgIGRyYWdnYWJsZTogJ2ZhbHNlJywKICAgICAgZGVjb2Rpbmc6ICdhc3luYycsCiAgICAgIGxvYWRpbmc6IG9wdHMuZWFnZXIgPyAnZWFnZXInIDogJ2xhenknCiAgICB9KTsKICAgIHZhciBiZWZvcmVJbWcgPSBlbCgnaW1nJywgewogICAgICBjbGFzczogJ3ZiZWZvcmUnLAogICAgICBzcmM6IGJlZm9yZVVSTCB8fCBhZnRlclVSTCB8fCAnJywKICAgICAgYWx0OiBvcHRzLmJlZm9yZUFsdCB8fCAnQmVmb3JlJywKICAgICAgZHJhZ2dhYmxlOiAnZmFsc2UnLAogICAgICBkZWNvZGluZzogJ2FzeW5jJywKICAgICAgbG9hZGluZzogb3B0cy5lYWdlciA/ICdlYWdlcicgOiAnbGF6eScKICAgIH0pOwogICAgdmFyIGRpdmlkZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3ZzY3J1YicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKCiAgICB2YXIgY2FyZCA9IGVsKAogICAgICAnZGl2JywKICAgICAgewogICAgICAgIGNsYXNzOiAndmNhcmQnLAogICAgICAgIHJvbGU6IGludGVyYWN0aXZlID8gJ3NsaWRlcicgOiAnaW1nJywKICAgICAgICB0YWJpbmRleDogaW50ZXJhY3RpdmUgPyAnMCcgOiBudWxsLAogICAgICAgICdhcmlhLWxhYmVsJzogaW50ZXJhY3RpdmUKICAgICAgICAgID8gJ0JlZm9yZSBhbmQgYWZ0ZXIgY29tcGFyaXNvbi4gVXNlIGFycm93IGtleXMgdG8gY29tcGFyZS4nCiAgICAgICAgICA6ICdCZWZvcmUgYW5kIGFmdGVyIGNvbXBhcmlzb24nLAogICAgICAgICdhcmlhLXZhbHVlbWluJzogaW50ZXJhY3RpdmUgPyAnMCcgOiBudWxsLAogICAgICAgICdhcmlhLXZhbHVlbWF4JzogaW50ZXJhY3RpdmUgPyAnMTAwJyA6IG51bGwsCiAgICAgICAgJ2FyaWEtdmFsdWVub3cnOiBpbnRlcmFjdGl2ZSA/ICc1MCcgOiBudWxsCiAgICAgIH0sCiAgICAgIGFmdGVySW1nLAogICAgICBiZWZvcmVJbWcsCiAgICAgIGRpdmlkZXIKICAgICk7CgogICAgZnVuY3Rpb24gb25TY3J1YkJyb2tlbigpIHsKICAgICAgaWYgKGNhcmQuY2xhc3NMaXN0LmNvbnRhaW5zKCd2Y2FyZC0tbm9pbWcnKSkgcmV0dXJuOwogICAgICBjYXJkLmNsYXNzTGlzdC5hZGQoJ3ZjYXJkLS1ub2ltZycpOwogICAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndmNhcmRfX25vaW1nJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oJ2ltYWdlJykpKTsKICAgIH0KICAgIGFmdGVySW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25TY3J1YkJyb2tlbik7CiAgICBpZiAoIWFmdGVyVVJMICYmICFiZWZvcmVVUkwpIG9uU2NydWJCcm9rZW4oKTsKCiAgICB2YXIgZmVlZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndmZlZWQgdmZlZWQtLXNpbmdsZScgfSwgY2FyZCk7CgogICAgdmFyIHJldmVhbCA9IDAuNTsKICAgIGZ1bmN0aW9uIGFwcGx5UmV2ZWFsKHIpIHsKICAgICAgcmV2ZWFsID0gY2xhbXAociwgMCwgMSk7CiAgICAgIHZhciBwY3QgPSAocmV2ZWFsICogMTAwKS50b0ZpeGVkKDIpOwogICAgICBiZWZvcmVJbWcuc3R5bGUuY2xpcFBhdGggPSAnaW5zZXQoMCAnICsgKDEwMCAtIHBjdCkgKyAnJSAwIDApJzsKICAgICAgYmVmb3JlSW1nLnN0eWxlLndlYmtpdENsaXBQYXRoID0gJ2luc2V0KDAgJyArICgxMDAgLSBwY3QpICsgJyUgMCAwKSc7CiAgICAgIGRpdmlkZXIuc3R5bGUubGVmdCA9IHBjdCArICclJzsKICAgICAgaWYgKGludGVyYWN0aXZlKSBjYXJkLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIFN0cmluZyhNYXRoLnJvdW5kKHJldmVhbCAqIDEwMCkpKTsKICAgIH0KICAgIGFwcGx5UmV2ZWFsKHJldmVhbCk7CgogICAgdmFyIHJhZklkID0gbnVsbDsKICAgIHZhciBhbmltQWN0aXZlID0gZmFsc2U7CiAgICB2YXIgYW5pbUZyb20gPSAwLjI7CiAgICB2YXIgYW5pbVRvID0gMC44OwogICAgdmFyIGFuaW1TdGFydCA9IDA7CiAgICB2YXIgYW5pbUR1ciA9IDI2MDA7CiAgICB2YXIgYW5pbURpciA9IDE7CiAgICB2YXIgcmVzdW1lVGltZXIgPSBudWxsOwogICAgdmFyIGRlc3Ryb3llZCA9IGZhbHNlOwogICAgdmFyIHJlZHVjZU1vdGlvbiA9IHByZWZlcnNSZWR1Y2VkTW90aW9uKCk7CgogICAgZnVuY3Rpb24gZWFzZUluT3V0KHQpIHsKICAgICAgcmV0dXJuIHQgPCAwLjUgPyAyICogdCAqIHQgOiAxIC0gTWF0aC5wb3coLTIgKiB0ICsgMiwgMikgLyAyOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0ZXAodHMpIHsKICAgICAgaWYgKCFhbmltQWN0aXZlIHx8IGRlc3Ryb3llZCkgcmV0dXJuOwogICAgICBpZiAoIWFuaW1TdGFydCkgYW5pbVN0YXJ0ID0gdHM7CiAgICAgIHZhciBlbGFwc2VkID0gdHMgLSBhbmltU3RhcnQ7CiAgICAgIHZhciB0ID0gY2xhbXAoZWxhcHNlZCAvIGFuaW1EdXIsIDAsIDEpOwogICAgICB2YXIgZWFzZWQgPSBlYXNlSW5PdXQodCk7CiAgICAgIHZhciBmcm9tID0gYW5pbURpciA9PT0gMSA/IGFuaW1Gcm9tIDogYW5pbVRvOwogICAgICB2YXIgdG8gPSBhbmltRGlyID09PSAxID8gYW5pbVRvIDogYW5pbUZyb207CiAgICAgIGFwcGx5UmV2ZWFsKGZyb20gKyAodG8gLSBmcm9tKSAqIGVhc2VkKTsKICAgICAgaWYgKHQgPj0gMSkgewogICAgICAgIGFuaW1EaXIgKj0gLTE7CiAgICAgICAgYW5pbVN0YXJ0ID0gdHM7CiAgICAgIH0KICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RhcnRBbmltKCkgewogICAgICBpZiAoIWludGVyYWN0aXZlKSByZXR1cm47CiAgICAgIGlmIChyZWR1Y2VNb3Rpb24pIHJldHVybjsKICAgICAgaWYgKGFuaW1BY3RpdmUgfHwgZGVzdHJveWVkKSByZXR1cm47CiAgICAgIGlmICghaXNPbnNjcmVlbigpKSByZXR1cm47CiAgICAgIGFuaW1BY3RpdmUgPSB0cnVlOwogICAgICBhbmltU3RhcnQgPSAwOwogICAgICBhbmltRGlyID0gMTsKICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RvcEFuaW0oKSB7CiAgICAgIGFuaW1BY3RpdmUgPSBmYWxzZTsKICAgICAgaWYgKHJhZklkKSB7CiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpOwogICAgICAgIHJhZklkID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmVzdW1lKGRlbGF5KSB7CiAgICAgIGlmIChyZXN1bWVUaW1lcikgY2xlYXJUaW1lb3V0KHJlc3VtZVRpbWVyKTsKICAgICAgcmVzdW1lVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICByZXN1bWVUaW1lciA9IG51bGw7CiAgICAgICAgYW5pbUZyb20gPSAwLjI7CiAgICAgICAgYW5pbVRvID0gMC44OwogICAgICAgIHN0YXJ0QW5pbSgpOwogICAgICB9LCBkZWxheSA9PSBudWxsID8gMTgwMCA6IGRlbGF5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc09uc2NyZWVuKCkgewogICAgICB2YXIgciA9IGZlZWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHJldHVybiByLmJvdHRvbSA+IDAgJiYgci50b3AgPCAod2luZG93LmlubmVySGVpZ2h0IHx8IDApICYmIHIud2lkdGggPiAwOwogICAgfQoKICAgIHZhciBkcmFnZ2luZyA9IGZhbHNlOwogICAgdmFyIHBvaW50ZXJJZCA9IG51bGw7CiAgICB2YXIgbW92ZWREdXJpbmdEcmFnID0gZmFsc2U7CgogICAgZnVuY3Rpb24gcmV2ZWFsRnJvbUNsaWVudFgoY2xpZW50WCkgewogICAgICB2YXIgcmVjdCA9IGNhcmQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGlmICghcmVjdC53aWR0aCkgcmV0dXJuIHJldmVhbDsKICAgICAgcmV0dXJuIChjbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGg7CiAgICB9CgogICAgZnVuY3Rpb24gb25Eb3duKGUpIHsKICAgICAgaWYgKCFpbnRlcmFjdGl2ZSkgcmV0dXJuOwogICAgICBpZiAoZS5idXR0b24gIT0gbnVsbCAmJiBlLmJ1dHRvbiAhPT0gMCAmJiBlLnBvaW50ZXJUeXBlID09PSAnbW91c2UnKSByZXR1cm47CiAgICAgIGRyYWdnaW5nID0gdHJ1ZTsKICAgICAgbW92ZWREdXJpbmdEcmFnID0gZmFsc2U7CiAgICAgIHBvaW50ZXJJZCA9IGUucG9pbnRlcklkICE9IG51bGwgPyBlLnBvaW50ZXJJZCA6IG51bGw7CiAgICAgIGlmIChwb2ludGVySWQgIT0gbnVsbCAmJiBjYXJkLnNldFBvaW50ZXJDYXB0dXJlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNhcmQuc2V0UG9pbnRlckNhcHR1cmUocG9pbnRlcklkKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHt9CiAgICAgIH0KICAgICAgc3RvcEFuaW0oKTsKICAgICAgaWYgKHJlc3VtZVRpbWVyKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHJlc3VtZVRpbWVyKTsKICAgICAgICByZXN1bWVUaW1lciA9IG51bGw7CiAgICAgIH0KICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCdzY3J1YmJpbmcnKTsKICAgICAgYXBwbHlSZXZlYWwocmV2ZWFsRnJvbUNsaWVudFgoZ2V0Q2xpZW50WChlKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIG9uTW92ZShlKSB7CiAgICAgIGlmICghZHJhZ2dpbmcpIHJldHVybjsKICAgICAgbW92ZWREdXJpbmdEcmFnID0gdHJ1ZTsKICAgICAgYXBwbHlSZXZlYWwocmV2ZWFsRnJvbUNsaWVudFgoZ2V0Q2xpZW50WChlKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIG9uVXAoZSkgewogICAgICBpZiAoIWRyYWdnaW5nKSByZXR1cm47CiAgICAgIGRyYWdnaW5nID0gZmFsc2U7CiAgICAgIGlmIChwb2ludGVySWQgIT0gbnVsbCAmJiBjYXJkLnJlbGVhc2VQb2ludGVyQ2FwdHVyZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjYXJkLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShwb2ludGVySWQpOwogICAgICAgIH0gY2F0Y2ggKGVycikge30KICAgICAgfQogICAgICBwb2ludGVySWQgPSBudWxsOwogICAgICBjYXJkLmNsYXNzTGlzdC5yZW1vdmUoJ3NjcnViYmluZycpOwogICAgICBpZiAobW92ZWREdXJpbmdEcmFnKSB7CiAgICAgICAgdmFyIGhvc3QgPSBjYXJkLmNsb3Nlc3QgJiYgY2FyZC5jbG9zZXN0KCcudi1pbWdjYXJkJyk7CiAgICAgICAgaWYgKGhvc3QpIGhvc3QuZGF0YXNldC5zY3J1YmJlZCA9ICcxJzsKICAgICAgfQogICAgICBzY2hlZHVsZVJlc3VtZSgxODAwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRDbGllbnRYKGUpIHsKICAgICAgaWYgKGUuY2xpZW50WCAhPSBudWxsKSByZXR1cm4gZS5jbGllbnRYOwogICAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlc1swXSkgcmV0dXJuIGUudG91Y2hlc1swXS5jbGllbnRYOwogICAgICBpZiAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKSByZXR1cm4gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBmdW5jdGlvbiBvbktleShlKSB7CiAgICAgIGlmICghaW50ZXJhY3RpdmUpIHJldHVybjsKICAgICAgdmFyIGRlbHRhID0gMDsKICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dMZWZ0JykgZGVsdGEgPSAtMC4wNTsKICAgICAgZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1JpZ2h0JykgZGVsdGEgPSAwLjA1OwogICAgICBlbHNlIGlmIChlLmtleSA9PT0gJ0hvbWUnKSB7CiAgICAgICAgYXBwbHlSZXZlYWwoMCk7CiAgICAgICAgYWZ0ZXJGb2N1c0FkanVzdCgpOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdFbmQnKSB7CiAgICAgICAgYXBwbHlSZXZlYWwoMSk7CiAgICAgICAgYWZ0ZXJGb2N1c0FkanVzdCgpOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSByZXR1cm47CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3RvcEFuaW0oKTsKICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCdzY3J1YmJpbmcnKTsKICAgICAgYXBwbHlSZXZlYWwocmV2ZWFsICsgZGVsdGEpOwogICAgICBhZnRlckZvY3VzQWRqdXN0KCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWZ0ZXJGb2N1c0FkanVzdCgpIHsKICAgICAgaWYgKHJlc3VtZVRpbWVyKSBjbGVhclRpbWVvdXQocmVzdW1lVGltZXIpOwogICAgICByZXN1bWVUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGNhcmQuY2xhc3NMaXN0LnJlbW92ZSgnc2NydWJiaW5nJyk7CiAgICAgICAgYW5pbUZyb20gPSAwLjI7CiAgICAgICAgYW5pbVRvID0gMC44OwogICAgICAgIHN0YXJ0QW5pbSgpOwogICAgICB9LCAyMjAwKTsKICAgIH0KCiAgICBpZiAoaW50ZXJhY3RpdmUpIHsKICAgICAgaWYgKHdpbmRvdy5Qb2ludGVyRXZlbnQpIHsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgb25Eb3duKTsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgb25Nb3ZlKTsKICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgb25VcCk7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBvblVwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uRG93bik7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW92ZSk7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblVwKTsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvbkRvd24sIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uTW92ZSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVXApOwogICAgICB9CiAgICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5KTsKICAgICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghZHJhZ2dpbmcpIHN0b3BBbmltKCk7CiAgICAgIH0pOwogICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFkcmFnZ2luZyAmJiAhcmVzdW1lVGltZXIpIHNjaGVkdWxlUmVzdW1lKDQwMCk7CiAgICAgIH0pOwogICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZnVuY3Rpb24gKCkgewogICAgICAgIHN0b3BBbmltKCk7CiAgICAgIH0pOwogICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgY2FyZC5jbGFzc0xpc3QucmVtb3ZlKCdzY3J1YmJpbmcnKTsKICAgICAgICBzY2hlZHVsZVJlc3VtZSg0MDApOwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgaW8gPSBudWxsOwogICAgZnVuY3Rpb24gc2V0dXBWaXNpYmlsaXR5KCkgewogICAgICBpZiAoIWludGVyYWN0aXZlIHx8IHJlZHVjZU1vdGlvbikgcmV0dXJuOwogICAgICBpZiAoJ0ludGVyc2VjdGlvbk9ic2VydmVyJyBpbiB3aW5kb3cpIHsKICAgICAgICBpbyA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigKICAgICAgICAgIGZ1bmN0aW9uIChlbnRyaWVzKSB7CiAgICAgICAgICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW4pIHsKICAgICAgICAgICAgICBpZiAoZW4uaXNJbnRlcnNlY3RpbmcpIHsKICAgICAgICAgICAgICAgIGlmICghZHJhZ2dpbmcgJiYgIXJlc3VtZVRpbWVyKSBzdGFydEFuaW0oKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3RvcEFuaW0oKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIHsgdGhyZXNob2xkOiAwLjI1IH0KICAgICAgICApOwogICAgICAgIGlvLm9ic2VydmUoZmVlZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RhcnRBbmltKCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbml0KCkgewogICAgICBhcHBseVJldmVhbCgwLjUpOwogICAgICBzZXR1cFZpc2liaWxpdHkoKTsKICAgICAgaWYgKCFpbykgewogICAgICAgIHN0YXJ0QW5pbSgpOwogICAgICB9CiAgICB9CiAgICBpZiAoYWZ0ZXJJbWcuY29tcGxldGUpIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGluaXQpOwogICAgfSBlbHNlIHsKICAgICAgYWZ0ZXJJbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaW5pdCk7CiAgICAgIH0pOwogICAgICBhZnRlckltZy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaW5pdCk7CiAgICAgIH0pOwogICAgfQoKICAgIGZlZWQuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3koKSB7CiAgICAgIGRlc3Ryb3llZCA9IHRydWU7CiAgICAgIHN0b3BBbmltKCk7CiAgICAgIGlmIChyZXN1bWVUaW1lcikgY2xlYXJUaW1lb3V0KHJlc3VtZVRpbWVyKTsKICAgICAgaWYgKGlvKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlvLmRpc2Nvbm5lY3QoKTsKICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgIGlvID0gbnVsbDsKICAgICAgfQogICAgICBpZiAoIXdpbmRvdy5Qb2ludGVyRXZlbnQpIHsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlKTsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uVXApOwogICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVXApOwogICAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBvblVwKTsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIG9uVXApOwogICAgICB9CiAgICB9OwogICAgZmVlZC5zZXRSZXZlYWwgPSBhcHBseVJldmVhbDsKCiAgICByZXR1cm4gZmVlZDsKICB9OwoKICB1aS5jb25mZXR0aSA9IGZ1bmN0aW9uIGNvbmZldHRpKG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgaWYgKHByZWZlcnNSZWR1Y2VkTW90aW9uKCkpIHJldHVybjsKCiAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3YtY29uZmV0dGktY2FudmFzJyk7CiAgICBpZiAoIWNhbnZhcykgewogICAgICBjYW52YXMgPSBlbCgnY2FudmFzJywgeyBpZDogJ3YtY29uZmV0dGktY2FudmFzJywgY2xhc3M6ICd2LWNvbmZldHRpJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0pOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7CiAgICB9CiAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CiAgICB2YXIgZHByID0gTWF0aC5taW4od2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSwgMik7CgogICAgZnVuY3Rpb24gcmVzaXplKCkgewogICAgICBjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKHdpbmRvdy5pbm5lcldpZHRoICogZHByKTsKICAgICAgY2FudmFzLmhlaWdodCA9IE1hdGguZmxvb3Iod2luZG93LmlubmVySGVpZ2h0ICogZHByKTsKICAgICAgY2FudmFzLnN0eWxlLndpZHRoID0gd2luZG93LmlubmVyV2lkdGggKyAncHgnOwogICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0ICsgJ3B4JzsKICAgIH0KICAgIHJlc2l6ZSgpOwoKICAgIHZhciBXID0gd2luZG93LmlubmVyV2lkdGg7CiAgICB2YXIgSCA9IHdpbmRvdy5pbm5lckhlaWdodDsKCiAgICB2YXIgcGFsZXR0ZSA9IG9wdHMuY29sb3JzIHx8IFsKICAgICAgJyM1Mjk3RjgnLAogICAgICAnIzgyRDZGRicsCiAgICAgICcjMEE4NEZGJywKICAgICAgJyNmZmZmZmYnLAogICAgICAnI0M5RTdGRicsCiAgICAgICcjMDBCMjhCJwogICAgXTsKCiAgICB2YXIgY291bnQgPSBvcHRzLmNvdW50IHx8IChXIDwgNjQwID8gOTAgOiAxNTApOwogICAgdmFyIG9yaWdpblggPSBvcHRzLnggIT0gbnVsbCA/IG9wdHMueCA6IFcgLyAyOwogICAgdmFyIG9yaWdpblkgPSBvcHRzLnkgIT0gbnVsbCA/IG9wdHMueSA6IEggKiAwLjM0OwogICAgdmFyIHNwcmVhZCA9IG9wdHMuc3ByZWFkIHx8IE1hdGguUEk7CiAgICB2YXIgcG93ZXIgPSBvcHRzLnBvd2VyIHx8IDEzOwogICAgdmFyIGdyYXZpdHkgPSAwLjMyOwogICAgdmFyIGRyYWcgPSAwLjAwODU7CgogICAgdmFyIHBpZWNlcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIHZhciBhbmdsZSA9IC1NYXRoLlBJIC8gMiArIChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIHNwcmVhZDsKICAgICAgdmFyIHZlbG9jaXR5ID0gcG93ZXIgKiAoMC41NSArIE1hdGgucmFuZG9tKCkgKiAwLjY1KTsKICAgICAgcGllY2VzLnB1c2goewogICAgICAgIHg6IG9yaWdpblgsCiAgICAgICAgeTogb3JpZ2luWSwKICAgICAgICB2eDogTWF0aC5jb3MoYW5nbGUpICogdmVsb2NpdHkgKyAoTWF0aC5yYW5kb20oKSAtIDAuNSkgKiAyLAogICAgICAgIHZ5OiBNYXRoLnNpbihhbmdsZSkgKiB2ZWxvY2l0eSwKICAgICAgICB3OiA2ICsgTWF0aC5yYW5kb20oKSAqIDYsCiAgICAgICAgaDogOCArIE1hdGgucmFuZG9tKCkgKiA4LAogICAgICAgIHJvdDogTWF0aC5yYW5kb20oKSAqIE1hdGguUEkgKiAyLAogICAgICAgIHZyOiAoTWF0aC5yYW5kb20oKSAtIDAuNSkgKiAwLjQsCiAgICAgICAgY29sb3I6IHBhbGV0dGVbKE1hdGgucmFuZG9tKCkgKiBwYWxldHRlLmxlbmd0aCkgfCAwXSwKICAgICAgICBzaGFwZTogTWF0aC5yYW5kb20oKSA8IDAuMzIgPyAnY2lyY2xlJyA6ICdyZWN0JywKICAgICAgICB3b2JibGU6IE1hdGgucmFuZG9tKCkgKiBNYXRoLlBJICogMiwKICAgICAgICB3b2JibGVTcGVlZDogMC4wNiArIE1hdGgucmFuZG9tKCkgKiAwLjA2LAogICAgICAgIGxpZmU6IDAsCiAgICAgICAgdHRsOiAxNTAgKyBNYXRoLnJhbmRvbSgpICogNzAKICAgICAgfSk7CiAgICB9CgogICAgdmFyIHJ1bm5pbmcgPSB0cnVlOwogICAgdmFyIHN0YXJ0VHMgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIHZhciBtYXhNcyA9IG9wdHMuZHVyYXRpb24gfHwgMzIwMDsKCiAgICBmdW5jdGlvbiBmcmFtZSh0cykgewogICAgICBpZiAoIXJ1bm5pbmcpIHJldHVybjsKICAgICAgdmFyIGFsaXZlQW55ID0gZmFsc2U7CiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKICAgICAgY3R4LnNhdmUoKTsKICAgICAgY3R4LnNjYWxlKGRwciwgZHByKTsKCiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgcGllY2VzLmxlbmd0aDsgcCsrKSB7CiAgICAgICAgdmFyIHBjID0gcGllY2VzW3BdOwogICAgICAgIGlmIChwYy5saWZlID4gcGMudHRsKSBjb250aW51ZTsKICAgICAgICBhbGl2ZUFueSA9IHRydWU7CiAgICAgICAgcGMubGlmZSsrOwogICAgICAgIHBjLnZ5ICs9IGdyYXZpdHk7CiAgICAgICAgcGMudnggKj0gMSAtIGRyYWc7CiAgICAgICAgcGMudnkgKj0gMSAtIGRyYWc7CiAgICAgICAgcGMud29iYmxlICs9IHBjLndvYmJsZVNwZWVkOwogICAgICAgIHBjLnggKz0gcGMudnggKyBNYXRoLnNpbihwYy53b2JibGUpICogMC44OwogICAgICAgIHBjLnkgKz0gcGMudnk7CiAgICAgICAgcGMucm90ICs9IHBjLnZyOwoKICAgICAgICB2YXIgYWxwaGEgPSBwYy5saWZlID4gcGMudHRsIC0gMzYgPyBNYXRoLm1heCgwLCAocGMudHRsIC0gcGMubGlmZSkgLyAzNikgOiAxOwogICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IGFscGhhOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSBwYy5jb2xvcjsKICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgIGN0eC50cmFuc2xhdGUocGMueCwgcGMueSk7CiAgICAgICAgY3R4LnJvdGF0ZShwYy5yb3QpOwogICAgICAgIGlmIChwYy5zaGFwZSA9PT0gJ2NpcmNsZScpIHsKICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICAgIGN0eC5hcmMoMCwgMCwgcGMudyAvIDIsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgICAgIGN0eC5maWxsKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBzdyA9IHBjLncgKiAoMC41ICsgTWF0aC5hYnMoTWF0aC5jb3MocGMud29iYmxlKSkgKiAwLjYpOwogICAgICAgICAgY3R4LmZpbGxSZWN0KC1zdyAvIDIsIC1wYy5oIC8gMiwgc3csIHBjLmgpOwogICAgICAgIH0KICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICB9CiAgICAgIGN0eC5yZXN0b3JlKCk7CgogICAgICB2YXIgZWxhcHNlZCA9IHRzIC0gc3RhcnRUczsKICAgICAgaWYgKGFsaXZlQW55ICYmIGVsYXBzZWQgPCBtYXhNcykgewogICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcnVubmluZyA9IGZhbHNlOwogICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKICAgICAgICBpZiAoY2FudmFzLnBhcmVudE5vZGUpIGNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNhbnZhcyk7CiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uUmVzaXplKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIG9uUmVzaXplKCkgewogICAgICByZXNpemUoKTsKICAgIH0KICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblJlc2l6ZSk7CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnJhbWUpOwogIH07Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL3VpL2RvbS5qcyA9PT09PSAqLwoKKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwogIHZhciB1aSA9IChWLnVpID0gVi51aSB8fCB7fSk7CgogIHZhciBTVkdfTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOwoKICBmdW5jdGlvbiBlbCh0YWcsIGF0dHJzKSB7CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKCiAgICBpZiAoYXR0cnMgJiYgdHlwZW9mIGF0dHJzID09PSAnb2JqZWN0JyAmJiAhaXNOb2RlKGF0dHJzKSAmJiAhQXJyYXkuaXNBcnJheShhdHRycykpIHsKICAgICAgYXBwbHlBdHRycyhub2RlLCBhdHRycyk7CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CgogICAgICBhcHBlbmRDaGlsZChub2RlLCBhdHRycyk7CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgYXBwZW5kQ2hpbGQobm9kZSwgYXJndW1lbnRzW2ldKTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gYXBwbHlBdHRycyhub2RlLCBhdHRycykgewogICAgdmFyIHJlZkZuID0gbnVsbDsKICAgIGZvciAodmFyIGtleSBpbiBhdHRycykgewogICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywga2V5KSkgY29udGludWU7CiAgICAgIHZhciB2YWwgPSBhdHRyc1trZXldOwogICAgICBpZiAodmFsID09IG51bGwpIGNvbnRpbnVlOwoKICAgICAgaWYgKGtleSA9PT0gJ2NsYXNzJyB8fCBrZXkgPT09ICdjbGFzc05hbWUnKSB7CiAgICAgICAgbm9kZS5jbGFzc05hbWUgPSBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKSA6IFN0cmluZyh2YWwpOwogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3N0eWxlJykgewogICAgICAgIGFwcGx5U3R5bGUobm9kZSwgdmFsKTsKICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdkYXRhc2V0JyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JykgewogICAgICAgIGZvciAodmFyIGRrIGluIHZhbCkgewogICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWwsIGRrKSAmJiB2YWxbZGtdICE9IG51bGwpIHsKICAgICAgICAgICAgbm9kZS5kYXRhc2V0W2RrXSA9IFN0cmluZyh2YWxbZGtdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoa2V5LmluZGV4T2YoJ2RhdGEtJykgPT09IDApIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWwpKTsKICAgICAgfSBlbHNlIGlmIChrZXkuaW5kZXhPZignYXJpYS0nKSA9PT0gMCkgewogICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGtleSwgU3RyaW5nKHZhbCkpOwogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2h0bWwnIHx8IGtleSA9PT0gJ2lubmVySFRNTCcpIHsKICAgICAgICBub2RlLmlubmVySFRNTCA9IFN0cmluZyh2YWwpOwogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3RleHQnIHx8IGtleSA9PT0gJ3RleHRDb250ZW50JykgewogICAgICAgIG5vZGUudGV4dENvbnRlbnQgPSBTdHJpbmcodmFsKTsKICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyZWYnICYmIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICByZWZGbiA9IHZhbDsKICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyb2xlJykgewogICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdyb2xlJywgU3RyaW5nKHZhbCkpOwogICAgICB9IGVsc2UgaWYgKGtleS5sZW5ndGggPiAyICYmIGtleS5zbGljZSgwLCAyKSA9PT0gJ29uJyAmJiBrZXlbMl0gPT09IGtleVsyXS50b1VwcGVyQ2FzZSgpKSB7CgogICAgICAgIHZhciBldnQgPSBrZXkuc2xpY2UoMikudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2dCwgdmFsKTsKICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJiB0eXBlb2YgdmFsWzBdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCB2YWxbMF0sIHZhbFsxXSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3ZhbHVlJyB8fCBrZXkgPT09ICdjaGVja2VkJyB8fCBrZXkgPT09ICdkaXNhYmxlZCcgfHwga2V5ID09PSAnc2VsZWN0ZWQnKSB7CgogICAgICAgIG5vZGVba2V5XSA9IHZhbDsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHsKICAgICAgICBpZiAodmFsKSBub2RlLnNldEF0dHJpYnV0ZShrZXksICcnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWwpKTsKICAgICAgfQogICAgfQogICAgaWYgKHJlZkZuKSByZWZGbihub2RlKTsKICB9CgogIGZ1bmN0aW9uIGFwcGx5U3R5bGUobm9kZSwgdmFsKSB7CiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHsKICAgICAgbm9kZS5zdHlsZS5jc3NUZXh0ID0gdmFsOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7CiAgICAgIGZvciAodmFyIHByb3AgaW4gdmFsKSB7CiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsLCBwcm9wKSkgY29udGludWU7CiAgICAgICAgdmFyIHB2ID0gdmFsW3Byb3BdOwogICAgICAgIGlmIChwdiA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICBpZiAocHJvcC5pbmRleE9mKCctLScpID09PSAwKSB7CiAgICAgICAgICBub2RlLnN0eWxlLnNldFByb3BlcnR5KHByb3AsIFN0cmluZyhwdikpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnN0eWxlW3Byb3BdID0gdHlwZW9mIHB2ID09PSAnbnVtYmVyJyA/IHB2ICsgKHVuaXRsZXNzU3R5bGVbcHJvcF0gPyAnJyA6ICdweCcpIDogU3RyaW5nKHB2KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZhciB1bml0bGVzc1N0eWxlID0gewogICAgb3BhY2l0eTogMSwgekluZGV4OiAxLCBmb250V2VpZ2h0OiAxLCBsaW5lSGVpZ2h0OiAxLCBmbGV4OiAxLCBmbGV4R3JvdzogMSwKICAgIGZsZXhTaHJpbms6IDEsIG9yZGVyOiAxLCB6b29tOiAxLCBncmlkUm93OiAxLCBncmlkQ29sdW1uOiAxLCBjb2x1bW5Db3VudDogMQogIH07CgogIGZ1bmN0aW9uIGFwcGVuZENoaWxkKG5vZGUsIGNoaWxkKSB7CiAgICBpZiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZCA9PT0gZmFsc2UgfHwgY2hpbGQgPT09IHRydWUpIHJldHVybjsKICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkLmxlbmd0aDsgaSsrKSBhcHBlbmRDaGlsZChub2RlLCBjaGlsZFtpXSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpc05vZGUoY2hpbGQpKSB7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpOwogICAgICByZXR1cm47CiAgICB9CgogICAgbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoY2hpbGQpKSk7CiAgfQoKICBmdW5jdGlvbiBpc05vZGUoeCkgewogICAgcmV0dXJuIHggJiYgdHlwZW9mIHggPT09ICdvYmplY3QnICYmIHR5cGVvZiB4Lm5vZGVUeXBlID09PSAnbnVtYmVyJzsKICB9CgogIHZhciBJQ09OUyA9IHsKCiAgICAnc3BhcmtsZXMnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTEyIDNsMS42IDQuNEwxOCA5bC00LjQgMS42TDEyIDE1bC0xLjYtNC40TDYgOWw0LjQtMS42eicgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTguNSAxNC41bC43IDEuOSAxLjkuNy0xLjkuNy0uNyAxLjktLjctMS45LTEuOS0uNyAxLjktLjd6JyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ001LjUgMTQuNWwuNTUgMS41IDEuNS41NS0xLjUuNTVMNS41IDE5bC0uNTUtMS40NS0xLjUtLjU1IDEuNS0uNTV6JyB9CiAgICBdLAogICAgJ3dhbmQnOiBbCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTUsIHkxOiA0LCB4MjogMjAsIHkyOiA5IH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTE3LjUgNi41TDUgMTknIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTE2LjUgMi4ybC41IDEuNSAxLjUuNS0xLjUuNS0uNSAxLjUtLjUtMS41LTEuNS0uNSAxLjUtLjV6JyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ00yMS40IDkuNGwuMzUgMS4xIDEuMS4zNS0xLjEuMzUtLjM1IDEuMS0uMzUtMS4xLTEuMS0uMzUgMS4xLS4zNXonIH0KICAgIF0sCiAgICAnd2FuZC1zdGFycyc6IFsKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNNSAxOUwxNiA4JyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xNCA2bDIgMicgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTggM2wuNiAxLjdMMjAuMyA1LjMgMTguNiA2IDE4IDcuNyAxNy40IDZsLTEuNy0uN0wxNy40IDQuN3onIH0sCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiAyMC41LCBjeTogMTEsIHI6IDAuOSwgZmlsbDogJ2N1cnJlbnRDb2xvcicgfSwKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDgsIGN5OiA0LCByOiAwLjksIGZpbGw6ICdjdXJyZW50Q29sb3InIH0KICAgIF0sCiAgICAnYm9sdCc6ICdNMTMgMkw0IDE0aDZsLTEgOCA5LTEyaC02bDEtOHonLAoKICAgICdwaG90byc6IFsKICAgICAgeyB0OiAncmVjdCcsIHg6IDMsIHk6IDQsIHdpZHRoOiAxOCwgaGVpZ2h0OiAxNiwgcng6IDMgfSwKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDguNSwgY3k6IDkuNSwgcjogMS42IH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTUgMThsNC41LTQuNWEyIDIgMCAwIDEgMi44IDBMMTkgMjAnIH0KICAgIF0sCiAgICAnZ3JpZCc6IFsKICAgICAgeyB0OiAncmVjdCcsIHg6IDMuNSwgeTogMy41LCB3aWR0aDogNywgaGVpZ2h0OiA3LCByeDogMS42IH0sCiAgICAgIHsgdDogJ3JlY3QnLCB4OiAxMy41LCB5OiAzLjUsIHdpZHRoOiA3LCBoZWlnaHQ6IDcsIHJ4OiAxLjYgfSwKICAgICAgeyB0OiAncmVjdCcsIHg6IDMuNSwgeTogMTMuNSwgd2lkdGg6IDcsIGhlaWdodDogNywgcng6IDEuNiB9LAogICAgICB7IHQ6ICdyZWN0JywgeDogMTMuNSwgeTogMTMuNSwgd2lkdGg6IDcsIGhlaWdodDogNywgcng6IDEuNiB9CiAgICBdLAogICAgJ2ZvbGRlcic6ICdNMyA3YTIgMiAwIDAgMSAyLTJoNGwyIDIuNGg2YTIgMiAwIDAgMSAyIDJWMThhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ6JywKICAgICdmaWxtJzogWwogICAgICB7IHQ6ICdyZWN0JywgeDogMywgeTogNC41LCB3aWR0aDogMTgsIGhlaWdodDogMTUsIHJ4OiAyLjUgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiA3LjUsIHkxOiA0LjUsIHgyOiA3LjUsIHkyOiAxOS41IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTYuNSwgeTE6IDQuNSwgeDI6IDE2LjUsIHkyOiAxOS41IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMywgeTE6IDkuMiwgeDI6IDcuNSwgeTI6IDkuMiB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDMsIHkxOiAxNC44LCB4MjogNy41LCB5MjogMTQuOCB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDE2LjUsIHkxOiA5LjIsIHgyOiAyMSwgeTI6IDkuMiB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDE2LjUsIHkxOiAxNC44LCB4MjogMjEsIHkyOiAxNC44IH0KICAgIF0sCiAgICAncGhvdG8tYmFkZ2UtcGx1cyc6IFsKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMjEgMTIuNVY3YTIgMiAwIDAgMC0yLTJINWEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoNy41JyB9LAogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogOC41LCBjeTogOS41LCByOiAxLjQgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNNSAxNi41bDQtNGExLjggMS44IDAgMCAxIDIuNSAwbDIgMicgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxOC41LCB5MTogMTUsIHgyOiAxOC41LCB5MjogMjIgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxNSwgeTE6IDE4LjUsIHgyOiAyMiwgeTI6IDE4LjUgfQogICAgXSwKCiAgICAncGx1cyc6IFsKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDUsIHgyOiAxMiwgeTI6IDE5IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogNSwgeTE6IDEyLCB4MjogMTksIHkyOiAxMiB9CiAgICBdLAogICAgJ2Fycm93LXVwJzogWwogICAgICB7IHQ6ICdsaW5lJywgeDE6IDEyLCB5MTogMjAsIHgyOiAxMiwgeTI6IDUgfSwKICAgICAgeyB0OiAncG9seWxpbmUnLCBwb2ludHM6ICc1LDEyIDEyLDUgMTksMTInIH0KICAgIF0sCiAgICAnc3F1YXJlLWFycm93LXVwJzogWwogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xNiA1aDJhMiAyIDAgMCAxIDIgMnYxMWEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTItMlY3YTIgMiAwIDAgMSAyLTJoMicgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDMsIHgyOiAxMiwgeTI6IDE0IH0sCiAgICAgIHsgdDogJ3BvbHlsaW5lJywgcG9pbnRzOiAnOC41LDYuNSAxMiwzIDE1LjUsNi41JyB9CiAgICBdLAogICAgJ2Fycm93LWRvd24tY2lyY2xlJzogWwogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTIsIGN5OiAxMiwgcjogOSB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDEyLCB5MTogNy41LCB4MjogMTIsIHkyOiAxNiB9LAogICAgICB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzguNSwxMi41IDEyLDE2IDE1LjUsMTIuNScgfQogICAgXSwKICAgICdhcnJvdy0yLWNpcmNsZXBhdGgnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTIwIDExYTggOCAwIDAgMC0xMy42LTQuNUw0IDknIH0sCiAgICAgIHsgdDogJ3BvbHlsaW5lJywgcG9pbnRzOiAnNCw0IDQsOSA5LDknIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTQgMTNhOCA4IDAgMCAwIDEzLjYgNC41TDIwIDE1JyB9LAogICAgICB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzIwLDIwIDIwLDE1IDE1LDE1JyB9CiAgICBdLAoKICAgICdoZWFydCc6ICdNMTIgMjBzLTctNC42LTkuMy05LjFDMS40IDguMyAyLjQgNS4zIDUgNC40YzEuOS0uNyAzLjkuMSA1IDEuOCAxLjEtMS43IDMuMS0yLjUgNS0xLjggMi42LjkgMy42IDMuOSAyLjMgNi41QzE5IDE1LjQgMTIgMjAgMTIgMjB6JywKICAgICdoZWFydC1maWxsJzogWwogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xMiAyMC4zcy03LjItNC43LTkuNS05LjNDMS4yIDguMiAyLjMgNSA1IDQuMWMyLS43IDQgLjIgNSAyIDEtMS44IDMtMi43IDUtMiAyLjcuOSAzLjggNC4xIDIuNSA2LjlDMTkuMiAxNS42IDEyIDIwLjMgMTIgMjAuM3onLCBmaWxsOiAnY3VycmVudENvbG9yJywgc3Ryb2tlOiAnbm9uZScgfQogICAgXSwKCiAgICAndHJhc2gnOiBbCiAgICAgIHsgdDogJ3BvbHlsaW5lJywgcG9pbnRzOiAnNCw3IDIwLDcnIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTkgN1Y1YTEuNSAxLjUgMCAwIDEgMS41LTEuNWgzQTEuNSAxLjUgMCAwIDEgMTUgNXYyJyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ002IDdsMSAxMi41QTEuNSAxLjUgMCAwIDAgOC41IDIxaDdhMS41IDEuNSAwIDAgMCAxLjUtMS41TDE4IDcnIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTAsIHkxOiAxMSwgeDI6IDEwLCB5MjogMTcgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxNCwgeTE6IDExLCB4MjogMTQsIHkyOiAxNyB9CiAgICBdLAogICAgJ3htYXJrJzogWwogICAgICB7IHQ6ICdsaW5lJywgeDE6IDYsIHkxOiA2LCB4MjogMTgsIHkyOiAxOCB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDE4LCB5MTogNiwgeDI6IDYsIHkyOiAxOCB9CiAgICBdLAoKICAgICdjaGV2cm9uLWxlZnQnOiB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzE1LDUgOCwxMiAxNSwxOScgfSwKICAgICdjaGV2cm9uLXJpZ2h0JzogeyB0OiAncG9seWxpbmUnLCBwb2ludHM6ICc5LDUgMTYsMTIgOSwxOScgfSwKICAgICdjaGV2cm9uLWRvd24nOiB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzUsOSAxMiwxNiAxOSw5JyB9LAogICAgJ2NoZXZyb24tdXAnOiB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzUsMTUgMTIsOCAxOSwxNScgfSwKCiAgICAnbWFnbmlmeWluZ2dsYXNzJzogWwogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTEsIGN5OiAxMSwgcjogNi41IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTUuOCwgeTE6IDE1LjgsIHgyOiAyMSwgeTI6IDIxIH0KICAgIF0sCiAgICAnc2xpZGVyLWhvcml6b250YWwnOiBbCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMywgeTE6IDgsIHgyOiAyMSwgeTI6IDggfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAzLCB5MTogMTYsIHgyOiAyMSwgeTI6IDE2IH0sCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiA5LCBjeTogOCwgcjogMi40LCBmaWxsOiAndmFyKC0tc3VyZmFjZSwgdHJhbnNwYXJlbnQpJyB9LAogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTUsIGN5OiAxNiwgcjogMi40LCBmaWxsOiAndmFyKC0tc3VyZmFjZSwgdHJhbnNwYXJlbnQpJyB9CiAgICBdLAoKICAgICdnZWFyJzogWwogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTIsIGN5OiAxMiwgcjogMy4yIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTEyIDIuNWwxLjEgMi40IDIuNi0uNS41IDIuNiAyLjQgMS4xLTEuMSAyLjQgMS4xIDIuNC0yLjQgMS4xLS41IDIuNi0yLjYtLjVMMTIgMjEuNWwtMS4xLTIuNC0yLjYuNS0uNS0yLjYtMi40LTEuMSAxLjEtMi40LTEuMS0yLjQgMi40LTEuMS41LTIuNiAyLjYuNXonIH0KICAgIF0sCiAgICAncGVyc29uLWNpcmNsZSc6IFsKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDEyLCBjeTogMTIsIHI6IDkgfSwKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDEyLCBjeTogMTAsIHI6IDMgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNNi41IDE4LjVhNiA2IDAgMCAxIDExIDAnIH0KICAgIF0sCiAgICAnY3Jvd24nOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTMgOGwzLjUgMy41TDEyIDVsNS41IDYuNUwyMSA4bC0xLjUgMTAuNWgtMTV6JyB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDQuNSwgeTE6IDIxLCB4MjogMTkuNSwgeTI6IDIxIH0KICAgIF0sCgogICAgJ2xpbmUtMyc6IFsKICAgICAgeyB0OiAnbGluZScsIHgxOiA0LCB5MTogNywgeDI6IDIwLCB5MjogNyB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDQsIHkxOiAxMiwgeDI6IDIwLCB5MjogMTIgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiA0LCB5MTogMTcsIHgyOiAyMCwgeTI6IDE3IH0KICAgIF0sCiAgICAnY2hlY2ttYXJrJzogeyB0OiAncG9seWxpbmUnLCBwb2ludHM6ICc1LDEyLjUgMTAsMTcuNSAxOS41LDYuNScgfSwKICAgICdwZW5jaWwnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTQgMjBsMS4yLTQuMkwxNS41IDUuNWEyIDIgMCAwIDEgMi44IDBsLjIuMmEyIDIgMCAwIDEgMCAyLjhMOC4yIDE4Ljh6JyB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDE0LCB5MTogNywgeDI6IDE3LCB5MjogMTAgfQogICAgXSwKCiAgICAnaW5mby1jaXJjbGUnOiBbCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiAxMiwgY3k6IDEyLCByOiA5IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTIsIHkxOiAxMSwgeDI6IDEyLCB5MjogMTYgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDgsIHgyOiAxMi4wMSwgeTI6IDggfQogICAgXSwKICAgICd0cmlhbmdsZS1hbGVydCc6IFsKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTAuMyAzLjkgMiAxOGEyIDIgMCAwIDAgMS43IDNoMTYuNmEyIDIgMCAwIDAgMS43LTNMMTMuNyAzLjlhMiAyIDAgMCAwLTMuNCAweicgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDksIHgyOiAxMiwgeTI6IDEzLjUgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDE3LCB4MjogMTIuMDEsIHkyOiAxNyB9CiAgICBdLAoKICAgICdib29rbWFyayc6IHsgdDogJ3BhdGgnLCBkOiAnTTYgNGExIDEgMCAwIDEgMS0xaDEwYTEgMSAwIDAgMSAxIDF2MTdsLTYtNC02IDR6JyB9LAogICAgJ2RvYy1vbi1kb2MnOiBbCiAgICAgIHsgdDogJ3JlY3QnLCB4OiA4LCB5OiA4LCB3aWR0aDogMTIsIGhlaWdodDogMTMsIHJ4OiAyIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTE2IDhWNWEyIDIgMCAwIDAtMi0ySDZhMiAyIDAgMCAwLTIgMnYxMWEyIDIgMCAwIDAgMiAyaDInIH0KICAgIF0sCiAgICAnbGluayc6IFsKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNOSAxNWw2LTYnIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTEwLjUgNy41bDEuOC0xLjhhMy41IDMuNSAwIDAgMSA1IDVsLTEuOCAxLjgnIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTEzLjUgMTYuNWwtMS44IDEuOGEzLjUgMy41IDAgMCAxLTUtNWwxLjgtMS44JyB9CiAgICBdLAogICAgJ2dpZnQnOiBbCiAgICAgIHsgdDogJ3JlY3QnLCB4OiA0LCB5OiA5LCB3aWR0aDogMTYsIGhlaWdodDogMTEsIHJ4OiAxLjUgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMy41IDloMTd2My41aC0xN3onIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTIsIHkxOiA5LCB4MjogMTIsIHkyOiAyMCB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xMiA5QzEyIDYgMTAuNSA0LjUgOC44IDQuNUEyLjMgMi4zIDAgMCAwIDguOCA5eicgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTIgOWMwLTMgMS41LTQuNSAzLjItNC41QTIuMyAyLjMgMCAwIDEgMTUuMiA5eicgfQogICAgXSwKICAgICdmbGFtZSc6IHsgdDogJ3BhdGgnLCBkOiAnTTEyIDNjMS41IDMgNC41IDQuNSA0LjUgOC41QTQuNSA0LjUgMCAwIDEgMTIgMTZhNC41IDQuNSAwIDAgMS00LjUtNC41YzAtMiAxLTMgMS44LTMuOEM5IDkgMTAgOS41IDEwLjUgMTBjLjQtMi41LS41LTQuNyAxLjUtN3onIH0sCiAgICAnbG9jayc6IFsKICAgICAgeyB0OiAncmVjdCcsIHg6IDUsIHk6IDExLCB3aWR0aDogMTQsIGhlaWdodDogOSwgcng6IDIgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNOCAxMVY4YTQgNCAwIDAgMSA4IDB2MycgfQogICAgXSwKICAgICdsb2dvdXQnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTE1IDRoMmEyIDIgMCAwIDEgMiAydjEyYTIgMiAwIDAgMS0yIDJoLTInIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogNCwgeTE6IDEyLCB4MjogMTUsIHkyOiAxMiB9LAogICAgICB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzgsOCA0LDEyIDgsMTYnIH0KICAgIF0sCiAgICAnaGVscC1jaXJjbGUnOiBbCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiAxMiwgY3k6IDEyLCByOiA5IH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTkuNSA5LjVhMi41IDIuNSAwIDEgMSAzLjQgMi4zYy0uOC40LTEuNCAxLTEuNCAyLjInIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTEuNSwgeTE6IDE3LCB4MjogMTEuNTEsIHkyOiAxNyB9CiAgICBdLAogICAgJ2VsbGlwc2lzJzogWwogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogNSwgY3k6IDEyLCByOiAxLjIsIGZpbGw6ICdjdXJyZW50Q29sb3InLCBzdHJva2U6ICdub25lJyB9LAogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTIsIGN5OiAxMiwgcjogMS4yLCBmaWxsOiAnY3VycmVudENvbG9yJywgc3Ryb2tlOiAnbm9uZScgfSwKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDE5LCBjeTogMTIsIHI6IDEuMiwgZmlsbDogJ2N1cnJlbnRDb2xvcicsIHN0cm9rZTogJ25vbmUnIH0KICAgIF0KICB9OwoKICB2YXIgQUxJQVMgPSB7CiAgICBnZW5lcmF0ZTogJ3NwYXJrbGVzJywKICAgIGxpYnJhcnk6ICdncmlkJywKICAgIGFkZDogJ3BsdXMnLAogICAgc2VuZDogJ2Fycm93LXVwJywKICAgIHNldHRpbmdzOiAnZ2VhcicsCiAgICBhY2NvdW50OiAncGVyc29uLWNpcmNsZScsCiAgICBmYXZvcml0ZTogJ2hlYXJ0JywKICAgICdmYXZvcml0ZS1maWxsJzogJ2hlYXJ0LWZpbGwnLAogICAgZGVsZXRlOiAndHJhc2gnLAogICAgc2hhcmU6ICdzcXVhcmUtYXJyb3ctdXAnLAogICAgZG93bmxvYWQ6ICdhcnJvdy1kb3duLWNpcmNsZScsCiAgICBzYXZlOiAnYXJyb3ctZG93bi1jaXJjbGUnLAogICAgY2xvc2U6ICd4bWFyaycsCiAgICBzZWFyY2g6ICdtYWduaWZ5aW5nZ2xhc3MnLAogICAgZmlsdGVyczogJ3NsaWRlci1ob3Jpem9udGFsJywKICAgIGZpbHRlcjogJ3NsaWRlci1ob3Jpem9udGFsJywKICAgIHZpZGVvOiAnZmlsbScsCiAgICBhbmltYXRlOiAnZmlsbScsCiAgICBjcmVkaXRzOiAnYm9sdCcsCiAgICBwYXl3YWxsOiAnY3Jvd24nLAogICAgaGFtYnVyZ2VyOiAnbGluZS0zJywKICAgIG1lbnU6ICdsaW5lLTMnLAogICAgY2hlY2s6ICdjaGVja21hcmsnLAogICAgZWRpdDogJ3BlbmNpbCcsCiAgICB1cGxvYWQ6ICdwaG90by1iYWRnZS1wbHVzJywKICAgIHZhcmlhdGlvbnM6ICdhcnJvdy0yLWNpcmNsZXBhdGgnLAogICAgcmVmcmVzaDogJ2Fycm93LTItY2lyY2xlcGF0aCcsCiAgICBiYWNrOiAnY2hldnJvbi1sZWZ0JywKICAgIGZvcndhcmQ6ICdjaGV2cm9uLXJpZ2h0JywKCiAgICBpbmZvOiAnaW5mby1jaXJjbGUnLAogICAgYWxlcnQ6ICd0cmlhbmdsZS1hbGVydCcsCiAgICB3YXJuaW5nOiAndHJpYW5nbGUtYWxlcnQnLAogICAgc3Bhcms6ICdzcGFya2xlcycsCiAgICBpbWFnZTogJ3Bob3RvJywKICAgICdoZWFydC5maWxsJzogJ2hlYXJ0LWZpbGwnLAogICAgaGVhcnRGaWxsOiAnaGVhcnQtZmlsbCcsCiAgICBjb3B5OiAnZG9jLW9uLWRvYycsCiAgICBtb3JlOiAnZWxsaXBzaXMnLAogICAgc29ydDogJ3NsaWRlci1ob3Jpem9udGFsJywKICAgIGNoZXZyb246ICdjaGV2cm9uLXJpZ2h0JywKICAgIGFycm93TGVmdDogJ2NoZXZyb24tbGVmdCcsCiAgICBhcnJvd1JpZ2h0OiAnY2hldnJvbi1yaWdodCcsCiAgICAnYXJyb3ctbGVmdCc6ICdjaGV2cm9uLWxlZnQnLAogICAgJ2Fycm93LXJpZ2h0JzogJ2NoZXZyb24tcmlnaHQnLAogICAgcHVibGlzaDogJ3NxdWFyZS1hcnJvdy11cCcsCiAgICBwaG90b1N0YWNrOiAnZ3JpZCcsCiAgICAncGhvdG8tc3RhY2snOiAnZ3JpZCcsCiAgICBoZWxwOiAnaGVscC1jaXJjbGUnLAogICAgcHJvZmlsZTogJ3BlcnNvbi1jaXJjbGUnCiAgfTsKCiAgdmFyIENBQ0hFID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgZnVuY3Rpb24gYnVpbGRTdmcobmFtZSkgewogICAgdmFyIHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsICdzdmcnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCAnMCAwIDI0IDI0Jyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcyNCcpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJzI0Jyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICdjdXJyZW50Q29sb3InKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICcxLjYnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lY2FwJywgJ3JvdW5kJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWpvaW4nLCAncm91bmQnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2ZvY3VzYWJsZScsICdmYWxzZScpOwogICAgc3ZnLmNsYXNzTGlzdC5hZGQoJ3YtaWNvbicpOwogICAgc3ZnLmNsYXNzTGlzdC5hZGQoJ3YtaWNvbi0tJyArIG5hbWUpOwoKICAgIHZhciBzcGVjID0gSUNPTlNbbmFtZV07CiAgICB2YXIgcGFydHMgPSB0eXBlb2Ygc3BlYyA9PT0gJ3N0cmluZycKICAgICAgPyBbeyB0OiAncGF0aCcsIGQ6IHNwZWMgfV0KICAgICAgOiAoQXJyYXkuaXNBcnJheShzcGVjKSA/IHNwZWMgOiBbc3BlY10pOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKICAgICAgc3ZnLmFwcGVuZENoaWxkKGJ1aWxkU2hhcGUocGFydHNbaV0pKTsKICAgIH0KICAgIHJldHVybiBzdmc7CiAgfQoKICBmdW5jdGlvbiBidWlsZFNoYXBlKHBhcnQpIHsKICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgcGFydC50IHx8ICdwYXRoJyk7CiAgICBmb3IgKHZhciBrIGluIHBhcnQpIHsKICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFydCwgaykgfHwgayA9PT0gJ3QnKSBjb250aW51ZTsKICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUodG9BdHRyKGspLCBTdHJpbmcocGFydFtrXSkpOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiB0b0F0dHIoaykgewogICAgcmV0dXJuIGs7CiAgfQoKICBmdW5jdGlvbiBpY29uKG5hbWUpIHsKICAgIHZhciBrZXkgPSBJQ09OU1tuYW1lXSA/IG5hbWUgOiAoQUxJQVNbbmFtZV0gfHwgbnVsbCk7CiAgICBpZiAoIWtleSkgewoKICAgICAgdmFyIGZiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgJ3N2ZycpOwogICAgICBmYi5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCAnMCAwIDI0IDI0Jyk7CiAgICAgIGZiLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMjQnKTsKICAgICAgZmIuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnMjQnKTsKICAgICAgZmIuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgIGZiLnNldEF0dHJpYnV0ZSgnZm9jdXNhYmxlJywgJ2ZhbHNlJyk7CiAgICAgIGZiLmNsYXNzTGlzdC5hZGQoJ3YtaWNvbicsICd2LWljb24tLXVua25vd24nKTsKICAgICAgdmFyIGRvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsICdjaXJjbGUnKTsKICAgICAgZG90LnNldEF0dHJpYnV0ZSgnY3gnLCAnMTInKTsKICAgICAgZG90LnNldEF0dHJpYnV0ZSgnY3knLCAnMTInKTsKICAgICAgZG90LnNldEF0dHJpYnV0ZSgncicsICcyLjQnKTsKICAgICAgZG90LnNldEF0dHJpYnV0ZSgnZmlsbCcsICdjdXJyZW50Q29sb3InKTsKICAgICAgZmIuYXBwZW5kQ2hpbGQoZG90KTsKICAgICAgaWYgKHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKCdbVi51aS5pY29uXSB1bmtub3duIGljb246JywgbmFtZSk7CiAgICAgIHJldHVybiBmYjsKICAgIH0KICAgIGlmICghQ0FDSEVba2V5XSkgQ0FDSEVba2V5XSA9IGJ1aWxkU3ZnKGtleSk7CiAgICByZXR1cm4gQ0FDSEVba2V5XS5jbG9uZU5vZGUodHJ1ZSk7CiAgfQoKICBpY29uLm5hbWVzID0gZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIE9iamVjdC5rZXlzKElDT05TKS5jb25jYXQoT2JqZWN0LmtleXMoQUxJQVMpKTsKICB9OwogIGljb24uaGFzID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgIHJldHVybiAhIShJQ09OU1tuYW1lXSB8fCBBTElBU1tuYW1lXSk7CiAgfTsKCiAgdWkuZWwgPSBlbDsKICB1aS5pY29uID0gaWNvbjsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvZmVlZC5qcyA9PT09PSAqLwooZnVuY3Rpb24gKCkgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIFYgPSB3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9OwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwoKICB2YXIgUEVSID0gMzA7CiAgdmFyIElOTElORV9ERUZBVUxUID0gMTI7CgogIHZhciBDWUNMRSA9IDUyMDA7CiAgdmFyIEZBREUgPSA5MDA7CiAgdmFyIEhPTERfQUZURVIgPSAxNDAwOwogIHZhciBTQ1JVQl9SRVNVTUUgPSAxNTAwOwogIHZhciBTQ1JVQl9USFJFU0hPTEQgPSA4OwoKICB2YXIgUFJFRklYID0gInZhbXBfd2ViX2N1cmF0aW9uXyI7CgogIHZhciBUQUdTID0gWwogICAgeyBrZXk6ICIiLCBsYWJlbDogIkFsbCIgfSwKICAgIHsga2V5OiAiaW50ZXJpb3IiLCBsYWJlbDogIkludGVyaW9ycyIgfSwKICAgIHsga2V5OiAiZXh0ZXJpb3IiLCBsYWJlbDogIkV4dGVyaW9ycyIgfSwKICAgIHsga2V5OiAic3RhZ2luZyIsIGxhYmVsOiAiU3RhZ2luZyIgfSwKICAgIHsga2V5OiAibGFuZHNjYXBpbmciLCBsYWJlbDogIkxhbmRzY2FwaW5nIiB9LAogICAgeyBrZXk6ICJhcmNoaXRlY3R1cmUiLCBsYWJlbDogIkFyY2hpdGVjdHVyZSIgfSwKICAgIHsga2V5OiAicmVhbGVzdGF0ZSIsIGxhYmVsOiAiUmVhbCBFc3RhdGUiIH0sCiAgICB7IGtleTogIm1pbmltYWxpc3QiLCBsYWJlbDogIk1pbmltYWxpc3QiIH0sCiAgICB7IGtleTogImx1eHVyeSIsIGxhYmVsOiAiTHV4dXJ5IiB9CiAgXTsKCiAgdmFyIEdSSURfU1RZTEVTID0gWwogICAgeyBrZXk6ICJhdXRvIiwgbGFiZWw6ICJBdXRvIiB9LAogICAgeyBrZXk6ICJvbmUiLCBsYWJlbDogIjEiLCBjb2xzOiAxIH0sCiAgICB7IGtleTogInR3byIsIGxhYmVsOiAiMiIsIGNvbHM6IDIgfSwKICAgIHsga2V5OiAidGhyZWUiLCBsYWJlbDogIjMiLCBjb2xzOiAzIH0sCiAgICB7IGtleTogImZvdXIiLCBsYWJlbDogIjQiLCBjb2xzOiA0IH0KICBdOwoKICB2YXIgQ0VMTF9NT0RFUyA9IFsKICAgIHsga2V5OiAiY3Jvc3NmYWRlIiwgbGFiZWw6ICJDcm9zc2ZhZGUiIH0sCiAgICB7IGtleTogImFmdGVyT25seSIsIGxhYmVsOiAiQWZ0ZXIgb25seSIgfSwKICAgIHsga2V5OiAic2NydWIiLCBsYWJlbDogIk1hbnVhbCBzY3J1YiIgfQogIF07CgogIHZhciBFRkZFQ1RTID0gWwogICAgeyBrZXk6ICJjcm9zc2ZhZGUiLCBsYWJlbDogIkNyb3NzZmFkZSIgfSwKICAgIHsga2V5OiAibHVtYUZhZGUiLCBsYWJlbDogIkx1bWEgRmFkZSIgfSwKICAgIHsga2V5OiAia2FsZWlkb3Njb3BlIiwgbGFiZWw6ICJLYWxlaWRvc2NvcGUiIH0sCiAgICB7IGtleTogImJsb29tRGlzc29sdmUiLCBsYWJlbDogIkJsb29tIERpc3NvbHZlIiB9LAogICAgeyBrZXk6ICJkaXNwbGFjZW1lbnQiLCBsYWJlbDogIkRpc3BsYWNlbWVudCIgfSwKICAgIHsga2V5OiAidm9ydGV4IiwgbGFiZWw6ICJWb3J0ZXgiIH0sCiAgICB7IGtleTogInpvb21CbHVyIiwgbGFiZWw6ICJab29tIEJsdXIiIH0sCiAgICB7IGtleTogImNyeXN0YWxsaXplIiwgbGFiZWw6ICJDcnlzdGFsbGl6ZSIgfSwKICAgIHsga2V5OiAiaHVlU2hpZnRTd2VlcCIsIGxhYmVsOiAiSHVlIFNoaWZ0IFN3ZWVwIiB9LAogICAgeyBrZXk6ICJwc3ljaGVkZWxpY0NvbWJvIiwgbGFiZWw6ICJQc3ljaGVkZWxpYyBDb21ibyIgfQogIF07CgogIHZhciBERUZBVUxUX1BSRUZTID0gewogICAgZ3JpZFN0eWxlOiAiYXV0byIsCiAgICBjZWxsTW9kZTogImNyb3NzZmFkZSIsCiAgICBlZmZlY3Q6ICJjcm9zc2ZhZGUiLAogICAgc3BlZWQ6IDEuMAogIH07CgogIGZ1bmN0aW9uIHJlZHVjZWRNb3Rpb24oKSB7CiAgICByZXR1cm4gISEod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIikubWF0Y2hlcyk7CiAgfQoKICBmdW5jdGlvbiBwcmVmR2V0KGtleSwgZmFsbGJhY2spIHsKICAgIHRyeSB7CiAgICAgIHZhciByYXcgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oUFJFRklYICsga2V5KTsKICAgICAgaWYgKHJhdyA9PSBudWxsKSByZXR1cm4gZmFsbGJhY2s7CiAgICAgIHJldHVybiBKU09OLnBhcnNlKHJhdyk7CiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxsYmFjazsgfQogIH0KCiAgZnVuY3Rpb24gcHJlZlNldChrZXksIHZhbCkgewogICAgdHJ5IHsgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFBSRUZJWCArIGtleSwgSlNPTi5zdHJpbmdpZnkodmFsKSk7IH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiBsb2FkUHJlZnMoKSB7CiAgICB2YXIgb3V0ID0gewogICAgICBncmlkU3R5bGU6IHByZWZHZXQoImdyaWRTdHlsZSIsIERFRkFVTFRfUFJFRlMuZ3JpZFN0eWxlKSwKICAgICAgY2VsbE1vZGU6IHByZWZHZXQoImNlbGxNb2RlIiwgREVGQVVMVF9QUkVGUy5jZWxsTW9kZSksCiAgICAgIGVmZmVjdDogcHJlZkdldCgiZWZmZWN0IiwgREVGQVVMVF9QUkVGUy5lZmZlY3QpLAogICAgICBzcGVlZDogcHJlZkdldCgic3BlZWQiLCBERUZBVUxUX1BSRUZTLnNwZWVkKQogICAgfTsKICAgIGlmICghR1JJRF9TVFlMRVMuc29tZShmdW5jdGlvbiAoZykgeyByZXR1cm4gZy5rZXkgPT09IG91dC5ncmlkU3R5bGU7IH0pKSBvdXQuZ3JpZFN0eWxlID0gREVGQVVMVF9QUkVGUy5ncmlkU3R5bGU7CiAgICBpZiAoIUNFTExfTU9ERVMuc29tZShmdW5jdGlvbiAoYykgeyByZXR1cm4gYy5rZXkgPT09IG91dC5jZWxsTW9kZTsgfSkpIG91dC5jZWxsTW9kZSA9IERFRkFVTFRfUFJFRlMuY2VsbE1vZGU7CiAgICBpZiAoIUVGRkVDVFMuc29tZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5rZXkgPT09IG91dC5lZmZlY3Q7IH0pKSBvdXQuZWZmZWN0ID0gREVGQVVMVF9QUkVGUy5lZmZlY3Q7CiAgICBvdXQuc3BlZWQgPSBjbGFtcE51bShvdXQuc3BlZWQsIDAuMjUsIDMuMCwgMS4wKTsKICAgIHJldHVybiBvdXQ7CiAgfQoKICBmdW5jdGlvbiBjbGFtcE51bShuLCBsbywgaGksIGZhbGxiYWNrKSB7CiAgICBuID0gTnVtYmVyKG4pOwogICAgaWYgKCFpc0Zpbml0ZShuKSkgcmV0dXJuIGZhbGxiYWNrOwogICAgcmV0dXJuIE1hdGgubWluKGhpLCBNYXRoLm1heChsbywgbikpOwogIH0KCiAgZnVuY3Rpb24gY2xhbXAwMShuKSB7CiAgICByZXR1cm4gbiA8IDAgPyAwIDogKG4gPiAxID8gMSA6IG4pOwogIH0KCiAgZnVuY3Rpb24gZWwodGFnLCBhdHRycywgY2hpbGRyZW4pIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAiZnVuY3Rpb24iKSByZXR1cm4gVi51aS5lbCh0YWcsIGF0dHJzLCBjaGlsZHJlbik7CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIGlmIChhdHRycykgewogICAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICAgIHZhciB2YWwgPSBhdHRyc1trXTsKICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgIGlmIChrID09PSAiY2xhc3MiIHx8IGsgPT09ICJjbGFzc05hbWUiKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAidGV4dCIpIG5vZGUudGV4dENvbnRlbnQgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gImh0bWwiKSBub2RlLmlubmVySFRNTCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoIm9uIikgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGsuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgdmFsKTsKICAgICAgICB9IGVsc2UgaWYgKGsuaW5kZXhPZigiZGF0YS0iKSA9PT0gMCB8fCBrLmluZGV4T2YoImFyaWEtIikgPT09IDApIHsKICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICAgICAgfSBlbHNlIGlmIChrIGluIG5vZGUpIHsKICAgICAgICAgIHRyeSB7IG5vZGVba10gPSB2YWw7IH0gY2F0Y2ggKGUpIHsgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdmFsKTsgfQogICAgICAgIH0gZWxzZSBub2RlLnNldEF0dHJpYnV0ZShrLCB2YWwpOwogICAgICB9KTsKICAgIH0KICAgIGFwcGVuZENoaWxkcmVuKG5vZGUsIGNoaWxkcmVuKTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gYXBwZW5kQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW4pIHsKICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKSByZXR1cm47CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSBjaGlsZHJlbiA9IFtjaGlsZHJlbl07CiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjID09IG51bGwgfHwgYyA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgaWYgKHR5cGVvZiBjID09PSAic3RyaW5nIiB8fCB0eXBlb2YgYyA9PT0gIm51bWJlciIpIHsKICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjKSkpOwogICAgICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBOb2RlKSB7CiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChjKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICBpZiAoVi5yb3V0ZXIgJiYgdHlwZW9mIFYucm91dGVyLmdvID09PSAiZnVuY3Rpb24iKSBWLnJvdXRlci5nbyhoYXNoKTsKICAgIGVsc2UgbG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiB0b2FzdChtc2csIGtpbmQpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnRvYXN0ID09PSAiZnVuY3Rpb24iKSBWLnVpLnRvYXN0KG1zZywga2luZCB8fCAiaW5mbyIpOwogICAgZWxzZSBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5lbWl0ID09PSAiZnVuY3Rpb24iKSBWLnN0b3JlLmVtaXQoInRvYXN0IiwgeyBtZXNzYWdlOiBtc2csIGtpbmQ6IGtpbmQgfSk7CiAgfQoKICBmdW5jdGlvbiBkZWJvdW5jZShmbiwgbXMpIHsKICAgIGlmIChWLnV0aWwgJiYgdHlwZW9mIFYudXRpbC5kZWJvdW5jZSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIFYudXRpbC5kZWJvdW5jZShmbiwgbXMpOwogICAgdmFyIHQ7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgY3R4ID0gdGhpcywgYSA9IGFyZ3VtZW50czsKICAgICAgY2xlYXJUaW1lb3V0KHQpOwogICAgICB0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGZuLmFwcGx5KGN0eCwgYSk7IH0sIG1zKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBpbWFnZU9mKGl0ZW0pIHsKICAgIHJldHVybiAoaXRlbSAmJiAoaXRlbS5nZW5lcmF0ZWRJbWFnZSB8fCBpdGVtLmltYWdlKSkgfHwgaXRlbSB8fCB7fTsKICB9CgogIGZ1bmN0aW9uIHByb2ZpbGVPZihpdGVtKSB7CiAgICByZXR1cm4gKGl0ZW0gJiYgaXRlbS5wcm9maWxlKSB8fCAoaXRlbSAmJiBpdGVtLmdlbmVyYXRlZEltYWdlICYmIGl0ZW0uZ2VuZXJhdGVkSW1hZ2UucHJvZmlsZSkgfHwgbnVsbDsKICB9CgogIGZ1bmN0aW9uIGFmdGVyVVJMKGdpKSB7CiAgICByZXR1cm4gZ2kucmVtb3RlSW1hZ2VVUkwgfHwgZ2kucmVtb3RlSW1hZ2VVcmwgfHwgZ2kuaW1hZ2VVUkwgfHwgZ2kudXJsIHx8ICIiOwogIH0KCiAgZnVuY3Rpb24gYmVmb3JlVVJMKGdpKSB7CiAgICByZXR1cm4gZ2kucmVtb3RlT3JpZ2luYWxJbWFnZVVSTCB8fCBnaS5yZW1vdGVPcmlnaW5hbEltYWdlVXJsIHx8IGdpLm9yaWdpbmFsSW1hZ2VVUkwgfHwgIiI7CiAgfQoKICBmdW5jdGlvbiBhc3BlY3RPZihnaSkgewogICAgdmFyIHcgPSBnaS53aWR0aCB8fCBnaS5pbWFnZVdpZHRoIHx8IChnaS5pbWFnZV9zaXplICYmIGdpLmltYWdlX3NpemUud2lkdGgpOwogICAgdmFyIGggPSBnaS5oZWlnaHQgfHwgZ2kuaW1hZ2VIZWlnaHQgfHwgKGdpLmltYWdlX3NpemUgJiYgZ2kuaW1hZ2Vfc2l6ZS5oZWlnaHQpOwogICAgaWYgKHcgJiYgaCAmJiBoID4gMCkgcmV0dXJuIHcgLyBoOwogICAgaWYgKHR5cGVvZiBnaS5hc3BlY3RSYXRpbyA9PT0gIm51bWJlciIgJiYgZ2kuYXNwZWN0UmF0aW8gPiAwKSByZXR1cm4gZ2kuYXNwZWN0UmF0aW87CiAgICByZXR1cm4gMC43NTsKICB9CgogIGZ1bmN0aW9uIGFwcGx5RXhhbXBsZVRvQ3JlYXRvcihpdGVtLCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBnaSA9IGltYWdlT2YoaXRlbSk7CiAgICB2YXIgcHJvZmlsZSA9IHByb2ZpbGVPZihpdGVtKTsKICAgIHZhciBwcm9tcHQgPSBnaS5wcm9tcHQgfHwgIiI7CiAgICB2YXIgbW9kZWwgPSBnaS5tb2RlbCB8fCBudWxsOwogICAgdmFyIHJlZmVyZW5jZVVSTCA9IG9wdHMuYXNSZWZlcmVuY2UgPyBhZnRlclVSTChnaSkgOiBudWxsOwoKICAgIHZhciBwYXlsb2FkID0gewogICAgICBnZW5lcmF0ZWRJbWFnZTogZ2ksCiAgICAgIHByb2ZpbGU6IHByb2ZpbGUsCiAgICAgIHByb21wdDogcHJvbXB0LAogICAgICBtb2RlbDogbW9kZWwsCiAgICAgIHJlZmVyZW5jZVVSTDogcmVmZXJlbmNlVVJMLAogICAgICBzb3VyY2U6ICJpbnNwaXJhdGlvbiIKICAgIH07CgogICAgaWYgKHR5cGVvZiBvcHRzLm9uQXBwbHkgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgdHJ5IHsgb3B0cy5vbkFwcGx5KHBheWxvYWQpOyByZXR1cm47IH0gY2F0Y2ggKGUpIHt9CiAgICB9CgogICAgaWYgKFYudmlld3MgJiYgVi52aWV3cy5jcmVhdGUgJiYgdHlwZW9mIFYudmlld3MuY3JlYXRlLmFwcGx5RXhhbXBsZSA9PT0gImZ1bmN0aW9uIikgewogICAgICB0cnkgewogICAgICAgIFYudmlld3MuY3JlYXRlLmFwcGx5RXhhbXBsZShwYXlsb2FkKTsKICAgICAgICBpZiAobG9jYXRpb24uaGFzaC5pbmRleE9mKCIjL2NyZWF0ZSIpICE9PSAwKSB7CiAgICAgICAgICB2YXIgcSA9ICIjL2NyZWF0ZT9wcm9tcHQ9IiArIGVuY29kZVVSSUNvbXBvbmVudChwcm9tcHQpOwogICAgICAgICAgaWYgKG1vZGVsKSBxICs9ICImbW9kZWw9IiArIGVuY29kZVVSSUNvbXBvbmVudChtb2RlbCk7CiAgICAgICAgICBnbyhxKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9IGNhdGNoIChlKSB7fQogICAgfQoKICAgIHZhciBoYXNoID0gIiMvY3JlYXRlP3Byb21wdD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHByb21wdCk7CiAgICBpZiAobW9kZWwpIGhhc2ggKz0gIiZtb2RlbD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KG1vZGVsKTsKICAgIGdvKGhhc2gpOwogIH0KCiAgdmFyIGxvb3BSdW5uaW5nID0gZmFsc2U7CiAgdmFyIGFjdGl2ZVN0YXRlcyA9IFtdOwogIHZhciBwYXVzZWRBdCA9IDA7CiAgdmFyIHZpc2liaWxpdHlCb3VuZCA9IGZhbHNlOwogIHZhciBkb2NDbGFzc09ic2VydmVyID0gbnVsbDsKCiAgZnVuY3Rpb24gZmVlZEFjdGl2ZSgpIHsKICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmhpZGRlbikgcmV0dXJuIGZhbHNlOwogICAgdmFyIGRlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgaWYgKGRlICYmIGRlLmNsYXNzTGlzdCAmJiAoZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2LWhhcy1vdmVybGF5IikgfHwgZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2LWRyYXdlci1vcGVuIikpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIGJpbmRWaXNpYmlsaXR5KCkgewogICAgaWYgKHZpc2liaWxpdHlCb3VuZCkgcmV0dXJuOwogICAgdmlzaWJpbGl0eUJvdW5kID0gdHJ1ZTsKICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsIG1heWJlUmVzdW1lKTsKICAgIH0KICAgIGlmICh0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7CiAgICAgIGRvY0NsYXNzT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtYXliZVJlc3VtZSk7CiAgICAgIGRvY0NsYXNzT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbImNsYXNzIl0gfSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtYXliZVJlc3VtZSgpIHsKICAgIGlmICghbG9vcFJ1bm5pbmcgJiYgYWN0aXZlU3RhdGVzLmxlbmd0aCAmJiBmZWVkQWN0aXZlKCkpIHN0YXJ0TG9vcCgpOwogIH0KCiAgZnVuY3Rpb24gc3RhcnRMb29wKCkgewogICAgaWYgKGxvb3BSdW5uaW5nKSByZXR1cm47CiAgICBiaW5kVmlzaWJpbGl0eSgpOwogICAgbG9vcFJ1bm5pbmcgPSB0cnVlOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spOwogIH0KCiAgZnVuY3Rpb24gdGljaygpIHsKICAgIGlmICghYWN0aXZlU3RhdGVzLmxlbmd0aCkgewogICAgICBsb29wUnVubmluZyA9IGZhbHNlOwogICAgICBwYXVzZWRBdCA9IDA7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghZmVlZEFjdGl2ZSgpKSB7CiAgICAgIGxvb3BSdW5uaW5nID0gZmFsc2U7CiAgICAgIHBhdXNlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHBhdXNlZEF0KSB7CiAgICAgIHZhciBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHBhdXNlZEF0OwogICAgICBwYXVzZWRBdCA9IDA7CiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYWN0aXZlU3RhdGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgdmFyIHN0ID0gYWN0aXZlU3RhdGVzW2pdOwogICAgICAgIGlmIChzdCAmJiAhc3Quc2NydWJiaW5nKSBzdC50MCArPSBlbGFwc2VkOwogICAgICB9CiAgICB9CiAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTsKICAgIHZhciBtb3Rpb24gPSAhcmVkdWNlZE1vdGlvbigpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhY3RpdmVTdGF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHMgPSBhY3RpdmVTdGF0ZXNbaV07CiAgICAgIGlmIChzLmRlc3Ryb3llZCB8fCBzLnNjcnViYmluZyB8fCBzLm1vZGUgPT09ICJhZnRlck9ubHkiIHx8IHMubW9kZSA9PT0gInNjcnViIikgY29udGludWU7CiAgICAgIGlmICghbW90aW9uKSB7IHMuYmVmb3JlLnN0eWxlLm9wYWNpdHkgPSAiMSI7IGNvbnRpbnVlOyB9CiAgICAgIHZhciBvcCA9IGN5Y2xlT3BhY2l0eSgobm93IC0gcy50MCkgKiBzLnNwZWVkKTsKICAgICAgcy5iZWZvcmUuc3R5bGUub3BhY2l0eSA9IG9wLnRvRml4ZWQoMyk7CiAgICB9CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7CiAgfQoKICBmdW5jdGlvbiBjeWNsZU9wYWNpdHkodCkgewogICAgdmFyIHAgPSB0ICUgQ1lDTEU7CiAgICBpZiAocCA8IEZBREUpIHJldHVybiAxIC0gKHAgLyBGQURFKTsKICAgIHAgLT0gRkFERTsKICAgIGlmIChwIDwgSE9MRF9BRlRFUikgcmV0dXJuIDA7CiAgICBwIC09IEhPTERfQUZURVI7CiAgICBpZiAocCA8IEZBREUpIHJldHVybiBwIC8gRkFERTsKICAgIHJldHVybiAxOwogIH0KCiAgZnVuY3Rpb24gcmVnaXN0ZXJTdGF0ZShzdGF0ZSkgewogICAgYWN0aXZlU3RhdGVzLnB1c2goc3RhdGUpOwogICAgc3RhcnRMb29wKCk7CiAgfQoKICBmdW5jdGlvbiB1bnJlZ2lzdGVyU3RhdGVzKHN0YXRlcykgewogICAgaWYgKCFzdGF0ZXMgfHwgIXN0YXRlcy5sZW5ndGgpIHJldHVybjsKICAgIHZhciBzZXQgPSB7fTsKICAgIHN0YXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7IHMuZGVzdHJveWVkID0gdHJ1ZTsgfSk7CiAgICBmb3IgKHZhciBpID0gYWN0aXZlU3RhdGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGlmIChhY3RpdmVTdGF0ZXNbaV0uZGVzdHJveWVkKSBhY3RpdmVTdGF0ZXMuc3BsaWNlKGksIDEpOwogICAgfQogICAgdm9pZCBzZXQ7CiAgfQoKICBmdW5jdGlvbiBidWlsZENhcmQoaXRlbSwgcHJlZnMsIGN0cmwpIHsKICAgIHZhciBnaSA9IGltYWdlT2YoaXRlbSk7CiAgICB2YXIgYWZ0ZXIgPSBhZnRlclVSTChnaSk7CiAgICB2YXIgYmVmb3JlID0gYmVmb3JlVVJMKGdpKTsKICAgIHZhciBoYXNCZWZvcmVBZnRlciA9ICEhKGJlZm9yZSAmJiBhZnRlciAmJiBiZWZvcmUgIT09IGFmdGVyKTsKICAgIHZhciBhbHQgPSBnaS5oaWRlUHJvbXB0ID8gIkluc3BpcmF0aW9uIiA6IChnaS5wcm9tcHQgfHwgIkluc3BpcmF0aW9uIik7CgogICAgdmFyIGNhcmQgPSBlbCgiZGl2IiwgewogICAgICBjbGFzczogInZjYXJkIiwKICAgICAgcm9sZTogImxpc3RpdGVtIiwKICAgICAgdGFiaW5kZXg6ICIwIiwKICAgICAgImFyaWEtbGFiZWwiOiBnaS5wcm9tcHQgPyAoIkluc3BpcmF0aW9uOiAiICsgdHJ1bmNhdGUoZ2kucHJvbXB0LCA4MCkpIDogIkluc3BpcmF0aW9uIiwKICAgICAgImRhdGEtcmVtb3RlLWlkIjogZ2kucmVtb3RlSUQgfHwgZ2kuaWQgfHwgIiIKICAgIH0pOwoKICAgIHZhciBhZnRlckltZyA9IGVsKCJpbWciLCB7CiAgICAgIGNsYXNzOiAidmFmdGVyIiwKICAgICAgc3JjOiBhZnRlciB8fCBiZWZvcmUsCiAgICAgIGFsdDogYWx0LAogICAgICBsb2FkaW5nOiAibGF6eSIsCiAgICAgIGRlY29kaW5nOiAiYXN5bmMiCiAgICB9KTsKICAgIG1hcmtCcm9rZW5PbkVycm9yKGFmdGVySW1nLCBjYXJkKTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoYWZ0ZXJJbWcpOwoKICAgIHZhciBzdGF0ZSA9IG51bGw7CgogICAgaWYgKGhhc0JlZm9yZUFmdGVyKSB7CiAgICAgIHZhciBtb2RlID0gcHJlZnMuY2VsbE1vZGU7CiAgICAgIHZhciBiZWZvcmVJbWcgPSBlbCgiaW1nIiwgewogICAgICAgIGNsYXNzOiAidmJlZm9yZSIsCiAgICAgICAgc3JjOiBiZWZvcmUsCiAgICAgICAgYWx0OiAiQmVmb3JlIiwKICAgICAgICBsb2FkaW5nOiAibGF6eSIsCiAgICAgICAgZGVjb2Rpbmc6ICJhc3luYyIKICAgICAgfSk7CiAgICAgIG1hcmtCcm9rZW5PbkVycm9yKGJlZm9yZUltZywgY2FyZCk7CiAgICAgIHZhciBzY3J1YiA9IGVsKCJzcGFuIiwgeyBjbGFzczogInZzY3J1YiIsICJhcmlhLWhpZGRlbiI6ICJ0cnVlIiB9KTsKICAgICAgY2FyZC5hcHBlbmRDaGlsZChiZWZvcmVJbWcpOwogICAgICBjYXJkLmFwcGVuZENoaWxkKHNjcnViKTsKICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoImRhdGEtZWZmZWN0IiwgcHJlZnMuZWZmZWN0KTsKICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoImRhdGEtbW9kZSIsIG1vZGUpOwoKICAgICAgaWYgKG1vZGUgPT09ICJhZnRlck9ubHkiKSB7CiAgICAgICAgYmVmb3JlSW1nLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gInNjcnViIikgewogICAgICAgIGJlZm9yZUltZy5zdHlsZS5vcGFjaXR5ID0gIjAuNSI7CiAgICAgICAgc2NydWIuc3R5bGUubGVmdCA9ICI1MCUiOwogICAgICB9IGVsc2UgewogICAgICAgIGJlZm9yZUltZy5zdHlsZS5vcGFjaXR5ID0gIjEiOwogICAgICB9CgogICAgICBzdGF0ZSA9IHsKICAgICAgICBjYXJkOiBjYXJkLAogICAgICAgIGJlZm9yZTogYmVmb3JlSW1nLAogICAgICAgIHNjcnViOiBzY3J1YiwKICAgICAgICBtb2RlOiBtb2RlLAogICAgICAgIHNwZWVkOiBwcmVmcy5zcGVlZCwKICAgICAgICB0MDogRGF0ZS5ub3coKSAtIE1hdGgucmFuZG9tKCkgKiA0MDAwLAogICAgICAgIHNjcnViYmluZzogZmFsc2UsCiAgICAgICAgc2NydWJQb3M6IDAuNSwKICAgICAgICByZXN1bWVUaW1lcjogbnVsbCwKICAgICAgICBkZXN0cm95ZWQ6IGZhbHNlCiAgICAgIH07CiAgICAgIGF0dGFjaFNjcnViKGNhcmQsIHN0YXRlKTsKICAgICAgcmVnaXN0ZXJTdGF0ZShzdGF0ZSk7CiAgICB9IGVsc2UgewogICAgICBjYXJkLnNldEF0dHJpYnV0ZSgiZGF0YS1tb2RlIiwgImFmdGVyT25seSIpOwogICAgfQoKICAgIGJpbmRUYXAoY2FyZCwgaXRlbSwgY3RybCk7CiAgICBpZiAoY3RybCkgY3RybC5zdGF0ZXMucHVzaChzdGF0ZSk7CiAgICByZXR1cm4gY2FyZDsKICB9CgogIGZ1bmN0aW9uIGJpbmRUYXAoY2FyZCwgaXRlbSwgY3RybCkgewogICAgdmFyIGRvd25YID0gMCwgZG93blkgPSAwLCBtb3ZlZCA9IGZhbHNlLCBkb3duID0gZmFsc2U7CiAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgZG93biA9IHRydWU7IG1vdmVkID0gZmFsc2U7CiAgICAgIGRvd25YID0gZS5jbGllbnRYOyBkb3duWSA9IGUuY2xpZW50WTsKICAgIH0pOwogICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmICghZG93bikgcmV0dXJuOwogICAgICBpZiAoTWF0aC5hYnMoZS5jbGllbnRYIC0gZG93blgpID4gU0NSVUJfVEhSRVNIT0xEIHx8IE1hdGguYWJzKGUuY2xpZW50WSAtIGRvd25ZKSA+IFNDUlVCX1RIUkVTSE9MRCkgbW92ZWQgPSB0cnVlOwogICAgfSk7CiAgICBmdW5jdGlvbiByZWxlYXNlKGUpIHsKICAgICAgaWYgKCFkb3duKSByZXR1cm47CiAgICAgIGRvd24gPSBmYWxzZTsKICAgICAgaWYgKG1vdmVkIHx8IGNhcmQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzY3J1YmJpbmciKSkgcmV0dXJuOwogICAgICB2YXIgb25BcHBseSA9IGN0cmwgPyBjdHJsLm9uQXBwbHkgOiBudWxsOwogICAgICBhcHBseUV4YW1wbGVUb0NyZWF0b3IoaXRlbSwgeyBvbkFwcGx5OiBvbkFwcGx5IH0pOwogICAgfQogICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCByZWxlYXNlKTsKICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChlLmtleSA9PT0gIkVudGVyIiB8fCBlLmtleSA9PT0gIiAiKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGFwcGx5RXhhbXBsZVRvQ3JlYXRvcihpdGVtLCB7IG9uQXBwbHk6IGN0cmwgPyBjdHJsLm9uQXBwbHkgOiBudWxsIH0pOwogICAgICB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGF0dGFjaFNjcnViKGNhcmQsIHN0YXRlKSB7CiAgICB2YXIgc3RhcnRYID0gMCwgc3RhcnRZID0gMCwgYWN0aXZlID0gZmFsc2UsIGRlY2lkZWQgPSBmYWxzZSwgZHJhZ2dpbmcgPSBmYWxzZSwgcGlkID0gbnVsbDsKCiAgICBmdW5jdGlvbiBzZXRTY3J1YihjbGllbnRYKSB7CiAgICAgIHZhciByZWN0ID0gY2FyZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgaWYgKHJlY3Qud2lkdGggPD0gMCkgcmV0dXJuOwogICAgICB2YXIgcG9zID0gY2xhbXAwMSgoY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKTsKICAgICAgc3RhdGUuc2NydWJQb3MgPSBwb3M7CiAgICAgIHN0YXRlLmJlZm9yZS5zdHlsZS5vcGFjaXR5ID0gKDEgLSBwb3MpLnRvRml4ZWQoMyk7CiAgICAgIHN0YXRlLnNjcnViLnN0eWxlLmxlZnQgPSAocG9zICogMTAwKSArICIlIjsKICAgIH0KCiAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKGUucG9pbnRlclR5cGUgPT09ICJtb3VzZSIgJiYgZS5idXR0b24gIT09IDApIHJldHVybjsKICAgICAgYWN0aXZlID0gdHJ1ZTsgZGVjaWRlZCA9IGZhbHNlOyBkcmFnZ2luZyA9IGZhbHNlOwogICAgICBzdGFydFggPSBlLmNsaWVudFg7IHN0YXJ0WSA9IGUuY2xpZW50WTsKICAgICAgcGlkID0gZS5wb2ludGVySWQ7CiAgICB9KTsKCiAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKCFhY3RpdmUpIHJldHVybjsKICAgICAgdmFyIGR4ID0gZS5jbGllbnRYIC0gc3RhcnRYOwogICAgICB2YXIgZHkgPSBlLmNsaWVudFkgLSBzdGFydFk7CiAgICAgIGlmICghZGVjaWRlZCkgewogICAgICAgIGlmIChNYXRoLmFicyhkeCkgPCBTQ1JVQl9USFJFU0hPTEQgJiYgTWF0aC5hYnMoZHkpIDwgU0NSVUJfVEhSRVNIT0xEKSByZXR1cm47CiAgICAgICAgZGVjaWRlZCA9IHRydWU7CiAgICAgICAgZHJhZ2dpbmcgPSBNYXRoLmFicyhkeCkgPiBNYXRoLmFicyhkeSk7CiAgICAgICAgaWYgKGRyYWdnaW5nKSB7CiAgICAgICAgICBzdGF0ZS5zY3J1YmJpbmcgPSB0cnVlOwogICAgICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCJzY3J1YmJpbmciKTsKICAgICAgICAgIGlmIChzdGF0ZS5yZXN1bWVUaW1lcikgeyBjbGVhclRpbWVvdXQoc3RhdGUucmVzdW1lVGltZXIpOyBzdGF0ZS5yZXN1bWVUaW1lciA9IG51bGw7IH0KICAgICAgICAgIHRyeSB7IGNhcmQuc2V0UG9pbnRlckNhcHR1cmUocGlkKTsgfSBjYXRjaCAoZXJyKSB7fQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZHJhZ2dpbmcpIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgc2V0U2NydWIoZS5jbGllbnRYKTsKICAgICAgfQogICAgfSk7CgogICAgZnVuY3Rpb24gZW5kKCkgewogICAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuOwogICAgICBhY3RpdmUgPSBmYWxzZTsKICAgICAgaWYgKGRyYWdnaW5nKSB7CiAgICAgICAgdHJ5IHsgY2FyZC5yZWxlYXNlUG9pbnRlckNhcHR1cmUocGlkKTsgfSBjYXRjaCAoZXJyKSB7fQogICAgICAgIHNjaGVkdWxlUmVzdW1lKCk7CiAgICAgIH0KICAgICAgZHJhZ2dpbmcgPSBmYWxzZTsgZGVjaWRlZCA9IGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmVzdW1lKCkgewogICAgICBpZiAoc3RhdGUucmVzdW1lVGltZXIpIGNsZWFyVGltZW91dChzdGF0ZS5yZXN1bWVUaW1lcik7CiAgICAgIHN0YXRlLnJlc3VtZVRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgY2FyZC5jbGFzc0xpc3QucmVtb3ZlKCJzY3J1YmJpbmciKTsKICAgICAgICBzdGF0ZS5zY3J1YmJpbmcgPSBmYWxzZTsKICAgICAgICBzdGF0ZS50MCA9IERhdGUubm93KCk7CiAgICAgICAgc3RhdGUuYmVmb3JlLnN0eWxlLm9wYWNpdHkgPSAiMSI7CiAgICAgIH0sIFNDUlVCX1JFU1VNRSk7CiAgICB9CgogICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBlbmQpOwogICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyY2FuY2VsIiwgZW5kKTsKICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigibG9zdHBvaW50ZXJjYXB0dXJlIiwgZnVuY3Rpb24gKCkgewogICAgICBpZiAoZHJhZ2dpbmcpIHsgYWN0aXZlID0gZmFsc2U7IGRyYWdnaW5nID0gZmFsc2U7IGRlY2lkZWQgPSBmYWxzZTsgc2NoZWR1bGVSZXN1bWUoKTsgfQogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBtYXJrQnJva2VuT25FcnJvcihpbWcsIGNhcmQpIHsKICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsIGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGltZy5jbGFzc0xpc3QuY29udGFpbnMoInZhZnRlciIpKSB7CiAgICAgICAgdmFyIGZhbGxiYWNrID0gY2FyZC5xdWVyeVNlbGVjdG9yKCIudmJlZm9yZSIpOwogICAgICAgIHZhciBmYlNyYyA9IGZhbGxiYWNrICYmIGZhbGxiYWNrLmdldEF0dHJpYnV0ZSgic3JjIik7CiAgICAgICAgaWYgKGZiU3JjICYmIGZiU3JjICE9PSBpbWcuZ2V0QXR0cmlidXRlKCJzcmMiKSAmJiAhaW1nLmRhdGFzZXQuZmVsbEJhY2spIHsKICAgICAgICAgIGltZy5kYXRhc2V0LmZlbGxCYWNrID0gIjEiOwogICAgICAgICAgaW1nLnNyYyA9IGZiU3JjOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpbWcuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCJ2Y2FyZC0tYnJva2VuIik7CiAgICB9LCB7IG9uY2U6IGZhbHNlIH0pOwogIH0KCiAgZnVuY3Rpb24gdHJ1bmNhdGUocywgbikgewogICAgcyA9IFN0cmluZyhzIHx8ICIiKTsKICAgIHJldHVybiBzLmxlbmd0aCA+IG4gPyBzLnNsaWNlKDAsIG4gLSAxKS50cmltRW5kKCkgKyAi4oCmIiA6IHM7CiAgfQoKICBmdW5jdGlvbiBDb2x1bW5MYXlvdXQocm9vdCwgY29sQ291bnQpIHsKICAgIHRoaXMucm9vdCA9IHJvb3Q7CiAgICB0aGlzLmNvbHMgPSBbXTsKICAgIHRoaXMuY29sSCA9IFtdOwogICAgdGhpcy5ub2RlcyA9IFtdOwogICAgdGhpcy5zZXRDb2x1bW5zKGNvbENvdW50KTsKICB9CiAgQ29sdW1uTGF5b3V0LnByb3RvdHlwZS5zZXRDb2x1bW5zID0gZnVuY3Rpb24gKG4pIHsKICAgIG4gPSBNYXRoLm1heCgxLCBuIHwgMCk7CiAgICBpZiAobiA9PT0gdGhpcy5jb2xzLmxlbmd0aCkgcmV0dXJuOwogICAgdmFyIGV4aXN0aW5nID0gdGhpcy5ub2Rlcy5zbGljZSgpOwogICAgdGhpcy5yb290LmlubmVySFRNTCA9ICIiOwogICAgdGhpcy5jb2xzID0gW107CiAgICB0aGlzLmNvbEggPSBbXTsKICAgIHRoaXMubm9kZXMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIHZhciBjb2wgPSBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLWNvbCIgfSk7CiAgICAgIHRoaXMucm9vdC5hcHBlbmRDaGlsZChjb2wpOwogICAgICB0aGlzLmNvbHMucHVzaChjb2wpOwogICAgICB0aGlzLmNvbEgucHVzaCgwKTsKICAgIH0KICAgIHZhciBzZWxmID0gdGhpczsKICAgIGV4aXN0aW5nLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7IHNlbGYuYWRkKGVudHJ5Lm5vZGUsIGVudHJ5LndlaWdodCk7IH0pOwogIH07CiAgQ29sdW1uTGF5b3V0LnByb3RvdHlwZS5fc2hvcnRlc3QgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgaWR4ID0gMCwgbWluID0gSW5maW5pdHk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sSC5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpcy5jb2xIW2ldIDwgbWluKSB7IG1pbiA9IHRoaXMuY29sSFtpXTsgaWR4ID0gaTsgfQogICAgfQogICAgcmV0dXJuIGlkeDsKICB9OwogIENvbHVtbkxheW91dC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKG5vZGUsIHdlaWdodCkgewogICAgd2VpZ2h0ID0gKHR5cGVvZiB3ZWlnaHQgPT09ICJudW1iZXIiICYmIHdlaWdodCA+IDApID8gd2VpZ2h0IDogMTsKICAgIHZhciBpZHggPSB0aGlzLl9zaG9ydGVzdCgpOwogICAgdGhpcy5jb2xzW2lkeF0uYXBwZW5kQ2hpbGQobm9kZSk7CiAgICB0aGlzLmNvbEhbaWR4XSArPSB3ZWlnaHQ7CiAgICB0aGlzLm5vZGVzLnB1c2goeyBub2RlOiBub2RlLCB3ZWlnaHQ6IHdlaWdodCB9KTsKICB9OwogIENvbHVtbkxheW91dC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CiAgICB0aGlzLmNvbHMuZm9yRWFjaChmdW5jdGlvbiAoYykgeyBjLmlubmVySFRNTCA9ICIiOyB9KTsKICAgIHRoaXMuY29sSCA9IHRoaXMuY29sSC5tYXAoZnVuY3Rpb24gKCkgeyByZXR1cm4gMDsgfSk7CiAgICB0aGlzLm5vZGVzID0gW107CiAgfTsKCiAgZnVuY3Rpb24gY29sdW1uc0ZvcldpZHRoKHcsIGdyaWRTdHlsZSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBHUklEX1NUWUxFUy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoR1JJRF9TVFlMRVNbaV0ua2V5ID09PSBncmlkU3R5bGUgJiYgR1JJRF9TVFlMRVNbaV0uY29scykgcmV0dXJuIEdSSURfU1RZTEVTW2ldLmNvbHM7CiAgICB9CiAgICBpZiAoKHdpbmRvdy5pbm5lcldpZHRoIHx8IHcpIDw9IDY0MCkgcmV0dXJuIDI7CiAgICBpZiAodyA8IDU2MCkgcmV0dXJuIDI7CiAgICBpZiAodyA8IDkwMCkgcmV0dXJuIDM7CiAgICBpZiAodyA8IDEzMjApIHJldHVybiA0OwogICAgcmV0dXJuIDU7CiAgfQoKICBmdW5jdGlvbiBjYXJkV2VpZ2h0KGl0ZW0pIHsKICAgIHZhciBnaSA9IGltYWdlT2YoaXRlbSk7CiAgICB2YXIgYXIgPSBhc3BlY3RPZihnaSk7CiAgICByZXR1cm4gMSAvIE1hdGgubWF4KDAuMywgYXIgfHwgMC43NSk7CiAgfQoKICBmdW5jdGlvbiBGZWVkQ29udHJvbGxlcihvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgIHRoaXMubW91bnQgPSBvcHRpb25zLm1vdW50OwogICAgdGhpcy50YWcgPSBvcHRpb25zLnRhZyB8fCAiIjsKICAgIHRoaXMuaW5saW5lID0gISFvcHRpb25zLmlubGluZTsKICAgIHRoaXMubGltaXQgPSBvcHRpb25zLmxpbWl0IHx8IDA7CiAgICB0aGlzLnBlciA9IG9wdGlvbnMucGVyIHx8ICh0aGlzLmlubGluZSA/IE1hdGgubWF4KElOTElORV9ERUZBVUxULCB0aGlzLmxpbWl0IHx8IElOTElORV9ERUZBVUxUKSA6IFBFUik7CiAgICB0aGlzLnNob3dDaGlwcyA9IG9wdGlvbnMuc2hvd0NoaXBzICE9PSBmYWxzZSAmJiAhdGhpcy5pbmxpbmU7CiAgICB0aGlzLnNob3dIZWFkZXIgPSBvcHRpb25zLnNob3dIZWFkZXIgIT09IGZhbHNlICYmICF0aGlzLmlubGluZTsKICAgIHRoaXMuc2hvd09wdGlvbnMgPSBvcHRpb25zLnNob3dPcHRpb25zICE9PSBmYWxzZSAmJiAhdGhpcy5pbmxpbmU7CiAgICB0aGlzLm9uQXBwbHkgPSB0eXBlb2Ygb3B0aW9ucy5vbkFwcGx5ID09PSAiZnVuY3Rpb24iID8gb3B0aW9ucy5vbkFwcGx5IDogbnVsbDsKICAgIHRoaXMucHJlZnMgPSBsb2FkUHJlZnMoKTsKCiAgICB0aGlzLnBhZ2UgPSAxOwogICAgdGhpcy5pdGVtcyA9IFtdOwogICAgdGhpcy50b3RhbCA9IG51bGw7CiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgIHRoaXMuZG9uZSA9IGZhbHNlOwogICAgdGhpcy5lcnJvcmVkID0gZmFsc2U7CiAgICB0aGlzLnNlZW4gPSB7fTsKICAgIHRoaXMuc3RhdGVzID0gW107CgogICAgdGhpcy5sYXlvdXQgPSBudWxsOwogICAgdGhpcy5ncmlkRWwgPSBudWxsOwogICAgdGhpcy5zZW50aW5lbCA9IG51bGw7CiAgICB0aGlzLnN0YXR1c0VsID0gbnVsbDsKICAgIHRoaXMuY2hpcHNCYXIgPSBudWxsOwogICAgdGhpcy5vYnNlcnZlciA9IG51bGw7CiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlOwogICAgdGhpcy5fb25SZXNpemUgPSBudWxsOwogICAgdGhpcy5fcmVxVG9rZW4gPSAwOwogICAgdGhpcy5fb3B0c1JlZiA9IG51bGw7CiAgfQoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIHJvb3QgPSB0aGlzLm1vdW50OwogICAgcm9vdC5pbm5lckhUTUwgPSAiIjsKCiAgICB2YXIgd3JhcCA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidi1zZWN0aW9uIHZmZWVkLXZpZXciICsgKHRoaXMuaW5saW5lID8gIiB2ZmVlZC12aWV3LS1pbmxpbmUiIDogIiIpIH0pOwoKICAgIGlmICh0aGlzLnNob3dIZWFkZXIpIHsKICAgICAgdmFyIGhlYWRSb3cgPSBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLWhlYWQiIH0pOwogICAgICBoZWFkUm93LmFwcGVuZENoaWxkKGVsKCJkaXYiLCB7IGNsYXNzOiAidmZlZWQtaGVhZF9fdGV4dCIgfSwgWwogICAgICAgIGVsKCJzcGFuIiwgeyBjbGFzczogInYtZXllYnJvdyIsIHRleHQ6ICJJbnNwaXJhdGlvbiIgfSksCiAgICAgICAgZWwoImgxIiwgeyBjbGFzczogInYtc2VjdGlvbl9fdGl0bGUgdi1ncmFkaWVudCIsIHRleHQ6ICJDdXJhdGVkIHRyYW5zZm9ybWF0aW9ucyIgfSksCiAgICAgICAgZWwoInAiLCB7IHRleHQ6ICJUYXAgYW55IHJlc3VsdCB0byBsb2FkIGl0cyBwcm9tcHQuIERyYWcgYWNyb3NzIGEgdGlsZSB0byBzY3J1YiBiZWZvcmUgLyBhZnRlci4iIH0pCiAgICAgIF0pKTsKICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMpIGhlYWRSb3cuYXBwZW5kQ2hpbGQodGhpcy5fYnVpbGRPcHRpb25zVHJpZ2dlcigpKTsKICAgICAgd3JhcC5hcHBlbmRDaGlsZChoZWFkUm93KTsKICAgIH0KCiAgICBpZiAodGhpcy5zaG93Q2hpcHMpIHsKICAgICAgdGhpcy5jaGlwc0JhciA9IHRoaXMuX2J1aWxkQ2hpcHMoKTsKICAgICAgd3JhcC5hcHBlbmRDaGlsZCh0aGlzLmNoaXBzQmFyKTsKICAgIH0KCiAgICB0aGlzLmdyaWRFbCA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidmZlZWQiLCByb2xlOiAibGlzdCIsICJhcmlhLWxhYmVsIjogIkN1cmF0ZWQgaW5zcGlyYXRpb24gZ2FsbGVyeSIgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKHRoaXMuZ3JpZEVsKTsKCiAgICB2YXIgZm9vdGVyID0gZWwoImRpdiIsIHsgY2xhc3M6ICJ2ZmVlZC1jdGEiIH0pOwogICAgdGhpcy5zdGF0dXNFbCA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidmZlZWQtbG9hZGluZyIsICJhcmlhLWxpdmUiOiAicG9saXRlIiB9KTsKICAgIHRoaXMuc2VudGluZWwgPSBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLXNlbnRpbmVsIiwgImFyaWEtaGlkZGVuIjogInRydWUiIH0pOwogICAgZm9vdGVyLmFwcGVuZENoaWxkKHRoaXMuc3RhdHVzRWwpOwogICAgZm9vdGVyLmFwcGVuZENoaWxkKHRoaXMuc2VudGluZWwpOwogICAgd3JhcC5hcHBlbmRDaGlsZChmb290ZXIpOwoKICAgIHJvb3QuYXBwZW5kQ2hpbGQod3JhcCk7CgogICAgdGhpcy5fYXBwbHlHcmlkQXR0cnMoKTsKICAgIHZhciBjb2xzID0gY29sdW1uc0ZvcldpZHRoKHRoaXMuZ3JpZEVsLmNsaWVudFdpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoIHx8IDEwMjQsIHRoaXMucHJlZnMuZ3JpZFN0eWxlKTsKICAgIHRoaXMubGF5b3V0ID0gbmV3IENvbHVtbkxheW91dCh0aGlzLmdyaWRFbCwgY29scyk7CiAgICB0aGlzLl9zaG93U2tlbGV0b25zKE1hdGgubWluKHRoaXMucGVyLCB0aGlzLmlubGluZSA/ICh0aGlzLmxpbWl0IHx8IElOTElORV9ERUZBVUxUKSA6IDkpKTsKCiAgICB0aGlzLl9zZXR1cFJlc2l6ZSgpOwogICAgdGhpcy5fc2V0dXBPYnNlcnZlcigpOwogICAgdGhpcy5sb2FkTmV4dCh0cnVlKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX2FwcGx5R3JpZEF0dHJzID0gZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLmdyaWRFbCkgcmV0dXJuOwogICAgdGhpcy5ncmlkRWwuc2V0QXR0cmlidXRlKCJkYXRhLWdyaWQiLCB0aGlzLnByZWZzLmdyaWRTdHlsZSk7CiAgICB0aGlzLmdyaWRFbC5zZXRBdHRyaWJ1dGUoImRhdGEtY2VsbG1vZGUiLCB0aGlzLnByZWZzLmNlbGxNb2RlKTsKICAgIHRoaXMuZ3JpZEVsLnNldEF0dHJpYnV0ZSgiZGF0YS1lZmZlY3QiLCB0aGlzLnByZWZzLmVmZmVjdCk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9idWlsZE9wdGlvbnNUcmlnZ2VyID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIGJ0biA9IGVsKCJidXR0b24iLCB7CiAgICAgIGNsYXNzOiAidi1jdGEgdi1jdGEtLWdob3N0IHZmZWVkLW9wdGlvbnMtdHJpZ2dlciIsCiAgICAgIHR5cGU6ICJidXR0b24iLAogICAgICAiYXJpYS1oYXNwb3B1cCI6ICJkaWFsb2ciLAogICAgICB0aXRsZTogIkRpc3BsYXkgb3B0aW9ucyIsCiAgICAgICJhcmlhLWxhYmVsIjogIkRpc3BsYXkgb3B0aW9ucyIKICAgIH0sIFsKICAgICAgZWwoInNwYW4iLCB7IGNsYXNzOiAidmZlZWQtb3B0aW9ucy10cmlnZ2VyX19pY28iLCAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIsIGh0bWw6IG9wdGlvbnNHbHlwaCgpIH0pLAogICAgICBlbCgic3BhbiIsIHsgdGV4dDogIkRpc3BsYXkiIH0pCiAgICBdKTsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsgc2VsZi5fb3Blbk9wdGlvbnMoKTsgfSk7CiAgICByZXR1cm4gYnRuOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fb3Blbk9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgY29udGVudCA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidmZlZWQtb3B0cyIgfSk7CgogICAgY29udGVudC5hcHBlbmRDaGlsZChlbCgiaDIiLCB7IGNsYXNzOiAidmZlZWQtb3B0c19fdGl0bGUiLCB0ZXh0OiAiRGlzcGxheSBvcHRpb25zIiB9KSk7CgogICAgY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLl9zZWdtZW50Um93KCJHcmlkIiwgR1JJRF9TVFlMRVMsIHRoaXMucHJlZnMuZ3JpZFN0eWxlLCBmdW5jdGlvbiAodikgewogICAgICBzZWxmLl9zZXRQcmVmKCJncmlkU3R5bGUiLCB2KTsKICAgICAgc2VsZi5fcmVmbG93Q29sdW1ucygpOwogICAgfSkpOwoKICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5fc2VnbWVudFJvdygiQ2VsbCBtb2RlIiwgQ0VMTF9NT0RFUywgdGhpcy5wcmVmcy5jZWxsTW9kZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgc2VsZi5fc2V0UHJlZigiY2VsbE1vZGUiLCB2KTsKICAgICAgc2VsZi5fcmVyZW5kZXJDYXJkcygpOwogICAgfSkpOwoKICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5fc2xpZGVyUm93KCJTcGVlZCIsIDAuMjUsIDMuMCwgMC4yNSwgdGhpcy5wcmVmcy5zcGVlZCwgZnVuY3Rpb24gKG4pIHsgcmV0dXJuIG4udG9GaXhlZCgyKSArICLDlyI7IH0sIGZ1bmN0aW9uICh2KSB7CiAgICAgIHNlbGYuX3NldFByZWYoInNwZWVkIiwgdik7CiAgICAgIHNlbGYuc3RhdGVzLmZvckVhY2goZnVuY3Rpb24gKHMpIHsgaWYgKHMpIHMuc3BlZWQgPSB2OyB9KTsKICAgIH0pKTsKCiAgICBjb250ZW50LmFwcGVuZENoaWxkKHRoaXMuX3NlbGVjdFJvdygiRWZmZWN0IiwgRUZGRUNUUywgdGhpcy5wcmVmcy5lZmZlY3QsIGZ1bmN0aW9uICh2KSB7CiAgICAgIHNlbGYuX3NldFByZWYoImVmZmVjdCIsIHYpOwogICAgICBzZWxmLl9hcHBseUVmZmVjdCgpOwogICAgfSkpOwoKICAgIHZhciByZXNldEJ0biA9IGVsKCJidXR0b24iLCB7IGNsYXNzOiAidi1jdGEgdi1jdGEtLWdob3N0IHZmZWVkLW9wdHNfX3Jlc2V0IiwgdHlwZTogImJ1dHRvbiIsIHRleHQ6ICJSZXNldCB0byBkZWZhdWx0cyIgfSk7CiAgICByZXNldEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgc2VsZi5wcmVmcyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfUFJFRlMpOwogICAgICBPYmplY3Qua2V5cyhERUZBVUxUX1BSRUZTKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IHByZWZTZXQoaywgREVGQVVMVF9QUkVGU1trXSk7IH0pOwogICAgICBpZiAoc2VsZi5fb3B0c1JlZiAmJiBzZWxmLl9vcHRzUmVmLmNsb3NlKSBzZWxmLl9vcHRzUmVmLmNsb3NlKCk7CiAgICAgIHNlbGYuX3JlZmxvd0NvbHVtbnMoKTsKICAgICAgc2VsZi5fcmVyZW5kZXJDYXJkcygpOwogICAgfSk7CiAgICBjb250ZW50LmFwcGVuZENoaWxkKHJlc2V0QnRuKTsKCiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5zaGVldCA9PT0gImZ1bmN0aW9uIikgewogICAgICB0aGlzLl9vcHRzUmVmID0gVi51aS5zaGVldChjb250ZW50LCB7IGFyaWFMYWJlbDogIkRpc3BsYXkgb3B0aW9ucyIsIGNsYXNzTmFtZTogInZmZWVkLW9wdHMtc2hlZXQiIH0pOwogICAgfSBlbHNlIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLm1vZGFsID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHRoaXMuX29wdHNSZWYgPSBWLnVpLm1vZGFsKGNvbnRlbnQsIHsgYXJpYUxhYmVsOiAiRGlzcGxheSBvcHRpb25zIiwgY2xhc3NOYW1lOiAidmZlZWQtb3B0cy1zaGVldCIgfSk7CiAgICB9CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9zZXRQcmVmID0gZnVuY3Rpb24gKGtleSwgdmFsKSB7CiAgICB0aGlzLnByZWZzW2tleV0gPSB2YWw7CiAgICBwcmVmU2V0KGtleSwgdmFsKTsKICAgIGlmIChrZXkgPT09ICJncmlkU3R5bGUiIHx8IGtleSA9PT0gImNlbGxNb2RlIiB8fCBrZXkgPT09ICJlZmZlY3QiKSB0aGlzLl9hcHBseUdyaWRBdHRycygpOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fYXBwbHlFZmZlY3QgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMuZ3JpZEVsKSByZXR1cm47CiAgICB2YXIgZWZmID0gdGhpcy5wcmVmcy5lZmZlY3Q7CiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRoaXMuZ3JpZEVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi52Y2FyZFtkYXRhLW1vZGVdIiksIGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjLmdldEF0dHJpYnV0ZSgiZGF0YS1tb2RlIikgIT09ICJhZnRlck9ubHkiKSBjLnNldEF0dHJpYnV0ZSgiZGF0YS1lZmZlY3QiLCBlZmYpOwogICAgfSk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9zZWdtZW50Um93ID0gZnVuY3Rpb24gKGxhYmVsLCBvcHRpb25zLCB2YWx1ZSwgb25QaWNrKSB7CiAgICB2YXIgc2VnID0gZWwoImRpdiIsIHsgY2xhc3M6ICJ2ZmVlZC1zZWciLCByb2xlOiAicmFkaW9ncm91cCIsICJhcmlhLWxhYmVsIjogbGFiZWwgfSk7CiAgICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9wdCkgewogICAgICB2YXIgYWN0aXZlID0gb3B0LmtleSA9PT0gdmFsdWU7CiAgICAgIHZhciBiID0gZWwoImJ1dHRvbiIsIHsKICAgICAgICBjbGFzczogInZmZWVkLXNlZ19fYnRuIiArIChhY3RpdmUgPyAiIGlzLWFjdGl2ZSIgOiAiIiksCiAgICAgICAgdHlwZTogImJ1dHRvbiIsCiAgICAgICAgcm9sZTogInJhZGlvIiwKICAgICAgICAiYXJpYS1jaGVja2VkIjogYWN0aXZlID8gInRydWUiIDogImZhbHNlIiwKICAgICAgICAiZGF0YS12YWwiOiBvcHQua2V5LAogICAgICAgIHRleHQ6IG9wdC5sYWJlbAogICAgICB9KTsKICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHNlZy5xdWVyeVNlbGVjdG9yQWxsKCIudmZlZWQtc2VnX19idG4iKSwgZnVuY3Rpb24gKG4pIHsKICAgICAgICAgIHZhciBvbiA9IG4uZ2V0QXR0cmlidXRlKCJkYXRhLXZhbCIpID09PSBvcHQua2V5OwogICAgICAgICAgbi5jbGFzc0xpc3QudG9nZ2xlKCJpcy1hY3RpdmUiLCBvbik7CiAgICAgICAgICBuLnNldEF0dHJpYnV0ZSgiYXJpYS1jaGVja2VkIiwgb24gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICAgICB9KTsKICAgICAgICBvblBpY2sob3B0LmtleSk7CiAgICAgIH0pOwogICAgICBzZWcuYXBwZW5kQ2hpbGQoYik7CiAgICB9KTsKICAgIHJldHVybiBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLW9wdHNfX3JvdyIgfSwgWwogICAgICBlbCgic3BhbiIsIHsgY2xhc3M6ICJ2ZmVlZC1vcHRzX19sYWJlbCIsIHRleHQ6IGxhYmVsIH0pLAogICAgICBzZWcKICAgIF0pOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fc2VsZWN0Um93ID0gZnVuY3Rpb24gKGxhYmVsLCBvcHRpb25zLCB2YWx1ZSwgb25QaWNrKSB7CiAgICB2YXIgc2VsID0gZWwoInNlbGVjdCIsIHsgY2xhc3M6ICJ2LXNlbGVjdCB2ZmVlZC1vcHRzX19zZWxlY3QiLCAiYXJpYS1sYWJlbCI6IGxhYmVsIH0pOwogICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvcHQpIHsKICAgICAgdmFyIG8gPSBlbCgib3B0aW9uIiwgeyB2YWx1ZTogb3B0LmtleSwgdGV4dDogb3B0LmxhYmVsIH0pOwogICAgICBpZiAob3B0LmtleSA9PT0gdmFsdWUpIG8uc2VsZWN0ZWQgPSB0cnVlOwogICAgICBzZWwuYXBwZW5kQ2hpbGQobyk7CiAgICB9KTsKICAgIHNlbC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7IG9uUGljayhzZWwudmFsdWUpOyB9KTsKICAgIHJldHVybiBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLW9wdHNfX3JvdyIgfSwgWwogICAgICBlbCgic3BhbiIsIHsgY2xhc3M6ICJ2ZmVlZC1vcHRzX19sYWJlbCIsIHRleHQ6IGxhYmVsIH0pLAogICAgICBzZWwKICAgIF0pOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fc2xpZGVyUm93ID0gZnVuY3Rpb24gKGxhYmVsLCBtaW4sIG1heCwgc3RlcCwgdmFsdWUsIGZtdCwgb25JbnB1dCkgewogICAgdmFyIHZhbEVsID0gZWwoInNwYW4iLCB7IGNsYXNzOiAidmZlZWQtb3B0c19fdmFsIiwgdGV4dDogZm10KHZhbHVlKSB9KTsKICAgIHZhciBpbnB1dCA9IGVsKCJpbnB1dCIsIHsKICAgICAgdHlwZTogInJhbmdlIiwKICAgICAgY2xhc3M6ICJ2ZmVlZC1yYW5nZSIsCiAgICAgIG1pbjogU3RyaW5nKG1pbiksCiAgICAgIG1heDogU3RyaW5nKG1heCksCiAgICAgIHN0ZXA6IFN0cmluZyhzdGVwKSwKICAgICAgdmFsdWU6IFN0cmluZyh2YWx1ZSksCiAgICAgICJhcmlhLWxhYmVsIjogbGFiZWwKICAgIH0pOwogICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBuID0gTnVtYmVyKGlucHV0LnZhbHVlKTsKICAgICAgdmFsRWwudGV4dENvbnRlbnQgPSBmbXQobik7CiAgICAgIG9uSW5wdXQobik7CiAgICB9KTsKICAgIHJldHVybiBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLW9wdHNfX3JvdyB2ZmVlZC1vcHRzX19yb3ctLXNsaWRlciIgfSwgWwogICAgICBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLW9wdHNfX3NsaWRlcmhlYWQiIH0sIFsKICAgICAgICBlbCgic3BhbiIsIHsgY2xhc3M6ICJ2ZmVlZC1vcHRzX19sYWJlbCIsIHRleHQ6IGxhYmVsIH0pLAogICAgICAgIHZhbEVsCiAgICAgIF0pLAogICAgICBpbnB1dAogICAgXSk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9yZWZsb3dDb2x1bW5zID0gZnVuY3Rpb24gKCkgewogICAgaWYgKHRoaXMuZGVzdHJveWVkIHx8ICF0aGlzLmxheW91dCB8fCAhdGhpcy5ncmlkRWwpIHJldHVybjsKICAgIHRoaXMuX2FwcGx5R3JpZEF0dHJzKCk7CiAgICB2YXIgY29scyA9IGNvbHVtbnNGb3JXaWR0aCh0aGlzLmdyaWRFbC5jbGllbnRXaWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAxMDI0LCB0aGlzLnByZWZzLmdyaWRTdHlsZSk7CiAgICB0aGlzLmxheW91dC5zZXRDb2x1bW5zKGNvbHMpOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fcmVyZW5kZXJDYXJkcyA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdGhpcy5sYXlvdXQpIHJldHVybjsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHVucmVnaXN0ZXJTdGF0ZXModGhpcy5zdGF0ZXMpOwogICAgdGhpcy5zdGF0ZXMgPSBbXTsKICAgIHRoaXMubGF5b3V0LmNsZWFyKCk7CiAgICB0aGlzLml0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0KSB7CiAgICAgIHNlbGYubGF5b3V0LmFkZChidWlsZENhcmQoaXQsIHNlbGYucHJlZnMsIHNlbGYpLCBjYXJkV2VpZ2h0KGl0KSk7CiAgICB9KTsKICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmRvbmUgJiYgIXRoaXMuZXJyb3JlZCkgdGhpcy5fcmVuZGVyRW1wdHkoKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX2J1aWxkQ2hpcHMgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgYmFyID0gZWwoImRpdiIsIHsgY2xhc3M6ICJ2LWNoaXAtcm93IHZmZWVkLWNoaXBzIiwgcm9sZTogInRhYmxpc3QiLCAiYXJpYS1sYWJlbCI6ICJGaWx0ZXIgYnkgdGhlbWUiIH0pOwogICAgVEFHUy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgIHZhciBhY3RpdmUgPSAodC5rZXkgPT09IHNlbGYudGFnKTsKICAgICAgdmFyIGNoaXAgPSBlbCgiYnV0dG9uIiwgewogICAgICAgIGNsYXNzOiAidi1jaGlwIiArIChhY3RpdmUgPyAiIHYtY2hpcC0tYWN0aXZlIiA6ICIiKSwKICAgICAgICB0eXBlOiAiYnV0dG9uIiwKICAgICAgICByb2xlOiAidGFiIiwKICAgICAgICAiYXJpYS1zZWxlY3RlZCI6IGFjdGl2ZSA/ICJ0cnVlIiA6ICJmYWxzZSIsCiAgICAgICAgImRhdGEtdGFnIjogdC5rZXksCiAgICAgICAgdGV4dDogdC5sYWJlbAogICAgICB9KTsKICAgICAgY2hpcC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoc2VsZi50YWcgPT09IHQua2V5KSByZXR1cm47CiAgICAgICAgc2VsZi5zZXRUYWcodC5rZXkpOwogICAgICAgIHZhciBucSA9ICIjL2luc3BpcmF0aW9uIiArICh0LmtleSA/ICI/dGFnPSIgKyBlbmNvZGVVUklDb21wb25lbnQodC5rZXkpIDogIiIpOwogICAgICAgIGlmIChsb2NhdGlvbi5oYXNoICE9PSBucSkgewogICAgICAgICAgaWYgKFYucm91dGVyICYmIHR5cGVvZiBWLnJvdXRlci5yZXBsYWNlID09PSAiZnVuY3Rpb24iKSBWLnJvdXRlci5yZXBsYWNlKG5xKTsKICAgICAgICAgIGVsc2UgaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgIiIsIG5xKTsKICAgICAgICB9CiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiYXIucXVlcnlTZWxlY3RvckFsbCgiLnYtY2hpcCIpLCBmdW5jdGlvbiAoYykgewogICAgICAgICAgdmFyIG9uID0gYy5nZXRBdHRyaWJ1dGUoImRhdGEtdGFnIikgPT09IHQua2V5OwogICAgICAgICAgYy5jbGFzc0xpc3QudG9nZ2xlKCJ2LWNoaXAtLWFjdGl2ZSIsIG9uKTsKICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwgb24gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICAgICB9KTsKICAgICAgICB0cnkgeyBjaGlwLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICJzbW9vdGgiLCBpbmxpbmU6ICJjZW50ZXIiLCBibG9jazogIm5lYXJlc3QiIH0pOyB9IGNhdGNoIChlKSB7fQogICAgICB9KTsKICAgICAgYmFyLmFwcGVuZENoaWxkKGNoaXApOwogICAgfSk7CiAgICByZXR1cm4gYmFyOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5zZXRUYWcgPSBmdW5jdGlvbiAodGFnKSB7CiAgICB0YWcgPSB0YWcgfHwgIiI7CiAgICBpZiAodGFnID09PSB0aGlzLnRhZykgcmV0dXJuOwogICAgdGhpcy50YWcgPSB0YWc7CiAgICB0aGlzLl9yZWxvYWQoKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX3JlbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuX3JlcVRva2VuKys7CiAgICB0aGlzLnBhZ2UgPSAxOwogICAgdGhpcy5pdGVtcyA9IFtdOwogICAgdGhpcy50b3RhbCA9IG51bGw7CiAgICB0aGlzLmRvbmUgPSBmYWxzZTsKICAgIHRoaXMuZXJyb3JlZCA9IGZhbHNlOwogICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICB0aGlzLnNlZW4gPSB7fTsKICAgIHVucmVnaXN0ZXJTdGF0ZXModGhpcy5zdGF0ZXMpOwogICAgdGhpcy5zdGF0ZXMgPSBbXTsKICAgIGlmICh0aGlzLmxheW91dCkgdGhpcy5sYXlvdXQuY2xlYXIoKTsKICAgIHRoaXMuX3Nob3dTa2VsZXRvbnMoTWF0aC5taW4odGhpcy5wZXIsIDkpKTsKICAgIHRoaXMubG9hZE5leHQodHJ1ZSk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9zaG93U2tlbGV0b25zID0gZnVuY3Rpb24gKG4pIHsKICAgIGlmICghdGhpcy5sYXlvdXQpIHJldHVybjsKICAgIHRoaXMubGF5b3V0LmNsZWFyKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgc2s7CiAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnNrZWxldG9uID09PSAiZnVuY3Rpb24iKSBzayA9IFYudWkuc2tlbGV0b24oImNhcmQiKTsKICAgICAgZWxzZSBzayA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidi1za2VsZXRvbiIgfSk7CiAgICAgIGlmIChzayAmJiBzay5jbGFzc0xpc3QpIHNrLmNsYXNzTGlzdC5hZGQoInZmZWVkLXNrZWwiKTsKICAgICAgaWYgKHNrICYmIHNrLnN0eWxlKSBzay5zdHlsZS5taW5IZWlnaHQgPSAoMTgwICsgKChpICogNTMpICUgMTQwKSkgKyAicHgiOwogICAgICB0aGlzLmxheW91dC5hZGQoc2ssIDEgKyAoKGkgKiAwLjM3KSAlIDAuOSkpOwogICAgfQogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fY2xlYXJTa2VsZXRvbnMgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMuZ3JpZEVsKSByZXR1cm47CiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRoaXMuZ3JpZEVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi52ZmVlZC1za2VsIiksIGZ1bmN0aW9uIChuKSB7CiAgICAgIGlmIChuLnBhcmVudE5vZGUpIG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTsKICAgIH0pOwogICAgaWYgKHRoaXMubGF5b3V0KSB7CiAgICAgIHRoaXMubGF5b3V0LmNvbEggPSB0aGlzLmxheW91dC5jb2xILm1hcChmdW5jdGlvbiAoKSB7IHJldHVybiAwOyB9KTsKICAgICAgdGhpcy5sYXlvdXQubm9kZXMgPSBbXTsKICAgIH0KICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUubG9hZE5leHQgPSBmdW5jdGlvbiAoaXNGaXJzdCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgaWYgKHRoaXMubG9hZGluZyB8fCB0aGlzLmRvbmUgfHwgdGhpcy5kZXN0cm95ZWQpIHJldHVybjsKICAgIGlmICh0aGlzLmxpbWl0ICYmIHRoaXMuaXRlbXMubGVuZ3RoID49IHRoaXMubGltaXQpIHsgdGhpcy5kb25lID0gdHJ1ZTsgdGhpcy5fcmVuZGVyRm9vdGVyKCk7IHJldHVybjsgfQoKICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICB0aGlzLmVycm9yZWQgPSBmYWxzZTsKICAgIHZhciB0b2tlbiA9ICsrdGhpcy5fcmVxVG9rZW47CiAgICB0aGlzLl9yZW5kZXJGb290ZXIoKTsKCiAgICB2YXIgZmV0Y2hlciA9IChWLmFwaSAmJiB0eXBlb2YgVi5hcGkuY3VyYXRlZEZlZWQgPT09ICJmdW5jdGlvbiIpCiAgICAgID8gVi5hcGkuY3VyYXRlZEZlZWQodGhpcy5wYWdlLCB0aGlzLnBlciwgdGhpcy50YWcgfHwgbnVsbCkKICAgICAgOiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkZlZWQgQVBJIHVuYXZhaWxhYmxlIikpOwoKICAgIFByb21pc2UucmVzb2x2ZShmZXRjaGVyKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgaWYgKHNlbGYuZGVzdHJveWVkIHx8IHRva2VuICE9PSBzZWxmLl9yZXFUb2tlbikgcmV0dXJuOwogICAgICBzZWxmLmxvYWRpbmcgPSBmYWxzZTsKCiAgICAgIHZhciBpdGVtcyA9IFtdOwogICAgICB2YXIgbWV0YSA9IG51bGw7CiAgICAgIGlmIChyZXMgJiYgQXJyYXkuaXNBcnJheShyZXMuaXRlbXMpKSB7IGl0ZW1zID0gcmVzLml0ZW1zOyBtZXRhID0gcmVzLm1ldGFkYXRhIHx8IG51bGw7IH0KICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXMpKSB7IGl0ZW1zID0gcmVzOyB9CgogICAgICBpZiAobWV0YSAmJiB0eXBlb2YgbWV0YS50b3RhbCA9PT0gIm51bWJlciIpIHNlbGYudG90YWwgPSBtZXRhLnRvdGFsOwoKICAgICAgaWYgKGlzRmlyc3QpIHNlbGYuX2NsZWFyU2tlbGV0b25zKCk7CgogICAgICB2YXIgYWRkZWQgPSAwOwogICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdCkgewogICAgICAgIHZhciBnaSA9IGltYWdlT2YoaXQpOwogICAgICAgIGlmICghYWZ0ZXJVUkwoZ2kpICYmICFiZWZvcmVVUkwoZ2kpKSByZXR1cm47CiAgICAgICAgdmFyIGlkID0gZ2kucmVtb3RlSUQgfHwgZ2kuaWQ7CiAgICAgICAgdmFyIGRrZXkgPSBpZCB8fCAoYWZ0ZXJVUkwoZ2kpICsgInwiICsgKGdpLnByb21wdCB8fCAiIikpOwogICAgICAgIGlmIChzZWxmLnNlZW5bZGtleV0pIHJldHVybjsKICAgICAgICBzZWxmLnNlZW5bZGtleV0gPSB0cnVlOwogICAgICAgIGlmIChzZWxmLmxpbWl0ICYmIHNlbGYuaXRlbXMubGVuZ3RoID49IHNlbGYubGltaXQpIHJldHVybjsKICAgICAgICBzZWxmLml0ZW1zLnB1c2goaXQpOwogICAgICAgIHNlbGYubGF5b3V0LmFkZChidWlsZENhcmQoaXQsIHNlbGYucHJlZnMsIHNlbGYpLCBjYXJkV2VpZ2h0KGl0KSk7CiAgICAgICAgYWRkZWQrKzsKICAgICAgfSk7CgogICAgICBpZiAoaXRlbXMubGVuZ3RoIDwgc2VsZi5wZXIpIHNlbGYuZG9uZSA9IHRydWU7CiAgICAgIGlmIChzZWxmLmxpbWl0ICYmIHNlbGYuaXRlbXMubGVuZ3RoID49IHNlbGYubGltaXQpIHNlbGYuZG9uZSA9IHRydWU7CiAgICAgIGlmIChzZWxmLnRvdGFsICE9IG51bGwgJiYgc2VsZi5pdGVtcy5sZW5ndGggPj0gc2VsZi50b3RhbCkgc2VsZi5kb25lID0gdHJ1ZTsKCiAgICAgIGlmIChhZGRlZCA+IDAgfHwgc2VsZi5pdGVtcy5sZW5ndGggPiAwKSBzZWxmLnBhZ2UrKzsKCiAgICAgIGlmIChpc0ZpcnN0ICYmIHNlbGYuaXRlbXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgc2VsZi5kb25lID0gdHJ1ZTsKICAgICAgICBzZWxmLl9yZW5kZXJFbXB0eSgpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgc2VsZi5fcmVuZGVyRm9vdGVyKCk7CiAgICAgIHNlbGYuX21heWJlQXV0b0xvYWQoKTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgaWYgKHNlbGYuZGVzdHJveWVkIHx8IHRva2VuICE9PSBzZWxmLl9yZXFUb2tlbikgcmV0dXJuOwogICAgICBzZWxmLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgc2VsZi5lcnJvcmVkID0gdHJ1ZTsKICAgICAgaWYgKGlzRmlyc3QpIHsKICAgICAgICBzZWxmLl9jbGVhclNrZWxldG9ucygpOwogICAgICAgIGlmIChzZWxmLml0ZW1zLmxlbmd0aCA9PT0gMCkgeyBzZWxmLl9yZW5kZXJFcnJvcihlcnIpOyByZXR1cm47IH0KICAgICAgfQogICAgICBzZWxmLl9yZW5kZXJGb290ZXIoKTsKICAgIH0pOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fbWF5YmVBdXRvTG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLmRvbmUgfHwgdGhpcy5sb2FkaW5nIHx8IHRoaXMuZGVzdHJveWVkIHx8ICF0aGlzLnNlbnRpbmVsKSByZXR1cm47CiAgICB2YXIgciA9IHRoaXMuc2VudGluZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICB2YXIgdmggPSB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDsKICAgIGlmIChyLnRvcCA8IHZoICsgMzAwKSB7CiAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7IHNlbGYubG9hZE5leHQoKTsgfSk7CiAgICB9CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9yZW5kZXJGb290ZXIgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMuc3RhdHVzRWwpIHJldHVybjsKICAgIHZhciBzID0gdGhpcy5zdGF0dXNFbDsKICAgIHMuaW5uZXJIVE1MID0gIiI7CiAgICBpZiAodGhpcy5sb2FkaW5nKSB7CiAgICAgIHZhciBzcGluID0gKFYudWkgJiYgdHlwZW9mIFYudWkuc3Bpbm5lciA9PT0gImZ1bmN0aW9uIikgPyBWLnVpLnNwaW5uZXIoKSA6IGVsKCJzcGFuIiwgeyBjbGFzczogInYtc3Bpbm5lciIgfSk7CiAgICAgIHMuYXBwZW5kQ2hpbGQoc3Bpbik7CiAgICAgIHMuYXBwZW5kQ2hpbGQoZWwoInNwYW4iLCB7IHRleHQ6IHRoaXMuaXRlbXMubGVuZ3RoID8gIkxvYWRpbmcgbW9yZeKApiIgOiAiTG9hZGluZyBpbnNwaXJhdGlvbuKApiIgfSkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5lcnJvcmVkKSB7CiAgICAgIHMuYXBwZW5kQ2hpbGQoZWwoInNwYW4iLCB7IHRleHQ6ICJDb3VsZG7igJl0IGxvYWQgbW9yZSByZXN1bHRzLiIgfSkpOwogICAgICB2YXIgcmV0cnkgPSBlbCgiYnV0dG9uIiwgeyBjbGFzczogInYtY3RhIHYtY3RhLS1naG9zdCB2ZmVlZC1yZXRyeSIsIHR5cGU6ICJidXR0b24iLCB0ZXh0OiAiUmV0cnkiIH0pOwogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIHJldHJ5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgeyBzZWxmLmxvYWROZXh0KCk7IH0pOwogICAgICBzLmFwcGVuZENoaWxkKHJldHJ5KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuZG9uZSAmJiB0aGlzLml0ZW1zLmxlbmd0aCA+IDAgJiYgIXRoaXMuaW5saW5lKSB7CiAgICAgIHMuYXBwZW5kQ2hpbGQoZWwoInNwYW4iLCB7IHRleHQ6ICJZb3XigJl2ZSByZWFjaGVkIHRoZSBlbmQuIiB9KSk7CiAgICB9CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9yZW5kZXJFbXB0eSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIGlmICh0aGlzLmxheW91dCkgdGhpcy5sYXlvdXQuY2xlYXIoKTsKICAgIGlmICh0aGlzLnN0YXR1c0VsKSB0aGlzLnN0YXR1c0VsLmlubmVySFRNTCA9ICIiOwogICAgdmFyIG1zZyA9IHRoaXMudGFnCiAgICAgID8gIk5vIGluc3BpcmF0aW9uIGZvdW5kIGZvciDigJwiICsgdGhpcy50YWcgKyAi4oCdIHlldC4iCiAgICAgIDogIk5vIGluc3BpcmF0aW9uIHRvIHNob3cgeWV0LiI7CiAgICB2YXIgYWN0aW9uTGFiZWwgPSB0aGlzLnRhZyA/ICJDbGVhciBmaWx0ZXIiIDogIlN0YXJ0IGNyZWF0aW5nIjsKICAgIHZhciBvbkFjdGlvbiA9IHRoaXMudGFnCiAgICAgID8gZnVuY3Rpb24gKCkgewogICAgICAgICAgc2VsZi5zZXRUYWcoIiIpOwogICAgICAgICAgaWYgKHNlbGYuY2hpcHNCYXIpIHsKICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzZWxmLmNoaXBzQmFyLnF1ZXJ5U2VsZWN0b3JBbGwoIi52LWNoaXAiKSwgZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICB2YXIgb24gPSBjLmdldEF0dHJpYnV0ZSgiZGF0YS10YWciKSA9PT0gIiI7CiAgICAgICAgICAgICAgYy5jbGFzc0xpc3QudG9nZ2xlKCJ2LWNoaXAtLWFjdGl2ZSIsIG9uKTsKICAgICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsIG9uID8gInRydWUiIDogImZhbHNlIik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgOiBmdW5jdGlvbiAoKSB7IGdvKCIjL2NyZWF0ZSIpOyB9OwoKICAgIHZhciBlbXB0eU5vZGU7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5lbXB0eSA9PT0gImZ1bmN0aW9uIikgewogICAgICBlbXB0eU5vZGUgPSBWLnVpLmVtcHR5KG1zZywgYWN0aW9uTGFiZWwsIG9uQWN0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIGVtcHR5Tm9kZSA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidi1lbXB0eSIgfSwgWwogICAgICAgIGVsKCJwIiwgeyBjbGFzczogInYtZW1wdHlfX3RpdGxlIiwgdGV4dDogbXNnIH0pLAogICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgYiA9IGVsKCJidXR0b24iLCB7IGNsYXNzOiAidi1jdGEgdi1jdGEtLXByaW1hcnkiLCB0eXBlOiAiYnV0dG9uIiwgdGV4dDogYWN0aW9uTGFiZWwgfSk7CiAgICAgICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgb25BY3Rpb24pOwogICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgfSkoKQogICAgICBdKTsKICAgIH0KICAgIGlmIChlbXB0eU5vZGUgJiYgZW1wdHlOb2RlLmNsYXNzTGlzdCkgZW1wdHlOb2RlLmNsYXNzTGlzdC5hZGQoInZmZWVkLWVtcHR5Iik7CiAgICB0aGlzLmdyaWRFbC5hcHBlbmRDaGlsZChlbXB0eU5vZGUpOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fcmVuZGVyRXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBpZiAodGhpcy5sYXlvdXQpIHRoaXMubGF5b3V0LmNsZWFyKCk7CiAgICBpZiAodGhpcy5zdGF0dXNFbCkgdGhpcy5zdGF0dXNFbC5pbm5lckhUTUwgPSAiIjsKICAgIHZhciBkZXRhaWwgPSAoZXJyICYmIGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogIlNvbWV0aGluZyB3ZW50IHdyb25nIGxvYWRpbmcgdGhlIGZlZWQuIjsKCiAgICB2YXIgbm9kZSA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidi1lbXB0eSB2ZmVlZC1lcnJvciIsIHJvbGU6ICJhbGVydCIgfSwgWwogICAgICBlbCgiZGl2IiwgeyBjbGFzczogInYtZW1wdHlfX2ljb24iLCAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIsIGh0bWw6IGVycm9yR2x5cGgoKSB9KSwKICAgICAgZWwoInAiLCB7IGNsYXNzOiAidi1lbXB0eV9fdGl0bGUiLCB0ZXh0OiAiV2UgY291bGRu4oCZdCBsb2FkIGluc3BpcmF0aW9uLiIgfSksCiAgICAgIGVsKCJwIiwgeyBjbGFzczogInYtZW1wdHlfX3N1YiIsIHRleHQ6IGRldGFpbCB9KSwKICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgYiA9IGVsKCJidXR0b24iLCB7IGNsYXNzOiAidi1jdGEgdi1jdGEtLXByaW1hcnkiLCB0eXBlOiAiYnV0dG9uIiwgdGV4dDogIlRyeSBhZ2FpbiIgfSk7CiAgICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsgc2VsZi5fcmVsb2FkKCk7IH0pOwogICAgICAgIHJldHVybiBiOwogICAgICB9KSgpCiAgICBdKTsKICAgIHRoaXMuZ3JpZEVsLmFwcGVuZENoaWxkKG5vZGUpOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fc2V0dXBPYnNlcnZlciA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIGlmICghKCJJbnRlcnNlY3Rpb25PYnNlcnZlciIgaW4gd2luZG93KSB8fCAhdGhpcy5zZW50aW5lbCkgcmV0dXJuOwogICAgdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbiAoZW50cmllcykgewogICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICBpZiAoZS5pc0ludGVyc2VjdGluZykgc2VsZi5sb2FkTmV4dCgpOwogICAgICB9KTsKICAgIH0sIHsgcm9vdE1hcmdpbjogIjYwMHB4IDBweCIgfSk7CiAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy5zZW50aW5lbCk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9zZXR1cFJlc2l6ZSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHRoaXMuX29uUmVzaXplID0gZGVib3VuY2UoZnVuY3Rpb24gKCkgewogICAgICBzZWxmLl9yZWZsb3dDb2x1bW5zKCk7CiAgICB9LCAxNjApOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIHRoaXMuX29uUmVzaXplKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTsKICAgIHRoaXMuX3JlcVRva2VuKys7CiAgICB1bnJlZ2lzdGVyU3RhdGVzKHRoaXMuc3RhdGVzKTsKICAgIHRoaXMuc3RhdGVzID0gW107CiAgICBpZiAodGhpcy5vYnNlcnZlcikgeyB0cnkgeyB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTsgfSBjYXRjaCAoZSkge30gdGhpcy5vYnNlcnZlciA9IG51bGw7IH0KICAgIGlmICh0aGlzLl9vblJlc2l6ZSkgeyB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIiwgdGhpcy5fb25SZXNpemUpOyB0aGlzLl9vblJlc2l6ZSA9IG51bGw7IH0KICAgIGlmICh0aGlzLl9vcHRzUmVmICYmIHRoaXMuX29wdHNSZWYuY2xvc2UpIHsgdHJ5IHsgdGhpcy5fb3B0c1JlZi5jbG9zZSgpOyB9IGNhdGNoIChlKSB7fSB0aGlzLl9vcHRzUmVmID0gbnVsbDsgfQogIH07CgogIGZ1bmN0aW9uIG9wdGlvbnNHbHlwaCgpIHsKICAgIHJldHVybiAnPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS43IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik00IDZoMTAiLz48cGF0aCBkPSJNMTggNmgyIi8+PGNpcmNsZSBjeD0iMTYiIGN5PSI2IiByPSIyIi8+PHBhdGggZD0iTTQgMTJoMiIvPjxwYXRoIGQ9Ik0xMCAxMmgxMCIvPjxjaXJjbGUgY3g9IjgiIGN5PSIxMiIgcj0iMiIvPjxwYXRoIGQ9Ik00IDE4aDEwIi8+PHBhdGggZD0iTTE4IDE4aDIiLz48Y2lyY2xlIGN4PSIxNiIgY3k9IjE4IiByPSIyIi8+PC9zdmc+JzsKICB9CgogIGZ1bmN0aW9uIGVycm9yR2x5cGgoKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5pY29uID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHZhciByID0gVi51aS5pY29uKCJhbGVydCIpOwogICAgICBpZiAodHlwZW9mIHIgPT09ICJzdHJpbmciKSByZXR1cm4gcjsKICAgICAgaWYgKHIgaW5zdGFuY2VvZiBOb2RlKSB7IHZhciBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7IGQuYXBwZW5kQ2hpbGQocik7IHJldHVybiBkLmlubmVySFRNTDsgfQogICAgfQogICAgcmV0dXJuICc8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTEwLjMgMy42IDEuOCAxOGEyIDIgMCAwIDAgMS43IDNoMTdhMiAyIDAgMCAwIDEuNy0zTDEzLjcgMy42YTIgMiAwIDAgMC0zLjQgMFoiLz48bGluZSB4MT0iMTIiIHkxPSI5IiB4Mj0iMTIiIHkyPSIxMyIvPjxsaW5lIHgxPSIxMiIgeTE9IjE3IiB4Mj0iMTIuMDEiIHkyPSIxNyIvPjwvc3ZnPic7CiAgfQoKICB2YXIgY3VycmVudCA9IG51bGw7CgogIFYudmlld3MuZmVlZCA9IHsKICAgIHJlbmRlcjogZnVuY3Rpb24gKHJvb3QsIHBhcmFtcykgewogICAgICBpZiAoIXJvb3QpIHJldHVybjsKICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgICBpZiAoY3VycmVudCkgeyBjdXJyZW50LmRlc3Ryb3koKTsgY3VycmVudCA9IG51bGw7IH0KICAgICAgdmFyIHRhZyA9IChwYXJhbXMudGFnIHx8ICIiKS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICBjdXJyZW50ID0gbmV3IEZlZWRDb250cm9sbGVyKHsgbW91bnQ6IHJvb3QsIHRhZzogdGFnLCBpbmxpbmU6IGZhbHNlIH0pOwogICAgICBjdXJyZW50LnJlbmRlcigpOwogICAgfSwKCiAgICB0ZWFyZG93bjogZnVuY3Rpb24gKCkgewogICAgICBpZiAoY3VycmVudCkgeyBjdXJyZW50LmRlc3Ryb3koKTsgY3VycmVudCA9IG51bGw7IH0KICAgIH0sCgogICAgcmVuZGVySW5saW5lOiBmdW5jdGlvbiAoY29udGFpbmVyLCBvcHRzKSB7CiAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm4gbnVsbDsKICAgICAgb3B0cyA9IG9wdHMgfHwge307CiAgICAgIHZhciBjdHJsID0gbmV3IEZlZWRDb250cm9sbGVyKHsKICAgICAgICBtb3VudDogY29udGFpbmVyLAogICAgICAgIHRhZzogKG9wdHMudGFnIHx8ICIiKS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLAogICAgICAgIGlubGluZTogdHJ1ZSwKICAgICAgICBsaW1pdDogMCwKICAgICAgICBwZXI6IElOTElORV9ERUZBVUxULAogICAgICAgIHNob3dDaGlwczogZmFsc2UsCiAgICAgICAgc2hvd0hlYWRlcjogZmFsc2UsCiAgICAgICAgc2hvd09wdGlvbnM6IGZhbHNlLAogICAgICAgIG9uQXBwbHk6IG9wdHMub25BcHBseQogICAgICB9KTsKICAgICAgY3RybC5yZW5kZXIoKTsKICAgICAgcmV0dXJuIGN0cmw7CiAgICB9LAoKICAgIGFwcGx5RXhhbXBsZVRvQ3JlYXRvcjogYXBwbHlFeGFtcGxlVG9DcmVhdG9yCiAgfTsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvcHJlc2V0cy5qcyA9PT09PSAqLwooZnVuY3Rpb24gKCkgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIFYgPSB3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9OwogIFYuc3RhdGUgPSBWLnN0YXRlIHx8IHt9OwogIGlmICghQXJyYXkuaXNBcnJheShWLnN0YXRlLmN1c3RvbVByZXNldHMpKSBWLnN0YXRlLmN1c3RvbVByZXNldHMgPSBbXTsKCiAgZnVuY3Rpb24gdWkoKSB7IHJldHVybiBWLnVpIHx8IHt9OyB9CiAgZnVuY3Rpb24gYXBpKCkgeyByZXR1cm4gVi5hcGkgfHwge307IH0KICBmdW5jdGlvbiBzdG9yZSgpIHsgcmV0dXJuIFYuc3RvcmUgfHwge307IH0KICBmdW5jdGlvbiB1dGlsKCkgeyByZXR1cm4gVi51dGlsIHx8IHt9OyB9CgogIGZ1bmN0aW9uIGVsKHRhZywgYXR0cnMsIGtpZHMpIHsKICAgIGlmICh1aSgpLmVsKSByZXR1cm4gdWkoKS5lbC5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMgJiYgdHlwZW9mIGF0dHJzID09PSAib2JqZWN0IikgewogICAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICAgIHZhciB2ID0gYXR0cnNba107CiAgICAgICAgaWYgKHYgPT0gbnVsbCB8fCB2ID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgIGlmIChrID09PSAiY2xhc3MiIHx8IGsgPT09ICJjbGFzc05hbWUiKSBub2RlLmNsYXNzTmFtZSA9IHY7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gInRleHQiKSBub2RlLnRleHRDb250ZW50ID0gdjsKICAgICAgICBlbHNlIGlmIChrID09PSAiaHRtbCIpIG5vZGUuaW5uZXJIVE1MID0gdjsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoIm9uIikgPT09IDAgJiYgdHlwZW9mIHYgPT09ICJmdW5jdGlvbiIpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHYpOwogICAgICAgIGVsc2UgaWYgKGsuaW5kZXhPZigiZGF0YS0iKSA9PT0gMCkgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdik7CiAgICAgICAgZWxzZSBub2RlLnNldEF0dHJpYnV0ZShrLCB2ID09PSB0cnVlID8gIiIgOiB2KTsKICAgICAgfSk7CiAgICB9CiAgICB2YXIgcmVzdCA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgIHJlc3QuZm9yRWFjaChmdW5jdGlvbiBhcHBlbmRLaWQoYykgewogICAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlKSByZXR1cm47CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGMpKSByZXR1cm4gYy5mb3JFYWNoKGFwcGVuZEtpZCk7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoYy5ub2RlVHlwZSA/IGMgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICAgIH0pOwogICAgcmV0dXJuIG5vZGU7CiAgfQogIGZ1bmN0aW9uIGljb24obmFtZSkgewogICAgaWYgKCF1aSgpLmljb24pIHJldHVybiAiIjsKICAgIHZhciBnb3QgPSB1aSgpLmljb24obmFtZSk7CiAgICBpZiAodHlwZW9mIGdvdCA9PT0gInN0cmluZyIpIHJldHVybiBnb3Q7CiAgICBpZiAoZ290ICYmIGdvdC5ub2RlVHlwZSAmJiB0eXBlb2YgZ290Lm91dGVySFRNTCA9PT0gInN0cmluZyIpIHJldHVybiBnb3Qub3V0ZXJIVE1MOwogICAgcmV0dXJuICIiOwogIH0KICBmdW5jdGlvbiB0b2FzdChtc2csIGtpbmQpIHsgaWYgKHVpKCkudG9hc3QpIHVpKCkudG9hc3QobXNnLCBraW5kKTsgZWxzZSBpZiAoc3RvcmUoKS5lbWl0KSBzdG9yZSgpLmVtaXQoInRvYXN0IiwgeyBtc2c6IG1zZywga2luZDoga2luZCB9KTsgfQogIGZ1bmN0aW9uIHV1aWQoKSB7CiAgICBpZiAodXRpbCgpLnV1aWQpIHJldHVybiB1dGlsKCkudXVpZCgpOwogICAgaWYgKHdpbmRvdy5jcnlwdG8gJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpOwogICAgcmV0dXJuICJ4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgiLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHsKICAgICAgdmFyIHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDAsIHYgPSBjID09PSAieCIgPyByIDogKHIgJiAweDMpIHwgMHg4OyByZXR1cm4gdi50b1N0cmluZygxNik7CiAgICB9KTsKICB9CgogIHZhciBMU19LRVkgPSAidmFtcF93ZWJfY3VzdG9tUHJlc2V0cyI7CiAgZnVuY3Rpb24gcGVyc2lzdCgpIHsKICAgIGlmIChzdG9yZSgpLnNldCkgc3RvcmUoKS5zZXQoImN1c3RvbVByZXNldHMiLCBWLnN0YXRlLmN1c3RvbVByZXNldHMpOwogICAgaWYgKHN0b3JlKCkuc2F2ZSkgeyBzdG9yZSgpLnNhdmUoKTsgcmV0dXJuOyB9CiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMU19LRVksIEpTT04uc3RyaW5naWZ5KFYuc3RhdGUuY3VzdG9tUHJlc2V0cykpOyB9IGNhdGNoIChlKSB7fQogIH0KICBmdW5jdGlvbiByZXN0b3JlKCkgewogICAgdmFyIGNhY2hlZCA9IHN0b3JlKCkuZ2V0ID8gc3RvcmUoKS5nZXQoImN1c3RvbVByZXNldHMiKSA6IG51bGw7CiAgICBpZiAoQXJyYXkuaXNBcnJheShjYWNoZWQpICYmIGNhY2hlZC5sZW5ndGgpIHsgVi5zdGF0ZS5jdXN0b21QcmVzZXRzID0gY2FjaGVkLm1hcChub3JtYWxpemVQcmVzZXQpOyByZXR1cm47IH0KICAgIHRyeSB7CiAgICAgIHZhciByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19LRVkpOwogICAgICBpZiAocmF3KSBWLnN0YXRlLmN1c3RvbVByZXNldHMgPSAoSlNPTi5wYXJzZShyYXcpIHx8IFtdKS5tYXAobm9ybWFsaXplUHJlc2V0KTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiBub3dJU08oKSB7IHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXC5cZCsvLCAiIik7IH0KICBmdW5jdGlvbiBub3JtYWxpemVQcmVzZXQocCkgewogICAgcCA9IHAgfHwge307CiAgICByZXR1cm4gewogICAgICBpZDogcC5pZCB8fCB1dWlkKCksCiAgICAgIG5hbWU6IChwLm5hbWUgfHwgIiIpLnRyaW0oKSwKICAgICAgcHJvbXB0OiAocC5wcm9tcHQgfHwgIiIpLnRyaW0oKSwKICAgICAgbmVnYXRpdmVQcm9tcHQ6IChwLm5lZ2F0aXZlUHJvbXB0IHx8ICIiKS50cmltKCkgfHwgbnVsbCwKICAgICAgbW9kZWw6IHAubW9kZWwgfHwgbnVsbCwKICAgICAgY3JlYXRlZEF0OiBwLmNyZWF0ZWRBdCB8fCBub3dJU08oKSwKICAgICAgdXBkYXRlZEF0OiBwLnVwZGF0ZWRBdCB8fCBub3dJU08oKQogICAgfTsKICB9CgogIHZhciBJTkRVU1RSWV9SRUxFVkFOQ0UgPSB7CiAgICByZWFsRXN0YXRlOiBbInJlbW92ZUFsbEZ1cm5pdHVyZSIsICJyZW1vdmVDbHV0dGVyIiwgInJlbW92ZUZ1cm5pdHVyZUFuZENsdXR0ZXIiLCAicmVtb3ZlUGVvcGxlIiwgInJlbW92ZVJlZmxlY3Rpb25zIiwgImltcHJvdmVMaWdodGluZyIsICJkZXBlcnNvbmFsaXplIiwgIm5ldXRyYWxQYWludCIsICJmaXhXYWxscyIsICJhZGRDdXJiQXBwZWFsIiwgImltcHJvdmVFeHRlcmlvciIsICJpbXByb3ZlU2tpZXMiLCAibW9kZXJuU3RhZ2luZyIsICJ0cmFuc2l0aW9uYWxTdGFnaW5nIiwgIm1pbmltYWxpc3RTdGFnaW5nIiwgIndhcm1NaW5pbWFsaXN0U3RhZ2luZyIsICJsdXh1cnlTdGFnaW5nIiwgImFkZExhbmRzY2FwaW5nIiwgImNsZWFuTGFuZHNjYXBpbmciLCAiaW1wcm92ZUVudHJ5d2F5Il0sCiAgICBpbnRlcmlvckRlc2lnbjogWyJyZW1vdmVBbGxGdXJuaXR1cmUiLCAicmVtb3ZlQ2x1dHRlciIsICJyZW1vdmVGdXJuaXR1cmVBbmRDbHV0dGVyIiwgImltcHJvdmVMaWdodGluZyIsICJuZXV0cmFsUGFpbnQiLCAiZml4V2FsbHMiLCAibW9kZXJuaXplIiwgImRlcGVyc29uYWxpemUiLCAiYWRkUGxhbnRzIiwgIm1vZGVyblN0YWdpbmciLCAidHJhbnNpdGlvbmFsU3RhZ2luZyIsICJtaW5pbWFsaXN0U3RhZ2luZyIsICJ3YXJtTWluaW1hbGlzdFN0YWdpbmciLCAibWlkQ2VudHVyeU1vZGVyblN0YWdpbmciLCAiYXJ0RGVjb1N0YWdpbmciLCAiYmlvcGhpbGljU3RhZ2luZyIsICJsdXh1cnlTdGFnaW5nIl0sCiAgICBhcmNoaXRlY3R1cmU6IFsiaW1wcm92ZUV4dGVyaW9yIiwgIm1vZGVybml6ZUV4dGVyaW9yIiwgImltcHJvdmVFbnRyeXdheSIsICJpbXByb3ZlU2tpZXMiLCAiaW1wcm92ZVdlYXRoZXIiLCAiZml4V2FsbHMiLCAiYWRkT3V0ZG9vckxpdmluZyIsICJ2aW50YWdlRXh0ZXJpb3IiLCAibW9kZXJuaXplIiwgImFkZEN1cmJBcHBlYWwiLCAicmVtb3ZlUmVmbGVjdGlvbnMiXSwKICAgIGxhbmRzY2FwaW5nOiBbImNsZWFuTGFuZHNjYXBpbmciLCAiYWRkTGFuZHNjYXBpbmciLCAiYWRkQ3VyYkFwcGVhbCIsICJhZGRPdXRkb29yTGl2aW5nIiwgImFkZFBsYW50cyIsICJhZGRQb29sQXJlYSIsICJpbXByb3ZlV2VhdGhlciIsICJjaGFuZ2VTZWFzb24iLCAiaW1wcm92ZVNraWVzIiwgImJpb3BoaWxpY1N0YWdpbmciXSwKICAgIGZ1cm5pc2hpbmc6IFsicmVtb3ZlQWxsRnVybml0dXJlIiwgInJlbW92ZUZ1cm5pdHVyZUFuZENsdXR0ZXIiLCAibW9kZXJuU3RhZ2luZyIsICJ0cmFuc2l0aW9uYWxTdGFnaW5nIiwgIm1pbmltYWxpc3RTdGFnaW5nIiwgIndhcm1NaW5pbWFsaXN0U3RhZ2luZyIsICJtaWRDZW50dXJ5TW9kZXJuU3RhZ2luZyIsICJhcnREZWNvU3RhZ2luZyIsICJiaW9waGlsaWNTdGFnaW5nIiwgImx1eHVyeVN0YWdpbmciLCAiYWRkUGxhbnRzIl0sCiAgICBjb25zdHJ1Y3Rpb246IFsiZml4V2FsbHMiLCAibmV1dHJhbFBhaW50IiwgImltcHJvdmVFeHRlcmlvciIsICJtb2Rlcm5pemVFeHRlcmlvciIsICJyZW1vdmVDbHV0dGVyIiwgImltcHJvdmVMaWdodGluZyIsICJhZGRPdXRkb29yTGl2aW5nIiwgImltcHJvdmVFbnRyeXdheSJdLAogICAgaG9tZU93bmVyOiBbInJlbW92ZUNsdXR0ZXIiLCAicmVtb3ZlRnVybml0dXJlQW5kQ2x1dHRlciIsICJpbXByb3ZlTGlnaHRpbmciLCAiaW1wcm92ZVdlYXRoZXIiLCAiY2xlYW5MYW5kc2NhcGluZyIsICJhZGRMYW5kc2NhcGluZyIsICJhZGRDdXJiQXBwZWFsIiwgIm5ldXRyYWxQYWludCIsICJhZGRQbGFudHMiLCAiY2hhbmdlU2Vhc29uIiwgImFkZFBvb2xBcmVhIiwgImltcHJvdmVFbnRyeXdheSIsICJtb2Rlcm5pemUiXQogIH07CgogIGZ1bmN0aW9uIHN3aXp6bGVzKCkgeyByZXR1cm4gKFYuZGF0YSAmJiBBcnJheS5pc0FycmF5KFYuZGF0YS5zd2l6emxlcykpID8gVi5kYXRhLnN3aXp6bGVzIDogW107IH0KCiAgZnVuY3Rpb24gaXNSZWxldmFudChzd2l6emxlS2V5LCBzZWxlY3RlZEluZHVzdHJpZXMpIHsKICAgIGlmICghc2VsZWN0ZWRJbmR1c3RyaWVzIHx8ICFzZWxlY3RlZEluZHVzdHJpZXMubGVuZ3RoKSByZXR1cm4gdHJ1ZTsKICAgIHZhciBtYXBwZWRBdEFsbCA9IGZhbHNlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZEluZHVzdHJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGxpc3QgPSBJTkRVU1RSWV9SRUxFVkFOQ0Vbc2VsZWN0ZWRJbmR1c3RyaWVzW2ldXTsKICAgICAgaWYgKCFsaXN0KSBjb250aW51ZTsKICAgICAgbWFwcGVkQXRBbGwgPSB0cnVlOwogICAgICBpZiAobGlzdC5pbmRleE9mKHN3aXp6bGVLZXkpICE9PSAtMSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gIW1hcHBlZEF0QWxsOwogIH0KCiAgZnVuY3Rpb24gcmVsZXZhbnRTd2l6emxlcygpIHsKICAgIHZhciBzZWwgPSAoVi5zdGF0ZSAmJiBBcnJheS5pc0FycmF5KFYuc3RhdGUuaW5kdXN0cmllcykpID8gVi5zdGF0ZS5pbmR1c3RyaWVzIDogW107CiAgICB2YXIgbGlzdCA9IHN3aXp6bGVzKCkuZmlsdGVyKGZ1bmN0aW9uIChzKSB7IHJldHVybiBpc1JlbGV2YW50KHMua2V5LCBzZWwpOyB9KTsKICAgIHJldHVybiBsaXN0Lmxlbmd0aCA/IGxpc3QgOiBzd2l6emxlcygpOwogIH0KCiAgdmFyIF9sb2FkaW5nID0gZmFsc2UsIF9sb2FkZWQgPSBmYWxzZSwgX2xvYWRQcm9taXNlID0gbnVsbDsKCiAgZnVuY3Rpb24gbG9hZChmb3JjZSkgewogICAgaWYgKF9sb2FkaW5nKSByZXR1cm4gX2xvYWRQcm9taXNlOwogICAgaWYgKF9sb2FkZWQgJiYgIWZvcmNlKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFYuc3RhdGUuY3VzdG9tUHJlc2V0cyk7CiAgICBpZiAoIWFwaSgpLnByZXNldHMpIHsgcmVzdG9yZSgpOyBfbG9hZGVkID0gdHJ1ZTsgcmV0dXJuIFByb21pc2UucmVzb2x2ZShWLnN0YXRlLmN1c3RvbVByZXNldHMpOyB9CiAgICBfbG9hZGluZyA9IHRydWU7CiAgICB2YXIgY2xpZW50TW9kZWxzID0ge307CiAgICBWLnN0YXRlLmN1c3RvbVByZXNldHMuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAocC5tb2RlbCkgY2xpZW50TW9kZWxzW3AuaWRdID0gcC5tb2RlbDsgfSk7CiAgICBfbG9hZFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoYXBpKCkucHJlc2V0cygpKS50aGVuKGZ1bmN0aW9uIChyb3dzKSB7CiAgICAgIHZhciBhcnIgPSAoQXJyYXkuaXNBcnJheShyb3dzKSA/IHJvd3MgOiBbXSkubWFwKGZ1bmN0aW9uIChyKSB7CiAgICAgICAgdmFyIG4gPSBub3JtYWxpemVQcmVzZXQocik7CiAgICAgICAgaWYgKCFuLm1vZGVsICYmIGNsaWVudE1vZGVsc1tuLmlkXSkgbi5tb2RlbCA9IGNsaWVudE1vZGVsc1tuLmlkXTsKICAgICAgICByZXR1cm4gbjsKICAgICAgfSk7CiAgICAgIFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IGFycjsKICAgICAgcGVyc2lzdCgpOwogICAgICBfbG9hZGVkID0gdHJ1ZTsKICAgICAgZW1pdENoYW5nZWQoKTsKICAgICAgcmV0dXJuIGFycjsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgcmVzdG9yZSgpOwogICAgICBfbG9hZGVkID0gdHJ1ZTsKICAgICAgcmV0dXJuIFYuc3RhdGUuY3VzdG9tUHJlc2V0czsKICAgIH0pLnRoZW4oZnVuY3Rpb24gKHIpIHsgX2xvYWRpbmcgPSBmYWxzZTsgcmV0dXJuIHI7IH0pOwogICAgcmV0dXJuIF9sb2FkUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZShkYXRhKSB7CiAgICB2YXIgbG9jYWwgPSBub3JtYWxpemVQcmVzZXQoZGF0YSk7CiAgICB2YXIgYm9keSA9IHdpcmVCb2R5KGxvY2FsKTsKICAgIFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5jb25jYXQoW2xvY2FsXSk7CiAgICBwZXJzaXN0KCk7CiAgICBlbWl0Q2hhbmdlZCgpOwogICAgaWYgKCFhcGkoKS5jcmVhdGVQcmVzZXQpIHJldHVybiBQcm9taXNlLnJlc29sdmUobG9jYWwpOwogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkoKS5jcmVhdGVQcmVzZXQoYm9keSkpLnRoZW4oZnVuY3Rpb24gKHJvdykgewogICAgICB2YXIgc2VydmVyID0gbm9ybWFsaXplUHJlc2V0KHJvdyB8fCB7fSk7CiAgICAgIHZhciBpZHggPSBWLnN0YXRlLmN1c3RvbVByZXNldHMuaW5kZXhPZihsb2NhbCk7CiAgICAgIHNlcnZlci5tb2RlbCA9IGxvY2FsLm1vZGVsIHx8IHNlcnZlci5tb2RlbDsKICAgICAgaWYgKGlkeCAhPT0gLTEpIFYuc3RhdGUuY3VzdG9tUHJlc2V0c1tpZHhdID0gc2VydmVyOyBlbHNlIFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5wdXNoKHNlcnZlcik7CiAgICAgIHBlcnNpc3QoKTsgZW1pdENoYW5nZWQoKTsKICAgICAgcmV0dXJuIHNlcnZlcjsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgcm9sbGJhY2tSZW1vdmUobG9jYWwuaWQpOwogICAgICB0b2FzdCgiQ291bGRuJ3Qgc2F2ZSBwcmVzZXQuICIgKyBlcnJNc2coZXJyKSwgImVycm9yIik7CiAgICAgIHRocm93IGVycjsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlKGlkLCBkYXRhKSB7CiAgICB2YXIgaWR4ID0gaW5kZXhPZihpZCk7CiAgICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGNyZWF0ZShkYXRhKTsKICAgIHZhciBwcmV2ID0gVi5zdGF0ZS5jdXN0b21QcmVzZXRzW2lkeF07CiAgICB2YXIgbmV4dCA9IG5vcm1hbGl6ZVByZXNldChPYmplY3QuYXNzaWduKHt9LCBwcmV2LCBkYXRhLCB7IGlkOiBpZCwgdXBkYXRlZEF0OiBub3dJU08oKSB9KSk7CiAgICBWLnN0YXRlLmN1c3RvbVByZXNldHNbaWR4XSA9IG5leHQ7CiAgICBwZXJzaXN0KCk7IGVtaXRDaGFuZ2VkKCk7CiAgICBpZiAoIWFwaSgpLnVwZGF0ZVByZXNldCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0KTsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYXBpKCkudXBkYXRlUHJlc2V0KGlkLCB3aXJlQm9keShuZXh0KSkpLnRoZW4oZnVuY3Rpb24gKHJvdykgewogICAgICB2YXIgc2VydmVyID0gbm9ybWFsaXplUHJlc2V0KHJvdyB8fCBuZXh0KTsKICAgICAgc2VydmVyLm1vZGVsID0gbmV4dC5tb2RlbCB8fCBzZXJ2ZXIubW9kZWw7CiAgICAgIHZhciBpID0gaW5kZXhPZihpZCk7IGlmIChpICE9PSAtMSkgVi5zdGF0ZS5jdXN0b21QcmVzZXRzW2ldID0gc2VydmVyOwogICAgICBwZXJzaXN0KCk7IGVtaXRDaGFuZ2VkKCk7CiAgICAgIHJldHVybiBzZXJ2ZXI7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIHZhciBpID0gaW5kZXhPZihpZCk7IGlmIChpICE9PSAtMSkgVi5zdGF0ZS5jdXN0b21QcmVzZXRzW2ldID0gcHJldjsKICAgICAgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOwogICAgICB0b2FzdCgiQ291bGRuJ3QgdXBkYXRlIHByZXNldC4gIiArIGVyck1zZyhlcnIpLCAiZXJyb3IiKTsKICAgICAgdGhyb3cgZXJyOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZW1vdmUoaWQpIHsKICAgIHZhciBpZHggPSBpbmRleE9mKGlkKTsKICAgIGlmIChpZHggPT09IC0xKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB2YXIgcHJldiA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0c1tpZHhdOwogICAgVi5zdGF0ZS5jdXN0b21QcmVzZXRzID0gVi5zdGF0ZS5jdXN0b21QcmVzZXRzLmZpbHRlcihmdW5jdGlvbiAocCkgeyByZXR1cm4gcC5pZCAhPT0gaWQ7IH0pOwogICAgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOwogICAgaWYgKCFhcGkoKS5kZWxldGVQcmVzZXQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYXBpKCkuZGVsZXRlUHJlc2V0KGlkKSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICB2YXIgYXJyID0gVi5zdGF0ZS5jdXN0b21QcmVzZXRzLnNsaWNlKCk7CiAgICAgIGFyci5zcGxpY2UoTWF0aC5taW4oaWR4LCBhcnIubGVuZ3RoKSwgMCwgcHJldik7CiAgICAgIFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IGFycjsKICAgICAgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOwogICAgICB0b2FzdCgiQ291bGRuJ3QgZGVsZXRlIHByZXNldC4gIiArIGVyck1zZyhlcnIpLCAiZXJyb3IiKTsKICAgICAgdGhyb3cgZXJyOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZW9yZGVyKG9yZGVyZWRJZHMpIHsKICAgIHZhciBieUlkID0ge307IFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7IGJ5SWRbcC5pZF0gPSBwOyB9KTsKICAgIHZhciBwcmV2ID0gVi5zdGF0ZS5jdXN0b21QcmVzZXRzLnNsaWNlKCk7CiAgICB2YXIgbmV4dCA9IG9yZGVyZWRJZHMubWFwKGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gYnlJZFtpZF07IH0pLmZpbHRlcihCb29sZWFuKTsKICAgIHByZXYuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAob3JkZXJlZElkcy5pbmRleE9mKHAuaWQpID09PSAtMSkgbmV4dC5wdXNoKHApOyB9KTsKICAgIFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IG5leHQ7IHBlcnNpc3QoKTsgZW1pdENoYW5nZWQoKTsKICAgIGlmICghYXBpKCkucmVvcmRlclByZXNldHMpIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV4dCk7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaSgpLnJlb3JkZXJQcmVzZXRzKG5leHQubWFwKGZ1bmN0aW9uIChwKSB7IHJldHVybiBwLmlkOyB9KSkpLnRoZW4oZnVuY3Rpb24gKHJvd3MpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocm93cykgJiYgcm93cy5sZW5ndGgpIHsKICAgICAgICB2YXIgbW9kZWxzID0ge307IHByZXYuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAocC5tb2RlbCkgbW9kZWxzW3AuaWRdID0gcC5tb2RlbDsgfSk7CiAgICAgICAgVi5zdGF0ZS5jdXN0b21QcmVzZXRzID0gcm93cy5tYXAoZnVuY3Rpb24gKHIpIHsgdmFyIG4gPSBub3JtYWxpemVQcmVzZXQocik7IGlmICghbi5tb2RlbCAmJiBtb2RlbHNbbi5pZF0pIG4ubW9kZWwgPSBtb2RlbHNbbi5pZF07IHJldHVybiBuOyB9KTsKICAgICAgICBwZXJzaXN0KCk7IGVtaXRDaGFuZ2VkKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIFYuc3RhdGUuY3VzdG9tUHJlc2V0czsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgVi5zdGF0ZS5jdXN0b21QcmVzZXRzID0gcHJldjsgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOyByZXR1cm4gcHJldjsgfSk7CiAgfQoKICBmdW5jdGlvbiBpbmRleE9mKGlkKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgVi5zdGF0ZS5jdXN0b21QcmVzZXRzLmxlbmd0aDsgaSsrKSBpZiAoVi5zdGF0ZS5jdXN0b21QcmVzZXRzW2ldLmlkID09PSBpZCkgcmV0dXJuIGk7IHJldHVybiAtMTsgfQogIGZ1bmN0aW9uIHJvbGxiYWNrUmVtb3ZlKGlkKSB7IFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5maWx0ZXIoZnVuY3Rpb24gKHApIHsgcmV0dXJuIHAuaWQgIT09IGlkOyB9KTsgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOyB9CiAgZnVuY3Rpb24gZW1pdENoYW5nZWQoKSB7IGlmIChzdG9yZSgpLmVtaXQpIHN0b3JlKCkuZW1pdCgicHJlc2V0czpjaGFuZ2VkIiwgVi5zdGF0ZS5jdXN0b21QcmVzZXRzKTsgfQogIGZ1bmN0aW9uIHdpcmVCb2R5KHApIHsgcmV0dXJuIHsgaWQ6IHAuaWQsIG5hbWU6IHAubmFtZSwgcHJvbXB0OiBwLnByb21wdCwgbmVnYXRpdmVQcm9tcHQ6IHAubmVnYXRpdmVQcm9tcHQgfHwgbnVsbCB9OyB9CiAgZnVuY3Rpb24gZXJyTXNnKGVycikgeyByZXR1cm4gKGVyciAmJiBlcnIubWVzc2FnZSkgPyBlcnIubWVzc2FnZSA6ICJQbGVhc2UgdHJ5IGFnYWluLiI7IH0KCiAgZnVuY3Rpb24gcmVuZGVyQ2hpcHMoY29udGFpbmVyLCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIGlmICh0eXBlb2YgY29udGFpbmVyID09PSAic3RyaW5nIikgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250YWluZXIpOwogICAgaWYgKCFjb250YWluZXIpIHJldHVybiB7IHJlZnJlc2g6IGZ1bmN0aW9uICgpIHt9LCBzZXRBY3RpdmU6IGZ1bmN0aW9uICgpIHt9LCBjbGVhckFjdGl2ZTogZnVuY3Rpb24gKCkge30sIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHt9IH07CgogICAgdmFyIG9uUGljayA9IHR5cGVvZiBvcHRzLm9uUGljayA9PT0gImZ1bmN0aW9uIiA/IG9wdHMub25QaWNrCiAgICAgIDogKHR5cGVvZiBvcHRzLm9uU2VsZWN0ID09PSAiZnVuY3Rpb24iID8gb3B0cy5vblNlbGVjdCA6IGZ1bmN0aW9uICgpIHt9KTsKICAgIHZhciBvbkluZHVzdHJpZXMgPSB0eXBlb2Ygb3B0cy5vbkluZHVzdHJpZXMgPT09ICJmdW5jdGlvbiIgPyBvcHRzLm9uSW5kdXN0cmllcyA6IG51bGw7CiAgICB2YXIgYWN0aXZlSWQgPSBvcHRzLnNlbGVjdGVkSWQgfHwgbnVsbDsKICAgIHZhciBhY3RpdmVLZXkgPSBvcHRzLnNlbGVjdGVkS2V5IHx8IG51bGw7CgogICAgdmFyIHNjcm9sbGVyID0gZWwoImRpdiIsIHsgImNsYXNzIjogInYtY2hpcC1yb3ciLCByb2xlOiAibGlzdGJveCIsICJhcmlhLWxhYmVsIjogIlN0eWxlIHByZXNldHMiLCB0YWJpbmRleDogIi0xIiB9KTsKICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoImFyaWEtYnVzeSIsICJmYWxzZSIpOwogICAgY29udGFpbmVyLmlubmVySFRNTCA9ICIiOwogICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHNjcm9sbGVyKTsKCiAgICBmdW5jdGlvbiBwaWNrQ3VzdG9tKHApIHsKICAgICAgYWN0aXZlSWQgPSBwLmlkOyBhY3RpdmVLZXkgPSBudWxsOyBtYXJrQWN0aXZlKCk7CiAgICAgIG9uUGljayh7IHNvdXJjZTogImN1c3RvbSIsIGlkOiBwLmlkLCBuYW1lOiBwLm5hbWUsIHByb21wdDogcC5wcm9tcHQsIG5lZ2F0aXZlUHJvbXB0OiBwLm5lZ2F0aXZlUHJvbXB0IHx8IG51bGwsIG1vZGVsOiBwLm1vZGVsIHx8IG51bGwgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBwaWNrU3dpenpsZShzKSB7CiAgICAgIGFjdGl2ZUtleSA9IHMua2V5OyBhY3RpdmVJZCA9IG51bGw7IG1hcmtBY3RpdmUoKTsKICAgICAgb25QaWNrKHsgc291cmNlOiAic3dpenpsZSIsIGlkOiBzLmtleSwga2V5OiBzLmtleSwgbmFtZTogcy5sYWJlbCwgcHJvbXB0OiBzLnByb21wdCwgbmVnYXRpdmVQcm9tcHQ6IG51bGwsIG1vZGVsOiBudWxsIH0pOwogICAgfQogICAgZnVuY3Rpb24gbWFya0FjdGl2ZSgpIHsKICAgICAgdmFyIG5vZGVzID0gc2Nyb2xsZXIucXVlcnlTZWxlY3RvckFsbCgiLnYtY2hpcCIpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIG4gPSBub2Rlc1tpXTsKICAgICAgICB2YXIgb24gPSAobi5kYXRhc2V0LnByZXNldElkICYmIG4uZGF0YXNldC5wcmVzZXRJZCA9PT0gYWN0aXZlSWQpIHx8CiAgICAgICAgICAgICAgICAgKG4uZGF0YXNldC5zd2l6emxlS2V5ICYmIG4uZGF0YXNldC5zd2l6emxlS2V5ID09PSBhY3RpdmVLZXkpOwogICAgICAgIG4uY2xhc3NMaXN0LnRvZ2dsZSgidi1jaGlwLS1hY3RpdmUiLCAhIW9uKTsKICAgICAgICBuLnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsIG9uID8gInRydWUiIDogImZhbHNlIik7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjaGlwKGxhYmVsLCBhdHRycywgb25DbGljaywgb25Db250ZXh0KSB7CiAgICAgIHZhciBjID0gZWwoImJ1dHRvbiIsIE9iamVjdC5hc3NpZ24oewogICAgICAgIHR5cGU6ICJidXR0b24iLCAiY2xhc3MiOiAidi1jaGlwIiwgcm9sZTogIm9wdGlvbiIsICJhcmlhLXNlbGVjdGVkIjogImZhbHNlIgogICAgICB9LCBhdHRycyB8fCB7fSksIGxhYmVsKTsKICAgICAgYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgb25DbGljayhjKTsgfSk7CiAgICAgIGlmIChvbkNvbnRleHQpIGMuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IG9uQ29udGV4dChjLCBlKTsgfSk7CiAgICAgIHJldHVybiBjOwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkKCkgewogICAgICBzY3JvbGxlci5pbm5lckhUTUwgPSAiIjsKCiAgICAgIHZhciBhZGRDaGlwID0gY2hpcCgKICAgICAgICBbZWwoInNwYW4iLCB7ICJjbGFzcyI6ICJ2LWNoaXBfX2ljb24iLCAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIsIGh0bWw6IGljb24oInBsdXMiKSB8fCAiKyIgfSldLAogICAgICAgIHsgImNsYXNzIjogInYtY2hpcCB2LWNoaXAtLWFkZCIsIHRpdGxlOiAiTmV3IGN1c3RvbSBwcmVzZXQiLCAiYXJpYS1sYWJlbCI6ICJDcmVhdGUgY3VzdG9tIHByZXNldCIgfSwKICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBvcGVuRWRpdG9yKG51bGwsIHsgb25TYXZlZDogZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgYnVpbGQoKTsKICAgICAgICAgICAgaWYgKHAgJiYgcC5pZCkgewogICAgICAgICAgICAgIGFjdGl2ZUlkID0gcC5pZDsgYWN0aXZlS2V5ID0gbnVsbDsgbWFya0FjdGl2ZSgpOwogICAgICAgICAgICAgIHZhciBub2RlID0gc2Nyb2xsZXIucXVlcnlTZWxlY3RvcignW2RhdGEtcHJlc2V0LWlkPSInICsgcC5pZCArICciXScpOwogICAgICAgICAgICAgIGlmIChub2RlKSBub2RlLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICJuZWFyZXN0IiwgaW5saW5lOiAiY2VudGVyIiB9KTsKICAgICAgICAgICAgICBwaWNrQ3VzdG9tKHApOwogICAgICAgICAgICB9CiAgICAgICAgICB9IH0pOwogICAgICAgIH0KICAgICAgKTsKICAgICAgc2Nyb2xsZXIuYXBwZW5kQ2hpbGQoYWRkQ2hpcCk7CgogICAgICB2YXIgY3VzdG9tcyA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0cyB8fCBbXTsKICAgICAgY3VzdG9tcy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7CiAgICAgICAgdmFyIGMgPSBjaGlwKAogICAgICAgICAgW2VsKCJzcGFuIiwgeyAiY2xhc3MiOiAidi1jaGlwX19pY29uIiwgImFyaWEtaGlkZGVuIjogInRydWUiLCBodG1sOiBpY29uKCJib29rbWFyayIpIHx8ICIiIH0pLCBlbCgic3BhbiIsIHt9LCBwLm5hbWUgfHwgIlVudGl0bGVkIildLAogICAgICAgICAgeyAiY2xhc3MiOiAidi1jaGlwIHYtY2hpcC0tY3VzdG9tIiwgImRhdGEtcHJlc2V0LWlkIjogcC5pZCwgdGl0bGU6IHAucHJvbXB0IHx8IHAubmFtZSB9LAogICAgICAgICAgZnVuY3Rpb24gKCkgeyBwaWNrQ3VzdG9tKHApOyB9LAogICAgICAgICAgZnVuY3Rpb24gKG5vZGUsIGUpIHsgc2hvd1ByZXNldE1lbnUocCwgbm9kZSwgZSwgYnVpbGQpOyB9CiAgICAgICAgKTsKICAgICAgICBhdHRhY2hMb25nUHJlc3MoYywgZnVuY3Rpb24gKGV2KSB7IHNob3dQcmVzZXRNZW51KHAsIGMsIGV2LCBidWlsZCk7IH0pOwogICAgICAgIHNjcm9sbGVyLmFwcGVuZENoaWxkKGMpOwogICAgICB9KTsKCiAgICAgIHZhciBzd3ogPSByZWxldmFudFN3aXp6bGVzKCk7CiAgICAgIHN3ei5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7CiAgICAgICAgc2Nyb2xsZXIuYXBwZW5kQ2hpbGQoY2hpcChzLmxhYmVsLCB7ICJjbGFzcyI6ICJ2LWNoaXAgdi1jaGlwLS1zd2l6emxlIiwgImRhdGEtc3dpenpsZS1rZXkiOiBzLmtleSwgdGl0bGU6IHMucHJvbXB0IH0sIGZ1bmN0aW9uICgpIHsgcGlja1N3aXp6bGUocyk7IH0pKTsKICAgICAgfSk7CgogICAgICB2YXIgc2VsID0gKFYuc3RhdGUgJiYgQXJyYXkuaXNBcnJheShWLnN0YXRlLmluZHVzdHJpZXMpKSA/IFYuc3RhdGUuaW5kdXN0cmllcyA6IFtdOwogICAgICBpZiAob25JbmR1c3RyaWVzIHx8IChWLmRhdGEgJiYgVi5kYXRhLmluZHVzdHJpZXMpKSB7CiAgICAgICAgdmFyIGxhYmVsID0gc2VsLmxlbmd0aCA/ICJJbmR1c3RyaWVzIMK3ICIgKyBzZWwubGVuZ3RoIDogIkluZHVzdHJpZXMiOwogICAgICAgIHNjcm9sbGVyLmFwcGVuZENoaWxkKGNoaXAoCiAgICAgICAgICBbZWwoInNwYW4iLCB7ICJjbGFzcyI6ICJ2LWNoaXBfX2ljb24iLCAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIsIGh0bWw6IGljb24oImVsbGlwc2lzIikgfHwgIiIgfSksIGVsKCJzcGFuIiwge30sIGxhYmVsKV0sCiAgICAgICAgICB7ICJjbGFzcyI6ICJ2LWNoaXAgdi1jaGlwLS1tb3JlIiwgdGl0bGU6ICJGaWx0ZXIgcHJlc2V0cyBieSBpbmR1c3RyeSIgfSwKICAgICAgICAgIGZ1bmN0aW9uICgpIHsgaWYgKG9uSW5kdXN0cmllcykgb25JbmR1c3RyaWVzKCk7IGVsc2Ugb3BlbkluZHVzdHJpZXNQaWNrZXIoZnVuY3Rpb24gKCkgeyBidWlsZCgpOyB9KTsgfQogICAgICAgICkpOwogICAgICB9CgogICAgICBtYXJrQWN0aXZlKCk7CiAgICB9CgogICAgc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChlLmtleSAhPT0gIkFycm93UmlnaHQiICYmIGUua2V5ICE9PSAiQXJyb3dMZWZ0IikgcmV0dXJuOwogICAgICB2YXIgY2hpcHMgPSBbXS5zbGljZS5jYWxsKHNjcm9sbGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIi52LWNoaXAiKSk7CiAgICAgIHZhciBpID0gY2hpcHMuaW5kZXhPZihkb2N1bWVudC5hY3RpdmVFbGVtZW50KTsKICAgICAgaWYgKGkgPT09IC0xKSByZXR1cm47CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgdmFyIG5leHQgPSBlLmtleSA9PT0gIkFycm93UmlnaHQiID8gTWF0aC5taW4oY2hpcHMubGVuZ3RoIC0gMSwgaSArIDEpIDogTWF0aC5tYXgoMCwgaSAtIDEpOwogICAgICBjaGlwc1tuZXh0XS5mb2N1cygpOwogICAgfSk7CgogICAgYnVpbGQoKTsKICAgIHZhciBvZmYxID0gc3RvcmUoKS5vbiA/IHN0b3JlKCkub24oInByZXNldHM6Y2hhbmdlZCIsIGJ1aWxkKSA6IG51bGw7CiAgICB2YXIgb2ZmMiA9IHN0b3JlKCkub24gPyBzdG9yZSgpLm9uKCJpbmR1c3RyaWVzOmNoYW5nZWQiLCBidWlsZCkgOiBudWxsOwoKICAgIGxvYWQoKS50aGVuKGZ1bmN0aW9uICgpIHsgYnVpbGQoKTsgfSk7CgogICAgcmV0dXJuIHsKICAgICAgcmVmcmVzaDogYnVpbGQsCiAgICAgIHNldEFjdGl2ZTogZnVuY3Rpb24gKHNlbCkgewogICAgICAgIGlmIChzZWwgJiYgc2VsLmlkKSB7IGFjdGl2ZUlkID0gc2VsLmlkOyBhY3RpdmVLZXkgPSBudWxsOyB9CiAgICAgICAgZWxzZSBpZiAoc2VsICYmIHNlbC5rZXkpIHsgYWN0aXZlS2V5ID0gc2VsLmtleTsgYWN0aXZlSWQgPSBudWxsOyB9CiAgICAgICAgZWxzZSB7IGFjdGl2ZUlkID0gbnVsbDsgYWN0aXZlS2V5ID0gbnVsbDsgfQogICAgICAgIG1hcmtBY3RpdmUoKTsKICAgICAgfSwKICAgICAgY2xlYXJBY3RpdmU6IGZ1bmN0aW9uICgpIHsgYWN0aXZlSWQgPSBudWxsOyBhY3RpdmVLZXkgPSBudWxsOyBtYXJrQWN0aXZlKCk7IH0sCiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHsgaWYgKG9mZjEpIG9mZjEoKTsgaWYgKG9mZjIpIG9mZjIoKTsgY29udGFpbmVyLmlubmVySFRNTCA9ICIiOyB9CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gYXR0YWNoTG9uZ1ByZXNzKG5vZGUsIGNiKSB7CiAgICB2YXIgdGltZXIgPSBudWxsLCBtb3ZlZCA9IGZhbHNlLCBzeCA9IDAsIHN5ID0gMDsKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIG1vdmVkID0gZmFsc2U7IHZhciB0ID0gZS50b3VjaGVzWzBdOyBzeCA9IHQuY2xpZW50WDsgc3kgPSB0LmNsaWVudFk7CiAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGlmICghbW92ZWQpIGNiKGUpOyB9LCA0ODApOwogICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLCBmdW5jdGlvbiAoZSkgewogICAgICB2YXIgdCA9IGUudG91Y2hlc1swXTsKICAgICAgaWYgKE1hdGguYWJzKHQuY2xpZW50WCAtIHN4KSA+IDEwIHx8IE1hdGguYWJzKHQuY2xpZW50WSAtIHN5KSA+IDEwKSB7IG1vdmVkID0gdHJ1ZTsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgfQogICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIGZ1bmN0aW9uICgpIHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgfSk7CiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoY2FuY2VsIiwgZnVuY3Rpb24gKCkgeyBjbGVhclRpbWVvdXQodGltZXIpOyB9KTsKICB9CgogIGZ1bmN0aW9uIHNob3dQcmVzZXRNZW51KHByZXNldCwgYW5jaG9yLCBldnQsIG9uQ2hhbmdlZCkgewogICAgdmFyIG1lbnUgPSBlbCgiZGl2IiwgeyAiY2xhc3MiOiAiZ2xhc3MtY2FyZCB2LWNoaXAtbWVudSIsIHJvbGU6ICJtZW51IiB9KTsKICAgIHZhciBlZGl0QnRuID0gZWwoImJ1dHRvbiIsIHsgdHlwZTogImJ1dHRvbiIsICJjbGFzcyI6ICJ2LWNoaXAtbWVudV9faXRlbSIsIHJvbGU6ICJtZW51aXRlbSIgfSwgW2VsKCJzcGFuIiwgeyAiY2xhc3MiOiAidi1jaGlwX19pY29uIiwgaHRtbDogaWNvbigiZWRpdCIpIHx8ICIiIH0pLCAiRWRpdCJdKTsKICAgIHZhciBkZWxCdG4gPSBlbCgiYnV0dG9uIiwgeyB0eXBlOiAiYnV0dG9uIiwgImNsYXNzIjogInYtY2hpcC1tZW51X19pdGVtIHYtY2hpcC1tZW51X19pdGVtLS1kYW5nZXIiLCByb2xlOiAibWVudWl0ZW0iIH0sIFtlbCgic3BhbiIsIHsgImNsYXNzIjogInYtY2hpcF9faWNvbiIsIGh0bWw6IGljb24oInRyYXNoIikgfHwgIiIgfSksICJEZWxldGUiXSk7CiAgICBtZW51LmFwcGVuZENoaWxkKGVkaXRCdG4pOyBtZW51LmFwcGVuZENoaWxkKGRlbEJ0bik7CgogICAgdmFyIGJhY2tkcm9wID0gZWwoImRpdiIsIHsgImNsYXNzIjogInYtY2hpcC1tZW51X19iYWNrZHJvcCIgfSk7CiAgICBmdW5jdGlvbiBjbG9zZSgpIHsgaWYgKG1lbnUucGFyZW50Tm9kZSkgbWVudS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG1lbnUpOyBpZiAoYmFja2Ryb3AucGFyZW50Tm9kZSkgYmFja2Ryb3AucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiYWNrZHJvcCk7IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBvbktleSwgdHJ1ZSk7IH0KICAgIGZ1bmN0aW9uIG9uS2V5KGUpIHsgaWYgKGUua2V5ID09PSAiRXNjYXBlIikgY2xvc2UoKTsgfQogICAgYmFja2Ryb3AuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBjbG9zZSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgb25LZXksIHRydWUpOwoKICAgIGVkaXRCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IGNsb3NlKCk7IG9wZW5FZGl0b3IocHJlc2V0LCB7IG9uU2F2ZWQ6IGZ1bmN0aW9uICgpIHsgaWYgKG9uQ2hhbmdlZCkgb25DaGFuZ2VkKCk7IH0gfSk7IH0pOwogICAgZGVsQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgICBjbG9zZSgpOwogICAgICB2YXIgZG9EZWxldGUgPSBmdW5jdGlvbiAoKSB7IHJlbW92ZShwcmVzZXQuaWQpLnRoZW4oZnVuY3Rpb24gKCkgeyB0b2FzdCgiUHJlc2V0IGRlbGV0ZWQiLCAic3VjY2VzcyIpOyBpZiAob25DaGFuZ2VkKSBvbkNoYW5nZWQoKTsgfSkuY2F0Y2goZnVuY3Rpb24gKCkge30pOyB9OwogICAgICBpZiAodWkoKS5jb25maXJtKSB1aSgpLmNvbmZpcm0oJ0RlbGV0ZSBwcmVzZXQgIicgKyAocHJlc2V0Lm5hbWUgfHwgIlVudGl0bGVkIikgKyAnIj8nLCB7IGRlc3RydWN0aXZlOiB0cnVlLCBjb25maXJtTGFiZWw6ICJEZWxldGUiIH0pLnRoZW4oZnVuY3Rpb24gKG9rKSB7IGlmIChvaykgZG9EZWxldGUoKTsgfSk7CiAgICAgIGVsc2UgaWYgKHdpbmRvdy5jb25maXJtKCdEZWxldGUgcHJlc2V0ICInICsgKHByZXNldC5uYW1lIHx8ICJVbnRpdGxlZCIpICsgJyI/JykpIGRvRGVsZXRlKCk7CiAgICB9KTsKCiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJhY2tkcm9wKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobWVudSk7CiAgICBwb3NpdGlvbk1lbnUobWVudSwgYW5jaG9yLCBldnQpOwogICAgZWRpdEJ0bi5mb2N1cygpOwogIH0KCiAgZnVuY3Rpb24gcG9zaXRpb25NZW51KG1lbnUsIGFuY2hvciwgZXZ0KSB7CiAgICB2YXIgciA9IGFuY2hvciAmJiBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID8gYW5jaG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogeyBsZWZ0OiAoZXZ0ICYmIGV2dC5jbGllbnRYKSB8fCAwLCBib3R0b206IChldnQgJiYgZXZ0LmNsaWVudFkpIHx8IDAsIHRvcDogKGV2dCAmJiBldnQuY2xpZW50WSkgfHwgMCwgd2lkdGg6IDAgfTsKICAgIHZhciBtdyA9IG1lbnUub2Zmc2V0V2lkdGggfHwgMTY4LCBtaCA9IG1lbnUub2Zmc2V0SGVpZ2h0IHx8IDk2OwogICAgdmFyIGxlZnQgPSBNYXRoLm1pbih3aW5kb3cuaW5uZXJXaWR0aCAtIG13IC0gOCwgTWF0aC5tYXgoOCwgci5sZWZ0KSk7CiAgICB2YXIgdG9wID0gci5ib3R0b20gKyA2OwogICAgaWYgKHRvcCArIG1oID4gd2luZG93LmlubmVySGVpZ2h0IC0gOCkgdG9wID0gTWF0aC5tYXgoOCwgci50b3AgLSBtaCAtIDYpOwogICAgbWVudS5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7CiAgICBtZW51LnN0eWxlLmxlZnQgPSBsZWZ0ICsgInB4IjsKICAgIG1lbnUuc3R5bGUudG9wID0gdG9wICsgInB4IjsKICAgIG1lbnUuc3R5bGUuekluZGV4ID0gIjEwMDAxIjsKICB9CgogIGZ1bmN0aW9uIG9wZW5FZGl0b3IocHJlc2V0LCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBlZGl0aW5nID0gISEocHJlc2V0ICYmIHByZXNldC5pZCk7CiAgICB2YXIgaW5pdGlhbCA9IG5vcm1hbGl6ZVByZXNldChPYmplY3QuYXNzaWduKHt9LCBlZGl0aW5nID8gcHJlc2V0IDoge30sIG9wdHMucHJlZmlsbCB8fCB7fSwgZWRpdGluZyA/IHt9IDogeyBpZDogbnVsbCB9KSk7CiAgICBpZiAoIWVkaXRpbmcpIGluaXRpYWwuaWQgPSBudWxsOwoKICAgIHZhciBuYW1lSW5wdXQgPSBlbCgiaW5wdXQiLCB7CiAgICAgIHR5cGU6ICJ0ZXh0IiwgImNsYXNzIjogInYtZmllbGQiLCBtYXhsZW5ndGg6ICI2MCIsIHBsYWNlaG9sZGVyOiAiUHJlc2V0IG5hbWUgKGUuZy4gU2NhbmRpIFN0YWdpbmcpIiwKICAgICAgdmFsdWU6IGluaXRpYWwubmFtZSB8fCAiIiwgImFyaWEtbGFiZWwiOiAiUHJlc2V0IG5hbWUiLCBhdXRvY29tcGxldGU6ICJvZmYiCiAgICB9KTsKICAgIHZhciBwcm9tcHRJbnB1dCA9IGVsKCJ0ZXh0YXJlYSIsIHsKICAgICAgImNsYXNzIjogInYtdGV4dGFyZWEiLCByb3dzOiAiNSIsIHBsYWNlaG9sZGVyOiAiRGVzY3JpYmUgdGhlIHRyYW5zZm9ybWF0aW9u4oCmIChtaW4gOCBjaGFyYWN0ZXJzKSIsCiAgICAgICJhcmlhLWxhYmVsIjogIlByb21wdCIKICAgIH0pOwogICAgcHJvbXB0SW5wdXQudmFsdWUgPSBpbml0aWFsLnByb21wdCB8fCAiIjsKICAgIHZhciBuZWdJbnB1dCA9IGVsKCJ0ZXh0YXJlYSIsIHsKICAgICAgImNsYXNzIjogInYtdGV4dGFyZWEiLCByb3dzOiAiMiIsIHBsYWNlaG9sZGVyOiAiTmVnYXRpdmUgcHJvbXB0IChvcHRpb25hbCkg4oCUIHdoYXQgdG8gYXZvaWQiLAogICAgICAiYXJpYS1sYWJlbCI6ICJOZWdhdGl2ZSBwcm9tcHQiCiAgICB9KTsKICAgIG5lZ0lucHV0LnZhbHVlID0gaW5pdGlhbC5uZWdhdGl2ZVByb21wdCB8fCAiIjsKCiAgICB2YXIgY291bnRlciA9IGVsKCJzcGFuIiwgeyAiY2xhc3MiOiAidi1sYWJlbCIgfSwgIiIpOwogICAgZnVuY3Rpb24gdXBkYXRlQ291bnQoKSB7CiAgICAgIHZhciBuID0gKHByb21wdElucHV0LnZhbHVlIHx8ICIiKS50cmltKCkubGVuZ3RoOwogICAgICBjb3VudGVyLnRleHRDb250ZW50ID0gbiArICIgY2hhciIgKyAobiA9PT0gMSA/ICIiIDogInMiKTsKICAgICAgY291bnRlci5zdHlsZS5jb2xvciA9IChuID4gMCAmJiBuIDwgOCkgPyAidmFyKC0tY29sb3Itd2FybmluZywgI0ZGRDYwQSkiIDogIiI7CiAgICB9CiAgICBwcm9tcHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIHVwZGF0ZUNvdW50KTsKICAgIHVwZGF0ZUNvdW50KCk7CgogICAgdmFyIGVyckJveCA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LWZvcm0tZXJyb3IiLCByb2xlOiAiYWxlcnQiLCAiYXJpYS1saXZlIjogInBvbGl0ZSIsIGhpZGRlbjogdHJ1ZSB9KTsKICAgIGZ1bmN0aW9uIHNob3dFcnIobSkgeyBlcnJCb3gudGV4dENvbnRlbnQgPSBtIHx8ICIiOyBlcnJCb3guaGlkZGVuID0gIW07IH0KCiAgICB2YXIgc2F2ZUJ0biA9IGVsKCJidXR0b24iLCB7IHR5cGU6ICJidXR0b24iLCAiY2xhc3MiOiAidi1jdGEgdi1jdGEtLXByaW1hcnkiIH0sIGVkaXRpbmcgPyAiU2F2ZSBDaGFuZ2VzIiA6ICJDcmVhdGUgUHJlc2V0Iik7CiAgICB2YXIgY2FuY2VsQnRuID0gZWwoImJ1dHRvbiIsIHsgdHlwZTogImJ1dHRvbiIsICJjbGFzcyI6ICJ2LWN0YSB2LWN0YS0tZ2hvc3QiIH0sICJDYW5jZWwiKTsKICAgIHZhciBkZWxCdG4gPSBlZGl0aW5nID8gZWwoImJ1dHRvbiIsIHsgdHlwZTogImJ1dHRvbiIsICJjbGFzcyI6ICJ2LWN0YSB2LWN0YS0tZGFuZ2VyIiB9LCAiRGVsZXRlIikgOiBudWxsOwoKICAgIHZhciBzcGlubmVyID0gdWkoKS5zcGlubmVyID8gdWkoKS5zcGlubmVyKDE4KSA6IGVsKCJzcGFuIiwgeyAiY2xhc3MiOiAidi1zcGlubmVyIiB9KTsKICAgIHNwaW5uZXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCiAgICB2YXIgYWN0aW9uc1JpZ2h0ID0gZWwoImRpdiIsIHsgImNsYXNzIjogInYtbW9kYWxfX2FjdGlvbnMiIH0sIFtzcGlubmVyLCBjYW5jZWxCdG4sIHNhdmVCdG5dKTsKICAgIHZhciBhY3Rpb25zID0gZWwoImRpdiIsIHsgImNsYXNzIjogInYtY3RhLXJvdyIgfSwgWwogICAgICBkZWxCdG4gfHwgZWwoInNwYW4iLCB7fSksCiAgICAgIGFjdGlvbnNSaWdodAogICAgXSk7CiAgICBhY3Rpb25zLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gInNwYWNlLWJldHdlZW4iOwogICAgYWN0aW9ucy5zdHlsZS5hbGlnbkl0ZW1zID0gImNlbnRlciI7CiAgICBhY3Rpb25zLnN0eWxlLmZsZXhXcmFwID0gIndyYXAiOwogICAgYWN0aW9ucy5zdHlsZS5nYXAgPSAidmFyKC0tc3BhY2UtbWQsIDE1cHgpIjsKCiAgICB2YXIgYm9keSA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LWZvcm0iIH0sIFsKICAgICAgZWwoImRpdiIsIHt9LCBbCiAgICAgICAgZWwoInAiLCB7ICJjbGFzcyI6ICJ2LWV5ZWJyb3ciIH0sIGVkaXRpbmcgPyAiRWRpdCBQcmVzZXQiIDogIk5ldyBQcmVzZXQiKSwKICAgICAgICBlbCgiaDIiLCB7ICJjbGFzcyI6ICJ2LW1vZGFsX190aXRsZSB2LWdyYWRpZW50IiB9LCBlZGl0aW5nID8gIlJlZmluZSB5b3VyIHN0eWxlIiA6ICJTYXZlIGEgY3VzdG9tIHN0eWxlIikKICAgICAgXSksCiAgICAgIGVsKCJsYWJlbCIsIHsgImNsYXNzIjogInYtZmllbGQtZ3JvdXAiIH0sIFtlbCgic3BhbiIsIHsgImNsYXNzIjogInYtbGFiZWwiIH0sICJOYW1lIiksIG5hbWVJbnB1dF0pLAogICAgICBlbCgibGFiZWwiLCB7ICJjbGFzcyI6ICJ2LWZpZWxkLWdyb3VwIiB9LCBbCiAgICAgICAgZWwoInNwYW4iLCB7ICJjbGFzcyI6ICJ2LWxhYmVsIiwgc3R5bGU6ICJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo5cHg7IiB9LCBbZWwoInNwYW4iLCB7fSwgIlByb21wdCIpLCBjb3VudGVyXSksCiAgICAgICAgcHJvbXB0SW5wdXQKICAgICAgXSksCiAgICAgIGVsKCJsYWJlbCIsIHsgImNsYXNzIjogInYtZmllbGQtZ3JvdXAiIH0sIFtlbCgic3BhbiIsIHsgImNsYXNzIjogInYtbGFiZWwiIH0sICJOZWdhdGl2ZSBwcm9tcHQiKSwgbmVnSW5wdXRdKSwKICAgICAgZXJyQm94LAogICAgICBhY3Rpb25zCiAgICBdKTsKICAgIGJvZHkuc3R5bGUuZGlzcGxheSA9ICJmbGV4IjsKICAgIGJvZHkuc3R5bGUuZmxleERpcmVjdGlvbiA9ICJjb2x1bW4iOwogICAgYm9keS5zdHlsZS5nYXAgPSAidmFyKC0tc3BhY2UtbWQsIDE1cHgpIjsKCiAgICB2YXIgbW9kYWxSZWYgPSBudWxsOwogICAgZnVuY3Rpb24gY2xvc2UoKSB7IGlmIChtb2RhbFJlZiAmJiBtb2RhbFJlZi5jbG9zZSkgbW9kYWxSZWYuY2xvc2UoKTsgfQoKICAgIGZ1bmN0aW9uIHNldEJ1c3koYikgewogICAgICBzcGlubmVyLnN0eWxlLmRpc3BsYXkgPSBiID8gIiIgOiAibm9uZSI7CiAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSBiOyBjYW5jZWxCdG4uZGlzYWJsZWQgPSBiOyBpZiAoZGVsQnRuKSBkZWxCdG4uZGlzYWJsZWQgPSBiOwogICAgICBzYXZlQnRuLmNsYXNzTGlzdC50b2dnbGUoImlzLWJ1c3kiLCBiKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkb1NhdmUoKSB7CiAgICAgIHZhciBuYW1lID0gKG5hbWVJbnB1dC52YWx1ZSB8fCAiIikudHJpbSgpOwogICAgICB2YXIgcHJvbXB0ID0gKHByb21wdElucHV0LnZhbHVlIHx8ICIiKS50cmltKCk7CiAgICAgIHZhciBuZWcgPSAobmVnSW5wdXQudmFsdWUgfHwgIiIpLnRyaW0oKTsKICAgICAgaWYgKCFuYW1lKSB7IHNob3dFcnIoIkdpdmUgeW91ciBwcmVzZXQgYSBuYW1lLiIpOyBuYW1lSW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIGlmIChwcm9tcHQubGVuZ3RoIDwgOCkgeyBzaG93RXJyKCJQcm9tcHQgbmVlZHMgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzLiIpOyBwcm9tcHRJbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgc2hvd0VycigiIik7CiAgICAgIHNldEJ1c3kodHJ1ZSk7CiAgICAgIHZhciBwYXlsb2FkID0geyBuYW1lOiBuYW1lLCBwcm9tcHQ6IHByb21wdCwgbmVnYXRpdmVQcm9tcHQ6IG5lZyB8fCBudWxsLCBtb2RlbDogaW5pdGlhbC5tb2RlbCB8fCBudWxsIH07CiAgICAgIHZhciBvcCA9IGVkaXRpbmcgPyB1cGRhdGUoaW5pdGlhbC5pZCwgcGF5bG9hZCkgOiBjcmVhdGUocGF5bG9hZCk7CiAgICAgIG9wLnRoZW4oZnVuY3Rpb24gKHNhdmVkKSB7CiAgICAgICAgc2V0QnVzeShmYWxzZSk7CiAgICAgICAgdG9hc3QoZWRpdGluZyA/ICJQcmVzZXQgdXBkYXRlZCIgOiAiUHJlc2V0IGNyZWF0ZWQiLCAic3VjY2VzcyIpOwogICAgICAgIGNsb3NlKCk7CiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uU2F2ZWQgPT09ICJmdW5jdGlvbiIpIG9wdHMub25TYXZlZChzYXZlZCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBzZXRCdXN5KGZhbHNlKTsKICAgICAgICBzaG93RXJyKCJDb3VsZG4ndCBzYXZlLiAiICsgZXJyTXNnKGVycikpOwogICAgICB9KTsKICAgIH0KCiAgICBzYXZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZG9TYXZlKTsKICAgIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGNsb3NlKTsKICAgIGlmIChkZWxCdG4pIGRlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHJ1biA9IGZ1bmN0aW9uICgpIHsgc2V0QnVzeSh0cnVlKTsgcmVtb3ZlKGluaXRpYWwuaWQpLnRoZW4oZnVuY3Rpb24gKCkgeyB0b2FzdCgiUHJlc2V0IGRlbGV0ZWQiLCAic3VjY2VzcyIpOyBjbG9zZSgpOyBpZiAodHlwZW9mIG9wdHMub25TYXZlZCA9PT0gImZ1bmN0aW9uIikgb3B0cy5vblNhdmVkKG51bGwpOyB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHNldEJ1c3koZmFsc2UpOyB9KTsgfTsKICAgICAgaWYgKHVpKCkuY29uZmlybSkgdWkoKS5jb25maXJtKCdEZWxldGUgIicgKyAoaW5pdGlhbC5uYW1lIHx8ICJ0aGlzIHByZXNldCIpICsgJyI/JywgeyBkZXN0cnVjdGl2ZTogdHJ1ZSwgY29uZmlybUxhYmVsOiAiRGVsZXRlIiB9KS50aGVuKGZ1bmN0aW9uIChvaykgeyBpZiAob2spIHJ1bigpOyB9KTsKICAgICAgZWxzZSBpZiAod2luZG93LmNvbmZpcm0oJ0RlbGV0ZSAiJyArIChpbml0aWFsLm5hbWUgfHwgInRoaXMgcHJlc2V0IikgKyAnIj8nKSkgcnVuKCk7CiAgICB9KTsKCiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpICYmIGUua2V5ID09PSAiRW50ZXIiKSB7IGUucHJldmVudERlZmF1bHQoKTsgZG9TYXZlKCk7IH0KICAgIH0pOwoKICAgIGlmICh1aSgpLm1vZGFsKSB7CiAgICAgIG1vZGFsUmVmID0gdWkoKS5tb2RhbChib2R5LCB7IGFyaWFMYWJlbDogZWRpdGluZyA/ICJFZGl0IHByZXNldCIgOiAiTmV3IHByZXNldCIsIG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHt9IH0pOwogICAgfSBlbHNlIHsKICAgICAgbW9kYWxSZWYgPSBmYWxsYmFja01vZGFsKGJvZHkpOwogICAgfQogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IChlZGl0aW5nID8gcHJvbXB0SW5wdXQgOiBuYW1lSW5wdXQpLmZvY3VzKCk7IH0sIDMwKTsKICAgIHJldHVybiBtb2RhbFJlZjsKICB9CgogIGZ1bmN0aW9uIGZhbGxiYWNrTW9kYWwobm9kZSkgewogICAgdmFyIG92ZXJsYXkgPSBlbCgiZGl2IiwgeyAiY2xhc3MiOiAidi1vdmVybGF5LXNjcmltIiwgcm9sZTogInByZXNlbnRhdGlvbiIgfSk7CiAgICB2YXIgc2hlZXQgPSBlbCgiZGl2IiwgeyAiY2xhc3MiOiAidi1tb2RhbCBnbGFzcy1jYXJkIiwgcm9sZTogImRpYWxvZyIsICJhcmlhLW1vZGFsIjogInRydWUiIH0sIG5vZGUpOwogICAgb3ZlcmxheS5hcHBlbmRDaGlsZChzaGVldCk7CiAgICBmdW5jdGlvbiBjbG9zZSgpIHsgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIG9uS2V5LCB0cnVlKTsgaWYgKG92ZXJsYXkucGFyZW50Tm9kZSkgb3ZlcmxheS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG92ZXJsYXkpOyB9CiAgICBmdW5jdGlvbiBvbktleShlKSB7IGlmIChlLmtleSA9PT0gIkVzY2FwZSIpIGNsb3NlKCk7IH0KICAgIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoZSkgeyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlKCk7IH0pOwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIG9uS2V5LCB0cnVlKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7CiAgICByZXR1cm4geyBjbG9zZTogY2xvc2UgfTsKICB9CgogIGZ1bmN0aW9uIG9wZW5JbmR1c3RyaWVzUGlja2VyKG9uRG9uZSkgewogICAgdmFyIGluZHMgPSAoVi5kYXRhICYmIEFycmF5LmlzQXJyYXkoVi5kYXRhLmluZHVzdHJpZXMpKSA/IFYuZGF0YS5pbmR1c3RyaWVzIDogW107CiAgICBpZiAoIWluZHMubGVuZ3RoKSB7IHRvYXN0KCJObyBpbmR1c3RyaWVzIGF2YWlsYWJsZSIpOyBpZiAob25Eb25lKSBvbkRvbmUoKTsgcmV0dXJuOyB9CiAgICB2YXIgc2VsZWN0ZWQgPSAoKFYuc3RhdGUgJiYgVi5zdGF0ZS5pbmR1c3RyaWVzKSB8fCBbXSkuc2xpY2UoKTsKCiAgICB2YXIgZ3JpZCA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LWNoaXAtcm93Iiwgcm9sZTogImdyb3VwIiwgImFyaWEtbGFiZWwiOiAiSW5kdXN0cmllcyIgfSk7CiAgICBncmlkLnN0eWxlLmZsZXhXcmFwID0gIndyYXAiOwogICAgZ3JpZC5zdHlsZS5vdmVyZmxvd1ggPSAidmlzaWJsZSI7CiAgICBpbmRzLmZvckVhY2goZnVuY3Rpb24gKGluZCkgewogICAgICB2YXIgb24gPSBzZWxlY3RlZC5pbmRleE9mKGluZC5rZXkpICE9PSAtMTsKICAgICAgdmFyIGIgPSBlbCgiYnV0dG9uIiwgeyB0eXBlOiAiYnV0dG9uIiwgImNsYXNzIjogInYtY2hpcCIgKyAob24gPyAiIHYtY2hpcC0tYWN0aXZlIiA6ICIiKSwgImRhdGEta2V5IjogaW5kLmtleSwgImFyaWEtcHJlc3NlZCI6IG9uID8gInRydWUiIDogImZhbHNlIiB9LCBpbmQubGFiZWwgfHwgaW5kLmtleSk7CiAgICAgIGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGkgPSBzZWxlY3RlZC5pbmRleE9mKGluZC5rZXkpOwogICAgICAgIGlmIChpID09PSAtMSkgc2VsZWN0ZWQucHVzaChpbmQua2V5KTsgZWxzZSBzZWxlY3RlZC5zcGxpY2UoaSwgMSk7CiAgICAgICAgdmFyIG5vd09uID0gc2VsZWN0ZWQuaW5kZXhPZihpbmQua2V5KSAhPT0gLTE7CiAgICAgICAgYi5jbGFzc0xpc3QudG9nZ2xlKCJ2LWNoaXAtLWFjdGl2ZSIsIG5vd09uKTsKICAgICAgICBiLnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwgbm93T24gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICAgfSk7CiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoYik7CiAgICB9KTsKCiAgICB2YXIgc2F2ZUJ0biA9IGVsKCJidXR0b24iLCB7IHR5cGU6ICJidXR0b24iLCAiY2xhc3MiOiAidi1jdGEgdi1jdGEtLXByaW1hcnkiIH0sICJBcHBseSIpOwogICAgdmFyIGFsbEJ0biA9IGVsKCJidXR0b24iLCB7IHR5cGU6ICJidXR0b24iLCAiY2xhc3MiOiAidi1jdGEgdi1jdGEtLWdob3N0IiB9LCAiU2hvdyBhbGwiKTsKCiAgICB2YXIgYm9keSA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LWZvcm0iIH0sIFsKICAgICAgZWwoImRpdiIsIHt9LCBbCiAgICAgICAgZWwoInAiLCB7ICJjbGFzcyI6ICJ2LWV5ZWJyb3ciIH0sICJGaWx0ZXIgUHJlc2V0cyIpLAogICAgICAgIGVsKCJoMiIsIHsgImNsYXNzIjogInYtbW9kYWxfX3RpdGxlIHYtZ3JhZGllbnQiIH0sICJZb3VyIGluZHVzdHJpZXMiKQogICAgICBdKSwKICAgICAgZWwoInAiLCB7ICJjbGFzcyI6ICJ2LWxhYmVsIiB9LCAiVGFpbG9yIHRoZSBzdHlsZSBwcmVzZXRzIHRvIHdoYXQgeW91IHdvcmsgb24uIiksCiAgICAgIGdyaWQsCiAgICAgIGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LW1vZGFsX19hY3Rpb25zIiB9LCBbYWxsQnRuLCBzYXZlQnRuXSkKICAgIF0pOwogICAgYm9keS5zdHlsZS5kaXNwbGF5ID0gImZsZXgiOwogICAgYm9keS5zdHlsZS5mbGV4RGlyZWN0aW9uID0gImNvbHVtbiI7CiAgICBib2R5LnN0eWxlLmdhcCA9ICJ2YXIoLS1zcGFjZS1tZCwgMTVweCkiOwoKICAgIHZhciBtb2RhbFJlZiA9IHVpKCkubW9kYWwgPyB1aSgpLm1vZGFsKGJvZHksIHsgYXJpYUxhYmVsOiAiRmlsdGVyIHByZXNldHMgYnkgaW5kdXN0cnkiIH0pIDogZmFsbGJhY2tNb2RhbChib2R5KTsKICAgIGZ1bmN0aW9uIGNvbW1pdChhcnIpIHsKICAgICAgaWYgKHN0b3JlKCkuc2V0KSBzdG9yZSgpLnNldCgiaW5kdXN0cmllcyIsIGFycik7IGVsc2UgVi5zdGF0ZS5pbmR1c3RyaWVzID0gYXJyOwogICAgICBpZiAoc3RvcmUoKS5zYXZlKSBzdG9yZSgpLnNhdmUoKTsKICAgICAgaWYgKHN0b3JlKCkuZW1pdCkgc3RvcmUoKS5lbWl0KCJpbmR1c3RyaWVzOmNoYW5nZWQiLCBhcnIpOwogICAgICBpZiAobW9kYWxSZWYgJiYgbW9kYWxSZWYuY2xvc2UpIG1vZGFsUmVmLmNsb3NlKCk7CiAgICAgIGlmIChvbkRvbmUpIG9uRG9uZSgpOwogICAgfQogICAgc2F2ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsgY29tbWl0KHNlbGVjdGVkKTsgfSk7CiAgICBhbGxCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IGNvbW1pdChbXSk7IH0pOwogIH0KCiAgZnVuY3Rpb24gc2F2ZVByZXNldChzZWVkLCBvcHRzKSB7CiAgICBzZWVkID0gc2VlZCB8fCB7fTsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIHByZWZpbGwgPSB7CiAgICAgIG5hbWU6IHNlZWQubmFtZSB8fCBzdWdnZXN0TmFtZShzZWVkLnByb21wdCksCiAgICAgIHByb21wdDogc2VlZC5wcm9tcHQgfHwgIiIsCiAgICAgIG5lZ2F0aXZlUHJvbXB0OiBzZWVkLm5lZ2F0aXZlUHJvbXB0IHx8IG51bGwsCiAgICAgIG1vZGVsOiBzZWVkLm1vZGVsIHx8IG51bGwKICAgIH07CiAgICByZXR1cm4gb3BlbkVkaXRvcihudWxsLCB7IHByZWZpbGw6IHByZWZpbGwsIG9uU2F2ZWQ6IG9wdHMub25TYXZlZCB9KTsKICB9CgogIGZ1bmN0aW9uIHN1Z2dlc3ROYW1lKHByb21wdCkgewogICAgaWYgKCFwcm9tcHQpIHJldHVybiAiIjsKICAgIHZhciB3b3JkcyA9IFN0cmluZyhwcm9tcHQpLnRyaW0oKS5zcGxpdCgvXHMrLykuc2xpY2UoMCwgNCkuam9pbigiICIpOwogICAgcmV0dXJuIHdvcmRzLmxlbmd0aCA+IDQwID8gd29yZHMuc2xpY2UoMCwgNDApIDogd29yZHM7CiAgfQoKICBWLnByZXNldHMgPSB7CiAgICBhbGw6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5zbGljZSgpOyB9LAogICAgc3dpenpsZXM6IHJlbGV2YW50U3dpenpsZXMsCiAgICBpc1JlbGV2YW50OiBpc1JlbGV2YW50LAogICAgbG9hZDogbG9hZCwKICAgIGNyZWF0ZTogY3JlYXRlLAogICAgdXBkYXRlOiB1cGRhdGUsCiAgICByZW1vdmU6IHJlbW92ZSwKICAgICJkZWxldGUiOiByZW1vdmUsCiAgICByZW9yZGVyOiByZW9yZGVyLAogICAgcmVuZGVyQ2hpcHM6IHJlbmRlckNoaXBzLAogICAgb3BlbkVkaXRvcjogb3BlbkVkaXRvciwKICAgIG9wZW5JbmR1c3RyaWVzOiBvcGVuSW5kdXN0cmllc1BpY2tlciwKICAgIHNhdmVQcmVzZXQ6IHNhdmVQcmVzZXQKICB9OwoKICByZXN0b3JlKCk7Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2dlbmVyYXRlLmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9IHdpbmRvdy5WID0gd2luZG93LlYgfHwge307CiAgVi52aWV3cyA9IFYudmlld3MgfHwge307CgogIGZ1bmN0aW9uIHVpKCkgeyByZXR1cm4gVi51aSB8fCB7fTsgfQogIGZ1bmN0aW9uIGFwaSgpIHsgcmV0dXJuIFYuYXBpIHx8IHt9OyB9CiAgZnVuY3Rpb24gdXRpbCgpIHsgcmV0dXJuIFYudXRpbCB8fCB7fTsgfQogIGZ1bmN0aW9uIGRhdGEoKSB7IHJldHVybiBWLmRhdGEgfHwge307IH0KICBmdW5jdGlvbiBzdGF0ZSgpIHsgcmV0dXJuIChWLnN0YXRlID0gVi5zdGF0ZSB8fCB7fSk7IH0KCiAgZnVuY3Rpb24gZWwodGFnLCBhdHRycykgewogICAgaWYgKHVpKCkuZWwpIHJldHVybiB1aSgpLmVsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIHZhciBpID0gMSwga2lkcyA9IFtdOwogICAgaWYgKGF0dHJzICYmIHR5cGVvZiBhdHRycyA9PT0gJ29iamVjdCcgJiYgIShhdHRycyBpbnN0YW5jZW9mIE5vZGUpICYmIHR5cGVvZiBhdHRycyAhPT0gJ3N0cmluZycpIHsKICAgICAgaSA9IDI7CiAgICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgaykpIGNvbnRpbnVlOwogICAgICAgIHZhciB2YWwgPSBhdHRyc1trXTsKICAgICAgICBpZiAoayA9PT0gJ2NsYXNzJyB8fCBrID09PSAnY2xhc3NOYW1lJykgbm9kZS5jbGFzc05hbWUgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ3RleHQnKSBub2RlLnRleHRDb250ZW50ID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICdodG1sJykgbm9kZS5pbm5lckhUTUwgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdvbicpID09PSAwICYmIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHZhbCk7CiAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdkYXRhLScpID09PSAwKSBub2RlLnNldEF0dHJpYnV0ZShrLCB2YWwpOwogICAgICAgIGVsc2UgaWYgKHZhbCA9PT0gdHJ1ZSkgbm9kZS5zZXRBdHRyaWJ1dGUoaywgJycpOwogICAgICAgIGVsc2UgaWYgKHZhbCAhPSBudWxsICYmIHZhbCAhPT0gZmFsc2UpIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYXR0cnMgIT0gbnVsbCkgeyBraWRzLnB1c2goYXR0cnMpOyB9CiAgICBmb3IgKDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykga2lkcy5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgICBraWRzLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgYXBwZW5kQ2hpbGQobm9kZSwgYyk7IH0pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiBhcHBlbmRDaGlsZChub2RlLCBjKSB7CiAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlKSByZXR1cm47CiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgeyBjLmZvckVhY2goZnVuY3Rpb24gKHgpIHsgYXBwZW5kQ2hpbGQobm9kZSwgeCk7IH0pOyByZXR1cm47IH0KICAgIGlmIChjIGluc3RhbmNlb2YgTm9kZSkgeyBub2RlLmFwcGVuZENoaWxkKGMpOyByZXR1cm47IH0KICAgIG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGMpKSk7CiAgfQoKICBmdW5jdGlvbiBpY29uKG5hbWUpIHsKICAgIHRyeSB7CiAgICAgIGlmICh1aSgpLmljb24pIHsKICAgICAgICB2YXIgZ290ID0gdWkoKS5pY29uKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YgZ290ID09PSAnc3RyaW5nJykgcmV0dXJuIGdvdDsKICAgICAgICBpZiAoZ290ICYmIGdvdC5ub2RlVHlwZSAmJiB0eXBlb2YgZ290Lm91dGVySFRNTCA9PT0gJ3N0cmluZycpIHJldHVybiBnb3Qub3V0ZXJIVE1MOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQogICAgcmV0dXJuICcnOwogIH0KCiAgZnVuY3Rpb24gaWNvbk5vZGUobmFtZSwgZ2x5cGgpIHsKICAgIHZhciBodG1sID0gaWNvbihuYW1lKTsKICAgIGlmIChodG1sKSB7IHZhciBzcGFuID0gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1pY28nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIGh0bWw6IGh0bWwgfSk7IHJldHVybiBzcGFuOyB9CiAgICByZXR1cm4gZWwoJ3NwYW4nLCB7ICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9LCBnbHlwaCB8fCAnJyk7CiAgfQoKICBmdW5jdGlvbiB0b2FzdChtc2csIGtpbmQpIHsKICAgIGlmICh1aSgpLnRvYXN0KSB7IHVpKCkudG9hc3QobXNnLCBraW5kIHx8ICdpbmZvJyk7IHJldHVybjsgfQogICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5lbWl0KSBWLnN0b3JlLmVtaXQoJ3RvYXN0JywgeyBtc2c6IG1zZywga2luZDoga2luZCB8fCAnaW5mbycgfSk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICBpZiAoVi5yb3V0ZXIgJiYgVi5yb3V0ZXIuZ28pIFYucm91dGVyLmdvKGhhc2gpOwogICAgZWxzZSB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiB1dWlkKCkgewogICAgaWYgKHV0aWwoKS51dWlkKSByZXR1cm4gdXRpbCgpLnV1aWQoKTsKICAgIGlmICh3aW5kb3cuY3J5cHRvICYmIGNyeXB0by5yYW5kb21VVUlEKSByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTsKICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgIHZhciByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwLCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODsKICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByYW5kb21TZWVkKCkgewogICAgaWYgKHV0aWwoKS5yYW5kb21TZWVkKSByZXR1cm4gdXRpbCgpLnJhbmRvbVNlZWQoKTsKICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKTsKICB9CgogIGZ1bmN0aW9uIG5vd0lTTygpIHsKICAgIHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXC5cZHszfVokLywgJ1onKTsKICB9CgogIGZ1bmN0aW9uIGVzYyhzKSB7CiAgICBpZiAodXRpbCgpLmVzY2FwZUh0bWwpIHJldHVybiB1dGlsKCkuZXNjYXBlSHRtbChzKTsKICAgIHJldHVybiBTdHJpbmcocyA9PSBudWxsID8gJycgOiBzKS5yZXBsYWNlKC9bJjw+IiddL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgIHJldHVybiB7ICcmJzogJyZhbXA7JywgJzwnOiAnJmx0OycsICc+JzogJyZndDsnLCAnIic6ICcmcXVvdDsnLCAiJyI6ICcmIzM5OycgfVtjXTsKICAgIH0pOwogIH0KCiAgdmFyIEZBTExCQUNLX01PREVMUyA9IFsKICAgIHsgcmF3OiAnZmx1eEtsZWluJywgICAgIGxhYmVsOiAnU3RhbmRhcmQnLCBzdWJoZWFkaW5nOiAnRmx1eCBLbGVpbicsICAgICBjb3N0OiAxMCwgbWF4UmVmOiAxLCB0Mmk6ICdmbHV4MVNjaG5lbGwnLCBkZWZhdWx0OiB0cnVlIH0sCiAgICB7IHJhdzogJ2ZsdXgxS29udGV4dCcsICBsYWJlbDogJ0xlZ2FjeScsICAgc3ViaGVhZGluZzogJ0ZsdXggS29udGV4dCcsICAgY29zdDogMTAsIG1heFJlZjogMSB9LAogICAgeyByYXc6ICduYW5vQmFuYW5hJywgICAgbGFiZWw6ICdQcm8nLCAgICAgIHN1YmhlYWRpbmc6ICdOYW5vIEJhbmFuYScsICAgIGNvc3Q6IDEwLCBtYXhSZWY6IDYgfSwKICAgIHsgcmF3OiAnbmFub0JhbmFuYTInLCAgIGxhYmVsOiAnUGx1cycsICAgICBzdWJoZWFkaW5nOiAnTmFubyBCYW5hbmEgMicsICBjb3N0OiAxNSwgbWF4UmVmOiA2IH0sCiAgICB7IHJhdzogJ25hbm9CYW5hbmFQcm8nLCBsYWJlbDogJ01heCcsICAgICAgc3ViaGVhZGluZzogJ05hbm8gQmFuYW5hIFBybycsIGNvc3Q6IDIwLCBtYXhSZWY6IDE1IH0KICBdOwogIHZhciBGQUxMQkFDS19BU1BFQ1RTID0gWwogICAgeyByYXc6ICdhdXRvJywgICAgICAgICAgbGFiZWw6ICdBdXRvJywgICAgICAgICAgIHc6IDEwMjQsIGg6IDEwMjQgfSwKICAgIHsgcmF3OiAnc3F1YXJlJywgICAgICAgIGxhYmVsOiAnU3F1YXJlJywgICAgICAgICB3OiAxMDI0LCBoOiAxMDI0IH0sCiAgICB7IHJhdzogJ3BvcnRyYWl0OTE2JywgICBsYWJlbDogJ1BvcnRyYWl0IDk6MTYnLCAgdzogMTAyNCwgaDogMTgyMCB9LAogICAgeyByYXc6ICdsYW5kc2NhcGUxNjknLCAgbGFiZWw6ICdMYW5kc2NhcGUgMTY6OScsIHc6IDE4MjAsIGg6IDEwMjQgfSwKICAgIHsgcmF3OiAncG9ydHJhaXQ0MycsICAgIGxhYmVsOiAnUG9ydHJhaXQgMzo0JywgICB3OiAxMDI0LCBoOiAxMzY1IH0sCiAgICB7IHJhdzogJ2xhbmRzY2FwZTQzJywgICBsYWJlbDogJ0xhbmRzY2FwZSA0OjMnLCAgdzogMTM2NSwgaDogMTAyNCB9CiAgXTsKCiAgZnVuY3Rpb24gbW9kZWxzKCkgewogICAgdmFyIG0gPSBkYXRhKCkubW9kZWxzOwogICAgcmV0dXJuIChBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoKSA/IG0gOiBGQUxMQkFDS19NT0RFTFM7CiAgfQogIGZ1bmN0aW9uIGFzcGVjdHMoKSB7CiAgICB2YXIgYSA9IGRhdGEoKS5hc3BlY3RzOwogICAgcmV0dXJuIChBcnJheS5pc0FycmF5KGEpICYmIGEubGVuZ3RoKSA/IGEgOiBGQUxMQkFDS19BU1BFQ1RTOwogIH0KCiAgZnVuY3Rpb24gbW9kZWxCeVJhdyhyYXcpIHsKICAgIHZhciBsaXN0ID0gbW9kZWxzKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIGlmIChsaXN0W2ldLnJhdyA9PT0gcmF3KSByZXR1cm4gbGlzdFtpXTsKICAgIHJldHVybiBsaXN0WzBdOwogIH0KCiAgZnVuY3Rpb24gbWF4UmVmRm9yKG1vZGVsKSB7CiAgICB2YXIgbiA9IG1vZGVsICYmIChtb2RlbC5tYXhSZWYgIT0gbnVsbCA/IG1vZGVsLm1heFJlZiA6IG1vZGVsLm1heElucHV0SW1hZ2VzKTsKICAgIHJldHVybiAodHlwZW9mIG4gPT09ICdudW1iZXInICYmIG4gPiAwKSA/IG4gOiAxOwogIH0KCiAgdmFyIElORFVTVFJZX1BMQUNFSE9MREVSUyA9IHsKICAgIHJlYWxFc3RhdGU6ICdTdGFnZSB0aGlzIGVtcHR5IGxpdmluZyByb29tIHdpdGggd2FybSBtb2Rlcm4gZnVybml0dXJlIGFuZCBzb2Z0IGRheWxpZ2h04oCmJywKICAgIGludGVyaW9yRGVzaWduOiAnUmVpbWFnaW5lIHRoaXMgcm9vbSBpbiBhIHRyYW5zaXRpb25hbCBzdHlsZSB3aXRoIG5hdHVyYWwgdGV4dHVyZXPigKYnLAogICAgYXJjaGl0ZWN0dXJlOiAnVmlzdWFsaXplIGEgbW9kZXJuIGZhY2FkZSB3aXRoIGZsb29yLXRvLWNlaWxpbmcgZ2xhc3MgYW5kIGNsZWFuIGxpbmVz4oCmJywKICAgIGxhbmRzY2FwaW5nOiAnQWRkIGx1c2ggbGFuZHNjYXBpbmcsIGEgc3RvbmUgcGF0aCwgYW5kIGV2ZW5pbmcgZ2FyZGVuIGxpZ2h0aW5n4oCmJywKICAgIGZ1cm5pc2hpbmc6ICdGdXJuaXNoIHRoaXMgc3BhY2Ugd2l0aCBtaWQtY2VudHVyeSBzZWF0aW5nIGFuZCBhIHN0YXRlbWVudCBydWfigKYnLAogICAgY29uc3RydWN0aW9uOiAnU2hvdyB0aGUgZmluaXNoZWQgYnVpbGQgd2l0aCBjb21wbGV0ZWQgc2lkaW5nIGFuZCBhIG1hbmljdXJlZCBsYXdu4oCmJywKICAgIGhvbWVPd25lcjogJ1JlcGFpbnQgdGhlc2Ugd2FsbHMgYSB3YXJtIG5ldXRyYWwgYW5kIGJyaWdodGVuIHRoZSBsaWdodGluZ+KApicKICB9OwoKICBmdW5jdGlvbiBwbGFjZWhvbGRlclRleHQoKSB7CiAgICB2YXIgcyA9IHN0YXRlKCk7CiAgICB2YXIgaW5kcyA9IHMuaW5kdXN0cmllcyB8fCAocy5zZXR0aW5ncyAmJiBzLnNldHRpbmdzLmluZHVzdHJpZXMpIHx8IFtdOwogICAgdmFyIGtleSA9IG51bGw7CiAgICBpZiAoQXJyYXkuaXNBcnJheShpbmRzKSAmJiBpbmRzLmxlbmd0aCkgewogICAgICBrZXkgPSAodHlwZW9mIGluZHNbMF0gPT09ICdzdHJpbmcnKSA/IGluZHNbMF0gOiAoaW5kc1swXSAmJiAoaW5kc1swXS5rZXkgfHwgaW5kc1swXS5yYXcpKTsKICAgIH0KICAgIGlmIChrZXkgJiYgSU5EVVNUUllfUExBQ0VIT0xERVJTW2tleV0pIHJldHVybiBJTkRVU1RSWV9QTEFDRUhPTERFUlNba2V5XTsKICAgIHJldHVybiAnRGVzY3JpYmUgd2hhdCB5b3Ugd2FudCB0byBjcmVhdGUgb3IgdHJhbnNmb3Jt4oCmJzsKICB9CgogIHZhciBjdXJyZW50ID0gbnVsbDsKCiAgVi52aWV3cy5jcmVhdGUgPSB7CiAgICByZW5kZXI6IGZ1bmN0aW9uIChyb290LCBwYXJhbXMpIHsKICAgICAgaWYgKGN1cnJlbnQpIHsgdHJ5IHsgY3VycmVudC5kZXN0cm95KCk7IH0gY2F0Y2ggKGUpIHt9IGN1cnJlbnQgPSBudWxsOyB9CiAgICAgIGN1cnJlbnQgPSBuZXcgQ3JlYXRvcihyb290LCBwYXJhbXMgfHwge30pOwogICAgICBjdXJyZW50Lm1vdW50KCk7CiAgICB9LAogICAgdGVhcmRvd246IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGN1cnJlbnQpIHsgdHJ5IHsgY3VycmVudC5kZXN0cm95KCk7IH0gY2F0Y2ggKGUpIHt9IGN1cnJlbnQgPSBudWxsOyB9CiAgICB9LAogICAgYXBwbHlFeGFtcGxlOiBmdW5jdGlvbiAoZXhhbXBsZSkgewogICAgICBleGFtcGxlID0gZXhhbXBsZSB8fCB7fTsKICAgICAgaWYgKGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQuYXBwbHlFeGFtcGxlID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgY3VycmVudC5hcHBseUV4YW1wbGUoZXhhbXBsZSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBwYXJ0cyA9IFtdOwogICAgICBpZiAoZXhhbXBsZS5wcm9tcHQpIHBhcnRzLnB1c2goJ3Byb21wdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGV4YW1wbGUucHJvbXB0KSk7CiAgICAgIGlmIChleGFtcGxlLm1vZGVsKSBwYXJ0cy5wdXNoKCdtb2RlbD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGV4YW1wbGUubW9kZWwpKTsKICAgICAgaWYgKGV4YW1wbGUucmVmZXJlbmNlVVJMKSBwYXJ0cy5wdXNoKCdpbWFnZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGV4YW1wbGUucmVmZXJlbmNlVVJMKSk7CiAgICAgIGdvKCcjL2NyZWF0ZScgKyAocGFydHMubGVuZ3RoID8gJz8nICsgcGFydHMuam9pbignJicpIDogJycpKTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiBDcmVhdG9yKHJvb3QsIHBhcmFtcykgewogICAgdGhpcy5yb290ID0gcm9vdDsKICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwoKICAgIHRoaXMucHJvbXB0ID0gdHlwZW9mIHBhcmFtcy5wcm9tcHQgPT09ICdzdHJpbmcnID8gcGFyYW1zLnByb21wdCA6ICcnOwogICAgdGhpcy5tb2RlbFJhdyA9IChwYXJhbXMubW9kZWwgJiYgbW9kZWxCeVJhdyhwYXJhbXMubW9kZWwpLnJhdyA9PT0gcGFyYW1zLm1vZGVsKSA/IHBhcmFtcy5tb2RlbCA6IHBpY2tEZWZhdWx0TW9kZWwoKTsKICAgIHRoaXMuYXNwZWN0UmF3ID0gcmVhZFBlcnNpc3RlZCgnYXNwZWN0JykgfHwgYXNwZWN0cygpWzBdLnJhdzsKICAgIHRoaXMuYWN0aXZlUHJlc2V0ID0gbnVsbDsKICAgIHRoaXMucmVmcyA9IFtdOwoKICAgIHZhciBzZWVkSW1hZ2UgPSBwYXJhbXMuaW1hZ2UgfHwgcGFyYW1zLmltYWdlVVJMIHx8IHBhcmFtcy5pbWFnZV91cmw7CiAgICBpZiAoc2VlZEltYWdlKSB7CiAgICAgIHRoaXMucmVmcy5wdXNoKHsgdXJsOiBzZWVkSW1hZ2UsIHJlbW90ZVVSTDogc2VlZEltYWdlLCBuYW1lOiAncmVmZXJlbmNlJyB9KTsKICAgIH0KICAgIHRoaXMudmFyaWF0aW9ucyA9IGZhbHNlOwogICAgdGhpcy5idXN5ID0gZmFsc2U7CiAgICB0aGlzLmFib3J0ID0gbnVsbDsKCiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTsKICAgIHRoaXMuX2Rlc3Ryb3llZCA9IGZhbHNlOwogICAgdGhpcy5fcHJlc2V0Q3RsID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHBpY2tEZWZhdWx0TW9kZWwoKSB7CiAgICB2YXIgc2F2ZWQgPSByZWFkUGVyc2lzdGVkKCdtb2RlbCcpOwogICAgaWYgKHNhdmVkICYmIG1vZGVsQnlSYXcoc2F2ZWQpLnJhdyA9PT0gc2F2ZWQpIHJldHVybiBzYXZlZDsKICAgIHZhciBsaXN0ID0gbW9kZWxzKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIGlmIChsaXN0W2ldLmRlZmF1bHQpIHJldHVybiBsaXN0W2ldLnJhdzsKICAgIHJldHVybiBsaXN0WzBdLnJhdzsKICB9CgogIGZ1bmN0aW9uIHJlYWRQZXJzaXN0ZWQoaykgewogICAgdHJ5IHsgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd2YW1wX3dlYl9jcmVhdGVfJyArIGspOyB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgfQogIGZ1bmN0aW9uIHdyaXRlUGVyc2lzdGVkKGssIHYpIHsKICAgIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd2YW1wX3dlYl9jcmVhdGVfJyArIGssIHYpOyB9IGNhdGNoIChlKSB7fQogIH0KCiAgQ3JlYXRvci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAodGFyZ2V0LCBldnQsIGZuLCBvcHRzKSB7CiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldnQsIGZuLCBvcHRzIHx8IGZhbHNlKTsKICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKFt0YXJnZXQsIGV2dCwgZm4sIG9wdHMgfHwgZmFsc2VdKTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgewogICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTsKICAgIGlmICh0aGlzLmFib3J0KSB7IHRyeSB7IHRoaXMuYWJvcnQuYWJvcnQoKTsgfSBjYXRjaCAoZSkge30gfQogICAgaWYgKHRoaXMuX3ByZXNldEN0bCAmJiB0eXBlb2YgdGhpcy5fcHJlc2V0Q3RsLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgdGhpcy5fcHJlc2V0Q3RsLmRlc3Ryb3koKTsgfSBjYXRjaCAoZSkge30gfQogICAgdGhpcy5fcHJlc2V0Q3RsID0gbnVsbDsKICAgIHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsKSB7IHRyeSB7IGxbMF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihsWzFdLCBsWzJdLCBsWzNdKTsgfSBjYXRjaCAoZSkge30gfSk7CiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTsKICAgIHRoaXMuY2xlYXJSZWZzKCk7CiAgICBpZiAodGhpcy5fc2NyaW0gJiYgdGhpcy5fc2NyaW0ucGFyZW50Tm9kZSkgdGhpcy5fc2NyaW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9zY3JpbSk7CiAgICB0aGlzLl9zY3JpbSA9IG51bGw7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuY3VycmVudE1vZGVsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbW9kZWxCeVJhdyh0aGlzLm1vZGVsUmF3KTsgfTsKICBDcmVhdG9yLnByb3RvdHlwZS5oYXNJbnB1dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucmVmcy5sZW5ndGggPiAwOyB9OwogIENyZWF0b3IucHJvdG90eXBlLmlzVDJJID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gIXRoaXMuaGFzSW5wdXQoKTsgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUudW5pdENvc3QgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAodGhpcy5pc1QySSgpKSByZXR1cm4gMTsKICAgIHZhciBtID0gdGhpcy5jdXJyZW50TW9kZWwoKTsKICAgIHJldHVybiAobSAmJiB0eXBlb2YgbS5jb3N0ID09PSAnbnVtYmVyJykgPyBtLmNvc3QgOiAxMDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS50b3RhbENvc3QgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgY291bnQgPSB0aGlzLnZhcmlhdGlvbnMgPyA0IDogMTsKICAgIHJldHVybiB0aGlzLnVuaXRDb3N0KCkgKiBjb3VudDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5maW5hbFByb21wdCA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB0eXBlZCA9ICh0aGlzLnByb21wdCB8fCAnJykudHJpbSgpOwogICAgaWYgKHRoaXMuYWN0aXZlUHJlc2V0ICYmIHRoaXMuYWN0aXZlUHJlc2V0LnByb21wdCkgewogICAgICB2YXIgcHJlID0gdGhpcy5hY3RpdmVQcmVzZXQucHJvbXB0LnRyaW0oKTsKICAgICAgcmV0dXJuIHR5cGVkID8gKHByZSArICcgJyArIHR5cGVkKSA6IHByZTsKICAgIH0KICAgIHJldHVybiB0eXBlZDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5jYW5TdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAodGhpcy5idXN5KSByZXR1cm4gZmFsc2U7CiAgICBpZiAodGhpcy5oYXNJbnB1dCgpKSByZXR1cm4gdHJ1ZTsKICAgIGlmICh0aGlzLmFjdGl2ZVByZXNldCAmJiB0aGlzLmFjdGl2ZVByZXNldC5wcm9tcHQpIHJldHVybiB0cnVlOwogICAgcmV0dXJuICh0aGlzLnByb21wdCB8fCAnJykudHJpbSgpLmxlbmd0aCA+PSA4OwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLm1vdW50ID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHJvb3QgPSB0aGlzLnJvb3Q7CiAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgcm9vdC5jbGFzc05hbWUgPSAndi12aWV3IHYtY3JlYXRlJzsKCiAgICB2YXIgbGlicmFyeUVtcHR5ID0gIShzdGF0ZSgpLmxpYnJhcnkgJiYgc3RhdGUoKS5saWJyYXJ5Lmxlbmd0aCk7CgogICAgdmFyIGNvbnRyb2xzID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fbWFpbicgfSk7CiAgICB0aGlzLmJ1aWxkQ29udHJvbHMoY29udHJvbHMpOwoKICAgIHZhciBzaWRlID0gZWwoJ2FzaWRlJywgeyBjbGFzczogJ3Ytc2lkZS1wYW5lbCB2LWNyZWF0ZV9fc2lkZScgfSk7CiAgICB0cnkgeyBzaWRlLmFwcGVuZENoaWxkKHRoaXMuYnVpbGRTaWRlKGxpYnJhcnlFbXB0eSkpOyB9IGNhdGNoIChlKSB7fQoKICAgIHZhciBsYXlvdXQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3BsaXQtbGF5b3V0JyB9LCBjb250cm9scywgc2lkZSk7CiAgICByb290LmFwcGVuZENoaWxkKGxheW91dCk7CgogICAgdGhpcy5fc2lkZU5vZGUgPSBzaWRlOwogICAgdGhpcy5yZWZyZXNoQ1RBKCk7CiAgICB0aGlzLnJlZnJlc2hBc3BlY3RWaXNpYmlsaXR5KCk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRDb250cm9scyA9IGZ1bmN0aW9uIChob3N0KSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBmdW5jdGlvbiBhZGQoZm4pIHsKICAgICAgdmFyIG5vZGUgPSBudWxsOwogICAgICB0cnkgeyBub2RlID0gZm4uY2FsbChzZWxmKTsgfSBjYXRjaCAoZSkgeyBpZiAod2luZG93LmNvbnNvbGUpIGNvbnNvbGUuZXJyb3IoJ1tjcmVhdGVdIHNlY3Rpb24gZmFpbGVkJywgZSk7IH0KICAgICAgaWYgKG5vZGUpIGhvc3QuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICB9CgogICAgYWRkKHRoaXMuYnVpbGRIZWFkZXIpOwogICAgYWRkKHRoaXMuYnVpbGRJbWFnZVpvbmUpOwogICAgYWRkKHRoaXMuYnVpbGRQcm9tcHQpOwogICAgYWRkKHRoaXMuYnVpbGRQcmVzZXRzKTsKICAgIGFkZCh0aGlzLmJ1aWxkU2VsZWN0b3JzKTsKICAgIGFkZCh0aGlzLmJ1aWxkQWN0aW9ucyk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRIZWFkZXIgPSBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gZWwoJ2hlYWRlcicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX2hlYWQgdi1jcmVhdGVfX2hlYWQnIH0sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX2hlYWR0ZXh0JyB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZXllYnJvdycgfSwgJ1ZhbXAgU3R1ZGlvJyksCiAgICAgICAgZWwoJ2gxJywgeyBjbGFzczogJ3YtY3JlYXRlX190aXRsZSB2LWdyYWRpZW50JyB9LCAnQ3JlYXRlIG9yIHRyYW5zZm9ybScpLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViJyB9LCAnRGVzY3JpYmUgYSBzY2VuZSwgb3IgZHJvcCBhbiBpbWFnZSB0byByZXN0eWxlLCBzdGFnZSwgYW5kIHJlaW1hZ2luZSBpdC4nKQogICAgICApKTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5idWlsZEltYWdlWm9uZSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciBzZWN0aW9uID0gZWwoJ3NlY3Rpb24nLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCB2LWNyZWF0ZV9faW1nem9uZScsICdhcmlhLWxhYmVsJzogJ1JlZmVyZW5jZSBpbWFnZXMnIH0pOwogICAgdGhpcy5faW1nem9uZSA9IHNlY3Rpb247CgogICAgdmFyIGZpbGVJbnB1dCA9IGVsKCdpbnB1dCcsIHsKICAgICAgdHlwZTogJ2ZpbGUnLCBhY2NlcHQ6ICdpbWFnZS8qJywgbXVsdGlwbGU6IHRydWUsCiAgICAgIGNsYXNzOiAndi12aXN1YWxseS1oaWRkZW4nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIHRhYmluZGV4OiAnLTEnLAogICAgICBzdHlsZTogJ3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtoZWlnaHQ6MXB4O29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lJwogICAgfSk7CiAgICB0aGlzLm9uKGZpbGVJbnB1dCwgJ2NoYW5nZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgIHNlbGYuYWRkRmlsZXMoZS50YXJnZXQuZmlsZXMpOwogICAgICBmaWxlSW5wdXQudmFsdWUgPSAnJzsKICAgIH0pOwogICAgdGhpcy5fZmlsZUlucHV0ID0gZmlsZUlucHV0OwogICAgc2VjdGlvbi5hcHBlbmRDaGlsZChmaWxlSW5wdXQpOwoKICAgIHRoaXMub24oZG9jdW1lbnQsICdwYXN0ZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChzZWxmLl9kZXN0cm95ZWQgfHwgc2VsZi5idXN5KSByZXR1cm47CiAgICAgIHZhciBpdGVtcyA9IChlLmNsaXBib2FyZERhdGEgJiYgZS5jbGlwYm9hcmREYXRhLml0ZW1zKSB8fCBbXTsKICAgICAgdmFyIGZpbGVzID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoaXRlbXNbaV0ua2luZCA9PT0gJ2ZpbGUnICYmIGl0ZW1zW2ldLnR5cGUuaW5kZXhPZignaW1hZ2UvJykgPT09IDApIHsKICAgICAgICAgIHZhciBmID0gaXRlbXNbaV0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICBpZiAoZikgZmlsZXMucHVzaChmKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGZpbGVzLmxlbmd0aCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IHNlbGYuYWRkRmlsZXMoZmlsZXMpOyB9CiAgICB9KTsKCiAgICB0aGlzLnJlbmRlckltYWdlWm9uZSgpOwogICAgcmV0dXJuIHNlY3Rpb247CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYmluZERuZCA9IGZ1bmN0aW9uICh0YXJnZXQpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIFsnZHJhZ2VudGVyJywgJ2RyYWdvdmVyJ10uZm9yRWFjaChmdW5jdGlvbiAoZXZ0KSB7CiAgICAgIHNlbGYub24odGFyZ2V0LCBldnQsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2RyYWdvdmVyJyk7IH0pOwogICAgfSk7CiAgICBbJ2RyYWdsZWF2ZScsICdkcmFnZW5kJ10uZm9yRWFjaChmdW5jdGlvbiAoZXZ0KSB7CiAgICAgIHNlbGYub24odGFyZ2V0LCBldnQsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdvdmVyJyk7IH0pOwogICAgfSk7CiAgICB0aGlzLm9uKHRhcmdldCwgJ2Ryb3AnLCBmdW5jdGlvbiAoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnb3ZlcicpOwogICAgICB2YXIgZHQgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgaWYgKGR0ICYmIGR0LmZpbGVzICYmIGR0LmZpbGVzLmxlbmd0aCkgc2VsZi5hZGRGaWxlcyhkdC5maWxlcyk7CiAgICB9KTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZW5kZXJJbWFnZVpvbmUgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX2ltZ3pvbmU7CiAgICBpZiAoIXNlY3Rpb24pIHJldHVybjsKICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHNlY3Rpb24uY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsKICAgICAgaWYgKGMgIT09IHNlbGYuX2ZpbGVJbnB1dCkgc2VjdGlvbi5yZW1vdmVDaGlsZChjKTsKICAgIH0pOwoKICAgIHZhciBtb2RlbCA9IHRoaXMuY3VycmVudE1vZGVsKCk7CiAgICB2YXIgbWF4ID0gbWF4UmVmRm9yKG1vZGVsKTsKCiAgICBpZiAoIXRoaXMucmVmcy5sZW5ndGgpIHsKICAgICAgdmFyIHpvbmUgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZHJvcHpvbmUnLCByb2xlOiAnYnV0dG9uJywgdGFiaW5kZXg6ICcwJywKICAgICAgICAnYXJpYS1sYWJlbCc6ICdBZGQgYSByZWZlcmVuY2UgaW1hZ2UnIH0sCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJywgaHRtbDogaWNvbigncGhvdG8nKSB8fCBkcm9wR2x5cGgoKSB9KSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3JlYXRlX19kcm9wdGl0bGUnIH0sICdEcm9wIGFuIGltYWdlLCBwYXN0ZSwgb3IgYnJvd3NlJyksCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YicgfSwKICAgICAgICAgICdPcHRpb25hbCDigJQgbGVhdmUgZW1wdHkgdG8gZ2VuZXJhdGUgZnJvbSB0ZXh0LiAnICsKICAgICAgICAgIChtYXggPiAxID8gKCdVcCB0byAnICsgbWF4ICsgJyByZWZlcmVuY2VzIGZvciAnICsgKG1vZGVsLmxhYmVsIHx8ICd0aGlzIG1vZGVsJykgKyAnLicpIDogJycpKSk7CiAgICAgIHRoaXMuYmluZERuZCh6b25lKTsKICAgICAgdGhpcy5vbih6b25lLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7IHNlbGYuX2ZpbGVJbnB1dC5jbGljaygpOyB9KTsKICAgICAgdGhpcy5vbih6b25lLCAna2V5ZG93bicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInIHx8IGUua2V5ID09PSAnICcpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzZWxmLl9maWxlSW5wdXQuY2xpY2soKTsgfQogICAgICB9KTsKICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZCh6b25lKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBvdmVyTGltaXQgPSB0aGlzLnJlZnMubGVuZ3RoID4gbWF4OwogICAgdmFyIGhlYWQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2VjdGlvbl9faGVhZCB2LWNyZWF0ZV9faW1naGVhZCcgfSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1leWVicm93JyB9LCAodGhpcy5yZWZzLmxlbmd0aCA+IDEgPyAnUmVmZXJlbmNlcycgOiAnU291cmNlIGltYWdlJykpLAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWxhYmVsIHYtY3JlYXRlX19pbWdjb3VudCcgKyAob3ZlckxpbWl0ID8gJyBpcy1vdmVyJyA6ICcnKSB9LAogICAgICAgIHRoaXMucmVmcy5sZW5ndGggKyAnIC8gJyArIG1heCkpOwogICAgc2VjdGlvbi5hcHBlbmRDaGlsZChoZWFkKTsKCiAgICB2YXIgZ3JpZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1ncmlkIHYtZ3JpZC0tYXV0byB2LWNyZWF0ZV9fdGh1bWJzJyB9KTsKICAgIHRoaXMuYmluZERuZChncmlkKTsKICAgIHRoaXMucmVmcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWYsIGlkeCkgewogICAgICB2YXIgdGh1bWIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3JlYXRlX190aHVtYicgKyAoaWR4ID09PSAwICYmIHNlbGYucmVmcy5sZW5ndGggPiAxID8gJyBpcy1wcmltYXJ5JyA6ICcnKSB9KTsKICAgICAgdmFyIHRodW1iSW1nID0gZWwoJ2ltZycsIHsgc3JjOiByZWYudXJsLCBhbHQ6IHJlZi5uYW1lIHx8ICgncmVmZXJlbmNlICcgKyAoaWR4ICsgMSkpLCBsb2FkaW5nOiAnbGF6eScgfSk7CiAgICAgIHRodW1iSW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyB0aHVtYi5jbGFzc0xpc3QuYWRkKCdpcy1icm9rZW4nKTsgfSk7CiAgICAgIHRodW1iLmFwcGVuZENoaWxkKHRodW1iSW1nKTsKICAgICAgaWYgKGlkeCA9PT0gMCAmJiBzZWxmLnJlZnMubGVuZ3RoID4gMSkgewogICAgICAgIHRodW1iLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtdGh1bWJfX2JhZGdlIHYtY3JlYXRlX190aHVtYi1iYWRnZScgfSwgJ0JlZm9yZScpKTsKICAgICAgfQogICAgICB2YXIgcm0gPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3JlYXRlX190aHVtYi1ybScsIHR5cGU6ICdidXR0b24nLCAnYXJpYS1sYWJlbCc6ICdSZW1vdmUgaW1hZ2UnLCB0aXRsZTogJ1JlbW92ZSBpbWFnZScgfSwKICAgICAgICBlbCgnc3BhbicsIHsgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBodG1sOiBpY29uKCd4bWFyaycpIHx8ICfDlycgfSkpOwogICAgICBzZWxmLm9uKHJtLCAnY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBzZWxmLnJlbW92ZVJlZihpZHgpOyB9KTsKICAgICAgdGh1bWIuYXBwZW5kQ2hpbGQocm0pOwogICAgICBncmlkLmFwcGVuZENoaWxkKHRodW1iKTsKICAgIH0pOwoKICAgIGlmICh0aGlzLnJlZnMubGVuZ3RoIDwgbWF4KSB7CiAgICAgIHZhciBhZGQgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3JlYXRlX190aHVtYiB2LWNyZWF0ZV9fdGh1bWItYWRkJywgdHlwZTogJ2J1dHRvbicsICdhcmlhLWxhYmVsJzogJ0FkZCBhbm90aGVyIGltYWdlJyB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3JlYXRlX19wbHVzJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBodG1sOiBpY29uKCdwbHVzJykgfHwgJysnIH0pLAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbGFiZWwnIH0sICcrJyArIChtYXggLSB0aGlzLnJlZnMubGVuZ3RoKSkpOwogICAgICBzZWxmLm9uKGFkZCwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBzZWxmLl9maWxlSW5wdXQuY2xpY2soKTsgfSk7CiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoYWRkKTsKICAgIH0KICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQoZ3JpZCk7CgogICAgaWYgKHRoaXMucmVmcy5sZW5ndGggPiBtYXgpIHsKICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtZXJyb3InIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7ICdhcmlhLWhpZGRlbic6ICd0cnVlJywgaHRtbDogaWNvbignZXhjbGFtYXRpb24nKSB8fCAnIScgfSksCiAgICAgICAgZWwoJ3NwYW4nLCBudWxsLCAnT25seSB0aGUgZmlyc3QgJyArIG1heCArICcgd2lsbCBiZSB1c2VkIGJ5ICcgKyAobW9kZWwubGFiZWwgfHwgJ3RoaXMgbW9kZWwnKSArICcuIFBpY2sgYSBoaWdoZXIgdGllciBmb3IgbW9yZS4nKSkpOwogICAgfQogICAgc2VjdGlvbi5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViJyB9LAogICAgICAnRWRpdGluZyBtb2RlIOKAlCBvdXRwdXQgc2l6ZSBmb2xsb3dzIHlvdXIgc291cmNlIGltYWdlLicpKTsKICB9OwoKICBmdW5jdGlvbiBkcm9wR2x5cGgoKSB7CiAgICByZXR1cm4gJzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjYiIGhlaWdodD0iMjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiAnICsKICAgICAgJ3N0cm9rZS13aWR0aD0iMS42IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGFyaWEtaGlkZGVuPSJ0cnVlIj4nICsKICAgICAgJzxyZWN0IHg9IjMiIHk9IjMiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjMiLz48Y2lyY2xlIGN4PSI4LjUiIGN5PSI5IiByPSIxLjgiLz4nICsKICAgICAgJzxwYXRoIGQ9Ik0yMSAxNmwtNS01LTcgNyIvPjwvc3ZnPic7CiAgfQoKICBDcmVhdG9yLnByb3RvdHlwZS5hZGRGaWxlcyA9IGZ1bmN0aW9uIChmaWxlTGlzdCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIGZpbGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZmlsZUxpc3QgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoZikgewogICAgICByZXR1cm4gZiAmJiBmLnR5cGUgJiYgZi50eXBlLmluZGV4T2YoJ2ltYWdlLycpID09PSAwOwogICAgfSk7CiAgICBpZiAoIWZpbGVzLmxlbmd0aCkgeyB0b2FzdCgnTm8gaW1hZ2UgZm91bmQgaW4gdGhhdCBkcm9wLicsICdlcnJvcicpOyByZXR1cm47IH0KICAgIHZhciBtb2RlbCA9IHRoaXMuY3VycmVudE1vZGVsKCk7CiAgICB2YXIgbWF4ID0gbWF4UmVmRm9yKG1vZGVsKTsKICAgIHZhciByb29tID0gbWF4IC0gdGhpcy5yZWZzLmxlbmd0aDsKICAgIGlmIChyb29tIDw9IDApIHsgdG9hc3QoJ1RoaXMgbW9kZWwgYWNjZXB0cyB1cCB0byAnICsgbWF4ICsgJyBpbWFnZScgKyAobWF4ID4gMSA/ICdzJyA6ICcnKSArICcuJywgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICBmaWxlcy5zbGljZSgwLCByb29tKS5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7CiAgICAgIHZhciB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGYpOwogICAgICBzZWxmLnJlZnMucHVzaCh7IGZpbGU6IGYsIHVybDogdXJsLCBuYW1lOiBmLm5hbWUgfHwgJ2ltYWdlJyB9KTsKICAgIH0pOwogICAgaWYgKGZpbGVzLmxlbmd0aCA+IHJvb20pIHRvYXN0KCdBZGRlZCAnICsgcm9vbSArICc7IHRoaXMgbW9kZWwgbWF4ZXMgYXQgJyArIG1heCArICcuJywgJ2luZm8nKTsKICAgIHRoaXMuYWZ0ZXJJbnB1dENoYW5nZSgpOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnJlbW92ZVJlZiA9IGZ1bmN0aW9uIChpZHgpIHsKICAgIHZhciByZWYgPSB0aGlzLnJlZnNbaWR4XTsKICAgIGlmIChyZWYgJiYgcmVmLnVybCAmJiByZWYudXJsLmluZGV4T2YoJ2Jsb2I6JykgPT09IDApIHsgdHJ5IHsgVVJMLnJldm9rZU9iamVjdFVSTChyZWYudXJsKTsgfSBjYXRjaCAoZSkge30gfQogICAgdGhpcy5yZWZzLnNwbGljZShpZHgsIDEpOwogICAgdGhpcy5hZnRlcklucHV0Q2hhbmdlKCk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuY2xlYXJSZWZzID0gZnVuY3Rpb24gKCkgewogICAgdGhpcy5yZWZzLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgaWYgKHIudXJsICYmIHIudXJsLmluZGV4T2YoJ2Jsb2I6JykgPT09IDApIHsgdHJ5IHsgVVJMLnJldm9rZU9iamVjdFVSTChyLnVybCk7IH0gY2F0Y2ggKGUpIHt9IH0gfSk7CiAgICB0aGlzLnJlZnMgPSBbXTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5hZnRlcklucHV0Q2hhbmdlID0gZnVuY3Rpb24gKCkgewogICAgdGhpcy5yZW5kZXJJbWFnZVpvbmUoKTsKICAgIHRoaXMucmVmcmVzaEFzcGVjdFZpc2liaWxpdHkoKTsKICAgIHRoaXMucmVmcmVzaENUQSgpOwogICAgaWYgKHRoaXMuX3Byb21wdEZpZWxkKSB0aGlzLl9wcm9tcHRGaWVsZC5wbGFjZWhvbGRlciA9IHRoaXMucGxhY2Vob2xkZXJGb3JNb2RlKCk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUucGxhY2Vob2xkZXJGb3JNb2RlID0gZnVuY3Rpb24gKCkgewogICAgaWYgKHRoaXMuaGFzSW5wdXQoKSkgcmV0dXJuICdEZXNjcmliZSB0aGUgY2hhbmdlIOKAlCBlLmcuICJzdGFnZSB3aXRoIHdhcm0gbW9kZXJuIGZ1cm5pdHVyZSLigKYgKG9wdGlvbmFsIHdpdGggYSBwcmVzZXQpJzsKICAgIHJldHVybiBwbGFjZWhvbGRlclRleHQoKTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5idWlsZFByb21wdCA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciBncm91cCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCB2LWNyZWF0ZV9fcHJvbXB0JyB9KTsKICAgIGdyb3VwLmFwcGVuZENoaWxkKGVsKCdsYWJlbCcsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnLCBmb3I6ICd2LXByb21wdCcgfSwgJ1Byb21wdCcpKTsKCiAgICB2YXIgd3JhcCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX3RhLXdyYXAnIH0pOwogICAgdmFyIHRhID0gZWwoJ3RleHRhcmVhJywgewogICAgICBpZDogJ3YtcHJvbXB0JywgY2xhc3M6ICd2LXRleHRhcmVhIHYtdGV4dGFyZWEtLWxnIHYtY3JlYXRlX190YScsIHJvd3M6ICczJywKICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXJGb3JNb2RlKCksCiAgICAgICdhcmlhLWRlc2NyaWJlZGJ5JzogJ3YtcHJvbXB0LWhlbHAnCiAgICB9KTsKICAgIHRhLnZhbHVlID0gdGhpcy5wcm9tcHQ7CiAgICB0aGlzLl9wcm9tcHRGaWVsZCA9IHRhOwoKICAgIHZhciBjbGVhckJ0biA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jcmVhdGVfX3RhLWNsZWFyJywgdHlwZTogJ2J1dHRvbicsICdhcmlhLWxhYmVsJzogJ0NsZWFyIHByb21wdCcsIHRpdGxlOiAnQ2xlYXIgcHJvbXB0JyB9LAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fdGEtY2xlYXItZ2x5cGgnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIGh0bWw6IGljb24oJ3htYXJrJykgfHwgJ8OXJyB9KSk7CiAgICBjbGVhckJ0bi5oaWRkZW4gPSAhdGhpcy5wcm9tcHQ7CgogICAgdmFyIGF1dG8gPSBmdW5jdGlvbiAoKSB7CiAgICAgIHRhLnN0eWxlLmhlaWdodCA9ICdhdXRvJzsKICAgICAgdGEuc3R5bGUuaGVpZ2h0ID0gTWF0aC5taW4odGEuc2Nyb2xsSGVpZ2h0LCAzMjApICsgJ3B4JzsKICAgIH07CiAgICB0aGlzLm9uKHRhLCAnaW5wdXQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHNlbGYucHJvbXB0ID0gdGEudmFsdWU7CiAgICAgIGF1dG8oKTsKICAgICAgc2VsZi5yZWZyZXNoQ1RBKCk7CiAgICAgIGNsZWFyQnRuLmhpZGRlbiA9ICF0YS52YWx1ZTsKICAgIH0pOwogICAgdGhpcy5vbih0YSwgJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpICYmIGUua2V5ID09PSAnRW50ZXInKSB7IGUucHJldmVudERlZmF1bHQoKTsgc2VsZi5nZW5lcmF0ZSgpOyB9CiAgICB9KTsKICAgIHRoaXMub24oY2xlYXJCdG4sICdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgdGEudmFsdWUgPSAnJzsgc2VsZi5wcm9tcHQgPSAnJzsgYXV0bygpOyBzZWxmLnJlZnJlc2hDVEEoKTsKICAgICAgY2xlYXJCdG4uaGlkZGVuID0gdHJ1ZTsgdGEuZm9jdXMoKTsKICAgIH0pOwoKICAgIHdyYXAuYXBwZW5kQ2hpbGQodGEpOwogICAgd3JhcC5hcHBlbmRDaGlsZChjbGVhckJ0bik7CiAgICBncm91cC5hcHBlbmRDaGlsZCh3cmFwKTsKCiAgICB2YXIgaGVscCA9IGVsKCdkaXYnLCB7IGlkOiAndi1wcm9tcHQtaGVscCcsIGNsYXNzOiAndi1jcmVhdGVfX2hlbHAgdi1zZWN0aW9uX19zdWInIH0pOwogICAgdGhpcy5fcHJvbXB0SGVscCA9IGhlbHA7CiAgICBncm91cC5hcHBlbmRDaGlsZChoZWxwKTsKCiAgICBzZXRUaW1lb3V0KGF1dG8sIDApOwogICAgdGhpcy5yZWZyZXNoUHJvbXB0SGVscCgpOwogICAgcmV0dXJuIGdyb3VwOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnJlZnJlc2hQcm9tcHRIZWxwID0gZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLl9wcm9tcHRIZWxwKSByZXR1cm47CiAgICB2YXIgbiA9ICh0aGlzLnByb21wdCB8fCAnJykudHJpbSgpLmxlbmd0aDsKICAgIHZhciBtc2csIGNscyA9ICd2LWNyZWF0ZV9faGVscCB2LXNlY3Rpb25fX3N1Yic7CiAgICBpZiAodGhpcy5oYXNJbnB1dCgpKSB7CiAgICAgIG1zZyA9IHRoaXMuYWN0aXZlUHJlc2V0ID8gKCdVc2luZyBwcmVzZXQg4oCcJyArIGVzYyh0aGlzLmFjdGl2ZVByZXNldC5uYW1lKSArICfigJ0gKyB5b3VyIHRleHQuJykKICAgICAgICA6ICdEZXNjcmliZSB0aGUgdHJhbnNmb3JtYXRpb24sIG9yIHBpY2sgYSBwcmVzZXQuJzsKICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVQcmVzZXQpIHsKICAgICAgbXNnID0gJ1ByZXNldCDigJwnICsgZXNjKHRoaXMuYWN0aXZlUHJlc2V0Lm5hbWUpICsgJ+KAnSBhY3RpdmUuIEFkZCB0ZXh0IHRvIHJlZmluZS4nOwogICAgfSBlbHNlIGlmIChuID09PSAwKSB7CiAgICAgIG1zZyA9ICdUZXh0LXRvLWltYWdlIG5lZWRzIGF0IGxlYXN0IDggY2hhcmFjdGVycy4nOwogICAgfSBlbHNlIGlmIChuIDwgOCkgewogICAgICBtc2cgPSAoOCAtIG4pICsgJyBtb3JlIGNoYXJhY3RlcicgKyAoKDggLSBuKSA9PT0gMSA/ICcnIDogJ3MnKSArICcgdG8gZ2VuZXJhdGUuJzsKICAgICAgY2xzICs9ICcgaXMtd2Fybic7CiAgICB9IGVsc2UgewogICAgICBtc2cgPSAnUmVhZHkuICcgKyBuICsgJyBjaGFyYWN0ZXJzLic7CiAgICAgIGNscyArPSAnIGlzLW9rJzsKICAgIH0KICAgIHRoaXMuX3Byb21wdEhlbHAuY2xhc3NOYW1lID0gY2xzOwogICAgdGhpcy5fcHJvbXB0SGVscC5pbm5lckhUTUwgPSBtc2c7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRQcmVzZXRzID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlY3Rpb24gPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZmllbGQtZ3JvdXAgdi1jcmVhdGVfX3ByZXNldHMnIH0pOwogICAgc2VjdGlvbi5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnIH0sICdTdHlsZSBwcmVzZXRzJykpOwoKICAgIHZhciBob3N0ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fcHJlc2V0aG9zdCcgfSk7CiAgICB0aGlzLl9wcmVzZXRIb3N0ID0gaG9zdDsKICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQoaG9zdCk7CgogICAgdGhpcy5pbml0UHJlc2V0Q2hpcHMoKTsKICAgIHJldHVybiBzZWN0aW9uOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmluaXRQcmVzZXRDaGlwcyA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciBob3N0ID0gdGhpcy5fcHJlc2V0SG9zdDsKICAgIGlmICghaG9zdCkgcmV0dXJuOwoKICAgIHZhciBvblNlbGVjdCA9IGZ1bmN0aW9uIChwcmVzZXQpIHsKICAgICAgaWYgKHNlbGYuYWN0aXZlUHJlc2V0ICYmIHByZXNldCAmJiBzZWxmLmFjdGl2ZVByZXNldC5pZCA9PT0gcHJlc2V0LmlkKSB7CiAgICAgICAgc2VsZi5hY3RpdmVQcmVzZXQgPSBudWxsOwogICAgICAgIGlmIChzZWxmLl9wcmVzZXRDdGwgJiYgc2VsZi5fcHJlc2V0Q3RsLnNldEFjdGl2ZSkgc2VsZi5fcHJlc2V0Q3RsLnNldEFjdGl2ZShudWxsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZWxmLmFjdGl2ZVByZXNldCA9IHByZXNldCB8fCBudWxsOwogICAgICB9CiAgICAgIHNlbGYucmVmcmVzaENUQSgpOwogICAgICBzZWxmLnJlZnJlc2hQcm9tcHRIZWxwKCk7CiAgICB9OwoKICAgIHZhciByZW5kZXJlZCA9IGZhbHNlOwogICAgaWYgKFYucHJlc2V0cyAmJiB0eXBlb2YgVi5wcmVzZXRzLnJlbmRlckNoaXBzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdGhpcy5fcHJlc2V0Q3RsID0gVi5wcmVzZXRzLnJlbmRlckNoaXBzKGhvc3QsIHsKICAgICAgICAgIHNlbGVjdGVkSWQ6IHNlbGYuYWN0aXZlUHJlc2V0ID8gc2VsZi5hY3RpdmVQcmVzZXQuaWQgOiBudWxsLAogICAgICAgICAgc2VsZWN0ZWRLZXk6IHNlbGYuYWN0aXZlUHJlc2V0ID8gKHNlbGYuYWN0aXZlUHJlc2V0LmtleSB8fCBzZWxmLmFjdGl2ZVByZXNldC5pZCkgOiBudWxsLAogICAgICAgICAgb25TZWxlY3Q6IG9uU2VsZWN0CiAgICAgICAgfSkgfHwgbnVsbDsKICAgICAgICByZW5kZXJlZCA9IGhvc3QuY2hpbGROb2Rlcy5sZW5ndGggPiAwOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmVuZGVyZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKCFyZW5kZXJlZCkgdGhpcy5yZW5kZXJGYWxsYmFja0NoaXBzKGhvc3QsIG9uU2VsZWN0KTsKICB9OwoKICB2YXIgRkFMTEJBQ0tfUFJFU0VUUyA9IFsKICAgIHsgaWQ6ICdyZW1vdmVBbGxGdXJuaXR1cmUnLCBuYW1lOiAnRW1wdHkgUm9vbScsIHByb21wdDogJ1JlbW92ZSBhbGwgZnVybml0dXJlLCBwZXJzb25hbCBpdGVtcywgY2x1dHRlciwgYW5kIGJlbG9uZ2luZ3MgZnJvbSB0aGUgcm9vbSB3aGlsZSBrZWVwaW5nIHRoZSBhcmNoaXRlY3R1cmFsIGZlYXR1cmVzLCB3YWxscywgd2luZG93cywgYW5kIGZsb29yaW5nIGV4YWN0bHkgdGhlIHNhbWUuIENyZWF0ZSBhIGNvbXBsZXRlbHkgZW1wdHksIGNsZWFuIHNwYWNlIHJlYWR5IGZvciBwcm9mZXNzaW9uYWwgc3RhZ2luZy4nIH0sCiAgICB7IGlkOiAncmVtb3ZlQ2x1dHRlcicsIG5hbWU6ICdEZWNsdXR0ZXInLCBwcm9tcHQ6ICdSZW1vdmUgY2x1dHRlciwgcGVyc29uYWwgaXRlbXMsIGFuZCBzbWFsbCBiZWxvbmdpbmdzIHdoaWxlIGtlZXBpbmcgdGhlIGV4aXN0aW5nIGZ1cm5pdHVyZSBhbmQgbGF5b3V0IGludGFjdC4gTWFrZSB0aGUgc3BhY2UgbG9vayB0aWR5IGFuZCBjbGVhbi4nIH0sCiAgICB7IGlkOiAnbW9kZXJuU3RhZ2luZycsIG5hbWU6ICdNb2Rlcm4gU3RhZ2luZycsIHByb21wdDogJ1N0YWdlIHRoaXMgcm9vbSB3aXRoIGNsZWFuIG1vZGVybiBmdXJuaXR1cmUsIG5ldXRyYWwgdG9uZXMsIGFuZCB0YXN0ZWZ1bCBkZWNvciBmb3IgYSBwcm9mZXNzaW9uYWwgcmVhbC1lc3RhdGUgbGlzdGluZy4nIH0sCiAgICB7IGlkOiAnaW1wcm92ZUxpZ2h0aW5nJywgbmFtZTogJ0JldHRlciBMaWdodCcsIHByb21wdDogJ0ltcHJvdmUgdGhlIGxpZ2h0aW5nIHRvIGJyaWdodCwgd2FybSwgbmF0dXJhbCBkYXlsaWdodCB3aGlsZSBrZWVwaW5nIGV2ZXJ5dGhpbmcgZWxzZSB0aGUgc2FtZS4nIH0sCiAgICB7IGlkOiAnYWRkTGFuZHNjYXBpbmcnLCBuYW1lOiAnQWRkIExhbmRzY2FwaW5nJywgcHJvbXB0OiAnQWRkIGx1c2gsIHdlbGwtbWFpbnRhaW5lZCBsYW5kc2NhcGluZyB3aXRoIGhlYWx0aHkgcGxhbnRzLCBmcmVzaCBtdWxjaCwgYW5kIGNsZWFuIGVkZ2VzIHRvIHRoZSBleHRlcmlvci4nIH0sCiAgICB7IGlkOiAnaW1wcm92ZUV4dGVyaW9yJywgbmFtZTogJ0ZpeCBFeHRlcmlvcicsIHByb21wdDogJ1JlcGFpciBhbmQgcmVmcmVzaCB0aGUgZXh0ZXJpb3Ig4oCUIGNsZWFuIHNpZGluZywgY3Jpc3AgdHJpbSwgYW5kIGEgdGlkeSwgd2VsbC1rZXB0IGZhY2FkZS4nIH0KICBdOwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZW5kZXJGYWxsYmFja0NoaXBzID0gZnVuY3Rpb24gKGhvc3QsIG9uU2VsZWN0KSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBob3N0LmlubmVySFRNTCA9ICcnOwogICAgdmFyIHNjcm9sbGVyID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNoaXAtcm93Jywgcm9sZTogJ2xpc3Rib3gnLCAnYXJpYS1sYWJlbCc6ICdTdHlsZSBwcmVzZXRzJyB9KTsKICAgIGhvc3QuYXBwZW5kQ2hpbGQoc2Nyb2xsZXIpOwogICAgRkFMTEJBQ0tfUFJFU0VUUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7CiAgICAgIHZhciBhY3RpdmUgPSBzZWxmLmFjdGl2ZVByZXNldCAmJiBzZWxmLmFjdGl2ZVByZXNldC5pZCA9PT0gcC5pZDsKICAgICAgdmFyIGNoaXAgPSBlbCgnYnV0dG9uJywgewogICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgIGNsYXNzOiAndi1jaGlwJyArIChhY3RpdmUgPyAnIHYtY2hpcC0tYWN0aXZlJyA6ICcnKSwKICAgICAgICByb2xlOiAnb3B0aW9uJywgJ2FyaWEtc2VsZWN0ZWQnOiBhY3RpdmUgPyAndHJ1ZScgOiAnZmFsc2UnCiAgICAgIH0sIHAubmFtZSk7CiAgICAgIHNlbGYub24oY2hpcCwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgIG9uU2VsZWN0KHApOwogICAgICAgIHZhciBub2RlcyA9IHNjcm9sbGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy52LWNoaXAnKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBub2Rlc1tpXS5jbGFzc0xpc3QucmVtb3ZlKCd2LWNoaXAtLWFjdGl2ZScpOwogICAgICAgICAgbm9kZXNbaV0uc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgJ2ZhbHNlJyk7CiAgICAgICAgfQogICAgICAgIGlmIChzZWxmLmFjdGl2ZVByZXNldCAmJiBzZWxmLmFjdGl2ZVByZXNldC5pZCA9PT0gcC5pZCkgewogICAgICAgICAgY2hpcC5jbGFzc0xpc3QuYWRkKCd2LWNoaXAtLWFjdGl2ZScpOwogICAgICAgICAgY2hpcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCAndHJ1ZScpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHNjcm9sbGVyLmFwcGVuZENoaWxkKGNoaXApOwogICAgfSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRTZWxlY3RvcnMgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgcm93ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fc2VsZWN0b3JzJyB9KTsKCiAgICB2YXIgbW9kZWxGaWVsZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCcgfSwKICAgICAgZWwoJ2xhYmVsJywgeyBjbGFzczogJ3YtZXllYnJvdycsIGZvcjogJ3YtbW9kZWwnIH0sICdNb2RlbCcpKTsKICAgIHZhciBtb2RlbFNlbCA9IGVsKCdzZWxlY3QnLCB7IGlkOiAndi1tb2RlbCcsIGNsYXNzOiAndi1zZWxlY3QnLCAnYXJpYS1sYWJlbCc6ICdNb2RlbCcgfSk7CiAgICBtb2RlbHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgIHZhciBiaXRzID0gW20ubGFiZWwgfHwgbS5yYXddOwogICAgICBpZiAobS5zdWJoZWFkaW5nKSBiaXRzLnB1c2gobS5zdWJoZWFkaW5nKTsKICAgICAgaWYgKHR5cGVvZiBtLmNvc3QgPT09ICdudW1iZXInKSBiaXRzLnB1c2gobS5jb3N0ICsgJyBjcicpOwogICAgICB2YXIgb3B0ID0gZWwoJ29wdGlvbicsIHsgdmFsdWU6IG0ucmF3IH0sIGJpdHMuam9pbignICDCtyAgJykpOwogICAgICBpZiAobS5yYXcgPT09IHNlbGYubW9kZWxSYXcpIG9wdC5zZWxlY3RlZCA9IHRydWU7CiAgICAgIG1vZGVsU2VsLmFwcGVuZENoaWxkKG9wdCk7CiAgICB9KTsKICAgIHRoaXMub24obW9kZWxTZWwsICdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHNlbGYubW9kZWxSYXcgPSBtb2RlbFNlbC52YWx1ZTsKICAgICAgd3JpdGVQZXJzaXN0ZWQoJ21vZGVsJywgc2VsZi5tb2RlbFJhdyk7CiAgICAgIHZhciBtYXggPSBtYXhSZWZGb3Ioc2VsZi5jdXJyZW50TW9kZWwoKSk7CiAgICAgIGlmIChzZWxmLnJlZnMubGVuZ3RoID4gbWF4KSB7CiAgICAgICAgd2hpbGUgKHNlbGYucmVmcy5sZW5ndGggPiBtYXgpIHsKICAgICAgICAgIHZhciByID0gc2VsZi5yZWZzLnBvcCgpOwogICAgICAgICAgaWYgKHIgJiYgci51cmwgJiYgci51cmwuaW5kZXhPZignYmxvYjonKSA9PT0gMCkgeyB0cnkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHIudXJsKTsgfSBjYXRjaCAoZSkge30gfQogICAgICAgIH0KICAgICAgICB0b2FzdCgnVHJpbW1lZCB0byAnICsgbWF4ICsgJyBpbWFnZScgKyAobWF4ID4gMSA/ICdzJyA6ICcnKSArICcgZm9yICcgKyAoc2VsZi5jdXJyZW50TW9kZWwoKS5sYWJlbCB8fCAnbW9kZWwnKSArICcuJywgJ2luZm8nKTsKICAgICAgfQogICAgICBzZWxmLnJlbmRlckltYWdlWm9uZSgpOwogICAgICBzZWxmLnJlZnJlc2hDVEEoKTsKICAgIH0pOwogICAgbW9kZWxGaWVsZC5hcHBlbmRDaGlsZChtb2RlbFNlbCk7CiAgICB2YXIgbW9kZWxIaW50ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YiB2LWNyZWF0ZV9fc2Vsbm90ZScgfSk7CiAgICB0aGlzLl9tb2RlbEhpbnQgPSBtb2RlbEhpbnQ7CiAgICBtb2RlbEZpZWxkLmFwcGVuZENoaWxkKG1vZGVsSGludCk7CiAgICByb3cuYXBwZW5kQ2hpbGQobW9kZWxGaWVsZCk7CgogICAgdmFyIGFzcGVjdEZpZWxkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWZpZWxkLWdyb3VwIHYtY3JlYXRlX19hc3BlY3QnIH0sCiAgICAgIGVsKCdsYWJlbCcsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnLCBmb3I6ICd2LWFzcGVjdCcgfSwgJ0FzcGVjdCByYXRpbycpKTsKICAgIHZhciBhc3BlY3RTZWwgPSBlbCgnc2VsZWN0JywgeyBpZDogJ3YtYXNwZWN0JywgY2xhc3M6ICd2LXNlbGVjdCcsICdhcmlhLWxhYmVsJzogJ0FzcGVjdCByYXRpbycgfSk7CiAgICBhc3BlY3RzKCkuZm9yRWFjaChmdW5jdGlvbiAoYSkgewogICAgICB2YXIgb3B0ID0gZWwoJ29wdGlvbicsIHsgdmFsdWU6IGEucmF3IH0sIChhLmxhYmVsIHx8IGEucmF3KSArICcgIMK3ICAnICsgYS53ICsgJ8OXJyArIGEuaCk7CiAgICAgIGlmIChhLnJhdyA9PT0gc2VsZi5hc3BlY3RSYXcpIG9wdC5zZWxlY3RlZCA9IHRydWU7CiAgICAgIGFzcGVjdFNlbC5hcHBlbmRDaGlsZChvcHQpOwogICAgfSk7CiAgICB0aGlzLm9uKGFzcGVjdFNlbCwgJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgc2VsZi5hc3BlY3RSYXcgPSBhc3BlY3RTZWwudmFsdWU7CiAgICAgIHdyaXRlUGVyc2lzdGVkKCdhc3BlY3QnLCBzZWxmLmFzcGVjdFJhdyk7CiAgICB9KTsKICAgIGFzcGVjdEZpZWxkLmFwcGVuZENoaWxkKGFzcGVjdFNlbCk7CiAgICB2YXIgYXNwZWN0Tm90ZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zZWN0aW9uX19zdWIgdi1jcmVhdGVfX3NlbG5vdGUnIH0sICdPdXRwdXQgZGltZW5zaW9ucyBmb3IgdGV4dC10by1pbWFnZS4nKTsKICAgIGFzcGVjdEZpZWxkLmFwcGVuZENoaWxkKGFzcGVjdE5vdGUpOwogICAgdGhpcy5fYXNwZWN0RmllbGQgPSBhc3BlY3RGaWVsZDsKICAgIHRoaXMuX2FzcGVjdFNlbCA9IGFzcGVjdFNlbDsKICAgIHRoaXMuX2FzcGVjdE5vdGUgPSBhc3BlY3ROb3RlOwogICAgcm93LmFwcGVuZENoaWxkKGFzcGVjdEZpZWxkKTsKCiAgICB0aGlzLnJlZnJlc2hNb2RlbEhpbnQoKTsKICAgIHJldHVybiByb3c7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUucmVmcmVzaE1vZGVsSGludCA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdGhpcy5fbW9kZWxIaW50KSByZXR1cm47CiAgICB2YXIgYyA9IHRoaXMudW5pdENvc3QoKTsKICAgIHZhciBjcmVkcyA9IGMgKyAnIGNyZWRpdCcgKyAoYyA9PT0gMSA/ICcnIDogJ3MnKSArICcgcGVyIGdlbmVyYXRpb24nOwogICAgaWYgKHRoaXMuaXNUMkkoKSkgewogICAgICB0aGlzLl9tb2RlbEhpbnQudGV4dENvbnRlbnQgPSAnR2VuZXJhdGVzIGZyb20gdGV4dCDCtyAnICsgY3JlZHM7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBtID0gdGhpcy5jdXJyZW50TW9kZWwoKTsKICAgIHZhciBtYXggPSBtYXhSZWZGb3IobSk7CiAgICB0aGlzLl9tb2RlbEhpbnQudGV4dENvbnRlbnQgPSAobWF4ID4gMSkKICAgICAgPyAoJ1VwIHRvICcgKyBtYXggKyAnIHJlZmVyZW5jZSBpbWFnZXMgwrcgJyArIGNyZWRzKQogICAgICA6IGNyZWRzOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnJlZnJlc2hBc3BlY3RWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLl9hc3BlY3RGaWVsZCkgcmV0dXJuOwogICAgdmFyIGVkaXRpbmcgPSB0aGlzLmhhc0lucHV0KCk7CiAgICB0aGlzLl9hc3BlY3RGaWVsZC5jbGFzc0xpc3QudG9nZ2xlKCdpcy1kaXNhYmxlZCcsIGVkaXRpbmcpOwogICAgaWYgKHRoaXMuX2FzcGVjdFNlbCkgdGhpcy5fYXNwZWN0U2VsLmRpc2FibGVkID0gZWRpdGluZzsKICAgIGlmICh0aGlzLl9hc3BlY3ROb3RlKSB7CiAgICAgIHRoaXMuX2FzcGVjdE5vdGUudGV4dENvbnRlbnQgPSBlZGl0aW5nCiAgICAgICAgPyAnTG9ja2VkIOKAlCBlZGl0cyBrZWVwIHRoZSBzb3VyY2UgaW1hZ2UgcHJvcG9ydGlvbnMuJwogICAgICAgIDogJ091dHB1dCBkaW1lbnNpb25zIGZvciB0ZXh0LXRvLWltYWdlLic7CiAgICB9CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRBY3Rpb25zID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIGJhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX2FjdGlvbnMnIH0pOwoKICAgIHZhciBjdGEgPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWNyZWF0ZV9fZ28nIH0pOwogICAgdGhpcy5fY3RhID0gY3RhOwogICAgdGhpcy5vbihjdGEsICdjbGljaycsIGZ1bmN0aW9uICgpIHsgc2VsZi5nZW5lcmF0ZSgpOyB9KTsKICAgIGJhci5hcHBlbmRDaGlsZChjdGEpOwoKICAgIHZhciB2YXJCdG4gPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jcmVhdGVfX3ZhcicsCiAgICAgICdhcmlhLXByZXNzZWQnOiAnZmFsc2UnLCB0aXRsZTogJ0dlbmVyYXRlIGZvdXIgYXQgb25jZScgfSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jdGFfX2ljb24nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIGh0bWw6IGljb24oJ3NwYXJrbGVzJykgfHwgJ+KcpicgfSksCiAgICAgIGVsKCdzcGFuJywgbnVsbCwgJ8OXNCcpKTsKICAgIHRoaXMub24odmFyQnRuLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgIHNlbGYudmFyaWF0aW9ucyA9ICFzZWxmLnZhcmlhdGlvbnM7CiAgICAgIHZhckJ0bi5jbGFzc0xpc3QudG9nZ2xlKCd2LWN0YS0tYnJhbmQnLCBzZWxmLnZhcmlhdGlvbnMpOwogICAgICB2YXJCdG4uY2xhc3NMaXN0LnRvZ2dsZSgndi1jdGEtLWdob3N0JywgIXNlbGYudmFyaWF0aW9ucyk7CiAgICAgIHZhckJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIHNlbGYudmFyaWF0aW9ucyA/ICd0cnVlJyA6ICdmYWxzZScpOwogICAgICBzZWxmLnJlZnJlc2hDVEEoKTsKICAgIH0pOwogICAgdGhpcy5fdmFyQnRuID0gdmFyQnRuOwogICAgYmFyLmFwcGVuZENoaWxkKHZhckJ0bik7CgogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3JlYXRlX19hY3Rpb253cmFwJyB9LCBiYXIsCiAgICAgIGVsKCdwJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViIHYtY3JlYXRlX19sZWdhbCcgfSwKICAgICAgICAnQ3JlZGl0cyBhcmUgc3BlbnQgcGVyIGdlbmVyYXRpb24uICcsCiAgICAgICAgZWwoJ2EnLCB7IGhyZWY6ICcjL2FjY291bnQnLCBjbGFzczogJ3YtbGluaycgfSwgJ01hbmFnZSBjcmVkaXRzJykpKTsKCiAgICByZXR1cm4gd3JhcDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZWZyZXNoQ1RBID0gZnVuY3Rpb24gKCkgewogICAgaWYgKHRoaXMuX2N0YSkgewogICAgICB2YXIgb2sgPSB0aGlzLmNhblN1Ym1pdCgpOwogICAgICB0aGlzLl9jdGEuZGlzYWJsZWQgPSAhb2s7CiAgICAgIHRoaXMuX2N0YS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnLCBvayA/ICdmYWxzZScgOiAndHJ1ZScpOwogICAgICB0aGlzLl9jdGEuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtYnVzeScsICEhdGhpcy5idXN5KTsKICAgICAgdmFyIGNvc3QgPSB0aGlzLnRvdGFsQ29zdCgpOwogICAgICB2YXIgY291bnQgPSB0aGlzLnZhcmlhdGlvbnMgPyA0IDogMTsKICAgICAgdmFyIGxhYmVsID0gdGhpcy5oYXNJbnB1dCgpID8gJ1RyYW5zZm9ybScgOiAnR2VuZXJhdGUnOwogICAgICB0aGlzLl9jdGEuaW5uZXJIVE1MID0gJyc7CiAgICAgIGlmICh0aGlzLmJ1c3kpIHsKICAgICAgICB0aGlzLl9jdGEuc2V0QXR0cmlidXRlKCdhcmlhLWJ1c3knLCAndHJ1ZScpOwogICAgICAgIHRoaXMuX2N0YS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fZ28tc3BpbicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KSk7CiAgICAgICAgdGhpcy5fY3RhLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3JlYXRlX19nby1sYWJlbCcgfSwgJ1dvcmtpbmfigKYnKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5fY3RhLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1idXN5Jyk7CiAgICAgICAgdGhpcy5fY3RhLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3RhX19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBodG1sOiBpY29uKCdib2x0JykgfHwgJ+KaoScgfSkpOwogICAgICAgIHRoaXMuX2N0YS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fZ28tbGFiZWwnIH0sCiAgICAgICAgICBsYWJlbCArIChjb3VudCA+IDEgPyAoJyDDlycgKyBjb3VudCkgOiAnJykpKTsKICAgICAgICB0aGlzLl9jdGEuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVhdGVfX2dvLWNvc3QnIH0sIGNvc3QgKyAnIGNyJykpOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5fdmFyQnRuKSB0aGlzLl92YXJCdG4uZGlzYWJsZWQgPSAhIXRoaXMuYnVzeTsKICAgIHRoaXMucmVmcmVzaE1vZGVsSGludCgpOwogICAgdGhpcy5yZWZyZXNoUHJvbXB0SGVscCgpOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmJ1aWxkU2lkZSA9IGZ1bmN0aW9uIChsaWJyYXJ5RW1wdHkpIHsKICAgIHZhciBjb2wgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CgogICAgaWYgKGxpYnJhcnlFbXB0eSkgewogICAgICBjb2wuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX2hlYWQnIH0sCiAgICAgICAgZWwoJ2RpdicsIG51bGwsCiAgICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnIH0sICdJbnNwaXJhdGlvbicpLAogICAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1zZWN0aW9uX19zdWInIH0sICdUYXAgYW55IGxvb2sgdG8gbG9hZCBpdHMgcHJvbXB0LicpKSkpOwoKICAgICAgdmFyIGZlZWRIb3N0ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fZmVlZCcgfSk7CiAgICAgIHRoaXMuX2ZlZWRIb3N0ID0gZmVlZEhvc3Q7CiAgICAgIGNvbC5hcHBlbmRDaGlsZChmZWVkSG9zdCk7CiAgICAgIHRoaXMucmVuZGVySW5saW5lRmVlZChmZWVkSG9zdCk7CiAgICB9IGVsc2UgewogICAgICBjb2wuYXBwZW5kQ2hpbGQodGhpcy5idWlsZFJlY2VudFN0cmlwKCkpOwogICAgfQogICAgcmV0dXJuIGNvbDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZW5kZXJJbmxpbmVGZWVkID0gZnVuY3Rpb24gKGhvc3QpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciByZW5kZXJlZCA9IGZhbHNlOwogICAgaWYgKFYudmlld3MuZmVlZCAmJiB0eXBlb2YgVi52aWV3cy5mZWVkLnJlbmRlcklubGluZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgewogICAgICAgIHZhciBvdXQgPSBWLnZpZXdzLmZlZWQucmVuZGVySW5saW5lKGhvc3QsIHsKICAgICAgICAgIG9uQXBwbHk6IGZ1bmN0aW9uIChleGFtcGxlKSB7IHNlbGYuYXBwbHlFeGFtcGxlKGV4YW1wbGUpOyB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKG91dCBpbnN0YW5jZW9mIE5vZGUgJiYgb3V0ICE9PSBob3N0KSBob3N0LmFwcGVuZENoaWxkKG91dCk7CiAgICAgICAgcmVuZGVyZWQgPSBob3N0LmNoaWxkTm9kZXMubGVuZ3RoID4gMCB8fCBvdXQgIT0gbnVsbDsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJlbmRlcmVkID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmICghcmVuZGVyZWQpIHRoaXMucmVuZGVyRmVlZEZhbGxiYWNrKGhvc3QpOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnJlbmRlckZlZWRGYWxsYmFjayA9IGZ1bmN0aW9uIChob3N0KSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBob3N0LmlubmVySFRNTCA9ICcnOwogICAgdmFyIHNrID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWdyaWQgdi1ncmlkLS1hdXRvJyB9KTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgIGlmICh1aSgpLnNrZWxldG9uKSB7IHRyeSB7IHNrLmFwcGVuZENoaWxkKHVpKCkuc2tlbGV0b24oJ2NhcmQnKSk7IGNvbnRpbnVlOyB9IGNhdGNoIChlKSB7fSB9CiAgICAgIHNrLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbicsIHN0eWxlOiAnYXNwZWN0LXJhdGlvOjEvMScgfSkpOwogICAgfQogICAgaG9zdC5hcHBlbmRDaGlsZChzayk7CgogICAgaWYgKCFhcGkoKS5jdXJhdGVkRmVlZCkgewogICAgICBob3N0LmlubmVySFRNTCA9ICcnOwogICAgICBob3N0LmFwcGVuZENoaWxkKGVtcHR5QmxvY2soJ1lvdXIgY3JlYXRpb25zIHdpbGwgYXBwZWFyIGhlcmUuJywgJ1N0YXJ0IGJ5IHdyaXRpbmcgYSBwcm9tcHQgb3IgZHJvcHBpbmcgYW4gaW1hZ2UuJywgJ2ltYWdlJykpOwogICAgICByZXR1cm47CiAgICB9CiAgICBhcGkoKS5jdXJhdGVkRmVlZCgwLCAxMikudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgIGlmIChzZWxmLl9kZXN0cm95ZWQpIHJldHVybjsKICAgICAgdmFyIGl0ZW1zID0gKHJlcyAmJiAocmVzLml0ZW1zIHx8IHJlcykpIHx8IFtdOwogICAgICBob3N0LmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgewogICAgICAgIGhvc3QuYXBwZW5kQ2hpbGQoZW1wdHlCbG9jaygnTm8gaW5zcGlyYXRpb24geWV0LicsICdCZSB0aGUgZmlyc3QgdG8gY3JlYXRlIHNvbWV0aGluZy4nLCAnc3BhcmtsZXMnKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBncmlkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWdyaWQgdi1ncmlkLS1hdXRvIHYtY3JlYXRlX19mZWVkZ3JpZCcgfSk7CiAgICAgIHZhciBzaG93biA9IDA7CiAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKHJhdykgewogICAgICAgIHZhciBpbWFnZSA9IG5vcm1hbGl6ZUZlZWRJbWFnZShyYXcpOwogICAgICAgIGlmICghaW1hZ2VVUkxPZihpbWFnZSkpIHJldHVybjsKICAgICAgICB2YXIgY2FyZCA9IHNlbGYuZmVlZENhcmQoaW1hZ2UpOwogICAgICAgIGlmIChjYXJkKSB7IGdyaWQuYXBwZW5kQ2hpbGQoY2FyZCk7IHNob3duKys7IH0KICAgICAgfSk7CiAgICAgIGlmICghc2hvd24pIHsKICAgICAgICBob3N0LmFwcGVuZENoaWxkKGVtcHR5QmxvY2soJ05vIGluc3BpcmF0aW9uIHlldC4nLCAnQmUgdGhlIGZpcnN0IHRvIGNyZWF0ZSBzb21ldGhpbmcuJywgJ3NwYXJrbGVzJykpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBob3N0LmFwcGVuZENoaWxkKGdyaWQpOwogICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICBpZiAoc2VsZi5fZGVzdHJveWVkKSByZXR1cm47CiAgICAgIGhvc3QuaW5uZXJIVE1MID0gJyc7CiAgICAgIGhvc3QuYXBwZW5kQ2hpbGQoZW1wdHlCbG9jaygnQ291bGRu4oCZdCBsb2FkIGluc3BpcmF0aW9uLicsICdDaGVjayB5b3VyIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4nLCAnd2FybmluZycpKTsKICAgIH0pOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmZlZWRDYXJkID0gZnVuY3Rpb24gKGltYWdlKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBpZiAoIWltYWdlVVJMT2YoaW1hZ2UpKSByZXR1cm4gbnVsbDsKICAgIHZhciBub2RlOwogICAgaWYgKHVpKCkuaW1nQ2FyZCkgewogICAgICB0cnkgewogICAgICAgIG5vZGUgPSB1aSgpLmltZ0NhcmQoaW1hZ2UsIHsgb25UYXA6IGZ1bmN0aW9uICgpIHsgc2VsZi5hcHBseUV4YW1wbGUoaW1hZ2UpOyB9LCBiZWZvcmVBZnRlcjogdHJ1ZSB9KTsKICAgICAgfSBjYXRjaCAoZSkgeyBub2RlID0gbnVsbDsgfQogICAgfQogICAgaWYgKCFub2RlKSB7CiAgICAgIHZhciB1cmwgPSBpbWFnZS5yZW1vdGVJbWFnZVVSTDsKICAgICAgaWYgKCF1cmwpIHJldHVybiBudWxsOwogICAgICBub2RlID0gZWwoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzOiAndi1jYXJkIHYtY2FyZC0tcGFkLTAgdi1jYXJkLS10YXBwYWJsZScgfSwKICAgICAgICBlbCgnaW1nJywgeyBjbGFzczogJ3YtY2FyZF9fbWVkaWEnLCBzcmM6IHVybCwgYWx0OiBpbWFnZS5wcm9tcHQgPyBlc2MoaW1hZ2UucHJvbXB0KS5zbGljZSgwLCA4MCkgOiAnaW5zcGlyYXRpb24nLCBsb2FkaW5nOiAnbGF6eScgfSkpOwogICAgICB0aGlzLm9uKG5vZGUsICdjbGljaycsIGZ1bmN0aW9uICgpIHsgc2VsZi5hcHBseUV4YW1wbGUoaW1hZ2UpOyB9KTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmJ1aWxkUmVjZW50U3RyaXAgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgY29sID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogICAgY29sLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zZWN0aW9uX19oZWFkJyB9LAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnIH0sICdSZWNlbnQnKSwKICAgICAgZWwoJ2EnLCB7IGhyZWY6ICcjL2xpYnJhcnknLCBjbGFzczogJ3YtbGluaycgfSwgJ1NlZSBhbGwnKSkpOwoKICAgIHZhciBncmlkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWdyaWQgdi1ncmlkLS1hdXRvIHYtY3JlYXRlX19yZWNlbnQnIH0pOwogICAgdmFyIGxpYiA9IChzdGF0ZSgpLmxpYnJhcnkgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoaW1nKSB7CiAgICAgIHJldHVybiAhIWltYWdlVVJMT2YoaW1nKTsKICAgIH0pLnNsaWNlKDAsIDYpOwogICAgaWYgKCFsaWIubGVuZ3RoKSB7CiAgICAgIGNvbC5hcHBlbmRDaGlsZChlbXB0eUJsb2NrKCdZb3VyIGNyZWF0aW9ucyB3aWxsIGFwcGVhciBoZXJlLicsICdHZW5lcmF0ZSBzb21ldGhpbmcgdG8gZmlsbCB5b3VyIGxpYnJhcnkuJywgJ2ltYWdlJykpOwogICAgICByZXR1cm4gY29sOwogICAgfQogICAgbGliLmZvckVhY2goZnVuY3Rpb24gKGltZykgewogICAgICB2YXIgdXJsID0gaW1hZ2VVUkxPZihpbWcpOwogICAgICB2YXIgbm9kZTsKICAgICAgaWYgKHVpKCkuaW1nQ2FyZCkgewogICAgICAgIHRyeSB7IG5vZGUgPSB1aSgpLmltZ0NhcmQoaW1nLCB7IG9uVGFwOiBmdW5jdGlvbiAoKSB7IGdvKCcjL2ltYWdlLycgKyAoaW1nLnJlbW90ZUlEIHx8IGltZy5pZCkpOyB9LCBiZWZvcmVBZnRlcjogdHJ1ZSB9KTsgfQogICAgICAgIGNhdGNoIChlKSB7IG5vZGUgPSBudWxsOyB9CiAgICAgIH0KICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgbm9kZSA9IGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtY2FyZCB2LWNhcmQtLXBhZC0wIHYtY2FyZC0tdGFwcGFibGUnIH0sCiAgICAgICAgICBlbCgnaW1nJywgeyBjbGFzczogJ3YtY2FyZF9fbWVkaWEnLCBzcmM6IHVybCwgYWx0OiBpbWcucHJvbXB0ID8gZXNjKGltZy5wcm9tcHQpLnNsaWNlKDAsIDYwKSA6ICdjcmVhdGlvbicsIGxvYWRpbmc6ICdsYXp5JyB9KSk7CiAgICAgICAgc2VsZi5vbihub2RlLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7IGdvKCcjL2ltYWdlLycgKyAoaW1nLnJlbW90ZUlEIHx8IGltZy5pZCkpOyB9KTsKICAgICAgfQogICAgICBncmlkLmFwcGVuZENoaWxkKG5vZGUpOwogICAgfSk7CiAgICBjb2wuYXBwZW5kQ2hpbGQoZ3JpZCk7CiAgICByZXR1cm4gY29sOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmFwcGx5RXhhbXBsZSA9IGZ1bmN0aW9uIChleGFtcGxlKSB7CiAgICBpZiAoIWV4YW1wbGUpIHJldHVybjsKICAgIHZhciBleCA9IG5vcm1hbGl6ZUZlZWRJbWFnZShleGFtcGxlKTsKICAgIHZhciByZWZVUkwgPSBleGFtcGxlLnJlZmVyZW5jZVVSTCB8fCBudWxsOwogICAgdGhpcy5hY3RpdmVQcmVzZXQgPSBudWxsOwogICAgaWYgKHRoaXMuX3ByZXNldEN0bCAmJiB0aGlzLl9wcmVzZXRDdGwuc2V0QWN0aXZlKSB7IHRyeSB7IHRoaXMuX3ByZXNldEN0bC5zZXRBY3RpdmUobnVsbCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIHRoaXMucHJvbXB0ID0gZXgucHJvbXB0IHx8ICcnOwogICAgaWYgKHRoaXMuX3Byb21wdEZpZWxkKSB7IHRoaXMuX3Byb21wdEZpZWxkLnZhbHVlID0gdGhpcy5wcm9tcHQ7IH0KICAgIGlmIChleC5tb2RlbCAmJiBtb2RlbEJ5UmF3KGV4Lm1vZGVsKS5yYXcgPT09IGV4Lm1vZGVsKSB7CiAgICAgIHRoaXMubW9kZWxSYXcgPSBleC5tb2RlbDsKICAgICAgdmFyIHNlbCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcjdi1tb2RlbCcpOwogICAgICBpZiAoc2VsKSBzZWwudmFsdWUgPSB0aGlzLm1vZGVsUmF3OwogICAgICB3cml0ZVBlcnNpc3RlZCgnbW9kZWwnLCB0aGlzLm1vZGVsUmF3KTsKICAgIH0KICAgIGlmIChyZWZVUkwpIHsKICAgICAgdmFyIG1heCA9IG1heFJlZkZvcih0aGlzLmN1cnJlbnRNb2RlbCgpKTsKICAgICAgdmFyIGR1cCA9IHRoaXMucmVmcy5zb21lKGZ1bmN0aW9uIChyKSB7IHJldHVybiByLnJlbW90ZVVSTCA9PT0gcmVmVVJMIHx8IHIudXJsID09PSByZWZVUkw7IH0pOwogICAgICBpZiAoIWR1cCAmJiB0aGlzLnJlZnMubGVuZ3RoIDwgbWF4KSB7CiAgICAgICAgdGhpcy5yZWZzLnB1c2goeyB1cmw6IHJlZlVSTCwgcmVtb3RlVVJMOiByZWZVUkwsIG5hbWU6ICdyZWZlcmVuY2UnIH0pOwogICAgICB9CiAgICAgIHRoaXMuYWZ0ZXJJbnB1dENoYW5nZSgpOwogICAgfQogICAgdGhpcy5yZWZyZXNoQ1RBKCk7CiAgICB0aGlzLnJlZnJlc2hNb2RlbEhpbnQoKTsKICAgIGlmICh0aGlzLl9wcm9tcHRGaWVsZCkgeyB0aGlzLl9wcm9tcHRGaWVsZC5mb2N1cygpOyB0aGlzLl9wcm9tcHRGaWVsZC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnKSk7IH0KICAgIHRvYXN0KHJlZlVSTCA/ICdSZWZlcmVuY2UgYWRkZWQg4oCUIHR3ZWFrIHRoZSBwcm9tcHQgYW5kIFRyYW5zZm9ybS4nIDogJ1Byb21wdCBsb2FkZWQg4oCUIHR3ZWFrIGl0IGFuZCBHZW5lcmF0ZS4nLCAnaW5mbycpOwogICAgdHJ5IHsgdGhpcy5yb290LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KTsgfSBjYXRjaCAoZSkge30KICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLmJ1c3kpIHJldHVybjsKICAgIGlmICghdGhpcy5jYW5TdWJtaXQoKSkgewogICAgICBpZiAoIXRoaXMuaGFzSW5wdXQoKSAmJiAodGhpcy5wcm9tcHQgfHwgJycpLnRyaW0oKS5sZW5ndGggPCA4KSB7CiAgICAgICAgdG9hc3QoJ0FkZCBhdCBsZWFzdCA4IGNoYXJhY3RlcnMgb3IgZHJvcCBhbiBpbWFnZSB0byBnZW5lcmF0ZS4nLCAnZXJyb3InKTsKICAgICAgICBpZiAodGhpcy5fcHJvbXB0RmllbGQpIHRoaXMuX3Byb21wdEZpZWxkLmZvY3VzKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIGNvdW50ID0gdGhpcy52YXJpYXRpb25zID8gNCA6IDE7CiAgICB0aGlzLnJ1bkJhdGNoKGNvdW50KTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5ydW5CYXRjaCA9IGZ1bmN0aW9uIChjb3VudCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdGhpcy5idXN5ID0gdHJ1ZTsKICAgIHRoaXMucmVmcmVzaENUQSgpOwoKICAgIHZhciB0b3RhbENvc3QgPSB0aGlzLnRvdGFsQ29zdCgpOwoKICAgIHRoaXMuZW5zdXJlQ3JlZGl0cyh0b3RhbENvc3QpLnRoZW4oZnVuY3Rpb24gKGhhdmVFbm91Z2gpIHsKICAgICAgaWYgKCFoYXZlRW5vdWdoKSB7CiAgICAgICAgc2VsZi5idXN5ID0gZmFsc2U7IHNlbGYucmVmcmVzaENUQSgpOwogICAgICAgIHRvYXN0KCdOb3QgZW5vdWdoIGNyZWRpdHMg4oCUIGFkZCBtb3JlIHRvIGtlZXAgY3JlYXRpbmcuJywgJ2luZm8nKTsKICAgICAgICBnbygnIy9wYXl3YWxsJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiBzZWxmLmRvR2VuZXJhdGlvbnMoY291bnQpOwogICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0cykgewogICAgICBzZWxmLmJ1c3kgPSBmYWxzZTsKICAgICAgc2VsZi5yZWZyZXNoQ1RBKCk7CiAgICAgIGlmIChyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoKSB7CiAgICAgICAgdmFyIGZpcnN0ID0gcmVzdWx0c1swXTsKICAgICAgICBnbygnIy9pbWFnZS8nICsgKGZpcnN0LnJlbW90ZUlEIHx8IGZpcnN0LmlkKSk7CiAgICAgICAgaWYgKHVpKCkuY29uZmV0dGkpIHsgdHJ5IHsgdWkoKS5jb25mZXR0aSgpOyB9IGNhdGNoIChlKSB7fSB9CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgc2VsZi5idXN5ID0gZmFsc2U7CiAgICAgIHNlbGYucmVmcmVzaENUQSgpOwogICAgICBzZWxmLmhpZGVPdmVybGF5KCk7CiAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykgeyB0b2FzdCgnR2VuZXJhdGlvbiBjYW5jZWxsZWQuJywgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICAgIHZhciBtc2cgPSAoZXJyICYmIChlcnIuZGVzY3JpcHRpb24gfHwgZXJyLm1lc3NhZ2UpKSB8fCAnR2VuZXJhdGlvbiBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uJzsKICAgICAgdG9hc3QobXNnLCAnZXJyb3InKTsKICAgIH0pOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmVuc3VyZUNyZWRpdHMgPSBmdW5jdGlvbiAoY29zdCkgewogICAgdmFyIHMgPSBzdGF0ZSgpOwogICAgZnVuY3Rpb24gZW5vdWdoKG4pIHsgcmV0dXJuIHR5cGVvZiBuID09PSAnbnVtYmVyJyAmJiBuID49IGNvc3Q7IH0KICAgIGlmIChlbm91Z2gocy5jcmVkaXRzKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTsKICAgIGlmICghYXBpKCkuY3JlZGl0cykgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTsKICAgIHJldHVybiBhcGkoKS5jcmVkaXRzKCkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgIHZhciBuID0gcmVzICYmICh0eXBlb2YgcmVzLmNyZWRpdHMgPT09ICdudW1iZXInID8gcmVzLmNyZWRpdHMgOiByZXMpOwogICAgICBzLmNyZWRpdHMgPSAodHlwZW9mIG4gPT09ICdudW1iZXInKSA/IG4gOiBzLmNyZWRpdHM7CiAgICAgIGlmIChWLnN0b3JlICYmIFYuc3RvcmUuZW1pdCkgVi5zdG9yZS5lbWl0KCdjcmVkaXRzOmNoYW5nZWQnLCBzLmNyZWRpdHMpOwogICAgICByZXR1cm4gZW5vdWdoKHMuY3JlZGl0cyk7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuZG9HZW5lcmF0aW9ucyA9IGZ1bmN0aW9uIChjb3VudCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHRoaXMuYWJvcnQgPSAodHlwZW9mIEFib3J0Q29udHJvbGxlciAhPT0gJ3VuZGVmaW5lZCcpID8gbmV3IEFib3J0Q29udHJvbGxlcigpIDogbnVsbDsKICAgIHZhciBzaWduYWwgPSB0aGlzLmFib3J0ID8gdGhpcy5hYm9ydC5zaWduYWwgOiB1bmRlZmluZWQ7CgogICAgdGhpcy5zaG93T3ZlcmxheShjb3VudCk7CgogICAgdmFyIHByZXAgPSB0aGlzLmhhc0lucHV0KCkgPyB0aGlzLnVwbG9hZEFsbChzaWduYWwpIDogUHJvbWlzZS5yZXNvbHZlKG51bGwpOwoKICAgIHZhciBjaGFpbiA9IHByZXAudGhlbihmdW5jdGlvbiAodXBsb2FkZWQpIHsKICAgICAgdmFyIHNlcSA9IFByb21pc2UucmVzb2x2ZSgpOwogICAgICB2YXIgZG9uZSA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgIChmdW5jdGlvbiAoaWR4KSB7CiAgICAgICAgICBzZXEgPSBzZXEudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmIChzZWxmLmFib3J0ICYmIHNlbGYuYWJvcnQuc2lnbmFsLmFib3J0ZWQpIHsgdmFyIGUgPSBuZXcgRXJyb3IoJ2Fib3J0ZWQnKTsgZS5uYW1lID0gJ0Fib3J0RXJyb3InOyB0aHJvdyBlOyB9CiAgICAgICAgICAgIHNlbGYuc2V0T3ZlcmxheVN0ZXAoZG9uZSwgY291bnQpOwogICAgICAgICAgICByZXR1cm4gc2VsZi5zaW5nbGVHZW5lcmF0aW9uKHVwbG9hZGVkLCBzaWduYWwsIGZ1bmN0aW9uIChmcmFjKSB7CiAgICAgICAgICAgICAgc2VsZi5zZXRPdmVybGF5UHJvZ3Jlc3MoZG9uZSwgY291bnQsIGZyYWMpOwogICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChpbWcpIHsKICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaW1nKTsKICAgICAgICAgICAgICBkb25lKys7CiAgICAgICAgICAgICAgc2VsZi5zZXRPdmVybGF5UHJvZ3Jlc3MoZG9uZSwgY291bnQsIDApOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0pKGkpOwogICAgICB9CiAgICAgIHJldHVybiBzZXE7CiAgICB9KTsKCiAgICByZXR1cm4gY2hhaW4udGhlbihmdW5jdGlvbiAoKSB7CiAgICAgIHNlbGYuaGlkZU92ZXJsYXkoKTsKICAgICAgc2VsZi5hYm9ydCA9IG51bGw7CiAgICAgIHJldHVybiByZXN1bHRzOwogICAgfSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUudXBsb2FkQWxsID0gZnVuY3Rpb24gKHNpZ25hbCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIG1heCA9IG1heFJlZkZvcih0aGlzLmN1cnJlbnRNb2RlbCgpKTsKICAgIHZhciB1c2UgPSB0aGlzLnJlZnMuc2xpY2UoMCwgbWF4KTsKICAgIGlmICghYXBpKCkudXBsb2FkSW1hZ2UpIHJldHVybiBQcm9taXNlLnJlamVjdChhcGlFcnIoJ1VwbG9hZCBpcyB1bmF2YWlsYWJsZS4nKSk7CgogICAgdGhpcy5zZXRPdmVybGF5TGFiZWwoJ1VwbG9hZGluZyB5b3VyIGltYWdlJyArICh1c2UubGVuZ3RoID4gMSA/ICdzJyA6ICcnKSArICfigKYnKTsKCiAgICB2YXIgc2VxID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB2YXIgdXJscyA9IFtdOwogICAgdXNlLmZvckVhY2goZnVuY3Rpb24gKHJlZikgewogICAgICBzZXEgPSBzZXEudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHNpZ25hbCAmJiBzaWduYWwuYWJvcnRlZCkgeyB2YXIgZSA9IG5ldyBFcnJvcignYWJvcnRlZCcpOyBlLm5hbWUgPSAnQWJvcnRFcnJvcic7IHRocm93IGU7IH0KICAgICAgICBpZiAocmVmLnJlbW90ZVVSTCkgeyB1cmxzLnB1c2gocmVmLnJlbW90ZVVSTCk7IHJldHVybjsgfQogICAgICAgIHJldHVybiBhcGkoKS51cGxvYWRJbWFnZShyZWYuZmlsZSwgJ3JlbmRlcicpLnRoZW4oZnVuY3Rpb24gKG1lZGlhVVJMKSB7CiAgICAgICAgICByZWYucmVtb3RlVVJMID0gbWVkaWFVUkw7CiAgICAgICAgICB1cmxzLnB1c2gobWVkaWFVUkwpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0pOwogICAgcmV0dXJuIHNlcS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKCF1cmxzLmxlbmd0aCkgdGhyb3cgYXBpRXJyKCdJbWFnZSB1cGxvYWQgcmV0dXJuZWQgbm8gVVJMLicpOwogICAgICByZXR1cm4geyBwcmltYXJ5OiB1cmxzWzBdLCBhbGw6IHVybHMgfTsKICAgIH0pOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnNpbmdsZUdlbmVyYXRpb24gPSBmdW5jdGlvbiAodXBsb2FkZWQsIHNpZ25hbCwgb25Qcm9ncmVzcykgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIHNlZWQgPSByYW5kb21TZWVkKCk7CiAgICB2YXIgcHJvbXB0ID0gdGhpcy5maW5hbFByb21wdCgpOwogICAgdmFyIG1vZGVsID0gdGhpcy5jdXJyZW50TW9kZWwoKTsKCiAgICBpZiAoIWFwaSgpLnBvbGwpIHJldHVybiBQcm9taXNlLnJlamVjdChhcGlFcnIoJ0dlbmVyYXRvciBjbGllbnQgdW5hdmFpbGFibGUuJykpOwoKICAgIHZhciBzdWJtaXRGbiwgcG9sbEZuOwogICAgdmFyIGlzRWRpdCA9ICEhdXBsb2FkZWQ7CgogICAgaWYgKGlzRWRpdCkgewogICAgICB0aGlzLnNldE92ZXJsYXlMYWJlbCh1cGxvYWRlZC5hbGwubGVuZ3RoID4gMSA/ICdBcHBseWluZyB5b3VyIHJlZmVyZW5jZSBpbWFnZXPigKYnIDogJ1JlaW1hZ2luaW5nIHlvdXIgaW1hZ2XigKYnKTsKICAgICAgdmFyIGJvZHkgPSBidWlsZEVkaXRCb2R5KG1vZGVsLCBwcm9tcHQsIHVwbG9hZGVkLCBzZWVkKTsKICAgICAgc3VibWl0Rm4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBhcGkoKS5nZW5FZGl0KG1vZGVsLnJhdywgYm9keSk7IH07CiAgICAgIHBvbGxGbiA9IGZ1bmN0aW9uIChyZXF1ZXN0SUQpIHsgcmV0dXJuIGFwaSgpLnBvbGxFZGl0KG1vZGVsLnJhdywgcmVxdWVzdElEKTsgfTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuc2V0T3ZlcmxheUxhYmVsKCdDcmVhdGluZyB5b3VyIGltYWdl4oCmJyk7CiAgICAgIHZhciBhc3AgPSBhc3BlY3RCeVJhdyh0aGlzLmFzcGVjdFJhdyk7CiAgICAgIHZhciB0MmlCb2R5ID0geyBwcm9tcHQ6IHByb21wdCwgc2VlZDogc2VlZCwgd2lkdGg6IGFzcC53LCBoZWlnaHQ6IGFzcC5oIH07CiAgICAgIHN1Ym1pdEZuID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gYXBpKCkuZ2VuVGV4dFRvSW1hZ2UodDJpQm9keSk7IH07CiAgICAgIHBvbGxGbiA9IGZ1bmN0aW9uIChyZXF1ZXN0SUQpIHsgcmV0dXJuIGFwaSgpLnBvbGxUZXh0VG9JbWFnZShyZXF1ZXN0SUQpOyB9OwogICAgfQoKICAgIHJldHVybiBhcGkoKS5wb2xsKHN1Ym1pdEZuLCBwb2xsRm4sIHsgb25Qcm9ncmVzczogb25Qcm9ncmVzcywgc2lnbmFsOiBzaWduYWwgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgIHZhciB1cmwgPSBleHRyYWN0UmVzdWx0VVJMKHJlc3VsdCk7CiAgICAgIGlmICghdXJsKSB7CiAgICAgICAgdmFyIGRlc2MgPSByZXN1bHQgJiYgcmVzdWx0LmRlc2NyaXB0aW9uOwogICAgICAgIHRocm93IGFwaUVycihkZXNjIHx8ICdUaGUgbW9kZWwgcmV0dXJuZWQgbm8gaW1hZ2UuIFRyeSBhIGRpZmZlcmVudCBwcm9tcHQgb3IgbW9kZWwuJyk7CiAgICAgIH0KICAgICAgdmFyIGltYWdlID0gc2VsZi5idWlsZEdlbmVyYXRlZEltYWdlKHsKICAgICAgICBwcm9tcHQ6IHByb21wdCwKICAgICAgICBtb2RlbFJhdzogaXNFZGl0ID8gbW9kZWwucmF3IDogJ2ZsdXgxU2NobmVsbCcsCiAgICAgICAgc2VlZDogKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnNlZWQgPT09ICdudW1iZXInKSA/IHJlc3VsdC5zZWVkIDogc2VlZCwKICAgICAgICByZXN1bHRVUkw6IHVybCwKICAgICAgICBvcmlnaW5hbFVSTDogaXNFZGl0ID8gdXBsb2FkZWQucHJpbWFyeSA6IG51bGwKICAgICAgfSk7CiAgICAgIHJldHVybiBzZWxmLnBlcnNpc3QoaW1hZ2UpOwogICAgfSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRHZW5lcmF0ZWRJbWFnZSA9IGZ1bmN0aW9uIChvKSB7CiAgICByZXR1cm4gewogICAgICBpZDogdXVpZCgpLAogICAgICBwcm9tcHQ6IG8ucHJvbXB0LAogICAgICBuZWdhdGl2ZVByb21wdDogbnVsbCwKICAgICAgc3RlcENvdW50OiA0LAogICAgICBzZWVkOiBvLnNlZWQsCiAgICAgIGRpc2FibGVTYWZldHk6IGZhbHNlLAogICAgICBjcmVhdGVkRGF0ZTogbm93SVNPKCksCiAgICAgIHJlbW90ZUltYWdlVVJMOiBvLnJlc3VsdFVSTCwKICAgICAgcmVtb3RlT3JpZ2luYWxJbWFnZVVSTDogby5vcmlnaW5hbFVSTCB8fCB1bmRlZmluZWQsCiAgICAgIG1vZGVsOiBvLm1vZGVsUmF3LAogICAgICBwdWJsaXNoZWQ6IGZhbHNlLAogICAgICBmYXZvcml0ZWQ6IGZhbHNlLAogICAgICBwcmVzZXRJRDogdGhpcy5hY3RpdmVQcmVzZXQgPyB0aGlzLmFjdGl2ZVByZXNldC5pZCA6IHVuZGVmaW5lZAogICAgfTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5wZXJzaXN0ID0gZnVuY3Rpb24gKGltYWdlKSB7CiAgICBmdW5jdGlvbiBjb21taXQoc2F2ZWQpIHsKICAgICAgdmFyIGdpID0gKHNhdmVkICYmIHNhdmVkLmdlbmVyYXRlZEltYWdlKSA/IHNhdmVkLmdlbmVyYXRlZEltYWdlIDogKHNhdmVkIHx8IGltYWdlKTsKICAgICAgaWYgKGdpICYmIGdpLnJlbW90ZUlEICYmICFpbWFnZS5yZW1vdGVJRCkgaW1hZ2UucmVtb3RlSUQgPSBnaS5yZW1vdGVJRDsKICAgICAgaWYgKGdpICYmIGdpLmlkICYmIGdpLnJlbW90ZUlEICYmIGltYWdlLmlkICE9PSBnaS5pZCkgaW1hZ2UucmVtb3RlSUQgPSBnaS5yZW1vdGVJRDsKICAgICAgdmFyIGZpbmFsSW1hZ2UgPSBtZXJnZUltYWdlKGltYWdlLCBnaSk7CiAgICAgIHN0YXRlKCkubGlicmFyeSA9IHN0YXRlKCkubGlicmFyeSB8fCBbXTsKICAgICAgc3RhdGUoKS5saWJyYXJ5LnVuc2hpZnQoZmluYWxJbWFnZSk7CiAgICAgIGlmIChWLnN0b3JlICYmIFYuc3RvcmUuZW1pdCkgVi5zdG9yZS5lbWl0KCdsaWJyYXJ5OmNoYW5nZWQnLCBzdGF0ZSgpLmxpYnJhcnkpOwogICAgICBpZiAoYXBpKCkuY3JlZGl0cykgewogICAgICAgIGFwaSgpLmNyZWRpdHMoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgIHZhciBuID0gcmVzICYmICh0eXBlb2YgcmVzLmNyZWRpdHMgPT09ICdudW1iZXInID8gcmVzLmNyZWRpdHMgOiByZXMpOwogICAgICAgICAgaWYgKHR5cGVvZiBuID09PSAnbnVtYmVyJykgeyBzdGF0ZSgpLmNyZWRpdHMgPSBuOyBpZiAoVi5zdG9yZSAmJiBWLnN0b3JlLmVtaXQpIFYuc3RvcmUuZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgbik7IH0KICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZpbmFsSW1hZ2U7CiAgICB9CgogICAgaWYgKCFhcGkoKS5wZXJzaXN0SW1hZ2UpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb21taXQobnVsbCkpOwogICAgfQogICAgcmV0dXJuIGFwaSgpLnBlcnNpc3RJbWFnZShpbWFnZSkudGhlbihmdW5jdGlvbiAoc2F2ZWQpIHsKICAgICAgcmV0dXJuIGNvbW1pdChzYXZlZCk7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgIHRvYXN0KCdTYXZlZCBsb2NhbGx5IOKAlCBjb3VsZG7igJl0IHN5bmMgdG8geW91ciBsaWJyYXJ5LicsICdpbmZvJyk7CiAgICAgIHJldHVybiBjb21taXQobnVsbCk7CiAgICB9KTsKICB9OwoKICBmdW5jdGlvbiBtZXJnZUltYWdlKGxvY2FsLCBzZXJ2ZXIpIHsKICAgIGlmICghc2VydmVyIHx8IHR5cGVvZiBzZXJ2ZXIgIT09ICdvYmplY3QnKSByZXR1cm4gbG9jYWw7CiAgICB2YXIgb3V0ID0ge307CiAgICB2YXIgazsKICAgIGZvciAoayBpbiBsb2NhbCkgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChsb2NhbCwgaykpIG91dFtrXSA9IGxvY2FsW2tdOwogICAgZm9yIChrIGluIHNlcnZlcikgewogICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXJ2ZXIsIGspKSBjb250aW51ZTsKICAgICAgaWYgKHNlcnZlcltrXSAhPSBudWxsKSBvdXRba10gPSBzZXJ2ZXJba107CiAgICB9CiAgICBpZiAoIW91dC5yZW1vdGVJbWFnZVVSTCkgb3V0LnJlbW90ZUltYWdlVVJMID0gbG9jYWwucmVtb3RlSW1hZ2VVUkw7CiAgICBpZiAobG9jYWwucmVtb3RlT3JpZ2luYWxJbWFnZVVSTCAmJiAhb3V0LnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwpIG91dC5yZW1vdGVPcmlnaW5hbEltYWdlVVJMID0gbG9jYWwucmVtb3RlT3JpZ2luYWxJbWFnZVVSTDsKICAgIHJldHVybiBvdXQ7CiAgfQoKICBmdW5jdGlvbiBidWlsZEVkaXRCb2R5KG1vZGVsLCBwcm9tcHQsIHVwbG9hZGVkLCBzZWVkKSB7CiAgICB2YXIgcmF3ID0gbW9kZWwucmF3OwogICAgdmFyIG1heCA9IG1heFJlZkZvcihtb2RlbCk7CiAgICB2YXIgbXVsdGkgPSBtYXggPiAxOwogICAgdmFyIGJvZHkgPSB7IHByb21wdDogcHJvbXB0LCBzZWVkOiBzZWVkIH07CgogICAgaWYgKG11bHRpKSB7CiAgICAgIGJvZHkuaW1hZ2VfdXJsID0gdXBsb2FkZWQucHJpbWFyeTsKICAgICAgYm9keS5pbWFnZV91cmxzID0gdXBsb2FkZWQuYWxsOwogICAgICBib2R5Lm51bV9pbWFnZXMgPSAxOwogICAgfSBlbHNlIHsKICAgICAgYm9keS5pbWFnZV91cmwgPSB1cGxvYWRlZC5wcmltYXJ5OwogICAgfQoKICAgIGlmIChyYXcgPT09ICdxd2VuSW1hZ2VFZGl0JykgewogICAgICBib2R5Lm51bV9pbmZlcmVuY2Vfc3RlcHMgPSAzMDsKICAgICAgYm9keS5ndWlkYW5jZV9zY2FsZSA9IDQuMDsKICAgICAgYm9keS5uZWdhdGl2ZV9wcm9tcHQgPSAnICc7CiAgICAgIGJvZHkuYWNjZWxlcmF0aW9uID0gJ2hpZ2gnOwogICAgfSBlbHNlIGlmICghbXVsdGkpIHsKICAgICAgYm9keS5hY2NlbGVyYXRpb24gPSAnaGlnaCc7CiAgICB9CiAgICByZXR1cm4gYm9keTsKICB9CgogIGZ1bmN0aW9uIGFzcGVjdEJ5UmF3KHJhdykgewogICAgdmFyIGxpc3QgPSBhc3BlY3RzKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIGlmIChsaXN0W2ldLnJhdyA9PT0gcmF3KSByZXR1cm4gbGlzdFtpXTsKICAgIHJldHVybiBsaXN0WzBdOwogIH0KCiAgZnVuY3Rpb24gZXh0cmFjdFJlc3VsdFVSTChyZXN1bHQpIHsKICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDsKICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdC5pbWFnZXMpICYmIHJlc3VsdC5pbWFnZXMubGVuZ3RoKSB7CiAgICAgIHZhciBpbWcgPSByZXN1bHQuaW1hZ2VzWzBdOwogICAgICBpZiAodHlwZW9mIGltZyA9PT0gJ3N0cmluZycpIHJldHVybiBpbWc7CiAgICAgIGlmIChpbWcgJiYgaW1nLnVybCkgcmV0dXJuIGltZy51cmw7CiAgICB9CiAgICBpZiAocmVzdWx0LnVybCkgcmV0dXJuIHJlc3VsdC51cmw7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIG5vcm1hbGl6ZUZlZWRJbWFnZShyYXcpIHsKICAgIGlmICghcmF3KSByZXR1cm4ge307CiAgICB2YXIgZ2kgPSByYXcuZ2VuZXJhdGVkSW1hZ2UgfHwgcmF3LmltYWdlIHx8IHJhdzsKICAgIHJldHVybiB7CiAgICAgIGlkOiBnaS5pZCwgcmVtb3RlSUQ6IGdpLnJlbW90ZUlELCBwcm9tcHQ6IGdpLnByb21wdCwKICAgICAgbW9kZWw6IGdpLm1vZGVsLAogICAgICByZW1vdGVJbWFnZVVSTDogZ2kucmVtb3RlSW1hZ2VVUkwgfHwgZ2kuaW1hZ2VVUkwgfHwgZ2kudXJsLAogICAgICByZW1vdGVPcmlnaW5hbEltYWdlVVJMOiBnaS5yZW1vdGVPcmlnaW5hbEltYWdlVVJMIHx8IGdpLm9yaWdpbmFsSW1hZ2VVUkwsCiAgICAgIGZhdm9yaXRlZDogZ2kuZmF2b3JpdGVkCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gaW1hZ2VVUkxPZihpbWFnZSkgewogICAgaWYgKCFpbWFnZSkgcmV0dXJuICcnOwogICAgcmV0dXJuIGltYWdlLnJlbW90ZUltYWdlVVJMIHx8IGltYWdlLnJlbW90ZUltYWdlVXJsIHx8IGltYWdlLmltYWdlVVJMIHx8IGltYWdlLnVybCB8fCAnJzsKICB9CgogIGZ1bmN0aW9uIGFwaUVycihtc2cpIHsKICAgIHZhciBlID0gbmV3IEVycm9yKG1zZyk7CiAgICBlLmRlc2NyaXB0aW9uID0gbXNnOwogICAgcmV0dXJuIGU7CiAgfQoKICBmdW5jdGlvbiBlbXB0eUJsb2NrKHRpdGxlLCBzdWIsIGljb25OYW1lKSB7CiAgICBpZiAodWkoKS5lbXB0eSkgewogICAgICB0cnkgeyByZXR1cm4gdWkoKS5lbXB0eSh7IHRpdGxlOiB0aXRsZSwgbWVzc2FnZTogc3ViLCBpY29uOiBpY29uTmFtZSB8fCAnaW1hZ2UnIH0pOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgcmV0dXJuIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eScgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJywgaHRtbDogaWNvbihpY29uTmFtZSB8fCAnaW1hZ2UnKSB9KSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScgfSwgdGl0bGUpLAogICAgICBzdWIgPyBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHlfX21zZycgfSwgc3ViKSA6IG51bGwpOwogIH0KCiAgQ3JlYXRvci5wcm90b3R5cGUuc2hvd092ZXJsYXkgPSBmdW5jdGlvbiAoY291bnQpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHRoaXMuaGlkZU92ZXJsYXkoKTsKCiAgICB2YXIgc2NyaW0gPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytb3ZlcmxheS1zY3JpbSB2LWNyZWF0ZV9fc2NyaW0nLCByb2xlOiAnZGlhbG9nJywgJ2FyaWEtbW9kYWwnOiAndHJ1ZScsCiAgICAgICdhcmlhLWxhYmVsJzogJ0dlbmVyYXRpbmcnIH0pOwoKICAgIHZhciBwYW5lbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbCB2LWNyZWF0ZV9fb3ZlcmxheScgfSk7CgogICAgcGFuZWwuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fb3JiJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX29yYi1jb3JlJywgaHRtbDogaWNvbignc3BhcmtsZXMnKSB8fCAn4pymJyB9KSkpOwoKICAgIHZhciBsYWJlbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbF9fdGl0bGUgdi1jcmVhdGVfX292ZXJsYXktbGFiZWwnIH0sICdTdGFydGluZ+KApicpOwogICAgdGhpcy5fb3ZMYWJlbCA9IGxhYmVsOwogICAgcGFuZWwuYXBwZW5kQ2hpbGQobGFiZWwpOwoKICAgIHZhciBiYXRjaEluZm8gPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViIHYtY3JlYXRlX19vdmVybGF5LWJhdGNoJyB9KTsKICAgIHRoaXMuX292QmF0Y2ggPSBiYXRjaEluZm87CiAgICBpZiAoY291bnQgPiAxKSBiYXRjaEluZm8udGV4dENvbnRlbnQgPSAnMCBvZiAnICsgY291bnQgKyAnIGRvbmUnOwogICAgcGFuZWwuYXBwZW5kQ2hpbGQoYmF0Y2hJbmZvKTsKCiAgICB2YXIgdHJhY2sgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcHJvZ3Jlc3Mgdi1wcm9ncmVzcy0tZGV0ZXJtaW5hdGUnIH0pOwogICAgdmFyIGJhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wcm9ncmVzc19fYmFyJyB9KTsKICAgIHRyYWNrLmFwcGVuZENoaWxkKGJhcik7CiAgICB0aGlzLl9vdkJhciA9IGJhcjsKICAgIHRoaXMuX292Q291bnQgPSBjb3VudDsKICAgIHBhbmVsLmFwcGVuZENoaWxkKHRyYWNrKTsKCiAgICB2YXIgcGN0ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxhYmVsIHYtY3JlYXRlX19vdmVybGF5LXBjdCcgfSwgJycpOwogICAgdGhpcy5fb3ZQY3QgPSBwY3Q7CiAgICBwYW5lbC5hcHBlbmRDaGlsZChwY3QpOwoKICAgIHZhciBjYW5jZWwgPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jcmVhdGVfX292ZXJsYXktY2FuY2VsJyB9LCAnQ2FuY2VsJyk7CiAgICB0aGlzLm9uKGNhbmNlbCwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBzZWxmLmNhbmNlbEdlbmVyYXRpb24oKTsgfSk7CiAgICBwYW5lbC5hcHBlbmRDaGlsZChjYW5jZWwpOwoKICAgIHNjcmltLmFwcGVuZENoaWxkKHBhbmVsKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaW0pOwogICAgdGhpcy5fc2NyaW0gPSBzY3JpbTsKICAgIHRoaXMuc2V0T3ZlcmxheVByb2dyZXNzKDAsIGNvdW50LCAwLjA0KTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5zZXRPdmVybGF5TGFiZWwgPSBmdW5jdGlvbiAodGV4dCkgewogICAgaWYgKHRoaXMuX292TGFiZWwpIHRoaXMuX292TGFiZWwudGV4dENvbnRlbnQgPSB0ZXh0OwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnNldE92ZXJsYXlTdGVwID0gZnVuY3Rpb24gKGRvbmUsIGNvdW50KSB7CiAgICBpZiAodGhpcy5fb3ZCYXRjaCAmJiBjb3VudCA+IDEpIHRoaXMuX292QmF0Y2gudGV4dENvbnRlbnQgPSBkb25lICsgJyBvZiAnICsgY291bnQgKyAnIGRvbmUnOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnNldE92ZXJsYXlQcm9ncmVzcyA9IGZ1bmN0aW9uIChkb25lLCBjb3VudCwgZnJhYykgewogICAgaWYgKHR5cGVvZiBmcmFjICE9PSAnbnVtYmVyJyB8fCBpc05hTihmcmFjKSkgZnJhYyA9IDA7CiAgICBmcmFjID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgZnJhYykpOwogICAgdmFyIG92ZXJhbGwgPSAoY291bnQgPiAwKSA/ICgoZG9uZSArIGZyYWMpIC8gY291bnQpIDogZnJhYzsKICAgIG92ZXJhbGwgPSBNYXRoLm1heCgwLjAzLCBNYXRoLm1pbigwLjk4LCBvdmVyYWxsKSk7CiAgICBpZiAodGhpcy5fb3ZCYXIpIHRoaXMuX292QmFyLnN0eWxlLndpZHRoID0gTWF0aC5yb3VuZChvdmVyYWxsICogMTAwKSArICclJzsKICAgIGlmICh0aGlzLl9vdlBjdCkgdGhpcy5fb3ZQY3QudGV4dENvbnRlbnQgPSBNYXRoLnJvdW5kKG92ZXJhbGwgKiAxMDApICsgJyUnOwogICAgaWYgKHRoaXMuX292QmF0Y2ggJiYgY291bnQgPiAxKSB0aGlzLl9vdkJhdGNoLnRleHRDb250ZW50ID0gZG9uZSArICcgb2YgJyArIGNvdW50ICsgJyBkb25lJzsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5oaWRlT3ZlcmxheSA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLl9zY3JpbSkgewogICAgICB2YXIgbyA9IHRoaXMuX3NjcmltOwogICAgICB0aGlzLl9zY3JpbSA9IG51bGw7CiAgICAgIG8uY2xhc3NMaXN0LmFkZCgnY2xvc2luZycpOwogICAgICB2YXIgcmVtb3ZlZCA9IGZhbHNlOwogICAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uICgpIHsgaWYgKCFyZW1vdmVkICYmIG8ucGFyZW50Tm9kZSkgeyBvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyk7IHJlbW92ZWQgPSB0cnVlOyB9IH07CiAgICAgIHRoaXMub24obywgJ2FuaW1hdGlvbmVuZCcsIGRvbmUpOwogICAgICBzZXRUaW1lb3V0KGRvbmUsIDM2MCk7CiAgICB9CiAgICB0aGlzLl9vdkxhYmVsID0gdGhpcy5fb3ZCYXIgPSB0aGlzLl9vdlBjdCA9IHRoaXMuX292QmF0Y2ggPSBudWxsOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmNhbmNlbEdlbmVyYXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAodGhpcy5hYm9ydCkgeyB0cnkgeyB0aGlzLmFib3J0LmFib3J0KCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIHRoaXMuc2V0T3ZlcmxheUxhYmVsKCdDYW5jZWxsaW5n4oCmJyk7CiAgfTsKCn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2xpYnJhcnkuanMgPT09PT0gKi8KKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gd2luZG93LlYgfHwgKHdpbmRvdy5WID0ge30pOwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwoKICBmdW5jdGlvbiBlbCgpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51aS5lbC5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgdmFyIHRhZyA9IGFyZ3VtZW50c1swXTsKICAgIHZhciBhdHRycyA9IGFyZ3VtZW50c1sxXSB8fCB7fTsKICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgZm9yICh2YXIgayBpbiBhdHRycykgewogICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgaykpIGNvbnRpbnVlOwogICAgICB2YXIgdmFsID0gYXR0cnNba107CiAgICAgIGlmICh2YWwgPT0gbnVsbCkgY29udGludWU7CiAgICAgIGlmIChrID09PSAnY2xhc3MnIHx8IGsgPT09ICdjbGFzc05hbWUnKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgZWxzZSBpZiAoayA9PT0gJ3RleHQnKSBub2RlLnRleHRDb250ZW50ID0gdmFsOwogICAgICBlbHNlIGlmIChrID09PSAnaHRtbCcpIG5vZGUuaW5uZXJIVE1MID0gdmFsOwogICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHZhbCk7CiAgICAgIH0gZWxzZSBpZiAoayA9PT0gJ2RhdGFzZXQnICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7CiAgICAgICAgZm9yICh2YXIgZGsgaW4gdmFsKSBub2RlLmRhdGFzZXRbZGtdID0gdmFsW2RrXTsKICAgICAgfSBlbHNlIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICB9CiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY2hpbGQgPSBhcmd1bWVudHNbaV07CiAgICAgIGlmIChjaGlsZCA9PSBudWxsIHx8IGNoaWxkID09PSBmYWxzZSkgY29udGludWU7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkgewogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hpbGQubGVuZ3RoOyBqKyspIHsKICAgICAgICAgIGlmIChjaGlsZFtqXSA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodHlwZW9mIGNoaWxkW2pdID09PSAnc3RyaW5nJyA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoaWxkW2pdKSA6IGNoaWxkW2pdKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQpIDogY2hpbGQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIFMobm9kZSwgY3NzKSB7IGlmIChub2RlKSBub2RlLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAobm9kZS5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykgfHwgJycpICsgJzsnICsgY3NzKTsgcmV0dXJuIG5vZGU7IH0KCiAgdmFyIEFDQ0VOVCA9ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknOwogIHZhciBHUkFESUVOVCA9ICd2YXIoLS1ncmFkaWVudC12YW1wLCBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjNTI5N0Y4LCAjODJENkZGKSknOwogIHZhciBCQURHRV9CRyA9ICdyZ2JhKDEwLDEyLDE0LC41NSknOwogIHZhciBHTEFTU19CRyA9ICd2YXIoLS1jb2xvci1iZy1vbiwgIzIwMjIyMSknOwogIHZhciBMSU5FID0gJ3ZhcigtLXYtbGluZSwgcmdiYSgyNDUsMjQ1LDI0NywuMTUpKSc7CgogIGZ1bmN0aW9uIGljb24obmFtZSkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaWNvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgciA9IFYudWkuaWNvbihuYW1lKTsKICAgICAgaWYgKHR5cGVvZiByID09PSAnc3RyaW5nJykgewogICAgICAgIHZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgIHNwYW4uY2xhc3NOYW1lID0gJ3YtaWNvJzsKICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgICAgIHNwYW4uaW5uZXJIVE1MID0gcjsKICAgICAgICByZXR1cm4gc3BhbjsKICAgICAgfQogICAgICByZXR1cm4gcjsKICAgIH0KICAgIHZhciBmYWxsYmFjayA9IHsgc2VhcmNoOiAn4oyVJywgc29ydDogJ+KHhScsIGZvbGRlcjogJ+KWpCcsIGhlYXJ0OiAn4pmhJywgaGVhcnRGaWxsOiAn4pmlJywgdHJhc2g6ICfijKsnLCBjbG9zZTogJ+KclScsIGNoZWNrOiAn4pyTJywgbW9yZTogJ+KLrycsIGRvd25sb2FkOiAn4qSTJywgY29weTogJ+KOmCcsIHBsdXM6ICcrJywgZ3JpZDogJ+KWpicsIGltYWdlOiAn4pajJyB9OwogICAgdmFyIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICBzLmNsYXNzTmFtZSA9ICd2LWljbyc7CiAgICBzLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgcy50ZXh0Q29udGVudCA9IGZhbGxiYWNrW25hbWVdIHx8ICfigKInOwogICAgcmV0dXJuIHM7CiAgfQoKICBmdW5jdGlvbiB0b2FzdChtc2csIGtpbmQpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnRvYXN0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51aS50b2FzdChtc2csIGtpbmQgfHwgJ2luZm8nKTsKICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLmVtaXQgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuZW1pdCgndG9hc3QnLCB7IG1zZzogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsKICB9CgogIGZ1bmN0aW9uIGNvbmZpcm1EaWFsb2cobXNnKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jb25maXJtID09PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFYudWkuY29uZmlybShtc2cpKTsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0obXNnKSk7CiAgfQoKICBmdW5jdGlvbiBtb2RhbChub2RlLCBvcHRzKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5tb2RhbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudWkubW9kYWwobm9kZSwgb3B0cyB8fCB7fSk7CiAgICB2YXIgYmFjayA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbC1iYWNrJyB9KTsKICAgIHZhciBwYW5lbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbCBnbGFzcy1jYXJkJyB9LCBub2RlKTsKICAgIGJhY2suYXBwZW5kQ2hpbGQocGFuZWwpOwogICAgZnVuY3Rpb24gY2xvc2UoKSB7IGlmIChiYWNrLnBhcmVudE5vZGUpIGJhY2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiYWNrKTsgaWYgKG9wdHMgJiYgb3B0cy5vbkNsb3NlKSBvcHRzLm9uQ2xvc2UoKTsgfQogICAgYmFjay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGlmIChlLnRhcmdldCA9PT0gYmFjaykgY2xvc2UoKTsgfSk7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJhY2spOwogICAgcmV0dXJuIHsgY2xvc2U6IGNsb3NlIH07CiAgfQoKICB2YXIgZGVib3VuY2UgPSAoVi51dGlsICYmIFYudXRpbC5kZWJvdW5jZSkgPyBWLnV0aWwuZGVib3VuY2UgOiBmdW5jdGlvbiAoZm4sIG1zKSB7CiAgICB2YXIgdDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBhID0gYXJndW1lbnRzLCBjID0gdGhpczsKICAgICAgY2xlYXJUaW1lb3V0KHQpOwogICAgICB0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGZuLmFwcGx5KGMsIGEpOyB9LCBtcyk7CiAgICB9OwogIH07CgogIGZ1bmN0aW9uIGVzY2FwZUh0bWwocykgewogICAgaWYgKFYudXRpbCAmJiB0eXBlb2YgVi51dGlsLmVzY2FwZUh0bWwgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnV0aWwuZXNjYXBlSHRtbChzKTsKICAgIHJldHVybiBTdHJpbmcocyA9PSBudWxsID8gJycgOiBzKS5yZXBsYWNlKC9bJjw+IiddL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgIHJldHVybiB7ICcmJzogJyZhbXA7JywgJzwnOiAnJmx0OycsICc+JzogJyZndDsnLCAnIic6ICcmcXVvdDsnLCAiJyI6ICcmIzM5OycgfVtjXTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZG93bmxvYWQodXJsLCBuYW1lKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwuZG93bmxvYWQgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnV0aWwuZG93bmxvYWQodXJsLCBuYW1lKTsKICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgYS5ocmVmID0gdXJsOyBhLmRvd25sb2FkID0gbmFtZSB8fCAnaW1hZ2UnOyBhLnRhcmdldCA9ICdfYmxhbmsnOyBhLnJlbCA9ICdub29wZW5lcic7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOyBhLmNsaWNrKCk7IGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICBpZiAoVi5yb3V0ZXIgJiYgdHlwZW9mIFYucm91dGVyLmdvID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi5yb3V0ZXIuZ28oaGFzaCk7CiAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiBpbWdJZChpbWcpIHsgcmV0dXJuIGltZyAmJiAoaW1nLnJlbW90ZUlEIHx8IGltZy5pZCk7IH0KICBmdW5jdGlvbiBpbWdLZXkoaW1nKSB7IHJldHVybiBTdHJpbmcoaW1nSWQoaW1nKSB8fCAnJyk7IH0KCiAgZnVuY3Rpb24gZGF0ZU1zKGltZykgewogICAgdmFyIGQgPSBpbWcgJiYgaW1nLmNyZWF0ZWREYXRlOwogICAgaWYgKGQgPT0gbnVsbCkgcmV0dXJuIDA7CiAgICBpZiAodHlwZW9mIGQgPT09ICdudW1iZXInKSByZXR1cm4gZCA8IDFlMTIgPyBkICogMTAwMCA6IGQ7CiAgICB2YXIgdCA9IERhdGUucGFyc2UoZCk7CiAgICByZXR1cm4gaXNOYU4odCkgPyAwIDogdDsKICB9CgogIGZ1bmN0aW9uIGZ1enp5U2NvcmUobmVlZGxlLCBoYXkpIHsKICAgIGlmICghbmVlZGxlKSByZXR1cm4gMTsKICAgIGlmICghaGF5KSByZXR1cm4gMDsKICAgIG5lZWRsZSA9IG5lZWRsZS50b0xvd2VyQ2FzZSgpOwogICAgaGF5ID0gaGF5LnRvTG93ZXJDYXNlKCk7CiAgICB2YXIgZXhhY3QgPSBoYXkuaW5kZXhPZihuZWVkbGUpOwogICAgaWYgKGV4YWN0ICE9PSAtMSkgcmV0dXJuIDEwMDAgLSBleGFjdDsKICAgIHZhciBoaSA9IDAsIG5pID0gMCwgc2NvcmUgPSAwLCBzdHJlYWsgPSAwOwogICAgd2hpbGUgKGhpIDwgaGF5Lmxlbmd0aCAmJiBuaSA8IG5lZWRsZS5sZW5ndGgpIHsKICAgICAgaWYgKGhheVtoaV0gPT09IG5lZWRsZVtuaV0pIHsKICAgICAgICBzdHJlYWsgKz0gMTsKICAgICAgICBzY29yZSArPSAxICsgc3RyZWFrOwogICAgICAgIG5pICs9IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFrID0gMDsKICAgICAgfQogICAgICBoaSArPSAxOwogICAgfQogICAgcmV0dXJuIG5pID09PSBuZWVkbGUubGVuZ3RoID8gc2NvcmUgOiAwOwogIH0KCiAgZnVuY3Rpb24gc2VhcmNoSGF5c3RhY2soaW1nKSB7CiAgICB2YXIgcGFydHMgPSBbaW1nLnByb21wdCB8fCAnJywgaW1nLm1vZGVsIHx8ICcnLCBtb2RlbExhYmVsKGltZy5tb2RlbCkgfHwgJyddOwogICAgaWYgKEFycmF5LmlzQXJyYXkoaW1nLnRhZ3MpKSBwYXJ0cyA9IHBhcnRzLmNvbmNhdChpbWcudGFncyk7CiAgICByZXR1cm4gcGFydHMuam9pbignICcpOwogIH0KCiAgdmFyIFNPUlRTID0gWwogICAgeyBrZXk6ICduZXdlc3QnLCBsYWJlbDogJ05ld2VzdCcsIGNtcDogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGRhdGVNcyhiKSAtIGRhdGVNcyhhKTsgfSB9LAogICAgeyBrZXk6ICdvbGRlc3QnLCBsYWJlbDogJ09sZGVzdCcsIGNtcDogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGRhdGVNcyhhKSAtIGRhdGVNcyhiKTsgfSB9LAogICAgeyBrZXk6ICdheicsIGxhYmVsOiAnQSDihpIgWicsIGNtcDogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIChhLnByb21wdCB8fCAnJykubG9jYWxlQ29tcGFyZShiLnByb21wdCB8fCAnJyk7IH0gfSwKICAgIHsga2V5OiAnbW9kZWwnLCBsYWJlbDogJ0J5IE1vZGVsJywgY21wOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKG1vZGVsTGFiZWwoYS5tb2RlbCkgfHwgJycpLmxvY2FsZUNvbXBhcmUobW9kZWxMYWJlbChiLm1vZGVsKSB8fCAnJykgfHwgZGF0ZU1zKGIpIC0gZGF0ZU1zKGEpOyB9IH0sCiAgICB7IGtleTogJ2Zhdm9yaXRlcycsIGxhYmVsOiAnRmF2b3JpdGVzIEZpcnN0JywgY21wOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKGIuZmF2b3JpdGVkID8gMSA6IDApIC0gKGEuZmF2b3JpdGVkID8gMSA6IDApIHx8IGRhdGVNcyhiKSAtIGRhdGVNcyhhKTsgfSB9CiAgXTsKCiAgZnVuY3Rpb24gbW9kZWxMYWJlbChyYXcpIHsKICAgIGlmIChyYXcgJiYgVi5kYXRhICYmIEFycmF5LmlzQXJyYXkoVi5kYXRhLm1vZGVscykpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBWLmRhdGEubW9kZWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKFYuZGF0YS5tb2RlbHNbaV0ucmF3ID09PSByYXcpIHJldHVybiBWLmRhdGEubW9kZWxzW2ldLmxhYmVsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmF3IHx8ICcnOwogIH0KCiAgdmFyIFBFUiA9IDMwOwoKICB2YXIgY3R4ID0gbnVsbDsKCiAgZnVuY3Rpb24gZnJlc2hDdHgoKSB7CiAgICByZXR1cm4gewogICAgICByb290OiBudWxsLAogICAgICBncmlkRWw6IG51bGwsCiAgICAgIHNlbnRpbmVsOiBudWxsLAogICAgICBzdGF0dXNFbDogbnVsbCwKICAgICAgdG9vbGJhckVsOiBudWxsLAogICAgICBjb3VudEVsOiBudWxsLAogICAgICBpdGVtczogW10sCiAgICAgIHBhZ2U6IDAsCiAgICAgIHRvdGFsOiBudWxsLAogICAgICBsb2FkaW5nOiBmYWxzZSwKICAgICAgZG9uZTogZmFsc2UsCiAgICAgIGVycm9yZWQ6IGZhbHNlLAogICAgICBmZXRjaGVkOiBmYWxzZSwKICAgICAgc291cmNlOiAnbGlicmFyeScsCiAgICAgIGZvbGRlcklEOiBudWxsLAogICAgICBmb2xkZXJzOiBbXSwKICAgICAgZm9sZGVyc0xvYWRlZDogZmFsc2UsCiAgICAgIHF1ZXJ5OiAnJywKICAgICAgc29ydDogJ25ld2VzdCcsCiAgICAgIGluZHVzdHJ5OiBudWxsLAogICAgICBzZWxlY3RNb2RlOiBmYWxzZSwKICAgICAgc2VsZWN0ZWQ6IHt9LAogICAgICBvYnNlcnZlcjogbnVsbCwKICAgICAgbWVudUVsOiBudWxsLAogICAgICBzY3JvbGxZOiAwLAogICAgICBzY3JvbGxUYXJnZXQ6IG51bGwKICAgIH07CiAgfQoKICBmdW5jdGlvbiBhY3RpdmVGZXRjaChwYWdlKSB7CiAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2Zhdm9yaXRlcycpIHJldHVybiBWLmFwaS5mYXZvcml0ZXMoMjAwKTsKICAgIGlmIChjdHguc291cmNlID09PSAnZm9sZGVyJyAmJiBjdHguZm9sZGVySUQpIHJldHVybiBWLmFwaS5mb2xkZXJJbWFnZXMoY3R4LmZvbGRlcklELCBwYWdlLCBQRVIpOwogICAgcmV0dXJuIFYuYXBpLmxpYnJhcnkocGFnZSwgUEVSKTsKICB9CgogIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhZ2UocmVzcCkgewogICAgaWYgKCFyZXNwKSByZXR1cm4geyBpdGVtczogW10sIHRvdGFsOiBudWxsIH07CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwKSkgcmV0dXJuIHsgaXRlbXM6IHJlc3AsIHRvdGFsOiByZXNwLmxlbmd0aCB9OwogICAgdmFyIGl0ZW1zID0gQXJyYXkuaXNBcnJheShyZXNwLml0ZW1zKSA/IHJlc3AuaXRlbXMgOiBbXTsKICAgIHZhciB0b3RhbCA9IHJlc3AubWV0YWRhdGEgJiYgdHlwZW9mIHJlc3AubWV0YWRhdGEudG90YWwgPT09ICdudW1iZXInID8gcmVzcC5tZXRhZGF0YS50b3RhbCA6IG51bGw7CiAgICByZXR1cm4geyBpdGVtczogaXRlbXMsIHRvdGFsOiB0b3RhbCB9OwogIH0KCiAgZnVuY3Rpb24gbWVyZ2VVbmlxdWUoaW50bywgaW5jb21pbmcpIHsKICAgIHZhciBzZWVuID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGludG8ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGVrID0gaW1nS2V5KGludG9baV0pOwogICAgICBpZiAoZWspIHNlZW5bZWtdID0gdHJ1ZTsKICAgIH0KICAgIGZvciAodmFyIGogPSAwOyBqIDwgaW5jb21pbmcubGVuZ3RoOyBqKyspIHsKICAgICAgdmFyIGl0ZW0gPSBpbmNvbWluZ1tqXTsKICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgY29udGludWU7CiAgICAgIHZhciBrID0gaW1nS2V5KGl0ZW0pOwogICAgICBpZiAoayAmJiBzZWVuW2tdKSBjb250aW51ZTsKICAgICAgaWYgKGspIHNlZW5ba10gPSB0cnVlOwogICAgICBpbnRvLnB1c2goaXRlbSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBsb2FkTmV4dChyZXNldCkgewogICAgaWYgKCFjdHgpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgIGlmIChjdHgubG9hZGluZykgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgaWYgKCFyZXNldCAmJiBjdHguZG9uZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgY3R4LmxvYWRpbmcgPSB0cnVlOwogICAgY3R4LmVycm9yZWQgPSBmYWxzZTsKICAgIHZhciBzdGFydEN0eCA9IGN0eDsKCiAgICB2YXIgbmV4dFBhZ2UgPSByZXNldCA/IDEgOiBjdHgucGFnZSArIDE7CiAgICB2YXIgaGFkU2VlZCA9IHJlc2V0ICYmIGN0eC5pdGVtcy5sZW5ndGggPiAwOwogICAgaWYgKHJlc2V0KSB7CiAgICAgIGlmICghaGFkU2VlZCkgY3R4Lml0ZW1zID0gW107CiAgICAgIGN0eC5wYWdlID0gMDsKICAgICAgY3R4LnRvdGFsID0gbnVsbDsKICAgICAgY3R4LmRvbmUgPSBmYWxzZTsKICAgICAgY3R4LmZldGNoZWQgPSBmYWxzZTsKICAgIH0KCiAgICBpZiAocmVzZXQgJiYgIWN0eC5pdGVtcy5sZW5ndGgpIHNob3dTa2VsZXRvbnMoKTsKICAgIHJlbmRlclN0YXR1cygpOwoKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKQogICAgICAudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkubGlicmFyeSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVycm9yKCdBUEkgdW5hdmFpbGFibGUnKTsKICAgICAgICByZXR1cm4gYWN0aXZlRmV0Y2gobmV4dFBhZ2UpOwogICAgICB9KQogICAgICAudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgIGlmICghY3R4IHx8IGN0eCAhPT0gc3RhcnRDdHgpIHJldHVybjsKICAgICAgICB2YXIgbm9ybSA9IG5vcm1hbGl6ZVBhZ2UocmVzcCk7CiAgICAgICAgaWYgKGhhZFNlZWQpIGN0eC5pdGVtcyA9IG5vcm0uaXRlbXMuc2xpY2UoKTsKICAgICAgICBlbHNlIG1lcmdlVW5pcXVlKGN0eC5pdGVtcywgbm9ybS5pdGVtcyk7CiAgICAgICAgY3R4LnBhZ2UgPSBuZXh0UGFnZTsKICAgICAgICBpZiAobm9ybS50b3RhbCAhPSBudWxsKSBjdHgudG90YWwgPSBub3JtLnRvdGFsOwoKICAgICAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2Zhdm9yaXRlcycpIGN0eC5kb25lID0gdHJ1ZTsKICAgICAgICBlbHNlIGlmIChub3JtLml0ZW1zLmxlbmd0aCA8IFBFUikgY3R4LmRvbmUgPSB0cnVlOwogICAgICAgIGVsc2UgaWYgKGN0eC50b3RhbCAhPSBudWxsICYmIGN0eC5pdGVtcy5sZW5ndGggPj0gY3R4LnRvdGFsKSBjdHguZG9uZSA9IHRydWU7CgogICAgICAgIGN0eC5sb2FkaW5nID0gZmFsc2U7CiAgICAgICAgY3R4LmVycm9yZWQgPSBmYWxzZTsKICAgICAgICBjdHguZmV0Y2hlZCA9IHRydWU7CiAgICAgICAgaWYgKGN0eC5zb3VyY2UgPT09ICdsaWJyYXJ5JyAmJiBWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLnNldCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgY3R4Ll9zZWxmV3JpdGUgPSB0cnVlOwogICAgICAgICAgdHJ5IHsgVi5zdG9yZS5zZXQoJ2xpYnJhcnknLCBjdHguaXRlbXMuc2xpY2UoKSk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICBjdHguX3NlbGZXcml0ZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgcmVuZGVyR3JpZCgpOwogICAgICAgICAgcmVuZGVyU3RhdHVzKCk7CiAgICAgICAgICBlbnN1cmVGaWxsKCk7CiAgICAgICAgfSBjYXRjaCAocmVuZGVyRXJyKSB7CiAgICAgICAgICBpZiAod2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5lcnJvcikgY29uc29sZS5lcnJvcignW2xpYnJhcnldIHJlbmRlciBmYWlsZWQnLCByZW5kZXJFcnIpOwogICAgICAgIH0KICAgICAgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBpZiAoIWN0eCB8fCBjdHggIT09IHN0YXJ0Q3R4KSByZXR1cm47CiAgICAgICAgY3R4LmxvYWRpbmcgPSBmYWxzZTsKICAgICAgICBjdHguZXJyb3JlZCA9IHRydWU7CiAgICAgICAgdHJ5IHsgcmVuZGVyR3JpZCgpOyB9IGNhdGNoIChlKSB7fQogICAgICAgIHJlbmRlclN0YXR1cyhlcnIpOwogICAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGVuc3VyZUZpbGwoKSB7CiAgICBpZiAoY3R4LmRvbmUgfHwgY3R4LmxvYWRpbmcgfHwgY3R4LmVycm9yZWQpIHJldHVybjsKICAgIGlmICghY3R4LmdyaWRFbCkgcmV0dXJuOwogICAgaWYgKGN0eC5xdWVyeSB8fCBjdHguc291cmNlID09PSAnZmF2b3JpdGVzJykgcmV0dXJuOwogICAgdmFyIGRvY0ggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IHdpbmRvdy5pbm5lckhlaWdodCB8fCAwOwogICAgdmFyIGdyaWRCb3R0b20gPSBjdHguZ3JpZEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTsKICAgIGlmIChncmlkQm90dG9tIDwgZG9jSCArIDIwMCkgbG9hZE5leHQoZmFsc2UpOwogIH0KCiAgZnVuY3Rpb24gdmlzaWJsZUl0ZW1zKCkgewogICAgdmFyIGxpc3QgPSBjdHguaXRlbXMuc2xpY2UoKTsKCiAgICBpZiAoY3R4LmluZHVzdHJ5KSB7CiAgICAgIHZhciBrZXkgPSBjdHguaW5kdXN0cnk7CiAgICAgIGxpc3QgPSBsaXN0LmZpbHRlcihmdW5jdGlvbiAoaW1nKSB7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGltZy50YWdzKSB8fCAhaW1nLnRhZ3MubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbWcudGFncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKFN0cmluZyhpbWcudGFnc1tpXSkudG9Mb3dlckNhc2UoKSA9PT0ga2V5LnRvTG93ZXJDYXNlKCkpIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0pOwogICAgfQoKICAgIGlmIChjdHgucXVlcnkpIHsKICAgICAgdmFyIHEgPSBjdHgucXVlcnk7CiAgICAgIHZhciBzY29yZWQgPSBbXTsKICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCBsaXN0Lmxlbmd0aDsgcysrKSB7CiAgICAgICAgdmFyIHNjID0gZnV6enlTY29yZShxLCBzZWFyY2hIYXlzdGFjayhsaXN0W3NdKSk7CiAgICAgICAgaWYgKHNjID4gMCkgc2NvcmVkLnB1c2goeyBpbWc6IGxpc3Rbc10sIHNjOiBzYyB9KTsKICAgICAgfQogICAgICBzY29yZWQuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYi5zYyAtIGEuc2M7IH0pOwogICAgICByZXR1cm4gc2NvcmVkLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5pbWc7IH0pOwogICAgfQoKICAgIHZhciBkZWYgPSBudWxsOwogICAgZm9yICh2YXIgayA9IDA7IGsgPCBTT1JUUy5sZW5ndGg7IGsrKykgaWYgKFNPUlRTW2tdLmtleSA9PT0gY3R4LnNvcnQpIGRlZiA9IFNPUlRTW2tdOwogICAgaWYgKGRlZikgbGlzdC5zb3J0KGRlZi5jbXApOwogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBmdW5jdGlvbiBhdmFpbGFibGVUYWdzKCkgewogICAgdmFyIHNldCA9IHt9OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdHguaXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHQgPSBjdHguaXRlbXNbaV0udGFnczsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpIGZvciAodmFyIGogPSAwOyBqIDwgdC5sZW5ndGg7IGorKykgaWYgKHRbal0pIHNldFtTdHJpbmcodFtqXSkudG9Mb3dlckNhc2UoKV0gPSB0cnVlOwogICAgfQogICAgcmV0dXJuIHNldDsKICB9CgogIGZ1bmN0aW9uIGxvYWRGb2xkZXJzKCkgewogICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkuZm9sZGVycyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7CiAgICByZXR1cm4gVi5hcGkuZm9sZGVycygpLnRoZW4oZnVuY3Rpb24gKGxpc3QpIHsKICAgICAgY3R4LmZvbGRlcnMgPSBBcnJheS5pc0FycmF5KGxpc3QpID8gbGlzdCA6IFtdOwogICAgICBjdHguZm9sZGVyc0xvYWRlZCA9IHRydWU7CiAgICAgIHJldHVybiBjdHguZm9sZGVyczsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgY3R4LmZvbGRlcnNMb2FkZWQgPSB0cnVlOwogICAgICByZXR1cm4gY3R4LmZvbGRlcnM7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIG9wZW5Gb2xkZXJzTWFuYWdlcigpIHsKICAgIHZhciB3cmFwID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vZGFsLWJvZHknIH0pOwogICAgd3JhcC5hcHBlbmRDaGlsZChlbCgnaDMnLCB7IGNsYXNzOiAndi1tb2RhbC10aXRsZScsIHRleHQ6ICdGb2xkZXJzJyB9KSk7CgogICAgdmFyIGxpc3RFbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1tZCcgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKGxpc3RFbCk7CgogICAgZnVuY3Rpb24gcmVwYWludCgpIHsKICAgICAgbGlzdEVsLmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWN0eC5mb2xkZXJzLmxlbmd0aCkgewogICAgICAgIGxpc3RFbC5hcHBlbmRDaGlsZChlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19zdWInLCB0ZXh0OiAnTm8gZm9sZGVycyB5ZXQuIENyZWF0ZSBvbmUgYmVsb3cuJyB9KSk7CiAgICAgIH0KICAgICAgY3R4LmZvbGRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZikgewogICAgICAgIHZhciByb3cgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytcm93IHYtcm93LS1iZXR3ZWVuJyB9LAogICAgICAgICAgZWwoJ2J1dHRvbicsIHsKICAgICAgICAgICAgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgICAgIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgbS5jbG9zZSgpOyBvcGVuRm9sZGVyKGYuaWQsIGYubmFtZSk7IH0KICAgICAgICAgIH0sIGljb24oJ2ZvbGRlcicpLCBlbCgnc3BhbicsIHsgdGV4dDogZi5uYW1lIH0pLCBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHNfX251bScsIHRleHQ6ICcoJyArIChmLmltYWdlQ291bnQgfHwgMCkgKyAnKScgfSkpLAogICAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXJvdycgfSwKICAgICAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIHRpdGxlOiAnUmVuYW1lJywgJ2FyaWEtbGFiZWwnOiAnUmVuYW1lIGZvbGRlcicsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgcmVuYW1lRm9sZGVyRmxvdyhmLCByZXBhaW50KTsgfSB9LCBpY29uKCdlZGl0JykpLAogICAgICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1kYW5nZXIgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIHRpdGxlOiAnRGVsZXRlJywgJ2FyaWEtbGFiZWwnOiAnRGVsZXRlIGZvbGRlcicsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgZGVsZXRlRm9sZGVyRmxvdyhmLCByZXBhaW50KTsgfSB9LCBpY29uKCd0cmFzaCcpKQogICAgICAgICAgKQogICAgICAgICk7CiAgICAgICAgbGlzdEVsLmFwcGVuZENoaWxkKHJvdyk7CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBuYW1lSW5wdXQgPSBlbCgnaW5wdXQnLCB7IGNsYXNzOiAndi1maWVsZCcsIHR5cGU6ICd0ZXh0JywgcGxhY2Vob2xkZXI6ICdOZXcgZm9sZGVyIG5hbWUnLCBtYXhsZW5ndGg6ICc2MCcgfSk7CiAgICB2YXIgY3JlYXRlQnRuID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJyB9LCBpY29uKCdwbHVzJyksICdDcmVhdGUnKTsKICAgIGNyZWF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG4gPSAobmFtZUlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIGlmICghbikgeyBuYW1lSW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIGNyZWF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICAgIFYuYXBpLmNyZWF0ZUZvbGRlcihuKS50aGVuKGZ1bmN0aW9uIChmKSB7CiAgICAgICAgaWYgKGYpIGN0eC5mb2xkZXJzLnB1c2goZik7CiAgICAgICAgbmFtZUlucHV0LnZhbHVlID0gJyc7CiAgICAgICAgY3JlYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgcmVwYWludCgpOwogICAgICAgIHRvYXN0KCdGb2xkZXIgY3JlYXRlZCcsICdzdWNjZXNzJyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgY3JlYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7IHRvYXN0KCdDb3VsZCBub3QgY3JlYXRlIGZvbGRlcicsICdlcnJvcicpOyB9KTsKICAgIH0pOwogICAgbmFtZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkgeyBpZiAoZS5rZXkgPT09ICdFbnRlcicpIGNyZWF0ZUJ0bi5jbGljaygpOyB9KTsKCiAgICB3cmFwLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1yb3cgdi1tb2RhbC1hY3Rpb25zJyB9LCBuYW1lSW5wdXQsIGNyZWF0ZUJ0bikpOwoKICAgIHZhciBtID0gbW9kYWwod3JhcCwge30pOwoKICAgIGlmICghY3R4LmZvbGRlcnNMb2FkZWQpIHsKICAgICAgbGlzdEVsLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtZW1wdHlfX3N1YicsIHRleHQ6ICdMb2FkaW5n4oCmJyB9KSk7CiAgICAgIGxvYWRGb2xkZXJzKCkudGhlbihyZXBhaW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlcGFpbnQoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbmFtZUZvbGRlckZsb3coZm9sZGVyLCBhZnRlcikgewogICAgdmFyIGlucHV0ID0gZWwoJ2lucHV0JywgeyBjbGFzczogJ3YtZmllbGQnLCB0eXBlOiAndGV4dCcsIHZhbHVlOiBmb2xkZXIubmFtZSwgbWF4bGVuZ3RoOiAnNjAnIH0pOwogICAgdmFyIHNhdmUgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1wcmltYXJ5IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nLCB0ZXh0OiAnU2F2ZScgfSk7CiAgICB2YXIgY2FuY2VsID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIHRleHQ6ICdDYW5jZWwnIH0pOwogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtbW9kYWwtYm9keScgfSwKICAgICAgZWwoJ2gzJywgeyBjbGFzczogJ3YtbW9kYWwtdGl0bGUnLCB0ZXh0OiAnUmVuYW1lIEZvbGRlcicgfSksCiAgICAgIGlucHV0LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytcm93IHYtbW9kYWwtYWN0aW9ucycgfSwgY2FuY2VsLCBzYXZlKSk7CiAgICB2YXIgbSA9IG1vZGFsKHdyYXAsIHt9KTsKICAgIGNhbmNlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgbS5jbG9zZSgpOyB9KTsKICAgIHNhdmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBuID0gKGlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIGlmICghbikgeyBpbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgc2F2ZS5kaXNhYmxlZCA9IHRydWU7CiAgICAgIFYuYXBpLnJlbmFtZUZvbGRlcihmb2xkZXIuaWQsIG4pLnRoZW4oZnVuY3Rpb24gKGYpIHsKICAgICAgICBmb2xkZXIubmFtZSA9IChmICYmIGYubmFtZSkgfHwgbjsKICAgICAgICBtLmNsb3NlKCk7CiAgICAgICAgaWYgKGFmdGVyKSBhZnRlcigpOwogICAgICAgIHRvYXN0KCdGb2xkZXIgcmVuYW1lZCcsICdzdWNjZXNzJyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgc2F2ZS5kaXNhYmxlZCA9IGZhbHNlOyB0b2FzdCgnUmVuYW1lIGZhaWxlZCcsICdlcnJvcicpOyB9KTsKICAgIH0pOwogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGlucHV0LmZvY3VzKCk7IGlucHV0LnNlbGVjdCgpOyB9LCAzMCk7CiAgfQoKICBmdW5jdGlvbiBkZWxldGVGb2xkZXJGbG93KGZvbGRlciwgYWZ0ZXIpIHsKICAgIGNvbmZpcm1EaWFsb2coJ0RlbGV0ZSBmb2xkZXIgIicgKyBmb2xkZXIubmFtZSArICciPyBJbWFnZXMgaW5zaWRlIGFyZSBrZXB0IChqdXN0IHVuLWZpbGVkKS4nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIFYuYXBpLmRlbGV0ZUZvbGRlcihmb2xkZXIuaWQpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIGN0eC5mb2xkZXJzID0gY3R4LmZvbGRlcnMuZmlsdGVyKGZ1bmN0aW9uIChmKSB7IHJldHVybiBmLmlkICE9PSBmb2xkZXIuaWQ7IH0pOwogICAgICAgIGlmIChjdHguc291cmNlID09PSAnZm9sZGVyJyAmJiBjdHguZm9sZGVySUQgPT09IGZvbGRlci5pZCkgb3BlbkxpYnJhcnkoKTsKICAgICAgICBpZiAoYWZ0ZXIpIGFmdGVyKCk7CiAgICAgICAgdG9hc3QoJ0ZvbGRlciBkZWxldGVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgeyB0b2FzdCgnRGVsZXRlIGZhaWxlZCcsICdlcnJvcicpOyB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gYXNzaWduVG9Gb2xkZXJGbG93KGltYWdlSURzLCBvbkRvbmUpIHsKICAgIHZhciB3cmFwID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vZGFsLWJvZHknIH0pOwogICAgd3JhcC5hcHBlbmRDaGlsZChlbCgnaDMnLCB7IGNsYXNzOiAndi1tb2RhbC10aXRsZScsIHRleHQ6ICdBZGQgJyArIGltYWdlSURzLmxlbmd0aCArICcgdG8gRm9sZGVyJyB9KSk7CiAgICB2YXIgbGlzdEVsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLW1kJyB9KTsKICAgIHdyYXAuYXBwZW5kQ2hpbGQobGlzdEVsKTsKCiAgICBmdW5jdGlvbiBwYWludCgpIHsKICAgICAgbGlzdEVsLmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWN0eC5mb2xkZXJzLmxlbmd0aCkgewogICAgICAgIGxpc3RFbC5hcHBlbmRDaGlsZChlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19zdWInLCB0ZXh0OiAnTm8gZm9sZGVycyB5ZXQg4oCUIGNyZWF0ZSBvbmUgYmVsb3cuJyB9KSk7CiAgICAgIH0KICAgICAgY3R4LmZvbGRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZikgewogICAgICAgIHZhciBiID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicgfSwKICAgICAgICAgIGljb24oJ2ZvbGRlcicpLCBlbCgnc3BhbicsIHsgdGV4dDogZi5uYW1lIH0pLCBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHNfX251bScsIHRleHQ6ICcoJyArIChmLmltYWdlQ291bnQgfHwgMCkgKyAnKScgfSkpOwogICAgICAgIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBiLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgIFYuYXBpLmFzc2lnbkZvbGRlcihmLmlkLCBpbWFnZUlEcykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGYuaW1hZ2VDb3VudCA9IChmLmltYWdlQ291bnQgfHwgMCkgKyBpbWFnZUlEcy5sZW5ndGg7CiAgICAgICAgICAgIG0uY2xvc2UoKTsKICAgICAgICAgICAgdG9hc3QoJ0FkZGVkIHRvICInICsgZi5uYW1lICsgJyInLCAnc3VjY2VzcycpOwogICAgICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoKTsKICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgYi5kaXNhYmxlZCA9IGZhbHNlOyB0b2FzdCgnQ291bGQgbm90IGFkZCB0byBmb2xkZXInLCAnZXJyb3InKTsgfSk7CiAgICAgICAgfSk7CiAgICAgICAgbGlzdEVsLmFwcGVuZENoaWxkKGIpOwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgbmFtZUlucHV0ID0gZWwoJ2lucHV0JywgeyBjbGFzczogJ3YtZmllbGQnLCB0eXBlOiAndGV4dCcsIHBsYWNlaG9sZGVyOiAnTmV3IGZvbGRlciBuYW1lJywgbWF4bGVuZ3RoOiAnNjAnIH0pOwogICAgdmFyIGNyZWF0ZUJ0biA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nIH0sIGljb24oJ3BsdXMnKSwgJ05ldycpOwogICAgY3JlYXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICB2YXIgbiA9IChuYW1lSW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTsKICAgICAgaWYgKCFuKSB7IG5hbWVJbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgY3JlYXRlQnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgVi5hcGkuY3JlYXRlRm9sZGVyKG4pLnRoZW4oZnVuY3Rpb24gKGYpIHsKICAgICAgICBpZiAoZikgY3R4LmZvbGRlcnMucHVzaChmKTsKICAgICAgICBuYW1lSW5wdXQudmFsdWUgPSAnJzsKICAgICAgICBjcmVhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICBwYWludCgpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IGNyZWF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlOyB0b2FzdCgnQ291bGQgbm90IGNyZWF0ZSBmb2xkZXInLCAnZXJyb3InKTsgfSk7CiAgICB9KTsKICAgIG5hbWVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHsgaWYgKGUua2V5ID09PSAnRW50ZXInKSBjcmVhdGVCdG4uY2xpY2soKTsgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1yb3cgdi1tb2RhbC1hY3Rpb25zJyB9LCBuYW1lSW5wdXQsIGNyZWF0ZUJ0bikpOwoKICAgIHZhciBtID0gbW9kYWwod3JhcCwge30pOwogICAgaWYgKCFjdHguZm9sZGVyc0xvYWRlZCkgewogICAgICBsaXN0RWwuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fc3ViJywgdGV4dDogJ0xvYWRpbmfigKYnIH0pKTsKICAgICAgbG9hZEZvbGRlcnMoKS50aGVuKHBhaW50KTsKICAgIH0gZWxzZSBwYWludCgpOwogIH0KCiAgZnVuY3Rpb24gdG9nZ2xlRmF2b3JpdGUoaW1nLCBvbkNoYW5nZSkgewogICAgdmFyIGlkID0gaW1nSWQoaW1nKTsKICAgIGlmICghaWQpIHsgdG9hc3QoJ1RoaXMgaW1hZ2UgaGFzIG5vIHNlcnZlciBpZCB5ZXQnLCAnZXJyb3InKTsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOyB9CiAgICB2YXIgbmV4dCA9ICFpbWcuZmF2b3JpdGVkOwogICAgaW1nLmZhdm9yaXRlZCA9IG5leHQ7CiAgICBpZiAob25DaGFuZ2UpIG9uQ2hhbmdlKCk7CiAgICByZXR1cm4gVi5hcGkuc2V0RmF2b3JpdGUoaWQsIG5leHQpLnRoZW4oZnVuY3Rpb24gKHVwZGF0ZWQpIHsKICAgICAgaWYgKHVwZGF0ZWQgJiYgdHlwZW9mIHVwZGF0ZWQuZmF2b3JpdGVkID09PSAnYm9vbGVhbicpIGltZy5mYXZvcml0ZWQgPSB1cGRhdGVkLmZhdm9yaXRlZDsKICAgICAgdG9hc3QobmV4dCA/ICdBZGRlZCB0byBmYXZvcml0ZXMnIDogJ1JlbW92ZWQgZnJvbSBmYXZvcml0ZXMnLCAnc3VjY2VzcycpOwogICAgICBpZiAob25DaGFuZ2UpIG9uQ2hhbmdlKCk7CiAgICAgIGlmIChjdHguc291cmNlID09PSAnZmF2b3JpdGVzJyAmJiAhaW1nLmZhdm9yaXRlZCkgewogICAgICAgIGN0eC5pdGVtcyA9IGN0eC5pdGVtcy5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGltZ0tleSh4KSAhPT0gaW1nS2V5KGltZyk7IH0pOwogICAgICAgIHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgaW1nLmZhdm9yaXRlZCA9ICFuZXh0OwogICAgICBpZiAob25DaGFuZ2UpIG9uQ2hhbmdlKCk7CiAgICAgIHRvYXN0KCdDb3VsZCBub3QgdXBkYXRlIGZhdm9yaXRlJywgJ2Vycm9yJyk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGRlbGV0ZUltYWdlRmxvdyhpbWcpIHsKICAgIHZhciBpZCA9IGltZ0lkKGltZyk7CiAgICBpZiAoIWlkKSB7IHRvYXN0KCdDYW5ub3QgZGVsZXRlIOKAlCBtaXNzaW5nIGlkJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgY29uZmlybURpYWxvZygnRGVsZXRlIHRoaXMgY3JlYXRpb24/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIFYuYXBpLmRlbGV0ZUltYWdlKGlkKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICBjdHguaXRlbXMgPSBjdHguaXRlbXMuZmlsdGVyKGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWdLZXkoeCkgIT09IGltZ0tleShpbWcpOyB9KTsKICAgICAgICBkZWxldGUgY3R4LnNlbGVjdGVkW2ltZ0tleShpbWcpXTsKICAgICAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2xpYnJhcnknICYmIFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuc2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBjdHguX3NlbGZXcml0ZSA9IHRydWU7CiAgICAgICAgICB0cnkgeyBWLnN0b3JlLnNldCgnbGlicmFyeScsIGN0eC5pdGVtcy5zbGljZSgpKTsgfSBjYXRjaCAoZSkge30KICAgICAgICAgIGN0eC5fc2VsZldyaXRlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7CiAgICAgICAgdG9hc3QoJ0RlbGV0ZWQnLCAnc3VjY2VzcycpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHRvYXN0KCdEZWxldGUgZmFpbGVkJywgJ2Vycm9yJyk7IH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBjb3B5UHJvbXB0KGltZykgewogICAgdmFyIHRleHQgPSBpbWcucHJvbXB0IHx8ICcnOwogICAgaWYgKCF0ZXh0KSB7IHRvYXN0KCdObyBwcm9tcHQgdG8gY29weScsICdpbmZvJyk7IHJldHVybjsgfQogICAgdmFyIGRvbmUgPSBmdW5jdGlvbiAoKSB7IHRvYXN0KCdQcm9tcHQgY29waWVkJywgJ3N1Y2Nlc3MnKTsgfTsKICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7CiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oZG9uZSwgZnVuY3Rpb24gKCkgeyBmYWxsYmFja0NvcHkodGV4dCwgZG9uZSk7IH0pOwogICAgfSBlbHNlIGZhbGxiYWNrQ29weSh0ZXh0LCBkb25lKTsKICB9CgogIGZ1bmN0aW9uIGZhbGxiYWNrQ29weSh0ZXh0LCBkb25lKSB7CiAgICB2YXIgdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogICAgdGEudmFsdWUgPSB0ZXh0OyB0YS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7IHRhLnN0eWxlLm9wYWNpdHkgPSAnMCc7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhKTsgdGEuZm9jdXMoKTsgdGEuc2VsZWN0KCk7CiAgICB0cnkgeyBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOyBkb25lKCk7IH0gY2F0Y2ggKGUpIHsgdG9hc3QoJ0NvcHkgZmFpbGVkJywgJ2Vycm9yJyk7IH0KICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGEpOwogIH0KCiAgZnVuY3Rpb24gZG93bmxvYWRJbWFnZShpbWcpIHsKICAgIHZhciB1cmwgPSBpbWcucmVtb3RlSW1hZ2VVUkwgfHwgaW1nLnZpZGVvVVJMIHx8IGltZy5yZW1vdGVPcmlnaW5hbEltYWdlVVJMOwogICAgaWYgKCF1cmwpIHsgdG9hc3QoJ05vdGhpbmcgdG8gZG93bmxvYWQnLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICB2YXIgZXh0ID0gaW1nLnZpZGVvVVJMID8gJ21wNCcgOiAnanBnJzsKICAgIGRvd25sb2FkKHVybCwgJ3ZhbXAtJyArIChpbWdLZXkoaW1nKSB8fCAnaW1hZ2UnKS5zbGljZSgwLCA4KSArICcuJyArIGV4dCk7CiAgfQoKICBmdW5jdGlvbiBpc1ZpZGVvKGltZykgeyByZXR1cm4gISEoaW1nICYmIGltZy52aWRlb1VSTCk7IH0KCiAgZnVuY3Rpb24gY29weVNoYXJlVGV4dChzdHIpIHsKICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7CiAgICAgIHJldHVybiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzdHIpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH0pOwogICAgfQogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsKICAgICAgICB0YS52YWx1ZSA9IHN0cjsgdGEuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnOyB0YS5zdHlsZS5vcGFjaXR5ID0gJzAnOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOyB0YS5mb2N1cygpOyB0YS5zZWxlY3QoKTsKICAgICAgICB2YXIgb2sgPSBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOwogICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGEpOwogICAgICAgIHJlc29sdmUob2spOwogICAgICB9IGNhdGNoIChlKSB7IHJlc29sdmUoZmFsc2UpOyB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHNoYXJlVVJMRm9yKGltZykgewogICAgdmFyIGlkID0gaW1nSWQoaW1nKTsKICAgIGlmICghaWQpIHJldHVybiBudWxsOwogICAgdmFyIGJhc2UgPSAoVi5jb25maWcgJiYgVi5jb25maWcuQVBJKSA/IFYuY29uZmlnLkFQSSA6ICdodHRwczovL2FwaS52b29zZXkuY29tJzsKICAgIHJldHVybiBiYXNlLnJlcGxhY2UoL1wvKyQvLCAnJykgKyAnL2dlbmVyYXRlZC9yZW5kZXIvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCk7CiAgfQoKICBmdW5jdGlvbiBzaGFyZUltYWdlKGltZykgewogICAgdmFyIHVybCA9IHNoYXJlVVJMRm9yKGltZyk7CiAgICB2YXIgdGV4dCA9IChpbWcucHJvbXB0ID8gaW1nLnByb21wdCArICdcblxuJyA6ICcnKSArICdNYWRlIHdpdGggVmFtcCBieSBWb29zZXkuJzsKICAgIGlmIChuYXZpZ2F0b3Iuc2hhcmUgJiYgdXJsKSB7CiAgICAgIG5hdmlnYXRvci5zaGFyZSh7IHRpdGxlOiAnVmFtcCcsIHRleHQ6IHRleHQsIHVybDogdXJsIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHJldHVybjsKICAgICAgICBjb3B5U2hhcmVMaW5rKHVybCk7CiAgICAgIH0pOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodXJsKSB7IGNvcHlTaGFyZUxpbmsodXJsKTsgcmV0dXJuOyB9CiAgICBpZiAoaW1nLnJlbW90ZUltYWdlVVJMIHx8IGltZy52aWRlb1VSTCkgeyBkb3dubG9hZEltYWdlKGltZyk7IHJldHVybjsgfQogICAgdG9hc3QoJ05vdGhpbmcgdG8gc2hhcmUnLCAnZXJyb3InKTsKICB9CgogIGZ1bmN0aW9uIGNvcHlTaGFyZUxpbmsodXJsKSB7CiAgICBjb3B5U2hhcmVUZXh0KHVybCkudGhlbihmdW5jdGlvbiAob2spIHsKICAgICAgdG9hc3Qob2sgPyAnU2hhcmUgbGluayBjb3BpZWQnIDogJ0NvcHkgdGhpcyBsaW5rOiAnICsgdXJsLCBvayA/ICdzdWNjZXNzJyA6ICdpbmZvJyk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHJlbWl4SW1hZ2UoaW1nKSB7CiAgICB2YXIgcGFyYW1zID0gW107CiAgICBpZiAoaW1nLnByb21wdCkgcGFyYW1zLnB1c2goJ3Byb21wdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGltZy5wcm9tcHQpKTsKICAgIGlmIChpbWcubW9kZWwpIHBhcmFtcy5wdXNoKCdtb2RlbD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGltZy5tb2RlbCkpOwogICAgdmFyIHNyYyA9IGltZy5yZW1vdGVJbWFnZVVSTCB8fCBpbWcucmVtb3RlT3JpZ2luYWxJbWFnZVVSTDsKICAgIGlmIChzcmMpIHBhcmFtcy5wdXNoKCdpbWFnZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHNyYykpOwogICAgY2FwdHVyZVNjcm9sbCgpOwogICAgZ28oJyMvY3JlYXRlJyArIChwYXJhbXMubGVuZ3RoID8gJz8nICsgcGFyYW1zLmpvaW4oJyYnKSA6ICcnKSk7CiAgfQoKICBmdW5jdGlvbiBjbG9zZU1lbnUoKSB7CiAgICBpZiAoY3R4ICYmIGN0eC5tZW51RWwgJiYgY3R4Lm1lbnVFbC5wYXJlbnROb2RlKSBjdHgubWVudUVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY3R4Lm1lbnVFbCk7CiAgICBpZiAoY3R4KSBjdHgubWVudUVsID0gbnVsbDsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25Eb2NDbGlja0Nsb3NlTWVudSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25NZW51S2V5LCB0cnVlKTsKICB9CgogIGZ1bmN0aW9uIG9uRG9jQ2xpY2tDbG9zZU1lbnUoZSkgewogICAgaWYgKGN0eCAmJiBjdHgubWVudUVsICYmICFjdHgubWVudUVsLmNvbnRhaW5zKGUudGFyZ2V0KSkgY2xvc2VNZW51KCk7CiAgfQogIGZ1bmN0aW9uIG9uTWVudUtleShlKSB7IGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNsb3NlTWVudSgpOyB9CgogIGZ1bmN0aW9uIG9wZW5Db250ZXh0TWVudShpbWcsIHgsIHksIG9uQ2hhbmdlKSB7CiAgICBjbG9zZU1lbnUoKTsKICAgIHZhciBtZW51ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1lbnUgZ2xhc3MtY2FyZCcsIHJvbGU6ICdtZW51JyB9KTsKICAgIFMobWVudSwgJ21pbi13aWR0aDoyMDBweDtwYWRkaW5nOjZweDtib3JkZXItcmFkaXVzOnZhcigtLXYtcmFkaXVzLXNtLDE1cHgpO2JhY2tncm91bmQ6JyArIEdMQVNTX0JHICsgJztib3JkZXI6MXB4IHNvbGlkICcgKyBMSU5FICsgJztib3gtc2hhZG93OjAgMTZweCA0OHB4IHJnYmEoMCwwLDAsLjQ1KTtvdmVyZmxvdzpoaWRkZW4nKTsKCiAgICBmdW5jdGlvbiBpdGVtKGxhYmVsLCBpYywgZm4sIGRhbmdlcikgewogICAgICB2YXIgYiA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1tZW51X19pdGVtJyArIChkYW5nZXIgPyAnIHYtbWVudV9faXRlbS0tZGFuZ2VyJyA6ICcnKSwgdHlwZTogJ2J1dHRvbicsIHJvbGU6ICdtZW51aXRlbScgfSwKICAgICAgICBpYyA/IGljb24oaWMpIDogbnVsbCwgZWwoJ3NwYW4nLCB7IHRleHQ6IGxhYmVsIH0pKTsKICAgICAgUyhiLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDt3aWR0aDoxMDAlO3BhZGRpbmc6MTBweCAxMnB4O2JvcmRlcjowO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6JyArIChkYW5nZXIgPyAndmFyKC0tY29sb3ItZXJyb3IsICNGNzMzNjMpJyA6ICd2YXIoLS12LWluaywgI2Y1ZjVmNyknKSArICc7Zm9udDppbmhlcml0O2ZvbnQtc2l6ZToxNHB4O3RleHQtYWxpZ246bGVmdDtib3JkZXItcmFkaXVzOjlweDtjdXJzb3I6cG9pbnRlcicpOwogICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBmdW5jdGlvbiAoKSB7IGIuc3R5bGUuYmFja2dyb3VuZCA9IGRhbmdlciA/ICdyZ2JhKDI0Nyw1MSw5OSwuMTQpJyA6ICdyZ2JhKDI1NSwyNTUsMjU1LC4wNyknOyB9KTsKICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKCkgeyBiLnN0eWxlLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnOyB9KTsKICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGZ1bmN0aW9uICgpIHsgYi5zdHlsZS5iYWNrZ3JvdW5kID0gZGFuZ2VyID8gJ3JnYmEoMjQ3LDUxLDk5LC4xNCknIDogJ3JnYmEoMjU1LDI1NSwyNTUsLjA3KSc7IH0pOwogICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbiAoKSB7IGIuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7IH0pOwogICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBjbG9zZU1lbnUoKTsgZm4oKTsgfSk7CiAgICAgIHJldHVybiBiOwogICAgfQoKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbSgnT3BlbicsICdncmlkJywgZnVuY3Rpb24gKCkgeyBvcGVuSW1hZ2UoaW1nKTsgfSkpOwogICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKCdSZW1peCcsICd2YXJpYXRpb25zJywgZnVuY3Rpb24gKCkgeyByZW1peEltYWdlKGltZyk7IH0pKTsKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbShpbWcuZmF2b3JpdGVkID8gJ1VuZmF2b3JpdGUnIDogJ0Zhdm9yaXRlJywgaW1nLmZhdm9yaXRlZCA/ICdoZWFydEZpbGwnIDogJ2hlYXJ0JywgZnVuY3Rpb24gKCkgeyB0b2dnbGVGYXZvcml0ZShpbWcsIG9uQ2hhbmdlKTsgfSkpOwogICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKCdBZGQgdG8gRm9sZGVyJywgJ2ZvbGRlcicsIGZ1bmN0aW9uICgpIHsgYXNzaWduVG9Gb2xkZXJGbG93KFtpbWdJZChpbWcpXSk7IH0pKTsKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbSgnQ29weSBQcm9tcHQnLCAnY29weScsIGZ1bmN0aW9uICgpIHsgY29weVByb21wdChpbWcpOyB9KSk7CiAgICBtZW51LmFwcGVuZENoaWxkKGl0ZW0oJ1NoYXJlJywgJ3NoYXJlJywgZnVuY3Rpb24gKCkgeyBzaGFyZUltYWdlKGltZyk7IH0pKTsKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbSgnRG93bmxvYWQnLCAnZG93bmxvYWQnLCBmdW5jdGlvbiAoKSB7IGRvd25sb2FkSW1hZ2UoaW1nKTsgfSkpOwogICAgbWVudS5hcHBlbmRDaGlsZChTKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tZW51X19zZXAnIH0pLCAnaGVpZ2h0OjFweDttYXJnaW46NnB4IDhweDtiYWNrZ3JvdW5kOicgKyBMSU5FKSk7CiAgICBtZW51LmFwcGVuZENoaWxkKGl0ZW0oJ0RlbGV0ZScsICd0cmFzaCcsIGZ1bmN0aW9uICgpIHsgZGVsZXRlSW1hZ2VGbG93KGltZyk7IH0sIHRydWUpKTsKCiAgICBtZW51LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJzsKICAgIG1lbnUuc3R5bGUuekluZGV4ID0gJzEyMDAnOwogICAgbWVudS5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnOwogICAgbWVudS5zdHlsZS50b3AgPSAnMCc7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lbnUpOwogICAgY3R4Lm1lbnVFbCA9IG1lbnU7CgogICAgdmFyIHJlY3QgPSBtZW51LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgdmFyIHZ3ID0gd2luZG93LmlubmVyV2lkdGgsIHZoID0gd2luZG93LmlubmVySGVpZ2h0OwogICAgdmFyIHB4ID0gTWF0aC5taW4oeCwgdncgLSByZWN0LndpZHRoIC0gOCk7CiAgICB2YXIgcHkgPSBNYXRoLm1pbih5LCB2aCAtIHJlY3QuaGVpZ2h0IC0gOCk7CiAgICBtZW51LnN0eWxlLmxlZnQgPSBNYXRoLm1heCg4LCBweCkgKyAncHgnOwogICAgbWVudS5zdHlsZS50b3AgPSBNYXRoLm1heCg4LCBweSkgKyAncHgnOwoKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uRG9jQ2xpY2tDbG9zZU1lbnUsIHRydWUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25NZW51S2V5LCB0cnVlKTsKICAgIH0sIDApOwogIH0KCiAgZnVuY3Rpb24gb3BlbkltYWdlKGltZykgewogICAgdmFyIGlkID0gaW1nSWQoaW1nKTsKICAgIGlmICghaWQpIHsgdG9hc3QoJ1RoaXMgY3JlYXRpb24gaXMgbm90IHNhdmVkIHlldCcsICdpbmZvJyk7IHJldHVybjsgfQogICAgY2FwdHVyZVNjcm9sbCgpOwogICAgZ28oJyMvaW1hZ2UvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCkpOwogIH0KCiAgZnVuY3Rpb24gY2FwdHVyZVNjcm9sbCgpIHsKICAgIGN0eC5zY3JvbGxZID0gKGN0eC5zY3JvbGxUYXJnZXQgJiYgY3R4LnNjcm9sbFRhcmdldCAhPT0gd2luZG93KQogICAgICA/IGN0eC5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wCiAgICAgIDogKHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IDApOwogICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuc2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7IFYuc3RvcmUuc2V0KCdsaWJyYXJ5U2Nyb2xsWScsIGN0eC5zY3JvbGxZKTsgfSBjYXRjaCAoZSkge30KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlc3RvcmVTY3JvbGwoKSB7CiAgICB2YXIgeSA9IGN0eC5zY3JvbGxZOwogICAgaWYgKCF5ICYmIFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuZ2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7IHkgPSBWLnN0b3JlLmdldCgnbGlicmFyeVNjcm9sbFknKSB8fCAwOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgaWYgKCF5KSByZXR1cm47CiAgICB2YXIgYXBwbHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChjdHguc2Nyb2xsVGFyZ2V0ICYmIGN0eC5zY3JvbGxUYXJnZXQgIT09IHdpbmRvdykgY3R4LnNjcm9sbFRhcmdldC5zY3JvbGxUb3AgPSB5OwogICAgICBlbHNlIHdpbmRvdy5zY3JvbGxUbygwLCB5KTsKICAgIH07CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkgeyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYXBwbHkpOyB9KTsKICB9CgogIGZ1bmN0aW9uIGVudGVyU2VsZWN0KGluaXRpYWxJbWcpIHsKICAgIGN0eC5zZWxlY3RNb2RlID0gdHJ1ZTsKICAgIGlmIChpbml0aWFsSW1nKSBjdHguc2VsZWN0ZWRbaW1nS2V5KGluaXRpYWxJbWcpXSA9IHRydWU7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICByZW5kZXJHcmlkKCk7CiAgfQogIGZ1bmN0aW9uIGV4aXRTZWxlY3QoKSB7CiAgICBjdHguc2VsZWN0TW9kZSA9IGZhbHNlOwogICAgY3R4LnNlbGVjdGVkID0ge307CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICByZW5kZXJHcmlkKCk7CiAgfQogIGZ1bmN0aW9uIHRvZ2dsZVNlbGVjdChpbWcpIHsKICAgIHZhciBrID0gaW1nS2V5KGltZyk7CiAgICBpZiAoY3R4LnNlbGVjdGVkW2tdKSBkZWxldGUgY3R4LnNlbGVjdGVkW2tdOwogICAgZWxzZSBjdHguc2VsZWN0ZWRba10gPSB0cnVlOwogICAgcmVuZGVyVG9vbGJhcigpOwogICAgcmVuZGVyU2VsZWN0aW9uU3RhdGVGb3Ioayk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGVkQ291bnQoKSB7IHJldHVybiBPYmplY3Qua2V5cyhjdHguc2VsZWN0ZWQpLmxlbmd0aDsgfQogIGZ1bmN0aW9uIHNlbGVjdGVkSW1hZ2VzKCkgewogICAgdmFyIG91dCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdHguaXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGN0eC5zZWxlY3RlZFtpbWdLZXkoY3R4Lml0ZW1zW2ldKV0pIG91dC5wdXNoKGN0eC5pdGVtc1tpXSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBmdW5jdGlvbiBzZWxlY3RBbGxWaXNpYmxlKCkgewogICAgdmFyIHZpcyA9IHZpc2libGVJdGVtcygpOwogICAgdmFyIGFsbFNlbGVjdGVkID0gdmlzLmxlbmd0aCAmJiB2aXMuZXZlcnkoZnVuY3Rpb24gKGltZykgeyByZXR1cm4gY3R4LnNlbGVjdGVkW2ltZ0tleShpbWcpXTsgfSk7CiAgICBpZiAoYWxsU2VsZWN0ZWQpIGN0eC5zZWxlY3RlZCA9IHt9OwogICAgZWxzZSB2aXMuZm9yRWFjaChmdW5jdGlvbiAoaW1nKSB7IGN0eC5zZWxlY3RlZFtpbWdLZXkoaW1nKV0gPSB0cnVlOyB9KTsKICAgIHJlbmRlclRvb2xiYXIoKTsKICAgIHJlbmRlckdyaWQoKTsKICB9CgogIGZ1bmN0aW9uIHJlbmRlclNlbGVjdGlvblN0YXRlRm9yKGtleSkgewogICAgaWYgKCFjdHguZ3JpZEVsKSByZXR1cm47CiAgICB2YXIgY2VsbCA9IGN0eC5ncmlkRWwucXVlcnlTZWxlY3RvcignW2RhdGEta2V5PSInICsgY3NzRXNjKGtleSkgKyAnIl0nKTsKICAgIGlmICghY2VsbCkgcmV0dXJuOwogICAgdmFyIG9uID0gISFjdHguc2VsZWN0ZWRba2V5XTsKICAgIGNlbGwuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtc2VsZWN0ZWQnLCBvbik7CiAgICB2YXIgY2IgPSBjZWxsLnF1ZXJ5U2VsZWN0b3IoJy52LWxpYi1jaGVjaycpOwogICAgaWYgKGNiKSB7CiAgICAgIGNiLmNsYXNzTGlzdC50b2dnbGUoJ2lzLW9uJywgb24pOwogICAgICBjYi5zZXRBdHRyaWJ1dGUoJ2FyaWEtY2hlY2tlZCcsIG9uID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgICAgIGNiLnN0eWxlLmJhY2tncm91bmQgPSBvbiA/IEdSQURJRU5UIDogQkFER0VfQkc7CiAgICAgIGNiLmlubmVySFRNTCA9ICcnOwogICAgICBpZiAob24pIGNiLmFwcGVuZENoaWxkKGljb24oJ2NoZWNrJykpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3NzRXNjKHMpIHsKICAgIGlmICh3aW5kb3cuQ1NTICYmIENTUy5lc2NhcGUpIHJldHVybiBDU1MuZXNjYXBlKHMpOwogICAgcmV0dXJuIFN0cmluZyhzKS5yZXBsYWNlKC9bIlxcXF1cW10vZywgJ1xcJCYnKTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoRGVsZXRlKCkgewogICAgdmFyIGltZ3MgPSBzZWxlY3RlZEltYWdlcygpOwogICAgaWYgKCFpbWdzLmxlbmd0aCkgcmV0dXJuOwogICAgY29uZmlybURpYWxvZygnRGVsZXRlICcgKyBpbWdzLmxlbmd0aCArICcgY3JlYXRpb24nICsgKGltZ3MubGVuZ3RoID4gMSA/ICdzJyA6ICcnKSArICc/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIHZhciBqb2JzID0gaW1ncy5tYXAoZnVuY3Rpb24gKGltZykgewogICAgICAgIHZhciBpZCA9IGltZ0lkKGltZyk7CiAgICAgICAgaWYgKCFpZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgICAgICByZXR1cm4gVi5hcGkuZGVsZXRlSW1hZ2UoaWQpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gaW1nS2V5KGltZyk7IH0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH0pOwogICAgICB9KTsKICAgICAgUHJvbWlzZS5hbGwoam9icykudGhlbihmdW5jdGlvbiAocmVzdWx0cykgewogICAgICAgIHZhciByZW1vdmVkID0ge307CiAgICAgICAgcmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IGlmIChrKSByZW1vdmVkW2tdID0gdHJ1ZTsgfSk7CiAgICAgICAgY3R4Lml0ZW1zID0gY3R4Lml0ZW1zLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4gIXJlbW92ZWRbaW1nS2V5KHgpXTsgfSk7CiAgICAgICAgdmFyIGZhaWxlZCA9IHJlc3VsdHMuZmlsdGVyKGZ1bmN0aW9uIChrKSB7IHJldHVybiAhazsgfSkubGVuZ3RoOwogICAgICAgIGlmIChjdHguc291cmNlID09PSAnbGlicmFyeScgJiYgVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5zZXQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGN0eC5fc2VsZldyaXRlID0gdHJ1ZTsKICAgICAgICAgIHRyeSB7IFYuc3RvcmUuc2V0KCdsaWJyYXJ5JywgY3R4Lml0ZW1zLnNsaWNlKCkpOyB9IGNhdGNoIChlKSB7fQogICAgICAgICAgY3R4Ll9zZWxmV3JpdGUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZXhpdFNlbGVjdCgpOwogICAgICAgIHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7CiAgICAgICAgaWYgKGZhaWxlZCkgdG9hc3QoZmFpbGVkICsgJyBjb3VsZCBub3QgYmUgZGVsZXRlZCcsICdlcnJvcicpOwogICAgICAgIGVsc2UgdG9hc3QoJ0RlbGV0ZWQgJyArIE9iamVjdC5rZXlzKHJlbW92ZWQpLmxlbmd0aCwgJ3N1Y2Nlc3MnKTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoQXNzaWduKCkgewogICAgdmFyIGlkcyA9IHNlbGVjdGVkSW1hZ2VzKCkubWFwKGltZ0lkKS5maWx0ZXIoQm9vbGVhbik7CiAgICBpZiAoIWlkcy5sZW5ndGgpIHJldHVybjsKICAgIGFzc2lnblRvRm9sZGVyRmxvdyhpZHMsIGZ1bmN0aW9uICgpIHsgZXhpdFNlbGVjdCgpOyB9KTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoRG93bmxvYWQoKSB7CiAgICB2YXIgaW1ncyA9IHNlbGVjdGVkSW1hZ2VzKCk7CiAgICBpZiAoIWltZ3MubGVuZ3RoKSByZXR1cm47CiAgICBpbWdzLmZvckVhY2goZnVuY3Rpb24gKGltZywgaSkgewogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgZG93bmxvYWRJbWFnZShpbWcpOyB9LCBpICogMjUwKTsKICAgIH0pOwogICAgdG9hc3QoJ0Rvd25sb2FkaW5nICcgKyBpbWdzLmxlbmd0aCwgJ2luZm8nKTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoU2hhcmUoKSB7CiAgICB2YXIgaW1ncyA9IHNlbGVjdGVkSW1hZ2VzKCk7CiAgICBpZiAoIWltZ3MubGVuZ3RoKSByZXR1cm47CiAgICBpZiAoaW1ncy5sZW5ndGggPT09IDEpIHsgc2hhcmVJbWFnZShpbWdzWzBdKTsgcmV0dXJuOyB9CiAgICB2YXIgbGluZXMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1ncy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgdXJsID0gc2hhcmVVUkxGb3IoaW1nc1tpXSk7CiAgICAgIGlmICh1cmwpIGxpbmVzLnB1c2godXJsKTsKICAgIH0KICAgIGlmICghbGluZXMubGVuZ3RoKSB7IHRvYXN0KCdUaGVzZSBjcmVhdGlvbnMgaGF2ZSBubyBzaGFyZSBsaW5rcyB5ZXQnLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICB2YXIgdGV4dCA9IGxpbmVzLmpvaW4oJ1xuJyk7CiAgICBpZiAobmF2aWdhdG9yLnNoYXJlKSB7CiAgICAgIG5hdmlnYXRvci5zaGFyZSh7IHRpdGxlOiAnVmFtcCcsIHRleHQ6ICdNYWRlIHdpdGggVmFtcCBieSBWb29zZXkuJywgdXJsOiBsaW5lc1swXSB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgaWYgKGVyciAmJiBlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47CiAgICAgICAgY29weVNoYXJlVGV4dCh0ZXh0KS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/IGxpbmVzLmxlbmd0aCArICcgbGlua3MgY29waWVkJyA6ICdDb3VsZCBub3QgY29weSBsaW5rcycsIG9rID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJyk7IH0pOwogICAgICB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29weVNoYXJlVGV4dCh0ZXh0KS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/IGxpbmVzLmxlbmd0aCArICcgbGlua3MgY29waWVkJyA6ICdDb3VsZCBub3QgY29weSBsaW5rcycsIG9rID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJyk7IH0pOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyVG9vbGJhcigpIHsKICAgIGlmICghY3R4LnRvb2xiYXJFbCkgcmV0dXJuOwogICAgY3R4LnRvb2xiYXJFbC5pbm5lckhUTUwgPSAnJzsKCiAgICBpZiAoY3R4LnNlbGVjdE1vZGUpIHsKICAgICAgdmFyIGJhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItc2VsYmFyIGdsYXNzLWNhcmQnIH0sCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsICdhcmlhLWxhYmVsJzogJ0V4aXQgc2VsZWN0aW9uJywgdGl0bGU6ICdEb25lJywgb25jbGljazogZXhpdFNlbGVjdCB9LCBpY29uKCdjbG9zZScpLCAnRG9uZScpLAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6IHNlbGVjdGVkQ291bnQoKSArICcgc2VsZWN0ZWQnIH0pLAogICAgICAgIFMoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1saWItc3BhY2VyJyB9KSwgJ2ZsZXg6MSAxIGF1dG8nKSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgb25jbGljazogc2VsZWN0QWxsVmlzaWJsZSB9LCAnU2VsZWN0IEFsbCcpLAogICAgICAgIGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nLCBkaXNhYmxlZDogc2VsZWN0ZWRDb3VudCgpID8gbnVsbCA6ICdkaXNhYmxlZCcsIG9uY2xpY2s6IGJhdGNoU2hhcmUgfSwgaWNvbignc2hhcmUnKSwgJ1NoYXJlJyksCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIGRpc2FibGVkOiBzZWxlY3RlZENvdW50KCkgPyBudWxsIDogJ2Rpc2FibGVkJywgb25jbGljazogYmF0Y2hEb3dubG9hZCB9LCBpY29uKCdkb3dubG9hZCcpLCAnRG93bmxvYWQnKSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgZGlzYWJsZWQ6IHNlbGVjdGVkQ291bnQoKSA/IG51bGwgOiAnZGlzYWJsZWQnLCBvbmNsaWNrOiBiYXRjaEFzc2lnbiB9LCBpY29uKCdmb2xkZXInKSwgJ0ZvbGRlcicpLAogICAgICAgIGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWRhbmdlciB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgZGlzYWJsZWQ6IHNlbGVjdGVkQ291bnQoKSA/IG51bGwgOiAnZGlzYWJsZWQnLCBvbmNsaWNrOiBiYXRjaERlbGV0ZSB9LCBpY29uKCd0cmFzaCcpLCAnRGVsZXRlJykKICAgICAgKTsKICAgICAgUyhiYXIsICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZsZXgtd3JhcDp3cmFwO2dhcDo5cHg7cGFkZGluZzoxMHB4IDE0cHg7Ym9yZGVyLXJhZGl1czp2YXIoLS12LXJhZGl1cy1zbSwxNXB4KTttYXJnaW4tYm90dG9tOnZhcigtLXNwYWNlLW1kLDE1cHgpJyk7CiAgICAgIGN0eC50b29sYmFyRWwuYXBwZW5kQ2hpbGQoYmFyKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciB0YWJzID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNoaXAtcm93Jywgcm9sZTogJ3RhYmxpc3QnLCAnYXJpYS1sYWJlbCc6ICdMaWJyYXJ5IHNvdXJjZScgfSk7CiAgICBmdW5jdGlvbiB0YWIobGFiZWwsIHNyYywgaWMsIG9uQ2xpY2spIHsKICAgICAgdmFyIGFjdGl2ZSA9IGN0eC5zb3VyY2UgPT09IHNyYzsKICAgICAgdmFyIGIgPSBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAndi1jaGlwJyArIChhY3RpdmUgPyAnIHYtY2hpcC0tYWN0aXZlJyA6ICcnKSwKICAgICAgICB0eXBlOiAnYnV0dG9uJywgcm9sZTogJ3RhYicsICdhcmlhLXNlbGVjdGVkJzogYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJwogICAgICB9LCBpYyA/IGljb24oaWMpIDogbnVsbCwgZWwoJ3NwYW4nLCB7IHRleHQ6IGxhYmVsIH0pKTsKICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2spOwogICAgICByZXR1cm4gYjsKICAgIH0KICAgIHRhYnMuYXBwZW5kQ2hpbGQodGFiKCdBbGwnLCAnbGlicmFyeScsICdncmlkJywgb3BlbkxpYnJhcnkpKTsKICAgIHRhYnMuYXBwZW5kQ2hpbGQodGFiKCdGYXZvcml0ZXMnLCAnZmF2b3JpdGVzJywgJ2hlYXJ0Jywgb3BlbkZhdm9yaXRlcykpOwogICAgdGFicy5hcHBlbmRDaGlsZCh0YWIoJ0ZvbGRlcnMnLCAnZm9sZGVyJywgJ2ZvbGRlcicsIG9wZW5Gb2xkZXJzTWFuYWdlcikpOwoKICAgIGlmIChjdHguc291cmNlID09PSAnZm9sZGVyJyAmJiBjdHguZm9sZGVySUQpIHsKICAgICAgdmFyIGZuYW1lID0gJyc7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3R4LmZvbGRlcnMubGVuZ3RoOyBpKyspIGlmIChjdHguZm9sZGVyc1tpXS5pZCA9PT0gY3R4LmZvbGRlcklEKSBmbmFtZSA9IGN0eC5mb2xkZXJzW2ldLm5hbWU7CiAgICAgIHZhciBwaWxsID0gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jaGlwIHYtY2hpcC0tYWN0aXZlJyB9LAogICAgICAgIGljb24oJ2ZvbGRlcicpLCBlbCgnc3BhbicsIHsgdGV4dDogZm5hbWUgfHwgJ0ZvbGRlcicgfSksCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWNoaXBfX3gnLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiAnTGVhdmUgZm9sZGVyJywgb25jbGljazogb3BlbkxpYnJhcnkgfSwgaWNvbignY2xvc2UnKSkpOwogICAgICB0YWJzLmFwcGVuZENoaWxkKHBpbGwpOwogICAgfQoKICAgIHZhciBzZWFyY2hJbnB1dCA9IGVsKCdpbnB1dCcsIHsKICAgICAgY2xhc3M6ICd2LWZpZWxkIHYtbGliLXNlYXJjaCcsIHR5cGU6ICdzZWFyY2gnLCBwbGFjZWhvbGRlcjogJ1NlYXJjaCBwcm9tcHRzLCBtb2RlbHMsIHRhZ3PigKYnLAogICAgICB2YWx1ZTogY3R4LnF1ZXJ5LCAnYXJpYS1sYWJlbCc6ICdTZWFyY2ggbGlicmFyeScKICAgIH0pOwogICAgdmFyIG9uU2VhcmNoID0gZGVib3VuY2UoZnVuY3Rpb24gKHZhbCkgewogICAgICBjdHgucXVlcnkgPSB2YWwudHJpbSgpOwogICAgICByZW5kZXJHcmlkKCk7IHJlbmRlclN0YXR1cygpOwogICAgfSwgMjAwKTsKICAgIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24gKCkgeyBvblNlYXJjaChzZWFyY2hJbnB1dC52YWx1ZSk7IH0pOwogICAgUyhzZWFyY2hJbnB1dCwgJ2ZsZXg6MSAxIGF1dG87bWluLXdpZHRoOjAnKTsKICAgIHZhciBzZWFyY2hJY29uID0gaWNvbignc2VhcmNoJyk7CiAgICBTKHNlYXJjaEljb24sICdwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjEycHg7dG9wOjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTtvcGFjaXR5Oi41NTtwb2ludGVyLWV2ZW50czpub25lO2xpbmUtaGVpZ2h0OjAnKTsKICAgIFMoc2VhcmNoSW5wdXQsICdwYWRkaW5nLWxlZnQ6MzZweCcpOwogICAgdmFyIHNlYXJjaFdyYXAgPSBlbCgnbGFiZWwnLCB7IGNsYXNzOiAndi1saWItc2VhcmNod3JhcCcgfSwgc2VhcmNoSWNvbiwgc2VhcmNoSW5wdXQpOwogICAgUyhzZWFyY2hXcmFwLCAncG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4OjEgMSAyMjBweDttaW4td2lkdGg6MTYwcHgnKTsKCiAgICB2YXIgc29ydFNlbCA9IGVsKCdzZWxlY3QnLCB7IGNsYXNzOiAndi1zZWxlY3Qgdi1saWItc29ydCcsICdhcmlhLWxhYmVsJzogJ1NvcnQgbGlicmFyeScgfSk7CiAgICBTT1JUUy5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7CiAgICAgIHZhciBvID0gZWwoJ29wdGlvbicsIHsgdmFsdWU6IHMua2V5LCB0ZXh0OiBzLmxhYmVsIH0pOwogICAgICBpZiAocy5rZXkgPT09IGN0eC5zb3J0KSBvLnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgc29ydFNlbC5hcHBlbmRDaGlsZChvKTsKICAgIH0pOwogICAgc29ydFNlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7IGN0eC5zb3J0ID0gc29ydFNlbC52YWx1ZTsgcmVuZGVyR3JpZCgpOyByZW5kZXJTdGF0dXMoKTsgfSk7CgogICAgdmFyIHNlbEJ0biA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IGVudGVyU2VsZWN0KCk7IH0gfSwgaWNvbignY2hlY2snKSwgJ1NlbGVjdCcpOwoKICAgIHZhciBjb250cm9scyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItY29udHJvbHMnIH0sIHNlYXJjaFdyYXAsIHNvcnRTZWwsIHNlbEJ0bik7CiAgICBTKGNvbnRyb2xzLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LXdyYXA6d3JhcDtnYXA6OXB4O2ZsZXg6MSAxIDMyMHB4O21pbi13aWR0aDowJyk7CiAgICBTKHRhYnMsICdmbGV4OjAgMCBhdXRvJyk7CgogICAgdmFyIHRvb2xiYXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtbGliLXRvb2xiYXInIH0sIHRhYnMsIGNvbnRyb2xzKTsKICAgIFModG9vbGJhciwgJ2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7ZmxleC13cmFwOndyYXA7Z2FwOjEycHg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47bWFyZ2luLWJvdHRvbTp2YXIoLS1zcGFjZS1tZCwxNXB4KScpOwogICAgY3R4LnRvb2xiYXJFbC5hcHBlbmRDaGlsZCh0b29sYmFyKTsKCiAgICB2YXIgcHJlc2VudCA9IGF2YWlsYWJsZVRhZ3MoKTsKICAgIHZhciBpbmR1c3RyaWVzID0gKFYuZGF0YSAmJiBBcnJheS5pc0FycmF5KFYuZGF0YS5pbmR1c3RyaWVzKSkgPyBWLmRhdGEuaW5kdXN0cmllcyA6IFtdOwogICAgdmFyIGNoaXBzID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNoaXAtcm93Jywgcm9sZTogJ2dyb3VwJywgJ2FyaWEtbGFiZWwnOiAnRmlsdGVyIGJ5IHRhZycgfSk7CiAgICB2YXIgYWxsQ2hpcCA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jaGlwJyArIChjdHguaW5kdXN0cnkgPyAnJyA6ICcgdi1jaGlwLS1hY3RpdmUnKSwgdHlwZTogJ2J1dHRvbicsIHRleHQ6ICdBbGwnLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IGN0eC5pbmR1c3RyeSA9IG51bGw7IHJlbmRlclRvb2xiYXIoKTsgcmVuZGVyR3JpZCgpOyByZW5kZXJTdGF0dXMoKTsgfSB9KTsKICAgIGNoaXBzLmFwcGVuZENoaWxkKGFsbENoaXApOwogICAgdmFyIGFkZGVkID0ge307CiAgICBpbmR1c3RyaWVzLmZvckVhY2goZnVuY3Rpb24gKGluZCkgewogICAgICBpZiAoIXByZXNlbnRbU3RyaW5nKGluZC5rZXkpLnRvTG93ZXJDYXNlKCldICYmICFwcmVzZW50W1N0cmluZyhpbmQubGFiZWwpLnRvTG93ZXJDYXNlKCldKSByZXR1cm47CiAgICAgIHZhciBrZXkgPSBwcmVzZW50W1N0cmluZyhpbmQua2V5KS50b0xvd2VyQ2FzZSgpXSA/IGluZC5rZXkgOiBpbmQubGFiZWw7CiAgICAgIGFkZGVkW1N0cmluZyhrZXkpLnRvTG93ZXJDYXNlKCldID0gdHJ1ZTsKICAgICAgdmFyIGFjdGl2ZSA9IGN0eC5pbmR1c3RyeSAmJiBjdHguaW5kdXN0cnkudG9Mb3dlckNhc2UoKSA9PT0gU3RyaW5nKGtleSkudG9Mb3dlckNhc2UoKTsKICAgICAgdmFyIGMgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY2hpcCcgKyAoYWN0aXZlID8gJyB2LWNoaXAtLWFjdGl2ZScgOiAnJyksIHR5cGU6ICdidXR0b24nLCB0ZXh0OiBpbmQubGFiZWwgfSk7CiAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7IGN0eC5pbmR1c3RyeSA9IGFjdGl2ZSA/IG51bGwgOiBrZXk7IHJlbmRlclRvb2xiYXIoKTsgcmVuZGVyR3JpZCgpOyByZW5kZXJTdGF0dXMoKTsgfSk7CiAgICAgIGNoaXBzLmFwcGVuZENoaWxkKGMpOwogICAgfSk7CiAgICBPYmplY3Qua2V5cyhwcmVzZW50KS5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHsKICAgICAgaWYgKGFkZGVkW3RhZ10pIHJldHVybjsKICAgICAgdmFyIGFjdGl2ZSA9IGN0eC5pbmR1c3RyeSAmJiBjdHguaW5kdXN0cnkudG9Mb3dlckNhc2UoKSA9PT0gdGFnOwogICAgICB2YXIgYyA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jaGlwJyArIChhY3RpdmUgPyAnIHYtY2hpcC0tYWN0aXZlJyA6ICcnKSwgdHlwZTogJ2J1dHRvbicsIHRleHQ6IHRhZyB9KTsKICAgICAgYy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgY3R4LmluZHVzdHJ5ID0gYWN0aXZlID8gbnVsbCA6IHRhZzsgcmVuZGVyVG9vbGJhcigpOyByZW5kZXJHcmlkKCk7IHJlbmRlclN0YXR1cygpOyB9KTsKICAgICAgY2hpcHMuYXBwZW5kQ2hpbGQoYyk7CiAgICB9KTsKICAgIGlmIChjaGlwcy5jaGlsZHJlbi5sZW5ndGggPiAxKSB7IFMoY2hpcHMsICdtYXJnaW4tYm90dG9tOnZhcigtLXNwYWNlLW1kLDE1cHgpJyk7IGN0eC50b29sYmFyRWwuYXBwZW5kQ2hpbGQoY2hpcHMpOyB9CiAgfQoKICBmdW5jdGlvbiBzaG93U2tlbGV0b25zKCkgewogICAgaWYgKCFjdHguZ3JpZEVsKSByZXR1cm47CiAgICBjdHguZ3JpZEVsLmlubmVySFRNTCA9ICcnOwogICAgY3R4LmdyaWRFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtYnVzeScsICd0cnVlJyk7CiAgICB2YXIgbiA9IDk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgc2s7CiAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnNrZWxldG9uID09PSAnZnVuY3Rpb24nKSBzayA9IFYudWkuc2tlbGV0b24oJ2NhcmQnKTsKICAgICAgZWxzZSBzayA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbiB2LXNrZWxldG9uLS10aWxlJyB9KTsKICAgICAgY3R4LmdyaWRFbC5hcHBlbmRDaGlsZChzayk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBidWlsZENlbGwoaW1nKSB7CiAgICB2YXIga2V5ID0gaW1nS2V5KGltZyk7CiAgICB2YXIgY2VsbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItY2VsbCcsIGRhdGFzZXQ6IHsga2V5OiBrZXkgfSB9KTsKICAgIFMoY2VsbCwgJ3Bvc2l0aW9uOnJlbGF0aXZlO2JvcmRlci1yYWRpdXM6dmFyKC0tdi1yYWRpdXMtc20sMTVweCk7b3ZlcmZsb3c6aGlkZGVuJyk7CiAgICB2YXIgb25DaGFuZ2UgPSBmdW5jdGlvbiAoKSB7IHJlbmRlckZhdkJhZGdlKGNlbGwsIGltZyk7IH07CgogICAgdmFyIGNhcmROb2RlOwogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaW1nQ2FyZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBjYXJkTm9kZSA9IFYudWkuaW1nQ2FyZChpbWcsIHsgYmVmb3JlQWZ0ZXI6IHRydWUsIG9uVGFwOiBmdW5jdGlvbiAoKSB7IGlmIChjdHguc2VsZWN0TW9kZSkgdG9nZ2xlU2VsZWN0KGltZyk7IGVsc2Ugb3BlbkltYWdlKGltZyk7IH0gfSk7CiAgICB9IGVsc2UgewogICAgICBjYXJkTm9kZSA9IGJ1aWxkRmFsbGJhY2tDYXJkKGltZyk7CiAgICB9CiAgICBjZWxsLmFwcGVuZENoaWxkKGNhcmROb2RlKTsKCiAgICBpZiAoaXNWaWRlbyhpbWcpKSB7CiAgICAgIHZhciB2YmFkZ2UgPSBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWxpYi12aWRlb2JhZGdlJywgJ2FyaWEtbGFiZWwnOiAnVmlkZW8nIH0sIGljb24oJ2ZpbG0nKSk7CiAgICAgIGNlbGwuYXBwZW5kQ2hpbGQodmJhZGdlKTsKICAgIH0KCiAgICB2YXIgQlROID0gJ2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6MzBweDtoZWlnaHQ6MzBweDtib3JkZXItcmFkaXVzOjUwJTtib3JkZXI6MXB4IHNvbGlkICcgKyBMSU5FICsgJztjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyO2JhY2tkcm9wLWZpbHRlcjpibHVyKDhweCk7LXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6Ymx1cig4cHgpO3RyYW5zaXRpb246dHJhbnNmb3JtIC4xMnMgZWFzZSxiYWNrZ3JvdW5kIC4xMnMgZWFzZTtsaW5lLWhlaWdodDowJzsKCiAgICB2YXIgY2hlY2sgPSBlbCgnYnV0dG9uJywgewogICAgICBjbGFzczogJ3YtbGliLWNoZWNrJyArIChjdHguc2VsZWN0ZWRba2V5XSA/ICcgaXMtb24nIDogJycpLCB0eXBlOiAnYnV0dG9uJywgcm9sZTogJ2NoZWNrYm94JywKICAgICAgJ2FyaWEtY2hlY2tlZCc6IGN0eC5zZWxlY3RlZFtrZXldID8gJ3RydWUnIDogJ2ZhbHNlJywgJ2FyaWEtbGFiZWwnOiAnU2VsZWN0IGNyZWF0aW9uJywKICAgICAgdGFiaW5kZXg6IGN0eC5zZWxlY3RNb2RlID8gJzAnIDogJy0xJwogICAgfSk7CiAgICBTKGNoZWNrLCAncG9zaXRpb246YWJzb2x1dGU7dG9wOjhweDtsZWZ0OjhweDt6LWluZGV4OjM7JyArIEJUTiArICc7YmFja2dyb3VuZDonICsgKGN0eC5zZWxlY3RlZFtrZXldID8gR1JBRElFTlQgOiBCQURHRV9CRykgKyAoY3R4LnNlbGVjdE1vZGUgPyAnJyA6ICc7b3BhY2l0eTowO3BvaW50ZXItZXZlbnRzOm5vbmUnKSk7CiAgICBpZiAoY3R4LnNlbGVjdGVkW2tleV0pIGNoZWNrLmFwcGVuZENoaWxkKGljb24oJ2NoZWNrJykpOwogICAgY2hlY2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBlLnByZXZlbnREZWZhdWx0KCk7IHRvZ2dsZVNlbGVjdChpbWcpOyB9KTsKICAgIGNlbGwuYXBwZW5kQ2hpbGQoY2hlY2spOwoKICAgIHZhciBmYXYgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtbGliLWZhdicgKyAoaW1nLmZhdm9yaXRlZCA/ICcgaXMtb24nIDogJycpLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiBpbWcuZmF2b3JpdGVkID8gJ1VuZmF2b3JpdGUnIDogJ0Zhdm9yaXRlJywgJ2FyaWEtcHJlc3NlZCc6IGltZy5mYXZvcml0ZWQgPyAndHJ1ZScgOiAnZmFsc2UnIH0pOwogICAgUyhmYXYsICdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6OHB4O3JpZ2h0OjQ0cHg7ei1pbmRleDozOycgKyBCVE4gKyAnO2JhY2tncm91bmQ6JyArIChpbWcuZmF2b3JpdGVkID8gR1JBRElFTlQgOiBCQURHRV9CRykpOwogICAgZmF2LmFwcGVuZENoaWxkKGljb24oaW1nLmZhdm9yaXRlZCA/ICdoZWFydEZpbGwnIDogJ2hlYXJ0JykpOwogICAgZmF2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgZS5wcmV2ZW50RGVmYXVsdCgpOyB0b2dnbGVGYXZvcml0ZShpbWcsIG9uQ2hhbmdlKTsgfSk7CiAgICBjZWxsLmFwcGVuZENoaWxkKGZhdik7CgogICAgdmFyIG1vcmUgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtbGliLW1vcmUnLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiAnTW9yZSBhY3Rpb25zJyB9KTsKICAgIFMobW9yZSwgJ3Bvc2l0aW9uOmFic29sdXRlO3RvcDo4cHg7cmlnaHQ6OHB4O3otaW5kZXg6MzsnICsgQlROICsgJztiYWNrZ3JvdW5kOicgKyBCQURHRV9CRyk7CiAgICBtb3JlLmFwcGVuZENoaWxkKGljb24oJ21vcmUnKSk7CiAgICBtb3JlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsKICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB2YXIgciA9IG1vcmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIG9wZW5Db250ZXh0TWVudShpbWcsIHIucmlnaHQsIHIuYm90dG9tICsgNCwgb25DaGFuZ2UpOwogICAgfSk7CiAgICBjZWxsLmFwcGVuZENoaWxkKG1vcmUpOwoKICAgIGlmIChjdHguc2VsZWN0ZWRba2V5XSkgY2VsbC5jbGFzc0xpc3QuYWRkKCdpcy1zZWxlY3RlZCcpOwoKICAgIGNlbGwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgnLnYtbGliLWNoZWNrLCAudi1saWItZmF2LCAudi1saWItbW9yZScpKSByZXR1cm47CiAgICAgIGlmIChjdHguc2VsZWN0TW9kZSkgeyB0b2dnbGVTZWxlY3QoaW1nKTsgcmV0dXJuOyB9CiAgICAgIGlmICghKFYudWkgJiYgdHlwZW9mIFYudWkuaW1nQ2FyZCA9PT0gJ2Z1bmN0aW9uJykpIG9wZW5JbWFnZShpbWcpOwogICAgfSk7CgogICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgb3BlbkNvbnRleHRNZW51KGltZywgZS5jbGllbnRYLCBlLmNsaWVudFksIG9uQ2hhbmdlKTsKICAgIH0pOwoKICAgIHZhciBscFRpbWVyID0gbnVsbCwgbW92ZWQgPSBmYWxzZSwgc3RhcnRYID0gMCwgc3RhcnRZID0gMDsKICAgIGNlbGwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgIG1vdmVkID0gZmFsc2U7CiAgICAgIGlmIChlLnRvdWNoZXMgJiYgZS50b3VjaGVzWzBdKSB7IHN0YXJ0WCA9IGUudG91Y2hlc1swXS5jbGllbnRYOyBzdGFydFkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WTsgfQogICAgICBscFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFtb3ZlZCkgewogICAgICAgICAgaWYgKCFjdHguc2VsZWN0TW9kZSkgZW50ZXJTZWxlY3QoaW1nKTsKICAgICAgICAgIGVsc2UgdG9nZ2xlU2VsZWN0KGltZyk7CiAgICAgICAgICBpZiAobmF2aWdhdG9yLnZpYnJhdGUpIHRyeSB7IG5hdmlnYXRvci52aWJyYXRlKDEyKTsgfSBjYXRjaCAoZXIpIHt9CiAgICAgICAgfQogICAgICB9LCA0NTApOwogICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlc1swXSkgewogICAgICAgIGlmIChNYXRoLmFicyhlLnRvdWNoZXNbMF0uY2xpZW50WCAtIHN0YXJ0WCkgPiAxMCB8fCBNYXRoLmFicyhlLnRvdWNoZXNbMF0uY2xpZW50WSAtIHN0YXJ0WSkgPiAxMCkgbW92ZWQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChtb3ZlZCkgY2xlYXJUaW1lb3V0KGxwVGltZXIpOwogICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGZ1bmN0aW9uICgpIHsgY2xlYXJUaW1lb3V0KGxwVGltZXIpOyB9LCB7IHBhc3NpdmU6IHRydWUgfSk7CiAgICBjZWxsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgZnVuY3Rpb24gKCkgeyBjbGVhclRpbWVvdXQobHBUaW1lcik7IH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKCiAgICByZXR1cm4gY2VsbDsKICB9CgogIGZ1bmN0aW9uIHJlbmRlckZhdkJhZGdlKGNlbGwsIGltZykgewogICAgaWYgKCFjZWxsKSByZXR1cm47CiAgICB2YXIgZmF2ID0gY2VsbC5xdWVyeVNlbGVjdG9yKCcudi1saWItZmF2Jyk7CiAgICBpZiAoIWZhdikgcmV0dXJuOwogICAgZmF2LmNsYXNzTGlzdC50b2dnbGUoJ2lzLW9uJywgISFpbWcuZmF2b3JpdGVkKTsKICAgIGZhdi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIGltZy5mYXZvcml0ZWQgPyAndHJ1ZScgOiAnZmFsc2UnKTsKICAgIGZhdi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBpbWcuZmF2b3JpdGVkID8gJ1VuZmF2b3JpdGUnIDogJ0Zhdm9yaXRlJyk7CiAgICBmYXYuc3R5bGUuYmFja2dyb3VuZCA9IGltZy5mYXZvcml0ZWQgPyBHUkFESUVOVCA6IEJBREdFX0JHOwogICAgZmF2LmlubmVySFRNTCA9ICcnOwogICAgZmF2LmFwcGVuZENoaWxkKGljb24oaW1nLmZhdm9yaXRlZCA/ICdoZWFydEZpbGwnIDogJ2hlYXJ0JykpOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRGYWxsYmFja0NhcmQoaW1nKSB7CiAgICB2YXIgYWZ0ZXIgPSBpbWcucmVtb3RlSW1hZ2VVUkwgfHwgaW1nLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwgfHwgJyc7CiAgICB2YXIgYmVmb3JlID0gaW1nLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkw7CiAgICB2YXIgY2FyZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jYXJkIHYtY2FyZC0tcGFkLTAgdi1jYXJkLS10YXBwYWJsZSB2Y2FyZCcgfSk7CiAgICBTKGNhcmQsICdwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2Rpc3BsYXk6YmxvY2s7Ym9yZGVyLXJhZGl1czp2YXIoLS12LXJhZGl1cy1zbSwxNXB4KTtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZDp2YXIoLS12LWNhcmQtYmcsIHJnYmEoMjU1LDI1NSwyNTUsLjA0KSknKTsKICAgIHZhciBhZnRlckltZyA9IGVsKCdpbWcnLCB7IGNsYXNzOiAndmFmdGVyJywgc3JjOiBhZnRlciwgYWx0OiBlc2NhcGVIdG1sKGltZy5wcm9tcHQgfHwgJ0NyZWF0aW9uJyksIGxvYWRpbmc6ICdsYXp5JyB9KTsKICAgIFMoYWZ0ZXJJbWcsICdkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OmF1dG8nKTsKICAgIGFmdGVySW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyBjYXJkLmNsYXNzTGlzdC5hZGQoJ2lzLWJyb2tlbicpOyB9KTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoYWZ0ZXJJbWcpOwogICAgaWYgKGJlZm9yZSAmJiBiZWZvcmUgIT09IGFmdGVyKSB7CiAgICAgIHZhciBiZWZvcmVJbWcgPSBlbCgnaW1nJywgeyBjbGFzczogJ3ZiZWZvcmUnLCBzcmM6IGJlZm9yZSwgYWx0OiAnJywgbG9hZGluZzogJ2xhenknIH0pOwogICAgICBTKGJlZm9yZUltZywgJ3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvdmVyO3RyYW5zaXRpb246b3BhY2l0eSAuNnMgZWFzZScpOwogICAgICBjYXJkLmFwcGVuZENoaWxkKGJlZm9yZUltZyk7CiAgICAgIHZhciBvbiA9IGZhbHNlOwogICAgICB2YXIgaXYgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFjYXJkLmlzQ29ubmVjdGVkKSB7IGNsZWFySW50ZXJ2YWwoaXYpOyByZXR1cm47IH0KICAgICAgICBvbiA9ICFvbjsKICAgICAgICBiZWZvcmVJbWcuc3R5bGUub3BhY2l0eSA9IG9uID8gJzAnIDogJzEnOwogICAgICB9LCAyNjAwKTsKICAgIH0KICAgIHJldHVybiBjYXJkOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyR3JpZCgpIHsKICAgIGlmICghY3R4LmdyaWRFbCkgcmV0dXJuOwogICAgY3R4LmdyaWRFbC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtYnVzeScpOwoKICAgIGlmIChjdHgubG9hZGluZyAmJiAhY3R4Lml0ZW1zLmxlbmd0aCkgeyBzaG93U2tlbGV0b25zKCk7IHJldHVybjsgfQoKICAgIHZhciBsaXN0ID0gdmlzaWJsZUl0ZW1zKCk7CiAgICBjdHguZ3JpZEVsLmlubmVySFRNTCA9ICcnOwoKICAgIGlmICghbGlzdC5sZW5ndGgpIHsKICAgICAgaWYgKGN0eC5sb2FkaW5nKSB7IHNob3dTa2VsZXRvbnMoKTsgcmV0dXJuOyB9CiAgICAgIGlmIChjdHguZXJyb3JlZCkgeyByZW1vdmVTZW50aW5lbCgpOyByZXR1cm47IH0KICAgICAgdmFyIGZpbHRlcmVkID0gY3R4LnF1ZXJ5IHx8IGN0eC5pbmR1c3RyeTsKICAgICAgaWYgKCFmaWx0ZXJlZCAmJiAhY3R4LmZldGNoZWQpIHsgc2hvd1NrZWxldG9ucygpOyByZXR1cm47IH0KICAgICAgcmVtb3ZlU2VudGluZWwoKTsKICAgICAgY3R4LmdyaWRFbC5hcHBlbmRDaGlsZChlbXB0eVN0YXRlKCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgdHJ5IHsgZnJhZy5hcHBlbmRDaGlsZChidWlsZENlbGwobGlzdFtpXSkpOyB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIGNvbnNvbGUuZXJyb3IoJ1tsaWJyYXJ5XSBjZWxsIHJlbmRlciBmYWlsZWQnLCBlKTsKICAgICAgfQogICAgfQogICAgY3R4LmdyaWRFbC5hcHBlbmRDaGlsZChmcmFnKTsKICAgIGN0eC5ncmlkRWwuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtc2VsZWN0aW5nJywgY3R4LnNlbGVjdE1vZGUpOwogICAgYXR0YWNoU2VudGluZWwoKTsKICB9CgogIGZ1bmN0aW9uIGhhc01vcmVUb0xvYWQoKSB7CiAgICBpZiAoY3R4LmRvbmUgfHwgY3R4LmxvYWRpbmcpIHJldHVybiBmYWxzZTsKICAgIGlmIChjdHguc291cmNlID09PSAnZmF2b3JpdGVzJykgcmV0dXJuIGZhbHNlOwogICAgaWYgKGN0eC50b3RhbCAhPSBudWxsICYmIGN0eC50b3RhbCA+IDAgJiYgY3R4Lml0ZW1zLmxlbmd0aCA8IGN0eC50b3RhbCkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBlbXB0eVN0YXRlKCkgewogICAgdmFyIGhhc0VtcHR5ID0gVi51aSAmJiB0eXBlb2YgVi51aS5lbXB0eSA9PT0gJ2Z1bmN0aW9uJzsKICAgIHZhciBpc0ZpbHRlcmVkID0gY3R4LnF1ZXJ5IHx8IGN0eC5pbmR1c3RyeTsKCiAgICBpZiAoaXNGaWx0ZXJlZCkgewogICAgICB2YXIgY2xlYXIgPSBmdW5jdGlvbiAoKSB7IGN0eC5xdWVyeSA9ICcnOyBjdHguaW5kdXN0cnkgPSBudWxsOyByZW5kZXJUb29sYmFyKCk7IHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7IH07CiAgICAgIGlmIChoYXNFbXB0eSkgcmV0dXJuIFYudWkuZW1wdHkoeyB0aXRsZTogJ05vIG1hdGNoZXMnLCBtZXNzYWdlOiAnTm90aGluZyBtYXRjaGVzIHlvdXIgc2VhcmNoIG9yIGZpbHRlcnMuJywgaWNvbjogJ3NlYXJjaCcgfSwgJ0NsZWFyIGZpbHRlcnMnLCBjbGVhcik7CiAgICAgIHJldHVybiBmYWxsYmFja0VtcHR5KCdObyBtYXRjaGVzJywgJ05vdGhpbmcgbWF0Y2hlcyB5b3VyIHNlYXJjaCBvciBmaWx0ZXJzLicsICdDbGVhciBmaWx0ZXJzJywgY2xlYXIpOwogICAgfQogICAgaWYgKGN0eC5zb3VyY2UgPT09ICdmYXZvcml0ZXMnKSB7CiAgICAgIGlmIChoYXNFbXB0eSkgcmV0dXJuIFYudWkuZW1wdHkoeyB0aXRsZTogJ05vIGZhdm9yaXRlcyB5ZXQnLCBtZXNzYWdlOiAnVGFwIHRoZSBoZWFydCBvbiBhbnkgY3JlYXRpb24gdG8gc2F2ZSBpdCBoZXJlLicsIGljb246ICdoZWFydCcgfSwgJ0Jyb3dzZSBMaWJyYXJ5Jywgb3BlbkxpYnJhcnkpOwogICAgICByZXR1cm4gZmFsbGJhY2tFbXB0eSgnTm8gZmF2b3JpdGVzIHlldCcsICdUYXAgdGhlIGhlYXJ0IG9uIGFueSBjcmVhdGlvbiB0byBzYXZlIGl0IGhlcmUuJywgJ0Jyb3dzZSBMaWJyYXJ5Jywgb3BlbkxpYnJhcnkpOwogICAgfQogICAgaWYgKGN0eC5zb3VyY2UgPT09ICdmb2xkZXInKSB7CiAgICAgIGlmIChoYXNFbXB0eSkgcmV0dXJuIFYudWkuZW1wdHkoeyB0aXRsZTogJ1RoaXMgZm9sZGVyIGlzIGVtcHR5JywgbWVzc2FnZTogJ0FkZCBjcmVhdGlvbnMgZnJvbSBhbnkgaW1hZ2XigJlzIG1lbnUuJywgaWNvbjogJ2ZvbGRlcicgfSwgJ0JhY2sgdG8gTGlicmFyeScsIG9wZW5MaWJyYXJ5KTsKICAgICAgcmV0dXJuIGZhbGxiYWNrRW1wdHkoJ1RoaXMgZm9sZGVyIGlzIGVtcHR5JywgJ0FkZCBjcmVhdGlvbnMgZnJvbSBhbnkgaW1hZ2XigJlzIG1lbnUuJywgJ0JhY2sgdG8gTGlicmFyeScsIG9wZW5MaWJyYXJ5KTsKICAgIH0KICAgIHZhciBjcmVhdGUgPSBmdW5jdGlvbiAoKSB7IGdvKCcjL2NyZWF0ZScpOyB9OwogICAgaWYgKGhhc0VtcHR5KSByZXR1cm4gVi51aS5lbXB0eSh7IHRpdGxlOiAnTm8gY3JlYXRpb25zIHlldCcsIG1lc3NhZ2U6ICdHZW5lcmF0ZSB5b3VyIGZpcnN0IGltYWdlIHRvIHN0YXJ0IHlvdXIgbGlicmFyeS4nLCBpY29uOiAnaW1hZ2UnIH0sICdDcmVhdGUnLCBjcmVhdGUpOwogICAgcmV0dXJuIGZhbGxiYWNrRW1wdHkoJ05vIGNyZWF0aW9ucyB5ZXQnLCAnR2VuZXJhdGUgeW91ciBmaXJzdCBpbWFnZSB0byBzdGFydCB5b3VyIGxpYnJhcnkuJywgJ0NyZWF0ZScsIGNyZWF0ZSk7CiAgfQoKICBmdW5jdGlvbiBmYWxsYmFja0VtcHR5KHRpdGxlLCBzdWIsIGFjdGlvbkxhYmVsLCBvbkFjdGlvbikgewogICAgdmFyIG5vZGUgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHknLCByb2xlOiAnbm90ZScgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oJ2ltYWdlJykpLAogICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScsIHRleHQ6IHRpdGxlIH0pLAogICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19zdWInLCB0ZXh0OiBzdWIgfSkpOwogICAgaWYgKGFjdGlvbkxhYmVsICYmIHR5cGVvZiBvbkFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBub2RlLmFwcGVuZENoaWxkKGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnkgdi1lbXB0eV9fYWN0aW9uJywgdHlwZTogJ2J1dHRvbicsIHRleHQ6IGFjdGlvbkxhYmVsLCBvbmNsaWNrOiBvbkFjdGlvbiB9KSk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZVNlbnRpbmVsKCkgewogICAgaWYgKGN0eC5vYnNlcnZlcikgeyB0cnkgeyBjdHgub2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyB9IGNhdGNoIChlKSB7fSBjdHgub2JzZXJ2ZXIgPSBudWxsOyB9CiAgICBpZiAoY3R4LnNlbnRpbmVsICYmIGN0eC5zZW50aW5lbC5wYXJlbnROb2RlKSBjdHguc2VudGluZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjdHguc2VudGluZWwpOwogICAgY3R4LnNlbnRpbmVsID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIGF0dGFjaFNlbnRpbmVsKCkgewogICAgaWYgKCFjdHguZ3JpZEVsKSByZXR1cm47CiAgICByZW1vdmVTZW50aW5lbCgpOwogICAgaWYgKGN0eC5kb25lIHx8IGN0eC5zb3VyY2UgPT09ICdmYXZvcml0ZXMnIHx8IGN0eC5xdWVyeSkgcmV0dXJuOwogICAgY3R4LnNlbnRpbmVsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi1zZW50aW5lbCcsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKICAgIFMoY3R4LnNlbnRpbmVsLCAnd2lkdGg6MTAwJTtoZWlnaHQ6MXB4Jyk7CiAgICBpZiAoY3R4LmdyaWRFbC5wYXJlbnROb2RlKSBjdHguZ3JpZEVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGN0eC5zZW50aW5lbCwgY3R4LmdyaWRFbC5uZXh0U2libGluZyk7CiAgICBvYnNlcnZlU2VudGluZWwoKTsKICB9CgogIGZ1bmN0aW9uIG9ic2VydmVTZW50aW5lbCgpIHsKICAgIGlmICghKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicgaW4gd2luZG93KSB8fCAhY3R4LnNlbnRpbmVsKSByZXR1cm47CiAgICBjdHgub2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGVudHJpZXNbaV0uaXNJbnRlcnNlY3RpbmcpIGxvYWROZXh0KGZhbHNlKTsKICAgICAgfQogICAgfSwgeyByb290TWFyZ2luOiAnNjAwcHggMHB4JyB9KTsKICAgIGN0eC5vYnNlcnZlci5vYnNlcnZlKGN0eC5zZW50aW5lbCk7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJTdGF0dXMoZXJyKSB7CiAgICBpZiAoIWN0eC5zdGF0dXNFbCkgcmV0dXJuOwogICAgY3R4LnN0YXR1c0VsLmlubmVySFRNTCA9ICcnOwoKICAgIGlmIChjdHguZXJyb3JlZCB8fCBlcnIpIHsKICAgICAgY3R4LnN0YXR1c0VsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eSB2LWxpYi1zdGF0dXNib3gnLCByb2xlOiAnYWxlcnQnIH0sCiAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fdGl0bGUnLCB0ZXh0OiAnQ291bGQgbm90IGxvYWQgeW91ciBsaWJyYXJ5LicgfSksCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgdGV4dDogJ1JldHJ5Jywgb25jbGljazogZnVuY3Rpb24gKCkgeyBsb2FkTmV4dCh0cnVlKTsgfSB9KSkpOwogICAgfSBlbHNlIGlmIChjdHgubG9hZGluZyAmJiBjdHguaXRlbXMubGVuZ3RoKSB7CiAgICAgIGN0eC5zdGF0dXNFbC5hcHBlbmRDaGlsZChTKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItbG9hZG1vcmUnIH0sIHNwaW5uZXJOb2RlKCksIGVsKCdzcGFuJywgeyB0ZXh0OiAnTG9hZGluZyBtb3Jl4oCmJyB9KSksICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Z2FwOjEwcHg7cGFkZGluZzoyNHB4IDA7Y29sb3I6dmFyKC0tdi1pbmstc29mdCwgcmdiYSgyNDUsMjQ1LDI0NywuNjYpKTtmb250LXNpemU6MTRweCcpKTsKICAgIH0gZWxzZSBpZiAoY3R4LmRvbmUgJiYgY3R4Lml0ZW1zLmxlbmd0aCkgewogICAgICB2YXIgbiA9IGN0eC50b3RhbCAhPSBudWxsID8gY3R4LnRvdGFsIDogY3R4Lml0ZW1zLmxlbmd0aDsKICAgICAgY3R4LnN0YXR1c0VsLmFwcGVuZENoaWxkKFMoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi1lbmQnLCB0ZXh0OiBuICsgJyBjcmVhdGlvbicgKyAobiA9PT0gMSA/ICcnIDogJ3MnKSB9KSwgJ3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MjRweCAwIDhweDtjb2xvcjp2YXIoLS12LWluay1zb2Z0LCByZ2JhKDI0NSwyNDUsMjQ3LC41KSk7Zm9udC1zaXplOjEzcHg7bGV0dGVyLXNwYWNpbmc6LjAyZW0nKSk7CiAgICB9CgogICAgaWYgKGN0eC5jb3VudEVsKSB7CiAgICAgIHZhciB0b3RhbExvYWRlZCA9IGN0eC5pdGVtcy5sZW5ndGg7CiAgICAgIHZhciBsYWJlbDsKICAgICAgaWYgKGN0eC5xdWVyeSB8fCBjdHguaW5kdXN0cnkpIGxhYmVsID0gdmlzaWJsZUl0ZW1zKCkubGVuZ3RoICsgJyBvZiAnICsgdG90YWxMb2FkZWQ7CiAgICAgIGVsc2UgaWYgKGN0eC50b3RhbCAhPSBudWxsKSBsYWJlbCA9IChjdHguZG9uZSA/IGN0eC50b3RhbCA6IHRvdGFsTG9hZGVkICsgJysnKSArICcnOwogICAgICBlbHNlIGxhYmVsID0gdG90YWxMb2FkZWQgKyAoY3R4LmRvbmUgPyAnJyA6ICcrJyk7CiAgICAgIGN0eC5jb3VudEVsLnRleHRDb250ZW50ID0gdG90YWxMb2FkZWQgfHwgKGN0eC5xdWVyeSB8fCBjdHguaW5kdXN0cnkpID8gbGFiZWwgOiAnJzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNwaW5uZXJOb2RlKCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuc3Bpbm5lciA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudWkuc3Bpbm5lcigpOwogICAgcmV0dXJuIGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3Bpbm5lcicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKICB9CgogIGZ1bmN0aW9uIG9wZW5MaWJyYXJ5KCkgewogICAgY3R4LnNvdXJjZSA9ICdsaWJyYXJ5JzsKICAgIGN0eC5mb2xkZXJJRCA9IG51bGw7CiAgICBjdHgucXVlcnkgPSAnJzsgY3R4LmluZHVzdHJ5ID0gbnVsbDsKICAgIGNsb3NlTWVudSgpOwogICAgaWYgKGN0eC5zZWxlY3RNb2RlKSBleGl0U2VsZWN0KCk7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICBsb2FkTmV4dCh0cnVlKTsKICB9CiAgZnVuY3Rpb24gb3BlbkZhdm9yaXRlcygpIHsKICAgIGN0eC5zb3VyY2UgPSAnZmF2b3JpdGVzJzsKICAgIGN0eC5mb2xkZXJJRCA9IG51bGw7CiAgICBjdHgucXVlcnkgPSAnJzsgY3R4LmluZHVzdHJ5ID0gbnVsbDsKICAgIGNsb3NlTWVudSgpOwogICAgaWYgKGN0eC5zZWxlY3RNb2RlKSBleGl0U2VsZWN0KCk7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICBsb2FkTmV4dCh0cnVlKTsKICB9CiAgZnVuY3Rpb24gb3BlbkZvbGRlcihpZCkgewogICAgY3R4LnNvdXJjZSA9ICdmb2xkZXInOwogICAgY3R4LmZvbGRlcklEID0gaWQ7CiAgICBjdHgucXVlcnkgPSAnJzsgY3R4LmluZHVzdHJ5ID0gbnVsbDsKICAgIGNsb3NlTWVudSgpOwogICAgaWYgKGN0eC5zZWxlY3RNb2RlKSBleGl0U2VsZWN0KCk7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICBsb2FkTmV4dCh0cnVlKTsKICB9CgogIGZ1bmN0aW9uIG9uS2V5KGUpIHsKICAgIGlmICghY3R4IHx8ICFjdHgucm9vdCB8fCAhY3R4LnJvb3QuaXNDb25uZWN0ZWQpIHJldHVybjsKICAgIHZhciB0YWcgPSAoZS50YXJnZXQgJiYgZS50YXJnZXQudGFnTmFtZSkgfHwgJyc7CiAgICB2YXIgdHlwaW5nID0gdGFnID09PSAnSU5QVVQnIHx8IHRhZyA9PT0gJ1RFWFRBUkVBJyB8fCB0YWcgPT09ICdTRUxFQ1QnIHx8IChlLnRhcmdldCAmJiBlLnRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSk7CiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7CiAgICAgIGlmIChjdHgubWVudUVsKSB7IGNsb3NlTWVudSgpOyByZXR1cm47IH0KICAgICAgaWYgKGN0eC5zZWxlY3RNb2RlKSB7IGV4aXRTZWxlY3QoKTsgcmV0dXJuOyB9CiAgICB9CiAgICBpZiAodHlwaW5nKSByZXR1cm47CiAgICBpZiAoY3R4LnNlbGVjdE1vZGUgJiYgKGUua2V5ID09PSAnYScgfHwgZS5rZXkgPT09ICdBJykgJiYgKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgc2VsZWN0QWxsVmlzaWJsZSgpOyByZXR1cm47CiAgICB9CiAgICBpZiAoY3R4LnNlbGVjdE1vZGUgJiYgKGUua2V5ID09PSAnRGVsZXRlJyB8fCBlLmtleSA9PT0gJ0JhY2tzcGFjZScpKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgYmF0Y2hEZWxldGUoKTsgcmV0dXJuOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVuZGVyKHJvb3QsIHBhcmFtcykgewogICAgdGVhcmRvd24oKTsKICAgIGN0eCA9IGZyZXNoQ3R4KCk7CiAgICBjdHgucm9vdCA9IHJvb3Q7CgogICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgndi12aWV3LWxpYnJhcnknKTsKCiAgICBjdHguc2Nyb2xsVGFyZ2V0ID0gZmluZFNjcm9sbFBhcmVudChyb290KSB8fCB3aW5kb3c7CgogICAgdmFyIHRpdGxlID0gZWwoJ2gxJywgeyBjbGFzczogJ3YtbGliLXRpdGxlJyB9LCBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWdyYWRpZW50JywgdGV4dDogJ0xpYnJhcnknIH0pLCBjdHguY291bnRFbCA9IGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbGliLWNvdW50JyB9KSk7CiAgICBTKHRpdGxlLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmJhc2VsaW5lO2dhcDoxMHB4O21hcmdpbjowO2ZvbnQtc2l6ZTpjbGFtcCgyOHB4LDV2dyw0MHB4KTtsZXR0ZXItc3BhY2luZzotMC4wMmVtJyk7CiAgICBTKGN0eC5jb3VudEVsLCAnZm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NTAwO2NvbG9yOnZhcigtLXYtaW5rLXNvZnQsIHJnYmEoMjQ1LDI0NSwyNDcsLjU1KSknKTsKICAgIHZhciBoZWFkZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtbGliLWhlYWRlcicgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi10aXRsZXdyYXAnIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1leWVicm93JywgdGV4dDogJ1lvdXIgV29yaycgfSksCiAgICAgICAgdGl0bGUKICAgICAgKSwKICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgb25jbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9jcmVhdGUnKTsgfSB9LCBpY29uKCdwbHVzJyksICdDcmVhdGUnKQogICAgKTsKICAgIFMoaGVhZGVyLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtZW5kO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2dhcDoxNnB4O2ZsZXgtd3JhcDp3cmFwO21hcmdpbi1ib3R0b206dmFyKC0tc3BhY2UtbGcsMjRweCknKTsKCiAgICBjdHgudG9vbGJhckVsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi10b29sYmFyLXdyYXAnIH0pOwogICAgY3R4LmdyaWRFbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tYXNvbnJ5IHYtbGliLWdyaWQnIH0pOwogICAgY3R4LnN0YXR1c0VsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi1zdGF0dXMnLCAnYXJpYS1saXZlJzogJ3BvbGl0ZScgfSk7CgogICAgcm9vdC5hcHBlbmRDaGlsZChoZWFkZXIpOwogICAgcm9vdC5hcHBlbmRDaGlsZChjdHgudG9vbGJhckVsKTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQoY3R4LmdyaWRFbCk7CiAgICByb290LmFwcGVuZENoaWxkKGN0eC5zdGF0dXNFbCk7CgogICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgaWYgKHBhcmFtcy5mYXYgPT09ICcxJyB8fCBwYXJhbXMuZmF2ID09PSAndHJ1ZScpIGN0eC5zb3VyY2UgPSAnZmF2b3JpdGVzJzsKICAgIGlmIChwYXJhbXMuZm9sZGVyKSB7IGN0eC5zb3VyY2UgPSAnZm9sZGVyJzsgY3R4LmZvbGRlcklEID0gcGFyYW1zLmZvbGRlcjsgfQogICAgaWYgKHBhcmFtcy5zb3J0KSBjdHguc29ydCA9IHBhcmFtcy5zb3J0OwogICAgaWYgKHBhcmFtcy5xKSBjdHgucXVlcnkgPSBwYXJhbXMucTsKCiAgICByZW5kZXJUb29sYmFyKCk7CgogICAgbG9hZEZvbGRlcnMoKS50aGVuKGZ1bmN0aW9uICgpIHsgaWYgKGN0eCAmJiBjdHguc291cmNlID09PSAnZm9sZGVyJykgcmVuZGVyVG9vbGJhcigpOyB9KTsKCiAgICB2YXIgc2VlZGVkID0gZmFsc2U7CiAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2xpYnJhcnknICYmIFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuZ2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGNhY2hlZCA9IFYuc3RvcmUuZ2V0KCdsaWJyYXJ5Jyk7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2FjaGVkKSAmJiBjYWNoZWQubGVuZ3RoKSB7CiAgICAgICAgICBjdHguaXRlbXMgPSBjYWNoZWQuc2xpY2UoKTsKICAgICAgICAgIHNlZWRlZCA9IHRydWU7CiAgICAgICAgICByZW5kZXJHcmlkKCk7CiAgICAgICAgICByZW5kZXJTdGF0dXMoKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9CgogICAgbG9hZE5leHQodHJ1ZSkudGhlbihmdW5jdGlvbiAoKSB7IHJlc3RvcmVTY3JvbGwoKTsgfSk7CiAgICBpZiAoc2VlZGVkKSByZXN0b3JlU2Nyb2xsKCk7CgogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5LCBmYWxzZSk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZW5zdXJlRmlsbCwgZmFsc2UpOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uV2luZG93U2Nyb2xsLCB0cnVlKTsKCiAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBjdHguX3Vuc3ViID0gVi5zdG9yZS5vbignbGlicmFyeTpjaGFuZ2VkJywgZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChjdHggJiYgIWN0eC5fc2VsZldyaXRlICYmICFjdHgubG9hZGluZyAmJiBjdHgucm9vdCAmJiBjdHgucm9vdC5pc0Nvbm5lY3RlZCkgbG9hZE5leHQodHJ1ZSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gb25XaW5kb3dTY3JvbGwoKSB7CiAgICBpZiAoIWN0eCB8fCBjdHgubG9hZGluZyB8fCBjdHguZG9uZSB8fCAhY3R4LmdyaWRFbCkgcmV0dXJuOwogICAgaWYgKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicgaW4gd2luZG93KSByZXR1cm47CiAgICBpZiAoY3R4LnF1ZXJ5IHx8IGN0eC5zb3VyY2UgPT09ICdmYXZvcml0ZXMnKSByZXR1cm47CiAgICB2YXIgZG9jSCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgfHwgd2luZG93LmlubmVySGVpZ2h0OwogICAgaWYgKGN0eC5ncmlkRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIDwgZG9jSCArIDYwMCkgbG9hZE5leHQoZmFsc2UpOwogIH0KCiAgZnVuY3Rpb24gZmluZFNjcm9sbFBhcmVudChub2RlKSB7CiAgICB2YXIgcCA9IG5vZGUgJiYgbm9kZS5wYXJlbnRFbGVtZW50OwogICAgd2hpbGUgKHAgJiYgcCAhPT0gZG9jdW1lbnQuYm9keSkgewogICAgICB2YXIgb3kgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwKS5vdmVyZmxvd1k7CiAgICAgIGlmICgob3kgPT09ICdhdXRvJyB8fCBveSA9PT0gJ3Njcm9sbCcpICYmIHAuc2Nyb2xsSGVpZ2h0ID4gcC5jbGllbnRIZWlnaHQpIHJldHVybiBwOwogICAgICBwID0gcC5wYXJlbnRFbGVtZW50OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiB0ZWFyZG93bigpIHsKICAgIGlmICghY3R4KSByZXR1cm47CiAgICBjbG9zZU1lbnUoKTsKICAgIHJlbW92ZVNlbnRpbmVsKCk7CiAgICBpZiAodHlwZW9mIGN0eC5fdW5zdWIgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgY3R4Ll91bnN1YigpOyB9IGNhdGNoIChlKSB7fSB9CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXksIGZhbHNlKTsKICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBlbnN1cmVGaWxsLCBmYWxzZSk7CiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25XaW5kb3dTY3JvbGwsIHRydWUpOwogICAgaWYgKGN0eC5yb290KSBjdHgucm9vdC5jbGFzc0xpc3QucmVtb3ZlKCd2LXZpZXctbGlicmFyeScpOwogICAgY3R4ID0gbnVsbDsKICB9CgogIFYudmlld3MubGlicmFyeSA9IHsgcmVuZGVyOiByZW5kZXIsIHRlYXJkb3duOiB0ZWFyZG93biB9OwoKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvc3R1ZGlvLmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLnZpZXdzID0gVi52aWV3cyB8fCB7fTsKCiAgdmFyIEFDQ0VOVCA9ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknOwogIHZhciBBQ0NFTlRfU09GVCA9ICd2YXIoLS12YW1wLWFjY2VudC1zb2Z0LCAjODJENkZGKSc7CiAgdmFyIEVSUk9SID0gJ3ZhcigtLWNvbG9yLWVycm9yLCAjRjczMzYzKSc7CiAgdmFyIElOSyA9ICd2YXIoLS12LWluaywgI2Y1ZjVmNyknOwogIHZhciBJTktfU09GVCA9ICd2YXIoLS12LWluay1zb2Z0LCByZ2JhKDI0NSwyNDUsMjQ3LC42NikpJzsKICB2YXIgTElORSA9ICd2YXIoLS12LWxpbmUsIHJnYmEoMjQ1LDI0NSwyNDcsLjE1KSknOwogIHZhciBDQVJEX0JHID0gJ3ZhcigtLXYtY2FyZC1iZywgcmdiYSgyNTUsMjU1LDI1NSwuMDQpKSc7CgogIHZhciBfcm9vdCA9IG51bGw7CiAgdmFyIF9ub2RlID0gbnVsbDsKICB2YXIgX2ltYWdlID0gbnVsbDsKICB2YXIgX3NpYmxpbmdzID0gW107CiAgdmFyIF9pbmRleCA9IC0xOwogIHZhciBfc2NydWJOb2RlID0gbnVsbDsKICB2YXIgX3BvbGxBYm9ydCA9IG51bGw7CiAgdmFyIF9rZXlIYW5kbGVyID0gbnVsbDsKICB2YXIgX3Bhc3RlSGFuZGxlciA9IG51bGw7CiAgdmFyIF9yZXNpemVIYW5kbGVyID0gbnVsbDsKICB2YXIgX2Rpc3Bvc2VkID0gZmFsc2U7CgogIGZ1bmN0aW9uIFUoKSB7IHJldHVybiBWLnV0aWwgfHwge307IH0KICBmdW5jdGlvbiBVSSgpIHsgcmV0dXJuIFYudWkgfHwge307IH0KICBmdW5jdGlvbiBBUEkoKSB7IHJldHVybiBWLmFwaSB8fCB7fTsgfQogIGZ1bmN0aW9uIFNUKCkgeyByZXR1cm4gVi5zdGF0ZSB8fCB7fTsgfQoKICBmdW5jdGlvbiBlbCh0YWcsIGF0dHJzKSB7CiAgICB2YXIgdWkgPSBVSSgpOwogICAgaWYgKHVpICYmIHR5cGVvZiB1aS5lbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHVpLmVsLmFwcGx5KHVpLCBhcmd1bWVudHMpOwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMpIHsKICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwogICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybjsKICAgICAgICBpZiAoayA9PT0gJ2NsYXNzJykgbm9kZS5jbGFzc05hbWUgPSB2OwogICAgICAgIGVsc2UgaWYgKGsgPT09ICd0ZXh0Jykgbm9kZS50ZXh0Q29udGVudCA9IHY7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ3N0eWxlJyAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcpIE9iamVjdC5hc3NpZ24obm9kZS5zdHlsZSwgdik7CiAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdvbicpID09PSAwICYmIHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCB2KTsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ2RhdGEtJykgPT09IDAgfHwgay5pbmRleE9mKCdhcmlhLScpID09PSAwKSBub2RlLnNldEF0dHJpYnV0ZShrLCB2KTsKICAgICAgICBlbHNlIGlmIChrIGluIG5vZGUpIHsgdHJ5IHsgbm9kZVtrXSA9IHY7IH0gY2F0Y2ggKGUpIHsgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdik7IH0gfQogICAgICAgIGVsc2Ugbm9kZS5zZXRBdHRyaWJ1dGUoaywgdik7CiAgICAgIH0pOwogICAgfQogICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGMgPSBhcmd1bWVudHNbaV07CiAgICAgIGlmIChjID09IG51bGwpIGNvbnRpbnVlOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgYy5mb3JFYWNoKGZ1bmN0aW9uIChjYykgeyBpZiAoY2MgIT0gbnVsbCkgbm9kZS5hcHBlbmRDaGlsZCh0ZXh0T3JOb2RlKGNjKSk7IH0pOwogICAgICBlbHNlIG5vZGUuYXBwZW5kQ2hpbGQodGV4dE9yTm9kZShjKSk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CiAgZnVuY3Rpb24gdGV4dE9yTm9kZShjKSB7CiAgICByZXR1cm4gKHR5cGVvZiBjID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYyA9PT0gJ251bWJlcicpID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGMpKSA6IGM7CiAgfQoKICBmdW5jdGlvbiBpY29uKG5hbWUpIHsKICAgIHZhciB1aSA9IFVJKCk7CiAgICBpZiAodWkgJiYgdHlwZW9mIHVpLmljb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIHIgPSB1aS5pY29uKG5hbWUpOwogICAgICBpZiAodHlwZW9mIHIgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICBzcGFuLmlubmVySFRNTCA9IHI7CiAgICAgICAgcmV0dXJuIHNwYW47CiAgICAgIH0KICAgICAgaWYgKHIgJiYgci5ub2RlVHlwZSkgcmV0dXJuIHI7CiAgICB9CiAgICB2YXIgZmFsbGJhY2sgPSB7CiAgICAgIGVkaXQ6ICfinI4nLCB2YXJpYXRpb25zOiAn4oa7JywgYW5pbWF0ZTogJ+KWticsIGRvd25sb2FkOiAn4qSTJywKICAgICAgaGVhcnQ6ICfimaEnLCAnaGVhcnQuZmlsbCc6ICfimaUnLCB0cmFzaDogJ+KclScsIHNoYXJlOiAn4oaXJywKICAgICAgcHVibGlzaDogJ+KYgScsIGJvb2ttYXJrOiAn4piGJywgY29weTogJ+KniScsIGNsb3NlOiAn4pyVJywKICAgICAgcGhvdG86ICfilqMnLCB2aWRlbzogJ+KWticsIGFycm93TGVmdDogJ+KAuScsIGFycm93UmlnaHQ6ICfigLonLAogICAgICBpbmZvOiAnaScsIHNwYXJrbGVzOiAn4pyoJwogICAgfTsKICAgIHZhciBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIHMudGV4dENvbnRlbnQgPSBmYWxsYmFja1tuYW1lXSB8fCAn4oCiJzsKICAgIHJldHVybiBzOwogIH0KCiAgZnVuY3Rpb24gdG9hc3QobXNnLCBraW5kKSB7CiAgICB2YXIgdWkgPSBVSSgpOwogICAgaWYgKHVpICYmIHR5cGVvZiB1aS50b2FzdCA9PT0gJ2Z1bmN0aW9uJykgeyB1aS50b2FzdChtc2csIGtpbmQgfHwgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICB0cnkgeyAoVi5zdG9yZSAmJiBWLnN0b3JlLmVtaXQpICYmIFYuc3RvcmUuZW1pdCgndG9hc3QnLCB7IG1zZzogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsgfSBjYXRjaCAoZSkge30KICB9CgogIGZ1bmN0aW9uIGNvbmZpcm1EaWFsb2cobXNnLCBvcHRzKSB7CiAgICB2YXIgdWkgPSBVSSgpOwogICAgaWYgKHVpICYmIHR5cGVvZiB1aS5jb25maXJtID09PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVpLmNvbmZpcm0obXNnLCBvcHRzIHx8IHt9KSk7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5jb25maXJtKG1zZykpOwogIH0KCiAgZnVuY3Rpb24gZ28oaGFzaCkgewogICAgaWYgKFYucm91dGVyICYmIHR5cGVvZiBWLnJvdXRlci5nbyA9PT0gJ2Z1bmN0aW9uJykgVi5yb3V0ZXIuZ28oaGFzaCk7CiAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gaGFzaDsKICB9CgogIGZ1bmN0aW9uIGZtdERhdGUoZCkgewogICAgdmFyIHUgPSBVKCk7CiAgICBpZiAodSAmJiB0eXBlb2YgdS5mbXREYXRlID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IHJldHVybiB1LmZtdERhdGUoZCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIHZhciBkYXRlID0gcGFyc2VEYXRlKGQpOwogICAgaWYgKCFkYXRlKSByZXR1cm4gJyc7CiAgICB0cnkgeyByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZygpOyB9IGNhdGNoIChlKSB7IHJldHVybiBTdHJpbmcoZCk7IH0KICB9CgogIGZ1bmN0aW9uIHBhcnNlRGF0ZShkKSB7CiAgICBpZiAoZCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChkIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGlzTmFOKGQuZ2V0VGltZSgpKSA/IG51bGwgOiBkOwogICAgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJykgewogICAgICB2YXIgbXMgPSBkID4gMWUxMiA/IGQgOiBkICogMTAwMDsKICAgICAgdmFyIGR0ID0gbmV3IERhdGUobXMpOwogICAgICByZXR1cm4gaXNOYU4oZHQuZ2V0VGltZSgpKSA/IG51bGwgOiBkdDsKICAgIH0KICAgIGlmICh0eXBlb2YgZCA9PT0gJ3N0cmluZycpIHsKICAgICAgdmFyIHAgPSBuZXcgRGF0ZShkKTsKICAgICAgaWYgKCFpc05hTihwLmdldFRpbWUoKSkpIHJldHVybiBwOwogICAgICB2YXIgbiA9IE51bWJlcihkKTsKICAgICAgaWYgKCFpc05hTihuKSkgcmV0dXJuIHBhcnNlRGF0ZShuKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gZG93bmxvYWQodXJsLCBmaWxlbmFtZSkgewogICAgdmFyIHUgPSBVKCk7CiAgICBpZiAodSAmJiB0eXBlb2YgdS5kb3dubG9hZCA9PT0gJ2Z1bmN0aW9uJykgeyB1LmRvd25sb2FkKHVybCwgZmlsZW5hbWUpOyByZXR1cm47IH0KICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgYS5ocmVmID0gdXJsOyBhLmRvd25sb2FkID0gZmlsZW5hbWUgfHwgJyc7IGEucmVsID0gJ25vb3BlbmVyJzsgYS50YXJnZXQgPSAnX2JsYW5rJzsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7IGEuY2xpY2soKTsgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTsKICB9CgogIGZ1bmN0aW9uIGltYWdlSUQoaW1nKSB7IHJldHVybiBpbWcgPyAoaW1nLnJlbW90ZUlEIHx8IGltZy5pZCB8fCBudWxsKSA6IG51bGw7IH0KCiAgZnVuY3Rpb24gaXNPd25JbWFnZShpbWcpIHsKICAgIGlmICghaW1nKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgbGliID0gU1QoKS5saWJyYXJ5IHx8IFtdOwogICAgdmFyIGlkID0gaW1hZ2VJRChpbWcpOwogICAgcmV0dXJuIGxpYi5zb21lKGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWFnZUlEKHVud3JhcCh4KSkgPT09IGlkOyB9KTsKICB9CgogIGZ1bmN0aW9uIG1vZGVsTGFiZWwocmF3KSB7CiAgICBpZiAoIXJhdykgcmV0dXJuICcnOwogICAgdmFyIG1vZGVscyA9IChWLmRhdGEgJiYgVi5kYXRhLm1vZGVscykgfHwgW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVscy5sZW5ndGg7IGkrKykgeyBpZiAobW9kZWxzW2ldLnJhdyA9PT0gcmF3KSByZXR1cm4gbW9kZWxzW2ldLmxhYmVsOyB9CiAgICByZXR1cm4gcmF3OwogIH0KCiAgZnVuY3Rpb24gbW9kZWxDb3N0KHJhdykgewogICAgdmFyIG1vZGVscyA9IChWLmRhdGEgJiYgVi5kYXRhLm1vZGVscykgfHwgW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVscy5sZW5ndGg7IGkrKykgeyBpZiAobW9kZWxzW2ldLnJhdyA9PT0gcmF3ICYmIHR5cGVvZiBtb2RlbHNbaV0uY29zdCA9PT0gJ251bWJlcicpIHJldHVybiBtb2RlbHNbaV0uY29zdDsgfQogICAgdmFyIHQyaSA9IFYuZGF0YSAmJiBWLmRhdGEudDJpTW9kZWw7CiAgICBpZiAodDJpICYmIHQyaS5yYXcgPT09IHJhdyAmJiB0eXBlb2YgdDJpLmNvc3QgPT09ICdudW1iZXInKSByZXR1cm4gdDJpLmNvc3Q7CiAgICByZXR1cm4gMTA7CiAgfQoKICBmdW5jdGlvbiBpbWFnZURpbWVuc2lvbnMoaW1nKSB7CiAgICBpZiAoIWltZykgcmV0dXJuIG51bGw7CiAgICB2YXIgdyA9IGltZy53aWR0aCB8fCBpbWcuaW1hZ2VXaWR0aCB8fCAoaW1nLmltYWdlX3NpemUgJiYgaW1nLmltYWdlX3NpemUud2lkdGgpIHx8IChpbWcuaW1hZ2VTaXplICYmIGltZy5pbWFnZVNpemUud2lkdGgpIHx8IG51bGw7CiAgICB2YXIgaCA9IGltZy5oZWlnaHQgfHwgaW1nLmltYWdlSGVpZ2h0IHx8IChpbWcuaW1hZ2Vfc2l6ZSAmJiBpbWcuaW1hZ2Vfc2l6ZS5oZWlnaHQpIHx8IChpbWcuaW1hZ2VTaXplICYmIGltZy5pbWFnZVNpemUuaGVpZ2h0KSB8fCBudWxsOwogICAgaWYgKHcgJiYgaCkgcmV0dXJuIE1hdGgucm91bmQodykgKyAnIMOXICcgKyBNYXRoLnJvdW5kKGgpOwogICAgaWYgKHR5cGVvZiBpbWcuYXNwZWN0UmF0aW8gPT09ICdudW1iZXInICYmIGltZy5hc3BlY3RSYXRpbyA+IDApIHsKICAgICAgcmV0dXJuIGltZy5hc3BlY3RSYXRpbyA+PSAxID8gJ0xhbmRzY2FwZScgOiAnUG9ydHJhaXQnOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiBjcmVkaXRDb3N0KGltZykgewogICAgaWYgKCFpbWcpIHJldHVybiBudWxsOwogICAgaWYgKHR5cGVvZiBpbWcuY3JlZGl0c0Nvc3QgPT09ICdudW1iZXInKSByZXR1cm4gaW1nLmNyZWRpdHNDb3N0OwogICAgaWYgKHR5cGVvZiBpbWcuY3JlZGl0Q29zdCA9PT0gJ251bWJlcicpIHJldHVybiBpbWcuY3JlZGl0Q29zdDsKICAgIGlmICh0eXBlb2YgaW1nLmNvc3QgPT09ICdudW1iZXInKSByZXR1cm4gaW1nLmNvc3Q7CiAgICBpZiAoaW1nLnZpZGVvVVJMKSByZXR1cm4gNTA7CiAgICBpZiAoaW1nLm1vZGVsKSByZXR1cm4gbW9kZWxDb3N0KGltZy5tb2RlbCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHJhdGUocmVtb3RlSUQsIGFjdGlvbikgewogICAgaWYgKCFyZW1vdGVJRCkgcmV0dXJuOwogICAgdmFyIGFwaSA9IEFQSSgpOwogICAgaWYgKGFwaSAmJiB0eXBlb2YgYXBpLnJhdGluZyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgeyBQcm9taXNlLnJlc29sdmUoYXBpLnJhdGluZyhyZW1vdGVJRCwgYWN0aW9uKSkuY2F0Y2goZnVuY3Rpb24gKCkge30pOyB9IGNhdGNoIChlKSB7fQogICAgfQogIH0KCiAgZnVuY3Rpb24gYnVzeShidG4sIG9uKSB7CiAgICBpZiAoIWJ0bikgcmV0dXJuOwogICAgYnRuLmRpc2FibGVkID0gISFvbjsKICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtYnVzeScsIG9uID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnaXMtYnVzeScsICEhb24pOwogICAgYnRuLnN0eWxlLm9wYWNpdHkgPSBvbiA/ICcwLjYnIDogJyc7CiAgICBidG4uc3R5bGUucG9pbnRlckV2ZW50cyA9IG9uID8gJ25vbmUnIDogJyc7CiAgfQoKICBmdW5jdGlvbiBmaW5kSW5TdGF0ZShpZCkgewogICAgaWYgKCFpZCkgcmV0dXJuIG51bGw7CiAgICB2YXIgcG9vbHMgPSBbU1QoKS5saWJyYXJ5IHx8IFtdLCBTVCgpLmZlZWQgfHwgW11dOwogICAgZm9yICh2YXIgcCA9IDA7IHAgPCBwb29scy5sZW5ndGg7IHArKykgewogICAgICB2YXIgcG9vbCA9IHBvb2xzW3BdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvb2wubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgaW1nID0gdW53cmFwKHBvb2xbaV0pOwogICAgICAgIGlmIChpbWFnZUlEKGltZykgPT09IGlkIHx8IChpbWcgJiYgaW1nLmlkID09PSBpZCkgfHwgKGltZyAmJiBpbWcucmVtb3RlSUQgPT09IGlkKSkgcmV0dXJuIGltZzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiB1bndyYXAoaXRlbSkgewogICAgaWYgKCFpdGVtKSByZXR1cm4gaXRlbTsKICAgIGlmIChpdGVtLmdlbmVyYXRlZEltYWdlKSByZXR1cm4gaXRlbS5nZW5lcmF0ZWRJbWFnZTsKICAgIHJldHVybiBpdGVtOwogIH0KCiAgZnVuY3Rpb24gcmVzb2x2ZUltYWdlKGlkKSB7CiAgICB2YXIgbG9jYWwgPSBmaW5kSW5TdGF0ZShpZCk7CiAgICBpZiAobG9jYWwpIHJldHVybiBQcm9taXNlLnJlc29sdmUobG9jYWwpOwogICAgdmFyIGFwaSA9IEFQSSgpOwogICAgaWYgKGFwaSAmJiB0eXBlb2YgYXBpLmxpYnJhcnkgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIHBhZ2UgPSAxLCBwZXIgPSA2MCwgbWF4UGFnZXMgPSA1OwogICAgICB2YXIgc3RlcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaS5saWJyYXJ5KHBhZ2UsIHBlcikpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgdmFyIGl0ZW1zID0gKHJlcyAmJiAocmVzLml0ZW1zIHx8IHJlcykpIHx8IFtdOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgaW1nID0gdW53cmFwKGl0ZW1zW2ldKTsKICAgICAgICAgICAgaWYgKGltYWdlSUQoaW1nKSA9PT0gaWQpIHJldHVybiBpbWc7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgbWV0YSA9IHJlcyAmJiByZXMubWV0YWRhdGE7CiAgICAgICAgICB2YXIgbW9yZSA9IGl0ZW1zLmxlbmd0aCA+PSBwZXIgJiYgKCFtZXRhIHx8IHBhZ2UgKiBwZXIgPCBtZXRhLnRvdGFsKSAmJiBwYWdlIDwgbWF4UGFnZXM7CiAgICAgICAgICBpZiAobW9yZSkgeyBwYWdlKys7IHJldHVybiBzdGVwKCk7IH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH0pOwogICAgICB9OwogICAgICByZXR1cm4gc3RlcCgpOwogICAgfQogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkU2libGluZ3MoaW1nKSB7CiAgICB2YXIgbGliID0gKFNUKCkubGlicmFyeSB8fCBbXSkubWFwKHVud3JhcCk7CiAgICB2YXIgZmVlZCA9IChTVCgpLmZlZWQgfHwgW10pLm1hcCh1bndyYXApOwogICAgdmFyIGlkID0gaW1hZ2VJRChpbWcpOwogICAgaWYgKGxpYi5zb21lKGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWFnZUlEKHgpID09PSBpZDsgfSkpIHJldHVybiBsaWI7CiAgICBpZiAoZmVlZC5zb21lKGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWFnZUlEKHgpID09PSBpZDsgfSkpIHJldHVybiBmZWVkOwogICAgcmV0dXJuIGxpYi5sZW5ndGggPyBsaWIgOiBmZWVkOwogIH0KCiAgZnVuY3Rpb24gbmF2aWdhdGUoZGVsdGEpIHsKICAgIGlmICghX3NpYmxpbmdzLmxlbmd0aCkgcmV0dXJuOwogICAgdmFyIG5leHQgPSBfaW5kZXggKyBkZWx0YTsKICAgIGlmIChuZXh0IDwgMCB8fCBuZXh0ID49IF9zaWJsaW5ncy5sZW5ndGgpIHJldHVybjsKICAgIHZhciB0YXJnZXQgPSBfc2libGluZ3NbbmV4dF07CiAgICB2YXIgdGlkID0gaW1hZ2VJRCh0YXJnZXQpOwogICAgaWYgKCF0aWQpIHJldHVybjsKICAgIGdvKCcjL2ltYWdlLycgKyBlbmNvZGVVUklDb21wb25lbnQodGlkKSk7CiAgfQoKICBmdW5jdGlvbiBidWlsZE1lZGlhKCkgewogICAgdmFyIHN0YWdlID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0dWRpb19fc3RhZ2UnLCAnZGF0YS1yb2xlJzogJ3N0YWdlJywgc3R5bGU6IHsKICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsIGZsZXg6ICcxIDEgYXV0bycsIGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsCiAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJywgbWluSGVpZ2h0OiAnMCcsIG1pbldpZHRoOiAnMCcsIHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnCiAgICB9IH0pOwoKICAgIHZhciBoYXNWaWRlbyA9ICEhX2ltYWdlLnZpZGVvVVJMOwogICAgdmFyIGhhc0JlZm9yZSA9ICEhX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwgJiYgISFfaW1hZ2UucmVtb3RlSW1hZ2VVUkw7CgogICAgaWYgKGhhc1ZpZGVvKSB7CiAgICAgIHZhciB2aWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpOwogICAgICB2aWQuY2xhc3NOYW1lID0gJ3Ytc3R1ZGlvX192aWRlbyc7CiAgICAgIHZpZC5tdXRlZCA9IHRydWU7IHZpZC5sb29wID0gdHJ1ZTsgdmlkLmF1dG9wbGF5ID0gdHJ1ZTsKICAgICAgdmlkLnNldEF0dHJpYnV0ZSgncGxheXNpbmxpbmUnLCAnJyk7IHZpZC5zZXRBdHRyaWJ1dGUoJ3dlYmtpdC1wbGF5c2lubGluZScsICcnKTsKICAgICAgdmlkLnByZWxvYWQgPSAnYXV0byc7CiAgICAgIHZpZC5wb3N0ZXIgPSBfaW1hZ2UucmVtb3RlSW1hZ2VVUkwgfHwgJyc7CiAgICAgIHZpZC5zcmMgPSBfaW1hZ2UudmlkZW9VUkw7CiAgICAgIHZpZC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnQW5pbWF0ZWQgcmVzdWx0Jyk7CiAgICAgIE9iamVjdC5hc3NpZ24odmlkLnN0eWxlLCBtZWRpYUZpdFN0eWxlKCkpOwogICAgICB2aWQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgc3RhZ2UuY2xhc3NMaXN0LmFkZCgnaXMtZXJyb3InKTsKICAgICAgICBzdGFnZS5hcHBlbmRDaGlsZChtZWRpYUVycm9yKCdDb3VsZG7igJl0IGxvYWQgdGhlIHZpZGVvLicpKTsKICAgICAgfSk7CiAgICAgIHZpZC5wbGF5ICYmIHZpZC5wbGF5KCkuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgICBzdGFnZS5hcHBlbmRDaGlsZCh2aWQpOwogICAgICBpZiAoX2ltYWdlLnJlbW90ZUltYWdlVVJMKSBzdGFnZS5hcHBlbmRDaGlsZChtZWRpYVRvZ2dsZSgncGhvdG8nLCAnU2hvdyBzdGlsbCcsIGZ1bmN0aW9uICgpIHsgc2hvd1N0aWxsKHN0YWdlKTsgfSkpOwogICAgfSBlbHNlIGlmIChoYXNCZWZvcmUpIHsKICAgICAgX3NjcnViTm9kZSA9IGJ1aWxkU2NydWIoKTsKICAgICAgc3RhZ2UuYXBwZW5kQ2hpbGQoX3NjcnViTm9kZSk7CiAgICB9IGVsc2UgaWYgKF9pbWFnZS5yZW1vdGVJbWFnZVVSTCkgewogICAgICBzdGFnZS5hcHBlbmRDaGlsZChidWlsZFNpbmdsZUltYWdlKHN0YWdlKSk7CiAgICB9IGVsc2UgewogICAgICBzdGFnZS5hcHBlbmRDaGlsZChtZWRpYUVycm9yKCdObyBpbWFnZSBhdmFpbGFibGUuJykpOwogICAgfQogICAgcmV0dXJuIHN0YWdlOwogIH0KCiAgZnVuY3Rpb24gbWVkaWFGaXRTdHlsZSgpIHsKICAgIHJldHVybiB7CiAgICAgIG1heFdpZHRoOiAnMTAwJScsIG1heEhlaWdodDogJzEwMCUnLCB3aWR0aDogJ2F1dG8nLCBoZWlnaHQ6ICdhdXRvJywKICAgICAgb2JqZWN0Rml0OiAnY29udGFpbicsIGJvcmRlclJhZGl1czogJ3ZhcigtLXYtcmFkaXVzLCAyNHB4KScsCiAgICAgIGJveFNoYWRvdzogJzAgMzBweCA5MHB4IC0zMHB4IHJnYmEoMCwwLDAsLjcpJywgZGlzcGxheTogJ2Jsb2NrJwogICAgfTsKICB9CgogIGZ1bmN0aW9uIG1lZGlhVG9nZ2xlKGljb25OYW1lLCBsYWJlbCwgb25DbGljaykgewogICAgdmFyIGJ0biA9IGdsYXNzQnRuKGljb25OYW1lLCBsYWJlbCwgb25DbGljaywgeyBjb21wYWN0OiB0cnVlIH0pOwogICAgT2JqZWN0LmFzc2lnbihidG4uc3R5bGUsIHsKICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsIGJvdHRvbTogJzE2cHgnLCBsZWZ0OiAnNTAlJywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNTAlKScsIHpJbmRleDogJzQnCiAgICB9KTsKICAgIHJldHVybiBidG47CiAgfQoKICBmdW5jdGlvbiBidWlsZFNjcnViKCkgewogICAgdmFyIHVpID0gVUkoKTsKICAgIGlmICh1aSAmJiB0eXBlb2YgdWkuc2NydWIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIG4gPSB1aS5zY3J1YihfaW1hZ2UucmVtb3RlT3JpZ2luYWxJbWFnZVVSTCwgX2ltYWdlLnJlbW90ZUltYWdlVVJMLCB7CiAgICAgICAgZWFnZXI6IHRydWUsIGJlZm9yZUFsdDogJ0JlZm9yZSB0cmFuc2Zvcm1hdGlvbicsIGFmdGVyQWx0OiAnQWZ0ZXIgdHJhbnNmb3JtYXRpb24nCiAgICAgIH0pOwogICAgICBpZiAobikgewogICAgICAgIE9iamVjdC5hc3NpZ24obi5zdHlsZSwgewogICAgICAgICAgd2lkdGg6ICcxMDAlJywgbWF4V2lkdGg6ICdtaW4oMTAwJSwgNzh2aCknLCBtYXhIZWlnaHQ6ICcxMDAlJywgbWFyZ2luOiAnMCBhdXRvJwogICAgICAgIH0pOwogICAgICAgIG4uY2xhc3NMaXN0LmFkZCgndi1zdHVkaW9fX3NjcnViJyk7CiAgICAgICAgZGVjb3JhdGVTY3J1YihuKTsKICAgICAgICByZXR1cm4gbjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbGxiYWNrU2NydWIoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwsIF9pbWFnZS5yZW1vdGVJbWFnZVVSTCk7CiAgfQoKICBmdW5jdGlvbiBkZWNvcmF0ZVNjcnViKGZlZWQpIHsKICAgIHZhciBjYXJkID0gZmVlZC5xdWVyeVNlbGVjdG9yKCcudmNhcmQnKTsKICAgIGlmICghY2FyZCB8fCBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fc2NydWItbGFiZWwnKSkgcmV0dXJuOwogICAgY2FyZC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXN0dWRpb19fc2NydWItbGFiZWwgdi1zdHVkaW9fX3NjcnViLWxhYmVsLS1iZWZvcmUnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIHRleHQ6ICdCZWZvcmUnIH0pKTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX3NjcnViLWxhYmVsIHYtc3R1ZGlvX19zY3J1Yi1sYWJlbC0tYWZ0ZXInLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIHRleHQ6ICdBZnRlcicgfSkpOwogIH0KCiAgZnVuY3Rpb24gZmFsbGJhY2tTY3J1YihiZWZvcmVVUkwsIGFmdGVyVVJMKSB7CiAgICB2YXIgd3JhcCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndmNhcmQnLCBzdHlsZTogewogICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJywgd2lkdGg6ICcxMDAlJywgbWF4V2lkdGg6ICdtaW4oMTAwJSwgNzh2aCknLCBtYXhIZWlnaHQ6ICcxMDAlJywKICAgICAgbWFyZ2luOiAnMCBhdXRvJywgYm9yZGVyUmFkaXVzOiAndmFyKC0tdi1yYWRpdXMsIDI0cHgpJywgb3ZlcmZsb3c6ICdoaWRkZW4nLAogICAgICBib3hTaGFkb3c6ICcwIDMwcHggOTBweCAtMzBweCByZ2JhKDAsMCwwLC43KScsIHRvdWNoQWN0aW9uOiAnbm9uZScsIGN1cnNvcjogJ2V3LXJlc2l6ZScKICAgIH0gfSk7CiAgICB2YXIgYWZ0ZXIgPSBlbCgnaW1nJywgeyBjbGFzczogJ3ZhZnRlcicsIHNyYzogYWZ0ZXJVUkwsIGFsdDogJ0FmdGVyJywgZHJhZ2dhYmxlOiBmYWxzZSwKICAgICAgc3R5bGU6IHsgZGlzcGxheTogJ2Jsb2NrJywgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnYXV0bycgfSB9KTsKICAgIHZhciBiZWZvcmUgPSBlbCgnaW1nJywgeyBjbGFzczogJ3ZiZWZvcmUnLCBzcmM6IGJlZm9yZVVSTCwgYWx0OiAnQmVmb3JlJywgZHJhZ2dhYmxlOiBmYWxzZSwKICAgICAgc3R5bGU6IHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIGluc2V0OiAnMCcsIHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnLCBvYmplY3RGaXQ6ICdjb3ZlcicgfSB9KTsKICAgIHZhciBoYW5kbGUgPSBlbCgnZGl2JywgeyBjbGFzczogJ3ZzY3J1YicsICdhcmlhLWhpZGRlbic6ICd0cnVlJywgc3R5bGU6IHsKICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogJzAnLCBib3R0b206ICcwJywgd2lkdGg6ICcycHgnLCBiYWNrZ3JvdW5kOiAncmdiYSgyNTUsMjU1LDI1NSwuOSknLAogICAgICBib3hTaGFkb3c6ICcwIDAgMTJweCByZ2JhKDAsMCwwLC41KScsIHBvaW50ZXJFdmVudHM6ICdub25lJwogICAgfSB9KTsKICAgIHZhciBiZWZvcmVMYWJlbCA9IGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3R1ZGlvX19zY3J1Yi1sYWJlbCB2LXN0dWRpb19fc2NydWItbGFiZWwtLWJlZm9yZScsICdhcmlhLWhpZGRlbic6ICd0cnVlJywgdGV4dDogJ0JlZm9yZScgfSk7CiAgICB2YXIgYWZ0ZXJMYWJlbCA9IGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3R1ZGlvX19zY3J1Yi1sYWJlbCB2LXN0dWRpb19fc2NydWItbGFiZWwtLWFmdGVyJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCB0ZXh0OiAnQWZ0ZXInIH0pOwogICAgd3JhcC5hcHBlbmRDaGlsZChhZnRlcik7IHdyYXAuYXBwZW5kQ2hpbGQoYmVmb3JlKTsgd3JhcC5hcHBlbmRDaGlsZChoYW5kbGUpOwogICAgd3JhcC5hcHBlbmRDaGlsZChiZWZvcmVMYWJlbCk7IHdyYXAuYXBwZW5kQ2hpbGQoYWZ0ZXJMYWJlbCk7CiAgICB2YXIgcG9zID0gMC41LCBkcmFnZ2luZyA9IGZhbHNlLCBpZGxlID0gbnVsbCwgdDAgPSAwOwogICAgZnVuY3Rpb24gc2V0KHApIHsKICAgICAgcG9zID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgcCkpOwogICAgICBiZWZvcmUuc3R5bGUuY2xpcFBhdGggPSAnaW5zZXQoMCAnICsgKCgxIC0gcG9zKSAqIDEwMCkgKyAnJSAwIDApJzsKICAgICAgaGFuZGxlLnN0eWxlLmxlZnQgPSAocG9zICogMTAwKSArICclJzsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21FdmVudChlKSB7CiAgICAgIHZhciByID0gd3JhcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgdmFyIHggPSAoZS50b3VjaGVzID8gZS50b3VjaGVzWzBdLmNsaWVudFggOiBlLmNsaWVudFgpIC0gci5sZWZ0OwogICAgICBzZXQoeCAvIHIud2lkdGgpOwogICAgfQogICAgZnVuY3Rpb24gc3RhcnRJZGxlKCkgewogICAgICBzdG9wSWRsZSgpOwogICAgICBpZGxlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIGxvb3AodCkgewogICAgICAgIGlmIChkcmFnZ2luZykgcmV0dXJuOwogICAgICAgIGlmICghdDApIHQwID0gdDsKICAgICAgICB2YXIgcGhhc2UgPSAoKHQgLSB0MCkgLyAyNjAwKSAlIDE7CiAgICAgICAgc2V0KDAuNSArIDAuMyAqIE1hdGguc2luKHBoYXNlICogTWF0aC5QSSAqIDIpKTsKICAgICAgICBpZGxlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApOwogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0b3BJZGxlKCkgeyBpZiAoaWRsZSkgeyBjYW5jZWxBbmltYXRpb25GcmFtZShpZGxlKTsgaWRsZSA9IG51bGw7IH0gfQogICAgd3JhcC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGRyYWdnaW5nID0gdHJ1ZTsgd3JhcC5jbGFzc0xpc3QuYWRkKCdzY3J1YmJpbmcnKTsgc3RvcElkbGUoKTsKICAgICAgZnJvbUV2ZW50KGUpOyB0cnkgeyB3cmFwLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTsgfSBjYXRjaCAoZXIpIHt9CiAgICB9KTsKICAgIHdyYXAuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBmdW5jdGlvbiAoZSkgeyBpZiAoZHJhZ2dpbmcpIGZyb21FdmVudChlKTsgfSk7CiAgICB2YXIgZW5kID0gZnVuY3Rpb24gKCkgewogICAgICBpZiAoIWRyYWdnaW5nKSByZXR1cm47CiAgICAgIGRyYWdnaW5nID0gZmFsc2U7IHdyYXAuY2xhc3NMaXN0LnJlbW92ZSgnc2NydWJiaW5nJyk7CiAgICAgIHQwID0gMDsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGlmICghZHJhZ2dpbmcpIHN0YXJ0SWRsZSgpOyB9LCAyNDAwKTsKICAgIH07CiAgICB3cmFwLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7CiAgICB3cmFwLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBlbmQpOwogICAgc2V0KDAuNSk7IHN0YXJ0SWRsZSgpOwogICAgd3JhcC5kZXN0cm95ID0gc3RvcElkbGU7CiAgICByZXR1cm4gd3JhcDsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkU2luZ2xlSW1hZ2Uoc3RhZ2UpIHsKICAgIHZhciBpbWcgPSBlbCgnaW1nJywgewogICAgICBjbGFzczogJ3Ytc3R1ZGlvX19pbWcnLCBzcmM6IF9pbWFnZS5yZW1vdGVJbWFnZVVSTCwgZHJhZ2dhYmxlOiBmYWxzZSwKICAgICAgYWx0OiBfaW1hZ2UucHJvbXB0ID8gKCdHZW5lcmF0ZWQgaW1hZ2U6ICcgKyBfaW1hZ2UucHJvbXB0KSA6ICdHZW5lcmF0ZWQgaW1hZ2UnLAogICAgICBzdHlsZTogbWVkaWFGaXRTdHlsZSgpCiAgICB9KTsKICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKCkgeyBzdGFnZS5jbGFzc0xpc3QuYWRkKCdpcy1sb2FkZWQnKTsgfSk7CiAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoKSB7CiAgICAgIHN0YWdlLmNsYXNzTGlzdC5hZGQoJ2lzLWVycm9yJyk7CiAgICAgIGltZy5yZXBsYWNlV2l0aChtZWRpYUVycm9yKCdDb3VsZG7igJl0IGxvYWQgdGhlIGltYWdlLicpKTsKICAgIH0pOwogICAgcmV0dXJuIGltZzsKICB9CgogIGZ1bmN0aW9uIHNob3dTdGlsbChzdGFnZSkgewogICAgdmFyIGV4aXN0aW5nID0gc3RhZ2UucXVlcnlTZWxlY3RvcignLnYtc3R1ZGlvX192aWRlbycpOwogICAgaWYgKGV4aXN0aW5nKSBleGlzdGluZy5yZW1vdmUoKTsKICAgIHZhciBvbGRUb2dnbGUgPSBzdGFnZS5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX21lZGlhLXRvZ2dsZScpOwogICAgaWYgKG9sZFRvZ2dsZSkgb2xkVG9nZ2xlLnJlbW92ZSgpOwogICAgdmFyIGltZyA9IGJ1aWxkU2luZ2xlSW1hZ2Uoc3RhZ2UpOwogICAgc3RhZ2UuaW5zZXJ0QmVmb3JlKGltZywgc3RhZ2UuZmlyc3RDaGlsZCk7CiAgICB2YXIgYmFjayA9IG1lZGlhVG9nZ2xlKCd2aWRlbycsICdTaG93IHZpZGVvJywgZnVuY3Rpb24gKCkgeyByZWJ1aWxkTWVkaWEoKTsgfSk7CiAgICBzdGFnZS5hcHBlbmRDaGlsZChiYWNrKTsKICB9CgogIGZ1bmN0aW9uIG1lZGlhRXJyb3IobXNnKSB7CiAgICByZXR1cm4gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0dWRpb19fbWVkaWEtZXJyb3Igdi1lbXB0eScsIHJvbGU6ICdhbGVydCcsIHN0eWxlOiB7CiAgICAgIGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBnYXA6ICcxMHB4JywKICAgICAgY29sb3I6IElOS19TT0ZULCBwYWRkaW5nOiAnMjRweCcsIHRleHRBbGlnbjogJ2NlbnRlcicKICAgIH0gfSwgaWNvbignaW5mbycpLCBlbCgnc3BhbicsIHsgdGV4dDogbXNnIH0pKTsKICB9CgogIGZ1bmN0aW9uIGdsYXNzQnRuKGljb25OYW1lLCBsYWJlbCwgb25DbGljaywgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgYnRuID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6ICdnbGFzcy1idXR0b24gdi1zdHVkaW9fX2FjdGlvbicsCiAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICB0aXRsZTogbGFiZWwsCiAgICAgICdhcmlhLWxhYmVsJzogbGFiZWwsCiAgICAgICdhcmlhLXByZXNzZWQnOiBvcHRzLnRvZ2dsZSA/IChvcHRzLmFjdGl2ZSA/ICd0cnVlJyA6ICdmYWxzZScpIDogbnVsbAogICAgfSk7CiAgICBPYmplY3QuYXNzaWduKGJ0bi5zdHlsZSwgewogICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgYWxpZ25JdGVtczogJ2NlbnRlcicsCiAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJywgZ2FwOiAnNXB4JywgbWluV2lkdGg6ICc2NHB4JywKICAgICAgcGFkZGluZzogb3B0cy5jb21wYWN0ID8gJzlweCAxMnB4JyA6ICcxMXB4IDEwcHgnLAogICAgICBib3JkZXJSYWRpdXM6ICd2YXIoLS1yYWRpdXMtY29udGVudCwgMTJweCknLCBjdXJzb3I6ICdwb2ludGVyJywKICAgICAgY29sb3I6IElOSywgbGluZUhlaWdodDogJzEnLCBmbGV4OiAnMCAwIGF1dG8nLAogICAgICB0cmFuc2l0aW9uOiAndHJhbnNmb3JtIHZhcigtLWR1ci1pbnRlcmFjdGl2ZSwxNDBtcykgdmFyKC0tZ2xhc3MtZWFzZSksIGNvbG9yIHZhcigtLWR1ci1mYXN0LDkwbXMpIGVhc2UsIGJhY2tncm91bmQgdmFyKC0tZHVyLWZhc3QsOTBtcykgZWFzZScKICAgIH0pOwogICAgdmFyIGljb25XcmFwID0gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX2FjdGlvbi1pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBzdHlsZTogewogICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLCB3aWR0aDogJzI0cHgnLCBoZWlnaHQ6ICcyNHB4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJwogICAgfSB9LCBpY29uKGljb25OYW1lKSk7CiAgICBidG4uYXBwZW5kQ2hpbGQoaWNvbldyYXApOwogICAgaWYgKCFvcHRzLmNvbXBhY3QpIHsKICAgICAgYnRuLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3R1ZGlvX19hY3Rpb24tbGFiZWwnLCB0ZXh0OiBsYWJlbCwgc3R5bGU6IHsKICAgICAgICBmb250U2l6ZTogJzExcHgnLCBmb250V2VpZ2h0OiAnNjAwJywgY29sb3I6IElOS19TT0ZULCBsZXR0ZXJTcGFjaW5nOiAnLTAuMDFlbScKICAgICAgfSB9KSk7CiAgICB9CiAgICBhcHBseUFjdGlvblRvbmUoYnRuLCBvcHRzKTsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKCkgeyBpZiAoIWJ0bi5kaXNhYmxlZCkgYnRuLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKC0ycHgpJzsgfSk7CiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIGZ1bmN0aW9uICgpIHsgYnRuLnN0eWxlLnRyYW5zZm9ybSA9ICcnOyB9KTsKICAgIGlmICh0eXBlb2Ygb25DbGljayA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IG9uQ2xpY2soYnRuLCBlKTsgfSk7CiAgICB9CiAgICByZXR1cm4gYnRuOwogIH0KCiAgZnVuY3Rpb24gYXBwbHlBY3Rpb25Ub25lKGJ0biwgb3B0cykgewogICAgdmFyIGljb25XcmFwID0gYnRuLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uLWljb24nKTsKICAgIHZhciBsYWJlbCA9IGJ0bi5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX2FjdGlvbi1sYWJlbCcpOwogICAgaWYgKG9wdHMuZGFuZ2VyKSB7CiAgICAgIGJ0bi5zdHlsZS5jb2xvciA9IEVSUk9SOwogICAgICBpZiAoaWNvbldyYXApIGljb25XcmFwLnN0eWxlLmNvbG9yID0gRVJST1I7CiAgICAgIGlmIChsYWJlbCkgbGFiZWwuc3R5bGUuY29sb3IgPSBFUlJPUjsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG9wdHMucHJpbWFyeSB8fCBvcHRzLmFjdGl2ZSkgewogICAgICBidG4uc3R5bGUuY29sb3IgPSBBQ0NFTlQ7CiAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCAnICsgQUNDRU5UICsgJyAxNiUsIHRyYW5zcGFyZW50KSc7CiAgICAgIGlmIChpY29uV3JhcCkgaWNvbldyYXAuc3R5bGUuY29sb3IgPSBBQ0NFTlQ7CiAgICAgIGlmIChsYWJlbCkgbGFiZWwuc3R5bGUuY29sb3IgPSBBQ0NFTlQ7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpY29uV3JhcCkgaWNvbldyYXAuc3R5bGUuY29sb3IgPSBBQ0NFTlRfU09GVDsKICB9CgogIGZ1bmN0aW9uIGFjdEVkaXQoKSB7CiAgICB2YXIgcGFyYW1zID0gW107CiAgICBpZiAoX2ltYWdlLnByb21wdCkgcGFyYW1zLnB1c2goJ3Byb21wdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KF9pbWFnZS5wcm9tcHQpKTsKICAgIGlmIChfaW1hZ2UubW9kZWwpIHBhcmFtcy5wdXNoKCdtb2RlbD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KF9pbWFnZS5tb2RlbCkpOwogICAgaWYgKF9pbWFnZS5yZW1vdGVJbWFnZVVSTCkgcGFyYW1zLnB1c2goJ2ltYWdlPScgKyBlbmNvZGVVUklDb21wb25lbnQoX2ltYWdlLnJlbW90ZUltYWdlVVJMKSk7CiAgICBnbygnIy9jcmVhdGUnICsgKHBhcmFtcy5sZW5ndGggPyAnPycgKyBwYXJhbXMuam9pbignJicpIDogJycpKTsKICB9CgogIGZ1bmN0aW9uIGFjdFZhcmlhdGlvbnMoYnRuKSB7CiAgICB2YXIgbiA9IDQ7CiAgICB2YXIgbW9kZWwgPSBfaW1hZ2UubW9kZWwgfHwgKChWLmRhdGEgJiYgVi5kYXRhLm1vZGVscyAmJiBWLmRhdGEubW9kZWxzWzBdICYmIFYuZGF0YS5tb2RlbHNbMF0ucmF3KSB8fCAnZmx1eEtsZWluJyk7CiAgICB2YXIgdG90YWwgPSBtb2RlbENvc3QobW9kZWwpICogbjsKICAgIGNvbmZpcm1EaWFsb2coJ0dlbmVyYXRlICcgKyBuICsgJyB2YXJpYXRpb25zIG9mIHRoaXMgaW1hZ2U/IEFib3V0ICcgKyB0b3RhbCArICcgY3JlZGl0cy4nLCB7IHRpdGxlOiAnVmFyaWF0aW9ucycsIGNvbmZpcm1MYWJlbDogJ0dlbmVyYXRlJyB9KS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIGlmICghX2ltYWdlLnJlbW90ZUltYWdlVVJMIHx8ICFfaW1hZ2UucHJvbXB0KSB7IHRvYXN0KCdUaGlzIGltYWdlIGNhbuKAmXQgYmUgcmUtdmFyaWVkLicsICdlcnJvcicpOyByZXR1cm47IH0KICAgICAgYnVzeShidG4sIHRydWUpOwogICAgICBydW5WYXJpYXRpb25zKG1vZGVsLCBuKS50aGVuKGZ1bmN0aW9uIChtYWRlKSB7CiAgICAgICAgYnVzeShidG4sIGZhbHNlKTsKICAgICAgICBpZiAobWFkZSA+IDApIHsKICAgICAgICAgIHRvYXN0KG1hZGUgKyAnIHZhcmlhdGlvbicgKyAobWFkZSA9PT0gMSA/ICcnIDogJ3MnKSArICcgY3JlYXRlZC4nLCAnc3VjY2VzcycpOwogICAgICAgICAgaWYgKFYudWkgJiYgVi51aS5jb25mZXR0aSkgdHJ5IHsgVi51aS5jb25mZXR0aSgpOyB9IGNhdGNoIChlKSB7fQogICAgICAgICAgZ28oJyMvbGlicmFyeScpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0b2FzdCgnQ291bGRu4oCZdCBjcmVhdGUgdmFyaWF0aW9ucy4nLCAnZXJyb3InKTsKICAgICAgICB9CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBidXN5KGJ0biwgZmFsc2UpOwogICAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdWYXJpYXRpb24gZ2VuZXJhdGlvbiBmYWlsZWQuJywgJ2Vycm9yJyk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBydW5WYXJpYXRpb25zKG1vZGVsLCBuKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICBpZiAoIWFwaSB8fCB0eXBlb2YgYXBpLmdlbkVkaXQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGFwaS5wb2xsRWRpdCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgYXBpLnBvbGwgIT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignR2VuZXJhdGlvbiBBUEkgdW5hdmFpbGFibGUuJykpOwogICAgfQogICAgdmFyIHNlZWRCYXNlID0gKFUoKS5yYW5kb21TZWVkID8gVSgpLnJhbmRvbVNlZWQoKSA6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDFlNikpOwogICAgdmFyIG1hZGUgPSAwOwogICAgdmFyIGNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAoZnVuY3Rpb24gKGspIHsKICAgICAgICBjaGFpbiA9IGNoYWluLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIHNlZWQgPSAoc2VlZEJhc2UgKyBrICogOTE3MykgJSAxMDAwMDAwOwogICAgICAgICAgdmFyIGJvZHkgPSB7CiAgICAgICAgICAgIHByb21wdDogX2ltYWdlLnByb21wdCwKICAgICAgICAgICAgaW1hZ2VfdXJsOiBfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsCiAgICAgICAgICAgIGltYWdlX3VybHM6IFtfaW1hZ2UucmVtb3RlSW1hZ2VVUkxdLAogICAgICAgICAgICBzZWVkOiBzZWVkCiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIGFwaS5wb2xsKAogICAgICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBhcGkuZ2VuRWRpdChtb2RlbCwgYm9keSk7IH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gYXBpLnBvbGxFZGl0KG1vZGVsLCBpZCk7IH0sCiAgICAgICAgICAgIHt9CiAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICB2YXIgdXJsID0gcmVzdWx0ICYmIHJlc3VsdC5pbWFnZXMgJiYgcmVzdWx0LmltYWdlc1swXSAmJiByZXN1bHQuaW1hZ2VzWzBdLnVybDsKICAgICAgICAgICAgaWYgKCF1cmwpIHJldHVybjsKICAgICAgICAgICAgbWFkZSsrOwogICAgICAgICAgICByZXR1cm4gcGVyc2lzdFJlc3VsdCh1cmwsIHNlZWQsIG1vZGVsKTsKICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsKICAgICAgICB9KTsKICAgICAgfSkoaSk7CiAgICB9CiAgICByZXR1cm4gY2hhaW4udGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiBtYWRlOyB9KTsKICB9CgogIGZ1bmN0aW9uIHBlcnNpc3RSZXN1bHQodXJsLCBzZWVkLCBtb2RlbCkgewogICAgdmFyIGFwaSA9IEFQSSgpOwogICAgdmFyIGdlbiA9IHsKICAgICAgaWQ6IChVKCkudXVpZCA/IFUoKS51dWlkKCkgOiBTdHJpbmcoRGF0ZS5ub3coKSkgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyKSksCiAgICAgIHByb21wdDogX2ltYWdlLnByb21wdCwKICAgICAgcmVtb3RlSW1hZ2VVUkw6IHVybCwKICAgICAgcmVtb3RlT3JpZ2luYWxJbWFnZVVSTDogX2ltYWdlLnJlbW90ZUltYWdlVVJMLAogICAgICBwYXJlbnRJRDogaW1hZ2VJRChfaW1hZ2UpLAogICAgICBzZWVkOiBzZWVkLAogICAgICBtb2RlbDogbW9kZWwsCiAgICAgIGNyZWF0ZWREYXRlOiBEYXRlLm5vdygpIC8gMTAwMAogICAgfTsKICAgIGlmIChhcGkgJiYgdHlwZW9mIGFwaS5wZXJzaXN0SW1hZ2UgPT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkucGVyc2lzdEltYWdlKGdlbikpLnRoZW4oZnVuY3Rpb24gKHNhdmVkKSB7CiAgICAgICAgdmFyIGltZyA9IHVud3JhcChzYXZlZCkgfHwgZ2VuOwogICAgICAgIHB1c2hUb0xpYnJhcnkoaW1nKTsKICAgICAgICByZXR1cm4gaW1nOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHB1c2hUb0xpYnJhcnkoZ2VuKTsgcmV0dXJuIGdlbjsgfSk7CiAgICB9CiAgICBwdXNoVG9MaWJyYXJ5KGdlbik7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGdlbik7CiAgfQoKICBmdW5jdGlvbiBwdXNoVG9MaWJyYXJ5KGltZykgewogICAgdHJ5IHsKICAgICAgdmFyIGxpYiA9IFNUKCkubGlicmFyeSB8fCBbXTsKICAgICAgbGliLnVuc2hpZnQoaW1nKTsKICAgICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5zZXQpIFYuc3RvcmUuc2V0KCdsaWJyYXJ5JywgbGliKTsKICAgICAgZWxzZSBWLnN0YXRlLmxpYnJhcnkgPSBsaWI7CiAgICAgIGlmIChWLnN0b3JlICYmIFYuc3RvcmUuZW1pdCkgVi5zdG9yZS5lbWl0KCdsaWJyYXJ5OmNoYW5nZWQnLCBsaWIpOwogICAgfSBjYXRjaCAoZSkge30KICB9CgogIGZ1bmN0aW9uIGFjdEFuaW1hdGUoYnRuKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICBpZiAoIWFwaSB8fCB0eXBlb2YgYXBpLmdlblZpZGVvTFRYICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBhcGkucG9sbFZpZGVvTFRYICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBhcGkucG9sbCAhPT0gJ2Z1bmN0aW9uJykgewogICAgICB0b2FzdCgnQW5pbWF0aW9uIGlzbuKAmXQgYXZhaWxhYmxlIHJpZ2h0IG5vdy4nLCAnZXJyb3InKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCFfaW1hZ2UucmVtb3RlSW1hZ2VVUkwpIHsgdG9hc3QoJ05vIGltYWdlIHRvIGFuaW1hdGUuJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgY29uZmlybURpYWxvZygnQW5pbWF0ZSB0aGlzIGltYWdlIGludG8gYSBzaG9ydCB2aWRlbz8gQWJvdXQgNTAgY3JlZGl0cy4nLCB7IHRpdGxlOiAnQW5pbWF0ZScsIGNvbmZpcm1MYWJlbDogJ0FuaW1hdGUnIH0pLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgYnVzeShidG4sIHRydWUpOwogICAgICB0b2FzdCgnQW5pbWF0aW5n4oCmIHRoaXMgY2FuIHRha2UgYSBtaW51dGUuJywgJ2luZm8nKTsKICAgICAgX3BvbGxBYm9ydCA9ICh0eXBlb2YgQWJvcnRDb250cm9sbGVyICE9PSAndW5kZWZpbmVkJykgPyBuZXcgQWJvcnRDb250cm9sbGVyKCkgOiBudWxsOwogICAgICB2YXIgc2lnbmFsID0gX3BvbGxBYm9ydCA/IF9wb2xsQWJvcnQuc2lnbmFsIDogdW5kZWZpbmVkOwogICAgICB2YXIgc2VlZCA9IChVKCkucmFuZG9tU2VlZCA/IFUoKS5yYW5kb21TZWVkKCkgOiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTYpKTsKICAgICAgdmFyIHJlcUJvZHkgPSB7IGltYWdlX3VybDogX2ltYWdlLnJlbW90ZUltYWdlVVJMLCBwcm9tcHQ6IF9pbWFnZS5wcm9tcHQgfHwgJycsIHNlZWQ6IHNlZWQgfTsKICAgICAgdmFyIGdlbkltZ0lEID0gaW1hZ2VJRChfaW1hZ2UpOwogICAgICBhcGkucG9sbCgKICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBhcGkuZ2VuVmlkZW9MVFgocmVxQm9keSk7IH0sCiAgICAgICAgZnVuY3Rpb24gKGlkKSB7IHJldHVybiAoYXBpLnBvbGxWaWRlb0xUWC5sZW5ndGggPj0gMikgPyBhcGkucG9sbFZpZGVvTFRYKGlkLCBnZW5JbWdJRCkgOiBhcGkucG9sbFZpZGVvTFRYKGlkKTsgfSwKICAgICAgICB7IHNpZ25hbDogc2lnbmFsLCBvblByb2dyZXNzOiBmdW5jdGlvbiAoKSB7fSB9CiAgICAgICkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgYnVzeShidG4sIGZhbHNlKTsKICAgICAgICBfcG9sbEFib3J0ID0gbnVsbDsKICAgICAgICB2YXIgdXJsID0gKHJlc3VsdCAmJiAocmVzdWx0LnZpZGVvVVJMIHx8IHJlc3VsdC52aWRlb191cmwgfHwKICAgICAgICAgIChyZXN1bHQudmlkZW8gJiYgcmVzdWx0LnZpZGVvLnVybCkgfHwKICAgICAgICAgIChyZXN1bHQuaW1hZ2VzICYmIHJlc3VsdC5pbWFnZXNbMF0gJiYgcmVzdWx0LmltYWdlc1swXS51cmwpKSkgfHwgbnVsbDsKICAgICAgICBpZiAoIXVybCkgeyB0b2FzdCgnQW5pbWF0aW9uIGZpbmlzaGVkIGJ1dCBubyB2aWRlbyBjYW1lIGJhY2suJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgICAgIF9pbWFnZS52aWRlb1VSTCA9IHVybDsKICAgICAgICBhcHBseUltYWdlTXV0YXRpb24oX2ltYWdlKTsKICAgICAgICByZWJ1aWxkTWVkaWEoKTsKICAgICAgICByZWJ1aWxkUGFuZWwoKTsKICAgICAgICB0b2FzdCgnWW91ciBhbmltYXRpb24gaXMgcmVhZHkuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICBpZiAoVi51aSAmJiBWLnVpLmNvbmZldHRpKSB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBidXN5KGJ0biwgZmFsc2UpOwogICAgICAgIF9wb2xsQWJvcnQgPSBudWxsOwogICAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykgcmV0dXJuOwogICAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdBbmltYXRpb24gZmFpbGVkLicsICdlcnJvcicpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gYWN0RG93bmxvYWQoYnRuKSB7CiAgICB2YXIgdXJsID0gX2ltYWdlLnJlbW90ZUltYWdlVVJMIHx8IF9pbWFnZS52aWRlb1VSTDsKICAgIGlmICghdXJsKSB7IHRvYXN0KCdOb3RoaW5nIHRvIGRvd25sb2FkLicsICdlcnJvcicpOyByZXR1cm47IH0KICAgIHZhciBuYW1lID0gJ3ZhbXAtJyArIChpbWFnZUlEKF9pbWFnZSkgfHwgRGF0ZS5ub3coKSk7CiAgICBpZiAoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwgJiYgX2ltYWdlLnJlbW90ZUltYWdlVVJMKSB7CiAgICAgIHZhciB1aSA9IFVJKCk7CiAgICAgIHZhciBtb2RhbFJlZiA9IG51bGw7CiAgICAgIGZ1bmN0aW9uIGRvbmVEbCgpIHsgaWYgKG1vZGFsUmVmICYmIG1vZGFsUmVmLmNsb3NlKSBtb2RhbFJlZi5jbG9zZSgpOyByYXRlKGltYWdlSUQoX2ltYWdlKSwgJ3NhdmUnKTsgfQogICAgICB2YXIgbWVudSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1zbScsIHN0eWxlOiB7IHBhZGRpbmc6ICc0cHgnIH0gfSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdEb3dubG9hZCcsIHN0eWxlOiB7IG1hcmdpbkJvdHRvbTogJzRweCcgfSB9KSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1wcmltYXJ5IHYtY3RhLS1ibG9jaycsIHR5cGU6ICdidXR0b24nLAogICAgICAgICAgb25jbGljazogZnVuY3Rpb24gKCkgeyBkb3dubG9hZChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsIG5hbWUgKyAnLWFmdGVyLmpwZycpOyBkb25lRGwoKTsgfSB9LCAnRG93bmxvYWQgYWZ0ZXInKSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCB2LWN0YS0tYmxvY2snLCB0eXBlOiAnYnV0dG9uJywKICAgICAgICAgIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgZG93bmxvYWQoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwsIG5hbWUgKyAnLWJlZm9yZS5qcGcnKTsgZG9uZURsKCk7IH0gfSwgJ0Rvd25sb2FkIGJlZm9yZScpLAogICAgICAgIGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1ibG9jaycsIHR5cGU6ICdidXR0b24nLAogICAgICAgICAgb25jbGljazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBkb3dubG9hZChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsIG5hbWUgKyAnLWFmdGVyLmpwZycpOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgZG93bmxvYWQoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwsIG5hbWUgKyAnLWJlZm9yZS5qcGcnKTsgfSwgMzUwKTsKICAgICAgICAgICAgZG9uZURsKCk7CiAgICAgICAgICB9IH0sICdEb3dubG9hZCBib3RoJykKICAgICAgKTsKICAgICAgaWYgKHVpICYmIHR5cGVvZiB1aS5tb2RhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIG1vZGFsUmVmID0gdWkubW9kYWwobWVudSwgeyBhcmlhTGFiZWw6ICdEb3dubG9hZCBvcHRpb25zJyB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkb3dubG9hZChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsIG5hbWUgKyAnLWFmdGVyLmpwZycpOwogICAgICAgIHJhdGUoaW1hZ2VJRChfaW1hZ2UpLCAnc2F2ZScpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBleHQgPSBfaW1hZ2UudmlkZW9VUkwgJiYgdXJsID09PSBfaW1hZ2UudmlkZW9VUkwgPyAnLm1wNCcgOiAnLmpwZyc7CiAgICBkb3dubG9hZCh1cmwsIG5hbWUgKyBleHQpOwogICAgcmF0ZShpbWFnZUlEKF9pbWFnZSksICdzYXZlJyk7CiAgICB0b2FzdCgnU2F2ZWQuJywgJ3N1Y2Nlc3MnKTsKICB9CgogIGZ1bmN0aW9uIGFjdEZhdm9yaXRlKGJ0bikgewogICAgdmFyIGFwaSA9IEFQSSgpOwogICAgdmFyIGlkID0gaW1hZ2VJRChfaW1hZ2UpOwogICAgaWYgKCFpZCB8fCAhYXBpIHx8IHR5cGVvZiBhcGkuc2V0RmF2b3JpdGUgIT09ICdmdW5jdGlvbicpIHsgdG9hc3QoJ0Zhdm9yaXRlcyB1bmF2YWlsYWJsZS4nLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICB2YXIgbmV4dCA9ICFfaW1hZ2UuZmF2b3JpdGVkOwogICAgX2ltYWdlLmZhdm9yaXRlZCA9IG5leHQ7CiAgICByZWZsZWN0RmF2b3JpdGUoYnRuLCBuZXh0KTsKICAgIGJ1c3koYnRuLCB0cnVlKTsKICAgIFByb21pc2UucmVzb2x2ZShhcGkuc2V0RmF2b3JpdGUoaWQsIG5leHQpKS50aGVuKGZ1bmN0aW9uICh1cGRhdGVkKSB7CiAgICAgIGJ1c3koYnRuLCBmYWxzZSk7CiAgICAgIHZhciBpbWcgPSB1bndyYXAodXBkYXRlZCk7CiAgICAgIGlmIChpbWcgJiYgdHlwZW9mIGltZy5mYXZvcml0ZWQgPT09ICdib29sZWFuJykgeyBfaW1hZ2UuZmF2b3JpdGVkID0gaW1nLmZhdm9yaXRlZDsgcmVmbGVjdEZhdm9yaXRlKGJ0biwgaW1nLmZhdm9yaXRlZCk7IH0KICAgICAgYXBwbHlJbWFnZU11dGF0aW9uKF9pbWFnZSk7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIGJ1c3koYnRuLCBmYWxzZSk7CiAgICAgIF9pbWFnZS5mYXZvcml0ZWQgPSAhbmV4dDsKICAgICAgcmVmbGVjdEZhdm9yaXRlKGJ0biwgX2ltYWdlLmZhdm9yaXRlZCk7CiAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdDb3VsZG7igJl0IHVwZGF0ZSBmYXZvcml0ZS4nLCAnZXJyb3InKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcmVmbGVjdEZhdm9yaXRlKGJ0biwgb24pIHsKICAgIGlmICghYnRuKSByZXR1cm47CiAgICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCBvbiA/ICd0cnVlJyA6ICdmYWxzZScpOwogICAgdmFyIGljb25XcmFwID0gYnRuLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uLWljb24nKTsKICAgIGlmIChpY29uV3JhcCkgeyBpY29uV3JhcC5pbm5lckhUTUwgPSAnJzsgaWNvbldyYXAuYXBwZW5kQ2hpbGQoaWNvbihvbiA/ICdoZWFydC5maWxsJyA6ICdoZWFydCcpKTsgfQogICAgdmFyIGxibCA9IGJ0bi5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX2FjdGlvbi1sYWJlbCcpOwogICAgaWYgKGxibCkgbGJsLnRleHRDb250ZW50ID0gb24gPyAnRmF2b3JpdGVkJyA6ICdGYXZvcml0ZSc7CiAgICBhcHBseUFjdGlvblRvbmUoYnRuLCB7IGFjdGl2ZTogb24gfSk7CiAgICBpZiAoIW9uICYmIGljb25XcmFwKSBpY29uV3JhcC5zdHlsZS5jb2xvciA9IEFDQ0VOVF9TT0ZUOwogICAgaWYgKCFvbiAmJiBsYmwpIGxibC5zdHlsZS5jb2xvciA9IElOS19TT0ZUOwogICAgaWYgKCFvbikgeyBidG4uc3R5bGUuY29sb3IgPSBJTks7IGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJyc7IH0KICB9CgogIGZ1bmN0aW9uIGFjdERlbGV0ZShidG4pIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIHZhciBpZCA9IGltYWdlSUQoX2ltYWdlKTsKICAgIGlmICghaWQgfHwgIWFwaSB8fCB0eXBlb2YgYXBpLmRlbGV0ZUltYWdlICE9PSAnZnVuY3Rpb24nKSB7IHRvYXN0KCdEZWxldGUgdW5hdmFpbGFibGUuJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgY29uZmlybURpYWxvZygnRGVsZXRlIHRoaXMgaW1hZ2U/IFRoaXMgY2Fu4oCZdCBiZSB1bmRvbmUuJywgeyB0aXRsZTogJ0RlbGV0ZSBpbWFnZScsIGRlc3RydWN0aXZlOiB0cnVlLCBjb25maXJtTGFiZWw6ICdEZWxldGUnIH0pLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgYnVzeShidG4sIHRydWUpOwogICAgICBQcm9taXNlLnJlc29sdmUoYXBpLmRlbGV0ZUltYWdlKGlkKSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgcmF0ZShpZCwgJ2RlbGV0ZScpOwogICAgICAgIHJlbW92ZUZyb21TdGF0ZShpZCk7CiAgICAgICAgdG9hc3QoJ0ltYWdlIGRlbGV0ZWQuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICB2YXIgZnJlc2ggPSAoU1QoKS5saWJyYXJ5IHx8IFtdKS5tYXAodW53cmFwKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGltYWdlSUQoeCk7IH0pOwogICAgICAgIGlmIChmcmVzaC5sZW5ndGgpIHsKICAgICAgICAgIHZhciB0YXJnZXQgPSBmcmVzaFtNYXRoLm1pbihfaW5kZXgsIGZyZXNoLmxlbmd0aCAtIDEpXTsKICAgICAgICAgIGlmICh0YXJnZXQgJiYgaW1hZ2VJRCh0YXJnZXQpICE9PSBpZCkgeyBnbygnIy9pbWFnZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGltYWdlSUQodGFyZ2V0KSkpOyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgY2xvc2UoKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgIGJ1c3koYnRuLCBmYWxzZSk7CiAgICAgICAgdG9hc3QoKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ0RlbGV0ZSBmYWlsZWQuJywgJ2Vycm9yJyk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZW1vdmVGcm9tU3RhdGUoaWQpIHsKICAgIHRyeSB7CiAgICAgIFsnbGlicmFyeScsICdmZWVkJ10uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgdmFyIGFyciA9IFNUKClba2V5XTsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuOwogICAgICAgIHZhciBmaWx0ZXJlZCA9IGFyci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGltYWdlSUQodW53cmFwKHgpKSAhPT0gaWQ7IH0pOwogICAgICAgIGlmIChWLnN0b3JlICYmIFYuc3RvcmUuc2V0KSBWLnN0b3JlLnNldChrZXksIGZpbHRlcmVkKTsKICAgICAgICBlbHNlIFYuc3RhdGVba2V5XSA9IGZpbHRlcmVkOwogICAgICB9KTsKICAgICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5lbWl0KSBWLnN0b3JlLmVtaXQoJ2xpYnJhcnk6Y2hhbmdlZCcsIFNUKCkubGlicmFyeSk7CiAgICB9IGNhdGNoIChlKSB7fQogIH0KCiAgZnVuY3Rpb24gYWN0U2hhcmUoYnRuKSB7CiAgICB2YXIgaWQgPSBpbWFnZUlEKF9pbWFnZSk7CiAgICB2YXIgYmFzZSA9IChWLmNvbmZpZyAmJiBWLmNvbmZpZy5BUEkpID8gVi5jb25maWcuQVBJIDogJ2h0dHBzOi8vYXBpLnZvb3NleS5jb20nOwogICAgdmFyIHJlbmRlclVSTCA9IGlkID8gYmFzZSArICcvZ2VuZXJhdGVkL3JlbmRlci8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSA6IG51bGw7CiAgICB2YXIgdGV4dCA9IChfaW1hZ2UucHJvbXB0ID8gX2ltYWdlLnByb21wdCArICdcblxuJyA6ICcnKSArICdNYWRlIHdpdGggVmFtcCBieSBWb29zZXkuJzsKICAgIHJhdGUoaWQsICdzaGFyZScpOwogICAgaWYgKG5hdmlnYXRvci5zaGFyZSAmJiByZW5kZXJVUkwpIHsKICAgICAgbmF2aWdhdG9yLnNoYXJlKHsgdGl0bGU6ICdWYW1wJywgdGV4dDogdGV4dCwgdXJsOiByZW5kZXJVUkwgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykgcmV0dXJuOwogICAgICAgIGNvcHlTaGFyZUxpbmsocmVuZGVyVVJMKTsKICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChyZW5kZXJVUkwpIHsgY29weVNoYXJlTGluayhyZW5kZXJVUkwpOyB9CiAgICBlbHNlIGlmIChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwpIHsgZG93bmxvYWQoX2ltYWdlLnJlbW90ZUltYWdlVVJMLCAndmFtcC0nICsgKGlkIHx8IERhdGUubm93KCkpICsgJy5qcGcnKTsgdG9hc3QoJ0ltYWdlIGRvd25sb2FkZWQuJywgJ3N1Y2Nlc3MnKTsgfQogICAgZWxzZSB7IHRvYXN0KCdOb3RoaW5nIHRvIHNoYXJlLicsICdlcnJvcicpOyB9CiAgfQoKICBmdW5jdGlvbiBjb3B5U2hhcmVMaW5rKHVybCkgewogICAgY29weVRleHQodXJsKS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/ICdTaGFyZSBsaW5rIGNvcGllZC4nIDogJ0NvcHkgdGhpcyBsaW5rOiAnICsgdXJsLCBvayA/ICdzdWNjZXNzJyA6ICdpbmZvJyk7IH0pOwogIH0KCiAgZnVuY3Rpb24gY29weVRleHQoc3RyKSB7CiAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkgewogICAgICByZXR1cm4gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc3RyKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9KTsKICAgIH0KICAgIHRyeSB7CiAgICAgIHZhciB0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICAgIHRhLnZhbHVlID0gc3RyOyB0YS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7IHRhLnN0eWxlLm9wYWNpdHkgPSAnMCc7CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOyB0YS5zZWxlY3QoKTsKICAgICAgdmFyIG9rID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsKICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0YSk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUob2spOwogICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsgfQogIH0KCiAgZnVuY3Rpb24gYWN0Q29weVByb21wdCgpIHsKICAgIGlmICghX2ltYWdlLnByb21wdCkgeyB0b2FzdCgnTm8gcHJvbXB0IHRvIGNvcHkuJywgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICBjb3B5VGV4dChfaW1hZ2UucHJvbXB0KS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/ICdQcm9tcHQgY29waWVkLicgOiAnQ291bGRu4oCZdCBjb3B5LicsIG9rID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJyk7IH0pOwogIH0KCiAgZnVuY3Rpb24gYWN0UHVibGlzaChidG4pIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIGlmICghYXBpKSB7IHRvYXN0KCdQdWJsaXNoaW5nIHVuYXZhaWxhYmxlLicsICdlcnJvcicpOyByZXR1cm47IH0KICAgIGNvbmZpcm1EaWFsb2coJ1B1Ymxpc2ggdGhpcyBpbWFnZSB0byB0aGUgcHVibGljIGZlZWQ/JywgeyB0aXRsZTogJ1B1Ymxpc2gnLCBjb25maXJtTGFiZWw6ICdQdWJsaXNoJyB9KS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIGJ1c3koYnRuLCB0cnVlKTsKICAgICAgZW5zdXJlUHJvZmlsZSgpLnRoZW4oZnVuY3Rpb24gKHByb2ZpbGVJRCkgewogICAgICAgIGlmICghcHJvZmlsZUlEKSB0aHJvdyBuZXcgRXJyb3IoJ05vIHByb2ZpbGUgYXZhaWxhYmxlLicpOwogICAgICAgIHJldHVybiBkb1B1Ymxpc2gocHJvZmlsZUlEKTsKICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgYnVzeShidG4sIGZhbHNlKTsKICAgICAgICBfaW1hZ2UucHVibGlzaGVkID0gdHJ1ZTsKICAgICAgICBhcHBseUltYWdlTXV0YXRpb24oX2ltYWdlKTsKICAgICAgICBhcHBseUFjdGlvblRvbmUoYnRuLCB7IGFjdGl2ZTogdHJ1ZSB9KTsKICAgICAgICB2YXIgbGJsID0gYnRuLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uLWxhYmVsJyk7CiAgICAgICAgaWYgKGxibCkgbGJsLnRleHRDb250ZW50ID0gJ1B1Ymxpc2hlZCc7CiAgICAgICAgdG9hc3QoJ1B1Ymxpc2hlZCB0byB5b3VyIGZlZWQuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICBpZiAoVi51aSAmJiBWLnVpLmNvbmZldHRpKSB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBidXN5KGJ0biwgZmFsc2UpOwogICAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdQdWJsaXNoIGZhaWxlZC4nLCAnZXJyb3InKTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGVuc3VyZVByb2ZpbGUoKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICB2YXIgcGlkID0gKFNUKCkucHJvZmlsZSAmJiAoU1QoKS5wcm9maWxlLmlkIHx8IChTVCgpLnByb2ZpbGUubWljcm8gJiYgU1QoKS5wcm9maWxlLm1pY3JvLmlkKSkpIHx8CiAgICAgIChTVCgpLnVzZXIgJiYgKFNUKCkudXNlci5wcm9maWxlSUQgfHwgKFNUKCkudXNlci5wcm9maWxlICYmIFNUKCkudXNlci5wcm9maWxlLmlkKSkpIHx8IG51bGw7CiAgICBpZiAocGlkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBpZCk7CiAgICBpZiAodHlwZW9mIGFwaS5nZXRQcml2YXRlUHJvZmlsZSA9PT0gJ2Z1bmN0aW9uJyAmJiAoU1QoKS51c2VyICYmIChTVCgpLnVzZXIucHJvZmlsZUlEIHx8IFNUKCkudXNlci5pZCkpKSB7CiAgICAgIHZhciB0cnlJRCA9IFNUKCkudXNlci5wcm9maWxlSUQgfHwgU1QoKS51c2VyLmlkOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaS5nZXRQcml2YXRlUHJvZmlsZSh0cnlJRCkpLnRoZW4oZnVuY3Rpb24gKHApIHsKICAgICAgICB2YXIgaWQgPSBwICYmIChwLmlkIHx8IChwLmdsb2JhbCAmJiBwLmdsb2JhbC5taWNybyAmJiBwLmdsb2JhbC5taWNyby5pZCkgfHwgKHAubWljcm8gJiYgcC5taWNyby5pZCkpOwogICAgICAgIGlmIChpZCkgcmV0dXJuIGlkOwogICAgICAgIHJldHVybiBjcmVhdGVQcm9maWxlRmxvdygpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBjcmVhdGVQcm9maWxlRmxvdygpOyB9KTsKICAgIH0KICAgIHJldHVybiBjcmVhdGVQcm9maWxlRmxvdygpOwogIH0KCiAgZnVuY3Rpb24gY3JlYXRlUHJvZmlsZUZsb3coKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICBpZiAodHlwZW9mIGFwaS5jcmVhdGVQcm9maWxlICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgdmFyIG5hbWUgPSAoU1QoKS51c2VyICYmIChTVCgpLnVzZXIubmFtZSB8fCBTVCgpLnVzZXIudXNlcm5hbWUgfHwgU1QoKS51c2VyLmZpcnN0TmFtZSkpIHx8ICdNeSBTdHVkaW8nOwogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkuY3JlYXRlUHJvZmlsZSh7IGRpc3BsYXlOYW1lOiBuYW1lIH0pKS50aGVuKGZ1bmN0aW9uIChwKSB7CiAgICAgIHZhciBpZCA9IHAgJiYgKHAuaWQgfHwgKHAuZ2xvYmFsICYmIHAuZ2xvYmFsLm1pY3JvICYmIHAuZ2xvYmFsLm1pY3JvLmlkKSB8fCAocC5taWNybyAmJiBwLm1pY3JvLmlkKSk7CiAgICAgIGlmIChpZCAmJiBWLnN0b3JlICYmIFYuc3RvcmUuc2V0KSBWLnN0b3JlLnNldCgncHJvZmlsZScsIHApOwogICAgICByZXR1cm4gaWQ7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9KTsKICB9CgogIGZ1bmN0aW9uIGRvUHVibGlzaChwcm9maWxlSUQpIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIGlmICh0eXBlb2YgYXBpLnB1Ymxpc2hJbWFnZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVycm9yKCdQdWJsaXNoaW5nIHVuYXZhaWxhYmxlLicpOwogICAgdmFyIHBheWxvYWQgPSB7CiAgICAgIGlkOiBfaW1hZ2UuaWQgfHwgaW1hZ2VJRChfaW1hZ2UpLAogICAgICByZW1vdGVJRDogX2ltYWdlLnJlbW90ZUlELAogICAgICBwcm9tcHQ6IF9pbWFnZS5wcm9tcHQsCiAgICAgIHJlbW90ZUltYWdlVVJMOiBfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsCiAgICAgIHJlbW90ZU9yaWdpbmFsSW1hZ2VVUkw6IF9pbWFnZS5yZW1vdGVPcmlnaW5hbEltYWdlVVJMLAogICAgICBtb2RlbDogX2ltYWdlLm1vZGVsLAogICAgICBzZWVkOiBfaW1hZ2Uuc2VlZCwKICAgICAgdmlkZW9VUkw6IF9pbWFnZS52aWRlb1VSTCwKICAgICAgdGFnczogX2ltYWdlLnRhZ3MsCiAgICAgIGNyZWF0ZWREYXRlOiBfaW1hZ2UuY3JlYXRlZERhdGUKICAgIH07CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaS5wdWJsaXNoSW1hZ2UocHJvZmlsZUlELCBwYXlsb2FkKSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBpZCA9IGltYWdlSUQoX2ltYWdlKTsKICAgICAgaWYgKGlkICYmIHR5cGVvZiBhcGkuc2V0UHVibGlzaGVkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkuc2V0UHVibGlzaGVkKGlkLCB0cnVlKSkuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgICB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGFjdFNhdmVQcmVzZXQoKSB7CiAgICBpZiAoIV9pbWFnZS5wcm9tcHQpIHsgdG9hc3QoJ05vIHByb21wdCB0byBzYXZlLicsICdpbmZvJyk7IHJldHVybjsgfQogICAgdmFyIHVpID0gVUkoKTsKICAgIHZhciBuYW1lSW5wdXQgPSBlbCgnaW5wdXQnLCB7IGNsYXNzOiAndi1maWVsZCcsIHR5cGU6ICd0ZXh0JywgcGxhY2Vob2xkZXI6ICdQcmVzZXQgbmFtZScsIHZhbHVlOiAoX2ltYWdlLnByb21wdCB8fCAnJykuc2xpY2UoMCwgNDApIH0pOwogICAgdmFyIHByb21wdEFyZWEgPSBlbCgndGV4dGFyZWEnLCB7IGNsYXNzOiAndi10ZXh0YXJlYScsIHJvd3M6IDQgfSk7CiAgICBwcm9tcHRBcmVhLnZhbHVlID0gX2ltYWdlLnByb21wdCB8fCAnJzsKICAgIHZhciBzdGF0dXMgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZmllbGQtaGludCcsICdhcmlhLWxpdmUnOiAncG9saXRlJywgc3R5bGU6IHsgbWluSGVpZ2h0OiAnMTZweCcgfSB9KTsKICAgIHZhciBzYXZlQnRuID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tYmxvY2snLCB0eXBlOiAnYnV0dG9uJyB9LCAnU2F2ZSBwcmVzZXQnKTsKICAgIHZhciBib2R5ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLXNtJywgc3R5bGU6IHsgcGFkZGluZzogJzRweCcsIG1pbldpZHRoOiAnbWluKDg2dncsIDM4MHB4KScgfSB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdTYXZlIGFzIHByZXNldCcgfSksCiAgICAgIGVsKCdsYWJlbCcsIHsgY2xhc3M6ICd2LWxhYmVsJywgdGV4dDogJ05hbWUnIH0pLCBuYW1lSW5wdXQsCiAgICAgIGVsKCdsYWJlbCcsIHsgY2xhc3M6ICd2LWxhYmVsJywgdGV4dDogJ1Byb21wdCcgfSksIHByb21wdEFyZWEsCiAgICAgIHN0YXR1cywKICAgICAgc2F2ZUJ0bgogICAgKTsKICAgIHZhciBtb2RhbFJlZiA9ICh1aSAmJiB0eXBlb2YgdWkubW9kYWwgPT09ICdmdW5jdGlvbicpID8gdWkubW9kYWwoYm9keSwgeyBhcmlhTGFiZWw6ICdTYXZlIHByZXNldCcgfSkgOiBudWxsOwogICAgc2F2ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG5hbWUgPSAobmFtZUlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIHZhciBwcm9tcHQgPSAocHJvbXB0QXJlYS52YWx1ZSB8fCAnJykudHJpbSgpOwogICAgICBpZiAoIW5hbWUpIHsgc3RhdHVzLnRleHRDb250ZW50ID0gJ0dpdmUgeW91ciBwcmVzZXQgYSBuYW1lLic7IG5hbWVJbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgaWYgKCFwcm9tcHQpIHsgc3RhdHVzLnRleHRDb250ZW50ID0gJ0EgcHJvbXB0IGlzIHJlcXVpcmVkLic7IHByb21wdEFyZWEuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSB0cnVlOyBzdGF0dXMudGV4dENvbnRlbnQgPSAnU2F2aW5n4oCmJzsKICAgICAgc2F2ZVByZXNldCh7IG5hbWU6IG5hbWUsIHByb21wdDogcHJvbXB0LCBtb2RlbDogX2ltYWdlLm1vZGVsIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChtb2RhbFJlZiAmJiBtb2RhbFJlZi5jbG9zZSkgbW9kYWxSZWYuY2xvc2UoKTsKICAgICAgICB0b2FzdCgnUHJlc2V0IHNhdmVkLicsICdzdWNjZXNzJyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ0NvdWxkbuKAmXQgc2F2ZSBwcmVzZXQuJzsKICAgICAgfSk7CiAgICB9KTsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBuYW1lSW5wdXQuZm9jdXMoKTsgbmFtZUlucHV0LnNlbGVjdCgpOyB9LCAzMCk7CiAgfQoKICBmdW5jdGlvbiBzYXZlUHJlc2V0KHApIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIHZhciBwcmVzZXQgPSB7CiAgICAgIGlkOiAoVSgpLnV1aWQgPyBVKCkudXVpZCgpIDogU3RyaW5nKERhdGUubm93KCkpKSwKICAgICAgbmFtZTogcC5uYW1lLCBwcm9tcHQ6IHAucHJvbXB0LCBuZWdhdGl2ZVByb21wdDogbnVsbCwgbW9kZWw6IHAubW9kZWwgfHwgbnVsbAogICAgfTsKICAgIHRyeSB7CiAgICAgIHZhciBsaXN0ID0gU1QoKS5wcmVzZXRzIHx8IFtdOwogICAgICBsaXN0LnB1c2gocHJlc2V0KTsKICAgICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5zZXQpIFYuc3RvcmUuc2V0KCdwcmVzZXRzJywgbGlzdCk7CiAgICAgIGVsc2UgVi5zdGF0ZS5wcmVzZXRzID0gbGlzdDsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgICBpZiAoVi5wcmVzZXRzICYmIHR5cGVvZiBWLnByZXNldHMuY3JlYXRlID09PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFYucHJlc2V0cy5jcmVhdGUocHJlc2V0KSk7CiAgICBpZiAoYXBpICYmIHR5cGVvZiBhcGkuY3JlYXRlUHJlc2V0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaS5jcmVhdGVQcmVzZXQocHJlc2V0KSk7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByZXNldCk7CiAgfQoKICBmdW5jdGlvbiBhcHBseUltYWdlTXV0YXRpb24oaW1nKSB7CiAgICB0cnkgewogICAgICB2YXIgaWQgPSBpbWFnZUlEKGltZyk7CiAgICAgIFsnbGlicmFyeScsICdmZWVkJ10uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgdmFyIGFyciA9IFNUKClba2V5XTsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgdSA9IHVud3JhcChhcnJbaV0pOwogICAgICAgICAgaWYgKGltYWdlSUQodSkgPT09IGlkKSB7IE9iamVjdC5hc3NpZ24odSwgaW1nKTsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBpZiAoVi5zdG9yZSAmJiBWLnN0b3JlLmVtaXQpIFYuc3RvcmUuZW1pdCgnbGlicmFyeTpjaGFuZ2VkJywgU1QoKS5saWJyYXJ5KTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiByZWJ1aWxkTWVkaWEoKSB7CiAgICBpZiAoIV9ub2RlKSByZXR1cm47CiAgICB2YXIgbW91bnQgPSBfbm9kZS5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX21lZGlhJyk7CiAgICBpZiAoIW1vdW50KSByZXR1cm47CiAgICBkZXN0cm95U2NydWIoKTsKICAgIG1vdW50LmlubmVySFRNTCA9ICcnOwogICAgbW91bnQuYXBwZW5kQ2hpbGQoYnVpbGRNZWRpYSgpKTsKICB9CgogIGZ1bmN0aW9uIHJlYnVpbGRQYW5lbCgpIHsKICAgIGlmICghX25vZGUpIHJldHVybjsKICAgIHZhciBvbGQgPSBfbm9kZS5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX3BhbmVsJyk7CiAgICBpZiAoIW9sZCkgcmV0dXJuOwogICAgdmFyIGZyZXNoID0gYnVpbGRQYW5lbCgpOwogICAgb2xkLnJlcGxhY2VXaXRoKGZyZXNoKTsKICB9CgogIGZ1bmN0aW9uIGRlc3Ryb3lTY3J1YigpIHsKICAgIGlmIChfc2NydWJOb2RlKSB7CiAgICAgIGlmICh0eXBlb2YgX3NjcnViTm9kZS5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IF9zY3J1Yk5vZGUuZGVzdHJveSgpOyB9IGNhdGNoIChlKSB7fSB9CiAgICB9CiAgICBfc2NydWJOb2RlID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkUGFuZWwoKSB7CiAgICB2YXIgcGFuZWwgPSBlbCgnYXNpZGUnLCB7IGNsYXNzOiAndi1zdHVkaW9fX3BhbmVsIGdsYXNzLWNhcmQnLCAnYXJpYS1sYWJlbCc6ICdJbWFnZSBkZXRhaWxzJywgc3R5bGU6IHBhbmVsU3R5bGUoKSB9KTsKCiAgICBpZiAoX2ltYWdlLnByb21wdCAmJiAhX2ltYWdlLmhpZGVQcm9tcHQpIHsKICAgICAgdmFyIHByb21wdEJ0biA9IGVsKCdidXR0b24nLCB7CiAgICAgICAgY2xhc3M6ICd2LXN0dWRpb19fcHJvbXB0JywgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgdGl0bGU6ICdDb3B5IHByb21wdCcsICdhcmlhLWxhYmVsJzogJ0NvcHkgcHJvbXB0IHRvIGNsaXBib2FyZCcsCiAgICAgICAgc3R5bGU6IHsKICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzhweCcsIHdpZHRoOiAnMTAwJScsIHRleHRBbGlnbjogJ2xlZnQnLAogICAgICAgICAgYmFja2dyb3VuZDogQ0FSRF9CRywgYm9yZGVyOiAnMXB4IHNvbGlkICcgKyBMSU5FLCBib3JkZXJSYWRpdXM6ICd2YXIoLS1yYWRpdXMtY29udGVudCwgMTJweCknLAogICAgICAgICAgcGFkZGluZzogJzE0cHggMTZweCcsIGN1cnNvcjogJ3BvaW50ZXInLCBjb2xvcjogSU5LLCBmb250OiAnaW5oZXJpdCcKICAgICAgICB9CiAgICAgIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX3Byb21wdC10ZXh0JywgdGV4dDogX2ltYWdlLnByb21wdCwgc3R5bGU6IHsKICAgICAgICAgIGZvbnRTaXplOiAnMTVweCcsIGxpbmVIZWlnaHQ6ICcxLjQ1JywgY29sb3I6IElOSywgd2hpdGVTcGFjZTogJ3ByZS13cmFwJwogICAgICAgIH0gfSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX3Byb21wdC1jb3B5Jywgc3R5bGU6IHsKICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBnYXA6ICc2cHgnLCBmb250U2l6ZTogJzEycHgnLAogICAgICAgICAgZm9udFdlaWdodDogJzYwMCcsIGNvbG9yOiBBQ0NFTlRfU09GVAogICAgICAgIH0gfSwgaWNvbignY29weScpLCBlbCgnc3BhbicsIHsgdGV4dDogJ0NvcHkgcHJvbXB0JyB9KSkKICAgICAgKTsKICAgICAgcHJvbXB0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWN0Q29weVByb21wdCk7CiAgICAgIHBhbmVsLmFwcGVuZENoaWxkKHByb21wdEJ0bik7CiAgICB9IGVsc2UgaWYgKF9pbWFnZS5oaWRlUHJvbXB0KSB7CiAgICAgIHBhbmVsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX3Byb21wdCB2LW11dGVkJywgdGV4dDogJ1Byb21wdCBoaWRkZW4nLCBzdHlsZTogewogICAgICAgIHBhZGRpbmc6ICcxNHB4IDE2cHgnLCBib3JkZXI6ICcxcHggZGFzaGVkICcgKyBMSU5FLCBib3JkZXJSYWRpdXM6ICd2YXIoLS1yYWRpdXMtY29udGVudCwgMTJweCknLCBjb2xvcjogSU5LX1NPRlQKICAgICAgfSB9KSk7CiAgICB9CgogICAgdmFyIG1ldGEgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19tZXRhJywgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBmbGV4V3JhcDogJ3dyYXAnLCBnYXA6ICc4cHgnIH0gfSk7CiAgICBpZiAoX2ltYWdlLm1vZGVsKSBtZXRhLmFwcGVuZENoaWxkKG1ldGFDaGlwKCdNb2RlbCcsIG1vZGVsTGFiZWwoX2ltYWdlLm1vZGVsKSkpOwogICAgdmFyIGRpbXMgPSBpbWFnZURpbWVuc2lvbnMoX2ltYWdlKTsKICAgIGlmIChkaW1zKSBtZXRhLmFwcGVuZENoaWxkKG1ldGFDaGlwKCdTaXplJywgZGltcykpOwogICAgaWYgKF9pbWFnZS5zZWVkICE9IG51bGwpIG1ldGEuYXBwZW5kQ2hpbGQobWV0YUNoaXAoJ1NlZWQnLCBTdHJpbmcoX2ltYWdlLnNlZWQpKSk7CiAgICB2YXIgY29zdCA9IGNyZWRpdENvc3QoX2ltYWdlKTsKICAgIGlmIChjb3N0ICE9IG51bGwpIG1ldGEuYXBwZW5kQ2hpbGQobWV0YUNoaXAoJ0NyZWRpdHMnLCBTdHJpbmcoY29zdCkpKTsKICAgIHZhciBkdCA9IGZtdERhdGUoX2ltYWdlLmNyZWF0ZWREYXRlKTsKICAgIGlmIChkdCkgbWV0YS5hcHBlbmRDaGlsZChtZXRhQ2hpcCgnQ3JlYXRlZCcsIGR0KSk7CiAgICBpZiAoX2ltYWdlLmZhdm9yaXRlZCkgbWV0YS5hcHBlbmRDaGlsZChtZXRhQ2hpcCgnJywgJ0Zhdm9yaXRlZCcsIEFDQ0VOVCkpOwogICAgaWYgKF9pbWFnZS5wdWJsaXNoZWQpIG1ldGEuYXBwZW5kQ2hpbGQobWV0YUNoaXAoJycsICdQdWJsaXNoZWQnLCBBQ0NFTlQpKTsKICAgIGlmIChtZXRhLmNoaWxkTm9kZXMubGVuZ3RoKSB7CiAgICAgIHBhbmVsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2dyb3VwJyB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2dyb3VwLWhlYWQgdi1leWVicm93JywgdGV4dDogJ0RldGFpbHMnIH0pLAogICAgICAgIG1ldGEKICAgICAgKSk7CiAgICB9CgogICAgcGFuZWwuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0dWRpb19fZ3JvdXAnIH0sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2dyb3VwLWhlYWQgdi1leWVicm93JywgdGV4dDogJ0FjdGlvbnMnIH0pLAogICAgICBidWlsZEFjdGlvbkJhcigpCiAgICApKTsKICAgIHJldHVybiBwYW5lbDsKICB9CgogIGZ1bmN0aW9uIHBhbmVsU3R5bGUoKSB7CiAgICByZXR1cm4gewogICAgICBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcxNHB4JywKICAgICAgd2lkdGg6ICdtaW4oMzgwcHgsIDkydncpJywgZmxleDogJzAgMCBhdXRvJywKICAgICAgbWF4SGVpZ2h0OiAnMTAwJScsIG92ZXJmbG93WTogJ2F1dG8nLCBvdmVyZmxvd1g6ICdoaWRkZW4nLAogICAgICBwYWRkaW5nOiAnMjBweCcsIGJvcmRlclJhZGl1czogJ3ZhcigtLXJhZGl1cy1wYW5lbCwgMjIuNXB4KScsCiAgICAgIFdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiAndG91Y2gnCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gbWV0YUNoaXAobGFiZWwsIHZhbHVlLCB0b25lKSB7CiAgICByZXR1cm4gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jaGlwJywgc3R5bGU6IHsKICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGdhcDogJzZweCcsCiAgICAgIHBhZGRpbmc6ICc2cHggMTJweCcsIGJvcmRlclJhZGl1czogJ3ZhcigtLXJhZGl1cy1waWxsLCA2M3B4KScsCiAgICAgIGJhY2tncm91bmQ6IHRvbmUgPyAnY29sb3ItbWl4KGluIHNyZ2IsICcgKyB0b25lICsgJyAxNiUsIHRyYW5zcGFyZW50KScgOiBDQVJEX0JHLAogICAgICBib3JkZXI6ICcxcHggc29saWQgJyArICh0b25lID8gJ2NvbG9yLW1peChpbiBzcmdiLCAnICsgdG9uZSArICcgNDUlLCB0cmFuc3BhcmVudCknIDogTElORSksCiAgICAgIGZvbnRTaXplOiAnMTJweCcsIHdoaXRlU3BhY2U6ICdub3dyYXAnCiAgICB9IH0sCiAgICAgIGxhYmVsID8gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tb25vJywgdGV4dDogbGFiZWwsIHN0eWxlOiB7IGNvbG9yOiBJTktfU09GVCwgdGV4dFRyYW5zZm9ybTogJ3VwcGVyY2FzZScsIGxldHRlclNwYWNpbmc6ICcwLjA4ZW0nLCBmb250U2l6ZTogJzEwcHgnIH0gfSkgOiBudWxsLAogICAgICBlbCgnc3BhbicsIHsgdGV4dDogdmFsdWUsIHN0eWxlOiB7IGNvbG9yOiB0b25lID8gdG9uZSA6IElOSywgZm9udFdlaWdodDogJzYwMCcgfSB9KQogICAgKTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkQWN0aW9uQmFyKCkgewogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19hY3Rpb25zLXdyYXAnLCBzdHlsZTogewogICAgICBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcxMHB4JwogICAgfSB9KTsKICAgIHZhciBvd24gPSBpc093bkltYWdlKF9pbWFnZSk7CgogICAgdmFyIHJldmFtcCA9IGVsKCdidXR0b24nLCB7CiAgICAgIGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnkgdi1jdGEtLWJsb2NrIHYtc3R1ZGlvX19yZXZhbXAnLCB0eXBlOiAnYnV0dG9uJywKICAgICAgdGl0bGU6ICdSZXZhbXAnLCAnYXJpYS1sYWJlbCc6ICdSZXZhbXAgdGhpcyBpbWFnZSBpbiBDcmVhdGUnCiAgICB9LCBpY29uKCdlZGl0JyksIGVsKCdzcGFuJywgeyB0ZXh0OiAnUmV2YW1wJyB9KSk7CiAgICByZXZhbXAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGFjdEVkaXQoKTsgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKHJldmFtcCk7CgogICAgdmFyIGJhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2FjdGlvbnMgZ2xhc3MtbmF2Jywgcm9sZTogJ3Rvb2xiYXInLCAnYXJpYS1sYWJlbCc6ICdJbWFnZSBhY3Rpb25zJywgc3R5bGU6IHsKICAgICAgZGlzcGxheTogJ2dyaWQnLCBncmlkVGVtcGxhdGVDb2x1bW5zOiAncmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoNjRweCwgMWZyKSknLCBnYXA6ICc2cHgnLAogICAgICBwYWRkaW5nOiAnMTBweCcsIGJvcmRlclJhZGl1czogJ3ZhcigtLXJhZGl1cy1wYW5lbCwgMjIuNXB4KScKICAgIH0gfSk7CgogICAgYmFyLmFwcGVuZENoaWxkKGdsYXNzQnRuKCd2YXJpYXRpb25zJywgJ1ZhcmlhdGlvbnMnLCBhY3RWYXJpYXRpb25zKSk7CiAgICBpZiAoIV9pbWFnZS52aWRlb1VSTCkgYmFyLmFwcGVuZENoaWxkKGdsYXNzQnRuKCdhbmltYXRlJywgJ0FuaW1hdGUnLCBhY3RBbmltYXRlKSk7CiAgICBiYXIuYXBwZW5kQ2hpbGQoZ2xhc3NCdG4oJ2Rvd25sb2FkJywgJ1NhdmUnLCBhY3REb3dubG9hZCkpOwogICAgaWYgKG93bikgewogICAgICBiYXIuYXBwZW5kQ2hpbGQoZ2xhc3NCdG4oX2ltYWdlLmZhdm9yaXRlZCA/ICdoZWFydC5maWxsJyA6ICdoZWFydCcsCiAgICAgICAgX2ltYWdlLmZhdm9yaXRlZCA/ICdGYXZvcml0ZWQnIDogJ0Zhdm9yaXRlJywgYWN0RmF2b3JpdGUsCiAgICAgICAgeyB0b2dnbGU6IHRydWUsIGFjdGl2ZTogISFfaW1hZ2UuZmF2b3JpdGVkIH0pKTsKICAgIH0KICAgIGJhci5hcHBlbmRDaGlsZChnbGFzc0J0bignc2hhcmUnLCAnU2hhcmUnLCBhY3RTaGFyZSkpOwogICAgaWYgKG93bikgewogICAgICBiYXIuYXBwZW5kQ2hpbGQoZ2xhc3NCdG4oJ3B1Ymxpc2gnLCBfaW1hZ2UucHVibGlzaGVkID8gJ1B1Ymxpc2hlZCcgOiAnUHVibGlzaCcsIGFjdFB1Ymxpc2gsIHsgYWN0aXZlOiAhIV9pbWFnZS5wdWJsaXNoZWQgfSkpOwogICAgfQogICAgaWYgKF9pbWFnZS5wcm9tcHQpIGJhci5hcHBlbmRDaGlsZChnbGFzc0J0bignYm9va21hcmsnLCAnUHJlc2V0JywgYWN0U2F2ZVByZXNldCkpOwogICAgaWYgKG93bikgYmFyLmFwcGVuZENoaWxkKGdsYXNzQnRuKCd0cmFzaCcsICdEZWxldGUnLCBhY3REZWxldGUsIHsgZGFuZ2VyOiB0cnVlIH0pKTsKICAgIHdyYXAuYXBwZW5kQ2hpbGQoYmFyKTsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gd2lyZVN3aXBlRGlzbWlzcyhub2RlKSB7CiAgICB2YXIgc3RhcnRZID0gMCwgc3RhcnRYID0gMCwgY3VyWSA9IDAsIGRyYWdnaW5nID0gZmFsc2UsIGxvY2tlZCA9IGZhbHNlOwogICAgdmFyIHRocmVzaG9sZCA9IDExMDsKICAgIGZ1bmN0aW9uIG9uU3RhcnQoZSkgewogICAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlcy5sZW5ndGggPiAxKSByZXR1cm47CiAgICAgIHZhciB0ID0gZS50YXJnZXQ7CiAgICAgIHdoaWxlICh0ICYmIHQgIT09IG5vZGUpIHsKICAgICAgICBpZiAodC5jbGFzc0xpc3QgJiYgKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCd2c2NydWInKSB8fCB0LmNsYXNzTGlzdC5jb250YWlucygndmNhcmQnKSB8fAogICAgICAgICAgdC5jbGFzc0xpc3QuY29udGFpbnMoJ3Ytc3R1ZGlvX19hY3Rpb25zJykgfHwgdC5jbGFzc0xpc3QuY29udGFpbnMoJ3Ytc3R1ZGlvX19wYW5lbCcpIHx8CiAgICAgICAgICB0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8IHQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fCB0LnRhZ05hbWUgPT09ICdJTlBVVCcpKSByZXR1cm47CiAgICAgICAgdCA9IHQucGFyZW50Tm9kZTsKICAgICAgfQogICAgICBzdGFydFkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WTsgc3RhcnRYID0gZS50b3VjaGVzWzBdLmNsaWVudFg7CiAgICAgIGN1clkgPSBzdGFydFk7IGRyYWdnaW5nID0gdHJ1ZTsgbG9ja2VkID0gZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiBvbk1vdmUoZSkgewogICAgICBpZiAoIWRyYWdnaW5nKSByZXR1cm47CiAgICAgIHZhciB5ID0gZS50b3VjaGVzWzBdLmNsaWVudFksIHggPSBlLnRvdWNoZXNbMF0uY2xpZW50WDsKICAgICAgdmFyIGR5ID0geSAtIHN0YXJ0WSwgZHggPSB4IC0gc3RhcnRYOwogICAgICBpZiAoIWxvY2tlZCkgewogICAgICAgIGlmIChNYXRoLmFicyhkeCkgPiBNYXRoLmFicyhkeSkpIHsgZHJhZ2dpbmcgPSBmYWxzZTsgcmV0dXJuOyB9CiAgICAgICAgbG9ja2VkID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoZHkgPCAwKSBkeSA9IGR5ICogMC4yNTsKICAgICAgY3VyWSA9IHN0YXJ0WSArIGR5OwogICAgICB2YXIgb3AgPSBNYXRoLm1heCgwLjI1LCAxIC0gTWF0aC5hYnMoZHkpIC8gNTAwKTsKICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWSgnICsgZHkgKyAncHgpJzsKICAgICAgbm9kZS5zdHlsZS5vcGFjaXR5ID0gU3RyaW5nKG9wKTsKICAgICAgaWYgKGUuY2FuY2VsYWJsZSkgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgfQogICAgZnVuY3Rpb24gb25FbmQoKSB7CiAgICAgIGlmICghZHJhZ2dpbmcpIHJldHVybjsKICAgICAgZHJhZ2dpbmcgPSBmYWxzZTsKICAgICAgdmFyIGR5ID0gY3VyWSAtIHN0YXJ0WTsKICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSAnJzsKICAgICAgbm9kZS5zdHlsZS5vcGFjaXR5ID0gJyc7CiAgICAgIGlmIChkeSA+IHRocmVzaG9sZCkgY2xvc2UoKTsKICAgIH0KICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uU3RhcnQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Nb3ZlLCB7IHBhc3NpdmU6IGZhbHNlIH0pOwogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uRW5kLCB7IHBhc3NpdmU6IHRydWUgfSk7CiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgb25FbmQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKICB9CgogIGZ1bmN0aW9uIHdpcmVEcm9wUGFzdGUoc3RhZ2VFbCkgewogICAgc3RhZ2VFbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChlLmRhdGFUcmFuc2ZlciAmJiBBcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKGUuZGF0YVRyYW5zZmVyLml0ZW1zIHx8IFtdLCBmdW5jdGlvbiAoaXQpIHsgcmV0dXJuIGl0LmtpbmQgPT09ICdmaWxlJzsgfSkpIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgc3RhZ2VFbC5zdHlsZS5vdXRsaW5lID0gJzJweCBkYXNoZWQgJyArIEFDQ0VOVDsKICAgICAgICBzdGFnZUVsLnN0eWxlLm91dGxpbmVPZmZzZXQgPSAnLThweCc7CiAgICAgIH0KICAgIH0pOwogICAgc3RhZ2VFbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCBmdW5jdGlvbiAoKSB7IHN0YWdlRWwuc3R5bGUub3V0bGluZSA9ICcnOyB9KTsKICAgIHN0YWdlRWwuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgIHN0YWdlRWwuc3R5bGUub3V0bGluZSA9ICcnOwogICAgICB2YXIgZmlsZXMgPSBlLmRhdGFUcmFuc2ZlciAmJiBlLmRhdGFUcmFuc2Zlci5maWxlczsKICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IHN0YXJ0UmV2YW1wRnJvbUZpbGUoZmlsZXNbMF0pOyB9CiAgICB9KTsKICAgIF9wYXN0ZUhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoX2Rpc3Bvc2VkKSByZXR1cm47CiAgICAgIHZhciBpdGVtcyA9IChlLmNsaXBib2FyZERhdGEgJiYgZS5jbGlwYm9hcmREYXRhLml0ZW1zKSB8fCBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChpdGVtc1tpXS50eXBlICYmIGl0ZW1zW2ldLnR5cGUuaW5kZXhPZignaW1hZ2UnKSA9PT0gMCkgewogICAgICAgICAgdmFyIGZpbGUgPSBpdGVtc1tpXS5nZXRBc0ZpbGUoKTsKICAgICAgICAgIGlmIChmaWxlKSB7IHN0YXJ0UmV2YW1wRnJvbUZpbGUoZmlsZSk7IGJyZWFrOyB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBfcGFzdGVIYW5kbGVyKTsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0UmV2YW1wRnJvbUZpbGUoZmlsZSkgewogICAgaWYgKCFmaWxlKSByZXR1cm47CiAgICB0b2FzdCgnT3BlbmluZyBDcmVhdGUgd2l0aCB5b3VyIGltYWdl4oCmJywgJ2luZm8nKTsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIGlmIChhcGkgJiYgdHlwZW9mIGFwaS51cGxvYWRJbWFnZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBQcm9taXNlLnJlc29sdmUoYXBpLnVwbG9hZEltYWdlKGZpbGUsICdyZW5kZXInKSkudGhlbihmdW5jdGlvbiAodXJsKSB7CiAgICAgICAgdmFyIHBhcmFtcyA9IFsnaW1hZ2U9JyArIGVuY29kZVVSSUNvbXBvbmVudCh1cmwpXTsKICAgICAgICBpZiAoX2ltYWdlICYmIF9pbWFnZS5tb2RlbCkgcGFyYW1zLnB1c2goJ21vZGVsPScgKyBlbmNvZGVVUklDb21wb25lbnQoX2ltYWdlLm1vZGVsKSk7CiAgICAgICAgZ28oJyMvY3JlYXRlPycgKyBwYXJhbXMuam9pbignJicpKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgeyBnbygnIy9jcmVhdGUnKTsgfSk7CiAgICB9IGVsc2UgeyBnbygnIy9jcmVhdGUnKTsgfQogIH0KCiAgZnVuY3Rpb24gY2xvc2UoKSB7IGJhY2soKTsgfQoKICBmdW5jdGlvbiBiYWNrKCkgewogICAgdmFyIHByZXYgPSBTVCgpLnByZXZpb3VzUm91dGU7CiAgICBpZiAocHJldiAmJiBwcmV2LmluZGV4T2YoJ2ltYWdlJykgPT09IC0xKSB7IGdvKHByZXYuY2hhckF0KDApID09PSAnIycgPyBwcmV2IDogJyMvJyArIHByZXYpOyByZXR1cm47IH0KICAgIGdvKCcjL2xpYnJhcnknKTsKICB9CgogIGZ1bmN0aW9uIHdpcmVLZXlzKCkgewogICAgX2tleUhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoX2Rpc3Bvc2VkKSByZXR1cm47CiAgICAgIHZhciB0ID0gZS50YXJnZXQ7CiAgICAgIHZhciB0eXBpbmcgPSB0ICYmICh0LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgdC50YWdOYW1lID09PSAnVEVYVEFSRUEnIHx8IHQuaXNDb250ZW50RWRpdGFibGUpOwogICAgICBpZiAodHlwaW5nICYmIGUua2V5ICE9PSAnRXNjYXBlJykgcmV0dXJuOwogICAgICBzd2l0Y2ggKGUua2V5KSB7CiAgICAgICAgY2FzZSAnRXNjYXBlJzogZS5wcmV2ZW50RGVmYXVsdCgpOyBjbG9zZSgpOyBicmVhazsKICAgICAgICBjYXNlICdBcnJvd0xlZnQnOiBlLnByZXZlbnREZWZhdWx0KCk7IG5hdmlnYXRlKC0xKTsgYnJlYWs7CiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6IGUucHJldmVudERlZmF1bHQoKTsgbmF2aWdhdGUoMSk7IGJyZWFrOwogICAgICAgIGNhc2UgJ2UnOiBjYXNlICdFJzogaWYgKCFlLm1ldGFLZXkgJiYgIWUuY3RybEtleSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGFjdEVkaXQoKTsgfSBicmVhazsKICAgICAgICBjYXNlICdmJzogY2FzZSAnRic6CiAgICAgICAgICBpZiAoIWUubWV0YUtleSAmJiAhZS5jdHJsS2V5ICYmIGlzT3duSW1hZ2UoX2ltYWdlKSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGFjdEZhdm9yaXRlKF9ub2RlICYmIF9ub2RlLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uW2FyaWEtcHJlc3NlZF0nKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OiBicmVhazsKICAgICAgfQogICAgICBpZiAoKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpICYmIChlLmtleSA9PT0gJ3MnIHx8IGUua2V5ID09PSAnUycpKSB7IGUucHJldmVudERlZmF1bHQoKTsgYWN0RG93bmxvYWQoKTsgfQogICAgfTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfa2V5SGFuZGxlcik7CiAgfQoKICBmdW5jdGlvbiBidWlsZENocm9tZSgpIHsKICAgIHZhciBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogICAgdmFyIGNsb3NlQnRuID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6ICdnbGFzcy1idXR0b24gdi1zdHVkaW9fX2Nsb3NlJywgdHlwZTogJ2J1dHRvbicsIHRpdGxlOiAnQ2xvc2UnLCAnYXJpYS1sYWJlbCc6ICdDbG9zZScsCiAgICAgIHN0eWxlOiBjaHJvbWVCdG5TdHlsZSh7IHRvcDogJ2NhbGMoZW52KHNhZmUtYXJlYS1pbnNldC10b3AsIDBweCkgKyAxNnB4KScsIHJpZ2h0OiAnMTZweCcgfSkKICAgIH0pOwogICAgY2xvc2VCdG4uYXBwZW5kQ2hpbGQoaWNvbignY2xvc2UnKSk7CiAgICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgY2xvc2UoKTsgfSk7CiAgICBmcmFnLmFwcGVuZENoaWxkKGNsb3NlQnRuKTsKCiAgICBpZiAoX3NpYmxpbmdzLmxlbmd0aCA+IDEpIHsKICAgICAgdmFyIHByZXYgPSBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAnZ2xhc3MtYnV0dG9uIHYtc3R1ZGlvX19uYXYnLCB0eXBlOiAnYnV0dG9uJywgdGl0bGU6ICdQcmV2aW91cycsICdhcmlhLWxhYmVsJzogJ1ByZXZpb3VzIGltYWdlJywKICAgICAgICBkaXNhYmxlZDogX2luZGV4IDw9IDAsIHN0eWxlOiBjaHJvbWVCdG5TdHlsZSh7IHRvcDogJzUwJScsIGxlZnQ6ICcxNnB4JywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtNTAlKScgfSkKICAgICAgfSk7CiAgICAgIHByZXYuYXBwZW5kQ2hpbGQoaWNvbignYXJyb3dMZWZ0JykpOwogICAgICBwcmV2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBuYXZpZ2F0ZSgtMSk7IH0pOwoKICAgICAgdmFyIG5leHQgPSBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAnZ2xhc3MtYnV0dG9uIHYtc3R1ZGlvX19uYXYnLCB0eXBlOiAnYnV0dG9uJywgdGl0bGU6ICdOZXh0JywgJ2FyaWEtbGFiZWwnOiAnTmV4dCBpbWFnZScsCiAgICAgICAgZGlzYWJsZWQ6IF9pbmRleCA+PSBfc2libGluZ3MubGVuZ3RoIC0gMSwgc3R5bGU6IGNocm9tZUJ0blN0eWxlKHsgdG9wOiAnNTAlJywgcmlnaHQ6ICcxNnB4JywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtNTAlKScgfSkKICAgICAgfSk7CiAgICAgIG5leHQuYXBwZW5kQ2hpbGQoaWNvbignYXJyb3dSaWdodCcpKTsKICAgICAgbmV4dC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgbmF2aWdhdGUoMSk7IH0pOwoKICAgICAgdmFyIGNvdW50ZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19jb3VudGVyIHYtbW9ubycsICdhcmlhLWhpZGRlbic6ICd0cnVlJywKICAgICAgICB0ZXh0OiAoX2luZGV4ICsgMSkgKyAnIC8gJyArIF9zaWJsaW5ncy5sZW5ndGgsIHN0eWxlOiB7CiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJywgdG9wOiAnY2FsYyhlbnYoc2FmZS1hcmVhLWluc2V0LXRvcCwgMHB4KSArIDIycHgpJywgbGVmdDogJzUwJScsCiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC01MCUpJywgcGFkZGluZzogJzVweCAxMnB4JywgYm9yZGVyUmFkaXVzOiAndmFyKC0tcmFkaXVzLXBpbGwsIDYzcHgpJywKICAgICAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsMCwwLC40NSknLCBjb2xvcjogSU5LX1NPRlQsIGZvbnRTaXplOiAnMTJweCcsIHpJbmRleDogJzYnCiAgICAgICAgfSB9KTsKICAgICAgZnJhZy5hcHBlbmRDaGlsZChwcmV2KTsgZnJhZy5hcHBlbmRDaGlsZChuZXh0KTsgZnJhZy5hcHBlbmRDaGlsZChjb3VudGVyKTsKICAgIH0KICAgIHJldHVybiBmcmFnOwogIH0KCiAgZnVuY3Rpb24gY2hyb21lQnRuU3R5bGUocG9zKSB7CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7CiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB6SW5kZXg6ICc2Jywgd2lkdGg6ICc0NHB4JywgaGVpZ2h0OiAnNDRweCcsCiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsCiAgICAgIGJvcmRlclJhZGl1czogJzUwJScsIGNvbG9yOiBJTkssIGN1cnNvcjogJ3BvaW50ZXInCiAgICB9LCBwb3MgfHwge30pOwogIH0KCiAgZnVuY3Rpb24gcm9vdFN0eWxlKCkgewogICAgcmV0dXJuIHsKICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsIHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnLAogICAgICBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdzdHJldGNoJywganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLAogICAgICBnYXA6ICcyMHB4JywgcGFkZGluZzogJ2NhbGMoZW52KHNhZmUtYXJlYS1pbnNldC10b3AsIDBweCkgKyA2NHB4KSAyMHB4IGNhbGMoZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20sIDBweCkgKyAyMHB4KScsCiAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLCBvdXRsaW5lOiAnbm9uZScKICAgIH07CiAgfQoKICBmdW5jdGlvbiBhcHBseVJlc3BvbnNpdmVMYXlvdXQobm9kZSwgbWVkaWEsIHBhbmVsKSB7CiAgICBpZiAoIW5vZGUgfHwgIW1lZGlhIHx8ICFwYW5lbCkgcmV0dXJuOwogICAgdmFyIG5hcnJvdyA9ICh3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggfHwgMCkgPCA4ODA7CiAgICBpZiAobmFycm93KSB7CiAgICAgIG5vZGUuc3R5bGUuZmxleERpcmVjdGlvbiA9ICdjb2x1bW4nOwogICAgICBub2RlLnN0eWxlLmFsaWduSXRlbXMgPSAnc3RyZXRjaCc7CiAgICAgIG5vZGUuc3R5bGUucGFkZGluZyA9ICdjYWxjKGVudihzYWZlLWFyZWEtaW5zZXQtdG9wLCAwcHgpICsgNjBweCkgMTRweCBjYWxjKGVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tLCAwcHgpICsgMTRweCknOwogICAgICBtZWRpYS5zdHlsZS5mbGV4ID0gJzEgMSBhdXRvJzsKICAgICAgcGFuZWwuc3R5bGUud2lkdGggPSAnMTAwJSc7CiAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9ICc0NXZoJzsKICAgICAgcGFuZWwuc3R5bGUuZmxleCA9ICcwIDAgYXV0byc7CiAgICB9IGVsc2UgewogICAgICBub2RlLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAncm93JzsKICAgICAgbm9kZS5zdHlsZS5hbGlnbkl0ZW1zID0gJ3N0cmV0Y2gnOwogICAgICBtZWRpYS5zdHlsZS5mbGV4ID0gJzEgMSBhdXRvJzsKICAgICAgcGFuZWwuc3R5bGUud2lkdGggPSAnbWluKDM4MHB4LCA5MnZ3KSc7CiAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9ICcxMDAlJzsKICAgICAgcGFuZWwuc3R5bGUuZmxleCA9ICcwIDAgYXV0byc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtb3VudFNrZWxldG9uKHJvb3QpIHsKICAgIHZhciB1aSA9IFVJKCk7CiAgICB2YXIgbm9kZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW8gdi1zdHVkaW8tLWxvYWRpbmcnLCByb2xlOiAnZGlhbG9nJywgJ2FyaWEtbW9kYWwnOiAndHJ1ZScsICdhcmlhLWxhYmVsJzogJ0xvYWRpbmcgaW1hZ2UnLCBzdHlsZTogcm9vdFN0eWxlKCkgfSk7CiAgICB2YXIgbWVkaWEgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19tZWRpYScsIHN0eWxlOiB7IGZsZXg6ICcxIDEgYXV0bycsIGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJywgbWluSGVpZ2h0OiAnMCcsIG1pbldpZHRoOiAnMCcgfSB9KTsKICAgIHZhciBza2VsID0gKHVpICYmIHR5cGVvZiB1aS5za2VsZXRvbiA9PT0gJ2Z1bmN0aW9uJykgPyB1aS5za2VsZXRvbignc3F1YXJlJykgOiBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24nLCBzdHlsZTogeyB3aWR0aDogJzYwdmgnLCBtYXhXaWR0aDogJzkwJScsIGFzcGVjdFJhdGlvOiAnMSAvIDEnIH0gfSk7CiAgICBpZiAoc2tlbCkgbWVkaWEuYXBwZW5kQ2hpbGQoc2tlbCk7CiAgICB2YXIgcGFuZWwgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19wYW5lbCBnbGFzcy1jYXJkJywgc3R5bGU6IHBhbmVsU3R5bGUoKSB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24nLCBzdHlsZTogeyBoZWlnaHQ6ICc2NHB4Jywgd2lkdGg6ICcxMDAlJyB9IH0pLAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24nLCBzdHlsZTogeyBoZWlnaHQ6ICcyOHB4Jywgd2lkdGg6ICc3MCUnIH0gfSksCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbicsIHN0eWxlOiB7IGhlaWdodDogJzg4cHgnLCB3aWR0aDogJzEwMCUnIH0gfSkKICAgICk7CiAgICB2YXIgY2xvc2VCdG4gPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ2dsYXNzLWJ1dHRvbiB2LXN0dWRpb19fY2xvc2UnLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiAnQ2xvc2UnLCBzdHlsZTogY2hyb21lQnRuU3R5bGUoeyB0b3A6ICdjYWxjKGVudihzYWZlLWFyZWEtaW5zZXQtdG9wLCAwcHgpICsgMTZweCknLCByaWdodDogJzE2cHgnIH0pIH0pOwogICAgY2xvc2VCdG4uYXBwZW5kQ2hpbGQoaWNvbignY2xvc2UnKSk7CiAgICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgY2xvc2UoKTsgfSk7CiAgICBub2RlLmFwcGVuZENoaWxkKGNsb3NlQnRuKTsKICAgIG5vZGUuYXBwZW5kQ2hpbGQobWVkaWEpOwogICAgbm9kZS5hcHBlbmRDaGlsZChwYW5lbCk7CiAgICBhcHBseVJlc3BvbnNpdmVMYXlvdXQobm9kZSwgbWVkaWEsIHBhbmVsKTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICBfbm9kZSA9IG5vZGU7CiAgfQoKICBmdW5jdGlvbiBtb3VudE5vdEZvdW5kKHJvb3QpIHsKICAgIHZhciB1aSA9IFVJKCk7CiAgICB2YXIgbm9kZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW8gdi1zdHVkaW8tLWVtcHR5Jywgcm9sZTogJ2RpYWxvZycsICdhcmlhLW1vZGFsJzogJ3RydWUnLCBzdHlsZTogT2JqZWN0LmFzc2lnbihyb290U3R5bGUoKSwgeyBhbGlnbkl0ZW1zOiAnY2VudGVyJyB9KSB9KTsKICAgIHZhciBjbG9zZUJ0biA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAnZ2xhc3MtYnV0dG9uIHYtc3R1ZGlvX19jbG9zZScsIHR5cGU6ICdidXR0b24nLCAnYXJpYS1sYWJlbCc6ICdDbG9zZScsIHN0eWxlOiBjaHJvbWVCdG5TdHlsZSh7IHRvcDogJ2NhbGMoZW52KHNhZmUtYXJlYS1pbnNldC10b3AsIDBweCkgKyAxNnB4KScsIHJpZ2h0OiAnMTZweCcgfSkgfSk7CiAgICBjbG9zZUJ0bi5hcHBlbmRDaGlsZChpY29uKCdjbG9zZScpKTsKICAgIGNsb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBjbG9zZSgpOyB9KTsKICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2xvc2VCdG4pOwogICAgdmFyIGNvbnRlbnQ7CiAgICBpZiAodWkgJiYgdHlwZW9mIHVpLmVtcHR5ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIGNvbnRlbnQgPSB1aS5lbXB0eSgnV2UgY291bGRu4oCZdCBmaW5kIHRoYXQgaW1hZ2UuJywgJ0JhY2sgdG8gTGlicmFyeScsIGZ1bmN0aW9uICgpIHsgZ28oJyMvbGlicmFyeScpOyB9KTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnRlbnQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHknLCBzdHlsZTogeyBtYXJnaW46ICdhdXRvJywgdGV4dEFsaWduOiAnY2VudGVyJyB9IH0sCiAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fbXNnJywgdGV4dDogJ1dlIGNvdWxkbuKAmXQgZmluZCB0aGF0IGltYWdlLicgfSksCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3QnLCB0eXBlOiAnYnV0dG9uJywgb25jbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9saWJyYXJ5Jyk7IH0gfSwgJ0JhY2sgdG8gTGlicmFyeScpCiAgICAgICk7CiAgICB9CiAgICBub2RlLmFwcGVuZENoaWxkKGNvbnRlbnQpOwogICAgcm9vdC5hcHBlbmRDaGlsZChub2RlKTsKICAgIF9ub2RlID0gbm9kZTsKICB9CgogIGZ1bmN0aW9uIG1vdW50U3R1ZGlvKHJvb3QpIHsKICAgIF9zaWJsaW5ncyA9IGJ1aWxkU2libGluZ3MoX2ltYWdlKTsKICAgIHZhciBpZCA9IGltYWdlSUQoX2ltYWdlKTsKICAgIF9pbmRleCA9IF9zaWJsaW5ncy5maW5kSW5kZXggPyBfc2libGluZ3MuZmluZEluZGV4KGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWFnZUlEKHgpID09PSBpZDsgfSkgOiBpbmRleE9mKF9zaWJsaW5ncywgaWQpOwoKICAgIHZhciBub2RlID0gZWwoJ2RpdicsIHsKICAgICAgY2xhc3M6ICd2LXN0dWRpbycsIHJvbGU6ICdkaWFsb2cnLCAnYXJpYS1tb2RhbCc6ICd0cnVlJywKICAgICAgJ2FyaWEtbGFiZWwnOiBfaW1hZ2UucHJvbXB0ID8gKCdJbWFnZTogJyArIF9pbWFnZS5wcm9tcHQuc2xpY2UoMCwgNjApKSA6ICdJbWFnZSBkZXRhaWwnLAogICAgICB0YWJpbmRleDogJy0xJywgc3R5bGU6IHJvb3RTdHlsZSgpCiAgICB9KTsKCiAgICB2YXIgbWVkaWEgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19tZWRpYScsIHN0eWxlOiB7IGZsZXg6ICcxIDEgYXV0bycsIGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJywgbWluSGVpZ2h0OiAnMCcsIG1pbldpZHRoOiAnMCcgfSB9KTsKICAgIHZhciBzdGFnZUVsID0gYnVpbGRNZWRpYSgpOwogICAgbWVkaWEuYXBwZW5kQ2hpbGQoc3RhZ2VFbCk7CgogICAgdmFyIHBhbmVsID0gYnVpbGRQYW5lbCgpOwoKICAgIG5vZGUuYXBwZW5kQ2hpbGQoYnVpbGRDaHJvbWUoKSk7CiAgICBub2RlLmFwcGVuZENoaWxkKG1lZGlhKTsKICAgIG5vZGUuYXBwZW5kQ2hpbGQocGFuZWwpOwoKICAgIGFwcGx5UmVzcG9uc2l2ZUxheW91dChub2RlLCBtZWRpYSwgcGFuZWwpOwoKICAgIHJvb3QuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICBfbm9kZSA9IG5vZGU7CgogICAgd2lyZUtleXMoKTsKICAgIHdpcmVTd2lwZURpc21pc3Mobm9kZSk7CiAgICB3aXJlRHJvcFBhc3RlKHN0YWdlRWwpOwogICAgX3Jlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7IGlmICghX2Rpc3Bvc2VkICYmIF9ub2RlKSBhcHBseVJlc3BvbnNpdmVMYXlvdXQoX25vZGUsIF9ub2RlLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fbWVkaWEnKSwgX25vZGUucXVlcnlTZWxlY3RvcignLnYtc3R1ZGlvX19wYW5lbCcpKTsgfTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBfcmVzaXplSGFuZGxlcik7CgogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHRyeSB7IG5vZGUuZm9jdXMoKTsgfSBjYXRjaCAoZSkge30gfSwgMjApOwogIH0KCiAgZnVuY3Rpb24gaW5kZXhPZihhcnIsIGlkKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBpZiAoaW1hZ2VJRChhcnJbaV0pID09PSBpZCkgcmV0dXJuIGk7IH0KICAgIHJldHVybiAtMTsKICB9CgogIFYudmlld3Muc3R1ZGlvID0gewogICAgcmVuZGVyOiBmdW5jdGlvbiAocm9vdCwgcGFyYW1zKSB7CiAgICAgIHRoaXMudGVhcmRvd24oKTsKICAgICAgX2Rpc3Bvc2VkID0gZmFsc2U7CiAgICAgIF9yb290ID0gcm9vdDsKICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgICB2YXIgaWQgPSBwYXJhbXMuaWQgfHwgcGFyYW1zLmltYWdlSUQgfHwgcGFyYW1zLmltYWdlSWQgfHwgcGFyYW1zLmltYWdlIHx8IG51bGw7CiAgICAgIGlmIChpZCkgaWQgPSBTdHJpbmcoaWQpOwoKICAgICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgICAgX25vZGUgPSBudWxsOwoKICAgICAgaWYgKCFpZCkgeyBtb3VudE5vdEZvdW5kKHJvb3QpOyByZXR1cm47IH0KCiAgICAgIHZhciBsb2NhbCA9IGZpbmRJblN0YXRlKGlkKTsKICAgICAgaWYgKGxvY2FsKSB7IF9pbWFnZSA9IGxvY2FsOyBtb3VudFN0dWRpbyhyb290KTsgcmV0dXJuOyB9CgogICAgICBtb3VudFNrZWxldG9uKHJvb3QpOwogICAgICByZXNvbHZlSW1hZ2UoaWQpLnRoZW4oZnVuY3Rpb24gKGltZykgewogICAgICAgIGlmIChfZGlzcG9zZWQpIHJldHVybjsKICAgICAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgICAgIF9ub2RlID0gbnVsbDsKICAgICAgICBpZiAoIWltZykgeyBtb3VudE5vdEZvdW5kKHJvb3QpOyByZXR1cm47IH0KICAgICAgICBfaW1hZ2UgPSBpbWc7CiAgICAgICAgbW91bnRTdHVkaW8ocm9vdCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoX2Rpc3Bvc2VkKSByZXR1cm47CiAgICAgICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgICAgICBfbm9kZSA9IG51bGw7CiAgICAgICAgbW91bnROb3RGb3VuZChyb290KTsKICAgICAgfSk7CiAgICB9LAoKICAgIHRlYXJkb3duOiBmdW5jdGlvbiAoKSB7CiAgICAgIF9kaXNwb3NlZCA9IHRydWU7CiAgICAgIGlmIChfa2V5SGFuZGxlcikgeyBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2tleUhhbmRsZXIpOyBfa2V5SGFuZGxlciA9IG51bGw7IH0KICAgICAgaWYgKF9wYXN0ZUhhbmRsZXIpIHsgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBfcGFzdGVIYW5kbGVyKTsgX3Bhc3RlSGFuZGxlciA9IG51bGw7IH0KICAgICAgaWYgKF9yZXNpemVIYW5kbGVyKSB7IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBfcmVzaXplSGFuZGxlcik7IF9yZXNpemVIYW5kbGVyID0gbnVsbDsgfQogICAgICBpZiAoX3BvbGxBYm9ydCkgeyB0cnkgeyBfcG9sbEFib3J0LmFib3J0KCk7IH0gY2F0Y2ggKGUpIHt9IF9wb2xsQWJvcnQgPSBudWxsOyB9CiAgICAgIGRlc3Ryb3lTY3J1YigpOwogICAgICBfbm9kZSA9IG51bGw7CiAgICAgIF9pbWFnZSA9IG51bGw7CiAgICAgIF9zaWJsaW5ncyA9IFtdOwogICAgICBfaW5kZXggPSAtMTsKICAgIH0KICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9wcm9maWxlLmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9IHdpbmRvdy5WID0gd2luZG93LlYgfHwge307CiAgVi52aWV3cyA9IFYudmlld3MgfHwge307CgogIGZ1bmN0aW9uIGVsKHRhZywgYXR0cnMpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBWLnVpLmVsLmFwcGx5KFYudWksIGFyZ3VtZW50cyk7CiAgICB9CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIHZhciBjaGlsZHJlbiA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICBpZiAobm9kZSAmJiBhdHRycykgewogICAgICBmb3IgKHZhciBrIGluIGF0dHJzKSB7CiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cnMsIGspKSBjb250aW51ZTsKICAgICAgICB2YXIgdmFsID0gYXR0cnNba107CiAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gZmFsc2UpIGNvbnRpbnVlOwogICAgICAgIGlmIChrID09PSAnY2xhc3MnIHx8IGsgPT09ICdjbGFzc05hbWUnKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAndGV4dCcpIG5vZGUudGV4dENvbnRlbnQgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ2h0bWwnKSBub2RlLmlubmVySFRNTCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAnc3R5bGUnICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICBmb3IgKHZhciBzayBpbiB2YWwpIG5vZGUuc3R5bGVbc2tdID0gdmFsW3NrXTsKICAgICAgICB9IGVsc2UgaWYgKGsuaW5kZXhPZignb24nKSA9PT0gMCAmJiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCB2YWwpOwogICAgICAgIH0gZWxzZSBpZiAoayA9PT0gJ3ZhbHVlJyB8fCBrID09PSAnY2hlY2tlZCcgfHwgayA9PT0gJ2Rpc2FibGVkJyB8fCBrID09PSAnc2VsZWN0ZWQnKSB7CiAgICAgICAgICBub2RlW2tdID0gdmFsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShrLCB2YWwpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXBwZW5kQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW4pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiBhcHBlbmRDaGlsZHJlbihub2RlLCBjaGlsZHJlbikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldOwogICAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlIHx8IGMgPT09IHRydWUpIGNvbnRpbnVlOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgeyBhcHBlbmRDaGlsZHJlbihub2RlLCBjKTsgY29udGludWU7IH0KICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0eXBlb2YgYyA9PT0gJ29iamVjdCcgJiYgYy5ub2RlVHlwZSA/IGMgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gaWNvbihuYW1lKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5pY29uID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciBvdXQgPSBWLnVpLmljb24obmFtZSk7CiAgICAgIGlmIChvdXQgJiYgb3V0Lm5vZGVUeXBlKSByZXR1cm4gb3V0OwogICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgc3Bhbi5jbGFzc05hbWUgPSAndi1pY28nOwogICAgICBzcGFuLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgICBzcGFuLmlubmVySFRNTCA9IG91dCB8fCAnJzsKICAgICAgcmV0dXJuIHNwYW47CiAgICB9CiAgICB2YXIgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgIHMuY2xhc3NOYW1lID0gJ3YtaWNvJzsKICAgIHMuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICBzLnRleHRDb250ZW50ID0gJyc7CiAgICByZXR1cm4gczsKICB9CgogIGZ1bmN0aW9uIHRvYXN0KG1zZywga2luZCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkudG9hc3QgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnVpLnRvYXN0KG1zZywga2luZCk7CiAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5lbWl0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi5zdG9yZS5lbWl0KCd0b2FzdCcsIHsgbWVzc2FnZTogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsKICB9CgogIGZ1bmN0aW9uIGNvbmZpcm1EaWFsb2cobXNnKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jb25maXJtID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciByID0gVi51aS5jb25maXJtKG1zZyk7CiAgICAgIHJldHVybiAociAmJiB0eXBlb2Ygci50aGVuID09PSAnZnVuY3Rpb24nKSA/IHIgOiBQcm9taXNlLnJlc29sdmUoISFyKTsKICAgIH0KICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0obXNnKSk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICBpZiAoVi5yb3V0ZXIgJiYgdHlwZW9mIFYucm91dGVyLmdvID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi5yb3V0ZXIuZ28oaGFzaCk7CiAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiBjbG9zZURyYXdlcigpIHsKICAgIHRyeSB7CiAgICAgIGlmIChWLnJvdXRlciAmJiB0eXBlb2YgVi5yb3V0ZXIuY2xvc2VEcmF3ZXIgPT09ICdmdW5jdGlvbicpIHsgVi5yb3V0ZXIuY2xvc2VEcmF3ZXIoKTsgcmV0dXJuOyB9CiAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmNsb3NlRHJhd2VyID09PSAnZnVuY3Rpb24nKSB7IFYudWkuY2xvc2VEcmF3ZXIoKTsgcmV0dXJuOyB9CiAgICAgIGlmIChWLmFwcCAmJiB0eXBlb2YgVi5hcHAuY2xvc2VEcmF3ZXIgPT09ICdmdW5jdGlvbicpIHsgVi5hcHAuY2xvc2VEcmF3ZXIoKTsgcmV0dXJuOyB9CiAgICAgIGlmICh0eXBlb2YgVi5jbG9zZURyYXdlciA9PT0gJ2Z1bmN0aW9uJykgeyBWLmNsb3NlRHJhd2VyKCk7IHJldHVybjsgfQogICAgfSBjYXRjaCAoZSkge30KICAgIHRyeSB7IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd2LWRyYXdlci1vcGVuJyk7IH0gY2F0Y2ggKGUpIHt9CiAgICB2YXIgZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2LWFjY291bnQtZHJhd2VyJyk7CiAgICB2YXIgc2NyaW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudi1zY3JpbScpOwogICAgaWYgKGQpIHsgZC5jbGFzc0xpc3QucmVtb3ZlKCd2LWRyYXdlci0taW4nKTsgZC5oaWRkZW4gPSB0cnVlOyB9CiAgICBpZiAoc2NyaW0pIHsgc2NyaW0uY2xhc3NMaXN0LnJlbW92ZSgndi1zY3JpbS0taW4nKTsgc2NyaW0uaGlkZGVuID0gdHJ1ZTsgfQogIH0KCiAgZnVuY3Rpb24gbmF2aWdhdGUoaGFzaCkgewogICAgY2xvc2VEcmF3ZXIoKTsKICAgIGdvKGhhc2gpOwogIH0KCiAgZnVuY3Rpb24gc2dldChrZXksIGZhbGxiYWNrKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5nZXQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICB2YXIgdiA9IFYuc3RvcmUuZ2V0KGtleSk7CiAgICAgICAgcmV0dXJuIHYgPT0gbnVsbCA/IGZhbGxiYWNrIDogdjsKICAgICAgfQogICAgfSBjYXRjaCAoZSkge30KICAgIHJldHVybiBmYWxsYmFjazsKICB9CiAgZnVuY3Rpb24gc3NldChrZXksIHZhbHVlKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5zZXQgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuc2V0KGtleSwgdmFsdWUpOwogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5zYXZlID09PSAnZnVuY3Rpb24nKSBWLnN0b3JlLnNhdmUoKTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiBzZXR0aW5ncygpIHsKICAgIHZhciBzID0gc2dldCgnc2V0dGluZ3MnLCBudWxsKTsKICAgIGlmICghcyB8fCB0eXBlb2YgcyAhPT0gJ29iamVjdCcpIHsKICAgICAgcyA9IHt9OwogICAgICB0cnkgeyBpZiAoVi5zdGF0ZSkgVi5zdGF0ZS5zZXR0aW5ncyA9IHM7IH0gY2F0Y2ggKGUpIHt9CiAgICB9CiAgICByZXR1cm4gczsKICB9CiAgZnVuY3Rpb24gc2V0dGluZ0NoYW5nZShrZXksIHZhbHVlKSB7CiAgICB2YXIgcyA9IHNldHRpbmdzKCk7CiAgICBzW2tleV0gPSB2YWx1ZTsKICAgIHNzZXQoJ3NldHRpbmdzJywgcyk7CiAgfQoKICB2YXIgTFNfUFJFRklYID0gJ3ZhbXBfd2ViXyc7CiAgZnVuY3Rpb24gbHNHZXQoa2V5LCBmYWxsYmFjaykgewogICAgdHJ5IHsKICAgICAgdmFyIHJhdyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19QUkVGSVggKyBrZXkpOwogICAgICBpZiAocmF3ID09IG51bGwpIHJldHVybiBmYWxsYmFjazsKICAgICAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UocmF3KTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gcmF3OyB9CiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxsYmFjazsgfQogIH0KICBmdW5jdGlvbiBsc1NldChrZXksIHZhbHVlKSB7CiAgICB0cnkgeyB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oTFNfUFJFRklYICsga2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7fQogIH0KCiAgZnVuY3Rpb24gY3VycmVudFVzZXIoKSB7CiAgICB0cnkgeyByZXR1cm4gKFYuc3RhdGUgJiYgVi5zdGF0ZS51c2VyKSB8fCBudWxsOyB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgfQogIGZ1bmN0aW9uIHVzZXJJZGVudGl0eSh1KSB7CiAgICB1ID0gdSB8fCBjdXJyZW50VXNlcigpIHx8IHt9OwogICAgdmFyIG1pY3JvID0gKHUuZ2xvYmFsICYmIHUuZ2xvYmFsLm1pY3JvKSB8fCB7fTsKICAgIHZhciBpZCA9IG1pY3JvLmlkIHx8IHUuaWQgfHwgbnVsbDsKICAgIHZhciB1c2VybmFtZSA9IG1pY3JvLnVzZXJuYW1lIHx8IHUudXNlcm5hbWUgfHwgJyc7CiAgICB2YXIgbmFtZSA9IHUubmFtZSB8fCAodS5maXJzdE5hbWUgPyAodS5maXJzdE5hbWUgKyAodS5sYXN0TmFtZSA/ICcgJyArIHUubGFzdE5hbWUgOiAnJykpIDogJycpIHx8IHVzZXJuYW1lIHx8ICcnOwogICAgdmFyIGVtYWlsID0gdS5lbWFpbCB8fCAodS5nbG9iYWwgJiYgdS5nbG9iYWwuZW1haWwpIHx8ICcnOwogICAgdmFyIGF2YXRhciA9IG1pY3JvLnByb2ZpbGVQaWNVUkwgfHwgdS5wcm9maWxlUGljVVJMIHx8ICh1Lmdsb2JhbCAmJiB1Lmdsb2JhbC5wcm9maWxlUGljVVJMKSB8fCAnJzsKICAgIHZhciBhZG1pbiA9ICEhKHUuYWRtaW4gfHwgKHUuZ2xvYmFsICYmIHUuZ2xvYmFsLmFkbWluKSk7CiAgICByZXR1cm4geyBpZDogaWQsIHVzZXJuYW1lOiB1c2VybmFtZSwgbmFtZTogbmFtZSwgZW1haWw6IGVtYWlsLCBhdmF0YXI6IGF2YXRhciwgYWRtaW46IGFkbWluIH07CiAgfQoKICBmdW5jdGlvbiBjcmVkaXRzVmFsdWUoKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdGF0ZSAmJiBWLnN0YXRlLmNyZWRpdHMgIT0gbnVsbCkgcmV0dXJuIFYuc3RhdGUuY3JlZGl0czsKICAgICAgdmFyIHUgPSBjdXJyZW50VXNlcigpOwogICAgICBpZiAodSAmJiB1LmNyZWRpdHMgIT0gbnVsbCkgcmV0dXJuIHUuY3JlZGl0czsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHJlZnJlc2hDcmVkaXRzKCkgewogICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkuY3JlZGl0cyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgIHJldHVybiBWLmFwaS5jcmVkaXRzKCkudGhlbihmdW5jdGlvbiAocikgewogICAgICB2YXIgbiA9IChyICYmIChyLmNyZWRpdHMgIT0gbnVsbCA/IHIuY3JlZGl0cyA6IHIpKSB8fCAwOwogICAgICB0cnkgeyBpZiAoVi5zdGF0ZSkgVi5zdGF0ZS5jcmVkaXRzID0gbjsgfSBjYXRjaCAoZSkge30KICAgICAgdHJ5IHsgaWYgKFYuc3RvcmUpIHsgVi5zdG9yZS5zZXQoJ2NyZWRpdHMnLCBuKTsgVi5zdG9yZS5lbWl0KCdjcmVkaXRzOmNoYW5nZWQnLCBuKTsgfSB9IGNhdGNoIChlKSB7fQogICAgICByZXR1cm4gbjsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH0pOwogIH0KCiAgZnVuY3Rpb24gYXZhdGFyTm9kZShpZGVudCwgc2l6ZSkgewogICAgc2l6ZSA9IHNpemUgfHwgNTY7CiAgICB2YXIgYm94ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9fYXZhdGFyJywgc3R5bGU6IHsgd2lkdGg6IHNpemUgKyAncHgnLCBoZWlnaHQ6IHNpemUgKyAncHgnLCBib3JkZXJSYWRpdXM6ICc1MCUnIH0gfSk7CiAgICBpZiAoaWRlbnQuYXZhdGFyKSB7CiAgICAgIHZhciBpbWcgPSBlbCgnaW1nJywgewogICAgICAgIHNyYzogaWRlbnQuYXZhdGFyLAogICAgICAgIGFsdDogKGlkZW50Lm5hbWUgfHwgaWRlbnQudXNlcm5hbWUgfHwgJ0F2YXRhcicpCiAgICAgIH0pOwogICAgICBpZiAoaW1nICYmIGltZy5zZXRBdHRyaWJ1dGUpIGltZy5zZXRBdHRyaWJ1dGUoJ2xvYWRpbmcnLCAnbGF6eScpOwogICAgICBpZiAoaW1nICYmIGltZy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgaW1nLnJlbW92ZSgpOwogICAgICAgICAgYm94LmFwcGVuZENoaWxkKGVsKCdzcGFuJywgbnVsbCwgaW5pdGlhbHMoaWRlbnQpKSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKGltZykgYm94LmFwcGVuZENoaWxkKGltZyk7CiAgICB9IGVsc2UgewogICAgICBib3guYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCBudWxsLCBpbml0aWFscyhpZGVudCkpKTsKICAgIH0KICAgIHJldHVybiBib3g7CiAgfQogIGZ1bmN0aW9uIGluaXRpYWxzKGlkZW50KSB7CiAgICB2YXIgYmFzZSA9IChpZGVudC5uYW1lIHx8IGlkZW50LnVzZXJuYW1lIHx8IGlkZW50LmVtYWlsIHx8ICdWJykudHJpbSgpOwogICAgdmFyIHBhcnRzID0gYmFzZS5zcGxpdCgvXHMrLykuZmlsdGVyKEJvb2xlYW4pOwogICAgdmFyIGluaXRzID0gcGFydHMubGVuZ3RoID49IDIKICAgICAgPyAocGFydHNbMF1bMF0gKyBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXVswXSkKICAgICAgOiBiYXNlLnNsaWNlKDAsIDIpOwogICAgcmV0dXJuIChpbml0cyB8fCAnVicpLnRvVXBwZXJDYXNlKCk7CiAgfQoKICBmdW5jdGlvbiBzZWN0aW9uKHRpdGxlLCBzdWJ0aXRsZSwgY2hpbGRyZW4pIHsKICAgIHZhciBoZWFkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX2hlYWQnIH0sCiAgICAgIGVsKCdoMicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3RpdGxlJywgdGV4dDogdGl0bGUgfSkpOwogICAgaWYgKHN1YnRpdGxlKSBoZWFkLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViJywgdGV4dDogc3VidGl0bGUgfSkpOwogICAgcmV0dXJuIGVsKCdzZWN0aW9uJywgeyBjbGFzczogJ3Ytc2VjdGlvbiBnbGFzcy1jYXJkJyB9LCBoZWFkLAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3RhY2stbWQnIH0sIGNoaWxkcmVuIHx8IFtdKSk7CiAgfQoKICBmdW5jdGlvbiBzZXR0aW5nUm93KGxhYmVsLCBjb250cm9sLCBoaW50KSB7CiAgICB2YXIgbGFiZWxTdGFjayA9IGVsKCdkaXYnLCB7CiAgICAgIHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzJweCcsIG1pbldpZHRoOiAnMCcsIGZsZXg6ICcxIDEgYXV0bycgfQogICAgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxhYmVsJywgdGV4dDogbGFiZWwgfSkpOwogICAgaWYgKGhpbnQpIGxhYmVsU3RhY2suYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW11dGVkJywgc3R5bGU6IHsgZm9udFNpemU6ICcxM3B4JyB9LCB0ZXh0OiBoaW50IH0pKTsKICAgIHJldHVybiBlbCgnZGl2JywgewogICAgICBjbGFzczogJ3Ytcm93IHYtcm93LS1iZXR3ZWVuIHYtcm93LS13cmFwJywKICAgICAgc3R5bGU6IHsgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgYWxpZ25JdGVtczogJ2NlbnRlcicgfQogICAgfSwgbGFiZWxTdGFjaywgZWwoJ2RpdicsIHsgc3R5bGU6IHsgZmxleDogJzAgMCBhdXRvJyB9IH0sIGNvbnRyb2wpKTsKICB9CgogIGZ1bmN0aW9uIHRvZ2dsZShjaGVja2VkLCBvbkNoYW5nZSwgYXJpYUxhYmVsKSB7CiAgICB2YXIgaW5wdXQgPSBlbCgnaW5wdXQnLCB7CiAgICAgIHR5cGU6ICdjaGVja2JveCcsIGNoZWNrZWQ6ICEhY2hlY2tlZCwgJ2FyaWEtbGFiZWwnOiBhcmlhTGFiZWwgfHwgJ1RvZ2dsZScsCiAgICAgIHJvbGU6ICdzd2l0Y2gnLCAnYXJpYS1jaGVja2VkJzogY2hlY2tlZCA/ICd0cnVlJyA6ICdmYWxzZScsCiAgICAgIHN0eWxlOiB7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCBvcGFjaXR5OiAnMCcsIHdpZHRoOiAnMXB4JywgaGVpZ2h0OiAnMXB4JywgcG9pbnRlckV2ZW50czogJ25vbmUnIH0KICAgIH0pOwogICAgdmFyIHRodW1iID0gZWwoJ3NwYW4nLCB7CiAgICAgIHN0eWxlOiB7CiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogJzJweCcsIGxlZnQ6IGNoZWNrZWQgPyAnMjRweCcgOiAnMnB4JywKICAgICAgICB3aWR0aDogJzI0cHgnLCBoZWlnaHQ6ICcyNHB4JywgYm9yZGVyUmFkaXVzOiAnNTAlJywgYmFja2dyb3VuZDogJyNmZmYnLAogICAgICAgIGJveFNoYWRvdzogJzAgMXB4IDNweCByZ2JhKDAsMCwwLC4zNSknLAogICAgICAgIHRyYW5zaXRpb246ICdsZWZ0IHZhcigtLWR1ci1pbnRlcmFjdGl2ZSwgMTQwbXMpIHZhcigtLWVhc2Utc3ByaW5nLCBjdWJpYy1iZXppZXIoMC4zNCwxLjU2LDAuNjQsMSkpJwogICAgICB9CiAgICB9KTsKICAgIHZhciB0cmFjayA9IGVsKCdzcGFuJywgewogICAgICBzdHlsZTogewogICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLCBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJywgd2lkdGg6ICc1MHB4JywgaGVpZ2h0OiAnMjhweCcsCiAgICAgICAgYm9yZGVyUmFkaXVzOiAnOTk5cHgnLAogICAgICAgIGJhY2tncm91bmQ6IGNoZWNrZWQgPyAndmFyKC0tdmFtcC1hY2NlbnQsICM1Mjk3RjgpJyA6ICd2YXIoLS12LWxpbmUsIHJnYmEoMjQ1LDI0NSwyNDcsLjE4KSknLAogICAgICAgIHRyYW5zaXRpb246ICdiYWNrZ3JvdW5kIHZhcigtLWR1ci1pbnRlcmFjdGl2ZSwgMTQwbXMpIHZhcigtLWdsYXNzLWVhc2UsIGN1YmljLWJlemllcigwLjQsMCwwLjIsMSkpJwogICAgICB9CiAgICB9LCB0aHVtYik7CiAgICB2YXIgd3JhcCA9IGVsKCdsYWJlbCcsIHsKICAgICAgc3R5bGU6IHsgZGlzcGxheTogJ2lubGluZS1mbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGN1cnNvcjogJ3BvaW50ZXInIH0KICAgIH0sIGlucHV0LCB0cmFjayk7CiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBvbiA9IGlucHV0LmNoZWNrZWQ7CiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1jaGVja2VkJywgb24gPyAndHJ1ZScgOiAnZmFsc2UnKTsKICAgICAgdGh1bWIuc3R5bGUubGVmdCA9IG9uID8gJzI0cHgnIDogJzJweCc7CiAgICAgIHRyYWNrLnN0eWxlLmJhY2tncm91bmQgPSBvbiA/ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknIDogJ3ZhcigtLXYtbGluZSwgcmdiYSgyNDUsMjQ1LDI0NywuMTgpKSc7CiAgICAgIG9uQ2hhbmdlKG9uKTsKICAgIH0pOwogICAgcmV0dXJuIHdyYXA7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3RDb250cm9sKG9wdGlvbnMsIHZhbHVlLCBvbkNoYW5nZSwgYXJpYUxhYmVsKSB7CiAgICB2YXIgc2VsID0gZWwoJ3NlbGVjdCcsIHsgY2xhc3M6ICd2LXNlbGVjdCcsICdhcmlhLWxhYmVsJzogYXJpYUxhYmVsIHx8ICdTZWxlY3QnLCBzdHlsZTogeyBtaW5XaWR0aDogJzE4MHB4JyB9IH0pOwogICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7CiAgICAgIHZhciBvcHQgPSBlbCgnb3B0aW9uJywgeyB2YWx1ZTogby52YWx1ZSwgdGV4dDogby5sYWJlbCB9KTsKICAgICAgaWYgKFN0cmluZyhvLnZhbHVlKSA9PT0gU3RyaW5nKHZhbHVlKSkgb3B0LnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgc2VsLmFwcGVuZENoaWxkKG9wdCk7CiAgICB9KTsKICAgIHNlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7IG9uQ2hhbmdlKHNlbC52YWx1ZSk7IH0pOwogICAgcmV0dXJuIHNlbDsKICB9CgogIGZ1bmN0aW9uIGluZHVzdHJ5Q2xvdWQoc2VsZWN0ZWRLZXlzLCBvblRvZ2dsZSkgewogICAgdmFyIGxpc3QgPSAoVi5kYXRhICYmIFYuZGF0YS5pbmR1c3RyaWVzKSB8fCBbXTsKICAgIHZhciBzZWxlY3RlZCA9IHt9OwogICAgKHNlbGVjdGVkS2V5cyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoaykgeyBzZWxlY3RlZFtrXSA9IHRydWU7IH0pOwogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtY2hpcC1yb3cnLCBzdHlsZTogeyBmbGV4V3JhcDogJ3dyYXAnLCBvdmVyZmxvdzogJ3Zpc2libGUnIH0gfSk7CiAgICBpZiAoIWxpc3QubGVuZ3RoKSB7CiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHRleHQ6ICdObyBpbmR1c3RyaWVzIGF2YWlsYWJsZS4nIH0pKTsKICAgICAgcmV0dXJuIHdyYXA7CiAgICB9CiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGluZCkgewogICAgICB2YXIga2V5ID0gaW5kLmtleTsKICAgICAgdmFyIGNoaXAgPSBlbCgnYnV0dG9uJywgewogICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgIGNsYXNzOiAndi1jaGlwJyArIChzZWxlY3RlZFtrZXldID8gJyB2LWNoaXAtLWFjdGl2ZScgOiAnJyksCiAgICAgICAgJ2FyaWEtcHJlc3NlZCc6IHNlbGVjdGVkW2tleV0gPyAndHJ1ZScgOiAnZmFsc2UnCiAgICAgIH0sIGluZC5sYWJlbCB8fCBrZXkpOwogICAgICBjaGlwLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgIHNlbGVjdGVkW2tleV0gPSAhc2VsZWN0ZWRba2V5XTsKICAgICAgICBjaGlwLmNsYXNzTGlzdC50b2dnbGUoJ3YtY2hpcC0tYWN0aXZlJywgc2VsZWN0ZWRba2V5XSk7CiAgICAgICAgY2hpcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIHNlbGVjdGVkW2tleV0gPyAndHJ1ZScgOiAnZmFsc2UnKTsKICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHNlbGVjdGVkKS5maWx0ZXIoZnVuY3Rpb24gKGspIHsgcmV0dXJuIHNlbGVjdGVkW2tdOyB9KTsKICAgICAgICBvblRvZ2dsZShrZXlzKTsKICAgICAgfSk7CiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQoY2hpcCk7CiAgICB9KTsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gaW5kdXN0cnlCdWJibGVHcmlkKHNlbGVjdGVkS2V5cywgb25Ub2dnbGUpIHsKICAgIHZhciBsaXN0ID0gKFYuZGF0YSAmJiBWLmRhdGEuaW5kdXN0cmllcykgfHwgW107CiAgICB2YXIgc2VsZWN0ZWQgPSB7fTsKICAgIChzZWxlY3RlZEtleXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGspIHsgc2VsZWN0ZWRba10gPSB0cnVlOyB9KTsKICAgIHZhciBncmlkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW9uYl9fZ3JpZCcsIHJvbGU6ICdncm91cCcsICdhcmlhLWxhYmVsJzogJ0luZHVzdHJpZXMnIH0pOwogICAgaWYgKCFsaXN0Lmxlbmd0aCkgewogICAgICBncmlkLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCB0ZXh0OiAnTm8gaW5kdXN0cmllcyBhdmFpbGFibGUuJyB9KSk7CiAgICAgIHJldHVybiBncmlkOwogICAgfQogICAgZnVuY3Rpb24gZW1pdCgpIHsKICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzZWxlY3RlZCkuZmlsdGVyKGZ1bmN0aW9uIChrKSB7IHJldHVybiBzZWxlY3RlZFtrXTsgfSk7CiAgICAgIG9uVG9nZ2xlKGtleXMpOwogICAgfQogICAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpbmQpIHsKICAgICAgdmFyIGtleSA9IGluZC5rZXk7CiAgICAgIHZhciBidWJibGUgPSBlbCgnYnV0dG9uJywgewogICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgIGNsYXNzOiAndi1vbmJfX2J1YmJsZScgKyAoc2VsZWN0ZWRba2V5XSA/ICcgdi1vbmJfX2J1YmJsZS0tb24nIDogJycpLAogICAgICAgICdhcmlhLXByZXNzZWQnOiBzZWxlY3RlZFtrZXldID8gJ3RydWUnIDogJ2ZhbHNlJwogICAgICB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytb25iX19idWJibGUtbWFyaycsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9LCBpY29uKCdjaGVja21hcmsnKSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1vbmJfX2J1YmJsZS10aXRsZScsIHRleHQ6IGluZC5sYWJlbCB8fCBrZXkgfSksCiAgICAgICAgaW5kLnBsYWNlaG9sZGVyID8gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1vbmJfX2J1YmJsZS1kZXNjJywgdGV4dDogYnViYmxlSGludChpbmQucGxhY2Vob2xkZXIpIH0pIDogbnVsbCk7CiAgICAgIGJ1YmJsZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICBzZWxlY3RlZFtrZXldID0gIXNlbGVjdGVkW2tleV07CiAgICAgICAgYnViYmxlLmNsYXNzTGlzdC50b2dnbGUoJ3Ytb25iX19idWJibGUtLW9uJywgc2VsZWN0ZWRba2V5XSk7CiAgICAgICAgYnViYmxlLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgc2VsZWN0ZWRba2V5XSA/ICd0cnVlJyA6ICdmYWxzZScpOwogICAgICAgIGJ1YmJsZS5jbGFzc0xpc3QucmVtb3ZlKCd2LW9uYl9fYnViYmxlLS1wdWxzZScpOwogICAgICAgIHZvaWQgYnViYmxlLm9mZnNldFdpZHRoOwogICAgICAgIGJ1YmJsZS5jbGFzc0xpc3QuYWRkKCd2LW9uYl9fYnViYmxlLS1wdWxzZScpOwogICAgICAgIGVtaXQoKTsKICAgICAgfSk7CiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoYnViYmxlKTsKICAgIH0pOwogICAgcmV0dXJuIGdyaWQ7CiAgfQogIGZ1bmN0aW9uIGJ1YmJsZUhpbnQocGxhY2Vob2xkZXIpIHsKICAgIHZhciBzID0gU3RyaW5nKHBsYWNlaG9sZGVyIHx8ICcnKS5yZXBsYWNlKC9eRGVzY3JpYmVccyt0aGVccysvaSwgJycpLnNwbGl0KCfigJQnKVswXS50cmltKCk7CiAgICBpZiAoIXMpIHJldHVybiAnJzsKICAgIHMgPSBzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKTsKICAgIHJldHVybiBzLmxlbmd0aCA+IDQyID8gcy5zbGljZSgwLCA0MCkudHJpbSgpICsgJ+KApicgOiBzOwogIH0KCiAgZnVuY3Rpb24gcmVjb21tZW5kZWRNb2RlbChpbmR1c3RyeUtleXMpIHsKICAgIHZhciBtb2RlbHMgPSAoKFYuZGF0YSAmJiBWLmRhdGEubW9kZWxzKSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtICYmIG0ucmF3ICE9PSAndW5saW1pdGVkJzsgfSk7CiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBudWxsOwogICAgdmFyIHByZWZlciA9IChpbmR1c3RyeUtleXMgJiYgaW5kdXN0cnlLZXlzLmxlbmd0aCkgPyBbJ2ZsdXgnLCAncHJvJywgJ2VkaXQnXSA6IFsnc2NobmVsbCcsICdmYXN0J107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWZlci5sZW5ndGg7IGkrKykgewogICAgICB2YXIgaGl0ID0gbW9kZWxzLmZpbHRlcihmdW5jdGlvbiAobSkgeyByZXR1cm4gU3RyaW5nKG0ucmF3IHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocHJlZmVyW2ldKSA+PSAwOyB9KVswXTsKICAgICAgaWYgKGhpdCkgcmV0dXJuIGhpdC5yYXc7CiAgICB9CiAgICByZXR1cm4gbW9kZWxzWzBdLnJhdzsKICB9CgogIGZ1bmN0aW9uIGN0YUJ1dHRvbihsYWJlbCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgY2xzID0gJ3YtY3RhJzsKICAgIGlmIChvcHRzLnByaW1hcnkpIGNscyArPSAnIHYtY3RhLS1wcmltYXJ5JzsKICAgIGVsc2UgaWYgKG9wdHMuZ2hvc3QpIGNscyArPSAnIHYtY3RhLS1naG9zdCc7CiAgICBpZiAob3B0cy5kYW5nZXIpIGNscyArPSAnIHYtY3RhLS1kYW5nZXInOwogICAgaWYgKG9wdHMuYmxvY2spIGNscyArPSAnIHYtY3RhLS1ibG9jayc7CiAgICBpZiAob3B0cy5zbWFsbCkgY2xzICs9ICcgdi1jdGEtLXNtJzsKICAgIHZhciBidG4gPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6IGNscyB9KTsKICAgIGlmIChvcHRzLmljb24pIGJ0bi5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWN0YV9faWNvbicgfSwgaWNvbihvcHRzLmljb24pKSk7CiAgICBidG4uYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IHRleHQ6IGxhYmVsIH0pKTsKICAgIGlmIChvcHRzLm9uQ2xpY2spIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wdHMub25DbGljayk7CiAgICByZXR1cm4gYnRuOwogIH0KCiAgZnVuY3Rpb24gbGlua0J1dHRvbihsYWJlbCwgaHJlZiwgaWMpIHsKICAgIHZhciBhID0gZWwoJ2EnLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1zbScsIGhyZWY6IGhyZWYsIHRhcmdldDogJ19ibGFuaycsIHJlbDogJ25vb3BlbmVyIG5vcmVmZXJyZXInIH0pOwogICAgaWYgKGljKSBhLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3RhX19pY29uJyB9LCBpY29uKGljKSkpOwogICAgYS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgdGV4dDogbGFiZWwgfSkpOwogICAgcmV0dXJuIGE7CiAgfQoKICBmdW5jdGlvbiBhdXRoR3VhcmQocm9vdCkgewogICAgdmFyIGF1dGhlZCA9IGZhbHNlOwogICAgdHJ5IHsgYXV0aGVkID0gVi5hdXRoICYmIHR5cGVvZiBWLmF1dGguaXNBdXRoZWQgPT09ICdmdW5jdGlvbicgPyBWLmF1dGguaXNBdXRoZWQoKSA6ICEhY3VycmVudFVzZXIoKTsgfSBjYXRjaCAoZSkgeyBhdXRoZWQgPSAhIWN1cnJlbnRVc2VyKCk7IH0KICAgIGlmICghYXV0aGVkKSB7CiAgICAgIG1vdW50RW1wdHkocm9vdCwgJ1NpZ24gaW4gdG8gY29udGludWUnLCAnWW91IG5lZWQgYW4gYWNjb3VudCB0byB2aWV3IHRoaXMgcGFnZS4nLCAnU2lnbiBJbicsIGZ1bmN0aW9uICgpIHsgbmF2aWdhdGUoJyMvYXV0aCcpOyB9KTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBtb3VudEVtcHR5KHJvb3QsIHRpdGxlLCBtc2csIGFjdGlvbkxhYmVsLCBvbkFjdGlvbikgewogICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgIHZhciBjYXJkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5IGdsYXNzLWNhcmQnIH0sCiAgICAgIGVsKCdoMicsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScsIHRleHQ6IHRpdGxlIH0pLAogICAgICBtc2cgPyBlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19tc2cnLCB0ZXh0OiBtc2cgfSkgOiBudWxsKTsKICAgIGlmIChhY3Rpb25MYWJlbCAmJiBvbkFjdGlvbikgY2FyZC5hcHBlbmRDaGlsZChjdGFCdXR0b24oYWN0aW9uTGFiZWwsIHsgcHJpbWFyeTogdHJ1ZSwgb25DbGljazogb25BY3Rpb24gfSkpOwogICAgcm9vdC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtcGFnZScgfSwgY2FyZCkpOwogIH0KCiAgVi52aWV3cy5zZXR0aW5ncyA9IChmdW5jdGlvbiAoKSB7CiAgICB2YXIgdW5zdWIgPSBbXTsKCiAgICBmdW5jdGlvbiByZW5kZXIocm9vdCkgewogICAgICB0ZWFyZG93bigpOwogICAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWF1dGhHdWFyZChyb290KSkgcmV0dXJuOwoKICAgICAgdmFyIGlkZW50ID0gdXNlcklkZW50aXR5KCk7CiAgICAgIHZhciB2aWV3ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBhZ2Ugdi12aWV3LS1zZXR0aW5ncycgfSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKGVsKCdoZWFkZXInLCB7IGNsYXNzOiAndi1zZWN0aW9uX19oZWFkJyB9LAogICAgICAgIGVsKCdkaXYnLCBudWxsLAogICAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1leWVicm93JywgdGV4dDogJ0FjY291bnQnIH0pLAogICAgICAgICAgZWwoJ2gxJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fdGl0bGUnLCBzdHlsZTogeyBmb250U2l6ZTogJ3ZhcigtLWZvbnQtbGFyZ2UtdGl0bGUsIDM0cHgpJyB9LCB0ZXh0OiAnU2V0dGluZ3MnIH0pKSkpOwoKICAgICAgdmFyIGNyZWRpdHNFbCA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicgfSB9KTsKICAgICAgZnVuY3Rpb24gcGFpbnRDcmVkaXRzKG4pIHsKICAgICAgICBjcmVkaXRzRWwuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgdmFyIHBpbGwgPSAoVi51aSAmJiB0eXBlb2YgVi51aS5jcmVkaXRzUGlsbCA9PT0gJ2Z1bmN0aW9uJykgPyBWLnVpLmNyZWRpdHNQaWxsKG4gPT0gbnVsbCA/IDAgOiBuKSA6IG51bGw7CiAgICAgICAgaWYgKHBpbGwpIGNyZWRpdHNFbC5hcHBlbmRDaGlsZChwaWxsKTsKICAgICAgICBlbHNlIGNyZWRpdHNFbC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LW1vbm8nLCB0ZXh0OiAobiA9PSBudWxsID8gJ+KAlCcgOiBuKSArICcgQ3JlZGl0cycgfSkpOwogICAgICB9CiAgICAgIHBhaW50Q3JlZGl0cyhjcmVkaXRzVmFsdWUoKSk7CgogICAgICB2YXIgcHJvZmlsZU1ldGEgPSBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcycHgnLCBtaW5XaWR0aDogJzAnIH0gfSwKICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBmb250V2VpZ2h0OiAnNzAwJywgZm9udFNpemU6ICd2YXIoLS1mb250LXRpdGxlMywgMjBweCknIH0sIHRleHQ6IGlkZW50Lm5hbWUgfHwgaWRlbnQudXNlcm5hbWUgfHwgJ1ZhbXAgQ3JlYXRvcicgfSkpOwogICAgICBpZiAoaWRlbnQuZW1haWwpIHByb2ZpbGVNZXRhLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTRweCcgfSwgdGV4dDogaWRlbnQuZW1haWwgfSkpOwogICAgICBpZiAoaWRlbnQudXNlcm5hbWUpIHByb2ZpbGVNZXRhLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcgfSwgdGV4dDogJ0AnICsgaWRlbnQudXNlcm5hbWUgfSkpOwogICAgICBpZiAoaWRlbnQuYWRtaW4pIHByb2ZpbGVNZXRhLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgewogICAgICAgIGNsYXNzOiAndi1tb25vJywKICAgICAgICBzdHlsZTogeyBtYXJnaW5Ub3A6ICc0cHgnLCBmb250U2l6ZTogJzExcHgnLCBjb2xvcjogJ3ZhcigtLXZhbXAtYWNjZW50LCAjNTI5N0Y4KScsIHRleHRUcmFuc2Zvcm06ICd1cHBlcmNhc2UnLCBsZXR0ZXJTcGFjaW5nOiAnMC4xMmVtJyB9LAogICAgICAgIHRleHQ6ICdBZG1pbicKICAgICAgfSkpOwoKICAgICAgdmFyIHByb2ZpbGVSaWdodCA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJ3ZhcigtLXNwYWNlLXNtLCA5cHgpJywgYWxpZ25JdGVtczogJ2ZsZXgtZW5kJywgZmxleDogJzAgMCBhdXRvJyB9IH0sCiAgICAgICAgY3JlZGl0c0VsLAogICAgICAgIGN0YUJ1dHRvbignQWRkIENyZWRpdHMnLCB7IHByaW1hcnk6IHRydWUsIHNtYWxsOiB0cnVlLCBpY29uOiAncGx1cycsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvcGF5d2FsbCcpOyB9IH0pKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoZWwoJ3NlY3Rpb24nLCB7IGNsYXNzOiAnZ2xhc3MtY2FyZCcsIHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGZsZXhXcmFwOiAnd3JhcCcgfSB9LAogICAgICAgIGF2YXRhck5vZGUoaWRlbnQsIDY0KSwKICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBmbGV4OiAnMSAxIDIwMHB4JywgbWluV2lkdGg6ICcwJyB9IH0sIHByb2ZpbGVNZXRhKSwKICAgICAgICBwcm9maWxlUmlnaHQpKTsKCiAgICAgIHJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgeyBpZiAobiAhPSBudWxsKSBwYWludENyZWRpdHMobik7IH0pOwogICAgICB2YXIgY3JlZGl0Q2IgPSBmdW5jdGlvbiAobikgeyBwYWludENyZWRpdHMobik7IH07CiAgICAgIHRyeSB7IGlmIChWLnN0b3JlICYmIFYuc3RvcmUub24pIHsgVi5zdG9yZS5vbignY3JlZGl0czpjaGFuZ2VkJywgY3JlZGl0Q2IpOyB1bnN1Yi5wdXNoKGZ1bmN0aW9uICgpIHsgVi5zdG9yZS5vZmYgJiYgVi5zdG9yZS5vZmYoJ2NyZWRpdHM6Y2hhbmdlZCcsIGNyZWRpdENiKTsgfSk7IH0gfSBjYXRjaCAoZSkge30KCiAgICAgIHZhciBtb2RlbHMgPSAoKFYuZGF0YSAmJiBWLmRhdGEubW9kZWxzKSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtICYmIG0ucmF3ICE9PSAndW5saW1pdGVkJzsgfSk7CiAgICAgIHZhciBtb2RlbE9wdHMgPSBtb2RlbHMubWFwKGZ1bmN0aW9uIChtKSB7CiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG0ucmF3LCBsYWJlbDogKG0ubGFiZWwgfHwgbS5yYXcpICsgKG0uc3ViaGVhZGluZyA/ICcg4oCUICcgKyBtLnN1YmhlYWRpbmcgOiAnJykgKyAobS5jb3N0ICE9IG51bGwgPyAnICgnICsgbS5jb3N0ICsgJyBjciknIDogJycpIH07CiAgICAgIH0pOwogICAgICB2YXIgYXNwZWN0cyA9IChWLmRhdGEgJiYgVi5kYXRhLmFzcGVjdHMpIHx8IFtdOwogICAgICB2YXIgYXNwZWN0T3B0cyA9IGFzcGVjdHMubWFwKGZ1bmN0aW9uIChhKSB7IHJldHVybiB7IHZhbHVlOiBhLnJhdywgbGFiZWw6IGEubGFiZWwgfHwgYS5yYXcgfTsgfSk7CgogICAgICB2YXIgcyA9IHNldHRpbmdzKCk7CiAgICAgIHZhciBkZWZNb2RlbCA9IHMuZGVmYXVsdE1vZGVsIHx8IChtb2RlbHNbMF0gJiYgbW9kZWxzWzBdLnJhdykgfHwgJyc7CiAgICAgIHZhciBkZWZBc3BlY3QgPSBzLmRlZmF1bHRBc3BlY3QgfHwgKGFzcGVjdHNbMF0gJiYgYXNwZWN0c1swXS5yYXcpIHx8ICdhdXRvJzsKCiAgICAgIHZhciBkZWZhdWx0c0JvZHkgPSBbXTsKICAgICAgaWYgKG1vZGVsT3B0cy5sZW5ndGgpIHsKICAgICAgICBkZWZhdWx0c0JvZHkucHVzaChzZXR0aW5nUm93KCdEZWZhdWx0IG1vZGVsJywKICAgICAgICAgIHNlbGVjdENvbnRyb2wobW9kZWxPcHRzLCBkZWZNb2RlbCwgZnVuY3Rpb24gKHYpIHsgc2V0dGluZ0NoYW5nZSgnZGVmYXVsdE1vZGVsJywgdik7IHRvYXN0KCdEZWZhdWx0IG1vZGVsIHNhdmVkJywgJ3N1Y2Nlc3MnKTsgfSwgJ0RlZmF1bHQgbW9kZWwnKSwKICAgICAgICAgICdUaGUgc3RhcnRpbmcgbW9kZWwgZm9yIG5ldyBnZW5lcmF0aW9ucy4nKSk7CiAgICAgIH0KICAgICAgaWYgKGFzcGVjdE9wdHMubGVuZ3RoKSB7CiAgICAgICAgZGVmYXVsdHNCb2R5LnB1c2goc2V0dGluZ1JvdygnRGVmYXVsdCBhc3BlY3QgcmF0aW8nLAogICAgICAgICAgc2VsZWN0Q29udHJvbChhc3BlY3RPcHRzLCBkZWZBc3BlY3QsIGZ1bmN0aW9uICh2KSB7IHNldHRpbmdDaGFuZ2UoJ2RlZmF1bHRBc3BlY3QnLCB2KTsgdG9hc3QoJ0RlZmF1bHQgYXNwZWN0IHNhdmVkJywgJ3N1Y2Nlc3MnKTsgfSwgJ0RlZmF1bHQgYXNwZWN0IHJhdGlvJyksCiAgICAgICAgICAnQXBwbGllcyB0byB0ZXh0LXRvLWltYWdlIGdlbmVyYXRpb25zLicpKTsKICAgICAgfQogICAgICBpZiAoZGVmYXVsdHNCb2R5Lmxlbmd0aCkgdmlldy5hcHBlbmRDaGlsZChzZWN0aW9uKCdHZW5lcmF0aW9uIGRlZmF1bHRzJywgJ1BpY2sgdGhlIG1vZGVsIGFuZCBhc3BlY3QgeW91IHN0YXJ0IHdpdGguJywgZGVmYXVsdHNCb2R5KSk7CgogICAgICB2YXIgc2VsSW5kdXN0cmllcyA9IHNnZXQoJ2luZHVzdHJpZXMnLCBzLmluZHVzdHJpZXMgfHwgW10pIHx8IFtdOwogICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2VsSW5kdXN0cmllcykpIHNlbEluZHVzdHJpZXMgPSBbXTsKICAgICAgdmlldy5hcHBlbmRDaGlsZChzZWN0aW9uKCdJbmR1c3RyaWVzJywKICAgICAgICAnVGFpbG9ycyBwcmVzZXQgY2hpcHMgYW5kIHBsYWNlaG9sZGVycyB0byB3aGF0IHlvdSBjcmVhdGUuJywKICAgICAgICBbaW5kdXN0cnlDbG91ZChzZWxJbmR1c3RyaWVzLCBmdW5jdGlvbiAoa2V5cykgewogICAgICAgICAgc2V0dGluZ0NoYW5nZSgnaW5kdXN0cmllcycsIGtleXMpOwogICAgICAgICAgc3NldCgnaW5kdXN0cmllcycsIGtleXMpOwogICAgICAgIH0pXSkpOwoKICAgICAgdmFyIHdhdGVybWFyayA9IGxzR2V0KCd3YXRlcm1hcmtFbmFibGVkJywgdHJ1ZSk7CiAgICAgIHZhciBhdXRvU2F2ZSA9IGxzR2V0KCdhdXRvU2F2ZU9uQ29tcGxldGUnLCBmYWxzZSk7CiAgICAgIHZhciBjaGltZSA9IGxzR2V0KCdjaGltZU9uQ29tcGxldGUnLCBmYWxzZSk7CiAgICAgIHZhciB0YWdsaW5lID0gbHNHZXQoJ2JyYW5kVGFnbGluZScsICcnKTsKICAgICAgdmFyIHNoYXJlVHBsID0gbHNHZXQoJ3NoYXJlVGVtcGxhdGUnLCAnTWFkZSB3aXRoIEBWb29zZXlBSSBWYW1wLiBUcnkgaXQ6IHt7dXJsfX0nKTsKCiAgICAgIHZhciB0YWdsaW5lRmllbGQgPSBlbCgnaW5wdXQnLCB7CiAgICAgICAgdHlwZTogJ3RleHQnLCBjbGFzczogJ3YtZmllbGQnLCB2YWx1ZTogdGFnbGluZSwKICAgICAgICBwbGFjZWhvbGRlcjogJ2UuZy4gQ3JhZnRlZCBieSB5b3VyIHN0dWRpbycsIG1heGxlbmd0aDogMTIwLCAnYXJpYS1sYWJlbCc6ICdCcmFuZCB0YWdsaW5lJwogICAgICB9KTsKICAgICAgdGFnbGluZUZpZWxkLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsgbHNTZXQoJ2JyYW5kVGFnbGluZScsIHRhZ2xpbmVGaWVsZC52YWx1ZS50cmltKCkpOyB0b2FzdCgnVGFnbGluZSBzYXZlZCcsICdzdWNjZXNzJyk7IH0pOwoKICAgICAgdmFyIHNoYXJlRmllbGQgPSBlbCgndGV4dGFyZWEnLCB7CiAgICAgICAgY2xhc3M6ICd2LXRleHRhcmVhJywgcm93czogMiwgJ2FyaWEtbGFiZWwnOiAnU2hhcmUgdGVtcGxhdGUnLAogICAgICAgIHBsYWNlaG9sZGVyOiAnVG9rZW5zOiB7e3VybH19IHt7cHJvbXB0fX0ge3thZGRyZXNzfX0nCiAgICAgIH0pOwogICAgICBzaGFyZUZpZWxkLnZhbHVlID0gc2hhcmVUcGw7CiAgICAgIHNoYXJlRmllbGQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciB2YWwgPSBzaGFyZUZpZWxkLnZhbHVlLnRyaW0oKTsKICAgICAgICBpZiAoIS97e1xzKnVybFxzKn19Ly50ZXN0KHZhbCkpIHZhbCA9ICh2YWwgPyB2YWwgKyAnICcgOiAnJykgKyAne3t1cmx9fSc7CiAgICAgICAgc2hhcmVGaWVsZC52YWx1ZSA9IHZhbDsKICAgICAgICBsc1NldCgnc2hhcmVUZW1wbGF0ZScsIHZhbCk7CiAgICAgICAgdG9hc3QoJ1NoYXJlIHRlbXBsYXRlIHNhdmVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSk7CgogICAgICB2YXIgYnJhbmRTdGFjayA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzZweCcgfSB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1sYWJlbCcsIHRleHQ6ICdTaGFyZSB0YWdsaW5lJyB9KSwKICAgICAgICB0YWdsaW5lRmllbGQsCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW11dGVkJywgc3R5bGU6IHsgZm9udFNpemU6ICcxM3B4JyB9LCB0ZXh0OiAnQXBwZW5kZWQgdG8geW91ciBzaGFyZSB0ZXh0LicgfSkpOwogICAgICB2YXIgc2hhcmVTdGFjayA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzZweCcgfSB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1sYWJlbCcsIHRleHQ6ICdTaGFyZSB0ZW1wbGF0ZScgfSksCiAgICAgICAgc2hhcmVGaWVsZCwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEzcHgnIH0sIHRleHQ6ICdTdXBwb3J0cyB7e3VybH19LCB7e3Byb21wdH19LCB7e2FkZHJlc3N9fS4nIH0pKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoc2VjdGlvbignQnJhbmRpbmcgJiBvdXRwdXQnLCAnSG93IHlvdXIgc2hhcmVkIGltYWdlcyBhbmQgZG93bmxvYWRzIGFyZSBwcmVzZW50ZWQuJywgWwogICAgICAgIHNldHRpbmdSb3coJ1dhdGVybWFyayBleHBvcnRzJywgdG9nZ2xlKHdhdGVybWFyaywgZnVuY3Rpb24gKHYpIHsgbHNTZXQoJ3dhdGVybWFya0VuYWJsZWQnLCB2KTsgfSwgJ1dhdGVybWFyayBleHBvcnRzJyksCiAgICAgICAgICAnQWRkIGEgc3VidGxlIFZhbXAgbWFyayB0byBiZWZvcmUvYWZ0ZXIgc2hhcmVzLicpLAogICAgICAgIHNldHRpbmdSb3coJ0F1dG8tZG93bmxvYWQgb24gY29tcGxldGUnLCB0b2dnbGUoYXV0b1NhdmUsIGZ1bmN0aW9uICh2KSB7IGxzU2V0KCdhdXRvU2F2ZU9uQ29tcGxldGUnLCB2KTsgfSwgJ0F1dG8gZG93bmxvYWQnKSwKICAgICAgICAgICdTYXZlIGVhY2ggcmVzdWx0IGF1dG9tYXRpY2FsbHkgd2hlbiBpdCBmaW5pc2hlcy4nKSwKICAgICAgICBzZXR0aW5nUm93KCdQbGF5IGNoaW1lIG9uIGNvbXBsZXRlJywgdG9nZ2xlKGNoaW1lLCBmdW5jdGlvbiAodikgeyBsc1NldCgnY2hpbWVPbkNvbXBsZXRlJywgdik7IH0sICdDb21wbGV0aW9uIGNoaW1lJyksCiAgICAgICAgICAnQSBzb2Z0IHNvdW5kIHdoZW4gYSBnZW5lcmF0aW9uIGxhbmRzLicpLAogICAgICAgIGJyYW5kU3RhY2ssCiAgICAgICAgc2hhcmVTdGFjawogICAgICBdKSk7CgogICAgICB2YXIgbm90aWZ5Q29tcGxldGUgPSBsc0dldCgnbm90aWZ5T25Db21wbGV0ZScsIHRydWUpOwogICAgICB2YXIgbm90aWZ5Q3JlZGl0cyA9IGxzR2V0KCdub3RpZnlMb3dDcmVkaXRzJywgdHJ1ZSk7CiAgICAgIHZhciBub3RpZnlEaWdlc3QgPSBsc0dldCgnbm90aWZ5V2Vla2x5RGlnZXN0JywgZmFsc2UpOwogICAgICB2YXIgbGl2ZUFjdGl2aXRpZXMgPSBsc0dldCgnbGl2ZUFjdGl2aXRpZXMnLCB0cnVlKTsKCiAgICAgIHZhciBwZXJtUm93ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWFjYy1yb3cgdi1hY2Mtcm93LS1ub3RpY2UnIH0sCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWFjYy1yb3dfX21haW4nIH0sCiAgICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbGFiZWwnLCB0ZXh0OiAnQnJvd3NlciBub3RpZmljYXRpb25zJyB9KSwKICAgICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcgfSwgdGV4dDogbm90aWZ5UGVybWlzc2lvbkxhYmVsKCkgfSkpLAogICAgICAgIG5vdGlmeVBlcm1pc3Npb25Db250cm9sKCkpOwogICAgICB2aWV3LmFwcGVuZENoaWxkKHNlY3Rpb24oJ05vdGlmaWNhdGlvbnMnLCAnQ2hvb3NlIHdoYXQgVmFtcCBwaW5ncyB5b3UgYWJvdXQuJywgWwogICAgICAgIHBlcm1Sb3csCiAgICAgICAgc2V0dGluZ1JvdygnR2VuZXJhdGlvbiBjb21wbGV0ZScsIHRvZ2dsZShub3RpZnlDb21wbGV0ZSwgZnVuY3Rpb24gKHYpIHsgbHNTZXQoJ25vdGlmeU9uQ29tcGxldGUnLCB2KTsgbWF5YmVSZXF1ZXN0Tm90aWZ5UGVybWlzc2lvbih2KTsgfSwgJ05vdGlmeSBvbiBjb21wbGV0ZScpLAogICAgICAgICAgJ0FsZXJ0IG1lIHRoZSBtb21lbnQgYSByZW5kZXIgbGFuZHMuJyksCiAgICAgICAgc2V0dGluZ1JvdygnTG93IGNyZWRpdCB3YXJuaW5ncycsIHRvZ2dsZShub3RpZnlDcmVkaXRzLCBmdW5jdGlvbiAodikgeyBsc1NldCgnbm90aWZ5TG93Q3JlZGl0cycsIHYpOyB9LCAnTG93IGNyZWRpdCB3YXJuaW5ncycpLAogICAgICAgICAgJ0hlYWRzLXVwIGJlZm9yZSB5b3UgcnVuIG91dCBvZiBjcmVkaXRzLicpLAogICAgICAgIHNldHRpbmdSb3coJ0xpdmUgcHJvZ3Jlc3MgYWN0aXZpdHknLCB0b2dnbGUobGl2ZUFjdGl2aXRpZXMsIGZ1bmN0aW9uICh2KSB7IGxzU2V0KCdsaXZlQWN0aXZpdGllcycsIHYpOyB9LCAnTGl2ZSBhY3Rpdml0aWVzJyksCiAgICAgICAgICAnU2hvdyBhIGxpdmUgcHJvZ3Jlc3MgaW5kaWNhdG9yIHdoaWxlIGdlbmVyYXRpbmcuJyksCiAgICAgICAgc2V0dGluZ1JvdygnV2Vla2x5IGRpZ2VzdCcsIHRvZ2dsZShub3RpZnlEaWdlc3QsIGZ1bmN0aW9uICh2KSB7IGxzU2V0KCdub3RpZnlXZWVrbHlEaWdlc3QnLCB2KTsgfSwgJ1dlZWtseSBkaWdlc3QnKSwKICAgICAgICAgICdBIHdlZWtseSByZWNhcCBvZiB3aGF0IHlvdSBjcmVhdGVkLicpCiAgICAgIF0pKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoc2VjdGlvbignU3Vic2NyaXB0aW9uICYgYmlsbGluZycsICdNYW5hZ2UgY3JlZGl0cywgcGxhbnMgYW5kIHBheW1lbnQuJywgWwogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jdGEtcm93JyB9LAogICAgICAgICAgY3RhQnV0dG9uKCdCdXkgY3JlZGl0cycsIHsgcHJpbWFyeTogdHJ1ZSwgaWNvbjogJ3NwYXJrbGVzJywgb25DbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9wYXl3YWxsJyk7IH0gfSksCiAgICAgICAgICBjdGFCdXR0b24oJ01hbmFnZSBzdWJzY3JpcHRpb24nLCB7IGdob3N0OiB0cnVlLCBvbkNsaWNrOiBtYW5hZ2VTdWJzY3JpcHRpb24gfSkpLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEzcHgnIH0sIHRleHQ6ICdQdXJjaGFzZXMgYXJlIGhhbmRsZWQgc2VjdXJlbHkgdmlhIFN0cmlwZS4nIH0pCiAgICAgIF0pKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoc2VjdGlvbignR3JvdyB3aXRoIFZhbXAnLCAnRWFybiBjcmVkaXRzIGJ5IHNoYXJpbmcgYW5kIHBvc3RpbmcuJywgWwogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jdGEtcm93JyB9LAogICAgICAgICAgY3RhQnV0dG9uKCdSZWZlcnJhbCBkYXNoYm9hcmQnLCB7IGdob3N0OiB0cnVlLCBpY29uOiAnZ2lmdCcsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvcmVmZXJyYWwnKTsgfSB9KSwKICAgICAgICAgIGN0YUJ1dHRvbignRGFpbHkgY2hhbGxlbmdlJywgeyBnaG9zdDogdHJ1ZSwgaWNvbjogJ2ZsYW1lJywgb25DbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9jaGFsbGVuZ2UnKTsgfSB9KSkKICAgICAgXSkpOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChzZWN0aW9uKCdIZWxwICYgc3VwcG9ydCcsICdGQVEsIHByaXZhY3kgYW5kIHRlcm1zLicsIFsKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3RhLXJvdycgfSwKICAgICAgICAgIGxpbmtCdXR0b24oJ0hlbHAgY2VudGVyJywgJ2h0dHBzOi8vdm9vc2V5LmNvbS9oZWxwJywgJ2hlbHAnKSwKICAgICAgICAgIGxpbmtCdXR0b24oJ1ByaXZhY3knLCAnaHR0cHM6Ly92b29zZXkuY29tL3ByaXZhY3knKSwKICAgICAgICAgIGxpbmtCdXR0b24oJ1Rlcm1zJywgJ2h0dHBzOi8vdm9vc2V5LmNvbS90ZXJtcycpKQogICAgICBdKSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKHNlY3Rpb24oJ0RhdGEgJiByZXNldCcsICdFeHBvcnQgeW91ciBkYXRhLCBjbGVhciBjYWNoZSBvciByZXBsYXkgb25ib2FyZGluZy4nLCBbCiAgICAgICAgc2V0dGluZ1JvdygnRXhwb3J0IG15IGRhdGEnLAogICAgICAgICAgY3RhQnV0dG9uKCdFeHBvcnQnLCB7IGdob3N0OiB0cnVlLCBzbWFsbDogdHJ1ZSwgaWNvbjogJ2Rvd25sb2FkJywgb25DbGljazogZXhwb3J0TXlEYXRhIH0pLAogICAgICAgICAgJ0Rvd25sb2FkIHlvdXIgcHJlZmVyZW5jZXMgYW5kIGxpYnJhcnkgYXMgYSBKU09OIGZpbGUuJyksCiAgICAgICAgc2V0dGluZ1JvdygnQ2xlYXIgbG9jYWwgY2FjaGUnLAogICAgICAgICAgY3RhQnV0dG9uKCdDbGVhciBjYWNoZScsIHsgZ2hvc3Q6IHRydWUsIHNtYWxsOiB0cnVlLCBpY29uOiAndHJhc2gnLCBvbkNsaWNrOiBjbGVhckxvY2FsQ2FjaGUgfSksCiAgICAgICAgICAnRnJlZXMgc3BhY2UgdXNlZCBieSBjYWNoZWQgaW1hZ2VzIGFuZCBzdG9yZWQgcHJlZnMuJyksCiAgICAgICAgc2V0dGluZ1JvdygnUmVwbGF5IG9uYm9hcmRpbmcnLCBjdGFCdXR0b24oJ1Jlc2V0IG9uYm9hcmRpbmcnLCB7IGdob3N0OiB0cnVlLCBzbWFsbDogdHJ1ZSwgb25DbGljazogcmVzZXRPbmJvYXJkaW5nIH0pLAogICAgICAgICAgJ0NsZWFycyBpbmR1c3RyaWVzIGFuZCBzaG93cyB0aGUgZmlyc3QtcnVuIGZsb3cgYWdhaW4uJykKICAgICAgXSkpOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChzZWN0aW9uKCdBY2NvdW50JywgJ1VwZGF0ZSB5b3VyIGRldGFpbHMgb3Igc2lnbiBvdXQuJywgWwogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jdGEtcm93JyB9LAogICAgICAgICAgY3RhQnV0dG9uKCdVcGRhdGUgYWNjb3VudCcsIHsgZ2hvc3Q6IHRydWUsIGljb246ICdwZW5jaWwnLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IG9wZW5VcGRhdGVBY2NvdW50KGlkZW50KTsgfSB9KSwKICAgICAgICAgIGN0YUJ1dHRvbignTG9nIG91dCcsIHsgZ2hvc3Q6IHRydWUsIGljb246ICdsb2dvdXQnLCBvbkNsaWNrOiBsb2dvdXQgfSkpLAogICAgICAgIGVsKCdocicsIHsgY2xhc3M6ICd2LWhyJyB9KSwKICAgICAgICBzZXR0aW5nUm93KCdEZWxldGUgYWNjb3VudCcsCiAgICAgICAgICBjdGFCdXR0b24oJ0RlbGV0ZScsIHsgZGFuZ2VyOiB0cnVlLCBzbWFsbDogdHJ1ZSwgb25DbGljazogZGVsZXRlQWNjb3VudCB9KSwKICAgICAgICAgICdQZXJtYW5lbnRseSByZW1vdmVzIHlvdXIgYWNjb3VudCBhbmQgYWxsIGRhdGEuJykKICAgICAgXSkpOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChlbCgnZm9vdGVyJywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBmbGV4V3JhcDogJ3dyYXAnLCBnYXA6ICd2YXIoLS1zcGFjZS1zbSwgOXB4KScsIHBhZGRpbmdUb3A6ICd2YXIoLS1zcGFjZS1tZCwgMTVweCknIH0gfSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LW1vbm8nLCBzdHlsZTogeyBmb250U2l6ZTogJzEycHgnLCBjb2xvcjogJ3ZhcigtLXYtaW5rLXNvZnQsIHJnYmEoMjQ1LDI0NSwyNDcsLjY2KSknIH0sIHRleHQ6ICdWYW1wIGJ5IFZvb3NleScgfSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tb25vJywgc3R5bGU6IHsgZm9udFNpemU6ICcxMnB4JywgY29sb3I6ICd2YXIoLS12LWluay1zb2Z0LCByZ2JhKDI0NSwyNDUsMjQ3LC42NikpJyB9LCB0ZXh0OiAnSGF2ZSB0aGUgTWVhbnMuJyB9KSkpOwoKICAgICAgcm9vdC5hcHBlbmRDaGlsZCh2aWV3KTsKICAgIH0KCiAgICBmdW5jdGlvbiBtYW5hZ2VTdWJzY3JpcHRpb24oKSB7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKFYucGF5ICYmIHR5cGVvZiBWLnBheS5vcGVuUG9ydGFsID09PSAnZnVuY3Rpb24nKSB7IFYucGF5Lm9wZW5Qb3J0YWwoKTsgcmV0dXJuOyB9CiAgICAgICAgaWYgKFYuYXBpICYmIHR5cGVvZiBWLmFwaS5iaWxsaW5nUG9ydGFsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICB0b2FzdCgnT3BlbmluZyBiaWxsaW5nIHBvcnRhbOKApicsICdpbmZvJyk7CiAgICAgICAgICBWLmFwaS5iaWxsaW5nUG9ydGFsKCkudGhlbihmdW5jdGlvbiAocikgewogICAgICAgICAgICBpZiAociAmJiByLnVybCkgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByLnVybDsKICAgICAgICAgICAgZWxzZSBmYWxsYmFja0NvbnRhY3QoKTsKICAgICAgICAgIH0pLmNhdGNoKGZhbGxiYWNrQ29udGFjdCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7fQogICAgICBmYWxsYmFja0NvbnRhY3QoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZhbGxiYWNrQ29udGFjdCgpIHsKICAgICAgdG9hc3QoJ1RvIG1hbmFnZSB5b3VyIHN1YnNjcmlwdGlvbiwgY29udGFjdCBzdXBwb3J0QHZvb3NleS5jb20nLCAnaW5mbycpOwogICAgICB3aW5kb3cub3BlbignbWFpbHRvOnN1cHBvcnRAdm9vc2V5LmNvbT9zdWJqZWN0PVZhbXAlMjBTdWJzY3JpcHRpb24nLCAnX2JsYW5rJyk7CiAgICB9CgogICAgZnVuY3Rpb24gbm90aWZ5UGVybWlzc2lvbigpIHsKICAgICAgdHJ5IHsgcmV0dXJuICh0eXBlb2YgTm90aWZpY2F0aW9uICE9PSAndW5kZWZpbmVkJykgPyBOb3RpZmljYXRpb24ucGVybWlzc2lvbiA6ICd1bnN1cHBvcnRlZCc7IH0KICAgICAgY2F0Y2ggKGUpIHsgcmV0dXJuICd1bnN1cHBvcnRlZCc7IH0KICAgIH0KICAgIGZ1bmN0aW9uIG5vdGlmeVBlcm1pc3Npb25MYWJlbCgpIHsKICAgICAgdmFyIHAgPSBub3RpZnlQZXJtaXNzaW9uKCk7CiAgICAgIGlmIChwID09PSAnZ3JhbnRlZCcpIHJldHVybiAnQWxsb3dlZCBpbiB0aGlzIGJyb3dzZXIuJzsKICAgICAgaWYgKHAgPT09ICdkZW5pZWQnKSByZXR1cm4gJ0Jsb2NrZWQg4oCUIGVuYWJsZSBpbiBicm93c2VyIHNldHRpbmdzLic7CiAgICAgIGlmIChwID09PSAndW5zdXBwb3J0ZWQnKSByZXR1cm4gJ05vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyLic7CiAgICAgIHJldHVybiAnVGFwIHRvIGFsbG93IGFsZXJ0cyBpbiB0aGlzIGJyb3dzZXIuJzsKICAgIH0KICAgIGZ1bmN0aW9uIG5vdGlmeVBlcm1pc3Npb25Db250cm9sKCkgewogICAgICB2YXIgcCA9IG5vdGlmeVBlcm1pc3Npb24oKTsKICAgICAgaWYgKHAgPT09ICdncmFudGVkJykgewogICAgICAgIHJldHVybiBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWFjYy1waWxsIHYtYWNjLXBpbGwtLW9uJyB9LCBpY29uKCdjaGVja21hcmsnKSwgZWwoJ3NwYW4nLCB7IHRleHQ6ICdBbGxvd2VkJyB9KSk7CiAgICAgIH0KICAgICAgaWYgKHAgPT09ICd1bnN1cHBvcnRlZCcgfHwgcCA9PT0gJ2RlbmllZCcpIHsKICAgICAgICByZXR1cm4gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1hY2MtcGlsbCcgfSwgZWwoJ3NwYW4nLCB7IHRleHQ6IHAgPT09ICdkZW5pZWQnID8gJ0Jsb2NrZWQnIDogJ1VuYXZhaWxhYmxlJyB9KSk7CiAgICAgIH0KICAgICAgdmFyIGJ0biA9IGN0YUJ1dHRvbignQWxsb3cnLCB7IGdob3N0OiB0cnVlLCBzbWFsbDogdHJ1ZSB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyByZXF1ZXN0Tm90aWZ5UGVybWlzc2lvbihidG4pOyB9KTsKICAgICAgcmV0dXJuIGJ0bjsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcXVlc3ROb3RpZnlQZXJtaXNzaW9uKGJ0bikgewogICAgICBpZiAobm90aWZ5UGVybWlzc2lvbigpID09PSAndW5zdXBwb3J0ZWQnKSB7IHRvYXN0KCdOb3RpZmljYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGhlcmUuJywgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICAgIHRyeSB7CiAgICAgICAgTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKCkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICBpZiAocmVzID09PSAnZ3JhbnRlZCcpIHsgdG9hc3QoJ05vdGlmaWNhdGlvbnMgYWxsb3dlZCcsICdzdWNjZXNzJyk7IH0KICAgICAgICAgIGVsc2UgaWYgKHJlcyA9PT0gJ2RlbmllZCcpIHsgdG9hc3QoJ05vdGlmaWNhdGlvbnMgYmxvY2tlZCcsICdpbmZvJyk7IH0KICAgICAgICAgIGlmIChidG4gJiYgYnRuLnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgdmFyIGZyZXNoID0gbm90aWZ5UGVybWlzc2lvbkNvbnRyb2woKTsKICAgICAgICAgICAgYnRuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGZyZXNoLCBidG4pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGNhdGNoIChlKSB7fQogICAgfQogICAgZnVuY3Rpb24gbWF5YmVSZXF1ZXN0Tm90aWZ5UGVybWlzc2lvbihlbmFibGVkKSB7CiAgICAgIGlmIChlbmFibGVkICYmIG5vdGlmeVBlcm1pc3Npb24oKSA9PT0gJ2RlZmF1bHQnKSByZXF1ZXN0Tm90aWZ5UGVybWlzc2lvbihudWxsKTsKICAgIH0KCiAgICBmdW5jdGlvbiBleHBvcnRNeURhdGEoKSB7CiAgICAgIHZhciBpZGVudCA9IHVzZXJJZGVudGl0eSgpOwogICAgICB2YXIgYnVuZGxlID0gewogICAgICAgIGV4cG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICBwcm9maWxlOiB7IG5hbWU6IGlkZW50Lm5hbWUsIHVzZXJuYW1lOiBpZGVudC51c2VybmFtZSwgZW1haWw6IGlkZW50LmVtYWlsLCBhZG1pbjogaWRlbnQuYWRtaW4gfSwKICAgICAgICBzZXR0aW5nczogc2V0dGluZ3MoKSwKICAgICAgICBwcmVmZXJlbmNlczogY29sbGVjdFByZWZlcmVuY2VzKCkKICAgICAgfTsKICAgICAgdG9hc3QoJ1ByZXBhcmluZyB5b3VyIGV4cG9ydOKApicsICdpbmZvJyk7CiAgICAgIHZhciBmaW5pc2ggPSBmdW5jdGlvbiAobGlicmFyeSkgewogICAgICAgIGlmIChsaWJyYXJ5KSBidW5kbGUubGlicmFyeSA9IGxpYnJhcnk7CiAgICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoYnVuZGxlLCBudWxsLCAyKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pOwogICAgICAgIHZhciB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgICAgIHZhciBhID0gZWwoJ2EnLCB7IGhyZWY6IHVybCwgZG93bmxvYWQ6ICd2YW1wLWRhdGEtJyArIERhdGUubm93KCkgKyAnLmpzb24nIH0pOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7CiAgICAgICAgYS5jbGljaygpOwogICAgICAgIGEucmVtb3ZlKCk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHRyeSB7IFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsgfSBjYXRjaCAoZSkge30gfSwgNDAwMCk7CiAgICAgICAgdG9hc3QoJ0V4cG9ydCBkb3dubG9hZGVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgfTsKICAgICAgaWYgKFYuYXBpICYmIHR5cGVvZiBWLmFwaS5saWJyYXJ5ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgVi5hcGkubGlicmFyeSgxLCAyMDApLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgdmFyIGl0ZW1zID0gKHJlcyAmJiAocmVzLml0ZW1zIHx8IHJlcy5pbWFnZXMgfHwgcmVzKSkgfHwgW107CiAgICAgICAgICBmaW5pc2goQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtdKTsKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IGZpbmlzaChudWxsKTsgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmluaXNoKG51bGwpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY29sbGVjdFByZWZlcmVuY2VzKCkgewogICAgICB2YXIga2V5cyA9IFsnd2F0ZXJtYXJrRW5hYmxlZCcsICdhdXRvU2F2ZU9uQ29tcGxldGUnLCAnY2hpbWVPbkNvbXBsZXRlJywgJ2JyYW5kVGFnbGluZScsICdzaGFyZVRlbXBsYXRlJywKICAgICAgICAnbm90aWZ5T25Db21wbGV0ZScsICdub3RpZnlMb3dDcmVkaXRzJywgJ25vdGlmeVdlZWtseURpZ2VzdCcsICdsaXZlQWN0aXZpdGllcycsICdjaGFsbGVuZ2UnXTsKICAgICAgdmFyIG91dCA9IHt9OwogICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGspIHsgb3V0W2tdID0gbHNHZXQoaywgbnVsbCk7IH0pOwogICAgICByZXR1cm4gb3V0OwogICAgfQoKICAgIGZ1bmN0aW9uIGNsZWFyTG9jYWxDYWNoZSgpIHsKICAgICAgY29uZmlybURpYWxvZygnQ2xlYXIgbG9jYWxseSBjYWNoZWQgZGF0YT8gWW91ciBhY2NvdW50IGFuZCBjcmVkaXRzIGFyZSB1bmFmZmVjdGVkLicpLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgICAgaWYgKCFvaykgcmV0dXJuOwogICAgICAgIHRyeSB7CiAgICAgICAgICB2YXIgcHJlc2VydmUgPSB7fTsKICAgICAgICAgIFsnb25ib2FyZGluZ0RvbmUnLCAncmVmZXJyYWxDb2RlJywgJ3JlZmVycmFsQXBwbGllZCddLmZvckVhY2goZnVuY3Rpb24gKGspIHsgcHJlc2VydmVba10gPSBsc0dldChrLCBudWxsKTsgfSk7CiAgICAgICAgICB2YXIgZG9vbWVkID0gW107CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdpbmRvdy5sb2NhbFN0b3JhZ2UubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGtleSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2Uua2V5KGkpOwogICAgICAgICAgICBpZiAoa2V5ICYmIGtleS5pbmRleE9mKExTX1BSRUZJWCkgPT09IDApIGRvb21lZC5wdXNoKGtleSk7CiAgICAgICAgICB9CiAgICAgICAgICBkb29tZWQuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IHRyeSB7IHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpOyB9IGNhdGNoIChlKSB7fSB9KTsKICAgICAgICAgIE9iamVjdC5rZXlzKHByZXNlcnZlKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IGlmIChwcmVzZXJ2ZVtrXSAhPSBudWxsKSBsc1NldChrLCBwcmVzZXJ2ZVtrXSk7IH0pOwogICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgdG9hc3QoJ0xvY2FsIGNhY2hlIGNsZWFyZWQnLCAnc3VjY2VzcycpOwogICAgICAgIHZhciBvdXRsZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndi1vdXRsZXQnKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudi1vdXRsZXQnKTsKICAgICAgICBpZiAob3V0bGV0KSByZW5kZXIob3V0bGV0KTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzZXRPbmJvYXJkaW5nKCkgewogICAgICBjb25maXJtRGlhbG9nKCdSZXNldCBvbmJvYXJkaW5nPyBZb3VyIHNlbGVjdGVkIGluZHVzdHJpZXMgd2lsbCBiZSBjbGVhcmVkLicpLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgICAgaWYgKCFvaykgcmV0dXJuOwogICAgICAgIHNzZXQoJ2luZHVzdHJpZXMnLCBbXSk7CiAgICAgICAgc2V0dGluZ0NoYW5nZSgnaW5kdXN0cmllcycsIFtdKTsKICAgICAgICBzc2V0KCdvbmJvYXJkaW5nRG9uZScsIGZhbHNlKTsKICAgICAgICB0cnkgeyBpZiAoVi5zdGF0ZSkgVi5zdGF0ZS5vbmJvYXJkaW5nRG9uZSA9IGZhbHNlOyB9IGNhdGNoIChlKSB7fQogICAgICAgIGxzU2V0KCdzZWVuQ3JlZGl0V2VsY29tZScsIGZhbHNlKTsKICAgICAgICB0b2FzdCgnT25ib2FyZGluZyByZXNldCcsICdzdWNjZXNzJyk7CiAgICAgICAgZ28oJyMvb25ib2FyZGluZycpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBsb2dvdXQoKSB7CiAgICAgIGNvbmZpcm1EaWFsb2coJ0xvZyBvdXQgb2YgVmFtcD8nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgICB0cnkgeyBpZiAoVi5hdXRoICYmIHR5cGVvZiBWLmF1dGguY2xlYXIgPT09ICdmdW5jdGlvbicpIFYuYXV0aC5jbGVhcigpOyB9IGNhdGNoIChlKSB7fQogICAgICAgIHRvYXN0KCdTaWduZWQgb3V0JywgJ2luZm8nKTsKICAgICAgICBuYXZpZ2F0ZSgnIy9hdXRoJyk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIG9wZW5VcGRhdGVBY2NvdW50KGlkZW50KSB7CiAgICAgIHZhciBuYW1lRmllbGQgPSBlbCgnaW5wdXQnLCB7IHR5cGU6ICd0ZXh0JywgY2xhc3M6ICd2LWZpZWxkJywgdmFsdWU6IGlkZW50Lm5hbWUgfHwgJycsIHBsYWNlaG9sZGVyOiAnRnVsbCBuYW1lJywgJ2FyaWEtbGFiZWwnOiAnRnVsbCBuYW1lJyB9KTsKICAgICAgdmFyIGVtYWlsRmllbGQgPSBlbCgnaW5wdXQnLCB7IHR5cGU6ICdlbWFpbCcsIGNsYXNzOiAndi1maWVsZCcsIHZhbHVlOiBpZGVudC5lbWFpbCB8fCAnJywgcGxhY2Vob2xkZXI6ICdFbWFpbCcsICdhcmlhLWxhYmVsJzogJ0VtYWlsJyB9KTsKICAgICAgdmFyIHB3RmllbGQgPSBlbCgnaW5wdXQnLCB7IHR5cGU6ICdwYXNzd29yZCcsIGNsYXNzOiAndi1maWVsZCcsIHBsYWNlaG9sZGVyOiAnTmV3IHBhc3N3b3JkIChvcHRpb25hbCknLCBhdXRvY29tcGxldGU6ICduZXctcGFzc3dvcmQnLCAnYXJpYS1sYWJlbCc6ICdOZXcgcGFzc3dvcmQnIH0pOwogICAgICB2YXIgc3RhdHVzID0gZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcsIG1pbkhlaWdodDogJzE4cHgnIH0gfSk7CiAgICAgIHZhciBzYXZlQnRuID0gY3RhQnV0dG9uKCdTYXZlIGNoYW5nZXMnLCB7IHByaW1hcnk6IHRydWUsIGJsb2NrOiB0cnVlIH0pOwoKICAgICAgdmFyIGZvcm0gPSBlbCgnZm9ybScsIHsgY2xhc3M6ICd2LXN0YWNrLW1kJyB9LAogICAgICAgIGVsKCdoMicsIHsgY2xhc3M6ICd2LW1vZGFsX190aXRsZScsIHRleHQ6ICdVcGRhdGUgYWNjb3VudCcgfSksCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWZpZWxkLWdyb3VwJyB9LCBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWxhYmVsJywgdGV4dDogJ05hbWUnIH0pLCBuYW1lRmllbGQpLAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCcgfSwgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1sYWJlbCcsIHRleHQ6ICdFbWFpbCcgfSksIGVtYWlsRmllbGQpLAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCcgfSwgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1sYWJlbCcsIHRleHQ6ICdQYXNzd29yZCcgfSksIHB3RmllbGQpLAogICAgICAgIHN0YXR1cywKICAgICAgICBzYXZlQnRuCiAgICAgICk7CgogICAgICB2YXIgaGFuZGxlID0gbnVsbDsKICAgICAgZnVuY3Rpb24gY2xvc2UoKSB7IGlmIChoYW5kbGUgJiYgaGFuZGxlLmNsb3NlKSBoYW5kbGUuY2xvc2UoKTsgfQoKICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICBpZiAoIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS51cGRhdGVBY2NvdW50ICE9PSAnZnVuY3Rpb24nKSB7IHN0YXR1cy50ZXh0Q29udGVudCA9ICdVcGRhdGluZyBhY2NvdW50cyBpcyB1bmF2YWlsYWJsZS4nOyByZXR1cm47IH0KICAgICAgICB2YXIgbm0gPSBuYW1lRmllbGQudmFsdWUudHJpbSgpOwogICAgICAgIHZhciBlbSA9IGVtYWlsRmllbGQudmFsdWUudHJpbSgpOwogICAgICAgIGlmICghbm0pIHsgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWNvbG9yLWVycm9yLCAjRjczMzYzKSc7IHN0YXR1cy50ZXh0Q29udGVudCA9ICdOYW1lIGlzIHJlcXVpcmVkLic7IHJldHVybjsgfQogICAgICAgIGlmICghZW0gfHwgZW0uaW5kZXhPZignQCcpIDwgMCkgeyBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tY29sb3ItZXJyb3IsICNGNzMzNjMpJzsgc3RhdHVzLnRleHRDb250ZW50ID0gJ0EgdmFsaWQgZW1haWwgaXMgcmVxdWlyZWQuJzsgcmV0dXJuOyB9CiAgICAgICAgc2F2ZUJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyc7CiAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1NhdmluZ+KApic7CiAgICAgICAgdmFyIHBlcnNvbmFsID0geyBuYW1lOiBubSwgZW1haWw6IGVtIH07CiAgICAgICAgdmFyIG5tMiA9IG5tLnNwbGl0KC9ccysvKTsKICAgICAgICBwZXJzb25hbC5maXJzdE5hbWUgPSBubTJbMF0gfHwgbm07CiAgICAgICAgcGVyc29uYWwubGFzdE5hbWUgPSBubTIuc2xpY2UoMSkuam9pbignICcpIHx8ICcnOwogICAgICAgIHZhciBwdXQgPSB7IHBlcnNvbmFsOiBwZXJzb25hbCB9OwogICAgICAgIHZhciBwdyA9IHB3RmllbGQudmFsdWU7CiAgICAgICAgaWYgKHB3KSBwdXQucGFzc3dvcmQgPSBwdzsKICAgICAgICBWLmFwaS51cGRhdGVBY2NvdW50KHB1dCkudGhlbihmdW5jdGlvbiAodXBkYXRlZCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKHVwZGF0ZWQgJiYgVi5zdGF0ZSkgVi5zdGF0ZS51c2VyID0gdXBkYXRlZDsKICAgICAgICAgICAgaWYgKFYuc3RvcmUpIFYuc3RvcmUuZW1pdCgnYXV0aDpjaGFuZ2VkJywgdXBkYXRlZCB8fCBjdXJyZW50VXNlcigpKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICB0b2FzdCgnQWNjb3VudCB1cGRhdGVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgICB2YXIgb3V0bGV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Ytb3V0bGV0JykgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnYtb3V0bGV0Jyk7CiAgICAgICAgICBpZiAob3V0bGV0KSByZW5kZXIob3V0bGV0KTsKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tY29sb3ItZXJyb3IsICNGNzMzNjMpJzsKICAgICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9IChlcnIgJiYgZXJyLm1lc3NhZ2UpID8gZXJyLm1lc3NhZ2UgOiAnQ291bGQgbm90IHVwZGF0ZSBhY2NvdW50Lic7CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgdmFyIHNhdmVTdWJtaXQgPSBmdW5jdGlvbiAoKSB7IGZvcm0ucmVxdWVzdFN1Ym1pdCA/IGZvcm0ucmVxdWVzdFN1Ym1pdCgpIDogZm9ybS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnc3VibWl0JywgeyBjYW5jZWxhYmxlOiB0cnVlIH0pKTsgfTsKICAgICAgc2F2ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNhdmVTdWJtaXQpOwoKICAgICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkubW9kYWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBoYW5kbGUgPSBWLnVpLm1vZGFsKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbCcgfSwgZm9ybSksIHsgb25DbG9zZTogZnVuY3Rpb24gKCkge30gfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG92ZXJsYXkgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytb3ZlcmxheS1zY3JpbScgfSwgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vZGFsIGdsYXNzLWNhcmQnIH0sIGZvcm0pKTsKICAgICAgICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsgaWYgKGUudGFyZ2V0ID09PSBvdmVybGF5KSBvdmVybGF5LnJlbW92ZSgpOyB9KTsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpOwogICAgICAgIGhhbmRsZSA9IHsgY2xvc2U6IGZ1bmN0aW9uICgpIHsgb3ZlcmxheS5yZW1vdmUoKTsgfSB9OwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGVsZXRlQWNjb3VudCgpIHsKICAgICAgY29uZmlybURpYWxvZygnRGVsZXRlIHlvdXIgYWNjb3VudCBwZXJtYW5lbnRseT8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLicpLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgICAgaWYgKCFvaykgcmV0dXJuOwogICAgICAgIGNvbmZpcm1EaWFsb2coJ0FyZSB5b3UgYWJzb2x1dGVseSBzdXJlPyBBbGwgeW91ciBpbWFnZXMgYW5kIGRhdGEgd2lsbCBiZSBlcmFzZWQuJykudGhlbihmdW5jdGlvbiAob2syKSB7CiAgICAgICAgICBpZiAoIW9rMikgcmV0dXJuOwogICAgICAgICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkuZGVsZXRlQWNjb3VudCAhPT0gJ2Z1bmN0aW9uJykgeyB0b2FzdCgnQWNjb3VudCBkZWxldGlvbiBpcyB1bmF2YWlsYWJsZS4nLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICAgICAgICB0b2FzdCgnRGVsZXRpbmcgYWNjb3VudOKApicsICdpbmZvJyk7CiAgICAgICAgICBWLmFwaS5kZWxldGVBY2NvdW50KCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRyeSB7IGlmIChWLmF1dGggJiYgVi5hdXRoLmNsZWFyKSBWLmF1dGguY2xlYXIoKTsgfSBjYXRjaCAoZSkge30KICAgICAgICAgICAgdG9hc3QoJ0FjY291bnQgZGVsZXRlZCcsICdpbmZvJyk7CiAgICAgICAgICAgIG5hdmlnYXRlKCcjL2F1dGgnKTsKICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgdG9hc3QoKGVyciAmJiBlcnIubWVzc2FnZSkgPyBlcnIubWVzc2FnZSA6ICdDb3VsZCBub3QgZGVsZXRlIGFjY291bnQuJywgJ2Vycm9yJyk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGVhcmRvd24oKSB7CiAgICAgIHdoaWxlICh1bnN1Yi5sZW5ndGgpIHsgdHJ5IHsgdW5zdWIucG9wKCkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgfQoKICAgIHJldHVybiB7IHJlbmRlcjogcmVuZGVyLCB0ZWFyZG93bjogdGVhcmRvd24gfTsKICB9KSgpOwoKICBWLnZpZXdzLmFjY291bnQgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIHVuc3ViID0gW107CgogICAgZnVuY3Rpb24gcmVuZGVyKHJvb3QsIHBhcmFtcykgewogICAgICB0ZWFyZG93bigpOwogICAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWF1dGhHdWFyZChyb290KSkgcmV0dXJuOwoKICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMucHVyY2hhc2UgPT09ICdzdWNjZXNzJykgewogICAgICAgIHRvYXN0KCdQdXJjaGFzZSBjb21wbGV0ZSDigJQgY3JlZGl0cyBhZGRlZCEnLCAnc3VjY2VzcycpOwogICAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmNvbmZldHRpID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IFYudWkuY29uZmV0dGkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgICB9CgogICAgICB2YXIgdmlldyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1tZCB2LXZpZXctLWFjY291bnQnIH0pOwoKICAgICAgdmFyIGNyZWRpdHNCaWcgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZHJhd2VyX19jcmVkaXRzJywgdGV4dDogJ+KAlCcgfSk7CiAgICAgIGZ1bmN0aW9uIHBhaW50KG4pIHsKICAgICAgICBjcmVkaXRzQmlnLnRleHRDb250ZW50ID0gKG4gPT0gbnVsbCkgPyAn4oCUJyA6IFN0cmluZyhuKTsKICAgICAgfQogICAgICBwYWludChjcmVkaXRzVmFsdWUoKSk7CgogICAgICB2YXIgYmFsYW5jZUNhcmQgPSBlbCgnc2VjdGlvbicsIHsKICAgICAgICBjbGFzczogJ2dsYXNzLWNhcmQnLAogICAgICAgIHN0eWxlOiB7IHBhZGRpbmc6ICd2YXIoLS1zcGFjZS1tZCwgMTVweCknLCBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICd2YXIoLS1zcGFjZS1zbSwgOXB4KScgfQogICAgICB9LAogICAgICAgIGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2ZsZXgtZW5kJywganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJywgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgZmxleFdyYXA6ICd3cmFwJyB9IH0sCiAgICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcycHgnLCBtaW5XaWR0aDogJzAnIH0gfSwKICAgICAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2NyZWRpdHMtbGFiZWwnLCB0ZXh0OiAnQ3JlZGl0IGJhbGFuY2UnIH0pLAogICAgICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdiYXNlbGluZScsIGdhcDogJzZweCcgfSB9LAogICAgICAgICAgICAgIGNyZWRpdHNCaWcsCiAgICAgICAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcgfSwgdGV4dDogJ2NyZWRpdHMnIH0pKSksCiAgICAgICAgICBjdGFCdXR0b24oJ0FkZCBjcmVkaXRzJywgeyBwcmltYXJ5OiB0cnVlLCBzbWFsbDogdHJ1ZSwgaWNvbjogJ3BsdXMnLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IG5hdmlnYXRlKCcjL3BheXdhbGwnKTsgfSB9KSksCiAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTJweCcsIG1hcmdpbjogJzAnIH0sIHRleHQ6ICdDcmVkaXRzIHBvd2VyIGV2ZXJ5IGdlbmVyYXRpb24uIFN0YW5kYXJkIGVkaXRzIGNvc3QgMTAuJyB9KQogICAgICApOwogICAgICB2aWV3LmFwcGVuZENoaWxkKGJhbGFuY2VDYXJkKTsKCiAgICAgIHJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgeyBpZiAobiAhPSBudWxsKSBwYWludChuKTsgfSk7CiAgICAgIHZhciBjYiA9IGZ1bmN0aW9uIChuKSB7IHBhaW50KG4pOyB9OwogICAgICB0cnkgeyBpZiAoVi5zdG9yZSAmJiBWLnN0b3JlLm9uKSB7IFYuc3RvcmUub24oJ2NyZWRpdHM6Y2hhbmdlZCcsIGNiKTsgdW5zdWIucHVzaChmdW5jdGlvbiAoKSB7IFYuc3RvcmUub2ZmICYmIFYuc3RvcmUub2ZmKCdjcmVkaXRzOmNoYW5nZWQnLCBjYik7IH0pOyB9IH0gY2F0Y2ggKGUpIHt9CgogICAgICB2YXIgbWVudSA9IGVsKCduYXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX3NlY3Rpb24nLCAnYXJpYS1sYWJlbCc6ICdBY2NvdW50IG1lbnUnLCBzdHlsZTogeyBnYXA6ICc0cHgnIH0gfSk7CiAgICAgIG1lbnUuYXBwZW5kQ2hpbGQobWVudUl0ZW0oJ2dpZnQnLCAnUmVmZXJyYWwgcHJvZ3JhbScsICdFYXJuIGNyZWRpdHMgYnkgaW52aXRpbmcgY3JlYXRvcnMnLCBmdW5jdGlvbiAoKSB7IG5hdmlnYXRlKCcjL3JlZmVycmFsJyk7IH0pKTsKICAgICAgbWVudS5hcHBlbmRDaGlsZChtZW51SXRlbSgnZmxhbWUnLCAnRGFpbHkgY2hhbGxlbmdlJywgJ1Bvc3QgYSBkYXksIGJ1aWxkIHlvdXIgc3RyZWFrJywgZnVuY3Rpb24gKCkgeyBuYXZpZ2F0ZSgnIy9jaGFsbGVuZ2UnKTsgfSkpOwogICAgICBtZW51LmFwcGVuZENoaWxkKG1lbnVJdGVtKCdnZWFyJywgJ1NldHRpbmdzJywgJ0RlZmF1bHRzLCBicmFuZGluZyBhbmQgYWNjb3VudCcsIGZ1bmN0aW9uICgpIHsgbmF2aWdhdGUoJyMvc2V0dGluZ3MnKTsgfSkpOwogICAgICBtZW51LmFwcGVuZENoaWxkKG1lbnVJdGVtKCdoZWxwJywgJ0hlbHAgJiBzdXBwb3J0JywgJ0ZBUSBhbmQgY29udGFjdCcsIGZ1bmN0aW9uICgpIHsgY2xvc2VEcmF3ZXIoKTsgd2luZG93Lm9wZW4oJ2h0dHBzOi8vdm9vc2V5LmNvbS9oZWxwJywgJ19ibGFuaycsICdub29wZW5lcicpOyB9KSk7CiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQobWVudSk7CgogICAgICB2YXIgbG9nb3V0QnRuID0gZWwoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzOiAndi1kcmF3ZXJfX2l0ZW0gdi1kcmF3ZXJfX2l0ZW0tLWRhbmdlcicgfSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWRyYXdlcl9faXRlbS1pY29uJyB9LCBpY29uKCdsb2dvdXQnKSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IHN0eWxlOiB7IGZvbnRXZWlnaHQ6ICc2MDAnIH0sIHRleHQ6ICdMb2cgb3V0JyB9KSk7CiAgICAgIGxvZ291dEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25maXJtRGlhbG9nKCdMb2cgb3V0IG9mIFZhbXA/JykudGhlbihmdW5jdGlvbiAob2spIHsKICAgICAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgICAgIHRyeSB7IGlmIChWLmF1dGggJiYgVi5hdXRoLmNsZWFyKSBWLmF1dGguY2xlYXIoKTsgfSBjYXRjaCAoZSkge30KICAgICAgICAgIHRvYXN0KCdTaWduZWQgb3V0JywgJ2luZm8nKTsKICAgICAgICAgIG5hdmlnYXRlKCcjL2F1dGgnKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9fc2VjdGlvbicsIHN0eWxlOiB7IGJvcmRlckJvdHRvbTogJ25vbmUnIH0gfSwgbG9nb3V0QnRuKSk7CgogICAgICByb290LmFwcGVuZENoaWxkKHZpZXcpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1lbnVJdGVtKGljLCB0aXRsZSwgc3ViLCBvbkNsaWNrKSB7CiAgICAgIHZhciB0ZXh0U3RhY2sgPSBlbCgnc3BhbicsIHsKICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcycHgnLCBtaW5XaWR0aDogJzAnLCBmbGV4OiAnMSAxIGF1dG8nLCB0ZXh0QWxpZ246ICdsZWZ0JyB9CiAgICAgIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdibG9jaycsIGZvbnRXZWlnaHQ6ICc2MDAnLCBmb250U2l6ZTogJzE1cHgnLCBsaW5lSGVpZ2h0OiAnMS4yNScsIGNvbG9yOiAndmFyKC0tdi1pbmssICNmNWY1ZjcpJyB9LCB0ZXh0OiB0aXRsZSB9KSk7CiAgICAgIGlmIChzdWIpIHsKICAgICAgICB0ZXh0U3RhY2suYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7CiAgICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiAnYmxvY2snLCBmb250U2l6ZTogJzEzcHgnLCBsaW5lSGVpZ2h0OiAnMS4zJywgY29sb3I6ICd2YXIoLS12LWluay1zb2Z0LCByZ2JhKDI0NSwyNDUsMjQ3LC42KSknIH0sCiAgICAgICAgICB0ZXh0OiBzdWIKICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgdmFyIGJ0biA9IGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtZHJhd2VyX19pdGVtJywgc3R5bGU6IHsgYWxpZ25JdGVtczogJ2NlbnRlcicgfSB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZHJhd2VyX19pdGVtLWljb24nIH0sIGljb24oaWMpKSwKICAgICAgICB0ZXh0U3RhY2ssCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2l0ZW0taWNvbicsIHN0eWxlOiB7IGNvbG9yOiAndmFyKC0tdi1pbmstc29mdCwgcmdiYSgyNDUsMjQ1LDI0NywuNSkpJywgd2lkdGg6ICcxOHB4JywgaGVpZ2h0OiAnMThweCcgfSB9LCBpY29uKCdjaGV2cm9uJykpKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGljayk7CiAgICAgIHJldHVybiBidG47CiAgICB9CgogICAgZnVuY3Rpb24gdGVhcmRvd24oKSB7CiAgICAgIHdoaWxlICh1bnN1Yi5sZW5ndGgpIHsgdHJ5IHsgdW5zdWIucG9wKCkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgfQoKICAgIHJldHVybiB7IHJlbmRlcjogcmVuZGVyLCB0ZWFyZG93bjogdGVhcmRvd24gfTsKICB9KSgpOwoKICBWLnZpZXdzLm9uYm9hcmRpbmcgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIHN0YXRlID0geyBzdGVwOiAwLCBpbmR1c3RyaWVzOiBbXSwgcmVmQ29kZTogJycgfTsKCiAgICBmdW5jdGlvbiByZW5kZXIocm9vdCwgcGFyYW1zKSB7CiAgICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICAgIG1heWJlQXBwbHlRdWVyeVJlZmVycmFsKHBhcmFtcyk7CgogICAgICBzdGF0ZS5zdGVwID0gMDsKICAgICAgc3RhdGUuaW5kdXN0cmllcyA9IChzZ2V0KCdpbmR1c3RyaWVzJywgW10pIHx8IFtdKS5zbGljZSgpOwogICAgICBzdGF0ZS5yZWZDb2RlID0gbHNHZXQoJ3JlZmVycmFsQ29kZScsICcnKSB8fCAnJzsKCiAgICAgIHZhciB2aWV3ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBhZ2Ugdi12aWV3LS1vbmJvYXJkaW5nJywgc3R5bGU6IHsgbWF4V2lkdGg6ICc2NDBweCcgfSB9KTsKICAgICAgdmFyIHN0YWdlID0gZWwoJ2RpdicsIHsgY2xhc3M6ICdnbGFzcy1jYXJkIHYtb25iX19zdGFnZScgfSk7CiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoc3RhZ2UpOwogICAgICByb290LmFwcGVuZENoaWxkKHZpZXcpOwoKICAgICAgcGFpbnQoc3RhZ2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhaW50KHN0YWdlKSB7CiAgICAgIHN0YWdlLmlubmVySFRNTCA9ICcnOwogICAgICB2YXIgZG90cyA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZ2FwOiAnOHB4JywganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLCBtYXJnaW5Cb3R0b206ICd2YXIoLS1zcGFjZS1tZCwgMTVweCknIH0gfSwKICAgICAgICBkb3Qoc3RhdGUuc3RlcCA+PSAwKSwKICAgICAgICBkb3Qoc3RhdGUuc3RlcCA+PSAxKSk7CiAgICAgIHN0YWdlLmFwcGVuZENoaWxkKGRvdHMpOwoKICAgICAgaWYgKHN0YXRlLnN0ZXAgPT09IDApIHN0YWdlLmFwcGVuZENoaWxkKHN0ZXBJbmR1c3RyaWVzKCkpOwogICAgICBlbHNlIHN0YWdlLmFwcGVuZENoaWxkKHN0ZXBSZWZlcnJhbCgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkb3QoYWN0aXZlKSB7CiAgICAgIHJldHVybiBlbCgnc3BhbicsIHsKICAgICAgICBzdHlsZTogewogICAgICAgICAgd2lkdGg6IGFjdGl2ZSA/ICcyNHB4JyA6ICc4cHgnLCBoZWlnaHQ6ICc4cHgnLCBib3JkZXJSYWRpdXM6ICc5OTlweCcsCiAgICAgICAgICBiYWNrZ3JvdW5kOiBhY3RpdmUgPyAndmFyKC0tdmFtcC1hY2NlbnQsICM1Mjk3RjgpJyA6ICd2YXIoLS12LWxpbmUsIHJnYmEoMjQ1LDI0NSwyNDcsLjIpKScsCiAgICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIHZhcigtLWR1ci1iYXNlLCAyMDBtcykgdmFyKC0tZWFzZS1zcHJpbmcsIGN1YmljLWJlemllcigwLjM0LDEuNTYsMC42NCwxKSknCiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGVwSW5kdXN0cmllcygpIHsKICAgICAgdmFyIGZyYWcgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3RhY2stbWQnIH0pOwogICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdXZWxjb21lIHRvIFZhbXAnIH0pKTsKICAgICAgZnJhZy5hcHBlbmRDaGlsZChlbCgnaDEnLCB7IGNsYXNzOiAndi1zZWN0aW9uX190aXRsZScsIHN0eWxlOiB7IGZvbnRTaXplOiAndmFyKC0tZm9udC10aXRsZSwgMjhweCknIH0sIHRleHQ6ICdXaGF0IGRvIHlvdSBjcmVhdGU/JyB9KSk7CiAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHRleHQ6ICdQaWNrIGEgZmV3IHNvIHdlIGNhbiB0YWlsb3IgcHJlc2V0cyBhbmQgcHJvbXB0cy4gWW91IGNhbiBjaGFuZ2UgdGhpcyBhbnl0aW1lLicgfSkpOwoKICAgICAgdmFyIGNvbnRpbnVlTGFiZWwgPSBlbCgnc3BhbicpOwogICAgICBmdW5jdGlvbiB1cGRhdGVDb3VudCgpIHsKICAgICAgICB2YXIgbiA9IHN0YXRlLmluZHVzdHJpZXMubGVuZ3RoOwogICAgICAgIGNvbnRpbnVlTGFiZWwudGV4dENvbnRlbnQgPSBuID8gKCdDb250aW51ZSAoJyArIG4gKyAnKScpIDogJ0NvbnRpbnVlJzsKICAgICAgfQoKICAgICAgZnJhZy5hcHBlbmRDaGlsZChpbmR1c3RyeUJ1YmJsZUdyaWQoc3RhdGUuaW5kdXN0cmllcywgZnVuY3Rpb24gKGtleXMpIHsgc3RhdGUuaW5kdXN0cmllcyA9IGtleXM7IHVwZGF0ZUNvdW50KCk7IH0pKTsKCiAgICAgIGZ1bmN0aW9uIGFkdmFuY2UoKSB7CiAgICAgICAgc3NldCgnaW5kdXN0cmllcycsIHN0YXRlLmluZHVzdHJpZXMpOwogICAgICAgIHNldHRpbmdDaGFuZ2UoJ2luZHVzdHJpZXMnLCBzdGF0ZS5pbmR1c3RyaWVzKTsKICAgICAgICBpZiAoc3RhdGUuaW5kdXN0cmllcy5sZW5ndGgpIHsKICAgICAgICAgIHZhciByZWMgPSByZWNvbW1lbmRlZE1vZGVsKHN0YXRlLmluZHVzdHJpZXMpOwogICAgICAgICAgaWYgKHJlYyAmJiAhc2V0dGluZ3MoKS5kZWZhdWx0TW9kZWwpIHNldHRpbmdDaGFuZ2UoJ2RlZmF1bHRNb2RlbCcsIHJlYyk7CiAgICAgICAgfQogICAgICAgIHZhciBzdGFnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52LW9uYl9fc3RhZ2UnKTsKICAgICAgICBzdGF0ZS5zdGVwID0gMTsKICAgICAgICBpZiAoc3RhZ2UpIHBhaW50KHN0YWdlKTsKICAgICAgfQoKICAgICAgdmFyIGNvbnRpbnVlQnRuID0gZWwoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnkgdi1jdGEtLWJsb2NrJyB9LCBjb250aW51ZUxhYmVsKTsKICAgICAgY29udGludWVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhZHZhbmNlKTsKICAgICAgdXBkYXRlQ291bnQoKTsKCiAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLXNtJyB9LAogICAgICAgIGNvbnRpbnVlQnRuLAogICAgICAgIGN0YUJ1dHRvbignU2tpcCBmb3Igbm93JywgeyBnaG9zdDogdHJ1ZSwgYmxvY2s6IHRydWUsIG9uQ2xpY2s6IGFkdmFuY2UgfSkpKTsKICAgICAgcmV0dXJuIGZyYWc7CiAgICB9CgogICAgZnVuY3Rpb24gc3RlcFJlZmVycmFsKCkgewogICAgICB2YXIgZnJhZyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1tZCcgfSk7CiAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1leWVicm93JywgdGV4dDogJ0FsbW9zdCB0aGVyZScgfSkpOwogICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKCdoMScsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3RpdGxlJywgc3R5bGU6IHsgZm9udFNpemU6ICd2YXIoLS1mb250LXRpdGxlLCAyOHB4KScgfSwgdGV4dDogJ0dvdCBhIHJlZmVycmFsIGNvZGU/JyB9KSk7CiAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHRleHQ6ICdFbnRlciBhIGNyZWF0b3IgY29kZSB0byB1bmxvY2sgYm9udXMgY3JlZGl0cy4gT3B0aW9uYWwuJyB9KSk7CgogICAgICB2YXIgaW5wdXQgPSBlbCgnaW5wdXQnLCB7CiAgICAgICAgdHlwZTogJ3RleHQnLCBjbGFzczogJ3YtZmllbGQnLCB2YWx1ZTogc3RhdGUucmVmQ29kZSwKICAgICAgICBwbGFjZWhvbGRlcjogJ0NSRUFUT1JDT0RFJywgYXV0b2NhcGl0YWxpemU6ICdjaGFyYWN0ZXJzJywgc3BlbGxjaGVjazogJ2ZhbHNlJywgJ2FyaWEtbGFiZWwnOiAnUmVmZXJyYWwgY29kZScKICAgICAgfSk7CiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24gKCkgeyBpbnB1dC52YWx1ZSA9IGlucHV0LnZhbHVlLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvXHMrL2csICcnKTsgc3RhdGUucmVmQ29kZSA9IGlucHV0LnZhbHVlOyB9KTsKICAgICAgdmFyIHN0YXR1cyA9IGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEzcHgnLCBtaW5IZWlnaHQ6ICcxOHB4JyB9IH0pOwogICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCcgfSwgaW5wdXQsIHN0YXR1cykpOwoKICAgICAgdmFyIGZpbmlzaCA9IGN0YUJ1dHRvbignR2V0IHN0YXJ0ZWQnLCB7IHByaW1hcnk6IHRydWUsIGJsb2NrOiB0cnVlLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGNvZGUgPSAoaW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTsKICAgICAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uICgpIHsgY29tcGxldGVPbmJvYXJkaW5nKCk7IH07CiAgICAgICAgaWYgKGNvZGUgJiYgVi5hcGkgJiYgdHlwZW9mIFYuYXBpLmF0dHJpYnV0ZVJlZmVycmFsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnJzsKICAgICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdBcHBseWluZyBjb2Rl4oCmJzsKICAgICAgICAgIGxzU2V0KCdyZWZlcnJhbENvZGUnLCBjb2RlKTsKICAgICAgICAgIFYuYXBpLmF0dHJpYnV0ZVJlZmVycmFsKGNvZGUpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0b2FzdCgnUmVmZXJyYWwgYXBwbGllZCEnLCAnc3VjY2VzcycpOwogICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1jb2xvci1lcnJvciwgI0Y3MzM2MyknOwogICAgICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAoZXJyICYmIGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogJ0NvdWxkIG5vdCBhcHBseSB0aGF0IGNvZGUsIGJ1dCB5b3UgYXJlIGFsbCBzZXQuJzsKICAgICAgICAgICAgc2V0VGltZW91dChkb25lLCAxMjAwKTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkb25lKCk7CiAgICAgICAgfQogICAgICB9IH0pOwoKICAgICAgZnJhZy5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3RhY2stc20nIH0sCiAgICAgICAgZmluaXNoLAogICAgICAgIGN0YUJ1dHRvbignU2tpcCcsIHsgZ2hvc3Q6IHRydWUsIGJsb2NrOiB0cnVlLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IGNvbXBsZXRlT25ib2FyZGluZygpOyB9IH0pKSk7CiAgICAgIHJldHVybiBmcmFnOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbXBsZXRlT25ib2FyZGluZygpIHsKICAgICAgc3NldCgnb25ib2FyZGluZ0RvbmUnLCB0cnVlKTsKICAgICAgdHJ5IHsgaWYgKFYuc3RhdGUpIFYuc3RhdGUub25ib2FyZGluZ0RvbmUgPSB0cnVlOyB9IGNhdGNoIChlKSB7fQogICAgICBzaG93RnJlZUNyZWRpdHNXZWxjb21lKCk7CiAgICAgIGdvKCcjL2NyZWF0ZScpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dGcmVlQ3JlZGl0c1dlbGNvbWUoKSB7CiAgICAgIGlmIChsc0dldCgnc2VlbkNyZWRpdFdlbGNvbWUnLCBmYWxzZSkpIHJldHVybjsKICAgICAgbHNTZXQoJ3NlZW5DcmVkaXRXZWxjb21lJywgdHJ1ZSk7CiAgICAgIHJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgewogICAgICAgIHZhciBhbW91bnQgPSAobiAhPSBudWxsICYmIG4gPiAwKSA/IG4gOiA1MDsKICAgICAgICB0b2FzdCgnV2VsY29tZSEgWW91IGhhdmUgJyArIGFtb3VudCArICcgZnJlZSBjcmVkaXRzIHRvIHN0YXJ0IGNyZWF0aW5nLicsICdzdWNjZXNzJyk7CiAgICAgICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuY29uZmV0dGkgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgVi51aS5jb25mZXR0aSgpOyB9IGNhdGNoIChlKSB7fSB9CiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiB7IHJlbmRlcjogcmVuZGVyIH07CiAgfSkoKTsKCiAgVi52aWV3cy5yZWZlcnJhbCA9IChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiByZW5kZXIocm9vdCwgcGFyYW1zKSB7CiAgICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICAgIGlmICghYXV0aEd1YXJkKHJvb3QpKSByZXR1cm47CgogICAgICBtYXliZUFwcGx5UXVlcnlSZWZlcnJhbChwYXJhbXMpOwoKICAgICAgdmFyIHZpZXcgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcGFnZSB2LXZpZXctLXJlZmVycmFsJyB9KTsKICAgICAgdmlldy5hcHBlbmRDaGlsZChlbCgnaGVhZGVyJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9faGVhZCcgfSwKICAgICAgICBlbCgnZGl2JywgbnVsbCwKICAgICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdHcm93dGgnIH0pLAogICAgICAgICAgZWwoJ2gxJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fdGl0bGUnLCBzdHlsZTogeyBmb250U2l6ZTogJ3ZhcigtLWZvbnQtbGFyZ2UtdGl0bGUsIDM0cHgpJyB9LCB0ZXh0OiAnUmVmZXJyYWwgcHJvZ3JhbScgfSksCiAgICAgICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YicsIHRleHQ6ICdTaGFyZSB5b3VyIGNvZGUsIGVhcm4gY3JlZGl0cyB3aGVuIGNyZWF0b3JzIHNpZ24gdXAgYW5kIGNyZWF0ZS4nIH0pKSkpOwoKICAgICAgdmFyIGxpc3RXcmFwID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLW1kJyB9KTsKICAgICAgdmlldy5hcHBlbmRDaGlsZChsaXN0V3JhcCk7CiAgICAgIHJvb3QuYXBwZW5kQ2hpbGQodmlldyk7CgogICAgICBsaXN0V3JhcC5hcHBlbmRDaGlsZChza2VsKCkpOwogICAgICBsaXN0V3JhcC5hcHBlbmRDaGlsZChza2VsKCkpOwoKICAgICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkucmVmZXJyYWxDb2RlcyAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHJlbmRlckVtcHR5KGxpc3RXcmFwKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIFYuYXBpLnJlZmVycmFsQ29kZXMoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICB2YXIgY29kZXMgPSBub3JtYWxpemVMaXN0KHJlcyk7CiAgICAgICAgbGlzdFdyYXAuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgaWYgKCFjb2Rlcy5sZW5ndGgpIHsgcmVuZGVyRW1wdHkobGlzdFdyYXApOyByZXR1cm47IH0KICAgICAgICBjb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGxpc3RXcmFwLmFwcGVuZENoaWxkKGNvZGVDYXJkKGMpKTsgfSk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBsaXN0V3JhcC5pbm5lckhUTUwgPSAnJzsKICAgICAgICByZW5kZXJFcnJvcihsaXN0V3JhcCwgZXJyLCBmdW5jdGlvbiAoKSB7IHJlbmRlcihyb290LCBwYXJhbXMpOyB9KTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gbm9ybWFsaXplTGlzdChyZXMpIHsKICAgICAgaWYgKCFyZXMpIHJldHVybiBbXTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkgcmV0dXJuIHJlczsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzLml0ZW1zKSkgcmV0dXJuIHJlcy5pdGVtczsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzLmNvZGVzKSkgcmV0dXJuIHJlcy5jb2RlczsKICAgICAgcmV0dXJuIFtdOwogICAgfQoKICAgIGZ1bmN0aW9uIHNrZWwoKSB7CiAgICAgIHZhciBjYXJkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICdnbGFzcy1jYXJkJyB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbiB2LXNrZWxldG9uLS10aXRsZScsIHN0eWxlOiB7IHdpZHRoOiAnNTAlJyB9IH0pLAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbiB2LXNrZWxldG9uLS10ZXh0Jywgc3R5bGU6IHsgd2lkdGg6ICc4MCUnLCBtYXJnaW5Ub3A6ICcxMnB4JyB9IH0pLAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbiB2LXNrZWxldG9uLS10ZXh0Jywgc3R5bGU6IHsgd2lkdGg6ICc2MCUnLCBtYXJnaW5Ub3A6ICc4cHgnIH0gfSkpOwogICAgICByZXR1cm4gY2FyZDsKICAgIH0KCiAgICBmdW5jdGlvbiBjb2RlQ2FyZChjKSB7CiAgICAgIHZhciBjb2RlID0gYy5jb2RlIHx8IGMucmVmZXJyYWxDb2RlIHx8IGMuaWQgfHwgJ+KAlCc7CiAgICAgIHZhciBwbGF0Zm9ybSA9IGMucGxhdGZvcm0gfHwgYy5jaGFubmVsIHx8ICcnOwogICAgICB2YXIgY29tbWlzc2lvbiA9IChjLmNvbW1pc3Npb24gIT0gbnVsbCA/IGMuY29tbWlzc2lvbiA6IChjLmNvbW1pc3Npb25QZXJjZW50ICE9IG51bGwgPyBjLmNvbW1pc3Npb25QZXJjZW50IDogbnVsbCkpOwogICAgICB2YXIgc3RhdHVzID0gYy5zdGF0dXMgfHwgKGMuYWN0aXZlID09PSBmYWxzZSA/ICdpbmFjdGl2ZScgOiAnYWN0aXZlJyk7CiAgICAgIHZhciBzaWdudXBzID0gbnVtKGMuc2lnbnVwcyAhPSBudWxsID8gYy5zaWdudXBzIDogKGMuc3RhdHMgJiYgYy5zdGF0cy5zaWdudXBzKSk7CiAgICAgIHZhciBlYXJuZWQgPSBudW0oYy5jcmVkaXRzRWFybmVkICE9IG51bGwgPyBjLmNyZWRpdHNFYXJuZWQgOiAoYy5zdGF0cyAmJiBjLnN0YXRzLmNyZWRpdHNFYXJuZWQpKTsKICAgICAgdmFyIHNlZWRlZCA9IG51bShjLmNyZWRpdHNTZWVkZWQgIT0gbnVsbCA/IGMuY3JlZGl0c1NlZWRlZCA6IChjLnN0YXRzICYmIGMuc3RhdHMuY3JlZGl0c1NlZWRlZCkpOwoKICAgICAgdmFyIHNoYXJlVVJMID0gJ2h0dHBzOi8vYXBwcy5hcHBsZS5jb20vdXMvYXBwL3ZhbXAvaWQ2NzQ4NjU3Njg1P3I9JyArIGVuY29kZVVSSUNvbXBvbmVudChjb2RlKTsKICAgICAgdmFyIGlzQWN0aXZlID0gU3RyaW5nKHN0YXR1cykudG9Mb3dlckNhc2UoKSA9PT0gJ2FjdGl2ZSc7CgogICAgICB2YXIgY29kZUxpbmUgPSBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBnYXA6ICd2YXIoLS1zcGFjZS1zbSwgOXB4KScsIGZsZXhXcmFwOiAnd3JhcCcgfSB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbW9ubycsIHN0eWxlOiB7IGZvbnRTaXplOiAnMjJweCcsIGZvbnRXZWlnaHQ6ICc3MDAnLCBsZXR0ZXJTcGFjaW5nOiAnMC4wNGVtJyB9LCB0ZXh0OiBjb2RlIH0pKTsKICAgICAgaWYgKHBsYXRmb3JtKSBjb2RlTGluZS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LW11dGVkJywgc3R5bGU6IHsgZm9udFNpemU6ICcxM3B4JyB9LCB0ZXh0OiBwbGF0Zm9ybSB9KSk7CgogICAgICB2YXIgYmFkZ2UgPSBlbCgnc3BhbicsIHsKICAgICAgICBjbGFzczogJ3YtbW9ubycsCiAgICAgICAgc3R5bGU6IHsKICAgICAgICAgIGZvbnRTaXplOiAnMTFweCcsIHRleHRUcmFuc2Zvcm06ICd1cHBlcmNhc2UnLCBsZXR0ZXJTcGFjaW5nOiAnMC4xZW0nLAogICAgICAgICAgcGFkZGluZzogJzRweCAxMHB4JywgYm9yZGVyUmFkaXVzOiAnOTk5cHgnLAogICAgICAgICAgY29sb3I6IGlzQWN0aXZlID8gJ3ZhcigtLXZhbXAtYWNjZW50LCAjNTI5N0Y4KScgOiAndmFyKC0tdi1pbmstc29mdCwgcmdiYSgyNDUsMjQ1LDI0NywuNikpJywKICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAnICsgKGlzQWN0aXZlID8gJ3ZhcigtLXZhbXAtYWNjZW50LCAjNTI5N0Y4KScgOiAndmFyKC0tdi1saW5lLCByZ2JhKDI0NSwyNDUsMjQ3LC4xNSkpJykKICAgICAgICB9LAogICAgICAgIHRleHQ6IGNhcChzdGF0dXMpCiAgICAgIH0pOwoKICAgICAgdmFyIGhlYWQgPSBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdmbGV4LXN0YXJ0JywganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJywgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgZmxleFdyYXA6ICd3cmFwJyB9IH0sIGNvZGVMaW5lLCBiYWRnZSk7CgogICAgICB2YXIgc3RhdHNSb3cgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZ3JpZCB2LWdyaWQtLTMnLCBzdHlsZTogeyBnYXA6ICd2YXIoLS1zcGFjZS1tZCwgMTVweCknIH0gfSwKICAgICAgICBzdGF0Qm94KHNpZ251cHMsICdTaWdudXBzJyksCiAgICAgICAgc3RhdEJveChlYXJuZWQsICdDcmVkaXRzIGVhcm5lZCcpLAogICAgICAgIHN0YXRCb3goc2VlZGVkLCAnQ3JlZGl0cyBzZWVkZWQnKSk7CiAgICAgIGlmIChjb21taXNzaW9uICE9IG51bGwpIHN0YXRzUm93LmFwcGVuZENoaWxkKHN0YXRCb3goY29tbWlzc2lvbiArICclJywgJ0NvbW1pc3Npb24nKSk7CgogICAgICB2YXIgYWN0aW9ucyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jdGEtcm93JyB9LAogICAgICAgIGN0YUJ1dHRvbignQ29weSBsaW5rJywgeyBwcmltYXJ5OiB0cnVlLCBzbWFsbDogdHJ1ZSwgaWNvbjogJ2xpbmsnLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IGNvcHkoc2hhcmVVUkwsICdTaGFyZSBsaW5rIGNvcGllZCcpOyB9IH0pLAogICAgICAgIGN0YUJ1dHRvbignQ29weSBjb2RlJywgeyBnaG9zdDogdHJ1ZSwgc21hbGw6IHRydWUsIGljb246ICdjb3B5Jywgb25DbGljazogZnVuY3Rpb24gKCkgeyBjb3B5KGNvZGUsICdDb2RlIGNvcGllZCcpOyB9IH0pKTsKCiAgICAgIHZhciBjYXJkID0gZWwoJ3NlY3Rpb24nLCB7IGNsYXNzOiAndi1zZWN0aW9uIGdsYXNzLWNhcmQnIH0sIGhlYWQsIHN0YXRzUm93LCBhY3Rpb25zKTsKCiAgICAgIHZhciBsZWRnZXIgPSBjLmxlZGdlciB8fCBjLmFjdGl2aXR5IHx8IGMucmVjZW50QWN0aXZpdHk7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxlZGdlcikgJiYgbGVkZ2VyLmxlbmd0aCkgewogICAgICAgIHZhciBsaXN0ID0gZWwoJ3VsJywgeyBzdHlsZTogeyBsaXN0U3R5bGU6ICdub25lJywgbWFyZ2luOiAnMCcsIHBhZGRpbmc6ICcwJywgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgZ2FwOiAnOHB4JyB9IH0pOwogICAgICAgIGxlZGdlci5zbGljZSgwLCA1KS5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkgewogICAgICAgICAgdmFyIGxhYmVsID0gZW50cnkubGFiZWwgfHwgZW50cnkuZXZlbnQgfHwgZW50cnkudHlwZSB8fCAnQWN0aXZpdHknOwogICAgICAgICAgdmFyIGFtdCA9IGVudHJ5LmNyZWRpdHMgIT0gbnVsbCA/ICgnKycgKyBlbnRyeS5jcmVkaXRzICsgJyBjcicpIDogKGVudHJ5LmFtb3VudCAhPSBudWxsID8gZW50cnkuYW1vdW50IDogJycpOwogICAgICAgICAgdmFyIHdoZW4gPSBlbnRyeS5kYXRlIHx8IGVudHJ5LmNyZWF0ZWREYXRlIHx8IGVudHJ5LnRpbWVzdGFtcDsKICAgICAgICAgIGlmICh3aGVuICYmIFYudXRpbCAmJiBWLnV0aWwuZm10RGF0ZSkgd2hlbiA9IFYudXRpbC5mbXREYXRlKHdoZW4pOwogICAgICAgICAgbGlzdC5hcHBlbmRDaGlsZChlbCgnbGknLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJywgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgZm9udFNpemU6ICcxNHB4JyB9IH0sCiAgICAgICAgICAgIGVsKCdzcGFuJywgeyB0ZXh0OiBsYWJlbCB9KSwKICAgICAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tdXRlZCcsIHRleHQ6IFthbXQsIHdoZW5dLmZpbHRlcihCb29sZWFuKS5qb2luKCcgwrcgJykgfSkpKTsKICAgICAgICB9KTsKICAgICAgICB2YXIgZGV0YWlscyA9IGVsKCdkZXRhaWxzJywgbnVsbCwKICAgICAgICAgIGVsKCdzdW1tYXJ5JywgeyBzdHlsZTogeyBjdXJzb3I6ICdwb2ludGVyJywgZm9udFNpemU6ICcxNHB4JywgY29sb3I6ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknIH0sIHRleHQ6ICdSZWNlbnQgYWN0aXZpdHknIH0pLAogICAgICAgICAgZWwoJ2RpdicsIHsgc3R5bGU6IHsgcGFkZGluZ1RvcDogJ3ZhcigtLXNwYWNlLXNtLCA5cHgpJyB9IH0sIGxpc3QpKTsKICAgICAgICBjYXJkLmFwcGVuZENoaWxkKGRldGFpbHMpOwogICAgICB9CgogICAgICByZXR1cm4gY2FyZDsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGF0Qm94KHZhbHVlLCBsYWJlbCkgewogICAgICByZXR1cm4gZWwoJ2RpdicsIHsgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgZ2FwOiAnMnB4JyB9IH0sCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vbm8nLCBzdHlsZTogeyBmb250U2l6ZTogJzIycHgnLCBmb250V2VpZ2h0OiAnNzAwJyB9LCB0ZXh0OiB2YWx1ZSB9KSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEycHgnIH0sIHRleHQ6IGxhYmVsIH0pKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJFbXB0eSh3cmFwKSB7CiAgICAgIHdyYXAuaW5uZXJIVE1MID0gJyc7CiAgICAgIHZhciBjYXJkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5IGdsYXNzLWNhcmQnIH0sCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJyB9LCBpY29uKCdnaWZ0JykpLAogICAgICAgIGVsKCdoMicsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScsIHRleHQ6ICdCZWNvbWUgYSBWYW1wIENyZWF0b3InIH0pLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZW1wdHlfX21zZycsIHRleHQ6ICdZb3UgZG8gbm90IGhhdmUgYSByZWZlcnJhbCBjb2RlIHlldC4gQXBwbHkgdG8gZWFybiBjcmVkaXRzIGFuZCBjb21taXNzaW9uIHdoZW4gY3JlYXRvcnMgeW91IHJlZmVyIHNpZ24gdXAuJyB9KSwKICAgICAgICBjdGFCdXR0b24oJ0FwcGx5IHRvIGJlY29tZSBhIGNyZWF0b3InLCB7IHByaW1hcnk6IHRydWUsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHdpbmRvdy5vcGVuKCdodHRwczovL3Zvb3NleS5jb20vdmFtcC9jcmVhdG9ycycsICdfYmxhbmsnLCAnbm9vcGVuZXInKTsKICAgICAgICB9IH0pKTsKICAgICAgd3JhcC5hcHBlbmRDaGlsZChjYXJkKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJFcnJvcih3cmFwLCBlcnIsIHJldHJ5KSB7CiAgICAgIHdyYXAuaW5uZXJIVE1MID0gJyc7CiAgICAgIHZhciBtc2cgPSAoZXJyICYmIGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogJ0NvdWxkIG5vdCBsb2FkIHlvdXIgcmVmZXJyYWwgY29kZXMuJzsKICAgICAgd3JhcC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHkgZ2xhc3MtY2FyZCcgfSwKICAgICAgICBlbCgnaDInLCB7IGNsYXNzOiAndi1lbXB0eV9fdGl0bGUnLCB0ZXh0OiAnU29tZXRoaW5nIHdlbnQgd3JvbmcnIH0pLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZW1wdHlfX21zZycsIHRleHQ6IG1zZyB9KSwKICAgICAgICBjdGFCdXR0b24oJ1JldHJ5JywgeyBnaG9zdDogdHJ1ZSwgb25DbGljazogcmV0cnkgfSkpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb3B5KHRleHQsIG9rKSB7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpIHsKICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oZnVuY3Rpb24gKCkgeyB0b2FzdChvayB8fCAnQ29waWVkJywgJ3N1Y2Nlc3MnKTsgfSwgZnVuY3Rpb24gKCkgeyBsZWdhY3lDb3B5KHRleHQsIG9rKTsgfSk7CiAgICAgICAgfSBlbHNlIHsgbGVnYWN5Q29weSh0ZXh0LCBvayk7IH0KICAgICAgfSBjYXRjaCAoZSkgeyBsZWdhY3lDb3B5KHRleHQsIG9rKTsgfQogICAgfQogICAgZnVuY3Rpb24gbGVnYWN5Q29weSh0ZXh0LCBvaykgewogICAgICB0cnkgewogICAgICAgIHZhciB0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICAgICAgdGEudmFsdWUgPSB0ZXh0OyB0YS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7IHRhLnN0eWxlLm9wYWNpdHkgPSAnMCc7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0YSk7IHRhLnNlbGVjdCgpOyBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOyB0YS5yZW1vdmUoKTsKICAgICAgICB0b2FzdChvayB8fCAnQ29waWVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSBjYXRjaCAoZSkgeyB0b2FzdCgnQ29weSBmYWlsZWQg4oCUICcgKyB0ZXh0LCAnZXJyb3InKTsgfQogICAgfQoKICAgIGZ1bmN0aW9uIG51bShuKSB7IHJldHVybiAobiA9PSBudWxsIHx8IGlzTmFOKE51bWJlcihuKSkpID8gJzAnIDogU3RyaW5nKE51bWJlcihuKSk7IH0KICAgIGZ1bmN0aW9uIGNhcChzKSB7IHMgPSBTdHJpbmcocyB8fCAnJyk7IHJldHVybiBzID8gcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzOyB9CgogICAgcmV0dXJuIHsgcmVuZGVyOiByZW5kZXIgfTsKICB9KSgpOwoKICBWLnZpZXdzLmNoYWxsZW5nZSA9IChmdW5jdGlvbiAoKSB7CiAgICB2YXIgR09BTCA9IDMwOwogICAgdmFyIEdSQUNFX0RBWVMgPSA1OwogICAgdmFyIERBSUxZX0NSRURJVFMgPSAxMDA7CiAgICB2YXIgQk9OVVNfQ1JFRElUUyA9IDEwMDA7CgogICAgZnVuY3Rpb24gZ2V0U3RyZWFrKCkgewogICAgICB2YXIgcyA9IGxzR2V0KCdjaGFsbGVuZ2UnLCBudWxsKTsKICAgICAgaWYgKCFzIHx8IHR5cGVvZiBzICE9PSAnb2JqZWN0JykgcyA9IHsgY291bnQ6IDAsIGxhc3REYXk6IG51bGwsIGJlc3Q6IDAsIHRvdGFsOiAwIH07CiAgICAgIHJldHVybiBzOwogICAgfQogICAgZnVuY3Rpb24gc2V0U3RyZWFrKHMpIHsgbHNTZXQoJ2NoYWxsZW5nZScsIHMpOyB9CgogICAgZnVuY3Rpb24gdG9kYXlLZXkoKSB7CiAgICAgIHZhciBkID0gbmV3IERhdGUoKTsKICAgICAgcmV0dXJuIGQuZ2V0RnVsbFllYXIoKSArICctJyArIHBhZChkLmdldE1vbnRoKCkgKyAxKSArICctJyArIHBhZChkLmdldERhdGUoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBwYWQobikgeyByZXR1cm4gbiA8IDEwID8gJzAnICsgbiA6ICcnICsgbjsgfQogICAgZnVuY3Rpb24gZGF5RGlmZihhS2V5LCBiS2V5KSB7CiAgICAgIGlmICghYUtleSB8fCAhYktleSkgcmV0dXJuIEluZmluaXR5OwogICAgICB2YXIgYSA9IHBhcnNlS2V5KGFLZXkpLCBiID0gcGFyc2VLZXkoYktleSk7CiAgICAgIHJldHVybiBNYXRoLnJvdW5kKChiIC0gYSkgLyA4NjQwMDAwMCk7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZUtleShrKSB7CiAgICAgIHZhciBwID0gU3RyaW5nKGspLnNwbGl0KCctJyk7CiAgICAgIHJldHVybiBEYXRlLlVUQygrcFswXSwgKCtwWzFdKSAtIDEsICtwWzJdKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXIocm9vdCkgewogICAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWF1dGhHdWFyZChyb290KSkgcmV0dXJuOwoKICAgICAgdmFyIHMgPSBnZXRTdHJlYWsoKTsKICAgICAgdmFyIHZpZXcgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcGFnZSB2LXZpZXctLWNoYWxsZW5nZScgfSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKGVsKCdoZWFkZXInLCB7IGNsYXNzOiAndi1zZWN0aW9uX19oZWFkJyB9LAogICAgICAgIGVsKCdkaXYnLCBudWxsLAogICAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1leWVicm93JywgdGV4dDogJ0dyb3d0aCcgfSksCiAgICAgICAgICBlbCgnaDEnLCB7IGNsYXNzOiAndi1zZWN0aW9uX190aXRsZScsIHN0eWxlOiB7IGZvbnRTaXplOiAndmFyKC0tZm9udC1sYXJnZS10aXRsZSwgMzRweCknIH0sIHRleHQ6ICdQb3N0LWEtZGF5IGNoYWxsZW5nZScgfSksCiAgICAgICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YicsIHRleHQ6ICdDcmVhdGUgYW5kIHNoYXJlIGRhaWx5LiBFYXJuICcgKyBEQUlMWV9DUkVESVRTICsgJyBjcmVkaXRzIGVhY2ggZGF5IGFuZCBhICcgKyBCT05VU19DUkVESVRTICsgJy1jcmVkaXQgYm9udXMgYXQgZGF5ICcgKyBHT0FMICsgJy4nIH0pKSkpOwoKICAgICAgdmFyIHRvZGF5ID0gdG9kYXlLZXkoKTsKICAgICAgdmFyIGxvZ2dlZFRvZGF5ID0gcy5sYXN0RGF5ID09PSB0b2RheTsKICAgICAgdmFyIGJyb2tlbiA9IHMubGFzdERheSAmJiBkYXlEaWZmKHMubGFzdERheSwgdG9kYXkpID4gKEdSQUNFX0RBWVMgKyAxKTsKICAgICAgdmFyIGxpdmVDb3VudCA9IGJyb2tlbiA/IDAgOiBzLmNvdW50OwogICAgICB2YXIgcGN0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgbGl2ZUNvdW50IC8gR09BTCkpOwoKICAgICAgdmFyIGhlcm8gPSBlbCgnc2VjdGlvbicsIHsKICAgICAgICBjbGFzczogJ2dsYXNzLWNhcmQnLAogICAgICAgIHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZ2FwOiAndmFyKC0tc3BhY2UtbGcsIDI0cHgpJywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGZsZXhXcmFwOiAnd3JhcCcgfQogICAgICB9LAogICAgICAgIHJpbmdOb2RlKHBjdCwgbGl2ZUNvdW50KSwKICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICc2cHgnLCBmbGV4OiAnMSAxIDIwMHB4JywgbWluV2lkdGg6ICcwJyB9IH0sCiAgICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbW9ubycsIHN0eWxlOiB7IGZvbnRTaXplOiAndmFyKC0tZm9udC10aXRsZTMsIDIwcHgpJywgZm9udFdlaWdodDogJzcwMCcgfSwgdGV4dDogJ0RheSAnICsgbGl2ZUNvdW50ICsgJyAvICcgKyBHT0FMIH0pLAogICAgICAgICAgZWwoJ2RpdicsIHsgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBhbGlnbkl0ZW1zOiAnY2VudGVyJywgZ2FwOiAnNnB4JywgY29sb3I6ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknIH0gfSwKICAgICAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jdGFfX2ljb24nLCBzdHlsZTogeyB3aWR0aDogJzE4cHgnLCBoZWlnaHQ6ICcxOHB4JyB9IH0sIGljb24oJ2ZsYW1lJykpLAogICAgICAgICAgICBlbCgnc3BhbicsIHsgdGV4dDogbGl2ZUNvdW50ID4gMCA/IChsaXZlQ291bnQgKyAnLWRheSBzdHJlYWsnKSA6ICdTdGFydCB5b3VyIHN0cmVhaycgfSkpLAogICAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTRweCcsIG1hcmdpbjogJzAnIH0sIHRleHQ6IGJyb2tlbgogICAgICAgICAgICA/ICdZb3VyIHN0cmVhayBsYXBzZWQgcGFzdCB0aGUgJyArIEdSQUNFX0RBWVMgKyAnLWRheSBncmFjZSB3aW5kb3cuIFBvc3QgdG9kYXkgdG8gYmVnaW4gYWdhaW4uJwogICAgICAgICAgICA6IChsb2dnZWRUb2RheSA/ICdMb2dnZWQgZm9yIHRvZGF5IOKAlCBjb21lIGJhY2sgdG9tb3Jyb3cgdG8ga2VlcCBpdCBnb2luZy4nIDogJ1Bvc3QgdG9kYXkgdG8gZXh0ZW5kIHlvdXIgc3RyZWFrLicpIH0pKQogICAgICApOwogICAgICB2aWV3LmFwcGVuZENoaWxkKGhlcm8pOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChlbCgnc2VjdGlvbicsIHsgY2xhc3M6ICd2LWdyaWQgdi1ncmlkLS00IGdsYXNzLWNhcmQnLCBzdHlsZTogeyBnYXA6ICd2YXIoLS1zcGFjZS1tZCwgMTVweCknIH0gfSwKICAgICAgICBzdGF0Qm94KGxpdmVDb3VudCwgJ0N1cnJlbnQgc3RyZWFrJyksCiAgICAgICAgc3RhdEJveChNYXRoLm1heChzLmJlc3QgfHwgMCwgbGl2ZUNvdW50KSwgJ0Jlc3Qgc3RyZWFrJyksCiAgICAgICAgc3RhdEJveCgocy50b3RhbCB8fCAwKSwgJ0RheXMgcG9zdGVkJyksCiAgICAgICAgc3RhdEJveCgoKHMudG90YWwgfHwgMCkgKiBEQUlMWV9DUkVESVRTKSwgJ0NyZWRpdHMgZWFybmVkJykpKTsKCiAgICAgIHZhciBsb2dCdG4gPSBjdGFCdXR0b24obG9nZ2VkVG9kYXkgPyAnUG9zdGVkIHRvZGF5JyA6ICdJIHBvc3RlZCB0b2RheScsIHsKICAgICAgICBwcmltYXJ5OiAhbG9nZ2VkVG9kYXksIGdob3N0OiBsb2dnZWRUb2RheSwgYmxvY2s6IHRydWUsIGljb246IGxvZ2dlZFRvZGF5ID8gJ2NoZWNrbWFyaycgOiAncGx1cycKICAgICAgfSk7CiAgICAgIGxvZ0J0bi5kaXNhYmxlZCA9IGxvZ2dlZFRvZGF5OwogICAgICBsb2dCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHN0ID0gZ2V0U3RyZWFrKCk7CiAgICAgICAgdmFyIHQgPSB0b2RheUtleSgpOwogICAgICAgIGlmIChzdC5sYXN0RGF5ID09PSB0KSByZXR1cm47CiAgICAgICAgdmFyIGJyayA9IHN0Lmxhc3REYXkgJiYgZGF5RGlmZihzdC5sYXN0RGF5LCB0KSA+IChHUkFDRV9EQVlTICsgMSk7CiAgICAgICAgc3QuY291bnQgPSBicmsgPyAxIDogKHN0LmNvdW50IHx8IDApICsgMTsKICAgICAgICBzdC5sYXN0RGF5ID0gdDsKICAgICAgICBzdC50b3RhbCA9IChzdC50b3RhbCB8fCAwKSArIDE7CiAgICAgICAgc3QuYmVzdCA9IE1hdGgubWF4KHN0LmJlc3QgfHwgMCwgc3QuY291bnQpOwogICAgICAgIHNldFN0cmVhayhzdCk7CiAgICAgICAgaWYgKHN0LmNvdW50ID49IEdPQUwpIHsKICAgICAgICAgIHRvYXN0KEdPQUwgKyAnLWRheSBjaGFsbGVuZ2UgY29tcGxldGUhICcgKyBCT05VU19DUkVESVRTICsgJyBib251cyBjcmVkaXRzIHVubG9ja2VkLicsICdzdWNjZXNzJyk7CiAgICAgICAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jb25mZXR0aSA9PT0gJ2Z1bmN0aW9uJykgeyB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG9hc3QoJ0RheSAnICsgc3QuY291bnQgKyAnIGxvZ2dlZCDCtyArJyArIERBSUxZX0NSRURJVFMgKyAnIGNyZWRpdHMnLCAnc3VjY2VzcycpOwogICAgICAgICAgaWYgKHN0LmNvdW50ID4gMSAmJiBWLnVpICYmIHR5cGVvZiBWLnVpLmNvbmZldHRpID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IFYudWkuY29uZmV0dGkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgICAgIH0KICAgICAgICByZW5kZXIocm9vdCk7CiAgICAgIH0pOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3RhY2stc20nIH0sCiAgICAgICAgbG9nQnRuLAogICAgICAgIGN0YUJ1dHRvbignQ3JlYXRlIHNvbWV0aGluZyBub3cnLCB7IGdob3N0OiB0cnVlLCBibG9jazogdHJ1ZSwgaWNvbjogJ3NwYXJrbGVzJywgb25DbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9jcmVhdGUnKTsgfSB9KSkpOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChjYWxlbmRhck5vZGUobGl2ZUNvdW50KSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEycHgnIH0sIHRleHQ6ICdEYWlseSBhbmQgYm9udXMgY3JlZGl0cyBhcmUgY29uZmlybWVkIHNlcnZlci1zaWRlLiBQb3N0cyBtdXN0IGluY2x1ZGUgdGhlIEB2YW1wIG9yICN2YW1wIHRhZyB0byBxdWFsaWZ5LicgfSkpOwoKICAgICAgcm9vdC5hcHBlbmRDaGlsZCh2aWV3KTsKICAgIH0KCiAgICBmdW5jdGlvbiByaW5nTm9kZShwY3QsIGNvdW50KSB7CiAgICAgIHZhciBzaXplID0gMTMyLCBzdHJva2UgPSAxMiwgciA9IChzaXplIC0gc3Ryb2tlKSAvIDIsIGMgPSAyICogTWF0aC5QSSAqIHI7CiAgICAgIHZhciBvZmYgPSBjICogKDEgLSBwY3QpOwogICAgICB2YXIgc3ZnTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOwogICAgICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCAnc3ZnJyk7CiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCAnMCAwICcgKyBzaXplICsgJyAnICsgc2l6ZSk7CiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgc2l6ZSk7IHN2Zy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHNpemUpOwogICAgICBzdmcuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgIHZhciBiZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzdmdOUywgJ2NpcmNsZScpOwogICAgICBiZy5zZXRBdHRyaWJ1dGUoJ2N4Jywgc2l6ZSAvIDIpOyBiZy5zZXRBdHRyaWJ1dGUoJ2N5Jywgc2l6ZSAvIDIpOyBiZy5zZXRBdHRyaWJ1dGUoJ3InLCByKTsKICAgICAgYmcuc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTsgYmcuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBzdHJva2UpOwogICAgICBiZy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICd2YXIoLS12LWxpbmUsIHJnYmEoMjQ1LDI0NSwyNDcsLjE1KSknKTsKICAgICAgdmFyIGZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCAnY2lyY2xlJyk7CiAgICAgIGZnLnNldEF0dHJpYnV0ZSgnY3gnLCBzaXplIC8gMik7IGZnLnNldEF0dHJpYnV0ZSgnY3knLCBzaXplIC8gMik7IGZnLnNldEF0dHJpYnV0ZSgncicsIHIpOwogICAgICBmZy5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnbm9uZScpOyBmZy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsIHN0cm9rZSk7CiAgICAgIGZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgJ3ZhcigtLXZhbXAtYWNjZW50LCAjNTI5N0Y4KScpOwogICAgICBmZy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lY2FwJywgJ3JvdW5kJyk7CiAgICAgIGZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWRhc2hhcnJheScsIGMpOwogICAgICBmZy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1kYXNob2Zmc2V0JywgYyk7CiAgICAgIGZnLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgJ3JvdGF0ZSgtOTAgJyArIChzaXplIC8gMikgKyAnICcgKyAoc2l6ZSAvIDIpICsgJyknKTsKICAgICAgc3ZnLmFwcGVuZENoaWxkKGJnKTsgc3ZnLmFwcGVuZENoaWxkKGZnKTsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHsgZmcuc3R5bGUudHJhbnNpdGlvbiA9ICdzdHJva2UtZGFzaG9mZnNldCA5MDBtcyBjdWJpYy1iZXppZXIoLjIyLDEsLjM2LDEpJzsgZmcuc2V0QXR0cmlidXRlKCdzdHJva2UtZGFzaG9mZnNldCcsIG9mZik7IH0pOwogICAgICB2YXIgbGFiZWwgPSBlbCgnZGl2JywgewogICAgICAgIHN0eWxlOiB7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCBpbnNldDogJzAnLCBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBhbGlnbkl0ZW1zOiAnY2VudGVyJywganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInIH0KICAgICAgfSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LW1vbm8nLCBzdHlsZTogeyBmb250U2l6ZTogJzM0cHgnLCBmb250V2VpZ2h0OiAnNzAwJywgbGluZUhlaWdodDogJzEnIH0sIHRleHQ6IFN0cmluZyhjb3VudCkgfSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcgfSwgdGV4dDogJy8gJyArIEdPQUwgfSkpOwogICAgICByZXR1cm4gZWwoJ2RpdicsIHsgc3R5bGU6IHsgcG9zaXRpb246ICdyZWxhdGl2ZScsIHdpZHRoOiBzaXplICsgJ3B4JywgaGVpZ2h0OiBzaXplICsgJ3B4JywgZmxleDogJzAgMCBhdXRvJyB9IH0sIHN2ZywgbGFiZWwpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNhbGVuZGFyTm9kZShjb3VudCkgewogICAgICB2YXIgZ3JpZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAnZ2xhc3MtY2FyZCcsIHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJ3ZhcigtLXNwYWNlLXNtLCA5cHgpJyB9IH0pOwogICAgICBncmlkLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdQcm9ncmVzcycgfSkpOwogICAgICB2YXIgZG90cyA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdncmlkJywgZ3JpZFRlbXBsYXRlQ29sdW1uczogJ3JlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgyMnB4LCAxZnIpKScsIGdhcDogJzhweCcgfSB9KTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gR09BTDsgaSsrKSB7CiAgICAgICAgdmFyIGRvbmUgPSBpIDw9IGNvdW50OwogICAgICAgIGRvdHMuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7CiAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICB3aWR0aDogJzIycHgnLCBoZWlnaHQ6ICcyMnB4JywgYm9yZGVyUmFkaXVzOiAnNnB4JywKICAgICAgICAgICAgYmFja2dyb3VuZDogZG9uZSA/ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknIDogJ3ZhcigtLXYtY2FyZC1iZywgcmdiYSgyNTUsMjU1LDI1NSwuMDQpKScsCiAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAnICsgKGRvbmUgPyAndHJhbnNwYXJlbnQnIDogJ3ZhcigtLXYtbGluZSwgcmdiYSgyNDUsMjQ1LDI0NywuMTUpKScpCiAgICAgICAgICB9LAogICAgICAgICAgdGl0bGU6ICdEYXkgJyArIGksICdhcmlhLWxhYmVsJzogJ0RheSAnICsgaSArIChkb25lID8gJyBjb21wbGV0ZScgOiAnJykKICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgZ3JpZC5hcHBlbmRDaGlsZChkb3RzKTsKICAgICAgcmV0dXJuIGdyaWQ7CiAgICB9CgogICAgZnVuY3Rpb24gc3RhdEJveCh2YWx1ZSwgbGFiZWwpIHsKICAgICAgcmV0dXJuIGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzJweCcgfSB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb25vJywgc3R5bGU6IHsgZm9udFNpemU6ICcyMnB4JywgZm9udFdlaWdodDogJzcwMCcgfSwgdGV4dDogU3RyaW5nKHZhbHVlKSB9KSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEycHgnIH0sIHRleHQ6IGxhYmVsIH0pKTsKICAgIH0KCiAgICByZXR1cm4geyByZW5kZXI6IHJlbmRlciB9OwogIH0pKCk7CgogIGZ1bmN0aW9uIG1heWJlQXBwbHlRdWVyeVJlZmVycmFsKHBhcmFtcykgewogICAgdmFyIGNvZGUgPSBudWxsOwogICAgaWYgKHBhcmFtcyAmJiAocGFyYW1zLnIgfHwgcGFyYW1zLnJlZikpIGNvZGUgPSBwYXJhbXMuciB8fCBwYXJhbXMucmVmOwogICAgaWYgKCFjb2RlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHNwID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTsKICAgICAgICBjb2RlID0gc3AuZ2V0KCdyJykgfHwgc3AuZ2V0KCdyZWYnKTsKICAgICAgfSBjYXRjaCAoZSkge30KICAgIH0KICAgIGlmICghY29kZSkgcmV0dXJuOwogICAgY29kZSA9IFN0cmluZyhjb2RlKS50cmltKCkudG9VcHBlckNhc2UoKTsKICAgIGlmICghY29kZSkgcmV0dXJuOwogICAgaWYgKGxzR2V0KCdyZWZlcnJhbEFwcGxpZWQnLCAnJykgPT09IGNvZGUpIHJldHVybjsKICAgIGxzU2V0KCdyZWZlcnJhbENvZGUnLCBjb2RlKTsKICAgIGlmIChWLmFwaSAmJiB0eXBlb2YgVi5hcGkuYXR0cmlidXRlUmVmZXJyYWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgVi5hcGkuYXR0cmlidXRlUmVmZXJyYWwoY29kZSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgbHNTZXQoJ3JlZmVycmFsQXBwbGllZCcsIGNvZGUpOwogICAgICAgIHRvYXN0KCdSZWZlcnJhbCBjb2RlIGFwcGxpZWQ6ICcgKyBjb2RlLCAnc3VjY2VzcycpOwogICAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmNvbmZldHRpID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IFYudWkuY29uZmV0dGkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CiAgICB9CiAgfQoKICBWLmFwcGx5UGVuZGluZ1JlZmVycmFsID0gbWF5YmVBcHBseVF1ZXJ5UmVmZXJyYWw7Cgp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9wYXkuanMgPT09PT0gKi8KKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwogIFYucGF5ID0gVi5wYXkgfHwge307CgogIHZhciBQQUNLUyA9IFsKICAgIHsKICAgICAgaWQ6ICdjcmVkaXRzXzEwMDAnLAogICAgICBjcmVkaXRzOiAxMDAwLAogICAgICBwcmljZTogOS45OSwKICAgICAgcHJpY2VMYWJlbDogJyQ5Ljk5JywKICAgICAgaGVhZGxpbmU6ICdTdGFydGVyJywKICAgICAgYmx1cmI6ICdBIHNvbGlkIHJ1biBvZiBnZW5lcmF0aW9ucyB0byBnZXQgZ29pbmcuJywKICAgICAgYWNjZW50VmFyOiAnLS12LWFjY2VudCcKICAgIH0sCiAgICB7CiAgICAgIGlkOiAnY3JlZGl0c18yNTAwJywKICAgICAgY3JlZGl0czogMjUwMCwKICAgICAgcHJpY2U6IDE5Ljk5LAogICAgICBwcmljZUxhYmVsOiAnJDE5Ljk5JywKICAgICAgaGVhZGxpbmU6ICdDcmVhdG9yJywKICAgICAgYmx1cmI6ICdPdXIgbW9zdCBwb3B1bGFyIHBhY2sg4oCUIGJldHRlciB2YWx1ZSBwZXIgY3JlZGl0LicsCiAgICAgIHBvcHVsYXI6IHRydWUsCiAgICAgIGJvbnVzTGFiZWw6ICcrMjUlIGNyZWRpdHMnLAogICAgICBhY2NlbnRWYXI6ICctLXZhbXAtYWNjZW50JwogICAgfSwKICAgIHsKICAgICAgaWQ6ICdjcmVkaXRzXzYwMDAnLAogICAgICBjcmVkaXRzOiA2MDAwLAogICAgICBwcmljZTogMzkuOTksCiAgICAgIHByaWNlTGFiZWw6ICckMzkuOTknLAogICAgICBoZWFkbGluZTogJ1N0dWRpbycsCiAgICAgIGJsdXJiOiAnQmVzdCB2YWx1ZS4gRm9yIGhlYXZ5LCBiYXRjaCBhbmQgcHJvIHdvcmtmbG93cy4nLAogICAgICBib251c0xhYmVsOiAnKzUwJSBjcmVkaXRzJywKICAgICAgYWNjZW50VmFyOiAnLS12LWFjY2VudC1kZWVwJwogICAgfQogIF07CgogIFBBQ0tTLmZvckVhY2goZnVuY3Rpb24gKHApIHsKICAgIHAucGVyQ3JlZGl0ID0gcC5wcmljZSAvIHAuY3JlZGl0czsKICB9KTsKICB2YXIgQkVTVCA9IFBBQ0tTLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgewogICAgcmV0dXJuIGIucGVyQ3JlZGl0IDwgYS5wZXJDcmVkaXQgPyBiIDogYTsKICB9LCBQQUNLU1swXSk7CgogIFYucGF5LnBhY2tzID0gUEFDS1M7CgogIFYucGF5LnBhY2sgPSBmdW5jdGlvbiAocHJvZHVjdElEKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IFBBQ0tTLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChQQUNLU1tpXS5pZCA9PT0gcHJvZHVjdElEKSByZXR1cm4gUEFDS1NbaV07CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9OwoKICBmdW5jdGlvbiBlbCgpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBWLnVpLmVsLmFwcGx5KFYudWksIGFyZ3VtZW50cyk7CiAgICB9CiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICB2YXIgdGFnID0gYXJncy5zaGlmdCgpOwogICAgdmFyIGF0dHJzID0gKGFyZ3NbMF0gJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdvYmplY3QnICYmICEoYXJnc1swXSBpbnN0YW5jZW9mIE5vZGUpKSA/IGFyZ3Muc2hpZnQoKSA6IHt9OwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBPYmplY3Qua2V5cyhhdHRycyB8fCB7fSkuZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICB2YXIgdiA9IGF0dHJzW2tdOwogICAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09IGZhbHNlKSByZXR1cm47CiAgICAgIGlmIChrID09PSAnY2xhc3MnKSBub2RlLmNsYXNzTmFtZSA9IHY7CiAgICAgIGVsc2UgaWYgKGsgPT09ICd0ZXh0Jykgbm9kZS50ZXh0Q29udGVudCA9IHY7CiAgICAgIGVsc2UgaWYgKGsgPT09ICdodG1sJykgbm9kZS5pbm5lckhUTUwgPSB2OwogICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHYpOwogICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ2RhdGEtJykgPT09IDAgfHwgay5pbmRleE9mKCdhcmlhLScpID09PSAwKSBub2RlLnNldEF0dHJpYnV0ZShrLCB2KTsKICAgICAgZWxzZSBub2RlW2tdID0gdjsKICAgIH0pOwogICAgYXJncy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjID09IG51bGwgfHwgYyA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgbm9kZS5hcHBlbmRDaGlsZChjLm5vZGVUeXBlID8gYyA6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjKSkpOwogICAgfSk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIGljb24obmFtZSkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaWNvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgb3V0ID0gVi51aS5pY29uKG5hbWUpOwogICAgICBpZiAodHlwZW9mIG91dCA9PT0gJ3N0cmluZycpIHsKICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICBzcGFuLmNsYXNzTmFtZSA9ICd2LWljbyc7CiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICBzcGFuLmlubmVySFRNTCA9IG91dDsKICAgICAgICByZXR1cm4gc3BhbjsKICAgICAgfQogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKICB9CgogIGZ1bmN0aW9uIHRvYXN0KG1zZywga2luZCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkudG9hc3QgPT09ICdmdW5jdGlvbicpIFYudWkudG9hc3QobXNnLCBraW5kIHx8ICdpbmZvJyk7CiAgICBlbHNlIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLmVtaXQgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuZW1pdCgndG9hc3QnLCB7IG1lc3NhZ2U6IG1zZywga2luZDoga2luZCB8fCAnaW5mbycgfSk7CiAgfQoKICBmdW5jdGlvbiBjb25mZXR0aSgpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmNvbmZldHRpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7IFYudWkuY29uZmV0dGkoKTsgfSBjYXRjaCAoZSkge30KICAgIH0KICB9CgogIGZ1bmN0aW9uIGdvKGhhc2gpIHsKICAgIGlmIChWLnJvdXRlciAmJiB0eXBlb2YgVi5yb3V0ZXIuZ28gPT09ICdmdW5jdGlvbicpIFYucm91dGVyLmdvKGhhc2gpOwogICAgZWxzZSB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiBiYWxhbmNlKCkgewogICAgdmFyIGMgPSAoVi5zdGF0ZSAmJiBWLnN0YXRlLmNyZWRpdHMpOwogICAgYyA9ICh0eXBlb2YgYyA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoYykpID8gYyA6IChWLnN0b3JlICYmIFYuc3RvcmUuZ2V0ID8gVi5zdG9yZS5nZXQoJ2NyZWRpdHMnKSA6IDApOwogICAgcmV0dXJuICh0eXBlb2YgYyA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoYykpID8gYyA6IDA7CiAgfQoKICBmdW5jdGlvbiBpc0F1dGhlZCgpIHsKICAgIHJldHVybiAhIShWLmF1dGggJiYgdHlwZW9mIFYuYXV0aC5pc0F1dGhlZCA9PT0gJ2Z1bmN0aW9uJyAmJiBWLmF1dGguaXNBdXRoZWQoKSk7CiAgfQoKICBmdW5jdGlvbiBmbXRJbnQobikgewogICAgdHJ5IHsgcmV0dXJuIE51bWJlcihuKS50b0xvY2FsZVN0cmluZygnZW4tVVMnKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gU3RyaW5nKG4pOyB9CiAgfQoKICBWLnBheS5yZWZyZXNoQ3JlZGl0cyA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICghaXNBdXRoZWQoKSB8fCAhVi5hcGkgfHwgdHlwZW9mIFYuYXBpLmNyZWRpdHMgIT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShiYWxhbmNlKCkpOwogICAgfQogICAgcmV0dXJuIFYuYXBpLmNyZWRpdHMoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgdmFyIG4gPSByZXMgJiYgdHlwZW9mIHJlcy5jcmVkaXRzICE9PSAndW5kZWZpbmVkJyA/IHBhcnNlSW50KHJlcy5jcmVkaXRzLCAxMCkgOiBOYU47CiAgICAgIGlmICghaXNGaW5pdGUobikpIG4gPSBiYWxhbmNlKCk7CiAgICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLnNldCA9PT0gJ2Z1bmN0aW9uJykgVi5zdG9yZS5zZXQoJ2NyZWRpdHMnLCBuKTsKICAgICAgZWxzZSBpZiAoVi5zdGF0ZSkgVi5zdGF0ZS5jcmVkaXRzID0gbjsKICAgICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuZW1pdCA9PT0gJ2Z1bmN0aW9uJykgVi5zdG9yZS5lbWl0KCdjcmVkaXRzOmNoYW5nZWQnLCBuKTsKICAgICAgcmV0dXJuIG47CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBiYWxhbmNlKCk7CiAgICB9KTsKICB9OwoKICBWLnBheS5yZXF1aXJlQ3JlZGl0cyA9IGZ1bmN0aW9uIChjb3N0KSB7CiAgICB2YXIgbmVlZCA9IHBhcnNlSW50KGNvc3QsIDEwKTsKICAgIGlmICghaXNGaW5pdGUobmVlZCkgfHwgbmVlZCA8PSAwKSByZXR1cm4gdHJ1ZTsKICAgIHZhciBoYXZlID0gYmFsYW5jZSgpOwogICAgaWYgKGhhdmUgPj0gbmVlZCkgcmV0dXJuIHRydWU7CiAgICB2YXIgc2hvcnQgPSBuZWVkIC0gaGF2ZTsKICAgIHRvYXN0KAogICAgICBoYXZlIDw9IDAKICAgICAgICA/ICJZb3UncmUgb3V0IG9mIGNyZWRpdHMg4oCUIGFkZCBtb3JlIHRvIGtlZXAgY3JlYXRpbmcuIgogICAgICAgIDogJ05vdCBlbm91Z2ggY3JlZGl0cyDigJQgeW91IG5lZWQgJyArIGZtdEludChzaG9ydCkgKyAnIG1vcmUuJywKICAgICAgJ3dhcm5pbmcnCiAgICApOwogICAgVi5wYXkub3Blbih7IG5lZWQ6IG5lZWQsIGNvc3Q6IG5lZWQgfSk7CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgVi5wYXkub3BlbiA9IGZ1bmN0aW9uIChvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBuZWVkID0gcGFyc2VJbnQob3B0cy5uZWVkICE9IG51bGwgPyBvcHRzLm5lZWQgOiBvcHRzLmNvc3QsIDEwKTsKICAgIHZhciBxID0gJyc7CiAgICBpZiAoaXNGaW5pdGUobmVlZCkgJiYgbmVlZCA+IDApIHEgPSAnP25lZWQ9JyArIG5lZWQ7CiAgICBnbygnIy9wYXl3YWxsJyArIHEpOwogIH07CgogIFYucGF5LmJ1eSA9IGZ1bmN0aW9uIChwcm9kdWN0SUQsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIHBhY2sgPSBWLnBheS5wYWNrKHByb2R1Y3RJRCk7CiAgICBpZiAoIXBhY2spIHsKICAgICAgdG9hc3QoJ1RoYXQgcGFjayBpcyB1bmF2YWlsYWJsZSByaWdodCBub3cuJywgJ2Vycm9yJyk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwogICAgfQogICAgaWYgKCFpc0F1dGhlZCgpKSB7CiAgICAgIHRvYXN0KCdTaWduIGluIHRvIGFkZCBjcmVkaXRzLicsICdpbmZvJyk7CiAgICAgIGdvKCcjL2F1dGg/bmV4dD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KCcjL3BheXdhbGwnKSk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwogICAgfQogICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkuY2hlY2tvdXQgIT09ICdmdW5jdGlvbicpIHsKICAgICAgdG9hc3QoJ0NoZWNrb3V0IGlzbuKAmXQgYXZhaWxhYmxlIHlldC4gUGxlYXNlIHRyeSBhZ2FpbiBzb29uLicsICdlcnJvcicpOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsKICAgIH0KCiAgICB2YXIgYnRuID0gb3B0cy5idXR0b24gfHwgbnVsbDsKICAgIHZhciByZXN0b3JlID0gbG9ja0J1dHRvbihidG4sICdSZWRpcmVjdGluZ+KApicpOwoKICAgIHJldHVybiBWLmFwaS5jaGVja291dChwcm9kdWN0SUQpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICB2YXIgdXJsID0gcmVzICYmIHJlcy51cmw7CiAgICAgIGlmICghdXJsIHx8IHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduby11cmwnKTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3ZhbXBfcGF5X3BlbmRpbmcnLCBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICBwcm9kdWN0SUQ6IHByb2R1Y3RJRCwgY3JlZGl0czogcGFjay5jcmVkaXRzLCBhdDogRGF0ZS5ub3coKQogICAgICAgIH0pKTsKICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgdG9hc3QoJ09wZW5pbmcgc2VjdXJlIGNoZWNrb3V04oCmJywgJ2luZm8nKTsKICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmwpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgcmVzdG9yZSgpOwogICAgICB2YXIgc3RhdHVzID0gZXJyICYmIChlcnIuc3RhdHVzIHx8IGVyci5jb2RlKTsKICAgICAgaWYgKHN0YXR1cyA9PT0gNDA0IHx8IHN0YXR1cyA9PT0gNDA1IHx8IHN0YXR1cyA9PT0gNTAxIHx8IHN0YXR1cyA9PT0gNTAzKSB7CiAgICAgICAgdG9hc3QoJ0NyZWRpdCBwdXJjaGFzZXMgYXJlIGxhdW5jaGluZyBzb29uIOKAlCBjaGVja291dCBpc27igJl0IGxpdmUgeWV0LicsICd3YXJuaW5nJyk7CiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHsKICAgICAgICB0b2FzdCgnWW91ciBzZXNzaW9uIGV4cGlyZWQuIFBsZWFzZSBzaWduIGluIGFnYWluLicsICdlcnJvcicpOwogICAgICAgIGdvKCcjL2F1dGg/bmV4dD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KCcjL3BheXdhbGwnKSk7CiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MjkpIHsKICAgICAgICB0b2FzdCgnVG9vIG1hbnkgYXR0ZW1wdHMg4oCUIGdpdmUgaXQgYSBtb21lbnQgYW5kIHJldHJ5LicsICd3YXJuaW5nJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9hc3QoJ0NvdWxkbuKAmXQgc3RhcnQgY2hlY2tvdXQuIFBsZWFzZSB0cnkgYWdhaW4uJywgJ2Vycm9yJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CiAgfTsKCiAgZnVuY3Rpb24gbG9ja0J1dHRvbihidG4sIGxhYmVsKSB7CiAgICBpZiAoIWJ0bikgcmV0dXJuIGZ1bmN0aW9uICgpIHt9OwogICAgdmFyIHByZXZIdG1sID0gYnRuLmlubmVySFRNTDsKICAgIHZhciBwcmV2RGlzYWJsZWQgPSBidG4uZGlzYWJsZWQ7CiAgICBidG4uZGlzYWJsZWQgPSB0cnVlOwogICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1idXN5JywgJ3RydWUnKTsKICAgIGJ0bi5jbGFzc0xpc3QuYWRkKCdpcy1sb2FkaW5nJyk7CiAgICB2YXIgc3AgPSAoVi51aSAmJiB0eXBlb2YgVi51aS5zcGlubmVyID09PSAnZnVuY3Rpb24nKSA/IFYudWkuc3Bpbm5lcigpIDogbnVsbDsKICAgIGJ0bi5pbm5lckhUTUwgPSAnJzsKICAgIGlmIChzcCkgYnRuLmFwcGVuZENoaWxkKHNwLm5vZGVUeXBlID8gc3AgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJykpOwogICAgYnRuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgJyArIChsYWJlbCB8fCAnV29ya2luZ+KApicpKSk7CiAgICByZXR1cm4gZnVuY3Rpb24gcmVzdG9yZSgpIHsKICAgICAgYnRuLmRpc2FibGVkID0gcHJldkRpc2FibGVkOwogICAgICBidG4ucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWJ1c3knKTsKICAgICAgYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWxvYWRpbmcnKTsKICAgICAgYnRuLmlubmVySFRNTCA9IHByZXZIdG1sOwogICAgfTsKICB9CgogIFYucGF5LmhhbmRsZVB1cmNoYXNlUmV0dXJuID0gZnVuY3Rpb24gKHBhcmFtcykgewogICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgdmFyIHN0YXR1cyA9IHBhcmFtcy5wdXJjaGFzZSB8fCBwYXJhbXMuY2hlY2tvdXQ7CgogICAgaWYgKHN0YXR1cyA9PT0gJ2NhbmNlbCcgfHwgc3RhdHVzID09PSAnY2FuY2VsbGVkJyB8fCBzdGF0dXMgPT09ICdjYW5jZWxlZCcpIHsKICAgICAgY2xlYXJQZW5kaW5nKCk7CiAgICAgIHRvYXN0KCdDaGVja291dCBjYW5jZWxlZCDigJQgbm8gY2hhcmdlIHdhcyBtYWRlLicsICdpbmZvJyk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYmFsYW5jZSgpKTsKICAgIH0KICAgIGlmIChzdGF0dXMgIT09ICdzdWNjZXNzJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShiYWxhbmNlKCkpOwoKICAgIHZhciBwZW5kaW5nID0gcmVhZFBlbmRpbmcoKTsKICAgIGNsZWFyUGVuZGluZygpOwogICAgdmFyIGJlZm9yZSA9IGJhbGFuY2UoKTsKCiAgICByZXR1cm4gcG9sbENyZWRpdHNVbnRpbENoYW5nZWQoYmVmb3JlLCBwZW5kaW5nID8gcGVuZGluZy5jcmVkaXRzIDogMCkudGhlbihmdW5jdGlvbiAoYWZ0ZXIpIHsKICAgICAgdmFyIGdhaW5lZCA9ICh0eXBlb2YgYWZ0ZXIgPT09ICdudW1iZXInICYmIHR5cGVvZiBiZWZvcmUgPT09ICdudW1iZXInKSA/IChhZnRlciAtIGJlZm9yZSkgOiAwOwogICAgICBjb25mZXR0aSgpOwogICAgICBpZiAoZ2FpbmVkID4gMCkgewogICAgICAgIHRvYXN0KCdQYXltZW50IGNvbXBsZXRlIOKAlCAnICsgZm10SW50KGdhaW5lZCkgKyAnIGNyZWRpdHMgYWRkZWQuJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSBlbHNlIGlmIChwZW5kaW5nICYmIHBlbmRpbmcuY3JlZGl0cykgewogICAgICAgIHRvYXN0KCdQYXltZW50IHJlY2VpdmVkIOKAlCAnICsgZm10SW50KHBlbmRpbmcuY3JlZGl0cykgKyAnIGNyZWRpdHMgYXJlIG9uIHRoZSB3YXkuJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2FzdCgnUGF5bWVudCBjb21wbGV0ZSDigJQgY3JlZGl0cyBhZGRlZC4nLCAnc3VjY2VzcycpOwogICAgICB9CiAgICAgIHJldHVybiBhZnRlcjsKICAgIH0pOwogIH07CgogIGZ1bmN0aW9uIHBvbGxDcmVkaXRzVW50aWxDaGFuZ2VkKGJlZm9yZSwgZXhwZWN0ZWRHYWluKSB7CiAgICB2YXIgYXR0ZW1wdHMgPSAwOwogICAgdmFyIG1heCA9IDY7CiAgICBmdW5jdGlvbiB0aWNrKCkgewogICAgICByZXR1cm4gVi5wYXkucmVmcmVzaENyZWRpdHMoKS50aGVuKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgYXR0ZW1wdHMrKzsKICAgICAgICB2YXIgY2hhbmdlZCA9ICh0eXBlb2YgbiA9PT0gJ251bWJlcicgJiYgbiA+IGJlZm9yZSk7CiAgICAgICAgaWYgKGNoYW5nZWQgfHwgYXR0ZW1wdHMgPj0gbWF4KSByZXR1cm4gbjsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXNvbHZlKHRpY2soKSk7IH0sIDE1MDApOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiB0aWNrKCk7CiAgfQoKICBmdW5jdGlvbiByZWFkUGVuZGluZygpIHsKICAgIHRyeSB7CiAgICAgIHZhciByYXcgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd2YW1wX3BheV9wZW5kaW5nJyk7CiAgICAgIHJldHVybiByYXcgPyBKU09OLnBhcnNlKHJhdykgOiBudWxsOwogICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogIH0KICBmdW5jdGlvbiBjbGVhclBlbmRpbmcoKSB7CiAgICB0cnkgeyBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCd2YW1wX3BheV9wZW5kaW5nJyk7IH0gY2F0Y2ggKGUpIHt9CiAgfQoKICB2YXIgdmlldyA9IHt9OwogIHZhciBfY2xlYW51cCA9IFtdOwogIHZhciBfaG9zdEVsID0gbnVsbDsKCiAgZnVuY3Rpb24gb24odGFyZ2V0LCBldnQsIGZuLCBvcHRzKSB7CiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldnQsIGZuLCBvcHRzKTsKICAgIF9jbGVhbnVwLnB1c2goZnVuY3Rpb24gKCkgeyB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnQsIGZuLCBvcHRzKTsgfSk7CiAgfQoKICB2aWV3LnJlbmRlciA9IGZ1bmN0aW9uIChyb290LCBwYXJhbXMpIHsKICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTsKICAgIHRlYXJkb3duSW50ZXJuYWwoKTsKICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICByb290LmNsYXNzTGlzdC5hZGQoJ3YtcGF5d2FsbC1ob3N0Jyk7CiAgICBfaG9zdEVsID0gcm9vdDsKCiAgICB2YXIgbmVlZCA9IHBhcnNlSW50KHBhcmFtcy5uZWVkLCAxMCk7CiAgICB2YXIgaGFzTmVlZCA9IGlzRmluaXRlKG5lZWQpICYmIG5lZWQgPiAwOwogICAgdmFyIGhhdmUgPSBiYWxhbmNlKCk7CiAgICB2YXIgc2hvcnRmYWxsID0gaGFzTmVlZCA/IE1hdGgubWF4KDAsIG5lZWQgLSBoYXZlKSA6IDA7CgogICAgcm9vdC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtcGF5d2FsbF9fYmFja2Ryb3AnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSkpOwoKICAgIHZhciBwYWdlID0gZWwoJ3NlY3Rpb24nLCB7IGNsYXNzOiAndi1wYXl3YWxsJywgJ2FyaWEtbGFiZWwnOiAnQWRkIGNyZWRpdHMnIH0pOwoKICAgIHZhciBoZWFkZXIgPSBlbCgnaGVhZGVyJywgeyBjbGFzczogJ3YtcGF5d2FsbF9faGVhZCcgfSk7CiAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnIH0sICdDcmVkaXRzJykpOwogICAgaGVhZGVyLmFwcGVuZENoaWxkKGVsKCdoMScsIHsgY2xhc3M6ICd2LXBheXdhbGxfX3RpdGxlIHYtZ3JhZGllbnQnIH0sICdQb3dlciB5b3VyIGltYWdpbmF0aW9uJykpOwoKICAgIHZhciBzdWIgPSBoYXNOZWVkCiAgICAgID8gKHNob3J0ZmFsbCA+IDAKICAgICAgICAgID8gJ1RoaXMgZ2VuZXJhdGlvbiBuZWVkcyAnICsgZm10SW50KG5lZWQpICsgJyBjcmVkaXRzIOKAlCB5b3UgaGF2ZSAnICsgZm10SW50KGhhdmUpICsgJy4gQWRkICcgKyBmbXRJbnQoc2hvcnRmYWxsKSArICcgb3IgbW9yZSB0byBjb250aW51ZS4nCiAgICAgICAgICA6ICJZb3UncmUgc2V0IOKAlCBidXQgaGVyZSdzIG1vcmUgaWYgeW91IHdhbnQgYSBiaWdnZXIgcnVuLiIpCiAgICAgIDogJ0J1eSBjcmVkaXRzIG9uY2UsIHVzZSB0aGVtIGFueXRpbWUuIEV2ZXJ5IGdlbmVyYXRpb24gc3BlbmRzIGNyZWRpdHMgYmFzZWQgb24gdGhlIG1vZGVsIGFuZCBpbWFnZSBjb3VudC4nOwogICAgaGVhZGVyLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtcGF5d2FsbF9fc3ViJyB9LCBzdWIpKTsKCiAgICB2YXIgYmFsUm93ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2JhbGFuY2UnIH0pOwogICAgdmFyIHBpbGwgPSAoVi51aSAmJiB0eXBlb2YgVi51aS5jcmVkaXRzUGlsbCA9PT0gJ2Z1bmN0aW9uJykgPyBWLnVpLmNyZWRpdHNQaWxsKGhhdmUpIDogZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVkaXRzJyB9LCBmbXRJbnQoaGF2ZSkgKyAnIGNyZWRpdHMnKTsKICAgIGJhbFJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2JhbGFuY2UtbGFiZWwnIH0sICdDdXJyZW50IGJhbGFuY2UnKSk7CiAgICBiYWxSb3cuYXBwZW5kQ2hpbGQocGlsbCk7CiAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoYmFsUm93KTsKCiAgICBwYWdlLmFwcGVuZENoaWxkKGhlYWRlcik7CgogICAgdmFyIGdyaWQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZ3JpZCB2LWdyaWQtLTMgdi1wYXl3YWxsX19ncmlkJyB9KTsKICAgIFBBQ0tTLmZvckVhY2goZnVuY3Rpb24gKHApIHsKICAgICAgZ3JpZC5hcHBlbmRDaGlsZChwYWNrQ2FyZChwLCB7IHJlY29tbWVuZFNob3J0ZmFsbDogc2hvcnRmYWxsIH0pKTsKICAgIH0pOwogICAgcGFnZS5hcHBlbmRDaGlsZChncmlkKTsKCiAgICB2YXIgZmluZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19maW5lIGdsYXNzLWNhcmQnIH0pOwogICAgWwogICAgICB7IGljOiAnc3BhcmtsZXMnLCB0OiAnQ3JlZGl0cyBuZXZlciBleHBpcmUnLCBkOiAnVXNlIHRoZW0gd2hlbmV2ZXIgaW5zcGlyYXRpb24gc3RyaWtlcy4nIH0sCiAgICAgIHsgaWM6ICdsb2NrJywgdDogJ1NlY3VyZSBjaGVja291dCcsIGQ6ICdQYXltZW50cyBoYW5kbGVkIGJ5IFN0cmlwZS4gV2UgbmV2ZXIgc2VlIHlvdXIgY2FyZC4nIH0sCiAgICAgIHsgaWM6ICdib2x0JywgdDogJ0luc3RhbnQgdG9wLXVwJywgZDogJ0NyZWRpdHMgbGFuZCBvbiB5b3VyIGFjY291bnQgbW9tZW50cyBhZnRlciBwYXltZW50LicgfQogICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7CiAgICAgIHZhciBpdGVtID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2ZpbmUtaXRlbScgfSk7CiAgICAgIGl0ZW0uYXBwZW5kQ2hpbGQoaWNvbihmLmljKSk7CiAgICAgIHZhciB0eHQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcGF5d2FsbF9fZmluZS10ZXh0JyB9KTsKICAgICAgdHh0LmFwcGVuZENoaWxkKGVsKCdzdHJvbmcnLCB7fSwgZi50KSk7CiAgICAgIHR4dC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHt9LCBmLmQpKTsKICAgICAgaXRlbS5hcHBlbmRDaGlsZCh0eHQpOwogICAgICBmaW5lLmFwcGVuZENoaWxkKGl0ZW0pOwogICAgfSk7CiAgICBwYWdlLmFwcGVuZENoaWxkKGZpbmUpOwoKICAgIHZhciBmb290ZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcGF5d2FsbF9fZm9vdCcgfSk7CiAgICB2YXIgYmFjayA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0JywgdHlwZTogJ2J1dHRvbicgfSwgJ01heWJlIGxhdGVyJyk7CiAgICBvbihiYWNrLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICh3aW5kb3cuaGlzdG9yeS5sZW5ndGggPiAxKSB3aW5kb3cuaGlzdG9yeS5iYWNrKCk7CiAgICAgIGVsc2UgZ28oJyMvY3JlYXRlJyk7CiAgICB9KTsKICAgIGZvb3Rlci5hcHBlbmRDaGlsZChiYWNrKTsKCiAgICB2YXIgcmVzdG9yZU5vdGUgPSBlbCgncCcsIHsgY2xhc3M6ICd2LXBheXdhbGxfX25vdGUnIH0pOwogICAgcmVzdG9yZU5vdGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ0FscmVhZHkgcGFpZCBidXQgZG9u4oCZdCBzZWUgeW91ciBjcmVkaXRzPyAnKSk7CiAgICB2YXIgcmVmcmVzaEJ0biA9IGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtbGluaycsICdkYXRhLXJlZnJlc2gnOiAndHJ1ZScgfSwgJ1JlZnJlc2ggYmFsYW5jZScpOwogICAgcmVzdG9yZU5vdGUuYXBwZW5kQ2hpbGQocmVmcmVzaEJ0bik7CiAgICBmb290ZXIuYXBwZW5kQ2hpbGQocmVzdG9yZU5vdGUpOwogICAgcGFnZS5hcHBlbmRDaGlsZChmb290ZXIpOwoKICAgIGlmIChyZWZyZXNoQnRuKSB7CiAgICAgIG9uKHJlZnJlc2hCdG4sICdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZWZyZXNoQnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICByZWZyZXNoQnRuLnRleHRDb250ZW50ID0gJ1JlZnJlc2hpbmfigKYnOwogICAgICAgIFYucGF5LnJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgewogICAgICAgICAgcmVmcmVzaEJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgcmVmcmVzaEJ0bi50ZXh0Q29udGVudCA9ICdSZWZyZXNoIGJhbGFuY2UnOwogICAgICAgICAgdXBkYXRlQmFsYW5jZVBpbGwocGFnZSwgbik7CiAgICAgICAgICB0b2FzdCgnQmFsYW5jZSB1cGRhdGVkOiAnICsgZm10SW50KG4pICsgJyBjcmVkaXRzLicsICdpbmZvJyk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQoKICAgIHJvb3QuYXBwZW5kQ2hpbGQocGFnZSk7CgogICAgdmFyIG9uQ3JlZGl0cyA9IGZ1bmN0aW9uIChuKSB7IHVwZGF0ZUJhbGFuY2VQaWxsKHBhZ2UsIHR5cGVvZiBuID09PSAnbnVtYmVyJyA/IG4gOiBiYWxhbmNlKCkpOyB9OwogICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUub24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgVi5zdG9yZS5vbignY3JlZGl0czpjaGFuZ2VkJywgb25DcmVkaXRzKTsKICAgICAgX2NsZWFudXAucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHR5cGVvZiBWLnN0b3JlLm9mZiA9PT0gJ2Z1bmN0aW9uJykgVi5zdG9yZS5vZmYoJ2NyZWRpdHM6Y2hhbmdlZCcsIG9uQ3JlZGl0cyk7CiAgICAgIH0pOwogICAgfQoKICAgIFYucGF5LnJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgeyB1cGRhdGVCYWxhbmNlUGlsbChwYWdlLCBuKTsgfSk7CgogICAgdmFyIHByaW1hcnlDdGEgPSBwYWdlLnF1ZXJ5U2VsZWN0b3IoJy52LWNhcmQtLXBvcHVsYXIgLnYtY3RhLS1wcmltYXJ5JykgfHwgcGFnZS5xdWVyeVNlbGVjdG9yKCcudi1jdGEtLXByaW1hcnknKTsKICAgIGlmIChwcmltYXJ5Q3RhKSB7CiAgICAgIHRyeSB7IHByaW1hcnlDdGEuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pOyB9IGNhdGNoIChlKSB7IHByaW1hcnlDdGEuZm9jdXMoKTsgfQogICAgfQogIH07CgogIGZ1bmN0aW9uIHVwZGF0ZUJhbGFuY2VQaWxsKHBhZ2UsIG4pIHsKICAgIGlmICghcGFnZSkgcmV0dXJuOwogICAgdmFyIGhvbGRlciA9IHBhZ2UucXVlcnlTZWxlY3RvcignLnYtcGF5d2FsbF9fYmFsYW5jZScpOwogICAgaWYgKCFob2xkZXIpIHJldHVybjsKICAgIHZhciBmcmVzaCA9IChWLnVpICYmIHR5cGVvZiBWLnVpLmNyZWRpdHNQaWxsID09PSAnZnVuY3Rpb24nKSA/IFYudWkuY3JlZGl0c1BpbGwobikgOiBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHMnIH0sIGZtdEludChuKSArICcgY3JlZGl0cycpOwogICAgdmFyIG9sZCA9IGhvbGRlci5xdWVyeVNlbGVjdG9yKCcudi1jcmVkaXRzLCBbZGF0YS1jcmVkaXRzLXBpbGxdJyk7CiAgICBpZiAob2xkKSBob2xkZXIucmVwbGFjZUNoaWxkKGZyZXNoLCBvbGQpOwogICAgZWxzZSBob2xkZXIuYXBwZW5kQ2hpbGQoZnJlc2gpOwogIH0KCiAgZnVuY3Rpb24gcGFja0NhcmQocCwgY3R4KSB7CiAgICBjdHggPSBjdHggfHwge307CiAgICB2YXIgY2xhc3NlcyA9ICd2LWNhcmQgZ2xhc3MtY2FyZCB2LXBheXdhbGxfX3BhY2snOwogICAgaWYgKHAucG9wdWxhcikgY2xhc3NlcyArPSAnIHYtY2FyZC0tcG9wdWxhcic7CiAgICBpZiAocC5pZCA9PT0gQkVTVC5pZCkgY2xhc3NlcyArPSAnIHYtY2FyZC0tYmVzdCc7CgogICAgdmFyIGNhcmQgPSBlbCgnYXJ0aWNsZScsIHsKICAgICAgY2xhc3M6IGNsYXNzZXMsCiAgICAgICdkYXRhLXByb2R1Y3QnOiBwLmlkLAogICAgICBzdHlsZTogJy0tcGFjay1hY2NlbnQ6IHZhcignICsgcC5hY2NlbnRWYXIgKyAnKScKICAgIH0pOwoKICAgIGlmIChwLnBvcHVsYXIpIHsKICAgICAgY2FyZC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2JhZGdlIHYtcGF5d2FsbF9fYmFkZ2UtLXBvcHVsYXInIH0sICdNb3N0IHBvcHVsYXInKSk7CiAgICB9IGVsc2UgaWYgKHAuaWQgPT09IEJFU1QuaWQpIHsKICAgICAgY2FyZC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2JhZGdlIHYtcGF5d2FsbF9fYmFkZ2UtLWJlc3QnIH0sICdCZXN0IHZhbHVlJykpOwogICAgfQoKICAgIHZhciBoZWFkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX3BhY2staGVhZCcgfSk7CiAgICBoZWFkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1leWVicm93JyB9LCBwLmhlYWRsaW5lKSk7CiAgICB2YXIgY3JlZGl0c0JpZyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19jcmVkaXRzJyB9KTsKICAgIGNyZWRpdHNCaWcuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1wYXl3YWxsX19jcmVkaXRzLW51bScgfSwgZm10SW50KHAuY3JlZGl0cykpKTsKICAgIGNyZWRpdHNCaWcuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1wYXl3YWxsX19jcmVkaXRzLXVuaXQnIH0sICdjcmVkaXRzJykpOwogICAgaGVhZC5hcHBlbmRDaGlsZChjcmVkaXRzQmlnKTsKICAgIGlmIChwLmJvbnVzTGFiZWwpIGhlYWQuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1wYXl3YWxsX19ib251cycgfSwgcC5ib251c0xhYmVsKSk7CiAgICBjYXJkLmFwcGVuZENoaWxkKGhlYWQpOwoKICAgIHZhciBwcmljZVJvdyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19wcmljZScgfSk7CiAgICBwcmljZVJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX3ByaWNlLWFtdCcgfSwgcC5wcmljZUxhYmVsKSk7CiAgICB2YXIgcGVyID0gKHAucHJpY2UgLyBwLmNyZWRpdHMgKiAxMDAwKTsKICAgIHByaWNlUm93LmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtcGF5d2FsbF9fcHJpY2UtcGVyJyB9LCAnJCcgKyBwZXIudG9GaXhlZCgyKSArICcgLyAxLDAwMCcpKTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQocHJpY2VSb3cpOwoKICAgIGNhcmQuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19wYWNrLWJsdXJiJyB9LCBwLmJsdXJiKSk7CgogICAgdmFyIGFwcHJveCA9IE1hdGguZmxvb3IocC5jcmVkaXRzIC8gMTApOwogICAgdmFyIGZlYXQgPSBlbCgndWwnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19mZWF0cycgfSk7CiAgICBbCiAgICAgICd+JyArIGZtdEludChhcHByb3gpICsgJyBTdGFuZGFyZCBnZW5lcmF0aW9ucycsCiAgICAgICdXb3JrcyB3aXRoIGV2ZXJ5IG1vZGVsJywKICAgICAgJ0NyZWRpdHMgbmV2ZXIgZXhwaXJlJwogICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7CiAgICAgIHZhciBsaSA9IGVsKCdsaScsIHt9KTsKICAgICAgbGkuYXBwZW5kQ2hpbGQoaWNvbignY2hlY2snKSk7CiAgICAgIGxpLmFwcGVuZENoaWxkKGVsKCdzcGFuJywge30sIGxpbmUpKTsKICAgICAgZmVhdC5hcHBlbmRDaGlsZChsaSk7CiAgICB9KTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoZmVhdCk7CgogICAgdmFyIGJ1eUNsYXNzID0gcC5wb3B1bGFyID8gJ3YtY3RhIHYtY3RhLS1wcmltYXJ5IHYtY3RhLS1ibG9jaycgOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1ibG9jayc7CiAgICB2YXIgYnV5ID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6IGJ1eUNsYXNzLAogICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgJ2FyaWEtbGFiZWwnOiAnQnV5ICcgKyBmbXRJbnQocC5jcmVkaXRzKSArICcgY3JlZGl0cyBmb3IgJyArIHAucHJpY2VMYWJlbAogICAgfSwgJ0dldCAnICsgZm10SW50KHAuY3JlZGl0cykgKyAnIGNyZWRpdHMnKTsKICAgIG9uKGJ1eSwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICBpZiAoYnV5LmRpc2FibGVkKSByZXR1cm47CiAgICAgIFYucGF5LmJ1eShwLmlkLCB7IGJ1dHRvbjogYnV5IH0pOwogICAgfSk7CiAgICBjYXJkLmFwcGVuZENoaWxkKGJ1eSk7CgogICAgaWYgKGN0eC5yZWNvbW1lbmRTaG9ydGZhbGwgJiYgcC5jcmVkaXRzID49IGN0eC5yZWNvbW1lbmRTaG9ydGZhbGwgJiYgIXAucG9wdWxhcikgewogICAgICB2YXIgaGludCA9IGVsKCdzcGFuJywgeyBjbGFzczogJ3YtcGF5d2FsbF9fY292ZXInIH0sICdDb3ZlcnMgd2hhdCB5b3UgbmVlZCcpOwogICAgICB2YXIgc21hbGxlciA9IFBBQ0tTLmZpbHRlcihmdW5jdGlvbiAocSkgeyByZXR1cm4gcS5jcmVkaXRzID49IGN0eC5yZWNvbW1lbmRTaG9ydGZhbGw7IH0pOwogICAgICBpZiAoc21hbGxlci5sZW5ndGggJiYgc21hbGxlclswXS5pZCA9PT0gcC5pZCkgY2FyZC5hcHBlbmRDaGlsZChoaW50KTsKICAgIH0KCiAgICByZXR1cm4gY2FyZDsKICB9CgogIGZ1bmN0aW9uIHRlYXJkb3duSW50ZXJuYWwoKSB7CiAgICB3aGlsZSAoX2NsZWFudXAubGVuZ3RoKSB7CiAgICAgIHZhciBmbiA9IF9jbGVhbnVwLnBvcCgpOwogICAgICB0cnkgeyBmbigpOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgaWYgKF9ob3N0RWwpIHsKICAgICAgX2hvc3RFbC5jbGFzc0xpc3QucmVtb3ZlKCd2LXBheXdhbGwtaG9zdCcpOwogICAgICBfaG9zdEVsID0gbnVsbDsKICAgIH0KICB9CgogIHZpZXcudGVhcmRvd24gPSBmdW5jdGlvbiAoKSB7IHRlYXJkb3duSW50ZXJuYWwoKTsgfTsKCiAgVi52aWV3cy5wYXl3YWxsID0gdmlldzsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvYXV0aC12aWV3LmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLnZpZXdzID0gVi52aWV3cyB8fCB7fTsKCiAgZnVuY3Rpb24gZWwodGFnLCBhdHRycykgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuZWwgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnVpLmVsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIHZhciBpID0gMTsKICAgIGlmIChhdHRycyAmJiB0eXBlb2YgYXR0cnMgPT09ICdvYmplY3QnICYmICEoYXR0cnMgaW5zdGFuY2VvZiBOb2RlKSAmJiB0eXBlb2YgYXR0cnMgIT09ICdzdHJpbmcnKSB7CiAgICAgIGkgPSAyOwogICAgICBmb3IgKHZhciBrIGluIGF0dHJzKSB7CiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cnMsIGspKSBjb250aW51ZTsKICAgICAgICB2YXIgdmFsID0gYXR0cnNba107CiAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gZmFsc2UpIGNvbnRpbnVlOwogICAgICAgIGlmIChrID09PSAnY2xhc3MnIHx8IGsgPT09ICdjbGFzc05hbWUnKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAndGV4dCcpIG5vZGUudGV4dENvbnRlbnQgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ2h0bWwnKSBub2RlLmlubmVySFRNTCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgbm9kZS5hZGRFdmVudExpc3RlbmVyKGsuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgdmFsKTsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ2RhdGEtJykgPT09IDAgfHwgay5pbmRleE9mKCdhcmlhLScpID09PSAwKSBub2RlLnNldEF0dHJpYnV0ZShrLCB2YWwpOwogICAgICAgIGVsc2UgaWYgKHZhbCA9PT0gdHJ1ZSkgbm9kZS5zZXRBdHRyaWJ1dGUoaywgJycpOwogICAgICAgIGVsc2UgeyB0cnkgeyBub2RlW2tdID0gdmFsOyB9IGNhdGNoIChlKSB7IG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7IH0gfQogICAgICB9CiAgICB9IGVsc2UgaWYgKGF0dHJzICE9IG51bGwpIHsgYXBwZW5kQ2hpbGQobm9kZSwgYXR0cnMpOyB9CiAgICBmb3IgKDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXBwZW5kQ2hpbGQobm9kZSwgYXJndW1lbnRzW2ldKTsKICAgIHJldHVybiBub2RlOwogIH0KICBmdW5jdGlvbiBhcHBlbmRDaGlsZChub2RlLCBjKSB7CiAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlIHx8IGMgPT09IHRydWUpIHJldHVybjsKICAgIGlmIChBcnJheS5pc0FycmF5KGMpKSB7IGMuZm9yRWFjaChmdW5jdGlvbiAoeCkgeyBhcHBlbmRDaGlsZChub2RlLCB4KTsgfSk7IHJldHVybjsgfQogICAgbm9kZS5hcHBlbmRDaGlsZChjLm5vZGVUeXBlID8gYyA6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjKSkpOwogIH0KCiAgZnVuY3Rpb24gdG9hc3QobXNnLCBraW5kKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS50b2FzdCA9PT0gJ2Z1bmN0aW9uJykgeyBWLnVpLnRvYXN0KG1zZywga2luZCB8fCAnaW5mbycpOyByZXR1cm47IH0KICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLmVtaXQgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuZW1pdCgndG9hc3QnLCB7IG1zZzogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsKICB9CiAgZnVuY3Rpb24gZ28oaGFzaCkgewogICAgaWYgKFYucm91dGVyICYmIHR5cGVvZiBWLnJvdXRlci5nbyA9PT0gJ2Z1bmN0aW9uJykgVi5yb3V0ZXIuZ28oaGFzaCk7CiAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gaGFzaDsKICB9CiAgZnVuY3Rpb24gaXNFbWFpbChzKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwuaXNFbWFpbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudXRpbC5pc0VtYWlsKHMpOwogICAgcmV0dXJuIC9eW15cc0BdK0BbXlxzQF0rXC5bXlxzQF0rJC8udGVzdChTdHJpbmcocyB8fCAnJykudHJpbSgpKTsKICB9CiAgZnVuY3Rpb24gc3Bpbm5lcigpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnNwaW5uZXIgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgdmFyIHMgPSBWLnVpLnNwaW5uZXIoKTsgaWYgKHMgJiYgcy5ub2RlVHlwZSkgcmV0dXJuIHM7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIHJldHVybiBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXNwaW5uZXInIH0pOwogIH0KICBmdW5jdGlvbiBhdXRoVmlkZW9VUkwoKSB7CiAgICB2YXIgY2ZnID0gKFYuY29uZmlnIHx8IHt9KTsKICAgIHJldHVybiBjZmcuQVVUSF9WSURFTyB8fCBjZmcuREVNT19WSURFTyB8fCAnJzsKICB9CgogIHZhciBfcm9vdCA9IG51bGw7CiAgdmFyIF9tb2RlID0gJ3NpZ25pbic7CiAgdmFyIF9uZXh0ID0gbnVsbDsKICB2YXIgX3ZpZGVvID0gbnVsbDsKCiAgZnVuY3Rpb24gbGFuZEFmdGVyQXV0aCgpIHsKICAgIHZhciBkZXN0ID0gX25leHQ7CiAgICBpZiAoIWRlc3QpIHsKICAgICAgdmFyIG9uYm9hcmRlZCA9IFYuc3RhdGUgJiYgVi5zdGF0ZS5vbmJvYXJkaW5nRG9uZSA9PT0gdHJ1ZTsKICAgICAgZGVzdCA9IG9uYm9hcmRlZCA/ICcjL2NyZWF0ZScgOiAnIy9vbmJvYXJkaW5nJzsKICAgIH0KICAgIGdvKGRlc3QpOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRCYWNrZ3JvdW5kKHN0YWdlKSB7CiAgICB2YXIgc3JjID0gYXV0aFZpZGVvVVJMKCk7CiAgICBpZiAoc3JjKSB7CiAgICAgIHZhciB2aWRlbyA9IGVsKCd2aWRlbycsIHsKICAgICAgICBjbGFzczogJ3YtYXV0aF9fdmlkZW8nLAogICAgICAgIG11dGVkOiB0cnVlLAogICAgICAgIGxvb3A6IHRydWUsCiAgICAgICAgYXV0b3BsYXk6IHRydWUsCiAgICAgICAgcGxheXNpbmxpbmU6IHRydWUsCiAgICAgICAgcHJlbG9hZDogJ2F1dG8nLAogICAgICAgIHRhYmluZGV4OiAnLTEnLAogICAgICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJwogICAgICB9KTsKICAgICAgdmlkZW8ubXV0ZWQgPSB0cnVlOwogICAgICB2aWRlby5kZWZhdWx0TXV0ZWQgPSB0cnVlOwogICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ211dGVkJywgJycpOwogICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ3BsYXlzaW5saW5lJywgJycpOwogICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ3dlYmtpdC1wbGF5c2lubGluZScsICcnKTsKICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdkaXNhYmxlcGljdHVyZWlucGljdHVyZScsICcnKTsKICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdkaXNhYmxlcmVtb3RlcGxheWJhY2snLCAnJyk7CiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkgewogICAgICAgIGlmICh2aWRlby5wYXJlbnROb2RlKSB2aWRlby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHZpZGVvKTsKICAgICAgfSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICB2YXIgYXR0ZW1wdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIHAgPSB2aWRlby5wbGF5KCk7CiAgICAgICAgICBpZiAocCAmJiB0eXBlb2YgcC5jYXRjaCA9PT0gJ2Z1bmN0aW9uJykgcC5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CiAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgfTsKICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignY2FucGxheScsIGF0dGVtcHQsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIGF0dGVtcHQsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgdHJ5IHsgdmlkZW8uc3JjID0gc3JjOyB9IGNhdGNoIChlMikgeyB2aWRlby5zZXRBdHRyaWJ1dGUoJ3NyYycsIHNyYyk7IH0KICAgICAgdHJ5IHsgdmlkZW8ubG9hZCgpOyB9IGNhdGNoIChlMykge30KICAgICAgX3ZpZGVvID0gdmlkZW87CiAgICAgIHN0YWdlLmFwcGVuZENoaWxkKHZpZGVvKTsKICAgIH0KICAgIHN0YWdlLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19zY3JpbScsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KSk7CiAgfQoKICBmdW5jdGlvbiBmaWVsZChvcHRzKSB7CiAgICB2YXIgaW5wdXQgPSBlbCgnaW5wdXQnLCB7CiAgICAgIHR5cGU6IG9wdHMudHlwZSB8fCAndGV4dCcsCiAgICAgIGNsYXNzOiAndi1maWVsZCcsCiAgICAgIG5hbWU6IG9wdHMubmFtZSwKICAgICAgaWQ6ICd2LWF1dGgtJyArIG9wdHMubmFtZSwKICAgICAgcGxhY2Vob2xkZXI6IG9wdHMucGxhY2Vob2xkZXIgfHwgJycsCiAgICAgIGF1dG9jb21wbGV0ZTogb3B0cy5hdXRvY29tcGxldGUgfHwgJ29mZicsCiAgICAgICdhcmlhLWxhYmVsJzogb3B0cy5sYWJlbCB8fCBvcHRzLnBsYWNlaG9sZGVyIHx8IG9wdHMubmFtZSwKICAgICAgcmVxdWlyZWQ6IG9wdHMucmVxdWlyZWQgPyAnJyA6IG51bGwsCiAgICAgIHZhbHVlOiBvcHRzLnZhbHVlIHx8ICcnCiAgICB9KTsKICAgIGlmIChvcHRzLmlucHV0bW9kZSkgaW5wdXQuc2V0QXR0cmlidXRlKCdpbnB1dG1vZGUnLCBvcHRzLmlucHV0bW9kZSk7CiAgICBpZiAob3B0cy5hdXRvY2FwaXRhbGl6ZSkgaW5wdXQuc2V0QXR0cmlidXRlKCdhdXRvY2FwaXRhbGl6ZScsIG9wdHMuYXV0b2NhcGl0YWxpemUpOwogICAgaWYgKG9wdHMuc3BlbGxjaGVjayA9PT0gZmFsc2UpIGlucHV0LnNldEF0dHJpYnV0ZSgnc3BlbGxjaGVjaycsICdmYWxzZScpOwogICAgaWYgKG9wdHMubWlubGVuZ3RoKSBpbnB1dC5zZXRBdHRyaWJ1dGUoJ21pbmxlbmd0aCcsIFN0cmluZyhvcHRzLm1pbmxlbmd0aCkpOwogICAgaWYgKG9wdHMubWF4bGVuZ3RoKSBpbnB1dC5zZXRBdHRyaWJ1dGUoJ21heGxlbmd0aCcsIFN0cmluZyhvcHRzLm1heGxlbmd0aCkpOwogICAgdmFyIHdyYXAgPSBlbCgnbGFiZWwnLCB7IGNsYXNzOiAndi1hdXRoX19ncm91cCcgfSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1hdXRoX19sYWJlbCcsIHRleHQ6IG9wdHMubGFiZWwgfHwgJycgfSksCiAgICAgIGlucHV0KTsKICAgIHdyYXAuaW5wdXQgPSBpbnB1dDsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gc3RhdHVzTGluZSgpIHsKICAgIHJldHVybiBlbCgncCcsIHsgY2xhc3M6ICd2LWF1dGhfX3N0YXR1cycsIHJvbGU6ICdhbGVydCcsICdhcmlhLWxpdmUnOiAncG9saXRlJyB9KTsKICB9CgogIGZ1bmN0aW9uIHNob3dTdGF0dXMobm9kZSwgbXNnLCBpc0Vycm9yKSB7CiAgICBpZiAoIW5vZGUpIHJldHVybjsKICAgIG5vZGUudGV4dENvbnRlbnQgPSBtc2cgfHwgJyc7CiAgICBub2RlLmNsYXNzTGlzdC50b2dnbGUoJ3YtYXV0aF9fc3RhdHVzLS1lcnJvcicsICEhaXNFcnJvcik7CiAgfQoKICBmdW5jdGlvbiBzdWJtaXRCdXR0b24obGFiZWwpIHsKICAgIHZhciBidG4gPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnc3VibWl0JywgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tYmxvY2snIH0sIGVsKCdzcGFuJywgeyB0ZXh0OiBsYWJlbCB9KSk7CiAgICBidG4uc2V0TG9hZGluZyA9IGZ1bmN0aW9uIChvbiwgYnVzeUxhYmVsKSB7CiAgICAgIGJ0bi5kaXNhYmxlZCA9ICEhb247CiAgICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdpcy1sb2FkaW5nJywgISFvbik7CiAgICAgIGJ0bi5pbm5lckhUTUwgPSAnJzsKICAgICAgaWYgKG9uKSB7IGJ0bi5hcHBlbmRDaGlsZChzcGlubmVyKCkpOyBidG4uYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IHRleHQ6ICcgJyArIChidXN5TGFiZWwgfHwgJ1dvcmtpbmfigKYnKSB9KSk7IH0KICAgICAgZWxzZSBidG4uYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IHRleHQ6IGxhYmVsIH0pKTsKICAgIH07CiAgICByZXR1cm4gYnRuOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRTaWduSW4oKSB7CiAgICB2YXIgZW1haWxGID0gZmllbGQoeyBuYW1lOiAnZW1haWwnLCB0eXBlOiAnZW1haWwnLCBsYWJlbDogJ0VtYWlsJywgcGxhY2Vob2xkZXI6ICd5b3VAc3R1ZGlvLmNvbScsIGF1dG9jb21wbGV0ZTogJ3VzZXJuYW1lJywgaW5wdXRtb2RlOiAnZW1haWwnLCBhdXRvY2FwaXRhbGl6ZTogJ25vbmUnLCBzcGVsbGNoZWNrOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWUgfSk7CiAgICB2YXIgcHdGID0gZmllbGQoeyBuYW1lOiAncGFzc3dvcmQnLCB0eXBlOiAncGFzc3dvcmQnLCBsYWJlbDogJ1Bhc3N3b3JkJywgcGxhY2Vob2xkZXI6ICdZb3VyIHBhc3N3b3JkJywgYXV0b2NvbXBsZXRlOiAnY3VycmVudC1wYXNzd29yZCcsIHJlcXVpcmVkOiB0cnVlIH0pOwogICAgdmFyIHN0YXR1cyA9IHN0YXR1c0xpbmUoKTsKICAgIHZhciBidG4gPSBzdWJtaXRCdXR0b24oJ1NpZ24gaW4nKTsKCiAgICB2YXIgZm9ybSA9IGVsKCdmb3JtJywgeyBjbGFzczogJ3YtYXV0aF9fZm9ybScsIG5vdmFsaWRhdGU6ICcnIH0sCiAgICAgIGVtYWlsRiwgcHdGLCBzdGF0dXMsIGJ0biwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWF1dGhfX3JvdycgfSwKICAgICAgICBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWxpbmsgdi1hdXRoX19mb3Jnb3QnLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IHNldE1vZGUoJ3Jlc2V0JywgZW1haWxGLmlucHV0LnZhbHVlKTsgfSB9LCAnRm9yZ290IHBhc3N3b3JkPycpCiAgICAgICkKICAgICk7CgogICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBmdW5jdGlvbiAoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHZhciBlbWFpbCA9IChlbWFpbEYuaW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTsKICAgICAgdmFyIHB3ID0gcHdGLmlucHV0LnZhbHVlIHx8ICcnOwogICAgICBpZiAoIWlzRW1haWwoZW1haWwpKSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnRW50ZXIgYSB2YWxpZCBlbWFpbC4nLCB0cnVlKTsgZW1haWxGLmlucHV0LmZvY3VzKCk7IHJldHVybjsgfQogICAgICBpZiAoIXB3KSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnRW50ZXIgeW91ciBwYXNzd29yZC4nLCB0cnVlKTsgcHdGLmlucHV0LmZvY3VzKCk7IHJldHVybjsgfQogICAgICBpZiAoIVYuYXV0aCB8fCB0eXBlb2YgVi5hdXRoLnNpZ25JbiAhPT0gJ2Z1bmN0aW9uJykgeyBzaG93U3RhdHVzKHN0YXR1cywgJ1NpZ24taW4gaXMgdW5hdmFpbGFibGUgcmlnaHQgbm93LicsIHRydWUpOyByZXR1cm47IH0KCiAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAnJyk7CiAgICAgIGJ0bi5zZXRMb2FkaW5nKHRydWUsICdTaWduaW5nIGlu4oCmJyk7CiAgICAgIFYuYXV0aC5zaWduSW4oZW1haWwsIHB3KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICB0b2FzdCgnV2VsY29tZSBiYWNrLicsICdzdWNjZXNzJyk7CiAgICAgICAgbGFuZEFmdGVyQXV0aCgpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgYnRuLnNldExvYWRpbmcoZmFsc2UpOwogICAgICAgIHZhciBzdGF0dXM0MDEgPSBlcnIgJiYgKGVyci5zdGF0dXMgPT09IDQwMSB8fCBlcnIuc3RhdHVzID09PSA0MDMpOwogICAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCBzdGF0dXM0MDEgPyAnRW1haWwgb3IgcGFzc3dvcmQgaXMgaW5jb3JyZWN0LicgOiAoKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ0NvdWxkIG5vdCBzaWduIGluLiBQbGVhc2UgdHJ5IGFnYWluLicpLCB0cnVlKTsKICAgICAgfSk7CiAgICB9KTsKICAgIHJldHVybiBmb3JtOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRSZWdpc3RlcigpIHsKICAgIHZhciBuYW1lRiA9IGZpZWxkKHsgbmFtZTogJ25hbWUnLCBsYWJlbDogJ05hbWUnLCBwbGFjZWhvbGRlcjogJ1lvdXIgbmFtZScsIGF1dG9jb21wbGV0ZTogJ25hbWUnIH0pOwogICAgdmFyIGVtYWlsRiA9IGZpZWxkKHsgbmFtZTogJ2VtYWlsJywgdHlwZTogJ2VtYWlsJywgbGFiZWw6ICdFbWFpbCcsIHBsYWNlaG9sZGVyOiAneW91QHN0dWRpby5jb20nLCBhdXRvY29tcGxldGU6ICd1c2VybmFtZScsIGlucHV0bW9kZTogJ2VtYWlsJywgYXV0b2NhcGl0YWxpemU6ICdub25lJywgc3BlbGxjaGVjazogZmFsc2UsIHJlcXVpcmVkOiB0cnVlIH0pOwogICAgdmFyIHB3RiA9IGZpZWxkKHsgbmFtZTogJ3Bhc3N3b3JkJywgdHlwZTogJ3Bhc3N3b3JkJywgbGFiZWw6ICdQYXNzd29yZCcsIHBsYWNlaG9sZGVyOiAnOOKAkzI0IGNoYXJhY3RlcnMnLCBhdXRvY29tcGxldGU6ICduZXctcGFzc3dvcmQnLCBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDogMjQsIHJlcXVpcmVkOiB0cnVlIH0pOwogICAgdmFyIHN0YXR1cyA9IHN0YXR1c0xpbmUoKTsKICAgIHZhciBidG4gPSBzdWJtaXRCdXR0b24oJ0NyZWF0ZSBhY2NvdW50Jyk7CgogICAgdmFyIGxlZ2FsID0gZWwoJ3AnLCB7IGNsYXNzOiAndi1hdXRoX19sZWdhbCcgfSwKICAgICAgJ0J5IGNyZWF0aW5nIGFuIGFjY291bnQgeW91IGFncmVlIHRvIG91ciAnLAogICAgICBlbCgnYScsIHsgaHJlZjogJ2h0dHBzOi8vdm9vc2V5LmNvbS90ZXJtcycsIHRhcmdldDogJ19ibGFuaycsIHJlbDogJ25vb3BlbmVyJywgY2xhc3M6ICd2LWxpbmsnIH0sICdUZXJtcycpLAogICAgICAnIGFuZCAnLAogICAgICBlbCgnYScsIHsgaHJlZjogJ2h0dHBzOi8vdm9vc2V5LmNvbS9wcml2YWN5JywgdGFyZ2V0OiAnX2JsYW5rJywgcmVsOiAnbm9vcGVuZXInLCBjbGFzczogJ3YtbGluaycgfSwgJ1ByaXZhY3kgUG9saWN5JyksCiAgICAgICcuJyk7CgogICAgdmFyIGZvcm0gPSBlbCgnZm9ybScsIHsgY2xhc3M6ICd2LWF1dGhfX2Zvcm0nLCBub3ZhbGlkYXRlOiAnJyB9LCBuYW1lRiwgZW1haWxGLCBwd0YsIHN0YXR1cywgYnRuLCBsZWdhbCk7CgogICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBmdW5jdGlvbiAoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHZhciBuYW1lID0gKG5hbWVGLmlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIHZhciBlbWFpbCA9IChlbWFpbEYuaW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTsKICAgICAgdmFyIHB3ID0gcHdGLmlucHV0LnZhbHVlIHx8ICcnOwogICAgICBpZiAoIWlzRW1haWwoZW1haWwpKSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnRW50ZXIgYSB2YWxpZCBlbWFpbC4nLCB0cnVlKTsgZW1haWxGLmlucHV0LmZvY3VzKCk7IHJldHVybjsgfQogICAgICBpZiAocHcubGVuZ3RoIDwgOCB8fCBwdy5sZW5ndGggPiAyNCkgeyBzaG93U3RhdHVzKHN0YXR1cywgJ1Bhc3N3b3JkIG11c3QgYmUgOOKAkzI0IGNoYXJhY3RlcnMuJywgdHJ1ZSk7IHB3Ri5pbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgaWYgKCFWLmF1dGggfHwgdHlwZW9mIFYuYXV0aC5yZWdpc3RlciAhPT0gJ2Z1bmN0aW9uJykgeyBzaG93U3RhdHVzKHN0YXR1cywgJ1NpZ24tdXAgaXMgdW5hdmFpbGFibGUgcmlnaHQgbm93LicsIHRydWUpOyByZXR1cm47IH0KCiAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAnJyk7CiAgICAgIGJ0bi5zZXRMb2FkaW5nKHRydWUsICdDcmVhdGluZ+KApicpOwogICAgICBWLmF1dGgucmVnaXN0ZXIoeyBuYW1lOiBuYW1lLCBlbWFpbDogZW1haWwsIHBhc3N3b3JkOiBwdyB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICB0b2FzdCgnQWNjb3VudCBjcmVhdGVkIOKAlCB3ZWxjb21lIHRvIFZhbXAuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICBsYW5kQWZ0ZXJBdXRoKCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBidG4uc2V0TG9hZGluZyhmYWxzZSk7CiAgICAgICAgdmFyIGNvbmZsaWN0ID0gZXJyICYmIGVyci5zdGF0dXMgPT09IDQwOTsKICAgICAgICBzaG93U3RhdHVzKHN0YXR1cywgY29uZmxpY3QgPyAnVGhhdCBlbWFpbCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuIFRyeSBzaWduaW5nIGluLicgOiAoKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ0NvdWxkIG5vdCBjcmVhdGUgeW91ciBhY2NvdW50LiBQbGVhc2UgdHJ5IGFnYWluLicpLCB0cnVlKTsKICAgICAgfSk7CiAgICB9KTsKICAgIHJldHVybiBmb3JtOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRSZXNldChwcmVmaWxsRW1haWwpIHsKICAgIHZhciBlbWFpbEYgPSBmaWVsZCh7IG5hbWU6ICdlbWFpbCcsIHR5cGU6ICdlbWFpbCcsIGxhYmVsOiAnRW1haWwnLCBwbGFjZWhvbGRlcjogJ3lvdUBzdHVkaW8uY29tJywgYXV0b2NvbXBsZXRlOiAndXNlcm5hbWUnLCBpbnB1dG1vZGU6ICdlbWFpbCcsIGF1dG9jYXBpdGFsaXplOiAnbm9uZScsIHNwZWxsY2hlY2s6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZSwgdmFsdWU6IHByZWZpbGxFbWFpbCB8fCAnJyB9KTsKICAgIHZhciBzdGF0dXMgPSBzdGF0dXNMaW5lKCk7CiAgICB2YXIgc2VuZEJ0biA9IHN1Ym1pdEJ1dHRvbignU2VuZCByZXNldCBjb2RlJyk7CgogICAgdmFyIGNvZGVGID0gZmllbGQoeyBuYW1lOiAnY29kZScsIGxhYmVsOiAnUmVzZXQgY29kZScsIHBsYWNlaG9sZGVyOiAnQ29kZSBmcm9tIHlvdXIgZW1haWwnLCBhdXRvY29tcGxldGU6ICdvbmUtdGltZS1jb2RlJyB9KTsKICAgIHZhciBuZXdQd0YgPSBmaWVsZCh7IG5hbWU6ICduZXdQYXNzd29yZCcsIHR5cGU6ICdwYXNzd29yZCcsIGxhYmVsOiAnTmV3IHBhc3N3b3JkJywgcGxhY2Vob2xkZXI6ICc44oCTMjQgY2hhcmFjdGVycycsIGF1dG9jb21wbGV0ZTogJ25ldy1wYXNzd29yZCcsIG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOiAyNCB9KTsKICAgIHZhciByZXNldEJ0biA9IHN1Ym1pdEJ1dHRvbignU2V0IG5ldyBwYXNzd29yZCcpOwogICAgdmFyIHN0YWdlMiA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19zdGFnZTInLCBoaWRkZW46ICcnIH0sIGNvZGVGLCBuZXdQd0YsIHJlc2V0QnRuKTsKCiAgICB2YXIgZm9ybSA9IGVsKCdmb3JtJywgeyBjbGFzczogJ3YtYXV0aF9fZm9ybScsIG5vdmFsaWRhdGU6ICcnIH0sIGVtYWlsRiwgc2VuZEJ0biwgc3RhZ2UyLCBzdGF0dXMpOwoKICAgIHZhciByZXF1ZXN0ZWQgPSBmYWxzZTsKCiAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgaWYgKCFyZXF1ZXN0ZWQpIHJldHVybiBkb1JlcXVlc3QoKTsKICAgICAgcmV0dXJuIGRvUmVzZXQoKTsKICAgIH0pOwogICAgc2VuZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZG9SZXF1ZXN0KCk7IH0pOwogICAgcmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGRvUmVzZXQoKTsgfSk7CgogICAgZnVuY3Rpb24gZG9SZXF1ZXN0KCkgewogICAgICB2YXIgZW1haWwgPSAoZW1haWxGLmlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIGlmICghaXNFbWFpbChlbWFpbCkpIHsgc2hvd1N0YXR1cyhzdGF0dXMsICdFbnRlciBhIHZhbGlkIGVtYWlsLicsIHRydWUpOyBlbWFpbEYuaW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLnJlcXVlc3RSZXNldCAhPT0gJ2Z1bmN0aW9uJykgeyBzaG93U3RhdHVzKHN0YXR1cywgJ1Bhc3N3b3JkIHJlc2V0IGlzIHVuYXZhaWxhYmxlIHJpZ2h0IG5vdy4nLCB0cnVlKTsgcmV0dXJuOyB9CiAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAnJyk7CiAgICAgIHNlbmRCdG4uc2V0TG9hZGluZyh0cnVlLCAnU2VuZGluZ+KApicpOwogICAgICBWLmFwaS5yZXF1ZXN0UmVzZXQoZW1haWwpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHNlbmRCdG4uc2V0TG9hZGluZyhmYWxzZSk7CiAgICAgICAgcmVxdWVzdGVkID0gdHJ1ZTsKICAgICAgICBzdGFnZTIuaGlkZGVuID0gZmFsc2U7CiAgICAgICAgc2VuZEJ0bi5pbm5lckhUTUwgPSAnJzsgc2VuZEJ0bi5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgdGV4dDogJ1Jlc2VuZCBjb2RlJyB9KSk7CiAgICAgICAgc2hvd1N0YXR1cyhzdGF0dXMsICdDaGVjayB5b3VyIGVtYWlsIGZvciBhIHJlc2V0IGNvZGUuJywgZmFsc2UpOwogICAgICAgIGNvZGVGLmlucHV0LmZvY3VzKCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBzZW5kQnRuLnNldExvYWRpbmcoZmFsc2UpOwogICAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAoZXJyICYmIGVyci5tZXNzYWdlKSB8fCAnQ291bGQgbm90IHNlbmQgYSByZXNldCBjb2RlLiBQbGVhc2UgdHJ5IGFnYWluLicsIHRydWUpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBkb1Jlc2V0KCkgewogICAgICB2YXIgZW1haWwgPSAoZW1haWxGLmlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIHZhciBjb2RlID0gKGNvZGVGLmlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIHZhciBuZXdQdyA9IG5ld1B3Ri5pbnB1dC52YWx1ZSB8fCAnJzsKICAgICAgaWYgKCFjb2RlKSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnRW50ZXIgdGhlIGNvZGUgZnJvbSB5b3VyIGVtYWlsLicsIHRydWUpOyBjb2RlRi5pbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgaWYgKG5ld1B3Lmxlbmd0aCA8IDggfHwgbmV3UHcubGVuZ3RoID4gMjQpIHsgc2hvd1N0YXR1cyhzdGF0dXMsICdQYXNzd29yZCBtdXN0IGJlIDjigJMyNCBjaGFyYWN0ZXJzLicsIHRydWUpOyBuZXdQd0YuaW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLnN1Ym1pdFJlc2V0ICE9PSAnZnVuY3Rpb24nKSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnUGFzc3dvcmQgcmVzZXQgaXMgdW5hdmFpbGFibGUgcmlnaHQgbm93LicsIHRydWUpOyByZXR1cm47IH0KICAgICAgc2hvd1N0YXR1cyhzdGF0dXMsICcnKTsKICAgICAgcmVzZXRCdG4uc2V0TG9hZGluZyh0cnVlLCAnVXBkYXRpbmfigKYnKTsKICAgICAgVi5hcGkuc3VibWl0UmVzZXQoZW1haWwsIGNvZGUsIG5ld1B3KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICB0b2FzdCgnUGFzc3dvcmQgdXBkYXRlZCDigJQgeW91IGNhbiBzaWduIGluIG5vdy4nLCAnc3VjY2VzcycpOwogICAgICAgIHNldE1vZGUoJ3NpZ25pbicsIGVtYWlsKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgIHJlc2V0QnRuLnNldExvYWRpbmcoZmFsc2UpOwogICAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAoZXJyICYmIGVyci5tZXNzYWdlKSB8fCAnVGhhdCBjb2RlIGRpZG7igJl0IHdvcmsuIFJlcXVlc3QgYSBuZXcgb25lIGFuZCB0cnkgYWdhaW4uJywgdHJ1ZSk7CiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiBmb3JtOwogIH0KCiAgZnVuY3Rpb24gc2V0TW9kZShtb2RlLCBjYXJyeUVtYWlsKSB7CiAgICBfbW9kZSA9IG1vZGU7CiAgICBpZiAoX3Jvb3QpIHBhaW50KGNhcnJ5RW1haWwpOwogIH0KCiAgZnVuY3Rpb24gcGFpbnQoY2FycnlFbWFpbCkgewogICAgdmFyIHJvb3QgPSBfcm9vdDsKICAgIGlmICghcm9vdCkgcmV0dXJuOwogICAgc3RvcFZpZGVvKCk7CiAgICByb290LmlubmVySFRNTCA9ICcnOwoKICAgIHZhciBzdGFnZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoJyB9KTsKICAgIGJ1aWxkQmFja2dyb3VuZChzdGFnZSk7CgogICAgdmFyIGNhcmQgPSBlbCgnc2VjdGlvbicsIHsgY2xhc3M6ICd2LWF1dGhfX2NhcmQgZ2xhc3MtY2FyZCcsIHJvbGU6ICdmb3JtJywgJ2FyaWEtbGFiZWwnOiAnU2lnbiBpbiB0byBWYW1wJyB9KTsKCiAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19icmFuZCcgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWF1dGhfX2xvZ28gdi1ncmFkaWVudCcsIHRleHQ6ICdWQU1QJyB9KSwKICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1hdXRoX190YWdsaW5lJywgdGV4dDogJ1N0YWdlLCByZXN0eWxlLCBhbmQgcmVpbWFnaW5lIGFueSBzcGFjZS4nIH0pCiAgICApKTsKCiAgICBpZiAoX21vZGUgIT09ICdyZXNldCcpIHsKICAgICAgdmFyIHRhYnMgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtYXV0aF9fdGFicycsIHJvbGU6ICd0YWJsaXN0JyB9KTsKICAgICAgdGFicy5hcHBlbmRDaGlsZCh0YWJCdG4oJ1NpZ24gaW4nLCAnc2lnbmluJykpOwogICAgICB0YWJzLmFwcGVuZENoaWxkKHRhYkJ0bignQ3JlYXRlIGFjY291bnQnLCAncmVnaXN0ZXInKSk7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQodGFicyk7CiAgICB9IGVsc2UgewogICAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19yZXNldGhlYWQnIH0sCiAgICAgICAgZWwoJ2gyJywgeyBjbGFzczogJ3YtYXV0aF9fdGl0bGUnLCB0ZXh0OiAnUmVzZXQgcGFzc3dvcmQnIH0pLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtYXV0aF9fc3ViJywgdGV4dDogJ0VudGVyIHlvdXIgZW1haWwgYW5kIHdl4oCZbGwgc2VuZCBhIHJlc2V0IGNvZGUuJyB9KQogICAgICApKTsKICAgIH0KCiAgICB2YXIgYm9keTsKICAgIGlmIChfbW9kZSA9PT0gJ3JlZ2lzdGVyJykgYm9keSA9IGJ1aWxkUmVnaXN0ZXIoKTsKICAgIGVsc2UgaWYgKF9tb2RlID09PSAncmVzZXQnKSBib2R5ID0gYnVpbGRSZXNldChjYXJyeUVtYWlsKTsKICAgIGVsc2UgYm9keSA9IGJ1aWxkU2lnbkluKCk7CiAgICBjYXJkLmFwcGVuZENoaWxkKGJvZHkpOwoKICAgIGlmIChfbW9kZSA9PT0gJ3Jlc2V0JykgewogICAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19mb290JyB9LAogICAgICAgIGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtbGluaycsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgc2V0TW9kZSgnc2lnbmluJywgY2FycnlFbWFpbCk7IH0gfSwgJ+KGkCBCYWNrIHRvIHNpZ24gaW4nKSkpOwogICAgfQoKICAgIHN0YWdlLmFwcGVuZENoaWxkKGNhcmQpOwogICAgcm9vdC5hcHBlbmRDaGlsZChzdGFnZSk7CgogICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICB2YXIgZmlyc3QgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7CiAgICAgIGlmIChmaXJzdCkgeyB0cnkgeyBmaXJzdC5mb2N1cygpOyB9IGNhdGNoIChlKSB7fSB9CiAgICB9LCA0MCk7CiAgfQoKICBmdW5jdGlvbiB0YWJCdG4obGFiZWwsIG1vZGUpIHsKICAgIHZhciBhY3RpdmUgPSBfbW9kZSA9PT0gbW9kZTsKICAgIHZhciBidG4gPSBlbCgnYnV0dG9uJywgewogICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgcm9sZTogJ3RhYicsCiAgICAgIGNsYXNzOiAndi1hdXRoX190YWInICsgKGFjdGl2ZSA/ICcgdi1hdXRoX190YWItLWFjdGl2ZScgOiAnJyksCiAgICAgICdhcmlhLXNlbGVjdGVkJzogYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJwogICAgfSwgbGFiZWwpOwogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBpZiAoX21vZGUgIT09IG1vZGUpIHNldE1vZGUobW9kZSk7IH0pOwogICAgcmV0dXJuIGJ0bjsKICB9CgogIGZ1bmN0aW9uIHN0b3BWaWRlbygpIHsKICAgIGlmICghX3ZpZGVvKSByZXR1cm47CiAgICB0cnkgeyBfdmlkZW8ucGF1c2UoKTsgfSBjYXRjaCAoZSkge30KICAgIHRyeSB7IF92aWRlby5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpOyBfdmlkZW8ubG9hZCgpOyB9IGNhdGNoIChlMikge30KICAgIF92aWRlbyA9IG51bGw7CiAgfQoKICBWLnZpZXdzLmF1dGggPSB7CiAgICByZW5kZXI6IGZ1bmN0aW9uIChyb290LCBwYXJhbXMpIHsKICAgICAgX3Jvb3QgPSByb290OwogICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307CiAgICAgIF9uZXh0ID0gcGFyYW1zLm5leHQgPyBTdHJpbmcocGFyYW1zLm5leHQpIDogbnVsbDsKICAgICAgdmFyIG0gPSAocGFyYW1zLm1vZGUgfHwgJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTsKICAgICAgX21vZGUgPSAobSA9PT0gJ3JlZ2lzdGVyJyB8fCBtID09PSAncmVzZXQnIHx8IG0gPT09ICdzaWduaW4nKSA/IG0gOiAnc2lnbmluJzsKICAgICAgcm9vdC5jbGFzc0xpc3QgJiYgcm9vdC5jbGFzc0xpc3QuYWRkKCd2LXZpZXctYXV0aCcpOwogICAgICBwYWludChwYXJhbXMuZW1haWwgfHwgJycpOwogICAgfSwKICAgIHRlYXJkb3duOiBmdW5jdGlvbiAoKSB7CiAgICAgIHN0b3BWaWRlbygpOwogICAgICBfcm9vdCA9IG51bGw7CiAgICAgIF9tb2RlID0gJ3NpZ25pbic7CiAgICAgIF9uZXh0ID0gbnVsbDsKICAgIH0KICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9hcHAuanMgPT09PT0gKi8KKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwoKICB2YXIgREVGQVVMVF9ST1VURSA9ICdjcmVhdGUnOwoKICB2YXIgUFVCTElDX1JPVVRFUyA9IHsgYXV0aDogdHJ1ZSB9OwoKICB2YXIgUk9VVEVfVklFVyA9IHsKICAgIGNyZWF0ZTogJ2NyZWF0ZScsCiAgICBsaWJyYXJ5OiAnbGlicmFyeScsCiAgICBpbnNwaXJhdGlvbjogJ2ZlZWQnLAogICAgZmVlZDogJ2ZlZWQnLAogICAgc2V0dGluZ3M6ICdzZXR0aW5ncycsCiAgICBhY2NvdW50OiAnYWNjb3VudCcsCiAgICBwYXl3YWxsOiAncGF5d2FsbCcsCiAgICByZWZlcnJhbDogJ3JlZmVycmFsJywKICAgIGNoYWxsZW5nZTogJ2NoYWxsZW5nZScsCiAgICBvbmJvYXJkaW5nOiAnb25ib2FyZGluZycsCiAgICBhdXRoOiAnYXV0aCcKICB9OwoKICB2YXIgTkFWX0lURU1TID0gWwogICAgeyByb3V0ZTogJ2NyZWF0ZScsIGxhYmVsOiAnQ3JlYXRlJywgaWNvbjogJ3NwYXJrbGVzJyB9LAogICAgeyByb3V0ZTogJ2luc3BpcmF0aW9uJywgbGFiZWw6ICdFeHBsb3JlJywgaWNvbjogJ2dyaWQnIH0sCiAgICB7IHJvdXRlOiAnbGlicmFyeScsIGxhYmVsOiAnTGlicmFyeScsIGljb246ICdwaG90b1N0YWNrJyB9CiAgXTsKCiAgdmFyIGFwcFJvb3QgPSBudWxsOwogIHZhciBvdXRsZXRFbCA9IG51bGw7CiAgdmFyIHRvcGJhckVsID0gbnVsbDsKICB2YXIgYm90dG9tYmFyRWwgPSBudWxsOwogIHZhciBkcmF3ZXJFbCA9IG51bGw7CiAgdmFyIGRyYXdlclNjcmltRWwgPSBudWxsOwogIHZhciBvdmVybGF5SG9zdEVsID0gbnVsbDsKCiAgdmFyIGN1cnJlbnRCYXNlVmlldyA9IG51bGw7CiAgdmFyIGN1cnJlbnRPdmVybGF5VmlldyA9IG51bGw7CiAgdmFyIGxhc3RGb2N1c0JlZm9yZURyYXdlciA9IG51bGw7CiAgdmFyIGJvb3RpbmcgPSB0cnVlOwogIHZhciBuYXZpZ2F0aW5nID0gZmFsc2U7CgogIGZ1bmN0aW9uIHNhZmVVdGlsKCkgewogICAgcmV0dXJuIFYudXRpbCAmJiB0eXBlb2YgVi51dGlsID09PSAnb2JqZWN0JyA/IFYudXRpbCA6IHt9OwogIH0KCiAgZnVuY3Rpb24gZWwodGFnLCBhdHRycykgewogICAgdmFyIGNoaWxkcmVuID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBWLnVpLmVsLmFwcGx5KG51bGwsIFt0YWcsIGF0dHJzXS5jb25jYXQoY2hpbGRyZW4pKTsKICAgIH0KICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgaWYgKGF0dHJzKSB7CiAgICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgaykpIGNvbnRpbnVlOwogICAgICAgIHZhciB2YWwgPSBhdHRyc1trXTsKICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZSkgY29udGludWU7CiAgICAgICAgaWYgKGsgPT09ICdjbGFzcycgfHwgayA9PT0gJ2NsYXNzTmFtZScpIG5vZGUuY2xhc3NOYW1lID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICd0ZXh0Jykgbm9kZS50ZXh0Q29udGVudCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAnaHRtbCcpIG5vZGUuaW5uZXJIVE1MID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICdzdHlsZScgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgIGZvciAodmFyIHMgaW4gdmFsKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbCwgcykpIG5vZGUuc3R5bGVbc10gPSB2YWxbc107CiAgICAgICAgfSBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGsuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgdmFsKTsKICAgICAgICB9IGVsc2UgaWYgKGsuaW5kZXhPZignZGF0YS0nKSA9PT0gMCB8fCBrLmluZGV4T2YoJ2FyaWEtJykgPT09IDApIHsKICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRyeSB7IG5vZGVba10gPSB2YWw7IH0gY2F0Y2ggKGUpIHsgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdmFsKTsgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXBwZW5kQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW4pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiBhcHBlbmRDaGlsZHJlbihub2RlLCBjaGlsZHJlbikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldOwogICAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlKSBjb250aW51ZTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHsgYXBwZW5kQ2hpbGRyZW4obm9kZSwgYyk7IGNvbnRpbnVlOyB9CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoYy5ub2RlVHlwZSA/IGMgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGljb24obmFtZSkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaWNvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgciA9IFYudWkuaWNvbihuYW1lKTsKICAgICAgaWYgKHIgJiYgci5ub2RlVHlwZSkgcmV0dXJuIHI7CiAgICAgIGlmICh0eXBlb2YgciA9PT0gJ3N0cmluZycpIHsKICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICBzcGFuLmNsYXNzTmFtZSA9ICd2LWljbyc7CiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICBzcGFuLmlubmVySFRNTCA9IHI7CiAgICAgICAgcmV0dXJuIHNwYW47CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxsYmFja0ljb24obmFtZSk7CiAgfQoKICBmdW5jdGlvbiBmYWxsYmFja0ljb24obmFtZSkgewogICAgdmFyIHBhdGhzID0gewogICAgICBzcGFya2xlczoKICAgICAgICAnPHBhdGggZD0iTTEyIDNsMS42IDQuNEwxOCA5bC00LjQgMS42TDEyIDE1bC0xLjYtNC40TDYgOWw0LjQtMS42TDEyIDN6Ii8+PHBhdGggZD0iTTE5IDE0bC44IDIuMkwyMiAxN2wtMi4yLjhMMTkgMjBsLS44LTIuMkwxNiAxN2wyLjItLjhMMTkgMTR6Ii8+JywKICAgICAgcGhvdG9TdGFjazoKICAgICAgICAnPHJlY3QgeD0iMyIgeT0iNiIgd2lkdGg9IjE4IiBoZWlnaHQ9IjEzIiByeD0iMiIvPjxwYXRoIGQ9Ik0zIDE2bDQuNS00IDQgMy41TDE1IDExbDYgNSIvPjxjaXJjbGUgY3g9IjkiIGN5PSIxMC41IiByPSIxLjQiLz48cGF0aCBkPSJNNiAzLjVoMTIiLz4nLAogICAgICBtZW51OiAnPHBhdGggZD0iTTQgN2gxNk00IDEyaDE2TTQgMTdoMTYiLz4nLAogICAgICBjbG9zZTogJzxwYXRoIGQ9Ik02IDZsMTIgMTJNMTggNkw2IDE4Ii8+JywKICAgICAgYm9sdDogJzxwYXRoIGQ9Ik0xMyAyTDQuNSAxM0gxMWwtMSA5IDguNS0xMUgxMmwxLTl6Ii8+JywKICAgICAgY3JlZGl0czogJzxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjkiLz48cGF0aCBkPSJNMTUgOS41YTMgMyAwIDAgMC02IC41YzAgMyA2IDEuNSA2IDQuNWEzIDMgMCAwIDEtNiAuNSIvPjxwYXRoIGQ9Ik0xMiA2LjV2MTEiLz4nCiAgICB9OwogICAgdmFyIGQgPSBwYXRoc1tuYW1lXSB8fCBwYXRocy5zcGFya2xlczsKICAgIHZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgc3Bhbi5jbGFzc05hbWUgPSAndi1pY28nOwogICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIHNwYW4uaW5uZXJIVE1MID0KICAgICAgJzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiAnICsKICAgICAgJ3N0cm9rZS13aWR0aD0iMS43IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPicgKyBkICsgJzwvc3ZnPic7CiAgICByZXR1cm4gc3BhbjsKICB9CgogIGZ1bmN0aW9uIHRvYXN0KG1zZywga2luZCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkudG9hc3QgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgVi51aS50b2FzdChtc2csIGtpbmQpOyByZXR1cm47IH0gY2F0Y2ggKGUpIHt9IH0KICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLnRvYXN0ID09PSAnZnVuY3Rpb24nKSB7IFYuc3RvcmUudG9hc3QobXNnLCBraW5kKTsgcmV0dXJuOyB9CiAgICBpZiAod2luZG93LmNvbnNvbGUpIGNvbnNvbGUubG9nKCdbdG9hc3RdJywga2luZCB8fCAnaW5mbycsIG1zZyk7CiAgfQoKICBmdW5jdGlvbiBlc2NhcGVIdG1sKHMpIHsKICAgIHZhciB1ID0gc2FmZVV0aWwoKTsKICAgIGlmICh0eXBlb2YgdS5lc2NhcGVIdG1sID09PSAnZnVuY3Rpb24nKSByZXR1cm4gdS5lc2NhcGVIdG1sKHMpOwogICAgcmV0dXJuIFN0cmluZyhzID09IG51bGwgPyAnJyA6IHMpLnJlcGxhY2UoL1smPD4iJ10vZywgZnVuY3Rpb24gKGMpIHsKICAgICAgcmV0dXJuIHsgJyYnOiAnJmFtcDsnLCAnPCc6ICcmbHQ7JywgJz4nOiAnJmd0OycsICciJzogJyZxdW90OycsICInIjogJyYjMzk7JyB9W2NdOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBwYXJzZShoYXNoU3RyKSB7CiAgICB2YXIgcmF3ID0gaGFzaFN0ciAhPSBudWxsID8gU3RyaW5nKGhhc2hTdHIpIDogKHdpbmRvdy5sb2NhdGlvbi5oYXNoIHx8ICcnKTsKICAgIHZhciBoID0gcmF3LmNoYXJBdCgwKSA9PT0gJyMnID8gcmF3LnNsaWNlKDEpIDogcmF3OwogICAgaWYgKGguY2hhckF0KDApID09PSAnLycpIGggPSBoLnNsaWNlKDEpOwoKICAgIHZhciBxSW5kZXggPSBoLmluZGV4T2YoJz8nKTsKICAgIHZhciBwYXRoUGFydCA9IHFJbmRleCA9PT0gLTEgPyBoIDogaC5zbGljZSgwLCBxSW5kZXgpOwogICAgdmFyIHF1ZXJ5UGFydCA9IHFJbmRleCA9PT0gLTEgPyAnJyA6IGguc2xpY2UocUluZGV4ICsgMSk7CgogICAgdmFyIHNlZ21lbnRzID0gcGF0aFBhcnQuc3BsaXQoJy8nKS5maWx0ZXIoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMubGVuZ3RoID4gMDsgfSk7CiAgICB2YXIgcm91dGUgPSBzZWdtZW50cy5sZW5ndGggPyBkZWNvZGVVUklDb21wb25lbnQoc2VnbWVudHNbMF0pIDogREVGQVVMVF9ST1VURTsKICAgIGlmICghcm91dGUpIHJvdXRlID0gREVGQVVMVF9ST1VURTsKCiAgICB2YXIgcGFyYW1zID0gcGFyc2VRdWVyeShxdWVyeVBhcnQpOwoKICAgIGlmIChyb3V0ZSA9PT0gJ2ltYWdlJykgewogICAgICBwYXJhbXMuaWQgPSBzZWdtZW50c1sxXSA/IGRlY29kZVVSSUNvbXBvbmVudChzZWdtZW50c1sxXSkgOiBwYXJhbXMuaWQgfHwgJyc7CiAgICAgIHBhcmFtcy5fX292ZXJsYXkgPSAnc3R1ZGlvJzsKICAgIH0gZWxzZSBpZiAocm91dGUgPT09ICdpbnNwaXJhdGlvbicgfHwgcm91dGUgPT09ICdmZWVkJykgewogICAgICBpZiAoc2VnbWVudHNbMV0pIHBhcmFtcy5pZCA9IGRlY29kZVVSSUNvbXBvbmVudChzZWdtZW50c1sxXSk7CiAgICB9IGVsc2UgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgaWYgKHBhcmFtcy5pZCA9PSBudWxsKSBwYXJhbXMuaWQgPSBkZWNvZGVVUklDb21wb25lbnQoc2VnbWVudHNbMV0pOwogICAgfQoKICAgIHJldHVybiB7IHJvdXRlOiByb3V0ZSwgcGFyYW1zOiBwYXJhbXMsIHNlZ21lbnRzOiBzZWdtZW50cywgcGF0aDogcGF0aFBhcnQgfTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlUXVlcnkocXVlcnlQYXJ0KSB7CiAgICB2YXIgdSA9IHNhZmVVdGlsKCk7CiAgICBpZiAodHlwZW9mIHUucXMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcGFyc2VkID0gdS5xcygnIy9fPycgKyAocXVlcnlQYXJ0IHx8ICcnKSk7CiAgICAgICAgaWYgKHBhcnNlZCAmJiBwYXJzZWQucGFyYW1zICYmIHR5cGVvZiBwYXJzZWQucGFyYW1zID09PSAnb2JqZWN0JykgcmV0dXJuIHBhcnNlZC5wYXJhbXM7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9CiAgICB2YXIgb3V0ID0ge307CiAgICBpZiAoIXF1ZXJ5UGFydCkgcmV0dXJuIG91dDsKICAgIHZhciBwYWlycyA9IHF1ZXJ5UGFydC5zcGxpdCgnJicpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIXBhaXJzW2ldKSBjb250aW51ZTsKICAgICAgdmFyIGVxID0gcGFpcnNbaV0uaW5kZXhPZignPScpOwogICAgICB2YXIga2V5ID0gZXEgPT09IC0xID8gcGFpcnNbaV0gOiBwYWlyc1tpXS5zbGljZSgwLCBlcSk7CiAgICAgIHZhciB2YWwgPSBlcSA9PT0gLTEgPyAnJyA6IHBhaXJzW2ldLnNsaWNlKGVxICsgMSk7CiAgICAgIHRyeSB7IGtleSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXkucmVwbGFjZSgvXCsvZywgJyAnKSk7IH0gY2F0Y2ggKGUyKSB7fQogICAgICB0cnkgeyB2YWwgPSBkZWNvZGVVUklDb21wb25lbnQodmFsLnJlcGxhY2UoL1wrL2csICcgJykpOyB9IGNhdGNoIChlMykge30KICAgICAgaWYgKGtleSkgb3V0W2tleV0gPSB2YWw7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KCiAgZnVuY3Rpb24gY3VycmVudCgpIHsKICAgIHJldHVybiBwYXJzZSh3aW5kb3cubG9jYXRpb24uaGFzaCk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICB2YXIgdGFyZ2V0ID0gbm9ybWFsaXplSGFzaChoYXNoKTsKICAgIHZhciBjdXIgPSB3aW5kb3cubG9jYXRpb24uaGFzaCB8fCAnJzsKICAgIHZhciBjdXJOb3JtID0gbm9ybWFsaXplSGFzaChjdXIpOwogICAgaWYgKGN1ck5vcm0gPT09IHRhcmdldCkgewogICAgICBoYW5kbGVSb3V0ZSgpOwogICAgfSBlbHNlIHsKICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSB0YXJnZXQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBub3JtYWxpemVIYXNoKGhhc2gpIHsKICAgIHZhciBzID0gaGFzaCA9PSBudWxsID8gJycgOiBTdHJpbmcoaGFzaCk7CiAgICBpZiAoIXMpIHJldHVybiAnIy8nICsgREVGQVVMVF9ST1VURTsKICAgIGlmIChzLmNoYXJBdCgwKSA9PT0gJyMnKSBzID0gcy5zbGljZSgxKTsKICAgIGlmIChzLmNoYXJBdCgwKSAhPT0gJy8nKSBzID0gJy8nICsgczsKICAgIHJldHVybiAnIycgKyBzOwogIH0KCiAgVi5yb3V0ZXIgPSBPYmplY3QuYXNzaWduKFYucm91dGVyIHx8IHt9LCB7CiAgICBnbzogZ28sCiAgICBjdXJyZW50OiBjdXJyZW50LAogICAgcGFyc2U6IHBhcnNlCiAgfSk7CgogIGZ1bmN0aW9uIGJvb3QoKSB7CiAgICBhcHBSb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbXAtYXBwJyk7CiAgICBpZiAoIWFwcFJvb3QpIHsKICAgICAgYXBwUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBhcHBSb290LmlkID0gJ3ZhbXAtYXBwJzsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhcHBSb290KTsKICAgIH0KICAgIGFwcFJvb3QuY2xhc3NMaXN0LmFkZCgndi1hcHAnKTsKCiAgICB0cnkgeyBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5sb2FkID09PSAnZnVuY3Rpb24nKSBWLnN0b3JlLmxvYWQoKTsgfSBjYXRjaCAoZSkge30KCiAgICBhcHBseVRoZW1lKCk7CgogICAgYnVpbGRDaHJvbWUoKTsKICAgIHNob3dCb290TG9hZGVyKCk7CgogICAgd2lyZVN0b3JlRXZlbnRzKCk7CiAgICB3aXJlR2xvYmFsSGFuZGxlcnMoKTsKCiAgICBjYXB0dXJlR2xvYmFsSW50ZW50cygpOwoKICAgIHZhciBib290UCA9CiAgICAgIFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLmJvb3RzdHJhcCA9PT0gJ2Z1bmN0aW9uJwogICAgICAgID8gVi5hdXRoLmJvb3RzdHJhcCgpCiAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwoKICAgIGJvb3RQCiAgICAgIC50aGVuKGZ1bmN0aW9uIChhdXRoZWQpIHsKICAgICAgICBmaW5pc2hCb290KCEhYXV0aGVkKTsKICAgICAgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICBmaW5pc2hCb290KFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLmlzQXV0aGVkID09PSAnZnVuY3Rpb24nID8gVi5hdXRoLmlzQXV0aGVkKCkgOiBmYWxzZSk7CiAgICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZmluaXNoQm9vdChhdXRoZWQpIHsKICAgIGJvb3RpbmcgPSBmYWxzZTsKICAgIHRyeSB7IGlmIChWLnN0b3JlKSBWLnN0b3JlLnNldCgnYm9vdGVkJywgdHJ1ZSk7IH0gY2F0Y2ggKGUpIHt9CgogICAgdmFyIGRlc2MgPSBjdXJyZW50KCk7CiAgICB2YXIgcm91dGUgPSBkZXNjLnJvdXRlOwoKICAgIGlmICghYXV0aGVkICYmICFQVUJMSUNfUk9VVEVTW3JvdXRlXSkgewogICAgICByZXBsYWNlSGFzaCgnIy9hdXRoJyk7CiAgICB9IGVsc2UgaWYgKGF1dGhlZCAmJiByb3V0ZSA9PT0gJ2F1dGgnKSB7CiAgICAgIHJlcGxhY2VIYXNoKGxhbmRpbmdIYXNoKCkpOwogICAgfSBlbHNlIGlmIChhdXRoZWQgJiYgbmVlZHNPbmJvYXJkaW5nKCkgJiYgcm91dGUgIT09ICdvbmJvYXJkaW5nJyAmJiByb3V0ZSAhPT0gJ2F1dGgnKSB7CiAgICAgIHJlcGxhY2VIYXNoKCcjL29uYm9hcmRpbmcnKTsKICAgIH0gZWxzZSBpZiAoIWRlc2MucGF0aCB8fCByb3V0ZSA9PT0gJycpIHsKICAgICAgcmVwbGFjZUhhc2goJyMvJyArIERFRkFVTFRfUk9VVEUpOwogICAgfQoKICAgIGhhbmRsZVJvdXRlKCk7CgogICAgZmx1c2hHbG9iYWxJbnRlbnRzKGF1dGhlZCk7CiAgfQoKICBmdW5jdGlvbiBsYW5kaW5nSGFzaCgpIHsKICAgIHJldHVybiBuZWVkc09uYm9hcmRpbmcoKSA/ICcjL29uYm9hcmRpbmcnIDogJyMvJyArIERFRkFVTFRfUk9VVEU7CiAgfQoKICBmdW5jdGlvbiBuZWVkc09uYm9hcmRpbmcoKSB7CiAgICByZXR1cm4gIShWLnN0YXRlICYmIFYuc3RhdGUub25ib2FyZGluZ0RvbmUgPT09IHRydWUpOwogIH0KCiAgZnVuY3Rpb24gcmVwbGFjZUhhc2goaGFzaCkgewogICAgdmFyIHRhcmdldCA9IG5vcm1hbGl6ZUhhc2goaGFzaCk7CiAgICB0cnkgewogICAgICB2YXIgYmFzZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCcjJylbMF07CiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgYmFzZSArIHRhcmdldCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gdGFyZ2V0OwogICAgfQogIH0KCiAgZnVuY3Rpb24gaGFuZGxlUm91dGUoKSB7CiAgICBpZiAoYm9vdGluZyB8fCBuYXZpZ2F0aW5nKSByZXR1cm47CiAgICBuYXZpZ2F0aW5nID0gdHJ1ZTsKICAgIHRyeSB7CiAgICAgIHZhciBkZXNjID0gY3VycmVudCgpOwogICAgICB2YXIgcm91dGUgPSBkZXNjLnJvdXRlOwogICAgICB2YXIgcGFyYW1zID0gZGVzYy5wYXJhbXMgfHwge307CgogICAgICB2YXIgYXV0aGVkID0gVi5hdXRoICYmIHR5cGVvZiBWLmF1dGguaXNBdXRoZWQgPT09ICdmdW5jdGlvbicgPyBWLmF1dGguaXNBdXRoZWQoKSA6IGZhbHNlOwoKICAgICAgaWYgKCFhdXRoZWQgJiYgIVBVQkxJQ19ST1VURVNbcm91dGVdKSB7CiAgICAgICAgcmVwbGFjZUhhc2goJyMvYXV0aCcpOwogICAgICAgIG1vdW50QmFzZVZpZXcoJ2F1dGgnLCBjdXJyZW50KCkucGFyYW1zKTsKICAgICAgICBzeW5jQ2hyb21lKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChhdXRoZWQgJiYgcm91dGUgPT09ICdhdXRoJykgewogICAgICAgIHJlcGxhY2VIYXNoKGxhbmRpbmdIYXNoKCkpOwogICAgICAgIHZhciBsZCA9IGN1cnJlbnQoKTsKICAgICAgICBtb3VudEJhc2VWaWV3KGxkLnJvdXRlLCBsZC5wYXJhbXMpOwogICAgICAgIHN5bmNDaHJvbWUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGF1dGhlZCAmJiBuZWVkc09uYm9hcmRpbmcoKSAmJiByb3V0ZSAhPT0gJ29uYm9hcmRpbmcnKSB7CiAgICAgICAgcmVwbGFjZUhhc2goJyMvb25ib2FyZGluZycpOwogICAgICAgIG1vdW50QmFzZVZpZXcoJ29uYm9hcmRpbmcnLCB7fSk7CiAgICAgICAgc3luY0Nocm9tZSgpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgaWYgKHJvdXRlID09PSAnaW1hZ2UnKSB7CiAgICAgICAgaWYgKCFjdXJyZW50QmFzZVZpZXcpIHsKICAgICAgICAgIG1vdW50QmFzZVZpZXcoJ2xpYnJhcnknLCB7fSk7CiAgICAgICAgfQogICAgICAgIG1vdW50T3ZlcmxheSgnc3R1ZGlvJywgcGFyYW1zKTsKICAgICAgICBzeW5jQ2hyb21lKCk7CiAgICAgICAgc2V0Um91dGVTdGF0ZShyb3V0ZSwgcGFyYW1zKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmIChjdXJyZW50T3ZlcmxheVZpZXcpIGRpc21pc3NPdmVybGF5KCk7CgogICAgICB2YXIgdmlld05hbWUgPSBST1VURV9WSUVXW3JvdXRlXTsKICAgICAgaWYgKCF2aWV3TmFtZSB8fCAhVi52aWV3c1t2aWV3TmFtZV0gfHwgdHlwZW9mIFYudmlld3Nbdmlld05hbWVdLnJlbmRlciAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIG1vdW50Tm90Rm91bmQocm91dGUpOwogICAgICB9IGVsc2UgewogICAgICAgIG1vdW50QmFzZVZpZXcodmlld05hbWUsIHBhcmFtcyk7CiAgICAgIH0KCiAgICAgIGlmIChyb3V0ZSAhPT0gJ2FjY291bnQnKSBjbG9zZURyYXdlcigpOwoKICAgICAgc3luY0Nocm9tZSgpOwogICAgICBzZXRSb3V0ZVN0YXRlKHJvdXRlLCBwYXJhbXMpOwogICAgfSBmaW5hbGx5IHsKICAgICAgbmF2aWdhdGluZyA9IGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gc2V0Um91dGVTdGF0ZShyb3V0ZSwgcGFyYW1zKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdG9yZSkgewogICAgICAgIGlmIChWLnN0YXRlKSBWLnN0YXRlLnByZXZpb3VzUm91dGUgPSBWLnN0YXRlLnJvdXRlOwogICAgICAgIFYuc3RvcmUuc2V0KCdyb3V0ZScsIHJvdXRlKTsKICAgICAgICBWLnN0b3JlLnNldCgncGFyYW1zJywgcGFyYW1zIHx8IHt9KTsKICAgICAgfQogICAgfSBjYXRjaCAoZSkge30KICB9CgogIGZ1bmN0aW9uIG1vdW50QmFzZVZpZXcodmlld05hbWUsIHBhcmFtcykgewogICAgaWYgKCFvdXRsZXRFbCkgcmV0dXJuOwogICAgdmFyIHZpZXcgPSBWLnZpZXdzW3ZpZXdOYW1lXTsKICAgIGlmICghdmlldyB8fCB0eXBlb2Ygdmlldy5yZW5kZXIgIT09ICdmdW5jdGlvbicpIHsKICAgICAgbW91bnROb3RGb3VuZCh2aWV3TmFtZSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoY3VycmVudEJhc2VWaWV3ICYmIGN1cnJlbnRCYXNlVmlldyAhPT0gdmlld05hbWUpIHsKICAgICAgdmFyIHByZXYgPSBWLnZpZXdzW2N1cnJlbnRCYXNlVmlld107CiAgICAgIGlmIChwcmV2ICYmIHR5cGVvZiBwcmV2LnRlYXJkb3duID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdHJ5IHsgcHJldi50ZWFyZG93bigpOyB9IGNhdGNoIChlKSB7IGlmICh3aW5kb3cuY29uc29sZSkgY29uc29sZS5lcnJvcihlKTsgfQogICAgICB9CiAgICB9CgogICAgdmFyIHN3YXBwaW5nID0gY3VycmVudEJhc2VWaWV3ICE9PSB2aWV3TmFtZTsKICAgIGN1cnJlbnRCYXNlVmlldyA9IHZpZXdOYW1lOwoKICAgIHZhciBhbmltYXRlID0gc3dhcHBpbmcgJiYgIXByZWZlcnNSZWR1Y2VkTW90aW9uKCk7CiAgICB2YXIgZG9SZW5kZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmlldy5yZW5kZXIob3V0bGV0RWwsIHBhcmFtcyB8fCB7fSk7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIHJlbmRlclZpZXdFcnJvcihvdXRsZXRFbCwgdmlld05hbWUsIGVycik7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmVycm9yKCdbVi5yb3V0ZXJdIHZpZXcgIicgKyB2aWV3TmFtZSArICciIHJlbmRlciBmYWlsZWQ6JywgZXJyKTsKICAgICAgfQogICAgICBvdXRsZXRFbC5pZCA9ICd2LW91dGxldCc7CiAgICAgIGlmICghb3V0bGV0RWwuY2xhc3NMaXN0LmNvbnRhaW5zKCd2LW91dGxldCcpKSBvdXRsZXRFbC5jbGFzc0xpc3QuYWRkKCd2LW91dGxldCcpOwogICAgICB0cnkgeyBvdXRsZXRFbC5zY3JvbGxUb3AgPSAwOyB9IGNhdGNoIChlKSB7fQogICAgICBpZiAoYW5pbWF0ZSkgewogICAgICAgIG91dGxldEVsLmNsYXNzTGlzdC5yZW1vdmUoJ3Ytb3V0bGV0LS1sZWF2aW5nJyk7CiAgICAgICAgdm9pZCBvdXRsZXRFbC5vZmZzZXRXaWR0aDsKICAgICAgICBvdXRsZXRFbC5jbGFzc0xpc3QuYWRkKCd2LW91dGxldC0tZW50ZXJpbmcnKTsKICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBvdXRsZXRFbC5jbGFzc0xpc3QucmVtb3ZlKCd2LW91dGxldC0tZW50ZXJpbmcnKTsKICAgICAgICB9LCAyNDApOwogICAgICB9CiAgICB9OwoKICAgIGlmIChhbmltYXRlKSB7CiAgICAgIG91dGxldEVsLmNsYXNzTGlzdC5hZGQoJ3Ytb3V0bGV0LS1sZWF2aW5nJyk7CiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGRvUmVuZGVyLCA5MCk7CiAgICB9IGVsc2UgewogICAgICBkb1JlbmRlcigpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVuZGVyVmlld0Vycm9yKGhvc3QsIHZpZXdOYW1lLCBlcnIpIHsKICAgIGlmICghaG9zdCkgcmV0dXJuOwogICAgaG9zdC5pbm5lckhUTUwgPSAnJzsKICAgIHZhciBtc2cgPSAoZXJyICYmIGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogJ1RoaXMgc2NyZWVuIGZhaWxlZCB0byBsb2FkLic7CiAgICB2YXIgYm94ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5IHYtZW1wdHktLWVycm9yJywgcm9sZTogJ2FsZXJ0JyB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHlfX2ljb24nIH0sIGljb24oJ2JvbHQnKSksCiAgICAgIGVsKCdoMycsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScgfSwgJ1NvbWV0aGluZyB3ZW50IHdyb25nJyksCiAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZW1wdHlfX21zZycgfSwgZXNjYXBlSHRtbChtc2cpKSwKICAgICAgZWwoJ2J1dHRvbicsIHsKICAgICAgICBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCcsCiAgICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgeyBoYW5kbGVSb3V0ZSgpOyB9CiAgICAgIH0sICdUcnkgYWdhaW4nKQogICAgKTsKICAgIGhvc3QuYXBwZW5kQ2hpbGQoYm94KTsKICB9CgogIGZ1bmN0aW9uIG1vdW50Tm90Rm91bmQocm91dGUpIHsKICAgIGlmICghb3V0bGV0RWwpIHJldHVybjsKICAgIGlmIChjdXJyZW50QmFzZVZpZXcpIHsKICAgICAgdmFyIHByZXYgPSBWLnZpZXdzW2N1cnJlbnRCYXNlVmlld107CiAgICAgIGlmIChwcmV2ICYmIHR5cGVvZiBwcmV2LnRlYXJkb3duID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IHByZXYudGVhcmRvd24oKTsgfSBjYXRjaCAoZSkge30gfQogICAgfQogICAgY3VycmVudEJhc2VWaWV3ID0gbnVsbDsKICAgIG91dGxldEVsLmlubmVySFRNTCA9ICcnOwogICAgdmFyIGJveCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eScgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJyB9LCBpY29uKCdzcGFya2xlcycpKSwKICAgICAgZWwoJ2gzJywgeyBjbGFzczogJ3YtZW1wdHlfX3RpdGxlJyB9LCAnUGFnZSBub3QgZm91bmQnKSwKICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fbXNnJyB9LAogICAgICAgICdXZSBjb3VsZG7igJl0IGZpbmQgJywgZWwoJ2NvZGUnLCBudWxsLCAnIy8nICsgZXNjYXBlSHRtbChyb3V0ZSB8fCAnJykpLCAnLicpLAogICAgICBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnknLAogICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvJyArIERFRkFVTFRfUk9VVEUpOyB9CiAgICAgIH0sICdHbyB0byBDcmVhdGUnKQogICAgKTsKICAgIG91dGxldEVsLmFwcGVuZENoaWxkKGJveCk7CiAgfQoKICBmdW5jdGlvbiBtb3VudE92ZXJsYXkodmlld05hbWUsIHBhcmFtcykgewogICAgdmFyIHZpZXcgPSBWLnZpZXdzW3ZpZXdOYW1lXTsKICAgIGlmICghdmlldyB8fCB0eXBlb2Ygdmlldy5yZW5kZXIgIT09ICdmdW5jdGlvbicpIHsKICAgICAgZ28oJyMvbGlicmFyeScpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIW92ZXJsYXlIb3N0RWwpIHJldHVybjsKCiAgICB2YXIgcmVvcGVuaW5nID0gY3VycmVudE92ZXJsYXlWaWV3ICE9PSB2aWV3TmFtZTsKICAgIGN1cnJlbnRPdmVybGF5VmlldyA9IHZpZXdOYW1lOwoKICAgIG92ZXJsYXlIb3N0RWwuaW5uZXJIVE1MID0gJyc7CiAgICBvdmVybGF5SG9zdEVsLmhpZGRlbiA9IGZhbHNlOwogICAgb3ZlcmxheUhvc3RFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7CiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndi1oYXMtb3ZlcmxheScpOwoKICAgIHZhciBwYW5lbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1vdmVybGF5X19wYW5lbCcsIHJvbGU6ICdkaWFsb2cnLCAnYXJpYS1tb2RhbCc6ICd0cnVlJyB9KTsKICAgIHZhciBiYWNrZHJvcCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1vdmVybGF5X19iYWNrZHJvcCcsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgY2xvc2VPdmVybGF5VG9CYXNlKCk7IH0gfSk7CiAgICBvdmVybGF5SG9zdEVsLmFwcGVuZENoaWxkKGJhY2tkcm9wKTsKICAgIG92ZXJsYXlIb3N0RWwuYXBwZW5kQ2hpbGQocGFuZWwpOwoKICAgIHRyeSB7CiAgICAgIHZpZXcucmVuZGVyKHBhbmVsLCBwYXJhbXMgfHwge30pOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIHJlbmRlclZpZXdFcnJvcihwYW5lbCwgdmlld05hbWUsIGVycik7CiAgICAgIGlmICh3aW5kb3cuY29uc29sZSkgY29uc29sZS5lcnJvcignW1Yucm91dGVyXSBvdmVybGF5ICInICsgdmlld05hbWUgKyAnIiByZW5kZXIgZmFpbGVkOicsIGVycik7CiAgICB9CgogICAgaWYgKHJlb3BlbmluZyAmJiAhcHJlZmVyc1JlZHVjZWRNb3Rpb24oKSkgewogICAgICBvdmVybGF5SG9zdEVsLmNsYXNzTGlzdC5yZW1vdmUoJ3Ytb3ZlcmxheS0taW4nKTsKICAgICAgdm9pZCBvdmVybGF5SG9zdEVsLm9mZnNldFdpZHRoOwogICAgICBvdmVybGF5SG9zdEVsLmNsYXNzTGlzdC5hZGQoJ3Ytb3ZlcmxheS0taW4nKTsKICAgIH0gZWxzZSB7CiAgICAgIG92ZXJsYXlIb3N0RWwuY2xhc3NMaXN0LmFkZCgndi1vdmVybGF5LS1pbicpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZGlzbWlzc092ZXJsYXkoKSB7CiAgICBpZiAoIWN1cnJlbnRPdmVybGF5VmlldykgcmV0dXJuOwogICAgdmFyIHZpZXcgPSBWLnZpZXdzW2N1cnJlbnRPdmVybGF5Vmlld107CiAgICBpZiAodmlldyAmJiB0eXBlb2Ygdmlldy50ZWFyZG93biA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgeyB2aWV3LnRlYXJkb3duKCk7IH0gY2F0Y2ggKGUpIHsgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmVycm9yKGUpOyB9CiAgICB9CiAgICBjdXJyZW50T3ZlcmxheVZpZXcgPSBudWxsOwogICAgaWYgKG92ZXJsYXlIb3N0RWwpIHsKICAgICAgb3ZlcmxheUhvc3RFbC5jbGFzc0xpc3QucmVtb3ZlKCd2LW92ZXJsYXktLWluJyk7CiAgICAgIG92ZXJsYXlIb3N0RWwuaW5uZXJIVE1MID0gJyc7CiAgICAgIG92ZXJsYXlIb3N0RWwuaGlkZGVuID0gdHJ1ZTsKICAgICAgb3ZlcmxheUhvc3RFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIH0KICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd2LWhhcy1vdmVybGF5Jyk7CiAgfQoKICBmdW5jdGlvbiBjbG9zZU92ZXJsYXlUb0Jhc2UoKSB7CiAgICB2YXIgYmFjayA9ICcjLycgKyAoY3VycmVudEJhc2VWaWV3ID8gcm91dGVGb3JWaWV3KGN1cnJlbnRCYXNlVmlldykgOiAnbGlicmFyeScpOwogICAgZ28oYmFjayk7CiAgfQoKICBmdW5jdGlvbiByb3V0ZUZvclZpZXcodmlld05hbWUpIHsKICAgIGZvciAodmFyIHIgaW4gUk9VVEVfVklFVykgewogICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFJPVVRFX1ZJRVcsIHIpICYmIFJPVVRFX1ZJRVdbcl0gPT09IHZpZXdOYW1lKSByZXR1cm4gcjsKICAgIH0KICAgIHJldHVybiB2aWV3TmFtZTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkQ2hyb21lKCkgewogICAgaWYgKCFhcHBSb290KSByZXR1cm47CiAgICBhcHBSb290LmlubmVySFRNTCA9ICcnOwoKICAgIHZhciBiZyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1iZycsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKCiAgICB0b3BiYXJFbCA9IGJ1aWxkVG9wQmFyKCk7CgogICAgb3V0bGV0RWwgPSBlbCgnbWFpbicsIHsgaWQ6ICd2LW91dGxldCcsIGNsYXNzOiAndi1vdXRsZXQnLCByb2xlOiAnbWFpbicsIHRhYkluZGV4OiAtMSB9KTsKCiAgICBib3R0b21iYXJFbCA9IGJ1aWxkQm90dG9tQmFyKCk7CgogICAgZHJhd2VyU2NyaW1FbCA9IGVsKCdkaXYnLCB7CiAgICAgIGNsYXNzOiAndi1zY3JpbScsCiAgICAgIGhpZGRlbjogdHJ1ZSwKICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgeyBjbG9zZURyYXdlcigpOyB9CiAgICB9KTsKICAgIGRyYXdlckVsID0gZWwoJ2FzaWRlJywgewogICAgICBjbGFzczogJ3YtZHJhd2VyJywKICAgICAgaWQ6ICd2LWFjY291bnQtZHJhd2VyJywKICAgICAgcm9sZTogJ2RpYWxvZycsCiAgICAgICdhcmlhLW1vZGFsJzogJ3RydWUnLAogICAgICAnYXJpYS1sYWJlbCc6ICdBY2NvdW50IG1lbnUnLAogICAgICBoaWRkZW46IHRydWUKICAgIH0pOwoKICAgIG92ZXJsYXlIb3N0RWwgPSBlbCgnZGl2JywgewogICAgICBjbGFzczogJ3Ytb3ZlcmxheScsCiAgICAgIGlkOiAndi1zdHVkaW8tb3ZlcmxheScsCiAgICAgIGhpZGRlbjogdHJ1ZSwKICAgICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnCiAgICB9KTsKCiAgICBhcHBSb290LmFwcGVuZENoaWxkKGJnKTsKICAgIGFwcFJvb3QuYXBwZW5kQ2hpbGQodG9wYmFyRWwpOwogICAgYXBwUm9vdC5hcHBlbmRDaGlsZChvdXRsZXRFbCk7CiAgICBhcHBSb290LmFwcGVuZENoaWxkKGJvdHRvbWJhckVsKTsKICAgIGFwcFJvb3QuYXBwZW5kQ2hpbGQoZHJhd2VyU2NyaW1FbCk7CiAgICBhcHBSb290LmFwcGVuZENoaWxkKGRyYXdlckVsKTsKICAgIGFwcFJvb3QuYXBwZW5kQ2hpbGQob3ZlcmxheUhvc3RFbCk7CiAgfQoKICBmdW5jdGlvbiBidWlsZFRvcEJhcigpIHsKICAgIHZhciBiYXIgPSBlbCgnaGVhZGVyJywgeyBjbGFzczogJ3YtdG9wYmFyIGxpcXVpZC1nbGFzcyBsaXF1aWQtZ2xhc3MtbmF2IGdsYXNzLW5hdicsIHJvbGU6ICdiYW5uZXInIH0pOwoKICAgIHZhciB3b3JkbWFyayA9IGVsKCdhJywgewogICAgICBjbGFzczogJ3Ytd29yZG1hcmsgdi1ncmFkaWVudCcsCiAgICAgIGhyZWY6ICcjL2NyZWF0ZScsCiAgICAgICdhcmlhLWxhYmVsJzogJ1ZhbXAg4oCUIGdvIHRvIENyZWF0ZScsCiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZ28oJyMvY3JlYXRlJyk7IH0KICAgIH0sICdWQU1QJyk7CgogICAgdmFyIG5hdiA9IGVsKCduYXYnLCB7IGNsYXNzOiAndi10b3BuYXYnLCAnYXJpYS1sYWJlbCc6ICdQcmltYXJ5JyB9KTsKICAgIE5BVl9JVEVNUy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgIHZhciBsaW5rID0gZWwoJ2EnLCB7CiAgICAgICAgY2xhc3M6ICd2LXRvcG5hdl9faXRlbScsCiAgICAgICAgaHJlZjogJyMvJyArIGl0ZW0ucm91dGUsCiAgICAgICAgJ2RhdGEtcm91dGUnOiBpdGVtLnJvdXRlLAogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZ28oJyMvJyArIGl0ZW0ucm91dGUpOyB9CiAgICAgIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi10YWJfX2ljb24nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSwgaWNvbihpdGVtLmljb24pKSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXRvcG5hdl9fbGFiZWwnIH0sIGl0ZW0ubGFiZWwpKTsKICAgICAgbmF2LmFwcGVuZENoaWxkKGxpbmspOwogICAgfSk7CgogICAgdmFyIGNyZWRpdHNCdG4gPSBlbCgnYnV0dG9uJywgewogICAgICBjbGFzczogJ3YtY3JlZGl0cycsCiAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAnYXJpYS1sYWJlbCc6ICdDcmVkaXRzIOKAlCBhZGQgbW9yZScsCiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvcGF5d2FsbCcpOyB9CiAgICB9KTsKICAgIGNyZWRpdHNCdG4uYXBwZW5kQ2hpbGQoY3JlZGl0c1BpbGxDb250ZW50KGN1cnJlbnRDcmVkaXRzKCkpKTsKCiAgICB2YXIgaGFtYnVyZ2VyID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6ICd2LWhhbWJ1cmdlciBnbGFzcy1idXR0b24nLAogICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgJ2FyaWEtbGFiZWwnOiAnQWNjb3VudCBtZW51JywKICAgICAgJ2FyaWEtaGFzcG9wdXAnOiAnZGlhbG9nJywKICAgICAgJ2FyaWEtZXhwYW5kZWQnOiAnZmFsc2UnLAogICAgICAnYXJpYS1jb250cm9scyc6ICd2LWFjY291bnQtZHJhd2VyJywKICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgeyB0b2dnbGVEcmF3ZXIoKTsgfQogICAgfSwgaWNvbignbWVudScpKTsKCiAgICB2YXIgcmlnaHQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtdG9wYmFyX19yaWdodCcgfSwgY3JlZGl0c0J0biwgaGFtYnVyZ2VyKTsKCiAgICBiYXIuYXBwZW5kQ2hpbGQod29yZG1hcmspOwogICAgYmFyLmFwcGVuZENoaWxkKG5hdik7CiAgICBiYXIuYXBwZW5kQ2hpbGQocmlnaHQpOwoKICAgIGJhci5fX2NyZWRpdHNCdG4gPSBjcmVkaXRzQnRuOwogICAgYmFyLl9faGFtYnVyZ2VyID0gaGFtYnVyZ2VyOwogICAgYmFyLl9fbmF2ID0gbmF2OwogICAgcmV0dXJuIGJhcjsKICB9CgogIGZ1bmN0aW9uIGNyZWRpdHNQaWxsQ29udGVudChuKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jcmVkaXRzUGlsbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgbm9kZSA9IFYudWkuY3JlZGl0c1BpbGwobik7CiAgICAgIGlmIChub2RlICYmIG5vZGUubm9kZVR5cGUpIHJldHVybiBub2RlOwogICAgfQogICAgdmFyIHdyYXAgPSBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHNfX2lubmVyJyB9LAogICAgICBpY29uKCdib2x0JyksCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3JlZGl0c19fbnVtJyB9LCBmb3JtYXRDcmVkaXRzKG4pKSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVkaXRzX19sYWJlbCcgfSwgJ2NyZWRpdHMnKQogICAgKTsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRCb3R0b21CYXIoKSB7CiAgICB2YXIgYmFyID0gZWwoJ25hdicsIHsgY2xhc3M6ICd2LWJvdHRvbWJhciBsaXF1aWQtZ2xhc3MgZ2xhc3MtbmF2JywgJ2FyaWEtbGFiZWwnOiAnUHJpbWFyeScgfSk7CiAgICBOQVZfSVRFTVMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICB2YXIgdGFiID0gZWwoJ2J1dHRvbicsIHsKICAgICAgICBjbGFzczogJ3YtdGFiJywKICAgICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgICAnZGF0YS1yb3V0ZSc6IGl0ZW0ucm91dGUsCiAgICAgICAgJ2FyaWEtbGFiZWwnOiBpdGVtLmxhYmVsLAogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvJyArIGl0ZW0ucm91dGUpOyB9CiAgICAgIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi10YWJfX2ljb24nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSwgaWNvbihpdGVtLmljb24pKSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXRhYl9fbGFiZWwnIH0sIGl0ZW0ubGFiZWwpKTsKICAgICAgYmFyLmFwcGVuZENoaWxkKHRhYik7CiAgICB9KTsKICAgIHJldHVybiBiYXI7CiAgfQoKICBmdW5jdGlvbiBidWlsZERyYXdlckhlYWRlcigpIHsKICAgIHZhciB1ID0gVi5zdGF0ZSAmJiBWLnN0YXRlLnVzZXI7CiAgICB2YXIgbmFtZSA9ICh1ICYmICh1LmRpc3BsYXlOYW1lIHx8IHUubmFtZSB8fCB1LnVzZXJuYW1lKSkgfHwgJ0FjY291bnQnOwogICAgdmFyIGVtYWlsID0gKHUgJiYgdS5lbWFpbCkgfHwgJyc7CgogICAgdmFyIGF2YXRhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2F2YXRhcicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9LAogICAgICBlbCgnc3BhbicsIG51bGwsIGluaXRpYWxzRm9yKHUpKSk7CiAgICBpZiAodSAmJiB1LnByb2ZpbGVQaWNVUkwpIHsKICAgICAgYXZhdGFyID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9fYXZhdGFyJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sCiAgICAgICAgZWwoJ2ltZycsIHsgc3JjOiB1LnByb2ZpbGVQaWNVUkwsIGFsdDogJycsIGxvYWRpbmc6ICdsYXp5JyB9KSk7CiAgICB9CgogICAgdmFyIGlkZW50ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9faWRlbnQnIH0sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX25hbWUnIH0sIGVzY2FwZUh0bWwobmFtZSkpLAogICAgICBlbWFpbCA/IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2VtYWlsJyB9LCBlc2NhcGVIdG1sKGVtYWlsKSkgOiBudWxsKTsKCiAgICB2YXIgY2xvc2VCdG4gPSBlbCgnYnV0dG9uJywgewogICAgICBjbGFzczogJ3YtZHJhd2VyX19jbG9zZScsCiAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAnYXJpYS1sYWJlbCc6ICdDbG9zZSBtZW51JywKICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgeyBjbG9zZURyYXdlcigpOyB9CiAgICB9LCBpY29uKCdjbG9zZScpKTsKCiAgICByZXR1cm4gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9faGVhZGVyJyB9LCBhdmF0YXIsIGlkZW50LCBjbG9zZUJ0bik7CiAgfQoKICBmdW5jdGlvbiBpbml0aWFsc0Zvcih1KSB7CiAgICBpZiAoIXUpIHJldHVybiAn4pyoJzsKICAgIHZhciBzcmMgPSB1LmRpc3BsYXlOYW1lIHx8IHUubmFtZSB8fCB1LnVzZXJuYW1lIHx8IHUuZW1haWwgfHwgJyc7CiAgICB2YXIgcGFydHMgPSBTdHJpbmcoc3JjKS50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKTsKICAgIGlmICghcGFydHMubGVuZ3RoKSByZXR1cm4gJ+KcqCc7CiAgICBpZiAocGFydHMubGVuZ3RoID09PSAxKSByZXR1cm4gcGFydHNbMF0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCk7CiAgICByZXR1cm4gKHBhcnRzWzBdLmNoYXJBdCgwKSArIHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdLmNoYXJBdCgwKSkudG9VcHBlckNhc2UoKTsKICB9CgogIGZ1bmN0aW9uIG9wZW5EcmF3ZXIoKSB7CiAgICBpZiAoIWRyYXdlckVsKSByZXR1cm47CiAgICBsYXN0Rm9jdXNCZWZvcmVEcmF3ZXIgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwoKICAgIGRyYXdlckVsLmlubmVySFRNTCA9ICcnOwogICAgZHJhd2VyRWwuYXBwZW5kQ2hpbGQoYnVpbGREcmF3ZXJIZWFkZXIoKSk7CiAgICB2YXIgYm9keSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2JvZHknIH0pOwogICAgZHJhd2VyRWwuYXBwZW5kQ2hpbGQoYm9keSk7CgogICAgaWYgKFYudmlld3MuYWNjb3VudCAmJiB0eXBlb2YgVi52aWV3cy5hY2NvdW50LnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgewogICAgICAgIFYudmlld3MuYWNjb3VudC5yZW5kZXIoYm9keSwgY3VycmVudCgpLnBhcmFtcyk7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIHJlbmRlclZpZXdFcnJvcihib2R5LCAnYWNjb3VudCcsIGVycik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2VtcHR5JyB9LCAnQWNjb3VudCBtZW51IHVuYXZhaWxhYmxlLicpKTsKICAgIH0KCiAgICBkcmF3ZXJFbC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtZHJhd2VyX19mb290ZXInIH0sCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZHJhd2VyX19icmFuZCB2LWdyYWRpZW50JyB9LCAnVm9vc2V5JyksCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZHJhd2VyX19jb3B5JyB9LAogICAgICAgICfCqSAnICsgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpICsgJyBWb29zZXkgTExDIOKAoiBBbGwgUmlnaHRzIFJlc2VydmVkJykpKTsKCiAgICBkcmF3ZXJTY3JpbUVsLmhpZGRlbiA9IGZhbHNlOwogICAgZHJhd2VyRWwuaGlkZGVuID0gZmFsc2U7CiAgICB2b2lkIGRyYXdlckVsLm9mZnNldFdpZHRoOwogICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3YtZHJhd2VyLW9wZW4nKTsKICAgIGRyYXdlclNjcmltRWwuY2xhc3NMaXN0LmFkZCgndi1zY3JpbS0taW4nKTsKICAgIGRyYXdlckVsLmNsYXNzTGlzdC5hZGQoJ3YtZHJhd2VyLS1pbicpOwoKICAgIGlmIChWLnN0b3JlKSBWLnN0b3JlLnNldCgnZHJhd2VyT3BlbicsIHRydWUpOwogICAgaWYgKHRvcGJhckVsICYmIHRvcGJhckVsLl9faGFtYnVyZ2VyKSB0b3BiYXJFbC5fX2hhbWJ1cmdlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpOwoKICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIGZvY3VzYWJsZSA9IGRyYXdlckVsLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbiwgYSwgaW5wdXQsIFt0YWJpbmRleF0nKTsKICAgICAgaWYgKGZvY3VzYWJsZSkgdHJ5IHsgZm9jdXNhYmxlLmZvY3VzKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICB9LCA2MCk7CiAgfQoKICBmdW5jdGlvbiBjbG9zZURyYXdlcigpIHsKICAgIGlmICghZHJhd2VyRWwgfHwgZHJhd2VyRWwuaGlkZGVuKSByZXR1cm47CiAgICBkcmF3ZXJFbC5jbGFzc0xpc3QucmVtb3ZlKCd2LWRyYXdlci0taW4nKTsKICAgIGRyYXdlclNjcmltRWwuY2xhc3NMaXN0LnJlbW92ZSgndi1zY3JpbS0taW4nKTsKICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd2LWRyYXdlci1vcGVuJyk7CiAgICBpZiAodG9wYmFyRWwgJiYgdG9wYmFyRWwuX19oYW1idXJnZXIpIHRvcGJhckVsLl9faGFtYnVyZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpOwogICAgaWYgKFYuc3RvcmUpIFYuc3RvcmUuc2V0KCdkcmF3ZXJPcGVuJywgZmFsc2UpOwoKICAgIHZhciBmaW5hbGl6ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgZHJhd2VyRWwuaGlkZGVuID0gdHJ1ZTsKICAgICAgZHJhd2VyU2NyaW1FbC5oaWRkZW4gPSB0cnVlOwogICAgICBkcmF3ZXJFbC5pbm5lckhUTUwgPSAnJzsKICAgIH07CiAgICBpZiAocHJlZmVyc1JlZHVjZWRNb3Rpb24oKSkgZmluYWxpemUoKTsKICAgIGVsc2Ugd2luZG93LnNldFRpbWVvdXQoZmluYWxpemUsIDI2MCk7CgogICAgaWYgKGxhc3RGb2N1c0JlZm9yZURyYXdlciAmJiB0eXBlb2YgbGFzdEZvY3VzQmVmb3JlRHJhd2VyLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7IGxhc3RGb2N1c0JlZm9yZURyYXdlci5mb2N1cygpOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgbGFzdEZvY3VzQmVmb3JlRHJhd2VyID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHRvZ2dsZURyYXdlcigpIHsKICAgIGlmIChkcmF3ZXJFbCAmJiAhZHJhd2VyRWwuaGlkZGVuKSBjbG9zZURyYXdlcigpOwogICAgZWxzZSBvcGVuRHJhd2VyKCk7CiAgfQoKICBmdW5jdGlvbiBzeW5jQ2hyb21lKCkgewogICAgaWYgKCFhcHBSb290KSByZXR1cm47CiAgICB2YXIgZGVzYyA9IGN1cnJlbnQoKTsKICAgIHZhciByb3V0ZSA9IGRlc2Mucm91dGU7CiAgICB2YXIgYmFyZVZpZXcgPSByb3V0ZSA9PT0gJ2F1dGgnIHx8IHJvdXRlID09PSAnb25ib2FyZGluZyc7CiAgICB2YXIgb3ZlcmxheUFjdGl2ZSA9ICEhY3VycmVudE92ZXJsYXlWaWV3OwoKICAgIGFwcFJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgndi1hcHAtLWJhcmUnLCBiYXJlVmlldyk7CgogICAgaWYgKHRvcGJhckVsKSB0b3BiYXJFbC5oaWRkZW4gPSBiYXJlVmlldzsKICAgIGlmIChib3R0b21iYXJFbCkgYm90dG9tYmFyRWwuaGlkZGVuID0gYmFyZVZpZXcgfHwgb3ZlcmxheUFjdGl2ZTsKCiAgICB2YXIgYWN0aXZlUm91dGUgPSByb3V0ZSA9PT0gJ2ltYWdlJyA/IHJvdXRlRm9yVmlldyhjdXJyZW50QmFzZVZpZXcgfHwgJ2xpYnJhcnknKSA6IHJvdXRlOwogICAgc2V0QWN0aXZlTmF2KGFjdGl2ZVJvdXRlKTsKCiAgICByZWZyZXNoQ3JlZGl0c1BpbGwoKTsKICB9CgogIGZ1bmN0aW9uIHNldEFjdGl2ZU5hdihhY3RpdmVSb3V0ZSkgewogICAgaWYgKGJvdHRvbWJhckVsKSB7CiAgICAgIHZhciB0YWJzID0gYm90dG9tYmFyRWwucXVlcnlTZWxlY3RvckFsbCgnLnYtdGFiJyk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciByID0gdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcm91dGUnKTsKICAgICAgICB2YXIgb24gPSByID09PSBhY3RpdmVSb3V0ZTsKICAgICAgICB0YWJzW2ldLmNsYXNzTGlzdC50b2dnbGUoJ3YtdGFiLS1hY3RpdmUnLCBvbik7CiAgICAgICAgaWYgKG9uKSB0YWJzW2ldLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywgJ3BhZ2UnKTsKICAgICAgICBlbHNlIHRhYnNbaV0ucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnKTsKICAgICAgfQogICAgfQogICAgaWYgKHRvcGJhckVsICYmIHRvcGJhckVsLl9fbmF2KSB7CiAgICAgIHZhciBpdGVtcyA9IHRvcGJhckVsLl9fbmF2LnF1ZXJ5U2VsZWN0b3JBbGwoJy52LXRvcG5hdl9faXRlbScpOwogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGl0ZW1zLmxlbmd0aDsgaisrKSB7CiAgICAgICAgdmFyIHIyID0gaXRlbXNbal0uZ2V0QXR0cmlidXRlKCdkYXRhLXJvdXRlJyk7CiAgICAgICAgdmFyIG9uMiA9IHIyID09PSBhY3RpdmVSb3V0ZTsKICAgICAgICBpdGVtc1tqXS5jbGFzc0xpc3QudG9nZ2xlKCd2LXRvcG5hdl9faXRlbS0tYWN0aXZlJywgb24yKTsKICAgICAgICBpZiAob24yKSBpdGVtc1tqXS5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICdwYWdlJyk7CiAgICAgICAgZWxzZSBpdGVtc1tqXS5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZWZyZXNoQ3JlZGl0c1BpbGwoKSB7CiAgICBpZiAoIXRvcGJhckVsIHx8ICF0b3BiYXJFbC5fX2NyZWRpdHNCdG4pIHJldHVybjsKICAgIHZhciBidG4gPSB0b3BiYXJFbC5fX2NyZWRpdHNCdG47CiAgICBidG4uaW5uZXJIVE1MID0gJyc7CiAgICBidG4uYXBwZW5kQ2hpbGQoY3JlZGl0c1BpbGxDb250ZW50KGN1cnJlbnRDcmVkaXRzKCkpKTsKICB9CgogIGZ1bmN0aW9uIGN1cnJlbnRDcmVkaXRzKCkgewogICAgdmFyIGMgPSBWLnN0YXRlID8gVi5zdGF0ZS5jcmVkaXRzIDogbnVsbDsKICAgIHJldHVybiB0eXBlb2YgYyA9PT0gJ251bWJlcicgPyBjIDogMDsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdENyZWRpdHMobikgewogICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCAhaXNGaW5pdGUobikpIHJldHVybiAnMCc7CiAgICB0cnkgeyByZXR1cm4gbi50b0xvY2FsZVN0cmluZygnZW4tVVMnKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gU3RyaW5nKG4pOyB9CiAgfQoKICBmdW5jdGlvbiBzaG93Qm9vdExvYWRlcigpIHsKICAgIGlmICghb3V0bGV0RWwpIHJldHVybjsKICAgIG91dGxldEVsLmlubmVySFRNTCA9ICcnOwogICAgdmFyIGxvYWRlciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1ib290JyB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtYm9vdF9fbWFyayB2LWdyYWRpZW50JyB9LCAnVkFNUCcpLAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtYm9vdF9fc3Bpbm5lcicsICdhcmlhLWxhYmVsJzogJ0xvYWRpbmcnLCByb2xlOiAnc3RhdHVzJyB9LAogICAgICAgIFYudWkgJiYgdHlwZW9mIFYudWkuc3Bpbm5lciA9PT0gJ2Z1bmN0aW9uJyA/IHNhZmVTcGlubmVyKCkgOiBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXNwaW5uZXInIH0pKQogICAgKTsKICAgIG91dGxldEVsLmFwcGVuZENoaWxkKGxvYWRlcik7CiAgfQoKICBmdW5jdGlvbiBzYWZlU3Bpbm5lcigpIHsKICAgIHRyeSB7CiAgICAgIHZhciBzID0gVi51aS5zcGlubmVyKCk7CiAgICAgIGlmIChzICYmIHMubm9kZVR5cGUpIHJldHVybiBzOwogICAgfSBjYXRjaCAoZSkge30KICAgIHJldHVybiBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXNwaW5uZXInIH0pOwogIH0KCiAgZnVuY3Rpb24gd2lyZVN0b3JlRXZlbnRzKCkgewogICAgaWYgKCFWLnN0b3JlIHx8IHR5cGVvZiBWLnN0b3JlLm9uICE9PSAnZnVuY3Rpb24nKSByZXR1cm47CgogICAgVi5zdG9yZS5vbignYXV0aDpjaGFuZ2VkJywgZnVuY3Rpb24gKCkgewogICAgICB2YXIgYXV0aGVkID0gVi5hdXRoICYmIHR5cGVvZiBWLmF1dGguaXNBdXRoZWQgPT09ICdmdW5jdGlvbicgPyBWLmF1dGguaXNBdXRoZWQoKSA6IGZhbHNlOwogICAgICBpZiAoIWJvb3RpbmcpIHsKICAgICAgICBpZiAoIWF1dGhlZCkgewogICAgICAgICAgY2xvc2VEcmF3ZXIoKTsKICAgICAgICAgIGRpc21pc3NPdmVybGF5KCk7CiAgICAgICAgICBoYW5kbGVSb3V0ZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzeW5jQ2hyb21lKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICBWLnN0b3JlLm9uKCdjcmVkaXRzOmNoYW5nZWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHJlZnJlc2hDcmVkaXRzUGlsbCgpOwogICAgfSk7CgogICAgVi5zdG9yZS5vbignZXJyb3InLCBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICB2YXIgbXNnID0gcGF5bG9hZCAmJiBwYXlsb2FkLm1lc3NhZ2UgPyBwYXlsb2FkLm1lc3NhZ2UgOiAnU29tZXRoaW5nIHdlbnQgd3JvbmcuJzsKICAgICAgdG9hc3QobXNnLCAnZXJyb3InKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gd2lyZUdsb2JhbEhhbmRsZXJzKCkgewogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7IGhhbmRsZVJvdXRlKCk7IH0sIGZhbHNlKTsKCiAgICB3aW5kb3cub25lcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBzb3VyY2UsIGxpbmVubywgY29sbm8sIGVycm9yKSB7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmVycm9yKCdbVi5vbmVycm9yXScsIG1lc3NhZ2UsIGVycm9yIHx8ICcnKTsKICAgICAgICB0b2FzdChmcmllbmRseUVycm9yKG1lc3NhZ2UpLCAnZXJyb3InKTsKICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKCiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5oYW5kbGVkcmVqZWN0aW9uJywgZnVuY3Rpb24gKGV2KSB7CiAgICAgIHZhciByZWFzb24gPSBldiAmJiBldi5yZWFzb247CiAgICAgIHZhciBtc2cgPSByZWFzb24gJiYgcmVhc29uLm1lc3NhZ2UgPyByZWFzb24ubWVzc2FnZSA6ICdBIGJhY2tncm91bmQgdGFzayBmYWlsZWQuJzsKICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmVycm9yKCdbVi51bmhhbmRsZWRyZWplY3Rpb25dJywgcmVhc29uIHx8ICcnKTsKICAgICAgaWYgKHJlYXNvbiAmJiAocmVhc29uLm5hbWUgPT09ICdBYm9ydEVycm9yJyB8fCByZWFzb24uYWJvcnRlZCA9PT0gdHJ1ZSkpIHJldHVybjsKICAgICAgdG9hc3QoZnJpZW5kbHlFcnJvcihtc2cpLCAnZXJyb3InKTsKICAgIH0pOwoKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvZmZsaW5lJywgZnVuY3Rpb24gKCkgeyB0b2FzdCgnWW914oCZcmUgb2ZmbGluZS4gQ2hhbmdlcyB3aWxsIHJldHJ5LicsICd3YXJuaW5nJyk7IH0pOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29ubGluZScsIGZ1bmN0aW9uICgpIHsgdG9hc3QoJ0JhY2sgb25saW5lLicsICdzdWNjZXNzJyk7IH0pOwoKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnIHx8IGUua2V5Q29kZSA9PT0gMjcpIHsKICAgICAgICBpZiAoY3VycmVudE92ZXJsYXlWaWV3KSB7IGNsb3NlT3ZlcmxheVRvQmFzZSgpOyBlLnByZXZlbnREZWZhdWx0KCk7IHJldHVybjsgfQogICAgICAgIGlmIChkcmF3ZXJFbCAmJiAhZHJhd2VyRWwuaGlkZGVuKSB7IGNsb3NlRHJhd2VyKCk7IGUucHJldmVudERlZmF1bHQoKTsgcmV0dXJuOyB9CiAgICAgIH0KICAgIH0sIGZhbHNlKTsKCiAgICBpZiAod2luZG93Lm1hdGNoTWVkaWEpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgbXEgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpOwogICAgICAgIHZhciBvblRoZW1lQ2hhbmdlID0gZnVuY3Rpb24gKCkgeyBhcHBseVRoZW1lKCk7IH07CiAgICAgICAgaWYgKG1xLmFkZEV2ZW50TGlzdGVuZXIpIG1xLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIG9uVGhlbWVDaGFuZ2UpOwogICAgICAgIGVsc2UgaWYgKG1xLmFkZExpc3RlbmVyKSBtcS5hZGRMaXN0ZW5lcihvblRoZW1lQ2hhbmdlKTsKICAgICAgfSBjYXRjaCAoZSkge30KICAgIH0KICB9CgogIGZ1bmN0aW9uIGZyaWVuZGx5RXJyb3IobXNnKSB7CiAgICB2YXIgbSA9IFN0cmluZyhtc2cgPT0gbnVsbCA/ICcnIDogbXNnKTsKICAgIGlmICgvbmV0d29ya3xmZXRjaHxsb2FkIGZhaWxlZHxmYWlsZWQgdG8gZmV0Y2gvaS50ZXN0KG0pKSB7CiAgICAgIHJldHVybiAnTmV0d29yayBoaWNjdXAg4oCUIHBsZWFzZSB0cnkgYWdhaW4uJzsKICAgIH0KICAgIGlmIChtLmxlbmd0aCA+IDE2MCkgbSA9IG0uc2xpY2UoMCwgMTU3KSArICfigKYnOwogICAgcmV0dXJuIG0gfHwgJ1NvbWV0aGluZyB3ZW50IHdyb25nLic7CiAgfQoKICB2YXIgcGVuZGluZ1JlZmVycmFsID0gbnVsbDsKICB2YXIgcGVuZGluZ1B1cmNoYXNlU3VjY2VzcyA9IGZhbHNlOwoKICBmdW5jdGlvbiBjYXB0dXJlR2xvYmFsSW50ZW50cygpIHsKICAgIHZhciBzZWFyY2ggPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoIHx8ICcnOwogICAgdmFyIHNlYXJjaFBhcmFtcyA9IHBhcnNlUXVlcnkoc2VhcmNoLmNoYXJBdCgwKSA9PT0gJz8nID8gc2VhcmNoLnNsaWNlKDEpIDogc2VhcmNoKTsKICAgIHZhciBoYXNoUGFyYW1zID0gY3VycmVudCgpLnBhcmFtcyB8fCB7fTsKCiAgICB2YXIgcmVmID0gc2VhcmNoUGFyYW1zLnIgfHwgaGFzaFBhcmFtcy5yIHx8IG51bGw7CiAgICBpZiAocmVmKSBwZW5kaW5nUmVmZXJyYWwgPSBTdHJpbmcocmVmKS50cmltKCk7CgogICAgdmFyIHB1cmNoYXNlID0gKHNlYXJjaFBhcmFtcy5wdXJjaGFzZSB8fCBoYXNoUGFyYW1zLnB1cmNoYXNlIHx8ICcnKS50b1N0cmluZygpOwogICAgaWYgKHB1cmNoYXNlID09PSAnc3VjY2VzcycpIHBlbmRpbmdQdXJjaGFzZVN1Y2Nlc3MgPSB0cnVlOwogIH0KCiAgZnVuY3Rpb24gZmx1c2hHbG9iYWxJbnRlbnRzKGF1dGhlZCkgewogICAgaWYgKHBlbmRpbmdQdXJjaGFzZVN1Y2Nlc3MpIHsKICAgICAgcGVuZGluZ1B1cmNoYXNlU3VjY2VzcyA9IGZhbHNlOwogICAgICBpZiAoYXV0aGVkICYmIFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLnJlZnJlc2hDcmVkaXRzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgVi5hdXRoLnJlZnJlc2hDcmVkaXRzKCk7CiAgICAgIH0KICAgICAgdG9hc3QoJ1B1cmNoYXNlIGNvbXBsZXRlIOKAlCBjcmVkaXRzIGFkZGVkIScsICdzdWNjZXNzJyk7CiAgICAgIGNlbGVicmF0ZSgpOwogICAgICBzdHJpcEdsb2JhbFF1ZXJ5UGFyYW0oJ3B1cmNoYXNlJyk7CiAgICB9CgogICAgaWYgKHBlbmRpbmdSZWZlcnJhbCkgewogICAgICB2YXIgY29kZSA9IHBlbmRpbmdSZWZlcnJhbDsKICAgICAgcGVuZGluZ1JlZmVycmFsID0gbnVsbDsKICAgICAgYXR0cmlidXRlUmVmZXJyYWwoY29kZSwgYXV0aGVkKTsKICAgICAgc3RyaXBHbG9iYWxRdWVyeVBhcmFtKCdyJyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhdHRyaWJ1dGVSZWZlcnJhbChjb2RlLCBhdXRoZWQpIHsKICAgIGlmICghY29kZSkgcmV0dXJuOwogICAgaWYgKCFhdXRoZWQpIHsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoVi5zdG9yZSkgewogICAgICAgICAgdmFyIHMgPSBWLnN0YXRlLnNldHRpbmdzIHx8IHt9OwogICAgICAgICAgcy5wZW5kaW5nUmVmZXJyYWwgPSBjb2RlOwogICAgICAgICAgVi5zdG9yZS5zZXQoJ3NldHRpbmdzJywgcyk7CiAgICAgICAgICBWLnN0b3JlLnNhdmUoKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChWLmFwaSAmJiB0eXBlb2YgVi5hcGkuYXR0cmlidXRlUmVmZXJyYWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgVi5hcGkuYXR0cmlidXRlUmVmZXJyYWwoY29kZSkKICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICB0b2FzdCgnUmVmZXJyYWwgYXBwbGllZCDigJQgd2VsY29tZSBhYm9hcmQhJywgJ3N1Y2Nlc3MnKTsKICAgICAgICAgIGNlbGVicmF0ZSgpOwogICAgICAgICAgaWYgKFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLnJlZnJlc2hDcmVkaXRzID09PSAnZnVuY3Rpb24nKSBWLmF1dGgucmVmcmVzaENyZWRpdHMoKTsKICAgICAgICB9KQogICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjZWxlYnJhdGUoKSB7CiAgICBpZiAocHJlZmVyc1JlZHVjZWRNb3Rpb24oKSkgcmV0dXJuOwogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuY29uZmV0dGkgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgVi51aS5jb25mZXR0aSgpOyB9IGNhdGNoIChlKSB7fSB9CiAgfQoKICBmdW5jdGlvbiBzdHJpcEdsb2JhbFF1ZXJ5UGFyYW0oa2V5KSB7CiAgICB0cnkgewogICAgICB2YXIgbG9jID0gd2luZG93LmxvY2F0aW9uOwogICAgICB2YXIgYmFzZSA9IGxvYy5ocmVmLnNwbGl0KCcjJylbMF0uc3BsaXQoJz8nKVswXTsKCiAgICAgIHZhciBzZWFyY2hQYXJhbXMgPSBwYXJzZVF1ZXJ5KChsb2Muc2VhcmNoIHx8ICcnKS5yZXBsYWNlKC9eXD8vLCAnJykpOwogICAgICBkZWxldGUgc2VhcmNoUGFyYW1zW2tleV07CiAgICAgIHZhciBuZXdTZWFyY2ggPSBidWlsZFF1ZXJ5KHNlYXJjaFBhcmFtcyk7CgogICAgICB2YXIgZGVzYyA9IGN1cnJlbnQoKTsKICAgICAgdmFyIGhwID0gT2JqZWN0LmFzc2lnbih7fSwgZGVzYy5wYXJhbXMgfHwge30pOwogICAgICBkZWxldGUgaHBba2V5XTsKICAgICAgZGVsZXRlIGhwLl9fb3ZlcmxheTsKICAgICAgdmFyIGhhc2hRdWVyeSA9IGJ1aWxkUXVlcnkoaHApOwogICAgICB2YXIgbmV3SGFzaCA9ICcjLycgKyAoZGVzYy5wYXRoIHx8IERFRkFVTFRfUk9VVEUpICsgKGhhc2hRdWVyeSA/ICc/JyArIGhhc2hRdWVyeSA6ICcnKTsKCiAgICAgIHZhciBuZXdVcmwgPSBiYXNlICsgKG5ld1NlYXJjaCA/ICc/JyArIG5ld1NlYXJjaCA6ICcnKSArIG5ld0hhc2g7CiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgbmV3VXJsKTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiBidWlsZFF1ZXJ5KG9iaikgewogICAgdmFyIHBhcnRzID0gW107CiAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGspKSBjb250aW51ZTsKICAgICAgaWYgKG9ialtrXSA9PSBudWxsIHx8IG9ialtrXSA9PT0gJycpIHsgcGFydHMucHVzaChlbmNvZGVVUklDb21wb25lbnQoaykpOyBjb250aW51ZTsgfQogICAgICBwYXJ0cy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChvYmpba10pKTsKICAgIH0KICAgIHJldHVybiBwYXJ0cy5qb2luKCcmJyk7CiAgfQoKICBmdW5jdGlvbiBhcHBseVRoZW1lKCkgewogICAgdmFyIHByZWYgPSAoVi5zdGF0ZSAmJiBWLnN0YXRlLnNldHRpbmdzICYmIFYuc3RhdGUuc2V0dGluZ3MudGhlbWUpIHx8ICdzeXN0ZW0nOwogICAgdmFyIHJlc29sdmVkID0gcHJlZjsKICAgIGlmIChwcmVmID09PSAnc3lzdGVtJykgewogICAgICByZXNvbHZlZCA9CiAgICAgICAgd2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpJykubWF0Y2hlcwogICAgICAgICAgPyAnbGlnaHQnCiAgICAgICAgICA6ICdkYXJrJzsKICAgIH0KICAgIHZhciByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnLCByZXNvbHZlZCk7CiAgICByb290LmNsYXNzTGlzdC50b2dnbGUoJ3YtdGhlbWUtbGlnaHQnLCByZXNvbHZlZCA9PT0gJ2xpZ2h0Jyk7CiAgICByb290LmNsYXNzTGlzdC50b2dnbGUoJ3YtdGhlbWUtZGFyaycsIHJlc29sdmVkICE9PSAnbGlnaHQnKTsKICB9CgogIGZ1bmN0aW9uIHByZWZlcnNSZWR1Y2VkTW90aW9uKCkgewogICAgaWYgKFYuc3RhdGUgJiYgVi5zdGF0ZS5zZXR0aW5ncyAmJiBWLnN0YXRlLnNldHRpbmdzLnJlZHVjZU1vdGlvbiA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7CiAgICB0cnkgewogICAgICByZXR1cm4gISEod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJykubWF0Y2hlcyk7CiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfQogIH0KCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGJvb3QsIHsgb25jZTogdHJ1ZSB9KTsKICB9IGVsc2UgewogICAgd2luZG93LnNldFRpbWVvdXQoYm9vdCwgMCk7CiAgfQoKICBWLnJvdXRlci5vcGVuRHJhd2VyID0gb3BlbkRyYXdlcjsKICBWLnJvdXRlci5jbG9zZURyYXdlciA9IGNsb3NlRHJhd2VyOwogIFYucm91dGVyLnRvZ2dsZURyYXdlciA9IHRvZ2dsZURyYXdlcjsKICBWLnJvdXRlci5yZWZyZXNoQ2hyb21lID0gc3luY0Nocm9tZTsKfSkoKTsKCg== and  are placeholder tokens the deploy build  replaces with base64 strings. If a token is left unreplaced (e.g. dev), the  bootstrap detects it and shows a clear "not yet deployed" message instead of  silently failing.--><script>(function () {  "use strict";  var APP_B64 = "LyogVm9vc2V5V2ViIGJ1bmRsZSDigJQgZ2VuZXJhdGVkIGJ5IGRlcGxveS9idWlsZC5zaCBvbiAyMDI2LTA1LTMxVDE3OjAwOjUwWiAqLwoidXNlIHN0cmljdCI7CgovKiA9PT09PSBzcmMvanMvdXRpbC5qcyA9PT09PSAqLwoKKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwoKICBmdW5jdGlvbiBzYWZlRGVjb2RlKHMpIHsKICAgIGlmIChzID09IG51bGwpIHJldHVybiAnJzsKICAgIHRyeSB7CgogICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KFN0cmluZyhzKS5yZXBsYWNlKC9cKy9nLCAnICcpKTsKICAgIH0gY2F0Y2ggKF9lKSB7CiAgICAgIHJldHVybiBTdHJpbmcocyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBxcyhoYXNoKSB7CiAgICB2YXIgcmF3ID0gaGFzaCA9PSBudWxsID8gKHdpbmRvdy5sb2NhdGlvbiA/IHdpbmRvdy5sb2NhdGlvbi5oYXNoIDogJycpIDogU3RyaW5nKGhhc2gpOwoKICAgIHZhciBoYXNoSWR4ID0gcmF3LmluZGV4T2YoJyMnKTsKICAgIGlmIChoYXNoSWR4ICE9PSAtMSkgcmF3ID0gcmF3LnNsaWNlKGhhc2hJZHggKyAxKTsKCiAgICB2YXIgcXVlcnlTdHIgPSAnJzsKICAgIHZhciBxSWR4ID0gcmF3LmluZGV4T2YoJz8nKTsKICAgIGlmIChxSWR4ICE9PSAtMSkgewogICAgICBxdWVyeVN0ciA9IHJhdy5zbGljZShxSWR4ICsgMSk7CiAgICAgIHJhdyA9IHJhdy5zbGljZSgwLCBxSWR4KTsKICAgIH0KCiAgICB2YXIgcm91dGUgPSByYXcucmVwbGFjZSgvXlwvKy8sICcnKS5yZXBsYWNlKC9cLyskLywgJycpOwogICAgaWYgKHJvdXRlID09PSAnJykgcm91dGUgPSAnY3JlYXRlJzsKCiAgICB2YXIgcGFyYW1zID0ge307CiAgICBpZiAocXVlcnlTdHIpIHsKICAgICAgdmFyIHBhaXJzID0gcXVlcnlTdHIuc3BsaXQoJyYnKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBwYWlyID0gcGFpcnNbaV07CiAgICAgICAgaWYgKCFwYWlyKSBjb250aW51ZTsKICAgICAgICB2YXIgZXEgPSBwYWlyLmluZGV4T2YoJz0nKTsKICAgICAgICB2YXIga2V5LCB2YWw7CiAgICAgICAgaWYgKGVxID09PSAtMSkgewogICAgICAgICAga2V5ID0gc2FmZURlY29kZShwYWlyKTsKICAgICAgICAgIHZhbCA9ICcnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBrZXkgPSBzYWZlRGVjb2RlKHBhaXIuc2xpY2UoMCwgZXEpKTsKICAgICAgICAgIHZhbCA9IHNhZmVEZWNvZGUocGFpci5zbGljZShlcSArIDEpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGtleSkgcGFyYW1zW2tleV0gPSB2YWw7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4geyByb3V0ZTogcm91dGUsIHBhcmFtczogcGFyYW1zIH07CiAgfQoKICBmdW5jdGlvbiBxc1N0cmluZyhwYXJhbXMpIHsKICAgIGlmICghcGFyYW1zKSByZXR1cm4gJyc7CiAgICB2YXIgcGFydHMgPSBbXTsKICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocGFyYW1zKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgayA9IGtleXNbaV07CiAgICAgIHZhciB2ID0gcGFyYW1zW2tdOwogICAgICBpZiAodiA9PSBudWxsKSBjb250aW51ZTsKICAgICAgcGFydHMucHVzaChlbmNvZGVVUklDb21wb25lbnQoaykgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKHYpKSk7CiAgICB9CiAgICByZXR1cm4gcGFydHMuam9pbignJicpOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRIYXNoKHJvdXRlLCBwYXJhbXMpIHsKICAgIHZhciByID0gU3RyaW5nKHJvdXRlIHx8ICdjcmVhdGUnKS5yZXBsYWNlKC9eIz9cLz8vLCAnJyk7CiAgICB2YXIgcXVlcnkgPSBxc1N0cmluZyhwYXJhbXMpOwogICAgcmV0dXJuICcjLycgKyByICsgKHF1ZXJ5ID8gJz8nICsgcXVlcnkgOiAnJyk7CiAgfQoKICBmdW5jdGlvbiBkZWJvdW5jZShmbiwgbXMsIGltbWVkaWF0ZSkgewogICAgdmFyIHdhaXQgPSB0eXBlb2YgbXMgPT09ICdudW1iZXInID8gbXMgOiAyMDA7CiAgICB2YXIgdGltZXIgPSBudWxsOwoKICAgIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHsKICAgICAgdmFyIGN0eCA9IHRoaXM7CiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzOwogICAgICB2YXIgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiB0aW1lciA9PT0gbnVsbDsKCiAgICAgIGlmICh0aW1lciAhPT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgICAgaWYgKCFpbW1lZGlhdGUpIGZuLmFwcGx5KGN0eCwgYXJncyk7CiAgICAgIH0sIHdhaXQpOwoKICAgICAgaWYgKGNhbGxOb3cpIGZuLmFwcGx5KGN0eCwgYXJncyk7CiAgICB9CgogICAgZGVib3VuY2VkLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHRpbWVyICE9PSBudWxsKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgIH0KICAgIH07CgogICAgcmV0dXJuIGRlYm91bmNlZDsKICB9CgogIGZ1bmN0aW9uIHNsZWVwKG1zKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBNYXRoLm1heCgwLCBtcyB8IDApKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gdXVpZCgpIHsKICAgIHZhciBjID0gKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0bykgfHwKICAgICAgICAgICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8pIHx8IG51bGw7CgogICAgaWYgKGMgJiYgdHlwZW9mIGMucmFuZG9tVVVJRCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgeyByZXR1cm4gYy5yYW5kb21VVUlEKCk7IH0gY2F0Y2ggKF9lKSB7ICB9CiAgICB9CgogICAgaWYgKGMgJiYgdHlwZW9mIGMuZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgICAgYy5nZXRSYW5kb21WYWx1ZXMoYnl0ZXMpOwoKICAgICAgYnl0ZXNbNl0gPSAoYnl0ZXNbNl0gJiAweDBmKSB8IDB4NDA7CiAgICAgIGJ5dGVzWzhdID0gKGJ5dGVzWzhdICYgMHgzZikgfCAweDgwOwogICAgICB2YXIgaGV4ID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIGhleFtpXSA9IChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zbGljZSgxKTsKICAgICAgdmFyIGIgPSBieXRlczsKICAgICAgcmV0dXJuICgKICAgICAgICBoZXhbYlswXV0gKyBoZXhbYlsxXV0gKyBoZXhbYlsyXV0gKyBoZXhbYlszXV0gKyAnLScgKwogICAgICAgIGhleFtiWzRdXSArIGhleFtiWzVdXSArICctJyArCiAgICAgICAgaGV4W2JbNl1dICsgaGV4W2JbN11dICsgJy0nICsKICAgICAgICBoZXhbYls4XV0gKyBoZXhbYls5XV0gKyAnLScgKwogICAgICAgIGhleFtiWzEwXV0gKyBoZXhbYlsxMV1dICsgaGV4W2JbMTJdXSArIGhleFtiWzEzXV0gKyBoZXhbYlsxNF1dICsgaGV4W2JbMTVdXQogICAgICApOwogICAgfQoKICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjaCkgewogICAgICB2YXIgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDsKICAgICAgdmFyIHYgPSBjaCA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODsKICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzaG9ydElEKGlkKSB7CiAgICBpZiAoIWlkKSByZXR1cm4gJyc7CiAgICByZXR1cm4gU3RyaW5nKGlkKS5yZXBsYWNlKC8tL2csICcnKS5zbGljZSgwLCA4KTsKICB9CgogIGZ1bmN0aW9uIGNsYW1wKG4sIG1pbiwgbWF4KSB7CiAgICB2YXIgbG8gPSBtaW4sIGhpID0gbWF4OwogICAgaWYgKGxvID4gaGkpIHsgdmFyIHQgPSBsbzsgbG8gPSBoaTsgaGkgPSB0OyB9CiAgICBuID0gK247CiAgICBpZiAoIWlzRmluaXRlKG4pKSByZXR1cm4gbG87CiAgICByZXR1cm4gbiA8IGxvID8gbG8gOiBuID4gaGkgPyBoaSA6IG47CiAgfQoKICBmdW5jdGlvbiByYW5kb21TZWVkKCkgewogICAgdmFyIGMgPSAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvKSB8fAogICAgICAgICAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNyeXB0bykgfHwgbnVsbDsKICAgIGlmIChjICYmIHR5cGVvZiBjLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgYXJyID0gbmV3IFVpbnQzMkFycmF5KDEpOwogICAgICBjLmdldFJhbmRvbVZhbHVlcyhhcnIpOwogICAgICByZXR1cm4gYXJyWzBdICUgMTAwMDAwMDsKICAgIH0KICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlRGF0ZSh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gbnVsbDsKICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBpc05hTih2YWx1ZS5nZXRUaW1lKCkpID8gbnVsbCA6IHZhbHVlOwoKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8ICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIC9eXGQrKFwuXGQrKT8kLy50ZXN0KHZhbHVlLnRyaW0oKSkpKSB7CiAgICAgIHZhciBudW0gPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBwYXJzZUZsb2F0KHZhbHVlKTsKICAgICAgaWYgKCFpc0Zpbml0ZShudW0pKSByZXR1cm4gbnVsbDsKCiAgICAgIHZhciBtcyA9IG51bSA8IDFlMTEgPyBudW0gKiAxMDAwIDogbnVtOwogICAgICB2YXIgZE51bSA9IG5ldyBEYXRlKG1zKTsKICAgICAgcmV0dXJuIGlzTmFOKGROdW0uZ2V0VGltZSgpKSA/IG51bGwgOiBkTnVtOwogICAgfQoKICAgIHZhciBzID0gU3RyaW5nKHZhbHVlKS50cmltKCk7CiAgICB2YXIgZCA9IG5ldyBEYXRlKHMpOwogICAgaWYgKCFpc05hTihkLmdldFRpbWUoKSkpIHJldHVybiBkOwoKICAgIHZhciBjb2VyY2VkID0gcy5yZXBsYWNlKCcgJywgJ1QnKTsKICAgIGlmICghL1t6Wl18WystXVxkezJ9Oj9cZHsyfSQvLnRlc3QoY29lcmNlZCkpIGNvZXJjZWQgKz0gJ1onOwogICAgZCA9IG5ldyBEYXRlKGNvZXJjZWQpOwogICAgcmV0dXJuIGlzTmFOKGQuZ2V0VGltZSgpKSA/IG51bGwgOiBkOwogIH0KCiAgdmFyIF9hYnNGbXQgPSBudWxsOwogIGZ1bmN0aW9uIGFic29sdXRlRm9ybWF0dGVyKCkgewogICAgaWYgKF9hYnNGbXQgIT09IG51bGwpIHJldHVybiBfYWJzRm10OwogICAgdHJ5IHsKICAgICAgX2Fic0ZtdCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHVuZGVmaW5lZCwgewogICAgICAgIHllYXI6ICdudW1lcmljJywgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLAogICAgICAgIGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcKICAgICAgfSk7CiAgICB9IGNhdGNoIChfZSkgewogICAgICBfYWJzRm10ID0gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gX2Fic0ZtdDsKICB9CgogIGZ1bmN0aW9uIGZtdERhdGUodmFsdWUsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGQgPSBwYXJzZURhdGUodmFsdWUpOwogICAgaWYgKCFkKSByZXR1cm4gJyc7CgogICAgdmFyIG5vd01zID0gb3B0cy5ub3cgIT0gbnVsbCA/IChvcHRzLm5vdyBpbnN0YW5jZW9mIERhdGUgPyBvcHRzLm5vdy5nZXRUaW1lKCkgOiArb3B0cy5ub3cpIDogRGF0ZS5ub3coKTsKICAgIHZhciBkaWZmID0gbm93TXMgLSBkLmdldFRpbWUoKTsKCiAgICBpZiAob3B0cy5hYnNvbHV0ZSkgcmV0dXJuIGZvcm1hdEFic29sdXRlKGQpOwoKICAgIHZhciByZWwgPSBmb3JtYXRSZWxhdGl2ZShkaWZmKTsKICAgIGlmIChvcHRzLnJlbGF0aXZlKSByZXR1cm4gcmVsOwoKICAgIHZhciBTRVZFTl9EQVlTID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7CiAgICBpZiAoTWF0aC5hYnMoZGlmZikgPCBTRVZFTl9EQVlTKSByZXR1cm4gcmVsOwogICAgcmV0dXJuIGZvcm1hdEFic29sdXRlKGQpOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0QWJzb2x1dGUoZCkgewogICAgdmFyIGZtdCA9IGFic29sdXRlRm9ybWF0dGVyKCk7CiAgICBpZiAoZm10KSB7CiAgICAgIHRyeSB7IHJldHVybiBmbXQuZm9ybWF0KGQpOyB9IGNhdGNoIChfZSkgeyAgfQogICAgfQoKICAgIHJldHVybiBkLnRvTG9jYWxlU3RyaW5nCiAgICAgID8gZC50b0xvY2FsZVN0cmluZygpCiAgICAgIDogZC50b0lTT1N0cmluZygpLnJlcGxhY2UoJ1QnLCAnICcpLnNsaWNlKDAsIDE2KTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlKGRpZmZNcykgewogICAgdmFyIGZ1dHVyZSA9IGRpZmZNcyA8IDA7CiAgICB2YXIgbXMgPSBNYXRoLmFicyhkaWZmTXMpOwogICAgdmFyIHMgPSBNYXRoLnJvdW5kKG1zIC8gMTAwMCk7CgogICAgaWYgKHMgPCA1KSByZXR1cm4gJ2p1c3Qgbm93JzsKICAgIGlmIChzIDwgNjApIHJldHVybiBzdWZmaXgocyArICdzJywgZnV0dXJlKTsKCiAgICB2YXIgbSA9IE1hdGgucm91bmQocyAvIDYwKTsKICAgIGlmIChtIDwgNjApIHJldHVybiBzdWZmaXgobSArICdtJywgZnV0dXJlKTsKCiAgICB2YXIgaCA9IE1hdGgucm91bmQobSAvIDYwKTsKICAgIGlmIChoIDwgMjQpIHJldHVybiBzdWZmaXgoaCArICdoJywgZnV0dXJlKTsKCiAgICB2YXIgZHlzID0gTWF0aC5yb3VuZChoIC8gMjQpOwogICAgaWYgKGR5cyA8IDcpIHJldHVybiBzdWZmaXgoZHlzICsgJ2QnLCBmdXR1cmUpOwoKICAgIHZhciB3ID0gTWF0aC5yb3VuZChkeXMgLyA3KTsKICAgIGlmICh3IDwgNSkgcmV0dXJuIHN1ZmZpeCh3ICsgJ3cnLCBmdXR1cmUpOwoKICAgIHZhciBtbyA9IE1hdGgucm91bmQoZHlzIC8gMzApOwogICAgaWYgKG1vIDwgMTIpIHJldHVybiBzdWZmaXgobW8gKyAnbW8nLCBmdXR1cmUpOwoKICAgIHZhciB5ID0gTWF0aC5yb3VuZChkeXMgLyAzNjUpOwogICAgcmV0dXJuIHN1ZmZpeCh5ICsgJ3knLCBmdXR1cmUpOwogIH0KCiAgZnVuY3Rpb24gc3VmZml4KGNvcmUsIGZ1dHVyZSkgewogICAgcmV0dXJuIGZ1dHVyZSA/ICdpbiAnICsgY29yZSA6IGNvcmUgKyAnIGFnbyc7CiAgfQoKICBmdW5jdGlvbiBpc29EYXRlKHZhbHVlKSB7CiAgICB2YXIgZCA9IHZhbHVlID09IG51bGwgPyBuZXcgRGF0ZSgpIDogcGFyc2VEYXRlKHZhbHVlKTsKICAgIGlmICghZCkgcmV0dXJuICcnOwoKICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXC5cZHszfVokLywgJ1onKTsKICB9CgogIGZ1bmN0aW9uIGI2NChzdHIpIHsKICAgIHZhciBzID0gc3RyID09IG51bGwgPyAnJyA6IFN0cmluZyhzdHIpOwoKICAgIHRyeSB7CiAgICAgIGlmICh0eXBlb2YgYnRvYSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHZhciBiaW4gPSBlbmNvZGVVUklDb21wb25lbnQocykucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZywgZnVuY3Rpb24gKF9tLCBoZXgpIHsKICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGhleCwgMTYpKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gYnRvYShiaW4pOwogICAgICB9CiAgICB9IGNhdGNoIChfZSkgeyAgfQoKICAgIHJldHVybiBieXRlc1RvQmFzZTY0KHV0ZjhCeXRlcyhzKSk7CiAgfQoKICBmdW5jdGlvbiB1bmI2NChiKSB7CiAgICB2YXIgcyA9IGIgPT0gbnVsbCA/ICcnIDogU3RyaW5nKGIpOwogICAgdHJ5IHsKICAgICAgaWYgKHR5cGVvZiBhdG9iID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdmFyIGJpbiA9IGF0b2Iocyk7CiAgICAgICAgdmFyIHBjdCA9ICcnOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmluLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBwY3QgKz0gJyUnICsgKCcwMCcgKyBiaW4uY2hhckNvZGVBdChpKS50b1N0cmluZygxNikpLnNsaWNlKC0yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChwY3QpOwogICAgICB9CiAgICB9IGNhdGNoIChfZSkgeyAgfQogICAgcmV0dXJuIGJhc2U2NFRvVXRmOChzKTsKICB9CgogIGZ1bmN0aW9uIHV0ZjhCeXRlcyhzdHIpIHsKICAgIGlmICh0eXBlb2YgVGV4dEVuY29kZXIgPT09ICdmdW5jdGlvbicpIHJldHVybiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTsKCiAgICB2YXIgb3V0ID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICBpZiAoYyA8IDB4ODApIG91dC5wdXNoKGMpOwogICAgICBlbHNlIGlmIChjIDwgMHg4MDApIHsKICAgICAgICBvdXQucHVzaCgweGMwIHwgKGMgPj4gNiksIDB4ODAgfCAoYyAmIDB4M2YpKTsKICAgICAgfSBlbHNlIGlmIChjID49IDB4ZDgwMCAmJiBjIDw9IDB4ZGJmZikgewogICAgICAgIHZhciBjMiA9IHN0ci5jaGFyQ29kZUF0KCsraSk7CiAgICAgICAgdmFyIGNwID0gMHgxMDAwMCArICgoKGMgJiAweDNmZikgPDwgMTApIHwgKGMyICYgMHgzZmYpKTsKICAgICAgICBvdXQucHVzaCgweGYwIHwgKGNwID4+IDE4KSwgMHg4MCB8ICgoY3AgPj4gMTIpICYgMHgzZiksIDB4ODAgfCAoKGNwID4+IDYpICYgMHgzZiksIDB4ODAgfCAoY3AgJiAweDNmKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3V0LnB1c2goMHhlMCB8IChjID4+IDEyKSwgMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpLCAweDgwIHwgKGMgJiAweDNmKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgVWludDhBcnJheShvdXQpOwogIH0KCiAgdmFyIEI2NF9DSEFSUyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJzsKCiAgZnVuY3Rpb24gYnl0ZXNUb0Jhc2U2NChieXRlcykgewogICAgdmFyIG91dCA9ICcnOwogICAgdmFyIGk7CiAgICBmb3IgKGkgPSAwOyBpICsgMiA8IGJ5dGVzLmxlbmd0aDsgaSArPSAzKSB7CiAgICAgIHZhciBuID0gKGJ5dGVzW2ldIDw8IDE2KSB8IChieXRlc1tpICsgMV0gPDwgOCkgfCBieXRlc1tpICsgMl07CiAgICAgIG91dCArPSBCNjRfQ0hBUlNbKG4gPj4gMTgpICYgNjNdICsgQjY0X0NIQVJTWyhuID4+IDEyKSAmIDYzXSArIEI2NF9DSEFSU1sobiA+PiA2KSAmIDYzXSArIEI2NF9DSEFSU1tuICYgNjNdOwogICAgfQogICAgdmFyIHJlbSA9IGJ5dGVzLmxlbmd0aCAtIGk7CiAgICBpZiAocmVtID09PSAxKSB7CiAgICAgIHZhciBhID0gYnl0ZXNbaV0gPDwgMTY7CiAgICAgIG91dCArPSBCNjRfQ0hBUlNbKGEgPj4gMTgpICYgNjNdICsgQjY0X0NIQVJTWyhhID4+IDEyKSAmIDYzXSArICc9PSc7CiAgICB9IGVsc2UgaWYgKHJlbSA9PT0gMikgewogICAgICB2YXIgYiA9IChieXRlc1tpXSA8PCAxNikgfCAoYnl0ZXNbaSArIDFdIDw8IDgpOwogICAgICBvdXQgKz0gQjY0X0NIQVJTWyhiID4+IDE4KSAmIDYzXSArIEI2NF9DSEFSU1soYiA+PiAxMikgJiA2M10gKyBCNjRfQ0hBUlNbKGIgPj4gNikgJiA2M10gKyAnPSc7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KCiAgZnVuY3Rpb24gYmFzZTY0VG9VdGY4KGIpIHsKICAgIHZhciBjbGVhbiA9IGIucmVwbGFjZSgvW15BLVphLXowLTkrLz1dL2csICcnKTsKICAgIHZhciBieXRlcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGVhbi5sZW5ndGg7IGkgKz0gNCkgewogICAgICB2YXIgZTAgPSBCNjRfQ0hBUlMuaW5kZXhPZihjbGVhbltpXSk7CiAgICAgIHZhciBlMSA9IEI2NF9DSEFSUy5pbmRleE9mKGNsZWFuW2kgKyAxXSk7CiAgICAgIHZhciBlMiA9IGNsZWFuW2kgKyAyXSA9PT0gJz0nID8gLTEgOiBCNjRfQ0hBUlMuaW5kZXhPZihjbGVhbltpICsgMl0pOwogICAgICB2YXIgZTMgPSBjbGVhbltpICsgM10gPT09ICc9JyA/IC0xIDogQjY0X0NIQVJTLmluZGV4T2YoY2xlYW5baSArIDNdKTsKICAgICAgdmFyIG4gPSAoZTAgPDwgMTgpIHwgKGUxIDw8IDEyKSB8ICgoZTIgPCAwID8gMCA6IGUyKSA8PCA2KSB8IChlMyA8IDAgPyAwIDogZTMpOwogICAgICBieXRlcy5wdXNoKChuID4+IDE2KSAmIDB4ZmYpOwogICAgICBpZiAoZTIgPj0gMCkgYnl0ZXMucHVzaCgobiA+PiA4KSAmIDB4ZmYpOwogICAgICBpZiAoZTMgPj0gMCkgYnl0ZXMucHVzaChuICYgMHhmZik7CiAgICB9CiAgICBpZiAodHlwZW9mIFRleHREZWNvZGVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKG5ldyBVaW50OEFycmF5KGJ5dGVzKSk7CiAgICB2YXIgc3RyID0gJyc7CiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGJ5dGVzLmxlbmd0aDsgaisrKSBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tqXSk7CiAgICB0cnkgeyByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShzdHIpKTsgfSBjYXRjaCAoX2UpIHsgcmV0dXJuIHN0cjsgfQogIH0KCiAgZnVuY3Rpb24gYmFzaWNBdXRoSGVhZGVyKGVtYWlsLCBwdykgewogICAgdmFyIGUgPSAoZW1haWwgPT0gbnVsbCA/ICcnIDogU3RyaW5nKGVtYWlsKSkudG9Mb3dlckNhc2UoKTsKICAgIHZhciBwID0gcHcgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHB3KTsKICAgIHJldHVybiAnQmFzaWMgJyArIGI2NChlICsgJzonICsgcCk7CiAgfQoKICB2YXIgSFRNTF9FU0NBUEVTID0gewogICAgJyYnOiAnJmFtcDsnLAogICAgJzwnOiAnJmx0OycsCiAgICAnPic6ICcmZ3Q7JywKICAgICciJzogJyZxdW90OycsCiAgICAiJyI6ICcmIzM5OycsCiAgICAnYCc6ICcmIzk2OycsCiAgICAnPSc6ICcmIzYxOycKICB9OwoKICBmdW5jdGlvbiBlc2NhcGVIdG1sKHMpIHsKICAgIGlmIChzID09IG51bGwpIHJldHVybiAnJzsKICAgIHJldHVybiBTdHJpbmcocykucmVwbGFjZSgvWyY8PiInYD1dL2csIGZ1bmN0aW9uIChjaCkgewogICAgICByZXR1cm4gSFRNTF9FU0NBUEVTW2NoXTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZG93bmxvYWQodXJsLCBmaWxlbmFtZSkgewogICAgaWYgKCF1cmwpIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ2Rvd25sb2FkOiBtaXNzaW5nIHVybCcpKTsKICAgIHZhciBuYW1lID0gZmlsZW5hbWUgfHwgaW5mZXJGaWxlbmFtZSh1cmwpOwoKICAgIHJldHVybiBmZXRjaCh1cmwsIHsgbW9kZTogJ2NvcnMnLCBjcmVkZW50aWFsczogJ29taXQnIH0pCiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKCdkb3dubG9hZDogSFRUUCAnICsgcmVzLnN0YXR1cyk7CiAgICAgICAgcmV0dXJuIHJlcy5ibG9iKCk7CiAgICAgIH0pCiAgICAgIC50aGVuKGZ1bmN0aW9uIChibG9iKSB7CgogICAgICAgIGlmIChuYW1lLmluZGV4T2YoJy4nKSA9PT0gLTEpIHsKICAgICAgICAgIHZhciBleHQgPSBleHRGb3JNaW1lKGJsb2IudHlwZSk7CiAgICAgICAgICBpZiAoZXh0KSBuYW1lICs9ICcuJyArIGV4dDsKICAgICAgICB9CiAgICAgICAgdHJpZ2dlckJsb2JEb3dubG9hZChibG9iLCBuYW1lKTsKICAgICAgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciB3ID0gd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJywgJ25vb3BlbmVyJyk7CiAgICAgICAgICBpZiAodykgcmV0dXJuOwogICAgICAgIH0gY2F0Y2ggKF9lKSB7ICB9CiAgICAgICAgdGhyb3cgZXJyOwogICAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHRyaWdnZXJCbG9iRG93bmxvYWQoYmxvYiwgbmFtZSkgewogICAgdmFyIG9ialVSTCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CiAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgIGEuaHJlZiA9IG9ialVSTDsKICAgIGEuZG93bmxvYWQgPSBuYW1lIHx8ICdkb3dubG9hZCc7CiAgICBhLnJlbCA9ICdub29wZW5lcic7CiAgICBhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOwogICAgYS5jbGljaygpOwoKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwogICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKG9ialVSTCk7CiAgICB9LCAxNTAwKTsKICB9CgogIGZ1bmN0aW9uIGluZmVyRmlsZW5hbWUodXJsKSB7CiAgICB0cnkgewogICAgICB2YXIgdSA9IG5ldyBVUkwodXJsLCB3aW5kb3cubG9jYXRpb24gPyB3aW5kb3cubG9jYXRpb24uaHJlZiA6IHVuZGVmaW5lZCk7CiAgICAgIHZhciBsYXN0ID0gdS5wYXRobmFtZS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5wb3AoKTsKICAgICAgaWYgKGxhc3QpIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQobGFzdCk7CiAgICB9IGNhdGNoIChfZSkgeyAgfQogICAgdmFyIHN0cmlwcGVkID0gU3RyaW5nKHVybCkuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdOwogICAgdmFyIHNlZyA9IHN0cmlwcGVkLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pLnBvcCgpOwogICAgcmV0dXJuIHNlZyB8fCAoJ3ZhbXAtJyArIERhdGUubm93KCkpOwogIH0KCiAgZnVuY3Rpb24gZXh0Rm9yTWltZShtaW1lKSB7CiAgICBzd2l0Y2ggKG1pbWUpIHsKICAgICAgY2FzZSAnaW1hZ2UvanBlZyc6IHJldHVybiAnanBnJzsKICAgICAgY2FzZSAnaW1hZ2UvcG5nJzogcmV0dXJuICdwbmcnOwogICAgICBjYXNlICdpbWFnZS93ZWJwJzogcmV0dXJuICd3ZWJwJzsKICAgICAgY2FzZSAnaW1hZ2UvZ2lmJzogcmV0dXJuICdnaWYnOwogICAgICBjYXNlICdpbWFnZS9oZWljJzogcmV0dXJuICdoZWljJzsKICAgICAgY2FzZSAndmlkZW8vbXA0JzogcmV0dXJuICdtcDQnOwogICAgICBjYXNlICd2aWRlby9xdWlja3RpbWUnOiByZXR1cm4gJ21vdic7CiAgICAgIGNhc2UgJ3ZpZGVvL3dlYm0nOiByZXR1cm4gJ3dlYm0nOwogICAgICBkZWZhdWx0OiByZXR1cm4gJyc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb3B5KHRleHQpIHsKICAgIHZhciBzID0gdGV4dCA9PSBudWxsID8gJycgOiBTdHJpbmcodGV4dCk7CiAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCAmJiB3aW5kb3cuaXNTZWN1cmVDb250ZXh0KSB7CiAgICAgIHJldHVybiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0sIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gbGVnYWN5Q29weShzKTsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGxlZ2FjeUNvcHkocykpOwogIH0KCiAgZnVuY3Rpb24gbGVnYWN5Q29weShzKSB7CiAgICB0cnkgewogICAgICB2YXIgdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogICAgICB0YS52YWx1ZSA9IHM7CiAgICAgIHRhLnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAnJyk7CiAgICAgIHRhLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJzsKICAgICAgdGEuc3R5bGUudG9wID0gJy0xMDAwcHgnOwogICAgICB0YS5zdHlsZS5vcGFjaXR5ID0gJzAnOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhKTsKICAgICAgdGEuc2VsZWN0KCk7CiAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKDAsIHMubGVuZ3RoKTsKICAgICAgdmFyIG9rID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQgJiYgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsKICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0YSk7CiAgICAgIHJldHVybiAhIW9rOwogICAgfSBjYXRjaCAoX2UpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZGF0YVVSTFRvQmxvYihkYXRhVVJMKSB7CiAgICB2YXIgcGFydHMgPSBTdHJpbmcoZGF0YVVSTCkuc3BsaXQoJywnKTsKICAgIHZhciBoZWFkZXIgPSBwYXJ0c1swXSB8fCAnJzsKICAgIHZhciBib2R5ID0gcGFydHNbMV0gfHwgJyc7CiAgICB2YXIgbWltZU1hdGNoID0gaGVhZGVyLm1hdGNoKC9kYXRhOihbXjtdKykvKTsKICAgIHZhciBtaW1lID0gbWltZU1hdGNoID8gbWltZU1hdGNoWzFdIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICB2YXIgaXNCYXNlNjQgPSAvO2Jhc2U2NC9pLnRlc3QoaGVhZGVyKTsKICAgIHZhciBiaW5hcnkgPSBpc0Jhc2U2NCA/IGF0b2IoYm9keSkgOiBkZWNvZGVVUklDb21wb25lbnQoYm9keSk7CiAgICB2YXIgbGVuID0gYmluYXJ5Lmxlbmd0aDsKICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBieXRlc1tpXSA9IGJpbmFyeS5jaGFyQ29kZUF0KGkpOwogICAgcmV0dXJuIG5ldyBCbG9iKFtieXRlc10sIHsgdHlwZTogbWltZSB9KTsKICB9CgogIGZ1bmN0aW9uIGJsb2JUb0RhdGFVUkwoYmxvYikgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGZyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgZnIub25sb2FkID0gZnVuY3Rpb24gKCkgeyByZXNvbHZlKGZyLnJlc3VsdCk7IH07CiAgICAgIGZyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJlamVjdChmci5lcnJvciB8fCBuZXcgRXJyb3IoJ0ZpbGVSZWFkZXIgZmFpbGVkJykpOyB9OwogICAgICBmci5yZWFkQXNEYXRhVVJMKGJsb2IpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBieXRlc1RvQmxvYihieXRlcywgbWltZSkgewogICAgcmV0dXJuIG5ldyBCbG9iKFtieXRlc10sIHsgdHlwZTogbWltZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9KTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdEJ5dGVzKG4pIHsKICAgIG4gPSArbjsKICAgIGlmICghaXNGaW5pdGUobikgfHwgbiA8PSAwKSByZXR1cm4gJzAgQic7CiAgICB2YXIgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInXTsKICAgIHZhciBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhuKSAvIE1hdGgubG9nKDEwMjQpKTsKICAgIGkgPSBjbGFtcChpLCAwLCB1bml0cy5sZW5ndGggLSAxKTsKICAgIHZhciB2YWwgPSBuIC8gTWF0aC5wb3coMTAyNCwgaSk7CiAgICB2YXIgc3RyID0gaSA9PT0gMCA/IFN0cmluZyh2YWwpIDogdmFsLnRvRml4ZWQodmFsIDwgMTAgPyAxIDogMCk7CiAgICByZXR1cm4gc3RyICsgJyAnICsgdW5pdHNbaV07CiAgfQoKICBmdW5jdGlvbiBwbHVyYWxpemUobiwgb25lLCBtYW55KSB7CiAgICB2YXIgY291bnQgPSBuIHwgMDsKICAgIHZhciB3b3JkID0gY291bnQgPT09IDEgPyBvbmUgOiAobWFueSB8fCBvbmUgKyAncycpOwogICAgcmV0dXJuIGNvdW50ICsgJyAnICsgd29yZDsKICB9CgogIGZ1bmN0aW9uIHRydW5jYXRlKHMsIG1heCkgewogICAgaWYgKHMgPT0gbnVsbCkgcmV0dXJuICcnOwogICAgcyA9IFN0cmluZyhzKTsKICAgIHZhciBsaW1pdCA9IG1heCB8IDA7CiAgICBpZiAobGltaXQgPD0gMCB8fCBzLmxlbmd0aCA8PSBsaW1pdCkgcmV0dXJuIHM7CiAgICByZXR1cm4gcy5zbGljZSgwLCBNYXRoLm1heCgwLCBsaW1pdCAtIDEpKS5yZXBsYWNlKC9ccyskLywgJycpICsgJ+KApic7CiAgfQoKICBmdW5jdGlvbiBpc0VtYWlsKHMpIHsKICAgIGlmICghcykgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIC9eW15cc0BdK0BbXlxzQF0rXC5bXlxzQF0rJC8udGVzdChTdHJpbmcocykudHJpbSgpKTsKICB9CgogIFYudXRpbCA9IHsKCiAgICBxczogcXMsCiAgICBxc1N0cmluZzogcXNTdHJpbmcsCiAgICBidWlsZEhhc2g6IGJ1aWxkSGFzaCwKCiAgICBkZWJvdW5jZTogZGVib3VuY2UsCiAgICBzbGVlcDogc2xlZXAsCgogICAgdXVpZDogdXVpZCwKICAgIHNob3J0SUQ6IHNob3J0SUQsCgogICAgY2xhbXA6IGNsYW1wLAogICAgcmFuZG9tU2VlZDogcmFuZG9tU2VlZCwKCiAgICBmbXREYXRlOiBmbXREYXRlLAogICAgcGFyc2VEYXRlOiBwYXJzZURhdGUsCiAgICBpc29EYXRlOiBpc29EYXRlLAoKICAgIGI2NDogYjY0LAogICAgdW5iNjQ6IHVuYjY0LAogICAgYmFzaWNBdXRoSGVhZGVyOiBiYXNpY0F1dGhIZWFkZXIsCgogICAgZXNjYXBlSHRtbDogZXNjYXBlSHRtbCwKICAgIGVzY2FwZUF0dHI6IGVzY2FwZUh0bWwsCgogICAgZG93bmxvYWQ6IGRvd25sb2FkLAogICAgY29weTogY29weSwKCiAgICBkYXRhVVJMVG9CbG9iOiBkYXRhVVJMVG9CbG9iLAogICAgYmxvYlRvRGF0YVVSTDogYmxvYlRvRGF0YVVSTCwKICAgIGJ5dGVzVG9CbG9iOiBieXRlc1RvQmxvYiwKCiAgICBmb3JtYXRCeXRlczogZm9ybWF0Qnl0ZXMsCiAgICBwbHVyYWxpemU6IHBsdXJhbGl6ZSwKICAgIHRydW5jYXRlOiB0cnVuY2F0ZSwKICAgIGlzRW1haWw6IGlzRW1haWwKICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9zdG9yZS5qcyA9PT09PSAqLwoKKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwoKICBmdW5jdGlvbiByZXNvbHZlQVBJQmFzZSgpIHsKICAgIHRyeSB7CiAgICAgIHZhciBoID0gKHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpIHx8ICcnOwogICAgICBpZiAoLyhefFwuKXZvb3NleVwuY29tJC9pLnRlc3QoaCkpIHJldHVybiAnJzsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgICByZXR1cm4gJ2h0dHBzOi8vYXBpLnZvb3NleS5jb20nOwogIH0KICBWLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oCiAgICB7CiAgICAgIEFQSTogcmVzb2x2ZUFQSUJhc2UoKSwKICAgICAgQ0ROOiAnaHR0cHM6Ly9jZG4udm9vc2V5LmNvbScsCiAgICAgIEFQUF9TVE9SRV9VUkw6ICdodHRwczovL2FwcHMuYXBwbGUuY29tL3VzL2FwcC92YW1wL2lkNjc0ODY1NzY4NScsCiAgICAgIEFVVEhfVklERU86ICdodHRwczovL2Nkbi52b29zZXkuY29tL21lZGlhLzA4MzEyNS0zLm1wNCcsCiAgICAgIERFTU9fVklERU86ICdodHRwczovL2Nkbi52b29zZXkuY29tL21lZGlhLzA4MzEyNS0zLm1wNCcKICAgIH0sCiAgICBWLmNvbmZpZyB8fCB7fQogICk7CgogIHZhciBTVE9SQUdFX1BSRUZJWCA9ICd2YW1wX3dlYl8nOwoKICB2YXIgUEVSU0lTVF9XSElURUxJU1QgPSBbJ3NldHRpbmdzJywgJ2luZHVzdHJpZXMnLCAnb25ib2FyZGluZ0RvbmUnLCAnY3VzdG9tUHJlc2V0cyddOwoKICBmdW5jdGlvbiBkZWZhdWx0U2V0dGluZ3MoKSB7CiAgICByZXR1cm4gewogICAgICBkZWZhdWx0TW9kZWw6ICdmbHV4S2xlaW4nLAogICAgICBkZWZhdWx0QXNwZWN0OiAnYXV0bycsCiAgICAgIGRlZmF1bHRDb3VudDogMSwKICAgICAgdGhlbWU6ICdzeXN0ZW0nLAogICAgICBhdXRvQmVmb3JlQWZ0ZXI6IHRydWUsCiAgICAgIHJlZHVjZU1vdGlvbjogZmFsc2UsCiAgICAgIGJyYW5kaW5nOiB0cnVlLAogICAgICB0YWdsaW5lOiAnJywKICAgICAgc2hhcmVUZW1wbGF0ZTogJ2JlZm9yZS1hZnRlcicsCiAgICAgIHNhdmVPcmlnaW5hbHM6IHRydWUKICAgIH07CiAgfQoKICBWLnN0YXRlID0gT2JqZWN0LmFzc2lnbigKICAgIHsKCiAgICAgIHVzZXI6IG51bGwsCiAgICAgIGNyZWRpdHM6IDAsCgogICAgICByb3V0ZTogJ2NyZWF0ZScsCiAgICAgIHBhcmFtczoge30sCiAgICAgIHByZXZpb3VzUm91dGU6IG51bGwsCgogICAgICBsaWJyYXJ5OiBbXSwKICAgICAgbGlicmFyeVBhZ2U6IDEsCiAgICAgIGxpYnJhcnlIYXNNb3JlOiB0cnVlLAogICAgICBmYXZvcml0ZXM6IFtdLAogICAgICBmZWVkOiBbXSwKICAgICAgZmVlZFBhZ2U6IDEsCiAgICAgIGZlZWRIYXNNb3JlOiB0cnVlLAogICAgICBmb2xkZXJzOiBbXSwKCiAgICAgIHByZXNldHM6IFtdLAogICAgICBjdXN0b21QcmVzZXRzOiBbXSwKCiAgICAgIGluZHVzdHJpZXM6IFtdLAogICAgICBvbmJvYXJkaW5nRG9uZTogZmFsc2UsCgogICAgICBkcmFmdDogewogICAgICAgIHByb21wdDogJycsCiAgICAgICAgbmVnYXRpdmVQcm9tcHQ6ICcnLAogICAgICAgIG1vZGVsOiAnZmx1eEtsZWluJywKICAgICAgICBhc3BlY3Q6ICdhdXRvJywKICAgICAgICBzZWVkOiBudWxsLAogICAgICAgIGNvdW50OiAxLAogICAgICAgIHByZXNldElEOiBudWxsLAogICAgICAgIGltYWdlVVJMczogW10KICAgICAgfSwKCiAgICAgIGdlbmVyYXRpbmc6IGZhbHNlLAogICAgICBwcm9ncmVzczogMCwKICAgICAgdXBsb2FkaW5nOiBmYWxzZSwKICAgICAgdXBsb2FkUHJvZ3Jlc3M6IDAsCiAgICAgIGRyYXdlck9wZW46IGZhbHNlLAogICAgICBib290ZWQ6IGZhbHNlLAoKICAgICAgc2V0dGluZ3M6IGRlZmF1bHRTZXR0aW5ncygpCiAgICB9LAogICAgVi5zdGF0ZSB8fCB7fQogICk7CgogIFYuc3RhdGUuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKGRlZmF1bHRTZXR0aW5ncygpLCBWLnN0YXRlLnNldHRpbmdzIHx8IHt9KTsKCiAgVi5hcGkgPSBWLmFwaSB8fCB7fTsKICBWLmF1dGggPSBWLmF1dGggfHwge307CiAgVi5kYXRhID0gVi5kYXRhIHx8IHsgc3dpenpsZXM6IFtdLCBtb2RlbHM6IFtdLCBhc3BlY3RzOiBbXSwgaW5kdXN0cmllczogW10gfTsKICBWLnVpID0gVi51aSB8fCB7fTsKICBWLnZpZXdzID0gVi52aWV3cyB8fCB7fTsKICBWLnJvdXRlciA9IFYucm91dGVyIHx8IHt9OwogIFYudXRpbCA9IFYudXRpbCB8fCB7fTsKCiAgdmFyIEVWRU5UUyA9IE9iamVjdC5mcmVlemUoewogICAgQVVUSF9DSEFOR0VEOiAnYXV0aDpjaGFuZ2VkJywKICAgIENSRURJVFNfQ0hBTkdFRDogJ2NyZWRpdHM6Y2hhbmdlZCcsCiAgICBST1VURV9DSEFOR0VEOiAncm91dGU6Y2hhbmdlZCcsCiAgICBMSUJSQVJZX0NIQU5HRUQ6ICdsaWJyYXJ5OmNoYW5nZWQnLAogICAgVE9BU1Q6ICd0b2FzdCcsCiAgICBFUlJPUjogJ2Vycm9yJwogIH0pOwoKICB2YXIgbGlzdGVuZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgZnVuY3Rpb24gaXNTdG9yYWdlQXZhaWxhYmxlKCkgewogICAgdHJ5IHsKICAgICAgdmFyIGsgPSBTVE9SQUdFX1BSRUZJWCArICdfX3Byb2JlX18nOwogICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oaywgJzEnKTsKICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGspOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICB2YXIgU1RPUkFHRV9PSyA9IGlzU3RvcmFnZUF2YWlsYWJsZSgpOwoKICBWLnN0b3JlID0gewoKICAgIGV2ZW50czogRVZFTlRTLAogICAgcHJlZml4OiBTVE9SQUdFX1BSRUZJWCwKCiAgICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHsKICAgICAgcmV0dXJuIFYuc3RhdGVba2V5XTsKICAgIH0sCgogICAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICB2YXIgcHJldiA9IFYuc3RhdGVba2V5XTsKICAgICAgVi5zdGF0ZVtrZXldID0gdmFsdWU7CgogICAgICB0aGlzLmVtaXQoa2V5LCB2YWx1ZSk7CgogICAgICBpZiAoa2V5ID09PSAnY3JlZGl0cycpIHRoaXMuZW1pdChFVkVOVFMuQ1JFRElUU19DSEFOR0VELCB2YWx1ZSk7CiAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ3VzZXInKSB0aGlzLmVtaXQoRVZFTlRTLkFVVEhfQ0hBTkdFRCwgdmFsdWUpOwogICAgICBlbHNlIGlmIChrZXkgPT09ICdyb3V0ZScpIHRoaXMuZW1pdChFVkVOVFMuUk9VVEVfQ0hBTkdFRCwgdmFsdWUpOwogICAgICBlbHNlIGlmIChrZXkgPT09ICdsaWJyYXJ5JykgdGhpcy5lbWl0KEVWRU5UUy5MSUJSQVJZX0NIQU5HRUQsIHZhbHVlKTsKCiAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJywgeyBrZXk6IGtleSwgdmFsdWU6IHZhbHVlLCBwcmV2aW91czogcHJldiB9KTsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfSwKCiAgICBwYXRjaDogZnVuY3Rpb24gKG9iaikgewogICAgICBpZiAoIW9iaikgcmV0dXJuOwogICAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrKSkgdGhpcy5zZXQoaywgb2JqW2tdKTsKICAgICAgfQogICAgfSwKCiAgICBvbjogZnVuY3Rpb24gKGV2ZW50LCBjYikgewogICAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZnVuY3Rpb24gKCkge307CiAgICAgIChsaXN0ZW5lcnNbZXZlbnRdIHx8IChsaXN0ZW5lcnNbZXZlbnRdID0gW10pKS5wdXNoKGNiKTsKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICByZXR1cm4gZnVuY3Rpb24gb2ZmKCkgewogICAgICAgIHNlbGYub2ZmKGV2ZW50LCBjYik7CiAgICAgIH07CiAgICB9LAoKICAgIG9uY2U6IGZ1bmN0aW9uIChldmVudCwgY2IpIHsKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICB2YXIgb2ZmID0gdGhpcy5vbihldmVudCwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICBvZmYoKTsKICAgICAgICBjYihkYXRhKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBvZmY7CiAgICB9LAoKICAgIG9mZjogZnVuY3Rpb24gKGV2ZW50LCBjYikgewogICAgICB2YXIgYXJyID0gbGlzdGVuZXJzW2V2ZW50XTsKICAgICAgaWYgKCFhcnIpIHJldHVybjsKICAgICAgaWYgKCFjYikgewogICAgICAgIGRlbGV0ZSBsaXN0ZW5lcnNbZXZlbnRdOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgaSA9IGFyci5pbmRleE9mKGNiKTsKICAgICAgaWYgKGkgIT09IC0xKSBhcnIuc3BsaWNlKGksIDEpOwogICAgICBpZiAoYXJyLmxlbmd0aCA9PT0gMCkgZGVsZXRlIGxpc3RlbmVyc1tldmVudF07CiAgICB9LAoKICAgIGVtaXQ6IGZ1bmN0aW9uIChldmVudCwgZGF0YSkgewogICAgICB2YXIgYXJyID0gbGlzdGVuZXJzW2V2ZW50XTsKICAgICAgaWYgKCFhcnIgfHwgYXJyLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKICAgICAgdmFyIHNuYXBzaG90ID0gYXJyLnNsaWNlKCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc25hcHNob3QubGVuZ3RoOyBpKyspIHsKICAgICAgICB0cnkgewogICAgICAgICAgc25hcHNob3RbaV0oZGF0YSk7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICBpZiAod2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5lcnJvcikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVi5zdG9yZV0gbGlzdGVuZXIgZm9yICInICsgZXZlbnQgKyAnIiB0aHJldzonLCBlcnIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICB0b2FzdDogZnVuY3Rpb24gKG1zZywga2luZCkgewogICAgICB0aGlzLmVtaXQoRVZFTlRTLlRPQVNULCB7IG1zZzogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsKICAgIH0sCiAgICBlcnJvcjogZnVuY3Rpb24gKGVycikgewogICAgICB2YXIgcGF5bG9hZCA9CiAgICAgICAgZXJyICYmIHR5cGVvZiBlcnIgPT09ICdvYmplY3QnCiAgICAgICAgICA/IGVycgogICAgICAgICAgOiB7IG1lc3NhZ2U6IFN0cmluZyhlcnIgPT0gbnVsbCA/ICdTb21ldGhpbmcgd2VudCB3cm9uZycgOiBlcnIpIH07CiAgICAgIHRoaXMuZW1pdChFVkVOVFMuRVJST1IsIHBheWxvYWQpOwogICAgfSwKCiAgICBzYXZlOiBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICghU1RPUkFHRV9PSykgcmV0dXJuIGZhbHNlOwogICAgICB0cnkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUEVSU0lTVF9XSElURUxJU1QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBrZXkgPSBQRVJTSVNUX1dISVRFTElTVFtpXTsKICAgICAgICAgIHZhciB2YWwgPSBWLnN0YXRlW2tleV07CiAgICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsKSB7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX1BSRUZJWCArIGtleSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9QUkVGSVggKyBrZXksIEpTT04uc3RyaW5naWZ5KHZhbCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBjYXRjaCAoZSkgewoKICAgICAgICBpZiAod2luZG93LmNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4oJ1tWLnN0b3JlXSBzYXZlIGZhaWxlZDonLCBlKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0sCgogICAgbG9hZDogZnVuY3Rpb24gKCkgewogICAgICBpZiAoIVNUT1JBR0VfT0spIHJldHVybiBmYWxzZTsKICAgICAgdHJ5IHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFBFUlNJU1RfV0hJVEVMSVNULmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIga2V5ID0gUEVSU0lTVF9XSElURUxJU1RbaV07CiAgICAgICAgICB2YXIgcmF3ID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfUFJFRklYICsga2V5KTsKICAgICAgICAgIGlmIChyYXcgPT09IG51bGwgfHwgcmF3ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlOwogICAgICAgICAgdmFyIHBhcnNlZDsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTsKICAgICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyKSB7CgogICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9QUkVGSVggKyBrZXkpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJzZWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7CgogICAgICAgICAgaWYgKGtleSA9PT0gJ3NldHRpbmdzJyAmJiBwYXJzZWQgJiYgdHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgVi5zdGF0ZS5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdFNldHRpbmdzKCksIHBhcnNlZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBWLnN0YXRlW2tleV0gPSBwYXJzZWQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKCdbVi5zdG9yZV0gbG9hZCBmYWlsZWQ6JywgZSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9LAoKICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICghU1RPUkFHRV9PSykgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUEVSU0lTVF9XSElURUxJU1QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX1BSRUZJWCArIFBFUlNJU1RfV0hJVEVMSVNUW2ldKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHsKCiAgICAgIH0KICAgICAgVi5zdGF0ZS5zZXR0aW5ncyA9IGRlZmF1bHRTZXR0aW5ncygpOwogICAgICBWLnN0YXRlLmluZHVzdHJpZXMgPSBbXTsKICAgICAgVi5zdGF0ZS5vbmJvYXJkaW5nRG9uZSA9IGZhbHNlOwogICAgICBWLnN0YXRlLmN1c3RvbVByZXNldHMgPSBbXTsKICAgIH0sCgogICAgZGVmYXVsdFNldHRpbmdzOiBkZWZhdWx0U2V0dGluZ3MKICB9OwoKICBWLnN0b3JlLmxvYWQoKTsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvYXBpLmpzID09PT09ICovCgooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIFYgPSAod2luZG93LlYgPSB3aW5kb3cuViB8fCB7fSk7CgogIFYuY29uZmlnID0gT2JqZWN0LmFzc2lnbigKICAgIHsKICAgICAgQVBJOiAnaHR0cHM6Ly9hcGkudm9vc2V5LmNvbScsCiAgICAgIENETjogJ2h0dHBzOi8vY2RuLnZvb3NleS5jb20nLAogICAgICBBUFBfU1RPUkVfVVJMOiAnaHR0cHM6Ly9hcHBzLmFwcGxlLmNvbS91cy9hcHAvdmFtcC9pZDY3NDg2NTc2ODUnLAogICAgICBERU1PX1ZJREVPOiAnaHR0cHM6Ly9tLmp3cy5haS92YW1wLW1lYW5ldGl6ZS1kZW1vLXY0Lm1wNCcKICAgIH0sCiAgICBWLmNvbmZpZyB8fCB7fQogICk7CgogIGZ1bmN0aW9uIEFwaUVycm9yKHN0YXR1cywgbWVzc2FnZSwgYm9keSkgewogICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSB8fCAnUmVxdWVzdCBmYWlsZWQnKTsKICAgIGUubmFtZSA9ICdBcGlFcnJvcic7CiAgICBlLnN0YXR1cyA9IHN0YXR1czsKICAgIGUubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1JlcXVlc3QgZmFpbGVkJzsKICAgIGUuYm9keSA9IGJvZHk7CiAgICBlLmlzQXBpRXJyb3IgPSB0cnVlOwogICAgcmV0dXJuIGU7CiAgfQogIFYuQXBpRXJyb3IgPSBBcGlFcnJvcjsKCiAgdmFyIElTT19GUkFDID0gL14oXGR7NH0tXGR7Mn0tXGR7Mn1UXGR7Mn06XGR7Mn06XGR7Mn0pXC5cZCsoWnxbK1wtXVxkezJ9Oj9cZHsyfSk/JC87CgogIGZ1bmN0aW9uIHN0cmlwRnJhY3Rpb25hbCh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB2YWx1ZTsKICAgIHZhciB0ID0gdHlwZW9mIHZhbHVlOwogICAgaWYgKHQgPT09ICdzdHJpbmcnKSB7CiAgICAgIHZhciBtID0gdmFsdWUubWF0Y2goSVNPX0ZSQUMpOwogICAgICBpZiAobSkgcmV0dXJuIG1bMV0gKyAobVsyXSB8fCAnWicpOwogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7CiAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1wuXGR7M31aJC8sICdaJyk7CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgdmFyIG91dCA9IG5ldyBBcnJheSh2YWx1ZS5sZW5ndGgpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBzdHJpcEZyYWN0aW9uYWwodmFsdWVbaV0pOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgaWYgKHQgPT09ICdvYmplY3QnKSB7CiAgICAgIHZhciBvID0ge307CiAgICAgIGZvciAodmFyIGsgaW4gdmFsdWUpIHsKICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrKSkgewogICAgICAgICAgb1trXSA9IHN0cmlwRnJhY3Rpb25hbCh2YWx1ZVtrXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBvOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgZnVuY3Rpb24gc2FmZVBhcnNlKHRleHQpIHsKICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dCA9PT0gJycpIHJldHVybiBudWxsOwogICAgdHJ5IHsKICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7CiAgICB9IGNhdGNoIChfZSkgewogICAgICByZXR1cm4gdGV4dDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGVycm9yTWVzc2FnZShib2R5LCBzdGF0dXMpIHsKICAgIGlmIChib2R5ICYmIHR5cGVvZiBib2R5ID09PSAnb2JqZWN0JykgewogICAgICBpZiAodHlwZW9mIGJvZHkuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnICYmIGJvZHkuZGVzY3JpcHRpb24pIHJldHVybiBib2R5LmRlc2NyaXB0aW9uOwogICAgICBpZiAodHlwZW9mIGJvZHkucmVhc29uID09PSAnc3RyaW5nJyAmJiBib2R5LnJlYXNvbikgcmV0dXJuIGJvZHkucmVhc29uOwogICAgICBpZiAodHlwZW9mIGJvZHkubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgYm9keS5tZXNzYWdlKSByZXR1cm4gYm9keS5tZXNzYWdlOwogICAgICBpZiAodHlwZW9mIGJvZHkuZXJyb3IgPT09ICdzdHJpbmcnICYmIGJvZHkuZXJyb3IpIHJldHVybiBib2R5LmVycm9yOwogICAgfQogICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJyAmJiBib2R5LnRyaW0oKSkgcmV0dXJuIGJvZHkudHJpbSgpOwogICAgcmV0dXJuIGRlZmF1bHRTdGF0dXNNZXNzYWdlKHN0YXR1cyk7CiAgfQoKICBmdW5jdGlvbiBkZWZhdWx0U3RhdHVzTWVzc2FnZShzdGF0dXMpIHsKICAgIHN3aXRjaCAoc3RhdHVzKSB7CiAgICAgIGNhc2UgNDAwOiByZXR1cm4gJ0JhZCByZXF1ZXN0Lic7CiAgICAgIGNhc2UgNDAxOiByZXR1cm4gJ1lvdXIgc2Vzc2lvbiBoYXMgZXhwaXJlZC4gUGxlYXNlIHNpZ24gaW4gYWdhaW4uJzsKICAgICAgY2FzZSA0MDI6IHJldHVybiAnTm90IGVub3VnaCBjcmVkaXRzLic7CiAgICAgIGNhc2UgNDAzOiByZXR1cm4gJ1lvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGRvIHRoYXQuJzsKICAgICAgY2FzZSA0MDQ6IHJldHVybiAnTm90IGZvdW5kLic7CiAgICAgIGNhc2UgNDA2OiByZXR1cm4gJ1RoYXQgdmFsdWUgaXMgbm90IGFjY2VwdGFibGUuJzsKICAgICAgY2FzZSA0MDk6IHJldHVybiAnVGhhdCBhbHJlYWR5IGV4aXN0cy4nOwogICAgICBjYXNlIDQxMzogcmV0dXJuICdUaGF0IGZpbGUgaXMgdG9vIGxhcmdlLic7CiAgICAgIGNhc2UgNDIwOiByZXR1cm4gJ1JlcXVlc3QgcmVqZWN0ZWQuJzsKICAgICAgY2FzZSA0MjI6IHJldHVybiAnQ291bGQgbm90IHByb2Nlc3MgdGhhdCByZXF1ZXN0Lic7CiAgICAgIGNhc2UgNDI5OiByZXR1cm4gJ1RvbyBtYW55IHJlcXVlc3RzLiBQbGVhc2Ugc2xvdyBkb3duLic7CiAgICAgIGNhc2UgNTAwOiByZXR1cm4gJ1NvbWV0aGluZyB3ZW50IHdyb25nIG9uIG91ciBlbmQuJzsKICAgICAgY2FzZSA1MDI6CiAgICAgIGNhc2UgNTAzOgogICAgICBjYXNlIDUwNDogcmV0dXJuICdUaGUgc2VydmljZSBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZS4nOwogICAgICBkZWZhdWx0OiByZXR1cm4gc3RhdHVzID8gKCdSZXF1ZXN0IGZhaWxlZCAoJyArIHN0YXR1cyArICcpLicpIDogJ05ldHdvcmsgZXJyb3IuJzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGJ1aWxkVVJMKHBhdGgsIHF1ZXJ5KSB7CiAgICB2YXIgdXJsOwogICAgaWYgKC9eaHR0cHM/OlwvXC8vaS50ZXN0KHBhdGgpKSB7CiAgICAgIHVybCA9IHBhdGg7CiAgICB9IGVsc2UgewogICAgICB2YXIgYmFzZSA9IFYuY29uZmlnLkFQSS5yZXBsYWNlKC9cLyskLywgJycpOwogICAgICB1cmwgPSBiYXNlICsgKHBhdGguY2hhckF0KDApID09PSAnLycgPyBwYXRoIDogJy8nICsgcGF0aCk7CiAgICB9CiAgICBpZiAocXVlcnkgJiYgdHlwZW9mIHF1ZXJ5ID09PSAnb2JqZWN0JykgewogICAgICB2YXIgcGFydHMgPSBbXTsKICAgICAgZm9yICh2YXIgayBpbiBxdWVyeSkgewogICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocXVlcnksIGspKSB7CiAgICAgICAgICB2YXIgdmFsID0gcXVlcnlba107CiAgICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsIHx8IHZhbCA9PT0gJycpIGNvbnRpbnVlOwogICAgICAgICAgcGFydHMucHVzaChlbmNvZGVVUklDb21wb25lbnQoaykgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwYXJ0cy5sZW5ndGgpIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA+PSAwID8gJyYnIDogJz8nKSArIHBhcnRzLmpvaW4oJyYnKTsKICAgIH0KICAgIHJldHVybiB1cmw7CiAgfQoKICBmdW5jdGlvbiBhdXRoVG9rZW4oKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5hdXRoICYmIHR5cGVvZiBWLmF1dGgudG9rZW4gPT09ICdmdW5jdGlvbicpIHJldHVybiBWLmF1dGgudG9rZW4oKTsKICAgIH0gY2F0Y2ggKF9lKSB7ICB9CgogICAgdHJ5IHsKICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndmFtcF93ZWJfdG9rZW4nKTsKICAgIH0gY2F0Y2ggKF9lMikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlcXVlc3QocGF0aCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgbWV0aG9kID0gKG9wdHMubWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpOwogICAgdmFyIGhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRzLmhlYWRlcnMgfHwge30pOwogICAgdmFyIGZldGNoSW5pdCA9IHsgbWV0aG9kOiBtZXRob2QsIGhlYWRlcnM6IGhlYWRlcnMgfTsKCiAgICBpZiAob3B0cy5zaWduYWwpIGZldGNoSW5pdC5zaWduYWwgPSBvcHRzLnNpZ25hbDsKCiAgICB2YXIgaGFzQm9keSA9IG9wdHMuYm9keSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuYm9keSAhPT0gbnVsbCAmJiBtZXRob2QgIT09ICdHRVQnICYmIG1ldGhvZCAhPT0gJ0hFQUQnOwogICAgaWYgKGhhc0JvZHkpIHsKICAgICAgaWYgKAogICAgICAgIG9wdHMuYm9keSBpbnN0YW5jZW9mIEJsb2IgfHwKICAgICAgICBvcHRzLmJvZHkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fAogICAgICAgIG9wdHMuYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhIHx8CiAgICAgICAgKHR5cGVvZiBvcHRzLmJvZHkgPT09ICdzdHJpbmcnKQogICAgICApIHsKCiAgICAgICAgZmV0Y2hJbml0LmJvZHkgPSBvcHRzLmJvZHk7CiAgICAgIH0gZWxzZSB7CgogICAgICAgIGlmICghaGFzSGVhZGVyKGhlYWRlcnMsICdDb250ZW50LVR5cGUnKSkgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7CiAgICAgICAgZmV0Y2hJbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShzdHJpcEZyYWN0aW9uYWwob3B0cy5ib2R5KSk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAob3B0cy5hdXRoICE9PSBmYWxzZSAmJiAhaGFzSGVhZGVyKGhlYWRlcnMsICdBdXRob3JpemF0aW9uJykpIHsKICAgICAgdmFyIHRvayA9IGF1dGhUb2tlbigpOwogICAgICBpZiAodG9rKSBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSAnQmVhcmVyICcgKyB0b2s7CiAgICB9CgogICAgdmFyIHVybCA9IGJ1aWxkVVJMKHBhdGgsIG9wdHMucXVlcnkpOwoKICAgIHJldHVybiBmZXRjaCh1cmwsIGZldGNoSW5pdCkudGhlbihmdW5jdGlvbiAocmVzKSB7CgogICAgICBpZiAoKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpICYmIG9wdHMuYXV0aCAhPT0gZmFsc2UpIHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLmNsZWFyID09PSAnZnVuY3Rpb24nKSBWLmF1dGguY2xlYXIoKTsKICAgICAgICAgIGVsc2Ugd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd2YW1wX3dlYl90b2tlbicpOwogICAgICAgIH0gY2F0Y2ggKF9lKSB7ICB9CiAgICAgIH0KCiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MjkgJiYgKG9wdHMuX2F0dGVtcHQgfHwgMCkgPCAyKSB7CiAgICAgICAgdmFyIHJhID0gcGFyc2VGbG9hdChyZXMuaGVhZGVycyAmJiByZXMuaGVhZGVycy5nZXQgPyByZXMuaGVhZGVycy5nZXQoJ1JldHJ5LUFmdGVyJykgOiAnJyk7CiAgICAgICAgaWYgKCEoaXNGaW5pdGUocmEpICYmIHJhID4gMTUpKSB7CiAgICAgICAgICB2YXIgd2FpdE1zID0gKGlzRmluaXRlKHJhKSAmJiByYSA+IDApCiAgICAgICAgICAgID8gcmEgKiAxMDAwCiAgICAgICAgICAgIDogKDcwMCAqIE1hdGgucG93KDIsIG9wdHMuX2F0dGVtcHQgfHwgMCkpICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMzAwKTsKICAgICAgICAgIHZhciBuZXh0ID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0cywgeyBfYXR0ZW1wdDogKG9wdHMuX2F0dGVtcHQgfHwgMCkgKyAxIH0pOwogICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChycykgeyBzZXRUaW1lb3V0KHJzLCB3YWl0TXMpOyB9KS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlcXVlc3QocGF0aCwgbmV4dCk7IH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKG9wdHMucmF3KSB7CiAgICAgICAgaWYgKCFyZXMub2sgJiYgcmVzLnN0YXR1cyAhPT0gMjAyKSB7CiAgICAgICAgICByZXR1cm4gcmVzLnRleHQoKS50aGVuKGZ1bmN0aW9uICh0eHQpIHsKICAgICAgICAgICAgdmFyIGJvZHkgPSBzYWZlUGFyc2UodHh0KTsKICAgICAgICAgICAgdGhyb3cgQXBpRXJyb3IocmVzLnN0YXR1cywgZXJyb3JNZXNzYWdlKGJvZHksIHJlcy5zdGF0dXMpLCBib2R5KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgICB9CgogICAgICByZXR1cm4gcmVzLnRleHQoKS50aGVuKGZ1bmN0aW9uICh0eHQpIHsKICAgICAgICB2YXIgYm9keSA9IHNhZmVQYXJzZSh0eHQpOwogICAgICAgIGlmIChyZXMub2spIHJldHVybiBib2R5OwogICAgICAgIHRocm93IEFwaUVycm9yKHJlcy5zdGF0dXMsIGVycm9yTWVzc2FnZShib2R5LCByZXMuc3RhdHVzKSwgYm9keSk7CiAgICAgIH0pOwogICAgfSwgZnVuY3Rpb24gKG5ldHdvcmtFcnIpIHsKCiAgICAgIGlmIChuZXR3b3JrRXJyICYmIG5ldHdvcmtFcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB0aHJvdyBuZXR3b3JrRXJyOwogICAgICB0aHJvdyBBcGlFcnJvcigwLCBuZXR3b3JrRXJyICYmIG5ldHdvcmtFcnIubWVzc2FnZSA/IG5ldHdvcmtFcnIubWVzc2FnZSA6ICdOZXR3b3JrIGVycm9yLiBDaGVjayB5b3VyIGNvbm5lY3Rpb24uJywgbnVsbCk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGhhc0hlYWRlcihoZWFkZXJzLCBuYW1lKSB7CiAgICB2YXIgbG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICBmb3IgKHZhciBrIGluIGhlYWRlcnMpIHsKICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoZWFkZXJzLCBrKSAmJiBrLnRvTG93ZXJDYXNlKCkgPT09IGxuYW1lKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIHBvbGwoc3VibWl0Rm4sIHBvbGxGbiwgb3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICB2YXIgaW50ZXJ2YWxNcyA9IG9wdGlvbnMuaW50ZXJ2YWxNcyAhPSBudWxsID8gb3B0aW9ucy5pbnRlcnZhbE1zIDogMjAwMDsKICAgIHZhciB0aW1lb3V0TXMgPSBvcHRpb25zLnRpbWVvdXRNcyAhPSBudWxsID8gb3B0aW9ucy50aW1lb3V0TXMgOiAxODAwMDA7CiAgICB2YXIgb25Qcm9ncmVzcyA9IHR5cGVvZiBvcHRpb25zLm9uUHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLm9uUHJvZ3Jlc3MgOiBmdW5jdGlvbiAoKSB7fTsKICAgIHZhciBzaWduYWwgPSBvcHRpb25zLnNpZ25hbCB8fCBudWxsOwoKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBzZXR0bGVkID0gZmFsc2U7CiAgICAgIHZhciBzdGFydGVkID0gRGF0ZS5ub3coKTsKICAgICAgdmFyIGF0dGVtcHQgPSAwOwogICAgICB2YXIgdGltZXIgPSBudWxsOwoKICAgICAgZnVuY3Rpb24gYWJvcnRFcnJvcigpIHsKICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcignQWJvcnRlZCcpOwogICAgICAgIGUubmFtZSA9ICdBYm9ydEVycm9yJzsKICAgICAgICByZXR1cm4gZTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY2xlYW51cCgpIHsKICAgICAgICBpZiAodGltZXIpIHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgdGltZXIgPSBudWxsOyB9CiAgICAgICAgaWYgKHNpZ25hbCkgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gb25BYm9ydCgpIHsKICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOwogICAgICAgIHNldHRsZWQgPSB0cnVlOwogICAgICAgIGNsZWFudXAoKTsKICAgICAgICByZWplY3QoYWJvcnRFcnJvcigpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBmYWlsKGVycikgewogICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47CiAgICAgICAgc2V0dGxlZCA9IHRydWU7CiAgICAgICAgY2xlYW51cCgpOwogICAgICAgIHJlamVjdChlcnIpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGRvbmUocmVzdWx0KSB7CiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjsKICAgICAgICBzZXR0bGVkID0gdHJ1ZTsKICAgICAgICBjbGVhbnVwKCk7CiAgICAgICAgcmVzb2x2ZShyZXN1bHQpOwogICAgICB9CgogICAgICBpZiAoc2lnbmFsKSB7CiAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7IG9uQWJvcnQoKTsgcmV0dXJuOyB9CiAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7CiAgICAgIH0KCiAgICAgIFByb21pc2UucmVzb2x2ZSgpCiAgICAgICAgLnRoZW4oc3VibWl0Rm4pCiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHN1Ym1pdFJlc3VsdCkgewogICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjsKICAgICAgICAgIG9uUHJvZ3Jlc3MoeyBwaGFzZTogJ3N1Ym1pdHRlZCcsIGF0dGVtcHQ6IDAsIHN1Ym1pdDogc3VibWl0UmVzdWx0IH0pOwoKICAgICAgICAgIGZ1bmN0aW9uIGxvb3AoKSB7CiAgICAgICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47CiAgICAgICAgICAgIGlmIChzaWduYWwgJiYgc2lnbmFsLmFib3J0ZWQpIHsgb25BYm9ydCgpOyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydGVkID4gdGltZW91dE1zKSB7CiAgICAgICAgICAgICAgZmFpbChBcGlFcnJvcig0MDgsICdUaGlzIGlzIHRha2luZyBsb25nZXIgdGhhbiBleHBlY3RlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCBudWxsKSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF0dGVtcHQrKzsKICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkKICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiBwb2xsRm4oc3VibWl0UmVzdWx0LCBhdHRlbXB0KTsgfSkKICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOwogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIG9uUHJvZ3Jlc3MoeyBwaGFzZTogJ3BvbGxpbmcnLCBhdHRlbXB0OiBhdHRlbXB0LCBzdWJtaXQ6IHN1Ym1pdFJlc3VsdCB9KTsKICAgICAgICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGxvb3AsIGludGVydmFsTXMpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgZG9uZShyZXN1bHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykgeyBvbkFib3J0KCk7IHJldHVybjsgfQogICAgICAgICAgICAgICAgZmFpbChlcnIpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgfQoKICAgICAgICAgIGxvb3AoKTsKICAgICAgICB9KQogICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHsgb25BYm9ydCgpOyByZXR1cm47IH0KICAgICAgICAgIGZhaWwoZXJyKTsKICAgICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcmFuZG9tU2VlZCgpIHsKICAgIGlmIChWLnV0aWwgJiYgdHlwZW9mIFYudXRpbC5yYW5kb21TZWVkID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51dGlsLnJhbmRvbVNlZWQoKTsKICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKTsKICB9CgogIHZhciBOQU5PX01PREVMUyA9IHsgbmFub0JhbmFuYTogdHJ1ZSwgbmFub0JhbmFuYTI6IHRydWUsIG5hbm9CYW5hbmFQcm86IHRydWUgfTsKCiAgZnVuY3Rpb24gZmx1eEltYWdlVVJMKGJvZHkpIHsKICAgIGlmICghYm9keSB8fCAhQXJyYXkuaXNBcnJheShib2R5LmltYWdlcykgfHwgIWJvZHkuaW1hZ2VzLmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICB2YXIgZmlyc3QgPSBib2R5LmltYWdlc1swXTsKICAgIGlmICghZmlyc3QpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGZpcnN0LnVybCB8fCBudWxsOwogIH0KCiAgZnVuY3Rpb24gaXNQZW5kaW5nUmVzdWx0KGJvZHkpIHsKICAgIGlmICghYm9keSB8fCB0eXBlb2YgYm9keSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTsKICAgIHZhciBzdCA9IChib2R5LnN0YXR1cyB8fCBib2R5LnN0YXRlIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7CiAgICBpZiAoc3QgJiYgL1FVRVVFfFBST0dSRVNTfFBFTkRJTkd8UFJPQ0VTU3xSVU5OSU5HfFNUQVJURUR8U1VCTUlUVEVELy50ZXN0KHN0KSkgcmV0dXJuIHRydWU7CiAgICBpZiAoYm9keS51cmwgfHwgYm9keS52aWRlbyB8fCBib2R5LnZpZGVvX3VybCB8fCBib2R5LnZpZGVvVVJMIHx8IGJvZHkuZXJyb3IpIHJldHVybiBmYWxzZTsKICAgIGlmIChBcnJheS5pc0FycmF5KGJvZHkuaW1hZ2VzKSkgcmV0dXJuIGJvZHkuaW1hZ2VzLmxlbmd0aCA9PT0gMDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIHBvbGxSZXNwb25zZShyZXMsIGV4dHJhY3QpIHsKICAgIGlmIChyZXMuc3RhdHVzID09PSAyMDIpIHJldHVybiBudWxsOwogICAgaWYgKHJlcy5vaykgewogICAgICByZXR1cm4gcmVzLnRleHQoKS50aGVuKGZ1bmN0aW9uICh0eHQpIHsKICAgICAgICB2YXIgYm9keSA9IHNhZmVQYXJzZSh0eHQpOwogICAgICAgIGlmIChpc1BlbmRpbmdSZXN1bHQoYm9keSkpIHJldHVybiBudWxsOwogICAgICAgIHJldHVybiBleHRyYWN0ID8gZXh0cmFjdChib2R5KSA6IGJvZHk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHJlcy50ZXh0KCkudGhlbihmdW5jdGlvbiAodHh0KSB7CiAgICAgIHZhciBib2R5ID0gc2FmZVBhcnNlKHR4dCk7CiAgICAgIHRocm93IEFwaUVycm9yKHJlcy5zdGF0dXMsIGVycm9yTWVzc2FnZShib2R5LCByZXMuc3RhdHVzKSwgYm9keSk7CiAgICB9KTsKICB9CgogIHZhciBhcGkgPSB7CgogICAgcmVxdWVzdDogcmVxdWVzdCwKICAgIHBvbGw6IHBvbGwsCiAgICBBcGlFcnJvcjogQXBpRXJyb3IsCiAgICBfc3RyaXBGcmFjdGlvbmFsOiBzdHJpcEZyYWN0aW9uYWwsCiAgICBfZmx1eEltYWdlVVJMOiBmbHV4SW1hZ2VVUkwsCgogICAgc2lnbnVwOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICB2YXIgYm9keSA9IE9iamVjdC5hc3NpZ24oCiAgICAgICAgewogICAgICAgICAgaGFzQWNjZXB0ZWRUZXJtc0FuZENvbmRpdGlvbnM6IHRydWUsCiAgICAgICAgICBoYXNBY2NlcHRlZFByaXZhY3lQb2xpY3k6IHRydWUsCiAgICAgICAgICBoYXJkd2FyZTogbnVsbAogICAgICAgIH0sCiAgICAgICAgZGF0YSB8fCB7fQogICAgICApOwogICAgICBpZiAoYm9keS5lbWFpbCkgYm9keS5lbWFpbCA9IFN0cmluZyhib2R5LmVtYWlsKS50b0xvd2VyQ2FzZSgpOwogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL3VzZXJzJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogYm9keSwgYXV0aDogZmFsc2UgfSk7CiAgICB9LAoKICAgIGxvZ2luOiBmdW5jdGlvbiAoZW1haWwsIHBhc3N3b3JkKSB7CiAgICAgIHZhciBiYXNpYzsKICAgICAgaWYgKFYudXRpbCAmJiB0eXBlb2YgVi51dGlsLmJhc2ljQXV0aEhlYWRlciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGJhc2ljID0gVi51dGlsLmJhc2ljQXV0aEhlYWRlcihlbWFpbCwgcGFzc3dvcmQpOwogICAgICB9IGVsc2UgewogICAgICAgIGJhc2ljID0gJ0Jhc2ljICcgKyBiNjQoU3RyaW5nKGVtYWlsKS50b0xvd2VyQ2FzZSgpICsgJzonICsgcGFzc3dvcmQpOwogICAgICB9CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvYXV0aC9sb2dpbicsIHsKICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICBhdXRoOiBmYWxzZSwKICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGJhc2ljIH0KICAgICAgfSk7CiAgICB9LAoKICAgIHdob2FtaTogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2F1dGgvdG9rZW4nLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIHJlcXVlc3RSZXNldDogZnVuY3Rpb24gKGVtYWlsKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvYXV0aC9wYXNzd29yZC9jb2RlJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGF1dGg6IGZhbHNlLAogICAgICAgIGJvZHk6IHsgZW1haWw6IFN0cmluZyhlbWFpbCkudG9Mb3dlckNhc2UoKSB9CiAgICAgIH0pOwogICAgfSwKCiAgICBzdWJtaXRSZXNldDogZnVuY3Rpb24gKGVtYWlsLCBjb2RlLCBuZXdQYXNzd29yZCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2F1dGgvcGFzc3dvcmQvcmVzZXQnLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgYXV0aDogZmFsc2UsCiAgICAgICAgYm9keTogeyBlbWFpbDogU3RyaW5nKGVtYWlsKS50b0xvd2VyQ2FzZSgpLCBjb2RlOiBjb2RlLCBuZXdQYXNzd29yZDogbmV3UGFzc3dvcmQgfQogICAgICB9KTsKICAgIH0sCgogICAgZW1haWxBdmFpbGFibGU6IGZ1bmN0aW9uIChlbWFpbCkgewogICAgICB2YXIgZW5jID0gZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhlbWFpbCkudG9Mb3dlckNhc2UoKSk7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvYXV0aC9pc0VtYWlsQXZhaWxhYmxlLycgKyBlbmMsIHsgbWV0aG9kOiAnUE9TVCcsIGF1dGg6IGZhbHNlIH0pCiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGJvZHkpIHsKCiAgICAgICAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdib29sZWFuJykgcmV0dXJuIGJvZHk7CiAgICAgICAgICBpZiAoYm9keSAmJiB0eXBlb2YgYm9keS5hdmFpbGFibGUgPT09ICdib29sZWFuJykgcmV0dXJuIGJvZHkuYXZhaWxhYmxlOwogICAgICAgICAgcmV0dXJuIGJvZHkgPT09ICd0cnVlJyB8fCBib2R5ID09PSB0cnVlOwogICAgICAgIH0pOwogICAgfSwKCiAgICB1c2VybmFtZUF2YWlsYWJsZTogZnVuY3Rpb24gKHVzZXJuYW1lKSB7CiAgICAgIHZhciBlbmMgPSBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKHVzZXJuYW1lKS50b0xvd2VyQ2FzZSgpKTsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9hdXRoL2lzVXNlcm5hbWVBdmFpbGFibGUvJyArIGVuYywgeyBtZXRob2Q6ICdQT1NUJywgYXV0aDogZmFsc2UgfSkKICAgICAgICAudGhlbihmdW5jdGlvbiAoYm9keSkgewogICAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnYm9vbGVhbicpIHJldHVybiBib2R5OwogICAgICAgICAgaWYgKGJvZHkgJiYgdHlwZW9mIGJvZHkuYXZhaWxhYmxlID09PSAnYm9vbGVhbicpIHJldHVybiBib2R5LmF2YWlsYWJsZTsKICAgICAgICAgIHJldHVybiBib2R5ID09PSAndHJ1ZScgfHwgYm9keSA9PT0gdHJ1ZTsKICAgICAgICB9KTsKICAgIH0sCgogICAgdXBkYXRlQWNjb3VudDogZnVuY3Rpb24gKHB1dERhdGEpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS91c2VycycsIHsgbWV0aG9kOiAnUFVUJywgYm9keTogcHV0RGF0YSB9KTsKICAgIH0sCgogICAgZGVsZXRlQWNjb3VudDogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL3VzZXJzJywgeyBtZXRob2Q6ICdERUxFVEUnIH0pOwogICAgfSwKCiAgICBjcmVkaXRzOiBmdW5jdGlvbiAoKSB7CgogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL3VzZXIvY3JlZGl0cycsIHsgbWV0aG9kOiAnR0VUJyB9KS50aGVuKGZ1bmN0aW9uIChib2R5KSB7CiAgICAgICAgdmFyIG4gPSBib2R5ICYmIHR5cGVvZiBib2R5LmNyZWRpdHMgPT09ICdudW1iZXInID8gYm9keS5jcmVkaXRzIDogMDsKICAgICAgICByZXR1cm4geyBjcmVkaXRzOiBuIH07CiAgICAgIH0pOwogICAgfSwKCiAgICBjaGVja291dDogZnVuY3Rpb24gKHByb2R1Y3RJRCkgewoKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9wYXkvY2hlY2tvdXQnLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiB7IHByb2R1Y3RJRDogcHJvZHVjdElEIH0gfSk7CiAgICB9LAoKICAgIGdlblRleHRUb0ltYWdlOiBmdW5jdGlvbiAocGFyYW1zKSB7CiAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTsKICAgICAgdmFyIHdpZHRoID0gcGFyYW1zLndpZHRoIHx8IChwYXJhbXMuaW1hZ2Vfc2l6ZSAmJiBwYXJhbXMuaW1hZ2Vfc2l6ZS53aWR0aCkgfHwgMTAyNDsKICAgICAgdmFyIGhlaWdodCA9IHBhcmFtcy5oZWlnaHQgfHwgKHBhcmFtcy5pbWFnZV9zaXplICYmIHBhcmFtcy5pbWFnZV9zaXplLmhlaWdodCkgfHwgMTAyNDsKICAgICAgdmFyIHNlZWQgPSBwYXJhbXMuc2VlZCAhPSBudWxsID8gcGFyYW1zLnNlZWQgOiByYW5kb21TZWVkKCk7CiAgICAgIHZhciBib2R5ID0gewogICAgICAgIHByb21wdDogcGFyYW1zLnByb21wdCB8fCAnJywKICAgICAgICBzZWVkOiBzZWVkLAogICAgICAgIGltYWdlX3NpemU6IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9CiAgICAgIH07CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZ2VuL2ZsdXgtc2NobmVsbCcsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IGJvZHksIHJhdzogdHJ1ZSB9KQogICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIHBhcnNlU3VibWl0KHJlcyk7IH0pOwogICAgfSwKCiAgICBwb2xsVGV4dFRvSW1hZ2U6IGZ1bmN0aW9uIChyZXF1ZXN0SUQpIHsKICAgICAgcmVxdWVzdElEID0gcmVxSWQocmVxdWVzdElEKTsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9nZW4vZmx1eC1zY2huZWxsLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVxdWVzdElEKSwgewogICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgcmF3OiB0cnVlCiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykgeyByZXR1cm4gcG9sbFJlc3BvbnNlKHJlcyk7IH0pOwogICAgfSwKCiAgICBnZW5FZGl0OiBmdW5jdGlvbiAobW9kZWwsIHBhcmFtcykgewogICAgICBtb2RlbCA9IG1vZGVsIHx8ICdmbHV4S2xlaW4nOwogICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307CiAgICAgIHZhciBib2R5ID0gc2hhcGVFZGl0UmVxdWVzdChtb2RlbCwgcGFyYW1zKTsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9nZW4vZWRpdC1pbWFnZScsIHsKICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICBxdWVyeTogeyBtb2RlbDogbW9kZWwgfSwKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHJhdzogdHJ1ZQogICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIHBhcnNlU3VibWl0KHJlcyk7IH0pOwogICAgfSwKCiAgICBwb2xsRWRpdDogZnVuY3Rpb24gKG1vZGVsLCByZXF1ZXN0SUQpIHsKICAgICAgcmVxdWVzdElEID0gcmVxSWQocmVxdWVzdElEKTsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9nZW4vZWRpdC1pbWFnZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlcXVlc3RJRCksIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIHF1ZXJ5OiB7IG1vZGVsOiBtb2RlbCB8fCAnZmx1eEtsZWluJyB9LAogICAgICAgIHJhdzogdHJ1ZQogICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIHBvbGxSZXNwb25zZShyZXMpOyB9KTsKICAgIH0sCgogICAgc2hhcGVFZGl0UmVxdWVzdDogZnVuY3Rpb24gKG1vZGVsLCBwYXJhbXMpIHsgcmV0dXJuIHNoYXBlRWRpdFJlcXVlc3QobW9kZWwsIHBhcmFtcyk7IH0sCgogICAgZ2VuRHluYW1pYzogZnVuY3Rpb24gKGVuZHBvaW50SWQsIHBhcmFtcykgewogICAgICB2YXIgYm9keSA9IHNoYXBlRWRpdFJlcXVlc3QocGFyYW1zICYmIHBhcmFtcy5tb2RlbCA/IHBhcmFtcy5tb2RlbCA6IG51bGwsIHBhcmFtcyB8fCB7fSk7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZ2VuL2R5bmFtaWMvJyArIGVuY29kZVNsdWcoZW5kcG9pbnRJZCksIHsKICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHJhdzogdHJ1ZQogICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIHBhcnNlU3VibWl0KHJlcyk7IH0pOwogICAgfSwKCiAgICBwb2xsRHluYW1pYzogZnVuY3Rpb24gKGVuZHBvaW50SWQsIHJlcXVlc3RJRCkgewogICAgICByZXF1ZXN0SUQgPSByZXFJZChyZXF1ZXN0SUQpOwogICAgICByZXR1cm4gcmVxdWVzdCgKICAgICAgICAnL3YxL2RyZWFtL2dlbi9keW5hbWljLycgKyBlbmNvZGVTbHVnKGVuZHBvaW50SWQpICsgJy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlcXVlc3RJRCksCiAgICAgICAgeyBtZXRob2Q6ICdHRVQnLCByYXc6IHRydWUgfQogICAgICApLnRoZW4oZnVuY3Rpb24gKHJlcykgeyByZXR1cm4gcG9sbFJlc3BvbnNlKHJlcyk7IH0pOwogICAgfSwKCiAgICBtb2RlbHM6IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9tb2RlbHMnLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIHJlZ2lzdHJ5OiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vcmVnaXN0cnknLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIGdlblZpZGVvTFRYOiBmdW5jdGlvbiAocGFyYW1zKSB7CiAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTsKICAgICAgdmFyIGJvZHkgPSB7CiAgICAgICAgaW1hZ2VfdXJsOiBwYXJhbXMuaW1hZ2VfdXJsLAogICAgICAgIHByb21wdDogcGFyYW1zLnByb21wdCB8fCAnJywKICAgICAgICBkdXJhdGlvbjogcGFyYW1zLmR1cmF0aW9uICE9IG51bGwgPyBwYXJhbXMuZHVyYXRpb24gOiA4LAogICAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkICE9IG51bGwgPyBwYXJhbXMuc2VlZCA6IHJhbmRvbVNlZWQoKQogICAgICB9OwogICAgICBpZiAocGFyYW1zLmVuZF9pbWFnZV91cmwpIGJvZHkuZW5kX2ltYWdlX3VybCA9IHBhcmFtcy5lbmRfaW1hZ2VfdXJsOwogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2dlbi9sdHgtdmlkZW8nLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiBib2R5LCByYXc6IHRydWUgfSkKICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7IHJldHVybiBwYXJzZVN1Ym1pdChyZXMpOyB9KTsKICAgIH0sCgogICAgcG9sbFZpZGVvTFRYOiBmdW5jdGlvbiAocmVxdWVzdElELCBnZW5lcmF0ZWRJbWFnZUlEKSB7CiAgICAgIHJlcXVlc3RJRCA9IHJlcUlkKHJlcXVlc3RJRCk7CiAgICAgIHZhciBxdWVyeSA9IHt9OwogICAgICBpZiAoZ2VuZXJhdGVkSW1hZ2VJRCkgcXVlcnkuZ2VuZXJhdGVkSW1hZ2VJRCA9IGdlbmVyYXRlZEltYWdlSUQ7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZ2VuL2x0eC12aWRlby8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlcXVlc3RJRCksIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIHF1ZXJ5OiBxdWVyeSwKICAgICAgICByYXc6IHRydWUKICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgcmV0dXJuIHBvbGxSZXNwb25zZShyZXMsIGZ1bmN0aW9uIChib2R5KSB7CgogICAgICAgICAgcmV0dXJuIGJvZHk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSwKCiAgICBwZXJzaXN0SW1hZ2U6IGZ1bmN0aW9uIChnZW5lcmF0ZWRJbWFnZSkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ltYWdlcycsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IGdlbmVyYXRlZEltYWdlIH0pOwogICAgfSwKCiAgICBsaWJyYXJ5OiBmdW5jdGlvbiAocGFnZSwgcGVyKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vdXNlci9tZS9nZW5lcmF0ZWRpbWFnZXMnLCB7CiAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICBxdWVyeTogeyBwYWdlOiBwYWdlICE9IG51bGwgPyBwYWdlIDogMSwgcGVyOiBwZXIgIT0gbnVsbCA/IHBlciA6IDMwIH0KICAgICAgfSkudGhlbihwYWdpbmF0ZWQpOwogICAgfSwKCiAgICBmYXZvcml0ZXM6IGZ1bmN0aW9uIChwZXIpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS91c2VyL21lL2dlbmVyYXRlZGltYWdlcy9mYXZvcml0ZWQnLCB7CiAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICBxdWVyeTogeyBwZXI6IHBlciAhPSBudWxsID8gcGVyIDogMjAwIH0KICAgICAgfSkudGhlbihwYWdpbmF0ZWQpOwogICAgfSwKCiAgICBzZXRGYXZvcml0ZTogZnVuY3Rpb24gKHJlbW90ZUlELCBmYXZvcml0ZWQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9pbWFnZXMvJyArIGVuY29kZVVSSUNvbXBvbmVudChyZW1vdGVJRCkgKyAnL2Zhdm9yaXRlZCcsIHsKICAgICAgICBtZXRob2Q6ICdQQVRDSCcsCiAgICAgICAgYm9keTogeyBmYXZvcml0ZWQ6ICEhZmF2b3JpdGVkIH0KICAgICAgfSk7CiAgICB9LAoKICAgIGRlbGV0ZUltYWdlOiBmdW5jdGlvbiAocmVtb3RlSUQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92Mi9nZW5lcmF0ZWRpbWFnZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlbW90ZUlEKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pOwogICAgfSwKCiAgICBkZWxldGVMaWJyYXJ5SW1hZ2U6IGZ1bmN0aW9uIChyZW1vdGVJRCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ltYWdlcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlbW90ZUlEKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pOwogICAgfSwKCiAgICBzZXRQdWJsaXNoZWQ6IGZ1bmN0aW9uIChyZW1vdGVJRCwgcHVibGlzaGVkKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vaW1hZ2VzLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVtb3RlSUQpLCB7CiAgICAgICAgbWV0aG9kOiAnUFVUJywKICAgICAgICBib2R5OiB7IHB1Ymxpc2hlZDogISFwdWJsaXNoZWQgfQogICAgICB9KTsKICAgIH0sCgogICAgcmF0aW5nOiBmdW5jdGlvbiAocmVtb3RlSUQsIGFjdGlvbikgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ltYWdlcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlbW90ZUlEKSArICcvcmF0aW5nJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGJvZHk6IHsgYWN0aW9uOiBhY3Rpb24gfQogICAgICB9KTsKICAgIH0sCgogICAgaGlzdG9yeTogZnVuY3Rpb24gKHJlbW90ZUlEKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vaW1hZ2VzLycgKyBlbmNvZGVVUklDb21wb25lbnQocmVtb3RlSUQpICsgJy9oaXN0b3J5JywgewogICAgICAgIG1ldGhvZDogJ0dFVCcKICAgICAgfSk7CiAgICB9LAoKICAgIHB1YmxpY0ZlZWQ6IGZ1bmN0aW9uIChwYWdlLCBwZXIsIHRhZykgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ltYWdlcycsIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIGF1dGg6IGZhbHNlLAogICAgICAgIHF1ZXJ5OiB7IHBhZ2U6IHBhZ2UgIT0gbnVsbCA/IHBhZ2UgOiAxLCBwZXI6IHBlciAhPSBudWxsID8gcGVyIDogMzAsIHRhZzogdGFnIHx8IHVuZGVmaW5lZCB9CiAgICAgIH0pLnRoZW4ocGFnaW5hdGVkKTsKICAgIH0sCgogICAgZm9sZGVyczogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ZvbGRlcnMnLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIGNyZWF0ZUZvbGRlcjogZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9mb2xkZXJzJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogeyBuYW1lOiBuYW1lIH0gfSk7CiAgICB9LAoKICAgIHJlbmFtZUZvbGRlcjogZnVuY3Rpb24gKGlkLCBuYW1lKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZm9sZGVycy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSwgewogICAgICAgIG1ldGhvZDogJ1BBVENIJywKICAgICAgICBib2R5OiB7IG5hbWU6IG5hbWUgfQogICAgICB9KTsKICAgIH0sCgogICAgZGVsZXRlRm9sZGVyOiBmdW5jdGlvbiAoaWQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9mb2xkZXJzLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7CiAgICB9LAoKICAgIGFzc2lnbkZvbGRlcjogZnVuY3Rpb24gKGZvbGRlcklELCBpbWFnZUlEcykgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL2RyZWFtL2ZvbGRlcnMvYXNzaWduJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGJvZHk6IHsgZm9sZGVySUQ6IGZvbGRlcklEICE9IG51bGwgPyBmb2xkZXJJRCA6IG51bGwsIGltYWdlSURzOiBpbWFnZUlEcyB8fCBbXSB9CiAgICAgIH0pOwogICAgfSwKCiAgICBmb2xkZXJJbWFnZXM6IGZ1bmN0aW9uIChpZCwgcGFnZSwgcGVyKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vZm9sZGVycy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSArICcvaW1hZ2VzJywgewogICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgcXVlcnk6IHsgcGFnZTogcGFnZSAhPSBudWxsID8gcGFnZSA6IDEsIHBlcjogcGVyICE9IG51bGwgPyBwZXIgOiAzMCB9CiAgICAgIH0pLnRoZW4ocGFnaW5hdGVkKTsKICAgIH0sCgogICAgcHJlc2V0czogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YzL3ByZXNldHMnLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIGNyZWF0ZVByZXNldDogZnVuY3Rpb24gKHApIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92My9wcmVzZXRzJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogbm9ybWFsaXplUHJlc2V0KHApIH0pOwogICAgfSwKCiAgICB1cGRhdGVQcmVzZXQ6IGZ1bmN0aW9uIChpZCwgcCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YzL3ByZXNldHMvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCksIHsKICAgICAgICBtZXRob2Q6ICdQVVQnLAogICAgICAgIGJvZHk6IG5vcm1hbGl6ZVByZXNldChwKQogICAgICB9KTsKICAgIH0sCgogICAgZGVsZXRlUHJlc2V0OiBmdW5jdGlvbiAoaWQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92My9wcmVzZXRzLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7CiAgICB9LAoKICAgIHJlb3JkZXJQcmVzZXRzOiBmdW5jdGlvbiAoaWRzKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjMvcHJlc2V0cy9yZW9yZGVyJywgeyBtZXRob2Q6ICdQVVQnLCBib2R5OiB7IG9yZGVyZWRJRHM6IGlkcyB8fCBbXSB9IH0pOwogICAgfSwKCiAgICBzeW5jUHJlc2V0czogZnVuY3Rpb24gKHByZXNldHMpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92My9wcmVzZXRzL3N5bmMnLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgYm9keTogeyBwcmVzZXRzOiAocHJlc2V0cyB8fCBbXSkubWFwKG5vcm1hbGl6ZVByZXNldCkgfQogICAgICB9KTsKICAgIH0sCgogICAgY3VyYXRlZEZlZWQ6IGZ1bmN0aW9uIChwYWdlLCBwZXIsIHRhZykgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YyL2N1cmF0aW9uL2dlbmVyYXRlZGltYWdlcycsIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIGF1dGg6IGZhbHNlLAogICAgICAgIHF1ZXJ5OiB7IHBhZ2U6IHBhZ2UgIT0gbnVsbCA/IHBhZ2UgOiAxLCBwZXI6IHBlciAhPSBudWxsID8gcGVyIDogMzAsIHRhZzogdGFnIHx8IHVuZGVmaW5lZCB9CiAgICAgIH0pLnRoZW4ocGFnaW5hdGVkKTsKICAgIH0sCgogICAgZ2V0UHJvZmlsZTogZnVuY3Rpb24gKGlkKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjIvcHJvZmlsZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSwgeyBtZXRob2Q6ICdHRVQnIH0pOwogICAgfSwKCiAgICBnZXRQcml2YXRlUHJvZmlsZTogZnVuY3Rpb24gKGlkKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjIvcHJvZmlsZS9wcml2YXRlLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIGNyZWF0ZVByb2ZpbGU6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjIvcHJvZmlsZScsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IGRhdGEgfSk7CiAgICB9LAoKICAgIHVwZGF0ZVByb2ZpbGU6IGZ1bmN0aW9uIChpZCwgZGF0YSkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YyL3Byb2ZpbGUvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCksIHsgbWV0aG9kOiAnUFVUJywgYm9keTogZGF0YSB9KTsKICAgIH0sCgogICAgZGVsZXRlUHJvZmlsZTogZnVuY3Rpb24gKGlkKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjIvcHJvZmlsZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pOwogICAgfSwKCiAgICBwcm9maWxlSW1hZ2VzOiBmdW5jdGlvbiAoaWQsIHBhZ2UsIHBlcikgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YyL3Byb2ZpbGUvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCkgKyAnL2dlbmVyYXRlZGltYWdlcycsIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIHF1ZXJ5OiB7IHBhZ2U6IHBhZ2UgIT0gbnVsbCA/IHBhZ2UgOiAxLCBwZXI6IHBlciAhPSBudWxsID8gcGVyIDogMzAgfQogICAgICB9KS50aGVuKHBhZ2luYXRlZCk7CiAgICB9LAoKICAgIHB1Ymxpc2hJbWFnZTogZnVuY3Rpb24gKHByb2ZpbGVJRCwgZ2VuZXJhdGVkSW1hZ2UpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92Mi9wcm9maWxlLycgKyBlbmNvZGVVUklDb21wb25lbnQocHJvZmlsZUlEKSArICcvZ2VuZXJhdGVkaW1hZ2UnLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgYm9keTogZ2VuZXJhdGVkSW1hZ2UKICAgICAgfSk7CiAgICB9LAoKICAgIHVwbG9hZEltYWdlOiBmdW5jdGlvbiAoYmxvYk9yRmlsZSwgbWVkaWFUeXBlLCBvcHRzKSB7CiAgICAgIG1lZGlhVHlwZSA9IG1lZGlhVHlwZSB8fCAncmVuZGVyJzsKICAgICAgb3B0cyA9IG9wdHMgfHwge307CgogICAgICBpZiAoIShibG9iT3JGaWxlIGluc3RhbmNlb2YgQmxvYikpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoQXBpRXJyb3IoMCwgJ3VwbG9hZEltYWdlIHJlcXVpcmVzIGEgQmxvYiBvciBGaWxlLicsIG51bGwpKTsKICAgICAgfQoKICAgICAgdmFyIGNvbnRlbnRUeXBlID0gYmxvYk9yRmlsZS50eXBlIHx8IG1lZGlhVHlwZUNvbnRlbnRUeXBlKG1lZGlhVHlwZSk7CiAgICAgIHZhciBmaWxlbmFtZSA9IG9wdHMuZmlsZW5hbWUgfHwgKGJsb2JPckZpbGUubmFtZSkgfHwgKHV1aWQoKSArIGZpbGVFeHQoY29udGVudFR5cGUpKTsKICAgICAgdmFyIHRvdGFsQnl0ZXMgPSBibG9iT3JGaWxlLnNpemUgIT0gbnVsbCA/IGJsb2JPckZpbGUuc2l6ZSA6IG51bGw7CgogICAgICB2YXIgcXVlcnkgPSB7CiAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lLAogICAgICAgIG1lZGlhVHlwZTogbWVkaWFUeXBlLAogICAgICAgIHRvdGFsQnl0ZXM6IHRvdGFsQnl0ZXMKICAgICAgfTsKICAgICAgaWYgKG9wdHMucHJvZmlsZUlEKSBxdWVyeS5wcm9maWxlSUQgPSBvcHRzLnByb2ZpbGVJRDsKICAgICAgaWYgKG9wdHMucHJvamVjdElEKSBxdWVyeS5wcm9qZWN0SUQgPSBvcHRzLnByb2plY3RJRDsKCiAgICAgIHZhciByZXFJbml0ID0gewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIHF1ZXJ5OiBxdWVyeSwKICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiBjb250ZW50VHlwZSB9LAogICAgICAgIGJvZHk6IGJsb2JPckZpbGUKICAgICAgfTsKICAgICAgaWYgKG9wdHMuc2lnbmFsKSByZXFJbml0LnNpZ25hbCA9IG9wdHMuc2lnbmFsOwoKICAgICAgcmV0dXJuIHJlcXVlc3QoJy9tZWRpYS91cGxvYWQnLCByZXFJbml0KS50aGVuKGZ1bmN0aW9uIChwZXJzb25hbCkgewogICAgICAgIHZhciBwdWJsaWNVUkwgPSBwZXJzb25hbCAmJiBwZXJzb25hbC5nbG9iYWwgJiYgcGVyc29uYWwuZ2xvYmFsLm1lZGlhVVJMOwogICAgICAgIGlmICghcHVibGljVVJMKSB7CiAgICAgICAgICB0aHJvdyBBcGlFcnJvcig1MDIsICdUaGUgdXBsb2FkIHNlcnZpY2UgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCByZXNwb25zZS4nLCBwZXJzb25hbCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwdWJsaWNVUkw7CiAgICAgIH0pOwogICAgfSwKCiAgICByZWZlcnJhbENvZGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vcmVmZXJyYWwvY29kZXMnLCB7IG1ldGhvZDogJ0dFVCcgfSk7CiAgICB9LAoKICAgIHJlZmVycmFsQXR0cmlidXRpb246IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9yZWZlcnJhbC9hdHRyaWJ1dGlvbicsIHsgbWV0aG9kOiAnR0VUJyB9KTsKICAgIH0sCgogICAgYXR0cmlidXRlUmVmZXJyYWw6IGZ1bmN0aW9uIChjb2RlKSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvdjEvZHJlYW0vcmVmZXJyYWwvYXR0cmlidXRlJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGJvZHk6IHsgY29kZTogY29kZSB9CiAgICAgIH0pOwogICAgfSwKCiAgICBsb29rdXBSZWZlcnJhbDogZnVuY3Rpb24gKGNvZGUpIHsKICAgICAgcmV0dXJuIHJlcXVlc3QoJy92MS9kcmVhbS9yZWZlcnJhbC9jb2RlLycgKyBlbmNvZGVVUklDb21wb25lbnQoY29kZSksIHsKICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgIGF1dGg6IGZhbHNlCiAgICAgIH0pOwogICAgfSwKCiAgICBzZWFyY2g6IGZ1bmN0aW9uICh0ZXh0KSB7CiAgICAgIHJldHVybiByZXF1ZXN0KCcvc2VhcmNoLycgKyBlbmNvZGVVUklDb21wb25lbnQodGV4dCksIHsgbWV0aG9kOiAnR0VUJyB9KTsKICAgIH0sCgogICAgdXNlclNlYXJjaDogZnVuY3Rpb24gKHRleHQsIHBhZ2UsIHBlcikgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3VzZXJzZWFyY2gvJyArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgewogICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgcXVlcnk6IHsgcGFnZTogcGFnZSAhPSBudWxsID8gcGFnZSA6IDEsIHBlcjogcGVyICE9IG51bGwgPyBwZXIgOiAzMCB9CiAgICAgIH0pLnRoZW4ocGFnaW5hdGVkKTsKICAgIH0sCgogICAgcmVwb3J0OiBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICByZXR1cm4gcmVxdWVzdCgnL3YxL21vZGVyYXRlL3JlcG9ydCcsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IHBheWxvYWQgfSk7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gcmVxSWQoeCkgewogICAgaWYgKHggJiYgdHlwZW9mIHggPT09ICdvYmplY3QnKSByZXR1cm4geC5yZXF1ZXN0X2lkIHx8IHgucmVxdWVzdElEIHx8IHguaWQgfHwgJyc7CiAgICByZXR1cm4geDsKICB9CgogIGZ1bmN0aW9uIHBhcnNlU3VibWl0KHJlcykgewogICAgaWYgKHJlcy5zdGF0dXMgPT09IDIwMikgewoKICAgIH0KICAgIHJldHVybiByZXMudGV4dCgpLnRoZW4oZnVuY3Rpb24gKHR4dCkgewogICAgICB2YXIgYm9keSA9IHNhZmVQYXJzZSh0eHQpOwogICAgICBpZiAoIXJlcy5vayAmJiByZXMuc3RhdHVzICE9PSAyMDIpIHsKICAgICAgICB0aHJvdyBBcGlFcnJvcihyZXMuc3RhdHVzLCBlcnJvck1lc3NhZ2UoYm9keSwgcmVzLnN0YXR1cyksIGJvZHkpOwogICAgICB9CiAgICAgIGlmICghYm9keSB8fCAoIWJvZHkucmVxdWVzdF9pZCAmJiAhYm9keS5yZXF1ZXN0SUQpKSB7CiAgICAgICAgdGhyb3cgQXBpRXJyb3IocmVzLnN0YXR1cyB8fCA1MDIsIGVycm9yTWVzc2FnZShib2R5LCByZXMuc3RhdHVzKSB8fCAnR2VuZXJhdGlvbiBjb3VsZCBub3QgYmUgc3RhcnRlZC4nLCBib2R5KTsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIHJlcXVlc3RfaWQ6IGJvZHkucmVxdWVzdF9pZCB8fCBib2R5LnJlcXVlc3RJRCwKICAgICAgICBxdWV1ZV9wb3NpdGlvbjogYm9keS5xdWV1ZV9wb3NpdGlvbiAhPSBudWxsID8gYm9keS5xdWV1ZV9wb3NpdGlvbiA6IChib2R5LnF1ZXVlUG9zaXRpb24gIT0gbnVsbCA/IGJvZHkucXVldWVQb3NpdGlvbiA6IDApCiAgICAgIH07CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHNoYXBlRWRpdFJlcXVlc3QobW9kZWwsIHBhcmFtcykgewogICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgdmFyIHNlZWQgPSBwYXJhbXMuc2VlZCAhPSBudWxsID8gcGFyYW1zLnNlZWQgOiByYW5kb21TZWVkKCk7CiAgICB2YXIgYm9keSA9IHsKICAgICAgcHJvbXB0OiBwYXJhbXMucHJvbXB0IHx8ICcnLAogICAgICBzZWVkOiBzZWVkCiAgICB9OwoKICAgIHZhciB1cmxzID0gcGFyYW1zLmltYWdlX3VybHMgfHwgcGFyYW1zLmltYWdlVVJMcyB8fCBudWxsOwogICAgdmFyIHNpbmdsZSA9IHBhcmFtcy5pbWFnZV91cmwgfHwgcGFyYW1zLmltYWdlVVJMIHx8ICh1cmxzICYmIHVybHMubGVuZ3RoID8gdXJsc1swXSA6IG51bGwpOwoKICAgIGlmIChwYXJhbXMuaW1hZ2Vfc2l6ZSkgYm9keS5pbWFnZV9zaXplID0gcGFyYW1zLmltYWdlX3NpemU7CgogICAgaWYgKE5BTk9fTU9ERUxTW21vZGVsXSkgewoKICAgICAgdmFyIGFyciA9IHVybHMgJiYgdXJscy5sZW5ndGggPyB1cmxzLnNsaWNlKCkgOiAoc2luZ2xlID8gW3NpbmdsZV0gOiBbXSk7CiAgICAgIGJvZHkuaW1hZ2VfdXJscyA9IGFycjsKICAgICAgaWYgKHNpbmdsZSkgYm9keS5pbWFnZV91cmwgPSBzaW5nbGU7CiAgICAgIGJvZHkubnVtX2ltYWdlcyA9IDE7CgogICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gJ3F3ZW5JbWFnZUVkaXQnKSB7CiAgICAgIGlmIChzaW5nbGUpIGJvZHkuaW1hZ2VfdXJsID0gc2luZ2xlOwogICAgICBib2R5Lm51bV9pbmZlcmVuY2Vfc3RlcHMgPSAzMDsKICAgICAgYm9keS5ndWlkYW5jZV9zY2FsZSA9IDQ7CiAgICAgIGJvZHkubmVnYXRpdmVfcHJvbXB0ID0gJyAnOwogICAgICBib2R5LmFjY2VsZXJhdGlvbiA9ICdoaWdoJzsKICAgIH0gZWxzZSB7CgogICAgICBpZiAoc2luZ2xlKSBib2R5LmltYWdlX3VybCA9IHNpbmdsZTsKICAgICAgaWYgKHVybHMgJiYgdXJscy5sZW5ndGggPiAxKSBib2R5LmltYWdlX3VybHMgPSB1cmxzLnNsaWNlKCk7CiAgICAgIGJvZHkuYWNjZWxlcmF0aW9uID0gJ2hpZ2gnOwogICAgfQoKICAgIGlmIChwYXJhbXMubnVtX2luZmVyZW5jZV9zdGVwcyAhPSBudWxsICYmIGJvZHkubnVtX2luZmVyZW5jZV9zdGVwcyA9PSBudWxsKSB7CiAgICAgIGJvZHkubnVtX2luZmVyZW5jZV9zdGVwcyA9IHBhcmFtcy5udW1faW5mZXJlbmNlX3N0ZXBzOwogICAgfQogICAgaWYgKHBhcmFtcy5ndWlkYW5jZV9zY2FsZSAhPSBudWxsICYmIGJvZHkuZ3VpZGFuY2Vfc2NhbGUgPT0gbnVsbCkgewogICAgICBib2R5Lmd1aWRhbmNlX3NjYWxlID0gcGFyYW1zLmd1aWRhbmNlX3NjYWxlOwogICAgfQogICAgaWYgKHBhcmFtcy5uZWdhdGl2ZV9wcm9tcHQgIT0gbnVsbCAmJiBib2R5Lm5lZ2F0aXZlX3Byb21wdCA9PSBudWxsKSB7CiAgICAgIGJvZHkubmVnYXRpdmVfcHJvbXB0ID0gcGFyYW1zLm5lZ2F0aXZlX3Byb21wdDsKICAgIH0KICAgIGlmIChwYXJhbXMubnVtX2ltYWdlcyAhPSBudWxsICYmIGJvZHkubnVtX2ltYWdlcyA9PSBudWxsKSB7CiAgICAgIGJvZHkubnVtX2ltYWdlcyA9IHBhcmFtcy5udW1faW1hZ2VzOwogICAgfQogICAgaWYgKHBhcmFtcy5sb3JhcyAhPSBudWxsKSBib2R5LmxvcmFzID0gcGFyYW1zLmxvcmFzOwogICAgaWYgKHBhcmFtcy5hY2NlbGVyYXRpb24gIT0gbnVsbCkgYm9keS5hY2NlbGVyYXRpb24gPSBwYXJhbXMuYWNjZWxlcmF0aW9uOwoKICAgIHJldHVybiBib2R5OwogIH0KCiAgZnVuY3Rpb24gbm9ybWFsaXplUHJlc2V0KHApIHsKICAgIHAgPSBwIHx8IHt9OwogICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9cLlxkezN9WiQvLCAnWicpOwogICAgcmV0dXJuIHsKICAgICAgaWQ6IHAuaWQgfHwgdXVpZCgpLAogICAgICBuYW1lOiBwLm5hbWUgfHwgJycsCiAgICAgIHByb21wdDogcC5wcm9tcHQgfHwgJycsCiAgICAgIG5lZ2F0aXZlUHJvbXB0OiBwLm5lZ2F0aXZlUHJvbXB0ICE9IG51bGwgPyBwLm5lZ2F0aXZlUHJvbXB0IDogbnVsbCwKICAgICAgbW9kZWw6IHAubW9kZWwgIT0gbnVsbCA/IHAubW9kZWwgOiBudWxsLAogICAgICBkeW5hbWljRW5kcG9pbnRJRDogcC5keW5hbWljRW5kcG9pbnRJRCAhPSBudWxsID8gcC5keW5hbWljRW5kcG9pbnRJRCA6IG51bGwsCiAgICAgIGNyZWF0ZWRBdDogcC5jcmVhdGVkQXQgfHwgbm93LAogICAgICB1cGRhdGVkQXQ6IG5vdwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHBhZ2luYXRlZChib2R5KSB7CiAgICBpZiAoIWJvZHkpIHJldHVybiB7IGl0ZW1zOiBbXSwgbWV0YWRhdGE6IHsgcGFnZTogMSwgcGVyOiAwLCB0b3RhbDogMCB9IH07CiAgICBpZiAoQXJyYXkuaXNBcnJheShib2R5KSkgewogICAgICByZXR1cm4geyBpdGVtczogYm9keSwgbWV0YWRhdGE6IHsgcGFnZTogMSwgcGVyOiBib2R5Lmxlbmd0aCwgdG90YWw6IGJvZHkubGVuZ3RoIH0gfTsKICAgIH0KICAgIHZhciBpdGVtcyA9IEFycmF5LmlzQXJyYXkoYm9keS5pdGVtcykgPyBib2R5Lml0ZW1zIDogW107CiAgICB2YXIgbWV0YSA9IGJvZHkubWV0YWRhdGEgfHwge307CiAgICByZXR1cm4gewogICAgICBpdGVtczogaXRlbXMsCiAgICAgIG1ldGFkYXRhOiB7CiAgICAgICAgcGFnZTogbWV0YS5wYWdlICE9IG51bGwgPyBtZXRhLnBhZ2UgOiAxLAogICAgICAgIHBlcjogbWV0YS5wZXIgIT0gbnVsbCA/IG1ldGEucGVyIDogaXRlbXMubGVuZ3RoLAogICAgICAgIHRvdGFsOiBtZXRhLnRvdGFsICE9IG51bGwgPyBtZXRhLnRvdGFsIDogaXRlbXMubGVuZ3RoCiAgICAgIH0KICAgIH07CiAgfQoKICBmdW5jdGlvbiBlbmNvZGVTbHVnKGVuZHBvaW50SWQpIHsKICAgIHZhciBzbHVnID0gU3RyaW5nKGVuZHBvaW50SWQgfHwgJycpLnJlcGxhY2UoL15mYWwtYWlcLy8sICcnKTsKCiAgICByZXR1cm4gc2x1Zy5zcGxpdCgnLycpLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJy8nKTsKICB9CgogIGZ1bmN0aW9uIG1lZGlhVHlwZUNvbnRlbnRUeXBlKG1lZGlhVHlwZSkgewogICAgc3dpdGNoIChtZWRpYVR5cGUpIHsKICAgICAgY2FzZSAncGRmJzogcmV0dXJuICdhcHBsaWNhdGlvbi9wZGYnOwogICAgICBjYXNlICdqc29uJzogcmV0dXJuICdhcHBsaWNhdGlvbi9qc29uJzsKICAgICAgY2FzZSAnb2JqWmlwJzoKICAgICAgY2FzZSAnc3BhdGlhbEFzc2V0JzogcmV0dXJuICdhcHBsaWNhdGlvbi96aXAnOwogICAgICBjYXNlICd1c2R6JzogcmV0dXJuICdtb2RlbC92bmQudXNkeit6aXAnOwogICAgICBjYXNlICdkYXRhJzoKICAgICAgY2FzZSAnZHdnJzoKICAgICAgY2FzZSAncmVhbGl0eSc6IHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKCiAgICAgIGRlZmF1bHQ6IHJldHVybiAnaW1hZ2UvanBlZyc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBmaWxlRXh0KGNvbnRlbnRUeXBlKSB7CiAgICBpZiAoIWNvbnRlbnRUeXBlKSByZXR1cm4gJy5qcGcnOwogICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoJ3BuZycpID49IDApIHJldHVybiAnLnBuZyc7CiAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignd2VicCcpID49IDApIHJldHVybiAnLndlYnAnOwogICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoJ2pwZWcnKSA+PSAwIHx8IGNvbnRlbnRUeXBlLmluZGV4T2YoJ2pwZycpID49IDApIHJldHVybiAnLmpwZyc7CiAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignbXA0JykgPj0gMCkgcmV0dXJuICcubXA0JzsKICAgIHJldHVybiAnLmJpbic7CiAgfQoKICBmdW5jdGlvbiBiNjQoc3RyKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwuYjY0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51dGlsLmI2NChzdHIpOwogICAgdHJ5IHsKICAgICAgcmV0dXJuIHdpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7CiAgICB9IGNhdGNoIChfZSkgewogICAgICByZXR1cm4gd2luZG93LmJ0b2Eoc3RyKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHV1aWQoKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwudXVpZCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudXRpbC51dWlkKCk7CiAgICBpZiAod2luZG93LmNyeXB0byAmJiB0eXBlb2Ygd2luZG93LmNyeXB0by5yYW5kb21VVUlEID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKTsKICAgIH0KICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgIHZhciByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwOwogICAgICB2YXIgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDg7CiAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTsKICAgIH0pOwogIH0KCiAgVi5hcGkgPSBhcGk7Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2F1dGguanMgPT09PT0gKi8KCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9IHdpbmRvdy5WIHx8ICh3aW5kb3cuViA9IHt9KTsKCiAgdmFyIFRPS0VOX0tFWSA9ICd2YW1wX3dlYl90b2tlbic7CgogIGZ1bmN0aW9uIHNhZmVHZXRTdG9yYWdlKCkgewoKICAgIHRyeSB7CiAgICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlIHx8IG51bGw7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVhZFRva2VuKCkgewogICAgdmFyIGxzID0gc2FmZUdldFN0b3JhZ2UoKTsKICAgIGlmICghbHMpIHJldHVybiBudWxsOwogICAgdHJ5IHsKICAgICAgdmFyIHQgPSBscy5nZXRJdGVtKFRPS0VOX0tFWSk7CiAgICAgIHJldHVybiB0ICYmIHQubGVuZ3RoID8gdCA6IG51bGw7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gd3JpdGVUb2tlbih0KSB7CiAgICB2YXIgbHMgPSBzYWZlR2V0U3RvcmFnZSgpOwogICAgaWYgKCFscykgcmV0dXJuOwogICAgdHJ5IHsKICAgICAgaWYgKHQgPT0gbnVsbCB8fCB0ID09PSAnJykgbHMucmVtb3ZlSXRlbShUT0tFTl9LRVkpOwogICAgICBlbHNlIGxzLnNldEl0ZW0oVE9LRU5fS0VZLCBTdHJpbmcodCkpOwogICAgfSBjYXRjaCAoZSkgewoKICAgIH0KICB9CgogIGZ1bmN0aW9uIGVtaXQoZXZ0LCBwYXlsb2FkKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5lbWl0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgVi5zdG9yZS5lbWl0KGV2dCwgcGF5bG9hZCk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKCiAgICB9CiAgfQoKICBmdW5jdGlvbiBzZXRTdGF0ZShrZXksIHZhbHVlKSB7CiAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5zZXQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgVi5zdG9yZS5zZXQoa2V5LCB2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICBWLnN0YXRlID0gVi5zdGF0ZSB8fCB7fTsKICAgICAgVi5zdGF0ZVtrZXldID0gdmFsdWU7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXRTdGF0ZShrZXkpIHsKICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLmdldCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYuc3RvcmUuZ2V0KGtleSk7CiAgICByZXR1cm4gVi5zdGF0ZSA/IFYuc3RhdGVba2V5XSA6IHVuZGVmaW5lZDsKICB9CgogIGZ1bmN0aW9uIG5vcm1hbGl6ZVVzZXIocGVyc29uYWwpIHsKICAgIGlmICghcGVyc29uYWwgfHwgdHlwZW9mIHBlcnNvbmFsICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7CgogICAgdmFyIGdsb2JhbCA9IHBlcnNvbmFsLmdsb2JhbCAmJiB0eXBlb2YgcGVyc29uYWwuZ2xvYmFsID09PSAnb2JqZWN0JyA/IHBlcnNvbmFsLmdsb2JhbCA6IHt9OwogICAgdmFyIG1pY3JvID0gZ2xvYmFsLm1pY3JvICYmIHR5cGVvZiBnbG9iYWwubWljcm8gPT09ICdvYmplY3QnID8gZ2xvYmFsLm1pY3JvIDoge307CgogICAgdmFyIGlkID0gbWljcm8uaWQgIT0gbnVsbCA/IG1pY3JvLmlkIDogKHBlcnNvbmFsLmlkICE9IG51bGwgPyBwZXJzb25hbC5pZCA6IG51bGwpOwoKICAgIHZhciB1c2VybmFtZSA9IG1pY3JvLnVzZXJuYW1lICE9IG51bGwgPyBtaWNyby51c2VybmFtZQogICAgICA6IChwZXJzb25hbC51c2VybmFtZSAhPSBudWxsID8gcGVyc29uYWwudXNlcm5hbWUgOiBudWxsKTsKCiAgICB2YXIgZW1haWwgPSBwZXJzb25hbC5lbWFpbCAhPSBudWxsID8gcGVyc29uYWwuZW1haWwgOiBudWxsOwoKICAgIHZhciBmaXJzdE5hbWUgPSBtaWNyby5maXJzdE5hbWUgIT0gbnVsbCA/IG1pY3JvLmZpcnN0TmFtZQogICAgICA6IChwZXJzb25hbC5maXJzdE5hbWUgIT0gbnVsbCA/IHBlcnNvbmFsLmZpcnN0TmFtZSA6IG51bGwpOwogICAgdmFyIGxhc3ROYW1lID0gbWljcm8ubGFzdE5hbWUgIT0gbnVsbCA/IG1pY3JvLmxhc3ROYW1lCiAgICAgIDogKHBlcnNvbmFsLmxhc3ROYW1lICE9IG51bGwgPyBwZXJzb25hbC5sYXN0TmFtZSA6IG51bGwpOwoKICAgIHZhciBuYW1lID0gbWljcm8ubmFtZSAhPSBudWxsID8gbWljcm8ubmFtZQogICAgICA6IChwZXJzb25hbC5uYW1lICE9IG51bGwgPyBwZXJzb25hbC5uYW1lIDogbnVsbCk7CiAgICBpZiAoIW5hbWUpIHsKICAgICAgdmFyIHBhcnRzID0gW107CiAgICAgIGlmIChmaXJzdE5hbWUpIHBhcnRzLnB1c2goZmlyc3ROYW1lKTsKICAgICAgaWYgKGxhc3ROYW1lKSBwYXJ0cy5wdXNoKGxhc3ROYW1lKTsKICAgICAgbmFtZSA9IHBhcnRzLmpvaW4oJyAnKSB8fCBudWxsOwogICAgfQoKICAgIHZhciBkaXNwbGF5TmFtZSA9IG5hbWUgfHwgdXNlcm5hbWUgfHwgKGVtYWlsID8gZW1haWwuc3BsaXQoJ0AnKVswXSA6IG51bGwpIHx8ICdZb3UnOwoKICAgIHZhciBwcm9maWxlUGljVVJMID0gbWljcm8ucHJvZmlsZVBpY1VSTCAhPSBudWxsID8gbWljcm8ucHJvZmlsZVBpY1VSTAogICAgICA6IChwZXJzb25hbC5wcm9maWxlUGljVVJMICE9IG51bGwgPyBwZXJzb25hbC5wcm9maWxlUGljVVJMIDogbnVsbCk7CgogICAgcmV0dXJuIHsKICAgICAgaWQ6IGlkLAogICAgICBlbWFpbDogZW1haWwsCiAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSwKICAgICAgbmFtZTogbmFtZSwKICAgICAgZGlzcGxheU5hbWU6IGRpc3BsYXlOYW1lLAogICAgICBmaXJzdE5hbWU6IGZpcnN0TmFtZSwKICAgICAgbGFzdE5hbWU6IGxhc3ROYW1lLAogICAgICBwcm9maWxlUGljVVJMOiBwcm9maWxlUGljVVJMLAogICAgICBhZG1pbjogcGVyc29uYWwuYWRtaW4gPT09IHRydWUsCiAgICAgIGVtYWlsQ29uZmlybWVkOiBwZXJzb25hbC5lbWFpbENvbmZpcm1lZCA9PT0gdHJ1ZSwKICAgICAgaXNBbm9ueW1vdXM6IG1pY3JvLmlzQW5vbnltb3VzID09PSB0cnVlLAoKICAgICAgY3JlZGl0czogdHlwZW9mIHBlcnNvbmFsLmNyZWRpdHMgPT09ICdudW1iZXInID8gcGVyc29uYWwuY3JlZGl0cyA6IG51bGwsCgogICAgICBnbG9iYWw6IGdsb2JhbCwKICAgICAgbWljcm86IG1pY3JvLAogICAgICByYXc6IHBlcnNvbmFsLAogICAgfTsKICB9CgogIGZ1bmN0aW9uIGlzQXBpRXJyb3IoZXJyKSB7CiAgICByZXR1cm4gZXJyICYmIChlcnIubmFtZSA9PT0gJ0FwaUVycm9yJyB8fCB0eXBlb2YgZXJyLnN0YXR1cyA9PT0gJ251bWJlcicpOwogIH0KCiAgZnVuY3Rpb24gcmVmcmVzaENyZWRpdHMoKSB7CiAgICBpZiAoIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS5jcmVkaXRzICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgcmV0dXJuIFYuYXBpLmNyZWRpdHMoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgdmFyIG4gPSByZXMgJiYgdHlwZW9mIHJlcy5jcmVkaXRzID09PSAnbnVtYmVyJyA/IHJlcy5jcmVkaXRzIDogbnVsbDsKICAgICAgaWYgKG4gIT0gbnVsbCkgewogICAgICAgIHNldFN0YXRlKCdjcmVkaXRzJywgbik7CgogICAgICAgIHZhciB1ID0gZ2V0U3RhdGUoJ3VzZXInKTsKICAgICAgICBpZiAodSAmJiB0eXBlb2YgdSA9PT0gJ29iamVjdCcpIHUuY3JlZGl0cyA9IG47CiAgICAgICAgZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgbik7CiAgICAgIH0KICAgICAgcmV0dXJuIG47CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CgogICAgICBpZiAoaXNBcGlFcnJvcihlcnIpICYmIChlcnIuc3RhdHVzID09PSA0MDEgfHwgZXJyLnN0YXR1cyA9PT0gNDAzKSkgewogICAgICAgIGFwaTQwMUNsZWFyKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGFwaTQwMUNsZWFyKCkgewogICAgY2xlYXIoKTsKICAgIGVtaXQoJ2Vycm9yJywgeyBtZXNzYWdlOiAnWW91ciBzZXNzaW9uIGV4cGlyZWQuIFBsZWFzZSBzaWduIGluIGFnYWluLicsIGNvZGU6ICdhdXRoJyB9KTsKICB9CgogIGZ1bmN0aW9uIHRva2VuKCkgewogICAgcmV0dXJuIHJlYWRUb2tlbigpOwogIH0KCiAgZnVuY3Rpb24gaXNBdXRoZWQoKSB7CiAgICByZXR1cm4gISFyZWFkVG9rZW4oKTsKICB9CgogIGZ1bmN0aW9uIHNldFRva2VuKHQpIHsKICAgIGlmICghdCkgewogICAgICBjbGVhcigpOwogICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdzZXRUb2tlbiBjYWxsZWQgd2l0aG91dCBhIHRva2VuJykpOwogICAgfQogICAgd3JpdGVUb2tlbih0KTsKCiAgICBpZiAoIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS53aG9hbWkgIT09ICdmdW5jdGlvbicpIHsKCiAgICAgIHZhciBzaGVsbCA9IG5vcm1hbGl6ZVVzZXIoeyB0b2tlbjogdCB9KTsKICAgICAgc2V0U3RhdGUoJ3VzZXInLCBzaGVsbCk7CiAgICAgIGVtaXQoJ2F1dGg6Y2hhbmdlZCcsIHNoZWxsKTsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzaGVsbCk7CiAgICB9CgogICAgcmV0dXJuIFYuYXBpLndob2FtaSgpLnRoZW4oZnVuY3Rpb24gKHBlcnNvbmFsKSB7CiAgICAgIHZhciB1c2VyID0gbm9ybWFsaXplVXNlcihwZXJzb25hbCk7CiAgICAgIHNldFN0YXRlKCd1c2VyJywgdXNlcik7CgogICAgICBpZiAodXNlciAmJiB0eXBlb2YgdXNlci5jcmVkaXRzID09PSAnbnVtYmVyJykgewogICAgICAgIHNldFN0YXRlKCdjcmVkaXRzJywgdXNlci5jcmVkaXRzKTsKICAgICAgICBlbWl0KCdjcmVkaXRzOmNoYW5nZWQnLCB1c2VyLmNyZWRpdHMpOwogICAgICB9CiAgICAgIGVtaXQoJ2F1dGg6Y2hhbmdlZCcsIHVzZXIpOwogICAgICByZXR1cm4gdXNlcjsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKCiAgICAgIGlmIChpc0FwaUVycm9yKGVycikgJiYgKGVyci5zdGF0dXMgPT09IDQwMSB8fCBlcnIuc3RhdHVzID09PSA0MDMpKSB7CiAgICAgICAgY2xlYXIoKTsKICAgICAgfSBlbHNlIHsKCiAgICAgICAgc2V0U3RhdGUoJ3VzZXInLCBudWxsKTsKICAgICAgICBlbWl0KCdhdXRoOmNoYW5nZWQnLCBudWxsKTsKICAgICAgfQogICAgICB0aHJvdyBlcnI7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGNsZWFyKCkgewogICAgd3JpdGVUb2tlbihudWxsKTsKICAgIHNldFN0YXRlKCd1c2VyJywgbnVsbCk7CiAgICBzZXRTdGF0ZSgnY3JlZGl0cycsIG51bGwpOwogICAgZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgbnVsbCk7CiAgICBlbWl0KCdhdXRoOmNoYW5nZWQnLCBudWxsKTsKICB9CgogIGZ1bmN0aW9uIHNpZ25JbihlbWFpbCwgcGFzc3dvcmQpIHsKICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLmxvZ2luICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0FQSSBub3QgcmVhZHknKSk7CiAgICB9CiAgICB2YXIgZW0gPSAoZW1haWwgPT0gbnVsbCA/ICcnIDogU3RyaW5nKGVtYWlsKSkudHJpbSgpOwogICAgdmFyIHB3ID0gcGFzc3dvcmQgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHBhc3N3b3JkKTsKICAgIGlmICghZW0pIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0VtYWlsIGlzIHJlcXVpcmVkJykpOwogICAgaWYgKCFwdykgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUGFzc3dvcmQgaXMgcmVxdWlyZWQnKSk7CgogICAgcmV0dXJuIFYuYXBpLmxvZ2luKGVtLCBwdykudGhlbihmdW5jdGlvbiAocGVyc29uYWwpIHsKICAgICAgdmFyIHQgPSBwZXJzb25hbCAmJiBwZXJzb25hbC50b2tlbjsKICAgICAgaWYgKCF0KSB0aHJvdyBuZXcgRXJyb3IoJ0xvZ2luIHJlc3BvbnNlIGRpZCBub3QgaW5jbHVkZSBhIHRva2VuJyk7CiAgICAgIHJldHVybiBzZXRUb2tlbih0KS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7CgogICAgICAgIHJldHVybiByZWZyZXNoQ3JlZGl0cygpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdXNlcjsgfSk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZWdpc3Rlcihmb3JtKSB7CiAgICBpZiAoIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS5zaWdudXAgIT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignQVBJIG5vdCByZWFkeScpKTsKICAgIH0KICAgIGZvcm0gPSBmb3JtIHx8IHt9OwoKICAgIHZhciBlbWFpbCA9IChmb3JtLmVtYWlsID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLmVtYWlsKSkudHJpbSgpOwogICAgdmFyIHBhc3N3b3JkID0gZm9ybS5wYXNzd29yZCA9PSBudWxsID8gJycgOiBTdHJpbmcoZm9ybS5wYXNzd29yZCk7CiAgICBpZiAoIWVtYWlsKSByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdFbWFpbCBpcyByZXF1aXJlZCcpKTsKICAgIGlmICghcGFzc3dvcmQpIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJykpOwogICAgaWYgKHBhc3N3b3JkLmxlbmd0aCA8IDggfHwgcGFzc3dvcmQubGVuZ3RoID4gMjQpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUGFzc3dvcmQgbXVzdCBiZSA44oCTMjQgY2hhcmFjdGVycycpKTsKICAgIH0KCiAgICB2YXIgZmlyc3ROYW1lID0gKGZvcm0uZmlyc3ROYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLmZpcnN0TmFtZSkpLnRyaW0oKTsKICAgIHZhciBsYXN0TmFtZSA9IChmb3JtLmxhc3ROYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLmxhc3ROYW1lKSkudHJpbSgpOwogICAgdmFyIG5hbWUgPSAoZm9ybS5uYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLm5hbWUpKS50cmltKCk7CgogICAgaWYgKCFuYW1lICYmIChmaXJzdE5hbWUgfHwgbGFzdE5hbWUpKSB7CiAgICAgIG5hbWUgPSBbZmlyc3ROYW1lLCBsYXN0TmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTsKICAgIH0KICAgIGlmIChuYW1lICYmICFmaXJzdE5hbWUpIHsKCiAgICAgIHZhciBiaXRzID0gbmFtZS5zcGxpdCgvXHMrLyk7CiAgICAgIGZpcnN0TmFtZSA9IGJpdHNbMF0gfHwgJyc7CiAgICAgIGlmICghbGFzdE5hbWUgJiYgYml0cy5sZW5ndGggPiAxKSBsYXN0TmFtZSA9IGJpdHMuc2xpY2UoMSkuam9pbignICcpOwogICAgfQoKICAgIHZhciBkYXRhID0gewogICAgICBlbWFpbDogZW1haWwsCiAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCwKICAgICAgbmFtZTogbmFtZSB8fCAoZW1haWwuc3BsaXQoJ0AnKVswXSksCiAgICAgIGZpcnN0TmFtZTogZmlyc3ROYW1lIHx8IChuYW1lID8gbmFtZS5zcGxpdCgvXHMrLylbMF0gOiAnJyksCiAgICAgIGxhc3ROYW1lOiBsYXN0TmFtZSB8fCAnJywKICAgICAgaGFzQWNjZXB0ZWRUZXJtc0FuZENvbmRpdGlvbnM6IHRydWUsCiAgICAgIGhhc0FjY2VwdGVkUHJpdmFjeVBvbGljeTogdHJ1ZSwKICAgICAgaGFyZHdhcmU6IG51bGwsCiAgICB9OwoKICAgIHZhciB1c2VybmFtZSA9IChmb3JtLnVzZXJuYW1lID09IG51bGwgPyAnJyA6IFN0cmluZyhmb3JtLnVzZXJuYW1lKSkudHJpbSgpOwogICAgaWYgKHVzZXJuYW1lKSBkYXRhLnVzZXJuYW1lID0gdXNlcm5hbWU7CgogICAgcmV0dXJuIFYuYXBpLnNpZ251cChkYXRhKS50aGVuKGZ1bmN0aW9uIChwZXJzb25hbCkgewogICAgICB2YXIgdCA9IHBlcnNvbmFsICYmIHBlcnNvbmFsLnRva2VuOwogICAgICBpZiAoIXQpIHRocm93IG5ldyBFcnJvcignU2lnbnVwIHJlc3BvbnNlIGRpZCBub3QgaW5jbHVkZSBhIHRva2VuJyk7CiAgICAgIHJldHVybiBzZXRUb2tlbih0KS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7CiAgICAgICAgcmV0dXJuIHJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB1c2VyOyB9KTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHsKICAgIHZhciB0ID0gcmVhZFRva2VuKCk7CiAgICBpZiAoIXQpIHsKCiAgICAgIHNldFN0YXRlKCd1c2VyJywgbnVsbCk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwogICAgfQoKICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLndob2FtaSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpOwogICAgfQoKICAgIHJldHVybiBWLmFwaS53aG9hbWkoKS50aGVuKGZ1bmN0aW9uIChwZXJzb25hbCkgewogICAgICB2YXIgdXNlciA9IG5vcm1hbGl6ZVVzZXIocGVyc29uYWwpOwogICAgICBzZXRTdGF0ZSgndXNlcicsIHVzZXIpOwogICAgICBlbWl0KCdhdXRoOmNoYW5nZWQnLCB1c2VyKTsKICAgICAgaWYgKHVzZXIgJiYgdHlwZW9mIHVzZXIuY3JlZGl0cyA9PT0gJ251bWJlcicpIHsKICAgICAgICBzZXRTdGF0ZSgnY3JlZGl0cycsIHVzZXIuY3JlZGl0cyk7CiAgICAgICAgZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgdXNlci5jcmVkaXRzKTsKICAgICAgfQoKICAgICAgcmVmcmVzaENyZWRpdHMoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIGlmIChpc0FwaUVycm9yKGVycikgJiYgKGVyci5zdGF0dXMgPT09IDQwMSB8fCBlcnIuc3RhdHVzID09PSA0MDMpKSB7CgogICAgICAgIGNsZWFyKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICBzZXRTdGF0ZSgndXNlcicsIG51bGwpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0pOwogIH0KCiAgVi5hdXRoID0gewogICAgdG9rZW46IHRva2VuLAogICAgc2V0VG9rZW46IHNldFRva2VuLAogICAgY2xlYXI6IGNsZWFyLAogICAgaXNBdXRoZWQ6IGlzQXV0aGVkLAogICAgc2lnbkluOiBzaWduSW4sCiAgICByZWdpc3RlcjogcmVnaXN0ZXIsCiAgICBib290c3RyYXA6IGJvb3RzdHJhcCwKCiAgICByZWZyZXNoQ3JlZGl0czogcmVmcmVzaENyZWRpdHMsCgogICAgbm9ybWFsaXplVXNlcjogbm9ybWFsaXplVXNlciwKICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9kYXRhL2FzcGVjdHMuanMgPT09PT0gKi8KCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLmRhdGEgPSBWLmRhdGEgfHwge307CgogIFYuZGF0YS5hc3BlY3RzID0gWwogICAgeyByYXc6ICdhdXRvJywgICAgICAgICBrZXk6ICdhdXRvJywgICAgICAgICBsYWJlbDogJ0F1dG8nLCAgICAgICAgICAgIHc6IDEwMjQsIGg6IDEwMjQsIGRlZmF1bHQ6IHRydWUgfSwKICAgIHsgcmF3OiAnc3F1YXJlJywgICAgICAga2V5OiAnc3F1YXJlJywgICAgICAgbGFiZWw6ICdTcXVhcmUnLCAgICAgICAgICB3OiAxMDI0LCBoOiAxMDI0IH0sCiAgICB7IHJhdzogJ3BvcnRyYWl0OTE2JywgIGtleTogJ3BvcnRyYWl0OTE2JywgIGxhYmVsOiAnUG9ydHJhaXQgOToxNicsICAgdzogMTAyNCwgaDogMTgyMCB9LAogICAgeyByYXc6ICdsYW5kc2NhcGUxNjknLCBrZXk6ICdsYW5kc2NhcGUxNjknLCBsYWJlbDogJ0xhbmRzY2FwZSAxNjo5JywgIHc6IDE4MjAsIGg6IDEwMjQgfSwKICAgIHsgcmF3OiAncG9ydHJhaXQ0MycsICAga2V5OiAncG9ydHJhaXQ0MycsICAgbGFiZWw6ICdQb3J0cmFpdCAzOjQnLCAgICB3OiAxMDI0LCBoOiAxMzY1IH0sCiAgICB7IHJhdzogJ2xhbmRzY2FwZTQzJywgIGtleTogJ2xhbmRzY2FwZTQzJywgIGxhYmVsOiAnTGFuZHNjYXBlIDQ6MycsICAgdzogMTM2NSwgaDogMTAyNCB9CiAgXTsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvZGF0YS9pbmR1c3RyaWVzLmpzID09PT09ICovCgooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIFYgPSAod2luZG93LlYgPSB3aW5kb3cuViB8fCB7fSk7CiAgVi5kYXRhID0gVi5kYXRhIHx8IHt9OwoKICBWLmRhdGEuaW5kdXN0cnlQcm9tcHRQbGFjZWhvbGRlciA9CiAgICAnRGVzY3JpYmUgdGhlIHRyYW5zZm9ybWF0aW9uIOKAlCBlLmcuIOKAnHN0YWdlIHRoaXMgZW1wdHkgbGl2aW5nIHJvb20gd2l0aCB3YXJtIG1vZGVybiBmdXJuaXR1cmXigJ3igKYnOwoKICBWLmRhdGEuaW5kdXN0cmllcyA9IFsKICAgIHsKICAgICAga2V5OiAnYXJjaGl0ZWN0dXJlJywKICAgICAgbGFiZWw6ICdBcmNoaXRlY3R1cmUnLAogICAgICBwbGFjZWhvbGRlcjoKICAgICAgICAnRGVzY3JpYmUgdGhlIHJlbmRlciDigJQgZS5nLiDigJxwaG90b3JlYWwgZXh0ZXJpb3Igb2YgdGhpcyBjb25jZXB0IGF0IGdvbGRlbiBob3VyLCBjbGVhbiBtb2Rlcm4gbWF0ZXJpYWxz4oCd4oCmJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnaW50ZXJpb3JEZXNpZ24nLAogICAgICBsYWJlbDogJ0ludGVyaW9yIERlc2lnbicsCiAgICAgIHBsYWNlaG9sZGVyOgogICAgICAgICdEZXNjcmliZSB0aGUgcmVzdHlsZSDigJQgZS5nLiDigJxzdGFnZSB0aGlzIHJvb20gd2l0aCB3YXJtIG1pbmltYWxpc3QgZnVybml0dXJlIGFuZCBzb2Z0IGRheWxpZ2h04oCd4oCmJwogICAgfSwKICAgIHsKICAgICAga2V5OiAncmVhbEVzdGF0ZScsCiAgICAgIGxhYmVsOiAnUmVhbCBFc3RhdGUnLAogICAgICBwbGFjZWhvbGRlcjoKICAgICAgICAnRGVzY3JpYmUgdGhlIGxpc3Rpbmcgc2hvdCDigJQgZS5nLiDigJx2aXJ0dWFsbHkgc3RhZ2UgdGhpcyBlbXB0eSByb29tLCBNTFMtcmVhZHksIGJyaWdodCBhbmQgaW52aXRpbmfigJ3igKYnCiAgICB9LAogICAgewogICAgICBrZXk6ICdsYW5kc2NhcGluZycsCiAgICAgIGxhYmVsOiAnTGFuZHNjYXBpbmcnLAogICAgICBwbGFjZWhvbGRlcjoKICAgICAgICAnRGVzY3JpYmUgdGhlIHlhcmQg4oCUIGUuZy4g4oCcdHJhbnNmb3JtIHRoaXMgYmFja3lhcmQgd2l0aCBsdXNoIGxhbmRzY2FwaW5nLCBhIHBhdGlvLCBhbmQgc3RyaW5nIGxpZ2h0c+KAneKApicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2Z1cm5pc2hpbmcnLAogICAgICBsYWJlbDogJ0Z1cm5pc2hpbmcnLAogICAgICBwbGFjZWhvbGRlcjoKICAgICAgICAnRGVzY3JpYmUgdGhlIHNjZW5lIOKAlCBlLmcuIOKAnHBsYWNlIHRoaXMgc29mYSBpbiBhIHN0eWxlZCwgd2VsbC1saXQgbGl2aW5nIHJvb20gZm9yIHRoZSBjYXRhbG9n4oCd4oCmJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnY29uc3RydWN0aW9uJywKICAgICAgbGFiZWw6ICdDb25zdHJ1Y3Rpb24nLAogICAgICBwbGFjZWhvbGRlcjoKICAgICAgICAnRGVzY3JpYmUgdGhlIHJlbm92YXRpb24g4oCUIGUuZy4g4oCcc2hvdyB0aGlzIGtpdGNoZW4gZnVsbHkgcmVtb2RlbGVkIHdpdGggbmV3IGNhYmluZXRzIGFuZCBjb3VudGVyc+KAneKApicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2hvbWVPd25lcicsCiAgICAgIGxhYmVsOiAnSG9tZSBPd25lcicsCiAgICAgIHBsYWNlaG9sZGVyOgogICAgICAgICdEZXNjcmliZSB0aGUgaWRlYSDigJQgZS5nLiDigJxyZXBhaW50IHRoZXNlIHdhbGxzIGEgc29mdCBzYWdlIGdyZWVuIGFuZCBhZGQgbW9kZXJuIGRlY29y4oCd4oCmJwogICAgfQogIF07Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2RhdGEvbW9kZWxzLmpzID09PT09ICovCgooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIFYgPSAod2luZG93LlYgPSB3aW5kb3cuViB8fCB7fSk7CiAgVi5kYXRhID0gVi5kYXRhIHx8IHt9OwoKICBWLmRhdGEubW9kZWxzID0gWwogICAgewogICAgICByYXc6ICdmbHV4S2xlaW4nLAogICAgICBsYWJlbDogJ1N0YW5kYXJkJywKICAgICAgc3ViaGVhZGluZzogJ0Zhc3QgJiBiYWxhbmNlZCcsCiAgICAgIGNvc3Q6IDEwLAogICAgICBtYXhSZWY6IDEsCiAgICAgIGRlZmF1bHQ6IHRydWUKICAgIH0sCiAgICB7CiAgICAgIHJhdzogJ2ZsdXgxS29udGV4dCcsCiAgICAgIGxhYmVsOiAnTGVnYWN5JywKICAgICAgc3ViaGVhZGluZzogJ1RoZSBvcmlnaW5hbCBlbmdpbmUnLAogICAgICBjb3N0OiAxMCwKICAgICAgbWF4UmVmOiAxCiAgICB9LAogICAgewogICAgICByYXc6ICduYW5vQmFuYW5hJywKICAgICAgbGFiZWw6ICdQcm8nLAogICAgICBzdWJoZWFkaW5nOiAnU21hcnRlciBlZGl0cywgdXAgdG8gNiByZWZlcmVuY2VzJywKICAgICAgY29zdDogMTAsCiAgICAgIG1heFJlZjogNgogICAgfSwKICAgIHsKICAgICAgcmF3OiAnbmFub0JhbmFuYTInLAogICAgICBsYWJlbDogJ1BsdXMnLAogICAgICBzdWJoZWFkaW5nOiAnSGlnaGVyIGZpZGVsaXR5LCByaWNoZXIgZGV0YWlsJywKICAgICAgY29zdDogMTUsCiAgICAgIG1heFJlZjogNgogICAgfSwKICAgIHsKICAgICAgcmF3OiAnbmFub0JhbmFuYVBybycsCiAgICAgIGxhYmVsOiAnTWF4JywKICAgICAgc3ViaGVhZGluZzogJ0Jlc3QgcXVhbGl0eSwgdXAgdG8gMTUgcmVmZXJlbmNlcycsCiAgICAgIGNvc3Q6IDIwLAogICAgICBtYXhSZWY6IDE1CiAgICB9CiAgXTsKCiAgVi5kYXRhLnQyaU1vZGVsID0geyByYXc6ICdmbHV4MVNjaG5lbGwnLCBjb3N0OiAxIH07Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2RhdGEvc3dpenpsZXMuanMgPT09PT0gKi8KCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLmRhdGEgPSBWLmRhdGEgfHwge307CgogIFYuZGF0YS5zd2l6emxlcyA9IFsKICAgIHsKICAgICAga2V5OiAncmVtb3ZlQWxsRnVybml0dXJlJywKICAgICAgbGFiZWw6ICdFbXB0eSBSb29tJywKICAgICAgcHJvbXB0OiAnUmVtb3ZlIGFsbCBmdXJuaXR1cmUsIHBlcnNvbmFsIGl0ZW1zLCBjbHV0dGVyLCBhbmQgYmVsb25naW5ncyBmcm9tIHRoZSByb29tIHdoaWxlIGtlZXBpbmcgdGhlIGFyY2hpdGVjdHVyYWwgZmVhdHVyZXMsIHdhbGxzLCB3aW5kb3dzLCBhbmQgZmxvb3JpbmcgZXhhY3RseSB0aGUgc2FtZS4gQ3JlYXRlIGEgY29tcGxldGVseSBlbXB0eSwgY2xlYW4gc3BhY2UgcmVhZHkgZm9yIHByb2Zlc3Npb25hbCBzdGFnaW5nLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3JlbW92ZUNsdXR0ZXInLAogICAgICBsYWJlbDogJ0RlY2x1dHRlcicsCiAgICAgIHByb21wdDogJ1JlbW92ZSBhbGwgY2x1dHRlciwgcGVyc29uYWwgaXRlbXMsIGV4Y2Vzc2l2ZSBkZWNvcmF0aW9ucywgYW5kIHVubmVjZXNzYXJ5IG9iamVjdHMgd2hpbGUga2VlcGluZyB0aGUgbWFpbiBmdXJuaXR1cmUgcGllY2VzIGluIHRoZWlyIGN1cnJlbnQgcG9zaXRpb25zLiBNYWludGFpbiB0aGUgZXhpc3RpbmcgZnVybml0dXJlIGxheW91dCBidXQgY3JlYXRlIGEgY2xlYW4sIG9yZ2FuaXplZCBhcHBlYXJhbmNlLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3JlbW92ZUZ1cm5pdHVyZUFuZENsdXR0ZXInLAogICAgICBsYWJlbDogJ0VtcHR5ICYgQ2xlYW4nLAogICAgICBwcm9tcHQ6ICdSZW1vdmUgYWxsIGZ1cm5pdHVyZSwgcGVyc29uYWwgaXRlbXMsIGNsdXR0ZXIsIGRlY29yYXRpb25zLCBhbmQgYmVsb25naW5ncyBmcm9tIHRoZSByb29tIHdoaWxlIGtlZXBpbmcgdGhlIGFyY2hpdGVjdHVyYWwgZmVhdHVyZXMsIHdhbGxzLCB3aW5kb3dzLCBhbmQgZmxvb3JpbmcgZXhhY3RseSB0aGUgc2FtZS4gQ3JlYXRlIGEgY29tcGxldGVseSBlbXB0eSwgc3BvdGxlc3Mgc3BhY2UgcmVhZHkgZm9yIG5ldyBzdGFnaW5nLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3JlbW92ZVBlb3BsZScsCiAgICAgIGxhYmVsOiAnUmVtb3ZlIFBlb3BsZScsCiAgICAgIHByb21wdDogJ1JlbW92ZSBhbGwgcGVvcGxlLCBwZXJzb25zLCBhbmQgaHVtYW4gZmlndXJlcyBmcm9tIHRoZSBpbWFnZSB3aGlsZSBrZWVwaW5nIGFsbCBmdXJuaXR1cmUsIGRlY29yLCBhbmQgcm9vbSBlbGVtZW50cyBleGFjdGx5IHRoZSBzYW1lLiBNYWludGFpbiB0aGUgZXhhY3QgbGlnaHRpbmcgYW5kIGNvbXBvc2l0aW9uLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3JlbW92ZVJlZmxlY3Rpb25zJywKICAgICAgbGFiZWw6ICdSZW1vdmUgUmVmbGVjdGlvbnMnLAogICAgICBwcm9tcHQ6ICdSZW1vdmUgYWxsIHJlZmxlY3Rpb25zLCBtaXJyb3IgaW1hZ2VzLCBhbmQgdW53YW50ZWQgcmVmbGVjdGl2ZSBlbGVtZW50cyBmcm9tIHdpbmRvd3MsIG1pcnJvcnMsIGFuZCBnbG9zc3kgc3VyZmFjZXMgd2hpbGUga2VlcGluZyBhbGwgZnVybml0dXJlIGFuZCByb29tIGVsZW1lbnRzIGV4YWN0bHkgdGhlIHNhbWUuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnaW1wcm92ZUxpZ2h0aW5nJywKICAgICAgbGFiZWw6ICdCZXR0ZXIgTGlnaHQnLAogICAgICBwcm9tcHQ6ICdJbXByb3ZlIHRoZSBsaWdodGluZyB0byBiZSBicmlnaHQsIHdhcm0sIGFuZCB3ZWxjb21pbmcuIEFkZCBuYXR1cmFsIGxpZ2h0IGFwcGVhcmFuY2UsIHJlbW92ZSBoYXJzaCBzaGFkb3dzLCBhbmQgY3JlYXRlIGV2ZW4gaWxsdW1pbmF0aW9uIHRocm91Z2hvdXQgdGhlIHNwYWNlIHdoaWxlIGtlZXBpbmcgYWxsIG9iamVjdHMgYW5kIGZ1cm5pdHVyZSBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2ltcHJvdmVXZWF0aGVyJywKICAgICAgbGFiZWw6ICdCZXR0ZXIgV2VhdGhlcicsCiAgICAgIHByb21wdDogJ0NoYW5nZSB0aGUgd2VhdGhlciBjb25kaXRpb25zIHRvIGJyaWdodCwgc3VubnksIGFuZCBjbGVhciBza2llcy4gUmVtb3ZlIHJhaW4sIGNsb3Vkcywgc25vdywgb3Igb3ZlcmNhc3QgY29uZGl0aW9ucyB3aGlsZSBrZWVwaW5nIGFsbCBhcmNoaXRlY3R1cmUsIGxhbmRzY2FwaW5nLCBhbmQgcHJvcGVydHkgZWxlbWVudHMgZXhhY3RseSB0aGUgc2FtZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdjbGVhbkxhbmRzY2FwaW5nJywKICAgICAgbGFiZWw6ICdDbGVhbiBMYW5kc2NhcGUnLAogICAgICBwcm9tcHQ6ICdDbGVhbiB1cCBvdmVyZ3Jvd24gdmVnZXRhdGlvbiwgcmVtb3ZlIHdlZWRzLCB0cmltIGJ1c2hlcyBhbmQgdHJlZXMsIGNsZWFyIGRlYWQgcGxhbnRzLCBhbmQgb3JnYW5pemUgdGhlIGxhbmRzY2FwaW5nIHdoaWxlIGtlZXBpbmcgdGhlIHByb3BlcnR5IGFyY2hpdGVjdHVyZSBhbmQgaGFyZHNjYXBpbmcgZXhhY3RseSB0aGUgc2FtZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdhZGRMYW5kc2NhcGluZycsCiAgICAgIGxhYmVsOiAnQWRkIExhbmRzY2FwaW5nJywKICAgICAgcHJvbXB0OiAnQWRkIHByb2Zlc3Npb25hbCBsYW5kc2NhcGluZyBpbmNsdWRpbmcgd2VsbC1tYWludGFpbmVkIGdyYXNzLCB0cmltbWVkIGJ1c2hlcywgY29sb3JmdWwgZmxvd2VycywgbWF0dXJlIHRyZWVzLCBhbmQgYXR0cmFjdGl2ZSBnYXJkZW4gYmVkcyB3aGlsZSBrZWVwaW5nIGFsbCBhcmNoaXRlY3R1cmUgYW5kIHByb3BlcnR5IHN0cnVjdHVyZXMgZXhhY3RseSB0aGUgc2FtZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdhZGRDdXJiQXBwZWFsJywKICAgICAgbGFiZWw6ICdDdXJiIEFwcGVhbCcsCiAgICAgIHByb21wdDogIkVuaGFuY2UgdGhlIGZyb250IGVudHJhbmNlIGFuZCBjdXJiIGFwcGVhbCB3aXRoIGF0dHJhY3RpdmUgbGFuZHNjYXBpbmcsIGNsZWFuIHdhbGt3YXlzLCB1cGRhdGVkIGV4dGVyaW9yIGxpZ2h0aW5nLCBmcmVzaCBwYWludCBvbiBkb29ycywgYW5kIHdlbGNvbWluZyBlbnRyeXdheSBlbGVtZW50cyB3aGlsZSBtYWludGFpbmluZyB0aGUgcHJvcGVydHkncyBhcmNoaXRlY3R1cmFsIHN0eWxlLiIKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2ltcHJvdmVFeHRlcmlvcicsCiAgICAgIGxhYmVsOiAnRml4IEV4dGVyaW9yJywKICAgICAgcHJvbXB0OiAnUmVwYWlyIGFuZCBpbXByb3ZlIHRoZSBleHRlcmlvciBjb25kaXRpb24gaW5jbHVkaW5nIGZyZXNoIHBhaW50LCBjbGVhbiBzaWRpbmcsIHVwZGF0ZWQgdHJpbSwgcmVwYWlyZWQgcm9vZmluZywgYW5kIHdlbGwtbWFpbnRhaW5lZCBleHRlcmlvciBzdXJmYWNlcyB3aGlsZSBrZWVwaW5nIHRoZSBhcmNoaXRlY3R1cmFsIGRlc2lnbiBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ21vZGVybml6ZUV4dGVyaW9yJywKICAgICAgbGFiZWw6ICdNb2Rlcm4gRXh0ZXJpb3InLAogICAgICBwcm9tcHQ6ICJVcGRhdGUgdGhlIGV4dGVyaW9yIHdpdGggY29udGVtcG9yYXJ5IG1hdGVyaWFscywgbW9kZXJuIGNvbG9yIHNjaGVtZXMsIHVwZGF0ZWQgbGlnaHRpbmcgZml4dHVyZXMsIGNvbnRlbXBvcmFyeSBoYXJkd2FyZSwgYW5kIGN1cnJlbnQgZGVzaWduIGVsZW1lbnRzIHdoaWxlIG1haW50YWluaW5nIHRoZSBwcm9wZXJ0eSdzIHN0cnVjdHVyYWwgbGF5b3V0LiIKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2FkZE91dGRvb3JMaXZpbmcnLAogICAgICBsYWJlbDogJ091dGRvb3IgTGl2aW5nJywKICAgICAgcHJvbXB0OiAiQWRkIG91dGRvb3IgbGl2aW5nIHNwYWNlcyBpbmNsdWRpbmcgcGF0aW9zLCBkZWNrcywgb3V0ZG9vciBmdXJuaXR1cmUsIGZpcmUgcGl0cywgb3V0ZG9vciBraXRjaGVucywgb3Igc2VhdGluZyBhcmVhcyB0aGF0IHNob3djYXNlIHRoZSBwcm9wZXJ0eSdzIHBvdGVudGlhbCBmb3IgZW50ZXJ0YWlubWVudCBhbmQgcmVsYXhhdGlvbi4iCiAgICB9LAogICAgewogICAgICBrZXk6ICdpbXByb3ZlRW50cnl3YXknLAogICAgICBsYWJlbDogJ0JldHRlciBFbnRyYW5jZScsCiAgICAgIHByb21wdDogJ0VuaGFuY2UgdGhlIGZyb250IGVudHJhbmNlIHdpdGggYW4gYXR0cmFjdGl2ZSBkb29yLCB1cGRhdGVkIGhhcmR3YXJlLCB3ZWxjb21pbmcgbGlnaHRpbmcsIGNsZWFuIHN0ZXBzLCBwb3R0ZWQgcGxhbnRzLCBhbmQgYW4gaW52aXRpbmcgZW50cnl3YXkgdGhhdCBjcmVhdGVzIGFuIGV4Y2VsbGVudCBmaXJzdCBpbXByZXNzaW9uLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2NoYW5nZVNlYXNvbicsCiAgICAgIGxhYmVsOiAnQ2hhbmdlIFNlYXNvbicsCiAgICAgIHByb21wdDogJ0NoYW5nZSB0aGUgc2Vhc29uYWwgYXBwZWFyYW5jZSB0byBzaG93IHRoZSBwcm9wZXJ0eSBpbiBpZGVhbCBjb25kaXRpb25zIHdpdGggbHVzaCBncmVlbiBsYW5kc2NhcGluZywgYmxvb21pbmcgZmxvd2VycywgYW5kIGF0dHJhY3RpdmUgc2Vhc29uYWwgZWxlbWVudHMgd2hpbGUga2VlcGluZyBhbGwgc3RydWN0dXJlcyBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2ltcHJvdmVTa2llcycsCiAgICAgIGxhYmVsOiAnQmV0dGVyIFNraWVzJywKICAgICAgcHJvbXB0OiAnUmVwbGFjZSB0aGUgc2t5IHdpdGggYmVhdXRpZnVsIGJsdWUgc2tpZXMsIHB1ZmZ5IHdoaXRlIGNsb3VkcywgYW5kIGlkZWFsIGxpZ2h0aW5nIGNvbmRpdGlvbnMgdGhhdCBtYWtlIHRoZSBwcm9wZXJ0eSBsb29rIG1vcmUgYXR0cmFjdGl2ZSB3aGlsZSBrZWVwaW5nIGFsbCBncm91bmQtbGV2ZWwgZWxlbWVudHMgZXhhY3RseSB0aGUgc2FtZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdkZXBlcnNvbmFsaXplJywKICAgICAgbGFiZWw6ICdEZXBlcnNvbmFsaXplJywKICAgICAgcHJvbXB0OiAnUmVtb3ZlIGFsbCBwZXJzb25hbCBwaG90b2dyYXBocywgZmFtaWx5IHBpY3R1cmVzLCBwZXJzb25hbCBjb2xsZWN0aWJsZXMsIGFuZCBpbmRpdmlkdWFsIGl0ZW1zIHdoaWxlIGtlZXBpbmcgZnVybml0dXJlIGFuZCBnZW5lcmFsIGRlY29yLiBDcmVhdGUgYSBuZXV0cmFsIHNwYWNlIGJ1eWVycyBjYW4gZW52aXNpb24gYXMgdGhlaXIgb3duLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ21vZGVybml6ZScsCiAgICAgIGxhYmVsOiAnTW9kZXJuaXplJywKICAgICAgcHJvbXB0OiAiVXBkYXRlIGFuZCBtb2Rlcm5pemUgdGhlIHNwYWNlIHdpdGggY29udGVtcG9yYXJ5IGZpbmlzaGVzLCBjdXJyZW50IGNvbG9yIHBhbGV0dGVzLCBhbmQgbW9kZXJuIGRlc2lnbiBlbGVtZW50cyB3aGlsZSBtYWludGFpbmluZyB0aGUgcm9vbSdzIGFyY2hpdGVjdHVyYWwgc3RydWN0dXJlIGFuZCBsYXlvdXQuIgogICAgfSwKICAgIHsKICAgICAga2V5OiAnZml4V2FsbHMnLAogICAgICBsYWJlbDogJ0ZpeCBXYWxscycsCiAgICAgIHByb21wdDogJ1JlcGFpciBhbGwgdmlzaWJsZSB3YWxsIGRhbWFnZSBpbmNsdWRpbmcgY3JhY2tzLCBob2xlcywgc2N1ZmYgbWFya3MsIGFuZCBpbXBlcmZlY3Rpb25zLiBNYWtlIHdhbGxzIGxvb2sgZnJlc2hseSBwYWludGVkIGFuZCBwcmlzdGluZSB3aGlsZSBrZWVwaW5nIGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgcm9vbSBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ25ldXRyYWxQYWludCcsCiAgICAgIGxhYmVsOiAnTmV1dHJhbCBQYWludCcsCiAgICAgIHByb21wdDogJ0NoYW5nZSB3YWxsIHBhaW50IHRvIG5ldXRyYWwgY29sb3JzIGxpa2Ugd2FybSB3aGl0ZSwgbGlnaHQgZ3JleSwgb3Igc29mdCBiZWlnZS4gTWFpbnRhaW4gYWxsIGZ1cm5pdHVyZSwgZGVjb3IsIGFuZCByb29tIGxheW91dCBleGFjdGx5IGFzIHRoZXkgYXJlIHdoaWxlIG9ubHkgdXBkYXRpbmcgdGhlIHdhbGwgY29sb3IuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnYWRkUGxhbnRzJywKICAgICAgbGFiZWw6ICdBZGQgUGxhbnRzJywKICAgICAgcHJvbXB0OiAnQWRkIHRhc3RlZnVsIHBsYW50cyBhbmQgZ3JlZW5lcnkgaW5jbHVkaW5nIHBvdHRlZCBwbGFudHMsIHNtYWxsIHRyZWVzLCBvciBmcmVzaCBmbG93ZXJzIHRvIGJyaW5nIGxpZmUgYW5kIHdhcm10aCB0byB0aGUgc3BhY2Ugd2hpbGUga2VlcGluZyBhbGwgZXhpc3RpbmcgZnVybml0dXJlIGFuZCBkZWNvciBleGFjdGx5IHRoZSBzYW1lLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ2FkZFBvb2xBcmVhJywKICAgICAgbGFiZWw6ICdQb29sIEFyZWEnLAogICAgICBwcm9tcHQ6ICdBZGQgb3IgZW5oYW5jZSBwb29sIGFuZCBiYWNreWFyZCBhcmVhcyB3aXRoIHBvb2wgZnVybml0dXJlLCB1bWJyZWxsYXMsIGxvdW5nZSBjaGFpcnMsIG91dGRvb3IgZGluaW5nIHNldHMsIGFuZCBhdHRyYWN0aXZlIHBvb2xzaWRlIGxhbmRzY2FwaW5nIHRvIHNob3djYXNlIG91dGRvb3IgZW50ZXJ0YWlubWVudCBwb3RlbnRpYWwuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnbW9kZXJuU3RhZ2luZycsCiAgICAgIGxhYmVsOiAnTW9kZXJuIFN0YWdpbmcnLAogICAgICBwcm9tcHQ6ICdBZGQgbW9kZXJuIHN0YWdpbmcgZnVybml0dXJlIHdpdGggY2xlYW4gbGluZXMsIG5ldXRyYWwgY29sb3JzIGxpa2Ugd2hpdGUsIGdyZXksIGFuZCBiZWlnZSwgbWluaW1hbCBkZWNvciwgYW5kIGNvbnRlbXBvcmFyeSBwaWVjZXMuIENyZWF0ZSBhIHNsZWVrLCB1bmNsdXR0ZXJlZCBzcGFjZSB0aGF0IHNob3djYXNlcyBhcmNoaXRlY3R1cmFsIGZlYXR1cmVzLicKICAgIH0sCiAgICB7CiAgICAgIGtleTogJ3RyYW5zaXRpb25hbFN0YWdpbmcnLAogICAgICBsYWJlbDogJ1RyYW5zaXRpb25hbCcsCiAgICAgIHByb21wdDogJ0FkZCB0cmFuc2l0aW9uYWwgc3RhZ2luZyBmdXJuaXR1cmUgdGhhdCBibGVuZHMgdHJhZGl0aW9uYWwgYW5kIGNvbnRlbXBvcmFyeSBlbGVtZW50cy4gVXNlIHdhcm0sIGVhcnRoeSB0b25lcyB3aXRoIHVwaG9sc3RlcmVkIGZ1cm5pdHVyZSwgY2xlYW4gbGluZXMsIGFuZCB2aW50YWdlIGFjY2VudHMgbGlrZSBvcm5hdGUgbWlycm9ycyBvciB3b29kZW4gY29mZmVlIHRhYmxlcy4nCiAgICB9LAogICAgewogICAgICBrZXk6ICdtaW5pbWFsaXN0U3RhZ2luZycsCiAgICAgIGxhYmVsOiAnTWluaW1hbGlzdCcsCiAgICAgIHByb21wdDogJ0FkZCBtaW5pbWFsaXN0IHN0YWdpbmcgZnVybml0dXJlIGVtcGhhc2l6aW5nIHNpbXBsaWNpdHkgYW5kIGZ1bmN0aW9uYWxpdHkuIFVzZSBjbGVhbiBsaW5lcywgbmV1dHJhbCB0b25lcywgYW5kIGZ1cm5pdHVyZSB0aGF0IHNlcnZlcyBtdWx0aXBsZSBwdXJwb3NlcyB3aXRob3V0IG92ZXJ3aGVsbWluZyB0aGUgc3BhY2UuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnd2FybU1pbmltYWxpc3RTdGFnaW5nJywKICAgICAgbGFiZWw6ICdXYXJtIE1pbmltYWxpc3QnLAogICAgICBwcm9tcHQ6ICdBZGQgd2FybSBtaW5pbWFsaXN0IHN0YWdpbmcgZnVybml0dXJlIGJhbGFuY2luZyB1bmNsdXR0ZXJlZCBzcGFjZXMgd2l0aCB3YXJtIHRvbmVzIGxpa2UgdGVycmFjb3R0YSwgYnJvd25zLCBhbmQgYmVpZ2VzLCBwbHVzIHNvZnQgdGV4dHVyZXMgbGlrZSBwbHVzaCB0aHJvd3MgYW5kIHBpbGxvd3MgZm9yIGEgY296eSwgd2VsY29taW5nIGZlZWwuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnbWlkQ2VudHVyeU1vZGVyblN0YWdpbmcnLAogICAgICBsYWJlbDogJ01pZC1DZW50dXJ5JywKICAgICAgcHJvbXB0OiAnQWRkIG1pZC1jZW50dXJ5IG1vZGVybiBzdGFnaW5nIGZ1cm5pdHVyZSB3aXRoIGljb25pYyBwaWVjZXMgZnJvbSB0aGUgMTk1MHMtNjBzIGluY2x1ZGluZyB3YWxudXQgd29vZCBmaW5pc2hlcywgdGFwZXJlZCBsZWdzLCBnZW9tZXRyaWMgcGF0dGVybnMsIHZpbnRhZ2UgYnJhc3MgZml4dHVyZXMsIGFuZCByaWNoIGpld2VsIHRvbmVzIGxpa2UgbXVzdGFyZCB5ZWxsb3cgYW5kIHRlYWwuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnYXJ0RGVjb1N0YWdpbmcnLAogICAgICBsYWJlbDogJ0FydCBEZWNvJywKICAgICAgcHJvbXB0OiAnQWRkIEFydCBEZWNvIHN0YWdpbmcgZnVybml0dXJlIHdpdGggYm9sZCBnZW9tZXRyaWMgcGF0dGVybnMsIG1ldGFsbGljIGFjY2VudHMgaW4gZ29sZCBhbmQgYnJhc3MsIHJpY2ggY29sb3JzIGxpa2UgZW1lcmFsZCBhbmQgbmF2eSwgbHV4dXJpb3VzIG1hdGVyaWFscyBsaWtlIHZlbHZldCBhbmQgbWFyYmxlLCBhbmQgZHJhbWF0aWMgbGlnaHRpbmcgZml4dHVyZXMuJwogICAgfSwKICAgIHsKICAgICAga2V5OiAnYmlvcGhpbGljU3RhZ2luZycsCiAgICAgIGxhYmVsOiAnQmlvcGhpbGljJywKICAgICAgcHJvbXB0OiAnQWRkIGJpb3BoaWxpYyBzdGFnaW5nIGZ1cm5pdHVyZSBlbXBoYXNpemluZyBuYXR1cmFsIG1hdGVyaWFscyBsaWtlIHdvb2QgYW5kIHN0b25lLCBhYnVuZGFudCBncmVlbmVyeSBhbmQgcGxhbnRzLCBuYXR1cmFsIGxpZ2h0aW5nLCBlYXJ0aCB0b25lcywgYW5kIHN1c3RhaW5hYmxlIG1hdGVyaWFscyB0aGF0IGJyaW5nIHRoZSBvdXRkb29ycyBpbnNpZGUgZm9yIHdlbGxuZXNzIGFuZCBjb25uZWN0aW9uIHRvIG5hdHVyZS4nCiAgICB9LAogICAgewogICAgICBrZXk6ICd2aW50YWdlRXh0ZXJpb3InLAogICAgICBsYWJlbDogJ1ZpbnRhZ2UgRXh0ZXJpb3InLAogICAgICBwcm9tcHQ6ICJVcGRhdGUgdGhlIGV4dGVyaW9yIHRvIHNob3djYXNlIHBlcmlvZC1hcHByb3ByaWF0ZSB2aW50YWdlIGNoYXJtIHdpdGggaGlzdG9yaWNhbGx5IGFjY3VyYXRlIGNvbG9ycywgY2xhc3NpYyBhcmNoaXRlY3R1cmFsIGRldGFpbHMsIHRyYWRpdGlvbmFsIG1hdGVyaWFscywgYW5kIHRpbWVsZXNzIGRlc2lnbiBlbGVtZW50cyB0aGF0IGhpZ2hsaWdodCB0aGUgcHJvcGVydHkncyBjaGFyYWN0ZXIuIgogICAgfSwKICAgIHsKICAgICAga2V5OiAnbHV4dXJ5U3RhZ2luZycsCiAgICAgIGxhYmVsOiAnTHV4dXJ5IFN0YWdpbmcnLAogICAgICBwcm9tcHQ6ICJBZGQgbHV4dXJ5IHN0YWdpbmcgZnVybml0dXJlIHdpdGggaGlnaC1lbmQgbWF0ZXJpYWxzLCBkZXNpZ25lciBwaWVjZXMsIHNvcGhpc3RpY2F0ZWQgY29sb3IgcGFsZXR0ZXMsIHByZW1pdW0gdGV4dGlsZXMsIGVsZWdhbnQgbGlnaHRpbmcsIGFuZCB1cHNjYWxlIGFjY2Vzc29yaWVzIHRoYXQgYXBwZWFsIHRvIGx1eHVyeSBidXllcnMgYW5kIHNob3djYXNlIHRoZSBwcm9wZXJ0eSdzIHByZW1pdW0gcG90ZW50aWFsLiIKICAgIH0KICBdOwp9KSgpOwoKCi8qID09PT09IHNyYy9qcy91aS9jb21wb25lbnRzLmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLnVpID0gVi51aSB8fCB7fTsKICB2YXIgdWkgPSBWLnVpOwoKICBmdW5jdGlvbiBlbCh0YWcsIGF0dHJzLCBjaGlsZHJlbikgewogICAgaWYgKHR5cGVvZiB1aS5lbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiB1aS5lbC5hcHBseSh1aSwgYXJncyk7CiAgICB9CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIGlmIChhdHRycykgewogICAgICBmb3IgKHZhciBrIGluIGF0dHJzKSB7CiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cnMsIGspKSBjb250aW51ZTsKICAgICAgICB2YXIgdmFsID0gYXR0cnNba107CiAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gZmFsc2UpIGNvbnRpbnVlOwogICAgICAgIGlmIChrID09PSAnY2xhc3MnIHx8IGsgPT09ICdjbGFzc05hbWUnKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAndGV4dCcpIG5vZGUudGV4dENvbnRlbnQgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ2h0bWwnKSBub2RlLmlubmVySFRNTCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAnc3R5bGUnICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICBmb3IgKHZhciBzIGluIHZhbCkgbm9kZS5zdHlsZS5zZXRQcm9wZXJ0eShzLCB2YWxbc10pOwogICAgICAgIH0gZWxzZSBpZiAoay5pbmRleE9mKCdvbicpID09PSAwICYmIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHZhbCk7CiAgICAgICAgfSBlbHNlIGlmIChrID09PSAnZGF0YXNldCcgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgIGZvciAodmFyIGQgaW4gdmFsKSBub2RlLmRhdGFzZXRbZF0gPSB2YWxbZF07CiAgICAgICAgfSBlbHNlIGlmICh2YWwgPT09IHRydWUpIG5vZGUuc2V0QXR0cmlidXRlKGssICcnKTsKICAgICAgICBlbHNlIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICAgIH0KICAgIH0KICAgIHZhciBraWRzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgIGFwcGVuZEtpZHMobm9kZSwga2lkcyk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIGFwcGVuZEtpZHMobm9kZSwga2lkcykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBraWRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjID0ga2lkc1tpXTsKICAgICAgaWYgKGMgPT0gbnVsbCB8fCBjID09PSBmYWxzZSB8fCBjID09PSB0cnVlKSBjb250aW51ZTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIGFwcGVuZEtpZHMobm9kZSwgYyk7CiAgICAgIGVsc2UgaWYgKHR5cGVvZiBjID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYyA9PT0gJ251bWJlcicpCiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICAgICAgZWxzZSBpZiAoYyAmJiBjLm5vZGVUeXBlKSBub2RlLmFwcGVuZENoaWxkKGMpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaWNvbihuYW1lKSB7CiAgICBpZiAodHlwZW9mIHVpLmljb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIGdvdCA9IHVpLmljb24obmFtZSk7CiAgICAgIGlmIChnb3QgJiYgZ290Lm5vZGVUeXBlKSByZXR1cm4gZ290OwogICAgICBpZiAodHlwZW9mIGdvdCA9PT0gJ3N0cmluZycpIHsKICAgICAgICB2YXIgd3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICB3cmFwLmNsYXNzTmFtZSA9ICd2LWljbyc7CiAgICAgICAgd3JhcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICB3cmFwLmlubmVySFRNTCA9IGdvdDsKICAgICAgICByZXR1cm4gd3JhcC5maXJzdEVsZW1lbnRDaGlsZCB8fCB3cmFwOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsbGJhY2tJY29uKG5hbWUpOwogIH0KCiAgdmFyIEZBTExCQUNLX0lDT05TID0gewogICAgY2xvc2U6ICc8cGF0aCBkPSJNNiA2bDEyIDEyTTE4IDZMNiAxOCIvPicsCiAgICBjaGVjazogJzxwYXRoIGQ9Ik01IDEzbDQgNEwxOSA3Ii8+JywKICAgIGFsZXJ0OgogICAgICAnPHBhdGggZD0iTTEyIDl2NG0wIDRoLjAxTTEwLjMgMy44NmwtOCAxNEEyIDIgMCAwIDAgNCAyMWgxNmEyIDIgMCAwIDAgMS43LTNsLTgtMTRhMiAyIDAgMCAwLTMuNCAwWiIvPicsCiAgICBpbmZvOiAnPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iOSIvPjxwYXRoIGQ9Ik0xMiAxMXY1bTAtOGguMDEiLz4nLAogICAgc3Bhcms6ICc8cGF0aCBkPSJNMTIgM2wxLjggNS4yTDE5IDEwbC01LjIgMS44TDEyIDE3bC0xLjgtNS4yTDUgMTBsNS4yLTEuOEwxMiAzWiIvPicsCiAgICBpbWFnZToKICAgICAgJzxyZWN0IHg9IjMiIHk9IjMiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjMiLz48Y2lyY2xlIGN4PSI4LjUiIGN5PSI4LjUiIHI9IjEuNiIvPjxwYXRoIGQ9Ik0yMSAxNWwtNS01TDUgMjEiLz4nLAogICAgaGVhcnQ6CiAgICAgICc8cGF0aCBkPSJNMTIgMjBzLTctNC42LTkuMy05LjFDMS40IDguMyAyLjQgNS4zIDUgNC40YzEuOS0uNyAzLjkuMSA1IDEuOCAxLjEtMS43IDMuMS0yLjUgNS0xLjggMi42LjkgMy42IDMuOSAyLjMgNi41QzE5IDE1LjQgMTIgMjAgMTIgMjBaIi8+JwogIH07CgogIGZ1bmN0aW9uIGZhbGxiYWNrSWNvbihuYW1lKSB7CiAgICB2YXIgcGF0aCA9IEZBTExCQUNLX0lDT05TW25hbWVdIHx8IEZBTExCQUNLX0lDT05TLmluZm87CiAgICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCAnMCAwIDI0IDI0Jyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdjbGFzcycsICd2LWljbycpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnY3VycmVudENvbG9yJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMS44Jyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWNhcCcsICdyb3VuZCcpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWxpbmVqb2luJywgJ3JvdW5kJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICBzdmcuaW5uZXJIVE1MID0gcGF0aDsKICAgIHJldHVybiBzdmc7CiAgfQoKICBmdW5jdGlvbiBjbGFtcChuLCBsbywgaGkpIHsKICAgIGlmIChWLnV0aWwgJiYgdHlwZW9mIFYudXRpbC5jbGFtcCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudXRpbC5jbGFtcChuLCBsbywgaGkpOwogICAgcmV0dXJuIE1hdGgubWluKGhpLCBNYXRoLm1heChsbywgbikpOwogIH0KCiAgZnVuY3Rpb24gZXNjYXBlSHRtbChzKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwuZXNjYXBlSHRtbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudXRpbC5lc2NhcGVIdG1sKHMpOwogICAgdmFyIGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGQudGV4dENvbnRlbnQgPSBzID09IG51bGwgPyAnJyA6IFN0cmluZyhzKTsKICAgIHJldHVybiBkLmlubmVySFRNTDsKICB9CgogIGZ1bmN0aW9uIHByZWZlcnNSZWR1Y2VkTW90aW9uKCkgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScpLm1hdGNoZXM7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGVuc3VyZUhvc3QoaWQsIGNsYXNzTmFtZSkgewogICAgdmFyIGhvc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7CiAgICBpZiAoIWhvc3QpIHsKICAgICAgaG9zdCA9IGVsKCdkaXYnLCB7IGlkOiBpZCwgY2xhc3M6IGNsYXNzTmFtZSB9KTsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChob3N0KTsKICAgIH0KICAgIHJldHVybiBob3N0OwogIH0KCiAgdmFyIFRPQVNUX0hPU1RfSUQgPSAndi10b2FzdC1ob3N0JzsKICB2YXIgVE9BU1RfTElGRVRJTUVTID0geyBlcnJvcjogNTIwMCwgc3VjY2VzczogMzIwMCwgaW5mbzogMzAwMCwgd2FybmluZzogNDIwMCB9OwoKICBmdW5jdGlvbiB0b2FzdEhvc3QoKSB7CiAgICByZXR1cm4gZW5zdXJlSG9zdChUT0FTVF9IT1NUX0lELCAndi10b2FzdC1ob3N0Jyk7CiAgfQoKICB1aS50b2FzdCA9IGZ1bmN0aW9uIHRvYXN0KG1zZywga2luZCkgewogICAga2luZCA9IGtpbmQgfHwgJ2luZm8nOwogICAgaWYgKCFtc2cpIHJldHVybiB7IGRpc21pc3M6IGZ1bmN0aW9uICgpIHt9IH07CiAgICB2YXIgaG9zdCA9IHRvYXN0SG9zdCgpOwoKICAgIHZhciBpY29uTmFtZSA9CiAgICAgIGtpbmQgPT09ICdzdWNjZXNzJwogICAgICAgID8gJ2NoZWNrJwogICAgICAgIDoga2luZCA9PT0gJ2Vycm9yJwogICAgICAgID8gJ2FsZXJ0JwogICAgICAgIDoga2luZCA9PT0gJ3dhcm5pbmcnCiAgICAgICAgPyAnYWxlcnQnCiAgICAgICAgOiAnaW5mbyc7CgogICAgdmFyIG5vZGUgPSBlbCgKICAgICAgJ2RpdicsCiAgICAgIHsKICAgICAgICBjbGFzczogJ3YtdG9hc3Qgdi10b2FzdC0tJyArIGtpbmQgKyAnIGxpcXVpZC1nbGFzcy10aGluJywKICAgICAgICByb2xlOiBraW5kID09PSAnZXJyb3InID8gJ2FsZXJ0JyA6ICdzdGF0dXMnLAogICAgICAgICdhcmlhLWxpdmUnOiBraW5kID09PSAnZXJyb3InID8gJ2Fzc2VydGl2ZScgOiAncG9saXRlJwogICAgICB9LAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXRvYXN0X19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oaWNvbk5hbWUpKSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi10b2FzdF9fbXNnJyB9LCBTdHJpbmcobXNnKSksCiAgICAgIGVsKAogICAgICAgICdidXR0b24nLAogICAgICAgIHsKICAgICAgICAgIGNsYXNzOiAndi10b2FzdF9fY2xvc2UnLAogICAgICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgICAnYXJpYS1sYWJlbCc6ICdEaXNtaXNzJywKICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmVtb3ZlKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBpY29uKCdjbG9zZScpCiAgICAgICkKICAgICk7CgogICAgaG9zdC5hcHBlbmRDaGlsZChub2RlKTsKICAgIG5vZGUub2Zmc2V0SGVpZ2h0OwogICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd2LXRvYXN0LS1pbicpOwoKICAgIHZhciBsaWZldGltZSA9IFRPQVNUX0xJRkVUSU1FU1traW5kXSB8fCAzMDAwOwogICAgdmFyIHRpbWVyID0gbnVsbDsKICAgIHZhciByZW1vdmVkID0gZmFsc2U7CgogICAgZnVuY3Rpb24gcmVtb3ZlKCkgewogICAgICBpZiAocmVtb3ZlZCkgcmV0dXJuOwogICAgICByZW1vdmVkID0gdHJ1ZTsKICAgICAgaWYgKHRpbWVyKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgIH0KICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKCd2LXRvYXN0LS1pbicpOwogICAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3YtdG9hc3QtLW91dCcpOwogICAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlKSBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgIH07CiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGRvbmUsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgc2V0VGltZW91dChkb25lLCA2MDApOwogICAgfQoKICAgIGZ1bmN0aW9uIGFybSgpIHsKICAgICAgaWYgKHRpbWVyKSBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICB0aW1lciA9IHNldFRpbWVvdXQocmVtb3ZlLCBsaWZldGltZSk7CiAgICB9CiAgICBhcm0oKTsKCiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICh0aW1lcikgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgIH0pOwogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgYXJtKTsKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHRpbWVyKSBjbGVhclRpbWVvdXQodGltZXIpOwogICAgfSk7CiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgYXJtKTsKCiAgICByZXR1cm4geyBkaXNtaXNzOiByZW1vdmUsIG5vZGU6IG5vZGUgfTsKICB9OwoKICAoZnVuY3Rpb24gc3Vic2NyaWJlVG9hc3RCdXMoKSB7CiAgICBmdW5jdGlvbiBiaW5kKCkgewogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIFYuc3RvcmUub24oJ3RvYXN0JywgZnVuY3Rpb24gKHBheWxvYWQpIHsKICAgICAgICAgIGlmICghcGF5bG9hZCkgcmV0dXJuOwogICAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJykgewogICAgICAgICAgICB1aS50b2FzdChwYXlsb2FkLCAnaW5mbycpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdWkudG9hc3QocGF5bG9hZC5tc2cgfHwgcGF5bG9hZC5tZXNzYWdlIHx8ICcnLCBwYXlsb2FkLmtpbmQgfHwgcGF5bG9hZC50eXBlIHx8ICdpbmZvJyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgVi5zdG9yZS5vbignZXJyb3InLCBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICAgICAgdmFyIG0gPQogICAgICAgICAgICB0eXBlb2YgcGF5bG9hZCA9PT0gJ3N0cmluZycKICAgICAgICAgICAgICA/IHBheWxvYWQKICAgICAgICAgICAgICA6IChwYXlsb2FkICYmIChwYXlsb2FkLm1lc3NhZ2UgfHwgcGF5bG9hZC5tc2cpKSB8fCAnU29tZXRoaW5nIHdlbnQgd3JvbmcuJzsKICAgICAgICAgIHVpLnRvYXN0KG0sICdlcnJvcicpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICghYmluZCgpKSB7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBiaW5kKTsKICAgICAgc2V0VGltZW91dChiaW5kLCAwKTsKICAgIH0KICB9KSgpOwoKICB2YXIgT1ZFUkxBWV9IT1NUX0lEID0gJ3Ytb3ZlcmxheS1ob3N0JzsKICB2YXIgb3Blbk92ZXJsYXlzID0gW107CgogIHZhciBGT0NVU0FCTEVfU0VMID0KICAgICdhW2hyZWZdLCBhcmVhW2hyZWZdLCBidXR0b246bm90KFtkaXNhYmxlZF0pLCBpbnB1dDpub3QoW2Rpc2FibGVkXSk6bm90KFt0eXBlPSJoaWRkZW4iXSksICcgKwogICAgJ3NlbGVjdDpub3QoW2Rpc2FibGVkXSksIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSwgaWZyYW1lLCBbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9Ii0xIl0pLCAnICsKICAgICdbY29udGVudGVkaXRhYmxlPSJ0cnVlIl0nOwoKICBmdW5jdGlvbiBvdmVybGF5SG9zdCgpIHsKICAgIHJldHVybiBlbnN1cmVIb3N0KE9WRVJMQVlfSE9TVF9JRCwgJ3Ytb3ZlcmxheS1ob3N0Jyk7CiAgfQoKICBmdW5jdGlvbiBmb2N1c2FibGUoY29udGFpbmVyKSB7CiAgICB2YXIgbGlzdCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKEZPQ1VTQUJMRV9TRUwpKTsKICAgIHJldHVybiBsaXN0LmZpbHRlcihmdW5jdGlvbiAobikgewogICAgICByZXR1cm4gKAogICAgICAgIG4ub2Zmc2V0V2lkdGggPiAwIHx8CiAgICAgICAgbi5vZmZzZXRIZWlnaHQgPiAwIHx8CiAgICAgICAgbiA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCB8fAogICAgICAgIG4uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPiAwCiAgICAgICk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIG1ha2VPdmVybGF5KG5vZGUsIG9wdHMsIHZhcmlhbnQpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGhvc3QgPSBvdmVybGF5SG9zdCgpOwogICAgdmFyIGxhc3RGb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKICAgIHZhciBjbG9zZWQgPSBmYWxzZTsKCiAgICB2YXIgcGFuZWxDbGFzcyA9CiAgICAgIHZhcmlhbnQgPT09ICdzaGVldCcgPyAndi1zaGVldCBsaXF1aWQtZ2xhc3MnIDogJ3YtbW9kYWwgbGlxdWlkLWdsYXNzJzsKICAgIGlmIChvcHRzLmNsYXNzTmFtZSkgcGFuZWxDbGFzcyArPSAnICcgKyBvcHRzLmNsYXNzTmFtZTsKCiAgICB2YXIgcGFuZWwgPSBlbCgnZGl2JywgewogICAgICBjbGFzczogcGFuZWxDbGFzcywKICAgICAgcm9sZTogJ2RpYWxvZycsCiAgICAgICdhcmlhLW1vZGFsJzogJ3RydWUnLAogICAgICB0YWJpbmRleDogJy0xJwogICAgfSk7CiAgICBpZiAob3B0cy5hcmlhTGFiZWwpIHBhbmVsLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIG9wdHMuYXJpYUxhYmVsKTsKCiAgICBpZiAodmFyaWFudCA9PT0gJ3NoZWV0JykgewogICAgICBwYW5lbC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2hlZXRfX2dyYWInLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSkpOwogICAgfQogICAgaWYgKG9wdHMuZGlzbWlzc0J1dHRvbiAhPT0gZmFsc2UpIHsKICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQoCiAgICAgICAgZWwoCiAgICAgICAgICAnYnV0dG9uJywKICAgICAgICAgIHsKICAgICAgICAgICAgY2xhc3M6ICd2LW1vZGFsX19jbG9zZScsCiAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgICAgICAnYXJpYS1sYWJlbCc6ICdDbG9zZScsCiAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBjbG9zZSgnYnV0dG9uJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBpY29uKCdjbG9zZScpCiAgICAgICAgKQogICAgICApOwogICAgfQoKICAgIHZhciBib2R5ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vZGFsX19ib2R5JyB9KTsKICAgIGlmIChub2RlICYmIG5vZGUubm9kZVR5cGUpIGJvZHkuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICBlbHNlIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycpIGJvZHkuaW5uZXJIVE1MID0gbm9kZTsKICAgIHBhbmVsLmFwcGVuZENoaWxkKGJvZHkpOwoKICAgIHZhciBiYWNrZHJvcCA9IGVsKAogICAgICAnZGl2JywKICAgICAgewogICAgICAgIGNsYXNzOiB2YXJpYW50ID09PSAnc2hlZXQnID8gJ3Ytb3ZlcmxheSB2LW92ZXJsYXktLXNoZWV0JyA6ICd2LW92ZXJsYXknLAogICAgICAgIG9uUG9pbnRlcmRvd246IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IGJhY2tkcm9wICYmIG9wdHMuZGlzbWlzc09uQmFja2Ryb3AgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIGNsb3NlKCdiYWNrZHJvcCcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgcGFuZWwKICAgICk7CgogICAgZnVuY3Rpb24gb25LZXlkb3duKGUpIHsKICAgICAgaWYgKG9wZW5PdmVybGF5c1tvcGVuT3ZlcmxheXMubGVuZ3RoIC0gMV0gIT09IGFwaSkgcmV0dXJuOwogICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIG9wdHMuZGlzbWlzc09uRXNjICE9PSBmYWxzZSkgewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgY2xvc2UoJ2VzY2FwZScpOwogICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnVGFiJykgewogICAgICAgIHZhciBpdGVtcyA9IGZvY3VzYWJsZShwYW5lbCk7CiAgICAgICAgaWYgKCFpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHBhbmVsLmZvY3VzKCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBmaXJzdCA9IGl0ZW1zWzBdOwogICAgICAgIHZhciBsYXN0ID0gaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV07CiAgICAgICAgdmFyIGFjdGl2ZSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7CiAgICAgICAgaWYgKGUuc2hpZnRLZXkgJiYgKGFjdGl2ZSA9PT0gZmlyc3QgfHwgYWN0aXZlID09PSBwYW5lbCkpIHsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGxhc3QuZm9jdXMoKTsKICAgICAgICB9IGVsc2UgaWYgKCFlLnNoaWZ0S2V5ICYmIGFjdGl2ZSA9PT0gbGFzdCkgewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgZmlyc3QuZm9jdXMoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjbG9zZShyZWFzb24pIHsKICAgICAgaWYgKGNsb3NlZCkgcmV0dXJuOwogICAgICBjbG9zZWQgPSB0cnVlOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlkb3duLCB0cnVlKTsKICAgICAgdmFyIGlkeCA9IG9wZW5PdmVybGF5cy5pbmRleE9mKGFwaSk7CiAgICAgIGlmIChpZHggIT09IC0xKSBvcGVuT3ZlcmxheXMuc3BsaWNlKGlkeCwgMSk7CgogICAgICBiYWNrZHJvcC5jbGFzc0xpc3QucmVtb3ZlKCd2LW92ZXJsYXktLWluJyk7CiAgICAgIGJhY2tkcm9wLmNsYXNzTGlzdC5hZGQoJ3Ytb3ZlcmxheS0tb3V0Jyk7CiAgICAgIHZhciBmaW5pc2ggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKGJhY2tkcm9wLnBhcmVudE5vZGUpIGJhY2tkcm9wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYmFja2Ryb3ApOwogICAgICAgIGlmICghb3Blbk92ZXJsYXlzLmxlbmd0aCkgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCd2LXNjcm9sbC1sb2NrJyk7CiAgICAgICAgaWYgKGxhc3RGb2N1c2VkICYmIHR5cGVvZiBsYXN0Rm9jdXNlZC5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbGFzdEZvY3VzZWQuZm9jdXMoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgfQogICAgICB9OwogICAgICBiYWNrZHJvcC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZmluaXNoLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgIHNldFRpbWVvdXQoZmluaXNoLCA2MDApOwoKICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ2xvc2UgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICB0cnkgewogICAgICAgICAgb3B0cy5vbkNsb3NlKHJlYXNvbik7CiAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgfQogICAgfQoKICAgIHZhciBhcGkgPSB7IGNsb3NlOiBjbG9zZSwgbm9kZTogcGFuZWwsIGJvZHk6IGJvZHksIGJhY2tkcm9wOiBiYWNrZHJvcCB9OwoKICAgIGhvc3QuYXBwZW5kQ2hpbGQoYmFja2Ryb3ApOwogICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCd2LXNjcm9sbC1sb2NrJyk7CiAgICBvcGVuT3ZlcmxheXMucHVzaChhcGkpOwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5ZG93biwgdHJ1ZSk7CgogICAgYmFja2Ryb3Aub2Zmc2V0SGVpZ2h0OwogICAgYmFja2Ryb3AuY2xhc3NMaXN0LmFkZCgndi1vdmVybGF5LS1pbicpOwoKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChjbG9zZWQpIHJldHVybjsKICAgICAgdmFyIGF1dG8gPSBwYW5lbC5xdWVyeVNlbGVjdG9yKCdbYXV0b2ZvY3VzXScpOwogICAgICB2YXIgaXRlbXMgPSBhdXRvID8gW2F1dG9dIDogZm9jdXNhYmxlKHBhbmVsKTsKICAgICAgaWYgKGl0ZW1zLmxlbmd0aCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpdGVtc1swXS5mb2N1cygpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHBhbmVsLmZvY3VzKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHBhbmVsLmZvY3VzKCk7CiAgICAgIH0KICAgIH0pOwoKICAgIHJldHVybiBhcGk7CiAgfQoKICB1aS5tb2RhbCA9IGZ1bmN0aW9uIG1vZGFsKG5vZGUsIG9wdHMpIHsKICAgIHJldHVybiBtYWtlT3ZlcmxheShub2RlLCBvcHRzLCAnbW9kYWwnKTsKICB9OwoKICB1aS5zaGVldCA9IGZ1bmN0aW9uIHNoZWV0KG5vZGUsIG9wdHMpIHsKICAgIHJldHVybiBtYWtlT3ZlcmxheShub2RlLCBvcHRzLCAnc2hlZXQnKTsKICB9OwoKICB1aS5jb25maXJtID0gZnVuY3Rpb24gY29uZmlybShtc2csIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CiAgICAgIHZhciBzZXR0bGVkID0gZmFsc2U7CiAgICAgIGZ1bmN0aW9uIHNldHRsZSh2YWwpIHsKICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOwogICAgICAgIHNldHRsZWQgPSB0cnVlOwogICAgICAgIHJlZi5jbG9zZSgnY29uZmlybScpOwogICAgICAgIHJlc29sdmUodmFsKTsKICAgICAgfQoKICAgICAgdmFyIGNvbnRlbnQgPSBlbCgKICAgICAgICAnZGl2JywKICAgICAgICB7IGNsYXNzOiAndi1jb25maXJtJyB9LAogICAgICAgIG9wdHMudGl0bGUgPyBlbCgnaDMnLCB7IGNsYXNzOiAndi1jb25maXJtX190aXRsZScgfSwgU3RyaW5nKG9wdHMudGl0bGUpKSA6IG51bGwsCiAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1jb25maXJtX19tc2cnIH0sIFN0cmluZyhtc2cgfHwgJ0FyZSB5b3Ugc3VyZT8nKSksCiAgICAgICAgZWwoCiAgICAgICAgICAnZGl2JywKICAgICAgICAgIHsgY2xhc3M6ICd2LWNvbmZpcm1fX2FjdGlvbnMnIH0sCiAgICAgICAgICBlbCgKICAgICAgICAgICAgJ2J1dHRvbicsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCcsCiAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgc2V0dGxlKGZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9wdHMuY2FuY2VsTGFiZWwgfHwgJ0NhbmNlbCcKICAgICAgICAgICksCiAgICAgICAgICBlbCgKICAgICAgICAgICAgJ2J1dHRvbicsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjbGFzczogJ3YtY3RhICcgKyAob3B0cy5kZXN0cnVjdGl2ZSA/ICd2LWN0YS0tZGFuZ2VyJyA6ICd2LWN0YS0tcHJpbWFyeScpLAogICAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgICAgICAgIGF1dG9mb2N1czogJycsCiAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgc2V0dGxlKHRydWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgb3B0cy5jb25maXJtTGFiZWwgfHwgKG9wdHMuZGVzdHJ1Y3RpdmUgPyAnRGVsZXRlJyA6ICdDb25maXJtJykKICAgICAgICAgICkKICAgICAgICApCiAgICAgICk7CgogICAgICB2YXIgcmVmID0gbWFrZU92ZXJsYXkoCiAgICAgICAgY29udGVudCwKICAgICAgICB7CiAgICAgICAgICBjbGFzc05hbWU6ICd2LW1vZGFsLS1jb25maXJtJywKICAgICAgICAgIGFyaWFMYWJlbDogb3B0cy50aXRsZSB8fCAnQ29uZmlybScsCiAgICAgICAgICBkaXNtaXNzQnV0dG9uOiBmYWxzZSwKICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgc2V0dGxlKGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICdtb2RhbCcKICAgICAgKTsKICAgIH0pOwogIH07CgogIHVpLnNwaW5uZXIgPSBmdW5jdGlvbiBzcGlubmVyKHNpemUpIHsKICAgIHZhciBub2RlID0gZWwoJ3NwYW4nLCB7CiAgICAgIGNsYXNzOiAndi1zcGlubmVyJywKICAgICAgcm9sZTogJ3N0YXR1cycsCiAgICAgICdhcmlhLWxhYmVsJzogJ0xvYWRpbmcnCiAgICB9KTsKICAgIGlmIChzaXplKSBub2RlLnN0eWxlLnNldFByb3BlcnR5KCctLXYtc3Bpbm5lci1zaXplJywgc2l6ZSArICdweCcpOwogICAgbm9kZS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXNwaW5uZXJfX3JpbmcnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSkpOwogICAgcmV0dXJuIG5vZGU7CiAgfTsKCiAgZnVuY3Rpb24gc2tlbEJsb2NrKGV4dHJhQ2xhc3MpIHsKICAgIHJldHVybiBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24nICsgKGV4dHJhQ2xhc3MgPyAnICcgKyBleHRyYUNsYXNzIDogJycpIH0pOwogIH0KCiAgdWkuc2tlbGV0b24gPSBmdW5jdGlvbiBza2VsZXRvbihraW5kLCBjb3VudCkgewogICAga2luZCA9IGtpbmQgfHwgJ2NhcmQnOwogICAgY291bnQgPSBjb3VudCB8fCAoa2luZCA9PT0gJ2dyaWQnID8gNiA6IGtpbmQgPT09ICdsaW5lJyA/IDMgOiAxKTsKCiAgICBpZiAoa2luZCA9PT0gJ2xpbmUnIHx8IGtpbmQgPT09ICd0ZXh0JykgewogICAgICB2YXIgbGluZXMgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24tbGluZXMnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgIHZhciB3ID0gaSA9PT0gY291bnQgLSAxID8gJzYyJScgOiBpICUgMiA/ICc4OCUnIDogJzEwMCUnOwogICAgICAgIHZhciBsbiA9IHNrZWxCbG9jaygndi1za2VsZXRvbi0tbGluZScpOwogICAgICAgIGxuLnN0eWxlLndpZHRoID0gdzsKICAgICAgICBsaW5lcy5hcHBlbmRDaGlsZChsbik7CiAgICAgIH0KICAgICAgcmV0dXJuIGxpbmVzOwogICAgfQoKICAgIGlmIChraW5kID09PSAnaW1hZ2UnKSB7CiAgICAgIHJldHVybiBza2VsQmxvY2soJ3Ytc2tlbGV0b24tLWltYWdlJyk7CiAgICB9CgogICAgaWYgKGtpbmQgPT09ICdwaWxsJykgewogICAgICByZXR1cm4gc2tlbEJsb2NrKCd2LXNrZWxldG9uLS1waWxsJyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2tlbENhcmQoKSB7CiAgICAgIHJldHVybiBlbCgKICAgICAgICAnZGl2JywKICAgICAgICB7IGNsYXNzOiAndi1za2VsZXRvbi1jYXJkJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sCiAgICAgICAgc2tlbEJsb2NrKCd2LXNrZWxldG9uLS1tZWRpYScpLAogICAgICAgIGVsKAogICAgICAgICAgJ2RpdicsCiAgICAgICAgICB7IGNsYXNzOiAndi1za2VsZXRvbi1jYXJkX19tZXRhJyB9LAogICAgICAgICAgc2tlbEJsb2NrKCd2LXNrZWxldG9uLS1saW5lJyksCiAgICAgICAgICBza2VsQmxvY2soJ3Ytc2tlbGV0b24tLWxpbmUgdi1za2VsZXRvbi0tc2hvcnQnKQogICAgICAgICkKICAgICAgKTsKICAgIH0KCiAgICBpZiAoa2luZCA9PT0gJ2NhcmQnKSB7CiAgICAgIHJldHVybiBza2VsQ2FyZCgpOwogICAgfQoKICAgIHZhciBncmlkID0gZWwoJ2RpdicsIHsKICAgICAgY2xhc3M6ICd2LXNrZWxldG9uLWdyaWQgdi1ncmlkIHYtZ3JpZC0tMycsCiAgICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJywKICAgICAgJ2FyaWEtYnVzeSc6ICd0cnVlJwogICAgfSk7CiAgICBmb3IgKHZhciBnID0gMDsgZyA8IGNvdW50OyBnKyspIGdyaWQuYXBwZW5kQ2hpbGQoc2tlbENhcmQoKSk7CiAgICByZXR1cm4gZ3JpZDsKICB9OwoKICB1aS5lbXB0eSA9IGZ1bmN0aW9uIGVtcHR5KG1zZywgYWN0aW9uTGFiZWwsIG9uQWN0aW9uKSB7CiAgICB2YXIgaWNvbk5hbWUgPSAnaW1hZ2UnOwogICAgdmFyIHRpdGxlID0gJ05vdGhpbmcgaGVyZSB5ZXQnOwogICAgdmFyIHN1YiA9IG1zZyB8fCAnJzsKICAgIGlmIChtc2cgJiYgdHlwZW9mIG1zZyA9PT0gJ29iamVjdCcpIHsKICAgICAgdGl0bGUgPSBtc2cudGl0bGUgfHwgdGl0bGU7CiAgICAgIHN1YiA9IG1zZy5tZXNzYWdlIHx8IG1zZy5tc2cgfHwgJyc7CiAgICAgIGljb25OYW1lID0gbXNnLmljb24gfHwgaWNvbk5hbWU7CiAgICAgIGFjdGlvbkxhYmVsID0gbXNnLmFjdGlvbkxhYmVsIHx8IGFjdGlvbkxhYmVsOwogICAgICBvbkFjdGlvbiA9IG1zZy5vbkFjdGlvbiB8fCBvbkFjdGlvbjsKICAgIH0gZWxzZSB7CiAgICAgIHRpdGxlID0gbXNnIHx8IHRpdGxlOwogICAgICBzdWIgPSAnJzsKICAgIH0KCiAgICB2YXIgbm9kZSA9IGVsKAogICAgICAnZGl2JywKICAgICAgeyBjbGFzczogJ3YtZW1wdHknLCByb2xlOiAnbm90ZScgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oaWNvbk5hbWUpKSwKICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fdGl0bGUnIH0sIHRpdGxlKSwKICAgICAgc3ViID8gZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fc3ViJyB9LCBzdWIpIDogbnVsbAogICAgKTsKCiAgICBpZiAoYWN0aW9uTGFiZWwgJiYgdHlwZW9mIG9uQWN0aW9uID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoCiAgICAgICAgZWwoCiAgICAgICAgICAnYnV0dG9uJywKICAgICAgICAgIHsKICAgICAgICAgICAgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWVtcHR5X19hY3Rpb24nLAogICAgICAgICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICBvbkFjdGlvbihlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGFjdGlvbkxhYmVsCiAgICAgICAgKQogICAgICApOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfTsKCiAgdWkuY3JlZGl0c1BpbGwgPSBmdW5jdGlvbiBjcmVkaXRzUGlsbChuKSB7CiAgICB2YXIgdmFsID0gbiA9PSBudWxsID8gMCA6IE51bWJlcihuKTsKICAgIHZhciBkaXNwbGF5ID0gaXNGaW5pdGUodmFsKSA/IGZvcm1hdENyZWRpdHModmFsKSA6IFN0cmluZyhuKTsKICAgIHJldHVybiBlbCgKICAgICAgJ3NwYW4nLAogICAgICB7CiAgICAgICAgY2xhc3M6ICd2LWNyZWRpdHMgdi1jcmVkaXRzLXBpbGwnLAogICAgICAgIHRpdGxlOiBkaXNwbGF5ICsgJyBjcmVkaXRzJywKICAgICAgICAnYXJpYS1sYWJlbCc6IGRpc3BsYXkgKyAnIGNyZWRpdHMnCiAgICAgIH0sCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3JlZGl0c19faWNvbicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9LCBpY29uKCdzcGFyaycpKSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVkaXRzX19udW0nIH0sIGRpc3BsYXkpCiAgICApOwogIH07CgogIGZ1bmN0aW9uIGZvcm1hdENyZWRpdHMobikgewogICAgaWYgKG4gPj0gMTAwMDAwMCkgcmV0dXJuIChuIC8gMTAwMDAwMCkudG9GaXhlZChuICUgMTAwMDAwMCA/IDEgOiAwKSArICdNJzsKICAgIGlmIChuID49IDEwMDAwKSByZXR1cm4gTWF0aC5yb3VuZChuIC8gMTAwMCkgKyAnayc7CiAgICByZXR1cm4gU3RyaW5nKE1hdGgucm91bmQobikpOwogIH0KCiAgdWkuaW1nQ2FyZCA9IGZ1bmN0aW9uIGltZ0NhcmQoaW1hZ2UsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgaW1hZ2UgPSBpbWFnZSB8fCB7fTsKCiAgICB2YXIgYWZ0ZXIgPQogICAgICBpbWFnZS5yZW1vdGVJbWFnZVVSTCB8fAogICAgICBpbWFnZS5yZW1vdGVJbWFnZVVybCB8fAogICAgICBpbWFnZS5pbWFnZVVSTCB8fAogICAgICBpbWFnZS51cmwgfHwKICAgICAgJyc7CiAgICB2YXIgYmVmb3JlID0KICAgICAgaW1hZ2UucmVtb3RlT3JpZ2luYWxJbWFnZVVSTCB8fAogICAgICBpbWFnZS5yZW1vdGVPcmlnaW5hbEltYWdlVXJsIHx8CiAgICAgIGltYWdlLm9yaWdpbmFsSW1hZ2VVUkwgfHwKICAgICAgJyc7CiAgICB2YXIgd2FudFNjcnViID0gb3B0cy5iZWZvcmVBZnRlciAhPT0gZmFsc2UgJiYgISFiZWZvcmUgJiYgYmVmb3JlICE9PSBhZnRlcjsKCiAgICB2YXIgY2FyZCA9IGVsKCdidXR0b24nLCB7CiAgICAgIGNsYXNzOiAndi1jYXJkIHYtaW1nY2FyZCcsCiAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAnYXJpYS1sYWJlbCc6IGltYWdlLnByb21wdCA/ICdPcGVuOiAnICsgdHJ1bmNhdGUoaW1hZ2UucHJvbXB0LCA4MCkgOiAnT3BlbiBpbWFnZScKICAgIH0pOwoKICAgIHZhciBtZWRpYSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1pbWdjYXJkX19tZWRpYScgfSk7CgogICAgaWYgKHdhbnRTY3J1YikgewogICAgICBjYXJkLmNsYXNzTGlzdC5hZGQoJ3YtaW1nY2FyZC0tc2NydWInKTsKICAgICAgdmFyIHNjcnViTm9kZSA9IHVpLnNjcnViKGJlZm9yZSwgYWZ0ZXIsIHsgaW50ZXJhY3RpdmU6IG9wdHMuc2NydWJJbnRlcmFjdGl2ZSAhPT0gZmFsc2UgfSk7CiAgICAgIG1lZGlhLmFwcGVuZENoaWxkKHNjcnViTm9kZSk7CiAgICB9IGVsc2UgewogICAgICBtZWRpYS5jbGFzc0xpc3QuYWRkKCd2LWltZ2NhcmRfX21lZGlhLS1wbGFpbicpOwogICAgICB2YXIgcGggPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24gdi1pbWdjYXJkX19waCcsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKICAgICAgbWVkaWEuYXBwZW5kQ2hpbGQocGgpOwoKICAgICAgdmFyIGltZyA9IGVsKCdpbWcnLCB7CiAgICAgICAgY2xhc3M6ICd2LWltZ2NhcmRfX2ltZycsCiAgICAgICAgbG9hZGluZzogJ2xhenknLAogICAgICAgIGRlY29kaW5nOiAnYXN5bmMnLAogICAgICAgIGFsdDogaW1hZ2UucHJvbXB0ID8gdHJ1bmNhdGUoaW1hZ2UucHJvbXB0LCAxMjApIDogJ0dlbmVyYXRlZCBpbWFnZScsCiAgICAgICAgc3JjOiBhZnRlcgogICAgICB9KTsKICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQoJ2lzLWxvYWRlZCcpOwogICAgICAgIGlmIChwaC5wYXJlbnROb2RlKSBwaC5jbGFzc0xpc3QuYWRkKCdpcy1nb25lJyk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBpZiAocGgucGFyZW50Tm9kZSkgcGgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwaCk7CiAgICAgICAgfSwgMzYwKTsKICAgICAgfSk7CiAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICBtZWRpYS5jbGFzc0xpc3QuYWRkKCd2LWltZ2NhcmRfX21lZGlhLS1lcnInKTsKICAgICAgICBwaC5jbGFzc0xpc3QuYWRkKCdpcy1lcnJvcicpOwogICAgICAgIHBoLmlubmVySFRNTCA9ICcnOwogICAgICAgIHBoLmFwcGVuZENoaWxkKGljb24oJ2ltYWdlJykpOwogICAgICB9KTsKICAgICAgbWVkaWEuYXBwZW5kQ2hpbGQoaW1nKTsKICAgIH0KCiAgICBjYXJkLmFwcGVuZENoaWxkKG1lZGlhKTsKCiAgICBpZiAoaW1hZ2UuZmF2b3JpdGVkKSB7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQoCiAgICAgICAgZWwoCiAgICAgICAgICAnc3BhbicsCiAgICAgICAgICB7IGNsYXNzOiAndi1pbWdjYXJkX19mYXYnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIHRpdGxlOiAnRmF2b3JpdGVkJyB9LAogICAgICAgICAgaWNvbignaGVhcnQnKQogICAgICAgICkKICAgICAgKTsKICAgIH0KCiAgICBpZiAoaW1hZ2UucHJvbXB0ICYmIG9wdHMuY2FwdGlvbiAhPT0gZmFsc2UgJiYgIWltYWdlLmhpZGVQcm9tcHQpIHsKICAgICAgY2FyZC5hcHBlbmRDaGlsZCgKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWltZ2NhcmRfX2NhcHRpb24nLCB0aXRsZTogU3RyaW5nKGltYWdlLnByb21wdCkgfSwgU3RyaW5nKGltYWdlLnByb21wdCkpCiAgICAgICk7CiAgICB9CgogICAgaWYgKHR5cGVvZiBvcHRzLm9uVGFwID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgewogICAgICAgIGlmIChjYXJkLmRhdGFzZXQuc2NydWJiZWQgPT09ICcxJykgewogICAgICAgICAgY2FyZC5kYXRhc2V0LnNjcnViYmVkID0gJzAnOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBvcHRzLm9uVGFwKGltYWdlLCBlKTsKICAgICAgfSk7CiAgICB9CgogICAgcmV0dXJuIGNhcmQ7CiAgfTsKCiAgZnVuY3Rpb24gdHJ1bmNhdGUocywgbikgewogICAgcyA9IFN0cmluZyhzIHx8ICcnKTsKICAgIHJldHVybiBzLmxlbmd0aCA+IG4gPyBzLnNsaWNlKDAsIG4gLSAxKS50cmltRW5kKCkgKyAn4oCmJyA6IHM7CiAgfQoKICB1aS5zY3J1YiA9IGZ1bmN0aW9uIHNjcnViKGJlZm9yZVVSTCwgYWZ0ZXJVUkwsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGludGVyYWN0aXZlID0gb3B0cy5pbnRlcmFjdGl2ZSAhPT0gZmFsc2U7CgogICAgdmFyIGFmdGVySW1nID0gZWwoJ2ltZycsIHsKICAgICAgY2xhc3M6ICd2YWZ0ZXInLAogICAgICBzcmM6IGFmdGVyVVJMIHx8IGJlZm9yZVVSTCB8fCAnJywKICAgICAgYWx0OiBvcHRzLmFmdGVyQWx0IHx8ICdBZnRlcicsCiAgICAgIGRyYWdnYWJsZTogJ2ZhbHNlJywKICAgICAgZGVjb2Rpbmc6ICdhc3luYycsCiAgICAgIGxvYWRpbmc6IG9wdHMuZWFnZXIgPyAnZWFnZXInIDogJ2xhenknCiAgICB9KTsKICAgIHZhciBiZWZvcmVJbWcgPSBlbCgnaW1nJywgewogICAgICBjbGFzczogJ3ZiZWZvcmUnLAogICAgICBzcmM6IGJlZm9yZVVSTCB8fCBhZnRlclVSTCB8fCAnJywKICAgICAgYWx0OiBvcHRzLmJlZm9yZUFsdCB8fCAnQmVmb3JlJywKICAgICAgZHJhZ2dhYmxlOiAnZmFsc2UnLAogICAgICBkZWNvZGluZzogJ2FzeW5jJywKICAgICAgbG9hZGluZzogb3B0cy5lYWdlciA/ICdlYWdlcicgOiAnbGF6eScKICAgIH0pOwogICAgdmFyIGRpdmlkZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3ZzY3J1YicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKCiAgICB2YXIgY2FyZCA9IGVsKAogICAgICAnZGl2JywKICAgICAgewogICAgICAgIGNsYXNzOiAndmNhcmQnLAogICAgICAgIHJvbGU6IGludGVyYWN0aXZlID8gJ3NsaWRlcicgOiAnaW1nJywKICAgICAgICB0YWJpbmRleDogaW50ZXJhY3RpdmUgPyAnMCcgOiBudWxsLAogICAgICAgICdhcmlhLWxhYmVsJzogaW50ZXJhY3RpdmUKICAgICAgICAgID8gJ0JlZm9yZSBhbmQgYWZ0ZXIgY29tcGFyaXNvbi4gVXNlIGFycm93IGtleXMgdG8gY29tcGFyZS4nCiAgICAgICAgICA6ICdCZWZvcmUgYW5kIGFmdGVyIGNvbXBhcmlzb24nLAogICAgICAgICdhcmlhLXZhbHVlbWluJzogaW50ZXJhY3RpdmUgPyAnMCcgOiBudWxsLAogICAgICAgICdhcmlhLXZhbHVlbWF4JzogaW50ZXJhY3RpdmUgPyAnMTAwJyA6IG51bGwsCiAgICAgICAgJ2FyaWEtdmFsdWVub3cnOiBpbnRlcmFjdGl2ZSA/ICc1MCcgOiBudWxsCiAgICAgIH0sCiAgICAgIGFmdGVySW1nLAogICAgICBiZWZvcmVJbWcsCiAgICAgIGRpdmlkZXIKICAgICk7CgogICAgZnVuY3Rpb24gb25TY3J1YkJyb2tlbigpIHsKICAgICAgaWYgKGNhcmQuY2xhc3NMaXN0LmNvbnRhaW5zKCd2Y2FyZC0tbm9pbWcnKSkgcmV0dXJuOwogICAgICBjYXJkLmNsYXNzTGlzdC5hZGQoJ3ZjYXJkLS1ub2ltZycpOwogICAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndmNhcmRfX25vaW1nJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oJ2ltYWdlJykpKTsKICAgIH0KICAgIGFmdGVySW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25TY3J1YkJyb2tlbik7CiAgICBpZiAoIWFmdGVyVVJMICYmICFiZWZvcmVVUkwpIG9uU2NydWJCcm9rZW4oKTsKCiAgICB2YXIgZmVlZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndmZlZWQgdmZlZWQtLXNpbmdsZScgfSwgY2FyZCk7CgogICAgdmFyIHJldmVhbCA9IDAuNTsKICAgIGZ1bmN0aW9uIGFwcGx5UmV2ZWFsKHIpIHsKICAgICAgcmV2ZWFsID0gY2xhbXAociwgMCwgMSk7CiAgICAgIHZhciBwY3QgPSAocmV2ZWFsICogMTAwKS50b0ZpeGVkKDIpOwogICAgICBiZWZvcmVJbWcuc3R5bGUuY2xpcFBhdGggPSAnaW5zZXQoMCAnICsgKDEwMCAtIHBjdCkgKyAnJSAwIDApJzsKICAgICAgYmVmb3JlSW1nLnN0eWxlLndlYmtpdENsaXBQYXRoID0gJ2luc2V0KDAgJyArICgxMDAgLSBwY3QpICsgJyUgMCAwKSc7CiAgICAgIGRpdmlkZXIuc3R5bGUubGVmdCA9IHBjdCArICclJzsKICAgICAgaWYgKGludGVyYWN0aXZlKSBjYXJkLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIFN0cmluZyhNYXRoLnJvdW5kKHJldmVhbCAqIDEwMCkpKTsKICAgIH0KICAgIGFwcGx5UmV2ZWFsKHJldmVhbCk7CgogICAgdmFyIHJhZklkID0gbnVsbDsKICAgIHZhciBhbmltQWN0aXZlID0gZmFsc2U7CiAgICB2YXIgYW5pbUZyb20gPSAwLjI7CiAgICB2YXIgYW5pbVRvID0gMC44OwogICAgdmFyIGFuaW1TdGFydCA9IDA7CiAgICB2YXIgYW5pbUR1ciA9IDI2MDA7CiAgICB2YXIgYW5pbURpciA9IDE7CiAgICB2YXIgcmVzdW1lVGltZXIgPSBudWxsOwogICAgdmFyIGRlc3Ryb3llZCA9IGZhbHNlOwogICAgdmFyIHJlZHVjZU1vdGlvbiA9IHByZWZlcnNSZWR1Y2VkTW90aW9uKCk7CgogICAgZnVuY3Rpb24gZWFzZUluT3V0KHQpIHsKICAgICAgcmV0dXJuIHQgPCAwLjUgPyAyICogdCAqIHQgOiAxIC0gTWF0aC5wb3coLTIgKiB0ICsgMiwgMikgLyAyOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0ZXAodHMpIHsKICAgICAgaWYgKCFhbmltQWN0aXZlIHx8IGRlc3Ryb3llZCkgcmV0dXJuOwogICAgICBpZiAoIWFuaW1TdGFydCkgYW5pbVN0YXJ0ID0gdHM7CiAgICAgIHZhciBlbGFwc2VkID0gdHMgLSBhbmltU3RhcnQ7CiAgICAgIHZhciB0ID0gY2xhbXAoZWxhcHNlZCAvIGFuaW1EdXIsIDAsIDEpOwogICAgICB2YXIgZWFzZWQgPSBlYXNlSW5PdXQodCk7CiAgICAgIHZhciBmcm9tID0gYW5pbURpciA9PT0gMSA/IGFuaW1Gcm9tIDogYW5pbVRvOwogICAgICB2YXIgdG8gPSBhbmltRGlyID09PSAxID8gYW5pbVRvIDogYW5pbUZyb207CiAgICAgIGFwcGx5UmV2ZWFsKGZyb20gKyAodG8gLSBmcm9tKSAqIGVhc2VkKTsKICAgICAgaWYgKHQgPj0gMSkgewogICAgICAgIGFuaW1EaXIgKj0gLTE7CiAgICAgICAgYW5pbVN0YXJ0ID0gdHM7CiAgICAgIH0KICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RhcnRBbmltKCkgewogICAgICBpZiAoIWludGVyYWN0aXZlKSByZXR1cm47CiAgICAgIGlmIChyZWR1Y2VNb3Rpb24pIHJldHVybjsKICAgICAgaWYgKGFuaW1BY3RpdmUgfHwgZGVzdHJveWVkKSByZXR1cm47CiAgICAgIGlmICghaXNPbnNjcmVlbigpKSByZXR1cm47CiAgICAgIGFuaW1BY3RpdmUgPSB0cnVlOwogICAgICBhbmltU3RhcnQgPSAwOwogICAgICBhbmltRGlyID0gMTsKICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RvcEFuaW0oKSB7CiAgICAgIGFuaW1BY3RpdmUgPSBmYWxzZTsKICAgICAgaWYgKHJhZklkKSB7CiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpOwogICAgICAgIHJhZklkID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmVzdW1lKGRlbGF5KSB7CiAgICAgIGlmIChyZXN1bWVUaW1lcikgY2xlYXJUaW1lb3V0KHJlc3VtZVRpbWVyKTsKICAgICAgcmVzdW1lVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICByZXN1bWVUaW1lciA9IG51bGw7CiAgICAgICAgYW5pbUZyb20gPSAwLjI7CiAgICAgICAgYW5pbVRvID0gMC44OwogICAgICAgIHN0YXJ0QW5pbSgpOwogICAgICB9LCBkZWxheSA9PSBudWxsID8gMTgwMCA6IGRlbGF5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc09uc2NyZWVuKCkgewogICAgICB2YXIgciA9IGZlZWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHJldHVybiByLmJvdHRvbSA+IDAgJiYgci50b3AgPCAod2luZG93LmlubmVySGVpZ2h0IHx8IDApICYmIHIud2lkdGggPiAwOwogICAgfQoKICAgIHZhciBkcmFnZ2luZyA9IGZhbHNlOwogICAgdmFyIHBvaW50ZXJJZCA9IG51bGw7CiAgICB2YXIgbW92ZWREdXJpbmdEcmFnID0gZmFsc2U7CgogICAgZnVuY3Rpb24gcmV2ZWFsRnJvbUNsaWVudFgoY2xpZW50WCkgewogICAgICB2YXIgcmVjdCA9IGNhcmQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGlmICghcmVjdC53aWR0aCkgcmV0dXJuIHJldmVhbDsKICAgICAgcmV0dXJuIChjbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGg7CiAgICB9CgogICAgZnVuY3Rpb24gb25Eb3duKGUpIHsKICAgICAgaWYgKCFpbnRlcmFjdGl2ZSkgcmV0dXJuOwogICAgICBpZiAoZS5idXR0b24gIT0gbnVsbCAmJiBlLmJ1dHRvbiAhPT0gMCAmJiBlLnBvaW50ZXJUeXBlID09PSAnbW91c2UnKSByZXR1cm47CiAgICAgIGRyYWdnaW5nID0gdHJ1ZTsKICAgICAgbW92ZWREdXJpbmdEcmFnID0gZmFsc2U7CiAgICAgIHBvaW50ZXJJZCA9IGUucG9pbnRlcklkICE9IG51bGwgPyBlLnBvaW50ZXJJZCA6IG51bGw7CiAgICAgIGlmIChwb2ludGVySWQgIT0gbnVsbCAmJiBjYXJkLnNldFBvaW50ZXJDYXB0dXJlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNhcmQuc2V0UG9pbnRlckNhcHR1cmUocG9pbnRlcklkKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHt9CiAgICAgIH0KICAgICAgc3RvcEFuaW0oKTsKICAgICAgaWYgKHJlc3VtZVRpbWVyKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHJlc3VtZVRpbWVyKTsKICAgICAgICByZXN1bWVUaW1lciA9IG51bGw7CiAgICAgIH0KICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCdzY3J1YmJpbmcnKTsKICAgICAgYXBwbHlSZXZlYWwocmV2ZWFsRnJvbUNsaWVudFgoZ2V0Q2xpZW50WChlKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIG9uTW92ZShlKSB7CiAgICAgIGlmICghZHJhZ2dpbmcpIHJldHVybjsKICAgICAgbW92ZWREdXJpbmdEcmFnID0gdHJ1ZTsKICAgICAgYXBwbHlSZXZlYWwocmV2ZWFsRnJvbUNsaWVudFgoZ2V0Q2xpZW50WChlKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIG9uVXAoZSkgewogICAgICBpZiAoIWRyYWdnaW5nKSByZXR1cm47CiAgICAgIGRyYWdnaW5nID0gZmFsc2U7CiAgICAgIGlmIChwb2ludGVySWQgIT0gbnVsbCAmJiBjYXJkLnJlbGVhc2VQb2ludGVyQ2FwdHVyZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjYXJkLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShwb2ludGVySWQpOwogICAgICAgIH0gY2F0Y2ggKGVycikge30KICAgICAgfQogICAgICBwb2ludGVySWQgPSBudWxsOwogICAgICBjYXJkLmNsYXNzTGlzdC5yZW1vdmUoJ3NjcnViYmluZycpOwogICAgICBpZiAobW92ZWREdXJpbmdEcmFnKSB7CiAgICAgICAgdmFyIGhvc3QgPSBjYXJkLmNsb3Nlc3QgJiYgY2FyZC5jbG9zZXN0KCcudi1pbWdjYXJkJyk7CiAgICAgICAgaWYgKGhvc3QpIGhvc3QuZGF0YXNldC5zY3J1YmJlZCA9ICcxJzsKICAgICAgfQogICAgICBzY2hlZHVsZVJlc3VtZSgxODAwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRDbGllbnRYKGUpIHsKICAgICAgaWYgKGUuY2xpZW50WCAhPSBudWxsKSByZXR1cm4gZS5jbGllbnRYOwogICAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlc1swXSkgcmV0dXJuIGUudG91Y2hlc1swXS5jbGllbnRYOwogICAgICBpZiAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKSByZXR1cm4gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBmdW5jdGlvbiBvbktleShlKSB7CiAgICAgIGlmICghaW50ZXJhY3RpdmUpIHJldHVybjsKICAgICAgdmFyIGRlbHRhID0gMDsKICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dMZWZ0JykgZGVsdGEgPSAtMC4wNTsKICAgICAgZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1JpZ2h0JykgZGVsdGEgPSAwLjA1OwogICAgICBlbHNlIGlmIChlLmtleSA9PT0gJ0hvbWUnKSB7CiAgICAgICAgYXBwbHlSZXZlYWwoMCk7CiAgICAgICAgYWZ0ZXJGb2N1c0FkanVzdCgpOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdFbmQnKSB7CiAgICAgICAgYXBwbHlSZXZlYWwoMSk7CiAgICAgICAgYWZ0ZXJGb2N1c0FkanVzdCgpOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSByZXR1cm47CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgc3RvcEFuaW0oKTsKICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCdzY3J1YmJpbmcnKTsKICAgICAgYXBwbHlSZXZlYWwocmV2ZWFsICsgZGVsdGEpOwogICAgICBhZnRlckZvY3VzQWRqdXN0KCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWZ0ZXJGb2N1c0FkanVzdCgpIHsKICAgICAgaWYgKHJlc3VtZVRpbWVyKSBjbGVhclRpbWVvdXQocmVzdW1lVGltZXIpOwogICAgICByZXN1bWVUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGNhcmQuY2xhc3NMaXN0LnJlbW92ZSgnc2NydWJiaW5nJyk7CiAgICAgICAgYW5pbUZyb20gPSAwLjI7CiAgICAgICAgYW5pbVRvID0gMC44OwogICAgICAgIHN0YXJ0QW5pbSgpOwogICAgICB9LCAyMjAwKTsKICAgIH0KCiAgICBpZiAoaW50ZXJhY3RpdmUpIHsKICAgICAgaWYgKHdpbmRvdy5Qb2ludGVyRXZlbnQpIHsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgb25Eb3duKTsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgb25Nb3ZlKTsKICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgb25VcCk7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBvblVwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uRG93bik7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW92ZSk7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblVwKTsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvbkRvd24sIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKICAgICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uTW92ZSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVXApOwogICAgICB9CiAgICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5KTsKICAgICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghZHJhZ2dpbmcpIHN0b3BBbmltKCk7CiAgICAgIH0pOwogICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFkcmFnZ2luZyAmJiAhcmVzdW1lVGltZXIpIHNjaGVkdWxlUmVzdW1lKDQwMCk7CiAgICAgIH0pOwogICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZnVuY3Rpb24gKCkgewogICAgICAgIHN0b3BBbmltKCk7CiAgICAgIH0pOwogICAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgY2FyZC5jbGFzc0xpc3QucmVtb3ZlKCdzY3J1YmJpbmcnKTsKICAgICAgICBzY2hlZHVsZVJlc3VtZSg0MDApOwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgaW8gPSBudWxsOwogICAgZnVuY3Rpb24gc2V0dXBWaXNpYmlsaXR5KCkgewogICAgICBpZiAoIWludGVyYWN0aXZlIHx8IHJlZHVjZU1vdGlvbikgcmV0dXJuOwogICAgICBpZiAoJ0ludGVyc2VjdGlvbk9ic2VydmVyJyBpbiB3aW5kb3cpIHsKICAgICAgICBpbyA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigKICAgICAgICAgIGZ1bmN0aW9uIChlbnRyaWVzKSB7CiAgICAgICAgICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW4pIHsKICAgICAgICAgICAgICBpZiAoZW4uaXNJbnRlcnNlY3RpbmcpIHsKICAgICAgICAgICAgICAgIGlmICghZHJhZ2dpbmcgJiYgIXJlc3VtZVRpbWVyKSBzdGFydEFuaW0oKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3RvcEFuaW0oKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIHsgdGhyZXNob2xkOiAwLjI1IH0KICAgICAgICApOwogICAgICAgIGlvLm9ic2VydmUoZmVlZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RhcnRBbmltKCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbml0KCkgewogICAgICBhcHBseVJldmVhbCgwLjUpOwogICAgICBzZXR1cFZpc2liaWxpdHkoKTsKICAgICAgaWYgKCFpbykgewogICAgICAgIHN0YXJ0QW5pbSgpOwogICAgICB9CiAgICB9CiAgICBpZiAoYWZ0ZXJJbWcuY29tcGxldGUpIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGluaXQpOwogICAgfSBlbHNlIHsKICAgICAgYWZ0ZXJJbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaW5pdCk7CiAgICAgIH0pOwogICAgICBhZnRlckltZy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaW5pdCk7CiAgICAgIH0pOwogICAgfQoKICAgIGZlZWQuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3koKSB7CiAgICAgIGRlc3Ryb3llZCA9IHRydWU7CiAgICAgIHN0b3BBbmltKCk7CiAgICAgIGlmIChyZXN1bWVUaW1lcikgY2xlYXJUaW1lb3V0KHJlc3VtZVRpbWVyKTsKICAgICAgaWYgKGlvKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlvLmRpc2Nvbm5lY3QoKTsKICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgIGlvID0gbnVsbDsKICAgICAgfQogICAgICBpZiAoIXdpbmRvdy5Qb2ludGVyRXZlbnQpIHsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlKTsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uVXApOwogICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVXApOwogICAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBvblVwKTsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIG9uVXApOwogICAgICB9CiAgICB9OwogICAgZmVlZC5zZXRSZXZlYWwgPSBhcHBseVJldmVhbDsKCiAgICByZXR1cm4gZmVlZDsKICB9OwoKICB1aS5jb25mZXR0aSA9IGZ1bmN0aW9uIGNvbmZldHRpKG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgaWYgKHByZWZlcnNSZWR1Y2VkTW90aW9uKCkpIHJldHVybjsKCiAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3YtY29uZmV0dGktY2FudmFzJyk7CiAgICBpZiAoIWNhbnZhcykgewogICAgICBjYW52YXMgPSBlbCgnY2FudmFzJywgeyBpZDogJ3YtY29uZmV0dGktY2FudmFzJywgY2xhc3M6ICd2LWNvbmZldHRpJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0pOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7CiAgICB9CiAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CiAgICB2YXIgZHByID0gTWF0aC5taW4od2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSwgMik7CgogICAgZnVuY3Rpb24gcmVzaXplKCkgewogICAgICBjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKHdpbmRvdy5pbm5lcldpZHRoICogZHByKTsKICAgICAgY2FudmFzLmhlaWdodCA9IE1hdGguZmxvb3Iod2luZG93LmlubmVySGVpZ2h0ICogZHByKTsKICAgICAgY2FudmFzLnN0eWxlLndpZHRoID0gd2luZG93LmlubmVyV2lkdGggKyAncHgnOwogICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0ICsgJ3B4JzsKICAgIH0KICAgIHJlc2l6ZSgpOwoKICAgIHZhciBXID0gd2luZG93LmlubmVyV2lkdGg7CiAgICB2YXIgSCA9IHdpbmRvdy5pbm5lckhlaWdodDsKCiAgICB2YXIgcGFsZXR0ZSA9IG9wdHMuY29sb3JzIHx8IFsKICAgICAgJyM1Mjk3RjgnLAogICAgICAnIzgyRDZGRicsCiAgICAgICcjMEE4NEZGJywKICAgICAgJyNmZmZmZmYnLAogICAgICAnI0M5RTdGRicsCiAgICAgICcjMDBCMjhCJwogICAgXTsKCiAgICB2YXIgY291bnQgPSBvcHRzLmNvdW50IHx8IChXIDwgNjQwID8gOTAgOiAxNTApOwogICAgdmFyIG9yaWdpblggPSBvcHRzLnggIT0gbnVsbCA/IG9wdHMueCA6IFcgLyAyOwogICAgdmFyIG9yaWdpblkgPSBvcHRzLnkgIT0gbnVsbCA/IG9wdHMueSA6IEggKiAwLjM0OwogICAgdmFyIHNwcmVhZCA9IG9wdHMuc3ByZWFkIHx8IE1hdGguUEk7CiAgICB2YXIgcG93ZXIgPSBvcHRzLnBvd2VyIHx8IDEzOwogICAgdmFyIGdyYXZpdHkgPSAwLjMyOwogICAgdmFyIGRyYWcgPSAwLjAwODU7CgogICAgdmFyIHBpZWNlcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIHZhciBhbmdsZSA9IC1NYXRoLlBJIC8gMiArIChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIHNwcmVhZDsKICAgICAgdmFyIHZlbG9jaXR5ID0gcG93ZXIgKiAoMC41NSArIE1hdGgucmFuZG9tKCkgKiAwLjY1KTsKICAgICAgcGllY2VzLnB1c2goewogICAgICAgIHg6IG9yaWdpblgsCiAgICAgICAgeTogb3JpZ2luWSwKICAgICAgICB2eDogTWF0aC5jb3MoYW5nbGUpICogdmVsb2NpdHkgKyAoTWF0aC5yYW5kb20oKSAtIDAuNSkgKiAyLAogICAgICAgIHZ5OiBNYXRoLnNpbihhbmdsZSkgKiB2ZWxvY2l0eSwKICAgICAgICB3OiA2ICsgTWF0aC5yYW5kb20oKSAqIDYsCiAgICAgICAgaDogOCArIE1hdGgucmFuZG9tKCkgKiA4LAogICAgICAgIHJvdDogTWF0aC5yYW5kb20oKSAqIE1hdGguUEkgKiAyLAogICAgICAgIHZyOiAoTWF0aC5yYW5kb20oKSAtIDAuNSkgKiAwLjQsCiAgICAgICAgY29sb3I6IHBhbGV0dGVbKE1hdGgucmFuZG9tKCkgKiBwYWxldHRlLmxlbmd0aCkgfCAwXSwKICAgICAgICBzaGFwZTogTWF0aC5yYW5kb20oKSA8IDAuMzIgPyAnY2lyY2xlJyA6ICdyZWN0JywKICAgICAgICB3b2JibGU6IE1hdGgucmFuZG9tKCkgKiBNYXRoLlBJICogMiwKICAgICAgICB3b2JibGVTcGVlZDogMC4wNiArIE1hdGgucmFuZG9tKCkgKiAwLjA2LAogICAgICAgIGxpZmU6IDAsCiAgICAgICAgdHRsOiAxNTAgKyBNYXRoLnJhbmRvbSgpICogNzAKICAgICAgfSk7CiAgICB9CgogICAgdmFyIHJ1bm5pbmcgPSB0cnVlOwogICAgdmFyIHN0YXJ0VHMgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIHZhciBtYXhNcyA9IG9wdHMuZHVyYXRpb24gfHwgMzIwMDsKCiAgICBmdW5jdGlvbiBmcmFtZSh0cykgewogICAgICBpZiAoIXJ1bm5pbmcpIHJldHVybjsKICAgICAgdmFyIGFsaXZlQW55ID0gZmFsc2U7CiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKICAgICAgY3R4LnNhdmUoKTsKICAgICAgY3R4LnNjYWxlKGRwciwgZHByKTsKCiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgcGllY2VzLmxlbmd0aDsgcCsrKSB7CiAgICAgICAgdmFyIHBjID0gcGllY2VzW3BdOwogICAgICAgIGlmIChwYy5saWZlID4gcGMudHRsKSBjb250aW51ZTsKICAgICAgICBhbGl2ZUFueSA9IHRydWU7CiAgICAgICAgcGMubGlmZSsrOwogICAgICAgIHBjLnZ5ICs9IGdyYXZpdHk7CiAgICAgICAgcGMudnggKj0gMSAtIGRyYWc7CiAgICAgICAgcGMudnkgKj0gMSAtIGRyYWc7CiAgICAgICAgcGMud29iYmxlICs9IHBjLndvYmJsZVNwZWVkOwogICAgICAgIHBjLnggKz0gcGMudnggKyBNYXRoLnNpbihwYy53b2JibGUpICogMC44OwogICAgICAgIHBjLnkgKz0gcGMudnk7CiAgICAgICAgcGMucm90ICs9IHBjLnZyOwoKICAgICAgICB2YXIgYWxwaGEgPSBwYy5saWZlID4gcGMudHRsIC0gMzYgPyBNYXRoLm1heCgwLCAocGMudHRsIC0gcGMubGlmZSkgLyAzNikgOiAxOwogICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IGFscGhhOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSBwYy5jb2xvcjsKICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgIGN0eC50cmFuc2xhdGUocGMueCwgcGMueSk7CiAgICAgICAgY3R4LnJvdGF0ZShwYy5yb3QpOwogICAgICAgIGlmIChwYy5zaGFwZSA9PT0gJ2NpcmNsZScpIHsKICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICAgIGN0eC5hcmMoMCwgMCwgcGMudyAvIDIsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgICAgIGN0eC5maWxsKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBzdyA9IHBjLncgKiAoMC41ICsgTWF0aC5hYnMoTWF0aC5jb3MocGMud29iYmxlKSkgKiAwLjYpOwogICAgICAgICAgY3R4LmZpbGxSZWN0KC1zdyAvIDIsIC1wYy5oIC8gMiwgc3csIHBjLmgpOwogICAgICAgIH0KICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICB9CiAgICAgIGN0eC5yZXN0b3JlKCk7CgogICAgICB2YXIgZWxhcHNlZCA9IHRzIC0gc3RhcnRUczsKICAgICAgaWYgKGFsaXZlQW55ICYmIGVsYXBzZWQgPCBtYXhNcykgewogICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcnVubmluZyA9IGZhbHNlOwogICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKICAgICAgICBpZiAoY2FudmFzLnBhcmVudE5vZGUpIGNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNhbnZhcyk7CiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uUmVzaXplKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIG9uUmVzaXplKCkgewogICAgICByZXNpemUoKTsKICAgIH0KICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblJlc2l6ZSk7CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnJhbWUpOwogIH07Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL3VpL2RvbS5qcyA9PT09PSAqLwoKKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwogIHZhciB1aSA9IChWLnVpID0gVi51aSB8fCB7fSk7CgogIHZhciBTVkdfTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOwoKICBmdW5jdGlvbiBlbCh0YWcsIGF0dHJzKSB7CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKCiAgICBpZiAoYXR0cnMgJiYgdHlwZW9mIGF0dHJzID09PSAnb2JqZWN0JyAmJiAhaXNOb2RlKGF0dHJzKSAmJiAhQXJyYXkuaXNBcnJheShhdHRycykpIHsKICAgICAgYXBwbHlBdHRycyhub2RlLCBhdHRycyk7CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CgogICAgICBhcHBlbmRDaGlsZChub2RlLCBhdHRycyk7CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgYXBwZW5kQ2hpbGQobm9kZSwgYXJndW1lbnRzW2ldKTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gYXBwbHlBdHRycyhub2RlLCBhdHRycykgewogICAgdmFyIHJlZkZuID0gbnVsbDsKICAgIGZvciAodmFyIGtleSBpbiBhdHRycykgewogICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywga2V5KSkgY29udGludWU7CiAgICAgIHZhciB2YWwgPSBhdHRyc1trZXldOwogICAgICBpZiAodmFsID09IG51bGwpIGNvbnRpbnVlOwoKICAgICAgaWYgKGtleSA9PT0gJ2NsYXNzJyB8fCBrZXkgPT09ICdjbGFzc05hbWUnKSB7CiAgICAgICAgbm9kZS5jbGFzc05hbWUgPSBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKSA6IFN0cmluZyh2YWwpOwogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3N0eWxlJykgewogICAgICAgIGFwcGx5U3R5bGUobm9kZSwgdmFsKTsKICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdkYXRhc2V0JyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JykgewogICAgICAgIGZvciAodmFyIGRrIGluIHZhbCkgewogICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWwsIGRrKSAmJiB2YWxbZGtdICE9IG51bGwpIHsKICAgICAgICAgICAgbm9kZS5kYXRhc2V0W2RrXSA9IFN0cmluZyh2YWxbZGtdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoa2V5LmluZGV4T2YoJ2RhdGEtJykgPT09IDApIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWwpKTsKICAgICAgfSBlbHNlIGlmIChrZXkuaW5kZXhPZignYXJpYS0nKSA9PT0gMCkgewogICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGtleSwgU3RyaW5nKHZhbCkpOwogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2h0bWwnIHx8IGtleSA9PT0gJ2lubmVySFRNTCcpIHsKICAgICAgICBub2RlLmlubmVySFRNTCA9IFN0cmluZyh2YWwpOwogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3RleHQnIHx8IGtleSA9PT0gJ3RleHRDb250ZW50JykgewogICAgICAgIG5vZGUudGV4dENvbnRlbnQgPSBTdHJpbmcodmFsKTsKICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyZWYnICYmIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICByZWZGbiA9IHZhbDsKICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyb2xlJykgewogICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdyb2xlJywgU3RyaW5nKHZhbCkpOwogICAgICB9IGVsc2UgaWYgKGtleS5sZW5ndGggPiAyICYmIGtleS5zbGljZSgwLCAyKSA9PT0gJ29uJyAmJiBrZXlbMl0gPT09IGtleVsyXS50b1VwcGVyQ2FzZSgpKSB7CgogICAgICAgIHZhciBldnQgPSBrZXkuc2xpY2UoMikudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2dCwgdmFsKTsKICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJiB0eXBlb2YgdmFsWzBdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCB2YWxbMF0sIHZhbFsxXSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3ZhbHVlJyB8fCBrZXkgPT09ICdjaGVja2VkJyB8fCBrZXkgPT09ICdkaXNhYmxlZCcgfHwga2V5ID09PSAnc2VsZWN0ZWQnKSB7CgogICAgICAgIG5vZGVba2V5XSA9IHZhbDsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHsKICAgICAgICBpZiAodmFsKSBub2RlLnNldEF0dHJpYnV0ZShrZXksICcnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWwpKTsKICAgICAgfQogICAgfQogICAgaWYgKHJlZkZuKSByZWZGbihub2RlKTsKICB9CgogIGZ1bmN0aW9uIGFwcGx5U3R5bGUobm9kZSwgdmFsKSB7CiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHsKICAgICAgbm9kZS5zdHlsZS5jc3NUZXh0ID0gdmFsOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7CiAgICAgIGZvciAodmFyIHByb3AgaW4gdmFsKSB7CiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsLCBwcm9wKSkgY29udGludWU7CiAgICAgICAgdmFyIHB2ID0gdmFsW3Byb3BdOwogICAgICAgIGlmIChwdiA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICBpZiAocHJvcC5pbmRleE9mKCctLScpID09PSAwKSB7CiAgICAgICAgICBub2RlLnN0eWxlLnNldFByb3BlcnR5KHByb3AsIFN0cmluZyhwdikpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnN0eWxlW3Byb3BdID0gdHlwZW9mIHB2ID09PSAnbnVtYmVyJyA/IHB2ICsgKHVuaXRsZXNzU3R5bGVbcHJvcF0gPyAnJyA6ICdweCcpIDogU3RyaW5nKHB2KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZhciB1bml0bGVzc1N0eWxlID0gewogICAgb3BhY2l0eTogMSwgekluZGV4OiAxLCBmb250V2VpZ2h0OiAxLCBsaW5lSGVpZ2h0OiAxLCBmbGV4OiAxLCBmbGV4R3JvdzogMSwKICAgIGZsZXhTaHJpbms6IDEsIG9yZGVyOiAxLCB6b29tOiAxLCBncmlkUm93OiAxLCBncmlkQ29sdW1uOiAxLCBjb2x1bW5Db3VudDogMQogIH07CgogIGZ1bmN0aW9uIGFwcGVuZENoaWxkKG5vZGUsIGNoaWxkKSB7CiAgICBpZiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZCA9PT0gZmFsc2UgfHwgY2hpbGQgPT09IHRydWUpIHJldHVybjsKICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkLmxlbmd0aDsgaSsrKSBhcHBlbmRDaGlsZChub2RlLCBjaGlsZFtpXSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpc05vZGUoY2hpbGQpKSB7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpOwogICAgICByZXR1cm47CiAgICB9CgogICAgbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoY2hpbGQpKSk7CiAgfQoKICBmdW5jdGlvbiBpc05vZGUoeCkgewogICAgcmV0dXJuIHggJiYgdHlwZW9mIHggPT09ICdvYmplY3QnICYmIHR5cGVvZiB4Lm5vZGVUeXBlID09PSAnbnVtYmVyJzsKICB9CgogIHZhciBJQ09OUyA9IHsKCiAgICAnc3BhcmtsZXMnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTEyIDNsMS42IDQuNEwxOCA5bC00LjQgMS42TDEyIDE1bC0xLjYtNC40TDYgOWw0LjQtMS42eicgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTguNSAxNC41bC43IDEuOSAxLjkuNy0xLjkuNy0uNyAxLjktLjctMS45LTEuOS0uNyAxLjktLjd6JyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ001LjUgMTQuNWwuNTUgMS41IDEuNS41NS0xLjUuNTVMNS41IDE5bC0uNTUtMS40NS0xLjUtLjU1IDEuNS0uNTV6JyB9CiAgICBdLAogICAgJ3dhbmQnOiBbCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTUsIHkxOiA0LCB4MjogMjAsIHkyOiA5IH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTE3LjUgNi41TDUgMTknIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTE2LjUgMi4ybC41IDEuNSAxLjUuNS0xLjUuNS0uNSAxLjUtLjUtMS41LTEuNS0uNSAxLjUtLjV6JyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ00yMS40IDkuNGwuMzUgMS4xIDEuMS4zNS0xLjEuMzUtLjM1IDEuMS0uMzUtMS4xLTEuMS0uMzUgMS4xLS4zNXonIH0KICAgIF0sCiAgICAnd2FuZC1zdGFycyc6IFsKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNNSAxOUwxNiA4JyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xNCA2bDIgMicgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTggM2wuNiAxLjdMMjAuMyA1LjMgMTguNiA2IDE4IDcuNyAxNy40IDZsLTEuNy0uN0wxNy40IDQuN3onIH0sCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiAyMC41LCBjeTogMTEsIHI6IDAuOSwgZmlsbDogJ2N1cnJlbnRDb2xvcicgfSwKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDgsIGN5OiA0LCByOiAwLjksIGZpbGw6ICdjdXJyZW50Q29sb3InIH0KICAgIF0sCiAgICAnYm9sdCc6ICdNMTMgMkw0IDE0aDZsLTEgOCA5LTEyaC02bDEtOHonLAoKICAgICdwaG90byc6IFsKICAgICAgeyB0OiAncmVjdCcsIHg6IDMsIHk6IDQsIHdpZHRoOiAxOCwgaGVpZ2h0OiAxNiwgcng6IDMgfSwKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDguNSwgY3k6IDkuNSwgcjogMS42IH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTUgMThsNC41LTQuNWEyIDIgMCAwIDEgMi44IDBMMTkgMjAnIH0KICAgIF0sCiAgICAnZ3JpZCc6IFsKICAgICAgeyB0OiAncmVjdCcsIHg6IDMuNSwgeTogMy41LCB3aWR0aDogNywgaGVpZ2h0OiA3LCByeDogMS42IH0sCiAgICAgIHsgdDogJ3JlY3QnLCB4OiAxMy41LCB5OiAzLjUsIHdpZHRoOiA3LCBoZWlnaHQ6IDcsIHJ4OiAxLjYgfSwKICAgICAgeyB0OiAncmVjdCcsIHg6IDMuNSwgeTogMTMuNSwgd2lkdGg6IDcsIGhlaWdodDogNywgcng6IDEuNiB9LAogICAgICB7IHQ6ICdyZWN0JywgeDogMTMuNSwgeTogMTMuNSwgd2lkdGg6IDcsIGhlaWdodDogNywgcng6IDEuNiB9CiAgICBdLAogICAgJ2ZvbGRlcic6ICdNMyA3YTIgMiAwIDAgMSAyLTJoNGwyIDIuNGg2YTIgMiAwIDAgMSAyIDJWMThhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ6JywKICAgICdmaWxtJzogWwogICAgICB7IHQ6ICdyZWN0JywgeDogMywgeTogNC41LCB3aWR0aDogMTgsIGhlaWdodDogMTUsIHJ4OiAyLjUgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiA3LjUsIHkxOiA0LjUsIHgyOiA3LjUsIHkyOiAxOS41IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTYuNSwgeTE6IDQuNSwgeDI6IDE2LjUsIHkyOiAxOS41IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMywgeTE6IDkuMiwgeDI6IDcuNSwgeTI6IDkuMiB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDMsIHkxOiAxNC44LCB4MjogNy41LCB5MjogMTQuOCB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDE2LjUsIHkxOiA5LjIsIHgyOiAyMSwgeTI6IDkuMiB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDE2LjUsIHkxOiAxNC44LCB4MjogMjEsIHkyOiAxNC44IH0KICAgIF0sCiAgICAncGhvdG8tYmFkZ2UtcGx1cyc6IFsKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMjEgMTIuNVY3YTIgMiAwIDAgMC0yLTJINWEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoNy41JyB9LAogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogOC41LCBjeTogOS41LCByOiAxLjQgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNNSAxNi41bDQtNGExLjggMS44IDAgMCAxIDIuNSAwbDIgMicgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxOC41LCB5MTogMTUsIHgyOiAxOC41LCB5MjogMjIgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxNSwgeTE6IDE4LjUsIHgyOiAyMiwgeTI6IDE4LjUgfQogICAgXSwKCiAgICAncGx1cyc6IFsKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDUsIHgyOiAxMiwgeTI6IDE5IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogNSwgeTE6IDEyLCB4MjogMTksIHkyOiAxMiB9CiAgICBdLAogICAgJ2Fycm93LXVwJzogWwogICAgICB7IHQ6ICdsaW5lJywgeDE6IDEyLCB5MTogMjAsIHgyOiAxMiwgeTI6IDUgfSwKICAgICAgeyB0OiAncG9seWxpbmUnLCBwb2ludHM6ICc1LDEyIDEyLDUgMTksMTInIH0KICAgIF0sCiAgICAnc3F1YXJlLWFycm93LXVwJzogWwogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xNiA1aDJhMiAyIDAgMCAxIDIgMnYxMWEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTItMlY3YTIgMiAwIDAgMSAyLTJoMicgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDMsIHgyOiAxMiwgeTI6IDE0IH0sCiAgICAgIHsgdDogJ3BvbHlsaW5lJywgcG9pbnRzOiAnOC41LDYuNSAxMiwzIDE1LjUsNi41JyB9CiAgICBdLAogICAgJ2Fycm93LWRvd24tY2lyY2xlJzogWwogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTIsIGN5OiAxMiwgcjogOSB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDEyLCB5MTogNy41LCB4MjogMTIsIHkyOiAxNiB9LAogICAgICB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzguNSwxMi41IDEyLDE2IDE1LjUsMTIuNScgfQogICAgXSwKICAgICdhcnJvdy0yLWNpcmNsZXBhdGgnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTIwIDExYTggOCAwIDAgMC0xMy42LTQuNUw0IDknIH0sCiAgICAgIHsgdDogJ3BvbHlsaW5lJywgcG9pbnRzOiAnNCw0IDQsOSA5LDknIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTQgMTNhOCA4IDAgMCAwIDEzLjYgNC41TDIwIDE1JyB9LAogICAgICB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzIwLDIwIDIwLDE1IDE1LDE1JyB9CiAgICBdLAoKICAgICdoZWFydCc6ICdNMTIgMjBzLTctNC42LTkuMy05LjFDMS40IDguMyAyLjQgNS4zIDUgNC40YzEuOS0uNyAzLjkuMSA1IDEuOCAxLjEtMS43IDMuMS0yLjUgNS0xLjggMi42LjkgMy42IDMuOSAyLjMgNi41QzE5IDE1LjQgMTIgMjAgMTIgMjB6JywKICAgICdoZWFydC1maWxsJzogWwogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xMiAyMC4zcy03LjItNC43LTkuNS05LjNDMS4yIDguMiAyLjMgNSA1IDQuMWMyLS43IDQgLjIgNSAyIDEtMS44IDMtMi43IDUtMiAyLjcuOSAzLjggNC4xIDIuNSA2LjlDMTkuMiAxNS42IDEyIDIwLjMgMTIgMjAuM3onLCBmaWxsOiAnY3VycmVudENvbG9yJywgc3Ryb2tlOiAnbm9uZScgfQogICAgXSwKCiAgICAndHJhc2gnOiBbCiAgICAgIHsgdDogJ3BvbHlsaW5lJywgcG9pbnRzOiAnNCw3IDIwLDcnIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTkgN1Y1YTEuNSAxLjUgMCAwIDEgMS41LTEuNWgzQTEuNSAxLjUgMCAwIDEgMTUgNXYyJyB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ002IDdsMSAxMi41QTEuNSAxLjUgMCAwIDAgOC41IDIxaDdhMS41IDEuNSAwIDAgMCAxLjUtMS41TDE4IDcnIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTAsIHkxOiAxMSwgeDI6IDEwLCB5MjogMTcgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxNCwgeTE6IDExLCB4MjogMTQsIHkyOiAxNyB9CiAgICBdLAogICAgJ3htYXJrJzogWwogICAgICB7IHQ6ICdsaW5lJywgeDE6IDYsIHkxOiA2LCB4MjogMTgsIHkyOiAxOCB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDE4LCB5MTogNiwgeDI6IDYsIHkyOiAxOCB9CiAgICBdLAoKICAgICdjaGV2cm9uLWxlZnQnOiB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzE1LDUgOCwxMiAxNSwxOScgfSwKICAgICdjaGV2cm9uLXJpZ2h0JzogeyB0OiAncG9seWxpbmUnLCBwb2ludHM6ICc5LDUgMTYsMTIgOSwxOScgfSwKICAgICdjaGV2cm9uLWRvd24nOiB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzUsOSAxMiwxNiAxOSw5JyB9LAogICAgJ2NoZXZyb24tdXAnOiB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzUsMTUgMTIsOCAxOSwxNScgfSwKCiAgICAnbWFnbmlmeWluZ2dsYXNzJzogWwogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTEsIGN5OiAxMSwgcjogNi41IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTUuOCwgeTE6IDE1LjgsIHgyOiAyMSwgeTI6IDIxIH0KICAgIF0sCiAgICAnc2xpZGVyLWhvcml6b250YWwnOiBbCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMywgeTE6IDgsIHgyOiAyMSwgeTI6IDggfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAzLCB5MTogMTYsIHgyOiAyMSwgeTI6IDE2IH0sCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiA5LCBjeTogOCwgcjogMi40LCBmaWxsOiAndmFyKC0tc3VyZmFjZSwgdHJhbnNwYXJlbnQpJyB9LAogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTUsIGN5OiAxNiwgcjogMi40LCBmaWxsOiAndmFyKC0tc3VyZmFjZSwgdHJhbnNwYXJlbnQpJyB9CiAgICBdLAoKICAgICdnZWFyJzogWwogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTIsIGN5OiAxMiwgcjogMy4yIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTEyIDIuNWwxLjEgMi40IDIuNi0uNS41IDIuNiAyLjQgMS4xLTEuMSAyLjQgMS4xIDIuNC0yLjQgMS4xLS41IDIuNi0yLjYtLjVMMTIgMjEuNWwtMS4xLTIuNC0yLjYuNS0uNS0yLjYtMi40LTEuMSAxLjEtMi40LTEuMS0yLjQgMi40LTEuMS41LTIuNiAyLjYuNXonIH0KICAgIF0sCiAgICAncGVyc29uLWNpcmNsZSc6IFsKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDEyLCBjeTogMTIsIHI6IDkgfSwKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDEyLCBjeTogMTAsIHI6IDMgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNNi41IDE4LjVhNiA2IDAgMCAxIDExIDAnIH0KICAgIF0sCiAgICAnY3Jvd24nOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTMgOGwzLjUgMy41TDEyIDVsNS41IDYuNUwyMSA4bC0xLjUgMTAuNWgtMTV6JyB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDQuNSwgeTE6IDIxLCB4MjogMTkuNSwgeTI6IDIxIH0KICAgIF0sCgogICAgJ2xpbmUtMyc6IFsKICAgICAgeyB0OiAnbGluZScsIHgxOiA0LCB5MTogNywgeDI6IDIwLCB5MjogNyB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDQsIHkxOiAxMiwgeDI6IDIwLCB5MjogMTIgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiA0LCB5MTogMTcsIHgyOiAyMCwgeTI6IDE3IH0KICAgIF0sCiAgICAnY2hlY2ttYXJrJzogeyB0OiAncG9seWxpbmUnLCBwb2ludHM6ICc1LDEyLjUgMTAsMTcuNSAxOS41LDYuNScgfSwKICAgICdwZW5jaWwnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTQgMjBsMS4yLTQuMkwxNS41IDUuNWEyIDIgMCAwIDEgMi44IDBsLjIuMmEyIDIgMCAwIDEgMCAyLjhMOC4yIDE4Ljh6JyB9LAogICAgICB7IHQ6ICdsaW5lJywgeDE6IDE0LCB5MTogNywgeDI6IDE3LCB5MjogMTAgfQogICAgXSwKCiAgICAnaW5mby1jaXJjbGUnOiBbCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiAxMiwgY3k6IDEyLCByOiA5IH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTIsIHkxOiAxMSwgeDI6IDEyLCB5MjogMTYgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDgsIHgyOiAxMi4wMSwgeTI6IDggfQogICAgXSwKICAgICd0cmlhbmdsZS1hbGVydCc6IFsKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTAuMyAzLjkgMiAxOGEyIDIgMCAwIDAgMS43IDNoMTYuNmEyIDIgMCAwIDAgMS43LTNMMTMuNyAzLjlhMiAyIDAgMCAwLTMuNCAweicgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDksIHgyOiAxMiwgeTI6IDEzLjUgfSwKICAgICAgeyB0OiAnbGluZScsIHgxOiAxMiwgeTE6IDE3LCB4MjogMTIuMDEsIHkyOiAxNyB9CiAgICBdLAoKICAgICdib29rbWFyayc6IHsgdDogJ3BhdGgnLCBkOiAnTTYgNGExIDEgMCAwIDEgMS0xaDEwYTEgMSAwIDAgMSAxIDF2MTdsLTYtNC02IDR6JyB9LAogICAgJ2RvYy1vbi1kb2MnOiBbCiAgICAgIHsgdDogJ3JlY3QnLCB4OiA4LCB5OiA4LCB3aWR0aDogMTIsIGhlaWdodDogMTMsIHJ4OiAyIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTE2IDhWNWEyIDIgMCAwIDAtMi0ySDZhMiAyIDAgMCAwLTIgMnYxMWEyIDIgMCAwIDAgMiAyaDInIH0KICAgIF0sCiAgICAnbGluayc6IFsKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNOSAxNWw2LTYnIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTEwLjUgNy41bDEuOC0xLjhhMy41IDMuNSAwIDAgMSA1IDVsLTEuOCAxLjgnIH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTEzLjUgMTYuNWwtMS44IDEuOGEzLjUgMy41IDAgMCAxLTUtNWwxLjgtMS44JyB9CiAgICBdLAogICAgJ2dpZnQnOiBbCiAgICAgIHsgdDogJ3JlY3QnLCB4OiA0LCB5OiA5LCB3aWR0aDogMTYsIGhlaWdodDogMTEsIHJ4OiAxLjUgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMy41IDloMTd2My41aC0xN3onIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTIsIHkxOiA5LCB4MjogMTIsIHkyOiAyMCB9LAogICAgICB7IHQ6ICdwYXRoJywgZDogJ00xMiA5QzEyIDYgMTAuNSA0LjUgOC44IDQuNUEyLjMgMi4zIDAgMCAwIDguOCA5eicgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNMTIgOWMwLTMgMS41LTQuNSAzLjItNC41QTIuMyAyLjMgMCAwIDEgMTUuMiA5eicgfQogICAgXSwKICAgICdmbGFtZSc6IHsgdDogJ3BhdGgnLCBkOiAnTTEyIDNjMS41IDMgNC41IDQuNSA0LjUgOC41QTQuNSA0LjUgMCAwIDEgMTIgMTZhNC41IDQuNSAwIDAgMS00LjUtNC41YzAtMiAxLTMgMS44LTMuOEM5IDkgMTAgOS41IDEwLjUgMTBjLjQtMi41LS41LTQuNyAxLjUtN3onIH0sCiAgICAnbG9jayc6IFsKICAgICAgeyB0OiAncmVjdCcsIHg6IDUsIHk6IDExLCB3aWR0aDogMTQsIGhlaWdodDogOSwgcng6IDIgfSwKICAgICAgeyB0OiAncGF0aCcsIGQ6ICdNOCAxMVY4YTQgNCAwIDAgMSA4IDB2MycgfQogICAgXSwKICAgICdsb2dvdXQnOiBbCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTE1IDRoMmEyIDIgMCAwIDEgMiAydjEyYTIgMiAwIDAgMS0yIDJoLTInIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogNCwgeTE6IDEyLCB4MjogMTUsIHkyOiAxMiB9LAogICAgICB7IHQ6ICdwb2x5bGluZScsIHBvaW50czogJzgsOCA0LDEyIDgsMTYnIH0KICAgIF0sCiAgICAnaGVscC1jaXJjbGUnOiBbCiAgICAgIHsgdDogJ2NpcmNsZScsIGN4OiAxMiwgY3k6IDEyLCByOiA5IH0sCiAgICAgIHsgdDogJ3BhdGgnLCBkOiAnTTkuNSA5LjVhMi41IDIuNSAwIDEgMSAzLjQgMi4zYy0uOC40LTEuNCAxLTEuNCAyLjInIH0sCiAgICAgIHsgdDogJ2xpbmUnLCB4MTogMTEuNSwgeTE6IDE3LCB4MjogMTEuNTEsIHkyOiAxNyB9CiAgICBdLAogICAgJ2VsbGlwc2lzJzogWwogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogNSwgY3k6IDEyLCByOiAxLjIsIGZpbGw6ICdjdXJyZW50Q29sb3InLCBzdHJva2U6ICdub25lJyB9LAogICAgICB7IHQ6ICdjaXJjbGUnLCBjeDogMTIsIGN5OiAxMiwgcjogMS4yLCBmaWxsOiAnY3VycmVudENvbG9yJywgc3Ryb2tlOiAnbm9uZScgfSwKICAgICAgeyB0OiAnY2lyY2xlJywgY3g6IDE5LCBjeTogMTIsIHI6IDEuMiwgZmlsbDogJ2N1cnJlbnRDb2xvcicsIHN0cm9rZTogJ25vbmUnIH0KICAgIF0KICB9OwoKICB2YXIgQUxJQVMgPSB7CiAgICBnZW5lcmF0ZTogJ3NwYXJrbGVzJywKICAgIGxpYnJhcnk6ICdncmlkJywKICAgIGFkZDogJ3BsdXMnLAogICAgc2VuZDogJ2Fycm93LXVwJywKICAgIHNldHRpbmdzOiAnZ2VhcicsCiAgICBhY2NvdW50OiAncGVyc29uLWNpcmNsZScsCiAgICBmYXZvcml0ZTogJ2hlYXJ0JywKICAgICdmYXZvcml0ZS1maWxsJzogJ2hlYXJ0LWZpbGwnLAogICAgZGVsZXRlOiAndHJhc2gnLAogICAgc2hhcmU6ICdzcXVhcmUtYXJyb3ctdXAnLAogICAgZG93bmxvYWQ6ICdhcnJvdy1kb3duLWNpcmNsZScsCiAgICBzYXZlOiAnYXJyb3ctZG93bi1jaXJjbGUnLAogICAgY2xvc2U6ICd4bWFyaycsCiAgICBzZWFyY2g6ICdtYWduaWZ5aW5nZ2xhc3MnLAogICAgZmlsdGVyczogJ3NsaWRlci1ob3Jpem9udGFsJywKICAgIGZpbHRlcjogJ3NsaWRlci1ob3Jpem9udGFsJywKICAgIHZpZGVvOiAnZmlsbScsCiAgICBhbmltYXRlOiAnZmlsbScsCiAgICBjcmVkaXRzOiAnYm9sdCcsCiAgICBwYXl3YWxsOiAnY3Jvd24nLAogICAgaGFtYnVyZ2VyOiAnbGluZS0zJywKICAgIG1lbnU6ICdsaW5lLTMnLAogICAgY2hlY2s6ICdjaGVja21hcmsnLAogICAgZWRpdDogJ3BlbmNpbCcsCiAgICB1cGxvYWQ6ICdwaG90by1iYWRnZS1wbHVzJywKICAgIHZhcmlhdGlvbnM6ICdhcnJvdy0yLWNpcmNsZXBhdGgnLAogICAgcmVmcmVzaDogJ2Fycm93LTItY2lyY2xlcGF0aCcsCiAgICBiYWNrOiAnY2hldnJvbi1sZWZ0JywKICAgIGZvcndhcmQ6ICdjaGV2cm9uLXJpZ2h0JywKCiAgICBpbmZvOiAnaW5mby1jaXJjbGUnLAogICAgYWxlcnQ6ICd0cmlhbmdsZS1hbGVydCcsCiAgICB3YXJuaW5nOiAndHJpYW5nbGUtYWxlcnQnLAogICAgc3Bhcms6ICdzcGFya2xlcycsCiAgICBpbWFnZTogJ3Bob3RvJywKICAgICdoZWFydC5maWxsJzogJ2hlYXJ0LWZpbGwnLAogICAgaGVhcnRGaWxsOiAnaGVhcnQtZmlsbCcsCiAgICBjb3B5OiAnZG9jLW9uLWRvYycsCiAgICBtb3JlOiAnZWxsaXBzaXMnLAogICAgc29ydDogJ3NsaWRlci1ob3Jpem9udGFsJywKICAgIGNoZXZyb246ICdjaGV2cm9uLXJpZ2h0JywKICAgIGFycm93TGVmdDogJ2NoZXZyb24tbGVmdCcsCiAgICBhcnJvd1JpZ2h0OiAnY2hldnJvbi1yaWdodCcsCiAgICAnYXJyb3ctbGVmdCc6ICdjaGV2cm9uLWxlZnQnLAogICAgJ2Fycm93LXJpZ2h0JzogJ2NoZXZyb24tcmlnaHQnLAogICAgcHVibGlzaDogJ3NxdWFyZS1hcnJvdy11cCcsCiAgICBwaG90b1N0YWNrOiAnZ3JpZCcsCiAgICAncGhvdG8tc3RhY2snOiAnZ3JpZCcsCiAgICBoZWxwOiAnaGVscC1jaXJjbGUnLAogICAgcHJvZmlsZTogJ3BlcnNvbi1jaXJjbGUnCiAgfTsKCiAgdmFyIENBQ0hFID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgZnVuY3Rpb24gYnVpbGRTdmcobmFtZSkgewogICAgdmFyIHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsICdzdmcnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCAnMCAwIDI0IDI0Jyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcyNCcpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJzI0Jyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICdjdXJyZW50Q29sb3InKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICcxLjYnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lY2FwJywgJ3JvdW5kJyk7CiAgICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWpvaW4nLCAncm91bmQnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2ZvY3VzYWJsZScsICdmYWxzZScpOwogICAgc3ZnLmNsYXNzTGlzdC5hZGQoJ3YtaWNvbicpOwogICAgc3ZnLmNsYXNzTGlzdC5hZGQoJ3YtaWNvbi0tJyArIG5hbWUpOwoKICAgIHZhciBzcGVjID0gSUNPTlNbbmFtZV07CiAgICB2YXIgcGFydHMgPSB0eXBlb2Ygc3BlYyA9PT0gJ3N0cmluZycKICAgICAgPyBbeyB0OiAncGF0aCcsIGQ6IHNwZWMgfV0KICAgICAgOiAoQXJyYXkuaXNBcnJheShzcGVjKSA/IHNwZWMgOiBbc3BlY10pOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKICAgICAgc3ZnLmFwcGVuZENoaWxkKGJ1aWxkU2hhcGUocGFydHNbaV0pKTsKICAgIH0KICAgIHJldHVybiBzdmc7CiAgfQoKICBmdW5jdGlvbiBidWlsZFNoYXBlKHBhcnQpIHsKICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgcGFydC50IHx8ICdwYXRoJyk7CiAgICBmb3IgKHZhciBrIGluIHBhcnQpIHsKICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFydCwgaykgfHwgayA9PT0gJ3QnKSBjb250aW51ZTsKICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUodG9BdHRyKGspLCBTdHJpbmcocGFydFtrXSkpOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiB0b0F0dHIoaykgewogICAgcmV0dXJuIGs7CiAgfQoKICBmdW5jdGlvbiBpY29uKG5hbWUpIHsKICAgIHZhciBrZXkgPSBJQ09OU1tuYW1lXSA/IG5hbWUgOiAoQUxJQVNbbmFtZV0gfHwgbnVsbCk7CiAgICBpZiAoIWtleSkgewoKICAgICAgdmFyIGZiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgJ3N2ZycpOwogICAgICBmYi5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCAnMCAwIDI0IDI0Jyk7CiAgICAgIGZiLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMjQnKTsKICAgICAgZmIuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnMjQnKTsKICAgICAgZmIuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgIGZiLnNldEF0dHJpYnV0ZSgnZm9jdXNhYmxlJywgJ2ZhbHNlJyk7CiAgICAgIGZiLmNsYXNzTGlzdC5hZGQoJ3YtaWNvbicsICd2LWljb24tLXVua25vd24nKTsKICAgICAgdmFyIGRvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsICdjaXJjbGUnKTsKICAgICAgZG90LnNldEF0dHJpYnV0ZSgnY3gnLCAnMTInKTsKICAgICAgZG90LnNldEF0dHJpYnV0ZSgnY3knLCAnMTInKTsKICAgICAgZG90LnNldEF0dHJpYnV0ZSgncicsICcyLjQnKTsKICAgICAgZG90LnNldEF0dHJpYnV0ZSgnZmlsbCcsICdjdXJyZW50Q29sb3InKTsKICAgICAgZmIuYXBwZW5kQ2hpbGQoZG90KTsKICAgICAgaWYgKHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKCdbVi51aS5pY29uXSB1bmtub3duIGljb246JywgbmFtZSk7CiAgICAgIHJldHVybiBmYjsKICAgIH0KICAgIGlmICghQ0FDSEVba2V5XSkgQ0FDSEVba2V5XSA9IGJ1aWxkU3ZnKGtleSk7CiAgICByZXR1cm4gQ0FDSEVba2V5XS5jbG9uZU5vZGUodHJ1ZSk7CiAgfQoKICBpY29uLm5hbWVzID0gZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIE9iamVjdC5rZXlzKElDT05TKS5jb25jYXQoT2JqZWN0LmtleXMoQUxJQVMpKTsKICB9OwogIGljb24uaGFzID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgIHJldHVybiAhIShJQ09OU1tuYW1lXSB8fCBBTElBU1tuYW1lXSk7CiAgfTsKCiAgdWkuZWwgPSBlbDsKICB1aS5pY29uID0gaWNvbjsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvZmVlZC5qcyA9PT09PSAqLwooZnVuY3Rpb24gKCkgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIFYgPSB3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9OwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwoKICB2YXIgUEVSID0gMzA7CiAgdmFyIElOTElORV9ERUZBVUxUID0gMTI7CgogIHZhciBDWUNMRSA9IDUyMDA7CiAgdmFyIEZBREUgPSA5MDA7CiAgdmFyIEhPTERfQUZURVIgPSAxNDAwOwogIHZhciBTQ1JVQl9SRVNVTUUgPSAxNTAwOwogIHZhciBTQ1JVQl9USFJFU0hPTEQgPSA4OwoKICB2YXIgUFJFRklYID0gInZhbXBfd2ViX2N1cmF0aW9uXyI7CgogIHZhciBUQUdTID0gWwogICAgeyBrZXk6ICIiLCBsYWJlbDogIkFsbCIgfSwKICAgIHsga2V5OiAiaW50ZXJpb3IiLCBsYWJlbDogIkludGVyaW9ycyIgfSwKICAgIHsga2V5OiAiZXh0ZXJpb3IiLCBsYWJlbDogIkV4dGVyaW9ycyIgfSwKICAgIHsga2V5OiAic3RhZ2luZyIsIGxhYmVsOiAiU3RhZ2luZyIgfSwKICAgIHsga2V5OiAibGFuZHNjYXBpbmciLCBsYWJlbDogIkxhbmRzY2FwaW5nIiB9LAogICAgeyBrZXk6ICJhcmNoaXRlY3R1cmUiLCBsYWJlbDogIkFyY2hpdGVjdHVyZSIgfSwKICAgIHsga2V5OiAicmVhbGVzdGF0ZSIsIGxhYmVsOiAiUmVhbCBFc3RhdGUiIH0sCiAgICB7IGtleTogIm1pbmltYWxpc3QiLCBsYWJlbDogIk1pbmltYWxpc3QiIH0sCiAgICB7IGtleTogImx1eHVyeSIsIGxhYmVsOiAiTHV4dXJ5IiB9CiAgXTsKCiAgdmFyIEdSSURfU1RZTEVTID0gWwogICAgeyBrZXk6ICJhdXRvIiwgbGFiZWw6ICJBdXRvIiB9LAogICAgeyBrZXk6ICJvbmUiLCBsYWJlbDogIjEiLCBjb2xzOiAxIH0sCiAgICB7IGtleTogInR3byIsIGxhYmVsOiAiMiIsIGNvbHM6IDIgfSwKICAgIHsga2V5OiAidGhyZWUiLCBsYWJlbDogIjMiLCBjb2xzOiAzIH0sCiAgICB7IGtleTogImZvdXIiLCBsYWJlbDogIjQiLCBjb2xzOiA0IH0KICBdOwoKICB2YXIgQ0VMTF9NT0RFUyA9IFsKICAgIHsga2V5OiAiY3Jvc3NmYWRlIiwgbGFiZWw6ICJDcm9zc2ZhZGUiIH0sCiAgICB7IGtleTogImFmdGVyT25seSIsIGxhYmVsOiAiQWZ0ZXIgb25seSIgfSwKICAgIHsga2V5OiAic2NydWIiLCBsYWJlbDogIk1hbnVhbCBzY3J1YiIgfQogIF07CgogIHZhciBFRkZFQ1RTID0gWwogICAgeyBrZXk6ICJjcm9zc2ZhZGUiLCBsYWJlbDogIkNyb3NzZmFkZSIgfSwKICAgIHsga2V5OiAibHVtYUZhZGUiLCBsYWJlbDogIkx1bWEgRmFkZSIgfSwKICAgIHsga2V5OiAia2FsZWlkb3Njb3BlIiwgbGFiZWw6ICJLYWxlaWRvc2NvcGUiIH0sCiAgICB7IGtleTogImJsb29tRGlzc29sdmUiLCBsYWJlbDogIkJsb29tIERpc3NvbHZlIiB9LAogICAgeyBrZXk6ICJkaXNwbGFjZW1lbnQiLCBsYWJlbDogIkRpc3BsYWNlbWVudCIgfSwKICAgIHsga2V5OiAidm9ydGV4IiwgbGFiZWw6ICJWb3J0ZXgiIH0sCiAgICB7IGtleTogInpvb21CbHVyIiwgbGFiZWw6ICJab29tIEJsdXIiIH0sCiAgICB7IGtleTogImNyeXN0YWxsaXplIiwgbGFiZWw6ICJDcnlzdGFsbGl6ZSIgfSwKICAgIHsga2V5OiAiaHVlU2hpZnRTd2VlcCIsIGxhYmVsOiAiSHVlIFNoaWZ0IFN3ZWVwIiB9LAogICAgeyBrZXk6ICJwc3ljaGVkZWxpY0NvbWJvIiwgbGFiZWw6ICJQc3ljaGVkZWxpYyBDb21ibyIgfQogIF07CgogIHZhciBERUZBVUxUX1BSRUZTID0gewogICAgZ3JpZFN0eWxlOiAiYXV0byIsCiAgICBjZWxsTW9kZTogImNyb3NzZmFkZSIsCiAgICBlZmZlY3Q6ICJjcm9zc2ZhZGUiLAogICAgc3BlZWQ6IDEuMAogIH07CgogIGZ1bmN0aW9uIHJlZHVjZWRNb3Rpb24oKSB7CiAgICByZXR1cm4gISEod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIikubWF0Y2hlcyk7CiAgfQoKICBmdW5jdGlvbiBwcmVmR2V0KGtleSwgZmFsbGJhY2spIHsKICAgIHRyeSB7CiAgICAgIHZhciByYXcgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oUFJFRklYICsga2V5KTsKICAgICAgaWYgKHJhdyA9PSBudWxsKSByZXR1cm4gZmFsbGJhY2s7CiAgICAgIHJldHVybiBKU09OLnBhcnNlKHJhdyk7CiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxsYmFjazsgfQogIH0KCiAgZnVuY3Rpb24gcHJlZlNldChrZXksIHZhbCkgewogICAgdHJ5IHsgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFBSRUZJWCArIGtleSwgSlNPTi5zdHJpbmdpZnkodmFsKSk7IH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiBsb2FkUHJlZnMoKSB7CiAgICB2YXIgb3V0ID0gewogICAgICBncmlkU3R5bGU6IHByZWZHZXQoImdyaWRTdHlsZSIsIERFRkFVTFRfUFJFRlMuZ3JpZFN0eWxlKSwKICAgICAgY2VsbE1vZGU6IHByZWZHZXQoImNlbGxNb2RlIiwgREVGQVVMVF9QUkVGUy5jZWxsTW9kZSksCiAgICAgIGVmZmVjdDogcHJlZkdldCgiZWZmZWN0IiwgREVGQVVMVF9QUkVGUy5lZmZlY3QpLAogICAgICBzcGVlZDogcHJlZkdldCgic3BlZWQiLCBERUZBVUxUX1BSRUZTLnNwZWVkKQogICAgfTsKICAgIGlmICghR1JJRF9TVFlMRVMuc29tZShmdW5jdGlvbiAoZykgeyByZXR1cm4gZy5rZXkgPT09IG91dC5ncmlkU3R5bGU7IH0pKSBvdXQuZ3JpZFN0eWxlID0gREVGQVVMVF9QUkVGUy5ncmlkU3R5bGU7CiAgICBpZiAoIUNFTExfTU9ERVMuc29tZShmdW5jdGlvbiAoYykgeyByZXR1cm4gYy5rZXkgPT09IG91dC5jZWxsTW9kZTsgfSkpIG91dC5jZWxsTW9kZSA9IERFRkFVTFRfUFJFRlMuY2VsbE1vZGU7CiAgICBpZiAoIUVGRkVDVFMuc29tZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5rZXkgPT09IG91dC5lZmZlY3Q7IH0pKSBvdXQuZWZmZWN0ID0gREVGQVVMVF9QUkVGUy5lZmZlY3Q7CiAgICBvdXQuc3BlZWQgPSBjbGFtcE51bShvdXQuc3BlZWQsIDAuMjUsIDMuMCwgMS4wKTsKICAgIHJldHVybiBvdXQ7CiAgfQoKICBmdW5jdGlvbiBjbGFtcE51bShuLCBsbywgaGksIGZhbGxiYWNrKSB7CiAgICBuID0gTnVtYmVyKG4pOwogICAgaWYgKCFpc0Zpbml0ZShuKSkgcmV0dXJuIGZhbGxiYWNrOwogICAgcmV0dXJuIE1hdGgubWluKGhpLCBNYXRoLm1heChsbywgbikpOwogIH0KCiAgZnVuY3Rpb24gY2xhbXAwMShuKSB7CiAgICByZXR1cm4gbiA8IDAgPyAwIDogKG4gPiAxID8gMSA6IG4pOwogIH0KCiAgZnVuY3Rpb24gZWwodGFnLCBhdHRycywgY2hpbGRyZW4pIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAiZnVuY3Rpb24iKSByZXR1cm4gVi51aS5lbCh0YWcsIGF0dHJzLCBjaGlsZHJlbik7CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIGlmIChhdHRycykgewogICAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICAgIHZhciB2YWwgPSBhdHRyc1trXTsKICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgIGlmIChrID09PSAiY2xhc3MiIHx8IGsgPT09ICJjbGFzc05hbWUiKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAidGV4dCIpIG5vZGUudGV4dENvbnRlbnQgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gImh0bWwiKSBub2RlLmlubmVySFRNTCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoIm9uIikgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGsuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgdmFsKTsKICAgICAgICB9IGVsc2UgaWYgKGsuaW5kZXhPZigiZGF0YS0iKSA9PT0gMCB8fCBrLmluZGV4T2YoImFyaWEtIikgPT09IDApIHsKICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICAgICAgfSBlbHNlIGlmIChrIGluIG5vZGUpIHsKICAgICAgICAgIHRyeSB7IG5vZGVba10gPSB2YWw7IH0gY2F0Y2ggKGUpIHsgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdmFsKTsgfQogICAgICAgIH0gZWxzZSBub2RlLnNldEF0dHJpYnV0ZShrLCB2YWwpOwogICAgICB9KTsKICAgIH0KICAgIGFwcGVuZENoaWxkcmVuKG5vZGUsIGNoaWxkcmVuKTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gYXBwZW5kQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW4pIHsKICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKSByZXR1cm47CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSBjaGlsZHJlbiA9IFtjaGlsZHJlbl07CiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjID09IG51bGwgfHwgYyA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgaWYgKHR5cGVvZiBjID09PSAic3RyaW5nIiB8fCB0eXBlb2YgYyA9PT0gIm51bWJlciIpIHsKICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjKSkpOwogICAgICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBOb2RlKSB7CiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChjKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICBpZiAoVi5yb3V0ZXIgJiYgdHlwZW9mIFYucm91dGVyLmdvID09PSAiZnVuY3Rpb24iKSBWLnJvdXRlci5nbyhoYXNoKTsKICAgIGVsc2UgbG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiB0b2FzdChtc2csIGtpbmQpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnRvYXN0ID09PSAiZnVuY3Rpb24iKSBWLnVpLnRvYXN0KG1zZywga2luZCB8fCAiaW5mbyIpOwogICAgZWxzZSBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5lbWl0ID09PSAiZnVuY3Rpb24iKSBWLnN0b3JlLmVtaXQoInRvYXN0IiwgeyBtZXNzYWdlOiBtc2csIGtpbmQ6IGtpbmQgfSk7CiAgfQoKICBmdW5jdGlvbiBkZWJvdW5jZShmbiwgbXMpIHsKICAgIGlmIChWLnV0aWwgJiYgdHlwZW9mIFYudXRpbC5kZWJvdW5jZSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIFYudXRpbC5kZWJvdW5jZShmbiwgbXMpOwogICAgdmFyIHQ7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgY3R4ID0gdGhpcywgYSA9IGFyZ3VtZW50czsKICAgICAgY2xlYXJUaW1lb3V0KHQpOwogICAgICB0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGZuLmFwcGx5KGN0eCwgYSk7IH0sIG1zKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBpbWFnZU9mKGl0ZW0pIHsKICAgIHJldHVybiAoaXRlbSAmJiAoaXRlbS5nZW5lcmF0ZWRJbWFnZSB8fCBpdGVtLmltYWdlKSkgfHwgaXRlbSB8fCB7fTsKICB9CgogIGZ1bmN0aW9uIHByb2ZpbGVPZihpdGVtKSB7CiAgICByZXR1cm4gKGl0ZW0gJiYgaXRlbS5wcm9maWxlKSB8fCAoaXRlbSAmJiBpdGVtLmdlbmVyYXRlZEltYWdlICYmIGl0ZW0uZ2VuZXJhdGVkSW1hZ2UucHJvZmlsZSkgfHwgbnVsbDsKICB9CgogIGZ1bmN0aW9uIGFmdGVyVVJMKGdpKSB7CiAgICByZXR1cm4gZ2kucmVtb3RlSW1hZ2VVUkwgfHwgZ2kucmVtb3RlSW1hZ2VVcmwgfHwgZ2kuaW1hZ2VVUkwgfHwgZ2kudXJsIHx8ICIiOwogIH0KCiAgZnVuY3Rpb24gYmVmb3JlVVJMKGdpKSB7CiAgICByZXR1cm4gZ2kucmVtb3RlT3JpZ2luYWxJbWFnZVVSTCB8fCBnaS5yZW1vdGVPcmlnaW5hbEltYWdlVXJsIHx8IGdpLm9yaWdpbmFsSW1hZ2VVUkwgfHwgIiI7CiAgfQoKICBmdW5jdGlvbiBhc3BlY3RPZihnaSkgewogICAgdmFyIHcgPSBnaS53aWR0aCB8fCBnaS5pbWFnZVdpZHRoIHx8IChnaS5pbWFnZV9zaXplICYmIGdpLmltYWdlX3NpemUud2lkdGgpOwogICAgdmFyIGggPSBnaS5oZWlnaHQgfHwgZ2kuaW1hZ2VIZWlnaHQgfHwgKGdpLmltYWdlX3NpemUgJiYgZ2kuaW1hZ2Vfc2l6ZS5oZWlnaHQpOwogICAgaWYgKHcgJiYgaCAmJiBoID4gMCkgcmV0dXJuIHcgLyBoOwogICAgaWYgKHR5cGVvZiBnaS5hc3BlY3RSYXRpbyA9PT0gIm51bWJlciIgJiYgZ2kuYXNwZWN0UmF0aW8gPiAwKSByZXR1cm4gZ2kuYXNwZWN0UmF0aW87CiAgICByZXR1cm4gMC43NTsKICB9CgogIGZ1bmN0aW9uIGFwcGx5RXhhbXBsZVRvQ3JlYXRvcihpdGVtLCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBnaSA9IGltYWdlT2YoaXRlbSk7CiAgICB2YXIgcHJvZmlsZSA9IHByb2ZpbGVPZihpdGVtKTsKICAgIHZhciBwcm9tcHQgPSBnaS5wcm9tcHQgfHwgIiI7CiAgICB2YXIgbW9kZWwgPSBnaS5tb2RlbCB8fCBudWxsOwogICAgdmFyIHJlZmVyZW5jZVVSTCA9IG9wdHMuYXNSZWZlcmVuY2UgPyBhZnRlclVSTChnaSkgOiBudWxsOwoKICAgIHZhciBwYXlsb2FkID0gewogICAgICBnZW5lcmF0ZWRJbWFnZTogZ2ksCiAgICAgIHByb2ZpbGU6IHByb2ZpbGUsCiAgICAgIHByb21wdDogcHJvbXB0LAogICAgICBtb2RlbDogbW9kZWwsCiAgICAgIHJlZmVyZW5jZVVSTDogcmVmZXJlbmNlVVJMLAogICAgICBzb3VyY2U6ICJpbnNwaXJhdGlvbiIKICAgIH07CgogICAgaWYgKHR5cGVvZiBvcHRzLm9uQXBwbHkgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgdHJ5IHsgb3B0cy5vbkFwcGx5KHBheWxvYWQpOyByZXR1cm47IH0gY2F0Y2ggKGUpIHt9CiAgICB9CgogICAgaWYgKFYudmlld3MgJiYgVi52aWV3cy5jcmVhdGUgJiYgdHlwZW9mIFYudmlld3MuY3JlYXRlLmFwcGx5RXhhbXBsZSA9PT0gImZ1bmN0aW9uIikgewogICAgICB0cnkgewogICAgICAgIFYudmlld3MuY3JlYXRlLmFwcGx5RXhhbXBsZShwYXlsb2FkKTsKICAgICAgICBpZiAobG9jYXRpb24uaGFzaC5pbmRleE9mKCIjL2NyZWF0ZSIpICE9PSAwKSB7CiAgICAgICAgICB2YXIgcSA9ICIjL2NyZWF0ZT9wcm9tcHQ9IiArIGVuY29kZVVSSUNvbXBvbmVudChwcm9tcHQpOwogICAgICAgICAgaWYgKG1vZGVsKSBxICs9ICImbW9kZWw9IiArIGVuY29kZVVSSUNvbXBvbmVudChtb2RlbCk7CiAgICAgICAgICBnbyhxKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9IGNhdGNoIChlKSB7fQogICAgfQoKICAgIHZhciBoYXNoID0gIiMvY3JlYXRlP3Byb21wdD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHByb21wdCk7CiAgICBpZiAobW9kZWwpIGhhc2ggKz0gIiZtb2RlbD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KG1vZGVsKTsKICAgIGdvKGhhc2gpOwogIH0KCiAgdmFyIGxvb3BSdW5uaW5nID0gZmFsc2U7CiAgdmFyIGFjdGl2ZVN0YXRlcyA9IFtdOwogIHZhciBwYXVzZWRBdCA9IDA7CiAgdmFyIHZpc2liaWxpdHlCb3VuZCA9IGZhbHNlOwogIHZhciBkb2NDbGFzc09ic2VydmVyID0gbnVsbDsKCiAgZnVuY3Rpb24gZmVlZEFjdGl2ZSgpIHsKICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmhpZGRlbikgcmV0dXJuIGZhbHNlOwogICAgdmFyIGRlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgaWYgKGRlICYmIGRlLmNsYXNzTGlzdCAmJiAoZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2LWhhcy1vdmVybGF5IikgfHwgZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2LWRyYXdlci1vcGVuIikpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIGJpbmRWaXNpYmlsaXR5KCkgewogICAgaWYgKHZpc2liaWxpdHlCb3VuZCkgcmV0dXJuOwogICAgdmlzaWJpbGl0eUJvdW5kID0gdHJ1ZTsKICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsIG1heWJlUmVzdW1lKTsKICAgIH0KICAgIGlmICh0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7CiAgICAgIGRvY0NsYXNzT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtYXliZVJlc3VtZSk7CiAgICAgIGRvY0NsYXNzT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbImNsYXNzIl0gfSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtYXliZVJlc3VtZSgpIHsKICAgIGlmICghbG9vcFJ1bm5pbmcgJiYgYWN0aXZlU3RhdGVzLmxlbmd0aCAmJiBmZWVkQWN0aXZlKCkpIHN0YXJ0TG9vcCgpOwogIH0KCiAgZnVuY3Rpb24gc3RhcnRMb29wKCkgewogICAgaWYgKGxvb3BSdW5uaW5nKSByZXR1cm47CiAgICBiaW5kVmlzaWJpbGl0eSgpOwogICAgbG9vcFJ1bm5pbmcgPSB0cnVlOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spOwogIH0KCiAgZnVuY3Rpb24gdGljaygpIHsKICAgIGlmICghYWN0aXZlU3RhdGVzLmxlbmd0aCkgewogICAgICBsb29wUnVubmluZyA9IGZhbHNlOwogICAgICBwYXVzZWRBdCA9IDA7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghZmVlZEFjdGl2ZSgpKSB7CiAgICAgIGxvb3BSdW5uaW5nID0gZmFsc2U7CiAgICAgIHBhdXNlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHBhdXNlZEF0KSB7CiAgICAgIHZhciBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHBhdXNlZEF0OwogICAgICBwYXVzZWRBdCA9IDA7CiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYWN0aXZlU3RhdGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgdmFyIHN0ID0gYWN0aXZlU3RhdGVzW2pdOwogICAgICAgIGlmIChzdCAmJiAhc3Quc2NydWJiaW5nKSBzdC50MCArPSBlbGFwc2VkOwogICAgICB9CiAgICB9CiAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTsKICAgIHZhciBtb3Rpb24gPSAhcmVkdWNlZE1vdGlvbigpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhY3RpdmVTdGF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHMgPSBhY3RpdmVTdGF0ZXNbaV07CiAgICAgIGlmIChzLmRlc3Ryb3llZCB8fCBzLnNjcnViYmluZyB8fCBzLm1vZGUgPT09ICJhZnRlck9ubHkiIHx8IHMubW9kZSA9PT0gInNjcnViIikgY29udGludWU7CiAgICAgIGlmICghbW90aW9uKSB7IHMuYmVmb3JlLnN0eWxlLm9wYWNpdHkgPSAiMSI7IGNvbnRpbnVlOyB9CiAgICAgIHZhciBvcCA9IGN5Y2xlT3BhY2l0eSgobm93IC0gcy50MCkgKiBzLnNwZWVkKTsKICAgICAgcy5iZWZvcmUuc3R5bGUub3BhY2l0eSA9IG9wLnRvRml4ZWQoMyk7CiAgICB9CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7CiAgfQoKICBmdW5jdGlvbiBjeWNsZU9wYWNpdHkodCkgewogICAgdmFyIHAgPSB0ICUgQ1lDTEU7CiAgICBpZiAocCA8IEZBREUpIHJldHVybiAxIC0gKHAgLyBGQURFKTsKICAgIHAgLT0gRkFERTsKICAgIGlmIChwIDwgSE9MRF9BRlRFUikgcmV0dXJuIDA7CiAgICBwIC09IEhPTERfQUZURVI7CiAgICBpZiAocCA8IEZBREUpIHJldHVybiBwIC8gRkFERTsKICAgIHJldHVybiAxOwogIH0KCiAgZnVuY3Rpb24gcmVnaXN0ZXJTdGF0ZShzdGF0ZSkgewogICAgYWN0aXZlU3RhdGVzLnB1c2goc3RhdGUpOwogICAgc3RhcnRMb29wKCk7CiAgfQoKICBmdW5jdGlvbiB1bnJlZ2lzdGVyU3RhdGVzKHN0YXRlcykgewogICAgaWYgKCFzdGF0ZXMgfHwgIXN0YXRlcy5sZW5ndGgpIHJldHVybjsKICAgIHZhciBzZXQgPSB7fTsKICAgIHN0YXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7IHMuZGVzdHJveWVkID0gdHJ1ZTsgfSk7CiAgICBmb3IgKHZhciBpID0gYWN0aXZlU3RhdGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGlmIChhY3RpdmVTdGF0ZXNbaV0uZGVzdHJveWVkKSBhY3RpdmVTdGF0ZXMuc3BsaWNlKGksIDEpOwogICAgfQogICAgdm9pZCBzZXQ7CiAgfQoKICBmdW5jdGlvbiBidWlsZENhcmQoaXRlbSwgcHJlZnMsIGN0cmwpIHsKICAgIHZhciBnaSA9IGltYWdlT2YoaXRlbSk7CiAgICB2YXIgYWZ0ZXIgPSBhZnRlclVSTChnaSk7CiAgICB2YXIgYmVmb3JlID0gYmVmb3JlVVJMKGdpKTsKICAgIHZhciBoYXNCZWZvcmVBZnRlciA9ICEhKGJlZm9yZSAmJiBhZnRlciAmJiBiZWZvcmUgIT09IGFmdGVyKTsKICAgIHZhciBhbHQgPSBnaS5oaWRlUHJvbXB0ID8gIkluc3BpcmF0aW9uIiA6IChnaS5wcm9tcHQgfHwgIkluc3BpcmF0aW9uIik7CgogICAgdmFyIGNhcmQgPSBlbCgiZGl2IiwgewogICAgICBjbGFzczogInZjYXJkIiwKICAgICAgcm9sZTogImxpc3RpdGVtIiwKICAgICAgdGFiaW5kZXg6ICIwIiwKICAgICAgImFyaWEtbGFiZWwiOiBnaS5wcm9tcHQgPyAoIkluc3BpcmF0aW9uOiAiICsgdHJ1bmNhdGUoZ2kucHJvbXB0LCA4MCkpIDogIkluc3BpcmF0aW9uIiwKICAgICAgImRhdGEtcmVtb3RlLWlkIjogZ2kucmVtb3RlSUQgfHwgZ2kuaWQgfHwgIiIKICAgIH0pOwoKICAgIHZhciBhZnRlckltZyA9IGVsKCJpbWciLCB7CiAgICAgIGNsYXNzOiAidmFmdGVyIiwKICAgICAgc3JjOiBhZnRlciB8fCBiZWZvcmUsCiAgICAgIGFsdDogYWx0LAogICAgICBsb2FkaW5nOiAibGF6eSIsCiAgICAgIGRlY29kaW5nOiAiYXN5bmMiCiAgICB9KTsKICAgIG1hcmtCcm9rZW5PbkVycm9yKGFmdGVySW1nLCBjYXJkKTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoYWZ0ZXJJbWcpOwoKICAgIHZhciBzdGF0ZSA9IG51bGw7CgogICAgaWYgKGhhc0JlZm9yZUFmdGVyKSB7CiAgICAgIHZhciBtb2RlID0gcHJlZnMuY2VsbE1vZGU7CiAgICAgIHZhciBiZWZvcmVJbWcgPSBlbCgiaW1nIiwgewogICAgICAgIGNsYXNzOiAidmJlZm9yZSIsCiAgICAgICAgc3JjOiBiZWZvcmUsCiAgICAgICAgYWx0OiAiQmVmb3JlIiwKICAgICAgICBsb2FkaW5nOiAibGF6eSIsCiAgICAgICAgZGVjb2Rpbmc6ICJhc3luYyIKICAgICAgfSk7CiAgICAgIG1hcmtCcm9rZW5PbkVycm9yKGJlZm9yZUltZywgY2FyZCk7CiAgICAgIHZhciBzY3J1YiA9IGVsKCJzcGFuIiwgeyBjbGFzczogInZzY3J1YiIsICJhcmlhLWhpZGRlbiI6ICJ0cnVlIiB9KTsKICAgICAgY2FyZC5hcHBlbmRDaGlsZChiZWZvcmVJbWcpOwogICAgICBjYXJkLmFwcGVuZENoaWxkKHNjcnViKTsKICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoImRhdGEtZWZmZWN0IiwgcHJlZnMuZWZmZWN0KTsKICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoImRhdGEtbW9kZSIsIG1vZGUpOwoKICAgICAgaWYgKG1vZGUgPT09ICJhZnRlck9ubHkiKSB7CiAgICAgICAgYmVmb3JlSW1nLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gInNjcnViIikgewogICAgICAgIGJlZm9yZUltZy5zdHlsZS5vcGFjaXR5ID0gIjAuNSI7CiAgICAgICAgc2NydWIuc3R5bGUubGVmdCA9ICI1MCUiOwogICAgICB9IGVsc2UgewogICAgICAgIGJlZm9yZUltZy5zdHlsZS5vcGFjaXR5ID0gIjEiOwogICAgICB9CgogICAgICBzdGF0ZSA9IHsKICAgICAgICBjYXJkOiBjYXJkLAogICAgICAgIGJlZm9yZTogYmVmb3JlSW1nLAogICAgICAgIHNjcnViOiBzY3J1YiwKICAgICAgICBtb2RlOiBtb2RlLAogICAgICAgIHNwZWVkOiBwcmVmcy5zcGVlZCwKICAgICAgICB0MDogRGF0ZS5ub3coKSAtIE1hdGgucmFuZG9tKCkgKiA0MDAwLAogICAgICAgIHNjcnViYmluZzogZmFsc2UsCiAgICAgICAgc2NydWJQb3M6IDAuNSwKICAgICAgICByZXN1bWVUaW1lcjogbnVsbCwKICAgICAgICBkZXN0cm95ZWQ6IGZhbHNlCiAgICAgIH07CiAgICAgIGF0dGFjaFNjcnViKGNhcmQsIHN0YXRlKTsKICAgICAgcmVnaXN0ZXJTdGF0ZShzdGF0ZSk7CiAgICB9IGVsc2UgewogICAgICBjYXJkLnNldEF0dHJpYnV0ZSgiZGF0YS1tb2RlIiwgImFmdGVyT25seSIpOwogICAgfQoKICAgIGJpbmRUYXAoY2FyZCwgaXRlbSwgY3RybCk7CiAgICBpZiAoY3RybCkgY3RybC5zdGF0ZXMucHVzaChzdGF0ZSk7CiAgICByZXR1cm4gY2FyZDsKICB9CgogIGZ1bmN0aW9uIGJpbmRUYXAoY2FyZCwgaXRlbSwgY3RybCkgewogICAgdmFyIGRvd25YID0gMCwgZG93blkgPSAwLCBtb3ZlZCA9IGZhbHNlLCBkb3duID0gZmFsc2U7CiAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgZG93biA9IHRydWU7IG1vdmVkID0gZmFsc2U7CiAgICAgIGRvd25YID0gZS5jbGllbnRYOyBkb3duWSA9IGUuY2xpZW50WTsKICAgIH0pOwogICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmICghZG93bikgcmV0dXJuOwogICAgICBpZiAoTWF0aC5hYnMoZS5jbGllbnRYIC0gZG93blgpID4gU0NSVUJfVEhSRVNIT0xEIHx8IE1hdGguYWJzKGUuY2xpZW50WSAtIGRvd25ZKSA+IFNDUlVCX1RIUkVTSE9MRCkgbW92ZWQgPSB0cnVlOwogICAgfSk7CiAgICBmdW5jdGlvbiByZWxlYXNlKGUpIHsKICAgICAgaWYgKCFkb3duKSByZXR1cm47CiAgICAgIGRvd24gPSBmYWxzZTsKICAgICAgaWYgKG1vdmVkIHx8IGNhcmQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzY3J1YmJpbmciKSkgcmV0dXJuOwogICAgICB2YXIgb25BcHBseSA9IGN0cmwgPyBjdHJsLm9uQXBwbHkgOiBudWxsOwogICAgICBhcHBseUV4YW1wbGVUb0NyZWF0b3IoaXRlbSwgeyBvbkFwcGx5OiBvbkFwcGx5IH0pOwogICAgfQogICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCByZWxlYXNlKTsKICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChlLmtleSA9PT0gIkVudGVyIiB8fCBlLmtleSA9PT0gIiAiKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGFwcGx5RXhhbXBsZVRvQ3JlYXRvcihpdGVtLCB7IG9uQXBwbHk6IGN0cmwgPyBjdHJsLm9uQXBwbHkgOiBudWxsIH0pOwogICAgICB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGF0dGFjaFNjcnViKGNhcmQsIHN0YXRlKSB7CiAgICB2YXIgc3RhcnRYID0gMCwgc3RhcnRZID0gMCwgYWN0aXZlID0gZmFsc2UsIGRlY2lkZWQgPSBmYWxzZSwgZHJhZ2dpbmcgPSBmYWxzZSwgcGlkID0gbnVsbDsKCiAgICBmdW5jdGlvbiBzZXRTY3J1YihjbGllbnRYKSB7CiAgICAgIHZhciByZWN0ID0gY2FyZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgaWYgKHJlY3Qud2lkdGggPD0gMCkgcmV0dXJuOwogICAgICB2YXIgcG9zID0gY2xhbXAwMSgoY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKTsKICAgICAgc3RhdGUuc2NydWJQb3MgPSBwb3M7CiAgICAgIHN0YXRlLmJlZm9yZS5zdHlsZS5vcGFjaXR5ID0gKDEgLSBwb3MpLnRvRml4ZWQoMyk7CiAgICAgIHN0YXRlLnNjcnViLnN0eWxlLmxlZnQgPSAocG9zICogMTAwKSArICIlIjsKICAgIH0KCiAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKGUucG9pbnRlclR5cGUgPT09ICJtb3VzZSIgJiYgZS5idXR0b24gIT09IDApIHJldHVybjsKICAgICAgYWN0aXZlID0gdHJ1ZTsgZGVjaWRlZCA9IGZhbHNlOyBkcmFnZ2luZyA9IGZhbHNlOwogICAgICBzdGFydFggPSBlLmNsaWVudFg7IHN0YXJ0WSA9IGUuY2xpZW50WTsKICAgICAgcGlkID0gZS5wb2ludGVySWQ7CiAgICB9KTsKCiAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKCFhY3RpdmUpIHJldHVybjsKICAgICAgdmFyIGR4ID0gZS5jbGllbnRYIC0gc3RhcnRYOwogICAgICB2YXIgZHkgPSBlLmNsaWVudFkgLSBzdGFydFk7CiAgICAgIGlmICghZGVjaWRlZCkgewogICAgICAgIGlmIChNYXRoLmFicyhkeCkgPCBTQ1JVQl9USFJFU0hPTEQgJiYgTWF0aC5hYnMoZHkpIDwgU0NSVUJfVEhSRVNIT0xEKSByZXR1cm47CiAgICAgICAgZGVjaWRlZCA9IHRydWU7CiAgICAgICAgZHJhZ2dpbmcgPSBNYXRoLmFicyhkeCkgPiBNYXRoLmFicyhkeSk7CiAgICAgICAgaWYgKGRyYWdnaW5nKSB7CiAgICAgICAgICBzdGF0ZS5zY3J1YmJpbmcgPSB0cnVlOwogICAgICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCJzY3J1YmJpbmciKTsKICAgICAgICAgIGlmIChzdGF0ZS5yZXN1bWVUaW1lcikgeyBjbGVhclRpbWVvdXQoc3RhdGUucmVzdW1lVGltZXIpOyBzdGF0ZS5yZXN1bWVUaW1lciA9IG51bGw7IH0KICAgICAgICAgIHRyeSB7IGNhcmQuc2V0UG9pbnRlckNhcHR1cmUocGlkKTsgfSBjYXRjaCAoZXJyKSB7fQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZHJhZ2dpbmcpIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgc2V0U2NydWIoZS5jbGllbnRYKTsKICAgICAgfQogICAgfSk7CgogICAgZnVuY3Rpb24gZW5kKCkgewogICAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuOwogICAgICBhY3RpdmUgPSBmYWxzZTsKICAgICAgaWYgKGRyYWdnaW5nKSB7CiAgICAgICAgdHJ5IHsgY2FyZC5yZWxlYXNlUG9pbnRlckNhcHR1cmUocGlkKTsgfSBjYXRjaCAoZXJyKSB7fQogICAgICAgIHNjaGVkdWxlUmVzdW1lKCk7CiAgICAgIH0KICAgICAgZHJhZ2dpbmcgPSBmYWxzZTsgZGVjaWRlZCA9IGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmVzdW1lKCkgewogICAgICBpZiAoc3RhdGUucmVzdW1lVGltZXIpIGNsZWFyVGltZW91dChzdGF0ZS5yZXN1bWVUaW1lcik7CiAgICAgIHN0YXRlLnJlc3VtZVRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgY2FyZC5jbGFzc0xpc3QucmVtb3ZlKCJzY3J1YmJpbmciKTsKICAgICAgICBzdGF0ZS5zY3J1YmJpbmcgPSBmYWxzZTsKICAgICAgICBzdGF0ZS50MCA9IERhdGUubm93KCk7CiAgICAgICAgc3RhdGUuYmVmb3JlLnN0eWxlLm9wYWNpdHkgPSAiMSI7CiAgICAgIH0sIFNDUlVCX1JFU1VNRSk7CiAgICB9CgogICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBlbmQpOwogICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyY2FuY2VsIiwgZW5kKTsKICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigibG9zdHBvaW50ZXJjYXB0dXJlIiwgZnVuY3Rpb24gKCkgewogICAgICBpZiAoZHJhZ2dpbmcpIHsgYWN0aXZlID0gZmFsc2U7IGRyYWdnaW5nID0gZmFsc2U7IGRlY2lkZWQgPSBmYWxzZTsgc2NoZWR1bGVSZXN1bWUoKTsgfQogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBtYXJrQnJva2VuT25FcnJvcihpbWcsIGNhcmQpIHsKICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsIGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGltZy5jbGFzc0xpc3QuY29udGFpbnMoInZhZnRlciIpKSB7CiAgICAgICAgdmFyIGZhbGxiYWNrID0gY2FyZC5xdWVyeVNlbGVjdG9yKCIudmJlZm9yZSIpOwogICAgICAgIHZhciBmYlNyYyA9IGZhbGxiYWNrICYmIGZhbGxiYWNrLmdldEF0dHJpYnV0ZSgic3JjIik7CiAgICAgICAgaWYgKGZiU3JjICYmIGZiU3JjICE9PSBpbWcuZ2V0QXR0cmlidXRlKCJzcmMiKSAmJiAhaW1nLmRhdGFzZXQuZmVsbEJhY2spIHsKICAgICAgICAgIGltZy5kYXRhc2V0LmZlbGxCYWNrID0gIjEiOwogICAgICAgICAgaW1nLnNyYyA9IGZiU3JjOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpbWcuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCJ2Y2FyZC0tYnJva2VuIik7CiAgICB9LCB7IG9uY2U6IGZhbHNlIH0pOwogIH0KCiAgZnVuY3Rpb24gdHJ1bmNhdGUocywgbikgewogICAgcyA9IFN0cmluZyhzIHx8ICIiKTsKICAgIHJldHVybiBzLmxlbmd0aCA+IG4gPyBzLnNsaWNlKDAsIG4gLSAxKS50cmltRW5kKCkgKyAi4oCmIiA6IHM7CiAgfQoKICBmdW5jdGlvbiBDb2x1bW5MYXlvdXQocm9vdCwgY29sQ291bnQpIHsKICAgIHRoaXMucm9vdCA9IHJvb3Q7CiAgICB0aGlzLmNvbHMgPSBbXTsKICAgIHRoaXMuY29sSCA9IFtdOwogICAgdGhpcy5ub2RlcyA9IFtdOwogICAgdGhpcy5zZXRDb2x1bW5zKGNvbENvdW50KTsKICB9CiAgQ29sdW1uTGF5b3V0LnByb3RvdHlwZS5zZXRDb2x1bW5zID0gZnVuY3Rpb24gKG4pIHsKICAgIG4gPSBNYXRoLm1heCgxLCBuIHwgMCk7CiAgICBpZiAobiA9PT0gdGhpcy5jb2xzLmxlbmd0aCkgcmV0dXJuOwogICAgdmFyIGV4aXN0aW5nID0gdGhpcy5ub2Rlcy5zbGljZSgpOwogICAgdGhpcy5yb290LmlubmVySFRNTCA9ICIiOwogICAgdGhpcy5jb2xzID0gW107CiAgICB0aGlzLmNvbEggPSBbXTsKICAgIHRoaXMubm9kZXMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIHZhciBjb2wgPSBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLWNvbCIgfSk7CiAgICAgIHRoaXMucm9vdC5hcHBlbmRDaGlsZChjb2wpOwogICAgICB0aGlzLmNvbHMucHVzaChjb2wpOwogICAgICB0aGlzLmNvbEgucHVzaCgwKTsKICAgIH0KICAgIHZhciBzZWxmID0gdGhpczsKICAgIGV4aXN0aW5nLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7IHNlbGYuYWRkKGVudHJ5Lm5vZGUsIGVudHJ5LndlaWdodCk7IH0pOwogIH07CiAgQ29sdW1uTGF5b3V0LnByb3RvdHlwZS5fc2hvcnRlc3QgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgaWR4ID0gMCwgbWluID0gSW5maW5pdHk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sSC5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpcy5jb2xIW2ldIDwgbWluKSB7IG1pbiA9IHRoaXMuY29sSFtpXTsgaWR4ID0gaTsgfQogICAgfQogICAgcmV0dXJuIGlkeDsKICB9OwogIENvbHVtbkxheW91dC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKG5vZGUsIHdlaWdodCkgewogICAgd2VpZ2h0ID0gKHR5cGVvZiB3ZWlnaHQgPT09ICJudW1iZXIiICYmIHdlaWdodCA+IDApID8gd2VpZ2h0IDogMTsKICAgIHZhciBpZHggPSB0aGlzLl9zaG9ydGVzdCgpOwogICAgdGhpcy5jb2xzW2lkeF0uYXBwZW5kQ2hpbGQobm9kZSk7CiAgICB0aGlzLmNvbEhbaWR4XSArPSB3ZWlnaHQ7CiAgICB0aGlzLm5vZGVzLnB1c2goeyBub2RlOiBub2RlLCB3ZWlnaHQ6IHdlaWdodCB9KTsKICB9OwogIENvbHVtbkxheW91dC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CiAgICB0aGlzLmNvbHMuZm9yRWFjaChmdW5jdGlvbiAoYykgeyBjLmlubmVySFRNTCA9ICIiOyB9KTsKICAgIHRoaXMuY29sSCA9IHRoaXMuY29sSC5tYXAoZnVuY3Rpb24gKCkgeyByZXR1cm4gMDsgfSk7CiAgICB0aGlzLm5vZGVzID0gW107CiAgfTsKCiAgZnVuY3Rpb24gY29sdW1uc0ZvcldpZHRoKHcsIGdyaWRTdHlsZSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBHUklEX1NUWUxFUy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoR1JJRF9TVFlMRVNbaV0ua2V5ID09PSBncmlkU3R5bGUgJiYgR1JJRF9TVFlMRVNbaV0uY29scykgcmV0dXJuIEdSSURfU1RZTEVTW2ldLmNvbHM7CiAgICB9CiAgICBpZiAoKHdpbmRvdy5pbm5lcldpZHRoIHx8IHcpIDw9IDY0MCkgcmV0dXJuIDI7CiAgICBpZiAodyA8IDU2MCkgcmV0dXJuIDI7CiAgICBpZiAodyA8IDkwMCkgcmV0dXJuIDM7CiAgICBpZiAodyA8IDEzMjApIHJldHVybiA0OwogICAgcmV0dXJuIDU7CiAgfQoKICBmdW5jdGlvbiBjYXJkV2VpZ2h0KGl0ZW0pIHsKICAgIHZhciBnaSA9IGltYWdlT2YoaXRlbSk7CiAgICB2YXIgYXIgPSBhc3BlY3RPZihnaSk7CiAgICByZXR1cm4gMSAvIE1hdGgubWF4KDAuMywgYXIgfHwgMC43NSk7CiAgfQoKICBmdW5jdGlvbiBGZWVkQ29udHJvbGxlcihvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgIHRoaXMubW91bnQgPSBvcHRpb25zLm1vdW50OwogICAgdGhpcy50YWcgPSBvcHRpb25zLnRhZyB8fCAiIjsKICAgIHRoaXMuaW5saW5lID0gISFvcHRpb25zLmlubGluZTsKICAgIHRoaXMubGltaXQgPSBvcHRpb25zLmxpbWl0IHx8IDA7CiAgICB0aGlzLnBlciA9IG9wdGlvbnMucGVyIHx8ICh0aGlzLmlubGluZSA/IE1hdGgubWF4KElOTElORV9ERUZBVUxULCB0aGlzLmxpbWl0IHx8IElOTElORV9ERUZBVUxUKSA6IFBFUik7CiAgICB0aGlzLnNob3dDaGlwcyA9IG9wdGlvbnMuc2hvd0NoaXBzICE9PSBmYWxzZSAmJiAhdGhpcy5pbmxpbmU7CiAgICB0aGlzLnNob3dIZWFkZXIgPSBvcHRpb25zLnNob3dIZWFkZXIgIT09IGZhbHNlICYmICF0aGlzLmlubGluZTsKICAgIHRoaXMuc2hvd09wdGlvbnMgPSBvcHRpb25zLnNob3dPcHRpb25zICE9PSBmYWxzZSAmJiAhdGhpcy5pbmxpbmU7CiAgICB0aGlzLm9uQXBwbHkgPSB0eXBlb2Ygb3B0aW9ucy5vbkFwcGx5ID09PSAiZnVuY3Rpb24iID8gb3B0aW9ucy5vbkFwcGx5IDogbnVsbDsKICAgIHRoaXMucHJlZnMgPSBsb2FkUHJlZnMoKTsKCiAgICB0aGlzLnBhZ2UgPSAxOwogICAgdGhpcy5pdGVtcyA9IFtdOwogICAgdGhpcy50b3RhbCA9IG51bGw7CiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgIHRoaXMuZG9uZSA9IGZhbHNlOwogICAgdGhpcy5lcnJvcmVkID0gZmFsc2U7CiAgICB0aGlzLnNlZW4gPSB7fTsKICAgIHRoaXMuc3RhdGVzID0gW107CgogICAgdGhpcy5sYXlvdXQgPSBudWxsOwogICAgdGhpcy5ncmlkRWwgPSBudWxsOwogICAgdGhpcy5zZW50aW5lbCA9IG51bGw7CiAgICB0aGlzLnN0YXR1c0VsID0gbnVsbDsKICAgIHRoaXMuY2hpcHNCYXIgPSBudWxsOwogICAgdGhpcy5vYnNlcnZlciA9IG51bGw7CiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlOwogICAgdGhpcy5fb25SZXNpemUgPSBudWxsOwogICAgdGhpcy5fcmVxVG9rZW4gPSAwOwogICAgdGhpcy5fb3B0c1JlZiA9IG51bGw7CiAgfQoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIHJvb3QgPSB0aGlzLm1vdW50OwogICAgcm9vdC5pbm5lckhUTUwgPSAiIjsKCiAgICB2YXIgd3JhcCA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidi1zZWN0aW9uIHZmZWVkLXZpZXciICsgKHRoaXMuaW5saW5lID8gIiB2ZmVlZC12aWV3LS1pbmxpbmUiIDogIiIpIH0pOwoKICAgIGlmICh0aGlzLnNob3dIZWFkZXIpIHsKICAgICAgdmFyIGhlYWRSb3cgPSBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLWhlYWQiIH0pOwogICAgICBoZWFkUm93LmFwcGVuZENoaWxkKGVsKCJkaXYiLCB7IGNsYXNzOiAidmZlZWQtaGVhZF9fdGV4dCIgfSwgWwogICAgICAgIGVsKCJzcGFuIiwgeyBjbGFzczogInYtZXllYnJvdyIsIHRleHQ6ICJJbnNwaXJhdGlvbiIgfSksCiAgICAgICAgZWwoImgxIiwgeyBjbGFzczogInYtc2VjdGlvbl9fdGl0bGUgdi1ncmFkaWVudCIsIHRleHQ6ICJDdXJhdGVkIHRyYW5zZm9ybWF0aW9ucyIgfSksCiAgICAgICAgZWwoInAiLCB7IHRleHQ6ICJUYXAgYW55IHJlc3VsdCB0byBsb2FkIGl0cyBwcm9tcHQuIERyYWcgYWNyb3NzIGEgdGlsZSB0byBzY3J1YiBiZWZvcmUgLyBhZnRlci4iIH0pCiAgICAgIF0pKTsKICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMpIGhlYWRSb3cuYXBwZW5kQ2hpbGQodGhpcy5fYnVpbGRPcHRpb25zVHJpZ2dlcigpKTsKICAgICAgd3JhcC5hcHBlbmRDaGlsZChoZWFkUm93KTsKICAgIH0KCiAgICBpZiAodGhpcy5zaG93Q2hpcHMpIHsKICAgICAgdGhpcy5jaGlwc0JhciA9IHRoaXMuX2J1aWxkQ2hpcHMoKTsKICAgICAgd3JhcC5hcHBlbmRDaGlsZCh0aGlzLmNoaXBzQmFyKTsKICAgIH0KCiAgICB0aGlzLmdyaWRFbCA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidmZlZWQiLCByb2xlOiAibGlzdCIsICJhcmlhLWxhYmVsIjogIkN1cmF0ZWQgaW5zcGlyYXRpb24gZ2FsbGVyeSIgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKHRoaXMuZ3JpZEVsKTsKCiAgICB2YXIgZm9vdGVyID0gZWwoImRpdiIsIHsgY2xhc3M6ICJ2ZmVlZC1jdGEiIH0pOwogICAgdGhpcy5zdGF0dXNFbCA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidmZlZWQtbG9hZGluZyIsICJhcmlhLWxpdmUiOiAicG9saXRlIiB9KTsKICAgIHRoaXMuc2VudGluZWwgPSBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLXNlbnRpbmVsIiwgImFyaWEtaGlkZGVuIjogInRydWUiIH0pOwogICAgZm9vdGVyLmFwcGVuZENoaWxkKHRoaXMuc3RhdHVzRWwpOwogICAgZm9vdGVyLmFwcGVuZENoaWxkKHRoaXMuc2VudGluZWwpOwogICAgd3JhcC5hcHBlbmRDaGlsZChmb290ZXIpOwoKICAgIHJvb3QuYXBwZW5kQ2hpbGQod3JhcCk7CgogICAgdGhpcy5fYXBwbHlHcmlkQXR0cnMoKTsKICAgIHZhciBjb2xzID0gY29sdW1uc0ZvcldpZHRoKHRoaXMuZ3JpZEVsLmNsaWVudFdpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoIHx8IDEwMjQsIHRoaXMucHJlZnMuZ3JpZFN0eWxlKTsKICAgIHRoaXMubGF5b3V0ID0gbmV3IENvbHVtbkxheW91dCh0aGlzLmdyaWRFbCwgY29scyk7CiAgICB0aGlzLl9zaG93U2tlbGV0b25zKE1hdGgubWluKHRoaXMucGVyLCB0aGlzLmlubGluZSA/ICh0aGlzLmxpbWl0IHx8IElOTElORV9ERUZBVUxUKSA6IDkpKTsKCiAgICB0aGlzLl9zZXR1cFJlc2l6ZSgpOwogICAgdGhpcy5fc2V0dXBPYnNlcnZlcigpOwogICAgdGhpcy5sb2FkTmV4dCh0cnVlKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX2FwcGx5R3JpZEF0dHJzID0gZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLmdyaWRFbCkgcmV0dXJuOwogICAgdGhpcy5ncmlkRWwuc2V0QXR0cmlidXRlKCJkYXRhLWdyaWQiLCB0aGlzLnByZWZzLmdyaWRTdHlsZSk7CiAgICB0aGlzLmdyaWRFbC5zZXRBdHRyaWJ1dGUoImRhdGEtY2VsbG1vZGUiLCB0aGlzLnByZWZzLmNlbGxNb2RlKTsKICAgIHRoaXMuZ3JpZEVsLnNldEF0dHJpYnV0ZSgiZGF0YS1lZmZlY3QiLCB0aGlzLnByZWZzLmVmZmVjdCk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9idWlsZE9wdGlvbnNUcmlnZ2VyID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIGJ0biA9IGVsKCJidXR0b24iLCB7CiAgICAgIGNsYXNzOiAidi1jdGEgdi1jdGEtLWdob3N0IHZmZWVkLW9wdGlvbnMtdHJpZ2dlciIsCiAgICAgIHR5cGU6ICJidXR0b24iLAogICAgICAiYXJpYS1oYXNwb3B1cCI6ICJkaWFsb2ciLAogICAgICB0aXRsZTogIkRpc3BsYXkgb3B0aW9ucyIsCiAgICAgICJhcmlhLWxhYmVsIjogIkRpc3BsYXkgb3B0aW9ucyIKICAgIH0sIFsKICAgICAgZWwoInNwYW4iLCB7IGNsYXNzOiAidmZlZWQtb3B0aW9ucy10cmlnZ2VyX19pY28iLCAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIsIGh0bWw6IG9wdGlvbnNHbHlwaCgpIH0pLAogICAgICBlbCgic3BhbiIsIHsgdGV4dDogIkRpc3BsYXkiIH0pCiAgICBdKTsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsgc2VsZi5fb3Blbk9wdGlvbnMoKTsgfSk7CiAgICByZXR1cm4gYnRuOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fb3Blbk9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgY29udGVudCA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidmZlZWQtb3B0cyIgfSk7CgogICAgY29udGVudC5hcHBlbmRDaGlsZChlbCgiaDIiLCB7IGNsYXNzOiAidmZlZWQtb3B0c19fdGl0bGUiLCB0ZXh0OiAiRGlzcGxheSBvcHRpb25zIiB9KSk7CgogICAgY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLl9zZWdtZW50Um93KCJHcmlkIiwgR1JJRF9TVFlMRVMsIHRoaXMucHJlZnMuZ3JpZFN0eWxlLCBmdW5jdGlvbiAodikgewogICAgICBzZWxmLl9zZXRQcmVmKCJncmlkU3R5bGUiLCB2KTsKICAgICAgc2VsZi5fcmVmbG93Q29sdW1ucygpOwogICAgfSkpOwoKICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5fc2VnbWVudFJvdygiQ2VsbCBtb2RlIiwgQ0VMTF9NT0RFUywgdGhpcy5wcmVmcy5jZWxsTW9kZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgc2VsZi5fc2V0UHJlZigiY2VsbE1vZGUiLCB2KTsKICAgICAgc2VsZi5fcmVyZW5kZXJDYXJkcygpOwogICAgfSkpOwoKICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5fc2xpZGVyUm93KCJTcGVlZCIsIDAuMjUsIDMuMCwgMC4yNSwgdGhpcy5wcmVmcy5zcGVlZCwgZnVuY3Rpb24gKG4pIHsgcmV0dXJuIG4udG9GaXhlZCgyKSArICLDlyI7IH0sIGZ1bmN0aW9uICh2KSB7CiAgICAgIHNlbGYuX3NldFByZWYoInNwZWVkIiwgdik7CiAgICAgIHNlbGYuc3RhdGVzLmZvckVhY2goZnVuY3Rpb24gKHMpIHsgaWYgKHMpIHMuc3BlZWQgPSB2OyB9KTsKICAgIH0pKTsKCiAgICBjb250ZW50LmFwcGVuZENoaWxkKHRoaXMuX3NlbGVjdFJvdygiRWZmZWN0IiwgRUZGRUNUUywgdGhpcy5wcmVmcy5lZmZlY3QsIGZ1bmN0aW9uICh2KSB7CiAgICAgIHNlbGYuX3NldFByZWYoImVmZmVjdCIsIHYpOwogICAgICBzZWxmLl9hcHBseUVmZmVjdCgpOwogICAgfSkpOwoKICAgIHZhciByZXNldEJ0biA9IGVsKCJidXR0b24iLCB7IGNsYXNzOiAidi1jdGEgdi1jdGEtLWdob3N0IHZmZWVkLW9wdHNfX3Jlc2V0IiwgdHlwZTogImJ1dHRvbiIsIHRleHQ6ICJSZXNldCB0byBkZWZhdWx0cyIgfSk7CiAgICByZXNldEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgc2VsZi5wcmVmcyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfUFJFRlMpOwogICAgICBPYmplY3Qua2V5cyhERUZBVUxUX1BSRUZTKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IHByZWZTZXQoaywgREVGQVVMVF9QUkVGU1trXSk7IH0pOwogICAgICBpZiAoc2VsZi5fb3B0c1JlZiAmJiBzZWxmLl9vcHRzUmVmLmNsb3NlKSBzZWxmLl9vcHRzUmVmLmNsb3NlKCk7CiAgICAgIHNlbGYuX3JlZmxvd0NvbHVtbnMoKTsKICAgICAgc2VsZi5fcmVyZW5kZXJDYXJkcygpOwogICAgfSk7CiAgICBjb250ZW50LmFwcGVuZENoaWxkKHJlc2V0QnRuKTsKCiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5zaGVldCA9PT0gImZ1bmN0aW9uIikgewogICAgICB0aGlzLl9vcHRzUmVmID0gVi51aS5zaGVldChjb250ZW50LCB7IGFyaWFMYWJlbDogIkRpc3BsYXkgb3B0aW9ucyIsIGNsYXNzTmFtZTogInZmZWVkLW9wdHMtc2hlZXQiIH0pOwogICAgfSBlbHNlIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLm1vZGFsID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHRoaXMuX29wdHNSZWYgPSBWLnVpLm1vZGFsKGNvbnRlbnQsIHsgYXJpYUxhYmVsOiAiRGlzcGxheSBvcHRpb25zIiwgY2xhc3NOYW1lOiAidmZlZWQtb3B0cy1zaGVldCIgfSk7CiAgICB9CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9zZXRQcmVmID0gZnVuY3Rpb24gKGtleSwgdmFsKSB7CiAgICB0aGlzLnByZWZzW2tleV0gPSB2YWw7CiAgICBwcmVmU2V0KGtleSwgdmFsKTsKICAgIGlmIChrZXkgPT09ICJncmlkU3R5bGUiIHx8IGtleSA9PT0gImNlbGxNb2RlIiB8fCBrZXkgPT09ICJlZmZlY3QiKSB0aGlzLl9hcHBseUdyaWRBdHRycygpOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fYXBwbHlFZmZlY3QgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMuZ3JpZEVsKSByZXR1cm47CiAgICB2YXIgZWZmID0gdGhpcy5wcmVmcy5lZmZlY3Q7CiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRoaXMuZ3JpZEVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi52Y2FyZFtkYXRhLW1vZGVdIiksIGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjLmdldEF0dHJpYnV0ZSgiZGF0YS1tb2RlIikgIT09ICJhZnRlck9ubHkiKSBjLnNldEF0dHJpYnV0ZSgiZGF0YS1lZmZlY3QiLCBlZmYpOwogICAgfSk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9zZWdtZW50Um93ID0gZnVuY3Rpb24gKGxhYmVsLCBvcHRpb25zLCB2YWx1ZSwgb25QaWNrKSB7CiAgICB2YXIgc2VnID0gZWwoImRpdiIsIHsgY2xhc3M6ICJ2ZmVlZC1zZWciLCByb2xlOiAicmFkaW9ncm91cCIsICJhcmlhLWxhYmVsIjogbGFiZWwgfSk7CiAgICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9wdCkgewogICAgICB2YXIgYWN0aXZlID0gb3B0LmtleSA9PT0gdmFsdWU7CiAgICAgIHZhciBiID0gZWwoImJ1dHRvbiIsIHsKICAgICAgICBjbGFzczogInZmZWVkLXNlZ19fYnRuIiArIChhY3RpdmUgPyAiIGlzLWFjdGl2ZSIgOiAiIiksCiAgICAgICAgdHlwZTogImJ1dHRvbiIsCiAgICAgICAgcm9sZTogInJhZGlvIiwKICAgICAgICAiYXJpYS1jaGVja2VkIjogYWN0aXZlID8gInRydWUiIDogImZhbHNlIiwKICAgICAgICAiZGF0YS12YWwiOiBvcHQua2V5LAogICAgICAgIHRleHQ6IG9wdC5sYWJlbAogICAgICB9KTsKICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHNlZy5xdWVyeVNlbGVjdG9yQWxsKCIudmZlZWQtc2VnX19idG4iKSwgZnVuY3Rpb24gKG4pIHsKICAgICAgICAgIHZhciBvbiA9IG4uZ2V0QXR0cmlidXRlKCJkYXRhLXZhbCIpID09PSBvcHQua2V5OwogICAgICAgICAgbi5jbGFzc0xpc3QudG9nZ2xlKCJpcy1hY3RpdmUiLCBvbik7CiAgICAgICAgICBuLnNldEF0dHJpYnV0ZSgiYXJpYS1jaGVja2VkIiwgb24gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICAgICB9KTsKICAgICAgICBvblBpY2sob3B0LmtleSk7CiAgICAgIH0pOwogICAgICBzZWcuYXBwZW5kQ2hpbGQoYik7CiAgICB9KTsKICAgIHJldHVybiBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLW9wdHNfX3JvdyIgfSwgWwogICAgICBlbCgic3BhbiIsIHsgY2xhc3M6ICJ2ZmVlZC1vcHRzX19sYWJlbCIsIHRleHQ6IGxhYmVsIH0pLAogICAgICBzZWcKICAgIF0pOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fc2VsZWN0Um93ID0gZnVuY3Rpb24gKGxhYmVsLCBvcHRpb25zLCB2YWx1ZSwgb25QaWNrKSB7CiAgICB2YXIgc2VsID0gZWwoInNlbGVjdCIsIHsgY2xhc3M6ICJ2LXNlbGVjdCB2ZmVlZC1vcHRzX19zZWxlY3QiLCAiYXJpYS1sYWJlbCI6IGxhYmVsIH0pOwogICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvcHQpIHsKICAgICAgdmFyIG8gPSBlbCgib3B0aW9uIiwgeyB2YWx1ZTogb3B0LmtleSwgdGV4dDogb3B0LmxhYmVsIH0pOwogICAgICBpZiAob3B0LmtleSA9PT0gdmFsdWUpIG8uc2VsZWN0ZWQgPSB0cnVlOwogICAgICBzZWwuYXBwZW5kQ2hpbGQobyk7CiAgICB9KTsKICAgIHNlbC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7IG9uUGljayhzZWwudmFsdWUpOyB9KTsKICAgIHJldHVybiBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLW9wdHNfX3JvdyIgfSwgWwogICAgICBlbCgic3BhbiIsIHsgY2xhc3M6ICJ2ZmVlZC1vcHRzX19sYWJlbCIsIHRleHQ6IGxhYmVsIH0pLAogICAgICBzZWwKICAgIF0pOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fc2xpZGVyUm93ID0gZnVuY3Rpb24gKGxhYmVsLCBtaW4sIG1heCwgc3RlcCwgdmFsdWUsIGZtdCwgb25JbnB1dCkgewogICAgdmFyIHZhbEVsID0gZWwoInNwYW4iLCB7IGNsYXNzOiAidmZlZWQtb3B0c19fdmFsIiwgdGV4dDogZm10KHZhbHVlKSB9KTsKICAgIHZhciBpbnB1dCA9IGVsKCJpbnB1dCIsIHsKICAgICAgdHlwZTogInJhbmdlIiwKICAgICAgY2xhc3M6ICJ2ZmVlZC1yYW5nZSIsCiAgICAgIG1pbjogU3RyaW5nKG1pbiksCiAgICAgIG1heDogU3RyaW5nKG1heCksCiAgICAgIHN0ZXA6IFN0cmluZyhzdGVwKSwKICAgICAgdmFsdWU6IFN0cmluZyh2YWx1ZSksCiAgICAgICJhcmlhLWxhYmVsIjogbGFiZWwKICAgIH0pOwogICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBuID0gTnVtYmVyKGlucHV0LnZhbHVlKTsKICAgICAgdmFsRWwudGV4dENvbnRlbnQgPSBmbXQobik7CiAgICAgIG9uSW5wdXQobik7CiAgICB9KTsKICAgIHJldHVybiBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLW9wdHNfX3JvdyB2ZmVlZC1vcHRzX19yb3ctLXNsaWRlciIgfSwgWwogICAgICBlbCgiZGl2IiwgeyBjbGFzczogInZmZWVkLW9wdHNfX3NsaWRlcmhlYWQiIH0sIFsKICAgICAgICBlbCgic3BhbiIsIHsgY2xhc3M6ICJ2ZmVlZC1vcHRzX19sYWJlbCIsIHRleHQ6IGxhYmVsIH0pLAogICAgICAgIHZhbEVsCiAgICAgIF0pLAogICAgICBpbnB1dAogICAgXSk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9yZWZsb3dDb2x1bW5zID0gZnVuY3Rpb24gKCkgewogICAgaWYgKHRoaXMuZGVzdHJveWVkIHx8ICF0aGlzLmxheW91dCB8fCAhdGhpcy5ncmlkRWwpIHJldHVybjsKICAgIHRoaXMuX2FwcGx5R3JpZEF0dHJzKCk7CiAgICB2YXIgY29scyA9IGNvbHVtbnNGb3JXaWR0aCh0aGlzLmdyaWRFbC5jbGllbnRXaWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAxMDI0LCB0aGlzLnByZWZzLmdyaWRTdHlsZSk7CiAgICB0aGlzLmxheW91dC5zZXRDb2x1bW5zKGNvbHMpOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fcmVyZW5kZXJDYXJkcyA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdGhpcy5sYXlvdXQpIHJldHVybjsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHVucmVnaXN0ZXJTdGF0ZXModGhpcy5zdGF0ZXMpOwogICAgdGhpcy5zdGF0ZXMgPSBbXTsKICAgIHRoaXMubGF5b3V0LmNsZWFyKCk7CiAgICB0aGlzLml0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0KSB7CiAgICAgIHNlbGYubGF5b3V0LmFkZChidWlsZENhcmQoaXQsIHNlbGYucHJlZnMsIHNlbGYpLCBjYXJkV2VpZ2h0KGl0KSk7CiAgICB9KTsKICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmRvbmUgJiYgIXRoaXMuZXJyb3JlZCkgdGhpcy5fcmVuZGVyRW1wdHkoKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX2J1aWxkQ2hpcHMgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgYmFyID0gZWwoImRpdiIsIHsgY2xhc3M6ICJ2LWNoaXAtcm93IHZmZWVkLWNoaXBzIiwgcm9sZTogInRhYmxpc3QiLCAiYXJpYS1sYWJlbCI6ICJGaWx0ZXIgYnkgdGhlbWUiIH0pOwogICAgVEFHUy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgIHZhciBhY3RpdmUgPSAodC5rZXkgPT09IHNlbGYudGFnKTsKICAgICAgdmFyIGNoaXAgPSBlbCgiYnV0dG9uIiwgewogICAgICAgIGNsYXNzOiAidi1jaGlwIiArIChhY3RpdmUgPyAiIHYtY2hpcC0tYWN0aXZlIiA6ICIiKSwKICAgICAgICB0eXBlOiAiYnV0dG9uIiwKICAgICAgICByb2xlOiAidGFiIiwKICAgICAgICAiYXJpYS1zZWxlY3RlZCI6IGFjdGl2ZSA/ICJ0cnVlIiA6ICJmYWxzZSIsCiAgICAgICAgImRhdGEtdGFnIjogdC5rZXksCiAgICAgICAgdGV4dDogdC5sYWJlbAogICAgICB9KTsKICAgICAgY2hpcC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoc2VsZi50YWcgPT09IHQua2V5KSByZXR1cm47CiAgICAgICAgc2VsZi5zZXRUYWcodC5rZXkpOwogICAgICAgIHZhciBucSA9ICIjL2luc3BpcmF0aW9uIiArICh0LmtleSA/ICI/dGFnPSIgKyBlbmNvZGVVUklDb21wb25lbnQodC5rZXkpIDogIiIpOwogICAgICAgIGlmIChsb2NhdGlvbi5oYXNoICE9PSBucSkgewogICAgICAgICAgaWYgKFYucm91dGVyICYmIHR5cGVvZiBWLnJvdXRlci5yZXBsYWNlID09PSAiZnVuY3Rpb24iKSBWLnJvdXRlci5yZXBsYWNlKG5xKTsKICAgICAgICAgIGVsc2UgaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgIiIsIG5xKTsKICAgICAgICB9CiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiYXIucXVlcnlTZWxlY3RvckFsbCgiLnYtY2hpcCIpLCBmdW5jdGlvbiAoYykgewogICAgICAgICAgdmFyIG9uID0gYy5nZXRBdHRyaWJ1dGUoImRhdGEtdGFnIikgPT09IHQua2V5OwogICAgICAgICAgYy5jbGFzc0xpc3QudG9nZ2xlKCJ2LWNoaXAtLWFjdGl2ZSIsIG9uKTsKICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwgb24gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICAgICB9KTsKICAgICAgICB0cnkgeyBjaGlwLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICJzbW9vdGgiLCBpbmxpbmU6ICJjZW50ZXIiLCBibG9jazogIm5lYXJlc3QiIH0pOyB9IGNhdGNoIChlKSB7fQogICAgICB9KTsKICAgICAgYmFyLmFwcGVuZENoaWxkKGNoaXApOwogICAgfSk7CiAgICByZXR1cm4gYmFyOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5zZXRUYWcgPSBmdW5jdGlvbiAodGFnKSB7CiAgICB0YWcgPSB0YWcgfHwgIiI7CiAgICBpZiAodGFnID09PSB0aGlzLnRhZykgcmV0dXJuOwogICAgdGhpcy50YWcgPSB0YWc7CiAgICB0aGlzLl9yZWxvYWQoKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuX3JlbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuX3JlcVRva2VuKys7CiAgICB0aGlzLnBhZ2UgPSAxOwogICAgdGhpcy5pdGVtcyA9IFtdOwogICAgdGhpcy50b3RhbCA9IG51bGw7CiAgICB0aGlzLmRvbmUgPSBmYWxzZTsKICAgIHRoaXMuZXJyb3JlZCA9IGZhbHNlOwogICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICB0aGlzLnNlZW4gPSB7fTsKICAgIHVucmVnaXN0ZXJTdGF0ZXModGhpcy5zdGF0ZXMpOwogICAgdGhpcy5zdGF0ZXMgPSBbXTsKICAgIGlmICh0aGlzLmxheW91dCkgdGhpcy5sYXlvdXQuY2xlYXIoKTsKICAgIHRoaXMuX3Nob3dTa2VsZXRvbnMoTWF0aC5taW4odGhpcy5wZXIsIDkpKTsKICAgIHRoaXMubG9hZE5leHQodHJ1ZSk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9zaG93U2tlbGV0b25zID0gZnVuY3Rpb24gKG4pIHsKICAgIGlmICghdGhpcy5sYXlvdXQpIHJldHVybjsKICAgIHRoaXMubGF5b3V0LmNsZWFyKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgc2s7CiAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnNrZWxldG9uID09PSAiZnVuY3Rpb24iKSBzayA9IFYudWkuc2tlbGV0b24oImNhcmQiKTsKICAgICAgZWxzZSBzayA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidi1za2VsZXRvbiIgfSk7CiAgICAgIGlmIChzayAmJiBzay5jbGFzc0xpc3QpIHNrLmNsYXNzTGlzdC5hZGQoInZmZWVkLXNrZWwiKTsKICAgICAgaWYgKHNrICYmIHNrLnN0eWxlKSBzay5zdHlsZS5taW5IZWlnaHQgPSAoMTgwICsgKChpICogNTMpICUgMTQwKSkgKyAicHgiOwogICAgICB0aGlzLmxheW91dC5hZGQoc2ssIDEgKyAoKGkgKiAwLjM3KSAlIDAuOSkpOwogICAgfQogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fY2xlYXJTa2VsZXRvbnMgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMuZ3JpZEVsKSByZXR1cm47CiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRoaXMuZ3JpZEVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi52ZmVlZC1za2VsIiksIGZ1bmN0aW9uIChuKSB7CiAgICAgIGlmIChuLnBhcmVudE5vZGUpIG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTsKICAgIH0pOwogICAgaWYgKHRoaXMubGF5b3V0KSB7CiAgICAgIHRoaXMubGF5b3V0LmNvbEggPSB0aGlzLmxheW91dC5jb2xILm1hcChmdW5jdGlvbiAoKSB7IHJldHVybiAwOyB9KTsKICAgICAgdGhpcy5sYXlvdXQubm9kZXMgPSBbXTsKICAgIH0KICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUubG9hZE5leHQgPSBmdW5jdGlvbiAoaXNGaXJzdCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgaWYgKHRoaXMubG9hZGluZyB8fCB0aGlzLmRvbmUgfHwgdGhpcy5kZXN0cm95ZWQpIHJldHVybjsKICAgIGlmICh0aGlzLmxpbWl0ICYmIHRoaXMuaXRlbXMubGVuZ3RoID49IHRoaXMubGltaXQpIHsgdGhpcy5kb25lID0gdHJ1ZTsgdGhpcy5fcmVuZGVyRm9vdGVyKCk7IHJldHVybjsgfQoKICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICB0aGlzLmVycm9yZWQgPSBmYWxzZTsKICAgIHZhciB0b2tlbiA9ICsrdGhpcy5fcmVxVG9rZW47CiAgICB0aGlzLl9yZW5kZXJGb290ZXIoKTsKCiAgICB2YXIgZmV0Y2hlciA9IChWLmFwaSAmJiB0eXBlb2YgVi5hcGkuY3VyYXRlZEZlZWQgPT09ICJmdW5jdGlvbiIpCiAgICAgID8gVi5hcGkuY3VyYXRlZEZlZWQodGhpcy5wYWdlLCB0aGlzLnBlciwgdGhpcy50YWcgfHwgbnVsbCkKICAgICAgOiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkZlZWQgQVBJIHVuYXZhaWxhYmxlIikpOwoKICAgIFByb21pc2UucmVzb2x2ZShmZXRjaGVyKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgaWYgKHNlbGYuZGVzdHJveWVkIHx8IHRva2VuICE9PSBzZWxmLl9yZXFUb2tlbikgcmV0dXJuOwogICAgICBzZWxmLmxvYWRpbmcgPSBmYWxzZTsKCiAgICAgIHZhciBpdGVtcyA9IFtdOwogICAgICB2YXIgbWV0YSA9IG51bGw7CiAgICAgIGlmIChyZXMgJiYgQXJyYXkuaXNBcnJheShyZXMuaXRlbXMpKSB7IGl0ZW1zID0gcmVzLml0ZW1zOyBtZXRhID0gcmVzLm1ldGFkYXRhIHx8IG51bGw7IH0KICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXMpKSB7IGl0ZW1zID0gcmVzOyB9CgogICAgICBpZiAobWV0YSAmJiB0eXBlb2YgbWV0YS50b3RhbCA9PT0gIm51bWJlciIpIHNlbGYudG90YWwgPSBtZXRhLnRvdGFsOwoKICAgICAgaWYgKGlzRmlyc3QpIHNlbGYuX2NsZWFyU2tlbGV0b25zKCk7CgogICAgICB2YXIgYWRkZWQgPSAwOwogICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdCkgewogICAgICAgIHZhciBnaSA9IGltYWdlT2YoaXQpOwogICAgICAgIGlmICghYWZ0ZXJVUkwoZ2kpICYmICFiZWZvcmVVUkwoZ2kpKSByZXR1cm47CiAgICAgICAgdmFyIGlkID0gZ2kucmVtb3RlSUQgfHwgZ2kuaWQ7CiAgICAgICAgdmFyIGRrZXkgPSBpZCB8fCAoYWZ0ZXJVUkwoZ2kpICsgInwiICsgKGdpLnByb21wdCB8fCAiIikpOwogICAgICAgIGlmIChzZWxmLnNlZW5bZGtleV0pIHJldHVybjsKICAgICAgICBzZWxmLnNlZW5bZGtleV0gPSB0cnVlOwogICAgICAgIGlmIChzZWxmLmxpbWl0ICYmIHNlbGYuaXRlbXMubGVuZ3RoID49IHNlbGYubGltaXQpIHJldHVybjsKICAgICAgICBzZWxmLml0ZW1zLnB1c2goaXQpOwogICAgICAgIHNlbGYubGF5b3V0LmFkZChidWlsZENhcmQoaXQsIHNlbGYucHJlZnMsIHNlbGYpLCBjYXJkV2VpZ2h0KGl0KSk7CiAgICAgICAgYWRkZWQrKzsKICAgICAgfSk7CgogICAgICBpZiAoaXRlbXMubGVuZ3RoIDwgc2VsZi5wZXIpIHNlbGYuZG9uZSA9IHRydWU7CiAgICAgIGlmIChzZWxmLmxpbWl0ICYmIHNlbGYuaXRlbXMubGVuZ3RoID49IHNlbGYubGltaXQpIHNlbGYuZG9uZSA9IHRydWU7CiAgICAgIGlmIChzZWxmLnRvdGFsICE9IG51bGwgJiYgc2VsZi5pdGVtcy5sZW5ndGggPj0gc2VsZi50b3RhbCkgc2VsZi5kb25lID0gdHJ1ZTsKCiAgICAgIGlmIChhZGRlZCA+IDAgfHwgc2VsZi5pdGVtcy5sZW5ndGggPiAwKSBzZWxmLnBhZ2UrKzsKCiAgICAgIGlmIChpc0ZpcnN0ICYmIHNlbGYuaXRlbXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgc2VsZi5kb25lID0gdHJ1ZTsKICAgICAgICBzZWxmLl9yZW5kZXJFbXB0eSgpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgc2VsZi5fcmVuZGVyRm9vdGVyKCk7CiAgICAgIHNlbGYuX21heWJlQXV0b0xvYWQoKTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgaWYgKHNlbGYuZGVzdHJveWVkIHx8IHRva2VuICE9PSBzZWxmLl9yZXFUb2tlbikgcmV0dXJuOwogICAgICBzZWxmLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgc2VsZi5lcnJvcmVkID0gdHJ1ZTsKICAgICAgaWYgKGlzRmlyc3QpIHsKICAgICAgICBzZWxmLl9jbGVhclNrZWxldG9ucygpOwogICAgICAgIGlmIChzZWxmLml0ZW1zLmxlbmd0aCA9PT0gMCkgeyBzZWxmLl9yZW5kZXJFcnJvcihlcnIpOyByZXR1cm47IH0KICAgICAgfQogICAgICBzZWxmLl9yZW5kZXJGb290ZXIoKTsKICAgIH0pOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fbWF5YmVBdXRvTG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLmRvbmUgfHwgdGhpcy5sb2FkaW5nIHx8IHRoaXMuZGVzdHJveWVkIHx8ICF0aGlzLnNlbnRpbmVsKSByZXR1cm47CiAgICB2YXIgciA9IHRoaXMuc2VudGluZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICB2YXIgdmggPSB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDsKICAgIGlmIChyLnRvcCA8IHZoICsgMzAwKSB7CiAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7IHNlbGYubG9hZE5leHQoKTsgfSk7CiAgICB9CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9yZW5kZXJGb290ZXIgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMuc3RhdHVzRWwpIHJldHVybjsKICAgIHZhciBzID0gdGhpcy5zdGF0dXNFbDsKICAgIHMuaW5uZXJIVE1MID0gIiI7CiAgICBpZiAodGhpcy5sb2FkaW5nKSB7CiAgICAgIHZhciBzcGluID0gKFYudWkgJiYgdHlwZW9mIFYudWkuc3Bpbm5lciA9PT0gImZ1bmN0aW9uIikgPyBWLnVpLnNwaW5uZXIoKSA6IGVsKCJzcGFuIiwgeyBjbGFzczogInYtc3Bpbm5lciIgfSk7CiAgICAgIHMuYXBwZW5kQ2hpbGQoc3Bpbik7CiAgICAgIHMuYXBwZW5kQ2hpbGQoZWwoInNwYW4iLCB7IHRleHQ6IHRoaXMuaXRlbXMubGVuZ3RoID8gIkxvYWRpbmcgbW9yZeKApiIgOiAiTG9hZGluZyBpbnNwaXJhdGlvbuKApiIgfSkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5lcnJvcmVkKSB7CiAgICAgIHMuYXBwZW5kQ2hpbGQoZWwoInNwYW4iLCB7IHRleHQ6ICJDb3VsZG7igJl0IGxvYWQgbW9yZSByZXN1bHRzLiIgfSkpOwogICAgICB2YXIgcmV0cnkgPSBlbCgiYnV0dG9uIiwgeyBjbGFzczogInYtY3RhIHYtY3RhLS1naG9zdCB2ZmVlZC1yZXRyeSIsIHR5cGU6ICJidXR0b24iLCB0ZXh0OiAiUmV0cnkiIH0pOwogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIHJldHJ5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgeyBzZWxmLmxvYWROZXh0KCk7IH0pOwogICAgICBzLmFwcGVuZENoaWxkKHJldHJ5KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuZG9uZSAmJiB0aGlzLml0ZW1zLmxlbmd0aCA+IDAgJiYgIXRoaXMuaW5saW5lKSB7CiAgICAgIHMuYXBwZW5kQ2hpbGQoZWwoInNwYW4iLCB7IHRleHQ6ICJZb3XigJl2ZSByZWFjaGVkIHRoZSBlbmQuIiB9KSk7CiAgICB9CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9yZW5kZXJFbXB0eSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIGlmICh0aGlzLmxheW91dCkgdGhpcy5sYXlvdXQuY2xlYXIoKTsKICAgIGlmICh0aGlzLnN0YXR1c0VsKSB0aGlzLnN0YXR1c0VsLmlubmVySFRNTCA9ICIiOwogICAgdmFyIG1zZyA9IHRoaXMudGFnCiAgICAgID8gIk5vIGluc3BpcmF0aW9uIGZvdW5kIGZvciDigJwiICsgdGhpcy50YWcgKyAi4oCdIHlldC4iCiAgICAgIDogIk5vIGluc3BpcmF0aW9uIHRvIHNob3cgeWV0LiI7CiAgICB2YXIgYWN0aW9uTGFiZWwgPSB0aGlzLnRhZyA/ICJDbGVhciBmaWx0ZXIiIDogIlN0YXJ0IGNyZWF0aW5nIjsKICAgIHZhciBvbkFjdGlvbiA9IHRoaXMudGFnCiAgICAgID8gZnVuY3Rpb24gKCkgewogICAgICAgICAgc2VsZi5zZXRUYWcoIiIpOwogICAgICAgICAgaWYgKHNlbGYuY2hpcHNCYXIpIHsKICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzZWxmLmNoaXBzQmFyLnF1ZXJ5U2VsZWN0b3JBbGwoIi52LWNoaXAiKSwgZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICB2YXIgb24gPSBjLmdldEF0dHJpYnV0ZSgiZGF0YS10YWciKSA9PT0gIiI7CiAgICAgICAgICAgICAgYy5jbGFzc0xpc3QudG9nZ2xlKCJ2LWNoaXAtLWFjdGl2ZSIsIG9uKTsKICAgICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsIG9uID8gInRydWUiIDogImZhbHNlIik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgOiBmdW5jdGlvbiAoKSB7IGdvKCIjL2NyZWF0ZSIpOyB9OwoKICAgIHZhciBlbXB0eU5vZGU7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5lbXB0eSA9PT0gImZ1bmN0aW9uIikgewogICAgICBlbXB0eU5vZGUgPSBWLnVpLmVtcHR5KG1zZywgYWN0aW9uTGFiZWwsIG9uQWN0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIGVtcHR5Tm9kZSA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidi1lbXB0eSIgfSwgWwogICAgICAgIGVsKCJwIiwgeyBjbGFzczogInYtZW1wdHlfX3RpdGxlIiwgdGV4dDogbXNnIH0pLAogICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgYiA9IGVsKCJidXR0b24iLCB7IGNsYXNzOiAidi1jdGEgdi1jdGEtLXByaW1hcnkiLCB0eXBlOiAiYnV0dG9uIiwgdGV4dDogYWN0aW9uTGFiZWwgfSk7CiAgICAgICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgb25BY3Rpb24pOwogICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgfSkoKQogICAgICBdKTsKICAgIH0KICAgIGlmIChlbXB0eU5vZGUgJiYgZW1wdHlOb2RlLmNsYXNzTGlzdCkgZW1wdHlOb2RlLmNsYXNzTGlzdC5hZGQoInZmZWVkLWVtcHR5Iik7CiAgICB0aGlzLmdyaWRFbC5hcHBlbmRDaGlsZChlbXB0eU5vZGUpOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fcmVuZGVyRXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBpZiAodGhpcy5sYXlvdXQpIHRoaXMubGF5b3V0LmNsZWFyKCk7CiAgICBpZiAodGhpcy5zdGF0dXNFbCkgdGhpcy5zdGF0dXNFbC5pbm5lckhUTUwgPSAiIjsKICAgIHZhciBkZXRhaWwgPSAoZXJyICYmIGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogIlNvbWV0aGluZyB3ZW50IHdyb25nIGxvYWRpbmcgdGhlIGZlZWQuIjsKCiAgICB2YXIgbm9kZSA9IGVsKCJkaXYiLCB7IGNsYXNzOiAidi1lbXB0eSB2ZmVlZC1lcnJvciIsIHJvbGU6ICJhbGVydCIgfSwgWwogICAgICBlbCgiZGl2IiwgeyBjbGFzczogInYtZW1wdHlfX2ljb24iLCAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIsIGh0bWw6IGVycm9yR2x5cGgoKSB9KSwKICAgICAgZWwoInAiLCB7IGNsYXNzOiAidi1lbXB0eV9fdGl0bGUiLCB0ZXh0OiAiV2UgY291bGRu4oCZdCBsb2FkIGluc3BpcmF0aW9uLiIgfSksCiAgICAgIGVsKCJwIiwgeyBjbGFzczogInYtZW1wdHlfX3N1YiIsIHRleHQ6IGRldGFpbCB9KSwKICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgYiA9IGVsKCJidXR0b24iLCB7IGNsYXNzOiAidi1jdGEgdi1jdGEtLXByaW1hcnkiLCB0eXBlOiAiYnV0dG9uIiwgdGV4dDogIlRyeSBhZ2FpbiIgfSk7CiAgICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsgc2VsZi5fcmVsb2FkKCk7IH0pOwogICAgICAgIHJldHVybiBiOwogICAgICB9KSgpCiAgICBdKTsKICAgIHRoaXMuZ3JpZEVsLmFwcGVuZENoaWxkKG5vZGUpOwogIH07CgogIEZlZWRDb250cm9sbGVyLnByb3RvdHlwZS5fc2V0dXBPYnNlcnZlciA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIGlmICghKCJJbnRlcnNlY3Rpb25PYnNlcnZlciIgaW4gd2luZG93KSB8fCAhdGhpcy5zZW50aW5lbCkgcmV0dXJuOwogICAgdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbiAoZW50cmllcykgewogICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICBpZiAoZS5pc0ludGVyc2VjdGluZykgc2VsZi5sb2FkTmV4dCgpOwogICAgICB9KTsKICAgIH0sIHsgcm9vdE1hcmdpbjogIjYwMHB4IDBweCIgfSk7CiAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy5zZW50aW5lbCk7CiAgfTsKCiAgRmVlZENvbnRyb2xsZXIucHJvdG90eXBlLl9zZXR1cFJlc2l6ZSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHRoaXMuX29uUmVzaXplID0gZGVib3VuY2UoZnVuY3Rpb24gKCkgewogICAgICBzZWxmLl9yZWZsb3dDb2x1bW5zKCk7CiAgICB9LCAxNjApOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIHRoaXMuX29uUmVzaXplKTsKICB9OwoKICBGZWVkQ29udHJvbGxlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTsKICAgIHRoaXMuX3JlcVRva2VuKys7CiAgICB1bnJlZ2lzdGVyU3RhdGVzKHRoaXMuc3RhdGVzKTsKICAgIHRoaXMuc3RhdGVzID0gW107CiAgICBpZiAodGhpcy5vYnNlcnZlcikgeyB0cnkgeyB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTsgfSBjYXRjaCAoZSkge30gdGhpcy5vYnNlcnZlciA9IG51bGw7IH0KICAgIGlmICh0aGlzLl9vblJlc2l6ZSkgeyB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIiwgdGhpcy5fb25SZXNpemUpOyB0aGlzLl9vblJlc2l6ZSA9IG51bGw7IH0KICAgIGlmICh0aGlzLl9vcHRzUmVmICYmIHRoaXMuX29wdHNSZWYuY2xvc2UpIHsgdHJ5IHsgdGhpcy5fb3B0c1JlZi5jbG9zZSgpOyB9IGNhdGNoIChlKSB7fSB0aGlzLl9vcHRzUmVmID0gbnVsbDsgfQogIH07CgogIGZ1bmN0aW9uIG9wdGlvbnNHbHlwaCgpIHsKICAgIHJldHVybiAnPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS43IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik00IDZoMTAiLz48cGF0aCBkPSJNMTggNmgyIi8+PGNpcmNsZSBjeD0iMTYiIGN5PSI2IiByPSIyIi8+PHBhdGggZD0iTTQgMTJoMiIvPjxwYXRoIGQ9Ik0xMCAxMmgxMCIvPjxjaXJjbGUgY3g9IjgiIGN5PSIxMiIgcj0iMiIvPjxwYXRoIGQ9Ik00IDE4aDEwIi8+PHBhdGggZD0iTTE4IDE4aDIiLz48Y2lyY2xlIGN4PSIxNiIgY3k9IjE4IiByPSIyIi8+PC9zdmc+JzsKICB9CgogIGZ1bmN0aW9uIGVycm9yR2x5cGgoKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5pY29uID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHZhciByID0gVi51aS5pY29uKCJhbGVydCIpOwogICAgICBpZiAodHlwZW9mIHIgPT09ICJzdHJpbmciKSByZXR1cm4gcjsKICAgICAgaWYgKHIgaW5zdGFuY2VvZiBOb2RlKSB7IHZhciBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7IGQuYXBwZW5kQ2hpbGQocik7IHJldHVybiBkLmlubmVySFRNTDsgfQogICAgfQogICAgcmV0dXJuICc8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTEwLjMgMy42IDEuOCAxOGEyIDIgMCAwIDAgMS43IDNoMTdhMiAyIDAgMCAwIDEuNy0zTDEzLjcgMy42YTIgMiAwIDAgMC0zLjQgMFoiLz48bGluZSB4MT0iMTIiIHkxPSI5IiB4Mj0iMTIiIHkyPSIxMyIvPjxsaW5lIHgxPSIxMiIgeTE9IjE3IiB4Mj0iMTIuMDEiIHkyPSIxNyIvPjwvc3ZnPic7CiAgfQoKICB2YXIgY3VycmVudCA9IG51bGw7CgogIFYudmlld3MuZmVlZCA9IHsKICAgIHJlbmRlcjogZnVuY3Rpb24gKHJvb3QsIHBhcmFtcykgewogICAgICBpZiAoIXJvb3QpIHJldHVybjsKICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgICBpZiAoY3VycmVudCkgeyBjdXJyZW50LmRlc3Ryb3koKTsgY3VycmVudCA9IG51bGw7IH0KICAgICAgdmFyIHRhZyA9IChwYXJhbXMudGFnIHx8ICIiKS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICBjdXJyZW50ID0gbmV3IEZlZWRDb250cm9sbGVyKHsgbW91bnQ6IHJvb3QsIHRhZzogdGFnLCBpbmxpbmU6IGZhbHNlIH0pOwogICAgICBjdXJyZW50LnJlbmRlcigpOwogICAgfSwKCiAgICB0ZWFyZG93bjogZnVuY3Rpb24gKCkgewogICAgICBpZiAoY3VycmVudCkgeyBjdXJyZW50LmRlc3Ryb3koKTsgY3VycmVudCA9IG51bGw7IH0KICAgIH0sCgogICAgcmVuZGVySW5saW5lOiBmdW5jdGlvbiAoY29udGFpbmVyLCBvcHRzKSB7CiAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm4gbnVsbDsKICAgICAgb3B0cyA9IG9wdHMgfHwge307CiAgICAgIHZhciBjdHJsID0gbmV3IEZlZWRDb250cm9sbGVyKHsKICAgICAgICBtb3VudDogY29udGFpbmVyLAogICAgICAgIHRhZzogKG9wdHMudGFnIHx8ICIiKS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLAogICAgICAgIGlubGluZTogdHJ1ZSwKICAgICAgICBsaW1pdDogMCwKICAgICAgICBwZXI6IElOTElORV9ERUZBVUxULAogICAgICAgIHNob3dDaGlwczogZmFsc2UsCiAgICAgICAgc2hvd0hlYWRlcjogZmFsc2UsCiAgICAgICAgc2hvd09wdGlvbnM6IGZhbHNlLAogICAgICAgIG9uQXBwbHk6IG9wdHMub25BcHBseQogICAgICB9KTsKICAgICAgY3RybC5yZW5kZXIoKTsKICAgICAgcmV0dXJuIGN0cmw7CiAgICB9LAoKICAgIGFwcGx5RXhhbXBsZVRvQ3JlYXRvcjogYXBwbHlFeGFtcGxlVG9DcmVhdG9yCiAgfTsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvcHJlc2V0cy5qcyA9PT09PSAqLwooZnVuY3Rpb24gKCkgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIFYgPSB3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9OwogIFYuc3RhdGUgPSBWLnN0YXRlIHx8IHt9OwogIGlmICghQXJyYXkuaXNBcnJheShWLnN0YXRlLmN1c3RvbVByZXNldHMpKSBWLnN0YXRlLmN1c3RvbVByZXNldHMgPSBbXTsKCiAgZnVuY3Rpb24gdWkoKSB7IHJldHVybiBWLnVpIHx8IHt9OyB9CiAgZnVuY3Rpb24gYXBpKCkgeyByZXR1cm4gVi5hcGkgfHwge307IH0KICBmdW5jdGlvbiBzdG9yZSgpIHsgcmV0dXJuIFYuc3RvcmUgfHwge307IH0KICBmdW5jdGlvbiB1dGlsKCkgeyByZXR1cm4gVi51dGlsIHx8IHt9OyB9CgogIGZ1bmN0aW9uIGVsKHRhZywgYXR0cnMsIGtpZHMpIHsKICAgIGlmICh1aSgpLmVsKSByZXR1cm4gdWkoKS5lbC5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMgJiYgdHlwZW9mIGF0dHJzID09PSAib2JqZWN0IikgewogICAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICAgIHZhciB2ID0gYXR0cnNba107CiAgICAgICAgaWYgKHYgPT0gbnVsbCB8fCB2ID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgIGlmIChrID09PSAiY2xhc3MiIHx8IGsgPT09ICJjbGFzc05hbWUiKSBub2RlLmNsYXNzTmFtZSA9IHY7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gInRleHQiKSBub2RlLnRleHRDb250ZW50ID0gdjsKICAgICAgICBlbHNlIGlmIChrID09PSAiaHRtbCIpIG5vZGUuaW5uZXJIVE1MID0gdjsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoIm9uIikgPT09IDAgJiYgdHlwZW9mIHYgPT09ICJmdW5jdGlvbiIpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHYpOwogICAgICAgIGVsc2UgaWYgKGsuaW5kZXhPZigiZGF0YS0iKSA9PT0gMCkgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdik7CiAgICAgICAgZWxzZSBub2RlLnNldEF0dHJpYnV0ZShrLCB2ID09PSB0cnVlID8gIiIgOiB2KTsKICAgICAgfSk7CiAgICB9CiAgICB2YXIgcmVzdCA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgIHJlc3QuZm9yRWFjaChmdW5jdGlvbiBhcHBlbmRLaWQoYykgewogICAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlKSByZXR1cm47CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGMpKSByZXR1cm4gYy5mb3JFYWNoKGFwcGVuZEtpZCk7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoYy5ub2RlVHlwZSA/IGMgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICAgIH0pOwogICAgcmV0dXJuIG5vZGU7CiAgfQogIGZ1bmN0aW9uIGljb24obmFtZSkgewogICAgaWYgKCF1aSgpLmljb24pIHJldHVybiAiIjsKICAgIHZhciBnb3QgPSB1aSgpLmljb24obmFtZSk7CiAgICBpZiAodHlwZW9mIGdvdCA9PT0gInN0cmluZyIpIHJldHVybiBnb3Q7CiAgICBpZiAoZ290ICYmIGdvdC5ub2RlVHlwZSAmJiB0eXBlb2YgZ290Lm91dGVySFRNTCA9PT0gInN0cmluZyIpIHJldHVybiBnb3Qub3V0ZXJIVE1MOwogICAgcmV0dXJuICIiOwogIH0KICBmdW5jdGlvbiB0b2FzdChtc2csIGtpbmQpIHsgaWYgKHVpKCkudG9hc3QpIHVpKCkudG9hc3QobXNnLCBraW5kKTsgZWxzZSBpZiAoc3RvcmUoKS5lbWl0KSBzdG9yZSgpLmVtaXQoInRvYXN0IiwgeyBtc2c6IG1zZywga2luZDoga2luZCB9KTsgfQogIGZ1bmN0aW9uIHV1aWQoKSB7CiAgICBpZiAodXRpbCgpLnV1aWQpIHJldHVybiB1dGlsKCkudXVpZCgpOwogICAgaWYgKHdpbmRvdy5jcnlwdG8gJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpOwogICAgcmV0dXJuICJ4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgiLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHsKICAgICAgdmFyIHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDAsIHYgPSBjID09PSAieCIgPyByIDogKHIgJiAweDMpIHwgMHg4OyByZXR1cm4gdi50b1N0cmluZygxNik7CiAgICB9KTsKICB9CgogIHZhciBMU19LRVkgPSAidmFtcF93ZWJfY3VzdG9tUHJlc2V0cyI7CiAgZnVuY3Rpb24gcGVyc2lzdCgpIHsKICAgIGlmIChzdG9yZSgpLnNldCkgc3RvcmUoKS5zZXQoImN1c3RvbVByZXNldHMiLCBWLnN0YXRlLmN1c3RvbVByZXNldHMpOwogICAgaWYgKHN0b3JlKCkuc2F2ZSkgeyBzdG9yZSgpLnNhdmUoKTsgcmV0dXJuOyB9CiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMU19LRVksIEpTT04uc3RyaW5naWZ5KFYuc3RhdGUuY3VzdG9tUHJlc2V0cykpOyB9IGNhdGNoIChlKSB7fQogIH0KICBmdW5jdGlvbiByZXN0b3JlKCkgewogICAgdmFyIGNhY2hlZCA9IHN0b3JlKCkuZ2V0ID8gc3RvcmUoKS5nZXQoImN1c3RvbVByZXNldHMiKSA6IG51bGw7CiAgICBpZiAoQXJyYXkuaXNBcnJheShjYWNoZWQpICYmIGNhY2hlZC5sZW5ndGgpIHsgVi5zdGF0ZS5jdXN0b21QcmVzZXRzID0gY2FjaGVkLm1hcChub3JtYWxpemVQcmVzZXQpOyByZXR1cm47IH0KICAgIHRyeSB7CiAgICAgIHZhciByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19LRVkpOwogICAgICBpZiAocmF3KSBWLnN0YXRlLmN1c3RvbVByZXNldHMgPSAoSlNPTi5wYXJzZShyYXcpIHx8IFtdKS5tYXAobm9ybWFsaXplUHJlc2V0KTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiBub3dJU08oKSB7IHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXC5cZCsvLCAiIik7IH0KICBmdW5jdGlvbiBub3JtYWxpemVQcmVzZXQocCkgewogICAgcCA9IHAgfHwge307CiAgICByZXR1cm4gewogICAgICBpZDogcC5pZCB8fCB1dWlkKCksCiAgICAgIG5hbWU6IChwLm5hbWUgfHwgIiIpLnRyaW0oKSwKICAgICAgcHJvbXB0OiAocC5wcm9tcHQgfHwgIiIpLnRyaW0oKSwKICAgICAgbmVnYXRpdmVQcm9tcHQ6IChwLm5lZ2F0aXZlUHJvbXB0IHx8ICIiKS50cmltKCkgfHwgbnVsbCwKICAgICAgbW9kZWw6IHAubW9kZWwgfHwgbnVsbCwKICAgICAgY3JlYXRlZEF0OiBwLmNyZWF0ZWRBdCB8fCBub3dJU08oKSwKICAgICAgdXBkYXRlZEF0OiBwLnVwZGF0ZWRBdCB8fCBub3dJU08oKQogICAgfTsKICB9CgogIHZhciBJTkRVU1RSWV9SRUxFVkFOQ0UgPSB7CiAgICByZWFsRXN0YXRlOiBbInJlbW92ZUFsbEZ1cm5pdHVyZSIsICJyZW1vdmVDbHV0dGVyIiwgInJlbW92ZUZ1cm5pdHVyZUFuZENsdXR0ZXIiLCAicmVtb3ZlUGVvcGxlIiwgInJlbW92ZVJlZmxlY3Rpb25zIiwgImltcHJvdmVMaWdodGluZyIsICJkZXBlcnNvbmFsaXplIiwgIm5ldXRyYWxQYWludCIsICJmaXhXYWxscyIsICJhZGRDdXJiQXBwZWFsIiwgImltcHJvdmVFeHRlcmlvciIsICJpbXByb3ZlU2tpZXMiLCAibW9kZXJuU3RhZ2luZyIsICJ0cmFuc2l0aW9uYWxTdGFnaW5nIiwgIm1pbmltYWxpc3RTdGFnaW5nIiwgIndhcm1NaW5pbWFsaXN0U3RhZ2luZyIsICJsdXh1cnlTdGFnaW5nIiwgImFkZExhbmRzY2FwaW5nIiwgImNsZWFuTGFuZHNjYXBpbmciLCAiaW1wcm92ZUVudHJ5d2F5Il0sCiAgICBpbnRlcmlvckRlc2lnbjogWyJyZW1vdmVBbGxGdXJuaXR1cmUiLCAicmVtb3ZlQ2x1dHRlciIsICJyZW1vdmVGdXJuaXR1cmVBbmRDbHV0dGVyIiwgImltcHJvdmVMaWdodGluZyIsICJuZXV0cmFsUGFpbnQiLCAiZml4V2FsbHMiLCAibW9kZXJuaXplIiwgImRlcGVyc29uYWxpemUiLCAiYWRkUGxhbnRzIiwgIm1vZGVyblN0YWdpbmciLCAidHJhbnNpdGlvbmFsU3RhZ2luZyIsICJtaW5pbWFsaXN0U3RhZ2luZyIsICJ3YXJtTWluaW1hbGlzdFN0YWdpbmciLCAibWlkQ2VudHVyeU1vZGVyblN0YWdpbmciLCAiYXJ0RGVjb1N0YWdpbmciLCAiYmlvcGhpbGljU3RhZ2luZyIsICJsdXh1cnlTdGFnaW5nIl0sCiAgICBhcmNoaXRlY3R1cmU6IFsiaW1wcm92ZUV4dGVyaW9yIiwgIm1vZGVybml6ZUV4dGVyaW9yIiwgImltcHJvdmVFbnRyeXdheSIsICJpbXByb3ZlU2tpZXMiLCAiaW1wcm92ZVdlYXRoZXIiLCAiZml4V2FsbHMiLCAiYWRkT3V0ZG9vckxpdmluZyIsICJ2aW50YWdlRXh0ZXJpb3IiLCAibW9kZXJuaXplIiwgImFkZEN1cmJBcHBlYWwiLCAicmVtb3ZlUmVmbGVjdGlvbnMiXSwKICAgIGxhbmRzY2FwaW5nOiBbImNsZWFuTGFuZHNjYXBpbmciLCAiYWRkTGFuZHNjYXBpbmciLCAiYWRkQ3VyYkFwcGVhbCIsICJhZGRPdXRkb29yTGl2aW5nIiwgImFkZFBsYW50cyIsICJhZGRQb29sQXJlYSIsICJpbXByb3ZlV2VhdGhlciIsICJjaGFuZ2VTZWFzb24iLCAiaW1wcm92ZVNraWVzIiwgImJpb3BoaWxpY1N0YWdpbmciXSwKICAgIGZ1cm5pc2hpbmc6IFsicmVtb3ZlQWxsRnVybml0dXJlIiwgInJlbW92ZUZ1cm5pdHVyZUFuZENsdXR0ZXIiLCAibW9kZXJuU3RhZ2luZyIsICJ0cmFuc2l0aW9uYWxTdGFnaW5nIiwgIm1pbmltYWxpc3RTdGFnaW5nIiwgIndhcm1NaW5pbWFsaXN0U3RhZ2luZyIsICJtaWRDZW50dXJ5TW9kZXJuU3RhZ2luZyIsICJhcnREZWNvU3RhZ2luZyIsICJiaW9waGlsaWNTdGFnaW5nIiwgImx1eHVyeVN0YWdpbmciLCAiYWRkUGxhbnRzIl0sCiAgICBjb25zdHJ1Y3Rpb246IFsiZml4V2FsbHMiLCAibmV1dHJhbFBhaW50IiwgImltcHJvdmVFeHRlcmlvciIsICJtb2Rlcm5pemVFeHRlcmlvciIsICJyZW1vdmVDbHV0dGVyIiwgImltcHJvdmVMaWdodGluZyIsICJhZGRPdXRkb29yTGl2aW5nIiwgImltcHJvdmVFbnRyeXdheSJdLAogICAgaG9tZU93bmVyOiBbInJlbW92ZUNsdXR0ZXIiLCAicmVtb3ZlRnVybml0dXJlQW5kQ2x1dHRlciIsICJpbXByb3ZlTGlnaHRpbmciLCAiaW1wcm92ZVdlYXRoZXIiLCAiY2xlYW5MYW5kc2NhcGluZyIsICJhZGRMYW5kc2NhcGluZyIsICJhZGRDdXJiQXBwZWFsIiwgIm5ldXRyYWxQYWludCIsICJhZGRQbGFudHMiLCAiY2hhbmdlU2Vhc29uIiwgImFkZFBvb2xBcmVhIiwgImltcHJvdmVFbnRyeXdheSIsICJtb2Rlcm5pemUiXQogIH07CgogIGZ1bmN0aW9uIHN3aXp6bGVzKCkgeyByZXR1cm4gKFYuZGF0YSAmJiBBcnJheS5pc0FycmF5KFYuZGF0YS5zd2l6emxlcykpID8gVi5kYXRhLnN3aXp6bGVzIDogW107IH0KCiAgZnVuY3Rpb24gaXNSZWxldmFudChzd2l6emxlS2V5LCBzZWxlY3RlZEluZHVzdHJpZXMpIHsKICAgIGlmICghc2VsZWN0ZWRJbmR1c3RyaWVzIHx8ICFzZWxlY3RlZEluZHVzdHJpZXMubGVuZ3RoKSByZXR1cm4gdHJ1ZTsKICAgIHZhciBtYXBwZWRBdEFsbCA9IGZhbHNlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZEluZHVzdHJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGxpc3QgPSBJTkRVU1RSWV9SRUxFVkFOQ0Vbc2VsZWN0ZWRJbmR1c3RyaWVzW2ldXTsKICAgICAgaWYgKCFsaXN0KSBjb250aW51ZTsKICAgICAgbWFwcGVkQXRBbGwgPSB0cnVlOwogICAgICBpZiAobGlzdC5pbmRleE9mKHN3aXp6bGVLZXkpICE9PSAtMSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gIW1hcHBlZEF0QWxsOwogIH0KCiAgZnVuY3Rpb24gcmVsZXZhbnRTd2l6emxlcygpIHsKICAgIHZhciBzZWwgPSAoVi5zdGF0ZSAmJiBBcnJheS5pc0FycmF5KFYuc3RhdGUuaW5kdXN0cmllcykpID8gVi5zdGF0ZS5pbmR1c3RyaWVzIDogW107CiAgICB2YXIgbGlzdCA9IHN3aXp6bGVzKCkuZmlsdGVyKGZ1bmN0aW9uIChzKSB7IHJldHVybiBpc1JlbGV2YW50KHMua2V5LCBzZWwpOyB9KTsKICAgIHJldHVybiBsaXN0Lmxlbmd0aCA/IGxpc3QgOiBzd2l6emxlcygpOwogIH0KCiAgdmFyIF9sb2FkaW5nID0gZmFsc2UsIF9sb2FkZWQgPSBmYWxzZSwgX2xvYWRQcm9taXNlID0gbnVsbDsKCiAgZnVuY3Rpb24gbG9hZChmb3JjZSkgewogICAgaWYgKF9sb2FkaW5nKSByZXR1cm4gX2xvYWRQcm9taXNlOwogICAgaWYgKF9sb2FkZWQgJiYgIWZvcmNlKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFYuc3RhdGUuY3VzdG9tUHJlc2V0cyk7CiAgICBpZiAoIWFwaSgpLnByZXNldHMpIHsgcmVzdG9yZSgpOyBfbG9hZGVkID0gdHJ1ZTsgcmV0dXJuIFByb21pc2UucmVzb2x2ZShWLnN0YXRlLmN1c3RvbVByZXNldHMpOyB9CiAgICBfbG9hZGluZyA9IHRydWU7CiAgICB2YXIgY2xpZW50TW9kZWxzID0ge307CiAgICBWLnN0YXRlLmN1c3RvbVByZXNldHMuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAocC5tb2RlbCkgY2xpZW50TW9kZWxzW3AuaWRdID0gcC5tb2RlbDsgfSk7CiAgICBfbG9hZFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoYXBpKCkucHJlc2V0cygpKS50aGVuKGZ1bmN0aW9uIChyb3dzKSB7CiAgICAgIHZhciBhcnIgPSAoQXJyYXkuaXNBcnJheShyb3dzKSA/IHJvd3MgOiBbXSkubWFwKGZ1bmN0aW9uIChyKSB7CiAgICAgICAgdmFyIG4gPSBub3JtYWxpemVQcmVzZXQocik7CiAgICAgICAgaWYgKCFuLm1vZGVsICYmIGNsaWVudE1vZGVsc1tuLmlkXSkgbi5tb2RlbCA9IGNsaWVudE1vZGVsc1tuLmlkXTsKICAgICAgICByZXR1cm4gbjsKICAgICAgfSk7CiAgICAgIFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IGFycjsKICAgICAgcGVyc2lzdCgpOwogICAgICBfbG9hZGVkID0gdHJ1ZTsKICAgICAgZW1pdENoYW5nZWQoKTsKICAgICAgcmV0dXJuIGFycjsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgcmVzdG9yZSgpOwogICAgICBfbG9hZGVkID0gdHJ1ZTsKICAgICAgcmV0dXJuIFYuc3RhdGUuY3VzdG9tUHJlc2V0czsKICAgIH0pLnRoZW4oZnVuY3Rpb24gKHIpIHsgX2xvYWRpbmcgPSBmYWxzZTsgcmV0dXJuIHI7IH0pOwogICAgcmV0dXJuIF9sb2FkUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZShkYXRhKSB7CiAgICB2YXIgbG9jYWwgPSBub3JtYWxpemVQcmVzZXQoZGF0YSk7CiAgICB2YXIgYm9keSA9IHdpcmVCb2R5KGxvY2FsKTsKICAgIFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5jb25jYXQoW2xvY2FsXSk7CiAgICBwZXJzaXN0KCk7CiAgICBlbWl0Q2hhbmdlZCgpOwogICAgaWYgKCFhcGkoKS5jcmVhdGVQcmVzZXQpIHJldHVybiBQcm9taXNlLnJlc29sdmUobG9jYWwpOwogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkoKS5jcmVhdGVQcmVzZXQoYm9keSkpLnRoZW4oZnVuY3Rpb24gKHJvdykgewogICAgICB2YXIgc2VydmVyID0gbm9ybWFsaXplUHJlc2V0KHJvdyB8fCB7fSk7CiAgICAgIHZhciBpZHggPSBWLnN0YXRlLmN1c3RvbVByZXNldHMuaW5kZXhPZihsb2NhbCk7CiAgICAgIHNlcnZlci5tb2RlbCA9IGxvY2FsLm1vZGVsIHx8IHNlcnZlci5tb2RlbDsKICAgICAgaWYgKGlkeCAhPT0gLTEpIFYuc3RhdGUuY3VzdG9tUHJlc2V0c1tpZHhdID0gc2VydmVyOyBlbHNlIFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5wdXNoKHNlcnZlcik7CiAgICAgIHBlcnNpc3QoKTsgZW1pdENoYW5nZWQoKTsKICAgICAgcmV0dXJuIHNlcnZlcjsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgcm9sbGJhY2tSZW1vdmUobG9jYWwuaWQpOwogICAgICB0b2FzdCgiQ291bGRuJ3Qgc2F2ZSBwcmVzZXQuICIgKyBlcnJNc2coZXJyKSwgImVycm9yIik7CiAgICAgIHRocm93IGVycjsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlKGlkLCBkYXRhKSB7CiAgICB2YXIgaWR4ID0gaW5kZXhPZihpZCk7CiAgICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGNyZWF0ZShkYXRhKTsKICAgIHZhciBwcmV2ID0gVi5zdGF0ZS5jdXN0b21QcmVzZXRzW2lkeF07CiAgICB2YXIgbmV4dCA9IG5vcm1hbGl6ZVByZXNldChPYmplY3QuYXNzaWduKHt9LCBwcmV2LCBkYXRhLCB7IGlkOiBpZCwgdXBkYXRlZEF0OiBub3dJU08oKSB9KSk7CiAgICBWLnN0YXRlLmN1c3RvbVByZXNldHNbaWR4XSA9IG5leHQ7CiAgICBwZXJzaXN0KCk7IGVtaXRDaGFuZ2VkKCk7CiAgICBpZiAoIWFwaSgpLnVwZGF0ZVByZXNldCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0KTsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYXBpKCkudXBkYXRlUHJlc2V0KGlkLCB3aXJlQm9keShuZXh0KSkpLnRoZW4oZnVuY3Rpb24gKHJvdykgewogICAgICB2YXIgc2VydmVyID0gbm9ybWFsaXplUHJlc2V0KHJvdyB8fCBuZXh0KTsKICAgICAgc2VydmVyLm1vZGVsID0gbmV4dC5tb2RlbCB8fCBzZXJ2ZXIubW9kZWw7CiAgICAgIHZhciBpID0gaW5kZXhPZihpZCk7IGlmIChpICE9PSAtMSkgVi5zdGF0ZS5jdXN0b21QcmVzZXRzW2ldID0gc2VydmVyOwogICAgICBwZXJzaXN0KCk7IGVtaXRDaGFuZ2VkKCk7CiAgICAgIHJldHVybiBzZXJ2ZXI7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIHZhciBpID0gaW5kZXhPZihpZCk7IGlmIChpICE9PSAtMSkgVi5zdGF0ZS5jdXN0b21QcmVzZXRzW2ldID0gcHJldjsKICAgICAgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOwogICAgICB0b2FzdCgiQ291bGRuJ3QgdXBkYXRlIHByZXNldC4gIiArIGVyck1zZyhlcnIpLCAiZXJyb3IiKTsKICAgICAgdGhyb3cgZXJyOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZW1vdmUoaWQpIHsKICAgIHZhciBpZHggPSBpbmRleE9mKGlkKTsKICAgIGlmIChpZHggPT09IC0xKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB2YXIgcHJldiA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0c1tpZHhdOwogICAgVi5zdGF0ZS5jdXN0b21QcmVzZXRzID0gVi5zdGF0ZS5jdXN0b21QcmVzZXRzLmZpbHRlcihmdW5jdGlvbiAocCkgeyByZXR1cm4gcC5pZCAhPT0gaWQ7IH0pOwogICAgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOwogICAgaWYgKCFhcGkoKS5kZWxldGVQcmVzZXQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYXBpKCkuZGVsZXRlUHJlc2V0KGlkKSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICB2YXIgYXJyID0gVi5zdGF0ZS5jdXN0b21QcmVzZXRzLnNsaWNlKCk7CiAgICAgIGFyci5zcGxpY2UoTWF0aC5taW4oaWR4LCBhcnIubGVuZ3RoKSwgMCwgcHJldik7CiAgICAgIFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IGFycjsKICAgICAgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOwogICAgICB0b2FzdCgiQ291bGRuJ3QgZGVsZXRlIHByZXNldC4gIiArIGVyck1zZyhlcnIpLCAiZXJyb3IiKTsKICAgICAgdGhyb3cgZXJyOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZW9yZGVyKG9yZGVyZWRJZHMpIHsKICAgIHZhciBieUlkID0ge307IFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7IGJ5SWRbcC5pZF0gPSBwOyB9KTsKICAgIHZhciBwcmV2ID0gVi5zdGF0ZS5jdXN0b21QcmVzZXRzLnNsaWNlKCk7CiAgICB2YXIgbmV4dCA9IG9yZGVyZWRJZHMubWFwKGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gYnlJZFtpZF07IH0pLmZpbHRlcihCb29sZWFuKTsKICAgIHByZXYuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAob3JkZXJlZElkcy5pbmRleE9mKHAuaWQpID09PSAtMSkgbmV4dC5wdXNoKHApOyB9KTsKICAgIFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IG5leHQ7IHBlcnNpc3QoKTsgZW1pdENoYW5nZWQoKTsKICAgIGlmICghYXBpKCkucmVvcmRlclByZXNldHMpIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV4dCk7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaSgpLnJlb3JkZXJQcmVzZXRzKG5leHQubWFwKGZ1bmN0aW9uIChwKSB7IHJldHVybiBwLmlkOyB9KSkpLnRoZW4oZnVuY3Rpb24gKHJvd3MpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocm93cykgJiYgcm93cy5sZW5ndGgpIHsKICAgICAgICB2YXIgbW9kZWxzID0ge307IHByZXYuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAocC5tb2RlbCkgbW9kZWxzW3AuaWRdID0gcC5tb2RlbDsgfSk7CiAgICAgICAgVi5zdGF0ZS5jdXN0b21QcmVzZXRzID0gcm93cy5tYXAoZnVuY3Rpb24gKHIpIHsgdmFyIG4gPSBub3JtYWxpemVQcmVzZXQocik7IGlmICghbi5tb2RlbCAmJiBtb2RlbHNbbi5pZF0pIG4ubW9kZWwgPSBtb2RlbHNbbi5pZF07IHJldHVybiBuOyB9KTsKICAgICAgICBwZXJzaXN0KCk7IGVtaXRDaGFuZ2VkKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIFYuc3RhdGUuY3VzdG9tUHJlc2V0czsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgVi5zdGF0ZS5jdXN0b21QcmVzZXRzID0gcHJldjsgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOyByZXR1cm4gcHJldjsgfSk7CiAgfQoKICBmdW5jdGlvbiBpbmRleE9mKGlkKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgVi5zdGF0ZS5jdXN0b21QcmVzZXRzLmxlbmd0aDsgaSsrKSBpZiAoVi5zdGF0ZS5jdXN0b21QcmVzZXRzW2ldLmlkID09PSBpZCkgcmV0dXJuIGk7IHJldHVybiAtMTsgfQogIGZ1bmN0aW9uIHJvbGxiYWNrUmVtb3ZlKGlkKSB7IFYuc3RhdGUuY3VzdG9tUHJlc2V0cyA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5maWx0ZXIoZnVuY3Rpb24gKHApIHsgcmV0dXJuIHAuaWQgIT09IGlkOyB9KTsgcGVyc2lzdCgpOyBlbWl0Q2hhbmdlZCgpOyB9CiAgZnVuY3Rpb24gZW1pdENoYW5nZWQoKSB7IGlmIChzdG9yZSgpLmVtaXQpIHN0b3JlKCkuZW1pdCgicHJlc2V0czpjaGFuZ2VkIiwgVi5zdGF0ZS5jdXN0b21QcmVzZXRzKTsgfQogIGZ1bmN0aW9uIHdpcmVCb2R5KHApIHsgcmV0dXJuIHsgaWQ6IHAuaWQsIG5hbWU6IHAubmFtZSwgcHJvbXB0OiBwLnByb21wdCwgbmVnYXRpdmVQcm9tcHQ6IHAubmVnYXRpdmVQcm9tcHQgfHwgbnVsbCB9OyB9CiAgZnVuY3Rpb24gZXJyTXNnKGVycikgeyByZXR1cm4gKGVyciAmJiBlcnIubWVzc2FnZSkgPyBlcnIubWVzc2FnZSA6ICJQbGVhc2UgdHJ5IGFnYWluLiI7IH0KCiAgZnVuY3Rpb24gcmVuZGVyQ2hpcHMoY29udGFpbmVyLCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIGlmICh0eXBlb2YgY29udGFpbmVyID09PSAic3RyaW5nIikgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250YWluZXIpOwogICAgaWYgKCFjb250YWluZXIpIHJldHVybiB7IHJlZnJlc2g6IGZ1bmN0aW9uICgpIHt9LCBzZXRBY3RpdmU6IGZ1bmN0aW9uICgpIHt9LCBjbGVhckFjdGl2ZTogZnVuY3Rpb24gKCkge30sIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHt9IH07CgogICAgdmFyIG9uUGljayA9IHR5cGVvZiBvcHRzLm9uUGljayA9PT0gImZ1bmN0aW9uIiA/IG9wdHMub25QaWNrCiAgICAgIDogKHR5cGVvZiBvcHRzLm9uU2VsZWN0ID09PSAiZnVuY3Rpb24iID8gb3B0cy5vblNlbGVjdCA6IGZ1bmN0aW9uICgpIHt9KTsKICAgIHZhciBvbkluZHVzdHJpZXMgPSB0eXBlb2Ygb3B0cy5vbkluZHVzdHJpZXMgPT09ICJmdW5jdGlvbiIgPyBvcHRzLm9uSW5kdXN0cmllcyA6IG51bGw7CiAgICB2YXIgYWN0aXZlSWQgPSBvcHRzLnNlbGVjdGVkSWQgfHwgbnVsbDsKICAgIHZhciBhY3RpdmVLZXkgPSBvcHRzLnNlbGVjdGVkS2V5IHx8IG51bGw7CgogICAgdmFyIHNjcm9sbGVyID0gZWwoImRpdiIsIHsgImNsYXNzIjogInYtY2hpcC1yb3ciLCByb2xlOiAibGlzdGJveCIsICJhcmlhLWxhYmVsIjogIlN0eWxlIHByZXNldHMiLCB0YWJpbmRleDogIi0xIiB9KTsKICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoImFyaWEtYnVzeSIsICJmYWxzZSIpOwogICAgY29udGFpbmVyLmlubmVySFRNTCA9ICIiOwogICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHNjcm9sbGVyKTsKCiAgICBmdW5jdGlvbiBwaWNrQ3VzdG9tKHApIHsKICAgICAgYWN0aXZlSWQgPSBwLmlkOyBhY3RpdmVLZXkgPSBudWxsOyBtYXJrQWN0aXZlKCk7CiAgICAgIG9uUGljayh7IHNvdXJjZTogImN1c3RvbSIsIGlkOiBwLmlkLCBuYW1lOiBwLm5hbWUsIHByb21wdDogcC5wcm9tcHQsIG5lZ2F0aXZlUHJvbXB0OiBwLm5lZ2F0aXZlUHJvbXB0IHx8IG51bGwsIG1vZGVsOiBwLm1vZGVsIHx8IG51bGwgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBwaWNrU3dpenpsZShzKSB7CiAgICAgIGFjdGl2ZUtleSA9IHMua2V5OyBhY3RpdmVJZCA9IG51bGw7IG1hcmtBY3RpdmUoKTsKICAgICAgb25QaWNrKHsgc291cmNlOiAic3dpenpsZSIsIGlkOiBzLmtleSwga2V5OiBzLmtleSwgbmFtZTogcy5sYWJlbCwgcHJvbXB0OiBzLnByb21wdCwgbmVnYXRpdmVQcm9tcHQ6IG51bGwsIG1vZGVsOiBudWxsIH0pOwogICAgfQogICAgZnVuY3Rpb24gbWFya0FjdGl2ZSgpIHsKICAgICAgdmFyIG5vZGVzID0gc2Nyb2xsZXIucXVlcnlTZWxlY3RvckFsbCgiLnYtY2hpcCIpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIG4gPSBub2Rlc1tpXTsKICAgICAgICB2YXIgb24gPSAobi5kYXRhc2V0LnByZXNldElkICYmIG4uZGF0YXNldC5wcmVzZXRJZCA9PT0gYWN0aXZlSWQpIHx8CiAgICAgICAgICAgICAgICAgKG4uZGF0YXNldC5zd2l6emxlS2V5ICYmIG4uZGF0YXNldC5zd2l6emxlS2V5ID09PSBhY3RpdmVLZXkpOwogICAgICAgIG4uY2xhc3NMaXN0LnRvZ2dsZSgidi1jaGlwLS1hY3RpdmUiLCAhIW9uKTsKICAgICAgICBuLnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsIG9uID8gInRydWUiIDogImZhbHNlIik7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjaGlwKGxhYmVsLCBhdHRycywgb25DbGljaywgb25Db250ZXh0KSB7CiAgICAgIHZhciBjID0gZWwoImJ1dHRvbiIsIE9iamVjdC5hc3NpZ24oewogICAgICAgIHR5cGU6ICJidXR0b24iLCAiY2xhc3MiOiAidi1jaGlwIiwgcm9sZTogIm9wdGlvbiIsICJhcmlhLXNlbGVjdGVkIjogImZhbHNlIgogICAgICB9LCBhdHRycyB8fCB7fSksIGxhYmVsKTsKICAgICAgYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgb25DbGljayhjKTsgfSk7CiAgICAgIGlmIChvbkNvbnRleHQpIGMuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IG9uQ29udGV4dChjLCBlKTsgfSk7CiAgICAgIHJldHVybiBjOwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkKCkgewogICAgICBzY3JvbGxlci5pbm5lckhUTUwgPSAiIjsKCiAgICAgIHZhciBhZGRDaGlwID0gY2hpcCgKICAgICAgICBbZWwoInNwYW4iLCB7ICJjbGFzcyI6ICJ2LWNoaXBfX2ljb24iLCAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIsIGh0bWw6IGljb24oInBsdXMiKSB8fCAiKyIgfSldLAogICAgICAgIHsgImNsYXNzIjogInYtY2hpcCB2LWNoaXAtLWFkZCIsIHRpdGxlOiAiTmV3IGN1c3RvbSBwcmVzZXQiLCAiYXJpYS1sYWJlbCI6ICJDcmVhdGUgY3VzdG9tIHByZXNldCIgfSwKICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBvcGVuRWRpdG9yKG51bGwsIHsgb25TYXZlZDogZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgYnVpbGQoKTsKICAgICAgICAgICAgaWYgKHAgJiYgcC5pZCkgewogICAgICAgICAgICAgIGFjdGl2ZUlkID0gcC5pZDsgYWN0aXZlS2V5ID0gbnVsbDsgbWFya0FjdGl2ZSgpOwogICAgICAgICAgICAgIHZhciBub2RlID0gc2Nyb2xsZXIucXVlcnlTZWxlY3RvcignW2RhdGEtcHJlc2V0LWlkPSInICsgcC5pZCArICciXScpOwogICAgICAgICAgICAgIGlmIChub2RlKSBub2RlLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICJuZWFyZXN0IiwgaW5saW5lOiAiY2VudGVyIiB9KTsKICAgICAgICAgICAgICBwaWNrQ3VzdG9tKHApOwogICAgICAgICAgICB9CiAgICAgICAgICB9IH0pOwogICAgICAgIH0KICAgICAgKTsKICAgICAgc2Nyb2xsZXIuYXBwZW5kQ2hpbGQoYWRkQ2hpcCk7CgogICAgICB2YXIgY3VzdG9tcyA9IFYuc3RhdGUuY3VzdG9tUHJlc2V0cyB8fCBbXTsKICAgICAgY3VzdG9tcy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7CiAgICAgICAgdmFyIGMgPSBjaGlwKAogICAgICAgICAgW2VsKCJzcGFuIiwgeyAiY2xhc3MiOiAidi1jaGlwX19pY29uIiwgImFyaWEtaGlkZGVuIjogInRydWUiLCBodG1sOiBpY29uKCJib29rbWFyayIpIHx8ICIiIH0pLCBlbCgic3BhbiIsIHt9LCBwLm5hbWUgfHwgIlVudGl0bGVkIildLAogICAgICAgICAgeyAiY2xhc3MiOiAidi1jaGlwIHYtY2hpcC0tY3VzdG9tIiwgImRhdGEtcHJlc2V0LWlkIjogcC5pZCwgdGl0bGU6IHAucHJvbXB0IHx8IHAubmFtZSB9LAogICAgICAgICAgZnVuY3Rpb24gKCkgeyBwaWNrQ3VzdG9tKHApOyB9LAogICAgICAgICAgZnVuY3Rpb24gKG5vZGUsIGUpIHsgc2hvd1ByZXNldE1lbnUocCwgbm9kZSwgZSwgYnVpbGQpOyB9CiAgICAgICAgKTsKICAgICAgICBhdHRhY2hMb25nUHJlc3MoYywgZnVuY3Rpb24gKGV2KSB7IHNob3dQcmVzZXRNZW51KHAsIGMsIGV2LCBidWlsZCk7IH0pOwogICAgICAgIHNjcm9sbGVyLmFwcGVuZENoaWxkKGMpOwogICAgICB9KTsKCiAgICAgIHZhciBzd3ogPSByZWxldmFudFN3aXp6bGVzKCk7CiAgICAgIHN3ei5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7CiAgICAgICAgc2Nyb2xsZXIuYXBwZW5kQ2hpbGQoY2hpcChzLmxhYmVsLCB7ICJjbGFzcyI6ICJ2LWNoaXAgdi1jaGlwLS1zd2l6emxlIiwgImRhdGEtc3dpenpsZS1rZXkiOiBzLmtleSwgdGl0bGU6IHMucHJvbXB0IH0sIGZ1bmN0aW9uICgpIHsgcGlja1N3aXp6bGUocyk7IH0pKTsKICAgICAgfSk7CgogICAgICB2YXIgc2VsID0gKFYuc3RhdGUgJiYgQXJyYXkuaXNBcnJheShWLnN0YXRlLmluZHVzdHJpZXMpKSA/IFYuc3RhdGUuaW5kdXN0cmllcyA6IFtdOwogICAgICBpZiAob25JbmR1c3RyaWVzIHx8IChWLmRhdGEgJiYgVi5kYXRhLmluZHVzdHJpZXMpKSB7CiAgICAgICAgdmFyIGxhYmVsID0gc2VsLmxlbmd0aCA/ICJJbmR1c3RyaWVzIMK3ICIgKyBzZWwubGVuZ3RoIDogIkluZHVzdHJpZXMiOwogICAgICAgIHNjcm9sbGVyLmFwcGVuZENoaWxkKGNoaXAoCiAgICAgICAgICBbZWwoInNwYW4iLCB7ICJjbGFzcyI6ICJ2LWNoaXBfX2ljb24iLCAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIsIGh0bWw6IGljb24oImVsbGlwc2lzIikgfHwgIiIgfSksIGVsKCJzcGFuIiwge30sIGxhYmVsKV0sCiAgICAgICAgICB7ICJjbGFzcyI6ICJ2LWNoaXAgdi1jaGlwLS1tb3JlIiwgdGl0bGU6ICJGaWx0ZXIgcHJlc2V0cyBieSBpbmR1c3RyeSIgfSwKICAgICAgICAgIGZ1bmN0aW9uICgpIHsgaWYgKG9uSW5kdXN0cmllcykgb25JbmR1c3RyaWVzKCk7IGVsc2Ugb3BlbkluZHVzdHJpZXNQaWNrZXIoZnVuY3Rpb24gKCkgeyBidWlsZCgpOyB9KTsgfQogICAgICAgICkpOwogICAgICB9CgogICAgICBtYXJrQWN0aXZlKCk7CiAgICB9CgogICAgc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChlLmtleSAhPT0gIkFycm93UmlnaHQiICYmIGUua2V5ICE9PSAiQXJyb3dMZWZ0IikgcmV0dXJuOwogICAgICB2YXIgY2hpcHMgPSBbXS5zbGljZS5jYWxsKHNjcm9sbGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIi52LWNoaXAiKSk7CiAgICAgIHZhciBpID0gY2hpcHMuaW5kZXhPZihkb2N1bWVudC5hY3RpdmVFbGVtZW50KTsKICAgICAgaWYgKGkgPT09IC0xKSByZXR1cm47CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgdmFyIG5leHQgPSBlLmtleSA9PT0gIkFycm93UmlnaHQiID8gTWF0aC5taW4oY2hpcHMubGVuZ3RoIC0gMSwgaSArIDEpIDogTWF0aC5tYXgoMCwgaSAtIDEpOwogICAgICBjaGlwc1tuZXh0XS5mb2N1cygpOwogICAgfSk7CgogICAgYnVpbGQoKTsKICAgIHZhciBvZmYxID0gc3RvcmUoKS5vbiA/IHN0b3JlKCkub24oInByZXNldHM6Y2hhbmdlZCIsIGJ1aWxkKSA6IG51bGw7CiAgICB2YXIgb2ZmMiA9IHN0b3JlKCkub24gPyBzdG9yZSgpLm9uKCJpbmR1c3RyaWVzOmNoYW5nZWQiLCBidWlsZCkgOiBudWxsOwoKICAgIGxvYWQoKS50aGVuKGZ1bmN0aW9uICgpIHsgYnVpbGQoKTsgfSk7CgogICAgcmV0dXJuIHsKICAgICAgcmVmcmVzaDogYnVpbGQsCiAgICAgIHNldEFjdGl2ZTogZnVuY3Rpb24gKHNlbCkgewogICAgICAgIGlmIChzZWwgJiYgc2VsLmlkKSB7IGFjdGl2ZUlkID0gc2VsLmlkOyBhY3RpdmVLZXkgPSBudWxsOyB9CiAgICAgICAgZWxzZSBpZiAoc2VsICYmIHNlbC5rZXkpIHsgYWN0aXZlS2V5ID0gc2VsLmtleTsgYWN0aXZlSWQgPSBudWxsOyB9CiAgICAgICAgZWxzZSB7IGFjdGl2ZUlkID0gbnVsbDsgYWN0aXZlS2V5ID0gbnVsbDsgfQogICAgICAgIG1hcmtBY3RpdmUoKTsKICAgICAgfSwKICAgICAgY2xlYXJBY3RpdmU6IGZ1bmN0aW9uICgpIHsgYWN0aXZlSWQgPSBudWxsOyBhY3RpdmVLZXkgPSBudWxsOyBtYXJrQWN0aXZlKCk7IH0sCiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHsgaWYgKG9mZjEpIG9mZjEoKTsgaWYgKG9mZjIpIG9mZjIoKTsgY29udGFpbmVyLmlubmVySFRNTCA9ICIiOyB9CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gYXR0YWNoTG9uZ1ByZXNzKG5vZGUsIGNiKSB7CiAgICB2YXIgdGltZXIgPSBudWxsLCBtb3ZlZCA9IGZhbHNlLCBzeCA9IDAsIHN5ID0gMDsKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIG1vdmVkID0gZmFsc2U7IHZhciB0ID0gZS50b3VjaGVzWzBdOyBzeCA9IHQuY2xpZW50WDsgc3kgPSB0LmNsaWVudFk7CiAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGlmICghbW92ZWQpIGNiKGUpOyB9LCA0ODApOwogICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLCBmdW5jdGlvbiAoZSkgewogICAgICB2YXIgdCA9IGUudG91Y2hlc1swXTsKICAgICAgaWYgKE1hdGguYWJzKHQuY2xpZW50WCAtIHN4KSA+IDEwIHx8IE1hdGguYWJzKHQuY2xpZW50WSAtIHN5KSA+IDEwKSB7IG1vdmVkID0gdHJ1ZTsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgfQogICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIGZ1bmN0aW9uICgpIHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgfSk7CiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoY2FuY2VsIiwgZnVuY3Rpb24gKCkgeyBjbGVhclRpbWVvdXQodGltZXIpOyB9KTsKICB9CgogIGZ1bmN0aW9uIHNob3dQcmVzZXRNZW51KHByZXNldCwgYW5jaG9yLCBldnQsIG9uQ2hhbmdlZCkgewogICAgdmFyIG1lbnUgPSBlbCgiZGl2IiwgeyAiY2xhc3MiOiAiZ2xhc3MtY2FyZCB2LWNoaXAtbWVudSIsIHJvbGU6ICJtZW51IiB9KTsKICAgIHZhciBlZGl0QnRuID0gZWwoImJ1dHRvbiIsIHsgdHlwZTogImJ1dHRvbiIsICJjbGFzcyI6ICJ2LWNoaXAtbWVudV9faXRlbSIsIHJvbGU6ICJtZW51aXRlbSIgfSwgW2VsKCJzcGFuIiwgeyAiY2xhc3MiOiAidi1jaGlwX19pY29uIiwgaHRtbDogaWNvbigiZWRpdCIpIHx8ICIiIH0pLCAiRWRpdCJdKTsKICAgIHZhciBkZWxCdG4gPSBlbCgiYnV0dG9uIiwgeyB0eXBlOiAiYnV0dG9uIiwgImNsYXNzIjogInYtY2hpcC1tZW51X19pdGVtIHYtY2hpcC1tZW51X19pdGVtLS1kYW5nZXIiLCByb2xlOiAibWVudWl0ZW0iIH0sIFtlbCgic3BhbiIsIHsgImNsYXNzIjogInYtY2hpcF9faWNvbiIsIGh0bWw6IGljb24oInRyYXNoIikgfHwgIiIgfSksICJEZWxldGUiXSk7CiAgICBtZW51LmFwcGVuZENoaWxkKGVkaXRCdG4pOyBtZW51LmFwcGVuZENoaWxkKGRlbEJ0bik7CgogICAgdmFyIGJhY2tkcm9wID0gZWwoImRpdiIsIHsgImNsYXNzIjogInYtY2hpcC1tZW51X19iYWNrZHJvcCIgfSk7CiAgICBmdW5jdGlvbiBjbG9zZSgpIHsgaWYgKG1lbnUucGFyZW50Tm9kZSkgbWVudS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG1lbnUpOyBpZiAoYmFja2Ryb3AucGFyZW50Tm9kZSkgYmFja2Ryb3AucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiYWNrZHJvcCk7IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBvbktleSwgdHJ1ZSk7IH0KICAgIGZ1bmN0aW9uIG9uS2V5KGUpIHsgaWYgKGUua2V5ID09PSAiRXNjYXBlIikgY2xvc2UoKTsgfQogICAgYmFja2Ryb3AuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBjbG9zZSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgb25LZXksIHRydWUpOwoKICAgIGVkaXRCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IGNsb3NlKCk7IG9wZW5FZGl0b3IocHJlc2V0LCB7IG9uU2F2ZWQ6IGZ1bmN0aW9uICgpIHsgaWYgKG9uQ2hhbmdlZCkgb25DaGFuZ2VkKCk7IH0gfSk7IH0pOwogICAgZGVsQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgICBjbG9zZSgpOwogICAgICB2YXIgZG9EZWxldGUgPSBmdW5jdGlvbiAoKSB7IHJlbW92ZShwcmVzZXQuaWQpLnRoZW4oZnVuY3Rpb24gKCkgeyB0b2FzdCgiUHJlc2V0IGRlbGV0ZWQiLCAic3VjY2VzcyIpOyBpZiAob25DaGFuZ2VkKSBvbkNoYW5nZWQoKTsgfSkuY2F0Y2goZnVuY3Rpb24gKCkge30pOyB9OwogICAgICBpZiAodWkoKS5jb25maXJtKSB1aSgpLmNvbmZpcm0oJ0RlbGV0ZSBwcmVzZXQgIicgKyAocHJlc2V0Lm5hbWUgfHwgIlVudGl0bGVkIikgKyAnIj8nLCB7IGRlc3RydWN0aXZlOiB0cnVlLCBjb25maXJtTGFiZWw6ICJEZWxldGUiIH0pLnRoZW4oZnVuY3Rpb24gKG9rKSB7IGlmIChvaykgZG9EZWxldGUoKTsgfSk7CiAgICAgIGVsc2UgaWYgKHdpbmRvdy5jb25maXJtKCdEZWxldGUgcHJlc2V0ICInICsgKHByZXNldC5uYW1lIHx8ICJVbnRpdGxlZCIpICsgJyI/JykpIGRvRGVsZXRlKCk7CiAgICB9KTsKCiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJhY2tkcm9wKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobWVudSk7CiAgICBwb3NpdGlvbk1lbnUobWVudSwgYW5jaG9yLCBldnQpOwogICAgZWRpdEJ0bi5mb2N1cygpOwogIH0KCiAgZnVuY3Rpb24gcG9zaXRpb25NZW51KG1lbnUsIGFuY2hvciwgZXZ0KSB7CiAgICB2YXIgciA9IGFuY2hvciAmJiBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID8gYW5jaG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogeyBsZWZ0OiAoZXZ0ICYmIGV2dC5jbGllbnRYKSB8fCAwLCBib3R0b206IChldnQgJiYgZXZ0LmNsaWVudFkpIHx8IDAsIHRvcDogKGV2dCAmJiBldnQuY2xpZW50WSkgfHwgMCwgd2lkdGg6IDAgfTsKICAgIHZhciBtdyA9IG1lbnUub2Zmc2V0V2lkdGggfHwgMTY4LCBtaCA9IG1lbnUub2Zmc2V0SGVpZ2h0IHx8IDk2OwogICAgdmFyIGxlZnQgPSBNYXRoLm1pbih3aW5kb3cuaW5uZXJXaWR0aCAtIG13IC0gOCwgTWF0aC5tYXgoOCwgci5sZWZ0KSk7CiAgICB2YXIgdG9wID0gci5ib3R0b20gKyA2OwogICAgaWYgKHRvcCArIG1oID4gd2luZG93LmlubmVySGVpZ2h0IC0gOCkgdG9wID0gTWF0aC5tYXgoOCwgci50b3AgLSBtaCAtIDYpOwogICAgbWVudS5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7CiAgICBtZW51LnN0eWxlLmxlZnQgPSBsZWZ0ICsgInB4IjsKICAgIG1lbnUuc3R5bGUudG9wID0gdG9wICsgInB4IjsKICAgIG1lbnUuc3R5bGUuekluZGV4ID0gIjEwMDAxIjsKICB9CgogIGZ1bmN0aW9uIG9wZW5FZGl0b3IocHJlc2V0LCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBlZGl0aW5nID0gISEocHJlc2V0ICYmIHByZXNldC5pZCk7CiAgICB2YXIgaW5pdGlhbCA9IG5vcm1hbGl6ZVByZXNldChPYmplY3QuYXNzaWduKHt9LCBlZGl0aW5nID8gcHJlc2V0IDoge30sIG9wdHMucHJlZmlsbCB8fCB7fSwgZWRpdGluZyA/IHt9IDogeyBpZDogbnVsbCB9KSk7CiAgICBpZiAoIWVkaXRpbmcpIGluaXRpYWwuaWQgPSBudWxsOwoKICAgIHZhciBuYW1lSW5wdXQgPSBlbCgiaW5wdXQiLCB7CiAgICAgIHR5cGU6ICJ0ZXh0IiwgImNsYXNzIjogInYtZmllbGQiLCBtYXhsZW5ndGg6ICI2MCIsIHBsYWNlaG9sZGVyOiAiUHJlc2V0IG5hbWUgKGUuZy4gU2NhbmRpIFN0YWdpbmcpIiwKICAgICAgdmFsdWU6IGluaXRpYWwubmFtZSB8fCAiIiwgImFyaWEtbGFiZWwiOiAiUHJlc2V0IG5hbWUiLCBhdXRvY29tcGxldGU6ICJvZmYiCiAgICB9KTsKICAgIHZhciBwcm9tcHRJbnB1dCA9IGVsKCJ0ZXh0YXJlYSIsIHsKICAgICAgImNsYXNzIjogInYtdGV4dGFyZWEiLCByb3dzOiAiNSIsIHBsYWNlaG9sZGVyOiAiRGVzY3JpYmUgdGhlIHRyYW5zZm9ybWF0aW9u4oCmIChtaW4gOCBjaGFyYWN0ZXJzKSIsCiAgICAgICJhcmlhLWxhYmVsIjogIlByb21wdCIKICAgIH0pOwogICAgcHJvbXB0SW5wdXQudmFsdWUgPSBpbml0aWFsLnByb21wdCB8fCAiIjsKICAgIHZhciBuZWdJbnB1dCA9IGVsKCJ0ZXh0YXJlYSIsIHsKICAgICAgImNsYXNzIjogInYtdGV4dGFyZWEiLCByb3dzOiAiMiIsIHBsYWNlaG9sZGVyOiAiTmVnYXRpdmUgcHJvbXB0IChvcHRpb25hbCkg4oCUIHdoYXQgdG8gYXZvaWQiLAogICAgICAiYXJpYS1sYWJlbCI6ICJOZWdhdGl2ZSBwcm9tcHQiCiAgICB9KTsKICAgIG5lZ0lucHV0LnZhbHVlID0gaW5pdGlhbC5uZWdhdGl2ZVByb21wdCB8fCAiIjsKCiAgICB2YXIgY291bnRlciA9IGVsKCJzcGFuIiwgeyAiY2xhc3MiOiAidi1sYWJlbCIgfSwgIiIpOwogICAgZnVuY3Rpb24gdXBkYXRlQ291bnQoKSB7CiAgICAgIHZhciBuID0gKHByb21wdElucHV0LnZhbHVlIHx8ICIiKS50cmltKCkubGVuZ3RoOwogICAgICBjb3VudGVyLnRleHRDb250ZW50ID0gbiArICIgY2hhciIgKyAobiA9PT0gMSA/ICIiIDogInMiKTsKICAgICAgY291bnRlci5zdHlsZS5jb2xvciA9IChuID4gMCAmJiBuIDwgOCkgPyAidmFyKC0tY29sb3Itd2FybmluZywgI0ZGRDYwQSkiIDogIiI7CiAgICB9CiAgICBwcm9tcHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIHVwZGF0ZUNvdW50KTsKICAgIHVwZGF0ZUNvdW50KCk7CgogICAgdmFyIGVyckJveCA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LWZvcm0tZXJyb3IiLCByb2xlOiAiYWxlcnQiLCAiYXJpYS1saXZlIjogInBvbGl0ZSIsIGhpZGRlbjogdHJ1ZSB9KTsKICAgIGZ1bmN0aW9uIHNob3dFcnIobSkgeyBlcnJCb3gudGV4dENvbnRlbnQgPSBtIHx8ICIiOyBlcnJCb3guaGlkZGVuID0gIW07IH0KCiAgICB2YXIgc2F2ZUJ0biA9IGVsKCJidXR0b24iLCB7IHR5cGU6ICJidXR0b24iLCAiY2xhc3MiOiAidi1jdGEgdi1jdGEtLXByaW1hcnkiIH0sIGVkaXRpbmcgPyAiU2F2ZSBDaGFuZ2VzIiA6ICJDcmVhdGUgUHJlc2V0Iik7CiAgICB2YXIgY2FuY2VsQnRuID0gZWwoImJ1dHRvbiIsIHsgdHlwZTogImJ1dHRvbiIsICJjbGFzcyI6ICJ2LWN0YSB2LWN0YS0tZ2hvc3QiIH0sICJDYW5jZWwiKTsKICAgIHZhciBkZWxCdG4gPSBlZGl0aW5nID8gZWwoImJ1dHRvbiIsIHsgdHlwZTogImJ1dHRvbiIsICJjbGFzcyI6ICJ2LWN0YSB2LWN0YS0tZGFuZ2VyIiB9LCAiRGVsZXRlIikgOiBudWxsOwoKICAgIHZhciBzcGlubmVyID0gdWkoKS5zcGlubmVyID8gdWkoKS5zcGlubmVyKDE4KSA6IGVsKCJzcGFuIiwgeyAiY2xhc3MiOiAidi1zcGlubmVyIiB9KTsKICAgIHNwaW5uZXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCiAgICB2YXIgYWN0aW9uc1JpZ2h0ID0gZWwoImRpdiIsIHsgImNsYXNzIjogInYtbW9kYWxfX2FjdGlvbnMiIH0sIFtzcGlubmVyLCBjYW5jZWxCdG4sIHNhdmVCdG5dKTsKICAgIHZhciBhY3Rpb25zID0gZWwoImRpdiIsIHsgImNsYXNzIjogInYtY3RhLXJvdyIgfSwgWwogICAgICBkZWxCdG4gfHwgZWwoInNwYW4iLCB7fSksCiAgICAgIGFjdGlvbnNSaWdodAogICAgXSk7CiAgICBhY3Rpb25zLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gInNwYWNlLWJldHdlZW4iOwogICAgYWN0aW9ucy5zdHlsZS5hbGlnbkl0ZW1zID0gImNlbnRlciI7CiAgICBhY3Rpb25zLnN0eWxlLmZsZXhXcmFwID0gIndyYXAiOwogICAgYWN0aW9ucy5zdHlsZS5nYXAgPSAidmFyKC0tc3BhY2UtbWQsIDE1cHgpIjsKCiAgICB2YXIgYm9keSA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LWZvcm0iIH0sIFsKICAgICAgZWwoImRpdiIsIHt9LCBbCiAgICAgICAgZWwoInAiLCB7ICJjbGFzcyI6ICJ2LWV5ZWJyb3ciIH0sIGVkaXRpbmcgPyAiRWRpdCBQcmVzZXQiIDogIk5ldyBQcmVzZXQiKSwKICAgICAgICBlbCgiaDIiLCB7ICJjbGFzcyI6ICJ2LW1vZGFsX190aXRsZSB2LWdyYWRpZW50IiB9LCBlZGl0aW5nID8gIlJlZmluZSB5b3VyIHN0eWxlIiA6ICJTYXZlIGEgY3VzdG9tIHN0eWxlIikKICAgICAgXSksCiAgICAgIGVsKCJsYWJlbCIsIHsgImNsYXNzIjogInYtZmllbGQtZ3JvdXAiIH0sIFtlbCgic3BhbiIsIHsgImNsYXNzIjogInYtbGFiZWwiIH0sICJOYW1lIiksIG5hbWVJbnB1dF0pLAogICAgICBlbCgibGFiZWwiLCB7ICJjbGFzcyI6ICJ2LWZpZWxkLWdyb3VwIiB9LCBbCiAgICAgICAgZWwoInNwYW4iLCB7ICJjbGFzcyI6ICJ2LWxhYmVsIiwgc3R5bGU6ICJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo5cHg7IiB9LCBbZWwoInNwYW4iLCB7fSwgIlByb21wdCIpLCBjb3VudGVyXSksCiAgICAgICAgcHJvbXB0SW5wdXQKICAgICAgXSksCiAgICAgIGVsKCJsYWJlbCIsIHsgImNsYXNzIjogInYtZmllbGQtZ3JvdXAiIH0sIFtlbCgic3BhbiIsIHsgImNsYXNzIjogInYtbGFiZWwiIH0sICJOZWdhdGl2ZSBwcm9tcHQiKSwgbmVnSW5wdXRdKSwKICAgICAgZXJyQm94LAogICAgICBhY3Rpb25zCiAgICBdKTsKICAgIGJvZHkuc3R5bGUuZGlzcGxheSA9ICJmbGV4IjsKICAgIGJvZHkuc3R5bGUuZmxleERpcmVjdGlvbiA9ICJjb2x1bW4iOwogICAgYm9keS5zdHlsZS5nYXAgPSAidmFyKC0tc3BhY2UtbWQsIDE1cHgpIjsKCiAgICB2YXIgbW9kYWxSZWYgPSBudWxsOwogICAgZnVuY3Rpb24gY2xvc2UoKSB7IGlmIChtb2RhbFJlZiAmJiBtb2RhbFJlZi5jbG9zZSkgbW9kYWxSZWYuY2xvc2UoKTsgfQoKICAgIGZ1bmN0aW9uIHNldEJ1c3koYikgewogICAgICBzcGlubmVyLnN0eWxlLmRpc3BsYXkgPSBiID8gIiIgOiAibm9uZSI7CiAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSBiOyBjYW5jZWxCdG4uZGlzYWJsZWQgPSBiOyBpZiAoZGVsQnRuKSBkZWxCdG4uZGlzYWJsZWQgPSBiOwogICAgICBzYXZlQnRuLmNsYXNzTGlzdC50b2dnbGUoImlzLWJ1c3kiLCBiKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkb1NhdmUoKSB7CiAgICAgIHZhciBuYW1lID0gKG5hbWVJbnB1dC52YWx1ZSB8fCAiIikudHJpbSgpOwogICAgICB2YXIgcHJvbXB0ID0gKHByb21wdElucHV0LnZhbHVlIHx8ICIiKS50cmltKCk7CiAgICAgIHZhciBuZWcgPSAobmVnSW5wdXQudmFsdWUgfHwgIiIpLnRyaW0oKTsKICAgICAgaWYgKCFuYW1lKSB7IHNob3dFcnIoIkdpdmUgeW91ciBwcmVzZXQgYSBuYW1lLiIpOyBuYW1lSW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIGlmIChwcm9tcHQubGVuZ3RoIDwgOCkgeyBzaG93RXJyKCJQcm9tcHQgbmVlZHMgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzLiIpOyBwcm9tcHRJbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgc2hvd0VycigiIik7CiAgICAgIHNldEJ1c3kodHJ1ZSk7CiAgICAgIHZhciBwYXlsb2FkID0geyBuYW1lOiBuYW1lLCBwcm9tcHQ6IHByb21wdCwgbmVnYXRpdmVQcm9tcHQ6IG5lZyB8fCBudWxsLCBtb2RlbDogaW5pdGlhbC5tb2RlbCB8fCBudWxsIH07CiAgICAgIHZhciBvcCA9IGVkaXRpbmcgPyB1cGRhdGUoaW5pdGlhbC5pZCwgcGF5bG9hZCkgOiBjcmVhdGUocGF5bG9hZCk7CiAgICAgIG9wLnRoZW4oZnVuY3Rpb24gKHNhdmVkKSB7CiAgICAgICAgc2V0QnVzeShmYWxzZSk7CiAgICAgICAgdG9hc3QoZWRpdGluZyA/ICJQcmVzZXQgdXBkYXRlZCIgOiAiUHJlc2V0IGNyZWF0ZWQiLCAic3VjY2VzcyIpOwogICAgICAgIGNsb3NlKCk7CiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uU2F2ZWQgPT09ICJmdW5jdGlvbiIpIG9wdHMub25TYXZlZChzYXZlZCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBzZXRCdXN5KGZhbHNlKTsKICAgICAgICBzaG93RXJyKCJDb3VsZG4ndCBzYXZlLiAiICsgZXJyTXNnKGVycikpOwogICAgICB9KTsKICAgIH0KCiAgICBzYXZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZG9TYXZlKTsKICAgIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGNsb3NlKTsKICAgIGlmIChkZWxCdG4pIGRlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHJ1biA9IGZ1bmN0aW9uICgpIHsgc2V0QnVzeSh0cnVlKTsgcmVtb3ZlKGluaXRpYWwuaWQpLnRoZW4oZnVuY3Rpb24gKCkgeyB0b2FzdCgiUHJlc2V0IGRlbGV0ZWQiLCAic3VjY2VzcyIpOyBjbG9zZSgpOyBpZiAodHlwZW9mIG9wdHMub25TYXZlZCA9PT0gImZ1bmN0aW9uIikgb3B0cy5vblNhdmVkKG51bGwpOyB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHNldEJ1c3koZmFsc2UpOyB9KTsgfTsKICAgICAgaWYgKHVpKCkuY29uZmlybSkgdWkoKS5jb25maXJtKCdEZWxldGUgIicgKyAoaW5pdGlhbC5uYW1lIHx8ICJ0aGlzIHByZXNldCIpICsgJyI/JywgeyBkZXN0cnVjdGl2ZTogdHJ1ZSwgY29uZmlybUxhYmVsOiAiRGVsZXRlIiB9KS50aGVuKGZ1bmN0aW9uIChvaykgeyBpZiAob2spIHJ1bigpOyB9KTsKICAgICAgZWxzZSBpZiAod2luZG93LmNvbmZpcm0oJ0RlbGV0ZSAiJyArIChpbml0aWFsLm5hbWUgfHwgInRoaXMgcHJlc2V0IikgKyAnIj8nKSkgcnVuKCk7CiAgICB9KTsKCiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpICYmIGUua2V5ID09PSAiRW50ZXIiKSB7IGUucHJldmVudERlZmF1bHQoKTsgZG9TYXZlKCk7IH0KICAgIH0pOwoKICAgIGlmICh1aSgpLm1vZGFsKSB7CiAgICAgIG1vZGFsUmVmID0gdWkoKS5tb2RhbChib2R5LCB7IGFyaWFMYWJlbDogZWRpdGluZyA/ICJFZGl0IHByZXNldCIgOiAiTmV3IHByZXNldCIsIG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHt9IH0pOwogICAgfSBlbHNlIHsKICAgICAgbW9kYWxSZWYgPSBmYWxsYmFja01vZGFsKGJvZHkpOwogICAgfQogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IChlZGl0aW5nID8gcHJvbXB0SW5wdXQgOiBuYW1lSW5wdXQpLmZvY3VzKCk7IH0sIDMwKTsKICAgIHJldHVybiBtb2RhbFJlZjsKICB9CgogIGZ1bmN0aW9uIGZhbGxiYWNrTW9kYWwobm9kZSkgewogICAgdmFyIG92ZXJsYXkgPSBlbCgiZGl2IiwgeyAiY2xhc3MiOiAidi1vdmVybGF5LXNjcmltIiwgcm9sZTogInByZXNlbnRhdGlvbiIgfSk7CiAgICB2YXIgc2hlZXQgPSBlbCgiZGl2IiwgeyAiY2xhc3MiOiAidi1tb2RhbCBnbGFzcy1jYXJkIiwgcm9sZTogImRpYWxvZyIsICJhcmlhLW1vZGFsIjogInRydWUiIH0sIG5vZGUpOwogICAgb3ZlcmxheS5hcHBlbmRDaGlsZChzaGVldCk7CiAgICBmdW5jdGlvbiBjbG9zZSgpIHsgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIG9uS2V5LCB0cnVlKTsgaWYgKG92ZXJsYXkucGFyZW50Tm9kZSkgb3ZlcmxheS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG92ZXJsYXkpOyB9CiAgICBmdW5jdGlvbiBvbktleShlKSB7IGlmIChlLmtleSA9PT0gIkVzY2FwZSIpIGNsb3NlKCk7IH0KICAgIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoZSkgeyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIGNsb3NlKCk7IH0pOwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIG9uS2V5LCB0cnVlKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7CiAgICByZXR1cm4geyBjbG9zZTogY2xvc2UgfTsKICB9CgogIGZ1bmN0aW9uIG9wZW5JbmR1c3RyaWVzUGlja2VyKG9uRG9uZSkgewogICAgdmFyIGluZHMgPSAoVi5kYXRhICYmIEFycmF5LmlzQXJyYXkoVi5kYXRhLmluZHVzdHJpZXMpKSA/IFYuZGF0YS5pbmR1c3RyaWVzIDogW107CiAgICBpZiAoIWluZHMubGVuZ3RoKSB7IHRvYXN0KCJObyBpbmR1c3RyaWVzIGF2YWlsYWJsZSIpOyBpZiAob25Eb25lKSBvbkRvbmUoKTsgcmV0dXJuOyB9CiAgICB2YXIgc2VsZWN0ZWQgPSAoKFYuc3RhdGUgJiYgVi5zdGF0ZS5pbmR1c3RyaWVzKSB8fCBbXSkuc2xpY2UoKTsKCiAgICB2YXIgZ3JpZCA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LWNoaXAtcm93Iiwgcm9sZTogImdyb3VwIiwgImFyaWEtbGFiZWwiOiAiSW5kdXN0cmllcyIgfSk7CiAgICBncmlkLnN0eWxlLmZsZXhXcmFwID0gIndyYXAiOwogICAgZ3JpZC5zdHlsZS5vdmVyZmxvd1ggPSAidmlzaWJsZSI7CiAgICBpbmRzLmZvckVhY2goZnVuY3Rpb24gKGluZCkgewogICAgICB2YXIgb24gPSBzZWxlY3RlZC5pbmRleE9mKGluZC5rZXkpICE9PSAtMTsKICAgICAgdmFyIGIgPSBlbCgiYnV0dG9uIiwgeyB0eXBlOiAiYnV0dG9uIiwgImNsYXNzIjogInYtY2hpcCIgKyAob24gPyAiIHYtY2hpcC0tYWN0aXZlIiA6ICIiKSwgImRhdGEta2V5IjogaW5kLmtleSwgImFyaWEtcHJlc3NlZCI6IG9uID8gInRydWUiIDogImZhbHNlIiB9LCBpbmQubGFiZWwgfHwgaW5kLmtleSk7CiAgICAgIGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGkgPSBzZWxlY3RlZC5pbmRleE9mKGluZC5rZXkpOwogICAgICAgIGlmIChpID09PSAtMSkgc2VsZWN0ZWQucHVzaChpbmQua2V5KTsgZWxzZSBzZWxlY3RlZC5zcGxpY2UoaSwgMSk7CiAgICAgICAgdmFyIG5vd09uID0gc2VsZWN0ZWQuaW5kZXhPZihpbmQua2V5KSAhPT0gLTE7CiAgICAgICAgYi5jbGFzc0xpc3QudG9nZ2xlKCJ2LWNoaXAtLWFjdGl2ZSIsIG5vd09uKTsKICAgICAgICBiLnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwgbm93T24gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICAgfSk7CiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoYik7CiAgICB9KTsKCiAgICB2YXIgc2F2ZUJ0biA9IGVsKCJidXR0b24iLCB7IHR5cGU6ICJidXR0b24iLCAiY2xhc3MiOiAidi1jdGEgdi1jdGEtLXByaW1hcnkiIH0sICJBcHBseSIpOwogICAgdmFyIGFsbEJ0biA9IGVsKCJidXR0b24iLCB7IHR5cGU6ICJidXR0b24iLCAiY2xhc3MiOiAidi1jdGEgdi1jdGEtLWdob3N0IiB9LCAiU2hvdyBhbGwiKTsKCiAgICB2YXIgYm9keSA9IGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LWZvcm0iIH0sIFsKICAgICAgZWwoImRpdiIsIHt9LCBbCiAgICAgICAgZWwoInAiLCB7ICJjbGFzcyI6ICJ2LWV5ZWJyb3ciIH0sICJGaWx0ZXIgUHJlc2V0cyIpLAogICAgICAgIGVsKCJoMiIsIHsgImNsYXNzIjogInYtbW9kYWxfX3RpdGxlIHYtZ3JhZGllbnQiIH0sICJZb3VyIGluZHVzdHJpZXMiKQogICAgICBdKSwKICAgICAgZWwoInAiLCB7ICJjbGFzcyI6ICJ2LWxhYmVsIiB9LCAiVGFpbG9yIHRoZSBzdHlsZSBwcmVzZXRzIHRvIHdoYXQgeW91IHdvcmsgb24uIiksCiAgICAgIGdyaWQsCiAgICAgIGVsKCJkaXYiLCB7ICJjbGFzcyI6ICJ2LW1vZGFsX19hY3Rpb25zIiB9LCBbYWxsQnRuLCBzYXZlQnRuXSkKICAgIF0pOwogICAgYm9keS5zdHlsZS5kaXNwbGF5ID0gImZsZXgiOwogICAgYm9keS5zdHlsZS5mbGV4RGlyZWN0aW9uID0gImNvbHVtbiI7CiAgICBib2R5LnN0eWxlLmdhcCA9ICJ2YXIoLS1zcGFjZS1tZCwgMTVweCkiOwoKICAgIHZhciBtb2RhbFJlZiA9IHVpKCkubW9kYWwgPyB1aSgpLm1vZGFsKGJvZHksIHsgYXJpYUxhYmVsOiAiRmlsdGVyIHByZXNldHMgYnkgaW5kdXN0cnkiIH0pIDogZmFsbGJhY2tNb2RhbChib2R5KTsKICAgIGZ1bmN0aW9uIGNvbW1pdChhcnIpIHsKICAgICAgaWYgKHN0b3JlKCkuc2V0KSBzdG9yZSgpLnNldCgiaW5kdXN0cmllcyIsIGFycik7IGVsc2UgVi5zdGF0ZS5pbmR1c3RyaWVzID0gYXJyOwogICAgICBpZiAoc3RvcmUoKS5zYXZlKSBzdG9yZSgpLnNhdmUoKTsKICAgICAgaWYgKHN0b3JlKCkuZW1pdCkgc3RvcmUoKS5lbWl0KCJpbmR1c3RyaWVzOmNoYW5nZWQiLCBhcnIpOwogICAgICBpZiAobW9kYWxSZWYgJiYgbW9kYWxSZWYuY2xvc2UpIG1vZGFsUmVmLmNsb3NlKCk7CiAgICAgIGlmIChvbkRvbmUpIG9uRG9uZSgpOwogICAgfQogICAgc2F2ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsgY29tbWl0KHNlbGVjdGVkKTsgfSk7CiAgICBhbGxCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IGNvbW1pdChbXSk7IH0pOwogIH0KCiAgZnVuY3Rpb24gc2F2ZVByZXNldChzZWVkLCBvcHRzKSB7CiAgICBzZWVkID0gc2VlZCB8fCB7fTsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIHByZWZpbGwgPSB7CiAgICAgIG5hbWU6IHNlZWQubmFtZSB8fCBzdWdnZXN0TmFtZShzZWVkLnByb21wdCksCiAgICAgIHByb21wdDogc2VlZC5wcm9tcHQgfHwgIiIsCiAgICAgIG5lZ2F0aXZlUHJvbXB0OiBzZWVkLm5lZ2F0aXZlUHJvbXB0IHx8IG51bGwsCiAgICAgIG1vZGVsOiBzZWVkLm1vZGVsIHx8IG51bGwKICAgIH07CiAgICByZXR1cm4gb3BlbkVkaXRvcihudWxsLCB7IHByZWZpbGw6IHByZWZpbGwsIG9uU2F2ZWQ6IG9wdHMub25TYXZlZCB9KTsKICB9CgogIGZ1bmN0aW9uIHN1Z2dlc3ROYW1lKHByb21wdCkgewogICAgaWYgKCFwcm9tcHQpIHJldHVybiAiIjsKICAgIHZhciB3b3JkcyA9IFN0cmluZyhwcm9tcHQpLnRyaW0oKS5zcGxpdCgvXHMrLykuc2xpY2UoMCwgNCkuam9pbigiICIpOwogICAgcmV0dXJuIHdvcmRzLmxlbmd0aCA+IDQwID8gd29yZHMuc2xpY2UoMCwgNDApIDogd29yZHM7CiAgfQoKICBWLnByZXNldHMgPSB7CiAgICBhbGw6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFYuc3RhdGUuY3VzdG9tUHJlc2V0cy5zbGljZSgpOyB9LAogICAgc3dpenpsZXM6IHJlbGV2YW50U3dpenpsZXMsCiAgICBpc1JlbGV2YW50OiBpc1JlbGV2YW50LAogICAgbG9hZDogbG9hZCwKICAgIGNyZWF0ZTogY3JlYXRlLAogICAgdXBkYXRlOiB1cGRhdGUsCiAgICByZW1vdmU6IHJlbW92ZSwKICAgICJkZWxldGUiOiByZW1vdmUsCiAgICByZW9yZGVyOiByZW9yZGVyLAogICAgcmVuZGVyQ2hpcHM6IHJlbmRlckNoaXBzLAogICAgb3BlbkVkaXRvcjogb3BlbkVkaXRvciwKICAgIG9wZW5JbmR1c3RyaWVzOiBvcGVuSW5kdXN0cmllc1BpY2tlciwKICAgIHNhdmVQcmVzZXQ6IHNhdmVQcmVzZXQKICB9OwoKICByZXN0b3JlKCk7Cn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2dlbmVyYXRlLmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9IHdpbmRvdy5WID0gd2luZG93LlYgfHwge307CiAgVi52aWV3cyA9IFYudmlld3MgfHwge307CgogIGZ1bmN0aW9uIHVpKCkgeyByZXR1cm4gVi51aSB8fCB7fTsgfQogIGZ1bmN0aW9uIGFwaSgpIHsgcmV0dXJuIFYuYXBpIHx8IHt9OyB9CiAgZnVuY3Rpb24gdXRpbCgpIHsgcmV0dXJuIFYudXRpbCB8fCB7fTsgfQogIGZ1bmN0aW9uIGRhdGEoKSB7IHJldHVybiBWLmRhdGEgfHwge307IH0KICBmdW5jdGlvbiBzdGF0ZSgpIHsgcmV0dXJuIChWLnN0YXRlID0gVi5zdGF0ZSB8fCB7fSk7IH0KCiAgZnVuY3Rpb24gZWwodGFnLCBhdHRycykgewogICAgaWYgKHVpKCkuZWwpIHJldHVybiB1aSgpLmVsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIHZhciBpID0gMSwga2lkcyA9IFtdOwogICAgaWYgKGF0dHJzICYmIHR5cGVvZiBhdHRycyA9PT0gJ29iamVjdCcgJiYgIShhdHRycyBpbnN0YW5jZW9mIE5vZGUpICYmIHR5cGVvZiBhdHRycyAhPT0gJ3N0cmluZycpIHsKICAgICAgaSA9IDI7CiAgICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgaykpIGNvbnRpbnVlOwogICAgICAgIHZhciB2YWwgPSBhdHRyc1trXTsKICAgICAgICBpZiAoayA9PT0gJ2NsYXNzJyB8fCBrID09PSAnY2xhc3NOYW1lJykgbm9kZS5jbGFzc05hbWUgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ3RleHQnKSBub2RlLnRleHRDb250ZW50ID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICdodG1sJykgbm9kZS5pbm5lckhUTUwgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdvbicpID09PSAwICYmIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHZhbCk7CiAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdkYXRhLScpID09PSAwKSBub2RlLnNldEF0dHJpYnV0ZShrLCB2YWwpOwogICAgICAgIGVsc2UgaWYgKHZhbCA9PT0gdHJ1ZSkgbm9kZS5zZXRBdHRyaWJ1dGUoaywgJycpOwogICAgICAgIGVsc2UgaWYgKHZhbCAhPSBudWxsICYmIHZhbCAhPT0gZmFsc2UpIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYXR0cnMgIT0gbnVsbCkgeyBraWRzLnB1c2goYXR0cnMpOyB9CiAgICBmb3IgKDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykga2lkcy5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgICBraWRzLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgYXBwZW5kQ2hpbGQobm9kZSwgYyk7IH0pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiBhcHBlbmRDaGlsZChub2RlLCBjKSB7CiAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlKSByZXR1cm47CiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgeyBjLmZvckVhY2goZnVuY3Rpb24gKHgpIHsgYXBwZW5kQ2hpbGQobm9kZSwgeCk7IH0pOyByZXR1cm47IH0KICAgIGlmIChjIGluc3RhbmNlb2YgTm9kZSkgeyBub2RlLmFwcGVuZENoaWxkKGMpOyByZXR1cm47IH0KICAgIG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGMpKSk7CiAgfQoKICBmdW5jdGlvbiBpY29uKG5hbWUpIHsKICAgIHRyeSB7CiAgICAgIGlmICh1aSgpLmljb24pIHsKICAgICAgICB2YXIgZ290ID0gdWkoKS5pY29uKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YgZ290ID09PSAnc3RyaW5nJykgcmV0dXJuIGdvdDsKICAgICAgICBpZiAoZ290ICYmIGdvdC5ub2RlVHlwZSAmJiB0eXBlb2YgZ290Lm91dGVySFRNTCA9PT0gJ3N0cmluZycpIHJldHVybiBnb3Qub3V0ZXJIVE1MOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQogICAgcmV0dXJuICcnOwogIH0KCiAgZnVuY3Rpb24gaWNvbk5vZGUobmFtZSwgZ2x5cGgpIHsKICAgIHZhciBodG1sID0gaWNvbihuYW1lKTsKICAgIGlmIChodG1sKSB7IHZhciBzcGFuID0gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1pY28nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIGh0bWw6IGh0bWwgfSk7IHJldHVybiBzcGFuOyB9CiAgICByZXR1cm4gZWwoJ3NwYW4nLCB7ICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9LCBnbHlwaCB8fCAnJyk7CiAgfQoKICBmdW5jdGlvbiB0b2FzdChtc2csIGtpbmQpIHsKICAgIGlmICh1aSgpLnRvYXN0KSB7IHVpKCkudG9hc3QobXNnLCBraW5kIHx8ICdpbmZvJyk7IHJldHVybjsgfQogICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5lbWl0KSBWLnN0b3JlLmVtaXQoJ3RvYXN0JywgeyBtc2c6IG1zZywga2luZDoga2luZCB8fCAnaW5mbycgfSk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICBpZiAoVi5yb3V0ZXIgJiYgVi5yb3V0ZXIuZ28pIFYucm91dGVyLmdvKGhhc2gpOwogICAgZWxzZSB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiB1dWlkKCkgewogICAgaWYgKHV0aWwoKS51dWlkKSByZXR1cm4gdXRpbCgpLnV1aWQoKTsKICAgIGlmICh3aW5kb3cuY3J5cHRvICYmIGNyeXB0by5yYW5kb21VVUlEKSByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTsKICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgIHZhciByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwLCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODsKICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByYW5kb21TZWVkKCkgewogICAgaWYgKHV0aWwoKS5yYW5kb21TZWVkKSByZXR1cm4gdXRpbCgpLnJhbmRvbVNlZWQoKTsKICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKTsKICB9CgogIGZ1bmN0aW9uIG5vd0lTTygpIHsKICAgIHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXC5cZHszfVokLywgJ1onKTsKICB9CgogIGZ1bmN0aW9uIGVzYyhzKSB7CiAgICBpZiAodXRpbCgpLmVzY2FwZUh0bWwpIHJldHVybiB1dGlsKCkuZXNjYXBlSHRtbChzKTsKICAgIHJldHVybiBTdHJpbmcocyA9PSBudWxsID8gJycgOiBzKS5yZXBsYWNlKC9bJjw+IiddL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgIHJldHVybiB7ICcmJzogJyZhbXA7JywgJzwnOiAnJmx0OycsICc+JzogJyZndDsnLCAnIic6ICcmcXVvdDsnLCAiJyI6ICcmIzM5OycgfVtjXTsKICAgIH0pOwogIH0KCiAgdmFyIEZBTExCQUNLX01PREVMUyA9IFsKICAgIHsgcmF3OiAnZmx1eEtsZWluJywgICAgIGxhYmVsOiAnU3RhbmRhcmQnLCBzdWJoZWFkaW5nOiAnRmx1eCBLbGVpbicsICAgICBjb3N0OiAxMCwgbWF4UmVmOiAxLCB0Mmk6ICdmbHV4MVNjaG5lbGwnLCBkZWZhdWx0OiB0cnVlIH0sCiAgICB7IHJhdzogJ2ZsdXgxS29udGV4dCcsICBsYWJlbDogJ0xlZ2FjeScsICAgc3ViaGVhZGluZzogJ0ZsdXggS29udGV4dCcsICAgY29zdDogMTAsIG1heFJlZjogMSB9LAogICAgeyByYXc6ICduYW5vQmFuYW5hJywgICAgbGFiZWw6ICdQcm8nLCAgICAgIHN1YmhlYWRpbmc6ICdOYW5vIEJhbmFuYScsICAgIGNvc3Q6IDEwLCBtYXhSZWY6IDYgfSwKICAgIHsgcmF3OiAnbmFub0JhbmFuYTInLCAgIGxhYmVsOiAnUGx1cycsICAgICBzdWJoZWFkaW5nOiAnTmFubyBCYW5hbmEgMicsICBjb3N0OiAxNSwgbWF4UmVmOiA2IH0sCiAgICB7IHJhdzogJ25hbm9CYW5hbmFQcm8nLCBsYWJlbDogJ01heCcsICAgICAgc3ViaGVhZGluZzogJ05hbm8gQmFuYW5hIFBybycsIGNvc3Q6IDIwLCBtYXhSZWY6IDE1IH0KICBdOwogIHZhciBGQUxMQkFDS19BU1BFQ1RTID0gWwogICAgeyByYXc6ICdhdXRvJywgICAgICAgICAgbGFiZWw6ICdBdXRvJywgICAgICAgICAgIHc6IDEwMjQsIGg6IDEwMjQgfSwKICAgIHsgcmF3OiAnc3F1YXJlJywgICAgICAgIGxhYmVsOiAnU3F1YXJlJywgICAgICAgICB3OiAxMDI0LCBoOiAxMDI0IH0sCiAgICB7IHJhdzogJ3BvcnRyYWl0OTE2JywgICBsYWJlbDogJ1BvcnRyYWl0IDk6MTYnLCAgdzogMTAyNCwgaDogMTgyMCB9LAogICAgeyByYXc6ICdsYW5kc2NhcGUxNjknLCAgbGFiZWw6ICdMYW5kc2NhcGUgMTY6OScsIHc6IDE4MjAsIGg6IDEwMjQgfSwKICAgIHsgcmF3OiAncG9ydHJhaXQ0MycsICAgIGxhYmVsOiAnUG9ydHJhaXQgMzo0JywgICB3OiAxMDI0LCBoOiAxMzY1IH0sCiAgICB7IHJhdzogJ2xhbmRzY2FwZTQzJywgICBsYWJlbDogJ0xhbmRzY2FwZSA0OjMnLCAgdzogMTM2NSwgaDogMTAyNCB9CiAgXTsKCiAgZnVuY3Rpb24gbW9kZWxzKCkgewogICAgdmFyIG0gPSBkYXRhKCkubW9kZWxzOwogICAgcmV0dXJuIChBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoKSA/IG0gOiBGQUxMQkFDS19NT0RFTFM7CiAgfQogIGZ1bmN0aW9uIGFzcGVjdHMoKSB7CiAgICB2YXIgYSA9IGRhdGEoKS5hc3BlY3RzOwogICAgcmV0dXJuIChBcnJheS5pc0FycmF5KGEpICYmIGEubGVuZ3RoKSA/IGEgOiBGQUxMQkFDS19BU1BFQ1RTOwogIH0KCiAgZnVuY3Rpb24gbW9kZWxCeVJhdyhyYXcpIHsKICAgIHZhciBsaXN0ID0gbW9kZWxzKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIGlmIChsaXN0W2ldLnJhdyA9PT0gcmF3KSByZXR1cm4gbGlzdFtpXTsKICAgIHJldHVybiBsaXN0WzBdOwogIH0KCiAgZnVuY3Rpb24gbWF4UmVmRm9yKG1vZGVsKSB7CiAgICB2YXIgbiA9IG1vZGVsICYmIChtb2RlbC5tYXhSZWYgIT0gbnVsbCA/IG1vZGVsLm1heFJlZiA6IG1vZGVsLm1heElucHV0SW1hZ2VzKTsKICAgIHJldHVybiAodHlwZW9mIG4gPT09ICdudW1iZXInICYmIG4gPiAwKSA/IG4gOiAxOwogIH0KCiAgdmFyIElORFVTVFJZX1BMQUNFSE9MREVSUyA9IHsKICAgIHJlYWxFc3RhdGU6ICdTdGFnZSB0aGlzIGVtcHR5IGxpdmluZyByb29tIHdpdGggd2FybSBtb2Rlcm4gZnVybml0dXJlIGFuZCBzb2Z0IGRheWxpZ2h04oCmJywKICAgIGludGVyaW9yRGVzaWduOiAnUmVpbWFnaW5lIHRoaXMgcm9vbSBpbiBhIHRyYW5zaXRpb25hbCBzdHlsZSB3aXRoIG5hdHVyYWwgdGV4dHVyZXPigKYnLAogICAgYXJjaGl0ZWN0dXJlOiAnVmlzdWFsaXplIGEgbW9kZXJuIGZhY2FkZSB3aXRoIGZsb29yLXRvLWNlaWxpbmcgZ2xhc3MgYW5kIGNsZWFuIGxpbmVz4oCmJywKICAgIGxhbmRzY2FwaW5nOiAnQWRkIGx1c2ggbGFuZHNjYXBpbmcsIGEgc3RvbmUgcGF0aCwgYW5kIGV2ZW5pbmcgZ2FyZGVuIGxpZ2h0aW5n4oCmJywKICAgIGZ1cm5pc2hpbmc6ICdGdXJuaXNoIHRoaXMgc3BhY2Ugd2l0aCBtaWQtY2VudHVyeSBzZWF0aW5nIGFuZCBhIHN0YXRlbWVudCBydWfigKYnLAogICAgY29uc3RydWN0aW9uOiAnU2hvdyB0aGUgZmluaXNoZWQgYnVpbGQgd2l0aCBjb21wbGV0ZWQgc2lkaW5nIGFuZCBhIG1hbmljdXJlZCBsYXdu4oCmJywKICAgIGhvbWVPd25lcjogJ1JlcGFpbnQgdGhlc2Ugd2FsbHMgYSB3YXJtIG5ldXRyYWwgYW5kIGJyaWdodGVuIHRoZSBsaWdodGluZ+KApicKICB9OwoKICBmdW5jdGlvbiBwbGFjZWhvbGRlclRleHQoKSB7CiAgICB2YXIgcyA9IHN0YXRlKCk7CiAgICB2YXIgaW5kcyA9IHMuaW5kdXN0cmllcyB8fCAocy5zZXR0aW5ncyAmJiBzLnNldHRpbmdzLmluZHVzdHJpZXMpIHx8IFtdOwogICAgdmFyIGtleSA9IG51bGw7CiAgICBpZiAoQXJyYXkuaXNBcnJheShpbmRzKSAmJiBpbmRzLmxlbmd0aCkgewogICAgICBrZXkgPSAodHlwZW9mIGluZHNbMF0gPT09ICdzdHJpbmcnKSA/IGluZHNbMF0gOiAoaW5kc1swXSAmJiAoaW5kc1swXS5rZXkgfHwgaW5kc1swXS5yYXcpKTsKICAgIH0KICAgIGlmIChrZXkgJiYgSU5EVVNUUllfUExBQ0VIT0xERVJTW2tleV0pIHJldHVybiBJTkRVU1RSWV9QTEFDRUhPTERFUlNba2V5XTsKICAgIHJldHVybiAnRGVzY3JpYmUgd2hhdCB5b3Ugd2FudCB0byBjcmVhdGUgb3IgdHJhbnNmb3Jt4oCmJzsKICB9CgogIHZhciBjdXJyZW50ID0gbnVsbDsKCiAgVi52aWV3cy5jcmVhdGUgPSB7CiAgICByZW5kZXI6IGZ1bmN0aW9uIChyb290LCBwYXJhbXMpIHsKICAgICAgaWYgKGN1cnJlbnQpIHsgdHJ5IHsgY3VycmVudC5kZXN0cm95KCk7IH0gY2F0Y2ggKGUpIHt9IGN1cnJlbnQgPSBudWxsOyB9CiAgICAgIGN1cnJlbnQgPSBuZXcgQ3JlYXRvcihyb290LCBwYXJhbXMgfHwge30pOwogICAgICBjdXJyZW50Lm1vdW50KCk7CiAgICB9LAogICAgdGVhcmRvd246IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGN1cnJlbnQpIHsgdHJ5IHsgY3VycmVudC5kZXN0cm95KCk7IH0gY2F0Y2ggKGUpIHt9IGN1cnJlbnQgPSBudWxsOyB9CiAgICB9LAogICAgYXBwbHlFeGFtcGxlOiBmdW5jdGlvbiAoZXhhbXBsZSkgewogICAgICBleGFtcGxlID0gZXhhbXBsZSB8fCB7fTsKICAgICAgaWYgKGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQuYXBwbHlFeGFtcGxlID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgY3VycmVudC5hcHBseUV4YW1wbGUoZXhhbXBsZSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBwYXJ0cyA9IFtdOwogICAgICBpZiAoZXhhbXBsZS5wcm9tcHQpIHBhcnRzLnB1c2goJ3Byb21wdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGV4YW1wbGUucHJvbXB0KSk7CiAgICAgIGlmIChleGFtcGxlLm1vZGVsKSBwYXJ0cy5wdXNoKCdtb2RlbD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGV4YW1wbGUubW9kZWwpKTsKICAgICAgaWYgKGV4YW1wbGUucmVmZXJlbmNlVVJMKSBwYXJ0cy5wdXNoKCdpbWFnZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGV4YW1wbGUucmVmZXJlbmNlVVJMKSk7CiAgICAgIGdvKCcjL2NyZWF0ZScgKyAocGFydHMubGVuZ3RoID8gJz8nICsgcGFydHMuam9pbignJicpIDogJycpKTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiBDcmVhdG9yKHJvb3QsIHBhcmFtcykgewogICAgdGhpcy5yb290ID0gcm9vdDsKICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwoKICAgIHRoaXMucHJvbXB0ID0gdHlwZW9mIHBhcmFtcy5wcm9tcHQgPT09ICdzdHJpbmcnID8gcGFyYW1zLnByb21wdCA6ICcnOwogICAgdGhpcy5tb2RlbFJhdyA9IChwYXJhbXMubW9kZWwgJiYgbW9kZWxCeVJhdyhwYXJhbXMubW9kZWwpLnJhdyA9PT0gcGFyYW1zLm1vZGVsKSA/IHBhcmFtcy5tb2RlbCA6IHBpY2tEZWZhdWx0TW9kZWwoKTsKICAgIHRoaXMuYXNwZWN0UmF3ID0gcmVhZFBlcnNpc3RlZCgnYXNwZWN0JykgfHwgYXNwZWN0cygpWzBdLnJhdzsKICAgIHRoaXMuYWN0aXZlUHJlc2V0ID0gbnVsbDsKICAgIHRoaXMucmVmcyA9IFtdOwoKICAgIHZhciBzZWVkSW1hZ2UgPSBwYXJhbXMuaW1hZ2UgfHwgcGFyYW1zLmltYWdlVVJMIHx8IHBhcmFtcy5pbWFnZV91cmw7CiAgICBpZiAoc2VlZEltYWdlKSB7CiAgICAgIHRoaXMucmVmcy5wdXNoKHsgdXJsOiBzZWVkSW1hZ2UsIHJlbW90ZVVSTDogc2VlZEltYWdlLCBuYW1lOiAncmVmZXJlbmNlJyB9KTsKICAgIH0KICAgIHRoaXMudmFyaWF0aW9ucyA9IGZhbHNlOwogICAgdGhpcy5idXN5ID0gZmFsc2U7CiAgICB0aGlzLmFib3J0ID0gbnVsbDsKCiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTsKICAgIHRoaXMuX2Rlc3Ryb3llZCA9IGZhbHNlOwogICAgdGhpcy5fcHJlc2V0Q3RsID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHBpY2tEZWZhdWx0TW9kZWwoKSB7CiAgICB2YXIgc2F2ZWQgPSByZWFkUGVyc2lzdGVkKCdtb2RlbCcpOwogICAgaWYgKHNhdmVkICYmIG1vZGVsQnlSYXcoc2F2ZWQpLnJhdyA9PT0gc2F2ZWQpIHJldHVybiBzYXZlZDsKICAgIHZhciBsaXN0ID0gbW9kZWxzKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIGlmIChsaXN0W2ldLmRlZmF1bHQpIHJldHVybiBsaXN0W2ldLnJhdzsKICAgIHJldHVybiBsaXN0WzBdLnJhdzsKICB9CgogIGZ1bmN0aW9uIHJlYWRQZXJzaXN0ZWQoaykgewogICAgdHJ5IHsgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd2YW1wX3dlYl9jcmVhdGVfJyArIGspOyB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgfQogIGZ1bmN0aW9uIHdyaXRlUGVyc2lzdGVkKGssIHYpIHsKICAgIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd2YW1wX3dlYl9jcmVhdGVfJyArIGssIHYpOyB9IGNhdGNoIChlKSB7fQogIH0KCiAgQ3JlYXRvci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAodGFyZ2V0LCBldnQsIGZuLCBvcHRzKSB7CiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldnQsIGZuLCBvcHRzIHx8IGZhbHNlKTsKICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKFt0YXJnZXQsIGV2dCwgZm4sIG9wdHMgfHwgZmFsc2VdKTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgewogICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTsKICAgIGlmICh0aGlzLmFib3J0KSB7IHRyeSB7IHRoaXMuYWJvcnQuYWJvcnQoKTsgfSBjYXRjaCAoZSkge30gfQogICAgaWYgKHRoaXMuX3ByZXNldEN0bCAmJiB0eXBlb2YgdGhpcy5fcHJlc2V0Q3RsLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgdGhpcy5fcHJlc2V0Q3RsLmRlc3Ryb3koKTsgfSBjYXRjaCAoZSkge30gfQogICAgdGhpcy5fcHJlc2V0Q3RsID0gbnVsbDsKICAgIHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsKSB7IHRyeSB7IGxbMF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihsWzFdLCBsWzJdLCBsWzNdKTsgfSBjYXRjaCAoZSkge30gfSk7CiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTsKICAgIHRoaXMuY2xlYXJSZWZzKCk7CiAgICBpZiAodGhpcy5fc2NyaW0gJiYgdGhpcy5fc2NyaW0ucGFyZW50Tm9kZSkgdGhpcy5fc2NyaW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9zY3JpbSk7CiAgICB0aGlzLl9zY3JpbSA9IG51bGw7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuY3VycmVudE1vZGVsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbW9kZWxCeVJhdyh0aGlzLm1vZGVsUmF3KTsgfTsKICBDcmVhdG9yLnByb3RvdHlwZS5oYXNJbnB1dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucmVmcy5sZW5ndGggPiAwOyB9OwogIENyZWF0b3IucHJvdG90eXBlLmlzVDJJID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gIXRoaXMuaGFzSW5wdXQoKTsgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUudW5pdENvc3QgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAodGhpcy5pc1QySSgpKSByZXR1cm4gMTsKICAgIHZhciBtID0gdGhpcy5jdXJyZW50TW9kZWwoKTsKICAgIHJldHVybiAobSAmJiB0eXBlb2YgbS5jb3N0ID09PSAnbnVtYmVyJykgPyBtLmNvc3QgOiAxMDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS50b3RhbENvc3QgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgY291bnQgPSB0aGlzLnZhcmlhdGlvbnMgPyA0IDogMTsKICAgIHJldHVybiB0aGlzLnVuaXRDb3N0KCkgKiBjb3VudDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5maW5hbFByb21wdCA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB0eXBlZCA9ICh0aGlzLnByb21wdCB8fCAnJykudHJpbSgpOwogICAgaWYgKHRoaXMuYWN0aXZlUHJlc2V0ICYmIHRoaXMuYWN0aXZlUHJlc2V0LnByb21wdCkgewogICAgICB2YXIgcHJlID0gdGhpcy5hY3RpdmVQcmVzZXQucHJvbXB0LnRyaW0oKTsKICAgICAgcmV0dXJuIHR5cGVkID8gKHByZSArICcgJyArIHR5cGVkKSA6IHByZTsKICAgIH0KICAgIHJldHVybiB0eXBlZDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5jYW5TdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAodGhpcy5idXN5KSByZXR1cm4gZmFsc2U7CiAgICBpZiAodGhpcy5oYXNJbnB1dCgpKSByZXR1cm4gdHJ1ZTsKICAgIGlmICh0aGlzLmFjdGl2ZVByZXNldCAmJiB0aGlzLmFjdGl2ZVByZXNldC5wcm9tcHQpIHJldHVybiB0cnVlOwogICAgcmV0dXJuICh0aGlzLnByb21wdCB8fCAnJykudHJpbSgpLmxlbmd0aCA+PSA4OwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLm1vdW50ID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHJvb3QgPSB0aGlzLnJvb3Q7CiAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgcm9vdC5jbGFzc05hbWUgPSAndi12aWV3IHYtY3JlYXRlJzsKCiAgICB2YXIgbGlicmFyeUVtcHR5ID0gIShzdGF0ZSgpLmxpYnJhcnkgJiYgc3RhdGUoKS5saWJyYXJ5Lmxlbmd0aCk7CgogICAgdmFyIGNvbnRyb2xzID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fbWFpbicgfSk7CiAgICB0aGlzLmJ1aWxkQ29udHJvbHMoY29udHJvbHMpOwoKICAgIHZhciBzaWRlID0gZWwoJ2FzaWRlJywgeyBjbGFzczogJ3Ytc2lkZS1wYW5lbCB2LWNyZWF0ZV9fc2lkZScgfSk7CiAgICB0cnkgeyBzaWRlLmFwcGVuZENoaWxkKHRoaXMuYnVpbGRTaWRlKGxpYnJhcnlFbXB0eSkpOyB9IGNhdGNoIChlKSB7fQoKICAgIHZhciBsYXlvdXQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3BsaXQtbGF5b3V0JyB9LCBjb250cm9scywgc2lkZSk7CiAgICByb290LmFwcGVuZENoaWxkKGxheW91dCk7CgogICAgdGhpcy5fc2lkZU5vZGUgPSBzaWRlOwogICAgdGhpcy5yZWZyZXNoQ1RBKCk7CiAgICB0aGlzLnJlZnJlc2hBc3BlY3RWaXNpYmlsaXR5KCk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRDb250cm9scyA9IGZ1bmN0aW9uIChob3N0KSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBmdW5jdGlvbiBhZGQoZm4pIHsKICAgICAgdmFyIG5vZGUgPSBudWxsOwogICAgICB0cnkgeyBub2RlID0gZm4uY2FsbChzZWxmKTsgfSBjYXRjaCAoZSkgeyBpZiAod2luZG93LmNvbnNvbGUpIGNvbnNvbGUuZXJyb3IoJ1tjcmVhdGVdIHNlY3Rpb24gZmFpbGVkJywgZSk7IH0KICAgICAgaWYgKG5vZGUpIGhvc3QuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICB9CgogICAgYWRkKHRoaXMuYnVpbGRIZWFkZXIpOwogICAgYWRkKHRoaXMuYnVpbGRJbWFnZVpvbmUpOwogICAgYWRkKHRoaXMuYnVpbGRQcm9tcHQpOwogICAgYWRkKHRoaXMuYnVpbGRQcmVzZXRzKTsKICAgIGFkZCh0aGlzLmJ1aWxkU2VsZWN0b3JzKTsKICAgIGFkZCh0aGlzLmJ1aWxkQWN0aW9ucyk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRIZWFkZXIgPSBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gZWwoJ2hlYWRlcicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX2hlYWQgdi1jcmVhdGVfX2hlYWQnIH0sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX2hlYWR0ZXh0JyB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZXllYnJvdycgfSwgJ1ZhbXAgU3R1ZGlvJyksCiAgICAgICAgZWwoJ2gxJywgeyBjbGFzczogJ3YtY3JlYXRlX190aXRsZSB2LWdyYWRpZW50JyB9LCAnQ3JlYXRlIG9yIHRyYW5zZm9ybScpLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViJyB9LCAnRGVzY3JpYmUgYSBzY2VuZSwgb3IgZHJvcCBhbiBpbWFnZSB0byByZXN0eWxlLCBzdGFnZSwgYW5kIHJlaW1hZ2luZSBpdC4nKQogICAgICApKTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5idWlsZEltYWdlWm9uZSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciBzZWN0aW9uID0gZWwoJ3NlY3Rpb24nLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCB2LWNyZWF0ZV9faW1nem9uZScsICdhcmlhLWxhYmVsJzogJ1JlZmVyZW5jZSBpbWFnZXMnIH0pOwogICAgdGhpcy5faW1nem9uZSA9IHNlY3Rpb247CgogICAgdmFyIGZpbGVJbnB1dCA9IGVsKCdpbnB1dCcsIHsKICAgICAgdHlwZTogJ2ZpbGUnLCBhY2NlcHQ6ICdpbWFnZS8qJywgbXVsdGlwbGU6IHRydWUsCiAgICAgIGNsYXNzOiAndi12aXN1YWxseS1oaWRkZW4nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIHRhYmluZGV4OiAnLTEnLAogICAgICBzdHlsZTogJ3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtoZWlnaHQ6MXB4O29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lJwogICAgfSk7CiAgICB0aGlzLm9uKGZpbGVJbnB1dCwgJ2NoYW5nZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgIHNlbGYuYWRkRmlsZXMoZS50YXJnZXQuZmlsZXMpOwogICAgICBmaWxlSW5wdXQudmFsdWUgPSAnJzsKICAgIH0pOwogICAgdGhpcy5fZmlsZUlucHV0ID0gZmlsZUlucHV0OwogICAgc2VjdGlvbi5hcHBlbmRDaGlsZChmaWxlSW5wdXQpOwoKICAgIHRoaXMub24oZG9jdW1lbnQsICdwYXN0ZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChzZWxmLl9kZXN0cm95ZWQgfHwgc2VsZi5idXN5KSByZXR1cm47CiAgICAgIHZhciBpdGVtcyA9IChlLmNsaXBib2FyZERhdGEgJiYgZS5jbGlwYm9hcmREYXRhLml0ZW1zKSB8fCBbXTsKICAgICAgdmFyIGZpbGVzID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoaXRlbXNbaV0ua2luZCA9PT0gJ2ZpbGUnICYmIGl0ZW1zW2ldLnR5cGUuaW5kZXhPZignaW1hZ2UvJykgPT09IDApIHsKICAgICAgICAgIHZhciBmID0gaXRlbXNbaV0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICBpZiAoZikgZmlsZXMucHVzaChmKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGZpbGVzLmxlbmd0aCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IHNlbGYuYWRkRmlsZXMoZmlsZXMpOyB9CiAgICB9KTsKCiAgICB0aGlzLnJlbmRlckltYWdlWm9uZSgpOwogICAgcmV0dXJuIHNlY3Rpb247CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYmluZERuZCA9IGZ1bmN0aW9uICh0YXJnZXQpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIFsnZHJhZ2VudGVyJywgJ2RyYWdvdmVyJ10uZm9yRWFjaChmdW5jdGlvbiAoZXZ0KSB7CiAgICAgIHNlbGYub24odGFyZ2V0LCBldnQsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2RyYWdvdmVyJyk7IH0pOwogICAgfSk7CiAgICBbJ2RyYWdsZWF2ZScsICdkcmFnZW5kJ10uZm9yRWFjaChmdW5jdGlvbiAoZXZ0KSB7CiAgICAgIHNlbGYub24odGFyZ2V0LCBldnQsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdvdmVyJyk7IH0pOwogICAgfSk7CiAgICB0aGlzLm9uKHRhcmdldCwgJ2Ryb3AnLCBmdW5jdGlvbiAoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnb3ZlcicpOwogICAgICB2YXIgZHQgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgaWYgKGR0ICYmIGR0LmZpbGVzICYmIGR0LmZpbGVzLmxlbmd0aCkgc2VsZi5hZGRGaWxlcyhkdC5maWxlcyk7CiAgICB9KTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZW5kZXJJbWFnZVpvbmUgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX2ltZ3pvbmU7CiAgICBpZiAoIXNlY3Rpb24pIHJldHVybjsKICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHNlY3Rpb24uY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsKICAgICAgaWYgKGMgIT09IHNlbGYuX2ZpbGVJbnB1dCkgc2VjdGlvbi5yZW1vdmVDaGlsZChjKTsKICAgIH0pOwoKICAgIHZhciBtb2RlbCA9IHRoaXMuY3VycmVudE1vZGVsKCk7CiAgICB2YXIgbWF4ID0gbWF4UmVmRm9yKG1vZGVsKTsKCiAgICBpZiAoIXRoaXMucmVmcy5sZW5ndGgpIHsKICAgICAgdmFyIHpvbmUgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZHJvcHpvbmUnLCByb2xlOiAnYnV0dG9uJywgdGFiaW5kZXg6ICcwJywKICAgICAgICAnYXJpYS1sYWJlbCc6ICdBZGQgYSByZWZlcmVuY2UgaW1hZ2UnIH0sCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJywgaHRtbDogaWNvbigncGhvdG8nKSB8fCBkcm9wR2x5cGgoKSB9KSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3JlYXRlX19kcm9wdGl0bGUnIH0sICdEcm9wIGFuIGltYWdlLCBwYXN0ZSwgb3IgYnJvd3NlJyksCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YicgfSwKICAgICAgICAgICdPcHRpb25hbCDigJQgbGVhdmUgZW1wdHkgdG8gZ2VuZXJhdGUgZnJvbSB0ZXh0LiAnICsKICAgICAgICAgIChtYXggPiAxID8gKCdVcCB0byAnICsgbWF4ICsgJyByZWZlcmVuY2VzIGZvciAnICsgKG1vZGVsLmxhYmVsIHx8ICd0aGlzIG1vZGVsJykgKyAnLicpIDogJycpKSk7CiAgICAgIHRoaXMuYmluZERuZCh6b25lKTsKICAgICAgdGhpcy5vbih6b25lLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7IHNlbGYuX2ZpbGVJbnB1dC5jbGljaygpOyB9KTsKICAgICAgdGhpcy5vbih6b25lLCAna2V5ZG93bicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInIHx8IGUua2V5ID09PSAnICcpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzZWxmLl9maWxlSW5wdXQuY2xpY2soKTsgfQogICAgICB9KTsKICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZCh6b25lKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBvdmVyTGltaXQgPSB0aGlzLnJlZnMubGVuZ3RoID4gbWF4OwogICAgdmFyIGhlYWQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2VjdGlvbl9faGVhZCB2LWNyZWF0ZV9faW1naGVhZCcgfSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1leWVicm93JyB9LCAodGhpcy5yZWZzLmxlbmd0aCA+IDEgPyAnUmVmZXJlbmNlcycgOiAnU291cmNlIGltYWdlJykpLAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWxhYmVsIHYtY3JlYXRlX19pbWdjb3VudCcgKyAob3ZlckxpbWl0ID8gJyBpcy1vdmVyJyA6ICcnKSB9LAogICAgICAgIHRoaXMucmVmcy5sZW5ndGggKyAnIC8gJyArIG1heCkpOwogICAgc2VjdGlvbi5hcHBlbmRDaGlsZChoZWFkKTsKCiAgICB2YXIgZ3JpZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1ncmlkIHYtZ3JpZC0tYXV0byB2LWNyZWF0ZV9fdGh1bWJzJyB9KTsKICAgIHRoaXMuYmluZERuZChncmlkKTsKICAgIHRoaXMucmVmcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWYsIGlkeCkgewogICAgICB2YXIgdGh1bWIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3JlYXRlX190aHVtYicgKyAoaWR4ID09PSAwICYmIHNlbGYucmVmcy5sZW5ndGggPiAxID8gJyBpcy1wcmltYXJ5JyA6ICcnKSB9KTsKICAgICAgdmFyIHRodW1iSW1nID0gZWwoJ2ltZycsIHsgc3JjOiByZWYudXJsLCBhbHQ6IHJlZi5uYW1lIHx8ICgncmVmZXJlbmNlICcgKyAoaWR4ICsgMSkpLCBsb2FkaW5nOiAnbGF6eScgfSk7CiAgICAgIHRodW1iSW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyB0aHVtYi5jbGFzc0xpc3QuYWRkKCdpcy1icm9rZW4nKTsgfSk7CiAgICAgIHRodW1iLmFwcGVuZENoaWxkKHRodW1iSW1nKTsKICAgICAgaWYgKGlkeCA9PT0gMCAmJiBzZWxmLnJlZnMubGVuZ3RoID4gMSkgewogICAgICAgIHRodW1iLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtdGh1bWJfX2JhZGdlIHYtY3JlYXRlX190aHVtYi1iYWRnZScgfSwgJ0JlZm9yZScpKTsKICAgICAgfQogICAgICB2YXIgcm0gPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3JlYXRlX190aHVtYi1ybScsIHR5cGU6ICdidXR0b24nLCAnYXJpYS1sYWJlbCc6ICdSZW1vdmUgaW1hZ2UnLCB0aXRsZTogJ1JlbW92ZSBpbWFnZScgfSwKICAgICAgICBlbCgnc3BhbicsIHsgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBodG1sOiBpY29uKCd4bWFyaycpIHx8ICfDlycgfSkpOwogICAgICBzZWxmLm9uKHJtLCAnY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBzZWxmLnJlbW92ZVJlZihpZHgpOyB9KTsKICAgICAgdGh1bWIuYXBwZW5kQ2hpbGQocm0pOwogICAgICBncmlkLmFwcGVuZENoaWxkKHRodW1iKTsKICAgIH0pOwoKICAgIGlmICh0aGlzLnJlZnMubGVuZ3RoIDwgbWF4KSB7CiAgICAgIHZhciBhZGQgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3JlYXRlX190aHVtYiB2LWNyZWF0ZV9fdGh1bWItYWRkJywgdHlwZTogJ2J1dHRvbicsICdhcmlhLWxhYmVsJzogJ0FkZCBhbm90aGVyIGltYWdlJyB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3JlYXRlX19wbHVzJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBodG1sOiBpY29uKCdwbHVzJykgfHwgJysnIH0pLAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbGFiZWwnIH0sICcrJyArIChtYXggLSB0aGlzLnJlZnMubGVuZ3RoKSkpOwogICAgICBzZWxmLm9uKGFkZCwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBzZWxmLl9maWxlSW5wdXQuY2xpY2soKTsgfSk7CiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoYWRkKTsKICAgIH0KICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQoZ3JpZCk7CgogICAgaWYgKHRoaXMucmVmcy5sZW5ndGggPiBtYXgpIHsKICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtZXJyb3InIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7ICdhcmlhLWhpZGRlbic6ICd0cnVlJywgaHRtbDogaWNvbignZXhjbGFtYXRpb24nKSB8fCAnIScgfSksCiAgICAgICAgZWwoJ3NwYW4nLCBudWxsLCAnT25seSB0aGUgZmlyc3QgJyArIG1heCArICcgd2lsbCBiZSB1c2VkIGJ5ICcgKyAobW9kZWwubGFiZWwgfHwgJ3RoaXMgbW9kZWwnKSArICcuIFBpY2sgYSBoaWdoZXIgdGllciBmb3IgbW9yZS4nKSkpOwogICAgfQogICAgc2VjdGlvbi5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViJyB9LAogICAgICAnRWRpdGluZyBtb2RlIOKAlCBvdXRwdXQgc2l6ZSBmb2xsb3dzIHlvdXIgc291cmNlIGltYWdlLicpKTsKICB9OwoKICBmdW5jdGlvbiBkcm9wR2x5cGgoKSB7CiAgICByZXR1cm4gJzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjYiIGhlaWdodD0iMjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiAnICsKICAgICAgJ3N0cm9rZS13aWR0aD0iMS42IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGFyaWEtaGlkZGVuPSJ0cnVlIj4nICsKICAgICAgJzxyZWN0IHg9IjMiIHk9IjMiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjMiLz48Y2lyY2xlIGN4PSI4LjUiIGN5PSI5IiByPSIxLjgiLz4nICsKICAgICAgJzxwYXRoIGQ9Ik0yMSAxNmwtNS01LTcgNyIvPjwvc3ZnPic7CiAgfQoKICBDcmVhdG9yLnByb3RvdHlwZS5hZGRGaWxlcyA9IGZ1bmN0aW9uIChmaWxlTGlzdCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIGZpbGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZmlsZUxpc3QgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoZikgewogICAgICByZXR1cm4gZiAmJiBmLnR5cGUgJiYgZi50eXBlLmluZGV4T2YoJ2ltYWdlLycpID09PSAwOwogICAgfSk7CiAgICBpZiAoIWZpbGVzLmxlbmd0aCkgeyB0b2FzdCgnTm8gaW1hZ2UgZm91bmQgaW4gdGhhdCBkcm9wLicsICdlcnJvcicpOyByZXR1cm47IH0KICAgIHZhciBtb2RlbCA9IHRoaXMuY3VycmVudE1vZGVsKCk7CiAgICB2YXIgbWF4ID0gbWF4UmVmRm9yKG1vZGVsKTsKICAgIHZhciByb29tID0gbWF4IC0gdGhpcy5yZWZzLmxlbmd0aDsKICAgIGlmIChyb29tIDw9IDApIHsgdG9hc3QoJ1RoaXMgbW9kZWwgYWNjZXB0cyB1cCB0byAnICsgbWF4ICsgJyBpbWFnZScgKyAobWF4ID4gMSA/ICdzJyA6ICcnKSArICcuJywgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICBmaWxlcy5zbGljZSgwLCByb29tKS5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7CiAgICAgIHZhciB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGYpOwogICAgICBzZWxmLnJlZnMucHVzaCh7IGZpbGU6IGYsIHVybDogdXJsLCBuYW1lOiBmLm5hbWUgfHwgJ2ltYWdlJyB9KTsKICAgIH0pOwogICAgaWYgKGZpbGVzLmxlbmd0aCA+IHJvb20pIHRvYXN0KCdBZGRlZCAnICsgcm9vbSArICc7IHRoaXMgbW9kZWwgbWF4ZXMgYXQgJyArIG1heCArICcuJywgJ2luZm8nKTsKICAgIHRoaXMuYWZ0ZXJJbnB1dENoYW5nZSgpOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnJlbW92ZVJlZiA9IGZ1bmN0aW9uIChpZHgpIHsKICAgIHZhciByZWYgPSB0aGlzLnJlZnNbaWR4XTsKICAgIGlmIChyZWYgJiYgcmVmLnVybCAmJiByZWYudXJsLmluZGV4T2YoJ2Jsb2I6JykgPT09IDApIHsgdHJ5IHsgVVJMLnJldm9rZU9iamVjdFVSTChyZWYudXJsKTsgfSBjYXRjaCAoZSkge30gfQogICAgdGhpcy5yZWZzLnNwbGljZShpZHgsIDEpOwogICAgdGhpcy5hZnRlcklucHV0Q2hhbmdlKCk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuY2xlYXJSZWZzID0gZnVuY3Rpb24gKCkgewogICAgdGhpcy5yZWZzLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgaWYgKHIudXJsICYmIHIudXJsLmluZGV4T2YoJ2Jsb2I6JykgPT09IDApIHsgdHJ5IHsgVVJMLnJldm9rZU9iamVjdFVSTChyLnVybCk7IH0gY2F0Y2ggKGUpIHt9IH0gfSk7CiAgICB0aGlzLnJlZnMgPSBbXTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5hZnRlcklucHV0Q2hhbmdlID0gZnVuY3Rpb24gKCkgewogICAgdGhpcy5yZW5kZXJJbWFnZVpvbmUoKTsKICAgIHRoaXMucmVmcmVzaEFzcGVjdFZpc2liaWxpdHkoKTsKICAgIHRoaXMucmVmcmVzaENUQSgpOwogICAgaWYgKHRoaXMuX3Byb21wdEZpZWxkKSB0aGlzLl9wcm9tcHRGaWVsZC5wbGFjZWhvbGRlciA9IHRoaXMucGxhY2Vob2xkZXJGb3JNb2RlKCk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUucGxhY2Vob2xkZXJGb3JNb2RlID0gZnVuY3Rpb24gKCkgewogICAgaWYgKHRoaXMuaGFzSW5wdXQoKSkgcmV0dXJuICdEZXNjcmliZSB0aGUgY2hhbmdlIOKAlCBlLmcuICJzdGFnZSB3aXRoIHdhcm0gbW9kZXJuIGZ1cm5pdHVyZSLigKYgKG9wdGlvbmFsIHdpdGggYSBwcmVzZXQpJzsKICAgIHJldHVybiBwbGFjZWhvbGRlclRleHQoKTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5idWlsZFByb21wdCA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciBncm91cCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCB2LWNyZWF0ZV9fcHJvbXB0JyB9KTsKICAgIGdyb3VwLmFwcGVuZENoaWxkKGVsKCdsYWJlbCcsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnLCBmb3I6ICd2LXByb21wdCcgfSwgJ1Byb21wdCcpKTsKCiAgICB2YXIgd3JhcCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX3RhLXdyYXAnIH0pOwogICAgdmFyIHRhID0gZWwoJ3RleHRhcmVhJywgewogICAgICBpZDogJ3YtcHJvbXB0JywgY2xhc3M6ICd2LXRleHRhcmVhIHYtdGV4dGFyZWEtLWxnIHYtY3JlYXRlX190YScsIHJvd3M6ICczJywKICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXJGb3JNb2RlKCksCiAgICAgICdhcmlhLWRlc2NyaWJlZGJ5JzogJ3YtcHJvbXB0LWhlbHAnCiAgICB9KTsKICAgIHRhLnZhbHVlID0gdGhpcy5wcm9tcHQ7CiAgICB0aGlzLl9wcm9tcHRGaWVsZCA9IHRhOwoKICAgIHZhciBjbGVhckJ0biA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jcmVhdGVfX3RhLWNsZWFyJywgdHlwZTogJ2J1dHRvbicsICdhcmlhLWxhYmVsJzogJ0NsZWFyIHByb21wdCcsIHRpdGxlOiAnQ2xlYXIgcHJvbXB0JyB9LAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fdGEtY2xlYXItZ2x5cGgnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIGh0bWw6IGljb24oJ3htYXJrJykgfHwgJ8OXJyB9KSk7CiAgICBjbGVhckJ0bi5oaWRkZW4gPSAhdGhpcy5wcm9tcHQ7CgogICAgdmFyIGF1dG8gPSBmdW5jdGlvbiAoKSB7CiAgICAgIHRhLnN0eWxlLmhlaWdodCA9ICdhdXRvJzsKICAgICAgdGEuc3R5bGUuaGVpZ2h0ID0gTWF0aC5taW4odGEuc2Nyb2xsSGVpZ2h0LCAzMjApICsgJ3B4JzsKICAgIH07CiAgICB0aGlzLm9uKHRhLCAnaW5wdXQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHNlbGYucHJvbXB0ID0gdGEudmFsdWU7CiAgICAgIGF1dG8oKTsKICAgICAgc2VsZi5yZWZyZXNoQ1RBKCk7CiAgICAgIGNsZWFyQnRuLmhpZGRlbiA9ICF0YS52YWx1ZTsKICAgIH0pOwogICAgdGhpcy5vbih0YSwgJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpICYmIGUua2V5ID09PSAnRW50ZXInKSB7IGUucHJldmVudERlZmF1bHQoKTsgc2VsZi5nZW5lcmF0ZSgpOyB9CiAgICB9KTsKICAgIHRoaXMub24oY2xlYXJCdG4sICdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgdGEudmFsdWUgPSAnJzsgc2VsZi5wcm9tcHQgPSAnJzsgYXV0bygpOyBzZWxmLnJlZnJlc2hDVEEoKTsKICAgICAgY2xlYXJCdG4uaGlkZGVuID0gdHJ1ZTsgdGEuZm9jdXMoKTsKICAgIH0pOwoKICAgIHdyYXAuYXBwZW5kQ2hpbGQodGEpOwogICAgd3JhcC5hcHBlbmRDaGlsZChjbGVhckJ0bik7CiAgICBncm91cC5hcHBlbmRDaGlsZCh3cmFwKTsKCiAgICB2YXIgaGVscCA9IGVsKCdkaXYnLCB7IGlkOiAndi1wcm9tcHQtaGVscCcsIGNsYXNzOiAndi1jcmVhdGVfX2hlbHAgdi1zZWN0aW9uX19zdWInIH0pOwogICAgdGhpcy5fcHJvbXB0SGVscCA9IGhlbHA7CiAgICBncm91cC5hcHBlbmRDaGlsZChoZWxwKTsKCiAgICBzZXRUaW1lb3V0KGF1dG8sIDApOwogICAgdGhpcy5yZWZyZXNoUHJvbXB0SGVscCgpOwogICAgcmV0dXJuIGdyb3VwOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnJlZnJlc2hQcm9tcHRIZWxwID0gZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLl9wcm9tcHRIZWxwKSByZXR1cm47CiAgICB2YXIgbiA9ICh0aGlzLnByb21wdCB8fCAnJykudHJpbSgpLmxlbmd0aDsKICAgIHZhciBtc2csIGNscyA9ICd2LWNyZWF0ZV9faGVscCB2LXNlY3Rpb25fX3N1Yic7CiAgICBpZiAodGhpcy5oYXNJbnB1dCgpKSB7CiAgICAgIG1zZyA9IHRoaXMuYWN0aXZlUHJlc2V0ID8gKCdVc2luZyBwcmVzZXQg4oCcJyArIGVzYyh0aGlzLmFjdGl2ZVByZXNldC5uYW1lKSArICfigJ0gKyB5b3VyIHRleHQuJykKICAgICAgICA6ICdEZXNjcmliZSB0aGUgdHJhbnNmb3JtYXRpb24sIG9yIHBpY2sgYSBwcmVzZXQuJzsKICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVQcmVzZXQpIHsKICAgICAgbXNnID0gJ1ByZXNldCDigJwnICsgZXNjKHRoaXMuYWN0aXZlUHJlc2V0Lm5hbWUpICsgJ+KAnSBhY3RpdmUuIEFkZCB0ZXh0IHRvIHJlZmluZS4nOwogICAgfSBlbHNlIGlmIChuID09PSAwKSB7CiAgICAgIG1zZyA9ICdUZXh0LXRvLWltYWdlIG5lZWRzIGF0IGxlYXN0IDggY2hhcmFjdGVycy4nOwogICAgfSBlbHNlIGlmIChuIDwgOCkgewogICAgICBtc2cgPSAoOCAtIG4pICsgJyBtb3JlIGNoYXJhY3RlcicgKyAoKDggLSBuKSA9PT0gMSA/ICcnIDogJ3MnKSArICcgdG8gZ2VuZXJhdGUuJzsKICAgICAgY2xzICs9ICcgaXMtd2Fybic7CiAgICB9IGVsc2UgewogICAgICBtc2cgPSAnUmVhZHkuICcgKyBuICsgJyBjaGFyYWN0ZXJzLic7CiAgICAgIGNscyArPSAnIGlzLW9rJzsKICAgIH0KICAgIHRoaXMuX3Byb21wdEhlbHAuY2xhc3NOYW1lID0gY2xzOwogICAgdGhpcy5fcHJvbXB0SGVscC5pbm5lckhUTUwgPSBtc2c7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRQcmVzZXRzID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlY3Rpb24gPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZmllbGQtZ3JvdXAgdi1jcmVhdGVfX3ByZXNldHMnIH0pOwogICAgc2VjdGlvbi5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnIH0sICdTdHlsZSBwcmVzZXRzJykpOwoKICAgIHZhciBob3N0ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fcHJlc2V0aG9zdCcgfSk7CiAgICB0aGlzLl9wcmVzZXRIb3N0ID0gaG9zdDsKICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQoaG9zdCk7CgogICAgdGhpcy5pbml0UHJlc2V0Q2hpcHMoKTsKICAgIHJldHVybiBzZWN0aW9uOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmluaXRQcmVzZXRDaGlwcyA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciBob3N0ID0gdGhpcy5fcHJlc2V0SG9zdDsKICAgIGlmICghaG9zdCkgcmV0dXJuOwoKICAgIHZhciBvblNlbGVjdCA9IGZ1bmN0aW9uIChwcmVzZXQpIHsKICAgICAgaWYgKHNlbGYuYWN0aXZlUHJlc2V0ICYmIHByZXNldCAmJiBzZWxmLmFjdGl2ZVByZXNldC5pZCA9PT0gcHJlc2V0LmlkKSB7CiAgICAgICAgc2VsZi5hY3RpdmVQcmVzZXQgPSBudWxsOwogICAgICAgIGlmIChzZWxmLl9wcmVzZXRDdGwgJiYgc2VsZi5fcHJlc2V0Q3RsLnNldEFjdGl2ZSkgc2VsZi5fcHJlc2V0Q3RsLnNldEFjdGl2ZShudWxsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZWxmLmFjdGl2ZVByZXNldCA9IHByZXNldCB8fCBudWxsOwogICAgICB9CiAgICAgIHNlbGYucmVmcmVzaENUQSgpOwogICAgICBzZWxmLnJlZnJlc2hQcm9tcHRIZWxwKCk7CiAgICB9OwoKICAgIHZhciByZW5kZXJlZCA9IGZhbHNlOwogICAgaWYgKFYucHJlc2V0cyAmJiB0eXBlb2YgVi5wcmVzZXRzLnJlbmRlckNoaXBzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdGhpcy5fcHJlc2V0Q3RsID0gVi5wcmVzZXRzLnJlbmRlckNoaXBzKGhvc3QsIHsKICAgICAgICAgIHNlbGVjdGVkSWQ6IHNlbGYuYWN0aXZlUHJlc2V0ID8gc2VsZi5hY3RpdmVQcmVzZXQuaWQgOiBudWxsLAogICAgICAgICAgc2VsZWN0ZWRLZXk6IHNlbGYuYWN0aXZlUHJlc2V0ID8gKHNlbGYuYWN0aXZlUHJlc2V0LmtleSB8fCBzZWxmLmFjdGl2ZVByZXNldC5pZCkgOiBudWxsLAogICAgICAgICAgb25TZWxlY3Q6IG9uU2VsZWN0CiAgICAgICAgfSkgfHwgbnVsbDsKICAgICAgICByZW5kZXJlZCA9IGhvc3QuY2hpbGROb2Rlcy5sZW5ndGggPiAwOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmVuZGVyZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKCFyZW5kZXJlZCkgdGhpcy5yZW5kZXJGYWxsYmFja0NoaXBzKGhvc3QsIG9uU2VsZWN0KTsKICB9OwoKICB2YXIgRkFMTEJBQ0tfUFJFU0VUUyA9IFsKICAgIHsgaWQ6ICdyZW1vdmVBbGxGdXJuaXR1cmUnLCBuYW1lOiAnRW1wdHkgUm9vbScsIHByb21wdDogJ1JlbW92ZSBhbGwgZnVybml0dXJlLCBwZXJzb25hbCBpdGVtcywgY2x1dHRlciwgYW5kIGJlbG9uZ2luZ3MgZnJvbSB0aGUgcm9vbSB3aGlsZSBrZWVwaW5nIHRoZSBhcmNoaXRlY3R1cmFsIGZlYXR1cmVzLCB3YWxscywgd2luZG93cywgYW5kIGZsb29yaW5nIGV4YWN0bHkgdGhlIHNhbWUuIENyZWF0ZSBhIGNvbXBsZXRlbHkgZW1wdHksIGNsZWFuIHNwYWNlIHJlYWR5IGZvciBwcm9mZXNzaW9uYWwgc3RhZ2luZy4nIH0sCiAgICB7IGlkOiAncmVtb3ZlQ2x1dHRlcicsIG5hbWU6ICdEZWNsdXR0ZXInLCBwcm9tcHQ6ICdSZW1vdmUgY2x1dHRlciwgcGVyc29uYWwgaXRlbXMsIGFuZCBzbWFsbCBiZWxvbmdpbmdzIHdoaWxlIGtlZXBpbmcgdGhlIGV4aXN0aW5nIGZ1cm5pdHVyZSBhbmQgbGF5b3V0IGludGFjdC4gTWFrZSB0aGUgc3BhY2UgbG9vayB0aWR5IGFuZCBjbGVhbi4nIH0sCiAgICB7IGlkOiAnbW9kZXJuU3RhZ2luZycsIG5hbWU6ICdNb2Rlcm4gU3RhZ2luZycsIHByb21wdDogJ1N0YWdlIHRoaXMgcm9vbSB3aXRoIGNsZWFuIG1vZGVybiBmdXJuaXR1cmUsIG5ldXRyYWwgdG9uZXMsIGFuZCB0YXN0ZWZ1bCBkZWNvciBmb3IgYSBwcm9mZXNzaW9uYWwgcmVhbC1lc3RhdGUgbGlzdGluZy4nIH0sCiAgICB7IGlkOiAnaW1wcm92ZUxpZ2h0aW5nJywgbmFtZTogJ0JldHRlciBMaWdodCcsIHByb21wdDogJ0ltcHJvdmUgdGhlIGxpZ2h0aW5nIHRvIGJyaWdodCwgd2FybSwgbmF0dXJhbCBkYXlsaWdodCB3aGlsZSBrZWVwaW5nIGV2ZXJ5dGhpbmcgZWxzZSB0aGUgc2FtZS4nIH0sCiAgICB7IGlkOiAnYWRkTGFuZHNjYXBpbmcnLCBuYW1lOiAnQWRkIExhbmRzY2FwaW5nJywgcHJvbXB0OiAnQWRkIGx1c2gsIHdlbGwtbWFpbnRhaW5lZCBsYW5kc2NhcGluZyB3aXRoIGhlYWx0aHkgcGxhbnRzLCBmcmVzaCBtdWxjaCwgYW5kIGNsZWFuIGVkZ2VzIHRvIHRoZSBleHRlcmlvci4nIH0sCiAgICB7IGlkOiAnaW1wcm92ZUV4dGVyaW9yJywgbmFtZTogJ0ZpeCBFeHRlcmlvcicsIHByb21wdDogJ1JlcGFpciBhbmQgcmVmcmVzaCB0aGUgZXh0ZXJpb3Ig4oCUIGNsZWFuIHNpZGluZywgY3Jpc3AgdHJpbSwgYW5kIGEgdGlkeSwgd2VsbC1rZXB0IGZhY2FkZS4nIH0KICBdOwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZW5kZXJGYWxsYmFja0NoaXBzID0gZnVuY3Rpb24gKGhvc3QsIG9uU2VsZWN0KSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBob3N0LmlubmVySFRNTCA9ICcnOwogICAgdmFyIHNjcm9sbGVyID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNoaXAtcm93Jywgcm9sZTogJ2xpc3Rib3gnLCAnYXJpYS1sYWJlbCc6ICdTdHlsZSBwcmVzZXRzJyB9KTsKICAgIGhvc3QuYXBwZW5kQ2hpbGQoc2Nyb2xsZXIpOwogICAgRkFMTEJBQ0tfUFJFU0VUUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7CiAgICAgIHZhciBhY3RpdmUgPSBzZWxmLmFjdGl2ZVByZXNldCAmJiBzZWxmLmFjdGl2ZVByZXNldC5pZCA9PT0gcC5pZDsKICAgICAgdmFyIGNoaXAgPSBlbCgnYnV0dG9uJywgewogICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgIGNsYXNzOiAndi1jaGlwJyArIChhY3RpdmUgPyAnIHYtY2hpcC0tYWN0aXZlJyA6ICcnKSwKICAgICAgICByb2xlOiAnb3B0aW9uJywgJ2FyaWEtc2VsZWN0ZWQnOiBhY3RpdmUgPyAndHJ1ZScgOiAnZmFsc2UnCiAgICAgIH0sIHAubmFtZSk7CiAgICAgIHNlbGYub24oY2hpcCwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgIG9uU2VsZWN0KHApOwogICAgICAgIHZhciBub2RlcyA9IHNjcm9sbGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy52LWNoaXAnKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBub2Rlc1tpXS5jbGFzc0xpc3QucmVtb3ZlKCd2LWNoaXAtLWFjdGl2ZScpOwogICAgICAgICAgbm9kZXNbaV0uc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgJ2ZhbHNlJyk7CiAgICAgICAgfQogICAgICAgIGlmIChzZWxmLmFjdGl2ZVByZXNldCAmJiBzZWxmLmFjdGl2ZVByZXNldC5pZCA9PT0gcC5pZCkgewogICAgICAgICAgY2hpcC5jbGFzc0xpc3QuYWRkKCd2LWNoaXAtLWFjdGl2ZScpOwogICAgICAgICAgY2hpcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCAndHJ1ZScpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHNjcm9sbGVyLmFwcGVuZENoaWxkKGNoaXApOwogICAgfSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRTZWxlY3RvcnMgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgcm93ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fc2VsZWN0b3JzJyB9KTsKCiAgICB2YXIgbW9kZWxGaWVsZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCcgfSwKICAgICAgZWwoJ2xhYmVsJywgeyBjbGFzczogJ3YtZXllYnJvdycsIGZvcjogJ3YtbW9kZWwnIH0sICdNb2RlbCcpKTsKICAgIHZhciBtb2RlbFNlbCA9IGVsKCdzZWxlY3QnLCB7IGlkOiAndi1tb2RlbCcsIGNsYXNzOiAndi1zZWxlY3QnLCAnYXJpYS1sYWJlbCc6ICdNb2RlbCcgfSk7CiAgICBtb2RlbHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgIHZhciBiaXRzID0gW20ubGFiZWwgfHwgbS5yYXddOwogICAgICBpZiAobS5zdWJoZWFkaW5nKSBiaXRzLnB1c2gobS5zdWJoZWFkaW5nKTsKICAgICAgaWYgKHR5cGVvZiBtLmNvc3QgPT09ICdudW1iZXInKSBiaXRzLnB1c2gobS5jb3N0ICsgJyBjcicpOwogICAgICB2YXIgb3B0ID0gZWwoJ29wdGlvbicsIHsgdmFsdWU6IG0ucmF3IH0sIGJpdHMuam9pbignICDCtyAgJykpOwogICAgICBpZiAobS5yYXcgPT09IHNlbGYubW9kZWxSYXcpIG9wdC5zZWxlY3RlZCA9IHRydWU7CiAgICAgIG1vZGVsU2VsLmFwcGVuZENoaWxkKG9wdCk7CiAgICB9KTsKICAgIHRoaXMub24obW9kZWxTZWwsICdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHNlbGYubW9kZWxSYXcgPSBtb2RlbFNlbC52YWx1ZTsKICAgICAgd3JpdGVQZXJzaXN0ZWQoJ21vZGVsJywgc2VsZi5tb2RlbFJhdyk7CiAgICAgIHZhciBtYXggPSBtYXhSZWZGb3Ioc2VsZi5jdXJyZW50TW9kZWwoKSk7CiAgICAgIGlmIChzZWxmLnJlZnMubGVuZ3RoID4gbWF4KSB7CiAgICAgICAgd2hpbGUgKHNlbGYucmVmcy5sZW5ndGggPiBtYXgpIHsKICAgICAgICAgIHZhciByID0gc2VsZi5yZWZzLnBvcCgpOwogICAgICAgICAgaWYgKHIgJiYgci51cmwgJiYgci51cmwuaW5kZXhPZignYmxvYjonKSA9PT0gMCkgeyB0cnkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHIudXJsKTsgfSBjYXRjaCAoZSkge30gfQogICAgICAgIH0KICAgICAgICB0b2FzdCgnVHJpbW1lZCB0byAnICsgbWF4ICsgJyBpbWFnZScgKyAobWF4ID4gMSA/ICdzJyA6ICcnKSArICcgZm9yICcgKyAoc2VsZi5jdXJyZW50TW9kZWwoKS5sYWJlbCB8fCAnbW9kZWwnKSArICcuJywgJ2luZm8nKTsKICAgICAgfQogICAgICBzZWxmLnJlbmRlckltYWdlWm9uZSgpOwogICAgICBzZWxmLnJlZnJlc2hDVEEoKTsKICAgIH0pOwogICAgbW9kZWxGaWVsZC5hcHBlbmRDaGlsZChtb2RlbFNlbCk7CiAgICB2YXIgbW9kZWxIaW50ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YiB2LWNyZWF0ZV9fc2Vsbm90ZScgfSk7CiAgICB0aGlzLl9tb2RlbEhpbnQgPSBtb2RlbEhpbnQ7CiAgICBtb2RlbEZpZWxkLmFwcGVuZENoaWxkKG1vZGVsSGludCk7CiAgICByb3cuYXBwZW5kQ2hpbGQobW9kZWxGaWVsZCk7CgogICAgdmFyIGFzcGVjdEZpZWxkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWZpZWxkLWdyb3VwIHYtY3JlYXRlX19hc3BlY3QnIH0sCiAgICAgIGVsKCdsYWJlbCcsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnLCBmb3I6ICd2LWFzcGVjdCcgfSwgJ0FzcGVjdCByYXRpbycpKTsKICAgIHZhciBhc3BlY3RTZWwgPSBlbCgnc2VsZWN0JywgeyBpZDogJ3YtYXNwZWN0JywgY2xhc3M6ICd2LXNlbGVjdCcsICdhcmlhLWxhYmVsJzogJ0FzcGVjdCByYXRpbycgfSk7CiAgICBhc3BlY3RzKCkuZm9yRWFjaChmdW5jdGlvbiAoYSkgewogICAgICB2YXIgb3B0ID0gZWwoJ29wdGlvbicsIHsgdmFsdWU6IGEucmF3IH0sIChhLmxhYmVsIHx8IGEucmF3KSArICcgIMK3ICAnICsgYS53ICsgJ8OXJyArIGEuaCk7CiAgICAgIGlmIChhLnJhdyA9PT0gc2VsZi5hc3BlY3RSYXcpIG9wdC5zZWxlY3RlZCA9IHRydWU7CiAgICAgIGFzcGVjdFNlbC5hcHBlbmRDaGlsZChvcHQpOwogICAgfSk7CiAgICB0aGlzLm9uKGFzcGVjdFNlbCwgJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgc2VsZi5hc3BlY3RSYXcgPSBhc3BlY3RTZWwudmFsdWU7CiAgICAgIHdyaXRlUGVyc2lzdGVkKCdhc3BlY3QnLCBzZWxmLmFzcGVjdFJhdyk7CiAgICB9KTsKICAgIGFzcGVjdEZpZWxkLmFwcGVuZENoaWxkKGFzcGVjdFNlbCk7CiAgICB2YXIgYXNwZWN0Tm90ZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zZWN0aW9uX19zdWIgdi1jcmVhdGVfX3NlbG5vdGUnIH0sICdPdXRwdXQgZGltZW5zaW9ucyBmb3IgdGV4dC10by1pbWFnZS4nKTsKICAgIGFzcGVjdEZpZWxkLmFwcGVuZENoaWxkKGFzcGVjdE5vdGUpOwogICAgdGhpcy5fYXNwZWN0RmllbGQgPSBhc3BlY3RGaWVsZDsKICAgIHRoaXMuX2FzcGVjdFNlbCA9IGFzcGVjdFNlbDsKICAgIHRoaXMuX2FzcGVjdE5vdGUgPSBhc3BlY3ROb3RlOwogICAgcm93LmFwcGVuZENoaWxkKGFzcGVjdEZpZWxkKTsKCiAgICB0aGlzLnJlZnJlc2hNb2RlbEhpbnQoKTsKICAgIHJldHVybiByb3c7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUucmVmcmVzaE1vZGVsSGludCA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdGhpcy5fbW9kZWxIaW50KSByZXR1cm47CiAgICB2YXIgYyA9IHRoaXMudW5pdENvc3QoKTsKICAgIHZhciBjcmVkcyA9IGMgKyAnIGNyZWRpdCcgKyAoYyA9PT0gMSA/ICcnIDogJ3MnKSArICcgcGVyIGdlbmVyYXRpb24nOwogICAgaWYgKHRoaXMuaXNUMkkoKSkgewogICAgICB0aGlzLl9tb2RlbEhpbnQudGV4dENvbnRlbnQgPSAnR2VuZXJhdGVzIGZyb20gdGV4dCDCtyAnICsgY3JlZHM7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBtID0gdGhpcy5jdXJyZW50TW9kZWwoKTsKICAgIHZhciBtYXggPSBtYXhSZWZGb3IobSk7CiAgICB0aGlzLl9tb2RlbEhpbnQudGV4dENvbnRlbnQgPSAobWF4ID4gMSkKICAgICAgPyAoJ1VwIHRvICcgKyBtYXggKyAnIHJlZmVyZW5jZSBpbWFnZXMgwrcgJyArIGNyZWRzKQogICAgICA6IGNyZWRzOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnJlZnJlc2hBc3BlY3RWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLl9hc3BlY3RGaWVsZCkgcmV0dXJuOwogICAgdmFyIGVkaXRpbmcgPSB0aGlzLmhhc0lucHV0KCk7CiAgICB0aGlzLl9hc3BlY3RGaWVsZC5jbGFzc0xpc3QudG9nZ2xlKCdpcy1kaXNhYmxlZCcsIGVkaXRpbmcpOwogICAgaWYgKHRoaXMuX2FzcGVjdFNlbCkgdGhpcy5fYXNwZWN0U2VsLmRpc2FibGVkID0gZWRpdGluZzsKICAgIGlmICh0aGlzLl9hc3BlY3ROb3RlKSB7CiAgICAgIHRoaXMuX2FzcGVjdE5vdGUudGV4dENvbnRlbnQgPSBlZGl0aW5nCiAgICAgICAgPyAnTG9ja2VkIOKAlCBlZGl0cyBrZWVwIHRoZSBzb3VyY2UgaW1hZ2UgcHJvcG9ydGlvbnMuJwogICAgICAgIDogJ091dHB1dCBkaW1lbnNpb25zIGZvciB0ZXh0LXRvLWltYWdlLic7CiAgICB9CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRBY3Rpb25zID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIGJhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX2FjdGlvbnMnIH0pOwoKICAgIHZhciBjdGEgPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWNyZWF0ZV9fZ28nIH0pOwogICAgdGhpcy5fY3RhID0gY3RhOwogICAgdGhpcy5vbihjdGEsICdjbGljaycsIGZ1bmN0aW9uICgpIHsgc2VsZi5nZW5lcmF0ZSgpOyB9KTsKICAgIGJhci5hcHBlbmRDaGlsZChjdGEpOwoKICAgIHZhciB2YXJCdG4gPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jcmVhdGVfX3ZhcicsCiAgICAgICdhcmlhLXByZXNzZWQnOiAnZmFsc2UnLCB0aXRsZTogJ0dlbmVyYXRlIGZvdXIgYXQgb25jZScgfSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jdGFfX2ljb24nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIGh0bWw6IGljb24oJ3NwYXJrbGVzJykgfHwgJ+KcpicgfSksCiAgICAgIGVsKCdzcGFuJywgbnVsbCwgJ8OXNCcpKTsKICAgIHRoaXMub24odmFyQnRuLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgIHNlbGYudmFyaWF0aW9ucyA9ICFzZWxmLnZhcmlhdGlvbnM7CiAgICAgIHZhckJ0bi5jbGFzc0xpc3QudG9nZ2xlKCd2LWN0YS0tYnJhbmQnLCBzZWxmLnZhcmlhdGlvbnMpOwogICAgICB2YXJCdG4uY2xhc3NMaXN0LnRvZ2dsZSgndi1jdGEtLWdob3N0JywgIXNlbGYudmFyaWF0aW9ucyk7CiAgICAgIHZhckJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIHNlbGYudmFyaWF0aW9ucyA/ICd0cnVlJyA6ICdmYWxzZScpOwogICAgICBzZWxmLnJlZnJlc2hDVEEoKTsKICAgIH0pOwogICAgdGhpcy5fdmFyQnRuID0gdmFyQnRuOwogICAgYmFyLmFwcGVuZENoaWxkKHZhckJ0bik7CgogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3JlYXRlX19hY3Rpb253cmFwJyB9LCBiYXIsCiAgICAgIGVsKCdwJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViIHYtY3JlYXRlX19sZWdhbCcgfSwKICAgICAgICAnQ3JlZGl0cyBhcmUgc3BlbnQgcGVyIGdlbmVyYXRpb24uICcsCiAgICAgICAgZWwoJ2EnLCB7IGhyZWY6ICcjL2FjY291bnQnLCBjbGFzczogJ3YtbGluaycgfSwgJ01hbmFnZSBjcmVkaXRzJykpKTsKCiAgICByZXR1cm4gd3JhcDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZWZyZXNoQ1RBID0gZnVuY3Rpb24gKCkgewogICAgaWYgKHRoaXMuX2N0YSkgewogICAgICB2YXIgb2sgPSB0aGlzLmNhblN1Ym1pdCgpOwogICAgICB0aGlzLl9jdGEuZGlzYWJsZWQgPSAhb2s7CiAgICAgIHRoaXMuX2N0YS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnLCBvayA/ICdmYWxzZScgOiAndHJ1ZScpOwogICAgICB0aGlzLl9jdGEuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtYnVzeScsICEhdGhpcy5idXN5KTsKICAgICAgdmFyIGNvc3QgPSB0aGlzLnRvdGFsQ29zdCgpOwogICAgICB2YXIgY291bnQgPSB0aGlzLnZhcmlhdGlvbnMgPyA0IDogMTsKICAgICAgdmFyIGxhYmVsID0gdGhpcy5oYXNJbnB1dCgpID8gJ1RyYW5zZm9ybScgOiAnR2VuZXJhdGUnOwogICAgICB0aGlzLl9jdGEuaW5uZXJIVE1MID0gJyc7CiAgICAgIGlmICh0aGlzLmJ1c3kpIHsKICAgICAgICB0aGlzLl9jdGEuc2V0QXR0cmlidXRlKCdhcmlhLWJ1c3knLCAndHJ1ZScpOwogICAgICAgIHRoaXMuX2N0YS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fZ28tc3BpbicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KSk7CiAgICAgICAgdGhpcy5fY3RhLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3JlYXRlX19nby1sYWJlbCcgfSwgJ1dvcmtpbmfigKYnKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5fY3RhLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1idXN5Jyk7CiAgICAgICAgdGhpcy5fY3RhLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3RhX19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBodG1sOiBpY29uKCdib2x0JykgfHwgJ+KaoScgfSkpOwogICAgICAgIHRoaXMuX2N0YS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fZ28tbGFiZWwnIH0sCiAgICAgICAgICBsYWJlbCArIChjb3VudCA+IDEgPyAoJyDDlycgKyBjb3VudCkgOiAnJykpKTsKICAgICAgICB0aGlzLl9jdGEuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVhdGVfX2dvLWNvc3QnIH0sIGNvc3QgKyAnIGNyJykpOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5fdmFyQnRuKSB0aGlzLl92YXJCdG4uZGlzYWJsZWQgPSAhIXRoaXMuYnVzeTsKICAgIHRoaXMucmVmcmVzaE1vZGVsSGludCgpOwogICAgdGhpcy5yZWZyZXNoUHJvbXB0SGVscCgpOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmJ1aWxkU2lkZSA9IGZ1bmN0aW9uIChsaWJyYXJ5RW1wdHkpIHsKICAgIHZhciBjb2wgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CgogICAgaWYgKGxpYnJhcnlFbXB0eSkgewogICAgICBjb2wuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX2hlYWQnIH0sCiAgICAgICAgZWwoJ2RpdicsIG51bGwsCiAgICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnIH0sICdJbnNwaXJhdGlvbicpLAogICAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1zZWN0aW9uX19zdWInIH0sICdUYXAgYW55IGxvb2sgdG8gbG9hZCBpdHMgcHJvbXB0LicpKSkpOwoKICAgICAgdmFyIGZlZWRIb3N0ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fZmVlZCcgfSk7CiAgICAgIHRoaXMuX2ZlZWRIb3N0ID0gZmVlZEhvc3Q7CiAgICAgIGNvbC5hcHBlbmRDaGlsZChmZWVkSG9zdCk7CiAgICAgIHRoaXMucmVuZGVySW5saW5lRmVlZChmZWVkSG9zdCk7CiAgICB9IGVsc2UgewogICAgICBjb2wuYXBwZW5kQ2hpbGQodGhpcy5idWlsZFJlY2VudFN0cmlwKCkpOwogICAgfQogICAgcmV0dXJuIGNvbDsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5yZW5kZXJJbmxpbmVGZWVkID0gZnVuY3Rpb24gKGhvc3QpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHZhciByZW5kZXJlZCA9IGZhbHNlOwogICAgaWYgKFYudmlld3MuZmVlZCAmJiB0eXBlb2YgVi52aWV3cy5mZWVkLnJlbmRlcklubGluZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgewogICAgICAgIHZhciBvdXQgPSBWLnZpZXdzLmZlZWQucmVuZGVySW5saW5lKGhvc3QsIHsKICAgICAgICAgIG9uQXBwbHk6IGZ1bmN0aW9uIChleGFtcGxlKSB7IHNlbGYuYXBwbHlFeGFtcGxlKGV4YW1wbGUpOyB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKG91dCBpbnN0YW5jZW9mIE5vZGUgJiYgb3V0ICE9PSBob3N0KSBob3N0LmFwcGVuZENoaWxkKG91dCk7CiAgICAgICAgcmVuZGVyZWQgPSBob3N0LmNoaWxkTm9kZXMubGVuZ3RoID4gMCB8fCBvdXQgIT0gbnVsbDsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJlbmRlcmVkID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmICghcmVuZGVyZWQpIHRoaXMucmVuZGVyRmVlZEZhbGxiYWNrKGhvc3QpOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnJlbmRlckZlZWRGYWxsYmFjayA9IGZ1bmN0aW9uIChob3N0KSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBob3N0LmlubmVySFRNTCA9ICcnOwogICAgdmFyIHNrID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWdyaWQgdi1ncmlkLS1hdXRvJyB9KTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgIGlmICh1aSgpLnNrZWxldG9uKSB7IHRyeSB7IHNrLmFwcGVuZENoaWxkKHVpKCkuc2tlbGV0b24oJ2NhcmQnKSk7IGNvbnRpbnVlOyB9IGNhdGNoIChlKSB7fSB9CiAgICAgIHNrLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbicsIHN0eWxlOiAnYXNwZWN0LXJhdGlvOjEvMScgfSkpOwogICAgfQogICAgaG9zdC5hcHBlbmRDaGlsZChzayk7CgogICAgaWYgKCFhcGkoKS5jdXJhdGVkRmVlZCkgewogICAgICBob3N0LmlubmVySFRNTCA9ICcnOwogICAgICBob3N0LmFwcGVuZENoaWxkKGVtcHR5QmxvY2soJ1lvdXIgY3JlYXRpb25zIHdpbGwgYXBwZWFyIGhlcmUuJywgJ1N0YXJ0IGJ5IHdyaXRpbmcgYSBwcm9tcHQgb3IgZHJvcHBpbmcgYW4gaW1hZ2UuJywgJ2ltYWdlJykpOwogICAgICByZXR1cm47CiAgICB9CiAgICBhcGkoKS5jdXJhdGVkRmVlZCgwLCAxMikudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgIGlmIChzZWxmLl9kZXN0cm95ZWQpIHJldHVybjsKICAgICAgdmFyIGl0ZW1zID0gKHJlcyAmJiAocmVzLml0ZW1zIHx8IHJlcykpIHx8IFtdOwogICAgICBob3N0LmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgewogICAgICAgIGhvc3QuYXBwZW5kQ2hpbGQoZW1wdHlCbG9jaygnTm8gaW5zcGlyYXRpb24geWV0LicsICdCZSB0aGUgZmlyc3QgdG8gY3JlYXRlIHNvbWV0aGluZy4nLCAnc3BhcmtsZXMnKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBncmlkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWdyaWQgdi1ncmlkLS1hdXRvIHYtY3JlYXRlX19mZWVkZ3JpZCcgfSk7CiAgICAgIHZhciBzaG93biA9IDA7CiAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKHJhdykgewogICAgICAgIHZhciBpbWFnZSA9IG5vcm1hbGl6ZUZlZWRJbWFnZShyYXcpOwogICAgICAgIGlmICghaW1hZ2VVUkxPZihpbWFnZSkpIHJldHVybjsKICAgICAgICB2YXIgY2FyZCA9IHNlbGYuZmVlZENhcmQoaW1hZ2UpOwogICAgICAgIGlmIChjYXJkKSB7IGdyaWQuYXBwZW5kQ2hpbGQoY2FyZCk7IHNob3duKys7IH0KICAgICAgfSk7CiAgICAgIGlmICghc2hvd24pIHsKICAgICAgICBob3N0LmFwcGVuZENoaWxkKGVtcHR5QmxvY2soJ05vIGluc3BpcmF0aW9uIHlldC4nLCAnQmUgdGhlIGZpcnN0IHRvIGNyZWF0ZSBzb21ldGhpbmcuJywgJ3NwYXJrbGVzJykpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBob3N0LmFwcGVuZENoaWxkKGdyaWQpOwogICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICBpZiAoc2VsZi5fZGVzdHJveWVkKSByZXR1cm47CiAgICAgIGhvc3QuaW5uZXJIVE1MID0gJyc7CiAgICAgIGhvc3QuYXBwZW5kQ2hpbGQoZW1wdHlCbG9jaygnQ291bGRu4oCZdCBsb2FkIGluc3BpcmF0aW9uLicsICdDaGVjayB5b3VyIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4nLCAnd2FybmluZycpKTsKICAgIH0pOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmZlZWRDYXJkID0gZnVuY3Rpb24gKGltYWdlKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBpZiAoIWltYWdlVVJMT2YoaW1hZ2UpKSByZXR1cm4gbnVsbDsKICAgIHZhciBub2RlOwogICAgaWYgKHVpKCkuaW1nQ2FyZCkgewogICAgICB0cnkgewogICAgICAgIG5vZGUgPSB1aSgpLmltZ0NhcmQoaW1hZ2UsIHsgb25UYXA6IGZ1bmN0aW9uICgpIHsgc2VsZi5hcHBseUV4YW1wbGUoaW1hZ2UpOyB9LCBiZWZvcmVBZnRlcjogdHJ1ZSB9KTsKICAgICAgfSBjYXRjaCAoZSkgeyBub2RlID0gbnVsbDsgfQogICAgfQogICAgaWYgKCFub2RlKSB7CiAgICAgIHZhciB1cmwgPSBpbWFnZS5yZW1vdGVJbWFnZVVSTDsKICAgICAgaWYgKCF1cmwpIHJldHVybiBudWxsOwogICAgICBub2RlID0gZWwoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzOiAndi1jYXJkIHYtY2FyZC0tcGFkLTAgdi1jYXJkLS10YXBwYWJsZScgfSwKICAgICAgICBlbCgnaW1nJywgeyBjbGFzczogJ3YtY2FyZF9fbWVkaWEnLCBzcmM6IHVybCwgYWx0OiBpbWFnZS5wcm9tcHQgPyBlc2MoaW1hZ2UucHJvbXB0KS5zbGljZSgwLCA4MCkgOiAnaW5zcGlyYXRpb24nLCBsb2FkaW5nOiAnbGF6eScgfSkpOwogICAgICB0aGlzLm9uKG5vZGUsICdjbGljaycsIGZ1bmN0aW9uICgpIHsgc2VsZi5hcHBseUV4YW1wbGUoaW1hZ2UpOyB9KTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmJ1aWxkUmVjZW50U3RyaXAgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB2YXIgY29sID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogICAgY29sLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zZWN0aW9uX19oZWFkJyB9LAogICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnIH0sICdSZWNlbnQnKSwKICAgICAgZWwoJ2EnLCB7IGhyZWY6ICcjL2xpYnJhcnknLCBjbGFzczogJ3YtbGluaycgfSwgJ1NlZSBhbGwnKSkpOwoKICAgIHZhciBncmlkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWdyaWQgdi1ncmlkLS1hdXRvIHYtY3JlYXRlX19yZWNlbnQnIH0pOwogICAgdmFyIGxpYiA9IChzdGF0ZSgpLmxpYnJhcnkgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoaW1nKSB7CiAgICAgIHJldHVybiAhIWltYWdlVVJMT2YoaW1nKTsKICAgIH0pLnNsaWNlKDAsIDYpOwogICAgaWYgKCFsaWIubGVuZ3RoKSB7CiAgICAgIGNvbC5hcHBlbmRDaGlsZChlbXB0eUJsb2NrKCdZb3VyIGNyZWF0aW9ucyB3aWxsIGFwcGVhciBoZXJlLicsICdHZW5lcmF0ZSBzb21ldGhpbmcgdG8gZmlsbCB5b3VyIGxpYnJhcnkuJywgJ2ltYWdlJykpOwogICAgICByZXR1cm4gY29sOwogICAgfQogICAgbGliLmZvckVhY2goZnVuY3Rpb24gKGltZykgewogICAgICB2YXIgdXJsID0gaW1hZ2VVUkxPZihpbWcpOwogICAgICB2YXIgbm9kZTsKICAgICAgaWYgKHVpKCkuaW1nQ2FyZCkgewogICAgICAgIHRyeSB7IG5vZGUgPSB1aSgpLmltZ0NhcmQoaW1nLCB7IG9uVGFwOiBmdW5jdGlvbiAoKSB7IGdvKCcjL2ltYWdlLycgKyAoaW1nLnJlbW90ZUlEIHx8IGltZy5pZCkpOyB9LCBiZWZvcmVBZnRlcjogdHJ1ZSB9KTsgfQogICAgICAgIGNhdGNoIChlKSB7IG5vZGUgPSBudWxsOyB9CiAgICAgIH0KICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgbm9kZSA9IGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtY2FyZCB2LWNhcmQtLXBhZC0wIHYtY2FyZC0tdGFwcGFibGUnIH0sCiAgICAgICAgICBlbCgnaW1nJywgeyBjbGFzczogJ3YtY2FyZF9fbWVkaWEnLCBzcmM6IHVybCwgYWx0OiBpbWcucHJvbXB0ID8gZXNjKGltZy5wcm9tcHQpLnNsaWNlKDAsIDYwKSA6ICdjcmVhdGlvbicsIGxvYWRpbmc6ICdsYXp5JyB9KSk7CiAgICAgICAgc2VsZi5vbihub2RlLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7IGdvKCcjL2ltYWdlLycgKyAoaW1nLnJlbW90ZUlEIHx8IGltZy5pZCkpOyB9KTsKICAgICAgfQogICAgICBncmlkLmFwcGVuZENoaWxkKG5vZGUpOwogICAgfSk7CiAgICBjb2wuYXBwZW5kQ2hpbGQoZ3JpZCk7CiAgICByZXR1cm4gY29sOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmFwcGx5RXhhbXBsZSA9IGZ1bmN0aW9uIChleGFtcGxlKSB7CiAgICBpZiAoIWV4YW1wbGUpIHJldHVybjsKICAgIHZhciBleCA9IG5vcm1hbGl6ZUZlZWRJbWFnZShleGFtcGxlKTsKICAgIHZhciByZWZVUkwgPSBleGFtcGxlLnJlZmVyZW5jZVVSTCB8fCBudWxsOwogICAgdGhpcy5hY3RpdmVQcmVzZXQgPSBudWxsOwogICAgaWYgKHRoaXMuX3ByZXNldEN0bCAmJiB0aGlzLl9wcmVzZXRDdGwuc2V0QWN0aXZlKSB7IHRyeSB7IHRoaXMuX3ByZXNldEN0bC5zZXRBY3RpdmUobnVsbCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIHRoaXMucHJvbXB0ID0gZXgucHJvbXB0IHx8ICcnOwogICAgaWYgKHRoaXMuX3Byb21wdEZpZWxkKSB7IHRoaXMuX3Byb21wdEZpZWxkLnZhbHVlID0gdGhpcy5wcm9tcHQ7IH0KICAgIGlmIChleC5tb2RlbCAmJiBtb2RlbEJ5UmF3KGV4Lm1vZGVsKS5yYXcgPT09IGV4Lm1vZGVsKSB7CiAgICAgIHRoaXMubW9kZWxSYXcgPSBleC5tb2RlbDsKICAgICAgdmFyIHNlbCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcjdi1tb2RlbCcpOwogICAgICBpZiAoc2VsKSBzZWwudmFsdWUgPSB0aGlzLm1vZGVsUmF3OwogICAgICB3cml0ZVBlcnNpc3RlZCgnbW9kZWwnLCB0aGlzLm1vZGVsUmF3KTsKICAgIH0KICAgIGlmIChyZWZVUkwpIHsKICAgICAgdmFyIG1heCA9IG1heFJlZkZvcih0aGlzLmN1cnJlbnRNb2RlbCgpKTsKICAgICAgdmFyIGR1cCA9IHRoaXMucmVmcy5zb21lKGZ1bmN0aW9uIChyKSB7IHJldHVybiByLnJlbW90ZVVSTCA9PT0gcmVmVVJMIHx8IHIudXJsID09PSByZWZVUkw7IH0pOwogICAgICBpZiAoIWR1cCAmJiB0aGlzLnJlZnMubGVuZ3RoIDwgbWF4KSB7CiAgICAgICAgdGhpcy5yZWZzLnB1c2goeyB1cmw6IHJlZlVSTCwgcmVtb3RlVVJMOiByZWZVUkwsIG5hbWU6ICdyZWZlcmVuY2UnIH0pOwogICAgICB9CiAgICAgIHRoaXMuYWZ0ZXJJbnB1dENoYW5nZSgpOwogICAgfQogICAgdGhpcy5yZWZyZXNoQ1RBKCk7CiAgICB0aGlzLnJlZnJlc2hNb2RlbEhpbnQoKTsKICAgIGlmICh0aGlzLl9wcm9tcHRGaWVsZCkgeyB0aGlzLl9wcm9tcHRGaWVsZC5mb2N1cygpOyB0aGlzLl9wcm9tcHRGaWVsZC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnKSk7IH0KICAgIHRvYXN0KHJlZlVSTCA/ICdSZWZlcmVuY2UgYWRkZWQg4oCUIHR3ZWFrIHRoZSBwcm9tcHQgYW5kIFRyYW5zZm9ybS4nIDogJ1Byb21wdCBsb2FkZWQg4oCUIHR3ZWFrIGl0IGFuZCBHZW5lcmF0ZS4nLCAnaW5mbycpOwogICAgdHJ5IHsgdGhpcy5yb290LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KTsgfSBjYXRjaCAoZSkge30KICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLmJ1c3kpIHJldHVybjsKICAgIGlmICghdGhpcy5jYW5TdWJtaXQoKSkgewogICAgICBpZiAoIXRoaXMuaGFzSW5wdXQoKSAmJiAodGhpcy5wcm9tcHQgfHwgJycpLnRyaW0oKS5sZW5ndGggPCA4KSB7CiAgICAgICAgdG9hc3QoJ0FkZCBhdCBsZWFzdCA4IGNoYXJhY3RlcnMgb3IgZHJvcCBhbiBpbWFnZSB0byBnZW5lcmF0ZS4nLCAnZXJyb3InKTsKICAgICAgICBpZiAodGhpcy5fcHJvbXB0RmllbGQpIHRoaXMuX3Byb21wdEZpZWxkLmZvY3VzKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIGNvdW50ID0gdGhpcy52YXJpYXRpb25zID8gNCA6IDE7CiAgICB0aGlzLnJ1bkJhdGNoKGNvdW50KTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5ydW5CYXRjaCA9IGZ1bmN0aW9uIChjb3VudCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdGhpcy5idXN5ID0gdHJ1ZTsKICAgIHRoaXMucmVmcmVzaENUQSgpOwoKICAgIHZhciB0b3RhbENvc3QgPSB0aGlzLnRvdGFsQ29zdCgpOwoKICAgIHRoaXMuZW5zdXJlQ3JlZGl0cyh0b3RhbENvc3QpLnRoZW4oZnVuY3Rpb24gKGhhdmVFbm91Z2gpIHsKICAgICAgaWYgKCFoYXZlRW5vdWdoKSB7CiAgICAgICAgc2VsZi5idXN5ID0gZmFsc2U7IHNlbGYucmVmcmVzaENUQSgpOwogICAgICAgIHRvYXN0KCdOb3QgZW5vdWdoIGNyZWRpdHMg4oCUIGFkZCBtb3JlIHRvIGtlZXAgY3JlYXRpbmcuJywgJ2luZm8nKTsKICAgICAgICBnbygnIy9wYXl3YWxsJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiBzZWxmLmRvR2VuZXJhdGlvbnMoY291bnQpOwogICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0cykgewogICAgICBzZWxmLmJ1c3kgPSBmYWxzZTsKICAgICAgc2VsZi5yZWZyZXNoQ1RBKCk7CiAgICAgIGlmIChyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoKSB7CiAgICAgICAgdmFyIGZpcnN0ID0gcmVzdWx0c1swXTsKICAgICAgICBnbygnIy9pbWFnZS8nICsgKGZpcnN0LnJlbW90ZUlEIHx8IGZpcnN0LmlkKSk7CiAgICAgICAgaWYgKHVpKCkuY29uZmV0dGkpIHsgdHJ5IHsgdWkoKS5jb25mZXR0aSgpOyB9IGNhdGNoIChlKSB7fSB9CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgc2VsZi5idXN5ID0gZmFsc2U7CiAgICAgIHNlbGYucmVmcmVzaENUQSgpOwogICAgICBzZWxmLmhpZGVPdmVybGF5KCk7CiAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykgeyB0b2FzdCgnR2VuZXJhdGlvbiBjYW5jZWxsZWQuJywgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICAgIHZhciBtc2cgPSAoZXJyICYmIChlcnIuZGVzY3JpcHRpb24gfHwgZXJyLm1lc3NhZ2UpKSB8fCAnR2VuZXJhdGlvbiBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uJzsKICAgICAgdG9hc3QobXNnLCAnZXJyb3InKTsKICAgIH0pOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmVuc3VyZUNyZWRpdHMgPSBmdW5jdGlvbiAoY29zdCkgewogICAgdmFyIHMgPSBzdGF0ZSgpOwogICAgZnVuY3Rpb24gZW5vdWdoKG4pIHsgcmV0dXJuIHR5cGVvZiBuID09PSAnbnVtYmVyJyAmJiBuID49IGNvc3Q7IH0KICAgIGlmIChlbm91Z2gocy5jcmVkaXRzKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTsKICAgIGlmICghYXBpKCkuY3JlZGl0cykgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTsKICAgIHJldHVybiBhcGkoKS5jcmVkaXRzKCkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgIHZhciBuID0gcmVzICYmICh0eXBlb2YgcmVzLmNyZWRpdHMgPT09ICdudW1iZXInID8gcmVzLmNyZWRpdHMgOiByZXMpOwogICAgICBzLmNyZWRpdHMgPSAodHlwZW9mIG4gPT09ICdudW1iZXInKSA/IG4gOiBzLmNyZWRpdHM7CiAgICAgIGlmIChWLnN0b3JlICYmIFYuc3RvcmUuZW1pdCkgVi5zdG9yZS5lbWl0KCdjcmVkaXRzOmNoYW5nZWQnLCBzLmNyZWRpdHMpOwogICAgICByZXR1cm4gZW5vdWdoKHMuY3JlZGl0cyk7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuZG9HZW5lcmF0aW9ucyA9IGZ1bmN0aW9uIChjb3VudCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHRoaXMuYWJvcnQgPSAodHlwZW9mIEFib3J0Q29udHJvbGxlciAhPT0gJ3VuZGVmaW5lZCcpID8gbmV3IEFib3J0Q29udHJvbGxlcigpIDogbnVsbDsKICAgIHZhciBzaWduYWwgPSB0aGlzLmFib3J0ID8gdGhpcy5hYm9ydC5zaWduYWwgOiB1bmRlZmluZWQ7CgogICAgdGhpcy5zaG93T3ZlcmxheShjb3VudCk7CgogICAgdmFyIHByZXAgPSB0aGlzLmhhc0lucHV0KCkgPyB0aGlzLnVwbG9hZEFsbChzaWduYWwpIDogUHJvbWlzZS5yZXNvbHZlKG51bGwpOwoKICAgIHZhciBjaGFpbiA9IHByZXAudGhlbihmdW5jdGlvbiAodXBsb2FkZWQpIHsKICAgICAgdmFyIHNlcSA9IFByb21pc2UucmVzb2x2ZSgpOwogICAgICB2YXIgZG9uZSA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgIChmdW5jdGlvbiAoaWR4KSB7CiAgICAgICAgICBzZXEgPSBzZXEudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmIChzZWxmLmFib3J0ICYmIHNlbGYuYWJvcnQuc2lnbmFsLmFib3J0ZWQpIHsgdmFyIGUgPSBuZXcgRXJyb3IoJ2Fib3J0ZWQnKTsgZS5uYW1lID0gJ0Fib3J0RXJyb3InOyB0aHJvdyBlOyB9CiAgICAgICAgICAgIHNlbGYuc2V0T3ZlcmxheVN0ZXAoZG9uZSwgY291bnQpOwogICAgICAgICAgICByZXR1cm4gc2VsZi5zaW5nbGVHZW5lcmF0aW9uKHVwbG9hZGVkLCBzaWduYWwsIGZ1bmN0aW9uIChmcmFjKSB7CiAgICAgICAgICAgICAgc2VsZi5zZXRPdmVybGF5UHJvZ3Jlc3MoZG9uZSwgY291bnQsIGZyYWMpOwogICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChpbWcpIHsKICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaW1nKTsKICAgICAgICAgICAgICBkb25lKys7CiAgICAgICAgICAgICAgc2VsZi5zZXRPdmVybGF5UHJvZ3Jlc3MoZG9uZSwgY291bnQsIDApOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0pKGkpOwogICAgICB9CiAgICAgIHJldHVybiBzZXE7CiAgICB9KTsKCiAgICByZXR1cm4gY2hhaW4udGhlbihmdW5jdGlvbiAoKSB7CiAgICAgIHNlbGYuaGlkZU92ZXJsYXkoKTsKICAgICAgc2VsZi5hYm9ydCA9IG51bGw7CiAgICAgIHJldHVybiByZXN1bHRzOwogICAgfSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUudXBsb2FkQWxsID0gZnVuY3Rpb24gKHNpZ25hbCkgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIG1heCA9IG1heFJlZkZvcih0aGlzLmN1cnJlbnRNb2RlbCgpKTsKICAgIHZhciB1c2UgPSB0aGlzLnJlZnMuc2xpY2UoMCwgbWF4KTsKICAgIGlmICghYXBpKCkudXBsb2FkSW1hZ2UpIHJldHVybiBQcm9taXNlLnJlamVjdChhcGlFcnIoJ1VwbG9hZCBpcyB1bmF2YWlsYWJsZS4nKSk7CgogICAgdGhpcy5zZXRPdmVybGF5TGFiZWwoJ1VwbG9hZGluZyB5b3VyIGltYWdlJyArICh1c2UubGVuZ3RoID4gMSA/ICdzJyA6ICcnKSArICfigKYnKTsKCiAgICB2YXIgc2VxID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB2YXIgdXJscyA9IFtdOwogICAgdXNlLmZvckVhY2goZnVuY3Rpb24gKHJlZikgewogICAgICBzZXEgPSBzZXEudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHNpZ25hbCAmJiBzaWduYWwuYWJvcnRlZCkgeyB2YXIgZSA9IG5ldyBFcnJvcignYWJvcnRlZCcpOyBlLm5hbWUgPSAnQWJvcnRFcnJvcic7IHRocm93IGU7IH0KICAgICAgICBpZiAocmVmLnJlbW90ZVVSTCkgeyB1cmxzLnB1c2gocmVmLnJlbW90ZVVSTCk7IHJldHVybjsgfQogICAgICAgIHJldHVybiBhcGkoKS51cGxvYWRJbWFnZShyZWYuZmlsZSwgJ3JlbmRlcicpLnRoZW4oZnVuY3Rpb24gKG1lZGlhVVJMKSB7CiAgICAgICAgICByZWYucmVtb3RlVVJMID0gbWVkaWFVUkw7CiAgICAgICAgICB1cmxzLnB1c2gobWVkaWFVUkwpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0pOwogICAgcmV0dXJuIHNlcS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKCF1cmxzLmxlbmd0aCkgdGhyb3cgYXBpRXJyKCdJbWFnZSB1cGxvYWQgcmV0dXJuZWQgbm8gVVJMLicpOwogICAgICByZXR1cm4geyBwcmltYXJ5OiB1cmxzWzBdLCBhbGw6IHVybHMgfTsKICAgIH0pOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnNpbmdsZUdlbmVyYXRpb24gPSBmdW5jdGlvbiAodXBsb2FkZWQsIHNpZ25hbCwgb25Qcm9ncmVzcykgewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgdmFyIHNlZWQgPSByYW5kb21TZWVkKCk7CiAgICB2YXIgcHJvbXB0ID0gdGhpcy5maW5hbFByb21wdCgpOwogICAgdmFyIG1vZGVsID0gdGhpcy5jdXJyZW50TW9kZWwoKTsKCiAgICBpZiAoIWFwaSgpLnBvbGwpIHJldHVybiBQcm9taXNlLnJlamVjdChhcGlFcnIoJ0dlbmVyYXRvciBjbGllbnQgdW5hdmFpbGFibGUuJykpOwoKICAgIHZhciBzdWJtaXRGbiwgcG9sbEZuOwogICAgdmFyIGlzRWRpdCA9ICEhdXBsb2FkZWQ7CgogICAgaWYgKGlzRWRpdCkgewogICAgICB0aGlzLnNldE92ZXJsYXlMYWJlbCh1cGxvYWRlZC5hbGwubGVuZ3RoID4gMSA/ICdBcHBseWluZyB5b3VyIHJlZmVyZW5jZSBpbWFnZXPigKYnIDogJ1JlaW1hZ2luaW5nIHlvdXIgaW1hZ2XigKYnKTsKICAgICAgdmFyIGJvZHkgPSBidWlsZEVkaXRCb2R5KG1vZGVsLCBwcm9tcHQsIHVwbG9hZGVkLCBzZWVkKTsKICAgICAgc3VibWl0Rm4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBhcGkoKS5nZW5FZGl0KG1vZGVsLnJhdywgYm9keSk7IH07CiAgICAgIHBvbGxGbiA9IGZ1bmN0aW9uIChyZXF1ZXN0SUQpIHsgcmV0dXJuIGFwaSgpLnBvbGxFZGl0KG1vZGVsLnJhdywgcmVxdWVzdElEKTsgfTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuc2V0T3ZlcmxheUxhYmVsKCdDcmVhdGluZyB5b3VyIGltYWdl4oCmJyk7CiAgICAgIHZhciBhc3AgPSBhc3BlY3RCeVJhdyh0aGlzLmFzcGVjdFJhdyk7CiAgICAgIHZhciB0MmlCb2R5ID0geyBwcm9tcHQ6IHByb21wdCwgc2VlZDogc2VlZCwgd2lkdGg6IGFzcC53LCBoZWlnaHQ6IGFzcC5oIH07CiAgICAgIHN1Ym1pdEZuID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gYXBpKCkuZ2VuVGV4dFRvSW1hZ2UodDJpQm9keSk7IH07CiAgICAgIHBvbGxGbiA9IGZ1bmN0aW9uIChyZXF1ZXN0SUQpIHsgcmV0dXJuIGFwaSgpLnBvbGxUZXh0VG9JbWFnZShyZXF1ZXN0SUQpOyB9OwogICAgfQoKICAgIHJldHVybiBhcGkoKS5wb2xsKHN1Ym1pdEZuLCBwb2xsRm4sIHsgb25Qcm9ncmVzczogb25Qcm9ncmVzcywgc2lnbmFsOiBzaWduYWwgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgIHZhciB1cmwgPSBleHRyYWN0UmVzdWx0VVJMKHJlc3VsdCk7CiAgICAgIGlmICghdXJsKSB7CiAgICAgICAgdmFyIGRlc2MgPSByZXN1bHQgJiYgcmVzdWx0LmRlc2NyaXB0aW9uOwogICAgICAgIHRocm93IGFwaUVycihkZXNjIHx8ICdUaGUgbW9kZWwgcmV0dXJuZWQgbm8gaW1hZ2UuIFRyeSBhIGRpZmZlcmVudCBwcm9tcHQgb3IgbW9kZWwuJyk7CiAgICAgIH0KICAgICAgdmFyIGltYWdlID0gc2VsZi5idWlsZEdlbmVyYXRlZEltYWdlKHsKICAgICAgICBwcm9tcHQ6IHByb21wdCwKICAgICAgICBtb2RlbFJhdzogaXNFZGl0ID8gbW9kZWwucmF3IDogJ2ZsdXgxU2NobmVsbCcsCiAgICAgICAgc2VlZDogKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnNlZWQgPT09ICdudW1iZXInKSA/IHJlc3VsdC5zZWVkIDogc2VlZCwKICAgICAgICByZXN1bHRVUkw6IHVybCwKICAgICAgICBvcmlnaW5hbFVSTDogaXNFZGl0ID8gdXBsb2FkZWQucHJpbWFyeSA6IG51bGwKICAgICAgfSk7CiAgICAgIHJldHVybiBzZWxmLnBlcnNpc3QoaW1hZ2UpOwogICAgfSk7CiAgfTsKCiAgQ3JlYXRvci5wcm90b3R5cGUuYnVpbGRHZW5lcmF0ZWRJbWFnZSA9IGZ1bmN0aW9uIChvKSB7CiAgICByZXR1cm4gewogICAgICBpZDogdXVpZCgpLAogICAgICBwcm9tcHQ6IG8ucHJvbXB0LAogICAgICBuZWdhdGl2ZVByb21wdDogbnVsbCwKICAgICAgc3RlcENvdW50OiA0LAogICAgICBzZWVkOiBvLnNlZWQsCiAgICAgIGRpc2FibGVTYWZldHk6IGZhbHNlLAogICAgICBjcmVhdGVkRGF0ZTogbm93SVNPKCksCiAgICAgIHJlbW90ZUltYWdlVVJMOiBvLnJlc3VsdFVSTCwKICAgICAgcmVtb3RlT3JpZ2luYWxJbWFnZVVSTDogby5vcmlnaW5hbFVSTCB8fCB1bmRlZmluZWQsCiAgICAgIG1vZGVsOiBvLm1vZGVsUmF3LAogICAgICBwdWJsaXNoZWQ6IGZhbHNlLAogICAgICBmYXZvcml0ZWQ6IGZhbHNlLAogICAgICBwcmVzZXRJRDogdGhpcy5hY3RpdmVQcmVzZXQgPyB0aGlzLmFjdGl2ZVByZXNldC5pZCA6IHVuZGVmaW5lZAogICAgfTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5wZXJzaXN0ID0gZnVuY3Rpb24gKGltYWdlKSB7CiAgICBmdW5jdGlvbiBjb21taXQoc2F2ZWQpIHsKICAgICAgdmFyIGdpID0gKHNhdmVkICYmIHNhdmVkLmdlbmVyYXRlZEltYWdlKSA/IHNhdmVkLmdlbmVyYXRlZEltYWdlIDogKHNhdmVkIHx8IGltYWdlKTsKICAgICAgaWYgKGdpICYmIGdpLnJlbW90ZUlEICYmICFpbWFnZS5yZW1vdGVJRCkgaW1hZ2UucmVtb3RlSUQgPSBnaS5yZW1vdGVJRDsKICAgICAgaWYgKGdpICYmIGdpLmlkICYmIGdpLnJlbW90ZUlEICYmIGltYWdlLmlkICE9PSBnaS5pZCkgaW1hZ2UucmVtb3RlSUQgPSBnaS5yZW1vdGVJRDsKICAgICAgdmFyIGZpbmFsSW1hZ2UgPSBtZXJnZUltYWdlKGltYWdlLCBnaSk7CiAgICAgIHN0YXRlKCkubGlicmFyeSA9IHN0YXRlKCkubGlicmFyeSB8fCBbXTsKICAgICAgc3RhdGUoKS5saWJyYXJ5LnVuc2hpZnQoZmluYWxJbWFnZSk7CiAgICAgIGlmIChWLnN0b3JlICYmIFYuc3RvcmUuZW1pdCkgVi5zdG9yZS5lbWl0KCdsaWJyYXJ5OmNoYW5nZWQnLCBzdGF0ZSgpLmxpYnJhcnkpOwogICAgICBpZiAoYXBpKCkuY3JlZGl0cykgewogICAgICAgIGFwaSgpLmNyZWRpdHMoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgIHZhciBuID0gcmVzICYmICh0eXBlb2YgcmVzLmNyZWRpdHMgPT09ICdudW1iZXInID8gcmVzLmNyZWRpdHMgOiByZXMpOwogICAgICAgICAgaWYgKHR5cGVvZiBuID09PSAnbnVtYmVyJykgeyBzdGF0ZSgpLmNyZWRpdHMgPSBuOyBpZiAoVi5zdG9yZSAmJiBWLnN0b3JlLmVtaXQpIFYuc3RvcmUuZW1pdCgnY3JlZGl0czpjaGFuZ2VkJywgbik7IH0KICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZpbmFsSW1hZ2U7CiAgICB9CgogICAgaWYgKCFhcGkoKS5wZXJzaXN0SW1hZ2UpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb21taXQobnVsbCkpOwogICAgfQogICAgcmV0dXJuIGFwaSgpLnBlcnNpc3RJbWFnZShpbWFnZSkudGhlbihmdW5jdGlvbiAoc2F2ZWQpIHsKICAgICAgcmV0dXJuIGNvbW1pdChzYXZlZCk7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgIHRvYXN0KCdTYXZlZCBsb2NhbGx5IOKAlCBjb3VsZG7igJl0IHN5bmMgdG8geW91ciBsaWJyYXJ5LicsICdpbmZvJyk7CiAgICAgIHJldHVybiBjb21taXQobnVsbCk7CiAgICB9KTsKICB9OwoKICBmdW5jdGlvbiBtZXJnZUltYWdlKGxvY2FsLCBzZXJ2ZXIpIHsKICAgIGlmICghc2VydmVyIHx8IHR5cGVvZiBzZXJ2ZXIgIT09ICdvYmplY3QnKSByZXR1cm4gbG9jYWw7CiAgICB2YXIgb3V0ID0ge307CiAgICB2YXIgazsKICAgIGZvciAoayBpbiBsb2NhbCkgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChsb2NhbCwgaykpIG91dFtrXSA9IGxvY2FsW2tdOwogICAgZm9yIChrIGluIHNlcnZlcikgewogICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXJ2ZXIsIGspKSBjb250aW51ZTsKICAgICAgaWYgKHNlcnZlcltrXSAhPSBudWxsKSBvdXRba10gPSBzZXJ2ZXJba107CiAgICB9CiAgICBpZiAoIW91dC5yZW1vdGVJbWFnZVVSTCkgb3V0LnJlbW90ZUltYWdlVVJMID0gbG9jYWwucmVtb3RlSW1hZ2VVUkw7CiAgICBpZiAobG9jYWwucmVtb3RlT3JpZ2luYWxJbWFnZVVSTCAmJiAhb3V0LnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwpIG91dC5yZW1vdGVPcmlnaW5hbEltYWdlVVJMID0gbG9jYWwucmVtb3RlT3JpZ2luYWxJbWFnZVVSTDsKICAgIHJldHVybiBvdXQ7CiAgfQoKICBmdW5jdGlvbiBidWlsZEVkaXRCb2R5KG1vZGVsLCBwcm9tcHQsIHVwbG9hZGVkLCBzZWVkKSB7CiAgICB2YXIgcmF3ID0gbW9kZWwucmF3OwogICAgdmFyIG1heCA9IG1heFJlZkZvcihtb2RlbCk7CiAgICB2YXIgbXVsdGkgPSBtYXggPiAxOwogICAgdmFyIGJvZHkgPSB7IHByb21wdDogcHJvbXB0LCBzZWVkOiBzZWVkIH07CgogICAgaWYgKG11bHRpKSB7CiAgICAgIGJvZHkuaW1hZ2VfdXJsID0gdXBsb2FkZWQucHJpbWFyeTsKICAgICAgYm9keS5pbWFnZV91cmxzID0gdXBsb2FkZWQuYWxsOwogICAgICBib2R5Lm51bV9pbWFnZXMgPSAxOwogICAgfSBlbHNlIHsKICAgICAgYm9keS5pbWFnZV91cmwgPSB1cGxvYWRlZC5wcmltYXJ5OwogICAgfQoKICAgIGlmIChyYXcgPT09ICdxd2VuSW1hZ2VFZGl0JykgewogICAgICBib2R5Lm51bV9pbmZlcmVuY2Vfc3RlcHMgPSAzMDsKICAgICAgYm9keS5ndWlkYW5jZV9zY2FsZSA9IDQuMDsKICAgICAgYm9keS5uZWdhdGl2ZV9wcm9tcHQgPSAnICc7CiAgICAgIGJvZHkuYWNjZWxlcmF0aW9uID0gJ2hpZ2gnOwogICAgfSBlbHNlIGlmICghbXVsdGkpIHsKICAgICAgYm9keS5hY2NlbGVyYXRpb24gPSAnaGlnaCc7CiAgICB9CiAgICByZXR1cm4gYm9keTsKICB9CgogIGZ1bmN0aW9uIGFzcGVjdEJ5UmF3KHJhdykgewogICAgdmFyIGxpc3QgPSBhc3BlY3RzKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIGlmIChsaXN0W2ldLnJhdyA9PT0gcmF3KSByZXR1cm4gbGlzdFtpXTsKICAgIHJldHVybiBsaXN0WzBdOwogIH0KCiAgZnVuY3Rpb24gZXh0cmFjdFJlc3VsdFVSTChyZXN1bHQpIHsKICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDsKICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdC5pbWFnZXMpICYmIHJlc3VsdC5pbWFnZXMubGVuZ3RoKSB7CiAgICAgIHZhciBpbWcgPSByZXN1bHQuaW1hZ2VzWzBdOwogICAgICBpZiAodHlwZW9mIGltZyA9PT0gJ3N0cmluZycpIHJldHVybiBpbWc7CiAgICAgIGlmIChpbWcgJiYgaW1nLnVybCkgcmV0dXJuIGltZy51cmw7CiAgICB9CiAgICBpZiAocmVzdWx0LnVybCkgcmV0dXJuIHJlc3VsdC51cmw7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIG5vcm1hbGl6ZUZlZWRJbWFnZShyYXcpIHsKICAgIGlmICghcmF3KSByZXR1cm4ge307CiAgICB2YXIgZ2kgPSByYXcuZ2VuZXJhdGVkSW1hZ2UgfHwgcmF3LmltYWdlIHx8IHJhdzsKICAgIHJldHVybiB7CiAgICAgIGlkOiBnaS5pZCwgcmVtb3RlSUQ6IGdpLnJlbW90ZUlELCBwcm9tcHQ6IGdpLnByb21wdCwKICAgICAgbW9kZWw6IGdpLm1vZGVsLAogICAgICByZW1vdGVJbWFnZVVSTDogZ2kucmVtb3RlSW1hZ2VVUkwgfHwgZ2kuaW1hZ2VVUkwgfHwgZ2kudXJsLAogICAgICByZW1vdGVPcmlnaW5hbEltYWdlVVJMOiBnaS5yZW1vdGVPcmlnaW5hbEltYWdlVVJMIHx8IGdpLm9yaWdpbmFsSW1hZ2VVUkwsCiAgICAgIGZhdm9yaXRlZDogZ2kuZmF2b3JpdGVkCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gaW1hZ2VVUkxPZihpbWFnZSkgewogICAgaWYgKCFpbWFnZSkgcmV0dXJuICcnOwogICAgcmV0dXJuIGltYWdlLnJlbW90ZUltYWdlVVJMIHx8IGltYWdlLnJlbW90ZUltYWdlVXJsIHx8IGltYWdlLmltYWdlVVJMIHx8IGltYWdlLnVybCB8fCAnJzsKICB9CgogIGZ1bmN0aW9uIGFwaUVycihtc2cpIHsKICAgIHZhciBlID0gbmV3IEVycm9yKG1zZyk7CiAgICBlLmRlc2NyaXB0aW9uID0gbXNnOwogICAgcmV0dXJuIGU7CiAgfQoKICBmdW5jdGlvbiBlbXB0eUJsb2NrKHRpdGxlLCBzdWIsIGljb25OYW1lKSB7CiAgICBpZiAodWkoKS5lbXB0eSkgewogICAgICB0cnkgeyByZXR1cm4gdWkoKS5lbXB0eSh7IHRpdGxlOiB0aXRsZSwgbWVzc2FnZTogc3ViLCBpY29uOiBpY29uTmFtZSB8fCAnaW1hZ2UnIH0pOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgcmV0dXJuIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eScgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJywgaHRtbDogaWNvbihpY29uTmFtZSB8fCAnaW1hZ2UnKSB9KSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScgfSwgdGl0bGUpLAogICAgICBzdWIgPyBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHlfX21zZycgfSwgc3ViKSA6IG51bGwpOwogIH0KCiAgQ3JlYXRvci5wcm90b3R5cGUuc2hvd092ZXJsYXkgPSBmdW5jdGlvbiAoY291bnQpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHRoaXMuaGlkZU92ZXJsYXkoKTsKCiAgICB2YXIgc2NyaW0gPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytb3ZlcmxheS1zY3JpbSB2LWNyZWF0ZV9fc2NyaW0nLCByb2xlOiAnZGlhbG9nJywgJ2FyaWEtbW9kYWwnOiAndHJ1ZScsCiAgICAgICdhcmlhLWxhYmVsJzogJ0dlbmVyYXRpbmcnIH0pOwoKICAgIHZhciBwYW5lbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbCB2LWNyZWF0ZV9fb3ZlcmxheScgfSk7CgogICAgcGFuZWwuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNyZWF0ZV9fb3JiJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jcmVhdGVfX29yYi1jb3JlJywgaHRtbDogaWNvbignc3BhcmtsZXMnKSB8fCAn4pymJyB9KSkpOwoKICAgIHZhciBsYWJlbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbF9fdGl0bGUgdi1jcmVhdGVfX292ZXJsYXktbGFiZWwnIH0sICdTdGFydGluZ+KApicpOwogICAgdGhpcy5fb3ZMYWJlbCA9IGxhYmVsOwogICAgcGFuZWwuYXBwZW5kQ2hpbGQobGFiZWwpOwoKICAgIHZhciBiYXRjaEluZm8gPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViIHYtY3JlYXRlX19vdmVybGF5LWJhdGNoJyB9KTsKICAgIHRoaXMuX292QmF0Y2ggPSBiYXRjaEluZm87CiAgICBpZiAoY291bnQgPiAxKSBiYXRjaEluZm8udGV4dENvbnRlbnQgPSAnMCBvZiAnICsgY291bnQgKyAnIGRvbmUnOwogICAgcGFuZWwuYXBwZW5kQ2hpbGQoYmF0Y2hJbmZvKTsKCiAgICB2YXIgdHJhY2sgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcHJvZ3Jlc3Mgdi1wcm9ncmVzcy0tZGV0ZXJtaW5hdGUnIH0pOwogICAgdmFyIGJhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wcm9ncmVzc19fYmFyJyB9KTsKICAgIHRyYWNrLmFwcGVuZENoaWxkKGJhcik7CiAgICB0aGlzLl9vdkJhciA9IGJhcjsKICAgIHRoaXMuX292Q291bnQgPSBjb3VudDsKICAgIHBhbmVsLmFwcGVuZENoaWxkKHRyYWNrKTsKCiAgICB2YXIgcGN0ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxhYmVsIHYtY3JlYXRlX19vdmVybGF5LXBjdCcgfSwgJycpOwogICAgdGhpcy5fb3ZQY3QgPSBwY3Q7CiAgICBwYW5lbC5hcHBlbmRDaGlsZChwY3QpOwoKICAgIHZhciBjYW5jZWwgPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jcmVhdGVfX292ZXJsYXktY2FuY2VsJyB9LCAnQ2FuY2VsJyk7CiAgICB0aGlzLm9uKGNhbmNlbCwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBzZWxmLmNhbmNlbEdlbmVyYXRpb24oKTsgfSk7CiAgICBwYW5lbC5hcHBlbmRDaGlsZChjYW5jZWwpOwoKICAgIHNjcmltLmFwcGVuZENoaWxkKHBhbmVsKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaW0pOwogICAgdGhpcy5fc2NyaW0gPSBzY3JpbTsKICAgIHRoaXMuc2V0T3ZlcmxheVByb2dyZXNzKDAsIGNvdW50LCAwLjA0KTsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5zZXRPdmVybGF5TGFiZWwgPSBmdW5jdGlvbiAodGV4dCkgewogICAgaWYgKHRoaXMuX292TGFiZWwpIHRoaXMuX292TGFiZWwudGV4dENvbnRlbnQgPSB0ZXh0OwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnNldE92ZXJsYXlTdGVwID0gZnVuY3Rpb24gKGRvbmUsIGNvdW50KSB7CiAgICBpZiAodGhpcy5fb3ZCYXRjaCAmJiBjb3VudCA+IDEpIHRoaXMuX292QmF0Y2gudGV4dENvbnRlbnQgPSBkb25lICsgJyBvZiAnICsgY291bnQgKyAnIGRvbmUnOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLnNldE92ZXJsYXlQcm9ncmVzcyA9IGZ1bmN0aW9uIChkb25lLCBjb3VudCwgZnJhYykgewogICAgaWYgKHR5cGVvZiBmcmFjICE9PSAnbnVtYmVyJyB8fCBpc05hTihmcmFjKSkgZnJhYyA9IDA7CiAgICBmcmFjID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgZnJhYykpOwogICAgdmFyIG92ZXJhbGwgPSAoY291bnQgPiAwKSA/ICgoZG9uZSArIGZyYWMpIC8gY291bnQpIDogZnJhYzsKICAgIG92ZXJhbGwgPSBNYXRoLm1heCgwLjAzLCBNYXRoLm1pbigwLjk4LCBvdmVyYWxsKSk7CiAgICBpZiAodGhpcy5fb3ZCYXIpIHRoaXMuX292QmFyLnN0eWxlLndpZHRoID0gTWF0aC5yb3VuZChvdmVyYWxsICogMTAwKSArICclJzsKICAgIGlmICh0aGlzLl9vdlBjdCkgdGhpcy5fb3ZQY3QudGV4dENvbnRlbnQgPSBNYXRoLnJvdW5kKG92ZXJhbGwgKiAxMDApICsgJyUnOwogICAgaWYgKHRoaXMuX292QmF0Y2ggJiYgY291bnQgPiAxKSB0aGlzLl9vdkJhdGNoLnRleHRDb250ZW50ID0gZG9uZSArICcgb2YgJyArIGNvdW50ICsgJyBkb25lJzsKICB9OwoKICBDcmVhdG9yLnByb3RvdHlwZS5oaWRlT3ZlcmxheSA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLl9zY3JpbSkgewogICAgICB2YXIgbyA9IHRoaXMuX3NjcmltOwogICAgICB0aGlzLl9zY3JpbSA9IG51bGw7CiAgICAgIG8uY2xhc3NMaXN0LmFkZCgnY2xvc2luZycpOwogICAgICB2YXIgcmVtb3ZlZCA9IGZhbHNlOwogICAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uICgpIHsgaWYgKCFyZW1vdmVkICYmIG8ucGFyZW50Tm9kZSkgeyBvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyk7IHJlbW92ZWQgPSB0cnVlOyB9IH07CiAgICAgIHRoaXMub24obywgJ2FuaW1hdGlvbmVuZCcsIGRvbmUpOwogICAgICBzZXRUaW1lb3V0KGRvbmUsIDM2MCk7CiAgICB9CiAgICB0aGlzLl9vdkxhYmVsID0gdGhpcy5fb3ZCYXIgPSB0aGlzLl9vdlBjdCA9IHRoaXMuX292QmF0Y2ggPSBudWxsOwogIH07CgogIENyZWF0b3IucHJvdG90eXBlLmNhbmNlbEdlbmVyYXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAodGhpcy5hYm9ydCkgeyB0cnkgeyB0aGlzLmFib3J0LmFib3J0KCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIHRoaXMuc2V0T3ZlcmxheUxhYmVsKCdDYW5jZWxsaW5n4oCmJyk7CiAgfTsKCn0pKCk7CgoKLyogPT09PT0gc3JjL2pzL2xpYnJhcnkuanMgPT09PT0gKi8KKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gd2luZG93LlYgfHwgKHdpbmRvdy5WID0ge30pOwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwoKICBmdW5jdGlvbiBlbCgpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51aS5lbC5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgdmFyIHRhZyA9IGFyZ3VtZW50c1swXTsKICAgIHZhciBhdHRycyA9IGFyZ3VtZW50c1sxXSB8fCB7fTsKICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgZm9yICh2YXIgayBpbiBhdHRycykgewogICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgaykpIGNvbnRpbnVlOwogICAgICB2YXIgdmFsID0gYXR0cnNba107CiAgICAgIGlmICh2YWwgPT0gbnVsbCkgY29udGludWU7CiAgICAgIGlmIChrID09PSAnY2xhc3MnIHx8IGsgPT09ICdjbGFzc05hbWUnKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgZWxzZSBpZiAoayA9PT0gJ3RleHQnKSBub2RlLnRleHRDb250ZW50ID0gdmFsOwogICAgICBlbHNlIGlmIChrID09PSAnaHRtbCcpIG5vZGUuaW5uZXJIVE1MID0gdmFsOwogICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHZhbCk7CiAgICAgIH0gZWxzZSBpZiAoayA9PT0gJ2RhdGFzZXQnICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7CiAgICAgICAgZm9yICh2YXIgZGsgaW4gdmFsKSBub2RlLmRhdGFzZXRbZGtdID0gdmFsW2RrXTsKICAgICAgfSBlbHNlIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICB9CiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY2hpbGQgPSBhcmd1bWVudHNbaV07CiAgICAgIGlmIChjaGlsZCA9PSBudWxsIHx8IGNoaWxkID09PSBmYWxzZSkgY29udGludWU7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkgewogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hpbGQubGVuZ3RoOyBqKyspIHsKICAgICAgICAgIGlmIChjaGlsZFtqXSA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodHlwZW9mIGNoaWxkW2pdID09PSAnc3RyaW5nJyA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoaWxkW2pdKSA6IGNoaWxkW2pdKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQpIDogY2hpbGQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIFMobm9kZSwgY3NzKSB7IGlmIChub2RlKSBub2RlLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAobm9kZS5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykgfHwgJycpICsgJzsnICsgY3NzKTsgcmV0dXJuIG5vZGU7IH0KCiAgdmFyIEFDQ0VOVCA9ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknOwogIHZhciBHUkFESUVOVCA9ICd2YXIoLS1ncmFkaWVudC12YW1wLCBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjNTI5N0Y4LCAjODJENkZGKSknOwogIHZhciBCQURHRV9CRyA9ICdyZ2JhKDEwLDEyLDE0LC41NSknOwogIHZhciBHTEFTU19CRyA9ICd2YXIoLS1jb2xvci1iZy1vbiwgIzIwMjIyMSknOwogIHZhciBMSU5FID0gJ3ZhcigtLXYtbGluZSwgcmdiYSgyNDUsMjQ1LDI0NywuMTUpKSc7CgogIGZ1bmN0aW9uIGljb24obmFtZSkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaWNvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgciA9IFYudWkuaWNvbihuYW1lKTsKICAgICAgaWYgKHR5cGVvZiByID09PSAnc3RyaW5nJykgewogICAgICAgIHZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgIHNwYW4uY2xhc3NOYW1lID0gJ3YtaWNvJzsKICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgICAgIHNwYW4uaW5uZXJIVE1MID0gcjsKICAgICAgICByZXR1cm4gc3BhbjsKICAgICAgfQogICAgICByZXR1cm4gcjsKICAgIH0KICAgIHZhciBmYWxsYmFjayA9IHsgc2VhcmNoOiAn4oyVJywgc29ydDogJ+KHhScsIGZvbGRlcjogJ+KWpCcsIGhlYXJ0OiAn4pmhJywgaGVhcnRGaWxsOiAn4pmlJywgdHJhc2g6ICfijKsnLCBjbG9zZTogJ+KclScsIGNoZWNrOiAn4pyTJywgbW9yZTogJ+KLrycsIGRvd25sb2FkOiAn4qSTJywgY29weTogJ+KOmCcsIHBsdXM6ICcrJywgZ3JpZDogJ+KWpicsIGltYWdlOiAn4pajJyB9OwogICAgdmFyIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICBzLmNsYXNzTmFtZSA9ICd2LWljbyc7CiAgICBzLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgcy50ZXh0Q29udGVudCA9IGZhbGxiYWNrW25hbWVdIHx8ICfigKInOwogICAgcmV0dXJuIHM7CiAgfQoKICBmdW5jdGlvbiB0b2FzdChtc2csIGtpbmQpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnRvYXN0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi51aS50b2FzdChtc2csIGtpbmQgfHwgJ2luZm8nKTsKICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLmVtaXQgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuZW1pdCgndG9hc3QnLCB7IG1zZzogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsKICB9CgogIGZ1bmN0aW9uIGNvbmZpcm1EaWFsb2cobXNnKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jb25maXJtID09PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFYudWkuY29uZmlybShtc2cpKTsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0obXNnKSk7CiAgfQoKICBmdW5jdGlvbiBtb2RhbChub2RlLCBvcHRzKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5tb2RhbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudWkubW9kYWwobm9kZSwgb3B0cyB8fCB7fSk7CiAgICB2YXIgYmFjayA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbC1iYWNrJyB9KTsKICAgIHZhciBwYW5lbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbCBnbGFzcy1jYXJkJyB9LCBub2RlKTsKICAgIGJhY2suYXBwZW5kQ2hpbGQocGFuZWwpOwogICAgZnVuY3Rpb24gY2xvc2UoKSB7IGlmIChiYWNrLnBhcmVudE5vZGUpIGJhY2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiYWNrKTsgaWYgKG9wdHMgJiYgb3B0cy5vbkNsb3NlKSBvcHRzLm9uQ2xvc2UoKTsgfQogICAgYmFjay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGlmIChlLnRhcmdldCA9PT0gYmFjaykgY2xvc2UoKTsgfSk7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJhY2spOwogICAgcmV0dXJuIHsgY2xvc2U6IGNsb3NlIH07CiAgfQoKICB2YXIgZGVib3VuY2UgPSAoVi51dGlsICYmIFYudXRpbC5kZWJvdW5jZSkgPyBWLnV0aWwuZGVib3VuY2UgOiBmdW5jdGlvbiAoZm4sIG1zKSB7CiAgICB2YXIgdDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBhID0gYXJndW1lbnRzLCBjID0gdGhpczsKICAgICAgY2xlYXJUaW1lb3V0KHQpOwogICAgICB0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGZuLmFwcGx5KGMsIGEpOyB9LCBtcyk7CiAgICB9OwogIH07CgogIGZ1bmN0aW9uIGVzY2FwZUh0bWwocykgewogICAgaWYgKFYudXRpbCAmJiB0eXBlb2YgVi51dGlsLmVzY2FwZUh0bWwgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnV0aWwuZXNjYXBlSHRtbChzKTsKICAgIHJldHVybiBTdHJpbmcocyA9PSBudWxsID8gJycgOiBzKS5yZXBsYWNlKC9bJjw+IiddL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgIHJldHVybiB7ICcmJzogJyZhbXA7JywgJzwnOiAnJmx0OycsICc+JzogJyZndDsnLCAnIic6ICcmcXVvdDsnLCAiJyI6ICcmIzM5OycgfVtjXTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZG93bmxvYWQodXJsLCBuYW1lKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwuZG93bmxvYWQgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnV0aWwuZG93bmxvYWQodXJsLCBuYW1lKTsKICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgYS5ocmVmID0gdXJsOyBhLmRvd25sb2FkID0gbmFtZSB8fCAnaW1hZ2UnOyBhLnRhcmdldCA9ICdfYmxhbmsnOyBhLnJlbCA9ICdub29wZW5lcic7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOyBhLmNsaWNrKCk7IGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICBpZiAoVi5yb3V0ZXIgJiYgdHlwZW9mIFYucm91dGVyLmdvID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi5yb3V0ZXIuZ28oaGFzaCk7CiAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiBpbWdJZChpbWcpIHsgcmV0dXJuIGltZyAmJiAoaW1nLnJlbW90ZUlEIHx8IGltZy5pZCk7IH0KICBmdW5jdGlvbiBpbWdLZXkoaW1nKSB7IHJldHVybiBTdHJpbmcoaW1nSWQoaW1nKSB8fCAnJyk7IH0KCiAgZnVuY3Rpb24gZGF0ZU1zKGltZykgewogICAgdmFyIGQgPSBpbWcgJiYgaW1nLmNyZWF0ZWREYXRlOwogICAgaWYgKGQgPT0gbnVsbCkgcmV0dXJuIDA7CiAgICBpZiAodHlwZW9mIGQgPT09ICdudW1iZXInKSByZXR1cm4gZCA8IDFlMTIgPyBkICogMTAwMCA6IGQ7CiAgICB2YXIgdCA9IERhdGUucGFyc2UoZCk7CiAgICByZXR1cm4gaXNOYU4odCkgPyAwIDogdDsKICB9CgogIGZ1bmN0aW9uIGZ1enp5U2NvcmUobmVlZGxlLCBoYXkpIHsKICAgIGlmICghbmVlZGxlKSByZXR1cm4gMTsKICAgIGlmICghaGF5KSByZXR1cm4gMDsKICAgIG5lZWRsZSA9IG5lZWRsZS50b0xvd2VyQ2FzZSgpOwogICAgaGF5ID0gaGF5LnRvTG93ZXJDYXNlKCk7CiAgICB2YXIgZXhhY3QgPSBoYXkuaW5kZXhPZihuZWVkbGUpOwogICAgaWYgKGV4YWN0ICE9PSAtMSkgcmV0dXJuIDEwMDAgLSBleGFjdDsKICAgIHZhciBoaSA9IDAsIG5pID0gMCwgc2NvcmUgPSAwLCBzdHJlYWsgPSAwOwogICAgd2hpbGUgKGhpIDwgaGF5Lmxlbmd0aCAmJiBuaSA8IG5lZWRsZS5sZW5ndGgpIHsKICAgICAgaWYgKGhheVtoaV0gPT09IG5lZWRsZVtuaV0pIHsKICAgICAgICBzdHJlYWsgKz0gMTsKICAgICAgICBzY29yZSArPSAxICsgc3RyZWFrOwogICAgICAgIG5pICs9IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFrID0gMDsKICAgICAgfQogICAgICBoaSArPSAxOwogICAgfQogICAgcmV0dXJuIG5pID09PSBuZWVkbGUubGVuZ3RoID8gc2NvcmUgOiAwOwogIH0KCiAgZnVuY3Rpb24gc2VhcmNoSGF5c3RhY2soaW1nKSB7CiAgICB2YXIgcGFydHMgPSBbaW1nLnByb21wdCB8fCAnJywgaW1nLm1vZGVsIHx8ICcnLCBtb2RlbExhYmVsKGltZy5tb2RlbCkgfHwgJyddOwogICAgaWYgKEFycmF5LmlzQXJyYXkoaW1nLnRhZ3MpKSBwYXJ0cyA9IHBhcnRzLmNvbmNhdChpbWcudGFncyk7CiAgICByZXR1cm4gcGFydHMuam9pbignICcpOwogIH0KCiAgdmFyIFNPUlRTID0gWwogICAgeyBrZXk6ICduZXdlc3QnLCBsYWJlbDogJ05ld2VzdCcsIGNtcDogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGRhdGVNcyhiKSAtIGRhdGVNcyhhKTsgfSB9LAogICAgeyBrZXk6ICdvbGRlc3QnLCBsYWJlbDogJ09sZGVzdCcsIGNtcDogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGRhdGVNcyhhKSAtIGRhdGVNcyhiKTsgfSB9LAogICAgeyBrZXk6ICdheicsIGxhYmVsOiAnQSDihpIgWicsIGNtcDogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIChhLnByb21wdCB8fCAnJykubG9jYWxlQ29tcGFyZShiLnByb21wdCB8fCAnJyk7IH0gfSwKICAgIHsga2V5OiAnbW9kZWwnLCBsYWJlbDogJ0J5IE1vZGVsJywgY21wOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKG1vZGVsTGFiZWwoYS5tb2RlbCkgfHwgJycpLmxvY2FsZUNvbXBhcmUobW9kZWxMYWJlbChiLm1vZGVsKSB8fCAnJykgfHwgZGF0ZU1zKGIpIC0gZGF0ZU1zKGEpOyB9IH0sCiAgICB7IGtleTogJ2Zhdm9yaXRlcycsIGxhYmVsOiAnRmF2b3JpdGVzIEZpcnN0JywgY21wOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKGIuZmF2b3JpdGVkID8gMSA6IDApIC0gKGEuZmF2b3JpdGVkID8gMSA6IDApIHx8IGRhdGVNcyhiKSAtIGRhdGVNcyhhKTsgfSB9CiAgXTsKCiAgZnVuY3Rpb24gbW9kZWxMYWJlbChyYXcpIHsKICAgIGlmIChyYXcgJiYgVi5kYXRhICYmIEFycmF5LmlzQXJyYXkoVi5kYXRhLm1vZGVscykpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBWLmRhdGEubW9kZWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKFYuZGF0YS5tb2RlbHNbaV0ucmF3ID09PSByYXcpIHJldHVybiBWLmRhdGEubW9kZWxzW2ldLmxhYmVsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmF3IHx8ICcnOwogIH0KCiAgdmFyIFBFUiA9IDMwOwoKICB2YXIgY3R4ID0gbnVsbDsKCiAgZnVuY3Rpb24gZnJlc2hDdHgoKSB7CiAgICByZXR1cm4gewogICAgICByb290OiBudWxsLAogICAgICBncmlkRWw6IG51bGwsCiAgICAgIHNlbnRpbmVsOiBudWxsLAogICAgICBzdGF0dXNFbDogbnVsbCwKICAgICAgdG9vbGJhckVsOiBudWxsLAogICAgICBjb3VudEVsOiBudWxsLAogICAgICBpdGVtczogW10sCiAgICAgIHBhZ2U6IDAsCiAgICAgIHRvdGFsOiBudWxsLAogICAgICBsb2FkaW5nOiBmYWxzZSwKICAgICAgZG9uZTogZmFsc2UsCiAgICAgIGVycm9yZWQ6IGZhbHNlLAogICAgICBmZXRjaGVkOiBmYWxzZSwKICAgICAgc291cmNlOiAnbGlicmFyeScsCiAgICAgIGZvbGRlcklEOiBudWxsLAogICAgICBmb2xkZXJzOiBbXSwKICAgICAgZm9sZGVyc0xvYWRlZDogZmFsc2UsCiAgICAgIHF1ZXJ5OiAnJywKICAgICAgc29ydDogJ25ld2VzdCcsCiAgICAgIGluZHVzdHJ5OiBudWxsLAogICAgICBzZWxlY3RNb2RlOiBmYWxzZSwKICAgICAgc2VsZWN0ZWQ6IHt9LAogICAgICBvYnNlcnZlcjogbnVsbCwKICAgICAgbWVudUVsOiBudWxsLAogICAgICBzY3JvbGxZOiAwLAogICAgICBzY3JvbGxUYXJnZXQ6IG51bGwKICAgIH07CiAgfQoKICBmdW5jdGlvbiBhY3RpdmVGZXRjaChwYWdlKSB7CiAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2Zhdm9yaXRlcycpIHJldHVybiBWLmFwaS5mYXZvcml0ZXMoMjAwKTsKICAgIGlmIChjdHguc291cmNlID09PSAnZm9sZGVyJyAmJiBjdHguZm9sZGVySUQpIHJldHVybiBWLmFwaS5mb2xkZXJJbWFnZXMoY3R4LmZvbGRlcklELCBwYWdlLCBQRVIpOwogICAgcmV0dXJuIFYuYXBpLmxpYnJhcnkocGFnZSwgUEVSKTsKICB9CgogIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhZ2UocmVzcCkgewogICAgaWYgKCFyZXNwKSByZXR1cm4geyBpdGVtczogW10sIHRvdGFsOiBudWxsIH07CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwKSkgcmV0dXJuIHsgaXRlbXM6IHJlc3AsIHRvdGFsOiByZXNwLmxlbmd0aCB9OwogICAgdmFyIGl0ZW1zID0gQXJyYXkuaXNBcnJheShyZXNwLml0ZW1zKSA/IHJlc3AuaXRlbXMgOiBbXTsKICAgIHZhciB0b3RhbCA9IHJlc3AubWV0YWRhdGEgJiYgdHlwZW9mIHJlc3AubWV0YWRhdGEudG90YWwgPT09ICdudW1iZXInID8gcmVzcC5tZXRhZGF0YS50b3RhbCA6IG51bGw7CiAgICByZXR1cm4geyBpdGVtczogaXRlbXMsIHRvdGFsOiB0b3RhbCB9OwogIH0KCiAgZnVuY3Rpb24gbWVyZ2VVbmlxdWUoaW50bywgaW5jb21pbmcpIHsKICAgIHZhciBzZWVuID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGludG8ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGVrID0gaW1nS2V5KGludG9baV0pOwogICAgICBpZiAoZWspIHNlZW5bZWtdID0gdHJ1ZTsKICAgIH0KICAgIGZvciAodmFyIGogPSAwOyBqIDwgaW5jb21pbmcubGVuZ3RoOyBqKyspIHsKICAgICAgdmFyIGl0ZW0gPSBpbmNvbWluZ1tqXTsKICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgY29udGludWU7CiAgICAgIHZhciBrID0gaW1nS2V5KGl0ZW0pOwogICAgICBpZiAoayAmJiBzZWVuW2tdKSBjb250aW51ZTsKICAgICAgaWYgKGspIHNlZW5ba10gPSB0cnVlOwogICAgICBpbnRvLnB1c2goaXRlbSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBsb2FkTmV4dChyZXNldCkgewogICAgaWYgKCFjdHgpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgIGlmIChjdHgubG9hZGluZykgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgaWYgKCFyZXNldCAmJiBjdHguZG9uZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgY3R4LmxvYWRpbmcgPSB0cnVlOwogICAgY3R4LmVycm9yZWQgPSBmYWxzZTsKICAgIHZhciBzdGFydEN0eCA9IGN0eDsKCiAgICB2YXIgbmV4dFBhZ2UgPSByZXNldCA/IDEgOiBjdHgucGFnZSArIDE7CiAgICB2YXIgaGFkU2VlZCA9IHJlc2V0ICYmIGN0eC5pdGVtcy5sZW5ndGggPiAwOwogICAgaWYgKHJlc2V0KSB7CiAgICAgIGlmICghaGFkU2VlZCkgY3R4Lml0ZW1zID0gW107CiAgICAgIGN0eC5wYWdlID0gMDsKICAgICAgY3R4LnRvdGFsID0gbnVsbDsKICAgICAgY3R4LmRvbmUgPSBmYWxzZTsKICAgICAgY3R4LmZldGNoZWQgPSBmYWxzZTsKICAgIH0KCiAgICBpZiAocmVzZXQgJiYgIWN0eC5pdGVtcy5sZW5ndGgpIHNob3dTa2VsZXRvbnMoKTsKICAgIHJlbmRlclN0YXR1cygpOwoKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKQogICAgICAudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkubGlicmFyeSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVycm9yKCdBUEkgdW5hdmFpbGFibGUnKTsKICAgICAgICByZXR1cm4gYWN0aXZlRmV0Y2gobmV4dFBhZ2UpOwogICAgICB9KQogICAgICAudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgIGlmICghY3R4IHx8IGN0eCAhPT0gc3RhcnRDdHgpIHJldHVybjsKICAgICAgICB2YXIgbm9ybSA9IG5vcm1hbGl6ZVBhZ2UocmVzcCk7CiAgICAgICAgaWYgKGhhZFNlZWQpIGN0eC5pdGVtcyA9IG5vcm0uaXRlbXMuc2xpY2UoKTsKICAgICAgICBlbHNlIG1lcmdlVW5pcXVlKGN0eC5pdGVtcywgbm9ybS5pdGVtcyk7CiAgICAgICAgY3R4LnBhZ2UgPSBuZXh0UGFnZTsKICAgICAgICBpZiAobm9ybS50b3RhbCAhPSBudWxsKSBjdHgudG90YWwgPSBub3JtLnRvdGFsOwoKICAgICAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2Zhdm9yaXRlcycpIGN0eC5kb25lID0gdHJ1ZTsKICAgICAgICBlbHNlIGlmIChub3JtLml0ZW1zLmxlbmd0aCA8IFBFUikgY3R4LmRvbmUgPSB0cnVlOwogICAgICAgIGVsc2UgaWYgKGN0eC50b3RhbCAhPSBudWxsICYmIGN0eC5pdGVtcy5sZW5ndGggPj0gY3R4LnRvdGFsKSBjdHguZG9uZSA9IHRydWU7CgogICAgICAgIGN0eC5sb2FkaW5nID0gZmFsc2U7CiAgICAgICAgY3R4LmVycm9yZWQgPSBmYWxzZTsKICAgICAgICBjdHguZmV0Y2hlZCA9IHRydWU7CiAgICAgICAgaWYgKGN0eC5zb3VyY2UgPT09ICdsaWJyYXJ5JyAmJiBWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLnNldCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgY3R4Ll9zZWxmV3JpdGUgPSB0cnVlOwogICAgICAgICAgdHJ5IHsgVi5zdG9yZS5zZXQoJ2xpYnJhcnknLCBjdHguaXRlbXMuc2xpY2UoKSk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICBjdHguX3NlbGZXcml0ZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgcmVuZGVyR3JpZCgpOwogICAgICAgICAgcmVuZGVyU3RhdHVzKCk7CiAgICAgICAgICBlbnN1cmVGaWxsKCk7CiAgICAgICAgfSBjYXRjaCAocmVuZGVyRXJyKSB7CiAgICAgICAgICBpZiAod2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5lcnJvcikgY29uc29sZS5lcnJvcignW2xpYnJhcnldIHJlbmRlciBmYWlsZWQnLCByZW5kZXJFcnIpOwogICAgICAgIH0KICAgICAgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBpZiAoIWN0eCB8fCBjdHggIT09IHN0YXJ0Q3R4KSByZXR1cm47CiAgICAgICAgY3R4LmxvYWRpbmcgPSBmYWxzZTsKICAgICAgICBjdHguZXJyb3JlZCA9IHRydWU7CiAgICAgICAgdHJ5IHsgcmVuZGVyR3JpZCgpOyB9IGNhdGNoIChlKSB7fQogICAgICAgIHJlbmRlclN0YXR1cyhlcnIpOwogICAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGVuc3VyZUZpbGwoKSB7CiAgICBpZiAoY3R4LmRvbmUgfHwgY3R4LmxvYWRpbmcgfHwgY3R4LmVycm9yZWQpIHJldHVybjsKICAgIGlmICghY3R4LmdyaWRFbCkgcmV0dXJuOwogICAgaWYgKGN0eC5xdWVyeSB8fCBjdHguc291cmNlID09PSAnZmF2b3JpdGVzJykgcmV0dXJuOwogICAgdmFyIGRvY0ggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IHdpbmRvdy5pbm5lckhlaWdodCB8fCAwOwogICAgdmFyIGdyaWRCb3R0b20gPSBjdHguZ3JpZEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTsKICAgIGlmIChncmlkQm90dG9tIDwgZG9jSCArIDIwMCkgbG9hZE5leHQoZmFsc2UpOwogIH0KCiAgZnVuY3Rpb24gdmlzaWJsZUl0ZW1zKCkgewogICAgdmFyIGxpc3QgPSBjdHguaXRlbXMuc2xpY2UoKTsKCiAgICBpZiAoY3R4LmluZHVzdHJ5KSB7CiAgICAgIHZhciBrZXkgPSBjdHguaW5kdXN0cnk7CiAgICAgIGxpc3QgPSBsaXN0LmZpbHRlcihmdW5jdGlvbiAoaW1nKSB7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGltZy50YWdzKSB8fCAhaW1nLnRhZ3MubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbWcudGFncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKFN0cmluZyhpbWcudGFnc1tpXSkudG9Mb3dlckNhc2UoKSA9PT0ga2V5LnRvTG93ZXJDYXNlKCkpIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0pOwogICAgfQoKICAgIGlmIChjdHgucXVlcnkpIHsKICAgICAgdmFyIHEgPSBjdHgucXVlcnk7CiAgICAgIHZhciBzY29yZWQgPSBbXTsKICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCBsaXN0Lmxlbmd0aDsgcysrKSB7CiAgICAgICAgdmFyIHNjID0gZnV6enlTY29yZShxLCBzZWFyY2hIYXlzdGFjayhsaXN0W3NdKSk7CiAgICAgICAgaWYgKHNjID4gMCkgc2NvcmVkLnB1c2goeyBpbWc6IGxpc3Rbc10sIHNjOiBzYyB9KTsKICAgICAgfQogICAgICBzY29yZWQuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYi5zYyAtIGEuc2M7IH0pOwogICAgICByZXR1cm4gc2NvcmVkLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5pbWc7IH0pOwogICAgfQoKICAgIHZhciBkZWYgPSBudWxsOwogICAgZm9yICh2YXIgayA9IDA7IGsgPCBTT1JUUy5sZW5ndGg7IGsrKykgaWYgKFNPUlRTW2tdLmtleSA9PT0gY3R4LnNvcnQpIGRlZiA9IFNPUlRTW2tdOwogICAgaWYgKGRlZikgbGlzdC5zb3J0KGRlZi5jbXApOwogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBmdW5jdGlvbiBhdmFpbGFibGVUYWdzKCkgewogICAgdmFyIHNldCA9IHt9OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdHguaXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHQgPSBjdHguaXRlbXNbaV0udGFnczsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpIGZvciAodmFyIGogPSAwOyBqIDwgdC5sZW5ndGg7IGorKykgaWYgKHRbal0pIHNldFtTdHJpbmcodFtqXSkudG9Mb3dlckNhc2UoKV0gPSB0cnVlOwogICAgfQogICAgcmV0dXJuIHNldDsKICB9CgogIGZ1bmN0aW9uIGxvYWRGb2xkZXJzKCkgewogICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkuZm9sZGVycyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7CiAgICByZXR1cm4gVi5hcGkuZm9sZGVycygpLnRoZW4oZnVuY3Rpb24gKGxpc3QpIHsKICAgICAgY3R4LmZvbGRlcnMgPSBBcnJheS5pc0FycmF5KGxpc3QpID8gbGlzdCA6IFtdOwogICAgICBjdHguZm9sZGVyc0xvYWRlZCA9IHRydWU7CiAgICAgIHJldHVybiBjdHguZm9sZGVyczsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgY3R4LmZvbGRlcnNMb2FkZWQgPSB0cnVlOwogICAgICByZXR1cm4gY3R4LmZvbGRlcnM7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIG9wZW5Gb2xkZXJzTWFuYWdlcigpIHsKICAgIHZhciB3cmFwID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vZGFsLWJvZHknIH0pOwogICAgd3JhcC5hcHBlbmRDaGlsZChlbCgnaDMnLCB7IGNsYXNzOiAndi1tb2RhbC10aXRsZScsIHRleHQ6ICdGb2xkZXJzJyB9KSk7CgogICAgdmFyIGxpc3RFbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1tZCcgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKGxpc3RFbCk7CgogICAgZnVuY3Rpb24gcmVwYWludCgpIHsKICAgICAgbGlzdEVsLmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWN0eC5mb2xkZXJzLmxlbmd0aCkgewogICAgICAgIGxpc3RFbC5hcHBlbmRDaGlsZChlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19zdWInLCB0ZXh0OiAnTm8gZm9sZGVycyB5ZXQuIENyZWF0ZSBvbmUgYmVsb3cuJyB9KSk7CiAgICAgIH0KICAgICAgY3R4LmZvbGRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZikgewogICAgICAgIHZhciByb3cgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytcm93IHYtcm93LS1iZXR3ZWVuJyB9LAogICAgICAgICAgZWwoJ2J1dHRvbicsIHsKICAgICAgICAgICAgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgICAgIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgbS5jbG9zZSgpOyBvcGVuRm9sZGVyKGYuaWQsIGYubmFtZSk7IH0KICAgICAgICAgIH0sIGljb24oJ2ZvbGRlcicpLCBlbCgnc3BhbicsIHsgdGV4dDogZi5uYW1lIH0pLCBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHNfX251bScsIHRleHQ6ICcoJyArIChmLmltYWdlQ291bnQgfHwgMCkgKyAnKScgfSkpLAogICAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXJvdycgfSwKICAgICAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIHRpdGxlOiAnUmVuYW1lJywgJ2FyaWEtbGFiZWwnOiAnUmVuYW1lIGZvbGRlcicsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgcmVuYW1lRm9sZGVyRmxvdyhmLCByZXBhaW50KTsgfSB9LCBpY29uKCdlZGl0JykpLAogICAgICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1kYW5nZXIgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIHRpdGxlOiAnRGVsZXRlJywgJ2FyaWEtbGFiZWwnOiAnRGVsZXRlIGZvbGRlcicsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgZGVsZXRlRm9sZGVyRmxvdyhmLCByZXBhaW50KTsgfSB9LCBpY29uKCd0cmFzaCcpKQogICAgICAgICAgKQogICAgICAgICk7CiAgICAgICAgbGlzdEVsLmFwcGVuZENoaWxkKHJvdyk7CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBuYW1lSW5wdXQgPSBlbCgnaW5wdXQnLCB7IGNsYXNzOiAndi1maWVsZCcsIHR5cGU6ICd0ZXh0JywgcGxhY2Vob2xkZXI6ICdOZXcgZm9sZGVyIG5hbWUnLCBtYXhsZW5ndGg6ICc2MCcgfSk7CiAgICB2YXIgY3JlYXRlQnRuID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJyB9LCBpY29uKCdwbHVzJyksICdDcmVhdGUnKTsKICAgIGNyZWF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG4gPSAobmFtZUlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIGlmICghbikgeyBuYW1lSW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIGNyZWF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICAgIFYuYXBpLmNyZWF0ZUZvbGRlcihuKS50aGVuKGZ1bmN0aW9uIChmKSB7CiAgICAgICAgaWYgKGYpIGN0eC5mb2xkZXJzLnB1c2goZik7CiAgICAgICAgbmFtZUlucHV0LnZhbHVlID0gJyc7CiAgICAgICAgY3JlYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgcmVwYWludCgpOwogICAgICAgIHRvYXN0KCdGb2xkZXIgY3JlYXRlZCcsICdzdWNjZXNzJyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgY3JlYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7IHRvYXN0KCdDb3VsZCBub3QgY3JlYXRlIGZvbGRlcicsICdlcnJvcicpOyB9KTsKICAgIH0pOwogICAgbmFtZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkgeyBpZiAoZS5rZXkgPT09ICdFbnRlcicpIGNyZWF0ZUJ0bi5jbGljaygpOyB9KTsKCiAgICB3cmFwLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1yb3cgdi1tb2RhbC1hY3Rpb25zJyB9LCBuYW1lSW5wdXQsIGNyZWF0ZUJ0bikpOwoKICAgIHZhciBtID0gbW9kYWwod3JhcCwge30pOwoKICAgIGlmICghY3R4LmZvbGRlcnNMb2FkZWQpIHsKICAgICAgbGlzdEVsLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtZW1wdHlfX3N1YicsIHRleHQ6ICdMb2FkaW5n4oCmJyB9KSk7CiAgICAgIGxvYWRGb2xkZXJzKCkudGhlbihyZXBhaW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlcGFpbnQoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbmFtZUZvbGRlckZsb3coZm9sZGVyLCBhZnRlcikgewogICAgdmFyIGlucHV0ID0gZWwoJ2lucHV0JywgeyBjbGFzczogJ3YtZmllbGQnLCB0eXBlOiAndGV4dCcsIHZhbHVlOiBmb2xkZXIubmFtZSwgbWF4bGVuZ3RoOiAnNjAnIH0pOwogICAgdmFyIHNhdmUgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1wcmltYXJ5IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nLCB0ZXh0OiAnU2F2ZScgfSk7CiAgICB2YXIgY2FuY2VsID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIHRleHQ6ICdDYW5jZWwnIH0pOwogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtbW9kYWwtYm9keScgfSwKICAgICAgZWwoJ2gzJywgeyBjbGFzczogJ3YtbW9kYWwtdGl0bGUnLCB0ZXh0OiAnUmVuYW1lIEZvbGRlcicgfSksCiAgICAgIGlucHV0LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytcm93IHYtbW9kYWwtYWN0aW9ucycgfSwgY2FuY2VsLCBzYXZlKSk7CiAgICB2YXIgbSA9IG1vZGFsKHdyYXAsIHt9KTsKICAgIGNhbmNlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgbS5jbG9zZSgpOyB9KTsKICAgIHNhdmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBuID0gKGlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIGlmICghbikgeyBpbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgc2F2ZS5kaXNhYmxlZCA9IHRydWU7CiAgICAgIFYuYXBpLnJlbmFtZUZvbGRlcihmb2xkZXIuaWQsIG4pLnRoZW4oZnVuY3Rpb24gKGYpIHsKICAgICAgICBmb2xkZXIubmFtZSA9IChmICYmIGYubmFtZSkgfHwgbjsKICAgICAgICBtLmNsb3NlKCk7CiAgICAgICAgaWYgKGFmdGVyKSBhZnRlcigpOwogICAgICAgIHRvYXN0KCdGb2xkZXIgcmVuYW1lZCcsICdzdWNjZXNzJyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgc2F2ZS5kaXNhYmxlZCA9IGZhbHNlOyB0b2FzdCgnUmVuYW1lIGZhaWxlZCcsICdlcnJvcicpOyB9KTsKICAgIH0pOwogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGlucHV0LmZvY3VzKCk7IGlucHV0LnNlbGVjdCgpOyB9LCAzMCk7CiAgfQoKICBmdW5jdGlvbiBkZWxldGVGb2xkZXJGbG93KGZvbGRlciwgYWZ0ZXIpIHsKICAgIGNvbmZpcm1EaWFsb2coJ0RlbGV0ZSBmb2xkZXIgIicgKyBmb2xkZXIubmFtZSArICciPyBJbWFnZXMgaW5zaWRlIGFyZSBrZXB0IChqdXN0IHVuLWZpbGVkKS4nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIFYuYXBpLmRlbGV0ZUZvbGRlcihmb2xkZXIuaWQpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIGN0eC5mb2xkZXJzID0gY3R4LmZvbGRlcnMuZmlsdGVyKGZ1bmN0aW9uIChmKSB7IHJldHVybiBmLmlkICE9PSBmb2xkZXIuaWQ7IH0pOwogICAgICAgIGlmIChjdHguc291cmNlID09PSAnZm9sZGVyJyAmJiBjdHguZm9sZGVySUQgPT09IGZvbGRlci5pZCkgb3BlbkxpYnJhcnkoKTsKICAgICAgICBpZiAoYWZ0ZXIpIGFmdGVyKCk7CiAgICAgICAgdG9hc3QoJ0ZvbGRlciBkZWxldGVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgeyB0b2FzdCgnRGVsZXRlIGZhaWxlZCcsICdlcnJvcicpOyB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gYXNzaWduVG9Gb2xkZXJGbG93KGltYWdlSURzLCBvbkRvbmUpIHsKICAgIHZhciB3cmFwID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vZGFsLWJvZHknIH0pOwogICAgd3JhcC5hcHBlbmRDaGlsZChlbCgnaDMnLCB7IGNsYXNzOiAndi1tb2RhbC10aXRsZScsIHRleHQ6ICdBZGQgJyArIGltYWdlSURzLmxlbmd0aCArICcgdG8gRm9sZGVyJyB9KSk7CiAgICB2YXIgbGlzdEVsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLW1kJyB9KTsKICAgIHdyYXAuYXBwZW5kQ2hpbGQobGlzdEVsKTsKCiAgICBmdW5jdGlvbiBwYWludCgpIHsKICAgICAgbGlzdEVsLmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWN0eC5mb2xkZXJzLmxlbmd0aCkgewogICAgICAgIGxpc3RFbC5hcHBlbmRDaGlsZChlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19zdWInLCB0ZXh0OiAnTm8gZm9sZGVycyB5ZXQg4oCUIGNyZWF0ZSBvbmUgYmVsb3cuJyB9KSk7CiAgICAgIH0KICAgICAgY3R4LmZvbGRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZikgewogICAgICAgIHZhciBiID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicgfSwKICAgICAgICAgIGljb24oJ2ZvbGRlcicpLCBlbCgnc3BhbicsIHsgdGV4dDogZi5uYW1lIH0pLCBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHNfX251bScsIHRleHQ6ICcoJyArIChmLmltYWdlQ291bnQgfHwgMCkgKyAnKScgfSkpOwogICAgICAgIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBiLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgIFYuYXBpLmFzc2lnbkZvbGRlcihmLmlkLCBpbWFnZUlEcykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGYuaW1hZ2VDb3VudCA9IChmLmltYWdlQ291bnQgfHwgMCkgKyBpbWFnZUlEcy5sZW5ndGg7CiAgICAgICAgICAgIG0uY2xvc2UoKTsKICAgICAgICAgICAgdG9hc3QoJ0FkZGVkIHRvICInICsgZi5uYW1lICsgJyInLCAnc3VjY2VzcycpOwogICAgICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoKTsKICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgYi5kaXNhYmxlZCA9IGZhbHNlOyB0b2FzdCgnQ291bGQgbm90IGFkZCB0byBmb2xkZXInLCAnZXJyb3InKTsgfSk7CiAgICAgICAgfSk7CiAgICAgICAgbGlzdEVsLmFwcGVuZENoaWxkKGIpOwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgbmFtZUlucHV0ID0gZWwoJ2lucHV0JywgeyBjbGFzczogJ3YtZmllbGQnLCB0eXBlOiAndGV4dCcsIHBsYWNlaG9sZGVyOiAnTmV3IGZvbGRlciBuYW1lJywgbWF4bGVuZ3RoOiAnNjAnIH0pOwogICAgdmFyIGNyZWF0ZUJ0biA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nIH0sIGljb24oJ3BsdXMnKSwgJ05ldycpOwogICAgY3JlYXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICB2YXIgbiA9IChuYW1lSW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTsKICAgICAgaWYgKCFuKSB7IG5hbWVJbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgY3JlYXRlQnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgVi5hcGkuY3JlYXRlRm9sZGVyKG4pLnRoZW4oZnVuY3Rpb24gKGYpIHsKICAgICAgICBpZiAoZikgY3R4LmZvbGRlcnMucHVzaChmKTsKICAgICAgICBuYW1lSW5wdXQudmFsdWUgPSAnJzsKICAgICAgICBjcmVhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICBwYWludCgpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IGNyZWF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlOyB0b2FzdCgnQ291bGQgbm90IGNyZWF0ZSBmb2xkZXInLCAnZXJyb3InKTsgfSk7CiAgICB9KTsKICAgIG5hbWVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHsgaWYgKGUua2V5ID09PSAnRW50ZXInKSBjcmVhdGVCdG4uY2xpY2soKTsgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1yb3cgdi1tb2RhbC1hY3Rpb25zJyB9LCBuYW1lSW5wdXQsIGNyZWF0ZUJ0bikpOwoKICAgIHZhciBtID0gbW9kYWwod3JhcCwge30pOwogICAgaWYgKCFjdHguZm9sZGVyc0xvYWRlZCkgewogICAgICBsaXN0RWwuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fc3ViJywgdGV4dDogJ0xvYWRpbmfigKYnIH0pKTsKICAgICAgbG9hZEZvbGRlcnMoKS50aGVuKHBhaW50KTsKICAgIH0gZWxzZSBwYWludCgpOwogIH0KCiAgZnVuY3Rpb24gdG9nZ2xlRmF2b3JpdGUoaW1nLCBvbkNoYW5nZSkgewogICAgdmFyIGlkID0gaW1nSWQoaW1nKTsKICAgIGlmICghaWQpIHsgdG9hc3QoJ1RoaXMgaW1hZ2UgaGFzIG5vIHNlcnZlciBpZCB5ZXQnLCAnZXJyb3InKTsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOyB9CiAgICB2YXIgbmV4dCA9ICFpbWcuZmF2b3JpdGVkOwogICAgaW1nLmZhdm9yaXRlZCA9IG5leHQ7CiAgICBpZiAob25DaGFuZ2UpIG9uQ2hhbmdlKCk7CiAgICByZXR1cm4gVi5hcGkuc2V0RmF2b3JpdGUoaWQsIG5leHQpLnRoZW4oZnVuY3Rpb24gKHVwZGF0ZWQpIHsKICAgICAgaWYgKHVwZGF0ZWQgJiYgdHlwZW9mIHVwZGF0ZWQuZmF2b3JpdGVkID09PSAnYm9vbGVhbicpIGltZy5mYXZvcml0ZWQgPSB1cGRhdGVkLmZhdm9yaXRlZDsKICAgICAgdG9hc3QobmV4dCA/ICdBZGRlZCB0byBmYXZvcml0ZXMnIDogJ1JlbW92ZWQgZnJvbSBmYXZvcml0ZXMnLCAnc3VjY2VzcycpOwogICAgICBpZiAob25DaGFuZ2UpIG9uQ2hhbmdlKCk7CiAgICAgIGlmIChjdHguc291cmNlID09PSAnZmF2b3JpdGVzJyAmJiAhaW1nLmZhdm9yaXRlZCkgewogICAgICAgIGN0eC5pdGVtcyA9IGN0eC5pdGVtcy5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGltZ0tleSh4KSAhPT0gaW1nS2V5KGltZyk7IH0pOwogICAgICAgIHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgaW1nLmZhdm9yaXRlZCA9ICFuZXh0OwogICAgICBpZiAob25DaGFuZ2UpIG9uQ2hhbmdlKCk7CiAgICAgIHRvYXN0KCdDb3VsZCBub3QgdXBkYXRlIGZhdm9yaXRlJywgJ2Vycm9yJyk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGRlbGV0ZUltYWdlRmxvdyhpbWcpIHsKICAgIHZhciBpZCA9IGltZ0lkKGltZyk7CiAgICBpZiAoIWlkKSB7IHRvYXN0KCdDYW5ub3QgZGVsZXRlIOKAlCBtaXNzaW5nIGlkJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgY29uZmlybURpYWxvZygnRGVsZXRlIHRoaXMgY3JlYXRpb24/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIFYuYXBpLmRlbGV0ZUltYWdlKGlkKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICBjdHguaXRlbXMgPSBjdHguaXRlbXMuZmlsdGVyKGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWdLZXkoeCkgIT09IGltZ0tleShpbWcpOyB9KTsKICAgICAgICBkZWxldGUgY3R4LnNlbGVjdGVkW2ltZ0tleShpbWcpXTsKICAgICAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2xpYnJhcnknICYmIFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuc2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBjdHguX3NlbGZXcml0ZSA9IHRydWU7CiAgICAgICAgICB0cnkgeyBWLnN0b3JlLnNldCgnbGlicmFyeScsIGN0eC5pdGVtcy5zbGljZSgpKTsgfSBjYXRjaCAoZSkge30KICAgICAgICAgIGN0eC5fc2VsZldyaXRlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7CiAgICAgICAgdG9hc3QoJ0RlbGV0ZWQnLCAnc3VjY2VzcycpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHRvYXN0KCdEZWxldGUgZmFpbGVkJywgJ2Vycm9yJyk7IH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBjb3B5UHJvbXB0KGltZykgewogICAgdmFyIHRleHQgPSBpbWcucHJvbXB0IHx8ICcnOwogICAgaWYgKCF0ZXh0KSB7IHRvYXN0KCdObyBwcm9tcHQgdG8gY29weScsICdpbmZvJyk7IHJldHVybjsgfQogICAgdmFyIGRvbmUgPSBmdW5jdGlvbiAoKSB7IHRvYXN0KCdQcm9tcHQgY29waWVkJywgJ3N1Y2Nlc3MnKTsgfTsKICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7CiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oZG9uZSwgZnVuY3Rpb24gKCkgeyBmYWxsYmFja0NvcHkodGV4dCwgZG9uZSk7IH0pOwogICAgfSBlbHNlIGZhbGxiYWNrQ29weSh0ZXh0LCBkb25lKTsKICB9CgogIGZ1bmN0aW9uIGZhbGxiYWNrQ29weSh0ZXh0LCBkb25lKSB7CiAgICB2YXIgdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogICAgdGEudmFsdWUgPSB0ZXh0OyB0YS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7IHRhLnN0eWxlLm9wYWNpdHkgPSAnMCc7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhKTsgdGEuZm9jdXMoKTsgdGEuc2VsZWN0KCk7CiAgICB0cnkgeyBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOyBkb25lKCk7IH0gY2F0Y2ggKGUpIHsgdG9hc3QoJ0NvcHkgZmFpbGVkJywgJ2Vycm9yJyk7IH0KICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGEpOwogIH0KCiAgZnVuY3Rpb24gZG93bmxvYWRJbWFnZShpbWcpIHsKICAgIHZhciB1cmwgPSBpbWcucmVtb3RlSW1hZ2VVUkwgfHwgaW1nLnZpZGVvVVJMIHx8IGltZy5yZW1vdGVPcmlnaW5hbEltYWdlVVJMOwogICAgaWYgKCF1cmwpIHsgdG9hc3QoJ05vdGhpbmcgdG8gZG93bmxvYWQnLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICB2YXIgZXh0ID0gaW1nLnZpZGVvVVJMID8gJ21wNCcgOiAnanBnJzsKICAgIGRvd25sb2FkKHVybCwgJ3ZhbXAtJyArIChpbWdLZXkoaW1nKSB8fCAnaW1hZ2UnKS5zbGljZSgwLCA4KSArICcuJyArIGV4dCk7CiAgfQoKICBmdW5jdGlvbiBpc1ZpZGVvKGltZykgeyByZXR1cm4gISEoaW1nICYmIGltZy52aWRlb1VSTCk7IH0KCiAgZnVuY3Rpb24gY29weVNoYXJlVGV4dChzdHIpIHsKICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7CiAgICAgIHJldHVybiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzdHIpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH0pOwogICAgfQogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsKICAgICAgICB0YS52YWx1ZSA9IHN0cjsgdGEuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnOyB0YS5zdHlsZS5vcGFjaXR5ID0gJzAnOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOyB0YS5mb2N1cygpOyB0YS5zZWxlY3QoKTsKICAgICAgICB2YXIgb2sgPSBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOwogICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGEpOwogICAgICAgIHJlc29sdmUob2spOwogICAgICB9IGNhdGNoIChlKSB7IHJlc29sdmUoZmFsc2UpOyB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHNoYXJlVVJMRm9yKGltZykgewogICAgdmFyIGlkID0gaW1nSWQoaW1nKTsKICAgIGlmICghaWQpIHJldHVybiBudWxsOwogICAgdmFyIGJhc2UgPSAoVi5jb25maWcgJiYgVi5jb25maWcuQVBJKSA/IFYuY29uZmlnLkFQSSA6ICdodHRwczovL2FwaS52b29zZXkuY29tJzsKICAgIHJldHVybiBiYXNlLnJlcGxhY2UoL1wvKyQvLCAnJykgKyAnL2dlbmVyYXRlZC9yZW5kZXIvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCk7CiAgfQoKICBmdW5jdGlvbiBzaGFyZUltYWdlKGltZykgewogICAgdmFyIHVybCA9IHNoYXJlVVJMRm9yKGltZyk7CiAgICB2YXIgdGV4dCA9IChpbWcucHJvbXB0ID8gaW1nLnByb21wdCArICdcblxuJyA6ICcnKSArICdNYWRlIHdpdGggVmFtcCBieSBWb29zZXkuJzsKICAgIGlmIChuYXZpZ2F0b3Iuc2hhcmUgJiYgdXJsKSB7CiAgICAgIG5hdmlnYXRvci5zaGFyZSh7IHRpdGxlOiAnVmFtcCcsIHRleHQ6IHRleHQsIHVybDogdXJsIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHJldHVybjsKICAgICAgICBjb3B5U2hhcmVMaW5rKHVybCk7CiAgICAgIH0pOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodXJsKSB7IGNvcHlTaGFyZUxpbmsodXJsKTsgcmV0dXJuOyB9CiAgICBpZiAoaW1nLnJlbW90ZUltYWdlVVJMIHx8IGltZy52aWRlb1VSTCkgeyBkb3dubG9hZEltYWdlKGltZyk7IHJldHVybjsgfQogICAgdG9hc3QoJ05vdGhpbmcgdG8gc2hhcmUnLCAnZXJyb3InKTsKICB9CgogIGZ1bmN0aW9uIGNvcHlTaGFyZUxpbmsodXJsKSB7CiAgICBjb3B5U2hhcmVUZXh0KHVybCkudGhlbihmdW5jdGlvbiAob2spIHsKICAgICAgdG9hc3Qob2sgPyAnU2hhcmUgbGluayBjb3BpZWQnIDogJ0NvcHkgdGhpcyBsaW5rOiAnICsgdXJsLCBvayA/ICdzdWNjZXNzJyA6ICdpbmZvJyk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHJlbWl4SW1hZ2UoaW1nKSB7CiAgICB2YXIgcGFyYW1zID0gW107CiAgICBpZiAoaW1nLnByb21wdCkgcGFyYW1zLnB1c2goJ3Byb21wdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGltZy5wcm9tcHQpKTsKICAgIGlmIChpbWcubW9kZWwpIHBhcmFtcy5wdXNoKCdtb2RlbD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGltZy5tb2RlbCkpOwogICAgdmFyIHNyYyA9IGltZy5yZW1vdGVJbWFnZVVSTCB8fCBpbWcucmVtb3RlT3JpZ2luYWxJbWFnZVVSTDsKICAgIGlmIChzcmMpIHBhcmFtcy5wdXNoKCdpbWFnZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHNyYykpOwogICAgY2FwdHVyZVNjcm9sbCgpOwogICAgZ28oJyMvY3JlYXRlJyArIChwYXJhbXMubGVuZ3RoID8gJz8nICsgcGFyYW1zLmpvaW4oJyYnKSA6ICcnKSk7CiAgfQoKICBmdW5jdGlvbiBjbG9zZU1lbnUoKSB7CiAgICBpZiAoY3R4ICYmIGN0eC5tZW51RWwgJiYgY3R4Lm1lbnVFbC5wYXJlbnROb2RlKSBjdHgubWVudUVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY3R4Lm1lbnVFbCk7CiAgICBpZiAoY3R4KSBjdHgubWVudUVsID0gbnVsbDsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25Eb2NDbGlja0Nsb3NlTWVudSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25NZW51S2V5LCB0cnVlKTsKICB9CgogIGZ1bmN0aW9uIG9uRG9jQ2xpY2tDbG9zZU1lbnUoZSkgewogICAgaWYgKGN0eCAmJiBjdHgubWVudUVsICYmICFjdHgubWVudUVsLmNvbnRhaW5zKGUudGFyZ2V0KSkgY2xvc2VNZW51KCk7CiAgfQogIGZ1bmN0aW9uIG9uTWVudUtleShlKSB7IGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNsb3NlTWVudSgpOyB9CgogIGZ1bmN0aW9uIG9wZW5Db250ZXh0TWVudShpbWcsIHgsIHksIG9uQ2hhbmdlKSB7CiAgICBjbG9zZU1lbnUoKTsKICAgIHZhciBtZW51ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1lbnUgZ2xhc3MtY2FyZCcsIHJvbGU6ICdtZW51JyB9KTsKICAgIFMobWVudSwgJ21pbi13aWR0aDoyMDBweDtwYWRkaW5nOjZweDtib3JkZXItcmFkaXVzOnZhcigtLXYtcmFkaXVzLXNtLDE1cHgpO2JhY2tncm91bmQ6JyArIEdMQVNTX0JHICsgJztib3JkZXI6MXB4IHNvbGlkICcgKyBMSU5FICsgJztib3gtc2hhZG93OjAgMTZweCA0OHB4IHJnYmEoMCwwLDAsLjQ1KTtvdmVyZmxvdzpoaWRkZW4nKTsKCiAgICBmdW5jdGlvbiBpdGVtKGxhYmVsLCBpYywgZm4sIGRhbmdlcikgewogICAgICB2YXIgYiA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1tZW51X19pdGVtJyArIChkYW5nZXIgPyAnIHYtbWVudV9faXRlbS0tZGFuZ2VyJyA6ICcnKSwgdHlwZTogJ2J1dHRvbicsIHJvbGU6ICdtZW51aXRlbScgfSwKICAgICAgICBpYyA/IGljb24oaWMpIDogbnVsbCwgZWwoJ3NwYW4nLCB7IHRleHQ6IGxhYmVsIH0pKTsKICAgICAgUyhiLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDt3aWR0aDoxMDAlO3BhZGRpbmc6MTBweCAxMnB4O2JvcmRlcjowO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6JyArIChkYW5nZXIgPyAndmFyKC0tY29sb3ItZXJyb3IsICNGNzMzNjMpJyA6ICd2YXIoLS12LWluaywgI2Y1ZjVmNyknKSArICc7Zm9udDppbmhlcml0O2ZvbnQtc2l6ZToxNHB4O3RleHQtYWxpZ246bGVmdDtib3JkZXItcmFkaXVzOjlweDtjdXJzb3I6cG9pbnRlcicpOwogICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBmdW5jdGlvbiAoKSB7IGIuc3R5bGUuYmFja2dyb3VuZCA9IGRhbmdlciA/ICdyZ2JhKDI0Nyw1MSw5OSwuMTQpJyA6ICdyZ2JhKDI1NSwyNTUsMjU1LC4wNyknOyB9KTsKICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKCkgeyBiLnN0eWxlLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnOyB9KTsKICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGZ1bmN0aW9uICgpIHsgYi5zdHlsZS5iYWNrZ3JvdW5kID0gZGFuZ2VyID8gJ3JnYmEoMjQ3LDUxLDk5LC4xNCknIDogJ3JnYmEoMjU1LDI1NSwyNTUsLjA3KSc7IH0pOwogICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbiAoKSB7IGIuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7IH0pOwogICAgICBiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBjbG9zZU1lbnUoKTsgZm4oKTsgfSk7CiAgICAgIHJldHVybiBiOwogICAgfQoKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbSgnT3BlbicsICdncmlkJywgZnVuY3Rpb24gKCkgeyBvcGVuSW1hZ2UoaW1nKTsgfSkpOwogICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKCdSZW1peCcsICd2YXJpYXRpb25zJywgZnVuY3Rpb24gKCkgeyByZW1peEltYWdlKGltZyk7IH0pKTsKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbShpbWcuZmF2b3JpdGVkID8gJ1VuZmF2b3JpdGUnIDogJ0Zhdm9yaXRlJywgaW1nLmZhdm9yaXRlZCA/ICdoZWFydEZpbGwnIDogJ2hlYXJ0JywgZnVuY3Rpb24gKCkgeyB0b2dnbGVGYXZvcml0ZShpbWcsIG9uQ2hhbmdlKTsgfSkpOwogICAgbWVudS5hcHBlbmRDaGlsZChpdGVtKCdBZGQgdG8gRm9sZGVyJywgJ2ZvbGRlcicsIGZ1bmN0aW9uICgpIHsgYXNzaWduVG9Gb2xkZXJGbG93KFtpbWdJZChpbWcpXSk7IH0pKTsKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbSgnQ29weSBQcm9tcHQnLCAnY29weScsIGZ1bmN0aW9uICgpIHsgY29weVByb21wdChpbWcpOyB9KSk7CiAgICBtZW51LmFwcGVuZENoaWxkKGl0ZW0oJ1NoYXJlJywgJ3NoYXJlJywgZnVuY3Rpb24gKCkgeyBzaGFyZUltYWdlKGltZyk7IH0pKTsKICAgIG1lbnUuYXBwZW5kQ2hpbGQoaXRlbSgnRG93bmxvYWQnLCAnZG93bmxvYWQnLCBmdW5jdGlvbiAoKSB7IGRvd25sb2FkSW1hZ2UoaW1nKTsgfSkpOwogICAgbWVudS5hcHBlbmRDaGlsZChTKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tZW51X19zZXAnIH0pLCAnaGVpZ2h0OjFweDttYXJnaW46NnB4IDhweDtiYWNrZ3JvdW5kOicgKyBMSU5FKSk7CiAgICBtZW51LmFwcGVuZENoaWxkKGl0ZW0oJ0RlbGV0ZScsICd0cmFzaCcsIGZ1bmN0aW9uICgpIHsgZGVsZXRlSW1hZ2VGbG93KGltZyk7IH0sIHRydWUpKTsKCiAgICBtZW51LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJzsKICAgIG1lbnUuc3R5bGUuekluZGV4ID0gJzEyMDAnOwogICAgbWVudS5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnOwogICAgbWVudS5zdHlsZS50b3AgPSAnMCc7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lbnUpOwogICAgY3R4Lm1lbnVFbCA9IG1lbnU7CgogICAgdmFyIHJlY3QgPSBtZW51LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgdmFyIHZ3ID0gd2luZG93LmlubmVyV2lkdGgsIHZoID0gd2luZG93LmlubmVySGVpZ2h0OwogICAgdmFyIHB4ID0gTWF0aC5taW4oeCwgdncgLSByZWN0LndpZHRoIC0gOCk7CiAgICB2YXIgcHkgPSBNYXRoLm1pbih5LCB2aCAtIHJlY3QuaGVpZ2h0IC0gOCk7CiAgICBtZW51LnN0eWxlLmxlZnQgPSBNYXRoLm1heCg4LCBweCkgKyAncHgnOwogICAgbWVudS5zdHlsZS50b3AgPSBNYXRoLm1heCg4LCBweSkgKyAncHgnOwoKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uRG9jQ2xpY2tDbG9zZU1lbnUsIHRydWUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25NZW51S2V5LCB0cnVlKTsKICAgIH0sIDApOwogIH0KCiAgZnVuY3Rpb24gb3BlbkltYWdlKGltZykgewogICAgdmFyIGlkID0gaW1nSWQoaW1nKTsKICAgIGlmICghaWQpIHsgdG9hc3QoJ1RoaXMgY3JlYXRpb24gaXMgbm90IHNhdmVkIHlldCcsICdpbmZvJyk7IHJldHVybjsgfQogICAgY2FwdHVyZVNjcm9sbCgpOwogICAgZ28oJyMvaW1hZ2UvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCkpOwogIH0KCiAgZnVuY3Rpb24gY2FwdHVyZVNjcm9sbCgpIHsKICAgIGN0eC5zY3JvbGxZID0gKGN0eC5zY3JvbGxUYXJnZXQgJiYgY3R4LnNjcm9sbFRhcmdldCAhPT0gd2luZG93KQogICAgICA/IGN0eC5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wCiAgICAgIDogKHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IDApOwogICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuc2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7IFYuc3RvcmUuc2V0KCdsaWJyYXJ5U2Nyb2xsWScsIGN0eC5zY3JvbGxZKTsgfSBjYXRjaCAoZSkge30KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlc3RvcmVTY3JvbGwoKSB7CiAgICB2YXIgeSA9IGN0eC5zY3JvbGxZOwogICAgaWYgKCF5ICYmIFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuZ2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7IHkgPSBWLnN0b3JlLmdldCgnbGlicmFyeVNjcm9sbFknKSB8fCAwOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgaWYgKCF5KSByZXR1cm47CiAgICB2YXIgYXBwbHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChjdHguc2Nyb2xsVGFyZ2V0ICYmIGN0eC5zY3JvbGxUYXJnZXQgIT09IHdpbmRvdykgY3R4LnNjcm9sbFRhcmdldC5zY3JvbGxUb3AgPSB5OwogICAgICBlbHNlIHdpbmRvdy5zY3JvbGxUbygwLCB5KTsKICAgIH07CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkgeyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYXBwbHkpOyB9KTsKICB9CgogIGZ1bmN0aW9uIGVudGVyU2VsZWN0KGluaXRpYWxJbWcpIHsKICAgIGN0eC5zZWxlY3RNb2RlID0gdHJ1ZTsKICAgIGlmIChpbml0aWFsSW1nKSBjdHguc2VsZWN0ZWRbaW1nS2V5KGluaXRpYWxJbWcpXSA9IHRydWU7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICByZW5kZXJHcmlkKCk7CiAgfQogIGZ1bmN0aW9uIGV4aXRTZWxlY3QoKSB7CiAgICBjdHguc2VsZWN0TW9kZSA9IGZhbHNlOwogICAgY3R4LnNlbGVjdGVkID0ge307CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICByZW5kZXJHcmlkKCk7CiAgfQogIGZ1bmN0aW9uIHRvZ2dsZVNlbGVjdChpbWcpIHsKICAgIHZhciBrID0gaW1nS2V5KGltZyk7CiAgICBpZiAoY3R4LnNlbGVjdGVkW2tdKSBkZWxldGUgY3R4LnNlbGVjdGVkW2tdOwogICAgZWxzZSBjdHguc2VsZWN0ZWRba10gPSB0cnVlOwogICAgcmVuZGVyVG9vbGJhcigpOwogICAgcmVuZGVyU2VsZWN0aW9uU3RhdGVGb3Ioayk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGVkQ291bnQoKSB7IHJldHVybiBPYmplY3Qua2V5cyhjdHguc2VsZWN0ZWQpLmxlbmd0aDsgfQogIGZ1bmN0aW9uIHNlbGVjdGVkSW1hZ2VzKCkgewogICAgdmFyIG91dCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdHguaXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGN0eC5zZWxlY3RlZFtpbWdLZXkoY3R4Lml0ZW1zW2ldKV0pIG91dC5wdXNoKGN0eC5pdGVtc1tpXSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBmdW5jdGlvbiBzZWxlY3RBbGxWaXNpYmxlKCkgewogICAgdmFyIHZpcyA9IHZpc2libGVJdGVtcygpOwogICAgdmFyIGFsbFNlbGVjdGVkID0gdmlzLmxlbmd0aCAmJiB2aXMuZXZlcnkoZnVuY3Rpb24gKGltZykgeyByZXR1cm4gY3R4LnNlbGVjdGVkW2ltZ0tleShpbWcpXTsgfSk7CiAgICBpZiAoYWxsU2VsZWN0ZWQpIGN0eC5zZWxlY3RlZCA9IHt9OwogICAgZWxzZSB2aXMuZm9yRWFjaChmdW5jdGlvbiAoaW1nKSB7IGN0eC5zZWxlY3RlZFtpbWdLZXkoaW1nKV0gPSB0cnVlOyB9KTsKICAgIHJlbmRlclRvb2xiYXIoKTsKICAgIHJlbmRlckdyaWQoKTsKICB9CgogIGZ1bmN0aW9uIHJlbmRlclNlbGVjdGlvblN0YXRlRm9yKGtleSkgewogICAgaWYgKCFjdHguZ3JpZEVsKSByZXR1cm47CiAgICB2YXIgY2VsbCA9IGN0eC5ncmlkRWwucXVlcnlTZWxlY3RvcignW2RhdGEta2V5PSInICsgY3NzRXNjKGtleSkgKyAnIl0nKTsKICAgIGlmICghY2VsbCkgcmV0dXJuOwogICAgdmFyIG9uID0gISFjdHguc2VsZWN0ZWRba2V5XTsKICAgIGNlbGwuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtc2VsZWN0ZWQnLCBvbik7CiAgICB2YXIgY2IgPSBjZWxsLnF1ZXJ5U2VsZWN0b3IoJy52LWxpYi1jaGVjaycpOwogICAgaWYgKGNiKSB7CiAgICAgIGNiLmNsYXNzTGlzdC50b2dnbGUoJ2lzLW9uJywgb24pOwogICAgICBjYi5zZXRBdHRyaWJ1dGUoJ2FyaWEtY2hlY2tlZCcsIG9uID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgICAgIGNiLnN0eWxlLmJhY2tncm91bmQgPSBvbiA/IEdSQURJRU5UIDogQkFER0VfQkc7CiAgICAgIGNiLmlubmVySFRNTCA9ICcnOwogICAgICBpZiAob24pIGNiLmFwcGVuZENoaWxkKGljb24oJ2NoZWNrJykpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3NzRXNjKHMpIHsKICAgIGlmICh3aW5kb3cuQ1NTICYmIENTUy5lc2NhcGUpIHJldHVybiBDU1MuZXNjYXBlKHMpOwogICAgcmV0dXJuIFN0cmluZyhzKS5yZXBsYWNlKC9bIlxcXF1cW10vZywgJ1xcJCYnKTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoRGVsZXRlKCkgewogICAgdmFyIGltZ3MgPSBzZWxlY3RlZEltYWdlcygpOwogICAgaWYgKCFpbWdzLmxlbmd0aCkgcmV0dXJuOwogICAgY29uZmlybURpYWxvZygnRGVsZXRlICcgKyBpbWdzLmxlbmd0aCArICcgY3JlYXRpb24nICsgKGltZ3MubGVuZ3RoID4gMSA/ICdzJyA6ICcnKSArICc/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIHZhciBqb2JzID0gaW1ncy5tYXAoZnVuY3Rpb24gKGltZykgewogICAgICAgIHZhciBpZCA9IGltZ0lkKGltZyk7CiAgICAgICAgaWYgKCFpZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgICAgICByZXR1cm4gVi5hcGkuZGVsZXRlSW1hZ2UoaWQpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gaW1nS2V5KGltZyk7IH0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH0pOwogICAgICB9KTsKICAgICAgUHJvbWlzZS5hbGwoam9icykudGhlbihmdW5jdGlvbiAocmVzdWx0cykgewogICAgICAgIHZhciByZW1vdmVkID0ge307CiAgICAgICAgcmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IGlmIChrKSByZW1vdmVkW2tdID0gdHJ1ZTsgfSk7CiAgICAgICAgY3R4Lml0ZW1zID0gY3R4Lml0ZW1zLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4gIXJlbW92ZWRbaW1nS2V5KHgpXTsgfSk7CiAgICAgICAgdmFyIGZhaWxlZCA9IHJlc3VsdHMuZmlsdGVyKGZ1bmN0aW9uIChrKSB7IHJldHVybiAhazsgfSkubGVuZ3RoOwogICAgICAgIGlmIChjdHguc291cmNlID09PSAnbGlicmFyeScgJiYgVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5zZXQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGN0eC5fc2VsZldyaXRlID0gdHJ1ZTsKICAgICAgICAgIHRyeSB7IFYuc3RvcmUuc2V0KCdsaWJyYXJ5JywgY3R4Lml0ZW1zLnNsaWNlKCkpOyB9IGNhdGNoIChlKSB7fQogICAgICAgICAgY3R4Ll9zZWxmV3JpdGUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZXhpdFNlbGVjdCgpOwogICAgICAgIHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7CiAgICAgICAgaWYgKGZhaWxlZCkgdG9hc3QoZmFpbGVkICsgJyBjb3VsZCBub3QgYmUgZGVsZXRlZCcsICdlcnJvcicpOwogICAgICAgIGVsc2UgdG9hc3QoJ0RlbGV0ZWQgJyArIE9iamVjdC5rZXlzKHJlbW92ZWQpLmxlbmd0aCwgJ3N1Y2Nlc3MnKTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoQXNzaWduKCkgewogICAgdmFyIGlkcyA9IHNlbGVjdGVkSW1hZ2VzKCkubWFwKGltZ0lkKS5maWx0ZXIoQm9vbGVhbik7CiAgICBpZiAoIWlkcy5sZW5ndGgpIHJldHVybjsKICAgIGFzc2lnblRvRm9sZGVyRmxvdyhpZHMsIGZ1bmN0aW9uICgpIHsgZXhpdFNlbGVjdCgpOyB9KTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoRG93bmxvYWQoKSB7CiAgICB2YXIgaW1ncyA9IHNlbGVjdGVkSW1hZ2VzKCk7CiAgICBpZiAoIWltZ3MubGVuZ3RoKSByZXR1cm47CiAgICBpbWdzLmZvckVhY2goZnVuY3Rpb24gKGltZywgaSkgewogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgZG93bmxvYWRJbWFnZShpbWcpOyB9LCBpICogMjUwKTsKICAgIH0pOwogICAgdG9hc3QoJ0Rvd25sb2FkaW5nICcgKyBpbWdzLmxlbmd0aCwgJ2luZm8nKTsKICB9CgogIGZ1bmN0aW9uIGJhdGNoU2hhcmUoKSB7CiAgICB2YXIgaW1ncyA9IHNlbGVjdGVkSW1hZ2VzKCk7CiAgICBpZiAoIWltZ3MubGVuZ3RoKSByZXR1cm47CiAgICBpZiAoaW1ncy5sZW5ndGggPT09IDEpIHsgc2hhcmVJbWFnZShpbWdzWzBdKTsgcmV0dXJuOyB9CiAgICB2YXIgbGluZXMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1ncy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgdXJsID0gc2hhcmVVUkxGb3IoaW1nc1tpXSk7CiAgICAgIGlmICh1cmwpIGxpbmVzLnB1c2godXJsKTsKICAgIH0KICAgIGlmICghbGluZXMubGVuZ3RoKSB7IHRvYXN0KCdUaGVzZSBjcmVhdGlvbnMgaGF2ZSBubyBzaGFyZSBsaW5rcyB5ZXQnLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICB2YXIgdGV4dCA9IGxpbmVzLmpvaW4oJ1xuJyk7CiAgICBpZiAobmF2aWdhdG9yLnNoYXJlKSB7CiAgICAgIG5hdmlnYXRvci5zaGFyZSh7IHRpdGxlOiAnVmFtcCcsIHRleHQ6ICdNYWRlIHdpdGggVmFtcCBieSBWb29zZXkuJywgdXJsOiBsaW5lc1swXSB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgaWYgKGVyciAmJiBlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47CiAgICAgICAgY29weVNoYXJlVGV4dCh0ZXh0KS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/IGxpbmVzLmxlbmd0aCArICcgbGlua3MgY29waWVkJyA6ICdDb3VsZCBub3QgY29weSBsaW5rcycsIG9rID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJyk7IH0pOwogICAgICB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29weVNoYXJlVGV4dCh0ZXh0KS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/IGxpbmVzLmxlbmd0aCArICcgbGlua3MgY29waWVkJyA6ICdDb3VsZCBub3QgY29weSBsaW5rcycsIG9rID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJyk7IH0pOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyVG9vbGJhcigpIHsKICAgIGlmICghY3R4LnRvb2xiYXJFbCkgcmV0dXJuOwogICAgY3R4LnRvb2xiYXJFbC5pbm5lckhUTUwgPSAnJzsKCiAgICBpZiAoY3R4LnNlbGVjdE1vZGUpIHsKICAgICAgdmFyIGJhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItc2VsYmFyIGdsYXNzLWNhcmQnIH0sCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsICdhcmlhLWxhYmVsJzogJ0V4aXQgc2VsZWN0aW9uJywgdGl0bGU6ICdEb25lJywgb25jbGljazogZXhpdFNlbGVjdCB9LCBpY29uKCdjbG9zZScpLCAnRG9uZScpLAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6IHNlbGVjdGVkQ291bnQoKSArICcgc2VsZWN0ZWQnIH0pLAogICAgICAgIFMoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1saWItc3BhY2VyJyB9KSwgJ2ZsZXg6MSAxIGF1dG8nKSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgb25jbGljazogc2VsZWN0QWxsVmlzaWJsZSB9LCAnU2VsZWN0IEFsbCcpLAogICAgICAgIGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nLCBkaXNhYmxlZDogc2VsZWN0ZWRDb3VudCgpID8gbnVsbCA6ICdkaXNhYmxlZCcsIG9uY2xpY2s6IGJhdGNoU2hhcmUgfSwgaWNvbignc2hhcmUnKSwgJ1NoYXJlJyksCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3Qgdi1jdGEtLXNtJywgdHlwZTogJ2J1dHRvbicsIGRpc2FibGVkOiBzZWxlY3RlZENvdW50KCkgPyBudWxsIDogJ2Rpc2FibGVkJywgb25jbGljazogYmF0Y2hEb3dubG9hZCB9LCBpY29uKCdkb3dubG9hZCcpLCAnRG93bmxvYWQnKSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgZGlzYWJsZWQ6IHNlbGVjdGVkQ291bnQoKSA/IG51bGwgOiAnZGlzYWJsZWQnLCBvbmNsaWNrOiBiYXRjaEFzc2lnbiB9LCBpY29uKCdmb2xkZXInKSwgJ0ZvbGRlcicpLAogICAgICAgIGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWRhbmdlciB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgZGlzYWJsZWQ6IHNlbGVjdGVkQ291bnQoKSA/IG51bGwgOiAnZGlzYWJsZWQnLCBvbmNsaWNrOiBiYXRjaERlbGV0ZSB9LCBpY29uKCd0cmFzaCcpLCAnRGVsZXRlJykKICAgICAgKTsKICAgICAgUyhiYXIsICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZsZXgtd3JhcDp3cmFwO2dhcDo5cHg7cGFkZGluZzoxMHB4IDE0cHg7Ym9yZGVyLXJhZGl1czp2YXIoLS12LXJhZGl1cy1zbSwxNXB4KTttYXJnaW4tYm90dG9tOnZhcigtLXNwYWNlLW1kLDE1cHgpJyk7CiAgICAgIGN0eC50b29sYmFyRWwuYXBwZW5kQ2hpbGQoYmFyKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciB0YWJzID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNoaXAtcm93Jywgcm9sZTogJ3RhYmxpc3QnLCAnYXJpYS1sYWJlbCc6ICdMaWJyYXJ5IHNvdXJjZScgfSk7CiAgICBmdW5jdGlvbiB0YWIobGFiZWwsIHNyYywgaWMsIG9uQ2xpY2spIHsKICAgICAgdmFyIGFjdGl2ZSA9IGN0eC5zb3VyY2UgPT09IHNyYzsKICAgICAgdmFyIGIgPSBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAndi1jaGlwJyArIChhY3RpdmUgPyAnIHYtY2hpcC0tYWN0aXZlJyA6ICcnKSwKICAgICAgICB0eXBlOiAnYnV0dG9uJywgcm9sZTogJ3RhYicsICdhcmlhLXNlbGVjdGVkJzogYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJwogICAgICB9LCBpYyA/IGljb24oaWMpIDogbnVsbCwgZWwoJ3NwYW4nLCB7IHRleHQ6IGxhYmVsIH0pKTsKICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2spOwogICAgICByZXR1cm4gYjsKICAgIH0KICAgIHRhYnMuYXBwZW5kQ2hpbGQodGFiKCdBbGwnLCAnbGlicmFyeScsICdncmlkJywgb3BlbkxpYnJhcnkpKTsKICAgIHRhYnMuYXBwZW5kQ2hpbGQodGFiKCdGYXZvcml0ZXMnLCAnZmF2b3JpdGVzJywgJ2hlYXJ0Jywgb3BlbkZhdm9yaXRlcykpOwogICAgdGFicy5hcHBlbmRDaGlsZCh0YWIoJ0ZvbGRlcnMnLCAnZm9sZGVyJywgJ2ZvbGRlcicsIG9wZW5Gb2xkZXJzTWFuYWdlcikpOwoKICAgIGlmIChjdHguc291cmNlID09PSAnZm9sZGVyJyAmJiBjdHguZm9sZGVySUQpIHsKICAgICAgdmFyIGZuYW1lID0gJyc7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3R4LmZvbGRlcnMubGVuZ3RoOyBpKyspIGlmIChjdHguZm9sZGVyc1tpXS5pZCA9PT0gY3R4LmZvbGRlcklEKSBmbmFtZSA9IGN0eC5mb2xkZXJzW2ldLm5hbWU7CiAgICAgIHZhciBwaWxsID0gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jaGlwIHYtY2hpcC0tYWN0aXZlJyB9LAogICAgICAgIGljb24oJ2ZvbGRlcicpLCBlbCgnc3BhbicsIHsgdGV4dDogZm5hbWUgfHwgJ0ZvbGRlcicgfSksCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWNoaXBfX3gnLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiAnTGVhdmUgZm9sZGVyJywgb25jbGljazogb3BlbkxpYnJhcnkgfSwgaWNvbignY2xvc2UnKSkpOwogICAgICB0YWJzLmFwcGVuZENoaWxkKHBpbGwpOwogICAgfQoKICAgIHZhciBzZWFyY2hJbnB1dCA9IGVsKCdpbnB1dCcsIHsKICAgICAgY2xhc3M6ICd2LWZpZWxkIHYtbGliLXNlYXJjaCcsIHR5cGU6ICdzZWFyY2gnLCBwbGFjZWhvbGRlcjogJ1NlYXJjaCBwcm9tcHRzLCBtb2RlbHMsIHRhZ3PigKYnLAogICAgICB2YWx1ZTogY3R4LnF1ZXJ5LCAnYXJpYS1sYWJlbCc6ICdTZWFyY2ggbGlicmFyeScKICAgIH0pOwogICAgdmFyIG9uU2VhcmNoID0gZGVib3VuY2UoZnVuY3Rpb24gKHZhbCkgewogICAgICBjdHgucXVlcnkgPSB2YWwudHJpbSgpOwogICAgICByZW5kZXJHcmlkKCk7IHJlbmRlclN0YXR1cygpOwogICAgfSwgMjAwKTsKICAgIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24gKCkgeyBvblNlYXJjaChzZWFyY2hJbnB1dC52YWx1ZSk7IH0pOwogICAgUyhzZWFyY2hJbnB1dCwgJ2ZsZXg6MSAxIGF1dG87bWluLXdpZHRoOjAnKTsKICAgIHZhciBzZWFyY2hJY29uID0gaWNvbignc2VhcmNoJyk7CiAgICBTKHNlYXJjaEljb24sICdwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjEycHg7dG9wOjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTtvcGFjaXR5Oi41NTtwb2ludGVyLWV2ZW50czpub25lO2xpbmUtaGVpZ2h0OjAnKTsKICAgIFMoc2VhcmNoSW5wdXQsICdwYWRkaW5nLWxlZnQ6MzZweCcpOwogICAgdmFyIHNlYXJjaFdyYXAgPSBlbCgnbGFiZWwnLCB7IGNsYXNzOiAndi1saWItc2VhcmNod3JhcCcgfSwgc2VhcmNoSWNvbiwgc2VhcmNoSW5wdXQpOwogICAgUyhzZWFyY2hXcmFwLCAncG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4OjEgMSAyMjBweDttaW4td2lkdGg6MTYwcHgnKTsKCiAgICB2YXIgc29ydFNlbCA9IGVsKCdzZWxlY3QnLCB7IGNsYXNzOiAndi1zZWxlY3Qgdi1saWItc29ydCcsICdhcmlhLWxhYmVsJzogJ1NvcnQgbGlicmFyeScgfSk7CiAgICBTT1JUUy5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7CiAgICAgIHZhciBvID0gZWwoJ29wdGlvbicsIHsgdmFsdWU6IHMua2V5LCB0ZXh0OiBzLmxhYmVsIH0pOwogICAgICBpZiAocy5rZXkgPT09IGN0eC5zb3J0KSBvLnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgc29ydFNlbC5hcHBlbmRDaGlsZChvKTsKICAgIH0pOwogICAgc29ydFNlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7IGN0eC5zb3J0ID0gc29ydFNlbC52YWx1ZTsgcmVuZGVyR3JpZCgpOyByZW5kZXJTdGF0dXMoKTsgfSk7CgogICAgdmFyIHNlbEJ0biA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1zbScsIHR5cGU6ICdidXR0b24nLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IGVudGVyU2VsZWN0KCk7IH0gfSwgaWNvbignY2hlY2snKSwgJ1NlbGVjdCcpOwoKICAgIHZhciBjb250cm9scyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItY29udHJvbHMnIH0sIHNlYXJjaFdyYXAsIHNvcnRTZWwsIHNlbEJ0bik7CiAgICBTKGNvbnRyb2xzLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LXdyYXA6d3JhcDtnYXA6OXB4O2ZsZXg6MSAxIDMyMHB4O21pbi13aWR0aDowJyk7CiAgICBTKHRhYnMsICdmbGV4OjAgMCBhdXRvJyk7CgogICAgdmFyIHRvb2xiYXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtbGliLXRvb2xiYXInIH0sIHRhYnMsIGNvbnRyb2xzKTsKICAgIFModG9vbGJhciwgJ2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7ZmxleC13cmFwOndyYXA7Z2FwOjEycHg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47bWFyZ2luLWJvdHRvbTp2YXIoLS1zcGFjZS1tZCwxNXB4KScpOwogICAgY3R4LnRvb2xiYXJFbC5hcHBlbmRDaGlsZCh0b29sYmFyKTsKCiAgICB2YXIgcHJlc2VudCA9IGF2YWlsYWJsZVRhZ3MoKTsKICAgIHZhciBpbmR1c3RyaWVzID0gKFYuZGF0YSAmJiBBcnJheS5pc0FycmF5KFYuZGF0YS5pbmR1c3RyaWVzKSkgPyBWLmRhdGEuaW5kdXN0cmllcyA6IFtdOwogICAgdmFyIGNoaXBzID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWNoaXAtcm93Jywgcm9sZTogJ2dyb3VwJywgJ2FyaWEtbGFiZWwnOiAnRmlsdGVyIGJ5IHRhZycgfSk7CiAgICB2YXIgYWxsQ2hpcCA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jaGlwJyArIChjdHguaW5kdXN0cnkgPyAnJyA6ICcgdi1jaGlwLS1hY3RpdmUnKSwgdHlwZTogJ2J1dHRvbicsIHRleHQ6ICdBbGwnLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IGN0eC5pbmR1c3RyeSA9IG51bGw7IHJlbmRlclRvb2xiYXIoKTsgcmVuZGVyR3JpZCgpOyByZW5kZXJTdGF0dXMoKTsgfSB9KTsKICAgIGNoaXBzLmFwcGVuZENoaWxkKGFsbENoaXApOwogICAgdmFyIGFkZGVkID0ge307CiAgICBpbmR1c3RyaWVzLmZvckVhY2goZnVuY3Rpb24gKGluZCkgewogICAgICBpZiAoIXByZXNlbnRbU3RyaW5nKGluZC5rZXkpLnRvTG93ZXJDYXNlKCldICYmICFwcmVzZW50W1N0cmluZyhpbmQubGFiZWwpLnRvTG93ZXJDYXNlKCldKSByZXR1cm47CiAgICAgIHZhciBrZXkgPSBwcmVzZW50W1N0cmluZyhpbmQua2V5KS50b0xvd2VyQ2FzZSgpXSA/IGluZC5rZXkgOiBpbmQubGFiZWw7CiAgICAgIGFkZGVkW1N0cmluZyhrZXkpLnRvTG93ZXJDYXNlKCldID0gdHJ1ZTsKICAgICAgdmFyIGFjdGl2ZSA9IGN0eC5pbmR1c3RyeSAmJiBjdHguaW5kdXN0cnkudG9Mb3dlckNhc2UoKSA9PT0gU3RyaW5nKGtleSkudG9Mb3dlckNhc2UoKTsKICAgICAgdmFyIGMgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY2hpcCcgKyAoYWN0aXZlID8gJyB2LWNoaXAtLWFjdGl2ZScgOiAnJyksIHR5cGU6ICdidXR0b24nLCB0ZXh0OiBpbmQubGFiZWwgfSk7CiAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7IGN0eC5pbmR1c3RyeSA9IGFjdGl2ZSA/IG51bGwgOiBrZXk7IHJlbmRlclRvb2xiYXIoKTsgcmVuZGVyR3JpZCgpOyByZW5kZXJTdGF0dXMoKTsgfSk7CiAgICAgIGNoaXBzLmFwcGVuZENoaWxkKGMpOwogICAgfSk7CiAgICBPYmplY3Qua2V5cyhwcmVzZW50KS5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHsKICAgICAgaWYgKGFkZGVkW3RhZ10pIHJldHVybjsKICAgICAgdmFyIGFjdGl2ZSA9IGN0eC5pbmR1c3RyeSAmJiBjdHguaW5kdXN0cnkudG9Mb3dlckNhc2UoKSA9PT0gdGFnOwogICAgICB2YXIgYyA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jaGlwJyArIChhY3RpdmUgPyAnIHYtY2hpcC0tYWN0aXZlJyA6ICcnKSwgdHlwZTogJ2J1dHRvbicsIHRleHQ6IHRhZyB9KTsKICAgICAgYy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgY3R4LmluZHVzdHJ5ID0gYWN0aXZlID8gbnVsbCA6IHRhZzsgcmVuZGVyVG9vbGJhcigpOyByZW5kZXJHcmlkKCk7IHJlbmRlclN0YXR1cygpOyB9KTsKICAgICAgY2hpcHMuYXBwZW5kQ2hpbGQoYyk7CiAgICB9KTsKICAgIGlmIChjaGlwcy5jaGlsZHJlbi5sZW5ndGggPiAxKSB7IFMoY2hpcHMsICdtYXJnaW4tYm90dG9tOnZhcigtLXNwYWNlLW1kLDE1cHgpJyk7IGN0eC50b29sYmFyRWwuYXBwZW5kQ2hpbGQoY2hpcHMpOyB9CiAgfQoKICBmdW5jdGlvbiBzaG93U2tlbGV0b25zKCkgewogICAgaWYgKCFjdHguZ3JpZEVsKSByZXR1cm47CiAgICBjdHguZ3JpZEVsLmlubmVySFRNTCA9ICcnOwogICAgY3R4LmdyaWRFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtYnVzeScsICd0cnVlJyk7CiAgICB2YXIgbiA9IDk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgc2s7CiAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnNrZWxldG9uID09PSAnZnVuY3Rpb24nKSBzayA9IFYudWkuc2tlbGV0b24oJ2NhcmQnKTsKICAgICAgZWxzZSBzayA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbiB2LXNrZWxldG9uLS10aWxlJyB9KTsKICAgICAgY3R4LmdyaWRFbC5hcHBlbmRDaGlsZChzayk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBidWlsZENlbGwoaW1nKSB7CiAgICB2YXIga2V5ID0gaW1nS2V5KGltZyk7CiAgICB2YXIgY2VsbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItY2VsbCcsIGRhdGFzZXQ6IHsga2V5OiBrZXkgfSB9KTsKICAgIFMoY2VsbCwgJ3Bvc2l0aW9uOnJlbGF0aXZlO2JvcmRlci1yYWRpdXM6dmFyKC0tdi1yYWRpdXMtc20sMTVweCk7b3ZlcmZsb3c6aGlkZGVuJyk7CiAgICB2YXIgb25DaGFuZ2UgPSBmdW5jdGlvbiAoKSB7IHJlbmRlckZhdkJhZGdlKGNlbGwsIGltZyk7IH07CgogICAgdmFyIGNhcmROb2RlOwogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaW1nQ2FyZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBjYXJkTm9kZSA9IFYudWkuaW1nQ2FyZChpbWcsIHsgYmVmb3JlQWZ0ZXI6IHRydWUsIG9uVGFwOiBmdW5jdGlvbiAoKSB7IGlmIChjdHguc2VsZWN0TW9kZSkgdG9nZ2xlU2VsZWN0KGltZyk7IGVsc2Ugb3BlbkltYWdlKGltZyk7IH0gfSk7CiAgICB9IGVsc2UgewogICAgICBjYXJkTm9kZSA9IGJ1aWxkRmFsbGJhY2tDYXJkKGltZyk7CiAgICB9CiAgICBjZWxsLmFwcGVuZENoaWxkKGNhcmROb2RlKTsKCiAgICBpZiAoaXNWaWRlbyhpbWcpKSB7CiAgICAgIHZhciB2YmFkZ2UgPSBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWxpYi12aWRlb2JhZGdlJywgJ2FyaWEtbGFiZWwnOiAnVmlkZW8nIH0sIGljb24oJ2ZpbG0nKSk7CiAgICAgIGNlbGwuYXBwZW5kQ2hpbGQodmJhZGdlKTsKICAgIH0KCiAgICB2YXIgQlROID0gJ2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6MzBweDtoZWlnaHQ6MzBweDtib3JkZXItcmFkaXVzOjUwJTtib3JkZXI6MXB4IHNvbGlkICcgKyBMSU5FICsgJztjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyO2JhY2tkcm9wLWZpbHRlcjpibHVyKDhweCk7LXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6Ymx1cig4cHgpO3RyYW5zaXRpb246dHJhbnNmb3JtIC4xMnMgZWFzZSxiYWNrZ3JvdW5kIC4xMnMgZWFzZTtsaW5lLWhlaWdodDowJzsKCiAgICB2YXIgY2hlY2sgPSBlbCgnYnV0dG9uJywgewogICAgICBjbGFzczogJ3YtbGliLWNoZWNrJyArIChjdHguc2VsZWN0ZWRba2V5XSA/ICcgaXMtb24nIDogJycpLCB0eXBlOiAnYnV0dG9uJywgcm9sZTogJ2NoZWNrYm94JywKICAgICAgJ2FyaWEtY2hlY2tlZCc6IGN0eC5zZWxlY3RlZFtrZXldID8gJ3RydWUnIDogJ2ZhbHNlJywgJ2FyaWEtbGFiZWwnOiAnU2VsZWN0IGNyZWF0aW9uJywKICAgICAgdGFiaW5kZXg6IGN0eC5zZWxlY3RNb2RlID8gJzAnIDogJy0xJwogICAgfSk7CiAgICBTKGNoZWNrLCAncG9zaXRpb246YWJzb2x1dGU7dG9wOjhweDtsZWZ0OjhweDt6LWluZGV4OjM7JyArIEJUTiArICc7YmFja2dyb3VuZDonICsgKGN0eC5zZWxlY3RlZFtrZXldID8gR1JBRElFTlQgOiBCQURHRV9CRykgKyAoY3R4LnNlbGVjdE1vZGUgPyAnJyA6ICc7b3BhY2l0eTowO3BvaW50ZXItZXZlbnRzOm5vbmUnKSk7CiAgICBpZiAoY3R4LnNlbGVjdGVkW2tleV0pIGNoZWNrLmFwcGVuZENoaWxkKGljb24oJ2NoZWNrJykpOwogICAgY2hlY2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyBlLnByZXZlbnREZWZhdWx0KCk7IHRvZ2dsZVNlbGVjdChpbWcpOyB9KTsKICAgIGNlbGwuYXBwZW5kQ2hpbGQoY2hlY2spOwoKICAgIHZhciBmYXYgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtbGliLWZhdicgKyAoaW1nLmZhdm9yaXRlZCA/ICcgaXMtb24nIDogJycpLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiBpbWcuZmF2b3JpdGVkID8gJ1VuZmF2b3JpdGUnIDogJ0Zhdm9yaXRlJywgJ2FyaWEtcHJlc3NlZCc6IGltZy5mYXZvcml0ZWQgPyAndHJ1ZScgOiAnZmFsc2UnIH0pOwogICAgUyhmYXYsICdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6OHB4O3JpZ2h0OjQ0cHg7ei1pbmRleDozOycgKyBCVE4gKyAnO2JhY2tncm91bmQ6JyArIChpbWcuZmF2b3JpdGVkID8gR1JBRElFTlQgOiBCQURHRV9CRykpOwogICAgZmF2LmFwcGVuZENoaWxkKGljb24oaW1nLmZhdm9yaXRlZCA/ICdoZWFydEZpbGwnIDogJ2hlYXJ0JykpOwogICAgZmF2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgZS5wcmV2ZW50RGVmYXVsdCgpOyB0b2dnbGVGYXZvcml0ZShpbWcsIG9uQ2hhbmdlKTsgfSk7CiAgICBjZWxsLmFwcGVuZENoaWxkKGZhdik7CgogICAgdmFyIG1vcmUgPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtbGliLW1vcmUnLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiAnTW9yZSBhY3Rpb25zJyB9KTsKICAgIFMobW9yZSwgJ3Bvc2l0aW9uOmFic29sdXRlO3RvcDo4cHg7cmlnaHQ6OHB4O3otaW5kZXg6MzsnICsgQlROICsgJztiYWNrZ3JvdW5kOicgKyBCQURHRV9CRyk7CiAgICBtb3JlLmFwcGVuZENoaWxkKGljb24oJ21vcmUnKSk7CiAgICBtb3JlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsKICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB2YXIgciA9IG1vcmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIG9wZW5Db250ZXh0TWVudShpbWcsIHIucmlnaHQsIHIuYm90dG9tICsgNCwgb25DaGFuZ2UpOwogICAgfSk7CiAgICBjZWxsLmFwcGVuZENoaWxkKG1vcmUpOwoKICAgIGlmIChjdHguc2VsZWN0ZWRba2V5XSkgY2VsbC5jbGFzc0xpc3QuYWRkKCdpcy1zZWxlY3RlZCcpOwoKICAgIGNlbGwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgnLnYtbGliLWNoZWNrLCAudi1saWItZmF2LCAudi1saWItbW9yZScpKSByZXR1cm47CiAgICAgIGlmIChjdHguc2VsZWN0TW9kZSkgeyB0b2dnbGVTZWxlY3QoaW1nKTsgcmV0dXJuOyB9CiAgICAgIGlmICghKFYudWkgJiYgdHlwZW9mIFYudWkuaW1nQ2FyZCA9PT0gJ2Z1bmN0aW9uJykpIG9wZW5JbWFnZShpbWcpOwogICAgfSk7CgogICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgb3BlbkNvbnRleHRNZW51KGltZywgZS5jbGllbnRYLCBlLmNsaWVudFksIG9uQ2hhbmdlKTsKICAgIH0pOwoKICAgIHZhciBscFRpbWVyID0gbnVsbCwgbW92ZWQgPSBmYWxzZSwgc3RhcnRYID0gMCwgc3RhcnRZID0gMDsKICAgIGNlbGwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgIG1vdmVkID0gZmFsc2U7CiAgICAgIGlmIChlLnRvdWNoZXMgJiYgZS50b3VjaGVzWzBdKSB7IHN0YXJ0WCA9IGUudG91Y2hlc1swXS5jbGllbnRYOyBzdGFydFkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WTsgfQogICAgICBscFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFtb3ZlZCkgewogICAgICAgICAgaWYgKCFjdHguc2VsZWN0TW9kZSkgZW50ZXJTZWxlY3QoaW1nKTsKICAgICAgICAgIGVsc2UgdG9nZ2xlU2VsZWN0KGltZyk7CiAgICAgICAgICBpZiAobmF2aWdhdG9yLnZpYnJhdGUpIHRyeSB7IG5hdmlnYXRvci52aWJyYXRlKDEyKTsgfSBjYXRjaCAoZXIpIHt9CiAgICAgICAgfQogICAgICB9LCA0NTApOwogICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlc1swXSkgewogICAgICAgIGlmIChNYXRoLmFicyhlLnRvdWNoZXNbMF0uY2xpZW50WCAtIHN0YXJ0WCkgPiAxMCB8fCBNYXRoLmFicyhlLnRvdWNoZXNbMF0uY2xpZW50WSAtIHN0YXJ0WSkgPiAxMCkgbW92ZWQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChtb3ZlZCkgY2xlYXJUaW1lb3V0KGxwVGltZXIpOwogICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGZ1bmN0aW9uICgpIHsgY2xlYXJUaW1lb3V0KGxwVGltZXIpOyB9LCB7IHBhc3NpdmU6IHRydWUgfSk7CiAgICBjZWxsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgZnVuY3Rpb24gKCkgeyBjbGVhclRpbWVvdXQobHBUaW1lcik7IH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKCiAgICByZXR1cm4gY2VsbDsKICB9CgogIGZ1bmN0aW9uIHJlbmRlckZhdkJhZGdlKGNlbGwsIGltZykgewogICAgaWYgKCFjZWxsKSByZXR1cm47CiAgICB2YXIgZmF2ID0gY2VsbC5xdWVyeVNlbGVjdG9yKCcudi1saWItZmF2Jyk7CiAgICBpZiAoIWZhdikgcmV0dXJuOwogICAgZmF2LmNsYXNzTGlzdC50b2dnbGUoJ2lzLW9uJywgISFpbWcuZmF2b3JpdGVkKTsKICAgIGZhdi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIGltZy5mYXZvcml0ZWQgPyAndHJ1ZScgOiAnZmFsc2UnKTsKICAgIGZhdi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBpbWcuZmF2b3JpdGVkID8gJ1VuZmF2b3JpdGUnIDogJ0Zhdm9yaXRlJyk7CiAgICBmYXYuc3R5bGUuYmFja2dyb3VuZCA9IGltZy5mYXZvcml0ZWQgPyBHUkFESUVOVCA6IEJBREdFX0JHOwogICAgZmF2LmlubmVySFRNTCA9ICcnOwogICAgZmF2LmFwcGVuZENoaWxkKGljb24oaW1nLmZhdm9yaXRlZCA/ICdoZWFydEZpbGwnIDogJ2hlYXJ0JykpOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRGYWxsYmFja0NhcmQoaW1nKSB7CiAgICB2YXIgYWZ0ZXIgPSBpbWcucmVtb3RlSW1hZ2VVUkwgfHwgaW1nLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwgfHwgJyc7CiAgICB2YXIgYmVmb3JlID0gaW1nLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkw7CiAgICB2YXIgY2FyZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jYXJkIHYtY2FyZC0tcGFkLTAgdi1jYXJkLS10YXBwYWJsZSB2Y2FyZCcgfSk7CiAgICBTKGNhcmQsICdwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2Rpc3BsYXk6YmxvY2s7Ym9yZGVyLXJhZGl1czp2YXIoLS12LXJhZGl1cy1zbSwxNXB4KTtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZDp2YXIoLS12LWNhcmQtYmcsIHJnYmEoMjU1LDI1NSwyNTUsLjA0KSknKTsKICAgIHZhciBhZnRlckltZyA9IGVsKCdpbWcnLCB7IGNsYXNzOiAndmFmdGVyJywgc3JjOiBhZnRlciwgYWx0OiBlc2NhcGVIdG1sKGltZy5wcm9tcHQgfHwgJ0NyZWF0aW9uJyksIGxvYWRpbmc6ICdsYXp5JyB9KTsKICAgIFMoYWZ0ZXJJbWcsICdkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OmF1dG8nKTsKICAgIGFmdGVySW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyBjYXJkLmNsYXNzTGlzdC5hZGQoJ2lzLWJyb2tlbicpOyB9KTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoYWZ0ZXJJbWcpOwogICAgaWYgKGJlZm9yZSAmJiBiZWZvcmUgIT09IGFmdGVyKSB7CiAgICAgIHZhciBiZWZvcmVJbWcgPSBlbCgnaW1nJywgeyBjbGFzczogJ3ZiZWZvcmUnLCBzcmM6IGJlZm9yZSwgYWx0OiAnJywgbG9hZGluZzogJ2xhenknIH0pOwogICAgICBTKGJlZm9yZUltZywgJ3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvdmVyO3RyYW5zaXRpb246b3BhY2l0eSAuNnMgZWFzZScpOwogICAgICBjYXJkLmFwcGVuZENoaWxkKGJlZm9yZUltZyk7CiAgICAgIHZhciBvbiA9IGZhbHNlOwogICAgICB2YXIgaXYgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFjYXJkLmlzQ29ubmVjdGVkKSB7IGNsZWFySW50ZXJ2YWwoaXYpOyByZXR1cm47IH0KICAgICAgICBvbiA9ICFvbjsKICAgICAgICBiZWZvcmVJbWcuc3R5bGUub3BhY2l0eSA9IG9uID8gJzAnIDogJzEnOwogICAgICB9LCAyNjAwKTsKICAgIH0KICAgIHJldHVybiBjYXJkOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyR3JpZCgpIHsKICAgIGlmICghY3R4LmdyaWRFbCkgcmV0dXJuOwogICAgY3R4LmdyaWRFbC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtYnVzeScpOwoKICAgIGlmIChjdHgubG9hZGluZyAmJiAhY3R4Lml0ZW1zLmxlbmd0aCkgeyBzaG93U2tlbGV0b25zKCk7IHJldHVybjsgfQoKICAgIHZhciBsaXN0ID0gdmlzaWJsZUl0ZW1zKCk7CiAgICBjdHguZ3JpZEVsLmlubmVySFRNTCA9ICcnOwoKICAgIGlmICghbGlzdC5sZW5ndGgpIHsKICAgICAgaWYgKGN0eC5sb2FkaW5nKSB7IHNob3dTa2VsZXRvbnMoKTsgcmV0dXJuOyB9CiAgICAgIGlmIChjdHguZXJyb3JlZCkgeyByZW1vdmVTZW50aW5lbCgpOyByZXR1cm47IH0KICAgICAgdmFyIGZpbHRlcmVkID0gY3R4LnF1ZXJ5IHx8IGN0eC5pbmR1c3RyeTsKICAgICAgaWYgKCFmaWx0ZXJlZCAmJiAhY3R4LmZldGNoZWQpIHsgc2hvd1NrZWxldG9ucygpOyByZXR1cm47IH0KICAgICAgcmVtb3ZlU2VudGluZWwoKTsKICAgICAgY3R4LmdyaWRFbC5hcHBlbmRDaGlsZChlbXB0eVN0YXRlKCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgdHJ5IHsgZnJhZy5hcHBlbmRDaGlsZChidWlsZENlbGwobGlzdFtpXSkpOyB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIGNvbnNvbGUuZXJyb3IoJ1tsaWJyYXJ5XSBjZWxsIHJlbmRlciBmYWlsZWQnLCBlKTsKICAgICAgfQogICAgfQogICAgY3R4LmdyaWRFbC5hcHBlbmRDaGlsZChmcmFnKTsKICAgIGN0eC5ncmlkRWwuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtc2VsZWN0aW5nJywgY3R4LnNlbGVjdE1vZGUpOwogICAgYXR0YWNoU2VudGluZWwoKTsKICB9CgogIGZ1bmN0aW9uIGhhc01vcmVUb0xvYWQoKSB7CiAgICBpZiAoY3R4LmRvbmUgfHwgY3R4LmxvYWRpbmcpIHJldHVybiBmYWxzZTsKICAgIGlmIChjdHguc291cmNlID09PSAnZmF2b3JpdGVzJykgcmV0dXJuIGZhbHNlOwogICAgaWYgKGN0eC50b3RhbCAhPSBudWxsICYmIGN0eC50b3RhbCA+IDAgJiYgY3R4Lml0ZW1zLmxlbmd0aCA8IGN0eC50b3RhbCkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBlbXB0eVN0YXRlKCkgewogICAgdmFyIGhhc0VtcHR5ID0gVi51aSAmJiB0eXBlb2YgVi51aS5lbXB0eSA9PT0gJ2Z1bmN0aW9uJzsKICAgIHZhciBpc0ZpbHRlcmVkID0gY3R4LnF1ZXJ5IHx8IGN0eC5pbmR1c3RyeTsKCiAgICBpZiAoaXNGaWx0ZXJlZCkgewogICAgICB2YXIgY2xlYXIgPSBmdW5jdGlvbiAoKSB7IGN0eC5xdWVyeSA9ICcnOyBjdHguaW5kdXN0cnkgPSBudWxsOyByZW5kZXJUb29sYmFyKCk7IHJlbmRlckdyaWQoKTsgcmVuZGVyU3RhdHVzKCk7IH07CiAgICAgIGlmIChoYXNFbXB0eSkgcmV0dXJuIFYudWkuZW1wdHkoeyB0aXRsZTogJ05vIG1hdGNoZXMnLCBtZXNzYWdlOiAnTm90aGluZyBtYXRjaGVzIHlvdXIgc2VhcmNoIG9yIGZpbHRlcnMuJywgaWNvbjogJ3NlYXJjaCcgfSwgJ0NsZWFyIGZpbHRlcnMnLCBjbGVhcik7CiAgICAgIHJldHVybiBmYWxsYmFja0VtcHR5KCdObyBtYXRjaGVzJywgJ05vdGhpbmcgbWF0Y2hlcyB5b3VyIHNlYXJjaCBvciBmaWx0ZXJzLicsICdDbGVhciBmaWx0ZXJzJywgY2xlYXIpOwogICAgfQogICAgaWYgKGN0eC5zb3VyY2UgPT09ICdmYXZvcml0ZXMnKSB7CiAgICAgIGlmIChoYXNFbXB0eSkgcmV0dXJuIFYudWkuZW1wdHkoeyB0aXRsZTogJ05vIGZhdm9yaXRlcyB5ZXQnLCBtZXNzYWdlOiAnVGFwIHRoZSBoZWFydCBvbiBhbnkgY3JlYXRpb24gdG8gc2F2ZSBpdCBoZXJlLicsIGljb246ICdoZWFydCcgfSwgJ0Jyb3dzZSBMaWJyYXJ5Jywgb3BlbkxpYnJhcnkpOwogICAgICByZXR1cm4gZmFsbGJhY2tFbXB0eSgnTm8gZmF2b3JpdGVzIHlldCcsICdUYXAgdGhlIGhlYXJ0IG9uIGFueSBjcmVhdGlvbiB0byBzYXZlIGl0IGhlcmUuJywgJ0Jyb3dzZSBMaWJyYXJ5Jywgb3BlbkxpYnJhcnkpOwogICAgfQogICAgaWYgKGN0eC5zb3VyY2UgPT09ICdmb2xkZXInKSB7CiAgICAgIGlmIChoYXNFbXB0eSkgcmV0dXJuIFYudWkuZW1wdHkoeyB0aXRsZTogJ1RoaXMgZm9sZGVyIGlzIGVtcHR5JywgbWVzc2FnZTogJ0FkZCBjcmVhdGlvbnMgZnJvbSBhbnkgaW1hZ2XigJlzIG1lbnUuJywgaWNvbjogJ2ZvbGRlcicgfSwgJ0JhY2sgdG8gTGlicmFyeScsIG9wZW5MaWJyYXJ5KTsKICAgICAgcmV0dXJuIGZhbGxiYWNrRW1wdHkoJ1RoaXMgZm9sZGVyIGlzIGVtcHR5JywgJ0FkZCBjcmVhdGlvbnMgZnJvbSBhbnkgaW1hZ2XigJlzIG1lbnUuJywgJ0JhY2sgdG8gTGlicmFyeScsIG9wZW5MaWJyYXJ5KTsKICAgIH0KICAgIHZhciBjcmVhdGUgPSBmdW5jdGlvbiAoKSB7IGdvKCcjL2NyZWF0ZScpOyB9OwogICAgaWYgKGhhc0VtcHR5KSByZXR1cm4gVi51aS5lbXB0eSh7IHRpdGxlOiAnTm8gY3JlYXRpb25zIHlldCcsIG1lc3NhZ2U6ICdHZW5lcmF0ZSB5b3VyIGZpcnN0IGltYWdlIHRvIHN0YXJ0IHlvdXIgbGlicmFyeS4nLCBpY29uOiAnaW1hZ2UnIH0sICdDcmVhdGUnLCBjcmVhdGUpOwogICAgcmV0dXJuIGZhbGxiYWNrRW1wdHkoJ05vIGNyZWF0aW9ucyB5ZXQnLCAnR2VuZXJhdGUgeW91ciBmaXJzdCBpbWFnZSB0byBzdGFydCB5b3VyIGxpYnJhcnkuJywgJ0NyZWF0ZScsIGNyZWF0ZSk7CiAgfQoKICBmdW5jdGlvbiBmYWxsYmFja0VtcHR5KHRpdGxlLCBzdWIsIGFjdGlvbkxhYmVsLCBvbkFjdGlvbikgewogICAgdmFyIG5vZGUgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHknLCByb2xlOiAnbm90ZScgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sIGljb24oJ2ltYWdlJykpLAogICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScsIHRleHQ6IHRpdGxlIH0pLAogICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19zdWInLCB0ZXh0OiBzdWIgfSkpOwogICAgaWYgKGFjdGlvbkxhYmVsICYmIHR5cGVvZiBvbkFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBub2RlLmFwcGVuZENoaWxkKGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnkgdi1lbXB0eV9fYWN0aW9uJywgdHlwZTogJ2J1dHRvbicsIHRleHQ6IGFjdGlvbkxhYmVsLCBvbmNsaWNrOiBvbkFjdGlvbiB9KSk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZVNlbnRpbmVsKCkgewogICAgaWYgKGN0eC5vYnNlcnZlcikgeyB0cnkgeyBjdHgub2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyB9IGNhdGNoIChlKSB7fSBjdHgub2JzZXJ2ZXIgPSBudWxsOyB9CiAgICBpZiAoY3R4LnNlbnRpbmVsICYmIGN0eC5zZW50aW5lbC5wYXJlbnROb2RlKSBjdHguc2VudGluZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjdHguc2VudGluZWwpOwogICAgY3R4LnNlbnRpbmVsID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIGF0dGFjaFNlbnRpbmVsKCkgewogICAgaWYgKCFjdHguZ3JpZEVsKSByZXR1cm47CiAgICByZW1vdmVTZW50aW5lbCgpOwogICAgaWYgKGN0eC5kb25lIHx8IGN0eC5zb3VyY2UgPT09ICdmYXZvcml0ZXMnIHx8IGN0eC5xdWVyeSkgcmV0dXJuOwogICAgY3R4LnNlbnRpbmVsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi1zZW50aW5lbCcsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKICAgIFMoY3R4LnNlbnRpbmVsLCAnd2lkdGg6MTAwJTtoZWlnaHQ6MXB4Jyk7CiAgICBpZiAoY3R4LmdyaWRFbC5wYXJlbnROb2RlKSBjdHguZ3JpZEVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGN0eC5zZW50aW5lbCwgY3R4LmdyaWRFbC5uZXh0U2libGluZyk7CiAgICBvYnNlcnZlU2VudGluZWwoKTsKICB9CgogIGZ1bmN0aW9uIG9ic2VydmVTZW50aW5lbCgpIHsKICAgIGlmICghKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicgaW4gd2luZG93KSB8fCAhY3R4LnNlbnRpbmVsKSByZXR1cm47CiAgICBjdHgub2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGVudHJpZXNbaV0uaXNJbnRlcnNlY3RpbmcpIGxvYWROZXh0KGZhbHNlKTsKICAgICAgfQogICAgfSwgeyByb290TWFyZ2luOiAnNjAwcHggMHB4JyB9KTsKICAgIGN0eC5vYnNlcnZlci5vYnNlcnZlKGN0eC5zZW50aW5lbCk7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJTdGF0dXMoZXJyKSB7CiAgICBpZiAoIWN0eC5zdGF0dXNFbCkgcmV0dXJuOwogICAgY3R4LnN0YXR1c0VsLmlubmVySFRNTCA9ICcnOwoKICAgIGlmIChjdHguZXJyb3JlZCB8fCBlcnIpIHsKICAgICAgY3R4LnN0YXR1c0VsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eSB2LWxpYi1zdGF0dXNib3gnLCByb2xlOiAnYWxlcnQnIH0sCiAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fdGl0bGUnLCB0ZXh0OiAnQ291bGQgbm90IGxvYWQgeW91ciBsaWJyYXJ5LicgfSksCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgdGV4dDogJ1JldHJ5Jywgb25jbGljazogZnVuY3Rpb24gKCkgeyBsb2FkTmV4dCh0cnVlKTsgfSB9KSkpOwogICAgfSBlbHNlIGlmIChjdHgubG9hZGluZyAmJiBjdHguaXRlbXMubGVuZ3RoKSB7CiAgICAgIGN0eC5zdGF0dXNFbC5hcHBlbmRDaGlsZChTKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1saWItbG9hZG1vcmUnIH0sIHNwaW5uZXJOb2RlKCksIGVsKCdzcGFuJywgeyB0ZXh0OiAnTG9hZGluZyBtb3Jl4oCmJyB9KSksICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Z2FwOjEwcHg7cGFkZGluZzoyNHB4IDA7Y29sb3I6dmFyKC0tdi1pbmstc29mdCwgcmdiYSgyNDUsMjQ1LDI0NywuNjYpKTtmb250LXNpemU6MTRweCcpKTsKICAgIH0gZWxzZSBpZiAoY3R4LmRvbmUgJiYgY3R4Lml0ZW1zLmxlbmd0aCkgewogICAgICB2YXIgbiA9IGN0eC50b3RhbCAhPSBudWxsID8gY3R4LnRvdGFsIDogY3R4Lml0ZW1zLmxlbmd0aDsKICAgICAgY3R4LnN0YXR1c0VsLmFwcGVuZENoaWxkKFMoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi1lbmQnLCB0ZXh0OiBuICsgJyBjcmVhdGlvbicgKyAobiA9PT0gMSA/ICcnIDogJ3MnKSB9KSwgJ3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MjRweCAwIDhweDtjb2xvcjp2YXIoLS12LWluay1zb2Z0LCByZ2JhKDI0NSwyNDUsMjQ3LC41KSk7Zm9udC1zaXplOjEzcHg7bGV0dGVyLXNwYWNpbmc6LjAyZW0nKSk7CiAgICB9CgogICAgaWYgKGN0eC5jb3VudEVsKSB7CiAgICAgIHZhciB0b3RhbExvYWRlZCA9IGN0eC5pdGVtcy5sZW5ndGg7CiAgICAgIHZhciBsYWJlbDsKICAgICAgaWYgKGN0eC5xdWVyeSB8fCBjdHguaW5kdXN0cnkpIGxhYmVsID0gdmlzaWJsZUl0ZW1zKCkubGVuZ3RoICsgJyBvZiAnICsgdG90YWxMb2FkZWQ7CiAgICAgIGVsc2UgaWYgKGN0eC50b3RhbCAhPSBudWxsKSBsYWJlbCA9IChjdHguZG9uZSA/IGN0eC50b3RhbCA6IHRvdGFsTG9hZGVkICsgJysnKSArICcnOwogICAgICBlbHNlIGxhYmVsID0gdG90YWxMb2FkZWQgKyAoY3R4LmRvbmUgPyAnJyA6ICcrJyk7CiAgICAgIGN0eC5jb3VudEVsLnRleHRDb250ZW50ID0gdG90YWxMb2FkZWQgfHwgKGN0eC5xdWVyeSB8fCBjdHguaW5kdXN0cnkpID8gbGFiZWwgOiAnJzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNwaW5uZXJOb2RlKCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuc3Bpbm5lciA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudWkuc3Bpbm5lcigpOwogICAgcmV0dXJuIGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3Bpbm5lcicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKICB9CgogIGZ1bmN0aW9uIG9wZW5MaWJyYXJ5KCkgewogICAgY3R4LnNvdXJjZSA9ICdsaWJyYXJ5JzsKICAgIGN0eC5mb2xkZXJJRCA9IG51bGw7CiAgICBjdHgucXVlcnkgPSAnJzsgY3R4LmluZHVzdHJ5ID0gbnVsbDsKICAgIGNsb3NlTWVudSgpOwogICAgaWYgKGN0eC5zZWxlY3RNb2RlKSBleGl0U2VsZWN0KCk7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICBsb2FkTmV4dCh0cnVlKTsKICB9CiAgZnVuY3Rpb24gb3BlbkZhdm9yaXRlcygpIHsKICAgIGN0eC5zb3VyY2UgPSAnZmF2b3JpdGVzJzsKICAgIGN0eC5mb2xkZXJJRCA9IG51bGw7CiAgICBjdHgucXVlcnkgPSAnJzsgY3R4LmluZHVzdHJ5ID0gbnVsbDsKICAgIGNsb3NlTWVudSgpOwogICAgaWYgKGN0eC5zZWxlY3RNb2RlKSBleGl0U2VsZWN0KCk7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICBsb2FkTmV4dCh0cnVlKTsKICB9CiAgZnVuY3Rpb24gb3BlbkZvbGRlcihpZCkgewogICAgY3R4LnNvdXJjZSA9ICdmb2xkZXInOwogICAgY3R4LmZvbGRlcklEID0gaWQ7CiAgICBjdHgucXVlcnkgPSAnJzsgY3R4LmluZHVzdHJ5ID0gbnVsbDsKICAgIGNsb3NlTWVudSgpOwogICAgaWYgKGN0eC5zZWxlY3RNb2RlKSBleGl0U2VsZWN0KCk7CiAgICByZW5kZXJUb29sYmFyKCk7CiAgICBsb2FkTmV4dCh0cnVlKTsKICB9CgogIGZ1bmN0aW9uIG9uS2V5KGUpIHsKICAgIGlmICghY3R4IHx8ICFjdHgucm9vdCB8fCAhY3R4LnJvb3QuaXNDb25uZWN0ZWQpIHJldHVybjsKICAgIHZhciB0YWcgPSAoZS50YXJnZXQgJiYgZS50YXJnZXQudGFnTmFtZSkgfHwgJyc7CiAgICB2YXIgdHlwaW5nID0gdGFnID09PSAnSU5QVVQnIHx8IHRhZyA9PT0gJ1RFWFRBUkVBJyB8fCB0YWcgPT09ICdTRUxFQ1QnIHx8IChlLnRhcmdldCAmJiBlLnRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSk7CiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7CiAgICAgIGlmIChjdHgubWVudUVsKSB7IGNsb3NlTWVudSgpOyByZXR1cm47IH0KICAgICAgaWYgKGN0eC5zZWxlY3RNb2RlKSB7IGV4aXRTZWxlY3QoKTsgcmV0dXJuOyB9CiAgICB9CiAgICBpZiAodHlwaW5nKSByZXR1cm47CiAgICBpZiAoY3R4LnNlbGVjdE1vZGUgJiYgKGUua2V5ID09PSAnYScgfHwgZS5rZXkgPT09ICdBJykgJiYgKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgc2VsZWN0QWxsVmlzaWJsZSgpOyByZXR1cm47CiAgICB9CiAgICBpZiAoY3R4LnNlbGVjdE1vZGUgJiYgKGUua2V5ID09PSAnRGVsZXRlJyB8fCBlLmtleSA9PT0gJ0JhY2tzcGFjZScpKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgYmF0Y2hEZWxldGUoKTsgcmV0dXJuOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVuZGVyKHJvb3QsIHBhcmFtcykgewogICAgdGVhcmRvd24oKTsKICAgIGN0eCA9IGZyZXNoQ3R4KCk7CiAgICBjdHgucm9vdCA9IHJvb3Q7CgogICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgndi12aWV3LWxpYnJhcnknKTsKCiAgICBjdHguc2Nyb2xsVGFyZ2V0ID0gZmluZFNjcm9sbFBhcmVudChyb290KSB8fCB3aW5kb3c7CgogICAgdmFyIHRpdGxlID0gZWwoJ2gxJywgeyBjbGFzczogJ3YtbGliLXRpdGxlJyB9LCBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWdyYWRpZW50JywgdGV4dDogJ0xpYnJhcnknIH0pLCBjdHguY291bnRFbCA9IGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbGliLWNvdW50JyB9KSk7CiAgICBTKHRpdGxlLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmJhc2VsaW5lO2dhcDoxMHB4O21hcmdpbjowO2ZvbnQtc2l6ZTpjbGFtcCgyOHB4LDV2dyw0MHB4KTtsZXR0ZXItc3BhY2luZzotMC4wMmVtJyk7CiAgICBTKGN0eC5jb3VudEVsLCAnZm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NTAwO2NvbG9yOnZhcigtLXYtaW5rLXNvZnQsIHJnYmEoMjQ1LDI0NSwyNDcsLjU1KSknKTsKICAgIHZhciBoZWFkZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtbGliLWhlYWRlcicgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi10aXRsZXdyYXAnIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1leWVicm93JywgdGV4dDogJ1lvdXIgV29yaycgfSksCiAgICAgICAgdGl0bGUKICAgICAgKSwKICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tc20nLCB0eXBlOiAnYnV0dG9uJywgb25jbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9jcmVhdGUnKTsgfSB9LCBpY29uKCdwbHVzJyksICdDcmVhdGUnKQogICAgKTsKICAgIFMoaGVhZGVyLCAnZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtZW5kO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2dhcDoxNnB4O2ZsZXgtd3JhcDp3cmFwO21hcmdpbi1ib3R0b206dmFyKC0tc3BhY2UtbGcsMjRweCknKTsKCiAgICBjdHgudG9vbGJhckVsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi10b29sYmFyLXdyYXAnIH0pOwogICAgY3R4LmdyaWRFbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tYXNvbnJ5IHYtbGliLWdyaWQnIH0pOwogICAgY3R4LnN0YXR1c0VsID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxpYi1zdGF0dXMnLCAnYXJpYS1saXZlJzogJ3BvbGl0ZScgfSk7CgogICAgcm9vdC5hcHBlbmRDaGlsZChoZWFkZXIpOwogICAgcm9vdC5hcHBlbmRDaGlsZChjdHgudG9vbGJhckVsKTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQoY3R4LmdyaWRFbCk7CiAgICByb290LmFwcGVuZENoaWxkKGN0eC5zdGF0dXNFbCk7CgogICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgaWYgKHBhcmFtcy5mYXYgPT09ICcxJyB8fCBwYXJhbXMuZmF2ID09PSAndHJ1ZScpIGN0eC5zb3VyY2UgPSAnZmF2b3JpdGVzJzsKICAgIGlmIChwYXJhbXMuZm9sZGVyKSB7IGN0eC5zb3VyY2UgPSAnZm9sZGVyJzsgY3R4LmZvbGRlcklEID0gcGFyYW1zLmZvbGRlcjsgfQogICAgaWYgKHBhcmFtcy5zb3J0KSBjdHguc29ydCA9IHBhcmFtcy5zb3J0OwogICAgaWYgKHBhcmFtcy5xKSBjdHgucXVlcnkgPSBwYXJhbXMucTsKCiAgICByZW5kZXJUb29sYmFyKCk7CgogICAgbG9hZEZvbGRlcnMoKS50aGVuKGZ1bmN0aW9uICgpIHsgaWYgKGN0eCAmJiBjdHguc291cmNlID09PSAnZm9sZGVyJykgcmVuZGVyVG9vbGJhcigpOyB9KTsKCiAgICB2YXIgc2VlZGVkID0gZmFsc2U7CiAgICBpZiAoY3R4LnNvdXJjZSA9PT0gJ2xpYnJhcnknICYmIFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuZ2V0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGNhY2hlZCA9IFYuc3RvcmUuZ2V0KCdsaWJyYXJ5Jyk7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2FjaGVkKSAmJiBjYWNoZWQubGVuZ3RoKSB7CiAgICAgICAgICBjdHguaXRlbXMgPSBjYWNoZWQuc2xpY2UoKTsKICAgICAgICAgIHNlZWRlZCA9IHRydWU7CiAgICAgICAgICByZW5kZXJHcmlkKCk7CiAgICAgICAgICByZW5kZXJTdGF0dXMoKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9CgogICAgbG9hZE5leHQodHJ1ZSkudGhlbihmdW5jdGlvbiAoKSB7IHJlc3RvcmVTY3JvbGwoKTsgfSk7CiAgICBpZiAoc2VlZGVkKSByZXN0b3JlU2Nyb2xsKCk7CgogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5LCBmYWxzZSk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZW5zdXJlRmlsbCwgZmFsc2UpOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uV2luZG93U2Nyb2xsLCB0cnVlKTsKCiAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBjdHguX3Vuc3ViID0gVi5zdG9yZS5vbignbGlicmFyeTpjaGFuZ2VkJywgZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChjdHggJiYgIWN0eC5fc2VsZldyaXRlICYmICFjdHgubG9hZGluZyAmJiBjdHgucm9vdCAmJiBjdHgucm9vdC5pc0Nvbm5lY3RlZCkgbG9hZE5leHQodHJ1ZSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gb25XaW5kb3dTY3JvbGwoKSB7CiAgICBpZiAoIWN0eCB8fCBjdHgubG9hZGluZyB8fCBjdHguZG9uZSB8fCAhY3R4LmdyaWRFbCkgcmV0dXJuOwogICAgaWYgKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicgaW4gd2luZG93KSByZXR1cm47CiAgICBpZiAoY3R4LnF1ZXJ5IHx8IGN0eC5zb3VyY2UgPT09ICdmYXZvcml0ZXMnKSByZXR1cm47CiAgICB2YXIgZG9jSCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgfHwgd2luZG93LmlubmVySGVpZ2h0OwogICAgaWYgKGN0eC5ncmlkRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIDwgZG9jSCArIDYwMCkgbG9hZE5leHQoZmFsc2UpOwogIH0KCiAgZnVuY3Rpb24gZmluZFNjcm9sbFBhcmVudChub2RlKSB7CiAgICB2YXIgcCA9IG5vZGUgJiYgbm9kZS5wYXJlbnRFbGVtZW50OwogICAgd2hpbGUgKHAgJiYgcCAhPT0gZG9jdW1lbnQuYm9keSkgewogICAgICB2YXIgb3kgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwKS5vdmVyZmxvd1k7CiAgICAgIGlmICgob3kgPT09ICdhdXRvJyB8fCBveSA9PT0gJ3Njcm9sbCcpICYmIHAuc2Nyb2xsSGVpZ2h0ID4gcC5jbGllbnRIZWlnaHQpIHJldHVybiBwOwogICAgICBwID0gcC5wYXJlbnRFbGVtZW50OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiB0ZWFyZG93bigpIHsKICAgIGlmICghY3R4KSByZXR1cm47CiAgICBjbG9zZU1lbnUoKTsKICAgIHJlbW92ZVNlbnRpbmVsKCk7CiAgICBpZiAodHlwZW9mIGN0eC5fdW5zdWIgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgY3R4Ll91bnN1YigpOyB9IGNhdGNoIChlKSB7fSB9CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXksIGZhbHNlKTsKICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBlbnN1cmVGaWxsLCBmYWxzZSk7CiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25XaW5kb3dTY3JvbGwsIHRydWUpOwogICAgaWYgKGN0eC5yb290KSBjdHgucm9vdC5jbGFzc0xpc3QucmVtb3ZlKCd2LXZpZXctbGlicmFyeScpOwogICAgY3R4ID0gbnVsbDsKICB9CgogIFYudmlld3MubGlicmFyeSA9IHsgcmVuZGVyOiByZW5kZXIsIHRlYXJkb3duOiB0ZWFyZG93biB9OwoKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvc3R1ZGlvLmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLnZpZXdzID0gVi52aWV3cyB8fCB7fTsKCiAgdmFyIEFDQ0VOVCA9ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknOwogIHZhciBBQ0NFTlRfU09GVCA9ICd2YXIoLS12YW1wLWFjY2VudC1zb2Z0LCAjODJENkZGKSc7CiAgdmFyIEVSUk9SID0gJ3ZhcigtLWNvbG9yLWVycm9yLCAjRjczMzYzKSc7CiAgdmFyIElOSyA9ICd2YXIoLS12LWluaywgI2Y1ZjVmNyknOwogIHZhciBJTktfU09GVCA9ICd2YXIoLS12LWluay1zb2Z0LCByZ2JhKDI0NSwyNDUsMjQ3LC42NikpJzsKICB2YXIgTElORSA9ICd2YXIoLS12LWxpbmUsIHJnYmEoMjQ1LDI0NSwyNDcsLjE1KSknOwogIHZhciBDQVJEX0JHID0gJ3ZhcigtLXYtY2FyZC1iZywgcmdiYSgyNTUsMjU1LDI1NSwuMDQpKSc7CgogIHZhciBfcm9vdCA9IG51bGw7CiAgdmFyIF9ub2RlID0gbnVsbDsKICB2YXIgX2ltYWdlID0gbnVsbDsKICB2YXIgX3NpYmxpbmdzID0gW107CiAgdmFyIF9pbmRleCA9IC0xOwogIHZhciBfc2NydWJOb2RlID0gbnVsbDsKICB2YXIgX3BvbGxBYm9ydCA9IG51bGw7CiAgdmFyIF9rZXlIYW5kbGVyID0gbnVsbDsKICB2YXIgX3Bhc3RlSGFuZGxlciA9IG51bGw7CiAgdmFyIF9yZXNpemVIYW5kbGVyID0gbnVsbDsKICB2YXIgX2Rpc3Bvc2VkID0gZmFsc2U7CgogIGZ1bmN0aW9uIFUoKSB7IHJldHVybiBWLnV0aWwgfHwge307IH0KICBmdW5jdGlvbiBVSSgpIHsgcmV0dXJuIFYudWkgfHwge307IH0KICBmdW5jdGlvbiBBUEkoKSB7IHJldHVybiBWLmFwaSB8fCB7fTsgfQogIGZ1bmN0aW9uIFNUKCkgeyByZXR1cm4gVi5zdGF0ZSB8fCB7fTsgfQoKICBmdW5jdGlvbiBlbCh0YWcsIGF0dHJzKSB7CiAgICB2YXIgdWkgPSBVSSgpOwogICAgaWYgKHVpICYmIHR5cGVvZiB1aS5lbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHVpLmVsLmFwcGx5KHVpLCBhcmd1bWVudHMpOwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMpIHsKICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwogICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybjsKICAgICAgICBpZiAoayA9PT0gJ2NsYXNzJykgbm9kZS5jbGFzc05hbWUgPSB2OwogICAgICAgIGVsc2UgaWYgKGsgPT09ICd0ZXh0Jykgbm9kZS50ZXh0Q29udGVudCA9IHY7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ3N0eWxlJyAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcpIE9iamVjdC5hc3NpZ24obm9kZS5zdHlsZSwgdik7CiAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdvbicpID09PSAwICYmIHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCB2KTsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ2RhdGEtJykgPT09IDAgfHwgay5pbmRleE9mKCdhcmlhLScpID09PSAwKSBub2RlLnNldEF0dHJpYnV0ZShrLCB2KTsKICAgICAgICBlbHNlIGlmIChrIGluIG5vZGUpIHsgdHJ5IHsgbm9kZVtrXSA9IHY7IH0gY2F0Y2ggKGUpIHsgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdik7IH0gfQogICAgICAgIGVsc2Ugbm9kZS5zZXRBdHRyaWJ1dGUoaywgdik7CiAgICAgIH0pOwogICAgfQogICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGMgPSBhcmd1bWVudHNbaV07CiAgICAgIGlmIChjID09IG51bGwpIGNvbnRpbnVlOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgYy5mb3JFYWNoKGZ1bmN0aW9uIChjYykgeyBpZiAoY2MgIT0gbnVsbCkgbm9kZS5hcHBlbmRDaGlsZCh0ZXh0T3JOb2RlKGNjKSk7IH0pOwogICAgICBlbHNlIG5vZGUuYXBwZW5kQ2hpbGQodGV4dE9yTm9kZShjKSk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CiAgZnVuY3Rpb24gdGV4dE9yTm9kZShjKSB7CiAgICByZXR1cm4gKHR5cGVvZiBjID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYyA9PT0gJ251bWJlcicpID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGMpKSA6IGM7CiAgfQoKICBmdW5jdGlvbiBpY29uKG5hbWUpIHsKICAgIHZhciB1aSA9IFVJKCk7CiAgICBpZiAodWkgJiYgdHlwZW9mIHVpLmljb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIHIgPSB1aS5pY29uKG5hbWUpOwogICAgICBpZiAodHlwZW9mIHIgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICBzcGFuLmlubmVySFRNTCA9IHI7CiAgICAgICAgcmV0dXJuIHNwYW47CiAgICAgIH0KICAgICAgaWYgKHIgJiYgci5ub2RlVHlwZSkgcmV0dXJuIHI7CiAgICB9CiAgICB2YXIgZmFsbGJhY2sgPSB7CiAgICAgIGVkaXQ6ICfinI4nLCB2YXJpYXRpb25zOiAn4oa7JywgYW5pbWF0ZTogJ+KWticsIGRvd25sb2FkOiAn4qSTJywKICAgICAgaGVhcnQ6ICfimaEnLCAnaGVhcnQuZmlsbCc6ICfimaUnLCB0cmFzaDogJ+KclScsIHNoYXJlOiAn4oaXJywKICAgICAgcHVibGlzaDogJ+KYgScsIGJvb2ttYXJrOiAn4piGJywgY29weTogJ+KniScsIGNsb3NlOiAn4pyVJywKICAgICAgcGhvdG86ICfilqMnLCB2aWRlbzogJ+KWticsIGFycm93TGVmdDogJ+KAuScsIGFycm93UmlnaHQ6ICfigLonLAogICAgICBpbmZvOiAnaScsIHNwYXJrbGVzOiAn4pyoJwogICAgfTsKICAgIHZhciBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIHMudGV4dENvbnRlbnQgPSBmYWxsYmFja1tuYW1lXSB8fCAn4oCiJzsKICAgIHJldHVybiBzOwogIH0KCiAgZnVuY3Rpb24gdG9hc3QobXNnLCBraW5kKSB7CiAgICB2YXIgdWkgPSBVSSgpOwogICAgaWYgKHVpICYmIHR5cGVvZiB1aS50b2FzdCA9PT0gJ2Z1bmN0aW9uJykgeyB1aS50b2FzdChtc2csIGtpbmQgfHwgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICB0cnkgeyAoVi5zdG9yZSAmJiBWLnN0b3JlLmVtaXQpICYmIFYuc3RvcmUuZW1pdCgndG9hc3QnLCB7IG1zZzogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsgfSBjYXRjaCAoZSkge30KICB9CgogIGZ1bmN0aW9uIGNvbmZpcm1EaWFsb2cobXNnLCBvcHRzKSB7CiAgICB2YXIgdWkgPSBVSSgpOwogICAgaWYgKHVpICYmIHR5cGVvZiB1aS5jb25maXJtID09PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVpLmNvbmZpcm0obXNnLCBvcHRzIHx8IHt9KSk7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5jb25maXJtKG1zZykpOwogIH0KCiAgZnVuY3Rpb24gZ28oaGFzaCkgewogICAgaWYgKFYucm91dGVyICYmIHR5cGVvZiBWLnJvdXRlci5nbyA9PT0gJ2Z1bmN0aW9uJykgVi5yb3V0ZXIuZ28oaGFzaCk7CiAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gaGFzaDsKICB9CgogIGZ1bmN0aW9uIGZtdERhdGUoZCkgewogICAgdmFyIHUgPSBVKCk7CiAgICBpZiAodSAmJiB0eXBlb2YgdS5mbXREYXRlID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IHJldHVybiB1LmZtdERhdGUoZCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIHZhciBkYXRlID0gcGFyc2VEYXRlKGQpOwogICAgaWYgKCFkYXRlKSByZXR1cm4gJyc7CiAgICB0cnkgeyByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZygpOyB9IGNhdGNoIChlKSB7IHJldHVybiBTdHJpbmcoZCk7IH0KICB9CgogIGZ1bmN0aW9uIHBhcnNlRGF0ZShkKSB7CiAgICBpZiAoZCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChkIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGlzTmFOKGQuZ2V0VGltZSgpKSA/IG51bGwgOiBkOwogICAgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJykgewogICAgICB2YXIgbXMgPSBkID4gMWUxMiA/IGQgOiBkICogMTAwMDsKICAgICAgdmFyIGR0ID0gbmV3IERhdGUobXMpOwogICAgICByZXR1cm4gaXNOYU4oZHQuZ2V0VGltZSgpKSA/IG51bGwgOiBkdDsKICAgIH0KICAgIGlmICh0eXBlb2YgZCA9PT0gJ3N0cmluZycpIHsKICAgICAgdmFyIHAgPSBuZXcgRGF0ZShkKTsKICAgICAgaWYgKCFpc05hTihwLmdldFRpbWUoKSkpIHJldHVybiBwOwogICAgICB2YXIgbiA9IE51bWJlcihkKTsKICAgICAgaWYgKCFpc05hTihuKSkgcmV0dXJuIHBhcnNlRGF0ZShuKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gZG93bmxvYWQodXJsLCBmaWxlbmFtZSkgewogICAgdmFyIHUgPSBVKCk7CiAgICBpZiAodSAmJiB0eXBlb2YgdS5kb3dubG9hZCA9PT0gJ2Z1bmN0aW9uJykgeyB1LmRvd25sb2FkKHVybCwgZmlsZW5hbWUpOyByZXR1cm47IH0KICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgYS5ocmVmID0gdXJsOyBhLmRvd25sb2FkID0gZmlsZW5hbWUgfHwgJyc7IGEucmVsID0gJ25vb3BlbmVyJzsgYS50YXJnZXQgPSAnX2JsYW5rJzsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7IGEuY2xpY2soKTsgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTsKICB9CgogIGZ1bmN0aW9uIGltYWdlSUQoaW1nKSB7IHJldHVybiBpbWcgPyAoaW1nLnJlbW90ZUlEIHx8IGltZy5pZCB8fCBudWxsKSA6IG51bGw7IH0KCiAgZnVuY3Rpb24gaXNPd25JbWFnZShpbWcpIHsKICAgIGlmICghaW1nKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgbGliID0gU1QoKS5saWJyYXJ5IHx8IFtdOwogICAgdmFyIGlkID0gaW1hZ2VJRChpbWcpOwogICAgcmV0dXJuIGxpYi5zb21lKGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWFnZUlEKHVud3JhcCh4KSkgPT09IGlkOyB9KTsKICB9CgogIGZ1bmN0aW9uIG1vZGVsTGFiZWwocmF3KSB7CiAgICBpZiAoIXJhdykgcmV0dXJuICcnOwogICAgdmFyIG1vZGVscyA9IChWLmRhdGEgJiYgVi5kYXRhLm1vZGVscykgfHwgW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVscy5sZW5ndGg7IGkrKykgeyBpZiAobW9kZWxzW2ldLnJhdyA9PT0gcmF3KSByZXR1cm4gbW9kZWxzW2ldLmxhYmVsOyB9CiAgICByZXR1cm4gcmF3OwogIH0KCiAgZnVuY3Rpb24gbW9kZWxDb3N0KHJhdykgewogICAgdmFyIG1vZGVscyA9IChWLmRhdGEgJiYgVi5kYXRhLm1vZGVscykgfHwgW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVscy5sZW5ndGg7IGkrKykgeyBpZiAobW9kZWxzW2ldLnJhdyA9PT0gcmF3ICYmIHR5cGVvZiBtb2RlbHNbaV0uY29zdCA9PT0gJ251bWJlcicpIHJldHVybiBtb2RlbHNbaV0uY29zdDsgfQogICAgdmFyIHQyaSA9IFYuZGF0YSAmJiBWLmRhdGEudDJpTW9kZWw7CiAgICBpZiAodDJpICYmIHQyaS5yYXcgPT09IHJhdyAmJiB0eXBlb2YgdDJpLmNvc3QgPT09ICdudW1iZXInKSByZXR1cm4gdDJpLmNvc3Q7CiAgICByZXR1cm4gMTA7CiAgfQoKICBmdW5jdGlvbiBpbWFnZURpbWVuc2lvbnMoaW1nKSB7CiAgICBpZiAoIWltZykgcmV0dXJuIG51bGw7CiAgICB2YXIgdyA9IGltZy53aWR0aCB8fCBpbWcuaW1hZ2VXaWR0aCB8fCAoaW1nLmltYWdlX3NpemUgJiYgaW1nLmltYWdlX3NpemUud2lkdGgpIHx8IChpbWcuaW1hZ2VTaXplICYmIGltZy5pbWFnZVNpemUud2lkdGgpIHx8IG51bGw7CiAgICB2YXIgaCA9IGltZy5oZWlnaHQgfHwgaW1nLmltYWdlSGVpZ2h0IHx8IChpbWcuaW1hZ2Vfc2l6ZSAmJiBpbWcuaW1hZ2Vfc2l6ZS5oZWlnaHQpIHx8IChpbWcuaW1hZ2VTaXplICYmIGltZy5pbWFnZVNpemUuaGVpZ2h0KSB8fCBudWxsOwogICAgaWYgKHcgJiYgaCkgcmV0dXJuIE1hdGgucm91bmQodykgKyAnIMOXICcgKyBNYXRoLnJvdW5kKGgpOwogICAgaWYgKHR5cGVvZiBpbWcuYXNwZWN0UmF0aW8gPT09ICdudW1iZXInICYmIGltZy5hc3BlY3RSYXRpbyA+IDApIHsKICAgICAgcmV0dXJuIGltZy5hc3BlY3RSYXRpbyA+PSAxID8gJ0xhbmRzY2FwZScgOiAnUG9ydHJhaXQnOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiBjcmVkaXRDb3N0KGltZykgewogICAgaWYgKCFpbWcpIHJldHVybiBudWxsOwogICAgaWYgKHR5cGVvZiBpbWcuY3JlZGl0c0Nvc3QgPT09ICdudW1iZXInKSByZXR1cm4gaW1nLmNyZWRpdHNDb3N0OwogICAgaWYgKHR5cGVvZiBpbWcuY3JlZGl0Q29zdCA9PT0gJ251bWJlcicpIHJldHVybiBpbWcuY3JlZGl0Q29zdDsKICAgIGlmICh0eXBlb2YgaW1nLmNvc3QgPT09ICdudW1iZXInKSByZXR1cm4gaW1nLmNvc3Q7CiAgICBpZiAoaW1nLnZpZGVvVVJMKSByZXR1cm4gNTA7CiAgICBpZiAoaW1nLm1vZGVsKSByZXR1cm4gbW9kZWxDb3N0KGltZy5tb2RlbCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHJhdGUocmVtb3RlSUQsIGFjdGlvbikgewogICAgaWYgKCFyZW1vdGVJRCkgcmV0dXJuOwogICAgdmFyIGFwaSA9IEFQSSgpOwogICAgaWYgKGFwaSAmJiB0eXBlb2YgYXBpLnJhdGluZyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgeyBQcm9taXNlLnJlc29sdmUoYXBpLnJhdGluZyhyZW1vdGVJRCwgYWN0aW9uKSkuY2F0Y2goZnVuY3Rpb24gKCkge30pOyB9IGNhdGNoIChlKSB7fQogICAgfQogIH0KCiAgZnVuY3Rpb24gYnVzeShidG4sIG9uKSB7CiAgICBpZiAoIWJ0bikgcmV0dXJuOwogICAgYnRuLmRpc2FibGVkID0gISFvbjsKICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtYnVzeScsIG9uID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnaXMtYnVzeScsICEhb24pOwogICAgYnRuLnN0eWxlLm9wYWNpdHkgPSBvbiA/ICcwLjYnIDogJyc7CiAgICBidG4uc3R5bGUucG9pbnRlckV2ZW50cyA9IG9uID8gJ25vbmUnIDogJyc7CiAgfQoKICBmdW5jdGlvbiBmaW5kSW5TdGF0ZShpZCkgewogICAgaWYgKCFpZCkgcmV0dXJuIG51bGw7CiAgICB2YXIgcG9vbHMgPSBbU1QoKS5saWJyYXJ5IHx8IFtdLCBTVCgpLmZlZWQgfHwgW11dOwogICAgZm9yICh2YXIgcCA9IDA7IHAgPCBwb29scy5sZW5ndGg7IHArKykgewogICAgICB2YXIgcG9vbCA9IHBvb2xzW3BdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvb2wubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgaW1nID0gdW53cmFwKHBvb2xbaV0pOwogICAgICAgIGlmIChpbWFnZUlEKGltZykgPT09IGlkIHx8IChpbWcgJiYgaW1nLmlkID09PSBpZCkgfHwgKGltZyAmJiBpbWcucmVtb3RlSUQgPT09IGlkKSkgcmV0dXJuIGltZzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiB1bndyYXAoaXRlbSkgewogICAgaWYgKCFpdGVtKSByZXR1cm4gaXRlbTsKICAgIGlmIChpdGVtLmdlbmVyYXRlZEltYWdlKSByZXR1cm4gaXRlbS5nZW5lcmF0ZWRJbWFnZTsKICAgIHJldHVybiBpdGVtOwogIH0KCiAgZnVuY3Rpb24gcmVzb2x2ZUltYWdlKGlkKSB7CiAgICB2YXIgbG9jYWwgPSBmaW5kSW5TdGF0ZShpZCk7CiAgICBpZiAobG9jYWwpIHJldHVybiBQcm9taXNlLnJlc29sdmUobG9jYWwpOwogICAgdmFyIGFwaSA9IEFQSSgpOwogICAgaWYgKGFwaSAmJiB0eXBlb2YgYXBpLmxpYnJhcnkgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIHBhZ2UgPSAxLCBwZXIgPSA2MCwgbWF4UGFnZXMgPSA1OwogICAgICB2YXIgc3RlcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaS5saWJyYXJ5KHBhZ2UsIHBlcikpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgdmFyIGl0ZW1zID0gKHJlcyAmJiAocmVzLml0ZW1zIHx8IHJlcykpIHx8IFtdOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgaW1nID0gdW53cmFwKGl0ZW1zW2ldKTsKICAgICAgICAgICAgaWYgKGltYWdlSUQoaW1nKSA9PT0gaWQpIHJldHVybiBpbWc7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgbWV0YSA9IHJlcyAmJiByZXMubWV0YWRhdGE7CiAgICAgICAgICB2YXIgbW9yZSA9IGl0ZW1zLmxlbmd0aCA+PSBwZXIgJiYgKCFtZXRhIHx8IHBhZ2UgKiBwZXIgPCBtZXRhLnRvdGFsKSAmJiBwYWdlIDwgbWF4UGFnZXM7CiAgICAgICAgICBpZiAobW9yZSkgeyBwYWdlKys7IHJldHVybiBzdGVwKCk7IH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH0pOwogICAgICB9OwogICAgICByZXR1cm4gc3RlcCgpOwogICAgfQogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkU2libGluZ3MoaW1nKSB7CiAgICB2YXIgbGliID0gKFNUKCkubGlicmFyeSB8fCBbXSkubWFwKHVud3JhcCk7CiAgICB2YXIgZmVlZCA9IChTVCgpLmZlZWQgfHwgW10pLm1hcCh1bndyYXApOwogICAgdmFyIGlkID0gaW1hZ2VJRChpbWcpOwogICAgaWYgKGxpYi5zb21lKGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWFnZUlEKHgpID09PSBpZDsgfSkpIHJldHVybiBsaWI7CiAgICBpZiAoZmVlZC5zb21lKGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWFnZUlEKHgpID09PSBpZDsgfSkpIHJldHVybiBmZWVkOwogICAgcmV0dXJuIGxpYi5sZW5ndGggPyBsaWIgOiBmZWVkOwogIH0KCiAgZnVuY3Rpb24gbmF2aWdhdGUoZGVsdGEpIHsKICAgIGlmICghX3NpYmxpbmdzLmxlbmd0aCkgcmV0dXJuOwogICAgdmFyIG5leHQgPSBfaW5kZXggKyBkZWx0YTsKICAgIGlmIChuZXh0IDwgMCB8fCBuZXh0ID49IF9zaWJsaW5ncy5sZW5ndGgpIHJldHVybjsKICAgIHZhciB0YXJnZXQgPSBfc2libGluZ3NbbmV4dF07CiAgICB2YXIgdGlkID0gaW1hZ2VJRCh0YXJnZXQpOwogICAgaWYgKCF0aWQpIHJldHVybjsKICAgIGdvKCcjL2ltYWdlLycgKyBlbmNvZGVVUklDb21wb25lbnQodGlkKSk7CiAgfQoKICBmdW5jdGlvbiBidWlsZE1lZGlhKCkgewogICAgdmFyIHN0YWdlID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0dWRpb19fc3RhZ2UnLCAnZGF0YS1yb2xlJzogJ3N0YWdlJywgc3R5bGU6IHsKICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsIGZsZXg6ICcxIDEgYXV0bycsIGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsCiAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJywgbWluSGVpZ2h0OiAnMCcsIG1pbldpZHRoOiAnMCcsIHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnCiAgICB9IH0pOwoKICAgIHZhciBoYXNWaWRlbyA9ICEhX2ltYWdlLnZpZGVvVVJMOwogICAgdmFyIGhhc0JlZm9yZSA9ICEhX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwgJiYgISFfaW1hZ2UucmVtb3RlSW1hZ2VVUkw7CgogICAgaWYgKGhhc1ZpZGVvKSB7CiAgICAgIHZhciB2aWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpOwogICAgICB2aWQuY2xhc3NOYW1lID0gJ3Ytc3R1ZGlvX192aWRlbyc7CiAgICAgIHZpZC5tdXRlZCA9IHRydWU7IHZpZC5sb29wID0gdHJ1ZTsgdmlkLmF1dG9wbGF5ID0gdHJ1ZTsKICAgICAgdmlkLnNldEF0dHJpYnV0ZSgncGxheXNpbmxpbmUnLCAnJyk7IHZpZC5zZXRBdHRyaWJ1dGUoJ3dlYmtpdC1wbGF5c2lubGluZScsICcnKTsKICAgICAgdmlkLnByZWxvYWQgPSAnYXV0byc7CiAgICAgIHZpZC5wb3N0ZXIgPSBfaW1hZ2UucmVtb3RlSW1hZ2VVUkwgfHwgJyc7CiAgICAgIHZpZC5zcmMgPSBfaW1hZ2UudmlkZW9VUkw7CiAgICAgIHZpZC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnQW5pbWF0ZWQgcmVzdWx0Jyk7CiAgICAgIE9iamVjdC5hc3NpZ24odmlkLnN0eWxlLCBtZWRpYUZpdFN0eWxlKCkpOwogICAgICB2aWQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgc3RhZ2UuY2xhc3NMaXN0LmFkZCgnaXMtZXJyb3InKTsKICAgICAgICBzdGFnZS5hcHBlbmRDaGlsZChtZWRpYUVycm9yKCdDb3VsZG7igJl0IGxvYWQgdGhlIHZpZGVvLicpKTsKICAgICAgfSk7CiAgICAgIHZpZC5wbGF5ICYmIHZpZC5wbGF5KCkuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgICBzdGFnZS5hcHBlbmRDaGlsZCh2aWQpOwogICAgICBpZiAoX2ltYWdlLnJlbW90ZUltYWdlVVJMKSBzdGFnZS5hcHBlbmRDaGlsZChtZWRpYVRvZ2dsZSgncGhvdG8nLCAnU2hvdyBzdGlsbCcsIGZ1bmN0aW9uICgpIHsgc2hvd1N0aWxsKHN0YWdlKTsgfSkpOwogICAgfSBlbHNlIGlmIChoYXNCZWZvcmUpIHsKICAgICAgX3NjcnViTm9kZSA9IGJ1aWxkU2NydWIoKTsKICAgICAgc3RhZ2UuYXBwZW5kQ2hpbGQoX3NjcnViTm9kZSk7CiAgICB9IGVsc2UgaWYgKF9pbWFnZS5yZW1vdGVJbWFnZVVSTCkgewogICAgICBzdGFnZS5hcHBlbmRDaGlsZChidWlsZFNpbmdsZUltYWdlKHN0YWdlKSk7CiAgICB9IGVsc2UgewogICAgICBzdGFnZS5hcHBlbmRDaGlsZChtZWRpYUVycm9yKCdObyBpbWFnZSBhdmFpbGFibGUuJykpOwogICAgfQogICAgcmV0dXJuIHN0YWdlOwogIH0KCiAgZnVuY3Rpb24gbWVkaWFGaXRTdHlsZSgpIHsKICAgIHJldHVybiB7CiAgICAgIG1heFdpZHRoOiAnMTAwJScsIG1heEhlaWdodDogJzEwMCUnLCB3aWR0aDogJ2F1dG8nLCBoZWlnaHQ6ICdhdXRvJywKICAgICAgb2JqZWN0Rml0OiAnY29udGFpbicsIGJvcmRlclJhZGl1czogJ3ZhcigtLXYtcmFkaXVzLCAyNHB4KScsCiAgICAgIGJveFNoYWRvdzogJzAgMzBweCA5MHB4IC0zMHB4IHJnYmEoMCwwLDAsLjcpJywgZGlzcGxheTogJ2Jsb2NrJwogICAgfTsKICB9CgogIGZ1bmN0aW9uIG1lZGlhVG9nZ2xlKGljb25OYW1lLCBsYWJlbCwgb25DbGljaykgewogICAgdmFyIGJ0biA9IGdsYXNzQnRuKGljb25OYW1lLCBsYWJlbCwgb25DbGljaywgeyBjb21wYWN0OiB0cnVlIH0pOwogICAgT2JqZWN0LmFzc2lnbihidG4uc3R5bGUsIHsKICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsIGJvdHRvbTogJzE2cHgnLCBsZWZ0OiAnNTAlJywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNTAlKScsIHpJbmRleDogJzQnCiAgICB9KTsKICAgIHJldHVybiBidG47CiAgfQoKICBmdW5jdGlvbiBidWlsZFNjcnViKCkgewogICAgdmFyIHVpID0gVUkoKTsKICAgIGlmICh1aSAmJiB0eXBlb2YgdWkuc2NydWIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIG4gPSB1aS5zY3J1YihfaW1hZ2UucmVtb3RlT3JpZ2luYWxJbWFnZVVSTCwgX2ltYWdlLnJlbW90ZUltYWdlVVJMLCB7CiAgICAgICAgZWFnZXI6IHRydWUsIGJlZm9yZUFsdDogJ0JlZm9yZSB0cmFuc2Zvcm1hdGlvbicsIGFmdGVyQWx0OiAnQWZ0ZXIgdHJhbnNmb3JtYXRpb24nCiAgICAgIH0pOwogICAgICBpZiAobikgewogICAgICAgIE9iamVjdC5hc3NpZ24obi5zdHlsZSwgewogICAgICAgICAgd2lkdGg6ICcxMDAlJywgbWF4V2lkdGg6ICdtaW4oMTAwJSwgNzh2aCknLCBtYXhIZWlnaHQ6ICcxMDAlJywgbWFyZ2luOiAnMCBhdXRvJwogICAgICAgIH0pOwogICAgICAgIG4uY2xhc3NMaXN0LmFkZCgndi1zdHVkaW9fX3NjcnViJyk7CiAgICAgICAgZGVjb3JhdGVTY3J1YihuKTsKICAgICAgICByZXR1cm4gbjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbGxiYWNrU2NydWIoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwsIF9pbWFnZS5yZW1vdGVJbWFnZVVSTCk7CiAgfQoKICBmdW5jdGlvbiBkZWNvcmF0ZVNjcnViKGZlZWQpIHsKICAgIHZhciBjYXJkID0gZmVlZC5xdWVyeVNlbGVjdG9yKCcudmNhcmQnKTsKICAgIGlmICghY2FyZCB8fCBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fc2NydWItbGFiZWwnKSkgcmV0dXJuOwogICAgY2FyZC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXN0dWRpb19fc2NydWItbGFiZWwgdi1zdHVkaW9fX3NjcnViLWxhYmVsLS1iZWZvcmUnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIHRleHQ6ICdCZWZvcmUnIH0pKTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX3NjcnViLWxhYmVsIHYtc3R1ZGlvX19zY3J1Yi1sYWJlbC0tYWZ0ZXInLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsIHRleHQ6ICdBZnRlcicgfSkpOwogIH0KCiAgZnVuY3Rpb24gZmFsbGJhY2tTY3J1YihiZWZvcmVVUkwsIGFmdGVyVVJMKSB7CiAgICB2YXIgd3JhcCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndmNhcmQnLCBzdHlsZTogewogICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJywgd2lkdGg6ICcxMDAlJywgbWF4V2lkdGg6ICdtaW4oMTAwJSwgNzh2aCknLCBtYXhIZWlnaHQ6ICcxMDAlJywKICAgICAgbWFyZ2luOiAnMCBhdXRvJywgYm9yZGVyUmFkaXVzOiAndmFyKC0tdi1yYWRpdXMsIDI0cHgpJywgb3ZlcmZsb3c6ICdoaWRkZW4nLAogICAgICBib3hTaGFkb3c6ICcwIDMwcHggOTBweCAtMzBweCByZ2JhKDAsMCwwLC43KScsIHRvdWNoQWN0aW9uOiAnbm9uZScsIGN1cnNvcjogJ2V3LXJlc2l6ZScKICAgIH0gfSk7CiAgICB2YXIgYWZ0ZXIgPSBlbCgnaW1nJywgeyBjbGFzczogJ3ZhZnRlcicsIHNyYzogYWZ0ZXJVUkwsIGFsdDogJ0FmdGVyJywgZHJhZ2dhYmxlOiBmYWxzZSwKICAgICAgc3R5bGU6IHsgZGlzcGxheTogJ2Jsb2NrJywgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnYXV0bycgfSB9KTsKICAgIHZhciBiZWZvcmUgPSBlbCgnaW1nJywgeyBjbGFzczogJ3ZiZWZvcmUnLCBzcmM6IGJlZm9yZVVSTCwgYWx0OiAnQmVmb3JlJywgZHJhZ2dhYmxlOiBmYWxzZSwKICAgICAgc3R5bGU6IHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIGluc2V0OiAnMCcsIHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnLCBvYmplY3RGaXQ6ICdjb3ZlcicgfSB9KTsKICAgIHZhciBoYW5kbGUgPSBlbCgnZGl2JywgeyBjbGFzczogJ3ZzY3J1YicsICdhcmlhLWhpZGRlbic6ICd0cnVlJywgc3R5bGU6IHsKICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogJzAnLCBib3R0b206ICcwJywgd2lkdGg6ICcycHgnLCBiYWNrZ3JvdW5kOiAncmdiYSgyNTUsMjU1LDI1NSwuOSknLAogICAgICBib3hTaGFkb3c6ICcwIDAgMTJweCByZ2JhKDAsMCwwLC41KScsIHBvaW50ZXJFdmVudHM6ICdub25lJwogICAgfSB9KTsKICAgIHZhciBiZWZvcmVMYWJlbCA9IGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3R1ZGlvX19zY3J1Yi1sYWJlbCB2LXN0dWRpb19fc2NydWItbGFiZWwtLWJlZm9yZScsICdhcmlhLWhpZGRlbic6ICd0cnVlJywgdGV4dDogJ0JlZm9yZScgfSk7CiAgICB2YXIgYWZ0ZXJMYWJlbCA9IGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3R1ZGlvX19zY3J1Yi1sYWJlbCB2LXN0dWRpb19fc2NydWItbGFiZWwtLWFmdGVyJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCB0ZXh0OiAnQWZ0ZXInIH0pOwogICAgd3JhcC5hcHBlbmRDaGlsZChhZnRlcik7IHdyYXAuYXBwZW5kQ2hpbGQoYmVmb3JlKTsgd3JhcC5hcHBlbmRDaGlsZChoYW5kbGUpOwogICAgd3JhcC5hcHBlbmRDaGlsZChiZWZvcmVMYWJlbCk7IHdyYXAuYXBwZW5kQ2hpbGQoYWZ0ZXJMYWJlbCk7CiAgICB2YXIgcG9zID0gMC41LCBkcmFnZ2luZyA9IGZhbHNlLCBpZGxlID0gbnVsbCwgdDAgPSAwOwogICAgZnVuY3Rpb24gc2V0KHApIHsKICAgICAgcG9zID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgcCkpOwogICAgICBiZWZvcmUuc3R5bGUuY2xpcFBhdGggPSAnaW5zZXQoMCAnICsgKCgxIC0gcG9zKSAqIDEwMCkgKyAnJSAwIDApJzsKICAgICAgaGFuZGxlLnN0eWxlLmxlZnQgPSAocG9zICogMTAwKSArICclJzsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21FdmVudChlKSB7CiAgICAgIHZhciByID0gd3JhcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgdmFyIHggPSAoZS50b3VjaGVzID8gZS50b3VjaGVzWzBdLmNsaWVudFggOiBlLmNsaWVudFgpIC0gci5sZWZ0OwogICAgICBzZXQoeCAvIHIud2lkdGgpOwogICAgfQogICAgZnVuY3Rpb24gc3RhcnRJZGxlKCkgewogICAgICBzdG9wSWRsZSgpOwogICAgICBpZGxlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIGxvb3AodCkgewogICAgICAgIGlmIChkcmFnZ2luZykgcmV0dXJuOwogICAgICAgIGlmICghdDApIHQwID0gdDsKICAgICAgICB2YXIgcGhhc2UgPSAoKHQgLSB0MCkgLyAyNjAwKSAlIDE7CiAgICAgICAgc2V0KDAuNSArIDAuMyAqIE1hdGguc2luKHBoYXNlICogTWF0aC5QSSAqIDIpKTsKICAgICAgICBpZGxlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApOwogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0b3BJZGxlKCkgeyBpZiAoaWRsZSkgeyBjYW5jZWxBbmltYXRpb25GcmFtZShpZGxlKTsgaWRsZSA9IG51bGw7IH0gfQogICAgd3JhcC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGRyYWdnaW5nID0gdHJ1ZTsgd3JhcC5jbGFzc0xpc3QuYWRkKCdzY3J1YmJpbmcnKTsgc3RvcElkbGUoKTsKICAgICAgZnJvbUV2ZW50KGUpOyB0cnkgeyB3cmFwLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTsgfSBjYXRjaCAoZXIpIHt9CiAgICB9KTsKICAgIHdyYXAuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBmdW5jdGlvbiAoZSkgeyBpZiAoZHJhZ2dpbmcpIGZyb21FdmVudChlKTsgfSk7CiAgICB2YXIgZW5kID0gZnVuY3Rpb24gKCkgewogICAgICBpZiAoIWRyYWdnaW5nKSByZXR1cm47CiAgICAgIGRyYWdnaW5nID0gZmFsc2U7IHdyYXAuY2xhc3NMaXN0LnJlbW92ZSgnc2NydWJiaW5nJyk7CiAgICAgIHQwID0gMDsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGlmICghZHJhZ2dpbmcpIHN0YXJ0SWRsZSgpOyB9LCAyNDAwKTsKICAgIH07CiAgICB3cmFwLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7CiAgICB3cmFwLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBlbmQpOwogICAgc2V0KDAuNSk7IHN0YXJ0SWRsZSgpOwogICAgd3JhcC5kZXN0cm95ID0gc3RvcElkbGU7CiAgICByZXR1cm4gd3JhcDsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkU2luZ2xlSW1hZ2Uoc3RhZ2UpIHsKICAgIHZhciBpbWcgPSBlbCgnaW1nJywgewogICAgICBjbGFzczogJ3Ytc3R1ZGlvX19pbWcnLCBzcmM6IF9pbWFnZS5yZW1vdGVJbWFnZVVSTCwgZHJhZ2dhYmxlOiBmYWxzZSwKICAgICAgYWx0OiBfaW1hZ2UucHJvbXB0ID8gKCdHZW5lcmF0ZWQgaW1hZ2U6ICcgKyBfaW1hZ2UucHJvbXB0KSA6ICdHZW5lcmF0ZWQgaW1hZ2UnLAogICAgICBzdHlsZTogbWVkaWFGaXRTdHlsZSgpCiAgICB9KTsKICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKCkgeyBzdGFnZS5jbGFzc0xpc3QuYWRkKCdpcy1sb2FkZWQnKTsgfSk7CiAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoKSB7CiAgICAgIHN0YWdlLmNsYXNzTGlzdC5hZGQoJ2lzLWVycm9yJyk7CiAgICAgIGltZy5yZXBsYWNlV2l0aChtZWRpYUVycm9yKCdDb3VsZG7igJl0IGxvYWQgdGhlIGltYWdlLicpKTsKICAgIH0pOwogICAgcmV0dXJuIGltZzsKICB9CgogIGZ1bmN0aW9uIHNob3dTdGlsbChzdGFnZSkgewogICAgdmFyIGV4aXN0aW5nID0gc3RhZ2UucXVlcnlTZWxlY3RvcignLnYtc3R1ZGlvX192aWRlbycpOwogICAgaWYgKGV4aXN0aW5nKSBleGlzdGluZy5yZW1vdmUoKTsKICAgIHZhciBvbGRUb2dnbGUgPSBzdGFnZS5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX21lZGlhLXRvZ2dsZScpOwogICAgaWYgKG9sZFRvZ2dsZSkgb2xkVG9nZ2xlLnJlbW92ZSgpOwogICAgdmFyIGltZyA9IGJ1aWxkU2luZ2xlSW1hZ2Uoc3RhZ2UpOwogICAgc3RhZ2UuaW5zZXJ0QmVmb3JlKGltZywgc3RhZ2UuZmlyc3RDaGlsZCk7CiAgICB2YXIgYmFjayA9IG1lZGlhVG9nZ2xlKCd2aWRlbycsICdTaG93IHZpZGVvJywgZnVuY3Rpb24gKCkgeyByZWJ1aWxkTWVkaWEoKTsgfSk7CiAgICBzdGFnZS5hcHBlbmRDaGlsZChiYWNrKTsKICB9CgogIGZ1bmN0aW9uIG1lZGlhRXJyb3IobXNnKSB7CiAgICByZXR1cm4gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0dWRpb19fbWVkaWEtZXJyb3Igdi1lbXB0eScsIHJvbGU6ICdhbGVydCcsIHN0eWxlOiB7CiAgICAgIGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBnYXA6ICcxMHB4JywKICAgICAgY29sb3I6IElOS19TT0ZULCBwYWRkaW5nOiAnMjRweCcsIHRleHRBbGlnbjogJ2NlbnRlcicKICAgIH0gfSwgaWNvbignaW5mbycpLCBlbCgnc3BhbicsIHsgdGV4dDogbXNnIH0pKTsKICB9CgogIGZ1bmN0aW9uIGdsYXNzQnRuKGljb25OYW1lLCBsYWJlbCwgb25DbGljaywgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgYnRuID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6ICdnbGFzcy1idXR0b24gdi1zdHVkaW9fX2FjdGlvbicsCiAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICB0aXRsZTogbGFiZWwsCiAgICAgICdhcmlhLWxhYmVsJzogbGFiZWwsCiAgICAgICdhcmlhLXByZXNzZWQnOiBvcHRzLnRvZ2dsZSA/IChvcHRzLmFjdGl2ZSA/ICd0cnVlJyA6ICdmYWxzZScpIDogbnVsbAogICAgfSk7CiAgICBPYmplY3QuYXNzaWduKGJ0bi5zdHlsZSwgewogICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgYWxpZ25JdGVtczogJ2NlbnRlcicsCiAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJywgZ2FwOiAnNXB4JywgbWluV2lkdGg6ICc2NHB4JywKICAgICAgcGFkZGluZzogb3B0cy5jb21wYWN0ID8gJzlweCAxMnB4JyA6ICcxMXB4IDEwcHgnLAogICAgICBib3JkZXJSYWRpdXM6ICd2YXIoLS1yYWRpdXMtY29udGVudCwgMTJweCknLCBjdXJzb3I6ICdwb2ludGVyJywKICAgICAgY29sb3I6IElOSywgbGluZUhlaWdodDogJzEnLCBmbGV4OiAnMCAwIGF1dG8nLAogICAgICB0cmFuc2l0aW9uOiAndHJhbnNmb3JtIHZhcigtLWR1ci1pbnRlcmFjdGl2ZSwxNDBtcykgdmFyKC0tZ2xhc3MtZWFzZSksIGNvbG9yIHZhcigtLWR1ci1mYXN0LDkwbXMpIGVhc2UsIGJhY2tncm91bmQgdmFyKC0tZHVyLWZhc3QsOTBtcykgZWFzZScKICAgIH0pOwogICAgdmFyIGljb25XcmFwID0gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX2FjdGlvbi1pY29uJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLCBzdHlsZTogewogICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLCB3aWR0aDogJzI0cHgnLCBoZWlnaHQ6ICcyNHB4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJwogICAgfSB9LCBpY29uKGljb25OYW1lKSk7CiAgICBidG4uYXBwZW5kQ2hpbGQoaWNvbldyYXApOwogICAgaWYgKCFvcHRzLmNvbXBhY3QpIHsKICAgICAgYnRuLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytc3R1ZGlvX19hY3Rpb24tbGFiZWwnLCB0ZXh0OiBsYWJlbCwgc3R5bGU6IHsKICAgICAgICBmb250U2l6ZTogJzExcHgnLCBmb250V2VpZ2h0OiAnNjAwJywgY29sb3I6IElOS19TT0ZULCBsZXR0ZXJTcGFjaW5nOiAnLTAuMDFlbScKICAgICAgfSB9KSk7CiAgICB9CiAgICBhcHBseUFjdGlvblRvbmUoYnRuLCBvcHRzKTsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKCkgeyBpZiAoIWJ0bi5kaXNhYmxlZCkgYnRuLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKC0ycHgpJzsgfSk7CiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIGZ1bmN0aW9uICgpIHsgYnRuLnN0eWxlLnRyYW5zZm9ybSA9ICcnOyB9KTsKICAgIGlmICh0eXBlb2Ygb25DbGljayA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IG9uQ2xpY2soYnRuLCBlKTsgfSk7CiAgICB9CiAgICByZXR1cm4gYnRuOwogIH0KCiAgZnVuY3Rpb24gYXBwbHlBY3Rpb25Ub25lKGJ0biwgb3B0cykgewogICAgdmFyIGljb25XcmFwID0gYnRuLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uLWljb24nKTsKICAgIHZhciBsYWJlbCA9IGJ0bi5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX2FjdGlvbi1sYWJlbCcpOwogICAgaWYgKG9wdHMuZGFuZ2VyKSB7CiAgICAgIGJ0bi5zdHlsZS5jb2xvciA9IEVSUk9SOwogICAgICBpZiAoaWNvbldyYXApIGljb25XcmFwLnN0eWxlLmNvbG9yID0gRVJST1I7CiAgICAgIGlmIChsYWJlbCkgbGFiZWwuc3R5bGUuY29sb3IgPSBFUlJPUjsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG9wdHMucHJpbWFyeSB8fCBvcHRzLmFjdGl2ZSkgewogICAgICBidG4uc3R5bGUuY29sb3IgPSBBQ0NFTlQ7CiAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCAnICsgQUNDRU5UICsgJyAxNiUsIHRyYW5zcGFyZW50KSc7CiAgICAgIGlmIChpY29uV3JhcCkgaWNvbldyYXAuc3R5bGUuY29sb3IgPSBBQ0NFTlQ7CiAgICAgIGlmIChsYWJlbCkgbGFiZWwuc3R5bGUuY29sb3IgPSBBQ0NFTlQ7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpY29uV3JhcCkgaWNvbldyYXAuc3R5bGUuY29sb3IgPSBBQ0NFTlRfU09GVDsKICB9CgogIGZ1bmN0aW9uIGFjdEVkaXQoKSB7CiAgICB2YXIgcGFyYW1zID0gW107CiAgICBpZiAoX2ltYWdlLnByb21wdCkgcGFyYW1zLnB1c2goJ3Byb21wdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KF9pbWFnZS5wcm9tcHQpKTsKICAgIGlmIChfaW1hZ2UubW9kZWwpIHBhcmFtcy5wdXNoKCdtb2RlbD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KF9pbWFnZS5tb2RlbCkpOwogICAgaWYgKF9pbWFnZS5yZW1vdGVJbWFnZVVSTCkgcGFyYW1zLnB1c2goJ2ltYWdlPScgKyBlbmNvZGVVUklDb21wb25lbnQoX2ltYWdlLnJlbW90ZUltYWdlVVJMKSk7CiAgICBnbygnIy9jcmVhdGUnICsgKHBhcmFtcy5sZW5ndGggPyAnPycgKyBwYXJhbXMuam9pbignJicpIDogJycpKTsKICB9CgogIGZ1bmN0aW9uIGFjdFZhcmlhdGlvbnMoYnRuKSB7CiAgICB2YXIgbiA9IDQ7CiAgICB2YXIgbW9kZWwgPSBfaW1hZ2UubW9kZWwgfHwgKChWLmRhdGEgJiYgVi5kYXRhLm1vZGVscyAmJiBWLmRhdGEubW9kZWxzWzBdICYmIFYuZGF0YS5tb2RlbHNbMF0ucmF3KSB8fCAnZmx1eEtsZWluJyk7CiAgICB2YXIgdG90YWwgPSBtb2RlbENvc3QobW9kZWwpICogbjsKICAgIGNvbmZpcm1EaWFsb2coJ0dlbmVyYXRlICcgKyBuICsgJyB2YXJpYXRpb25zIG9mIHRoaXMgaW1hZ2U/IEFib3V0ICcgKyB0b3RhbCArICcgY3JlZGl0cy4nLCB7IHRpdGxlOiAnVmFyaWF0aW9ucycsIGNvbmZpcm1MYWJlbDogJ0dlbmVyYXRlJyB9KS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIGlmICghX2ltYWdlLnJlbW90ZUltYWdlVVJMIHx8ICFfaW1hZ2UucHJvbXB0KSB7IHRvYXN0KCdUaGlzIGltYWdlIGNhbuKAmXQgYmUgcmUtdmFyaWVkLicsICdlcnJvcicpOyByZXR1cm47IH0KICAgICAgYnVzeShidG4sIHRydWUpOwogICAgICBydW5WYXJpYXRpb25zKG1vZGVsLCBuKS50aGVuKGZ1bmN0aW9uIChtYWRlKSB7CiAgICAgICAgYnVzeShidG4sIGZhbHNlKTsKICAgICAgICBpZiAobWFkZSA+IDApIHsKICAgICAgICAgIHRvYXN0KG1hZGUgKyAnIHZhcmlhdGlvbicgKyAobWFkZSA9PT0gMSA/ICcnIDogJ3MnKSArICcgY3JlYXRlZC4nLCAnc3VjY2VzcycpOwogICAgICAgICAgaWYgKFYudWkgJiYgVi51aS5jb25mZXR0aSkgdHJ5IHsgVi51aS5jb25mZXR0aSgpOyB9IGNhdGNoIChlKSB7fQogICAgICAgICAgZ28oJyMvbGlicmFyeScpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0b2FzdCgnQ291bGRu4oCZdCBjcmVhdGUgdmFyaWF0aW9ucy4nLCAnZXJyb3InKTsKICAgICAgICB9CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBidXN5KGJ0biwgZmFsc2UpOwogICAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdWYXJpYXRpb24gZ2VuZXJhdGlvbiBmYWlsZWQuJywgJ2Vycm9yJyk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBydW5WYXJpYXRpb25zKG1vZGVsLCBuKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICBpZiAoIWFwaSB8fCB0eXBlb2YgYXBpLmdlbkVkaXQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGFwaS5wb2xsRWRpdCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgYXBpLnBvbGwgIT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignR2VuZXJhdGlvbiBBUEkgdW5hdmFpbGFibGUuJykpOwogICAgfQogICAgdmFyIHNlZWRCYXNlID0gKFUoKS5yYW5kb21TZWVkID8gVSgpLnJhbmRvbVNlZWQoKSA6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDFlNikpOwogICAgdmFyIG1hZGUgPSAwOwogICAgdmFyIGNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAoZnVuY3Rpb24gKGspIHsKICAgICAgICBjaGFpbiA9IGNoYWluLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIHNlZWQgPSAoc2VlZEJhc2UgKyBrICogOTE3MykgJSAxMDAwMDAwOwogICAgICAgICAgdmFyIGJvZHkgPSB7CiAgICAgICAgICAgIHByb21wdDogX2ltYWdlLnByb21wdCwKICAgICAgICAgICAgaW1hZ2VfdXJsOiBfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsCiAgICAgICAgICAgIGltYWdlX3VybHM6IFtfaW1hZ2UucmVtb3RlSW1hZ2VVUkxdLAogICAgICAgICAgICBzZWVkOiBzZWVkCiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIGFwaS5wb2xsKAogICAgICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBhcGkuZ2VuRWRpdChtb2RlbCwgYm9keSk7IH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gYXBpLnBvbGxFZGl0KG1vZGVsLCBpZCk7IH0sCiAgICAgICAgICAgIHt9CiAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICB2YXIgdXJsID0gcmVzdWx0ICYmIHJlc3VsdC5pbWFnZXMgJiYgcmVzdWx0LmltYWdlc1swXSAmJiByZXN1bHQuaW1hZ2VzWzBdLnVybDsKICAgICAgICAgICAgaWYgKCF1cmwpIHJldHVybjsKICAgICAgICAgICAgbWFkZSsrOwogICAgICAgICAgICByZXR1cm4gcGVyc2lzdFJlc3VsdCh1cmwsIHNlZWQsIG1vZGVsKTsKICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsKICAgICAgICB9KTsKICAgICAgfSkoaSk7CiAgICB9CiAgICByZXR1cm4gY2hhaW4udGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiBtYWRlOyB9KTsKICB9CgogIGZ1bmN0aW9uIHBlcnNpc3RSZXN1bHQodXJsLCBzZWVkLCBtb2RlbCkgewogICAgdmFyIGFwaSA9IEFQSSgpOwogICAgdmFyIGdlbiA9IHsKICAgICAgaWQ6IChVKCkudXVpZCA/IFUoKS51dWlkKCkgOiBTdHJpbmcoRGF0ZS5ub3coKSkgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyKSksCiAgICAgIHByb21wdDogX2ltYWdlLnByb21wdCwKICAgICAgcmVtb3RlSW1hZ2VVUkw6IHVybCwKICAgICAgcmVtb3RlT3JpZ2luYWxJbWFnZVVSTDogX2ltYWdlLnJlbW90ZUltYWdlVVJMLAogICAgICBwYXJlbnRJRDogaW1hZ2VJRChfaW1hZ2UpLAogICAgICBzZWVkOiBzZWVkLAogICAgICBtb2RlbDogbW9kZWwsCiAgICAgIGNyZWF0ZWREYXRlOiBEYXRlLm5vdygpIC8gMTAwMAogICAgfTsKICAgIGlmIChhcGkgJiYgdHlwZW9mIGFwaS5wZXJzaXN0SW1hZ2UgPT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkucGVyc2lzdEltYWdlKGdlbikpLnRoZW4oZnVuY3Rpb24gKHNhdmVkKSB7CiAgICAgICAgdmFyIGltZyA9IHVud3JhcChzYXZlZCkgfHwgZ2VuOwogICAgICAgIHB1c2hUb0xpYnJhcnkoaW1nKTsKICAgICAgICByZXR1cm4gaW1nOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHB1c2hUb0xpYnJhcnkoZ2VuKTsgcmV0dXJuIGdlbjsgfSk7CiAgICB9CiAgICBwdXNoVG9MaWJyYXJ5KGdlbik7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGdlbik7CiAgfQoKICBmdW5jdGlvbiBwdXNoVG9MaWJyYXJ5KGltZykgewogICAgdHJ5IHsKICAgICAgdmFyIGxpYiA9IFNUKCkubGlicmFyeSB8fCBbXTsKICAgICAgbGliLnVuc2hpZnQoaW1nKTsKICAgICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5zZXQpIFYuc3RvcmUuc2V0KCdsaWJyYXJ5JywgbGliKTsKICAgICAgZWxzZSBWLnN0YXRlLmxpYnJhcnkgPSBsaWI7CiAgICAgIGlmIChWLnN0b3JlICYmIFYuc3RvcmUuZW1pdCkgVi5zdG9yZS5lbWl0KCdsaWJyYXJ5OmNoYW5nZWQnLCBsaWIpOwogICAgfSBjYXRjaCAoZSkge30KICB9CgogIGZ1bmN0aW9uIGFjdEFuaW1hdGUoYnRuKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICBpZiAoIWFwaSB8fCB0eXBlb2YgYXBpLmdlblZpZGVvTFRYICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBhcGkucG9sbFZpZGVvTFRYICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBhcGkucG9sbCAhPT0gJ2Z1bmN0aW9uJykgewogICAgICB0b2FzdCgnQW5pbWF0aW9uIGlzbuKAmXQgYXZhaWxhYmxlIHJpZ2h0IG5vdy4nLCAnZXJyb3InKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCFfaW1hZ2UucmVtb3RlSW1hZ2VVUkwpIHsgdG9hc3QoJ05vIGltYWdlIHRvIGFuaW1hdGUuJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgY29uZmlybURpYWxvZygnQW5pbWF0ZSB0aGlzIGltYWdlIGludG8gYSBzaG9ydCB2aWRlbz8gQWJvdXQgNTAgY3JlZGl0cy4nLCB7IHRpdGxlOiAnQW5pbWF0ZScsIGNvbmZpcm1MYWJlbDogJ0FuaW1hdGUnIH0pLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgYnVzeShidG4sIHRydWUpOwogICAgICB0b2FzdCgnQW5pbWF0aW5n4oCmIHRoaXMgY2FuIHRha2UgYSBtaW51dGUuJywgJ2luZm8nKTsKICAgICAgX3BvbGxBYm9ydCA9ICh0eXBlb2YgQWJvcnRDb250cm9sbGVyICE9PSAndW5kZWZpbmVkJykgPyBuZXcgQWJvcnRDb250cm9sbGVyKCkgOiBudWxsOwogICAgICB2YXIgc2lnbmFsID0gX3BvbGxBYm9ydCA/IF9wb2xsQWJvcnQuc2lnbmFsIDogdW5kZWZpbmVkOwogICAgICB2YXIgc2VlZCA9IChVKCkucmFuZG9tU2VlZCA/IFUoKS5yYW5kb21TZWVkKCkgOiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTYpKTsKICAgICAgdmFyIHJlcUJvZHkgPSB7IGltYWdlX3VybDogX2ltYWdlLnJlbW90ZUltYWdlVVJMLCBwcm9tcHQ6IF9pbWFnZS5wcm9tcHQgfHwgJycsIHNlZWQ6IHNlZWQgfTsKICAgICAgdmFyIGdlbkltZ0lEID0gaW1hZ2VJRChfaW1hZ2UpOwogICAgICBhcGkucG9sbCgKICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBhcGkuZ2VuVmlkZW9MVFgocmVxQm9keSk7IH0sCiAgICAgICAgZnVuY3Rpb24gKGlkKSB7IHJldHVybiAoYXBpLnBvbGxWaWRlb0xUWC5sZW5ndGggPj0gMikgPyBhcGkucG9sbFZpZGVvTFRYKGlkLCBnZW5JbWdJRCkgOiBhcGkucG9sbFZpZGVvTFRYKGlkKTsgfSwKICAgICAgICB7IHNpZ25hbDogc2lnbmFsLCBvblByb2dyZXNzOiBmdW5jdGlvbiAoKSB7fSB9CiAgICAgICkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgYnVzeShidG4sIGZhbHNlKTsKICAgICAgICBfcG9sbEFib3J0ID0gbnVsbDsKICAgICAgICB2YXIgdXJsID0gKHJlc3VsdCAmJiAocmVzdWx0LnZpZGVvVVJMIHx8IHJlc3VsdC52aWRlb191cmwgfHwKICAgICAgICAgIChyZXN1bHQudmlkZW8gJiYgcmVzdWx0LnZpZGVvLnVybCkgfHwKICAgICAgICAgIChyZXN1bHQuaW1hZ2VzICYmIHJlc3VsdC5pbWFnZXNbMF0gJiYgcmVzdWx0LmltYWdlc1swXS51cmwpKSkgfHwgbnVsbDsKICAgICAgICBpZiAoIXVybCkgeyB0b2FzdCgnQW5pbWF0aW9uIGZpbmlzaGVkIGJ1dCBubyB2aWRlbyBjYW1lIGJhY2suJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgICAgIF9pbWFnZS52aWRlb1VSTCA9IHVybDsKICAgICAgICBhcHBseUltYWdlTXV0YXRpb24oX2ltYWdlKTsKICAgICAgICByZWJ1aWxkTWVkaWEoKTsKICAgICAgICByZWJ1aWxkUGFuZWwoKTsKICAgICAgICB0b2FzdCgnWW91ciBhbmltYXRpb24gaXMgcmVhZHkuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICBpZiAoVi51aSAmJiBWLnVpLmNvbmZldHRpKSB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBidXN5KGJ0biwgZmFsc2UpOwogICAgICAgIF9wb2xsQWJvcnQgPSBudWxsOwogICAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykgcmV0dXJuOwogICAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdBbmltYXRpb24gZmFpbGVkLicsICdlcnJvcicpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gYWN0RG93bmxvYWQoYnRuKSB7CiAgICB2YXIgdXJsID0gX2ltYWdlLnJlbW90ZUltYWdlVVJMIHx8IF9pbWFnZS52aWRlb1VSTDsKICAgIGlmICghdXJsKSB7IHRvYXN0KCdOb3RoaW5nIHRvIGRvd25sb2FkLicsICdlcnJvcicpOyByZXR1cm47IH0KICAgIHZhciBuYW1lID0gJ3ZhbXAtJyArIChpbWFnZUlEKF9pbWFnZSkgfHwgRGF0ZS5ub3coKSk7CiAgICBpZiAoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwgJiYgX2ltYWdlLnJlbW90ZUltYWdlVVJMKSB7CiAgICAgIHZhciB1aSA9IFVJKCk7CiAgICAgIHZhciBtb2RhbFJlZiA9IG51bGw7CiAgICAgIGZ1bmN0aW9uIGRvbmVEbCgpIHsgaWYgKG1vZGFsUmVmICYmIG1vZGFsUmVmLmNsb3NlKSBtb2RhbFJlZi5jbG9zZSgpOyByYXRlKGltYWdlSUQoX2ltYWdlKSwgJ3NhdmUnKTsgfQogICAgICB2YXIgbWVudSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1zbScsIHN0eWxlOiB7IHBhZGRpbmc6ICc0cHgnIH0gfSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdEb3dubG9hZCcsIHN0eWxlOiB7IG1hcmdpbkJvdHRvbTogJzRweCcgfSB9KSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1wcmltYXJ5IHYtY3RhLS1ibG9jaycsIHR5cGU6ICdidXR0b24nLAogICAgICAgICAgb25jbGljazogZnVuY3Rpb24gKCkgeyBkb3dubG9hZChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsIG5hbWUgKyAnLWFmdGVyLmpwZycpOyBkb25lRGwoKTsgfSB9LCAnRG93bmxvYWQgYWZ0ZXInKSwKICAgICAgICBlbCgnYnV0dG9uJywgeyBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCB2LWN0YS0tYmxvY2snLCB0eXBlOiAnYnV0dG9uJywKICAgICAgICAgIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgZG93bmxvYWQoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwsIG5hbWUgKyAnLWJlZm9yZS5qcGcnKTsgZG9uZURsKCk7IH0gfSwgJ0Rvd25sb2FkIGJlZm9yZScpLAogICAgICAgIGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1ibG9jaycsIHR5cGU6ICdidXR0b24nLAogICAgICAgICAgb25jbGljazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBkb3dubG9hZChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsIG5hbWUgKyAnLWFmdGVyLmpwZycpOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgZG93bmxvYWQoX2ltYWdlLnJlbW90ZU9yaWdpbmFsSW1hZ2VVUkwsIG5hbWUgKyAnLWJlZm9yZS5qcGcnKTsgfSwgMzUwKTsKICAgICAgICAgICAgZG9uZURsKCk7CiAgICAgICAgICB9IH0sICdEb3dubG9hZCBib3RoJykKICAgICAgKTsKICAgICAgaWYgKHVpICYmIHR5cGVvZiB1aS5tb2RhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIG1vZGFsUmVmID0gdWkubW9kYWwobWVudSwgeyBhcmlhTGFiZWw6ICdEb3dubG9hZCBvcHRpb25zJyB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkb3dubG9hZChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsIG5hbWUgKyAnLWFmdGVyLmpwZycpOwogICAgICAgIHJhdGUoaW1hZ2VJRChfaW1hZ2UpLCAnc2F2ZScpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBleHQgPSBfaW1hZ2UudmlkZW9VUkwgJiYgdXJsID09PSBfaW1hZ2UudmlkZW9VUkwgPyAnLm1wNCcgOiAnLmpwZyc7CiAgICBkb3dubG9hZCh1cmwsIG5hbWUgKyBleHQpOwogICAgcmF0ZShpbWFnZUlEKF9pbWFnZSksICdzYXZlJyk7CiAgICB0b2FzdCgnU2F2ZWQuJywgJ3N1Y2Nlc3MnKTsKICB9CgogIGZ1bmN0aW9uIGFjdEZhdm9yaXRlKGJ0bikgewogICAgdmFyIGFwaSA9IEFQSSgpOwogICAgdmFyIGlkID0gaW1hZ2VJRChfaW1hZ2UpOwogICAgaWYgKCFpZCB8fCAhYXBpIHx8IHR5cGVvZiBhcGkuc2V0RmF2b3JpdGUgIT09ICdmdW5jdGlvbicpIHsgdG9hc3QoJ0Zhdm9yaXRlcyB1bmF2YWlsYWJsZS4nLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICB2YXIgbmV4dCA9ICFfaW1hZ2UuZmF2b3JpdGVkOwogICAgX2ltYWdlLmZhdm9yaXRlZCA9IG5leHQ7CiAgICByZWZsZWN0RmF2b3JpdGUoYnRuLCBuZXh0KTsKICAgIGJ1c3koYnRuLCB0cnVlKTsKICAgIFByb21pc2UucmVzb2x2ZShhcGkuc2V0RmF2b3JpdGUoaWQsIG5leHQpKS50aGVuKGZ1bmN0aW9uICh1cGRhdGVkKSB7CiAgICAgIGJ1c3koYnRuLCBmYWxzZSk7CiAgICAgIHZhciBpbWcgPSB1bndyYXAodXBkYXRlZCk7CiAgICAgIGlmIChpbWcgJiYgdHlwZW9mIGltZy5mYXZvcml0ZWQgPT09ICdib29sZWFuJykgeyBfaW1hZ2UuZmF2b3JpdGVkID0gaW1nLmZhdm9yaXRlZDsgcmVmbGVjdEZhdm9yaXRlKGJ0biwgaW1nLmZhdm9yaXRlZCk7IH0KICAgICAgYXBwbHlJbWFnZU11dGF0aW9uKF9pbWFnZSk7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgIGJ1c3koYnRuLCBmYWxzZSk7CiAgICAgIF9pbWFnZS5mYXZvcml0ZWQgPSAhbmV4dDsKICAgICAgcmVmbGVjdEZhdm9yaXRlKGJ0biwgX2ltYWdlLmZhdm9yaXRlZCk7CiAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdDb3VsZG7igJl0IHVwZGF0ZSBmYXZvcml0ZS4nLCAnZXJyb3InKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcmVmbGVjdEZhdm9yaXRlKGJ0biwgb24pIHsKICAgIGlmICghYnRuKSByZXR1cm47CiAgICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCBvbiA/ICd0cnVlJyA6ICdmYWxzZScpOwogICAgdmFyIGljb25XcmFwID0gYnRuLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uLWljb24nKTsKICAgIGlmIChpY29uV3JhcCkgeyBpY29uV3JhcC5pbm5lckhUTUwgPSAnJzsgaWNvbldyYXAuYXBwZW5kQ2hpbGQoaWNvbihvbiA/ICdoZWFydC5maWxsJyA6ICdoZWFydCcpKTsgfQogICAgdmFyIGxibCA9IGJ0bi5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX2FjdGlvbi1sYWJlbCcpOwogICAgaWYgKGxibCkgbGJsLnRleHRDb250ZW50ID0gb24gPyAnRmF2b3JpdGVkJyA6ICdGYXZvcml0ZSc7CiAgICBhcHBseUFjdGlvblRvbmUoYnRuLCB7IGFjdGl2ZTogb24gfSk7CiAgICBpZiAoIW9uICYmIGljb25XcmFwKSBpY29uV3JhcC5zdHlsZS5jb2xvciA9IEFDQ0VOVF9TT0ZUOwogICAgaWYgKCFvbiAmJiBsYmwpIGxibC5zdHlsZS5jb2xvciA9IElOS19TT0ZUOwogICAgaWYgKCFvbikgeyBidG4uc3R5bGUuY29sb3IgPSBJTks7IGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJyc7IH0KICB9CgogIGZ1bmN0aW9uIGFjdERlbGV0ZShidG4pIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIHZhciBpZCA9IGltYWdlSUQoX2ltYWdlKTsKICAgIGlmICghaWQgfHwgIWFwaSB8fCB0eXBlb2YgYXBpLmRlbGV0ZUltYWdlICE9PSAnZnVuY3Rpb24nKSB7IHRvYXN0KCdEZWxldGUgdW5hdmFpbGFibGUuJywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgY29uZmlybURpYWxvZygnRGVsZXRlIHRoaXMgaW1hZ2U/IFRoaXMgY2Fu4oCZdCBiZSB1bmRvbmUuJywgeyB0aXRsZTogJ0RlbGV0ZSBpbWFnZScsIGRlc3RydWN0aXZlOiB0cnVlLCBjb25maXJtTGFiZWw6ICdEZWxldGUnIH0pLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgYnVzeShidG4sIHRydWUpOwogICAgICBQcm9taXNlLnJlc29sdmUoYXBpLmRlbGV0ZUltYWdlKGlkKSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgcmF0ZShpZCwgJ2RlbGV0ZScpOwogICAgICAgIHJlbW92ZUZyb21TdGF0ZShpZCk7CiAgICAgICAgdG9hc3QoJ0ltYWdlIGRlbGV0ZWQuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICB2YXIgZnJlc2ggPSAoU1QoKS5saWJyYXJ5IHx8IFtdKS5tYXAodW53cmFwKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGltYWdlSUQoeCk7IH0pOwogICAgICAgIGlmIChmcmVzaC5sZW5ndGgpIHsKICAgICAgICAgIHZhciB0YXJnZXQgPSBmcmVzaFtNYXRoLm1pbihfaW5kZXgsIGZyZXNoLmxlbmd0aCAtIDEpXTsKICAgICAgICAgIGlmICh0YXJnZXQgJiYgaW1hZ2VJRCh0YXJnZXQpICE9PSBpZCkgeyBnbygnIy9pbWFnZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGltYWdlSUQodGFyZ2V0KSkpOyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgY2xvc2UoKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgIGJ1c3koYnRuLCBmYWxzZSk7CiAgICAgICAgdG9hc3QoKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ0RlbGV0ZSBmYWlsZWQuJywgJ2Vycm9yJyk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZW1vdmVGcm9tU3RhdGUoaWQpIHsKICAgIHRyeSB7CiAgICAgIFsnbGlicmFyeScsICdmZWVkJ10uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgdmFyIGFyciA9IFNUKClba2V5XTsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuOwogICAgICAgIHZhciBmaWx0ZXJlZCA9IGFyci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGltYWdlSUQodW53cmFwKHgpKSAhPT0gaWQ7IH0pOwogICAgICAgIGlmIChWLnN0b3JlICYmIFYuc3RvcmUuc2V0KSBWLnN0b3JlLnNldChrZXksIGZpbHRlcmVkKTsKICAgICAgICBlbHNlIFYuc3RhdGVba2V5XSA9IGZpbHRlcmVkOwogICAgICB9KTsKICAgICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5lbWl0KSBWLnN0b3JlLmVtaXQoJ2xpYnJhcnk6Y2hhbmdlZCcsIFNUKCkubGlicmFyeSk7CiAgICB9IGNhdGNoIChlKSB7fQogIH0KCiAgZnVuY3Rpb24gYWN0U2hhcmUoYnRuKSB7CiAgICB2YXIgaWQgPSBpbWFnZUlEKF9pbWFnZSk7CiAgICB2YXIgYmFzZSA9IChWLmNvbmZpZyAmJiBWLmNvbmZpZy5BUEkpID8gVi5jb25maWcuQVBJIDogJ2h0dHBzOi8vYXBpLnZvb3NleS5jb20nOwogICAgdmFyIHJlbmRlclVSTCA9IGlkID8gYmFzZSArICcvZ2VuZXJhdGVkL3JlbmRlci8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSA6IG51bGw7CiAgICB2YXIgdGV4dCA9IChfaW1hZ2UucHJvbXB0ID8gX2ltYWdlLnByb21wdCArICdcblxuJyA6ICcnKSArICdNYWRlIHdpdGggVmFtcCBieSBWb29zZXkuJzsKICAgIHJhdGUoaWQsICdzaGFyZScpOwogICAgaWYgKG5hdmlnYXRvci5zaGFyZSAmJiByZW5kZXJVUkwpIHsKICAgICAgbmF2aWdhdG9yLnNoYXJlKHsgdGl0bGU6ICdWYW1wJywgdGV4dDogdGV4dCwgdXJsOiByZW5kZXJVUkwgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykgcmV0dXJuOwogICAgICAgIGNvcHlTaGFyZUxpbmsocmVuZGVyVVJMKTsKICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChyZW5kZXJVUkwpIHsgY29weVNoYXJlTGluayhyZW5kZXJVUkwpOyB9CiAgICBlbHNlIGlmIChfaW1hZ2UucmVtb3RlSW1hZ2VVUkwpIHsgZG93bmxvYWQoX2ltYWdlLnJlbW90ZUltYWdlVVJMLCAndmFtcC0nICsgKGlkIHx8IERhdGUubm93KCkpICsgJy5qcGcnKTsgdG9hc3QoJ0ltYWdlIGRvd25sb2FkZWQuJywgJ3N1Y2Nlc3MnKTsgfQogICAgZWxzZSB7IHRvYXN0KCdOb3RoaW5nIHRvIHNoYXJlLicsICdlcnJvcicpOyB9CiAgfQoKICBmdW5jdGlvbiBjb3B5U2hhcmVMaW5rKHVybCkgewogICAgY29weVRleHQodXJsKS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/ICdTaGFyZSBsaW5rIGNvcGllZC4nIDogJ0NvcHkgdGhpcyBsaW5rOiAnICsgdXJsLCBvayA/ICdzdWNjZXNzJyA6ICdpbmZvJyk7IH0pOwogIH0KCiAgZnVuY3Rpb24gY29weVRleHQoc3RyKSB7CiAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkgewogICAgICByZXR1cm4gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc3RyKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9KTsKICAgIH0KICAgIHRyeSB7CiAgICAgIHZhciB0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICAgIHRhLnZhbHVlID0gc3RyOyB0YS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7IHRhLnN0eWxlLm9wYWNpdHkgPSAnMCc7CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOyB0YS5zZWxlY3QoKTsKICAgICAgdmFyIG9rID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsKICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0YSk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUob2spOwogICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsgfQogIH0KCiAgZnVuY3Rpb24gYWN0Q29weVByb21wdCgpIHsKICAgIGlmICghX2ltYWdlLnByb21wdCkgeyB0b2FzdCgnTm8gcHJvbXB0IHRvIGNvcHkuJywgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICBjb3B5VGV4dChfaW1hZ2UucHJvbXB0KS50aGVuKGZ1bmN0aW9uIChvaykgeyB0b2FzdChvayA/ICdQcm9tcHQgY29waWVkLicgOiAnQ291bGRu4oCZdCBjb3B5LicsIG9rID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJyk7IH0pOwogIH0KCiAgZnVuY3Rpb24gYWN0UHVibGlzaChidG4pIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIGlmICghYXBpKSB7IHRvYXN0KCdQdWJsaXNoaW5nIHVuYXZhaWxhYmxlLicsICdlcnJvcicpOyByZXR1cm47IH0KICAgIGNvbmZpcm1EaWFsb2coJ1B1Ymxpc2ggdGhpcyBpbWFnZSB0byB0aGUgcHVibGljIGZlZWQ/JywgeyB0aXRsZTogJ1B1Ymxpc2gnLCBjb25maXJtTGFiZWw6ICdQdWJsaXNoJyB9KS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICBpZiAoIW9rKSByZXR1cm47CiAgICAgIGJ1c3koYnRuLCB0cnVlKTsKICAgICAgZW5zdXJlUHJvZmlsZSgpLnRoZW4oZnVuY3Rpb24gKHByb2ZpbGVJRCkgewogICAgICAgIGlmICghcHJvZmlsZUlEKSB0aHJvdyBuZXcgRXJyb3IoJ05vIHByb2ZpbGUgYXZhaWxhYmxlLicpOwogICAgICAgIHJldHVybiBkb1B1Ymxpc2gocHJvZmlsZUlEKTsKICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgYnVzeShidG4sIGZhbHNlKTsKICAgICAgICBfaW1hZ2UucHVibGlzaGVkID0gdHJ1ZTsKICAgICAgICBhcHBseUltYWdlTXV0YXRpb24oX2ltYWdlKTsKICAgICAgICBhcHBseUFjdGlvblRvbmUoYnRuLCB7IGFjdGl2ZTogdHJ1ZSB9KTsKICAgICAgICB2YXIgbGJsID0gYnRuLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uLWxhYmVsJyk7CiAgICAgICAgaWYgKGxibCkgbGJsLnRleHRDb250ZW50ID0gJ1B1Ymxpc2hlZCc7CiAgICAgICAgdG9hc3QoJ1B1Ymxpc2hlZCB0byB5b3VyIGZlZWQuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICBpZiAoVi51aSAmJiBWLnVpLmNvbmZldHRpKSB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBidXN5KGJ0biwgZmFsc2UpOwogICAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8ICdQdWJsaXNoIGZhaWxlZC4nLCAnZXJyb3InKTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGVuc3VyZVByb2ZpbGUoKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICB2YXIgcGlkID0gKFNUKCkucHJvZmlsZSAmJiAoU1QoKS5wcm9maWxlLmlkIHx8IChTVCgpLnByb2ZpbGUubWljcm8gJiYgU1QoKS5wcm9maWxlLm1pY3JvLmlkKSkpIHx8CiAgICAgIChTVCgpLnVzZXIgJiYgKFNUKCkudXNlci5wcm9maWxlSUQgfHwgKFNUKCkudXNlci5wcm9maWxlICYmIFNUKCkudXNlci5wcm9maWxlLmlkKSkpIHx8IG51bGw7CiAgICBpZiAocGlkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBpZCk7CiAgICBpZiAodHlwZW9mIGFwaS5nZXRQcml2YXRlUHJvZmlsZSA9PT0gJ2Z1bmN0aW9uJyAmJiAoU1QoKS51c2VyICYmIChTVCgpLnVzZXIucHJvZmlsZUlEIHx8IFNUKCkudXNlci5pZCkpKSB7CiAgICAgIHZhciB0cnlJRCA9IFNUKCkudXNlci5wcm9maWxlSUQgfHwgU1QoKS51c2VyLmlkOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaS5nZXRQcml2YXRlUHJvZmlsZSh0cnlJRCkpLnRoZW4oZnVuY3Rpb24gKHApIHsKICAgICAgICB2YXIgaWQgPSBwICYmIChwLmlkIHx8IChwLmdsb2JhbCAmJiBwLmdsb2JhbC5taWNybyAmJiBwLmdsb2JhbC5taWNyby5pZCkgfHwgKHAubWljcm8gJiYgcC5taWNyby5pZCkpOwogICAgICAgIGlmIChpZCkgcmV0dXJuIGlkOwogICAgICAgIHJldHVybiBjcmVhdGVQcm9maWxlRmxvdygpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBjcmVhdGVQcm9maWxlRmxvdygpOyB9KTsKICAgIH0KICAgIHJldHVybiBjcmVhdGVQcm9maWxlRmxvdygpOwogIH0KCiAgZnVuY3Rpb24gY3JlYXRlUHJvZmlsZUZsb3coKSB7CiAgICB2YXIgYXBpID0gQVBJKCk7CiAgICBpZiAodHlwZW9mIGFwaS5jcmVhdGVQcm9maWxlICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgdmFyIG5hbWUgPSAoU1QoKS51c2VyICYmIChTVCgpLnVzZXIubmFtZSB8fCBTVCgpLnVzZXIudXNlcm5hbWUgfHwgU1QoKS51c2VyLmZpcnN0TmFtZSkpIHx8ICdNeSBTdHVkaW8nOwogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkuY3JlYXRlUHJvZmlsZSh7IGRpc3BsYXlOYW1lOiBuYW1lIH0pKS50aGVuKGZ1bmN0aW9uIChwKSB7CiAgICAgIHZhciBpZCA9IHAgJiYgKHAuaWQgfHwgKHAuZ2xvYmFsICYmIHAuZ2xvYmFsLm1pY3JvICYmIHAuZ2xvYmFsLm1pY3JvLmlkKSB8fCAocC5taWNybyAmJiBwLm1pY3JvLmlkKSk7CiAgICAgIGlmIChpZCAmJiBWLnN0b3JlICYmIFYuc3RvcmUuc2V0KSBWLnN0b3JlLnNldCgncHJvZmlsZScsIHApOwogICAgICByZXR1cm4gaWQ7CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9KTsKICB9CgogIGZ1bmN0aW9uIGRvUHVibGlzaChwcm9maWxlSUQpIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIGlmICh0eXBlb2YgYXBpLnB1Ymxpc2hJbWFnZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVycm9yKCdQdWJsaXNoaW5nIHVuYXZhaWxhYmxlLicpOwogICAgdmFyIHBheWxvYWQgPSB7CiAgICAgIGlkOiBfaW1hZ2UuaWQgfHwgaW1hZ2VJRChfaW1hZ2UpLAogICAgICByZW1vdGVJRDogX2ltYWdlLnJlbW90ZUlELAogICAgICBwcm9tcHQ6IF9pbWFnZS5wcm9tcHQsCiAgICAgIHJlbW90ZUltYWdlVVJMOiBfaW1hZ2UucmVtb3RlSW1hZ2VVUkwsCiAgICAgIHJlbW90ZU9yaWdpbmFsSW1hZ2VVUkw6IF9pbWFnZS5yZW1vdGVPcmlnaW5hbEltYWdlVVJMLAogICAgICBtb2RlbDogX2ltYWdlLm1vZGVsLAogICAgICBzZWVkOiBfaW1hZ2Uuc2VlZCwKICAgICAgdmlkZW9VUkw6IF9pbWFnZS52aWRlb1VSTCwKICAgICAgdGFnczogX2ltYWdlLnRhZ3MsCiAgICAgIGNyZWF0ZWREYXRlOiBfaW1hZ2UuY3JlYXRlZERhdGUKICAgIH07CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaS5wdWJsaXNoSW1hZ2UocHJvZmlsZUlELCBwYXlsb2FkKSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBpZCA9IGltYWdlSUQoX2ltYWdlKTsKICAgICAgaWYgKGlkICYmIHR5cGVvZiBhcGkuc2V0UHVibGlzaGVkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcGkuc2V0UHVibGlzaGVkKGlkLCB0cnVlKSkuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgICB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGFjdFNhdmVQcmVzZXQoKSB7CiAgICBpZiAoIV9pbWFnZS5wcm9tcHQpIHsgdG9hc3QoJ05vIHByb21wdCB0byBzYXZlLicsICdpbmZvJyk7IHJldHVybjsgfQogICAgdmFyIHVpID0gVUkoKTsKICAgIHZhciBuYW1lSW5wdXQgPSBlbCgnaW5wdXQnLCB7IGNsYXNzOiAndi1maWVsZCcsIHR5cGU6ICd0ZXh0JywgcGxhY2Vob2xkZXI6ICdQcmVzZXQgbmFtZScsIHZhbHVlOiAoX2ltYWdlLnByb21wdCB8fCAnJykuc2xpY2UoMCwgNDApIH0pOwogICAgdmFyIHByb21wdEFyZWEgPSBlbCgndGV4dGFyZWEnLCB7IGNsYXNzOiAndi10ZXh0YXJlYScsIHJvd3M6IDQgfSk7CiAgICBwcm9tcHRBcmVhLnZhbHVlID0gX2ltYWdlLnByb21wdCB8fCAnJzsKICAgIHZhciBzdGF0dXMgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZmllbGQtaGludCcsICdhcmlhLWxpdmUnOiAncG9saXRlJywgc3R5bGU6IHsgbWluSGVpZ2h0OiAnMTZweCcgfSB9KTsKICAgIHZhciBzYXZlQnRuID0gZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tYmxvY2snLCB0eXBlOiAnYnV0dG9uJyB9LCAnU2F2ZSBwcmVzZXQnKTsKICAgIHZhciBib2R5ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLXNtJywgc3R5bGU6IHsgcGFkZGluZzogJzRweCcsIG1pbldpZHRoOiAnbWluKDg2dncsIDM4MHB4KScgfSB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdTYXZlIGFzIHByZXNldCcgfSksCiAgICAgIGVsKCdsYWJlbCcsIHsgY2xhc3M6ICd2LWxhYmVsJywgdGV4dDogJ05hbWUnIH0pLCBuYW1lSW5wdXQsCiAgICAgIGVsKCdsYWJlbCcsIHsgY2xhc3M6ICd2LWxhYmVsJywgdGV4dDogJ1Byb21wdCcgfSksIHByb21wdEFyZWEsCiAgICAgIHN0YXR1cywKICAgICAgc2F2ZUJ0bgogICAgKTsKICAgIHZhciBtb2RhbFJlZiA9ICh1aSAmJiB0eXBlb2YgdWkubW9kYWwgPT09ICdmdW5jdGlvbicpID8gdWkubW9kYWwoYm9keSwgeyBhcmlhTGFiZWw6ICdTYXZlIHByZXNldCcgfSkgOiBudWxsOwogICAgc2F2ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG5hbWUgPSAobmFtZUlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIHZhciBwcm9tcHQgPSAocHJvbXB0QXJlYS52YWx1ZSB8fCAnJykudHJpbSgpOwogICAgICBpZiAoIW5hbWUpIHsgc3RhdHVzLnRleHRDb250ZW50ID0gJ0dpdmUgeW91ciBwcmVzZXQgYSBuYW1lLic7IG5hbWVJbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgaWYgKCFwcm9tcHQpIHsgc3RhdHVzLnRleHRDb250ZW50ID0gJ0EgcHJvbXB0IGlzIHJlcXVpcmVkLic7IHByb21wdEFyZWEuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSB0cnVlOyBzdGF0dXMudGV4dENvbnRlbnQgPSAnU2F2aW5n4oCmJzsKICAgICAgc2F2ZVByZXNldCh7IG5hbWU6IG5hbWUsIHByb21wdDogcHJvbXB0LCBtb2RlbDogX2ltYWdlLm1vZGVsIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChtb2RhbFJlZiAmJiBtb2RhbFJlZi5jbG9zZSkgbW9kYWxSZWYuY2xvc2UoKTsKICAgICAgICB0b2FzdCgnUHJlc2V0IHNhdmVkLicsICdzdWNjZXNzJyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ0NvdWxkbuKAmXQgc2F2ZSBwcmVzZXQuJzsKICAgICAgfSk7CiAgICB9KTsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBuYW1lSW5wdXQuZm9jdXMoKTsgbmFtZUlucHV0LnNlbGVjdCgpOyB9LCAzMCk7CiAgfQoKICBmdW5jdGlvbiBzYXZlUHJlc2V0KHApIHsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIHZhciBwcmVzZXQgPSB7CiAgICAgIGlkOiAoVSgpLnV1aWQgPyBVKCkudXVpZCgpIDogU3RyaW5nKERhdGUubm93KCkpKSwKICAgICAgbmFtZTogcC5uYW1lLCBwcm9tcHQ6IHAucHJvbXB0LCBuZWdhdGl2ZVByb21wdDogbnVsbCwgbW9kZWw6IHAubW9kZWwgfHwgbnVsbAogICAgfTsKICAgIHRyeSB7CiAgICAgIHZhciBsaXN0ID0gU1QoKS5wcmVzZXRzIHx8IFtdOwogICAgICBsaXN0LnB1c2gocHJlc2V0KTsKICAgICAgaWYgKFYuc3RvcmUgJiYgVi5zdG9yZS5zZXQpIFYuc3RvcmUuc2V0KCdwcmVzZXRzJywgbGlzdCk7CiAgICAgIGVsc2UgVi5zdGF0ZS5wcmVzZXRzID0gbGlzdDsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgICBpZiAoVi5wcmVzZXRzICYmIHR5cGVvZiBWLnByZXNldHMuY3JlYXRlID09PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFYucHJlc2V0cy5jcmVhdGUocHJlc2V0KSk7CiAgICBpZiAoYXBpICYmIHR5cGVvZiBhcGkuY3JlYXRlUHJlc2V0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFwaS5jcmVhdGVQcmVzZXQocHJlc2V0KSk7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByZXNldCk7CiAgfQoKICBmdW5jdGlvbiBhcHBseUltYWdlTXV0YXRpb24oaW1nKSB7CiAgICB0cnkgewogICAgICB2YXIgaWQgPSBpbWFnZUlEKGltZyk7CiAgICAgIFsnbGlicmFyeScsICdmZWVkJ10uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgdmFyIGFyciA9IFNUKClba2V5XTsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgdSA9IHVud3JhcChhcnJbaV0pOwogICAgICAgICAgaWYgKGltYWdlSUQodSkgPT09IGlkKSB7IE9iamVjdC5hc3NpZ24odSwgaW1nKTsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBpZiAoVi5zdG9yZSAmJiBWLnN0b3JlLmVtaXQpIFYuc3RvcmUuZW1pdCgnbGlicmFyeTpjaGFuZ2VkJywgU1QoKS5saWJyYXJ5KTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiByZWJ1aWxkTWVkaWEoKSB7CiAgICBpZiAoIV9ub2RlKSByZXR1cm47CiAgICB2YXIgbW91bnQgPSBfbm9kZS5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX21lZGlhJyk7CiAgICBpZiAoIW1vdW50KSByZXR1cm47CiAgICBkZXN0cm95U2NydWIoKTsKICAgIG1vdW50LmlubmVySFRNTCA9ICcnOwogICAgbW91bnQuYXBwZW5kQ2hpbGQoYnVpbGRNZWRpYSgpKTsKICB9CgogIGZ1bmN0aW9uIHJlYnVpbGRQYW5lbCgpIHsKICAgIGlmICghX25vZGUpIHJldHVybjsKICAgIHZhciBvbGQgPSBfbm9kZS5xdWVyeVNlbGVjdG9yKCcudi1zdHVkaW9fX3BhbmVsJyk7CiAgICBpZiAoIW9sZCkgcmV0dXJuOwogICAgdmFyIGZyZXNoID0gYnVpbGRQYW5lbCgpOwogICAgb2xkLnJlcGxhY2VXaXRoKGZyZXNoKTsKICB9CgogIGZ1bmN0aW9uIGRlc3Ryb3lTY3J1YigpIHsKICAgIGlmIChfc2NydWJOb2RlKSB7CiAgICAgIGlmICh0eXBlb2YgX3NjcnViTm9kZS5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IF9zY3J1Yk5vZGUuZGVzdHJveSgpOyB9IGNhdGNoIChlKSB7fSB9CiAgICB9CiAgICBfc2NydWJOb2RlID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkUGFuZWwoKSB7CiAgICB2YXIgcGFuZWwgPSBlbCgnYXNpZGUnLCB7IGNsYXNzOiAndi1zdHVkaW9fX3BhbmVsIGdsYXNzLWNhcmQnLCAnYXJpYS1sYWJlbCc6ICdJbWFnZSBkZXRhaWxzJywgc3R5bGU6IHBhbmVsU3R5bGUoKSB9KTsKCiAgICBpZiAoX2ltYWdlLnByb21wdCAmJiAhX2ltYWdlLmhpZGVQcm9tcHQpIHsKICAgICAgdmFyIHByb21wdEJ0biA9IGVsKCdidXR0b24nLCB7CiAgICAgICAgY2xhc3M6ICd2LXN0dWRpb19fcHJvbXB0JywgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgdGl0bGU6ICdDb3B5IHByb21wdCcsICdhcmlhLWxhYmVsJzogJ0NvcHkgcHJvbXB0IHRvIGNsaXBib2FyZCcsCiAgICAgICAgc3R5bGU6IHsKICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzhweCcsIHdpZHRoOiAnMTAwJScsIHRleHRBbGlnbjogJ2xlZnQnLAogICAgICAgICAgYmFja2dyb3VuZDogQ0FSRF9CRywgYm9yZGVyOiAnMXB4IHNvbGlkICcgKyBMSU5FLCBib3JkZXJSYWRpdXM6ICd2YXIoLS1yYWRpdXMtY29udGVudCwgMTJweCknLAogICAgICAgICAgcGFkZGluZzogJzE0cHggMTZweCcsIGN1cnNvcjogJ3BvaW50ZXInLCBjb2xvcjogSU5LLCBmb250OiAnaW5oZXJpdCcKICAgICAgICB9CiAgICAgIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX3Byb21wdC10ZXh0JywgdGV4dDogX2ltYWdlLnByb21wdCwgc3R5bGU6IHsKICAgICAgICAgIGZvbnRTaXplOiAnMTVweCcsIGxpbmVIZWlnaHQ6ICcxLjQ1JywgY29sb3I6IElOSywgd2hpdGVTcGFjZTogJ3ByZS13cmFwJwogICAgICAgIH0gfSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1zdHVkaW9fX3Byb21wdC1jb3B5Jywgc3R5bGU6IHsKICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBnYXA6ICc2cHgnLCBmb250U2l6ZTogJzEycHgnLAogICAgICAgICAgZm9udFdlaWdodDogJzYwMCcsIGNvbG9yOiBBQ0NFTlRfU09GVAogICAgICAgIH0gfSwgaWNvbignY29weScpLCBlbCgnc3BhbicsIHsgdGV4dDogJ0NvcHkgcHJvbXB0JyB9KSkKICAgICAgKTsKICAgICAgcHJvbXB0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWN0Q29weVByb21wdCk7CiAgICAgIHBhbmVsLmFwcGVuZENoaWxkKHByb21wdEJ0bik7CiAgICB9IGVsc2UgaWYgKF9pbWFnZS5oaWRlUHJvbXB0KSB7CiAgICAgIHBhbmVsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX3Byb21wdCB2LW11dGVkJywgdGV4dDogJ1Byb21wdCBoaWRkZW4nLCBzdHlsZTogewogICAgICAgIHBhZGRpbmc6ICcxNHB4IDE2cHgnLCBib3JkZXI6ICcxcHggZGFzaGVkICcgKyBMSU5FLCBib3JkZXJSYWRpdXM6ICd2YXIoLS1yYWRpdXMtY29udGVudCwgMTJweCknLCBjb2xvcjogSU5LX1NPRlQKICAgICAgfSB9KSk7CiAgICB9CgogICAgdmFyIG1ldGEgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19tZXRhJywgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBmbGV4V3JhcDogJ3dyYXAnLCBnYXA6ICc4cHgnIH0gfSk7CiAgICBpZiAoX2ltYWdlLm1vZGVsKSBtZXRhLmFwcGVuZENoaWxkKG1ldGFDaGlwKCdNb2RlbCcsIG1vZGVsTGFiZWwoX2ltYWdlLm1vZGVsKSkpOwogICAgdmFyIGRpbXMgPSBpbWFnZURpbWVuc2lvbnMoX2ltYWdlKTsKICAgIGlmIChkaW1zKSBtZXRhLmFwcGVuZENoaWxkKG1ldGFDaGlwKCdTaXplJywgZGltcykpOwogICAgaWYgKF9pbWFnZS5zZWVkICE9IG51bGwpIG1ldGEuYXBwZW5kQ2hpbGQobWV0YUNoaXAoJ1NlZWQnLCBTdHJpbmcoX2ltYWdlLnNlZWQpKSk7CiAgICB2YXIgY29zdCA9IGNyZWRpdENvc3QoX2ltYWdlKTsKICAgIGlmIChjb3N0ICE9IG51bGwpIG1ldGEuYXBwZW5kQ2hpbGQobWV0YUNoaXAoJ0NyZWRpdHMnLCBTdHJpbmcoY29zdCkpKTsKICAgIHZhciBkdCA9IGZtdERhdGUoX2ltYWdlLmNyZWF0ZWREYXRlKTsKICAgIGlmIChkdCkgbWV0YS5hcHBlbmRDaGlsZChtZXRhQ2hpcCgnQ3JlYXRlZCcsIGR0KSk7CiAgICBpZiAoX2ltYWdlLmZhdm9yaXRlZCkgbWV0YS5hcHBlbmRDaGlsZChtZXRhQ2hpcCgnJywgJ0Zhdm9yaXRlZCcsIEFDQ0VOVCkpOwogICAgaWYgKF9pbWFnZS5wdWJsaXNoZWQpIG1ldGEuYXBwZW5kQ2hpbGQobWV0YUNoaXAoJycsICdQdWJsaXNoZWQnLCBBQ0NFTlQpKTsKICAgIGlmIChtZXRhLmNoaWxkTm9kZXMubGVuZ3RoKSB7CiAgICAgIHBhbmVsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2dyb3VwJyB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2dyb3VwLWhlYWQgdi1leWVicm93JywgdGV4dDogJ0RldGFpbHMnIH0pLAogICAgICAgIG1ldGEKICAgICAgKSk7CiAgICB9CgogICAgcGFuZWwuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0dWRpb19fZ3JvdXAnIH0sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2dyb3VwLWhlYWQgdi1leWVicm93JywgdGV4dDogJ0FjdGlvbnMnIH0pLAogICAgICBidWlsZEFjdGlvbkJhcigpCiAgICApKTsKICAgIHJldHVybiBwYW5lbDsKICB9CgogIGZ1bmN0aW9uIHBhbmVsU3R5bGUoKSB7CiAgICByZXR1cm4gewogICAgICBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcxNHB4JywKICAgICAgd2lkdGg6ICdtaW4oMzgwcHgsIDkydncpJywgZmxleDogJzAgMCBhdXRvJywKICAgICAgbWF4SGVpZ2h0OiAnMTAwJScsIG92ZXJmbG93WTogJ2F1dG8nLCBvdmVyZmxvd1g6ICdoaWRkZW4nLAogICAgICBwYWRkaW5nOiAnMjBweCcsIGJvcmRlclJhZGl1czogJ3ZhcigtLXJhZGl1cy1wYW5lbCwgMjIuNXB4KScsCiAgICAgIFdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiAndG91Y2gnCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gbWV0YUNoaXAobGFiZWwsIHZhbHVlLCB0b25lKSB7CiAgICByZXR1cm4gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jaGlwJywgc3R5bGU6IHsKICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGdhcDogJzZweCcsCiAgICAgIHBhZGRpbmc6ICc2cHggMTJweCcsIGJvcmRlclJhZGl1czogJ3ZhcigtLXJhZGl1cy1waWxsLCA2M3B4KScsCiAgICAgIGJhY2tncm91bmQ6IHRvbmUgPyAnY29sb3ItbWl4KGluIHNyZ2IsICcgKyB0b25lICsgJyAxNiUsIHRyYW5zcGFyZW50KScgOiBDQVJEX0JHLAogICAgICBib3JkZXI6ICcxcHggc29saWQgJyArICh0b25lID8gJ2NvbG9yLW1peChpbiBzcmdiLCAnICsgdG9uZSArICcgNDUlLCB0cmFuc3BhcmVudCknIDogTElORSksCiAgICAgIGZvbnRTaXplOiAnMTJweCcsIHdoaXRlU3BhY2U6ICdub3dyYXAnCiAgICB9IH0sCiAgICAgIGxhYmVsID8gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tb25vJywgdGV4dDogbGFiZWwsIHN0eWxlOiB7IGNvbG9yOiBJTktfU09GVCwgdGV4dFRyYW5zZm9ybTogJ3VwcGVyY2FzZScsIGxldHRlclNwYWNpbmc6ICcwLjA4ZW0nLCBmb250U2l6ZTogJzEwcHgnIH0gfSkgOiBudWxsLAogICAgICBlbCgnc3BhbicsIHsgdGV4dDogdmFsdWUsIHN0eWxlOiB7IGNvbG9yOiB0b25lID8gdG9uZSA6IElOSywgZm9udFdlaWdodDogJzYwMCcgfSB9KQogICAgKTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkQWN0aW9uQmFyKCkgewogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19hY3Rpb25zLXdyYXAnLCBzdHlsZTogewogICAgICBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcxMHB4JwogICAgfSB9KTsKICAgIHZhciBvd24gPSBpc093bkltYWdlKF9pbWFnZSk7CgogICAgdmFyIHJldmFtcCA9IGVsKCdidXR0b24nLCB7CiAgICAgIGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnkgdi1jdGEtLWJsb2NrIHYtc3R1ZGlvX19yZXZhbXAnLCB0eXBlOiAnYnV0dG9uJywKICAgICAgdGl0bGU6ICdSZXZhbXAnLCAnYXJpYS1sYWJlbCc6ICdSZXZhbXAgdGhpcyBpbWFnZSBpbiBDcmVhdGUnCiAgICB9LCBpY29uKCdlZGl0JyksIGVsKCdzcGFuJywgeyB0ZXh0OiAnUmV2YW1wJyB9KSk7CiAgICByZXZhbXAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGFjdEVkaXQoKTsgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKHJldmFtcCk7CgogICAgdmFyIGJhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW9fX2FjdGlvbnMgZ2xhc3MtbmF2Jywgcm9sZTogJ3Rvb2xiYXInLCAnYXJpYS1sYWJlbCc6ICdJbWFnZSBhY3Rpb25zJywgc3R5bGU6IHsKICAgICAgZGlzcGxheTogJ2dyaWQnLCBncmlkVGVtcGxhdGVDb2x1bW5zOiAncmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoNjRweCwgMWZyKSknLCBnYXA6ICc2cHgnLAogICAgICBwYWRkaW5nOiAnMTBweCcsIGJvcmRlclJhZGl1czogJ3ZhcigtLXJhZGl1cy1wYW5lbCwgMjIuNXB4KScKICAgIH0gfSk7CgogICAgYmFyLmFwcGVuZENoaWxkKGdsYXNzQnRuKCd2YXJpYXRpb25zJywgJ1ZhcmlhdGlvbnMnLCBhY3RWYXJpYXRpb25zKSk7CiAgICBpZiAoIV9pbWFnZS52aWRlb1VSTCkgYmFyLmFwcGVuZENoaWxkKGdsYXNzQnRuKCdhbmltYXRlJywgJ0FuaW1hdGUnLCBhY3RBbmltYXRlKSk7CiAgICBiYXIuYXBwZW5kQ2hpbGQoZ2xhc3NCdG4oJ2Rvd25sb2FkJywgJ1NhdmUnLCBhY3REb3dubG9hZCkpOwogICAgaWYgKG93bikgewogICAgICBiYXIuYXBwZW5kQ2hpbGQoZ2xhc3NCdG4oX2ltYWdlLmZhdm9yaXRlZCA/ICdoZWFydC5maWxsJyA6ICdoZWFydCcsCiAgICAgICAgX2ltYWdlLmZhdm9yaXRlZCA/ICdGYXZvcml0ZWQnIDogJ0Zhdm9yaXRlJywgYWN0RmF2b3JpdGUsCiAgICAgICAgeyB0b2dnbGU6IHRydWUsIGFjdGl2ZTogISFfaW1hZ2UuZmF2b3JpdGVkIH0pKTsKICAgIH0KICAgIGJhci5hcHBlbmRDaGlsZChnbGFzc0J0bignc2hhcmUnLCAnU2hhcmUnLCBhY3RTaGFyZSkpOwogICAgaWYgKG93bikgewogICAgICBiYXIuYXBwZW5kQ2hpbGQoZ2xhc3NCdG4oJ3B1Ymxpc2gnLCBfaW1hZ2UucHVibGlzaGVkID8gJ1B1Ymxpc2hlZCcgOiAnUHVibGlzaCcsIGFjdFB1Ymxpc2gsIHsgYWN0aXZlOiAhIV9pbWFnZS5wdWJsaXNoZWQgfSkpOwogICAgfQogICAgaWYgKF9pbWFnZS5wcm9tcHQpIGJhci5hcHBlbmRDaGlsZChnbGFzc0J0bignYm9va21hcmsnLCAnUHJlc2V0JywgYWN0U2F2ZVByZXNldCkpOwogICAgaWYgKG93bikgYmFyLmFwcGVuZENoaWxkKGdsYXNzQnRuKCd0cmFzaCcsICdEZWxldGUnLCBhY3REZWxldGUsIHsgZGFuZ2VyOiB0cnVlIH0pKTsKICAgIHdyYXAuYXBwZW5kQ2hpbGQoYmFyKTsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gd2lyZVN3aXBlRGlzbWlzcyhub2RlKSB7CiAgICB2YXIgc3RhcnRZID0gMCwgc3RhcnRYID0gMCwgY3VyWSA9IDAsIGRyYWdnaW5nID0gZmFsc2UsIGxvY2tlZCA9IGZhbHNlOwogICAgdmFyIHRocmVzaG9sZCA9IDExMDsKICAgIGZ1bmN0aW9uIG9uU3RhcnQoZSkgewogICAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlcy5sZW5ndGggPiAxKSByZXR1cm47CiAgICAgIHZhciB0ID0gZS50YXJnZXQ7CiAgICAgIHdoaWxlICh0ICYmIHQgIT09IG5vZGUpIHsKICAgICAgICBpZiAodC5jbGFzc0xpc3QgJiYgKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCd2c2NydWInKSB8fCB0LmNsYXNzTGlzdC5jb250YWlucygndmNhcmQnKSB8fAogICAgICAgICAgdC5jbGFzc0xpc3QuY29udGFpbnMoJ3Ytc3R1ZGlvX19hY3Rpb25zJykgfHwgdC5jbGFzc0xpc3QuY29udGFpbnMoJ3Ytc3R1ZGlvX19wYW5lbCcpIHx8CiAgICAgICAgICB0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8IHQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fCB0LnRhZ05hbWUgPT09ICdJTlBVVCcpKSByZXR1cm47CiAgICAgICAgdCA9IHQucGFyZW50Tm9kZTsKICAgICAgfQogICAgICBzdGFydFkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WTsgc3RhcnRYID0gZS50b3VjaGVzWzBdLmNsaWVudFg7CiAgICAgIGN1clkgPSBzdGFydFk7IGRyYWdnaW5nID0gdHJ1ZTsgbG9ja2VkID0gZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiBvbk1vdmUoZSkgewogICAgICBpZiAoIWRyYWdnaW5nKSByZXR1cm47CiAgICAgIHZhciB5ID0gZS50b3VjaGVzWzBdLmNsaWVudFksIHggPSBlLnRvdWNoZXNbMF0uY2xpZW50WDsKICAgICAgdmFyIGR5ID0geSAtIHN0YXJ0WSwgZHggPSB4IC0gc3RhcnRYOwogICAgICBpZiAoIWxvY2tlZCkgewogICAgICAgIGlmIChNYXRoLmFicyhkeCkgPiBNYXRoLmFicyhkeSkpIHsgZHJhZ2dpbmcgPSBmYWxzZTsgcmV0dXJuOyB9CiAgICAgICAgbG9ja2VkID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoZHkgPCAwKSBkeSA9IGR5ICogMC4yNTsKICAgICAgY3VyWSA9IHN0YXJ0WSArIGR5OwogICAgICB2YXIgb3AgPSBNYXRoLm1heCgwLjI1LCAxIC0gTWF0aC5hYnMoZHkpIC8gNTAwKTsKICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWSgnICsgZHkgKyAncHgpJzsKICAgICAgbm9kZS5zdHlsZS5vcGFjaXR5ID0gU3RyaW5nKG9wKTsKICAgICAgaWYgKGUuY2FuY2VsYWJsZSkgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgfQogICAgZnVuY3Rpb24gb25FbmQoKSB7CiAgICAgIGlmICghZHJhZ2dpbmcpIHJldHVybjsKICAgICAgZHJhZ2dpbmcgPSBmYWxzZTsKICAgICAgdmFyIGR5ID0gY3VyWSAtIHN0YXJ0WTsKICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSAnJzsKICAgICAgbm9kZS5zdHlsZS5vcGFjaXR5ID0gJyc7CiAgICAgIGlmIChkeSA+IHRocmVzaG9sZCkgY2xvc2UoKTsKICAgIH0KICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uU3RhcnQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Nb3ZlLCB7IHBhc3NpdmU6IGZhbHNlIH0pOwogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uRW5kLCB7IHBhc3NpdmU6IHRydWUgfSk7CiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgb25FbmQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKICB9CgogIGZ1bmN0aW9uIHdpcmVEcm9wUGFzdGUoc3RhZ2VFbCkgewogICAgc3RhZ2VFbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChlLmRhdGFUcmFuc2ZlciAmJiBBcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKGUuZGF0YVRyYW5zZmVyLml0ZW1zIHx8IFtdLCBmdW5jdGlvbiAoaXQpIHsgcmV0dXJuIGl0LmtpbmQgPT09ICdmaWxlJzsgfSkpIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgc3RhZ2VFbC5zdHlsZS5vdXRsaW5lID0gJzJweCBkYXNoZWQgJyArIEFDQ0VOVDsKICAgICAgICBzdGFnZUVsLnN0eWxlLm91dGxpbmVPZmZzZXQgPSAnLThweCc7CiAgICAgIH0KICAgIH0pOwogICAgc3RhZ2VFbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCBmdW5jdGlvbiAoKSB7IHN0YWdlRWwuc3R5bGUub3V0bGluZSA9ICcnOyB9KTsKICAgIHN0YWdlRWwuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgIHN0YWdlRWwuc3R5bGUub3V0bGluZSA9ICcnOwogICAgICB2YXIgZmlsZXMgPSBlLmRhdGFUcmFuc2ZlciAmJiBlLmRhdGFUcmFuc2Zlci5maWxlczsKICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IHN0YXJ0UmV2YW1wRnJvbUZpbGUoZmlsZXNbMF0pOyB9CiAgICB9KTsKICAgIF9wYXN0ZUhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoX2Rpc3Bvc2VkKSByZXR1cm47CiAgICAgIHZhciBpdGVtcyA9IChlLmNsaXBib2FyZERhdGEgJiYgZS5jbGlwYm9hcmREYXRhLml0ZW1zKSB8fCBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChpdGVtc1tpXS50eXBlICYmIGl0ZW1zW2ldLnR5cGUuaW5kZXhPZignaW1hZ2UnKSA9PT0gMCkgewogICAgICAgICAgdmFyIGZpbGUgPSBpdGVtc1tpXS5nZXRBc0ZpbGUoKTsKICAgICAgICAgIGlmIChmaWxlKSB7IHN0YXJ0UmV2YW1wRnJvbUZpbGUoZmlsZSk7IGJyZWFrOyB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBfcGFzdGVIYW5kbGVyKTsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0UmV2YW1wRnJvbUZpbGUoZmlsZSkgewogICAgaWYgKCFmaWxlKSByZXR1cm47CiAgICB0b2FzdCgnT3BlbmluZyBDcmVhdGUgd2l0aCB5b3VyIGltYWdl4oCmJywgJ2luZm8nKTsKICAgIHZhciBhcGkgPSBBUEkoKTsKICAgIGlmIChhcGkgJiYgdHlwZW9mIGFwaS51cGxvYWRJbWFnZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBQcm9taXNlLnJlc29sdmUoYXBpLnVwbG9hZEltYWdlKGZpbGUsICdyZW5kZXInKSkudGhlbihmdW5jdGlvbiAodXJsKSB7CiAgICAgICAgdmFyIHBhcmFtcyA9IFsnaW1hZ2U9JyArIGVuY29kZVVSSUNvbXBvbmVudCh1cmwpXTsKICAgICAgICBpZiAoX2ltYWdlICYmIF9pbWFnZS5tb2RlbCkgcGFyYW1zLnB1c2goJ21vZGVsPScgKyBlbmNvZGVVUklDb21wb25lbnQoX2ltYWdlLm1vZGVsKSk7CiAgICAgICAgZ28oJyMvY3JlYXRlPycgKyBwYXJhbXMuam9pbignJicpKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgeyBnbygnIy9jcmVhdGUnKTsgfSk7CiAgICB9IGVsc2UgeyBnbygnIy9jcmVhdGUnKTsgfQogIH0KCiAgZnVuY3Rpb24gY2xvc2UoKSB7IGJhY2soKTsgfQoKICBmdW5jdGlvbiBiYWNrKCkgewogICAgdmFyIHByZXYgPSBTVCgpLnByZXZpb3VzUm91dGU7CiAgICBpZiAocHJldiAmJiBwcmV2LmluZGV4T2YoJ2ltYWdlJykgPT09IC0xKSB7IGdvKHByZXYuY2hhckF0KDApID09PSAnIycgPyBwcmV2IDogJyMvJyArIHByZXYpOyByZXR1cm47IH0KICAgIGdvKCcjL2xpYnJhcnknKTsKICB9CgogIGZ1bmN0aW9uIHdpcmVLZXlzKCkgewogICAgX2tleUhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoX2Rpc3Bvc2VkKSByZXR1cm47CiAgICAgIHZhciB0ID0gZS50YXJnZXQ7CiAgICAgIHZhciB0eXBpbmcgPSB0ICYmICh0LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgdC50YWdOYW1lID09PSAnVEVYVEFSRUEnIHx8IHQuaXNDb250ZW50RWRpdGFibGUpOwogICAgICBpZiAodHlwaW5nICYmIGUua2V5ICE9PSAnRXNjYXBlJykgcmV0dXJuOwogICAgICBzd2l0Y2ggKGUua2V5KSB7CiAgICAgICAgY2FzZSAnRXNjYXBlJzogZS5wcmV2ZW50RGVmYXVsdCgpOyBjbG9zZSgpOyBicmVhazsKICAgICAgICBjYXNlICdBcnJvd0xlZnQnOiBlLnByZXZlbnREZWZhdWx0KCk7IG5hdmlnYXRlKC0xKTsgYnJlYWs7CiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6IGUucHJldmVudERlZmF1bHQoKTsgbmF2aWdhdGUoMSk7IGJyZWFrOwogICAgICAgIGNhc2UgJ2UnOiBjYXNlICdFJzogaWYgKCFlLm1ldGFLZXkgJiYgIWUuY3RybEtleSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGFjdEVkaXQoKTsgfSBicmVhazsKICAgICAgICBjYXNlICdmJzogY2FzZSAnRic6CiAgICAgICAgICBpZiAoIWUubWV0YUtleSAmJiAhZS5jdHJsS2V5ICYmIGlzT3duSW1hZ2UoX2ltYWdlKSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGFjdEZhdm9yaXRlKF9ub2RlICYmIF9ub2RlLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fYWN0aW9uW2FyaWEtcHJlc3NlZF0nKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OiBicmVhazsKICAgICAgfQogICAgICBpZiAoKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpICYmIChlLmtleSA9PT0gJ3MnIHx8IGUua2V5ID09PSAnUycpKSB7IGUucHJldmVudERlZmF1bHQoKTsgYWN0RG93bmxvYWQoKTsgfQogICAgfTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfa2V5SGFuZGxlcik7CiAgfQoKICBmdW5jdGlvbiBidWlsZENocm9tZSgpIHsKICAgIHZhciBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogICAgdmFyIGNsb3NlQnRuID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6ICdnbGFzcy1idXR0b24gdi1zdHVkaW9fX2Nsb3NlJywgdHlwZTogJ2J1dHRvbicsIHRpdGxlOiAnQ2xvc2UnLCAnYXJpYS1sYWJlbCc6ICdDbG9zZScsCiAgICAgIHN0eWxlOiBjaHJvbWVCdG5TdHlsZSh7IHRvcDogJ2NhbGMoZW52KHNhZmUtYXJlYS1pbnNldC10b3AsIDBweCkgKyAxNnB4KScsIHJpZ2h0OiAnMTZweCcgfSkKICAgIH0pOwogICAgY2xvc2VCdG4uYXBwZW5kQ2hpbGQoaWNvbignY2xvc2UnKSk7CiAgICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgY2xvc2UoKTsgfSk7CiAgICBmcmFnLmFwcGVuZENoaWxkKGNsb3NlQnRuKTsKCiAgICBpZiAoX3NpYmxpbmdzLmxlbmd0aCA+IDEpIHsKICAgICAgdmFyIHByZXYgPSBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAnZ2xhc3MtYnV0dG9uIHYtc3R1ZGlvX19uYXYnLCB0eXBlOiAnYnV0dG9uJywgdGl0bGU6ICdQcmV2aW91cycsICdhcmlhLWxhYmVsJzogJ1ByZXZpb3VzIGltYWdlJywKICAgICAgICBkaXNhYmxlZDogX2luZGV4IDw9IDAsIHN0eWxlOiBjaHJvbWVCdG5TdHlsZSh7IHRvcDogJzUwJScsIGxlZnQ6ICcxNnB4JywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtNTAlKScgfSkKICAgICAgfSk7CiAgICAgIHByZXYuYXBwZW5kQ2hpbGQoaWNvbignYXJyb3dMZWZ0JykpOwogICAgICBwcmV2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBuYXZpZ2F0ZSgtMSk7IH0pOwoKICAgICAgdmFyIG5leHQgPSBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAnZ2xhc3MtYnV0dG9uIHYtc3R1ZGlvX19uYXYnLCB0eXBlOiAnYnV0dG9uJywgdGl0bGU6ICdOZXh0JywgJ2FyaWEtbGFiZWwnOiAnTmV4dCBpbWFnZScsCiAgICAgICAgZGlzYWJsZWQ6IF9pbmRleCA+PSBfc2libGluZ3MubGVuZ3RoIC0gMSwgc3R5bGU6IGNocm9tZUJ0blN0eWxlKHsgdG9wOiAnNTAlJywgcmlnaHQ6ICcxNnB4JywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtNTAlKScgfSkKICAgICAgfSk7CiAgICAgIG5leHQuYXBwZW5kQ2hpbGQoaWNvbignYXJyb3dSaWdodCcpKTsKICAgICAgbmV4dC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgbmF2aWdhdGUoMSk7IH0pOwoKICAgICAgdmFyIGNvdW50ZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19jb3VudGVyIHYtbW9ubycsICdhcmlhLWhpZGRlbic6ICd0cnVlJywKICAgICAgICB0ZXh0OiAoX2luZGV4ICsgMSkgKyAnIC8gJyArIF9zaWJsaW5ncy5sZW5ndGgsIHN0eWxlOiB7CiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJywgdG9wOiAnY2FsYyhlbnYoc2FmZS1hcmVhLWluc2V0LXRvcCwgMHB4KSArIDIycHgpJywgbGVmdDogJzUwJScsCiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC01MCUpJywgcGFkZGluZzogJzVweCAxMnB4JywgYm9yZGVyUmFkaXVzOiAndmFyKC0tcmFkaXVzLXBpbGwsIDYzcHgpJywKICAgICAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsMCwwLC40NSknLCBjb2xvcjogSU5LX1NPRlQsIGZvbnRTaXplOiAnMTJweCcsIHpJbmRleDogJzYnCiAgICAgICAgfSB9KTsKICAgICAgZnJhZy5hcHBlbmRDaGlsZChwcmV2KTsgZnJhZy5hcHBlbmRDaGlsZChuZXh0KTsgZnJhZy5hcHBlbmRDaGlsZChjb3VudGVyKTsKICAgIH0KICAgIHJldHVybiBmcmFnOwogIH0KCiAgZnVuY3Rpb24gY2hyb21lQnRuU3R5bGUocG9zKSB7CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7CiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB6SW5kZXg6ICc2Jywgd2lkdGg6ICc0NHB4JywgaGVpZ2h0OiAnNDRweCcsCiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsCiAgICAgIGJvcmRlclJhZGl1czogJzUwJScsIGNvbG9yOiBJTkssIGN1cnNvcjogJ3BvaW50ZXInCiAgICB9LCBwb3MgfHwge30pOwogIH0KCiAgZnVuY3Rpb24gcm9vdFN0eWxlKCkgewogICAgcmV0dXJuIHsKICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsIHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnLAogICAgICBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdzdHJldGNoJywganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLAogICAgICBnYXA6ICcyMHB4JywgcGFkZGluZzogJ2NhbGMoZW52KHNhZmUtYXJlYS1pbnNldC10b3AsIDBweCkgKyA2NHB4KSAyMHB4IGNhbGMoZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20sIDBweCkgKyAyMHB4KScsCiAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLCBvdXRsaW5lOiAnbm9uZScKICAgIH07CiAgfQoKICBmdW5jdGlvbiBhcHBseVJlc3BvbnNpdmVMYXlvdXQobm9kZSwgbWVkaWEsIHBhbmVsKSB7CiAgICBpZiAoIW5vZGUgfHwgIW1lZGlhIHx8ICFwYW5lbCkgcmV0dXJuOwogICAgdmFyIG5hcnJvdyA9ICh3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggfHwgMCkgPCA4ODA7CiAgICBpZiAobmFycm93KSB7CiAgICAgIG5vZGUuc3R5bGUuZmxleERpcmVjdGlvbiA9ICdjb2x1bW4nOwogICAgICBub2RlLnN0eWxlLmFsaWduSXRlbXMgPSAnc3RyZXRjaCc7CiAgICAgIG5vZGUuc3R5bGUucGFkZGluZyA9ICdjYWxjKGVudihzYWZlLWFyZWEtaW5zZXQtdG9wLCAwcHgpICsgNjBweCkgMTRweCBjYWxjKGVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tLCAwcHgpICsgMTRweCknOwogICAgICBtZWRpYS5zdHlsZS5mbGV4ID0gJzEgMSBhdXRvJzsKICAgICAgcGFuZWwuc3R5bGUud2lkdGggPSAnMTAwJSc7CiAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9ICc0NXZoJzsKICAgICAgcGFuZWwuc3R5bGUuZmxleCA9ICcwIDAgYXV0byc7CiAgICB9IGVsc2UgewogICAgICBub2RlLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAncm93JzsKICAgICAgbm9kZS5zdHlsZS5hbGlnbkl0ZW1zID0gJ3N0cmV0Y2gnOwogICAgICBtZWRpYS5zdHlsZS5mbGV4ID0gJzEgMSBhdXRvJzsKICAgICAgcGFuZWwuc3R5bGUud2lkdGggPSAnbWluKDM4MHB4LCA5MnZ3KSc7CiAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9ICcxMDAlJzsKICAgICAgcGFuZWwuc3R5bGUuZmxleCA9ICcwIDAgYXV0byc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtb3VudFNrZWxldG9uKHJvb3QpIHsKICAgIHZhciB1aSA9IFVJKCk7CiAgICB2YXIgbm9kZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW8gdi1zdHVkaW8tLWxvYWRpbmcnLCByb2xlOiAnZGlhbG9nJywgJ2FyaWEtbW9kYWwnOiAndHJ1ZScsICdhcmlhLWxhYmVsJzogJ0xvYWRpbmcgaW1hZ2UnLCBzdHlsZTogcm9vdFN0eWxlKCkgfSk7CiAgICB2YXIgbWVkaWEgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19tZWRpYScsIHN0eWxlOiB7IGZsZXg6ICcxIDEgYXV0bycsIGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJywgbWluSGVpZ2h0OiAnMCcsIG1pbldpZHRoOiAnMCcgfSB9KTsKICAgIHZhciBza2VsID0gKHVpICYmIHR5cGVvZiB1aS5za2VsZXRvbiA9PT0gJ2Z1bmN0aW9uJykgPyB1aS5za2VsZXRvbignc3F1YXJlJykgOiBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24nLCBzdHlsZTogeyB3aWR0aDogJzYwdmgnLCBtYXhXaWR0aDogJzkwJScsIGFzcGVjdFJhdGlvOiAnMSAvIDEnIH0gfSk7CiAgICBpZiAoc2tlbCkgbWVkaWEuYXBwZW5kQ2hpbGQoc2tlbCk7CiAgICB2YXIgcGFuZWwgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19wYW5lbCBnbGFzcy1jYXJkJywgc3R5bGU6IHBhbmVsU3R5bGUoKSB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24nLCBzdHlsZTogeyBoZWlnaHQ6ICc2NHB4Jywgd2lkdGg6ICcxMDAlJyB9IH0pLAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc2tlbGV0b24nLCBzdHlsZTogeyBoZWlnaHQ6ICcyOHB4Jywgd2lkdGg6ICc3MCUnIH0gfSksCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbicsIHN0eWxlOiB7IGhlaWdodDogJzg4cHgnLCB3aWR0aDogJzEwMCUnIH0gfSkKICAgICk7CiAgICB2YXIgY2xvc2VCdG4gPSBlbCgnYnV0dG9uJywgeyBjbGFzczogJ2dsYXNzLWJ1dHRvbiB2LXN0dWRpb19fY2xvc2UnLCB0eXBlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiAnQ2xvc2UnLCBzdHlsZTogY2hyb21lQnRuU3R5bGUoeyB0b3A6ICdjYWxjKGVudihzYWZlLWFyZWEtaW5zZXQtdG9wLCAwcHgpICsgMTZweCknLCByaWdodDogJzE2cHgnIH0pIH0pOwogICAgY2xvc2VCdG4uYXBwZW5kQ2hpbGQoaWNvbignY2xvc2UnKSk7CiAgICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgY2xvc2UoKTsgfSk7CiAgICBub2RlLmFwcGVuZENoaWxkKGNsb3NlQnRuKTsKICAgIG5vZGUuYXBwZW5kQ2hpbGQobWVkaWEpOwogICAgbm9kZS5hcHBlbmRDaGlsZChwYW5lbCk7CiAgICBhcHBseVJlc3BvbnNpdmVMYXlvdXQobm9kZSwgbWVkaWEsIHBhbmVsKTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICBfbm9kZSA9IG5vZGU7CiAgfQoKICBmdW5jdGlvbiBtb3VudE5vdEZvdW5kKHJvb3QpIHsKICAgIHZhciB1aSA9IFVJKCk7CiAgICB2YXIgbm9kZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdHVkaW8gdi1zdHVkaW8tLWVtcHR5Jywgcm9sZTogJ2RpYWxvZycsICdhcmlhLW1vZGFsJzogJ3RydWUnLCBzdHlsZTogT2JqZWN0LmFzc2lnbihyb290U3R5bGUoKSwgeyBhbGlnbkl0ZW1zOiAnY2VudGVyJyB9KSB9KTsKICAgIHZhciBjbG9zZUJ0biA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAnZ2xhc3MtYnV0dG9uIHYtc3R1ZGlvX19jbG9zZScsIHR5cGU6ICdidXR0b24nLCAnYXJpYS1sYWJlbCc6ICdDbG9zZScsIHN0eWxlOiBjaHJvbWVCdG5TdHlsZSh7IHRvcDogJ2NhbGMoZW52KHNhZmUtYXJlYS1pbnNldC10b3AsIDBweCkgKyAxNnB4KScsIHJpZ2h0OiAnMTZweCcgfSkgfSk7CiAgICBjbG9zZUJ0bi5hcHBlbmRDaGlsZChpY29uKCdjbG9zZScpKTsKICAgIGNsb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBjbG9zZSgpOyB9KTsKICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2xvc2VCdG4pOwogICAgdmFyIGNvbnRlbnQ7CiAgICBpZiAodWkgJiYgdHlwZW9mIHVpLmVtcHR5ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIGNvbnRlbnQgPSB1aS5lbXB0eSgnV2UgY291bGRu4oCZdCBmaW5kIHRoYXQgaW1hZ2UuJywgJ0JhY2sgdG8gTGlicmFyeScsIGZ1bmN0aW9uICgpIHsgZ28oJyMvbGlicmFyeScpOyB9KTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnRlbnQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHknLCBzdHlsZTogeyBtYXJnaW46ICdhdXRvJywgdGV4dEFsaWduOiAnY2VudGVyJyB9IH0sCiAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fbXNnJywgdGV4dDogJ1dlIGNvdWxkbuKAmXQgZmluZCB0aGF0IGltYWdlLicgfSksCiAgICAgICAgZWwoJ2J1dHRvbicsIHsgY2xhc3M6ICd2LWN0YSB2LWN0YS0tZ2hvc3QnLCB0eXBlOiAnYnV0dG9uJywgb25jbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9saWJyYXJ5Jyk7IH0gfSwgJ0JhY2sgdG8gTGlicmFyeScpCiAgICAgICk7CiAgICB9CiAgICBub2RlLmFwcGVuZENoaWxkKGNvbnRlbnQpOwogICAgcm9vdC5hcHBlbmRDaGlsZChub2RlKTsKICAgIF9ub2RlID0gbm9kZTsKICB9CgogIGZ1bmN0aW9uIG1vdW50U3R1ZGlvKHJvb3QpIHsKICAgIF9zaWJsaW5ncyA9IGJ1aWxkU2libGluZ3MoX2ltYWdlKTsKICAgIHZhciBpZCA9IGltYWdlSUQoX2ltYWdlKTsKICAgIF9pbmRleCA9IF9zaWJsaW5ncy5maW5kSW5kZXggPyBfc2libGluZ3MuZmluZEluZGV4KGZ1bmN0aW9uICh4KSB7IHJldHVybiBpbWFnZUlEKHgpID09PSBpZDsgfSkgOiBpbmRleE9mKF9zaWJsaW5ncywgaWQpOwoKICAgIHZhciBub2RlID0gZWwoJ2RpdicsIHsKICAgICAgY2xhc3M6ICd2LXN0dWRpbycsIHJvbGU6ICdkaWFsb2cnLCAnYXJpYS1tb2RhbCc6ICd0cnVlJywKICAgICAgJ2FyaWEtbGFiZWwnOiBfaW1hZ2UucHJvbXB0ID8gKCdJbWFnZTogJyArIF9pbWFnZS5wcm9tcHQuc2xpY2UoMCwgNjApKSA6ICdJbWFnZSBkZXRhaWwnLAogICAgICB0YWJpbmRleDogJy0xJywgc3R5bGU6IHJvb3RTdHlsZSgpCiAgICB9KTsKCiAgICB2YXIgbWVkaWEgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3R1ZGlvX19tZWRpYScsIHN0eWxlOiB7IGZsZXg6ICcxIDEgYXV0bycsIGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJywgbWluSGVpZ2h0OiAnMCcsIG1pbldpZHRoOiAnMCcgfSB9KTsKICAgIHZhciBzdGFnZUVsID0gYnVpbGRNZWRpYSgpOwogICAgbWVkaWEuYXBwZW5kQ2hpbGQoc3RhZ2VFbCk7CgogICAgdmFyIHBhbmVsID0gYnVpbGRQYW5lbCgpOwoKICAgIG5vZGUuYXBwZW5kQ2hpbGQoYnVpbGRDaHJvbWUoKSk7CiAgICBub2RlLmFwcGVuZENoaWxkKG1lZGlhKTsKICAgIG5vZGUuYXBwZW5kQ2hpbGQocGFuZWwpOwoKICAgIGFwcGx5UmVzcG9uc2l2ZUxheW91dChub2RlLCBtZWRpYSwgcGFuZWwpOwoKICAgIHJvb3QuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICBfbm9kZSA9IG5vZGU7CgogICAgd2lyZUtleXMoKTsKICAgIHdpcmVTd2lwZURpc21pc3Mobm9kZSk7CiAgICB3aXJlRHJvcFBhc3RlKHN0YWdlRWwpOwogICAgX3Jlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7IGlmICghX2Rpc3Bvc2VkICYmIF9ub2RlKSBhcHBseVJlc3BvbnNpdmVMYXlvdXQoX25vZGUsIF9ub2RlLnF1ZXJ5U2VsZWN0b3IoJy52LXN0dWRpb19fbWVkaWEnKSwgX25vZGUucXVlcnlTZWxlY3RvcignLnYtc3R1ZGlvX19wYW5lbCcpKTsgfTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBfcmVzaXplSGFuZGxlcik7CgogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHRyeSB7IG5vZGUuZm9jdXMoKTsgfSBjYXRjaCAoZSkge30gfSwgMjApOwogIH0KCiAgZnVuY3Rpb24gaW5kZXhPZihhcnIsIGlkKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBpZiAoaW1hZ2VJRChhcnJbaV0pID09PSBpZCkgcmV0dXJuIGk7IH0KICAgIHJldHVybiAtMTsKICB9CgogIFYudmlld3Muc3R1ZGlvID0gewogICAgcmVuZGVyOiBmdW5jdGlvbiAocm9vdCwgcGFyYW1zKSB7CiAgICAgIHRoaXMudGVhcmRvd24oKTsKICAgICAgX2Rpc3Bvc2VkID0gZmFsc2U7CiAgICAgIF9yb290ID0gcm9vdDsKICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgICB2YXIgaWQgPSBwYXJhbXMuaWQgfHwgcGFyYW1zLmltYWdlSUQgfHwgcGFyYW1zLmltYWdlSWQgfHwgcGFyYW1zLmltYWdlIHx8IG51bGw7CiAgICAgIGlmIChpZCkgaWQgPSBTdHJpbmcoaWQpOwoKICAgICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgICAgX25vZGUgPSBudWxsOwoKICAgICAgaWYgKCFpZCkgeyBtb3VudE5vdEZvdW5kKHJvb3QpOyByZXR1cm47IH0KCiAgICAgIHZhciBsb2NhbCA9IGZpbmRJblN0YXRlKGlkKTsKICAgICAgaWYgKGxvY2FsKSB7IF9pbWFnZSA9IGxvY2FsOyBtb3VudFN0dWRpbyhyb290KTsgcmV0dXJuOyB9CgogICAgICBtb3VudFNrZWxldG9uKHJvb3QpOwogICAgICByZXNvbHZlSW1hZ2UoaWQpLnRoZW4oZnVuY3Rpb24gKGltZykgewogICAgICAgIGlmIChfZGlzcG9zZWQpIHJldHVybjsKICAgICAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgICAgIF9ub2RlID0gbnVsbDsKICAgICAgICBpZiAoIWltZykgeyBtb3VudE5vdEZvdW5kKHJvb3QpOyByZXR1cm47IH0KICAgICAgICBfaW1hZ2UgPSBpbWc7CiAgICAgICAgbW91bnRTdHVkaW8ocm9vdCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoX2Rpc3Bvc2VkKSByZXR1cm47CiAgICAgICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgICAgICBfbm9kZSA9IG51bGw7CiAgICAgICAgbW91bnROb3RGb3VuZChyb290KTsKICAgICAgfSk7CiAgICB9LAoKICAgIHRlYXJkb3duOiBmdW5jdGlvbiAoKSB7CiAgICAgIF9kaXNwb3NlZCA9IHRydWU7CiAgICAgIGlmIChfa2V5SGFuZGxlcikgeyBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX2tleUhhbmRsZXIpOyBfa2V5SGFuZGxlciA9IG51bGw7IH0KICAgICAgaWYgKF9wYXN0ZUhhbmRsZXIpIHsgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBfcGFzdGVIYW5kbGVyKTsgX3Bhc3RlSGFuZGxlciA9IG51bGw7IH0KICAgICAgaWYgKF9yZXNpemVIYW5kbGVyKSB7IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBfcmVzaXplSGFuZGxlcik7IF9yZXNpemVIYW5kbGVyID0gbnVsbDsgfQogICAgICBpZiAoX3BvbGxBYm9ydCkgeyB0cnkgeyBfcG9sbEFib3J0LmFib3J0KCk7IH0gY2F0Y2ggKGUpIHt9IF9wb2xsQWJvcnQgPSBudWxsOyB9CiAgICAgIGRlc3Ryb3lTY3J1YigpOwogICAgICBfbm9kZSA9IG51bGw7CiAgICAgIF9pbWFnZSA9IG51bGw7CiAgICAgIF9zaWJsaW5ncyA9IFtdOwogICAgICBfaW5kZXggPSAtMTsKICAgIH0KICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9wcm9maWxlLmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9IHdpbmRvdy5WID0gd2luZG93LlYgfHwge307CiAgVi52aWV3cyA9IFYudmlld3MgfHwge307CgogIGZ1bmN0aW9uIGVsKHRhZywgYXR0cnMpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBWLnVpLmVsLmFwcGx5KFYudWksIGFyZ3VtZW50cyk7CiAgICB9CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIHZhciBjaGlsZHJlbiA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICBpZiAobm9kZSAmJiBhdHRycykgewogICAgICBmb3IgKHZhciBrIGluIGF0dHJzKSB7CiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cnMsIGspKSBjb250aW51ZTsKICAgICAgICB2YXIgdmFsID0gYXR0cnNba107CiAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gZmFsc2UpIGNvbnRpbnVlOwogICAgICAgIGlmIChrID09PSAnY2xhc3MnIHx8IGsgPT09ICdjbGFzc05hbWUnKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAndGV4dCcpIG5vZGUudGV4dENvbnRlbnQgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ2h0bWwnKSBub2RlLmlubmVySFRNTCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAnc3R5bGUnICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICBmb3IgKHZhciBzayBpbiB2YWwpIG5vZGUuc3R5bGVbc2tdID0gdmFsW3NrXTsKICAgICAgICB9IGVsc2UgaWYgKGsuaW5kZXhPZignb24nKSA9PT0gMCAmJiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCB2YWwpOwogICAgICAgIH0gZWxzZSBpZiAoayA9PT0gJ3ZhbHVlJyB8fCBrID09PSAnY2hlY2tlZCcgfHwgayA9PT0gJ2Rpc2FibGVkJyB8fCBrID09PSAnc2VsZWN0ZWQnKSB7CiAgICAgICAgICBub2RlW2tdID0gdmFsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShrLCB2YWwpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXBwZW5kQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW4pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiBhcHBlbmRDaGlsZHJlbihub2RlLCBjaGlsZHJlbikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldOwogICAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlIHx8IGMgPT09IHRydWUpIGNvbnRpbnVlOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgeyBhcHBlbmRDaGlsZHJlbihub2RlLCBjKTsgY29udGludWU7IH0KICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0eXBlb2YgYyA9PT0gJ29iamVjdCcgJiYgYy5ub2RlVHlwZSA/IGMgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gaWNvbihuYW1lKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5pY29uID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciBvdXQgPSBWLnVpLmljb24obmFtZSk7CiAgICAgIGlmIChvdXQgJiYgb3V0Lm5vZGVUeXBlKSByZXR1cm4gb3V0OwogICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgc3Bhbi5jbGFzc05hbWUgPSAndi1pY28nOwogICAgICBzcGFuLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgICBzcGFuLmlubmVySFRNTCA9IG91dCB8fCAnJzsKICAgICAgcmV0dXJuIHNwYW47CiAgICB9CiAgICB2YXIgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgIHMuY2xhc3NOYW1lID0gJ3YtaWNvJzsKICAgIHMuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICBzLnRleHRDb250ZW50ID0gJyc7CiAgICByZXR1cm4gczsKICB9CgogIGZ1bmN0aW9uIHRvYXN0KG1zZywga2luZCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkudG9hc3QgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnVpLnRvYXN0KG1zZywga2luZCk7CiAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5lbWl0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi5zdG9yZS5lbWl0KCd0b2FzdCcsIHsgbWVzc2FnZTogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsKICB9CgogIGZ1bmN0aW9uIGNvbmZpcm1EaWFsb2cobXNnKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jb25maXJtID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciByID0gVi51aS5jb25maXJtKG1zZyk7CiAgICAgIHJldHVybiAociAmJiB0eXBlb2Ygci50aGVuID09PSAnZnVuY3Rpb24nKSA/IHIgOiBQcm9taXNlLnJlc29sdmUoISFyKTsKICAgIH0KICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0obXNnKSk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICBpZiAoVi5yb3V0ZXIgJiYgdHlwZW9mIFYucm91dGVyLmdvID09PSAnZnVuY3Rpb24nKSByZXR1cm4gVi5yb3V0ZXIuZ28oaGFzaCk7CiAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiBjbG9zZURyYXdlcigpIHsKICAgIHRyeSB7CiAgICAgIGlmIChWLnJvdXRlciAmJiB0eXBlb2YgVi5yb3V0ZXIuY2xvc2VEcmF3ZXIgPT09ICdmdW5jdGlvbicpIHsgVi5yb3V0ZXIuY2xvc2VEcmF3ZXIoKTsgcmV0dXJuOyB9CiAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmNsb3NlRHJhd2VyID09PSAnZnVuY3Rpb24nKSB7IFYudWkuY2xvc2VEcmF3ZXIoKTsgcmV0dXJuOyB9CiAgICAgIGlmIChWLmFwcCAmJiB0eXBlb2YgVi5hcHAuY2xvc2VEcmF3ZXIgPT09ICdmdW5jdGlvbicpIHsgVi5hcHAuY2xvc2VEcmF3ZXIoKTsgcmV0dXJuOyB9CiAgICAgIGlmICh0eXBlb2YgVi5jbG9zZURyYXdlciA9PT0gJ2Z1bmN0aW9uJykgeyBWLmNsb3NlRHJhd2VyKCk7IHJldHVybjsgfQogICAgfSBjYXRjaCAoZSkge30KICAgIHRyeSB7IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd2LWRyYXdlci1vcGVuJyk7IH0gY2F0Y2ggKGUpIHt9CiAgICB2YXIgZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2LWFjY291bnQtZHJhd2VyJyk7CiAgICB2YXIgc2NyaW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudi1zY3JpbScpOwogICAgaWYgKGQpIHsgZC5jbGFzc0xpc3QucmVtb3ZlKCd2LWRyYXdlci0taW4nKTsgZC5oaWRkZW4gPSB0cnVlOyB9CiAgICBpZiAoc2NyaW0pIHsgc2NyaW0uY2xhc3NMaXN0LnJlbW92ZSgndi1zY3JpbS0taW4nKTsgc2NyaW0uaGlkZGVuID0gdHJ1ZTsgfQogIH0KCiAgZnVuY3Rpb24gbmF2aWdhdGUoaGFzaCkgewogICAgY2xvc2VEcmF3ZXIoKTsKICAgIGdvKGhhc2gpOwogIH0KCiAgZnVuY3Rpb24gc2dldChrZXksIGZhbGxiYWNrKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5nZXQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICB2YXIgdiA9IFYuc3RvcmUuZ2V0KGtleSk7CiAgICAgICAgcmV0dXJuIHYgPT0gbnVsbCA/IGZhbGxiYWNrIDogdjsKICAgICAgfQogICAgfSBjYXRjaCAoZSkge30KICAgIHJldHVybiBmYWxsYmFjazsKICB9CiAgZnVuY3Rpb24gc3NldChrZXksIHZhbHVlKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5zZXQgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuc2V0KGtleSwgdmFsdWUpOwogICAgICBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5zYXZlID09PSAnZnVuY3Rpb24nKSBWLnN0b3JlLnNhdmUoKTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiBzZXR0aW5ncygpIHsKICAgIHZhciBzID0gc2dldCgnc2V0dGluZ3MnLCBudWxsKTsKICAgIGlmICghcyB8fCB0eXBlb2YgcyAhPT0gJ29iamVjdCcpIHsKICAgICAgcyA9IHt9OwogICAgICB0cnkgeyBpZiAoVi5zdGF0ZSkgVi5zdGF0ZS5zZXR0aW5ncyA9IHM7IH0gY2F0Y2ggKGUpIHt9CiAgICB9CiAgICByZXR1cm4gczsKICB9CiAgZnVuY3Rpb24gc2V0dGluZ0NoYW5nZShrZXksIHZhbHVlKSB7CiAgICB2YXIgcyA9IHNldHRpbmdzKCk7CiAgICBzW2tleV0gPSB2YWx1ZTsKICAgIHNzZXQoJ3NldHRpbmdzJywgcyk7CiAgfQoKICB2YXIgTFNfUFJFRklYID0gJ3ZhbXBfd2ViXyc7CiAgZnVuY3Rpb24gbHNHZXQoa2V5LCBmYWxsYmFjaykgewogICAgdHJ5IHsKICAgICAgdmFyIHJhdyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19QUkVGSVggKyBrZXkpOwogICAgICBpZiAocmF3ID09IG51bGwpIHJldHVybiBmYWxsYmFjazsKICAgICAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UocmF3KTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gcmF3OyB9CiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxsYmFjazsgfQogIH0KICBmdW5jdGlvbiBsc1NldChrZXksIHZhbHVlKSB7CiAgICB0cnkgeyB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oTFNfUFJFRklYICsga2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7fQogIH0KCiAgZnVuY3Rpb24gY3VycmVudFVzZXIoKSB7CiAgICB0cnkgeyByZXR1cm4gKFYuc3RhdGUgJiYgVi5zdGF0ZS51c2VyKSB8fCBudWxsOyB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgfQogIGZ1bmN0aW9uIHVzZXJJZGVudGl0eSh1KSB7CiAgICB1ID0gdSB8fCBjdXJyZW50VXNlcigpIHx8IHt9OwogICAgdmFyIG1pY3JvID0gKHUuZ2xvYmFsICYmIHUuZ2xvYmFsLm1pY3JvKSB8fCB7fTsKICAgIHZhciBpZCA9IG1pY3JvLmlkIHx8IHUuaWQgfHwgbnVsbDsKICAgIHZhciB1c2VybmFtZSA9IG1pY3JvLnVzZXJuYW1lIHx8IHUudXNlcm5hbWUgfHwgJyc7CiAgICB2YXIgbmFtZSA9IHUubmFtZSB8fCAodS5maXJzdE5hbWUgPyAodS5maXJzdE5hbWUgKyAodS5sYXN0TmFtZSA/ICcgJyArIHUubGFzdE5hbWUgOiAnJykpIDogJycpIHx8IHVzZXJuYW1lIHx8ICcnOwogICAgdmFyIGVtYWlsID0gdS5lbWFpbCB8fCAodS5nbG9iYWwgJiYgdS5nbG9iYWwuZW1haWwpIHx8ICcnOwogICAgdmFyIGF2YXRhciA9IG1pY3JvLnByb2ZpbGVQaWNVUkwgfHwgdS5wcm9maWxlUGljVVJMIHx8ICh1Lmdsb2JhbCAmJiB1Lmdsb2JhbC5wcm9maWxlUGljVVJMKSB8fCAnJzsKICAgIHZhciBhZG1pbiA9ICEhKHUuYWRtaW4gfHwgKHUuZ2xvYmFsICYmIHUuZ2xvYmFsLmFkbWluKSk7CiAgICByZXR1cm4geyBpZDogaWQsIHVzZXJuYW1lOiB1c2VybmFtZSwgbmFtZTogbmFtZSwgZW1haWw6IGVtYWlsLCBhdmF0YXI6IGF2YXRhciwgYWRtaW46IGFkbWluIH07CiAgfQoKICBmdW5jdGlvbiBjcmVkaXRzVmFsdWUoKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdGF0ZSAmJiBWLnN0YXRlLmNyZWRpdHMgIT0gbnVsbCkgcmV0dXJuIFYuc3RhdGUuY3JlZGl0czsKICAgICAgdmFyIHUgPSBjdXJyZW50VXNlcigpOwogICAgICBpZiAodSAmJiB1LmNyZWRpdHMgIT0gbnVsbCkgcmV0dXJuIHUuY3JlZGl0czsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHJlZnJlc2hDcmVkaXRzKCkgewogICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkuY3JlZGl0cyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgIHJldHVybiBWLmFwaS5jcmVkaXRzKCkudGhlbihmdW5jdGlvbiAocikgewogICAgICB2YXIgbiA9IChyICYmIChyLmNyZWRpdHMgIT0gbnVsbCA/IHIuY3JlZGl0cyA6IHIpKSB8fCAwOwogICAgICB0cnkgeyBpZiAoVi5zdGF0ZSkgVi5zdGF0ZS5jcmVkaXRzID0gbjsgfSBjYXRjaCAoZSkge30KICAgICAgdHJ5IHsgaWYgKFYuc3RvcmUpIHsgVi5zdG9yZS5zZXQoJ2NyZWRpdHMnLCBuKTsgVi5zdG9yZS5lbWl0KCdjcmVkaXRzOmNoYW5nZWQnLCBuKTsgfSB9IGNhdGNoIChlKSB7fQogICAgICByZXR1cm4gbjsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH0pOwogIH0KCiAgZnVuY3Rpb24gYXZhdGFyTm9kZShpZGVudCwgc2l6ZSkgewogICAgc2l6ZSA9IHNpemUgfHwgNTY7CiAgICB2YXIgYm94ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9fYXZhdGFyJywgc3R5bGU6IHsgd2lkdGg6IHNpemUgKyAncHgnLCBoZWlnaHQ6IHNpemUgKyAncHgnLCBib3JkZXJSYWRpdXM6ICc1MCUnIH0gfSk7CiAgICBpZiAoaWRlbnQuYXZhdGFyKSB7CiAgICAgIHZhciBpbWcgPSBlbCgnaW1nJywgewogICAgICAgIHNyYzogaWRlbnQuYXZhdGFyLAogICAgICAgIGFsdDogKGlkZW50Lm5hbWUgfHwgaWRlbnQudXNlcm5hbWUgfHwgJ0F2YXRhcicpCiAgICAgIH0pOwogICAgICBpZiAoaW1nICYmIGltZy5zZXRBdHRyaWJ1dGUpIGltZy5zZXRBdHRyaWJ1dGUoJ2xvYWRpbmcnLCAnbGF6eScpOwogICAgICBpZiAoaW1nICYmIGltZy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgaW1nLnJlbW92ZSgpOwogICAgICAgICAgYm94LmFwcGVuZENoaWxkKGVsKCdzcGFuJywgbnVsbCwgaW5pdGlhbHMoaWRlbnQpKSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKGltZykgYm94LmFwcGVuZENoaWxkKGltZyk7CiAgICB9IGVsc2UgewogICAgICBib3guYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCBudWxsLCBpbml0aWFscyhpZGVudCkpKTsKICAgIH0KICAgIHJldHVybiBib3g7CiAgfQogIGZ1bmN0aW9uIGluaXRpYWxzKGlkZW50KSB7CiAgICB2YXIgYmFzZSA9IChpZGVudC5uYW1lIHx8IGlkZW50LnVzZXJuYW1lIHx8IGlkZW50LmVtYWlsIHx8ICdWJykudHJpbSgpOwogICAgdmFyIHBhcnRzID0gYmFzZS5zcGxpdCgvXHMrLykuZmlsdGVyKEJvb2xlYW4pOwogICAgdmFyIGluaXRzID0gcGFydHMubGVuZ3RoID49IDIKICAgICAgPyAocGFydHNbMF1bMF0gKyBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXVswXSkKICAgICAgOiBiYXNlLnNsaWNlKDAsIDIpOwogICAgcmV0dXJuIChpbml0cyB8fCAnVicpLnRvVXBwZXJDYXNlKCk7CiAgfQoKICBmdW5jdGlvbiBzZWN0aW9uKHRpdGxlLCBzdWJ0aXRsZSwgY2hpbGRyZW4pIHsKICAgIHZhciBoZWFkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX2hlYWQnIH0sCiAgICAgIGVsKCdoMicsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3RpdGxlJywgdGV4dDogdGl0bGUgfSkpOwogICAgaWYgKHN1YnRpdGxlKSBoZWFkLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fc3ViJywgdGV4dDogc3VidGl0bGUgfSkpOwogICAgcmV0dXJuIGVsKCdzZWN0aW9uJywgeyBjbGFzczogJ3Ytc2VjdGlvbiBnbGFzcy1jYXJkJyB9LCBoZWFkLAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3RhY2stbWQnIH0sIGNoaWxkcmVuIHx8IFtdKSk7CiAgfQoKICBmdW5jdGlvbiBzZXR0aW5nUm93KGxhYmVsLCBjb250cm9sLCBoaW50KSB7CiAgICB2YXIgbGFiZWxTdGFjayA9IGVsKCdkaXYnLCB7CiAgICAgIHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzJweCcsIG1pbldpZHRoOiAnMCcsIGZsZXg6ICcxIDEgYXV0bycgfQogICAgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWxhYmVsJywgdGV4dDogbGFiZWwgfSkpOwogICAgaWYgKGhpbnQpIGxhYmVsU3RhY2suYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW11dGVkJywgc3R5bGU6IHsgZm9udFNpemU6ICcxM3B4JyB9LCB0ZXh0OiBoaW50IH0pKTsKICAgIHJldHVybiBlbCgnZGl2JywgewogICAgICBjbGFzczogJ3Ytcm93IHYtcm93LS1iZXR3ZWVuIHYtcm93LS13cmFwJywKICAgICAgc3R5bGU6IHsgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgYWxpZ25JdGVtczogJ2NlbnRlcicgfQogICAgfSwgbGFiZWxTdGFjaywgZWwoJ2RpdicsIHsgc3R5bGU6IHsgZmxleDogJzAgMCBhdXRvJyB9IH0sIGNvbnRyb2wpKTsKICB9CgogIGZ1bmN0aW9uIHRvZ2dsZShjaGVja2VkLCBvbkNoYW5nZSwgYXJpYUxhYmVsKSB7CiAgICB2YXIgaW5wdXQgPSBlbCgnaW5wdXQnLCB7CiAgICAgIHR5cGU6ICdjaGVja2JveCcsIGNoZWNrZWQ6ICEhY2hlY2tlZCwgJ2FyaWEtbGFiZWwnOiBhcmlhTGFiZWwgfHwgJ1RvZ2dsZScsCiAgICAgIHJvbGU6ICdzd2l0Y2gnLCAnYXJpYS1jaGVja2VkJzogY2hlY2tlZCA/ICd0cnVlJyA6ICdmYWxzZScsCiAgICAgIHN0eWxlOiB7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCBvcGFjaXR5OiAnMCcsIHdpZHRoOiAnMXB4JywgaGVpZ2h0OiAnMXB4JywgcG9pbnRlckV2ZW50czogJ25vbmUnIH0KICAgIH0pOwogICAgdmFyIHRodW1iID0gZWwoJ3NwYW4nLCB7CiAgICAgIHN0eWxlOiB7CiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogJzJweCcsIGxlZnQ6IGNoZWNrZWQgPyAnMjRweCcgOiAnMnB4JywKICAgICAgICB3aWR0aDogJzI0cHgnLCBoZWlnaHQ6ICcyNHB4JywgYm9yZGVyUmFkaXVzOiAnNTAlJywgYmFja2dyb3VuZDogJyNmZmYnLAogICAgICAgIGJveFNoYWRvdzogJzAgMXB4IDNweCByZ2JhKDAsMCwwLC4zNSknLAogICAgICAgIHRyYW5zaXRpb246ICdsZWZ0IHZhcigtLWR1ci1pbnRlcmFjdGl2ZSwgMTQwbXMpIHZhcigtLWVhc2Utc3ByaW5nLCBjdWJpYy1iZXppZXIoMC4zNCwxLjU2LDAuNjQsMSkpJwogICAgICB9CiAgICB9KTsKICAgIHZhciB0cmFjayA9IGVsKCdzcGFuJywgewogICAgICBzdHlsZTogewogICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLCBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJywgd2lkdGg6ICc1MHB4JywgaGVpZ2h0OiAnMjhweCcsCiAgICAgICAgYm9yZGVyUmFkaXVzOiAnOTk5cHgnLAogICAgICAgIGJhY2tncm91bmQ6IGNoZWNrZWQgPyAndmFyKC0tdmFtcC1hY2NlbnQsICM1Mjk3RjgpJyA6ICd2YXIoLS12LWxpbmUsIHJnYmEoMjQ1LDI0NSwyNDcsLjE4KSknLAogICAgICAgIHRyYW5zaXRpb246ICdiYWNrZ3JvdW5kIHZhcigtLWR1ci1pbnRlcmFjdGl2ZSwgMTQwbXMpIHZhcigtLWdsYXNzLWVhc2UsIGN1YmljLWJlemllcigwLjQsMCwwLjIsMSkpJwogICAgICB9CiAgICB9LCB0aHVtYik7CiAgICB2YXIgd3JhcCA9IGVsKCdsYWJlbCcsIHsKICAgICAgc3R5bGU6IHsgZGlzcGxheTogJ2lubGluZS1mbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGN1cnNvcjogJ3BvaW50ZXInIH0KICAgIH0sIGlucHV0LCB0cmFjayk7CiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBvbiA9IGlucHV0LmNoZWNrZWQ7CiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1jaGVja2VkJywgb24gPyAndHJ1ZScgOiAnZmFsc2UnKTsKICAgICAgdGh1bWIuc3R5bGUubGVmdCA9IG9uID8gJzI0cHgnIDogJzJweCc7CiAgICAgIHRyYWNrLnN0eWxlLmJhY2tncm91bmQgPSBvbiA/ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknIDogJ3ZhcigtLXYtbGluZSwgcmdiYSgyNDUsMjQ1LDI0NywuMTgpKSc7CiAgICAgIG9uQ2hhbmdlKG9uKTsKICAgIH0pOwogICAgcmV0dXJuIHdyYXA7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3RDb250cm9sKG9wdGlvbnMsIHZhbHVlLCBvbkNoYW5nZSwgYXJpYUxhYmVsKSB7CiAgICB2YXIgc2VsID0gZWwoJ3NlbGVjdCcsIHsgY2xhc3M6ICd2LXNlbGVjdCcsICdhcmlhLWxhYmVsJzogYXJpYUxhYmVsIHx8ICdTZWxlY3QnLCBzdHlsZTogeyBtaW5XaWR0aDogJzE4MHB4JyB9IH0pOwogICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7CiAgICAgIHZhciBvcHQgPSBlbCgnb3B0aW9uJywgeyB2YWx1ZTogby52YWx1ZSwgdGV4dDogby5sYWJlbCB9KTsKICAgICAgaWYgKFN0cmluZyhvLnZhbHVlKSA9PT0gU3RyaW5nKHZhbHVlKSkgb3B0LnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgc2VsLmFwcGVuZENoaWxkKG9wdCk7CiAgICB9KTsKICAgIHNlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7IG9uQ2hhbmdlKHNlbC52YWx1ZSk7IH0pOwogICAgcmV0dXJuIHNlbDsKICB9CgogIGZ1bmN0aW9uIGluZHVzdHJ5Q2xvdWQoc2VsZWN0ZWRLZXlzLCBvblRvZ2dsZSkgewogICAgdmFyIGxpc3QgPSAoVi5kYXRhICYmIFYuZGF0YS5pbmR1c3RyaWVzKSB8fCBbXTsKICAgIHZhciBzZWxlY3RlZCA9IHt9OwogICAgKHNlbGVjdGVkS2V5cyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoaykgeyBzZWxlY3RlZFtrXSA9IHRydWU7IH0pOwogICAgdmFyIHdyYXAgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtY2hpcC1yb3cnLCBzdHlsZTogeyBmbGV4V3JhcDogJ3dyYXAnLCBvdmVyZmxvdzogJ3Zpc2libGUnIH0gfSk7CiAgICBpZiAoIWxpc3QubGVuZ3RoKSB7CiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHRleHQ6ICdObyBpbmR1c3RyaWVzIGF2YWlsYWJsZS4nIH0pKTsKICAgICAgcmV0dXJuIHdyYXA7CiAgICB9CiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGluZCkgewogICAgICB2YXIga2V5ID0gaW5kLmtleTsKICAgICAgdmFyIGNoaXAgPSBlbCgnYnV0dG9uJywgewogICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgIGNsYXNzOiAndi1jaGlwJyArIChzZWxlY3RlZFtrZXldID8gJyB2LWNoaXAtLWFjdGl2ZScgOiAnJyksCiAgICAgICAgJ2FyaWEtcHJlc3NlZCc6IHNlbGVjdGVkW2tleV0gPyAndHJ1ZScgOiAnZmFsc2UnCiAgICAgIH0sIGluZC5sYWJlbCB8fCBrZXkpOwogICAgICBjaGlwLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgIHNlbGVjdGVkW2tleV0gPSAhc2VsZWN0ZWRba2V5XTsKICAgICAgICBjaGlwLmNsYXNzTGlzdC50b2dnbGUoJ3YtY2hpcC0tYWN0aXZlJywgc2VsZWN0ZWRba2V5XSk7CiAgICAgICAgY2hpcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIHNlbGVjdGVkW2tleV0gPyAndHJ1ZScgOiAnZmFsc2UnKTsKICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHNlbGVjdGVkKS5maWx0ZXIoZnVuY3Rpb24gKGspIHsgcmV0dXJuIHNlbGVjdGVkW2tdOyB9KTsKICAgICAgICBvblRvZ2dsZShrZXlzKTsKICAgICAgfSk7CiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQoY2hpcCk7CiAgICB9KTsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gaW5kdXN0cnlCdWJibGVHcmlkKHNlbGVjdGVkS2V5cywgb25Ub2dnbGUpIHsKICAgIHZhciBsaXN0ID0gKFYuZGF0YSAmJiBWLmRhdGEuaW5kdXN0cmllcykgfHwgW107CiAgICB2YXIgc2VsZWN0ZWQgPSB7fTsKICAgIChzZWxlY3RlZEtleXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGspIHsgc2VsZWN0ZWRba10gPSB0cnVlOyB9KTsKICAgIHZhciBncmlkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW9uYl9fZ3JpZCcsIHJvbGU6ICdncm91cCcsICdhcmlhLWxhYmVsJzogJ0luZHVzdHJpZXMnIH0pOwogICAgaWYgKCFsaXN0Lmxlbmd0aCkgewogICAgICBncmlkLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCB0ZXh0OiAnTm8gaW5kdXN0cmllcyBhdmFpbGFibGUuJyB9KSk7CiAgICAgIHJldHVybiBncmlkOwogICAgfQogICAgZnVuY3Rpb24gZW1pdCgpIHsKICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzZWxlY3RlZCkuZmlsdGVyKGZ1bmN0aW9uIChrKSB7IHJldHVybiBzZWxlY3RlZFtrXTsgfSk7CiAgICAgIG9uVG9nZ2xlKGtleXMpOwogICAgfQogICAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpbmQpIHsKICAgICAgdmFyIGtleSA9IGluZC5rZXk7CiAgICAgIHZhciBidWJibGUgPSBlbCgnYnV0dG9uJywgewogICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgIGNsYXNzOiAndi1vbmJfX2J1YmJsZScgKyAoc2VsZWN0ZWRba2V5XSA/ICcgdi1vbmJfX2J1YmJsZS0tb24nIDogJycpLAogICAgICAgICdhcmlhLXByZXNzZWQnOiBzZWxlY3RlZFtrZXldID8gJ3RydWUnIDogJ2ZhbHNlJwogICAgICB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3Ytb25iX19idWJibGUtbWFyaycsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9LCBpY29uKCdjaGVja21hcmsnKSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1vbmJfX2J1YmJsZS10aXRsZScsIHRleHQ6IGluZC5sYWJlbCB8fCBrZXkgfSksCiAgICAgICAgaW5kLnBsYWNlaG9sZGVyID8gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1vbmJfX2J1YmJsZS1kZXNjJywgdGV4dDogYnViYmxlSGludChpbmQucGxhY2Vob2xkZXIpIH0pIDogbnVsbCk7CiAgICAgIGJ1YmJsZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICBzZWxlY3RlZFtrZXldID0gIXNlbGVjdGVkW2tleV07CiAgICAgICAgYnViYmxlLmNsYXNzTGlzdC50b2dnbGUoJ3Ytb25iX19idWJibGUtLW9uJywgc2VsZWN0ZWRba2V5XSk7CiAgICAgICAgYnViYmxlLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgc2VsZWN0ZWRba2V5XSA/ICd0cnVlJyA6ICdmYWxzZScpOwogICAgICAgIGJ1YmJsZS5jbGFzc0xpc3QucmVtb3ZlKCd2LW9uYl9fYnViYmxlLS1wdWxzZScpOwogICAgICAgIHZvaWQgYnViYmxlLm9mZnNldFdpZHRoOwogICAgICAgIGJ1YmJsZS5jbGFzc0xpc3QuYWRkKCd2LW9uYl9fYnViYmxlLS1wdWxzZScpOwogICAgICAgIGVtaXQoKTsKICAgICAgfSk7CiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoYnViYmxlKTsKICAgIH0pOwogICAgcmV0dXJuIGdyaWQ7CiAgfQogIGZ1bmN0aW9uIGJ1YmJsZUhpbnQocGxhY2Vob2xkZXIpIHsKICAgIHZhciBzID0gU3RyaW5nKHBsYWNlaG9sZGVyIHx8ICcnKS5yZXBsYWNlKC9eRGVzY3JpYmVccyt0aGVccysvaSwgJycpLnNwbGl0KCfigJQnKVswXS50cmltKCk7CiAgICBpZiAoIXMpIHJldHVybiAnJzsKICAgIHMgPSBzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKTsKICAgIHJldHVybiBzLmxlbmd0aCA+IDQyID8gcy5zbGljZSgwLCA0MCkudHJpbSgpICsgJ+KApicgOiBzOwogIH0KCiAgZnVuY3Rpb24gcmVjb21tZW5kZWRNb2RlbChpbmR1c3RyeUtleXMpIHsKICAgIHZhciBtb2RlbHMgPSAoKFYuZGF0YSAmJiBWLmRhdGEubW9kZWxzKSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtICYmIG0ucmF3ICE9PSAndW5saW1pdGVkJzsgfSk7CiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBudWxsOwogICAgdmFyIHByZWZlciA9IChpbmR1c3RyeUtleXMgJiYgaW5kdXN0cnlLZXlzLmxlbmd0aCkgPyBbJ2ZsdXgnLCAncHJvJywgJ2VkaXQnXSA6IFsnc2NobmVsbCcsICdmYXN0J107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWZlci5sZW5ndGg7IGkrKykgewogICAgICB2YXIgaGl0ID0gbW9kZWxzLmZpbHRlcihmdW5jdGlvbiAobSkgeyByZXR1cm4gU3RyaW5nKG0ucmF3IHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocHJlZmVyW2ldKSA+PSAwOyB9KVswXTsKICAgICAgaWYgKGhpdCkgcmV0dXJuIGhpdC5yYXc7CiAgICB9CiAgICByZXR1cm4gbW9kZWxzWzBdLnJhdzsKICB9CgogIGZ1bmN0aW9uIGN0YUJ1dHRvbihsYWJlbCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgY2xzID0gJ3YtY3RhJzsKICAgIGlmIChvcHRzLnByaW1hcnkpIGNscyArPSAnIHYtY3RhLS1wcmltYXJ5JzsKICAgIGVsc2UgaWYgKG9wdHMuZ2hvc3QpIGNscyArPSAnIHYtY3RhLS1naG9zdCc7CiAgICBpZiAob3B0cy5kYW5nZXIpIGNscyArPSAnIHYtY3RhLS1kYW5nZXInOwogICAgaWYgKG9wdHMuYmxvY2spIGNscyArPSAnIHYtY3RhLS1ibG9jayc7CiAgICBpZiAob3B0cy5zbWFsbCkgY2xzICs9ICcgdi1jdGEtLXNtJzsKICAgIHZhciBidG4gPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6IGNscyB9KTsKICAgIGlmIChvcHRzLmljb24pIGJ0bi5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWN0YV9faWNvbicgfSwgaWNvbihvcHRzLmljb24pKSk7CiAgICBidG4uYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IHRleHQ6IGxhYmVsIH0pKTsKICAgIGlmIChvcHRzLm9uQ2xpY2spIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wdHMub25DbGljayk7CiAgICByZXR1cm4gYnRuOwogIH0KCiAgZnVuY3Rpb24gbGlua0J1dHRvbihsYWJlbCwgaHJlZiwgaWMpIHsKICAgIHZhciBhID0gZWwoJ2EnLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1zbScsIGhyZWY6IGhyZWYsIHRhcmdldDogJ19ibGFuaycsIHJlbDogJ25vb3BlbmVyIG5vcmVmZXJyZXInIH0pOwogICAgaWYgKGljKSBhLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3RhX19pY29uJyB9LCBpY29uKGljKSkpOwogICAgYS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgdGV4dDogbGFiZWwgfSkpOwogICAgcmV0dXJuIGE7CiAgfQoKICBmdW5jdGlvbiBhdXRoR3VhcmQocm9vdCkgewogICAgdmFyIGF1dGhlZCA9IGZhbHNlOwogICAgdHJ5IHsgYXV0aGVkID0gVi5hdXRoICYmIHR5cGVvZiBWLmF1dGguaXNBdXRoZWQgPT09ICdmdW5jdGlvbicgPyBWLmF1dGguaXNBdXRoZWQoKSA6ICEhY3VycmVudFVzZXIoKTsgfSBjYXRjaCAoZSkgeyBhdXRoZWQgPSAhIWN1cnJlbnRVc2VyKCk7IH0KICAgIGlmICghYXV0aGVkKSB7CiAgICAgIG1vdW50RW1wdHkocm9vdCwgJ1NpZ24gaW4gdG8gY29udGludWUnLCAnWW91IG5lZWQgYW4gYWNjb3VudCB0byB2aWV3IHRoaXMgcGFnZS4nLCAnU2lnbiBJbicsIGZ1bmN0aW9uICgpIHsgbmF2aWdhdGUoJyMvYXV0aCcpOyB9KTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBtb3VudEVtcHR5KHJvb3QsIHRpdGxlLCBtc2csIGFjdGlvbkxhYmVsLCBvbkFjdGlvbikgewogICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgIHZhciBjYXJkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5IGdsYXNzLWNhcmQnIH0sCiAgICAgIGVsKCdoMicsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScsIHRleHQ6IHRpdGxlIH0pLAogICAgICBtc2cgPyBlbCgncCcsIHsgY2xhc3M6ICd2LWVtcHR5X19tc2cnLCB0ZXh0OiBtc2cgfSkgOiBudWxsKTsKICAgIGlmIChhY3Rpb25MYWJlbCAmJiBvbkFjdGlvbikgY2FyZC5hcHBlbmRDaGlsZChjdGFCdXR0b24oYWN0aW9uTGFiZWwsIHsgcHJpbWFyeTogdHJ1ZSwgb25DbGljazogb25BY3Rpb24gfSkpOwogICAgcm9vdC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtcGFnZScgfSwgY2FyZCkpOwogIH0KCiAgVi52aWV3cy5zZXR0aW5ncyA9IChmdW5jdGlvbiAoKSB7CiAgICB2YXIgdW5zdWIgPSBbXTsKCiAgICBmdW5jdGlvbiByZW5kZXIocm9vdCkgewogICAgICB0ZWFyZG93bigpOwogICAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWF1dGhHdWFyZChyb290KSkgcmV0dXJuOwoKICAgICAgdmFyIGlkZW50ID0gdXNlcklkZW50aXR5KCk7CiAgICAgIHZhciB2aWV3ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBhZ2Ugdi12aWV3LS1zZXR0aW5ncycgfSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKGVsKCdoZWFkZXInLCB7IGNsYXNzOiAndi1zZWN0aW9uX19oZWFkJyB9LAogICAgICAgIGVsKCdkaXYnLCBudWxsLAogICAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1leWVicm93JywgdGV4dDogJ0FjY291bnQnIH0pLAogICAgICAgICAgZWwoJ2gxJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fdGl0bGUnLCBzdHlsZTogeyBmb250U2l6ZTogJ3ZhcigtLWZvbnQtbGFyZ2UtdGl0bGUsIDM0cHgpJyB9LCB0ZXh0OiAnU2V0dGluZ3MnIH0pKSkpOwoKICAgICAgdmFyIGNyZWRpdHNFbCA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicgfSB9KTsKICAgICAgZnVuY3Rpb24gcGFpbnRDcmVkaXRzKG4pIHsKICAgICAgICBjcmVkaXRzRWwuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgdmFyIHBpbGwgPSAoVi51aSAmJiB0eXBlb2YgVi51aS5jcmVkaXRzUGlsbCA9PT0gJ2Z1bmN0aW9uJykgPyBWLnVpLmNyZWRpdHNQaWxsKG4gPT0gbnVsbCA/IDAgOiBuKSA6IG51bGw7CiAgICAgICAgaWYgKHBpbGwpIGNyZWRpdHNFbC5hcHBlbmRDaGlsZChwaWxsKTsKICAgICAgICBlbHNlIGNyZWRpdHNFbC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LW1vbm8nLCB0ZXh0OiAobiA9PSBudWxsID8gJ+KAlCcgOiBuKSArICcgQ3JlZGl0cycgfSkpOwogICAgICB9CiAgICAgIHBhaW50Q3JlZGl0cyhjcmVkaXRzVmFsdWUoKSk7CgogICAgICB2YXIgcHJvZmlsZU1ldGEgPSBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcycHgnLCBtaW5XaWR0aDogJzAnIH0gfSwKICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBmb250V2VpZ2h0OiAnNzAwJywgZm9udFNpemU6ICd2YXIoLS1mb250LXRpdGxlMywgMjBweCknIH0sIHRleHQ6IGlkZW50Lm5hbWUgfHwgaWRlbnQudXNlcm5hbWUgfHwgJ1ZhbXAgQ3JlYXRvcicgfSkpOwogICAgICBpZiAoaWRlbnQuZW1haWwpIHByb2ZpbGVNZXRhLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTRweCcgfSwgdGV4dDogaWRlbnQuZW1haWwgfSkpOwogICAgICBpZiAoaWRlbnQudXNlcm5hbWUpIHByb2ZpbGVNZXRhLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcgfSwgdGV4dDogJ0AnICsgaWRlbnQudXNlcm5hbWUgfSkpOwogICAgICBpZiAoaWRlbnQuYWRtaW4pIHByb2ZpbGVNZXRhLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgewogICAgICAgIGNsYXNzOiAndi1tb25vJywKICAgICAgICBzdHlsZTogeyBtYXJnaW5Ub3A6ICc0cHgnLCBmb250U2l6ZTogJzExcHgnLCBjb2xvcjogJ3ZhcigtLXZhbXAtYWNjZW50LCAjNTI5N0Y4KScsIHRleHRUcmFuc2Zvcm06ICd1cHBlcmNhc2UnLCBsZXR0ZXJTcGFjaW5nOiAnMC4xMmVtJyB9LAogICAgICAgIHRleHQ6ICdBZG1pbicKICAgICAgfSkpOwoKICAgICAgdmFyIHByb2ZpbGVSaWdodCA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJ3ZhcigtLXNwYWNlLXNtLCA5cHgpJywgYWxpZ25JdGVtczogJ2ZsZXgtZW5kJywgZmxleDogJzAgMCBhdXRvJyB9IH0sCiAgICAgICAgY3JlZGl0c0VsLAogICAgICAgIGN0YUJ1dHRvbignQWRkIENyZWRpdHMnLCB7IHByaW1hcnk6IHRydWUsIHNtYWxsOiB0cnVlLCBpY29uOiAncGx1cycsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvcGF5d2FsbCcpOyB9IH0pKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoZWwoJ3NlY3Rpb24nLCB7IGNsYXNzOiAnZ2xhc3MtY2FyZCcsIHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGZsZXhXcmFwOiAnd3JhcCcgfSB9LAogICAgICAgIGF2YXRhck5vZGUoaWRlbnQsIDY0KSwKICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBmbGV4OiAnMSAxIDIwMHB4JywgbWluV2lkdGg6ICcwJyB9IH0sIHByb2ZpbGVNZXRhKSwKICAgICAgICBwcm9maWxlUmlnaHQpKTsKCiAgICAgIHJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgeyBpZiAobiAhPSBudWxsKSBwYWludENyZWRpdHMobik7IH0pOwogICAgICB2YXIgY3JlZGl0Q2IgPSBmdW5jdGlvbiAobikgeyBwYWludENyZWRpdHMobik7IH07CiAgICAgIHRyeSB7IGlmIChWLnN0b3JlICYmIFYuc3RvcmUub24pIHsgVi5zdG9yZS5vbignY3JlZGl0czpjaGFuZ2VkJywgY3JlZGl0Q2IpOyB1bnN1Yi5wdXNoKGZ1bmN0aW9uICgpIHsgVi5zdG9yZS5vZmYgJiYgVi5zdG9yZS5vZmYoJ2NyZWRpdHM6Y2hhbmdlZCcsIGNyZWRpdENiKTsgfSk7IH0gfSBjYXRjaCAoZSkge30KCiAgICAgIHZhciBtb2RlbHMgPSAoKFYuZGF0YSAmJiBWLmRhdGEubW9kZWxzKSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtICYmIG0ucmF3ICE9PSAndW5saW1pdGVkJzsgfSk7CiAgICAgIHZhciBtb2RlbE9wdHMgPSBtb2RlbHMubWFwKGZ1bmN0aW9uIChtKSB7CiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG0ucmF3LCBsYWJlbDogKG0ubGFiZWwgfHwgbS5yYXcpICsgKG0uc3ViaGVhZGluZyA/ICcg4oCUICcgKyBtLnN1YmhlYWRpbmcgOiAnJykgKyAobS5jb3N0ICE9IG51bGwgPyAnICgnICsgbS5jb3N0ICsgJyBjciknIDogJycpIH07CiAgICAgIH0pOwogICAgICB2YXIgYXNwZWN0cyA9IChWLmRhdGEgJiYgVi5kYXRhLmFzcGVjdHMpIHx8IFtdOwogICAgICB2YXIgYXNwZWN0T3B0cyA9IGFzcGVjdHMubWFwKGZ1bmN0aW9uIChhKSB7IHJldHVybiB7IHZhbHVlOiBhLnJhdywgbGFiZWw6IGEubGFiZWwgfHwgYS5yYXcgfTsgfSk7CgogICAgICB2YXIgcyA9IHNldHRpbmdzKCk7CiAgICAgIHZhciBkZWZNb2RlbCA9IHMuZGVmYXVsdE1vZGVsIHx8IChtb2RlbHNbMF0gJiYgbW9kZWxzWzBdLnJhdykgfHwgJyc7CiAgICAgIHZhciBkZWZBc3BlY3QgPSBzLmRlZmF1bHRBc3BlY3QgfHwgKGFzcGVjdHNbMF0gJiYgYXNwZWN0c1swXS5yYXcpIHx8ICdhdXRvJzsKCiAgICAgIHZhciBkZWZhdWx0c0JvZHkgPSBbXTsKICAgICAgaWYgKG1vZGVsT3B0cy5sZW5ndGgpIHsKICAgICAgICBkZWZhdWx0c0JvZHkucHVzaChzZXR0aW5nUm93KCdEZWZhdWx0IG1vZGVsJywKICAgICAgICAgIHNlbGVjdENvbnRyb2wobW9kZWxPcHRzLCBkZWZNb2RlbCwgZnVuY3Rpb24gKHYpIHsgc2V0dGluZ0NoYW5nZSgnZGVmYXVsdE1vZGVsJywgdik7IHRvYXN0KCdEZWZhdWx0IG1vZGVsIHNhdmVkJywgJ3N1Y2Nlc3MnKTsgfSwgJ0RlZmF1bHQgbW9kZWwnKSwKICAgICAgICAgICdUaGUgc3RhcnRpbmcgbW9kZWwgZm9yIG5ldyBnZW5lcmF0aW9ucy4nKSk7CiAgICAgIH0KICAgICAgaWYgKGFzcGVjdE9wdHMubGVuZ3RoKSB7CiAgICAgICAgZGVmYXVsdHNCb2R5LnB1c2goc2V0dGluZ1JvdygnRGVmYXVsdCBhc3BlY3QgcmF0aW8nLAogICAgICAgICAgc2VsZWN0Q29udHJvbChhc3BlY3RPcHRzLCBkZWZBc3BlY3QsIGZ1bmN0aW9uICh2KSB7IHNldHRpbmdDaGFuZ2UoJ2RlZmF1bHRBc3BlY3QnLCB2KTsgdG9hc3QoJ0RlZmF1bHQgYXNwZWN0IHNhdmVkJywgJ3N1Y2Nlc3MnKTsgfSwgJ0RlZmF1bHQgYXNwZWN0IHJhdGlvJyksCiAgICAgICAgICAnQXBwbGllcyB0byB0ZXh0LXRvLWltYWdlIGdlbmVyYXRpb25zLicpKTsKICAgICAgfQogICAgICBpZiAoZGVmYXVsdHNCb2R5Lmxlbmd0aCkgdmlldy5hcHBlbmRDaGlsZChzZWN0aW9uKCdHZW5lcmF0aW9uIGRlZmF1bHRzJywgJ1BpY2sgdGhlIG1vZGVsIGFuZCBhc3BlY3QgeW91IHN0YXJ0IHdpdGguJywgZGVmYXVsdHNCb2R5KSk7CgogICAgICB2YXIgc2VsSW5kdXN0cmllcyA9IHNnZXQoJ2luZHVzdHJpZXMnLCBzLmluZHVzdHJpZXMgfHwgW10pIHx8IFtdOwogICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2VsSW5kdXN0cmllcykpIHNlbEluZHVzdHJpZXMgPSBbXTsKICAgICAgdmlldy5hcHBlbmRDaGlsZChzZWN0aW9uKCdJbmR1c3RyaWVzJywKICAgICAgICAnVGFpbG9ycyBwcmVzZXQgY2hpcHMgYW5kIHBsYWNlaG9sZGVycyB0byB3aGF0IHlvdSBjcmVhdGUuJywKICAgICAgICBbaW5kdXN0cnlDbG91ZChzZWxJbmR1c3RyaWVzLCBmdW5jdGlvbiAoa2V5cykgewogICAgICAgICAgc2V0dGluZ0NoYW5nZSgnaW5kdXN0cmllcycsIGtleXMpOwogICAgICAgICAgc3NldCgnaW5kdXN0cmllcycsIGtleXMpOwogICAgICAgIH0pXSkpOwoKICAgICAgdmFyIHdhdGVybWFyayA9IGxzR2V0KCd3YXRlcm1hcmtFbmFibGVkJywgdHJ1ZSk7CiAgICAgIHZhciBhdXRvU2F2ZSA9IGxzR2V0KCdhdXRvU2F2ZU9uQ29tcGxldGUnLCBmYWxzZSk7CiAgICAgIHZhciBjaGltZSA9IGxzR2V0KCdjaGltZU9uQ29tcGxldGUnLCBmYWxzZSk7CiAgICAgIHZhciB0YWdsaW5lID0gbHNHZXQoJ2JyYW5kVGFnbGluZScsICcnKTsKICAgICAgdmFyIHNoYXJlVHBsID0gbHNHZXQoJ3NoYXJlVGVtcGxhdGUnLCAnTWFkZSB3aXRoIEBWb29zZXlBSSBWYW1wLiBUcnkgaXQ6IHt7dXJsfX0nKTsKCiAgICAgIHZhciB0YWdsaW5lRmllbGQgPSBlbCgnaW5wdXQnLCB7CiAgICAgICAgdHlwZTogJ3RleHQnLCBjbGFzczogJ3YtZmllbGQnLCB2YWx1ZTogdGFnbGluZSwKICAgICAgICBwbGFjZWhvbGRlcjogJ2UuZy4gQ3JhZnRlZCBieSB5b3VyIHN0dWRpbycsIG1heGxlbmd0aDogMTIwLCAnYXJpYS1sYWJlbCc6ICdCcmFuZCB0YWdsaW5lJwogICAgICB9KTsKICAgICAgdGFnbGluZUZpZWxkLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsgbHNTZXQoJ2JyYW5kVGFnbGluZScsIHRhZ2xpbmVGaWVsZC52YWx1ZS50cmltKCkpOyB0b2FzdCgnVGFnbGluZSBzYXZlZCcsICdzdWNjZXNzJyk7IH0pOwoKICAgICAgdmFyIHNoYXJlRmllbGQgPSBlbCgndGV4dGFyZWEnLCB7CiAgICAgICAgY2xhc3M6ICd2LXRleHRhcmVhJywgcm93czogMiwgJ2FyaWEtbGFiZWwnOiAnU2hhcmUgdGVtcGxhdGUnLAogICAgICAgIHBsYWNlaG9sZGVyOiAnVG9rZW5zOiB7e3VybH19IHt7cHJvbXB0fX0ge3thZGRyZXNzfX0nCiAgICAgIH0pOwogICAgICBzaGFyZUZpZWxkLnZhbHVlID0gc2hhcmVUcGw7CiAgICAgIHNoYXJlRmllbGQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciB2YWwgPSBzaGFyZUZpZWxkLnZhbHVlLnRyaW0oKTsKICAgICAgICBpZiAoIS97e1xzKnVybFxzKn19Ly50ZXN0KHZhbCkpIHZhbCA9ICh2YWwgPyB2YWwgKyAnICcgOiAnJykgKyAne3t1cmx9fSc7CiAgICAgICAgc2hhcmVGaWVsZC52YWx1ZSA9IHZhbDsKICAgICAgICBsc1NldCgnc2hhcmVUZW1wbGF0ZScsIHZhbCk7CiAgICAgICAgdG9hc3QoJ1NoYXJlIHRlbXBsYXRlIHNhdmVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSk7CgogICAgICB2YXIgYnJhbmRTdGFjayA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzZweCcgfSB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1sYWJlbCcsIHRleHQ6ICdTaGFyZSB0YWdsaW5lJyB9KSwKICAgICAgICB0YWdsaW5lRmllbGQsCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW11dGVkJywgc3R5bGU6IHsgZm9udFNpemU6ICcxM3B4JyB9LCB0ZXh0OiAnQXBwZW5kZWQgdG8geW91ciBzaGFyZSB0ZXh0LicgfSkpOwogICAgICB2YXIgc2hhcmVTdGFjayA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzZweCcgfSB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1sYWJlbCcsIHRleHQ6ICdTaGFyZSB0ZW1wbGF0ZScgfSksCiAgICAgICAgc2hhcmVGaWVsZCwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEzcHgnIH0sIHRleHQ6ICdTdXBwb3J0cyB7e3VybH19LCB7e3Byb21wdH19LCB7e2FkZHJlc3N9fS4nIH0pKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoc2VjdGlvbignQnJhbmRpbmcgJiBvdXRwdXQnLCAnSG93IHlvdXIgc2hhcmVkIGltYWdlcyBhbmQgZG93bmxvYWRzIGFyZSBwcmVzZW50ZWQuJywgWwogICAgICAgIHNldHRpbmdSb3coJ1dhdGVybWFyayBleHBvcnRzJywgdG9nZ2xlKHdhdGVybWFyaywgZnVuY3Rpb24gKHYpIHsgbHNTZXQoJ3dhdGVybWFya0VuYWJsZWQnLCB2KTsgfSwgJ1dhdGVybWFyayBleHBvcnRzJyksCiAgICAgICAgICAnQWRkIGEgc3VidGxlIFZhbXAgbWFyayB0byBiZWZvcmUvYWZ0ZXIgc2hhcmVzLicpLAogICAgICAgIHNldHRpbmdSb3coJ0F1dG8tZG93bmxvYWQgb24gY29tcGxldGUnLCB0b2dnbGUoYXV0b1NhdmUsIGZ1bmN0aW9uICh2KSB7IGxzU2V0KCdhdXRvU2F2ZU9uQ29tcGxldGUnLCB2KTsgfSwgJ0F1dG8gZG93bmxvYWQnKSwKICAgICAgICAgICdTYXZlIGVhY2ggcmVzdWx0IGF1dG9tYXRpY2FsbHkgd2hlbiBpdCBmaW5pc2hlcy4nKSwKICAgICAgICBzZXR0aW5nUm93KCdQbGF5IGNoaW1lIG9uIGNvbXBsZXRlJywgdG9nZ2xlKGNoaW1lLCBmdW5jdGlvbiAodikgeyBsc1NldCgnY2hpbWVPbkNvbXBsZXRlJywgdik7IH0sICdDb21wbGV0aW9uIGNoaW1lJyksCiAgICAgICAgICAnQSBzb2Z0IHNvdW5kIHdoZW4gYSBnZW5lcmF0aW9uIGxhbmRzLicpLAogICAgICAgIGJyYW5kU3RhY2ssCiAgICAgICAgc2hhcmVTdGFjawogICAgICBdKSk7CgogICAgICB2YXIgbm90aWZ5Q29tcGxldGUgPSBsc0dldCgnbm90aWZ5T25Db21wbGV0ZScsIHRydWUpOwogICAgICB2YXIgbm90aWZ5Q3JlZGl0cyA9IGxzR2V0KCdub3RpZnlMb3dDcmVkaXRzJywgdHJ1ZSk7CiAgICAgIHZhciBub3RpZnlEaWdlc3QgPSBsc0dldCgnbm90aWZ5V2Vla2x5RGlnZXN0JywgZmFsc2UpOwogICAgICB2YXIgbGl2ZUFjdGl2aXRpZXMgPSBsc0dldCgnbGl2ZUFjdGl2aXRpZXMnLCB0cnVlKTsKCiAgICAgIHZhciBwZXJtUm93ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWFjYy1yb3cgdi1hY2Mtcm93LS1ub3RpY2UnIH0sCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWFjYy1yb3dfX21haW4nIH0sCiAgICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbGFiZWwnLCB0ZXh0OiAnQnJvd3NlciBub3RpZmljYXRpb25zJyB9KSwKICAgICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcgfSwgdGV4dDogbm90aWZ5UGVybWlzc2lvbkxhYmVsKCkgfSkpLAogICAgICAgIG5vdGlmeVBlcm1pc3Npb25Db250cm9sKCkpOwogICAgICB2aWV3LmFwcGVuZENoaWxkKHNlY3Rpb24oJ05vdGlmaWNhdGlvbnMnLCAnQ2hvb3NlIHdoYXQgVmFtcCBwaW5ncyB5b3UgYWJvdXQuJywgWwogICAgICAgIHBlcm1Sb3csCiAgICAgICAgc2V0dGluZ1JvdygnR2VuZXJhdGlvbiBjb21wbGV0ZScsIHRvZ2dsZShub3RpZnlDb21wbGV0ZSwgZnVuY3Rpb24gKHYpIHsgbHNTZXQoJ25vdGlmeU9uQ29tcGxldGUnLCB2KTsgbWF5YmVSZXF1ZXN0Tm90aWZ5UGVybWlzc2lvbih2KTsgfSwgJ05vdGlmeSBvbiBjb21wbGV0ZScpLAogICAgICAgICAgJ0FsZXJ0IG1lIHRoZSBtb21lbnQgYSByZW5kZXIgbGFuZHMuJyksCiAgICAgICAgc2V0dGluZ1JvdygnTG93IGNyZWRpdCB3YXJuaW5ncycsIHRvZ2dsZShub3RpZnlDcmVkaXRzLCBmdW5jdGlvbiAodikgeyBsc1NldCgnbm90aWZ5TG93Q3JlZGl0cycsIHYpOyB9LCAnTG93IGNyZWRpdCB3YXJuaW5ncycpLAogICAgICAgICAgJ0hlYWRzLXVwIGJlZm9yZSB5b3UgcnVuIG91dCBvZiBjcmVkaXRzLicpLAogICAgICAgIHNldHRpbmdSb3coJ0xpdmUgcHJvZ3Jlc3MgYWN0aXZpdHknLCB0b2dnbGUobGl2ZUFjdGl2aXRpZXMsIGZ1bmN0aW9uICh2KSB7IGxzU2V0KCdsaXZlQWN0aXZpdGllcycsIHYpOyB9LCAnTGl2ZSBhY3Rpdml0aWVzJyksCiAgICAgICAgICAnU2hvdyBhIGxpdmUgcHJvZ3Jlc3MgaW5kaWNhdG9yIHdoaWxlIGdlbmVyYXRpbmcuJyksCiAgICAgICAgc2V0dGluZ1JvdygnV2Vla2x5IGRpZ2VzdCcsIHRvZ2dsZShub3RpZnlEaWdlc3QsIGZ1bmN0aW9uICh2KSB7IGxzU2V0KCdub3RpZnlXZWVrbHlEaWdlc3QnLCB2KTsgfSwgJ1dlZWtseSBkaWdlc3QnKSwKICAgICAgICAgICdBIHdlZWtseSByZWNhcCBvZiB3aGF0IHlvdSBjcmVhdGVkLicpCiAgICAgIF0pKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoc2VjdGlvbignU3Vic2NyaXB0aW9uICYgYmlsbGluZycsICdNYW5hZ2UgY3JlZGl0cywgcGxhbnMgYW5kIHBheW1lbnQuJywgWwogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jdGEtcm93JyB9LAogICAgICAgICAgY3RhQnV0dG9uKCdCdXkgY3JlZGl0cycsIHsgcHJpbWFyeTogdHJ1ZSwgaWNvbjogJ3NwYXJrbGVzJywgb25DbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9wYXl3YWxsJyk7IH0gfSksCiAgICAgICAgICBjdGFCdXR0b24oJ01hbmFnZSBzdWJzY3JpcHRpb24nLCB7IGdob3N0OiB0cnVlLCBvbkNsaWNrOiBtYW5hZ2VTdWJzY3JpcHRpb24gfSkpLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEzcHgnIH0sIHRleHQ6ICdQdXJjaGFzZXMgYXJlIGhhbmRsZWQgc2VjdXJlbHkgdmlhIFN0cmlwZS4nIH0pCiAgICAgIF0pKTsKCiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoc2VjdGlvbignR3JvdyB3aXRoIFZhbXAnLCAnRWFybiBjcmVkaXRzIGJ5IHNoYXJpbmcgYW5kIHBvc3RpbmcuJywgWwogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jdGEtcm93JyB9LAogICAgICAgICAgY3RhQnV0dG9uKCdSZWZlcnJhbCBkYXNoYm9hcmQnLCB7IGdob3N0OiB0cnVlLCBpY29uOiAnZ2lmdCcsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvcmVmZXJyYWwnKTsgfSB9KSwKICAgICAgICAgIGN0YUJ1dHRvbignRGFpbHkgY2hhbGxlbmdlJywgeyBnaG9zdDogdHJ1ZSwgaWNvbjogJ2ZsYW1lJywgb25DbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9jaGFsbGVuZ2UnKTsgfSB9KSkKICAgICAgXSkpOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChzZWN0aW9uKCdIZWxwICYgc3VwcG9ydCcsICdGQVEsIHByaXZhY3kgYW5kIHRlcm1zLicsIFsKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtY3RhLXJvdycgfSwKICAgICAgICAgIGxpbmtCdXR0b24oJ0hlbHAgY2VudGVyJywgJ2h0dHBzOi8vdm9vc2V5LmNvbS9oZWxwJywgJ2hlbHAnKSwKICAgICAgICAgIGxpbmtCdXR0b24oJ1ByaXZhY3knLCAnaHR0cHM6Ly92b29zZXkuY29tL3ByaXZhY3knKSwKICAgICAgICAgIGxpbmtCdXR0b24oJ1Rlcm1zJywgJ2h0dHBzOi8vdm9vc2V5LmNvbS90ZXJtcycpKQogICAgICBdKSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKHNlY3Rpb24oJ0RhdGEgJiByZXNldCcsICdFeHBvcnQgeW91ciBkYXRhLCBjbGVhciBjYWNoZSBvciByZXBsYXkgb25ib2FyZGluZy4nLCBbCiAgICAgICAgc2V0dGluZ1JvdygnRXhwb3J0IG15IGRhdGEnLAogICAgICAgICAgY3RhQnV0dG9uKCdFeHBvcnQnLCB7IGdob3N0OiB0cnVlLCBzbWFsbDogdHJ1ZSwgaWNvbjogJ2Rvd25sb2FkJywgb25DbGljazogZXhwb3J0TXlEYXRhIH0pLAogICAgICAgICAgJ0Rvd25sb2FkIHlvdXIgcHJlZmVyZW5jZXMgYW5kIGxpYnJhcnkgYXMgYSBKU09OIGZpbGUuJyksCiAgICAgICAgc2V0dGluZ1JvdygnQ2xlYXIgbG9jYWwgY2FjaGUnLAogICAgICAgICAgY3RhQnV0dG9uKCdDbGVhciBjYWNoZScsIHsgZ2hvc3Q6IHRydWUsIHNtYWxsOiB0cnVlLCBpY29uOiAndHJhc2gnLCBvbkNsaWNrOiBjbGVhckxvY2FsQ2FjaGUgfSksCiAgICAgICAgICAnRnJlZXMgc3BhY2UgdXNlZCBieSBjYWNoZWQgaW1hZ2VzIGFuZCBzdG9yZWQgcHJlZnMuJyksCiAgICAgICAgc2V0dGluZ1JvdygnUmVwbGF5IG9uYm9hcmRpbmcnLCBjdGFCdXR0b24oJ1Jlc2V0IG9uYm9hcmRpbmcnLCB7IGdob3N0OiB0cnVlLCBzbWFsbDogdHJ1ZSwgb25DbGljazogcmVzZXRPbmJvYXJkaW5nIH0pLAogICAgICAgICAgJ0NsZWFycyBpbmR1c3RyaWVzIGFuZCBzaG93cyB0aGUgZmlyc3QtcnVuIGZsb3cgYWdhaW4uJykKICAgICAgXSkpOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChzZWN0aW9uKCdBY2NvdW50JywgJ1VwZGF0ZSB5b3VyIGRldGFpbHMgb3Igc2lnbiBvdXQuJywgWwogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jdGEtcm93JyB9LAogICAgICAgICAgY3RhQnV0dG9uKCdVcGRhdGUgYWNjb3VudCcsIHsgZ2hvc3Q6IHRydWUsIGljb246ICdwZW5jaWwnLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IG9wZW5VcGRhdGVBY2NvdW50KGlkZW50KTsgfSB9KSwKICAgICAgICAgIGN0YUJ1dHRvbignTG9nIG91dCcsIHsgZ2hvc3Q6IHRydWUsIGljb246ICdsb2dvdXQnLCBvbkNsaWNrOiBsb2dvdXQgfSkpLAogICAgICAgIGVsKCdocicsIHsgY2xhc3M6ICd2LWhyJyB9KSwKICAgICAgICBzZXR0aW5nUm93KCdEZWxldGUgYWNjb3VudCcsCiAgICAgICAgICBjdGFCdXR0b24oJ0RlbGV0ZScsIHsgZGFuZ2VyOiB0cnVlLCBzbWFsbDogdHJ1ZSwgb25DbGljazogZGVsZXRlQWNjb3VudCB9KSwKICAgICAgICAgICdQZXJtYW5lbnRseSByZW1vdmVzIHlvdXIgYWNjb3VudCBhbmQgYWxsIGRhdGEuJykKICAgICAgXSkpOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChlbCgnZm9vdGVyJywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBmbGV4V3JhcDogJ3dyYXAnLCBnYXA6ICd2YXIoLS1zcGFjZS1zbSwgOXB4KScsIHBhZGRpbmdUb3A6ICd2YXIoLS1zcGFjZS1tZCwgMTVweCknIH0gfSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LW1vbm8nLCBzdHlsZTogeyBmb250U2l6ZTogJzEycHgnLCBjb2xvcjogJ3ZhcigtLXYtaW5rLXNvZnQsIHJnYmEoMjQ1LDI0NSwyNDcsLjY2KSknIH0sIHRleHQ6ICdWYW1wIGJ5IFZvb3NleScgfSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tb25vJywgc3R5bGU6IHsgZm9udFNpemU6ICcxMnB4JywgY29sb3I6ICd2YXIoLS12LWluay1zb2Z0LCByZ2JhKDI0NSwyNDUsMjQ3LC42NikpJyB9LCB0ZXh0OiAnSGF2ZSB0aGUgTWVhbnMuJyB9KSkpOwoKICAgICAgcm9vdC5hcHBlbmRDaGlsZCh2aWV3KTsKICAgIH0KCiAgICBmdW5jdGlvbiBtYW5hZ2VTdWJzY3JpcHRpb24oKSB7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKFYucGF5ICYmIHR5cGVvZiBWLnBheS5vcGVuUG9ydGFsID09PSAnZnVuY3Rpb24nKSB7IFYucGF5Lm9wZW5Qb3J0YWwoKTsgcmV0dXJuOyB9CiAgICAgICAgaWYgKFYuYXBpICYmIHR5cGVvZiBWLmFwaS5iaWxsaW5nUG9ydGFsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICB0b2FzdCgnT3BlbmluZyBiaWxsaW5nIHBvcnRhbOKApicsICdpbmZvJyk7CiAgICAgICAgICBWLmFwaS5iaWxsaW5nUG9ydGFsKCkudGhlbihmdW5jdGlvbiAocikgewogICAgICAgICAgICBpZiAociAmJiByLnVybCkgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByLnVybDsKICAgICAgICAgICAgZWxzZSBmYWxsYmFja0NvbnRhY3QoKTsKICAgICAgICAgIH0pLmNhdGNoKGZhbGxiYWNrQ29udGFjdCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7fQogICAgICBmYWxsYmFja0NvbnRhY3QoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZhbGxiYWNrQ29udGFjdCgpIHsKICAgICAgdG9hc3QoJ1RvIG1hbmFnZSB5b3VyIHN1YnNjcmlwdGlvbiwgY29udGFjdCBzdXBwb3J0QHZvb3NleS5jb20nLCAnaW5mbycpOwogICAgICB3aW5kb3cub3BlbignbWFpbHRvOnN1cHBvcnRAdm9vc2V5LmNvbT9zdWJqZWN0PVZhbXAlMjBTdWJzY3JpcHRpb24nLCAnX2JsYW5rJyk7CiAgICB9CgogICAgZnVuY3Rpb24gbm90aWZ5UGVybWlzc2lvbigpIHsKICAgICAgdHJ5IHsgcmV0dXJuICh0eXBlb2YgTm90aWZpY2F0aW9uICE9PSAndW5kZWZpbmVkJykgPyBOb3RpZmljYXRpb24ucGVybWlzc2lvbiA6ICd1bnN1cHBvcnRlZCc7IH0KICAgICAgY2F0Y2ggKGUpIHsgcmV0dXJuICd1bnN1cHBvcnRlZCc7IH0KICAgIH0KICAgIGZ1bmN0aW9uIG5vdGlmeVBlcm1pc3Npb25MYWJlbCgpIHsKICAgICAgdmFyIHAgPSBub3RpZnlQZXJtaXNzaW9uKCk7CiAgICAgIGlmIChwID09PSAnZ3JhbnRlZCcpIHJldHVybiAnQWxsb3dlZCBpbiB0aGlzIGJyb3dzZXIuJzsKICAgICAgaWYgKHAgPT09ICdkZW5pZWQnKSByZXR1cm4gJ0Jsb2NrZWQg4oCUIGVuYWJsZSBpbiBicm93c2VyIHNldHRpbmdzLic7CiAgICAgIGlmIChwID09PSAndW5zdXBwb3J0ZWQnKSByZXR1cm4gJ05vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyLic7CiAgICAgIHJldHVybiAnVGFwIHRvIGFsbG93IGFsZXJ0cyBpbiB0aGlzIGJyb3dzZXIuJzsKICAgIH0KICAgIGZ1bmN0aW9uIG5vdGlmeVBlcm1pc3Npb25Db250cm9sKCkgewogICAgICB2YXIgcCA9IG5vdGlmeVBlcm1pc3Npb24oKTsKICAgICAgaWYgKHAgPT09ICdncmFudGVkJykgewogICAgICAgIHJldHVybiBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWFjYy1waWxsIHYtYWNjLXBpbGwtLW9uJyB9LCBpY29uKCdjaGVja21hcmsnKSwgZWwoJ3NwYW4nLCB7IHRleHQ6ICdBbGxvd2VkJyB9KSk7CiAgICAgIH0KICAgICAgaWYgKHAgPT09ICd1bnN1cHBvcnRlZCcgfHwgcCA9PT0gJ2RlbmllZCcpIHsKICAgICAgICByZXR1cm4gZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1hY2MtcGlsbCcgfSwgZWwoJ3NwYW4nLCB7IHRleHQ6IHAgPT09ICdkZW5pZWQnID8gJ0Jsb2NrZWQnIDogJ1VuYXZhaWxhYmxlJyB9KSk7CiAgICAgIH0KICAgICAgdmFyIGJ0biA9IGN0YUJ1dHRvbignQWxsb3cnLCB7IGdob3N0OiB0cnVlLCBzbWFsbDogdHJ1ZSB9KTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyByZXF1ZXN0Tm90aWZ5UGVybWlzc2lvbihidG4pOyB9KTsKICAgICAgcmV0dXJuIGJ0bjsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcXVlc3ROb3RpZnlQZXJtaXNzaW9uKGJ0bikgewogICAgICBpZiAobm90aWZ5UGVybWlzc2lvbigpID09PSAndW5zdXBwb3J0ZWQnKSB7IHRvYXN0KCdOb3RpZmljYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGhlcmUuJywgJ2luZm8nKTsgcmV0dXJuOyB9CiAgICAgIHRyeSB7CiAgICAgICAgTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKCkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICBpZiAocmVzID09PSAnZ3JhbnRlZCcpIHsgdG9hc3QoJ05vdGlmaWNhdGlvbnMgYWxsb3dlZCcsICdzdWNjZXNzJyk7IH0KICAgICAgICAgIGVsc2UgaWYgKHJlcyA9PT0gJ2RlbmllZCcpIHsgdG9hc3QoJ05vdGlmaWNhdGlvbnMgYmxvY2tlZCcsICdpbmZvJyk7IH0KICAgICAgICAgIGlmIChidG4gJiYgYnRuLnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgdmFyIGZyZXNoID0gbm90aWZ5UGVybWlzc2lvbkNvbnRyb2woKTsKICAgICAgICAgICAgYnRuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGZyZXNoLCBidG4pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGNhdGNoIChlKSB7fQogICAgfQogICAgZnVuY3Rpb24gbWF5YmVSZXF1ZXN0Tm90aWZ5UGVybWlzc2lvbihlbmFibGVkKSB7CiAgICAgIGlmIChlbmFibGVkICYmIG5vdGlmeVBlcm1pc3Npb24oKSA9PT0gJ2RlZmF1bHQnKSByZXF1ZXN0Tm90aWZ5UGVybWlzc2lvbihudWxsKTsKICAgIH0KCiAgICBmdW5jdGlvbiBleHBvcnRNeURhdGEoKSB7CiAgICAgIHZhciBpZGVudCA9IHVzZXJJZGVudGl0eSgpOwogICAgICB2YXIgYnVuZGxlID0gewogICAgICAgIGV4cG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICBwcm9maWxlOiB7IG5hbWU6IGlkZW50Lm5hbWUsIHVzZXJuYW1lOiBpZGVudC51c2VybmFtZSwgZW1haWw6IGlkZW50LmVtYWlsLCBhZG1pbjogaWRlbnQuYWRtaW4gfSwKICAgICAgICBzZXR0aW5nczogc2V0dGluZ3MoKSwKICAgICAgICBwcmVmZXJlbmNlczogY29sbGVjdFByZWZlcmVuY2VzKCkKICAgICAgfTsKICAgICAgdG9hc3QoJ1ByZXBhcmluZyB5b3VyIGV4cG9ydOKApicsICdpbmZvJyk7CiAgICAgIHZhciBmaW5pc2ggPSBmdW5jdGlvbiAobGlicmFyeSkgewogICAgICAgIGlmIChsaWJyYXJ5KSBidW5kbGUubGlicmFyeSA9IGxpYnJhcnk7CiAgICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoYnVuZGxlLCBudWxsLCAyKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pOwogICAgICAgIHZhciB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgICAgIHZhciBhID0gZWwoJ2EnLCB7IGhyZWY6IHVybCwgZG93bmxvYWQ6ICd2YW1wLWRhdGEtJyArIERhdGUubm93KCkgKyAnLmpzb24nIH0pOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7CiAgICAgICAgYS5jbGljaygpOwogICAgICAgIGEucmVtb3ZlKCk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHRyeSB7IFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsgfSBjYXRjaCAoZSkge30gfSwgNDAwMCk7CiAgICAgICAgdG9hc3QoJ0V4cG9ydCBkb3dubG9hZGVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgfTsKICAgICAgaWYgKFYuYXBpICYmIHR5cGVvZiBWLmFwaS5saWJyYXJ5ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgVi5hcGkubGlicmFyeSgxLCAyMDApLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgdmFyIGl0ZW1zID0gKHJlcyAmJiAocmVzLml0ZW1zIHx8IHJlcy5pbWFnZXMgfHwgcmVzKSkgfHwgW107CiAgICAgICAgICBmaW5pc2goQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtdKTsKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IGZpbmlzaChudWxsKTsgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmluaXNoKG51bGwpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY29sbGVjdFByZWZlcmVuY2VzKCkgewogICAgICB2YXIga2V5cyA9IFsnd2F0ZXJtYXJrRW5hYmxlZCcsICdhdXRvU2F2ZU9uQ29tcGxldGUnLCAnY2hpbWVPbkNvbXBsZXRlJywgJ2JyYW5kVGFnbGluZScsICdzaGFyZVRlbXBsYXRlJywKICAgICAgICAnbm90aWZ5T25Db21wbGV0ZScsICdub3RpZnlMb3dDcmVkaXRzJywgJ25vdGlmeVdlZWtseURpZ2VzdCcsICdsaXZlQWN0aXZpdGllcycsICdjaGFsbGVuZ2UnXTsKICAgICAgdmFyIG91dCA9IHt9OwogICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGspIHsgb3V0W2tdID0gbHNHZXQoaywgbnVsbCk7IH0pOwogICAgICByZXR1cm4gb3V0OwogICAgfQoKICAgIGZ1bmN0aW9uIGNsZWFyTG9jYWxDYWNoZSgpIHsKICAgICAgY29uZmlybURpYWxvZygnQ2xlYXIgbG9jYWxseSBjYWNoZWQgZGF0YT8gWW91ciBhY2NvdW50IGFuZCBjcmVkaXRzIGFyZSB1bmFmZmVjdGVkLicpLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgICAgaWYgKCFvaykgcmV0dXJuOwogICAgICAgIHRyeSB7CiAgICAgICAgICB2YXIgcHJlc2VydmUgPSB7fTsKICAgICAgICAgIFsnb25ib2FyZGluZ0RvbmUnLCAncmVmZXJyYWxDb2RlJywgJ3JlZmVycmFsQXBwbGllZCddLmZvckVhY2goZnVuY3Rpb24gKGspIHsgcHJlc2VydmVba10gPSBsc0dldChrLCBudWxsKTsgfSk7CiAgICAgICAgICB2YXIgZG9vbWVkID0gW107CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdpbmRvdy5sb2NhbFN0b3JhZ2UubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGtleSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2Uua2V5KGkpOwogICAgICAgICAgICBpZiAoa2V5ICYmIGtleS5pbmRleE9mKExTX1BSRUZJWCkgPT09IDApIGRvb21lZC5wdXNoKGtleSk7CiAgICAgICAgICB9CiAgICAgICAgICBkb29tZWQuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IHRyeSB7IHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpOyB9IGNhdGNoIChlKSB7fSB9KTsKICAgICAgICAgIE9iamVjdC5rZXlzKHByZXNlcnZlKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IGlmIChwcmVzZXJ2ZVtrXSAhPSBudWxsKSBsc1NldChrLCBwcmVzZXJ2ZVtrXSk7IH0pOwogICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgdG9hc3QoJ0xvY2FsIGNhY2hlIGNsZWFyZWQnLCAnc3VjY2VzcycpOwogICAgICAgIHZhciBvdXRsZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndi1vdXRsZXQnKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudi1vdXRsZXQnKTsKICAgICAgICBpZiAob3V0bGV0KSByZW5kZXIob3V0bGV0KTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzZXRPbmJvYXJkaW5nKCkgewogICAgICBjb25maXJtRGlhbG9nKCdSZXNldCBvbmJvYXJkaW5nPyBZb3VyIHNlbGVjdGVkIGluZHVzdHJpZXMgd2lsbCBiZSBjbGVhcmVkLicpLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgICAgaWYgKCFvaykgcmV0dXJuOwogICAgICAgIHNzZXQoJ2luZHVzdHJpZXMnLCBbXSk7CiAgICAgICAgc2V0dGluZ0NoYW5nZSgnaW5kdXN0cmllcycsIFtdKTsKICAgICAgICBzc2V0KCdvbmJvYXJkaW5nRG9uZScsIGZhbHNlKTsKICAgICAgICB0cnkgeyBpZiAoVi5zdGF0ZSkgVi5zdGF0ZS5vbmJvYXJkaW5nRG9uZSA9IGZhbHNlOyB9IGNhdGNoIChlKSB7fQogICAgICAgIGxzU2V0KCdzZWVuQ3JlZGl0V2VsY29tZScsIGZhbHNlKTsKICAgICAgICB0b2FzdCgnT25ib2FyZGluZyByZXNldCcsICdzdWNjZXNzJyk7CiAgICAgICAgZ28oJyMvb25ib2FyZGluZycpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBsb2dvdXQoKSB7CiAgICAgIGNvbmZpcm1EaWFsb2coJ0xvZyBvdXQgb2YgVmFtcD8nKS50aGVuKGZ1bmN0aW9uIChvaykgewogICAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgICB0cnkgeyBpZiAoVi5hdXRoICYmIHR5cGVvZiBWLmF1dGguY2xlYXIgPT09ICdmdW5jdGlvbicpIFYuYXV0aC5jbGVhcigpOyB9IGNhdGNoIChlKSB7fQogICAgICAgIHRvYXN0KCdTaWduZWQgb3V0JywgJ2luZm8nKTsKICAgICAgICBuYXZpZ2F0ZSgnIy9hdXRoJyk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIG9wZW5VcGRhdGVBY2NvdW50KGlkZW50KSB7CiAgICAgIHZhciBuYW1lRmllbGQgPSBlbCgnaW5wdXQnLCB7IHR5cGU6ICd0ZXh0JywgY2xhc3M6ICd2LWZpZWxkJywgdmFsdWU6IGlkZW50Lm5hbWUgfHwgJycsIHBsYWNlaG9sZGVyOiAnRnVsbCBuYW1lJywgJ2FyaWEtbGFiZWwnOiAnRnVsbCBuYW1lJyB9KTsKICAgICAgdmFyIGVtYWlsRmllbGQgPSBlbCgnaW5wdXQnLCB7IHR5cGU6ICdlbWFpbCcsIGNsYXNzOiAndi1maWVsZCcsIHZhbHVlOiBpZGVudC5lbWFpbCB8fCAnJywgcGxhY2Vob2xkZXI6ICdFbWFpbCcsICdhcmlhLWxhYmVsJzogJ0VtYWlsJyB9KTsKICAgICAgdmFyIHB3RmllbGQgPSBlbCgnaW5wdXQnLCB7IHR5cGU6ICdwYXNzd29yZCcsIGNsYXNzOiAndi1maWVsZCcsIHBsYWNlaG9sZGVyOiAnTmV3IHBhc3N3b3JkIChvcHRpb25hbCknLCBhdXRvY29tcGxldGU6ICduZXctcGFzc3dvcmQnLCAnYXJpYS1sYWJlbCc6ICdOZXcgcGFzc3dvcmQnIH0pOwogICAgICB2YXIgc3RhdHVzID0gZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcsIG1pbkhlaWdodDogJzE4cHgnIH0gfSk7CiAgICAgIHZhciBzYXZlQnRuID0gY3RhQnV0dG9uKCdTYXZlIGNoYW5nZXMnLCB7IHByaW1hcnk6IHRydWUsIGJsb2NrOiB0cnVlIH0pOwoKICAgICAgdmFyIGZvcm0gPSBlbCgnZm9ybScsIHsgY2xhc3M6ICd2LXN0YWNrLW1kJyB9LAogICAgICAgIGVsKCdoMicsIHsgY2xhc3M6ICd2LW1vZGFsX190aXRsZScsIHRleHQ6ICdVcGRhdGUgYWNjb3VudCcgfSksCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWZpZWxkLWdyb3VwJyB9LCBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWxhYmVsJywgdGV4dDogJ05hbWUnIH0pLCBuYW1lRmllbGQpLAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCcgfSwgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1sYWJlbCcsIHRleHQ6ICdFbWFpbCcgfSksIGVtYWlsRmllbGQpLAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCcgfSwgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1sYWJlbCcsIHRleHQ6ICdQYXNzd29yZCcgfSksIHB3RmllbGQpLAogICAgICAgIHN0YXR1cywKICAgICAgICBzYXZlQnRuCiAgICAgICk7CgogICAgICB2YXIgaGFuZGxlID0gbnVsbDsKICAgICAgZnVuY3Rpb24gY2xvc2UoKSB7IGlmIChoYW5kbGUgJiYgaGFuZGxlLmNsb3NlKSBoYW5kbGUuY2xvc2UoKTsgfQoKICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICBpZiAoIVYuYXBpIHx8IHR5cGVvZiBWLmFwaS51cGRhdGVBY2NvdW50ICE9PSAnZnVuY3Rpb24nKSB7IHN0YXR1cy50ZXh0Q29udGVudCA9ICdVcGRhdGluZyBhY2NvdW50cyBpcyB1bmF2YWlsYWJsZS4nOyByZXR1cm47IH0KICAgICAgICB2YXIgbm0gPSBuYW1lRmllbGQudmFsdWUudHJpbSgpOwogICAgICAgIHZhciBlbSA9IGVtYWlsRmllbGQudmFsdWUudHJpbSgpOwogICAgICAgIGlmICghbm0pIHsgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWNvbG9yLWVycm9yLCAjRjczMzYzKSc7IHN0YXR1cy50ZXh0Q29udGVudCA9ICdOYW1lIGlzIHJlcXVpcmVkLic7IHJldHVybjsgfQogICAgICAgIGlmICghZW0gfHwgZW0uaW5kZXhPZignQCcpIDwgMCkgeyBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tY29sb3ItZXJyb3IsICNGNzMzNjMpJzsgc3RhdHVzLnRleHRDb250ZW50ID0gJ0EgdmFsaWQgZW1haWwgaXMgcmVxdWlyZWQuJzsgcmV0dXJuOyB9CiAgICAgICAgc2F2ZUJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyc7CiAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ1NhdmluZ+KApic7CiAgICAgICAgdmFyIHBlcnNvbmFsID0geyBuYW1lOiBubSwgZW1haWw6IGVtIH07CiAgICAgICAgdmFyIG5tMiA9IG5tLnNwbGl0KC9ccysvKTsKICAgICAgICBwZXJzb25hbC5maXJzdE5hbWUgPSBubTJbMF0gfHwgbm07CiAgICAgICAgcGVyc29uYWwubGFzdE5hbWUgPSBubTIuc2xpY2UoMSkuam9pbignICcpIHx8ICcnOwogICAgICAgIHZhciBwdXQgPSB7IHBlcnNvbmFsOiBwZXJzb25hbCB9OwogICAgICAgIHZhciBwdyA9IHB3RmllbGQudmFsdWU7CiAgICAgICAgaWYgKHB3KSBwdXQucGFzc3dvcmQgPSBwdzsKICAgICAgICBWLmFwaS51cGRhdGVBY2NvdW50KHB1dCkudGhlbihmdW5jdGlvbiAodXBkYXRlZCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKHVwZGF0ZWQgJiYgVi5zdGF0ZSkgVi5zdGF0ZS51c2VyID0gdXBkYXRlZDsKICAgICAgICAgICAgaWYgKFYuc3RvcmUpIFYuc3RvcmUuZW1pdCgnYXV0aDpjaGFuZ2VkJywgdXBkYXRlZCB8fCBjdXJyZW50VXNlcigpKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICB0b2FzdCgnQWNjb3VudCB1cGRhdGVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgICB2YXIgb3V0bGV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Ytb3V0bGV0JykgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnYtb3V0bGV0Jyk7CiAgICAgICAgICBpZiAob3V0bGV0KSByZW5kZXIob3V0bGV0KTsKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tY29sb3ItZXJyb3IsICNGNzMzNjMpJzsKICAgICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9IChlcnIgJiYgZXJyLm1lc3NhZ2UpID8gZXJyLm1lc3NhZ2UgOiAnQ291bGQgbm90IHVwZGF0ZSBhY2NvdW50Lic7CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgdmFyIHNhdmVTdWJtaXQgPSBmdW5jdGlvbiAoKSB7IGZvcm0ucmVxdWVzdFN1Ym1pdCA/IGZvcm0ucmVxdWVzdFN1Ym1pdCgpIDogZm9ybS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnc3VibWl0JywgeyBjYW5jZWxhYmxlOiB0cnVlIH0pKTsgfTsKICAgICAgc2F2ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNhdmVTdWJtaXQpOwoKICAgICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkubW9kYWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBoYW5kbGUgPSBWLnVpLm1vZGFsKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb2RhbCcgfSwgZm9ybSksIHsgb25DbG9zZTogZnVuY3Rpb24gKCkge30gfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG92ZXJsYXkgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytb3ZlcmxheS1zY3JpbScgfSwgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vZGFsIGdsYXNzLWNhcmQnIH0sIGZvcm0pKTsKICAgICAgICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsgaWYgKGUudGFyZ2V0ID09PSBvdmVybGF5KSBvdmVybGF5LnJlbW92ZSgpOyB9KTsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpOwogICAgICAgIGhhbmRsZSA9IHsgY2xvc2U6IGZ1bmN0aW9uICgpIHsgb3ZlcmxheS5yZW1vdmUoKTsgfSB9OwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGVsZXRlQWNjb3VudCgpIHsKICAgICAgY29uZmlybURpYWxvZygnRGVsZXRlIHlvdXIgYWNjb3VudCBwZXJtYW5lbnRseT8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLicpLnRoZW4oZnVuY3Rpb24gKG9rKSB7CiAgICAgICAgaWYgKCFvaykgcmV0dXJuOwogICAgICAgIGNvbmZpcm1EaWFsb2coJ0FyZSB5b3UgYWJzb2x1dGVseSBzdXJlPyBBbGwgeW91ciBpbWFnZXMgYW5kIGRhdGEgd2lsbCBiZSBlcmFzZWQuJykudGhlbihmdW5jdGlvbiAob2syKSB7CiAgICAgICAgICBpZiAoIW9rMikgcmV0dXJuOwogICAgICAgICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkuZGVsZXRlQWNjb3VudCAhPT0gJ2Z1bmN0aW9uJykgeyB0b2FzdCgnQWNjb3VudCBkZWxldGlvbiBpcyB1bmF2YWlsYWJsZS4nLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgICAgICAgICB0b2FzdCgnRGVsZXRpbmcgYWNjb3VudOKApicsICdpbmZvJyk7CiAgICAgICAgICBWLmFwaS5kZWxldGVBY2NvdW50KCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRyeSB7IGlmIChWLmF1dGggJiYgVi5hdXRoLmNsZWFyKSBWLmF1dGguY2xlYXIoKTsgfSBjYXRjaCAoZSkge30KICAgICAgICAgICAgdG9hc3QoJ0FjY291bnQgZGVsZXRlZCcsICdpbmZvJyk7CiAgICAgICAgICAgIG5hdmlnYXRlKCcjL2F1dGgnKTsKICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgdG9hc3QoKGVyciAmJiBlcnIubWVzc2FnZSkgPyBlcnIubWVzc2FnZSA6ICdDb3VsZCBub3QgZGVsZXRlIGFjY291bnQuJywgJ2Vycm9yJyk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGVhcmRvd24oKSB7CiAgICAgIHdoaWxlICh1bnN1Yi5sZW5ndGgpIHsgdHJ5IHsgdW5zdWIucG9wKCkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgfQoKICAgIHJldHVybiB7IHJlbmRlcjogcmVuZGVyLCB0ZWFyZG93bjogdGVhcmRvd24gfTsKICB9KSgpOwoKICBWLnZpZXdzLmFjY291bnQgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIHVuc3ViID0gW107CgogICAgZnVuY3Rpb24gcmVuZGVyKHJvb3QsIHBhcmFtcykgewogICAgICB0ZWFyZG93bigpOwogICAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWF1dGhHdWFyZChyb290KSkgcmV0dXJuOwoKICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMucHVyY2hhc2UgPT09ICdzdWNjZXNzJykgewogICAgICAgIHRvYXN0KCdQdXJjaGFzZSBjb21wbGV0ZSDigJQgY3JlZGl0cyBhZGRlZCEnLCAnc3VjY2VzcycpOwogICAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmNvbmZldHRpID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IFYudWkuY29uZmV0dGkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgICB9CgogICAgICB2YXIgdmlldyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1tZCB2LXZpZXctLWFjY291bnQnIH0pOwoKICAgICAgdmFyIGNyZWRpdHNCaWcgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZHJhd2VyX19jcmVkaXRzJywgdGV4dDogJ+KAlCcgfSk7CiAgICAgIGZ1bmN0aW9uIHBhaW50KG4pIHsKICAgICAgICBjcmVkaXRzQmlnLnRleHRDb250ZW50ID0gKG4gPT0gbnVsbCkgPyAn4oCUJyA6IFN0cmluZyhuKTsKICAgICAgfQogICAgICBwYWludChjcmVkaXRzVmFsdWUoKSk7CgogICAgICB2YXIgYmFsYW5jZUNhcmQgPSBlbCgnc2VjdGlvbicsIHsKICAgICAgICBjbGFzczogJ2dsYXNzLWNhcmQnLAogICAgICAgIHN0eWxlOiB7IHBhZGRpbmc6ICd2YXIoLS1zcGFjZS1tZCwgMTVweCknLCBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICd2YXIoLS1zcGFjZS1zbSwgOXB4KScgfQogICAgICB9LAogICAgICAgIGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2ZsZXgtZW5kJywganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJywgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgZmxleFdyYXA6ICd3cmFwJyB9IH0sCiAgICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcycHgnLCBtaW5XaWR0aDogJzAnIH0gfSwKICAgICAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2NyZWRpdHMtbGFiZWwnLCB0ZXh0OiAnQ3JlZGl0IGJhbGFuY2UnIH0pLAogICAgICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdiYXNlbGluZScsIGdhcDogJzZweCcgfSB9LAogICAgICAgICAgICAgIGNyZWRpdHNCaWcsCiAgICAgICAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcgfSwgdGV4dDogJ2NyZWRpdHMnIH0pKSksCiAgICAgICAgICBjdGFCdXR0b24oJ0FkZCBjcmVkaXRzJywgeyBwcmltYXJ5OiB0cnVlLCBzbWFsbDogdHJ1ZSwgaWNvbjogJ3BsdXMnLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IG5hdmlnYXRlKCcjL3BheXdhbGwnKTsgfSB9KSksCiAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTJweCcsIG1hcmdpbjogJzAnIH0sIHRleHQ6ICdDcmVkaXRzIHBvd2VyIGV2ZXJ5IGdlbmVyYXRpb24uIFN0YW5kYXJkIGVkaXRzIGNvc3QgMTAuJyB9KQogICAgICApOwogICAgICB2aWV3LmFwcGVuZENoaWxkKGJhbGFuY2VDYXJkKTsKCiAgICAgIHJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgeyBpZiAobiAhPSBudWxsKSBwYWludChuKTsgfSk7CiAgICAgIHZhciBjYiA9IGZ1bmN0aW9uIChuKSB7IHBhaW50KG4pOyB9OwogICAgICB0cnkgeyBpZiAoVi5zdG9yZSAmJiBWLnN0b3JlLm9uKSB7IFYuc3RvcmUub24oJ2NyZWRpdHM6Y2hhbmdlZCcsIGNiKTsgdW5zdWIucHVzaChmdW5jdGlvbiAoKSB7IFYuc3RvcmUub2ZmICYmIFYuc3RvcmUub2ZmKCdjcmVkaXRzOmNoYW5nZWQnLCBjYik7IH0pOyB9IH0gY2F0Y2ggKGUpIHt9CgogICAgICB2YXIgbWVudSA9IGVsKCduYXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX3NlY3Rpb24nLCAnYXJpYS1sYWJlbCc6ICdBY2NvdW50IG1lbnUnLCBzdHlsZTogeyBnYXA6ICc0cHgnIH0gfSk7CiAgICAgIG1lbnUuYXBwZW5kQ2hpbGQobWVudUl0ZW0oJ2dpZnQnLCAnUmVmZXJyYWwgcHJvZ3JhbScsICdFYXJuIGNyZWRpdHMgYnkgaW52aXRpbmcgY3JlYXRvcnMnLCBmdW5jdGlvbiAoKSB7IG5hdmlnYXRlKCcjL3JlZmVycmFsJyk7IH0pKTsKICAgICAgbWVudS5hcHBlbmRDaGlsZChtZW51SXRlbSgnZmxhbWUnLCAnRGFpbHkgY2hhbGxlbmdlJywgJ1Bvc3QgYSBkYXksIGJ1aWxkIHlvdXIgc3RyZWFrJywgZnVuY3Rpb24gKCkgeyBuYXZpZ2F0ZSgnIy9jaGFsbGVuZ2UnKTsgfSkpOwogICAgICBtZW51LmFwcGVuZENoaWxkKG1lbnVJdGVtKCdnZWFyJywgJ1NldHRpbmdzJywgJ0RlZmF1bHRzLCBicmFuZGluZyBhbmQgYWNjb3VudCcsIGZ1bmN0aW9uICgpIHsgbmF2aWdhdGUoJyMvc2V0dGluZ3MnKTsgfSkpOwogICAgICBtZW51LmFwcGVuZENoaWxkKG1lbnVJdGVtKCdoZWxwJywgJ0hlbHAgJiBzdXBwb3J0JywgJ0ZBUSBhbmQgY29udGFjdCcsIGZ1bmN0aW9uICgpIHsgY2xvc2VEcmF3ZXIoKTsgd2luZG93Lm9wZW4oJ2h0dHBzOi8vdm9vc2V5LmNvbS9oZWxwJywgJ19ibGFuaycsICdub29wZW5lcicpOyB9KSk7CiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQobWVudSk7CgogICAgICB2YXIgbG9nb3V0QnRuID0gZWwoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzOiAndi1kcmF3ZXJfX2l0ZW0gdi1kcmF3ZXJfX2l0ZW0tLWRhbmdlcicgfSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWRyYXdlcl9faXRlbS1pY29uJyB9LCBpY29uKCdsb2dvdXQnKSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IHN0eWxlOiB7IGZvbnRXZWlnaHQ6ICc2MDAnIH0sIHRleHQ6ICdMb2cgb3V0JyB9KSk7CiAgICAgIGxvZ291dEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25maXJtRGlhbG9nKCdMb2cgb3V0IG9mIFZhbXA/JykudGhlbihmdW5jdGlvbiAob2spIHsKICAgICAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgICAgIHRyeSB7IGlmIChWLmF1dGggJiYgVi5hdXRoLmNsZWFyKSBWLmF1dGguY2xlYXIoKTsgfSBjYXRjaCAoZSkge30KICAgICAgICAgIHRvYXN0KCdTaWduZWQgb3V0JywgJ2luZm8nKTsKICAgICAgICAgIG5hdmlnYXRlKCcjL2F1dGgnKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9fc2VjdGlvbicsIHN0eWxlOiB7IGJvcmRlckJvdHRvbTogJ25vbmUnIH0gfSwgbG9nb3V0QnRuKSk7CgogICAgICByb290LmFwcGVuZENoaWxkKHZpZXcpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1lbnVJdGVtKGljLCB0aXRsZSwgc3ViLCBvbkNsaWNrKSB7CiAgICAgIHZhciB0ZXh0U3RhY2sgPSBlbCgnc3BhbicsIHsKICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICcycHgnLCBtaW5XaWR0aDogJzAnLCBmbGV4OiAnMSAxIGF1dG8nLCB0ZXh0QWxpZ246ICdsZWZ0JyB9CiAgICAgIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdibG9jaycsIGZvbnRXZWlnaHQ6ICc2MDAnLCBmb250U2l6ZTogJzE1cHgnLCBsaW5lSGVpZ2h0OiAnMS4yNScsIGNvbG9yOiAndmFyKC0tdi1pbmssICNmNWY1ZjcpJyB9LCB0ZXh0OiB0aXRsZSB9KSk7CiAgICAgIGlmIChzdWIpIHsKICAgICAgICB0ZXh0U3RhY2suYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7CiAgICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiAnYmxvY2snLCBmb250U2l6ZTogJzEzcHgnLCBsaW5lSGVpZ2h0OiAnMS4zJywgY29sb3I6ICd2YXIoLS12LWluay1zb2Z0LCByZ2JhKDI0NSwyNDUsMjQ3LC42KSknIH0sCiAgICAgICAgICB0ZXh0OiBzdWIKICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgdmFyIGJ0biA9IGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtZHJhd2VyX19pdGVtJywgc3R5bGU6IHsgYWxpZ25JdGVtczogJ2NlbnRlcicgfSB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZHJhd2VyX19pdGVtLWljb24nIH0sIGljb24oaWMpKSwKICAgICAgICB0ZXh0U3RhY2ssCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2l0ZW0taWNvbicsIHN0eWxlOiB7IGNvbG9yOiAndmFyKC0tdi1pbmstc29mdCwgcmdiYSgyNDUsMjQ1LDI0NywuNSkpJywgd2lkdGg6ICcxOHB4JywgaGVpZ2h0OiAnMThweCcgfSB9LCBpY29uKCdjaGV2cm9uJykpKTsKICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGljayk7CiAgICAgIHJldHVybiBidG47CiAgICB9CgogICAgZnVuY3Rpb24gdGVhcmRvd24oKSB7CiAgICAgIHdoaWxlICh1bnN1Yi5sZW5ndGgpIHsgdHJ5IHsgdW5zdWIucG9wKCkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgfQoKICAgIHJldHVybiB7IHJlbmRlcjogcmVuZGVyLCB0ZWFyZG93bjogdGVhcmRvd24gfTsKICB9KSgpOwoKICBWLnZpZXdzLm9uYm9hcmRpbmcgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIHN0YXRlID0geyBzdGVwOiAwLCBpbmR1c3RyaWVzOiBbXSwgcmVmQ29kZTogJycgfTsKCiAgICBmdW5jdGlvbiByZW5kZXIocm9vdCwgcGFyYW1zKSB7CiAgICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICAgIG1heWJlQXBwbHlRdWVyeVJlZmVycmFsKHBhcmFtcyk7CgogICAgICBzdGF0ZS5zdGVwID0gMDsKICAgICAgc3RhdGUuaW5kdXN0cmllcyA9IChzZ2V0KCdpbmR1c3RyaWVzJywgW10pIHx8IFtdKS5zbGljZSgpOwogICAgICBzdGF0ZS5yZWZDb2RlID0gbHNHZXQoJ3JlZmVycmFsQ29kZScsICcnKSB8fCAnJzsKCiAgICAgIHZhciB2aWV3ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBhZ2Ugdi12aWV3LS1vbmJvYXJkaW5nJywgc3R5bGU6IHsgbWF4V2lkdGg6ICc2NDBweCcgfSB9KTsKICAgICAgdmFyIHN0YWdlID0gZWwoJ2RpdicsIHsgY2xhc3M6ICdnbGFzcy1jYXJkIHYtb25iX19zdGFnZScgfSk7CiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoc3RhZ2UpOwogICAgICByb290LmFwcGVuZENoaWxkKHZpZXcpOwoKICAgICAgcGFpbnQoc3RhZ2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhaW50KHN0YWdlKSB7CiAgICAgIHN0YWdlLmlubmVySFRNTCA9ICcnOwogICAgICB2YXIgZG90cyA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZ2FwOiAnOHB4JywganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLCBtYXJnaW5Cb3R0b206ICd2YXIoLS1zcGFjZS1tZCwgMTVweCknIH0gfSwKICAgICAgICBkb3Qoc3RhdGUuc3RlcCA+PSAwKSwKICAgICAgICBkb3Qoc3RhdGUuc3RlcCA+PSAxKSk7CiAgICAgIHN0YWdlLmFwcGVuZENoaWxkKGRvdHMpOwoKICAgICAgaWYgKHN0YXRlLnN0ZXAgPT09IDApIHN0YWdlLmFwcGVuZENoaWxkKHN0ZXBJbmR1c3RyaWVzKCkpOwogICAgICBlbHNlIHN0YWdlLmFwcGVuZENoaWxkKHN0ZXBSZWZlcnJhbCgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkb3QoYWN0aXZlKSB7CiAgICAgIHJldHVybiBlbCgnc3BhbicsIHsKICAgICAgICBzdHlsZTogewogICAgICAgICAgd2lkdGg6IGFjdGl2ZSA/ICcyNHB4JyA6ICc4cHgnLCBoZWlnaHQ6ICc4cHgnLCBib3JkZXJSYWRpdXM6ICc5OTlweCcsCiAgICAgICAgICBiYWNrZ3JvdW5kOiBhY3RpdmUgPyAndmFyKC0tdmFtcC1hY2NlbnQsICM1Mjk3RjgpJyA6ICd2YXIoLS12LWxpbmUsIHJnYmEoMjQ1LDI0NSwyNDcsLjIpKScsCiAgICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIHZhcigtLWR1ci1iYXNlLCAyMDBtcykgdmFyKC0tZWFzZS1zcHJpbmcsIGN1YmljLWJlemllcigwLjM0LDEuNTYsMC42NCwxKSknCiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGVwSW5kdXN0cmllcygpIHsKICAgICAgdmFyIGZyYWcgPSBlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3RhY2stbWQnIH0pOwogICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdXZWxjb21lIHRvIFZhbXAnIH0pKTsKICAgICAgZnJhZy5hcHBlbmRDaGlsZChlbCgnaDEnLCB7IGNsYXNzOiAndi1zZWN0aW9uX190aXRsZScsIHN0eWxlOiB7IGZvbnRTaXplOiAndmFyKC0tZm9udC10aXRsZSwgMjhweCknIH0sIHRleHQ6ICdXaGF0IGRvIHlvdSBjcmVhdGU/JyB9KSk7CiAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHRleHQ6ICdQaWNrIGEgZmV3IHNvIHdlIGNhbiB0YWlsb3IgcHJlc2V0cyBhbmQgcHJvbXB0cy4gWW91IGNhbiBjaGFuZ2UgdGhpcyBhbnl0aW1lLicgfSkpOwoKICAgICAgdmFyIGNvbnRpbnVlTGFiZWwgPSBlbCgnc3BhbicpOwogICAgICBmdW5jdGlvbiB1cGRhdGVDb3VudCgpIHsKICAgICAgICB2YXIgbiA9IHN0YXRlLmluZHVzdHJpZXMubGVuZ3RoOwogICAgICAgIGNvbnRpbnVlTGFiZWwudGV4dENvbnRlbnQgPSBuID8gKCdDb250aW51ZSAoJyArIG4gKyAnKScpIDogJ0NvbnRpbnVlJzsKICAgICAgfQoKICAgICAgZnJhZy5hcHBlbmRDaGlsZChpbmR1c3RyeUJ1YmJsZUdyaWQoc3RhdGUuaW5kdXN0cmllcywgZnVuY3Rpb24gKGtleXMpIHsgc3RhdGUuaW5kdXN0cmllcyA9IGtleXM7IHVwZGF0ZUNvdW50KCk7IH0pKTsKCiAgICAgIGZ1bmN0aW9uIGFkdmFuY2UoKSB7CiAgICAgICAgc3NldCgnaW5kdXN0cmllcycsIHN0YXRlLmluZHVzdHJpZXMpOwogICAgICAgIHNldHRpbmdDaGFuZ2UoJ2luZHVzdHJpZXMnLCBzdGF0ZS5pbmR1c3RyaWVzKTsKICAgICAgICBpZiAoc3RhdGUuaW5kdXN0cmllcy5sZW5ndGgpIHsKICAgICAgICAgIHZhciByZWMgPSByZWNvbW1lbmRlZE1vZGVsKHN0YXRlLmluZHVzdHJpZXMpOwogICAgICAgICAgaWYgKHJlYyAmJiAhc2V0dGluZ3MoKS5kZWZhdWx0TW9kZWwpIHNldHRpbmdDaGFuZ2UoJ2RlZmF1bHRNb2RlbCcsIHJlYyk7CiAgICAgICAgfQogICAgICAgIHZhciBzdGFnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52LW9uYl9fc3RhZ2UnKTsKICAgICAgICBzdGF0ZS5zdGVwID0gMTsKICAgICAgICBpZiAoc3RhZ2UpIHBhaW50KHN0YWdlKTsKICAgICAgfQoKICAgICAgdmFyIGNvbnRpbnVlQnRuID0gZWwoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnkgdi1jdGEtLWJsb2NrJyB9LCBjb250aW51ZUxhYmVsKTsKICAgICAgY29udGludWVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhZHZhbmNlKTsKICAgICAgdXBkYXRlQ291bnQoKTsKCiAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLXNtJyB9LAogICAgICAgIGNvbnRpbnVlQnRuLAogICAgICAgIGN0YUJ1dHRvbignU2tpcCBmb3Igbm93JywgeyBnaG9zdDogdHJ1ZSwgYmxvY2s6IHRydWUsIG9uQ2xpY2s6IGFkdmFuY2UgfSkpKTsKICAgICAgcmV0dXJuIGZyYWc7CiAgICB9CgogICAgZnVuY3Rpb24gc3RlcFJlZmVycmFsKCkgewogICAgICB2YXIgZnJhZyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1zdGFjay1tZCcgfSk7CiAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1leWVicm93JywgdGV4dDogJ0FsbW9zdCB0aGVyZScgfSkpOwogICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKCdoMScsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3RpdGxlJywgc3R5bGU6IHsgZm9udFNpemU6ICd2YXIoLS1mb250LXRpdGxlLCAyOHB4KScgfSwgdGV4dDogJ0dvdCBhIHJlZmVycmFsIGNvZGU/JyB9KSk7CiAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHRleHQ6ICdFbnRlciBhIGNyZWF0b3IgY29kZSB0byB1bmxvY2sgYm9udXMgY3JlZGl0cy4gT3B0aW9uYWwuJyB9KSk7CgogICAgICB2YXIgaW5wdXQgPSBlbCgnaW5wdXQnLCB7CiAgICAgICAgdHlwZTogJ3RleHQnLCBjbGFzczogJ3YtZmllbGQnLCB2YWx1ZTogc3RhdGUucmVmQ29kZSwKICAgICAgICBwbGFjZWhvbGRlcjogJ0NSRUFUT1JDT0RFJywgYXV0b2NhcGl0YWxpemU6ICdjaGFyYWN0ZXJzJywgc3BlbGxjaGVjazogJ2ZhbHNlJywgJ2FyaWEtbGFiZWwnOiAnUmVmZXJyYWwgY29kZScKICAgICAgfSk7CiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24gKCkgeyBpbnB1dC52YWx1ZSA9IGlucHV0LnZhbHVlLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvXHMrL2csICcnKTsgc3RhdGUucmVmQ29kZSA9IGlucHV0LnZhbHVlOyB9KTsKICAgICAgdmFyIHN0YXR1cyA9IGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEzcHgnLCBtaW5IZWlnaHQ6ICcxOHB4JyB9IH0pOwogICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1maWVsZC1ncm91cCcgfSwgaW5wdXQsIHN0YXR1cykpOwoKICAgICAgdmFyIGZpbmlzaCA9IGN0YUJ1dHRvbignR2V0IHN0YXJ0ZWQnLCB7IHByaW1hcnk6IHRydWUsIGJsb2NrOiB0cnVlLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGNvZGUgPSAoaW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTsKICAgICAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uICgpIHsgY29tcGxldGVPbmJvYXJkaW5nKCk7IH07CiAgICAgICAgaWYgKGNvZGUgJiYgVi5hcGkgJiYgdHlwZW9mIFYuYXBpLmF0dHJpYnV0ZVJlZmVycmFsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAnJzsKICAgICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdBcHBseWluZyBjb2Rl4oCmJzsKICAgICAgICAgIGxzU2V0KCdyZWZlcnJhbENvZGUnLCBjb2RlKTsKICAgICAgICAgIFYuYXBpLmF0dHJpYnV0ZVJlZmVycmFsKGNvZGUpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0b2FzdCgnUmVmZXJyYWwgYXBwbGllZCEnLCAnc3VjY2VzcycpOwogICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1jb2xvci1lcnJvciwgI0Y3MzM2MyknOwogICAgICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAoZXJyICYmIGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogJ0NvdWxkIG5vdCBhcHBseSB0aGF0IGNvZGUsIGJ1dCB5b3UgYXJlIGFsbCBzZXQuJzsKICAgICAgICAgICAgc2V0VGltZW91dChkb25lLCAxMjAwKTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkb25lKCk7CiAgICAgICAgfQogICAgICB9IH0pOwoKICAgICAgZnJhZy5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3RhY2stc20nIH0sCiAgICAgICAgZmluaXNoLAogICAgICAgIGN0YUJ1dHRvbignU2tpcCcsIHsgZ2hvc3Q6IHRydWUsIGJsb2NrOiB0cnVlLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IGNvbXBsZXRlT25ib2FyZGluZygpOyB9IH0pKSk7CiAgICAgIHJldHVybiBmcmFnOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbXBsZXRlT25ib2FyZGluZygpIHsKICAgICAgc3NldCgnb25ib2FyZGluZ0RvbmUnLCB0cnVlKTsKICAgICAgdHJ5IHsgaWYgKFYuc3RhdGUpIFYuc3RhdGUub25ib2FyZGluZ0RvbmUgPSB0cnVlOyB9IGNhdGNoIChlKSB7fQogICAgICBzaG93RnJlZUNyZWRpdHNXZWxjb21lKCk7CiAgICAgIGdvKCcjL2NyZWF0ZScpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dGcmVlQ3JlZGl0c1dlbGNvbWUoKSB7CiAgICAgIGlmIChsc0dldCgnc2VlbkNyZWRpdFdlbGNvbWUnLCBmYWxzZSkpIHJldHVybjsKICAgICAgbHNTZXQoJ3NlZW5DcmVkaXRXZWxjb21lJywgdHJ1ZSk7CiAgICAgIHJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgewogICAgICAgIHZhciBhbW91bnQgPSAobiAhPSBudWxsICYmIG4gPiAwKSA/IG4gOiA1MDsKICAgICAgICB0b2FzdCgnV2VsY29tZSEgWW91IGhhdmUgJyArIGFtb3VudCArICcgZnJlZSBjcmVkaXRzIHRvIHN0YXJ0IGNyZWF0aW5nLicsICdzdWNjZXNzJyk7CiAgICAgICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuY29uZmV0dGkgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgVi51aS5jb25mZXR0aSgpOyB9IGNhdGNoIChlKSB7fSB9CiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiB7IHJlbmRlcjogcmVuZGVyIH07CiAgfSkoKTsKCiAgVi52aWV3cy5yZWZlcnJhbCA9IChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiByZW5kZXIocm9vdCwgcGFyYW1zKSB7CiAgICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICAgIGlmICghYXV0aEd1YXJkKHJvb3QpKSByZXR1cm47CgogICAgICBtYXliZUFwcGx5UXVlcnlSZWZlcnJhbChwYXJhbXMpOwoKICAgICAgdmFyIHZpZXcgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcGFnZSB2LXZpZXctLXJlZmVycmFsJyB9KTsKICAgICAgdmlldy5hcHBlbmRDaGlsZChlbCgnaGVhZGVyJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9faGVhZCcgfSwKICAgICAgICBlbCgnZGl2JywgbnVsbCwKICAgICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdHcm93dGgnIH0pLAogICAgICAgICAgZWwoJ2gxJywgeyBjbGFzczogJ3Ytc2VjdGlvbl9fdGl0bGUnLCBzdHlsZTogeyBmb250U2l6ZTogJ3ZhcigtLWZvbnQtbGFyZ2UtdGl0bGUsIDM0cHgpJyB9LCB0ZXh0OiAnUmVmZXJyYWwgcHJvZ3JhbScgfSksCiAgICAgICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YicsIHRleHQ6ICdTaGFyZSB5b3VyIGNvZGUsIGVhcm4gY3JlZGl0cyB3aGVuIGNyZWF0b3JzIHNpZ24gdXAgYW5kIGNyZWF0ZS4nIH0pKSkpOwoKICAgICAgdmFyIGxpc3RXcmFwID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXN0YWNrLW1kJyB9KTsKICAgICAgdmlldy5hcHBlbmRDaGlsZChsaXN0V3JhcCk7CiAgICAgIHJvb3QuYXBwZW5kQ2hpbGQodmlldyk7CgogICAgICBsaXN0V3JhcC5hcHBlbmRDaGlsZChza2VsKCkpOwogICAgICBsaXN0V3JhcC5hcHBlbmRDaGlsZChza2VsKCkpOwoKICAgICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkucmVmZXJyYWxDb2RlcyAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHJlbmRlckVtcHR5KGxpc3RXcmFwKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIFYuYXBpLnJlZmVycmFsQ29kZXMoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICB2YXIgY29kZXMgPSBub3JtYWxpemVMaXN0KHJlcyk7CiAgICAgICAgbGlzdFdyYXAuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgaWYgKCFjb2Rlcy5sZW5ndGgpIHsgcmVuZGVyRW1wdHkobGlzdFdyYXApOyByZXR1cm47IH0KICAgICAgICBjb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGxpc3RXcmFwLmFwcGVuZENoaWxkKGNvZGVDYXJkKGMpKTsgfSk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBsaXN0V3JhcC5pbm5lckhUTUwgPSAnJzsKICAgICAgICByZW5kZXJFcnJvcihsaXN0V3JhcCwgZXJyLCBmdW5jdGlvbiAoKSB7IHJlbmRlcihyb290LCBwYXJhbXMpOyB9KTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gbm9ybWFsaXplTGlzdChyZXMpIHsKICAgICAgaWYgKCFyZXMpIHJldHVybiBbXTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkgcmV0dXJuIHJlczsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzLml0ZW1zKSkgcmV0dXJuIHJlcy5pdGVtczsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzLmNvZGVzKSkgcmV0dXJuIHJlcy5jb2RlczsKICAgICAgcmV0dXJuIFtdOwogICAgfQoKICAgIGZ1bmN0aW9uIHNrZWwoKSB7CiAgICAgIHZhciBjYXJkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICdnbGFzcy1jYXJkJyB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbiB2LXNrZWxldG9uLS10aXRsZScsIHN0eWxlOiB7IHdpZHRoOiAnNTAlJyB9IH0pLAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbiB2LXNrZWxldG9uLS10ZXh0Jywgc3R5bGU6IHsgd2lkdGg6ICc4MCUnLCBtYXJnaW5Ub3A6ICcxMnB4JyB9IH0pLAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1za2VsZXRvbiB2LXNrZWxldG9uLS10ZXh0Jywgc3R5bGU6IHsgd2lkdGg6ICc2MCUnLCBtYXJnaW5Ub3A6ICc4cHgnIH0gfSkpOwogICAgICByZXR1cm4gY2FyZDsKICAgIH0KCiAgICBmdW5jdGlvbiBjb2RlQ2FyZChjKSB7CiAgICAgIHZhciBjb2RlID0gYy5jb2RlIHx8IGMucmVmZXJyYWxDb2RlIHx8IGMuaWQgfHwgJ+KAlCc7CiAgICAgIHZhciBwbGF0Zm9ybSA9IGMucGxhdGZvcm0gfHwgYy5jaGFubmVsIHx8ICcnOwogICAgICB2YXIgY29tbWlzc2lvbiA9IChjLmNvbW1pc3Npb24gIT0gbnVsbCA/IGMuY29tbWlzc2lvbiA6IChjLmNvbW1pc3Npb25QZXJjZW50ICE9IG51bGwgPyBjLmNvbW1pc3Npb25QZXJjZW50IDogbnVsbCkpOwogICAgICB2YXIgc3RhdHVzID0gYy5zdGF0dXMgfHwgKGMuYWN0aXZlID09PSBmYWxzZSA/ICdpbmFjdGl2ZScgOiAnYWN0aXZlJyk7CiAgICAgIHZhciBzaWdudXBzID0gbnVtKGMuc2lnbnVwcyAhPSBudWxsID8gYy5zaWdudXBzIDogKGMuc3RhdHMgJiYgYy5zdGF0cy5zaWdudXBzKSk7CiAgICAgIHZhciBlYXJuZWQgPSBudW0oYy5jcmVkaXRzRWFybmVkICE9IG51bGwgPyBjLmNyZWRpdHNFYXJuZWQgOiAoYy5zdGF0cyAmJiBjLnN0YXRzLmNyZWRpdHNFYXJuZWQpKTsKICAgICAgdmFyIHNlZWRlZCA9IG51bShjLmNyZWRpdHNTZWVkZWQgIT0gbnVsbCA/IGMuY3JlZGl0c1NlZWRlZCA6IChjLnN0YXRzICYmIGMuc3RhdHMuY3JlZGl0c1NlZWRlZCkpOwoKICAgICAgdmFyIHNoYXJlVVJMID0gJ2h0dHBzOi8vYXBwcy5hcHBsZS5jb20vdXMvYXBwL3ZhbXAvaWQ2NzQ4NjU3Njg1P3I9JyArIGVuY29kZVVSSUNvbXBvbmVudChjb2RlKTsKICAgICAgdmFyIGlzQWN0aXZlID0gU3RyaW5nKHN0YXR1cykudG9Mb3dlckNhc2UoKSA9PT0gJ2FjdGl2ZSc7CgogICAgICB2YXIgY29kZUxpbmUgPSBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBnYXA6ICd2YXIoLS1zcGFjZS1zbSwgOXB4KScsIGZsZXhXcmFwOiAnd3JhcCcgfSB9LAogICAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtbW9ubycsIHN0eWxlOiB7IGZvbnRTaXplOiAnMjJweCcsIGZvbnRXZWlnaHQ6ICc3MDAnLCBsZXR0ZXJTcGFjaW5nOiAnMC4wNGVtJyB9LCB0ZXh0OiBjb2RlIH0pKTsKICAgICAgaWYgKHBsYXRmb3JtKSBjb2RlTGluZS5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LW11dGVkJywgc3R5bGU6IHsgZm9udFNpemU6ICcxM3B4JyB9LCB0ZXh0OiBwbGF0Zm9ybSB9KSk7CgogICAgICB2YXIgYmFkZ2UgPSBlbCgnc3BhbicsIHsKICAgICAgICBjbGFzczogJ3YtbW9ubycsCiAgICAgICAgc3R5bGU6IHsKICAgICAgICAgIGZvbnRTaXplOiAnMTFweCcsIHRleHRUcmFuc2Zvcm06ICd1cHBlcmNhc2UnLCBsZXR0ZXJTcGFjaW5nOiAnMC4xZW0nLAogICAgICAgICAgcGFkZGluZzogJzRweCAxMHB4JywgYm9yZGVyUmFkaXVzOiAnOTk5cHgnLAogICAgICAgICAgY29sb3I6IGlzQWN0aXZlID8gJ3ZhcigtLXZhbXAtYWNjZW50LCAjNTI5N0Y4KScgOiAndmFyKC0tdi1pbmstc29mdCwgcmdiYSgyNDUsMjQ1LDI0NywuNikpJywKICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAnICsgKGlzQWN0aXZlID8gJ3ZhcigtLXZhbXAtYWNjZW50LCAjNTI5N0Y4KScgOiAndmFyKC0tdi1saW5lLCByZ2JhKDI0NSwyNDUsMjQ3LC4xNSkpJykKICAgICAgICB9LAogICAgICAgIHRleHQ6IGNhcChzdGF0dXMpCiAgICAgIH0pOwoKICAgICAgdmFyIGhlYWQgPSBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdmbGV4LXN0YXJ0JywganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJywgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgZmxleFdyYXA6ICd3cmFwJyB9IH0sIGNvZGVMaW5lLCBiYWRnZSk7CgogICAgICB2YXIgc3RhdHNSb3cgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZ3JpZCB2LWdyaWQtLTMnLCBzdHlsZTogeyBnYXA6ICd2YXIoLS1zcGFjZS1tZCwgMTVweCknIH0gfSwKICAgICAgICBzdGF0Qm94KHNpZ251cHMsICdTaWdudXBzJyksCiAgICAgICAgc3RhdEJveChlYXJuZWQsICdDcmVkaXRzIGVhcm5lZCcpLAogICAgICAgIHN0YXRCb3goc2VlZGVkLCAnQ3JlZGl0cyBzZWVkZWQnKSk7CiAgICAgIGlmIChjb21taXNzaW9uICE9IG51bGwpIHN0YXRzUm93LmFwcGVuZENoaWxkKHN0YXRCb3goY29tbWlzc2lvbiArICclJywgJ0NvbW1pc3Npb24nKSk7CgogICAgICB2YXIgYWN0aW9ucyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1jdGEtcm93JyB9LAogICAgICAgIGN0YUJ1dHRvbignQ29weSBsaW5rJywgeyBwcmltYXJ5OiB0cnVlLCBzbWFsbDogdHJ1ZSwgaWNvbjogJ2xpbmsnLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IGNvcHkoc2hhcmVVUkwsICdTaGFyZSBsaW5rIGNvcGllZCcpOyB9IH0pLAogICAgICAgIGN0YUJ1dHRvbignQ29weSBjb2RlJywgeyBnaG9zdDogdHJ1ZSwgc21hbGw6IHRydWUsIGljb246ICdjb3B5Jywgb25DbGljazogZnVuY3Rpb24gKCkgeyBjb3B5KGNvZGUsICdDb2RlIGNvcGllZCcpOyB9IH0pKTsKCiAgICAgIHZhciBjYXJkID0gZWwoJ3NlY3Rpb24nLCB7IGNsYXNzOiAndi1zZWN0aW9uIGdsYXNzLWNhcmQnIH0sIGhlYWQsIHN0YXRzUm93LCBhY3Rpb25zKTsKCiAgICAgIHZhciBsZWRnZXIgPSBjLmxlZGdlciB8fCBjLmFjdGl2aXR5IHx8IGMucmVjZW50QWN0aXZpdHk7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxlZGdlcikgJiYgbGVkZ2VyLmxlbmd0aCkgewogICAgICAgIHZhciBsaXN0ID0gZWwoJ3VsJywgeyBzdHlsZTogeyBsaXN0U3R5bGU6ICdub25lJywgbWFyZ2luOiAnMCcsIHBhZGRpbmc6ICcwJywgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgZ2FwOiAnOHB4JyB9IH0pOwogICAgICAgIGxlZGdlci5zbGljZSgwLCA1KS5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkgewogICAgICAgICAgdmFyIGxhYmVsID0gZW50cnkubGFiZWwgfHwgZW50cnkuZXZlbnQgfHwgZW50cnkudHlwZSB8fCAnQWN0aXZpdHknOwogICAgICAgICAgdmFyIGFtdCA9IGVudHJ5LmNyZWRpdHMgIT0gbnVsbCA/ICgnKycgKyBlbnRyeS5jcmVkaXRzICsgJyBjcicpIDogKGVudHJ5LmFtb3VudCAhPSBudWxsID8gZW50cnkuYW1vdW50IDogJycpOwogICAgICAgICAgdmFyIHdoZW4gPSBlbnRyeS5kYXRlIHx8IGVudHJ5LmNyZWF0ZWREYXRlIHx8IGVudHJ5LnRpbWVzdGFtcDsKICAgICAgICAgIGlmICh3aGVuICYmIFYudXRpbCAmJiBWLnV0aWwuZm10RGF0ZSkgd2hlbiA9IFYudXRpbC5mbXREYXRlKHdoZW4pOwogICAgICAgICAgbGlzdC5hcHBlbmRDaGlsZChlbCgnbGknLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJywgZ2FwOiAndmFyKC0tc3BhY2UtbWQsIDE1cHgpJywgZm9udFNpemU6ICcxNHB4JyB9IH0sCiAgICAgICAgICAgIGVsKCdzcGFuJywgeyB0ZXh0OiBsYWJlbCB9KSwKICAgICAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tdXRlZCcsIHRleHQ6IFthbXQsIHdoZW5dLmZpbHRlcihCb29sZWFuKS5qb2luKCcgwrcgJykgfSkpKTsKICAgICAgICB9KTsKICAgICAgICB2YXIgZGV0YWlscyA9IGVsKCdkZXRhaWxzJywgbnVsbCwKICAgICAgICAgIGVsKCdzdW1tYXJ5JywgeyBzdHlsZTogeyBjdXJzb3I6ICdwb2ludGVyJywgZm9udFNpemU6ICcxNHB4JywgY29sb3I6ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknIH0sIHRleHQ6ICdSZWNlbnQgYWN0aXZpdHknIH0pLAogICAgICAgICAgZWwoJ2RpdicsIHsgc3R5bGU6IHsgcGFkZGluZ1RvcDogJ3ZhcigtLXNwYWNlLXNtLCA5cHgpJyB9IH0sIGxpc3QpKTsKICAgICAgICBjYXJkLmFwcGVuZENoaWxkKGRldGFpbHMpOwogICAgICB9CgogICAgICByZXR1cm4gY2FyZDsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGF0Qm94KHZhbHVlLCBsYWJlbCkgewogICAgICByZXR1cm4gZWwoJ2RpdicsIHsgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgZ2FwOiAnMnB4JyB9IH0sCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LW1vbm8nLCBzdHlsZTogeyBmb250U2l6ZTogJzIycHgnLCBmb250V2VpZ2h0OiAnNzAwJyB9LCB0ZXh0OiB2YWx1ZSB9KSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEycHgnIH0sIHRleHQ6IGxhYmVsIH0pKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJFbXB0eSh3cmFwKSB7CiAgICAgIHdyYXAuaW5uZXJIVE1MID0gJyc7CiAgICAgIHZhciBjYXJkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5IGdsYXNzLWNhcmQnIH0sCiAgICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJyB9LCBpY29uKCdnaWZ0JykpLAogICAgICAgIGVsKCdoMicsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScsIHRleHQ6ICdCZWNvbWUgYSBWYW1wIENyZWF0b3InIH0pLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZW1wdHlfX21zZycsIHRleHQ6ICdZb3UgZG8gbm90IGhhdmUgYSByZWZlcnJhbCBjb2RlIHlldC4gQXBwbHkgdG8gZWFybiBjcmVkaXRzIGFuZCBjb21taXNzaW9uIHdoZW4gY3JlYXRvcnMgeW91IHJlZmVyIHNpZ24gdXAuJyB9KSwKICAgICAgICBjdGFCdXR0b24oJ0FwcGx5IHRvIGJlY29tZSBhIGNyZWF0b3InLCB7IHByaW1hcnk6IHRydWUsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHdpbmRvdy5vcGVuKCdodHRwczovL3Zvb3NleS5jb20vdmFtcC9jcmVhdG9ycycsICdfYmxhbmsnLCAnbm9vcGVuZXInKTsKICAgICAgICB9IH0pKTsKICAgICAgd3JhcC5hcHBlbmRDaGlsZChjYXJkKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJFcnJvcih3cmFwLCBlcnIsIHJldHJ5KSB7CiAgICAgIHdyYXAuaW5uZXJIVE1MID0gJyc7CiAgICAgIHZhciBtc2cgPSAoZXJyICYmIGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogJ0NvdWxkIG5vdCBsb2FkIHlvdXIgcmVmZXJyYWwgY29kZXMuJzsKICAgICAgd3JhcC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHkgZ2xhc3MtY2FyZCcgfSwKICAgICAgICBlbCgnaDInLCB7IGNsYXNzOiAndi1lbXB0eV9fdGl0bGUnLCB0ZXh0OiAnU29tZXRoaW5nIHdlbnQgd3JvbmcnIH0pLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZW1wdHlfX21zZycsIHRleHQ6IG1zZyB9KSwKICAgICAgICBjdGFCdXR0b24oJ1JldHJ5JywgeyBnaG9zdDogdHJ1ZSwgb25DbGljazogcmV0cnkgfSkpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb3B5KHRleHQsIG9rKSB7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpIHsKICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oZnVuY3Rpb24gKCkgeyB0b2FzdChvayB8fCAnQ29waWVkJywgJ3N1Y2Nlc3MnKTsgfSwgZnVuY3Rpb24gKCkgeyBsZWdhY3lDb3B5KHRleHQsIG9rKTsgfSk7CiAgICAgICAgfSBlbHNlIHsgbGVnYWN5Q29weSh0ZXh0LCBvayk7IH0KICAgICAgfSBjYXRjaCAoZSkgeyBsZWdhY3lDb3B5KHRleHQsIG9rKTsgfQogICAgfQogICAgZnVuY3Rpb24gbGVnYWN5Q29weSh0ZXh0LCBvaykgewogICAgICB0cnkgewogICAgICAgIHZhciB0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICAgICAgdGEudmFsdWUgPSB0ZXh0OyB0YS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7IHRhLnN0eWxlLm9wYWNpdHkgPSAnMCc7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0YSk7IHRhLnNlbGVjdCgpOyBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOyB0YS5yZW1vdmUoKTsKICAgICAgICB0b2FzdChvayB8fCAnQ29waWVkJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSBjYXRjaCAoZSkgeyB0b2FzdCgnQ29weSBmYWlsZWQg4oCUICcgKyB0ZXh0LCAnZXJyb3InKTsgfQogICAgfQoKICAgIGZ1bmN0aW9uIG51bShuKSB7IHJldHVybiAobiA9PSBudWxsIHx8IGlzTmFOKE51bWJlcihuKSkpID8gJzAnIDogU3RyaW5nKE51bWJlcihuKSk7IH0KICAgIGZ1bmN0aW9uIGNhcChzKSB7IHMgPSBTdHJpbmcocyB8fCAnJyk7IHJldHVybiBzID8gcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzOyB9CgogICAgcmV0dXJuIHsgcmVuZGVyOiByZW5kZXIgfTsKICB9KSgpOwoKICBWLnZpZXdzLmNoYWxsZW5nZSA9IChmdW5jdGlvbiAoKSB7CiAgICB2YXIgR09BTCA9IDMwOwogICAgdmFyIEdSQUNFX0RBWVMgPSA1OwogICAgdmFyIERBSUxZX0NSRURJVFMgPSAxMDA7CiAgICB2YXIgQk9OVVNfQ1JFRElUUyA9IDEwMDA7CgogICAgZnVuY3Rpb24gZ2V0U3RyZWFrKCkgewogICAgICB2YXIgcyA9IGxzR2V0KCdjaGFsbGVuZ2UnLCBudWxsKTsKICAgICAgaWYgKCFzIHx8IHR5cGVvZiBzICE9PSAnb2JqZWN0JykgcyA9IHsgY291bnQ6IDAsIGxhc3REYXk6IG51bGwsIGJlc3Q6IDAsIHRvdGFsOiAwIH07CiAgICAgIHJldHVybiBzOwogICAgfQogICAgZnVuY3Rpb24gc2V0U3RyZWFrKHMpIHsgbHNTZXQoJ2NoYWxsZW5nZScsIHMpOyB9CgogICAgZnVuY3Rpb24gdG9kYXlLZXkoKSB7CiAgICAgIHZhciBkID0gbmV3IERhdGUoKTsKICAgICAgcmV0dXJuIGQuZ2V0RnVsbFllYXIoKSArICctJyArIHBhZChkLmdldE1vbnRoKCkgKyAxKSArICctJyArIHBhZChkLmdldERhdGUoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBwYWQobikgeyByZXR1cm4gbiA8IDEwID8gJzAnICsgbiA6ICcnICsgbjsgfQogICAgZnVuY3Rpb24gZGF5RGlmZihhS2V5LCBiS2V5KSB7CiAgICAgIGlmICghYUtleSB8fCAhYktleSkgcmV0dXJuIEluZmluaXR5OwogICAgICB2YXIgYSA9IHBhcnNlS2V5KGFLZXkpLCBiID0gcGFyc2VLZXkoYktleSk7CiAgICAgIHJldHVybiBNYXRoLnJvdW5kKChiIC0gYSkgLyA4NjQwMDAwMCk7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZUtleShrKSB7CiAgICAgIHZhciBwID0gU3RyaW5nKGspLnNwbGl0KCctJyk7CiAgICAgIHJldHVybiBEYXRlLlVUQygrcFswXSwgKCtwWzFdKSAtIDEsICtwWzJdKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXIocm9vdCkgewogICAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgICBpZiAoIWF1dGhHdWFyZChyb290KSkgcmV0dXJuOwoKICAgICAgdmFyIHMgPSBnZXRTdHJlYWsoKTsKICAgICAgdmFyIHZpZXcgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcGFnZSB2LXZpZXctLWNoYWxsZW5nZScgfSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKGVsKCdoZWFkZXInLCB7IGNsYXNzOiAndi1zZWN0aW9uX19oZWFkJyB9LAogICAgICAgIGVsKCdkaXYnLCBudWxsLAogICAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1leWVicm93JywgdGV4dDogJ0dyb3d0aCcgfSksCiAgICAgICAgICBlbCgnaDEnLCB7IGNsYXNzOiAndi1zZWN0aW9uX190aXRsZScsIHN0eWxlOiB7IGZvbnRTaXplOiAndmFyKC0tZm9udC1sYXJnZS10aXRsZSwgMzRweCknIH0sIHRleHQ6ICdQb3N0LWEtZGF5IGNoYWxsZW5nZScgfSksCiAgICAgICAgICBlbCgncCcsIHsgY2xhc3M6ICd2LXNlY3Rpb25fX3N1YicsIHRleHQ6ICdDcmVhdGUgYW5kIHNoYXJlIGRhaWx5LiBFYXJuICcgKyBEQUlMWV9DUkVESVRTICsgJyBjcmVkaXRzIGVhY2ggZGF5IGFuZCBhICcgKyBCT05VU19DUkVESVRTICsgJy1jcmVkaXQgYm9udXMgYXQgZGF5ICcgKyBHT0FMICsgJy4nIH0pKSkpOwoKICAgICAgdmFyIHRvZGF5ID0gdG9kYXlLZXkoKTsKICAgICAgdmFyIGxvZ2dlZFRvZGF5ID0gcy5sYXN0RGF5ID09PSB0b2RheTsKICAgICAgdmFyIGJyb2tlbiA9IHMubGFzdERheSAmJiBkYXlEaWZmKHMubGFzdERheSwgdG9kYXkpID4gKEdSQUNFX0RBWVMgKyAxKTsKICAgICAgdmFyIGxpdmVDb3VudCA9IGJyb2tlbiA/IDAgOiBzLmNvdW50OwogICAgICB2YXIgcGN0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgbGl2ZUNvdW50IC8gR09BTCkpOwoKICAgICAgdmFyIGhlcm8gPSBlbCgnc2VjdGlvbicsIHsKICAgICAgICBjbGFzczogJ2dsYXNzLWNhcmQnLAogICAgICAgIHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZ2FwOiAndmFyKC0tc3BhY2UtbGcsIDI0cHgpJywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGZsZXhXcmFwOiAnd3JhcCcgfQogICAgICB9LAogICAgICAgIHJpbmdOb2RlKHBjdCwgbGl2ZUNvdW50KSwKICAgICAgICBlbCgnZGl2JywgeyBzdHlsZTogeyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICc2cHgnLCBmbGV4OiAnMSAxIDIwMHB4JywgbWluV2lkdGg6ICcwJyB9IH0sCiAgICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbW9ubycsIHN0eWxlOiB7IGZvbnRTaXplOiAndmFyKC0tZm9udC10aXRsZTMsIDIwcHgpJywgZm9udFdlaWdodDogJzcwMCcgfSwgdGV4dDogJ0RheSAnICsgbGl2ZUNvdW50ICsgJyAvICcgKyBHT0FMIH0pLAogICAgICAgICAgZWwoJ2RpdicsIHsgc3R5bGU6IHsgZGlzcGxheTogJ2ZsZXgnLCBhbGlnbkl0ZW1zOiAnY2VudGVyJywgZ2FwOiAnNnB4JywgY29sb3I6ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknIH0gfSwKICAgICAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jdGFfX2ljb24nLCBzdHlsZTogeyB3aWR0aDogJzE4cHgnLCBoZWlnaHQ6ICcxOHB4JyB9IH0sIGljb24oJ2ZsYW1lJykpLAogICAgICAgICAgICBlbCgnc3BhbicsIHsgdGV4dDogbGl2ZUNvdW50ID4gMCA/IChsaXZlQ291bnQgKyAnLWRheSBzdHJlYWsnKSA6ICdTdGFydCB5b3VyIHN0cmVhaycgfSkpLAogICAgICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTRweCcsIG1hcmdpbjogJzAnIH0sIHRleHQ6IGJyb2tlbgogICAgICAgICAgICA/ICdZb3VyIHN0cmVhayBsYXBzZWQgcGFzdCB0aGUgJyArIEdSQUNFX0RBWVMgKyAnLWRheSBncmFjZSB3aW5kb3cuIFBvc3QgdG9kYXkgdG8gYmVnaW4gYWdhaW4uJwogICAgICAgICAgICA6IChsb2dnZWRUb2RheSA/ICdMb2dnZWQgZm9yIHRvZGF5IOKAlCBjb21lIGJhY2sgdG9tb3Jyb3cgdG8ga2VlcCBpdCBnb2luZy4nIDogJ1Bvc3QgdG9kYXkgdG8gZXh0ZW5kIHlvdXIgc3RyZWFrLicpIH0pKQogICAgICApOwogICAgICB2aWV3LmFwcGVuZENoaWxkKGhlcm8pOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChlbCgnc2VjdGlvbicsIHsgY2xhc3M6ICd2LWdyaWQgdi1ncmlkLS00IGdsYXNzLWNhcmQnLCBzdHlsZTogeyBnYXA6ICd2YXIoLS1zcGFjZS1tZCwgMTVweCknIH0gfSwKICAgICAgICBzdGF0Qm94KGxpdmVDb3VudCwgJ0N1cnJlbnQgc3RyZWFrJyksCiAgICAgICAgc3RhdEJveChNYXRoLm1heChzLmJlc3QgfHwgMCwgbGl2ZUNvdW50KSwgJ0Jlc3Qgc3RyZWFrJyksCiAgICAgICAgc3RhdEJveCgocy50b3RhbCB8fCAwKSwgJ0RheXMgcG9zdGVkJyksCiAgICAgICAgc3RhdEJveCgoKHMudG90YWwgfHwgMCkgKiBEQUlMWV9DUkVESVRTKSwgJ0NyZWRpdHMgZWFybmVkJykpKTsKCiAgICAgIHZhciBsb2dCdG4gPSBjdGFCdXR0b24obG9nZ2VkVG9kYXkgPyAnUG9zdGVkIHRvZGF5JyA6ICdJIHBvc3RlZCB0b2RheScsIHsKICAgICAgICBwcmltYXJ5OiAhbG9nZ2VkVG9kYXksIGdob3N0OiBsb2dnZWRUb2RheSwgYmxvY2s6IHRydWUsIGljb246IGxvZ2dlZFRvZGF5ID8gJ2NoZWNrbWFyaycgOiAncGx1cycKICAgICAgfSk7CiAgICAgIGxvZ0J0bi5kaXNhYmxlZCA9IGxvZ2dlZFRvZGF5OwogICAgICBsb2dCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHN0ID0gZ2V0U3RyZWFrKCk7CiAgICAgICAgdmFyIHQgPSB0b2RheUtleSgpOwogICAgICAgIGlmIChzdC5sYXN0RGF5ID09PSB0KSByZXR1cm47CiAgICAgICAgdmFyIGJyayA9IHN0Lmxhc3REYXkgJiYgZGF5RGlmZihzdC5sYXN0RGF5LCB0KSA+IChHUkFDRV9EQVlTICsgMSk7CiAgICAgICAgc3QuY291bnQgPSBicmsgPyAxIDogKHN0LmNvdW50IHx8IDApICsgMTsKICAgICAgICBzdC5sYXN0RGF5ID0gdDsKICAgICAgICBzdC50b3RhbCA9IChzdC50b3RhbCB8fCAwKSArIDE7CiAgICAgICAgc3QuYmVzdCA9IE1hdGgubWF4KHN0LmJlc3QgfHwgMCwgc3QuY291bnQpOwogICAgICAgIHNldFN0cmVhayhzdCk7CiAgICAgICAgaWYgKHN0LmNvdW50ID49IEdPQUwpIHsKICAgICAgICAgIHRvYXN0KEdPQUwgKyAnLWRheSBjaGFsbGVuZ2UgY29tcGxldGUhICcgKyBCT05VU19DUkVESVRTICsgJyBib251cyBjcmVkaXRzIHVubG9ja2VkLicsICdzdWNjZXNzJyk7CiAgICAgICAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jb25mZXR0aSA9PT0gJ2Z1bmN0aW9uJykgeyB0cnkgeyBWLnVpLmNvbmZldHRpKCk7IH0gY2F0Y2ggKGUpIHt9IH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG9hc3QoJ0RheSAnICsgc3QuY291bnQgKyAnIGxvZ2dlZCDCtyArJyArIERBSUxZX0NSRURJVFMgKyAnIGNyZWRpdHMnLCAnc3VjY2VzcycpOwogICAgICAgICAgaWYgKHN0LmNvdW50ID4gMSAmJiBWLnVpICYmIHR5cGVvZiBWLnVpLmNvbmZldHRpID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IFYudWkuY29uZmV0dGkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgICAgIH0KICAgICAgICByZW5kZXIocm9vdCk7CiAgICAgIH0pOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3Ytc3RhY2stc20nIH0sCiAgICAgICAgbG9nQnRuLAogICAgICAgIGN0YUJ1dHRvbignQ3JlYXRlIHNvbWV0aGluZyBub3cnLCB7IGdob3N0OiB0cnVlLCBibG9jazogdHJ1ZSwgaWNvbjogJ3NwYXJrbGVzJywgb25DbGljazogZnVuY3Rpb24gKCkgeyBnbygnIy9jcmVhdGUnKTsgfSB9KSkpOwoKICAgICAgdmlldy5hcHBlbmRDaGlsZChjYWxlbmRhck5vZGUobGl2ZUNvdW50KSk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEycHgnIH0sIHRleHQ6ICdEYWlseSBhbmQgYm9udXMgY3JlZGl0cyBhcmUgY29uZmlybWVkIHNlcnZlci1zaWRlLiBQb3N0cyBtdXN0IGluY2x1ZGUgdGhlIEB2YW1wIG9yICN2YW1wIHRhZyB0byBxdWFsaWZ5LicgfSkpOwoKICAgICAgcm9vdC5hcHBlbmRDaGlsZCh2aWV3KTsKICAgIH0KCiAgICBmdW5jdGlvbiByaW5nTm9kZShwY3QsIGNvdW50KSB7CiAgICAgIHZhciBzaXplID0gMTMyLCBzdHJva2UgPSAxMiwgciA9IChzaXplIC0gc3Ryb2tlKSAvIDIsIGMgPSAyICogTWF0aC5QSSAqIHI7CiAgICAgIHZhciBvZmYgPSBjICogKDEgLSBwY3QpOwogICAgICB2YXIgc3ZnTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOwogICAgICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCAnc3ZnJyk7CiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCAnMCAwICcgKyBzaXplICsgJyAnICsgc2l6ZSk7CiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgc2l6ZSk7IHN2Zy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHNpemUpOwogICAgICBzdmcuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgIHZhciBiZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzdmdOUywgJ2NpcmNsZScpOwogICAgICBiZy5zZXRBdHRyaWJ1dGUoJ2N4Jywgc2l6ZSAvIDIpOyBiZy5zZXRBdHRyaWJ1dGUoJ2N5Jywgc2l6ZSAvIDIpOyBiZy5zZXRBdHRyaWJ1dGUoJ3InLCByKTsKICAgICAgYmcuc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTsgYmcuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBzdHJva2UpOwogICAgICBiZy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICd2YXIoLS12LWxpbmUsIHJnYmEoMjQ1LDI0NSwyNDcsLjE1KSknKTsKICAgICAgdmFyIGZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCAnY2lyY2xlJyk7CiAgICAgIGZnLnNldEF0dHJpYnV0ZSgnY3gnLCBzaXplIC8gMik7IGZnLnNldEF0dHJpYnV0ZSgnY3knLCBzaXplIC8gMik7IGZnLnNldEF0dHJpYnV0ZSgncicsIHIpOwogICAgICBmZy5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnbm9uZScpOyBmZy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsIHN0cm9rZSk7CiAgICAgIGZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgJ3ZhcigtLXZhbXAtYWNjZW50LCAjNTI5N0Y4KScpOwogICAgICBmZy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lY2FwJywgJ3JvdW5kJyk7CiAgICAgIGZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWRhc2hhcnJheScsIGMpOwogICAgICBmZy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1kYXNob2Zmc2V0JywgYyk7CiAgICAgIGZnLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgJ3JvdGF0ZSgtOTAgJyArIChzaXplIC8gMikgKyAnICcgKyAoc2l6ZSAvIDIpICsgJyknKTsKICAgICAgc3ZnLmFwcGVuZENoaWxkKGJnKTsgc3ZnLmFwcGVuZENoaWxkKGZnKTsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHsgZmcuc3R5bGUudHJhbnNpdGlvbiA9ICdzdHJva2UtZGFzaG9mZnNldCA5MDBtcyBjdWJpYy1iZXppZXIoLjIyLDEsLjM2LDEpJzsgZmcuc2V0QXR0cmlidXRlKCdzdHJva2UtZGFzaG9mZnNldCcsIG9mZik7IH0pOwogICAgICB2YXIgbGFiZWwgPSBlbCgnZGl2JywgewogICAgICAgIHN0eWxlOiB7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCBpbnNldDogJzAnLCBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBhbGlnbkl0ZW1zOiAnY2VudGVyJywganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInIH0KICAgICAgfSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LW1vbm8nLCBzdHlsZTogeyBmb250U2l6ZTogJzM0cHgnLCBmb250V2VpZ2h0OiAnNzAwJywgbGluZUhlaWdodDogJzEnIH0sIHRleHQ6IFN0cmluZyhjb3VudCkgfSksCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1tdXRlZCcsIHN0eWxlOiB7IGZvbnRTaXplOiAnMTNweCcgfSwgdGV4dDogJy8gJyArIEdPQUwgfSkpOwogICAgICByZXR1cm4gZWwoJ2RpdicsIHsgc3R5bGU6IHsgcG9zaXRpb246ICdyZWxhdGl2ZScsIHdpZHRoOiBzaXplICsgJ3B4JywgaGVpZ2h0OiBzaXplICsgJ3B4JywgZmxleDogJzAgMCBhdXRvJyB9IH0sIHN2ZywgbGFiZWwpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNhbGVuZGFyTm9kZShjb3VudCkgewogICAgICB2YXIgZ3JpZCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAnZ2xhc3MtY2FyZCcsIHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJ3ZhcigtLXNwYWNlLXNtLCA5cHgpJyB9IH0pOwogICAgICBncmlkLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtZXllYnJvdycsIHRleHQ6ICdQcm9ncmVzcycgfSkpOwogICAgICB2YXIgZG90cyA9IGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdncmlkJywgZ3JpZFRlbXBsYXRlQ29sdW1uczogJ3JlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgyMnB4LCAxZnIpKScsIGdhcDogJzhweCcgfSB9KTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gR09BTDsgaSsrKSB7CiAgICAgICAgdmFyIGRvbmUgPSBpIDw9IGNvdW50OwogICAgICAgIGRvdHMuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7CiAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICB3aWR0aDogJzIycHgnLCBoZWlnaHQ6ICcyMnB4JywgYm9yZGVyUmFkaXVzOiAnNnB4JywKICAgICAgICAgICAgYmFja2dyb3VuZDogZG9uZSA/ICd2YXIoLS12YW1wLWFjY2VudCwgIzUyOTdGOCknIDogJ3ZhcigtLXYtY2FyZC1iZywgcmdiYSgyNTUsMjU1LDI1NSwuMDQpKScsCiAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAnICsgKGRvbmUgPyAndHJhbnNwYXJlbnQnIDogJ3ZhcigtLXYtbGluZSwgcmdiYSgyNDUsMjQ1LDI0NywuMTUpKScpCiAgICAgICAgICB9LAogICAgICAgICAgdGl0bGU6ICdEYXkgJyArIGksICdhcmlhLWxhYmVsJzogJ0RheSAnICsgaSArIChkb25lID8gJyBjb21wbGV0ZScgOiAnJykKICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgZ3JpZC5hcHBlbmRDaGlsZChkb3RzKTsKICAgICAgcmV0dXJuIGdyaWQ7CiAgICB9CgogICAgZnVuY3Rpb24gc3RhdEJveCh2YWx1ZSwgbGFiZWwpIHsKICAgICAgcmV0dXJuIGVsKCdkaXYnLCB7IHN0eWxlOiB7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIGdhcDogJzJweCcgfSB9LAogICAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1tb25vJywgc3R5bGU6IHsgZm9udFNpemU6ICcyMnB4JywgZm9udFdlaWdodDogJzcwMCcgfSwgdGV4dDogU3RyaW5nKHZhbHVlKSB9KSwKICAgICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtbXV0ZWQnLCBzdHlsZTogeyBmb250U2l6ZTogJzEycHgnIH0sIHRleHQ6IGxhYmVsIH0pKTsKICAgIH0KCiAgICByZXR1cm4geyByZW5kZXI6IHJlbmRlciB9OwogIH0pKCk7CgogIGZ1bmN0aW9uIG1heWJlQXBwbHlRdWVyeVJlZmVycmFsKHBhcmFtcykgewogICAgdmFyIGNvZGUgPSBudWxsOwogICAgaWYgKHBhcmFtcyAmJiAocGFyYW1zLnIgfHwgcGFyYW1zLnJlZikpIGNvZGUgPSBwYXJhbXMuciB8fCBwYXJhbXMucmVmOwogICAgaWYgKCFjb2RlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHNwID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTsKICAgICAgICBjb2RlID0gc3AuZ2V0KCdyJykgfHwgc3AuZ2V0KCdyZWYnKTsKICAgICAgfSBjYXRjaCAoZSkge30KICAgIH0KICAgIGlmICghY29kZSkgcmV0dXJuOwogICAgY29kZSA9IFN0cmluZyhjb2RlKS50cmltKCkudG9VcHBlckNhc2UoKTsKICAgIGlmICghY29kZSkgcmV0dXJuOwogICAgaWYgKGxzR2V0KCdyZWZlcnJhbEFwcGxpZWQnLCAnJykgPT09IGNvZGUpIHJldHVybjsKICAgIGxzU2V0KCdyZWZlcnJhbENvZGUnLCBjb2RlKTsKICAgIGlmIChWLmFwaSAmJiB0eXBlb2YgVi5hcGkuYXR0cmlidXRlUmVmZXJyYWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgVi5hcGkuYXR0cmlidXRlUmVmZXJyYWwoY29kZSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgbHNTZXQoJ3JlZmVycmFsQXBwbGllZCcsIGNvZGUpOwogICAgICAgIHRvYXN0KCdSZWZlcnJhbCBjb2RlIGFwcGxpZWQ6ICcgKyBjb2RlLCAnc3VjY2VzcycpOwogICAgICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmNvbmZldHRpID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IFYudWkuY29uZmV0dGkoKTsgfSBjYXRjaCAoZSkge30gfQogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CiAgICB9CiAgfQoKICBWLmFwcGx5UGVuZGluZ1JlZmVycmFsID0gbWF5YmVBcHBseVF1ZXJ5UmVmZXJyYWw7Cgp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9wYXkuanMgPT09PT0gKi8KKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwogIFYucGF5ID0gVi5wYXkgfHwge307CgogIHZhciBQQUNLUyA9IFsKICAgIHsKICAgICAgaWQ6ICdjcmVkaXRzXzEwMDAnLAogICAgICBjcmVkaXRzOiAxMDAwLAogICAgICBwcmljZTogOS45OSwKICAgICAgcHJpY2VMYWJlbDogJyQ5Ljk5JywKICAgICAgaGVhZGxpbmU6ICdTdGFydGVyJywKICAgICAgYmx1cmI6ICdBIHNvbGlkIHJ1biBvZiBnZW5lcmF0aW9ucyB0byBnZXQgZ29pbmcuJywKICAgICAgYWNjZW50VmFyOiAnLS12LWFjY2VudCcKICAgIH0sCiAgICB7CiAgICAgIGlkOiAnY3JlZGl0c18yNTAwJywKICAgICAgY3JlZGl0czogMjUwMCwKICAgICAgcHJpY2U6IDE5Ljk5LAogICAgICBwcmljZUxhYmVsOiAnJDE5Ljk5JywKICAgICAgaGVhZGxpbmU6ICdDcmVhdG9yJywKICAgICAgYmx1cmI6ICdPdXIgbW9zdCBwb3B1bGFyIHBhY2sg4oCUIGJldHRlciB2YWx1ZSBwZXIgY3JlZGl0LicsCiAgICAgIHBvcHVsYXI6IHRydWUsCiAgICAgIGJvbnVzTGFiZWw6ICcrMjUlIGNyZWRpdHMnLAogICAgICBhY2NlbnRWYXI6ICctLXZhbXAtYWNjZW50JwogICAgfSwKICAgIHsKICAgICAgaWQ6ICdjcmVkaXRzXzYwMDAnLAogICAgICBjcmVkaXRzOiA2MDAwLAogICAgICBwcmljZTogMzkuOTksCiAgICAgIHByaWNlTGFiZWw6ICckMzkuOTknLAogICAgICBoZWFkbGluZTogJ1N0dWRpbycsCiAgICAgIGJsdXJiOiAnQmVzdCB2YWx1ZS4gRm9yIGhlYXZ5LCBiYXRjaCBhbmQgcHJvIHdvcmtmbG93cy4nLAogICAgICBib251c0xhYmVsOiAnKzUwJSBjcmVkaXRzJywKICAgICAgYWNjZW50VmFyOiAnLS12LWFjY2VudC1kZWVwJwogICAgfQogIF07CgogIFBBQ0tTLmZvckVhY2goZnVuY3Rpb24gKHApIHsKICAgIHAucGVyQ3JlZGl0ID0gcC5wcmljZSAvIHAuY3JlZGl0czsKICB9KTsKICB2YXIgQkVTVCA9IFBBQ0tTLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgewogICAgcmV0dXJuIGIucGVyQ3JlZGl0IDwgYS5wZXJDcmVkaXQgPyBiIDogYTsKICB9LCBQQUNLU1swXSk7CgogIFYucGF5LnBhY2tzID0gUEFDS1M7CgogIFYucGF5LnBhY2sgPSBmdW5jdGlvbiAocHJvZHVjdElEKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IFBBQ0tTLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChQQUNLU1tpXS5pZCA9PT0gcHJvZHVjdElEKSByZXR1cm4gUEFDS1NbaV07CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9OwoKICBmdW5jdGlvbiBlbCgpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBWLnVpLmVsLmFwcGx5KFYudWksIGFyZ3VtZW50cyk7CiAgICB9CiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICB2YXIgdGFnID0gYXJncy5zaGlmdCgpOwogICAgdmFyIGF0dHJzID0gKGFyZ3NbMF0gJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdvYmplY3QnICYmICEoYXJnc1swXSBpbnN0YW5jZW9mIE5vZGUpKSA/IGFyZ3Muc2hpZnQoKSA6IHt9OwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBPYmplY3Qua2V5cyhhdHRycyB8fCB7fSkuZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICB2YXIgdiA9IGF0dHJzW2tdOwogICAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09IGZhbHNlKSByZXR1cm47CiAgICAgIGlmIChrID09PSAnY2xhc3MnKSBub2RlLmNsYXNzTmFtZSA9IHY7CiAgICAgIGVsc2UgaWYgKGsgPT09ICd0ZXh0Jykgbm9kZS50ZXh0Q29udGVudCA9IHY7CiAgICAgIGVsc2UgaWYgKGsgPT09ICdodG1sJykgbm9kZS5pbm5lckhUTUwgPSB2OwogICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHYpOwogICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ2RhdGEtJykgPT09IDAgfHwgay5pbmRleE9mKCdhcmlhLScpID09PSAwKSBub2RlLnNldEF0dHJpYnV0ZShrLCB2KTsKICAgICAgZWxzZSBub2RlW2tdID0gdjsKICAgIH0pOwogICAgYXJncy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjID09IG51bGwgfHwgYyA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgbm9kZS5hcHBlbmRDaGlsZChjLm5vZGVUeXBlID8gYyA6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjKSkpOwogICAgfSk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIGljb24obmFtZSkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaWNvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgb3V0ID0gVi51aS5pY29uKG5hbWUpOwogICAgICBpZiAodHlwZW9mIG91dCA9PT0gJ3N0cmluZycpIHsKICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICBzcGFuLmNsYXNzTmFtZSA9ICd2LWljbyc7CiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICBzcGFuLmlubmVySFRNTCA9IG91dDsKICAgICAgICByZXR1cm4gc3BhbjsKICAgICAgfQogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKICB9CgogIGZ1bmN0aW9uIHRvYXN0KG1zZywga2luZCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkudG9hc3QgPT09ICdmdW5jdGlvbicpIFYudWkudG9hc3QobXNnLCBraW5kIHx8ICdpbmZvJyk7CiAgICBlbHNlIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLmVtaXQgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuZW1pdCgndG9hc3QnLCB7IG1lc3NhZ2U6IG1zZywga2luZDoga2luZCB8fCAnaW5mbycgfSk7CiAgfQoKICBmdW5jdGlvbiBjb25mZXR0aSgpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmNvbmZldHRpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7IFYudWkuY29uZmV0dGkoKTsgfSBjYXRjaCAoZSkge30KICAgIH0KICB9CgogIGZ1bmN0aW9uIGdvKGhhc2gpIHsKICAgIGlmIChWLnJvdXRlciAmJiB0eXBlb2YgVi5yb3V0ZXIuZ28gPT09ICdmdW5jdGlvbicpIFYucm91dGVyLmdvKGhhc2gpOwogICAgZWxzZSB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgfQoKICBmdW5jdGlvbiBiYWxhbmNlKCkgewogICAgdmFyIGMgPSAoVi5zdGF0ZSAmJiBWLnN0YXRlLmNyZWRpdHMpOwogICAgYyA9ICh0eXBlb2YgYyA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoYykpID8gYyA6IChWLnN0b3JlICYmIFYuc3RvcmUuZ2V0ID8gVi5zdG9yZS5nZXQoJ2NyZWRpdHMnKSA6IDApOwogICAgcmV0dXJuICh0eXBlb2YgYyA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoYykpID8gYyA6IDA7CiAgfQoKICBmdW5jdGlvbiBpc0F1dGhlZCgpIHsKICAgIHJldHVybiAhIShWLmF1dGggJiYgdHlwZW9mIFYuYXV0aC5pc0F1dGhlZCA9PT0gJ2Z1bmN0aW9uJyAmJiBWLmF1dGguaXNBdXRoZWQoKSk7CiAgfQoKICBmdW5jdGlvbiBmbXRJbnQobikgewogICAgdHJ5IHsgcmV0dXJuIE51bWJlcihuKS50b0xvY2FsZVN0cmluZygnZW4tVVMnKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gU3RyaW5nKG4pOyB9CiAgfQoKICBWLnBheS5yZWZyZXNoQ3JlZGl0cyA9IGZ1bmN0aW9uICgpIHsKICAgIGlmICghaXNBdXRoZWQoKSB8fCAhVi5hcGkgfHwgdHlwZW9mIFYuYXBpLmNyZWRpdHMgIT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShiYWxhbmNlKCkpOwogICAgfQogICAgcmV0dXJuIFYuYXBpLmNyZWRpdHMoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgdmFyIG4gPSByZXMgJiYgdHlwZW9mIHJlcy5jcmVkaXRzICE9PSAndW5kZWZpbmVkJyA/IHBhcnNlSW50KHJlcy5jcmVkaXRzLCAxMCkgOiBOYU47CiAgICAgIGlmICghaXNGaW5pdGUobikpIG4gPSBiYWxhbmNlKCk7CiAgICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLnNldCA9PT0gJ2Z1bmN0aW9uJykgVi5zdG9yZS5zZXQoJ2NyZWRpdHMnLCBuKTsKICAgICAgZWxzZSBpZiAoVi5zdGF0ZSkgVi5zdGF0ZS5jcmVkaXRzID0gbjsKICAgICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUuZW1pdCA9PT0gJ2Z1bmN0aW9uJykgVi5zdG9yZS5lbWl0KCdjcmVkaXRzOmNoYW5nZWQnLCBuKTsKICAgICAgcmV0dXJuIG47CiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBiYWxhbmNlKCk7CiAgICB9KTsKICB9OwoKICBWLnBheS5yZXF1aXJlQ3JlZGl0cyA9IGZ1bmN0aW9uIChjb3N0KSB7CiAgICB2YXIgbmVlZCA9IHBhcnNlSW50KGNvc3QsIDEwKTsKICAgIGlmICghaXNGaW5pdGUobmVlZCkgfHwgbmVlZCA8PSAwKSByZXR1cm4gdHJ1ZTsKICAgIHZhciBoYXZlID0gYmFsYW5jZSgpOwogICAgaWYgKGhhdmUgPj0gbmVlZCkgcmV0dXJuIHRydWU7CiAgICB2YXIgc2hvcnQgPSBuZWVkIC0gaGF2ZTsKICAgIHRvYXN0KAogICAgICBoYXZlIDw9IDAKICAgICAgICA/ICJZb3UncmUgb3V0IG9mIGNyZWRpdHMg4oCUIGFkZCBtb3JlIHRvIGtlZXAgY3JlYXRpbmcuIgogICAgICAgIDogJ05vdCBlbm91Z2ggY3JlZGl0cyDigJQgeW91IG5lZWQgJyArIGZtdEludChzaG9ydCkgKyAnIG1vcmUuJywKICAgICAgJ3dhcm5pbmcnCiAgICApOwogICAgVi5wYXkub3Blbih7IG5lZWQ6IG5lZWQsIGNvc3Q6IG5lZWQgfSk7CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgVi5wYXkub3BlbiA9IGZ1bmN0aW9uIChvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBuZWVkID0gcGFyc2VJbnQob3B0cy5uZWVkICE9IG51bGwgPyBvcHRzLm5lZWQgOiBvcHRzLmNvc3QsIDEwKTsKICAgIHZhciBxID0gJyc7CiAgICBpZiAoaXNGaW5pdGUobmVlZCkgJiYgbmVlZCA+IDApIHEgPSAnP25lZWQ9JyArIG5lZWQ7CiAgICBnbygnIy9wYXl3YWxsJyArIHEpOwogIH07CgogIFYucGF5LmJ1eSA9IGZ1bmN0aW9uIChwcm9kdWN0SUQsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIHBhY2sgPSBWLnBheS5wYWNrKHByb2R1Y3RJRCk7CiAgICBpZiAoIXBhY2spIHsKICAgICAgdG9hc3QoJ1RoYXQgcGFjayBpcyB1bmF2YWlsYWJsZSByaWdodCBub3cuJywgJ2Vycm9yJyk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwogICAgfQogICAgaWYgKCFpc0F1dGhlZCgpKSB7CiAgICAgIHRvYXN0KCdTaWduIGluIHRvIGFkZCBjcmVkaXRzLicsICdpbmZvJyk7CiAgICAgIGdvKCcjL2F1dGg/bmV4dD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KCcjL3BheXdhbGwnKSk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwogICAgfQogICAgaWYgKCFWLmFwaSB8fCB0eXBlb2YgVi5hcGkuY2hlY2tvdXQgIT09ICdmdW5jdGlvbicpIHsKICAgICAgdG9hc3QoJ0NoZWNrb3V0IGlzbuKAmXQgYXZhaWxhYmxlIHlldC4gUGxlYXNlIHRyeSBhZ2FpbiBzb29uLicsICdlcnJvcicpOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsKICAgIH0KCiAgICB2YXIgYnRuID0gb3B0cy5idXR0b24gfHwgbnVsbDsKICAgIHZhciByZXN0b3JlID0gbG9ja0J1dHRvbihidG4sICdSZWRpcmVjdGluZ+KApicpOwoKICAgIHJldHVybiBWLmFwaS5jaGVja291dChwcm9kdWN0SUQpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICB2YXIgdXJsID0gcmVzICYmIHJlcy51cmw7CiAgICAgIGlmICghdXJsIHx8IHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduby11cmwnKTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3ZhbXBfcGF5X3BlbmRpbmcnLCBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICBwcm9kdWN0SUQ6IHByb2R1Y3RJRCwgY3JlZGl0czogcGFjay5jcmVkaXRzLCBhdDogRGF0ZS5ub3coKQogICAgICAgIH0pKTsKICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgdG9hc3QoJ09wZW5pbmcgc2VjdXJlIGNoZWNrb3V04oCmJywgJ2luZm8nKTsKICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmwpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgcmVzdG9yZSgpOwogICAgICB2YXIgc3RhdHVzID0gZXJyICYmIChlcnIuc3RhdHVzIHx8IGVyci5jb2RlKTsKICAgICAgaWYgKHN0YXR1cyA9PT0gNDA0IHx8IHN0YXR1cyA9PT0gNDA1IHx8IHN0YXR1cyA9PT0gNTAxIHx8IHN0YXR1cyA9PT0gNTAzKSB7CiAgICAgICAgdG9hc3QoJ0NyZWRpdCBwdXJjaGFzZXMgYXJlIGxhdW5jaGluZyBzb29uIOKAlCBjaGVja291dCBpc27igJl0IGxpdmUgeWV0LicsICd3YXJuaW5nJyk7CiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHsKICAgICAgICB0b2FzdCgnWW91ciBzZXNzaW9uIGV4cGlyZWQuIFBsZWFzZSBzaWduIGluIGFnYWluLicsICdlcnJvcicpOwogICAgICAgIGdvKCcjL2F1dGg/bmV4dD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KCcjL3BheXdhbGwnKSk7CiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MjkpIHsKICAgICAgICB0b2FzdCgnVG9vIG1hbnkgYXR0ZW1wdHMg4oCUIGdpdmUgaXQgYSBtb21lbnQgYW5kIHJldHJ5LicsICd3YXJuaW5nJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9hc3QoJ0NvdWxkbuKAmXQgc3RhcnQgY2hlY2tvdXQuIFBsZWFzZSB0cnkgYWdhaW4uJywgJ2Vycm9yJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CiAgfTsKCiAgZnVuY3Rpb24gbG9ja0J1dHRvbihidG4sIGxhYmVsKSB7CiAgICBpZiAoIWJ0bikgcmV0dXJuIGZ1bmN0aW9uICgpIHt9OwogICAgdmFyIHByZXZIdG1sID0gYnRuLmlubmVySFRNTDsKICAgIHZhciBwcmV2RGlzYWJsZWQgPSBidG4uZGlzYWJsZWQ7CiAgICBidG4uZGlzYWJsZWQgPSB0cnVlOwogICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1idXN5JywgJ3RydWUnKTsKICAgIGJ0bi5jbGFzc0xpc3QuYWRkKCdpcy1sb2FkaW5nJyk7CiAgICB2YXIgc3AgPSAoVi51aSAmJiB0eXBlb2YgVi51aS5zcGlubmVyID09PSAnZnVuY3Rpb24nKSA/IFYudWkuc3Bpbm5lcigpIDogbnVsbDsKICAgIGJ0bi5pbm5lckhUTUwgPSAnJzsKICAgIGlmIChzcCkgYnRuLmFwcGVuZENoaWxkKHNwLm5vZGVUeXBlID8gc3AgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJykpOwogICAgYnRuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgJyArIChsYWJlbCB8fCAnV29ya2luZ+KApicpKSk7CiAgICByZXR1cm4gZnVuY3Rpb24gcmVzdG9yZSgpIHsKICAgICAgYnRuLmRpc2FibGVkID0gcHJldkRpc2FibGVkOwogICAgICBidG4ucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWJ1c3knKTsKICAgICAgYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWxvYWRpbmcnKTsKICAgICAgYnRuLmlubmVySFRNTCA9IHByZXZIdG1sOwogICAgfTsKICB9CgogIFYucGF5LmhhbmRsZVB1cmNoYXNlUmV0dXJuID0gZnVuY3Rpb24gKHBhcmFtcykgewogICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogICAgdmFyIHN0YXR1cyA9IHBhcmFtcy5wdXJjaGFzZSB8fCBwYXJhbXMuY2hlY2tvdXQ7CgogICAgaWYgKHN0YXR1cyA9PT0gJ2NhbmNlbCcgfHwgc3RhdHVzID09PSAnY2FuY2VsbGVkJyB8fCBzdGF0dXMgPT09ICdjYW5jZWxlZCcpIHsKICAgICAgY2xlYXJQZW5kaW5nKCk7CiAgICAgIHRvYXN0KCdDaGVja291dCBjYW5jZWxlZCDigJQgbm8gY2hhcmdlIHdhcyBtYWRlLicsICdpbmZvJyk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYmFsYW5jZSgpKTsKICAgIH0KICAgIGlmIChzdGF0dXMgIT09ICdzdWNjZXNzJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShiYWxhbmNlKCkpOwoKICAgIHZhciBwZW5kaW5nID0gcmVhZFBlbmRpbmcoKTsKICAgIGNsZWFyUGVuZGluZygpOwogICAgdmFyIGJlZm9yZSA9IGJhbGFuY2UoKTsKCiAgICByZXR1cm4gcG9sbENyZWRpdHNVbnRpbENoYW5nZWQoYmVmb3JlLCBwZW5kaW5nID8gcGVuZGluZy5jcmVkaXRzIDogMCkudGhlbihmdW5jdGlvbiAoYWZ0ZXIpIHsKICAgICAgdmFyIGdhaW5lZCA9ICh0eXBlb2YgYWZ0ZXIgPT09ICdudW1iZXInICYmIHR5cGVvZiBiZWZvcmUgPT09ICdudW1iZXInKSA/IChhZnRlciAtIGJlZm9yZSkgOiAwOwogICAgICBjb25mZXR0aSgpOwogICAgICBpZiAoZ2FpbmVkID4gMCkgewogICAgICAgIHRvYXN0KCdQYXltZW50IGNvbXBsZXRlIOKAlCAnICsgZm10SW50KGdhaW5lZCkgKyAnIGNyZWRpdHMgYWRkZWQuJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSBlbHNlIGlmIChwZW5kaW5nICYmIHBlbmRpbmcuY3JlZGl0cykgewogICAgICAgIHRvYXN0KCdQYXltZW50IHJlY2VpdmVkIOKAlCAnICsgZm10SW50KHBlbmRpbmcuY3JlZGl0cykgKyAnIGNyZWRpdHMgYXJlIG9uIHRoZSB3YXkuJywgJ3N1Y2Nlc3MnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2FzdCgnUGF5bWVudCBjb21wbGV0ZSDigJQgY3JlZGl0cyBhZGRlZC4nLCAnc3VjY2VzcycpOwogICAgICB9CiAgICAgIHJldHVybiBhZnRlcjsKICAgIH0pOwogIH07CgogIGZ1bmN0aW9uIHBvbGxDcmVkaXRzVW50aWxDaGFuZ2VkKGJlZm9yZSwgZXhwZWN0ZWRHYWluKSB7CiAgICB2YXIgYXR0ZW1wdHMgPSAwOwogICAgdmFyIG1heCA9IDY7CiAgICBmdW5jdGlvbiB0aWNrKCkgewogICAgICByZXR1cm4gVi5wYXkucmVmcmVzaENyZWRpdHMoKS50aGVuKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgYXR0ZW1wdHMrKzsKICAgICAgICB2YXIgY2hhbmdlZCA9ICh0eXBlb2YgbiA9PT0gJ251bWJlcicgJiYgbiA+IGJlZm9yZSk7CiAgICAgICAgaWYgKGNoYW5nZWQgfHwgYXR0ZW1wdHMgPj0gbWF4KSByZXR1cm4gbjsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXNvbHZlKHRpY2soKSk7IH0sIDE1MDApOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiB0aWNrKCk7CiAgfQoKICBmdW5jdGlvbiByZWFkUGVuZGluZygpIHsKICAgIHRyeSB7CiAgICAgIHZhciByYXcgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd2YW1wX3BheV9wZW5kaW5nJyk7CiAgICAgIHJldHVybiByYXcgPyBKU09OLnBhcnNlKHJhdykgOiBudWxsOwogICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogIH0KICBmdW5jdGlvbiBjbGVhclBlbmRpbmcoKSB7CiAgICB0cnkgeyBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCd2YW1wX3BheV9wZW5kaW5nJyk7IH0gY2F0Y2ggKGUpIHt9CiAgfQoKICB2YXIgdmlldyA9IHt9OwogIHZhciBfY2xlYW51cCA9IFtdOwogIHZhciBfaG9zdEVsID0gbnVsbDsKCiAgZnVuY3Rpb24gb24odGFyZ2V0LCBldnQsIGZuLCBvcHRzKSB7CiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldnQsIGZuLCBvcHRzKTsKICAgIF9jbGVhbnVwLnB1c2goZnVuY3Rpb24gKCkgeyB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnQsIGZuLCBvcHRzKTsgfSk7CiAgfQoKICB2aWV3LnJlbmRlciA9IGZ1bmN0aW9uIChyb290LCBwYXJhbXMpIHsKICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTsKICAgIHRlYXJkb3duSW50ZXJuYWwoKTsKICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICByb290LmNsYXNzTGlzdC5hZGQoJ3YtcGF5d2FsbC1ob3N0Jyk7CiAgICBfaG9zdEVsID0gcm9vdDsKCiAgICB2YXIgbmVlZCA9IHBhcnNlSW50KHBhcmFtcy5uZWVkLCAxMCk7CiAgICB2YXIgaGFzTmVlZCA9IGlzRmluaXRlKG5lZWQpICYmIG5lZWQgPiAwOwogICAgdmFyIGhhdmUgPSBiYWxhbmNlKCk7CiAgICB2YXIgc2hvcnRmYWxsID0gaGFzTmVlZCA/IE1hdGgubWF4KDAsIG5lZWQgLSBoYXZlKSA6IDA7CgogICAgcm9vdC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtcGF5d2FsbF9fYmFja2Ryb3AnLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSkpOwoKICAgIHZhciBwYWdlID0gZWwoJ3NlY3Rpb24nLCB7IGNsYXNzOiAndi1wYXl3YWxsJywgJ2FyaWEtbGFiZWwnOiAnQWRkIGNyZWRpdHMnIH0pOwoKICAgIHZhciBoZWFkZXIgPSBlbCgnaGVhZGVyJywgeyBjbGFzczogJ3YtcGF5d2FsbF9faGVhZCcgfSk7CiAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWV5ZWJyb3cnIH0sICdDcmVkaXRzJykpOwogICAgaGVhZGVyLmFwcGVuZENoaWxkKGVsKCdoMScsIHsgY2xhc3M6ICd2LXBheXdhbGxfX3RpdGxlIHYtZ3JhZGllbnQnIH0sICdQb3dlciB5b3VyIGltYWdpbmF0aW9uJykpOwoKICAgIHZhciBzdWIgPSBoYXNOZWVkCiAgICAgID8gKHNob3J0ZmFsbCA+IDAKICAgICAgICAgID8gJ1RoaXMgZ2VuZXJhdGlvbiBuZWVkcyAnICsgZm10SW50KG5lZWQpICsgJyBjcmVkaXRzIOKAlCB5b3UgaGF2ZSAnICsgZm10SW50KGhhdmUpICsgJy4gQWRkICcgKyBmbXRJbnQoc2hvcnRmYWxsKSArICcgb3IgbW9yZSB0byBjb250aW51ZS4nCiAgICAgICAgICA6ICJZb3UncmUgc2V0IOKAlCBidXQgaGVyZSdzIG1vcmUgaWYgeW91IHdhbnQgYSBiaWdnZXIgcnVuLiIpCiAgICAgIDogJ0J1eSBjcmVkaXRzIG9uY2UsIHVzZSB0aGVtIGFueXRpbWUuIEV2ZXJ5IGdlbmVyYXRpb24gc3BlbmRzIGNyZWRpdHMgYmFzZWQgb24gdGhlIG1vZGVsIGFuZCBpbWFnZSBjb3VudC4nOwogICAgaGVhZGVyLmFwcGVuZENoaWxkKGVsKCdwJywgeyBjbGFzczogJ3YtcGF5d2FsbF9fc3ViJyB9LCBzdWIpKTsKCiAgICB2YXIgYmFsUm93ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2JhbGFuY2UnIH0pOwogICAgdmFyIHBpbGwgPSAoVi51aSAmJiB0eXBlb2YgVi51aS5jcmVkaXRzUGlsbCA9PT0gJ2Z1bmN0aW9uJykgPyBWLnVpLmNyZWRpdHNQaWxsKGhhdmUpIDogZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVkaXRzJyB9LCBmbXRJbnQoaGF2ZSkgKyAnIGNyZWRpdHMnKTsKICAgIGJhbFJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2JhbGFuY2UtbGFiZWwnIH0sICdDdXJyZW50IGJhbGFuY2UnKSk7CiAgICBiYWxSb3cuYXBwZW5kQ2hpbGQocGlsbCk7CiAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoYmFsUm93KTsKCiAgICBwYWdlLmFwcGVuZENoaWxkKGhlYWRlcik7CgogICAgdmFyIGdyaWQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtZ3JpZCB2LWdyaWQtLTMgdi1wYXl3YWxsX19ncmlkJyB9KTsKICAgIFBBQ0tTLmZvckVhY2goZnVuY3Rpb24gKHApIHsKICAgICAgZ3JpZC5hcHBlbmRDaGlsZChwYWNrQ2FyZChwLCB7IHJlY29tbWVuZFNob3J0ZmFsbDogc2hvcnRmYWxsIH0pKTsKICAgIH0pOwogICAgcGFnZS5hcHBlbmRDaGlsZChncmlkKTsKCiAgICB2YXIgZmluZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19maW5lIGdsYXNzLWNhcmQnIH0pOwogICAgWwogICAgICB7IGljOiAnc3BhcmtsZXMnLCB0OiAnQ3JlZGl0cyBuZXZlciBleHBpcmUnLCBkOiAnVXNlIHRoZW0gd2hlbmV2ZXIgaW5zcGlyYXRpb24gc3RyaWtlcy4nIH0sCiAgICAgIHsgaWM6ICdsb2NrJywgdDogJ1NlY3VyZSBjaGVja291dCcsIGQ6ICdQYXltZW50cyBoYW5kbGVkIGJ5IFN0cmlwZS4gV2UgbmV2ZXIgc2VlIHlvdXIgY2FyZC4nIH0sCiAgICAgIHsgaWM6ICdib2x0JywgdDogJ0luc3RhbnQgdG9wLXVwJywgZDogJ0NyZWRpdHMgbGFuZCBvbiB5b3VyIGFjY291bnQgbW9tZW50cyBhZnRlciBwYXltZW50LicgfQogICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7CiAgICAgIHZhciBpdGVtID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2ZpbmUtaXRlbScgfSk7CiAgICAgIGl0ZW0uYXBwZW5kQ2hpbGQoaWNvbihmLmljKSk7CiAgICAgIHZhciB0eHQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcGF5d2FsbF9fZmluZS10ZXh0JyB9KTsKICAgICAgdHh0LmFwcGVuZENoaWxkKGVsKCdzdHJvbmcnLCB7fSwgZi50KSk7CiAgICAgIHR4dC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHt9LCBmLmQpKTsKICAgICAgaXRlbS5hcHBlbmRDaGlsZCh0eHQpOwogICAgICBmaW5lLmFwcGVuZENoaWxkKGl0ZW0pOwogICAgfSk7CiAgICBwYWdlLmFwcGVuZENoaWxkKGZpbmUpOwoKICAgIHZhciBmb290ZXIgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtcGF5d2FsbF9fZm9vdCcgfSk7CiAgICB2YXIgYmFjayA9IGVsKCdidXR0b24nLCB7IGNsYXNzOiAndi1jdGEgdi1jdGEtLWdob3N0JywgdHlwZTogJ2J1dHRvbicgfSwgJ01heWJlIGxhdGVyJyk7CiAgICBvbihiYWNrLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICh3aW5kb3cuaGlzdG9yeS5sZW5ndGggPiAxKSB3aW5kb3cuaGlzdG9yeS5iYWNrKCk7CiAgICAgIGVsc2UgZ28oJyMvY3JlYXRlJyk7CiAgICB9KTsKICAgIGZvb3Rlci5hcHBlbmRDaGlsZChiYWNrKTsKCiAgICB2YXIgcmVzdG9yZU5vdGUgPSBlbCgncCcsIHsgY2xhc3M6ICd2LXBheXdhbGxfX25vdGUnIH0pOwogICAgcmVzdG9yZU5vdGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ0FscmVhZHkgcGFpZCBidXQgZG9u4oCZdCBzZWUgeW91ciBjcmVkaXRzPyAnKSk7CiAgICB2YXIgcmVmcmVzaEJ0biA9IGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtbGluaycsICdkYXRhLXJlZnJlc2gnOiAndHJ1ZScgfSwgJ1JlZnJlc2ggYmFsYW5jZScpOwogICAgcmVzdG9yZU5vdGUuYXBwZW5kQ2hpbGQocmVmcmVzaEJ0bik7CiAgICBmb290ZXIuYXBwZW5kQ2hpbGQocmVzdG9yZU5vdGUpOwogICAgcGFnZS5hcHBlbmRDaGlsZChmb290ZXIpOwoKICAgIGlmIChyZWZyZXNoQnRuKSB7CiAgICAgIG9uKHJlZnJlc2hCdG4sICdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZWZyZXNoQnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICByZWZyZXNoQnRuLnRleHRDb250ZW50ID0gJ1JlZnJlc2hpbmfigKYnOwogICAgICAgIFYucGF5LnJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgewogICAgICAgICAgcmVmcmVzaEJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgcmVmcmVzaEJ0bi50ZXh0Q29udGVudCA9ICdSZWZyZXNoIGJhbGFuY2UnOwogICAgICAgICAgdXBkYXRlQmFsYW5jZVBpbGwocGFnZSwgbik7CiAgICAgICAgICB0b2FzdCgnQmFsYW5jZSB1cGRhdGVkOiAnICsgZm10SW50KG4pICsgJyBjcmVkaXRzLicsICdpbmZvJyk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQoKICAgIHJvb3QuYXBwZW5kQ2hpbGQocGFnZSk7CgogICAgdmFyIG9uQ3JlZGl0cyA9IGZ1bmN0aW9uIChuKSB7IHVwZGF0ZUJhbGFuY2VQaWxsKHBhZ2UsIHR5cGVvZiBuID09PSAnbnVtYmVyJyA/IG4gOiBiYWxhbmNlKCkpOyB9OwogICAgaWYgKFYuc3RvcmUgJiYgdHlwZW9mIFYuc3RvcmUub24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgVi5zdG9yZS5vbignY3JlZGl0czpjaGFuZ2VkJywgb25DcmVkaXRzKTsKICAgICAgX2NsZWFudXAucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHR5cGVvZiBWLnN0b3JlLm9mZiA9PT0gJ2Z1bmN0aW9uJykgVi5zdG9yZS5vZmYoJ2NyZWRpdHM6Y2hhbmdlZCcsIG9uQ3JlZGl0cyk7CiAgICAgIH0pOwogICAgfQoKICAgIFYucGF5LnJlZnJlc2hDcmVkaXRzKCkudGhlbihmdW5jdGlvbiAobikgeyB1cGRhdGVCYWxhbmNlUGlsbChwYWdlLCBuKTsgfSk7CgogICAgdmFyIHByaW1hcnlDdGEgPSBwYWdlLnF1ZXJ5U2VsZWN0b3IoJy52LWNhcmQtLXBvcHVsYXIgLnYtY3RhLS1wcmltYXJ5JykgfHwgcGFnZS5xdWVyeVNlbGVjdG9yKCcudi1jdGEtLXByaW1hcnknKTsKICAgIGlmIChwcmltYXJ5Q3RhKSB7CiAgICAgIHRyeSB7IHByaW1hcnlDdGEuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pOyB9IGNhdGNoIChlKSB7IHByaW1hcnlDdGEuZm9jdXMoKTsgfQogICAgfQogIH07CgogIGZ1bmN0aW9uIHVwZGF0ZUJhbGFuY2VQaWxsKHBhZ2UsIG4pIHsKICAgIGlmICghcGFnZSkgcmV0dXJuOwogICAgdmFyIGhvbGRlciA9IHBhZ2UucXVlcnlTZWxlY3RvcignLnYtcGF5d2FsbF9fYmFsYW5jZScpOwogICAgaWYgKCFob2xkZXIpIHJldHVybjsKICAgIHZhciBmcmVzaCA9IChWLnVpICYmIHR5cGVvZiBWLnVpLmNyZWRpdHNQaWxsID09PSAnZnVuY3Rpb24nKSA/IFYudWkuY3JlZGl0c1BpbGwobikgOiBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHMnIH0sIGZtdEludChuKSArICcgY3JlZGl0cycpOwogICAgdmFyIG9sZCA9IGhvbGRlci5xdWVyeVNlbGVjdG9yKCcudi1jcmVkaXRzLCBbZGF0YS1jcmVkaXRzLXBpbGxdJyk7CiAgICBpZiAob2xkKSBob2xkZXIucmVwbGFjZUNoaWxkKGZyZXNoLCBvbGQpOwogICAgZWxzZSBob2xkZXIuYXBwZW5kQ2hpbGQoZnJlc2gpOwogIH0KCiAgZnVuY3Rpb24gcGFja0NhcmQocCwgY3R4KSB7CiAgICBjdHggPSBjdHggfHwge307CiAgICB2YXIgY2xhc3NlcyA9ICd2LWNhcmQgZ2xhc3MtY2FyZCB2LXBheXdhbGxfX3BhY2snOwogICAgaWYgKHAucG9wdWxhcikgY2xhc3NlcyArPSAnIHYtY2FyZC0tcG9wdWxhcic7CiAgICBpZiAocC5pZCA9PT0gQkVTVC5pZCkgY2xhc3NlcyArPSAnIHYtY2FyZC0tYmVzdCc7CgogICAgdmFyIGNhcmQgPSBlbCgnYXJ0aWNsZScsIHsKICAgICAgY2xhc3M6IGNsYXNzZXMsCiAgICAgICdkYXRhLXByb2R1Y3QnOiBwLmlkLAogICAgICBzdHlsZTogJy0tcGFjay1hY2NlbnQ6IHZhcignICsgcC5hY2NlbnRWYXIgKyAnKScKICAgIH0pOwoKICAgIGlmIChwLnBvcHVsYXIpIHsKICAgICAgY2FyZC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2JhZGdlIHYtcGF5d2FsbF9fYmFkZ2UtLXBvcHVsYXInIH0sICdNb3N0IHBvcHVsYXInKSk7CiAgICB9IGVsc2UgaWYgKHAuaWQgPT09IEJFU1QuaWQpIHsKICAgICAgY2FyZC5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX2JhZGdlIHYtcGF5d2FsbF9fYmFkZ2UtLWJlc3QnIH0sICdCZXN0IHZhbHVlJykpOwogICAgfQoKICAgIHZhciBoZWFkID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX3BhY2staGVhZCcgfSk7CiAgICBoZWFkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1leWVicm93JyB9LCBwLmhlYWRsaW5lKSk7CiAgICB2YXIgY3JlZGl0c0JpZyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19jcmVkaXRzJyB9KTsKICAgIGNyZWRpdHNCaWcuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1wYXl3YWxsX19jcmVkaXRzLW51bScgfSwgZm10SW50KHAuY3JlZGl0cykpKTsKICAgIGNyZWRpdHNCaWcuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1wYXl3YWxsX19jcmVkaXRzLXVuaXQnIH0sICdjcmVkaXRzJykpOwogICAgaGVhZC5hcHBlbmRDaGlsZChjcmVkaXRzQmlnKTsKICAgIGlmIChwLmJvbnVzTGFiZWwpIGhlYWQuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1wYXl3YWxsX19ib251cycgfSwgcC5ib251c0xhYmVsKSk7CiAgICBjYXJkLmFwcGVuZENoaWxkKGhlYWQpOwoKICAgIHZhciBwcmljZVJvdyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19wcmljZScgfSk7CiAgICBwcmljZVJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXBheXdhbGxfX3ByaWNlLWFtdCcgfSwgcC5wcmljZUxhYmVsKSk7CiAgICB2YXIgcGVyID0gKHAucHJpY2UgLyBwLmNyZWRpdHMgKiAxMDAwKTsKICAgIHByaWNlUm93LmFwcGVuZENoaWxkKGVsKCdzcGFuJywgeyBjbGFzczogJ3YtcGF5d2FsbF9fcHJpY2UtcGVyJyB9LCAnJCcgKyBwZXIudG9GaXhlZCgyKSArICcgLyAxLDAwMCcpKTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQocHJpY2VSb3cpOwoKICAgIGNhcmQuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19wYWNrLWJsdXJiJyB9LCBwLmJsdXJiKSk7CgogICAgdmFyIGFwcHJveCA9IE1hdGguZmxvb3IocC5jcmVkaXRzIC8gMTApOwogICAgdmFyIGZlYXQgPSBlbCgndWwnLCB7IGNsYXNzOiAndi1wYXl3YWxsX19mZWF0cycgfSk7CiAgICBbCiAgICAgICd+JyArIGZtdEludChhcHByb3gpICsgJyBTdGFuZGFyZCBnZW5lcmF0aW9ucycsCiAgICAgICdXb3JrcyB3aXRoIGV2ZXJ5IG1vZGVsJywKICAgICAgJ0NyZWRpdHMgbmV2ZXIgZXhwaXJlJwogICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7CiAgICAgIHZhciBsaSA9IGVsKCdsaScsIHt9KTsKICAgICAgbGkuYXBwZW5kQ2hpbGQoaWNvbignY2hlY2snKSk7CiAgICAgIGxpLmFwcGVuZENoaWxkKGVsKCdzcGFuJywge30sIGxpbmUpKTsKICAgICAgZmVhdC5hcHBlbmRDaGlsZChsaSk7CiAgICB9KTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoZmVhdCk7CgogICAgdmFyIGJ1eUNsYXNzID0gcC5wb3B1bGFyID8gJ3YtY3RhIHYtY3RhLS1wcmltYXJ5IHYtY3RhLS1ibG9jaycgOiAndi1jdGEgdi1jdGEtLWdob3N0IHYtY3RhLS1ibG9jayc7CiAgICB2YXIgYnV5ID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6IGJ1eUNsYXNzLAogICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgJ2FyaWEtbGFiZWwnOiAnQnV5ICcgKyBmbXRJbnQocC5jcmVkaXRzKSArICcgY3JlZGl0cyBmb3IgJyArIHAucHJpY2VMYWJlbAogICAgfSwgJ0dldCAnICsgZm10SW50KHAuY3JlZGl0cykgKyAnIGNyZWRpdHMnKTsKICAgIG9uKGJ1eSwgJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICBpZiAoYnV5LmRpc2FibGVkKSByZXR1cm47CiAgICAgIFYucGF5LmJ1eShwLmlkLCB7IGJ1dHRvbjogYnV5IH0pOwogICAgfSk7CiAgICBjYXJkLmFwcGVuZENoaWxkKGJ1eSk7CgogICAgaWYgKGN0eC5yZWNvbW1lbmRTaG9ydGZhbGwgJiYgcC5jcmVkaXRzID49IGN0eC5yZWNvbW1lbmRTaG9ydGZhbGwgJiYgIXAucG9wdWxhcikgewogICAgICB2YXIgaGludCA9IGVsKCdzcGFuJywgeyBjbGFzczogJ3YtcGF5d2FsbF9fY292ZXInIH0sICdDb3ZlcnMgd2hhdCB5b3UgbmVlZCcpOwogICAgICB2YXIgc21hbGxlciA9IFBBQ0tTLmZpbHRlcihmdW5jdGlvbiAocSkgeyByZXR1cm4gcS5jcmVkaXRzID49IGN0eC5yZWNvbW1lbmRTaG9ydGZhbGw7IH0pOwogICAgICBpZiAoc21hbGxlci5sZW5ndGggJiYgc21hbGxlclswXS5pZCA9PT0gcC5pZCkgY2FyZC5hcHBlbmRDaGlsZChoaW50KTsKICAgIH0KCiAgICByZXR1cm4gY2FyZDsKICB9CgogIGZ1bmN0aW9uIHRlYXJkb3duSW50ZXJuYWwoKSB7CiAgICB3aGlsZSAoX2NsZWFudXAubGVuZ3RoKSB7CiAgICAgIHZhciBmbiA9IF9jbGVhbnVwLnBvcCgpOwogICAgICB0cnkgeyBmbigpOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgaWYgKF9ob3N0RWwpIHsKICAgICAgX2hvc3RFbC5jbGFzc0xpc3QucmVtb3ZlKCd2LXBheXdhbGwtaG9zdCcpOwogICAgICBfaG9zdEVsID0gbnVsbDsKICAgIH0KICB9CgogIHZpZXcudGVhcmRvd24gPSBmdW5jdGlvbiAoKSB7IHRlYXJkb3duSW50ZXJuYWwoKTsgfTsKCiAgVi52aWV3cy5wYXl3YWxsID0gdmlldzsKfSkoKTsKCgovKiA9PT09PSBzcmMvanMvYXV0aC12aWV3LmpzID09PT09ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgViA9ICh3aW5kb3cuViA9IHdpbmRvdy5WIHx8IHt9KTsKICBWLnZpZXdzID0gVi52aWV3cyB8fCB7fTsKCiAgZnVuY3Rpb24gZWwodGFnLCBhdHRycykgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuZWwgPT09ICdmdW5jdGlvbicpIHJldHVybiBWLnVpLmVsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIHZhciBpID0gMTsKICAgIGlmIChhdHRycyAmJiB0eXBlb2YgYXR0cnMgPT09ICdvYmplY3QnICYmICEoYXR0cnMgaW5zdGFuY2VvZiBOb2RlKSAmJiB0eXBlb2YgYXR0cnMgIT09ICdzdHJpbmcnKSB7CiAgICAgIGkgPSAyOwogICAgICBmb3IgKHZhciBrIGluIGF0dHJzKSB7CiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cnMsIGspKSBjb250aW51ZTsKICAgICAgICB2YXIgdmFsID0gYXR0cnNba107CiAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gZmFsc2UpIGNvbnRpbnVlOwogICAgICAgIGlmIChrID09PSAnY2xhc3MnIHx8IGsgPT09ICdjbGFzc05hbWUnKSBub2RlLmNsYXNzTmFtZSA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAndGV4dCcpIG5vZGUudGV4dENvbnRlbnQgPSB2YWw7CiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ2h0bWwnKSBub2RlLmlubmVySFRNTCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgbm9kZS5hZGRFdmVudExpc3RlbmVyKGsuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgdmFsKTsKICAgICAgICBlbHNlIGlmIChrLmluZGV4T2YoJ2RhdGEtJykgPT09IDAgfHwgay5pbmRleE9mKCdhcmlhLScpID09PSAwKSBub2RlLnNldEF0dHJpYnV0ZShrLCB2YWwpOwogICAgICAgIGVsc2UgaWYgKHZhbCA9PT0gdHJ1ZSkgbm9kZS5zZXRBdHRyaWJ1dGUoaywgJycpOwogICAgICAgIGVsc2UgeyB0cnkgeyBub2RlW2tdID0gdmFsOyB9IGNhdGNoIChlKSB7IG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7IH0gfQogICAgICB9CiAgICB9IGVsc2UgaWYgKGF0dHJzICE9IG51bGwpIHsgYXBwZW5kQ2hpbGQobm9kZSwgYXR0cnMpOyB9CiAgICBmb3IgKDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXBwZW5kQ2hpbGQobm9kZSwgYXJndW1lbnRzW2ldKTsKICAgIHJldHVybiBub2RlOwogIH0KICBmdW5jdGlvbiBhcHBlbmRDaGlsZChub2RlLCBjKSB7CiAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlIHx8IGMgPT09IHRydWUpIHJldHVybjsKICAgIGlmIChBcnJheS5pc0FycmF5KGMpKSB7IGMuZm9yRWFjaChmdW5jdGlvbiAoeCkgeyBhcHBlbmRDaGlsZChub2RlLCB4KTsgfSk7IHJldHVybjsgfQogICAgbm9kZS5hcHBlbmRDaGlsZChjLm5vZGVUeXBlID8gYyA6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjKSkpOwogIH0KCiAgZnVuY3Rpb24gdG9hc3QobXNnLCBraW5kKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS50b2FzdCA9PT0gJ2Z1bmN0aW9uJykgeyBWLnVpLnRvYXN0KG1zZywga2luZCB8fCAnaW5mbycpOyByZXR1cm47IH0KICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLmVtaXQgPT09ICdmdW5jdGlvbicpIFYuc3RvcmUuZW1pdCgndG9hc3QnLCB7IG1zZzogbXNnLCBraW5kOiBraW5kIHx8ICdpbmZvJyB9KTsKICB9CiAgZnVuY3Rpb24gZ28oaGFzaCkgewogICAgaWYgKFYucm91dGVyICYmIHR5cGVvZiBWLnJvdXRlci5nbyA9PT0gJ2Z1bmN0aW9uJykgVi5yb3V0ZXIuZ28oaGFzaCk7CiAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gaGFzaDsKICB9CiAgZnVuY3Rpb24gaXNFbWFpbChzKSB7CiAgICBpZiAoVi51dGlsICYmIHR5cGVvZiBWLnV0aWwuaXNFbWFpbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFYudXRpbC5pc0VtYWlsKHMpOwogICAgcmV0dXJuIC9eW15cc0BdK0BbXlxzQF0rXC5bXlxzQF0rJC8udGVzdChTdHJpbmcocyB8fCAnJykudHJpbSgpKTsKICB9CiAgZnVuY3Rpb24gc3Bpbm5lcigpIHsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLnNwaW5uZXIgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgdmFyIHMgPSBWLnVpLnNwaW5uZXIoKTsgaWYgKHMgJiYgcy5ub2RlVHlwZSkgcmV0dXJuIHM7IH0gY2F0Y2ggKGUpIHt9IH0KICAgIHJldHVybiBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXNwaW5uZXInIH0pOwogIH0KICBmdW5jdGlvbiBhdXRoVmlkZW9VUkwoKSB7CiAgICB2YXIgY2ZnID0gKFYuY29uZmlnIHx8IHt9KTsKICAgIHJldHVybiBjZmcuQVVUSF9WSURFTyB8fCBjZmcuREVNT19WSURFTyB8fCAnJzsKICB9CgogIHZhciBfcm9vdCA9IG51bGw7CiAgdmFyIF9tb2RlID0gJ3NpZ25pbic7CiAgdmFyIF9uZXh0ID0gbnVsbDsKICB2YXIgX3ZpZGVvID0gbnVsbDsKCiAgZnVuY3Rpb24gbGFuZEFmdGVyQXV0aCgpIHsKICAgIHZhciBkZXN0ID0gX25leHQ7CiAgICBpZiAoIWRlc3QpIHsKICAgICAgdmFyIG9uYm9hcmRlZCA9IFYuc3RhdGUgJiYgVi5zdGF0ZS5vbmJvYXJkaW5nRG9uZSA9PT0gdHJ1ZTsKICAgICAgZGVzdCA9IG9uYm9hcmRlZCA/ICcjL2NyZWF0ZScgOiAnIy9vbmJvYXJkaW5nJzsKICAgIH0KICAgIGdvKGRlc3QpOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRCYWNrZ3JvdW5kKHN0YWdlKSB7CiAgICB2YXIgc3JjID0gYXV0aFZpZGVvVVJMKCk7CiAgICBpZiAoc3JjKSB7CiAgICAgIHZhciB2aWRlbyA9IGVsKCd2aWRlbycsIHsKICAgICAgICBjbGFzczogJ3YtYXV0aF9fdmlkZW8nLAogICAgICAgIG11dGVkOiB0cnVlLAogICAgICAgIGxvb3A6IHRydWUsCiAgICAgICAgYXV0b3BsYXk6IHRydWUsCiAgICAgICAgcGxheXNpbmxpbmU6IHRydWUsCiAgICAgICAgcHJlbG9hZDogJ2F1dG8nLAogICAgICAgIHRhYmluZGV4OiAnLTEnLAogICAgICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJwogICAgICB9KTsKICAgICAgdmlkZW8ubXV0ZWQgPSB0cnVlOwogICAgICB2aWRlby5kZWZhdWx0TXV0ZWQgPSB0cnVlOwogICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ211dGVkJywgJycpOwogICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ3BsYXlzaW5saW5lJywgJycpOwogICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ3dlYmtpdC1wbGF5c2lubGluZScsICcnKTsKICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdkaXNhYmxlcGljdHVyZWlucGljdHVyZScsICcnKTsKICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdkaXNhYmxlcmVtb3RlcGxheWJhY2snLCAnJyk7CiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkgewogICAgICAgIGlmICh2aWRlby5wYXJlbnROb2RlKSB2aWRlby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHZpZGVvKTsKICAgICAgfSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICB2YXIgYXR0ZW1wdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIHAgPSB2aWRlby5wbGF5KCk7CiAgICAgICAgICBpZiAocCAmJiB0eXBlb2YgcC5jYXRjaCA9PT0gJ2Z1bmN0aW9uJykgcC5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CiAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgfTsKICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignY2FucGxheScsIGF0dGVtcHQsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIGF0dGVtcHQsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgdHJ5IHsgdmlkZW8uc3JjID0gc3JjOyB9IGNhdGNoIChlMikgeyB2aWRlby5zZXRBdHRyaWJ1dGUoJ3NyYycsIHNyYyk7IH0KICAgICAgdHJ5IHsgdmlkZW8ubG9hZCgpOyB9IGNhdGNoIChlMykge30KICAgICAgX3ZpZGVvID0gdmlkZW87CiAgICAgIHN0YWdlLmFwcGVuZENoaWxkKHZpZGVvKTsKICAgIH0KICAgIHN0YWdlLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19zY3JpbScsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KSk7CiAgfQoKICBmdW5jdGlvbiBmaWVsZChvcHRzKSB7CiAgICB2YXIgaW5wdXQgPSBlbCgnaW5wdXQnLCB7CiAgICAgIHR5cGU6IG9wdHMudHlwZSB8fCAndGV4dCcsCiAgICAgIGNsYXNzOiAndi1maWVsZCcsCiAgICAgIG5hbWU6IG9wdHMubmFtZSwKICAgICAgaWQ6ICd2LWF1dGgtJyArIG9wdHMubmFtZSwKICAgICAgcGxhY2Vob2xkZXI6IG9wdHMucGxhY2Vob2xkZXIgfHwgJycsCiAgICAgIGF1dG9jb21wbGV0ZTogb3B0cy5hdXRvY29tcGxldGUgfHwgJ29mZicsCiAgICAgICdhcmlhLWxhYmVsJzogb3B0cy5sYWJlbCB8fCBvcHRzLnBsYWNlaG9sZGVyIHx8IG9wdHMubmFtZSwKICAgICAgcmVxdWlyZWQ6IG9wdHMucmVxdWlyZWQgPyAnJyA6IG51bGwsCiAgICAgIHZhbHVlOiBvcHRzLnZhbHVlIHx8ICcnCiAgICB9KTsKICAgIGlmIChvcHRzLmlucHV0bW9kZSkgaW5wdXQuc2V0QXR0cmlidXRlKCdpbnB1dG1vZGUnLCBvcHRzLmlucHV0bW9kZSk7CiAgICBpZiAob3B0cy5hdXRvY2FwaXRhbGl6ZSkgaW5wdXQuc2V0QXR0cmlidXRlKCdhdXRvY2FwaXRhbGl6ZScsIG9wdHMuYXV0b2NhcGl0YWxpemUpOwogICAgaWYgKG9wdHMuc3BlbGxjaGVjayA9PT0gZmFsc2UpIGlucHV0LnNldEF0dHJpYnV0ZSgnc3BlbGxjaGVjaycsICdmYWxzZScpOwogICAgaWYgKG9wdHMubWlubGVuZ3RoKSBpbnB1dC5zZXRBdHRyaWJ1dGUoJ21pbmxlbmd0aCcsIFN0cmluZyhvcHRzLm1pbmxlbmd0aCkpOwogICAgaWYgKG9wdHMubWF4bGVuZ3RoKSBpbnB1dC5zZXRBdHRyaWJ1dGUoJ21heGxlbmd0aCcsIFN0cmluZyhvcHRzLm1heGxlbmd0aCkpOwogICAgdmFyIHdyYXAgPSBlbCgnbGFiZWwnLCB7IGNsYXNzOiAndi1hdXRoX19ncm91cCcgfSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1hdXRoX19sYWJlbCcsIHRleHQ6IG9wdHMubGFiZWwgfHwgJycgfSksCiAgICAgIGlucHV0KTsKICAgIHdyYXAuaW5wdXQgPSBpbnB1dDsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gc3RhdHVzTGluZSgpIHsKICAgIHJldHVybiBlbCgncCcsIHsgY2xhc3M6ICd2LWF1dGhfX3N0YXR1cycsIHJvbGU6ICdhbGVydCcsICdhcmlhLWxpdmUnOiAncG9saXRlJyB9KTsKICB9CgogIGZ1bmN0aW9uIHNob3dTdGF0dXMobm9kZSwgbXNnLCBpc0Vycm9yKSB7CiAgICBpZiAoIW5vZGUpIHJldHVybjsKICAgIG5vZGUudGV4dENvbnRlbnQgPSBtc2cgfHwgJyc7CiAgICBub2RlLmNsYXNzTGlzdC50b2dnbGUoJ3YtYXV0aF9fc3RhdHVzLS1lcnJvcicsICEhaXNFcnJvcik7CiAgfQoKICBmdW5jdGlvbiBzdWJtaXRCdXR0b24obGFiZWwpIHsKICAgIHZhciBidG4gPSBlbCgnYnV0dG9uJywgeyB0eXBlOiAnc3VibWl0JywgY2xhc3M6ICd2LWN0YSB2LWN0YS0tcHJpbWFyeSB2LWN0YS0tYmxvY2snIH0sIGVsKCdzcGFuJywgeyB0ZXh0OiBsYWJlbCB9KSk7CiAgICBidG4uc2V0TG9hZGluZyA9IGZ1bmN0aW9uIChvbiwgYnVzeUxhYmVsKSB7CiAgICAgIGJ0bi5kaXNhYmxlZCA9ICEhb247CiAgICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdpcy1sb2FkaW5nJywgISFvbik7CiAgICAgIGJ0bi5pbm5lckhUTUwgPSAnJzsKICAgICAgaWYgKG9uKSB7IGJ0bi5hcHBlbmRDaGlsZChzcGlubmVyKCkpOyBidG4uYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IHRleHQ6ICcgJyArIChidXN5TGFiZWwgfHwgJ1dvcmtpbmfigKYnKSB9KSk7IH0KICAgICAgZWxzZSBidG4uYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCB7IHRleHQ6IGxhYmVsIH0pKTsKICAgIH07CiAgICByZXR1cm4gYnRuOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRTaWduSW4oKSB7CiAgICB2YXIgZW1haWxGID0gZmllbGQoeyBuYW1lOiAnZW1haWwnLCB0eXBlOiAnZW1haWwnLCBsYWJlbDogJ0VtYWlsJywgcGxhY2Vob2xkZXI6ICd5b3VAc3R1ZGlvLmNvbScsIGF1dG9jb21wbGV0ZTogJ3VzZXJuYW1lJywgaW5wdXRtb2RlOiAnZW1haWwnLCBhdXRvY2FwaXRhbGl6ZTogJ25vbmUnLCBzcGVsbGNoZWNrOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWUgfSk7CiAgICB2YXIgcHdGID0gZmllbGQoeyBuYW1lOiAncGFzc3dvcmQnLCB0eXBlOiAncGFzc3dvcmQnLCBsYWJlbDogJ1Bhc3N3b3JkJywgcGxhY2Vob2xkZXI6ICdZb3VyIHBhc3N3b3JkJywgYXV0b2NvbXBsZXRlOiAnY3VycmVudC1wYXNzd29yZCcsIHJlcXVpcmVkOiB0cnVlIH0pOwogICAgdmFyIHN0YXR1cyA9IHN0YXR1c0xpbmUoKTsKICAgIHZhciBidG4gPSBzdWJtaXRCdXR0b24oJ1NpZ24gaW4nKTsKCiAgICB2YXIgZm9ybSA9IGVsKCdmb3JtJywgeyBjbGFzczogJ3YtYXV0aF9fZm9ybScsIG5vdmFsaWRhdGU6ICcnIH0sCiAgICAgIGVtYWlsRiwgcHdGLCBzdGF0dXMsIGJ0biwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWF1dGhfX3JvdycgfSwKICAgICAgICBlbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3M6ICd2LWxpbmsgdi1hdXRoX19mb3Jnb3QnLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IHNldE1vZGUoJ3Jlc2V0JywgZW1haWxGLmlucHV0LnZhbHVlKTsgfSB9LCAnRm9yZ290IHBhc3N3b3JkPycpCiAgICAgICkKICAgICk7CgogICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBmdW5jdGlvbiAoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHZhciBlbWFpbCA9IChlbWFpbEYuaW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTsKICAgICAgdmFyIHB3ID0gcHdGLmlucHV0LnZhbHVlIHx8ICcnOwogICAgICBpZiAoIWlzRW1haWwoZW1haWwpKSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnRW50ZXIgYSB2YWxpZCBlbWFpbC4nLCB0cnVlKTsgZW1haWxGLmlucHV0LmZvY3VzKCk7IHJldHVybjsgfQogICAgICBpZiAoIXB3KSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnRW50ZXIgeW91ciBwYXNzd29yZC4nLCB0cnVlKTsgcHdGLmlucHV0LmZvY3VzKCk7IHJldHVybjsgfQogICAgICBpZiAoIVYuYXV0aCB8fCB0eXBlb2YgVi5hdXRoLnNpZ25JbiAhPT0gJ2Z1bmN0aW9uJykgeyBzaG93U3RhdHVzKHN0YXR1cywgJ1NpZ24taW4gaXMgdW5hdmFpbGFibGUgcmlnaHQgbm93LicsIHRydWUpOyByZXR1cm47IH0KCiAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAnJyk7CiAgICAgIGJ0bi5zZXRMb2FkaW5nKHRydWUsICdTaWduaW5nIGlu4oCmJyk7CiAgICAgIFYuYXV0aC5zaWduSW4oZW1haWwsIHB3KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICB0b2FzdCgnV2VsY29tZSBiYWNrLicsICdzdWNjZXNzJyk7CiAgICAgICAgbGFuZEFmdGVyQXV0aCgpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgYnRuLnNldExvYWRpbmcoZmFsc2UpOwogICAgICAgIHZhciBzdGF0dXM0MDEgPSBlcnIgJiYgKGVyci5zdGF0dXMgPT09IDQwMSB8fCBlcnIuc3RhdHVzID09PSA0MDMpOwogICAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCBzdGF0dXM0MDEgPyAnRW1haWwgb3IgcGFzc3dvcmQgaXMgaW5jb3JyZWN0LicgOiAoKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ0NvdWxkIG5vdCBzaWduIGluLiBQbGVhc2UgdHJ5IGFnYWluLicpLCB0cnVlKTsKICAgICAgfSk7CiAgICB9KTsKICAgIHJldHVybiBmb3JtOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRSZWdpc3RlcigpIHsKICAgIHZhciBuYW1lRiA9IGZpZWxkKHsgbmFtZTogJ25hbWUnLCBsYWJlbDogJ05hbWUnLCBwbGFjZWhvbGRlcjogJ1lvdXIgbmFtZScsIGF1dG9jb21wbGV0ZTogJ25hbWUnIH0pOwogICAgdmFyIGVtYWlsRiA9IGZpZWxkKHsgbmFtZTogJ2VtYWlsJywgdHlwZTogJ2VtYWlsJywgbGFiZWw6ICdFbWFpbCcsIHBsYWNlaG9sZGVyOiAneW91QHN0dWRpby5jb20nLCBhdXRvY29tcGxldGU6ICd1c2VybmFtZScsIGlucHV0bW9kZTogJ2VtYWlsJywgYXV0b2NhcGl0YWxpemU6ICdub25lJywgc3BlbGxjaGVjazogZmFsc2UsIHJlcXVpcmVkOiB0cnVlIH0pOwogICAgdmFyIHB3RiA9IGZpZWxkKHsgbmFtZTogJ3Bhc3N3b3JkJywgdHlwZTogJ3Bhc3N3b3JkJywgbGFiZWw6ICdQYXNzd29yZCcsIHBsYWNlaG9sZGVyOiAnOOKAkzI0IGNoYXJhY3RlcnMnLCBhdXRvY29tcGxldGU6ICduZXctcGFzc3dvcmQnLCBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDogMjQsIHJlcXVpcmVkOiB0cnVlIH0pOwogICAgdmFyIHN0YXR1cyA9IHN0YXR1c0xpbmUoKTsKICAgIHZhciBidG4gPSBzdWJtaXRCdXR0b24oJ0NyZWF0ZSBhY2NvdW50Jyk7CgogICAgdmFyIGxlZ2FsID0gZWwoJ3AnLCB7IGNsYXNzOiAndi1hdXRoX19sZWdhbCcgfSwKICAgICAgJ0J5IGNyZWF0aW5nIGFuIGFjY291bnQgeW91IGFncmVlIHRvIG91ciAnLAogICAgICBlbCgnYScsIHsgaHJlZjogJ2h0dHBzOi8vdm9vc2V5LmNvbS90ZXJtcycsIHRhcmdldDogJ19ibGFuaycsIHJlbDogJ25vb3BlbmVyJywgY2xhc3M6ICd2LWxpbmsnIH0sICdUZXJtcycpLAogICAgICAnIGFuZCAnLAogICAgICBlbCgnYScsIHsgaHJlZjogJ2h0dHBzOi8vdm9vc2V5LmNvbS9wcml2YWN5JywgdGFyZ2V0OiAnX2JsYW5rJywgcmVsOiAnbm9vcGVuZXInLCBjbGFzczogJ3YtbGluaycgfSwgJ1ByaXZhY3kgUG9saWN5JyksCiAgICAgICcuJyk7CgogICAgdmFyIGZvcm0gPSBlbCgnZm9ybScsIHsgY2xhc3M6ICd2LWF1dGhfX2Zvcm0nLCBub3ZhbGlkYXRlOiAnJyB9LCBuYW1lRiwgZW1haWxGLCBwd0YsIHN0YXR1cywgYnRuLCBsZWdhbCk7CgogICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBmdW5jdGlvbiAoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHZhciBuYW1lID0gKG5hbWVGLmlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIHZhciBlbWFpbCA9IChlbWFpbEYuaW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTsKICAgICAgdmFyIHB3ID0gcHdGLmlucHV0LnZhbHVlIHx8ICcnOwogICAgICBpZiAoIWlzRW1haWwoZW1haWwpKSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnRW50ZXIgYSB2YWxpZCBlbWFpbC4nLCB0cnVlKTsgZW1haWxGLmlucHV0LmZvY3VzKCk7IHJldHVybjsgfQogICAgICBpZiAocHcubGVuZ3RoIDwgOCB8fCBwdy5sZW5ndGggPiAyNCkgeyBzaG93U3RhdHVzKHN0YXR1cywgJ1Bhc3N3b3JkIG11c3QgYmUgOOKAkzI0IGNoYXJhY3RlcnMuJywgdHJ1ZSk7IHB3Ri5pbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgaWYgKCFWLmF1dGggfHwgdHlwZW9mIFYuYXV0aC5yZWdpc3RlciAhPT0gJ2Z1bmN0aW9uJykgeyBzaG93U3RhdHVzKHN0YXR1cywgJ1NpZ24tdXAgaXMgdW5hdmFpbGFibGUgcmlnaHQgbm93LicsIHRydWUpOyByZXR1cm47IH0KCiAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAnJyk7CiAgICAgIGJ0bi5zZXRMb2FkaW5nKHRydWUsICdDcmVhdGluZ+KApicpOwogICAgICBWLmF1dGgucmVnaXN0ZXIoeyBuYW1lOiBuYW1lLCBlbWFpbDogZW1haWwsIHBhc3N3b3JkOiBwdyB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICB0b2FzdCgnQWNjb3VudCBjcmVhdGVkIOKAlCB3ZWxjb21lIHRvIFZhbXAuJywgJ3N1Y2Nlc3MnKTsKICAgICAgICBsYW5kQWZ0ZXJBdXRoKCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBidG4uc2V0TG9hZGluZyhmYWxzZSk7CiAgICAgICAgdmFyIGNvbmZsaWN0ID0gZXJyICYmIGVyci5zdGF0dXMgPT09IDQwOTsKICAgICAgICBzaG93U3RhdHVzKHN0YXR1cywgY29uZmxpY3QgPyAnVGhhdCBlbWFpbCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuIFRyeSBzaWduaW5nIGluLicgOiAoKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgJ0NvdWxkIG5vdCBjcmVhdGUgeW91ciBhY2NvdW50LiBQbGVhc2UgdHJ5IGFnYWluLicpLCB0cnVlKTsKICAgICAgfSk7CiAgICB9KTsKICAgIHJldHVybiBmb3JtOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRSZXNldChwcmVmaWxsRW1haWwpIHsKICAgIHZhciBlbWFpbEYgPSBmaWVsZCh7IG5hbWU6ICdlbWFpbCcsIHR5cGU6ICdlbWFpbCcsIGxhYmVsOiAnRW1haWwnLCBwbGFjZWhvbGRlcjogJ3lvdUBzdHVkaW8uY29tJywgYXV0b2NvbXBsZXRlOiAndXNlcm5hbWUnLCBpbnB1dG1vZGU6ICdlbWFpbCcsIGF1dG9jYXBpdGFsaXplOiAnbm9uZScsIHNwZWxsY2hlY2s6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZSwgdmFsdWU6IHByZWZpbGxFbWFpbCB8fCAnJyB9KTsKICAgIHZhciBzdGF0dXMgPSBzdGF0dXNMaW5lKCk7CiAgICB2YXIgc2VuZEJ0biA9IHN1Ym1pdEJ1dHRvbignU2VuZCByZXNldCBjb2RlJyk7CgogICAgdmFyIGNvZGVGID0gZmllbGQoeyBuYW1lOiAnY29kZScsIGxhYmVsOiAnUmVzZXQgY29kZScsIHBsYWNlaG9sZGVyOiAnQ29kZSBmcm9tIHlvdXIgZW1haWwnLCBhdXRvY29tcGxldGU6ICdvbmUtdGltZS1jb2RlJyB9KTsKICAgIHZhciBuZXdQd0YgPSBmaWVsZCh7IG5hbWU6ICduZXdQYXNzd29yZCcsIHR5cGU6ICdwYXNzd29yZCcsIGxhYmVsOiAnTmV3IHBhc3N3b3JkJywgcGxhY2Vob2xkZXI6ICc44oCTMjQgY2hhcmFjdGVycycsIGF1dG9jb21wbGV0ZTogJ25ldy1wYXNzd29yZCcsIG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOiAyNCB9KTsKICAgIHZhciByZXNldEJ0biA9IHN1Ym1pdEJ1dHRvbignU2V0IG5ldyBwYXNzd29yZCcpOwogICAgdmFyIHN0YWdlMiA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19zdGFnZTInLCBoaWRkZW46ICcnIH0sIGNvZGVGLCBuZXdQd0YsIHJlc2V0QnRuKTsKCiAgICB2YXIgZm9ybSA9IGVsKCdmb3JtJywgeyBjbGFzczogJ3YtYXV0aF9fZm9ybScsIG5vdmFsaWRhdGU6ICcnIH0sIGVtYWlsRiwgc2VuZEJ0biwgc3RhZ2UyLCBzdGF0dXMpOwoKICAgIHZhciByZXF1ZXN0ZWQgPSBmYWxzZTsKCiAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgaWYgKCFyZXF1ZXN0ZWQpIHJldHVybiBkb1JlcXVlc3QoKTsKICAgICAgcmV0dXJuIGRvUmVzZXQoKTsKICAgIH0pOwogICAgc2VuZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZG9SZXF1ZXN0KCk7IH0pOwogICAgcmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGRvUmVzZXQoKTsgfSk7CgogICAgZnVuY3Rpb24gZG9SZXF1ZXN0KCkgewogICAgICB2YXIgZW1haWwgPSAoZW1haWxGLmlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIGlmICghaXNFbWFpbChlbWFpbCkpIHsgc2hvd1N0YXR1cyhzdGF0dXMsICdFbnRlciBhIHZhbGlkIGVtYWlsLicsIHRydWUpOyBlbWFpbEYuaW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLnJlcXVlc3RSZXNldCAhPT0gJ2Z1bmN0aW9uJykgeyBzaG93U3RhdHVzKHN0YXR1cywgJ1Bhc3N3b3JkIHJlc2V0IGlzIHVuYXZhaWxhYmxlIHJpZ2h0IG5vdy4nLCB0cnVlKTsgcmV0dXJuOyB9CiAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAnJyk7CiAgICAgIHNlbmRCdG4uc2V0TG9hZGluZyh0cnVlLCAnU2VuZGluZ+KApicpOwogICAgICBWLmFwaS5yZXF1ZXN0UmVzZXQoZW1haWwpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHNlbmRCdG4uc2V0TG9hZGluZyhmYWxzZSk7CiAgICAgICAgcmVxdWVzdGVkID0gdHJ1ZTsKICAgICAgICBzdGFnZTIuaGlkZGVuID0gZmFsc2U7CiAgICAgICAgc2VuZEJ0bi5pbm5lckhUTUwgPSAnJzsgc2VuZEJ0bi5hcHBlbmRDaGlsZChlbCgnc3BhbicsIHsgdGV4dDogJ1Jlc2VuZCBjb2RlJyB9KSk7CiAgICAgICAgc2hvd1N0YXR1cyhzdGF0dXMsICdDaGVjayB5b3VyIGVtYWlsIGZvciBhIHJlc2V0IGNvZGUuJywgZmFsc2UpOwogICAgICAgIGNvZGVGLmlucHV0LmZvY3VzKCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICBzZW5kQnRuLnNldExvYWRpbmcoZmFsc2UpOwogICAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAoZXJyICYmIGVyci5tZXNzYWdlKSB8fCAnQ291bGQgbm90IHNlbmQgYSByZXNldCBjb2RlLiBQbGVhc2UgdHJ5IGFnYWluLicsIHRydWUpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBkb1Jlc2V0KCkgewogICAgICB2YXIgZW1haWwgPSAoZW1haWxGLmlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIHZhciBjb2RlID0gKGNvZGVGLmlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICAgIHZhciBuZXdQdyA9IG5ld1B3Ri5pbnB1dC52YWx1ZSB8fCAnJzsKICAgICAgaWYgKCFjb2RlKSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnRW50ZXIgdGhlIGNvZGUgZnJvbSB5b3VyIGVtYWlsLicsIHRydWUpOyBjb2RlRi5pbnB1dC5mb2N1cygpOyByZXR1cm47IH0KICAgICAgaWYgKG5ld1B3Lmxlbmd0aCA8IDggfHwgbmV3UHcubGVuZ3RoID4gMjQpIHsgc2hvd1N0YXR1cyhzdGF0dXMsICdQYXNzd29yZCBtdXN0IGJlIDjigJMyNCBjaGFyYWN0ZXJzLicsIHRydWUpOyBuZXdQd0YuaW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICAgIGlmICghVi5hcGkgfHwgdHlwZW9mIFYuYXBpLnN1Ym1pdFJlc2V0ICE9PSAnZnVuY3Rpb24nKSB7IHNob3dTdGF0dXMoc3RhdHVzLCAnUGFzc3dvcmQgcmVzZXQgaXMgdW5hdmFpbGFibGUgcmlnaHQgbm93LicsIHRydWUpOyByZXR1cm47IH0KICAgICAgc2hvd1N0YXR1cyhzdGF0dXMsICcnKTsKICAgICAgcmVzZXRCdG4uc2V0TG9hZGluZyh0cnVlLCAnVXBkYXRpbmfigKYnKTsKICAgICAgVi5hcGkuc3VibWl0UmVzZXQoZW1haWwsIGNvZGUsIG5ld1B3KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICB0b2FzdCgnUGFzc3dvcmQgdXBkYXRlZCDigJQgeW91IGNhbiBzaWduIGluIG5vdy4nLCAnc3VjY2VzcycpOwogICAgICAgIHNldE1vZGUoJ3NpZ25pbicsIGVtYWlsKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikgewogICAgICAgIHJlc2V0QnRuLnNldExvYWRpbmcoZmFsc2UpOwogICAgICAgIHNob3dTdGF0dXMoc3RhdHVzLCAoZXJyICYmIGVyci5tZXNzYWdlKSB8fCAnVGhhdCBjb2RlIGRpZG7igJl0IHdvcmsuIFJlcXVlc3QgYSBuZXcgb25lIGFuZCB0cnkgYWdhaW4uJywgdHJ1ZSk7CiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiBmb3JtOwogIH0KCiAgZnVuY3Rpb24gc2V0TW9kZShtb2RlLCBjYXJyeUVtYWlsKSB7CiAgICBfbW9kZSA9IG1vZGU7CiAgICBpZiAoX3Jvb3QpIHBhaW50KGNhcnJ5RW1haWwpOwogIH0KCiAgZnVuY3Rpb24gcGFpbnQoY2FycnlFbWFpbCkgewogICAgdmFyIHJvb3QgPSBfcm9vdDsKICAgIGlmICghcm9vdCkgcmV0dXJuOwogICAgc3RvcFZpZGVvKCk7CiAgICByb290LmlubmVySFRNTCA9ICcnOwoKICAgIHZhciBzdGFnZSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoJyB9KTsKICAgIGJ1aWxkQmFja2dyb3VuZChzdGFnZSk7CgogICAgdmFyIGNhcmQgPSBlbCgnc2VjdGlvbicsIHsgY2xhc3M6ICd2LWF1dGhfX2NhcmQgZ2xhc3MtY2FyZCcsIHJvbGU6ICdmb3JtJywgJ2FyaWEtbGFiZWwnOiAnU2lnbiBpbiB0byBWYW1wJyB9KTsKCiAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19icmFuZCcgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWF1dGhfX2xvZ28gdi1ncmFkaWVudCcsIHRleHQ6ICdWQU1QJyB9KSwKICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1hdXRoX190YWdsaW5lJywgdGV4dDogJ1N0YWdlLCByZXN0eWxlLCBhbmQgcmVpbWFnaW5lIGFueSBzcGFjZS4nIH0pCiAgICApKTsKCiAgICBpZiAoX21vZGUgIT09ICdyZXNldCcpIHsKICAgICAgdmFyIHRhYnMgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtYXV0aF9fdGFicycsIHJvbGU6ICd0YWJsaXN0JyB9KTsKICAgICAgdGFicy5hcHBlbmRDaGlsZCh0YWJCdG4oJ1NpZ24gaW4nLCAnc2lnbmluJykpOwogICAgICB0YWJzLmFwcGVuZENoaWxkKHRhYkJ0bignQ3JlYXRlIGFjY291bnQnLCAncmVnaXN0ZXInKSk7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQodGFicyk7CiAgICB9IGVsc2UgewogICAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19yZXNldGhlYWQnIH0sCiAgICAgICAgZWwoJ2gyJywgeyBjbGFzczogJ3YtYXV0aF9fdGl0bGUnLCB0ZXh0OiAnUmVzZXQgcGFzc3dvcmQnIH0pLAogICAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtYXV0aF9fc3ViJywgdGV4dDogJ0VudGVyIHlvdXIgZW1haWwgYW5kIHdl4oCZbGwgc2VuZCBhIHJlc2V0IGNvZGUuJyB9KQogICAgICApKTsKICAgIH0KCiAgICB2YXIgYm9keTsKICAgIGlmIChfbW9kZSA9PT0gJ3JlZ2lzdGVyJykgYm9keSA9IGJ1aWxkUmVnaXN0ZXIoKTsKICAgIGVsc2UgaWYgKF9tb2RlID09PSAncmVzZXQnKSBib2R5ID0gYnVpbGRSZXNldChjYXJyeUVtYWlsKTsKICAgIGVsc2UgYm9keSA9IGJ1aWxkU2lnbkluKCk7CiAgICBjYXJkLmFwcGVuZENoaWxkKGJvZHkpOwoKICAgIGlmIChfbW9kZSA9PT0gJ3Jlc2V0JykgewogICAgICBjYXJkLmFwcGVuZENoaWxkKGVsKCdkaXYnLCB7IGNsYXNzOiAndi1hdXRoX19mb290JyB9LAogICAgICAgIGVsKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzczogJ3YtbGluaycsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgc2V0TW9kZSgnc2lnbmluJywgY2FycnlFbWFpbCk7IH0gfSwgJ+KGkCBCYWNrIHRvIHNpZ24gaW4nKSkpOwogICAgfQoKICAgIHN0YWdlLmFwcGVuZENoaWxkKGNhcmQpOwogICAgcm9vdC5hcHBlbmRDaGlsZChzdGFnZSk7CgogICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICB2YXIgZmlyc3QgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7CiAgICAgIGlmIChmaXJzdCkgeyB0cnkgeyBmaXJzdC5mb2N1cygpOyB9IGNhdGNoIChlKSB7fSB9CiAgICB9LCA0MCk7CiAgfQoKICBmdW5jdGlvbiB0YWJCdG4obGFiZWwsIG1vZGUpIHsKICAgIHZhciBhY3RpdmUgPSBfbW9kZSA9PT0gbW9kZTsKICAgIHZhciBidG4gPSBlbCgnYnV0dG9uJywgewogICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgcm9sZTogJ3RhYicsCiAgICAgIGNsYXNzOiAndi1hdXRoX190YWInICsgKGFjdGl2ZSA/ICcgdi1hdXRoX190YWItLWFjdGl2ZScgOiAnJyksCiAgICAgICdhcmlhLXNlbGVjdGVkJzogYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJwogICAgfSwgbGFiZWwpOwogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBpZiAoX21vZGUgIT09IG1vZGUpIHNldE1vZGUobW9kZSk7IH0pOwogICAgcmV0dXJuIGJ0bjsKICB9CgogIGZ1bmN0aW9uIHN0b3BWaWRlbygpIHsKICAgIGlmICghX3ZpZGVvKSByZXR1cm47CiAgICB0cnkgeyBfdmlkZW8ucGF1c2UoKTsgfSBjYXRjaCAoZSkge30KICAgIHRyeSB7IF92aWRlby5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpOyBfdmlkZW8ubG9hZCgpOyB9IGNhdGNoIChlMikge30KICAgIF92aWRlbyA9IG51bGw7CiAgfQoKICBWLnZpZXdzLmF1dGggPSB7CiAgICByZW5kZXI6IGZ1bmN0aW9uIChyb290LCBwYXJhbXMpIHsKICAgICAgX3Jvb3QgPSByb290OwogICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307CiAgICAgIF9uZXh0ID0gcGFyYW1zLm5leHQgPyBTdHJpbmcocGFyYW1zLm5leHQpIDogbnVsbDsKICAgICAgdmFyIG0gPSAocGFyYW1zLm1vZGUgfHwgJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTsKICAgICAgX21vZGUgPSAobSA9PT0gJ3JlZ2lzdGVyJyB8fCBtID09PSAncmVzZXQnIHx8IG0gPT09ICdzaWduaW4nKSA/IG0gOiAnc2lnbmluJzsKICAgICAgcm9vdC5jbGFzc0xpc3QgJiYgcm9vdC5jbGFzc0xpc3QuYWRkKCd2LXZpZXctYXV0aCcpOwogICAgICBwYWludChwYXJhbXMuZW1haWwgfHwgJycpOwogICAgfSwKICAgIHRlYXJkb3duOiBmdW5jdGlvbiAoKSB7CiAgICAgIHN0b3BWaWRlbygpOwogICAgICBfcm9vdCA9IG51bGw7CiAgICAgIF9tb2RlID0gJ3NpZ25pbic7CiAgICAgIF9uZXh0ID0gbnVsbDsKICAgIH0KICB9Owp9KSgpOwoKCi8qID09PT09IHNyYy9qcy9hcHAuanMgPT09PT0gKi8KKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBWID0gKHdpbmRvdy5WID0gd2luZG93LlYgfHwge30pOwogIFYudmlld3MgPSBWLnZpZXdzIHx8IHt9OwoKICB2YXIgREVGQVVMVF9ST1VURSA9ICdjcmVhdGUnOwoKICB2YXIgUFVCTElDX1JPVVRFUyA9IHsgYXV0aDogdHJ1ZSB9OwoKICB2YXIgUk9VVEVfVklFVyA9IHsKICAgIGNyZWF0ZTogJ2NyZWF0ZScsCiAgICBsaWJyYXJ5OiAnbGlicmFyeScsCiAgICBpbnNwaXJhdGlvbjogJ2ZlZWQnLAogICAgZmVlZDogJ2ZlZWQnLAogICAgc2V0dGluZ3M6ICdzZXR0aW5ncycsCiAgICBhY2NvdW50OiAnYWNjb3VudCcsCiAgICBwYXl3YWxsOiAncGF5d2FsbCcsCiAgICByZWZlcnJhbDogJ3JlZmVycmFsJywKICAgIGNoYWxsZW5nZTogJ2NoYWxsZW5nZScsCiAgICBvbmJvYXJkaW5nOiAnb25ib2FyZGluZycsCiAgICBhdXRoOiAnYXV0aCcKICB9OwoKICB2YXIgTkFWX0lURU1TID0gWwogICAgeyByb3V0ZTogJ2NyZWF0ZScsIGxhYmVsOiAnQ3JlYXRlJywgaWNvbjogJ3NwYXJrbGVzJyB9LAogICAgeyByb3V0ZTogJ2luc3BpcmF0aW9uJywgbGFiZWw6ICdFeHBsb3JlJywgaWNvbjogJ2dyaWQnIH0sCiAgICB7IHJvdXRlOiAnbGlicmFyeScsIGxhYmVsOiAnTGlicmFyeScsIGljb246ICdwaG90b1N0YWNrJyB9CiAgXTsKCiAgdmFyIGFwcFJvb3QgPSBudWxsOwogIHZhciBvdXRsZXRFbCA9IG51bGw7CiAgdmFyIHRvcGJhckVsID0gbnVsbDsKICB2YXIgYm90dG9tYmFyRWwgPSBudWxsOwogIHZhciBkcmF3ZXJFbCA9IG51bGw7CiAgdmFyIGRyYXdlclNjcmltRWwgPSBudWxsOwogIHZhciBvdmVybGF5SG9zdEVsID0gbnVsbDsKCiAgdmFyIGN1cnJlbnRCYXNlVmlldyA9IG51bGw7CiAgdmFyIGN1cnJlbnRPdmVybGF5VmlldyA9IG51bGw7CiAgdmFyIGxhc3RGb2N1c0JlZm9yZURyYXdlciA9IG51bGw7CiAgdmFyIGJvb3RpbmcgPSB0cnVlOwogIHZhciBuYXZpZ2F0aW5nID0gZmFsc2U7CgogIGZ1bmN0aW9uIHNhZmVVdGlsKCkgewogICAgcmV0dXJuIFYudXRpbCAmJiB0eXBlb2YgVi51dGlsID09PSAnb2JqZWN0JyA/IFYudXRpbCA6IHt9OwogIH0KCiAgZnVuY3Rpb24gZWwodGFnLCBhdHRycykgewogICAgdmFyIGNoaWxkcmVuID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgIGlmIChWLnVpICYmIHR5cGVvZiBWLnVpLmVsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBWLnVpLmVsLmFwcGx5KG51bGwsIFt0YWcsIGF0dHJzXS5jb25jYXQoY2hpbGRyZW4pKTsKICAgIH0KICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgaWYgKGF0dHJzKSB7CiAgICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgaykpIGNvbnRpbnVlOwogICAgICAgIHZhciB2YWwgPSBhdHRyc1trXTsKICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZSkgY29udGludWU7CiAgICAgICAgaWYgKGsgPT09ICdjbGFzcycgfHwgayA9PT0gJ2NsYXNzTmFtZScpIG5vZGUuY2xhc3NOYW1lID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICd0ZXh0Jykgbm9kZS50ZXh0Q29udGVudCA9IHZhbDsKICAgICAgICBlbHNlIGlmIChrID09PSAnaHRtbCcpIG5vZGUuaW5uZXJIVE1MID0gdmFsOwogICAgICAgIGVsc2UgaWYgKGsgPT09ICdzdHlsZScgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgIGZvciAodmFyIHMgaW4gdmFsKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbCwgcykpIG5vZGUuc3R5bGVbc10gPSB2YWxbc107CiAgICAgICAgfSBlbHNlIGlmIChrLmluZGV4T2YoJ29uJykgPT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGsuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgdmFsKTsKICAgICAgICB9IGVsc2UgaWYgKGsuaW5kZXhPZignZGF0YS0nKSA9PT0gMCB8fCBrLmluZGV4T2YoJ2FyaWEtJykgPT09IDApIHsKICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGssIHZhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRyeSB7IG5vZGVba10gPSB2YWw7IH0gY2F0Y2ggKGUpIHsgbm9kZS5zZXRBdHRyaWJ1dGUoaywgdmFsKTsgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXBwZW5kQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW4pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiBhcHBlbmRDaGlsZHJlbihub2RlLCBjaGlsZHJlbikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldOwogICAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT09IGZhbHNlKSBjb250aW51ZTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHsgYXBwZW5kQ2hpbGRyZW4obm9kZSwgYyk7IGNvbnRpbnVlOyB9CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoYy5ub2RlVHlwZSA/IGMgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoYykpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGljb24obmFtZSkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuaWNvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgciA9IFYudWkuaWNvbihuYW1lKTsKICAgICAgaWYgKHIgJiYgci5ub2RlVHlwZSkgcmV0dXJuIHI7CiAgICAgIGlmICh0eXBlb2YgciA9PT0gJ3N0cmluZycpIHsKICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICBzcGFuLmNsYXNzTmFtZSA9ICd2LWljbyc7CiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICBzcGFuLmlubmVySFRNTCA9IHI7CiAgICAgICAgcmV0dXJuIHNwYW47CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxsYmFja0ljb24obmFtZSk7CiAgfQoKICBmdW5jdGlvbiBmYWxsYmFja0ljb24obmFtZSkgewogICAgdmFyIHBhdGhzID0gewogICAgICBzcGFya2xlczoKICAgICAgICAnPHBhdGggZD0iTTEyIDNsMS42IDQuNEwxOCA5bC00LjQgMS42TDEyIDE1bC0xLjYtNC40TDYgOWw0LjQtMS42TDEyIDN6Ii8+PHBhdGggZD0iTTE5IDE0bC44IDIuMkwyMiAxN2wtMi4yLjhMMTkgMjBsLS44LTIuMkwxNiAxN2wyLjItLjhMMTkgMTR6Ii8+JywKICAgICAgcGhvdG9TdGFjazoKICAgICAgICAnPHJlY3QgeD0iMyIgeT0iNiIgd2lkdGg9IjE4IiBoZWlnaHQ9IjEzIiByeD0iMiIvPjxwYXRoIGQ9Ik0zIDE2bDQuNS00IDQgMy41TDE1IDExbDYgNSIvPjxjaXJjbGUgY3g9IjkiIGN5PSIxMC41IiByPSIxLjQiLz48cGF0aCBkPSJNNiAzLjVoMTIiLz4nLAogICAgICBtZW51OiAnPHBhdGggZD0iTTQgN2gxNk00IDEyaDE2TTQgMTdoMTYiLz4nLAogICAgICBjbG9zZTogJzxwYXRoIGQ9Ik02IDZsMTIgMTJNMTggNkw2IDE4Ii8+JywKICAgICAgYm9sdDogJzxwYXRoIGQ9Ik0xMyAyTDQuNSAxM0gxMWwtMSA5IDguNS0xMUgxMmwxLTl6Ii8+JywKICAgICAgY3JlZGl0czogJzxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjkiLz48cGF0aCBkPSJNMTUgOS41YTMgMyAwIDAgMC02IC41YzAgMyA2IDEuNSA2IDQuNWEzIDMgMCAwIDEtNiAuNSIvPjxwYXRoIGQ9Ik0xMiA2LjV2MTEiLz4nCiAgICB9OwogICAgdmFyIGQgPSBwYXRoc1tuYW1lXSB8fCBwYXRocy5zcGFya2xlczsKICAgIHZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgc3Bhbi5jbGFzc05hbWUgPSAndi1pY28nOwogICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIHNwYW4uaW5uZXJIVE1MID0KICAgICAgJzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiAnICsKICAgICAgJ3N0cm9rZS13aWR0aD0iMS43IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPicgKyBkICsgJzwvc3ZnPic7CiAgICByZXR1cm4gc3BhbjsKICB9CgogIGZ1bmN0aW9uIHRvYXN0KG1zZywga2luZCkgewogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkudG9hc3QgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgVi51aS50b2FzdChtc2csIGtpbmQpOyByZXR1cm47IH0gY2F0Y2ggKGUpIHt9IH0KICAgIGlmIChWLnN0b3JlICYmIHR5cGVvZiBWLnN0b3JlLnRvYXN0ID09PSAnZnVuY3Rpb24nKSB7IFYuc3RvcmUudG9hc3QobXNnLCBraW5kKTsgcmV0dXJuOyB9CiAgICBpZiAod2luZG93LmNvbnNvbGUpIGNvbnNvbGUubG9nKCdbdG9hc3RdJywga2luZCB8fCAnaW5mbycsIG1zZyk7CiAgfQoKICBmdW5jdGlvbiBlc2NhcGVIdG1sKHMpIHsKICAgIHZhciB1ID0gc2FmZVV0aWwoKTsKICAgIGlmICh0eXBlb2YgdS5lc2NhcGVIdG1sID09PSAnZnVuY3Rpb24nKSByZXR1cm4gdS5lc2NhcGVIdG1sKHMpOwogICAgcmV0dXJuIFN0cmluZyhzID09IG51bGwgPyAnJyA6IHMpLnJlcGxhY2UoL1smPD4iJ10vZywgZnVuY3Rpb24gKGMpIHsKICAgICAgcmV0dXJuIHsgJyYnOiAnJmFtcDsnLCAnPCc6ICcmbHQ7JywgJz4nOiAnJmd0OycsICciJzogJyZxdW90OycsICInIjogJyYjMzk7JyB9W2NdOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBwYXJzZShoYXNoU3RyKSB7CiAgICB2YXIgcmF3ID0gaGFzaFN0ciAhPSBudWxsID8gU3RyaW5nKGhhc2hTdHIpIDogKHdpbmRvdy5sb2NhdGlvbi5oYXNoIHx8ICcnKTsKICAgIHZhciBoID0gcmF3LmNoYXJBdCgwKSA9PT0gJyMnID8gcmF3LnNsaWNlKDEpIDogcmF3OwogICAgaWYgKGguY2hhckF0KDApID09PSAnLycpIGggPSBoLnNsaWNlKDEpOwoKICAgIHZhciBxSW5kZXggPSBoLmluZGV4T2YoJz8nKTsKICAgIHZhciBwYXRoUGFydCA9IHFJbmRleCA9PT0gLTEgPyBoIDogaC5zbGljZSgwLCBxSW5kZXgpOwogICAgdmFyIHF1ZXJ5UGFydCA9IHFJbmRleCA9PT0gLTEgPyAnJyA6IGguc2xpY2UocUluZGV4ICsgMSk7CgogICAgdmFyIHNlZ21lbnRzID0gcGF0aFBhcnQuc3BsaXQoJy8nKS5maWx0ZXIoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMubGVuZ3RoID4gMDsgfSk7CiAgICB2YXIgcm91dGUgPSBzZWdtZW50cy5sZW5ndGggPyBkZWNvZGVVUklDb21wb25lbnQoc2VnbWVudHNbMF0pIDogREVGQVVMVF9ST1VURTsKICAgIGlmICghcm91dGUpIHJvdXRlID0gREVGQVVMVF9ST1VURTsKCiAgICB2YXIgcGFyYW1zID0gcGFyc2VRdWVyeShxdWVyeVBhcnQpOwoKICAgIGlmIChyb3V0ZSA9PT0gJ2ltYWdlJykgewogICAgICBwYXJhbXMuaWQgPSBzZWdtZW50c1sxXSA/IGRlY29kZVVSSUNvbXBvbmVudChzZWdtZW50c1sxXSkgOiBwYXJhbXMuaWQgfHwgJyc7CiAgICAgIHBhcmFtcy5fX292ZXJsYXkgPSAnc3R1ZGlvJzsKICAgIH0gZWxzZSBpZiAocm91dGUgPT09ICdpbnNwaXJhdGlvbicgfHwgcm91dGUgPT09ICdmZWVkJykgewogICAgICBpZiAoc2VnbWVudHNbMV0pIHBhcmFtcy5pZCA9IGRlY29kZVVSSUNvbXBvbmVudChzZWdtZW50c1sxXSk7CiAgICB9IGVsc2UgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgaWYgKHBhcmFtcy5pZCA9PSBudWxsKSBwYXJhbXMuaWQgPSBkZWNvZGVVUklDb21wb25lbnQoc2VnbWVudHNbMV0pOwogICAgfQoKICAgIHJldHVybiB7IHJvdXRlOiByb3V0ZSwgcGFyYW1zOiBwYXJhbXMsIHNlZ21lbnRzOiBzZWdtZW50cywgcGF0aDogcGF0aFBhcnQgfTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlUXVlcnkocXVlcnlQYXJ0KSB7CiAgICB2YXIgdSA9IHNhZmVVdGlsKCk7CiAgICBpZiAodHlwZW9mIHUucXMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcGFyc2VkID0gdS5xcygnIy9fPycgKyAocXVlcnlQYXJ0IHx8ICcnKSk7CiAgICAgICAgaWYgKHBhcnNlZCAmJiBwYXJzZWQucGFyYW1zICYmIHR5cGVvZiBwYXJzZWQucGFyYW1zID09PSAnb2JqZWN0JykgcmV0dXJuIHBhcnNlZC5wYXJhbXM7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9CiAgICB2YXIgb3V0ID0ge307CiAgICBpZiAoIXF1ZXJ5UGFydCkgcmV0dXJuIG91dDsKICAgIHZhciBwYWlycyA9IHF1ZXJ5UGFydC5zcGxpdCgnJicpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIXBhaXJzW2ldKSBjb250aW51ZTsKICAgICAgdmFyIGVxID0gcGFpcnNbaV0uaW5kZXhPZignPScpOwogICAgICB2YXIga2V5ID0gZXEgPT09IC0xID8gcGFpcnNbaV0gOiBwYWlyc1tpXS5zbGljZSgwLCBlcSk7CiAgICAgIHZhciB2YWwgPSBlcSA9PT0gLTEgPyAnJyA6IHBhaXJzW2ldLnNsaWNlKGVxICsgMSk7CiAgICAgIHRyeSB7IGtleSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXkucmVwbGFjZSgvXCsvZywgJyAnKSk7IH0gY2F0Y2ggKGUyKSB7fQogICAgICB0cnkgeyB2YWwgPSBkZWNvZGVVUklDb21wb25lbnQodmFsLnJlcGxhY2UoL1wrL2csICcgJykpOyB9IGNhdGNoIChlMykge30KICAgICAgaWYgKGtleSkgb3V0W2tleV0gPSB2YWw7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KCiAgZnVuY3Rpb24gY3VycmVudCgpIHsKICAgIHJldHVybiBwYXJzZSh3aW5kb3cubG9jYXRpb24uaGFzaCk7CiAgfQoKICBmdW5jdGlvbiBnbyhoYXNoKSB7CiAgICB2YXIgdGFyZ2V0ID0gbm9ybWFsaXplSGFzaChoYXNoKTsKICAgIHZhciBjdXIgPSB3aW5kb3cubG9jYXRpb24uaGFzaCB8fCAnJzsKICAgIHZhciBjdXJOb3JtID0gbm9ybWFsaXplSGFzaChjdXIpOwogICAgaWYgKGN1ck5vcm0gPT09IHRhcmdldCkgewogICAgICBoYW5kbGVSb3V0ZSgpOwogICAgfSBlbHNlIHsKICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSB0YXJnZXQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBub3JtYWxpemVIYXNoKGhhc2gpIHsKICAgIHZhciBzID0gaGFzaCA9PSBudWxsID8gJycgOiBTdHJpbmcoaGFzaCk7CiAgICBpZiAoIXMpIHJldHVybiAnIy8nICsgREVGQVVMVF9ST1VURTsKICAgIGlmIChzLmNoYXJBdCgwKSA9PT0gJyMnKSBzID0gcy5zbGljZSgxKTsKICAgIGlmIChzLmNoYXJBdCgwKSAhPT0gJy8nKSBzID0gJy8nICsgczsKICAgIHJldHVybiAnIycgKyBzOwogIH0KCiAgVi5yb3V0ZXIgPSBPYmplY3QuYXNzaWduKFYucm91dGVyIHx8IHt9LCB7CiAgICBnbzogZ28sCiAgICBjdXJyZW50OiBjdXJyZW50LAogICAgcGFyc2U6IHBhcnNlCiAgfSk7CgogIGZ1bmN0aW9uIGJvb3QoKSB7CiAgICBhcHBSb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbXAtYXBwJyk7CiAgICBpZiAoIWFwcFJvb3QpIHsKICAgICAgYXBwUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBhcHBSb290LmlkID0gJ3ZhbXAtYXBwJzsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhcHBSb290KTsKICAgIH0KICAgIGFwcFJvb3QuY2xhc3NMaXN0LmFkZCgndi1hcHAnKTsKCiAgICB0cnkgeyBpZiAoVi5zdG9yZSAmJiB0eXBlb2YgVi5zdG9yZS5sb2FkID09PSAnZnVuY3Rpb24nKSBWLnN0b3JlLmxvYWQoKTsgfSBjYXRjaCAoZSkge30KCiAgICBhcHBseVRoZW1lKCk7CgogICAgYnVpbGRDaHJvbWUoKTsKICAgIHNob3dCb290TG9hZGVyKCk7CgogICAgd2lyZVN0b3JlRXZlbnRzKCk7CiAgICB3aXJlR2xvYmFsSGFuZGxlcnMoKTsKCiAgICBjYXB0dXJlR2xvYmFsSW50ZW50cygpOwoKICAgIHZhciBib290UCA9CiAgICAgIFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLmJvb3RzdHJhcCA9PT0gJ2Z1bmN0aW9uJwogICAgICAgID8gVi5hdXRoLmJvb3RzdHJhcCgpCiAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwoKICAgIGJvb3RQCiAgICAgIC50aGVuKGZ1bmN0aW9uIChhdXRoZWQpIHsKICAgICAgICBmaW5pc2hCb290KCEhYXV0aGVkKTsKICAgICAgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICBmaW5pc2hCb290KFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLmlzQXV0aGVkID09PSAnZnVuY3Rpb24nID8gVi5hdXRoLmlzQXV0aGVkKCkgOiBmYWxzZSk7CiAgICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZmluaXNoQm9vdChhdXRoZWQpIHsKICAgIGJvb3RpbmcgPSBmYWxzZTsKICAgIHRyeSB7IGlmIChWLnN0b3JlKSBWLnN0b3JlLnNldCgnYm9vdGVkJywgdHJ1ZSk7IH0gY2F0Y2ggKGUpIHt9CgogICAgdmFyIGRlc2MgPSBjdXJyZW50KCk7CiAgICB2YXIgcm91dGUgPSBkZXNjLnJvdXRlOwoKICAgIGlmICghYXV0aGVkICYmICFQVUJMSUNfUk9VVEVTW3JvdXRlXSkgewogICAgICByZXBsYWNlSGFzaCgnIy9hdXRoJyk7CiAgICB9IGVsc2UgaWYgKGF1dGhlZCAmJiByb3V0ZSA9PT0gJ2F1dGgnKSB7CiAgICAgIHJlcGxhY2VIYXNoKGxhbmRpbmdIYXNoKCkpOwogICAgfSBlbHNlIGlmIChhdXRoZWQgJiYgbmVlZHNPbmJvYXJkaW5nKCkgJiYgcm91dGUgIT09ICdvbmJvYXJkaW5nJyAmJiByb3V0ZSAhPT0gJ2F1dGgnKSB7CiAgICAgIHJlcGxhY2VIYXNoKCcjL29uYm9hcmRpbmcnKTsKICAgIH0gZWxzZSBpZiAoIWRlc2MucGF0aCB8fCByb3V0ZSA9PT0gJycpIHsKICAgICAgcmVwbGFjZUhhc2goJyMvJyArIERFRkFVTFRfUk9VVEUpOwogICAgfQoKICAgIGhhbmRsZVJvdXRlKCk7CgogICAgZmx1c2hHbG9iYWxJbnRlbnRzKGF1dGhlZCk7CiAgfQoKICBmdW5jdGlvbiBsYW5kaW5nSGFzaCgpIHsKICAgIHJldHVybiBuZWVkc09uYm9hcmRpbmcoKSA/ICcjL29uYm9hcmRpbmcnIDogJyMvJyArIERFRkFVTFRfUk9VVEU7CiAgfQoKICBmdW5jdGlvbiBuZWVkc09uYm9hcmRpbmcoKSB7CiAgICByZXR1cm4gIShWLnN0YXRlICYmIFYuc3RhdGUub25ib2FyZGluZ0RvbmUgPT09IHRydWUpOwogIH0KCiAgZnVuY3Rpb24gcmVwbGFjZUhhc2goaGFzaCkgewogICAgdmFyIHRhcmdldCA9IG5vcm1hbGl6ZUhhc2goaGFzaCk7CiAgICB0cnkgewogICAgICB2YXIgYmFzZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCcjJylbMF07CiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgYmFzZSArIHRhcmdldCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gdGFyZ2V0OwogICAgfQogIH0KCiAgZnVuY3Rpb24gaGFuZGxlUm91dGUoKSB7CiAgICBpZiAoYm9vdGluZyB8fCBuYXZpZ2F0aW5nKSByZXR1cm47CiAgICBuYXZpZ2F0aW5nID0gdHJ1ZTsKICAgIHRyeSB7CiAgICAgIHZhciBkZXNjID0gY3VycmVudCgpOwogICAgICB2YXIgcm91dGUgPSBkZXNjLnJvdXRlOwogICAgICB2YXIgcGFyYW1zID0gZGVzYy5wYXJhbXMgfHwge307CgogICAgICB2YXIgYXV0aGVkID0gVi5hdXRoICYmIHR5cGVvZiBWLmF1dGguaXNBdXRoZWQgPT09ICdmdW5jdGlvbicgPyBWLmF1dGguaXNBdXRoZWQoKSA6IGZhbHNlOwoKICAgICAgaWYgKCFhdXRoZWQgJiYgIVBVQkxJQ19ST1VURVNbcm91dGVdKSB7CiAgICAgICAgcmVwbGFjZUhhc2goJyMvYXV0aCcpOwogICAgICAgIG1vdW50QmFzZVZpZXcoJ2F1dGgnLCBjdXJyZW50KCkucGFyYW1zKTsKICAgICAgICBzeW5jQ2hyb21lKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChhdXRoZWQgJiYgcm91dGUgPT09ICdhdXRoJykgewogICAgICAgIHJlcGxhY2VIYXNoKGxhbmRpbmdIYXNoKCkpOwogICAgICAgIHZhciBsZCA9IGN1cnJlbnQoKTsKICAgICAgICBtb3VudEJhc2VWaWV3KGxkLnJvdXRlLCBsZC5wYXJhbXMpOwogICAgICAgIHN5bmNDaHJvbWUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGF1dGhlZCAmJiBuZWVkc09uYm9hcmRpbmcoKSAmJiByb3V0ZSAhPT0gJ29uYm9hcmRpbmcnKSB7CiAgICAgICAgcmVwbGFjZUhhc2goJyMvb25ib2FyZGluZycpOwogICAgICAgIG1vdW50QmFzZVZpZXcoJ29uYm9hcmRpbmcnLCB7fSk7CiAgICAgICAgc3luY0Nocm9tZSgpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgaWYgKHJvdXRlID09PSAnaW1hZ2UnKSB7CiAgICAgICAgaWYgKCFjdXJyZW50QmFzZVZpZXcpIHsKICAgICAgICAgIG1vdW50QmFzZVZpZXcoJ2xpYnJhcnknLCB7fSk7CiAgICAgICAgfQogICAgICAgIG1vdW50T3ZlcmxheSgnc3R1ZGlvJywgcGFyYW1zKTsKICAgICAgICBzeW5jQ2hyb21lKCk7CiAgICAgICAgc2V0Um91dGVTdGF0ZShyb3V0ZSwgcGFyYW1zKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmIChjdXJyZW50T3ZlcmxheVZpZXcpIGRpc21pc3NPdmVybGF5KCk7CgogICAgICB2YXIgdmlld05hbWUgPSBST1VURV9WSUVXW3JvdXRlXTsKICAgICAgaWYgKCF2aWV3TmFtZSB8fCAhVi52aWV3c1t2aWV3TmFtZV0gfHwgdHlwZW9mIFYudmlld3Nbdmlld05hbWVdLnJlbmRlciAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIG1vdW50Tm90Rm91bmQocm91dGUpOwogICAgICB9IGVsc2UgewogICAgICAgIG1vdW50QmFzZVZpZXcodmlld05hbWUsIHBhcmFtcyk7CiAgICAgIH0KCiAgICAgIGlmIChyb3V0ZSAhPT0gJ2FjY291bnQnKSBjbG9zZURyYXdlcigpOwoKICAgICAgc3luY0Nocm9tZSgpOwogICAgICBzZXRSb3V0ZVN0YXRlKHJvdXRlLCBwYXJhbXMpOwogICAgfSBmaW5hbGx5IHsKICAgICAgbmF2aWdhdGluZyA9IGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gc2V0Um91dGVTdGF0ZShyb3V0ZSwgcGFyYW1zKSB7CiAgICB0cnkgewogICAgICBpZiAoVi5zdG9yZSkgewogICAgICAgIGlmIChWLnN0YXRlKSBWLnN0YXRlLnByZXZpb3VzUm91dGUgPSBWLnN0YXRlLnJvdXRlOwogICAgICAgIFYuc3RvcmUuc2V0KCdyb3V0ZScsIHJvdXRlKTsKICAgICAgICBWLnN0b3JlLnNldCgncGFyYW1zJywgcGFyYW1zIHx8IHt9KTsKICAgICAgfQogICAgfSBjYXRjaCAoZSkge30KICB9CgogIGZ1bmN0aW9uIG1vdW50QmFzZVZpZXcodmlld05hbWUsIHBhcmFtcykgewogICAgaWYgKCFvdXRsZXRFbCkgcmV0dXJuOwogICAgdmFyIHZpZXcgPSBWLnZpZXdzW3ZpZXdOYW1lXTsKICAgIGlmICghdmlldyB8fCB0eXBlb2Ygdmlldy5yZW5kZXIgIT09ICdmdW5jdGlvbicpIHsKICAgICAgbW91bnROb3RGb3VuZCh2aWV3TmFtZSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoY3VycmVudEJhc2VWaWV3ICYmIGN1cnJlbnRCYXNlVmlldyAhPT0gdmlld05hbWUpIHsKICAgICAgdmFyIHByZXYgPSBWLnZpZXdzW2N1cnJlbnRCYXNlVmlld107CiAgICAgIGlmIChwcmV2ICYmIHR5cGVvZiBwcmV2LnRlYXJkb3duID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdHJ5IHsgcHJldi50ZWFyZG93bigpOyB9IGNhdGNoIChlKSB7IGlmICh3aW5kb3cuY29uc29sZSkgY29uc29sZS5lcnJvcihlKTsgfQogICAgICB9CiAgICB9CgogICAgdmFyIHN3YXBwaW5nID0gY3VycmVudEJhc2VWaWV3ICE9PSB2aWV3TmFtZTsKICAgIGN1cnJlbnRCYXNlVmlldyA9IHZpZXdOYW1lOwoKICAgIHZhciBhbmltYXRlID0gc3dhcHBpbmcgJiYgIXByZWZlcnNSZWR1Y2VkTW90aW9uKCk7CiAgICB2YXIgZG9SZW5kZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmlldy5yZW5kZXIob3V0bGV0RWwsIHBhcmFtcyB8fCB7fSk7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIHJlbmRlclZpZXdFcnJvcihvdXRsZXRFbCwgdmlld05hbWUsIGVycik7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmVycm9yKCdbVi5yb3V0ZXJdIHZpZXcgIicgKyB2aWV3TmFtZSArICciIHJlbmRlciBmYWlsZWQ6JywgZXJyKTsKICAgICAgfQogICAgICBvdXRsZXRFbC5pZCA9ICd2LW91dGxldCc7CiAgICAgIGlmICghb3V0bGV0RWwuY2xhc3NMaXN0LmNvbnRhaW5zKCd2LW91dGxldCcpKSBvdXRsZXRFbC5jbGFzc0xpc3QuYWRkKCd2LW91dGxldCcpOwogICAgICB0cnkgeyBvdXRsZXRFbC5zY3JvbGxUb3AgPSAwOyB9IGNhdGNoIChlKSB7fQogICAgICBpZiAoYW5pbWF0ZSkgewogICAgICAgIG91dGxldEVsLmNsYXNzTGlzdC5yZW1vdmUoJ3Ytb3V0bGV0LS1sZWF2aW5nJyk7CiAgICAgICAgdm9pZCBvdXRsZXRFbC5vZmZzZXRXaWR0aDsKICAgICAgICBvdXRsZXRFbC5jbGFzc0xpc3QuYWRkKCd2LW91dGxldC0tZW50ZXJpbmcnKTsKICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBvdXRsZXRFbC5jbGFzc0xpc3QucmVtb3ZlKCd2LW91dGxldC0tZW50ZXJpbmcnKTsKICAgICAgICB9LCAyNDApOwogICAgICB9CiAgICB9OwoKICAgIGlmIChhbmltYXRlKSB7CiAgICAgIG91dGxldEVsLmNsYXNzTGlzdC5hZGQoJ3Ytb3V0bGV0LS1sZWF2aW5nJyk7CiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGRvUmVuZGVyLCA5MCk7CiAgICB9IGVsc2UgewogICAgICBkb1JlbmRlcigpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVuZGVyVmlld0Vycm9yKGhvc3QsIHZpZXdOYW1lLCBlcnIpIHsKICAgIGlmICghaG9zdCkgcmV0dXJuOwogICAgaG9zdC5pbm5lckhUTUwgPSAnJzsKICAgIHZhciBtc2cgPSAoZXJyICYmIGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogJ1RoaXMgc2NyZWVuIGZhaWxlZCB0byBsb2FkLic7CiAgICB2YXIgYm94ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5IHYtZW1wdHktLWVycm9yJywgcm9sZTogJ2FsZXJ0JyB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtZW1wdHlfX2ljb24nIH0sIGljb24oJ2JvbHQnKSksCiAgICAgIGVsKCdoMycsIHsgY2xhc3M6ICd2LWVtcHR5X190aXRsZScgfSwgJ1NvbWV0aGluZyB3ZW50IHdyb25nJyksCiAgICAgIGVsKCdwJywgeyBjbGFzczogJ3YtZW1wdHlfX21zZycgfSwgZXNjYXBlSHRtbChtc2cpKSwKICAgICAgZWwoJ2J1dHRvbicsIHsKICAgICAgICBjbGFzczogJ3YtY3RhIHYtY3RhLS1naG9zdCcsCiAgICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgeyBoYW5kbGVSb3V0ZSgpOyB9CiAgICAgIH0sICdUcnkgYWdhaW4nKQogICAgKTsKICAgIGhvc3QuYXBwZW5kQ2hpbGQoYm94KTsKICB9CgogIGZ1bmN0aW9uIG1vdW50Tm90Rm91bmQocm91dGUpIHsKICAgIGlmICghb3V0bGV0RWwpIHJldHVybjsKICAgIGlmIChjdXJyZW50QmFzZVZpZXcpIHsKICAgICAgdmFyIHByZXYgPSBWLnZpZXdzW2N1cnJlbnRCYXNlVmlld107CiAgICAgIGlmIChwcmV2ICYmIHR5cGVvZiBwcmV2LnRlYXJkb3duID09PSAnZnVuY3Rpb24nKSB7IHRyeSB7IHByZXYudGVhcmRvd24oKTsgfSBjYXRjaCAoZSkge30gfQogICAgfQogICAgY3VycmVudEJhc2VWaWV3ID0gbnVsbDsKICAgIG91dGxldEVsLmlubmVySFRNTCA9ICcnOwogICAgdmFyIGJveCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1lbXB0eScgfSwKICAgICAgZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWVtcHR5X19pY29uJyB9LCBpY29uKCdzcGFya2xlcycpKSwKICAgICAgZWwoJ2gzJywgeyBjbGFzczogJ3YtZW1wdHlfX3RpdGxlJyB9LCAnUGFnZSBub3QgZm91bmQnKSwKICAgICAgZWwoJ3AnLCB7IGNsYXNzOiAndi1lbXB0eV9fbXNnJyB9LAogICAgICAgICdXZSBjb3VsZG7igJl0IGZpbmQgJywgZWwoJ2NvZGUnLCBudWxsLCAnIy8nICsgZXNjYXBlSHRtbChyb3V0ZSB8fCAnJykpLCAnLicpLAogICAgICBlbCgnYnV0dG9uJywgewogICAgICAgIGNsYXNzOiAndi1jdGEgdi1jdGEtLXByaW1hcnknLAogICAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvJyArIERFRkFVTFRfUk9VVEUpOyB9CiAgICAgIH0sICdHbyB0byBDcmVhdGUnKQogICAgKTsKICAgIG91dGxldEVsLmFwcGVuZENoaWxkKGJveCk7CiAgfQoKICBmdW5jdGlvbiBtb3VudE92ZXJsYXkodmlld05hbWUsIHBhcmFtcykgewogICAgdmFyIHZpZXcgPSBWLnZpZXdzW3ZpZXdOYW1lXTsKICAgIGlmICghdmlldyB8fCB0eXBlb2Ygdmlldy5yZW5kZXIgIT09ICdmdW5jdGlvbicpIHsKICAgICAgZ28oJyMvbGlicmFyeScpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIW92ZXJsYXlIb3N0RWwpIHJldHVybjsKCiAgICB2YXIgcmVvcGVuaW5nID0gY3VycmVudE92ZXJsYXlWaWV3ICE9PSB2aWV3TmFtZTsKICAgIGN1cnJlbnRPdmVybGF5VmlldyA9IHZpZXdOYW1lOwoKICAgIG92ZXJsYXlIb3N0RWwuaW5uZXJIVE1MID0gJyc7CiAgICBvdmVybGF5SG9zdEVsLmhpZGRlbiA9IGZhbHNlOwogICAgb3ZlcmxheUhvc3RFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7CiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndi1oYXMtb3ZlcmxheScpOwoKICAgIHZhciBwYW5lbCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1vdmVybGF5X19wYW5lbCcsIHJvbGU6ICdkaWFsb2cnLCAnYXJpYS1tb2RhbCc6ICd0cnVlJyB9KTsKICAgIHZhciBiYWNrZHJvcCA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1vdmVybGF5X19iYWNrZHJvcCcsIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgY2xvc2VPdmVybGF5VG9CYXNlKCk7IH0gfSk7CiAgICBvdmVybGF5SG9zdEVsLmFwcGVuZENoaWxkKGJhY2tkcm9wKTsKICAgIG92ZXJsYXlIb3N0RWwuYXBwZW5kQ2hpbGQocGFuZWwpOwoKICAgIHRyeSB7CiAgICAgIHZpZXcucmVuZGVyKHBhbmVsLCBwYXJhbXMgfHwge30pOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIHJlbmRlclZpZXdFcnJvcihwYW5lbCwgdmlld05hbWUsIGVycik7CiAgICAgIGlmICh3aW5kb3cuY29uc29sZSkgY29uc29sZS5lcnJvcignW1Yucm91dGVyXSBvdmVybGF5ICInICsgdmlld05hbWUgKyAnIiByZW5kZXIgZmFpbGVkOicsIGVycik7CiAgICB9CgogICAgaWYgKHJlb3BlbmluZyAmJiAhcHJlZmVyc1JlZHVjZWRNb3Rpb24oKSkgewogICAgICBvdmVybGF5SG9zdEVsLmNsYXNzTGlzdC5yZW1vdmUoJ3Ytb3ZlcmxheS0taW4nKTsKICAgICAgdm9pZCBvdmVybGF5SG9zdEVsLm9mZnNldFdpZHRoOwogICAgICBvdmVybGF5SG9zdEVsLmNsYXNzTGlzdC5hZGQoJ3Ytb3ZlcmxheS0taW4nKTsKICAgIH0gZWxzZSB7CiAgICAgIG92ZXJsYXlIb3N0RWwuY2xhc3NMaXN0LmFkZCgndi1vdmVybGF5LS1pbicpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZGlzbWlzc092ZXJsYXkoKSB7CiAgICBpZiAoIWN1cnJlbnRPdmVybGF5VmlldykgcmV0dXJuOwogICAgdmFyIHZpZXcgPSBWLnZpZXdzW2N1cnJlbnRPdmVybGF5Vmlld107CiAgICBpZiAodmlldyAmJiB0eXBlb2Ygdmlldy50ZWFyZG93biA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgeyB2aWV3LnRlYXJkb3duKCk7IH0gY2F0Y2ggKGUpIHsgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmVycm9yKGUpOyB9CiAgICB9CiAgICBjdXJyZW50T3ZlcmxheVZpZXcgPSBudWxsOwogICAgaWYgKG92ZXJsYXlIb3N0RWwpIHsKICAgICAgb3ZlcmxheUhvc3RFbC5jbGFzc0xpc3QucmVtb3ZlKCd2LW92ZXJsYXktLWluJyk7CiAgICAgIG92ZXJsYXlIb3N0RWwuaW5uZXJIVE1MID0gJyc7CiAgICAgIG92ZXJsYXlIb3N0RWwuaGlkZGVuID0gdHJ1ZTsKICAgICAgb3ZlcmxheUhvc3RFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIH0KICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd2LWhhcy1vdmVybGF5Jyk7CiAgfQoKICBmdW5jdGlvbiBjbG9zZU92ZXJsYXlUb0Jhc2UoKSB7CiAgICB2YXIgYmFjayA9ICcjLycgKyAoY3VycmVudEJhc2VWaWV3ID8gcm91dGVGb3JWaWV3KGN1cnJlbnRCYXNlVmlldykgOiAnbGlicmFyeScpOwogICAgZ28oYmFjayk7CiAgfQoKICBmdW5jdGlvbiByb3V0ZUZvclZpZXcodmlld05hbWUpIHsKICAgIGZvciAodmFyIHIgaW4gUk9VVEVfVklFVykgewogICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFJPVVRFX1ZJRVcsIHIpICYmIFJPVVRFX1ZJRVdbcl0gPT09IHZpZXdOYW1lKSByZXR1cm4gcjsKICAgIH0KICAgIHJldHVybiB2aWV3TmFtZTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkQ2hyb21lKCkgewogICAgaWYgKCFhcHBSb290KSByZXR1cm47CiAgICBhcHBSb290LmlubmVySFRNTCA9ICcnOwoKICAgIHZhciBiZyA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1iZycsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9KTsKCiAgICB0b3BiYXJFbCA9IGJ1aWxkVG9wQmFyKCk7CgogICAgb3V0bGV0RWwgPSBlbCgnbWFpbicsIHsgaWQ6ICd2LW91dGxldCcsIGNsYXNzOiAndi1vdXRsZXQnLCByb2xlOiAnbWFpbicsIHRhYkluZGV4OiAtMSB9KTsKCiAgICBib3R0b21iYXJFbCA9IGJ1aWxkQm90dG9tQmFyKCk7CgogICAgZHJhd2VyU2NyaW1FbCA9IGVsKCdkaXYnLCB7CiAgICAgIGNsYXNzOiAndi1zY3JpbScsCiAgICAgIGhpZGRlbjogdHJ1ZSwKICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgeyBjbG9zZURyYXdlcigpOyB9CiAgICB9KTsKICAgIGRyYXdlckVsID0gZWwoJ2FzaWRlJywgewogICAgICBjbGFzczogJ3YtZHJhd2VyJywKICAgICAgaWQ6ICd2LWFjY291bnQtZHJhd2VyJywKICAgICAgcm9sZTogJ2RpYWxvZycsCiAgICAgICdhcmlhLW1vZGFsJzogJ3RydWUnLAogICAgICAnYXJpYS1sYWJlbCc6ICdBY2NvdW50IG1lbnUnLAogICAgICBoaWRkZW46IHRydWUKICAgIH0pOwoKICAgIG92ZXJsYXlIb3N0RWwgPSBlbCgnZGl2JywgewogICAgICBjbGFzczogJ3Ytb3ZlcmxheScsCiAgICAgIGlkOiAndi1zdHVkaW8tb3ZlcmxheScsCiAgICAgIGhpZGRlbjogdHJ1ZSwKICAgICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnCiAgICB9KTsKCiAgICBhcHBSb290LmFwcGVuZENoaWxkKGJnKTsKICAgIGFwcFJvb3QuYXBwZW5kQ2hpbGQodG9wYmFyRWwpOwogICAgYXBwUm9vdC5hcHBlbmRDaGlsZChvdXRsZXRFbCk7CiAgICBhcHBSb290LmFwcGVuZENoaWxkKGJvdHRvbWJhckVsKTsKICAgIGFwcFJvb3QuYXBwZW5kQ2hpbGQoZHJhd2VyU2NyaW1FbCk7CiAgICBhcHBSb290LmFwcGVuZENoaWxkKGRyYXdlckVsKTsKICAgIGFwcFJvb3QuYXBwZW5kQ2hpbGQob3ZlcmxheUhvc3RFbCk7CiAgfQoKICBmdW5jdGlvbiBidWlsZFRvcEJhcigpIHsKICAgIHZhciBiYXIgPSBlbCgnaGVhZGVyJywgeyBjbGFzczogJ3YtdG9wYmFyIGxpcXVpZC1nbGFzcyBsaXF1aWQtZ2xhc3MtbmF2IGdsYXNzLW5hdicsIHJvbGU6ICdiYW5uZXInIH0pOwoKICAgIHZhciB3b3JkbWFyayA9IGVsKCdhJywgewogICAgICBjbGFzczogJ3Ytd29yZG1hcmsgdi1ncmFkaWVudCcsCiAgICAgIGhyZWY6ICcjL2NyZWF0ZScsCiAgICAgICdhcmlhLWxhYmVsJzogJ1ZhbXAg4oCUIGdvIHRvIENyZWF0ZScsCiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZ28oJyMvY3JlYXRlJyk7IH0KICAgIH0sICdWQU1QJyk7CgogICAgdmFyIG5hdiA9IGVsKCduYXYnLCB7IGNsYXNzOiAndi10b3BuYXYnLCAnYXJpYS1sYWJlbCc6ICdQcmltYXJ5JyB9KTsKICAgIE5BVl9JVEVNUy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgIHZhciBsaW5rID0gZWwoJ2EnLCB7CiAgICAgICAgY2xhc3M6ICd2LXRvcG5hdl9faXRlbScsCiAgICAgICAgaHJlZjogJyMvJyArIGl0ZW0ucm91dGUsCiAgICAgICAgJ2RhdGEtcm91dGUnOiBpdGVtLnJvdXRlLAogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZ28oJyMvJyArIGl0ZW0ucm91dGUpOyB9CiAgICAgIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi10YWJfX2ljb24nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSwgaWNvbihpdGVtLmljb24pKSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXRvcG5hdl9fbGFiZWwnIH0sIGl0ZW0ubGFiZWwpKTsKICAgICAgbmF2LmFwcGVuZENoaWxkKGxpbmspOwogICAgfSk7CgogICAgdmFyIGNyZWRpdHNCdG4gPSBlbCgnYnV0dG9uJywgewogICAgICBjbGFzczogJ3YtY3JlZGl0cycsCiAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAnYXJpYS1sYWJlbCc6ICdDcmVkaXRzIOKAlCBhZGQgbW9yZScsCiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvcGF5d2FsbCcpOyB9CiAgICB9KTsKICAgIGNyZWRpdHNCdG4uYXBwZW5kQ2hpbGQoY3JlZGl0c1BpbGxDb250ZW50KGN1cnJlbnRDcmVkaXRzKCkpKTsKCiAgICB2YXIgaGFtYnVyZ2VyID0gZWwoJ2J1dHRvbicsIHsKICAgICAgY2xhc3M6ICd2LWhhbWJ1cmdlciBnbGFzcy1idXR0b24nLAogICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgJ2FyaWEtbGFiZWwnOiAnQWNjb3VudCBtZW51JywKICAgICAgJ2FyaWEtaGFzcG9wdXAnOiAnZGlhbG9nJywKICAgICAgJ2FyaWEtZXhwYW5kZWQnOiAnZmFsc2UnLAogICAgICAnYXJpYS1jb250cm9scyc6ICd2LWFjY291bnQtZHJhd2VyJywKICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgeyB0b2dnbGVEcmF3ZXIoKTsgfQogICAgfSwgaWNvbignbWVudScpKTsKCiAgICB2YXIgcmlnaHQgPSBlbCgnZGl2JywgeyBjbGFzczogJ3YtdG9wYmFyX19yaWdodCcgfSwgY3JlZGl0c0J0biwgaGFtYnVyZ2VyKTsKCiAgICBiYXIuYXBwZW5kQ2hpbGQod29yZG1hcmspOwogICAgYmFyLmFwcGVuZENoaWxkKG5hdik7CiAgICBiYXIuYXBwZW5kQ2hpbGQocmlnaHQpOwoKICAgIGJhci5fX2NyZWRpdHNCdG4gPSBjcmVkaXRzQnRuOwogICAgYmFyLl9faGFtYnVyZ2VyID0gaGFtYnVyZ2VyOwogICAgYmFyLl9fbmF2ID0gbmF2OwogICAgcmV0dXJuIGJhcjsKICB9CgogIGZ1bmN0aW9uIGNyZWRpdHNQaWxsQ29udGVudChuKSB7CiAgICBpZiAoVi51aSAmJiB0eXBlb2YgVi51aS5jcmVkaXRzUGlsbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB2YXIgbm9kZSA9IFYudWkuY3JlZGl0c1BpbGwobik7CiAgICAgIGlmIChub2RlICYmIG5vZGUubm9kZVR5cGUpIHJldHVybiBub2RlOwogICAgfQogICAgdmFyIHdyYXAgPSBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LWNyZWRpdHNfX2lubmVyJyB9LAogICAgICBpY29uKCdib2x0JyksCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtY3JlZGl0c19fbnVtJyB9LCBmb3JtYXRDcmVkaXRzKG4pKSwKICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi1jcmVkaXRzX19sYWJlbCcgfSwgJ2NyZWRpdHMnKQogICAgKTsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRCb3R0b21CYXIoKSB7CiAgICB2YXIgYmFyID0gZWwoJ25hdicsIHsgY2xhc3M6ICd2LWJvdHRvbWJhciBsaXF1aWQtZ2xhc3MgZ2xhc3MtbmF2JywgJ2FyaWEtbGFiZWwnOiAnUHJpbWFyeScgfSk7CiAgICBOQVZfSVRFTVMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICB2YXIgdGFiID0gZWwoJ2J1dHRvbicsIHsKICAgICAgICBjbGFzczogJ3YtdGFiJywKICAgICAgICB0eXBlOiAnYnV0dG9uJywKICAgICAgICAnZGF0YS1yb3V0ZSc6IGl0ZW0ucm91dGUsCiAgICAgICAgJ2FyaWEtbGFiZWwnOiBpdGVtLmxhYmVsLAogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsgZ28oJyMvJyArIGl0ZW0ucm91dGUpOyB9CiAgICAgIH0sCiAgICAgICAgZWwoJ3NwYW4nLCB7IGNsYXNzOiAndi10YWJfX2ljb24nLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSwgaWNvbihpdGVtLmljb24pKSwKICAgICAgICBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXRhYl9fbGFiZWwnIH0sIGl0ZW0ubGFiZWwpKTsKICAgICAgYmFyLmFwcGVuZENoaWxkKHRhYik7CiAgICB9KTsKICAgIHJldHVybiBiYXI7CiAgfQoKICBmdW5jdGlvbiBidWlsZERyYXdlckhlYWRlcigpIHsKICAgIHZhciB1ID0gVi5zdGF0ZSAmJiBWLnN0YXRlLnVzZXI7CiAgICB2YXIgbmFtZSA9ICh1ICYmICh1LmRpc3BsYXlOYW1lIHx8IHUubmFtZSB8fCB1LnVzZXJuYW1lKSkgfHwgJ0FjY291bnQnOwogICAgdmFyIGVtYWlsID0gKHUgJiYgdS5lbWFpbCkgfHwgJyc7CgogICAgdmFyIGF2YXRhciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2F2YXRhcicsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9LAogICAgICBlbCgnc3BhbicsIG51bGwsIGluaXRpYWxzRm9yKHUpKSk7CiAgICBpZiAodSAmJiB1LnByb2ZpbGVQaWNVUkwpIHsKICAgICAgYXZhdGFyID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9fYXZhdGFyJywgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sCiAgICAgICAgZWwoJ2ltZycsIHsgc3JjOiB1LnByb2ZpbGVQaWNVUkwsIGFsdDogJycsIGxvYWRpbmc6ICdsYXp5JyB9KSk7CiAgICB9CgogICAgdmFyIGlkZW50ID0gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9faWRlbnQnIH0sCiAgICAgIGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX25hbWUnIH0sIGVzY2FwZUh0bWwobmFtZSkpLAogICAgICBlbWFpbCA/IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2VtYWlsJyB9LCBlc2NhcGVIdG1sKGVtYWlsKSkgOiBudWxsKTsKCiAgICB2YXIgY2xvc2VCdG4gPSBlbCgnYnV0dG9uJywgewogICAgICBjbGFzczogJ3YtZHJhd2VyX19jbG9zZScsCiAgICAgIHR5cGU6ICdidXR0b24nLAogICAgICAnYXJpYS1sYWJlbCc6ICdDbG9zZSBtZW51JywKICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgeyBjbG9zZURyYXdlcigpOyB9CiAgICB9LCBpY29uKCdjbG9zZScpKTsKCiAgICByZXR1cm4gZWwoJ2RpdicsIHsgY2xhc3M6ICd2LWRyYXdlcl9faGVhZGVyJyB9LCBhdmF0YXIsIGlkZW50LCBjbG9zZUJ0bik7CiAgfQoKICBmdW5jdGlvbiBpbml0aWFsc0Zvcih1KSB7CiAgICBpZiAoIXUpIHJldHVybiAn4pyoJzsKICAgIHZhciBzcmMgPSB1LmRpc3BsYXlOYW1lIHx8IHUubmFtZSB8fCB1LnVzZXJuYW1lIHx8IHUuZW1haWwgfHwgJyc7CiAgICB2YXIgcGFydHMgPSBTdHJpbmcoc3JjKS50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKTsKICAgIGlmICghcGFydHMubGVuZ3RoKSByZXR1cm4gJ+KcqCc7CiAgICBpZiAocGFydHMubGVuZ3RoID09PSAxKSByZXR1cm4gcGFydHNbMF0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCk7CiAgICByZXR1cm4gKHBhcnRzWzBdLmNoYXJBdCgwKSArIHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdLmNoYXJBdCgwKSkudG9VcHBlckNhc2UoKTsKICB9CgogIGZ1bmN0aW9uIG9wZW5EcmF3ZXIoKSB7CiAgICBpZiAoIWRyYXdlckVsKSByZXR1cm47CiAgICBsYXN0Rm9jdXNCZWZvcmVEcmF3ZXIgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwoKICAgIGRyYXdlckVsLmlubmVySFRNTCA9ICcnOwogICAgZHJhd2VyRWwuYXBwZW5kQ2hpbGQoYnVpbGREcmF3ZXJIZWFkZXIoKSk7CiAgICB2YXIgYm9keSA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2JvZHknIH0pOwogICAgZHJhd2VyRWwuYXBwZW5kQ2hpbGQoYm9keSk7CgogICAgaWYgKFYudmlld3MuYWNjb3VudCAmJiB0eXBlb2YgVi52aWV3cy5hY2NvdW50LnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgewogICAgICAgIFYudmlld3MuYWNjb3VudC5yZW5kZXIoYm9keSwgY3VycmVudCgpLnBhcmFtcyk7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIHJlbmRlclZpZXdFcnJvcihib2R5LCAnYWNjb3VudCcsIGVycik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoZWwoJ3AnLCB7IGNsYXNzOiAndi1kcmF3ZXJfX2VtcHR5JyB9LCAnQWNjb3VudCBtZW51IHVuYXZhaWxhYmxlLicpKTsKICAgIH0KCiAgICBkcmF3ZXJFbC5hcHBlbmRDaGlsZChlbCgnZGl2JywgeyBjbGFzczogJ3YtZHJhd2VyX19mb290ZXInIH0sCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZHJhd2VyX19icmFuZCB2LWdyYWRpZW50JyB9LCAnVm9vc2V5JyksCiAgICAgIGVsKCdzcGFuJywgeyBjbGFzczogJ3YtZHJhd2VyX19jb3B5JyB9LAogICAgICAgICfCqSAnICsgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpICsgJyBWb29zZXkgTExDIOKAoiBBbGwgUmlnaHRzIFJlc2VydmVkJykpKTsKCiAgICBkcmF3ZXJTY3JpbUVsLmhpZGRlbiA9IGZhbHNlOwogICAgZHJhd2VyRWwuaGlkZGVuID0gZmFsc2U7CiAgICB2b2lkIGRyYXdlckVsLm9mZnNldFdpZHRoOwogICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3YtZHJhd2VyLW9wZW4nKTsKICAgIGRyYXdlclNjcmltRWwuY2xhc3NMaXN0LmFkZCgndi1zY3JpbS0taW4nKTsKICAgIGRyYXdlckVsLmNsYXNzTGlzdC5hZGQoJ3YtZHJhd2VyLS1pbicpOwoKICAgIGlmIChWLnN0b3JlKSBWLnN0b3JlLnNldCgnZHJhd2VyT3BlbicsIHRydWUpOwogICAgaWYgKHRvcGJhckVsICYmIHRvcGJhckVsLl9faGFtYnVyZ2VyKSB0b3BiYXJFbC5fX2hhbWJ1cmdlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpOwoKICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIGZvY3VzYWJsZSA9IGRyYXdlckVsLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbiwgYSwgaW5wdXQsIFt0YWJpbmRleF0nKTsKICAgICAgaWYgKGZvY3VzYWJsZSkgdHJ5IHsgZm9jdXNhYmxlLmZvY3VzKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICB9LCA2MCk7CiAgfQoKICBmdW5jdGlvbiBjbG9zZURyYXdlcigpIHsKICAgIGlmICghZHJhd2VyRWwgfHwgZHJhd2VyRWwuaGlkZGVuKSByZXR1cm47CiAgICBkcmF3ZXJFbC5jbGFzc0xpc3QucmVtb3ZlKCd2LWRyYXdlci0taW4nKTsKICAgIGRyYXdlclNjcmltRWwuY2xhc3NMaXN0LnJlbW92ZSgndi1zY3JpbS0taW4nKTsKICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd2LWRyYXdlci1vcGVuJyk7CiAgICBpZiAodG9wYmFyRWwgJiYgdG9wYmFyRWwuX19oYW1idXJnZXIpIHRvcGJhckVsLl9faGFtYnVyZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpOwogICAgaWYgKFYuc3RvcmUpIFYuc3RvcmUuc2V0KCdkcmF3ZXJPcGVuJywgZmFsc2UpOwoKICAgIHZhciBmaW5hbGl6ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgZHJhd2VyRWwuaGlkZGVuID0gdHJ1ZTsKICAgICAgZHJhd2VyU2NyaW1FbC5oaWRkZW4gPSB0cnVlOwogICAgICBkcmF3ZXJFbC5pbm5lckhUTUwgPSAnJzsKICAgIH07CiAgICBpZiAocHJlZmVyc1JlZHVjZWRNb3Rpb24oKSkgZmluYWxpemUoKTsKICAgIGVsc2Ugd2luZG93LnNldFRpbWVvdXQoZmluYWxpemUsIDI2MCk7CgogICAgaWYgKGxhc3RGb2N1c0JlZm9yZURyYXdlciAmJiB0eXBlb2YgbGFzdEZvY3VzQmVmb3JlRHJhd2VyLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7IGxhc3RGb2N1c0JlZm9yZURyYXdlci5mb2N1cygpOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgbGFzdEZvY3VzQmVmb3JlRHJhd2VyID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHRvZ2dsZURyYXdlcigpIHsKICAgIGlmIChkcmF3ZXJFbCAmJiAhZHJhd2VyRWwuaGlkZGVuKSBjbG9zZURyYXdlcigpOwogICAgZWxzZSBvcGVuRHJhd2VyKCk7CiAgfQoKICBmdW5jdGlvbiBzeW5jQ2hyb21lKCkgewogICAgaWYgKCFhcHBSb290KSByZXR1cm47CiAgICB2YXIgZGVzYyA9IGN1cnJlbnQoKTsKICAgIHZhciByb3V0ZSA9IGRlc2Mucm91dGU7CiAgICB2YXIgYmFyZVZpZXcgPSByb3V0ZSA9PT0gJ2F1dGgnIHx8IHJvdXRlID09PSAnb25ib2FyZGluZyc7CiAgICB2YXIgb3ZlcmxheUFjdGl2ZSA9ICEhY3VycmVudE92ZXJsYXlWaWV3OwoKICAgIGFwcFJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgndi1hcHAtLWJhcmUnLCBiYXJlVmlldyk7CgogICAgaWYgKHRvcGJhckVsKSB0b3BiYXJFbC5oaWRkZW4gPSBiYXJlVmlldzsKICAgIGlmIChib3R0b21iYXJFbCkgYm90dG9tYmFyRWwuaGlkZGVuID0gYmFyZVZpZXcgfHwgb3ZlcmxheUFjdGl2ZTsKCiAgICB2YXIgYWN0aXZlUm91dGUgPSByb3V0ZSA9PT0gJ2ltYWdlJyA/IHJvdXRlRm9yVmlldyhjdXJyZW50QmFzZVZpZXcgfHwgJ2xpYnJhcnknKSA6IHJvdXRlOwogICAgc2V0QWN0aXZlTmF2KGFjdGl2ZVJvdXRlKTsKCiAgICByZWZyZXNoQ3JlZGl0c1BpbGwoKTsKICB9CgogIGZ1bmN0aW9uIHNldEFjdGl2ZU5hdihhY3RpdmVSb3V0ZSkgewogICAgaWYgKGJvdHRvbWJhckVsKSB7CiAgICAgIHZhciB0YWJzID0gYm90dG9tYmFyRWwucXVlcnlTZWxlY3RvckFsbCgnLnYtdGFiJyk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciByID0gdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcm91dGUnKTsKICAgICAgICB2YXIgb24gPSByID09PSBhY3RpdmVSb3V0ZTsKICAgICAgICB0YWJzW2ldLmNsYXNzTGlzdC50b2dnbGUoJ3YtdGFiLS1hY3RpdmUnLCBvbik7CiAgICAgICAgaWYgKG9uKSB0YWJzW2ldLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywgJ3BhZ2UnKTsKICAgICAgICBlbHNlIHRhYnNbaV0ucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnKTsKICAgICAgfQogICAgfQogICAgaWYgKHRvcGJhckVsICYmIHRvcGJhckVsLl9fbmF2KSB7CiAgICAgIHZhciBpdGVtcyA9IHRvcGJhckVsLl9fbmF2LnF1ZXJ5U2VsZWN0b3JBbGwoJy52LXRvcG5hdl9faXRlbScpOwogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGl0ZW1zLmxlbmd0aDsgaisrKSB7CiAgICAgICAgdmFyIHIyID0gaXRlbXNbal0uZ2V0QXR0cmlidXRlKCdkYXRhLXJvdXRlJyk7CiAgICAgICAgdmFyIG9uMiA9IHIyID09PSBhY3RpdmVSb3V0ZTsKICAgICAgICBpdGVtc1tqXS5jbGFzc0xpc3QudG9nZ2xlKCd2LXRvcG5hdl9faXRlbS0tYWN0aXZlJywgb24yKTsKICAgICAgICBpZiAob24yKSBpdGVtc1tqXS5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICdwYWdlJyk7CiAgICAgICAgZWxzZSBpdGVtc1tqXS5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZWZyZXNoQ3JlZGl0c1BpbGwoKSB7CiAgICBpZiAoIXRvcGJhckVsIHx8ICF0b3BiYXJFbC5fX2NyZWRpdHNCdG4pIHJldHVybjsKICAgIHZhciBidG4gPSB0b3BiYXJFbC5fX2NyZWRpdHNCdG47CiAgICBidG4uaW5uZXJIVE1MID0gJyc7CiAgICBidG4uYXBwZW5kQ2hpbGQoY3JlZGl0c1BpbGxDb250ZW50KGN1cnJlbnRDcmVkaXRzKCkpKTsKICB9CgogIGZ1bmN0aW9uIGN1cnJlbnRDcmVkaXRzKCkgewogICAgdmFyIGMgPSBWLnN0YXRlID8gVi5zdGF0ZS5jcmVkaXRzIDogbnVsbDsKICAgIHJldHVybiB0eXBlb2YgYyA9PT0gJ251bWJlcicgPyBjIDogMDsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdENyZWRpdHMobikgewogICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCAhaXNGaW5pdGUobikpIHJldHVybiAnMCc7CiAgICB0cnkgeyByZXR1cm4gbi50b0xvY2FsZVN0cmluZygnZW4tVVMnKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gU3RyaW5nKG4pOyB9CiAgfQoKICBmdW5jdGlvbiBzaG93Qm9vdExvYWRlcigpIHsKICAgIGlmICghb3V0bGV0RWwpIHJldHVybjsKICAgIG91dGxldEVsLmlubmVySFRNTCA9ICcnOwogICAgdmFyIGxvYWRlciA9IGVsKCdkaXYnLCB7IGNsYXNzOiAndi1ib290JyB9LAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtYm9vdF9fbWFyayB2LWdyYWRpZW50JyB9LCAnVkFNUCcpLAogICAgICBlbCgnZGl2JywgeyBjbGFzczogJ3YtYm9vdF9fc3Bpbm5lcicsICdhcmlhLWxhYmVsJzogJ0xvYWRpbmcnLCByb2xlOiAnc3RhdHVzJyB9LAogICAgICAgIFYudWkgJiYgdHlwZW9mIFYudWkuc3Bpbm5lciA9PT0gJ2Z1bmN0aW9uJyA/IHNhZmVTcGlubmVyKCkgOiBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXNwaW5uZXInIH0pKQogICAgKTsKICAgIG91dGxldEVsLmFwcGVuZENoaWxkKGxvYWRlcik7CiAgfQoKICBmdW5jdGlvbiBzYWZlU3Bpbm5lcigpIHsKICAgIHRyeSB7CiAgICAgIHZhciBzID0gVi51aS5zcGlubmVyKCk7CiAgICAgIGlmIChzICYmIHMubm9kZVR5cGUpIHJldHVybiBzOwogICAgfSBjYXRjaCAoZSkge30KICAgIHJldHVybiBlbCgnc3BhbicsIHsgY2xhc3M6ICd2LXNwaW5uZXInIH0pOwogIH0KCiAgZnVuY3Rpb24gd2lyZVN0b3JlRXZlbnRzKCkgewogICAgaWYgKCFWLnN0b3JlIHx8IHR5cGVvZiBWLnN0b3JlLm9uICE9PSAnZnVuY3Rpb24nKSByZXR1cm47CgogICAgVi5zdG9yZS5vbignYXV0aDpjaGFuZ2VkJywgZnVuY3Rpb24gKCkgewogICAgICB2YXIgYXV0aGVkID0gVi5hdXRoICYmIHR5cGVvZiBWLmF1dGguaXNBdXRoZWQgPT09ICdmdW5jdGlvbicgPyBWLmF1dGguaXNBdXRoZWQoKSA6IGZhbHNlOwogICAgICBpZiAoIWJvb3RpbmcpIHsKICAgICAgICBpZiAoIWF1dGhlZCkgewogICAgICAgICAgY2xvc2VEcmF3ZXIoKTsKICAgICAgICAgIGRpc21pc3NPdmVybGF5KCk7CiAgICAgICAgICBoYW5kbGVSb3V0ZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzeW5jQ2hyb21lKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICBWLnN0b3JlLm9uKCdjcmVkaXRzOmNoYW5nZWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHJlZnJlc2hDcmVkaXRzUGlsbCgpOwogICAgfSk7CgogICAgVi5zdG9yZS5vbignZXJyb3InLCBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICB2YXIgbXNnID0gcGF5bG9hZCAmJiBwYXlsb2FkLm1lc3NhZ2UgPyBwYXlsb2FkLm1lc3NhZ2UgOiAnU29tZXRoaW5nIHdlbnQgd3JvbmcuJzsKICAgICAgdG9hc3QobXNnLCAnZXJyb3InKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gd2lyZUdsb2JhbEhhbmRsZXJzKCkgewogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7IGhhbmRsZVJvdXRlKCk7IH0sIGZhbHNlKTsKCiAgICB3aW5kb3cub25lcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBzb3VyY2UsIGxpbmVubywgY29sbm8sIGVycm9yKSB7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmVycm9yKCdbVi5vbmVycm9yXScsIG1lc3NhZ2UsIGVycm9yIHx8ICcnKTsKICAgICAgICB0b2FzdChmcmllbmRseUVycm9yKG1lc3NhZ2UpLCAnZXJyb3InKTsKICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKCiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5oYW5kbGVkcmVqZWN0aW9uJywgZnVuY3Rpb24gKGV2KSB7CiAgICAgIHZhciByZWFzb24gPSBldiAmJiBldi5yZWFzb247CiAgICAgIHZhciBtc2cgPSByZWFzb24gJiYgcmVhc29uLm1lc3NhZ2UgPyByZWFzb24ubWVzc2FnZSA6ICdBIGJhY2tncm91bmQgdGFzayBmYWlsZWQuJzsKICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmVycm9yKCdbVi51bmhhbmRsZWRyZWplY3Rpb25dJywgcmVhc29uIHx8ICcnKTsKICAgICAgaWYgKHJlYXNvbiAmJiAocmVhc29uLm5hbWUgPT09ICdBYm9ydEVycm9yJyB8fCByZWFzb24uYWJvcnRlZCA9PT0gdHJ1ZSkpIHJldHVybjsKICAgICAgdG9hc3QoZnJpZW5kbHlFcnJvcihtc2cpLCAnZXJyb3InKTsKICAgIH0pOwoKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvZmZsaW5lJywgZnVuY3Rpb24gKCkgeyB0b2FzdCgnWW914oCZcmUgb2ZmbGluZS4gQ2hhbmdlcyB3aWxsIHJldHJ5LicsICd3YXJuaW5nJyk7IH0pOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29ubGluZScsIGZ1bmN0aW9uICgpIHsgdG9hc3QoJ0JhY2sgb25saW5lLicsICdzdWNjZXNzJyk7IH0pOwoKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnIHx8IGUua2V5Q29kZSA9PT0gMjcpIHsKICAgICAgICBpZiAoY3VycmVudE92ZXJsYXlWaWV3KSB7IGNsb3NlT3ZlcmxheVRvQmFzZSgpOyBlLnByZXZlbnREZWZhdWx0KCk7IHJldHVybjsgfQogICAgICAgIGlmIChkcmF3ZXJFbCAmJiAhZHJhd2VyRWwuaGlkZGVuKSB7IGNsb3NlRHJhd2VyKCk7IGUucHJldmVudERlZmF1bHQoKTsgcmV0dXJuOyB9CiAgICAgIH0KICAgIH0sIGZhbHNlKTsKCiAgICBpZiAod2luZG93Lm1hdGNoTWVkaWEpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgbXEgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpOwogICAgICAgIHZhciBvblRoZW1lQ2hhbmdlID0gZnVuY3Rpb24gKCkgeyBhcHBseVRoZW1lKCk7IH07CiAgICAgICAgaWYgKG1xLmFkZEV2ZW50TGlzdGVuZXIpIG1xLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIG9uVGhlbWVDaGFuZ2UpOwogICAgICAgIGVsc2UgaWYgKG1xLmFkZExpc3RlbmVyKSBtcS5hZGRMaXN0ZW5lcihvblRoZW1lQ2hhbmdlKTsKICAgICAgfSBjYXRjaCAoZSkge30KICAgIH0KICB9CgogIGZ1bmN0aW9uIGZyaWVuZGx5RXJyb3IobXNnKSB7CiAgICB2YXIgbSA9IFN0cmluZyhtc2cgPT0gbnVsbCA/ICcnIDogbXNnKTsKICAgIGlmICgvbmV0d29ya3xmZXRjaHxsb2FkIGZhaWxlZHxmYWlsZWQgdG8gZmV0Y2gvaS50ZXN0KG0pKSB7CiAgICAgIHJldHVybiAnTmV0d29yayBoaWNjdXAg4oCUIHBsZWFzZSB0cnkgYWdhaW4uJzsKICAgIH0KICAgIGlmIChtLmxlbmd0aCA+IDE2MCkgbSA9IG0uc2xpY2UoMCwgMTU3KSArICfigKYnOwogICAgcmV0dXJuIG0gfHwgJ1NvbWV0aGluZyB3ZW50IHdyb25nLic7CiAgfQoKICB2YXIgcGVuZGluZ1JlZmVycmFsID0gbnVsbDsKICB2YXIgcGVuZGluZ1B1cmNoYXNlU3VjY2VzcyA9IGZhbHNlOwoKICBmdW5jdGlvbiBjYXB0dXJlR2xvYmFsSW50ZW50cygpIHsKICAgIHZhciBzZWFyY2ggPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoIHx8ICcnOwogICAgdmFyIHNlYXJjaFBhcmFtcyA9IHBhcnNlUXVlcnkoc2VhcmNoLmNoYXJBdCgwKSA9PT0gJz8nID8gc2VhcmNoLnNsaWNlKDEpIDogc2VhcmNoKTsKICAgIHZhciBoYXNoUGFyYW1zID0gY3VycmVudCgpLnBhcmFtcyB8fCB7fTsKCiAgICB2YXIgcmVmID0gc2VhcmNoUGFyYW1zLnIgfHwgaGFzaFBhcmFtcy5yIHx8IG51bGw7CiAgICBpZiAocmVmKSBwZW5kaW5nUmVmZXJyYWwgPSBTdHJpbmcocmVmKS50cmltKCk7CgogICAgdmFyIHB1cmNoYXNlID0gKHNlYXJjaFBhcmFtcy5wdXJjaGFzZSB8fCBoYXNoUGFyYW1zLnB1cmNoYXNlIHx8ICcnKS50b1N0cmluZygpOwogICAgaWYgKHB1cmNoYXNlID09PSAnc3VjY2VzcycpIHBlbmRpbmdQdXJjaGFzZVN1Y2Nlc3MgPSB0cnVlOwogIH0KCiAgZnVuY3Rpb24gZmx1c2hHbG9iYWxJbnRlbnRzKGF1dGhlZCkgewogICAgaWYgKHBlbmRpbmdQdXJjaGFzZVN1Y2Nlc3MpIHsKICAgICAgcGVuZGluZ1B1cmNoYXNlU3VjY2VzcyA9IGZhbHNlOwogICAgICBpZiAoYXV0aGVkICYmIFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLnJlZnJlc2hDcmVkaXRzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgVi5hdXRoLnJlZnJlc2hDcmVkaXRzKCk7CiAgICAgIH0KICAgICAgdG9hc3QoJ1B1cmNoYXNlIGNvbXBsZXRlIOKAlCBjcmVkaXRzIGFkZGVkIScsICdzdWNjZXNzJyk7CiAgICAgIGNlbGVicmF0ZSgpOwogICAgICBzdHJpcEdsb2JhbFF1ZXJ5UGFyYW0oJ3B1cmNoYXNlJyk7CiAgICB9CgogICAgaWYgKHBlbmRpbmdSZWZlcnJhbCkgewogICAgICB2YXIgY29kZSA9IHBlbmRpbmdSZWZlcnJhbDsKICAgICAgcGVuZGluZ1JlZmVycmFsID0gbnVsbDsKICAgICAgYXR0cmlidXRlUmVmZXJyYWwoY29kZSwgYXV0aGVkKTsKICAgICAgc3RyaXBHbG9iYWxRdWVyeVBhcmFtKCdyJyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhdHRyaWJ1dGVSZWZlcnJhbChjb2RlLCBhdXRoZWQpIHsKICAgIGlmICghY29kZSkgcmV0dXJuOwogICAgaWYgKCFhdXRoZWQpIHsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoVi5zdG9yZSkgewogICAgICAgICAgdmFyIHMgPSBWLnN0YXRlLnNldHRpbmdzIHx8IHt9OwogICAgICAgICAgcy5wZW5kaW5nUmVmZXJyYWwgPSBjb2RlOwogICAgICAgICAgVi5zdG9yZS5zZXQoJ3NldHRpbmdzJywgcyk7CiAgICAgICAgICBWLnN0b3JlLnNhdmUoKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChWLmFwaSAmJiB0eXBlb2YgVi5hcGkuYXR0cmlidXRlUmVmZXJyYWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgVi5hcGkuYXR0cmlidXRlUmVmZXJyYWwoY29kZSkKICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICB0b2FzdCgnUmVmZXJyYWwgYXBwbGllZCDigJQgd2VsY29tZSBhYm9hcmQhJywgJ3N1Y2Nlc3MnKTsKICAgICAgICAgIGNlbGVicmF0ZSgpOwogICAgICAgICAgaWYgKFYuYXV0aCAmJiB0eXBlb2YgVi5hdXRoLnJlZnJlc2hDcmVkaXRzID09PSAnZnVuY3Rpb24nKSBWLmF1dGgucmVmcmVzaENyZWRpdHMoKTsKICAgICAgICB9KQogICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjZWxlYnJhdGUoKSB7CiAgICBpZiAocHJlZmVyc1JlZHVjZWRNb3Rpb24oKSkgcmV0dXJuOwogICAgaWYgKFYudWkgJiYgdHlwZW9mIFYudWkuY29uZmV0dGkgPT09ICdmdW5jdGlvbicpIHsgdHJ5IHsgVi51aS5jb25mZXR0aSgpOyB9IGNhdGNoIChlKSB7fSB9CiAgfQoKICBmdW5jdGlvbiBzdHJpcEdsb2JhbFF1ZXJ5UGFyYW0oa2V5KSB7CiAgICB0cnkgewogICAgICB2YXIgbG9jID0gd2luZG93LmxvY2F0aW9uOwogICAgICB2YXIgYmFzZSA9IGxvYy5ocmVmLnNwbGl0KCcjJylbMF0uc3BsaXQoJz8nKVswXTsKCiAgICAgIHZhciBzZWFyY2hQYXJhbXMgPSBwYXJzZVF1ZXJ5KChsb2Muc2VhcmNoIHx8ICcnKS5yZXBsYWNlKC9eXD8vLCAnJykpOwogICAgICBkZWxldGUgc2VhcmNoUGFyYW1zW2tleV07CiAgICAgIHZhciBuZXdTZWFyY2ggPSBidWlsZFF1ZXJ5KHNlYXJjaFBhcmFtcyk7CgogICAgICB2YXIgZGVzYyA9IGN1cnJlbnQoKTsKICAgICAgdmFyIGhwID0gT2JqZWN0LmFzc2lnbih7fSwgZGVzYy5wYXJhbXMgfHwge30pOwogICAgICBkZWxldGUgaHBba2V5XTsKICAgICAgZGVsZXRlIGhwLl9fb3ZlcmxheTsKICAgICAgdmFyIGhhc2hRdWVyeSA9IGJ1aWxkUXVlcnkoaHApOwogICAgICB2YXIgbmV3SGFzaCA9ICcjLycgKyAoZGVzYy5wYXRoIHx8IERFRkFVTFRfUk9VVEUpICsgKGhhc2hRdWVyeSA/ICc/JyArIGhhc2hRdWVyeSA6ICcnKTsKCiAgICAgIHZhciBuZXdVcmwgPSBiYXNlICsgKG5ld1NlYXJjaCA/ICc/JyArIG5ld1NlYXJjaCA6ICcnKSArIG5ld0hhc2g7CiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgbmV3VXJsKTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBmdW5jdGlvbiBidWlsZFF1ZXJ5KG9iaikgewogICAgdmFyIHBhcnRzID0gW107CiAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGspKSBjb250aW51ZTsKICAgICAgaWYgKG9ialtrXSA9PSBudWxsIHx8IG9ialtrXSA9PT0gJycpIHsgcGFydHMucHVzaChlbmNvZGVVUklDb21wb25lbnQoaykpOyBjb250aW51ZTsgfQogICAgICBwYXJ0cy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChvYmpba10pKTsKICAgIH0KICAgIHJldHVybiBwYXJ0cy5qb2luKCcmJyk7CiAgfQoKICBmdW5jdGlvbiBhcHBseVRoZW1lKCkgewogICAgdmFyIHByZWYgPSAoVi5zdGF0ZSAmJiBWLnN0YXRlLnNldHRpbmdzICYmIFYuc3RhdGUuc2V0dGluZ3MudGhlbWUpIHx8ICdzeXN0ZW0nOwogICAgdmFyIHJlc29sdmVkID0gcHJlZjsKICAgIGlmIChwcmVmID09PSAnc3lzdGVtJykgewogICAgICByZXNvbHZlZCA9CiAgICAgICAgd2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpJykubWF0Y2hlcwogICAgICAgICAgPyAnbGlnaHQnCiAgICAgICAgICA6ICdkYXJrJzsKICAgIH0KICAgIHZhciByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnLCByZXNvbHZlZCk7CiAgICByb290LmNsYXNzTGlzdC50b2dnbGUoJ3YtdGhlbWUtbGlnaHQnLCByZXNvbHZlZCA9PT0gJ2xpZ2h0Jyk7CiAgICByb290LmNsYXNzTGlzdC50b2dnbGUoJ3YtdGhlbWUtZGFyaycsIHJlc29sdmVkICE9PSAnbGlnaHQnKTsKICB9CgogIGZ1bmN0aW9uIHByZWZlcnNSZWR1Y2VkTW90aW9uKCkgewogICAgaWYgKFYuc3RhdGUgJiYgVi5zdGF0ZS5zZXR0aW5ncyAmJiBWLnN0YXRlLnNldHRpbmdzLnJlZHVjZU1vdGlvbiA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7CiAgICB0cnkgewogICAgICByZXR1cm4gISEod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJykubWF0Y2hlcyk7CiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfQogIH0KCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGJvb3QsIHsgb25jZTogdHJ1ZSB9KTsKICB9IGVsc2UgewogICAgd2luZG93LnNldFRpbWVvdXQoYm9vdCwgMCk7CiAgfQoKICBWLnJvdXRlci5vcGVuRHJhd2VyID0gb3BlbkRyYXdlcjsKICBWLnJvdXRlci5jbG9zZURyYXdlciA9IGNsb3NlRHJhd2VyOwogIFYucm91dGVyLnRvZ2dsZURyYXdlciA9IHRvZ2dsZURyYXdlcjsKICBWLnJvdXRlci5yZWZyZXNoQ2hyb21lID0gc3luY0Nocm9tZTsKfSkoKTsKCg==";  var CSS_B64 = "";  var UNFILLED = function (t) { return !t || t.charAt(0) === "_" || t.indexOf("VAMP_") !== -1 && t.indexOf("_B64__") !== -1; };  function fatal(msg) {    try {      var m = document.getElementById("vamp-app");      if (!m) return;      m.removeAttribute("aria-busy");      m.innerHTML =        '<div class="v-boot v-boot--error" role="alert">' +          '<div class="v-boot-mark">VAMP</div>' +          '<p class="v-boot-msg"></p>' +          '<button class="v-boot-retry" type="button" onclick="location.reload()">Reload</button>' +        '</div>';      m.querySelector(".v-boot-msg").textContent = msg;    } catch (e) { /* last resort: leave the static loader */ }  }  function inject(src, kind) {    var node;    if (kind === "css") {      node = document.createElement("style");      node.textContent = src;      document.head.appendChild(node);    } else {      node = document.createElement("script");      node.textContent = src;          /* execute the decoded app bundle */      document.body.appendChild(node);    }    return node;  }  function decode(b64) {    /* atob -> UTF-8 safe decode (handles non-ASCII in the bundle) */    var bin = atob(b64), bytes = new Uint8Array(bin.length), i = 0;    for (; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);    return new TextDecoder("utf-8").decode(bytes);  }  function boot() {    try {      if (UNFILLED(APP_B64)) {        fatal("Vamp is not deployed yet — the app bundle placeholder was not replaced by the build.");        return;      }      if (!UNFILLED(CSS_B64)) { inject(decode(CSS_B64), "css"); } /* optional inlined CSS */      inject(decode(APP_B64), "js");                              /* the real app boots from here */    } catch (err) {      fatal("Vamp failed to start. " + (err && err.message ? err.message : "Unknown error") + " — try reloading.");    }  }  if (document.readyState === "loading") {    document.addEventListener("DOMContentLoaded", boot, { once: true });  } else {    boot();  }})();</script>


---
