diff --git a/addons/cetmix_tower_server/models/cx_tower_jet_template_install.py b/addons/cetmix_tower_server/models/cx_tower_jet_template_install.py new file mode 100644 index 0000000..3797406 --- /dev/null +++ b/addons/cetmix_tower_server/models/cx_tower_jet_template_install.py @@ -0,0 +1 @@ +aW1wb3J0IGxvZ2dpbmcKCmZyb20gb2RvbyBpbXBvcnQgXywgYXBpLCBmaWVsZHMsIG1vZGVscwoKX2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIEN4VG93ZXJKZXRUZW1wbGF0ZUluc3RhbGwobW9kZWxzLk1vZGVsKToKICAgICIiIgogICAgVXNlZCB0byB0cmFjayBpbnN0YWxsYXRpb24gb2YgSmV0IFRlbXBsYXRlcyBvbiBzZXJ2ZXJzLgogICAgIiIiCgogICAgX25hbWUgPSAiY3gudG93ZXIuamV0LnRlbXBsYXRlLmluc3RhbGwiCiAgICBfZGVzY3JpcHRpb24gPSAiSmV0IFRlbXBsYXRlIEluc3RhbGwvVW5pbnN0YWxsIgogICAgX29yZGVyID0gImNyZWF0ZV9kYXRlIGRlc2MiCiAgICBfcmVjX25hbWUgPSAiamV0X3RlbXBsYXRlX2lkIgoKICAgIGpldF90ZW1wbGF0ZV9pZCA9IGZpZWxkcy5NYW55Mm9uZSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLmpldC50ZW1wbGF0ZSIsCiAgICAgICAgcmVxdWlyZWQ9VHJ1ZSwKICAgICAgICBoZWxwPSJUZW1wbGF0ZSB0byBpbnN0YWxsL3VuaW5zdGFsbCIsCiAgICApCiAgICBzZXJ2ZXJfaWQgPSBmaWVsZHMuTWFueTJvbmUoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci5zZXJ2ZXIiLAogICAgICAgIGluZGV4PVRydWUsCiAgICAgICAgb25kZWxldGU9ImNhc2NhZGUiLAogICAgICAgIHJlcXVpcmVkPVRydWUsCiAgICAgICAgaGVscD0iU2VydmVyIHRvIGluc3RhbGwvdW5pbnN0YWxsIHRoZSB0ZW1wbGF0ZSBvbiIsCiAgICApCiAgICBhY3Rpb24gPSBmaWVsZHMuU2VsZWN0aW9uKAogICAgICAgIHNlbGVjdGlvbj1bKCJpbnN0YWxsIiwgIkluc3RhbGwiKSwgKCJ1bmluc3RhbGwiLCAiVW5pbnN0YWxsIildLAogICAgICAgIGRlZmF1bHQ9Imluc3RhbGwiLAogICAgKQogICAgZGF0ZV9kb25lID0gZmllbGRzLkRhdGV0aW1lKHN0cmluZz0iQ29tcGxldGVkIG9uIiwgcmVhZG9ubHk9VHJ1ZSkKICAgIGxpbmVfaWRzID0gZmllbGRzLk9uZTJtYW55KAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIuamV0LnRlbXBsYXRlLmluc3RhbGwubGluZSIsCiAgICAgICAgaW52ZXJzZV9uYW1lPSJqZXRfdGVtcGxhdGVfaW5zdGFsbF9pZCIsCiAgICAgICAgYXV0b19qb2luPVRydWUsCiAgICAgICAgc3RyaW5nPSJUZW1wbGF0ZXMgdG8gaW5zdGFsbCIsCiAgICAgICAgaGVscD0iQ29tcGxldGUgbGlzdCBvZiB0ZW1wbGF0ZXMgdG8gaW5zdGFsbC91bmluc3RhbGwgaW5jbHVkaW5nIGRlcGVuZGVuY2llcyIsCiAgICApCiAgICBjdXJyZW50X2xpbmVfaWQgPSBmaWVsZHMuTWFueTJvbmUoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci5qZXQudGVtcGxhdGUuaW5zdGFsbC5saW5lIiwKICAgICAgICBzdHJpbmc9IkN1cnJlbnRseSBJbnN0YWxsaW5nIiwKICAgICAgICBoZWxwPSJMaW5lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGluc3RhbGxlZCIsCiAgICApCiAgICBzdGF0ZSA9IGZpZWxkcy5TZWxlY3Rpb24oCiAgICAgICAgc2VsZWN0aW9uPVsKICAgICAgICAgICAgKCJwcm9jZXNzaW5nIiwgIlByb2Nlc3NpbmciKSwKICAgICAgICAgICAgKCJkb25lIiwgIkRvbmUiKSwKICAgICAgICAgICAgKCJmYWlsZWQiLCAiRmFpbGVkIiksCiAgICAgICAgXSwKICAgICAgICBkZWZhdWx0PSJwcm9jZXNzaW5nIiwKICAgICAgICBpbmRleD1UcnVlLAogICAgKQoKICAgIEBhcGkubW9kZWwKICAgIGRlZiBpbnN0YWxsKHNlbGYsIHNlcnZlciwgdGVtcGxhdGUpOgogICAgICAgICIiIkluc3RhbGwgdGhlIHRlbXBsYXRlIG9uIHRoZSBzZXJ2ZXIuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHNlcnZlciAoY3gudG93ZXIuc2VydmVyKCkpOiBUaGUgc2VydmVyIHRvIGluc3RhbGwgdGhlIHRlbXBsYXRlIG9uLgogICAgICAgICAgICB0ZW1wbGF0ZSAoY3gudG93ZXIuamV0LnRlbXBsYXRlKCkpOiBUaGUgdGVtcGxhdGUgdG8gaW5zdGFsbC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgY3gudG93ZXIuamV0LnRlbXBsYXRlLmluc3RhbGwoKTogVGhlIGluc3RhbGxhdGlvbiByZWNvcmQuCiAgICAgICAgIiIiCiAgICAgICAgc2VydmVyLmVuc3VyZV9vbmUoKQogICAgICAgIHRlbXBsYXRlLmVuc3VyZV9vbmUoKQoKICAgICAgICAjIENvbXBvc2UgdGhlIGxpc3Qgb2YgdGVtcGxhdGVzIHRvIGluc3RhbGwKICAgICAgICAjIE5COiB0ZW1wbGF0ZXMgd2lsbCBiZSBpbnN0YWxsZWQgbGF0ZXIgaW4gcmV2ZXJzZSBvcmRlcgogICAgICAgICMgdG8gZW5zdXJlIHRoYXQgZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQKICAgICAgICB0ZW1wbGF0ZV90b19wcm9jZXNzID0gW3RlbXBsYXRlXSArIHRlbXBsYXRlLl9jaGVja19kZXBlbmRlbmN5X3NhdGlzZmFjdGlvbigKICAgICAgICAgICAgc2VydmVyCiAgICAgICAgKQoKICAgICAgICAjIFByZXBhcmUgdGhlIHRlbXBsYXRlIGluc3RhbGwgbGluZXMKICAgICAgICB0ZW1wbGF0ZV90b19wcm9jZXNzX2xpbmVzID0gW10KICAgICAgICBvcmRlciA9IDAKICAgICAgICBmb3IgdCBpbiB0ZW1wbGF0ZV90b19wcm9jZXNzOgogICAgICAgICAgICB0ZW1wbGF0ZV90b19wcm9jZXNzX2xpbmVzLmFwcGVuZCgKICAgICAgICAgICAgICAgICgwLCAwLCB7ImpldF90ZW1wbGF0ZV9pZCI6IHQuaWQsICJvcmRlciI6IG9yZGVyfSkKICAgICAgICAgICAgKQogICAgICAgICAgICBvcmRlciArPSAxCgogICAgICAgICMgQ3JlYXRlIGEgbmV3IGluc3RhbGwgcmVjb3JkCiAgICAgICAgaW5zdGFsbF9yZWNvcmQgPSBzZWxmLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHRlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlcnZlci5pZCwKICAgICAgICAgICAgICAgICJsaW5lX2lkcyI6IHRlbXBsYXRlX3RvX3Byb2Nlc3NfbGluZXMsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgU2VuZCBub3RpZmljYXRpb24KICAgICAgICAjIEFjdGlvbiBmb3IgYnV0dG9uCiAgICAgICAgYWN0aW9uID0gc2VsZi5lbnZbImlyLmFjdGlvbnMuYWN0X3dpbmRvdyJdLl9mb3JfeG1sX2lkKAogICAgICAgICAgICAiY2V0bWl4X3Rvd2VyX3NlcnZlci5jeF90b3dlcl9qZXRfdGVtcGxhdGVfaW5zdGFsbF9hY3Rpb24iCiAgICAgICAgKQoKICAgICAgICBjb250ZXh0ID0gc2VsZi5lbnYuY29udGV4dC5jb3B5KCkKICAgICAgICBwYXJhbXMgPSBkaWN0KGNvbnRleHQuZ2V0KCJwYXJhbXMiKSBvciB7fSkKICAgICAgICBwYXJhbXNbImJ1dHRvbl9uYW1lIl0gPSBfKCJWaWV3IEluc3RhbGxhdGlvbiIpCiAgICAgICAgY29udGV4dFsicGFyYW1zIl0gPSBwYXJhbXMKCiAgICAgICAgIyBBZGQgcmVjb3JkIGlkIGFuZCBjb250ZXh0IHRvIHRoZSBhY3Rpb24KICAgICAgICBhY3Rpb24udXBkYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiY29udGV4dCI6IGNvbnRleHQsCiAgICAgICAgICAgICAgICAicmVzX2lkIjogaW5zdGFsbF9yZWNvcmQuaWQsCiAgICAgICAgICAgICAgICAidmlld3MiOiBbKEZhbHNlLCAiZm9ybSIpXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgc2VsZi5lbnYudXNlci5ub3RpZnlfaW5mbygKICAgICAgICAgICAgbWVzc2FnZT1fKAogICAgICAgICAgICAgICAgIiUodGltZXN0YW1wKXM8YnIvPiIgIkluc3RhbGxpbmcgdGVtcGxhdGUgb24gc2VydmVyICclKHNlcnZlcl9uYW1lKXMnIiwKICAgICAgICAgICAgICAgIHNlcnZlcl9uYW1lPXNlcnZlci5uYW1lLAogICAgICAgICAgICAgICAgdGltZXN0YW1wPWZpZWxkcy5EYXRldGltZS5jb250ZXh0X3RpbWVzdGFtcCgKICAgICAgICAgICAgICAgICAgICBzZWxmLCBmaWVsZHMuRGF0ZXRpbWUubm93KCkKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHRpdGxlPXRlbXBsYXRlLm5hbWUsCiAgICAgICAgICAgIHN0aWNreT1GYWxzZSwgICMgZXhwbGljaXRseSBzZXQgdG8gRmFsc2UgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIHVzZXIncyBzY3JlZW4KICAgICAgICAgICAgYWN0aW9uPWFjdGlvbiwKICAgICAgICApCgogICAgICAgICMgTGF1bmNoIHRoZSBpbnN0YWxsYXRpb24KICAgICAgICBpbnN0YWxsX3JlY29yZC5fcHJvY2Vzc19pbnN0YWxsKCkKCiAgICAgICAgIyBSZXR1cm4gdGhlIGluc3RhbGxhdGlvbiByZWNvcmQKICAgICAgICByZXR1cm4gaW5zdGFsbF9yZWNvcmQKCiAgICBAYXBpLm1vZGVsCiAgICBkZWYgdW5pbnN0YWxsKHNlbGYsIHNlcnZlciwgdGVtcGxhdGUpOgogICAgICAgICIiIlVuaW5zdGFsbCB0aGUgdGVtcGxhdGUgZnJvbSB0aGUgc2VydmVyLgogICAgICAgIE5COiBvbmx5IG9uZSB0ZW1wbGF0ZSBjYW4gYmUgdW5pbnN0YWxsZWQgYXQgYSB0aW1lLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBzZXJ2ZXIgKGN4LnRvd2VyLnNlcnZlcigpKTogVGhlIHNlcnZlciB0byB1bmluc3RhbGwgdGhlIHRlbXBsYXRlIGZyb20uCiAgICAgICAgICAgIHRlbXBsYXRlIChjeC50b3dlci5qZXQudGVtcGxhdGUoKSk6IFRoZSB0ZW1wbGF0ZSB0byB1bmluc3RhbGwuCiAgICAgICAgIiIiCiAgICAgICAgc2VydmVyLmVuc3VyZV9vbmUoKQogICAgICAgIHRlbXBsYXRlLmVuc3VyZV9vbmUoKQoKICAgICAgICAjIENyZWF0ZSBhIG5ldyBpbnN0YWxsIHJlY29yZAogICAgICAgIGluc3RhbGxfcmVjb3JkID0gc2VsZi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZXJ2ZXIuaWQsCiAgICAgICAgICAgICAgICAibGluZV9pZHMiOiBbKDAsIDAsIHsiamV0X3RlbXBsYXRlX2lkIjogdGVtcGxhdGUuaWQsICJvcmRlciI6IDB9KV0sCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInVuaW5zdGFsbCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgU2VuZCBub3RpZmljYXRpb24KICAgICAgICAjIEFjdGlvbiBmb3IgYnV0dG9uCiAgICAgICAgYWN0aW9uID0gc2VsZi5lbnZbImlyLmFjdGlvbnMuYWN0X3dpbmRvdyJdLl9mb3JfeG1sX2lkKAogICAgICAgICAgICAiY2V0bWl4X3Rvd2VyX3NlcnZlci5jeF90b3dlcl9qZXRfdGVtcGxhdGVfaW5zdGFsbF9hY3Rpb24iCiAgICAgICAgKQoKICAgICAgICBjb250ZXh0ID0gc2VsZi5lbnYuY29udGV4dC5jb3B5KCkKICAgICAgICBwYXJhbXMgPSBkaWN0KGNvbnRleHQuZ2V0KCJwYXJhbXMiKSBvciB7fSkKICAgICAgICBwYXJhbXNbImJ1dHRvbl9uYW1lIl0gPSBfKCJWaWV3IEluc3RhbGxhdGlvbiIpCiAgICAgICAgY29udGV4dFsicGFyYW1zIl0gPSBwYXJhbXMKCiAgICAgICAgIyBBZGQgcmVjb3JkIGlkIGFuZCBjb250ZXh0IHRvIHRoZSBhY3Rpb24KICAgICAgICBhY3Rpb24udXBkYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiY29udGV4dCI6IGNvbnRleHQsCiAgICAgICAgICAgICAgICAicmVzX2lkIjogaW5zdGFsbF9yZWNvcmQuaWQsCiAgICAgICAgICAgICAgICAidmlld3MiOiBbKEZhbHNlLCAiZm9ybSIpXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgc2VsZi5lbnYudXNlci5ub3RpZnlfaW5mbygKICAgICAgICAgICAgbWVzc2FnZT1fKAogICAgICAgICAgICAgICAgIiUodGltZXN0YW1wKXM8YnIvPiIKICAgICAgICAgICAgICAgICJVbmluc3RhbGxpbmcgdGVtcGxhdGUgb24gc2VydmVyICclKHNlcnZlcl9uYW1lKXMnIiwKICAgICAgICAgICAgICAgIHNlcnZlcl9uYW1lPXNlcnZlci5uYW1lLAogICAgICAgICAgICAgICAgdGltZXN0YW1wPWZpZWxkcy5EYXRldGltZS5jb250ZXh0X3RpbWVzdGFtcCgKICAgICAgICAgICAgICAgICAgICBzZWxmLCBmaWVsZHMuRGF0ZXRpbWUubm93KCkKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHRpdGxlPXRlbXBsYXRlLm5hbWUsCiAgICAgICAgICAgIHN0aWNreT1GYWxzZSwgICMgZXhwbGljaXRseSBzZXQgdG8gRmFsc2UgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIHVzZXIncyBzY3JlZW4KICAgICAgICAgICAgYWN0aW9uPWFjdGlvbiwKICAgICAgICApCgogICAgICAgICMgTGF1bmNoIHRoZSBpbnN0YWxsYXRpb24KICAgICAgICBpbnN0YWxsX3JlY29yZC5fcHJvY2Vzc19pbnN0YWxsKCkKCiAgICAgICAgIyBSZXR1cm4gdGhlIGluc3RhbGxhdGlvbiByZWNvcmQKICAgICAgICByZXR1cm4gaW5zdGFsbF9yZWNvcmQKCiAgICBkZWYgX3Byb2Nlc3NfaW5zdGFsbChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBQcm9jZXNzIHRoZSBpbnN0YWxsYXRpb24gb3IgdW5pbnN0YWxsYXRpb24gb2YgdGhlIHRlbXBsYXRlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZW5zdXJlX29uZSgpCgogICAgICAgICMgV2UgYXJlIG5vdCB1c2luZyBgd2hpbGVgIGJlY2F1c2UgZmxpZ2h0IHBsYW5zCiAgICAgICAgIyBtYXkgcnVuIGFzeW5jaHJvbm91c2x5IGFuZCB3ZSBkb24ndCB3YW50IHRvCiAgICAgICAgIyBibG9jayB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbgoKICAgICAgICAjIENvbnRpbnVlIG9ubHkgaWYgdGhlIGpvYiBpcyBzdGlsbCBwcm9jZXNzaW5nCiAgICAgICAgaWYgc2VsZi5zdGF0ZSAhPSAicHJvY2Vzc2luZyI6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEV4aXQgaWYgdGhlcmUgYXJlIHNvbWUgbGluZXMgY3VycmVudGx5IGJlaW5nIGluc3RhbGxlZAogICAgICAgIGlmIHNlbGYuY3VycmVudF9saW5lX2lkOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBHZXQgdGhlIHRlbXBsYXRlIHRvIGluc3RhbGwKICAgICAgICBpbnN0YWxsYXRpb25fdGFza3MgPSBzZWxmLmxpbmVfaWRzLnNvcnRlZCgib3JkZXIiLCByZXZlcnNlPVRydWUpCiAgICAgICAgZm9yIGluc3RhbGxhdGlvbl90YXNrIGluIGluc3RhbGxhdGlvbl90YXNrczoKICAgICAgICAgICAgIyBQaWNrIHRoZSB0ZW1wbGF0ZXMgb25seSBpbiB0aGUgIlRvIFByb2Nlc3MiIHN0YXRlCiAgICAgICAgICAgIGlmIGluc3RhbGxhdGlvbl90YXNrLnN0YXRlICE9ICJ0b19wcm9jZXNzIjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIEdldCB0aGUgZmxpZ2h0IHBsYW4gdG8gaW5zdGFsbCB0aGUgdGVtcGxhdGUKICAgICAgICAgICAgaWYgc2VsZi5hY3Rpb24gPT0gImluc3RhbGwiOgogICAgICAgICAgICAgICAgZmxpZ2h0X3BsYW4gPSBpbnN0YWxsYXRpb25fdGFzay5qZXRfdGVtcGxhdGVfaWQucGxhbl9pbnN0YWxsX2lkICAjIHB5bGludDogZGlzYWJsZT1uby1tZW1iZXIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZsaWdodF9wbGFuID0gaW5zdGFsbGF0aW9uX3Rhc2suamV0X3RlbXBsYXRlX2lkLnBsYW5fdW5pbnN0YWxsX2lkICAjIHB5bGludDogZGlzYWJsZT1uby1tZW1iZXIKCiAgICAgICAgICAgICMgUnVuIHRoZSBjb3JyZXNwb25kaW5nIGZsaWdodCBwbGFuCiAgICAgICAgICAgIGlmIGZsaWdodF9wbGFuOgogICAgICAgICAgICAgICAgIyBVcGRhdGUgdGhlIGN1cnJlbnQgdGVtcGxhdGUgaW5zdGFsbCBsaW5lCiAgICAgICAgICAgICAgICBzZWxmLndyaXRlKAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImN1cnJlbnRfbGluZV9pZCI6IGluc3RhbGxhdGlvbl90YXNrLmlkLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAjIEFkZCB0aGUgaW5zdGFsbCByZWNvcmQgdG8gdGhlIGZsaWdodCBwbGFuIHBhcmFtcwogICAgICAgICAgICAgICAgcGxhbl9wYXJhbXMgPSB7CiAgICAgICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pbnN0YWxsX2lkIjogc2VsZi5pZCwgICMgcHlsaW50OiBkaXNhYmxlPW5vLW1lbWJlcgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2l0aCBzZWxmLmVudi5jci5zYXZlcG9pbnQoKToKICAgICAgICAgICAgICAgICAgICAjIFJ1biB0aGUgZmxpZ2h0IHBsYW4gKGV4Y2VwdGlvbnMgaGFuZGxlZCBpbnNpZGUgdGhlIGZsaWdodCBwbGFuKQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyX2lkLnJ1bl9mbGlnaHRfcGxhbigKICAgICAgICAgICAgICAgICAgICAgICAgZmxpZ2h0X3BsYW49ZmxpZ2h0X3BsYW4sCiAgICAgICAgICAgICAgICAgICAgICAgIGpldF90ZW1wbGF0ZT1pbnN0YWxsYXRpb25fdGFzay5qZXRfdGVtcGxhdGVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICoqeyJwbGFuX2xvZyI6IHBsYW5fcGFyYW1zfSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAjIEZsaWdodCBwbGFuIHdpbGwgdHJpZ2dlciB0aGUgYF9wcm9jZXNzX2luc3RhbGxgIGZ1bmN0aW9uIGFnYWluCiAgICAgICAgICAgICAgICAjIGlmIHRoZSBmbGlnaHQgcGxhbiBpcyBmaW5pc2hlZCBzdWNjZXNzZnVsbHkuCiAgICAgICAgICAgICAgICAjIFNvIHdlIGRvbid0IG5lZWQgY29udGludWUgdGhlIGxvb3AgaW4gdGhpcyBjYXNlLgogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAjIE1hcmsgdGhlIGluc3RhbGxhdGlvbiB0YXNrIGFzICJEb25lIgogICAgICAgICAgICAjIGJlY2F1c2Ugbm90aGluZyBlbHNlIGlzIHRvIGJlIGRvbmUgaGVyZS4KICAgICAgICAgICAgaW5zdGFsbGF0aW9uX3Rhc2sud3JpdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInN0YXRlIjogImRvbmUiLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgICAgICMgQWRkIHRvIHRoZSBsaXN0IG9mIGluc3RhbGxlZCB0ZW1wbGF0ZXMKICAgICAgICAgICAgaWYgc2VsZi5hY3Rpb24gPT0gImluc3RhbGwiOgogICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uX3Rhc2suamV0X3RlbXBsYXRlX2lkLndyaXRlKAogICAgICAgICAgICAgICAgICAgIHsic2VydmVyX2lkcyI6IFsoNCwgc2VsZi5zZXJ2ZXJfaWQuaWQpXX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbl90YXNrLmpldF90ZW1wbGF0ZV9pZC53cml0ZSgKICAgICAgICAgICAgICAgICAgICB7InNlcnZlcl9pZHMiOiBbKDMsIHNlbGYuc2VydmVyX2lkLmlkKV19CiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAjIFJlZnJlc2ggdGhlIGZyb250ZW5kIHZpZXdzCiAgICAgICAgICAgIHNlbGYuZW52LnVzZXIucmVsb2FkX3ZpZXdzKAogICAgICAgICAgICAgICAgbW9kZWw9ImN4LnRvd2VyLmpldC50ZW1wbGF0ZS5pbnN0YWxsIiwKICAgICAgICAgICAgICAgIHJlY19pZHM9W3NlbGYuaWRdLAogICAgICAgICAgICApCgogICAgICAgICMgTWFyayB0aGUgaW5zdGFsbGF0aW9uIGFzIGRvbmUKICAgICAgICBub3cgPSBmaWVsZHMuRGF0ZXRpbWUubm93KCkKICAgICAgICBzZWxmLndyaXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic3RhdGUiOiAiZG9uZSIsCiAgICAgICAgICAgICAgICAiZGF0ZV9kb25lIjogbm93LAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFJlZnJlc2ggdGhlIGZyb250ZW5kIHZpZXdzCiAgICAgICAgc2VsZi5lbnYudXNlci5yZWxvYWRfdmlld3MoCiAgICAgICAgICAgIG1vZGVsPSJjeC50b3dlci5qZXQudGVtcGxhdGUuaW5zdGFsbCIsIHJlY19pZHM9W3NlbGYuaWRdCiAgICAgICAgKQogICAgICAgIHNlbGYuZW52LnVzZXIucmVsb2FkX3ZpZXdzKAogICAgICAgICAgICBtb2RlbD0iY3gudG93ZXIuc2VydmVyIiwgdmlld190eXBlcz1bImZvcm0iXSwgcmVjX2lkcz1bc2VsZi5zZXJ2ZXJfaWQuaWRdCiAgICAgICAgKQogICAgICAgIHNlbGYuZW52LnVzZXIucmVsb2FkX3ZpZXdzKAogICAgICAgICAgICBtb2RlbD0iY3gudG93ZXIuamV0LnRlbXBsYXRlIiwKICAgICAgICAgICAgdmlld190eXBlcz1bImZvcm0iXSwKICAgICAgICAgICAgcmVjX2lkcz1bc2VsZi5qZXRfdGVtcGxhdGVfaWQuaWRdLAogICAgICAgICkKCiAgICAgICAgIyBDaGVjayBpZiBub3RpZmljYXRpb25zIGFyZSBlbmFibGVkCiAgICAgICAgSUNQX3N1ZG8gPSBzZWxmLmVudlsiaXIuY29uZmlnX3BhcmFtZXRlciJdLnN1ZG8oKQogICAgICAgIG5vdGlmaWNhdGlvbl90eXBlX3N1Y2Nlc3MgPSBJQ1Bfc3Vkby5nZXRfcGFyYW0oCiAgICAgICAgICAgICJjZXRtaXhfdG93ZXJfc2VydmVyLm5vdGlmaWNhdGlvbl90eXBlX3N1Y2Nlc3MiCiAgICAgICAgKQogICAgICAgICMgU2VuZCBub3RpZmljYXRpb24gdG8gdGhlIHVzZXIKICAgICAgICBpZiBub3RpZmljYXRpb25fdHlwZV9zdWNjZXNzOgogICAgICAgICAgICAjIEFjdGlvbiBmb3IgYnV0dG9uCiAgICAgICAgICAgIGFjdGlvbiA9IHNlbGYuZW52WyJpci5hY3Rpb25zLmFjdF93aW5kb3ciXS5fZm9yX3htbF9pZCgKICAgICAgICAgICAgICAgICJjZXRtaXhfdG93ZXJfc2VydmVyLmN4X3Rvd2VyX2pldF90ZW1wbGF0ZV9pbnN0YWxsX2FjdGlvbiIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgY29udGV4dCA9IHNlbGYuZW52LmNvbnRleHQuY29weSgpCiAgICAgICAgICAgIHBhcmFtcyA9IGRpY3QoY29udGV4dC5nZXQoInBhcmFtcyIpIG9yIHt9KQogICAgICAgICAgICBwYXJhbXNbImJ1dHRvbl9uYW1lIl0gPSBfKCJWaWV3IEluc3RhbGxhdGlvbiIpCiAgICAgICAgICAgIGNvbnRleHRbInBhcmFtcyJdID0gcGFyYW1zCgogICAgICAgICAgICAjIEFkZCByZWNvcmQgaWQgYW5kIGNvbnRleHQgdG8gdGhlIGFjdGlvbgogICAgICAgICAgICBhY3Rpb24udXBkYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJjb250ZXh0IjogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAicmVzX2lkIjogc2VsZi5pZCwKICAgICAgICAgICAgICAgICAgICAidmlld3MiOiBbKEZhbHNlLCAiZm9ybSIpXSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQogICAgICAgICAgICAjIFNlbmQgc3VjY2VzcyBub3RpZmljYXRpb24KICAgICAgICAgICAgc2VsZi5lbnYudXNlci5ub3RpZnlfc3VjY2VzcygKICAgICAgICAgICAgICAgIG1lc3NhZ2U9XygKICAgICAgICAgICAgICAgICAgICAiJSh0aW1lc3RhbXApczxici8+IgogICAgICAgICAgICAgICAgICAgICIlKGFjdGlvbilzIGNvbXBsZXRlZCBvbiBzZXJ2ZXIgJyUoc2VydmVyX25hbWUpcyciLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbj1fKCJJbnN0YWxsYXRpb24iKQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuYWN0aW9uID09ICJpbnN0YWxsIgogICAgICAgICAgICAgICAgICAgIGVsc2UgXygiVW5pbnN0YWxsYXRpb24iKSwKICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfbmFtZT1zZWxmLnNlcnZlcl9pZC5uYW1lLAogICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcD1maWVsZHMuRGF0ZXRpbWUuY29udGV4dF90aW1lc3RhbXAoc2VsZiwgbm93KSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICB0aXRsZT1zZWxmLmpldF90ZW1wbGF0ZV9pZC5uYW1lLCAgIyBweWxpbnQ6IGRpc2FibGU9bm8tbWVtYmVyCiAgICAgICAgICAgICAgICBzdGlja3k9bm90aWZpY2F0aW9uX3R5cGVfc3VjY2VzcyA9PSAic3RpY2t5IiwKICAgICAgICAgICAgICAgIGFjdGlvbj1hY3Rpb24sCiAgICAgICAgICAgICkKCiAgICBkZWYgX2ZsaWdodF9wbGFuX2ZpbmlzaGVkKHNlbGYsIHBsYW5fc3RhdHVzKToKICAgICAgICAiIiIKICAgICAgICBUcmlnZ2VyZWQgd2hlbiBhIGZsaWdodCBwbGFuIHRoYXQgaXMgdXNlZCBmb3IgaW5zdGFsbGluZy91bmluc3RhbGxpbmcKICAgICAgICBhIHRlbXBsYXRlIGlzIGZpbmlzaGVkLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBwbGFuX3N0YXR1cyAoaW50KTogVGhlIGV4aXQgY29kZSBvZiB0aGUgZmxpZ2h0IHBsYW4uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnN1cmVfb25lKCkKCiAgICAgICAgIyBWYWxpZGF0ZSBjYWxsYmFjayBzdGF0ZQogICAgICAgIGlmIG5vdCBzZWxmLmN1cnJlbnRfbGluZV9pZDoKICAgICAgICAgICAgX2xvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgIkNhbGxiYWNrIGludm9rZWQgd2l0aCBubyBjdXJyZW50X2xpbmVfaWQgZm9yIGluc3RhbGwgJXMiLCBzZWxmLmlkCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIHNlbGYuc3RhdGUgIT0gInByb2Nlc3NpbmciOgogICAgICAgICAgICBfbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAiQ2FsbGJhY2sgaW52b2tlZCBmb3IgaW5zdGFsbCAlcyBpbiBzdGF0ZSAlcyIsIHNlbGYuaWQsIHNlbGYuc3RhdGUKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBGbGlnaHQgcGxhbiBmaW5pc2hlZCBzdWNjZXNzZnVsbHkKICAgICAgICBpZiBwbGFuX3N0YXR1cyA9PSAwOgogICAgICAgICAgICAjIE1hcmsgY3VycmVudCBsaW5lIGFzIGRvbmUKICAgICAgICAgICAgc2VsZi5jdXJyZW50X2xpbmVfaWQud3JpdGUoICAjIHB5bGludDogZGlzYWJsZT1uby1tZW1iZXIKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiAiZG9uZSIsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKICAgICAgICAgICAgIyBBZGQgdGVtcGxhdGUgdG8gdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIHRlbXBsYXRlcwogICAgICAgICAgICAjIG9yIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IGlmIGl0IGlzIGJlaW5nIHVuaW5zdGFsbGVkCiAgICAgICAgICAgIGlmIHNlbGYuYWN0aW9uID09ICJpbnN0YWxsIjoKICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9saW5lX2lkLmpldF90ZW1wbGF0ZV9pZC53cml0ZSggICMgcHlsaW50OiBkaXNhYmxlPW5vLW1lbWJlcgogICAgICAgICAgICAgICAgICAgIHsic2VydmVyX2lkcyI6IFsoNCwgc2VsZi5zZXJ2ZXJfaWQuaWQpXX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9saW5lX2lkLmpldF90ZW1wbGF0ZV9pZC53cml0ZSggICMgcHlsaW50OiBkaXNhYmxlPW5vLW1lbWJlcgogICAgICAgICAgICAgICAgICAgIHsic2VydmVyX2lkcyI6IFsoMywgc2VsZi5zZXJ2ZXJfaWQuaWQpXX0KICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgUmVtb3ZlIHRoZSBsaW5rIHRvIHRoZSBjdXJyZW50IGxpbmUgYW5kIGNvbnRpbnVlCiAgICAgICAgICAgIHNlbGYud3JpdGUoeyJjdXJyZW50X2xpbmVfaWQiOiBGYWxzZX0pCgogICAgICAgICAgICAjIFJlZnJlc2ggdGhlIGZyb250ZW5kIHZpZXdzCiAgICAgICAgICAgIHNlbGYuZW52LnVzZXIucmVsb2FkX3ZpZXdzKAogICAgICAgICAgICAgICAgbW9kZWw9ImN4LnRvd2VyLmpldC50ZW1wbGF0ZS5pbnN0YWxsIiwKICAgICAgICAgICAgICAgIHJlY19pZHM9W3NlbGYuaWRdLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3NfaW5zdGFsbCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBNYXJrIGN1cnJlbnQgbGluZSBhcyBmYWlsZWQKICAgICAgICAgICAgc2VsZi5jdXJyZW50X2xpbmVfaWQud3JpdGUoICAjIHB5bGludDogZGlzYWJsZT1uby1tZW1iZXIKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiAiZmFpbGVkIiwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQogICAgICAgICAgICAjIENsZWFyIHRoZSBjdXJyZW50IGxpbmUgbGluawogICAgICAgICAgICBzZWxmLndyaXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJmYWlsZWQiLAogICAgICAgICAgICAgICAgICAgICJkYXRlX2RvbmUiOiBmaWVsZHMuRGF0ZXRpbWUubm93KCksCiAgICAgICAgICAgICAgICAgICAgImN1cnJlbnRfbGluZV9pZCI6IEZhbHNlLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCgogICAgICAgICAgICAjIFNldCBhbGwgb3RoZXIgJ3RvX3Byb2Nlc3MnIGxpbmVzIGFzIGZhaWxlZAogICAgICAgICAgICBzZWxmLmxpbmVfaWRzLmZpbHRlcmVkKGxhbWJkYSBsaW5lOiBsaW5lLnN0YXRlID09ICJ0b19wcm9jZXNzIikud3JpdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInN0YXRlIjogImZhaWxlZCIsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgUmVmcmVzaCB0aGUgZnJvbnRlbmQgdmlld3MKICAgICAgICAgICAgc2VsZi5lbnYudXNlci5yZWxvYWRfdmlld3MoCiAgICAgICAgICAgICAgICBtb2RlbD0iY3gudG93ZXIuamV0LnRlbXBsYXRlLmluc3RhbGwiLAogICAgICAgICAgICAgICAgcmVjX2lkcz1bc2VsZi5pZF0sCiAgICAgICAgICAgICkKICAgICAgICAgICAgIyBTZW5kIG5vdGlmaWNhdGlvbiB0byB0aGUgdXNlcgogICAgICAgICAgICAjIENoZWNrIGlmIG5vdGlmaWNhdGlvbnMgYXJlIGVuYWJsZWQKICAgICAgICAgICAgSUNQX3N1ZG8gPSBzZWxmLmVudlsiaXIuY29uZmlnX3BhcmFtZXRlciJdLnN1ZG8oKQogICAgICAgICAgICBub3RpZmljYXRpb25fdHlwZV9lcnJvciA9IElDUF9zdWRvLmdldF9wYXJhbSgKICAgICAgICAgICAgICAgICJjZXRtaXhfdG93ZXJfc2VydmVyLm5vdGlmaWNhdGlvbl90eXBlX2Vycm9yIgogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIG5vdGlmaWNhdGlvbl90eXBlX2Vycm9yOgogICAgICAgICAgICAgICAgIyBBY3Rpb24gZm9yIGJ1dHRvbgogICAgICAgICAgICAgICAgYWN0aW9uID0gc2VsZi5lbnZbImlyLmFjdGlvbnMuYWN0X3dpbmRvdyJdLl9mb3JfeG1sX2lkKAogICAgICAgICAgICAgICAgICAgICJjZXRtaXhfdG93ZXJfc2VydmVyLmN4X3Rvd2VyX2pldF90ZW1wbGF0ZV9pbnN0YWxsX2FjdGlvbiIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBjb250ZXh0ID0gc2VsZi5lbnYuY29udGV4dC5jb3B5KCkKICAgICAgICAgICAgICAgIHBhcmFtcyA9IGRpY3QoY29udGV4dC5nZXQoInBhcmFtcyIpIG9yIHt9KQogICAgICAgICAgICAgICAgcGFyYW1zWyJidXR0b25fbmFtZSJdID0gXygiVmlldyBJbnN0YWxsYXRpb24iKQogICAgICAgICAgICAgICAgY29udGV4dFsicGFyYW1zIl0gPSBwYXJhbXMKCiAgICAgICAgICAgICAgICAjIEFkZCByZWNvcmQgaWQgYW5kIGNvbnRleHQgdG8gdGhlIGFjdGlvbgogICAgICAgICAgICAgICAgYWN0aW9uLnVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZXh0IjogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgInJlc19pZCI6IHNlbGYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3cyI6IFsoRmFsc2UsICJmb3JtIildLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICMgU2VuZCBlcnJvciBub3RpZmljYXRpb24KICAgICAgICAgICAgICAgIHNlbGYuZW52LnVzZXIubm90aWZ5X2RhbmdlcigKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPV8oCiAgICAgICAgICAgICAgICAgICAgICAgICIlKHRpbWVzdGFtcClzPGJyLz4iCiAgICAgICAgICAgICAgICAgICAgICAgICIlKGFjdGlvbilzIGZhaWxlZCBvbiBzZXJ2ZXIgJyUoc2VydmVyX25hbWUpcyciLAogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249XygiSW5zdGFsbGF0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5hY3Rpb24gPT0gImluc3RhbGwiCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXygiVW5pbnN0YWxsYXRpb24iKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX25hbWU9c2VsZi5zZXJ2ZXJfaWQubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wPWZpZWxkcy5EYXRldGltZS5jb250ZXh0X3RpbWVzdGFtcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGZpZWxkcy5EYXRldGltZS5ub3coKQogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgdGl0bGU9c2VsZi5qZXRfdGVtcGxhdGVfaWQubmFtZSwKICAgICAgICAgICAgICAgICAgICBzdGlja3k9bm90aWZpY2F0aW9uX3R5cGVfZXJyb3IgPT0gInN0aWNreSIsCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uPWFjdGlvbiwKICAgICAgICAgICAgICAgICkKCiAgICBkZWYgYWN0aW9uX3ZpZXdfZmxpZ2h0X3BsYW5fbG9ncyhzZWxmKToKICAgICAgICAiIiJPcGVuIGZsaWdodCBwbGFuIGxvZ3MgcmVsYXRlZCB0byB0aGlzIGluc3RhbGxhdGlvbiIiIgogICAgICAgIHNlbGYuZW5zdXJlX29uZSgpCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJuYW1lIjogXygKICAgICAgICAgICAgICAgICJGbGlnaHQgUGxhbiBMb2dzIC0gJShpbnN0YWxsX25hbWUpcyIsCiAgICAgICAgICAgICAgICBpbnN0YWxsX25hbWU9c2VsZi5qZXRfdGVtcGxhdGVfaWQubmFtZSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgInR5cGUiOiAiaXIuYWN0aW9ucy5hY3Rfd2luZG93IiwKICAgICAgICAgICAgInJlc19tb2RlbCI6ICJjeC50b3dlci5wbGFuLmxvZyIsCiAgICAgICAgICAgICJ2aWV3X21vZGUiOiAidHJlZSxmb3JtIiwKICAgICAgICAgICAgImRvbWFpbiI6IFsoImpldF90ZW1wbGF0ZV9pbnN0YWxsX2lkIiwgIj0iLCBzZWxmLmlkKV0sICAjIHB5bGludDogZGlzYWJsZT1uby1tZW1iZXIKICAgICAgICB9Cg== \ No newline at end of file