1 line
34 KiB
Python
1 line
34 KiB
Python
IyBDb3B5cmlnaHQgKEMpIDIwMjIgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KZnJvbSBiYXNlNjQgaW1wb3J0IGI2NGRlY29kZSwgYjY0ZW5jb2RlCgpmcm9tIGRhdGV1dGlsLnJlbGF0aXZlZGVsdGEgaW1wb3J0IHJlbGF0aXZlZGVsdGEKCmZyb20gb2RvbyBpbXBvcnQgXywgYXBpLCBmaWVsZHMsIG1vZGVscwpmcm9tIG9kb28uZXhjZXB0aW9ucyBpbXBvcnQgQWNjZXNzRXJyb3IsIFVzZXJFcnJvciwgVmFsaWRhdGlvbkVycm9yCmZyb20gb2Rvby50b29scyBpbXBvcnQgZXhjZXB0aW9uX3RvX3VuaWNvZGUKCiMgbWFwcGluZyBvZiBmaWVsZCBuYW1lcyBmcm9tIHRlbXBsYXRlIGFuZCBmaWVsZCBuYW1lcyBmcm9tIGZpbGUKVEVNUExBVEVfRklMRV9GSUVMRF9NQVBQSU5HID0gewogICAgImNvZGUiOiAiY29kZSIsCiAgICAiZmlsZV9uYW1lIjogIm5hbWUiLAogICAgImZpbGVfdHlwZSI6ICJmaWxlX3R5cGUiLAogICAgInNlcnZlcl9kaXIiOiAic2VydmVyX2RpciIsCiAgICAia2VlcF93aGVuX2RlbGV0ZWQiOiAia2VlcF93aGVuX2RlbGV0ZWQiLAogICAgImF1dG9fc3luYyI6ICJhdXRvX3N5bmMiLAp9CgojIHRvIGNvbnZlcnQgdG8gJ3JlbGF0aXZlZGVsdGEnIG9iamVjdApJTlRFUlZBTF9UWVBFUyA9IHsKICAgICJtaW51dGVzIjogbGFtYmRhIGludGVydmFsOiByZWxhdGl2ZWRlbHRhKG1pbnV0ZXM9aW50ZXJ2YWwpLAogICAgImhvdXJzIjogbGFtYmRhIGludGVydmFsOiByZWxhdGl2ZWRlbHRhKGhvdXJzPWludGVydmFsKSwKICAgICJkYXlzIjogbGFtYmRhIGludGVydmFsOiByZWxhdGl2ZWRlbHRhKGRheXM9aW50ZXJ2YWwpLAogICAgIndlZWtzIjogbGFtYmRhIGludGVydmFsOiByZWxhdGl2ZWRlbHRhKGRheXM9NyAqIGludGVydmFsKSwKICAgICJtb250aHMiOiBsYW1iZGEgaW50ZXJ2YWw6IHJlbGF0aXZlZGVsdGEobW9udGhzPWludGVydmFsKSwKICAgICJ5ZWFycyI6IGxhbWJkYSBpbnRlcnZhbDogcmVsYXRpdmVkZWx0YSh5ZWFycz1pbnRlcnZhbCksCn0KCgpjbGFzcyBDeFRvd2VyRmlsZShtb2RlbHMuTW9kZWwpOgogICAgIiIiRmlsZXMiIiIKCiAgICBfbmFtZSA9ICJjeC50b3dlci5maWxlIgogICAgX2luaGVyaXQgPSBbCiAgICAgICAgImN4LnRvd2VyLnRlbXBsYXRlLm1peGluIiwKICAgICAgICAiY3gudG93ZXIucmVmZXJlbmNlLm1peGluIiwKICAgICAgICAibWFpbC50aHJlYWQiLAogICAgICAgICJtYWlsLmFjdGl2aXR5Lm1peGluIiwKICAgICAgICAiY3gudG93ZXIua2V5Lm1peGluIiwKICAgIF0KICAgIF9kZXNjcmlwdGlvbiA9ICJDZXRtaXggVG93ZXIgRmlsZSIKICAgIF9vcmRlciA9ICJuYW1lIgoKICAgIGFjdGl2ZSA9IGZpZWxkcy5Cb29sZWFuKGRlZmF1bHQ9VHJ1ZSkKICAgIG5hbWUgPSBmaWVsZHMuQ2hhcihoZWxwPSJGaWxlIG5hbWUgV0lUSE9VVCBwYXRoLiBFZyAndGVzdC50eHQnIikKICAgIHJlbmRlcmVkX25hbWUgPSBmaWVsZHMuQ2hhcigKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV9yZW5kZXIiLAogICAgICAgIGNvbXB1dGVfc3Vkbz1UcnVlLAogICAgKQogICAgdGVtcGxhdGVfaWQgPSBmaWVsZHMuTWFueTJvbmUoCiAgICAgICAgImN4LnRvd2VyLmZpbGUudGVtcGxhdGUiLAogICAgICAgIGludmVyc2U9Il9pbnZlcnNlX3RlbXBsYXRlX2lkIiwKICAgICAgICBpbmRleD1UcnVlLAogICAgKQogICAgc2VydmVyX2RpciA9IGZpZWxkcy5DaGFyKAogICAgICAgIHN0cmluZz0iRGlyZWN0b3J5IG9uIFNlcnZlciIsCiAgICAgICAgcmVxdWlyZWQ9VHJ1ZSwKICAgICAgICBkZWZhdWx0PSIiLAogICAgICAgIGhlbHA9IkVnICcvaG9tZS91c2VyJyBvciAnL3Zhci9sb2cnIiwKICAgICkKICAgIHJlbmRlcmVkX3NlcnZlcl9kaXIgPSBmaWVsZHMuQ2hhcigKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV9yZW5kZXIiLAogICAgICAgIGNvbXB1dGVfc3Vkbz1UcnVlLAogICAgKQogICAgZnVsbF9zZXJ2ZXJfcGF0aCA9IGZpZWxkcy5DaGFyKAogICAgICAgIHN0cmluZz0iRnVsbCBQYXRoIiwKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV9yZW5kZXIiLAogICAgICAgIGNvbXB1dGVfc3Vkbz1UcnVlLAogICAgKQogICAgc291cmNlID0gZmllbGRzLlNlbGVjdGlvbigKICAgICAgICBbCiAgICAgICAgICAgICgidG93ZXIiLCAiVG93ZXIiKSwKICAgICAgICAgICAgKCJzZXJ2ZXIiLCAiU2VydmVyIiksCiAgICAgICAgXSwKICAgICAgICBoZWxwPSIiIgogICAgICAgICAgICAtIFRvd2VyOiAgZmlsZSBpcyBwdXNoZWQgZnJvbSBUb3dlciB0byBzZXJ2ZXIuCiAgICAgICAgICAgIC0gU2VydmVyOiBmaWxlIGlzIHB1bGxlZCBmcm9tIHNlcnZlciB0byBUb3dlci4KICAgICAgICAiIiIsCiAgICApCiAgICBhdXRvX3N5bmMgPSBmaWVsZHMuQm9vbGVhbigKICAgICAgICBoZWxwPSJJZiBlbmFibGVkIGZpbGUgd2lsbCBiZSBzeW5jZWQgYXV0b21hdGljYWxseSB1c2luZyBjcm9uIiwKICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgKQogICAgIyBzZWxlY3Rpb24gZm9ybWF0OiBpbnRlcnZhbF9udW1iZXIoaW50ZWdlciktaW50ZXJ2YWxfdHlwZShuYW1lIG9mIGludGVydmFsKQogICAgIyBpdCB3aWxsIGJlIHBhcnNlZCBhcyAncmVsYXRpdmVkZWx0YScgb2JqZWN0CiAgICBhdXRvX3N5bmNfaW50ZXJ2YWwgPSBmaWVsZHMuU2VsZWN0aW9uKAogICAgICAgIHNlbGVjdGlvbj1sYW1iZGEgc2VsZjogc2VsZi5fc2VsZWN0aW9uX2F1dG9fc3luY19pbnRlcnZhbCgpLAogICAgKQogICAgc3luY19kYXRlX25leHQgPSBmaWVsZHMuRGF0ZXRpbWUoCiAgICAgICAgc3RyaW5nPSJOZXh0IFN5bmMgRGF0ZSIsCiAgICAgICAgcmVxdWlyZWQ9VHJ1ZSwKICAgICAgICBkZWZhdWx0PWZpZWxkcy5EYXRldGltZS5ub3csCiAgICAgICAgaGVscD0iRGF0ZSBhbmQgdGltZSBvZiB0aGUgbmV4dCBzeW5jaHJvbmlzYXRpb24iLAogICAgKQogICAgc3luY19kYXRlX2xhc3QgPSBmaWVsZHMuRGF0ZXRpbWUoCiAgICAgICAgc3RyaW5nPSJMYXN0IFN5bmMgRGF0ZSIsCiAgICAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgICAgICB0cmFja2luZz1UcnVlLAogICAgICAgIGhlbHA9IkRhdGUgYW5kIHRpbWUgb2YgdGhlIGxhdGVzdCBzdWNjZXNzZnVsIHN5bmNocm9uaXNhdGlvbiIsCiAgICApCiAgICBzZXJ2ZXJfcmVzcG9uc2UgPSBmaWVsZHMuVGV4dCgKICAgICAgICBjb3B5PUZhbHNlLAogICAgICAgIGhlbHA9IlNlcnZlciByZXNwb25zZSByZWNlaXZlZCBkdXJpbmcgdGhlIGxhc3Qgb3BlcmF0aW9uLlxuIgogICAgICAgICJEZWZhdWx0IHZhbHVlIGlmIG5vIGVycm9yIGhhcHBlbmVkIGlzICdvaycuXG4iCiAgICAgICAgIk90aGVyd2lzZSB0aGVyZSB3aWxsIGJlIGEgc2VydmVyIGVycm9yIG1lc3NhZ2UgbG9nZ2VkLiIsCiAgICApCiAgICBzZXJ2ZXJfaWQgPSBmaWVsZHMuTWFueTJvbmUoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci5zZXJ2ZXIiLAogICAgICAgIGluZGV4PVRydWUsCiAgICAgICAgb25kZWxldGU9ImNhc2NhZGUiLAogICAgICAgIGNvbXB1dGU9Il9jb21wdXRlX3NlcnZlcl9pZCIsCiAgICAgICAgc3RvcmU9VHJ1ZSwKICAgICAgICByZWFkb25seT1GYWxzZSwKICAgICkKICAgIGNvZGVfb25fc2VydmVyID0gZmllbGRzLlRleHQoCiAgICAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgICAgICBoZWxwPSJMYXRlc3QgdmVyc2lvbiBvZiBmaWxlIGNvbnRlbnQgb24gc2VydmVyIiwKICAgICkKICAgIHJlbmRlcmVkX2NvZGUgPSBmaWVsZHMuQ2hhcigKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV9yZW5kZXIiLAogICAgICAgIGNvbXB1dGVfc3Vkbz1UcnVlLAogICAgICAgIGhlbHA9IkZpbGUgY29udGVudCB3aXRoIHZhcmlhYmxlcyByZW5kZXJlZCIsCiAgICApCiAgICBrZWVwX3doZW5fZGVsZXRlZCA9IGZpZWxkcy5Cb29sZWFuKAogICAgICAgIGhlbHA9IkZpbGUgd2lsbCBiZSBrZXB0IG9uIHNlcnZlciB3aGVuIGRlbGV0ZWQgaW4gVG93ZXIiLAogICAgKQogICAgZmlsZV90eXBlID0gZmllbGRzLlNlbGVjdGlvbigKICAgICAgICBzZWxlY3Rpb249bGFtYmRhIHNlbGY6IHNlbGYuX3NlbGVjdGlvbl9maWxlX3R5cGUoKSwKICAgICAgICBkZWZhdWx0PWxhbWJkYSBzZWxmOiBzZWxmLl9kZWZhdWx0X2ZpbGVfdHlwZSgpLAogICAgICAgIHJlcXVpcmVkPVRydWUsCiAgICApCiAgICBmaWxlID0gZmllbGRzLkJpbmFyeSgKICAgICAgICBzdHJpbmc9IkJpbmFyeSBDb250ZW50IiwKICAgICAgICBhdHRhY2htZW50PVRydWUsCiAgICApCiAgICB2YXJpYWJsZV9pZHMgPSBmaWVsZHMuTWFueTJtYW55KAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIudmFyaWFibGUiLAogICAgICAgIHJlbGF0aW9uPSJjeF90b3dlcl9maWxlX3ZhcmlhYmxlX3JlbCIsCiAgICAgICAgY29sdW1uMT0iZmlsZV9pZCIsCiAgICAgICAgY29sdW1uMj0idmFyaWFibGVfaWQiLAogICAgKQoKICAgICMgSmV0cwogICAgamV0X3RlbXBsYXRlX2lkID0gZmllbGRzLk1hbnkyb25lKAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIuamV0LnRlbXBsYXRlIiwKICAgICAgICBoZWxwPSJKZXQgdGVtcGxhdGUgdGhpcyBmaWxlIGJlbG9uZ3MgdG8iLAogICAgICAgIGluZGV4PVRydWUsCiAgICAgICAgY29tcHV0ZT0iX2NvbXB1dGVfc2VydmVyX2lkIiwKICAgICAgICBzdG9yZT1UcnVlLAogICAgICAgIHJlYWRvbmx5PUZhbHNlLAogICAgKQogICAgamV0X2lkID0gZmllbGRzLk1hbnkyb25lKAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIuamV0IiwKICAgICAgICBoZWxwPSJKZXQgdGhpcyBmaWxlIGJlbG9uZ3MgdG8iLAogICAgICAgIGluZGV4PVRydWUsCiAgICApCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2dldF9kZXBlbmRzX2ZpZWxkcyhjbHMpOgogICAgICAgICIiIgogICAgICAgIERlZmluZSBkZXBlbmRlbnQgZmllbGRzIGZvciBjb21wdXRpbmcgYHZhcmlhYmxlX2lkc2AgaW4gZmlsZS1yZWxhdGVkIG1vZGVscy4KCiAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpZXMgdGhhdCB0aGUgZmllbGRzIGBjb2RlYCwgYHNlcnZlcl9kaXJgLAogICAgICAgIGFuZCBgbmFtZWAgYXJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGxpc3Q6IEEgbGlzdCBvZiBmaWVsZCBuYW1lcyAoc3RyKSByZXByZXNlbnRpbmcgdGhlIGRlcGVuZGVuY2llcy4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmaWVsZHMgdHJpZ2dlciByZWNvbXB1dGF0aW9uIG9mIGB2YXJpYWJsZV9pZHNgOgogICAgICAgICAgICAtIGBjb2RlYDogVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUuCiAgICAgICAgICAgIC0gYHNlcnZlcl9kaXJgOiBUaGUgZGlyZWN0b3J5IG9uIHRoZSBzZXJ2ZXIgd2hlcmUgdGhlIGZpbGUgaXMgbG9jYXRlZC4KICAgICAgICAgICAgLSBgbmFtZWA6IFRoZSBuYW1lIG9mIHRoZSBmaWxlLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBbImNvZGUiLCAic2VydmVyX2RpciIsICJuYW1lIl0KCiAgICAjIC0tIFNlbGVjdGlvbgogICAgZGVmIF9zZWxlY3Rpb25fZmlsZV90eXBlKHNlbGYpOgogICAgICAgICIiIkF2YWlsYWJsZSBmaWxlIHR5cGVzCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIExpc3Qgb2YgdHVwbGVzOiBhdmFpbGFibGUgb3B0aW9ucy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAoInRleHQiLCAiVGV4dCIpLAogICAgICAgICAgICAoImJpbmFyeSIsICJCaW5hcnkiKSwKICAgICAgICBdCgogICAgZGVmIF9zZWxlY3Rpb25fYXV0b19zeW5jX2ludGVydmFsKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNlbGVjdGlvbiBvZiBhdXRvIHN5bmMgaW50ZXJ2YWwKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAoIjEwLW1pbnV0ZXMiLCAiMTAgbWluIiksCiAgICAgICAgICAgICgiMzAtbWludXRlcyIsICIzMCBtaW4iKSwKICAgICAgICAgICAgKCIxLWhvdXJzIiwgIjEgaG91ciIpLAogICAgICAgICAgICAoIjItaG91cnMiLCAiMiBob3VyIiksCiAgICAgICAgICAgICgiNi1ob3VycyIsICI2IGhvdXIiKSwKICAgICAgICAgICAgKCIxMi1ob3VycyIsICIxMiBob3VyIiksCiAgICAgICAgICAgICgiMS1kYXlzIiwgIjEgZGF5IiksCiAgICAgICAgICAgICgiMS13ZWVrcyIsICIxIHdlZWsiKSwKICAgICAgICAgICAgKCIxLW1vbnRocyIsICIxIG1vbnRoIiksCiAgICAgICAgICAgICgiMS15ZWFycyIsICIxIHllYXIiKSwKICAgICAgICBdCgogICAgIyAtLSBEZWZhdWx0cwogICAgZGVmIF9kZWZhdWx0X2ZpbGVfdHlwZShzZWxmKToKICAgICAgICAiIiJEZWZhdWx0IGZpbGUgdHlwZQoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBDaGFyOiBgZmlsZV90eXBlYCBmaWVsZCBzZWxlY3Rpb24gdmFsdWUKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gInRleHQiCgogICAgIyAtLSBDb21wdXRlcwoKICAgIEBhcGkuZGVwZW5kcygiamV0X2lkIiwgImpldF9pZC5zZXJ2ZXJfaWQiLCAiamV0X2lkLmpldF90ZW1wbGF0ZV9pZCIpCiAgICBkZWYgX2NvbXB1dGVfc2VydmVyX2lkKHNlbGYpOgogICAgICAgIGZvciByZWNvcmQgaW4gc2VsZjoKICAgICAgICAgICAgaWYgcmVjb3JkLmpldF9pZDoKICAgICAgICAgICAgICAgIHJlY29yZC51cGRhdGUoCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogcmVjb3JkLmpldF9pZC5zZXJ2ZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiByZWNvcmQuamV0X2lkLmpldF90ZW1wbGF0ZV9pZCwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFJlc2V0IHRoZSBqZXQgdGVtcGxhdGUgaWQgaWYgdGhlIGpldCBpcyByZW1vdmVkCiAgICAgICAgICAgICAgICBpZiByZWNvcmQuamV0X3RlbXBsYXRlX2lkOgogICAgICAgICAgICAgICAgICAgIHJlY29yZC5qZXRfdGVtcGxhdGVfaWQgPSBGYWxzZQoKICAgIEBhcGkuZGVwZW5kcygic2VydmVyX2lkIiwgInRlbXBsYXRlX2lkIiwgIm5hbWUiLCAic2VydmVyX2RpciIsICJjb2RlIikKICAgIGRlZiBfY29tcHV0ZV9yZW5kZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29tcHV0ZSBmaWxlIG5hbWUsIGRpcmVjdG9yeSBhbmQgY29kZQogICAgICAgICIiIgogICAgICAgIHZhcmlhYmxlX29iaiA9IHNlbGYuZW52WyJjeC50b3dlci52YXJpYWJsZSJdCiAgICAgICAgZm9yIGZpbGUgaW4gc2VsZjoKICAgICAgICAgICAgaWYgbm90IGZpbGUuc2VydmVyX2lkOgogICAgICAgICAgICAgICAgZmlsZS51cGRhdGUoCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyZWRfbmFtZSI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyZWRfc2VydmVyX2RpciI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyZWRfY29kZSI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAiZnVsbF9zZXJ2ZXJfcGF0aCI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHZhcmlhYmxlcyA9IGxpc3QoCiAgICAgICAgICAgICAgICBzZXQoCiAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXRfdmFyaWFibGVzX2Zyb21fY29kZShmaWxlLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgKyBmaWxlLmdldF92YXJpYWJsZXNfZnJvbV9jb2RlKGZpbGUuc2VydmVyX2RpcikKICAgICAgICAgICAgICAgICAgICArIGZpbGUuZ2V0X3ZhcmlhYmxlc19mcm9tX2NvZGUoZmlsZS5jb2RlKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgICAgIHJlbmRlcl9jb2RlX2N1c3RvbSA9IGZpbGUucmVuZGVyX2NvZGVfY3VzdG9tCgogICAgICAgICAgICAjIEdldCB2YXJpYWJsZSB2YWx1ZXMgZm9yIHRoZSBzZXJ2ZXIgdGhlIGZpbGUgaXMgbGlua2VkIHRvCiAgICAgICAgICAgIHZhcl92YWxzID0gdmFyaWFibGVfb2JqLl9nZXRfdmFyaWFibGVfdmFsdWVzX2J5X3JlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICB2YXJpYWJsZXMsCiAgICAgICAgICAgICAgICBzZXJ2ZXI9ZmlsZS5zZXJ2ZXJfaWQsCiAgICAgICAgICAgICAgICBqZXRfdGVtcGxhdGU9ZmlsZS5qZXRfdGVtcGxhdGVfaWQsCiAgICAgICAgICAgICAgICBqZXQ9ZmlsZS5qZXRfaWQsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJlbmRlcmVkX2NvZGUgPSAiIgogICAgICAgICAgICBpZiBmaWxlLmZpbGVfdHlwZSA9PSAidGV4dCIgYW5kIGZpbGUuc291cmNlID09ICJ0b3dlciI6CiAgICAgICAgICAgICAgICByZW5kZXJlZF9jb2RlID0gKAogICAgICAgICAgICAgICAgICAgIHZhcl92YWxzCiAgICAgICAgICAgICAgICAgICAgYW5kIGZpbGUuY29kZQogICAgICAgICAgICAgICAgICAgIGFuZCByZW5kZXJfY29kZV9jdXN0b20oZmlsZS5jb2RlLCAqKnZhcl92YWxzKQogICAgICAgICAgICAgICAgICAgIG9yIGZpbGUuY29kZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICByZW5kZXJlZF9uYW1lID0gKAogICAgICAgICAgICAgICAgdmFyX3ZhbHMKICAgICAgICAgICAgICAgIGFuZCBmaWxlLm5hbWUKICAgICAgICAgICAgICAgIGFuZCByZW5kZXJfY29kZV9jdXN0b20oZmlsZS5uYW1lLCAqKnZhcl92YWxzKQogICAgICAgICAgICAgICAgb3IgZmlsZS5uYW1lCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVuZGVyZWRfc2VydmVyX2RpciA9ICgKICAgICAgICAgICAgICAgIHZhcl92YWxzCiAgICAgICAgICAgICAgICBhbmQgZmlsZS5zZXJ2ZXJfZGlyCiAgICAgICAgICAgICAgICBhbmQgcmVuZGVyX2NvZGVfY3VzdG9tKGZpbGUuc2VydmVyX2RpciwgKip2YXJfdmFscykKICAgICAgICAgICAgICAgIG9yIGZpbGUuc2VydmVyX2RpcgogICAgICAgICAgICApCiAgICAgICAgICAgIGZpbGUudXBkYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJyZW5kZXJlZF9uYW1lIjogcmVuZGVyZWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAicmVuZGVyZWRfc2VydmVyX2RpciI6IHJlbmRlcmVkX3NlcnZlcl9kaXIsCiAgICAgICAgICAgICAgICAgICAgInJlbmRlcmVkX2NvZGUiOiByZW5kZXJlZF9jb2RlLAogICAgICAgICAgICAgICAgICAgICJmdWxsX3NlcnZlcl9wYXRoIjogZiJ7cmVuZGVyZWRfc2VydmVyX2Rpcn0ve3JlbmRlcmVkX25hbWV9IiwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQoKICAgICMgLS0gT25jaGFuZ2UKICAgIEBhcGkub25jaGFuZ2UoInRlbXBsYXRlX2lkIikKICAgIGRlZiBfb25jaGFuZ2VfdGVtcGxhdGVfaWQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVXBkYXRlIGZpbGUgZGF0YSBieSB0ZW1wbGF0ZSB2YWx1ZXMKICAgICAgICAiIiIKICAgICAgICBmb3IgZmlsZSBpbiBzZWxmOgogICAgICAgICAgICBpZiBmaWxlLnRlbXBsYXRlX2lkOgogICAgICAgICAgICAgICAgZmlsZS51cGRhdGUoZmlsZS5fZ2V0X2ZpbGVfdmFsdWVzX2Zyb21fcmVsYXRlZF90ZW1wbGF0ZSgpKQoKICAgIEBhcGkub25jaGFuZ2UoInNvdXJjZSIpCiAgICBkZWYgX29uY2hhbmdlX3NvdXJjZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXNldCBmaWxlIHRlbXBsYXRlIGFmdGVyIGNoYW5nZSBzb3VyY2UKICAgICAgICAiIiIKICAgICAgICBzZWxmLnVwZGF0ZSh7InRlbXBsYXRlX2lkIjogRmFsc2V9KQoKICAgIGRlZiBfaW52ZXJzZV90ZW1wbGF0ZV9pZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXBsYWNlIGZpbGUgZmllbGRzIHZhbHVlcyBieSB0ZW1wbGF0ZSB2YWx1ZXMKICAgICAgICAiIiIKICAgICAgICBmb3IgZmlsZSBpbiBzZWxmOgogICAgICAgICAgICBpZiBmaWxlLnRlbXBsYXRlX2lkOgogICAgICAgICAgICAgICAgZmlsZS53cml0ZShmaWxlLl9nZXRfZmlsZV92YWx1ZXNfZnJvbV9yZWxhdGVkX3RlbXBsYXRlKCkpCgogICAgIyAtLSBDcmVhdGUvV3JpdGUvVW5saW5rCiAgICBAYXBpLm1vZGVsX2NyZWF0ZV9tdWx0aQogICAgZGVmIGNyZWF0ZShzZWxmLCB2YWxzX2xpc3QpOgogICAgICAgICIiIgogICAgICAgIE92ZXJyaWRlIHRvIHN5bmMgZmlsZXMKICAgICAgICAiIiIKICAgICAgICB2YWxzX2xpc3QgPSBbc2VsZi5fc2FuaXRpemVfdmFsdWVzKHZhbHMpIGZvciB2YWxzIGluIHZhbHNfbGlzdF0KICAgICAgICByZWNvcmRzID0gc3VwZXIoKS5jcmVhdGUodmFsc19saXN0KQogICAgICAgIHJlY29yZHMuX3Bvc3RfY3JlYXRlX3dyaXRlKCJjcmVhdGUiKQogICAgICAgIHJldHVybiByZWNvcmRzCgogICAgZGVmIHdyaXRlKHNlbGYsIHZhbHMpOgogICAgICAgICIiIgogICAgICAgIE92ZXJyaWRlIHRvIHN5bmMgZmlsZXMgZnJvbSB0b3dlcgogICAgICAgICIiIgogICAgICAgIHZhbHMgPSBzZWxmLl9zYW5pdGl6ZV92YWx1ZXModmFscykKICAgICAgICByZXN1bHQgPSBzdXBlcigpLndyaXRlKHZhbHMpCgogICAgICAgICMgc3luYyB0b3dlciBmaWxlcyBhZnRlciBjaGFuZ2UKICAgICAgICBzeW5jX2ZpZWxkcyA9IHNlbGYuX2dldF90b3dlcl9zeW5jX2ZpZWxkX25hbWVzKCkKICAgICAgICBmaWxlc190b19zeW5jID0gc2VsZi5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGZpbGU6IGZpbGUuYXV0b19zeW5jCiAgICAgICAgICAgIGFuZCBmaWxlLnNvdXJjZSA9PSAidG93ZXIiCiAgICAgICAgICAgIGFuZCBhbnkoZmllbGQgaW4gdmFscyBmb3IgZmllbGQgaW4gc3luY19maWVsZHMpCiAgICAgICAgKQogICAgICAgIGlmIGZpbGVzX3RvX3N5bmM6CiAgICAgICAgICAgIGZpbGVzX3RvX3N5bmMuX3Bvc3RfY3JlYXRlX3dyaXRlKCJ3cml0ZSIpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiB1bmxpbmsoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgT3ZlcnJpZGUgdG8gZGVsZXRlIGZyb20gc2VydmVyIHRvd2VyIGZpbGVzIHdpdGgKICAgICAgICBga2VlcF93aGVuX2RlbGV0ZWRgIHNldCB0byBGYWxzZQogICAgICAgICIiIgogICAgICAgIHNlbGYuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSBmaWxlXzogKAogICAgICAgICAgICAgICAgZmlsZV8uc2VydmVyX2lkCiAgICAgICAgICAgICAgICBhbmQgZmlsZV8uc291cmNlID09ICJ0b3dlciIKICAgICAgICAgICAgICAgIGFuZCBub3QgZmlsZV8ua2VlcF93aGVuX2RlbGV0ZWQKICAgICAgICAgICAgKQogICAgICAgICkuZGVsZXRlKCkKICAgICAgICByZXR1cm4gc3VwZXIoKS51bmxpbmsoKQoKICAgICMgLS0gQWN0aW9ucwogICAgZGVmIGFjdGlvbl91bmxpbmtfZnJvbV90ZW1wbGF0ZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBVbmxpbmsgZmlsZSBmcm9tIHRlbXBsYXRlIHRvIG1ha2UgaXQgZWRpdGFibGUKICAgICAgICAiIiIKICAgICAgICBzZWxmLmVuc3VyZV9vbmUoKQogICAgICAgIHNlbGYudGVtcGxhdGVfaWQgPSBGYWxzZQoKICAgIGRlZiBhY3Rpb25fcHVzaF90b19zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUHVzaCB0aGUgZmlsZSB0byBzZXJ2ZXIKICAgICAgICAiIiIKICAgICAgICBzZXJ2ZXJfZmlsZXMgPSBzZWxmLmZpbHRlcmVkKGxhbWJkYSBmaWxlXzogZmlsZV8uc291cmNlID09ICJzZXJ2ZXIiKQogICAgICAgIGlmIHNlcnZlcl9maWxlczoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImlyLmFjdGlvbnMuY2xpZW50IiwKICAgICAgICAgICAgICAgICJ0YWciOiAiZGlzcGxheV9ub3RpZmljYXRpb24iLAogICAgICAgICAgICAgICAgInBhcmFtcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiBfKCJGYWlsdXJlIiksCiAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBfKAogICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHVwbG9hZCBmaWxlICclKGYpcycuXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICJVcGxvYWQgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yICdzZXJ2ZXInIHR5cGUgZmlsZXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgZj1zZXJ2ZXJfZmlsZXNbMF0ucmVuZGVyZWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICJzdGlja3kiOiBGYWxzZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0KICAgICAgICBzZWxmLnVwbG9hZChyYWlzZV9lcnJvcj1UcnVlKQogICAgICAgIHNpbmdsZV9tc2cgPSBfKCJGaWxlIHVwbG9hZGVkISIpCiAgICAgICAgcGx1cmFsX21zZyA9IF8oIkZpbGVzIHVwbG9hZGVkISIpCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInR5cGUiOiAiaXIuYWN0aW9ucy5jbGllbnQiLAogICAgICAgICAgICAidGFnIjogImRpc3BsYXlfbm90aWZpY2F0aW9uIiwKICAgICAgICAgICAgInBhcmFtcyI6IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6IF8oIlN1Y2Nlc3MiKSwKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc2luZ2xlX21zZyBpZiBsZW4oc2VsZikgPT0gMSBlbHNlIHBsdXJhbF9tc2csCiAgICAgICAgICAgICAgICAic3RpY2t5IjogRmFsc2UsCiAgICAgICAgICAgIH0sCiAgICAgICAgfQoKICAgIGRlZiBhY3Rpb25fcHVsbF9mcm9tX3NlcnZlcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBQdWxsIGZpbGUgZnJvbSBzZXJ2ZXIKICAgICAgICAiIiIKICAgICAgICB0b3dlcl9maWxlcyA9IHNlbGYuZmlsdGVyZWQobGFtYmRhIGZpbGVfOiBmaWxlXy5zb3VyY2UgPT0gInRvd2VyIikKICAgICAgICBzZXJ2ZXJfZmlsZXMgPSBzZWxmIC0gdG93ZXJfZmlsZXMKICAgICAgICB0b3dlcl9maWxlcy5hY3Rpb25fZ2V0X2N1cnJlbnRfc2VydmVyX2NvZGUoKQogICAgICAgIHJlcyA9IHNlcnZlcl9maWxlcy5kb3dubG9hZChyYWlzZV9lcnJvcj1UcnVlKQogICAgICAgIGlmIGlzaW5zdGFuY2UocmVzLCBkaWN0KToKICAgICAgICAgICAgcmV0dXJuIHJlcwoKICAgICAgICBzaW5nbGVfbXNnID0gXygiRmlsZSBkb3dubG9hZGVkISIpCiAgICAgICAgcGx1cmFsX21zZyA9IF8oIkZpbGVzIGRvd25sb2FkZWQhIikKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAidHlwZSI6ICJpci5hY3Rpb25zLmNsaWVudCIsCiAgICAgICAgICAgICJ0YWciOiAiZGlzcGxheV9ub3RpZmljYXRpb24iLAogICAgICAgICAgICAicGFyYW1zIjogewogICAgICAgICAgICAgICAgInRpdGxlIjogXygiU3VjY2VzcyIpLAogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzaW5nbGVfbXNnIGlmIGxlbihzZWxmKSA9PSAxIGVsc2UgcGx1cmFsX21zZywKICAgICAgICAgICAgICAgICJzdGlja3kiOiBGYWxzZSwKICAgICAgICAgICAgfSwKICAgICAgICB9CgogICAgZGVmIGFjdGlvbl9kZWxldGVfZnJvbV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRGVsZXRlIGZpbGUgZnJvbSBzZXJ2ZXIKICAgICAgICAiIiIKICAgICAgICBzZXJ2ZXJfZmlsZXMgPSBzZWxmLmZpbHRlcmVkKGxhbWJkYSBmaWxlXzogZmlsZV8uc291cmNlID09ICJzZXJ2ZXIiKQogICAgICAgIGlmIHNlcnZlcl9maWxlczoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImlyLmFjdGlvbnMuY2xpZW50IiwKICAgICAgICAgICAgICAgICJ0YWciOiAiZGlzcGxheV9ub3RpZmljYXRpb24iLAogICAgICAgICAgICAgICAgInBhcmFtcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiBfKCJGYWlsdXJlIiksCiAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBfKAogICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGRlbGV0ZSBmaWxlICclKGYpcycuXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICJEZWxldGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yICdzZXJ2ZXInIHR5cGUgZmlsZXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgZj1zZXJ2ZXJfZmlsZXNbMF0ucmVuZGVyZWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICJzdGlja3kiOiBGYWxzZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0KICAgICAgICBzZWxmLmRlbGV0ZShyYWlzZV9lcnJvcj1UcnVlKQogICAgICAgIHNpbmdsZV9tc2cgPSBfKCJGaWxlIGRlbGV0ZWQhIikKICAgICAgICBwbHVyYWxfbXNnID0gXygiRmlsZXMgZGVsZXRlZCEiKQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJ0eXBlIjogImlyLmFjdGlvbnMuY2xpZW50IiwKICAgICAgICAgICAgInRhZyI6ICJkaXNwbGF5X25vdGlmaWNhdGlvbiIsCiAgICAgICAgICAgICJwYXJhbXMiOiB7CiAgICAgICAgICAgICAgICAidGl0bGUiOiBfKCJTdWNjZXNzIiksCiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHNpbmdsZV9tc2cgaWYgbGVuKHNlbGYpID09IDEgZWxzZSBwbHVyYWxfbXNnLAogICAgICAgICAgICAgICAgInN0aWNreSI6IEZhbHNlLAogICAgICAgICAgICB9LAogICAgICAgIH0KCiAgICBkZWYgYWN0aW9uX2dldF9jdXJyZW50X3NlcnZlcl9jb2RlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCBhY3R1YWwgZmlsZSBjb2RlIGZyb20gc2VydmVyCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGZpbGUgaW4gc2VsZjoKICAgICAgICAgICAgaWYgZmlsZS5zb3VyY2UgIT0gInRvd2VyIjoKICAgICAgICAgICAgICAgIHJhaXNlIFVzZXJFcnJvcigKICAgICAgICAgICAgICAgICAgICBfKAogICAgICAgICAgICAgICAgICAgICAgICAiRmlsZSAlKGYpcyBpcyBub3QgJ3Rvd2VyJyB0eXBlLiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQgZm9yICd0b3dlcicgIgogICAgICAgICAgICAgICAgICAgICAgICAiZmlsZXMgb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGY9ZmlsZS5uYW1lLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgQ2FsbGluZyBgX3Byb2Nlc3NgIGRpcmVjdGx5IHRvIGdldCBzZXJ2ZXIgdmVyc2lvbiBvZiBhIGB0b3dlcmAgZmlsZQogICAgICAgICAgICByZXMgPSBmaWxlLndpdGhfY29udGV4dChpc19zZXJ2ZXJfY29kZV92ZXJzaW9uX3Byb2Nlc3M9VHJ1ZSkuX3Byb2Nlc3MoCiAgICAgICAgICAgICAgICAiZG93bmxvYWQiCiAgICAgICAgICAgICkKICAgICAgICAgICAgIyBUeXBlIGNoZWNrIGJlY2F1c2UgX3Byb2Nlc3MgbWV0aG9kIGNvdWxkIHJldHVybgogICAgICAgICAgICAjIGEgZGlzcGxheV9ub3RpZmljYXRpb24gYWN0aW9uIGRpY3QKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXMsIGRpY3QpOgogICAgICAgICAgICAgICAgcmV0dXJuIHJlcwogICAgICAgICAgICBmaWxlLmNvZGVfb25fc2VydmVyID0gcmVzCgogICAgIyAtLSBCdXNpbmVzcyBsb2dpYwogICAgZGVmIF9wb3N0X2NyZWF0ZV93cml0ZShzZWxmLCBvcF90eXBlPSJ3cml0ZSIpOgogICAgICAgICIiIkhlbHBlciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBhZnRlciBmaWxlIGNyZWF0aW9uIG9yIHVwZGF0ZS4KICAgICAgICBVc2UgdGhpcyBmdW5jdGlvbiB0byBpbXBsZW1lbnQgY3VzdG9tIGhvb2tzLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBvcF90eXBlIChzdHIsIG9wdGlvbmFsKTogT3BlcmF0aW9uIHR5cGUuIERlZmF1bHRzIHRvICJ3cml0ZSIuCiAgICAgICAgICAgICAgICBQb3NzaWJsZSBvcHRpb25zOgogICAgICAgICAgICAgICAgICAgIC0gImNyZWF0ZSIKICAgICAgICAgICAgICAgICAgICAtICJ3cml0ZSIKICAgICAgICAiIiIKCiAgICAgICAgIyBQdWxsIGFsbCBgYXV0b19zeW5jYCBzZXJ2ZXIgZmlsZXMKICAgICAgICBzZXJ2ZXJfZmlsZXNfdG9fc3luYyA9IHNlbGYuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSBmaWxlOiBmaWxlLmF1dG9fc3luYyBhbmQgZmlsZS5zb3VyY2UgPT0gInNlcnZlciIKICAgICAgICApCiAgICAgICAgaWYgc2VydmVyX2ZpbGVzX3RvX3N5bmM6CiAgICAgICAgICAgIHNlcnZlcl9maWxlc190b19zeW5jLmFjdGlvbl9wdWxsX2Zyb21fc2VydmVyKCkKCiAgICAgICAgIyBQdXNoIGFsbCBgYXV0b19zeW5jYCB0b3dlciBmaWxlcwogICAgICAgIHRvd2VyX2ZpbGVzX3RvX3N5bmMgPSBzZWxmLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgZmlsZTogZmlsZS5hdXRvX3N5bmMgYW5kIGZpbGUuc291cmNlID09ICJ0b3dlciIKICAgICAgICApCiAgICAgICAgaWYgdG93ZXJfZmlsZXNfdG9fc3luYzoKICAgICAgICAgICAgdG93ZXJfZmlsZXNfdG9fc3luYy5hY3Rpb25fcHVzaF90b19zZXJ2ZXIoKQoKICAgIGRlZiBfZ2V0X2ZpbGVfdmFsdWVzX2Zyb21fcmVsYXRlZF90ZW1wbGF0ZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gZmlsZSB2YWx1ZXMgZnJvbSByZWxhdGVkIHRlbXBsYXRlCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnN1cmVfb25lKCkKICAgICAgICBpZiBub3Qgc2VsZi50ZW1wbGF0ZV9pZDoKICAgICAgICAgICAgcmV0dXJuIHt9CgogICAgICAgIHZhbHVlcyA9IHNlbGYudGVtcGxhdGVfaWQucmVhZChsaXN0KFRFTVBMQVRFX0ZJTEVfRklFTERfTUFQUElORyksIGxvYWQ9RmFsc2UpWzBdCiAgICAgICAgaWYgKAogICAgICAgICAgICBzZWxmLmVudi5jb250ZXh0LmdldCgiaXNfY3VzdG9tX3NlcnZlcl9kaXIiKQogICAgICAgICAgICBhbmQgc2VsZi5zZXJ2ZXJfZGlyCiAgICAgICAgICAgIGFuZCAic2VydmVyX2RpciIgaW4gdmFsdWVzCiAgICAgICAgKToKICAgICAgICAgICAgZGVsIHZhbHVlc1sic2VydmVyX2RpciJdCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGtleTogdmFsdWVzW25hbWVdCiAgICAgICAgICAgIGZvciBuYW1lLCBrZXkgaW4gVEVNUExBVEVfRklMRV9GSUVMRF9NQVBQSU5HLml0ZW1zKCkKICAgICAgICAgICAgaWYgbmFtZSBpbiB2YWx1ZXMKICAgICAgICB9CgogICAgQGFwaS5tb2RlbAogICAgZGVmIF9zYW5pdGl6ZV92YWx1ZXMoc2VsZiwgdmFsdWVzKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayB0aGUgdmFsdWVzIGFuZCByZWZvcm1hdCBpZiBuZWNlc3NhcnkKICAgICAgICAiIiIKICAgICAgICBpZiAic2VydmVyX2RpciIgaW4gdmFsdWVzOgogICAgICAgICAgICBzZXJ2ZXJfZGlyID0gKHZhbHVlcy5nZXQoInNlcnZlcl9kaXIiKSBvciAiIikuc3RyaXAoKQogICAgICAgICAgICBpZiBzZXJ2ZXJfZGlyLmVuZHN3aXRoKCIvIikgYW5kIHNlcnZlcl9kaXIgIT0gIi8iOgogICAgICAgICAgICAgICAgc2VydmVyX2RpciA9IHNlcnZlcl9kaXJbOi0xXQogICAgICAgICAgICB2YWx1ZXMudXBkYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfZGlyIjogc2VydmVyX2RpciwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQogICAgICAgIHJldHVybiB2YWx1ZXMKCiAgICBkZWYgZG93bmxvYWQoc2VsZiwgcmFpc2VfZXJyb3I9RmFsc2UpOgogICAgICAgICIiIldyYXBwZXIgZnVuY3Rpb24gZm9yIGZpbGUgZG93bmxvYWQuCiAgICAgICAgVXNlIGl0IGZvciBjdXN0b20gaG9va3MgaW1wbGVtZW50YXRpb24uCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHJhaXNlX2Vycm9yIChib29sLCBvcHRpb25hbCk6CiAgICAgICAgICAgICAgICBXaWxsIHJhaXNlIGFuZCBleGNlcHRpb24gb24gZXJyb3IgaWYgc2V0IHRvICdUcnVlJy4KICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIEZhbHNlLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9wcm9jZXNzKCJkb3dubG9hZCIsIHJhaXNlX2Vycm9yKQoKICAgIGRlZiB1cGxvYWQoc2VsZiwgcmFpc2VfZXJyb3I9RmFsc2UpOgogICAgICAgICIiIldyYXBwZXIgZnVuY3Rpb24gZm9yIGZpbGUgdXBsb2FkLgogICAgICAgIFVzZSBpdCBmb3IgY3VzdG9tIGhvb2tzIGltcGxlbWVudGF0aW9uLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICByYWlzZV9lcnJvciAoYm9vbCwgb3B0aW9uYWwpOgogICAgICAgICAgICAgICAgV2lsbCByYWlzZSBhbmQgZXhjZXB0aW9uIG9uIGVycm9yIGlmIHNldCB0byAnVHJ1ZScuCiAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBGYWxzZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9wcm9jZXNzKCJ1cGxvYWQiLCByYWlzZV9lcnJvcikKCiAgICBkZWYgZGVsZXRlKHNlbGYsIHJhaXNlX2Vycm9yPUZhbHNlKToKICAgICAgICAiIiJXcmFwcGVyIGZ1bmN0aW9uIGZvciBmaWxlIHJlbW92YWwuCiAgICAgICAgVXNlIGl0IGZvciBjdXN0b20gaG9va3MgaW1wbGVtZW50YXRpb24uCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHJhaXNlX2Vycm9yIChib29sLCBvcHRpb25hbCk6CiAgICAgICAgICAgICAgICBXaWxsIHJhaXNlIGFuZCBleGNlcHRpb24gb24gZXJyb3IgaWYgc2V0IHRvICdUcnVlJy4KICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIEZhbHNlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX3Byb2Nlc3MoImRlbGV0ZSIsIHJhaXNlX2Vycm9yKQoKICAgIGRlZiBfcHJvY2Vzc19kb3dubG9hZCgKICAgICAgICBzZWxmLAogICAgICAgIHRvd2VyX2tleV9vYmosCiAgICAgICAgaXNfc2VydmVyX2NvZGVfdmVyc2lvbl9wcm9jZXNzPUZhbHNlLAogICAgKToKICAgICAgICAiIiIKICAgICAgICBQcm9jZXNzaW5nIG9mIGZpbGUgZG93bmxvYWQuCiAgICAgICAgTm90ZTogbW92ZWQgdGhpcyBmdW5jdGlvbmFsaXR5IHRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gZnJvbQogICAgICAgIHRoZSBnZW5lcmFsIGBfcHJvY2Vzc2AgbWV0aG9kIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSB0b28gY29tcGxleC4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgdG93ZXJfa2V5X29iaiAoUmVjb3JkU2V0KTogYGN4LnRvd2VyLmtleWAKICAgICAgICAgICAgICAgIHJlY29yZHNldCB0byBwYXJzZSBmaWxlIHBhdGguCiAgICAgICAgICAgIGlzX3NlcnZlcl9jb2RlX3ZlcnNpb25fcHJvY2VzcyAoYm9vbCk6CiAgICAgICAgICAgICAgICBGbGFnIHRvIGZldGNoIGFjdHVhbCBmaWxlIGNvbnRlbnQgZnJvbSBzZXJ2ZXIKICAgICAgICAgICAgICAgIGZvciBhIGB0b3dlcmAgdHlwZSBmaWxlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBbZGljdHxzdHJ8Tm9uZV06CiAgICAgICAgICAgICAgICBkaXNwbGF5X25vdGlmaWNhdGlvbiBhY3Rpb24gZGljdCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IKICAgICAgICAgICAgICAgIGR1cmluZyB0aGUgb3BlcmF0aW9uLgogICAgICAgICAgICAgICAgZmlsZSBjb250ZW50IGlmIGBpc19zZXJ2ZXJfY29kZV92ZXJzaW9uX3Byb2Nlc3NgIGlzIFRydWUuCiAgICAgICAgICAgICAgICBOb25lIG90aGVyd2lzZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmVuc3VyZV9vbmUoKQogICAgICAgIGNvZGUgPSBzZWxmLnNlcnZlcl9pZC5kb3dubG9hZF9maWxlKAogICAgICAgICAgICB0b3dlcl9rZXlfb2JqLl9wYXJzZV9jb2RlKHNlbGYuZnVsbF9zZXJ2ZXJfcGF0aCksCiAgICAgICAgKQogICAgICAgIGlmIHNlbGYuZmlsZV90eXBlID09ICJ0ZXh0IiBhbmQgYiJceDAwIiBpbiBjb2RlOgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInR5cGUiOiAiaXIuYWN0aW9ucy5jbGllbnQiLAogICAgICAgICAgICAgICAgInRhZyI6ICJkaXNwbGF5X25vdGlmaWNhdGlvbiIsCiAgICAgICAgICAgICAgICAicGFyYW1zIjogewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IF8oIkZhaWx1cmUiKSwKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IF8oCiAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZG93bmxvYWQgJShmKXMgZnJvbSBzZXJ2ZXI6ICIKICAgICAgICAgICAgICAgICAgICAgICAgIkJpbmFyeSBjb250ZW50IGlzIG5vdCBzdXBwb3J0ZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAiZm9yICdUZXh0JyBmaWxlIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAlIHsiZiI6IHNlbGYucmVuZGVyZWRfbmFtZX0sCiAgICAgICAgICAgICAgICAgICAgInN0aWNreSI6IFRydWUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9CiAgICAgICAgIyBJbiBjYXNlIHNlcnZlciB2ZXJzaW9uIG9mIGEgJ3Rvd2VyJyBmaWxlIGlzIHJlcXVlc3RlZAogICAgICAgIGlmIGlzX3NlcnZlcl9jb2RlX3ZlcnNpb25fcHJvY2VzczoKICAgICAgICAgICAgcmV0dXJuIGNvZGUKICAgICAgICBpZiBzZWxmLmZpbGVfdHlwZSA9PSAiYmluYXJ5IjoKICAgICAgICAgICAgc2VsZi5maWxlID0gYjY0ZW5jb2RlKGNvZGUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jb2RlID0gY29kZQoKICAgIGRlZiBfcHJvY2VzcyhzZWxmLCBhY3Rpb24sIHJhaXNlX2Vycm9yPUZhbHNlKToKICAgICAgICAiIiJVcGxvYWQgb3IgZG93bmxvYWQgZmlsZSB0by9mcm9tIHNlcnZlci4KICAgICAgICBJbXBvcnRhbnQhCiAgICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHZhbHVlIG9ubHkgaW4gY2FzZSBgaXNfc2VydmVyX2NvZGVfdmVyc2lvbl9wcm9jZXNzYAogICAgICAgIGtleSBpcyBwcmVzZW50IGluIGNvbnRleHQuCiAgICAgICAgVGhpcyBrZXkgaXMgdXNlZCB0byBmZXRjaCBhY3R1YWwgZmlsZSBjb250ZW50IGZyb20gc2VydmVyCiAgICAgICAgZm9yIGEgYHRvd2VyYCB0eXBlIGZpbGUuCiAgICAgICAgSW4gYWxsIG90aGVyIGNhc2VzIGl0IHdpbGwgdXBkYXRlIHRoZSBmaWxlIGNvbnRlbnQgYW5kIHNhdmUKICAgICAgICBzZXJ2ZXIgcmVzcG9uc2UgaW50byB0aGUgYHNlcnZlcl9yZXNwb25zZWAgZmllbGQuCgoKCiAgICAgICAgQXJnczoKICAgICAgICAgICAgYWN0aW9uIChTZWxlY3Rpb24pOiBBY3Rpb24gdG8gcHJvY2Vzcy4KICAgICAgICAgICAgICAgIFBvc3NpYmxlIG9wdGlvbnM6CiAgICAgICAgICAgICAgICAgICAgLSAidXBsb2FkIjogVXBsb2FkIGZpbGUuCiAgICAgICAgICAgICAgICAgICAgLSAiZG93bmxvYWQiOiBEb3dubG9hZCBmaWxlLgogICAgICAgICAgICAgICAgICAgIC0gImRlbGV0ZSI6IERlbGV0ZSBmaWxlLgogICAgICAgICAgICByYWlzZV9lcnJvciAoYm9vbCwgb3B0aW9uYWwpOiBSYWlzZSBleGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yCiAgICAgICAgICAgICAgICAgZHVyaW5nIHRoZSBvcGVyYXRpb24uIERlZmF1bHRzIHRvIEZhbHNlLgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIFVzZXJFcnJvcjogSW4gY2FzZSBmaWxlIGZvcm1hdCBkb2Vzbid0IG1hdGNoIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgogICAgICAgICAgICAgICAgRWcgaWYgdHJ5aW5nIHRvIHVwbG9hZCAnc2VydmVyJyB0eXBlIGZpbGUuCiAgICAgICAgICAgIFZhbGlkYXRpb25FcnJvcjogSW4gY2FzZSB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICBhbiBhY3Rpb24gd2l0aCBhIGZpbGUuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIENoYXI6IGZpbGUgY29udGVudCBvciBGYWxzZS4KICAgICAgICAiIiIKCiAgICAgICAgdG93ZXJfa2V5X29iaiA9IHNlbGYuZW52WyJjeC50b3dlci5rZXkiXQogICAgICAgIGlzX3NlcnZlcl9jb2RlX3ZlcnNpb25fcHJvY2VzcyA9IHNlbGYuZW52LmNvbnRleHQuZ2V0KAogICAgICAgICAgICAiaXNfc2VydmVyX2NvZGVfdmVyc2lvbl9wcm9jZXNzIgogICAgICAgICkKICAgICAgICBmb3IgZmlsZSBpbiBzZWxmOgogICAgICAgICAgICBpZiBub3QgaXNfc2VydmVyX2NvZGVfdmVyc2lvbl9wcm9jZXNzIGFuZCAoCiAgICAgICAgICAgICAgICAoYWN0aW9uID09ICJkb3dubG9hZCIgYW5kIGZpbGUuc291cmNlICE9ICJzZXJ2ZXIiKQogICAgICAgICAgICAgICAgb3IgKGFjdGlvbiA9PSAidXBsb2FkIiBhbmQgZmlsZS5zb3VyY2UgIT0gInRvd2VyIikKICAgICAgICAgICAgICAgIG9yIChhY3Rpb24gPT0gImRlbGV0ZSIgYW5kIGZpbGUuc291cmNlICE9ICJ0b3dlciIpCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICBpZiByYWlzZV9lcnJvcjoKICAgICAgICAgICAgICAgICAgICByYWlzZSBVc2VyRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIF8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZSAlKGYpcyBzaG91bGRuJ3QgaGF2ZSB0aGUgJyUoc3JjKXMnIHNvdXJjZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciB0aGUgJyUoYWN0KXMnIGFjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmPWZpbGUubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1maWxlLnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdD1hY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIGlmIGFjdGlvbiA9PSAiZGVsZXRlIjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBmaWxlLmNoZWNrX2FjY2Vzc19yaWdodHMoInVubGluayIpCiAgICAgICAgICAgICAgICAgICAgZmlsZS5jaGVja19hY2Nlc3NfcnVsZSgidW5saW5rIikKICAgICAgICAgICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgIGlmIHJhaXNlX2Vycm9yOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBY2Nlc3NFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1ZSB0byBzZWN1cml0eSByZXN0cmljdGlvbnMgeW91IGFyZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGxvd2VkIHRvIGRlbGV0ZSAlKGZwKXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwPWZpbGUuZnVsbF9zZXJ2ZXJfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgKSBmcm9tIGUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlmIGFjdGlvbiA9PSAiZG93bmxvYWQiOgogICAgICAgICAgICAgICAgICAgIHJlcyA9IGZpbGUuX3Byb2Nlc3NfZG93bmxvYWQoCiAgICAgICAgICAgICAgICAgICAgICAgIHRvd2VyX2tleV9vYmosIGlzX3NlcnZlcl9jb2RlX3ZlcnNpb25fcHJvY2VzcwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBpZiByZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMKICAgICAgICAgICAgICAgIGVsaWYgYWN0aW9uID09ICJ1cGxvYWQiOgogICAgICAgICAgICAgICAgICAgIGlmIGZpbGUuZmlsZV90eXBlID09ICJiaW5hcnkiOgogICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbnRlbnQgPSBiNjRkZWNvZGUoZmlsZS5maWxlKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29udGVudCA9IHRvd2VyX2tleV9vYmouX3BhcnNlX2NvZGUoZmlsZS5yZW5kZXJlZF9jb2RlKQogICAgICAgICAgICAgICAgICAgIGZpbGUuc2VydmVyX2lkLnVwbG9hZF9maWxlKAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHRvd2VyX2tleV9vYmouX3BhcnNlX2NvZGUoZmlsZS5mdWxsX3NlcnZlcl9wYXRoKSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbGlmIGFjdGlvbiA9PSAiZGVsZXRlIjoKICAgICAgICAgICAgICAgICAgICBmaWxlLnNlcnZlcl9pZC5kZWxldGVfZmlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgdG93ZXJfa2V5X29iai5fcGFyc2VfY29kZShmaWxlLmZ1bGxfc2VydmVyX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgICAgIGZpbGUuc3VkbygpLnNlcnZlcl9yZXNwb25zZSA9ICJvayIKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlcnJvcjoKICAgICAgICAgICAgICAgIGlmIHJhaXNlX2Vycm9yOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbGlkYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgXygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcHVsbCAlKGYpcyBmcm9tIHNlcnZlcjogJShlcnIpcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmPWZpbGUucmVuZGVyZWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycj1leGNlcHRpb25fdG9fdW5pY29kZShlcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApIGZyb20gZXJyb3IKICAgICAgICAgICAgICAgIGZpbGUuc2VydmVyX3Jlc3BvbnNlID0gcmVwcihlcnJvcikKCiAgICAgICAgaWYgbm90IGlzX3NlcnZlcl9jb2RlX3ZlcnNpb25fcHJvY2VzczoKICAgICAgICAgICAgc2VsZi5fdXBkYXRlX2ZpbGVfc3luY19kYXRlKGZpZWxkcy5EYXRldGltZS5ub3coKSkKCiAgICBAYXBpLm1vZGVsCiAgICBkZWYgX2dldF90b3dlcl9zeW5jX2ZpZWxkX25hbWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgbGlzdCBvZiBmaWVsZCBuYW1lcyB0byBzdGFydCBzeW5jaHJvbml6YXRpb24KICAgICAgICBhZnRlciBjaGFuZ2luZyB0aGVzZSBmaWVsZHMKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gWyJuYW1lIiwgInNlcnZlcl9kaXIiLCAiY29kZSJdCgogICAgQGFwaS5tb2RlbAogICAgZGVmIF9ydW5fYXV0b19wdWxsX2ZpbGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJ1biBhdXRvIHN5bmMgZmlsZXMKICAgICAgICAiIiIKICAgICAgICBub3cgPSBmaWVsZHMuRGF0ZXRpbWUubm93KCkKICAgICAgICBmaWxlcyA9IHNlbGYuc2VhcmNoKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAoInNvdXJjZSIsICI9IiwgInNlcnZlciIpLAogICAgICAgICAgICAgICAgKCJhdXRvX3N5bmMiLCAiPSIsIFRydWUpLAogICAgICAgICAgICAgICAgKCJzeW5jX2RhdGVfbmV4dCIsICI8PSIsIG5vdyksCiAgICAgICAgICAgIF0KICAgICAgICApCiAgICAgICAgZmlsZXMuZG93bmxvYWQocmFpc2VfZXJyb3I9RmFsc2UpCgogICAgZGVmIF91cGRhdGVfZmlsZV9zeW5jX2RhdGUoc2VsZiwgbGFzdF9zeW5jX2RhdGUpOgogICAgICAgICIiIgogICAgICAgIENvbXB1dGUgYW5kIHVwZGF0ZSBuZXh0IGRhdGUgb2Ygc3luYwogICAgICAgICIiIgogICAgICAgIGZvciBmaWxlIGluIHNlbGY6CiAgICAgICAgICAgIHZhbHMgPSB7fQogICAgICAgICAgICBpZiBmaWxlLnNvdXJjZSA9PSAic2VydmVyIiBhbmQgZmlsZS5hdXRvX3N5bmMgYW5kIGZpbGUuYXV0b19zeW5jX2ludGVydmFsOgogICAgICAgICAgICAgICAgaW50ZXJ2YWwsIGludGVydmFsX3R5cGUgPSBmaWxlLmF1dG9fc3luY19pbnRlcnZhbC5zcGxpdCgiLSIpCiAgICAgICAgICAgICAgICB2YWxzLnVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJzeW5jX2RhdGVfbmV4dCI6IGxhc3Rfc3luY19kYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICsgSU5URVJWQUxfVFlQRVNbaW50ZXJ2YWxfdHlwZV0oaW50KGludGVydmFsKSkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGlmIGZpbGUuc2VydmVyX3Jlc3BvbnNlID09ICJvayI6CiAgICAgICAgICAgICAgICB2YWxzLnVwZGF0ZSh7InN5bmNfZGF0ZV9sYXN0IjogbGFzdF9zeW5jX2RhdGV9KQogICAgICAgICAgICBmaWxlLnN1ZG8oKS53cml0ZSh2YWxzKQoKICAgICMgQ2hlY2sgY3gudG93ZXIucmVmZXJlbmNlLm1peGluIGZvciB0aGUgZnVuY3Rpb24gZG9jdW1lbnRhdGlvbgogICAgZGVmIF9nZXRfcHJlX3BvcHVsYXRlZF9tb2RlbF9kYXRhKHNlbGYpOgogICAgICAgIHJlcyA9IHN1cGVyKCkuX2dldF9wcmVfcG9wdWxhdGVkX21vZGVsX2RhdGEoKQogICAgICAgIHJlcy51cGRhdGUoeyJjeC50b3dlci5maWxlIjogWyJjeC50b3dlci5zZXJ2ZXIiLCAic2VydmVyX2lkIl19KQogICAgICAgIHJldHVybiByZXMK |