{ "name": "SmartAsa", "structs": { "AssetConfig": [ { "name": "total", "type": "uint64" }, { "name": "decimals", "type": "uint32" }, { "name": "default_frozen", "type": "bool" }, { "name": "unit_name", "type": "string" }, { "name": "name", "type": "string" }, { "name": "url", "type": "string" }, { "name": "metadata_hash", "type": "byte[]" }, { "name": "manager_addr", "type": "address" }, { "name": "reserve_addr", "type": "address" }, { "name": "freeze_addr", "type": "address" }, { "name": "clawback_addr", "type": "address" } ] }, "methods": [ { "name": "asset_create", "args": [ { "type": "uint64", "name": "total", "desc": "The total number of base units of the Smart ASA to create" }, { "type": "uint32", "name": "decimals", "desc": "The number of digits to use after the decimal point when displaying the Smart ASA" }, { "type": "bool", "name": "default_frozen", "desc": "Smart ASA default frozen (True to freeze holdings by default)" }, { "type": "string", "name": "unit_name", "desc": "The name of a unit of Smart ASA" }, { "type": "string", "name": "name", "desc": "The name of the Smart ASA" }, { "type": "string", "name": "url", "desc": "Smart ASA external URL" }, { "type": "byte[]", "name": "metadata_hash", "desc": "Smart ASA metadata hash" }, { "type": "address", "name": "manager_addr", "desc": "Account that can manage the configuration of the Smart ASA and destroy it" }, { "type": "address", "name": "reserve_addr", "desc": "Account that holds the reserve (non-minted) units of Smart ASA and can mint or burn it" }, { "type": "address", "name": "freeze_addr", "desc": "Account that can freeze/unfreeze holdings of the Smart ASA globally or locally" }, { "type": "address", "name": "clawback_addr", "desc": "Account that can clawback holdings of the Smart ASA" } ], "returns": { "type": "uint64", "desc": "Controlled ASA ID" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create the Controlled ASA", "events": [], "recommendations": {} }, { "name": "asset_opt_in", "args": [ { "type": "uint64", "name": "asset", "desc": "Smart ASA ID" }, { "type": "axfer", "name": "ctrl_asa_opt_in", "desc": "Controlled ASA opt in transaction" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "OptIn" ] }, "readonly": false, "desc": "Smart ASA opt in (App and Controlled ASA)", "events": [], "recommendations": {} }, { "name": "asset_config", "args": [ { "type": "uint64", "name": "config_asset", "desc": "Smart ASA ID to configure" }, { "type": "uint64", "name": "total", "desc": "Total number of base units if the Smart ASA. It can not be less than current circulating supply" }, { "type": "uint32", "name": "decimals", "desc": "The number of digits to use after the decimal point when displaying the Smart ASA" }, { "type": "bool", "name": "default_frozen", "desc": "Smart ASA default frozen (True to freeze holdings by default)" }, { "type": "string", "name": "unit_name", "desc": "The name of a unit of Smart ASA" }, { "type": "string", "name": "name", "desc": "The name of the Smart ASA" }, { "type": "string", "name": "url", "desc": "Smart ASA external URL" }, { "type": "byte[]", "name": "metadata_hash", "desc": "Smart ASA metadata hash" }, { "type": "address", "name": "manager_addr", "desc": "Account that can manage the configuration of the Smart ASA and destroy it" }, { "type": "address", "name": "reserve_addr", "desc": "Account that holds the reserve (non-minted) units of Smart ASA and can mint or burn it" }, { "type": "address", "name": "freeze_addr", "desc": "Account that can freeze/unfreeze holdings of the Smart ASA globally or locally" }, { "type": "address", "name": "clawback_addr", "desc": "Account that can clawback holdings of the Smart ASA" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Configure Smart ASA (for unchanged parameters use existing value - no optional args on AVM)", "events": [], "recommendations": {} }, { "name": "asset_transfer", "args": [ { "type": "uint64", "name": "xfer_asset", "desc": "Smart ASA ID to transfer" }, { "type": "uint64", "name": "asset_amount", "desc": "Amount to transfer" }, { "type": "address", "name": "asset_sender", "desc": "Smart ASA sender" }, { "type": "address", "name": "asset_receiver", "desc": "Smart ASA receiver" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Smart ASA transfers: regular, clawback, mint, burn", "events": [], "recommendations": {} }, { "name": "asset_freeze", "args": [ { "type": "uint64", "name": "freeze_asset", "desc": "Smart ASA ID to globally freeze/unfreeze" }, { "type": "bool", "name": "asset_frozen", "desc": "Smart ASA frozen status" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Smart ASA global freeze (all accounts)", "events": [], "recommendations": {} }, { "name": "account_freeze", "args": [ { "type": "uint64", "name": "freeze_asset", "desc": "Smart ASA ID to locally freeze/unfreeze" }, { "type": "address", "name": "freeze_account", "desc": "Account to freeze/unfreeze" }, { "type": "bool", "name": "asset_frozen", "desc": "Smart ASA frozen status" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Smart ASA local freeze (account specific)", "events": [], "recommendations": {} }, { "name": "asset_close_out", "args": [ { "type": "uint64", "name": "close_asset", "desc": "Smart ASA ID to close out" }, { "type": "address", "name": "close_to", "desc": "Account to send all the Smart ASA remainder to." } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "CloseOut" ] }, "readonly": false, "desc": "Smart ASA close out (App and Controlled ASA)", "events": [], "recommendations": {} }, { "name": "asset_destroy", "args": [ { "type": "uint64", "name": "destroy_asset", "desc": "Smart ASA ID to destroy" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "DeleteApplication" ] }, "readonly": false, "desc": "Destroy the Smart ASA", "events": [], "recommendations": {} }, { "name": "get_asset_config", "args": [ { "type": "uint64", "name": "asset", "desc": "Smart ASA ID" } ], "returns": { "type": "(uint64,uint32,bool,string,string,string,byte[],address,address,address,address)", "struct": "AssetConfig", "desc": "Smart ASA configuration parameters" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get Smart ASA configuration", "events": [], "recommendations": {} }, { "name": "get_asset_is_frozen", "args": [ { "type": "uint64", "name": "freeze_asset", "desc": "Smart ASA ID" } ], "returns": { "type": "bool", "desc": "Smart ASA global frozen status" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get Smart ASA global frozen status", "events": [], "recommendations": {} }, { "name": "get_account_is_frozen", "args": [ { "type": "uint64", "name": "freeze_asset", "desc": "Smart ASA ID" }, { "type": "address", "name": "freeze_account", "desc": "Account to check" } ], "returns": { "type": "bool", "desc": "Smart ASA account frozen status" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get Smart ASA account frozen status", "events": [], "recommendations": {} }, { "name": "get_circulating_supply", "args": [ { "type": "uint64", "name": "asset", "desc": "Smart ASA ID" } ], "returns": { "type": "uint64", "desc": "Smart ASA circulating supply" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get Smart ASA circulating supply", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "\n Smart ASA (ARC-20) Reference Implementation\n ", "networks": {}, "state": { "schema": { "global": { "ints": 5, "bytes": 8 }, "local": { "ints": 2, "bytes": 0 } }, "keys": { "global": { "total": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dG90YWw=" }, "decimals": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZGVjaW1hbHM=" }, "default_frozen": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZGVmYXVsdF9mcm96ZW4=" }, "unit_name": { "keyType": "AVMString", "valueType": "AVMString", "key": "dW5pdF9uYW1l" }, "name": { "keyType": "AVMString", "valueType": "AVMString", "key": "bmFtZQ==" }, "url": { "keyType": "AVMString", "valueType": "AVMString", "key": "dXJs" }, "metadata_hash": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "bWV0YWRhdGFfaGFzaA==" }, "manager_addr": { "keyType": "AVMString", "valueType": "address", "key": "bWFuYWdlcl9hZGRy" }, "reserve_addr": { "keyType": "AVMString", "valueType": "address", "key": "cmVzZXJ2ZV9hZGRy" }, "freeze_addr": { "keyType": "AVMString", "valueType": "address", "key": "ZnJlZXplX2FkZHI=" }, "clawback_addr": { "keyType": "AVMString", "valueType": "address", "key": "Y2xhd2JhY2tfYWRkcg==" }, "smart_asa_id": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c21hcnRfYXNhX2lk" }, "global_frozen": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Z2xvYmFsX2Zyb3plbg==" } }, "local": { "account_smart_asa_id": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWNjb3VudF9zbWFydF9hc2FfaWQ=" }, "account_frozen": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWNjb3VudF9mcm96ZW4=" } }, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1073 ], "errorMessage": "Clawback Address has been deleted" }, { "pc": [ 1685 ], "errorMessage": "Close to account is frozen" }, { "pc": [ 609 ], "errorMessage": "Controlled ASA already created" }, { "pc": [ 799 ], "errorMessage": "Forbidden Close Out on Opt In" }, { "pc": [ 1338 ], "errorMessage": "Forbidden clawback burning" }, { "pc": [ 1226 ], "errorMessage": "Forbidden over minting" }, { "pc": [ 1209 ], "errorMessage": "Forbidden self minting" }, { "pc": [ 1055 ], "errorMessage": "Freeze Address has been deleted" }, { "pc": [ 1585 ], "errorMessage": "Invalid Close Out group size" }, { "pc": [ 1236, 1308, 1365, 1373, 1399, 1410, 1517, 1579, 1643, 1662, 2128 ], "errorMessage": "Invalid Controlled ASA ID" }, { "pc": [ 615 ], "errorMessage": "Invalid Metadata Hash length, must be 32 bytes" }, { "pc": [ 1085 ], "errorMessage": "Invalid Total, must be >= circulating supply" }, { "pc": [ 813, 2124 ], "errorMessage": "Missing Controlled ASA" }, { "pc": [ 1264, 1432 ], "errorMessage": "Receiver account is frozen" }, { "pc": [ 1035 ], "errorMessage": "Reserve Address has been deleted" }, { "pc": [ 1332, 1425, 1678 ], "errorMessage": "Sender account is frozen" }, { "pc": [ 1243, 1315, 1417, 1669 ], "errorMessage": "Smart ASA is global frozen" }, { "pc": [ 603 ], "errorMessage": "Unauthorized" }, { "pc": [ 1385 ], "errorMessage": "Unauthorized Clawback" }, { "pc": [ 1467, 1526 ], "errorMessage": "Unauthorized Freeze" }, { "pc": [ 1019, 1726 ], "errorMessage": "Unauthorized Manager" }, { "pc": [ 1200, 1296 ], "errorMessage": "Unauthorized Reserve" }, { "pc": [ 1604 ], "errorMessage": "Wrong ASA Close Out Amount" }, { "pc": [ 1592 ], "errorMessage": "Wrong ASA Close Out ID" }, { "pc": [ 1599 ], "errorMessage": "Wrong ASA Close Out Sender" }, { "pc": [ 792 ], "errorMessage": "Wrong ASA Opt In Amount" }, { "pc": [ 770 ], "errorMessage": "Wrong ASA Opt In ID" }, { "pc": [ 786 ], "errorMessage": "Wrong ASA Opt In Receiver" }, { "pc": [ 778 ], "errorMessage": "Wrong ASA Opt In Sender" }, { "pc": [ 1610, 1635 ], "errorMessage": "Wrong Close Out on Close Out" }, { "pc": [ 213 ], "errorMessage": "Wrong Global Bytes allocation" }, { "pc": [ 219 ], "errorMessage": "Wrong Global UInts allocation" }, { "pc": [ 223 ], "errorMessage": "Wrong Local Bytes allocation" }, { "pc": [ 229 ], "errorMessage": "Wrong Local UInts allocation" }, { "pc": [ 804, 1569 ], "errorMessage": "Wrong On Complete Action" }, { "pc": [ 840, 1695, 2110 ], "errorMessage": "account opted into asset" }, { "pc": [ 1262, 1330, 1423, 1430, 1676, 1683, 2063 ], "errorMessage": "check self.account_frozen exists for account" }, { "pc": [ 1230, 1302, 1356, 1371, 1390, 1408, 1511, 1575, 1656 ], "errorMessage": "check self.account_smart_asa_id exists for account" }, { "pc": [ 1059, 1069, 1251, 1319, 1347, 1870 ], "errorMessage": "check self.clawback_addr exists" }, { "pc": [ 1818 ], "errorMessage": "check self.decimals exists" }, { "pc": [ 830, 1832 ], "errorMessage": "check self.default_frozen exists" }, { "pc": [ 1040, 1051, 1465, 1524, 1866 ], "errorMessage": "check self.freeze_addr exists" }, { "pc": [ 1241, 1313, 1415, 1667, 2024 ], "errorMessage": "check self.global_frozen exists" }, { "pc": [ 1017, 1724, 1857 ], "errorMessage": "check self.manager_addr exists" }, { "pc": [ 1852 ], "errorMessage": "check self.metadata_hash exists" }, { "pc": [ 1842 ], "errorMessage": "check self.name exists" }, { "pc": [ 1023, 1031, 1198, 1247, 1291, 1336, 1861 ], "errorMessage": "check self.reserve_addr exists" }, { "pc": [ 607, 724, 765, 1213, 1234, 1306, 1360, 1394, 1515, 1639, 1660, 2122 ], "errorMessage": "check self.smart_asa_id exists" }, { "pc": [ 1224, 1813 ], "errorMessage": "check self.total exists" }, { "pc": [ 1837 ], "errorMessage": "check self.unit_name exists" }, { "pc": [ 1847 ], "errorMessage": "check self.url exists" }, { "pc": [ 503, 520, 537, 554, 899, 917, 935, 953 ], "errorMessage": "invalid array length header" }, { "pc": [ 495, 890, 1452, 1498 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 511, 528, 545, 562, 907, 925, 943, 961 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 573, 581, 589, 597, 975, 986, 996, 1006, 1172, 1182, 1490, 1552, 2054 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 487, 882 ], "errorMessage": "invalid number of bytes for arc4.uint32" }, { "pc": [ 477, 740, 859, 869, 1149, 1159, 1443, 1481, 1540, 1712, 1804, 2015, 2045, 2084 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 1824 ], "errorMessage": "overflow" }, { "pc": [ 753, 1563, 1626 ], "errorMessage": "transaction type is axfer" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxODQ0Njc0NDA3MzcwOTU1MTYxNQogICAgYnl0ZWNibG9jayAic21hcnRfYXNhX2lkIiAicmVzZXJ2ZV9hZGRyIiAiY2xhd2JhY2tfYWRkciIgImFjY291bnRfc21hcnRfYXNhX2lkIiAiYWNjb3VudF9mcm96ZW4iICJmcmVlemVfYWRkciIgImdsb2JhbF9mcm96ZW4iICJtYW5hZ2VyX2FkZHIiICJ0b3RhbCIgImRlZmF1bHRfZnJvemVuIiAiZGVjaW1hbHMiICJ1bml0X25hbWUiICJuYW1lIiAidXJsIiAibWV0YWRhdGFfaGFzaCIgMHgxNTFmN2M3NSAweDAwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ0LTQ1CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MC01MgogICAgLy8gIyBHTE9CQUwgU1RBVEUKICAgIC8vICMgQVNBIEZpZWxkcwogICAgLy8gc2VsZi50b3RhbCA9IFVJbnQ2NCgpCiAgICBieXRlYyA4IC8vICJ0b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MwogICAgLy8gc2VsZi5kZWNpbWFscyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMCAvLyAiZGVjaW1hbHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTQKICAgIC8vIHNlbGYuZGVmYXVsdF9mcm96ZW4gPSBGYWxzZQogICAgYnl0ZWMgOSAvLyAiZGVmYXVsdF9mcm96ZW4iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTUKICAgIC8vIHNlbGYudW5pdF9uYW1lID0gU3RyaW5nKCkKICAgIGJ5dGVjIDExIC8vICJ1bml0X25hbWUiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBzZWxmLm5hbWUgPSBTdHJpbmcoKQogICAgYnl0ZWMgMTIgLy8gIm5hbWUiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBzZWxmLnVybCA9IFN0cmluZygpCiAgICBieXRlYyAxMyAvLyAidXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5tZXRhZGF0YV9oYXNoID0gQnl0ZXMoKQogICAgYnl0ZWMgMTQgLy8gIm1ldGFkYXRhX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBzZWxmLm1hbmFnZXJfYWRkciA9IEFjY291bnQoKQogICAgYnl0ZWMgNyAvLyAibWFuYWdlcl9hZGRyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi5yZXNlcnZlX2FkZHIgPSBBY2NvdW50KCkKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYWRkciIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NjEKICAgIC8vIHNlbGYuZnJlZXplX2FkZHIgPSBBY2NvdW50KCkKICAgIGJ5dGVjIDUgLy8gImZyZWV6ZV9hZGRyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo2MgogICAgLy8gc2VsZi5jbGF3YmFja19hZGRyID0gQWNjb3VudCgpCiAgICBieXRlY18yIC8vICJjbGF3YmFja19hZGRyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo2My02NAogICAgLy8gIyBTbWFydCBBU0EgRmllbGRzCiAgICAvLyBzZWxmLnNtYXJ0X2FzYV9pZCA9IFVJbnQ2NCgpCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NjUKICAgIC8vIHNlbGYuZ2xvYmFsX2Zyb3plbiA9IEZhbHNlCiAgICBieXRlYyA2IC8vICJnbG9iYWxfZnJvemVuIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzAtMzgKICAgIC8vIGNsYXNzIFNtYXJ0QXNhKAogICAgLy8gICAgIEFyYzIwSW50ZXJmYWNlLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIyCiAgICBwdXNoYnl0ZXNzIDB4NDg2NDE2NDUgMHgzYTA0NWJkYyAweGVkNjQ0NTJmIC8vIG1ldGhvZCAiYXNzZXRfb3B0X2luKHVpbnQ2NCxheGZlcil2b2lkIiwgbWV0aG9kICJhc3NldF9jbG9zZV9vdXQodWludDY0LGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiYXNzZXRfZGVzdHJveSh1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYXNzZXRfb3B0X2luX3JvdXRlQDUgbWFpbl9hc3NldF9jbG9zZV9vdXRfcm91dGVANiBtYWluX2Fzc2V0X2Rlc3Ryb3lfcm91dGVANwoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMwLTM4CiAgICAvLyBjbGFzcyBTbWFydEFzYSgKICAgIC8vICAgICBBcmMyMEludGVyZmFjZSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhlN2VjZDVhOCAweGY4ODE5ZmViIDB4N2VhY2I3NzUgMHhhMTMzZDU4MSAweGZmNTNhZGVmIDB4MmU5YjkwMzggMHg5NzliOTk3MiAweDQ4YTYzY2M5IDB4NDZhZDBkNTIgLy8gbWV0aG9kICJhc3NldF9jcmVhdGUodWludDY0LHVpbnQzMixib29sLHN0cmluZyxzdHJpbmcsc3RyaW5nLGJ5dGVbXSxhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYXNzZXRfY29uZmlnKHVpbnQ2NCx1aW50NjQsdWludDMyLGJvb2wsc3RyaW5nLHN0cmluZyxzdHJpbmcsYnl0ZVtdLGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIodWludDY0LHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiYXNzZXRfZnJlZXplKHVpbnQ2NCxib29sKXZvaWQiLCBtZXRob2QgImFjY291bnRfZnJlZXplKHVpbnQ2NCxhZGRyZXNzLGJvb2wpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2NvbmZpZyh1aW50NjQpKHVpbnQ2NCx1aW50MzIsYm9vbCxzdHJpbmcsc3RyaW5nLHN0cmluZyxieXRlW10sYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcykiLCBtZXRob2QgImdldF9hc3NldF9pc19mcm96ZW4odWludDY0KWJvb2wiLCBtZXRob2QgImdldF9hY2NvdW50X2lzX2Zyb3plbih1aW50NjQsYWRkcmVzcylib29sIiwgbWV0aG9kICJnZXRfY2lyY3VsYXRpbmdfc3VwcGx5KHVpbnQ2NCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhc3NldF9jcmVhdGUgYXNzZXRfY29uZmlnIGFzc2V0X3RyYW5zZmVyIGFzc2V0X2ZyZWV6ZSBhY2NvdW50X2ZyZWV6ZSBnZXRfYXNzZXRfY29uZmlnIGdldF9hc3NldF9pc19mcm96ZW4gZ2V0X2FjY291bnRfaXNfZnJvemVuIGdldF9jaXJjdWxhdGluZ19zdXBwbHkKICAgIGVycgoKbWFpbl9hc3NldF9kZXN0cm95X3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgYXNzZXRfZGVzdHJveQoKbWFpbl9hc3NldF9jbG9zZV9vdXRfcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkNsb3NlT3V0Il0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDIgLy8gQ2xvc2VPdXQKICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBhc3NldF9jbG9zZV9vdXQKCm1haW5fYXNzZXRfb3B0X2luX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18xIC8vIE9wdEluCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgYXNzZXRfb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIyOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYXZtX2xpYnJhcnkuaW5uZXJfYXNzZXRfdHJhbnNmZXIoeGZlcl9hc3NldDogdWludDY0LCBhc3NldF9hbW91bnQ6IHVpbnQ2NCwgYXNzZXRfc2VuZGVyOiBieXRlcywgYXNzZXRfcmVjZWl2ZXI6IGJ5dGVzKSAtPiB2b2lkOgppbm5lcl9hc3NldF90cmFuc2ZlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo3OC04NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBpbm5lcl9hc3NldF90cmFuc2ZlcigKICAgIC8vICAgICAqLAogICAgLy8gICAgIHhmZXJfYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Ftb3VudDogVUludDY0LAogICAgLy8gICAgIGFzc2V0X3NlbmRlcjogQWNjb3VudCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcjogQWNjb3VudCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDQgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5Ojg2LTkxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD14ZmVyX2Fzc2V0LmlkLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hc3NldF9hbW91bnQsCiAgICAvLyAgICAgYXNzZXRfc2VuZGVyPWFzc2V0X3NlbmRlciwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1hc3NldF9yZWNlaXZlciwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRTZW5kZXIKICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC00CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5Ojg2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5Ojg2LTkxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD14ZmVyX2Fzc2V0LmlkLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hc3NldF9hbW91bnQsCiAgICAvLyAgICAgYXNzZXRfc2VuZGVyPWFzc2V0X3NlbmRlciwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1hc3NldF9yZWNlaXZlciwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmFzc2V0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDMyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyMzYtMjM3CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBVbmF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjM4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc21hcnRfYXNhX2lkLCBlcnIuRVhJU1RJTkdfQ1RSTF9BU0EKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc21hcnRfYXNhX2lkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIENvbnRyb2xsZWQgQVNBIGFscmVhZHkgY3JlYXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyNDAKICAgIC8vIG1ldGFkYXRhX2hhc2gubGVuZ3RoID09IGNmZy5NRVRBREFUQV9IQVNIX0xFTkdUSAogICAgZGlnIDQKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyMzktMjQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2gubGVuZ3RoID09IGNmZy5NRVRBREFUQV9IQVNIX0xFTkdUSAogICAgLy8gKSwgZXJyLklOVkFMSURfTUVUQURBVEFfSEFTSF9MRU5HVEggICMgTm9uLW5vcm1hdGl2ZQogICAgYXNzZXJ0IC8vIEludmFsaWQgTWV0YWRhdGEgSGFzaCBsZW5ndGgsIG11c3QgYmUgMzIgYnl0ZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjUyCiAgICAvLyBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyNTMtMjU1CiAgICAvLyByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyBmcmVlemU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vIGNsYXdiYWNrPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBkdXBuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo0Mi01NQogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD10b3RhbCwKICAgIC8vICAgICBkZWNpbWFscz1kZWNpbWFscywKICAgIC8vICAgICBkZWZhdWx0X2Zyb3plbj1kZWZhdWx0X2Zyb3plbiwKICAgIC8vICAgICB1bml0X25hbWU9dW5pdF9uYW1lLAogICAgLy8gICAgIGFzc2V0X25hbWU9bmFtZSwKICAgIC8vICAgICB1cmw9dXJsLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9bWV0YWRhdGFfaGFzaCwKICAgIC8vICAgICBtYW5hZ2VyPW1hbmFnZXIsCiAgICAvLyAgICAgcmVzZXJ2ZT1yZXNlcnZlLAogICAgLy8gICAgIGZyZWV6ZT1mcmVlemUsCiAgICAvLyAgICAgY2xhd2JhY2s9Y2xhd2JhY2ssCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRDbGF3YmFjawogICAgaXR4bl9maWVsZCBDb25maWdBc3NldEZyZWV6ZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFJlc2VydmUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRNYW5hZ2VyCiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE1ldGFkYXRhSGFzaAogICAgZGlnIDUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVUkwKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgZGlnIDcKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyNDcKICAgIC8vIGRlZmF1bHRfZnJvemVuPWNmZy5ERUZBVUxUX0ZST1pFTiwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVmYXVsdEZyb3plbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyNDYKICAgIC8vIGRlY2ltYWxzPVVJbnQ2NChjZmcuREVDSU1BTFMpLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyNDUKICAgIC8vIHRvdGFsPVVJbnQ2NChjZmcuVE9UQUwpLAogICAgaW50YyA0IC8vIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo0MgogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIHB1c2hpbnQgMyAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo0Mi01NQogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD10b3RhbCwKICAgIC8vICAgICBkZWNpbWFscz1kZWNpbWFscywKICAgIC8vICAgICBkZWZhdWx0X2Zyb3plbj1kZWZhdWx0X2Zyb3plbiwKICAgIC8vICAgICB1bml0X25hbWU9dW5pdF9uYW1lLAogICAgLy8gICAgIGFzc2V0X25hbWU9bmFtZSwKICAgIC8vICAgICB1cmw9dXJsLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9bWV0YWRhdGFfaGFzaCwKICAgIC8vICAgICBtYW5hZ2VyPW1hbmFnZXIsCiAgICAvLyAgICAgcmVzZXJ2ZT1yZXNlcnZlLAogICAgLy8gICAgIGZyZWV6ZT1mcmVlemUsCiAgICAvLyAgICAgY2xhd2JhY2s9Y2xhd2JhY2ssCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI0My0yNDQKICAgIC8vICMgQ3JlYXRlIHRoZSB1bmRlcmx5aW5nIENvbnRyb2xsZWQgQVNBCiAgICAvLyBzZWxmLnNtYXJ0X2FzYV9pZCA9IGlubmVyX2Fzc2V0X2NyZWF0ZSgKICAgIGJ5dGVjXzAgLy8gInNtYXJ0X2FzYV9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo0Mi01NgogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD10b3RhbCwKICAgIC8vICAgICBkZWNpbWFscz1kZWNpbWFscywKICAgIC8vICAgICBkZWZhdWx0X2Zyb3plbj1kZWZhdWx0X2Zyb3plbiwKICAgIC8vICAgICB1bml0X25hbWU9dW5pdF9uYW1lLAogICAgLy8gICAgIGFzc2V0X25hbWU9bmFtZSwKICAgIC8vICAgICB1cmw9dXJsLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9bWV0YWRhdGFfaGFzaCwKICAgIC8vICAgICBtYW5hZ2VyPW1hbmFnZXIsCiAgICAvLyAgICAgcmVzZXJ2ZT1yZXNlcnZlLAogICAgLy8gICAgIGZyZWV6ZT1mcmVlemUsCiAgICAvLyAgICAgY2xhd2JhY2s9Y2xhd2JhY2ssCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2Fzc2V0LmlkCiAgICBpdHhuIENyZWF0ZWRBc3NldElECiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI0My0yNTYKICAgIC8vICMgQ3JlYXRlIHRoZSB1bmRlcmx5aW5nIENvbnRyb2xsZWQgQVNBCiAgICAvLyBzZWxmLnNtYXJ0X2FzYV9pZCA9IGlubmVyX2Fzc2V0X2NyZWF0ZSgKICAgIC8vICAgICB0b3RhbD1VSW50NjQoY2ZnLlRPVEFMKSwKICAgIC8vICAgICBkZWNpbWFscz1VSW50NjQoY2ZnLkRFQ0lNQUxTKSwKICAgIC8vICAgICBkZWZhdWx0X2Zyb3plbj1jZmcuREVGQVVMVF9GUk9aRU4sCiAgICAvLyAgICAgdW5pdF9uYW1lPXVuaXRfbmFtZSwKICAgIC8vICAgICBuYW1lPW5hbWUsCiAgICAvLyAgICAgdXJsPXVybCwKICAgIC8vICAgICBtZXRhZGF0YV9oYXNoPW1ldGFkYXRhX2hhc2gsCiAgICAvLyAgICAgbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBmcmVlemU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBjbGF3YmFjaz1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjYxCiAgICAvLyBkZWNpbWFscz1kZWNpbWFscy5hc191aW50NjQoKSwKICAgIHVuY292ZXIgOQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxODkKICAgIC8vIHNlbGYudG90YWwgPSB0b3RhbAogICAgYnl0ZWMgOCAvLyAidG90YWwiCiAgICB1bmNvdmVyIDExCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYuZGVjaW1hbHMgPSBkZWNpbWFscwogICAgYnl0ZWMgMTAgLy8gImRlY2ltYWxzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTkxCiAgICAvLyBzZWxmLmRlZmF1bHRfZnJvemVuID0gZGVmYXVsdF9mcm96ZW4KICAgIGJ5dGVjIDkgLy8gImRlZmF1bHRfZnJvemVuIgogICAgdW5jb3ZlciA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTIKICAgIC8vIHNlbGYudW5pdF9uYW1lID0gdW5pdF9uYW1lCiAgICBieXRlYyAxMSAvLyAidW5pdF9uYW1lIgogICAgdW5jb3ZlciA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTMKICAgIC8vIHNlbGYubmFtZSA9IG5hbWUKICAgIGJ5dGVjIDEyIC8vICJuYW1lIgogICAgdW5jb3ZlciA3CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTQKICAgIC8vIHNlbGYudXJsID0gdXJsCiAgICBieXRlYyAxMyAvLyAidXJsIgogICAgdW5jb3ZlciA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTUKICAgIC8vIHNlbGYubWV0YWRhdGFfaGFzaCA9IG1ldGFkYXRhX2hhc2gKICAgIGJ5dGVjIDE0IC8vICJtZXRhZGF0YV9oYXNoIgogICAgdW5jb3ZlciA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTYKICAgIC8vIHNlbGYubWFuYWdlcl9hZGRyID0gbWFuYWdlcl9hZGRyCiAgICBieXRlYyA3IC8vICJtYW5hZ2VyX2FkZHIiCiAgICB1bmNvdmVyIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE5NwogICAgLy8gc2VsZi5yZXNlcnZlX2FkZHIgPSByZXNlcnZlX2FkZHIKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYWRkciIKICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTk4CiAgICAvLyBzZWxmLmZyZWV6ZV9hZGRyID0gZnJlZXplX2FkZHIKICAgIGJ5dGVjIDUgLy8gImZyZWV6ZV9hZGRyIgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTkKICAgIC8vIHNlbGYuY2xhd2JhY2tfYWRkciA9IGNsYXdiYWNrX2FkZHIKICAgIGJ5dGVjXzIgLy8gImNsYXdiYWNrX2FkZHIiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyNzMKICAgIC8vIHJldHVybiBzZWxmLnNtYXJ0X2FzYV9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlYyAxNSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuYXNzZXRfb3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfb3B0X2luOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyODYtMjg3CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhhc3NldCkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjkxCiAgICAvLyBhc3NlcnQgY3RybF9hc2Ffb3B0X2luLnhmZXJfYXNzZXQuaWQgPT0gc2VsZi5zbWFydF9hc2FfaWQsIGVyci5PUFRfSU5fV1JPTkdfQVNBCiAgICBkdXAKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBBU0EgT3B0IEluIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gYXNzZXJ0IGN0cmxfYXNhX29wdF9pbi5zZW5kZXIgPT0gVHhuLnNlbmRlciwgZXJyLk9QVF9JTl9XUk9OR19TRU5ERVIKICAgIGRpZyAxCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgQVNBIE9wdCBJbiBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjkzCiAgICAvLyBhc3NlcnQgY3RybF9hc2Ffb3B0X2luLmFzc2V0X3JlY2VpdmVyID09IFR4bi5zZW5kZXIsIGVyci5PUFRfSU5fV1JPTkdfUkVDRUlWRVIKICAgIGRpZyAxCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEFTQSBPcHQgSW4gUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mjk1CiAgICAvLyBjdHJsX2FzYV9vcHRfaW4uYXNzZXRfYW1vdW50ID09IDAKICAgIGRpZyAxCiAgICBndHhucyBBc3NldEFtb3VudAogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyOTQtMjk2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGN0cmxfYXNhX29wdF9pbi5hc3NldF9hbW91bnQgPT0gMAogICAgLy8gKSwgZXJyLk9QVF9JTl9XUk9OR19BTU9VTlQgICMgUGVkYW50OiBDb250cm9sbGVkIEFTQSBpcyBkZWZhdWx0IGZyb3plbgogICAgYXNzZXJ0IC8vIFdyb25nIEFTQSBPcHQgSW4gQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI5OAogICAgLy8gY3RybF9hc2Ffb3B0X2luLmFzc2V0X2Nsb3NlX3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIHN3YXAKICAgIGd0eG5zIEFzc2V0Q2xvc2VUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyOTctMjk5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGN0cmxfYXNhX29wdF9pbi5hc3NldF9jbG9zZV90byA9PSBHbG9iYWwuemVyb19hZGRyZXNzCiAgICAvLyApLCBlcnIuT1BUX0lOX1dST05HX0NMT1NFX1RPCiAgICBhc3NlcnQgLy8gRm9yYmlkZGVuIENsb3NlIE91dCBvbiBPcHQgSW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzAwCiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5PcHRJbiwgZXJyLldST05HX09OX0NPTVBMRVRFCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzEgLy8gT3B0SW4KICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgT24gQ29tcGxldGUgQWN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMwMQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIuaXNfb3B0ZWRfaW4oCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMwMS0zMDMKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyLmlzX29wdGVkX2luKAogICAgLy8gICAgIGFzc2V0CiAgICAvLyApLCBlcnIuTUlTU0lOR19DVFJMX0FTQSAgIyBQZWRhbnQ6IGN0cmxfYXNhX29wdF9pbiBpcyBjaGVja2VkIHByb3Blcmx5CiAgICB1bmNvdmVyIDIKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gTWlzc2luZyBDb250cm9sbGVkIEFTQQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozMDUtMzA2CiAgICAvLyAjIExvY2FsIFN0YXRlIEluaXQKICAgIC8vIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbVHhuLnNlbmRlcl0gPSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMyAvLyAiYWNjb3VudF9zbWFydF9hc2FfaWQiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzA3CiAgICAvLyBzZWxmLmFjY291bnRfZnJvemVuW1R4bi5zZW5kZXJdID0gRmFsc2UKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjIDQgLy8gImFjY291bnRfZnJvemVuIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzExCiAgICAvLyBzZWxmLmRlZmF1bHRfZnJvemVuIG9yIGFzc2V0LmJhbGFuY2UoVHhuLnNlbmRlcikgPiAwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAiZGVmYXVsdF9mcm96ZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdF9mcm96ZW4gZXhpc3RzCiAgICBibnogYXNzZXRfb3B0X2luX2lmX2JvZHlAMwogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgYnogYXNzZXRfb3B0X2luX2FmdGVyX2lmX2Vsc2VANAoKYXNzZXRfb3B0X2luX2lmX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzEzCiAgICAvLyBzZWxmLmFjY291bnRfZnJvemVuW1R4bi5zZW5kZXJdID0gVHJ1ZQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWMgNCAvLyAiYWNjb3VudF9mcm96ZW4iCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2xvY2FsX3B1dAoKYXNzZXRfb3B0X2luX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mjc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnNtYXJ0X2FzYS5jb250cmFjdC5TbWFydEFzYS5hc3NldF9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDMyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNDktMzUwCiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhjb25maWdfYXNzZXQpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzUxCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLm1hbmFnZXJfYWRkciwgZXJyLlVOQVVUSE9SSVpFRF9NQU5BR0VSCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAibWFuYWdlcl9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hbmFnZXJfYWRkciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gVW5hdXRob3JpemVkIE1hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzUyCiAgICAvLyBpZiByZXNlcnZlX2FkZHIgIT0gc2VsZi5yZXNlcnZlX2FkZHI6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAicmVzZXJ2ZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVfYWRkciBleGlzdHMKICAgICE9CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM1MwogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZV9hZGRyICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MsIGVyci5ESVNBQkxFRF9SRVNFUlZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAicmVzZXJ2ZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVfYWRkciBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBSZXNlcnZlIEFkZHJlc3MgaGFzIGJlZW4gZGVsZXRlZAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzU0CiAgICAvLyBpZiBmcmVlemVfYWRkciAhPSBzZWxmLmZyZWV6ZV9hZGRyOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZyZWV6ZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZyZWV6ZV9hZGRyIGV4aXN0cwogICAgZGlnIDIKICAgICE9CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM1NQogICAgLy8gYXNzZXJ0IHNlbGYuZnJlZXplX2FkZHIgIT0gR2xvYmFsLnplcm9fYWRkcmVzcywgZXJyLkRJU0FCTEVEX0ZSRUVaRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZyZWV6ZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZyZWV6ZV9hZGRyIGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIEZyZWV6ZSBBZGRyZXNzIGhhcyBiZWVuIGRlbGV0ZWQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM1NgogICAgLy8gaWYgY2xhd2JhY2tfYWRkciAhPSBzZWxmLmNsYXdiYWNrX2FkZHI6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2xhd2JhY2tfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jbGF3YmFja19hZGRyIGV4aXN0cwogICAgZGlnIDEKICAgICE9CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM1NwogICAgLy8gYXNzZXJ0IHNlbGYuY2xhd2JhY2tfYWRkciAhPSBHbG9iYWwuemVyb19hZGRyZXNzLCBlcnIuRElTQUJMRURfQ0xBV0JBQ0sKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjbGF3YmFja19hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNsYXdiYWNrX2FkZHIgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gQ2xhd2JhY2sgQWRkcmVzcyBoYXMgYmVlbiBkZWxldGVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNTgKICAgIC8vIGFzc2VydCB0b3RhbCA+PSBzZWxmLl9jaXJjdWxhdGluZ19zdXBwbHkoY29uZmlnX2Fzc2V0KSwgZXJyLklOVkFMSURfVE9UQUwKICAgIHVuY292ZXIgMTEKICAgIGNhbGxzdWIgX2NpcmN1bGF0aW5nX3N1cHBseQogICAgdW5jb3ZlciAxMQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID49CiAgICBhc3NlcnQgLy8gSW52YWxpZCBUb3RhbCwgbXVzdCBiZSA+PSBjaXJjdWxhdGluZyBzdXBwbHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzYzCiAgICAvLyBkZWNpbWFscz1kZWNpbWFscy5hc191aW50NjQoKSwKICAgIHVuY292ZXIgMTAKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTg5CiAgICAvLyBzZWxmLnRvdGFsID0gdG90YWwKICAgIGJ5dGVjIDggLy8gInRvdGFsIgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYuZGVjaW1hbHMgPSBkZWNpbWFscwogICAgYnl0ZWMgMTAgLy8gImRlY2ltYWxzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTkxCiAgICAvLyBzZWxmLmRlZmF1bHRfZnJvemVuID0gZGVmYXVsdF9mcm96ZW4KICAgIGJ5dGVjIDkgLy8gImRlZmF1bHRfZnJvemVuIgogICAgdW5jb3ZlciA5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTIKICAgIC8vIHNlbGYudW5pdF9uYW1lID0gdW5pdF9uYW1lCiAgICBieXRlYyAxMSAvLyAidW5pdF9uYW1lIgogICAgdW5jb3ZlciA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTMKICAgIC8vIHNlbGYubmFtZSA9IG5hbWUKICAgIGJ5dGVjIDEyIC8vICJuYW1lIgogICAgdW5jb3ZlciA3CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTQKICAgIC8vIHNlbGYudXJsID0gdXJsCiAgICBieXRlYyAxMyAvLyAidXJsIgogICAgdW5jb3ZlciA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTUKICAgIC8vIHNlbGYubWV0YWRhdGFfaGFzaCA9IG1ldGFkYXRhX2hhc2gKICAgIGJ5dGVjIDE0IC8vICJtZXRhZGF0YV9oYXNoIgogICAgdW5jb3ZlciA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTYKICAgIC8vIHNlbGYubWFuYWdlcl9hZGRyID0gbWFuYWdlcl9hZGRyCiAgICBieXRlYyA3IC8vICJtYW5hZ2VyX2FkZHIiCiAgICB1bmNvdmVyIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE5NwogICAgLy8gc2VsZi5yZXNlcnZlX2FkZHIgPSByZXNlcnZlX2FkZHIKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYWRkciIKICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTk4CiAgICAvLyBzZWxmLmZyZWV6ZV9hZGRyID0gZnJlZXplX2FkZHIKICAgIGJ5dGVjIDUgLy8gImZyZWV6ZV9hZGRyIgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTkKICAgIC8vIHNlbGYuY2xhd2JhY2tfYWRkciA9IGNsYXdiYWNrX2FkZHIKICAgIGJ5dGVjXzIgLy8gImNsYXdiYWNrX2FkZHIiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuYXNzZXRfdHJhbnNmZXJbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF90cmFuc2ZlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mzc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgY292ZXIgNAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozOTMtMzk0CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyh4ZmVyX2Fzc2V0KQogICAgc3dhcAogICAgY2FsbHN1YiBfYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gaWYgYXNzZXRfc2VuZGVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3M6CiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjgyLTgzCiAgICAvLyAjIE1pbnQgcGVybWlzc2lvbiByZXN0cmljdGVkIHRvIFJlc2VydmUuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLnJlc2VydmVfYWRkciwgZXJyLlVOQVVUSE9SSVpFRF9SRVNFUlZFCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAicmVzZXJ2ZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVfYWRkciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gVW5hdXRob3JpemVkIFJlc2VydmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6ODQtODUKICAgIC8vICMgRm9yYmlkZGVuIHNlbGYtbWludCAodG8gQ3JlYXRvcikgYW5kIG92ZXItbWludCAoPiB0b3RhbCkuCiAgICAvLyBhc3NlcnQgYXNzZXRfcmVjZWl2ZXIgIT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgZXJyLlNFTEZfTUlOVAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGRpZyAyCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBGb3JiaWRkZW4gc2VsZiBtaW50aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBhc3NldF9hbW91bnQgKyBzZWxmLl9jaXJjdWxhdGluZ19zdXBwbHkoQXNzZXQoc2VsZi5zbWFydF9hc2FfaWQpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICBjYWxsc3ViIF9jaXJjdWxhdGluZ19zdXBwbHkKICAgIGRpZyA0CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyA8PSBzZWxmLnRvdGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAidG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWwgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojg3LTg4CiAgICAvLyBhc3NldF9hbW91bnQgKyBzZWxmLl9jaXJjdWxhdGluZ19zdXBwbHkoQXNzZXQoc2VsZi5zbWFydF9hc2FfaWQpKQogICAgLy8gPD0gc2VsZi50b3RhbAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6ODYtODkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYXNzZXRfYW1vdW50ICsgc2VsZi5fY2lyY3VsYXRpbmdfc3VwcGx5KEFzc2V0KHNlbGYuc21hcnRfYXNhX2lkKSkKICAgIC8vICAgICA8PSBzZWxmLnRvdGFsCiAgICAvLyApLCBlcnIuT1ZFUl9NSU5UCiAgICBhc3NlcnQgLy8gRm9yYmlkZGVuIG92ZXIgbWludGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo5MgogICAgLy8gc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFthc3NldF9yZWNlaXZlcl0gPT0gc2VsZi5zbWFydF9hc2FfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJhY2NvdW50X3NtYXJ0X2FzYV9pZCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkIGV4aXN0cyBmb3IgYWNjb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo5MC05MwogICAgLy8gIyBJbiB0aGUgY2FzZSBvZiBDb250cm9sbGVkIEFTQSBkZXN0cm95ZWQgYW5kIHJlLWNyZWF0ZWQsIHRoZSBTbWFydCBBREEgSUQgaW4gTG9jYWwgU3RhdGUgY291bGQgYmUgb3V0ZGF0ZWQuCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbYXNzZXRfcmVjZWl2ZXJdID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9DVFJMX0FTQQogICAgYXNzZXJ0IC8vIEludmFsaWQgQ29udHJvbGxlZCBBU0EgSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6OTQKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5nbG9iYWxfZnJvemVuLCBlcnIuR0xPQkFMX0ZST1pFTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImdsb2JhbF9mcm96ZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYmFsX2Zyb3plbiBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTbWFydCBBU0EgaXMgZ2xvYmFsIGZyb3plbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo5NQogICAgLy8gaWYgc2VsZi5yZXNlcnZlX2FkZHIgIT0gc2VsZi5jbGF3YmFja19hZGRyOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlX2FkZHIgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2xhd2JhY2tfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jbGF3YmFja19hZGRyIGV4aXN0cwogICAgIT0KICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6OTYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50X2Zyb3plblthc3NldF9yZWNlaXZlcl0sIGVyci5SRUNFSVZFUl9GUk9aRU4KICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWNjb3VudF9mcm96ZW4iCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X2Zyb3plbiBleGlzdHMgZm9yIGFjY291bnQKICAgICEKICAgIGFzc2VydCAvLyBSZWNlaXZlciBhY2NvdW50IGlzIGZyb3plbgoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDEwLTQxNgogICAgLy8gIyBFZmZlY3RzCiAgICAvLyBpbm5lcl9hc3NldF90cmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXhmZXJfYXNzZXQsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFzc2V0X2Ftb3VudCwKICAgIC8vICAgICBhc3NldF9zZW5kZXI9YXNzZXRfc2VuZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPWFzc2V0X3JlY2VpdmVyLAogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGlubmVyX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mzk5CiAgICAvLyBlbGlmIGFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3M6CiAgICBkaWcgMQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlANQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo5OS0xMDAKICAgIC8vICMgQnVybiBwZXJtaXNzaW9uIHJlc3RyaWN0ZWQgdG8gUmVzZXJ2ZS4KICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYucmVzZXJ2ZV9hZGRyLCBlcnIuVU5BVVRIT1JJWkVEX1JFU0VSVkUKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZV9hZGRyIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gVW5hdXRob3JpemVkIFJlc2VydmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTAzCiAgICAvLyBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2Fzc2V0X3NlbmRlcl0gPT0gc2VsZi5zbWFydF9hc2FfaWQKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiYWNjb3VudF9zbWFydF9hc2FfaWQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZCBleGlzdHMgZm9yIGFjY291bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc21hcnRfYXNhX2lkIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTAxLTEwNAogICAgLy8gIyBJbiBjYXNlIG9mIENvbnRyb2xsZWQgQVNBIGRlc3Ryb3llZCBhbmQgcmUtY3JlYXRlZCB0aGUgU21hcnQgQURBIElEIGluIExvY2FsIFN0YXRlIGNvdWxkIGJlIG91dGRhdGVkLgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2Fzc2V0X3NlbmRlcl0gPT0gc2VsZi5zbWFydF9hc2FfaWQKICAgIC8vICksIGVyci5JTlZBTElEX0NUUkxfQVNBCiAgICBhc3NlcnQgLy8gSW52YWxpZCBDb250cm9sbGVkIEFTQSBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5nbG9iYWxfZnJvemVuLCBlcnIuR0xPQkFMX0ZST1pFTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImdsb2JhbF9mcm96ZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYmFsX2Zyb3plbiBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTbWFydCBBU0EgaXMgZ2xvYmFsIGZyb3plbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMDYKICAgIC8vIGlmIHNlbGYucmVzZXJ2ZV9hZGRyICE9IHNlbGYuY2xhd2JhY2tfYWRkcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjbGF3YmFja19hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNsYXdiYWNrX2FkZHIgZXhpc3RzCiAgICAhPQogICAgYnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50X2Zyb3plblthc3NldF9zZW5kZXJdLCBlcnIuU0VOREVSX0ZST1pFTgogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWNjb3VudF9mcm96ZW4iCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X2Zyb3plbiBleGlzdHMgZm9yIGFjY291bnQKICAgICEKICAgIGFzc2VydCAvLyBTZW5kZXIgYWNjb3VudCBpcyBmcm96ZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTA4LTEwOQogICAgLy8gIyBGb3JiaWRkZW4gY2xhd2JhY2sgdGhyb3VnaCBidXJuaW5nIChidXJuZWQgYW1vdW50IG5vdCBmcm9tIFJlc2VydmUpLgogICAgLy8gYXNzZXJ0IGFzc2V0X3NlbmRlciA9PSBzZWxmLnJlc2VydmVfYWRkciwgZXJyLkNMQVdCQUNLX0JVUk4KICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZV9hZGRyIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBGb3JiaWRkZW4gY2xhd2JhY2sgYnVybmluZwogICAgYiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDEwCgphc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDAxCiAgICAvLyBlbGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5jbGF3YmFja19hZGRyOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNsYXdiYWNrX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2xhd2JhY2tfYWRkciBleGlzdHMKICAgID09CiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlANwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMTYKICAgIC8vIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbYXNzZXRfc2VuZGVyXSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiYWNjb3VudF9zbWFydF9hc2FfaWQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZCBleGlzdHMgZm9yIGFjY291bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc21hcnRfYXNhX2lkIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjExNC0xMTcKICAgIC8vICMgSW4gdGhlIGNhc2Ugb2YgQ29udHJvbGxlZCBBU0EgZGVzdHJveWVkIGFuZCByZS1jcmVhdGVkLCB0aGUgU21hcnQgQURBIElEIGluIExvY2FsIFN0YXRlIGNvdWxkIGJlIG91dGRhdGVkLgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2Fzc2V0X3NlbmRlcl0gPT0gc2VsZi5zbWFydF9hc2FfaWQKICAgIC8vICksIGVyci5JTlZBTElEX0NUUkxfQVNBCiAgICBhc3NlcnQgLy8gSW52YWxpZCBDb250cm9sbGVkIEFTQSBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMTkKICAgIC8vIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbYXNzZXRfcmVjZWl2ZXJdID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFjY291bnRfc21hcnRfYXNhX2lkIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWQgZXhpc3RzIGZvciBhY2NvdW50CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMTgtMTIwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbYXNzZXRfcmVjZWl2ZXJdID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9DVFJMX0FTQQogICAgYXNzZXJ0IC8vIEludmFsaWQgQ29udHJvbGxlZCBBU0EgSUQKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMAoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gYXNzZXRfc2VuZGVyLCBlcnIuVU5BVVRIT1JJWkVEX0NMQVdCQUNLCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIFVuYXV0aG9yaXplZCBDbGF3YmFjawogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMjgKICAgIC8vIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbYXNzZXRfc2VuZGVyXSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiYWNjb3VudF9zbWFydF9hc2FfaWQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZCBleGlzdHMgZm9yIGFjY291bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc21hcnRfYXNhX2lkIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjEyNi0xMjkKICAgIC8vICMgSW4gdGhlIGNhc2Ugb2YgQ29udHJvbGxlZCBBU0EgZGVzdHJveWVkIGFuZCByZS1jcmVhdGVkLCB0aGUgU21hcnQgQURBIElEIGluIExvY2FsIFN0YXRlIGNvdWxkIGJlIG91dGRhdGVkLgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2Fzc2V0X3NlbmRlcl0gPT0gc2VsZi5zbWFydF9hc2FfaWQKICAgIC8vICksIGVyci5JTlZBTElEX0NUUkxfQVNBCiAgICBhc3NlcnQgLy8gSW52YWxpZCBDb250cm9sbGVkIEFTQSBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMzEKICAgIC8vIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbYXNzZXRfcmVjZWl2ZXJdID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiYWNjb3VudF9zbWFydF9hc2FfaWQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZCBleGlzdHMgZm9yIGFjY291bnQKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjEzMC0xMzIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFthc3NldF9yZWNlaXZlcl0gPT0gc2VsZi5zbWFydF9hc2FfaWQKICAgIC8vICksIGVyci5JTlZBTElEX0NUUkxfQVNBCiAgICBhc3NlcnQgLy8gSW52YWxpZCBDb250cm9sbGVkIEFTQSBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMzMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5nbG9iYWxfZnJvemVuLCBlcnIuR0xPQkFMX0ZST1pFTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImdsb2JhbF9mcm96ZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYmFsX2Zyb3plbiBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTbWFydCBBU0EgaXMgZ2xvYmFsIGZyb3plbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMzQKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50X2Zyb3plblthc3NldF9zZW5kZXJdLCBlcnIuU0VOREVSX0ZST1pFTgogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFjY291bnRfZnJvemVuIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9mcm96ZW4gZXhpc3RzIGZvciBhY2NvdW50CiAgICAhCiAgICBhc3NlcnQgLy8gU2VuZGVyIGFjY291bnQgaXMgZnJvemVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRfZnJvemVuW2Fzc2V0X3JlY2VpdmVyXSwgZXJyLlJFQ0VJVkVSX0ZST1pFTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFjY291bnRfZnJvemVuIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9mcm96ZW4gZXhpc3RzIGZvciBhY2NvdW50CiAgICAhCiAgICBhc3NlcnQgLy8gUmVjZWl2ZXIgYWNjb3VudCBpcyBmcm96ZW4KICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuYXNzZXRfZnJlZXplW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfZnJlZXplOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDI3LTQyOAogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoZnJlZXplX2Fzc2V0KQogICAgc3dhcAogICAgY2FsbHN1YiBfYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQyOQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5mcmVlemVfYWRkciwgZXJyLlVOQVVUSE9SSVpFRF9GUkVFWkUKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmcmVlemVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mcmVlemVfYWRkciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gVW5hdXRob3JpemVkIEZyZWV6ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0MzEtNDMyCiAgICAvLyAjIEVmZmVjdHMKICAgIC8vIHNlbGYuZ2xvYmFsX2Zyb3plbiA9IGFzc2V0X2Zyb3plbgogICAgYnl0ZWMgNiAvLyAiZ2xvYmFsX2Zyb3plbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnNtYXJ0X2FzYS5jb250cmFjdC5TbWFydEFzYS5hY2NvdW50X2ZyZWV6ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZnJlZXplOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NDYtNDQ3CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhmcmVlemVfYXNzZXQpCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NDkKICAgIC8vIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbZnJlZXplX2FjY291bnRdID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFjY291bnRfc21hcnRfYXNhX2lkIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWQgZXhpc3RzIGZvciBhY2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAic21hcnRfYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNtYXJ0X2FzYV9pZCBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ0OC00NTAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFtmcmVlemVfYWNjb3VudF0gPT0gc2VsZi5zbWFydF9hc2FfaWQKICAgIC8vICksIGVyci5JTlZBTElEX0NUUkxfQVNBCiAgICBhc3NlcnQgLy8gSW52YWxpZCBDb250cm9sbGVkIEFTQSBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NTEKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuZnJlZXplX2FkZHIsIGVyci5VTkFVVEhPUklaRURfRlJFRVpFCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZnJlZXplX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZnJlZXplX2FkZHIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIFVuYXV0aG9yaXplZCBGcmVlemUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDUzLTQ1NAogICAgLy8gIyBFZmZlY3RzCiAgICAvLyBzZWxmLmFjY291bnRfZnJvemVuW2ZyZWV6ZV9hY2NvdW50XSA9IGFzc2V0X2Zyb3plbgogICAgYnl0ZWMgNCAvLyAiYWNjb3VudF9mcm96ZW4iCiAgICBzd2FwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnNtYXJ0X2FzYS5jb250cmFjdC5TbWFydEFzYS5hc3NldF9jbG9zZV9vdXRbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF9jbG9zZV9vdXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJDbG9zZU91dCJdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTM4CiAgICAvLyBhc2FfY2xvc2Vfb3V0X3JlbGF0aXZlX2lkeCA9IFR4bi5ncm91cF9pbmRleCArIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMzkKICAgIC8vIGFzYV9jbG9zZV9vdXRfdHhuID0gZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24oYXNhX2Nsb3NlX291dF9yZWxhdGl2ZV9pZHgpCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNDAKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLkNsb3NlT3V0LCBlcnIuV1JPTkdfT05fQ09NUExFVEUKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgMiAvLyBDbG9zZU91dAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBPbiBDb21wbGV0ZSBBY3Rpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTQyCiAgICAvLyBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW1R4bi5zZW5kZXJdID09IGNsb3NlX2Fzc2V0LmlkCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiYWNjb3VudF9zbWFydF9hc2FfaWQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZCBleGlzdHMgZm9yIGFjY291bnQKICAgIGRpZyAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNDEtMTQzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbVHhuLnNlbmRlcl0gPT0gY2xvc2VfYXNzZXQuaWQKICAgIC8vICksIGVyci5JTlZBTElEX0NUUkxfQVNBCiAgICBhc3NlcnQgLy8gSW52YWxpZCBDb250cm9sbGVkIEFTQSBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNDUKICAgIC8vIEdsb2JhbC5ncm91cF9zaXplID4gYXNhX2Nsb3NlX291dF9yZWxhdGl2ZV9pZHgKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIGRpZyAxCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE0NC0xNDYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmdyb3VwX3NpemUgPiBhc2FfY2xvc2Vfb3V0X3JlbGF0aXZlX2lkeAogICAgLy8gKSwgZXJyLklOVkFMSURfQ0xPU0VfT1VUX0dST1VQX1NJWkUKICAgIGFzc2VydCAvLyBJbnZhbGlkIENsb3NlIE91dCBncm91cCBzaXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gYXNhX2Nsb3NlX291dF90eG4ueGZlcl9hc3NldC5pZCA9PSBjbG9zZV9hc3NldC5pZAogICAgZHVwCiAgICBndHhucyBYZmVyQXNzZXQKICAgIGRpZyAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNTAtMTUyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGFzYV9jbG9zZV9vdXRfdHhuLnhmZXJfYXNzZXQuaWQgPT0gY2xvc2VfYXNzZXQuaWQKICAgIC8vICksIGVyci5DTE9TRV9PVVRfV1JPTkdfQVNBCiAgICBhc3NlcnQgLy8gV3JvbmcgQVNBIENsb3NlIE91dCBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNTMKICAgIC8vIGFzc2VydCBhc2FfY2xvc2Vfb3V0X3R4bi5zZW5kZXIgPT0gVHhuLnNlbmRlciwgZXJyLkNMT1NFX09VVF9XUk9OR19TRU5ERVIKICAgIGR1cAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEFTQSBDbG9zZSBPdXQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gYXNzZXJ0IGFzYV9jbG9zZV9vdXRfdHhuLmFzc2V0X2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5DTE9TRV9PVVRfV1JPTkdfQU1PVU5UCiAgICBkdXAKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgQVNBIENsb3NlIE91dCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyBhc2FfY2xvc2Vfb3V0X3R4bi5hc3NldF9jbG9zZV90byAhPSBHbG9iYWwuemVyb19hZGRyZXNzCiAgICBndHhucyBBc3NldENsb3NlVG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTU1LTE1NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBhc2FfY2xvc2Vfb3V0X3R4bi5hc3NldF9jbG9zZV90byAhPSBHbG9iYWwuemVyb19hZGRyZXNzCiAgICAvLyApLCBlcnIuQ0xPU0VfT1VUX1dST05HX0NMT1NFX1RPCiAgICBhc3NlcnQgLy8gV3JvbmcgQ2xvc2UgT3V0IG9uIENsb3NlIE91dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NjcKICAgIC8vIGNyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoY2xvc2VfYXNzZXQuaWQpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NjgKICAgIC8vIGlmIGV4aXN0czogICMgU21hcnQgQVNBIGhhcyBub3QgYmVlbiBkZXN0cm95ZWQKICAgIGJ6IGFzc2V0X2Nsb3NlX291dF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTYyCiAgICAvLyBhc2FfY2xvc2Vfb3V0X3JlbGF0aXZlX2lkeCA9IFR4bi5ncm91cF9pbmRleCArIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNjMKICAgIC8vIGFzYV9jbG9zZV9vdXRfdHhuID0gZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24oYXNhX2Nsb3NlX291dF9yZWxhdGl2ZV9pZHgpCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNjUKICAgIC8vIGFzYV9jbG9zZV9vdXRfdHhuLmFzc2V0X2Nsb3NlX3RvID09IGFzc2V0X2NyZWF0b3IKICAgIGd0eG5zIEFzc2V0Q2xvc2VUbwogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTY0LTE2NgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBhc2FfY2xvc2Vfb3V0X3R4bi5hc3NldF9jbG9zZV90byA9PSBhc3NldF9jcmVhdG9yCiAgICAvLyApLCBlcnIuQ0xPU0VfT1VUX1dST05HX0NMT1NFX1RPCiAgICBhc3NlcnQgLy8gV3JvbmcgQ2xvc2UgT3V0IG9uIENsb3NlIE91dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNjcKICAgIC8vIGFzc2VydCBjbG9zZV9hc3NldC5pZCA9PSBzZWxmLnNtYXJ0X2FzYV9pZCwgZXJyLklOVkFMSURfQ1RSTF9BU0EKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc21hcnRfYXNhX2lkIGV4aXN0cwogICAgZGlnIDQKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBDb250cm9sbGVkIEFTQSBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIGNsb3NlX3RvICE9IGNyZWF0b3IKICAgIGRpZyAyCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NzAtNDcyCiAgICAvLyBpZiAoCiAgICAvLyAgICAgY2xvc2VfdG8gIT0gY3JlYXRvcgogICAgLy8gKTogICMgSWYgY2xvc2Utb3V0IHRhcmdldCBpcyBub3QgdGhlIENyZWF0b3IsIHRoZW4gY2xvc2Utb3V0IHRhcmdldCBNVVNUIGJlIG9wdGVkLWluCiAgICBieiBhc3NldF9jbG9zZV9vdXRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ3NAogICAgLy8gc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFtjbG9zZV90b10gPT0gc2VsZi5zbWFydF9hc2FfaWQKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJhY2NvdW50X3NtYXJ0X2FzYV9pZCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkIGV4aXN0cyBmb3IgYWNjb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NzMtNDc1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbY2xvc2VfdG9dID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9DVFJMX0FTQQogICAgYXNzZXJ0IC8vIEludmFsaWQgQ29udHJvbGxlZCBBU0EgSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTcwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZ2xvYmFsX2Zyb3plbiwgZXJyLkdMT0JBTF9GUk9aRU4KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJnbG9iYWxfZnJvemVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JhbF9mcm96ZW4gZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU21hcnQgQVNBIGlzIGdsb2JhbCBmcm96ZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudF9mcm96ZW5bVHhuLnNlbmRlcl0sIGVyci5TRU5ERVJfRlJPWkVOCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWNjb3VudF9mcm96ZW4iCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X2Zyb3plbiBleGlzdHMgZm9yIGFjY291bnQKICAgICEKICAgIGFzc2VydCAvLyBTZW5kZXIgYWNjb3VudCBpcyBmcm96ZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTcyCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudF9mcm96ZW5bY2xvc2VfdG9dLCBlcnIuQ0xPU0VfVE9fRlJPWkVOCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWNjb3VudF9mcm96ZW4iCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X2Zyb3plbiBleGlzdHMgZm9yIGFjY291bnQKICAgICEKICAgIGFzc2VydCAvLyBDbG9zZSB0byBhY2NvdW50IGlzIGZyb3plbgoKYXNzZXRfY2xvc2Vfb3V0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDgxCiAgICAvLyBhc3NldF9hbW91bnQ9Y2xvc2VfYXNzZXQuYmFsYW5jZShUeG4uc2VuZGVyKSwKICAgIHR4biBTZW5kZXIKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0ODIKICAgIC8vIGFzc2V0X3NlbmRlcj1UeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NzgtNDg0CiAgICAvLyAjIEVmZmVjdHMKICAgIC8vIGlubmVyX2Fzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9Y2xvc2VfYXNzZXQsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWNsb3NlX2Fzc2V0LmJhbGFuY2UoVHhuLnNlbmRlciksCiAgICAvLyAgICAgYXNzZXRfc2VuZGVyPVR4bi5zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9Y2xvc2VfdG8sCiAgICAvLyApCiAgICBkaWcgNAogICAgY2FsbHN1YiBpbm5lcl9hc3NldF90cmFuc2ZlcgoKYXNzZXRfY2xvc2Vfb3V0X2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkNsb3NlT3V0Il0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnNtYXJ0X2FzYS5jb250cmFjdC5TbWFydEFzYS5hc3NldF9kZXN0cm95W3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfZGVzdHJveToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ5NC00OTUKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5fYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKGRlc3Ryb3lfYXNzZXQpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0OTYKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYubWFuYWdlcl9hZGRyLCBlcnIuVU5BVVRIT1JJWkVEX01BTkFHRVIKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJtYW5hZ2VyX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFuYWdlcl9hZGRyIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBVbmF1dGhvcml6ZWQgTWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5Ojk2LTk4CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIGNvbmZpZ19hc3NldD1kZXN0cm95X2Fzc2V0LAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5Ojk2CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgcHVzaGludCAzIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5Ojk2LTk4CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIGNvbmZpZ19hc3NldD1kZXN0cm95X2Fzc2V0LAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTAwCiAgICAvLyBzZWxmLnRvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDggLy8gInRvdGFsIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUwMQogICAgLy8gc2VsZi5kZWNpbWFscyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMCAvLyAiZGVjaW1hbHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTAyCiAgICAvLyBzZWxmLmRlZmF1bHRfZnJvemVuID0gRmFsc2UKICAgIGJ5dGVjIDkgLy8gImRlZmF1bHRfZnJvemVuIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUwMwogICAgLy8gc2VsZi51bml0X25hbWUgPSBTdHJpbmcoKQogICAgYnl0ZWMgMTEgLy8gInVuaXRfbmFtZSIKICAgIHB1c2hieXRlcyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTA0CiAgICAvLyBzZWxmLm5hbWUgPSBTdHJpbmcoKQogICAgYnl0ZWMgMTIgLy8gIm5hbWUiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUwNQogICAgLy8gc2VsZi51cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgMTMgLy8gInVybCIKICAgIHB1c2hieXRlcyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTA2CiAgICAvLyBzZWxmLm1ldGFkYXRhX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyAxNCAvLyAibWV0YWRhdGFfaGFzaCIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTA3CiAgICAvLyBzZWxmLm1hbmFnZXJfYWRkciA9IEFjY291bnQoKQogICAgYnl0ZWMgNyAvLyAibWFuYWdlcl9hZGRyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MDgKICAgIC8vIHNlbGYucmVzZXJ2ZV9hZGRyID0gQWNjb3VudCgpCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2FkZHIiCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUwOQogICAgLy8gc2VsZi5mcmVlemVfYWRkciA9IEFjY291bnQoKQogICAgYnl0ZWMgNSAvLyAiZnJlZXplX2FkZHIiCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUxMAogICAgLy8gc2VsZi5jbGF3YmFja19hZGRyID0gQWNjb3VudCgpCiAgICBieXRlY18yIC8vICJjbGF3YmFja19hZGRyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MTEKICAgIC8vIHNlbGYuc21hcnRfYXNhX2lkID0gVUludDY0KCkKICAgIGJ5dGVjXzAgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MTIKICAgIC8vIHNlbGYuZ2xvYmFsX2Zyb3plbiA9IEZhbHNlCiAgICBieXRlYyA2IC8vICJnbG9iYWxfZnJvemVuIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuZ2V0X2Fzc2V0X2NvbmZpZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUyNS01MjYKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5fYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKGFzc2V0KQogICAgY2FsbHN1YiBfYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUzMAogICAgLy8gdG90YWw9c2VsZi50b3RhbCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJ0b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTMxCiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQzMihzZWxmLmRlY2ltYWxzKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiZGVjaW1hbHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVjaW1hbHMgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDQgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MzIKICAgIC8vIGRlZmF1bHRfZnJvemVuPXNlbGYuZGVmYXVsdF9mcm96ZW4sCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAiZGVmYXVsdF9mcm96ZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdF9mcm96ZW4gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUzMwogICAgLy8gdW5pdF9uYW1lPXNlbGYudW5pdF9uYW1lLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJ1bml0X25hbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF9uYW1lIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MzQKICAgIC8vIG5hbWU9c2VsZi5uYW1lLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJuYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5hbWUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUzNQogICAgLy8gdXJsPXNlbGYudXJsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ1cmwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudXJsIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MzYKICAgIC8vIG1ldGFkYXRhX2hhc2g9c2VsZi5tZXRhZGF0YV9oYXNoLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJtZXRhZGF0YV9oYXNoIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhX2hhc2ggZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUzNwogICAgLy8gbWFuYWdlcl9hZGRyPXNlbGYubWFuYWdlcl9hZGRyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gIm1hbmFnZXJfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYW5hZ2VyX2FkZHIgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUzOAogICAgLy8gcmVzZXJ2ZV9hZGRyPXNlbGYucmVzZXJ2ZV9hZGRyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlX2FkZHIgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUzOQogICAgLy8gZnJlZXplX2FkZHI9c2VsZi5mcmVlemVfYWRkciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmcmVlemVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mcmVlemVfYWRkciBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTQwCiAgICAvLyBjbGF3YmFja19hZGRyPXNlbGYuY2xhd2JhY2tfYWRkciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjbGF3YmFja19hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNsYXdiYWNrX2FkZHIgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUyOC01NDEKICAgIC8vICMgRWZmZWN0cwogICAgLy8gcmV0dXJuIEFzc2V0Q29uZmlnKAogICAgLy8gICAgIHRvdGFsPXNlbGYudG90YWwsCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50MzIoc2VsZi5kZWNpbWFscyksCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49c2VsZi5kZWZhdWx0X2Zyb3plbiwKICAgIC8vICAgICB1bml0X25hbWU9c2VsZi51bml0X25hbWUsCiAgICAvLyAgICAgbmFtZT1zZWxmLm5hbWUsCiAgICAvLyAgICAgdXJsPXNlbGYudXJsLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9c2VsZi5tZXRhZGF0YV9oYXNoLAogICAgLy8gICAgIG1hbmFnZXJfYWRkcj1zZWxmLm1hbmFnZXJfYWRkciwKICAgIC8vICAgICByZXNlcnZlX2FkZHI9c2VsZi5yZXNlcnZlX2FkZHIsCiAgICAvLyAgICAgZnJlZXplX2FkZHI9c2VsZi5mcmVlemVfYWRkciwKICAgIC8vICAgICBjbGF3YmFja19hZGRyPXNlbGYuY2xhd2JhY2tfYWRkciwKICAgIC8vICkKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTYgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMTEKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBkaWcgOAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwOTUKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAxNDkKICAgICsKICAgIGRpZyA5CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgKwogICAgZGlnIDkKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICArCiAgICBkaWcgOQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDE1IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnNtYXJ0X2FzYS5jb250cmFjdC5TbWFydEFzYS5nZXRfYXNzZXRfaXNfZnJvemVuW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2Fzc2V0X2lzX2Zyb3plbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTU0LTU1NQogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoZnJlZXplX2Fzc2V0KQogICAgY2FsbHN1YiBfYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU1Ny01NTgKICAgIC8vICMgRWZmZWN0cwogICAgLy8gcmV0dXJuIHNlbGYuZ2xvYmFsX2Zyb3plbgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImdsb2JhbF9mcm96ZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYmFsX2Zyb3plbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDE2IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmdldF9hY2NvdW50X2lzX2Zyb3plbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hY2NvdW50X2lzX2Zyb3plbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1NzQtNTc1CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhmcmVlemVfYXNzZXQpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTc3LTU3OAogICAgLy8gIyBFZmZlY3RzCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X2Zyb3plbltmcmVlemVfYWNjb3VudF0KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJhY2NvdW50X2Zyb3plbiIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfZnJvemVuIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1NjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWMgMTYgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlYyAxNSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuZ2V0X2NpcmN1bGF0aW5nX3N1cHBseVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9jaXJjdWxhdGluZ19zdXBwbHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU5MS01OTIKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5fYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKGFzc2V0KQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTk0LTU5NQogICAgLy8gIyBFZmZlY3RzCiAgICAvLyByZXR1cm4gc2VsZi5fY2lyY3VsYXRpbmdfc3VwcGx5KGFzc2V0KQogICAgY2FsbHN1YiBfY2lyY3VsYXRpbmdfc3VwcGx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBpdG9iCiAgICBieXRlYyAxNSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuX2NpcmN1bGF0aW5nX3N1cHBseShjdHJsX2Fzc2V0OiB1aW50NjQpIC0+IHVpbnQ2NDoKX2NpcmN1bGF0aW5nX3N1cHBseToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NzIKICAgIC8vIGRlZiBfY2lyY3VsYXRpbmdfc3VwcGx5KHNlbGYsIGN0cmxfYXNzZXQ6IEFzc2V0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NzMKICAgIC8vIHJldHVybiBjZmcuVE9UQUwgLSBjdHJsX2Fzc2V0LmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgaW50YyA0IC8vIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICBzd2FwCiAgICAtCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLl9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9uczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NzUKICAgIC8vIGRlZiBfYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo3NgogICAgLy8gYXNzZXJ0IHNlbGYuc21hcnRfYXNhX2lkLCBlcnIuTUlTU0lOR19DVFJMX0FTQQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBNaXNzaW5nIENvbnRyb2xsZWQgQVNBCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5zbWFydF9hc2FfaWQgPT0gYXNzZXQuaWQsIGVyci5JTlZBTElEX0NUUkxfQVNBCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBDb250cm9sbGVkIEFTQSBJRAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAFAAEIIP///////////wEmEQxzbWFydF9hc2FfaWQMcmVzZXJ2ZV9hZGRyDWNsYXdiYWNrX2FkZHIUYWNjb3VudF9zbWFydF9hc2FfaWQOYWNjb3VudF9mcm96ZW4LZnJlZXplX2FkZHINZ2xvYmFsX2Zyb3plbgxtYW5hZ2VyX2FkZHIFdG90YWwOZGVmYXVsdF9mcm96ZW4IZGVjaW1hbHMJdW5pdF9uYW1lBG5hbWUDdXJsDW1ldGFkYXRhX2hhc2gEFR98dQEAMRhAAE4xNSQSRDE0gQUSRDE3FEQxNoECEkQnCCJnJwoiZycJImcnC4AAZycMgABnJw2AAGcnDoAAZycHMgNnKTIDZycFMgNnKjIDZygiZycGImcxG0EAjYIDBEhkFkUEOgRb3ATtZEUvNhoAjgMAZgBaAE4xGRREMRhEggkE5+zVqAT4gZ/rBH6st3UEoTPVgQT/U63vBC6bkDgEl5uZcgRIpjzJBEatDVI2GgCOCQBJAccC6QQPBDUFeAZLBmkGkAAxGYEFEjEYEERCBQ8xGYECEjEYEERCBFcxGSMSMRgQREIBLDEZFDEYFBBDigQAsYv/shSL/rITi/2yEov8shGBBLIQIrIBs4k2GgFJFSQSRBc2GgJJFYEEEkQ2GgNJFSMSRCJTNhoESSJZgQIISwEVEkRXAgA2GgVJIlmBAghLARUSRFcCADYaBkkiWYECCEsBFRJEVwIANhoHSSJZgQIISwEVEkRXAgA2GghJFSUSRDYaCUkVJRJENhoKSRUlEkQ2GgtJFSUSRDEAMgkSRCIoZUQUREsEFSUSRDIKRwOxsiyyK7IqsilLBLIoSwWyJ0sGsiZLB7IlI7IkIrIjIQSyIoEDshAisgGzKLQ8Z08JFycITwtnJwpMZycJTwlnJwtPCGcnDE8HZycNTwZnJw5PBWcnB08EZylPA2cnBU8CZypMZyIoZUQWJw9MULAjQzYaAUkVJBJEF0kxFiMJSTgQgQQSREsBiAVNSTgRIihlRExLARJESwE4ADEAEkRLATgUMQASREsBOBIUREw4FTIDEkQxGSMSRDEATwJwAEUBRDEAK08CZjEAJwQiZiInCWVEQAAKMQBLAXAAREEABjEAJwQjZiNDNhoBSRUkEkQXSTYaAkkVJBJEF0w2GgNJTgIVgQQSRDYaBEkVIxJEIlNMNhoFSSJZgQIISwEVEkRXAgBMNhoGSSJZgQIISwEVEkRXAgBMNhoHSSJZgQIISwEVEkRXAgBMNhoISSJZgQIISwEVEkRXAgBMNhoJSU4CFSUSRDYaCklOAkkVJRJENhoLSU4DFSUSRDYaDElOAxUlEkRMiARRMQAiJwdlRBJEIillRBNBAAgiKWVEMgMTRCInBWVESwITQQAJIicFZUQyAxNEIiplREsBE0EACCIqZUQyAxNETwuIA/5PC0lPAg9ETwoXJwhPAmcnCkxnJwlPCWcnC08IZycMTwdnJw1PBmcnDk8FZycHTwRnKU8DZycFTwJnKkxnI0M2GgFJFSQSRBdJNhoCSRUkEkQXTDYaA0lOAkkVJRJENhoESU4EFSUSREyIA6EyChJBAFUxACIpZUQSRDIKSwJJTwITRCIoZUSIA3RLBAgiJwhlRA5EIitjRCIoZUQSRCInBmVEFEQiKWVEIiplRBNBAAlLASInBGNEFERPA08DTwJPA4j8vSNDSwEyChJBADgxACIpZURMSwESREsBIitjRCIoZUQSRCInBmVEFEQiKmVEE0H/xUcCIicEY0QURCIpZUQSREL/szEAIiplRBJBABlJIitjRCIoZURMSwESREsCIitjRBJEQv+QMQBLAUlOAhJESSIrY0QiKGVETEsBEkRLA0lOAiIrY0QSRCInBmVEFERMIicEY0QURCInBGNEFERC/1U2GgFJFSQSRBc2GgJJFSMSRCJTTIgCkTEAIicFZUQSRCcGTGcjQzYaAUkVJBJEFzYaAkkVJRJENhoDSRUjEkQiU08CiAJiSwEiK2NEIihlRBJEMQAiJwVlRBJEJwRMZiNDNhoBSRUkEkQXSTYaAklOAhUlEkQxFiMISTgQgQQSRDEZgQISRDEAIitjREsCEkQyBEsBDURJOBFLAhJESTgAMQASREk4EhREOBUyAxNEcQtBAFcxFiMISTgQgQQSRDgVSwFJTgISRCIoZURLBBJESwITQQAkSwFJIitjRCIoZUQSRCInBmVEFEQxACInBGNEFEQiJwRjRBREMQBLA0lOAnAARDEASwSI+xIjQzYaAUkVJBJEF0mIAY4xACInB2VEEkSxsiGBA7IQIrIBsycIImcnCiJnJwkiZycLgABnJwyAAGcnDYAAZycOgABnJwcyA2cpMgNnJwUyA2cqMgNnKCJnJwYiZyNDNhoBSRUkEkQXiAEzIicIZUQiJwplRBZJkyUORFcEBCInCWVEIicLZUQiJwxlRCInDWVEIicOZUQiJwdlRCIpZUQiJwVlRCIqZURPChZPClAnECJPC1RQSwgVFlcGAk8JUEyAAgCVUEsBFYGVAQhLCRUWVwYCTwpQSwEWVwYCTwNMUEsBFU8DCEsJFRZXBgJPClBLARZXBgJPA0xQSwEVTwMISwkVFlcGAk8KUEwWVwYCTwJMUE8IUE8HUE8GUE8FUE8EUE8DUE8CUExQJw9MULAjQzYaAUkVJBJEF4gAYCInBmVEJxAiTwJUJw9MULAjQzYaAUkVJBJEFzYaAkkVJRJETIgAOSInBGNEJxAiTwJUJw9MULAjQzYaAUkVJBJEF0mIABqIAAgWJw9MULAjQ4oBATIKi/9wAEQhBEwJiYoBACIoZURJRIv/EkSJ", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 9, "patch": 0 } }, "events": [], "templateVariables": {} }