Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_💯懒人专用系列———全网VIP视频破解去广告@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDwn5KvIOaHkuS6uuS4k+eUqOezu+WIlyDigJTigJTigJQg5YWo572RIFZJUCDop4bpopHnoLTop6Pljrvlub/lkYoKLy8gQG5hbWVzcGFjZSAgICBsci10b29sYm94LVZpZGVvUGxheQovLyBAdmVyc2lvbiAgICAgIDEuMC4xMwovLyBAZGVzY3JpcHRpb24gIOKtleeyvumAieino+aekOe6v+i3r+S4uuWkp+WutuaPkOS+m+S8mOmFt+OAgeeIseWlh+iJuuOAgeiFvuiur+OAgULnq5koYmlsaWJpbGkp44CB5LmQ6KeG44CB6IqS5p6c44CB5pCc54uQ44CBUFBUVuetieWQhOWkp+inhumikee9keermShQQyvnp7vliqjnq68p6KeG6aKR6Kej5p6Q5pyN5Yqh77yM6K6p5L2g55yB5Y676LSt5Lmw6KeG6aKRVklQ6LS555So44CC4q2V5Y676Zmk5Y6f6KeG6aKR5bm/5ZGK44CC4q2V5Y+v6Ieq55Sx5aKe5Yqg5L+u5pS557q/6Lev44CC4q2V5Y+v6Ieq55Sx6YCJ5oup56uZ5YaF5aSW6Kej5p6Q44CC4q2V5Y+v6Ieq55Sx5L+u5pS55Zu+5qCH5L2N572u44CB5aSn5bCP44CB6YCP5piO5bqm44CC4p2M5ouS57ud5pS26LS544CC4q2V5oyB57ut5pu05paw44CCCi8vIEBhdXRob3IgICAgICAgbGFuaGFoYQovLyBAaWNvbiAgICAgICAgIGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBR1FBQUFCa0NBWUFBQUJ3NHBWVUFBQVE4RWxFUVZSNFh1MWRDWFFVUlJyK2FwSVFUMXdRdzZFWUJjU0VyQ2dLQ29Rb3dvb2NMaXJLZW9Bb0xENXgyWUR1K2hUQ1BuZGRKZUM1Q3Q2Z0lCdGRsVU1ReEFQRTk1Z01La2Job1dHQ0tNZ3BzUGpVb0VzSWtOcjNUYWRoTXVtZXFlNnVuZ1JJOFNCQVY5ZnhmL1dmOVZlWGdJY2lwY3p5OFBwUi9hb1Fvc3pOQklXVGw2U1V2UUFNQUhBSmdGYllzU3NkSDVlMHdpY2x3TXBWd0s3ZFRwbzdldXBtTkFPNmRRYTZkREordHNqWUNHQUxnR0lBN3dvaCtGT3BLQU1pOSsyN0dZMGFEY1NXN2QzeHl1c3RFQ3BKdzJiMjJWQnFVU0N6TlpCM3lUNk11R2tybW1jc1IyWGxJcEdlUGsrRlVrcUF5RzgyL0JtbnQ3d1d6ODY4QUMrOTJsU2w0WVk2QU5JYkFiZmNzQXQzRGl2QnR1L25pM1p0cGlXaVMxeEE1QTgvZE1lODl3YWc3Vmw5OGVEajUyTG5yaE1UTmRqdzNJSUN6VThyeC8zM3JNV0dEWXN4c085aWNkcHBuOXZSeVJZUXVYdjNJS1NrRE1Da3FUMng4SVBUSVpEZVFHd1BGSkN5QWdPdi9BNzM1Uy9GZnJGUU5QL05CMWF0V1FJaWY5NDdCUHNyQm1QVVg3dWo5T3VtRUVqeE1KU0dWMDBLU0hrQU9lMTM0c1VuUGtKcXlselJ1UEg4V09MVUFrVHUyM2NqRHNvaEdKR2ZpelhoSmczVTlJRUNIVHZzeEt5blAwUmFXcEVRNHQzb0htb0FJcVc4RE1CSTVFL29oMlhMVC9WaEtBMU5taFM0dXY5MkZJNS9DOEFNSWNRaG5WSVRrTTgrZndqck45MkVCeDgvQzBJRUdxam5Jd1VvdmlZV2hIRlc2NW5pd281UG1EMGRBa1R1K3JrdlVnL2VoVDZETDhYLzloM3Y0MUFhbWpZcGNNTHg1WGovelNVUThrblJ0R25FZVR3TXlNTDMvNEhQVncvRkcyKzNnUkJLL2tsU0tkdjVBdUQwRnNEcExRMlBtTVg4ZCt4QUdEVmdLVnNQYlBzZUtQc0dLRm1kMU9FcWRTYmxRZHd3OEN0Y2RORTA4ZnZmUFhNSUVMbGp4M2tRcWVOdzVmWDlVSG1nZmlqeVZpMkFYajJBaXpzQnZTOVZtbC9DU2dUcXMxWEFzcUFCVW4wb2pkSyt4L3R2ekVOS1lKSm8xbXhiaEJOazRXT0RJRlBHb21oT1Z3alJxTTdHZWZKSkJnakQvZ0JrbmVQdk1NZzVzOTRFbGhVRDIzZjQyMWU4MWlWK3dZaWJQNEtRajRoN1JoY2JnSFRyUHhwVnVCM2xQNTlYSjhxYzNIQk5QK0NXd1VEams1TlBuTGNXQTgvT3FCdGdKQTZnVmNzU3BNaW54UWR6WGpVQTZaQlhnS3FxWVJBNEY4bFVIK1NJUHcwM09LSStsTG9BUmxaVkFTaEZWV0M2V0ZjOHhRQWtKL2VmT0lnaEVLTE5ZVFh2TTRXdTdndU1HK09jSXloZXR1MHdkSUZaS0g0SXJzbGQ1RGdxZnlwOS90MUpLZDhEL0h1MndUSEpLRklDRXVzUUNNd1NhNE9GMVNLcjMxVDh1R2NRaEd6bE80ZVFRQk1MREdXdFVxaDhTWHhUSWUvNVJlV3R3M1VJRksweTlzZWZXZTNVM3FlRk5xSFFmK1V2eVJGeUExTHdxaWdOM1c4QTB1K21JbXphM0E4US9vYldlK1VCRThjbjVnb1NmZjY3d1B6RitnbkNCVEY2Qk5BN3orQ3FST1cyTVRXNU1WRjlwODhKaU1CV25IRGNIRkd5OUc0RGtMd0I3MkQzanowaEFpYzRiVSs1L24zNWlYVUZ4ZEV6THh0ZytGMElCa0VoT1BIRUdrVll0LzcramtaaU41bzJXU1JDQzRjYmdIUzgvRU5VVnVZaUlQd0pzVDgwSHJnMnpxVElFUVNDc3JzdUNxMDdBbVBITVRsNS9vNUt5ajFJVFZrbXZseCtqUUZJZHZmbGtYMXlFZERyZzNDQ1V3cmo2d3M2YVFXRmdGUGRvSnRFNUpMeFl3Q0sxZWhDcnIxaXNPN2VhclluNVY1QUJrVjR4WlhWZ1BUNEdFQm5DS1JxN1huR0ZIc3dDTURrS2NrUlQwNG1SVUFJREFINmJEVlFNTkYvLzBSaUg0QlBSTGk0cHdGSVZ2ZVZnTGdRQWFGdkl5cWVtS0xsTkdHaWZvWHRoUEQxcWE2VSt3SHhxUWdYNTVraTYzTWdjTDYyblVINkY1VExWb1ZnM0paZjl5TEtEU0EwbWU4YlkzRDloOHVCQ1pQMHpJUGVPbEFpd3NYZFRFQldRYUlqQWdIdmV5QmsrYW1GUng4WW5ORUhieG9PcDFub3ExdzN3ZzIwTmQrcGtnY0IrWVVvVzNGeGRlZ2tkelVrdk1leEtIZm52bXp0Wnh6Sm5FSHlrVHZtV25qdjlPaHBJWG9wRWdSa3RRaUhPcHNjc2daQURvUkhEckZUNGtjNkdDUTJGOXNTRzdQOHV1SGU5Q0gzUlNEWGlQQ0tDNnNCeWYzU0FNUkRaSkU2ZzdvanR0Q2FvczZvTC9zUFhsYXluVzVrV0dlNHhkeFYrNnFTVlpCWUk5YUZPbFZiV2JsZlFhQ0RhMERvYjFDK1dvWE9HUTlLaHVldE9ua3Y5VGpQZVRPc1BYc3ZJUllwR2ZIOVNvUkQ1eDhHQk9pQWdFc09ZYkNRK3hteGhVNWZmb0VYRXRTL2QrMk1GaTljVWgyQ0YrRVZIVTJsWGdxSmJGY2NZaWRiS2FybzRkYTFCKzRIcERPbkFsMHVxTjJ5V3k2UlVrSmlyU2dML2JZYWtCNXJ3Yk1lYm5TSUhYZlFDNityMkpRZklFUzN5VEQrekNuNkpFSVZOMFdpQWNuS0RWZnZGanJMTnJIVEhUcmlQMnlib1hvbU9IQURpcWJsZ3ZmOEpyVjYrMVpjd2xBTERSaW5oUndpRUJaclF6bW1EaWx6dFgxcloxbnBVT1JXSmpRZHNjbFQvZDJmVUNXbWxWL2kxaWVKQUNMS3hOcmlEdDRBb1JNWW14MmlnenRJbE5LZ1BXa1l0aUF3ZFprdHd0RlJ3VE5zejYxaVdwSVUwMjZLRmtEc2xEbjFodHVCUlU4bUhpQm1QWE1QNVVnM0hBeWx2azZVaGJMZGN3aFhCak5HWW90WHI5VnNUd1VRMXVXT0hoZEFmZEl2VHJta090RkJsSVd5cWdIcHNRNUN0bmVVNEdDbDFPaU5FeEFkUlJVUXN5OHFma1pmbzdOUmRJd2pHVzFvQWNTS1lMckVWU0lkRW85SWROQm9WQ1JidnpDdDZacit3SjQ5UmdxUmsxQlJMVUN5ZTN3TkljK0p5cjJPdnk3czdIQjY1ZlRPZFJRcndHbFdxdVphTVUyVWhFbUdmb20xTmlsR0daWlhYUlFSUU1UWG9xejRYSE1MMXhrZ2R1YXV6bVFBSzBCTXM1TDZpMk5JbE1aRHdsRHhGODNSc1VUczI3QVMzNDVNNEFnZzYwVzR1TDBaN1YwUG9KMnlEckZTNkxyTTNYaEtQWHFTQklQUlY2c1lXaXpwL05ZdlZvRFFES2JvVkNwZUFkSHBwZG9OT0I2SFJMOURCMjNjV092WVVtemIxQzhQVDNFbTMxVUl5aDNTMkd3VkoxNTdKSEtDYjBRNGRJNjVRZlVOSU5vcWM0aG5GbFdZcFNvZ1psUFVhNFVGYXJtOFRLcCtlS28rL1dJbE1jaVZmUlNUeUQwREVydTNUS0k0a3BrK0FHSTJtU2pwemF5bk02bmF6aWRUMWFrUlFPUzNJcnlpblRzT2NicDZGZWhmcTRxWFBxaGZUTVdmcUcrdVpJWmh2RmlIMUdPTWVzZVdPZ1ZFZDdqZEN5QW1ZUmplS1p5Z3JsL0dGTGdUWTNadVFBTWdOdXlncWwvYzd2cHBCeVFyOTF0SGgzVjByTjVFb3NTUFB1ejhwK2l4cUs3cTZIZTgrbVhWWjBSRVdhaXRHVnc4K2dGaGFDTVNLbzlLZEl0ZEZQVHF1MXJrQmlSYVBKNlZ1bkZveHowZ1ZtYXZ6amdXQ2FDTFF5aE9HSlZXT2JIbGRtUE5DaEFuZ1ZZTER0a0FnYk05K1NGT0hLRkVLNDdQbVNVWWUvek1TUklCRlRxQmlIY3V4UndIeHo3NUtmY09vdzdIVUdLaktBdTFNVVdXTTBDOE9rSXFnTVNtMjZpdU9KcThsT2txUjZ3WjdwazB4WnZKRzFrOEZqdW5Ua0luUnJUWEF5QjJTb3p5VjJkMGxhdWNLNXkrZ2txeUhVRWNseDlmVDVDQUhDTkZMQ1BDT3NackpWNGR1UUhWZ0lSTkRzbk9OVGhFOVV5MFhlS3h6dkM3Q2hlWmRhS1BDU1I2ajhBeUFxd2FHay9VbnAzSjYwUzh3aXNnZGtwWHAyS242T0ZCVVI3TWpCd0duVkZidEpoMVZQVUVnZEM5bytqVndpSXRqZERKZHlLODRtd3pkTElSRVB4R1ZxTDFjUGk1bFNKekVsQkwxSk5WWWpNekljMlZUWVd0b2lmOFBqcG5wVDlVOVoxSkF5MkEyT2tSWFVrT1ZnRk15bVYreFVGRlQzQ3lESGpxMGhOV0M4Z3U4OGFSL2lCelJOaGtrd2lIem5MUElYV1JCc1FJcmNySGFSZ29wUFdrUzAvWWNiUGQ4UVNuaTdJMklMbmZBU0pUVmFjZkdwK1ZyMENpY1IvQXEvWGlOT3VFZzZLbzRPclVyU2ZzQUxIaVlqYzdwOForeUdZUkRtV2FXN2p1QUxFTE96dGxXYXNKT3dIRWJ6MWhOVDZkYzljR0NLMGNIdk9LVFRiUXdTV3FnTkN5by9Ya2xTTVRHUm14ejYyNHcrMFJEQXRBTmdFNDA1R1ZaUTdRenV6enVvT1lDSkJrSGVxM0FzcHV6azY4OCtoMnRRSVNqMHVjNUNiRlR0enVVQXhsTkQvRmtTdzlFVHV1ZUNlTm84MXlKeHluRlJCMmJMZGkzRzc0c00zWVdGWmRmNkRHSlBDVWlkWWY1ZlFpRVF4QXRvaHc2RXhUcWJzWFdXektqa3Y0VEllQ2Q3TGEvS3diNzZTeGwrTjdCaURiUkRoMGhoNUFyRlowTkdHYzJ1VitFdFZ0MjNieE8yMkxUdTVBYWZIbCtnRGh3T3prdmc2cnl5MGhkYnhIQ2NBUWlkVnVvODU5b05KZzlkZUFzbk0zQTJqdHlzcUtubkE4MGVWRm4rZ2dxdHMyT0NjZThMVDZqakQxMnFEaCtpSUNwY0hyVFE3UkF3Z25iUmVPNWpPM1ZvaGJZbnA5THg0WWJGdjNka05wY0tRSnlGWitTZDB6aDVnRXNJdnhIRW1BSkFMRGkxVmx0MUJLZzNlTHlGMkVPVDArQW9UREQ5ekdXWDY2WWp4ZVY3amI5Nm5BZVFyWUxwRHAxZ0ZNTko3UzRMMEVwQzl5OHZSOUJ0VE9HamxTek4raDF3UGp4OXFUemk4dzJHTnA4TzhFNURyazVPazcwWEtraWl1VkR6ejdDWVlCeUdRQ2NpdHk4bVltNGlibDUxYml5bW9ITFhvZjNNeEVaNkF3MlVGQ00wdUYwWVo0eFc4d0RFQ2VJQ0Nqa0pQM25ETEI0MVZVRVZmeENHQUN3OG43dmJua0pGMG9XZUsyTlBnMEFma0xjdkllMXdKSUluR2xtcWJEd2ZCckRRU0c5M3ZvTEx5ZmhPTlFTWXdndDlLMFRWWWdzelQ0QWdFWmg1eThTVnJtYkNldThzY2IrK0J1YnNvaDEzeklHM0hXdTd1NmlMcUJuMUtpZjhRTUZwVXRZQktqTGo3d1hCcWNRVUR1eHdXOUhzRCsvZDR3c1JOWEpDU0pva29JbFZHd3pmSmZqRFBoVnVmQlNmekdKN203cFVkWE5xUEtQS0xycEtVQnE1Y1ZFWkNIY09uQUNmamhSNmROMUt4djk5MnNSSzJTQUpUbmlZNDRKMnJINjNNem05SHJGMGJkanVQVUpzRHl0LzlEUUI3R29OdnV4YnB2M1RabHZQZnhZdWRjWUticDhIMlZtd3E4amRENmJTNEk2aW8vMDRWVXhuMXVXMkRlekRrRTVFbmtqeC9yU1huRyszaXkxV0RpYmI5R0ZHNC9RK2I3eVRYVUVkUk5Lam5ES2dUMVdxZHZMK0R4QitZVGtLY3hyV2cwbm56QmZaT3E0c3BwZGdqQkllZndiSWZUcTR0aVowTk9NRy9wSVJESjluY1NVZGU0WDJVUkFYa2VLMWZkNGVtN3N5cml5dnpBbDF0Q2tGc1lBcWZ4d0gySjZIQzR5VW5SYlZQeDg5OEVnU211ZnZzMWlRaWU2UG1jbDc1SGR2dDdqT0JpWmVVaVhEVzBiV1RnVGt1OGNEdmJTbmJ5bXRQeDE0ZjZ6VE1xc09UTmxTSTE5VElqL0M3bFhEdzFyVGRlbkhXSzQvSEYrMHlzbVRQbHVORmo2QVYrVFc3VXJadHg4Zm12aTI2WGpETUEyYnYzanlqZk14SlgzdEFKbGZ1ZFgzc1VxME9TbFZ0N05PRFdLTzBYTEptOURBSlBpV2JObGgwNmZ5QVhMWjJJTDFiZmhOZmV5a1NnNGVydXBHRE5LN3lIRGk1RHAvTmVFZjE3UDhZK0R3TlNYcDZIQTNKVTVJTGlYL2ZXand1S2swS1ZPdXprbE1ZNzhVN1JBaHc0OEx6SXlJamNsRm5qaEk3ODRzdGI4TjJXa1NpWTJBVUIwWENudXA5WThXYTJTWDlianN6TTZhSlRoL2xtVjdXT1RNbG5YaHFIcmR1SFlzRjc3UUdSNXVlWWp0bTJxK1JlRExwcUZWcTNtQ251SEQ0dG1nNjFBZm4xMTA0UWFiZGh4T2hCV0JNKzQ1Z2xtbDhUbDdJQ0hiUFg0dFFtUmVMWlIvOFYyNDNsb1VMNVUwVWZ5TXFodVAydVBsajdkWE8veG5iTXRVc3djckxLSU1Scll2YjBSNjNtYjN2S1U1YVhYNFBVdE1HNGYzSlBMRnJhWE91VmVzY2NFaEZuYnkvNlgxR0duOHJmRUM4OThiQWRDZUlldTVVVkZRT1FudDRmeXovdWlYODhjaVoyL1BkRVYxZGFISXNBUk04NW85a2VQSER2bDFpL2NZNFlPYVNXbUlxclEySnBKNlhzakEwYmVxTmx5MXc4TnpNYjA0c3lBSEdpY2VlaGcyUFV4eUlvdkE1djFMQWZjTWV3RW16YnRVQzB5M3d4RVJtVUtTcjM3KytGSmNFZXlNbnFpRm12WjJMRnlpYll1T1ZrQ0J3UGlVWUlJQURKMzFKVVowQkd0MjM4blg5R011K2pqYnpxL3pCcjEzcHUxcTN4SU5HODZ2WjVabXNndDBzRmJyMXhNMXEzQ3FLeWNyRklUNStuTWlobFFBNlJaZXZXcnBnK3V3TXltbVJpVUwrV0NINmFnYzlXTmNiS0w0N0R6dDFwZ0V3RkJNRkpRUUFDVmVCbGxRSkVpYjhncTM4VG5NaVhDZzZERmVtRXp3OEJWaHRVbFZrNXIrT1lEalc2YU5FYzZOb0o2SEloMFBVaW9HWHpDZ0NiVUY0ZVJPUEdpNFVRSmFwRDhqWVExVjRhNmlsVDRQK0dDNU9sK3hJS253QUFBQUJKUlU1RXJrSmdnZz09Ci8vIEBtYXRjaCAgICAgICAgKjovLyoueW91a3UuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5pcWl5aS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmlxLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoubGUuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vdi5xcS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9tLnYucXEuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi50dWRvdS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLm1ndHYuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vdHYuc29odS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLjE5MDUuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vZmlsbS5zb2h1LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyouYmlsaWJpbGkuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5wcHR2LmNvbS8qCi8vIEBncmFudCAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZAovLyBAZ3JhbnQgICAgICAgIEdNX3VucmVnaXN0ZXJNZW51Q29tbWFuZAovLyBAZ3JhbnQgICAgICAgIEdNX3NldFZhbHVlCi8vIEBncmFudCAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICBHTV9kZWxldGVWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX2Rvd25sb2FkCi8vIEBncmFudCAgICAgICAgR01feG1saHR0cFJlcXVlc3QKLy8gQGdyYW50ICAgICAgICBHTV9zZXRDbGlwYm9hcmQKLy8gQGNvbm5lY3QgICAgICBhcGkudHlwZWNocm9tZS5jb20KLy8gQGNvbm5lY3QgICAgICBnaXRsYWIuY29tCi8vIEBkb3dubG9hZFVSTCBodHRwczovL3VwZGF0ZS5ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzQ2Nzc3Ni8lRjAlOUYlOTIlQUYlMjAlRTYlODclOTIlRTQlQkElQkElRTQlQjglOTMlRTclOTQlQTglRTclQjMlQkIlRTUlODglOTclMjAlRTIlODAlOTQlRTIlODAlOTQlRTIlODAlOTQlMjAlRTUlODUlQTglRTclQkQlOTElMjBWSVAlMjAlRTglQTclODYlRTklQTIlOTElRTclQTAlQjQlRTglQTclQTMlRTUlOEUlQkIlRTUlQjklQkYlRTUlOTElOEEudXNlci5qcwovLyBAdXBkYXRlVVJMIGh0dHBzOi8vdXBkYXRlLmdyZWFzeWZvcmsub3JnL3NjcmlwdHMvNDY3Nzc2LyVGMCU5RiU5MiVBRiUyMCVFNiU4NyU5MiVFNCVCQSVCQSVFNCVCOCU5MyVFNyU5NCVBOCVFNyVCMyVCQiVFNSU4OCU5NyUyMCVFMiU4MCU5NCVFMiU4MCU5NCVFMiU4MCU5NCUyMCVFNSU4NSVBOCVFNyVCRCU5MSUyMFZJUCUyMCVFOCVBNyU4NiVFOSVBMiU5MSVFNyVBMCVCNCVFOCVBNyVBMyVFNSU4RSVCQiVFNSVCOSVCRiVFNSU5MSU4QS5tZXRhLmpzCi8vID09L1VzZXJTY3JpcHQ9PQoKLyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioK5bqUR3JlYXN5Zm9yay5vcmfnvZHnq5nop4TliJnopoHmsYLvvIwK5oeS5Lq66ISa5pys5bCG6KeG6aKR6Kej5p6Q44CB6Z+z5LmQ5LiL6L2944CB6KeG6aKR5LiL6L29562J5Yqf6IO95ouG5YiG5Li65aSa5Liq6ISa5pysOgpodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvNDY3Nzc2Cmh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80Njk2MDQKaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzQ2OTY4OQpodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvNDY4MDE1Cmh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80Njk1MjEK5Y+v6Ieq6KGM5YiG5Yir5a6J6KOF44CCCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIGRvbUhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOwoKICAgIHZhciBkb21TdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CgogICAgZG9tU3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7CgogICAgZG9tU3R5bGUucmVsID0gJ3N0eWxlc2hlZXQnOwogICAgLy/lubPlj7DliKTmlq0KICAgIHZhciBpc01vYmlsZSA9IC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUG9kfEJsYWNrQmVycnkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwoKICAgIGlmKGlzTW9iaWxlKXsKCiAgICAgICAgbGV0IHBsYXlMaW5lID0gWwogICAgICAgICAgICB7Im5hbWUiOiLnuq/lh4AxIiwidXJsIjoiaHR0cHM6Ly9pbTE5MDcudG9wLz9qeD0ifSwKICAgICAgICAgICAgeyJuYW1lIjoiQuermTEiLCJ1cmwiOiJodHRwczovL2p4Lmpzb25wbGF5ZXIuY29tL3BsYXllci8/dXJsPSJ9LAogICAgICAgICAgICB7Im5hbWUiOiLniLHosYYiLCJ1cmwiOiJodHRwczovL2p4LmFpZG91ZXIubmV0Lz91cmw9In0sCiAgICAgICAgICAgIHsibmFtZSI6IuWQrOS5kCIsInVybCI6Imh0dHBzOi8vanguZGo2dS5jb20vP3VybD0ifSwKICAgICAgICAgICAgeyJuYW1lIjoiWVQiLCJ1cmwiOiJodHRwczovL2p4Lnlhbmd0dS50b3AvP3VybD0ifQogICAgICAgIF07CgogICAgICAgIGxldCB1c2VXZWIgPSBbJ20uYmlsaWJpbGkuY29tJywneW91a3UuY29tJywnd3d3LnlvdWt1LmNvbScsJ20ueW91a3UuY29tJywnbS52LnFxLmNvbScsJ20uaXFpeWkuY29tJywnbS5tZ3R2LmNvbScsJ20udHYuc29odS5jb20nLCdtLjE5MDUuY29tJywnbS5wcHR2LmNvbScsJ20ubGUuY29tJ107CgogICAgICAgIGlmKHVzZVdlYi5pbmRleE9mKGxvY2F0aW9uLmhvc3QpID09IC0xKXsKICAgICAgICAgICAgY29uc29sZS5sb2coJ+S4jeaYr+W6lOeUqOe9keermScpO3JldHVybjsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNldENvb2tpZShjbmFtZSxjdmFsdWUsZXhkYXlzKXsKCiAgICAgICAgICAgIHZhciBkID0gbmV3IERhdGUoKTsKCiAgICAgICAgICAgIGQuc2V0VGltZShkLmdldFRpbWUoKSsoZXhkYXlzKjI0KjYwKjYwKjEwMDApKTsKCiAgICAgICAgICAgIHZhciBleHBpcmVzID0gImV4cGlyZXM9IitkLnRvR01UU3RyaW5nKCk7CgogICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjbmFtZSsiPSIrY3ZhbHVlKyI7ICIrZXhwaXJlczsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGdldENvb2tpZShjbmFtZSl7CiAgICAgICAgICAgIHZhciBuYW1lID0gY25hbWUgKyAiPSI7CiAgICAgICAgICAgIHZhciBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpOwogICAgICAgICAgICBmb3IodmFyIGk9MDsgaTxjYS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXS50cmltKCk7CiAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWUpPT0wKSB7IHJldHVybiBjLnN1YnN0cmluZyhuYW1lLmxlbmd0aCxjLmxlbmd0aCk7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KGRvbSxkb21JZCl7CgogICAgICAgICAgICB2YXIgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5ib2R5OwoKICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGRvbSk7CgogICAgICAgICAgICBuZXdFbGVtZW50LmlkID0gZG9tSWQ7CgogICAgICAgICAgICB2YXIgbmV3RWxlbWVudEh0bWxDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpOwoKICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7CgogICAgICAgICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnRIdG1sQ29udGVudCk7CgogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdG9hc3QobXNnLGR1cmF0aW9uKXsKCiAgICAgICAgICAgIGR1cmF0aW9uPWlzTmFOKGR1cmF0aW9uKT8zMDAwOmR1cmF0aW9uOwoKICAgICAgICAgICAgbGV0IHRvYXN0RG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CgogICAgICAgICAgICB0b2FzdERvbS5pbm5lckhUTUwgPSBtc2c7CgogICAgICAgICAgICB0b2FzdERvbS5zdHlsZS5jc3NUZXh0PSdwYWRkaW5nOjJweCAxNXB4O21pbi1oZWlnaHQ6IDM2cHg7bGluZS1oZWlnaHQ6IDM2cHg7dGV4dC1hbGlnbjogY2VudGVyO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUpO2JvcmRlci1yYWRpdXM6IDRweDtjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO3Bvc2l0aW9uOiBmaXhlZDt0b3A6IDUwJTtsZWZ0OiA1MCU7ei1pbmRleDogOTk5OTk5OTtiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCk7Zm9udC1zaXplOiAxNnB4OycKCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG9hc3REb20pOwoKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgZCA9IDAuNTsKCiAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gJy13ZWJraXQtdHJhbnNmb3JtICcgKyBkICsgJ3MgZWFzZS1pbiwgb3BhY2l0eSAnICsgZCArICdzIGVhc2UtaW4nOwoKICAgICAgICAgICAgICAgIHRvYXN0RG9tLnN0eWxlLm9wYWNpdHkgPSAnMCc7CgogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0b2FzdERvbSkgfSwgZCAqIDEwMDApOwoKICAgICAgICAgICAgfSwgZHVyYXRpb24pOwoKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHBsYXlWaWRlb0Z1bmMoKXsKICAgICAgICAgICAgLy9jc3MKICAgICAgICAgICAgbGV0IHBsYXlWaWRlb1N0eWxlID0gYAogICAgICAgICAgICAuemhtX3BsYXlfdmlkb2VfaWNvbnsKICAgICAgICAgICAgICAgIHBhZGRpbmctdG9wOjJweDtjdXJzb3I6cG9pbnRlcjsKICAgICAgICAgICAgICAgIHotaW5kZXg6OTk5OTk5OTsKICAgICAgICAgICAgICAgIGRpc3BsYXk6YmxvY2s7CiAgICAgICAgICAgICAgICBwb3NpdGlvbjpmaXhlZDtsZXQ6MHB4O3RvcDozNjBweDt0ZXh0LWFsaWduOmNlbnRlcjtvdmVyZmxvdzp2aXNpYmxlOwoKICAgICAgICAgICAgfQogICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fd3JhcHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uOmZpeGVkO2xlZnQ6NDBweDt0b3A6MzYwcHg7CiAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTk7CiAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2xpbmV7CiAgICAgICAgICAgICAgICB3aWR0aDozMjBweDsKICAgICAgICAgICAgICAgIGhlaWdodDozMTZweDsKICAgICAgICAgICAgICAgIG92ZXJmbG93LXk6c2Nyb2xsOwogICAgICAgICAgICAgICAgb3ZlcmZsb3cteDpoaWRkZW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVfbGluZV91bHsKICAgICAgICAgICAgICAgIHdpZHRoOjMwMHB4OwogICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAgICAgICAgIGZsZXgtZmxvdzogcm93IHdyYXA7CiAgICAgICAgICAgICAgICBsaXN0LXN0eWxlOiBub25lOwogICAgICAgICAgICAgICAgcGFkZGluZzowcHg7CiAgICAgICAgICAgICAgICBtYXJnaW46MHB4OwoKICAgICAgICAgICAgfQogICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZV91bF9saXsKICAgICAgICAgICAgICAgIHBhZGRpbmc6NHB4IDBweDsKICAgICAgICAgICAgICAgIG1hcmdpbjoycHg7CiAgICAgICAgICAgICAgICB3aWR0aDozMCU7CiAgICAgICAgICAgICAgICBjb2xvcjojRkZGOwogICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmMjQ0NDM7CiAgICAgICAgICAgICAgICBib3gtc2hhZG93OjBweCAwcHggMTBweCAjZmZmOwogICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGk6aG92ZXJ7CiAgICAgICAgICAgICAgICBjb2xvcjojMjYwMDMzOwogICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZmNjMGMwCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLnpobV9saW5lX3NlbGVjdGVkewogICAgICAgICAgICAgICAgY29sb3I6IzI2MDAzMzsKICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZjYzBjMAogICAgICAgICAgICB9CgogICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fanh7CiAgICAgICAgICAgICAgICB3aWR0aDoxMDAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7CiAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTsKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGA7CgogICAgICAgICAgICBkb21TdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwbGF5VmlkZW9TdHlsZSkpOwoKICAgICAgICAgICAgZG9tSGVhZC5hcHBlbmRDaGlsZChkb21TdHlsZSk7CgogICAgICAgICAgICAvL3RlbXBsYXRlOmljb24scGxheUxpbmU7CiAgICAgICAgICAgIGxldCBwbGF5V3JhcEh0bWwgPSAiPGRpdiBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCknIHRhcmdldD0nX2JsYW5rJyBzdHlsZT0nJyBjbGFzcz0ncGxheUJ1dHRvbiB6aG1fcGxheV92aWRvZV9pY29uJyBpZD0nemhtbG9nbyc+PGltZyBjbGFzcz0naWNvbkxvZ28nIHNyYz0nZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoWkFDV0FQY0FBUEpFUS92Nytmbkx5UGpDd2ZSblpmblQwUEpLU2ZqR3hQdjI5UG5ZMS9OYld2djE4L2FVay9ybDQvcnc3dm5LeVBhSmlQcnI2ZmFhbVBSeWNmYUxpdnY1OS9KSlNQcnY3Zk5WVlBuZTNmcnQ2L05RVC92NitQZWxwUGFnbnZSM2R2aTZ1UHZ6OGZleHIvbk96UGVnbnZyazR2UjFjL0pHUmZycTZQblF6dmpDd1BuUzBQbloxL3Z3N3ZuYTJmZW9wL2VtcGZyYzJ2TlVVL2l4ci9SNGR2V0poL2VzcXZKSFJ2dng3L3J5OGZOU1VmTldWUGpCd1BWNmVmYU1pdm5mM2ZpOHV2V0RndnY0OXZycDZQcnk4UEpQVHZhWWwvblQwZm5XMVBlcnFmUnNhL1J2YnZXQWYvVjlmUG5rNHZpMnRmUmpZZlJoWC92dTdQTllWL0pGUlBuazRmYUhoZmFYbHZ2MzlmcmgzL2k3dXZuTnkvbk95L3JzNnZlcnF2UmdYdm5kMi9hR2hQV1JrUFYvZmZyaTRQcmo0UGl3cmZuTHlmYVVrdlJmWGZKTlRQakZ3L2V5c2ZSbFkvUnhjUHZ2N2ZlenN2aTBzdnYyOC9hYm12ZXFxUGVwcVBKTVMvZXlzUFdPamZOZFhQUnpjdnYwOHZSdWJmcm81dmVpb2ZlbG8vTlpXUG5aMlBOcGFQblUwdlJmWHZuSHhmaXVyUGpBdi9uUXpmcm41Zm5jMi9lMHN2YWRuUGU0dC9hU2tmTlhWdlJtWlBldHF2blkxdmk4dS9laW9QaXRxL2kvdmZSd2IvUjFkUG5lM1BhZW5mYWNtdmUzdHZuUnovcmo0ZmFYbGZWK2ZQV0ZoUEpMU3ZhTmkvV01qUFIwYy9hVmsvV1BqL2FkbS9ycDUvbkl4dlJvWnZSaVlmakR3dmFWbFBKT1RmZTJ0Zk5xYWZKUlVQZWtvdmFhbWZOYVdmVjhldm5kM1BuTnpQblYxUGVzcS9qRXcvVjZlUFIzZC9uZzN2cnc3ZmFXbFBlbnBmYWZuZldQanZpd3J2TldWZm5NeXZpNnVmVi9mdlY5ZS9uYjJ2cnU2L1JrWXZqQXZ2bkl4ZlJpWVBpOXZQZWduL1Y3ZWZlam9mZTF0UFdDZ2ZybTVQSklSL25jMnZOY1cvSlFUL2pGeFB2eThQV0RnZldCZi9Sc2JQVjVkL05wYWZOY1hQbmYzdmFJaHZSdmIvaXZyZm5YMXZOUlVmYUtpZlJ0YlBhWmwvTmVYUGU1dVBXQ2dQUnJhdmFJaC9Ob1ovbkp4L1dGZy9pOXUvUjJkZmpIeHZqSXh2TlRVdmkvdnZlMXMvTmVYUUFBQUFBQUFBQUFBQUFBQUNIL0MwNUZWRk5EUVZCRk1pNHdBd0VBQUFBaCtRUUVsZ0FBQUN3QUFBQUFaQUNXQUFBSS9nQUJDQnhJc0tEQmd3Z1RLbHpJc0tIRGh4QWpTcHhJc2FMRml4Z3phdHpJc2FQSGp5QkRpbHhJWUVTQUFDTUlqRnhwVUlXREFBNVVlRmpJNHVUSkJDeHpDc3hoazhpUWhUWnQ2c3lwd2FhR0RBc0hCT1V4bE9VTEpDV1F2S2l4Y0FPREFRTVliR2k2VWtHUEdqMFVHT0JLdHF6WnMyalRxbDNMdHFNQ0UwMU1pSzFLWXNRSUVsczdmbUZDYTlFV0Y0a1FoQ2lUUW9VSVRVelNmT3lRZ2tXS0RrR1NMdFdvQTlpdVpVRXphdzRnQlpxVklodFIyRVNCVTZGbWpEUU9DZG5NZWpNQ0xSTXlMckM1NEFMTm9LVXBqbkhSdW5mclR2VXVucG05NE1FZmtnTWNYQmlnY3VJbDNyNmpzejZqb0tJSkNSNGttTmd4RWtNajN5WG8vbWtDSmFpV0JUVmY5RmlaTTZsRWJ3U29UclE5eUVzSzZ3cXFTT1Z4S01OV2tqZXN1ZERjZkFCY1F3ZHJmVndoQTBVV2hJSElaa0wwUXFBYUsyem1pUTgzWkFURkVab1ZNaDhHeW1pR0FDVVdjRVRGRlFnRTlVQkVCbUNnQUFaak1VUUFDU1FNcUpBTVpXam1nbUlmZlpIQVNRdVVFaEVFSWp3aEFnUTJIbVJEVURZc3BBWjBRZDFSWWtnbmlNRkFGQkxGWUZNTVFDejBrazIySlhUQ2c1bWhRWllkVnBCangwSnkwQlptUWs0RVZZVkNkV1RHUVRwa0VWSlVBQzZBbHRBUE5tV2l3a0lRZkhrQkJBbjFZcWNWWmZrUnBVSSt4QUZFSEQ0bzBSQUJTUmFrQTRCQmpXSldCNW5GaHBBQlUwUXhSWXdZM1pHWkxtZmxzWnBOL21WTXVWSWJIQVNWaGF4bE1aTFpLVG1sRUJRSHNhUjFRb2cyOVNIZlNLVmtac1phNm1SR2dVWVRpR3BRQVVHOTRlZENPcGdVZ2hldmdMUkZVQzRjdEFRREhqQ3dCSGNLRlhxU0E0Z1N4RWVaRHVrVDFES09ITXVSSGtGcGNKQkxNTW0wVUp3MnpVa1FIRUYxZ2VwQ2Uyam1TekllTldOVE93ZnhkSkpQWGdiMUpnQVdoQkFVTUErMWxnSXpISjFReHhhYnJHblFuZ0VjdGRDU05pVkJrRGRCVlhBdFE3V3l4Z0VuaitUMFZGUlR5Y2dBQTBrU2JGTXJFRlhnMng2VW1DeVNWMkROUlZFV1FUSDZrTkhScFRJS0ZRUWFoRUZtR0JRZFZDRzV0QWFHR3hqOXNVQUZqSHlFVEZCbFJQVHFTUzhBRUVZZnJSVkNTRVZ1Qk1XSC9rZWJCQVdDMjBIVklaQW93bWk4V1FVaTRETlJuVGI1NGRGM05xVU5FUlpCMFVIUUk1elVyQmtPYytEYVVOODJIVVBRVzB6UTRIUkNCQ2dWQUhNRERSS1VPeEdsYUpQbEJjWERJV3NOaEFGUktFRU5RaEJqMkJ3QjJXMDI1UWExVFpaQ0pQdEpMaDlValRXdFNmS09RKy9hMUFCQm9wMUVHbENaRFJSQlVLekVIcFFYQ1Zrd2grR2JIVkxkUWxFRUpRVkJFZ2RBc1VLcW44U1VRTFBaVkV0RStaOUV2a0lZV0lUbU1vT0ZEbUF0SVlDSUdVSHVRUng3ekVRaFZzR0tWZ1pDdFpNc0NDSUpzd21yR0FJSlg3RW1FamY2RlVHdWs1M3RVQVFIUWNsR1JOQVhBQkE2QkJudTBVd0lGSktIb09EQUk5azdTUnRXR0JRWE5xUUovbVRZVEFRVVFvQ2dKTUlqaWdoS09YaG9rMG8wQkFwY2FNMnpFb0tKb0lEQkkydUlXa1NTYUJOYUxFUUdkNmhnWnNoQWc0V0lJU2lxOEVnbGdrS0NpRGpDSmlFb1J2bU1nTUxONE1BSUdWcUlJWUxpeElHMDZFVUhRNGhWN0RKQmdad2lLRVNMU0Nnc1lZaTdJV1FNTWRSTUJkaWdBNGQ4eXlaaUlBaVJqSVFreWRqa2ZnQVFSRkM0Y1VDTmRMQTFYSURDUTA2d3ZBQklDd0JhT2dtWHVCZVVnZHlBY2pZUlJFUzZZUWx6cUpJZ01vRERBSU5DaGpGRTVCSkJRUUN1MmdTa2l4MmtKc1VqeUNWUDBzYUg0TUVtQ0pBanhpVEFRaHZpVVNLT3NvazhDaExMQU15U2lLcGozVUErZ1J1SVNDSW93Z0FBRXlLWm1VbFdjaUowL3JQSkZRcXl5U05sNmlIdEN3cVdISUt5QUJqRGc1dEpaVVVtOEt1Y0VlU1BNTG9JbEFLd0xJZDBRVHJGdk1naGdzSUZrVndUanRxd3FHL3VtTWVLUUNJelBoQ0pLRmo0UDRaODd6NlV6RWdXYldLd2tZREtKaFVJbjB0Wm85Q00wQ0F6UnNqSWpHcDBFQjMwTHdBcGFFaU94bWhNalZpZ0FVRnBRU0FGTW9FcmVPQUtFMEJYUWxoMmtpWVpaQmFaK1FSRDJPRE5rbVlrR0puSjVFSFd3Sk1jck9HQkNmblNTWndwRUFNa0lwazdWSWdhZGhHQUJjRGhuaHRSd2dCdllhK0N4RzkrY0pJVFFxb1lsQkxNYkNpeThFUm05b2FRSEc0dlhZWnExMEhJR3BSdGtLVUlnY2dNTVJUU2dTUDhRSGlSWVVpMEZtS0JjV1NHRjAwcC9rTFlncUlJenhWRUFUUUlndW1tV2hGbVpBWVBRNUhCTFRJVEFoNXhKUmFaWVlkTzBuQThuT3JCTEFleXlUbDB3b1J1QmtCM1pzbGhBTmJCRW5UQVFqTWNtT0pIVnFzUVpBWUZFQU1SQnl5a0VBRUdtTlVpSjZBQXA0S0NCWVk1QkxlNlBSMUMxQVVUelJyRURMMFR5QTNtMEVwZk5PRWlGaGdHVkRYVGhWY3k1QVdtUFVMUEZBS3drd2pNSUNld2owMWNBUUFsZ0lFMUs4Q0RMQ1R5RFROb1dET0l1T0JEVUtZeWhjZzFBSFFWQ0dOdDhnVmlERk9TQW1DQUc5UWdwbWZBZ3hPcGFBMENORkhLaHh6Mkp3cmhhZ0NhWjVCRlJQV2wwamtKQjdMZ2pFbk1vQVBCb01ZYUFvSEwzbENISXZ6NmhiOUlRcU4vQXVBR2RleE4vak15RU9VMjg4a1dGaG1YQjlCd0xveEl3emVlZUM0QWFHQU1OL2NtQlQwZ0VBaUVUS0tDRUdBV0gvYnpTVFNRaEM5a3pRQVoxTXdJOXBPUU5IeGlFbUFRbzJZVzRJSmppR0VWaFowUEtEYURBdXc2eEFMaEFNYzhob0VLQ1pDQ0NXNUFiOVlPZ29aNm1xRmJzeTRJUkhscjZIUm1xZzBWRE1RcWNuMFFIeFJKQkpVaTNrME80Z2doQ01FVlJTYjJRQUIxRWtIUlVpalNqZ2d6K3hwamd0UXZBS0RNdGtQS2VjNkVESElFaFJTM1EvclpTWFYvWk5mdWpyZTg1MDN2ZWsvazNPbTJkMEZJcUIydEl1VGI0ZGIzUUliVFZ3RWN4elRkTTRnQUhzRHdCNGhYSVJSbytBTUdJSkJvYU9IaVdnaHFRV0FnY1ltcm9BTWdsMGovL21xajdBRGtoaUJRWGwxRHZvMFVBRkRMSmdkUXVIUWkwSW1ISzhTeUp6OUk2azZpem9KOCszbzd0Y25mWEI2VW1CZEVBRzd1eEFjWXdoakhETzhpRk1qTTBoWHlBYWtMNU9Vbk1UcEJrTzdtQ0V3OUlXK0ppMzRyMGdLL0xXVFFObWs1MFdFdWN6OFBzU2tWaXFaQ2ZpVDBnV0E5QUZvZkNOZFBJb0NDVUdBR0NXaGxBSWF1RXdra2N5R3QvUHJkOHk2UXZRZWc3d2Y1UUN2ZlBwU3kyd1FHQ1lGQlVDaS85cXkzbmU4Sk1YeFF2bzZSb1pwWklIRS95UW9Ta25xVjI3M29uMys4UWxxSmVZUXdMU3k4SG9pU3ZYb1F6ZHVrQlFteC9Fa2V2dmpZUXg0aEN6NUo3USt5TTZsUXhjVVdtMzFRYkM2UXFOdUU4NTNIdS9FVi9wTDhBQ3ovWkVaUk8wSXFISUFMSDRUdVBEL0l0eWxPa09JZlBTakhQd2p0RTNKa1FtVldJVE1JQ3RBTHdtYWJTS0FnN3JkMThCZDZ6cElRWVRabUMwRmVpRGQ2QlZGMXZ6Y3RzUGQrTmhGL0JaRnkyRmNRY2tabi9vWVI2RGQ0QlpGL05yRjZBQmlCQWppQkJ6RUQ5Q1I3WkFHQ3kwWVFIZmgvSThoMkVuZ1NKU0J4a2xBQ3dvZE5wRGNVRG5nU0NGQVF5d044RUNpREplaG1NRmdXL2FkOEF5RjZMUmlEbmplRDBvRUFNekJlRHBZUWFLZDZBOUY2VXppRVQxaUV2b0VBSzdDRG8xSXFwOElRL01VdUROR0RBVUI1VVBhREJ4R0FlaGRWRFRDSGRKZ0JBdkI5REJFcGs1SnNGS1pZREpHRUFmQXMxdGVFVHFoOVVFaUIvaFJCYlFGZ2JkQUhKZzF4aFNvSGlWdkloWWJvaFlnNEVkdEdja2tXRkV3R2NVR0JGSUNZRUhEWWVBT0lFZVRXSldSR1ZBNlJjZ0N3UE9KWGlJd0hBSTUzaVJMQmJxZG5FZC9XZW9SSGliRTRpeGtCYng4eGlKb2hocTlIaEhGb2d1cVdjbW1uRUtNb2k2VW9ibzVYZDZKSWdzY0lldXJHaE5QSGpOUklpc2c0RktuekVqM1hFRG00aGd2UmpMNklFZnhtUWdvQlRZVElFSzNuZXROb2pOeG9qY0pCSEFaM2JTY0JFUkpBaDNOSWZRWFJDQWtRa0FsZ0NBWUJBdnk0aXhVeGN0MDJFQUFuY0FhQmMxWEJBSVNVRnc0NUVOT0FDeXlBQzM2UVdoVTVFVk13QVUwd0FXWFlrU1Jaa2laNWtoNFJRVmxCa1IyNUQwM1FOTGtuUEJBTldaSmV3QUk4ODN3SmNSb2x5V0t2YUJEc2FISW1XWC9veEhPM1NHLzVVQlFhWUFsd2haSU1ZUXFBOGdPbVVKUk1PWlZVV1pWV2FaVUJBUUFoK1FRQmxnQUFBQ3dHQUFZQVdRQ0xBSWN5elRMeDBVWHhwVVR5WDBQeVNFUHlWa1B5ZVVUeWdrVHd5RVR6VFVQeHlrWHlpa1R3eDBUeHRrWHlVVVB4dDBUeHJrWHh4a1h3djBUeW1FVHlpMFB4dVVUeWFrUHh5RVh4eEVYeWFFUHh1MFR4ekVYeHpVWHlrVVR4bEVUeVVrUHlqMFR4aGtUeHBFVHlia1R4dEVYeHcwWHluRVR4Z2tUeVZFUHllMFR5WlVQeG9FVHhzRVR5ZVVQeWJFUHhza1R4dTBYeWRFVHhyRVR5Y0VQeVowUHh2MFh4ZVVUeHpVVHlta1R4ajBUeGswUHlZMFB4cmtUeWpVVHhwMFR5V2tQeWFVUHhoRVR4bzBUeGRVUHlvVVR5V0VQeWNrUHhxVVR4cTBUeHFrVHlrMFFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSS9nQUhRQWdRQU1JQUFBZ1RLbHpJc0tIRGh4QWpSaFJ3SWNBRkFRc2VFQ1RZUUtMSGp5QkRObFN3VVVHSmpSdEZxbHpKTW1HRWpSRmdDRUFwb3FYTm14RTdrS2hCb2tPTEJBY0VDRGlRQUtmUm93Z0xqTEF4b2dBQnBGQ2pTcDFLdGFyVnExaXphdDBLc1lDRkdSYWNKcUFBQVFLRm9seXhnbUR4Z0FXSUdETTMxa3g3RmNOR0RBMVFFcVI3bGNQR0RSYzBidXpJdDZvTXZ4dVE1QmdnQUFFREFRY0xVN1VRWWtFSUlCOGthOTdNdWJQbno2QS9FM0JRd01GVEFBTW9VSWdjK3FhQkNTWW1HQmpnQWFXSDFqY3JiS3l3QWdGS0JyaHQzdmpMUUFKS0NjRmJhdGlvUVlBQjN3RVlHRWpPTWdVT0lqaFM3RUE0Z0RWMWxRUlEvdnhBY2ZxNytmUG8wNFBPa0VFOVNCVW5GcHhROGVFNVFRVFQzVStzZUhHQjhZM0k2UWNSU1FTWkJCMUJ3QW40MEVzRXhWVGJSam9vK0pCT1BQbUUyZ0VIZUNmaFFrb3g1ZFNHSUlZbzRvZ2tLdVNWRVM0NHhSaEJrSlVJd0ZvVnZQQ1dZQnk1YUJkQmVPa1ZnSXNFQm1CU1hBVE5SV0lTaUIyeEFGQkNFZVVpWlpaaDV1S1RVRVlwWldHamxmWVVVR1VwV2VKcnNjMEdaQUJDanFnYlFienA2T0p3QkczQUFJMEJFRWJpbUFId3RtSUFMVzRKbTJ3YVBsbWxhVlAyNmVlZk9LVzIycE0wQkxGQUVEUjg4Q0JCdDVYb0Ewa0srTERBZ2RIeFdGSUoveEVVSUlrM0JvQ1hmZEhsUnlJSUwyZ2dZd3dJc1FkbEFTNE1rV0o1L29ER0t1dXNDNm42Skt1dU9nVXFmaTUyVU9vTFBtVWF3S1lqTWhoQVRKUW1TR0tQSmkwYVFJUWxVbVFSUnFpcGxtZUk4TWxISDYzY2R1dXRpSHMrTldlZEpLWndwM1pzdWpuaWNnUTFaMmFKYUFhZzVwZGhpZ2duYjFoQ29DV0pYT0xaWjdqZkJpeHdpUG51T3lLVElWandBYjB1SGhZQUJ6TGs4QzZKZnFVWkdFcnFpdGdwWHVOZXUrRmFiYjNWcDFkZ2ZUand5U2lqSjZqSEczYllGQUhPTmtvaWhUMjFrS3lMeHNZa0xMRWlNbHNDcU5LNUtHMS9xYmIzWkxielpaYnkwa3kzWnF1TDRZMzMxSzZpam1nZGR0cnQ3Q0s3QVRSM003ekVPUXZ0bTd1dFVPMmdMdlk3MjcrazhkbjAyM0FYeHBodjVCNWNXY0lmcE51d1VWOFFTNnlYaXhYTGV4Rk5OdDdWUU1Gb2tkZ0REdy93MEFPcVU2SkF3d3cwa0JmMzVaaGZoZVJRaVk5WXhBd2VFc0J3aVVvOFVHRUxFeGNMRXd4NmwraHp4eTRLOFZJRVFpelE1d0hMYVpCaFFBQWgvaFZOWVdSbElIZHBkR2dnVTJOeVpXVnVWRzlIYVdZQU93PT0nIHRpdGxlPSfngrnlh7vlj7PkvqfliJfooajov5vooYzop6PmnpAnIHN0eWxlPSd3aWR0aDo0MHB4Jz4iOwoKICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9ICI8ZGl2IGNsYXNzPSdwbGF5TGluZURpdiB6aG1fcGxheV92aWRlb193cmFwJyBzdHlsZT0nZGlzcGxheTpub25lOyc+IgoKICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9ICI8ZGl2IGNsYXNzPSd6aG1fcGxheV92aWRlb19saW5lJz4iOwoKICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9IjxkaXY+PHVsIGNsYXNzPSd6aG1fcGxheV92aWRlX2xpbmVfdWwnPiI7CgogICAgICAgICAgICBwbGF5TGluZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9ICcnOwoKICAgICAgICAgICAgICAgIGlmKGdldENvb2tpZSgncGxheUxpbmVBY3Rpb24nKSA9PSBpdGVtLnVybCl7CgogICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPSd6aG1fbGluZV9zZWxlY3RlZCc7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPWA8bGkgY2xhc3M9J3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saSAke3NlbGVjdGVkfScgdXJsPScke2l0ZW0udXJsfScgPiR7aXRlbS5uYW1lfTwvbGk+YDsKCiAgICAgICAgICAgIH0pCgogICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0iPC9kaXY+PC9kaXY+PC9kaXY+IjsKCiAgICAgICAgICAgIC8vdGVtcGxhdGU6bm9kZTvmkq3mlL7ljLrln58KCiAgICAgICAgICAgIGxldCBwbGF5SnhIdG1sID0gIjxkaXYgY2xhc3M9J3pobV9wbGF5X3ZpZGVvX2p4Jz4iOwoKICAgICAgICAgICAgcGxheUp4SHRtbCArPSAiPGlmcmFtZSBhbGxvd3RyYW5zcGFyZW5jeT10cnVlIGZyYW1lYm9yZGVyPScwJyBzY3JvbGxpbmc9J25vJyBhbGxvd2Z1bGxzY3JlZW49dHJ1ZSBhbGxvd3RyYW5zcGFyZW5jeT10cnVlIG5hbWU9J2p4X3BsYXknIHN0eWxlPSdoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlJyBpZD0ncGxheUlmcmFtZSc+PC9pZnJhbWU+PC9kaXY+IjsKCiAgICAgICAgICAgIC8v5b6q546v5Yik5pat5piv5ZCm5Zyo5pKt5pS+6aG177yM5piv5YiZ5omn6KGM5LiL6Z2iCiAgICAgICAgICAgIGxldCBqeFZpZGVvRGF0YSA9IFsKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC52XC5xcVwuY29tXC94XC9wbGF5XC5odG1sXD9jaWQ9LyxhcmVhQ2xhc3NOYW1lOidzbGlkZXJfYm94J30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC52XC5xcVwuY29tXC9wbGF5XC5odG1sXD9jaWRcPS8sYXJlYUNsYXNzTmFtZTonc2xpZGVyX2JveCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovbVwudlwucXFcLmNvbVwvY292ZXJcLy4qaHRtbC8sYXJlYUNsYXNzTmFtZTonc2xpZGVyX2JveCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovaHR0cHM/OlwvXC9tXC52XC5xcVwuY29tXC94XC9tXC9wbGF5XD8uKmNpZC4qLyxhcmVhQ2xhc3NOYW1lOidzbGlkZXJfYm94J30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIubS12aWRlby1wbGF5ZXItd3JhcCIsbWF0Y2g6L15odHRwczpcL1wvbS5pcWl5aVwuY29tXC9bdndhXVxfLyxhcmVhQ2xhc3NOYW1lOidtLXNsaWRpbmctbGlzdCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIuaW50bC12aWRlby13cmFwIixtYXRjaDovXmh0dHBzOlwvXC93d3dcLmlxXC5jb21cL3BsYXlcLy8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC55b3VrdVwuY29tXC9hbGlwYXlfdmlkZW9cL2lkXy8sYXJlYUNsYXNzTmFtZTonJ30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC55b3VrdVwuY29tXC92aWRlb1wvaWRfLyxhcmVhQ2xhc3NOYW1lOicnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5wbGF5ZXItY29udGFpbmVyIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5iaWxpYmlsaVwuY29tXC9iYW5ndW1pLyxhcmVhQ2xhc3NOYW1lOidlcC1saXN0LXByZS1ib2R5J30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5tcGxheWVyIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5iaWxpYmlsaVwuY29tXC92aWRlb1wvLyxhcmVhQ2xhc3NOYW1lOidlcC1saXN0LXByZS1ib2R5J30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIudmlkZW8tYXJlYSIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwubWd0dlwuY29tXC9iLyxhcmVhQ2xhc3NOYW1lOidjbGVhcmZpeCd9LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI2xlX3BsYXlib3giLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLmxlXC5jb21cL3B0dlwvdnBsYXlcLy8sYXJlYUNsYXNzTmFtZTonc2lkZXNsaXBfc2xpZGUnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNqLXBsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwubGVcLmNvbVwvdnBsYXkvLGFyZWFDbGFzc05hbWU6J2p1amknfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3BsYXlcLnR1ZG91XC5jb21cL3Zfc2hvd1wvaWRfL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcHB0dl9wbGF5cGFnZV9ib3giLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3ZcLnBwdHZcLmNvbVwvc2hvd1wvL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi92aXBcLjE5MDUuY29tXC9wbGF5XC8vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiN2b2RQbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3d3d1wuMTkwNS5jb21cL3ZvZFwvcGxheVwvL30sCiAgICAgICAgICAgIF07CgogICAgICAgICAgICAvL+WIm+W7umxvZ29faWNvbgogICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdkaXYnLCd6aG1JY29uJyk7CgogICAgICAgICAgICBsZXQgemhtUGxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1JY29uJyk7CgogICAgICAgICAgICB6aG1QbGF5LmlubmVySFRNTCA9IHBsYXlXcmFwSHRtbDsKCiAgICAgICAgICAgIGxldCBqeFZpZGVvV2ViID0ganhWaWRlb0RhdGEuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKGl0ZW0ubWF0Y2gpOwoKICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1sb2dvJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgbGV0IGp4VmlkZW9XZWIgPSBqeFZpZGVvRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKGl0ZW0ubWF0Y2gpOwoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgaWYoanhWaWRlb1dlYi5sZW5ndGggPT0gMCl7CgogICAgICAgICAgICAgICAgICAgIHRvYXN0KCfor7flnKjop4bpopHmkq3mlL7pobXngrnlh7vlm77moIcnKTsKCiAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHtmdW5jTmFtZSxtYXRjaDpub3dNYXRjaCxub2RlOm5vd05vZGUsbmFtZTpub3dOYW1lfSA9IGp4VmlkZW9XZWJbMF07CgogICAgICAgICAgICAgICAgICAgIGxldCBwbGF5TGluZURpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy56aG1fcGxheV92aWRlb193cmFwJyk7CgogICAgICAgICAgICAgICAgICAgIGxldCBwbGF5U2hvdyA9IHBsYXlMaW5lRGl2LnN0eWxlLmRpc3BsYXk7CgogICAgICAgICAgICAgICAgICAgIHBsYXlTaG93ID09ICdub25lJz8gcGxheUxpbmVEaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc6cGxheUxpbmVEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBsYXlMaW5lVGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGxheUxpbmVUZCcpOwoKICAgICAgICAgICAgICAgICAgICBwbGF5TGluZVRkLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlMaW5lVGQuZm9yRWFjaChmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywncGxheUxpbmVUZCB6aG1fcGxheV92aWRlb19saW5lX3VsX2xpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdjbGFzcycsJ3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saSB6aG1fbGluZV9zZWxlY3RlZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvb2tpZSgncGxheUxpbmVBY3Rpb24nLHRoaXMuZ2V0QXR0cmlidXRlKCd1cmwnKSwzMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vd1dlYk5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG5vd05vZGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5vd1dlYk5vZGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dXZWJOb2RlLmlubmVySFRNTCA9IHBsYXlKeEh0bWw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5SWZyYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BsYXlJZnJhbWUnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheUlmcmFtZS5zcmM9IGl0ZW0uZ2V0QXR0cmlidXRlKCd1cmwnKStsb2NhdGlvbi5ocmVmOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6KeG6aKR572R56uZ57uT54K55LiN5a2Y5ZyoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9TZWxlY3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuJytqeFZpZGVvV2ViWzBdLmFyZWFDbGFzc05hbWUpOwoKICAgICAgICAgICAgICAgICAgICB2aWRlb1NlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1sb2NhdGlvbi5ocmVmOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KQoKCiAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgbGV0IGp4VmlkZW9XZWIgPSBqeFZpZGVvRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKGl0ZW0ubWF0Y2gpOwoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgaWYoanhWaWRlb1dlYi5sZW5ndGg+MCl7CgogICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb1NlbGVjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy4nK2p4VmlkZW9XZWJbMF0uYXJlYUNsYXNzTmFtZSk7CgogICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvU2VsZWN0KXsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWY9bG9jYXRpb24uaHJlZjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMDApCgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0sMTAwMCkKCiAgICAgICAgfQoKICAgICAgICBwbGF5VmlkZW9GdW5jKCk7CgogICAgfWVsc2V7CiAgICAgICAgLyotLWNvbmZpZy0tKi8KICAgICAgICB2YXIgQ29uZmlnID17CgogICAgICAgIGNvdXBvblVybDp3aW5kb3cubG9jYXRpb24uaHJlZiwKCiAgICAgICAgY291cG9uSG9zdDp3aW5kb3cubG9jYXRpb24uaG9zdCwKCiAgICAgICAgd2ViVXJsOidodHRwOi8vbXVzaWMubGl1emhpamluLmNuLycsCgogICAgICAgIGljb25WaXBUb3A6MzYwLAoKICAgICAgICBpY29uVmlwUG9zaXRpb24gOiAnbGVmdCcsCgogICAgICAgIGljb25WaXBXaWR0aCA6IDQwLAoKICAgICAgICBjb3Vwb25UaW1lck51bSA6IDEwMCwvLzEwMOasoeetieS6jjEw56eSCgogICAgICAgIGNvdXBvbldhaXRUaW1lIDogMTAwLAoKICAgICAgICBpY29uV2FpdFRpbWUgOiAxMDAsCgogICAgICAgIGljb25WaXBPcGFjaXR5OjEwMCwKCiAgICAgICAgc2VsZWN0ZWRMZWZ0OidzZWxlY3RlZCcsCgogICAgICAgIHNlbGVjdGVkUmlnaHQ6JycsCgogICAgICAgIHZpZGVvUGxheUxpbmVBZGQ6R01fZ2V0VmFsdWUoJ3ZpZGVvUGxheUxpbmVBZGQnLDApLAoKICAgICAgICB9CgogICAgICAgIHZhciB7Y291cG9uVXJsLAogICAgICAgICAgICBjb3Vwb25Ib3N0LAogICAgICAgICAgICB3ZWJVcmwsCiAgICAgICAgICAgIGljb25WaXBUb3AsCiAgICAgICAgICAgIGljb25WaXBQb3NpdGlvbiwKICAgICAgICAgICAgaWNvblZpcFdpZHRoLAogICAgICAgICAgICBpY29uVmlwT3BhY2l0eSwKICAgICAgICAgICAgY291cG9uVGltZXJOdW0sCiAgICAgICAgICAgIGNvdXBvbldhaXRUaW1lLAogICAgICAgICAgICBpY29uV2FpdFRpbWUsCiAgICAgICAgICAgIHNlbGVjdGVkTGVmdCwKICAgICAgICAgICAgc2VsZWN0ZWRSaWdodCwKICAgICAgICAgICAgdmlkZW9QbGF5TGluZUFkZCwKICAgICAgICB9ID0gQ29uZmlnOwogICAgICAgIC8qLS1sYW5nLS0qLwogICAgICAgIHZhciBsYW5nID0gewogICAgICAgICAgICBzZXQ6J+iuvue9ricsCiAgICAgICAgICAgIGljb25Qb3NpdGlvbjon5Zu+5qCH6K6+572uJywKICAgICAgICAgICAgcGxheVZpZGVvOifop6PmnpDorr7nva4nLAogICAgICAgICAgICBpY29uSGVpZ2h0Oiflm77moIfpq5jluqYnLAogICAgICAgICAgICBpY29uV2lkdGg6J+Wbvuagh+Wkp+WwjycsCiAgICAgICAgICAgIGljb25MaW5lOifmsLTlubPkvY3nva4nLAogICAgICAgICAgICBpY29uV2FpdFRpbWU6J+etieW+heaXtumXtCcsCiAgICAgICAgICAgIGljb25MZWZ0OifpnaDlt6YnLAogICAgICAgICAgICBpY29uUmlnaHQ6J+mdoOWPsycsCiAgICAgICAgICAgIHRpcEljb25IZWlnaHQ6J+m7mOiupDM2MCzlu7rorq4xfjUwMCcsCiAgICAgICAgICAgIHRpcEljb25XaWR0aDon6buY6K6kNDAs5bu66K6uMjB+NTAnLAogICAgICAgICAgICB0aXBJY29uT3BhY2l0eTon6K+35aGr5YaZMC0xMDDnmoTmlbTmlbAnLAogICAgICAgICAgICB0aXBFcnJvckljb25IZWlnaHQ6Jzzlm77moIfkvY3nva4+5Lit55qEPOWbvuagh+mrmOW6pj7lupTkuLoxMDAw5Lul5YaF5q2j5pW05pWw77yM5bu66K6uMX41MDAnLAogICAgICAgICAgICB0aXBFcnJvckljb25XaWR0aDonPOWbvuagh+S9jee9rj7kuK3nmoQ85Zu+5qCH5aSn5bCPPuW6lOS4ujEwMOS7peWGheato+aVtOaVsO+8jOW7uuiurjIwfjUwJywKICAgICAgICAgICAgdGlwRXJyb3JJY29uT3BhY2l0eTon5aGr5YaZ5pWw5a2X5LiN5q2j56GuJywKICAgICAgICAgICAgc2V0UGxheVZpZGVvOifop6PmnpDorr7nva4nLAogICAgICAgICAgICBwbGF5VmlkZW9MaW5lQWRkOifnq5nlpJbop6PmnpAnLAogICAgICAgICAgICB0aXBQbGF5VmlkZW9MaW5lQWRkOifor7floavlhaXnur/ot6/lkI3np7DlkozlnLDlnYDvvIzkuK3pl7TnlKjljYrop5LpgJflj7fpmpTlvIDvvIzmr4/nur/ot6/kuIDooYzjgIInLAogICAgICAgICAgICBzY3JpcHRzaW5zdGFsbDon6ISa5pys5a6J6KOFJywKICAgICAgICAgICAgc2NyaXB0c3VzZTon5L2/55So5pa55rOVJywKICAgICAgICAgICAgcXVlc3Rpb246J+W4uOingemXrumimCcsCiAgICAgICAgICAgIHRnZ3JvdXA6J1RlbGVncmFtJwogICAgICAgIH07CgogICAgICAgIHZhciBqeFZpZGVvPVsKCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIixtYXRjaDovaHR0cHM/OlwvXC92XC5xcVwuY29tLyxuYW1lOidxcVBDJ30sCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L2h0dHBzPzpcL1wvbVwudlwucXFcLmNvbS8sbmFtZToncXFNb2JpbGUnfSwKCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuaXFpeWlcLmNvbS8sbmFtZTonaXFpeWlQYyd9LAogICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmlxXC5jb20vfSwKICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIubS12aWRlby1wbGF5ZXItd3JhcCIsbWF0Y2g6L15odHRwcz86XC9cL20uaXFpeWlcLmNvbS8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwKCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwueW91a3VcLmNvbVwvYWxpcGF5X3ZpZGVvXC9pZF8vfSwKICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9tXC55b3VrdVwuY29tXC92aWRlb1wvaWRfL30sCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L15odHRwcz86XC9cLy4qeW91a3VcLmNvbS99LAoKICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5iaWxpYmlsaVwuY29tL30sCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L15odHRwcz86XC9cL21cLmJpbGliaWxpXC5jb20vfSwKCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnZpZGVvLWFyZWEiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L21cLm1ndHZcLmNvbVwvYi99LAogICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9tZ3R2XC5jb20vLGFyZWFDbGFzc05hbWU6J2VwaXNvZGUtaXRlbXMgY2xlYXJmaXgnfSwKICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIueC1jb3Zlci1wbGF5YnRuLXdyYXAiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6Ly50dlwuc29odVwuY29tL30sCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLngtY292ZXItcGxheWJ0bi13cmFwIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC50dlwuc29odVwuY29tL30sCiAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllcldyYXAiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L2ZpbG1cLnNvaHVcLmNvbS99LAoKICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBtYXRjaDovdHVkb3VcLmNvbS99LAoKICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLG1hdGNoOi9sZVwuY29tL30sCgogICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsbWF0Y2g6L3BwdHZcLmNvbS99LAoKICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLG1hdGNoOi8xOTA1XC5jb20vfSwKCiAgICAgICAgXTsKCiAgICAgICAgdmFyIHBsYXlMaW5lID0gWwogICAgICAgICAgICAgICAgeyJuYW1lIjoi57qv5YeAMSIsInVybCI6Imh0dHBzOi8vaW0xOTA3LnRvcC8/ang9IiwibW9iaWxlIjoxfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IkLnq5kxIiwidXJsIjoiaHR0cHM6Ly9qeC5qc29ucGxheWVyLmNvbS9wbGF5ZXIvP3VybD0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi54ix6LGGIiwidXJsIjoiaHR0cHM6Ly9qeC5haWRvdWVyLm5ldC8/dXJsPSIsIm1vYmlsZSI6MX0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJCTCIsInVybCI6Imh0dHBzOi8vdmlwLmJsamlleC5jb20vP3Y9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuWGsOixhiIsInVybCI6Imh0dHBzOi8vYmQuanguY24vP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiQ0siLCJ1cmwiOiJodHRwczovL3d3dy5ja3BsYXllci52aXAvamlleGkvP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiSDgiLCJ1cmwiOiJodHRwczovL3d3dy5oOGp4LmNvbS9qaWV4aS5waHA/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJKWSIsInVybCI6Imh0dHBzOi8vangucGxheWVyankuY29tLz91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6Iuino+aekGxhIiwidXJsIjoiaHR0cHM6Ly9hcGkuamlleGkubGEvP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiTTNVOCIsInVybCI6Imh0dHBzOi8vangubTN1OC50di9qaWV4aS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJQTSIsInVybCI6Imh0dHBzOi8vd3d3LnBsYXltM3U4LmNuL2ppZXhpLnBocD91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuebmOWPpCIsInVybCI6Imh0dHBzOi8vd3d3LnBhbmd1amlleGkuY2MvamlleGkucGhwP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi5LiD5ZOlIiwidXJsIjoiaHR0cHM6Ly9qeC5ubnh2LmNuL3R2LnBocD91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuWQrOS5kCIsInVybCI6Imh0dHBzOi8vanguZGo2dS5jb20vP3VybD0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi57u05aSaIiwidXJsIjoiaHR0cHM6Ly9qeC5pdml0by5jbi8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLomb7nsbMiLCJ1cmwiOiJodHRwczovL2p4LnhtZmx2LmNvbS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJZVCIsInVybCI6Imh0dHBzOi8vangueWFuZ3R1LnRvcC8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLlpJzluZUiLCJ1cmwiOiJodHRwczovL3d3dy55ZW11Lnh5ei8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLkupHmnpAiLCJ1cmwiOiJodHRwczovL2p4LnlwYXJzZS5jb20vaW5kZXgucGhwP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiMTfkupEiLCJ1cmwiOiJodHRwczovL3d3dy4xNzE3eXVuLmNvbS9qeC90eS5waHA/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiIxODAiLCJ1cmwiOiJodHRwczovL2p4LjAwMDE4MC50b3AvangvP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiNEsiLCJ1cmwiOiJodHRwczovL2p4LjRrZHYuY29tLz91cmw9IiwibW9iaWxlIjoxfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IjJ5cyIsInVybCI6Imh0dHBzOi8vZ2ouZmVueGlhbmdiLmNvbS9wbGF5ZXIvYW5hbHlzaXMucGhwP3Y9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IjgwOTAiLCJ1cmwiOiJodHRwczovL3d3dy44MDkwZy5jbi8/dXJsPSIsIm1vYmlsZSI6MH0KICAgICAgICAgICAgXQoKICAgICAgICB2YXIga2V5Q29kZSA9IFsKICAgICAgICAgICAge2NvZGU6NDgsaXNTaGlmdDpmYWxzZSx2YWx1ZTonMCd9LAogICAgICAgICAgICB7Y29kZTo0OCxpc1NoaWZ0OnRydWUsdmFsdWU6JyknfSwKICAgICAgICAgICAge2NvZGU6NDksaXNTaGlmdDpmYWxzZSx2YWx1ZTonMSd9LAogICAgICAgICAgICB7Y29kZTo0OSxpc1NoaWZ0OnRydWUsdmFsdWU6JyEnfSwKICAgICAgICAgICAge2NvZGU6NTAsaXNTaGlmdDpmYWxzZSx2YWx1ZTonMid9LAogICAgICAgICAgICB7Y29kZTo1MCxpc1NoaWZ0OnRydWUsdmFsdWU6J0AnfSwKICAgICAgICAgICAge2NvZGU6NTEsaXNTaGlmdDpmYWxzZSx2YWx1ZTonMyd9LAogICAgICAgICAgICB7Y29kZTo1MSxpc1NoaWZ0OnRydWUsdmFsdWU6JyMnfSwKICAgICAgICAgICAge2NvZGU6NTIsaXNTaGlmdDpmYWxzZSx2YWx1ZTonNCd9LAogICAgICAgICAgICB7Y29kZTo1Mixpc1NoaWZ0OnRydWUsdmFsdWU6JyQnfSwKICAgICAgICAgICAge2NvZGU6NTMsaXNTaGlmdDpmYWxzZSx2YWx1ZTonNSd9LAogICAgICAgICAgICB7Y29kZTo1Myxpc1NoaWZ0OnRydWUsdmFsdWU6JyUnfSwKICAgICAgICAgICAge2NvZGU6NTQsaXNTaGlmdDpmYWxzZSx2YWx1ZTonNid9LAogICAgICAgICAgICB7Y29kZTo1NCxpc1NoaWZ0OnRydWUsdmFsdWU6J14nfSwKICAgICAgICAgICAge2NvZGU6NTUsaXNTaGlmdDpmYWxzZSx2YWx1ZTonNyd9LAogICAgICAgICAgICB7Y29kZTo1NSxpc1NoaWZ0OnRydWUsdmFsdWU6JyYnfSwKICAgICAgICAgICAge2NvZGU6NTYsaXNTaGlmdDpmYWxzZSx2YWx1ZTonOCd9LAogICAgICAgICAgICB7Y29kZTo1Nixpc1NoaWZ0OnRydWUsdmFsdWU6JyonfSwKICAgICAgICAgICAge2NvZGU6NTcsaXNTaGlmdDpmYWxzZSx2YWx1ZTonOSd9LAogICAgICAgICAgICB7Y29kZTo1Nyxpc1NoaWZ0OnRydWUsdmFsdWU6JygnfSwKICAgICAgICAgICAge2NvZGU6NzAsaXNTaGlmdDpmYWxzZSx2YWx1ZTonZid9LAogICAgICAgICAgICB7Y29kZTo3MCxpc1NoaWZ0OnRydWUsdmFsdWU6J0YnfSwKICAgICAgICAgICAge2NvZGU6NzQsaXNTaGlmdDpmYWxzZSx2YWx1ZTonaid9LAogICAgICAgICAgICB7Y29kZTo3NCxpc1NoaWZ0OnRydWUsdmFsdWU6J0onfSwKICAgICAgICAgICAge2NvZGU6NzUsaXNTaGlmdDpmYWxzZSx2YWx1ZTonayd9LAogICAgICAgICAgICB7Y29kZTo3NSxpc1NoaWZ0OnRydWUsdmFsdWU6J0snfSwKICAgICAgICAgICAge2NvZGU6NzYsaXNTaGlmdDpmYWxzZSx2YWx1ZTonbCd9LAogICAgICAgICAgICB7Y29kZTo3Nixpc1NoaWZ0OnRydWUsdmFsdWU6J0wnfSwKICAgICAgICBdCgogICAgICAgIC8qLS1DbGFzcy0tKi8KICAgICAgICBjbGFzcyBCYXNlQ2xhc3N7CgogICAgICAgICAgICBjb25zdHJ1Y3RvcigpewoKICAgICAgICAgICAgICAgIGlmKEdNX2dldFZhbHVlKCdpY29uUG9zaXRpb25TZXRQYWdlJykgIT0gMCl7CiAgICAgICAgICAgICAgICAgICAgLypjb29raWXlrZjlgqgKICAgICAgICAgICAgICAgICAgICBpY29uVmlwVG9wID0gdGhpcy5nZXRDb29raWUoJ2ljb25Ub3AnKT90aGlzLmdldENvb2tpZSgnaWNvblRvcCcpOmljb25WaXBUb3A7CgogICAgICAgICAgICAgICAgICAgIGljb25WaXBQb3NpdGlvbiA9IHRoaXMuZ2V0Q29va2llKCdpY29uUG9zaXRpb24nKT90aGlzLmdldENvb2tpZSgnaWNvblBvc2l0aW9uJyk6aWNvblZpcFBvc2l0aW9uOwoKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZExlZnQgPSBpY29uVmlwUG9zaXRpb249PSdsZWZ0Jz8nc2VsZWN0ZWQnOicnOwoKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJpZ2h0ID0gaWNvblZpcFBvc2l0aW9uPT0ncmlnaHQnPydzZWxlY3RlZCc6Jyc7CgogICAgICAgICAgICAgICAgICAgIGljb25WaXBXaWR0aCA9IHRoaXMuZ2V0Q29va2llKCdpY29uV2lkdGgnKT90aGlzLmdldENvb2tpZSgnaWNvbldpZHRoJyk6aWNvblZpcFdpZHRoOwogICAgICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgICAgIGljb25WaXBUb3AgPSBHTV9nZXRWYWx1ZSgnaWNvblRvcCcpIHx8IEdNX2dldFZhbHVlKCdpY29uVG9wJykgPT0gMD9HTV9nZXRWYWx1ZSgnaWNvblRvcCcpOmljb25WaXBUb3A7CgogICAgICAgICAgICAgICAgICAgIGljb25WaXBQb3NpdGlvbiA9IEdNX2dldFZhbHVlKCdpY29uUG9zaXRpb24nKT9HTV9nZXRWYWx1ZSgnaWNvblBvc2l0aW9uJyk6aWNvblZpcFBvc2l0aW9uOwoKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZExlZnQgPSBpY29uVmlwUG9zaXRpb249PSdsZWZ0Jz8nc2VsZWN0ZWQnOicnOwoKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJpZ2h0ID0gaWNvblZpcFBvc2l0aW9uPT0ncmlnaHQnPydzZWxlY3RlZCc6Jyc7CgogICAgICAgICAgICAgICAgICAgIGljb25WaXBXaWR0aCA9IEdNX2dldFZhbHVlKCdpY29uV2lkdGgnKT9HTV9nZXRWYWx1ZSgnaWNvbldpZHRoJyk6aWNvblZpcFdpZHRoOwoKICAgICAgICAgICAgICAgICAgICBpY29uV2FpdFRpbWUgPSBHTV9nZXRWYWx1ZSgnaWNvbldhaXRUaW1lJyk/R01fZ2V0VmFsdWUoJ2ljb25XYWl0VGltZScpKjEwMDA6aWNvbldhaXRUaW1lOwoKICAgICAgICAgICAgICAgICAgICBpY29uVmlwT3BhY2l0eSA9IEdNX2dldFZhbHVlKCdpY29uT3BhY2l0eScpIHx8IEdNX2dldFZhbHVlKCdpY29uT3BhY2l0eScpID09IDA/R01fZ2V0VmFsdWUoJ2ljb25PcGFjaXR5Jyk6aWNvblZpcE9wYWNpdHk7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoIuiuvue9riIsICgpID0+IHRoaXMubWVudVNldCgpKTsKCiAgICAgICAgICAgICAgICB0aGlzLnNldFN0eWxlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNldFN0eWxlKCl7CiAgICAgICAgICAgICAgICBsZXQgbWVudVNldFN0eWxlID0gYAogICAgICAgICAgICAgICAgICAgICAgICAuemhtTWFza3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6OTk5OTk5OTk5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojMDAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGZpeGVkO3RvcDogMDtyaWdodDogMDtib3R0b206IDA7bGVmdDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6MC44OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC53cmFwLWJveHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTAwMDAwMDAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmZpeGVkOzt0b3A6IDUwJTtsZWZ0OiA1MCU7dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTIwMHB4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAzMDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjNTU1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OmhpZGRlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ6MTZweCBudW1Gb250LFBpbmdGYW5nU0MtUmVndWxhcixUYWhvbWEsTWljcm9zb2Z0IFlhaGVpLHNhbnMtc2VyaWYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OjQwMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXcmFwSGVhZHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2YyNDQ0MztoZWlnaHQ6NDBweDtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO2xpbmUtaGVpZ2h0OjQwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdyYXBMaXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7cGFkZGluZzowcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdyYXBMaSBsaXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzoxMnB4IDIwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LXN0eWxlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0V3JhcExpQ29udGVudHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdyYXBTYXZlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7dG9wOi0ycHg7cmlnaHQ6MTBweDtmb250LXNpemU6MjRweDtjdXJzb3I6cG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0Rm9vdHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowcHg7cGFkZGluZzoxMHB4IDIwcHg7d2lkdGg6MTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDoxMDAwMDAwMDA5O2JhY2tncm91bmQ6I2ZlZjllZjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldEZvb3RMaXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7cGFkZGluZzowcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0Rm9vdExpIGxpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjBweCAycHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldEZvb3RMaSBsaSBhewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IzU1NTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldEZvb3RMaSBhOmhvdmVyIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmZTZkNzM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRQYWdlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDoxMDAwMDAwMDAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7dG9wOjBweDtsZWZ0OjMwMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDojZmZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFVsSGVhZHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzowcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRQYWdlSGVhZHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNjY2M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6NDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OjQwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZlNmQ3MzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRQYWdlTGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0UGFnZUxpIGxpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6OHB4IDIwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aGlodVNldFBhZ2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OjEwMDAwMDAwMDI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjBweDtsZWZ0OjMwMHB4O2JhY2tncm91bmQ6I2ZmZjt3aWR0aDozMDBweDtoZWlnaHQ6MTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFBhZ2VJbnB1dHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhpaHVTZXRQYWdlTGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjI1OHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAuemhpaHVTZXRQYWdlQ29udGVudHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9jaXJjdWxhcnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiA0MHB4O2hlaWdodDogMjBweDtib3JkZXItcmFkaXVzOiAxNnB4O3RyYW5zaXRpb246IC4zcztjdXJzb3I6IHBvaW50ZXI7Ym94LXNoYWRvdzogMCAwIDNweCAjOTk5IGluc2V0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5yb3VuZC1idXR0b257CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjBweDtoZWlnaHQ6IDIwcHg7O2JvcmRlci1yYWRpdXM6IDUwJTtib3gtc2hhZG93OiAwIDFweCA1cHggcmdiYSgwLDAsMCwuNSk7dHJhbnNpdGlvbjogLjNzO3Bvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX2JhY2t7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IHNvbGlkICNGRkY7IGJvcmRlci13aWR0aDogMCAzcHggM3B4IDA7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZzogM3B4O3RyYW5zZm9ybTogcm90YXRlKDEzNWRlZyk7ICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzNWRlZyk7bWFyZ2luLWxlZnQ6MTBweDtjdXJzb3I6cG9pbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudG8tcmlnaHR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDoyMHB4OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDNweDt0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpOyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC00NWRlZyk7Y3Vyc29yOnBvaW50ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0U2F2ZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToyNHB4O2N1cnNvcjpwb2ludGVyO21hcmdpbi1yaWdodDo1cHg7bWFyZ2luLWJvdHRvbTo0cHg7Y29sb3I6I0ZGRjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDoxMDAwMDAwMDAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6MHB4O2xlZnQ6MzAwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiNmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDozMDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDoxMDAlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2V0X3BhZ2VfaGVhZGVyewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2NjYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDo0MHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6NDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZmU2ZDczOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6I2ZmZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2NvbnRlbnR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZV9saXN0ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweDtwYWRkaW5nOjBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMjIwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2V0X3BhZ2VfbGlzdDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrmu5rliqjmnaHmlbTkvZPmoLflvI8qLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggOiAwcHg7ICAvKumrmOWuveWIhuWIq+WvueW6lOaoquerlua7muWKqOadoeeahOWwuuWvuCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2xpc3Q6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h6YeM6Z2i5bCP5pa55Z2XKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXMgICA6IDJweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZTZkNzM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZV9saXN0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKua7muWKqOadoemHjOmdoui9qOmBkyovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93ICAgOiBpbnNldCAwIDAgNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgICA6ICNlZGVkZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2V0X3BhZ2VfbGlzdCBsaXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2NjYzsqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzoxMnB4IDIwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OmJsb2NrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2VlZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBsaTpsYXN0LWNoaWxkewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTpub25lOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2Nyb2xsewogICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGwgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3Njcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrmu5rliqjmnaHmlbTkvZPmoLflvI8qLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggOiAwcHg7ICAvKumrmOWuveWIhuWIq+WvueW6lOaoquerlua7muWKqOadoeeahOWwuuWvuCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3Njcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrmu5rliqjmnaHph4zpnaLlsI/mlrnlnZcqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1cyAgIDogMnB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlNmQ3MzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3Njcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrmu5rliqjmnaHph4zpnaLovajpgZMqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdyAgIDogaW5zZXQgMCAwIDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kICAgOiAjZWRlZGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvKi1mb3JtLSovCiAgICAgICAgICAgICAgICAgICAgICAgIDpyb290IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tYmFzZS1jb2xvcjogIzQzNGE1NjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0td2hpdGUtY29sb3ItcHJpbWFyeTogI2Y3ZjhmODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0td2hpdGUtY29sb3Itc2Vjb25kYXJ5OiAjZmVmZWZlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1ncmF5LWNvbG9yLXByaW1hcnk6ICNjMmMyYzI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWdyYXktY29sb3Itc2Vjb25kYXJ5OiAjYzJjMmMyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1ncmF5LWNvbG9yLXRlcnRpYXJ5OiAjNjc2Zjc5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1hY3RpdmUtY29sb3I6ICMyMjdjOWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXZhbGlkLWNvbG9yOiAjYzJjMmMyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1pbnZhbGlkLWNvbG9yOiAjZjcyZjQ3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1pbnZhbGlkLWljb246IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmOCwlM0NzdmclMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyUyMiUyMHdpZHRoJTNEJTIyMjQlMjIlMjBoZWlnaHQlM0QlMjIyNCUyMiUyMHZpZXdCb3glM0QlMjIwJTIwMCUyMDI0JTIwMjQlMjIlM0UlMjAlM0NwYXRoJTIwZCUzRCUyMk0xMy40MSUyMDEybDQuMy00LjI5YTElMjAxJTIwMCUyMDElMjAwLTEuNDItMS40MkwxMiUyMDEwLjU5bC00LjI5LTQuM2ExJTIwMSUyMDAlMjAwJTIwMC0xLjQyJTIwMS40Mmw0LjMlMjA0LjI5LTQuMyUyMDQuMjlhMSUyMDElMjAwJTIwMCUyMDAlMjAwJTIwMS40MiUyMDElMjAxJTIwMCUyMDAlMjAwJTIwMS40MiUyMDBsNC4yOS00LjMlMjA0LjI5JTIwNC4zYTElMjAxJTIwMCUyMDAlMjAwJTIwMS40MiUyMDAlMjAxJTIwMSUyMDAlMjAwJTIwMCUyMDAtMS40MnolMjIlMjBmaWxsJTNEJTIyJTIzZjcyZjQ3JTIyJTIwJTJGJTNFJTNDJTJGc3ZnJTNFIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ncmF5LWNvbG9yLXByaW1hcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxLjdlbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMnB4IDFlbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjNzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6NTUlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBpbml0aWFsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogdmFyKC0tZ3JheS1jb2xvci1zZWNvbmRhcnkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5OjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1ncmF5LWNvbG9yLXNlY29uZGFyeSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHk6OnBsYWNlaG9sZGVyIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1ncmF5LWNvbG9yLXNlY29uZGFyeSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5W2RhdGEtaXMtdmFsaWRdIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDFlbTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHlbZGF0YS1pcy12YWxpZD10cnVlXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keVtkYXRhLWlzLXZhbGlkPWZhbHNlXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWludmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWludmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5OmZvY3VzIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWN0aXZlLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS1hY3RpdmUtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keTotd2Via2l0LWF1dG9maWxsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IDk5OTlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fdmFsaWRhdG9yIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IHJpZ2h0IDAuNWVtIGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IDEuNWVtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDogLTE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHlbZGF0YS1pcy12YWxpZD1mYWxzZV0gKyAudGV4dC1pbnB1dF9fdmFsaWRhdG9yIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLWludmFsaWQtaWNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdC1ib3ggewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNpemluZzogaW5oZXJpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC41cyBlYXNlLW91dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOjkwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdC1ib3g6OmFmdGVyIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tZ3JheS1jb2xvci1zZWNvbmRhcnkpIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci13aWR0aDogNnB4IDRweCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IGF1dG8gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IC03MnB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94X19ib2R5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGluaXRpYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ncmF5LWNvbG9yLXByaW1hcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxLjdlbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDFlbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IGNhbGMoMWVtICsgMTZweCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTQwJTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxNHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy10b3A6MnB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1ib3R0b206MnB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94X19ib2R5W2RhdGEtaXMtdmFsaWQ9dHJ1ZV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS12YWxpZC1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0tdmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94X19ib2R5W2RhdGEtaXMtdmFsaWQ9ZmFsc2VdIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0taW52YWxpZC1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0taW52YWxpZC1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdC1ib3hfX2JvZHkuZm9jdXMtdmlzaWJsZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWFjdGl2ZS1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0tYWN0aXZlLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdC1ib3hfX2JvZHk6LXdlYmtpdC1hdXRvZmlsbCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiA5OTk5czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHRhcmVhX19ib2R5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWdyYXktY29sb3ItcHJpbWFyeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNpemluZzogaW5pdGlhbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IGluaGVyaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMWVtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjVzIGVhc2Utb3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0YXJlYV9fYm9keTpvbmx5LWNoaWxkIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZTogdmVydGljYWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHRhcmVhX19ib2R5OmZvY3VzIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWN0aXZlLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS1hY3RpdmUtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWFfX2JvZHlbZGF0YS1pcy12YWxpZD10cnVlXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS12YWxpZC1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHRhcmVhX19ib2R5W2RhdGEtaXMtdmFsaWQ9ZmFsc2VdIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0taW52YWxpZC1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0taW52YWxpZC1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0YXJlYSAuX2R1bW15LWJveCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4taGVpZ2h0OiAyNDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMWVtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50b0xlZnRNb3ZlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmltYXRpb246bW92ZVRvTGVmdCAwLjVzIGluZmluaXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb246bW92ZVRvTGVmdCAwLjVzIGluZmluaXRlOyAvKlNhZmFyaSBhbmQgQ2hyb21lKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6MTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBAa2V5ZnJhbWVzIG1vdmVUb0xlZnR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHtsZWZ0OjIwMHB4O30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHtsZWZ0OjBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBtb3ZlVG9MZWZ0IC8qU2FmYXJpIGFuZCBDaHJvbWUqL3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20ge2xlZnQ6MjAwcHg7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8ge2xlZnQ6MHB4O30KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLnRvUmlnaHRNb3ZlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmltYXRpb246bW92ZVRvUmlnaHQgMnMgaW5maW5pdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjptb3ZlVG9SaWdodCAycyBpbmZpbml0ZTsgLypTYWZhcmkgYW5kIENocm9tZSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OjE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBAa2V5ZnJhbWVzIG1vdmVUb1JpZ2h0ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB7bGVmdDowcHg7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8ge2xlZnQ6MjAwMHB4O30KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIG1vdmVUb1JpZ2h0IC8qU2FmYXJpIGFuZCBDaHJvbWUqL3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20ge2xlZnQ6MHB4O30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHtsZWZ0OjIwMHB4O30KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBgOwoKICAgICAgICAgICAgICAgIGRvbVN0eWxlIC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShtZW51U2V0U3R5bGUpKTsKCiAgICAgICAgICAgICAgICBkb21IZWFkLmFwcGVuZENoaWxkKGRvbVN0eWxlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbWVudVNldCgpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIHNldExpc3RKc29uPSBbCiAgICAgICAgICAgICAgICAgICAgeydsaXN0TmFtZSc6bGFuZy5pY29uUG9zaXRpb24sJ3NldExpc3RJRCc6J2ljb25Qb3NpdGlvblNldFBhZ2UnLCdzZXRQYWdlSUQnOidtb3ZpZUljb25TZXRQYWdlJywndGFrZVBsYWNlJzonMHB4J30sCiAgICAgICAgICAgICAgICAgICAgeydsaXN0TmFtZSc6bGFuZy5wbGF5VmlkZW8sJ3NldExpc3RJRCc6J21vdmllTGlzdCcsJ3NldFBhZ2VJRCc6J21vdmllVmlkZW9TZXRQYWdlJywndGFrZVBsYWNlJzonMHB4J30sCiAgICAgICAgICAgICAgICBdOwoKICAgICAgICAgICAgICAgIHZhciB6aGlodU9wdGlvbkpzb24gPSBbCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnpoVmlkZW9DbG9zZSwnb3B0aW9uSUQnOidyZW1vdmVWaWRlbycsJ2RlZmF1bHQnOicwJ30sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnpoVmlkZW9Eb3dubG9hZCwnb3B0aW9uSUQnOidkb3dubG9hZFZpZGVvJywnZGVmYXVsdCc6JzIyJ30sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnpoQURDbG9zZSwnb3B0aW9uSUQnOidyZW1vdmVBRCcsJ2RlZmF1bHQnOicyMid9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aENsb3NlTGVmdCwnb3B0aW9uSUQnOidyZW1vdmVSaWdodCcsJ2RlZmF1bHQnOicwJ30sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnpoQ2hhbmdlTGluaywnb3B0aW9uSUQnOidjaGFuZ2VMaW5rJywnZGVmYXVsdCc6JzIyJ30sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnNwZWNpYWxDb2x1bW4sJ29wdGlvbklEJzonc3BlY2lhbENvbHVtbicsJ2RlZmF1bHQnOjIyfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcudmlkZW9UaXRsZSwnb3B0aW9uSUQnOid2aWRlb1RpdGxlJywnZGVmYXVsdCc6MjJ9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aEtleXdvcmRDbG9zZSwnb3B0aW9uSUQnOidyZW1vdmVLZXl3b3JkJywnZGVmYXVsdCc6JzAnfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuYXV0aG9yTmFtZUNsb3NlLCdvcHRpb25JRCc6J3JlbW92ZUF1dGhvck5hbWUnLCdkZWZhdWx0JzoyMn0sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnlhbnh1YW5DbG9zZSwnb3B0aW9uSUQnOidyZW1vdmVZYW54dWFuJywnZGVmYXVsdCc6JzAnfQogICAgICAgICAgICAgICAgXTsKCiAgICAgICAgICAgICAgICB2YXIgcGxheVZpZGVvT3B0aW9uSnNvbiA9ewogICAgICAgICAgICAgICAgICAgICdvcHRpb25OYW1lJzpsYW5nLnBsYXlWaWRlb0xpbmVBZGQsCiAgICAgICAgICAgICAgICAgICAgJ29wdGlvbklEJzondmlkZW9QbGF5TGluZUFkZCcsCiAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHQnOnZpZGVvUGxheUxpbmVBZGQsCiAgICAgICAgICAgICAgICAgICAgJ3RleHRhcmVhJzondmlkZW9QbGF5TGluZUFkZFRleHRhcmVhJywKICAgICAgICAgICAgICAgICAgICAndGV4dGFyZWFJZCc6J3BsYXlWaWRlb0xpbmVUZXh0YXJlYScsCiAgICAgICAgICAgICAgICAgICAgJ3RpcCc6CmDnuq/lh4AxLGh0dHBzOi8vaW0xOTA3LnRvcC8/ang9CkLnq5kxLGh0dHBzOi8vanguanNvbnBsYXllci5jb20vcGxheWVyLz91cmw9CueIseixhixodHRwczovL2p4LmFpZG91ZXIubmV0Lz91cmw9CkJMLGh0dHBzOi8vdmlwLmJsamlleC5jb20vP3Y9CuWGsOixhixodHRwczovL2JkLmp4LmNuLz91cmw9CkNLLGh0dHBzOi8vd3d3LmNrcGxheWVyLnZpcC9qaWV4aS8/dXJsPQpIOCxodHRwczovL3d3dy5oOGp4LmNvbS9qaWV4aS5waHA/dXJsPQpKWSxodHRwczovL2p4LnBsYXllcmp5LmNvbS8/dXJsPQrop6PmnpBsYSxodHRwczovL2FwaS5qaWV4aS5sYS8/dXJsPQpNM1U4LGh0dHBzOi8vangubTN1OC50di9qaWV4aS8/dXJsPQpQTSxodHRwczovL3d3dy5wbGF5bTN1OC5jbi9qaWV4aS5waHA/dXJsPQrnm5jlj6QsaHR0cHM6Ly93d3cucGFuZ3VqaWV4aS5jYy9qaWV4aS5waHA/dXJsPQrkuIPlk6UsaHR0cHM6Ly9qeC5ubnh2LmNuL3R2LnBocD91cmw9CuWQrOS5kCxodHRwczovL2p4LmRqNnUuY29tLz91cmw9Cue7tOWkmixodHRwczovL2p4Lml2aXRvLmNuLz91cmw9CuiZvuexsyxodHRwczovL2p4LnhtZmx2LmNvbS8/dXJsPQpZVCxodHRwczovL2p4Lnlhbmd0dS50b3AvP3VybD0K5aSc5bmVLGh0dHBzOi8vd3d3LnllbXUueHl6Lz91cmw9CuS6keaekCxodHRwczovL2p4LnlwYXJzZS5jb20vaW5kZXgucGhwP3VybD0KMTfkupEsaHR0cHM6Ly93d3cuMTcxN3l1bi5jb20vangvdHkucGhwP3VybD0KMTgwLGh0dHBzOi8vanguMDAwMTgwLnRvcC9qeC8/dXJsPQo0SyxodHRwczovL2p4LjRrZHYuY29tLz91cmw9CjJ5cyxodHRwczovL2dqLmZlbnhpYW5nYi5jb20vcGxheWVyL2FuYWx5c2lzLnBocD92PQo4MDkwLGh0dHBzOi8vd3d3LjgwOTBnLmNuLz91cmw9YCwKCiAgICAgICAgICAgICAgICAgICAgICd2YWx1ZU5hbWUnOidwbGF5VmlkZW9MaW5lVGV4dCd9CgogICAgICAgICAgICAgICAgdmFyIHNldEh0bWwgPSAiPGRpdiBpZD0nc2V0TWFzaycgY2xhc3M9J3pobU1hc2snPjwvZGl2PiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd3cmFwLWJveCcgaWQ9J3NldFdyYXAnPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdpY29uU2V0UGFnZScgaWQ9J21vdmllSWNvblNldFBhZ2UnPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J2ljb25TZXRVbEhlYWQnPjxsaSBjbGFzcz0naWNvblNldFBhZ2VIZWFkJz48c3BhbiBjbGFzcz0nemhtX2JhY2snPjwvc3Bhbj48c3Bhbj4iK2xhbmcuaWNvblBvc2l0aW9uKyI8L3NwYW4+PHNwYW4gY2xhc3M9J2ljb25TZXRTYXZlJz7Dlzwvc3Bhbj48L2xpPjwvdWw+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0naWNvblNldFBhZ2VMaSc+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT4iK2xhbmcuaWNvbkhlaWdodCsi77yaPHNwYW4gY2xhc3M9J3RleHQtaW5wdXQnPjxpbnB1dCBjbGFzcz0ndGV4dC1pbnB1dF9fYm9keScgaWQ9J2ljb25Ub3AnIHZhbHVlPSciK2ljb25WaXBUb3ArIicgcGxhY2Vob2xkZXI9JyIrbGFuZy50aXBJY29uSGVpZ2h0KyInPjxzcGFuIGNsYXNzPSd0ZXh0LWlucHV0X192YWxpZGF0b3InPjwvc3Bhbj48L3NwYW4+PC9saT4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjxsaSAgc3R5bGU9J2Rpc3BsYXk6IGlubGluZS1mbGV4Oyc+PHNwYW4gc3R5bGU9J3BhZGRpbmctdG9wOjRweDsnPiIrbGFuZy5pY29uTGluZSsi77yaPC9zcGFuPjxkaXYgY2xhc3M9J3NlbGVjdC1ib3gnPjxzZWxlY3QgY2xhc3M9J3NlbGVjdC1ib3hfX2JvZHknIGlkPSdpY29uUG9zaXRpb24nPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8b3B0aW9uIHZhbHVlPSdsZWZ0JyAiK3NlbGVjdGVkTGVmdCsiPiIrbGFuZy5pY29uTGVmdCsiPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ncmlnaHQnICIrc2VsZWN0ZWRSaWdodCsiPiIrbGFuZy5pY29uUmlnaHQrIjwvb3B0aW9uPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3NlbGVjdD48L2Rpdj48L2xpPiIKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT4iK2xhbmcuaWNvbldpZHRoKyLvvJo8c3BhbiBjbGFzcz0ndGV4dC1pbnB1dCc+PGlucHV0IGNsYXNzPSd0ZXh0LWlucHV0X19ib2R5JyBpZD0naWNvbldpZHRoJyB2YWx1ZT0nIitpY29uVmlwV2lkdGgrIicgcGxhY2Vob2xkZXI9JyIrbGFuZy50aXBJY29uV2lkdGgrIic+PHNwYW4gY2xhc3M9J3RleHQtaW5wdXRfX3ZhbGlkYXRvcic+PC9zcGFuPjwvc3Bhbj48L2xpPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSAiPGxpICBzdHlsZT0nZGlzcGxheTogaW5saW5lLWZsZXg7Jz48c3BhbiBzdHlsZT0ncGFkZGluZy10b3A6NHB4Oyc+IitsYW5nLmljb25XYWl0VGltZSsi77yaPC9zcGFuPjxkaXYgY2xhc3M9J3NlbGVjdC1ib3gnPjxzZWxlY3QgY2xhc3M9J3NlbGVjdC1ib3hfX2JvZHknIGlkPSdpY29uV2FpdFRpbWUnPiI7CgogICAgICAgICAgICAgICAgZm9yKGxldCBpID0xO2k8PTg7aSsrKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGljb25TZWxlY3RlZCA9IEdNX2dldFZhbHVlKCdpY29uV2FpdFRpbWUnKT09aS8yPydzZWxlY3RlZCc6Jyc7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPG9wdGlvbiB2YWx1ZT0iK2kvMisiICIraWNvblNlbGVjdGVkKyI+IitpLzIrIuenkjwvb3B0aW9uPiI7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9zZWxlY3Q+PC9kaXY+PC9saT4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpPumAjyDmmI4g5bqmIO+8mjxzcGFuIGNsYXNzPSd0ZXh0LWlucHV0Jz48aW5wdXQgY2xhc3M9J3RleHQtaW5wdXRfX2JvZHknIGlkPSdpY29uT3BhY2l0eScgdmFsdWU9JyIraWNvblZpcE9wYWNpdHkrIicgcGxhY2Vob2xkZXI9JyIrbGFuZy50aXBJY29uT3BhY2l0eSsiJz48L3NwYW4+PC9saT4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC91bD48L2Rpdj4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nemhtX3NldF9wYWdlJyBpZD0nbW92aWVWaWRlb1NldFBhZ2UnPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J2ljb25TZXRVbEhlYWQnPjxsaSBjbGFzcz0nemhtX3NldF9wYWdlX2hlYWRlcic+PHNwYW4gY2xhc3M9J3pobV9iYWNrJz48L3NwYW4+PHNwYW4+IitsYW5nLnNldFBsYXlWaWRlbysiPC9zcGFuPjxzcGFuICBjbGFzcz0naWNvblNldFNhdmUnPsOXPC9saT48L3VsPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J3pobV9zZXRfcGFnZV9saXN0JyBzdHlsZT0nb3ZlcmZsb3cteTp1bnNldCc+IjsKCiAgICAgICAgICAgICAgICBsZXQgYmFja0NvbG9yLHN3aXRjaEJhY2tDb3Jsb3IsZGlzcGxheTsKCiAgICAgICAgICAgICAgICBsZXQgb3B0aW9uVmFsdWUgPSBHTV9nZXRWYWx1ZShwbGF5VmlkZW9PcHRpb25Kc29uLm9wdGlvbklELHBsYXlWaWRlb09wdGlvbkpzb24uZGVmYXVsdCk7CgogICAgICAgICAgICAgICAgaWYob3B0aW9uVmFsdWUgIT0gJzIyJyl7CgogICAgICAgICAgICAgICAgICAgIGJhY2tDb2xvciA9ICcjZmZmJzsKCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZGJzsKCiAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZTZkNzMnOwoKICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkU1RTUnOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nemhtX3NldF9wYWdlX2NvbnRlbnQnPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSAiPHNwYW4gY2xhc3M9J3BsYXlWaWRlb09wdGlvbk5hbWUnPiIrcGxheVZpZGVvT3B0aW9uSnNvbi5vcHRpb25OYW1lKyI8L3NwYW4+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3pobV9jaXJjdWxhcicgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6Iitzd2l0Y2hCYWNrQ29ybG9yKyInIGlkPSciK3BsYXlWaWRlb09wdGlvbkpzb24ub3B0aW9uSUQrIic+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3JvdW5kLWJ1dHRvbicgc3R5bGU9J2JhY2tncm91bmQ6ICIrYmFja0NvbG9yKyI7IGxlZnQ6ICIrb3B0aW9uVmFsdWUrInB4Oyc+PC9kaXY+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8L2Rpdj48L2Rpdj4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwrPSI8L2xpPjxsaT4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdj7op6PmnpDnur/ot688L2Rpdj4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nZm9ybV9fdGV4dGFyZWEnPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd0ZXh0YXJlYSBqcy1mbGV4aWJsZS10ZXh0YXJlYScgc3R5bGU9J3BhZGRpbmc6IDVweCAwcHg7JyBpZD0nIitwbGF5VmlkZW9PcHRpb25Kc29uLnRleHRhcmVhKyInPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dGV4dGFyZWEgcm93cz0nOScgY2xhc3M9J3RleHRhcmVhX19ib2R5IHpobV9zY3JvbGwnIHBsYWNlaG9sZGVyPSciK2xhbmcudGlwUGxheVZpZGVvTGluZUFkZCsiJyBzdHlsZT0nd2lkdGg6MjUwcHg7Zm9udC1zaXplOjEycHg7cGFkZGluZzo0cHg7cmVzaXplOm5vbmU7JyBpZD0nIitwbGF5VmlkZW9PcHRpb25Kc29uLnRleHRhcmVhSWQrIic+IitHTV9nZXRWYWx1ZShwbGF5VmlkZW9PcHRpb25Kc29uLnZhbHVlTmFtZSxwbGF5VmlkZW9PcHRpb25Kc29uLnRpcCkrIjwvdGV4dGFyZWE+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvZGl2PjwvZGl2PjwvbGk+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvdWw+IgoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9kaXY+IgoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0VWxIZWFkJz48bGkgY2xhc3M9J2ljb25TZXRQYWdlSGVhZCc+PHNwYW4+PC9zcGFuPjxzcGFuPiIrbGFuZy5zZXQrIjwvc3Bhbj48c3BhbiBjbGFzcz0naWNvblNldFNhdmUnPsOXPC9zcGFuPjwvbGk+PC91bD4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdzZXRXcmFwTGknPiI7CgogICAgICAgICAgICAgICAgZm9yKHZhciBzZXROPTA7c2V0TjxzZXRMaXN0SnNvbi5sZW5ndGg7c2V0TisrKXsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RWYWx1ZSA9IEdNX2dldFZhbHVlKHNldExpc3RKc29uW3NldE5dLnNldExpc3RJRCwnMjInKTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tDb2xvcixhcnJvd0NvbG9yLHN3aXRjaEJhY2tDb3Jsb3I7CgogICAgICAgICAgICAgICAgICAgIGlmKGxpc3RWYWx1ZSAhPSAyMil7CiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tDb2xvciA9ICcjZmZmJzsKICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3dDb2xvcj0gJyNFRUUnOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkYnOwoKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZTZkNzMnOwogICAgICAgICAgICAgICAgICAgICAgICBhcnJvd0NvbG9yID0gJyNDQ0MnOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkU1RTUnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYoc2V0TGlzdEpzb25bc2V0Tl0uc2V0UGFnZUlEID09ICcnKXsKICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3dDb2xvciA9ICcjRUVFJzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpPjxzcGFuPiIrc2V0TGlzdEpzb25bc2V0Tl0ubGlzdE5hbWUrIjwvc3Bhbj4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3NldFdyYXBMaUNvbnRlbnQnPiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nemhtX2NpcmN1bGFyJyBpZD0nIitzZXRMaXN0SnNvbltzZXROXS5zZXRMaXN0SUQrIicgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6ICIrc3dpdGNoQmFja0NvcmxvcisiOyc+PGRpdiBjbGFzcz0ncm91bmQtYnV0dG9uJyBzdHlsZT0nYmFja2dyb3VuZDogIitiYWNrQ29sb3IrIjtsZWZ0OiAiK2xpc3RWYWx1ZSsicHgnPjwvZGl2PjwvZGl2PiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHNwYW4gY2xhc3M9J3RvLXJpZ2h0JyBkYXRhPSciK3NldExpc3RKc29uW3NldE5dLnNldFBhZ2VJRCsiJyB0YWtlUGxhY2U9JyIrc2V0TGlzdEpzb25bc2V0Tl0udGFrZVBsYWNlKyInIHN0eWxlPSdib3JkZXI6IHNvbGlkICIrYXJyb3dDb2xvcisiOyBib3JkZXItd2lkdGg6IDAgM3B4IDNweCAwOyc+PC9zcGFuPjwvZGl2PjwvbGk+IjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvdWw+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgc3R5bGU9J2hlaWdodDo0MHB4OycgaWQ9J3pobVRha2VQbGFjZSc+PC9kaXY+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J2ljb25TZXRGb290JyBzdHlsZT0nJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0Rm9vdExpJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpPjxhIGhyZWY9J2h0dHBzOi8vZ2l0bGFiLmNvbS9sYW5oYWhhL2xhbnJlbmppYW9iZW4jJUU1JUFFJTg5JUU4JUEzJTg1dG0nIHRhcmdldD0nX2JsYW5rJz4iK2xhbmcuc2NyaXB0c2luc3RhbGwrIjwvYT48L2xpPuODuzxsaT48YSBocmVmPSdodHRwczovL2dpdGxhYi5jb20vbGFuaGFoYS9sYW5yZW5qaWFvYmVuIyVFNCVCRCVCRiVFNyU5NCVBOCcgdGFyZ2V0PSdfYmxhbmsnPiIrbGFuZy5zY3JpcHRzdXNlKyI8L2E+PC9saT7jg7s8bGk+PGEgaHJlZj0naHR0cHM6Ly9naXRsYWIuY29tL2xhbmhhaGEvbGFucmVuamlhb2JlbiMlRTUlQjglQjglRTglQTclODElRTklOTclQUUlRTklQTIlOTgnIHRhcmdldD0nX2JsYW5rJz4iK2xhbmcucXVlc3Rpb24rIjwvYT48L2xpPuODuzxsaT48YSBocmVmPSdodHRwczovL3QubWUvK3NHbzZaWnZ5NTR3ellUbGwnIHRhcmdldD0nX2JsYW5rJz4iK2xhbmcudGdncm91cCsiPC9hPjwvbGk+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9JzwvdWw+JzsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9JzwvZGl2Pic7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSAiPC9kaXY+IjsKCiAgICAgICAgICAgICAgICBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2V0TWFzaycpKSByZXR1cm47CgogICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVFbGVtZW50KCdkaXYnLCd6aG1NZW51Jyk7CgogICAgICAgICAgICAgICAgbGV0IHpobU1lbnUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemhtTWVudScpOwoKICAgICAgICAgICAgICAgIHpobU1lbnUuaW5uZXJIVE1MID0gc2V0SHRtbDsKCiAgICAgICAgICAgICAgICBsZXQgdGltZXJaaG1JY29uID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1NZW51JykpewoKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lclpobUljb24pOyAvLyDlj5bmtojlrprml7blmagKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaXJjdWxhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy56aG1fY2lyY3VsYXInKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmN1bGFyLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKF9lKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJ1dHRvblN0eWxlID0gaXRlbS5jaGlsZHJlblswXS5zdHlsZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnQgPSBidXR0b25TdHlsZS5sZWZ0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcGFyc2VJbnQobGVmdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0TGVmdFZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsZWZ0PT0wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblN0eWxlLmxlZnQgPSAnMjJweCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25TdHlsZS5iYWNrZ3JvdW5kID0gJyNmZTZkNzMnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kPScjZmZFNUU1JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0ubmV4dFNpYmxpbmcgJiYgaXRlbS5uZXh0U2libGluZy5nZXRBdHRyaWJ1dGUoJ2RhdGEnKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5uZXh0U2libGluZy5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywnYm9yZGVyOiBzb2xpZCAjY2NjO2JvcmRlci13aWR0aDogMCAzcHggM3B4IDA7JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdExlZnRWYWx1ZSA9IDIyOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblN0eWxlLmxlZnQgPSAnMHB4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblN0eWxlLmJhY2tncm91bmQgPSAnI2ZmZic7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLmJhY2tncm91bmQ9JyNmZmYnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5uZXh0U2libGluZyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5uZXh0U2libGluZy5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywnYm9yZGVyOiBzb2xpZCAjRUVFO2JvcmRlci13aWR0aDogMCAzcHggM3B4IDA7JykKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RMZWZ0VmFsdWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNldExpc3RJRCA9IGl0ZW0uaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKHNldExpc3RJRCxsaXN0TGVmdFZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9SaWdodCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50by1yaWdodCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdG9SaWdodC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnQgPSBpdGVtLnByZXZpb3VzU2libGluZy5jaGlsZHJlblswXS5zdHlsZS5sZWZ0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcGFyc2VJbnQobGVmdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxlZnQgIT0gMjIpIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNldFBhZ2VJRCA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYWdlSWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZXRQYWdlSUQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlSWQuY2xhc3NOYW1lPSdpY29uU2V0UGFnZSB0b0xlZnRNb3ZlJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lrp7ml7blm77moIfpq5jluqYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZXRQYWdlSUQgPT0gJ21vdmllSWNvblNldFBhZ2UnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpY29uVG9wJykudmFsdWU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3pobWxvZ28iKS5vZmZzZXRUb3A7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtVGFrZVBsYWNlJykuc3R5bGU9ImhlaWdodDoyMDBweCI7CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldFBhZ2VJRCA9PSAnbW92aWVWaWRlb1NldFBhZ2UnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1UYWtlUGxhY2UnKS5zdHlsZT0iaGVpZ2h0OjIwMHB4IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHNldFBhZ2VJRCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9CYWNrID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnpobV9iYWNrJyk7CgogICAgICAgICAgICAgICAgICAgICAgICB0b0JhY2suZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnREb20gPSBpdGVtLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnREb20uY2xhc3NOYW1lPSdpY29uU2V0UGFnZSB0b1JpZ2h0TW92ZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1UYWtlUGxhY2UnKS5zdHlsZT0naGVpZ2h0OjQwcHg7JwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNldFNhdmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaWNvblNldFNhdmUnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNhdmUuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoKT0+ewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvblRvcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uVG9wJykudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uT3BhY2l0eT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvbk9wYWNpdHknKS52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25Qb3NpdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uUG9zaXRpb24nKS52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25XaWR0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uV2lkdGgnKS52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25XYWl0VGltZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uV2FpdFRpbWUnKS52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlWaWRlb0xpbmVUZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BsYXlWaWRlb0xpbmVUZXh0YXJlYScpLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVZpZGVvTGluZUxlZnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdmlkZW9QbGF5TGluZUFkZCcpLmNoaWxkcmVuWzBdLnN0eWxlLmxlZnQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb25Ub3AgIT0gJycpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISgvKF5bMC05XVswLTldezAsMn0kKS8udGVzdChpY29uVG9wKSkpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGxhbmcudGlwRXJyb3JJY29uSGVpZ2h0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vX3RoaXMuc2V0Q29va2llKCdpY29uVG9wJyxpY29uVG9wLDMwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uVG9wJyxpY29uVG9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb25PcGFjaXR5ICE9ICcnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoL14oPzowfFsxLTldWzAtOV0/fDEwMCkkLy50ZXN0KGljb25PcGFjaXR5KSkpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGxhbmcudGlwRXJyb3JJY29uT3BhY2l0eSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL190aGlzLnNldENvb2tpZSgnaWNvblRvcCcsaWNvblRvcCwzMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoaWNvbk9wYWNpdHkpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2ljb25PcGFjaXR5JyxpY29uT3BhY2l0eSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpY29uUG9zaXRpb24gIT0gJycpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9fdGhpcy5zZXRDb29raWUoJ2ljb25Qb3NpdGlvbicsaWNvblBvc2l0aW9uLDMwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uUG9zaXRpb24nLGljb25Qb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpY29uV2FpdFRpbWUgIT0gJycpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2ljb25XYWl0VGltZScsaWNvbldhaXRUaW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb25XaWR0aCAhPScnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoLyheKFsxLTldWzAtOV0/KSQpLy50ZXN0KGljb25XaWR0aCkpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydChsYW5nLnRpcEVycm9ySWNvbldpZHRoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vX3RoaXMuc2V0Q29va2llKCdpY29uV2lkdGgnLGljb25XaWR0aCwzMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaWNvbldpZHRoJyxpY29uV2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoR01fZ2V0VmFsdWUoJ3ZpZGVvUGxheUxpbmVBZGQnKSA9PSAyMil7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwbGF5VmlkZW9MaW5lVGV4dCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVPYmogPSBfdGhpcy5nZXRMaW5lKHBsYXlWaWRlb0xpbmVUZXh0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsaW5lT2JqLmxlbmd0aD4wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ3BsYXlWaWRlb0xpbmVUZXh0JyxwbGF5VmlkZW9MaW5lVGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ+e6v+i3r+i+k+WFpeS4jeato+ehricpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdwbGF5VmlkZW9MaW5lVGV4dCcsJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ3BsYXlWaWRlb0xpbmVUZXh0JyxwbGF5VmlkZW9MaW5lVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5LmdvKDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uVG9wJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uVG9wID0gdGhpcy52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKC8oXlsxLTldXGQqJCkvLnRlc3QoaWNvblRvcCkpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtaXMtdmFsaWQnLCdmYWxzZScpCgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1pcy12YWxpZCcsJ3RydWUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvbldpZHRoJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uV2lkdGggPSB0aGlzLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoLyheWzEtOV1cZCokKS8udGVzdChpY29uV2lkdGgpKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWlzLXZhbGlkJywnZmFsc2UnKQoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtaXMtdmFsaWQnLCd0cnVlJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAvL+iFvuiur+inhumikeW/q+aNt+mUruWGsueqgQogICAgICAgICAgICAgICAgICAgICAgICBpZihjb3Vwb25VcmwubWF0Y2goL3ZcLnFxXC5jb21cL3hcL2NvdmVyLykpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGRMaW5lVGV4dCA9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BsYXlWaWRlb0xpbmVUZXh0YXJlYScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpbmVUZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRQb3MgPSBhZGRMaW5lVGV4dC5zZWxlY3Rpb25TdGFydDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVuZFBvcyA9IGFkZExpbmVUZXh0LnNlbGVjdGlvbkVuZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0UG9zID09PSB1bmRlZmluZWQgfHwgZW5kUG9zID09PSB1bmRlZmluZWQpIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Q29kZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZS5rZXlDb2RlID09IGl0ZW0uY29kZSAmJiBlLnNoaWZ0S2V5PT1pdGVtLmlzU2hpZnQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0VmFsdWUgPSBhZGRMaW5lVGV4dC52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRWYWx1ZSA9IHRleHRWYWx1ZS5zdWJzdHJpbmcoMCxzdGFydFBvcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVuZFZhbHVlID0gdGV4dFZhbHVlLnN1YnN0cmluZyhzdGFydFBvcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFsbFZhbHVlID0gc3RhcnRWYWx1ZStpdGVtLnZhbHVlK2VuZFZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpbmVUZXh0LnZhbHVlPWFsbFZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpbmVUZXh0LnNlbGVjdGlvblN0YXJ0ID0gc3RhcnRQb3MrMTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaW5lVGV4dC5zZWxlY3Rpb25FbmQgPSBlbmRQb3MrMTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBjcmVhdGVFbGVtZW50KGRvbSxkb21JZCl7CgogICAgICAgICAgICAgICAgdmFyIHJvb3RFbGVtZW50ID0gZG9jdW1lbnQuYm9keTsKCiAgICAgICAgICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZG9tKTsKCiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmlkID0gZG9tSWQ7CgogICAgICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnRIdG1sQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKCiAgICAgICAgICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTsKCiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnRIdG1sQ29udGVudCk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICByZXF1ZXN0KG1ldGhvZCx1cmwsZGF0YSxpc0Nvb2tpZT0nJyl7CgogICAgICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+ewoKICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVxdWVzdC5yZWFkeVN0YXRlPT00KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXF1ZXN0LnN0YXR1cz09MjAwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXF1ZXN0LnN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Lm9wZW4obWV0aG9kLHVybCk7CiAgICAgICAgICAgICAgICAgICAgLy9yZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgaWYoaXNDb29raWUpewogICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpOwogICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2VuZChkYXRhKTsKCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2V0Q29va2llKGNuYW1lLGN2YWx1ZSxleGRheXMpewoKICAgICAgICAgICAgICAgIHZhciBkID0gbmV3IERhdGUoKTsKCiAgICAgICAgICAgICAgICBkLnNldFRpbWUoZC5nZXRUaW1lKCkrKGV4ZGF5cyoyNCo2MCo2MCoxMDAwKSk7CgogICAgICAgICAgICAgICAgdmFyIGV4cGlyZXMgPSAiZXhwaXJlcz0iK2QudG9HTVRTdHJpbmcoKTsKCiAgICAgICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjbmFtZSsiPSIrY3ZhbHVlKyI7ICIrZXhwaXJlczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZ2V0Q29va2llKGNuYW1lKXsKICAgICAgICAgICAgICAgIHZhciBuYW1lID0gY25hbWUgKyAiPSI7CiAgICAgICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpPGNhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXS50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGMuaW5kZXhPZihuYW1lKT09MCkgeyByZXR1cm4gYy5zdWJzdHJpbmcobmFtZS5sZW5ndGgsYy5sZW5ndGgpOyB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGdldFF1ZXJ5U3RyaW5nKGUpIHsKICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IFJlZ0V4cCgiKF58JikiICsgZSArICI9KFteJl0qKSgmfCQpIik7CiAgICAgICAgICAgICAgICB2YXIgYSA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpLm1hdGNoKHQpOwogICAgICAgICAgICAgICAgaWYgKGEgIT0gbnVsbCkgcmV0dXJuIGFbMl07CiAgICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGdldFVybFBhcmFtcyh1cmwpewogICAgICAgICAgICAgICAgbGV0IHJlZyA9IC8oW14/JisjXSspPShbXj8mKyNdKykvZzsKICAgICAgICAgICAgICAgIGxldCBvYmo9e307CiAgICAgICAgICAgICAgICB1cmwucmVwbGFjZShyZWcsKHJlcywkMSwkMik9PntvYmpbJDFdPSQyfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgICAgICB9CgogICAgICAgICAgICBnZXRMaW5lKHRleHQpewoKICAgICAgICAgICAgICAgIGxldCB0ZXh0QXJyID0gdGV4dC5zcGxpdCgnXG4nKTsKCiAgICAgICAgICAgICAgICBpZih0ZXh0QXJyLmxlbmd0aCA+IDApewoKICAgICAgICAgICAgICAgICAgICBsZXQgbGluZU9iaiA9IFtdOwoKICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSAvXiguKykoaHR0cHM/OlwvXC8uKykkLzsKCiAgICAgICAgICAgICAgICAgICAgdGV4dEFyci5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW0ucmVwbGFjZSgvXHMqLCovZywnJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighaXRlbSkgcmV0dXJuIHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZU1hdGNoID0gaXRlbS5tYXRjaChtYXRjaCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihsaW5lTWF0Y2gpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVPYmoucHVzaCh7J25hbWUnOmxpbmVNYXRjaFsxXS5zdWJzdHJpbmcoMCw0KSwndXJsJzpsaW5lTWF0Y2hbMl19KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVPYmo9W107CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVPYmo7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vYWxs5Y+C5pWw6buY6K6k56m677yM5piv55yf5pe26L+U5Zue5Li65pWw57uECiAgICAgICAgICAgIHN0YXRpYyBnZXRFbGVtZW50KGNzcyxhbGw9JycpewoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57CgogICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSAwOwoKICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgbnVtKysKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb207CgogICAgICAgICAgICAgICAgICAgICAgICBpZihhbGwgPT0gZmFsc2UpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY3NzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkb20pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkb20pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoY3NzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkb20ubGVuZ3RoPjApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkb20pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYobnVtPT0yMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0sMzAwKQoKICAgICAgICAgICAgICAgICAgICB9KQoKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN0YXRpYyB0b2FzdChtc2csZHVyYXRpb24pewoKICAgICAgICAgICAgICAgIGR1cmF0aW9uPWlzTmFOKGR1cmF0aW9uKT8zMDAwOmR1cmF0aW9uOwoKICAgICAgICAgICAgICAgIGxldCB0b2FzdERvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwoKICAgICAgICAgICAgICAgIHRvYXN0RG9tLmlubmVySFRNTCA9IG1zZzsKCiAgICAgICAgICAgICAgICAvL3RvYXN0RG9tLnN0eWxlLmNzc1RleHQ9IndpZHRoOiA2MCU7bWluLXdpZHRoOiAxNTBweDtvcGFjaXR5OiAwLjc7aGVpZ2h0OiAzMHB4O2NvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7bGluZS1oZWlnaHQ6IDMwcHg7dGV4dC1hbGlnbjogY2VudGVyO2JvcmRlci1yYWRpdXM6IDVweDtwb3NpdGlvbjogZml4ZWQ7dG9wOiA0MCU7bGVmdDogMjAlO3otaW5kZXg6IDk5OTk5OTtiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCk7Zm9udC1zaXplOiAxMnB4OyI7CiAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS5jc3NUZXh0PSdwYWRkaW5nOjJweCAxNXB4O21pbi1oZWlnaHQ6IDM2cHg7bGluZS1oZWlnaHQ6IDM2cHg7dGV4dC1hbGlnbjogY2VudGVyO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUpO2JvcmRlci1yYWRpdXM6IDRweDtjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO3Bvc2l0aW9uOiBmaXhlZDt0b3A6IDUwJTtsZWZ0OiA1MCU7ei1pbmRleDogOTk5OTk5OTtiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCk7Zm9udC1zaXplOiAxNnB4OycKCiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRvYXN0RG9tKTsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IDAuNTsKCiAgICAgICAgICAgICAgICAgICAgdG9hc3REb20uc3R5bGUud2Via2l0VHJhbnNpdGlvbiA9ICctd2Via2l0LXRyYW5zZm9ybSAnICsgZCArICdzIGVhc2UtaW4sIG9wYWNpdHkgJyArIGQgKyAncyBlYXNlLWluJzsKCiAgICAgICAgICAgICAgICAgICAgdG9hc3REb20uc3R5bGUub3BhY2l0eSA9ICcwJzsKCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0b2FzdERvbSkgfSwgZCAqIDEwMDApOwoKICAgICAgICAgICAgICAgIH0sIGR1cmF0aW9uKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9jcmVhdGUgemhtTG9nb0ljb24KICAgICAgICAgICAgemhtTG9nbygpewoKICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgIGxldCBzb3J0RGl2ID0gaWNvblZpcFBvc2l0aW9uPT0nbGVmdCc/J3Jvdyc6J3Jvdy1yZXZlcnNlJzsKCiAgICAgICAgICAgICAgIGxldCBwbGF5VmlkZW9TdHlsZSA9IGAKICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZG9lX2ljb257CiAgICAgICAgICAgICAgICAgIHBhZGRpbmctdG9wOjJweDsKICAgICAgICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7CiAgICAgICAgICAgICAgICAgIHotaW5kZXg6OTk5OTk5OwogICAgICAgICAgICAgICAgICBwb3NpdGlvbjpmaXhlZDske2ljb25WaXBQb3NpdGlvbn06NXB4O3RvcDoke2ljb25WaXBUb3B9cHg7CiAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyOwogICAgICAgICAgICAgICAgICBvdmVyZmxvdzp2aXNpYmxlOwogICAgICAgICAgICAgICAgICBkaXNwbGF5OmZsZXg7CiAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiR7c29ydERpdn07CiAgICAgICAgICAgICAgICAgIHdpZHRoOmF1dG87CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX3dyYXB7CiAgICAgICAgICAgICAgICAgIHotaW5kZXg6OTk5OTk5OTsKICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLmljb25Mb2dvewogICAgICAgICAgICAgICBvcGFjaXR5OiR7aWNvblZpcE9wYWNpdHkvMTAwfTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZXsKICAgICAgICAgICAgICAgICAgd2lkdGg6MzIwcHg7CiAgICAgICAgICAgICAgICAgIGhlaWdodDozMTZweDsKICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteTpzY3JvbGw7CiAgICAgICAgICAgICAgICAgIG92ZXJmbG93LXg6aGlkZGVuOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlX2xpbmVfdWx7CiAgICAgICAgICAgICAgICAgIHdpZHRoOjMwMHB4OwogICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgICAgICAgICAgIGZsZXgtZmxvdzogcm93IHdyYXA7CiAgICAgICAgICAgICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICBtYXJnaW46MHB4OwoKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZV91bF9saXsKICAgICAgICAgICAgICAgICAgcGFkZGluZzo0cHggMHB4OwogICAgICAgICAgICAgICAgICBtYXJnaW46MnB4OwogICAgICAgICAgICAgICAgICB3aWR0aDozMCU7CiAgICAgICAgICAgICAgICAgIGNvbG9yOiNGRkY7CiAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyOwogICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmMjQ0NDM7CiAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6MHB4IDBweCAxMHB4ICNmZmY7CiAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxNHB4OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lX3VsX2xpOmhvdmVyewogICAgICAgICAgICAgICAgICBjb2xvcjojMjYwMDMzOwogICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmY2MwYzAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuemhtX2xpbmVfc2VsZWN0ZWR7CiAgICAgICAgICAgICAgICAgIGNvbG9yOiMyNjAwMzM7CiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZjYzBjMAogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fanh7CiAgICAgICAgICAgICAgICAgIHdpZHRoOjEwMCU7CiAgICAgICAgICAgICAgICAgIGhlaWdodDoxMDAlOwogICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTsKICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO3RvcDowcHg7cGFkZGluZzowcHg7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYDsKCiAgICAgICAgICAgICAgICBkb21TdHlsZSAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGxheVZpZGVvU3R5bGUpKTsKCiAgICAgICAgICAgICAgICBkb21IZWFkLmFwcGVuZENoaWxkKGRvbVN0eWxlKTsKCiAgICAgICAgICAgICAgICBsZXQgcGxheVdyYXBIdG1sID0gIjxkaXYgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApJyB0YXJnZXQ9J19ibGFuaycgc3R5bGU9JycgY2xhc3M9J3BsYXlCdXR0b24gemhtX3BsYXlfdmlkb2VfaWNvbicgaWQ9J3pobWxvZ28nPiI7CgogICAgICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9ICI8aW1nIGNsYXNzPSdpY29uTG9nbycgc3R5bGU9J3dpZHRoOiIraWNvblZpcFdpZHRoKyJweDtoZWlnaHQ6IitpY29uVmlwV2lkdGgqMS41KyJweCcgc3JjPSdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhaQUNXQVBjQUFQSkVRL3Y3K2ZuTHlQakN3ZlJuWmZuVDBQSktTZmpHeFB2MjlQblkxL05iV3Z2MTgvYVVrL3JsNC9ydzd2bkt5UGFKaVBycjZmYWFtUFJ5Y2ZhTGl2djU5L0pKU1BydjdmTlZWUG5lM2ZydDYvTlFUL3Y2K1BlbHBQYWdudlIzZHZpNnVQdno4ZmV4ci9uT3pQZWdudnJrNHZSMWMvSkdSZnJxNlBuUXp2akN3UG5TMFBuWjEvdnc3dm5hMmZlb3AvZW1wZnJjMnZOVVUvaXhyL1I0ZHZXSmgvZXNxdkpIUnZ2eDcvcnk4Zk5TVWZOV1ZQakJ3UFY2ZWZhTWl2bmYzZmk4dXZXRGd2djQ5dnJwNlByeThQSlBUdmFZbC9uVDBmblcxUGVycWZSc2EvUnZidldBZi9WOWZQbms0dmkydGZSallmUmhYL3Z1N1BOWVYvSkZSUG5rNGZhSGhmYVhsdnYzOWZyaDMvaTd1dm5OeS9uT3kvcnM2dmVycXZSZ1h2bmQyL2FHaFBXUmtQVi9mZnJpNFByajRQaXdyZm5MeWZhVWt2UmZYZkpOVFBqRncvZXlzZlJsWS9SeGNQdnY3ZmV6c3ZpMHN2djI4L2FibXZlcXFQZXBxUEpNUy9leXNQV09qZk5kWFBSemN2djA4dlJ1YmZybzV2ZWlvZmVsby9OWldQbloyUE5wYVBuVTB2UmZYdm5IeGZpdXJQakF2L25RemZybjVmbmMyL2Uwc3ZhZG5QZTR0L2FTa2ZOWFZ2Um1aUGV0cXZuWTF2aTh1L2Vpb1BpdHEvaS92ZlJ3Yi9SMWRQbmUzUGFlbmZhY212ZTN0dm5Sei9yajRmYVhsZlYrZlBXRmhQSkxTdmFOaS9XTWpQUjBjL2FWay9XUGovYWRtL3JwNS9uSXh2Um9adlJpWWZqRHd2YVZsUEpPVGZlMnRmTnFhZkpSVVBla292YWFtZk5hV2ZWOGV2bmQzUG5OelBuVjFQZXNxL2pFdy9WNmVQUjNkL25nM3ZydzdmYVdsUGVucGZhZm5mV1Bqdml3cnZOV1Zmbk15dmk2dWZWL2Z2VjllL25iMnZydTYvUmtZdmpBdnZuSXhmUmlZUGk5dlBlZ24vVjdlZmVqb2ZlMXRQV0NnZnJtNVBKSVIvbmMydk5jVy9KUVQvakZ4UHZ5OFBXRGdmV0JmL1JzYlBWNWQvTnBhZk5jWFBuZjN2YUlodlJ2Yi9pdnJmblgxdk5SVWZhS2lmUnRiUGFabC9OZVhQZTV1UFdDZ1BScmF2YUloL05vWi9uSngvV0ZnL2k5dS9SMmRmakh4dmpJeHZOVFV2aS92dmUxcy9OZVhRQUFBQUFBQUFBQUFBQUFBQ0gvQzA1RlZGTkRRVkJGTWk0d0F3RUFBQUFoK1FRRWxnQUFBQ3dBQUFBQVpBQ1dBQUFJL2dBQkNCeElzS0RCZ3dnVEtseklzS0hEaHhBalNweElzYUxGaXhnemF0eklzYVBIanlCRGlseElZRVNBQUNNSWpGeHBVSVdEQUE1VWVGakk0dVRKQkN4ekNzeGhrOGlRaFRadDZzeXB3YWFHREFzSEJPVXhsT1VMSkNXUXZLaXhjQU9EQVFNWWJHaTZVa0dQR2owVUdPQkt0cXpaczJqVHFsM0x0cU1DRTAxTWlLMUtZc1FJRWxzN2ZtRkNhOUVXRjRrUWhDaVRRb1VJVFV6U2ZPeVFna1dLRGtHU0x0V29BOWl1WlVFemF3NGdCWnFWSWh0UjJFU0JVNkZtakRRT0Nkbk1lak1DTFJNeUxyQzU0QUxOb0tVcGpuSFJ1bmZyVHZVdW5wbTk0TUVma2dNY1hCaWdjdUlsM3I2anN6NmpvS0lKQ1I0a21OZ3hFa01qM3lYby9ta0NKYWlXQlRWZjlGaVpNNmxFYndTb1RyUTl5RXNLNndxcVNPVnhLTU5Xa2plc3VkRGNmQUJjUXdkcmZWd2hBMFVXaElISVprTDBRcUFhSzJ6bWlRODNaQVRGRVpvVk1oOEd5bWlHQUNVV2NFVEZGUWdFOVVCRUJtQ2dBQVpqTVVRQUNTUU1xSkFNWldqbWdtSWZmWkhBU1F1VUVoRUVJandoQWdRMkhtUkRVRFlzcEFaMFFkMVJZa2duaU1GQUZCTEZZRk1NUUN6MGtrMjJKWFRDZzVtaFFaWWRWcEJqeDBKeTBCWm1RazRFVllWQ2RXVEdRVHBrRVZKVUFDNkFsdEFQTm1XaXdrSVFmSGtCQkFuMVlxY1ZaZmtScFVJK3hBRkVIRDRvMFJBQlNSYWtBNEJCaldKV0I1bkZocEFCVTBReFJZd1kzWkdaTG1mbHNacE4vbVZNdVZJYkhBU1ZoYXhsTVpMWktUbWxFQlFIc2FSMVFvZzI5U0hmU0tWa1pzWmE2bVJHZ1VZVGlHcFFBVUc5NGVkQ09wZ1VnaGV2Z0xSRlVDNGN0QVFESGpDd0JIY0tGWHFTQTRnU3hFZVpEdWtUMURLT0hNdVJIa0ZwY0pCTE1NbTBVSncyelVrUUhFRjFnZXBDZTJqbVN6SWVOV05UT3dmeGRKSlBYZ2IxSmdBV2hCQVVNQSsxbGdJekhKMVF4eGFickduUW5nRWN0ZENTTmlWQmtEZEJWWEF0UTdXeXhnRW5qK1QwVkZSVHljZ0FBMGtTYkZNckVGWGcyeDZVbUN5U1YyRE5SVkVXUVRINmtOSFJwVElLRlFRYWhFRm1HQlFkVkNHNXRBYUdHeGo5c1VBRmpIeUVURkJsUlBUcVNTOEFFRVlmclJWQ1NFVnVCTVdIL2tlYkJBV0MyMEhWSVpBb3dtaThXUVVpNEROUm5UYjU0ZEYzTnFVTkVSWkIwVUhRSTV6VXJCa09jK0RhVU44MkhVUFFXMHpRNEhSQ0JDZ1ZBSE1ERFJLVU94R2xhSlBsQmNYRElXc05oQUZSS0VFTlFoQmoyQndCMlcwMjVRYTFUWlpDSlB0SkxoOVVqVFd0U2ZLT1ErL2ExQUJCb3AxRUdsQ1pEUlJCVUt6RUhwUVhDVmt3aCtHYkhWTGRRbEVFSlFWQkVnZEFzVUtxbjhTVVFMUFpWRXRFK1o5RXZrSVlXSVRtTW9PRkRtQXRJWUNJR1VIdVFSeDd6RVFoVnNHS1ZnWkN0Wk1zQ0NJSnN3bXJHQUlKWDdFbUVqZjZGVUd1azUzdFVBUUhRY2xHUk5BWEFCQTZCQm51MFV3SUZKS0hvT0RBSTlrN1NSdFdHQlFYTnFRSi9tVFlUQVFVUW9DZ0pNSWppZ2hLT1hob2swbzBCQXBjYU0yekVvS0pvSURCSTJ1SVdrU1NhQk5hTEVRR2Q2aGdac2hBZzRXSUlTaXE4RWdsZ2tLQ2lEakNKaUVvUnZtTWdNTE40TUFJR1ZxSUlZTGl4SUcwNkVVSFE0aFY3REpCZ1p3aUtFU0xTQ2dzWVlpN0lXUU1NZFJNQmRpZ0E0ZDh5eVppSUFpUmpJUWt5ZGprZmdBUVJGQzRjVUNOZExBMVhJRENRMDZ3dkFCSUN3QmFPZ21YdUJlVWdkeUFjallSUkVTNllRbHpxSklnTW9EREFJTkNoakZFNUJKQlFRQ3UyZ1NraXgya0pzVWp5Q1ZQMHNhSDRNRW1DSkFqeGlUQVFodmlVU0tPc29rOENoTExBTXlTaUtwajNVQStnUnVJU0NJb3dnQUFFeUtabVVsV2NpSjAvclBKRlFxeXlTTmw2aUh0Q3dxV0hJS3lBQmpEZzV0SlpVVW04S3VjRWVTUE1Mb0lsQUt3TElkMFFUckZ2TWdoZ3NJRmtWd1RqdHF3cUcvdW1NZUtRQ0l6UGhDSktGajRQNFo4N3o2VXpFZ1diV0t3a1lES0poVUluMHRabzlDTTBDQXpSc2pJakdwMEVCMzBMd0FwYUVpT3htaE1qVmlnQVVGcFFTQUZNb0VyZU9BS0UwQlhRbGgya2lZWlpCYVorUVJEMk9ETmttWWtHSm5KNUVIV3dKTWNyT0dCQ2ZuU1Nad3BFQU1rSXBrN1ZJZ2FkaEdBQmNEaG5odFJ3Z0J2WWErQ3hHOStjSklUUXFvWWxCTE1iQ2l5OEVSbTlvYVFIRzR2WFlacTEwSElHcFJ0a0tVSWdjZ01NUlRTZ1NQOFFIaVJZVWkwRm1LQmNXU0dGMDBwL2tMWWdxSUl6eFZFQVRRSWd1bW1XaEZtWkFZUFE1SEJMVElUQWg1eEpSYVpZWWRPMG5BOG5PckJMQWV5eVRsMHdvUnVCa0IzWnNsaEFOYkJFblRBUWpNY21PSkhWcXNRWkFZRkVBTVJCeXlrRUFFR21OVWlKNkFBcDRLQ0JZWTVCTGU2UFIxQzFBVVR6UnJFREwwVHlBM20wRXBmTk9FaUZoZ0dWRFhUaFZjeTVBV21QVUxQRkFLd2t3ak1JQ2V3ajAxY0FRQWxnSUUxSzhDRExDVHlEVE5vV0RPSXVPQkRVS1l5aGNnMUFIUVZDR050OGdWaURGT1NBbUNBRzlRZ3BtZkFneE9wYUEwQ05GSEtoeHoySndyaGFnQ2FaNUJGUlBXbDBqa0pCN0xnakVuTW9BUEJvTVlhQW9ITDNsQ0hJdno2aGI5SVFxTi9BdUFHZGV4Ti9qTXlFT1UyODhrV0ZobVhCOUJ3TG94SXd6ZWVlQzRBYUdBTU4vY21CVDBnRUFpRVRLS0NFR0FXSC9ielNUU1FoQzlrelFBWjFNd0k5cE9RTkh4aUVtQVFvMllXNElKamlHRVZoWjBQS0RhREF1dzZ4QUxoQU1jOGhvRUtDWkNDQ1c1QWI5WU9nb1o2bXFGYnN5NElSSGxyNkhSbXFnMFZETVFxY24wUUh4UkpCSlVpM2swTzRnZ2hDTUVWUlNiMlFBQjFFa0hSVWlqU2pnZ3oreHBqZ3RRdkFLRE10a1BLZWM2RURISUVoUlMzUS9yWlNYVi9aTmZ1anJlODUwM3Zlay9rM09tMmQwRklxQjJ0SXVUYjRkYjNRSWJUVndFY3h6VGRNNGdBSHNEd0I0aFhJUlJvK0FNR0lKQm9hT0hpV2docVFXQWdjWW1yb0FNZ2wwai8vbXFqN0FEa2hpQlFYbDFEdm8wVUFGRExKZ2RRdUhRaTBJbUhLOFN5Sno5STZrNml6b0o4KzNvN3RjbmZYQjZVbUJkRUFHN3V4QWNZd2hqSERPOGlGTWpNMGhYeUFha0w1T1VuTVRwQmtPN21DRXc5SVcrSmkzNHIwZ0svTFdUUU5tazUwV0V1Y3o4UHNTa1ZpcVpDZmlUMGdXQTlBRm9mQ05kUElvQ0NVR0FHQ1dobEFJYXVFd2trY3lHdC9QcmQ4eTZRdlFlZzd3ZjVRQ3ZmUHBTeTJ3UUdDWUZCVUNpLzlxeTNuZThKTVh4UXZvNlJvWnBaSUhFL3lRb1NrbnFWMjczb24zKzhRbHFKZVlRd0xTeThIb2lTdlhvUXpkdWtCUW14L0VrZXZ2allReDRoQ3o1SjdRK3lNNmxReGNVV20zMVFiQzZRcU51RTg1M0h1L0VWL3BMOEFDei9aRVpSTzBJcUhJQUxINFR1UEQvSXR5bE9rT0lmUFNqSFB3anRFM0prUW1WV0lUTUlDdEFMd21hYlNLQWc3cmQxOEJkNnpwSVFZVFptQzBGZWlEZDZCVkYxdnpjdHNQZCtOaEYvQlpGeTJGY1Fja1puL29ZUjZEZDRCWkYvTnJGNkFCaUJBamlCQnpFRDlDUjdaQUdDeTBZUUhmaC9JOGgyRW5nU0pTQnhrbEFDd29kTnBEY1VEbmdTQ0ZBUXl3TjhFQ2lESmVobU1GZ1cvYWQ4QXlGNkxSaURuamVEMG9FQU16QmVEcFlRYUtkNkE5RjZVemlFVDFpRXZvRUFLN0NEbzFJcXA4SVEvTVV1RE5HREFVQjVVUGFEQnhHQWVoZFZEVENIZEpnQkF2QjlEQkVwazVKc0ZLWllESkdFQWZBczF0ZUVUcWg5VUVpQi9oUkJiUUZnYmRBSEpnMXhoU29IaVZ2SWhZYm9oWWc0RWR0R2Nra1dGRXdHY1VHQkZJQ1lFSERZZUFPSUVlVFdKV1JHVkE2UmNnQ3dQT0pYaUl3SEFJNTNpUkxCYnFkbkVkL1dlb1JIaWJFNGl4a0JieDh4aUpvaGhxOUhoSEZvZ3VxV2NtbW5FS01vaTZVb2JvNVhkNkpJZ3NjSWV1ckdoTlBIak5SSWlzZzRGS256RWozWEVEbTRoZ3ZSakw2SUVmeG1RZ29CVFlUSUVLM25ldE5vak54b2pjSkJIQVozYlNjQkVSSkFoM05JZlFYUkNBa1FrQWxnQ0FZQkF2eTRpeFV4Y3QwMkVBQW5jQWFCYzFYQkFJU1VGdzQ1RU5PQUN5eUFDMzZRV2hVNUVWTXdBVTB3QVdYWWtTUlpraVo1a2g0UlFWbEJrUjI1RDAzUU5Ma25QQkFOV1pKZXdBSTg4M3dKY1JvbHlXS3ZhQkRzYUhJbVdYL294SE8zU0cvNVVCUWFZQWx3aFpJTVlRcUE4Z09tVUpSTU9aVlVXWlZXYVpVQkFRQWgrUVFCbGdBQUFDd0dBQVlBV1FDTEFJY3l6VEx4MFVYeHBVVHlYMFB5U0VQeVZrUHllVVR5Z2tUd3lFVHpUVVB4eWtYeWlrVHd4MFR4dGtYeVVVUHh0MFR4cmtYeHhrWHd2MFR5bUVUeWkwUHh1VVR5YWtQeHlFWHh4RVh5YUVQeHUwVHh6RVh4elVYeWtVVHhsRVR5VWtQeWowVHhoa1R4cEVUeWJrVHh0RVh4dzBYeW5FVHhna1R5VkVQeWUwVHlaVVB4b0VUeHNFVHllVVB5YkVQeHNrVHh1MFh5ZEVUeHJFVHljRVB5WjBQeHYwWHhlVVR4elVUeW1rVHhqMFR4azBQeVkwUHhya1R5alVUeHAwVHlXa1B5YVVQeGhFVHhvMFR4ZFVQeW9VVHlXRVB5Y2tQeHFVVHhxMFR4cWtUeWswUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJL2dBSFFBZ1FBTUlBQUFnVEtseklzS0hEaHhBalJoUndJY0FGQVFzZUVDVFlRS0xIanlCRE5sU3dVVUdKalJ0RnFsekpNbUdFalJGZ0NFQXBvcVhObXhFN2tLaEJva09MQkFjRUNEaVFBS2ZSb3dnTGpMQXhvZ0FCcEZDalNwMUt0YXJWcTFpemF0MEtzWUNGR1JhY0pxQUFBUUtGb2x5eGdtRHhnQVdJR0RNMzFreDdGY05HREExUUVxUjdsY1BHRFJjMGJ1ekl0Nm9Ndnh1UTVCZ2dBQUVEQVFjTFU3VVFZa0VJSUI4a2E5N011YlBuejZBL0UzQlF3TUZUQUFNb1VJZ2MrcWFCQ1NZbUdCamdBYVdIMWpjcmJLeXdBZ0ZLQnJodDN2akxRQUpLQ2NGYmF0aW9RWUFCM3dFWUdFak9NZ1VPSWpoUzdFQTRnRFYxbFFSUS92eEFjZnE3K2ZQbzA0UE9rRUU5U0JVbkZweFE4ZUU1UVFUVDNVK3NlSEdCOFkzSTZRY1JTUVNaQkIxQndBbjQwRXNFeFZUYlJqb28rSkJPUFBtRTJnRUhlQ2ZoUWtveDVkU0dJSVlvNG9na0t1U1ZFUzQ0eFJoQmtKVUl3Rm9WdlBDV1lCeTVhQmRCZU9rVmdJc0VCbUJTWEFUTlJXSVNpQjJ4QUZCQ0VlVWlaWlpoNXVLVFVFWXBaV0dqbGZZVVVHVXBXZUpyc2MwR1pBQkNqcWdiUWJ6cDZPSndCRzNBQUkwQkVFYmltQUh3dG1JQUxXNEptMndhUGxtbGFWUDI2ZWVmT0tXMjJwTTBCTEZBRURSODhDQkJ0NVhvQTBrSytMREFnZEh4V0ZJSi94RVVJSWszQm9DWGZkSGxSeUlJTDJnZ1l3d0lzUWRsQVM0TWtXSjUvb0RHS3V1c0M2bjZKS3V1T2dVcWZpNTJVT29MUG1VYXdLWWpNaGhBVEpRbVNHS1BKaTBhUUlRbFVtUVJScWlwbG1lSThNbEhINjNjZHV1dGlIcytOV2VkSktad3AzWnN1am5pY2dRMVoyYUphQWFnNXBkaGlnZ25iMWhDb0NXSlhPTFpaN2pmQml4d2lQbnVPeUtUSVZqd0FiMHVIaFlBQnpMazhDNkpmcVVaR0VycWl0Z3BYdU5ldStGYWJiM1ZwMWRnZlRqd3lTaWpKNmpIRzNiWUZBSE9Oa29paFQyMWtLeUx4c1lrTExFaU1sc0NxTks1S0cxL3FiYjNaTGJ6WlpieTBreTNacXVMNFkzMzFLNmlqbWdkZHRydDdDSzdBVFIzTTd6RU9RdnRtN3V0VU8yZ0x2WTcyNytrOGRuMDIzQVh4cGh2NUI1Y1djSWZwTnV3VVY4UVM2eVhpeFhMZXhGTk50N1ZRTUZva2RnRER3L3cwQU9xVTZKQXd3dzBrQmYzNVpoZmhlUlFpWTlZeEF3ZUVzQndpVW84VUdFTEV4Y0xFd3g2bCtoenh5NEs4VklFUWl6UTV3SExhWkJoUUFBaC9oVk5ZV1JsSUhkcGRHZ2dVMk55WldWdVZHOUhhV1lBT3c9PSc+IgoKICAgICAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSAiPGRpdj4iOwoKICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUVsZW1lbnQoJ2RpdicsJ3pobUljb24nKTsKCiAgICAgICAgICAgICAgICBsZXQgemhtUGxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1JY29uJyk7CgogICAgICAgICAgICAgICAgemhtUGxheS5pbm5lckhUTUwgPSBwbGF5V3JhcEh0bWw7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIC8v5bem6ZSu5oyJ5LiL5ouW5YqoCiAgICAgICAgICAgIC8vdHlwZTrmoLnmja7kuI3lkIznsbvlnovvvIzlpITnkIblm77moIfljZXlh7vkuovliqEKICAgICAgICAgICAgemhtTG9nb0RyYWcodHlwZSx3ZWIpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFywqB6aG1Mb2dvRHJhZz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjemhtbG9nbyIpOwoKICAgICAgICAgICAgICAgIHZhciB6aG1Mb2dvSWNvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5pY29uTG9nbyIpOwoKICAgICAgICAgICAgICAgIGlmKCF6aG1Mb2dvRHJhZyB8fCAhemhtTG9nb0ljb24pcmV0dXJuOwoKICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLm9ubW91c2Vkb3duID0gZnVuY3Rpb24oZXZlbnQpewoKICAgICAgICAgICAgICAgICAgICBpZihldmVudC53aGljaD09MylyZXR1cm4gZmFsc2U7Ly/lsY/olL3lj7PplK4KCiAgICAgICAgICAgICAgICAgICAgbGV0IHNlZG93blRvcCA9IHpobUxvZ29EcmFnLm9mZnNldFRvcDsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHpobUxvZ29JY29uSGVpZ2h0ID0gemhtTG9nb0ljb24ub2Zmc2V0SGVpZ2h0OwoKICAgICAgICAgICAgICAgICAgICBsZXQgYm90dG9tU3BhY2UgPSAxMDsKCiAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQudGFyZ2V0LmNsYXNzTmFtZSAhPSAnaWNvbkxvZ28nKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgLy9sZXTCoHNoaWZ0WMKgPcKgZXZlbnQuY2xpZW50WMKgLcKgemhtTG9nb0RyYWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDsKICAgICAgICAgICAgICAgICAgICBsZXQgc2hpZnR4ID0gNTsKCiAgICAgICAgICAgICAgICAgICAgbGV0wqBzaGlmdFkgPSBldmVudC5jbGllbnRZLXpobUxvZ29EcmFnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDsKCiAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUucG9zaXRpb27CoD3CoCdmaXhlZCc7CgogICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnpJbmRleMKgPcKgOTk5OTk5OTsKCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoemhtTG9nb0RyYWcpOwoKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbsKgb25Nb3VzZU1vdmUoZXZlbnQpewoKICAgICAgICAgICAgICAgICAgICAgICAgLy96aG1Mb2dvRHJhZy5zdHlsZS5sZWZ0wqA9wqBwYWdlWMKgLcKgc2hpZnRYwqArwqAncHgnOwogICAgICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5zdHlsZS5sZWZ0wqA9wqAnNXB4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB6aG1Mb2dvSWNvbkhlaWdodC1ib3R0b21TcGFjZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB5ID0gZXZlbnQucGFnZVktc2hpZnRZOwoKICAgICAgICAgICAgICAgICAgICAgICAgeSA9IE1hdGgubWluKE1hdGgubWF4KDAsIHkpLCBoZWlnaHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUudG9wID0geSsncHgnOwoKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy/lnKhtb3VzZW1vdmXkuovku7bkuIrnp7vliqjlm77moIcKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLG9uTW91c2VNb3ZlKTsKICAgICAgICAgICAgICAgICAgICAvL+advuW8gOS6i+S7tgogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50Lm9ubW91c2V1cCA9IGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2ljb25Ub3AnLHpobUxvZ29EcmFnLm9mZnNldFRvcCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLMKgb25Nb3VzZU1vdmUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcub25tb3VzZXVwwqA9wqBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IHpobUxvZ29EcmFnLm9mZnNldFRvcCt6aG1Mb2dvSWNvbkhlaWdodCtib3R0b21TcGFjZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHpobUxvZ29EcmFnLm9mZnNldFRvcCA8IDApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnRvcCA9JzBweCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5pbm5lckhlaWdodCA8IGhlaWdodCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUudG9wID13aW5kb3cuaW5uZXJIZWlnaHQtemhtTG9nb0ljb25IZWlnaHQtYm90dG9tU3BhY2UrJ3B4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy9jbGlja+S6i+S7tuWkhOeQhgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2godHlwZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndmlkZW8nOgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih6aG1Mb2dvRHJhZy5vZmZzZXRUb3A9PXNlZG93blRvcCAmJiB3ZWIubGVuZ3RoID09IDAgJiYgemhtTG9nb0RyYWcub2Zmc2V0VG9wPjAgJiYgd2luZG93LmlubmVySGVpZ2h0ID4gaGVpZ2h0KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+35Zyo6KeG6aKR5pKt5pS+6aG154K55Ye75Zu+5qCHJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ211c2ljJzoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoemhtTG9nb0RyYWcub2Zmc2V0VG9wPT1zZWRvd25Ub3AgJiYgZS50YXJnZXQuY2xhc3NOYW1lID09ICdpY29uTG9nbycpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLMKgb25Nb3VzZU1vdmUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy96aG1Mb2dvRHJhZy5vbm1vdXNldXDCoD3CoG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXVzaWNVcmxEYXRhID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9eaHR0cHM/OlwvXC9tdXNpY1wuMTYzXC5jb21cLyNcLyg/OnNvbmd8ZGopXD9pZC99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9eaHR0cHM/OlwvXC95XC5tdXNpY1wuMTYzXC5jb21cL21cLyg/OnNvbmd8ZGopXD9pZC99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9eaHR0cHM/OlwvXC9tdXNpY1wuMTYzXC5jb21cLyg/OnNvbmd8ZGopXD9pZC99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9eaHR0cHM/OlwvXC95XC5xcVwuY29tXC9uXC9yeXFxXC9wbGF5ZXIvfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDova3Vnb3VcLmNvbS99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9rdXdvXC5jbi99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9eaHR0cHM/OlwvXC93d3dcLnhpbWFsYXlhXC5jb20vfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG11c2ljVXJsID0gbXVzaWNVcmxEYXRhLmZpbHRlcihmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5tYXRjaChpdGVtLm1hdGNoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihtdXNpY1VybC5sZW5ndGg9PTApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCh3ZWJbMF0udGlwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh3ZWJbMF0ubmFtZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduZXRlYXNlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRlYXNlRnVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdxcSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXFGdW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2t1Z291JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdWdvdUZ1bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAna3V3byc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3V3b0Z1bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneGltYWxheWEnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhpbWFsYXlhRnVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG5ldGVhc2VGdW4oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsUGFyYW1zID0gX3RoaXMuZ2V0VXJsUGFyYW1zKGxvY2F0aW9uLmhyZWYpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHVybFBhcmFtcy5pZCA9PSB1bmRlZmluZWQpIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV0ZWFzZVVybEVuY29kZSA9IGVuY29kZVVSSUNvbXBvbmVudCgnaHR0cHM6Ly9tdXNpYy4xNjMuY29tL3Nvbmc/aWQ9Jyt1cmxQYXJhbXMuaWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IG9wZW5VcmwgPSB3ZWJVcmwrJz91cmw9JytuZXRlYXNlVXJsRW5jb2RlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcGVuVXJsID0gd2ViVXJsKyI/aWQ9Iit1cmxQYXJhbXMuaWQrIiZ0eXBlPW5ldGVhc2UiCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4ob3BlblVybCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBxcUZ1bigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxcVNvbmdNYXRjaDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucGxheWVyX211c2ljX19pbmZvIikpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcVNvbmdNYXRjaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wbGF5ZXJfbXVzaWNfX2luZm8iKS5jaGlsZE5vZGVzWzBdLmhyZWYubWF0Y2goL3NvbmdEZXRhaWxcLyhcUyopXD8vKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc2ltX3NvbmdfaW5mbyIpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXFTb25nTWF0Y2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc2ltX3NvbmdfaW5mbyIpLmNoaWxkTm9kZXNbMF0uaHJlZi5tYXRjaCgvc29uZ1wvKFxTKikuaHRtbC8pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcVNvbmdNYXRjaCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFxcVNvbmdNYXRjaFsxXSl7Y29uc29sZS5sb2coJ+ayoeacieiOt+WPluWIsOatjOabsklEJyk7IHJldHVybn07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvTGluayA9IGVuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJhdWRpbyIpLnNyYyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW5VcmwgPSB3ZWJVcmwrJz9pZD0nK3FxU29uZ01hdGNoWzFdKycmdHlwZT1xcSZwbGF5VXJsPScrYXVkaW9MaW5rOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKG9wZW5VcmwpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ga3Vnb3VGdW4oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXVkaW9Nb2R1bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYXVkaW9Nb2R1bGUnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdWRpb01vZHVsZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhdWRpb01vZHVsZScpLnN0eWxlPSdib3R0b206MHB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzaG93SGlkZV9wbGF5YmFyJykuY2xhc3NOYW1lID0gJ2ljb24gc2hvdy1wbGF5YmFyLWJ0bic7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29IicsMjAwMCkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KCfor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29IuOAgicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvbmdLdWdvdU1hdGNoID0gbmV3VXJsLm1hdGNoKGp4TXVzaWNXZWJbMF0ubWF0Y2gpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdWRpb1NyYyA9IGVuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJhdWRpbyIpLnNyYyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW5VcmwgPSB3ZWJVcmwrJz9pZD0nK3NvbmdLdWdvdU1hdGNoWzFdKycmdHlwZT1rdWdvdSZwbGF5VXJsPScrYXVkaW9TcmM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4ob3BlblVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrdXdvRnVuKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBsYXlDb250cm9sJykuc3R5bGU9J2JvdHRvbTowcHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSInLDIwMDApCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgn6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSLjgIInKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvbmdLdXdvTWF0Y2ggPSBuZXdVcmwubWF0Y2goanhNdXNpY1dlYlswXS5tYXRjaCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvU3JjID0gZW5jb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImF1ZGlvIikuc3JjKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3BlblVybCA9IHdlYlVybCsnP2lkPScrc29uZ0t1d29NYXRjaFsxXSsnJnR5cGU9a3V3byZwbGF5VXJsPScrYXVkaW9TcmM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4ob3BlblVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB4aW1hbGF5YUZ1bigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54bS1wbGF5ZXInKS5zdHlsZT0nYm90dG9tOjBweCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29IicsMjAwMCkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KCfor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29IuOAgicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsSW5mbyA9IG5ld1VybC5tYXRjaChqeE11c2ljV2ViWzBdLm1hdGNoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh3ZWJVcmwrJz9pZD0nK3VybEluZm9bMV0rJyZ0eXBlPXhpbWFsYXlhJnBsYXlVcmw9JytlbmNvZGVVUklDb21wb25lbnQobmV3VXJsKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodXJsSW5mb1sxXSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHdlYlVybCsnP2lkPScrdXJsSW5mb1sxXSsnJnR5cGU9eGltYWxheWEmcGxheVVybD0nK2VuY29kZVVSSUNvbXBvbmVudChuZXdVcmwpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieiOt+WPlnVybOWPguaVsCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3lvdXR1YmUnOgoKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5vbmRyYWdzdGFydMKgPcKgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm7CoGZhbHNlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL+S4i+i9vQogICAgICAgICAgICBzdGF0aWMgTFJfZG93bmxvYWQodXJsLGZpbGVuYW1lKXsKCiAgICAgICAgICAgICAgICBsZXQgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7CgogICAgICAgICAgICAgICAgY29uc29sZS5sb2codWEubWF0Y2goL3ZlcnNpb25cLyhbXGQuXSspLipzYWZhcmkvKSk7CgogICAgICAgICAgICAgICAgaWYodWEubWF0Y2goL3ZlcnNpb25cLyhbXGQuXSspLipzYWZhcmkvKSl7CgogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHVybCk7CgogICAgICAgICAgICAgICAgfWVsc2V7CmNvbnNvbGUubG9nKHVybCk7CiAgICAgICAgICAgICAgICAgICAgR01fZG93bmxvYWQodXJsLGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgY2xhc3MgUGxheVZpZGVvQ2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3N7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCl7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgY2xhc3MgVmVyc2lvbkNsYXNzIGV4dGVuZHMgQmFzZUNsYXNzewoKICAgICAgICAgICAgY29uc3RydWN0b3IoKXsKCiAgICAgICAgICAgICAgICBzdXBlcigpOwoKICAgICAgICAgICAgICAgIHRoaXMudmVyc2lvblVybCA9ICdodHRwczovL2dpdGxhYi5jb20vbGFuaGFoYS9sYW5yZW5qaWFvYmVuLy0vcmF3L21haW4vUkVBRE1FLm1kP3JlZl90eXBlPWhlYWRzJzsKCiAgICAgICAgICAgICAgICB0aGlzLnJlbmV3VmVyc2lvblVybCA9ICdodHRwczovL2dpdGxhYi5jb20vbGFuaGFoYS9sYW5yZW5qaWFvYmVuIyVFNiU5QiVCNCVFNiU5NiVCMCVFNiU5NyVBNSVFNSVCRiU5Nyc7CgogICAgICAgICAgICAgICAgbGV0IHRpcFBhZ2VXcmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CgogICAgICAgICAgICAgICAgdGlwUGFnZVdyYXAuaWQ9J3RpcFdyYXAnOwoKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGlwUGFnZVdyYXApOwoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgKGFzeW5jIGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIGxldCByZXNwID0gYXdhaXQgX3RoaXMuY2hlY2tUaW1lKCk7CgogICAgICAgICAgICAgICAgICAgIGlmKCFyZXNwKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgX3RoaXMuY2hlY2tSdW5UaW1lKCk7CgogICAgICAgICAgICAgICAgfSkoKQoKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXRWZXJzaW9uKG1vdGhlZCx1cmwpewoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57CgogICAgICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbW90aGVkLAoKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiAnJywKCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsnQWNjZXB0JzogJ3RleHQvcGxhaW4sIHRleHQvaHRtbCxhcHBsaWNhdGlvbi9qc29uJ30sCgogICAgICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uKHJlcyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc0FycmF5ID0gcmVzLnJlc3BvbnNlVGV4dC5zcGxpdCgnXG4nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmVyc2lvbkFycmF5PVtdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8cmVzQXJyYXkubGVuZ3RoO2krKyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc0FycmF5W2ldLm1hdGNoKC9eKFswLTk5OV17MSwzfSlcLj8oWzAtOTk5XXsxLDN9KT9cLj8oWzAtOTk5XXsxLDN9KT8kLykpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbkFycmF5LnB1c2gocmVzQXJyYXlbaV0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmVyc2lvbkFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IgOiBmdW5jdGlvbihlcnIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2hlY2tUaW1lKCl7CgogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+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/plK7nm5jlv6vov5vlv6vpgIAKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQub25rZXlkb3duID0gZnVuY3Rpb24oZXZlbnQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhldmVudC5rZXlDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1sYXllciB2aWRlbycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGV2ZW50LmtleUNvZGU9PTM5KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSB2aWRlby5jdXJyZW50VGltZSArIDU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQua2V5Q29kZT09MzcpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHZpZGVvLmN1cnJlbnRUaW1lIC0gNTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSwzMDAwKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy/niLHlpYfoibrljrvlub/lkYoKICAgICAgICAgICAgICAgIGlmKG5vd05vZGU9PSIjZmxhc2hib3giKXsKCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5za2lwcGFibGUtYWZ0ZXInKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tLmNsaWNrKCk7CgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0sMzAwMCkKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy/ohb7orq/ljrt2aXDlvLnnqpcKICAgICAgICAgICAgICAgIGlmKG5vd05vZGU9PSIjcGxheWVyLWNvbnRhaW5lciIpewoKICAgICAgICAgICAgICAgICAgICBsZXQgbiA9IDA7CgogICAgICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihuKysgPCAxMDApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYW5lbFRpcFZpcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYW5lbC1vdmVybGF5Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFuZWxUaXBWaXApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbFRpcFZpcC5zdHlsZS5kaXNwbGF5PSdub25lJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSwxMDApCgoKCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy/kuZDop4bpgInpm4blpITnkIYKICAgICAgICAgICAgICAgIGlmKG5vd05vZGUgPT0gIiNsZV9wbGF5Ym94Iil7CgogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBqQmxvY2sgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcual9ibG9jaycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWpCbG9jaykgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTxqQmxvY2subGVuZ3RoO2krKyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvSWQgPSBqQmxvY2tbaV0uZ2V0QXR0cmlidXRlKCdkYXRhLXZpZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gYGh0dHBzOi8vd3d3LmxlLmNvbS9wdHYvdnBsYXkvJHt2aWRlb0lkfS5odG1sYDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqQmxvY2tbaV0uZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLGxpbmspOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwzMDAwKQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vQuermeWkp+S8muWRmHVybOWkhOeQhu+8jOmhtemdomNsYXNz5LiN5LiA6Ie0CiAgICAgICAgICAgICAgICBpZihub3dOb2RlID09ICIucGxheWVyLWNvbnRhaW5lciIpewoKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBsYXllci1jb250YWluZXInKSAmJiAhZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJweC1wbGF5ZXItY29udGFpbmVyJykpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vd05vZGUgPSAnLnBsYXllci1tYXNrJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vd05vZGUgPSAnLmJweC1wbGF5ZXItY29udGFpbmVyJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDMwMDApCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyrohb7orq/op4bpopHngrnlh7vlhbblroPop4bpopHot7PovawqLwogICAgICAgICAgICAgICAgaWYobm93TmFtZT09J3FxUEMnKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGZpZ3VyZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5maWd1cmUnKTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGZpZ3VyZURldGFpbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5maWd1cmVfZGV0YWlsJyk7CgogICAgICAgICAgICAgICAgICAgIGxldCBsaXN0SXRlbSA9IFsuLi5maWd1cmUsLi4uZmlndXJlRGV0YWlsXTsKCiAgICAgICAgICAgICAgICAgICAgaWYobGlzdEl0ZW0ubGVuZ3RoID4gMCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsaXN0SXRlbS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGluayl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gbGluazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy/ms6jph4rmmK/lpJrkuKrmkq3mlL7pgInpm4bljLrln58KLyoKICAgICAgICAgICAgICAgIGxldCBlYXJlQ2xhc3NOYW1lQXJyID0ganhWaWRlb1dlYlswXS5hcmVhQ2xhc3NOYW1lLnNwbGl0KCcsJyk7CgogICAgICAgICAgICAgICAgY29uc29sZS5sb2coZWFyZUNsYXNzTmFtZUFycik7cmV0dXJuOwoKICAgICAgICAgICAgICAgIGlmKGVhcmVDbGFzc05hbWVBcnIubGVuZ3RoPT0wKXJldHVybjsKKi8KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKLyoKICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPGVhcmVDbGFzc05hbWVBcnIubGVuZ3RoO2krKyl7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuJytlYXJlQ2xhc3NOYW1lQXJyW2ldKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9TZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGUudGFyZ2V0LnBhcmVudE5vZGUuaHJlZik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWY9bG9jYXRpb24uaHJlZjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvU2VsZWN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicranhWaWRlb1dlYlswXS5hcmVhQ2xhc3NOYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9TZWxlY3QubGVuZ3RoPT0wKXtjb25zb2xlLmxvZygn6K+l572R56uZ5pKt5pS+5Yy657G75ZCN5pS55Y+YJyk7cmV0dXJuO30KCiAgICAgICAgICAgICAgICAgICAgdmlkZW9TZWxlY3QuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZS50YXJnZXQucGFyZW50Tm9kZS5ocmVmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWY9bG9jYXRpb24uaHJlZjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMDApCgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfSwyMDAwKTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIHBsYXlWaWRlb0Z1bmMoKTsKCiAgICAgICAgbmV3IFZlcnNpb25DbGFzcygpOwoKICAgIH0KfSkoKTs=
Add Comment
Please, Sign In to add comment