https://ipfs.io/ipfs/QmfKJoMgUSYAnVS436Xv9du9YkL3dgg47RUhj57TYNx7Cs

sha256

1d1d51dc66b208869d78fbae1ef7b68599488d45a7ad80d80ddf397b8c4e2b65 files.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyLAogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICB6LWluZGV4OiA1OwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBib3R0b206IDEuOWVtOwogICAgICAgIGZvbnQtc2l6ZTogMS44ZW07CiAgICAgICAgcGFkZGluZy1yaWdodDogLjY1ZW07CiAgICAgICAgbWF4LXdpZHRoOiA4ZW07CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICB3aWR0aDogMWVtOwogICAgICAgIGhlaWdodDogMWVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub3N0ciAubGlrZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7ICAKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiAyLjRlbTsKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsgIAogICAgICB9CiAgCiAgICAgICNpbWFnZXMgLmltZyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoLAogICAgICAuaGVhZGVyLWljb24gc3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIHBhZGRpbmc6IDAgLjJlbTsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvc3ZnIHBhdGgsCiAgICAgIC5pbWFnZXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhI21lbnUsIAogICAgICAuaGVhZGVyLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5pY29ucyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLmhlYWRlci1pY29uIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5oZWFkZXItaWNvbiBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC52aXNpYmxlIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjb3ZlcmxheSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBvcGFjaXR5OiAuNTsKICAgICAgfQoKICAgICAgLnZpc2libGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNzaGFyZS1kaWFsb2cgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC0gNGVtKTsKICAgICAgICBoZWlnaHQ6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTsKICAgICAgICB6LWluZGV4OiA0OwogICAgICAgIG1hcmdpbi1sZWZ0OiAyZW07CiAgICAgICAgbWFyZ2luLXRvcDogMmVtOwogICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgfQogICAgICAKICAgICAgaDIgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIHN2ZyB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICN0ZW1wbGF0ZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZSI+CiAgICAgIDxzdmcgY2xhc3M9ImhlYXJ0c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgogICAgICAgIDxwYXRoIGQ9Ik05LjcxOSwxNy4wNzNsLTYuNTYyLTYuNTFjLTAuMjctMC4yNjgtMC41MDQtMC41NjctMC42OTYtMC44ODhDMS4zODUsNy44OSwxLjY3LDUuNjEzLDMuMTU1LDQuMTRjMC44NjQtMC44NTYsMi4wMTItMS4zMjksMy4yMzMtMS4zMjljMS45MjQsMCwzLjExNSwxLjEyLDMuNjEyLDEuNzUyYzAuNDk5LTAuNjM0LDEuNjg5LTEuNzUyLDMuNjEyLTEuNzUyYzEuMjIxLDAsMi4zNjksMC40NzIsMy4yMzMsMS4zMjljMS40ODQsMS40NzMsMS43NzEsMy43NSwwLjY5Myw1LjUzN2MtMC4xOSwwLjMyLTAuNDI1LDAuNjE4LTAuNjk1LDAuODg3bC02LjU2Miw2LjUxQzEwLjEyNSwxNy4yMjksOS44NzUsMTcuMjI5LDkuNzE5LDE3LjA3MyBNNi4zODgsMy42MUM1LjM3OSwzLjYxLDQuNDMxLDQsMy43MTcsNC43MDdDMi40OTUsNS45MiwyLjI1OSw3Ljc5NCwzLjE0NSw5LjI2NWMwLjE1OCwwLjI2NSwwLjM1MSwwLjUxLDAuNTc0LDAuNzMxTDEwLDE2LjIyOGw2LjI4MS02LjIzMmMwLjIyNC0wLjIyMSwwLjQxNi0wLjQ2NiwwLjU3My0wLjcyOWMwLjg4Ny0xLjQ3MiwwLjY1MS0zLjM0Ni0wLjU3MS00LjU2QzE1LjU3LDQsMTQuNjIxLDMuNjEsMTMuNjEyLDMuNjFjLTEuNDMsMC0yLjYzOSwwLjc4Ni0zLjI2OCwxLjg2M2MtMC4xNTQsMC4yNjQtMC41MzYsMC4yNjQtMC42OSwwQzkuMDI5LDQuMzk3LDcuODIsMy42MSw2LjM4OCwzLjYxIj48L3BhdGg+CiAgICAgIDwvc3ZnPgogICAgICA8c3ZnIGNsYXNzPSJ2aWRlb3N2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCTxwYXRoIGQ9Ik0xOC4xNzUsNC4xNDJIMS45NTFDMS43MDMsNC4xNDIsMS41LDQuMzQ0LDEuNSw0LjU5MnYxMC44MTZjMCwwLjI0NywwLjIwMywwLjQ1LDAuNDUxLDAuNDVoMTYuMjI0YzAuMjQ3LDAsMC40NS0wLjIwMywwLjQ1LTAuNDVWNC41OTJDMTguNjI1LDQuMzQ0LDE4LjQyMiw0LjE0MiwxOC4xNzUsNC4xNDIgTTQuNjU1LDE0Ljk1N0gyLjQwMXYtMS44MDNoMi4yNTNWMTQuOTU3ek00LjY1NSwxMi4yNTRIMi40MDF2LTEuODAzaDIuMjUzVjEyLjI1NHogTTQuNjU1LDkuNTQ5SDIuNDAxVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNNC42NTUsNi44NDZIMi40MDFWNS4wNDNoMi4yNTNWNi44NDZ6TTE0LjU2OSwxNC45NTdINS41NTZWNS4wNDNoOS4wMTNWMTQuOTU3eiBNMTcuNzI0LDE0Ljk1N2gtMi4yNTN2LTEuODAzaDIuMjUzVjE0Ljk1N3ogTTE3LjcyNCwxMi4yNTRoLTIuMjUzdi0xLjgwM2gyLjI1M1YxMi4yNTR6TTE3LjcyNCw5LjU0OWgtMi4yNTNWNy43NDdoMi4yNTNWOS41NDl6IE0xNy43MjQsNi44NDZoLTIuMjUzVjUuMDQzaDIuMjUzVjYuODQ2eiI+PC9wYXRoPgoJCQk8L3N2Zz4KCQkJPHN2ZyBjbGFzcz0iaW1hZ2Vzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguNTU1LDE1LjM1NFY0LjU5MmMwLTAuMjQ4LTAuMjAyLTAuNDUxLTAuNDUtMC40NTFIMS44ODhjLTAuMjQ4LDAtMC40NTEsMC4yMDMtMC40NTEsMC40NTF2MTAuODA4YzAsMC41NTksMC43NTEsMC40NTEsMC40NTEsMC40NTFoMTYuMjE3aDAuMDA1QzE4Ljc5MywxNS44NTEsMTguNDc4LDE0LjgxNCwxOC41NTUsMTUuMzU0IE0yLjgsMTQuOTQ5bDQuOTQ0LTYuNDY0bDQuMTQ0LDUuNDE5YzAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDAzLDAuMDA1bDAuNzk3LDEuMDRIMi44eiBNMTMuODIyLDE0Ljk0OWwtMS4wMDYtMS4zMTdsMS42ODktMi4yMThsMi42ODgsMy41MzVIMTMuODIyeiBNMTcuNjU0LDE0LjA2NGwtMi43OTEtMy42NjZjLTAuMTgxLTAuMjM3LTAuNTM1LTAuMjM3LTAuNzE2LDBsLTEuODk5LDIuNDkzbC00LjE0Ni01LjQyYy0wLjE4LTAuMjM3LTAuNTM2LTAuMjM3LTAuNzE2LDBsLTUuMDQ3LDYuNTk4VjUuMDQyaDE1LjMxNlYxNC4wNjR6IE0xMi40NzQsNi4zOTNjLTAuODY5LDAtMS41NzcsMC43MDctMS41NzcsMS41NzZzMC43MDgsMS41NzYsMS41NzcsMS41NzZzMS41NzctMC43MDcsMS41NzctMS41NzZTMTMuMzQzLDYuMzkzLDEyLjQ3NCw2LjM5MyBNMTIuNDc0LDguNjQ1Yy0wLjM3MSwwLTAuNjc2LTAuMzA0LTAuNjc2LTAuNjc2czAuMzA1LTAuNjc2LDAuNjc2LTAuNjc2YzAuMzcyLDAsMC42NzYsMC4zMDQsMC42NzYsMC42NzZTMTIuODQ2LDguNjQ1LDEyLjQ3NCw4LjY0NSI+PC9wYXRoPgoJCQk8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAucXVlcnksCiAgICAgIC5jb2xzJHtjb2xzfSAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InNoYXJlLWRpYWxvZyIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxoMj5zaGFyZTwvaDI+CiAgICAgIDxmb3JtIGlkPSJzaGFyZS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgIDxwIGNsYXNzPSJjb250ZW50Ij48L3A+CiAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgdmFsdWU9Im9rIi8+CiAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWVkaWEtZm9vdGVyIj4KICAgICAgPGEgaWQ9ImltYWdlLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJpbWFnZS1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtdXNlciIgaHJlZj0iIyI+PC9hPgogICAgPC9kaXY+CiAgICA8Y2VudGVyIGlkPSJtZWRpYS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJpbWFnZS1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9ImltYWdlIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJvdmVybGF5IiBjbGFzcz0iZGlhbG9nIj48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9ImRpYWxvZyI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YXV0b3BsYXk8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9uIiBocmVmPSIjIj5vbjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9mZiIgaHJlZj0iIyI+b2ZmPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0iaG92ZXIiIGhyZWY9IiMiPm1vdXNlb3ZlcjwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+Y29sdW1uczwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjEiIGhyZWY9IiMiPjE8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb25uZWN0aW9uczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImNvbm5jb3VudCI+MDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5yZWxheXM6PC9kaXY+CiAgICAgICAgPHA+UGxlYXNlIHVzZSByZWxheXMgd2l0aCBOSVAtNTAgKHNlYXJjaCkgZnVuY3Rpb25hbGl0eTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJyZWxheXMtZm9ybSI+CiAgICAgICAgICA8dGV4dGFyZWEgaWQ9InJlbGF5cyI+PC90ZXh0YXJlYT4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIHJlbGF5cyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cHJpdmF0ZSBrZXk6PC9kaXY+CiAgICAgICAgPHA+SWYgeW91IGNhbnQgdXNlIGJyb3dzZXIgYWRkb24gKG1vYmlsZSk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icHJpdmtleS1mb3JtIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icHJpdmtleSIvPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUga2V5Ii8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sb2dzPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ibG9ncyI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8ZGl2IGNsYXNzPSJpY29ucyI+CiAgICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyIgY2xhc3M9ImhlYWRlci1pY29uIj48L2E+CiAgICAgICAgPGEgaWQ9InNoYXJlIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPgogICAgICAgICAgPHN2ZyBjbGFzcz0ic3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQkgICAgPHBhdGggZD0iTTE0LjY4LDEyLjYyMWMtMC45LDAtMS43MDIsMC40My0yLjIxNiwxLjA5bC00LjU0OS0yLjYzN2MwLjI4NC0wLjY5MSwwLjI4NC0xLjQ1NywwLTIuMTQ2bDQuNTQ5LTIuNjM4YzAuNTE0LDAuNjYxLDEuMzE1LDEuMDksMi4yMTYsMS4wOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDhjMC0xLjU0OC0xLjI2LTIuODA5LTIuODA5LTIuODA5Yy0xLjU0OCwwLTIuODA4LDEuMjYtMi44MDgsMi44MDljMCwwLjM4LDAuMDc2LDAuNzQxLDAuMjE0LDEuMDczbC00LjU1LDIuNjM4Yy0wLjUxNS0wLjY2MS0xLjMxNi0xLjA5LTIuMjE3LTEuMDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOXMxLjI2LDIuODA4LDIuODA4LDIuODA4YzAuOSwwLDEuNzAyLTAuNDMsMi4yMTctMS4wOWw0LjU1LDIuNjM3Yy0wLjEzOCwwLjMzMi0wLjIxNCwwLjY5My0wLjIxNCwxLjA3NGMwLDEuNTQ5LDEuMjYsMi44MDksMi44MDgsMi44MDljMS41NDksMCwyLjgwOS0xLjI2LDIuODA5LTIuODA5UzE2LjIyOSwxMi42MjEsMTQuNjgsMTIuNjIxTTE0LjY4LDIuNTEyYzEuMTM2LDAsMi4wNiwwLjkyMywyLjA2LDIuMDZTMTUuODE1LDYuNjMsMTQuNjgsNi42M3MtMi4wNTktMC45MjMtMi4wNTktMi4wNTlTMTMuNTQ0LDIuNTEyLDE0LjY4LDIuNTEyTTUuMzE5LDEyLjA2MWMtMS4xMzYsMC0yLjA2LTAuOTI0LTIuMDYtMi4wNnMwLjkyMy0yLjA1OSwyLjA2LTIuMDU5YzEuMTM1LDAsMi4wNiwwLjkyMywyLjA2LDIuMDU5UzYuNDU0LDEyLjA2MSw1LjMxOSwxMi4wNjFNMTQuNjgsMTcuNDg4Yy0xLjEzNiwwLTIuMDU5LTAuOTIyLTIuMDU5LTIuMDU5czAuOTIzLTIuMDYxLDIuMDU5LTIuMDYxczIuMDYsMC45MjQsMi4wNiwyLjA2MVMxNS44MTUsMTcuNDg4LDE0LjY4LDE3LjQ4OCI+PC9wYXRoPgoJCQkgICAgPC9zdmc+CgkJCSAgPC9hPgoJCQk8L2Rpdj4KCQkJCiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBpZD0icXVlcnktZm9ybSIgYWN0aW9uPSIjIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icXVlcnkiIG5hbWU9InF1ZXJ5IiBpZD0iIiAvPgogICAgICAgICAgPHNlbGVjdCBpZD0icXVlcnktdHlwZSI+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImFsbCI+YWxsPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImltYWdlIj5pbWFnZXM8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idmlkZW8iPnZpZGVvczwvb3B0aW9uPgogICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICAgIDxkaXYgaWQ9ImxvYWRpbmciPnVwZGF0aW5nPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJpbWFnZXMiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7CiAgICAgICAgImdsb2JhbCI6ICdbIlJFUSIsIjxJPiIseyJjYWNoZSI6WyJleHBsb3JlIix7InRpbWVmcmFtZSI6ImxhdGVzdCIsInNjb3BlIjoiZ2xvYmFsIiwibGltaXQiOjxMPn1dfV0nLCAKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScsCiAgICAgICAgInJlYWN0aW9ucyI6ICdbIlJFUSIsIjxJPiIsIHsia2luZHMiOls3XSwiI2UiOiA8RT59XScKICAgICAgfQogICAgICBxcygiI3JlbGF5cyIpLnZhbHVlID0gcmVsYXlzKCkuam9pbigiXG4iKQogICAgICBxcygiI3ByaXZrZXkiKS52YWx1ZSA9IHByaXZrZXkoKQogICAgICBjb25zdCBjb2xvcHRzID0gWzEsIDIsIDQsIDYsIDEwXQoKICAgICAgY29scyA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImNvbHMiLCBjb2xvcHRzWzFdKSwgMTApCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJsaW1pdCIsIDE1KSwgMTApCiAgICAgIGdhbGxlcnkgPSAoKSA9PiB7CiAgICAgICAgbGV0IGdhbGxlcnltYXRjaGVyID0gbG9jYXRpb24uc2VhcmNoLm1hdGNoKC9nYWxsZXJ5PShbYS16MC05XSspLykKICAgICAgICByZXR1cm4gZ2FsbGVyeW1hdGNoZXIgJiYgZ2FsbGVyeW1hdGNoZXJbMV0KICAgICAgfQogICAgICAKICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGNvbHMoKSkKCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHNvY2tldHMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgdXJscyA9IFtdCiAgICAgIGxldCBsaWtlcyA9IFtdCiAgICAgIGxldCBuZXdsaWtlcyA9IFtdCiAgICAgIGxldCBpZGNvdW50ZXIgPSAwCiAgICAgIGxldCBxdWVyeXdhaXQgPSBudWxsCiAgICAgIGxldCBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgIGxldCB0eXBlcyA9IHsKICAgICAgICBpbWFnZTogWyJwbmciLCAianBnIiwgImpwZWciLCAid2VicCJdLAogICAgICAgIHZpZGVvOiBbIm1wNCIsICJ3ZWJtIl0KICAgICAgfQogICAgICBsZXQgaW1ncmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKS9naQogICAgICBsZXQgdmlkZW9yZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXA0fHdlYm0pL2dpCiAgICAgIGxldCB2aWRlb2V4dHJlZ2V4ID0gL1wuKG1wNHx3ZWJtKSQvaQogICAgICBsZXQgaW1nZXh0cmVnZXggPSAvXC4ocG5nfGpwZ3xqcGVnfHdlYnApJC9pCiAgICAgIHdhaXRtcyA9IDUwMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGV0IHF1ZXJ5Y291bnQgPSAwCiAgICAgIGxldCBob3ZlcmVkdmlkZW8gPSBudWxsCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjaW1hZ2UtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gKGdhbGxlcnkoKSAmJiAoImc6IiArIGdhbGxlcnkoKSkgfHwgZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKSkuc3BsaXQoIi8iKQogICAgICAgIHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0uc3Vic3RyaW5nKDAsIDIwKQogICAgICAgIHF1ZXJ5c3RyID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0gfHwgImFsbCIKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjaW1hZ2VzIC5hY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBpbWFnZW9mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IGltYWdlcyA9IHFzYSgiI2ltYWdlcyA+IC5pdGVtIikuZmlsdGVyKGUgPT4gZS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSkKICAgICAgICByZXR1cm4gaW1hZ2VzW2ltYWdlcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoInZpc2libGUiKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNjcm9sbHZpc2libGUobiwgb2Zmc2V0KXsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMAogICAgICAgIHJldHVybiAobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPj0gKHNjcm9sbFkgLSBvZmZzZXQpCiAgICAgICAgICAmJiBuLm9mZnNldFRvcCA8PSAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCArIG9mZnNldCkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlaW1hZ2VzbG9hZCgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS5pbWciKS5mb3JFYWNoKGFzeW5jIGltZyA9PiB7CiAgICAgICAgICBpZihzY3JvbGx2aXNpYmxlKGltZywgdmlzdWFsVmlld3BvcnQuaGVpZ2h0IC8gMikpewogICAgICAgICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgaW1nWyJkYXRhLXNyYyJdICsgIikiCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLnZpZGVvIikuZm9yRWFjaChhc3luYyBuID0+IHVwZGF0ZXZpZGVvcGxheShuKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KG4pewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIGNvbnN0IHYgPSBuLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighc2Nyb2xsdmlzaWJsZShuKSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCgogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsIGxvY2F0aW9uLnBhdGhuYW1lKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3NoYXJlLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICAKICAgICAgICBpZihxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID09ICJjbG9zZSIpewogICAgICAgICAgcXNhKCIuZGlhbG9nLnZpc2libGUiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgZXZlbnRzID0gcXNhKCIjaW1hZ2VzIC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLm1hcChuID0+IG5bImRhdGEtZXZlbnQiXS5pZCkKICAgICAgICBjb25zdCBldmVudCA9IGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiAzMzMsCiAgICAgICAgICAiY29udGVudCI6IEpTT04uc3RyaW5naWZ5KGV2ZW50cyksCiAgICAgICAgICAidGFncyI6IFtdCiAgICAgICAgfSkKCiAgICAgICAgYXdhaXQgd2FpdHJlcyhudWxsLCAiT0siKQoKICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lCiAgICAgICAgCiAgICAgICAgY29uc3QgcHVibGlzaGVkZXZlbnQgPSBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogMSwKICAgICAgICAgICJjb250ZW50IjogIlRoaXMgaXMgYSBnYWxsZXJ5IG9mICIgKyBldmVudHMubGVuZ3RoCiAgICAgICAgICAgICsgIiBpbWFnZXMvdmlkZW9zIHNoYXJlZCBmcm9tIGZpbGVzLmh0bWwuIENoZWNrIGl0IG91dCBoZXJlOiAiICsgdXJsICsgIj9nYWxsZXJ5PSIgKyBldmVudC5pZCwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbIiNlIiwgZXZlbnQuaWRdLCAKICAgICAgICAgICAgWyIjcCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0KICAgICAgICB9KQoKICAgICAgICBhd2FpdCB3YWl0cmVzKG51bGwsICJPSyIpCiAgICAgICAgCiAgICAgICAgY29uc3QgYmVjaDMyaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhwdWJsaXNoZWRldmVudC5pZCkpCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5jb250ZW50IikuaW5uZXJIVE1MID0gJ05vdGUgcHVibGlzaGVkIDxhIGhyZWY9IicgKyBwcm90b2NvbCArIGJlY2gzMmlkICsgJyI+JyArIGJlY2gzMmlkICsgJzwvYT4nCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9ICJjbG9zZSIKICAgICAgfSkKCiAgICAgIHFzKCIjcHJpdmtleS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgY29uc3Qga2V5ID0gcXMoIiNwcml2a2V5IikudmFsdWUKCiAgICAgICAgaWYoa2V5Lmxlbmd0aCAhPSA2NCAmJiBrZXkubGVuZ3RoICE9IDYzKXsKICAgICAgICAgIGFsZXJ0KCJrZXkgc2hvdWxkIGJlIDYzIG9yIDY0IGNoYXJhY3RlcnMgbG9uZyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZrZXkiLCBrZXkpCiAgICAgICAgYWxlcnQoImtleSBzYXZlZCIpCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGhvdmVyZWR2aWRlbyA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIGhvdmVyZWR2aWRlby5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaG92ZXJlZHZpZGVvID0gZmFsc2UKICAgICAgICBpZighcXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAidGl0bGUiKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAic2hhcmUiKXsKICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgICAvL2NvbnN0IHRleHQgPSB7dHlwZTogIiIsIGV2ZW50czogfQogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAiPHA+U2hhcmUgbGluayB0byB0aGlzIGdhbGxlcnkgb2YgIiArIGV2ZW50cy5sZW5ndGggKyAiIGltYWdlcy92aWRlb3MgdG8geW91ciBub3N0ciBwcm9maWxlPzwvcD4iCiAgICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gInB1Ymxpc2giCiAgICAgICAgICBxc2EoIiNzaGFyZS1kaWFsb2csICNvdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGdpZChlLnRhcmdldC5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3coZS50YXJnZXQuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQudGFnTmFtZSAhPSAiQSIgJiYgKHFzKCIjaW1hZ2UtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNpbWFnZSIpID09IGUudGFyZ2V0IHx8IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikgPT0gZS50YXJnZXQpKXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm92ZXJsYXkiKXsKICAgICAgICAgIHFzYSgiLmRpYWxvZy52aXNpYmxlIikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0Y29scyIpKXsKICAgICAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJjb2xzIiArIGMpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY29scyIsIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0YXV0b3BsYXkiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiYXV0b3BsYXkiLCBlLnRhcmdldC5kYXRhc2V0LmF1dG9wbGF5KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgICAgICB1cGRhdGVhbGx2aWRlb3BsYXkoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygibGlrZSIpICYmIGxpa2UoZS50YXJnZXQpCiAgICAgIH0pCiAgICAgIAogICAgICBmdW5jdGlvbiBoYXNrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyIHx8IHByaXZrZXkoKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyICYmIGF3YWl0IHdpbmRvdy5ub3N0ci5nZXRQdWJsaWNLZXkoKSB8fCBOb3N0clRvb2xzLmdldFB1YmxpY0tleShwcml2a2V5KCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNpZ24oZXZlbnQpewogICAgICAgIGlmKHdpbmRvdy5ub3N0cil7CiAgICAgICAgICByZXR1cm4gYXdhaXQgbm9zdHIuc2lnbkV2ZW50KGV2ZW50KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBldmVudC5zaWcgPSBOb3N0clRvb2xzLmdldFNpZ25hdHVyZShldmVudCwgcHJpdmtleSgpKQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBsaWtlKGxpbmspewogICAgICAgIGNvbnN0IGV2ZW50ID0gbGluay5wYXJlbnRFbGVtZW50WyJkYXRhLWV2ZW50Il0KICAgICAgICAKICAgICAgICBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogNywKICAgICAgICAgICJjb250ZW50IjogIisiLAogICAgICAgICAgInRhZ3MiOiBbCiAgICAgICAgICAgIFsiZSIsIGV2ZW50LmlkXSwKICAgICAgICAgICAgWyJwIiwgZXZlbnQucHVia2V5XQogICAgICAgICAgXQogICAgICAgIH0pCgogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IGltYWdlaWQgPSBsaW5rWyJkYXRhLWl0ZW0taWQiXSB8fCBsaW5rLmRhdGFzZXQuaW1hZ2VJZAogICAgICAgIAogICAgICAgIGlmKGltYWdlaWQpewogICAgICAgICAgZ2lkKGltYWdlaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBwcmVwYXJlX2V2ZW50KGV2ZW50KXsKICAgICAgICBldmVudC5wdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGV2ZW50LmNyZWF0ZWRfYXQgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCwgMTApCiAgICAgICAgZXZlbnQuaWQgPSBOb3N0clRvb2xzLmdldEV2ZW50SGFzaChldmVudCkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2goZXZlbnQpewogICAgICAgIGV2ZW50ID0gYXdhaXQgcHJlcGFyZV9ldmVudChldmVudCkKICAgICAgICBsZXQgc2lnbmVkZXZlbnQgPSBhd2FpdCBzaWduKGV2ZW50KQogICAgICAgIGxldCBqc29uID0gSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIHNpZ25lZGV2ZW50XSkKICAgICAgICBzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoanNvbikpCiAgICAgICAgCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHN3aXBlKG9mZnNldCl7CiAgICAgICAgaWYoaW1hZ2VvZmZzZXQob2Zmc2V0KSl7CiAgICAgICAgICBpbWFnZW9mZnNldChvZmZzZXQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICB0aGlzW29mZnNldCA9PSAtMSAmJiAibGFzdGFjdGl2ZSIgfHwgImFjdGl2ZSJdKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlc2hvdygpewogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aXNpYmxlIikpewogICAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmNvbnRhbnMoInZpc2libGUiKSl7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgaW1hZ2VvZmZzZXQoLWNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoLWNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBpbWFnZW9mZnNldChjb2xzKCkpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KGNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93UmlnaHQiKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICB9KQoKICAgICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKXsKICAgICAgICBzYXZlKHNvY2tldCwgcmVzLCBxLCB0eXBlLCBmYWxzZSwgZmFsc2UsIHRydWUpCiAgICAgICAgbG9nKCJxdWVyeSByZXMiLCByZXMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQtLQogICAgICAgIGlmKHF1ZXJ5Y291bnQgPT0gMCl7CiAgICAgICAgICBxcygiI2xvYWRpbmciKS5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHN0aW1lKQogICAgICAgIHF1ZXJ5d2FpdCA9IHNsZWVwKHdhaXQpCiAgICAgICAgYXdhaXQgcXVlcnl3YWl0LnByb21pc2UKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHJpbWFsZ2xvYmFsKHNvY2tldCl7CiAgICAgICAgbG9nKCJnbG9iYWwiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcWlkID0gImdsb2JhbF8iICsgKCsraWRjb3VudGVyKQogICAgICAgIGxldCBxaWRsaWtlcyA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQoKICAgICAgICBpZihuZXdsaWtlcy5sZW5ndGggPiAwKXsKICAgICAgICAgIHByaW1hbHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICAgIlJFUSIsIAogICAgICAgICAgICBxaWRsaWtlcywgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgICAiZXZlbnRzIiwgewogICAgICAgICAgICAgICAgICAiZXZlbnRfaWRzIjogbmV3bGlrZXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICAgIF0pKQoKICAgICAgICAgIGNvbnN0IGxpa2VfZXZlbnRzID0gKGF3YWl0IHdhaXRyZXMocWlkbGlrZXMpKVswXQogICAgICAgICAgbmV3bGlrZXMuc3BsaWNlKDApCiAgICAgICAgICAKICAgICAgICAgIGF3YWl0IHNhdmUoc29ja2V0LCBsaWtlX2V2ZW50cywgIiIsICJhbGwiLCB0cnVlLCB0cnVlLCBmYWxzZSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcWlkLCAKICAgICAgICAgIHsKICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICJleHBsb3JlIiwgCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRpbWVmcmFtZSI6ICJsYXRlc3QiLAogICAgICAgICAgICAgICAgInNjb3BlIjogImdsb2JhbCIsCiAgICAgICAgICAgICAgICAibGltaXQiOiA1MAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0pKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IChhd2FpdCB3YWl0cmVzKHFpZCkpWzBdCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLmZpbHRlcihlID0+IGUua2luZCA9PSAxKSwgc29ja2V0LCAiIiwgImFsbCIsIHN0aW1lKQogICAgICAgIHByaW1hbGdsb2JhbChzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCwgcHJpbWFsKXsKICAgICAgICBsb2coInF1ZXJ5Iiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICAKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHEgPSBxdWVyeXN0ci50cmltKCkKICAgICAgICBsZXQgdHlwZSA9IHF1ZXJ5dHlwZSgpCiAgICAgICAgbGV0IGkgPSArK2lkY291bnRlcgogICAgICAgIGxldCBxaWQgPSAicXVlcnlfIiArIGkKICAgICAgICBjb25zdCBsaWtlc3JlcyA9IGF3YWl0IHF1ZXJ5bGlrZXMoc29ja2V0KQogICAgICAgIAogICAgICAgIGxpa2VzcmVzLmZvckVhY2goZXZlbnRpZCA9PiB7CiAgICAgICAgICBpZighbGlrZXMuaW5jbHVkZXMoZXZlbnRpZCkpewogICAgICAgICAgICBsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICAgIG5ld2xpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIAogICAgICAgIGxldCBnYWxsZXJ5bWF0Y2ggPSBxdWVyeXN0ci5tYXRjaCgvZzooW2EtejAtOV0rKS8pCiAgICAgICAgbGV0IHJlcyA9IG51bGwKICAgICAgICAKICAgICAgICBpZihnYWxsZXJ5bWF0Y2gpewogICAgICAgICAgY29uc3QgZ2FsbGVyeXJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzMzM10sIFtnYWxsZXJ5bWF0Y2hbMV1dLCBudWxsKQogICAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBKU09OLnBhcnNlKGdhbGxlcnlyZXNbMF0uY29udGVudCkKICAgICAgICAgIHJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzFdLCBldmVudGlkcywgbnVsbCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgICBmaWx0ZXJzLnB1c2goLi4uKHR5cGVzW3R5cGVdIHx8IFtdKS5tYXAoKHQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgICBzZWFyY2g6ICIuIiArIHQsCiAgICAgICAgICAgICAgbGltaXQ6IDIwCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKQogICAgICAgICAgCiAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV0sIHNlYXJjaDogcX0pCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKGZpbHRlcnMubGVuZ3RoID09IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV19KQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBzZWFyY2hvYmogPSBbIlJFUSIsIHFpZCwgLi4uZmlsdGVyc10KICAgICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgICAgCiAgICAgICAgICByZXMgPSAoYXdhaXQgd2FpdHJlcyhxaWQpKVswXQogICAgICAgICAgCiAgICAgICAgICByZXMgPSByZXMuZmlsdGVyKG8gPT4gewogICAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICAgIGZvcihsZXQgd29yZCBvZiBxLnNwbGl0KCIgIikpewogICAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQpewogICAgICAgIGlmKCFoYXNrZXkoKSl7CiAgICAgICAgICByZXR1cm4gW10KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgbXlwdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzddLCBudWxsLCBbbXlwdWJrZXldKQogICAgICAgIHJldHVybiBldmVudHMubWFwKGUgPT4gZS50YWdzLmZpbmQodCA9PiB0WzBdID09ICJlIilbMV0pCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5ZXZlbnRzKHNvY2tldCwga2luZHMsIGV2ZW50aWRzLCBhdXRob3JzKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gImV2ZW50c18iICsgKCsraWRjb3VudGVyKQogICAgICAgIGNvbnN0IGZpbHRlcnMgPSB7fQogICAgICAgIAogICAgICAgIGZpbHRlcnMua2luZHMgPSBraW5kcwogICAgICAgIAogICAgICAgIGlmKGV2ZW50aWRzKXsKICAgICAgICAgIGZpbHRlcnNbImlkcyJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKGpzb24pCiAgICAgICAgCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKVswXSB8fCBbXQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmspewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAicXVlcnlfIiArICgrK2lkY291bnRlcikKICAgICAgICBzb2NrZXQuc2VuZChxdWVyaWVzLmF1dGhvci5yZXBsYWNlKCI8ST4iLCBxdWVyeWlkKS5yZXBsYWNlKCI8UD4iLCBwdWJrKSkKCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKVswXQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzYXZlKHNvY2tldCwgZXZlbnRzLCBxLCBxdHlwZSwgcmVhY3RlZCwgYXBwZW5kLCBxdWVyeW1ldGEpewogICAgICAgIGxldCBldmVudHB1YmtleXMgPSBbXQogICAgICAgIGxldCByZXN1bHRzID0gW10KICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCBuZXd1cmxzID0gW10KICAgICAgICAKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBsZXQgdXJsc21hdGNoID0gW10KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJpbWFnZSIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaCh2aWRlb3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHVybHNtYXRjaCA9IHVybHNtYXRjaC5maWx0ZXIodXJsID0+ICF1cmxzLmluY2x1ZGVzKHVybCkpCgogICAgICAgICAgaWYodXJsc21hdGNoLmxlbmd0aCA+IDApewogICAgICAgICAgICBuZXd1cmxzLnB1c2goewogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgICAgICB1cmxzOiB1cmxzbWF0Y2gKICAgICAgICAgICAgfSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHVybHMucHVzaCguLi51cmxzbWF0Y2gpCiAgICAgICAgICAgIGV2ZW50cHVia2V5cy5pbmNsdWRlcyhldmVudC5wdWJrZXkpIHx8IGV2ZW50cHVia2V5cy5wdXNoKGV2ZW50LnB1YmtleSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJxdWVyeSBtZXRhIiwgc29ja2V0LnVybCkKICAgICAgICBsZXQgbWV0YWV2ZW50cyA9IChxdWVyeW1ldGEgJiYgYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMF0sIG51bGwsIGV2ZW50cHVia2V5cykgfHwgW10pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBlbnRyeSBvZiBuZXd1cmxzKXsKICAgICAgICAgIGZvcihsZXQgdXJsIG9mIGVudHJ5LnVybHMpewogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWQgfHwgbGlrZXMuaW5jbHVkZXMoZW50cnkuZXZlbnQuaWQpLCAKICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgZXZlbnQ6IGVudHJ5LmV2ZW50LCAKICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZW50cnkuZXZlbnQuaWQpKSwKICAgICAgICAgICAgICBtZXRhOiBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBlbnRyeS5ldmVudC5wdWJrZXkpCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygic2F2ZSByZXMiLCByZXN1bHRzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCkKICAgICAgfQogICAgICAKICAgICAgbGV0IGxvYWRlZCA9IDAKICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKXsKICAgICAgICByZXN1bHRzLnJldmVyc2UoKS5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgY29uc3QgdHlwZSA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpICYmICJ2aWRlbyIgfHwgImltYWdlIgogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgaWQgPSAiaXRlbV8iICsgKCsraWRjb3VudGVyKQogICAgICAgICAgY29uc3QgY29udGVudGVsZW1lbnRzID0gJzxkaXYgY2xhc3M9InR5cGUiPicgKyBxcygiI3RlbXBsYXRlIC4iICsgdHlwZSArICJzdmciKS5vdXRlckhUTUwgKyAnPC9kaXY+PGEgY2xhc3M9Imxpa2UnICsgKGl0ZW0ucmVhY3RlZCA/ICcgcmVhY3RlZCcgOiAnJykgKyAnIiBkYXRhLWl0ZW0taWQ9IicgKyBpZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSIgaHJlZj0iJyArIHByb3RvY29sICsgCiAgICAgICAgICAgIGl0ZW0uYmVjaDMyaWQgKyAnIj4nICsgdGV4dCArICc8L2E+JwogICAgICAgICAgbGV0IHJvb3QgPSBudWxsCiAgICAgICAgICBsZXQgdiA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJ2aWRlby1jb250YWluZXIiKQogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAKICAgICAgICAgICAgdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIikKICAgICAgICAgICAgdlsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgICAgdi5sb29wID0gdHJ1ZQogICAgICAgICAgICB2LnBsYXlzaW5saW5lID0gIiIKICAgICAgICAgICAgCiAgICAgICAgICAgIHYub25jYW5wbGF5ID0gYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY29uc3QgYXNwZWN0ID0gdGhpcy52aWRlb1dpZHRoIC8gdGhpcy52aWRlb0hlaWdodAogICAgICAgICAgICAgIGlmKGFzcGVjdCA+IDEpewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS53aWR0aCA9IChhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLmhlaWdodCA9ICgxIC8gYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5tYXJnaW5Ub3AgPSAtKCgxIC8gYXNwZWN0ICogMTAwIC0gMTAwKSAvIDIpICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh0aGlzLnBhcmVudEVsZW1lbnQpCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgcm9vdC5hcHBlbmQodikKICAgICAgICAgIH1lbHNlIGlmKGl0ZW0udXJsLm1hdGNoKGltZ2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKICAgICAgICAgICAgcm9vdC5ocmVmID0gIiMiCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHR5cGUgPT0gImltYWdlIil7CiAgICAgICAgICAgICAgLy9sZXQgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIikKICAgICAgICAgICAgICAvL2ltZy5hbHQgPSBpdGVtLnVybAogICAgICAgICAgICAgIHJvb3RbImRhdGEtc3JjIl0gPSBpdGVtLnVybAogICAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgiaW1nIikKICAgICAgICAgICAgICAvL2ltZy5jbGFzc0xpc3QuYWRkKCJkYXRhIikKICAgICAgICAgICAgICAvL3Jvb3QuYXBwZW5kKGltZykKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICByb290LmlkID0gaWQKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpCiAgICAgICAgICByb290WyJkYXRhLWl0ZW0iXSA9IGl0ZW0KICAgICAgICAgIHJvb3RbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgIHJvb3RbImRhdGEtcXVlcnkiXSA9IHEKICAgICAgICAgIHJvb3RbImRhdGEtdGV4dCJdID0gdGV4dAogICAgICAgICAgCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQodHlwZSkKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgiaXRlbSIpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBxcygiI2ltYWdlcyIpW2FwcGVuZCAmJiAiYXBwZW5kIiB8fCAicHJlcGVuZCJdKHJvb3QpCiAgICAgICAgICAKICAgICAgICAgIGlmKHYpewogICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkocm9vdCkKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICB1cGRhdGVpbWFnZXNsb2FkKCkKICAgICAgICAKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjaW1hZ2VzIC5pdGVtIik/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRlbWVkaWEoKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gInNjcm9sbCIKICAgICAgICBxc2EoIiNtZWRpYS1jb250YWluZXIsICNpbWFnZSwgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKSkKICAgICAgICBnaWQoImltYWdlLWxpa2UiKS5jbGFzc0xpc3QucmVtb3ZlKCJyZWFjdGVkIikKICAgICAgICBoaWRldmlkZW8oKQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRldmlkZW8oKXsKICAgICAgICBjb25zdCB2ID0gcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKQogICAgICAgIAogICAgICAgIGlmKHYpewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICAgIGdpZCh2WyJkYXRhLWl0ZW0taWQiXSkuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh2LnBhcmVudEVsZW1lbnQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSwgdHlwZSl7CiAgICAgICAgbGV0IHJlc2hhbmRsZXIgPSBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCAiRU9TRSIKICAgICAgICAgIHRoaXMuZXZlbnRzID0gW10KICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihrZXkgPT0gbnVsbCB8fCBvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSB0aGlzLnR5cGUpewogICAgICAgICAgICAgICAgcmVzb2x2ZShbdGhpcy5ldmVudHMsIG9dKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHRoaXMuZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgbGV0IGhhbmRsZXIgPSBuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpCiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKGhhbmRsZXIpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKHNvY2tldCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHNvY2tldCwgdXBkYXRlc3B1YmtleSkKICAgICAgICBjb25zdCB1cGRhdGVub3RlID0gdXBkYXRlc3Jlcy5maW5kKG4gPT4gbi5jb250ZW50Lm1hdGNoKC9eaHR0cHNcOlwvXC8vKSkKICAgICAgICAKICAgICAgICBpZighdXBkYXRlbm90ZSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIgogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIGNvbnN0IGltYWdlID0gZ2lkKCJpbWFnZSIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIGltYWdlLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKQogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH1lbHNlewogICAgICAgICAgaW1hZ2Uuc3JjID0gaXRlbS51cmwKICAgICAgICAgIGltYWdlLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmhyZWYgPSBwcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH1lbHNlewogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpCiAgICAgICAgfQoKICAgICAgICBnaWQoImltYWdlLWxpa2UiKVsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKCiAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNpbWFnZS1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgIAogICAgICAgIGdpZCgibWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBsb2cobXNnKXsKICAgICAgICBsZXQgc2Nyb2xsID0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wID09IHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heAogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmlubmVyVGV4dCA9IEFycmF5LmZyb20oYXJndW1lbnRzKS5qb2luKCIgIikKICAgICAgICBxcygiI2xvZ3MiKS5hcHBlbmQoZGl2KQogICAgICAgIAogICAgICAgIHNjcm9sbCAmJiBxcygiI2xvZ3MiKS5zY3JvbGxUbygwLCBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==

Reply to this note

Please Login to reply.

Discussion

No replies yet.