{ "name": "AbstractedAccount", "structs": { "PluginInfo": [ { "name": "lastValidRound", "type": "uint64" }, { "name": "cooldown", "type": "uint64" }, { "name": "lastCalled", "type": "uint64" }, { "name": "adminPrivileges", "type": "bool" } ], "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" } ], "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" } ], "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" } ], "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" } ], "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" } ], "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" } ], "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": "YQ==", "desc": "The admin of the abstracted account. This address can add plugins and initiate rekeys" }, "controlledAddress": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "Yw==", "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": [ 923, 1128, 1267 ], "errorMessage": "Box must have value" }, { "pc": [ 925, 934, 1129 ], "errorMessage": "Index access is out of bounds" }, { "pc": [ 1100 ], "errorMessage": "Invalid app arg" }, { "pc": [ 1095 ], "errorMessage": "Invalid app arg length" }, { "pc": [ 1075 ], "errorMessage": "Invalid app call" }, { "pc": [ 1086 ], "errorMessage": "Invalid number of app args" }, { "pc": [ 1080 ], "errorMessage": "Invalid onCompletion" }, { "pc": [ 145, 160, 190, 208, 235, 250, 265, 294, 312, 324, 341, 362, 377 ], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [ 413 ], "errorMessage": "Sender must be either controlledAddress or admin" }, { "pc": [ 457, 580, 1146, 1180, 1202, 1255 ], "errorMessage": "Sender must be the admin" }, { "pc": [ 478 ], "errorMessage": "Sender must be the plugin" }, { "pc": [ 520 ], "errorMessage": "This plugin does not have admin privileges" }, { "pc": [ 491 ], "errorMessage": "This plugin is not in control of the account" }, { "pc": [ 853 ], "errorMessage": "This sender is not allowed to trigger this plugin" }, { "pc": [ 485, 544 ], "errorMessage": "account funded" }, { "pc": [ 474, 489, 867 ], "errorMessage": "application exists" }, { "pc": [ 381 ], "errorMessage": "can only call when creating" }, { "pc": [ 148, 163, 193, 211, 238, 253, 268, 297, 315, 327, 344, 365 ], "errorMessage": "can only call when not creating" }, { "pc": [ 455, 482, 533, 541, 548, 578, 585, 665, 858, 862, 984, 1144, 1178, 1200, 1253 ], "errorMessage": "check GlobalState exists" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDYgMTkyCiAgICBieXRlY2Jsb2NrICJhIiAiYyIgInAiIDB4MGY4ODU0OTMgMHgwMCAibiIgMHgxNTFmN2M3NSAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFic3RyYWN0ZWRBY2NvdW50IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOQogICAgcHVzaGJ5dGVzcyAweGI0Yzc3ZDcxIDB4ZDI0Yjc1NTYgMHg1ZmE0NDljNiAweDEzYmM0NGU0IC8vIG1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oYWRkcmVzcyxhZGRyZXNzKXZvaWQiLCBtZXRob2QgImFyYzU4X2NoYW5nZUFkbWluKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW4odWludDY0LGFkZHJlc3MsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJhcmM1OF9nZXRBZG1pbigpYWRkcmVzcyIKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJhcmM1OF92ZXJpZnlBdXRoQWRkcigpdm9pZCIKICAgIHB1c2hieXRlc3MgMHhjOTVhNWQzZCAweGU5MDI2ZGE4IDB4N2M3NjZkZGMgMHg1NmYyOGI1OCAweGQxMmRjYjYxIDB4NGQzNzIzNTUgMHg4YTcyYTc1MCAweGUzNTBiOWQ0IC8vIG1ldGhvZCAiYXJjNThfcmVrZXlUbyhhZGRyZXNzLGJvb2wpdm9pZCIsIG1ldGhvZCAiYXJjNThfY2FuQ2FsbCh1aW50NjQsYWRkcmVzcylib29sIiwgbWV0aG9kICJhcmM1OF9yZWtleVRvUGx1Z2luKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJhcmM1OF9yZWtleVRvTmFtZWRQbHVnaW4oc3RyaW5nKXZvaWQiLCBtZXRob2QgImFyYzU4X2FkZFBsdWdpbih1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZCIsIG1ldGhvZCAiYXJjNThfcmVtb3ZlUGx1Z2luKHVpbnQ2NCxhZGRyZXNzKXZvaWQiLCBtZXRob2QgImFyYzU4X2FkZE5hbWVkUGx1Z2luKHN0cmluZyx1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZCIsIG1ldGhvZCAiYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW4oc3RyaW5nKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDMgbWFpbl9hcmM1OF9jaGFuZ2VBZG1pbl9yb3V0ZUA0IG1haW5fYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW5fcm91dGVANSBtYWluX2FyYzU4X2dldEFkbWluX3JvdXRlQDYgbWFpbl9hcmM1OF92ZXJpZnlBdXRoQWRkcl9yb3V0ZUA3IG1haW5fYXJjNThfcmVrZXlUb19yb3V0ZUA4IG1haW5fYXJjNThfY2FuQ2FsbF9yb3V0ZUA5IG1haW5fYXJjNThfcmVrZXlUb1BsdWdpbl9yb3V0ZUAxMCBtYWluX2FyYzU4X3Jla2V5VG9OYW1lZFBsdWdpbl9yb3V0ZUAxMSBtYWluX2FyYzU4X2FkZFBsdWdpbl9yb3V0ZUAxMiBtYWluX2FyYzU4X3JlbW92ZVBsdWdpbl9yb3V0ZUAxMyBtYWluX2FyYzU4X2FkZE5hbWVkUGx1Z2luX3JvdXRlQDE0IG1haW5fYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW5fcm91dGVAMTUKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxOToKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFic3RyYWN0ZWRBY2NvdW50IGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl9hcmM1OF9yZW1vdmVOYW1lZFBsdWdpbl9yb3V0ZUAxNToKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozODgKICAgIC8vIGFyYzU4X3JlbW92ZU5hbWVkUGx1Z2luKG5hbWU6IGFyYzQuU3RyKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFic3RyYWN0ZWRBY2NvdW50IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM4OAogICAgLy8gYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW4obmFtZTogYXJjNC5TdHIpOiB2b2lkIHsKICAgIGNhbGxzdWIgYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjNThfYWRkTmFtZWRQbHVnaW5fcm91dGVAMTQ6CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzU4LTM2NQogICAgLy8gYXJjNThfYWRkTmFtZWRQbHVnaW4oCiAgICAvLyAgIG5hbWU6IGFyYzQuU3RyLAogICAgLy8gICBhcHA6IGFyYzQuVWludE42NCwKICAgIC8vICAgYWxsb3dlZENhbGxlcjogYXJjNC5BZGRyZXNzLAogICAgLy8gICBsYXN0VmFsaWRSb3VuZDogYXJjNC5VaW50TjY0LAogICAgLy8gICBjb29sZG93bjogYXJjNC5VaW50TjY0LAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGFyYzQuQm9vbAogICAgLy8gKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFic3RyYWN0ZWRBY2NvdW50IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM1OC0zNjUKICAgIC8vIGFyYzU4X2FkZE5hbWVkUGx1Z2luKAogICAgLy8gICBuYW1lOiBhcmM0LlN0ciwKICAgIC8vICAgYXBwOiBhcmM0LlVpbnRONjQsCiAgICAvLyAgIGFsbG93ZWRDYWxsZXI6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgbGFzdFZhbGlkUm91bmQ6IGFyYzQuVWludE42NCwKICAgIC8vICAgY29vbGRvd246IGFyYzQuVWludE42NCwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBhcmM0LkJvb2wKICAgIC8vICk6IHZvaWQgewogICAgY2FsbHN1YiBhcmM1OF9hZGROYW1lZFBsdWdpbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmM1OF9yZW1vdmVQbHVnaW5fcm91dGVAMTM6CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzM4CiAgICAvLyBhcmM1OF9yZW1vdmVQbHVnaW4oYXBwOiBhcmM0LlVpbnRONjQsIGFsbG93ZWRDYWxsZXI6IGFyYzQuQWRkcmVzcyk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjQKICAgIC8vIGV4cG9ydCBjbGFzcyBBYnN0cmFjdGVkQWNjb3VudCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMzgKICAgIC8vIGFyYzU4X3JlbW92ZVBsdWdpbihhcHA6IGFyYzQuVWludE42NCwgYWxsb3dlZENhbGxlcjogYXJjNC5BZGRyZXNzKTogdm9pZCB7CiAgICBjYWxsc3ViIGFyYzU4X3JlbW92ZVBsdWdpbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmM1OF9hZGRQbHVnaW5fcm91dGVAMTI6CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzEyLTMxOAogICAgLy8gYXJjNThfYWRkUGx1Z2luKAogICAgLy8gICBhcHA6IGFyYzQuVWludE42NCwKICAgIC8vICAgYWxsb3dlZENhbGxlcjogYXJjNC5BZGRyZXNzLAogICAgLy8gICBsYXN0VmFsaWRSb3VuZDogYXJjNC5VaW50TjY0LAogICAgLy8gICBjb29sZG93bjogYXJjNC5VaW50TjY0LAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGFyYzQuQm9vbAogICAgLy8gKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFic3RyYWN0ZWRBY2NvdW50IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjMxMi0zMTgKICAgIC8vIGFyYzU4X2FkZFBsdWdpbigKICAgIC8vICAgYXBwOiBhcmM0LlVpbnRONjQsCiAgICAvLyAgIGFsbG93ZWRDYWxsZXI6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgbGFzdFZhbGlkUm91bmQ6IGFyYzQuVWludE42NCwKICAgIC8vICAgY29vbGRvd246IGFyYzQuVWludE42NCwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBhcmM0LkJvb2wKICAgIC8vICk6IHZvaWQgewogICAgY2FsbHN1YiBhcmM1OF9hZGRQbHVnaW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjNThfcmVrZXlUb05hbWVkUGx1Z2luX3JvdXRlQDExOgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI5OAogICAgLy8gYXJjNThfcmVrZXlUb05hbWVkUGx1Z2luKG5hbWU6IGFyYzQuU3RyKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFic3RyYWN0ZWRBY2NvdW50IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI5OAogICAgLy8gYXJjNThfcmVrZXlUb05hbWVkUGx1Z2luKG5hbWU6IGFyYzQuU3RyKTogdm9pZCB7CiAgICBjYWxsc3ViIGFyYzU4X3Jla2V5VG9OYW1lZFBsdWdpbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmM1OF9yZWtleVRvUGx1Z2luX3JvdXRlQDEwOgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI2MQogICAgLy8gYXJjNThfcmVrZXlUb1BsdWdpbihwbHVnaW46IGFyYzQuVWludE42NCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjQKICAgIC8vIGV4cG9ydCBjbGFzcyBBYnN0cmFjdGVkQWNjb3VudCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNjEKICAgIC8vIGFyYzU4X3Jla2V5VG9QbHVnaW4ocGx1Z2luOiBhcmM0LlVpbnRONjQpOiB2b2lkIHsKICAgIGNhbGxzdWIgYXJjNThfcmVrZXlUb1BsdWdpbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmM1OF9jYW5DYWxsX3JvdXRlQDk6CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjQ4CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI0CiAgICAvLyBleHBvcnQgY2xhc3MgQWJzdHJhY3RlZEFjY291bnQgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjQ4CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgYXJjNThfY2FuQ2FsbAogICAgYnl0ZWMgNCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDYgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjNThfcmVrZXlUb19yb3V0ZUA4OgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjIxMAogICAgLy8gYXJjNThfcmVrZXlUbyhhZGRyZXNzOiBhcmM0LkFkZHJlc3MsIGZsYXNoOiBhcmM0LkJvb2wpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI0CiAgICAvLyBleHBvcnQgY2xhc3MgQWJzdHJhY3RlZEFjY291bnQgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjEwCiAgICAvLyBhcmM1OF9yZWtleVRvKGFkZHJlc3M6IGFyYzQuQWRkcmVzcywgZmxhc2g6IGFyYzQuQm9vbCk6IHZvaWQgewogICAgY2FsbHN1YiBhcmM1OF9yZWtleVRvCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzU4X3ZlcmlmeUF1dGhBZGRyX3JvdXRlQDc6CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjAwCiAgICAvLyBhcmM1OF92ZXJpZnlBdXRoQWRkcigpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBhcmM1OF92ZXJpZnlBdXRoQWRkcgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmM1OF9nZXRBZG1pbl9yb3V0ZUA2OgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE5MgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYXJjNThfZ2V0QWRtaW4KICAgIGJ5dGVjIDYgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW5fcm91dGVANToKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxNjkKICAgIC8vIGFyYzU4X3BsdWdpbkNoYW5nZUFkbWluKHBsdWdpbjogYXJjNC5VaW50TjY0LCBhbGxvd2VkQ2FsbGVyOiBhcmM0LkFkZHJlc3MsIG5ld0FkbWluOiBhcmM0LkFkZHJlc3MpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI0CiAgICAvLyBleHBvcnQgY2xhc3MgQWJzdHJhY3RlZEFjY291bnQgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTY5CiAgICAvLyBhcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbihwbHVnaW46IGFyYzQuVWludE42NCwgYWxsb3dlZENhbGxlcjogYXJjNC5BZGRyZXNzLCBuZXdBZG1pbjogYXJjNC5BZGRyZXNzKTogdm9pZCB7CiAgICBjYWxsc3ViIGFyYzU4X3BsdWdpbkNoYW5nZUFkbWluCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzU4X2NoYW5nZUFkbWluX3JvdXRlQDQ6CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTU1CiAgICAvLyBhcmM1OF9jaGFuZ2VBZG1pbihuZXdBZG1pbjogYXJjNC5BZGRyZXNzKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFic3RyYWN0ZWRBY2NvdW50IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE1NQogICAgLy8gYXJjNThfY2hhbmdlQWRtaW4obmV3QWRtaW46IGFyYzQuQWRkcmVzcyk6IHZvaWQgewogICAgY2FsbHN1YiBhcmM1OF9jaGFuZ2VBZG1pbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVBcHBsaWNhdGlvbl9yb3V0ZUAzOgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjEzNAogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZSd9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFic3RyYWN0ZWRBY2NvdW50IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjEzNAogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZSd9KQogICAgY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuY3JlYXRlQXBwbGljYXRpb24oY29udHJvbGxlZEFkZHJlc3M6IGJ5dGVzLCBhZG1pbjogYnl0ZXMpIC0+IHZvaWQ6CmNyZWF0ZUFwcGxpY2F0aW9uOgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjEzNC0xMzUKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnfSkKICAgIC8vIGNyZWF0ZUFwcGxpY2F0aW9uKGNvbnRyb2xsZWRBZGRyZXNzOiBhcmM0LkFkZHJlc3MsIGFkbWluOiBhcmM0LkFkZHJlc3MpIHsKICAgIHByb3RvIDIgMAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE0MAogICAgLy8gVHhuLnNlbmRlciA9PT0gY29udHJvbGxlZEFkZHJlc3MubmF0aXZlCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTQwLTE0MQogICAgLy8gVHhuLnNlbmRlciA9PT0gY29udHJvbGxlZEFkZHJlc3MubmF0aXZlCiAgICAvLyB8fCBUeG4uc2VuZGVyID09PSBhZG1pbi5uYXRpdmUsCiAgICBibnogY3JlYXRlQXBwbGljYXRpb25fYm9vbF90cnVlQDIKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxNDEKICAgIC8vIHx8IFR4bi5zZW5kZXIgPT09IGFkbWluLm5hdGl2ZSwKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxNDAtMTQxCiAgICAvLyBUeG4uc2VuZGVyID09PSBjb250cm9sbGVkQWRkcmVzcy5uYXRpdmUKICAgIC8vIHx8IFR4bi5zZW5kZXIgPT09IGFkbWluLm5hdGl2ZSwKICAgIGJ6IGNyZWF0ZUFwcGxpY2F0aW9uX2Jvb2xfZmFsc2VAMwoKY3JlYXRlQXBwbGljYXRpb25fYm9vbF90cnVlQDI6CiAgICBpbnRjXzEgLy8gMQoKY3JlYXRlQXBwbGljYXRpb25fYm9vbF9tZXJnZUA0OgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjEzOS0xNDMKICAgIC8vIGFzc2VydCgKICAgIC8vICAgVHhuLnNlbmRlciA9PT0gY29udHJvbGxlZEFkZHJlc3MubmF0aXZlCiAgICAvLyAgIHx8IFR4bi5zZW5kZXIgPT09IGFkbWluLm5hdGl2ZSwKICAgIC8vICAgJ1NlbmRlciBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkQWRkcmVzcyBvciBhZG1pbicKICAgIC8vICk7CiAgICBhc3NlcnQgLy8gU2VuZGVyIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWRBZGRyZXNzIG9yIGFkbWluCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTQ0CiAgICAvLyBhc3NlcnQoYWRtaW4gIT09IGNvbnRyb2xsZWRBZGRyZXNzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjcKICAgIC8vIGFkbWluID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdhJyB9KTsKICAgIGJ5dGVjXzAgLy8gImEiCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTQ2CiAgICAvLyB0aGlzLmFkbWluLnZhbHVlID0gYWRtaW4ubmF0aXZlOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE0NwogICAgLy8gdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSA9IGNvbnRyb2xsZWRBZGRyZXNzLm5hdGl2ZSA9PT0gR2xvYmFsLnplcm9BZGRyZXNzID8gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MgOiBjb250cm9sbGVkQWRkcmVzcy5uYXRpdmU7CiAgICBmcmFtZV9kaWcgLTIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGJ6IGNyZWF0ZUFwcGxpY2F0aW9uX3Rlcm5hcnlfZmFsc2VANgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCmNyZWF0ZUFwcGxpY2F0aW9uX3Rlcm5hcnlfbWVyZ2VANzoKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMAogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogJ2MnIH0pOwogICAgYnl0ZWNfMSAvLyAiYyIKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxNDcKICAgIC8vIHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUgPSBjb250cm9sbGVkQWRkcmVzcy5uYXRpdmUgPT09IEdsb2JhbC56ZXJvQWRkcmVzcyA/IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzIDogY29udHJvbGxlZEFkZHJlc3MubmF0aXZlOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9mYWxzZUA2OgogICAgZnJhbWVfZGlnIC0yCiAgICBiIGNyZWF0ZUFwcGxpY2F0aW9uX3Rlcm5hcnlfbWVyZ2VANwoKY3JlYXRlQXBwbGljYXRpb25fYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlQXBwbGljYXRpb25fYm9vbF9tZXJnZUA0CgoKLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9jaGFuZ2VBZG1pbihuZXdBZG1pbjogYnl0ZXMpIC0+IHZvaWQ6CmFyYzU4X2NoYW5nZUFkbWluOgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE1NQogICAgLy8gYXJjNThfY2hhbmdlQWRtaW4obmV3QWRtaW46IGFyYzQuQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTU3CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSwgJ1NlbmRlciBtdXN0IGJlIHRoZSBhZG1pbicpOwogICAgdHhuIFNlbmRlcgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI3CiAgICAvLyBhZG1pbiA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnYScgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTU3CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSwgJ1NlbmRlciBtdXN0IGJlIHRoZSBhZG1pbicpOwogICAgPT0KICAgIGFzc2VydCAvLyBTZW5kZXIgbXVzdCBiZSB0aGUgYWRtaW4KICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNwogICAgLy8gYWRtaW4gPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogJ2EnIH0pOwogICAgYnl0ZWNfMCAvLyAiYSIKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxNTgKICAgIC8vIHRoaXMuYWRtaW4udmFsdWUgPSBuZXdBZG1pbi5uYXRpdmU7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluKHBsdWdpbjogYnl0ZXMsIGFsbG93ZWRDYWxsZXI6IGJ5dGVzLCBuZXdBZG1pbjogYnl0ZXMpIC0+IHZvaWQ6CmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluOgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE2OQogICAgLy8gYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW4ocGx1Z2luOiBhcmM0LlVpbnRONjQsIGFsbG93ZWRDYWxsZXI6IGFyYzQuQWRkcmVzcywgbmV3QWRtaW46IGFyYzQuQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMyAwCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTcxCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gQXBwbGljYXRpb24ocGx1Z2luLm5hdGl2ZSkuYWRkcmVzcywgJ1NlbmRlciBtdXN0IGJlIHRoZSBwbHVnaW4nKTsKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMwogICAgYnRvaQogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gU2VuZGVyIG11c3QgYmUgdGhlIHBsdWdpbgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjMwCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnYycgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTczCiAgICAvLyB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLmF1dGhBZGRyZXNzID09PSBBcHBsaWNhdGlvbihwbHVnaW4ubmF0aXZlKS5hZGRyZXNzLAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RBdXRoQWRkcgogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBzd2FwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE3Mi0xNzUKICAgIC8vIGFzc2VydCgKICAgIC8vICAgdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZS5hdXRoQWRkcmVzcyA9PT0gQXBwbGljYXRpb24ocGx1Z2luLm5hdGl2ZSkuYWRkcmVzcywKICAgIC8vICAgJ1RoaXMgcGx1Z2luIGlzIG5vdCBpbiBjb250cm9sIG9mIHRoZSBhY2NvdW50JwogICAgLy8gKTsKICAgIGFzc2VydCAvLyBUaGlzIHBsdWdpbiBpcyBub3QgaW4gY29udHJvbCBvZiB0aGUgYWNjb3VudAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE3NwogICAgLy8gY29uc3Qga2V5ID0gbmV3IFBsdWdpbnNLZXkoeyBhcHBsaWNhdGlvbjogcGx1Z2luLCBhbGxvd2VkQ2FsbGVyOiBhbGxvd2VkQ2FsbGVyIH0pOwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM1CiAgICAvLyBwbHVnaW5zID0gQm94TWFwPFBsdWdpbnNLZXksIFBsdWdpbkluZm8+KHsga2V5UHJlZml4OiAncCcgfSk7CiAgICBieXRlY18yIC8vICJwIgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE3OQogICAgLy8gY29uc3QgW3AsIGV4aXN0c10gPSB0aGlzLnBsdWdpbnMubWF5YmUoa2V5KTsKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE4MQogICAgLy8gZXhpc3RzICYmIHAuYWRtaW5Qcml2aWxlZ2VzLm5hdGl2ZSwKICAgIGJ6IGFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2Jvb2xfZmFsc2VAMwogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMyAvLyAxOTIKICAgIGdldGJpdAogICAgYnl0ZWMgNCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ6IGFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2Jvb2xfbWVyZ2VANDoKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxODAtMTgzCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIGV4aXN0cyAmJiBwLmFkbWluUHJpdmlsZWdlcy5uYXRpdmUsCiAgICAvLyAgICdUaGlzIHBsdWdpbiBkb2VzIG5vdCBoYXZlIGFkbWluIHByaXZpbGVnZXMnCiAgICAvLyApOwogICAgYXNzZXJ0IC8vIFRoaXMgcGx1Z2luIGRvZXMgbm90IGhhdmUgYWRtaW4gcHJpdmlsZWdlcwogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI3CiAgICAvLyBhZG1pbiA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnYScgfSk7CiAgICBieXRlY18wIC8vICJhIgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE4NQogICAgLy8gdGhpcy5hZG1pbi52YWx1ZSA9IG5ld0FkbWluLm5hdGl2ZTsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW5fYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW5fYm9vbF9tZXJnZUA0CgoKLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9nZXRBZG1pbigpIC0+IGJ5dGVzOgphcmM1OF9nZXRBZG1pbjoKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNwogICAgLy8gYWRtaW4gPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogJ2EnIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjE5NAogICAgLy8gcmV0dXJuIG5ldyBhcmM0LkFkZHJlc3ModGhpcy5hZG1pbi52YWx1ZSk7CiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3ZlcmlmeUF1dGhBZGRyKCkgLT4gdm9pZDoKYXJjNThfdmVyaWZ5QXV0aEFkZHI6CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjAwCiAgICAvLyBhcmM1OF92ZXJpZnlBdXRoQWRkcigpOiB2b2lkIHsKICAgIHByb3RvIDAgMAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjMwCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnYycgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjAxCiAgICAvLyBhc3NlcnQodGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZS5hdXRoQWRkcmVzcyA9PT0gdGhpcy5nZXRBdXRoQWRkcigpKTsKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjMwCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnYycgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTIyCiAgICAvLyByZXR1cm4gdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjEyMi0xMjQKICAgIC8vIHJldHVybiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gICA/IEdsb2JhbC56ZXJvQWRkcmVzcyAvLyBjb250cmFjdCBjb250cm9scyBpdHNlbGYKICAgIC8vICAgOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzczsgLy8gY29udHJhY3QgY29udHJvbHMgYSBkaWZmZXJlbnQgYWNjb3VudAogICAgYnogYXJjNThfdmVyaWZ5QXV0aEFkZHJfdGVybmFyeV9mYWxzZUAzCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTIzCiAgICAvLyA/IEdsb2JhbC56ZXJvQWRkcmVzcyAvLyBjb250cmFjdCBjb250cm9scyBpdHNlbGYKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwoKYXJjNThfdmVyaWZ5QXV0aEFkZHJfdGVybmFyeV9tZXJnZUA0OgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjIwMQogICAgLy8gYXNzZXJ0KHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUuYXV0aEFkZHJlc3MgPT09IHRoaXMuZ2V0QXV0aEFkZHIoKSk7CiAgICBmcmFtZV9kaWcgMAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgphcmM1OF92ZXJpZnlBdXRoQWRkcl90ZXJuYXJ5X2ZhbHNlQDM6CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTI0CiAgICAvLyA6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzOyAvLyBjb250cmFjdCBjb250cm9scyBhIGRpZmZlcmVudCBhY2NvdW50CiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYiBhcmM1OF92ZXJpZnlBdXRoQWRkcl90ZXJuYXJ5X21lcmdlQDQKCgovLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG8oYWRkcmVzczogYnl0ZXMsIGZsYXNoOiBieXRlcykgLT4gdm9pZDoKYXJjNThfcmVrZXlUbzoKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyMTAKICAgIC8vIGFyYzU4X3Jla2V5VG8oYWRkcmVzczogYXJjNC5BZGRyZXNzLCBmbGFzaDogYXJjNC5Cb29sKTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjEyCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSwgJ1NlbmRlciBtdXN0IGJlIHRoZSBhZG1pbicpOwogICAgdHhuIFNlbmRlcgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI3CiAgICAvLyBhZG1pbiA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnYScgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjEyCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSwgJ1NlbmRlciBtdXN0IGJlIHRoZSBhZG1pbicpOwogICAgPT0KICAgIGFzc2VydCAvLyBTZW5kZXIgbXVzdCBiZSB0aGUgYWRtaW4KICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyMTQtMjIyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGFkZHJlc3MubmF0aXZlLAogICAgLy8gICAgIHJla2V5VG86IGFkZHJlc3MubmF0aXZlLAogICAgLy8gICAgIG5vdGU6ICdyZWtleWluZyBhYnN0cmFjdGVkIGFjY291bnQnLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjMwCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnYycgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjE5CiAgICAvLyBub3RlOiAncmVrZXlpbmcgYWJzdHJhY3RlZCBhY2NvdW50JywKICAgIHB1c2hieXRlcyAicmVrZXlpbmcgYWJzdHJhY3RlZCBhY2NvdW50IgogICAgaXR4bl9maWVsZCBOb3RlCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgUmVrZXlUbwogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjIxNC0yMjEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWNlaXZlcjogYWRkcmVzcy5uYXRpdmUsCiAgICAvLyAgICAgcmVrZXlUbzogYWRkcmVzcy5uYXRpdmUsCiAgICAvLyAgICAgbm90ZTogJ3Jla2V5aW5nIGFic3RyYWN0ZWQgYWNjb3VudCcsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyMjAKICAgIC8vIGZlZTogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjIxNC0yMjIKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWNlaXZlcjogYWRkcmVzcy5uYXRpdmUsCiAgICAvLyAgICAgcmVrZXlUbzogYWRkcmVzcy5uYXRpdmUsCiAgICAvLyAgICAgbm90ZTogJ3Jla2V5aW5nIGFic3RyYWN0ZWQgYWNjb3VudCcsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjIyNAogICAgLy8gaWYgKGZsYXNoLm5hdGl2ZSkgdGhpcy52ZXJpZnlSZWtleVRvQWJzdHJhY3RlZEFjY291bnQoKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnogYXJjNThfcmVrZXlUb19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0NgogICAgLy8gbGV0IHJla2V5ZWRCYWNrID0gZmFsc2U7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDgKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IChUeG4uZ3JvdXBJbmRleCArIDEpOyBpIDwgR2xvYmFsLmdyb3VwU2l6ZTsgaSArPSAxKSB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKYXJjNThfcmVrZXlUb193aGlsZV90b3BANToKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gKFR4bi5ncm91cEluZGV4ICsgMSk7IGkgPCBHbG9iYWwuZ3JvdXBTaXplOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICA8CiAgICBieiBhcmM1OF9yZWtleVRvX2Jsb2NrQDE3CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTIKICAgIC8vIGlmICh0eG4uc2VuZGVyID09PSB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlICYmIHR4bi5yZWtleVRvID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykgewogICAgZnJhbWVfZGlnIDAKICAgIGd0eG5zIFNlbmRlcgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjMwCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnYycgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTIKICAgIC8vIGlmICh0eG4uc2VuZGVyID09PSB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlICYmIHR4bi5yZWtleVRvID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykgewogICAgPT0KICAgIGJ6IGFyYzU4X3Jla2V5VG9fYWZ0ZXJfaWZfZWxzZUA5CiAgICBmcmFtZV9kaWcgMAogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBieiBhcmM1OF9yZWtleVRvX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjUzCiAgICAvLyByZWtleWVkQmFjayA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAxCgphcmM1OF9yZWtleVRvX2Jsb2NrQDE3OgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjcxCiAgICAvLyBhc3NlcnQocmVrZXllZEJhY2spOwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydAoKYXJjNThfcmVrZXlUb19hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCmFyYzU4X3Jla2V5VG9fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjU5CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgZnJhbWVfZGlnIDAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gNgogICAgPT0KICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1OS02MAogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICBieiBhcmM1OF9yZWtleVRvX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo2MAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIGZyYW1lX2RpZyAwCiAgICBndHhucyBBcHBsaWNhdGlvbklECiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgID09CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTktNjAKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogYXJjNThfcmVrZXlUb19hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NjIKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IGFyYzQuT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBmcmFtZV9kaWcgMAogICAgZ3R4bnMgT25Db21wbGV0aW9uCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NTktNjIKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gYXJjNC5PbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIGJueiBhcmM1OF9yZWtleVRvX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo2MwogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDEKICAgIGZyYW1lX2RpZyAwCiAgICBndHhucyBOdW1BcHBBcmdzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1OS02MwogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAvLyBAdHMtZXhwZWN0LWVycm9yCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBhcmM0Lk9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDEKICAgIGJ6IGFyYzU4X3Jla2V5VG9fYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjY0CiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gYXJjNC5tZXRob2RTZWxlY3RvcignYXJjNThfdmVyaWZ5QXV0aEFkZHIoKXZvaWQnKQogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMCAvLyAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWNfMyAvLyBtZXRob2QgImFyYzU4X3ZlcmlmeUF1dGhBZGRyKCl2b2lkIgogICAgPT0KICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo1OS02NAogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAvLyBAdHMtZXhwZWN0LWVycm9yCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBhcmM0Lk9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDEKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBhcmM0Lm1ldGhvZFNlbGVjdG9yKCdhcmM1OF92ZXJpZnlBdXRoQWRkcigpdm9pZCcpCiAgICBieiBhcmM1OF9yZWtleVRvX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo2NgogICAgLy8gcmVrZXllZEJhY2sgPSB0cnVlOwogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjY3CiAgICAvLyBicmVhazsKICAgIGIgYXJjNThfcmVrZXlUb19ibG9ja0AxNwoKYXJjNThfcmVrZXlUb19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjQ4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAoVHhuLmdyb3VwSW5kZXggKyAxKTsgaSA8IEdsb2JhbC5ncm91cFNpemU7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgYXJjNThfcmVrZXlUb193aGlsZV90b3BANQoKCi8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQucGx1Z2luQ2FsbEFsbG93ZWQoYXBwOiB1aW50NjQsIGNhbGxlcjogYnl0ZXMpIC0+IHVpbnQ2NDoKcGx1Z2luQ2FsbEFsbG93ZWQ6CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjI3CiAgICAvLyBwcml2YXRlIHBsdWdpbkNhbGxBbGxvd2VkKGFwcDogQXBwbGljYXRpb24sIGNhbGxlcjogQWNjb3VudCk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjI5CiAgICAvLyBhcHBsaWNhdGlvbjogbmV3IGFyYzQuVWludE42NChhcHAuaWQpLAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjI4LTIzMQogICAgLy8gY29uc3Qga2V5ID0gbmV3IFBsdWdpbnNLZXkoewogICAgLy8gICBhcHBsaWNhdGlvbjogbmV3IGFyYzQuVWludE42NChhcHAuaWQpLAogICAgLy8gICBhbGxvd2VkQ2FsbGVyOiBuZXcgYXJjNC5BZGRyZXNzKGNhbGxlcikKICAgIC8vIH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozNQogICAgLy8gcGx1Z2lucyA9IEJveE1hcDxQbHVnaW5zS2V5LCBQbHVnaW5JbmZvPih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWNfMiAvLyAicCIKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyMzMKICAgIC8vIGNvbnN0IFtwbHVnaW4sIGV4aXN0c10gPSB0aGlzLnBsdWdpbnMubWF5YmUoa2V5KTsKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjIzNi0yMzcKICAgIC8vIGV4aXN0cwogICAgLy8gJiYgcGx1Z2luLmxhc3RWYWxpZFJvdW5kLm5hdGl2ZSA+PSBHbG9iYWwucm91bmQKICAgIGJ6IHBsdWdpbkNhbGxBbGxvd2VkX2Jvb2xfZmFsc2VANAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjIzNwogICAgLy8gJiYgcGx1Z2luLmxhc3RWYWxpZFJvdW5kLm5hdGl2ZSA+PSBHbG9iYWwucm91bmQKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBSb3VuZAogICAgPj0KICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyMzYtMjM3CiAgICAvLyBleGlzdHMKICAgIC8vICYmIHBsdWdpbi5sYXN0VmFsaWRSb3VuZC5uYXRpdmUgPj0gR2xvYmFsLnJvdW5kCiAgICBieiBwbHVnaW5DYWxsQWxsb3dlZF9ib29sX2ZhbHNlQDQKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyMzgKICAgIC8vICYmIEdsb2JhbC5yb3VuZCAtIHBsdWdpbi5sYXN0Q2FsbGVkLm5hdGl2ZSA+PSBwbHVnaW4uY29vbGRvd24ubmF0aXZlCiAgICBnbG9iYWwgUm91bmQKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICBzd2FwCiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgID49CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjM2LTIzOAogICAgLy8gZXhpc3RzCiAgICAvLyAmJiBwbHVnaW4ubGFzdFZhbGlkUm91bmQubmF0aXZlID49IEdsb2JhbC5yb3VuZAogICAgLy8gJiYgR2xvYmFsLnJvdW5kIC0gcGx1Z2luLmxhc3RDYWxsZWQubmF0aXZlID49IHBsdWdpbi5jb29sZG93bi5uYXRpdmUKICAgIGJ6IHBsdWdpbkNhbGxBbGxvd2VkX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCnBsdWdpbkNhbGxBbGxvd2VkX2Jvb2xfbWVyZ2VANToKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyMzUtMjM5CiAgICAvLyByZXR1cm4gKAogICAgLy8gICBleGlzdHMKICAgIC8vICAgJiYgcGx1Z2luLmxhc3RWYWxpZFJvdW5kLm5hdGl2ZSA+PSBHbG9iYWwucm91bmQKICAgIC8vICAgJiYgR2xvYmFsLnJvdW5kIC0gcGx1Z2luLmxhc3RDYWxsZWQubmF0aXZlID49IHBsdWdpbi5jb29sZG93bi5uYXRpdmUKICAgIC8vICk7CiAgICBzd2FwCiAgICByZXRzdWIKCnBsdWdpbkNhbGxBbGxvd2VkX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIHBsdWdpbkNhbGxBbGxvd2VkX2Jvb2xfbWVyZ2VANQoKCi8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfY2FuQ2FsbChwbHVnaW46IGJ5dGVzLCBhZGRyZXNzOiBieXRlcykgLT4gdWludDY0OgphcmM1OF9jYW5DYWxsOgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI0OC0yNDkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gYXJjNThfY2FuQ2FsbChwbHVnaW46IGFyYzQuVWludE42NCwgYWRkcmVzczogYXJjNC5BZGRyZXNzKTogYm9vbGVhbiB7CiAgICBwcm90byAyIDEKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNTAKICAgIC8vIGNvbnN0IGdsb2JhbEFsbG93ZWQgPSB0aGlzLnBsdWdpbkNhbGxBbGxvd2VkKEFwcGxpY2F0aW9uKHBsdWdpbi5uYXRpdmUpLCBHbG9iYWwuemVyb0FkZHJlc3MpOwogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICBkdXAKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgY2FsbHN1YiBwbHVnaW5DYWxsQWxsb3dlZAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI1MQogICAgLy8gaWYgKGdsb2JhbEFsbG93ZWQpIHJldHVybiB0cnVlOwogICAgYnogYXJjNThfY2FuQ2FsbF9hZnRlcl9pZl9lbHNlQDIKICAgIGludGNfMSAvLyAxCiAgICBzd2FwCiAgICByZXRzdWIKCmFyYzU4X2NhbkNhbGxfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI1MwogICAgLy8gcmV0dXJuIHRoaXMucGx1Z2luQ2FsbEFsbG93ZWQoQXBwbGljYXRpb24ocGx1Z2luLm5hdGl2ZSksIGFkZHJlc3MubmF0aXZlKTsKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgcGx1Z2luQ2FsbEFsbG93ZWQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbihwbHVnaW46IGJ5dGVzKSAtPiB2b2lkOgphcmM1OF9yZWtleVRvUGx1Z2luOgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI2MQogICAgLy8gYXJjNThfcmVrZXlUb1BsdWdpbihwbHVnaW46IGFyYzQuVWludE42NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI2MgogICAgLy8gY29uc3QgZ2xvYmFsQWxsb3dlZCA9IHRoaXMucGx1Z2luQ2FsbEFsbG93ZWQoQXBwbGljYXRpb24ocGx1Z2luLm5hdGl2ZSksIEdsb2JhbC56ZXJvQWRkcmVzcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBjYWxsc3ViIHBsdWdpbkNhbGxBbGxvd2VkCiAgICBkdXAKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNjQKICAgIC8vIGlmICghZ2xvYmFsQWxsb3dlZCkgewogICAgYm56IGFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjY1CiAgICAvLyBhc3NlcnQodGhpcy5wbHVnaW5DYWxsQWxsb3dlZChBcHBsaWNhdGlvbihwbHVnaW4ubmF0aXZlKSwgVHhuLnNlbmRlciksICdUaGlzIHNlbmRlciBpcyBub3QgYWxsb3dlZCB0byB0cmlnZ2VyIHRoaXMgcGx1Z2luJyk7CiAgICBmcmFtZV9kaWcgMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBwbHVnaW5DYWxsQWxsb3dlZAogICAgYXNzZXJ0IC8vIFRoaXMgc2VuZGVyIGlzIG5vdCBhbGxvd2VkIHRvIHRyaWdnZXIgdGhpcyBwbHVnaW4KCmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI2OC0yNzYKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWtleVRvOiBBcHBsaWNhdGlvbihwbHVnaW4ubmF0aXZlKS5hZGRyZXNzLAogICAgLy8gICAgIG5vdGU6ICdyZWtleWluZyB0byBwbHVnaW4gYXBwJywKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMAogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogJ2MnIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI3MgogICAgLy8gcmVrZXlUbzogQXBwbGljYXRpb24ocGx1Z2luLm5hdGl2ZSkuYWRkcmVzcywKICAgIGZyYW1lX2RpZyAzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjczCiAgICAvLyBub3RlOiAncmVrZXlpbmcgdG8gcGx1Z2luIGFwcCcsCiAgICBwdXNoYnl0ZXMgInJla2V5aW5nIHRvIHBsdWdpbiBhcHAiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGl0eG5fZmllbGQgUmVrZXlUbwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNjgtMjc1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgcmVrZXlUbzogQXBwbGljYXRpb24ocGx1Z2luLm5hdGl2ZSkuYWRkcmVzcywKICAgIC8vICAgICBub3RlOiAncmVrZXlpbmcgdG8gcGx1Z2luIGFwcCcsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyNzQKICAgIC8vIGZlZTogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI2OC0yNzYKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWtleVRvOiBBcHBsaWNhdGlvbihwbHVnaW4ubmF0aXZlKS5hZGRyZXNzLAogICAgLy8gICAgIG5vdGU6ICdyZWtleWluZyB0byBwbHVnaW4gYXBwJywKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjgwCiAgICAvLyBhbGxvd2VkQ2FsbGVyOiBuZXcgYXJjNC5BZGRyZXNzKGdsb2JhbEFsbG93ZWQgPyBHbG9iYWwuemVyb0FkZHJlc3MgOiBUeG4uc2VuZGVyKQogICAgZnJhbWVfZGlnIDQKICAgIGJ6IGFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9mYWxzZUA4CiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKCmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9tZXJnZUA5OgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI3OC0yODEKICAgIC8vIGNvbnN0IGtleSA9IG5ldyBQbHVnaW5zS2V5KHsKICAgIC8vICAgYXBwbGljYXRpb246IHBsdWdpbiwKICAgIC8vICAgYWxsb3dlZENhbGxlcjogbmV3IGFyYzQuQWRkcmVzcyhnbG9iYWxBbGxvd2VkID8gR2xvYmFsLnplcm9BZGRyZXNzIDogVHhuLnNlbmRlcikKICAgIC8vIH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozNQogICAgLy8gcGx1Z2lucyA9IEJveE1hcDxQbHVnaW5zS2V5LCBQbHVnaW5JbmZvPih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWNfMiAvLyAicCIKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyODMKICAgIC8vIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLnBsdWdpbnMuZ2V0KGtleSk7CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyODQtMjg3CiAgICAvLyBjb25zdCBuZXdWYWx1ZSA9IG5ldyBQbHVnaW5JbmZvKHsKICAgIC8vICAgLi4ucHJldmlvdXNWYWx1ZSwKICAgIC8vICAgbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NChHbG9iYWwucm91bmQpLAogICAgLy8gfSk7CiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIGludGNfMyAvLyAxOTIKICAgIGdldGJpdAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyODYKICAgIC8vIGxhc3RDYWxsZWQ6IG5ldyBhcmM0LlVpbnRONjQoR2xvYmFsLnJvdW5kKSwKICAgIGdsb2JhbCBSb3VuZAogICAgaXRvYgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI4NC0yODcKICAgIC8vIGNvbnN0IG5ld1ZhbHVlID0gbmV3IFBsdWdpbkluZm8oewogICAgLy8gICAuLi5wcmV2aW91c1ZhbHVlLAogICAgLy8gICBsYXN0Q2FsbGVkOiBuZXcgYXJjNC5VaW50TjY0KEdsb2JhbC5yb3VuZCksCiAgICAvLyB9KTsKICAgIGJ5dGVjIDQgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6Mjg5CiAgICAvLyB0aGlzLnBsdWdpbnMuc2V0KGtleSwgbmV3VmFsdWUpOwogICAgYm94X3B1dAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjc4CiAgICAvLyBsZXQgcmVrZXllZEJhY2sgPSBmYWxzZTsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo4MAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gKFR4bi5ncm91cEluZGV4ICsgMSk7IGkgPCAoR2xvYmFsLmdyb3VwU2l6ZSAtIFR4bi5ncm91cEluZGV4KTsgaSArPSAxKSB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKYXJjNThfcmVrZXlUb1BsdWdpbl93aGlsZV90b3BAMTE6CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6ODAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IChUeG4uZ3JvdXBJbmRleCArIDEpOyBpIDwgKEdsb2JhbC5ncm91cFNpemUgLSBUeG4uZ3JvdXBJbmRleCk7IGkgKz0gMSkgewogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgdHhuIEdyb3VwSW5kZXgKICAgIC0KICAgIGZyYW1lX2RpZyAwCiAgICA+CiAgICBieiBhcmM1OF9yZWtleVRvUGx1Z2luX2Jsb2NrQDI1CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6ODQKICAgIC8vIGlmICh0eG4uc2VuZGVyID09PSB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlICYmIHR4bi5yZWtleVRvID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykgewogICAgZnJhbWVfZGlnIDAKICAgIGd0eG5zIFNlbmRlcgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjMwCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnYycgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6ODQKICAgIC8vIGlmICh0eG4uc2VuZGVyID09PSB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlICYmIHR4bi5yZWtleVRvID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykgewogICAgPT0KICAgIGJ6IGFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAxNQogICAgZnJhbWVfZGlnIDAKICAgIGd0eG5zIFJla2V5VG8KICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYnogYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6ODUKICAgIC8vIHJla2V5ZWRCYWNrID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDEKCmFyYzU4X3Jla2V5VG9QbHVnaW5fYmxvY2tAMjU6CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTE0CiAgICAvLyBhc3NlcnQocmVrZXllZEJhY2spOwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydAogICAgcmV0c3ViCgphcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OTEKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICBmcmFtZV9kaWcgMAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzIgLy8gNgogICAgPT0KICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo5MS05MgogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICBieiBhcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMjEKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo5MgogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIGZyYW1lX2RpZyAwCiAgICBndHhucyBBcHBsaWNhdGlvbklECiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgID09CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OTEtOTIKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDIxCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OTQKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IGFyYzQuT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBmcmFtZV9kaWcgMAogICAgZ3R4bnMgT25Db21wbGV0aW9uCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OTEtOTQKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gYXJjNC5PbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIGJueiBhcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMjEKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo5NQogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDEKICAgIGZyYW1lX2RpZyAwCiAgICBndHhucyBOdW1BcHBBcmdzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo5MS05NQogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAvLyBAdHMtZXhwZWN0LWVycm9yCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBhcmM0Lk9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDEKICAgIGJ6IGFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjk2CiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gYXJjNC5tZXRob2RTZWxlY3RvcignYXJjNThfdmVyaWZ5QXV0aEFkZHIoKXZvaWQnKQogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMCAvLyAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWNfMyAvLyBtZXRob2QgImFyYzU4X3ZlcmlmeUF1dGhBZGRyKCl2b2lkIgogICAgPT0KICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo5MS05NgogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAvLyBAdHMtZXhwZWN0LWVycm9yCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBhcmM0Lk9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDEKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBhcmM0Lm1ldGhvZFNlbGVjdG9yKCdhcmM1OF92ZXJpZnlBdXRoQWRkcigpdm9pZCcpCiAgICBieiBhcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMjEKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo5OAogICAgLy8gcmVrZXllZEJhY2sgPSB0cnVlOwogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjk5CiAgICAvLyBicmVhazsKICAgIGIgYXJjNThfcmVrZXlUb1BsdWdpbl9ibG9ja0AyNQoKYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjEwMgogICAgLy8gaWYgKHR4bi50eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsKSB7CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDYKICAgICE9CiAgICBibnogYXJjNThfcmVrZXlUb1BsdWdpbl9ibG9ja0AyMwogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjEwNgogICAgLy8gYXNzZXJ0KHR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oYXBwKSwgJ0ludmFsaWQgYXBwIGNhbGwnKTsKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIGZyYW1lX2RpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgYXBwIGNhbGwKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoxMDgKICAgIC8vIGFzc2VydCh0eG4ub25Db21wbGV0aW9uID09PSBhcmM0Lk9uQ29tcGxldGVBY3Rpb24uTm9PcCwgJ0ludmFsaWQgb25Db21wbGV0aW9uJyk7CiAgICBkdXAKICAgIGd0eG5zIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgb25Db21wbGV0aW9uCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTA5CiAgICAvLyBhc3NlcnQodHhuLm51bUFwcEFyZ3MgPiAxLCAnSW52YWxpZCBudW1iZXIgb2YgYXBwIGFyZ3MnKTsKICAgIGR1cAogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIG51bWJlciBvZiBhcHAgYXJncwogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjExMAogICAgLy8gYXNzZXJ0KGxlbih0eG4uYXBwQXJncygxKSkgPT09IDgsICdJbnZhbGlkIGFwcCBhcmcgbGVuZ3RoJyk7CiAgICBpbnRjXzEgLy8gMQogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGFwcCBhcmcgbGVuZ3RoCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MTExCiAgICAvLyBhc3NlcnQoQXBwbGljYXRpb24oYnRvaSh0eG4uYXBwQXJncygxKSkpID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQsICdJbnZhbGlkIGFwcCBhcmcnKTsKICAgIGJ0b2kKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGFwcCBhcmcKCmFyYzU4X3Jla2V5VG9QbHVnaW5fYmxvY2tAMjM6CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6ODAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IChUeG4uZ3JvdXBJbmRleCArIDEpOyBpIDwgKEdsb2JhbC5ncm91cFNpemUgLSBUeG4uZ3JvdXBJbmRleCk7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgYXJjNThfcmVrZXlUb1BsdWdpbl93aGlsZV90b3BAMTEKCmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9mYWxzZUA4OgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI4MAogICAgLy8gYWxsb3dlZENhbGxlcjogbmV3IGFyYzQuQWRkcmVzcyhnbG9iYWxBbGxvd2VkID8gR2xvYmFsLnplcm9BZGRyZXNzIDogVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIGIgYXJjNThfcmVrZXlUb1BsdWdpbl90ZXJuYXJ5X21lcmdlQDkKCgovLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9OYW1lZFBsdWdpbihuYW1lOiBieXRlcykgLT4gdm9pZDoKYXJjNThfcmVrZXlUb05hbWVkUGx1Z2luOgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI5OAogICAgLy8gYXJjNThfcmVrZXlUb05hbWVkUGx1Z2luKG5hbWU6IGFyYzQuU3RyKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czoyOTkKICAgIC8vIHRoaXMuYXJjNThfcmVrZXlUb1BsdWdpbih0aGlzLm5hbWVkUGx1Z2lucy5nZXQobmFtZS5uYXRpdmUpLmFwcGxpY2F0aW9uKTsKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0MAogICAgLy8gbmFtZWRQbHVnaW5zID0gQm94TWFwPHN0cmluZywgUGx1Z2luc0tleT4oeyBrZXlQcmVmaXg6ICduJyB9KTsKICAgIGJ5dGVjIDUgLy8gIm4iCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6Mjk5CiAgICAvLyB0aGlzLmFyYzU4X3Jla2V5VG9QbHVnaW4odGhpcy5uYW1lZFBsdWdpbnMuZ2V0KG5hbWUubmF0aXZlKS5hcHBsaWNhdGlvbik7CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGNhbGxzdWIgYXJjNThfcmVrZXlUb1BsdWdpbgogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9hZGRQbHVnaW4oYXBwOiBieXRlcywgYWxsb3dlZENhbGxlcjogYnl0ZXMsIGxhc3RWYWxpZFJvdW5kOiBieXRlcywgY29vbGRvd246IGJ5dGVzLCBhZG1pblByaXZpbGVnZXM6IGJ5dGVzKSAtPiB2b2lkOgphcmM1OF9hZGRQbHVnaW46CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzEyLTMxOAogICAgLy8gYXJjNThfYWRkUGx1Z2luKAogICAgLy8gICBhcHA6IGFyYzQuVWludE42NCwKICAgIC8vICAgYWxsb3dlZENhbGxlcjogYXJjNC5BZGRyZXNzLAogICAgLy8gICBsYXN0VmFsaWRSb3VuZDogYXJjNC5VaW50TjY0LAogICAgLy8gICBjb29sZG93bjogYXJjNC5VaW50TjY0LAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGFyYzQuQm9vbAogICAgLy8gKTogdm9pZCB7CiAgICBwcm90byA1IDAKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMjAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlLCAnU2VuZGVyIG11c3QgYmUgdGhlIGFkbWluJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjcKICAgIC8vIGFkbWluID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdhJyB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMjAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlLCAnU2VuZGVyIG11c3QgYmUgdGhlIGFkbWluJyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIFNlbmRlciBtdXN0IGJlIHRoZSBhZG1pbgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjMyMgogICAgLy8gY29uc3Qga2V5ID0gbmV3IFBsdWdpbnNLZXkoeyBhcHBsaWNhdGlvbjogYXBwLCBhbGxvd2VkQ2FsbGVyOiBhbGxvd2VkQ2FsbGVyIH0pOwogICAgZnJhbWVfZGlnIC01CiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjMyMy0zMjgKICAgIC8vIGNvbnN0IHZhbHVlID0gbmV3IFBsdWdpbkluZm8oewogICAgLy8gICBsYXN0VmFsaWRSb3VuZDogbGFzdFZhbGlkUm91bmQsCiAgICAvLyAgIGNvb2xkb3duOiBjb29sZG93biwKICAgIC8vICAgbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NCgwKSwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBhZG1pblByaXZpbGVnZXMsCiAgICAvLyB9KTsKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMjYKICAgIC8vIGxhc3RDYWxsZWQ6IG5ldyBhcmM0LlVpbnRONjQoMCksCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjMyMy0zMjgKICAgIC8vIGNvbnN0IHZhbHVlID0gbmV3IFBsdWdpbkluZm8oewogICAgLy8gICBsYXN0VmFsaWRSb3VuZDogbGFzdFZhbGlkUm91bmQsCiAgICAvLyAgIGNvb2xkb3duOiBjb29sZG93biwKICAgIC8vICAgbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NCgwKSwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBhZG1pblByaXZpbGVnZXMsCiAgICAvLyB9KTsKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozNQogICAgLy8gcGx1Z2lucyA9IEJveE1hcDxQbHVnaW5zS2V5LCBQbHVnaW5JbmZvPih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWNfMiAvLyAicCIKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMzAKICAgIC8vIHRoaXMucGx1Z2lucy5zZXQoa2V5LCB2YWx1ZSk7CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZW1vdmVQbHVnaW4oYXBwOiBieXRlcywgYWxsb3dlZENhbGxlcjogYnl0ZXMpIC0+IHZvaWQ6CmFyYzU4X3JlbW92ZVBsdWdpbjoKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozMzgKICAgIC8vIGFyYzU4X3JlbW92ZVBsdWdpbihhcHA6IGFyYzQuVWludE42NCwgYWxsb3dlZENhbGxlcjogYXJjNC5BZGRyZXNzKTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozNDAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlLCAnU2VuZGVyIG11c3QgYmUgdGhlIGFkbWluJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjcKICAgIC8vIGFkbWluID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdhJyB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozNDAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlLCAnU2VuZGVyIG11c3QgYmUgdGhlIGFkbWluJyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIFNlbmRlciBtdXN0IGJlIHRoZSBhZG1pbgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM0MgogICAgLy8gY29uc3Qga2V5ID0gbmV3IFBsdWdpbnNLZXkoeyBhcHBsaWNhdGlvbjogYXBwLCBhbGxvd2VkQ2FsbGVyOiBhbGxvd2VkQ2FsbGVyIH0pOwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM1CiAgICAvLyBwbHVnaW5zID0gQm94TWFwPFBsdWdpbnNLZXksIFBsdWdpbkluZm8+KHsga2V5UHJlZml4OiAncCcgfSk7CiAgICBieXRlY18yIC8vICJwIgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM0NAogICAgLy8gdGhpcy5wbHVnaW5zLmRlbGV0ZShrZXkpOwogICAgc3dhcAogICAgY29uY2F0CiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfYWRkTmFtZWRQbHVnaW4obmFtZTogYnl0ZXMsIGFwcDogYnl0ZXMsIGFsbG93ZWRDYWxsZXI6IGJ5dGVzLCBsYXN0VmFsaWRSb3VuZDogYnl0ZXMsIGNvb2xkb3duOiBieXRlcywgYWRtaW5Qcml2aWxlZ2VzOiBieXRlcykgLT4gdm9pZDoKYXJjNThfYWRkTmFtZWRQbHVnaW46CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzU4LTM2NQogICAgLy8gYXJjNThfYWRkTmFtZWRQbHVnaW4oCiAgICAvLyAgIG5hbWU6IGFyYzQuU3RyLAogICAgLy8gICBhcHA6IGFyYzQuVWludE42NCwKICAgIC8vICAgYWxsb3dlZENhbGxlcjogYXJjNC5BZGRyZXNzLAogICAgLy8gICBsYXN0VmFsaWRSb3VuZDogYXJjNC5VaW50TjY0LAogICAgLy8gICBjb29sZG93bjogYXJjNC5VaW50TjY0LAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGFyYzQuQm9vbAogICAgLy8gKTogdm9pZCB7CiAgICBwcm90byA2IDAKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozNjcKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlLCAnU2VuZGVyIG11c3QgYmUgdGhlIGFkbWluJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MjcKICAgIC8vIGFkbWluID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdhJyB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozNjcKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlLCAnU2VuZGVyIG11c3QgYmUgdGhlIGFkbWluJyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIFNlbmRlciBtdXN0IGJlIHRoZSBhZG1pbgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM2OAogICAgLy8gYXNzZXJ0KCF0aGlzLm5hbWVkUGx1Z2lucy5oYXMobmFtZS5uYXRpdmUpKTsKICAgIGZyYW1lX2RpZyAtNgogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czo0MAogICAgLy8gbmFtZWRQbHVnaW5zID0gQm94TWFwPHN0cmluZywgUGx1Z2luc0tleT4oeyBrZXlQcmVmaXg6ICduJyB9KTsKICAgIGJ5dGVjIDUgLy8gIm4iCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzY4CiAgICAvLyBhc3NlcnQoIXRoaXMubmFtZWRQbHVnaW5zLmhhcyhuYW1lLm5hdGl2ZSkpOwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzcwCiAgICAvLyBjb25zdCBrZXkgPSBuZXcgUGx1Z2luc0tleSh7IGFwcGxpY2F0aW9uOiBhcHAsIGFsbG93ZWRDYWxsZXI6IGFsbG93ZWRDYWxsZXIgfSk7CiAgICBmcmFtZV9kaWcgLTUKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzcxCiAgICAvLyB0aGlzLm5hbWVkUGx1Z2lucy5zZXQobmFtZS5uYXRpdmUsIGtleSk7CiAgICBzd2FwCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM3My0zNzgKICAgIC8vIGNvbnN0IHZhbHVlID0gbmV3IFBsdWdpbkluZm8oewogICAgLy8gICBsYXN0VmFsaWRSb3VuZDogbGFzdFZhbGlkUm91bmQsCiAgICAvLyAgIGNvb2xkb3duOiBjb29sZG93biwKICAgIC8vICAgbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NCgwKSwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBhZG1pblByaXZpbGVnZXMsCiAgICAvLyB9KTsKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozNzYKICAgIC8vIGxhc3RDYWxsZWQ6IG5ldyBhcmM0LlVpbnRONjQoMCksCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM3My0zNzgKICAgIC8vIGNvbnN0IHZhbHVlID0gbmV3IFBsdWdpbkluZm8oewogICAgLy8gICBsYXN0VmFsaWRSb3VuZDogbGFzdFZhbGlkUm91bmQsCiAgICAvLyAgIGNvb2xkb3duOiBjb29sZG93biwKICAgIC8vICAgbGFzdENhbGxlZDogbmV3IGFyYzQuVWludE42NCgwKSwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBhZG1pblByaXZpbGVnZXMsCiAgICAvLyB9KTsKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozNQogICAgLy8gcGx1Z2lucyA9IEJveE1hcDxQbHVnaW5zS2V5LCBQbHVnaW5JbmZvPih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWNfMiAvLyAicCIKICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozODAKICAgIC8vIHRoaXMucGx1Z2lucy5zZXQoa2V5LCB2YWx1ZSk7CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZW1vdmVOYW1lZFBsdWdpbihuYW1lOiBieXRlcykgLT4gdm9pZDoKYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW46CiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6Mzg4CiAgICAvLyBhcmM1OF9yZW1vdmVOYW1lZFBsdWdpbihuYW1lOiBhcmM0LlN0cik6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzkwCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSwgJ1NlbmRlciBtdXN0IGJlIHRoZSBhZG1pbicpOwogICAgdHhuIFNlbmRlcgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjI3CiAgICAvLyBhZG1pbiA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnYScgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6MzkwCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSwgJ1NlbmRlciBtdXN0IGJlIHRoZSBhZG1pbicpOwogICAgPT0KICAgIGFzc2VydCAvLyBTZW5kZXIgbXVzdCBiZSB0aGUgYWRtaW4KICAgIC8vIGNvbnRyYWN0cy9hYnN0cmFjdGVkX2FjY291bnQuYWxnby50czozOTIKICAgIC8vIGNvbnN0IGtleSA9IHRoaXMubmFtZWRQbHVnaW5zLmdldChuYW1lLm5hdGl2ZSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb250cmFjdHMvYWJzdHJhY3RlZF9hY2NvdW50LmFsZ28udHM6NDAKICAgIC8vIG5hbWVkUGx1Z2lucyA9IEJveE1hcDxzdHJpbmcsIFBsdWdpbnNLZXk+KHsga2V5UHJlZml4OiAnbicgfSk7CiAgICBieXRlYyA1IC8vICJuIgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM5MgogICAgLy8gY29uc3Qga2V5ID0gdGhpcy5uYW1lZFBsdWdpbnMuZ2V0KG5hbWUubmF0aXZlKTsKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM5MwogICAgLy8gdGhpcy5uYW1lZFBsdWdpbnMuZGVsZXRlKG5hbWUubmF0aXZlKTsKICAgIHN3YXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM1CiAgICAvLyBwbHVnaW5zID0gQm94TWFwPFBsdWdpbnNLZXksIFBsdWdpbkluZm8+KHsga2V5UHJlZml4OiAncCcgfSk7CiAgICBieXRlY18yIC8vICJwIgogICAgLy8gY29udHJhY3RzL2Fic3RyYWN0ZWRfYWNjb3VudC5hbGdvLnRzOjM5NAogICAgLy8gdGhpcy5wbHVnaW5zLmRlbGV0ZShrZXkpOwogICAgc3dhcAogICAgY29uY2F0CiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CiAEAAEGwAEmCAFhAWMBcAQPiFSTAQABbgQVH3x1CAAAAAAAAAAAMRtBAGCCBAS0x31xBNJLdVYEX6RJxgQTvETkK4IIBMlaXT0E6QJtqAR8dm3cBFbyi1gE0S3LYQRNNyNVBIpyp1AE41C51DYaAI4NAOoA2wDGALUAqQCXAHoAawBcAEEALwARAAIiQzEZFEQxGEQ2GgGIBEIjQzEZFEQxGEQ2GgE2GgI2GgM2GgQ2GgU2GgaIA+8jQzEZFEQxGEQ2GgE2GgKIA8cjQzEZFEQxGEQ2GgE2GgI2GgM2GgQ2GgWIA4ojQzEZFEQxGEQ2GgGIA2YjQzEZFEQxGEQ2GgGIAjYjQzEZFEQxGEQ2GgE2GgKIAgknBCJPAlQnBkxQsCNDMRkURDEYRDYaATYaAogBBCNDMRkURDEYRIgA2CNDMRkURDEYRIgAxycGTFCwI0MxGRREMRhENhoBNhoCNhoDiABqI0MxGRREMRhENhoBiABLI0MxGRREMRgURDYaATYaAogAAiNDigIAMQCL/hJAAAgxAIv/EkEAHyNEi/+L/hNEKIv/Z4v+MgMSQQAGMgopTGeJi/5C//ciQv/eigEAMQAiKGVEEkQoi/9niYoDADEAi/0XSXIIRE8CEkQiKWVEcwJETHIIRBJEi/2L/lAqTFC+QQAWiwAlUycEIk8CVCJTQQAHI0Qoi/9niSJC//YiKGVEiYoAACIpZURzAkQiKWVEMgoSQQAHMgOLABJEiTIKQv/2igIAgABJMQAiKGVEEkSxIillRIAbcmVrZXlpbmcgYWJzdHJhY3RlZCBhY2NvdW50sgWL/rIgi/6yB7IAI7IQIrIBs4v/IlNBAC0ijAExFiMIjACLADIEDEEAGYsAOAAiKWVEEkEAEYsAOCAyChJBAAcjjAGLAUSJiwA4ECQSQQAqiwA4GDIIEkEAIIsAOBlAABmLADgbIxJBABCLACLCGisSQQAGI4wBQv/JiwAjCIwAQv+figIBi/4Wi/9QKkxQvkEAIIsAIlsyBg9BABYyBosASU4CgRBbCUyBCFsPQQADI0yJIkL/+ooCAYv+F0kyA4j/wEEAAyNMiYsAi/+I/7NMiYoBAIAARwKL/xdJMgOI/6FJQAAIiwMxAIj/lkSxIillRCIpZUSLA3IIRIAWcmVrZXlpbmcgdG8gcGx1Z2luIGFwcLIFsiCyB7IAI7IQIrIBs4sEQQDGMgOL/0xQKkxQSb5ESVcACEsBJVNPAlcICDIGFicEIk8EVE8DTwNQTwJQTFC/IowBMRYjCIwAMgQxFgmLAA1BABmLADgAIillRBJBABGLADggMgoSQQAHI4wBiwFEiYsAOBBJjAIkEkEAKosAOBgyCBJBACCLADgZQAAZiwA4GyMSQQAQiwAiwhorEkEABiOMAUL/xosCJBNAACKLAEk4GIsDEkRJOBkUREk4GyMNRCPCGkkVgQgSRBcyCBJEiwAjCIwAQv9wMQBC/zeKAQCL/1cCACcFTFC+RFcACIj+y4mKBQAxACIoZUQSRIv7i/xQi/2L/lAnB1CL/1AqTwJQTL+JigIAMQAiKGVEEkSL/ov/UCpMULxIiYoGADEAIihlRBJEi/pXAgAnBUxQSb1FARREi/uL/FBMSwG/i/2L/lAnB1CL/1AqTwJQTL+JigEAMQAiKGVEEkSL/1cCACcFTFBJvkRMvEgqTFC8SIk=", "clear": "CoEBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 4, "minor": 4, "patch": 4 } }, "events": [], "templateVariables": {} }