https://ipfs.io/ipfs/QmXnVXDPsSWJXKVAtu6DDNcofcDk84BfQjDqEmbnQqj5fc
sha256
f62448aa213b9195b1b268b333b5ca0ad4c4d40bc27a6b3048a8eeb6df40ed4d files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyLAogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICB6LWluZGV4OiA1OwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBib3R0b206IDEuOWVtOwogICAgICAgIGZvbnQtc2l6ZTogMS44ZW07CiAgICAgICAgcGFkZGluZy1yaWdodDogLjY1ZW07CiAgICAgICAgbWF4LXdpZHRoOiA4ZW07CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICB3aWR0aDogMWVtOwogICAgICAgIGhlaWdodDogMWVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub3N0ciAubGlrZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7ICAKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiAyLjRlbTsKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsgIAogICAgICB9CiAgCiAgICAgICNpbWFnZXMgLmltZyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgLnZpZGVvc3ZnLAogICAgICAuaW1hZ2VzdmcgewogICAgICAgIHdpZHRoOiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIGhlaWdodDogY2FsYyhtaW4oNHZ3LCAyZW0pKTsKICAgICAgICBwYWRkaW5nOiAwIC4yZW07CiAgICAgIH0KICAgICAgCiAgICAgIC52aWRlb3N2ZyBwYXRoLAogICAgICAuaW1hZ2VzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtIDFlbSAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICBzdmcgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPHN2ZyBjbGFzcz0idmlkZW9zdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguMTc1LDQuMTQySDEuOTUxQzEuNzAzLDQuMTQyLDEuNSw0LjM0NCwxLjUsNC41OTJ2MTAuODE2YzAsMC4yNDcsMC4yMDMsMC40NSwwLjQ1MSwwLjQ1aDE2LjIyNGMwLjI0NywwLDAuNDUtMC4yMDMsMC40NS0wLjQ1VjQuNTkyQzE4LjYyNSw0LjM0NCwxOC40MjIsNC4xNDIsMTguMTc1LDQuMTQyIE00LjY1NSwxNC45NTdIMi40MDF2LTEuODAzaDIuMjUzVjE0Ljk1N3pNNC42NTUsMTIuMjU0SDIuNDAxdi0xLjgwM2gyLjI1M1YxMi4yNTR6IE00LjY1NSw5LjU0OUgyLjQwMVY3Ljc0N2gyLjI1M1Y5LjU0OXogTTQuNjU1LDYuODQ2SDIuNDAxVjUuMDQzaDIuMjUzVjYuODQ2ek0xNC41NjksMTQuOTU3SDUuNTU2VjUuMDQzaDkuMDEzVjE0Ljk1N3ogTTE3LjcyNCwxNC45NTdoLTIuMjUzdi0xLjgwM2gyLjI1M1YxNC45NTd6IE0xNy43MjQsMTIuMjU0aC0yLjI1M3YtMS44MDNoMi4yNTNWMTIuMjU0ek0xNy43MjQsOS41NDloLTIuMjUzVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNMTcuNzI0LDYuODQ2aC0yLjI1M1Y1LjA0M2gyLjI1M1Y2Ljg0NnoiPjwvcGF0aD4KCQkJPC9zdmc+CgkJCTxzdmcgY2xhc3M9ImltYWdlc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjU1NSwxNS4zNTRWNC41OTJjMC0wLjI0OC0wLjIwMi0wLjQ1MS0wLjQ1LTAuNDUxSDEuODg4Yy0wLjI0OCwwLTAuNDUxLDAuMjAzLTAuNDUxLDAuNDUxdjEwLjgwOGMwLDAuNTU5LDAuNzUxLDAuNDUxLDAuNDUxLDAuNDUxaDE2LjIxN2gwLjAwNUMxOC43OTMsMTUuODUxLDE4LjQ3OCwxNC44MTQsMTguNTU1LDE1LjM1NCBNMi44LDE0Ljk0OWw0Ljk0NC02LjQ2NGw0LjE0NCw1LjQxOWMwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwNWwwLjc5NywxLjA0SDIuOHogTTEzLjgyMiwxNC45NDlsLTEuMDA2LTEuMzE3bDEuNjg5LTIuMjE4bDIuNjg4LDMuNTM1SDEzLjgyMnogTTE3LjY1NCwxNC4wNjRsLTIuNzkxLTMuNjY2Yy0wLjE4MS0wLjIzNy0wLjUzNS0wLjIzNy0wLjcxNiwwbC0xLjg5OSwyLjQ5M2wtNC4xNDYtNS40MmMtMC4xOC0wLjIzNy0wLjUzNi0wLjIzNy0wLjcxNiwwbC01LjA0Nyw2LjU5OFY1LjA0MmgxNS4zMTZWMTQuMDY0eiBNMTIuNDc0LDYuMzkzYy0wLjg2OSwwLTEuNTc3LDAuNzA3LTEuNTc3LDEuNTc2czAuNzA4LDEuNTc2LDEuNTc3LDEuNTc2czEuNTc3LTAuNzA3LDEuNTc3LTEuNTc2UzEzLjM0Myw2LjM5MywxMi40NzQsNi4zOTMgTTEyLjQ3NCw4LjY0NWMtMC4zNzEsMC0wLjY3Ni0wLjMwNC0wLjY3Ni0wLjY3NnMwLjMwNS0wLjY3NiwwLjY3Ni0wLjY3NmMwLjM3MiwwLDAuNjc2LDAuMzA0LDAuNjc2LDAuNjc2UzEyLjg0Niw4LjY0NSwxMi40NzQsOC42NDUiPjwvcGF0aD4KCQkJPC9zdmc+CiAgICAgIDxkaXYgaWQ9ImNvbHNjc3MiPgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gLnF1ZXJ5LAogICAgICAuY29scyR7Y29sc30gLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0iaW1hZ2UtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXF1ZXJ5IiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJpbWFnZS11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9ImltYWdlLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBpZD0iaW1hZ2UiLz4KICAgICAgPC9kaXY+CiAgICA8L2NlbnRlcj4KICAgIDxkaXYgaWQ9Im1lbnUtb3ZlcmxheSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJ0ZXN0Ij4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iY29ubmNvdW50Ij4wPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnJlbGF5czo8L2Rpdj4KICAgICAgICA8cD5QbGVhc2UgdXNlIHJlbGF5cyB3aXRoIE5JUC01MCAoc2VhcmNoKSBmdW5jdGlvbmFsaXR5PC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InJlbGF5cy1mb3JtIj4KICAgICAgICAgIDx0ZXh0YXJlYSBpZD0icmVsYXlzIj48L3RleHRhcmVhPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUgcmVsYXlzIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5wcml2YXRlIGtleTo8L2Rpdj4KICAgICAgICA8cD5JZiB5b3UgY2FudCB1c2UgYnJvd3NlciBhZGRvbiAobW9iaWxlKTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJwcml2a2V5LWZvcm0iPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2a2V5Ii8+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSBrZXkiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxvZ3M8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJsb2dzIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGF0ZXN0IHJlbGVhc2U6PC9kaXY+CiAgICAgICAgPGEgaWQ9InJlbGVhc2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImltYWdlcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbm9zdHItdG9vbHMvbGliL25vc3RyLmJ1bmRsZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgCiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBjb2xzKCkpCiAgICAgIAogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCBzb2NrZXRzID0gW10KICAgICAgbGV0IHJlc2hhbmRsZXJzID0gW10KICAgICAgbGV0IHVybHMgPSBbXQogICAgICBsZXQgbGlrZXMgPSBbXQogICAgICBsZXQgbmV3bGlrZXMgPSBbXQogICAgICBsZXQgaWRjb3VudGVyID0gMAogICAgICBsZXQgcXVlcnl3YWl0ID0gbnVsbAogICAgICBsZXQgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICBsZXQgdHlwZXMgPSB7CiAgICAgICAgaW1hZ2U6IFsicG5nIiwgImpwZyIsICJqcGVnIiwgIndlYnAiXSwKICAgICAgICB2aWRlbzogWyJtcDQiLCAid2VibSJdCiAgICAgIH0KICAgICAgbGV0IGltZ3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihwbmd8anBnfGpwZWd8d2VicCkvZ2kKICAgICAgbGV0IHZpZGVvcmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKG1wNHx3ZWJtKS9naQogICAgICBsZXQgdmlkZW9leHRyZWdleCA9IC9cLihtcDR8d2VibSkkL2kKICAgICAgbGV0IGltZ2V4dHJlZ2V4ID0gL1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKSQvaQogICAgICB3YWl0bXMgPSA1MDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGV0IHF1ZXJ5Y291bnQgPSAwCiAgICAgIGxldCBob3ZlcmVkdmlkZW8gPSBudWxsCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjaW1hZ2UtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKS5zcGxpdCgiLyIpCiAgICAgICAgcXVlcnlzdHIgPSBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9IHBhcnRzWzFdIHx8ICJhbGwiCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxcygiI2ltYWdlcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gaW1hZ2VvZmZzZXQob2Zmc2V0KXsKICAgICAgICBjb25zdCBpbWFnZXMgPSBxc2EoIiNpbWFnZXMgPiAuaXRlbSIpLmZpbHRlcihlID0+IGUuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKQogICAgICAgIHJldHVybiBpbWFnZXNbaW1hZ2VzLmluZGV4T2YoYWN0aXZlKCkpK29mZnNldF0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gbGFzdGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxc2EoIiNpbWFnZXMgLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgY29uc3Qgb3B0aW9uID0gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgICAgb3B0aW9uPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzY3JvbGx2aXNpYmxlKG4sIG9mZnNldCl7CiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDAKICAgICAgICByZXR1cm4gKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpID49IChzY3JvbGxZIC0gb2Zmc2V0KQogICAgICAgICAgJiYgbi5vZmZzZXRUb3AgPD0gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgKyBvZmZzZXQpCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWltYWdlc2xvYWQoKXsKICAgICAgICBxc2EoIiNpbWFnZXMgLml0ZW0uaW1nIikuZm9yRWFjaChhc3luYyBpbWcgPT4gewogICAgICAgICAgaWYoc2Nyb2xsdmlzaWJsZShpbWcsIHZpc3VhbFZpZXdwb3J0LmhlaWdodCAvIDIpKXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJ1cmwoIiArIGltZ1siZGF0YS1zcmMiXSArICIpIgogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAiIgogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWFsbHZpZGVvcGxheSgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS52aWRlbyIpLmZvckVhY2goYXN5bmMgbiA9PiB1cGRhdGV2aWRlb3BsYXkobikpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheShuKXsKICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICBjb25zdCB2ID0gbi5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYoYXBsYXkgIT0gIm9uIil7CiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGF1c2UoKQogICAgICAgIH1lbHNlewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoIXNjcm9sbHZpc2libGUobikpewogICAgICAgICAgaWYodi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgIH0KICAgICAgICB9ZWxzZSBpZih2LnJlYWR5U3RhdGUgIT0gNCl7CiAgICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihhcGxheSA9PSAib24iIHx8IChhcGxheSA9PSAiaG92ZXIiICYmIHYgPT0gaG92ZXJlZHZpZGVvKSl7CiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgZSA9PiB7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKQogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgIH0pCiAgICAgIAogICAgICBsZXQgdG91Y2ggPSBudWxsCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgZSA9PiB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIGUgPT4gewogICAgICAgIGNvbnN0IHhkaWZmID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5zY3JlZW5YIC0gdG91Y2guc2NyZWVuWAoKICAgICAgICBpZih4ZGlmZiA8IC01MCl7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZih4ZGlmZiA+IDUwKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIHFzKCIjcXVlcnktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCgogICAgICBxcygiI3ByaXZrZXktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGNvbnN0IGtleSA9IHFzKCIjcHJpdmtleSIpLnZhbHVlCgogICAgICAgIGlmKGtleS5sZW5ndGggIT0gNjQgJiYga2V5Lmxlbmd0aCAhPSA2Myl7CiAgICAgICAgICBhbGVydCgia2V5IHNob3VsZCBiZSA2MyBvciA2NCBjaGFyYWN0ZXJzIGxvbmciKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJwcml2a2V5Iiwga2V5KQogICAgICAgIGFsZXJ0KCJrZXkgc2F2ZWQiKQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBob3ZlcmVkdmlkZW8gPSBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBob3ZlcmVkdmlkZW8ucGxheSgpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGhvdmVyZWR2aWRlbyA9IGZhbHNlCiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ICE9ICJibG9jayIgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGUudGFyZ2V0LnR5cGUgPT0gInN1Ym1pdCIgfHwgKGUudGFyZ2V0LnRhZ05hbWUgPT0gIkEiICYmIGUudGFyZ2V0LmhyZWYubWF0Y2goL14ofHdlYlwrKW5vc3RyXDovKSkpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInRpdGxlIil7CiAgICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSAiIgogICAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSAiYWxsIgogICAgICAgICAgcXMoIiNnbyIpLmNsaWNrKCkKICAgICAgICB9CgogICAgICAgIGUucHJldmVudERlZmF1bHQoKQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAiZmlsdGVyLWxpa2VzIil7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImZpbHRlci1saWtlcyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IG4gPSBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSAmJiBlLnRhcmdldCB8fCBlLnRhcmdldC5wYXJlbnRFbGVtZW50CgogICAgICAgIGlmKG4uY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpewogICAgICAgICAgYWN0aXZlKCk/LmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBnaWQobi5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3cobi5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNpbWFnZS1jb250YWluZXIiKSA9PSBlLnRhcmdldCB8fCBxcygiI2ltYWdlIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiIHx8IGUudGFyZ2V0LmlkID09ICJtZW51LW92ZXJsYXkiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSAmJiBsaWtlKGUudGFyZ2V0KQogICAgICB9KQogICAgICAKICAgICAgZnVuY3Rpb24gaGFza2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciB8fCBwcml2a2V5KCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVia2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciAmJiBhd2FpdCB3aW5kb3cubm9zdHIuZ2V0UHVibGljS2V5KCkgfHwgTm9zdHJUb29scy5nZXRQdWJsaWNLZXkocHJpdmtleSgpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzaWduKGV2ZW50KXsKICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIGF3YWl0IG5vc3RyLnNpZ25FdmVudChldmVudCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZXZlbnQuc2lnID0gTm9zdHJUb29scy5nZXRTaWduYXR1cmUoZXZlbnQsIHByaXZrZXkoKSkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gbGlrZShsaW5rKXsKICAgICAgICBjb25zdCBldmVudCA9IGxpbmsucGFyZW50RWxlbWVudFsiZGF0YS1ldmVudCJdCiAgICAgICAgY29uc3QgcHViayA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IHNpZ24oewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdLAogICAgICAgICAgInB1YmtleSI6IHB1YmssCiAgICAgICAgICAiY3JlYXRlZF9hdCI6IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwICwgMTApCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgaW1hZ2VpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5pbWFnZUlkCiAgICAgICAgCiAgICAgICAgaWYoaW1hZ2VpZCl7CiAgICAgICAgICBnaWQoaW1hZ2VpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgIH0KICAgIAogICAgICBmdW5jdGlvbiBzd2lwZShvZmZzZXQpewogICAgICAgIGlmKGltYWdlb2Zmc2V0KG9mZnNldCkpewogICAgICAgICAgaW1hZ2VvZmZzZXQob2Zmc2V0KS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgdGhpc1tvZmZzZXQgPT0gLTEgJiYgImxhc3RhY3RpdmUiIHx8ICJhY3RpdmUiXSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXNob3coKXsKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICBoaWRldmlkZW8oKQogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIGltYWdlb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93RG93biIgJiYgaW1hZ2VvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0Iil7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0Iil7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSl7CiAgICAgICAgc2F2ZShzb2NrZXQsIHJlcywgcSwgdHlwZSwgZmFsc2UsIGZhbHNlLCB0cnVlKQogICAgICAgIGxvZygicXVlcnkgcmVzIiwgcmVzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50LS0KICAgICAgICBpZihxdWVyeWNvdW50ID09IDApewogICAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gc3RpbWUpCiAgICAgICAgcXVlcnl3YWl0ID0gc2xlZXAod2FpdCkKICAgICAgICBhd2FpdCBxdWVyeXdhaXQucHJvbWlzZQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwcmltYWxnbG9iYWwoc29ja2V0KXsKICAgICAgICBsb2coImdsb2JhbCIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHFpZCA9ICJnbG9iYWxfIiArICgrK2lkY291bnRlcikKICAgICAgICBsZXQgcWlkbGlrZXMgPSAibGlrZXNfIiArICgrK2lkY291bnRlcikKCiAgICAgICAgaWYobmV3bGlrZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAgICJSRVEiLCAKICAgICAgICAgICAgcWlkbGlrZXMsIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICAgImV2ZW50cyIsIHsKICAgICAgICAgICAgICAgICAgImV2ZW50X2lkcyI6IG5ld2xpa2VzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgICBdKSkKCiAgICAgICAgICBjb25zdCBsaWtlX2V2ZW50cyA9IGF3YWl0IHdhaXRyZXMocWlkbGlrZXMpCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUsIGZhbHNlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxaWQsIAogICAgICAgICAgewogICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgImV4cGxvcmUiLCAKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGltZWZyYW1lIjogImxhdGVzdCIsCiAgICAgICAgICAgICAgICAic2NvcGUiOiAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDIwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSkpCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxaWQpCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLmZpbHRlcihlID0+IGUua2luZCA9PSAxKSwgc29ja2V0LCAiIiwgImFsbCIsIHN0aW1lKQogICAgICAgIHByaW1hbGdsb2JhbChzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCwgcHJpbWFsKXsKICAgICAgICBsb2coInF1ZXJ5Iiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIAogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyLnRyaW0oKQogICAgICAgIGxldCB0eXBlID0gcXVlcnl0eXBlKCkKICAgICAgICBsZXQgaSA9ICsraWRjb3VudGVyCiAgICAgICAgbGV0IHFpZCA9ICJxdWVyeV8iICsgaQogICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgZmlsdGVycy5wdXNoKC4uLih0eXBlc1t0eXBlXSB8fCBbXSkubWFwKCh0KSA9PiB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgc2VhcmNoOiAiLiIgKyB0LAogICAgICAgICAgICBsaW1pdDogMjAKICAgICAgICAgIH0KICAgICAgICB9KSkKICAgICAgICAKICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdLCBzZWFyY2g6IHF9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihmaWx0ZXJzLmxlbmd0aCA9PSAwKXsKICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXX0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIGNvbnN0IGxpa2VzcmVzID0gYXdhaXQgcXVlcnlsaWtlcyhzb2NrZXQpCiAgICAgICAgCiAgICAgICAgbGlrZXNyZXMuZm9yRWFjaChldmVudGlkID0+IHsKICAgICAgICAgIGlmKCFsaWtlcy5pbmNsdWRlcyhldmVudGlkKSl7CiAgICAgICAgICAgIGxpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgICAgbmV3bGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgY29uc3Qgc2VhcmNob2JqID0gWyJSRVEiLCBxaWQsIC4uLmZpbHRlcnNdCiAgICAgICAgY29uc3Qgc2VhcmNoanNvbiA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaG9iaikKICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdhaXRyZXMocWlkKQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSkKICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5bGlrZXMoc29ja2V0KXsKICAgICAgICBpZighaGFza2V5KCkpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBldmVudHMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFs3XSwgbnVsbCwgW215cHVia2V5XSkKICAgICAgICByZXR1cm4gZXZlbnRzLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWV2ZW50cyhzb2NrZXQsIGtpbmRzLCBldmVudGlkcywgYXV0aG9ycyl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJldmVudHNfIiArICgrK2lkY291bnRlcikKICAgICAgICBjb25zdCBmaWx0ZXJzID0ge30KICAgICAgICAKICAgICAgICBmaWx0ZXJzLmtpbmRzID0ga2luZHMKICAgICAgICAKICAgICAgICBpZihldmVudGlkcyl7CiAgICAgICAgICBmaWx0ZXJzWyIjZSJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQoKICAgICAgICBzb2NrZXQuc2VuZChqc29uKQogICAgICAgIAogICAgICAgIHJldHVybiBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpIHx8IFtdCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5cHVia2V5KHNvY2tldCwgcHViayl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmspKQoKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudGRiLCBxLCBxdHlwZSwgcmVhY3RlZCwgYXBwZW5kLCBxdWVyeW1ldGEpewogICAgICAgIGxldCBldmVudHB1YmtleXMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGV2ZW50ZGIuZmlsdGVyKG8gPT4gewogICAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgICAgZm9yKGxldCB3b3JkIG9mIHEuc3BsaXQoIiAiKSl7CiAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBldmVudHMubWFwKGUgPT4gZS5pZCkKICAgICAgICBsZXQgbmV3dXJscyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgbGV0IHVybHNtYXRjaCA9IFtdCiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJ2aWRlbyIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaChpbWdyZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAiaW1hZ2UiKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2godmlkZW9yZWdleCkgfHwgW10pKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICB1cmxzbWF0Y2ggPSB1cmxzbWF0Y2guZmlsdGVyKHVybCA9PiAhdXJscy5pbmNsdWRlcyh1cmwpKQoKICAgICAgICAgIGlmKHVybHNtYXRjaC5sZW5ndGggPiAwKXsKICAgICAgICAgICAgbmV3dXJscy5wdXNoKHsKICAgICAgICAgICAgICBldmVudDogZXZlbnQsCiAgICAgICAgICAgICAgdXJsczogdXJsc21hdGNoCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2goLi4udXJsc21hdGNoKQogICAgICAgICAgICBldmVudHB1YmtleXMuaW5jbHVkZXMoZXZlbnQucHVia2V5KSB8fCBldmVudHB1YmtleXMucHVzaChldmVudC5wdWJrZXkpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygicXVlcnkgbWV0YSIsIHNvY2tldC51cmwpCiAgICAgICAgbGV0IG1ldGFldmVudHMgPSAocXVlcnltZXRhICYmIGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpIHx8IFtdKQogICAgICAgIAogICAgICAgIGZvcihsZXQgZW50cnkgb2YgbmV3dXJscyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBlbnRyeS51cmxzKXsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkIHx8IGxpa2VzLmluY2x1ZGVzKGVudHJ5LmV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCwgCiAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGVudHJ5LmV2ZW50LmlkKSksCiAgICAgICAgICAgICAgbWV0YTogbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZW50cnkuZXZlbnQucHVia2V5KQogICAgICAgICAgICB9KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInNhdmUgcmVzIiwgcmVzdWx0cy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpCiAgICAgIH0KICAgICAgCiAgICAgIGxldCBsb2FkZWQgPSAwCiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCl7CiAgICAgICAgcmVzdWx0cy5yZXZlcnNlKCkuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgIGNvbnN0IHR5cGUgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidmlkZW8iIHx8ICJpbWFnZSIKICAgICAgICAgIGNvbnN0IHRleHQgPSAocSB8fCAidmlldyBub3RlIikuc3Vic3RyaW5nKC0zMCkKICAgICAgICAgIGNvbnN0IGlkID0gIml0ZW1fIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGNvbnN0IGNvbnRlbnRlbGVtZW50cyA9ICc8ZGl2IGNsYXNzPSJ0eXBlIj4nICsgcXMoIiN0ZW1wbGF0ZSAuIiArIHR5cGUgKyAic3ZnIikub3V0ZXJIVE1MICsgJzwvZGl2PjxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1pdGVtLWlkPSInICsgaWQgKyAKICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgIGxldCByb290ID0gbnVsbAogICAgICAgICAgbGV0IHYgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgCiAgICAgICAgICAgIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIAogICAgICAgICAgICB2Lm9uY2FucGxheSA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMudmlkZW9XaWR0aCAvIHRoaXMudmlkZW9IZWlnaHQKICAgICAgICAgICAgICBpZihhc3BlY3QgPiAxKXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUud2lkdGggPSAoYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSAoMSAvIGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUubWFyZ2luVG9wID0gLSgoMSAvIGFzcGVjdCAqIDEwMCAtIDEwMCkgLyAyKSArICIlIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodGhpcy5wYXJlbnRFbGVtZW50KQogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBleHQgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KVsxXQogICAgICAgICAgICB2LmlubmVySFRNTCA9ICc8c291cmNlIHNyYz0iJyArIGl0ZW0udXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICAgICAgCiAgICAgICAgICAgIHJvb3QuYXBwZW5kKHYpCiAgICAgICAgICB9ZWxzZSBpZihpdGVtLnVybC5tYXRjaChpbWdleHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIHJvb3QuaHJlZiA9ICIjIgogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZih0eXBlID09ICJpbWFnZSIpewogICAgICAgICAgICAgIC8vbGV0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuYWx0ID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290WyJkYXRhLXNyYyJdID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuY2xhc3NMaXN0LmFkZCgiZGF0YSIpCiAgICAgICAgICAgICAgLy9yb290LmFwcGVuZChpbWcpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgIH1lbHNlewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcm9vdC5pZCA9IGlkCiAgICAgICAgICByb290LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snCiAgICAgICAgICByb290WyJkYXRhLWl0ZW0iXSA9IGl0ZW0KICAgICAgICAgIHJvb3RbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgIHJvb3RbImRhdGEtcXVlcnkiXSA9IHEKICAgICAgICAgIHJvb3RbImRhdGEtdGV4dCJdID0gdGV4dAogICAgICAgICAgCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQodHlwZSkKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgiaXRlbSIpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBxcygiI2ltYWdlcyIpW2FwcGVuZCAmJiAiYXBwZW5kIiB8fCAicHJlcGVuZCJdKHJvb3QpCiAgICAgICAgICAKICAgICAgICAgIGlmKHYpewogICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkocm9vdCkKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICB1cGRhdGVpbWFnZXNsb2FkKCkKICAgICAgICAKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjaW1hZ2VzIC5pdGVtIik/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRlbWVkaWEoKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gInNjcm9sbCIKICAgICAgICBxc2EoIiNtZWRpYS1jb250YWluZXIsICNpbWFnZSwgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIpCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodi5wYXJlbnRFbGVtZW50KQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXkpewogICAgICAgIGxldCBldmVudHMgPSBbXQogICAgICAgIAogICAgICAgIGxldCByZXNoYW5kbGVyID0gZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiRU9TRSIpewogICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudHMpCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKHNvY2tldCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHNvY2tldCwgdXBkYXRlc3B1YmtleSkKICAgICAgICBjb25zdCB1cGRhdGVub3RlID0gdXBkYXRlc3Jlcy5maW5kKG4gPT4gbi5jb250ZW50Lm1hdGNoKC9eaHR0cHNcOlwvXC8vKSkKICAgICAgICAKICAgICAgICBpZighdXBkYXRlbm90ZSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIgogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIGNvbnN0IGltYWdlID0gZ2lkKCJpbWFnZSIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIGltYWdlLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGltYWdlLnNyYyA9IGl0ZW0udXJsCiAgICAgICAgICBpbWFnZS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5pbm5lclRleHQgPSBuYW1lCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgfQoKICAgICAgICBnaWQoImltYWdlLWxpa2UiKVsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKCiAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNpbWFnZS1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgICAgCiAgICAgICAgbWVkaWEuc3R5bGUuZGlzcGxheSA9IGdpZCgibWVkaWEtZm9vdGVyIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBsb2cobXNnKXsKICAgICAgICBsZXQgc2Nyb2xsID0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wID09IHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heAogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmlubmVyVGV4dCA9IEFycmF5LmZyb20oYXJndW1lbnRzKS5qb2luKCIgIikKICAgICAgICBxcygiI2xvZ3MiKS5hcHBlbmQoZGl2KQogICAgICAgIAogICAgICAgIHNjcm9sbCAmJiBxcygiI2xvZ3MiKS5zY3JvbGxUbygwLCBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==