{ "name": "AbstractedAccount", "structs": { "PluginInfo": [ { "name": "lastValidRound", "type": "uint64" }, { "name": "cooldown", "type": "uint64" }, { "name": "lastCalled", "type": "uint64" }, { "name": "adminPrivileges", "type": "bool" }, { "name": "methods", "type": "(byte[4],uint64,uint64)[]" } ], "PluginsKey": [ { "name": "application", "type": "uint64" }, { "name": "allowedCaller", "type": "address" } ] }, "methods": [ { "name": "createApplication", "args": [ { "type": "address", "name": "controlledAddress", "desc": "The address of the abstracted account. If zeroAddress, then the address of the contract account will be used" }, { "type": "address", "name": "admin", "desc": "The admin for this app" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "desc": "Create an abstracted account application.\nThis is not part of ARC58 and implementation specific.", "events": [], "recommendations": {} }, { "name": "arc58_changeAdmin", "args": [ { "type": "address", "name": "newAdmin", "desc": "The new admin" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Attempt to change the admin for this app. Some implementations MAY not support this.", "events": [], "recommendations": {} }, { "name": "arc58_pluginChangeAdmin", "args": [ { "type": "uint64", "name": "plugin", "desc": "The app calling the plugin" }, { "type": "address", "name": "allowedCaller", "desc": "The address that triggered the plugin" }, { "type": "address", "name": "newAdmin", "desc": "The new admin" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Attempt to change the admin via plugin.", "events": [], "recommendations": {} }, { "name": "arc58_getAdmin", "args": [], "returns": { "type": "address" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get the admin of this app. This method SHOULD always be used rather than reading directly from state\nbecause different implementations may have different ways of determining the admin.", "events": [], "recommendations": {} }, { "name": "arc58_verifyAuthAddr", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Verify the abstracted account is rekeyed to this app", "events": [], "recommendations": {} }, { "name": "arc58_rekeyTo", "args": [ { "type": "address", "name": "address" }, { "type": "bool", "name": "flash", "desc": "Whether or not this should be a flash rekey. If true, the rekey back to the app address must done in the same txn group as this call" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Rekey the abstracted account to another address. Primarily useful for rekeying to an EOA.", "events": [], "recommendations": {} }, { "name": "arc58_canCall", "args": [ { "type": "uint64", "name": "plugin", "desc": "the plugin to be rekeyed to" }, { "type": "address", "name": "address", "desc": "the address that triggered the plugin" }, { "type": "byte[4]", "name": "method" } ], "returns": { "type": "bool", "desc": "whether the plugin can be called via txn sender or globally" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "check whether the plugin can be used", "events": [], "recommendations": {} }, { "name": "arc58_rekeyToPlugin", "args": [ { "type": "uint64", "name": "plugin", "desc": "The app to rekey to" }, { "type": "uint64[]", "name": "methodOffsets", "desc": "The indices of the methods being used in the group\nif the plugin has method restrictions these indices are required to match\nthe methods used on each subsequent call to the plugin within the group" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Temporarily rekey to an approved plugin app address", "events": [], "recommendations": {} }, { "name": "arc58_rekeyToNamedPlugin", "args": [ { "type": "string", "name": "name", "desc": "The name of the plugin to rekey to" }, { "type": "uint64[]", "name": "methodOffsets", "desc": "The indices of the methods being used in the group\nif the plugin has method restrictions these indices are required to match\nthe methods used on each subsequent call to the plugin within the group" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Temporarily rekey to a named plugin app address", "events": [], "recommendations": {} }, { "name": "arc58_addPlugin", "args": [ { "type": "uint64", "name": "app", "desc": "The app to add" }, { "type": "address", "name": "allowedCaller", "desc": "The address of that's allowed to call the app\nor the global zero address for all addresses" }, { "type": "uint64", "name": "lastValidRound", "desc": "The round when the permission expires" }, { "type": "uint64", "name": "cooldown", "desc": "The number of rounds that must pass before the plugin can be called again" }, { "type": "bool", "name": "adminPrivileges", "desc": "Whether the plugin has permissions to change the admin account" }, { "type": "(byte[4],uint64)[]", "name": "methods", "desc": "The methods that are allowed to be called for the plugin by the address" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Add an app to the list of approved plugins", "events": [], "recommendations": {} }, { "name": "arc58_removePlugin", "args": [ { "type": "uint64", "name": "app", "desc": "The app to remove" }, { "type": "address", "name": "allowedCaller", "desc": "The address of that's allowed to call the app" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Remove an app from the list of approved plugins", "events": [], "recommendations": {} }, { "name": "arc58_addNamedPlugin", "args": [ { "type": "string", "name": "name", "desc": "The plugin name" }, { "type": "uint64", "name": "app", "desc": "The plugin app" }, { "type": "address", "name": "allowedCaller", "desc": "The address of that's allowed to call the app\nor the global zero address for all addresses" }, { "type": "uint64", "name": "lastValidRound", "desc": "The round when the permission expires" }, { "type": "uint64", "name": "cooldown", "desc": "The number of rounds that must pass before the plugin can be called again" }, { "type": "bool", "name": "adminPrivileges", "desc": "Whether the plugin has permissions to change the admin account" }, { "type": "(byte[4],uint64)[]", "name": "methods", "desc": "The methods that are allowed to be called for the plugin by the address" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Add a named plugin", "events": [], "recommendations": {} }, { "name": "arc58_removeNamedPlugin", "args": [ { "type": "string", "name": "name", "desc": "The plugin name" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Remove a named plugin", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 2 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "admin": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "YWRtaW4=", "desc": "The admin of the abstracted account. This address can add plugins and initiate rekeys" }, "controlledAddress": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "Y29udHJvbGxlZF9hZGRyZXNz", "desc": "The address this app controls" } }, "local": {}, "box": { "plugins": { "keyType": "AVMString", "valueType": "PluginInfo", "key": "cA==", "desc": "Plugins that add functionality to the controlledAddress and the account that has permission to use it." }, "namedPlugins": { "keyType": "AVMString", "valueType": "PluginsKey", "key": "bg==", "desc": "Plugins that have been given a name for discoverability" } } }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 471, 533, 706, 714, 727, 735, 743, 946, 1046, 1053, 1060, 1067, 1297, 1851, 1862, 1869, 1876, 1933, 1944, 1951, 1958, 2021, 2324 ], "errorMessage": "Box must have value" }, { "pc": [ 511, 512, 968, 995, 1033, 1047, 1054, 1061, 1863, 1870, 1945, 1952, 2022, 2082, 2084, 2088, 2237, 2239, 2243 ], "errorMessage": "Index access is out of bounds" }, { "pc": [ 932 ], "errorMessage": "Length is 4" }, { "pc": [ 174, 189, 222, 240, 270, 291, 310, 341, 359, 371, 388, 409, 424 ], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [ 1200 ], "errorMessage": "Sender must be either controlledAddress or admin" }, { "pc": [ 1244, 1372, 2043, 2152, 2179, 2307 ], "errorMessage": "Sender must be the admin" }, { "pc": [ 1265 ], "errorMessage": "Sender must be the plugin" }, { "pc": [ 1312 ], "errorMessage": "This plugin does not have admin privileges" }, { "pc": [ 1278 ], "errorMessage": "This plugin is not in control of the account" }, { "pc": [ 1272, 1336 ], "errorMessage": "account funded" }, { "pc": [ 1261, 1276, 1649 ], "errorMessage": "application exists" }, { "pc": [ 428 ], "errorMessage": "can only call when creating" }, { "pc": [ 177, 192, 225, 243, 273, 294, 313, 344, 362, 374, 391, 412 ], "errorMessage": "can only call when not creating" }, { "pc": [ 1724 ], "errorMessage": "cannot call other apps during plugin rekey" }, { "pc": [ 1242, 1269, 1325, 1333, 1340, 1370, 1377, 1640, 1644, 2041, 2150, 2177, 2305 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 928 ], "errorMessage": "invalid method signature length" }, { "pc": [ 1729 ], "errorMessage": "invalid onComplete" }, { "pc": [ 1594 ], "errorMessage": "invalid plugin call" }, { "pc": [ 902 ], "errorMessage": "malformed methodOffsets" }, { "pc": [ 1819 ], "errorMessage": "method on cooldown" }, { "pc": [ 1735 ], "errorMessage": "no app id provided" }, { "pc": [ 1635 ], "errorMessage": "no rekey back found" }, { "pc": [ 1831 ], "errorMessage": "not allowed" }, { "pc": [ 2165, 2321, 2332 ], "errorMessage": "plugin does not exist" }, { "pc": [ 1570 ], "errorMessage": "plugin expired" }, { "pc": [ 1558 ], "errorMessage": "plugin not found" }, { "pc": [ 1582 ], "errorMessage": "plugin on cooldown" }, { "pc": [ 1463 ], "errorMessage": "rekey back not found" }, { "pc": [ 1744 ], "errorMessage": "wrong app id" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDIwIDI1IDE5MgogICAgYnl0ZWNibG9jayAicCIgImFkbWluIiAiY29udHJvbGxlZF9hZGRyZXNzIiAweDAwIDB4MDAxYiAweDAwMDAwMDAwMDAwMDAwMDAgIm4iIDB4MGY4ODU0OTMgMHgxNTFmN2M3NSAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEFic3RyYWN0ZWRBY2NvdW50IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOQogICAgcHVzaGJ5dGVzcyAweGI0Yzc3ZDcxIDB4ZDI0Yjc1NTYgMHg1ZmE0NDljNiAweDEzYmM0NGU0IC8vIG1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oYWRkcmVzcyxhZGRyZXNzKXZvaWQiLCBtZXRob2QgImFyYzU4X2NoYW5nZUFkbWluKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW4odWludDY0LGFkZHJlc3MsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJhcmM1OF9nZXRBZG1pbigpYWRkcmVzcyIKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJhcmM1OF92ZXJpZnlBdXRoQWRkcigpdm9pZCIKICAgIHB1c2hieXRlc3MgMHhjOTVhNWQzZCAweDc2OTkzMDhmIDB4M2Y4NjE1ZDcgMHg1YzM0ZjNkNiAweDBhOGExOWQ0IDB4NGQzNzIzNTUgMHhlYThiYjllYyAweGUzNTBiOWQ0IC8vIG1ldGhvZCAiYXJjNThfcmVrZXlUbyhhZGRyZXNzLGJvb2wpdm9pZCIsIG1ldGhvZCAiYXJjNThfY2FuQ2FsbCh1aW50NjQsYWRkcmVzcyxieXRlWzRdKWJvb2wiLCBtZXRob2QgImFyYzU4X3Jla2V5VG9QbHVnaW4odWludDY0LHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImFyYzU4X3Jla2V5VG9OYW1lZFBsdWdpbihzdHJpbmcsdWludDY0W10pdm9pZCIsIG1ldGhvZCAiYXJjNThfYWRkUGx1Z2luKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCwoYnl0ZVs0XSx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAiYXJjNThfcmVtb3ZlUGx1Z2luKHVpbnQ2NCxhZGRyZXNzKXZvaWQiLCBtZXRob2QgImFyYzU4X2FkZE5hbWVkUGx1Z2luKHN0cmluZyx1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wsKGJ5dGVbNF0sdWludDY0KVtdKXZvaWQiLCBtZXRob2QgImFyYzU4X3JlbW92ZU5hbWVkUGx1Z2luKHN0cmluZyl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jcmVhdGVBcHBsaWNhdGlvbl9yb3V0ZUAzIG1haW5fYXJjNThfY2hhbmdlQWRtaW5fcm91dGVANCBtYWluX2FyYzU4X3BsdWdpbkNoYW5nZUFkbWluX3JvdXRlQDUgbWFpbl9hcmM1OF9nZXRBZG1pbl9yb3V0ZUA2IG1haW5fYXJjNThfdmVyaWZ5QXV0aEFkZHJfcm91dGVANyBtYWluX2FyYzU4X3Jla2V5VG9fcm91dGVAOCBtYWluX2FyYzU4X2NhbkNhbGxfcm91dGVAOSBtYWluX2FyYzU4X3Jla2V5VG9QbHVnaW5fcm91dGVAMTAgbWFpbl9hcmM1OF9yZWtleVRvTmFtZWRQbHVnaW5fcm91dGVAMTEgbWFpbl9hcmM1OF9hZGRQbHVnaW5fcm91dGVAMTIgbWFpbl9hcmM1OF9yZW1vdmVQbHVnaW5fcm91dGVAMTMgbWFpbl9hcmM1OF9hZGROYW1lZFBsdWdpbl9yb3V0ZUAxNCBtYWluX2FyYzU4X3JlbW92ZU5hbWVkUGx1Z2luX3JvdXRlQDE1CgptYWluX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBBYnN0cmFjdGVkQWNjb3VudCBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW5fcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU2NwogICAgLy8gYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW4obmFtZTogYXJjNC5TdHIpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgQWJzdHJhY3RlZEFjY291bnQgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU2NwogICAgLy8gYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW4obmFtZTogYXJjNC5TdHIpOiB2b2lkIHsKICAgIGNhbGxzdWIgYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjNThfYWRkTmFtZWRQbHVnaW5fcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjUyNy01MzUKICAgIC8vIGFyYzU4X2FkZE5hbWVkUGx1Z2luKAogICAgLy8gICBuYW1lOiBhcmM0LlN0ciwKICAgIC8vICAgYXBwOiBhcmM0LlVpbnRONjQsCiAgICAvLyAgIGFsbG93ZWRDYWxsZXI6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgbGFzdFZhbGlkUm91bmQ6IGFyYzQuVWludE42NCwKICAgIC8vICAgY29vbGRvd246IGFyYzQuVWludE42NCwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBhcmM0LkJvb2wsCiAgICAvLyAgIG1ldGhvZHM6IGFyYzQuRHluYW1pY0FycmF5PE1ldGhvZFJlc3RyaWN0aW9uPiwKICAgIC8vICk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBBYnN0cmFjdGVkQWNjb3VudCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTI3LTUzNQogICAgLy8gYXJjNThfYWRkTmFtZWRQbHVnaW4oCiAgICAvLyAgIG5hbWU6IGFyYzQuU3RyLAogICAgLy8gICBhcHA6IGFyYzQuVWludE42NCwKICAgIC8vICAgYWxsb3dlZENhbGxlcjogYXJjNC5BZGRyZXNzLAogICAgLy8gICBsYXN0VmFsaWRSb3VuZDogYXJjNC5VaW50TjY0LAogICAgLy8gICBjb29sZG93bjogYXJjNC5VaW50TjY0LAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGFyYzQuQm9vbCwKICAgIC8vICAgbWV0aG9kczogYXJjNC5EeW5hbWljQXJyYXk8TWV0aG9kUmVzdHJpY3Rpb24+LAogICAgLy8gKTogdm9pZCB7CiAgICBjYWxsc3ViIGFyYzU4X2FkZE5hbWVkUGx1Z2luCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzU4X3JlbW92ZVBsdWdpbl9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTA1CiAgICAvLyBhcmM1OF9yZW1vdmVQbHVnaW4oYXBwOiBhcmM0LlVpbnRONjQsIGFsbG93ZWRDYWxsZXI6IGFyYzQuQWRkcmVzcyk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBBYnN0cmFjdGVkQWNjb3VudCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTA1CiAgICAvLyBhcmM1OF9yZW1vdmVQbHVnaW4oYXBwOiBhcmM0LlVpbnRONjQsIGFsbG93ZWRDYWxsZXI6IGFyYzQuQWRkcmVzcyk6IHZvaWQgewogICAgY2FsbHN1YiBhcmM1OF9yZW1vdmVQbHVnaW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjNThfYWRkUGx1Z2luX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0NjctNDc0CiAgICAvLyBhcmM1OF9hZGRQbHVnaW4oCiAgICAvLyAgIGFwcDogYXJjNC5VaW50TjY0LAogICAgLy8gICBhbGxvd2VkQ2FsbGVyOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgIGxhc3RWYWxpZFJvdW5kOiBhcmM0LlVpbnRONjQsCiAgICAvLyAgIGNvb2xkb3duOiBhcmM0LlVpbnRONjQsCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogYXJjNC5Cb29sLAogICAgLy8gICBtZXRob2RzOiBhcmM0LkR5bmFtaWNBcnJheTxNZXRob2RSZXN0cmljdGlvbj4sCiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgQWJzdHJhY3RlZEFjY291bnQgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQ2Ny00NzQKICAgIC8vIGFyYzU4X2FkZFBsdWdpbigKICAgIC8vICAgYXBwOiBhcmM0LlVpbnRONjQsCiAgICAvLyAgIGFsbG93ZWRDYWxsZXI6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgbGFzdFZhbGlkUm91bmQ6IGFyYzQuVWludE42NCwKICAgIC8vICAgY29vbGRvd246IGFyYzQuVWludE42NCwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBhcmM0LkJvb2wsCiAgICAvLyAgIG1ldGhvZHM6IGFyYzQuRHluYW1pY0FycmF5PE1ldGhvZFJlc3RyaWN0aW9uPiwKICAgIC8vICk6IHZvaWQgewogICAgY2FsbHN1YiBhcmM1OF9hZGRQbHVnaW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjNThfcmVrZXlUb05hbWVkUGx1Z2luX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0NTEKICAgIC8vIGFyYzU4X3Jla2V5VG9OYW1lZFBsdWdpbihuYW1lOiBzdHJpbmcsIG1ldGhvZE9mZnNldHM6IGFyYzQuRHluYW1pY0FycmF5PGFyYzQuVWludE42ND4pOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgQWJzdHJhY3RlZEFjY291bnQgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0NTEKICAgIC8vIGFyYzU4X3Jla2V5VG9OYW1lZFBsdWdpbihuYW1lOiBzdHJpbmcsIG1ldGhvZE9mZnNldHM6IGFyYzQuRHluYW1pY0FycmF5PGFyYzQuVWludE42ND4pOiB2b2lkIHsKICAgIGNhbGxzdWIgYXJjNThfcmVrZXlUb05hbWVkUGx1Z2luCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzU4X3Jla2V5VG9QbHVnaW5fcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQyNwogICAgLy8gYXJjNThfcmVrZXlUb1BsdWdpbihwbHVnaW46IGFyYzQuVWludE42NCwgbWV0aG9kT2Zmc2V0czogYXJjNC5EeW5hbWljQXJyYXk8YXJjNC5VaW50TjY0Pik6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBBYnN0cmFjdGVkQWNjb3VudCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDI3CiAgICAvLyBhcmM1OF9yZWtleVRvUGx1Z2luKHBsdWdpbjogYXJjNC5VaW50TjY0LCBtZXRob2RPZmZzZXRzOiBhcmM0LkR5bmFtaWNBcnJheTxhcmM0LlVpbnRONjQ+KTogdm9pZCB7CiAgICBjYWxsc3ViIGFyYzU4X3Jla2V5VG9QbHVnaW4KICAgIHBvcAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmM1OF9jYW5DYWxsX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQxMAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEFic3RyYWN0ZWRBY2NvdW50IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0MTAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBhcmM1OF9jYW5DYWxsCiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWMgOCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmM1OF9yZWtleVRvX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM4NQogICAgLy8gYXJjNThfcmVrZXlUbyhhZGRyZXNzOiBhcmM0LkFkZHJlc3MsIGZsYXNoOiBhcmM0LkJvb2wpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgQWJzdHJhY3RlZEFjY291bnQgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM4NQogICAgLy8gYXJjNThfcmVrZXlUbyhhZGRyZXNzOiBhcmM0LkFkZHJlc3MsIGZsYXNoOiBhcmM0LkJvb2wpOiB2b2lkIHsKICAgIGNhbGxzdWIgYXJjNThfcmVrZXlUbwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmM1OF92ZXJpZnlBdXRoQWRkcl9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozNzUKICAgIC8vIGFyYzU4X3ZlcmlmeUF1dGhBZGRyKCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGFyYzU4X3ZlcmlmeUF1dGhBZGRyCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzU4X2dldEFkbWluX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM2NwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYXJjNThfZ2V0QWRtaW4KICAgIGJ5dGVjIDggLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW5fcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzQzCiAgICAvLyBhcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbihwbHVnaW46IGFyYzQuVWludE42NCwgYWxsb3dlZENhbGxlcjogYXJjNC5BZGRyZXNzLCBuZXdBZG1pbjogYXJjNC5BZGRyZXNzKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEFic3RyYWN0ZWRBY2NvdW50IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozNDMKICAgIC8vIGFyYzU4X3BsdWdpbkNoYW5nZUFkbWluKHBsdWdpbjogYXJjNC5VaW50TjY0LCBhbGxvd2VkQ2FsbGVyOiBhcmM0LkFkZHJlc3MsIG5ld0FkbWluOiBhcmM0LkFkZHJlc3MpOiB2b2lkIHsKICAgIGNhbGxzdWIgYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjNThfY2hhbmdlQWRtaW5fcm91dGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzI5CiAgICAvLyBhcmM1OF9jaGFuZ2VBZG1pbihuZXdBZG1pbjogYXJjNC5BZGRyZXNzKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEFic3RyYWN0ZWRBY2NvdW50IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMjkKICAgIC8vIGFyYzU4X2NoYW5nZUFkbWluKG5ld0FkbWluOiBhcmM0LkFkZHJlc3MpOiB2b2lkIHsKICAgIGNhbGxzdWIgYXJjNThfY2hhbmdlQWRtaW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlQXBwbGljYXRpb25fcm91dGVAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzA4CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEFic3RyYWN0ZWRBY2NvdW50IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMDgKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICBjYWxsc3ViIGNyZWF0ZUFwcGxpY2F0aW9uCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQucGx1Z2luQ2FsbEFsbG93ZWQoYXBwOiBieXRlcywgY2FsbGVyOiBieXRlcywgbWV0aG9kOiBieXRlcykgLT4gdWludDY0OgpwbHVnaW5DYWxsQWxsb3dlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjUKICAgIC8vIHByaXZhdGUgcGx1Z2luQ2FsbEFsbG93ZWQoYXBwOiBhcmM0LlVpbnRONjQsIGNhbGxlcjogYXJjNC5BZGRyZXNzLCBtZXRob2Q6IGFyYzQuU3RhdGljQnl0ZXM8ND4pOiBib29sZWFuIHsKICAgIHByb3RvIDMgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjYKICAgIC8vIGNvbnN0IGtleSA9IG5ldyBQbHVnaW5zS2V5KHsgYXBwbGljYXRpb246IGFwcCwgYWxsb3dlZENhbGxlcjogY2FsbGVyIH0pOwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9jb25zdGFudHMudHM6NAogICAgLy8gZXhwb3J0IGNvbnN0IFBMVUdJTlNfQk9YX1BSRUZJWCA9ICdwJwogICAgYnl0ZWNfMCAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI4CiAgICAvLyBpZiAoIXRoaXMucGx1Z2lucyhrZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogcGx1Z2luQ2FsbEFsbG93ZWRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI5CiAgICAvLyByZXR1cm4gZmFsc2U7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnBsdWdpbkNhbGxBbGxvd2VkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzIKICAgIC8vIGNvbnN0IG1ldGhvZHMgPSB0aGlzLnBsdWdpbnMoa2V5KS52YWx1ZS5tZXRob2RzLmNvcHkoKTsKICAgIGZyYW1lX2RpZyA1CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZHVwCiAgICBpbnRjXzMgLy8gMjUKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMwogICAgLy8gbGV0IG1ldGhvZEFsbG93ZWQgPSBtZXRob2RzLmxlbmd0aCA+IDAgPyBmYWxzZSA6IHRydWU7CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAhCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpwbHVnaW5DYWxsQWxsb3dlZF93aGlsZV90b3BAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHBsdWdpbkNhbGxBbGxvd2VkX2Jsb2NrQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzUKICAgIC8vIGlmIChtZXRob2RzW2ldLnNlbGVjdG9yID09PSBtZXRob2QpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAyMAogICAgKgogICAgaW50Y18yIC8vIDIwCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGV4dHJhY3QgMCA0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogcGx1Z2luQ2FsbEFsbG93ZWRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM2CiAgICAvLyBtZXRob2RBbGxvd2VkID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDMKCnBsdWdpbkNhbGxBbGxvd2VkX2Jsb2NrQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQxCiAgICAvLyBjb25zdCBwID0gdGhpcy5wbHVnaW5zKGtleSkudmFsdWUuY29weSgpOwogICAgZnJhbWVfZGlnIDUKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAxCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0MwogICAgLy8gcC5sYXN0VmFsaWRSb3VuZC5uYXRpdmUgPj0gR2xvYmFsLnJvdW5kCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBSb3VuZAogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDMtNDQKICAgIC8vIHAubGFzdFZhbGlkUm91bmQubmF0aXZlID49IEdsb2JhbC5yb3VuZAogICAgLy8gJiYgKEdsb2JhbC5yb3VuZCAtIHAubGFzdENhbGxlZC5uYXRpdmUpID49IHAuY29vbGRvd24ubmF0aXZlCiAgICBieiBwbHVnaW5DYWxsQWxsb3dlZF9ib29sX2ZhbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQ0CiAgICAvLyAmJiAoR2xvYmFsLnJvdW5kIC0gcC5sYXN0Q2FsbGVkLm5hdGl2ZSkgPj0gcC5jb29sZG93bi5uYXRpdmUKICAgIGdsb2JhbCBSb3VuZAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIHN3YXAKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDMtNDQKICAgIC8vIHAubGFzdFZhbGlkUm91bmQubmF0aXZlID49IEdsb2JhbC5yb3VuZAogICAgLy8gJiYgKEdsb2JhbC5yb3VuZCAtIHAubGFzdENhbGxlZC5uYXRpdmUpID49IHAuY29vbGRvd24ubmF0aXZlCiAgICBieiBwbHVnaW5DYWxsQWxsb3dlZF9ib29sX2ZhbHNlQDExCiAgICBpbnRjXzEgLy8gMQoKcGx1Z2luQ2FsbEFsbG93ZWRfYm9vbF9tZXJnZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDMtNDUKICAgIC8vIHAubGFzdFZhbGlkUm91bmQubmF0aXZlID49IEdsb2JhbC5yb3VuZAogICAgLy8gJiYgKEdsb2JhbC5yb3VuZCAtIHAubGFzdENhbGxlZC5uYXRpdmUpID49IHAuY29vbGRvd24ubmF0aXZlCiAgICAvLyAmJiBtZXRob2RBbGxvd2VkCiAgICBmcmFtZV9kaWcgMwogICAgJiYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDItNDYKICAgIC8vIHJldHVybiAoCiAgICAvLyAgIHAubGFzdFZhbGlkUm91bmQubmF0aXZlID49IEdsb2JhbC5yb3VuZAogICAgLy8gICAmJiAoR2xvYmFsLnJvdW5kIC0gcC5sYXN0Q2FsbGVkLm5hdGl2ZSkgPj0gcC5jb29sZG93bi5uYXRpdmUKICAgIC8vICAgJiYgbWV0aG9kQWxsb3dlZAogICAgLy8gKTsKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwbHVnaW5DYWxsQWxsb3dlZF9ib29sX2ZhbHNlQDExOgogICAgaW50Y18wIC8vIDAKICAgIGIgcGx1Z2luQ2FsbEFsbG93ZWRfYm9vbF9tZXJnZUAxMgoKcGx1Z2luQ2FsbEFsbG93ZWRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozNAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIHBsdWdpbkNhbGxBbGxvd2VkX3doaWxlX3RvcEAzCgoKLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQudHhuUmVrZXlzQmFjayh0eG46IHVpbnQ2NCkgLT4gdWludDY0Ogp0eG5SZWtleXNCYWNrOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0OQogICAgLy8gcHJpdmF0ZSB0eG5SZWtleXNCYWNrKHR4bjogZ3R4bi5UcmFuc2FjdGlvbik6IGJvb2xlYW4gewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjUwCiAgICAvLyBpZiAodHhuLnNlbmRlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MgJiYgdHhuLnJla2V5VG8gPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFNlbmRlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBieiB0eG5SZWtleXNCYWNrX2FmdGVyX2lmX2Vsc2VAMwogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBSZWtleVRvCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJ6IHR4blJla2V5c0JhY2tfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjUxCiAgICAvLyByZXR1cm4gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCnR4blJla2V5c0JhY2tfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1NQogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1NS01NgogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICBieiB0eG5SZWtleXNCYWNrX2Jvb2xfZmFsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1NgogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXBwbGljYXRpb25JRAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1NS01NgogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICBieiB0eG5SZWtleXNCYWNrX2Jvb2xfZmFsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1NwogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDEKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU1LTU3CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAxCiAgICBieiB0eG5SZWtleXNCYWNrX2Jvb2xfZmFsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1OAogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1NS01OAogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMQogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBibnogdHhuUmVrZXlzQmFja19ib29sX2ZhbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTkKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3RvcignYXJjNThfdmVyaWZ5QXV0aEFkZHIoKXZvaWQnKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJhcmM1OF92ZXJpZnlBdXRoQWRkcigpdm9pZCIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU1LTU5CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAxCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3RvcignYXJjNThfdmVyaWZ5QXV0aEFkZHIoKXZvaWQnKQogICAgYnogdHhuUmVrZXlzQmFja19ib29sX2ZhbHNlQDkKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU0LTYwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gICAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gICAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMQogICAgLy8gICAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICAgJiYgdHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yKCdhcmM1OF92ZXJpZnlBdXRoQWRkcigpdm9pZCcpCiAgICAvLyApCiAgICByZXRzdWIKCnR4blJla2V5c0JhY2tfYm9vbF9mYWxzZUA5OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTQtNjAKICAgIC8vIHJldHVybiAoCiAgICAvLyAgIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAgICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAgICYmIHR4bi5udW1BcHBBcmdzID09PSAxCiAgICAvLyAgICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgLy8gICAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IoJ2FyYzU4X3ZlcmlmeUF1dGhBZGRyKCl2b2lkJykKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LnBsdWdpbkNoZWNrKGtleTogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0LCB1aW50NjQsIHVpbnQ2NCwgdWludDY0LCB1aW50NjQsIGJ5dGVzOgpwbHVnaW5DaGVjazoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NzcKICAgIC8vIHByaXZhdGUgcGx1Z2luQ2hlY2soa2V5OiBQbHVnaW5zS2V5KTogUGx1Z2luVmFsaWRhdGlvbiB7CiAgICBwcm90byAxIDcKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2NvbnN0YW50cy50czo0CiAgICAvLyBleHBvcnQgY29uc3QgUExVR0lOU19CT1hfUFJFRklYID0gJ3AnCiAgICBieXRlY18wIC8vICJwIgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo3OAogICAgLy8gY29uc3QgZXhpc3RzID0gdGhpcy5wbHVnaW5zKGtleSkuZXhpc3RzOwogICAgYm94X2xlbgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo3OQogICAgLy8gaWYgKCFleGlzdHMpIHsKICAgIGJueiBwbHVnaW5DaGVja19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6ODEKICAgIC8vIGV4aXN0czogZmFsc2UsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo4MgogICAgLy8gZXhwaXJlZDogdHJ1ZSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjgzLTg0CiAgICAvLyBoYXNDb29sZG93bjogdHJ1ZSwKICAgIC8vIG9uQ29vbGRvd246IHRydWUsCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6ODUKICAgIC8vIGhhc01ldGhvZFJlc3RyaWN0aW9uczogZmFsc2UsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo4NgogICAgLy8gdmFsaWQ6IGZhbHNlCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6ODAtODcKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIGV4aXN0czogZmFsc2UsCiAgICAvLyAgIGV4cGlyZWQ6IHRydWUsCiAgICAvLyAgIGhhc0Nvb2xkb3duOiB0cnVlLAogICAgLy8gICBvbkNvb2xkb3duOiB0cnVlLAogICAgLy8gICBoYXNNZXRob2RSZXN0cmljdGlvbnM6IGZhbHNlLAogICAgLy8gICB2YWxpZDogZmFsc2UKICAgIC8vIH0KICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgcmV0c3ViCgpwbHVnaW5DaGVja19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjkwCiAgICAvLyBjb25zdCBleHBpcmVkID0gR2xvYmFsLnJvdW5kID4gdGhpcy5wbHVnaW5zKGtleSkudmFsdWUubGFzdFZhbGlkUm91bmQubmF0aXZlOwogICAgZ2xvYmFsIFJvdW5kCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA+CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OTEKICAgIC8vIGNvbnN0IGhhc0Nvb2xkb3duID0gdGhpcy5wbHVnaW5zKGtleSkudmFsdWUuY29vbGRvd24ubmF0aXZlID4gMDsKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgID4KICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo5MgogICAgLy8gY29uc3Qgb25Db29sZG93biA9IChHbG9iYWwucm91bmQgLSB0aGlzLnBsdWdpbnMoa2V5KS52YWx1ZS5sYXN0Q2FsbGVkLm5hdGl2ZSkgPCB0aGlzLnBsdWdpbnMoa2V5KS52YWx1ZS5jb29sZG93bi5uYXRpdmU7CiAgICBnbG9iYWwgUm91bmQKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICA8CiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OTMKICAgIC8vIGNvbnN0IGhhc01ldGhvZFJlc3RyaWN0aW9ucyA9IHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlLm1ldGhvZHMubGVuZ3RoID4gMDsKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkdXAKICAgIGludGNfMyAvLyAyNQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgID4KICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo5NQogICAgLy8gY29uc3QgdmFsaWQgPSBleGlzdHMgJiYgIWV4cGlyZWQgJiYgIW9uQ29vbGRvd247CiAgICBmcmFtZV9kaWcgNQogICAgYnogcGx1Z2luQ2hlY2tfYm9vbF9mYWxzZUA2CiAgICBmcmFtZV9kaWcgMAogICAgYm56IHBsdWdpbkNoZWNrX2Jvb2xfZmFsc2VANgogICAgZnJhbWVfZGlnIDMKICAgIGJueiBwbHVnaW5DaGVja19ib29sX2ZhbHNlQDYKICAgIGludGNfMSAvLyAxCgpwbHVnaW5DaGVja19ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjk3LTEwNAogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgZXhpc3RzLAogICAgLy8gICBleHBpcmVkLAogICAgLy8gICBoYXNDb29sZG93biwKICAgIC8vICAgb25Db29sZG93biwKICAgIC8vICAgaGFzTWV0aG9kUmVzdHJpY3Rpb25zLAogICAgLy8gICB2YWxpZAogICAgLy8gfQogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICB1bmNvdmVyIDUKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgcmV0c3ViCgpwbHVnaW5DaGVja19ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwbHVnaW5DaGVja19ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5mdWxsUGx1Z2luQ2hlY2soa2V5OiBieXRlcywgdHhuOiB1aW50NjQsIGFwcDogdWludDY0LCBjYWxsZXI6IGJ5dGVzLCBtZXRob2RPZmZzZXRzOiBieXRlcywgbWV0aG9kSW5kZXg6IHVpbnQ2NCkgLT4gdWludDY0LCB1aW50NjQsIHVpbnQ2NCwgdWludDY0LCB1aW50NjQsIHVpbnQ2NCwgdWludDY0LCB1aW50NjQsIHVpbnQ2NCwgYnl0ZXMsIGJ5dGVzOgpmdWxsUGx1Z2luQ2hlY2s6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjEwNy0xMTQKICAgIC8vIHByaXZhdGUgZnVsbFBsdWdpbkNoZWNrKAogICAgLy8gICBrZXk6IFBsdWdpbnNLZXksCiAgICAvLyAgIHR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sCiAgICAvLyAgIGFwcDogQXBwbGljYXRpb24sCiAgICAvLyAgIGNhbGxlcjogQWNjb3VudCwKICAgIC8vICAgbWV0aG9kT2Zmc2V0czogYXJjNC5EeW5hbWljQXJyYXk8YXJjNC5VaW50TjY0PiwKICAgIC8vICAgbWV0aG9kSW5kZXg6IHVpbnQ2NAogICAgLy8gKTogRnVsbFBsdWdpblZhbGlkYXRpb24gewogICAgcHJvdG8gNiAxMQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTE1CiAgICAvLyBjb25zdCBjaGVjayA9IHRoaXMucGx1Z2luQ2hlY2soa2V5KTsKICAgIGZyYW1lX2RpZyAtNgogICAgY2FsbHN1YiBwbHVnaW5DaGVjawogICAgZnJhbWVfYnVyeSAtNgogICAgZHVwCiAgICBjb3ZlciA2CiAgICBjb3ZlciA2CiAgICBjb3ZlciA1CiAgICBjb3ZlciA0CiAgICBjb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjExNwogICAgLy8gaWYgKCFjaGVjay52YWxpZCkgewogICAgYm56IGZ1bGxQbHVnaW5DaGVja19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTE4LTEyMwogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgLi4uY2hlY2ssCiAgICAvLyAgIG1ldGhvZEFsbG93ZWQ6IGZhbHNlLAogICAgLy8gICBtZXRob2RIYXNDb29sZG93bjogdHJ1ZSwKICAgIC8vICAgbWV0aG9kT25Db29sZG93bjogdHJ1ZQogICAgLy8gfQogICAgZnJhbWVfZGlnIDE2CiAgICBmcmFtZV9kaWcgMTUKICAgIGZyYW1lX2RpZyAxNAogICAgZnJhbWVfZGlnIDEzCiAgICBmcmFtZV9kaWcgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTIwCiAgICAvLyBtZXRob2RBbGxvd2VkOiBmYWxzZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjEyMQogICAgLy8gbWV0aG9kSGFzQ29vbGRvd246IHRydWUsCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxMjIKICAgIC8vIG1ldGhvZE9uQ29vbGRvd246IHRydWUKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxMTgtMTIzCiAgICAvLyByZXR1cm4gewogICAgLy8gICAuLi5jaGVjaywKICAgIC8vICAgbWV0aG9kQWxsb3dlZDogZmFsc2UsCiAgICAvLyAgIG1ldGhvZEhhc0Nvb2xkb3duOiB0cnVlLAogICAgLy8gICBtZXRob2RPbkNvb2xkb3duOiB0cnVlCiAgICAvLyB9CiAgICBmcmFtZV9kaWcgMTEKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9idXJ5IDEwCiAgICBmcmFtZV9idXJ5IDkKICAgIGZyYW1lX2J1cnkgOAogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDYKICAgIGZyYW1lX2J1cnkgNQogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9idXJ5IDMKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZnVsbFBsdWdpbkNoZWNrX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTI3CiAgICAvLyBtZXRob2RBbGxvd2VkOiAhY2hlY2suaGFzTWV0aG9kUmVzdHJpY3Rpb25zLAogICAgZnJhbWVfZGlnIDEyCiAgICBkdXAKICAgICEKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxMjgKICAgIC8vIG1ldGhvZEhhc0Nvb2xkb3duOiBmYWxzZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjEyNi0xMzAKICAgIC8vIGxldCBtZXRob2RDaGVjazogTWV0aG9kVmFsaWRhdGlvbiA9IHsKICAgIC8vICAgbWV0aG9kQWxsb3dlZDogIWNoZWNrLmhhc01ldGhvZFJlc3RyaWN0aW9ucywKICAgIC8vICAgbWV0aG9kSGFzQ29vbGRvd246IGZhbHNlLAogICAgLy8gICBtZXRob2RPbkNvb2xkb3duOiBmYWxzZQogICAgLy8gfQogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjEyOQogICAgLy8gbWV0aG9kT25Db29sZG93bjogZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjEyNi0xMzAKICAgIC8vIGxldCBtZXRob2RDaGVjazogTWV0aG9kVmFsaWRhdGlvbiA9IHsKICAgIC8vICAgbWV0aG9kQWxsb3dlZDogIWNoZWNrLmhhc01ldGhvZFJlc3RyaWN0aW9ucywKICAgIC8vICAgbWV0aG9kSGFzQ29vbGRvd246IGZhbHNlLAogICAgLy8gICBtZXRob2RPbkNvb2xkb3duOiBmYWxzZQogICAgLy8gfQogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjEzMgogICAgLy8gaWYgKGNoZWNrLmhhc01ldGhvZFJlc3RyaWN0aW9ucykgewogICAgYnogZnVsbFBsdWdpbkNoZWNrX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxMzMKICAgIC8vIGFzc2VydChtZXRob2RJbmRleCA8IG1ldGhvZE9mZnNldHMubGVuZ3RoLCAnbWFsZm9ybWVkIG1ldGhvZE9mZnNldHMnKTsKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIGFzc2VydCAvLyBtYWxmb3JtZWQgbWV0aG9kT2Zmc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxMzQKICAgIC8vIG1ldGhvZENoZWNrID0gdGhpcy5tZXRob2RDaGVjayh0eG4sIGFwcCwgY2FsbGVyLCBtZXRob2RPZmZzZXRzW21ldGhvZEluZGV4XS5uYXRpdmUpOwogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDggLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI1NQogICAgLy8gYXNzZXJ0KGxlbih0eG4uYXBwQXJncygwKSkgPT09IDQsICdpbnZhbGlkIG1ldGhvZCBzaWduYXR1cmUgbGVuZ3RoJyk7CiAgICBmcmFtZV9kaWcgLTUKICAgIGludGNfMCAvLyAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBtZXRob2Qgc2lnbmF0dXJlIGxlbmd0aAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNTYKICAgIC8vIGNvbnN0IHNlbGVjdG9yQXJnID0gbmV3IGFyYzQuU3RhdGljQnl0ZXM8ND4odHhuLmFwcEFyZ3MoMCkpOwogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIGlzIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjU4CiAgICAvLyBjb25zdCBrZXkgPSBuZXcgUGx1Z2luc0tleSh7IGFwcGxpY2F0aW9uOiBuZXcgYXJjNC5VaW50TjY0KGFwcC5pZCksIGFsbG93ZWRDYWxsZXI6IG5ldyBhcmM0LkFkZHJlc3MoY2FsbGVyKSB9KTsKICAgIGZyYW1lX2RpZyAtNAogICAgaXRvYgogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvY29uc3RhbnRzLnRzOjQKICAgIC8vIGV4cG9ydCBjb25zdCBQTFVHSU5TX0JPWF9QUkVGSVggPSAncCcKICAgIGJ5dGVjXzAgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI2MAogICAgLy8gY29uc3QgbWV0aG9kcyA9IHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlLm1ldGhvZHMuY29weSgpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZHVwCiAgICBpbnRjXzMgLy8gMjUKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNjEKICAgIC8vIGNvbnN0IGFsbG93ZWRNZXRob2QgPSBtZXRob2RzW29mZnNldF0uY29weSgpOwogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDIwCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDIwCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI2MwogICAgLy8gY29uc3QgaGFzQ29vbGRvd24gPSBhbGxvd2VkTWV0aG9kLmNvb2xkb3duLm5hdGl2ZSA+IDA7CiAgICBkdXAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICA+CiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjY0CiAgICAvLyBjb25zdCBvbkNvb2xkb3duID0gKEdsb2JhbC5yb3VuZCAtIGFsbG93ZWRNZXRob2QubGFzdENhbGxlZC5uYXRpdmUpIDwgYWxsb3dlZE1ldGhvZC5jb29sZG93bi5uYXRpdmU7CiAgICBnbG9iYWwgUm91bmQKICAgIGRpZyAyCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgPgogICAgZnJhbWVfYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI2NgogICAgLy8gaWYgKGFsbG93ZWRNZXRob2Quc2VsZWN0b3IgPT09IHNlbGVjdG9yQXJnICYmICghaGFzQ29vbGRvd24gfHwgIW9uQ29vbGRvd24pKSB7CiAgICBleHRyYWN0IDAgNCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgID09CiAgICBieiBmdWxsUGx1Z2luQ2hlY2tfYWZ0ZXJfaWZfZWxzZUAxNwogICAgZnJhbWVfZGlnIDEwCiAgICBieiBmdWxsUGx1Z2luQ2hlY2tfaWZfYm9keUAxNAogICAgZnJhbWVfZGlnIDkKICAgIGJueiBmdWxsUGx1Z2luQ2hlY2tfYWZ0ZXJfaWZfZWxzZUAxNwoKZnVsbFBsdWdpbkNoZWNrX2lmX2JvZHlAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI2OAogICAgLy8gaWYgKGhhc0Nvb2xkb3duKSB7CiAgICBmcmFtZV9kaWcgMTAKICAgIGJ6IGZ1bGxQbHVnaW5DaGVja19hZnRlcl9pZl9lbHNlQDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI2OQogICAgLy8gbWV0aG9kc1tvZmZzZXRdLmxhc3RDYWxsZWQgPSBuZXcgYXJjNC5VaW50TjY0KEdsb2JhbC5yb3VuZCk7CiAgICBnbG9iYWwgUm91bmQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXBsYWNlMiAxMgogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgOAogICAgPgogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgNAogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjcxCiAgICAvLyAuLi50aGlzLnBsdWdpbnMoa2V5KS52YWx1ZSwKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI3MC0yNzMKICAgIC8vIHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlID0gbmV3IFBsdWdpbkluZm8oewogICAgLy8gICAuLi50aGlzLnBsdWdpbnMoa2V5KS52YWx1ZSwKICAgIC8vICAgbWV0aG9kczogbWV0aG9kcy5jb3B5KCkKICAgIC8vIH0pOwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI3MQogICAgLy8gLi4udGhpcy5wbHVnaW5zKGtleSkudmFsdWUsCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjcwLTI3MwogICAgLy8gdGhpcy5wbHVnaW5zKGtleSkudmFsdWUgPSBuZXcgUGx1Z2luSW5mbyh7CiAgICAvLyAgIC4uLnRoaXMucGx1Z2lucyhrZXkpLnZhbHVlLAogICAgLy8gICBtZXRob2RzOiBtZXRob2RzLmNvcHkoKQogICAgLy8gfSk7CiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjcxCiAgICAvLyAuLi50aGlzLnBsdWdpbnMoa2V5KS52YWx1ZSwKICAgIGRpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNzAtMjczCiAgICAvLyB0aGlzLnBsdWdpbnMoa2V5KS52YWx1ZSA9IG5ldyBQbHVnaW5JbmZvKHsKICAgIC8vICAgLi4udGhpcy5wbHVnaW5zKGtleSkudmFsdWUsCiAgICAvLyAgIG1ldGhvZHM6IG1ldGhvZHMuY29weSgpCiAgICAvLyB9KTsKICAgIGV4dHJhY3QgMTYgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjcxCiAgICAvLyAuLi50aGlzLnBsdWdpbnMoa2V5KS52YWx1ZSwKICAgIGRpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNzAtMjczCiAgICAvLyB0aGlzLnBsdWdpbnMoa2V5KS52YWx1ZSA9IG5ldyBQbHVnaW5JbmZvKHsKICAgIC8vICAgLi4udGhpcy5wbHVnaW5zKGtleSkudmFsdWUsCiAgICAvLyAgIG1ldGhvZHM6IG1ldGhvZHMuY29weSgpCiAgICAvLyB9KTsKICAgIGludGMgNCAvLyAxOTIKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDFiCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgpmdWxsUGx1Z2luQ2hlY2tfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6Mjc3CiAgICAvLyBtZXRob2RBbGxvd2VkOiB0cnVlLAogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2RpZyA5CiAgICBmcmFtZV9idXJ5IDcKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDYKICAgIGZyYW1lX2J1cnkgNQoKZnVsbFBsdWdpbkNoZWNrX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTQwCiAgICAvLyB2YWxpZDogY2hlY2sudmFsaWQgJiYgbWV0aG9kQ2hlY2subWV0aG9kQWxsb3dlZAogICAgZnJhbWVfZGlnIDExCiAgICBieiBmdWxsUGx1Z2luQ2hlY2tfYm9vbF9mYWxzZUA5CiAgICBmcmFtZV9kaWcgNQogICAgYnogZnVsbFBsdWdpbkNoZWNrX2Jvb2xfZmFsc2VAOQogICAgaW50Y18xIC8vIDEKCmZ1bGxQbHVnaW5DaGVja19ib29sX21lcmdlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxMzctMTQxCiAgICAvLyByZXR1cm4gewogICAgLy8gICAuLi5jaGVjaywKICAgIC8vICAgLi4ubWV0aG9kQ2hlY2ssCiAgICAvLyAgIHZhbGlkOiBjaGVjay52YWxpZCAmJiBtZXRob2RDaGVjay5tZXRob2RBbGxvd2VkCiAgICAvLyB9CiAgICBmcmFtZV9kaWcgMTYKICAgIGZyYW1lX2RpZyAxNQogICAgZnJhbWVfZGlnIDE0CiAgICBmcmFtZV9kaWcgMTMKICAgIGZyYW1lX2RpZyAxMgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNwogICAgdW5jb3ZlciA4CiAgICBmcmFtZV9kaWcgLTYKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfYnVyeSAxMAogICAgZnJhbWVfYnVyeSA5CiAgICBmcmFtZV9idXJ5IDgKICAgIGZyYW1lX2J1cnkgNwogICAgZnJhbWVfYnVyeSA2CiAgICBmcmFtZV9idXJ5IDUKICAgIGZyYW1lX2J1cnkgNAogICAgZnJhbWVfYnVyeSAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmZ1bGxQbHVnaW5DaGVja19ib29sX2ZhbHNlQDk6CiAgICBpbnRjXzAgLy8gMAogICAgYiBmdWxsUGx1Z2luQ2hlY2tfYm9vbF9tZXJnZUAxMAoKZnVsbFBsdWdpbkNoZWNrX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI4NAogICAgLy8gbWV0aG9kQWxsb3dlZDogZmFsc2UsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyODUKICAgIC8vIG1ldGhvZEhhc0Nvb2xkb3duOiB0cnVlLAogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6Mjg2CiAgICAvLyBtZXRob2RPbkNvb2xkb3duOiB0cnVlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgZnJhbWVfYnVyeSA2CiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTM0CiAgICAvLyBtZXRob2RDaGVjayA9IHRoaXMubWV0aG9kQ2hlY2sodHhuLCBhcHAsIGNhbGxlciwgbWV0aG9kT2Zmc2V0c1ttZXRob2RJbmRleF0ubmF0aXZlKTsKICAgIGIgZnVsbFBsdWdpbkNoZWNrX2FmdGVyX2lmX2Vsc2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmNyZWF0ZUFwcGxpY2F0aW9uKGNvbnRyb2xsZWRBZGRyZXNzOiBieXRlcywgYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjcmVhdGVBcHBsaWNhdGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzA4LTMwOQogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIC8vIGNyZWF0ZUFwcGxpY2F0aW9uKGNvbnRyb2xsZWRBZGRyZXNzOiBhcmM0LkFkZHJlc3MsIGFkbWluOiBhcmM0LkFkZHJlc3MpIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMTQKICAgIC8vIFR4bi5zZW5kZXIgPT09IGNvbnRyb2xsZWRBZGRyZXNzLm5hdGl2ZQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMTQtMzE1CiAgICAvLyBUeG4uc2VuZGVyID09PSBjb250cm9sbGVkQWRkcmVzcy5uYXRpdmUKICAgIC8vIHx8IFR4bi5zZW5kZXIgPT09IGFkbWluLm5hdGl2ZSwKICAgIGJueiBjcmVhdGVBcHBsaWNhdGlvbl9ib29sX3RydWVAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMTUKICAgIC8vIHx8IFR4bi5zZW5kZXIgPT09IGFkbWluLm5hdGl2ZSwKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzE0LTMxNQogICAgLy8gVHhuLnNlbmRlciA9PT0gY29udHJvbGxlZEFkZHJlc3MubmF0aXZlCiAgICAvLyB8fCBUeG4uc2VuZGVyID09PSBhZG1pbi5uYXRpdmUsCiAgICBieiBjcmVhdGVBcHBsaWNhdGlvbl9ib29sX2ZhbHNlQDMKCmNyZWF0ZUFwcGxpY2F0aW9uX2Jvb2xfdHJ1ZUAyOgogICAgaW50Y18xIC8vIDEKCmNyZWF0ZUFwcGxpY2F0aW9uX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzEzLTMxNwogICAgLy8gYXNzZXJ0KAogICAgLy8gICBUeG4uc2VuZGVyID09PSBjb250cm9sbGVkQWRkcmVzcy5uYXRpdmUKICAgIC8vICAgfHwgVHhuLnNlbmRlciA9PT0gYWRtaW4ubmF0aXZlLAogICAgLy8gICAnU2VuZGVyIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWRBZGRyZXNzIG9yIGFkbWluJwogICAgLy8gKTsKICAgIGFzc2VydCAvLyBTZW5kZXIgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZEFkZHJlc3Mgb3IgYWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzE4CiAgICAvLyBhc3NlcnQoYWRtaW4gIT09IGNvbnRyb2xsZWRBZGRyZXNzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2NvbnN0YW50cy50czoxCiAgICAvLyBleHBvcnQgY29uc3QgQURNSU5fS0VZID0gJ2FkbWluJwogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjMyMAogICAgLy8gdGhpcy5hZG1pbi52YWx1ZSA9IGFkbWluLm5hdGl2ZTsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzIxCiAgICAvLyB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlID0gY29udHJvbGxlZEFkZHJlc3MubmF0aXZlID09PSBHbG9iYWwuemVyb0FkZHJlc3MgPyBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyA6IGNvbnRyb2xsZWRBZGRyZXNzLm5hdGl2ZTsKICAgIGZyYW1lX2RpZyAtMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYnogY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9mYWxzZUA2CiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoKY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9jb25zdGFudHMudHM6MgogICAgLy8gZXhwb3J0IGNvbnN0IENPTlRST0xMRURfQUREUkVTUyA9ICdjb250cm9sbGVkX2FkZHJlc3MnCiAgICBieXRlY18yIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjMyMQogICAgLy8gdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSA9IGNvbnRyb2xsZWRBZGRyZXNzLm5hdGl2ZSA9PT0gR2xvYmFsLnplcm9BZGRyZXNzID8gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MgOiBjb250cm9sbGVkQWRkcmVzcy5uYXRpdmU7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpjcmVhdGVBcHBsaWNhdGlvbl90ZXJuYXJ5X2ZhbHNlQDY6CiAgICBmcmFtZV9kaWcgLTIKICAgIGIgY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9tZXJnZUA3CgpjcmVhdGVBcHBsaWNhdGlvbl9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjcmVhdGVBcHBsaWNhdGlvbl9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9jaGFuZ2VBZG1pbihuZXdBZG1pbjogYnl0ZXMpIC0+IHZvaWQ6CmFyYzU4X2NoYW5nZUFkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMjkKICAgIC8vIGFyYzU4X2NoYW5nZUFkbWluKG5ld0FkbWluOiBhcmM0LkFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMzEKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlLCAnU2VuZGVyIG11c3QgYmUgdGhlIGFkbWluJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2NvbnN0YW50cy50czoxCiAgICAvLyBleHBvcnQgY29uc3QgQURNSU5fS0VZID0gJ2FkbWluJwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzMxCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSwgJ1NlbmRlciBtdXN0IGJlIHRoZSBhZG1pbicpOwogICAgPT0KICAgIGFzc2VydCAvLyBTZW5kZXIgbXVzdCBiZSB0aGUgYWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvY29uc3RhbnRzLnRzOjEKICAgIC8vIGV4cG9ydCBjb25zdCBBRE1JTl9LRVkgPSAnYWRtaW4nCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzMyCiAgICAvLyB0aGlzLmFkbWluLnZhbHVlID0gbmV3QWRtaW4ubmF0aXZlOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW4ocGx1Z2luOiBieXRlcywgYWxsb3dlZENhbGxlcjogYnl0ZXMsIG5ld0FkbWluOiBieXRlcykgLT4gdm9pZDoKYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM0MwogICAgLy8gYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW4ocGx1Z2luOiBhcmM0LlVpbnRONjQsIGFsbG93ZWRDYWxsZXI6IGFyYzQuQWRkcmVzcywgbmV3QWRtaW46IGFyYzQuQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM0NQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IEFwcGxpY2F0aW9uKHBsdWdpbi5uYXRpdmUpLmFkZHJlc3MsICdTZW5kZXIgbXVzdCBiZSB0aGUgcGx1Z2luJyk7CiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTMKICAgIGJ0b2kKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIFNlbmRlciBtdXN0IGJlIHRoZSBwbHVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvY29uc3RhbnRzLnRzOjIKICAgIC8vIGV4cG9ydCBjb25zdCBDT05UUk9MTEVEX0FERFJFU1MgPSAnY29udHJvbGxlZF9hZGRyZXNzJwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM0NwogICAgLy8gdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZS5hdXRoQWRkcmVzcyA9PT0gQXBwbGljYXRpb24ocGx1Z2luLm5hdGl2ZSkuYWRkcmVzcywKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgc3dhcAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzQ2LTM0OQogICAgLy8gYXNzZXJ0KAogICAgLy8gICB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLmF1dGhBZGRyZXNzID09PSBBcHBsaWNhdGlvbihwbHVnaW4ubmF0aXZlKS5hZGRyZXNzLAogICAgLy8gICAnVGhpcyBwbHVnaW4gaXMgbm90IGluIGNvbnRyb2wgb2YgdGhlIGFjY291bnQnCiAgICAvLyApOwogICAgYXNzZXJ0IC8vIFRoaXMgcGx1Z2luIGlzIG5vdCBpbiBjb250cm9sIG9mIHRoZSBhY2NvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM1MQogICAgLy8gY29uc3Qga2V5ID0gbmV3IFBsdWdpbnNLZXkoeyBhcHBsaWNhdGlvbjogcGx1Z2luLCBhbGxvd2VkQ2FsbGVyOiBhbGxvd2VkQ2FsbGVyIH0pOwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9jb25zdGFudHMudHM6NAogICAgLy8gZXhwb3J0IGNvbnN0IFBMVUdJTlNfQk9YX1BSRUZJWCA9ICdwJwogICAgYnl0ZWNfMCAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM1NQogICAgLy8gdGhpcy5wbHVnaW5zKGtleSkuZXhpc3RzICYmIHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlLmFkbWluUHJpdmlsZWdlcy5uYXRpdmUsCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2Jvb2xfZmFsc2VAMwogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjIDQgLy8gMTkyCiAgICBnZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieiBhcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbl9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgphcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbl9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM1NC0zNTcKICAgIC8vIGFzc2VydCgKICAgIC8vICAgdGhpcy5wbHVnaW5zKGtleSkuZXhpc3RzICYmIHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlLmFkbWluUHJpdmlsZWdlcy5uYXRpdmUsCiAgICAvLyAgICdUaGlzIHBsdWdpbiBkb2VzIG5vdCBoYXZlIGFkbWluIHByaXZpbGVnZXMnCiAgICAvLyApOwogICAgYXNzZXJ0IC8vIFRoaXMgcGx1Z2luIGRvZXMgbm90IGhhdmUgYWRtaW4gcHJpdmlsZWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9jb25zdGFudHMudHM6MQogICAgLy8gZXhwb3J0IGNvbnN0IEFETUlOX0tFWSA9ICdhZG1pbicKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozNTkKICAgIC8vIHRoaXMuYWRtaW4udmFsdWUgPSBuZXdBZG1pbi5uYXRpdmU7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X2dldEFkbWluKCkgLT4gYnl0ZXM6CmFyYzU4X2dldEFkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9jb25zdGFudHMudHM6MQogICAgLy8gZXhwb3J0IGNvbnN0IEFETUlOX0tFWSA9ICdhZG1pbicKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM2OQogICAgLy8gcmV0dXJuIG5ldyBhcmM0LkFkZHJlc3ModGhpcy5hZG1pbi52YWx1ZSk7CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF92ZXJpZnlBdXRoQWRkcigpIC0+IHZvaWQ6CmFyYzU4X3ZlcmlmeUF1dGhBZGRyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozNzUKICAgIC8vIGFyYzU4X3ZlcmlmeUF1dGhBZGRyKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2NvbnN0YW50cy50czoyCiAgICAvLyBleHBvcnQgY29uc3QgQ09OVFJPTExFRF9BRERSRVNTID0gJ2NvbnRyb2xsZWRfYWRkcmVzcycKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozNzYKICAgIC8vIGFzc2VydCh0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLmF1dGhBZGRyZXNzID09PSB0aGlzLmdldEF1dGhBZGRyKCkpOwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RBdXRoQWRkcgogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2NvbnN0YW50cy50czoyCiAgICAvLyBleHBvcnQgY29uc3QgQ09OVFJPTExFRF9BRERSRVNTID0gJ2NvbnRyb2xsZWRfYWRkcmVzcycKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyOTUKICAgIC8vIHJldHVybiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI5NS0yOTcKICAgIC8vIHJldHVybiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gICA/IEdsb2JhbC56ZXJvQWRkcmVzcyAvLyBjb250cmFjdCBjb250cm9scyBpdHNlbGYKICAgIC8vICAgOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzczsgLy8gY29udHJhY3QgY29udHJvbHMgYSBkaWZmZXJlbnQgYWNjb3VudAogICAgYnogYXJjNThfdmVyaWZ5QXV0aEFkZHJfdGVybmFyeV9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI5NgogICAgLy8gPyBHbG9iYWwuemVyb0FkZHJlc3MgLy8gY29udHJhY3QgY29udHJvbHMgaXRzZWxmCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKCmFyYzU4X3ZlcmlmeUF1dGhBZGRyX3Rlcm5hcnlfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6Mzc2CiAgICAvLyBhc3NlcnQodGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZS5hdXRoQWRkcmVzcyA9PT0gdGhpcy5nZXRBdXRoQWRkcigpKTsKICAgIGZyYW1lX2RpZyAwCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCmFyYzU4X3ZlcmlmeUF1dGhBZGRyX3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6Mjk3CiAgICAvLyA6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzOyAvLyBjb250cmFjdCBjb250cm9scyBhIGRpZmZlcmVudCBhY2NvdW50CiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYiBhcmM1OF92ZXJpZnlBdXRoQWRkcl90ZXJuYXJ5X21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvKGFkZHJlc3M6IGJ5dGVzLCBmbGFzaDogYnl0ZXMpIC0+IHZvaWQ6CmFyYzU4X3Jla2V5VG86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM4NQogICAgLy8gYXJjNThfcmVrZXlUbyhhZGRyZXNzOiBhcmM0LkFkZHJlc3MsIGZsYXNoOiBhcmM0LkJvb2wpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6Mzg3CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSwgJ1NlbmRlciBtdXN0IGJlIHRoZSBhZG1pbicpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9jb25zdGFudHMudHM6MQogICAgLy8gZXhwb3J0IGNvbnN0IEFETUlOX0tFWSA9ICdhZG1pbicKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM4NwogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuYWRtaW4udmFsdWUsICdTZW5kZXIgbXVzdCBiZSB0aGUgYWRtaW4nKTsKICAgID09CiAgICBhc3NlcnQgLy8gU2VuZGVyIG11c3QgYmUgdGhlIGFkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM4OS0zOTcKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWNlaXZlcjogYWRkcmVzcy5uYXRpdmUsCiAgICAvLyAgICAgcmVrZXlUbzogYWRkcmVzcy5uYXRpdmUsCiAgICAvLyAgICAgbm90ZTogJ3Jla2V5aW5nIGFic3RyYWN0ZWQgYWNjb3VudCcsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2NvbnN0YW50cy50czoyCiAgICAvLyBleHBvcnQgY29uc3QgQ09OVFJPTExFRF9BRERSRVNTID0gJ2NvbnRyb2xsZWRfYWRkcmVzcycKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozOTQKICAgIC8vIG5vdGU6ICdyZWtleWluZyBhYnN0cmFjdGVkIGFjY291bnQnLAogICAgcHVzaGJ5dGVzICJyZWtleWluZyBhYnN0cmFjdGVkIGFjY291bnQiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM4OS0zOTYKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWNlaXZlcjogYWRkcmVzcy5uYXRpdmUsCiAgICAvLyAgICAgcmVrZXlUbzogYWRkcmVzcy5uYXRpdmUsCiAgICAvLyAgICAgbm90ZTogJ3Jla2V5aW5nIGFic3RyYWN0ZWQgYWNjb3VudCcsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6Mzk1CiAgICAvLyBmZWU6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6Mzg5LTM5NwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBhZGRyZXNzLm5hdGl2ZSwKICAgIC8vICAgICByZWtleVRvOiBhZGRyZXNzLm5hdGl2ZSwKICAgIC8vICAgICBub3RlOiAncmVrZXlpbmcgYWJzdHJhY3RlZCBhY2NvdW50JywKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM5OQogICAgLy8gaWYgKGZsYXNoLm5hdGl2ZSkgdGhpcy5hc3NlcnRSZWtleXNCYWNrKCk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ6IGFyYzU4X3Jla2V5VG9fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjY0CiAgICAvLyBsZXQgcmVrZXlzQmFjayA9IGZhbHNlOwogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo2NQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gKFR4bi5ncm91cEluZGV4ICsgMSk7IGkgPCBHbG9iYWwuZ3JvdXBTaXplOyBpICs9IDEpIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCgphcmM1OF9yZWtleVRvX3doaWxlX3RvcEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo2NQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gKFR4bi5ncm91cEluZGV4ICsgMSk7IGkgPCBHbG9iYWwuZ3JvdXBTaXplOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICA8CiAgICBieiBhcmM1OF9yZWtleVRvX2Jsb2NrQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjY4CiAgICAvLyBpZiAodGhpcy50eG5SZWtleXNCYWNrKHR4bikpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBjYWxsc3ViIHR4blJla2V5c0JhY2sKICAgIGJ6IGFyYzU4X3Jla2V5VG9fYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjY5CiAgICAvLyByZWtleXNCYWNrID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDEKCmFyYzU4X3Jla2V5VG9fYmxvY2tAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjc0CiAgICAvLyBhc3NlcnQocmVrZXlzQmFjaywgJ3Jla2V5IGJhY2sgbm90IGZvdW5kJyk7CiAgICBmcmFtZV9kaWcgMQogICAgYXNzZXJ0IC8vIHJla2V5IGJhY2sgbm90IGZvdW5kCgphcmM1OF9yZWtleVRvX2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKYXJjNThfcmVrZXlUb19hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjY1CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAoVHhuLmdyb3VwSW5kZXggKyAxKTsgaSA8IEdsb2JhbC5ncm91cFNpemU7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgYXJjNThfcmVrZXlUb193aGlsZV90b3BANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X2NhbkNhbGwocGx1Z2luOiBieXRlcywgYWRkcmVzczogYnl0ZXMsIG1ldGhvZDogYnl0ZXMpIC0+IHVpbnQ2NDoKYXJjNThfY2FuQ2FsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDEwLTQxMQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBhcmM1OF9jYW5DYWxsKHBsdWdpbjogYXJjNC5VaW50TjY0LCBhZGRyZXNzOiBhcmM0LkFkZHJlc3MsIG1ldGhvZDogYXJjNC5TdGF0aWNCeXRlczw0Pik6IGJvb2xlYW4gewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQxMgogICAgLy8gY29uc3QgZ2xvYmFsQWxsb3dlZCA9IHRoaXMucGx1Z2luQ2FsbEFsbG93ZWQocGx1Z2luLCBuZXcgYXJjNC5BZGRyZXNzKEdsb2JhbC56ZXJvQWRkcmVzcyksIG1ldGhvZCk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHBsdWdpbkNhbGxBbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQxMwogICAgLy8gaWYgKGdsb2JhbEFsbG93ZWQpIHJldHVybiB0cnVlOwogICAgYnogYXJjNThfY2FuQ2FsbF9hZnRlcl9pZl9lbHNlQDIKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCmFyYzU4X2NhbkNhbGxfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0MTUKICAgIC8vIHJldHVybiB0aGlzLnBsdWdpbkNhbGxBbGxvd2VkKHBsdWdpbiwgYWRkcmVzcywgbWV0aG9kKTsKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgcGx1Z2luQ2FsbEFsbG93ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW4ocGx1Z2luOiBieXRlcywgbWV0aG9kT2Zmc2V0czogYnl0ZXMpIC0+IGJ5dGVzOgphcmM1OF9yZWtleVRvUGx1Z2luOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0MjcKICAgIC8vIGFyYzU4X3Jla2V5VG9QbHVnaW4ocGx1Z2luOiBhcmM0LlVpbnRONjQsIG1ldGhvZE9mZnNldHM6IGFyYzQuRHluYW1pY0FycmF5PGFyYzQuVWludE42ND4pOiB2b2lkIHsKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQyOQogICAgLy8gdGhpcy5hc3NlcnRWYWxpZEdyb3VwKEFwcGxpY2F0aW9uKHBsdWdpbi5uYXRpdmUpLCBtZXRob2RPZmZzZXRzKTsKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE1NQogICAgLy8gYXBwbGljYXRpb246IG5ldyBhcmM0LlVpbnRONjQocGx1Z2luLmlkKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTU0LTE1NwogICAgLy8gY29uc3QgZ0tleSA9IG5ldyBQbHVnaW5zS2V5KHsKICAgIC8vICAgYXBwbGljYXRpb246IG5ldyBhcmM0LlVpbnRONjQocGx1Z2luLmlkKSwKICAgIC8vICAgYWxsb3dlZENhbGxlcjogbmV3IGFyYzQuQWRkcmVzcyhHbG9iYWwuemVyb0FkZHJlc3MpCiAgICAvLyB9KTsKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxNTYKICAgIC8vIGFsbG93ZWRDYWxsZXI6IG5ldyBhcmM0LkFkZHJlc3MoR2xvYmFsLnplcm9BZGRyZXNzKQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE1NC0xNTcKICAgIC8vIGNvbnN0IGdLZXkgPSBuZXcgUGx1Z2luc0tleSh7CiAgICAvLyAgIGFwcGxpY2F0aW9uOiBuZXcgYXJjNC5VaW50TjY0KHBsdWdpbi5pZCksCiAgICAvLyAgIGFsbG93ZWRDYWxsZXI6IG5ldyBhcmM0LkFkZHJlc3MoR2xvYmFsLnplcm9BZGRyZXNzKQogICAgLy8gfSk7CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTU5CiAgICAvLyBjb25zdCBnbG9iYWxDaGVjayA9IHRoaXMucGx1Z2luQ2hlY2soZ0tleSk7CiAgICBjYWxsc3ViIHBsdWdpbkNoZWNrCiAgICBjb3ZlciA3CiAgICBjb3ZlciA2CiAgICBwb3AKICAgIGNvdmVyIDQKICAgIHBvcAogICAgY292ZXIgMgogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxNjMKICAgIC8vIGFsbG93ZWRDYWxsZXI6IG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTYxLTE2NAogICAgLy8gY29uc3QgbEtleSA9IG5ldyBQbHVnaW5zS2V5KHsKICAgIC8vICAgYXBwbGljYXRpb246IG5ldyBhcmM0LlVpbnRONjQocGx1Z2luLmlkKSwKICAgIC8vICAgYWxsb3dlZENhbGxlcjogbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgLy8gfSk7CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTY2CiAgICAvLyBjb25zdCBsb2NhbENoZWNrID0gdGhpcy5wbHVnaW5DaGVjayhsS2V5KTsKICAgIGNhbGxzdWIgcGx1Z2luQ2hlY2sKICAgIGNvdmVyIDcKICAgIGNvdmVyIDYKICAgIHBvcAogICAgY292ZXIgNAogICAgcG9wCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE2OAogICAgLy8gYXNzZXJ0KGdsb2JhbENoZWNrLmV4aXN0cyB8fCBsb2NhbENoZWNrLmV4aXN0cywgJ3BsdWdpbiBub3QgZm91bmQnKTsKICAgIGJueiBhcmM1OF9yZWtleVRvUGx1Z2luX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMTgKICAgIGJ6IGFyYzU4X3Jla2V5VG9QbHVnaW5fYm9vbF9mYWxzZUA3CgphcmM1OF9yZWtleVRvUGx1Z2luX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFyYzU4X3Jla2V5VG9QbHVnaW5fYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxNjgKICAgIC8vIGFzc2VydChnbG9iYWxDaGVjay5leGlzdHMgfHwgbG9jYWxDaGVjay5leGlzdHMsICdwbHVnaW4gbm90IGZvdW5kJyk7CiAgICBhc3NlcnQgLy8gcGx1Z2luIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxNjkKICAgIC8vIGFzc2VydCghZ2xvYmFsQ2hlY2suZXhwaXJlZCB8fCAhbG9jYWxDaGVjay5leHBpcmVkLCAncGx1Z2luIGV4cGlyZWQnKTsKICAgIGZyYW1lX2RpZyAxMwogICAgYnogYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX3RydWVAMTAKICAgIGZyYW1lX2RpZyAxNwogICAgYm56IGFyYzU4X3Jla2V5VG9QbHVnaW5fYm9vbF9mYWxzZUAxMQoKYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX3RydWVAMTA6CiAgICBpbnRjXzEgLy8gMQoKYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX21lcmdlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxNjkKICAgIC8vIGFzc2VydCghZ2xvYmFsQ2hlY2suZXhwaXJlZCB8fCAhbG9jYWxDaGVjay5leHBpcmVkLCAncGx1Z2luIGV4cGlyZWQnKTsKICAgIGFzc2VydCAvLyBwbHVnaW4gZXhwaXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxNzAKICAgIC8vIGFzc2VydCghZ2xvYmFsQ2hlY2sub25Db29sZG93biB8fCAhbG9jYWxDaGVjay5vbkNvb2xkb3duLCAncGx1Z2luIG9uIGNvb2xkb3duJyk7CiAgICBmcmFtZV9kaWcgMTIKICAgIGJ6IGFyYzU4X3Jla2V5VG9QbHVnaW5fYm9vbF90cnVlQDE0CiAgICBmcmFtZV9kaWcgMTYKICAgIGJueiBhcmM1OF9yZWtleVRvUGx1Z2luX2Jvb2xfZmFsc2VAMTUKCmFyYzU4X3Jla2V5VG9QbHVnaW5fYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmFyYzU4X3Jla2V5VG9QbHVnaW5fYm9vbF9tZXJnZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTcwCiAgICAvLyBhc3NlcnQoIWdsb2JhbENoZWNrLm9uQ29vbGRvd24gfHwgIWxvY2FsQ2hlY2sub25Db29sZG93biwgJ3BsdWdpbiBvbiBjb29sZG93bicpOwogICAgYXNzZXJ0IC8vIHBsdWdpbiBvbiBjb29sZG93bgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxNzUKICAgIC8vIGFzc2VydChnbG9iYWxDaGVjay52YWxpZCB8fCBsb2NhbENoZWNrLnZhbGlkLCAnaW52YWxpZCBwbHVnaW4gY2FsbCcpOwogICAgZnJhbWVfZGlnIDExCiAgICBibnogYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX3RydWVAMTgKICAgIGZyYW1lX2RpZyAxNQogICAgYnogYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX2ZhbHNlQDE5CgphcmM1OF9yZWtleVRvUGx1Z2luX2Jvb2xfdHJ1ZUAxODoKICAgIGludGNfMSAvLyAxCgphcmM1OF9yZWtleVRvUGx1Z2luX2Jvb2xfbWVyZ2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE3NQogICAgLy8gYXNzZXJ0KGdsb2JhbENoZWNrLnZhbGlkIHx8IGxvY2FsQ2hlY2sudmFsaWQsICdpbnZhbGlkIHBsdWdpbiBjYWxsJyk7CiAgICBhc3NlcnQgLy8gaW52YWxpZCBwbHVnaW4gY2FsbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxNzcKICAgIC8vIGxldCByZWtleXNCYWNrID0gZmFsc2U7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE3OAogICAgLy8gbGV0IG1ldGhvZEluZGV4OiB1aW50NjQgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxODAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IChUeG4uZ3JvdXBJbmRleCArIDEpOyBpIDwgR2xvYmFsLmdyb3VwU2l6ZTsgaSArPSAxKSB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgZnJhbWVfZGlnIC0xCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZnJhbWVfYnVyeSAtMQoKYXJjNThfcmVrZXlUb1BsdWdpbl93aGlsZV90b3BAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE4MAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gKFR4bi5ncm91cEluZGV4ICsgMSk7IGkgPCBHbG9iYWwuZ3JvdXBTaXplOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAzCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICA8CiAgICBieiBhcmM1OF9yZWtleVRvUGx1Z2luX2Jsb2NrQDQzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE4MwogICAgLy8gaWYgKHRoaXMudHhuUmVrZXlzQmFjayh0eG4pKSB7CiAgICBmcmFtZV9kaWcgMwogICAgY2FsbHN1YiB0eG5SZWtleXNCYWNrCiAgICBieiBhcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTg0CiAgICAvLyByZWtleXNCYWNrID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDgKCmFyYzU4X3Jla2V5VG9QbHVnaW5fYmxvY2tANDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI0MQogICAgLy8gYXNzZXJ0KHJla2V5c0JhY2ssICdubyByZWtleSBiYWNrIGZvdW5kJyk7CiAgICBmcmFtZV9kaWcgOAogICAgYXNzZXJ0IC8vIG5vIHJla2V5IGJhY2sgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDMxLTQzOQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJla2V5VG86IEFwcGxpY2F0aW9uKHBsdWdpbi5uYXRpdmUpLmFkZHJlc3MsCiAgICAvLyAgICAgbm90ZTogJ3Jla2V5aW5nIHRvIHBsdWdpbiBhcHAnLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9jb25zdGFudHMudHM6MgogICAgLy8gZXhwb3J0IGNvbnN0IENPTlRST0xMRURfQUREUkVTUyA9ICdjb250cm9sbGVkX2FkZHJlc3MnCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0MzUKICAgIC8vIHJla2V5VG86IEFwcGxpY2F0aW9uKHBsdWdpbi5uYXRpdmUpLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgOQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0MzYKICAgIC8vIG5vdGU6ICdyZWtleWluZyB0byBwbHVnaW4gYXBwJywKICAgIHB1c2hieXRlcyAicmVrZXlpbmcgdG8gcGx1Z2luIGFwcCIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0MzEtNDM4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgcmVrZXlUbzogQXBwbGljYXRpb24ocGx1Z2luLm5hdGl2ZSkuYWRkcmVzcywKICAgIC8vICAgICBub3RlOiAncmVrZXlpbmcgdG8gcGx1Z2luIGFwcCcsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDM3CiAgICAvLyBmZWU6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDMxLTQzOQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJla2V5VG86IEFwcGxpY2F0aW9uKHBsdWdpbi5uYXRpdmUpLmFkZHJlc3MsCiAgICAvLyAgICAgbm90ZTogJ3Jla2V5aW5nIHRvIHBsdWdpbiBhcHAnLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxODgKICAgIC8vIGlmICh0eG4udHlwZSAhPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCkgewogICAgZnJhbWVfZGlnIDMKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDYgLy8gNgogICAgIT0KICAgIGJ6IGFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAyNgogICAgZnJhbWVfZGlnIDAKCmFyYzU4X3Jla2V5VG9QbHVnaW5fYmxvY2tANDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE4MAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gKFR4bi5ncm91cEluZGV4ICsgMSk7IGkgPCBHbG9iYWwuZ3JvdXBTaXplOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgYXJjNThfcmVrZXlUb1BsdWdpbl93aGlsZV90b3BAMjEKCmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTkyCiAgICAvLyBhc3NlcnQodHhuLmFwcElkLmlkID09PSBwbHVnaW4uaWQsICdjYW5ub3QgY2FsbCBvdGhlciBhcHBzIGR1cmluZyBwbHVnaW4gcmVrZXknKTsKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIGZyYW1lX2RpZyA5CiAgICBkdXAKICAgIGNvdmVyIDMKICAgID09CiAgICBhc3NlcnQgLy8gY2Fubm90IGNhbGwgb3RoZXIgYXBwcyBkdXJpbmcgcGx1Z2luIHJla2V5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE5MwogICAgLy8gYXNzZXJ0KHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCwgJ2ludmFsaWQgb25Db21wbGV0ZScpOwogICAgZHVwCiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBpbnZhbGlkIG9uQ29tcGxldGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTk2CiAgICAvLyBhc3NlcnQodHhuLm51bUFwcEFyZ3MgPiAxLCAnbm8gYXBwIGlkIHByb3ZpZGVkJyk7CiAgICBkdXAKICAgIGd0eG5zIE51bUFwcEFyZ3MKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBhc3NlcnQgLy8gbm8gYXBwIGlkIHByb3ZpZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE5NwogICAgLy8gYXNzZXJ0KEFwcGxpY2F0aW9uKGJ0b2kodHhuLmFwcEFyZ3MoMSkpKSA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLCAnd3JvbmcgYXBwIGlkJyk7CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgYnRvaQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFwcCBpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyMDMKICAgIC8vIEdsb2JhbC56ZXJvQWRkcmVzcywKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxOTktMjA2CiAgICAvLyBjb25zdCBnbG9iYWxMb29wQ2hlY2sgPSB0aGlzLmZ1bGxQbHVnaW5DaGVjaygKICAgIC8vICAgZ0tleSwKICAgIC8vICAgdHhuLAogICAgLy8gICBwbHVnaW4sCiAgICAvLyAgIEdsb2JhbC56ZXJvQWRkcmVzcywKICAgIC8vICAgbWV0aG9kT2Zmc2V0cywKICAgIC8vICAgbWV0aG9kSW5kZXgKICAgIC8vICk7CiAgICBmcmFtZV9kaWcgMTAKICAgIGRpZyAyCiAgICBkaWcgNAogICAgdW5jb3ZlciAzCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyA3CiAgICBkdXAKICAgIGNvdmVyIDgKICAgIGNhbGxzdWIgZnVsbFBsdWdpbkNoZWNrCiAgICBmcmFtZV9idXJ5IC0xCiAgICBmcmFtZV9idXJ5IDEwCiAgICBmcmFtZV9idXJ5IDIKICAgIGNvdmVyIDEwCiAgICBwb3BuIDQKICAgIGZyYW1lX2J1cnkgMQogICAgcG9wbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjIxMgogICAgLy8gVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjA4LTIxNQogICAgLy8gY29uc3QgbG9jYWxMb29wQ2hlY2sgPSB0aGlzLmZ1bGxQbHVnaW5DaGVjaygKICAgIC8vICAgbEtleSwKICAgIC8vICAgdHhuLAogICAgLy8gICBwbHVnaW4sCiAgICAvLyAgIFR4bi5zZW5kZXIsCiAgICAvLyAgIG1ldGhvZE9mZnNldHMsCiAgICAvLyAgIG1ldGhvZEluZGV4CiAgICAvLyApOwogICAgZnJhbWVfZGlnIDE0CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBmdWxsUGx1Z2luQ2hlY2sKICAgIGZyYW1lX2J1cnkgLTEKICAgIGZyYW1lX2J1cnkgMTQKICAgIGZyYW1lX2J1cnkgNgogICAgZnJhbWVfYnVyeSA1CiAgICBwb3BuIDQKICAgIGZyYW1lX2J1cnkgNAogICAgcG9wbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjIxNwogICAgLy8gYXNzZXJ0KCFnbG9iYWxMb29wQ2hlY2subWV0aG9kT25Db29sZG93biB8fCAhbG9jYWxMb29wQ2hlY2subWV0aG9kT25Db29sZG93biwgJ21ldGhvZCBvbiBjb29sZG93bicpOwogICAgYnogYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyA1CiAgICBibnogYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX2ZhbHNlQDI5CgphcmM1OF9yZWtleVRvUGx1Z2luX2Jvb2xfdHJ1ZUAyODoKICAgIGludGNfMSAvLyAxCgphcmM1OF9yZWtleVRvUGx1Z2luX2Jvb2xfbWVyZ2VAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjIxNwogICAgLy8gYXNzZXJ0KCFnbG9iYWxMb29wQ2hlY2subWV0aG9kT25Db29sZG93biB8fCAhbG9jYWxMb29wQ2hlY2subWV0aG9kT25Db29sZG93biwgJ21ldGhvZCBvbiBjb29sZG93bicpOwogICAgYXNzZXJ0IC8vIG1ldGhvZCBvbiBjb29sZG93bgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyMTgKICAgIC8vIGFzc2VydChnbG9iYWxMb29wQ2hlY2sudmFsaWQgfHwgbG9jYWxMb29wQ2hlY2sudmFsaWQsICdub3QgYWxsb3dlZCcpOwogICAgZnJhbWVfZGlnIDIKICAgIGJueiBhcmM1OF9yZWtleVRvUGx1Z2luX2Jvb2xfdHJ1ZUAzMgogICAgZnJhbWVfZGlnIDYKICAgIGJ6IGFyYzU4X3Jla2V5VG9QbHVnaW5fYm9vbF9mYWxzZUAzMwoKYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX3RydWVAMzI6CiAgICBpbnRjXzEgLy8gMQoKYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX21lcmdlQDM0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyMTgKICAgIC8vIGFzc2VydChnbG9iYWxMb29wQ2hlY2sudmFsaWQgfHwgbG9jYWxMb29wQ2hlY2sudmFsaWQsICdub3QgYWxsb3dlZCcpOwogICAgYXNzZXJ0IC8vIG5vdCBhbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjIyNAogICAgLy8gaWYgKGdsb2JhbExvb3BDaGVjay52YWxpZCAmJiBnbG9iYWxMb29wQ2hlY2suaGFzQ29vbGRvd24pIHsKICAgIGZyYW1lX2RpZyAyCiAgICBieiBhcmM1OF9yZWtleVRvUGx1Z2luX2Vsc2VfYm9keUAzNwogICAgZnJhbWVfZGlnIDEKICAgIGJ6IGFyYzU4X3Jla2V5VG9QbHVnaW5fZWxzZV9ib2R5QDM3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjIyNwogICAgLy8gbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NChHbG9iYWwucm91bmQpLAogICAgZ2xvYmFsIFJvdW5kCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2NvbnN0YW50cy50czo0CiAgICAvLyBleHBvcnQgY29uc3QgUExVR0lOU19CT1hfUFJFRklYID0gJ3AnCiAgICBieXRlY18wIC8vICJwIgogICAgZnJhbWVfZGlnIDEwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjI4CiAgICAvLyBtZXRob2RzOiB0aGlzLnBsdWdpbnMoZ0tleSkudmFsdWUubWV0aG9kcy5jb3B5KCksCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkdXAKICAgIGludGNfMyAvLyAyNQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjI2CiAgICAvLyAuLi50aGlzLnBsdWdpbnMoZ0tleSkudmFsdWUsCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjI1LTIyOQogICAgLy8gdGhpcy5wbHVnaW5zKGdLZXkpLnZhbHVlID0gbmV3IFBsdWdpbkluZm8oewogICAgLy8gICAuLi50aGlzLnBsdWdpbnMoZ0tleSkudmFsdWUsCiAgICAvLyAgIGxhc3RDYWxsZWQ6IG5ldyBhcmM0LlVpbnRONjQoR2xvYmFsLnJvdW5kKSwKICAgIC8vICAgbWV0aG9kczogdGhpcy5wbHVnaW5zKGdLZXkpLnZhbHVlLm1ldGhvZHMuY29weSgpLAogICAgLy8gfSk7CiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjI2CiAgICAvLyAuLi50aGlzLnBsdWdpbnMoZ0tleSkudmFsdWUsCiAgICBkaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjI1LTIyOQogICAgLy8gdGhpcy5wbHVnaW5zKGdLZXkpLnZhbHVlID0gbmV3IFBsdWdpbkluZm8oewogICAgLy8gICAuLi50aGlzLnBsdWdpbnMoZ0tleSkudmFsdWUsCiAgICAvLyAgIGxhc3RDYWxsZWQ6IG5ldyBhcmM0LlVpbnRONjQoR2xvYmFsLnJvdW5kKSwKICAgIC8vICAgbWV0aG9kczogdGhpcy5wbHVnaW5zKGdLZXkpLnZhbHVlLm1ldGhvZHMuY29weSgpLAogICAgLy8gfSk7CiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjI2CiAgICAvLyAuLi50aGlzLnBsdWdpbnMoZ0tleSkudmFsdWUsCiAgICBkaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjI1LTIyOQogICAgLy8gdGhpcy5wbHVnaW5zKGdLZXkpLnZhbHVlID0gbmV3IFBsdWdpbkluZm8oewogICAgLy8gICAuLi50aGlzLnBsdWdpbnMoZ0tleSkudmFsdWUsCiAgICAvLyAgIGxhc3RDYWxsZWQ6IG5ldyBhcmM0LlVpbnRONjQoR2xvYmFsLnJvdW5kKSwKICAgIC8vICAgbWV0aG9kczogdGhpcy5wbHVnaW5zKGdLZXkpLnZhbHVlLm1ldGhvZHMuY29weSgpLAogICAgLy8gfSk7CiAgICBpbnRjIDQgLy8gMTkyCiAgICBnZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDFiCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAoKYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDQwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyMzgKICAgIC8vIG1ldGhvZEluZGV4ICs9IDE7CiAgICBmcmFtZV9kaWcgNwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNwogICAgZnJhbWVfZGlnIC0xCiAgICBiIGFyYzU4X3Jla2V5VG9QbHVnaW5fYmxvY2tANDEKCmFyYzU4X3Jla2V5VG9QbHVnaW5fZWxzZV9ib2R5QDM3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyMzAKICAgIC8vIH0gZWxzZSBpZiAobG9jYWxMb29wQ2hlY2sudmFsaWQgJiYgbG9jYWxMb29wQ2hlY2suaGFzQ29vbGRvd24pIHsKICAgIGZyYW1lX2RpZyA2CiAgICBieiBhcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VANDAKICAgIGZyYW1lX2RpZyA0CiAgICBieiBhcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VANDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjMzCiAgICAvLyBsYXN0Q2FsbGVkOiBuZXcgYXJjNC5VaW50TjY0KEdsb2JhbC5yb3VuZCksCiAgICBnbG9iYWwgUm91bmQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvY29uc3RhbnRzLnRzOjQKICAgIC8vIGV4cG9ydCBjb25zdCBQTFVHSU5TX0JPWF9QUkVGSVggPSAncCcKICAgIGJ5dGVjXzAgLy8gInAiCiAgICBmcmFtZV9kaWcgMTQKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyMzQKICAgIC8vIG1ldGhvZHM6IHRoaXMucGx1Z2lucyhsS2V5KS52YWx1ZS5tZXRob2RzLmNvcHkoKSwKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGR1cAogICAgaW50Y18zIC8vIDI1CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyMzIKICAgIC8vIC4uLnRoaXMucGx1Z2lucyhsS2V5KS52YWx1ZSwKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyMzEtMjM1CiAgICAvLyB0aGlzLnBsdWdpbnMobEtleSkudmFsdWUgPSBuZXcgUGx1Z2luSW5mbyh7CiAgICAvLyAgIC4uLnRoaXMucGx1Z2lucyhsS2V5KS52YWx1ZSwKICAgIC8vICAgbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NChHbG9iYWwucm91bmQpLAogICAgLy8gICBtZXRob2RzOiB0aGlzLnBsdWdpbnMobEtleSkudmFsdWUubWV0aG9kcy5jb3B5KCksCiAgICAvLyB9KQogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjIzMgogICAgLy8gLi4udGhpcy5wbHVnaW5zKGxLZXkpLnZhbHVlLAogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjIzMS0yMzUKICAgIC8vIHRoaXMucGx1Z2lucyhsS2V5KS52YWx1ZSA9IG5ldyBQbHVnaW5JbmZvKHsKICAgIC8vICAgLi4udGhpcy5wbHVnaW5zKGxLZXkpLnZhbHVlLAogICAgLy8gICBsYXN0Q2FsbGVkOiBuZXcgYXJjNC5VaW50TjY0KEdsb2JhbC5yb3VuZCksCiAgICAvLyAgIG1ldGhvZHM6IHRoaXMucGx1Z2lucyhsS2V5KS52YWx1ZS5tZXRob2RzLmNvcHkoKSwKICAgIC8vIH0pCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjMyCiAgICAvLyAuLi50aGlzLnBsdWdpbnMobEtleSkudmFsdWUsCiAgICBkaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjMxLTIzNQogICAgLy8gdGhpcy5wbHVnaW5zKGxLZXkpLnZhbHVlID0gbmV3IFBsdWdpbkluZm8oewogICAgLy8gICAuLi50aGlzLnBsdWdpbnMobEtleSkudmFsdWUsCiAgICAvLyAgIGxhc3RDYWxsZWQ6IG5ldyBhcmM0LlVpbnRONjQoR2xvYmFsLnJvdW5kKSwKICAgIC8vICAgbWV0aG9kczogdGhpcy5wbHVnaW5zKGxLZXkpLnZhbHVlLm1ldGhvZHMuY29weSgpLAogICAgLy8gfSkKICAgIGludGMgNCAvLyAxOTIKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMWIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICBiIGFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUA0MAoKYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX2ZhbHNlQDMzOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX21lcmdlQDM0CgphcmM1OF9yZWtleVRvUGx1Z2luX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcmM1OF9yZWtleVRvUGx1Z2luX2Jvb2xfbWVyZ2VAMzAKCmFyYzU4X3Jla2V5VG9QbHVnaW5fYm9vbF9mYWxzZUAxOToKICAgIGludGNfMCAvLyAwCiAgICBiIGFyYzU4X3Jla2V5VG9QbHVnaW5fYm9vbF9tZXJnZUAyMAoKYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX21lcmdlQDE2CgphcmM1OF9yZWtleVRvUGx1Z2luX2Jvb2xfZmFsc2VAMTE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcmM1OF9yZWtleVRvUGx1Z2luX2Jvb2xfbWVyZ2VAMTIKCmFyYzU4X3Jla2V5VG9QbHVnaW5fYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvTmFtZWRQbHVnaW4obmFtZTogYnl0ZXMsIG1ldGhvZE9mZnNldHM6IGJ5dGVzKSAtPiB2b2lkOgphcmM1OF9yZWtleVRvTmFtZWRQbHVnaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQ1MQogICAgLy8gYXJjNThfcmVrZXlUb05hbWVkUGx1Z2luKG5hbWU6IHN0cmluZywgbWV0aG9kT2Zmc2V0czogYXJjNC5EeW5hbWljQXJyYXk8YXJjNC5VaW50TjY0Pik6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2NvbnN0YW50cy50czo1CiAgICAvLyBleHBvcnQgY29uc3QgTkFNRURfUExVR0lOU19CT1hfUFJFRklYID0gJ24nCiAgICBieXRlYyA2IC8vICJuIgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDUyCiAgICAvLyB0aGlzLmFyYzU4X3Jla2V5VG9QbHVnaW4odGhpcy5uYW1lZFBsdWdpbnMobmFtZSkudmFsdWUuYXBwbGljYXRpb24sIG1ldGhvZE9mZnNldHMpOwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFyYzU4X3Jla2V5VG9QbHVnaW4KICAgIGZyYW1lX2J1cnkgLTEKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X2FkZFBsdWdpbihhcHA6IGJ5dGVzLCBhbGxvd2VkQ2FsbGVyOiBieXRlcywgbGFzdFZhbGlkUm91bmQ6IGJ5dGVzLCBjb29sZG93bjogYnl0ZXMsIGFkbWluUHJpdmlsZWdlczogYnl0ZXMsIG1ldGhvZHM6IGJ5dGVzKSAtPiB2b2lkOgphcmM1OF9hZGRQbHVnaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQ2Ny00NzQKICAgIC8vIGFyYzU4X2FkZFBsdWdpbigKICAgIC8vICAgYXBwOiBhcmM0LlVpbnRONjQsCiAgICAvLyAgIGFsbG93ZWRDYWxsZXI6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgbGFzdFZhbGlkUm91bmQ6IGFyYzQuVWludE42NCwKICAgIC8vICAgY29vbGRvd246IGFyYzQuVWludE42NCwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBhcmM0LkJvb2wsCiAgICAvLyAgIG1ldGhvZHM6IGFyYzQuRHluYW1pY0FycmF5PE1ldGhvZFJlc3RyaWN0aW9uPiwKICAgIC8vICk6IHZvaWQgewogICAgcHJvdG8gNiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQ3NgogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuYWRtaW4udmFsdWUsICdTZW5kZXIgbXVzdCBiZSB0aGUgYWRtaW4nKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvY29uc3RhbnRzLnRzOjEKICAgIC8vIGV4cG9ydCBjb25zdCBBRE1JTl9LRVkgPSAnYWRtaW4nCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0NzYKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlLCAnU2VuZGVyIG11c3QgYmUgdGhlIGFkbWluJyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIFNlbmRlciBtdXN0IGJlIHRoZSBhZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0NzcKICAgIC8vIGNvbnN0IGtleSA9IG5ldyBQbHVnaW5zS2V5KHsgYXBwbGljYXRpb246IGFwcCwgYWxsb3dlZENhbGxlcjogYWxsb3dlZENhbGxlciB9KTsKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDc5CiAgICAvLyBsZXQgbWV0aG9kSW5mb3MgPSBuZXcgYXJjNC5EeW5hbWljQXJyYXk8TWV0aG9kSW5mbz4oKTsKICAgIGJ5dGVjIDkgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQ4MAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCgphcmM1OF9hZGRQbHVnaW5fd2hpbGVfdG9wQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQ4MAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgPgogICAgYnogYXJjNThfYWRkUGx1Z2luX2FmdGVyX3doaWxlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDgxLTQ4NQogICAgLy8gbWV0aG9kSW5mb3MucHVzaChuZXcgTWV0aG9kSW5mbyh7CiAgICAvLyAgIHNlbGVjdG9yOiBtZXRob2RzW2ldLnNlbGVjdG9yLAogICAgLy8gICBjb29sZG93bjogbWV0aG9kc1tpXS5jb29sZG93biwKICAgIC8vICAgbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NCgpLAogICAgLy8gfSkpOwogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQ4MgogICAgLy8gc2VsZWN0b3I6IG1ldGhvZHNbaV0uc2VsZWN0b3IsCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICAqCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDQgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQ4MwogICAgLy8gY29vbGRvd246IG1ldGhvZHNbaV0uY29vbGRvd24sCiAgICBzd2FwCiAgICBleHRyYWN0IDQgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDgxLTQ4NQogICAgLy8gbWV0aG9kSW5mb3MucHVzaChuZXcgTWV0aG9kSW5mbyh7CiAgICAvLyAgIHNlbGVjdG9yOiBtZXRob2RzW2ldLnNlbGVjdG9yLAogICAgLy8gICBjb29sZG93bjogbWV0aG9kc1tpXS5jb29sZG93biwKICAgIC8vICAgbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NCgpLAogICAgLy8gfSkpOwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQ4NAogICAgLy8gbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NCgpLAogICAgYnl0ZWMgNSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDgxLTQ4NQogICAgLy8gbWV0aG9kSW5mb3MucHVzaChuZXcgTWV0aG9kSW5mbyh7CiAgICAvLyAgIHNlbGVjdG9yOiBtZXRob2RzW2ldLnNlbGVjdG9yLAogICAgLy8gICBjb29sZG93bjogbWV0aG9kc1tpXS5jb29sZG93biwKICAgIC8vICAgbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NCgpLAogICAgLy8gfSkpOwogICAgY29uY2F0CiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMjAKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0ODAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGFyYzU4X2FkZFBsdWdpbl93aGlsZV90b3BAMQoKYXJjNThfYWRkUGx1Z2luX2FmdGVyX3doaWxlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQ4OC00OTQKICAgIC8vIHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlID0gbmV3IFBsdWdpbkluZm8oewogICAgLy8gICBsYXN0VmFsaWRSb3VuZDogbGFzdFZhbGlkUm91bmQsCiAgICAvLyAgIGNvb2xkb3duOiBjb29sZG93biwKICAgIC8vICAgbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NCgpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGFkbWluUHJpdmlsZWdlcywKICAgIC8vICAgbWV0aG9kczogbWV0aG9kSW5mb3MuY29weSgpLAogICAgLy8gfSk7CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQ5MQogICAgLy8gbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NCgpLAogICAgYnl0ZWMgNSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDg4LTQ5NAogICAgLy8gdGhpcy5wbHVnaW5zKGtleSkudmFsdWUgPSBuZXcgUGx1Z2luSW5mbyh7CiAgICAvLyAgIGxhc3RWYWxpZFJvdW5kOiBsYXN0VmFsaWRSb3VuZCwKICAgIC8vICAgY29vbGRvd246IGNvb2xkb3duLAogICAgLy8gICBsYXN0Q2FsbGVkOiBuZXcgYXJjNC5VaW50TjY0KCksCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogYWRtaW5Qcml2aWxlZ2VzLAogICAgLy8gICBtZXRob2RzOiBtZXRob2RJbmZvcy5jb3B5KCksCiAgICAvLyB9KTsKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDFiCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvY29uc3RhbnRzLnRzOjQKICAgIC8vIGV4cG9ydCBjb25zdCBQTFVHSU5TX0JPWF9QUkVGSVggPSAncCcKICAgIGJ5dGVjXzAgLy8gInAiCiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQ4OC00OTQKICAgIC8vIHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlID0gbmV3IFBsdWdpbkluZm8oewogICAgLy8gICBsYXN0VmFsaWRSb3VuZDogbGFzdFZhbGlkUm91bmQsCiAgICAvLyAgIGNvb2xkb3duOiBjb29sZG93biwKICAgIC8vICAgbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NCgpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGFkbWluUHJpdmlsZWdlcywKICAgIC8vICAgbWV0aG9kczogbWV0aG9kSW5mb3MuY29weSgpLAogICAgLy8gfSk7CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVtb3ZlUGx1Z2luKGFwcDogYnl0ZXMsIGFsbG93ZWRDYWxsZXI6IGJ5dGVzKSAtPiB2b2lkOgphcmM1OF9yZW1vdmVQbHVnaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjUwNQogICAgLy8gYXJjNThfcmVtb3ZlUGx1Z2luKGFwcDogYXJjNC5VaW50TjY0LCBhbGxvd2VkQ2FsbGVyOiBhcmM0LkFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1MDcKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlLCAnU2VuZGVyIG11c3QgYmUgdGhlIGFkbWluJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2NvbnN0YW50cy50czoxCiAgICAvLyBleHBvcnQgY29uc3QgQURNSU5fS0VZID0gJ2FkbWluJwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTA3CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSwgJ1NlbmRlciBtdXN0IGJlIHRoZSBhZG1pbicpOwogICAgPT0KICAgIGFzc2VydCAvLyBTZW5kZXIgbXVzdCBiZSB0aGUgYWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTA5CiAgICAvLyBjb25zdCBrZXkgPSBuZXcgUGx1Z2luc0tleSh7IGFwcGxpY2F0aW9uOiBhcHAsIGFsbG93ZWRDYWxsZXI6IGFsbG93ZWRDYWxsZXIgfSk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2NvbnN0YW50cy50czo0CiAgICAvLyBleHBvcnQgY29uc3QgUExVR0lOU19CT1hfUFJFRklYID0gJ3AnCiAgICBieXRlY18wIC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjUxMAogICAgLy8gYXNzZXJ0KHRoaXMucGx1Z2lucyhrZXkpLmV4aXN0cywgJ3BsdWdpbiBkb2VzIG5vdCBleGlzdCcpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBwbHVnaW4gZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTExCiAgICAvLyB0aGlzLnBsdWdpbnMoa2V5KS5kZWxldGUoKTsKICAgIGJveF9kZWwKICAgIHBvcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfYWRkTmFtZWRQbHVnaW4obmFtZTogYnl0ZXMsIGFwcDogYnl0ZXMsIGFsbG93ZWRDYWxsZXI6IGJ5dGVzLCBsYXN0VmFsaWRSb3VuZDogYnl0ZXMsIGNvb2xkb3duOiBieXRlcywgYWRtaW5Qcml2aWxlZ2VzOiBieXRlcywgbWV0aG9kczogYnl0ZXMpIC0+IHZvaWQ6CmFyYzU4X2FkZE5hbWVkUGx1Z2luOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1MjctNTM1CiAgICAvLyBhcmM1OF9hZGROYW1lZFBsdWdpbigKICAgIC8vICAgbmFtZTogYXJjNC5TdHIsCiAgICAvLyAgIGFwcDogYXJjNC5VaW50TjY0LAogICAgLy8gICBhbGxvd2VkQ2FsbGVyOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgIGxhc3RWYWxpZFJvdW5kOiBhcmM0LlVpbnRONjQsCiAgICAvLyAgIGNvb2xkb3duOiBhcmM0LlVpbnRONjQsCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogYXJjNC5Cb29sLAogICAgLy8gICBtZXRob2RzOiBhcmM0LkR5bmFtaWNBcnJheTxNZXRob2RSZXN0cmljdGlvbj4sCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1MzcKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlLCAnU2VuZGVyIG11c3QgYmUgdGhlIGFkbWluJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2NvbnN0YW50cy50czoxCiAgICAvLyBleHBvcnQgY29uc3QgQURNSU5fS0VZID0gJ2FkbWluJwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTM3CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSwgJ1NlbmRlciBtdXN0IGJlIHRoZSBhZG1pbicpOwogICAgPT0KICAgIGFzc2VydCAvLyBTZW5kZXIgbXVzdCBiZSB0aGUgYWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTM4CiAgICAvLyBhc3NlcnQoIXRoaXMubmFtZWRQbHVnaW5zKG5hbWUubmF0aXZlKS5leGlzdHMpOwogICAgZnJhbWVfZGlnIC03CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9jb25zdGFudHMudHM6NQogICAgLy8gZXhwb3J0IGNvbnN0IE5BTUVEX1BMVUdJTlNfQk9YX1BSRUZJWCA9ICduJwogICAgYnl0ZWMgNiAvLyAibiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1MzgKICAgIC8vIGFzc2VydCghdGhpcy5uYW1lZFBsdWdpbnMobmFtZS5uYXRpdmUpLmV4aXN0cyk7CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU0MAogICAgLy8gY29uc3Qga2V5ID0gbmV3IFBsdWdpbnNLZXkoeyBhcHBsaWNhdGlvbjogYXBwLCBhbGxvd2VkQ2FsbGVyOiBhbGxvd2VkQ2FsbGVyIH0pOwogICAgZnJhbWVfZGlnIC02CiAgICBmcmFtZV9kaWcgLTUKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU0MQogICAgLy8gdGhpcy5uYW1lZFBsdWdpbnMobmFtZS5uYXRpdmUpLnZhbHVlID0ga2V5LmNvcHkoKTsKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTQzCiAgICAvLyBsZXQgbWV0aG9kSW5mb3MgPSBuZXcgYXJjNC5EeW5hbWljQXJyYXk8TWV0aG9kSW5mbz4oKTsKICAgIGJ5dGVjIDkgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU0NAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCgphcmM1OF9hZGROYW1lZFBsdWdpbl93aGlsZV90b3BAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTQ0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICBieiBhcmM1OF9hZGROYW1lZFBsdWdpbl9hZnRlcl93aGlsZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU0NS01NDkKICAgIC8vIG1ldGhvZEluZm9zLnB1c2gobmV3IE1ldGhvZEluZm8oewogICAgLy8gICBzZWxlY3RvcjogbWV0aG9kc1tpXS5zZWxlY3RvciwKICAgIC8vICAgY29vbGRvd246IG1ldGhvZHNbaV0uY29vbGRvd24sCiAgICAvLyAgIGxhc3RDYWxsZWQ6IG5ldyBhcmM0LlVpbnRONjQoKSwKICAgIC8vIH0pKTsKICAgIGZyYW1lX2RpZyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1NDYKICAgIC8vIHNlbGVjdG9yOiBtZXRob2RzW2ldLnNlbGVjdG9yLAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgcHVzaGludCAxMiAvLyAxMgogICAgKgogICAgcHVzaGludCAxMiAvLyAxMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGV4dHJhY3QgMCA0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1NDcKICAgIC8vIGNvb2xkb3duOiBtZXRob2RzW2ldLmNvb2xkb3duLAogICAgc3dhcAogICAgZXh0cmFjdCA0IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU0NS01NDkKICAgIC8vIG1ldGhvZEluZm9zLnB1c2gobmV3IE1ldGhvZEluZm8oewogICAgLy8gICBzZWxlY3RvcjogbWV0aG9kc1tpXS5zZWxlY3RvciwKICAgIC8vICAgY29vbGRvd246IG1ldGhvZHNbaV0uY29vbGRvd24sCiAgICAvLyAgIGxhc3RDYWxsZWQ6IG5ldyBhcmM0LlVpbnRONjQoKSwKICAgIC8vIH0pKTsKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1NDgKICAgIC8vIGxhc3RDYWxsZWQ6IG5ldyBhcmM0LlVpbnRONjQoKSwKICAgIGJ5dGVjIDUgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU0NS01NDkKICAgIC8vIG1ldGhvZEluZm9zLnB1c2gobmV3IE1ldGhvZEluZm8oewogICAgLy8gICBzZWxlY3RvcjogbWV0aG9kc1tpXS5zZWxlY3RvciwKICAgIC8vICAgY29vbGRvd246IG1ldGhvZHNbaV0uY29vbGRvd24sCiAgICAvLyAgIGxhc3RDYWxsZWQ6IG5ldyBhcmM0LlVpbnRONjQoKSwKICAgIC8vIH0pKTsKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDIwCiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTQ0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiBhcmM1OF9hZGROYW1lZFBsdWdpbl93aGlsZV90b3BAMQoKYXJjNThfYWRkTmFtZWRQbHVnaW5fYWZ0ZXJfd2hpbGVAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTUyLTU1OAogICAgLy8gdGhpcy5wbHVnaW5zKGtleSkudmFsdWUgPSBuZXcgUGx1Z2luSW5mbyh7CiAgICAvLyAgIGxhc3RWYWxpZFJvdW5kOiBsYXN0VmFsaWRSb3VuZCwKICAgIC8vICAgY29vbGRvd246IGNvb2xkb3duLAogICAgLy8gICBsYXN0Q2FsbGVkOiBuZXcgYXJjNC5VaW50TjY0KCksCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogYWRtaW5Qcml2aWxlZ2VzLAogICAgLy8gICBtZXRob2RzOiBtZXRob2RJbmZvcy5jb3B5KCksCiAgICAvLyB9KQogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1NTUKICAgIC8vIGxhc3RDYWxsZWQ6IG5ldyBhcmM0LlVpbnRONjQoKSwKICAgIGJ5dGVjIDUgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU1Mi01NTgKICAgIC8vIHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlID0gbmV3IFBsdWdpbkluZm8oewogICAgLy8gICBsYXN0VmFsaWRSb3VuZDogbGFzdFZhbGlkUm91bmQsCiAgICAvLyAgIGNvb2xkb3duOiBjb29sZG93biwKICAgIC8vICAgbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NCgpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGFkbWluUHJpdmlsZWdlcywKICAgIC8vICAgbWV0aG9kczogbWV0aG9kSW5mb3MuY29weSgpLAogICAgLy8gfSkKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDFiCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvY29uc3RhbnRzLnRzOjQKICAgIC8vIGV4cG9ydCBjb25zdCBQTFVHSU5TX0JPWF9QUkVGSVggPSAncCcKICAgIGJ5dGVjXzAgLy8gInAiCiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU1Mi01NTgKICAgIC8vIHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlID0gbmV3IFBsdWdpbkluZm8oewogICAgLy8gICBsYXN0VmFsaWRSb3VuZDogbGFzdFZhbGlkUm91bmQsCiAgICAvLyAgIGNvb2xkb3duOiBjb29sZG93biwKICAgIC8vICAgbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NCgpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGFkbWluUHJpdmlsZWdlcywKICAgIC8vICAgbWV0aG9kczogbWV0aG9kSW5mb3MuY29weSgpLAogICAgLy8gfSkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZW1vdmVOYW1lZFBsdWdpbihuYW1lOiBieXRlcykgLT4gdm9pZDoKYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU2NwogICAgLy8gYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW4obmFtZTogYXJjNC5TdHIpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1NjkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlLCAnU2VuZGVyIG11c3QgYmUgdGhlIGFkbWluJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2NvbnN0YW50cy50czoxCiAgICAvLyBleHBvcnQgY29uc3QgQURNSU5fS0VZID0gJ2FkbWluJwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTY5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSwgJ1NlbmRlciBtdXN0IGJlIHRoZSBhZG1pbicpOwogICAgPT0KICAgIGFzc2VydCAvLyBTZW5kZXIgbXVzdCBiZSB0aGUgYWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTcwCiAgICAvLyBhc3NlcnQodGhpcy5uYW1lZFBsdWdpbnMobmFtZS5uYXRpdmUpLmV4aXN0cywgJ3BsdWdpbiBkb2VzIG5vdCBleGlzdCcpOwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9jb25zdGFudHMudHM6NQogICAgLy8gZXhwb3J0IGNvbnN0IE5BTUVEX1BMVUdJTlNfQk9YX1BSRUZJWCA9ICduJwogICAgYnl0ZWMgNiAvLyAibiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1NzAKICAgIC8vIGFzc2VydCh0aGlzLm5hbWVkUGx1Z2lucyhuYW1lLm5hdGl2ZSkuZXhpc3RzLCAncGx1Z2luIGRvZXMgbm90IGV4aXN0Jyk7CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHBsdWdpbiBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1NzEKICAgIC8vIGNvbnN0IGFwcCA9IHRoaXMubmFtZWRQbHVnaW5zKG5hbWUubmF0aXZlKS52YWx1ZS5jb3B5KCk7CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2NvbnN0YW50cy50czo0CiAgICAvLyBleHBvcnQgY29uc3QgUExVR0lOU19CT1hfUFJFRklYID0gJ3AnCiAgICBieXRlY18wIC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50L2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU3MgogICAgLy8gYXNzZXJ0KHRoaXMucGx1Z2lucyhhcHApLmV4aXN0cywgJ3BsdWdpbiBkb2VzIG5vdCBleGlzdCcpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBwbHVnaW4gZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTc0CiAgICAvLyB0aGlzLm5hbWVkUGx1Z2lucyhuYW1lLm5hdGl2ZSkuZGVsZXRlKCk7CiAgICBzd2FwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTc1CiAgICAvLyB0aGlzLnBsdWdpbnMoYXBwKS5kZWxldGUoKTsKICAgIGJveF9kZWwKICAgIHBvcAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CiAFAAEUGcABJgoBcAVhZG1pbhJjb250cm9sbGVkX2FkZHJlc3MBAAIAGwgAAAAAAAAAAAFuBA+IVJMEFR98dQIAADEbQQBhggQEtMd9cQTSS3VWBF+kScYEE7xE5CcHgggEyVpdPQR2mTCPBD+GFdcEXDTz1gQKihnUBE03I1UE6ou57ATjULnUNhoAjg0A/ADtANgAxwC7AKkAigB3AGIARAAyABEAAiJDMRkURDEYRDYaAYgIQSNDMRkURDEYRDYaATYaAjYaAzYaBDYaBTYaBjYaB4gHoCNDMRkURDEYRDYaATYaAogHcyNDMRkURDEYRDYaATYaAjYaAzYaBDYaBTYaBogG6CNDMRkURDEYRDYaAVcCADYaAogGviNDMRkURDEYRDYaATYaAogErUgjQzEZFEQxGEQ2GgE2GgI2GgOIBHwrIk8CVCcITFCwI0MxGRREMRhENhoBNhoCiAPtI0MxGRREMRhEiAPBI0MxGRREMRhEiAOwJwhMULAjQzEZFEQxGEQ2GgE2GgI2GgOIA04jQzEZFEQxGEQ2GgGIAy8jQzEZFEQxGBRENhoBNhoCiALmI0OKAwEiSYAARwKL/Yv+UChMUEm9RQFAAAQijACJiwW+REklWUsBFVJJjAAiWUmMBBSMAyKMAosCiwQMQQAXiwBXAgCLAiQLJFhXAASL/xJBADMjjAOLBb5MSU4CjAFEIlsyBg9BABoyBosBSU4CgRBbCUyBCFsPQQAHI4sDEIwAiSJC//aLAiMIjAJC/6iKAQGL/zgAMgoSQQAMi/84IDIKEkEAAiOJi/84EIEGEkEAJ4v/OBgyCBJBAB2L/zgbIxJBABSL/zgZQAANi/8iwhonBxJBAAIjiSKJigEHgABHAyiL/1BJvUlPAkhAABUiI0cCIkmL/08MTwxPDE8MTwxPDIkyBosESU4CvkQiWw2MAEm+RIEIWyINjAEyBksBvkSBEFsJSwG+RIEIWwyMA75ESSVZSwEVUiJZIg2MAosFQQAmiwBAACGLA0AAHCOLBYsAiwGLA4sCTwWL/08MTwxPDE8MTwxPDIkiQv/higYLIkcCgABHB4v6iP9ejPpJTgZOBk4FTgROA04CTEAAKosQiw+LDosNiwwiI0mLC4v6i/6MCowJjAiMB4wGjAWMBIwDjAKMAYwAiYsMSRSMBSKMBiKMB0EA1Yv+IlmL/w1Ei/5XAgCL/4EIC1tJjAiL+yLCGkkVSYEEEkSBBBJEi/wWi/1QKExQSYwCvkRJJVlLARVSSYwBVwIATwIkC0mMBCRYSYwASYEEW0mMCkkiDYwDMgZLAoEMWwkNjAlXAAQSQQCmiwpBAAWLCUAAnIsKQQBQMgYWiwBMXAyLAUkiWYsIDUSLBIECCE8CXYsCSb5EVwAISwG+RFcICEsCvkRXEAhLA75EIQRTKyJPAlRPA08DUE8CUExQJwRQTwJQSwG8SL8jiwmMB4sDjAaMBYsLQQAziwVBAC4jixCLD4sOiw2LDIsFiwaLB08Ii/qL/owKjAmMCIwHjAaMBYwEjAOMAowBjACJIkL/zyIjSYwHjAaMBUL/uIoCADEAi/4SQAAIMQCL/xJBAB8jRIv/i/4TRCmL/2eL/jIDEkEABjIKKkxniYv+Qv/3IkL/3ooBADEAIillRBJEKYv/Z4mKAwAxAIv9F0lyCERPAhJEIiplRHMCRExyCEQSRIv9i/5QKExQSb1FAUEAGIsAvkQhBFMrIk8CVCJTQQAHI0Qpi/9niSJC//YiKWVEiYoAACIqZURzAkQiKmVEMgoSQQAHMgOLABJEiTIKQv/2igIAgABJMQAiKWVEEkSxIiplRIAbcmVrZXlpbmcgYWJzdHJhY3RlZCBhY2NvdW50sgWL/rIgi/6yB7IAI7IQIrIBs4v/IlNBAB8ijAExFiMIjACLADIEDEEAC4sAiPyWQQAHI4wBiwFEiYsAIwiMAEL/4IoDAYv9MgOL/4j76kEAAiOJi/2L/ov/iPvciYoCASKAAEcHi/4XSRZJMgNQiPygTgdOBkhOBEhOAkwxAFCI/I9OB04GSE4ESE4CTEAABYsSQQHDI0SLDUEABYsRQAGzI0SLDEEABYsQQAGjI0SLC0AABYsPQQGTI0QijAgijAcxFiMIjAOL/0mMAIz/iwMyBAxBAAuLA4j76kEAPCOMCIsIRLEiKmVEIiplRIsJcghEgBZyZWtleWluZyB0byBwbHVnaW4gYXBwsgWyILIHsgAjshAisgGziYsDOBCBBhNBAA2LAIsDIwiMA4wAQv+diwNJOBiLCUlOAxJESTgZFERJOBsjDURJI8IaFzIIEkQyA4sKSwJLBE8Di/+LB0lOCIj8P4z/jAqMAk4KRgSMAUYCMQCLDk8CTwNPA4v/TwWI/CCM/4wOjAaMBUYEjARGAkEABYsFQACuI0SLAkAABYsGQQCeI0SLAkEATYsBQQBIMgYWKIsKUEm+REklWUsBFVJLAb5EVwAISwK+RFcICEsDvkQhBFMrIk8CVE4CUE8EUExQJwRQTFBLAbxIv4sHIwiMB4v/Qv8siwZB//CLBEH/6zIGFiiLDlBJvkRJJVlLARVSSwG+RFcACEsCvkRXCAhLA75EIQRTKyJPAlROAlBPBFBMUCcEUExQSwG8SL9C/6siQv9fIkL/TyJC/moiQv5aIkL+SiJC/jqKAgAnBov+UL5EVwAIi/+I/e+M/4mKBgAxACIpZUQSRIv6i/tQJwkii/8iWYsCDUEANYsBVwIAi/9XAgCLAklOA4EMC4EMWElXAARMVwQIUCcFUFBJFSQKFlcGAkxQjAEjCIwCQv/Bi/yL/VAnBVCL/lAnBFCLAVAoiwBQSbxITL+JigIAMQAiKWVEEkSL/ov/UChMUEm9RQFEvEiJigcAMQAiKWVEEkSL+VcCACcGTFBJvUUBFESL+ov7UElOAr8nCSKL/yJZiwINQQA1iwFXAgCL/1cCAIsCSU4DgQwLgQxYSVcABExXBAhQJwVQUEkVJAoWVwYCTFCMASMIjAJC/8GL/Iv9UCcFUIv+UCcEUIsBUCiLAFBJvEhMv4mKAQAxACIpZUQSRIv/VwIAJwZMUEm9RQFESb5EKExQSb1FAURMvEi8SIk=", "clear": "CoEBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 4, "minor": 5, "patch": 3 } }, "events": [], "templateVariables": {} }