REDROOM
PHP 8.2.30
Path:
Logout
Edit File
Size: 43.21 KB
Close
/proc/thread-self/root/opt/cloudlinux/venv/lib/python3.11/site-packages/alembic/runtime/__pycache__/environment.cpython-311.pyc
Text
Base64
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AAAAAABaFAkAZG5kbWQnhAVaFAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQBkb2RwZFOEBVoVZHFkVIQEWhYJAGRyZHNkWYQFWhdkdGRbhARaGGR1ZF2EBFoZZHZkX4QEWhpkd2RhhARaG2R4ZGOEBFocZAJTACl52hJFbnZpcm9ubWVudENvbnRleHRhbgkAAEEgY29uZmlndXJhdGlvbmFsIGZhY2FkZSBtYWRlIGF2YWlsYWJsZSBpbiBhbiBgYGVudi5weWBgIHNjcmlwdC4KCiAgICBUaGUgOmNsYXNzOmAuRW52aXJvbm1lbnRDb250ZXh0YCBhY3RzIGFzIGEgKmZhY2FkZSogdG8gdGhlIG1vcmUKICAgIG51dHMtYW5kLWJvbHRzIG9iamVjdHMgb2YgOmNsYXNzOmAuTWlncmF0aW9uQ29udGV4dGAgYXMgd2VsbCBhcyBjZXJ0YWluCiAgICBhc3BlY3RzIG9mIDpjbGFzczpgLkNvbmZpZ2AsCiAgICB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGBgZW52LnB5YGAgc2NyaXB0IHRoYXQgaXMgaW52b2tlZCBieQogICAgbW9zdCBBbGVtYmljIGNvbW1hbmRzLgoKICAgIDpjbGFzczpgLkVudmlyb25tZW50Q29udGV4dGAgaXMgbm9ybWFsbHkgaW5zdGFudGlhdGVkCiAgICB3aGVuIGEgY29tbWFuZCBpbiA6bW9kOmBhbGVtYmljLmNvbW1hbmRgIGlzIHJ1bi4gIEl0IHRoZW4gbWFrZXMKICAgIGl0c2VsZiBhdmFpbGFibGUgaW4gdGhlIGBgYWxlbWJpYy5jb250ZXh0YGAgbW9kdWxlIGZvciB0aGUgc2NvcGUKICAgIG9mIHRoZSBjb21tYW5kLiAgIEZyb20gd2l0aGluIGFuIGBgZW52LnB5YGAgc2NyaXB0LCB0aGUgY3VycmVudAogICAgOmNsYXNzOmAuRW52aXJvbm1lbnRDb250ZXh0YCBpcyBhdmFpbGFibGUgYnkgaW1wb3J0aW5nIHRoaXMgbW9kdWxlLgoKICAgIDpjbGFzczpgLkVudmlyb25tZW50Q29udGV4dGAgYWxzbyBzdXBwb3J0cyBwcm9ncmFtbWF0aWMgdXNhZ2UuCiAgICBBdCB0aGlzIGxldmVsLCBpdCBhY3RzIGFzIGEgUHl0aG9uIGNvbnRleHQgbWFuYWdlciwgdGhhdCBpcywgaXMKICAgIGludGVuZGVkIHRvIGJlIHVzZWQgdXNpbmcgdGhlCiAgICBgYHdpdGg6YGAgc3RhdGVtZW50LiAgQSB0eXBpY2FsIHVzZSBvZiA6Y2xhc3M6YC5FbnZpcm9ubWVudENvbnRleHRgOjoKCiAgICAgICAgZnJvbSBhbGVtYmljLmNvbmZpZyBpbXBvcnQgQ29uZmlnCiAgICAgICAgZnJvbSBhbGVtYmljLnNjcmlwdCBpbXBvcnQgU2NyaXB0RGlyZWN0b3J5CgogICAgICAgIGNvbmZpZyA9IENvbmZpZygpCiAgICAgICAgY29uZmlnLnNldF9tYWluX29wdGlvbigic2NyaXB0X2xvY2F0aW9uIiwgIm15YXBwOm1pZ3JhdGlvbnMiKQogICAgICAgIHNjcmlwdCA9IFNjcmlwdERpcmVjdG9yeS5mcm9tX2NvbmZpZyhjb25maWcpCgoKICAgICAgICBkZWYgbXlfZnVuY3Rpb24ocmV2LCBjb250ZXh0KToKICAgICAgICAgICAgJycnZG8gc29tZXRoaW5nIHdpdGggcmV2aXNpb24gInJldiIsIHdoaWNoCiAgICAgICAgICAgIHdpbGwgYmUgdGhlIGN1cnJlbnQgZGF0YWJhc2UgcmV2aXNpb24sCiAgICAgICAgICAgIGFuZCAiY29udGV4dCIsIHdoaWNoIGlzIHRoZSBNaWdyYXRpb25Db250ZXh0CiAgICAgICAgICAgIHRoYXQgdGhlIGVudi5weSB3aWxsIGNyZWF0ZScnJwoKCiAgICAgICAgd2l0aCBFbnZpcm9ubWVudENvbnRleHQoCiAgICAgICAgICAgIGNvbmZpZywKICAgICAgICAgICAgc2NyaXB0LAogICAgICAgICAgICBmbj1teV9mdW5jdGlvbiwKICAgICAgICAgICAgYXNfc3FsPUZhbHNlLAogICAgICAgICAgICBzdGFydGluZ19yZXY9ImJhc2UiLAogICAgICAgICAgICBkZXN0aW5hdGlvbl9yZXY9ImhlYWQiLAogICAgICAgICAgICB0YWc9InNvbWV0YWciLAogICAgICAgICk6CiAgICAgICAgICAgIHNjcmlwdC5ydW5fZW52KCkKCiAgICBUaGUgYWJvdmUgc2NyaXB0IHdpbGwgaW52b2tlIHRoZSBgYGVudi5weWBgIHNjcmlwdAogICAgd2l0aGluIHRoZSBtaWdyYXRpb24gZW52aXJvbm1lbnQuICBJZiBhbmQgd2hlbiBgYGVudi5weWBgCiAgICBjYWxscyA6bWV0aDpgLk1pZ3JhdGlvbkNvbnRleHQucnVuX21pZ3JhdGlvbnNgLCB0aGUKICAgIGBgbXlfZnVuY3Rpb24oKWBgIGZ1bmN0aW9uIGFib3ZlIHdpbGwgYmUgY2FsbGVkCiAgICBieSB0aGUgOmNsYXNzOmAuTWlncmF0aW9uQ29udGV4dGAsIGdpdmVuIHRoZSBjb250ZXh0CiAgICBpdHNlbGYgYXMgd2VsbCBhcyB0aGUgY3VycmVudCByZXZpc2lvbiBpbiB0aGUgZGF0YWJhc2UuCgogICAgLi4gbm90ZTo6CgogICAgICAgIEZvciBtb3N0IEFQSSB1c2FnZXMgb3RoZXIgdGhhbiBmdWxsIGJsb3duCiAgICAgICAgaW52b2NhdGlvbiBvZiBtaWdyYXRpb24gc2NyaXB0cywgdGhlIDpjbGFzczpgLk1pZ3JhdGlvbkNvbnRleHRgCiAgICAgICAgYW5kIDpjbGFzczpgLlNjcmlwdERpcmVjdG9yeWAgb2JqZWN0cyBjYW4gYmUgY3JlYXRlZCBhbmQKICAgICAgICB1c2VkIGRpcmVjdGx5LiAgVGhlIDpjbGFzczpgLkVudmlyb25tZW50Q29udGV4dGAgb2JqZWN0CiAgICAgICAgaXMgKm9ubHkqIG5lZWRlZCB3aGVuIHlvdSBuZWVkIHRvIGFjdHVhbGx5IGludm9rZSB0aGUKICAgICAgICBgYGVudi5weWBgIG1vZHVsZSBwcmVzZW50IGluIHRoZSBtaWdyYXRpb24gZW52aXJvbm1lbnQuCgogICAgTnoaT3B0aW9uYWxbTWlncmF0aW9uQ29udGV4dF3aEl9taWdyYXRpb25fY29udGV4dHIiAAAA2gZjb25maWdyJQAAANoGc2NyaXB02gJrd3IEAAAA2gZyZXR1cm7aBE5vbmVjAwAAAAAAAAAAAAAAAgAAAAsAAAHzMAAAAJcAfAF8AF8AAAAAAAAAAAB8AnwAXwEAAAAAAAAAAHwDfABfAgAAAAAAAAAAZAFTACkCYV4BAABDb25zdHJ1Y3QgYSBuZXcgOmNsYXNzOmAuRW52aXJvbm1lbnRDb250ZXh0YC4KCiAgICAgICAgOnBhcmFtIGNvbmZpZzogYSA6Y2xhc3M6YC5Db25maWdgIGluc3RhbmNlLgogICAgICAgIDpwYXJhbSBzY3JpcHQ6IGEgOmNsYXNzOmAuU2NyaXB0RGlyZWN0b3J5YCBpbnN0YW5jZS4KICAgICAgICA6cGFyYW0gXCoqa3c6IGtleXdvcmQgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdWx0aW1hdGVseQogICAgICAgICBwYXNzZWQgYWxvbmcgdG8gdGhlIDpjbGFzczpgLk1pZ3JhdGlvbkNvbnRleHRgIHdoZW4KICAgICAgICAgOm1ldGg6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlYCBpcyBjYWxsZWQuCgogICAgICAgIE4pA3IyAAAAcjMAAADaDGNvbnRleHRfb3B0cykE2gRzZWxmcjIAAAByMwAAAHI0AAAAcwQAAAAgICAg+lIvb3B0L2Nsb3VkbGludXgvdmVudi9saWI2NC9weXRob24zLjExL3NpdGUtcGFja2FnZXMvYWxlbWJpYy9ydW50aW1lL2Vudmlyb25tZW50LnB52ghfX2luaXRfX3obRW52aXJvbm1lbnRDb250ZXh0Ll9faW5pdF9fsAAAAHMgAAAAgADwGAAXHYgEjAvYFhyIBIwL2BweiATUCBnQCBnQCBnzAAAAAGMBAAAAAAAAAAAAAAACAAAAAwAAAfMuAAAAlwB8AKAAAAAAAAAAAAAAAAAAAAAAAAAAAACmAAAAqwAAAAAAAAAAAAEAfABTACkBeuJFc3RhYmxpc2ggYSBjb250ZXh0IHdoaWNoIHByb3ZpZGVzIGEKICAgICAgICA6Y2xhc3M6YC5FbnZpcm9ubWVudENvbnRleHRgIG9iamVjdCB0bwogICAgICAgIGVudi5weSBzY3JpcHRzLgoKICAgICAgICBUaGUgOmNsYXNzOmAuRW52aXJvbm1lbnRDb250ZXh0YCB3aWxsCiAgICAgICAgYmUgbWFkZSBhdmFpbGFibGUg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pgEAAKsBAAAAAAAAAABTACkCYaYBAABSZXR1cm4gdGhlIGhleCBpZGVudGlmaWVyIG9mIHRoZSAnaGVhZCcgc2NyaXB0IHJldmlzaW9uLgoKICAgICAgICBJZiB0aGUgc2NyaXB0IGRpcmVjdG9yeSBoYXMgbXVsdGlwbGUgaGVhZHMsIHRoaXMKICAgICAgICBtZXRob2QgcmFpc2VzIGEgOmNsYXNzOmAuQ29tbWFuZEVycm9yYDsKICAgICAgICA6bWV0aDpgLkVudmlyb25tZW50Q29udGV4dC5nZXRfaGVhZF9yZXZpc2lvbnNgIHNob3VsZCBiZSBwcmVmZXJyZWQuCgogICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVxdWlyZSB0aGF0IHRoZSA6Y2xhc3M6YC5NaWdyYXRpb25Db250ZXh0YAogICAgICAgIGhhcyBiZWVuIGNvbmZpZ3VyZWQuCgogICAgICAgIC4uIHNlZWFsc286OiA6bWV0aDpgLkVudmlyb25tZW50Q29udGV4dC5nZXRfaGVhZF9yZXZpc2lvbnNgCgogICAgICAgINoEaGVhZKkCcjMAAADaEmFzX3JldmlzaW9uX251bWJlcnI/AAAAcwEAAAAgcjoAAADaEWdldF9oZWFkX3JldmlzaW9ueiRFbnZpcm9ubWVudENvbnRleHQuZ2V0X2hlYWRfcmV2aXNpb27tAAAAcxoAAACAAPAaABAUjHvXDy3SDy2oZtEPNdQPNdAINXI8AAAAYwEAAAAAAAAAAAAAAAMAAAADAAAB8zYAAACXAHwAagAAAAAAAAAAAKABAAAAAAAAAAAAAAAAAAAAAAAAAABkAaYBAACrAQAAAAAAAAAAUwApAmEZAQAAUmV0dXJuIHRoZSBoZXggaWRlbnRpZmllciBvZiB0aGUgJ2hlYWRzJyBzY3JpcHQgcmV2aXNpb24ocykuCgogICAgICAgIFRoaXMgcmV0dXJucyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGFsbAogICAgICAgIGhlYWRzIGluIHRoZSBzY3JpcHQgZGlyZWN0b3J5LgoKICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJlcXVpcmUgdGhhdCB0aGUgOmNsYXNz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LnB5YGAgc2NyaXB0LgoKICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdCwgcmV0dXJuZWQgZGlyZWN0bHkgZnJvbSB0aGUgYGBhcmdwYXJzZWBgCiAgICAgICAgc3RydWN0dXJlLiAgSWYgYGBhc19kaWN0aW9uYXJ5PVRydWVgYCBpcyBwYXNzZWQsIHRoZSBgYHhgYCBhcmd1bWVudHMKICAgICAgICBhcmUgcGFyc2VkIHVzaW5nIGBga2V5PXZhbHVlYGAgZm9ybWF0IGludG8gYSBkaWN0aW9uYXJ5IHRoYXQgaXMKICAgICAgICB0aGVuIHJldHVybmVkLgoKICAgICAgICBGb3IgZXhhbXBsZSwgdG8gc3VwcG9ydCBwYXNzaW5nIGEgZGF0YWJhc2UgVVJMIG9uIHRoZSBjb21tYW5kIGxpbmUsCiAgICAgICAgdGhlIHN0YW5kYXJkIGBgZW52LnB5YGAgc2NyaXB0IGNhbiBiZSBtb2RpZmllZCBsaWtlIHRoaXM6OgoKICAgICAgICAgICAgY21kX2xpbmVfdXJsID0gY29udGV4dC5nZXRfeF9hcmd1bWVudCgKICAgICAgICAgICAgICAgIGFzX2RpY3Rpb25hcnk9VHJ1ZSkuZ2V0KCdkYm5hbWUnKQogICAgICAgICAgICBpZiBjbWRfbGluZV91cmw6CiAgICAgICAgICAgICAgICBlbmdpbmUgPSBjcmVhdGVfZW5naW5lKGNtZF9saW5lX3VybCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGVuZ2luZSA9IGVuZ2luZV9mcm9tX2NvbmZpZygKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmdldF9zZWN0aW9uKGNvbmZpZy5jb25maWdfaW5pX3NlY3Rpb24pLAogICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9J3NxbGFsY2hlbXkuJywKICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGNsYXNzPXBvb2wuTnVsbFBvb2wpCgogICAgICAgIFRoaXMgdGhlbiB0YWtlcyBlZmZlY3QgYnkgcnVubmluZyB0aGUgYGBhbGVtYmljYGAgc2NyaXB0IGFzOjoKCiAgICAgICAgICAgIGFsZW1iaWMgLXggZGJuYW1lPXBvc3RncmVzcWw6Ly91c2VyOnBhc3NAaG9zdC9kYm5hbWUgdXBncmFkZSBoZWFkCgogICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVxdWlyZSB0aGF0IHRoZSA6Y2xhc3M6YC5NaWdyYXRpb25Db250ZXh0YAogICAgICAgIGhhcyBiZWVuIGNvbmZpZ3VyZWQuCgogICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOm1ldGg6YC5FbnZpcm9ubWVudENvbnRleHQuZ2V0X3RhZ19hcmd1bWVudGAKCiAgICAgICAgICAgIDphdHRyOmAuQ29uZmlnLmNtZF9vcHRzYAoKICAgICAgICBOYwEAAAAAAAAAAAAAAAUAAAAzAAAB80IAAABLAAEAlwB8AF0afQF8AaAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAGQBpgIAAKsCAAAAAAAAAABWAJcBAQCMG2QCUwApA/oBPXIVAAAATikB2gVzcGxpdCkC2gIuMHJBAAAAcwIAAAAgIHI6AAAA+gk8Z2VuZXhwcj56NEVudmlyb25tZW50Q29udGV4dC5nZXRfeF9hcmd1bWVudC48bG9jYWxzPi48Z2VuZXhwcj6HAQAAczAAAADoAOgAgADQGDzQGDyoc5gTnxmaGaAzqAHRGSrUGSrQGDzQGDzQGDzQGDzQGDzQGDxyPAAAACkEcjIAAADaCGNtZF9vcHRz2gF42gRkaWN0KQNyOQAAAHJoAAAA2gV2YWx1ZXMDAAAAICAgcjoAAABybgAAAHohRW52aXJvbm1lbnRDb250ZXh0LmdldF94X2FyZ3VtZW50WQEAAHNSAAAAgADwUgEADBCMO9QLH9ALK9gUGJRL1BQo1BQq0BQwqGKIRYhF4BQWiEXYCxjwAAEJPd0UGNAYPNAYPLBl0Bg80Rg81Bg80RQ81BQ8iEXYDxSIDHI8AAAA2gh1cGdyYWRlc9oKZG93bmdyYWRlc/oDb3Au+gNzYS7aCmNvbm5lY3Rpb276FE9wdGlvbmFsW0Nvbm5lY3Rpb25d2gN1cmz6GU9wdGlvbmFsW1VuaW9uW3N0ciwgVVJMXV3aDGRpYWxlY3RfbmFtZdoMZGlhbGVjdF9vcHRz+hhPcHRpb25hbFtEaWN0W3N0ciwgQW55XV1yTwAAAPoOT3B0aW9uYWxbYm9vbF3aGXRyYW5zYWN0aW9uX3Blcl9taWdyYXRpb27aDW91dHB1dF9idWZmZXL6EE9wdGlvbmFsW1RleHRJT11yXQAAAHJmAAAA2g10ZW1wbGF0ZV9hcmdz2g9yZW5kZXJfYXNfYmF0Y2jaD3RhcmdldF9tZXRhZGF0YfoST3B0aW9uYWxbTWV0YURhdGFd2gxpbmNsdWRlX25hbWX6F09wdGlvbmFsW0luY2x1ZGVOYW1lRm5d2g5pbmNsdWRlX29iamVjdPoZT3B0aW9uYWxbSW5jbHVkZU9iamVjdEZuXdoPaW5jbHVkZV9zY2hlbWFz2htwcm9jZXNzX3JldmlzaW9uX2RpcmVjdGl2ZXP6JE9wdGlvbmFsW1Byb2Nlc3NSZXZpc2lvbkRpcmVjdGl2ZUZuXdoMY29tcGFyZV90eXBl2hZjb21wYXJlX3NlcnZlcl9kZWZhdWx0+iFVbmlvbltib29sLCBDb21wYXJlU2VydmVyRGVmYXVsdF3aC3JlbmRlcl9pdGVt+hZPcHRpb25hbFtSZW5kZXJJdGVtRm5d2g1saXRlcmFsX2JpbmRz2g11cGdyYWRlX3Rva2Vu2gNzdHLaD2Rvd25ncmFkZV90b2tlbtoVYWxlbWJpY19tb2R1bGVfcHJlZml42hhzcWxhbGNoZW15X21vZHVsZV9wcmVmaXjaEnVzZXJfbW9kdWxlX3ByZWZpeNoQb25fdmVyc2lvbl9hcHBsefoaT3B0aW9uYWxbT25WZXJzaW9uQXBwbHlGbl1jGwAAAAAAAAAAAAAACAAAAAsAAAHzIAIAAJcAfABqAAAAAAAAAAAAfRx8BYEFfAV8HGQCPAAAAHwHgQZ8B3wcZAM8AAAAbht8AGoBAAAAAAAAAABqAgAAAAAAAAAAgQ98AGoBAAAAAAAAAABqAgAAAAAAAAAAfBxkAzwAAAB8CHIFfAh8HGQEPAAAAHwJcgV8CXwcZAU8AAAAfApyH2QGfBx2AHIbfBxkBhkAAAAAAAAAAACgAwAAAAAAAAAAAAAAAAAAAAAAAAAAfAqmAQAAqwEAAAAAAAAAAAEAfAZ8HGQHPAAAAHwMfBxkCDwAAAB8DXwcZAk8AAAAfA58HGQKPAAAAHwPfBxkCzwAAAB8C3wcZAw8AAAAfBV8HGQNPAAAAHwWfBxkDjwAAAB8GHwcZA88AAAAfBd8HGQQPAAAAHwZfBxkETwAAAB8FHwcZBI8AAAAfBB8HGQTPAAAAHQJAAAAAAAAAAAAAGoFAAAAAAAAAAB8GmQUrBWmAgAAqwIAAAAAAAAAAHwcZBY8AAAAfBOBBXwTfBxkFzwAAAB8EYEFfBF8HGQYPAAAAHwSgQV8EnwcZBk8AAAAfABqBgAAAAAAAAAAfBxkGjwAAAB8HKADAAAAAAAAAAAAAAAAAAAAAAAAAAB8G6YBAACrAQAAAAAAAAAAAQB0DwAAAAAAAAAAAABqCAAAAAAAAAAAfAF8AnwDfAB8BHwcrBumBgAAqwYAAAAAAAAAAHwAXwkAAAAAAAAAAGQBUwApHGHITAAAQ29uZmlndXJlIGEgOmNsYXNzOmAuTWlncmF0aW9uQ29udGV4dGAgd2l0aGluIHRoaXMKICAgICAgICA6Y2xhc3M6YC5FbnZpcm9ubWVudENvbnRleHRgIHdoaWNoIHdpbGwgcHJvdmlkZSBkYXRhYmFzZQogICAgICAgIGNvbm5lY3Rpdml0eSBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiB0byBhIHNlcmllcyBvZgogICAgICAgIG1pZ3JhdGlvbiBzY3JpcHRzLgoKICAgICAgICBNYW55IG1ldGhvZHMgb24gOmNsYXNzOmAuRW52aXJvbm1lbnRDb250ZXh0YCByZXF1aXJlIHRoYXQKICAgICAgICB0aGlzIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgaW4gb3JkZXIgdG8gZnVuY3Rpb24sIGFzIHRoZXkKICAgICAgICB1bHRpbWF0ZWx5IG5lZWQgdG8gaGF2ZSBkYXRhYmFzZSBhY2Nlc3Mgb3IgYXQgbGVhc3QgYWNjZXNzCiAgICAgICAgdG8gdGhlIGRpYWxlY3QgaW4gdXNlLiAgVGhvc2Ugd2hpY2ggZG8gYXJlIGRvY3VtZW50ZWQgYXMgc3VjaC4KCiAgICAgICAgVGhlIGltcG9ydGFudCB0aGluZyBuZWVkZWQgYnkgOm1ldGg6YC5jb25maWd1cmVgIGlzIGEKICAgICAgICBtZWFucyB0byBkZXRlcm1pbmUgd2hhdCBraW5kIG9mIGRhdGFiYXNlIGRpYWxlY3QgaXMgaW4gdXNlLgogICAgICAgIEFuIGFjdHVhbCBjb25uZWN0aW9uIHRvIHRoYXQgZGF0YWJhc2UgaXMgbmVlZGVkIG9ubHkgaWYKICAgICAgICB0aGUgOmNsYXNzOmAuTWlncmF0aW9uQ29udGV4dGAgaXMgdG8gYmUgdXNlZCBpbgogICAgICAgICJvbmxpbmUiIG1vZGUuCgogICAgICAgIElmIHRoZSA6bWV0aDpgLmlzX29mZmxpbmVfbW9kZWAgZnVuY3Rpb24gcmV0dXJucyBgYFRydWVgYCwKICAgICAgICB0aGVuIG5vIGNvbm5lY3Rpb24gaXMgbmVlZGVkIGhlcmUuICBPdGhlcndpc2UsIHRoZQogICAgICAgIGBgY29ubmVjdGlvbmBgIHBhcmFtZXRlciBzaG91bGQgYmUgcHJlc2VudCBhcyBhbgogICAgICAgIGluc3RhbmNlIG9mIDpjbGFzczpgc3FsYWxjaGVteS5lbmdpbmUuQ29ubmVjdGlvbmAuCgogICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdHlwaWNhbGx5IGNhbGxlZCBmcm9tIHRoZSBgYGVudi5weWBgCiAgICAgICAgc2NyaXB0IHdpdGhpbiBhIG1pZ3JhdGlvbiBlbnZpcm9ubWVudC4gIEl0IGNhbiBiZSBjYWxsZWQKICAgICAgICBtdWx0aXBsZSB0aW1lcyBmb3IgYW4gaW52b2NhdGlvbi4gIFRoZSBtb3N0IHJlY2VudAogICAgICAgIDpjbGFzczpgfnNxbGFsY2hlbXkuZW5naW5lLkNvbm5lY3Rpb25gCiAgICAgICAgZm9yIHdoaWNoIGl0IHdhcyBjYWxsZWQgaXMgdGhlIG9uZSB0aGF0IHdpbGwgYmUgb3BlcmF0ZWQgdXBvbgogICAgICAgIGJ5IHRoZSBuZXh0IGNhbGwgdG8gOm1ldGg6YC5ydW5fbWlncmF0aW9uc2AuCgogICAgICAgIEdlbmVyYWwgcGFyYW1ldGVyczoKCiAgICAgICAgOnBhcmFtIGNvbm5lY3Rpb246IGEgOmNsYXNzOmB+c3FsYWxjaGVteS5lbmdpbmUuQ29ubmVjdGlvbmAKICAgICAgICAgdG8gdXNlCiAgICAgICAgIGZvciBTUUwgZXhlY3V0aW9uIGluICJvbmxpbmUiIG1vZGUuICBXaGVuIHByZXNlbnQsIGlzIGFsc28KICAgICAgICAgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgZGlhbGVjdCBpbiB1c2UuCiAgICAgICAgOnBhcmFtIHVybDogYSBzdHJpbmcgZGF0YWJhc2UgdXJsLCBvciBhCiAgICAgICAgIDpjbGFzczpgc3FsYWxjaGVteS5lbmdpbmUudXJsLlVSTGAgb2JqZWN0LgogICAgICAgICBUaGUgdHlwZSBvZiBkaWFsZWN0IHRvIGJlIHVzZWQgd2lsbCBiZSBkZXJpdmVkIGZyb20gdGhpcyBpZgogICAgICAgICBgYGNvbm5lY3Rpb25gYCBpcyBub3QgcGFzc2VkLgogICAgICAgIDpwYXJhbSBkaWFsZWN0X25hbWU6IHN0cmluZyBuYW1lIG9mIGEgZGlhbGVjdCwgc3VjaCBhcwogICAgICAgICAicG9zdGdyZXNxbCIsICJtc3NxbCIsIGV0Yy4KICAgICAgICAgVGhlIHR5cGUgb2YgZGlhbGVjdCB0byBiZSB1c2VkIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoaXMgaWYKICAgICAgICAgYGBjb25uZWN0aW9uYGAgYW5kIGBgdXJsYGAgYXJlIG5vdCBwYXNzZWQuCiAgICAgICAgOnBhcmFtIGRpYWxlY3Rfb3B0czogZGljdGlvbmFyeSBvZiBvcHRpb25zIHRvIGJlIHBhc3NlZCB0byBkaWFsZWN0CiAgICAgICAgIGNvbnN0cnVjdG9yLgoKICAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS4wLjEyCgogICAgICAgIDpwYXJhbSB0cmFuc2FjdGlvbmFsX2RkbDogRm9yY2UgdGhlIHVzYWdlIG9mICJ0cmFuc2FjdGlvbmFsIgogICAgICAgICBEREwgb24gb3Igb2ZmOwogICAgICAgICB0aGlzIG90aGVyd2lzZSBkZWZhdWx0cyB0byB3aGV0aGVyIG9yIG5vdCB0aGUgZGlhbGVjdCBpbgogICAgICAgICB1c2Ugc3VwcG9ydHMgaXQuCiAgICAgICAgOnBhcmFtIHRyYW5zYWN0aW9uX3Blcl9taWdyYXRpb246IGlmIFRydWUsIG5lc3QgZWFjaCBtaWdyYXRpb24gc2NyaXB0CiAgICAgICAgIGluIGEgdHJhbnNhY3Rpb24gcmF0aGVyIHRoYW4gdGhlIGZ1bGwgc2VyaWVzIG9mIG1pZ3JhdGlvbnMgdG8KICAgICAgICAgcnVuLgogICAgICAgIDpwYXJhbSBvdXRwdXRfYnVmZmVyOiBhIGZpbGUtbGlrZSBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQKICAgICAgICAgZm9yIHRleHR1YWwgb3V0cHV0CiAgICAgICAgIHdoZW4gdGhlIGBgLS1zcWxgYCBvcHRpb24gaXMgdXNlZCB0byBnZW5lcmF0ZSBTUUwgc2NyaXB0cy4KICAgICAgICAgRGVmYXVsdHMgdG8KICAgICAgICAgYGBzeXMuc3Rkb3V0YGAgaWYgbm90IHBhc3NlZCBoZXJlIGFuZCBhbHNvIG5vdCBwcmVzZW50IG9uCiAgICAgICAgIHRoZSA6Y2xhc3M6YC5Db25maWdgCiAgICAgICAgIG9iamVjdC4gIFRoZSB2YWx1ZSBoZXJlIG92ZXJyaWRlcyB0aGF0IG9mIHRoZSA6Y2xhc3M6YC5Db25maWdgCiAgICAgICAgIG9iamVjdC4KICAgICAgICA6cGFyYW0gb3V0cHV0X2VuY29kaW5nOiB3aGVuIHVzaW5nIGBgLS1zcWxgYCB0byBnZW5lcmF0ZSBTUUwKICAgICAgICAgc2NyaXB0cywgYXBwbHkgdGhpcyBlbmNvZGluZyB0byB0aGUgc3RyaW5nIG91dHB1dC4KICAgICAgICA6cGFyYW0gbGl0ZXJhbF9iaW5kczogd2hlbiB1c2luZyBgYC0tc3FsYGAgdG8gZ2VuZXJhdGUgU1FMCiAgICAgICAgIHNjcmlwdHMsIHBhc3MgdGhyb3VnaCB0aGUgYGBsaXRlcmFsX2JpbmRzYGAgZmxhZyB0byB0aGUgY29tcGlsZXIKICAgICAgICAgc28gdGhhdCBhbnkgbGl0ZXJhbCB2YWx1ZXMgdGhhdCB3b3VsZCBvcmRpbmFyaWx5IGJlIGJvdW5kCiAgICAgICAgIHBhcmFtZXRlcnMgYXJlIGNvbnZlcnRlZCB0byBwbGFpbiBzdHJpbmdzLgoKICAgICAgICAgLi4gd2FybmluZzo6IERpYWxlY3RzIGNhbiB0eXBpY2FsbHkgb25seSBoYW5kbGUgc2ltcGxlIGRhdGF0eXBlcwogICAgICAgICAgICBsaWtlIHN0cmluZ3MgYW5kIG51bWJlcnMgZm9yIGF1dG8tbGl0ZXJhbCBnZW5lcmF0aW9uLiAgRGF0YXR5cGVzCiAgICAgICAgICAgIGxpa2UgZGF0ZXMsIGludGVydmFscywgYW5kIG90aGVycyBtYXkgc3RpbGwgcmVxdWlyZSBtYW51YWwKICAgICAgICAgICAgZm9ybWF0dGluZywgdHlwaWNhbGx5IHVzaW5nIDptZXRoOmAuT3BlcmF0aW9ucy5pbmxpbmVfbGl0ZXJhbGAuCgogICAgICAgICAuLiBub3RlOjogdGhlIGBgbGl0ZXJhbF9iaW5kc2BgIGZsYWcgaXMgaWdub3JlZCBvbiBTUUxBbGNoZW15CiAgICAgICAgICAgIHZlcnNpb25zIHByaW9yIHRvIDAuOCB3aGVyZSB0aGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZC4KCiAgICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOm1ldGg6YC5PcGVyYXRpb25zLmlubGluZV9saXRlcmFsYAoKICAgICAgICA6cGFyYW0gc3RhcnRpbmdfcmV2OiBPdmVycmlkZSB0aGUgInN0YXJ0aW5nIHJldmlzaW9uIiBhcmd1bWVudAogICAgICAgICB3aGVuIHVzaW5nIGBgLS1zcWxgYCBtb2RlLgogICAgICAgIDpwYXJhbSB0YWc6IGEgc3RyaW5nIHRhZyBmb3IgdXNhZ2UgYnkgY3VzdG9tIGBgZW52LnB5YGAgc2NyaXB0cy4KICAgICAgICAgU2V0IHZpYSB0aGUgYGAtLXRhZ2BgIG9wdGlvbiwgY2FuIGJlIG92ZXJyaWRkZW4gaGVyZS4KICAgICAgICA6cGFyYW0gdGVtcGxhdGVfYXJnczogZGljdGlvbmFyeSBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgd2hpY2gKICAgICAgICAgd2lsbCBiZSBhZGRlZCB0byB0aGUgdGVtcGxhdGUgYXJndW1lbnQgZW52aXJvbm1lbnQgd2hlbgogICAgICAgICBydW5uaW5nIHRoZSAicmV2aXNpb24iIGNvbW1hbmQuICAgTm90ZSB0aGF0IHRoZSBzY3JpcHQgZW52aXJvbm1lbnQKICAgICAgICAgaXMgb25seSBydW4gd2l0aGluIHRoZSAicmV2aXNpb24iIGNvbW1hbmQgaWYgdGhlIC0tYXV0b2dlbmVyYXRlCiAgICAgICAgIG9wdGlvbiBpcyB1c2VkLCBvciBpZiB0aGUgb3B0aW9uICJyZXZpc2lvbl9lbnZpcm9ubWVudD10cnVlIgogICAgICAgICBpcyBwcmVzZW50IGluIHRoZSBhbGVtYmljLmluaSBmaWxlLgoKICAgICAgICA6cGFyYW0gdmVyc2lvbl90YWJsZTogVGhlIG5hbWUgb2YgdGhlIEFsZW1iaWMgdmVyc2lvbiB0YWJsZS4KICAgICAgICAgVGhlIGRlZmF1bHQgaXMgYGAnYWxlbWJpY192ZXJzaW9uJ2BgLgogICAgICAgIDpwYXJhbSB2ZXJzaW9uX3RhYmxlX3NjaGVtYTogT3B0aW9uYWwgc2NoZW1hIHRvIHBsYWNlIHZlcnNpb24KICAgICAgICAgdGFibGUgd2l0aGluLgogICAgICAgIDpwYXJhbSB2ZXJzaW9uX3RhYmxlX3BrOiBib29sZWFuLCB3aGV0aGVyIHRoZSBBbGVtYmljIHZlcnNpb24gdGFibGUKICAgICAgICAgc2hvdWxkIHVzZSBhIHByaW1hcnkga2V5IGNvbnN0cmFpbnQgZm9yIHRoZSAidmFsdWUiIGNvbHVtbjsgdGhpcwogICAgICAgICBvbmx5IHRha2VzIGVmZmVjdCB3aGVuIHRoZSB0YWJsZSBpcyBmaXJzdCBjcmVhdGVkLgogICAgICAgICBEZWZhdWx0cyB0byBUcnVlOyBzZXR0aW5nIHRvIEZhbHNlIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGFuZCBpcwogICAgICAgICBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zLgogICAgICAgIDpwYXJhbSBvbl92ZXJzaW9uX2FwcGx5OiBhIGNhbGxhYmxlIG9yIGNvbGxlY3Rpb24gb2YgY2FsbGFibGVzIHRvIGJlCiAgICAgICAgICAgIHJ1biBmb3IgZWFjaCBtaWdyYXRpb24gc3RlcC4KICAgICAgICAgICAgVGhlIGNhbGxhYmxlcyB3aWxsIGJlIHJ1biBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZ2l2ZW4sIG9uY2UgZm9yCiAgICAgICAgICAgIGVhY2ggbWlncmF0aW9uIHN0ZXAsIGFmdGVyIHRoZSByZXNwZWN0aXZlIG9wZXJhdGlvbiBoYXMgYmVlbgogICAgICAgICAgICBhcHBsaWVkIGJ1dCBiZWZvcmUgaXRzIHRyYW5zYWN0aW9uIGlzIGZpbmFsaXplZC4KICAgICAgICAgICAgRWFjaCBjYWxsYWJsZSBhY2NlcHRzIG5vIHBvc2l0aW9uYWwgYXJndW1lbnRzIGFuZCB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIGtleXdvcmQgYXJndW1lbnRzOgoKICAgICAgICAgICAgKiBgYGN0eGBgOiB0aGUgOmNsYXNzOmAuTWlncmF0aW9uQ29udGV4dGAgcnVubmluZyB0aGUgbWlncmF0aW9uLAogICAgICAgICAgICAqIGBgc3RlcGBgOiBhIDpjbGFzczpgLk1pZ3JhdGlvbkluZm9gIHJlcHJlc2VudGluZyB0aGUKICAgICAgICAgICAgICBzdGVwIGN1cnJlbnRseSBiZWluZyBhcHBsaWVkLAogICAgICAgICAgICAqIGBgaGVhZHNgYDogYSBjb2xsZWN0aW9uIG9mIHZlcnNpb24gc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlCiAgICAgICAgICAgICAgY3VycmVudCBoZWFkcywKICAgICAgICAgICAgKiBgYHJ1bl9hcmdzYGA6IHRoZSBgYCoqa3dhcmdzYGAgcGFzc2VkIHRvIDptZXRoOmAucnVuX21pZ3JhdGlvbnNgLgoKICAgICAgICBQYXJhbWV0ZXJzIHNwZWNpZmljIHRvIHRoZSBhdXRvZ2VuZXJhdGUgZmVhdHVyZSwgd2hlbgogICAgICAgIGBgYWxlbWJpYyByZXZpc2lvbmBgIGlzIHJ1biB3aXRoIHRoZSBgYC0tYXV0b2dlbmVyYXRlYGAgZmVhdHVyZToKCiAgICAgICAgOnBhcmFtIHRhcmdldF9tZXRhZGF0YTogYSA6Y2xhc3M6YHNxbGFsY2hlbXkuc2NoZW1hLk1ldGFEYXRhYAogICAgICAgICBvYmplY3QsIG9yIGEgc2VxdWVuY2Ugb2YgOmNsYXNzOmB+c3FsYWxjaGVteS5zY2hlbWEuTWV0YURhdGFgCiAgICAgICAgIG9iamVjdHMsIHRoYXQgd2lsbCBiZSBjb25zdWx0ZWQgZHVyaW5nIGF1dG9nZW5lcmF0aW9uLgogICAgICAgICBUaGUgdGFibGVzIHByZXNlbnQgaW4gZWFjaCA6Y2xhc3M6YH5zcWxhbGNoZW15LnNjaGVtYS5NZXRhRGF0YWAKICAgICAgICAgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0CiAgICAgICAgIHdoYXQgaXMgbG9jYWxseSBhdmFpbGFibGUgb24gdGhlIHRhcmdldAogICAgICAgICA6Y2xhc3M6YH5zcWxhbGNoZW15LmVuZ2luZS5Db25uZWN0aW9uYAogICAgICAgICB0byBwcm9kdWNlIGNhbmRpZGF0ZSB1cGdyYWRlL2Rvd25ncmFkZSBvcGVyYXRpb25zLgogICAgICAgIDpwYXJhbSBjb21wYXJlX3R5cGU6IEluZGljYXRlcyB0eXBlIGNvbXBhcmlzb24gYmVoYXZpb3IgZHVyaW5nCiAgICAgICAgIGFuIGF1dG9nZW5lcmF0ZQogICAgICAgICBvcGVyYXRpb24uICBEZWZhdWx0cyB0byBgYEZhbHNlYGAgd2hpY2ggZGlzYWJsZXMgdHlwZQogICAgICAgICBjb21wYXJpc29uLiAgU2V0IHRvCiAgICAgICAgIGBgVHJ1ZWBgIHRvIHR1cm4gb24gZGVmYXVsdCB0eXBlIGNvbXBhcmlzb24sIHdoaWNoIGhhcyB2YXJpZWQKICAgICAgICAgYWNjdXJhY3kgZGVwZW5kaW5nIG9uIGJhY2tlbmQuICAgU2VlIDpyZWY6YGNvbXBhcmVfdHlwZXNgCiAgICAgICAgIGZvciBhbiBleGFtcGxlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gb24gb3RoZXIgdHlwZQogICAgICAgICBjb21wYXJpc29uIG9wdGlvbnMuCgogICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDpyZWY6YGNvbXBhcmVfdHlwZXNgCgogICAgICAgICAgICA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmNvbXBhcmVfc2VydmVyX2RlZmF1bHRgCgogICAgICAgIDpwYXJhbSBjb21wYXJlX3NlcnZlcl9kZWZhdWx0OiBJbmRpY2F0ZXMgc2VydmVyIGRlZmF1bHQgY29tcGFyaXNvbgogICAgICAgICBiZWhhdmlvciBkdXJpbmcKICAgICAgICAgYW4gYXV0b2dlbmVyYXRlIG9wZXJhdGlvbi4gIERlZmF1bHRzIHRvIGBgRmFsc2VgYCB3aGljaCBkaXNhYmxlcwogICAgICAgICBzZXJ2ZXIgZGVmYXVsdAogICAgICAgICBjb21wYXJpc29uLiAgU2V0IHRvICBgYFRydWVgYCB0byB0dXJuIG9uIHNlcnZlciBkZWZhdWx0IGNvbXBhcmlzb24sCiAgICAgICAgIHdoaWNoIGhhcwogICAgICAgICB2YXJpZWQgYWNjdXJhY3kgZGVwZW5kaW5nIG9uIGJhY2tlbmQuCgogICAgICAgICBUbyBjdXN0b21pemUgc2VydmVyIGRlZmF1bHQgY29tcGFyaXNvbiBiZWhhdmlvciwgYSBjYWxsYWJsZSBtYXkKICAgICAgICAgYmUgc3BlY2lmaWVkCiAgICAgICAgIHdoaWNoIGNhbiBmaWx0ZXIgc2VydmVyIGRlZmF1bHQgY29tcGFyaXNvbnMgZHVyaW5nIGFuCiAgICAgICAgIGF1dG9nZW5lcmF0ZSBvcGVyYXRpb24uCiAgICAgICAgIGRlZmF1bHRzIGR1cmluZyBhbiBhdXRvZ2VuZXJhdGUgb3BlcmF0aW9uLiAgIFRoZSBmb3JtYXQgb2YgdGhpcwogICAgICAgICBjYWxsYWJsZSBpczo6CgogICAgICAgICAgICBkZWYgbXlfY29tcGFyZV9zZXJ2ZXJfZGVmYXVsdChjb250ZXh0LCBpbnNwZWN0ZWRfY29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YV9jb2x1bW4sIGluc3BlY3RlZF9kZWZhdWx0LCBtZXRhZGF0YV9kZWZhdWx0LAogICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlZF9tZXRhZGF0YV9kZWZhdWx0KToKICAgICAgICAgICAgICAgICMgcmV0dXJuIFRydWUgaWYgdGhlIGRlZmF1bHRzIGFyZSBkaWZmZXJlbnQsCiAgICAgICAgICAgICAgICAjIEZhbHNlIGlmIG5vdCwgb3IgTm9uZSB0byBhbGxvdyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICAgICAgIyB0byBjb21wYXJlIHRoZXNlIGRlZmF1bHRzCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAgICAgY29udGV4dC5jb25maWd1cmUoCiAgICAgICAgICAgICAgICAjIC4uLgogICAgICAgICAgICAgICAgY29tcGFyZV9zZXJ2ZXJfZGVmYXVsdCA9IG15X2NvbXBhcmVfc2VydmVyX2RlZmF1bHQKICAgICAgICAgICAgKQoKICAgICAgICAgYGBpbnNwZWN0ZWRfY29sdW1uYGAgaXMgYSBkaWN0aW9uYXJ5IHN0cnVjdHVyZSBhcyByZXR1cm5lZCBieQogICAgICAgICA6bWV0aDpgc3FsYWxjaGVteS5lbmdpbmUucmVmbGVjdGlvbi5JbnNwZWN0b3IuZ2V0X2NvbHVtbnNgLCB3aGVyZWFzCiAgICAgICAgIGBgbWV0YWRhdGFfY29sdW1uYGAgaXMgYSA6Y2xhc3M6YHNxbGFsY2hlbXkuc2NoZW1hLkNvbHVtbmAgZnJvbQogICAgICAgICB0aGUgbG9jYWwgbW9kZWwgZW52aXJvbm1lbnQuCgogICAgICAgICBBIHJldHVybiB2YWx1ZSBvZiBgYE5vbmVgYCBpbmRpY2F0ZXMgdG8gYWxsb3cgZGVmYXVsdCBzZXJ2ZXIgZGVmYXVsdAogICAgICAgICBjb21wYXJpc29uCiAgICAgICAgIHRvIHByb2NlZWQuICBOb3RlIHRoYXQgc29tZSBiYWNrZW5kcyBzdWNoIGFzIFBvc3RncmVzcWwgYWN0dWFsbHkKICAgICAgICAgZXhlY3V0ZQogICAgICAgICB0aGUgdHdvIGRlZmF1bHRzIG9uIHRoZSBkYXRhYmFzZSBzaWRlIHRvIGNvbXBhcmUgZm9yIGVxdWl2YWxlbmNlLgoKICAgICAgICAgLi4gc2VlYWxzbzo6CgogICAgICAgICAgICA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmNvbXBhcmVfdHlwZWAKCiAgICAgICAgOnBhcmFtIGluY2x1ZGVfbmFtZTogQSBjYWxsYWJsZSBmdW5jdGlvbiB3aGljaCBpcyBnaXZlbgogICAgICAgICB0aGUgY2hhbmNlIHRvIHJldHVybiBgYFRydWVgYCBvciBgYEZhbHNlYGAgZm9yIGFueSBkYXRhYmFzZSByZWZsZWN0ZWQKICAgICAgICAgb2JqZWN0IGJhc2VkIG9uIGl0cyBuYW1lLCBpbmNsdWRpbmcgZGF0YWJhc2Ugc2NoZW1hIG5hbWVzIHdoZW4KICAgICAgICAgdGhlIDpwYXJhbXJlZjpgLkVudmlyb25tZW50Q29udGV4dC5jb25maWd1cmUuaW5jbHVkZV9zY2hlbWFzYCBmbGFnCiAgICAgICAgIGlzIHNldCB0byBgYFRydWVgYC4KCiAgICAgICAgIFRoZSBmdW5jdGlvbiBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgcG9zaXRpb25hbCBhcmd1bWVudHM6CgogICAgICAgICAqIGBgbmFtZWBgOiB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0LCBzdWNoIGFzIHNjaGVtYSBuYW1lIG9yIHRhYmxlIG5hbWUuCiAgICAgICAgICAgV2lsbCBiZSBgYE5vbmVgYCB3aGVuIGluZGljYXRpbmcgdGhlIGRlZmF1bHQgc2NoZW1hIG5hbWUgb2YgdGhlCiAgICAgICAgICAgZGF0YWJhc2UgY29ubmVjdGlvbi4KICAgICAgICAgKiBgYHR5cGVgYDogYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgdHlwZSBvZiBvYmplY3Q7IGN1cnJlbnRseQogICAgICAgICAgIGBgInNjaGVtYSJgYCwgYGAidGFibGUiYGAsIGBgImNvbHVtbiJgYCwgYGAiaW5kZXgiYGAsCiAgICAgICAgICAgYGAidW5pcXVlX2NvbnN0cmFpbnQiYGAsIG9yIGBgImZvcmVpZ25fa2V5X2NvbnN0cmFpbnQiYGAKICAgICAgICAgKiBgYHBhcmVudF9uYW1lc2BgOiBhIGRpY3Rpb25hcnkgb2YgInBhcmVudCIgb2JqZWN0IG5hbWVzLCB0aGF0IGFyZQogICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBuYW1lIGJlaW5nIGdpdmVuLiAgS2V5cyBpbiB0aGlzIGRpY3Rpb25hcnkgbWF5CiAgICAgICAgICAgaW5jbHVkZTogIGBgInNjaGVtYV9uYW1lImBgLCBgYCJ0YWJsZV9uYW1lImBgIG9yCiAgICAgICAgICAgYGAic2NoZW1hX3F1YWxpZmllZF90YWJsZV9uYW1lImBgLgoKICAgICAgICAgRS5nLjo6CgogICAgICAgICAgICBkZWYgaW5jbHVkZV9uYW1lKG5hbWUsIHR5cGVfLCBwYXJlbnRfbmFtZXMpOgogICAgICAgICAgICAgICAgaWYgdHlwZV8gPT0gInNjaGVtYSI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUgaW4gWyJzY2hlbWFfb25lIiwgInNjaGVtYV90d28iXQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAgICAgY29udGV4dC5jb25maWd1cmUoCiAgICAgICAgICAgICAgICAjIC4uLgogICAgICAgICAgICAgICAgaW5jbHVkZV9zY2hlbWFzID0gVHJ1ZSwKICAgICAgICAgICAgICAgIGluY2x1ZGVfbmFtZSA9IGluY2x1ZGVfbmFtZQogICAgICAgICAgICApCgogICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjUKCiAgICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOnJlZjpgYXV0b2dlbmVyYXRlX2luY2x1ZGVfaG9va3NgCgogICAgICAgICAgICA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfb2JqZWN0YAoKICAgICAgICAgICAgOnBhcmFtcmVmOmAuRW52aXJvbm1lbnRDb250ZXh0LmNvbmZpZ3VyZS5pbmNsdWRlX3NjaGVtYXNgCgoKICAgICAgICA6cGFyYW0gaW5jbHVkZV9vYmplY3Q6IEEgY2FsbGFibGUgZnVuY3Rpb24gd2hpY2ggaXMgZ2l2ZW4KICAgICAgICAgdGhlIGNoYW5jZSB0byByZXR1cm4gYGBUcnVlYGAgb3IgYGBGYWxzZWBgIGZvciBhbnkgb2JqZWN0LAogICAgICAgICBpbmRpY2F0aW5nIGlmIHRoZSBnaXZlbiBvYmplY3Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW4gdGhlCiAgICAgICAgIGF1dG9nZW5lcmF0ZSBzd2VlcC4KCiAgICAgICAgIFRoZSBmdW5jdGlvbiBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgcG9zaXRpb25hbCBhcmd1bWVudHM6CgogICAgICAgICAqIGBgb2JqZWN0YGA6IGEgOmNsYXNzOmB+c3FsYWxjaGVteS5zY2hlbWEuU2NoZW1hSXRlbWAgb2JqZWN0IHN1Y2gKICAgICAgICAgICBhcyBhIDpjbGFzczpgfnNxbGFsY2hlbXkuc2NoZW1hLlRhYmxlYCwKICAgICAgICAgICA6Y2xhc3M6YH5zcWxhbGNoZW15LnNjaGVtYS5Db2x1bW5gLAogICAgICAgICAgIDpjbGFzczpgfnNxbGFsY2hlbXkuc2NoZW1hLkluZGV4YAogICAgICAgICAgIDpjbGFzczpgfnNxbGFsY2hlbXkuc2NoZW1hLlVuaXF1ZUNvbnN0cmFpbnRgLAogICAgICAgICAgIG9yIDpjbGFzczpgfnNxbGFsY2hlbXkuc2NoZW1hLkZvcmVpZ25LZXlDb25zdHJhaW50YCBvYmplY3QKICAgICAgICAgKiBgYG5hbWVgYDogdGhlIG5hbWUgb2YgdGhlIG9iamVjdC4gVGhpcyBpcyB0eXBpY2FsbHkgYXZhaWxhYmxlCiAgICAgICAgICAgdmlhIGBgb2JqZWN0Lm5hbWVgYC4KICAgICAgICAgKiBgYHR5cGVgYDogYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgdHlwZSBvZiBvYmplY3Q7IGN1cnJlbnRseQogICAgICAgICAgIGBgInRhYmxlImBgLCBgYCJjb2x1bW4iYGAsIGBgImluZGV4ImBgLCBgYCJ1bmlxdWVfY29uc3RyYWludCJgYCwKICAgICAgICAgICBvciBgYCJmb3JlaWduX2tleV9jb25zdHJhaW50ImBgCiAgICAgICAgICogYGByZWZsZWN0ZWRgYDogYGBUcnVlYGAgaWYgdGhlIGdpdmVuIG9iamVjdCB3YXMgcHJvZHVjZWQgYmFzZWQgb24KICAgICAgICAgICB0YWJsZSByZWZsZWN0aW9uLCBgYEZhbHNlYGAgaWYgaXQncyBmcm9tIGEgbG9jYWwgOmNsYXNzOmAuTWV0YURhdGFgCiAgICAgICAgICAgb2JqZWN0LgogICAgICAgICAqIGBgY29tcGFyZV90b2BgOiB0aGUgb2JqZWN0IGJlaW5nIGNvbXBhcmVkIGFnYWluc3QsIGlmIGF2YWlsYWJsZSwKICAgICAgICAgICBlbHNlIGBgTm9uZWBgLgoKICAgICAgICAgRS5nLjo6CgogICAgICAgICAgICBkZWYgaW5jbHVkZV9vYmplY3Qob2JqZWN0LCBuYW1lLCB0eXBlXywgcmVmbGVjdGVkLCBjb21wYXJlX3RvKToKICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PSAiY29sdW1uIiBhbmQKICAgICAgICAgICAgICAgICAgICBub3QgcmVmbGVjdGVkIGFuZAogICAgICAgICAgICAgICAgICAgIG9iamVjdC5pbmZvLmdldCgic2tpcF9hdXRvZ2VuZXJhdGUiLCBGYWxzZSkpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAgICAgY29udGV4dC5jb25maWd1cmUoCiAgICAgICAgICAgICAgICAjIC4uLgogICAgICAgICAgICAgICAgaW5jbHVkZV9vYmplY3QgPSBpbmNsdWRlX29iamVjdAogICAgICAgICAgICApCgogICAgICAgICBGb3IgdGhlIHVzZSBjYXNlIG9mIG9taXR0aW5nIHNwZWNpZmljIHNjaGVtYXMgZnJvbSBhIHRhcmdldCBkYXRhYmFzZQogICAgICAgICB3aGVuIDpwYXJhbXJlZjpgLkVudmlyb25tZW50Q29udGV4dC5jb25maWd1cmUuaW5jbHVkZV9zY2hlbWFzYCBpcwogICAgICAgICBzZXQgdG8gYGBUcnVlYGAsIHRoZSA6YXR0cjpgfnNxbGFsY2hlbXkuc2NoZW1hLlRhYmxlLnNjaGVtYWAKICAgICAgICAgYXR0cmlidXRlIGNhbiBiZSBjaGVja2VkIGZvciBlYWNoIDpjbGFzczpgfnNxbGFsY2hlbXkuc2NoZW1hLlRhYmxlYAogICAgICAgICBvYmplY3QgcGFzc2VkIHRvIHRoZSBob29rLCBob3dldmVyIGl0IGlzIG11Y2ggbW9yZSBlZmZpY2llbnQKICAgICAgICAgdG8gZmlsdGVyIG9uIHNjaGVtYXMgYmVmb3JlIHJlZmxlY3Rpb24gb2Ygb2JqZWN0cyB0YWtlcyBwbGFjZQogICAgICAgICB1c2luZyB0aGUgOnBhcmFtcmVmOmAuRW52aXJvbm1lbnRDb250ZXh0LmNvbmZpZ3VyZS5pbmNsdWRlX25hbWVgCiAgICAgICAgIGhvb2suCgogICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDpyZWY6YGF1dG9nZW5lcmF0ZV9pbmNsdWRlX2hvb2tzYAoKICAgICAgICAgICAgOnBhcmFtcmVmOmAuRW52aXJvbm1lbnRDb250ZXh0LmNvbmZpZ3VyZS5pbmNsdWRlX25hbWVgCgogICAgICAgICAgICA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfc2NoZW1hc2AKCiAgICAgICAgOnBhcmFtIHJlbmRlcl9hc19iYXRjaDogaWYgVHJ1ZSwgY29tbWFuZHMgd2hpY2ggYWx0ZXIgZWxlbWVudHMKICAgICAgICAgd2l0aGluIGEgdGFibGUgd2lsbCBiZSBwbGFjZWQgdW5kZXIgYSBgYHdpdGggYmF0Y2hfYWx0ZXJfdGFibGUoKTpgYAogICAgICAgICBkaXJlY3RpdmUsIHNvIHRoYXQgYmF0Y2ggbWlncmF0aW9ucyB3aWxsIHRha2UgcGxhY2UuCgogICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDpyZWY6YGJhdGNoX21pZ3JhdGlvbnNgCgogICAgICAgIDpwYXJhbSBpbmNsdWRlX3NjaGVtYXM6IElmIFRydWUsIGF1dG9nZW5lcmF0ZSB3aWxsIHNjYW4gYWNyb3NzCiAgICAgICAgIGFsbCBzY2hlbWFzIGxvY2F0ZWQgYnkgdGhlIFNRTEFsY2hlbXkKICAgICAgICAgOm1ldGg6YH5zcWxhbGNoZW15LmVuZ2luZS5yZWZsZWN0aW9uLkluc3BlY3Rvci5nZXRfc2NoZW1hX25hbWVzYAogICAgICAgICBtZXRob2QsIGFuZCBpbmNsdWRlIGFsbCBkaWZmZXJlbmNlcyBpbiB0YWJsZXMgZm91bmQgYWNyb3NzIGFsbAogICAgICAgICB0aG9zZSBzY2hlbWFzLiAgV2hlbiB1c2luZyB0aGlzIG9wdGlvbiwgeW91IG1heSB3YW50IHRvIGFsc28KICAgICAgICAgdXNlIHRoZSA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfbmFtZWAKICAgICAgICAgcGFyYW1ldGVyIHRvIHNwZWNpZnkgYSBjYWxsYWJsZSB3aGljaAogICAgICAgICBjYW4gZmlsdGVyIHRoZSB0YWJsZXMvc2NoZW1hcyB0aGF0IGdldCBpbmNsdWRlZC4KCiAgICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOnJlZjpgYXV0b2dlbmVyYXRlX2luY2x1ZGVfaG9va3NgCgogICAgICAgICAgICA6cGFyYW1yZWY6YC5FbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJlLmluY2x1ZGVfbmFtZWAKCiAgICAgICAgICAgIDpwYXJhbXJlZjpgLkVudmlyb25tZW50Q29udGV4dC5jb25maWd1cmUuaW5jbHVkZV9vYmplY3RgCgogICAgICAgIDpwYXJhbSByZW5kZXJfaXRlbTogQ2FsbGFibGUgdGhhdCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBob3cKICAgICAgICAgYW55IHNjaGVtYSBpdGVtLCBpLmUuIGNvbHVtbiwgY29uc3RyYWludCwgdHlwZSwKICAgICAgICAgZXRjLiwgaXMgcmVuZGVyZWQgZm9yIGF1dG9nZW5lcmF0ZS4gIFRoZSBjYWxsYWJsZSByZWNlaXZlcyBhCiAgICAgICAgIHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIG9iamVjdCwgdGhlIG9iamVjdCwgYW5kCiAgICAgICAgIHRoZSBhdXRvZ2VuIGNvbnRleHQuICBJZiBpdCByZXR1cm5zIEZhbHNlLCB0aGUKICAgICAgICAgZGVmYXVsdCByZW5kZXJpbmcgbWV0aG9kIHdpbGwgYmUgdXNlZC4gIElmIGl0IHJldHVybnMgTm9uZSwKICAgICAgICAgdGhlIGl0ZW0gd2lsbCBub3QgYmUgcmVuZGVyZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBUYWJsZQogICAgICAgICBjb25zdHJ1Y3QsIHRoYXQgaXMsIGNhbiBiZSB1c2VkIHRvIHNraXAgY29sdW1ucyBvciBjb25zdHJhaW50cwogICAgICAgICB3aXRoaW4gb3AuY3JlYXRlX3RhYmxlKCk6OgoKICAgICAgICAgICAgZGVmIG15X3JlbmRlcl9jb2x1bW4odHlwZV8sIGNvbCwgYXV0b2dlbl9jb250ZXh0KToKICAgICAgICAgICAgICAgIGlmIHR5cGVfID09ICJjb2x1bW4iIGFuZCBpc2luc3RhbmNlKGNvbCwgTXlTcGVjaWFsQ29sKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVwcihjb2wpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAgICAgY29udGV4dC5jb25maWd1cmUoCiAgICAgICAgICAgICAgICAjIC4uLgogICAgICAgICAgICAgICAgcmVuZGVyX2l0ZW0gPSBteV9yZW5kZXJfY29sdW1uCiAgICAgICAgICAgICkKCiAgICAgICAgIEF2YWlsYWJsZSB2YWx1ZXMgZm9yIHRoZSB0eXBlIHN0cmluZyBpbmNsdWRlOiBgYCJjb2x1bW4iYGAsCiAgICAgICAgIGBgInByaW1hcnlfa2V5ImBgLCBgYCJmb3JlaWduX2tleSJgYCwgYGAidW5pcXVlImBgLCBgYCJjaGVjayJgYCwKICAgICAgICAgYGAidHlwZSJgYCwgYGAic2VydmVyX2RlZmF1bHQiYGAuCgogICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDpyZWY6YGF1dG9nZW5fcmVuZGVyX3R5cGVzYAoKICAgICAgICA6cGFyYW0gdXBncmFkZV90b2tlbjogV2hlbiBhdXRvZ2VuZXJhdGUgY29tcGxldGVzLCB0aGUgdGV4dCBvZiB0aGUKICAgICAgICAgY2FuZGlkYXRlIHVwZ3JhZGUgb3BlcmF0aW9ucyB3aWxsIGJlIHByZXNlbnQgaW4gdGhpcyB0ZW1wbGF0ZQogICAgICAgICB2YXJpYWJsZSB3aGVuIGBgc2NyaXB0LnB5Lm1ha29gYCBpcyByZW5kZXJlZC4gIERlZmF1bHRzIHRvCiAgICAgICAgIGBgdXBncmFkZXNgYC4KICAgICAgICA6cGFyYW0gZG93bmdyYWRlX3Rva2VuOiBXaGVuIGF1dG9nZW5lcmF0ZSBjb21wbGV0ZXMsIHRoZSB0ZXh0IG9mIHRoZQogICAgICAgICBjYW5kaWRhdGUgZG93bmdyYWRlIG9wZXJhdGlvbnMgd2lsbCBiZSBwcmVzZW50IGluIHRoaXMKICAgICAgICAgdGVtcGxhdGUgdmFyaWFibGUgd2hlbiBgYHNjcmlwdC5weS5tYWtvYGAgaXMgcmVuZGVyZWQuICBEZWZhdWx0cyB0bwogICAgICAgICBgYGRvd25ncmFkZXNgYC4KCiAgICAgICAgOnBhcmFtIGFsZW1iaWNfbW9kdWxlX3ByZWZpeDogV2hlbiBhdXRvZ2VuZXJhdGUgcmVmZXJzIHRvIEFsZW1iaWMKICAgICAgICAgOm1vZDpgYWxlbWJpYy5vcGVyYXRpb25zYCBjb25zdHJ1Y3RzLCB0aGlzIHByZWZpeCB3aWxsIGJlIHVzZWQKICAgICAgICAgKGkuZS4gYGBvcC5jcmVhdGVfdGFibGVgYCkgIERlZmF1bHRzIHRvICJgYG9wLmBgIi4KICAgICAgICAgQ2FuIGJlIGBgTm9uZWBgIHRvIGluZGljYXRlIG5vIHByZWZpeC4KCiAgICAgICAgOnBhcmFtIHNxbGFsY2hlbXlfbW9kdWxlX3ByZWZpeDogV2hlbiBhdXRvZ2VuZXJhdGUgcmVmZXJzIHRvCiAgICAgICAgIFNRTEFsY2hlbXkKICAgICAgICAgOmNsYXNzOmB+c3FsYWxjaGVteS5zY2hlbWEuQ29sdW1uYCBvciB0eXBlIGNsYXNzZXMsIHRoaXMgcHJlZml4CiAgICAgICAgIHdpbGwgYmUgdXNlZAogICAgICAgICAoaS5lLiBgYHNhLkNvbHVtbigic29tZW5hbWUiLCBzYS5JbnRlZ2VyKWBgKSAgRGVmYXVsdHMgdG8gImBgc2EuYGAiLgogICAgICAgICBDYW4gYmUgYGBOb25lYGAgdG8gaW5kaWNhdGUgbm8gcHJlZml4LgogICAgICAgICBOb3RlIHRoYXQgd2hlbiBkaWFsZWN0LXNwZWNpZmljIHR5cGVzIGFyZSByZW5kZXJlZCwgYXV0b2dlbmVyYXRlCiAgICAgICAgIHdpbGwgcmVuZGVyIHRoZW0gdXNpbmcgdGhlIGRpYWxlY3QgbW9kdWxlIG5hbWUsIGkuZS4gYGBtc3NxbC5CSVQoKWBgLAogICAgICAgICBgYHBvc3RncmVzcWwuVVVJRCgpYGAuCgogICAgICAgIDpwYXJhbSB1c2VyX21vZHVsZV9wcmVmaXg6IFdoZW4gYXV0b2dlbmVyYXRlIHJlZmVycyB0byBhIFNRTEFsY2hlbXkKICAgICAgICAgdHlwZSAoZS5nLiA6Y2xhc3M6YC5UeXBlRW5naW5lYCkgd2hlcmUgdGhlIG1vZHVsZSBuYW1lIGlzIG5vdAogICAgICAgICB1bmRlciB0aGUgYGBzcWxhbGNoZW15YGAgbmFtZXNwYWNlLCB0aGlzIHByZWZpeCB3aWxsIGJlIHVzZWQKICAgICAgICAgd2l0aGluIGF1dG9nZW5lcmF0ZS4gIElmIGxlZnQgYXQgaXRzIGRlZmF1bHQgb2YKICAgICAgICAgYGBOb25lYGAsIHRoZSBgYF9fbW9kdWxlX19gYCBhdHRyaWJ1dGUgb2YgdGhlIHR5cGUgaXMgdXNlZCB0bwogICAgICAgICByZW5kZXIgdGhlIGltcG9ydCBtb2R1bGUuICAgSXQncyBhIGdvb2QgcHJhY3RpY2UgdG8gc2V0IHRoaXMKICAgICAgICAgYW5kIHRvIGhhdmUgYWxsIGN1c3RvbSB0eXBlcyBiZSBhdmFpbGFibGUgZnJvbSBhIGZpeGVkIG1vZHVsZSBzcGFjZSwKICAgICAgICAgaW4gb3JkZXIgdG8gZnV0dXJlLXByb29mIG1pZ3JhdGlvbiBmaWxlcyBhZ2FpbnN0IHJlb3JnYW5pemF0aW9ucwogICAgICAgICBpbiBtb2R1bGVzLgoKICAgICAgICAgLi4gc2VlYWxzbzo6CgogICAgICAgICAgICA6cmVmOmBhdXRvZ2VuX21vZHVsZV9wcmVmaXhgCgogICAgICAgIDpwYXJhbSBwcm9jZXNzX3JldmlzaW9uX2RpcmVjdGl2ZXM6IGEgY2FsbGFibGUgZnVuY3Rpb24gdGhhdCB3aWxsCiAgICAgICAgIGJlIHBhc3NlZCBhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGVuZCByZXN1bHQgb2YgYW4gYXV0b2dlbmVyYXRlCiAgICAgICAgIG9yIHBsYWluICJyZXZpc2lvbiIgb3BlcmF0aW9uLCB3aGljaCBjYW4gYmUgbWFuaXB1bGF0ZWQgdG8gYWZmZWN0CiAgICAgICAgIGhvdyB0aGUgYGBhbGVtYmljIHJldmlzaW9uYGAgY29tbWFuZCB1bHRpbWF0ZWx5IG91dHB1dHMgbmV3CiAgICAgICAgIHJldmlzaW9uIHNjcmlwdHMuICAgVGhlIHN0cnVjdHVyZSBvZiB0aGUgY2FsbGFibGUgaXM6OgoKICAgICAgICAgICAgZGVmIHByb2Nlc3NfcmV2aXNpb25fZGlyZWN0aXZlcyhjb250ZXh0LCByZXZpc2lvbiwgZGlyZWN0aXZlcyk6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgICBUaGUgYGBkaXJlY3RpdmVzYGAgcGFyYW1ldGVyIGlzIGEgUHl0aG9uIGxpc3QgY29udGFpbmluZwogICAgICAgICBhIHNpbmdsZSA6Y2xhc3M6YC5NaWdyYXRpb25TY3JpcHRgIGRpcmVjdGl2ZSwgd2hpY2ggcmVwcmVzZW50cwogICAgICAgICB0aGUgcmV2aXNpb24gZmlsZSB0byBiZSBnZW5lcmF0ZWQuICAgIFRoaXMgbGlzdCBhcyB3ZWxsIGFzIGl0cwogICAgICAgICBjb250ZW50cyBtYXkgYmUgZnJlZWx5IG1vZGlmaWVkIHRvIHByb2R1Y2UgYW55IHNldCBvZiBjb21tYW5kcy4KICAgICAgICAgVGhlIHNlY3Rpb24gOnJlZjpgY3VzdG9taXppbmdfcmV2aXNpb25gIHNob3dzIGFuIGV4YW1wbGUgb2YKICAgICAgICAgZG9pbmcgdGhpcy4gIFRoZSBgYGNvbnRleHRgYCBwYXJhbWV0ZXIgaXMgdGhlCiAgICAgICAgIDpjbGFzczpgLk1pZ3JhdGlvbkNvbnRleHRgIGluIHVzZSwKICAgICAgICAgYW5kIGBgcmV2aXNpb25gYCBpcyBhIHR1cGxlIG9mIHJldmlzaW9uIGlkZW50aWZpZXJzIHJlcHJlc2VudGluZyB0aGUKICAgICAgICAgY3VycmVudCByZXZpc2lvbiBvZiB0aGUgZGF0YWJhc2UuCgogICAgICAgICBUaGUgY2FsbGFibGUgaXMgaW52b2tlZCBhdCBhbGwgdGltZXMgd2hlbiB0aGUgYGAtLWF1dG9nZW5lcmF0ZWBgCiAgICAgICAgIG9wdGlvbiBpcyBwYXNzZWQgdG8gYGBhbGVtYmljIHJldmlzaW9uYGAuICBJZiBgYC0tYXV0b2dlbmVyYXRlYGAKICAgICAgICAgaXMgbm90IHBhc3NlZCwgdGhlIGNhbGxhYmxlIGlzIGludm9rZWQgb25seSBpZiB0aGUKICAgICAgICAgYGByZXZpc2lvbl9lbnZpcm9ubWVudGBgIHZhcmlhYmxlIGlzIHNldCB0byBUcnVlIGluIHRoZSBBbGVtYmljCiAgICAgICAgIGNvbmZpZ3VyYXRpb24sIGluIHdoaWNoIGNhc2UgdGhlIGdpdmVuIGBgZGlyZWN0aXZlc2BgIGNvbGxlY3Rpb24KICAgICAgICAgd2lsbCBjb250YWluIGVtcHR5IDpjbGFzczpgLlVwZ3JhZGVPcHNgIGFuZCA6Y2xhc3M6YC5Eb3duZ3JhZGVPcHNgCiAgICAgICAgIGNvbGxlY3Rpb25zIGZvciBgYC51cGdyYWRlX29wc2BgIGFuZCBgYC5kb3duZ3JhZGVfb3BzYGAuICBUaGUKICAgICAgICAgYGAtLWF1dG9nZW5lcmF0ZWBgIG9wdGlvbiBpdHNlbGYgY2FuIGJlIGluZmVycmVkIGJ5IGluc3BlY3RpbmcKICAgICAgICAgYGBjb250ZXh0LmNvbmZpZy5jbWRfb3B0cy5hdXRvZ2VuZXJhdGVgYC4KCiAgICAgICAgIFRoZSBjYWxsYWJsZSBmdW5jdGlvbiBtYXkgb3B0aW9uYWxseSBiZSBhbiBpbnN0YW5jZSBvZgogICAgICAgICBhIDpjbGFzczpgLlJld3JpdGVyYCBvYmplY3QuICBUaGlzIGlzIGEgaGVscGVyIG9iamVjdCB0aGF0CiAgICAgICAgIGFzc2lzdHMgaW4gdGhlIHByb2R1Y3Rpb24gb2YgYXV0b2dlbmVyYXRlLXN0cmVhbSByZXdyaXRlciBmdW5jdGlvbnMuCgogICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgICA6cmVmOmBjdXN0b21pemluZ19yZXZpc2lvbmAKCiAgICAgICAgICAgICA6cmVmOmBhdXRvZ2VuX3Jld3JpdGVyYAoKICAgICAgICAgICAgIDpwYXJhbXJlZjpgLmNvbW1hbmQucmV2aXNpb24ucHJvY2Vzc19yZXZpc2lvbl9kaXJlY3RpdmVzYAoKICAgICAgICBQYXJhbWV0ZXJzIHNwZWNpZmljIHRvIGluZGl2aWR1YWwgYmFja2VuZHM6CgogICAgICAgIDpwYXJhbSBtc3NxbF9iYXRjaF9zZXBhcmF0b3I6IFRoZSAiYmF0Y2ggc2VwYXJhdG9yIiB3aGljaCB3aWxsCiAgICAgICAgIGJlIHBsYWNlZCBiZXR3ZWVuIGVhY2ggc3RhdGVtZW50IHdoZW4gZ2VuZXJhdGluZyBvZmZsaW5lIFNRTCBTZXJ2ZXIKICAgICAgICAgbWlncmF0aW9ucy4gIERlZmF1bHRzIHRvIGBgR09gYC4gIE5vdGUgdGhpcyBpcyBpbiBhZGRpdGlvbiB0byB0aGUKICAgICAgICAgY3VzdG9tYXJ5IHNlbWljb2xvbiBgYDtgYCBhdCB0aGUgZW5kIG9mIGVhY2ggc3RhdGVtZW50OyBTUUwgU2VydmVyCiAgICAgICAgIGNvbnNpZGVycyB0aGUgImJhdGNoIHNlcGFyYXRvciIgdG8gZGVub3RlIHRoZSBlbmQgb2YgYW4KICAgICAgICAgaW5kaXZpZHVhbCBzdGF0ZW1lbnQgZXhlY3V0aW9uLCBhbmQgY2Fubm90IGdyb3VwIGNlcnRhaW4KICAgICAgICAgZGVwZW5kZW50IG9wZXJhdGlvbnMgaW4gb25lIHN0ZXAuCiAgICAgICAgOnBhcmFtIG9yYWNsZV9iYXRjaF9zZXBhcmF0b3I6IFRoZSAiYmF0Y2ggc2VwYXJhdG9yIiB3aGljaCB3aWxsCiAgICAgICAgIGJlIHBsYWNlZCBiZXR3ZWVuIGVhY2ggc3RhdGVtZW50IHdoZW4gZ2VuZXJhdGluZyBvZmZsaW5lCiAgICAgICAgIE9yYWNsZSBtaWdyYXRpb25zLiAgRGVmYXVsdHMgdG8gYGAvYGAuICBPcmFjbGUgZG9lc24ndCBhZGQgYQogICAgICAgICBzZW1pY29sb24gYmV0d2VlbiBzdGF0ZW1lbnRzIGxpa2UgbW9zdCBvdGhlciBiYWNrZW5kcy4KCiAgICAgICAgTnJPAAAAcowAAAByXQAAAHJmAAAAco4AAAByiwAAAHKQAAAAcpIAAABylAAAAHKWAAAAco8AAABynwAAAHKhAAAAcqMAAAByogAAAHKkAAAAcp4AAABylwAAAHJsAAAAKQHaB2RlZmF1bHRypQAAAHKcAAAAcpkAAABymgAAAHIzAAAAKQZygwAAAHKFAAAAcocAAADaE2Vudmlyb25tZW50X2NvbnRleHRyiAAAANoEb3B0cykKcjgAAAByMgAAAHKMAAAA2gZ1cGRhdGVyGQAAANoIdG9fdHVwbGVyMwAAAHIXAAAA2gljb25maWd1cmVyMQAAACkdcjkAAABygwAAAHKFAAAAcocAAAByiAAAAHJPAAAAcosAAAByjAAAAHJdAAAAcmYAAAByjgAAAHKPAAAAcpAAAABykgAAAHKUAAAAcpYAAABylwAAAHKZAAAAcpoAAABynAAAAHKeAAAAcp8AAAByoQAAAHKiAAAAcqMAAABypAAAAHKlAAAAcjQAAAByqgAAAHMdAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICByOgAAAHKtAAAAehxFbnZpcm9ubWVudENvbnRleHQuY29uZmlndXJligEAAHO9AQAAgADwYg4AEBTUDyCIBNgLHNALKNgoOYhE0BEk0Qwl2AsY0Ask2CQxiESQH9EMIdAMIdgNEYxb1A0m0A0y2CQopEvUJD2IRJAf0Qwh2AsX8AABCTDYIy+IRJAe0Qwg2AsO8AABCR7YGh2IRJAViUvYCxjwAAEJOJhfsATQHTTQHTTYDBCQH9QMIdcMKNIMKKgd0Qw31Aw30Aw32CxFiATQDSjRCCnYIjGIBNANHtEIH9gfK4gEiF7RCBzYIS+IBNANHdEIHtgiMYgE0A0e0Qgf2CIxiATQDR7RCB/YIC2IBIhf0Qgd2CIxiATQDR7RCB/YK0OIBNANJ9EIKNgoPYgE0A0k0Qgl2CU3iATQDSHRCCLYIC2IBIhf0Qgd2C5JiATQDSrRCCvdIyekPdAxQcgy0CNO0SNO1CNOiATQDR/RCCDgCxbQCyLYIi2IRJAd0Qwf2AsX0Asj2CMviESQHtEMINgLIdALLdgtQ4hE0BEp0Qwq2BkdnBuIBIhYiQ7gCAyPC4oLkEKJD4wPiA/lIjLUIjzYFyHYEBPYGSXYICTYGSXYERXwDQcjCvEAByMK9AAHIwqIBNQIH9AIH9AIH3I8AAAAYwEAAAAAAAAAAAAAAAYAAAALAAAB87oAAACXAHwAagAAAAAAAAAAAIACSgCCAXQDAAAAAAAAAAAAAGoCAAAAAAAAAAB8AGoAAAAAAAAAAACmAQAAqwEAAAAAAAAAADUAAQACAHwAoAMAAAAAAAAAAAAAAAAAAAAAAAAAAKYAAACrAAAAAAAAAAAAagQAAAAAAAAAAGQCaQB8AaQBjgEBAGQBZAFkAaYCAACrAgAAAAAAAAAAAQBkAVMAIwAxAHMEdwJ4A1kAdwEBAFkAAQABAGQBUwApA2GMAwAAUnVuIG1pZ3JhdGlvbnMgYXMgZGV0ZXJtaW5lZCBieSB0aGUgY3VycmVudCBjb21tYW5kIGxpbmUKICAgICAgICBjb25maWd1cmF0aW9uCiAgICAgICAgYXMgd2VsbCBhcyB2ZXJzaW9uaW5nIGluZm9ybWF0aW9uIHByZXNlbnQgKG9yIG5vdCkgaW4gdGhlIGN1cnJlbnQKICAgICAgICBkYXRhYmFzZSBjb25uZWN0aW9uIChpZiBvbmUgaXMgcHJlc2VudCkuCgogICAgICAgIFRoZSBmdW5jdGlvbiBhY2NlcHRzIG9wdGlvbmFsIGBgKiprd2BgIGFyZ3VtZW50cy4gICBJZiB0aGVzZSBhcmUKICAgICAgICBwYXNzZWQsIHRoZXkgYXJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIGBgdXBncmFkZSgpYGAgYW5kCiAgICAgICAgYGBkb3duZ3JhZGUoKWBgCiAgICAgICAgZnVuY3Rpb25zIHdpdGhpbiBlYWNoIHRhcmdldCByZXZpc2lvbiBmaWxlLiAgIEJ5IG1vZGlmeWluZyB0aGUKICAgICAgICBgYHNjcmlwdC5weS5tYWtvYGAgZmlsZSBzbyB0aGF0IHRoZSBgYHVwZ3JhZGUoKWBgIGFuZCBgYGRvd25ncmFkZSgpYGAKICAgICAgICBmdW5jdGlvbnMgYWNjZXB0IGFyZ3VtZW50cywgcGFyYW1ldGVycyBjYW4gYmUgcGFzc2VkIGhlcmUgc28gdGhhdAogICAgICAgIGNvbnRleHR1YWwgaW5mb3JtYXRpb24sIHVzdWFsbHkgaW5mb3JtYXRpb24gdG8gaWRlbnRpZnkgYSBwYXJ0aWN1bGFyCiAgICAgICAgZGF0YWJhc2UgaW4gdXNlLCBjYW4gYmUgcGFzc2VkIGZyb20gYSBjdXN0b20gYGBlbnYucHlgYCBzY3JpcHQKICAgICAgICB0byB0aGUgbWlncmF0aW9uIGZ1bmN0aW9ucy4KCiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGF0IGEgOmNsYXNzOmAuTWlncmF0aW9uQ29udGV4dGAgaGFzCiAgICAgICAgZmlyc3QgYmVlbiBtYWRlIGF2YWlsYWJsZSB2aWEgOm1ldGg6YC5jb25maWd1cmVgLgoKICAgICAgICBOcmwAAAApBXIxAAAAchoAAADaB2NvbnRleHRyTQAAANoOcnVuX21pZ3JhdGlvbnMpAnI5AAAAcjQAAABzAgAAACAgcjoAAABysAAAAHohRW52aXJvbm1lbnRDb250ZXh0LnJ1bl9taWdyYXRpb25zigMAAHOwAAAAgADwKAAQFNQPJtAPMtAPMtAPMt0NF9QNH6AE1CA30Q041A048AABCTTwAAEJNNgMLYhE1wwc0gwc0Qwe1Awe1Awt0Awz0AwzsALQDDPQDDPQDDPwAwEJNPAAAQk08AABCTTxAAEJNPQAAQk08AABCTTwAAEJNPAAAQk08AABCTTwAAEJNPAAAQk08AABCTT4+PjwAAEJNPAAAQk08AABCTTwAAEJNPAAAQk08AABCTRzEQAAAKMgQRADwRAEQRQHwRcBQRQH2gNzcWz6GVVuaW9uW0NsYXVzZUVsZW1lbnQsIHN0cl3aEWV4ZWN1dGlvbl9vcHRpb25z+g5PcHRpb25hbFtkaWN0XWMDAAAAAAAAAAAAAAAEAAAAAwAAAfNYAAAAlwB8AKAAAAAAAAAAAAAAAAAAAAAAAAAAAACmAAAAqwAAAAAAAAAAAKABAAAAAAAAAAAAAAAAAAAAAAAAAAB8AXwCrAGmAgAAqwIAAAAAAAAAAAEAZAJTACkDYZQBAABFeGVjdXRlIHRoZSBnaXZlbiBTUUwgdXNpbmcgdGhlIGN1cnJlbnQgY2hhbmdlIGNvbnRleHQuCgogICAgICAgIFRoZSBiZWhhdmlvciBvZiA6bWV0aDpgLmV4ZWN1dGVgIGlzIHRoZSBzYW1lCiAgICAgICAgYXMgdGhhdCBvZiA6bWV0aDpgLk9wZXJhdGlvbnMuZXhlY3V0ZWAuICBQbGVhc2Ugc2VlIHRoYXQKICAgICAgICBmdW5jdGlvbidzIGRvY3VtZW50YXRpb24gZm9yIGZ1bGwgZGV0YWlsIGluY2x1ZGluZwogICAgICAgIGNhdmVhdHMgYW5kIGxpbWl0YXRpb25zLgoKICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoYXQgYSA6Y2xhc3M6YC5NaWdyYXRpb25Db250ZXh0YCBoYXMKICAgICAgICBmaXJzdCBiZWVuIG1hZGUgYXZhaWxhYmxlIHZpYSA6bWV0aDpgLmNvbmZpZ3VyZWAuCgogICAgICAgICkBcrMAAABOKQJyTQAAANoHZXhlY3V0ZSkDcjkAAABysQAAAHKzAAAAcwMAAAAgICByOgAAAHK2AAAAehpFbnZpcm9ubWVudENvbnRleHQuZXhlY3V0ZaIDAABzMAAAAIAA8CAACQ3XCBjSCBjRCBrUCBrXCCLSCCKgM9A6S9AIItEITNQITNAITNAITNAITHI8AAAA2gR0ZXh0YwIAAAAAAAAAAAAAAAMAAAADAAAB814AAACXAHwAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAKYAAACrAAAAAAAAAAAAagEAAAAAAAAAAKACAAAAAAAAAAAAAAAAAAAAAAAAAAB8AaYBAACrAQAAAAAAAAAAAQBkAVMAKQJ670VtaXQgdGV4dCBkaXJlY3RseSB0byB0aGUgIm9mZmxpbmUiIFNRTCBzdHJlYW0uCgogICAgICAgIFR5cGljYWxseSB0aGlzIGlzIGZvciBlbWl0dGluZyBjb21tZW50cyB0aGF0CiAgICAgICAgc3RhcnQgd2l0aCAtLS4gIFRoZSBzdGF0ZW1lbnQgaXMgbm90IHRyZWF0ZWQKICAgICAgICBhcyBhIFNRTCBleGVjdXRpb24sIG5vIDsgb3IgYmF0Y2ggc2VwYXJhdG9yCiAgICAgICAgaXMgYWRkZWQsIGV0Yy4KCiAgICAgICAgTikDck0AAAByTgAAANoNc3RhdGljX291dHB1dCkCcjkAAABytwAAAHMCAAAAICByOgAAAHK5AAAAeiBFbnZpcm9ubWVudENvbnRleHQuc3RhdGljX291dHB1dLQDAABzLQAAAIAA8BIACQ3XCBjSCBjRCBrUCBrUCB/XCC3SCC2oZNEIM9QIM9AIM9AIM9AIM3I8AAAA+i5VbmlvbltfUHJveHlUcmFuc2FjdGlvbiwgQ29udGV4dE1hbmFnZXJbTm9uZV1dYwEAAAAAAAAAAAAAAAIAAAADAAAB804AAACXAHwAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAKYAAACrAAAAAAAAAAAAoAEAAAAAAAAAAAAAAAAAAAAAAAAAAKYAAACrAAAAAAAAAAAAUwApAWFbBgAAUmV0dXJuIGEgY29udGV4dCBtYW5hZ2VyIHRoYXQgd2lsbAogICAgICAgIGVuY2xvc2UgYW4gb3BlcmF0aW9uIHdpdGhpbiBhICJ0cmFuc2FjdGlvbiIsCiAgICAgICAgYXMgZGVmaW5lZCBieSB0aGUgZW52aXJvbm1lbnQncyBvZmZsaW5lCiAgICAgICAgYW5kIHRyYW5zYWN0aW9uYWwgRERMIHNldHRpbmdzLgoKICAgICAgICBlLmcuOjoKCiAgICAgICAgICAgIHdpdGggY29udGV4dC5iZWdpbl90cmFuc2FjdGlvbigpOgogICAgICAgICAgICAgICAgY29udGV4dC5ydW5fbWlncmF0aW9ucygpCgogICAgICAgIDptZXRoOmAuYmVnaW5fdHJhbnNhY3Rpb25gIGlzIGludGVuZGVkIHRvCiAgICAgICAgImRvIHRoZSByaWdodCB0aGluZyIgcmVnYXJkbGVzcyBvZgogICAgICAgIGNhbGxpbmcgY29udGV4dDoKCiAgICAgICAgKiBJZiA6bWV0aDpgLmlzX3RyYW5zYWN0aW9uYWxfZGRsYCBpcyBgYEZhbHNlYGAsCiAgICAgICAgICByZXR1cm5zIGEgImRvIG5vdGhpbmciIGNvbnRleHQgbWFuYWdlcgogICAgICAgICAgd2hpY2ggb3RoZXJ3aXNlIHByb2R1Y2VzIG5vIHRyYW5zYWN0aW9uYWwKICAgICAgICAgIHN0YXRlIG9yIGRpcmVjdGl2ZXMuCiAgICAgICAgKiBJZiA6bWV0aDpgLmlzX29mZmxpbmVfbW9kZWAgaXMgYGBUcnVlYGAsCiAgICAgICAgICByZXR1cm5zIGEgY29udGV4dCBtYW5hZ2VyIHRoYXQgd2lsbAogICAgICAgICAgaW52b2tlIHRoZSA6bWV0aDpgLkRlZmF1bHRJbXBsLmVtaXRfYmVnaW5gCiAgICAgICAgICBhbmQgOm1ldGg6YC5EZWZhdWx0SW1wbC5lbWl0X2NvbW1pdGAKICAgICAgICAgIG1ldGhvZHMsIHdoaWNoIHdpbGwgcHJvZHVjZSB0aGUgc3RyaW5nCiAgICAgICAgICBkaXJlY3RpdmVzIGBgQkVHSU5gYCBhbmQgYGBDT01NSVRgYCBvbgogICAgICAgICAgdGhlIG91dHB1dCBzdHJlYW0sIGFzIHJlbmRlcmVkIGJ5IHRoZQogICAgICAgICAgdGFyZ2V0IGJhY2tlbmQgKGUuZy4gU1FMIFNlcnZlciB3b3VsZAogICAgICAgICAgZW1pdCBgYEJFR0lOIFRSQU5TQUNUSU9OYGApLgogICAgICAgICogT3RoZXJ3aXNlLCBjYWxscyA6bWV0aDpgc3FsYWxjaGVteS5lbmdpbmUuQ29ubmVjdGlvbi5iZWdpbmAKICAgICAgICAgIG9uIHRoZSBjdXJyZW50IG9ubGluZSBjb25uZWN0aW9uLCB3aGljaAogICAgICAgICAgcmV0dXJucyBhIDpjbGFzczpgc3FsYWxjaGVteS5lbmdpbmUuVHJhbnNhY3Rpb25gCiAgICAgICAgICBvYmplY3QuICBUaGlzIG9iamVjdCBkZW1hcmNhdGVzIGEgcmVhbAogICAgICAgICAgdHJhbnNhY3Rpb24gYW5kIGlzIGl0c2VsZiBhIGNvbnRleHQgbWFuYWdlciwKICAgICAgICAgIHdoaWNoIHdpbGwgcm9sbCBiYWNrIGlmIGFuIGV4Y2VwdGlvbgogICAgICAgICAgaXMgcmFpc2VkLgoKICAgICAgICBOb3RlIHRoYXQgYSBjdXN0b20gYGBlbnYucHlgYCBzY3JpcHQgd2hpY2gKICAgICAgICBoYXMgbW9yZSBzcGVjaWZpYyB0cmFuc2FjdGlvbmFs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
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 3
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
environment.cpython-311.pyc
43.21 KB
lrw-r--r--
2026-02-06 08:01:46
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
migration.cpython-311.pyc
59.52 KB
lrw-r--r--
2026-02-06 08:01:46
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-311.pyc
188 B
lrw-r--r--
2026-02-06 08:01:46
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).