Files
odoo-addons/addons/cetmix_tower_server/models/cx_tower_variable.py

1 line
41 KiB
Python

IyBDb3B5cmlnaHQgKEMpIDIwMjIgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHV1aWQKZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHVybHBhcnNlCgpmcm9tIG9kb28gaW1wb3J0IF8sIGFwaSwgZmllbGRzLCBtb2RlbHMKZnJvbSBvZG9vLnRvb2xzLnNhZmVfZXZhbCBpbXBvcnQgc2FmZV9ldmFsLCB3cmFwX21vZHVsZQoKX2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKcmUgPSB3cmFwX21vZHVsZSgKICAgIF9faW1wb3J0X18oInJlIiksCiAgICBbCiAgICAgICAgIm1hdGNoIiwKICAgICAgICAiZnVsbG1hdGNoIiwKICAgICAgICAic2VhcmNoIiwKICAgICAgICAic3ViIiwKICAgICAgICAic3VibiIsCiAgICAgICAgInNwbGl0IiwKICAgICAgICAiZmluZGFsbCIsCiAgICAgICAgImZpbmRpdGVyIiwKICAgICAgICAiY29tcGlsZSIsCiAgICAgICAgInRlbXBsYXRlIiwKICAgICAgICAiZXNjYXBlIiwKICAgICAgICAiZXJyb3IiLAogICAgXSwKKQoKIyBNYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCBmb3IgdmFyaWFibGUgdmFsdWUgcmVuZGVyaW5nCiMgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcwpNQVhfREVQVEggPSAxMAoKCmNsYXNzIFRvd2VyVmFyaWFibGUobW9kZWxzLk1vZGVsKToKICAgICIiIlZhcmlhYmxlcyIiIgoKICAgIF9uYW1lID0gImN4LnRvd2VyLnZhcmlhYmxlIgogICAgX2Rlc2NyaXB0aW9uID0gIkNldG1peCBUb3dlciBWYXJpYWJsZSIKICAgIF9pbmhlcml0ID0gWwogICAgICAgICJjeC50b3dlci5yZWZlcmVuY2UubWl4aW4iLAogICAgICAgICJjeC50b3dlci5hY2Nlc3MubWl4aW4iLAogICAgICAgICJjeC50b3dlci50YWcubWl4aW4iLAogICAgXQoKICAgIF9vcmRlciA9ICJuYW1lIgoKICAgIERFRkFVTFRfVkFMSURBVElPTl9NRVNTQUdFID0gXygiSW52YWxpZCB2YWx1ZSEiKQogICAgU1lTVEVNX1ZBUklBQkxFX1JFRkVSRU5DRSA9ICJ0b3dlciIKCiAgICB2YWx1ZV9pZHMgPSBmaWVsZHMuT25lMm1hbnkoCiAgICAgICAgc3RyaW5nPSJWYWx1ZXMiLAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIudmFyaWFibGUudmFsdWUiLAogICAgICAgIGludmVyc2VfbmFtZT0idmFyaWFibGVfaWQiLAogICAgKQogICAgdmFsdWVfaWRzX2NvdW50ID0gZmllbGRzLkludGVnZXIoCiAgICAgICAgc3RyaW5nPSJWYWx1ZSBDb3VudCIsIGNvbXB1dGU9Il9jb21wdXRlX3ZhcmlhYmxlX2NvdW50ZXJzIgogICAgKQogICAgb3B0aW9uX2lkcyA9IGZpZWxkcy5PbmUybWFueSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLnZhcmlhYmxlLm9wdGlvbiIsCiAgICAgICAgaW52ZXJzZV9uYW1lPSJ2YXJpYWJsZV9pZCIsCiAgICAgICAgc3RyaW5nPSJPcHRpb25zIiwKICAgICAgICBhdXRvX2pvaW49VHJ1ZSwKICAgICkKICAgIHZhcmlhYmxlX3R5cGUgPSBmaWVsZHMuU2VsZWN0aW9uKAogICAgICAgIHNlbGVjdGlvbj1bKCJzIiwgIlN0cmluZyIpLCAoIm8iLCAiT3B0aW9ucyIpXSwKICAgICAgICBkZWZhdWx0PSJzIiwKICAgICAgICByZXF1aXJlZD1UcnVlLAogICAgICAgIHN0cmluZz0iVHlwZSIsCiAgICApCiAgICBhcHBsaWVkX2V4cHJlc3Npb24gPSBmaWVsZHMuVGV4dCgKICAgICAgICBoZWxwPSJQeXRob24gZXhwcmVzc2lvbiB0byBhcHBseSB0byB0aGUgdmFyaWFibGUgdmFsdWUuIFxuIgogICAgICAgICJZb3UgY2FuIHVzZSBnZW5lcmFsIHB5dGhvbiBzdGluZyBmdW5jdGlvbnMgYW5kICdyZScgbW9kdWxlICIKICAgICAgICAiZm9yIHJlZ2V4IG9wZXJhdGlvbnMuICIKICAgICAgICAiVXNlICd2YWx1ZScgdmFyaWFibGUgdG8gcmVmZXIgdG8gdGhlIHZhcmlhYmxlIHZhbHVlLCB1c2UgJ3Jlc3VsdCciCiAgICAgICAgIiB0byBhc3NpZ24gdGhlIGZpbmFsIHJlc3VsdCB0aGF0IHdpbGwgYmUgdXNlZCBhcyBhIHZhcmlhYmxlIHZhbHVlLlxuIgogICAgICAgICJFZyAncmVzdWx0ID0gdmFsdWUubG93ZXIoKS5yZXBsYWNlKCcgJywgJ18nKSciLAogICAgKQogICAgdmFsaWRhdGlvbl9wYXR0ZXJuID0gZmllbGRzLkNoYXIoCiAgICAgICAgaGVscD0iUmVnZXggcGF0dGVybiB0byB2YWxpZGF0ZSB0aGUgdmFyaWFibGUgdmFsdWVzIHVzaW5nIHRoZSAiCiAgICAgICAgIidyZS5tYXRjaCcgZnVuY3Rpb24uIEVnLiBeW2EtejAtOV0rJCBcbiIKICAgICAgICAiSWYgZW1wdHksIHRoZSB2YXJpYWJsZSB2YWx1ZXMgd2lsbCBub3QgYmUgdmFsaWRhdGVkLiIsCiAgICApCiAgICB2YWxpZGF0aW9uX21lc3NhZ2UgPSBmaWVsZHMuQ2hhcigKICAgICAgICB0cmFuc2xhdGU9VHJ1ZSwKICAgICAgICBoZWxwPSJNZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB0aGUgdmFyaWFibGUgdmFsdWUgaXMgaW52YWxpZC4gXG4iCiAgICAgICAgIkZpcnN0IGxpbmUgd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5OiAiCiAgICAgICAgImBWYXJpYWJsZTo8dmFyaWFibGVfbmFtZT4sIFZhbHVlOiA8dmFsdWU+YFxuIgogICAgICAgICJFZzogYFZhcmlhYmxlOiBDdXN0b21lciBOYW1lLCBWYWx1ZTogVGVzdFxuSW52YWxpZCB2YWx1ZSFgXG4iCiAgICAgICAgIklmIGVtcHR5LCB0aGUgZGVmYXVsdCBtZXNzYWdlIHdpbGwgYmUgdXNlZC4iLAogICAgKQogICAgbm90ZSA9IGZpZWxkcy5UZXh0KAogICAgICAgIGhlbHA9IkFkZGl0aW9uYWwgbm90ZXMgYWJvdXQgdGhlIHZhcmlhYmxlLiBcbiIKICAgICAgICAiVGhpcyBmaWVsZCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgdmFyaWFibGUgZm9ybS4iLAogICAgKQoKICAgICMgLS0tIExpbmsgdG8gcmVjb3JkcyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgdXNlZAogICAgY29tbWFuZF9pZHMgPSBmaWVsZHMuTWFueTJtYW55KAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIuY29tbWFuZCIsCiAgICAgICAgcmVsYXRpb249ImN4X3Rvd2VyX2NvbW1hbmRfdmFyaWFibGVfcmVsIiwKICAgICAgICBjb2x1bW4xPSJ2YXJpYWJsZV9pZCIsCiAgICAgICAgY29sdW1uMj0iY29tbWFuZF9pZCIsCiAgICAgICAgY29weT1GYWxzZSwKICAgICkKICAgIGNvbW1hbmRfaWRzX2NvdW50ID0gZmllbGRzLkludGVnZXIoCiAgICAgICAgc3RyaW5nPSJDb21tYW5kIENvdW50IiwgY29tcHV0ZT0iX2NvbXB1dGVfdmFyaWFibGVfY291bnRlcnMiCiAgICApCiAgICBwbGFuX2xpbmVfaWRzID0gZmllbGRzLk1hbnkybWFueSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLnBsYW4ubGluZSIsCiAgICAgICAgcmVsYXRpb249ImN4X3Rvd2VyX3BsYW5fbGluZV92YXJpYWJsZV9yZWwiLAogICAgICAgIGNvbHVtbjE9InZhcmlhYmxlX2lkIiwKICAgICAgICBjb2x1bW4yPSJwbGFuX2xpbmVfaWQiLAogICAgICAgIGNvcHk9RmFsc2UsCiAgICApCiAgICBwbGFuX2xpbmVfaWRzX2NvdW50ID0gZmllbGRzLkludGVnZXIoCiAgICAgICAgc3RyaW5nPSJQbGFuIExpbmUgQ291bnQiLCBjb21wdXRlPSJfY29tcHV0ZV92YXJpYWJsZV9jb3VudGVycyIKICAgICkKICAgIGZpbGVfaWRzID0gZmllbGRzLk1hbnkybWFueSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLmZpbGUiLAogICAgICAgIHJlbGF0aW9uPSJjeF90b3dlcl9maWxlX3ZhcmlhYmxlX3JlbCIsCiAgICAgICAgY29sdW1uMT0idmFyaWFibGVfaWQiLAogICAgICAgIGNvbHVtbjI9ImZpbGVfaWQiLAogICAgICAgIGNvcHk9RmFsc2UsCiAgICApCiAgICBmaWxlX2lkc19jb3VudCA9IGZpZWxkcy5JbnRlZ2VyKAogICAgICAgIHN0cmluZz0iRmlsZSBDb3VudCIsIGNvbXB1dGU9Il9jb21wdXRlX3ZhcmlhYmxlX2NvdW50ZXJzIgogICAgKQogICAgZmlsZV90ZW1wbGF0ZV9pZHMgPSBmaWVsZHMuTWFueTJtYW55KAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIuZmlsZS50ZW1wbGF0ZSIsCiAgICAgICAgcmVsYXRpb249ImN4X3Rvd2VyX2ZpbGVfdGVtcGxhdGVfdmFyaWFibGVfcmVsIiwKICAgICAgICBjb2x1bW4xPSJ2YXJpYWJsZV9pZCIsCiAgICAgICAgY29sdW1uMj0iZmlsZV90ZW1wbGF0ZV9pZCIsCiAgICAgICAgY29weT1GYWxzZSwKICAgICkKICAgIGZpbGVfdGVtcGxhdGVfaWRzX2NvdW50ID0gZmllbGRzLkludGVnZXIoCiAgICAgICAgc3RyaW5nPSJGaWxlIFRlbXBsYXRlIENvdW50IiwgY29tcHV0ZT0iX2NvbXB1dGVfdmFyaWFibGVfY291bnRlcnMiCiAgICApCiAgICB2YXJpYWJsZV92YWx1ZV9pZHMgPSBmaWVsZHMuTWFueTJtYW55KAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIudmFyaWFibGUudmFsdWUiLAogICAgICAgIHJlbGF0aW9uPSJjeF90b3dlcl92YXJpYWJsZV92YWx1ZV92YXJpYWJsZV9yZWwiLAogICAgICAgIGNvbHVtbjE9InZhcmlhYmxlX2lkIiwKICAgICAgICBjb2x1bW4yPSJ2YXJpYWJsZV92YWx1ZV9pZCIsCiAgICAgICAgY29weT1GYWxzZSwKICAgICkKICAgIHZhcmlhYmxlX3ZhbHVlX2lkc19jb3VudCA9IGZpZWxkcy5JbnRlZ2VyKAogICAgICAgIHN0cmluZz0iVmFyaWFibGUgVmFsdWUgQ291bnQiLCBjb21wdXRlPSJfY29tcHV0ZV92YXJpYWJsZV9jb3VudGVycyIKICAgICkKCiAgICBfc3FsX2NvbnN0cmFpbnRzID0gWygibmFtZV91bmlxIiwgInVuaXF1ZSAobmFtZSkiLCAiVmFyaWFibGUgbmFtZXMgbXVzdCBiZSB1bmlxdWUiKV0KCiAgICBkZWYgX2NvbXB1dGVfdmFyaWFibGVfY291bnRlcnMoc2VsZik6CiAgICAgICAgIiIiQ291bnQgbnVtYmVyIG9mIHZhcmlhYmxlIHZhbHVlcyBmb3IgdGhlIHZhcmlhYmxlIiIiCiAgICAgICAgZm9yIHJlYyBpbiBzZWxmOgogICAgICAgICAgICByZWMudXBkYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZV92YWx1ZV9pZHNfY291bnQiOiBsZW4ocmVjLnZhcmlhYmxlX3ZhbHVlX2lkcyksCiAgICAgICAgICAgICAgICAgICAgImNvbW1hbmRfaWRzX2NvdW50IjogbGVuKHJlYy5jb21tYW5kX2lkcyksCiAgICAgICAgICAgICAgICAgICAgInBsYW5fbGluZV9pZHNfY291bnQiOiBsZW4ocmVjLnBsYW5fbGluZV9pZHMpLAogICAgICAgICAgICAgICAgICAgICJmaWxlX2lkc19jb3VudCI6IGxlbihyZWMuZmlsZV9pZHMpLAogICAgICAgICAgICAgICAgICAgICJmaWxlX3RlbXBsYXRlX2lkc19jb3VudCI6IGxlbihyZWMuZmlsZV90ZW1wbGF0ZV9pZHMpLAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZV9pZHNfY291bnQiOiBsZW4ocmVjLnZhbHVlX2lkcyksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKCiAgICBkZWYgYWN0aW9uX29wZW5fdmFsdWVzKHNlbGYpOgogICAgICAgICIiIk9wZW4gdGhlIHZhcmlhYmxlIHZhbHVlcyIiIgogICAgICAgIHNlbGYuZW5zdXJlX29uZSgpCiAgICAgICAgY29udGV4dCA9IHNlbGYuZW52LmNvbnRleHQuY29weSgpCiAgICAgICAgY29udGV4dC51cGRhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJkZWZhdWx0X3ZhcmlhYmxlX2lkIjogc2VsZi5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInR5cGUiOiAiaXIuYWN0aW9ucy5hY3Rfd2luZG93IiwKICAgICAgICAgICAgIm5hbWUiOiBfKCJWYXJpYWJsZSBWYWx1ZXMiKSwKICAgICAgICAgICAgInJlc19tb2RlbCI6ICJjeC50b3dlci52YXJpYWJsZS52YWx1ZSIsCiAgICAgICAgICAgICJ2aWV3cyI6IFtbRmFsc2UsICJ0cmVlIl1dLAogICAgICAgICAgICAidGFyZ2V0IjogImN1cnJlbnQiLAogICAgICAgICAgICAiY29udGV4dCI6IGNvbnRleHQsCiAgICAgICAgICAgICJkb21haW4iOiBbKCJ2YXJpYWJsZV9pZCIsICI9Iiwgc2VsZi5pZCldLAogICAgICAgIH0KCiAgICBkZWYgYWN0aW9uX29wZW5fY29tbWFuZHMoc2VsZik6CiAgICAgICAgIiIiT3BlbiB0aGUgY29tbWFuZHMgd2hlcmUgdGhlIHZhcmlhYmxlIGlzIHVzZWQiIiIKCiAgICAgICAgc2VsZi5lbnN1cmVfb25lKCkKICAgICAgICBhY3Rpb24gPSBzZWxmLmVudlsiaXIuYWN0aW9ucy5hY3Rfd2luZG93Il0uX2Zvcl94bWxfaWQoCiAgICAgICAgICAgICJjZXRtaXhfdG93ZXJfc2VydmVyLmFjdGlvbl9jeF90b3dlcl9jb21tYW5kIgogICAgICAgICkKICAgICAgICBhY3Rpb24udXBkYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiZG9tYWluIjogWygidmFyaWFibGVfaWRzIiwgImluIiwgc2VsZi5pZHMpXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICByZXR1cm4gYWN0aW9uCgogICAgZGVmIGFjdGlvbl9vcGVuX3BsYW5fbGluZXMoc2VsZik6CiAgICAgICAgIiIiT3BlbiB0aGUgcGxhbiBsaW5lcyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgdXNlZCIiIgogICAgICAgIHNlbGYuZW5zdXJlX29uZSgpCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInR5cGUiOiAiaXIuYWN0aW9ucy5hY3Rfd2luZG93IiwKICAgICAgICAgICAgIm5hbWUiOiBfKCJQbGFuIExpbmVzIiksCiAgICAgICAgICAgICJyZXNfbW9kZWwiOiAiY3gudG93ZXIucGxhbi5saW5lIiwKICAgICAgICAgICAgInZpZXdzIjogWwogICAgICAgICAgICAgICAgW0ZhbHNlLCAidHJlZSJdLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHNlbGYuZW52LnJlZigiY2V0bWl4X3Rvd2VyX3NlcnZlci5jeF90b3dlcl9wbGFuX2xpbmVfdmlld19mb3JtIikuaWQsCiAgICAgICAgICAgICAgICAgICAgImZvcm0iLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInRhcmdldCI6ICJjdXJyZW50IiwKICAgICAgICAgICAgImRvbWFpbiI6IFsoInZhcmlhYmxlX2lkcyIsICJpbiIsIHNlbGYuaWRzKV0sCiAgICAgICAgfQoKICAgIGRlZiBhY3Rpb25fb3Blbl9maWxlcyhzZWxmKToKICAgICAgICAiIiJPcGVuIHRoZSBmaWxlcyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgdXNlZCIiIgogICAgICAgIHNlbGYuZW5zdXJlX29uZSgpCiAgICAgICAgYWN0aW9uID0gc2VsZi5lbnZbImlyLmFjdGlvbnMuYWN0X3dpbmRvdyJdLl9mb3JfeG1sX2lkKAogICAgICAgICAgICAiY2V0bWl4X3Rvd2VyX3NlcnZlci5jeF90b3dlcl9maWxlX2FjdGlvbiIKICAgICAgICApCiAgICAgICAgYWN0aW9uLnVwZGF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImRvbWFpbiI6IFsoInZhcmlhYmxlX2lkcyIsICJpbiIsIHNlbGYuaWRzKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcmV0dXJuIGFjdGlvbgoKICAgIGRlZiBhY3Rpb25fb3Blbl9maWxlX3RlbXBsYXRlcyhzZWxmKToKICAgICAgICAiIiJPcGVuIHRoZSBmaWxlIHRlbXBsYXRlcyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgdXNlZCIiIgogICAgICAgIHNlbGYuZW5zdXJlX29uZSgpCiAgICAgICAgYWN0aW9uID0gc2VsZi5lbnZbImlyLmFjdGlvbnMuYWN0X3dpbmRvdyJdLl9mb3JfeG1sX2lkKAogICAgICAgICAgICAiY2V0bWl4X3Rvd2VyX3NlcnZlci5jeF90b3dlcl9maWxlX3RlbXBsYXRlX2FjdGlvbiIKICAgICAgICApCiAgICAgICAgYWN0aW9uLnVwZGF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImRvbWFpbiI6IFsoInZhcmlhYmxlX2lkcyIsICJpbiIsIHNlbGYuaWRzKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcmV0dXJuIGFjdGlvbgoKICAgIGRlZiBhY3Rpb25fb3Blbl92YXJpYWJsZV92YWx1ZXMoc2VsZik6CiAgICAgICAgIiIiT3BlbiB0aGUgdmFyaWFibGUgdmFsdWVzIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyB1c2VkIiIiCiAgICAgICAgc2VsZi5lbnN1cmVfb25lKCkKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAidHlwZSI6ICJpci5hY3Rpb25zLmFjdF93aW5kb3ciLAogICAgICAgICAgICAibmFtZSI6IF8oIlZhcmlhYmxlIFZhbHVlcyIpLAogICAgICAgICAgICAicmVzX21vZGVsIjogImN4LnRvd2VyLnZhcmlhYmxlLnZhbHVlIiwKICAgICAgICAgICAgInZpZXdzIjogW1tGYWxzZSwgInRyZWUiXV0sCiAgICAgICAgICAgICJ0YXJnZXQiOiAiY3VycmVudCIsCiAgICAgICAgICAgICJkb21haW4iOiBbKCJ2YXJpYWJsZV9pZHMiLCAiaW4iLCBzZWxmLmlkcyldLAogICAgICAgIH0KCiAgICBAYXBpLm1vZGVsCiAgICBkZWYgX2dldF9ldmFsX2NvbnRleHQoc2VsZiwgdmFsdWVfY2hhcj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBFdmFsdWF0aW9uIGNvbnRleHQgdG8gcGFzcyB0byBzYWZlX2V2YWwgdG8gZXZhbHVhdGUKICAgICAgICB0aGUgUHl0aG9uIGV4cHJlc3Npb24gdXNlZCBpbiB0aGUgYGFwcGxpZWRfZXhwcmVzc2lvbmAgZmllbGQKCiAgICAgICAgQXJnczoKICAgICAgICAgICAgdmFsdWVfY2hhciAoQ2hhcik6IHZhcmlhYmxlIHZhbHVlCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGRpY3Q6IGV2YWx1YXRpb24gY29udGV4dAogICAgICAgICIiIgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJyZSI6IHJlLAogICAgICAgICAgICAidmFsdWUiOiB2YWx1ZV9jaGFyLAogICAgICAgIH0KCiAgICAjICBSZWZlcmVuY2UgcmVuYW1lIHByb3BhZ2F0aW9uCgogICAgZGVmIHdyaXRlKHNlbGYsIHZhbHMpOgogICAgICAgICIiIk92ZXJyaWRlIHRoZSB3cml0ZSBtZXRob2QgdG8gcHJvcGFnYXRlIHZhcmlhYmxlIHJlZmVyZW5jZSB1cGRhdGVzLgoKICAgICAgICBSZWNvcmRzIHRoZSBvbGQgcmVmZXJlbmNlIHZhbHVlcywgcGVyZm9ybXMgdGhlIHdyaXRlLCBhbmQgaWYgdGhlIHJlZmVyZW5jZQogICAgICAgIGZpZWxkIGhhcyBjaGFuZ2VkLCBpbml0aWF0ZXMgcHJvcGFnYXRpb24gdG8gdXBkYXRlIHJlbGF0ZWQgcmVjb3Jkcy4KICAgICAgICAiIiIKICAgICAgICBvbGRfcmVmcyA9ICgKICAgICAgICAgICAge3JlYy5pZDogcmVjLnJlZmVyZW5jZSBmb3IgcmVjIGluIHNlbGZ9IGlmICJyZWZlcmVuY2UiIGluIHZhbHMgZWxzZSB7fQogICAgICAgICkKICAgICAgICByZXMgPSBzdXBlcigpLndyaXRlKHZhbHMpCiAgICAgICAgaWYgInJlZmVyZW5jZSIgaW4gdmFsczoKICAgICAgICAgICAgZm9yIHJlYyBpbiBzZWxmOgogICAgICAgICAgICAgICAgb2xkX3JlZiA9IG9sZF9yZWZzLmdldChyZWMuaWQpCiAgICAgICAgICAgICAgICBpZiBvbGRfcmVmIGFuZCBvbGRfcmVmICE9IHJlYy5yZWZlcmVuY2U6CiAgICAgICAgICAgICAgICAgICAgcmVjLl9wcm9wYWdhdGVfcmVmZXJlbmNlX2NoYW5nZShvbGRfcmVmLCByZWMucmVmZXJlbmNlKQogICAgICAgIHJldHVybiByZXMKCiAgICBkZWYgX3Byb3BhZ2F0ZV9yZWZlcmVuY2VfY2hhbmdlKHNlbGYsIG9sZF9yZWYsIG5ld19yZWYpOgogICAgICAgICIiIlJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIGFuIG9sZCB2YXJpYWJsZSByZWZlcmVuY2Ugd2l0aCBhIG5ldyBvbmUuCgogICAgICAgIENvbXBpbGVzIGEgcGF0dGVybiBtYXRjaGluZyB0aGUgb2xkIEppbmphLXN0eWxlIHJlZmVyZW5jZSwgdGhlbiBzZWFyY2hlcyBhY3Jvc3MKICAgICAgICBjb25maWd1cmVkIG1vZGVscyBhbmQgZmllbGRzIHRvIHN1YnN0aXR1dGUgYW55IG1hdGNoZXMsIHByZXNlcnZpbmcgZm9ybWF0dGluZy4KICAgICAgICAiIiIKICAgICAgICBwYXR0ZXJuID0gcmUuY29tcGlsZShyIihce1x7XHMqKSIgKyByZS5lc2NhcGUob2xkX3JlZikgKyByIihccypcfVx9KSIpCgogICAgICAgIGRlZiBfcmVwbGFjZSh0ZXh0KToKICAgICAgICAgICAgIiIiSGVscGVyIHRvIHJlcGxhY2Ugb2xkX3JlZiB3aXRoIG5ld19yZWYgaW4gdGhlIGdpdmVuIHRleHQuIiIiCiAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuLnN1YihsYW1iZGEgbTogZiJ7bS5ncm91cCgxKX17bmV3X3JlZn17bS5ncm91cCgyKX0iLCB0ZXh0KQoKICAgICAgICBtb2RlbF9maWVsZHNfbWFwID0gc2VsZi5fZ2V0X3Byb3BhZ2F0aW9uX2ZpZWxkX21hcHBpbmcoKQoKICAgICAgICBmb3IgbW9kZWxfbmFtZSwgZmllbGRfbmFtZXMgaW4gbW9kZWxfZmllbGRzX21hcC5pdGVtcygpOgogICAgICAgICAgICBNb2RlbCA9IHNlbGYuZW52W21vZGVsX25hbWVdCgogICAgICAgICAgICBpZiBtb2RlbF9uYW1lID09ICJjeC50b3dlci52YXJpYWJsZS52YWx1ZSI6CiAgICAgICAgICAgICAgICBkb21haW4gPSBbKCJ2YXJpYWJsZV9pZCIsICI9Iiwgc2VsZi5pZCldCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkb21haW4gPSBbKCJ2YXJpYWJsZV9pZHMiLCAiaW4iLCBzZWxmLmlkcyldCgogICAgICAgICAgICBmb3IgcmVjb3JkIGluIE1vZGVsLnNlYXJjaChkb21haW4pOgogICAgICAgICAgICAgICAgdmFscyA9IHt9CiAgICAgICAgICAgICAgICBmb3IgZmllbGRfbmFtZSBpbiBmaWVsZF9uYW1lczoKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlY29yZFtmaWVsZF9uYW1lXQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cikgYW5kIG9sZF9yZWYgaW4gdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZSA9IF9yZXBsYWNlKHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBuZXdfdmFsdWUgIT0gdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxzW2ZpZWxkX25hbWVdID0gbmV3X3ZhbHVlCgogICAgICAgICAgICAgICAgaWYgdmFsczoKICAgICAgICAgICAgICAgICAgICByZWNvcmQud2l0aF9jb250ZXh0KHNraXBfcmVmZXJlbmNlX3Byb3BhZ2F0aW9uPVRydWUpLndyaXRlKHZhbHMpCiAgICAgICAgICAgICAgICAgICAgX2xvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAgICAgIlZhcmlhYmxlIHJlZmVyZW5jZSB1cGRhdGVkIGluICVzKCVzKTogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICIsICIuam9pbih2YWxzLmtleXMoKSksCiAgICAgICAgICAgICAgICAgICAgKQoKICAgIGRlZiBfZ2V0X3Byb3BhZ2F0aW9uX2ZpZWxkX21hcHBpbmcoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBtYXBwaW5nIG9mIG1vZGVscyB0byBmaWVsZHMgZm9yIHJlZmVyZW5jZSBjaGFuZ2UgcHJvcGFnYXRpb24uCgogICAgICAgIFRoZSByZXR1cm5lZCBkaWN0IG1hcHMgZWFjaCBtb2RlbCBuYW1lIHRvIGEgbGlzdCBvZiBmaWVsZCBuYW1lcwogICAgICAgIHRoYXQgbWF5IGNvbnRhaW4gdmFyaWFibGUgcmVmZXJlbmNlcyByZXF1aXJpbmcgdXBkYXRlcy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAiY3gudG93ZXIuY29tbWFuZCI6IFsiY29kZSIsICJwYXRoIl0sCiAgICAgICAgICAgICJjeC50b3dlci5maWxlIjogWyJjb2RlIiwgInNlcnZlcl9kaXIiLCAibmFtZSJdLAogICAgICAgICAgICAiY3gudG93ZXIuZmlsZS50ZW1wbGF0ZSI6IFsiY29kZSIsICJzZXJ2ZXJfZGlyIiwgImZpbGVfbmFtZSJdLAogICAgICAgICAgICAiY3gudG93ZXIudmFyaWFibGUudmFsdWUiOiBbInZhbHVlX2NoYXIiXSwKICAgICAgICAgICAgImN4LnRvd2VyLnBsYW4ubGluZSI6IFsiY29uZGl0aW9uIl0sCiAgICAgICAgfQoKICAgIGRlZiBfZ2V0X2RlcGVuZGVudF9tb2RlbF9yZWxhdGlvbl9maWVsZHMoc2VsZik6CiAgICAgICAgIiIiQ2hlY2sgY3gudG93ZXIucmVmZXJlbmNlLm1peGluIGZvciB0aGUgZnVuY3Rpb24gZG9jdW1lbnRhdGlvbiIiIgogICAgICAgIHJlcyA9IHN1cGVyKCkuX2dldF9kZXBlbmRlbnRfbW9kZWxfcmVsYXRpb25fZmllbGRzKCkKICAgICAgICByZXR1cm4gcmVzICsgWyJ2YWx1ZV9pZHMiXQoKICAgIGRlZiBfdmFsaWRhdGVfdmFsdWUoc2VsZiwgdmFsdWVfY2hhcj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBWYWxpZGF0ZSB0aGUgdmFyaWFibGUgdmFsdWUKCiAgICAgICAgQXJnczoKICAgICAgICAgICAgdmFsdWVfY2hhciAoQ2hhcik6IHZhcmlhYmxlIHZhbHVlCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIChCb29sZWFuLCBDaGFyKTogKGlzX3ZhbGlkLCB2YWxpZGF0aW9uX21lc3NhZ2UpCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnN1cmVfb25lKCkKICAgICAgICBpZiAoCiAgICAgICAgICAgIG5vdCBzZWxmLnZhbGlkYXRpb25fcGF0dGVybgogICAgICAgICAgICBvciBub3QgdmFsdWVfY2hhcgogICAgICAgICAgICBvciByZS5tYXRjaChzZWxmLnZhbGlkYXRpb25fcGF0dGVybiwgdmFsdWVfY2hhcikgICMgcHlsaW50OiBkaXNhYmxlPW5vLW1lbWJlcgogICAgICAgICk6CiAgICAgICAgICAgIHJldHVybiBUcnVlLCBOb25lCiAgICAgICAgbWVzc2FnZSA9IHNlbGYudmFsaWRhdGlvbl9tZXNzYWdlIG9yIHNlbGYuREVGQVVMVF9WQUxJREFUSU9OX01FU1NBR0UKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBGYWxzZSwKICAgICAgICAgICAgXygKICAgICAgICAgICAgICAgICJWYXJpYWJsZTogJSh2YXIpcywgVmFsdWU6ICUodmFsKXNcbiUobXNnKXMiLAogICAgICAgICAgICAgICAgbXNnPW1lc3NhZ2UsCiAgICAgICAgICAgICAgICB2YXI9c2VsZi5uYW1lLCAgIyBweWxpbnQ6IGRpc2FibGU9bm8tbWVtYmVyCiAgICAgICAgICAgICAgICB2YWw9dmFsdWVfY2hhciwKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgLS0tLSBNYW5hZ2luZyB2YXJpYWJsZSB2YWx1ZXMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBkZWYgX2dldF92YWx1ZSgKICAgICAgICBzZWxmLAogICAgICAgIHNlcnZlcj1Ob25lLAogICAgICAgIHNlcnZlcl90ZW1wbGF0ZT1Ob25lLAogICAgICAgIHBsYW5fbGluZV9hY3Rpb249Tm9uZSwKICAgICAgICBqZXRfdGVtcGxhdGU9Tm9uZSwKICAgICAgICBqZXQ9Tm9uZSwKICAgICk6CiAgICAgICAgIiIiR2V0IHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUuCgogICAgICAgIDAuIE5vIGFyZ3VtZW50czogcmV0dXJuIHRoZSBnbG9iYWwgdmFsdWUuCiAgICAgICAgMS4gU2VydmVyIFRlbXBsYXRlOiByZXR1cm4gdGhlIFNlcnZlciBUZW1wbGF0ZSBzcGVjaWZpYyB2YWx1ZQogICAgICAgICAgICBvciB0aGUgZ2xvYmFsIHZhbHVlLgogICAgICAgIDIuIFNlcnZlcjogcmV0dXJuIHRoZSBTZXJ2ZXIgc3BlY2lmaWMgdmFsdWUgb3IgdGhlIGdsb2JhbCB2YWx1ZS4KICAgICAgICAzLiBKZXQgVGVtcGxhdGU6IHJldHVybiB0aGUgSmV0IFRlbXBsYXRlIHNwZWNpZmljIHZhbHVlCiAgICAgICAgICAgIG9yIHRoZSBTZXJ2ZXIgdmFsdWUKICAgICAgICAgICAgb3IgdGhlIGdsb2JhbCB2YWx1ZS4KICAgICAgICA0LiBKZXQ6IHJldHVybiB0aGUgSmV0IHNwZWNpZmljIHZhbHVlCiAgICAgICAgICAgIG9yIHRoZSBKZXQgVGVtcGxhdGUgdmFsdWUKICAgICAgICAgICAgb3IgdGhlIFNlcnZlciB2YWx1ZQogICAgICAgICAgICBvciB0aGUgZ2xvYmFsIHZhbHVlLgogICAgICAgIDUuIFBsYW4gTGluZSBBY3Rpb246IHJldHVybiB0aGUgUGxhbiBMaW5lIEFjdGlvbiBzcGVjaWZpYyB2YWx1ZS4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgc2VydmVyIChjeC50b3dlci5zZXJ2ZXIpOiBTZXJ2ZXIKICAgICAgICAgICAgc2VydmVyX3RlbXBsYXRlIChjeC50b3dlci5zZXJ2ZXIudGVtcGxhdGUpOiBTZXJ2ZXIgVGVtcGxhdGUKICAgICAgICAgICAgcGxhbl9saW5lX2FjdGlvbiAoY3gudG93ZXIucGxhbi5saW5lLmFjdGlvbik6IFBsYW4gTGluZSBBY3Rpb24KICAgICAgICAgICAgamV0X3RlbXBsYXRlIChjeC50b3dlci5qZXQudGVtcGxhdGUpOiBKZXQgVGVtcGxhdGUKICAgICAgICAgICAgamV0IChjeC50b3dlci5qZXQpOiBKZXQKCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQ2hhcjogVGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBvciBOb25lIGlmIG5vIHZhbHVlIGlzIGZvdW5kLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZW5zdXJlX29uZSgpCiAgICAgICAgdmFsdWVzID0gc2VsZi52YWx1ZV9pZHMKCiAgICAgICAgIyAwLiBTZXQgc2VydmVyIGFuZCBqZXQgdGVtcGxhdGUgZnJvbSBqZXQKICAgICAgICAjIGlmIGpldCBpcyBwcm92aWRlZAogICAgICAgIGlmIGpldDoKICAgICAgICAgICAgc2VydmVyID0gamV0LnNlcnZlcl9pZAogICAgICAgICAgICBqZXRfdGVtcGxhdGUgPSBqZXQuamV0X3RlbXBsYXRlX2lkCgogICAgICAgICMgMS4gUHJlcGFyZSB0aGUgdmFsdWVzCgogICAgICAgICMgSW5pdGlhbGl6ZSBhbGwgdmFsdWVzIHRvIE5vbmUKICAgICAgICBnbG9iYWxfdmFsdWVfY2hhciA9ICgKICAgICAgICAgICAgc2VydmVyX3ZhbHVlX2NoYXIKICAgICAgICApID0gKAogICAgICAgICAgICBzZXJ2ZXJfdGVtcGxhdGVfdmFsdWVfY2hhcgogICAgICAgICkgPSAoCiAgICAgICAgICAgIHBsYW5fbGluZV9hY3Rpb25fdmFsdWVfY2hhcgogICAgICAgICkgPSBqZXRfdGVtcGxhdGVfdmFsdWVfY2hhciA9IGpldF92YWx1ZV9jaGFyID0gTm9uZQoKICAgICAgICAjIEdldCBvcmlnaW4gaWQncyBpbiBjYXNlIHdlIGFyZSBkZWFsaW5nIHdpdGggb25jaGFuZ2UoKQogICAgICAgIHNlcnZlcl9pZCA9ICgKICAgICAgICAgICAgc2VydmVyLl9vcmlnaW4uaWQKICAgICAgICAgICAgaWYgc2VydmVyIGFuZCBoYXNhdHRyKHNlcnZlciwgIl9vcmlnaW4iKQogICAgICAgICAgICBlbHNlIHNlcnZlci5pZAogICAgICAgICAgICBpZiBzZXJ2ZXIKICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgKQogICAgICAgIHNlcnZlcl90ZW1wbGF0ZV9pZCA9ICgKICAgICAgICAgICAgc2VydmVyX3RlbXBsYXRlLl9vcmlnaW4uaWQKICAgICAgICAgICAgaWYgc2VydmVyX3RlbXBsYXRlIGFuZCBoYXNhdHRyKHNlcnZlcl90ZW1wbGF0ZSwgIl9vcmlnaW4iKQogICAgICAgICAgICBlbHNlIHNlcnZlcl90ZW1wbGF0ZS5pZAogICAgICAgICAgICBpZiBzZXJ2ZXJfdGVtcGxhdGUKICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgKQogICAgICAgIHBsYW5fbGluZV9hY3Rpb25faWQgPSAoCiAgICAgICAgICAgIHBsYW5fbGluZV9hY3Rpb24uX29yaWdpbi5pZAogICAgICAgICAgICBpZiBwbGFuX2xpbmVfYWN0aW9uIGFuZCBoYXNhdHRyKHBsYW5fbGluZV9hY3Rpb24sICJfb3JpZ2luIikKICAgICAgICAgICAgZWxzZSBwbGFuX2xpbmVfYWN0aW9uLmlkCiAgICAgICAgICAgIGlmIHBsYW5fbGluZV9hY3Rpb24KICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgKQogICAgICAgIGpldF90ZW1wbGF0ZV9pZCA9ICgKICAgICAgICAgICAgamV0X3RlbXBsYXRlLl9vcmlnaW4uaWQKICAgICAgICAgICAgaWYgamV0X3RlbXBsYXRlIGFuZCBoYXNhdHRyKGpldF90ZW1wbGF0ZSwgIl9vcmlnaW4iKQogICAgICAgICAgICBlbHNlIGpldF90ZW1wbGF0ZS5pZAogICAgICAgICAgICBpZiBqZXRfdGVtcGxhdGUKICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgKQogICAgICAgIGpldF9pZCA9ICgKICAgICAgICAgICAgamV0Ll9vcmlnaW4uaWQKICAgICAgICAgICAgaWYgamV0IGFuZCBoYXNhdHRyKGpldCwgIl9vcmlnaW4iKQogICAgICAgICAgICBlbHNlIGpldC5pZAogICAgICAgICAgICBpZiBqZXQKICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgKQoKICAgICAgICAjIENoZWNrIGFsbCB2YWx1ZXMgZm9yIHRoZSB2YXJpYWJsZSBhbmQgYXNzaWduIHRoZW0uCiAgICAgICAgIyBOb3RlOiB3ZSBhcmUgbm90IHVzaW5nIGZpbHRlcmVkKCkgdG8gYXZvaWQgbXVsdGlwbGUgaXRlcmF0aW9ucwogICAgICAgICMgb24gdGhlIHNhbWUgcmVjb3Jkc2V0LgogICAgICAgIGZvciB2YXJpYWJsZV92YWx1ZSBpbiB2YWx1ZXM6CiAgICAgICAgICAgICMgRmV0Y2ggdGhlIHNlcnZlciB2YWx1ZQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBzZXJ2ZXIKICAgICAgICAgICAgICAgIGFuZCBzZXJ2ZXJfdmFsdWVfY2hhciBpcyBOb25lCiAgICAgICAgICAgICAgICBhbmQgdmFyaWFibGVfdmFsdWUuc2VydmVyX2lkLmlkID09IHNlcnZlcl9pZAogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgc2VydmVyX3ZhbHVlX2NoYXIgPSB2YXJpYWJsZV92YWx1ZS52YWx1ZV9jaGFyCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAjIEZldGNoIHRoZSBzZXJ2ZXIgdGVtcGxhdGUgdmFsdWUKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgc2VydmVyX3RlbXBsYXRlCiAgICAgICAgICAgICAgICBhbmQgc2VydmVyX3RlbXBsYXRlX3ZhbHVlX2NoYXIgaXMgTm9uZQogICAgICAgICAgICAgICAgYW5kIHZhcmlhYmxlX3ZhbHVlLnNlcnZlcl90ZW1wbGF0ZV9pZC5pZCA9PSBzZXJ2ZXJfdGVtcGxhdGVfaWQKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIHNlcnZlcl90ZW1wbGF0ZV92YWx1ZV9jaGFyID0gdmFyaWFibGVfdmFsdWUudmFsdWVfY2hhcgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIyBGZXRjaCB0aGUgcGxhbiBsaW5lIGFjdGlvbiB2YWx1ZQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBwbGFuX2xpbmVfYWN0aW9uCiAgICAgICAgICAgICAgICBhbmQgcGxhbl9saW5lX2FjdGlvbl92YWx1ZV9jaGFyIGlzIE5vbmUKICAgICAgICAgICAgICAgIGFuZCB2YXJpYWJsZV92YWx1ZS5wbGFuX2xpbmVfYWN0aW9uX2lkLmlkID09IHBsYW5fbGluZV9hY3Rpb25faWQKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIHBsYW5fbGluZV9hY3Rpb25fdmFsdWVfY2hhciA9IHZhcmlhYmxlX3ZhbHVlLnZhbHVlX2NoYXIKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICMgRmV0Y2ggdGhlIGpldCB0ZW1wbGF0ZSB2YWx1ZQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBqZXRfdGVtcGxhdGUKICAgICAgICAgICAgICAgIGFuZCBqZXRfdGVtcGxhdGVfdmFsdWVfY2hhciBpcyBOb25lCiAgICAgICAgICAgICAgICBhbmQgdmFyaWFibGVfdmFsdWUuamV0X3RlbXBsYXRlX2lkLmlkID09IGpldF90ZW1wbGF0ZV9pZAogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgamV0X3RlbXBsYXRlX3ZhbHVlX2NoYXIgPSB2YXJpYWJsZV92YWx1ZS52YWx1ZV9jaGFyCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAjIEZldGNoIHRoZSBqZXQgdmFsdWUKICAgICAgICAgICAgaWYgamV0IGFuZCBqZXRfdmFsdWVfY2hhciBpcyBOb25lIGFuZCB2YXJpYWJsZV92YWx1ZS5qZXRfaWQuaWQgPT0gamV0X2lkOgogICAgICAgICAgICAgICAgamV0X3ZhbHVlX2NoYXIgPSB2YXJpYWJsZV92YWx1ZS52YWx1ZV9jaGFyCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAjIEZldGNoIHRoZSBnbG9iYWwgdmFsdWUKICAgICAgICAgICAgaWYgZ2xvYmFsX3ZhbHVlX2NoYXIgaXMgTm9uZSBhbmQgdmFyaWFibGVfdmFsdWUuaXNfZ2xvYmFsOgogICAgICAgICAgICAgICAgZ2xvYmFsX3ZhbHVlX2NoYXIgPSB2YXJpYWJsZV92YWx1ZS52YWx1ZV9jaGFyCgogICAgICAgICMgMi4gQ29tcG9zZSB0aGUgcmVzcG9uc2UKICAgICAgICAjIDIuMS4gU2VydmVyIFRlbXBsYXRlCiAgICAgICAgaWYgc2VydmVyX3RlbXBsYXRlOgogICAgICAgICAgICByZXR1cm4gc2VydmVyX3RlbXBsYXRlX3ZhbHVlX2NoYXIgb3IgZ2xvYmFsX3ZhbHVlX2NoYXIKCiAgICAgICAgIyAyLjIuIEpldAogICAgICAgIGlmIGpldDoKICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIGpldF92YWx1ZV9jaGFyCiAgICAgICAgICAgICAgICBpZiBqZXRfdmFsdWVfY2hhciBpcyBub3QgTm9uZQogICAgICAgICAgICAgICAgZWxzZSBqZXRfdGVtcGxhdGVfdmFsdWVfY2hhcgogICAgICAgICAgICAgICAgaWYgamV0X3RlbXBsYXRlX3ZhbHVlX2NoYXIgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgIGVsc2Ugc2VydmVyX3ZhbHVlX2NoYXIKICAgICAgICAgICAgICAgIGlmIHNlcnZlcl92YWx1ZV9jaGFyIGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICBlbHNlIGdsb2JhbF92YWx1ZV9jaGFyCiAgICAgICAgICAgICkKCiAgICAgICAgIyAyLjMuIEpldCBUZW1wbGF0ZQogICAgICAgIGlmIGpldF90ZW1wbGF0ZToKICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIGpldF90ZW1wbGF0ZV92YWx1ZV9jaGFyCiAgICAgICAgICAgICAgICBpZiBqZXRfdGVtcGxhdGVfdmFsdWVfY2hhciBpcyBub3QgTm9uZQogICAgICAgICAgICAgICAgZWxzZSBzZXJ2ZXJfdmFsdWVfY2hhcgogICAgICAgICAgICAgICAgaWYgc2VydmVyX3ZhbHVlX2NoYXIgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgIGVsc2UgZ2xvYmFsX3ZhbHVlX2NoYXIKICAgICAgICAgICAgKQoKICAgICAgICAjIDIuNC4gU2VydmVyCiAgICAgICAgaWYgc2VydmVyOgogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgc2VydmVyX3ZhbHVlX2NoYXIKICAgICAgICAgICAgICAgIGlmIHNlcnZlcl92YWx1ZV9jaGFyIGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICBlbHNlIGdsb2JhbF92YWx1ZV9jaGFyCiAgICAgICAgICAgICkKCiAgICAgICAgIyAyLjUuIFBsYW4gTGluZSBBY3Rpb24KICAgICAgICBpZiBwbGFuX2xpbmVfYWN0aW9uOgogICAgICAgICAgICByZXR1cm4gcGxhbl9saW5lX2FjdGlvbl92YWx1ZV9jaGFyCgogICAgICAgICMgMi42LiBHbG9iYWwKICAgICAgICByZXR1cm4gZ2xvYmFsX3ZhbHVlX2NoYXIKCiAgICBAYXBpLm1vZGVsCiAgICBkZWYgX2dldF92YXJpYWJsZV92YWx1ZXNfYnlfcmVmZXJlbmNlcygKICAgICAgICBzZWxmLAogICAgICAgIHZhcmlhYmxlX3JlZmVyZW5jZXMsCiAgICAgICAgYXBwbHlfbW9kaWZpZXJzPVRydWUsCiAgICAgICAgKiprd2FyZ3MsCiAgICApOgogICAgICAgICIiIkdldCB2YXJpYWJsZSB2YWx1ZXMgZm9yIG11bHRpcGxlIHJlZmVyZW5jZXMuCiAgICAgICAgVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBmb3IgdGVtcGxhdGUgcmVuZGVyaW5nLgogICAgICAgIEl0IGFsc28gaW5jbHVkZXMgc3lzdGVtIHZhcmlhYmxlIHZhbHVlcyBpbiB0aGUgcmVzdWx0LgoKICAgICAgICBBcmdzOgogICAgICAgICAgICB2YXJpYWJsZV9yZWZlcmVuY2VzIChsaXN0IG9mIENoYXIpOiB2YXJpYWJsZSBuYW1lcwogICAgICAgICAgICBhcHBseV9tb2RpZmllcnMgKGJvb2wpOiBhcHBseSBQeXRob24gbW9kaWZpZXJzIHRvIHRoZSB2YWx1ZXMKICAgICAgICAgICAgKiprd2FyZ3M6IGtleXdvcmQgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIF9nZXRfdmFsdWUgbWV0aG9kCiAgICAgICAgICAgIC0gc2VydmVyIChjeC50b3dlci5zZXJ2ZXIpOiBTZXJ2ZXIKICAgICAgICAgICAgLSBzZXJ2ZXJfdGVtcGxhdGUgKGN4LnRvd2VyLnNlcnZlci50ZW1wbGF0ZSk6IFNlcnZlciBUZW1wbGF0ZQogICAgICAgICAgICAtIHBsYW5fbGluZV9hY3Rpb24gKGN4LnRvd2VyLnBsYW4ubGluZS5hY3Rpb24pOiBQbGFuIExpbmUgQWN0aW9uCiAgICAgICAgICAgIC0gamV0X3RlbXBsYXRlIChjeC50b3dlci5qZXQudGVtcGxhdGUpOiBKZXQgVGVtcGxhdGUKICAgICAgICAgICAgLSBqZXQgKGN4LnRvd2VyLmpldCk6IEpldAogICAgICAgICAgICAtIF9kZXB0aCAoaW50KTogRGVwdGggb2YgdGhlIHJlY3Vyc2lvbgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGRpY3Qge3ZhcmlhYmxlX3JlZmVyZW5jZTogdmFsdWV9CiAgICAgICAgIiIiCiAgICAgICAgIyAwLiBHZXQga2V5d29yZCBhcmd1bWVudHMKICAgICAgICBzZXJ2ZXIgPSBrd2FyZ3MuZ2V0KCJzZXJ2ZXIiKQogICAgICAgIHNlcnZlcl90ZW1wbGF0ZSA9IGt3YXJncy5nZXQoInNlcnZlcl90ZW1wbGF0ZSIpCiAgICAgICAgcGxhbl9saW5lX2FjdGlvbiA9IGt3YXJncy5nZXQoInBsYW5fbGluZV9hY3Rpb24iKQogICAgICAgIGpldF90ZW1wbGF0ZSA9IGt3YXJncy5nZXQoImpldF90ZW1wbGF0ZSIpCiAgICAgICAgamV0ID0ga3dhcmdzLmdldCgiamV0IikKICAgICAgICBfZGVwdGggPSBrd2FyZ3MuZ2V0KCJfZGVwdGgiLCAwKQoKICAgICAgICAjIDAuIFVwZGF0ZSBzZXJ2ZXIgYW5kIGpldCB0ZW1wbGF0ZSBmcm9tIGpldAogICAgICAgIGlmIGpldDoKICAgICAgICAgICAgc2VydmVyID0gamV0LnNlcnZlcl9pZAogICAgICAgICAgICBqZXRfdGVtcGxhdGUgPSBqZXQuamV0X3RlbXBsYXRlX2lkCgogICAgICAgICMgMS4gR2V0IHN5c3RlbSB2YXJpYWJsZSB2YWx1ZXMKICAgICAgICB2YXJpYWJsZV92YWx1ZXMgPSB7fQogICAgICAgIHN5c3RlbV92YXJzID0gc2VsZi5fZ2V0X3N5c3RlbV92YXJpYWJsZV92YWx1ZXMoCiAgICAgICAgICAgIHNlcnZlcj1zZXJ2ZXIsIGpldF90ZW1wbGF0ZT1qZXRfdGVtcGxhdGUsIGpldD1qZXQKICAgICAgICApCiAgICAgICAgaWYgc3lzdGVtX3ZhcnM6CiAgICAgICAgICAgIHZhcmlhYmxlX3ZhbHVlc1tzZWxmLlNZU1RFTV9WQVJJQUJMRV9SRUZFUkVOQ0VdID0gc3lzdGVtX3ZhcnMKCiAgICAgICAgIyBSZXR1cm4ganVzdCBzeXN0ZW0gdmFyaWFibGUgdmFsdWVzIGlmIG5vIHJlZmVyZW5jZXMgYXJlIHByb3ZpZGVkCiAgICAgICAgIyBvciB0aGUgb25seSBvbmUgaXMgdGhlIHN5c3RlbSB2YXJpYWJsZQogICAgICAgICMgTmVlZCBhIGZhbGxiYWNrIGluIGNhc2Ugc3lzdGVtIHZhcmlhYmxlIGlzIHByb3ZpZGVzIHNldmVyYWwgdGltZXMKICAgICAgICBpZiBub3QgdmFyaWFibGVfcmVmZXJlbmNlcyBvciAoCiAgICAgICAgICAgIGFsbCgKICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA9PSBzZWxmLlNZU1RFTV9WQVJJQUJMRV9SRUZFUkVOQ0UKICAgICAgICAgICAgICAgIGZvciByZWZlcmVuY2UgaW4gdmFyaWFibGVfcmVmZXJlbmNlcwogICAgICAgICAgICApCiAgICAgICAgKToKICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlX3ZhbHVlcwoKICAgICAgICAjIDIuIEdldCB2YXJpYWJsZSB2YWx1ZSByZWNvcmRzCiAgICAgICAgZm9yIHJlZmVyZW5jZSBpbiB2YXJpYWJsZV9yZWZlcmVuY2VzOgogICAgICAgICAgICAjIERvIG5vdCBvdmVyd3JpdGUgc3lzdGVtIHZhcmlhYmxlIHZhbHVlcwogICAgICAgICAgICBpZiByZWZlcmVuY2UgPT0gc2VsZi5TWVNURU1fVkFSSUFCTEVfUkVGRVJFTkNFOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdmFyaWFibGUgPSBzZWxmLmdldF9ieV9yZWZlcmVuY2UocmVmZXJlbmNlKSAgIyBweWxpbnQ6IGRpc2FibGU9bm8tbWVtYmVyCgogICAgICAgICAgICAjIEFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIHZhcmlhYmxlIHZhbHVlcyBkaWN0aW9uYXJ5CiAgICAgICAgICAgIHZhcmlhYmxlX3ZhbHVlID0gKAogICAgICAgICAgICAgICAgdmFyaWFibGUuX2dldF92YWx1ZSgKICAgICAgICAgICAgICAgICAgICBzZXJ2ZXI9c2VydmVyLAogICAgICAgICAgICAgICAgICAgIHNlcnZlcl90ZW1wbGF0ZT1zZXJ2ZXJfdGVtcGxhdGUsCiAgICAgICAgICAgICAgICAgICAgcGxhbl9saW5lX2FjdGlvbj1wbGFuX2xpbmVfYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIGpldF90ZW1wbGF0ZT1qZXRfdGVtcGxhdGUsCiAgICAgICAgICAgICAgICAgICAgamV0PWpldCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIHZhcmlhYmxlCiAgICAgICAgICAgICAgICBlbHNlIE5vbmUKICAgICAgICAgICAgKQogICAgICAgICAgICB2YXJpYWJsZV92YWx1ZXNbcmVmZXJlbmNlXSA9IHZhcmlhYmxlX3ZhbHVlCgogICAgICAgICMgMy4gUmVuZGVyIHRlbXBsYXRlcyBpbiB2YWx1ZXMKICAgICAgICBzZWxmLl9yZW5kZXJfdmFyaWFibGVfdmFsdWVzKAogICAgICAgICAgICB2YXJpYWJsZV92YWx1ZXMsCiAgICAgICAgICAgIHNlcnZlcj1zZXJ2ZXIsCiAgICAgICAgICAgIGpldF90ZW1wbGF0ZT1qZXRfdGVtcGxhdGUsCiAgICAgICAgICAgIGpldD1qZXQsCiAgICAgICAgICAgIF9kZXB0aD1fZGVwdGgsCiAgICAgICAgKQoKICAgICAgICAjIDQuIEFwcGx5IG1vZGlmaWVycwogICAgICAgIGlmIGFwcGx5X21vZGlmaWVyczoKICAgICAgICAgICAgc2VsZi5fYXBwbHlfbW9kaWZpZXJzKHZhcmlhYmxlX3ZhbHVlcykKCiAgICAgICAgcmV0dXJuIHZhcmlhYmxlX3ZhbHVlcwoKICAgIGRlZiBfcmVuZGVyX3ZhcmlhYmxlX3ZhbHVlcyhzZWxmLCB2YXJpYWJsZV92YWx1ZXMsICoqa3dhcmdzKToKICAgICAgICAiIiJSZW5kZXJzIHZhcmlhYmxlIHZhbHVlcyB1c2luZyBvdGhlciB2YXJpYWJsZSB2YWx1ZXMuCiAgICAgICAgRm9yIGV4YW1wbGUgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgICAgICAgICAgInNlcnZlcl9yb290IjogIi9vcHQvc2VydmVyIgogICAgICAgICAgICAic2VydmVyX2Fzc2V0cyI6ICJ7eyBzZXJ2ZXJfcm9vdCB9fS9hc3NldHMiCgogICAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZW5kZXIgdGhlICJzZXJ2ZXJfYXNzZXRzIiB2YXJpYWJsZToKICAgICAgICAgICAgInNlcnZlcl9hc3NldHMiOiAiL29wdC9zZXJ2ZXIvYXNzZXRzIgoKICAgICAgICBBcmdzOgogICAgICAgICAgICB2YXJpYWJsZV92YWx1ZXMgKGRpY3QpOiB2YXJpYWJsZSB2YWx1ZXMgdG8gY29tcGxldGUKICAgICAgICAgICAgKiprd2FyZ3M6IGtleXdvcmQgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIF9nZXRfdmFsdWUgbWV0aG9kCiAgICAgICAgICAgIC0gc2VydmVyIChjeC50b3dlci5zZXJ2ZXIpOiBTZXJ2ZXIKICAgICAgICAgICAgLSBzZXJ2ZXJfdGVtcGxhdGUgKGN4LnRvd2VyLnNlcnZlci50ZW1wbGF0ZSk6IFNlcnZlciBUZW1wbGF0ZQogICAgICAgICAgICAtIHBsYW5fbGluZV9hY3Rpb24gKGN4LnRvd2VyLnBsYW4ubGluZS5hY3Rpb24pOiBQbGFuIExpbmUgQWN0aW9uCiAgICAgICAgICAgIC0gamV0X3RlbXBsYXRlIChjeC50b3dlci5qZXQudGVtcGxhdGUpOiBKZXQgVGVtcGxhdGUKICAgICAgICAgICAgLSBqZXQgKGN4LnRvd2VyLmpldCk6IEpldAogICAgICAgICAgICAtIF9kZXB0aCAoaW50KTogRGVwdGggb2YgdGhlIHJlY3Vyc2lvbgogICAgICAgICIiIgogICAgICAgICMgMC4gR2V0IGtleXdvcmQgYXJndW1lbnRzCiAgICAgICAgc2VydmVyID0ga3dhcmdzLmdldCgic2VydmVyIikKICAgICAgICBqZXRfdGVtcGxhdGUgPSBrd2FyZ3MuZ2V0KCJqZXRfdGVtcGxhdGUiKQogICAgICAgIGpldCA9IGt3YXJncy5nZXQoImpldCIpCiAgICAgICAgX2RlcHRoID0ga3dhcmdzLmdldCgiX2RlcHRoIiwgMCkKCiAgICAgICAgIyBDb250cm9sIHJlY3Vyc2lvbiBkZXB0aAogICAgICAgIF9kZXB0aCArPSAxCiAgICAgICAgaWYgX2RlcHRoID4gTUFYX0RFUFRIOgogICAgICAgICAgICBfbG9nZ2VyLmVycm9yKCJNYXggZGVwdGggJWQgcmVhY2hlZCBmb3IgdmFyaWFibGUgJXMiLCBfZGVwdGgsIHNlbGYubmFtZSkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIFRlbXBsYXRlTWl4aW4gPSBzZWxmLmVudlsiY3gudG93ZXIudGVtcGxhdGUubWl4aW4iXQogICAgICAgIGZvciBrZXksIHZhcl92YWx1ZSBpbiB2YXJpYWJsZV92YWx1ZXMuaXRlbXMoKToKICAgICAgICAgICAgIyBTa2lwIHN5c3RlbSB2YXJpYWJsZSB2YWx1ZXMKICAgICAgICAgICAgaWYgbm90IHZhcl92YWx1ZSBvciBrZXkgPT0gc2VsZi5TWVNURU1fVkFSSUFCTEVfUkVGRVJFTkNFOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICMgUmVuZGVyIG9ubHkgaWYgdGVtcGxhdGUgaXMgZm91bmQKICAgICAgICAgICAgaWYgInt7IiBpbiB2YXJfdmFsdWUgYW5kICJ9fSIgaW4gdmFyX3ZhbHVlOgogICAgICAgICAgICAgICAgIyBHZXQgdmFyaWFibGVzIHVzZWQgaW4gdmFsdWUKICAgICAgICAgICAgICAgIHZhbHVlX3ZhcnMgPSBUZW1wbGF0ZU1peGluLmdldF92YXJpYWJsZXNfZnJvbV9jb2RlKHZhcl92YWx1ZSkKCiAgICAgICAgICAgICAgICAjIFJlbmRlciB2YXJpYWJsZXMgdXNlZCBpbiB2YWx1ZQogICAgICAgICAgICAgICAgdmFsdWVzX2Zvcl92YWx1ZSA9IHNlbGYuX2dldF92YXJpYWJsZV92YWx1ZXNfYnlfcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgICAgICB2YWx1ZV92YXJzLAogICAgICAgICAgICAgICAgICAgIGFwcGx5X21vZGlmaWVycz1UcnVlLAogICAgICAgICAgICAgICAgICAgIHNlcnZlcj1zZXJ2ZXIsCiAgICAgICAgICAgICAgICAgICAgamV0X3RlbXBsYXRlPWpldF90ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBqZXQ9amV0LAogICAgICAgICAgICAgICAgICAgIF9kZXB0aD1fZGVwdGgsCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgIyBSZW5kZXIgdmFsdWUgdXNpbmcgdmFyaWFibGVzCiAgICAgICAgICAgICAgICB2YXJpYWJsZV92YWx1ZXNba2V5XSA9IFRlbXBsYXRlTWl4aW4ucmVuZGVyX2NvZGVfY3VzdG9tKAogICAgICAgICAgICAgICAgICAgIHZhcl92YWx1ZSwgKip2YWx1ZXNfZm9yX3ZhbHVlCiAgICAgICAgICAgICAgICApCgogICAgZGVmIF9hcHBseV9tb2RpZmllcnMoc2VsZiwgdmFyaWFibGVfdmFsdWVzKToKICAgICAgICAiIiJBcHBseSBwcmUtZGVmaW5lZCBQeXRob24gZXhwcmVzc2lvbiB0byB0aGUgZGljdGlvbmFyeQogICAgICAgICAgICBvZiB2YXJpYWJsZSB2YWx1ZXMuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHZhcmlhYmxlX3ZhbHVlcyAoZGljdCk6IHZhcmlhYmxlIHZhbHVlcwogICAgICAgICAgICB7dmFyaWFibGVfcmVmZXJlbmNlOiB2YWx1ZX0KICAgICAgICAiIiIKCiAgICAgICAgZm9yIHZhcmlhYmxlX3JlZmVyZW5jZSwgdmFsdWUgaW4gdmFyaWFibGVfdmFsdWVzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIG5vdCB2YWx1ZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIE9STSBzaG91bGQgY2FjaGUgcmVzb2x2ZWQgdmFyaWFibGVzCiAgICAgICAgICAgIHZhcmlhYmxlID0gc2VsZi5nZXRfYnlfcmVmZXJlbmNlKHZhcmlhYmxlX3JlZmVyZW5jZSkKCiAgICAgICAgICAgICMgU2hvdWxkIG5ldmVyIGhhcHBlbi4uIGFueXdheQogICAgICAgICAgICBpZiBub3QgdmFyaWFibGU6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBTa2lwIGlmIG5vIGV4cHJlc3Npb24gdG8gYXBwbHkKICAgICAgICAgICAgaWYgbm90IHZhcmlhYmxlLmFwcGxpZWRfZXhwcmVzc2lvbjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIEV2YWx1YXRlIGV4cHJlc3Npb24KICAgICAgICAgICAgZXZhbF9jb250ZXh0ID0gdmFyaWFibGUuX2dldF9ldmFsX2NvbnRleHQodmFsdWUpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNhZmVfZXZhbCgKICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5hcHBsaWVkX2V4cHJlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgZXZhbF9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgIG1vZGU9ImV4ZWMiLAogICAgICAgICAgICAgICAgICAgIG5vY29weT1UcnVlLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgdmFyaWFibGVfdmFsdWVzW3ZhcmlhYmxlX3JlZmVyZW5jZV0gPSBldmFsX2NvbnRleHQuZ2V0KCJyZXN1bHQiLCB2YWx1ZSkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgX2xvZ2dlci5lcnJvcigKICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZXZhbHVhdGluZyBhcHBsaWVkIGV4cHJlc3Npb24gZm9yICIKICAgICAgICAgICAgICAgICAgICAidmFyaWFibGUgJXMgdmFsdWUgJXM6ICVzIiwKICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lLAogICAgICAgICAgICAgICAgICAgIHZhbHVlLAogICAgICAgICAgICAgICAgICAgIHN0cihlKSwKICAgICAgICAgICAgICAgICkKCiAgICBAYXBpLm1vZGVsCiAgICBkZWYgX2dldF9zeXN0ZW1fdmFyaWFibGVfdmFsdWVzKHNlbGYsIHNlcnZlcj1Ob25lLCBqZXRfdGVtcGxhdGU9Tm9uZSwgamV0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgdmFsdWVzIGZvciB0aGUgYHRvd2VyYCBzeXN0ZW0gdmFyaWFibGUuCiAgICAgICAgVGhpcyB2YXJpYWJsZSB1c2VzIGB0b3dlci48dmFyX3Byb3ZpZGVyPi48dmFyX25hbWU+YCBmb3JtYXQuCiAgICAgICAgRS5nLiBgdG93ZXIuc2VydmVyLmlwdjZgLCBgdG93ZXIudG9vbHMudXVpZGAsCiAgICAgICAgYHRvd2VyLmpldF90ZW1wbGF0ZS5yZWZlcmVuY2VgLCBgdG93ZXIudG9vbHMubm93X3VuZGVyc2NvcmVgIGV0Yy4KCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHNlcnZlciAoY3gudG93ZXIuc2VydmVyKCkpOiBzZXJ2ZXIgcmVjb3JkCiAgICAgICAgICAgIGpldF90ZW1wbGF0ZSAoY3gudG93ZXIuamV0LnRlbXBsYXRlKCkpOiBqZXQgdGVtcGxhdGUgcmVjb3JkCiAgICAgICAgICAgIGpldCAoY3gudG93ZXIuamV0KCkpOiBqZXQgcmVjb3JkCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGRpY3QoKTogYHRvd2VyYCB2YWx1ZXMuCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJ3Rvb2xzJzogey4uaGVscGVyIHRvb2xzIHZhbHMuLi59CiAgICAgICAgICAgICAgICAgICAgJ3NlcnZlcic6IHsuLnNlcnZlciB2YWxzLi59LAogICAgICAgICAgICAgICAgICAgICdqZXRfdGVtcGxhdGUnOiB7Li5qZXQgdGVtcGxhdGUgdmFscy4ufSwKICAgICAgICAgICAgICAgICAgICAnamV0Jzogey4uamV0IHZhbHMuLn0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInRvb2xzIjogc2VsZi5fcGFyc2Vfc3lzdGVtX3ZhcmlhYmxlX3Rvb2xzKCksCiAgICAgICAgICAgICJzZXJ2ZXIiOiBzZWxmLl9wYXJzZV9zeXN0ZW1fdmFyaWFibGVfc2VydmVyKHNlcnZlciksCiAgICAgICAgICAgICJqZXRfdGVtcGxhdGUiOiBzZWxmLl9wYXJzZV9zeXN0ZW1fdmFyaWFibGVfamV0X3RlbXBsYXRlKGpldF90ZW1wbGF0ZSksCiAgICAgICAgICAgICJqZXQiOiBzZWxmLl9wYXJzZV9zeXN0ZW1fdmFyaWFibGVfamV0KGpldCksCiAgICAgICAgfQoKICAgIGRlZiBfcGFyc2Vfc3lzdGVtX3ZhcmlhYmxlX3NlcnZlcihzZWxmLCBzZXJ2ZXI9Tm9uZSk6CiAgICAgICAgIiIiUGFyc2VyIHN5c3RlbSB2YXJpYWJsZSBvZiBgc2VydmVyYCB0eXBlLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBzZXJ2ZXIgKGN4LnRvd2VyLnNlcnZlcigpKTogc2VydmVyIHJlY29yZAoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBkaWN0KCk6IGBzZXJ2ZXJgIHZhbHVlcyBvZiB0aGUgYHRvd2VyYCB2YXJpYWJsZS4KICAgICAgICAiIiIKICAgICAgICAjIEdldCBjdXJyZW50IHNlcnZlcgogICAgICAgIHZhbHVlcyA9IHt9CiAgICAgICAgaWYgc2VydmVyOgogICAgICAgICAgICAjIFVzaW5nIHN1ZG8oKSB0byBnZXQgYWxsIGZpZWxkcwogICAgICAgICAgICBzZXJ2ZXIgPSBzZXJ2ZXIuc3VkbygpCiAgICAgICAgICAgIHZhbHVlcyA9IHsKICAgICAgICAgICAgICAgICJuYW1lIjogc2VydmVyLm5hbWUsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogc2VydmVyLnJlZmVyZW5jZSwKICAgICAgICAgICAgICAgICJ1c2VybmFtZSI6IHNlcnZlci5zc2hfdXNlcm5hbWUsCiAgICAgICAgICAgICAgICAicGFydG5lcl9uYW1lIjogc2VydmVyLnBhcnRuZXJfaWQubmFtZSBpZiBzZXJ2ZXIucGFydG5lcl9pZCBlbHNlIEZhbHNlLAogICAgICAgICAgICAgICAgImlwdjQiOiBzZXJ2ZXIuaXBfdjRfYWRkcmVzcywKICAgICAgICAgICAgICAgICJpcHY2Ijogc2VydmVyLmlwX3Y2X2FkZHJlc3MsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc2VydmVyLnN0YXR1cywKICAgICAgICAgICAgICAgICJvcyI6IHNlcnZlci5vc19pZC5uYW1lIGlmIHNlcnZlci5vc19pZCBlbHNlIEZhbHNlLAogICAgICAgICAgICAgICAgInVybCI6IHNlcnZlci51cmwsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgc2VydmVyLnVybDoKICAgICAgICAgICAgICAgIHVybF9wYXJ0cyA9IHVybHBhcnNlKHNlcnZlci51cmwpCiAgICAgICAgICAgICAgICB2YWx1ZXMudXBkYXRlKAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIjogdXJsX3BhcnRzLmhvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAibmV0bG9jIjogdXJsX3BhcnRzLm5ldGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiOiB1cmxfcGFydHMucG9ydCwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIHZhbHVlcwoKICAgIGRlZiBfcGFyc2Vfc3lzdGVtX3ZhcmlhYmxlX2pldF90ZW1wbGF0ZShzZWxmLCBqZXRfdGVtcGxhdGU9Tm9uZSk6CiAgICAgICAgIiIiUGFyc2VyIHN5c3RlbSB2YXJpYWJsZSBvZiBgc2VydmVyYCB0eXBlLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBqZXRfdGVtcGxhdGUgKGN4LnRvd2VyLmpldC50ZW1wbGF0ZSgpKTogamV0IHRlbXBsYXRlIHJlY29yZAoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBkaWN0KCk6IGBqZXRfdGVtcGxhdGVgIHZhbHVlcyBvZiB0aGUgYHRvd2VyYCB2YXJpYWJsZS4KICAgICAgICAiIiIKICAgICAgICAjIEdldCBjdXJyZW50IHNlcnZlcgogICAgICAgIHZhbHVlcyA9IHt9CiAgICAgICAgaWYgamV0X3RlbXBsYXRlOgogICAgICAgICAgICAjIFVzaW5nIHN1ZG8oKSB0byBnZXQgYWxsIGZpZWxkcwogICAgICAgICAgICBqZXRfdGVtcGxhdGUgPSBqZXRfdGVtcGxhdGUuc3VkbygpCiAgICAgICAgICAgIHZhbHVlcyA9IHsKICAgICAgICAgICAgICAgICJuYW1lIjogamV0X3RlbXBsYXRlLm5hbWUsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogamV0X3RlbXBsYXRlLnJlZmVyZW5jZSwKICAgICAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZXMKCiAgICBkZWYgX3BhcnNlX3N5c3RlbV92YXJpYWJsZV9qZXQoc2VsZiwgamV0PU5vbmUpOgogICAgICAgICIiIlBhcnNlciBzeXN0ZW0gdmFyaWFibGUgb2YgYGpldGAgdHlwZS4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgamV0IChjeC50b3dlci5qZXQoKSk6IGpldCByZWNvcmQKICAgICAgICAiIiIKICAgICAgICB2YWx1ZXMgPSB7fQogICAgICAgIGlmIGpldDoKICAgICAgICAgICAgIyBVc2luZyBzdWRvKCkgdG8gZ2V0IGFsbCBmaWVsZHMKICAgICAgICAgICAgamV0ID0gamV0LnN1ZG8oKQogICAgICAgICAgICB2YWx1ZXMgPSB7CiAgICAgICAgICAgICAgICAibmFtZSI6IGpldC5uYW1lLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6IGpldC5yZWZlcmVuY2UsCiAgICAgICAgICAgICAgICAidXJsIjogamV0LnVybCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6IGpldC5zdGF0ZSwKICAgICAgICAgICAgICAgICJjbG9uZWRfZnJvbSI6IGpldC5qZXRfY2xvbmVkX2Zyb21faWQucmVmZXJlbmNlCiAgICAgICAgICAgICAgICBpZiBqZXQuamV0X2Nsb25lZF9mcm9tX2lkCiAgICAgICAgICAgICAgICBlbHNlIEZhbHNlLAogICAgICAgICAgICB9CiAgICAgICAgICAgICMgQWRkIFVSTCBwYXJ0cyBpZiBVUkwgaXMgc2V0CiAgICAgICAgICAgIGlmIGpldC51cmw6CiAgICAgICAgICAgICAgICB1cmxfcGFydHMgPSB1cmxwYXJzZShqZXQudXJsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdXJsX3BhcnRzID0gRmFsc2UKICAgICAgICAgICAgdmFsdWVzLnVwZGF0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiOiB1cmxfcGFydHMuaG9zdG5hbWUKICAgICAgICAgICAgICAgICAgICBpZiB1cmxfcGFydHMgYW5kIHVybF9wYXJ0cy5ob3N0bmFtZQogICAgICAgICAgICAgICAgICAgIGVsc2UgRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIm5ldGxvYyI6IHVybF9wYXJ0cy5uZXRsb2MKICAgICAgICAgICAgICAgICAgICBpZiB1cmxfcGFydHMgYW5kIHVybF9wYXJ0cy5uZXRsb2MKICAgICAgICAgICAgICAgICAgICBlbHNlIEZhbHNlLAogICAgICAgICAgICAgICAgICAgICJwb3J0IjogdXJsX3BhcnRzLnBvcnQgaWYgdXJsX3BhcnRzIGFuZCB1cmxfcGFydHMucG9ydCBlbHNlIEZhbHNlLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgICAgICMgQWRkIHdheXBvaW50IHZhbHVlcyBpZiB3YXlwb2ludCBpcyBzZXQKICAgICAgICAgICAgd2F5cG9pbnRfZGF0YSA9IHsKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiBqZXQud2F5cG9pbnRfaWQucmVmZXJlbmNlIGlmIGpldC53YXlwb2ludF9pZCBlbHNlIEZhbHNlLAogICAgICAgICAgICAgICAgInR5cGUiOiBqZXQud2F5cG9pbnRfaWQud2F5cG9pbnRfdGVtcGxhdGVfaWQucmVmZXJlbmNlCiAgICAgICAgICAgICAgICBpZiBqZXQud2F5cG9pbnRfaWQKICAgICAgICAgICAgICAgIGVsc2UgRmFsc2UsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBBZGQgZWFjaCBtZXRhZGF0YSBrZXktdmFsdWUgcGFpciB0byB0aGUgd2F5cG9pbnQgZGF0YQogICAgICAgICAgICBtZXRhZGF0YSA9IGpldC53YXlwb2ludF9pZC5tZXRhZGF0YSBpZiBqZXQud2F5cG9pbnRfaWQgZWxzZSBGYWxzZQogICAgICAgICAgICBpZiBtZXRhZGF0YToKICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG1ldGFkYXRhLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgd2F5cG9pbnRfZGF0YVtrZXldID0gdmFsdWUKICAgICAgICAgICAgdmFsdWVzLnVwZGF0ZSh7IndheXBvaW50Ijogd2F5cG9pbnRfZGF0YX0pCiAgICAgICAgcmV0dXJuIHZhbHVlcwoKICAgIGRlZiBfcGFyc2Vfc3lzdGVtX3ZhcmlhYmxlX3Rvb2xzKHNlbGYpOgogICAgICAgICIiIlBhcnNlciBzeXN0ZW0gdmFyaWFibGUgb2YgYHRvb2xzYCB0eXBlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBkaWN0KCk6IGB0b29sc2AgdmFsdWVzIG9mIHRoZSBgdG93ZXJgIHZhcmlhYmxlLgogICAgICAgICIiIgogICAgICAgIHRvZGF5ID0gZmllbGRzLkRhdGUudG9fc3RyaW5nKGZpZWxkcy5EYXRlLnRvZGF5KCkpCiAgICAgICAgbm93ID0gZmllbGRzLkRhdGV0aW1lLnRvX3N0cmluZyhmaWVsZHMuRGF0ZXRpbWUubm93KCkpCiAgICAgICAgdmFsdWVzID0gewogICAgICAgICAgICAidXVpZCI6IHV1aWQudXVpZDQoKSwKICAgICAgICAgICAgInRvZGF5IjogdG9kYXksCiAgICAgICAgICAgICJub3ciOiBub3csCiAgICAgICAgICAgICJ0b2RheV91bmRlcnNjb3JlIjogcmUuc3ViKHIiWy06IC5cL10iLCAiXyIsIHRvZGF5KSwKICAgICAgICAgICAgIm5vd191bmRlcnNjb3JlIjogcmUuc3ViKHIiWy06IC5cL10iLCAiXyIsIG5vdyksCiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZXMK