REDROOM
PHP 8.0.30
Path:
Logout
Edit File
Size: 68.02 KB
Close
/opt/alt/python37/lib64/python3.7/site-packages/numpy/linalg/__pycache__/linalg.cpython-37.pyc
Text
Base64
Qg0NCgAAAADC2EZkGy4BAOMAAAAAAAAAAAAAAAAVAAAAQAAAAHM0AwAAZABaAGQBZAJsAW0CWgJtA1oDbQRaBAEAZANkBGQFZAZkB2QIZAlkCmQLZAxkDWQOZA9kEGQRZBJkE2QUZBVkFmQXZxVaBWQBZBhsBloGZAFkGWwHbQhaCG0JWgltCloKbQtaC20MWgxtDVoNbQ5aDm0PWg9tEFoQbRFaEW0SWhJtE1oTbRRaFG0VWhVtFloWbRdaF20YWhhtGVoZbRpaGm0bWhttHFocbR1aHW0eWh5tH1ofbSBaIG0hWiFtIloibSNaI20kWiRtJVolbSZaJm0nWidtKFoobSlaKW0qWiptK1orbSxaLG0tWi1tLloubS9aL20wWjBtMVoxAQBkAWQabDJtM1ozAQBkAWQbbDRtNVo1bTZaNgEAZAFkHGw3bThaOG05WjkBAGQBZB1sOm07WjsBAGQeWjxkH1o9ZCBaPmQhWj9kIlpAZQ5aQUcAZCNkFoQAZBZlQoMDWkNkGGFEZCRkJYQAWkVlRYMAAQBkJmQnhABaRmQoZCmEAFpHZCpkK4QAWkhkLGQthABaSWQuZC+EAFpKZDBkMYQAWktkMmQzhABaTGUPZQ9lEGUQZRFlD2USZRBpBFpNZQ9lEWUQZRJlEWURZRJlEmkEWk5lEGYBZDRkNYQBWk9lEmYBZDZkN4QBWlBkOGQ5hABaUWUPZRFlEGUSZRFlEWUSZRJpBFpOZDpkO4QAWlJlHlpTZDxkPYQAWlRkPmQ/hABaVWRAZEGEAFpWZEJkQ4QAWldkRGRFhABaWGRGZEeEAFpZZEhkSYQAWlpkSmRLhABaW2RMZE2EAFpcZHJkTmQFhAFaXWRPZASEAFpeZHNkUWQGhAFaX2RSZAeEAFpgZFNkCIQAWmFkdGRVZBOEAVpiZFZkCYQAWmNkdWRYZAqEAVpkZFlkWoQAWmVkW2QPhABaZmR2ZFxkEIQBWmdkd2ReZA6EAVpoZHhkX2QUhAFaaWR5ZGBkFYQBWmpkemRiZAuEAVprZGNkDIQAWmxkZGQNhABabWR7ZGZkEYQBWm5kZ2RohABab2R8ZGpkEoQBWnBka2QXhABacWRsZG2EAFpyZH1kbmRvhAFac2RwZHGEAFp0ZBhTACl+YXgBAABMaXRlIHZlcnNpb24gb2Ygc2NpcHkubGluYWxnLgoKTm90ZXMKLS0tLS0KVGhpcyBtb2R1bGUgaXMgYSBsaXRlIHZlcnNpb24gb2YgdGhlIGxpbmFsZy5weSBtb2R1bGUgaW4gU2NpUHkgd2hpY2gKY29udGFpbnMgaGlnaC1sZXZlbCBQeXRob24gaW50ZXJmYWNlIHRvIHRoZSBMQVBBQ0sgbGlicmFyeS4gIFRoZSBsaXRlCnZlcnNpb24gb25seSBhY2Nlc3NlcyB0aGUgZm9sbG93aW5nIExBUEFDSyBmdW5jdGlvbnM6IGRnZXN2LCB6Z2VzdiwKZGdlZXYsIHpnZWV2LCBkZ2VzZGQsIHpnZXNkZCwgZGdlbHNkLCB6Z2Vsc2QsIGRzeWV2ZCwgemhlZXZkLCBkZ2V0cmYsCnpnZXRyZiwgZHBvdHJmLCB6cG90cmYsIGRnZXFyZiwgemdlcXJmLCB6dW5ncXIsIGRvcmdxci4K6QAAAAApA9oIZGl2aXNpb27aD2Fic29sdXRlX2ltcG9ydNoOcHJpbnRfZnVuY3Rpb27aDG1hdHJpeF9wb3dlctoFc29sdmXaC3RlbnNvcnNvbHZl2gl0ZW5zb3JpbnbaA2ludtoIY2hvbGVza3naB2VpZ3ZhbHPaCGVpZ3ZhbHNo2gRwaW522gdzbG9nZGV02gNkZXTaA3N2ZNoDZWln2gRlaWdo2gVsc3RzcdoEbm9ybdoCcXLaBGNvbmTaC21hdHJpeF9yYW5r2gtMaW5BbGdFcnJvctoJbXVsdGlfZG90Tikq2gVhcnJhedoHYXNhcnJhedoFemVyb3PaBWVtcHR52gplbXB0eV9saWtl2gl0cmFuc3Bvc2XaBGludGPaBnNpbmdsZdoGZG91Ymxl2gdjc2luZ2xl2gdjZG91Ymxl2gdpbmV4YWN02g9jb21wbGV4ZmxvYXRpbmfaB25ld2F4aXPaBXJhdmVs2gNhbGzaA0luZtoDZG902gNhZGTaCG11bHRpcGx52gRzcXJ02gdtYXhpbXVt2hRmYXN0Q29weUFuZFRyYW5zcG9zZdoDc3Vt2ghpc2Zpbml0ZdoEc2l6ZdoFZmluZm/aCGVycnN0YXRl2glnZXRlcnJvYmraCmxvbmdkb3VibGXaCHJvbGxheGlz2gRhbWlu2gRhbWF42gdwcm9kdWN02gNhYnPaCWJyb2FkY2FzdNoKYXRsZWFzdF8yZNoEaW50cNoKYXNhbnlhcnJhedoIaXNzY2FsYXLaB29iamVjdF/aBG9uZXMpAdoUbm9ybWFsaXplX2F4aXNfaW5kZXgpAtoEdHJpddoIYXNmYXJyYXkpAtoLbGFwYWNrX2xpdGXaDV91bWF0aF9saW5hbGcpAXIFAAAA8wEAAABO8wEAAABW8wEAAABB8wEAAABT8wEAAABMYwAAAAAAAAAAAAAAAAEAAABAAAAAcxAAAABlAFoBZABaAmQBWgNkAlMAKQNyGAAAAGEZAwAACiAgICBHZW5lcmljIFB5dGhvbi1leGNlcHRpb24tZGVyaXZlZCBvYmplY3QgcmFpc2VkIGJ5IGxpbmFsZyBmdW5jdGlvbnMuCgogICAgR2VuZXJhbCBwdXJwb3NlIGV4Y2VwdGlvbiBjbGFzcywgZGVyaXZlZCBmcm9tIFB5dGhvbidzIGV4Y2VwdGlvbi5FeGNlcHRpb24KICAgIGNsYXNzLCBwcm9ncmFtbWF0aWNhbGx5IHJhaXNlZCBpbiBsaW5hbGcgZnVuY3Rpb25zIHdoZW4gYSBMaW5lYXIKICAgIEFsZ2VicmEtcmVsYXRlZCBjb25kaXRpb24gd291bGQgcHJldmVudCBmdXJ0aGVyIGNvcnJlY3QgZXhlY3V0aW9uIG9mIHRoZQogICAgZnVuY3Rpb24uCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgTm9uZQoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGZyb20gbnVtcHkgaW1wb3J0IGxpbmFsZyBhcyBMQQogICAgPj4+IExBLmludihucC56ZXJvcygoMiwyKSkpCiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CiAgICAgIEZpbGUgIi4uLmxpbmFsZy5weSIsIGxpbmUgMzUwLAogICAgICAgIGluIGludiByZXR1cm4gd3JhcChzb2x2ZShhLCBpZGVudGl0eShhLnNoYXBlWzBdLCBkdHlwZT1hLmR0eXBlKSkpCiAgICAgIEZpbGUgIi4uLmxpbmFsZy5weSIsIGxpbmUgMjQ5LAogICAgICAgIGluIHNvbHZlCiAg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YRIFAAAKICAgIFNvbHZlIHRoZSB0ZW5zb3IgZXF1YXRpb24gYGBhIHggPSBiYGAgZm9yIHguCgogICAgSXQgaXMgYXNzdW1lZCB0aGF0IGFsbCBpbmRpY2VzIG9mIGB4YCBhcmUgc3VtbWVkIG92ZXIgaW4gdGhlIHByb2R1Y3QsCiAgICB0b2dldGhlciB3aXRoIHRoZSByaWdodG1vc3QgaW5kaWNlcyBvZiBgYWAsIGFzIGlzIGRvbmUgaW4sIGZvciBleGFtcGxlLAogICAgYGB0ZW5zb3Jkb3QoYSwgeCwgYXhlcz1iLm5kaW0pYGAuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBDb2VmZmljaWVudCB0ZW5zb3IsIG9mIHNoYXBlIGBgYi5zaGFwZSArIFFgYC4gYFFgLCBhIHR1cGxlLCBlcXVhbHMKICAgICAgICB0aGUgc2hhcGUgb2YgdGhhdCBzdWItdGVuc29yIG9mIGBhYCBjb25zaXN0aW5nIG9mIHRoZSBhcHByb3ByaWF0ZQogICAgICAgIG51bWJlciBvZiBpdHMgcmlnaHRtb3N0IGluZGljZXMsIGFuZCBtdXN0IGJlIHN1Y2ggdGhhdAogICAgICAgIGBgcHJvZChRKSA9PSBwcm9kKGIuc2hhcGUpYGAgKGluIHdoaWNoIHNlbnNlIGBhYCBpcyBzYWlkIHRvIGJlCiAgICAgICAgJ3NxdWFyZScpLgogICAgYiA6IGFycmF5X2xpa2UKICAgICAgICBSaWdodC1oYW5kIHRlbnNvciwgd2hpY2ggY2FuIGJlIG9mIGFueSBzaGFwZS4KICAgIGF4ZXMgOiB0dXBsZSBvZiBpbnRzLCBvcHRpb25hbAogICAgICAgIEF4ZXMgaW4gYGFgIHRvIHJlb3JkZXIgdG8gdGhlIHJpZ2h0LCBiZWZvcmUgaW52ZXJzaW9uLgogICAgICAgIElmIE5vbmUgKGRlZmF1bHQpLCBubyByZW9yZGVyaW5nIGlzIGRvbmUuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgeCA6IG5kYXJyYXksIHNoYXBlIFEKCiAgICBSYWlzZXMKICAgIC0tLS0tLQogICAgTGluQWxnRXJyb3IKICAgICAgICBJZiBgYWAgaXMgc2luZ3VsYXIgb3Igbm90ICdzcXVhcmUnIChpbiB0aGUgYWJvdmUgc2Vuc2UpLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkudGVuc29yZG90LCB0ZW5zb3JpbnYsIG51bXB5LmVpbnN1bQoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGEgPSBucC5leWUoMiozKjQpCiAgICA+Pj4gYS5zaGFwZSA9ICgyKjMsIDQsIDIsIDMsIDQpCiAgICA+Pj4gYiA9IG5wLnJhbmRvbS5yYW5kbigyKjMsIDQpCiAgICA+Pj4geCA9IG5wLmxpbmFsZy50ZW5zb3Jzb2x2ZShhLCBiKQogICAgPj4+IHguc2hhcGUKICAgICgyLCAzLCA0KQogICAgPj4+IG5wLmFsbGNsb3NlKG5wLnRlbnNvcmRvdChhLCB4LCBheGVzPTMpLCBiKQogICAgVHJ1ZQoKICAgIE5yAQAAAHJYAAAA6f////8pDHJrAAAAchsAAAByiAAAAHJjAAAA2gVyYW5nZdoGcmVtb3Zl2gZpbnNlcnRyHwAAAHKMAAAA2gdyZXNoYXBlcigAAAByBgAAACkKcmgAAADaAWJaBGF4ZXNyagAAAFoCYW5aB2FsbGF4ZXPaAWvaCG9sZHNoYXBl2gRwcm9k2gNyZXNyUgAAAHJSAAAAclMAAAByBwAAAOcAAABzJAAAAAAvDAEIAQYCCAEOAQoBCgEQAQoCFgEEAQoBDAIMAQgBDgEGAWMCAAAAAAAAAAoAAAAGAAAAQwAAAHOOAAAAdAB8AIMBXAJ9AH0CdAF8AIMBAQB0AnwAgwEBAHQAfAGDAVwCfQF9A3QDfAB8AYMCXAJ9BH0FfAFqBHwAagRkARgAawJyTnQFagZ9Bm4GdAVqB30GdAh8BIMBcmBkAm4CZAN9B3QJdAqDAX0IfAZ8AHwBfAd8CGQEjQR9CXwDfAlqC3wFZAVkBo0CgwFTACkHYegFAAAKICAgIFNvbHZlIGEgbGluZWFyIG1hdHJpeCBlcXVhdGlvbiwgb3Igc3lzdGVtIG9mIGxpbmVhciBzY2FsYXIgZXF1YXRpb25zLgoKICAgIENvbXB1dGVzIHRoZSAiZXhhY3QiIHNvbHV0aW9uLCBgeGAsIG9mIHRoZSB3ZWxsLWRldGVybWluZWQsIGkuZS4sIGZ1bGwKICAgIHJhbmssIGxpbmVhciBtYXRyaXggZXF1YXRpb24gYGF4ID0gYmAuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6ICguLi4sIE0sIE0pIGFycmF5X2xpa2UKICAgICAgICBDb2VmZmljaWVudCBtYXRyaXguCiAgICBiIDogeyguLi4sIE0sKSwgKC4uLiwgTSwgSyl9LCBhcnJheV9saWtlCiAgICAgICAgT3JkaW5hdGUgb3IgImRlcGVuZGVudCB2YXJpYWJsZSIgdmFsdWVzLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHggOiB7KC4uLiwgTSwpLCAoLi4uLCBNLCBLKX0gbmRhcnJheQogICAgICAgIFNvbHV0aW9uIHRvIHRoZSBzeXN0ZW0gYSB4ID0gYi4gIFJldHVybmVkIHNoYXBlIGlzIGlkZW50aWNhbCB0byBgYmAuCgogICAgUmFpc2VzCiAgICAtLS0tLS0KICAgIExpbkFsZ0Vycm9yCiAgICAgICAgSWYgYGFgIGlzIHNpbmd1bGFyIG9yIG5vdCBzcXVhcmUuCgogICAgTm90ZXMKICAgIC0tLS0tCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS44LjAKCiAgICBCcm9hZGNhc3RpbmcgcnVsZXMgYXBwbHksIHNlZSB0aGUgYG51bXB5LmxpbmFsZ2AgZG9jdW1lbnRhdGlvbiBmb3IKICAgIGRldGFpbHMuCgogICAgVGhlIHNvbHV0aW9ucyBhcmUgY29tcHV0ZWQgdXNpbmcgTEFQQUNLIHJvdXRpbmUgX2dlc3YKCiAgICBgYWAgbXVzdCBiZSBzcXVhcmUgYW5kIG9mIGZ1bGwtcmFuaywgaS5lLiwgYWxsIHJvd3MgKG9yLCBlcXVpdmFsZW50bHksCiAgICBjb2x1bW5zKSBtdXN0IGJlIGxpbmVhcmx5IGluZGVwZW5kZW50OyBpZiBlaXRoZXIgaXMgbm90IHRydWUsIHVzZQogICAgYGxzdHNxYCBmb3IgdGhlIGxlYXN0LXNxdWFyZXMgYmVzdCAic29sdXRpb24iIG9mIHRoZQogICAgc3lzdGVtL2VxdWF0aW9uLgoKICAgIFJlZmVyZW5jZXMKICAgIC0tLS0tLS0tLS0KICAgIC4uIFsxXSBHLiBTdHJhbmcsICpMaW5lYXIgQWxnZWJyYSBhbmQgSXRzIEFwcGxpY2F0aW9ucyosIDJuZCBFZC4sIE9ybGFuZG8sCiAgICAgICAgICAgRkwsIEFjYWRlbWljIFByZXNzLCBJbmMuLCAxOTgwLCBwZy4gMjIuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICBTb2x2ZSB0aGUgc3lzdGVtIG9mIGVxdWF0aW9ucyBgYDMgKiB4MCArIHgxID0gOWBgIGFuZCBgYHgwICsgMiAqIHgxID0gOGBgOgoKICAgID4+PiBhID0gbnAuYXJyYXkoW1szLDFdLCBbMSwyXV0pCiAgICA+Pj4gYiA9IG5wLmFycmF5KFs5LDhdKQogICAgPj4+IHggPSBucC5saW5hbGcuc29sdmUoYSwgYikKICAgID4+PiB4CiAgICBhcnJheShbIDIuLCAgMy5dKQoKICAgIENoZWNrIHRoYXQgdGhlIHNvbHV0aW9uIGlzIGNvcnJlY3Q6CgogICAgPj4+IG5wLmFsbGNsb3NlKG5wLmRvdChhLCB4KSwgYikKICAgIFRydWUKCiAgICByWAAAAHoFREQtPkR6BWRkLT5kKQLaCXNpZ25hdHVyZXJlAAAARikB2gRjb3B5KQxyawAAAHKKAAAAcpAAAAByfAAAAHKIAAAAckgAAABaBnNvbHZlMXIGAAAAcm4AAAByZgAAAHJeAAAAcoYAAAApCnJoAAAAcpkAAADaAV9yagAAAHJtAAAA2ghyZXN1bHRfdNoGZ3VmdW5jcp4AAAByZQAAANoBcnJSAAAAclIAAAByUwAAAHIGAAAALAEAAHMYAAAAADwMAQgBCAEMAQ4EEAEIAgYCEAEIARACcmIAAABjAgAAAAAAAAAHAAAABAAAAEMAAABzeAAAAHQAfACDAX0AfABqAX0CZAF9A3wBZAJrBHJSfAJ8AWQDhQIZAHwCZAN8AYUCGQAXAH0EeCZ8AnwBZAOFAhkARABdDH0FfAN8BTkAfQNxQFcAbgh0AmQEgwGCAXwAoAN8A2QFoQJ9AHQEfACDAX0GfAZqA3wEjgBTACkGYYoFAAAKICAgIENvbXB1dGUgdGhlICdpbnZlcnNlJyBvZiBhbiBOLWRpbWVuc2lvbmFsIGFycmF5LgoKICAgIFRoZSByZXN1bHQgaXMgYW4gaW52ZXJzZSBmb3IgYGFgIHJlbGF0aXZlIHRvIHRoZSB0ZW5zb3Jkb3Qgb3BlcmF0aW9uCiAgICBgYHRlbnNvcmRvdChhLCBiLCBpbmQpYGAsIGkuIGUuLCB1cCB0byBmbG9hdGluZy1wb2ludCBhY2N1cmFjeSwKICAgIGBgdGVuc29yZG90KHRlbnNvcmludihhKSwgYSwgaW5kKWBgIGlzIHRoZSAiaWRlbnRpdHkiIHRlbnNvciBmb3IgdGhlCiAgICB0ZW5zb3Jkb3Qgb3BlcmF0aW9uLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiBhcnJheV9saWtlCiAgICAgICAgVGVuc29yIHRvICdpbnZlcnQnLiBJdHMgc2hhcGUgbXVzdCBiZSAnc3F1YXJlJywgaS4gZS4sCiAgICAgICAgYGBwcm9kKGEuc2hhcGVbOmluZF0pID09IHByb2QoYS5zaGFwZVtpbmQ6XSlgYC4KICAgIGluZCA6IGludCwgb3B0aW9uYWwKICAgICAgICBOdW1iZXIgb2YgZmlyc3QgaW5kaWNlcyB0aGF0IGFyZSBpbnZvbHZlZCBpbiB0aGUgaW52ZXJzZSBzdW0uCiAgICAgICAgTXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGRlZmF1bHQgaXMgMi4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBiIDogbmRhcnJheQogICAgICAgIGBhYCdzIHRlbnNvcmRvdCBpbnZlcnNlLCBzaGFwZSBgYGEuc2hhcGVbaW5kOl0gKyBhLnNoYXBlWzppbmRdYGAuCgogICAgUmFpc2VzCiAgICAtLS0tLS0KICAgIExpbkFsZ0Vycm9yCiAgICAgICAgSWYgYGFgIGlzIHNpbmd1bGFyIG9yIG5vdCAnc3F1YXJlJyAoaW4gdGhlIGFib3ZlIHNlbnNlKS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LnRlbnNvcmRvdCwgdGVuc29yc29sdmUKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBhID0gbnAuZXllKDQqNikKICAgID4+PiBhLnNoYXBlID0gKDQsIDYsIDgsIDMpCiAgICA+Pj4gYWludiA9IG5wLmxpbmFsZy50ZW5zb3JpbnYoYSwgaW5kPTIpCiAgICA+Pj4gYWludi5zaGFwZQogICAgKDgsIDMsIDQsIDYpCiAgICA+Pj4gYiA9IG5wLnJhbmRvbS5yYW5kbig0LCA2KQogICAgPj4+IG5wLmFsbGNsb3NlKG5wLnRlbnNvcmRvdChhaW52LCBiKSwgbnAubGluYWxnLnRlbnNvcnNvbHZlKGEsIGIpKQogICAgVHJ1ZQoKICAgID4+PiBhID0gbnAuZXllKDQqNikKICAgID4+PiBhLnNoYXBlID0gKDI0LCA4LCAzKQogICAgPj4+IGFpbnYgPSBucC5saW5hbGcudGVuc29yaW52KGEsIGluZD0xKQogICAgPj4+IGFpbnYuc2hhcGUKICAgICg4LCAzLCAyNCkKICAgID4+PiBiID0gbnAucmFuZG9tLnJhbmRuKDI0KQogICAgPj4+IG5wLmFsbGNsb3NlKG5wLnRlbnNvcmRvdChhaW52LCBiLCAxKSwgbnAubGluYWxnLnRlbnNvcnNvbHZlKGEsIGIpKQogICAgVHJ1ZQoKICAgIHJYAAAAcgEAAABOehVJbnZhbGlkIGluZCBhcmd1bWVudC5ylAAAACkFchsAAAByjAAAANoKVmFsdWVFcnJvcnKYAAAAcgkAAAApB3JoAAAA2gNpbmRymwAAAHKcAAAAWghpbnZzaGFwZXKaAAAA2gJpYXJSAAAAclIAAAByUwAAAHIIAAAAfAEAAHMWAAAAADUIAQYBBAEIARgBEgEOAggBDAEIAWMBAAAAAAAAAAcAAAAFAAAAQwAAAHNiAAAAdAB8AIMBXAJ9AH0BdAF8AIMBAQB0AnwAgwEBAHQDfACDAVwCfQJ9A3QEfAKDAXI0ZAFuAmQCfQR0BXQGgwF9BXQHagh8AHwEfAVkA40DfQZ8AXwGagl8A2QEZAWNAoMBUwApBmH+BAAACiAgICBDb21wdXRlIHRoZSAobXVsdGlwbGljYXRpdmUpIGludmVyc2Ugb2YgYSBtYXRyaXguCgogICAgR2l2ZW4gYSBzcXVhcmUgbWF0cml4IGBhYCwgcmV0dXJuIHRoZSBtYXRyaXggYGFpbnZgIHNhdGlzZnlpbmcKICAgIGBgZG90KGEsIGFpbnYpID0gZG90KGFpbnYsIGEpID0gZXllKGEuc2hhcGVbMF0pYGAuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6ICguLi4sIE0sIE0pIGFycmF5X2xpa2UKICAgICAgICBNYXRyaXggdG8gYmUgaW52ZXJ0ZWQuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgYWludiA6ICguLi4sIE0sIE0pIG5kYXJyYXkgb3IgbWF0cml4CiAgICAgICAgKE11bHRpcGxpY2F0aXZlKSBpbnZlcnNlIG9mIHRoZSBtYXRyaXggYGFgLgoKICAgIFJhaXNlcwogICAgLS0tLS0tCiAgICBMaW5BbGdFcnJvcgogICAgICAgIElmIGBhYCBpcyBub3Qgc3F1YXJlIG9yIGludmVyc2lvbiBmYWlscy4KCiAgICBOb3RlcwogICAgLS0tLS0KCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjguMAoKICAgIEJyb2FkY2FzdGluZyBydWxlcyBhcHBseSwgc2VlIHRoZSBgbnVtcHkubGluYWxnYCBkb2N1bWVudGF0aW9uIGZvcgogICAgZGV0YWlscy4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBmcm9tIG51bXB5LmxpbmFsZyBpbXBvcnQgaW52CiAgICA+Pj4gYSA9IG5wLmFycmF5KFtbMS4sIDIuXSwgWzMuLCA0Ll1dKQogICAgPj4+IGFpbnYgPSBpbnYoYSkKICAgID4+PiBucC5hbGxjbG9zZShucC5kb3QoYSwgYWludiksIG5wLmV5ZSgyKSkKICAgIFRydWUKICAgID4+PiBucC5hbGxjbG9zZShucC5kb3QoYWludiwgYSksIG5wLmV5ZSgyKSkKICAgIFRydWUKCiAgICBJZiBhIGlzIGEgbWF0cml4IG9iamVjdCwgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgbWF0cml4IGFzIHdlbGw6CgogICAgPj4+IGFpbnYgPSBpbnYobnAubWF0cml4KGEpKQogICAgPj4+IGFpbnYKICAgIG1hdHJpeChbWy0yLiAsICAxLiBdLAogICAgICAgICAgICBbIDEuNSwgLTAuNV1dKQoKICAgIEludmVyc2VzIG9mIHNldmVyYWwgbWF0cmljZXMgY2FuIGJlIGNvbXB1dGVkIGF0IG9uY2U6CgogICAgPj4+IGEgPSBucC5hcnJheShbW1sxLiwgMi5dLCBbMy4sIDQuXV0sIFtbMSwgM10sIFszLCA1XV1dKQogICAgPj4+IGludihhKQogICAgYXJyYXkoW1tbLTIuICwgIDEuIF0sCiAgICAgICAgICAgIFsgMS41LCAtMC41XV0sCiAgICAgICAgICAgW1stNS4gLCAgMi4gXSwKICAgICAgICAgICAgWyAzLiAsIC0xLiBdXV0pCgogICAgegRELT5EegRkLT5kKQJyngAAAHJlAAAARikBcp8AAAApCnJrAAAAcooAAABykAAAAHJ8AAAAcm4AAAByZgAAAHJeAAAAckgAAAByCQAAAHKGAAAAKQdyaAAAAHJqAAAAcm0AAAByoQAAAHKeAAAAcmUAAADaBGFpbnZyUgAAAHJSAAAAclMAAAByCQAAAMEBAABzEAAAAAA5DAEIAQgBDAIQAQgBEAFjAQAAAAAAAAAIAAAABQAAAEMAAABzZgAAAHQAdAGDAX0BdAJqA30CdAR8AIMBXAJ9AH0DdAV8AIMBAQB0BnwAgwEBAHQHfACDAVwCfQR9BXQIfASDAXJCZAFuAmQCfQZ8AnwAfAZ8AWQDjQN9B3wDfAdqCXwFZARkBY0CgwFTACkGYfAHAAAKICAgIENob2xlc2t5IGRlY29tcG9zaXRpb24uCgogICAgUmV0dXJuIHRoZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uLCBgTCAqIEwuSGAsIG9mIHRoZSBzcXVhcmUgbWF0cml4IGBhYCwKICAgIHdoZXJlIGBMYCBpcyBsb3dlci10cmlhbmd1bGFyIGFuZCAuSCBpcyB0aGUgY29uanVnYXRlIHRyYW5zcG9zZSBvcGVyYXRvcgogICAgKHdoaWNoIGlzIHRoZSBvcmRpbmFyeSB0cmFuc3Bvc2UgaWYgYGFgIGlzIHJlYWwtdmFsdWVkKS4gIGBhYCBtdXN0IGJlCiAgICBIZXJtaXRpYW4gKHN5bW1ldHJpYyBpZiByZWFsLXZhbHVlZCkgYW5kIHBvc2l0aXZlLWRlZmluaXRlLiAgT25seSBgTGAgaXMKICAgIGFjdHVhbGx5IHJldHVybmVkLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiAoLi4uLCBNLCBNKSBhcnJheV9saWtlCiAgICAgICAgSGVybWl0aWFuIChzeW1tZXRyaWMgaWYgYWxsIGVsZW1lbnRzIGFyZSByZWFsKSwgcG9zaXRpdmUtZGVmaW5pdGUKICAgICAgICBpbnB1dCBtYXRyaXguCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgTCA6ICguLi4sIE0sIE0pIGFycmF5X2xpa2UKICAgICAgICBVcHBlciBvciBsb3dlci10cmlhbmd1bGFyIENob2xlc2t5IGZhY3RvciBvZiBgYWAuICBSZXR1cm5zIGEKICAgICAgICBtYXRyaXggb2JqZWN0IGlmIGBhYCBpcyBhIG1hdHJpeCBvYmplY3QuCgogICAgUmFpc2VzCiAgICAtLS0tLS0KICAgIExpbkFsZ0Vycm9yCiAgICAgICBJZiB0aGUgZGVjb21wb3NpdGlvbiBmYWlscywgZm9yIGV4YW1wbGUsIGlmIGBhYCBpcyBub3QKICAgICAgIHBvc2l0aXZlLWRlZmluaXRlLgoKICAgIE5vdGVzCiAgICAtLS0tLQoKICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuOC4wCgogICAgQnJvYWRjYXN0aW5nIHJ1bGVzIGFwcGx5LCBzZWUgdGhlIGBudW1weS5saW5hbGdgIGRvY3VtZW50YXRpb24gZm9yCiAgICBkZXRhaWxzLgoKICAgIFRoZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIGlzIG9mdGVuIHVzZWQgYXMgYSBmYXN0IHdheSBvZiBzb2x2aW5nCgogICAgLi4gbWF0aDo6IEEgXG1hdGhiZnt4fSA9IFxtYXRoYmZ7Yn0KCiAgICAod2hlbiBgQWAgaXMgYm90aCBIZXJtaXRpYW4vc3ltbWV0cmljIGFuZCBwb3NpdGl2ZS1kZWZpbml0ZSkuCgogICAgRmlyc3QsIHdlIHNvbHZlIGZvciA6bWF0aDpgXG1hdGhiZnt5fWAgaW4KCiAgICAuLiBtYXRoOjogTCBcbWF0aGJme3l9ID0gXG1hdGhiZntifSwKCiAgICBhbmQgdGhlbiBmb3IgOm1hdGg6YFxtYXRoYmZ7eH1gIGluCgogICAgLi4gbWF0aDo6IEwuSCBcbWF0aGJme3h9ID0gXG1hdGhiZnt5fS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBBID0gbnAuYXJyYXkoW1sxLC0yal0sWzJqLDVdXSkKICAgID4+PiBBCiAgICBhcnJheShbWyAxLiswLmosICAwLi0yLmpdLAogICAgICAgICAgIFsgMC4rMi5qLCAgNS4rMC5qXV0pCiAgICA+Pj4gTCA9IG5wLmxpbmFsZy5jaG9sZXNreShBKQogICAgPj4+IEwKICAgIGFycmF5KFtbIDEuKzAuaiwgIDAuKzAual0sCiAgICAgICAgICAgWyAwLisyLmosICAxLiswLmpdXSkKICAgID4+PiBucC5kb3QoTCwgTC5ULmNvbmooKSkgIyB2ZXJpZnkgdGhhdCBMICogTC5IID0gQQogICAgYXJyYXkoW1sgMS4rMC5qLCAgMC4tMi5qXSwKICAgICAgICAgICBbIDAuKzIuaiwgIDUuKzAual1dKQogICAgPj4+IEEgPSBbWzEsLTJqXSxbMmosNV1dICMgd2hhdCBoYXBwZW5zIGlmIEEgaXMgb25seSBhcnJheV9saWtlPwogICAgPj4+IG5wLmxpbmFsZy5jaG9sZXNreShBKSAjIGFuIG5kYXJyYXkgb2JqZWN0IGlzIHJldHVybmVkCiAgICBhcnJheShbWyAxLiswLmosICAwLiswLmpdLAogICAgICAgICAgIFsgMC4rMi5qLCAgMS4rMC5qXV0pCiAgICA+Pj4gIyBCdXQgYSBtYXRyaXggb2JqZWN0IGlzIHJldHVybmVkIGlmIEEgaXMgYSBtYXRyaXggb2JqZWN0CiAgICA+Pj4gTEEuY2hvbGVza3kobnAubWF0cml4KEEpKQogICAgbWF0cml4KFtbIDEuKzAuaiwgIDAuKzAual0sCiAgICAgICAgICAgIFsgMC4rMi5qLCAgMS4rMC5qXV0pCgogICAgegRELT5EegRkLT5kKQJyngAAAHJlAAAARikBcp8AAAApCnJmAAAAcl8AAABySAAAAFoLY2hvbGVza3lfbG9yawAAAHKKAAAAcpAAAAByfAAAAHJuAAAAcoYAAAApCHJoAAAAcmUAAAByogAAAHJqAAAAcm0AAAByoQAAAHKeAAAAcqMAAAByUgAAAHJSAAAAclMAAAByCgAAAAcCAABzEgAAAABJCAEGAQwBCAEIAQwBEAEOAdoHcmVkdWNlZGMCAAAAAAAAABIAAAAKAAAAQwAAAHMmAwAAfAFkAWsHcl58AWQCawZyMGQDoABkBKEBfQJ0AWoCfAJ0A2QFZAaNAwEAZAd9AW4ufAFkCGsGclJkCX0CdAFqAnwCdANkBWQGjQMBAGQKfQFuDHQEZAt8ARYAgwGCAXQFfACDAVwCfQB9A3QGfACDAQEAdAd8AIMBAQB8AGoIXAJ9BH0FdAl8AIMBXAJ9Bn0HdAp8BnwAgwJ9AHQLfACDAX0AdAx8BHwFgwJ9CHQNfAhmAXwGgwJ9CXQOfAaDAXLMdA9qEH0KZAx9C24KdA9qEX0KZA19C2QOfQx0DXwMZgF8BoMCfQ18CnwEfAV8AHwEfAl8DWQPZBCDCH0OfA5kERkAZBBrA5ABch50EmQSfAt8DmQRGQBmAhYAgwGCAXQTdBR8DWQQGQCDAYMBfQx0DXwMZgF8BoMCfQ18CnwEfAV8AHwEfAl8DXwMZBCDCH0OfA5kERkAZBBrA5ABcnJ0EmQSfAt8DmQRGQBmAhYAgwGCAXwBZBNrApABcqJ0CnwHfABkFGQUhQJkFHwIhQJmAhkAgwJ9D3wDdBV8D4MBgwFTAHwBZBVrApABcrR8AHwJZgJTAHwBZAprApABcuB8BnwHawOQAXLWfABqFnwHZBZkF40CfQB8A3wAaheDAVMAfAFkGGsCkAJyCHwEfAVrBJACcgh8BH0QdBh8BHwEZgJ8BoMCfRFuEnwIfRB0GHwFfARmAnwGgwJ9EXwAfBFkFHwFhQI8AHQOfAaDAZACcjx0D2oZfQpkGX0Lbgp0D2oafQpkGn0LZA59DHQNfAxmAXwGgwJ9DXwKfAR8EHwIfBF8BHwJfA1kD2QQgwl9DnwOZBEZAGQQawOQAnKQdBJkEnwLfA5kERkAZgIWAIMBggF0E3QUfA1kEBkAgwGDAX0MdA18DGYBfAaDAn0NfAp8BHwQfAh8EXwEfAl8DXwMZBCDCX0OfA5kERkAZBBrA5ACcuZ0EmQSfAt8DmQRGQBmAhYAgwGCAXQKfAd8EWQUfBCFAhkAgwJ9EXQKfAd8AGQUZBSFAmQUfBCFAmYCGQCDAn0PfAN8EYMBfAN0FXwPgwGDAWYCUwApG2ErEgAACiAgICBDb21wdXRlIHRoZSBxciBmYWN0b3JpemF0aW9uIG9mIGEgbWF0cml4LgoKICAgIEZhY3RvciB0aGUgbWF0cml4IGBhYCBhcyAqcXIqLCB3aGVyZSBgcWAgaXMgb3J0aG9ub3JtYWwgYW5kIGByYCBpcwogICAgdXBwZXItdHJpYW5ndWxhci4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZSwgc2hhcGUgKE0sIE4pCiAgICAgICAgTWF0cml4IHRvIGJlIGZhY3RvcmVkLgogICAgbW9kZSA6IHsncmVkdWNlZCcsICdjb21wbGV0ZScsICdyJywgJ3JhdycsICdmdWxsJywgJ2Vjb25vbWljJ30sIG9wdGlvbmFsCiAgICAgICAgSWYgSyA9IG1pbihNLCBOKSwgdGhlbgoKICAgICAgICAncmVkdWNlZCcgIDogcmV0dXJucyBxLCByIHdpdGggZGltZW5zaW9ucyAoTSwgSyksIChLLCBOKSAoZGVmYXVsdCkKICAgICAgICAnY29tcGxldGUnIDogcmV0dXJucyBxLCByIHdpdGggZGltZW5zaW9ucyAoTSwgTSksIChNLCBOKQogICAgICAgICdyJyAgICAgICAgOiByZXR1cm5zIHIgb25seSB3aXRoIGRpbWVuc2lvbnMgKEssIE4pCiAgICAgICAgJ3JhdycgICAgICA6IHJldHVybnMgaCwgdGF1IHdpdGggZGltZW5zaW9ucyAoTiwgTSksIChLLCkKICAgICAgICAnZnVsbCcgICAgIDogYWxpYXMgb2YgJ3JlZHVjZWQnLCBkZXByZWNhdGVkCiAgICAgICAgJ2Vjb25vbWljJyA6IHJldHVybnMgaCBmcm9tICdyYXcnLCBkZXByZWNhdGVkLgoKICAgICAgICBUaGUgb3B0aW9ucyAncmVkdWNlZCcsICdjb21wbGV0ZSwgYW5kICdyYXcnIGFyZSBuZXcgaW4gbnVtcHkgMS44LAogICAgICAgIHNlZSB0aGUgbm90ZXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uIFRoZSBkZWZhdWx0IGlzICdyZWR1Y2VkJyBhbmQgdG8KICAgICAgICBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciB2ZXJzaW9ucyBvZiBudW1weSBib3RoCiAgICAgICAgaXQgYW5kIHRoZSBvbGQgZGVmYXVsdCAnZnVsbCcgY2FuIGJlIG9taXR0ZWQuIE5vdGUgdGhhdCBhcnJheSBoCiAgICAgICAgcmV0dXJuZWQgaW4gJ3JhdycgbW9kZSBpcyB0cmFuc3Bvc2VkIGZvciBjYWxsaW5nIEZvcnRyYW4uIFRoZQogICAgICAgICdlY29ub21pYycgbW9kZSBpcyBkZXByZWNhdGVkLiAgVGhlIG1vZGVzICdmdWxsJyBhbmQgJ2Vjb25vbWljJyBtYXkKICAgICAgICBiZSBwYXNzZWQgdXNpbmcgb25seSB0aGUgZmlyc3QgbGV0dGVyIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwKICAgICAgICBidXQgYWxsIG90aGVycyBtdXN0IGJlIHNwZWxsZWQgb3V0LiBTZWUgdGhlIE5vdGVzIGZvciBtb3JlCiAgICAgICAgZXhwbGFuYXRpb24uCgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHEgOiBuZGFycmF5IG9mIGZsb2F0IG9yIGNvbXBsZXgsIG9wdGlvbmFsCiAgICAgICAgQSBtYXRyaXggd2l0aCBvcnRob25vcm1hbCBjb2x1bW5zLiBXaGVuIG1vZGUgPSAnY29tcGxldGUnIHRoZQogICAgICAgIHJlc3VsdCBpcyBhbiBvcnRob2dvbmFsL3VuaXRhcnkgbWF0cml4IGRlcGVuZGluZyBvbiB3aGV0aGVyIG9yIG5vdAogICAgICAgIGEgaXMgcmVhbC9jb21wbGV4LiBUaGUgZGV0ZXJtaW5hbnQgbWF5IGJlIGVpdGhlciArLy0gMSBpbiB0aGF0CiAgICAgICAgY2FzZS4KICAgIHIgOiBuZGFycmF5IG9mIGZsb2F0IG9yIGNvbXBsZXgsIG9wdGlvbmFsCiAgICAgICAgVGhlIHVwcGVyLXRyaWFuZ3VsYXIgbWF0cml4LgogICAgKGgsIHRhdSkgOiBuZGFycmF5cyBvZiBucC5kb3VibGUgb3IgbnAuY2RvdWJsZSwgb3B0aW9uYWwKICAgICAgICBUaGUgYXJyYXkgaCBjb250YWlucyB0aGUgSG91c2Vob2xkZXIgcmVmbGVjdG9ycyB0aGF0IGdlbmVyYXRlIHEKICAgICAgICBhbG9uZyB3aXRoIHIuIFRoZSB0YXUgYXJyYXkgY29udGFpbnMgc2NhbGluZyBmYWN0b3JzIGZvciB0aGUKICAgICAgICByZWZsZWN0b3JzLiBJbiB0aGUgZGVwcmVjYXRlZCAgJ2Vjb25vbWljJyBtb2RlIG9ubHkgaCBpcyByZXR1cm5lZC4KCiAgICBSYWlzZXMKICAgIC0tLS0tLQogICAgTGluQWxnRXJyb3IKICAgICAgICBJZiBmYWN0b3JpbmcgZmFpbHMuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBUaGlzIGlzIGFuIGludGVyZmFjZSB0byB0aGUgTEFQQUNLIHJvdXRpbmVzIGRnZXFyZiwgemdlcXJmLAogICAgZG9yZ3FyLCBhbmQgenVuZ3FyLgoKICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBxciBmYWN0b3JpemF0aW9uLCBzZWUgZm9yIGV4YW1wbGU6CiAgICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1FSX2ZhY3Rvcml6YXRpb24KCiAgICBTdWJjbGFzc2VzIG9mIGBuZGFycmF5YCBhcmUgcHJlc2VydmVkIGV4Y2VwdCBmb3IgdGhlICdyYXcnIG1vZGUuIFNvIGlmCiAgICBgYWAgaXMgb2YgdHlwZSBgbWF0cml4YCwgYWxsIHRoZSByZXR1cm4gdmFsdWVzIHdpbGwgYmUgbWF0cmljZXMgdG9vLgoKICAgIE5ldyAncmVkdWNlZCcsICdjb21wbGV0ZScsIGFuZCAncmF3JyBvcHRpb25zIGZvciBtb2RlIHdlcmUgYWRkZWQgaW4KICAgIE51bVB5IDEuOC4wIGFuZCB0aGUgb2xkIG9wdGlvbiAnZnVsbCcgd2FzIG1hZGUgYW4gYWxpYXMgb2YgJ3JlZHVjZWQnLiAgSW4KICAgIGFkZGl0aW9uIHRoZSBvcHRpb25zICdmdWxsJyBhbmQgJ2Vjb25vbWljJyB3ZXJlIGRlcHJlY2F0ZWQuICBCZWNhdXNlCiAgICAnZnVsbCcgd2FzIHRoZSBwcmV2aW91cyBkZWZhdWx0IGFuZCAncmVkdWNlZCcgaXMgdGhlIG5ldyBkZWZhdWx0LAogICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBjYW4gYmUgbWFpbnRhaW5lZCBieSBsZXR0aW5nIGBtb2RlYCBkZWZhdWx0LgogICAgVGhlICdyYXcnIG9wdGlvbiB3YXMgYWRkZWQgc28gdGhhdCBMQVBBQ0sgcm91dGluZXMgdGhhdCBjYW4gbXVsdGlwbHkKICAgIGFycmF5cyBieSBxIHVzaW5nIHRoZSBIb3VzZWhvbGRlciByZWZsZWN0b3JzIGNhbiBiZSB1c2VkLiBOb3RlIHRoYXQgaW4KICAgIHRoaXMgY2FzZSB0aGUgcmV0dXJuZWQgYXJyYXlzIGFyZSBvZiB0eXBlIG5wLmRvdWJsZSBvciBucC5jZG91YmxlIGFuZAogICAgdGhlIGggYXJyYXkgaXMgdHJhbnNwb3NlZCB0byBiZSBGT1JUUkFOIGNvbXBhdGlibGUuICBObyByb3V0aW5lcyB1c2luZwogICAgdGhlICdyYXcnIHJldHVybiBhcmUgY3VycmVudGx5IGV4cG9zZWQgYnkgbnVtcHksIGJ1dCBzb21lIGFyZSBhdmFpbGFibGUKICAgIGluIGxhcGFja19saXRlIGFuZCBqdXN0IGF3YWl0IHRoZSBuZWNlc3Nhcnkgd29yay4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBhID0gbnAucmFuZG9tLnJhbmRuKDksIDYpCiAgICA+Pj4gcSwgciA9IG5wLmxpbmFsZy5xcihhKQogICAgPj4+IG5wLmFsbGNsb3NlKGEsIG5wLmRvdChxLCByKSkgICMgYSBkb2VzIGVxdWFsIHFyCiAgICBUcnVlCiAgICA+Pj4gcjIgPSBucC5saW5hbGcucXIoYSwgbW9kZT0ncicpCiAgICA+Pj4gcjMgPSBucC5saW5hbGcucXIoYSwgbW9kZT0nZWNvbm9taWMnKQogICAgPj4+IG5wLmFsbGNsb3NlKHIsIHIyKSAgIyBtb2RlPSdyJyByZXR1cm5zIHRoZSBzYW1lIHIgYXMgbW9kZT0nZnVsbCcKICAgIFRydWUKICAgID4+PiAjIEJ1dCBvbmx5IHRyaXUgcGFydHMgYXJlIGd1YXJhbnRlZWQgZXF1YWwgd2hlbiBtb2RlPSdlY29ub21pYycKICAgID4+PiBucC5hbGxjbG9zZShyLCBucC50cml1KHIzWzo2LDo2XSwgaz0wKSkKICAgIFRydWUKCiAgICBFeGFtcGxlIGlsbHVzdHJhdGluZyBhIGNvbW1vbiB1c2Ugb2YgYHFyYDogc29sdmluZyBvZiBsZWFzdCBzcXVhcmVzCiAgICBwcm9ibGVtcwoKICAgIFdoYXQgYXJlIHRoZSBsZWFzdC1zcXVhcmVzLWJlc3QgYG1gIGFuZCBgeTBgIGluIGBgeSA9IHkwICsgbXhgYCBmb3IKICAgIHRoZSBmb2xsb3dpbmcgZGF0YTogeygwLDEpLCAoMSwwKSwgKDEsMiksICgyLDEpfS4gKEdyYXBoIHRoZSBwb2ludHMKICAgIGFuZCB5b3UnbGwgc2VlIHRoYXQgaXQgc2hvdWxkIGJlIHkwID0gMCwgbSA9IDEuKSAgVGhlIGFuc3dlciBpcyBwcm92aWRlZAogICAgYnkgc29sdmluZyB0aGUgb3Zlci1kZXRlcm1pbmVkIG1hdHJpeCBlcXVhdGlvbiBgYEF4ID0gYmBgLCB3aGVyZTo6CgogICAgICBBID0gYXJyYXkoW1swLCAxXSwgWzEsIDFdLCBbMSwgMV0sIFsyLCAxXV0pCiAgICAgIHggPSBhcnJheShbW3kwXSwgW21dXSkKICAgICAgYiA9IGFycmF5KFtbMV0sIFswXSwgWzJdLCBbMV1dKQoKICAgIElmIEEgPSBxciBzdWNoIHRoYXQgcSBpcyBvcnRob25vcm1hbCAod2hpY2ggaXMgYWx3YXlzIHBvc3NpYmxlIHZpYQogICAgR3JhbS1TY2htaWR0KSwgdGhlbiBgYHggPSBpbnYocikgKiAocS5UKSAqIGJgYC4gIChJbiBudW1weSBwcmFjdGljZSwKICAgIGhvd2V2ZXIsIHdlIHNpbXBseSB1c2UgYGxzdHNxYC4pCgogICAgPj4+IEEgPSBucC5hcnJheShbWzAsIDFdLCBbMSwgMV0sIFsxLCAxXSwgWzIsIDFdXSkKICAgID4+PiBBCiAgICBhcnJheShbWzAsIDFdLAogICAgICAgICAgIFsxLCAxXSwKICAgICAg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ZW52ZWN0b3JzIG9mIGdlbmVyYWwgYXJyYXlzCiAgICBlaWd2YWxzaCA6IGVpZ2VudmFsdWVzIG9mIHN5bW1ldHJpYyBvciBIZXJtaXRpYW4gYXJyYXlzLgogICAgZWlnaCA6IGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgb2Ygc3ltbWV0cmljL0hlcm1pdGlhbiBhcnJheXMuCgogICAgTm90ZXMKICAgIC0tLS0tCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS44LjAKCiAgICBCcm9hZGNhc3RpbmcgcnVsZXMgYXBwbHksIHNlZSB0aGUgYG51bXB5LmxpbmFsZ2AgZG9jdW1lbnRhdGlvbiBmb3IKICAgIGRldGFpbHMuCgogICAgVGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgX2dlZXYgTEFQQUNLIHJvdXRpbmVzIHdoaWNoIGNvbXB1dGUKICAgIHRoZSBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG9mIGdlbmVyYWwgc3F1YXJlIGFycmF5cy4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgIElsbHVzdHJhdGlvbiwgdXNpbmcgdGhlIGZhY3QgdGhhdCB0aGUgZWlnZW52YWx1ZXMgb2YgYSBkaWFnb25hbCBtYXRyaXgKICAgIGFyZSBpdHMgZGlhZ29uYWwgZWxlbWVudHMsIHRoYXQgbXVsdGlwbHlpbmcgYSBtYXRyaXggb24gdGhlIGxlZnQKICAgIGJ5IGFuIG9ydGhvZ29uYWwgbWF0cml4LCBgUWAsIGFuZCBvbiB0aGUgcmlnaHQgYnkgYFEuVGAgKHRoZSB0cmFuc3Bvc2UKICAgIG9mIGBRYCksIHByZXNlcnZlcyB0aGUgZWlnZW52YWx1ZXMgb2YgdGhlICJtaWRkbGUiIG1hdHJpeC4gIEluIG90aGVyIHdvcmRzLAogICAgaWYgYFFgIGlzIG9ydGhvZ29uYWwsIHRoZW4gYGBRICogQSAqIFEuVGBgIGhhcyB0aGUgc2FtZSBlaWdlbnZhbHVlcyBhcwogICAgYGBBYGA6CgogICAgPj4+IGZyb20gbnVtcHkgaW1wb3J0IGxpbmFsZyBhcyBMQQogICAgPj4+IHggPSBucC5yYW5kb20ucmFuZG9tKCkKICAgID4+PiBRID0gbnAuYXJyYXkoW1tucC5jb3MoeCksIC1ucC5zaW4oeCldLCBbbnAuc2luKHgpLCBucC5jb3MoeCldXSkKICAgID4+PiBMQS5ub3JtKFFbMCwgOl0pLCBMQS5ub3JtKFFbMSwgOl0pLCBucC5kb3QoUVswLCA6XSxRWzEsIDpdKQogICAgKDEuMCwgMS4wLCAwLjApCgogICAgTm93IG11bHRpcGx5IGEgZGlhZ29uYWwgbWF0cml4IGJ5IFEgb24gb25lIHNpZGUgYW5kIGJ5IFEuVCBvbiB0aGUgb3RoZXI6CgogICAgPj4+IEQgPSBucC5kaWFnKCgtMSwxKSkKICAgID4+PiBMQS5laWd2YWxzKEQpCiAgICBhcnJheShbLTEuLCAgMS5dKQogICAgPj4+IEEgPSBucC5kb3QoUSwgRCkKICAgID4+PiBBID0gbnAuZG90KEEsIFEuVCkKICAgID4+PiBMQS5laWd2YWxzKEEpCiAgICBhcnJheShbIDEuLCAtMS5dKQoKICAgIHoERC0+RHoEZC0+RCkCcp4AAAByZQAAAHIBAAAARikBcp8AAAApEHJrAAAAcooAAABykAAAAHKRAAAAcnwAAAByZgAAAHJgAAAAcm4AAABySAAAAHILAAAAcikAAADaBGltYWfaBHJlYWxycgAAAHJ0AAAAcoYAAAApB3JoAAAAcmoAAABybQAAAHKhAAAAcmUAAAByngAAANoBd3JSAAAAclIAAAByUwAAAHILAAAAMwMAAHMeAAAAAEMMAQgBCAEIAQwCAgEGARABEAIIAQ4BBgEKAggC2gFMYwIAAAAAAAAACQAAAAUAAABDAAAAc44AAAB8AaAAoQB9AXwBZAFrB3IYdAFkAoMBggF0AnQDgwF9AnwBZANrAnIwdARqBX0DbgZ0BGoGfQN0B3wAgwFcAn0AfQR0CHwAgwEBAHQJfACDAQEAdAp8AIMBXAJ9BX0GdAt8BYMBcmpkBG4CZAV9B3wDfAB8B3wCZAaNA30IfAhqDHQNfAaDAWQHZAiNAlMAKQlhbAgAAAogICAgQ29tcHV0ZSB0aGUgZWlnZW52YWx1ZXMgb2YgYSBIZXJtaXRpYW4gb3IgcmVhbCBzeW1tZXRyaWMgbWF0cml4LgoKICAgIE1haW4gZGlmZmVyZW5jZSBmcm9tIGVpZ2g6IHRoZSBlaWdlbnZlY3RvcnMgYXJlIG5vdCBjb21wdXRlZC4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogKC4uLiwgTSwgTSkgYXJyYXlfbGlrZQogICAgICAgIEEgY29tcGxleC0gb3IgcmVhbC12YWx1ZWQgbWF0cml4IHdob3NlIGVpZ2VudmFsdWVzIGFyZSB0byBiZQogICAgICAgIGNvbXB1dGVkLgogICAgVVBMTyA6IHsnTCcsICdVJ30sIG9wdGlvbmFsCiAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNhbGN1bGF0aW9uIGlzIGRvbmUgd2l0aCB0aGUgbG93ZXIgdHJpYW5ndWxhcgogICAgICAgIHBhcnQgb2YgYGFgICgnTCcsIGRlZmF1bHQpIG9yIHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgKCdVJykuCiAgICAgICAgSXJyZXNwZWN0aXZlIG9mIHRoaXMgdmFsdWUgb25seSB0aGUgcmVhbCBwYXJ0cyBvZiB0aGUgZGlhZ29uYWwgd2lsbAogICAgICAgIGJlIGNvbnNpZGVyZWQgaW4gdGhlIGNvbXB1dGF0aW9uIHRvIHByZXNlcnZlIHRoZSBub3Rpb24gb2YgYSBIZXJtaXRpYW4KICAgICAgICBtYXRyaXguIEl0IHRoZXJlZm9yZSBmb2xsb3dzIHRoYXQgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBkaWFnb25hbAogICAgICAgIHdpbGwgYWx3YXlzIGJlIHRyZWF0ZWQgYXMgemVyby4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICB3IDogKC4uLiwgTSwpIG5kYXJyYXkKICAgICAgICBUaGUgZWlnZW52YWx1ZXMgaW4gYXNjZW5kaW5nIG9yZGVyLCBlYWNoIHJlcGVhdGVkIGFjY29yZGluZyB0bwogICAgICAgIGl0cyBtdWx0aXBsaWNpdHkuCgogICAgUmFpc2VzCiAgICAtLS0tLS0KICAgIExpbkFsZ0Vycm9yCiAgICAgICAgSWYgdGhlIGVpZ2VudmFsdWUgY29tcHV0YXRpb24gZG9lcyBub3QgY29udmVyZ2UuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBlaWdoIDogZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyBvZiBzeW1tZXRyaWMvSGVybWl0aWFuIGFycmF5cy4KICAgIGVpZ3ZhbHMgOiBlaWdlbnZhbHVlcyBvZiBnZW5lcmFsIHJlYWwgb3IgY29tcGxleCBhcnJheXMuCiAgICBlaWcgOiBlaWdlbnZhbHVlcyBhbmQgcmlnaHQgZWlnZW52ZWN0b3JzIG9mIGdlbmVyYWwgcmVhbCBvciBjb21wbGV4CiAgICAgICAgICBhcnJheXMuCgogICAgTm90ZXMKICAgIC0tLS0tCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS44LjAKCiAgICBCcm9hZGNhc3RpbmcgcnVsZXMgYXBwbHksIHNlZSB0aGUgYG51bXB5LmxpbmFsZ2AgZG9jdW1lbnRhdGlvbiBmb3IKICAgIGRldGFpbHMuCgogICAgVGhlIGVpZ2VudmFsdWVzIGFyZSBjb21wdXRlZCB1c2luZyBMQVBBQ0sgcm91dGluZXMgX3N5ZXZkLCBfaGVldmQKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBmcm9tIG51bXB5IGltcG9ydCBsaW5hbGcgYXMgTEEKICAgID4+PiBhID0gbnAuYXJyYXkoW1sxLCAtMmpdLCBbMmosIDVdXSkKICAgID4+PiBMQS5laWd2YWxzaChhKQogICAgYXJyYXkoWyAwLjE3MTU3Mjg4LCAgNS44Mjg0MjcxMl0pCgogICAgPj4+ICMgZGVtb25zdHJhdGUgdGhlIHRyZWF0bWVudCBvZiB0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgdGhlIGRpYWdvbmFsCiAgICA+Pj4gYSA9IG5wLmFycmF5KFtbNSsyaiwgOS0yal0sIFswKzJqLCAyLTFqXV0pCiAgICA+Pj4gYQogICAgYXJyYXkoW1sgNS4rMi5qLCAgOS4tMi5qXSwKICAgICAgICAgICBbIDAuKzIuaiwgIDIuLTEual1dKQogICAgPj4+ICMgd2l0aCBVUExPPSdMJyB0aGlzIGlzIG51bWVyaWNhbGx5IGVxdWl2YWxlbnQgdG8gdXNpbmcgTEEuZWlndmFscygpCiAgICA+Pj4gIyB3aXRoOgogICAgPj4+IGIgPSBucC5hcnJheShbWzUuKzAuaiwgMC4tMi5qXSwgWzAuKzIuaiwgMi4tMC5qXV0pCiAgICA+Pj4gYgogICAgYXJyYXkoW1sgNS4rMC5qLCAgMC4tMi5qXSwKICAgICAgICAgICBbIDAuKzIuaiwgIDIuKzAual1dKQogICAgPj4+IHdhID0gTEEuZWlndmFsc2goYSkKICAgID4+PiB3YiA9IExBLmVpZ3ZhbHMoYikKICAgID4+PiB3YTsgd2IKICAgIGFycmF5KFsgMS4sICA2Ll0pCiAgICBhcnJheShbIDYuKzAuaiwgIDEuKzAual0pCgogICAgKQJyygAAANoBVXogVVBMTyBhcmd1bWVudCBtdXN0IGJlICdMJyBvciAnVSdyygAAAHoERC0+ZHoEZC0+ZCkCcp4AAAByZQAAAEYpAXKfAAAAKQ7aBXVwcGVycqQAAAByZgAAAHJgAAAAckgAAABaC2VpZ3ZhbHNoX2xvWgtlaWd2YWxzaF91cHJrAAAAcooAAABykAAAAHJ8AAAAcm4AAAByhgAAAHJyAAAAKQlyaAAAANoEVVBMT3JlAAAAcqIAAAByagAAAHJtAAAAcqEAAAByngAAAHLJAAAAclIAAAByUgAAAHJTAAAAcgwAAACKAwAAcx4AAAAASAgBCAEIAgIBBgEIAQgCBgIMAQgBCAEMARABDgFjAQAAAAAAAAADAAAABAAAAEMAAABzJAAAAHQAfACDAVwCfQF9AnQBfACgAnwBoQGDAX0AfAB8AXwCZgNTACkBTikDcnwAAAByhQAAAHKGAAAAKQNyaAAAAHJtAAAAcqEAAAByUgAAAHJSAAAAclMAAADaDV9jb252ZXJ0YXJyYXnlAwAAcwYAAAAAAQwBDgFyzgAAAGMBAAAAAAAAAAgAAAAFAAAAQwAAAHO0AAAAdAB8AIMBXAJ9AH0BdAF8AIMBAQB0AnwAgwEBAHQDfACDAQEAdAR8AIMBXAJ9An0DdAV0BoMBfQR0B3wCgwFyRGQBbgJkAn0FdAhqCXwAfAV8BGQDjQNcAn0GfQd0B3wCgwFziHQKfAZqC2QEawKDAXKIfAZqDH0GfAdqDH0HdA18A4MBfQNuCHQOfAODAX0DfAdqD3wDZAVkBo0CfQd8BmoPfANkBWQGjQJ8AXwHgwFmAlMAKQdhzQ8AAAogICAgQ29tcHV0ZSB0aGUgZWlnZW52YWx1ZXMgYW5kIHJpZ2h0IGVpZ2VudmVjdG9ycyBvZiBhIHNxdWFyZSBhcnJheS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogKC4uLiwgTSwgTSkgYXJyYXkKICAgICAgICBNYXRyaWNlcyBmb3Igd2hpY2ggdGhlIGVpZ2VudmFsdWVzIGFuZCByaWdodCBlaWdlbnZlY3RvcnMgd2lsbAogICAgICAgIGJlIGNvbXB1dGVkCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgdyA6ICguLi4sIE0pIGFycmF5CiAgICAgICAgVGhlIGVpZ2VudmFsdWVzLCBlYWNoIHJlcGVhdGVkIGFjY29yZGluZyB0byBpdHMgbXVsdGlwbGljaXR5LgogICAgICAgIFRoZSBlaWdlbnZhbHVlcyBhcmUgbm90IG5lY2Vzc2FyaWx5IG9yZGVyZWQuIFRoZSByZXN1bHRpbmcKICAgICAgICBhcnJheSB3aWxsIGJlIG9mIGNvbXBsZXggdHlwZSwgdW5sZXNzIHRoZSBpbWFnaW5hcnkgcGFydCBpcwogICAgICAgIHplcm8gaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGJlIGNhc3QgdG8gYSByZWFsIHR5cGUuIFdoZW4gYGFgCiAgICAgICAgaXMgcmVhbCB0aGUgcmVzdWx0aW5nIGVpZ2VudmFsdWVzIHdpbGwgYmUgcmVhbCAoMCBpbWFnaW5hcnkKICAgICAgICBwYXJ0KSBvciBvY2N1ciBpbiBjb25qdWdhdGUgcGFpcnMKCiAgICB2IDogKC4uLiwgTSwgTSkgYXJyYXkKICAgICAgICBUaGUgbm9ybWFsaXplZCAodW5pdCAibGVuZ3RoIikgZWlnZW52ZWN0b3JzLCBzdWNoIHRoYXQgdGhlCiAgICAgICAgY29sdW1uIGBgdls6LGldYGAgaXMgdGhlIGVpZ2VudmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlCiAgICAgICAgZWlnZW52YWx1ZSBgYHdbaV1gYC4KCiAgICBSYWlzZXMKICAgIC0tLS0tLQogICAgTGluQWxnRXJyb3IKICAgICAgICBJZiB0aGUgZWlnZW52YWx1ZSBjb21wdXRhdGlvbiBkb2VzIG5vdCBjb252ZXJnZS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGVpZ3ZhbHMgOiBlaWdlbnZhbHVlcyBvZiBhIG5vbi1zeW1tZXRyaWMgYXJyYXkuCgogICAgZWlnaCA6IGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgb2YgYSBzeW1tZXRyaWMgb3IgSGVybWl0aWFuCiAgICAgICAgICAgKGNvbmp1Z2F0ZSBzeW1tZXRyaWMpIGFycmF5LgoKICAgIGVpZ3ZhbHNoIDogZWlnZW52YWx1ZXMgb2YgYSBzeW1tZXRyaWMgb3IgSGVybWl0aWFuIChjb25qdWdhdGUgc3ltbWV0cmljKQogICAgICAgICAgICAgICBhcnJheS4KCiAgICBOb3RlcwogICAgLS0tLS0KCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjguMAoKICAgIEJyb2FkY2FzdGluZyBydWxlcyBhcHBseSwgc2VlIHRoZSBgbnVtcHkubGluYWxnYCBkb2N1bWVudGF0aW9uIGZvcgogICAgZGV0YWlscy4KCiAgICBUaGlzIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSBfZ2VldiBMQVBBQ0sgcm91dGluZXMgd2hpY2ggY29tcHV0ZQogICAgdGhlIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgb2YgZ2VuZXJhbCBzcXVhcmUgYXJyYXlzLgoKICAgIFRoZSBudW1iZXIgYHdgIGlzIGFuIGVpZ2VudmFsdWUgb2YgYGFgIGlmIHRoZXJlIGV4aXN0cyBhIHZlY3RvcgogICAgYHZgIHN1Y2ggdGhhdCBgYGRvdChhLHYpID0gdyAqIHZgYC4gVGh1cywgdGhlIGFycmF5cyBgYWAsIGB3YCwgYW5kCiAgICBgdmAgc2F0aXNmeSB0aGUgZXF1YXRpb25zIGBgZG90KGFbOiw6XSwgdls6LGldKSA9IHdbaV0gKiB2WzosaV1gYAogICAgZm9yIDptYXRoOmBpIFxpbiBcezAsLi4uLE0tMVx9YC4KCiAgICBUaGUgYXJyYXkgYHZgIG9mIGVpZ2VudmVjdG9ycyBtYXkgbm90IGJlIG9mIG1heGltdW0gcmFuaywgdGhhdCBpcywgc29tZQogICAgb2YgdGhlIGNvbHVtbnMgbWF5IGJlIGxpbmVhcmx5IGRlcGVuZGVudCwgYWx0aG91Z2ggcm91bmQtb2ZmIGVycm9yIG1heQogICAgb2JzY3VyZSB0aGF0IGZhY3QuIElmIHRoZSBlaWdlbnZhbHVlcyBhcmUgYWxsIGRpZmZlcmVudCwgdGhlbiB0aGVvcmV0aWNhbGx5CiAgICB0aGUgZWlnZW52ZWN0b3JzIGFyZSBsaW5lYXJseSBpbmRlcGVuZGVudC4gTGlrZXdpc2UsIHRoZSAoY29tcGxleC12YWx1ZWQpCiAgICBtYXRyaXggb2YgZWlnZW52ZWN0b3JzIGB2YCBpcyB1bml0YXJ5IGlmIHRoZSBtYXRyaXggYGFgIGlzIG5vcm1hbCwgaS5lLiwKICAgIGlmIGBgZG90KGEsIGEuSCkgPSBkb3QoYS5ILCBhKWBgLCB3aGVyZSBgYS5IYCBkZW5vdGVzIHRoZSBjb25qdWdhdGUKICAgIHRyYW5zcG9zZSBvZiBgYWAuCgogICAgRmluYWxseSwgaXQgaXMgZW1waGFzaXplZCB0aGF0IGB2YCBjb25zaXN0cyBvZiB0aGUgKnJpZ2h0KiAoYXMgaW4KICAgIHJpZ2h0LWhhbmQgc2lkZSkgZWlnZW52ZWN0b3JzIG9mIGBhYC4gIEEgdmVjdG9yIGB5YCBzYXRpc2Z5aW5nCiAgICBgYGRvdCh5LlQsIGEpID0geiAqIHkuVGBgIGZvciBzb21lIG51bWJlciBgemAgaXMgY2FsbGVkIGEgKmxlZnQqCiAgICBlaWdlbnZlY3RvciBvZiBgYWAsIGFuZCwgaW4gZ2VuZXJhbCwgdGhlIGxlZnQgYW5kIHJpZ2h0IGVpZ2VudmVjdG9ycwogICAgb2YgYSBtYXRyaXggYXJlIG5vdCBuZWNlc3NhcmlseSB0aGUgKHBlcmhhcHMgY29uanVnYXRlKSB0cmFuc3Bvc2VzCiAgICBvZiBlYWNoIG90aGVyLgoKICAgIFJlZmVyZW5jZXMKICAgIC0tLS0tLS0tLS0KICAgIEcuIFN0cmFuZywgKkxpbmVhciBBbGdlYnJhIGFuZCBJdHMgQXBwbGljYXRpb25zKiwgMm5kIEVkLiwgT3JsYW5kbywgRkwsCiAgICBBY2FkZW1pYyBQcmVzcywgSW5jLiwgMTk4MCwgVmFyaW91cyBwcC4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBmcm9tIG51bXB5IGltcG9ydCBsaW5hbGcgYXMgTEEKCiAgICAoQWxtb3N0KSB0cml2aWFsIGV4YW1wbGUgd2l0aCByZWFsIGUtdmFsdWVzIGFuZCBlLXZlY3RvcnMuCgogICAgPj4+IHcsIHYgPSBMQS5laWcobnAuZGlhZygoMSwgMiwgMykpKQogICAgPj4+IHc7IHYKICAgIGFycmF5KFsgMS4sICAyLiwgIDMuXSkKICAgIGFycmF5KFtbIDEuLCAgMC4sICAwLl0sCiAgICAgICAgICAgWyAwLiwgIDEuLCAgMC5dLAogICAgICAgICAgIFsgMC4sICAwLiwgIDEuXV0pCgogICAgUmVhbCBtYXRyaXggcG9zc2Vzc2luZyBjb21wbGV4IGUtdmFsdWVzIGFuZCBlLXZlY3RvcnM7IG5vdGUgdGhhdCB0aGUKICAgIGUtdmFsdWVzIGFyZSBjb21wbGV4IGNvbmp1Z2F0ZXMgb2YgZWFjaCBvdGhlci4KCiAgICA+Pj4gdywgdiA9IExBLmVpZyhucC5hcnJheShbWzEsIC0xXSwgWzEsIDFdXSkpCiAgICA+Pj4gdzsgdgogICAgYXJyYXkoWyAxLiArIDEuaiwgIDEuIC0gMS5qXSkKICAgIGFycmF5KFtbIDAuNzA3MTA2NzgrMC5qICAgICAgICAsICAwLjcwNzEwNjc4KzAuaiAgICAgICAgXSwKICAgICAgICAgICBbIDAuMDAwMDAwMDAtMC43MDcxMDY3OGosICAwLjAwMDAwMDAwKzAuNzA3MTA2NzhqXV0pCgogICAgQ29tcGxleC12YWx1ZWQgbWF0cml4IHdpdGggcmVhbCBlLXZhbHVlcyAoYnV0IGNvbXBsZXgtdmFsdWVkIGUtdmVjdG9ycyk7CiAgICBub3RlIHRoYXQgYS5jb25qKCkuVCA9IGEsIGkuZS4sIGEgaXMgSGVybWl0aWFuLgoKICAgID4+PiBhID0gbnAuYXJyYXkoW1sxLCAxal0sIFstMWosIDFdXSkKICAgID4+PiB3LCB2ID0gTEEuZWlnKGEpCiAgICA+Pj4gdzsgdgogICAgYXJyYXkoWyAgMi4wMDAwMDAwMGUrMDArMC5qLCAgIDUuOTg2NTE5MTJlLTM2KzAual0pICMgaS5lLiwgezIsIDB9CiAgICBhcnJheShbWyAwLjAwMDAwMDAwKzAuNzA3MTA2NzhqLCAgMC43MDcxMDY3OCswLmogICAgICAgIF0sCiAgICAgICAgICAgWyAwLjcwNzEwNjc4KzAuaiAgICAgICAgLCAgMC4wMDAwMDAwMCswLjcwNzEwNjc4al1dKQoKICAgIEJlIGNhcmVmdWwgYWJvdXQgcm91bmQtb2ZmIGVycm9yIQoKICAgID4+PiBhID0gbnAuYXJyYXkoW1sxICsgMWUtOSwgMF0sIFswLCAxIC0gMWUtOV1dKQogICAgPj4+ICMgVGhlb3IuIGUtdmFsdWVzIGFyZSAxICsvLSAxZS05CiAgICA+Pj4gdywgdiA9IExBLmVpZyhhKQogICAgPj4+IHc7IHYKICAgIGFycmF5KFsgMS4sICAxLl0pCiAgICBhcnJheShbWyAxLiwgIDAuXSwKICAgICAgICAgICBbIDAuLCAgMS5dXSkKCiAgICB6BUQtPkREegVkLT5ERCkCcp4AAAByZQAAAGcAAAAAAAAAAEYpAXKfAAAAKRByawAAAHKKAAAAcpAAAABykQAAAHJ8AAAAcmYAAAByYAAAAHJuAAAAckgAAAByEQAAAHIpAAAAcscAAAByyAAAAHJyAAAAcnQAAAByhgAAACkIcmgAAAByagAAAHJtAAAAcqEAAAByZQAAAHKeAAAAcskAAADaAnZ0clIAAAByUgAAAHJTAAAAchEAAADuAwAAcyAAAAAAdwwBCAEIAQgBDAICAQYBEAEUAhYBBgEGAQoCCAIOAWMCAAAAAAAAAAoAAAAFAAAAQwAAAHOsAAAAfAGgAKEAfQF8AWQBawdyGHQBZAKDAYIBdAJ8AIMBXAJ9AH0CdAN8AIMBAQB0BHwAgwEBAHQFfACDAVwCfQN9BHQGdAeDAX0FfAFkA2sCclh0CGoJfQZuBnQIagp9BnQLfAODAXJqZARuAmQFfQd8BnwAfAd8BWQGjQNcAn0IfQl8CGoMdA18BIMBZAdkCI0CfQh8CWoMfARkB2QIjQJ9CXwIfAJ8CYMBZgJTACkJYWoPAAAKICAgIFJldHVybiB0aGUgZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyBvZiBhIEhlcm1pdGlhbiBvciBzeW1tZXRyaWMgbWF0cml4LgoKICAgIFJldHVybnMgdHdvIG9iamVjdHMsIGEgMS1EIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVpZ2VudmFsdWVzIG9mIGBhYCwgYW5kCiAgICBhIDItRCBzcXVhcmUgYXJyYXkgb3IgbWF0cml4IChkZXBlbmRpbmcgb24gdGhlIGlucHV0IHR5cGUpIG9mIHRoZQogICAgY29ycmVzcG9uZGluZyBlaWdlbnZlY3RvcnMgKGluIGNvbHVtbnMpLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiAoLi4uLCBNLCBNKSBhcnJheQogICAgICAgIEhlcm1pdGlhbi9TeW1tZXRyaWMgbWF0cmljZXMgd2hvc2UgZWlnZW52YWx1ZXMgYW5kCiAgICAgICAgZWlnZW52ZWN0b3JzIGFyZSB0byBiZSBjb21wdXRlZC4KICAgIFVQTE8gOiB7J0wnLCAnVSd9LCBvcHRpb25hbAogICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxjdWxhdGlvbiBpcyBkb25lIHdpdGggdGhlIGxvd2VyIHRyaWFuZ3VsYXIKICAgICAgICBwYXJ0IG9mIGBhYCAoJ0wnLCBkZWZhdWx0KSBvciB0aGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0ICgnVScpLgogICAgICAgIElycmVzcGVjdGl2ZSBvZiB0aGlzIHZhbHVlIG9ubHkgdGhlIHJlYWwgcGFydHMgb2YgdGhlIGRpYWdvbmFsIHdpbGwKICAgICAgICBiZSBjb25zaWRlcmVkIGluIHRoZSBjb21wdXRhdGlvbiB0byBwcmVzZXJ2ZSB0aGUgbm90aW9uIG9mIGEgSGVybWl0aWFuCiAgICAgICAgbWF0cml4LiBJdCB0aGVyZWZvcmUgZm9sbG93cyB0aGF0IHRoZSBpbWFnaW5hcnkgcGFydCBvZiB0aGUgZGlhZ29uYWwKICAgICAgICB3aWxsIGFsd2F5cyBiZSB0cmVhdGVkIGFzIHplcm8uCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgdyA6ICguLi4sIE0pIG5kYXJyYXkKICAgICAgICBUaGUgZWlnZW52YWx1ZXMgaW4gYXNjZW5kaW5nIG9yZGVyLCBlYWNoIHJlcGVhdGVkIGFjY29yZGluZyB0bwogICAgICAgIGl0cyBtdWx0aXBsaWNpdHkuCiAgICB2IDogeyguLi4sIE0sIE0pIG5kYXJyYXksICguLi4sIE0sIE0pIG1hdHJpeH0KICAgICAgICBUaGUgY29sdW1uIGBgdls6LCBpXWBgIGlzIHRoZSBub3JtYWxpemVkIGVpZ2VudmVjdG9yIGNvcnJlc3BvbmRpbmcKICAgICAgICB0byB0aGUgZWlnZW52YWx1ZSBgYHdbaV1gYC4gIFdpbGwgcmV0dXJuIGEgbWF0cml4IG9iamVjdCBpZiBgYWAgaXMKICAgICAgICBhIG1hdHJpeCBvYmplY3QuCgogICAgUmFpc2VzCiAgICAtLS0tLS0KICAgIExpbkFsZ0Vycm9yCiAgICAgICAgSWYgdGhlIGVpZ2VudmFsdWUgY29tcHV0YXRpb24gZG9lcyBub3QgY29udmVyZ2UuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBlaWd2YWxzaCA6IGVpZ2VudmFsdWVzIG9mIHN5bW1ldHJpYyBvciBIZXJtaXRpYW4gYXJyYXlzLgogICAgZWlnIDogZWlnZW52YWx1ZXMgYW5kIHJpZ2h0IGVpZ2VudmVjdG9ycyBmb3Igbm9uLXN5bW1ldHJpYyBhcnJheXMuCiAgICBlaWd2YWxzIDogZWlnZW52YWx1ZXMgb2Ygbm9uLXN5bW1ldHJpYyBhcnJheXMuCgogICAgTm90ZXMKICAgIC0tLS0tCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS44LjAKCiAgICBCcm9hZGNhc3RpbmcgcnVsZXMgYXBwbHksIHNlZSB0aGUgYG51bXB5LmxpbmFsZ2AgZG9jdW1lbnRhdGlvbiBmb3IKICAgIGRldGFpbHMuCgogICAgVGhlIGVpZ2VudmFsdWVzL2VpZ2VudmVjdG9ycyBhcmUgY29tcHV0ZWQgdXNpbmcgTEFQQUNLIHJvdXRpbmVzIF9zeWV2ZCwKICAgIF9oZWV2ZAoKICAgIFRoZSBlaWdlbnZhbHVlcyBvZiByZWFsIHN5bW1ldHJpYyBvciBjb21wbGV4IEhlcm1pdGlhbiBtYXRyaWNlcyBhcmUKICAgIGFsd2F5cyByZWFsLiBbMV1fIFRoZSBhcnJheSBgdmAgb2YgKGNvbHVtbikgZWlnZW52ZWN0b3JzIGlzIHVuaXRhcnkKICAgIGFuZCBgYWAsIGB3YCwgYW5kIGB2YCBzYXRpc2Z5IHRoZSBlcXVhdGlvbnMKICAgIGBgZG90KGEsIHZbOiwgaV0pID0gd1tpXSAqIHZbOiwgaV1gYC4KCiAgICBSZWZlcmVuY2VzCiAgICAtLS0tLS0tLS0tCiAgICAuLiBbMV0gRy4gU3RyYW5nLCAqTGluZWFyIEFsZ2VicmEgYW5kIEl0cyBBcHBsaWNhdGlvbnMqLCAybmQgRWQuLCBPcmxhbmRvLAogICAgICAgICAgIEZMLCBBY2FkZW1pYyBQcmVzcywgSW5jLiwgMTk4MCwgcGcuIDIyMi4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBmcm9tIG51bXB5IGltcG9ydCBsaW5hbGcgYXMgTEEKICAgID4+PiBhID0gbnAuYXJyYXkoW1sxLCAtMmpdLCBbMmosIDVdXSkKICAgID4+PiBhCiAgICBhcnJheShbWyAxLiswLmosICAwLi0yLmpdLAogICAgICAgICAgIFsgMC4rMi5qLCAgNS4rMC5qXV0pCiAgICA+Pj4gdywgdiA9IExBLmVpZ2goYSkKICAgID4+PiB3OyB2CiAgICBhcnJheShbIDAuMTcxNTcyODgsICA1LjgyODQyNzEyXSkKICAgIGFycmF5KFtbLTAuOTIzODc5NTMrMC5qICAgICAgICAsIC0wLjM4MjY4MzQzKzAuaiAgICAgICAgXSwKICAgICAgICAgICBbIDAuMDAwMDAwMDArMC4zODI2ODM0M2osICAwLjAwMDAwMDAwLTAuOTIzODc5NTNqXV0pCgogICAgPj4+IG5wLmRvdChhLCB2WzosIDBdKSAtIHdbMF0gKiB2WzosIDBdICMgdmVyaWZ5IDFzdCBlLXZhbC92ZWMgcGFpcgogICAgYXJyYXkoWzIuNzc1NTU3NTZlLTE3ICsgMC5qLCAwLiArIDEuMzg3Nzc4NzhlLTE2al0pCiAgICA+Pj4gbnAuZG90KGEsIHZbOiwgMV0pIC0gd1sxXSAqIHZbOiwgMV0gIyB2ZXJpZnkgMm5kIGUtdmFsL3ZlYyBwYWlyCiAgICBhcnJheShbIDAuKzAuaiwgIDAuKzAual0pCgogICAgPj4+IEEgPSBucC5tYXRyaXgoYSkgIyB3aGF0IGhhcHBlbnMgaWYgaW5wdXQgaXMgYSBtYXRyaXggb2JqZWN0CiAgICA+Pj4gQQogICAgbWF0cml4KFtbIDEuKzAuaiwgIDAuLTIual0sCiAgICAgICAgICAgIFsgMC4rMi5qLCAgNS4rMC5qXV0pCiAgICA+Pj4gdywgdiA9IExBLmVpZ2goQSkKICAgID4+PiB3OyB2CiAgICBhcnJheShbIDAuMTcxNTcyODgsICA1LjgyODQyNzEyXSkKICAgIG1hdHJpeChbWy0wLjkyMzg3OTUzKzAuaiAgICAgICAgLCAtMC4zODI2ODM0MyswLmogICAgICAgIF0sCiAgICAgICAgICAgIFsgMC4wMDAwMDAwMCswLjM4MjY4MzQzaiwgIDAuMDAwMDAwMDAtMC45MjM4Nzk1M2pdXSkKCiAgICA+Pj4gIyBkZW1vbnN0cmF0ZSB0aGUgdHJlYXRtZW50IG9mIHRoZSBpbWFnaW5hcnkgcGFydCBvZiB0aGUgZGlhZ29uYWwKICAgID4+PiBhID0gbnAuYXJyYXkoW1s1KzJqLCA5LTJqXSwgWzArMmosIDItMWpdXSkKICAgID4+PiBhCiAgICBhcnJheShbWyA1LisyLmosICA5Li0yLmpdLAogICAgICAgICAgIFsgMC4rMi5qLCAgMi4tMS5qXV0pCiAgICA+Pj4gIyB3aXRoIFVQTE89J0wnIHRoaXMgaXMgbnVtZXJpY2FsbHkgZXF1aXZhbGVudCB0byB1c2luZyBMQS5laWcoKSB3aXRoOgogICAgPj4+IGIgPSBucC5hcnJheShbWzUuKzAuaiwgMC4tMi5qXSwgWzAuKzIuaiwgMi4tMC5qXV0pCiAgICA+Pj4gYgogICAgYXJyYXkoW1sgNS4rMC5qLCAgMC4tMi5qXSwKICAgICAgICAgICBbIDAuKzIuaiwgIDIuKzAual1dKQogICAgPj4+IHdhLCB2YSA9IExBLmVpZ2goYSkKICAgID4+PiB3YiwgdmIgPSBMQS5laWcoYikK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dGVfdXZgYCBpcyBUcnVlLgogICAgcyA6ICguLi4sIEspIGFycmF5CiAgICAgICAgVGhlIHNpbmd1bGFyIHZhbHVlcyBmb3IgZXZlcnkgbWF0cml4LCBzb3J0ZWQgaW4gZGVzY2VuZGluZyBvcmRlci4KICAgIHYgOiB7ICguLi4sIE4sIE4pLCAoLi4uLCBLLCBOKSB9IGFycmF5CiAgICAgICAgVW5pdGFyeSBtYXRyaWNlcy4gVGhlIGFjdHVhbCBzaGFwZSBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZgogICAgICAgIGBgZnVsbF9tYXRyaWNlc2BgLiBPbmx5IHJldHVybmVkIHdoZW4gYGBjb21wdXRlX3V2YGAgaXMgVHJ1ZS4KCiAgICBSYWlzZXMKICAgIC0tLS0tLQogICAgTGluQWxnRXJyb3IKICAgICAgICBJZiBTVkQgY29tcHV0YXRpb24gZG9lcyBub3QgY29udmVyZ2UuCgogICAgTm90ZXMKICAgIC0tLS0tCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS44LjAKCiAgICBCcm9hZGNhc3RpbmcgcnVsZXMgYXBwbHksIHNlZSB0aGUgYG51bXB5LmxpbmFsZ2AgZG9jdW1lbnRhdGlvbiBmb3IKICAgIGRldGFpbHMuCgogICAgVGhlIGRlY29tcG9zaXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIExBUEFDSyByb3V0aW5lIF9nZXNkZAoKICAgIFRoZSBTVkQgaXMgY29tbW9ubHkgd3JpdHRlbiBhcyBgYGEgPSBVIFMgVi5IYGAuICBUaGUgYHZgIHJldHVybmVkCiAgICBieSB0aGlzIGZ1bmN0aW9uIGlzIGBgVi5IYGAgYW5kIGBgdSA9IFVgYC4KCiAgICBJZiBgYFVgYCBpcyBhIHVuaXRhcnkgbWF0cml4LCBpdCBtZWFucyB0aGF0IGl0CiAgICBzYXRpc2ZpZXMgYGBVLkggPSBpbnYoVSlgYC4KCiAgICBUaGUgcm93cyBvZiBgdmAgYXJlIHRoZSBlaWdlbnZlY3RvcnMgb2YgYGBhLkggYWBgLiBUaGUgY29sdW1ucwogICAgb2YgYHVgIGFyZSB0aGUgZWlnZW52ZWN0b3JzIG9mIGBgYSBhLkhgYC4gIEZvciBy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ICAgIE5vbmUgICAyLW5vcm0sIGNvbXB1dGVkIGRpcmVjdGx5IHVzaW5nIHRoZSBgYFNWRGBgCiAgICAgICAgJ2ZybycgIEZyb2Jlbml1cyBub3JtCiAgICAgICAgaW5mICAgIG1heChzdW0oYWJzKHgpLCBheGlzPTEpKQogICAgICAgIC1pbmYgICBtaW4oc3VtKGFicyh4KSwgYXhpcz0xKSkKICAgICAgICAxICAgICAgbWF4KHN1bShhYnMoeCksIGF4aXM9MCkpCiAgICAgICAgLTEgICAgIG1pbihzdW0oYWJzKHgpLCBheGlzPTApKQogICAgICAgIDIgICAgICAyLW5vcm0gKGxhcmdlc3Qgc2luZy4gdmFsdWUpCiAgICAgICAgLTIgICAgIHNtYWxsZXN0IHNpbmd1bGFyIHZhbHVlCiAgICAgICAgPT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAgICAgaW5mIG1lYW5zIHRoZSBudW1weS5pbmYgb2JqZWN0LCBhbmQgdGhlIEZyb2Jlbml1cyBub3JtIGlzCiAgICAgICAgdGhlIHJvb3Qtb2Ytc3VtLW9mLXNxdWFyZXMgbm9ybS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBjIDoge2Zsb2F0LCBpbmZ9CiAgICAgICAgVGhlIGNvbmRpdGlvbiBudW1iZXIgb2YgdGhlIG1hdHJpeC4gTWF5IGJlIGluZmluaXRlLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkubGluYWxnLm5vcm0KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFRoZSBjb25kaXRpb24gbnVtYmVyIG9mIGB4YCBpcyBkZWZpbmVkIGFzIHRoZSBub3JtIG9mIGB4YCB0aW1lcyB0aGUKICAgIG5vcm0gb2YgdGhlIGludmVyc2Ugb2YgYHhgIFsxXV87IHRoZSBub3JtIGNhbiBiZSB0aGUgdXN1YWwgTDItbm9ybQogICAgKHJvb3Qtb2Ytc3VtLW9mLXNxdWFyZXMpIG9yIG9uZSBvZiBhIG51bWJlciBvZiBvdGhlciBtYXRyaXggbm9ybXMuCgogICAgUmVmZXJlbmNlcwogICAgLS0tLS0tLS0t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IGVwc2BgIGFzIGluZGljYXRpbmcgcmFuayBkZWZpY2llbmN5ICh3aXRoCiAgICB0aGUgc3ltYm9scyBkZWZpbmVkIGFib3ZlKS4gVGhpcyBpcyB0aGUgYWxnb3JpdGhtIE1BVExBQiB1c2VzIFsxXS4gIEl0IGFsc28KICAgIGFwcGVhcnMgaW4gKk51bWVyaWNhbCByZWNpcGVzKiBpbiB0aGUgZGlzY3Vzc2lvbiBvZiBTVkQgc29sdXRpb25zIGZvciBsaW5lYXIKICAgIGxlYXN0IHNxdWFyZXMgWzJdLgoKICAgIFRoaXMgZGVmYXVsdCB0aHJlc2hvbGQgaXMgZGVzaWduZWQgdG8gZGV0ZWN0IHJhbmsgZGVmaWNpZW5jeSBhY2NvdW50aW5nIGZvcgogICAgdGhlIG51bWVyaWNhbCBlcnJvcnMgb2YgdGhlIFNWRCBjb21wdXRhdGlvbi4gIEltYWdpbmUgdGhhdCB0aGVyZSBpcyBhIGNvbHVtbgogICAgaW4gYE1gIHRoYXQgaXMgYW4gZXhhY3QgKGluIGZsb2F0aW5nIHBvaW50KSBsaW5lYXIgY29tYmluYXRpb24gb2Ygb3RoZXIKICAgIGNvbHVtbnMgaW4gYE1gLiBDb21wdXRpbmcgdGhlIFNWRCBvbiBgTWAgd2lsbCBub3QgcHJvZHVjZSBhIHNpbmd1bGFyIHZhbHVlCiAgICBleGFjdGx5IGVxdWFsIHRvIDAgaW4gZ2VuZXJhbDogYW55IGRpZmZlcmVuY2Ugb2YgdGhlIHNtYWxsZXN0IFNWRCB2YWx1ZSBmcm9tCiAgICAwIHdpbGwgYmUgY2F1c2VkIGJ5IG51bWVyaWNhbCBpbXByZWNpc2lvbiBpbiB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIFNWRC4KICAgIE91ciB0aHJlc2hvbGQgZm9yIHNtYWxsIFNWRCB2YWx1ZXMgdGFrZXMgdGhpcyBudW1lcmljYWwgaW1wcmVjaXNpb24gaW50bwogICAgYWNjb3VudCwgYW5kIHRoZSBkZWZhdWx0IHRocmVzaG9sZCB3aWxsIGRldGVjdCBzdWNoIG51bWVyaWNhbCByYW5rCiAgICBkZWZpY2llbmN5LiAgVGhlIHRocmVzaG9sZCBtYXkgZGVjbGFyZSBhIG1hdHJpeCBgTWAgcmFuayBkZWZpY2llbnQgZXZlbiBpZgogICAgdGhlIGxpbmVhciBjb21iaW5hdGlvbiBvZiBzb21lIGNvbHVtbnMgb2YgYE1gIGlzIG5vdCBleGFjdGx5IGVxdWFsIHRvCiAgICBhbm90aGVyIGNvbHVtbiBvZiBgTWAgYnV0IG9ubHkgbnVtZXJpY2FsbHkgdmVyeSBjbG9zZSB0byBhbm90aGVyIGNvbHVtbiBvZgogICAgYE1gLgoKICAgIFdlIGNob3NlIG91ciBkZWZhdWx0IHRocmVzaG9sZCBiZWNhdXNlIGl0IGlzIGluIHdpZGUgdXNlLiAgT3RoZXIgdGhyZXNob2xkcwogICAgYXJlIHBvc3NpYmxlLiAgRm9yIGV4YW1wbGUsIGVsc2V3aGVyZSBpbiB0aGUgMjAwNyBlZGl0aW9uIG9mICpOdW1lcmljYWwKICAgIHJlY2lwZXMqIHRoZXJlIGlzIGFuIGFsdGVybmF0aXZlIHRocmVzaG9sZCBvZiBgYFMubWF4KCkgKgogICAgbnAuZmluZm8oTS5kdHlwZSkuZXBzIC8gMi4gKiBucC5zcXJ0KG0gKyBuICsgMS4pYGAuIFRoZSBhdXRob3JzIGRlc2NyaWJlCiAgICB0aGlzIHRocmVzaG9sZCBhcyBiZWluZyBiYXNlZCBvbiAiZXhwZWN0ZWQgcm91bmRvZmYgZXJyb3IiIChwIDcxKS4KCiAgICBUaGUgdGhyZXNob2xkcyBhYm92ZSBkZWFsIHdpdGggZmxvYXRpbmcgcG9pbnQgcm91bmRvZmYgZXJyb3IgaW4gdGhlCiAgICBjYWxjdWxhdGlvbiBvZiB0aGUgU1ZELiAgSG93ZXZlciwgeW91IG1heSBoYXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCiAgICBzb3VyY2VzIG9mIGVycm9yIGluIGBNYCB0aGF0IHdvdWxkIG1ha2UgeW91IGNvbnNpZGVyIG90aGVyIHRvbGVyYW5jZSB2YWx1ZXMKICAgIHRvIGRldGVjdCAqZWZmZWN0aXZlKiByYW5rIGRlZmljaWVuY3kuICBUaGUgbW9zdCB1c2VmdWwgbWVhc3VyZSBvZiB0aGUKICAgIHRvbGVyYW5jZSBkZXBlbmRzIG9uIHRoZSBvcGVyYXRpb25zIHlvdSBpbnRlbmQgdG8gdXNlIG9uIHlvdXIgbWF0cml4LiAgRm9yCiAgICBleGFtcGxlLCBpZiB5b3VyIGRhdGEgY29tZSBmcm9tIHVuY2VydGFpbiBtZWFzdXJlbWVudHMgd2l0aCB1bmNlcnRhaW50aWVzCiAgICBncmVhdGVyIHRoYW4gZmxvYXRpbmcgcG9pbnQgZXBzaWxvbiwgY2hvb3NpbmcgYSB0b2xlcmFuY2UgbmVhciB0aGF0CiAgICB1bmNlcnRhaW50eSBtYXkgYmUgcHJlZmVyYWJsZS4gIFRoZSB0b2xlcmFuY2UgbWF5IGJlIGFic29sdXRlIGlmIHRoZQogICAgdW5jZXJ0YWludGllcyBhcmUgYWJzb2x1dGUgcmF0aGVyIHRoYW4gcmVsYXRpdmUuCgogICAgUmVmZXJlbmNlcwogICAgLS0tLS0tLS0tLQogICAgLi4gWzFdIE1BVExBQiByZWZlcmVuY2UgZG9jdW1lbnRpb24sICJSYW5rIgogICAgICAgICAgIGh0dHA6Ly93d3cubWF0aHdvcmtzLmNvbS9oZWxwL3RlY2hkb2MvcmVmL3JhbmsuaHRtbAogICAgLi4gWzJdIFcuIEguIFByZXNzLCBTLiBBLiBUZXVrb2xza3ksIFcuIFQuIFZldHRlcmxpbmcgYW5kIEIuIFAuIEZsYW5uZXJ5LAogICAgICAgICAgICJOdW1lcmljYWwgUmVjaXBlcyAoM3JkIGVkaXRpb24pIiwgQ2FtYnJpZGdlIFVuaXZlcnNpdHkgUHJlc3MsIDIwMDcsCiAgICAgICAgICAgcGFnZSA3OTUuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gZnJvbSBudW1weS5saW5hbGcgaW1wb3J0IG1hdHJpeF9yYW5rCiAgICA+Pj4gbWF0cml4X3JhbmsobnAuZXllKDQpKSAjIEZ1bGwgcmFuayBtYXRyaXgKICAgIDQKICAgID4+PiBJPW5wLmV5ZSg0KTsgSVstMSwtMV0gPSAwLiAjIHJhbmsgZGVmaWNpZW50IG1hdHJpeAogICAgPj4+IG1hdHJpeF9yYW5rKEkpCiAgICAzCiAgICA+Pj4gbWF0cml4X3JhbmsobnAub25lcygoNCwpKSkgIyAxIGRpbWVuc2lvbiAtIHJhbmsgMSB1bmxlc3MgYWxsIDAKICAgIDEKICAgID4+PiBtYXRyaXhfcmFuayhucC56ZXJvcygoNCwpKSkKICAgIDAKICAgIHJiAAAAcgEAAABGKQFy0AAAAE5ylAAAAFQpAnLTAAAA2ghrZWVwZGltc3KPAAAAKQFy0wAAACkLchsAAAByiAAAAHK6AAAAcikAAAByEAAAAHKLAAAAcowAAAByNAAAAHJ2AAAA2gNlcHNyMQAAACkD2gFNWgN0b2zaAVNyUgAAAHJSAAAAclMAAAByFwAAANQFAABzDgAAAABMCAEKARIBDAEIASwB5xZW556vA9I8YwIAAAAAAAAACwAAAAYAAABDAAAAc+wAAAB0AHwAgwFcAn0AfQJ0AXwAgwFySHQCfABqA2QBZAKFAhkAfABqA2QDGQB8AGoDZAIZAGYCFwB8AGoEZASNAn0DfAJ8A4MBUwB8AKAFoQB9AHQGfABkBYMCXAN9BH0FfQZ8BGoDZAUZAH0HfAZqA2QGGQB9CHwBdAegCHwFoQEUAH0JeDx0CXQKfAh8B4MCgwFEAF0qfQp8BXwKGQB8CWsEcrRkB3wFfAoZABsAfAV8CjwAcZJkCHwFfAo8AHGSVwB0C3QMfAaDAXQNfAVkAWQBhQJ0DmYCGQB0DHwEgwGDAoMCfQN8AnwDgwFTACkJYY0HAAAKICAgIENvbXB1dGUgdGhlIChNb29yZS1QZW5yb3NlKSBwc2V1ZG8taW52ZXJzZSBvZiBhIG1hdHJpeC4KCiAgICBDYWxjdWxhdGUgdGhlIGdlbmVyYWxpemVkIGludmVyc2Ugb2YgYSBtYXRyaXggdXNpbmcgaXRzCiAgICBzaW5ndWxhci12YWx1ZSBkZWNvbXBvc2l0aW9uIChTVkQpIGFuZCBpbmNsdWRpbmcgYWxsCiAgICAqbGFyZ2UqIHNpbmd1bGFyIHZhbHVlcy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogKE0sIE4pIGFycmF5X2xpa2UKICAgICAgTWF0cml4IHRvIGJlIHBzZXVkby1pbnZlcnRlZC4KICAgIHJjb25kIDogZmxvYXQKICAgICAgQ3V0b2ZmIGZvciBzbWFsbCBzaW5ndWxhciB2YWx1ZXMuCiAgICAgIFNpbmd1bGFyIHZhbHVlcyBzbWFsbGVyIChpbiBtb2R1bHVzKSB0aGFuCiAgICAgIGByY29uZGAgKiBsYXJnZXN0X3Npbmd1bGFyX3ZhbHVlIChhZ2FpbiwgaW4gbW9kdWx1cykKICAgICAgYXJlIHNldCB0byB6ZXJvLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIEIgOiAoTiwgTSkgbmRhcnJheQogICAgICBUaGUgcHNldWRvLWludmVyc2Ugb2YgYGFgLiBJZiBgYWAgaXMgYSBgbWF0cml4YCBpbnN0YW5jZSwgdGhlbiBzbwogICAgICBpcyBgQmAuCgogICAgUmFpc2VzCiAgICAtLS0tLS0KICAgIExpbkFsZ0Vycm9yCiAgICAgIElmIHRoZSBTVkQgY29tcHV0YXRpb24gZG9lcyBub3QgY29udmVyZ2UuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBUaGUgcHNldWRvLWludmVyc2Ugb2YgYSBtYXRyaXggQSwgZGVub3RlZCA6bWF0aDpgQV4rYCwgaXMKICAgIGRlZmluZWQgYXM6ICJ0aGUgbWF0cml4IHRoYXQgJ3NvbHZlcycgW3RoZSBsZWFzdC1zcXVhcmVzIHByb2JsZW1dCiAgICA6bWF0aDpgQXggPSBiYCwiIGkuZS4sIGlmIDptYXRoOmBcYmFye3h9YCBpcyBzYWlkIHNvbHV0aW9uLCB0aGVuCiAgICA6bWF0aDpgQV4rYCBpcyB0aGF0IG1hdHJpeCBzdWNoIHRoYXQgOm1hdGg6YFxiYXJ7eH0gPSBBXitiYC4KCiAgICBJdCBjYW4gYmUgc2hvd24gdGhhdCBpZiA6bWF0aDpgUV8xIFxTaWdtYSBRXzJeVCA9IEFgIGlzIHRoZSBzaW5ndWxhcgogICAgdmFsdWUgZGVjb21wb3NpdGlvbiBvZiBBLCB0aGVuCiAgICA6bWF0aDpgQV4rID0gUV8yIFxTaWdtYV4rIFFfMV5UYCwgd2hlcmUgOm1hdGg6YFFfezEsMn1gIGFyZQogICAgb3J0aG9nb25hbCBtYXRyaWNlcywgOm1hdGg6YFxTaWdtYWAgaXMgYSBkaWFnb25hbCBtYXRyaXggY29uc2lzdGluZwogICAgb2YgQSdzIHNvLWNhbGxlZCBzaW5ndWxhciB2YWx1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ZSB1bml0IGNpcmNsZSksIG9yIGVsc2UgMC4KICAgIGxvZ2RldCA6ICguLi4pIGFycmF5X2xpa2UKICAgICAgICBUaGUgbmF0dXJhbCBsb2cgb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBkZXRlcm1pbmFudC4KCiAgICBJZiB0aGUgZGV0ZXJtaW5hbnQgaXMgemVybywgdGhlbiBgc2lnbmAgd2lsbCBiZSAwIGFuZCBgbG9nZGV0YCB3aWxsIGJlCiAgICAtSW5mLiBJbiBhbGwgY2FzZXMsIHRoZSBkZXRlcm1pbmFudCBpcyBlcXVhbCB0byBgYHNpZ24gKiBucC5leHAobG9nZGV0KWBgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgZGV0CgogICAgTm90ZXMKICAgIC0tLS0tCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS44LjAKCiAgICBCcm9hZGNhc3RpbmcgcnVsZXMgYXBwbHksIHNlZSB0aGUgYG51bXB5LmxpbmFsZ2AgZG9jdW1lbnRhdGlvbiBmb3IKICAgIGRldGFpbHMuCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS42LjAKCiAgICBUaGUgZGV0ZXJtaW5hbnQgaXMgY29tcHV0ZWQgdmlhIExVIGZhY3Rvcml6YXRpb24gdXNpbmcgdGhlIExBUEFDSwogICAgcm91dGluZSB6L2RnZXRyZi4KCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICBUaGUgZGV0ZXJtaW5hbnQgb2YgYSAyLUQgYXJyYXkgYGBbW2EsIGJdLCBbYywgZF1dYGAgaXMgYGBhZCAtIGJjYGA6CgogICAgPj4+IGEgPSBucC5hcnJheShbWzEsIDJdLCBbMywgNF1dKQogICAgPj4+IChzaWduLCBsb2dkZXQpID0gbnAubGluYWxnLnNsb2dkZXQoYSkKICAgID4+PiAoc2lnbiwgbG9nZGV0KQogICAgKC0xLCAwLjY5MzE0NzE4MDU1OTk0NTI5KQogICAgPj4+IHNpZ24gKiBucC5leHAobG9nZGV0KQogICAgLTIuMAoKICAgIENvbXB1dGluZyBsb2ctZGV0ZXJtaW5hbnRzIGZvciBhIHN0YWNrIG9mIG1hdHJpY2VzOgoKICAgID4+PiBhID0gbnAuYXJyYXkoWyBbWzEsIDJdLCBbMywgNF1dLCBbWzEsIDJdLCBbMiwgMV1dLCBbWzEsIDNdLCBbMywgMV1dIF0pCiAgICA+Pj4gYS5zaGFwZQogICAgKDMsIDIsIDIpCiAgICA+Pj4gc2lnbiwgbG9nZGV0ID0gbnAubGluYWxnLnNsb2dkZXQoYSkKICAgID4+PiAoc2lnbiwgbG9nZGV0KQogICAgKGFycmF5KFstMS4sIC0xLiwgLTEuXSksIGFycmF5KFsgMC42OTMxNDcxOCwgIDEuMDk4NjEyMjksICAyLjA3OTQ0MTU0XSkpCiAgICA+Pj4gc2lnbiAqIG5wLmV4cChsb2dkZXQpCiAgICBhcnJheShbLTIuLCAtMy4sIC04Ll0pCgogICAgVGhpcyByb3V0aW5lIHN1Y2NlZWRzIHdoZXJlIG9yZGluYXJ5IGBkZXRgIGRvZXMgbm90OgoKICAgID4+PiBucC5saW5hbGcuZGV0KG5wLmV5ZSg1MDApICogMC4xKQogICAgMC4wCiAgICA+Pj4gbnAubGluYWxnLnNsb2dkZXQobnAuZXllKDUwMCkgKiAwLjEpCiAgICAoMSwgLTExNTEuMjkyNTQ2NDk3MDIyOCkKCiAgICB6BUQtPkRkegVkLT5kZCkBcp4AAABGKQFynwAAACkKchsAAAByigAAAHKQAAAAcnwAAABycgAAAHJuAAAAckgAAAByDgAAAHJBAAAAcoYAAAApB3JoAAAAcm0AAAByoQAAANoGcmVhbF90cp4AAADaBHNpZ25aBmxvZ2RldHJSAAAAclIAAAByUwAAAHIOAAAAfQYAAHMcAAAAAEoIAQgBCAEMAQgBEAESAQgBDAIOAQgBDAIOAWMBAAAAAAAAAAUAAAAEAAAAQwAAAHNoAAAAdAB8AIMBfQB0AXwAgwEBAHQCfACDAQEAdAN8AIMBXAJ9AX0CdAR8AYMBcjBkAW4CZAJ9A3QFagZ8AHwDZAONAn0EdAd8BIMBclZ8BKAIfAKhAX0Ebg58BGoIfAJkBGQFjQJ9BHwEUwApBmHvAwAACiAgICBDb21wdXRlIHRoZSBkZXRlcm1pbmFudCBvZiBhbiBhcnJheS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogKC4uLiwgTSwgTSkgYXJyYXlfbGlrZQogICAgICAgIElucHV0IGFycmF5IHRvIGNvbXB1dGUgZGV0ZXJtaW5hbnRzIGZvci4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBkZXQgOiAoLi4uKSBhcnJheV9saWtlCiAgICAgICAgRGV0ZXJtaW5hbnQgb2YgYGFgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgc2xvZ2RldCA6IEFub3RoZXIgd2F5IHRvIHJlcHJlc2VudGluZyB0aGUgZGV0ZXJtaW5hbnQsIG1vcmUgc3VpdGFibGUKICAgICAgZm9yIGxhcmdlIG1hdHJpY2VzIHdoZXJlIHVuZGVyZmxvdy9vdmVyZmxvdyBtYXkgb2NjdXIuCgogICAgTm90ZXMKICAgIC0tLS0tCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS44LjAKCiAgICBCcm9hZGNhc3RpbmcgcnVsZXMgYXBwbHksIHNlZSB0aGUgYG51bXB5LmxpbmFsZ2AgZG9jdW1lbnRhdGlvbiBmb3IKICAgIGRldGFpbHMuCgogICAgVGhlIGRldGVybWluYW50IGlzIGNvbXB1dGVkIHZpYSBMVSBmYWN0b3JpemF0aW9uIHVzaW5nIHRoZSBMQVBBQ0sKICAgIHJvdXRpbmUgei9kZ2V0cmYuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICBUaGUgZGV0ZXJtaW5hbnQgb2YgYSAyLUQgYXJyYXkgW1thLCBiXSwgW2MsIGRdXSBpcyBhZCAtIGJjOgoKICAgID4+PiBhID0gbnAuYXJyYXkoW1sxLCAyXSwgWzMsIDRdXSkKICAgID4+PiBucC5saW5hbGcuZGV0KGEpCiAgICAtMi4wCgogICAgQ29tcHV0aW5nIGRldGVybWluYW50cyBmb3IgYSBzdGFjayBvZiBtYXRyaWNlczoKCiAgICA+Pj4gYSA9IG5wLmFycmF5KFsgW1sxLCAyXSwgWzMsIDRdXSwgW1sxLCAyXSwgWzIsIDFdXSwgW1sxLCAzXSwgWzMsIDFdXSBdKQogICAgPj4+IGEuc2hhcGUKICAgICgzLCAyLCAyKQogICAgPj4+IG5wLmxpbmFsZy5kZXQoYSkKICAgIGFycmF5KFstMi4sIC0zLiwgLTguXSkKCiAgICB6BEQtPkR6BGQtPmQpAXKeAAAARikBcp8AAAApCXIbAAAAcooAAABykAAAAHJ8AAAAcm4AAABySAAAAHIPAAAAckEAAAByhgAAACkFcmgAAABybQAAAHKhAAAAcp4AAAByowAAAHJSAAAAclIAAAByUwAAAHIPAAAA2AYAAHMUAAAAAC8IAQgBCAEMARABDgEIAQwCDgFylAAAAGMDAAAAAAAAAB4AAAAQAAAAQwAAAHNIBAAAZAFkAmwAfQN0AXwAgwFcAn0AfQR0AXwBgwFcAn0BfQV8AWoCZANrAn0GfAZyPnwBZAJkAoUCdANmAhkAfQF0BHwAfAGDAgEAdAV8AHwBgwIBAHwAagZkARkAfQd8AGoGZAMZAH0IfAFqBmQDGQB9CXQHfAh8B4MCfQp8B3wBagZkARkAawNykHQIZASDAYIBdAl8AHwBgwJcAn0LfQx0CnwMgwF9DXQLfAuDAX0OdAx8CnwJZgJ8C4MCfQ98AaANoQB8D2QCfAFqBmQBGQCFAmQCfAmFAmYCPAB0DnwLfAB8D4MDXAJ9AH0PdA98AHwPgwJcAn0AfQ90DHQQfAd8CIMCZgF8DoMCfRB0B2QBdBF8A6ASdBN0EHwHfAiDAoMBZAUbAKEBgwFkAxcAgwJ9EXQMZAZ0EHwHfAiDAhQAfBEUAGQHdBB8B3wIgwIUABcAZgF0FIMCfRJ0FXwLgwGQAnJOdBZqF30TZAN9FHQMfBRmAXwOgwJ9FXQMfBRmAXwLgwJ9FnwTfAd8CHwJfAB8B3wPfAp8EHwCZAF8FmQIfBV8EmQBgw99F3QRdBh8FmQBGQCDAYMBfRR0DHwUZgF8DoMCfRV0DHwHfAhmAnwOgwJ9GHQMfAp8CWYCfA6DAn0ZdBagGXwHfAh8CXwYfAd8GXwKfBB8AmQBfBVkCHwSZAGhDn0XdBF8FWQBGQCDAX0adAx8FGYBfAuDAn0WdAx8GmYBfA6DAn0VfBN8B3wIfAl8AHwHfA98CnwQfAJkAXwWfBR8FXwSZAGDD30XbnJ0FmoZfRNkA30UdAx8FGYBfAuDAn0WfBN8B3wIfAl8AHwHfA98CnwQfAJkAXwWZAh8EmQBgw59F3QRfBZkARkAgwF9FHQMfBRmAXwLgwJ9FnwTfAd8CHwJfAB8B3wPfAp8EHwCZAF8FnwUfBJkAYMOfRd8F2QJGQBkAWsEkAJy1nQIZAqDAYIBdBpnAHwNgwJ9G3wGkANybnQadBt8D4MBZAJ8CIUCGQB8DGQLZAyNA30cfBdkDRkAfAhrApAEchR8B3wIawSQBHIUdBV8C4MBkANySnQadBx0GHQbfA+DAXwIZAKFAhkAgwFkDhMAgwFnAXwNZA+NAn0bbiJ0GnQcdBt8D4MBfAhkAoUCGQBkDhMAgwFnAXwNZA+NAn0bbqZ0GnQdfA+DAWQCfAiFAmQCZAKFAmYCGQB8DGQLZAyNA30cfBdkDRkAfAhrApAEchR8B3wIawSQBHIUdBV8C4MBkANy5nQcdBh0HXwPgwF8CGQChQJkAmQChQJmAhkAgwFkDhMAZAFkEI0Cah58DWQRZBKNAn0bbi50HHQdfA+DAXwIZAKFAmQCZAKFAmYCGQBkDhMAZAFkEI0Cah58DWQRZBKNAn0bfBBkAnQQfAh8B4MChQIZAGoefA1kC2QSjQJ9HXwFfByDAXwFfBuDAXwXZA0ZAHwdZgRTACkTYbIKAAAKICAgIFJldHVybiB0aGUgbGVhc3Qtc3F1YXJlcyBzb2x1dGlvbiB0byBhIGxpbmVhciBtYXRyaXggZXF1YXRpb24uCgogICAgU29sdmVzIHRoZSBlcXVhdGlvbiBgYSB4ID0gYmAgYnkgY29tcHV0aW5nIGEgdmVjdG9yIGB4YCB0aGF0CiAgICBtaW5pbWl6ZXMgdGhlIEV1Y2xpZGVhbiAyLW5vcm0gYHx8IGIgLSBhIHggfHxeMmAuICBUaGUgZXF1YXRpb24gbWF5CiAgICBiZSB1bmRlci0sIHdlbGwtLCBvciBvdmVyLSBkZXRlcm1pbmVkIChpLmUuLCB0aGUgbnVtYmVyIG9mCiAgICBsaW5lYXJseSBpbmRlcGVuZGVudCByb3dzIG9mIGBhYCBjYW4gYmUgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IKICAgIGdyZWF0ZXIgdGhhbiBpdHMgbnVtYmVyIG9mIGxpbmVhcmx5IGluZGVwZW5kZW50IGNvbHVtbnMpLiAgSWYgYGFgCiAgICBpcyBzcXVhcmUgYW5kIG9mIGZ1bGwgcmFuaywgdGhlbiBgeGAgKGJ1dCBmb3Igcm91bmQtb2ZmIGVycm9yKSBpcwogICAgdGhlICJleGFjdCIgc29sdXRpb24gb2YgdGhlIGVxdWF0aW9uLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiAoTSwgTikgYXJyYXlfbGlrZQogICAgICAgICJDb2VmZmljaWVudCIgbWF0cml4LgogICAgYiA6IHsoTSwpLCAoTSwgSyl9IGFycmF5X2xpa2UKICAgICAgICBPcmRpbmF0ZSBvciAiZGVwZW5kZW50IHZhcmlhYmxlIiB2YWx1ZXMuIElmIGBiYCBpcyB0d28tZGltZW5zaW9uYWwsCiAgICAgICAgdGhlIGxlYXN0LXNxdWFyZXMgc29sdXRpb24gaXMgY2FsY3VsYXRlZCBmb3IgZWFjaCBvZiB0aGUgYEtgIGNvbHVtbnMKICAgICAgICBvZiBgYmAuCiAgICByY29uZCA6IGZsb2F0LCBvcHRpb25hbAogICAgICAgIEN1dC1vZmYgcmF0aW8gZm9yIHNtYWxsIHNpbmd1bGFyIHZhbHVlcyBvZiBgYWAuCiAgICAgICAgRm9yIHRoZSBwdXJwb3NlcyBvZiByYW5rIGRldGVybWluYXRpb24sIHNpbmd1bGFyIHZhbHVlcyBhcmUgdHJlYXRlZAogICAgICAgIGFzIHplcm8gaWYgdGhleSBhcmUgc21hbGxlciB0aGFuIGByY29uZGAgdGltZXMgdGhlIGxhcmdlc3Qgc2luZ3VsYXIKICAgICAgICB2YWx1ZSBvZiBgYWAuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgeCA6IHsoTiwpLCAoTiwgSyl9IG5kYXJyYXkKICAgICAgICBMZWFzdC1zcXVhcmVzIHNvbHV0aW9uLiBJZiBgYmAgaXMgdHdvLWRpbWVuc2lvbmFsLAogICAgICAgIHRoZSBzb2x1dGlvbnMgYXJlIGluIHRoZSBgS2AgY29sdW1ucyBvZiBgeGAuCiAgICByZXNpZHVhbHMgOiB7KCksICgxLCksIChLLCl9IG5kYXJyYXkKICAgICAgICBTdW1zIG9mIHJlc2lkdWFsczsgc3F1YXJlZCBFdWNsaWRlYW4gMi1ub3JtIGZvciBlYWNoIGNvbHVtbiBpbgogICAgICAgIGBgYiAtIGEqeGBgLgogICAgICAgIElmIHRoZSByYW5rIG9mIGBhYCBpcyA8IE4gb3IgTSA8PSBOLCB0aGlzIGlzIGFuIGVtcHR5IGFycmF5LgogICAgICAgIElmIGBiYCBpcyAxLWRpbWVuc2lvbmFsLCB0aGlzIGlzIGEgKDEsKSBzaGFwZSBhcnJheS4KICAgICAgICBPdGhlcndpc2UgdGhlIHNoYXBlIGlzIChLLCkuCiAgICByYW5rIDogaW50CiAgICAgICAgUmFuayBvZiBtYXRyaXggYGFgLgogICAgcyA6IChtaW4oTSwgTiksKSBuZGFycmF5CiAgICAgICAgU2luZ3VsYXIgdmFsdWVzIG9mIGBhYC4KCiAgICBSYWlzZXMKICAgIC0tLS0tLQogICAgTGluQWxnRXJyb3IKICAgICAgICBJZiBjb21wdXRhdGlvbiBkb2VzIG5vdCBjb252ZXJnZS4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIElmIGBiYCBpcyBhIG1hdHJpeCwgdGhlbiBhbGwgYXJyYXkgcmVzdWx0cyBhcmUgcmV0dXJuZWQgYXMgbWF0cmljZXMuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICBGaXQgYSBsaW5lLCBgYHkgPSBteCArIGNgYCwgdGhyb3VnaCBzb21lIG5vaXN5IGRhdGEtcG9pbnRzOgoKICAgID4+PiB4ID0gbnAuYXJyYXkoWzAsIDEsIDIsIDNdKQogICAgPj4+IHkgPSBucC5hcnJheShbLTEsIDAuMiwgMC45LCAyLjFdKQoKICAgIEJ5IGV4YW1pbmluZyB0aGUgY29lZmZpY2llbnRzLCB3ZSBzZWUgdGhhdCB0aGUgbGluZSBzaG91bGQgaGF2ZSBhCiAgICBncmFkaWVudCBvZiByb3VnaGx5IDEgYW5kIGN1dCB0aGUgeS1heGlzIGF0LCBtb3JlIG9yIGxlc3MsIC0xLgoKICAgIFdlIGNhbiByZXdyaXRlIHRoZSBsaW5lIGVxdWF0aW9uIGFzIGBgeSA9IEFwYGAsIHdoZXJlIGBgQSA9IFtbeCAxXV1gYAogICAgYW5kIGBgcCA9IFtbbV0sIFtjXV1gYC4gIE5vdyB1c2UgYGxzdHNxYCB0byBzb2x2ZSBmb3IgYHBgOgoKICAgID4+PiBBID0gbnAudnN0YWNrKFt4LCBucC5vbmVzKGxlbih4KSldKS5UCiAgICA+Pj4gQQogICAgYXJyYXkoW1sgMC4sICAxLl0sCiAgICAgICAgICAgWyAxLiwgIDEuXSwKICAgICAgICAgICBbIDIuLCAgMS5dLAogICAgICAgICAgIFsgMy4sICAxLl1dKQoKICAgID4+PiBtLCBjID0gbnAubGluYWxnLmxzdHNxKEEsIHkpWzBdCiAgICA+Pj4gcHJpbnQobSwgYykKICAgIDEuMCAtMC45NQoKICAgIFBsb3QgdGhlIGRhdGEgYWxvbmcgd2l0aCB0aGUgZml0dGVkIGxpbmU6CgogICAgPj4+IGltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKICAgID4+PiBwbHQucGxvdCh4LCB5LCAnbycsIGxhYmVsPSdPcmlnaW5hbCBkYXRhJywgbWFya2Vyc2l6ZT0xMCkKICAgID4+PiBwbHQucGxvdCh4LCBtKnggKyBjLCAncicsIGxhYmVsPSdGaXR0ZWQgbGluZScpCiAgICA+Pj4gcGx0LmxlZ2VuZCgpCiAgICA+Pj4gcGx0LnNob3coKQoKICAgIHIBAAAATnJYAAAAehdJbmNvbXBhdGlibGUgZGltZW5zaW9uc2cAAAAAAAAAQOkDAAAA6QsAAABylAAAAHKzAAAAeixTVkQgZGlkIG5vdCBjb252ZXJnZSBpbiBMaW5lYXIgTGVhc3QgU3F1YXJlc1QpAnJ2AAAAcp8AAABaBHJhbmtyYgAAACkBcnYAAAApAXLTAAAARikBcp8AAAApH9oEbWF0aHJrAAAAcogAAAByJwAAAHKJAAAAcpMAAAByjAAAAHKLAAAAchgAAAByfAAAAHJyAAAAcnUAAAByHAAAAHKfAAAAcocAAAByhAAAAHKNAAAAcroAAADaA2xvZ9oFZmxvYXTaC2ZvcnRyYW5faW50cm4AAAByRwAAAFoGemdlbHNkcjwAAABaBmRnZWxzZHIaAAAAcigAAAByMQAAAHIfAAAAcoYAAAApHnJoAAAAcpkAAABy3QAAAHLkAAAAcqAAAAByagAAAFoFaXNfMWRyvgAAAHK/AAAAWgVuX3Joc1oDbGRicm0AAAByoQAAAFoNcmVzdWx0X3JlYWxfdHLgAAAAWgVic3RhcnLSAAAAWgRubHZsWgVpd29ya3LBAAAAcsIAAABaBXJ3b3JrcsMAAAByxAAAAFoGYV9yZWFsWgpic3Rhcl9yZWFsWgZscndvcmtaBnJlc2lkc3LUAAAA2gJzdHJSAAAAclIAAAByUwAAAHITAAAAFQcAAHOQAAAAAFQIAQwBDAEKAQQBEAEKAQoBCgEKAQoBCgEOAQgBDgEIAQgBDgEeARABDgESCSYBKAEKAQYBBAEMAQwBFAEQARABDAEOAQ4BDgEIAQ4BDAEMAQwBFAESAgYBBAEMARQBDgEMAQwBFAEOAQ4BCAEKAQYBGgEYAQoBHgEKAhoBCgIiARgBCgEoAQwCJAEKAhwBYwQAAAAAAAAABgAAAAUAAABDAAAAcz4AAAB8AXwCawRyEHwBZAE4AH0BdAB0AHwAfAJ8AGoBgwN8AWQCgwN9BHwDdAJ8BGQDZASNAmQCZAWNAn0FfAVTACkGYdoCAABDb21wdXRlIGEgZnVuY3Rpb24gb2YgdGhlIHNpbmd1bGFyIHZhbHVlcyBvZiB0aGUgMi1EIG1hdHJpY2VzIGluIGB4YC4KCiAgICBUaGlzIGlzIGEgcHJpdmF0ZSB1dGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgbnVtcHkubGluYWxnLm5vcm0oKS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB4IDogbmRhcnJheQogICAgcm93X2F4aXMsIGNvbF9heGlzIDogaW50CiAgICAgICAgVGhlIGF4ZXMgb2YgYHhgIHRoYXQgaG9sZCB0aGUgMi1EIG1hdHJpY2VzLgogICAgb3AgOiBjYWxsYWJsZQogICAgICAgIFRoaXMgc2hvdWxkIGJlIGVpdGhlciBudW1weS5hbWluIG9yIG51bXB5LmFtYXggb3IgbnVtcHkuc3VtLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHJlc3VsdCA6IGZsb2F0IG9yIG5kYXJyYXkKICAgICAgICBJZiBgeGAgaXMgMi1ELCB0aGUgcmV0dXJuIHZhbHVlcyBpcyBhIGZsb2F0LgogICAgICAgIE90aGVyd2lzZSwgaXQgaXMgYW4gYXJyYXkgd2l0aCBgYHgubmRpbSAtIDJgYCBkaW1lbnNpb25zLgogICAgICAgIFRoZSByZXR1cm4gdmFsdWVzIGFyZSBlaXRoZXIgdGhlIG1pbmltdW0gb3IgbWF4aW11bSBvciBzdW0gb2YgdGhlCiAgICAgICAgc2luZ3VsYXIgdmFsdWVzIG9mIHRoZSBtYXRyaWNlcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgYG9wYAogICAgICAgIGlzIGBudW1weS5hbWluYCBvciBgbnVtcHkuYW1heGAgb3IgYG51bXB5LnN1bWAuCgogICAgclgAAABylAAAAHIBAAAAKQFy0AAAACkBctMAAAApA3I4AAAAcogAAAByEAAAACkGctQAAADaCHJvd19heGlz2ghjb2xfYXhpc9oCb3DaAXnaBnJlc3VsdHJSAAAAclIAAAByUwAAANoPX211bHRpX3N2ZF9ub3JtwAcAAHMKAAAAABcIAQgBFgEUAXLuAAAARmMEAAAAAAAAAA0AAAAIAAAAQwAAAHNQBAAAdAB8AIMBfQB0AXwAagJqA3QEdAVmAoMCcyR8AKAGdAehAX0AfAJkAWsIcrp8AGoIfQR8AWQBawhzWnwBZAJrBnJKfARkA2sCc1p8AWQDawJyunwEZARrAnK6fABqCWQFZAaNAX0AdAp8AGoCagODAXKQdAt8AGoMfABqDIMCdAt8AGoNfABqDYMCFwB9BW4KdAt8AHwAgwJ9BXQOfAWDAX0GfANytnwGoA98BGQEZwEUAKEBfQZ8BlMAfABqCH0HfAJkAWsIctZ0EHQRfAeDAYMBfQJuNHQSfAJ0EIMCkAFzCnkMdBN8AoMBfQJXAG4UAQABAAEAdBRkB4MBggFZAG4CWAB8AmYBfQJ0FXwCgwFkBGsCkAJybnwBdBZrApABcjR0F3wAgwFqGHwCfANkCI0CUwB8AXQWCwBrApABclJ0F3wAgwFqGXwCfANkCI0CUwB8AWQJawKQAXJ0fABkCWsDoAZ0B6EBahp8AnwDZAiNAlMAfAFkBGsCkAFyknQbahx0F3wAgwF8AnwDZAiNA1MAfAFkAWsIkAFzpnwBZANrApABcsh8AKAdoQB8ABQAagx9CHQOdBtqHHwIfAJ8A2QIjQODAVMAeQx8AWQEFwABAFcAbh4EAHQUawqQAXLyAQABAAEAdB5kCoMBggFZAG4CWAB8AGoCagN0H2sIkAJyDHQXfACDAX0Jbj50CnwAagJqA4MBkAJyHnwAbgZ0IHwAgwF9CXwJagJ8AGoCawiQAnI+dBd8CYMBfQluDHQXfAl8CWQLjQIBAHwJfAFDAH0JdBtqHHwJfAJ8A2QIjQNkDHwBGwATAFMAkAFu3nQVfAKDAWQDawKQBHJEfAJcAn0KfQt0IXwKfAeDAn0KdCF8C3wHgwJ9C3wKfAtrApACcqp0HmQNgwGCAXwBZANrApACcsZ0InwAfAp8C3QjgwR9BpABbkh8AWQOawKQAnLidCJ8AHwKfAt0JIMEfQaQAW4sfAFkBGsCkANyGnwLfAprBJACcv58C2QEOAB9C3Qbahx0F3wAgwF8CmQPjQJqGHwLZA+NAX0GbvR8AXQWawKQA3JSfAp8C2sEkANyNnwKZAQ4AH0KdBtqHHQXfACDAXwLZA+NAmoYfApkD40BfQZuvHwBZBBrApADcop8C3wKawSQA3JufAtkBDgAfQt0G2ocdBd8AIMBfApkD40Cahl8C2QPjQF9Bm6EfAF0FgsAawKQA3LEfAp8C2sEkANyqHwKZAQ4AH0KdBtqHHQXfACDAXwLZA+NAmoZfApkD40BfQZuSnwBZBFrBpADcux0DnQbahx8AKAdoQB8ABQAagx8AmQPjQKDAX0GbiJ8AWQSawKQBHIGdCJ8AHwKfAt0GoMEfQZuCHQeZBODAYIBfAOQBHJAdCV8AGomgwF9DGQEfAx8AmQJGQA8AGQEfAx8AmQEGQA8AHwGoA98DKEBfQZ8BlMAdB5kFIMBggFkAVMAKRVhWRAAAAogICAgTWF0cml4IG9yIHZlY3RvciBub3JtLgoKICAgIFRoaXMgZnVuY3Rpb24gaXMgYWJsZSB0byByZXR1cm4gb25lIG9mIGVpZ2h0IGRpZmZlcmVudCBtYXRyaXggbm9ybXMsCiAgICBvciBvbmUgb2YgYW4gaW5maW5pdGUgbnVtYmVyIG9mIHZlY3RvciBub3JtcyAoZGVzY3JpYmVkIGJlbG93KSwgZGVwZW5kaW5nCiAgICBvbiB0aGUgdmFsdWUgb2YgdGhlIGBgb3JkYGAgcGFyYW1ldGVyLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHggOiBhcnJheV9saWtlCiAgICAgICAgSW5wdXQgYXJyYXkuICBJZiBgYXhpc2AgaXMgTm9uZSwgYHhgIG11c3QgYmUgMS1EIG9yIDItRC4KICAgIG9yZCA6IHtub24temVybyBpbnQsIGluZiwgLWluZiwgJ2ZybycsICdudWMnfSwgb3B0aW9uYWwKICAgICAgICBPcmRlciBvZiB0aGUgbm9ybSAoc2VlIHRhYmxlIHVuZGVyIGBgTm90ZXNgYCkuIGluZiBtZWFucyBudW1weSdzCiAgICAgICAgYGluZmAgb2JqZWN0LgogICAgYXhpcyA6IHtpbnQsIDItdHVwbGUgb2YgaW50cywgTm9uZX0sIG9wdGlvbmFsCiAgICAgICAgSWYgYGF4aXNgIGlzIGFuIGludGVnZXIsIGl0IHNwZWNpZmllcyB0aGUgYXhpcyBvZiBgeGAgYWxvbmcgd2hpY2ggdG8KICAgICAgICBjb21wdXRlIHRoZSB2ZWN0b3Igbm9ybXMuICBJZiBgYXhpc2AgaXMgYSAyLXR1cGxlLCBpdCBzcGVjaWZpZXMgdGhlCiAgICAgICAgYXhlcyB0aGF0IGhvbGQgMi1EIG1hdHJpY2VzLCBhbmQgdGhlIG1hdHJpeCBub3JtcyBvZiB0aGVzZSBtYXRyaWNlcwogICAgICAgIGFyZSBjb21wdXRlZC4gIElmIGBheGlzYCBpcyBOb25lIHRoZW4gZWl0aGVyIGEgdmVjdG9yIG5vcm0gKHdoZW4gYHhgCiAgICAgICAgaXMgMS1EKSBvciBhIG1hdHJpeCBub3JtICh3aGVuIGB4YCBpcyAyLUQpIGlzIHJldHVybmVkLgogICAga2VlcGRpbXMgOiBib29sLCBvcHRpb25hbAogICAgICAgIElmIHRoaXMgaXMgc2V0IHRvIFRydWUsIHRoZSBheGVzIHdoaWNoIGFyZSBub3JtZWQgb3ZlciBhcmUgbGVmdCBpbiB0aGUKICAgICAgICByZXN1bHQgYXMgZGltZW5zaW9ucyB3aXRoIHNpemUgb25lLiAgV2l0aCB0aGlzIG9wdGlvbiB0aGUgcmVzdWx0IHdpbGwKICAgICAgICBicm9hZGNhc3QgY29ycmVjdGx5IGFnYWluc3QgdGhlIG9yaWdpbmFsIGB4YC4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS4xMC4wCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgbiA6IGZsb2F0IG9yIG5kYXJyYXkKICAgICAgICBOb3JtIG9mIHRoZSBtYXRyaXggb3IgdmVjdG9yKHMpLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgRm9yIHZhbHVlcyBvZiBgYG9yZCA8PSAwYGAsIHRoZSByZXN1bHQgaXMsIHN0cmljdGx5IHNwZWFraW5nLCBub3QgYQogICAgbWF0aGVtYXRpY2FsICdub3JtJywgYnV0IGl0IG1heSBzdGlsbCBiZSB1c2VmdWwgZm9yIHZhcmlvdXMgbnVtZXJpY2FsCiAgICBwdXJwb3Nlcy4KCiAgICBUaGUgZm9sbG93aW5nIG5vcm1zIGNhbiBiZSBjYWxjdWxhdGVkOgoKICAgID09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgb3JkICAgIG5vcm0gZm9yIG1hdHJpY2VzICAgICAgICAgICAgIG5vcm0gZm9yIHZlY3RvcnMKICAgID09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgTm9uZSAgIEZyb2Jlbml1cyBub3JtICAgICAgICAgICAgICAgIDItbm9ybQogICAgJ2ZybycgIEZyb2Jlbml1cyBub3JtICAgICAgICAgICAgICAgIC0tCiAgICAnbnVjJyAgbnVjbGVhciBub3JtICAgICAgICAgICAgICAgICAgLS0KICAgIGluZiAgICBtYXgoc3VtKGFicyh4KSwgYXhpcz0xKSkgICAgICBtYXgoYWJzKHgpKQogICAgLWluZiAgIG1pbihzdW0oYWJzKHgpLCBheGlzPTEpKSAgICAgIG1pbihhYnMoeCkpCiAgICAwICAgICAgLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKHggIT0gMCkKICAgIDEgICAgICBtYXgoc3VtKGFicyh4KSwgYXhpcz0wKSkgICAgICBhcyBiZWxvdwogICAgLTEgICAgIG1pbihzdW0oYWJzKHgpLCBheGlzPTApKSAgICAgIGFzIGJlbG93CiAgICAyICAgICAgMi1ub3JtIChsYXJnZXN0IHNpbmcuIHZhbHVlKSAgYXMgYmVsb3cKICAgIC0yICAgICBzbWFsbGVzdCBzaW5ndWxhciB2YWx1ZSAgICAgICBhcyBiZWxvdwogICAgb3RoZXIgIC0tICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShhYnMoeCkqKm9yZCkqKigxLi9vcmQpCiAgICA9PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBUaGUgRnJvYmVuaXVzIG5vcm0gaXMgZ2l2ZW4gYnkgWzFdXzoKCiAgICAgICAgOm1hdGg6YHx8QXx8X0YgPSBbXHN1bV97aSxqfSBhYnMoYV97aSxqfSleMl1eezEvMn1gCgogICAgVGhlIG51Y2xlYXIgbm9ybSBpcyB0aGUgc3VtIG9mIHRoZSBzaW5ndWxhciB2YWx1ZXMuCgogICAgUmVmZXJlbmNlcwogICAgLS0tLS0tLS0tLQogICAgLi4gWzFdIEcuIEguIEdvbHViIGFuZCBDLiBGLiBWYW4gTG9hbiwgKk1hdHJpeCBDb21wdXRhdGlvbnMqLAogICAgICAgICAgIEJhbHRpbW9yZSwgTUQsIEpvaG5zIEhvcGtpbnMgVW5pdmVyc2l0eSBQcmVzcywgMTk4NSwgcGcuIDE1CgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gZnJvbSBudW1weSBpbXBvcnQgbGluYWxnIGFzIExBCiAgICA+Pj4gYSA9IG5wLmFyYW5nZSg5KSAtIDQKICAgID4+PiBhCiAgICBhcnJheShbLTQsIC0zLCAtMiwgLTEsICAwLCAgMSwgIDIsICAzLCAgNF0pCiAgICA+Pj4gYiA9IGEucmVzaGFwZSgoMywgMykpCiAgICA+Pj4gYgogICAgYXJyYXkoW1stNCwgLTMsIC0yXSwKICAgICAgICAgICBbLTEsICAwLCAgMV0sCiAgICAgICAgICAgWyAyLCAgMywgIDRdXSkKCiAgICA+Pj4gTEEubm9ybShhKQogICAgNy43NDU5NjY2OTI0MTQ4MzQKICAgID4+PiBMQS5ub3JtKGIpCiAgICA3Ljc0NTk2NjY5MjQxNDgzNAogICAgPj4+IExBLm5vcm0oYiwgJ2ZybycpCiAgICA3Ljc0NTk2NjY5MjQxNDgzNAogICAgPj4+IExBLm5vcm0oYSwgbnAuaW5mKQogICAgNC4wCiAgICA+Pj4gTEEubm9ybShiLCBucC5pbmYpCiAgICA5LjAKICAgID4+PiBMQS5ub3JtKGEsIC1ucC5pbmYpCiAgICAwLjAKICAgID4+PiBMQS5ub3JtKGIsIC1ucC5pbmYpCiAgICAyLjAKCiAgICA+Pj4gTEEubm9ybShhLCAxKQogICAgMjAuMAogICAgPj4+IExBLm5vcm0oYiwgMSkKICAgIDcuMAogICAgPj4+IExBLm5vcm0oYSwgLTEpCiAgICAtNC42NTY2MTI4Nzc0MTQyMDEzZS0wMTAKICAgID4+PiBMQS5ub3JtKGIsIC0xKQogICAgNi4wCiAgICA+Pj4gTEEubm9ybShhLCAyKQogICAgNy43NDU5NjY2OTI0MTQ4MzQKICAgID4+PiBMQS5ub3JtKGIsIDIpCiAgICA3LjM0ODQ2OTIyODM0OTUzNDUKCiAgICA+Pj4gTEEubm9ybShhLCAtMikKICAgIG5hbgogICAgPj4+IExBLm5vcm0oYiwgLTIpCiAgICAxLjg1NzAzMzE4ODUxOTA1NjNlLTAxNgogICAgPj4+IExBLm5vcm0oYSwgMykKICAgIDUuODQ4MDM1NDc2NDI1NzMxMgogICAgPj4+IExBLm5vcm0oYSwgLTMpCiAgICBuYW4KCiAgICBVc2luZyB0aGUgYGF4aXNgIGFyZ3VtZW50IHRvIGNvbXB1dGUgdmVjdG9yIG5vcm1zOgoKICAgID4+PiBjID0gbnAuYXJyYXkoW1sgMSwgMiwgM10sCiAgICAuLi4gICAgICAgICAgICAgICBbLTEsIDEsIDRdXSkKICAgID4+PiBMQS5ub3JtKGMsIGF4aXM9MCkKICAgIGFycmF5KFsgMS40MTQyMTM1NiwgIDIuMjM2MDY3OTgsICA1LiAgICAgICAgXSkKICAgID4+PiBMQS5ub3JtKGMsIGF4aXM9MSkKICAgIGFycmF5KFsgMy43NDE2NTczOSwgIDQuMjQyNjQwNjldKQogICAgPj4+IExBLm5vcm0oYywgb3JkPTEsIGF4aXM9MSkKICAgIGFycmF5KFsgNi4sICA2Ll0pCgogICAgVXNpbmcgdGhlIGBheGlzYCBhcmd1bWVudCB0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YXJndW1lbnRzIG11c3QgYmUgMi1ELgoKICAgIFRoaW5rIG9mIGBtdWx0aV9kb3RgIGFzOjoKCiAgICAgICAgZGVmIG11bHRpX2RvdChhcnJheXMpOiByZXR1cm4gZnVuY3Rvb2xzLnJlZHVjZShucC5kb3QsIGFycmF5cykKCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYXJyYXlzIDogc2VxdWVuY2Ugb2YgYXJyYXlfbGlrZQogICAgICAgIElmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyAxLUQgaXQgaXMgdHJlYXRlZCBhcyByb3cgdmVjdG9yLgogICAgICAgIElmIHRoZSBsYXN0IGFyZ3VtZW50IGlzIDEtRCBpdCBpcyB0cmVhdGVkIGFzIGNvbHVtbiB2ZWN0b3IuCiAgICAgICAgVGhlIG90aGVyIGFyZ3VtZW50cyBtdXN0IGJlIDItRC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXRwdXQgOiBuZGFycmF5CiAgICAgICAgUmV0dXJucyB0aGUgZG90IHByb2R1Y3Qgb2YgdGhlIHN1cHBsaWVkIGFycmF5cy4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGRvdCA6IGRvdCBtdWx0aXBsaWNhdGlvbiB3aXRoIHR3byBhcmd1bWVudHMuCgogICAgUmVmZXJlbmNlcwogICAgLS0tLS0tLS0tLQoKICAgIC4uIFsxXSBDb3JtZW4sICJJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtcyIsIENoYXB0ZXIgMTUuMiwgcC4gMzcwLTM3OAogICAgLi4gWzJdIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWF0cml4X2NoYWluX211bHRpcGxpY2F0aW9uCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICBgbXVsdGlfZG90YCBhbGxvd3MgeW91IHRvIHdyaXRlOjoKCiAgICA+Pj4gZnJvbSBudW1weS5saW5hbGcgaW1wb3J0IG11bHRpX2RvdAogICAgPj4+ICMgUHJlcGFyZSBzb21lIGRhdGEKICAgID4+PiBBID0gbnAucmFuZG9tLnJhbmRvbSgxMDAwMCwgMTAwKQog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
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 4
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
info.cpython-37.pyc
1.36 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
linalg.cpython-37.pyc
68.02 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
setup.cpython-37.pyc
1.71 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-37.pyc
2.45 KB
lrw-r--r--
2023-04-24 19:38: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).