1 line
10 KiB
Python
1 line
10 KiB
Python
IyBDb3B5cmlnaHQgKEMpIDIwMjQgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KZnJvbSBqaW5qYTIgaW1wb3J0IEVudmlyb25tZW50LCBUZW1wbGF0ZSwgbWV0YQpmcm9tIGppbmphMi5leGNlcHRpb25zIGltcG9ydCBUZW1wbGF0ZVN5bnRheEVycm9yCgpmcm9tIG9kb28gaW1wb3J0IF8sIGFwaSwgZmllbGRzLCBtb2RlbHMKZnJvbSBvZG9vLmV4Y2VwdGlvbnMgaW1wb3J0IFVzZXJFcnJvciwgVmFsaWRhdGlvbkVycm9yCgoKY2xhc3MgQ3hUb3dlclRlbXBsYXRlTWl4aW4obW9kZWxzLkFic3RyYWN0TW9kZWwpOgogICAgIiIiVXNlZCB0byBpbXBsZW1lbnQgdGVtcGxhdGUgcmVuZGVyaW5nIGZ1bmN0aW9ucy4KICAgIEluaGVyaXQgaW4geW91ciBtb2RlbCBpbiBjYXNlIHlvdSB3YW50IHRvIHJlbmRlciB2YXJpYWJsZSB2YWx1ZXMgaW4gaXQuCiAgICAiIiIKCiAgICBfbmFtZSA9ICJjeC50b3dlci50ZW1wbGF0ZS5taXhpbiIKICAgIF9kZXNjcmlwdGlvbiA9ICJDZXRtaXggVG93ZXIgdGVtcGxhdGUgcmVuZGVyaW5nIG1peGluIgoKICAgIGNvZGUgPSBmaWVsZHMuVGV4dChoZWxwPSJUaGlzIGZpZWxkIHdpbGwgYmUgcmVuZGVyZWQgdXNpbmcgdmFyaWFibGVzIikKICAgIHZhcmlhYmxlX2lkcyA9IGZpZWxkcy5NYW55Mm1hbnkoCiAgICAgICAgc3RyaW5nPSJWYXJpYWJsZXMiLAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIudmFyaWFibGUiLAogICAgICAgIGNvbXB1dGU9Il9jb21wdXRlX3ZhcmlhYmxlX2lkcyIsCiAgICAgICAgc3RvcmU9VHJ1ZSwKICAgICAgICBjb3B5PUZhbHNlLAogICAgKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9nZXRfZGVwZW5kc19maWVsZHMoY2xzKToKICAgICAgICAiIiIKICAgICAgICBEZWZpbmUgZGVwZW5kZW50IGZpZWxkcyBmb3IgdGhlIGB2YXJpYWJsZV9pZHNgIGNvbXB1dGF0aW9uLgoKICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBpbiBpbmhlcml0aW5nIG1vZGVscyB0byBwcm92aWRlCiAgICAgICAgYSBsaXN0IG9mIGZpZWxkcyB0aGF0IGluZmx1ZW5jZSB0aGUgY29tcHV0YXRpb24gb2YgYHZhcmlhYmxlX2lkc2AuCiAgICAgICAgVGhlc2UgZmllbGRzIGFyZSB1c2VkIGluIHRoZSBgQGFwaS5kZXBlbmRzYCBkZWNvcmF0b3IgdG8gdHJpZ2dlcgogICAgICAgIHJlY29tcHV0YXRpb24gd2hlbiB0aGVpciB2YWx1ZXMgY2hhbmdlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBsaXN0OiBBIGxpc3Qgb2YgZmllbGQgbmFtZXMgKHN0cikgdGhhdCBhcmUgZGVwZW5kZW5jaWVzIGZvcgogICAgICAgICAgICAgICAgICB0aGUgYHZhcmlhYmxlX2lkc2AgY29tcHV0YXRpb24uIERlZmF1bHQgaXMgYW4gZW1wdHkgbGlzdC4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgSW4gYSBzdWJjbGFzcywgb3ZlcnJpZGUgYXMgZm9sbG93czoKICAgICAgICAgICAgPj4+IEBjbGFzc21ldGhvZAogICAgICAgICAgICA+Pj4gZGVmIF9nZXRfZGVwZW5kc19maWVsZHMoY2xzKToKICAgICAgICAgICAgPj4+ICAgICByZXR1cm4gWyJjb2RlIiwgInBhdGgiXQogICAgICAgICIiIgogICAgICAgIHJldHVybiBbXQoKICAgIEBhcGkuZGVwZW5kcyhsYW1iZGEgc2VsZjogc2VsZi5fZ2V0X2RlcGVuZHNfZmllbGRzKCkpCiAgICBkZWYgX2NvbXB1dGVfdmFyaWFibGVfaWRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENvbXB1dGUgdGhlIHZhbHVlcyBvZiB0aGUgYHZhcmlhYmxlX2lkc2AKICAgICAgICBmaWVsZCBiYXNlZCBvbiBtb2RlbC1zcGVjaWZpYyBkZXBlbmRlbmNpZXMuCgogICAgICAgIFRoaXMgbWV0aG9kIHJldHJpZXZlcyB0aGUgZGVwZW5kZW50IGZpZWxkcyB1c2luZyBgX2dldF9kZXBlbmRzX2ZpZWxkc2AKICAgICAgICBhbmQgZHluYW1pY2FsbHkgY2FsY3VsYXRlcyB0aGUgdmFsdWVzIG9mIGB2YXJpYWJsZV9pZHNgIHVzaW5nIHRoZQogICAgICAgIGBfcHJlcGFyZV92YXJpYWJsZV9jb21tYW5kc2AgbWV0aG9kLgoKICAgICAgICBJZiBubyBkZXBlbmRlbnQgZmllbGRzIG9yIHJlbGF0aW9uIHBhcmFtZXRlcnMgYXJlIGRlZmluZWQsIHRoZSBmaWVsZAogICAgICAgIGlzIHJlc2V0IHRvIGFuIGVtcHR5IGxpc3QuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgIElmIGRlcGVuZGVudCBmaWVsZHMgaW5jbHVkZSBgY29kZWAgYW5kIGBwYXRoYCwgYW5kIHRoZSBtb2RlbC1zcGVjaWZpYwogICAgICAgICAgICBsb2dpYyBsaW5rcyB0aGVtIHRvIHZhcmlhYmxlcywgdGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIGB2YXJpYWJsZV9pZHNgCiAgICAgICAgICAgIGZpZWxkIGFjY29yZGluZ2x5LgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIFZhbGlkYXRpb25FcnJvcjogSWYgdGhlIGZpZWxkIG1ldGFkYXRhIGlzIGluY29ycmVjdGx5IGRlZmluZWQgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZXMuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIE5vbmU6IFRoZSBmaWVsZCBgdmFyaWFibGVfaWRzYCBpcyB1cGRhdGVkIGluLXBsYWNlIGZvciBlYWNoIHJlY29yZC4KICAgICAgICAiIiIKICAgICAgICBkZXBlbmRzX2ZpZWxkcyA9IHNlbGYuX2dldF9kZXBlbmRzX2ZpZWxkcygpCgogICAgICAgIGZvciByZWNvcmQgaW4gc2VsZjoKICAgICAgICAgICAgaWYgZGVwZW5kc19maWVsZHM6CiAgICAgICAgICAgICAgICByZWNvcmQudmFyaWFibGVfaWRzID0gcmVjb3JkLl9wcmVwYXJlX3ZhcmlhYmxlX2NvbW1hbmRzKGRlcGVuZHNfZmllbGRzKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVjb3JkLnZhcmlhYmxlX2lkcyA9IFsoNSwgMCwgMCldCgogICAgZGVmIHJlbmRlcl9jb2RlKHNlbGYsIHB5dGhvbmljX21vZGU9RmFsc2UsICoqa3dhcmdzKToKICAgICAgICAiIiJSZW5kZXIgcmVjb3JkICdjb2RlJyBmaWVsZCB1c2luZyB2YXJpYWJsZXMgZnJvbSBrd2FyZ3MKICAgICAgICBDYWxsIHRvIHJlbmRlciByZWNvcmRzZXQgb2YgdGhlIGluaGVyaXRpbmcgbW9kZWxzCiAgICAgICAgQXJnczoKICAgICAgICAgICAgcHl0aG9uaWNfbW9kZSAoQm9vbCk6IElmIFRydWUsIGFsbCB2YXJpYWJsZXMgaW4ga3dhcmdzIGFyZSBjb252ZXJ0ZWQgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MgYW5kIHdyYXBwZWQgaW4gZG91YmxlIHF1b3Rlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgRmFsc2UuCiAgICAgICAgICAgICoqa3dhcmdzIChkaWN0KToge3ZhcmlhYmxlOiB2YWx1ZSwgLi4ufQogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGRpY3Qge3JlY29yZF9pZDogcmVuZGVyZWRfY29kZSwgLi4ufQogICAgICAgICIiIgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJlYy5pZDogc2VsZi5yZW5kZXJfY29kZV9jdXN0b20ocmVjLmNvZGUsIHB5dGhvbmljX21vZGUsICoqa3dhcmdzKQogICAgICAgICAgICBmb3IgcmVjIGluIHNlbGYKICAgICAgICB9CgogICAgZGVmIHJlbmRlcl9jb2RlX2N1c3RvbShzZWxmLCBjb2RlLCBweXRob25pY19tb2RlPUZhbHNlLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgUmVuZGVyIGN1c3RvbSBjb2RlIHVzaW5nIHZhcmlhYmxlcyBmcm9tIGt3YXJncwoKICAgICAgICBUaGlzIG1ldGhvZCByZW5kZXJzIGEgdGVtcGxhdGUgc3RyaW5nIChjb2RlKSB1c2luZyB0aGUgdmFyaWFibGVzIHByb3ZpZGVkCiAgICAgICAgaW4ga3dhcmdzLiBJZiBweXRob25pY19tb2RlIGlzIGVuYWJsZWQsIGFsbCB2YXJpYWJsZXMgYXJlIGF1dG9tYXRpY2FsbHkKICAgICAgICBjb252ZXJ0ZWQgdG8gc3RyaW5ncyBhbmQgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyBiZWZvcmUgcmVuZGVyaW5nLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBjb2RlIChUZXh0KTogY29kZSB0byByZW5kZXIgKGVnICdzb21lIHt7IGN1c3RvbSB9fSB0ZXh0JykKICAgICAgICAgICAgcHl0aG9uaWNfbW9kZSAoQm9vbCk6IElmIFRydWUsIGFsbCB2YXJpYWJsZXMgaW4ga3dhcmdzIGFyZSBjb252ZXJ0ZWQgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MgYW5kIHdyYXBwZWQgaW4gZG91YmxlIHF1b3Rlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgRmFsc2UuCiAgICAgICAgICAgICoqa3dhcmdzIChkaWN0KToge3ZhcmlhYmxlOiB2YWx1ZSwgLi4ufQogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIHJlbmRlcmVkX2NvZGUgKHRleHQpOiBUaGUgcmVzdWx0aW5nIHN0cmluZyBhZnRlciByZW5kZXJpbmcgdGhlIHRlbXBsYXRlIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm92aWRlZCB2YXJpYWJsZXMuCiAgICAgICAgIiIiCgogICAgICAgICMgUmV0dXJuIHRoZSBvcmlnaW5hbCBjb2RlIGlmIGl0J3MgZW1wdHkuCiAgICAgICAgIyBTbyBpZiBpdCdzIEZhbHNlIHRoZW4gd2UgcHJlc2VydmUgdGhlIG9yaWdpbmFsICdGYWxzZScgdmFsdWUuCiAgICAgICAgaWYgbm90IGNvZGU6CiAgICAgICAgICAgIHJldHVybiBjb2RlCgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgcHl0aG9uaWNfbW9kZToKICAgICAgICAgICAgICAgIGt3YXJncyA9IHsKICAgICAgICAgICAgICAgICAgICBrZXk6IHNlbGYuX21ha2VfdmFsdWVfcHl0aG9uaWModmFsdWUpCiAgICAgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4ga3dhcmdzLml0ZW1zKCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlKGNvZGUsIHRyaW1fYmxvY2tzPVRydWUpLnJlbmRlcihrd2FyZ3MpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICByYWlzZSBVc2VyRXJyb3Ioc3RyKGUpKSBmcm9tIGUKCiAgICBkZWYgZ2V0X3ZhcmlhYmxlcyhzZWxmKToKICAgICAgICAiIiJHZXQgdGhlIGxpc3Qgb2YgdmFyaWFibGVzIGZvciB0ZW1wbGF0ZXMKICAgICAgICBDYWxsIHRvIGdldCB2YXJpYWJsZXMgZm9yIHJlY29yZHNldCBvZiB0aGUgaW5oZXJpdGluZyBtb2RlbHMKCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgZGljdCB7J3JlY29yZF9pZCc6IHt2YXJpYWJsZXN9Li4ufQogICAgICAgICAgICAgICAgTkI6ICdyZWNvcmRfaWQnIGlzIFN0cmluZwogICAgICAgICIiIgogICAgICAgIHJlcyA9IHt9CiAgICAgICAgZm9yIHJlYyBpbiBzZWxmOgogICAgICAgICAgICByZXNbc3RyKHJlYy5pZCldID0gc2VsZi5nZXRfdmFyaWFibGVzX2Zyb21fY29kZShyZWMuY29kZSkKICAgICAgICByZXR1cm4gcmVzCgogICAgZGVmIGdldF92YXJpYWJsZXNfZnJvbV9jb2RlKHNlbGYsIGNvZGUpOgogICAgICAgICIiIkdldCB0aGUgbGlzdCBvZiB2YXJpYWJsZXMgZm9yIHRlbXBsYXRlcwogICAgICAgIENhbGwgdG8gZ2V0IHZhcmlhYmxlcyBmcm9tIGN1c3RvbSBjb2RlIHN0cmluZwoKICAgICAgICBBcmdzOgogICAgICAgICAgICBjb2RlIChUZXh0KSBjdXN0b20gY29kZSAoZWcgJ0N1c3RvbSB7eyB2YXIgfX0ge3sgdmFyMiB9fSAuLi4nKQogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIHZhcmlhYmxlcyAoTGlzdCkgdmFyaWFibGVzIChlZyBbJ3ZhcicsJ3ZhcjInLC4uXSkKICAgICAgICAiIiIKICAgICAgICBlbnYgPSBFbnZpcm9ubWVudCgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBhc3QgPSBlbnYucGFyc2UoY29kZSkKICAgICAgICAgICAgdW5kZWNsYXJlZF92YXJpYWJsZXMgPSBtZXRhLmZpbmRfdW5kZWNsYXJlZF92YXJpYWJsZXMoYXN0KQogICAgICAgICAgICByZXR1cm4gbGlzdCh1bmRlY2xhcmVkX3ZhcmlhYmxlcykgaWYgdW5kZWNsYXJlZF92YXJpYWJsZXMgZWxzZSBbXQogICAgICAgIGV4Y2VwdCBUZW1wbGF0ZVN5bnRheEVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIFZhbGlkYXRpb25FcnJvcihfKCJWYXJpYWJsZSBzeW50YXggZXJyb3I6ICVzIiwgZSkpIGZyb20gZQoKICAgIGRlZiBfcHJlcGFyZV92YXJpYWJsZV9jb21tYW5kcyhzZWxmLCBmaWVsZF9uYW1lcywgZm9yY2VfcmVjb3JkPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFByZXBhcmVzIGNvbW1hbmRzIHRvIHNldCB2YXJpYWJsZSByZWZlcmVuY2VzIGZyb20gdGhlIGdpdmVuIGZpZWxkcy4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgZmllbGRfbmFtZXMgKGxpc3QpOiBMaXN0IG9mIGZpZWxkIG5hbWVzIHRvIGV4dHJhY3QgdmFyaWFibGUgcmVmZXJlbmNlcyBmcm9tLgogICAgICAgICAgICBmb3JjZV9yZWNvcmQgKHJlY29yZCwgb3B0aW9uYWwpOiBBIHJlY29yZCB0byB1c2UgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBvbmUuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGxpc3Q6IEFuIE9kb28gY29tbWFuZCB0byBhc3NpZ24gb3IgY2xlYXIgdmFyaWFibGUgcmVmZXJlbmNlcy4KICAgICAgICAiIiIKICAgICAgICByZWNvcmQgPSBmb3JjZV9yZWNvcmQgb3Igc2VsZgogICAgICAgIHJlY29yZC5lbnN1cmVfb25lKCkKCiAgICAgICAgYWxsX3JlZmVyZW5jZXMgPSBzZXQoKQogICAgICAgIGZvciBmaWVsZF9uYW1lIGluIGZpZWxkX25hbWVzOgogICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIocmVjb3JkLCBmaWVsZF9uYW1lLCBOb25lKQogICAgICAgICAgICBpZiB2YWx1ZToKICAgICAgICAgICAgICAgIGFsbF9yZWZlcmVuY2VzLnVwZGF0ZShzZWxmLmdldF92YXJpYWJsZXNfZnJvbV9jb2RlKHZhbHVlKSkKCiAgICAgICAgaWYgYWxsX3JlZmVyZW5jZXM6CiAgICAgICAgICAgIHZhcmlhYmxlcyA9IHNlbGYuZW52WyJjeC50b3dlci52YXJpYWJsZSJdLnNlYXJjaCgKICAgICAgICAgICAgICAgIFsoInJlZmVyZW5jZSIsICJpbiIsIGxpc3QoYWxsX3JlZmVyZW5jZXMpKV0KICAgICAgICAgICAgKQogICAgICAgICAgICBjb21tYW5kID0gWyg2LCAwLCB2YXJpYWJsZXMuaWRzKV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBjb21tYW5kID0gWyg1LCAwLCAwKV0KCiAgICAgICAgcmV0dXJuIGNvbW1hbmQKCiAgICBkZWYgX21ha2VfdmFsdWVfcHl0aG9uaWMoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIlByZXBhcmVzIHZhbHVlIGZvciB1c2UgaW4gJ3B5dGhvbmljJyBtb2RlCiAgICAgICAgICAgIGJ5IGVuY2xvc2luZyBzdHJpbmdzIGludG8gZG91YmxlIHF1b3RlcwoKICAgICAgICBBcmdzOgogICAgICAgICAgICB2YWx1ZSAoQ2hhcik6IHZhbHVlIHRvIHByb2Nlc3MKCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQ2hhcjogcHJvY2Vzc2VkIHZhbHVlCiAgICAgICAgIiIiCgogICAgICAgICMgTm90aGluZyB0byBkbyBoZXJlCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYm9vbCkgb3IgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUKCiAgICAgICAgIyBIYW5kbGUgbmVzdGVkIGRpY3RzIHN1Y2ggYXMgc3lzdGVtIHZhcmlhYmxlcwogICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCk6CiAgICAgICAgICAgIHJlc3VsdCA9IHt9CiAgICAgICAgICAgIGZvciBrZXksIHZhbCBpbiB2YWx1ZS5pdGVtcygpOgogICAgICAgICAgICAgICAgcmVzdWx0LnVwZGF0ZSh7a2V5OiBzZWxmLl9tYWtlX3ZhbHVlX3B5dGhvbmljKHZhbCl9KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgRW5jbG9zZSBpbiBkb3VibGUgcXVvdGVzCiAgICAgICAgICAgIHJlc3VsdCA9IGYnInt2YWx1ZX0iJwogICAgICAgIHJldHVybiByZXN1bHQK |