REDROOM
PHP 8.0.30
Path:
Logout
Edit File
Size: 34.41 KB
Close
/proc/thread-self/root/opt/alt/python37/lib64/python3.7/site-packages/sqlalchemy/ext/__pycache__/automap.cpython-37.pyc
Text
Base64
Qg0NCgAAAADDzDRd7qIAAOMAAAAAAAAAAAAAAAAEAAAAQAAAAHPSAAAAZABaAGQBZAJsAW0CWgMBAGQBZANsBG0FWgUBAGQEZAVsBm0HWgcBAGQEZAZsCG0JWgkBAGQEZAdsCG0KWgsBAGQEZAhsCG0MWgwBAGQEZAlsCG0NWg0BAGQEZApsDm0PWg8BAGQEZAtsEG0RWhEBAGQEZAxsEm0TWhMBAGQNZA6EAFoUZA9kEIQAWhVkEWQShABaFmQTZBSEAFoXRwBkFWQWhABkFmUYgwNaGWQgZBhkGYQBWhpkGmQbhABaG2QcZB2EAFocZB5kH4QAWh1kF1MAKSFhQlAAAERlZmluZSBhbiBleHRlbnNpb24gdG8gdGhlIDptb2Q6YHNxbGFsY2hlbXkuZXh0LmRlY2xhcmF0aXZlYCBzeXN0ZW0Kd2hpY2ggYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgbWFwcGVkIGNsYXNzZXMgYW5kIHJlbGF0aW9uc2hpcHMgZnJvbSBhIGRhdGFiYXNlCnNjaGVtYSwgdHlwaWNhbGx5IHRob3VnaCBub3QgbmVjZXNzYXJpbHkgb25lIHdoaWNoIGlzIHJlZmxlY3RlZC4KCi4uIHZlcnNpb25hZGRlZDo6IDAuOS4xIEFkZGVkIDptb2Q6YHNxbGFsY2hlbXkuZXh0LmF1dG9tYXBgLgoKSXQgaXMgaG9wZWQgdGhhdCB0aGUgOmNsYXNzOmAuQXV0b21hcEJhc2VgIHN5c3RlbSBwcm92aWRlcyBhIHF1aWNrCmFuZCBtb2Rlcm5pemVkIHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtIHRoYXQgdGhlIHZlcnkgZmFtb3VzCmBTUUxTb3VwIDxodHRwczovL3NxbHNvdXAucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0Lz5gXwphbHNvIHRyaWVzIHRvIHNvbHZlLCB0aGF0IG9mIGdlbmVyYXRpbmcgYSBxdWljayBhbmQgcnVkaW1lbnRhcnkgb2JqZWN0Cm1vZGVsIGZyb20gYW4gZXhpc3RpbmcgZGF0YWJhc2Ugb24gdGhlIGZseS4gIEJ5IGFkZHJlc3NpbmcgdGhlIGlzc3VlIHN0cmljdGx5CmF0IHRoZSBtYXBwZXIgY29uZmlndXJhdGlvbiBsZXZlbCwgYW5kIGludGVncmF0aW5nIGZ1bGx5IHdpdGggZXhpc3RpbmcKRGVjbGFyYXRpdmUgY2xhc3MgdGVjaG5pcXVlcywgOmNsYXNzOmAuQXV0b21hcEJhc2VgIHNlZWtzIHRvIHByb3ZpZGUKYSB3ZWxsLWludGVncmF0ZWQgYXBwcm9hY2ggdG8gdGhlIGlzc3VlIG9mIGV4cGVkaWVudGx5IGF1dG8tZ2VuZXJhdGluZyBhZC1ob2MKbWFwcGluZ3MuCgoKQmFzaWMgVXNlCj09PT09PT09PQoKVGhlIHNpbXBsZXN0IHVzYWdlIGlzIHRvIHJlZmxlY3QgYW4gZXhpc3RpbmcgZGF0YWJhc2UgaW50byBhIG5ldyBtb2RlbC4KV2UgY3JlYXRlIGEgbmV3IDpjbGFzczpgLkF1dG9tYXBCYXNlYCBjbGFzcyBpbiBhIHNpbWlsYXIgbWFubmVyIGFzIHRvIGhvdwp3ZSBjcmVhdGUgYSBkZWNsYXJhdGl2ZSBiYXNlIGNsYXNzLCB1c2luZyA6ZnVuYzpgLmF1dG9tYXBfYmFzZWAuCldlIHRoZW4gY2FsbCA6bWV0aDpgLkF1dG9tYXBCYXNlLnByZXBhcmVgIG9uIHRoZSByZXN1bHRpbmcgYmFzZSBjbGFzcywKYXNraW5nIGl0IHRvIHJlZmxlY3QgdGhlIHNjaGVtYSBhbmQgcHJvZHVjZSBtYXBwaW5nczo6CgogICAgZnJvbSBzcWxhbGNoZW15LmV4dC5hdXRvbWFwIGltcG9ydCBhdXRvbWFwX2Jhc2UKICAgIGZyb20gc3FsYWxjaGVteS5vcm0gaW1wb3J0IFNlc3Npb24KICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgY3JlYXRlX2VuZ2luZQoKICAgIEJhc2UgPSBhdXRvbWFwX2Jhc2UoKQoKICAgICMgZW5naW5lLCBzdXBwb3NlIGl0IGhhcyB0d28gdGFibGVzICd1c2VyJyBhbmQgJ2FkZHJlc3MnIHNldCB1cAogICAgZW5naW5lID0gY3JlYXRlX2VuZ2luZSgic3FsaXRlOi8vL215ZGF0YWJhc2UuZGIiKQoKICAgICMgcmVmbGVjdCB0aGUgdGFibGVzCiAgICBCYXNlLnByZXBhcmUoZW5naW5lLCByZWZsZWN0PVRydWUpCgogICAgIyBtYXBwZWQgY2xhc3NlcyBhcmUgbm93IGNyZWF0ZWQgd2l0aCBuYW1lcyBieSBkZWZhdWx0CiAgICAjIG1hdGNoaW5nIHRoYXQgb2YgdGhlIHRhYmxlIG5hbWUuCiAgICBVc2VyID0gQmFzZS5jbGFzc2VzLnVzZXIKICAgIEFkZHJlc3MgPSBCYXNlLmNsYXNzZXMuYWRkcmVzcwoKICAgIHNlc3Npb24gPSBTZXNzaW9uKGVuZ2luZSkKCiAgICAjIHJ1ZGltZW50YXJ5IHJlbGF0aW9uc2hpcHMgYXJlIHByb2R1Y2VkCiAgICBzZXNzaW9uLmFkZChBZGRyZXNzKGVtYWlsX2FkZHJlc3M9ImZvb0BiYXIuY29tIiwgdXNlcj1Vc2VyKG5hbWU9ImZvbyIpKSkKICAgIHNlc3Npb24uY29tbWl0KCkKCiAgICAjIGNvbGxlY3Rpb24tYmFzZWQgcmVsYXRpb25zaGlwcyBhcmUgYnkgZGVmYXVsdCBuYW1lZAogICAgIyAiPGNsYXNzbmFtZT5fY29sbGVjdGlvbiIKICAgIHByaW50ICh1MS5hZGRyZXNzX2NvbGxlY3Rpb24pCgpBYm92ZSwgY2FsbGluZyA6bWV0aDpgLkF1dG9tYXBCYXNlLnByZXBhcmVgIHdoaWxlIHBhc3NpbmcgYWxvbmcgdGhlCjpwYXJhbXJlZjpgLkF1dG9tYXBCYXNlLnByZXBhcmUucmVmbGVjdGAgcGFyYW1ldGVyIGluZGljYXRlcyB0aGF0IHRoZQo6bWV0aDpgLk1ldGFEYXRhLnJlZmxlY3RgIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbiB0aGlzIGRlY2xhcmF0aXZlIGJhc2UKY2xhc3NlcycgOmNsYXNzOmAuTWV0YURhdGFgIGNvbGxlY3Rpb247IHRoZW4sIGVhY2ggKip2aWFibGUqKgo6Y2xhc3M6YC5UYWJsZWAgd2l0aGluIHRoZSA6Y2xhc3M6YC5NZXRhRGF0YWAgd2lsbCBnZXQgYSBuZXcgbWFwcGVkIGNsYXNzCmdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LiAgVGhlIDpjbGFzczpgLkZvcmVpZ25LZXlDb25zdHJhaW50YCBvYmplY3RzIHdoaWNoCmxpbmsgdGhlIHZhcmlvdXMgdGFibGVzIHRvZ2V0aGVyIHdpbGwgYmUgdXNlZCB0byBwcm9kdWNlIG5ldywgYmlkaXJlY3Rpb25hbAo6ZnVuYzpgLnJlbGF0aW9uc2hpcGAgb2JqZWN0cyBiZXR3ZWVuIGNsYXNzZXMuICAgVGhlIGNsYXNzZXMgYW5kIHJlbGF0aW9uc2hpcHMKZm9sbG93IGFsb25nIGEgZGVmYXVsdCBuYW1pbmcgc2NoZW1lIHRoYXQgd2UgY2FuIGN1c3RvbWl6ZS4gIEF0IHRoaXMgcG9pbnQsCm91ciBiYXNpYyBtYXBwaW5nIGNvbnNpc3Rpbmcgb2YgcmVsYXRlZCBgYFVzZXJgYCBhbmQgYGBBZGRyZXNzYGAgY2xhc3NlcyBpcwpyZWFkeSB0byB1c2UgaW4gdGhlIHRyYWRpdGlvbmFsIHdheS4KCi4uIG5vdGU6OiBCeSAqKnZpYWJsZSoqLCB3ZSBtZWFuIHRoYXQgZm9yIGEgdGFibGUgdG8gYmUgbWFwcGVkLCBpdCBtdXN0CiAgIHNwZWNpZnkgYSBwcmltYXJ5IGtleS4gIEFkZGl0aW9uYWxseSwgaWYgdGhlIHRhYmxlIGlzIGRldGVjdGVkIGFzIGJlaW5nCiAgIGEgcHVyZSBhc3NvY2lhdGlvbiB0YWJsZSBiZXR3ZWVuIHR3byBvdGhlciB0YWJsZXMsIGl0IHdpbGwgbm90IGJlIGRpcmVjdGx5CiAgIG1hcHBlZCBhbmQgd2lsbCBpbnN0ZWFkIGJlIGNvbmZpZ3VyZWQgYXMgYSBtYW55LXRvLW1hbnkgdGFibGUgYmV0d2VlbgogICB0aGUgbWFwcGluZ3MgZm9yIHRoZSB0d28gcmVmZXJyaW5nIHRhYmxlcy4KCkdlbmVyYXRpbmcgTWFwcGluZ3MgZnJvbSBhbiBFeGlzdGluZyBNZXRhRGF0YQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCldlIGNhbiBwYXNzIGEgcHJlLWRlY2xhcmVkIDpjbGFzczpgLk1ldGFEYXRhYCBvYmplY3QgdG8gOmZ1bmM6YC5hdXRvbWFwX2Jhc2VgLgpUaGlzIG9iamVjdCBjYW4gYmUgY29uc3RydWN0ZWQgaW4gYW55IHdheSwgaW5jbHVkaW5nIHByb2dyYW1tYXRpY2FsbHksIGZyb20KYSBzZXJpYWxpemVkIGZpbGUsIG9yIGZyb20gaXRzZWxmIGJlaW5nIHJlZmxlY3RlZCB1c2luZwo6bWV0aDpgLk1ldGFEYXRhLnJlZmxlY3RgLiAgQmVsb3cgd2UgaWxsdXN0cmF0ZSBhIGNvbWJpbmF0aW9uIG9mIHJlZmxlY3Rpb24gYW5kCmV4cGxpY2l0IHRhYmxlIGRlY2xhcmF0aW9uOjoKCiAgICBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IGNyZWF0ZV9lbmdpbmUsIE1ldGFEYXRhLCBUYWJsZSwgQ29sdW1uLCBGb3JlaWduS2V5CiAgICBmcm9tIHNxbGFsY2hlbXkuZXh0LmF1dG9tYXAgaW1wb3J0IGF1dG9tYXBfYmFzZQogICAgZW5naW5lID0gY3JlYXRlX2VuZ2luZSgic3FsaXRlOi8vL215ZGF0YWJhc2UuZGIiKQoKICAgICMgcHJvZHVjZSBvdXIgb3duIE1ldGFEYXRhIG9iamVjdAogICAgbWV0YWRhdGEgPSBNZXRhRGF0YSgpCgogICAgIyB3ZSBjYW4gcmVmbGVjdCBpdCBvdXJzZWx2ZXMgZnJvbSBhIGRhdGFiYXNlLCB1c2luZyBvcHRpb25zCiAgICAjIHN1Y2ggYXMgJ29ubHknIHRvIGxpbWl0IHdoYXQgdGFibGVzIHdlIGxvb2sgYXQuLi4KICAgIG1ldGFkYXRhLnJlZmxlY3QoZW5naW5lLCBvbmx5PVsndXNlcicsICdhZGRyZXNzJ10pCgogICAgIyAuLi4gb3IganVzdCBkZWZpbmUgb3VyIG93biBUYWJsZSBvYmplY3RzIHdpdGggaXQgKG9yIGNvbWJpbmUgYm90aCkKICAgIFRhYmxlKCd1c2VyX29yZGVyJywgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgQ29sdW1uKCdpZCcsIEludGVnZXIsIHByaW1hcnlfa2V5PVRydWUpLAogICAgICAgICAgICAgICAgICAgIENvbHVtbigndXNlcl9pZCcsIEZvcmVpZ25LZXkoJ3VzZXIuaWQnKSkKICAgICAgICAgICAgICAgICkKCiAgICAjIHdlIGNhbiB0aGVuIHByb2R1Y2UgYSBzZXQgb2YgbWFwcGluZ3MgZnJvbSB0aGlzIE1ldGFEYXRhLgogICAgQmFzZSA9IGF1dG9tYXBfYmFzZShtZXRhZGF0YT1tZXRhZGF0YSkKCiAgICAjIGNhbGxpbmcgcHJlcGFyZSgpIGp1c3Qgc2V0cyB1cCBtYXBwZWQgY2xhc3NlcyBhbmQgcmVsYXRpb25zaGlwcy4KICAgIEJhc2UucHJlcGFyZSgpCgogICAgIyBtYXBwZWQgY2xhc3NlcyBhcmUgcmVhZHkKICAgIFVzZXIsIEFkZHJlc3MsIE9yZGVyID0gQmFzZS5jbGFzc2VzLnVzZXIsIEJhc2UuY2xhc3Nlcy5hZGRyZXNzLFwKICAgICAgICBCYXNlLmNsYXNzZXMudXNlcl9vcmRlcgoKU3BlY2lmeWluZyBDbGFzc2VzIEV4cGxpY2l0bHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSA6bW9kOmAuc3FsYWxjaGVteS5leHQuYXV0b21hcGAgZXh0ZW5zaW9uIGFsbG93cyBjbGFzc2VzIHRvIGJlIGRlZmluZWQKZXhwbGljaXRseSwgaW4gYSB3YXkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSA6Y2xhc3M6YC5EZWZlcnJlZFJlZmxlY3Rpb25gIGNsYXNzLgpDbGFzc2VzIHRoYXQgZXh0ZW5kIGZyb20gOmNsYXNzOmAuQXV0b21hcEJhc2VgIGFjdCBsaWtlIHJlZ3VsYXIgZGVjbGFyYXRpdmUKY2xhc3NlcywgYnV0IGFyZSBub3QgaW1tZWRpYXRlbHkgbWFwcGVkIGFmdGVyIHRoZWlyIGNvbnN0cnVjdGlvbiwgYW5kIGFyZQppbnN0ZWFkIG1hcHBlZCB3aGVuIHdlIGNhbGwgOm1ldGg6YC5BdXRvbWFwQmFzZS5wcmVwYXJlYC4gIFRoZQo6bWV0aDpgLkF1dG9tYXBCYXNlLnByZXBhcmVgIG1ldGhvZCB3aWxsIG1ha2UgdXNlIG9mIHRoZSBjbGFzc2VzIHdlJ3ZlCmVzdGFibGlzaGVkIGJhc2VkIG9uIHRoZSB0YWJsZSBuYW1lIHdlIHVzZS4gIElmIG91ciBzY2hlbWEgY29udGFpbnMgdGFibGVzCmBgdXNlcmBgIGFuZCBgYGFkZHJlc3NgYCwgd2UgY2FuIGRlZmluZSBvbmUgb3IgYm90aCBvZiB0aGUgY2xhc3NlcyB0byBiZSB1c2VkOjoKCiAgICBmcm9tIHNxbGFsY2hlbXkuZXh0LmF1dG9tYXAgaW1wb3J0IGF1dG9tYXBfYmFzZQogICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBjcmVhdGVfZW5naW5lCgogICAgIyBhdXRvbWFwIGJhc2UKICAgIEJhc2UgPSBhdXRvbWFwX2Jhc2UoKQoKICAgICMgcHJlLWRlY2xhcmUgVXNlciBmb3IgdGhlICd1c2VyJyB0YWJsZQogICAgY2xhc3MgVXNlcihCYXNlKToKICAgICAgICBfX3RhYmxlbmFtZV9fID0gJ3VzZXInCgogICAgICAgICMgb3ZlcnJpZGUgc2NoZW1hIGVsZW1lbnRzIGxpa2UgQ29sdW1ucwogICAgICAgIHVzZXJfbmFtZSA9IENvbHVtbignbmFtZScsIFN0cmluZykKCiAgICAgICAgIyBvdmVycmlkZSByZWxhdGlvbnNoaXBzIHRvbywgaWYgZGVzaXJlZC4KICAgICAgICAjIHdlIG11c3QgdXNlIHRoZSBzYW1lIG5hbWUgdGhhdCBhdXRvbWFwIHdvdWxkIHVzZSBmb3IgdGhlCiAgICAgICAgIyByZWxhdGlvbnNoaXAsIGFuZCBhbHNvIG11c3QgcmVmZXIgdG8gdGhlIGNsYXNzIG5hbWUgdGhhdCBhdXRvbWFwIHdpbGwKICAgICAgICAjIGdlbmVyYXRlIGZvciAiYWRkcmVzcyIKICAgICAgICBhZGRyZXNzX2NvbGxlY3Rpb24gPSByZWxhdGlvbnNoaXAoImFkZHJlc3MiLCBjb2xsZWN0aW9uX2NsYXNzPXNldCkKCiAgICAjIHJlZmxlY3QKICAgIGVuZ2luZSA9IGNyZWF0ZV9lbmdpbmUoInNxbGl0ZTovLy9teWRhdGFiYXNlLmRiIikKICAgIEJhc2UucHJlcGFyZShlbmdpbmUsIHJlZmxlY3Q9VHJ1ZSkKCiAgICAjIHdlIHN0aWxsIGhhdmUgQWRkcmVzcyBnZW5lcmF0ZWQgZnJvbSB0aGUgdGFibGVuYW1lICJhZGRyZXNzIiwKICAgICMgYnV0IFVzZXIgaXMgdGhlIHNhbWUgYXMgQmFzZS5jbGFzc2VzLlVzZXIgbm93CgogICAgQWRkcmVzcyA9IEJhc2UuY2xhc3Nlcy5hZGRyZXNzCgogICAgdTEgPSBzZXNzaW9uLnF1ZXJ5KFVzZXIpLmZpcnN0KCkKICAgIHByaW50ICh1MS5hZGRyZXNzX2NvbGxlY3Rpb24pCgogICAgIyB0aGUgYmFja3JlZiBpcyBzdGlsbCB0aGVyZToKICAgIGExID0gc2Vzc2lvbi5xdWVyeShBZGRyZXNzKS5maXJzdCgpCiAgICBwcmludCAoYTEudXNlcikKCkFib3ZlLCBvbmUgb2YgdGhlIG1vcmUgaW50cmljYXRlIGRldGFpbHMgaXMgdGhhdCB3ZSBpbGx1c3RyYXRlZCBvdmVycmlkaW5nCm9uZSBvZiB0aGUgOmZ1bmM6YC5yZWxhdGlvbnNoaXBgIG9iamVjdHMgdGhhdCBhdXRvbWFwIHdvdWxkIGhhdmUgY3JlYXRlZC4KVG8gZG8gdGhpcywgd2UgbmVlZGVkIHRvIG1ha2Ugc3VyZSB0aGUgbmFtZXMgbWF0Y2ggdXAgd2l0aCB3aGF0IGF1dG9tYXAKd291bGQgbm9ybWFsbHkgZ2VuZXJhdGUsIGluIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBuYW1lIHdvdWxkIGJlCmBgVXNlci5hZGRyZXNzX2NvbGxlY3Rpb25gYCBhbmQgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHJlZmVycmVkIHRvLCBmcm9tCmF1dG9tYXAncyBwZXJzcGVjdGl2ZSwgaXMgY2FsbGVkIGBgYWRkcmVzc2BgLCBldmVuIHRob3VnaCB3ZSBhcmUgcmVmZXJyaW5nIHRvCml0IGFzIGBgQWRkcmVzc2BgIHdpdGhpbiBvdXIgdXNhZ2Ugb2YgdGhpcyBjbGFzcy4KCk92ZXJyaWRpbmcgTmFtaW5nIFNjaGVtZXMKPT09PT09PT09PT09PT09PT09PT09PT09PQoKOm1vZDpgLnNxbGFsY2hlbXkuZXh0LmF1dG9tYXBgIGlzIHRhc2tlZCB3aXRoIHByb2R1Y2luZyBtYXBwZWQgY2xhc3NlcyBhbmQKcmVsYXRpb25zaGlwIG5hbWVzIGJhc2VkIG9uIGEgc2NoZW1hLCB3aGljaCBtZWFucyBpdCBoYXMgZGVjaXNpb24gcG9pbnRzIGluIGhvdwp0aGVzZSBuYW1lcyBhcmUgZGV0ZXJtaW5lZC4gIFRoZXNlIHRocmVlIGRlY2lzaW9uIHBvaW50cyBhcmUgcHJvdmlkZWQgdXNpbmcKZnVuY3Rpb25zIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG8gdGhlIDptZXRoOmAuQXV0b21hcEJhc2UucHJlcGFyZWAgbWV0aG9kLCBhbmQKYXJlIGtub3duIGFzIDpmdW5jOmAuY2xhc3NuYW1lX2Zvcl90YWJsZWAsCjpmdW5jOmAubmFtZV9mb3Jfc2NhbGFyX3JlbGF0aW9uc2hpcGAsCmFuZCA6ZnVuYzpgLm5hbWVfZm9yX2NvbGxlY3Rpb25fcmVsYXRpb25zaGlwYC4gIEFueSBvciBhbGwgb2YgdGhlc2UKZnVuY3Rpb25zIGFyZSBwcm92aWRlZCBhcyBpbiB0aGUgZXhhbXBsZSBiZWxvdywgd2hlcmUgd2UgdXNlIGEgImNhbWVsIGNhc2UiCnNjaGVtZSBmb3IgY2xhc3MgbmFtZXMgYW5kIGEgInBsdXJhbGl6ZXIiIGZvciBjb2xsZWN0aW9uIG5hbWVzIHVzaW5nIHRoZQpgSW5mbGVjdCA8aHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS9pbmZsZWN0PmBfIHBhY2thZ2U6OgoKICAgIGltcG9ydCByZQogICAgaW1wb3J0IGluZmxlY3QKCiAgICBkZWYgY2FtZWxpemVfY2xhc3NuYW1lKGJhc2UsIHRhYmxlbmFtZSwgdGFibGUpOgogICAgICAgICJQcm9kdWNlIGEgJ2NhbWVsaXplZCcgY2xhc3MgbmFtZSwgZS5nLiAiCiAgICAgICAgIid3b3Jkc19hbmRfdW5kZXJzY29yZXMnIC0+ICdXb3Jkc0FuZFVuZGVyc2NvcmVzJyIKCiAgICAgICAgcmV0dXJuIHN0cih0YWJsZW5hbWVbMF0udXBwZXIoKSArIFwKICAgICAgICAgICAgICAgIHJlLnN1YihyJ18oW2Etel0pJywgbGFtYmRhIG06IG0uZ3JvdXAoMSkudXBwZXIoKSwgdGFibGVuYW1lWzE6XSkpCgogICAgX3BsdXJhbGl6ZXIgPSBpbmZsZWN0LmVuZ2luZSgpCiAgICBkZWYgcGx1cmFsaXplX2NvbGxlY3Rpb24oYmFzZSwgbG9jYWxfY2xzLCByZWZlcnJlZF9jbHMsIGNvbnN0cmFpbnQpOgogICAgICAgICJQcm9kdWNlIGFuICd1bmNhbWVsaXplZCcsICdwbHVyYWxpemVkJyBjbGFzcyBuYW1lLCBlLmcuICIKICAgICAgICAiJ1NvbWVUZXJtJyAtPiAnc29tZV90ZXJtcyciCgogICAgICAgIHJlZmVycmVkX25hbWUgPSByZWZlcnJlZF9jbHMuX19uYW1lX18KICAgICAgICB1bmNhbWVsaXplZCA9IHJlLnN1YihyJ1tBLVpdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgbTogIl8lcyIgJSBtLmdyb3VwKDApLmxvd2VyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZWRfbmFtZSlbMTpdCiAgICAgICAgcGx1cmFsaXplZCA9IF9wbHVyYWxpemVyLnBsdXJhbCh1bmNhbWVsaXplZCkKICAgICAgICByZXR1cm4gcGx1cmFsaXplZAoKICAgIGZyb20gc3FsYWxjaGVteS5leHQuYXV0b21hcCBpbXBvcnQgYXV0b21hcF9iYXNlCgogICAgQmFzZSA9IGF1dG9tYXBfYmFzZSgpCgogICAgZW5naW5lID0gY3JlYXRlX2VuZ2luZSgic3FsaXRlOi8vL215ZGF0YWJhc2UuZGIiKQoKICAgIEJhc2UucHJlcGFyZShlbmdpbmUsIHJlZmxlY3Q9VHJ1ZSwKICAgICAgICAgICAgICAgIGNsYXNzbmFtZV9mb3JfdGFibGU9Y2FtZWxpemVfY2xhc3NuYW1lLAogICAgICAgICAgICAgICAgbmFtZV9mb3JfY29sbGVjdGlvbl9yZWxhdGlvbnNoaXA9cGx1cmFsaXplX2NvbGxlY3Rpb24KICAgICAgICApCgpGcm9tIHRoZSBhYm92ZSBtYXBwaW5nLCB3ZSB3b3VsZCBub3cgaGF2ZSBjbGFzc2VzIGBgVXNlcmBgIGFuZCBgYEFkZHJlc3NgYCwKd2hlcmUgdGhlIGNvbGxlY3Rpb24gZnJvbSBgYFVzZXJgYCB0byBgYEFkZHJlc3NgYCBpcyBjYWxsZWQKYGBVc2VyLmFkZHJlc3Nlc2BgOjoKCiAgICBVc2VyLCBBZGRyZXNzID0gQmFzZS5jbGFzc2VzLlVzZXIsIEJhc2UuY2xhc3Nlcy5BZGRyZXNzCgogICAgdTEgPSBVc2VyKGFkZHJlc3Nlcz1bQWRkcmVzcyhlbWFpbD0iZm9vQGJhci5jb20iKV0pCgpSZWxhdGlvbnNoaXAgRGV0ZWN0aW9uCj09PT09PT09PT09PT09PT09PT09PT0KClRoZSB2YXN0IG1ham9yaXR5IG9mIHdoYXQgYXV0b21hcCBhY2NvbXBsaXNoZXMgaXMgdGhlIGdlbmVyYXRpb24gb2YKOmZ1bmM6YC5yZWxhdGlvbnNoaXBgIHN0cnVjdHVyZXMgYmFzZWQgb24gZm9yZWlnbiBrZXlzLiAgVGhlIG1lY2hhbmlzbQpieSB3aGljaCB0aGlzIHdvcmtzIGZvciBtYW55LXRvLW9uZSBhbmQgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwcyBpcyBhcwpmb2xsb3dzOgoKMS4gQSBnaXZlbiA6Y2xhc3M6YC5UYWJsZWAsIGtub3duIHRvIGJlIG1hcHBlZCB0byBhIHBhcnRpY3VsYXIgY2xhc3MsCiAgIGlzIGV4YW1pbmVkIGZvciA6Y2xhc3M6YC5Gb3JlaWduS2V5Q29uc3RyYWludGAgb2JqZWN0cy4KCjIuIEZyb20gZWFjaCA6Y2xhc3M6YC5Gb3JlaWduS2V5Q29uc3RyYWludGAsIHRoZSByZW1vdGUgOmNsYXNzOmAuVGFibGVgCiAgIG9iamVjdCBwcmVzZW50IGlzIG1hdGNoZWQgdXAgdG8gdGhlIGNsYXNzIHRvIHdoaWNoIGl0IGlzIHRvIGJlIG1hcHBlZCwKICAgaWYgYW55LCBlbHNlIGl0IGlzIHNraXBwZWQuCgozLiBBcyB0aGUgOmNsYXNzOmAuRm9yZWlnbktleUNvbnN0cmFpbnRgIHdlIGFyZSBleGFtaW5pbmcgY29ycmVzcG9uZHMgdG8gYQogICByZWZlcmVuY2UgZnJvbSB0aGUgaW1tZWRpYXRlIG1hcHBlZCBjbGFzcywgIHRoZSByZWxhdGlvbnNoaXAgd2lsbCBiZSBzZXQgdXAKICAgYXMgYSBtYW55LXRvLW9uZSByZWZlcnJpbmcgdG8gdGhlIHJlZmVycmVkIGNsYXNzOyBhIGNvcnJlc3BvbmRpbmcKICAgb25lLXRvLW1hbnkgYmFja3JlZiB3aWxsIGJlIGNyZWF0ZWQgb24gdGhlIHJlZmVycmVkIGNsYXNzIHJlZmVycmluZwogICB0byB0aGlzIGNsYXNzLgoKNC4gSWYgYW55IG9mIHRoZSBjb2x1bW5zIHRoYXQgYXJlIHBhcnQgb2YgdGhlIDpjbGFzczpgLkZvcmVpZ25LZXlDb25zdHJhaW50YAogICBhcmUgbm90IG51bGxhYmxlIChlLmcuIGBgbnVsbGFibGU9RmFsc2VgYCksIGEKICAgOnBhcmFtcmVmOmB+LnJlbGF0aW9uc2hpcC5jYXNjYWRlYCBrZXl3b3JkIGFyZ3VtZW50CiAgIG9mIGBgYWxsLCBkZWxldGUtb3JwaGFuYGAgd2lsbCBiZSBhZGRlZCB0byB0aGUga2V5d29yZCBhcmd1bWVudHMgdG8KICAgYmUgcGFzc2VkIHRvIHRoZSByZWxhdGlvbnNoaXAgb3IgYmFja3JlZi4gIElmIHRoZQogICA6Y2xhc3M6YC5Gb3JlaWduS2V5Q29uc3RyYWludGAgcmVwb3J0cyB0aGF0CiAgIDpwYXJhbXJlZjpgLkZvcmVpZ25LZXlDb25zdHJhaW50Lm9uZGVsZXRlYAogICBpcyBzZXQgdG8gYGBDQVNDQURFYGAgZm9yIGEgbm90IG51bGwgb3IgYGBTRVQgTlVMTGBgIGZvciBhIG51bGxhYmxlCiAgIHNldCBvZiBjb2x1bW5zLCB0aGUgb3B0aW9uIDpwYXJhbXJlZjpgfi5yZWxhdGlvbnNoaXAucGFzc2l2ZV9kZWxldGVzYAogICBmbGFnIGlzIHNldCB0byBgYFRydWVgYCBpbiB0aGUgc2V0IG9mIHJlbGF0aW9uc2hpcCBrZXl3b3JkIGFyZ3VtZW50cy4KICAgTm90ZSB0aGF0IG5vdCBhbGwgYmFja2VuZHMgc3VwcG9ydCByZWZsZWN0aW9uIG9mIE9OIERFTEVURS4KCiAgIC4uIHZlcnNpb25hZGRlZDo6IDEuMC4wIC0gYXV0b21hcCB3aWxsIGRldGVjdCBub24tbnVsbGFibGUgZm9yZWlnbiBrZXkKICAgICAgY29uc3RyYWludHMgd2hlbiBwcm9kdWNpbmcgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgYW5kIGVzdGFibGlzaAogICAgICBhIGRlZmF1bHQgY2FzY2FkZSBvZiBgYGFsbCwgZGVsZXRlLW9ycGhhbmBgIGlmIHNvOyBhZGRpdGlvbmFsbHksCiAgICAgIGlmIHRoZSBjb25zdHJhaW50IHNwZWNpZmllcyA6cGFyYW1yZWY6YC5Gb3JlaWduS2V5Q29uc3RyYWludC5vbmRlbGV0ZWAKICAgICAgb2YgYGBDQVNDQURFYGAgZm9yIG5vbi1udWxsYWJsZSBvciBgYFNFVCBOVUxMYGAgZm9yIG51bGxhYmxlIGNvbHVtbnMsCiAgICAgIHRoZSBgYHBhc3NpdmVfZGVsZXRlcz1UcnVlYGAgb3B0aW9uIGlzIGFsc28gYWRkZWQuCgo1LiBUaGUgbmFtZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgYXJlIGRldGVybWluZWQgdXNpbmcgdGhlCiAgIDpwYXJhbXJlZjpgLkF1dG9tYXBCYXNlLnByZXBhcmUubmFtZV9mb3Jfc2NhbGFyX3JlbGF0aW9uc2hpcGAgYW5kCiAgIDpwYXJhbXJlZjpgLkF1dG9tYXBCYXNlLnByZXBhcmUubmFtZV9mb3JfY29sbGVjdGlvbl9yZWxhdGlvbnNoaXBgCiAgIGNhbGxhYmxlIGZ1bmN0aW9ucy4gIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGRlZmF1bHQgcmVsYXRpb25zaGlwCiAgIG5hbWluZyBkZXJpdmVzIHRoZSBuYW1lIGZyb20gdGhlICoqdGhlIGFjdHVhbCBjbGFzcyBuYW1lKiouICBJZiB5b3UndmUKICAgZ2l2ZW4gYSBwYXJ0aWN1bGFyIGNsYXNzIGFuIGV4cGxpY2l0IG5hbWUgYnkgZGVjbGFyaW5nIGl0LCBvciBzcGVjaWZpZWQgYW4KICAgYWx0ZXJuYXRlIGNsYXNzIG5hbWluZyBzY2hlbWUsIHRoYXQncyB0aGUgbmFtZSBmcm9tIHdoaWNoIHRoZSByZWxhdGlvbnNoaXAKICAgbmFtZSB3aWxsIGJlIGRlcml2ZWQuCgo2LiBUaGUgY2xhc3NlcyBhcmUgaW5zcGVjdGVkIGZvciBhbiBleGlzdGluZyBtYXBwZWQgcHJvcGVydHkgbWF0Y2hpbmcgdGhlc2UKICAgbmFtZXMuICBJZiBvbmUgaXMgZGV0ZWN0ZWQgb24gb25lIHNpZGUsIGJ1dCBub25lIG9uIHRoZSBvdGhlciBzaWRlLAogICA6Y2xhc3M6YC5BdXRvbWFwQmFzZWAgYXR0ZW1wdHMgdG8gY3JlYXRlIGEgcmVsYXRpb25zaGlwIG9uIHRoZSBtaXNzaW5nIHNpZGUsCiAgIHRoZW4gdXNlcyB0aGUgOnBhcmFtcmVmOmAucmVsYXRpb25zaGlwLmJhY2tfcG9wdWxhdGVzYCBwYXJhbWV0ZXIgaW4gb3JkZXIgdG8KICAgcG9pbnQgdGhlIG5ldyByZWxhdGlvbnNoaXAgdG8gdGhlIG90aGVyIHNpZGUuCgo3LiBJbiB0aGUgdXN1YWwgY2FzZSB3aGVyZSBubyByZWxhdGlvbnNoaXAgaXMgb24gZWl0aGVyIHNpZGUsCiAgIDptZXRoOmAuQXV0b21hcEJhc2UucHJlcGFyZWAgcHJvZHVjZXMgYSA6ZnVuYzpgLnJlbGF0aW9uc2hpcGAgb24gdGhlCiAgICJtYW55LXRvLW9uZSIgc2lkZSBhbmQgbWF0Y2hlcyBpdCB0byB0aGUgb3RoZXIgdXNpbmcgdGhlCiAgIDpwYXJhbXJlZjpgLnJlbGF0aW9uc2hpcC5iYWNrcmVmYCBwYXJhbWV0ZXIuCgo4LiBQcm9kdWN0aW9uIG9mIHRoZSA6ZnVuYzpgLnJlbGF0aW9uc2hpcGAgYW5kIG9wdGlvbmFsbHkgdGhlIDpmdW5jOmAuYmFja3JlZmAKICAgaXMgaGFuZGVkIG9mZiB0byB0aGUgOnBhcmFtcmVmOmAuQXV0b21hcEJhc2UucHJlcGFyZS5nZW5lcmF0ZV9yZWxhdGlvbnNoaXBgCiAgIGZ1bmN0aW9uLCB3aGljaCBjYW4gYmUgc3VwcGxpZWQgYnkgdGhlIGVuZC11c2VyIGluIG9yZGVyIHRvIGF1Z21lbnQKICAgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gOmZ1bmM6YC5yZWxhdGlvbnNoaXBgIG9yIDpmdW5jOmAuYmFja3JlZmAgb3IgdG8KICAgbWFrZSB1c2Ugb2YgY3VzdG9tIGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMuCgpDdXN0b20gUmVsYXRpb25zaGlwIEFyZ3VtZW50cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIDpwYXJhbXJlZjpgLkF1dG9tYXBCYXNlLnByZXBhcmUuZ2VuZXJhdGVfcmVsYXRpb25zaGlwYCBob29rIGNhbiBiZSB1c2VkCnRvIGFkZCBwYXJhbWV0ZXJzIHRvIHJlbGF0aW9uc2hpcHMuICBGb3IgbW9zdCBjYXNlcywgd2UgY2FuIG1ha2UgdXNlIG9mIHRoZQpleGlzdGluZyA6ZnVuYzpgLmF1dG9tYXAuZ2VuZXJhdGVfcmVsYXRpb25zaGlwYCBmdW5jdGlvbiB0byByZXR1cm4KdGhlIG9iamVjdCwgYWZ0ZXIgYXVnbWVudGluZyB0aGUgZ2l2ZW4ga2V5d29yZCBkaWN0aW9uYXJ5IHdpdGggb3VyIG93bgphcmd1bWVudHMuCgpCZWxvdyBpcyBhbiBpbGx1c3RyYXRpb24gb2YgaG93IHRvIHNlbmQKOnBhcmFtcmVmOmAucmVsYXRpb25zaGlwLmNhc2NhZGVgIGFuZAo6cGFyYW1yZWY6YC5yZWxhdGlvbnNoaXAucGFzc2l2ZV9kZWxldGVzYApvcHRpb25zIGFsb25nIHRvIGFsbCBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXBzOjoKCiAgICBmcm9tIHNxbGFsY2hlbXkuZXh0LmF1dG9tYXAgaW1wb3J0IGdlbmVyYXRlX3JlbGF0aW9uc2hpcAoKICAgIGRlZiBfZ2VuX3JlbGF0aW9uc2hpcChiYXNlLCBkaXJlY3Rpb24sIHJldHVybl9mbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cm5hbWUsIGxvY2FsX2NscywgcmVmZXJyZWRfY2xzLCAqKmt3KToKICAgICAgICBpZiBkaXJlY3Rpb24gaXMgaW50ZXJmYWNlcy5PTkVUT01BTlk6CiAgICAgICAgICAgIGt3WydjYXNjYWRlJ10gPSAnYWxsLCBkZWxldGUtb3JwaGFuJwogICAgICAgICAgICBrd1sncGFzc2l2ZV9kZWxldGVzJ10gPSBUcnVlCiAgICAgICAgIyBtYWtlIHVzZSBvZiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gdG8gYWN0dWFsbHkgcmV0dXJuCiAgICAgICAgIyB0aGUgcmVzdWx0LgogICAgICAgIHJldHVybiBnZW5lcmF0ZV9yZWxhdGlvbnNoaXAoYmFzZSwgZGlyZWN0aW9uLCByZXR1cm5fZm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRybmFtZSwgbG9jYWxfY2xzLCByZWZlcnJlZF9jbHMsICoqa3cpCgogICAgZnJvbSBzcWxhbGNoZW15LmV4dC5hdXRvbWFwIGltcG9ydCBhdXRvbWFwX2Jhc2UKICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgY3JlYXRlX2VuZ2luZQoKICAgICMgYXV0b21hcCBiYXNlCiAgICBCYXNlID0gYXV0b21hcF9iYXNlKCkKCiAgICBlbmdpbmUgPSBjcmVhdGVfZW5naW5lKCJzcWxpdGU6Ly8vbXlkYXRhYmFzZS5kYiIpCiAgICBCYXNlLnByZXBhcmUoZW5naW5lLCByZWZsZWN0PVRydWUsCiAgICAgICAgICAgICAgICBnZW5lcmF0ZV9yZWxhdGlvbnNoaXA9X2dlbl9yZWxhdGlvbnNoaXApCgpNYW55LXRvLU1hbnkgcmVsYXRpb25zaGlwcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKOm1vZDpgLnNxbGFsY2hlbXkuZXh0LmF1dG9tYXBgIHdpbGwgZ2VuZXJhdGUgbWFueS10by1tYW55IHJlbGF0aW9uc2hpcHMsIGUuZy4KdGhvc2Ugd2hpY2ggY29udGFpbiBhIGBgc2Vjb25kYXJ5YGAgYXJndW1lbnQuICBUaGUgcHJvY2VzcyBmb3IgcHJvZHVjaW5nIHRoZXNlCmlzIGFzIGZvbGxvd3M6CgoxLiBBIGdpdmVuIDpjbGFzczpgLlRhYmxlYCBpcyBleGFtaW5lZCBmb3IgOmNsYXNzOmAuRm9yZWlnbktleUNvbnN0cmFpbnRgCiAgIG9iamVjdHMsIGJlZm9yZSBhbnkgbWFwcGVkIGNsYXNzIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGl0LgoKMi4gSWYgdGhlIHRhYmxlIGNvbnRhaW5zIHR3byBhbmQgZXhhY3RseSB0d28gOmNsYXNzOmAuRm9yZWlnbktleUNvbnN0cmFpbnRgCiAgIG9iamVjdHMsIGFuZCBhbGwgY29sdW1ucyB3aXRoaW4gdGhpcyB0YWJsZSBhcmUgbWVtYmVycyBvZiB0aGVzZSB0d28KICAgOmNsYXNzOmAuRm9yZWlnbktleUNvbnN0cmFpbnRgIG9iamVjdHMsIHRoZSB0YWJsZSBpcyBhc3N1bWVkIHRvIGJlIGEKICAgInNlY29uZGFyeSIgdGFibGUsIGFuZCB3aWxsICoqbm90IGJlIG1hcHBlZCBkaXJlY3RseSoqLgoKMy4gVGhlIHR3byAob3Igb25lLCBmb3Igc2VsZi1yZWZlcmVudGlhbCkgZXh0ZXJuYWwgdGFibGVzIHRvIHdoaWNoIHRoZQogICA6Y2xhc3M6YC5UYWJsZWAgcmVmZXJzIHRvIGFyZSBtYXRjaGVkIHRvIHRoZSBjbGFzc2VzIHRvIHdoaWNoIHRoZXkgd2lsbCBiZQogICBtYXBwZWQsIGlmIGFueS4KCjQuIElmIG1hcHBlZCBjbGFzc2VzIGZvciBib3RoIHNpZGVzIGFyZSBsb2NhdGVkLCBhIG1hbnktdG8tbWFueSBiaS1kaXJlY3Rpb25hbAogICA6ZnVuYzpgLnJlbGF0aW9uc2hpcGAgLyA6ZnVuYzpgLmJhY2tyZWZgIHBhaXIgaXMgY3JlYXRlZCBiZXR3ZWVuIHRoZSB0d28KICAgY2xhc3Nlcy4KCjUuIFRoZSBvdmVycmlkZSBsb2dpYyBmb3IgbWFueS10by1tYW55IHdvcmtzIHRoZSBzYW1lIGFzIHRoYXQgb2Ygb25lLXRvLW1hbnkvCiAgIG1hbnktdG8tb25lOyB0aGUgOmZ1bmM6YC5nZW5lcmF0ZV9yZWxhdGlvbnNoaXBgIGZ1bmN0aW9uIGlzIGNhbGxlZCB1cG9uCiAgIHRvIGdlbmVyYXRlIHRoZSBzdHJ1Y3R1cmVzIGFuZCBleGlzdGluZyBhdHRyaWJ1dGVzIHdpbGwgYmUgbWFpbnRhaW5lZC4KClJlbGF0aW9uc2hpcHMgd2l0aCBJbmhlcml0YW5jZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjptb2Q6YC5zcWxhbGNoZW15LmV4dC5hdXRvbWFwYCB3aWxsIG5vdCBnZW5lcmF0ZSBhbnkgcmVsYXRpb25zaGlwcyBiZXR3ZWVuCnR3byBjbGFzc2VzIHRoYXQgYXJlIGluIGFuIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcC4gICBUaGF0IGlzLCB3aXRoIHR3bwpjbGFzc2VzIGdpdmVuIGFzIGZvbGxvd3M6OgoKICAgIGNsYXNzIEVtcGxveWVlKEJhc2UpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAnZW1wbG95ZWUnCiAgICAgICAgaWQgPSBDb2x1bW4oSW50ZWdlciwgcHJpbWFyeV9rZXk9VHJ1ZSkKICAgICAgICB0eXBlID0gQ29sdW1uKFN0cmluZyg1MCkpCiAgICAgICAgX19tYXBwZXJfYXJnc19fID0gewogICAgICAgICAgICAgJ3BvbHltb3JwaGljX2lkZW50aXR5JzonZW1wbG95ZWUnLCAncG9seW1vcnBoaWNfb24nOiB0eXBlCiAgICAgICAgfQoKICAgIGNsYXNzIEVuZ2luZWVyKEVtcGxveWVlKToKICAgICAgICBfX3RhYmxlbmFtZV9fID0gJ2VuZ2luZWVyJwogICAgICAgIGlkID0gQ29sdW1uKEludGVnZXIsIEZvcmVpZ25LZXkoJ2VtcGxveWVlLmlkJyksIHByaW1hcnlfa2V5PVRydWUpCiAgICAgICAgX19tYXBwZXJfYXJnc19fID0gewogICAgICAgICAgICAncG9seW1vcnBoaWNfaWRlbnRpdHknOidlbmdpbmVlcicsCiAgICAgICAgfQoKVGhlIGZvcmVpZ24ga2V5IGZyb20gYGBFbmdpbmVlcmBgIHRvIGBgRW1wbG95ZWVgYCBpcyB1c2VkIG5vdCBmb3IgYQpyZWxhdGlvbnNoaXAsIGJ1dCB0byBlc3RhYmxpc2ggam9pbmVkIGluaGVyaXRhbmNlIGJldHdlZW4gdGhlIHR3byBjbGFzc2VzLgoKTm90ZSB0aGF0IHRoaXMgbWVhbnMgYXV0b21hcCB3aWxsIG5vdCBnZW5lcmF0ZSAqYW55KiByZWxhdGlvbnNoaXBzCmZvciBmb3JlaWduIGtleXMgdGhhdCBsaW5rIGZyb20gYSBzdWJjbGFzcyB0byBhIHN1cGVyY2xhc3MuICBJZiBhIG1hcHBpbmcKaGFzIGFjdHVhbCByZWxhdGlvbnNoaXBzIGZyb20gc3ViY2xhc3MgdG8gc3VwZXJjbGFzcyBhcyB3ZWxsLCB0aG9zZQpuZWVkIHRvIGJlIGV4cGxpY2l0LiAgQmVsb3csIGFzIHdlIGhhdmUgdHdvIHNlcGFyYXRlIGZvcmVpZ24ga2V5cwpmcm9tIGBgRW5naW5lZXJgYCB0byBgYEVtcGxveWVlYGAsIHdlIG5lZWQgdG8gc2V0IHVwIGJvdGggdGhlIHJlbGF0aW9uc2hpcAp3ZSB3YW50IGFzIHdlbGwgYXMgdGhlIGBgaW5oZXJpdF9jb25kaXRpb25gYCwgYXMgdGhlc2UgYXJlIG5vdCB0aGluZ3MKU1FMQWxjaGVteSBjYW4gZ3Vlc3M6OgoKICAgIGNsYXNzIEVtcGxveWVlKEJhc2UpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAnZW1wbG95ZWUnCiAgICAgICAgaWQgPSBDb2x1bW4oSW50ZWdlciwgcHJpbWFyeV9rZXk9VHJ1ZSkKICAgICAgICB0eXBlID0gQ29sdW1uKFN0cmluZyg1MCkpCgogICAgICAgIF9fbWFwcGVyX2FyZ3NfXyA9IHsKICAgICAgICAgICAgJ3BvbHltb3JwaGljX2lkZW50aXR5JzonZW1wbG95ZWUnLCAncG9seW1vcnBoaWNfb24nOnR5cGUKICAgICAgICB9CgogICAgY2xhc3MgRW5naW5lZXIoRW1wbG95ZWUpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAnZW5naW5lZXInCiAgICAgICAgaWQgPSBDb2x1bW4oSW50ZWdlciwgRm9yZWlnbktleSgnZW1wbG95ZWUuaWQnKSwgcHJpbWFyeV9rZXk9VHJ1ZSkKICAgICAgICBmYXZvcml0ZV9lbXBsb3llZV9pZCA9IENvbHVtbihJbnRlZ2VyLCBGb3JlaWduS2V5KCdlbXBsb3llZS5pZCcpKQoKICAgICAgICBmYXZvcml0ZV9lbXBsb3llZSA9IHJlbGF0aW9uc2hpcChFbXBsb3llZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduX2tleXM9ZmF2b3JpdGVfZW1wbG95ZWVfaWQpCgogICAgICAgIF9fbWFwcGVyX2FyZ3NfXyA9IHsKICAgICAgICAgICAgJ3BvbHltb3JwaGljX2lkZW50aXR5JzonZW5naW5lZXInLAogICAgICAgICAgICAnaW5oZXJpdF9jb25kaXRpb24nOiBpZCA9PSBFbXBsb3llZS5pZAogICAgICAgIH0KCkhhbmRsaW5nIFNpbXBsZSBOYW1pbmcgQ29uZmxpY3RzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpJbiB0aGUgY2FzZSBvZiBuYW1pbmcgY29uZmxpY3RzIGR1cmluZyBtYXBwaW5nLCBvdmVycmlkZSBhbnkgb2YKOmZ1bmM6YC5jbGFzc25hbWVfZm9yX3RhYmxlYCwgOmZ1bmM6YC5uYW1lX2Zvcl9zY2FsYXJfcmVsYXRpb25zaGlwYCwKYW5kIDpmdW5jOmAubmFtZV9mb3JfY29sbGVjdGlvbl9yZWxhdGlvbnNoaXBgIGFzIG5lZWRlZC4gIEZvciBleGFtcGxlLCBpZgphdXRvbWFwIGlzIGF0dGVtcHRpbmcgdG8gbmFtZSBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCB0aGUgc2FtZSBhcyBhbgpleGlzdGluZyBjb2x1bW4sIGFuIGFsdGVybmF0ZSBjb252ZW50aW9uIGNhbiBiZSBjb25kaXRpb25hbGx5IHNlbGVjdGVkLiAgR2l2ZW4KYSBzY2hlbWE6CgouLiBzb3VyY2Vjb2RlOjogc3FsCgogICAgQ1JFQVRFIFRBQkxFIHRhYmxlX2EgKAogICAgICAgIGlkIElOVEVHRVIgUFJJTUFSWSBLRVkKICAgICk7CgogICAgQ1JFQVRFIFRBQkxFIHRhYmxlX2IgKAogICAgICAgIGlkIElOVEVHRVIgUFJJTUFSWSBLRVksCiAgICAgICAgdGFibGVfYSBJTlRFR0VSLAogICAgICAgIEZPUkVJR04gS0VZKHRhYmxlX2EpIFJFRkVSRU5DRVMgdGFibGVfYShpZCkKICAgICk7CgpUaGUgYWJvdmUgc2NoZW1hIHdpbGwgZmlyc3QgYXV0b21hcCB0aGUgYGB0YWJsZV9hYGAgdGFibGUgYXMgYSBjbGFzcyBuYW1lZApgYHRhYmxlX2FgYDsgaXQgd2lsbCB0aGVuIGF1dG9tYXAgYSByZWxhdGlvbnNoaXAgb250byB0aGUgY2xhc3MgZm9yIGBgdGFibGVfYmBgCndpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGlzIHJlbGF0ZWQgY2xhc3MsIGUuZy4gYGB0YWJsZV9hYGAuICBUaGlzCnJlbGF0aW9uc2hpcCBuYW1lIGNvbmZsaWN0cyB3aXRoIHRoZSBtYXBwaW5nIGNvbHVtbiBgYHRhYmxlX2IudGFibGVfYWBgLAphbmQgd2lsbCBlbWl0IGFuIGVycm9yIG9uIG1hcHBpbmcuCgpXZSBjYW4gcmVzb2x2ZSB0aGlzIGNvbmZsaWN0IGJ5IHVzaW5nIGFuIHVuZGVyc2NvcmUgYXMgZm9sbG93czo6CgogICAgZGVmIG5hbWVfZm9yX3NjYWxhcl9yZWxhdGlvbnNoaXAoYmFzZSwgbG9jYWxfY2xzLCByZWZlcnJlZF9jbHMsIGNvbnN0cmFpbnQpOgogICAgICAgIG5hbWUgPSByZWZlcnJlZF9jbHMuX19uYW1lX18ubG93ZXIoKQogICAgICAgIGxvY2FsX3RhYmxlID0gbG9jYWxfY2xzLl9fdGFibGVfXwogICAgICAgIGlmIG5hbWUgaW4gbG9jYWxfdGFibGUuY29sdW1uczoKICAgICAgICAgICAgbmV3bmFtZSA9IG5hbWUgKyAiXyIKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICJBbHJlYWR5IGRldGVjdGVkIG5hbWUgJXMgcHJlc2VudC4gIHVzaW5nICVzIiAlCiAgICAgICAgICAgICAgICAobmFtZSwgbmV3bmFtZSkpCiAgICAgICAgICAgIHJldHVybiBuZXduYW1lCiAgICAgICAgcmV0dXJuIG5hbWUKCgogICAgQmFzZS5wcmVwYXJlKGVuZ2luZSwgcmVmbGVjdD1UcnVlLAogICAgICAgIG5hbWVfZm9yX3NjYWxhcl9yZWxhdGlvbnNoaXA9bmFtZV9mb3Jfc2NhbGFyX3JlbGF0aW9uc2hpcCkKCkFsdGVybmF0aXZlbHksIHdlIGNhbiBjaGFuZ2UgdGhlIG5hbWUgb24gdGhlIGNvbHVtbiBzaWRlLiAgIFRoZSBjb2x1bW5zCnRoYXQgYXJlIG1hcHBlZCBjYW4gYmUgbW9kaWZpZWQgdXNpbmcgdGhlIHRlY2huaXF1ZSBkZXNjcmliZWQgYXQKOnJlZjpgbWFwcGVyX2NvbHVtbl9kaXN0aW5jdF9uYW1lc2AsIGJ5IGFzc2lnbmluZyB0aGUgY29sdW1uIGV4cGxpY2l0bHkKdG8gYSBuZXcgbmFtZTo6CgogICAgQmFzZSA9IGF1dG9tYXBfYmFzZSgpCgogICAgY2xhc3MgVGFibGVCKEJhc2UpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAndGFibGVfYicKICAgICAgICBfdGFibGVfYSA9IENvbHVtbigndGFibGVfYScsIEZvcmVpZ25LZXkoJ3RhYmxlX2EuaWQnKSkKCiAgICBCYXNlLnByZXBhcmUoZW5naW5lLCByZWZsZWN0PVRydWUpCgoKVXNpbmcgQXV0b21hcCB3aXRoIEV4cGxpY2l0IERlY2xhcmF0aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpBcyBub3RlZCBwcmV2aW91c2x5LCBhdXRvbWFwIGhhcyBubyBkZXBlbmRlbmN5IG9uIHJlZmxlY3Rpb24sIGFuZCBjYW4gbWFrZQp1c2Ugb2YgYW55IGNvbGxlY3Rpb24gb2YgOmNsYXNzOmAuVGFibGVgIG9iamVjdHMgd2l0aGluIGEgOmNsYXNzOmAuTWV0YURhdGFgCmNvbGxlY3Rpb24uICBGcm9tIHRoaXMsIGl0IGZvbGxvd3MgdGhhdCBhdXRvbWFwIGNhbiBhbHNvIGJlIHVzZWQKZ2VuZXJhdGUgbWlzc2luZyByZWxhdGlvbnNoaXBzIGdpdmVuIGFuIG90aGVyd2lzZSBjb21wbGV0ZSBtb2RlbCB0aGF0IGZ1bGx5CmRlZmluZXMgdGFibGUgbWV0YWRhdGE6OgoKICAgIGZyb20gc3FsYWxjaGVteS5leHQuYXV0b21hcCBpbXBvcnQgYXV0b21hcF9iYXNlCiAgICBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IENvbHVtbiwgSW50ZWdlciwgU3RyaW5nLCBGb3JlaWduS2V5CgogICAgQmFzZSA9IGF1dG9tYXBfYmFzZSgpCgogICAgY2xhc3MgVXNlcihCYXNlKToKICAgICAgICBfX3RhYmxlbmFtZV9fID0gJ3VzZXInCgogICAgICAgIGlkID0gQ29sdW1uKEludGVnZXIsIHByaW1hcnlfa2V5PVRydWUpCiAgICAgICAgbmFtZSA9IENvbHVtbihTdHJpbmcpCgogICAgY2xhc3MgQWRkcmVzcyhCYXNlKToKICAgICAgICBfX3RhYmxlbmFtZV9fID0gJ2FkZHJlc3MnCgogICAgICAgIGlkID0gQ29sdW1uKEludGVnZXIsIHByaW1hcnlfa2V5PVRydWUpCiAgICAgICAgZW1haWwgPSBDb2x1bW4oU3RyaW5nKQogICAgICAgIHVzZXJfaWQgPSBDb2x1bW4oRm9yZWlnbktleSgndXNlci5pZCcpKQoKICAgICMgcHJvZHVjZSByZWxhdGlvbnNoaXBzCiAgICBCYXNlLnByZXBhcmUoKQoKICAgICMgbWFwcGluZyBpcyBjb21wbGV0ZSwgd2l0aCAiYWRkcmVzc19jb2xsZWN0aW9uIiBhbmQKICAgICMgInVzZXIiIHJlbGF0aW9uc2hpcHMKICAgIGExID0gQWRkcmVzcyhlbWFpbD0ndTEnKQogICAgYTIgPSBBZGRyZXNzKGVtYWlsPSd1MicpCiAgICB1MSA9IFVzZXIoYWRkcmVzc19jb2xsZWN0aW9uPVthMSwgYTJdKQogICAgYXNzZXJ0IGExLnVzZXIgaXMgdTEKCkFib3ZlLCBnaXZlbiBtb3N0bHkgY29tcGxldGUgYGBVc2VyYGAgYW5kIGBgQWRkcmVzc2BgIG1hcHBpbmdzLCB0aGUKOmNsYXNzOmAuRm9yZWlnbktleWAgd2hpY2ggd2UgZGVmaW5lZCBvbiBgYEFkZHJlc3MudXNlcl9pZGBgIGFsbG93ZWQgYQpiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcCBwYWlyIGBgQWRkcmVzcy51c2VyYGAgYW5kCmBgVXNlci5hZGRyZXNzX2NvbGxlY3Rpb25gYCB0byBiZSBnZW5lcmF0ZWQgb24gdGhlIG1hcHBlZCBjbGFzc2VzLgoKTm90ZSB0aGF0IHdoZW4gc3ViY2xhc3NpbmcgOmNsYXNzOmAuQXV0b21hcEJhc2VgLAp0aGUgOm1ldGg6YC5BdXRvbWFwQmFzZS5wcmVwYXJlYCBtZXRob2QgaXMgcmVxdWlyZWQ7IGlmIG5vdCBjYWxsZWQsIHRoZSBjbGFzc2VzCndlJ3ZlIGRlY2xhcmVkIGFyZSBpbiBhbiB1bi1tYXBwZWQgc3RhdGUuCgoK6QEAAAApAdoQZGVjbGFyYXRpdmVfYmFzZSkB2hVfRGVmZXJyZWRNYXBwZXJDb25maWfpAgAAACkB2gR1dGlsKQHaB2JhY2tyZWYpAdoDZXhjKQHaCmludGVyZmFjZXMpAdoMcmVsYXRpb25zaGlwKQHaEF9DT05GSUdVUkVfTVVURVgpAdoURm9yZWlnbktleUNvbnN0cmFpbnQpAdoEYW5kX2MDAAAAAAAAAAMAAAACAAAAQwAAAHMIAAAAdAB8AYMBUwApAWFPAwAAUmV0dXJuIHRoZSBjbGFzcyBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQsIGdpdmVuIHRoZSBuYW1lCiAgICBvZiBhIHRhYmxlLgoKICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzOjoKCiAgICAgICAgcmV0dXJuIHN0cih0YWJsZW5hbWUpCgogICAgQWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHRoZQogICAgOnBhcmFtcmVmOmAuQXV0b21hcEJhc2UucHJlcGFyZS5jbGFzc25hbWVfZm9yX3RhYmxlYAogICAgcGFyYW1ldGVyLgoKICAgIDpwYXJhbSBiYXNlOiB0aGUgOmNsYXNzOmAuQXV0b21hcEJhc2VgIGNsYXNzIGRvaW5nIHRoZSBwcmVwYXJlLgoKICAgIDpwYXJhbSB0YWJsZW5hbWU6IHN0cmluZyBuYW1lIG9mIHRoZSA6Y2xhc3M6YC5UYWJsZWAuCgogICAgOnBhcmFtIHRhYmxlOiB0aGUgOmNsYXNzOmAuVGFibGVgIG9iamVjdCBpdHNlbGYuCgogICAgOnJldHVybjogYSBzdHJpbmcgY2xhc3MgbmFtZS4KCiAgICAgLi4gbm90ZTo6CgogICAgICAgIEluIFB5dGhvbiAyLCB0aGUgc3RyaW5nIHVzZWQgZm9yIHRoZSBjbGFzcyBuYW1lICoqbXVzdCoqIGJlIGEKICAgICAgICBub24tVW5pY29kZSBvYmplY3QsIGUuZy4gYSBgYHN0cigpYGAgb2JqZWN0LiAgVGhlIGBgLm5hbWVgYCBhdHRyaWJ1dGUKICAgICAgICBvZiA6Y2xhc3M6YC5UYWJsZWAgaXMgdHlwaWNhbGx5IGEgUHl0aG9uIHVuaWNvZGUgc3ViY2xhc3MsIHNvIHRoZQogICAgICAgIGBgc3RyKClgYCBmdW5jdGlvbiBzaG91bGQgYmUgYXBwbGllZCB0byB0aGlzIG5hbWUsIGFmdGVyIGFjY291bnRpbmcgZm9yCiAgICAgICAgYW55IG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgoKICAgICkB2gNzdHIpA9oEYmFzZVoJdGFibGVuYW1l2gV0YWJsZakAchAAAAD6SS9vcHQvYWx0L3B5dGhvbjM3L2xpYjY0L3B5dGhvbjMuNy9zaXRlLXBhY2thZ2VzL3NxbGFsY2hlbXkvZXh0L2F1dG9tYXAucHnaE2NsYXNzbmFtZV9mb3JfdGFibGUQAgAAcwIAAAAAHXISAAAAYwQAAAAAAAAABAAAAAIAAABDAAAAcwoAAAB8AmoAoAGhAFMAKQFhnAIAAFJldHVybiB0aGUgYXR0cmlidXRlIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byByZWZlciBmcm9tIG9uZQogICAgY2xhc3MgdG8gYW5vdGhlciwgZm9yIGEgc2NhbGFyIG9iamVjdCByZWZlcmVuY2UuCgogICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXM6OgoKICAgICAgICByZXR1cm4gcmVmZXJyZWRfY2xzLl9fbmFtZV9fLmxvd2VyKCkKCiAgICBBbHRlcm5hdGUgaW1wbGVtZW50YXRpb25zIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlCiAgICA6cGFyYW1yZWY6YC5BdXRvbWFwQmFzZS5wcmVwYXJlLm5hbWVfZm9yX3NjYWxhcl9yZWxhdGlvbnNoaXBgCiAgICBwYXJhbWV0ZXIuCgogICAgOnBhcmFtIGJhc2U6IHRoZSA6Y2xhc3M6YC5BdXRvbWFwQmFzZWAgY2xhc3MgZG9pbmcgdGhlIHByZXBhcmUuCgogICAgOnBhcmFtIGxvY2FsX2NsczogdGhlIGNsYXNzIHRvIGJlIG1hcHBlZCBvbiB0aGUgbG9jYWwgc2lkZS4KCiAgICA6cGFyYW0gcmVmZXJyZWRfY2xzOiB0aGUgY2xhc3MgdG8gYmUgbWFwcGVkIG9uIHRoZSByZWZlcnJpbmcgc2lkZS4KCiAgICA6cGFyYW0gY29uc3RyYWludDogdGhlIDpjbGFzczpgLkZvcmVpZ25LZXlDb25zdHJhaW50YCB0aGF0IGlzIGJlaW5nCiAgICAgaW5zcGVjdGVkIHRvIHByb2R1Y2UgdGhpcyByZWxhdGlvbnNoaXAuCgogICAgKQLaCF9fbmFtZV9f2gVsb3dlcikEcg4AAADaCWxvY2FsX2Nsc9oMcmVmZXJyZWRfY2xz2gpjb25zdHJhaW50chAAAAByEAAAAHIRAAAA2hxuYW1lX2Zvcl9zY2FsYXJfcmVsYXRpb25zaGlwMAIAAHMCAAAAABZyGAAAAGMEAAAAAAAAAAQAAAACAAAAQwAAAHMOAAAAfAJqAKABoQBkARcAUwApAmGxAgAAUmV0dXJuIHRoZSBhdHRyaWJ1dGUgbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlZmVyIGZyb20gb25lCiAgICBjbGFzcyB0byBhbm90aGVyLCBmb3IgYSBjb2xsZWN0aW9uIHJlZmVyZW5jZS4KCiAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpczo6CgogICAgICAgIHJldHVybiByZWZlcnJlZF9jbHMuX19uYW1lX18ubG93ZXIoKSArICJfY29sbGVjdGlvbiIKCiAgICBBbHRlcm5hdGUgaW1wbGVtZW50YXRpb25zCiAgICBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHRoZQogICAgOnBhcmFtcmVmOmAuQXV0b21hcEJhc2UucHJlcGFyZS5uYW1lX2Zvcl9jb2xsZWN0aW9uX3JlbGF0aW9uc2hpcGAKICAgIHBhcmFtZXRlci4KCiAgICA6cGFyYW0gYmFzZTogdGhlIDpjbGFzczpgLkF1dG9tYXBCYXNlYCBjbGFzcyBkb2luZyB0aGUgcHJlcGFyZS4KCiAgICA6cGFyYW0gbG9jYWxfY2xzOiB0aGUgY2xhc3MgdG8gYmUgbWFwcGVkIG9uIHRoZSBsb2NhbCBzaWRlLgoKICAgIDpwYXJhbSByZWZlcnJlZF9jbHM6IHRoZSBjbGFzcyB0byBiZSBtYXBwZWQgb24gdGhlIHJlZmVycmluZyBzaWRlLgoKICAgIDpwYXJhbSBjb25zdHJhaW50OiB0aGUgOmNsYXNzOmAuRm9yZWlnbktleUNvbnN0cmFpbnRgIHRoYXQgaXMgYmVpbmcKICAgICBpbnNwZWN0ZWQgdG8gcHJvZHVjZSB0aGlzIHJlbGF0aW9uc2hpcC4KCiAgICBaC19jb2xsZWN0aW9uKQJyEwAAAHIUAAAAKQRyDgAAAHIVAAAAchYAAAByFwAAAHIQAAAAchAAAAByEQAAANogbmFtZV9mb3JfY29sbGVjdGlvbl9yZWxhdGlvbnNoaXBJAgAAcwIAAAAAGXIZAAAAYwYAAAAAAAAABwAAAAMAAABLAAAAczgAAAB8AnQAawhyFHwCfANmAXwGjgFTAHwCdAFrCHIofAJ8BWYBfAaOAVMAdAJkAXwCFgCDAYIBZAJTACkDYZUHAABHZW5lcmF0ZSBhIDpmdW5jOmAucmVsYXRpb25zaGlwYCBvciA6ZnVuYzpgLmJhY2tyZWZgIG9uIGJlaGFsZiBvZiB0d28KICAgIG1hcHBlZCBjbGFzc2VzLgoKICAgIEFuIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlCiAgICA6cGFyYW1yZWY6YC5BdXRvbWFwQmFzZS5wcmVwYXJlLmdlbmVyYXRlX3JlbGF0aW9uc2hpcGAgcGFyYW1ldGVyLgoKICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgYXMgZm9sbG93czo6CgogICAgICAgIGlmIHJldHVybl9mbiBpcyBiYWNrcmVmOgogICAgICAgICAgICByZXR1cm4gcmV0dXJuX2ZuKGF0dHJuYW1lLCAqKmt3KQogICAgICAgIGVsaWYgcmV0dXJuX2ZuIGlzIHJlbGF0aW9uc2hpcDoKICAgICAgICAgICAgcmV0dXJuIHJldHVybl9mbihyZWZlcnJlZF9jbHMsICoqa3cpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJVbmtub3duIHJlbGF0aW9uc2hpcCBmdW5jdGlvbjogJXMiICUgcmV0dXJuX2ZuKQoKICAgIDpwYXJhbSBiYXNlOiB0aGUgOmNsYXNzOmAuQXV0b21hcEJhc2VgIGNsYXNzIGRvaW5nIHRoZSBwcmVwYXJlLgoKICAgIDpwYXJhbSBkaXJlY3Rpb246IGluZGljYXRlIHRoZSAiZGlyZWN0aW9uIiBvZiB0aGUgcmVsYXRpb25zaGlwOyB0aGlzIHdpbGwKICAgICBiZSBvbmUgb2YgOmRhdGE6YC5PTkVUT01BTllgLCA6ZGF0YTpgLk1BTllUT09ORWAsIDpkYXRhOmAuTUFOWVRPTUFOWWAuCgogICAgOnBhcmFtIHJldHVybl9mbjogdGhlIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCBieSBkZWZhdWx0IHRvIGNyZWF0ZSB0aGUKICAgICByZWxhdGlvbnNoaXAuICBUaGlzIHdpbGwgYmUgZWl0aGVyIDpmdW5jOmAucmVsYXRpb25zaGlwYCBvcgogICAgIDpmdW5jOmAuYmFja3JlZmAuICBUaGUgOmZ1bmM6YC5iYWNrcmVmYCBmdW5jdGlvbidzIHJlc3VsdCB3aWxsIGJlIHVzZWQgdG8KICAgICBwcm9kdWNlIGEgbmV3IDpmdW5jOmAucmVsYXRpb25zaGlwYCBpbiBhIHNlY29uZCBzdGVwLCBzbyBpdCBpcyBjcml0aWNhbAogICAgIHRoYXQgdXNlci1kZWZpbmVkIGltcGxlbWVudGF0aW9ucyBjb3JyZWN0bHkgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSB0d28KICAgICBmdW5jdGlvbnMsIGlmIGEgY3VzdG9tIHJlbGF0aW9uc2hpcCBmdW5jdGlvbiBpcyBiZWluZyB1c2VkLgoKICAgIDpwYXJhbSBhdHRybmFtZTogdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHdoaWNoIHRoaXMgcmVsYXRpb25zaGlwIGlzIGJlaW5nCiAgICAgYXNzaWduZWQuIElmIHRoZSB2YWx1ZSBvZiA6cGFyYW1yZWY6YC5nZW5lcmF0ZV9yZWxhdGlvbnNoaXAucmV0dXJuX2ZuYCBpcwogICAgIHRoZSA6ZnVuYzpgLmJhY2tyZWZgIGZ1bmN0aW9uLCB0aGVuIHRoaXMgbmFtZSBpcyB0aGUgbmFtZSB0aGF0IGlzIGJlaW5nCiAgICAgYXNzaWduZWQgdG8gdGhlIGJhY2tyZWYuCgogICAgOnBhcmFtIGxvY2FsX2NsczogdGhlICJsb2NhbCIgY2xhc3MgdG8gd2hpY2ggdGhpcyByZWxhdGlvbnNoaXAgb3IgYmFja3JlZgogICAgIHdpbGwgYmUgbG9jYWxseSBwcmVzZW50LgoKICAgIDpwYXJhbSByZWZlcnJlZF9jbHM6IHRoZSAicmVmZXJyZWQiIGNsYXNzIHRvIHdoaWNoIHRoZSByZWxhdGlvbnNoaXAgb3IKICAgICBiYWNrcmVmIHJlZmVycyB0by4KCiAgICA6cGFyYW0gXCoqa3c6IGFsbCBhZGRpdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwYXNzZWQgYWxvbmcgdG8gdGhlCiAgICAgZnVuY3Rpb24uCgogICAgOnJldHVybjogYSA6ZnVuYzpgLnJlbGF0aW9uc2hpcGAgb3IgOmZ1bmM6YC5iYWNrcmVmYCBjb25zdHJ1Y3QsIGFzIGRpY3RhdGVkCiAgICAgYnkgdGhlIDpwYXJhbXJlZjpgLmdlbmVyYXRlX3JlbGF0aW9uc2hpcC5yZXR1cm5fZm5gIHBhcmFtZXRlci4KCiAgICB6IVVua25vd24gcmVsYXRpb25zaGlwIGZ1bmN0aW9uOiAlc04pA3IGAAAAcgkAAADaCVR5cGVFcnJvcikHcg4AAADaCWRpcmVjdGlvbloJcmV0dXJuX2Zu2ghhdHRybmFtZXIVAAAAchYAAADaAmt3chAAAAByEAAAAHIRAAAA2hVnZW5lcmF0ZV9yZWxhdGlvbnNoaXBlAgAAcwoAAAAAMAgBDAEIAQwCch4AAABjAAAAAAAAAAAAAAAACQAAAEAAAABzRgAAAGUAWgFkAFoCZAFaA2QCWgRkA1oFZQZkA2QEZANlB2UIZQllCmULZghkBWQGhAGDAVoMZAJaDWUGZAdkCIQAgwFaDmQDUwApCdoLQXV0b21hcEJhc2Vh6gEAAEJhc2UgY2xhc3MgZm9yIGFuICJhdXRvbWFwIiBzY2hlbWEuCgogICAgVGhlIDpjbGFzczpgLkF1dG9tYXBCYXNlYCBjbGFzcyBjYW4gYmUgY29tcGFyZWQgdG8gdGhlICJkZWNsYXJhdGl2ZSBiYXNlIgogICAgY2xhc3MgdGhhdCBpcyBwcm9kdWNlZCBieSB0aGUgOmZ1bmM6YC5kZWNsYXJhdGl2ZS5kZWNsYXJhdGl2ZV9iYXNlYAogICAgZnVuY3Rpb24uICBJbiBwcmFjdGljZSwgdGhlIDpjbGFzczpgLkF1dG9tYXBCYXNlYCBjbGFzcyBpcyBhbHdheXMgdXNlZAogICAgYXMgYSBtaXhpbiBhbG9uZyB3aXRoIGFuIGFjdHVhbCBkZWNsYXJhdGl2ZSBiYXNlLgoKICAgIEEgbmV3IHN1YmNsYXNzYWJsZSA6Y2xhc3M6YC5BdXRvbWFwQmFzZWAgaXMgdHlwaWNhbGx5IGluc3RhbnRpYXRlZAogICAgdXNpbmcgdGhlIDpmdW5jOmAuYXV0b21hcF9iYXNlYCBmdW5jdGlvbi4KCiAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgOnJlZjpgYXV0b21hcF90b3BsZXZlbGAKCiAgICBUTkZjCQAAAAAAAAARAAAADAAAAEMAAABzXAEAAHwCchh8AGoAagF8AXwDZAFkAmQDjQQBAHQCoAOhAAEAkAF6KnQEZARkBYQAdAVqBnwAZAJkBo0CRACDAYMBfQlnAH0KeI58AGoAagegCKEARABdfn0LdAl8AHwLgwJcA30MfQ19DnwMZAdrCXKCfAqgCnwMfA18DnwLZgShAQEAcVJ8C2oLc4xxUnFSfAt8CWsHclJ0DHwEfAB8C2oNfAuDA3wAZgFkCHwLaQGDA30PdAWgDnwPoQF9EHwPfABqD3wQahBqETwAfBB8CXwLPABxUlcAeCR8CaAIoQBEAF0YfRB0EnwAfBB8CXwFfAZ8B3wIgwcBAHHeVwB4MHwKRABdKFwEfQx9DX0OfQt0E3wAfAx8DXwOfAt8CXwFfAZ8B3wIgwoBAJABcQBXAHgcdAWgBnwAoQFEAF0OfRB8EKAUoQABAJABcThXAFcAZAd0AqAVoQABAFgAZAdTACkJYXgIAABFeHRyYWN0IG1hcHBlZCBjbGFzc2VzIGFuZCByZWxhdGlvbnNoaXBzIGZyb20gdGhlIDpjbGFzczpgLk1ldGFEYXRhYCBhbmQKICAgICAgICBwZXJmb3JtIG1hcHBpbmdzLgoKICAgICAgICA6cGFyYW0gZW5naW5lOiBhbiA6Y2xhc3M6YC5FbmdpbmVgIG9yIDpjbGFzczpgLkNvbm5lY3Rpb25gIHdpdGggd2hpY2gKICAgICAgICAgdG8gcGVyZm9ybSBzY2hlbWEgcmVmbGVjdGlvbiwgaWYgc3BlY2lmaWVkLgogICAgICAgICBJZiB0aGUgOnBhcmFtcmVmOmAuQXV0b21hcEJhc2UucHJlcGFyZS5yZWZsZWN0YCBhcmd1bWVudCBpcyBGYWxzZSwKICAgICAgICAgdGhpcyBvYmplY3QgaXMgbm90IHVzZWQuCgogICAgICAgIDpwYXJhbSByZWZsZWN0OiBpZiBUcnVlLCB0aGUgOm1ldGg6YC5NZXRhRGF0YS5yZWZsZWN0YCBtZXRob2QgaXMgY2FsbGVkCiAgICAgICAgIG9uIHRoZSA6Y2xhc3M6YC5NZXRhRGF0YWAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgOmNsYXNzOmAuQXV0b21hcEJhc2VgLgogICAgICAgICBUaGUgOmNsYXNzOmAuRW5naW5lYCBwYXNzZWQgdmlhCiAgICAgICAgIDpwYXJhbXJlZjpgLkF1dG9tYXBCYXNlLnByZXBhcmUuZW5naW5lYCB3aWxsIGJlIHVzZWQgdG8gcGVyZm9ybSB0aGUKICAgICAgICAgcmVmbGVjdGlvbiBpZiBwcmVzZW50OyBlbHNlLCB0aGUgOmNsYXNzOmAuTWV0YURhdGFgIHNob3VsZCBhbHJlYWR5IGJlCiAgICAgICAgIGJvdW5kIHRvIHNvbWUgZW5naW5lIGVsc2UgdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwuCgogICAgICAgIDpwYXJhbSBjbGFzc25hbWVfZm9yX3RhYmxlOiBjYWxsYWJsZSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgdG8KICAgICAgICAgcHJvZHVjZSBuZXcgY2xhc3MgbmFtZXMsIGdpdmVuIGEgdGFibGUgbmFtZS4gIERlZmF1bHRzIHRvCiAgICAgICAgIDpmdW5jOmAuY2xhc3NuYW1lX2Zvcl90YWJsZWAuCgogICAgICAgIDpwYXJhbSBuYW1lX2Zvcl9zY2FsYXJfcmVsYXRpb25zaGlwOiBjYWxsYWJsZSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlCiAgICAgICAgIHVzZWQgdG8gcHJvZHVjZSByZWxhdGlvbnNoaXAgbmFtZXMgZm9yIHNjYWxhciByZWxhdGlvbnNoaXBzLiAgRGVmYXVsdHMKICAgICAgICAgdG8gOmZ1bmM6YC5uYW1lX2Zvcl9zY2FsYXJfcmVsYXRpb25zaGlwYC4KCiAgICAgICAgOnBhcmFtIG5hbWVfZm9yX2NvbGxlY3Rpb25fcmVsYXRpb25zaGlwOiBjYWxsYWJsZSBmdW5jdGlvbiB3aGljaCB3aWxsCiAgICAgICAgIGJlIHVzZWQgdG8gcHJvZHVjZSByZWxhdGlvbnNoaXAgbmFtZXMgZm9yIGNvbGxlY3Rpb24tb3JpZW50ZWQKICAgICAgICAgcmVsYXRpb25zaGlwcy4gIERlZmF1bHRzIHRvIDpmdW5jOmAubmFtZV9mb3JfY29sbGVjdGlvbl9yZWxhdGlvbnNoaXBgLgoKICAgICAgICA6cGFyYW0gZ2VuZXJhdGVfcmVsYXRpb25zaGlwOiBjYWxsYWJsZSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgdG8KICAgICAgICAgYWN0dWFsbHkgZ2VuZXJhdGUgOmZ1bmM6YC5yZWxhdGlvbnNoaXBgIGFuZCA6ZnVuYzpgLmJhY2tyZWZgCiAgICAgICAgIGNvbnN0cnVjdHMuICBEZWZhdWx0cyB0byA6ZnVuYzpgLmdlbmVyYXRlX3JlbGF0aW9uc2hpcGAuCgogICAgICAgIDpwYXJhbSBjb2xsZWN0aW9uX2NsYXNzOiB0aGUgUHl0aG9uIGNvbGxlY3Rpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQKICAgICAgICAgd2hlbiBhIG5ldyA6ZnVuYzpgLnJlbGF0aW9uc2hpcGAgb2JqZWN0IGlzIGNyZWF0ZWQgdGhhdCByZXByZXNlbnRzIGEKICAgICAgICAgY29sbGVjdGlvbi4gIERlZmF1bHRzIHRvIGBgbGlzdGBgLgoKICAgICAgICA6cGFyYW0gc2NoZW1hOiBXaGVuIHByZXNlbnQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKICAgICAgICAgOnBhcmFtcmVmOmAuQXV0b21hcEJhc2UucHJlcGFyZS5yZWZsZWN0YCBmbGFnLCBpcyBwYXNzZWQgdG8KICAgICAgICAgOm1ldGg6YC5NZXRhRGF0YS5yZWZsZWN0YCB0byBpbmRpY2F0ZSB0aGUgcHJpbWFyeSBzY2hlbWEgd2hlcmUgdGFibGVzCiAgICAgICAgIHNob3VsZCBiZSByZWZsZWN0ZWQgZnJvbS4gIFdoZW4gb21pdHRlZCwgdGhlIGRlZmF1bHQgc2NoZW1hIGluIHVzZQogICAgICAgICBieSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBpcyB1c2VkLgoKICAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS4xCgogICAgICAgIFRGKQPaBnNjaGVtYVoPZXh0ZW5kX2V4aXN0aW5nWhBhdXRvbG9hZF9yZXBsYWNlYwEAAAAAAAAAAgAAAAMAAABzAAAAcxgAAAB8AF0QfQF8AWoAfAFmAlYAAQBxAmQAUwApAU4pAdoLbG9jYWxfdGFibGUpAtoCLjDaAW1yEAAAAHIQAAAAchEAAAD6CTxnZW5leHByPgADAABzAgAAAAQBeiZBdXRvbWFwQmFzZS5wcmVwYXJlLjxsb2NhbHM+LjxnZW5leHByPikB2gRzb3J0TloJX190YWJsZV9fKRbaCG1ldGFkYXRh2gdyZWZsZWN0cgoAAADaB2FjcXVpcmXaBGRpY3RyAwAAAFoQY2xhc3Nlc19mb3JfYmFzZVoGdGFibGVz2gZ2YWx1ZXPaEF9pc19tYW55X3RvX21hbnnaBmFwcGVuZFoLcHJpbWFyeV9rZXnaBHR5cGXaBG5hbWVaDmNvbmZpZ19mb3JfY2xz2gdjbGFzc2Vz2gNjbHNyEwAAANoWX3JlbGF0aW9uc2hpcHNfZm9yX2Zrc9oRX20ybV9yZWxhdGlvbnNoaXDaA21hcNoHcmVsZWFzZSkRcjAAAABaBmVuZ2luZXInAAAAciAAAAByEgAAANoQY29sbGVjdGlvbl9jbGFzc3IYAAAAchkAAAByHgAAANoTdGFibGVfdG9fbWFwX2NvbmZpZ1oMbWFueV90b19tYW55cg8AAADaB2xjbF9tMm3aB3JlbV9tMm3aCW0ybV9jb25zdFoKbWFwcGVkX2Nsc9oKbWFwX2NvbmZpZ3IQAAAAchAAAAByEQAAANoHcHJlcGFyZb0CAABzaAAAAAA4BAEGAQIBAgECAQgD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
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 12
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
associationproxy.cpython-37.pyc
48.46 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
automap.cpython-37.pyc
34.41 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
baked.cpython-37.pyc
19.92 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
compiler.cpython-37.pyc
16.01 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
horizontal_shard.cpython-37.pyc
7.37 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
hybrid.cpython-37.pyc
40.16 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
indexable.cpython-37.pyc
10.51 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
instrumentation.cpython-37.pyc
13.83 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
mutable.cpython-37.pyc
33.29 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
orderinglist.cpython-37.pyc
13.85 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
serializer.cpython-37.pyc
4.78 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-37.pyc
257 B
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
Zip Selected
If ZipArchive is unavailable, a
.tar
will be created (no compression).