REDROOM
PHP 8.3.31
Path:
Logout
Edit File
Size: 35.44 KB
Close
//lib/python3.6/site-packages/__pycache__/distro.cpython-36.pyc
Text
Base64
Mw0NCvb2V1zzqAAA4wAAAAAAAAAAAAAAAAUAAABAAAAAc34BAABkAFoAZAFkAmwBWgFkAWQCbAJaAmQBZAJsA1oDZAFkAmwEWgRkAWQCbAVaBWQBZAJsBloGZAFkAmwHWgdkAWQCbAhaCGUBaglqCmQDZASDAloLZAVaDGQGZAdpAVoNZAdkCGQIZAmcA1oOZApkCGkBWg9lAmoQZAuDAVoRZQJqEGQMgwFaEmQNZA5kD2UMZBBmBVoTZEBkEmQThAFaFGQUZBWEAFoVZEFkF2QYhAFaFmRCZBlkGoQBWhdkQ2QbZByEAVoYZERkHWQehAFaGWRFZB9kIIQBWhpkRmQhZCKEAVobZCNkJIQAWhxkJWQmhABaHWRHZCdkKIQBWh5kKWQqhABaH2QrZCyEAFogZC1kLoQAWiFkL2QwhABaImQxZDKEAFojZDNkNIQAWiRkNWQ2hABaJWQ3ZDiEAFomRwBkOWQ6hABkOmUngwNaKEcAZDtkPIQAZDxlJ4MDWillKYMAWipkPWQ+hABaK2UsZD9rApABcnplK4MAAQBkAlMAKUhhDAMAAApUaGUgYGBkaXN0cm9gYCBwYWNrYWdlIChgYGRpc3Ryb2BgIHN0YW5kcyBmb3IgTGludXggRGlzdHJpYnV0aW9uKSBwcm92aWRlcwppbmZvcm1hdGlvbiBhYm91dCB0aGUgTGludXggZGlzdHJpYnV0aW9uIGl0IHJ1bnMgb24sIHN1Y2ggYXMgYSByZWxpYWJsZQptYWNoaW5lLXJlYWRhYmxlIGRpc3RybyBJRCwgb3IgdmVyc2lvbiBpbmZvcm1hdGlvbi4KCkl0IGlzIHRoZSByZWNvbW1lbmRlZCByZXBsYWNlbWVudCBmb3IgUHl0aG9uJ3Mgb3JpZ2luYWwKOnB5OmZ1bmM6YHBsYXRmb3JtLmxpbnV4X2Rpc3RyaWJ1dGlvbmAgZnVuY3Rpb24sIGJ1dCBpdCBwcm92aWRlcyBtdWNoIG1vcmUKZnVuY3Rpb25hbGl0eS4gQW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gYmVjYW1lIG5lY2Vzc2FyeSBiZWNhdXNlIFB5dGhvbgozLjUgZGVwcmVjYXRlZCB0aGlzIGZ1bmN0aW9uLCBhbmQgUHl0aG9uIDMuOCB3aWxsIHJlbW92ZSBpdCBhbHRvZ2V0aGVyLgpJdHMgcHJlZGVjZXNzb3IgZnVuY3Rpb24gOnB5OmZ1bmM6YHBsYXRmb3JtLmRpc3RgIHdhcyBhbHJlYWR5CmRlcHJlY2F0ZWQgc2luY2UgUHl0aG9uIDIuNiBhbmQgd2lsbCBhbHNvIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDMuOC4KU3RpbGwsIHRoZXJlIGFyZSBtYW55IGNhc2VzIGluIHdoaWNoIGFjY2VzcyB0byBPUyBkaXN0cmlidXRpb24gaW5mb3JtYXRpb24KaXMgbmVlZGVkLiBTZWUgYFB5dGhvbiBpc3N1ZSAxMzIyIDxodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEzMjI+YF8gZm9yCm1vcmUgaW5mb3JtYXRpb24uCukAAAAATloLVU5JWENPTkZESVJ6BC9ldGN6Cm9zLXJlbGVhc2VaAm9sWgZvcmFjbGVaBHJoZWwpA1oUZW50ZXJwcmlzZWVudGVycHJpc2VaG3JlZGhhdGVudGVycHJpc2V3b3Jrc3RhdGlvbloWcmVkaGF0ZW50ZXJwcmlzZXNlcnZlcloGcmVkaGF0ekEoPzpbXildKlwpKC4qKVwoKT8gKig/OlNUTCApPyhbXGQuK1wtYS16XSpcZCkgKig/OmVzYWVsZXIgKik/KC4rKXobKFx3KylbLV9dKHJlbGVhc2V8dmVyc2lvbikkWg5kZWJpYW5fdmVyc2lvbnoLbHNiLXJlbGVhc2V6C29lbS1yZWxlYXNleg5zeXN0ZW0tcmVsZWFzZVRjAQAAAAAAAAABAAAAAgAAAEMAAABzCgAAAHQAagF8AIMBUwApAWEbBAAACiAgICBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uIGFzIGEgdHVwbGUKICAgIGBgKGlkX25hbWUsIHZlcnNpb24sIGNvZGVuYW1lKWBgIHdpdGggaXRlbXMgYXMgZm9sbG93czoKCiAgICAqIGBgaWRfbmFtZWBgOiAgSWYgKmZ1bGxfZGlzdHJpYnV0aW9uX25hbWUqIGlzIGZhbHNlLCB0aGUgcmVzdWx0IG9mCiAgICAgIDpmdW5jOmBkaXN0cm8uaWRgLiBPdGhlcndpc2UsIHRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5uYW1lYC4KCiAgICAqIGBgdmVyc2lvbmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gLgoKICAgICogYGBjb2RlbmFtZWBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLmNvZGVuYW1lYC4KCiAgICBUaGUgaW50ZXJmYWNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBvcmlnaW5hbAogICAgOnB5OmZ1bmM6YHBsYXRmb3JtLmxpbnV4X2Rpc3RyaWJ1dGlvbmAgZnVuY3Rpb24sIHN1cHBvcnRpbmcgYSBzdWJzZXQgb2YKICAgIGl0cyBwYXJhbWV0ZXJzLgoKICAgIFRoZSBkYXRhIGl0IHJldHVybnMgbWF5IG5vdCBleGFjdGx5IGJlIHRoZSBzYW1lLCBiZWNhdXNlIGl0IHVzZXMgbW9yZSBkYXRhCiAgICBzb3VyY2VzIHRoYW4gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLCBhbmQgdGhhdCBtYXkgbGVhZCB0byBkaWZmZXJlbnQgZGF0YSBpZgogICAgdGhlIE9TIGRpc3RyaWJ1dGlvbiBpcyBub3QgY29uc2lzdGVudCBhY3Jvc3MgbXVsdGlwbGUgZGF0YSBzb3VyY2VzIGl0CiAgICBwcm92aWRlcyAodGhlcmUgYXJlIGluZGVlZCBzdWNoIGRpc3RyaWJ1dGlvbnMgLi4uKS4KCiAgICBBbm90aGVyIHJlYXNvbiBmb3IgZGlmZmVyZW5jZXMgaXMgdGhlIGZhY3QgdGhhdCB0aGUgOmZ1bmM6YGRpc3Ryby5pZGAKICAgIG1ldGhvZCBub3JtYWxpemVzIHRoZSBkaXN0cm8gSUQgc3RyaW5nIHRvIGEgcmVsaWFibGUgbWFjaGluZS1yZWFkYWJsZSB2YWx1ZQogICAgZm9yIGEgbnVtYmVyIG9mIHBvcHVsYXIgT1MgZGlzdHJpYnV0aW9ucy4KICAgICkC2gdfZGlzdHJv2hJsaW51eF9kaXN0cmlidXRpb24pAdoWZnVsbF9kaXN0cmlidXRpb25fbmFtZakAcgUAAAD6HC91c3IvbGliL3B5dGhvbjMuNi9kaXN0cm8ucHlyAwAAAGEAAABzAgAAAAAZcgMAAABjAAAAAAAAAAAAAAAAAQAAAEMAAABzCAAAAHQAagGDAFMAKQFhJAsAAAogICAgUmV0dXJuIHRoZSBkaXN0cm8gSUQgb2YgdGhlIGN1cnJlbnQgZGlzdHJpYnV0aW9uLCBhcyBhCiAgICBtYWNoaW5lLXJlYWRhYmxlIHN0cmluZy4KCiAgICBGb3IgYSBudW1iZXIgb2YgT1MgZGlzdHJpYnV0aW9ucywgdGhlIHJldHVybmVkIGRpc3RybyBJRCB2YWx1ZSBpcwogICAgKnJlbGlhYmxlKiwgaW4gdGhlIHNlbnNlIHRoYXQgaXQgaXMgZG9jdW1lbnRlZCBhbmQgdGhhdCBpdCBkb2VzIG5vdCBjaGFuZ2UKICAgIGFjcm9zcyByZWxlYXNlcyBvZiB0aGUgZGlzdHJpYnV0aW9uLgoKICAgIFRoaXMgcGFja2FnZSBtYWludGFpbnMgdGhlIGZvbGxvd2luZyByZWxpYWJsZSBkaXN0cm8gSUQgdmFsdWVzOgoKICAgID09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgRGlzdHJvIElEICAgICAgIERpc3RyaWJ1dGlvbgogICAgPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAidWJ1bnR1IiAgICAgICAgVWJ1bnR1CiAgICAiZGViaWFuIiAgICAgICAgRGViaWFuCiAgICAicmhlbCIgICAgICAgICAgUmVkSGF0IEVudGVycHJpc2UgTGludXgKICAgICJjZW50b3MiICAgICAgICBDZW50T1MKICAgICJmZWRvcmEiICAgICAgICBGZWRvcmEKICAgICJzbGVzIiAgICAgICAgICBTVVNFIExpbnV4IEVudGVycHJpc2UgU2VydmVyCiAgICAib3BlbnN1c2UiICAgICAgb3BlblNVU0UKICAgICJhbWF6b24iICAgICAgICBBbWF6b24gTGludXgKICAgICJhcmNoIiAgICAgICAgICBBcmNoIExpbnV4CiAgICAiY2xvdWRsaW51eCIgICAgQ2xvdWRMaW51eCBPUwogICAgImV4aGVyYm8iICAgICAgIEV4aGVyYm8gTGludXgKICAgICJnZW50b28iICAgICAgICBHZW5Ub28gTGludXgKICAgICJpYm1fcG93ZXJrdm0iICBJQk0gUG93ZXJLVk0KICAgICJrdm1pYm0iICAgICAgICBLVk0gZm9yIElCTSB6IFN5c3RlbXMKICAgICJsaW51eG1pbnQiICAgICBMaW51eCBNaW50CiAgICAibWFnZWlhIiAgICAgICAgTWFnZWlhCiAgICAibWFuZHJpdmEiICAgICAgTWFuZHJpdmEgTGludXgKICAgICJwYXJhbGxlbHMiICAgICBQYXJhbGxlbHMKICAgICJwaWRvcmEiICAgICAgICBQaWRvcmEKICAgICJyYXNwYmlhbiIgICAgICBSYXNwYmlhbgogICAgIm9yYWNsZSIgICAgICAgIE9yYWNsZSBMaW51eCAoYW5kIE9yYWNsZSBFbnRlcnByaXNlIExpbnV4KQogICAgInNjaWVudGlmaWMiICAgIFNjaWVudGlmaWMgTGludXgKICAgICJzbGFja3dhcmUiICAgICBTbGFja3dhcmUKICAgICJ4ZW5zZXJ2ZXIiICAgICBYZW5TZXJ2ZXIKICAgICJvcGVuYnNkIiAgICAgICBPcGVuQlNECiAgICAibmV0YnNkIiAgICAgICAgTmV0QlNECiAgICAiZnJlZWJzZCIgICAgICAgRnJlZUJTRAogICAgPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgSWYgeW91IGhhdmUgYSBuZWVkIHRvIGdldCBkaXN0cm9zIGZvciByZWxpYWJsZSBJRHMgYWRkZWQgaW50byB0aGlzIHNldCwKICAgIG9yIGlmIHlvdSBmaW5kIHRoYXQgdGhlIDpmdW5jOmBkaXN0cm8uaWRgIGZ1bmN0aW9uIHJldHVybnMgYSBkaWZmZXJlbnQKICAgIGRpc3RybyBJRCBmb3Igb25lIG9mIHRoZSBsaXN0ZWQgZGlzdHJvcywgcGxlYXNlIGNyZWF0ZSBhbiBpc3N1ZSBpbiB0aGUKICAgIGBkaXN0cm8gaXNzdWUgdHJhY2tlcmBfLgoKICAgICoqTG9va3VwIGhpZXJhcmNoeSBhbmQgdHJhbnNmb3JtYXRpb25zOioqCgogICAgRmlyc3QsIHRoZSBJRCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcywgaW4gdGhlIHNwZWNpZmllZAogICAgb3JkZXIuIFRoZSBmaXJzdCBhdmFpbGFibGUgYW5kIG5vbi1lbXB0eSB2YWx1ZSBpcyB1c2VkOgoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiSUQiIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLAoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiRGlzdHJpYnV0b3IgSUQiIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgY29tbWFuZCwKCiAgICAqIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBmaWxlIG5hbWUgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUsCgogICAgVGhlIHNvIGRldGVybWluZWQgSUQgdmFsdWUgdGhlbiBwYXNzZXMgdGhlIGZvbGxvd2luZyB0cmFuc2Zvcm1hdGlvbnMsCiAgICBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2Q6CgogICAgKiBpdCBpcyB0cmFuc2xhdGVkIHRvIGxvd2VyIGNhc2UsCgogICAgKiBibGFua3MgKHdoaWNoIHNob3VsZCBub3QgYmUgdGhlcmUgYW55d2F5KSBhcmUgdHJhbnNsYXRlZCB0byB1bmRlcnNjb3JlcywKCiAgICAqIGEgbm9ybWFsaXphdGlvbiBvZiB0aGUgSUQgaXMgcGVyZm9ybWVkLCBiYXNlZCB1cG9uCiAgICAgIGBub3JtYWxpemF0aW9uIHRhYmxlc2BfLiBUaGUgcHVycG9zZSBvZiB0aGlzIG5vcm1hbGl6YXRpb24gaXMgdG8gZW5zdXJlCiAgICAgIHRoYXQgdGhlIElEIGlzIGFzIHJlbGlhYmxlIGFzIHBvc3NpYmxlLCBldmVuIGFjcm9zcyBpbmNvbXBhdGlibGUgY2hhbmdlcwogICAgICBpbiB0aGUgT1MgZGlzdHJpYnV0aW9ucy4gQSBjb21tb24gcmVhc29uIGZvciBhbiBpbmNvbXBhdGlibGUgY2hhbmdl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b24tZW1wdHkgKGUuZy4gIjcuMCAoTWFpcG8pIikuCgogICAgU29tZSBkaXN0cmlidXRpb25zIHByb3ZpZGUgdmVyc2lvbiBudW1iZXJzIHdpdGggZGlmZmVyZW50IHByZWNpc2lvbnMgaW4KICAgIHRoZSBkaWZmZXJlbnQgc291cmNlcyBvZiBkaXN0cmlidXRpb24gaW5mb3JtYXRpb24uIEV4YW1pbmluZyB0aGUgZGlmZmVyZW50CiAgICBzb3VyY2VzIGluIGEgZml4ZWQgcHJpb3JpdHkgb3JkZXIgZG9lcyBub3QgYWx3YXlzIHlpZWxkIHRoZSBtb3N0IHByZWNpc2UKICAgIHZlcnNpb24gKGUuZy4gZm9yIERlYmlhbiA4LjIsIG9yIENlbnRPUyA3LjEpLgoKICAgIFRoZSAqYmVzdCogcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGFwcHJvYWNoIGZvciB0aGUgcmV0dXJuZWQKICAgIHZlcnNpb246CgogICAgSWYgKmJlc3QqIGlzIGZhbHNlLCB0aGUgZmlyc3Qgbm9uLWVtcHR5IHZlcnNpb24gbnVtYmVyIGluIHByaW9yaXR5IG9yZGVyIG9mCiAgICB0aGUgZXhhbWluZWQgc291cmNlcyBpcyByZXR1cm5lZC4KCiAgICBJZiAqYmVzdCogaXMgdHJ1ZSwgdGhlIG1vc3QgcHJlY2lzZSB2ZXJzaW9uIG51bWJlciBvdXQgb2YgYWxsIGV4YW1pbmVkCiAgICBzb3VyY2VzIGlzIHJldHVybmVkLgoKICAgICoqTG9va3VwIGhpZXJhcmNoeToqKgoKICAgIEluIGFsbCBjYXNlcywgdGhlIHZlcnNpb24gbnVtYmVyIGlzIG9idGFpbmVkIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2VzLgogICAgSWYgKmJlc3QqIGlzIGZhbHNlLCB0aGlzIG9yZGVyIHJlcHJlc2VudHMgdGhlIHByaW9yaXR5IG9yZGVyOgoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiVkVSU0lPTl9JRCIgYXR0cmlidXRlIG9mIHRoZSBvcy1yZWxlYXNlIGZpbGUsCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIlJlbGVhc2UiIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgY29tbWFuZCwKICAgICogdGhlIHZlcnNpb24gbnVtYmVyIHBhcnNlZCBmcm9tIHRoZSAiPHZlcnNpb25faWQ+IiBmaWVsZCBvZiB0aGUgZmlyc3QgbGluZQogICAgICBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSwKICAgICogdGhlIHZlcnNpb24gbnVtYmVyIHBhcnNlZCBmcm9tIHRoZSAiUFJFVFRZX05BTUUiIGF0dHJpYnV0ZSBvZiB0aGUKICAgICAgb3MtcmVsZWFzZSBmaWxlLCBpZiBpdCBmb2xsb3dzIHRoZSBmb3JtYXQgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGVzLgogICAgKiB0aGUgdmVyc2lvbiBudW1iZXIgcGFyc2VkIGZyb20gdGhlICJEZXNjcmlwdGlvbiIgYXR0cmlidXRlIHJldHVybmVkIGJ5CiAgICAgIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kLCBpZiBpdCBmb2xsb3dzIHRoZSBmb3JtYXQgb2YgdGhlIGRpc3RybyByZWxlYXNlCiAgICAgIGZpbGVzLgogICAgKQJyAgAAANoHdmVyc2lvbikCcgkAAADaBGJlc3RyBQAAAHIFAAAAcgYAAAByCgAAAPIAAABzAgAAAAApcgoAAABjAQAAAAAAAAABAAAAAgAAAEMAAABzCgAAAHQAagF8AIMBUwApAWGgAQAACiAgICBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uIGFzIGEgdHVwbGUKICAgIGBgKG1ham9yLCBtaW5vciwgYnVpbGRfbnVtYmVyKWBgIHdpdGggaXRlbXMgYXMgZm9sbG93czoKCiAgICAqIGBgbWFqb3JgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5tYWpvcl92ZXJzaW9uYC4KCiAgICAqIGBgbWlub3JgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5taW5vcl92ZXJzaW9uYC4KCiAgICAqIGBgYnVpbGRfbnVtYmVyYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0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IHRoZSBvcy1yZWxlYXNlIGZpbGUuCiAgICBGb3IgZGV0YWlscywgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgIklEX0xJS0UiIGF0dHJpYnV0ZSBpbiB0aGUKICAgIGBvcy1yZWxlYXNlIG1hbiBwYWdlCiAgICA8aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvc3lzdGVtZC9tYW4vb3MtcmVsZWFzZS5odG1sPmBfLgogICAgKQJyAgAAANoEbGlrZXIFAAAAcgUAAAByBQAAAHIGAAAAchAAAABWAQAAcwIAAAAADnIQAAAAYwAAAAAAAAAAAAAAAAEAAABDAAAAcwgAAAB0AGoBgwBTACkBYaYCAAAKICAgIFJldHVybiB0aGUgY29kZW5hbWUgZm9yIHRoZSByZWxlYXNlIG9mIHRoZSBjdXJyZW50IE9TIGRpc3RyaWJ1dGlvbiwKICAgIGFzIGEgc3RyaW5nLgoKICAgIElmIHRoZSBkaXN0cmlidXRpb24gZG9lcyBub3QgaGF2ZSBhIGNvZGVuYW1lLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCgogICAgTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBjb2RlbmFtZSBpcyBub3QgYWx3YXlzIHJlYWxseSBhIGNvZGVuYW1lLiBGb3IKICAgIGV4YW1wbGUsIG9wZW5TVVNFIHJldHVybnMgIng4Nl82NCIuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGFuZGxlIHN1Y2gKICAgIGNhc2VzIGluIGFueSBzcGVjaWFsIHdheSBhbmQganVzdCByZXR1cm5zIHRoZSBzdHJpbmcgaXQgZmluZHMsIGlmIGFueS4KCiAgICAqKkxvb2t1cCBoaWVyYXJjaHk6KioKCiAgICAqIHRoZSBjb2RlbmFtZSB3aXRoaW4gdGhlICJWRVJTSU9OIiBhdHRyaWJ1dGUgb2YgdGhlIG9zLXJlbGVhc2UgZmlsZSwgaWYKICAgICAgcHJvdmlkZWQsCgogICAgKiB0aGUgdmFsdWUgb2YgdGhlICJDb2RlbmFtZSIgYXR0cmlidXRlIHJldHVybmVkIGJ5IHRoZSBsc2JfcmVsZWFzZQogICAgICBjb21tYW5kLAoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiPGNvZGVuYW1lPiIgZmllbGQgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUuCiAgICApAnICAAAA2ghjb2RlbmFtZXIFAAAAcgUAAAByBQAAAHIGAAAAchEAAABnAQAAcwIAAAAAFXIRAAAAYwIAAAAAAAAAAgAAAAMAAABDAAAAcwwAAAB0AGoBfAB8AYMCUwApAWHUBAAACiAgICBSZXR1cm4gY2VydGFpbiBtYWNoaW5lLXJlYWRhYmxlIGluZm9ybWF0aW9uIGl0ZW1zIGFib3V0IHRoZSBjdXJyZW50IE9TCiAgICBkaXN0cmlidXRpb24gaW4gYSBkaWN0aW9uYXJ5LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CgogICAgLi4gc291cmNlY29kZTo6IHB5dGhvbgoKICAgICAgICB7CiAgICAgICAgICAgICdpZCc6ICdyaGVsJywKICAgICAgICAgICAgJ3ZlcnNpb24nOiAnNy4wJywKICAgICAgICAgICAgJ3ZlcnNpb25fcGFydHMnOiB7CiAgICAgICAgICAgICAgICAnbWFqb3InOiAnNycsCiAgICAgICAgICAgICAgICAnbWlub3InOiAnMCcsCiAgICAgICAgICAgICAgICAnYnVpbGRfbnVtYmVyJzogJycKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ2xpa2UnOiAnZmVkb3JhJywKICAgICAgICAgICAgJ2NvZGVuYW1lJzogJ01haXBvJwogICAgICAgIH0KCiAgICBUaGUgZGljdGlvbmFyeSBzdHJ1Y3R1cmUgYW5kIGtleXMgYXJlIGFsd2F5cyB0aGUgc2FtZSwgcmVnYXJkbGVzcyBvZiB3aGljaAogICAgaW5mb3JtYXRpb24gaXRlbXMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZXMuIFRoZSB2YWx1ZXMKICAgIGZvciB0aGUgdmFyaW91cyBrZXlzIGFyZSBhcyBmb2xsb3dzOgoKICAgICogYGBpZGBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLmlkYC4KCiAgICAqIGBgdmVyc2lvbmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gLgoKICAgICogYGB2ZXJzaW9uX3BhcnRzIC0+IG1ham9yYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubWFqb3JfdmVyc2lvbmAuCgogICAgKiBgYHZlcnNpb25fcGFydHMgLT4gbWlub3JgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5taW5vcl92ZXJzaW9uYC4KCiAgICAqIGBgdmVyc2lvbl9wYXJ0cyAtPiBidWlsZF9udW1iZXJgYDogIFRoZSByZXN1bHQgb2YKICAgICAgOmZ1bmM6YGRpc3Ryby5idWlsZF9udW1iZXJgLgoKICAgICogYGBsaWtlYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubGlrZWAuCgogICAgKiBgYGNvZGVuYW1lYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8uY29kZW5hbWVgLgoKICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSAqcHJldHR5KiBhbmQgKmJlc3QqIHBhcmFtZXRlcnMsIHNlZSB0aGUKICAgIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAgbWV0aG9kLgogICAgKQJyAgAAANoEaW5mbykCcgkAAAByCwAAAHIFAAAAcgUAAAByBgAAAHISAAAAfwEAAHMCAAAAAClyEgAAAGMAAAAAAAAAAAAAAAABAAAAQwAAAHMIAAAAdABqAYMAUwApAXriCiAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24gaXRlbXMKICAgIGZyb20gdGhlIG9zLXJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBPUyBkaXN0cmlidXRpb24uCgogICAgU2VlIGBvcy1yZWxlYXNlIGZpbGVgXyBmb3IgZGV0YWlscyBhYm91dCB0aGVzZSBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICkCcgIAAADaD29zX3JlbGVhc2VfaW5mb3IFAAAAcgUAAAByBQAAAHIGAAAAchMAAACrAQAAcwIAAAAAB3ITAAAAYwAAAAAAAAAAAAAAAAEAAABDAAAAcwgAAAB0AGoBgwBTACkBevUKICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbiBpdGVtcwogICAgZnJvbSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBPUyBkaXN0cmlidXRpb24uCgogICAgU2VlIGBsc2JfcmVsZWFzZSBjb21tYW5kIG91dHB1dGBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uCiAgICBpdGVtcy4KICAgICkCcgIAAADaEGxzYl9yZWxlYXNlX2luZm9yBQAAAHIFAAAAcgUAAAByBgAAAHIUAAAAtQEAAHMCAAAAAAhyFAAAAGMAAAAAAAAAAAAAAAABAAAAQwAAAHMIAAAAdABqAYMAUwApAXrqCiAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24gaXRlbXMKICAgIGZyb20gdGhlIGRpc3RybyByZWxlYXNlIGZpbGUgZGF0YSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uLgoKICAgIFNlZSBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgKQJyAgAAANoTZGlzdHJvX3JlbGVhc2VfaW5mb3IFAAAAcgUAAAByBQAAAHIGAAAAchUAAADAAQAAcwIAAAAAB3IVAAAAYwAAAAAAAAAAAAAAAAEAAABDAAAAcwgAAAB0AGoBgwBTACkBep8KICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbiBpdGVtcwogICAgZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBPUyBkaXN0cmlidXRpb24uCiAgICApAnICAAAA2gp1bmFtZV9p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ICAgcGFja2FnZSBydW5zIG9uKS4KCiAgICBOb3JtYWxseSwgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjcmVhdGUgYWRkaXRpb25hbCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KICAgIEhvd2V2ZXIsIGluIHNpdHVhdGlvbnMgd2hlcmUgY29udHJvbCBpcyBuZWVkZWQgb3ZlciB0aGUgZXhhY3QgZGF0YSBzb3VyY2VzCiAgICB0aGF0IGFyZSB1c2VkLCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBjYW4gYmUgY3JlYXRlZCB3aXRoIGEgc3BlY2lmaWMKICAgIGRpc3RybyByZWxlYXNlIGZpbGUsIG9yIGEgc3BlY2lmaWMgb3MtcmVsZWFzZSBmaWxlLCBvciB3aXRob3V0IGludm9raW5nIHRoZQogICAgbHNiX3JlbGVhc2UgY29tbWFuZC4KICAgIFTaAGMFAAAAAAAAAAUAAAADAAAAQwAAAHMuAAAAfAJwEHQAagFqAnQDdASDAnwAXwV8A3AaZAF8AF8GfAF8AF8HfAR8AF8IZAJTACkDYW8LAAAKICAgICAgICBUaGUgaW5pdGlhbGl6YXRpb24gbWV0aG9kIG9mIHRoaXMgY2xhc3MgZ2F0aGVycyBpbmZvcm1hdGlvbiBmcm9tIHRoZQogICAgICAgIGF2YWlsYWJsZSBkYXRhIHNvdXJjZXMsIGFuZCBzdG9yZXMgdGhhdCBpbiBwcml2YXRlIGluc3RhbmNlIGF0dHJpYnV0ZXMuCiAgICAgICAgU3Vic2VxdWVudCBhY2Nlc3MgdG8gdGhlIGluZm9ybWF0aW9uIGl0ZW1zIHVzZXMgdGhlc2UgcHJpdmF0ZSBpbnN0YW5jZQogICAgICAgIGF0dHJpYnV0ZXMsIHNvIHRoYXQgdGhlIGRhdGEgc291cmNlcyBhcmUgcmVhZCBvbmx5IG9uY2UuCgogICAgICAgIFBhcmFtZXRlcnM6CgogICAgICAgICogYGBpbmNsdWRlX2xzYmBgIChib29sKTogQ29udHJvbHMgd2hldGhlciB0aGUKICAgICAgICAgIGBsc2JfcmVsZWFzZSBjb21tYW5kIG91dHB1dGBfIGlzIGluY2x1ZGVkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgICAgSWYgdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgcHJvZ3JhbSBleGVjdXRpb24KICAgICAgICAgIHBhdGgsIHRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgd2lsbCBiZSBlbXB0eS4KCiAgICAgICAgKiBgYG9zX3JlbGVhc2VfZmlsZWBgIChzdHJpbmcpOiBUaGUgcGF0aCBuYW1lIG9mIHRoZQogICAgICAgICAgYG9zLXJlbGVhc2UgZmlsZWBfIHRoYXQgaXMgdG8gYmUgdXNlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAgIEFuIGVtcHR5IHN0cmluZyAodGhlIGRlZmF1bHQpIHdpbGwgY2F1c2UgdGhlIGRlZmF1bHQgcGF0aCBuYW1lIHRvCiAgICAgICAgICBiZSB1c2VkIChzZWUgYG9zLXJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzKS4KCiAgICAgICAgICBJZiB0aGUgc3BlY2lmaWVkIG9yIGRlZmF1bHRlZCBvcy1yZWxlYXNlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZQogICAgICAgICAgZGF0YSBzb3VyY2UgZm9yIHRoZSBvcy1yZWxlYXNlIGZpbGUgd2lsbCBiZSBlbXB0eS4KCiAgICAgICAgKiBgYGRpc3Ryb19yZWxlYXNlX2ZpbGVgYCAoc3RyaW5nKTogVGhlIHBhdGggbmFtZSBvZiB0aGUKICAgICAgICAgIGBkaXN0cm8gcmVsZWFzZSBmaWxlYF8gdGhhdCBpcyB0byBiZSB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgICAgQW4gZW1wdHkgc3RyaW5nICh0aGUgZGVmYXVsdCkgd2lsbCBjYXVzZSBhIGRlZmF1bHQgc2VhcmNoIGFsZ29yaXRobQogICAgICAgICAgdG8gYmUgdXNlZCAoc2VlIGBkaXN0cm8gcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMpLgoKICAgICAgICAgIElmIHRoZSBzcGVjaWZpZWQgZGlzdHJvIHJlbGVhc2UgZmlsZSBkb2VzIG5vdCBleGlzdCwgb3IgaWYgbm8gZGVmYXVsdAogICAgICAgICAgZGlzdHJvIHJlbGVhc2UgZmlsZSBjYW4gYmUgZm91bmQsIHRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIGRpc3RybwogICAgICAgICAgcmVsZWFzZSBmaWxlIHdpbGwgYmUgZW1wdHkuCgogICAgICAgICogYGBpbmNsdWRlX25hbWVgYCAoYm9vbCk6IENvbnRyb2xzIHdoZXRoZXIgdW5hbWUgY29tbWFuZCBvdXRwdXQgaXMKICAgICAgICAgIGluY2x1ZGVkIGFzIGEgZGF0YSBzb3VyY2UuIElmIHRoZSB1bmFtZSBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgaW4KICAgICAgICAgIHRoZSBwcm9ncmFtIGV4ZWN1dGlvbiBwYXRoIHRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIHVuYW1lIGNvbW1hbmQgd2lsbAogICAgICAgICAgYmUgZW1wdHkuCgogICAgICAgIFB1YmxpYyBpbnN0YW5jZSBhdHRyaWJ1dGVzOgoKICAgICAgICAqIGBgb3NfcmVsZWFzZV9maWxlYGAgKHN0cmluZyk6IFRoZSBwYXRoIG5hbWUgb2YgdGhlCiAgICAgICAgICBgb3MtcmVsZWFzZSBmaWxlYF8gdGhhdCBpcyBhY3R1YWxseSB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuIFRoZQogICAgICAgICAgZW1wdHkgc3RyaW5nIGlmIG5vIGRpc3RybyByZWxlYXNlIGZpbGUgaXMgdXNlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAqIGBgZGlzdHJvX3JlbGVhc2VfZmlsZWBgIChzdHJpbmcpOiBUaGUgcGF0aCBuYW1lIG9mIHRoZQogICAgICAgICAgYGRpc3RybyByZWxlYXNlIGZpbGVgXyB0aGF0IGlzIGFjdHVhbGx5IHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4gVGhlCiAgICAgICAgICBlbXB0eSBzdHJpbmcgaWYgbm8gZGlzdHJvIHJlbGVhc2UgZmlsZSBpcyB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgICogYGBpbmNsdWRlX2xzYmBgIChib29sKTogVGhlIHJlc3VsdCBvZiB0aGUgYGBpbmNsdWRlX2xzYmBgIHBhcmFtZXRlci4KICAgICAgICAgIFRoaXMgY29udHJvbHMgd2hldGhlciB0aGUgbHNiIGluZm9ybWF0aW9uIHdpbGwgYmUgbG9hZGVkLgoKICAgICAgICAqIGBgaW5jbHVkZV91bmFtZWBgIChib29sKTogVGhlIHJlc3VsdCBvZiB0aGUgYGBpbmNsdWRlX3VuYW1lYGAKICAgICAgICAgIHBhcmFtZXRlci4gVGhpcyBjb250cm9scyB3aGV0aGVyIHRoZSB1bmFtZSBpbmZvcm1hdGlvbiB3aWxsCiAgICAgICAgICBiZSBsb2FkZWQuCgogICAgICAgIFJhaXNlczoKCiAgICAgICAgKiA6cHk6ZXhjOmBJT0Vycm9yYDogU29tZSBJL08gaXNzdWUgd2l0aCBhbiBvcy1yZWxlYXNlIGZpbGUgb3IgZGlzdHJvCiAgICAgICAgICByZWxlYXNlIGZpbGUuCgogICAgICAgICogOnB5OmV4Yzpgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3JgOiBUaGUgbHNiX3JlbGVhc2UgY29tbWFuZCBoYWQKICAgICAgICAgIHNvbWUgaXNzdWUgKG90aGVyIHRoYW4gbm90IGJlaW5nIGF2YWlsYWJsZSBpbiB0aGUgcHJvZ3JhbSBleGVjdXRpb24KICAgICAgICAgIHBhdGgpLgoKICAgICAgICAqIDpweTpleGM6YFVuaWNvZGVFcnJvcmA6IEEgZGF0YSBzb3VyY2UgaGFzIHVuZXhwZWN0ZWQgY2hhcmFjdGVycyBvcgogICAgICAgICAgdXNlcyBhbiB1bmV4cGVjdGVkIGVuY29kaW5nLgogICAgICAgIHIuAAAATikJ2gJvc9oEcGF0aNoEam9pbtoMX1VOSVhDT05GRElS2hRfT1NfUkVMRUFTRV9CQVNFTkFNRdoPb3NfcmVsZWFzZV9maWxl2hNkaXN0cm9fcmVsZWFzZV9maWxl2gtpbmNsdWRlX2xzYtoNaW5jbHVkZV91bmFtZSkFciAAAAByNgAAAHI0AAAAcjUAAAByNwAAAHIFAAAAcgUAAAByBgAAAHIiAAAAPgIAAHMKAAAAAEgEARABCgEGAXoaTGludXhEaXN0cmlidXRpb24uX19pbml0X19jAQAAAAAAAAABAAAAAwAAAEMAAABzDAAAAGQBagB8AGQCjQFTACkDeiBSZXR1cm4gcmVwciBvZiBhbGwgaW5mbwogICAgICAgIGFlAQAATGludXhEaXN0cmlidXRpb24ob3NfcmVsZWFzZV9maWxlPXtzZWxmLm9zX3JlbGVhc2VfZmlsZSFyfSwgZGlzdHJvX3JlbGVhc2VfZmlsZT17c2VsZi5kaXN0cm9fcmVsZWFzZV9maWxlIXJ9LCBpbmNsdWRlX2xzYj17c2VsZi5pbmNsdWRlX2xzYiFyfSwgaW5jbHVkZV91bmFtZT17c2VsZi5pbmNsdWRlX3VuYW1lIXJ9LCBfb3NfcmVsZWFzZV9pbmZvPXtzZWxmLl9vc19yZWxlYXNlX2luZm8hcn0sIF9sc2JfcmVsZWFzZV9pbmZvPXtzZWxmLl9sc2JfcmVsZWFzZV9pbmZvIXJ9LCBfZGlzdHJvX3JlbGVhc2VfaW5mbz17c2VsZi5fZGlzdHJvX3JlbGVhc2VfaW5mbyFyfSwgX3VuYW1lX2luZm89e3NlbGYuX3VuYW1lX2luZm8hcn0pKQFyIAAAACkBciQAAAApAXIgAAAAcgUAAAByBQAAAHIGAAAA2ghfX3JlcHJfX4wCAABzBAAAAAAEBAl6GkxpbnV4RGlzdHJpYnV0aW9uLl9fcmVwcl9fYwIAAAAAAAAAAgAAAAMAAABDAAAAcyIAAAB8AXIMfABqAIMAbgZ8AGoBgwB8AGoCgwB8AGoDgwBmA1MAKQF6+AogICAgICAgIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgT1MgZGlzdHJpYnV0aW9uIHRoYXQgaXMgY29tcGF0aWJsZQogICAgICAgIHdpdGggUHl0aG9uJ3MgOmZ1bmM6YHBsYXRmb3JtLmxpbnV4X2Rpc3RyaWJ1dGlvbmAsIHN1cHBvcnRpbmcgYSBzdWJzZXQKICAgICAgICBvZiBpdHMgcGFyYW1ldGVycy4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmxpbnV4X2Rpc3RyaWJ1dGlvbmAuCiAgICAgICAgKQRyCAAAAHIHAAAAcgoAAAByEQAAACkCciAAAAByBAAAAHIFAAAAcgUAAAByBgAAAHIDAAAAmwIAAHMGAAAAAAkSAQYBeiRM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b21tYW5kIGRhdGEgc291cmNlIG9mIHRoZSBPUwogICAgICAgIGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmxzYl9yZWxlYXNlX2luZm9gLgogICAgICAgICkB2hFfbHNiX3JlbGVhc2VfaW5mbykBciAAAAByBQAAAHIFAAAAcgYAAAByFAAAAFYDAABzAgAAAAAIeiJMaW51eERpc3RyaWJ1dGlvbi5sc2JfcmVsZWFzZV9pbmZvYwEAAAAAAAAAAQAAAAEAAABDAAAAcwYAAAB8AGoAUwApAXrpCiAgICAgICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uCiAgICAgICAgaXRlbXMgZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZSBvZiB0aGUgT1MKICAgICAgICBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5kaXN0cm9fcmVsZWFzZV9pbmZvYC4KICAgICAgICApAdoUX2Rpc3Ryb19yZWxlYXNlX2luZm8pAXIgAAAAcgUAAAByBQAAAHIGAAAAchUAAABgAwAAcwIAAAAACHolTGludXhEaXN0cmlidXRpb24uZGlzdHJvX3JlbGVhc2VfaW5mb2MBAAAAAAAAAAEAAAABAAAAQwAAAHMGAAAAfABqAFMAKQF60gogICAgICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbgogICAgICAgIGl0ZW1zIGZyb20gdGhlIHVuYW1lIGNvbW1hbmQgZGF0YSBzb3VyY2Ugb2YgdGhlIE9TIGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLnVuYW1lX2luZm9gLgogICAgICAgICkB2gtfdW5hbWVfaW5mbykBciAAAAByBQAAAHIFAAAAcgYAAAByFgAAAGoDAABzAgAAAAAHehxMaW51eERpc3RyaWJ1dGlvbi51bmFtZV9pbmZvYwIAAAAAAAAAAgAAAAMAAABDAAAAcw4AAAB8AGoAagF8AWQBgwJTACkCercKICAgICAgICBSZXR1cm4gYSBzaW5nbGUgbmFtZWQgaW5mb3JtYXRpb24gaXRlbSBmcm9tIHRoZSBvcy1yZWxlYXNlIGZpbGUgZGF0YQogICAgICAgIHNvdXJjZSBvZiB0aGUgT1MgZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ub3NfcmVsZWFzZV9hdHRyYC4KICAgICAgICByLgAAACkCclYAAAByPQAAACkCciAAAAByGAAAAHIFAAAAcgUAAAByBgAAAHIXAAAAcwMAAHMCAAAAAAd6IUxpbnV4RGlzdHJpYnV0aW9uLm9zX3JlbGVhc2VfYXR0cmMCAAAAAAAAAAIAAAADAAAAQwAAAHMOAAAAfABqAGoBfAFkAYMCUwApAnrDCiAgICAgICAgUmV0dXJuIGEgc2luZ2xlIG5hbWVkIGluZm9ybWF0aW9uIGl0ZW0gZnJvbSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZAogICAgICAgIG91dHB1dCBkYXRhIHNvdXJjZSBvZiB0aGUgT1MgZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ubHNiX3JlbGVhc2VfYXR0cmAuCiAgICAgICAgci4AAAApAnJZAAAAcj0AAAApAnIgAAAAchgAAAByBQAAAHIFAAAAcgYAAAByGQAAAHwDAABzAgAAAAAHeiJMaW51eERpc3RyaWJ1dGlvbi5sc2JfcmVsZWFzZV9hdHRyYwIAAAAAAAAAAgAAAAMAAABDAAAAcw4AAAB8AGoAagF8AWQBgwJTACkCer8KICAgICAgICBSZXR1cm4gYSBzaW5nbGUgbmFtZWQgaW5mb3JtYXRpb24gaXRlbSBmcm9tIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlCiAgICAgICAgZGF0YSBzb3VyY2Ugb2YgdGhlIE9TIGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmRpc3Ryb19yZWxlYXNlX2F0dHJgLgogICAgICAgIHIuAAAAKQJyWgAAAHI9AAAAKQJyIAAAAHIYAAAAcgUAAAByBQAAAHIGAAAAchoAAACFAwAAcwIAAAAAB3olTGludXhEaXN0cmlidXRpb24uZGlzdHJvX3JlbGVhc2VfYXR0cmMCAAAAAAAAAAIAAAADAAAAQwAAAHMOAAAAfABqAGoBfAFkAYMCUwApAnq/CiAgICAgICAgUmV0dXJuIGEgc2luZ2xlIG5hbWVkIGluZm9ybWF0aW9uIGl0ZW0gZnJvbSB0aGUgdW5hbWUgY29tbWFuZAogICAgICAgIG91dHB1dCBkYXRhIHNvdXJjZSBvZiB0aGUgT1MgZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8udW5hbWVfcmVsZWFzZV9hdHRyYC4KICAgICAgICByLgAAACkCclsAAAByPQAAACkCciAAAAByGAAAAHIFAAAAcgUAAAByBgAAAHIbAAAAjgMAAHMCAAAAAAd6HExpbnV4RGlzdHJpYnV0aW9uLnVuYW1lX2F0dHJjAQAAAAAAAAACAAAACQAAAEMAAABzLgAAAHQAagFqAnwAagODAXIqdAR8AGoDgwGPDH0BfABqBXwBgwFTAFEAUgBYAGkAUwApAnqcCiAgICAgICAgR2V0IHRoZSBpbmZvcm1hdGlvbiBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgb3MtcmVsZWFzZSBmaWxlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAgTikGci8AAAByMAAAANoGaXNmaWxlcjQAAADaBG9wZW7aGV9wYXJzZV9vc19yZWxlYXNlX2NvbnRlbnQpAnIgAAAAWgxyZWxlYXNlX2ZpbGVyBQAAAHIFAAAAcgYAAAByVgAAAJcDAABzCAAAAAAIDgEMARABeiJMaW51eERpc3RyaWJ1dGlvbi5fb3NfcmVsZWFzZV9pbmZvYwEAAAAAAAAACAAAAAQAAABDAAAAcwwBAABpAH0BdABqAHwAZAFkAo0CfQJkAXwCXwF0AmoDZAMZAGQEawJyQHQEfAJqBXQGgwJyQHwCagVqB2QFgwF8Al8FdAh8AoMBfQN4RnwDRABdPn0EZAZ8BGsGck58BGoJZAZkB4MCXAJ9BX0GdAR8BnQGgwJyfnwGagdkCIMBfQZ8BnwBfAVqCoMAPABxTnFOVwBkCXwBawZypnwBZAkZAHwBZAo8AG5iZAt8AWsGcrx8AWQLGQB8AWQKPABuTGQMfAFrBpABcgh0C2oMZA18AWQMGQCDAn0HfAeQAXIIfAdqDYMAfQd8B2oOZA6DAX0HfAdqDmQPgwF9B3wHag6DAH0HfAd8AWQKPAB8AVMAKRBhRAEAAAogICAgICAgIFBhcnNlIHRoZSBsaW5lcyBvZiBhbiBvcy1yZWxlYXNlIGZpbGUuCgogICAgICAgIFBhcmFtZXRlcnM6CgogICAgICAgICogbGluZXM6IEl0ZXJhYmxlIHRocm91Z2ggdGhlIGxpbmVzIGluIHRoZSBvcy1yZWxlYXNlIGZpbGUuCiAgICAgICAgICAgICAgICAgRWFjaCBsaW5lIG11c3QgYmUgYSB1bmljb2RlIHN0cmluZyBvciBhIFVURi04IGVuY29kZWQgYnl0ZQogICAgICAgICAgICAgICAgIHN0cmluZy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgICAgIFQpAdoFcG9zaXhyAQAAAHJVAAAAegppc28tODg1OS0x+gE9clQAAAB6BXV0Zi04WhB2ZXJzaW9uX2NvZGVuYW1lchEAAABaD3VidW50dV9jb2RlbmFtZXIKAAAAehQoXChcRCtcKSl8LChccyspP1xEK3oCKCn6ASwpD9oFc2hsZXhaEHdoaXRlc3BhY2Vfc3BsaXTaA3N5c9oMdmVyc2lvbl9pbmZv2gppc2luc3RhbmNlWgl3b3JkY2hhcnPaBWJ5dGVz2gZkZWNvZGXaBGxpc3TaBXNwbGl0cjsAAAByTQAAANoGc2VhcmNo2gVncm91cNoFc3RyaXApCNoFbGluZXPaBXByb3BzWgVsZXhlctoGdG9rZW5z2gV0b2tlbtoBa3JMAAAAchEAAAByBQAAAHIFAAAAcgYAAAByXgAAAKQDAABzNAAAAAAOBAEOAQYJGgEOAggBCgcIARABCgEKAQ4DBAIIBQ4BCAIOAQoCEAEGAQgBCgEKAQgCCAJ6K0xpbnV4RGlzdHJpYnV0aW9uLl9wYXJzZV9vc19yZWxlYXNlX2NvbnRlbnRjAQAAAAAAAAAFAAAAEgAAAEMAAABzagAAAHwAagBzCmkAUwB0AXQCagNkAYMCjzJ9AXkWZAZ9AnQEagV8AnwBZASNAn0DVwBuFAQAdAZrCnJCAQABAAEAaQBTAFgAVwBkBVEAUgBYAHwDagd0CGoJgwCDAWoKgwB9BHwAagt8BIMBUwApB3qdCiAgICAgICAgR2V0IHRoZSBpbmZvcm1hdGlvbiBpdGVtcyBmcm9tIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIG91dHB1dC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgICAgINoBd9oLbHNiX3JlbGVhc2X6Ai1hKQHaBnN0ZGVyck4pAnJzAAAAcnQAAAApDHI2AAAAcl0AAAByLwAAANoHZGV2bnVsbNoKc3VicHJvY2Vzc9oMY2hlY2tfb3V0cHV02gdPU0Vycm9ycmcAAAByYwAAANoVZ2V0ZmlsZXN5c3RlbWVuY29kaW5n2gpzcGxpdGxpbmVz2hpfcGFyc2VfbHNiX3JlbGVhc2VfY29udGVudCkFciAAAABydgAAANoDY21k2gZzdGRvdXTaB2NvbnRlbnRyBQAAAHIFAAAAcgYAAAByWQAAAOcDAABzFAAAAAAIBgEEAQ4BAgEEARIBDgEQARIBeiNMaW51eERpc3RyaWJ1dGlvbi5fbHNiX3JlbGVhc2VfaW5mb2MBAAAAAAAAAAYAAAAFAAAAQwAAAHNcAAAAaQB9AXhSfABEAF1KfQJ8AmoAZAGDAWoBZAJkA4MCfQN0AnwDgwFkBGsDci5xCnwDXAJ9BH0FfAFqA3wEagRkBWQGgwJqBYMAfAVqAIMAaQGDAQEAcQpXAHwBUwApB2FNAQAACiAgICAgICAgUGFyc2UgdGhlIG91dHB1dCBvZiB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZC4KCiAgICAgICAgUGFyYW1ldGVyczoKCiAgICAgICAgKiBsaW5lczogSXRlcmFibGUgdGhyb3VnaCB0aGUgbGluZXMgb2YgdGhlIGxzYl9yZWxlYXNlIG91dHB1dC4KICAgICAgICAgICAgICAgICBFYWNoIGxpbmUgbXVzdCBiZSBhIHVuaWNvZGUgc3RyaW5nIG9yIGEgVVRGLTggZW5jb2RlZCBieXRlCiAgICAgICAgICAgICAgICAgc3RyaW5nLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAg2gEK+gE6clQAAAByVQAAAHI5AAAAcjoAAAApBnJsAAAAcmkAAADaA2xlbtoGdXBkYXRlcjwAAAByOwAAACkGcm0AAABybgAAANoEbGluZVoCa3ZycQAAAHJMAAAAcgUAAAByBQAAAHIGAAAAcnwAAAD6AwAAcxAAAAAADgQBCgESAQwCAgEIASIBeixMaW51eERpc3RyaWJ1dGlvbi5fcGFyc2VfbHNiX3JlbGVhc2VfY29udGVudGMBAAAAAAAAAAUAAAASAAAAQwAAAHNgAAAAdAB0AWoCZAGDAo8yfQF5FmQFfQJ0A2oEfAJ8AWQEjQJ9A1cAbhQEAHQFawpyOAEAAQABAGkAUwBYAFcAZABRAFIAWAB8A2oGdAdqCIMAgwFqCYMAfQR8AGoKfASDAVMAKQZOcnIAAADaBXVuYW1l+gMtcnMpAXJ1AAAAKQJyhQAAAHKGAAAAKQtyXQAAAHIvAAAAcnYAAABydwAAAHJ4AAAAcnkAAAByZwAAAHJjAAAAcnoAAAByewAAANoUX3BhcnNlX3VuYW1lX2NvbnRlbnQpBXIgAAAAcnYAAAByfQAAAHJ+AAAAcn8AAAByBQAAAHIFAAAAcgYAAAByWwAAABIEAABzEAAAAAACDgECAQQBEgEOARABEgF6HUxpbnV4RGlzdHJpYnV0aW9uLl91bmFtZV9pbmZvYwEAAAAAAAAABQAAAAQAAABDAAAAc1QAAABpAH0BdABqAWQBfABkAhkAagKDAIMCfQJ8AnJQfAJqA4MAXAJ9A30EfANkA2sCcjRpAFMAfANqBIMAfAFkBDwAfAN8AWQFPAB8BHwBZAY8AHwBUwApB056FV4oW15cc10rKVxzKyhbXGRcLl0rKXIBAAAAWgVMaW51eHIHAAAAcggAAABySAAAACkFck0AAAByagAAAHJsAAAAclAAAAByOwAAACkFcm0AAABybgAAAHJPAAAAcggAAAByCgAAAHIFAAAAcgUAAAByBgAAAHKHAAAAHQQAAHMUAAAAAAIEARQBBAEMBQgBBAEMAQgBCAF6JkxpbnV4RGlzdHJpYnV0aW9uLl9wYXJzZV91bmFtZV9jb250ZW50YwEAAAAAAAAABgAAABUAAABDAAAAczABAAB8AGoAcmJ8AGoBfABqAIMBfQF0AmoDagR8AGoAgwF9AnQFagZ8AoMBfQNkAXwBawZyTGQCfAFkARkAageDAGsGckxkAnwBZAM8AG4SfANyXnwDaghkBIMBfAFkAzwAfAFTAHkWdAJqCXQKgwF9BHwEaguDAAEAVwBuNgQAdAxrCnKuAQABAAEAZAVkBmQHZAhkCWQKZAtkDGQNZA5kD2QQZBFkEmQTZw99BFkAbgJYAHh2fAREAF1ufQJ8AnQNawZyxHG2dAVqBnwCgwF9A3wDcrZ0AmoDag50CnwCgwJ9BXwAagF8BYMBfQFkAXwBawZytnwFfABfAHwDaghkBIMBfAFkAzwAZAJ8AWQBGQBqB4MAawaQAXIgZAJ8AWQDPAB8AVMAcbZXAGkAUwBkFFMAKRV6oAogICAgICAgIEdldCB0aGUgaW5mb3JtYXRpb24gaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGRpc3RybyByZWxlYXNlIGZpbGUuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICByCAAAAFoKY2xvdWRsaW51eHIHAAAAclQAAAB6DFN1U0UtcmVsZWFzZXoMYXJjaC1yZWxlYXNlegxiYXNlLXJlbGVhc2V6DmNlbnRvcy1yZWxlYXNleg5mZWRvcmEtcmVsZWFzZXoOZ2VudG9vLXJlbGVhc2V6Dm1hZ2VpYS1yZWxlYXNlehBtYW5kcmFrZS1yZWxlYXNlehBtYW5kcml2YS1yZWxlYXNlehVtYW5kcml2YWxpbnV4LXJlbGVhc2V6D21hbmphcm8tcmVsZWFzZXoOb3JhY2xlLXJlbGVhc2V6DnJlZGhhdC1yZWxlYXNlegpzbC1yZWxlYXNlehFzbGFja3dhcmUtdmVyc2lvbk4pD3I1AAAA2hpfcGFyc2VfZGlzdHJvX3JlbGVhc2VfZmlsZXIvAAAAcjAAAADaCGJhc2VuYW1l2iBfRElTVFJPX1JFTEVBU0VfQkFTRU5BTUVfUEFUVEVSTnJPAAAAcjsAAAByawAAANoHbGlzdGRpcnIyAAAA2gRzb3J0cnkAAADaIF9ESVNUUk9fUkVMRUFTRV9JR05PUkVfQkFTRU5BTUVTcjEAAAApBnIgAAAA2gtkaXN0cm9faW5mb3KJAAAAck8AAABaCWJhc2VuYW1lc9oIZmlsZXBhdGhyBQAAAHIFAAAAcgYAAAByWgAAAC4EAABzWAAAAAAIBgMEAQgBDgUKAQgBEAEKAQQBDgEEAgIBCgQMAQ4FAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQwBCgEIAQIBCgEEAQ4BCgEIAgYBDgESAQgBCAF6JkxpbnV4RGlzdHJpYnV0aW9uLl9kaXN0cm9fcmVsZWFzZV9pbmZvYwIAAAAAAAAAAwAAAA8AAABDAAAAc0AAAAB5InQAfAGDAY8QfQJ8AGoBfAJqAoMAgwFTAFEAUgBYAFcAbhgEAHQDdARmAmsKcjoBAAEAAQBpAFMAWABkAVMAKQJ6ywogICAgICAgIFBhcnNlIGEgZGlzdHJvIHJlbGVhc2UgZmlsZS4KCiAgICAgICAgUGFyYW1ldGVyczoKCiAgICAgICAgKiBmaWxlcGF0aDogUGF0aCBuYW1lIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAgTikFcl0AAABySgAAANoIcmVhZGxpbmVyeQAAANoHSU9FcnJvcikDciAAAAByjwAAANoCZnByBQAAAHIFAAAAcgYAAAByiAAAAHIEAABzCgAAAAALAgEKAxgBEgR6LExpbnV4RGlzdHJpYnV0aW9uLl9wYXJzZV9kaXN0cm9fcmVsZWFzZV9maWxlYwEAAAAAAAAAAwAAAAUAAABDAAAAc6YAAAB0AHwAdAGDAnIUfABqAmQBgwF9AHQDagR8AGoFgwBkAmQCZAmFAxkAgwF9AWkAfQJ8AXKSfAFqBmQEgwFkAmQCZAqFAxkAfAJkBTwAfAFqBmQGgwFybnwBagZkBoMBZAJkAmQLhQMZAHwCZAc8AHwBagZkA4MBcqJ8AWoGZAODAWQCZAJkDIUDGQB8AmQIPABuEHwAcqJ8AGoFgwB8AmQFPAB8AlMAKQ1hGAEAAAogICAgICAgIFBhcnNlIGEgbGluZSBmcm9tIGEgZGlzdHJvIHJlbGVhc2UgZmlsZS4KCiAgICAgICAgUGFyYW1ldGVyczoKICAgICAgICAqIGxpbmU6IExpbmUgZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZS4gTXVzdCBiZSBhIHVuaWNvZGUgc3RyaW5nCiAgICAgICAgICAgICAgICBvciBhIFVURi04IGVuY29kZWQgYnl0ZSBzdHJpbmcuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICB6BXV0Zi04TnJUAAAA6QMAAAByCAAAAHJVAAAAckcAAAByEQAAAOn/////cpQAAABylAAAAHKUAAAAKQdyZQAAAHJmAAAAcmcAAADaKF9ESVNUUk9fUkVMRUFTRV9DT05URU5UX1JFVkVSU0VEX1BBVFRFUk5yTwAAAHJsAAAAcmsAAAApA3KEAAAAclEAAAByjgAAAHIFAAAAcgUAAAByBgAAAHJKAAAAiAQAAHMcAAAAAAwKAQoBBAEUAQQBBAIYAQoBGAEKARoBBAEMAXovTGludXhEaXN0cmlidXRpb24uX3BhcnNlX2Rpc3Ryb19yZWxlYXNlX2NvbnRlbnROKQRUci4AAAByLgAAAFQpAVQpAUYpAkZGKQFGKQFGKQFGKQFGKQJGRikkch0AAAByKgAAAHIrAAAAciwAAAByIgAAAHI4AAAAcgMAAAByBwAAAHIIAAAAcgoAAAByDAAAAHINAAAAcg4AAAByDwAAAHIQAAAAchEAAAByEgAAAHITAAAAchQAAAByFQAAAHIWAAAAchcAAAByGQAAAHIaAAAAchsAAAByHAAAAHJWAAAA2gxzdGF0aWNtZXRob2RyXgAAAHJZAAAAcnwAAAByWwAAAHKHAAAAcloAAAByiAAAAHJKAAAAcgUAAAByBQAAAHIFAAAAcgYAAAByLQAAACwCAABzRAAAAAgQBAMAAQABAAEKSggPCg4IGwoVCiIKEAoICggKCAgICA8KEwgJCAoICggJCAkICQgJCAkMDQxDDBMMGAwLDBEMRAgWci0AAABjAAAAAAAAAAAFAAAABgAAAEMAAABzrAAAAHQAagF0AoMBfQB8AGoDdABqBIMBAQB8AGoFdABqBnQHagiDAYMBAQB0CWoKZAFkAo0BfQF8AWoLZANkBGQFZAZkB40EAQB8AWoMgwB9AnwCag1ybnwAag50DWoPdA6DAGQIZAlkCo0DgwEBAG46fABqDmQLdBBkCWQMjQGDAgEAdBFkCWQMjQF9A3wAag5kDXwDgwIBAHQSgwB9BHwAag5kDnwEgwIBAGQAUwApD056E09TIGRpc3RybyBpbmZvIHRvb2wpAXJGAAAAegYtLWpzb256Ai1qeiFPdXRwdXQgaW4gbWFjaGluZSByZWFkYWJsZSBmb3JtYXTaCnN0b3JlX3RydWUpAtoEaGVscNoGYWN0aW9u6QQAAABUKQLaBmluZGVudFoJc29ydF9rZXlzeghOYW1lOiAlcykBcgkAAAB6C1ZlcnNpb246ICVzegxDb2RlbmFtZTogJXMpE9oHbG9nZ2luZ1oJZ2V0TG9nZ2Vych0AAABaCHNldExldmVs2gVERUJVR1oKYWRkSGFuZGxlcloNU3RyZWFtSGFuZGxlcnJjAAAAcn4AAADaCGFyZ3BhcnNl2g5Bcmd1bWVudFBhcnNlctoMYWRkX2FyZ3VtZW502gpwYXJzZV9hcmdz2gRqc29uchIAAADaBWR1bXBzcggAAAByCgAAAHIRAAAAKQVaBmxvZ2dlctoGcGFyc2Vy2gRhcmdzWhRkaXN0cmlidXRpb25fdmVyc2lvbloVZGlzdHJpYnV0aW9uX2NvZGVuYW1lcgUAAAByBQAAAHIGAAAA2gRtYWluqAQAAHMiAAAAAAEKAQwBEgIMAQQBAgECAQIBCAEIAgYBGgISAQoBDAEGAXKmAAAA2ghfX21haW5fXykBVCkBRikCRkYpAUYpAUYpAUYpAUYpAkZGKS1yLAAAAHIvAAAAck0AAAByYwAAAHKiAAAAcmIAAABynAAAAHKeAAAAcncAAADaB2Vudmlyb25yPQAAAHIyAAAAcjMAAAByQgAAAHJDAAAAckQAAAByTgAAAHKVAAAAcooAAAByjQAAAHIDAAAAcgcAAAByCAAAAHIKAAAAcgwAAAByDQAAAHIOAAAAcg8AAAByEAAAAHIRAAAAchIAAAByEwAAAHIUAAAAchUAAAByFgAAAHIXAAAAchkAAAByGgAAAHIbAAAA2gZvYmplY3RyHAAAAHItAAAAcgIAAABypgAAAHIdAAAAcgUAAAByBQAAAHIFAAAAcgYAAADaCDxtb2R1bGU+HQAAAHNqAAAABAIIAQgBCAEIAQgBCAEIAQgDDgEECggLAgECAQgLCAQEAQYDBAEGBAIBAgECAQIBBgQKHAhOCicKLAoRCg0KDQoNCBEIGAosCAoICwgKCAgIEwgUCBMIERAPEH8AfwB/AH8AfQYDCBcKAQ==
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 16
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
decorator.cpython-36.opt-1.pyc
12.05 KB
lrw-r--r--
2019-11-13 17:52:25
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
decorator.cpython-36.pyc
12.14 KB
lrw-r--r--
2019-11-13 17:52:25
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
distro.cpython-36.opt-1.pyc
35.37 KB
lrw-r--r--
2023-12-18 11:16:13
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
distro.cpython-36.pyc
35.44 KB
lrw-r--r--
2023-12-18 11:16:13
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
easy_install.cpython-36.opt-1.pyc
259 B
lrw-r--r--
2025-07-15 09:13:41
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
easy_install.cpython-36.pyc
259 B
lrw-r--r--
2025-07-15 09:13:41
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
hwdata.cpython-36.opt-1.pyc
5.01 KB
lrw-r--r--
2019-11-19 06:36:19
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
hwdata.cpython-36.pyc
5.01 KB
lrw-r--r--
2019-11-19 06:36:19
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
pyparsing.cpython-36.opt-1.pyc
196.32 KB
lrw-r--r--
2019-11-13 10:36:46
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
pyparsing.cpython-36.pyc
196.32 KB
lrw-r--r--
2019-11-13 10:36:46
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
six.cpython-36.opt-1.pyc
24.43 KB
lrw-r--r--
2019-11-13 14:45:19
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
six.cpython-36.pyc
24.43 KB
lrw-r--r--
2019-11-13 14:45:19
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
socks.cpython-36.opt-1.pyc
22.60 KB
lrw-r--r--
2019-11-13 14:55:03
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
socks.cpython-36.pyc
22.60 KB
lrw-r--r--
2019-11-13 14:55:03
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
sockshandler.cpython-36.opt-1.pyc
3.59 KB
lrw-r--r--
2019-11-13 14:55:03
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
sockshandler.cpython-36.pyc
3.59 KB
lrw-r--r--
2019-11-13 14:55:03
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).