Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_💯懒人专用系列———全网VIP视频破解去广告@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDwn5KvIOaHkuS6uuS4k+eUqOezu+WIlyDigJTigJTigJQg5YWo572RIFZJUCDop4bpopHnoLTop6Pljrvlub/lkYoKLy8gQG5hbWVzcGFjZSAgICBsci10b29sYm94LVZpZGVvUGxheQovLyBAdmVyc2lvbiAgICAgIDEuMC4yNQovLyBAZGVzY3JpcHRpb24gIOKtleeyvumAieino+aekOe6v+i3r+S4uuWkp+WutuaPkOS+m+S8mOmFt+OAgeeIseWlh+iJuuOAgeiFvuiur+OAgULnq5koYmlsaWJpbGkp44CB5LmQ6KeG44CB6IqS5p6c44CB5pCc54uQ44CBUFBUVuetieWQhOWkp+inhumikee9keermShQQyvnp7vliqjnq68p6KeG6aKR6Kej5p6Q5pyN5Yqh77yM6K6p5L2g55yB5Y676LSt5Lmw6KeG6aKRVklQ6LS555So44CC4q2V5Y676Zmk5Y6f6KeG6aKR5bm/5ZGK44CC4q2V5Y+v6Ieq55Sx5aKe5Yqg5L+u5pS557q/6Lev44CC4q2V5Y+v6Ieq55Sx6YCJ5oup56uZ5YaF5aSW6Kej5p6Q44CC4q2V5Y+v6Ieq55Sx5L+u5pS55Zu+5qCH5L2N572u44CB5aSn5bCP44CB6YCP5piO5bqm44CC4p2M5ouS57ud5pS26LS544CC4q2V5oyB57ut5pu05paw44CCCi8vIEBhdXRob3IgICAgICAgbGFuaGFoYQovLyBAaWNvbiAgICAgICAgIGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBR1FBQUFCa0NBWUFBQUJ3NHBWVUFBQVE4RWxFUVZSNFh1MWRDWFFVUlJyK2FwSVFUMXdRdzZFWUJjU0VyQ2dLQ29Rb3dvb2NMaXJLZW9Bb0xENXgyWUR1K2hUQ1BuZGRKZUM1Q3Q2Z0lCdGRsVU1ReEFQRTk1Z01La2Job1dHQ0tNZ3BzUGpVb0VzSWtOcjNUYWRoTXVtZXFlNnVuZ1JJOFNCQVY5ZnhmL1dmOVZlWGdJY2lwY3p5OFBwUi9hb1Fvc3pOQklXVGw2U1V2UUFNQUhBSmdGYllzU3NkSDVlMHdpY2x3TXBWd0s3ZFRwbzdldXBtTkFPNmRRYTZkREordHNqWUNHQUxnR0lBN3dvaCtGT3BLQU1pOSsyN0dZMGFEY1NXN2QzeHl1c3RFQ3BKdzJiMjJWQnFVU0N6TlpCM3lUNk11R2tybW1jc1IyWGxJcEdlUGsrRlVrcUF5RzgyL0JtbnQ3d1d6ODY4QUMrOTJsU2w0WVk2QU5JYkFiZmNzQXQzRGl2QnR1L25pM1p0cGlXaVMxeEE1QTgvZE1lODl3YWc3Vmw5OGVEajUyTG5yaE1UTmRqdzNJSUN6VThyeC8zM3JNV0dEWXN4c085aWNkcHBuOXZSeVJZUXVYdjNJS1NrRE1Da3FUMng4SVBUSVpEZVFHd1BGSkN5QWdPdi9BNzM1Uy9GZnJGUU5QL05CMWF0V1FJaWY5NDdCUHNyQm1QVVg3dWo5T3VtRUVqeE1KU0dWMDBLU0hrQU9lMTM0c1VuUGtKcXlselJ1UEg4V09MVUFrVHUyM2NqRHNvaEdKR2ZpelhoSmczVTlJRUNIVHZzeEt5blAwUmFXcEVRNHQzb0htb0FJcVc4RE1CSTVFL29oMlhMVC9WaEtBMU5taFM0dXY5MkZJNS9DOEFNSWNRaG5WSVRrTTgrZndqck45MkVCeDgvQzBJRUdxam5Jd1VvdmlZV2hIRlc2NW5pd281UG1EMGRBa1R1K3JrdlVnL2VoVDZETDhYLzloM3Y0MUFhbWpZcGNNTHg1WGovelNVUThrblJ0R25FZVR3TXlNTDMvNEhQVncvRkcyKzNnUkJLL2tsU0tkdjVBdUQwRnNEcExRMlBtTVg4ZCt4QUdEVmdLVnNQYlBzZUtQc0dLRm1kMU9FcWRTYmxRZHd3OEN0Y2RORTA4ZnZmUFhNSUVMbGp4M2tRcWVOdzVmWDlVSG1nZmlqeVZpMkFYajJBaXpzQnZTOVZtbC9DU2dUcXMxWEFzcUFCVW4wb2pkSyt4L3R2ekVOS1lKSm8xbXhiaEJOazRXT0RJRlBHb21oT1Z3alJxTTdHZWZKSkJnakQvZ0JrbmVQdk1NZzVzOTRFbGhVRDIzZjQyMWU4MWlWK3dZaWJQNEtRajRoN1JoY2JnSFRyUHhwVnVCM2xQNTlYSjhxYzNIQk5QK0NXd1VEams1TlBuTGNXQTgvT3FCdGdKQTZnVmNzU3BNaW54UWR6WGpVQTZaQlhnS3FxWVJBNEY4bFVIK1NJUHcwM09LSStsTG9BUmxaVkFTaEZWV0M2V0ZjOHhRQWtKL2VmT0lnaEVLTE5ZVFh2TTRXdTdndU1HK09jSXloZXR1MHdkSUZaS0g0SXJzbGQ1RGdxZnlwOS90MUpLZDhEL0h1MndUSEpLRklDRXVzUUNNd1NhNE9GMVNLcjMxVDh1R2NRaEd6bE80ZVFRQk1MREdXdFVxaDhTWHhUSWUvNVJlV3R3M1VJRksweTlzZWZXZTNVM3FlRk5xSFFmK1V2eVJGeUExTHdxaWdOM1c4QTB1K21JbXphM0E4US9vYldlK1VCRThjbjVnb1NmZjY3d1B6RitnbkNCVEY2Qk5BN3orQ3FST1cyTVRXNU1WRjlwODhKaU1CV25IRGNIRkd5OUc0RGtMd0I3MkQzanowaEFpYzRiVSs1L24zNWlYVUZ4ZEV6THh0ZytGMElCa0VoT1BIRUdrVll0LzcramtaaU41bzJXU1JDQzRjYmdIUzgvRU5VVnVZaUlQd0pzVDgwSHJnMnpxVElFUVNDc3JzdUNxMDdBbVBITVRsNS9vNUt5ajFJVFZrbXZseCtqUUZJZHZmbGtYMXlFZERyZzNDQ1V3cmo2d3M2YVFXRmdGUGRvSnRFNUpMeFl3Q0sxZWhDcnIxaXNPN2VhclluNVY1QUJrVjR4WlhWZ1BUNEdFQm5DS1JxN1huR0ZIc3dDTURrS2NrUlQwNG1SVUFJREFINmJEVlFNTkYvLzBSaUg0QlBSTGk0cHdGSVZ2ZVZnTGdRQWFGdkl5cWVtS0xsTkdHaWZvWHRoUEQxcWE2VSt3SHhxUWdYNTVraTYzTWdjTDYyblVINkY1VExWb1ZnM0paZjl5TEtEU0EwbWU4YlkzRDloOHVCQ1pQMHpJUGVPbEFpd3NYZFRFQldRYUlqQWdIdmV5QmsrYW1GUng4WW5ORUhieG9PcDFub3ExdzN3ZzIwTmQrcGtnY0IrWVVvVzNGeGRlZ2tkelVrdk1leEtIZm52bXp0Wnh6Sm5FSHlrVHZtV25qdjlPaHBJWG9wRWdSa3RRaUhPcHNjc2daQURvUkhEckZUNGtjNkdDUTJGOXNTRzdQOHV1SGU5Q0gzUlNEWGlQQ0tDNnNCeWYzU0FNUkRaSkU2ZzdvanR0Q2FvczZvTC9zUFhsYXluVzVrV0dlNHhkeFYrNnFTVlpCWUk5YUZPbFZiV2JsZlFhQ0RhMERvYjFDK1dvWE9HUTlLaHVldE9ua3Y5VGpQZVRPc1BYc3ZJUllwR2ZIOVNvUkQ1eDhHQk9pQWdFc09ZYkNRK3hteGhVNWZmb0VYRXRTL2QrMk1GaTljVWgyQ0YrRVZIVTJsWGdxSmJGY2NZaWRiS2FybzRkYTFCKzRIcERPbkFsMHVxTjJ5V3k2UlVrSmlyU2dML2JZYWtCNXJ3Yk1lYm5TSUhYZlFDNityMkpRZklFUzN5VEQrekNuNkpFSVZOMFdpQWNuS0RWZnZGanJMTnJIVEhUcmlQMnlib1hvbU9IQURpcWJsZ3ZmOEpyVjYrMVpjd2xBTERSaW5oUndpRUJaclF6bW1EaWx6dFgxcloxbnBVT1JXSmpRZHNjbFQvZDJmVUNXbWxWL2kxaWVKQUNMS3hOcmlEdDRBb1JNWW14MmlnenRJbE5LZ1BXa1l0aUF3ZFprdHd0RlJ3VE5zejYxaVdwSVUwMjZLRmtEc2xEbjFodHVCUlU4bUhpQm1QWE1QNVVnM0hBeWx2azZVaGJMZGN3aFhCak5HWW90WHI5VnNUd1VRMXVXT0hoZEFmZEl2VHJta090RkJsSVd5cWdIcHNRNUN0bmVVNEdDbDFPaU5FeEFkUlJVUXN5OHFma1pmbzdOUmRJd2pHVzFvQWNTS1lMckVWU0lkRW85SWROQm9WQ1JidnpDdDZacit3SjQ5UmdxUmsxQlJMVUN5ZTN3TkljK0p5cjJPdnk3czdIQjY1ZlRPZFJRcndHbFdxdVphTVUyVWhFbUdmb20xTmlsR0daWlhYUlFSUU1UWG9xejRYSE1MMXhrZ2R1YXV6bVFBSzBCTXM1TDZpMk5JbE1aRHdsRHhGODNSc1VUczI3QVMzNDVNNEFnZzYwVzR1TDBaN1YwUG9KMnlEckZTNkxyTTNYaEtQWHFTQklQUlY2c1lXaXpwL05ZdlZvRFFES2JvVkNwZUFkSHBwZG9OT0I2SFJMOURCMjNjV092WVVtemIxQzhQVDNFbTMxVUl5aDNTMkd3VkoxNTdKSEtDYjBRNGRJNjVRZlVOSU5vcWM0aG5GbFdZcFNvZ1psUFVhNFVGYXJtOFRLcCtlS28rL1dJbE1jaVZmUlNUeUQwREVydTNUS0k0a3BrK0FHSTJtU2pwemF5bk02bmF6aWRUMWFrUlFPUzNJcnlpblRzT2NicDZGZWhmcTRxWFBxaGZUTVdmcUcrdVpJWmh2RmlIMUdPTWVzZVdPZ1ZFZDdqZEN5QW1ZUmplS1p5Z3JsL0dGTGdUWTNadVFBTWdOdXlncWwvYzd2cHBCeVFyOTF0SGgzVjByTjVFb3NTUFB1ejhwK2l4cUs3cTZIZTgrbVhWWjBSRVdhaXRHVnc4K2dGaGFDTVNLbzlLZEl0ZEZQVHF1MXJrQmlSYVBKNlZ1bkZveHowZ1ZtYXZ6amdXQ2FDTFF5aE9HSlZXT2JIbGRtUE5DaEFuZ1ZZTER0a0FnYk05K1NGT0hLRkVLNDdQbVNVWWUvek1TUklCRlRxQmlIY3V4UndIeHo3NUtmY09vdzdIVUdLaktBdTFNVVdXTTBDOE9rSXFnTVNtMjZpdU9KcThsT2txUjZ3WjdwazB4WnZKRzFrOEZqdW5Ua0luUnJUWEF5QjJTb3p5VjJkMGxhdWNLNXkrZ2txeUhVRWNseDlmVDVDQUhDTkZMQ1BDT3NackpWNGR1UUhWZ0lSTkRzbk9OVGhFOVV5MFhlS3h6dkM3Q2hlWmRhS1BDU1I2ajhBeUFxd2FHay9VbnAzSjYwUzh3aXNnZGtwWHAyS242T0ZCVVI3TWpCd0duVkZidEpoMVZQVUVnZEM5bytqVndpSXRqZERKZHlLODRtd3pkTElSRVB4R1ZxTDFjUGk1bFNKekVsQkwxSk5WWWpNekljMlZUWVd0b2lmOFBqcG5wVDlVOVoxSkF5MkEyT2tSWFVrT1ZnRk15bVYreFVGRlQzQ3lESGpxMGhOV0M4Z3U4OGFSL2lCelJOaGtrd2lIem5MUElYV1JCc1FJcmNySGFSZ29wUFdrUzAvWWNiUGQ4UVNuaTdJMklMbmZBU0pUVmFjZkdwK1ZyMENpY1IvQXEvWGlOT3VFZzZLbzRPclVyU2ZzQUxIaVlqYzdwOForeUdZUkRtV2FXN2p1QUxFTE96dGxXYXNKT3dIRWJ6MWhOVDZkYzljR0NLMGNIdk9LVFRiUXdTV3FnTkN5by9Ya2xTTVRHUm14ejYyNHcrMFJEQXRBTmdFNDA1R1ZaUTdRenV6enVvT1lDSkJrSGVxM0FzcHV6azY4OCtoMnRRSVNqMHVjNUNiRlR0enVVQXhsTkQvRmtTdzlFVHV1ZUNlTm84MXlKeHluRlJCMmJMZGkzRzc0c00zWVdGWmRmNkRHSlBDVWlkWWY1ZlFpRVF4QXRvaHc2RXhUcWJzWFdXektqa3Y0VEllQ2Q3TGEvS3diNzZTeGwrTjdCaURiUkRoMGhoNUFyRlowTkdHYzJ1VitFdFZ0MjNieE8yMkxUdTVBYWZIbCtnRGh3T3prdmc2cnl5MGhkYnhIQ2NBUWlkVnVvODU5b05KZzlkZUFzbk0zQTJqdHlzcUtubkE4MGVWRm4rZ2dxdHMyT0NjZThMVDZqakQxMnFEaCtpSUNwY0hyVFE3UkF3Z25iUmVPNWpPM1ZvaGJZbnA5THg0WWJGdjNka05wY0tRSnlGWitTZDB6aDVnRXNJdnhIRW1BSkFMRGkxVmx0MUJLZzNlTHlGMkVPVDArQW9UREQ5ekdXWDY2WWp4ZVY3amI5Nm5BZVFyWUxwRHAxZ0ZNTko3UzRMMEVwQzl5OHZSOUJ0VE9HamxTek4raDF3UGp4OXFUemk4dzJHTnA4TzhFNURyazVPazcwWEtraWl1VkR6ejdDWVlCeUdRQ2NpdHk4bVltNGlibDUxYml5bW9ITFhvZjNNeEVaNkF3MlVGQ00wdUYwWVo0eFc4d0RFQ2VJQ0Nqa0pQM25ETEI0MVZVRVZmeENHQUN3OG43dmJua0pGMG9XZUsyTlBnMEFma0xjdkllMXdKSUluR2xtcWJEd2ZCckRRU0c5M3ZvTEx5ZmhPTlFTWXdndDlLMFRWWWdzelQ0QWdFWmg1eThTVnJtYkNldThzY2IrK0J1YnNvaDEzeklHM0hXdTd1NmlMcUJuMUtpZjhRTUZwVXRZQktqTGo3d1hCcWNRVUR1eHdXOUhzRCsvZDR3c1JOWEpDU0pva29JbFZHd3pmSmZqRFBoVnVmQlNmekdKN203cFVkWE5xUEtQS0xycEtVQnE1Y1ZFWkNIY09uQUNmamhSNmROMUt4djk5MnNSSzJTQUpUbmlZNDRKMnJINjNNem05SHJGMGJkanVQVUpzRHl0LzlEUUI3R29OdnV4YnB2M1RabHZQZnhZdWRjWUticDhIMlZtd3E4amRENmJTNEk2aW8vMDRWVXhuMXVXMkRlekRrRTVFbmtqeC9yU1huRyszaXkxV0RpYmI5R0ZHNC9RK2I3eVRYVUVkUk5Lam5ES2dUMVdxZHZMK0R4QitZVGtLY3hyV2cwbm56QmZaT3E0c3BwZGdqQkllZndiSWZUcTR0aVowTk9NRy9wSVJESjluY1NVZGU0WDJVUkFYa2VLMWZkNGVtN3N5cml5dnpBbDF0Q2tGc1lBcWZ4d0gySjZIQzR5VW5SYlZQeDg5OEVnU211ZnZzMWlRaWU2UG1jbDc1SGR2dDdqT0JpWmVVaVhEVzBiV1RnVGt1OGNEdmJTbmJ5bXRQeDE0ZjZ6VE1xc09UTmxTSTE5VElqL0M3bFhEdzFyVGRlbkhXSzQvSEYrMHlzbVRQbHVORmo2QVYrVFc3VXJadHg4Zm12aTI2WGpETUEyYnYzanlqZk14SlgzdEFKbGZ1ZFgzc1VxME9TbFZ0N05PRFdLTzBYTEptOURBSlBpV2JObGgwNmZ5QVhMWjJJTDFiZmhOZmV5a1NnNGVydXBHRE5LN3lIRGk1RHAvTmVFZjE3UDhZK0R3TlNYcDZIQTNKVTVJTGlYL2ZXand1S2swS1ZPdXprbE1ZNzhVN1JBaHc0OEx6SXlJamNsRm5qaEk3ODRzdGI4TjJXa1NpWTJBVUIwWENudXA5WThXYTJTWDlianN6TTZhSlRoL2xtVjdXT1RNbG5YaHFIcmR1SFlzRjc3UUdSNXVlWWp0bTJxK1JlRExwcUZWcTNtQ251SEQ0dG1nNjFBZm4xMTA0UWFiZGh4T2hCV0JNKzQ1Z2xtbDhUbDdJQ0hiUFg0dFFtUmVMWlIvOFYyNDNsb1VMNVUwVWZ5TXFodVAydVBsajdkWE8veG5iTXRVc3djckxLSU1Scll2YjBSNjNtYjN2S1U1YVhYNFBVdE1HNGYzSlBMRnJhWE91VmVzY2NFaEZuYnkvNlgxR0duOHJmRUM4OThiQWRDZUlldTVVVkZRT1FudDRmeXovdWlYODhjaVoyL1BkRVYxZGFISXNBUk04NW85a2VQSER2bDFpL2NZNFlPYVNXbUlxclEySnBKNlhzakEwYmVxTmx5MXc4TnpNYjA0c3lBSEdpY2VlaGcyUFV4eUlvdkE1djFMQWZjTWV3RW16YnRVQzB5M3d4RVJtVUtTcjM3KytGSmNFZXlNbnFpRm12WjJMRnlpYll1T1ZrQ0J3UGlVWUlJQURKMzFKVVowQkd0MjM4blg5R011K2pqYnpxL3pCcjEzcHUxcTN4SU5HODZ2WjVabXNndDBzRmJyMXhNMXEzQ3FLeWNyRklUNStuTWlobFFBNlJaZXZXcnBnK3V3TXltbVJpVUwrV0NINmFnYzlXTmNiS0w0N0R6dDFwZ0V3RkJNRkpRUUFDVmVCbGxRSkVpYjhncTM4VG5NaVhDZzZERmVtRXp3OEJWaHRVbFZrNXIrT1lEalc2YU5FYzZOb0o2SEloMFBVaW9HWHpDZ0NiVUY0ZVJPUEdpNFVRSmFwRDhqWVExVjRhNmlsVDRQK0dDNU9sK3hJS253QUFBQUJKUlU1RXJrSmdnZz09Ci8vIEBtYXRjaCAgICAgICAgKjovLyoueW91a3UuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5pcWl5aS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmlxLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoubGUuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vdi5xcS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9tLnYucXEuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vM2cudi5xcS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLnR1ZG91LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoubWd0di5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly90di5zb2h1LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyouMTkwNS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9maWxtLnNvaHUuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5iaWxpYmlsaS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLnBwdHYuY29tLyoKLy8gQGdyYW50ICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kCi8vIEBncmFudCAgICAgICAgR01fdW5yZWdpc3Rlck1lbnVDb21tYW5kCi8vIEBncmFudCAgICAgICAgR01fc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICBHTV9nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX2RlbGV0ZVZhbHVlCi8vIEBncmFudCAgICAgICAgR01fZG93bmxvYWQKLy8gQGdyYW50ICAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgIEdNX3NldENsaXBib2FyZAovLyBAY29ubmVjdCAgICAgIGFwaS50eXBlY2hyb21lLmNvbQovLyBAY29ubmVjdCAgICAgIGdpdGxhYi5jb20KLy8gQGRvd25sb2FkVVJMIGh0dHBzOi8vdXBkYXRlLmdyZWFzeWZvcmsub3JnL3NjcmlwdHMvNDY3Nzc2LyVGMCU5RiU5MiVBRiUyMCVFNiU4NyU5MiVFNCVCQSVCQSVFNCVCOCU5MyVFNyU5NCVBOCVFNyVCMyVCQiVFNSU4OCU5NyUyMCVFMiU4MCU5NCVFMiU4MCU5NCVFMiU4MCU5NCUyMCVFNSU4NSVBOCVFNyVCRCU5MSUyMFZJUCUyMCVFOCVBNyU4NiVFOSVBMiU5MSVFNyVBMCVCNCVFOCVBNyVBMyVFNSU4RSVCQiVFNSVCOSVCRiVFNSU5MSU4QS51c2VyLmpzCi8vIEB1cGRhdGVVUkwgaHR0cHM6Ly91cGRhdGUuZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy80Njc3NzYvJUYwJTlGJTkyJUFGJTIwJUU2JTg3JTkyJUU0JUJBJUJBJUU0JUI4JTkzJUU3JTk0JUE4JUU3JUIzJUJCJUU1JTg4JTk3JTIwJUUyJTgwJTk0JUUyJTgwJTk0JUUyJTgwJTk0JTIwJUU1JTg1JUE4JUU3JUJEJTkxJTIwVklQJTIwJUU4JUE3JTg2JUU5JUEyJTkxJUU3JUEwJUI0JUU4JUE3JUEzJUU1JThFJUJCJUU1JUI5JUJGJUU1JTkxJThBLm1ldGEuanMKLy8gPT0vVXNlclNjcmlwdD09CgovKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgrlupRHcmVhc3lmb3JrLm9yZ+e9keermeinhOWImeimgeaxgu+8jArmh5LkurrohJrmnKzlsIbop4bpopHop6PmnpDjgIHpn7PkuZDkuIvovb3jgIHop4bpopHkuIvovb3nrYnlip/og73mi4bliIbkuLrlpJrkuKrohJrmnKw6Cmh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80Njc3NzYKaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzQ2OTYwNApodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvNDY5Njg5Cmh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80NjgwMTUKaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzQ2OTUyMQrlj6/oh6rooYzliIbliKvlronoo4XjgIIKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KCihmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgZG9tSGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07CgogICAgdmFyIGRvbVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKCiAgICBkb21TdHlsZS50eXBlID0gJ3RleHQvY3NzJzsKCiAgICBkb21TdHlsZS5yZWwgPSAnc3R5bGVzaGVldCc7CiAgICAvL+W5s+WPsOWIpOaWrQogICAgdmFyIGlzTW9iaWxlID0gL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQb2R8QmxhY2tCZXJyeS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CgogICAgaWYoaXNNb2JpbGUpewoKICAgICAgICBsZXQgcGxheUxpbmUgPSBbCiAgICAgICAgICAgIHsibmFtZSI6Iue6r+WHgDEiLCJ1cmwiOiJodHRwczovL2ltMTkwNy50b3AvP2p4PSJ9LAogICAgICAgICAgICB7Im5hbWUiOiJC56uZMSIsInVybCI6Imh0dHBzOi8vanguanNvbnBsYXllci5jb20vcGxheWVyLz91cmw9In0sCiAgICAgICAgICAgIHsibmFtZSI6IueIseixhiIsInVybCI6Imh0dHBzOi8vanguYWlkb3Vlci5uZXQvP3VybD0ifSwKICAgICAgICAgICAgeyJuYW1lIjoi5ZCs5LmQIiwidXJsIjoiaHR0cHM6Ly9qeC5kajZ1LmNvbS8/dXJsPSJ9LAogICAgICAgICAgICB7Im5hbWUiOiJZVCIsInVybCI6Imh0dHBzOi8vangueWFuZ3R1LnRvcC8/dXJsPSJ9CiAgICAgICAgXTsKCiAgICAgICAgbGV0IHVzZVdlYiA9IFsnbS5iaWxpYmlsaS5jb20nLCd5b3VrdS5jb20nLCd3d3cueW91a3UuY29tJywnbS55b3VrdS5jb20nLCczZy52LnFxLmNvbScsJ20udi5xcS5jb20nLCdtLmlxaXlpLmNvbScsJ20ubWd0di5jb20nLCdtLnR2LnNvaHUuY29tJywnbS4xOTA1LmNvbScsJ20ucHB0di5jb20nLCdtLmxlLmNvbSddOwoKICAgICAgICBpZih1c2VXZWIuaW5kZXhPZihsb2NhdGlvbi5ob3N0KSA9PSAtMSl7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfkuI3mmK/lupTnlKjnvZHnq5knKTtyZXR1cm47CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzZXRDb29raWUoY25hbWUsY3ZhbHVlLGV4ZGF5cyl7CgogICAgICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKCk7CgogICAgICAgICAgICBkLnNldFRpbWUoZC5nZXRUaW1lKCkrKGV4ZGF5cyoyNCo2MCo2MCoxMDAwKSk7CgogICAgICAgICAgICB2YXIgZXhwaXJlcyA9ICJleHBpcmVzPSIrZC50b0dNVFN0cmluZygpOwoKICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gY25hbWUrIj0iK2N2YWx1ZSsiOyAiK2V4cGlyZXM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBnZXRDb29raWUoY25hbWUpewogICAgICAgICAgICB2YXIgbmFtZSA9IGNuYW1lICsgIj0iOwogICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgZm9yKHZhciBpPTA7IGk8Y2EubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBjID0gY2FbaV0udHJpbSgpOwogICAgICAgICAgICAgICAgaWYgKGMuaW5kZXhPZihuYW1lKT09MCkgeyByZXR1cm4gYy5zdWJzdHJpbmcobmFtZS5sZW5ndGgsYy5sZW5ndGgpOyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudChkb20sZG9tSWQpewoKICAgICAgICAgICAgdmFyIHJvb3RFbGVtZW50ID0gZG9jdW1lbnQuYm9keTsKCiAgICAgICAgICAgIHZhciBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkb20pOwoKICAgICAgICAgICAgbmV3RWxlbWVudC5pZCA9IGRvbUlkOwoKICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnRIdG1sQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKCiAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOwoKICAgICAgICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50SHRtbENvbnRlbnQpOwoKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHRvYXN0KG1zZyxkdXJhdGlvbil7CgogICAgICAgICAgICBkdXJhdGlvbj1pc05hTihkdXJhdGlvbik/MzAwMDpkdXJhdGlvbjsKCiAgICAgICAgICAgIGxldCB0b2FzdERvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwoKICAgICAgICAgICAgdG9hc3REb20uaW5uZXJIVE1MID0gbXNnOwoKICAgICAgICAgICAgdG9hc3REb20uc3R5bGUuY3NzVGV4dD0ncGFkZGluZzoycHggMTVweDttaW4taGVpZ2h0OiAzNnB4O2xpbmUtaGVpZ2h0OiAzNnB4O3RleHQtYWxpZ246IGNlbnRlcjt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlKTtib3JkZXItcmFkaXVzOiA0cHg7Y29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtwb3NpdGlvbjogZml4ZWQ7dG9wOiA1MCU7bGVmdDogNTAlO3otaW5kZXg6IDk5OTk5OTk7YmFja2dyb3VuZDogcmdiKDAsIDAsIDApO2ZvbnQtc2l6ZTogMTZweDsnCgogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRvYXN0RG9tKTsKCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIGQgPSAwLjU7CgogICAgICAgICAgICAgICAgdG9hc3REb20uc3R5bGUud2Via2l0VHJhbnNpdGlvbiA9ICctd2Via2l0LXRyYW5zZm9ybSAnICsgZCArICdzIGVhc2UtaW4sIG9wYWNpdHkgJyArIGQgKyAncyBlYXNlLWluJzsKCiAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS5vcGFjaXR5ID0gJzAnOwoKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodG9hc3REb20pIH0sIGQgKiAxMDAwKTsKCiAgICAgICAgICAgIH0sIGR1cmF0aW9uKTsKCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBwbGF5VmlkZW9GdW5jKCl7CiAgICAgICAgICAgIC8vY3NzCiAgICAgICAgICAgIGxldCBwbGF5VmlkZW9TdHlsZSA9IGAKICAgICAgICAgICAgLnpobV9wbGF5X3ZpZG9lX2ljb257CiAgICAgICAgICAgICAgICBwYWRkaW5nLXRvcDoycHg7Y3Vyc29yOnBvaW50ZXI7CiAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTk7CiAgICAgICAgICAgICAgICBkaXNwbGF5OmJsb2NrOwogICAgICAgICAgICAgICAgcG9zaXRpb246Zml4ZWQ7bGV0OjBweDt0b3A6MzYwcHg7dGV4dC1hbGlnbjpjZW50ZXI7b3ZlcmZsb3c6dmlzaWJsZTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX3dyYXB7CiAgICAgICAgICAgICAgICBwb3NpdGlvbjpmaXhlZDtsZWZ0OjQwcHg7dG9wOjM2MHB4OwogICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk5OwogICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgIHdpZHRoOjMwMHB4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lewogICAgICAgICAgICAgICAgd2lkdGg6MzIwcHg7CiAgICAgICAgICAgICAgICBoZWlnaHQ6MzE2cHg7CiAgICAgICAgICAgICAgICBvdmVyZmxvdy15OnNjcm9sbDsKICAgICAgICAgICAgICAgIG92ZXJmbG93LXg6aGlkZGVuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC56aG1fcGxheV92aWRlX2xpbmVfdWx7CiAgICAgICAgICAgICAgICB3aWR0aDozMDBweDsKICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgICAgICAgICBmbGV4LWZsb3c6IHJvdyB3cmFwOwogICAgICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsKICAgICAgICAgICAgICAgIHBhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgbWFyZ2luOjBweDsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGl7CiAgICAgICAgICAgICAgICBwYWRkaW5nOjRweCAwcHg7CiAgICAgICAgICAgICAgICBtYXJnaW46MnB4OwogICAgICAgICAgICAgICAgd2lkdGg6MzAlOwogICAgICAgICAgICAgICAgY29sb3I6I0ZGRjsKICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyOwogICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZjI0NDQzOwogICAgICAgICAgICAgICAgYm94LXNoYWRvdzowcHggMHB4IDEwcHggI2ZmZjsKICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxNHB4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lX3VsX2xpOmhvdmVyewogICAgICAgICAgICAgICAgY29sb3I6IzI2MDAzMzsKICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZjYzBjMAogICAgICAgICAgICB9CiAgICAgICAgICAgIC56aG1fbGluZV9zZWxlY3RlZHsKICAgICAgICAgICAgICAgIGNvbG9yOiMyNjAwMzM7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmY2MwYzAKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2p4ewogICAgICAgICAgICAgICAgd2lkdGg6MTAwJTsKICAgICAgICAgICAgICAgIGhlaWdodDoxMDAlOwogICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk7CiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7dG9wOjBweDtwYWRkaW5nOjBweDsKICAgICAgICAgICAgfQogICAgICAgICAgICBgOwoKICAgICAgICAgICAgZG9tU3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGxheVZpZGVvU3R5bGUpKTsKCiAgICAgICAgICAgIGRvbUhlYWQuYXBwZW5kQ2hpbGQoZG9tU3R5bGUpOwoKICAgICAgICAgICAgLy90ZW1wbGF0ZTppY29uLHBsYXlMaW5lOwogICAgICAgICAgICBsZXQgcGxheVdyYXBIdG1sID0gIjxkaXYgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApJyB0YXJnZXQ9J19ibGFuaycgc3R5bGU9JycgY2xhc3M9J3BsYXlCdXR0b24gemhtX3BsYXlfdmlkb2VfaWNvbicgaWQ9J3pobWxvZ28nPjxpbWcgY2xhc3M9J2ljb25Mb2dvJyBzcmM9J2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaFpBQ1dBUGNBQVBKRVEvdjcrZm5MeVBqQ3dmUm5aZm5UMFBKS1Nmakd4UHYyOVBuWTEvTmJXdnYxOC9hVWsvcmw0L3J3N3ZuS3lQYUppUHJyNmZhYW1QUnljZmFMaXZ2NTkvSkpTUHJ2N2ZOVlZQbmUzZnJ0Ni9OUVQvdjYrUGVscFBhZ252UjNkdmk2dVB2ejhmZXhyL25PelBlZ252cms0dlIxYy9KR1JmcnE2UG5RenZqQ3dQblMwUG5aMS92dzd2bmEyZmVvcC9lbXBmcmMydk5VVS9peHIvUjRkdldKaC9lc3F2SkhSdnZ4Ny9yeThmTlNVZk5XVlBqQndQVjZlZmFNaXZuZjNmaTh1dldEZ3Z2NDl2cnA2UHJ5OFBKUFR2YVlsL25UMGZuVzFQZXJxZlJzYS9SdmJ2V0FmL1Y5ZlBuazR2aTJ0ZlJqWWZSaFgvdnU3UE5ZVi9KRlJQbms0ZmFIaGZhWGx2djM5ZnJoMy9pN3V2bk55L25PeS9yczZ2ZXJxdlJnWHZuZDIvYUdoUFdSa1BWL2Zmcmk0UHJqNFBpd3Jmbkx5ZmFVa3ZSZlhmSk5UUGpGdy9leXNmUmxZL1J4Y1B2djdmZXpzdmkwc3Z2MjgvYWJtdmVxcVBlcHFQSk1TL2V5c1BXT2pmTmRYUFJ6Y3Z2MDh2UnViZnJvNXZlaW9mZWxvL05aV1BuWjJQTnBhUG5VMHZSZlh2bkh4Zml1clBqQXYvblF6ZnJuNWZuYzIvZTBzdmFkblBlNHQvYVNrZk5YVnZSbVpQZXRxdm5ZMXZpOHUvZWlvUGl0cS9pL3ZmUndiL1IxZFBuZTNQYWVuZmFjbXZlM3R2blJ6L3JqNGZhWGxmVitmUFdGaFBKTFN2YU5pL1dNalBSMGMvYVZrL1dQai9hZG0vcnA1L25JeHZSb1p2UmlZZmpEd3ZhVmxQSk9UZmUydGZOcWFmSlJVUGVrb3ZhYW1mTmFXZlY4ZXZuZDNQbk56UG5WMVBlc3EvakV3L1Y2ZVBSM2QvbmczdnJ3N2ZhV2xQZW5wZmFmbmZXUGp2aXdydk5XVmZuTXl2aTZ1ZlYvZnZWOWUvbmIydnJ1Ni9Sa1l2akF2dm5JeGZSaVlQaTl2UGVnbi9WN2VmZWpvZmUxdFBXQ2dmcm01UEpJUi9uYzJ2TmNXL0pRVC9qRnhQdnk4UFdEZ2ZXQmYvUnNiUFY1ZC9OcGFmTmNYUG5mM3ZhSWh2UnZiL2l2cmZuWDF2TlJVZmFLaWZSdGJQYVpsL05lWFBlNXVQV0NnUFJyYXZhSWgvTm9aL25KeC9XRmcvaTl1L1IyZGZqSHh2akl4dk5UVXZpL3Z2ZTFzL05lWFFBQUFBQUFBQUFBQUFBQUFDSC9DMDVGVkZORFFWQkZNaTR3QXdFQUFBQWgrUVFFbGdBQUFDd0FBQUFBWkFDV0FBQUkvZ0FCQ0J4SXNLREJnd2dUS2x6SXNLSERoeEFqU3B4SXNhTEZpeGd6YXR6SXNhUEhqeUJEaWx4SVlFU0FBQ01JakZ4cFVJV0RBQTVVZUZqSTR1VEpCQ3h6Q3N4aGs4aVFoVFp0NnN5cHdhYUdEQXNIQk9VeGxPVUxKQ1dRdktpeGNBT0RBUU1ZYkdpNlVrR1BHajBVR09CS3RxelpzMmpUcWwzTHRxTUNFMDFNaUsxS1lzUUlFbHM3Zm1GQ2E5RVdGNGtRaENpVFFvVUlUVXpTZk95UWdrV0tEa0dTTHRXb0E5aXVaVUV6YXc0Z0JacVZJaHRSMkVTQlU2Rm1qRFFPQ2RuTWVqTUNMUk15THJDNTRBTE5vS1Vwam5IUnVuZnJUdlV1bnBtOTRNRWZrZ01jWEJpZ2N1SWwzcjZqc3o2am9LSUpDUjRrbU5neEVrTWozeVhvL21rQ0phaVdCVFZmOUZpWk02bEVid1NvVHJROXlFc0s2d3FxU09WeEtNTldramVzdWREY2ZBQmNRd2RyZlZ3aEEwVVdoSUhJWmtMMFFxQWFLMnptaVE4M1pBVEZFWm9WTWg4R3ltaUdBQ1VXY0VURkZRZ0U5VUJFQm1DZ0FBWmpNVVFBQ1NRTXFKQU1aV2ptZ21JZmZaSEFTUXVVRWhFRUlqd2hBZ1EySG1SRFVEWXNwQVowUWQxUllrZ25pTUZBRkJMRllGTU1RQ3owa2syMkpYVENnNW1oUVpZZFZwQmp4MEp5MEJabVFrNEVWWVZDZFdUR1FUcGtFVkpVQUM2QWx0QVBObVdpd2tJUWZIa0JCQW4xWXFjVlpma1JwVUkreEFGRUhENG8wUkFCU1Jha0E0QkJqV0pXQjVuRmhwQUJVMFF4Ull3WTNaR1pMbWZsc1pwTi9tVk11VkliSEFTVmhheGxNWkxaS1RtbEVCUUhzYVIxUW9nMjlTSGZTS1ZrWnNaYTZtUkdnVVlUaUdwUUFVRzk0ZWRDT3BnVWdoZXZnTFJGVUM0Y3RBUURIakN3QkhjS0ZYcVNBNGdTeEVlWkR1a1QxREtPSE11UkhrRnBjSkJMTU1tMFVKdzJ6VWtRSEVGMWdlcENlMmptU3pJZU5XTlRPd2Z4ZEpKUFhnYjFKZ0FXaEJBVU1BKzFsZ0l6SEoxUXh4YWJyR25RbmdFY3RkQ1NOaVZCa0RkQlZYQXRRN1d5eGdFbmorVDBWRlJUeWNnQUEwa1NiRk1yRUZYZzJ4NlVtQ3lTVjJETlJWRVdRVEg2a05IUnBUSUtGUVFhaEVGbUdCUWRWQ0c1dEFhR0d4ajlzVUFGakh5RVRGQmxSUFRxU1M4QUVFWWZyUlZDU0VWdUJNV0gva2ViQkFXQzIwSFZJWkFvd21pOFdRVWk0RE5SblRiNTRkRjNOcVVORVJaQjBVSFFJNXpVckJrT2MrRGFVTjgySFVQUVcwelE0SFJDQkNnVkFITUREUktVT3hHbGFKUGxCY1hESVdzTmhBRlJLRUVOUWhCajJCd0IyVzAyNVFhMVRaWkNKUHRKTGg5VWpUV3RTZktPUSsvYTFBQkJvcDFFR2xDWkRSUkJVS3pFSHBRWENWa3doK0diSFZMZFFsRUVKUVZCRWdkQXNVS3FuOFNVUUxQWlZFdEUrWjlFdmtJWVdJVG1Nb09GRG1BdElZQ0lHVUh1UVJ4N3pFUWhWc0dLVmdaQ3RaTXNDQ0lKc3dtckdBSUpYN0VtRWpmNkZVR3VrNTN0VUFRSFFjbEdSTkFYQUJBNkJCbnUwVXdJRkpLSG9PREFJOWs3U1J0V0dCUVhOcVFKL21UWVRBUVVRb0NnSk1JamlnaEtPWGhvazBvMEJBcGNhTTJ6RW9LSm9JREJJMnVJV2tTU2FCTmFMRVFHZDZoZ1pzaEFnNFdJSVNpcThFZ2xna0tDaURqQ0ppRW9Sdm1NZ01MTjRNQUlHVnFJSVlMaXhJRzA2RVVIUTRoVjdESkJnWndpS0VTTFNDZ3NZWWk3SVdRTU1kUk1CZGlnQTRkOHl5WmlJQWlSaklRa3lkamtmZ0FRUkZDNGNVQ05kTEExWElEQ1EwNnd2QUJJQ3dCYU9nbVh1QmVVZ2R5QWNqWVJSRVM2WVFsenFKSWdNb0REQUlOQ2hqRkU1QkpCUVFDdTJnU2tpeDJrSnNVanlDVlAwc2FINE1FbUNKQWp4aVRBUWh2aVVTS09zb2s4Q2hMTEFNeVNpS3BqM1VBK2dSdUlTQ0lvd2dBQUV5S1ptVWxXY2lKMC9yUEpGUXF5eVNObDZpSHRDd3FXSElLeUFCakRnNXRKWlVVbThLdWNFZVNQTUxvSWxBS3dMSWQwUVRyRnZNZ2hnc0lGa1Z3VGp0cXdxRy91bU1lS1FDSXpQaENKS0ZqNFA0Wjg3ejZVekVnV2JXS3drWURLSmhVSW4wdFpvOUNNMENBelJzaklqR3AwRUIzMEx3QXBhRWlPeG1oTWpWaWdBVUZwUVNBRk1vRXJlT0FLRTBCWFFsaDJraVlaWkJhWitRUkQyT0ROa21Za0dKbko1RUhXd0pNY3JPR0JDZm5TU1p3cEVBTWtJcGs3VklnYWRoR0FCY0Robmh0UndnQnZZYStDeEc5K2NKSVRRcW9ZbEJMTWJDaXk4RVJtOW9hUUhHNHZYWVpxMTBISUdwUnRrS1VJZ2NnTU1SVFNnU1A4UUhpUllVaTBGbUtCY1dTR0YwMHAva0xZZ3FJSXp4VkVBVFFJZ3VtbVdoRm1aQVlQUTVIQkxUSVRBaDV4SlJhWllZZE8wbkE4bk9yQkxBZXl5VGwwd29SdUJrQjNac2xoQU5iQkVuVEFRak1jbU9KSFZxc1FaQVlGRUFNUkJ5eWtFQUVHbU5VaUo2QUFwNEtDQllZNUJMZTZQUjFDMUFVVHpSckVETDBUeUEzbTBFcGZOT0VpRmhnR1ZEWFRoVmN5NUFXbVBVTFBGQUt3a3dqTUlDZXdqMDFjQVFBbGdJRTFLOENETENUeURUTm9XRE9JdU9CRFVLWXloY2cxQUhRVkNHTnQ4Z1ZpREZPU0FtQ0FHOVFncG1mQWd4T3BhQTBDTkZIS2h4ejJKd3JoYWdDYVo1QkZSUFdsMGprSkI3TGdqRW5Nb0FQQm9NWWFBb0hMM2xDSEl2ejZoYjlJUXFOL0F1QUdkZXhOL2pNeUVPVTI4OGtXRmhtWEI5QndMb3hJd3plZWVDNEFhR0FNTi9jbUJUMGdFQWlFVEtLQ0VHQVdIL2J6U1RTUWhDOWt6UUFaMU13STlwT1FOSHhpRW1BUW8yWVc0SUpqaUdFVmhaMFBLRGFEQXV3NnhBTGhBTWM4aG9FS0NaQ0NDVzVBYjlZT2dvWjZtcUZic3k0SVJIbHI2SFJtcWcwVkRNUXFjbjBRSHhSSkJKVWkzazBPNGdnaENNRVZSU2IyUUFCMUVrSFJVaWpTamdneit4cGpndFF2QUtETXRrUEtlYzZFREhJRWhSUzNRL3JaU1hWL1pOZnVqcmU4NTAzdmVrL2szT20yZDBGSXFCMnRJdVRiNGRiM1FJYlRWd0VjeHpUZE00Z0FIc0R3QjRoWElSUm8rQU1HSUpCb2FPSGlXZ2hxUVdBZ2NZbXJvQU1nbDBqLy9tcWo3QURraGlCUVhsMUR2bzBVQUZETEpnZFF1SFFpMEltSEs4U3lKejlJNms2aXpvSjgrM283dGNuZlhCNlVtQmRFQUc3dXhBY1l3aGpIRE84aUZNak0waFh5QWFrTDVPVW5NVHBCa083bUNFdzlJVytKaTM0cjBnSy9MV1RRTm1rNTBXRXVjejhQc1NrVmlxWkNmaVQwZ1dBOUFGb2ZDTmRQSW9DQ1VHQUdDV2hsQUlhdUV3a2tjeUd0L1ByZDh5NlF2UWVnN3dmNVFDdmZQcFN5MndRR0NZRkJVQ2kvOXF5M25lOEpNWHhRdm82Um9acFpJSEUveVFvU2tucVYyNzNvbjMrOFFscUplWVF3TFN5OEhvaVN2WG9RemR1a0JRbXgvRWtldnZqWVF4NGhDejVKN1EreU02bFF4Y1VXbTMxUWJDNlFxTnVFODUzSHUvRVYvcEw4QUN6L1pFWlJPMElxSElBTEg0VHVQRC9JdHlsT2tPSWZQU2pIUHdqdEUzSmtRbVZXSVRNSUN0QUx3bWFiU0tBZzdyZDE4QmQ2enBJUVlUWm1DMEZlaURkNkJWRjF2emN0c1BkK05oRi9CWkZ5MkZjUWNrWm4vb1lSNkRkNEJaRi9OckY2QUJpQkFqaUJCekVEOUNSN1pBR0N5MFlRSGZoL0k4aDJFbmdTSlNCeGtsQUN3b2ROcERjVURuZ1NDRkFReXdOOEVDaURKZWhtTUZnVy9hZDhBeUY2TFJpRG5qZUQwb0VBTXpCZURwWVFhS2Q2QTlGNlV6aUVUMWlFdm9FQUs3Q0RvMUlxcDhJUS9NVXVETkdEQVVCNVVQYURCeEdBZWhkVkRUQ0hkSmdCQXZCOURCRXBrNUpzRktaWURKR0VBZkFzMXRlRVRxaDlVRWlCL2hSQmJRRmdiZEFISmcxeGhTb0hpVnZJaFlib2hZZzRFZHRHY2trV0ZFd0djVUdCRklDWUVIRFllQU9JRWVUV0pXUkdWQTZSY2dDd1BPSlhpSXdIQUk1M2lSTEJicWRuRWQvV2VvUkhpYkU0aXhrQmJ4OHhpSm9oaHE5SGhIRm9ndXFXY21tbkVLTW9pNlVvYm81WGQ2Sklnc2NJZXVyR2hOUEhqTlJJaXNnNEZLbnpFajNYRURtNGhndlJqTDZJRWZ4bVFnb0JUWVRJRUszbmV0Tm9qTnhvamNKQkhBWjNiU2NCRVJKQWgzTklmUVhSQ0FrUWtBbGdDQVlCQXZ5NGl4VXhjdDAyRUFBbmNBYUJjMVhCQUlTVUZ3NDVFTk9BQ3l5QUMzNlFXaFU1RVZNd0FVMHdBV1hZa1NSWmtpWjVraDRSUVZsQmtSMjVEMDNRTkxrblBCQU5XWkpld0FJODgzd0pjUm9seVdLdmFCRHNhSEltV1gvb3hITzNTRy81VUJRYVlBbHdoWklNWVFxQThnT21VSlJNT1pWVVdaVldhWlVCQVFBaCtRUUJsZ0FBQUN3R0FBWUFXUUNMQUljeXpUTHgwVVh4cFVUeVgwUHlTRVB5VmtQeWVVVHlna1R3eUVUelRVUHh5a1h5aWtUd3gwVHh0a1h5VVVQeHQwVHhya1h4eGtYd3YwVHltRVR5aTBQeHVVVHlha1B4eUVYeHhFWHlhRVB4dTBUeHpFWHh6VVh5a1VUeGxFVHlVa1B5ajBUeGhrVHhwRVR5YmtUeHRFWHh3MFh5bkVUeGdrVHlWRVB5ZTBUeVpVUHhvRVR4c0VUeWVVUHliRVB4c2tUeHUwWHlkRVR4ckVUeWNFUHlaMFB4djBYeGVVVHh6VVR5bWtUeGowVHhrMFB5WTBQeHJrVHlqVVR4cDBUeVdrUHlhVVB4aEVUeG8wVHhkVVB5b1VUeVdFUHlja1B4cVVUeHEwVHhxa1R5azBRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUkvZ0FIUUFnUUFNSUFBQWdUS2x6SXNLSERoeEFqUmhSd0ljQUZBUXNlRUNUWVFLTEhqeUJETmxTd1VVR0pqUnRGcWx6Sk1tR0VqUkZnQ0VBcG9xWE5teEU3a0toQm9rT0xCQWNFQ0RpUUFLZlJvd2dMakxBeG9nQUJwRkNqU3AxS3RhclZxMWl6YXQwS3NZQ0ZHUmFjSnFBQUFRS0ZvbHl4Z21EeGdBV0lHRE0zMWt4N0ZjTkdEQTFRRXFSN2xjUEdEUmMwYnV6SXQ2b012eHVRNUJnZ0FBRURBUWNMVTdVUVlrRUlJQjhrYTk3TXViUG56NkEvRTNCUXdNRlRBQU1vVUlnYytxYUJDU1ltR0JqZ0FhV0gxamNyYkt5d0FnRktCcmh0M3ZqTFFBSktDY0ZiYXRpb1FZQUIzd0VZR0VqT01nVU9JamhTN0VBNGdEVjFsUVJRL3Z4QWNmcTcrZlBvMDRQT2tFRTlTQlVuRnB4UThlRTVRUVRUM1Urc2VIR0I4WTNJNlFjUlNRU1pCQjFCd0FuNDBFc0V4VlRiUmpvbytKQk9QUG1FMmdFSGVDZmhRa294NWRTR0lJWW80b2drS3VTVkVTNDR4UmhCa0pVSXdGb1Z2UENXWUJ5NWFCZEJlT2tWZ0lzRUJtQlNYQVROUldJU2lCMnhBRkJDRWVVaVpaWmg1dUtUVUVZcFpXR2psZllVVUdVcFdlSnJzYzBHWkFCQ2pxZ2JRYnpwNk9Kd0JHM0FBSTBCRUViaW1BSHd0bUlBTFc0Sm0yd2FQbG1sYVZQMjZlZWZPS1cyMnBNMEJMRkFFRFI4OENCQnQ1WG9BMGtLK0xEQWdkSHhXRklKL3hFVUlJazNCb0NYZmRIbFJ5SUlMMmdnWXd3SXNRZGxBUzRNa1dKNS9vREdLdXVzQzZuNkpLdXVPZ1VxZmk1MlVPb0xQbVVhd0tZak1oaEFUSlFtU0dLUEppMGFRSVFsVW1RUlJxaXBsbWVJOE1sSEg2M2NkdXV0aUhzK05XZWRKS1p3cDNac3VqbmljZ1ExWjJhSmFBYWc1cGRoaWdnbmIxaENvQ1dKWE9MWlo3amZCaXh3aVBudU95S1RJVmp3QWIwdUhoWUFCekxrOEM2SmZxVVpHRXJxaXRncFh1TmV1K0ZhYmIzVnAxZGdmVGp3eVNpako2akhHM2JZRkFIT05rb2loVDIxa0t5THhzWWtMTEVpTWxzQ3FOSzVLRzEvcWJiM1pMYnpaWmJ5MGt5M1pxdUw0WTMzMUs2aWptZ2RkdHJ0N0NLN0FUUjNNN3pFT1F2dG03dXRVTzJnTHZZNzI3K2s4ZG4wMjNBWHhwaHY1QjVjV2NJZnBOdXdVVjhRUzZ5WGl4WExleEZOTnQ3VlFNRm9rZGdERHcvdzBBT3FVNkpBd3d3MGtCZjM1WmhmaGVSUWlZOVl4QXdlRXNCd2lVbzhVR0VMRXhjTEV3eDZsK2h6eHk0SzhWSUVRaXpRNXdITGFaQmhRQUFoL2hWTllXUmxJSGRwZEdnZ1UyTnlaV1Z1Vkc5SGFXWUFPdz09JyB0aXRsZT0n54K55Ye75Y+z5L6n5YiX6KGo6L+b6KGM6Kej5p6QJyBzdHlsZT0nd2lkdGg6NDBweCc+IjsKCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSAiPGRpdiBjbGFzcz0ncGxheUxpbmVEaXYgemhtX3BsYXlfdmlkZW9fd3JhcCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnPiIKCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSAiPGRpdiBjbGFzcz0nemhtX3BsYXlfdmlkZW9fbGluZSc+IjsKCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSI8ZGl2Pjx1bCBjbGFzcz0nemhtX3BsYXlfdmlkZV9saW5lX3VsJz4iOwoKICAgICAgICAgICAgcGxheUxpbmUuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSAnJzsKCiAgICAgICAgICAgICAgICBpZihnZXRDb29raWUoJ3BsYXlMaW5lQWN0aW9uJykgPT0gaXRlbS51cmwpewoKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZD0nemhtX2xpbmVfc2VsZWN0ZWQnOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz1gPGxpIGNsYXNzPSdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGkgJHtzZWxlY3RlZH0nIHVybD0nJHtpdGVtLnVybH0nID4ke2l0ZW0ubmFtZX08L2xpPmA7CgogICAgICAgICAgICB9KQoKICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9IjwvZGl2PjwvZGl2PjwvZGl2PiI7CgogICAgICAgICAgICAvL3RlbXBsYXRlOm5vZGU75pKt5pS+5Yy65Z+fCgogICAgICAgICAgICBsZXQgcGxheUp4SHRtbCA9ICI8ZGl2IGNsYXNzPSd6aG1fcGxheV92aWRlb19qeCc+IjsKCiAgICAgICAgICAgIHBsYXlKeEh0bWwgKz0gIjxpZnJhbWUgYWxsb3d0cmFuc3BhcmVuY3k9dHJ1ZSBmcmFtZWJvcmRlcj0nMCcgc2Nyb2xsaW5nPSdubycgYWxsb3dmdWxsc2NyZWVuPXRydWUgYWxsb3d0cmFuc3BhcmVuY3k9dHJ1ZSBuYW1lPSdqeF9wbGF5JyBzdHlsZT0naGVpZ2h0OjEwMCU7d2lkdGg6MTAwJScgaWQ9J3BsYXlJZnJhbWUnPjwvaWZyYW1lPjwvZGl2PiI7CgogICAgICAgICAgICAvL+W+queOr+WIpOaWreaYr+WQpuWcqOaSreaUvumhte+8jOaYr+WImeaJp+ihjOS4i+mdogogICAgICAgICAgICBsZXQganhWaWRlb0RhdGEgPSBbCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovbVwudlwucXFcLmNvbVwveFwvcGxheVwuaHRtbFw/Y2lkPS8sYXJlYUNsYXNzTmFtZTonc2xpZGVyX2JveCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovbVwudlwucXFcLmNvbVwvcGxheVwuaHRtbFw/Y2lkXD0vLGFyZWFDbGFzc05hbWU6J3NsaWRlcl9ib3gnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L21cLnZcLnFxXC5jb21cL2NvdmVyXC8uKmh0bWwvLGFyZWFDbGFzc05hbWU6J3NsaWRlcl9ib3gnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L2h0dHBzPzpcL1wvbVwudlwucXFcLmNvbVwveFwvbVwvcGxheVw/LipjaWQuKi8sYXJlYUNsYXNzTmFtZTonc2xpZGVyX2JveCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovM2dcLnZcLnFxXC5jb21cL3hcL21cL3BsYXlcP2NpZD0uKi8sYXJlYUNsYXNzTmFtZTonc2xpZGVyX2JveCd9LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLm0tdmlkZW8tcGxheWVyLXdyYXAiLG1hdGNoOi9eaHR0cHM6XC9cL20uaXFpeWlcLmNvbVwvW3Z3YV1cXy8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLmludGwtdmlkZW8td3JhcCIsbWF0Y2g6L15odHRwczpcL1wvd3d3XC5pcVwuY29tXC9wbGF5XC8vLGFyZWFDbGFzc05hbWU6J20tc2xpZGluZy1saXN0J30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovbVwueW91a3VcLmNvbVwvYWxpcGF5X3ZpZGVvXC9pZF8vLGFyZWFDbGFzc05hbWU6Jyd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovbVwueW91a3VcLmNvbVwvdmlkZW9cL2lkXy8sYXJlYUNsYXNzTmFtZTonJ30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIucGxheWVyLWNvbnRhaW5lciIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwuYmlsaWJpbGlcLmNvbVwvYmFuZ3VtaS8sYXJlYUNsYXNzTmFtZTonZXAtbGlzdC1wcmUtYm9keSd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIubXBsYXllciIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwuYmlsaWJpbGlcLmNvbVwvdmlkZW9cLy8sYXJlYUNsYXNzTmFtZTonZXAtbGlzdC1wcmUtYm9keSd9LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnZpZGVvLWFyZWEiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L21cLm1ndHZcLmNvbVwvYi8sYXJlYUNsYXNzTmFtZTonY2xlYXJmaXgnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNsZV9wbGF5Ym94Iixub2RlVHlwZTonaWQnLG1hdGNoOi9tXC5sZVwuY29tXC9wdHZcL3ZwbGF5XC8vLGFyZWFDbGFzc05hbWU6J3NpZGVzbGlwX3NsaWRlJ30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjai1wbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLmxlXC5jb21cL3ZwbGF5LyxhcmVhQ2xhc3NOYW1lOidqdWppJ30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9wbGF5XC50dWRvdVwuY29tXC92X3Nob3dcL2lkXy99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BwdHZfcGxheXBhZ2VfYm94Iixub2RlVHlwZTonaWQnLG1hdGNoOi92XC5wcHR2XC5jb21cL3Nob3dcLy99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovdmlwXC4xOTA1LmNvbVwvcGxheVwvL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjdm9kUGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi93d3dcLjE5MDUuY29tXC92b2RcL3BsYXlcLy99LAogICAgICAgICAgICBdOwoKICAgICAgICAgICAgLy/liJvlu7psb2dvX2ljb24KICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZGl2JywnemhtSWNvbicpOwoKICAgICAgICAgICAgbGV0IHpobVBsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemhtSWNvbicpOwoKICAgICAgICAgICAgemhtUGxheS5pbm5lckhUTUwgPSBwbGF5V3JhcEh0bWw7CgogICAgICAgICAgICBsZXQganhWaWRlb1dlYiA9IGp4VmlkZW9EYXRhLmZpbHRlcihmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5tYXRjaChpdGVtLm1hdGNoKTsKCiAgICAgICAgICAgIH0pCgogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtbG9nbycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgIGxldCBqeFZpZGVvV2ViID0ganhWaWRlb0RhdGEuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5tYXRjaChpdGVtLm1hdGNoKTsKCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIGlmKGp4VmlkZW9XZWIubGVuZ3RoID09IDApewoKICAgICAgICAgICAgICAgICAgICB0b2FzdCgn6K+35Zyo6KeG6aKR5pKt5pS+6aG154K55Ye75Zu+5qCHJyk7CgogICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgIHZhciB7ZnVuY05hbWUsbWF0Y2g6bm93TWF0Y2gsbm9kZTpub3dOb2RlLG5hbWU6bm93TmFtZX0gPSBqeFZpZGVvV2ViWzBdOwoKICAgICAgICAgICAgICAgICAgICBsZXQgcGxheUxpbmVEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuemhtX3BsYXlfdmlkZW9fd3JhcCcpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVNob3cgPSBwbGF5TGluZURpdi5zdHlsZS5kaXNwbGF5OwoKICAgICAgICAgICAgICAgICAgICBwbGF5U2hvdyA9PSAnbm9uZSc/IHBsYXlMaW5lRGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOnBsYXlMaW5lRGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgogICAgICAgICAgICAgICAgICAgIHZhciBwbGF5TGluZVRkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBsYXlMaW5lVGQnKTsKCiAgICAgICAgICAgICAgICAgICAgcGxheUxpbmVUZC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5TGluZVRkLmZvckVhY2goZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdjbGFzcycsJ3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGkgemhtX2xpbmVfc2VsZWN0ZWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb29raWUoJ3BsYXlMaW5lQWN0aW9uJyx0aGlzLmdldEF0dHJpYnV0ZSgndXJsJyksMzApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3dXZWJOb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihub3dOb2RlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihub3dXZWJOb2RlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93V2ViTm9kZS5pbm5lckhUTUwgPSBwbGF5SnhIdG1sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheUlmcmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwbGF5SWZyYW1lJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlJZnJhbWUuc3JjPSBpdGVtLmdldEF0dHJpYnV0ZSgndXJsJykrbG9jYXRpb24uaHJlZjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikee9keermee7k+eCueS4jeWtmOWcqCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvU2VsZWN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLicranhWaWRlb1dlYlswXS5hcmVhQ2xhc3NOYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgdmlkZW9TZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWY9bG9jYXRpb24uaHJlZjsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwMCkKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSkKCgogICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgIGxldCBqeFZpZGVvV2ViID0ganhWaWRlb0RhdGEuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5tYXRjaChpdGVtLm1hdGNoKTsKCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIGlmKGp4VmlkZW9XZWIubGVuZ3RoPjApewoKICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9TZWxlY3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuJytqeFZpZGVvV2ViWzBdLmFyZWFDbGFzc05hbWUpOwoKICAgICAgICAgICAgICAgICAgICBpZih2aWRlb1NlbGVjdCl7CgogICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1NlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmPWxvY2F0aW9uLmhyZWY7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9LDEwMDApCgogICAgICAgIH0KCiAgICAgICAgcGxheVZpZGVvRnVuYygpOwoKICAgIH1lbHNlewogICAgICAgIC8qLS1jb25maWctLSovCiAgICAgICAgdmFyIENvbmZpZyA9ewoKICAgICAgICBjb3Vwb25Vcmw6d2luZG93LmxvY2F0aW9uLmhyZWYsCgogICAgICAgIGNvdXBvbkhvc3Q6d2luZG93LmxvY2F0aW9uLmhvc3QsCgogICAgICAgIHdlYlVybDonaHR0cDovL211c2ljLmxpdXpoaWppbi5jbi8nLAoKICAgICAgICBpY29uVmlwVG9wOjM2MCwKCiAgICAgICAgaWNvblZpcFBvc2l0aW9uIDogJ2xlZnQnLAoKICAgICAgICBpY29uVmlwV2lkdGggOiA0MCwKCiAgICAgICAgY291cG9uVGltZXJOdW0gOiAxMDAsLy8xMDDmrKHnrYnkuo4xMOenkgoKICAgICAgICBjb3Vwb25XYWl0VGltZSA6IDEwMCwKCiAgICAgICAgaWNvbldhaXRUaW1lIDogMTAwLAoKICAgICAgICBpY29uVmlwT3BhY2l0eToxMDAsCgogICAgICAgIHNlbGVjdGVkTGVmdDonc2VsZWN0ZWQnLAoKICAgICAgICBzZWxlY3RlZFJpZ2h0OicnLAoKICAgICAgICB2aWRlb1BsYXlMaW5lQWRkOkdNX2dldFZhbHVlKCd2aWRlb1BsYXlMaW5lQWRkJywwKSwKCiAgICAgICAgfQoKICAgICAgICB2YXIge2NvdXBvblVybCwKICAgICAgICAgICAgY291cG9uSG9zdCwKICAgICAgICAgICAgd2ViVXJsLAogICAgICAgICAgICBpY29uVmlwVG9wLAogICAgICAgICAgICBpY29uVmlwUG9zaXRpb24sCiAgICAgICAgICAgIGljb25WaXBXaWR0aCwKICAgICAgICAgICAgaWNvblZpcE9wYWNpdHksCiAgICAgICAgICAgIGNvdXBvblRpbWVyTnVtLAogICAgICAgICAgICBjb3Vwb25XYWl0VGltZSwKICAgICAgICAgICAgaWNvbldhaXRUaW1lLAogICAgICAgICAgICBzZWxlY3RlZExlZnQsCiAgICAgICAgICAgIHNlbGVjdGVkUmlnaHQsCiAgICAgICAgICAgIHZpZGVvUGxheUxpbmVBZGQsCiAgICAgICAgfSA9IENvbmZpZzsKICAgICAgICAvKi0tbGFuZy0tKi8KICAgICAgICB2YXIgbGFuZyA9IHsKICAgICAgICAgICAgc2V0Oiforr7nva4nLAogICAgICAgICAgICBpY29uUG9zaXRpb246J+Wbvuagh+iuvue9ricsCiAgICAgICAgICAgIHBsYXlWaWRlbzon6Kej5p6Q6K6+572uJywKICAgICAgICAgICAgaWNvbkhlaWdodDon5Zu+5qCH6auY5bqmJywKICAgICAgICAgICAgaWNvbldpZHRoOiflm77moIflpKflsI8nLAogICAgICAgICAgICBpY29uTGluZTon5rC05bmz5L2N572uJywKICAgICAgICAgICAgaWNvbldhaXRUaW1lOifnrYnlvoXml7bpl7QnLAogICAgICAgICAgICBpY29uTGVmdDon6Z2g5bemJywKICAgICAgICAgICAgaWNvblJpZ2h0OifpnaDlj7MnLAogICAgICAgICAgICB0aXBJY29uSGVpZ2h0Oifpu5jorqQzNjAs5bu66K6uMX41MDAnLAogICAgICAgICAgICB0aXBJY29uV2lkdGg6J+m7mOiupDQwLOW7uuiurjIwfjUwJywKICAgICAgICAgICAgdGlwSWNvbk9wYWNpdHk6J+ivt+Whq+WGmTAtMTAw55qE5pW05pWwJywKICAgICAgICAgICAgdGlwRXJyb3JJY29uSGVpZ2h0Oic85Zu+5qCH5L2N572uPuS4reeahDzlm77moIfpq5jluqY+5bqU5Li6MTAwMOS7peWGheato+aVtOaVsO+8jOW7uuiurjF+NTAwJywKICAgICAgICAgICAgdGlwRXJyb3JJY29uV2lkdGg6Jzzlm77moIfkvY3nva4+5Lit55qEPOWbvuagh+Wkp+Wwjz7lupTkuLoxMDDku6XlhoXmraPmlbTmlbDvvIzlu7rorq4yMH41MCcsCiAgICAgICAgICAgIHRpcEVycm9ySWNvbk9wYWNpdHk6J+Whq+WGmeaVsOWtl+S4jeato+ehricsCiAgICAgICAgICAgIHNldFBsYXlWaWRlbzon6Kej5p6Q6K6+572uJywKICAgICAgICAgICAgcGxheVZpZGVvTGluZUFkZDon56uZ5aSW6Kej5p6QJywKICAgICAgICAgICAgdGlwUGxheVZpZGVvTGluZUFkZDon6K+35aGr5YWl57q/6Lev5ZCN56ew5ZKM5Zyw5Z2A77yM5Lit6Ze055So5Y2K6KeS6YCX5Y+36ZqU5byA77yM5q+P57q/6Lev5LiA6KGM44CCJywKICAgICAgICAgICAgc2NyaXB0c2luc3RhbGw6J+iEmuacrOWuieijhScsCiAgICAgICAgICAgIHNjcmlwdHN1c2U6J+S9v+eUqOaWueazlScsCiAgICAgICAgICAgIHF1ZXN0aW9uOifluLjop4Hpl67popgnLAogICAgICAgICAgICB0Z2dyb3VwOidUZWxlZ3JhbScKICAgICAgICB9OwoKICAgICAgICB2YXIganhWaWRlbz1bCgogICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsbWF0Y2g6L2h0dHBzPzpcL1wvdlwucXFcLmNvbS8sbmFtZToncXFQQyd9LAogICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9odHRwcz86XC9cL21cLnZcLnFxXC5jb20vLG5hbWU6J3FxTW9iaWxlJ30sCgogICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmlxaXlpXC5jb20vLG5hbWU6J2lxaXlpUGMnfSwKICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5pcVwuY29tL30sCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLm0tdmlkZW8tcGxheWVyLXdyYXAiLG1hdGNoOi9eaHR0cHM/OlwvXC9tLmlxaXlpXC5jb20vLGFyZWFDbGFzc05hbWU6J20tc2xpZGluZy1saXN0J30sCgogICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLnlvdWt1XC5jb21cL2FsaXBheV92aWRlb1wvaWRfL30sCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwueW91a3VcLmNvbVwvdmlkZW9cL2lkXy99LAogICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9eaHR0cHM/OlwvXC8uKnlvdWt1XC5jb20vfSwKCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuYmlsaWJpbGlcLmNvbS99LAogICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9eaHR0cHM/OlwvXC9tXC5iaWxpYmlsaVwuY29tL30sCgogICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii52aWRlby1hcmVhIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5tZ3R2XC5jb21cL2IvfSwKICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBtYXRjaDovbWd0dlwuY29tLyxhcmVhQ2xhc3NOYW1lOidlcGlzb2RlLWl0ZW1zIGNsZWFyZml4J30sCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLngtY292ZXItcGxheWJ0bi13cmFwIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi8udHZcLnNvaHVcLmNvbS99LAogICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii54LWNvdmVyLXBsYXlidG4td3JhcCIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwudHZcLnNvaHVcLmNvbS99LAogICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXJXcmFwIixub2RlVHlwZTonaWQnLG1hdGNoOi9maWxtXC5zb2h1XC5jb20vfSwKCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L3R1ZG91XC5jb20vfSwKCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIixtYXRjaDovbGVcLmNvbS99LAoKICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLG1hdGNoOi9wcHR2XC5jb20vfSwKCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIixtYXRjaDovMTkwNVwuY29tL30sCgogICAgICAgIF07CgogICAgICAgIHZhciBwbGF5TGluZSA9IFsKICAgICAgICAgICAgICAgIHsibmFtZSI6Iue6r+WHgDEiLCJ1cmwiOiJodHRwczovL2ltMTkwNy50b3AvP2p4PSIsIm1vYmlsZSI6MX0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJC56uZMSIsInVybCI6Imh0dHBzOi8vanguanNvbnBsYXllci5jb20vcGxheWVyLz91cmw9IiwibW9iaWxlIjoxfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IllUIiwidXJsIjoiaHR0cHM6Ly9qeC55YW5ndHUudG9wLz91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IkJMIiwidXJsIjoiaHR0cHM6Ly92aXAuYmxqaWV4LmNvbS8/dj0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi5Yaw6LGGIiwidXJsIjoiaHR0cHM6Ly9iZC5qeC5jbi8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJDSyIsInVybCI6Imh0dHBzOi8vd3d3LmNrcGxheWVyLnZpcC9qaWV4aS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLlvLnluZUiLCJ1cmwiOiJodHRwczovL2RtangubTN1OC50di8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJJSzkiLCJ1cmwiOiJodHRwczovL3lwYXJzZS5pazkuY2MvaW5kZXgucGhwP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiSlkiLCJ1cmwiOiJodHRwczovL2p4LnBsYXllcmp5LmNvbS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLop6PmnpBsYSIsInVybCI6Imh0dHBzOi8vYXBpLmppZXhpLmxhLz91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6Ik0zVTgiLCJ1cmwiOiJodHRwczovL2p4Lm0zdTgudHYvamlleGkvP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiUE0iLCJ1cmwiOiJodHRwczovL3d3dy5wbGF5bTN1OC5jbi9qaWV4aS5waHA/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLnm5jlj6QiLCJ1cmwiOiJodHRwczovL3d3dy5wYW5ndWppZXhpLmNjL2ppZXhpLnBocD91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuebmOWPpDIiLCJ1cmwiOiJodHRwczovL3d3dy5wYW5ndWppZXhpLmNvbS9qaWV4aS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLliZbkupEiLCJ1cmwiOiJodHRwczovL3d3dy5wb3V5dW4uY29tLz91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuS4g+WTpSIsInVybCI6Imh0dHBzOi8vangubm54di5jbi90di5waHA/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLnpZ7lk6UiLCJ1cmwiOiJodHRwczovL2pzb24ub3Z2by5wcm8vangucGhwP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi5ZCs5LmQIiwidXJsIjoiaHR0cHM6Ly9qeC5kajZ1LmNvbS8/dXJsPSIsIm1vYmlsZSI6MX0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLnu7TlpJoiLCJ1cmwiOiJodHRwczovL2p4Lml2aXRvLmNuLz91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuiZvuexsyIsInVybCI6Imh0dHBzOi8vangueG1mbHYuY29tLz91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuiZvuexszIiLCJ1cmwiOiJodHRwczovL2p4LnhtZmx2LmNjLz91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuWknOW5lSIsInVybCI6Imh0dHBzOi8vd3d3LnllbXUueHl6Lz91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuS6keaekCIsInVybCI6Imh0dHBzOi8vangueXBhcnNlLmNvbS9pbmRleC5waHA/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiIxN+S6kSIsInVybCI6Imh0dHBzOi8vd3d3LjE3MTd5dW4uY29tL2p4L3R5LnBocD91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IjE4MCIsInVybCI6Imh0dHBzOi8vanguMDAwMTgwLnRvcC9qeC8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiIyeXMiLCJ1cmwiOiJodHRwczovL2dqLmZlbnhpYW5nYi5jb20vcGxheWVyL2FuYWx5c2lzLnBocD92PSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiI4MDkwIiwidXJsIjoiaHR0cHM6Ly93d3cuODA5MGcuY24vP3VybD0iLCJtb2JpbGUiOjB9CiAgICAgICAgICAgIF0KCiAgICAgICAgdmFyIGtleUNvZGUgPSBbCiAgICAgICAgICAgIHtjb2RlOjQ4LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzAnfSwKICAgICAgICAgICAge2NvZGU6NDgsaXNTaGlmdDp0cnVlLHZhbHVlOicpJ30sCiAgICAgICAgICAgIHtjb2RlOjQ5LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzEnfSwKICAgICAgICAgICAge2NvZGU6NDksaXNTaGlmdDp0cnVlLHZhbHVlOichJ30sCiAgICAgICAgICAgIHtjb2RlOjUwLGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzInfSwKICAgICAgICAgICAge2NvZGU6NTAsaXNTaGlmdDp0cnVlLHZhbHVlOidAJ30sCiAgICAgICAgICAgIHtjb2RlOjUxLGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzMnfSwKICAgICAgICAgICAge2NvZGU6NTEsaXNTaGlmdDp0cnVlLHZhbHVlOicjJ30sCiAgICAgICAgICAgIHtjb2RlOjUyLGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzQnfSwKICAgICAgICAgICAge2NvZGU6NTIsaXNTaGlmdDp0cnVlLHZhbHVlOickJ30sCiAgICAgICAgICAgIHtjb2RlOjUzLGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzUnfSwKICAgICAgICAgICAge2NvZGU6NTMsaXNTaGlmdDp0cnVlLHZhbHVlOiclJ30sCiAgICAgICAgICAgIHtjb2RlOjU0LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzYnfSwKICAgICAgICAgICAge2NvZGU6NTQsaXNTaGlmdDp0cnVlLHZhbHVlOideJ30sCiAgICAgICAgICAgIHtjb2RlOjU1LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzcnfSwKICAgICAgICAgICAge2NvZGU6NTUsaXNTaGlmdDp0cnVlLHZhbHVlOicmJ30sCiAgICAgICAgICAgIHtjb2RlOjU2LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzgnfSwKICAgICAgICAgICAge2NvZGU6NTYsaXNTaGlmdDp0cnVlLHZhbHVlOicqJ30sCiAgICAgICAgICAgIHtjb2RlOjU3LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzknfSwKICAgICAgICAgICAge2NvZGU6NTcsaXNTaGlmdDp0cnVlLHZhbHVlOicoJ30sCiAgICAgICAgICAgIHtjb2RlOjcwLGlzU2hpZnQ6ZmFsc2UsdmFsdWU6J2YnfSwKICAgICAgICAgICAge2NvZGU6NzAsaXNTaGlmdDp0cnVlLHZhbHVlOidGJ30sCiAgICAgICAgICAgIHtjb2RlOjc0LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6J2onfSwKICAgICAgICAgICAge2NvZGU6NzQsaXNTaGlmdDp0cnVlLHZhbHVlOidKJ30sCiAgICAgICAgICAgIHtjb2RlOjc1LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6J2snfSwKICAgICAgICAgICAge2NvZGU6NzUsaXNTaGlmdDp0cnVlLHZhbHVlOidLJ30sCiAgICAgICAgICAgIHtjb2RlOjc2LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6J2wnfSwKICAgICAgICAgICAge2NvZGU6NzYsaXNTaGlmdDp0cnVlLHZhbHVlOidMJ30sCiAgICAgICAgXQoKICAgICAgICAvKi0tQ2xhc3MtLSovCiAgICAgICAgY2xhc3MgQmFzZUNsYXNzewoKICAgICAgICAgICAgY29uc3RydWN0b3IoKXsKCiAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgnaWNvblBvc2l0aW9uU2V0UGFnZScpICE9IDApewogICAgICAgICAgICAgICAgICAgIC8qY29va2ll5a2Y5YKoCiAgICAgICAgICAgICAgICAgICAgaWNvblZpcFRvcCA9IHRoaXMuZ2V0Q29va2llKCdpY29uVG9wJyk/dGhpcy5nZXRDb29raWUoJ2ljb25Ub3AnKTppY29uVmlwVG9wOwoKICAgICAgICAgICAgICAgICAgICBpY29uVmlwUG9zaXRpb24gPSB0aGlzLmdldENvb2tpZSgnaWNvblBvc2l0aW9uJyk/dGhpcy5nZXRDb29raWUoJ2ljb25Qb3NpdGlvbicpOmljb25WaXBQb3NpdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRMZWZ0ID0gaWNvblZpcFBvc2l0aW9uPT0nbGVmdCc/J3NlbGVjdGVkJzonJzsKCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSaWdodCA9IGljb25WaXBQb3NpdGlvbj09J3JpZ2h0Jz8nc2VsZWN0ZWQnOicnOwoKICAgICAgICAgICAgICAgICAgICBpY29uVmlwV2lkdGggPSB0aGlzLmdldENvb2tpZSgnaWNvbldpZHRoJyk/dGhpcy5nZXRDb29raWUoJ2ljb25XaWR0aCcpOmljb25WaXBXaWR0aDsKICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICBpY29uVmlwVG9wID0gR01fZ2V0VmFsdWUoJ2ljb25Ub3AnKSB8fCBHTV9nZXRWYWx1ZSgnaWNvblRvcCcpID09IDA/R01fZ2V0VmFsdWUoJ2ljb25Ub3AnKTppY29uVmlwVG9wOwoKICAgICAgICAgICAgICAgICAgICBpY29uVmlwUG9zaXRpb24gPSBHTV9nZXRWYWx1ZSgnaWNvblBvc2l0aW9uJyk/R01fZ2V0VmFsdWUoJ2ljb25Qb3NpdGlvbicpOmljb25WaXBQb3NpdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRMZWZ0ID0gaWNvblZpcFBvc2l0aW9uPT0nbGVmdCc/J3NlbGVjdGVkJzonJzsKCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSaWdodCA9IGljb25WaXBQb3NpdGlvbj09J3JpZ2h0Jz8nc2VsZWN0ZWQnOicnOwoKICAgICAgICAgICAgICAgICAgICBpY29uVmlwV2lkdGggPSBHTV9nZXRWYWx1ZSgnaWNvbldpZHRoJyk/R01fZ2V0VmFsdWUoJ2ljb25XaWR0aCcpOmljb25WaXBXaWR0aDsKCiAgICAgICAgICAgICAgICAgICAgaWNvbldhaXRUaW1lID0gR01fZ2V0VmFsdWUoJ2ljb25XYWl0VGltZScpP0dNX2dldFZhbHVlKCdpY29uV2FpdFRpbWUnKSoxMDAwOmljb25XYWl0VGltZTsKCiAgICAgICAgICAgICAgICAgICAgaWNvblZpcE9wYWNpdHkgPSBHTV9nZXRWYWx1ZSgnaWNvbk9wYWNpdHknKSB8fCBHTV9nZXRWYWx1ZSgnaWNvbk9wYWNpdHknKSA9PSAwP0dNX2dldFZhbHVlKCdpY29uT3BhY2l0eScpOmljb25WaXBPcGFjaXR5OwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCLorr7nva4iLCAoKSA9PiB0aGlzLm1lbnVTZXQoKSk7CgogICAgICAgICAgICAgICAgdGhpcy5zZXRTdHlsZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzZXRTdHlsZSgpewogICAgICAgICAgICAgICAgbGV0IG1lbnVTZXRTdHlsZSA9IGAKICAgICAgICAgICAgICAgICAgICAgICAgLnpobU1hc2t7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTk5OTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IzAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDt0b3A6IDA7cmlnaHQ6IDA7Ym90dG9tOiAwO2xlZnQ6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OjAuODsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAud3JhcC1ib3h7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OjEwMDAwMDAwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpmaXhlZDs7dG9wOiA1MCU7bGVmdDogNTAlO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC0yMDBweCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMzAwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzpoaWRkZW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OjE2cHggbnVtRm9udCxQaW5nRmFuZ1NDLVJlZ3VsYXIsVGFob21hLE1pY3Jvc29mdCBZYWhlaSxzYW5zLXNlcmlmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDo0MDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0V3JhcEhlYWR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmMjQ0NDM7aGVpZ2h0OjQwcHg7Y29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDo0MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXcmFwTGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXcmFwTGkgbGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2VlZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MTJweCAyMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdyYXBMaUNvbnRlbnR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4O2p1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXcmFwU2F2ZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO3RvcDotMnB4O3JpZ2h0OjEwcHg7Zm9udC1zaXplOjI0cHg7Y3Vyc29yOnBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldEZvb3R7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MHB4O3BhZGRpbmc6MTBweCAyMHB4O3dpZHRoOjEwMCU7CiAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTAwMDAwMDAwOTtiYWNrZ3JvdW5kOiNmZWY5ZWY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRGb290TGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldEZvb3RMaSBsaXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzowcHggMnB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRGb290TGkgbGkgYXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiM1NTU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRGb290TGkgYTpob3ZlciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjojZmU2ZDczOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0UGFnZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTAwMDAwMDAwMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO3RvcDowcHg7bGVmdDozMDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6I2ZmZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOjMwMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRVbEhlYWR7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0UGFnZUhlYWR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjY2NjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjQwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDo0MHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZTZkNzM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjojZmZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNXB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0UGFnZUxpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweDtwYWRkaW5nOjBweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFBhZ2VMaSBsaXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjhweCAyMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2VlZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhpaHVTZXRQYWdlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDoxMDAwMDAwMDAyO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowcHg7bGVmdDozMDBweDtiYWNrZ3JvdW5kOiNmZmY7d2lkdGg6MzAwcHg7aGVpZ2h0OjEwMCU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRQYWdlSW5wdXR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpoaWh1U2V0UGFnZUxpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweDtwYWRkaW5nOjBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDoyNThweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93LXk6IHNjcm9sbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLnpoaWh1U2V0UGFnZUNvbnRlbnR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fY2lyY3VsYXJ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogNDBweDtoZWlnaHQ6IDIwcHg7Ym9yZGVyLXJhZGl1czogMTZweDt0cmFuc2l0aW9uOiAuM3M7Y3Vyc29yOiBwb2ludGVyO2JveC1zaGFkb3c6IDAgMCAzcHggIzk5OSBpbnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAucm91bmQtYnV0dG9uewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwcHg7aGVpZ2h0OiAyMHB4Oztib3JkZXItcmFkaXVzOiA1MCU7Ym94LXNoYWRvdzogMCAxcHggNXB4IHJnYmEoMCwwLDAsLjUpO3RyYW5zaXRpb246IC4zcztwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9iYWNrewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBzb2xpZCAjRkZGOyBib3JkZXItd2lkdGg6IDAgM3B4IDNweCAwOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDNweDt0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpOyAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpO21hcmdpbi1sZWZ0OjEwcHg7Y3Vyc29yOnBvaW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRvLXJpZ2h0ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6MjBweDsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nOiAzcHg7dHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO2N1cnNvcjpwb2ludGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFNhdmV7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MjRweDtjdXJzb3I6cG9pbnRlcjttYXJnaW4tcmlnaHQ6NXB4O21hcmdpbi1ib3R0b206NHB4O2NvbG9yOiNGRkY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTAwMDAwMDAwMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOjBweDtsZWZ0OjMwMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDojZmZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2hlYWRlcnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNjY2M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6NDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OjQwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZlNmQ3MzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZV9jb250ZW50ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O2p1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2V0X3BhZ2VfbGlzdHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7cGFkZGluZzowcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDIyMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2xpc3Q6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h5pW05L2T5qC35byPKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIDogMHB4OyAgLyrpq5jlrr3liIbliKvlr7nlupTmqKrnq5bmu5rliqjmnaHnmoTlsLrlr7gqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZV9saXN0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKua7muWKqOadoemHjOmdouWwj+aWueWdlyovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzICAgOiAycHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmU2ZDczOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2V0X3BhZ2VfbGlzdDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrmu5rliqjmnaHph4zpnaLovajpgZMqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdyAgIDogaW5zZXQgMCAwIDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kICAgOiAjZWRlZGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2xpc3QgbGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmJvcmRlci1ib3R0b206MXB4IHNvbGlkICNjY2M7Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MTJweCAyMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpibG9jazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbGk6bGFzdC1jaGlsZHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206bm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3Njcm9sbHsKICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h5pW05L2T5qC35byPKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIDogMHB4OyAgLyrpq5jlrr3liIbliKvlr7nlupTmqKrnq5bmu5rliqjmnaHnmoTlsLrlr7gqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h6YeM6Z2i5bCP5pa55Z2XKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXMgICA6IDJweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZTZkNzM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h6YeM6Z2i6L2o6YGTKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3cgICA6IGluc2V0IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCAgIDogI2VkZWRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLyotZm9ybS0qLwogICAgICAgICAgICAgICAgICAgICAgICA6cm9vdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWJhc2UtY29sb3I6ICM0MzRhNTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXdoaXRlLWNvbG9yLXByaW1hcnk6ICNmN2Y4Zjg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXdoaXRlLWNvbG9yLXNlY29uZGFyeTogI2ZlZmVmZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZ3JheS1jb2xvci1wcmltYXJ5OiAjYzJjMmMyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1ncmF5LWNvbG9yLXNlY29uZGFyeTogI2MyYzJjMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZ3JheS1jb2xvci10ZXJ0aWFyeTogIzY3NmY3OTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tYWN0aXZlLWNvbG9yOiAjMjI3YzlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS12YWxpZC1jb2xvcjogI2MyYzJjMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taW52YWxpZC1jb2xvcjogI2Y3MmY0NzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taW52YWxpZC1pY29uOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0ZjgsJTNDc3ZnJTIweG1sbnMlM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjIwMDAlMkZzdmclMjIlMjB3aWR0aCUzRCUyMjI0JTIyJTIwaGVpZ2h0JTNEJTIyMjQlMjIlMjB2aWV3Qm94JTNEJTIyMCUyMDAlMjAyNCUyMDI0JTIyJTNFJTIwJTNDcGF0aCUyMGQlM0QlMjJNMTMuNDElMjAxMmw0LjMtNC4yOWExJTIwMSUyMDAlMjAxJTIwMC0xLjQyLTEuNDJMMTIlMjAxMC41OWwtNC4yOS00LjNhMSUyMDElMjAwJTIwMCUyMDAtMS40MiUyMDEuNDJsNC4zJTIwNC4yOS00LjMlMjA0LjI5YTElMjAxJTIwMCUyMDAlMjAwJTIwMCUyMDEuNDIlMjAxJTIwMSUyMDAlMjAwJTIwMCUyMDEuNDIlMjAwbDQuMjktNC4zJTIwNC4yOSUyMDQuM2ExJTIwMSUyMDAlMjAwJTIwMCUyMDEuNDIlMjAwJTIwMSUyMDElMjAwJTIwMCUyMDAlMjAwLTEuNDJ6JTIyJTIwZmlsbCUzRCUyMiUyM2Y3MmY0NyUyMiUyMCUyRiUzRSUzQyUyRnN2ZyUzRSIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OjBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZ3JheS1jb2xvci1wcmltYXJ5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMS43ZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMS43OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDJweCAxZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOjU1JTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxNHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNpemluZzogaW5pdGlhbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keTotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHZhcigtLWdyYXktY29sb3Itc2Vjb25kYXJ5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keTo6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogdmFyKC0tZ3JheS1jb2xvci1zZWNvbmRhcnkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5OjpwbGFjZWhvbGRlciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogdmFyKC0tZ3JheS1jb2xvci1zZWNvbmRhcnkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keVtkYXRhLWlzLXZhbGlkXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxZW07CgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5W2RhdGEtaXMtdmFsaWQ9dHJ1ZV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS12YWxpZC1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHlbZGF0YS1pcy12YWxpZD1mYWxzZV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pbnZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS1pbnZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keTpmb2N1cyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWFjdGl2ZS1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0tYWN0aXZlLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHk6LXdlYmtpdC1hdXRvZmlsbCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiA5OTk5czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX3ZhbGlkYXRvciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCAwLjVlbSBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1zaXplOiAxLjVlbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IC0xOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5W2RhdGEtaXMtdmFsaWQ9ZmFsc2VdICsgLnRleHQtaW5wdXRfX3ZhbGlkYXRvciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1pbnZhbGlkLWljb24pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGluaGVyaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuNXMgZWFzZS1vdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDo5MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94OjphZnRlciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWdyYXktY29sb3Itc2Vjb25kYXJ5KSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItd2lkdGg6IDZweCA0cHggMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBhdXRvIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAtNzJweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDogMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveF9fYm9keSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBpbml0aWFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZ3JheS1jb2xvci1wcmltYXJ5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMS43ZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMS43OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAxZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiBjYWxjKDFlbSArIDE2cHgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDE0MCU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTRweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctdG9wOjJweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOjJweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveF9fYm9keVtkYXRhLWlzLXZhbGlkPXRydWVdIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tdmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLXZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveF9fYm9keVtkYXRhLWlzLXZhbGlkPWZhbHNlXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWludmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWludmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94X19ib2R5LmZvY3VzLXZpc2libGUgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY3RpdmUtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWFjdGl2ZS1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94X19ib2R5Oi13ZWJraXQtYXV0b2ZpbGwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogOTk5OXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0YXJlYV9fYm9keSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ncmF5LWNvbG9yLXByaW1hcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGluaXRpYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiBpbmhlcml0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC41cyBlYXNlLW91dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWFfX2JvZHk6b25seS1jaGlsZCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemU6IHZlcnRpY2FsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0YXJlYV9fYm9keTpmb2N1cyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWFjdGl2ZS1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0tYWN0aXZlLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHRhcmVhX19ib2R5W2RhdGEtaXMtdmFsaWQ9dHJ1ZV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS12YWxpZC1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0tdmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0YXJlYV9fYm9keVtkYXRhLWlzLXZhbGlkPWZhbHNlXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWludmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWludmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWEgLl9kdW1teS1ib3ggewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLWhlaWdodDogMjQwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudG9MZWZ0TW92ZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbWF0aW9uOm1vdmVUb0xlZnQgMC41cyBpbmZpbml0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOm1vdmVUb0xlZnQgMC41cyBpbmZpbml0ZTsgLypTYWZhcmkgYW5kIENocm9tZSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OjE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgQGtleWZyYW1lcyBtb3ZlVG9MZWZ0ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB7bGVmdDoyMDBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB7bGVmdDowcHg7fQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbW92ZVRvTGVmdCAvKlNhZmFyaSBhbmQgQ2hyb21lKi97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHtsZWZ0OjIwMHB4O30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHtsZWZ0OjBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC50b1JpZ2h0TW92ZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbWF0aW9uOm1vdmVUb1JpZ2h0IDJzIGluZmluaXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb246bW92ZVRvUmlnaHQgMnMgaW5maW5pdGU7IC8qU2FmYXJpIGFuZCBDaHJvbWUqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDoxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgQGtleWZyYW1lcyBtb3ZlVG9SaWdodHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20ge2xlZnQ6MHB4O30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHtsZWZ0OjIwMDBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBtb3ZlVG9SaWdodCAvKlNhZmFyaSBhbmQgQ2hyb21lKi97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHtsZWZ0OjBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB7bGVmdDoyMDBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgYDsKCiAgICAgICAgICAgICAgICBkb21TdHlsZSAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobWVudVNldFN0eWxlKSk7CgogICAgICAgICAgICAgICAgZG9tSGVhZC5hcHBlbmRDaGlsZChkb21TdHlsZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG1lbnVTZXQoKXsKCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBzZXRMaXN0SnNvbj0gWwogICAgICAgICAgICAgICAgICAgIHsnbGlzdE5hbWUnOmxhbmcuaWNvblBvc2l0aW9uLCdzZXRMaXN0SUQnOidpY29uUG9zaXRpb25TZXRQYWdlJywnc2V0UGFnZUlEJzonbW92aWVJY29uU2V0UGFnZScsJ3Rha2VQbGFjZSc6JzBweCd9LAogICAgICAgICAgICAgICAgICAgIHsnbGlzdE5hbWUnOmxhbmcucGxheVZpZGVvLCdzZXRMaXN0SUQnOidtb3ZpZUxpc3QnLCdzZXRQYWdlSUQnOidtb3ZpZVZpZGVvU2V0UGFnZScsJ3Rha2VQbGFjZSc6JzBweCd9LAogICAgICAgICAgICAgICAgXTsKCiAgICAgICAgICAgICAgICB2YXIgemhpaHVPcHRpb25Kc29uID0gWwogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aFZpZGVvQ2xvc2UsJ29wdGlvbklEJzoncmVtb3ZlVmlkZW8nLCdkZWZhdWx0JzonMCd9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aFZpZGVvRG93bmxvYWQsJ29wdGlvbklEJzonZG93bmxvYWRWaWRlbycsJ2RlZmF1bHQnOicyMid9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aEFEQ2xvc2UsJ29wdGlvbklEJzoncmVtb3ZlQUQnLCdkZWZhdWx0JzonMjInfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuemhDbG9zZUxlZnQsJ29wdGlvbklEJzoncmVtb3ZlUmlnaHQnLCdkZWZhdWx0JzonMCd9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aENoYW5nZUxpbmssJ29wdGlvbklEJzonY2hhbmdlTGluaycsJ2RlZmF1bHQnOicyMid9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy5zcGVjaWFsQ29sdW1uLCdvcHRpb25JRCc6J3NwZWNpYWxDb2x1bW4nLCdkZWZhdWx0JzoyMn0sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnZpZGVvVGl0bGUsJ29wdGlvbklEJzondmlkZW9UaXRsZScsJ2RlZmF1bHQnOjIyfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuemhLZXl3b3JkQ2xvc2UsJ29wdGlvbklEJzoncmVtb3ZlS2V5d29yZCcsJ2RlZmF1bHQnOicwJ30sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLmF1dGhvck5hbWVDbG9zZSwnb3B0aW9uSUQnOidyZW1vdmVBdXRob3JOYW1lJywnZGVmYXVsdCc6MjJ9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy55YW54dWFuQ2xvc2UsJ29wdGlvbklEJzoncmVtb3ZlWWFueHVhbicsJ2RlZmF1bHQnOicwJ30KICAgICAgICAgICAgICAgIF07CgogICAgICAgICAgICAgICAgdmFyIHBsYXlWaWRlb09wdGlvbkpzb24gPXsKICAgICAgICAgICAgICAgICAgICAnb3B0aW9uTmFtZSc6bGFuZy5wbGF5VmlkZW9MaW5lQWRkLAogICAgICAgICAgICAgICAgICAgICdvcHRpb25JRCc6J3ZpZGVvUGxheUxpbmVBZGQnLAogICAgICAgICAgICAgICAgICAgICdkZWZhdWx0Jzp2aWRlb1BsYXlMaW5lQWRkLAogICAgICAgICAgICAgICAgICAgICd0ZXh0YXJlYSc6J3ZpZGVvUGxheUxpbmVBZGRUZXh0YXJlYScsCiAgICAgICAgICAgICAgICAgICAgJ3RleHRhcmVhSWQnOidwbGF5VmlkZW9MaW5lVGV4dGFyZWEnLAogICAgICAgICAgICAgICAgICAgICd0aXAnOgpg57qv5YeAMSxodHRwczovL2ltMTkwNy50b3AvP2p4PQpC56uZMSxodHRwczovL2p4Lmpzb25wbGF5ZXIuY29tL3BsYXllci8/dXJsPQpZVCxodHRwczovL2p4Lnlhbmd0dS50b3AvP3VybD0KQkwsaHR0cHM6Ly92aXAuYmxqaWV4LmNvbS8/dj0K5Yaw6LGGLGh0dHBzOi8vYmQuanguY24vP3VybD0KQ0ssaHR0cHM6Ly93d3cuY2twbGF5ZXIudmlwL2ppZXhpLz91cmw9CuW8ueW5lSxodHRwczovL2RtangubTN1OC50di8/dXJsPQpJSzksaHR0cHM6Ly95cGFyc2UuaWs5LmNjL2luZGV4LnBocD91cmw9CkpZLGh0dHBzOi8vangucGxheWVyankuY29tLz91cmw9Cuino+aekGxhLGh0dHBzOi8vYXBpLmppZXhpLmxhLz91cmw9Ck0zVTgsaHR0cHM6Ly9qeC5tM3U4LnR2L2ppZXhpLz91cmw9ClBNLGh0dHBzOi8vd3d3LnBsYXltM3U4LmNuL2ppZXhpLnBocD91cmw9CuebmOWPpCxodHRwczovL3d3dy5wYW5ndWppZXhpLmNjL2ppZXhpLnBocD91cmw9CuebmOWPpDIsaHR0cHM6Ly93d3cucGFuZ3VqaWV4aS5jb20vamlleGkvP3VybD0K5YmW5LqRLGh0dHBzOi8vd3d3LnBvdXl1bi5jb20vP3VybD0K5LiD5ZOlLGh0dHBzOi8vangubm54di5jbi90di5waHA/dXJsPQrnpZ7lk6UsaHR0cHM6Ly9qc29uLm92dm8ucHJvL2p4LnBocD91cmw9CuWQrOS5kCxodHRwczovL2p4LmRqNnUuY29tLz91cmw9Cue7tOWkmixodHRwczovL2p4Lml2aXRvLmNuLz91cmw9CuiZvuexsyxodHRwczovL2p4LnhtZmx2LmNvbS8/dXJsPQromb7nsbMyLGh0dHBzOi8vangueG1mbHYuY2MvP3VybD0K5aSc5bmVLGh0dHBzOi8vd3d3LnllbXUueHl6Lz91cmw9CuS6keaekCxodHRwczovL2p4LnlwYXJzZS5jb20vaW5kZXgucGhwP3VybD0KMTfkupEsaHR0cHM6Ly93d3cuMTcxN3l1bi5jb20vangvdHkucGhwP3VybD0KMTgwLGh0dHBzOi8vanguMDAwMTgwLnRvcC9qeC8/dXJsPQoyeXMsaHR0cHM6Ly9nai5mZW54aWFuZ2IuY29tL3BsYXllci9hbmFseXNpcy5waHA/dj0KODA5MCxodHRwczovL3d3dy44MDkwZy5jbi8/dXJsPWAsCgogICAgICAgICAgICAgICAgICAgICAndmFsdWVOYW1lJzoncGxheVZpZGVvTGluZVRleHQnfQoKICAgICAgICAgICAgICAgIHZhciBzZXRIdG1sID0gIjxkaXYgaWQ9J3NldE1hc2snIGNsYXNzPSd6aG1NYXNrJz48L2Rpdj4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nd3JhcC1ib3gnIGlkPSdzZXRXcmFwJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0naWNvblNldFBhZ2UnIGlkPSdtb3ZpZUljb25TZXRQYWdlJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0VWxIZWFkJz48bGkgY2xhc3M9J2ljb25TZXRQYWdlSGVhZCc+PHNwYW4gY2xhc3M9J3pobV9iYWNrJz48L3NwYW4+PHNwYW4+IitsYW5nLmljb25Qb3NpdGlvbisiPC9zcGFuPjxzcGFuIGNsYXNzPSdpY29uU2V0U2F2ZSc+w5c8L3NwYW4+PC9saT48L3VsPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J2ljb25TZXRQYWdlTGknPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8bGk+IitsYW5nLmljb25IZWlnaHQrIu+8mjxzcGFuIGNsYXNzPSd0ZXh0LWlucHV0Jz48aW5wdXQgY2xhc3M9J3RleHQtaW5wdXRfX2JvZHknIGlkPSdpY29uVG9wJyB2YWx1ZT0nIitpY29uVmlwVG9wKyInIHBsYWNlaG9sZGVyPSciK2xhbmcudGlwSWNvbkhlaWdodCsiJz48c3BhbiBjbGFzcz0ndGV4dC1pbnB1dF9fdmFsaWRhdG9yJz48L3NwYW4+PC9zcGFuPjwvbGk+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8bGkgIHN0eWxlPSdkaXNwbGF5OiBpbmxpbmUtZmxleDsnPjxzcGFuIHN0eWxlPSdwYWRkaW5nLXRvcDo0cHg7Jz4iK2xhbmcuaWNvbkxpbmUrIu+8mjwvc3Bhbj48ZGl2IGNsYXNzPSdzZWxlY3QtYm94Jz48c2VsZWN0IGNsYXNzPSdzZWxlY3QtYm94X19ib2R5JyBpZD0naWNvblBvc2l0aW9uJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPG9wdGlvbiB2YWx1ZT0nbGVmdCcgIitzZWxlY3RlZExlZnQrIj4iK2xhbmcuaWNvbkxlZnQrIjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3JpZ2h0JyAiK3NlbGVjdGVkUmlnaHQrIj4iK2xhbmcuaWNvblJpZ2h0KyI8L29wdGlvbj4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9zZWxlY3Q+PC9kaXY+PC9saT4iCgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8bGk+IitsYW5nLmljb25XaWR0aCsi77yaPHNwYW4gY2xhc3M9J3RleHQtaW5wdXQnPjxpbnB1dCBjbGFzcz0ndGV4dC1pbnB1dF9fYm9keScgaWQ9J2ljb25XaWR0aCcgdmFsdWU9JyIraWNvblZpcFdpZHRoKyInIHBsYWNlaG9sZGVyPSciK2xhbmcudGlwSWNvbldpZHRoKyInPjxzcGFuIGNsYXNzPSd0ZXh0LWlucHV0X192YWxpZGF0b3InPjwvc3Bhbj48L3NwYW4+PC9saT4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjxsaSAgc3R5bGU9J2Rpc3BsYXk6IGlubGluZS1mbGV4Oyc+PHNwYW4gc3R5bGU9J3BhZGRpbmctdG9wOjRweDsnPiIrbGFuZy5pY29uV2FpdFRpbWUrIu+8mjwvc3Bhbj48ZGl2IGNsYXNzPSdzZWxlY3QtYm94Jz48c2VsZWN0IGNsYXNzPSdzZWxlY3QtYm94X19ib2R5JyBpZD0naWNvbldhaXRUaW1lJz4iOwoKICAgICAgICAgICAgICAgIGZvcihsZXQgaSA9MTtpPD04O2krKyl7CgogICAgICAgICAgICAgICAgICAgIGxldCBpY29uU2VsZWN0ZWQgPSBHTV9nZXRWYWx1ZSgnaWNvbldhaXRUaW1lJyk9PWkvMj8nc2VsZWN0ZWQnOicnOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxvcHRpb24gdmFsdWU9IitpLzIrIiAiK2ljb25TZWxlY3RlZCsiPiIraS8yKyLnp5I8L29wdGlvbj4iOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijwvc2VsZWN0PjwvZGl2PjwvbGk+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT7pgI8g5piOIOW6piDvvJo8c3BhbiBjbGFzcz0ndGV4dC1pbnB1dCc+PGlucHV0IGNsYXNzPSd0ZXh0LWlucHV0X19ib2R5JyBpZD0naWNvbk9wYWNpdHknIHZhbHVlPSciK2ljb25WaXBPcGFjaXR5KyInIHBsYWNlaG9sZGVyPSciK2xhbmcudGlwSWNvbk9wYWNpdHkrIic+PC9zcGFuPjwvbGk+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvdWw+PC9kaXY+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3pobV9zZXRfcGFnZScgaWQ9J21vdmllVmlkZW9TZXRQYWdlJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0VWxIZWFkJz48bGkgY2xhc3M9J3pobV9zZXRfcGFnZV9oZWFkZXInPjxzcGFuIGNsYXNzPSd6aG1fYmFjayc+PC9zcGFuPjxzcGFuPiIrbGFuZy5zZXRQbGF5VmlkZW8rIjwvc3Bhbj48c3BhbiAgY2xhc3M9J2ljb25TZXRTYXZlJz7DlzwvbGk+PC91bD4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSd6aG1fc2V0X3BhZ2VfbGlzdCcgc3R5bGU9J292ZXJmbG93LXk6dW5zZXQnPiI7CgogICAgICAgICAgICAgICAgbGV0IGJhY2tDb2xvcixzd2l0Y2hCYWNrQ29ybG9yLGRpc3BsYXk7CgogICAgICAgICAgICAgICAgbGV0IG9wdGlvblZhbHVlID0gR01fZ2V0VmFsdWUocGxheVZpZGVvT3B0aW9uSnNvbi5vcHRpb25JRCxwbGF5VmlkZW9PcHRpb25Kc29uLmRlZmF1bHQpOwoKICAgICAgICAgICAgICAgIGlmKG9wdGlvblZhbHVlICE9ICcyMicpewoKICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZmZic7CgogICAgICAgICAgICAgICAgICAgIHN3aXRjaEJhY2tDb3Jsb3IgPSAnI0ZGRic7CgogICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgIGJhY2tDb2xvciA9ICcjZmU2ZDczJzsKCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZFNUU1JzsKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8bGk+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3pobV9zZXRfcGFnZV9jb250ZW50Jz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjxzcGFuIGNsYXNzPSdwbGF5VmlkZW9PcHRpb25OYW1lJz4iK3BsYXlWaWRlb09wdGlvbkpzb24ub3B0aW9uTmFtZSsiPC9zcGFuPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd6aG1fY2lyY3VsYXInIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiIrc3dpdGNoQmFja0NvcmxvcisiJyBpZD0nIitwbGF5VmlkZW9PcHRpb25Kc29uLm9wdGlvbklEKyInPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdyb3VuZC1idXR0b24nIHN0eWxlPSdiYWNrZ3JvdW5kOiAiK2JhY2tDb2xvcisiOyBsZWZ0OiAiK29wdGlvblZhbHVlKyJweDsnPjwvZGl2PiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSAiPC9kaXY+PC9kaXY+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sKz0iPC9saT48bGk+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXY+6Kej5p6Q57q/6LevPC9kaXY+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J2Zvcm1fX3RleHRhcmVhJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0ndGV4dGFyZWEganMtZmxleGlibGUtdGV4dGFyZWEnIHN0eWxlPSdwYWRkaW5nOiA1cHggMHB4OycgaWQ9JyIrcGxheVZpZGVvT3B0aW9uSnNvbi50ZXh0YXJlYSsiJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHRleHRhcmVhIHJvd3M9JzknIGNsYXNzPSd0ZXh0YXJlYV9fYm9keSB6aG1fc2Nyb2xsJyBwbGFjZWhvbGRlcj0nIitsYW5nLnRpcFBsYXlWaWRlb0xpbmVBZGQrIicgc3R5bGU9J3dpZHRoOjI1MHB4O2ZvbnQtc2l6ZToxMnB4O3BhZGRpbmc6NHB4O3Jlc2l6ZTpub25lOycgaWQ9JyIrcGxheVZpZGVvT3B0aW9uSnNvbi50ZXh0YXJlYUlkKyInPiIrR01fZ2V0VmFsdWUocGxheVZpZGVvT3B0aW9uSnNvbi52YWx1ZU5hbWUscGxheVZpZGVvT3B0aW9uSnNvbi50aXApKyI8L3RleHRhcmVhPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L2Rpdj48L2Rpdj48L2xpPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3VsPiIKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvZGl2PiIKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0naWNvblNldFVsSGVhZCc+PGxpIGNsYXNzPSdpY29uU2V0UGFnZUhlYWQnPjxzcGFuPjwvc3Bhbj48c3Bhbj4iK2xhbmcuc2V0KyI8L3NwYW4+PHNwYW4gY2xhc3M9J2ljb25TZXRTYXZlJz7Dlzwvc3Bhbj48L2xpPjwvdWw+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0nc2V0V3JhcExpJz4iOwoKICAgICAgICAgICAgICAgIGZvcih2YXIgc2V0Tj0wO3NldE48c2V0TGlzdEpzb24ubGVuZ3RoO3NldE4rKyl7CgogICAgICAgICAgICAgICAgICAgIHZhciBsaXN0VmFsdWUgPSBHTV9nZXRWYWx1ZShzZXRMaXN0SnNvbltzZXROXS5zZXRMaXN0SUQsJzIyJyk7CgogICAgICAgICAgICAgICAgICAgIGxldCBiYWNrQ29sb3IsYXJyb3dDb2xvcixzd2l0Y2hCYWNrQ29ybG9yOwoKICAgICAgICAgICAgICAgICAgICBpZihsaXN0VmFsdWUgIT0gMjIpewogICAgICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZmZic7CiAgICAgICAgICAgICAgICAgICAgICAgIGFycm93Q29sb3I9ICcjRUVFJzsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZGJzsKCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tDb2xvciA9ICcjZmU2ZDczJzsKICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3dDb2xvciA9ICcjQ0NDJzsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZFNUU1JzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmKHNldExpc3RKc29uW3NldE5dLnNldFBhZ2VJRCA9PSAnJyl7CiAgICAgICAgICAgICAgICAgICAgICAgIGFycm93Q29sb3IgPSAnI0VFRSc7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT48c3Bhbj4iK3NldExpc3RKc29uW3NldE5dLmxpc3ROYW1lKyI8L3NwYW4+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdzZXRXcmFwTGlDb250ZW50Jz4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3pobV9jaXJjdWxhcicgaWQ9JyIrc2V0TGlzdEpzb25bc2V0Tl0uc2V0TGlzdElEKyInIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiAiK3N3aXRjaEJhY2tDb3Jsb3IrIjsnPjxkaXYgY2xhc3M9J3JvdW5kLWJ1dHRvbicgc3R5bGU9J2JhY2tncm91bmQ6ICIrYmFja0NvbG9yKyI7bGVmdDogIitsaXN0VmFsdWUrInB4Jz48L2Rpdj48L2Rpdj4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxzcGFuIGNsYXNzPSd0by1yaWdodCcgZGF0YT0nIitzZXRMaXN0SnNvbltzZXROXS5zZXRQYWdlSUQrIicgdGFrZVBsYWNlPSciK3NldExpc3RKc29uW3NldE5dLnRha2VQbGFjZSsiJyBzdHlsZT0nYm9yZGVyOiBzb2xpZCAiK2Fycm93Q29sb3IrIjsgYm9yZGVyLXdpZHRoOiAwIDNweCAzcHggMDsnPjwvc3Bhbj48L2Rpdj48L2xpPiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3VsPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IHN0eWxlPSdoZWlnaHQ6NDBweDsnIGlkPSd6aG1UYWtlUGxhY2UnPjwvZGl2PiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdpY29uU2V0Rm9vdCcgc3R5bGU9Jyc+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0naWNvblNldEZvb3RMaSc+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT48YSBocmVmPSdodHRwczovL2dpdGxhYi5jb20vbGFuaGFoYS9sYW5yZW5qaWFvYmVuJyB0YXJnZXQ9J19ibGFuayc+IitsYW5nLnNjcmlwdHNpbnN0YWxsKyI8L2E+PC9saT7jg7s8bGk+PGEgaHJlZj0naHR0cHM6Ly9naXRsYWIuY29tL2xhbmhhaGEvbGFucmVuamlhb2JlbiMlRTQlQkQlQkYlRTclOTQlQTgnIHRhcmdldD0nX2JsYW5rJz4iK2xhbmcuc2NyaXB0c3VzZSsiPC9hPjwvbGk+44O7PGxpPjxhIGhyZWY9J2h0dHBzOi8vZ2l0bGFiLmNvbS9sYW5oYWhhL2xhbnJlbmppYW9iZW4jJUU1JUI4JUI4JUU4JUE3JTgxJUU5JTk3JUFFJUU5JUEyJTk4JyB0YXJnZXQ9J19ibGFuayc+IitsYW5nLnF1ZXN0aW9uKyI8L2E+PC9saT7jg7s8bGk+PGEgaHJlZj0naHR0cHM6Ly90Lm1lLytzR282Wlp2eTU0d3pZVGxsJyB0YXJnZXQ9J19ibGFuayc+IitsYW5nLnRnZ3JvdXArIjwvYT48L2xpPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSc8L3VsPic7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSc8L2Rpdj4nOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjwvZGl2PiI7CgogICAgICAgICAgICAgICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NldE1hc2snKSkgcmV0dXJuOwoKICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRWxlbWVudCgnZGl2JywnemhtTWVudScpOwoKICAgICAgICAgICAgICAgIGxldCB6aG1NZW51ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pobU1lbnUnKTsKCiAgICAgICAgICAgICAgICB6aG1NZW51LmlubmVySFRNTCA9IHNldEh0bWw7CgogICAgICAgICAgICAgICAgbGV0IHRpbWVyWmhtSWNvbiA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtTWVudScpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXJaaG1JY29uKTsgLy8g5Y+W5raI5a6a5pe25ZmoCgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2lyY3VsYXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuemhtX2NpcmN1bGFyJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBjaXJjdWxhci5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihfZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBidXR0b25TdHlsZSA9IGl0ZW0uY2hpbGRyZW5bMF0uc3R5bGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ID0gYnV0dG9uU3R5bGUubGVmdDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHBhcnNlSW50KGxlZnQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdExlZnRWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVmdD09MCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25TdHlsZS5sZWZ0ID0gJzIycHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uU3R5bGUuYmFja2dyb3VuZCA9ICcjZmU2ZDczJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUuYmFja2dyb3VuZD0nI2ZmRTVFNSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLm5leHRTaWJsaW5nICYmIGl0ZW0ubmV4dFNpYmxpbmcuZ2V0QXR0cmlidXRlKCdkYXRhJykpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubmV4dFNpYmxpbmcuc2V0QXR0cmlidXRlKCdzdHlsZScsJ2JvcmRlcjogc29saWQgI2NjYztib3JkZXItd2lkdGg6IDAgM3B4IDNweCAwOycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RMZWZ0VmFsdWUgPSAyMjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25TdHlsZS5sZWZ0ID0gJzBweCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25TdHlsZS5iYWNrZ3JvdW5kID0gJyNmZmYnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kPScjZmZmJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0ubmV4dFNpYmxpbmcpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubmV4dFNpYmxpbmcuc2V0QXR0cmlidXRlKCdzdHlsZScsJ2JvcmRlcjogc29saWQgI0VFRTtib3JkZXItd2lkdGg6IDAgM3B4IDNweCAwOycpCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0TGVmdFZhbHVlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXRMaXN0SUQgPSBpdGVtLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZShzZXRMaXN0SUQsbGlzdExlZnRWYWx1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvUmlnaHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudG8tcmlnaHQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHRvUmlnaHQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ID0gaXRlbS5wcmV2aW91c1NpYmxpbmcuY2hpbGRyZW5bMF0uc3R5bGUubGVmdDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHBhcnNlSW50KGxlZnQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsZWZ0ICE9IDIyKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXRQYWdlSUQgPSBpdGVtLmdldEF0dHJpYnV0ZSgnZGF0YScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZUlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2V0UGFnZUlEKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUlkLmNsYXNzTmFtZT0naWNvblNldFBhZ2UgdG9MZWZ0TW92ZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a6e5pe25Zu+5qCH6auY5bqmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0UGFnZUlEID09ICdtb3ZpZUljb25TZXRQYWdlJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaWNvblRvcCcpLnZhbHVlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiN6aG1sb2dvIikub2Zmc2V0VG9wOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobVRha2VQbGFjZScpLnN0eWxlPSJoZWlnaHQ6MjAwcHgiOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZXRQYWdlSUQgPT0gJ21vdmllVmlkZW9TZXRQYWdlJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtVGFrZVBsYWNlJykuc3R5bGU9ImhlaWdodDoyMDBweCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhzZXRQYWdlSUQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvQmFjayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy56aG1fYmFjaycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdG9CYWNrLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50RG9tID0gaXRlbS5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RG9tLmNsYXNzTmFtZT0naWNvblNldFBhZ2UgdG9SaWdodE1vdmUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtVGFrZVBsYWNlJykuc3R5bGU9J2hlaWdodDo0MHB4OycKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXRTYXZlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmljb25TZXRTYXZlJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBzZXRTYXZlLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9PnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25Ub3AgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvblRvcCcpLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvbk9wYWNpdHk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ljb25PcGFjaXR5JykudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uUG9zaXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvblBvc2l0aW9uJykudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uV2lkdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvbldpZHRoJykudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uV2FpdFRpbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvbldhaXRUaW1lJykudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5VmlkZW9MaW5lVGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwbGF5VmlkZW9MaW5lVGV4dGFyZWEnKS52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlWaWRlb0xpbmVMZWZ0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZGVvUGxheUxpbmVBZGQnKS5jaGlsZHJlblswXS5zdHlsZS5sZWZ0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpY29uVG9wICE9ICcnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoLyheWzAtOV1bMC05XXswLDJ9JCkvLnRlc3QoaWNvblRvcCkpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydChsYW5nLnRpcEVycm9ySWNvbkhlaWdodCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL190aGlzLnNldENvb2tpZSgnaWNvblRvcCcsaWNvblRvcCwzMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaWNvblRvcCcsaWNvblRvcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpY29uT3BhY2l0eSAhPSAnJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKC9eKD86MHxbMS05XVswLTldP3wxMDApJC8udGVzdChpY29uT3BhY2l0eSkpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydChsYW5nLnRpcEVycm9ySWNvbk9wYWNpdHkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9fdGhpcy5zZXRDb29raWUoJ2ljb25Ub3AnLGljb25Ub3AsMzApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KGljb25PcGFjaXR5KTtyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uT3BhY2l0eScsaWNvbk9wYWNpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaWNvblBvc2l0aW9uICE9ICcnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vX3RoaXMuc2V0Q29va2llKCdpY29uUG9zaXRpb24nLGljb25Qb3NpdGlvbiwzMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaWNvblBvc2l0aW9uJyxpY29uUG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaWNvbldhaXRUaW1lICE9ICcnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uV2FpdFRpbWUnLGljb25XYWl0VGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpY29uV2lkdGggIT0nJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKC8oXihbMS05XVswLTldPykkKS8udGVzdChpY29uV2lkdGgpKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQobGFuZy50aXBFcnJvckljb25XaWR0aCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL190aGlzLnNldENvb2tpZSgnaWNvbldpZHRoJyxpY29uV2lkdGgsMzApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2ljb25XaWR0aCcsaWNvbldpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEdNX2dldFZhbHVlKCd2aWRlb1BsYXlMaW5lQWRkJykgPT0gMjIpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxheVZpZGVvTGluZVRleHQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lT2JqID0gX3RoaXMuZ2V0TGluZShwbGF5VmlkZW9MaW5lVGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGluZU9iai5sZW5ndGg+MCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdwbGF5VmlkZW9MaW5lVGV4dCcscGxheVZpZGVvTGluZVRleHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KCfnur/ot6/ovpPlhaXkuI3mraPnoa4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgncGxheVZpZGVvTGluZVRleHQnLCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdwbGF5VmlkZW9MaW5lVGV4dCcscGxheVZpZGVvTGluZVRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeS5nbygwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvblRvcCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvblRvcCA9IHRoaXMudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISgvKF5bMS05XVxkKiQpLy50ZXN0KGljb25Ub3ApKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWlzLXZhbGlkJywnZmFsc2UnKQoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtaXMtdmFsaWQnLCd0cnVlJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ljb25XaWR0aCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvbldpZHRoID0gdGhpcy52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKC8oXlsxLTldXGQqJCkvLnRlc3QoaWNvbldpZHRoKSkpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1pcy12YWxpZCcsJ2ZhbHNlJykKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWlzLXZhbGlkJywndHJ1ZScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgLy/ohb7orq/op4bpopHlv6vmjbfplK7lhrLnqoEKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY291cG9uVXJsLm1hdGNoKC92XC5xcVwuY29tXC94XC9jb3Zlci8pKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRkTGluZVRleHQgPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwbGF5VmlkZW9MaW5lVGV4dGFyZWEnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaW5lVGV4dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0UG9zID0gYWRkTGluZVRleHQuc2VsZWN0aW9uU3RhcnQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmRQb3MgPSBhZGRMaW5lVGV4dC5zZWxlY3Rpb25FbmQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFBvcyA9PT0gdW5kZWZpbmVkIHx8IGVuZFBvcyA9PT0gdW5kZWZpbmVkKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUNvZGUuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGUua2V5Q29kZSA9PSBpdGVtLmNvZGUgJiYgZS5zaGlmdEtleT09aXRlbS5pc1NoaWZ0KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dFZhbHVlID0gYWRkTGluZVRleHQudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0VmFsdWUgPSB0ZXh0VmFsdWUuc3Vic3RyaW5nKDAsc3RhcnRQb3MpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmRWYWx1ZSA9IHRleHRWYWx1ZS5zdWJzdHJpbmcoc3RhcnRQb3MpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGxWYWx1ZSA9IHN0YXJ0VmFsdWUraXRlbS52YWx1ZStlbmRWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaW5lVGV4dC52YWx1ZT1hbGxWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaW5lVGV4dC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0UG9zKzE7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluZVRleHQuc2VsZWN0aW9uRW5kID0gZW5kUG9zKzE7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgY3JlYXRlRWxlbWVudChkb20sZG9tSWQpewoKICAgICAgICAgICAgICAgIHZhciByb290RWxlbWVudCA9IGRvY3VtZW50LmJvZHk7CgogICAgICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGRvbSk7CgogICAgICAgICAgICAgICAgbmV3RWxlbWVudC5pZCA9IGRvbUlkOwoKICAgICAgICAgICAgICAgIHZhciBuZXdFbGVtZW50SHRtbENvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7CgogICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7CgogICAgICAgICAgICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50SHRtbENvbnRlbnQpOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmVxdWVzdChtZXRob2QsdXJsLGRhdGEsaXNDb29raWU9JycpewoKICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PnsKCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcXVlc3QucmVhZHlTdGF0ZT09NCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVxdWVzdC5zdGF0dXM9PTIwMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVxdWVzdC5yZXNwb25zZVRleHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVxdWVzdC5zdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5vcGVuKG1ldGhvZCx1cmwpOwogICAgICAgICAgICAgICAgICAgIC8vcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGlmKGlzQ29va2llKXsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTsKICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNlbmQoZGF0YSk7CgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNldENvb2tpZShjbmFtZSxjdmFsdWUsZXhkYXlzKXsKCiAgICAgICAgICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKCk7CgogICAgICAgICAgICAgICAgZC5zZXRUaW1lKGQuZ2V0VGltZSgpKyhleGRheXMqMjQqNjAqNjAqMTAwMCkpOwoKICAgICAgICAgICAgICAgIHZhciBleHBpcmVzID0gImV4cGlyZXM9IitkLnRvR01UU3RyaW5nKCk7CgogICAgICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gY25hbWUrIj0iK2N2YWx1ZSsiOyAiK2V4cGlyZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGdldENvb2tpZShjbmFtZSl7CiAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGNuYW1lICsgIj0iOwogICAgICAgICAgICAgICAgdmFyIGNhID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgICAgICBmb3IodmFyIGk9MDsgaTxjYS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBjID0gY2FbaV0udHJpbSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjLmluZGV4T2YobmFtZSk9PTApIHsgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWUubGVuZ3RoLGMubGVuZ3RoKTsgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBnZXRRdWVyeVN0cmluZyhlKSB7CiAgICAgICAgICAgICAgICB2YXIgdCA9IG5ldyBSZWdFeHAoIihefCYpIiArIGUgKyAiPShbXiZdKikoJnwkKSIpOwogICAgICAgICAgICAgICAgdmFyIGEgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cigxKS5tYXRjaCh0KTsKICAgICAgICAgICAgICAgIGlmIChhICE9IG51bGwpIHJldHVybiBhWzJdOwogICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBnZXRVcmxQYXJhbXModXJsKXsKICAgICAgICAgICAgICAgIGxldCByZWcgPSAvKFtePyYrI10rKT0oW14/JisjXSspL2c7CiAgICAgICAgICAgICAgICBsZXQgb2JqPXt9OwogICAgICAgICAgICAgICAgdXJsLnJlcGxhY2UocmVnLChyZXMsJDEsJDIpPT57b2JqWyQxXT0kMn0pOwogICAgICAgICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZ2V0TGluZSh0ZXh0KXsKCiAgICAgICAgICAgICAgICBsZXQgdGV4dEFyciA9IHRleHQuc3BsaXQoJ1xuJyk7CgogICAgICAgICAgICAgICAgaWYodGV4dEFyci5sZW5ndGggPiAwKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVPYmogPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gL14oLispKGh0dHBzPzpcL1wvLispJC87CgogICAgICAgICAgICAgICAgICAgIHRleHRBcnIuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBpdGVtLnJlcGxhY2UoL1xzKiwqL2csJycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWl0ZW0pIHJldHVybiB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVNYXRjaCA9IGl0ZW0ubWF0Y2gobWF0Y2gpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYobGluZU1hdGNoKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lT2JqLnB1c2goeyduYW1lJzpsaW5lTWF0Y2hbMV0uc3Vic3RyaW5nKDAsNCksJ3VybCc6bGluZU1hdGNoWzJdfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lT2JqPVtdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lT2JqOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvL2FsbOWPguaVsOm7mOiupOepuu+8jOaYr+ecn+aXtui/lOWbnuS4uuaVsOe7hAogICAgICAgICAgICBzdGF0aWMgZ2V0RWxlbWVudChjc3MsYWxsPScnKXsKCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+ewoKICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gMDsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIG51bSsrCgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9tOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWxsID09IGZhbHNlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNzcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZG9tKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGNzcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9tLmxlbmd0aD4wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZG9tKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG51bT09MjApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDMwMCkKCiAgICAgICAgICAgICAgICAgICAgfSkKCgogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0aWMgdG9hc3QobXNnLGR1cmF0aW9uKXsKCiAgICAgICAgICAgICAgICBkdXJhdGlvbj1pc05hTihkdXJhdGlvbik/MzAwMDpkdXJhdGlvbjsKCiAgICAgICAgICAgICAgICBsZXQgdG9hc3REb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKCiAgICAgICAgICAgICAgICB0b2FzdERvbS5pbm5lckhUTUwgPSBtc2c7CgogICAgICAgICAgICAgICAgLy90b2FzdERvbS5zdHlsZS5jc3NUZXh0PSJ3aWR0aDogNjAlO21pbi13aWR0aDogMTUwcHg7b3BhY2l0eTogMC43O2hlaWdodDogMzBweDtjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO2xpbmUtaGVpZ2h0OiAzMHB4O3RleHQtYWxpZ246IGNlbnRlcjtib3JkZXItcmFkaXVzOiA1cHg7cG9zaXRpb246IGZpeGVkO3RvcDogNDAlO2xlZnQ6IDIwJTt6LWluZGV4OiA5OTk5OTk7YmFja2dyb3VuZDogcmdiKDAsIDAsIDApO2ZvbnQtc2l6ZTogMTJweDsiOwogICAgICAgICAgICAgICAgdG9hc3REb20uc3R5bGUuY3NzVGV4dD0ncGFkZGluZzoycHggMTVweDttaW4taGVpZ2h0OiAzNnB4O2xpbmUtaGVpZ2h0OiAzNnB4O3RleHQtYWxpZ246IGNlbnRlcjt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlKTtib3JkZXItcmFkaXVzOiA0cHg7Y29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtwb3NpdGlvbjogZml4ZWQ7dG9wOiA1MCU7bGVmdDogNTAlO3otaW5kZXg6IDk5OTk5OTk7YmFja2dyb3VuZDogcmdiKDAsIDAsIDApO2ZvbnQtc2l6ZTogMTZweDsnCgogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0b2FzdERvbSk7CgogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSAwLjU7CgogICAgICAgICAgICAgICAgICAgIHRvYXN0RG9tLnN0eWxlLndlYmtpdFRyYW5zaXRpb24gPSAnLXdlYmtpdC10cmFuc2Zvcm0gJyArIGQgKyAncyBlYXNlLWluLCBvcGFjaXR5ICcgKyBkICsgJ3MgZWFzZS1pbic7CgogICAgICAgICAgICAgICAgICAgIHRvYXN0RG9tLnN0eWxlLm9wYWNpdHkgPSAnMCc7CgogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodG9hc3REb20pIH0sIGQgKiAxMDAwKTsKCiAgICAgICAgICAgICAgICB9LCBkdXJhdGlvbik7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vY3JlYXRlIHpobUxvZ29JY29uCiAgICAgICAgICAgIHpobUxvZ28oKXsKCiAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICBsZXQgc29ydERpdiA9IGljb25WaXBQb3NpdGlvbj09J2xlZnQnPydyb3cnOidyb3ctcmV2ZXJzZSc7CgogICAgICAgICAgICAgICBsZXQgcGxheVZpZGVvU3R5bGUgPSBgCiAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRvZV9pY29uewogICAgICAgICAgICAgICAgICBwYWRkaW5nLXRvcDoycHg7CiAgICAgICAgICAgICAgICAgIGN1cnNvcjpwb2ludGVyOwogICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTsKICAgICAgICAgICAgICAgICAgcG9zaXRpb246Zml4ZWQ7JHtpY29uVmlwUG9zaXRpb259OjVweDt0b3A6JHtpY29uVmlwVG9wfXB4OwogICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjsKICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6dmlzaWJsZTsKICAgICAgICAgICAgICAgICAgZGlzcGxheTpmbGV4OwogICAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjoke3NvcnREaXZ9OwogICAgICAgICAgICAgICAgICB3aWR0aDphdXRvOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlb193cmFwewogICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTk7CiAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICAgICAgICAgIHdpZHRoOjMwMHB4OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC5pY29uTG9nb3sKICAgICAgICAgICAgICAgb3BhY2l0eToke2ljb25WaXBPcGFjaXR5LzEwMH07CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2xpbmV7CiAgICAgICAgICAgICAgICAgIHdpZHRoOjMyMHB4OwogICAgICAgICAgICAgICAgICBoZWlnaHQ6MzE2cHg7CiAgICAgICAgICAgICAgICAgIG92ZXJmbG93LXk6c2Nyb2xsOwogICAgICAgICAgICAgICAgICBvdmVyZmxvdy14OmhpZGRlbjsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZV9saW5lX3VsewogICAgICAgICAgICAgICAgICB3aWR0aDozMDBweDsKICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgICAgICAgICAgICBmbGV4LWZsb3c6IHJvdyB3cmFwOwogICAgICAgICAgICAgICAgICBsaXN0LXN0eWxlOiBub25lOwogICAgICAgICAgICAgICAgICBwYWRkaW5nOjBweDsKICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweDsKCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGl7CiAgICAgICAgICAgICAgICAgIHBhZGRpbmc6NHB4IDBweDsKICAgICAgICAgICAgICAgICAgbWFyZ2luOjJweDsKICAgICAgICAgICAgICAgICAgd2lkdGg6MzAlOwogICAgICAgICAgICAgICAgICBjb2xvcjojRkZGOwogICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjsKICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZjI0NDQzOwogICAgICAgICAgICAgICAgICBib3gtc2hhZG93OjBweCAwcHggMTBweCAjZmZmOwogICAgICAgICAgICAgICAgICBmb250LXNpemU6MTRweDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZV91bF9saTpob3ZlcnsKICAgICAgICAgICAgICAgICAgY29sb3I6IzI2MDAzMzsKICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZmNjMGMwCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLnpobV9saW5lX3NlbGVjdGVkewogICAgICAgICAgICAgICAgICBjb2xvcjojMjYwMDMzOwogICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmY2MwYzAKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2p4ewogICAgICAgICAgICAgICAgICB3aWR0aDoxMDAlOwogICAgICAgICAgICAgICAgICBoZWlnaHQ6MTAwJTsKICAgICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk7CiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGA7CgogICAgICAgICAgICAgICAgZG9tU3R5bGUgLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBsYXlWaWRlb1N0eWxlKSk7CgogICAgICAgICAgICAgICAgZG9tSGVhZC5hcHBlbmRDaGlsZChkb21TdHlsZSk7CgogICAgICAgICAgICAgICAgbGV0IHBsYXlXcmFwSHRtbCA9ICI8ZGl2IGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKScgdGFyZ2V0PSdfYmxhbmsnIHN0eWxlPScnIGNsYXNzPSdwbGF5QnV0dG9uIHpobV9wbGF5X3ZpZG9lX2ljb24nIGlkPSd6aG1sb2dvJz4iOwoKICAgICAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSAiPGltZyBjbGFzcz0naWNvbkxvZ28nIHN0eWxlPSd3aWR0aDoiK2ljb25WaXBXaWR0aCsicHg7aGVpZ2h0OiIraWNvblZpcFdpZHRoKjEuNSsicHgnIHNyYz0nZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoWkFDV0FQY0FBUEpFUS92Nytmbkx5UGpDd2ZSblpmblQwUEpLU2ZqR3hQdjI5UG5ZMS9OYld2djE4L2FVay9ybDQvcnc3dm5LeVBhSmlQcnI2ZmFhbVBSeWNmYUxpdnY1OS9KSlNQcnY3Zk5WVlBuZTNmcnQ2L05RVC92NitQZWxwUGFnbnZSM2R2aTZ1UHZ6OGZleHIvbk96UGVnbnZyazR2UjFjL0pHUmZycTZQblF6dmpDd1BuUzBQbloxL3Z3N3ZuYTJmZW9wL2VtcGZyYzJ2TlVVL2l4ci9SNGR2V0poL2VzcXZKSFJ2dng3L3J5OGZOU1VmTldWUGpCd1BWNmVmYU1pdm5mM2ZpOHV2V0RndnY0OXZycDZQcnk4UEpQVHZhWWwvblQwZm5XMVBlcnFmUnNhL1J2YnZXQWYvVjlmUG5rNHZpMnRmUmpZZlJoWC92dTdQTllWL0pGUlBuazRmYUhoZmFYbHZ2MzlmcmgzL2k3dXZuTnkvbk95L3JzNnZlcnF2UmdYdm5kMi9hR2hQV1JrUFYvZmZyaTRQcmo0UGl3cmZuTHlmYVVrdlJmWGZKTlRQakZ3L2V5c2ZSbFkvUnhjUHZ2N2ZlenN2aTBzdnYyOC9hYm12ZXFxUGVwcVBKTVMvZXlzUFdPamZOZFhQUnpjdnYwOHZSdWJmcm81dmVpb2ZlbG8vTlpXUG5aMlBOcGFQblUwdlJmWHZuSHhmaXVyUGpBdi9uUXpmcm41Zm5jMi9lMHN2YWRuUGU0dC9hU2tmTlhWdlJtWlBldHF2blkxdmk4dS9laW9QaXRxL2kvdmZSd2IvUjFkUG5lM1BhZW5mYWNtdmUzdHZuUnovcmo0ZmFYbGZWK2ZQV0ZoUEpMU3ZhTmkvV01qUFIwYy9hVmsvV1BqL2FkbS9ycDUvbkl4dlJvWnZSaVlmakR3dmFWbFBKT1RmZTJ0Zk5xYWZKUlVQZWtvdmFhbWZOYVdmVjhldm5kM1BuTnpQblYxUGVzcS9qRXcvVjZlUFIzZC9uZzN2cnc3ZmFXbFBlbnBmYWZuZldQanZpd3J2TldWZm5NeXZpNnVmVi9mdlY5ZS9uYjJ2cnU2L1JrWXZqQXZ2bkl4ZlJpWVBpOXZQZWduL1Y3ZWZlam9mZTF0UFdDZ2ZybTVQSklSL25jMnZOY1cvSlFUL2pGeFB2eThQV0RnZldCZi9Sc2JQVjVkL05wYWZOY1hQbmYzdmFJaHZSdmIvaXZyZm5YMXZOUlVmYUtpZlJ0YlBhWmwvTmVYUGU1dVBXQ2dQUnJhdmFJaC9Ob1ovbkp4L1dGZy9pOXUvUjJkZmpIeHZqSXh2TlRVdmkvdnZlMXMvTmVYUUFBQUFBQUFBQUFBQUFBQUNIL0MwNUZWRk5EUVZCRk1pNHdBd0VBQUFBaCtRUUVsZ0FBQUN3QUFBQUFaQUNXQUFBSS9nQUJDQnhJc0tEQmd3Z1RLbHpJc0tIRGh4QWpTcHhJc2FMRml4Z3phdHpJc2FQSGp5QkRpbHhJWUVTQUFDTUlqRnhwVUlXREFBNVVlRmpJNHVUSkJDeHpDc3hoazhpUWhUWnQ2c3lwd2FhR0RBc0hCT1V4bE9VTEpDV1F2S2l4Y0FPREFRTVliR2k2VWtHUEdqMFVHT0JLdHF6WnMyalRxbDNMdHFNQ0UwMU1pSzFLWXNRSUVsczdmbUZDYTlFV0Y0a1FoQ2lUUW9VSVRVelNmT3lRZ2tXS0RrR1NMdFdvQTlpdVpVRXphdzRnQlpxVklodFIyRVNCVTZGbWpEUU9DZG5NZWpNQ0xSTXlMckM1NEFMTm9LVXBqbkhSdW5mclR2VXVucG05NE1FZmtnTWNYQmlnY3VJbDNyNmpzejZqb0tJSkNSNGttTmd4RWtNajN5WG8vbWtDSmFpV0JUVmY5RmlaTTZsRWJ3U29UclE5eUVzSzZ3cXFTT1Z4S01OV2tqZXN1ZERjZkFCY1F3ZHJmVndoQTBVV2hJSElaa0wwUXFBYUsyem1pUTgzWkFURkVab1ZNaDhHeW1pR0FDVVdjRVRGRlFnRTlVQkVCbUNnQUFaak1VUUFDU1FNcUpBTVpXam1nbUlmZlpIQVNRdVVFaEVFSWp3aEFnUTJIbVJEVURZc3BBWjBRZDFSWWtnbmlNRkFGQkxGWUZNTVFDejBrazIySlhUQ2c1bWhRWllkVnBCangwSnkwQlptUWs0RVZZVkNkV1RHUVRwa0VWSlVBQzZBbHRBUE5tV2l3a0lRZkhrQkJBbjFZcWNWWmZrUnBVSSt4QUZFSEQ0bzBSQUJTUmFrQTRCQmpXSldCNW5GaHBBQlUwUXhSWXdZM1pHWkxtZmxzWnBOL21WTXVWSWJIQVNWaGF4bE1aTFpLVG1sRUJRSHNhUjFRb2cyOVNIZlNLVmtac1phNm1SR2dVWVRpR3BRQVVHOTRlZENPcGdVZ2hldmdMUkZVQzRjdEFRREhqQ3dCSGNLRlhxU0E0Z1N4RWVaRHVrVDFES09ITXVSSGtGcGNKQkxNTW0wVUp3MnpVa1FIRUYxZ2VwQ2Uyam1TekllTldOVE93ZnhkSkpQWGdiMUpnQVdoQkFVTUErMWxnSXpISjFReHhhYnJHblFuZ0VjdGRDU05pVkJrRGRCVlhBdFE3V3l4Z0VuaitUMFZGUlR5Y2dBQTBrU2JGTXJFRlhnMng2VW1DeVNWMkROUlZFV1FUSDZrTkhScFRJS0ZRUWFoRUZtR0JRZFZDRzV0QWFHR3hqOXNVQUZqSHlFVEZCbFJQVHFTUzhBRUVZZnJSVkNTRVZ1Qk1XSC9rZWJCQVdDMjBIVklaQW93bWk4V1FVaTRETlJuVGI1NGRGM05xVU5FUlpCMFVIUUk1elVyQmtPYytEYVVOODJIVVBRVzB6UTRIUkNCQ2dWQUhNRERSS1VPeEdsYUpQbEJjWERJV3NOaEFGUktFRU5RaEJqMkJ3QjJXMDI1UWExVFpaQ0pQdEpMaDlValRXdFNmS09RKy9hMUFCQm9wMUVHbENaRFJSQlVLekVIcFFYQ1Zrd2grR2JIVkxkUWxFRUpRVkJFZ2RBc1VLcW44U1VRTFBaVkV0RStaOUV2a0lZV0lUbU1vT0ZEbUF0SVlDSUdVSHVRUng3ekVRaFZzR0tWZ1pDdFpNc0NDSUpzd21yR0FJSlg3RW1FamY2RlVHdWs1M3RVQVFIUWNsR1JOQVhBQkE2QkJudTBVd0lGSktIb09EQUk5azdTUnRXR0JRWE5xUUovbVRZVEFRVVFvQ2dKTUlqaWdoS09YaG9rMG8wQkFwY2FNMnpFb0tKb0lEQkkydUlXa1NTYUJOYUxFUUdkNmhnWnNoQWc0V0lJU2lxOEVnbGdrS0NpRGpDSmlFb1J2bU1nTUxONE1BSUdWcUlJWUxpeElHMDZFVUhRNGhWN0RKQmdad2lLRVNMU0Nnc1lZaTdJV1FNTWRSTUJkaWdBNGQ4eXlaaUlBaVJqSVFreWRqa2ZnQVFSRkM0Y1VDTmRMQTFYSURDUTA2d3ZBQklDd0JhT2dtWHVCZVVnZHlBY2pZUlJFUzZZUWx6cUpJZ01vRERBSU5DaGpGRTVCSkJRUUN1MmdTa2l4MmtKc1VqeUNWUDBzYUg0TUVtQ0pBanhpVEFRaHZpVVNLT3NvazhDaExMQU15U2lLcGozVUErZ1J1SVNDSW93Z0FBRXlLWm1VbFdjaUowL3JQSkZRcXl5U05sNmlIdEN3cVdISUt5QUJqRGc1dEpaVVVtOEt1Y0VlU1BNTG9JbEFLd0xJZDBRVHJGdk1naGdzSUZrVndUanRxd3FHL3VtTWVLUUNJelBoQ0pLRmo0UDRaODd6NlV6RWdXYldLd2tZREtKaFVJbjB0Wm85Q00wQ0F6UnNqSWpHcDBFQjMwTHdBcGFFaU94bWhNalZpZ0FVRnBRU0FGTW9FcmVPQUtFMEJYUWxoMmtpWVpaQmFaK1FSRDJPRE5rbVlrR0puSjVFSFd3Sk1jck9HQkNmblNTWndwRUFNa0lwazdWSWdhZGhHQUJjRGhuaHRSd2dCdllhK0N4RzkrY0pJVFFxb1lsQkxNYkNpeThFUm05b2FRSEc0dlhZWnExMEhJR3BSdGtLVUlnY2dNTVJUU2dTUDhRSGlSWVVpMEZtS0JjV1NHRjAwcC9rTFlncUlJenhWRUFUUUlndW1tV2hGbVpBWVBRNUhCTFRJVEFoNXhKUmFaWVlkTzBuQThuT3JCTEFleXlUbDB3b1J1QmtCM1pzbGhBTmJCRW5UQVFqTWNtT0pIVnFzUVpBWUZFQU1SQnl5a0VBRUdtTlVpSjZBQXA0S0NCWVk1QkxlNlBSMUMxQVVUelJyRURMMFR5QTNtMEVwZk5PRWlGaGdHVkRYVGhWY3k1QVdtUFVMUEZBS3drd2pNSUNld2owMWNBUUFsZ0lFMUs4Q0RMQ1R5RFROb1dET0l1T0JEVUtZeWhjZzFBSFFWQ0dOdDhnVmlERk9TQW1DQUc5UWdwbWZBZ3hPcGFBMENORkhLaHh6Mkp3cmhhZ0NhWjVCRlJQV2wwamtKQjdMZ2pFbk1vQVBCb01ZYUFvSEwzbENISXZ6NmhiOUlRcU4vQXVBR2RleE4vak15RU9VMjg4a1dGaG1YQjlCd0xveEl3emVlZUM0QWFHQU1OL2NtQlQwZ0VBaUVUS0tDRUdBV0gvYnpTVFNRaEM5a3pRQVoxTXdJOXBPUU5IeGlFbUFRbzJZVzRJSmppR0VWaFowUEtEYURBdXc2eEFMaEFNYzhob0VLQ1pDQ0NXNUFiOVlPZ29aNm1xRmJzeTRJUkhscjZIUm1xZzBWRE1RcWNuMFFIeFJKQkpVaTNrME80Z2doQ01FVlJTYjJRQUIxRWtIUlVpalNqZ2d6K3hwamd0UXZBS0RNdGtQS2VjNkVESElFaFJTM1EvclpTWFYvWk5mdWpyZTg1MDN2ZWsvazNPbTJkMEZJcUIydEl1VGI0ZGIzUUliVFZ3RWN4elRkTTRnQUhzRHdCNGhYSVJSbytBTUdJSkJvYU9IaVdnaHFRV0FnY1ltcm9BTWdsMGovL21xajdBRGtoaUJRWGwxRHZvMFVBRkRMSmdkUXVIUWkwSW1ISzhTeUp6OUk2azZpem9KOCszbzd0Y25mWEI2VW1CZEVBRzd1eEFjWXdoakhETzhpRk1qTTBoWHlBYWtMNU9Vbk1UcEJrTzdtQ0V3OUlXK0ppMzRyMGdLL0xXVFFObWs1MFdFdWN6OFBzU2tWaXFaQ2ZpVDBnV0E5QUZvZkNOZFBJb0NDVUdBR0NXaGxBSWF1RXdra2N5R3QvUHJkOHk2UXZRZWc3d2Y1UUN2ZlBwU3kyd1FHQ1lGQlVDaS85cXkzbmU4Sk1YeFF2bzZSb1pwWklIRS95UW9Ta25xVjI3M29uMys4UWxxSmVZUXdMU3k4SG9pU3ZYb1F6ZHVrQlFteC9Fa2V2dmpZUXg0aEN6NUo3USt5TTZsUXhjVVdtMzFRYkM2UXFOdUU4NTNIdS9FVi9wTDhBQ3ovWkVaUk8wSXFISUFMSDRUdVBEL0l0eWxPa09JZlBTakhQd2p0RTNKa1FtVldJVE1JQ3RBTHdtYWJTS0FnN3JkMThCZDZ6cElRWVRabUMwRmVpRGQ2QlZGMXZ6Y3RzUGQrTmhGL0JaRnkyRmNRY2tabi9vWVI2RGQ0QlpGL05yRjZBQmlCQWppQkJ6RUQ5Q1I3WkFHQ3kwWVFIZmgvSThoMkVuZ1NKU0J4a2xBQ3dvZE5wRGNVRG5nU0NGQVF5d044RUNpREplaG1NRmdXL2FkOEF5RjZMUmlEbmplRDBvRUFNekJlRHBZUWFLZDZBOUY2VXppRVQxaUV2b0VBSzdDRG8xSXFwOElRL01VdUROR0RBVUI1VVBhREJ4R0FlaGRWRFRDSGRKZ0JBdkI5REJFcGs1SnNGS1pZREpHRUFmQXMxdGVFVHFoOVVFaUIvaFJCYlFGZ2JkQUhKZzF4aFNvSGlWdkloWWJvaFlnNEVkdEdja2tXRkV3R2NVR0JGSUNZRUhEWWVBT0lFZVRXSldSR1ZBNlJjZ0N3UE9KWGlJd0hBSTUzaVJMQmJxZG5FZC9XZW9SSGliRTRpeGtCYng4eGlKb2hocTlIaEhGb2d1cVdjbW1uRUtNb2k2VW9ibzVYZDZKSWdzY0lldXJHaE5QSGpOUklpc2c0RktuekVqM1hFRG00aGd2UmpMNklFZnhtUWdvQlRZVElFSzNuZXROb2pOeG9qY0pCSEFaM2JTY0JFUkpBaDNOSWZRWFJDQWtRa0FsZ0NBWUJBdnk0aXhVeGN0MDJFQUFuY0FhQmMxWEJBSVNVRnc0NUVOT0FDeXlBQzM2UVdoVTVFVk13QVUwd0FXWFlrU1Jaa2laNWtoNFJRVmxCa1IyNUQwM1FOTGtuUEJBTldaSmV3QUk4ODN3SmNSb2x5V0t2YUJEc2FISW1XWC9veEhPM1NHLzVVQlFhWUFsd2haSU1ZUXFBOGdPbVVKUk1PWlZVV1pWV2FaVUJBUUFoK1FRQmxnQUFBQ3dHQUFZQVdRQ0xBSWN5elRMeDBVWHhwVVR5WDBQeVNFUHlWa1B5ZVVUeWdrVHd5RVR6VFVQeHlrWHlpa1R3eDBUeHRrWHlVVVB4dDBUeHJrWHh4a1h3djBUeW1FVHlpMFB4dVVUeWFrUHh5RVh4eEVYeWFFUHh1MFR4ekVYeHpVWHlrVVR4bEVUeVVrUHlqMFR4aGtUeHBFVHlia1R4dEVYeHcwWHluRVR4Z2tUeVZFUHllMFR5WlVQeG9FVHhzRVR5ZVVQeWJFUHhza1R4dTBYeWRFVHhyRVR5Y0VQeVowUHh2MFh4ZVVUeHpVVHlta1R4ajBUeGswUHlZMFB4cmtUeWpVVHhwMFR5V2tQeWFVUHhoRVR4bzBUeGRVUHlvVVR5V0VQeWNrUHhxVVR4cTBUeHFrVHlrMFFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSS9nQUhRQWdRQU1JQUFBZ1RLbHpJc0tIRGh4QWpSaFJ3SWNBRkFRc2VFQ1RZUUtMSGp5QkRObFN3VVVHSmpSdEZxbHpKTW1HRWpSRmdDRUFwb3FYTm14RTdrS2hCb2tPTEJBY0VDRGlRQUtmUm93Z0xqTEF4b2dBQnBGQ2pTcDFLdGFyVnExaXphdDBLc1lDRkdSYWNKcUFBQVFLRm9seXhnbUR4Z0FXSUdETTMxa3g3RmNOR0RBMVFFcVI3bGNQR0RSYzBidXpJdDZvTXZ4dVE1QmdnQUFFREFRY0xVN1VRWWtFSUlCOGthOTdNdWJQbno2QS9FM0JRd01GVEFBTW9VSWdjK3FhQkNTWW1HQmpnQWFXSDFqY3JiS3l3QWdGS0JyaHQzdmpMUUFKS0NjRmJhdGlvUVlBQjN3RVlHRWpPTWdVT0lqaFM3RUE0Z0RWMWxRUlEvdnhBY2ZxNytmUG8wNFBPa0VFOVNCVW5GcHhROGVFNVFRVFQzVStzZUhHQjhZM0k2UWNSU1FTWkJCMUJ3QW40MEVzRXhWVGJSam9vK0pCT1BQbUUyZ0VIZUNmaFFrb3g1ZFNHSUlZbzRvZ2tLdVNWRVM0NHhSaEJrSlVJd0ZvVnZQQ1dZQnk1YUJkQmVPa1ZnSXNFQm1CU1hBVE5SV0lTaUIyeEFGQkNFZVVpWlpaaDV1S1RVRVlwWldHamxmWVVVR1VwV2VKcnNjMEdaQUJDanFnYlFienA2T0p3QkczQUFJMEJFRWJpbUFId3RtSUFMVzRKbTJ3YVBsbWxhVlAyNmVlZk9LVzIycE0wQkxGQUVEUjg4Q0JCdDVYb0Ewa0srTERBZ2RIeFdGSUoveEVVSUlrM0JvQ1hmZEhsUnlJSUwyZ2dZd3dJc1FkbEFTNE1rV0o1L29ER0t1dXNDNm42Skt1dU9nVXFmaTUyVU9vTFBtVWF3S1lqTWhoQVRKUW1TR0tQSmkwYVFJUWxVbVFSUnFpcGxtZUk4TWxISDYzY2R1dXRpSHMrTldlZEpLWndwM1pzdWpuaWNnUTFaMmFKYUFhZzVwZGhpZ2duYjFoQ29DV0pYT0xaWjdqZkJpeHdpUG51T3lLVElWandBYjB1SGhZQUJ6TGs4QzZKZnFVWkdFcnFpdGdwWHVOZXUrRmFiYjNWcDFkZ2ZUand5U2lqSjZqSEczYllGQUhPTmtvaWhUMjFrS3lMeHNZa0xMRWlNbHNDcU5LNUtHMS9xYmIzWkxielpaYnkwa3kzWnF1TDRZMzMxSzZpam1nZGR0cnQ3Q0s3QVRSM003ekVPUXZ0bTd1dFVPMmdMdlk3MjcrazhkbjAyM0FYeHBodjVCNWNXY0lmcE51d1VWOFFTNnlYaXhYTGV4Rk5OdDdWUU1Gb2tkZ0REdy93MEFPcVU2SkF3d3cwa0JmMzVaaGZoZVJRaVk5WXhBd2VFc0J3aVVvOFVHRUxFeGNMRXd4NmwraHp4eTRLOFZJRVFpelE1d0hMYVpCaFFBQWgvaFZOWVdSbElIZHBkR2dnVTJOeVpXVnVWRzlIYVdZQU93PT0nPiIKCiAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0gIjxkaXY+IjsKCiAgICAgICAgICAgICAgICBfdGhpcy5jcmVhdGVFbGVtZW50KCdkaXYnLCd6aG1JY29uJyk7CgogICAgICAgICAgICAgICAgbGV0IHpobVBsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemhtSWNvbicpOwoKICAgICAgICAgICAgICAgIHpobVBsYXkuaW5uZXJIVE1MID0gcGxheVdyYXBIdG1sOwoKICAgICAgICAgICAgfQogICAgICAgICAgICAvL+W3pumUruaMieS4i+aLluWKqAogICAgICAgICAgICAvL3R5cGU65qC55o2u5LiN5ZCM57G75Z6L77yM5aSE55CG5Zu+5qCH5Y2V5Ye75LqL5YqhCiAgICAgICAgICAgIHpobUxvZ29EcmFnKHR5cGUsd2ViKXsKCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhcsKgemhtTG9nb0RyYWc9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3pobWxvZ28iKTsKCiAgICAgICAgICAgICAgICB2YXIgemhtTG9nb0ljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuaWNvbkxvZ28iKTsKCiAgICAgICAgICAgICAgICBpZighemhtTG9nb0RyYWcgfHwgIXpobUxvZ29JY29uKXJldHVybjsKCiAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5vbm1vdXNlZG93biA9IGZ1bmN0aW9uKGV2ZW50KXsKCiAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQud2hpY2g9PTMpcmV0dXJuIGZhbHNlOy8v5bGP6JS95Y+z6ZSuCgogICAgICAgICAgICAgICAgICAgIGxldCBzZWRvd25Ub3AgPSB6aG1Mb2dvRHJhZy5vZmZzZXRUb3A7CgogICAgICAgICAgICAgICAgICAgIGxldCB6aG1Mb2dvSWNvbkhlaWdodCA9IHpobUxvZ29JY29uLm9mZnNldEhlaWdodDsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGJvdHRvbVNwYWNlID0gMTA7CgogICAgICAgICAgICAgICAgICAgIGlmKGV2ZW50LnRhcmdldC5jbGFzc05hbWUgIT0gJ2ljb25Mb2dvJylyZXR1cm47CgogICAgICAgICAgICAgICAgICAgIC8vbGV0wqBzaGlmdFjCoD3CoGV2ZW50LmNsaWVudFjCoC3CoHpobUxvZ29EcmFnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7CiAgICAgICAgICAgICAgICAgICAgbGV0IHNoaWZ0eCA9IDU7CgogICAgICAgICAgICAgICAgICAgIGxldMKgc2hpZnRZID0gZXZlbnQuY2xpZW50WS16aG1Mb2dvRHJhZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7CgogICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnBvc2l0aW9uwqA9wqAnZml4ZWQnOwoKICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5zdHlsZS56SW5kZXjCoD3CoDk5OTk5OTk7CgogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHpobUxvZ29EcmFnKTsKCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb27CoG9uTW91c2VNb3ZlKGV2ZW50KXsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vemhtTG9nb0RyYWcuc3R5bGUubGVmdMKgPcKgcGFnZVjCoC3CoHNoaWZ0WMKgK8KgJ3B4JzsKICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUubGVmdMKgPcKgJzVweCc7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gemhtTG9nb0ljb25IZWlnaHQtYm90dG9tU3BhY2U7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgeSA9IGV2ZW50LnBhZ2VZLXNoaWZ0WTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBNYXRoLm1pbihNYXRoLm1heCgwLCB5KSwgaGVpZ2h0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnRvcCA9IHkrJ3B4JzsKCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8v5ZyobW91c2Vtb3Zl5LqL5Lu25LiK56e75Yqo5Zu+5qCHCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxvbk1vdXNlTW92ZSk7CiAgICAgICAgICAgICAgICAgICAgLy/mnb7lvIDkuovku7YKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5vbm1vdXNldXAgPSBmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uVG9wJyx6aG1Mb2dvRHJhZy5vZmZzZXRUb3ApOwoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyzCoG9uTW91c2VNb3ZlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLm9ubW91c2V1cMKgPcKgbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSB6aG1Mb2dvRHJhZy5vZmZzZXRUb3AremhtTG9nb0ljb25IZWlnaHQrYm90dG9tU3BhY2U7CgogICAgICAgICAgICAgICAgICAgICAgICBpZih6aG1Mb2dvRHJhZy5vZmZzZXRUb3AgPCAwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5zdHlsZS50b3AgPScwcHgnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZih3aW5kb3cuaW5uZXJIZWlnaHQgPCBoZWlnaHQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnRvcCA9d2luZG93LmlubmVySGVpZ2h0LXpobUxvZ29JY29uSGVpZ2h0LWJvdHRvbVNwYWNlKydweCc7CgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2xpY2vkuovku7blpITnkIYKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHR5cGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZpZGVvJzoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoemhtTG9nb0RyYWcub2Zmc2V0VG9wPT1zZWRvd25Ub3AgJiYgd2ViLmxlbmd0aCA9PSAwICYmIHpobUxvZ29EcmFnLm9mZnNldFRvcD4wICYmIHdpbmRvdy5pbm5lckhlaWdodCA+IGhlaWdodCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivt+WcqOinhumikeaSreaUvumhteeCueWHu+WbvuaghycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtdXNpYyc6CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHpobUxvZ29EcmFnLm9mZnNldFRvcD09c2Vkb3duVG9wICYmIGUudGFyZ2V0LmNsYXNzTmFtZSA9PSAnaWNvbkxvZ28nKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyzCoG9uTW91c2VNb3ZlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vemhtTG9nb0RyYWcub25tb3VzZXVwwqA9wqBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG11c2ljVXJsRGF0YSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDovXmh0dHBzPzpcL1wvbXVzaWNcLjE2M1wuY29tXC8jXC8oPzpzb25nfGRqKVw/aWQvfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDovXmh0dHBzPzpcL1wveVwubXVzaWNcLjE2M1wuY29tXC9tXC8oPzpzb25nfGRqKVw/aWQvfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDovXmh0dHBzPzpcL1wvbXVzaWNcLjE2M1wuY29tXC8oPzpzb25nfGRqKVw/aWQvfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDovXmh0dHBzPzpcL1wveVwucXFcLmNvbVwvblwvcnlxcVwvcGxheWVyL30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L2t1Z291XC5jb20vfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDova3V3b1wuY24vfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDovXmh0dHBzPzpcL1wvd3d3XC54aW1hbGF5YVwuY29tL30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtdXNpY1VybCA9IG11c2ljVXJsRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLmhyZWYubWF0Y2goaXRlbS5tYXRjaCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobXVzaWNVcmwubGVuZ3RoPT0wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3Qod2ViWzBdLnRpcCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2god2ViWzBdLm5hbWUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbmV0ZWFzZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0ZWFzZUZ1bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncXEnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFxRnVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdrdWdvdSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3Vnb3VGdW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2t1d28nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt1d29GdW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3hpbWFsYXlhJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aW1hbGF5YUZ1bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuZXRlYXNlRnVuKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybFBhcmFtcyA9IF90aGlzLmdldFVybFBhcmFtcyhsb2NhdGlvbi5ocmVmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1cmxQYXJhbXMuaWQgPT0gdW5kZWZpbmVkKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ldGVhc2VVcmxFbmNvZGUgPSBlbmNvZGVVUklDb21wb25lbnQoJ2h0dHBzOi8vbXVzaWMuMTYzLmNvbS9zb25nP2lkPScrdXJsUGFyYW1zLmlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCBvcGVuVXJsID0gd2ViVXJsKyc/dXJsPScrbmV0ZWFzZVVybEVuY29kZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3BlblVybCA9IHdlYlVybCsiP2lkPSIrdXJsUGFyYW1zLmlkKyImdHlwZT1uZXRlYXNlIgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKG9wZW5VcmwpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcXFGdW4oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcXFTb25nTWF0Y2g7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBsYXllcl9tdXNpY19faW5mbyIpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXFTb25nTWF0Y2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucGxheWVyX211c2ljX19pbmZvIikuY2hpbGROb2Rlc1swXS5ocmVmLm1hdGNoKC9zb25nRGV0YWlsXC8oXFMqKVw/Lyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NpbV9zb25nX2luZm8iKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFxU29uZ01hdGNoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NpbV9zb25nX2luZm8iKS5jaGlsZE5vZGVzWzBdLmhyZWYubWF0Y2goL3NvbmdcLyhcUyopLmh0bWwvKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXFTb25nTWF0Y2ggPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcXFTb25nTWF0Y2hbMV0pe2NvbnNvbGUubG9nKCfmsqHmnInojrflj5bliLDmrYzmm7JJRCcpOyByZXR1cm59OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdWRpb0xpbmsgPSBlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYXVkaW8iKS5zcmMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcGVuVXJsID0gd2ViVXJsKyc/aWQ9JytxcVNvbmdNYXRjaFsxXSsnJnR5cGU9cXEmcGxheVVybD0nK2F1ZGlvTGluazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihvcGVuVXJsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGt1Z291RnVuKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvTW9kdWxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2F1ZGlvTW9kdWxlJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXVkaW9Nb2R1bGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYXVkaW9Nb2R1bGUnKS5zdHlsZT0nYm90dG9tOjBweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2hvd0hpZGVfcGxheWJhcicpLmNsYXNzTmFtZSA9ICdpY29uIHNob3ctcGxheWJhci1idG4nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSInLDIwMDApCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgn6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSLjgIInKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzb25nS3Vnb3VNYXRjaCA9IG5ld1VybC5tYXRjaChqeE11c2ljV2ViWzBdLm1hdGNoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXVkaW9TcmMgPSBlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYXVkaW8iKS5zcmMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcGVuVXJsID0gd2ViVXJsKyc/aWQ9Jytzb25nS3Vnb3VNYXRjaFsxXSsnJnR5cGU9a3Vnb3UmcGxheVVybD0nK2F1ZGlvU3JjOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKG9wZW5VcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ga3V3b0Z1bigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5Q29udHJvbCcpLnN0eWxlPSdib3R0b206MHB4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJywyMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0i44CCJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzb25nS3V3b01hdGNoID0gbmV3VXJsLm1hdGNoKGp4TXVzaWNXZWJbMF0ubWF0Y2gpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdWRpb1NyYyA9IGVuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJhdWRpbyIpLnNyYyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW5VcmwgPSB3ZWJVcmwrJz9pZD0nK3NvbmdLdXdvTWF0Y2hbMV0rJyZ0eXBlPWt1d28mcGxheVVybD0nK2F1ZGlvU3JjOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKG9wZW5VcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geGltYWxheWFGdW4oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueG0tcGxheWVyJykuc3R5bGU9J2JvdHRvbTowcHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSInLDIwMDApCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgn6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSLjgIInKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybEluZm8gPSBuZXdVcmwubWF0Y2goanhNdXNpY1dlYlswXS5tYXRjaCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cod2ViVXJsKyc/aWQ9Jyt1cmxJbmZvWzFdKycmdHlwZT14aW1hbGF5YSZwbGF5VXJsPScrZW5jb2RlVVJJQ29tcG9uZW50KG5ld1VybCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHVybEluZm9bMV0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3Blbih3ZWJVcmwrJz9pZD0nK3VybEluZm9bMV0rJyZ0eXBlPXhpbWFsYXlhJnBsYXlVcmw9JytlbmNvZGVVUklDb21wb25lbnQobmV3VXJsKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmsqHmnInojrflj5Z1cmzlj4LmlbAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd5b3V0dWJlJzoKCgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgemhtTG9nb0RyYWcub25kcmFnc3RhcnTCoD3CoGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuwqBmYWxzZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy/kuIvovb0KICAgICAgICAgICAgc3RhdGljIExSX2Rvd25sb2FkKHVybCxmaWxlbmFtZSl7CgogICAgICAgICAgICAgICAgbGV0IHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHVhLm1hdGNoKC92ZXJzaW9uXC8oW1xkLl0rKS4qc2FmYXJpLykpOwoKICAgICAgICAgICAgICAgIGlmKHVhLm1hdGNoKC92ZXJzaW9uXC8oW1xkLl0rKS4qc2FmYXJpLykpewoKICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3Blbih1cmwpOwoKICAgICAgICAgICAgICAgIH1lbHNlewpjb25zb2xlLmxvZyh1cmwpOwogICAgICAgICAgICAgICAgICAgIEdNX2Rvd25sb2FkKHVybCxmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIGNsYXNzIFBsYXlWaWRlb0NsYXNzIGV4dGVuZHMgQmFzZUNsYXNzewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpewogICAgICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIGNsYXNzIFZlcnNpb25DbGFzcyBleHRlbmRzIEJhc2VDbGFzc3sKCiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCl7CgogICAgICAgICAgICAgICAgc3VwZXIoKTsKCiAgICAgICAgICAgICAgICB0aGlzLnZlcnNpb25VcmwgPSAnaHR0cHM6Ly9naXRsYWIuY29tL2xhbmhhaGEvbGFucmVuamlhb2Jlbi8tL3Jhdy9tYWluL1JFQURNRS5tZD9yZWZfdHlwZT1oZWFkcyc7CgogICAgICAgICAgICAgICAgdGhpcy5yZW5ld1ZlcnNpb25VcmwgPSAnaHR0cHM6Ly9naXRsYWIuY29tL2xhbmhhaGEvbGFucmVuamlhb2JlbiMlRTUlQUUlODklRTglQTMlODV0bSc7CgogICAgICAgICAgICAgICAgbGV0IHRpcFBhZ2VXcmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CgogICAgICAgICAgICAgICAgdGlwUGFnZVdyYXAuaWQ9J3RpcFdyYXAnOwoKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGlwUGFnZVdyYXApOwoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgKGFzeW5jIGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIGxldCByZXNwID0gYXdhaXQgX3RoaXMuY2hlY2tUaW1lKCk7CgogICAgICAgICAgICAgICAgICAgIGlmKCFyZXNwKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgX3RoaXMuY2hlY2tSdW5UaW1lKCk7CgogICAgICAgICAgICAgICAgfSkoKQoKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXRWZXJzaW9uKG1vdGhlZCx1cmwpewoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57CgogICAgICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbW90aGVkLAoKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiAnJywKCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsnQWNjZXB0JzogJ3RleHQvcGxhaW4sIHRleHQvaHRtbCxhcHBsaWNhdGlvbi9qc29uJ30sCgogICAgICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uKHJlcyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc0FycmF5ID0gcmVzLnJlc3BvbnNlVGV4dC5zcGxpdCgnXG4nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmVyc2lvbkFycmF5PVtdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8cmVzQXJyYXkubGVuZ3RoO2krKyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc0FycmF5W2ldLm1hdGNoKC9eKFswLTk5OV17MSwzfSlcLj8oWzAtOTk5XXsxLDN9KT9cLj8oWzAtOTk5XXsxLDN9KT8kLykpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbkFycmF5LnB1c2gocmVzQXJyYXlbaV0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmVyc2lvbkFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IgOiBmdW5jdGlvbihlcnIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2hlY2tUaW1lKCl7CgogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+ewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgbGV0IGluc3RhbGxUaW1lID0gR01fZ2V0VmFsdWUoJ2luc3RhbGxUaW1lJywwKTsKCiAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKCk7CgogICAgICAgICAgICAgICAgbGV0IGRhdGVOb3dUaW1lID0gZGF0ZS5nZXRUaW1lKCk7CgogICAgICAgICAgICAgICAgbGV0IGludGVydmFsVGltZSA9IDg2NDAwKjEwMDA7CgogICAgICAgICAgICAgICAgbGV0IHZlcnNpb25JbnRlcnZhbFRpbWUgPSA4NjQwMCoxMDAwOwoKICAgICAgICAgICAgICAgIGlmKGluc3RhbGxUaW1lKXsKCiAgICAgICAgICAgICAgICAgICAgaWYoZGF0ZU5vd1RpbWUtaW50ZXJ2YWxUaW1lPmluc3RhbGxUaW1lKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnZXRWZXJzaW9uVGltZSA9IEdNX2dldFZhbHVlKCdnZXRWZXJzaW9uVGltZScsMCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRlTm93VGltZS12ZXJzaW9uSW50ZXJ2YWxUaW1lID4gZ2V0VmVyc2lvblRpbWUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3luYyBmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3dUaW1lID0gZGF0ZS5nZXRUaW1lKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2ZXJzaW9uQXJyPSBhd2FpdCBfdGhpcy5nZXRWZXJzaW9uKCdnZXQnLF90aGlzLnZlcnNpb25VcmwpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih2ZXJzaW9uQXJyLmxlbmd0aCA9PSAwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieiOt+WPluWIsOeJiOacrOWPtycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZlcnNpb25PYmo9dmVyc2lvbkFyclswXS5zcGxpdCgnLicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy52ZXJzaW9uT25saW5lID0gW107CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnZlcnNpb25PbmxpbmVbMF0gPSB2ZXJzaW9uT2JqWzBdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy52ZXJzaW9uT25saW5lWzFdID0gdmVyc2lvbk9ialsxXT92ZXJzaW9uT2JqWzFdOjA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnZlcnNpb25PbmxpbmVbMl0gPSB2ZXJzaW9uT2JqWzJdP3ZlcnNpb25PYmpbMl06MDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZlcnNpb25Ob3cgPSBHTV9pbmZvLnNjcmlwdC52ZXJzaW9uLnNwbGl0KCcuJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKF90aGlzLnZlcnNpb25PbmxpbmUsdmVyc2lvbk5vdyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTwzO2krKyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwYXJzZUludChfdGhpcy52ZXJzaW9uT25saW5lW2ldKSA+IHBhcnNlSW50KHZlcnNpb25Ob3dbaV0pKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleD1pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2dldFZlcnNpb25UaW1lJyxkYXRlTm93VGltZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCd2Y29kZVJlc3VsdCcsaW5kZXgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgndmVyc2lvbk9ubGluZScsX3RoaXMudmVyc2lvbk9ubGluZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKQoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaW5zdGFsbFRpbWUnLGRhdGVOb3dUaW1lKTsKCiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7CgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIH0pCgogICAgICAgIH0KCiAgICAgICAgICAgIGNoZWNrUnVuVGltZSgpewoKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoKTsKCiAgICAgICAgICAgIGxldCBkYXRlTm93VGltZSA9IGRhdGUuZ2V0VGltZSgpOwoKICAgICAgICAgICAgbGV0IHJ1blRpcFRpbWUgPSBHTV9nZXRWYWx1ZSgncnVuVGlwVGltZScsMCk7Ly/lvLnmoYbml7bpl7QKCiAgICAgICAgICAgIGxldCB2Y29kZVJlc3VsdCA9IEdNX2dldFZhbHVlKCd2Y29kZVJlc3VsdCcpOwoKICAgICAgICAgICAgX3RoaXMudmVyc2lvbk9ubGluZSA9IEdNX2dldFZhbHVlKCd2ZXJzaW9uT25saW5lJyk7CgogICAgICAgICAgICBsZXQgdGlwSW50ZXJ2YWxUaW1lID0gNjAqMTAwMDsKCiAgICAgICAgICAgIGlmKGRhdGVOb3dUaW1lLXJ1blRpcFRpbWUgPiB0aXBJbnRlcnZhbFRpbWUgJiYgdmNvZGVSZXN1bHQgIT0gJ3VuZGVmaW5lZCcpewoKICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdydW5UaXBUaW1lJyxkYXRlTm93VGltZSk7CgogICAgICAgICAgICAgICAgc3dpdGNoKHZjb2RlUmVzdWx0KXsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zaG93VGlwUGFnZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zaG93VGlwUGFnZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zaG93VGlwUGFnZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgICAgIHNob3dUaXBQYWdlKCl7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICAvL2xldCBzZXRIdG1sID0gIjxkaXYgY2xhc3M9J3pobU1hc2snPjwvZGl2PiI7CgogICAgICAgICAgICAgICAgbGV0IHNldEh0bWwgPSI8ZGl2IGNsYXNzPSd3cmFwLWJveCcgc3R5bGU9J3RvcDphdXRvO2xlZnQ6YXV0bztib3R0b206NXB4O3JpZ2h0OjVweDt0cmFuc2Zvcm06bm9uZTtib3gtc2hhZG93OiAwcHggMHB4IDVweCAjODg4Oyc+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0naWNvblNldFVsSGVhZCc+PGxpIGNsYXNzPSdpY29uU2V0UGFnZUhlYWQnIHN0eWxlPSdqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc+PHNwYW4+5Y+R546w5paw54mI5pysPC9zcGFuPjwvbGk+PC91bD4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBzdHlsZT0naGVpZ2h0OjgwcHg7IGRpc3BsYXk6ZmxleDsganVzdGlmeS1jb250ZW50OmNlbnRlcjsgYWxpZ24taXRlbXM6Y2VudGVyOyc+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxwIHN0eWxlPSd3aWR0aDoyNDBweDt3b3JkLWJyZWFrOmJyZWFrLWFsbDtsaW5lLWhlaWdodDoyNnB4Oyc+5paw54mI5pysIDxhIGhyZWY9JyIrdGhpcy5yZW5ld1ZlcnNpb25VcmwrIicgdGFyZ2V0PSdfYmxhbmsnIHN0eWxlPSdjb2xvcjojZmU2ZDczOyc+diIrdGhpcy52ZXJzaW9uT25saW5lLmpvaW4oJy4nKSsiPC9hPiDlt7Llj5HluIPjgII8cD4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9kaXY+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgc3R5bGU9J2Rpc3BsYXk6ZmxleDsganVzdGlmeS1jb250ZW50OmNlbnRlcjsgYWxpZ24taXRlbXM6Y2VudGVyO3dpZHRoOjMwMHB4O2hlaWdodDo0MHB4O2JhY2tncm91bmQ6ICNmZWY5ZWY7Zm9udC1zaXplOjE0cHg7Jz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHNwYW4gaWQ9J3RpcFJlbmV3JyBzdHlsZT0nd2lkdGg6NTAlO3RleHQtYWxpZ246Y2VudGVyO2N1cnNvcjogcG9pbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNmZTZkNzM7Y29sb3I6I2ZmZjtoZWlnaHQ6NDBweDtsaW5lLWhlaWdodDo0MHB4Oyc+5p+l55yL5pu05pawPC9zcGFuPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8c3BhbiBpZD0ndGlwQmFja09uJyBzdHlsZT0nd2lkdGg6NTAlO3RleHQtYWxpZ246Y2VudGVyO2N1cnNvcjogcG9pbnRlcjsnPuW/veeVpTwvc3Bhbj4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0nPC9kaXY+JzsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8L2Rpdj4iOwoKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHZlcnNpb25UaXBEb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdGlwV3JhcCcpOwoKICAgICAgICAgICAgICAgICAgICBpZighdmVyc2lvblRpcERvbSlyZXR1cm4gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIHZlcnNpb25UaXBEb20uaW5uZXJIVE1MID0gc2V0SHRtbDsKCiAgICAgICAgICAgICAgICAgICAgLy9kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHZlcnNpb25UaXBEb20pOwoKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdGlwQmFja09uJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2luc3RhbGxUaW1lJyxuZXcgRGF0ZSgpLmdldFRpbWUoKSk7CgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdGlwV3JhcCcpLnN0eWxlPSdkaXNwbGF5Om5vbmUnOwogICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0aXBSZW5ldycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpbnN0YWxsVGltZScsbmV3IERhdGUoKS5nZXRUaW1lKCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RpcFdyYXAnKS5zdHlsZT0nZGlzcGxheTpub25lJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKF90aGlzLnJlbmV3VmVyc2lvblVybCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL3RpcEljb25DbG9zZS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgfSw1MDAwKTsKCgogICAgICAgICAgICB9OwoKICAgICAgICB9CgogICAgICAgIHZhciBub3dXZWI9W107CgogICAgICAgIGp4VmlkZW8uZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgIGxldCByZXN1bHQgPSBsb2NhdGlvbi5ocmVmLm1hdGNoKGl0ZW0ubWF0Y2gpOwoKICAgICAgICAgICAgaWYocmVzdWx0KXsKCiAgICAgICAgICAgICAgICBub3dXZWIucHVzaChpdGVtKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfSkKCiAgICAgICAgaWYobm93V2ViLmxlbmd0aD09MCl7CgogICAgICAgICAgICAvL2xldCBiYXNlQ2xhc3MgPSBuZXcgQmFzZUNsYXNzKCk7CgogICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5Yy56YWN6K+l572R56uZ5oiW6K+l5qih5Z2X5bey5YWz6ZetJyk7cmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcGxheVZpZGVvRnVuYygpewoKICAgICAgICAgICAgdmFyIHBsYXlWaWRlb0NsYXNzID0gbmV3IFBsYXlWaWRlb0NsYXNzKCk7CgogICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgnbW92aWVMaXN0JywnMjInKT09MCl7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHBsYXlWaWRlb0NsYXNzLnpobUxvZ28oKTsKCiAgICAgICAgICAgIGlmKEdNX2dldFZhbHVlKCdwbGF5VmlkZW9MaW5lVGV4dCcpKXsKCiAgICAgICAgICAgICAgICBsZXQgbGluZU9iaiA9IHBsYXlWaWRlb0NsYXNzLmdldExpbmUoR01fZ2V0VmFsdWUoJ3BsYXlWaWRlb0xpbmVUZXh0JykpOwoKICAgICAgICAgICAgICAgIGlmKGxpbmVPYmopewoKICAgICAgICAgICAgICAgICAgICAvL3BsYXlMaW5lID0gWy4uLmxpbmVPYmosLi4ucGxheUxpbmVdOwogICAgICAgICAgICAgICAgICAgIHBsYXlMaW5lID0gbGluZU9iagoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9jdXN0b20gYWRkIHdlYiBsaW5lCgogICAgICAgICAgICAvL3RlbXBsYXRlOmljb24scGxheUxpbmU7CgogICAgICAgICAgICBsZXQgcGxheVdyYXBIdG1sID0gIjxkaXYgY2xhc3M9J3pobV9wbGF5X3ZpZGVvX2xpbmUnPiI7CgogICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0iPGRpdj48dWwgY2xhc3M9J3pobV9wbGF5X3ZpZGVfbGluZV91bCc+IjsKCiAgICAgICAgICAgIHBsYXlMaW5lLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gJyc7CgogICAgICAgICAgICAgICAgaWYocGxheVZpZGVvQ2xhc3MuZ2V0Q29va2llKCdwbGF5TGluZUFjdGlvbicpID09IGl0ZW0udXJsKXsKCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSAnemhtX2xpbmVfc2VsZWN0ZWQnOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz1gPGxpIGNsYXNzPSdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGkgJHtzZWxlY3RlZH0nIHVybD0nJHtpdGVtLnVybH0nID4ke2l0ZW0ubmFtZX08L2xpPmA7CgogICAgICAgICAgICB9KQoKICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9ICI8L2Rpdj4iOwoKICAgICAgICAgICAgbGV0IHpobVBsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemhtbG9nbycpOwoKICAgICAgICAgICAgbGV0IHBsYXlMaW5lRG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CgogICAgICAgICAgICBwbGF5TGluZURvbS5jbGFzc05hbWUgPSAncGxheUxpbmVEaXYgemhtX3BsYXlfdmlkZW9fd3JhcCc7CgogICAgICAgICAgICBwbGF5TGluZURvbS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwoKICAgICAgICAgICAgcGxheUxpbmVEb20uaW5uZXJIVE1MID0gcGxheVdyYXBIdG1sOwoKICAgICAgICAgICAgemhtUGxheS5hcHBlbmRDaGlsZChwbGF5TGluZURvbSk7CgogICAgICAgICAgICAvL3RlbXBsYXRlOm5vZGU75pKt5pS+5Yy65Z+fCgogICAgICAgICAgICBsZXQgcGxheUp4SHRtbCA9ICI8ZGl2IGNsYXNzPSd6aG1fcGxheV92aWRlb19qeCc+IjsKCiAgICAgICAgICAgIHBsYXlKeEh0bWwgKz0gIjxpZnJhbWUgYWxsb3d0cmFuc3BhcmVuY3k9dHJ1ZSBmcmFtZWJvcmRlcj0nMCcgc2Nyb2xsaW5nPSdubycgYWxsb3dmdWxsc2NyZWVuPXRydWUgYWxsb3d0cmFuc3BhcmVuY3k9dHJ1ZSBuYW1lPSdqeF9wbGF5JyBzdHlsZT0naGVpZ2h0OjEwMCU7d2lkdGg6MTAwJScgaWQ9J3BsYXlJZnJhbWUnPjwvaWZyYW1lPjwvZGl2PiI7CgogICAgICAgICAgICBsZXQganhWaWRlb0RhdGEgPSBbCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5wbGF5ZXJfX2NvbnRhaW5lciIgLG1hdGNoOi9odHRwczpcL1wvdi5xcS5jb21cL3hcL2NvdmVyXC9bYS16QS1aMC05XSsuaHRtbC8sYXJlYUNsYXNzTmFtZToncGxheWxpc3QtbGlzdCcsbmFtZToncXFQQyd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyLWNvbnRhaW5lciIgLG1hdGNoOi9odHRwczpcL1wvdi5xcS5jb21cL3hcL2NvdmVyXC9bYS16QS1aMC05XStcL1thLXpBLVowLTldKy5odG1sLyxhcmVhQ2xhc3NOYW1lOidwbGF5bGlzdC1saXN0JyxuYW1lOidxcVBDJ30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5jb250YWluZXItcGxheWVyIiAsbWF0Y2g6L3ZcLnFxXC5jb21cL3hcL3BhZ2UvLGFyZWFDbGFzc05hbWU6J21vZF9lcGlzb2RlJ30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjZmxhc2hib3giLG1hdGNoOi9eaHR0cHM6XC9cL3d3d1wuaXFpeWlcLmNvbVwvW3Z3YV1cXy8sYXJlYUNsYXNzTmFtZToncXktZXBpc29kZS1udW0nLG5hbWU6J2lxaXlpUGMnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLm0tdmlkZW8tcGxheWVyLXdyYXAiLG1hdGNoOi9eaHR0cHM6XC9cL20uaXFpeWlcLmNvbVwvW3Z3YV1cXy8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLmludGwtdmlkZW8td3JhcCIsbWF0Y2g6L15odHRwczpcL1wvd3d3XC5pcVwuY29tXC9wbGF5XC8vLGFyZWFDbGFzc05hbWU6J20tc2xpZGluZy1saXN0J30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovdlwueW91a3VcLmNvbVwvdl9zaG93XC9pZF8vLGFyZWFDbGFzc05hbWU6J25ldy1ib3gtYW50aG9sb2d5LWl0ZW1zJ30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi92XC55b3VrdVwuY29tXC92X3BsYXlcL2lkXy99LAoKICAgICAgICAgICAgICAgIC8ve2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIucGxheWVyLWNvbnRhaW5lciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovd3d3XC5iaWxpYmlsaVwuY29tXC92aWRlby99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjYmlsaWJpbGktcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi93d3dcLmJpbGliaWxpXC5jb21cL3ZpZGVvLyxuYW1lOidiaWxpUGMnLGFyZWFDbGFzc05hbWU6J3ZpZGVvLWVwaXNvZGUtY2FyZCd9LAogICAgICAgICAgICAgICAgLy97ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXJfbW9kdWxlIixub2RlVHlwZTonaWQnLG1hdGNoOi93d3dcLmJpbGliaWxpXC5jb21cL2Jhbmd1bWkvLGFyZWFDbGFzc05hbWU6J2xpc3Qtd3JhcHBlcid9LOWOn+adpURPTQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIuYnB4LXBsYXllci1wcmltYXJ5LWFyZWEiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3d3d1wuYmlsaWJpbGlcLmNvbVwvYmFuZ3VtaS8sYXJlYUNsYXNzTmFtZTonZXBsaXN0X2VwX2xpc3Rfd3JhcHBlcl9fUHpMSGEnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI21ndHYtcGxheWVyLXdyYXAiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3dy5tZ3R2XC5jb21cL2J8bFwvWzAtOV0vLGFyZWFDbGFzc05hbWU6J2VwaXNvZGUtaXRlbXMnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii54LXBsYXllciIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovdHZcLnNvaHVcLmNvbVwvdi8sYXJlYUNsYXNzTmFtZTonc2VyaWVzLXRhYl9wYW5lJ30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXJXcmFwIixub2RlVHlwZTonaWQnLG1hdGNoOi9maWxtXC5zb2h1XC5jb21cL2FsYnVtXC8vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNsZV9wbGF5Ym94Iixub2RlVHlwZTonaWQnLG1hdGNoOi9sZVwuY29tXC9wdHZcL3ZwbGF5XC8vLGFyZWFDbGFzc05hbWU6J2p1amlfZ3JpZCd9LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovcGxheVwudHVkb3VcLmNvbVwvdl9zaG93XC9pZF8vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwcHR2X3BsYXlwYWdlX2JveCIsbm9kZVR5cGU6J2lkJyxtYXRjaDovdlwucHB0dlwuY29tXC9zaG93XC8vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3ZpcFwuMTkwNS5jb21cL3BsYXlcLy99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3ZvZFBsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovd3d3XC4xOTA1LmNvbVwvdm9kXC9wbGF5XC8vfSwKICAgICAgICAgICAgXTsKCiAgICAgICAgICAgIGxldCBqeFZpZGVvV2ViID0ganhWaWRlb0RhdGEuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKGl0ZW0ubWF0Y2gpOwoKICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIHBsYXlWaWRlb0NsYXNzLnpobUxvZ29EcmFnKCd2aWRlbycsanhWaWRlb1dlYik7CgogICAgICAgICAgICAvL+aYr+WQpuWcqOaSreaUvumhtQogICAgICAgICAgICBpZihqeFZpZGVvV2ViLmxlbmd0aCA+IDApewoKICAgICAgICAgICAgICAgIHZhciB7ZnVuY05hbWUsbWF0Y2g6bm93TWF0Y2gsbm9kZTpub3dOb2RlLG5hbWU6bm93TmFtZX0gPSBqeFZpZGVvV2ViWzBdOwoKICAgICAgICAgICAgICAgIC8v6byg5qCH57uP6L+H5pi+56S657q/6LevCiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGxheUJ1dHRvbicpLm9ubW91c2VvdmVyPSgpPT57CgogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wbGF5TGluZURpdiIpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBsYXlCdXR0b24nKS5vbm1vdXNlb3V0PSgpPT57CgogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wbGF5TGluZURpdiIpLnN0eWxlLmRpc3BsYXk9J25vbmUnOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL+mAieaLqee6v+i3r+ino+aekOaSreaUvgoKICAgICAgICAgICAgICAgIHZhciBwbGF5TGluZVRkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBsYXlMaW5lVGQnKTsKCiAgICAgICAgICAgICAgICBwbGF5TGluZVRkLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5TGluZVRkLmZvckVhY2goZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywncGxheUxpbmVUZCB6aG1fcGxheV92aWRlb19saW5lX3VsX2xpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGkgemhtX2xpbmVfc2VsZWN0ZWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlWaWRlb0NsYXNzLnNldENvb2tpZSgncGxheUxpbmVBY3Rpb24nLHRoaXMuZ2V0QXR0cmlidXRlKCd1cmwnKSwzMCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgndmlkZW9QbGF5TGluZUFkZCcpICE9IDIyKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm93V2ViTm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iobm93Tm9kZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobm93V2ViTm9kZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vd1dlYk5vZGUuaW5uZXJIVE1MID0gcGxheUp4SHRtbDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlJZnJhbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGxheUlmcmFtZScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5SWZyYW1lLnNyYz0gaXRlbS5nZXRBdHRyaWJ1dGUoJ3VybCcpK2xvY2F0aW9uLmhyZWY7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfop4bpopHnvZHnq5nnu5PngrnkuI3lrZjlnKgnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGl0ZW0uZ2V0QXR0cmlidXRlKCd1cmwnKStsb2NhdGlvbi5ocmVmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIC8qLS3nibnmrorlpITnkIYtLSovCiAgICAgICAgICAgICAgICAvL+S8mOmFt+WOu+W5v+WRigogICAgICAgICAgICAgICAgaWYobm93Tm9kZT09IiNwbGF5ZXIiKXsKCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHlvdWt1QWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYWR2ZXJ0aXNlLWxheWVyJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgeWtBZCA9IHlvdWt1QWQubGFzdENoaWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgeWtBZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHlrQWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmt1aS1kYXNoYm9hcmQtMCcpLnN0eWxlPSdkaXNwbGF5OmZsZXgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlWaWRlbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1sYXllciB2aWRlbycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheVZpZGVvLnBsYXkoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuPTA7CgogICAgICAgICAgICAgICAgICAgICAgICAvL+aaguWBnAogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcua3VpLXBsYXktaWNvbi0wJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLWxheWVyIHZpZGVvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobisrJTIgPT0gMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLnBhdXNlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLnBsYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheVZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLGZ1bmN0aW9uKCl7IC8v5pKt5pS+5pe26Ze05pS55Y+YCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHlvdWt1QWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYWR2ZXJ0aXNlLWxheWVyJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHlrQWQgPSB5b3VrdUFkLmxhc3RDaGlsZDsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeWtBZCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlrQWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh5a0FkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcua3VpLWRhc2hib2FyZC0wJykuc3R5bGU9J2Rpc3BsYXk6ZmxleCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy/plK7nm5jlv6vov5vlv6vpgIDmmoLlgZzmkq3mlL4KICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQub25rZXlkb3duID0gZnVuY3Rpb24oZXZlbnQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhldmVudC5rZXlDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1sYXllciB2aWRlbycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGV2ZW50LmtleUNvZGU9PTM5KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSB2aWRlby5jdXJyZW50VGltZSArIDU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQua2V5Q29kZT09MzcpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHZpZGVvLmN1cnJlbnRUaW1lIC0gNTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQua2V5Q29kZT09MzIpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuKyslMiA9PSAwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLnBhdXNlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8ucGxheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDMwMDApCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL+eIseWlh+iJuuWOu+W5v+WRigogICAgICAgICAgICAgICAgaWYobm93Tm9kZT09IiNmbGFzaGJveCIpewoKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNraXBwYWJsZS1hZnRlcicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20uY2xpY2soKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSwzMDAwKQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL+iFvuiur+WOu3ZpcOW8ueeqlwogICAgICAgICAgICAgICAgaWYobm93Tm9kZT09IiNwbGF5ZXItY29udGFpbmVyIil7CgogICAgICAgICAgICAgICAgICAgIGxldCBuID0gMDsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG4rKyA8IDEwMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhbmVsVGlwVmlwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhbmVsLW92ZXJsYXknKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwYW5lbFRpcFZpcCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsVGlwVmlwLnN0eWxlLmRpc3BsYXk9J25vbmUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDEwMCkKCgoKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL+S5kOinhumAiembhuWkhOeQhgogICAgICAgICAgICAgICAgaWYobm93Tm9kZSA9PSAiI2xlX3BsYXlib3giKXsKCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpCbG9jayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qX2Jsb2NrJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighakJsb2NrKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPGpCbG9jay5sZW5ndGg7aSsrKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9JZCA9IGpCbG9ja1tpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmlkJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBgaHR0cHM6Ly93d3cubGUuY29tL3B0di92cGxheS8ke3ZpZGVvSWR9Lmh0bWxgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpCbG9ja1tpXS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgnaHJlZicsbGluayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LDMwMDApCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9C56uZ5aSn5Lya5ZGYdXJs5aSE55CG77yM6aG16Z2iY2xhc3PkuI3kuIDoh7QKICAgICAgICAgICAgICAgIGlmKG5vd05vZGUgPT0gIi5wbGF5ZXItY29udGFpbmVyIil7CgogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGxheWVyLWNvbnRhaW5lcicpICYmICFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnB4LXBsYXllci1jb250YWluZXInKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93Tm9kZSA9ICcucGxheWVyLW1hc2snOwoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93Tm9kZSA9ICcuYnB4LXBsYXllci1jb250YWluZXInOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0sMzAwMCkKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKuiFvuiur+inhumikeeCueWHu+WFtuWug+inhumikei3s+i9rCovCiAgICAgICAgICAgICAgICBpZihub3dOYW1lPT0ncXFQQycpewoKICAgICAgICAgICAgICAgICAgICBsZXQgZmlndXJlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmZpZ3VyZScpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgZmlndXJlRGV0YWlsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmZpZ3VyZV9kZXRhaWwnKTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RJdGVtID0gWy4uLmZpZ3VyZSwuLi5maWd1cmVEZXRhaWxdOwoKICAgICAgICAgICAgICAgICAgICBpZihsaXN0SXRlbS5sZW5ndGggPiAwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaHJlZicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsaW5rKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBsaW5rOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL+azqOmHiuaYr+WkmuS4quaSreaUvumAiembhuWMuuWfnwovKgogICAgICAgICAgICAgICAgbGV0IGVhcmVDbGFzc05hbWVBcnIgPSBqeFZpZGVvV2ViWzBdLmFyZWFDbGFzc05hbWUuc3BsaXQoJywnKTsKCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlYXJlQ2xhc3NOYW1lQXJyKTtyZXR1cm47CgogICAgICAgICAgICAgICAgaWYoZWFyZUNsYXNzTmFtZUFyci5sZW5ndGg9PTApcmV0dXJuOwoqLwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewovKgogICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8ZWFyZUNsYXNzTmFtZUFyci5sZW5ndGg7aSsrKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy4nK2VhcmVDbGFzc05hbWVBcnJbaV0pKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1NlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZS50YXJnZXQucGFyZW50Tm9kZS5ocmVmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1sb2NhdGlvbi5ocmVmOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMDApCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9TZWxlY3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJytqeFZpZGVvV2ViWzBdLmFyZWFDbGFzc05hbWUpOwoKICAgICAgICAgICAgICAgICAgICBpZih2aWRlb1NlbGVjdC5sZW5ndGg9PTApe2NvbnNvbGUubG9nKCfor6XnvZHnq5nmkq3mlL7ljLrnsbvlkI3mlLnlj5gnKTtyZXR1cm47fQoKICAgICAgICAgICAgICAgICAgICB2aWRlb1NlbGVjdC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhlLnRhcmdldC5wYXJlbnROb2RlLmhyZWYpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1sb2NhdGlvbi5ocmVmOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwMCkKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LDIwMDApOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgcGxheVZpZGVvRnVuYygpOwoKICAgICAgICBuZXcgVmVyc2lvbkNsYXNzKCk7CgogICAgfQp9KSgpOw==
Add Comment
Please, Sign In to add comment