{ "name": "Arc89SmartAsa", "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": "asa_metadata_registry_init", "args": [ { "type": "uint64", "name": "asset" }, { "type": "uint64", "name": "calls" }, { "type": "bool", "name": "has_mbr_payment" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "arc62_get_circulating_supply", "args": [ { "type": "uint64", "name": "asset_id", "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": {} }, { "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, with ASA Metadata Registry (ARC-89) integration.\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": [ 1113 ], "errorMessage": "Clawback Address has been deleted" }, { "pc": [ 1725 ], "errorMessage": "Close to account is frozen" }, { "pc": [ 649 ], "errorMessage": "Controlled ASA already created" }, { "pc": [ 839 ], "errorMessage": "Forbidden Close Out on Opt In" }, { "pc": [ 1378 ], "errorMessage": "Forbidden clawback burning" }, { "pc": [ 1266 ], "errorMessage": "Forbidden over minting" }, { "pc": [ 1249 ], "errorMessage": "Forbidden self minting" }, { "pc": [ 1095 ], "errorMessage": "Freeze Address has been deleted" }, { "pc": [ 1625 ], "errorMessage": "Invalid Close Out group size" }, { "pc": [ 1276, 1348, 1405, 1413, 1439, 1450, 1557, 1619, 1683, 1702, 2168 ], "errorMessage": "Invalid Controlled ASA ID" }, { "pc": [ 655 ], "errorMessage": "Invalid Metadata Hash length, must be 32 bytes" }, { "pc": [ 1125 ], "errorMessage": "Invalid Total, must be >= circulating supply" }, { "pc": [ 853, 2164 ], "errorMessage": "Missing Controlled ASA" }, { "pc": [ 379 ], "errorMessage": "Must call the ASA Metadata Registry" }, { "pc": [ 451 ], "errorMessage": "Must grant Controlled ASA RBAC to the Smart ASA" }, { "pc": [ 338 ], "errorMessage": "Must pay MBR to the ASA Metadata Registry" }, { "pc": [ 1304, 1472 ], "errorMessage": "Receiver account is frozen" }, { "pc": [ 1075 ], "errorMessage": "Reserve Address has been deleted" }, { "pc": [ 1372, 1465, 1718 ], "errorMessage": "Sender account is frozen" }, { "pc": [ 1283, 1355, 1457, 1709 ], "errorMessage": "Smart ASA is global frozen" }, { "pc": [ 643 ], "errorMessage": "Unauthorized" }, { "pc": [ 1425 ], "errorMessage": "Unauthorized Clawback" }, { "pc": [ 1507, 1566 ], "errorMessage": "Unauthorized Freeze" }, { "pc": [ 324, 1059, 1766 ], "errorMessage": "Unauthorized Manager" }, { "pc": [ 1240, 1336 ], "errorMessage": "Unauthorized Reserve" }, { "pc": [ 1644 ], "errorMessage": "Wrong ASA Close Out Amount" }, { "pc": [ 1632 ], "errorMessage": "Wrong ASA Close Out ID" }, { "pc": [ 1639 ], "errorMessage": "Wrong ASA Close Out Sender" }, { "pc": [ 832 ], "errorMessage": "Wrong ASA Opt In Amount" }, { "pc": [ 810 ], "errorMessage": "Wrong ASA Opt In ID" }, { "pc": [ 826 ], "errorMessage": "Wrong ASA Opt In Receiver" }, { "pc": [ 818 ], "errorMessage": "Wrong ASA Opt In Sender" }, { "pc": [ 1650, 1675 ], "errorMessage": "Wrong Close Out on Close Out" }, { "pc": [ 9 ], "errorMessage": "Wrong Global Bytes allocation" }, { "pc": [ 15 ], "errorMessage": "Wrong Global UInts allocation" }, { "pc": [ 19 ], "errorMessage": "Wrong Local Bytes allocation" }, { "pc": [ 25 ], "errorMessage": "Wrong Local UInts allocation" }, { "pc": [ 844, 1609 ], "errorMessage": "Wrong On Complete Action" }, { "pc": [ 880, 1735, 2150 ], "errorMessage": "account opted into asset" }, { "pc": [ 1302, 1370, 1463, 1470, 1716, 1723, 2103 ], "errorMessage": "check self.account_frozen exists for account" }, { "pc": [ 1270, 1342, 1396, 1411, 1430, 1448, 1551, 1615, 1696 ], "errorMessage": "check self.account_smart_asa_id exists for account" }, { "pc": [ 1099, 1109, 1291, 1359, 1387, 1910 ], "errorMessage": "check self.clawback_addr exists" }, { "pc": [ 1858 ], "errorMessage": "check self.decimals exists" }, { "pc": [ 870, 1872 ], "errorMessage": "check self.default_frozen exists" }, { "pc": [ 1080, 1091, 1505, 1564, 1906 ], "errorMessage": "check self.freeze_addr exists" }, { "pc": [ 1281, 1353, 1455, 1707, 2064 ], "errorMessage": "check self.global_frozen exists" }, { "pc": [ 322, 456, 1057, 1764, 1897 ], "errorMessage": "check self.manager_addr exists" }, { "pc": [ 1892 ], "errorMessage": "check self.metadata_hash exists" }, { "pc": [ 1882 ], "errorMessage": "check self.name exists" }, { "pc": [ 1063, 1071, 1238, 1287, 1331, 1376, 1901 ], "errorMessage": "check self.reserve_addr exists" }, { "pc": [ 647, 764, 805, 1253, 1274, 1346, 1400, 1434, 1555, 1679, 1700, 2162 ], "errorMessage": "check self.smart_asa_id exists" }, { "pc": [ 1264, 1853 ], "errorMessage": "check self.total exists" }, { "pc": [ 1877 ], "errorMessage": "check self.unit_name exists" }, { "pc": [ 1887 ], "errorMessage": "check self.url exists" }, { "pc": [ 543, 560, 577, 594, 939, 957, 975, 993 ], "errorMessage": "invalid array length header" }, { "pc": [ 309, 535, 930, 1492, 1538 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 551, 568, 585, 602, 947, 965, 983, 1001 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 613, 621, 629, 637, 1015, 1026, 1036, 1046, 1212, 1222, 1530, 1592, 2094 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 527, 922 ], "errorMessage": "invalid number of bytes for arc4.uint32" }, { "pc": [ 289, 299, 493, 517, 780, 899, 909, 1189, 1199, 1483, 1521, 1580, 1752, 1844, 2055, 2085, 2124 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 1864 ], "errorMessage": "overflow" }, { "pc": [ 793, 1603, 1666 ], "errorMessage": "transaction type is axfer" } ], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxODQ0Njc0NDA3MzcwOTU1MTYxNSBUTVBMX0FSQzg5X0FQUF9JRAogICAgYnl0ZWNibG9jayAic21hcnRfYXNhX2lkIiAicmVzZXJ2ZV9hZGRyIiAiY2xhd2JhY2tfYWRkciIgImFjY291bnRfc21hcnRfYXNhX2lkIiAiYWNjb3VudF9mcm96ZW4iICJtYW5hZ2VyX2FkZHIiICJmcmVlemVfYWRkciIgImdsb2JhbF9mcm96ZW4iICJ0b3RhbCIgImRlZmF1bHRfZnJvemVuIiAweDE1MWY3Yzc1ICJkZWNpbWFscyIgInVuaXRfbmFtZSIgIm5hbWUiICJ1cmwiICJtZXRhZGF0YV9oYXNoIiAweDAwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ0LTQ1CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MC01MgogICAgLy8gIyBHTE9CQUwgU1RBVEUKICAgIC8vICMgQVNBIEZpZWxkcwogICAgLy8gc2VsZi50b3RhbCA9IFVJbnQ2NCgpCiAgICBieXRlYyA4IC8vICJ0b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MwogICAgLy8gc2VsZi5kZWNpbWFscyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMSAvLyAiZGVjaW1hbHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTQKICAgIC8vIHNlbGYuZGVmYXVsdF9mcm96ZW4gPSBGYWxzZQogICAgYnl0ZWMgOSAvLyAiZGVmYXVsdF9mcm96ZW4iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTUKICAgIC8vIHNlbGYudW5pdF9uYW1lID0gU3RyaW5nKCkKICAgIGJ5dGVjIDEyIC8vICJ1bml0X25hbWUiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBzZWxmLm5hbWUgPSBTdHJpbmcoKQogICAgYnl0ZWMgMTMgLy8gIm5hbWUiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBzZWxmLnVybCA9IFN0cmluZygpCiAgICBieXRlYyAxNCAvLyAidXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5tZXRhZGF0YV9oYXNoID0gQnl0ZXMoKQogICAgYnl0ZWMgMTUgLy8gIm1ldGFkYXRhX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBzZWxmLm1hbmFnZXJfYWRkciA9IEFjY291bnQoKQogICAgYnl0ZWMgNSAvLyAibWFuYWdlcl9hZGRyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi5yZXNlcnZlX2FkZHIgPSBBY2NvdW50KCkKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYWRkciIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NjEKICAgIC8vIHNlbGYuZnJlZXplX2FkZHIgPSBBY2NvdW50KCkKICAgIGJ5dGVjIDYgLy8gImZyZWV6ZV9hZGRyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo2MgogICAgLy8gc2VsZi5jbGF3YmFja19hZGRyID0gQWNjb3VudCgpCiAgICBieXRlY18yIC8vICJjbGF3YmFja19hZGRyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo2My02NAogICAgLy8gIyBTbWFydCBBU0EgRmllbGRzCiAgICAvLyBzZWxmLnNtYXJ0X2FzYV9pZCA9IFVJbnQ2NCgpCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NjUKICAgIC8vIHNlbGYuZ2xvYmFsX2Zyb3plbiA9IEZhbHNlCiAgICBieXRlYyA3IC8vICJnbG9iYWxfZnJvemVuIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6NTMtNjIKICAgIC8vIGNsYXNzIEFyYzg5U21hcnRBc2EoCiAgICAvLyAgICAgU21hcnRBc2EsCiAgICAvLyAgICAgQXJjNjJJbnRlcmZhY2UsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMjQKICAgIHB1c2hieXRlc3MgMHg0ODY0MTY0NSAweDNhMDQ1YmRjIDB4ZWQ2NDQ1MmYgLy8gbWV0aG9kICJhc3NldF9vcHRfaW4odWludDY0LGF4ZmVyKXZvaWQiLCBtZXRob2QgImFzc2V0X2Nsb3NlX291dCh1aW50NjQsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJhc3NldF9kZXN0cm95KHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF9vcHRfaW5fcm91dGVANSBtYWluX2Fzc2V0X2Nsb3NlX291dF9yb3V0ZUA2IG1haW5fYXNzZXRfZGVzdHJveV9yb3V0ZUA3CgptYWluX3N3aXRjaF9jYXNlX25leHRAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6NTMtNjIKICAgIC8vIGNsYXNzIEFyYzg5U21hcnRBc2EoCiAgICAvLyAgICAgU21hcnRBc2EsCiAgICAvLyAgICAgQXJjNjJJbnRlcmZhY2UsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4Y2MzNjk4NmMgMHg1Y2MyYzUzNSAweGU3ZWNkNWE4IDB4Zjg4MTlmZWIgMHg3ZWFjYjc3NSAweGExMzNkNTgxIDB4ZmY1M2FkZWYgMHgyZTliOTAzOCAweDk3OWI5OTcyIDB4NDhhNjNjYzkgMHg0NmFkMGQ1MiAvLyBtZXRob2QgImFzYV9tZXRhZGF0YV9yZWdpc3RyeV9pbml0KHVpbnQ2NCx1aW50NjQsYm9vbCl2b2lkIiwgbWV0aG9kICJhcmM2Ml9nZXRfY2lyY3VsYXRpbmdfc3VwcGx5KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFzc2V0X2NyZWF0ZSh1aW50NjQsdWludDMyLGJvb2wsc3RyaW5nLHN0cmluZyxzdHJpbmcsYnl0ZVtdLGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50MzIsYm9vbCxzdHJpbmcsc3RyaW5nLHN0cmluZyxieXRlW10sYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJhc3NldF90cmFuc2Zlcih1aW50NjQsdWludDY0LGFkZHJlc3MsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJhc3NldF9mcmVlemUodWludDY0LGJvb2wpdm9pZCIsIG1ldGhvZCAiYWNjb3VudF9mcmVlemUodWludDY0LGFkZHJlc3MsYm9vbCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfY29uZmlnKHVpbnQ2NCkodWludDY0LHVpbnQzMixib29sLHN0cmluZyxzdHJpbmcsc3RyaW5nLGJ5dGVbXSxhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2lzX2Zyb3plbih1aW50NjQpYm9vbCIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaXNfZnJvemVuKHVpbnQ2NCxhZGRyZXNzKWJvb2wiLCBtZXRob2QgImdldF9jaXJjdWxhdGluZ19zdXBwbHkodWludDY0KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGFzYV9tZXRhZGF0YV9yZWdpc3RyeV9pbml0IGFyYzYyX2dldF9jaXJjdWxhdGluZ19zdXBwbHkgYXNzZXRfY3JlYXRlIGFzc2V0X2NvbmZpZyBhc3NldF90cmFuc2ZlciBhc3NldF9mcmVlemUgYWNjb3VudF9mcmVlemUgZ2V0X2Fzc2V0X2NvbmZpZyBnZXRfYXNzZXRfaXNfZnJvemVuIGdldF9hY2NvdW50X2lzX2Zyb3plbiBnZXRfY2lyY3VsYXRpbmdfc3VwcGx5CiAgICBlcnIKCm1haW5fYXNzZXRfZGVzdHJveV9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGFzc2V0X2Rlc3Ryb3kKCm1haW5fYXNzZXRfY2xvc2Vfb3V0X3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJDbG9zZU91dCJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCAyIC8vIENsb3NlT3V0CiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgYXNzZXRfY2xvc2Vfb3V0CgptYWluX2Fzc2V0X29wdF9pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMSAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGFzc2V0X29wdF9pbgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyNDoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmF2bV9saWJyYXJ5LmlubmVyX2Fzc2V0X3RyYW5zZmVyKHhmZXJfYXNzZXQ6IHVpbnQ2NCwgYXNzZXRfYW1vdW50OiB1aW50NjQsIGFzc2V0X3NlbmRlcjogYnl0ZXMsIGFzc2V0X3JlY2VpdmVyOiBieXRlcykgLT4gdm9pZDoKaW5uZXJfYXNzZXRfdHJhbnNmZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6NzgtODUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaW5uZXJfYXNzZXRfdHJhbnNmZXIoCiAgICAvLyAgICAgKiwKICAgIC8vICAgICB4ZmVyX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICAgICBhc3NldF9zZW5kZXI6IEFjY291bnQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI6IEFjY291bnQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA0IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo4Ni05MQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9eGZlcl9hc3NldC5pZCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YXNzZXRfYW1vdW50LAogICAgLy8gICAgIGFzc2V0X3NlbmRlcj1hc3NldF9zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9YXNzZXRfcmVjZWl2ZXIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIEFzc2V0U2VuZGVyCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtNAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo4NgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo4Ni05MQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9eGZlcl9hc3NldC5pZCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YXNzZXRfYW1vdW50LAogICAgLy8gICAgIGFzc2V0X3NlbmRlcj1hc3NldF9zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9YXNzZXRfcmVjZWl2ZXIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFyYzg5X3NtYXJ0X2FzYS5jb250cmFjdC5BcmM4OVNtYXJ0QXNhLmFzYV9tZXRhZGF0YV9yZWdpc3RyeV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKYXNhX21ldGFkYXRhX3JlZ2lzdHJ5X2luaXQ6CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6NzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzg5X3NtYXJ0X2FzYS9jb250cmFjdC5weTo3NC03NQogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoYXNzZXQpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6NzYKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYubWFuYWdlcl9hZGRyLCBlcnIuVU5BVVRIT1JJWkVEX01BTkFHRVIKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJtYW5hZ2VyX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFuYWdlcl9hZGRyIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBVbmF1dGhvcml6ZWQgTWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzg5X3NtYXJ0X2FzYS9jb250cmFjdC5weTo3OC04MAogICAgLy8gIyBBbGwgdGhlIHRyYW5zYWN0aW9ucyBhZnRlciB0aGUgQVNBIE1ldGFkYXRhIFJlZ2lzdHJ5IGluaXQgbXVzdCBiZSBjYWxscwogICAgLy8gIyB0byB0aGUgQVNBIE1ldGFkYXRhIFJlZ2lzdHJ5ICh3aXRoIGFuIE1CUiBwYXltZW50LCBpZiByZXF1aXJlZCkuCiAgICAvLyBncm91cF9pbmRleCA9IFR4bi5ncm91cF9pbmRleAogICAgdHhuIEdyb3VwSW5kZXgKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6ODEKICAgIC8vIGlmIGhhc19tYnJfcGF5bWVudDoKICAgIGJ6IGFzYV9tZXRhZGF0YV9yZWdpc3RyeV9pbml0X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzg5X3NtYXJ0X2FzYS9jb250cmFjdC5weTo4MgogICAgLy8gdHhuID0gZ3R4bi5UcmFuc2FjdGlvbihncm91cF9pbmRleCArIDEpCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzg5X3NtYXJ0X2FzYS9jb250cmFjdC5weToyOAogICAgLy8gdHhuLnR5cGUgPT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjODlfc21hcnRfYXNhL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBhc3NlcnQgX2lzX21icl9wYXltZW50KHR4biksIGVyci5JTlZBTElEX0FTQV9NRVRBREFUQV9SRUdJU1RSWV9NQlJfUEFZTUVOVAogICAgYXNzZXJ0IC8vIE11c3QgcGF5IE1CUiB0byB0aGUgQVNBIE1ldGFkYXRhIFJlZ2lzdHJ5Cgphc2FfbWV0YWRhdGFfcmVnaXN0cnlfaW5pdF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjODlfc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShncm91cF9pbmRleCArIDEsIGdyb3VwX2luZGV4ICsgMSArIGNhbGxzKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgKwogICAgYnVyeSAzCgphc2FfbWV0YWRhdGFfcmVnaXN0cnlfaW5pdF9mb3JfaGVhZGVyQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjODlfc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShncm91cF9pbmRleCArIDEsIGdyb3VwX2luZGV4ICsgMSArIGNhbGxzKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IGFzYV9tZXRhZGF0YV9yZWdpc3RyeV9pbml0X2FmdGVyX2ZvckA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjODlfc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM1CiAgICAvLyB0eG4udHlwZSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6MzUtMzcKICAgIC8vIHR4bi50eXBlID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vIGFuZCB0eG4uYXBwX2lkLmlkID09IFRlbXBsYXRlVmFyW1VJbnQ2NF0oQVJDODlfQVBQX0lEKQogICAgLy8gYW5kIHR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgYnogYXNhX21ldGFkYXRhX3JlZ2lzdHJ5X2luaXRfYm9vbF9mYWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzg5X3NtYXJ0X2FzYS9jb250cmFjdC5weTozNgogICAgLy8gYW5kIHR4bi5hcHBfaWQuaWQgPT0gVGVtcGxhdGVWYXJbVUludDY0XShBUkM4OV9BUFBfSUQpCiAgICBkdXAKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIGludGMgNSAvLyBUTVBMX0FSQzg5X0FQUF9JRAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6MzUtMzcKICAgIC8vIHR4bi50eXBlID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vIGFuZCB0eG4uYXBwX2lkLmlkID09IFRlbXBsYXRlVmFyW1VJbnQ2NF0oQVJDODlfQVBQX0lEKQogICAgLy8gYW5kIHR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgYnogYXNhX21ldGFkYXRhX3JlZ2lzdHJ5X2luaXRfYm9vbF9mYWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzg5X3NtYXJ0X2FzYS9jb250cmFjdC5weTozNwogICAgLy8gYW5kIHR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgZHVwCiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6MzUtMzcKICAgIC8vIHR4bi50eXBlID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vIGFuZCB0eG4uYXBwX2lkLmlkID09IFRlbXBsYXRlVmFyW1VJbnQ2NF0oQVJDODlfQVBQX0lEKQogICAgLy8gYW5kIHR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgYm56IGFzYV9tZXRhZGF0YV9yZWdpc3RyeV9pbml0X2Jvb2xfZmFsc2VAMjQKICAgIGludGNfMSAvLyAxCgphc2FfbWV0YWRhdGFfcmVnaXN0cnlfaW5pdF9ib29sX21lcmdlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzg5X3NtYXJ0X2FzYS9jb250cmFjdC5weTo4Ny04OQogICAgLy8gYXNzZXJ0IF9pc19hc2FfbWV0YWRhdGFfcmVnaXN0cnlfY2FsbCgKICAgIC8vICAgICB0eG4KICAgIC8vICksIGVyci5JTlZBTElEX0FTQV9NRVRBREFUQV9SRUdJU1RSWV9DQUxMCiAgICBhc3NlcnQgLy8gTXVzdCBjYWxsIHRoZSBBU0EgTWV0YWRhdGEgUmVnaXN0cnkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKGdyb3VwX2luZGV4ICsgMSwgZ3JvdXBfaW5kZXggKyAxICsgY2FsbHMpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGIgYXNhX21ldGFkYXRhX3JlZ2lzdHJ5X2luaXRfZm9yX2hlYWRlckA0Cgphc2FfbWV0YWRhdGFfcmVnaXN0cnlfaW5pdF9ib29sX2ZhbHNlQDI0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNhX21ldGFkYXRhX3JlZ2lzdHJ5X2luaXRfYm9vbF9tZXJnZUAyNQoKYXNhX21ldGFkYXRhX3JlZ2lzdHJ5X2luaXRfYWZ0ZXJfZm9yQDc6CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6NDQKICAgIC8vIHR4bi50eXBlID09IFRyYW5zYWN0aW9uVHlwZS5Bc3NldENvbmZpZwogICAgZGlnIDEKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6NDQtNDkKICAgIC8vIHR4bi50eXBlID09IFRyYW5zYWN0aW9uVHlwZS5Bc3NldENvbmZpZwogICAgLy8gYW5kIHR4bi5jb25maWdfYXNzZXQgPT0gYXNzZXQKICAgIC8vIGFuZCB0eG4ubWFuYWdlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyBhbmQgdHhuLnJlc2VydmUgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gYW5kIHR4bi5mcmVlemUgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gYW5kIHR4bi5jbGF3YmFjayA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBieiBhc2FfbWV0YWRhdGFfcmVnaXN0cnlfaW5pdF9ib29sX2ZhbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjODlfc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBhbmQgdHhuLmNvbmZpZ19hc3NldCA9PSBhc3NldAogICAgZGlnIDEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0CiAgICBkaWcgMQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6NDQtNDkKICAgIC8vIHR4bi50eXBlID09IFRyYW5zYWN0aW9uVHlwZS5Bc3NldENvbmZpZwogICAgLy8gYW5kIHR4bi5jb25maWdfYXNzZXQgPT0gYXNzZXQKICAgIC8vIGFuZCB0eG4ubWFuYWdlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyBhbmQgdHhuLnJlc2VydmUgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gYW5kIHR4bi5mcmVlemUgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gYW5kIHR4bi5jbGF3YmFjayA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBieiBhc2FfbWV0YWRhdGFfcmVnaXN0cnlfaW5pdF9ib29sX2ZhbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjODlfc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyBhbmQgdHhuLm1hbmFnZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZGlnIDEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjODlfc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ0LTQ5CiAgICAvLyB0eG4udHlwZSA9PSBUcmFuc2FjdGlvblR5cGUuQXNzZXRDb25maWcKICAgIC8vIGFuZCB0eG4uY29uZmlnX2Fzc2V0ID09IGFzc2V0CiAgICAvLyBhbmQgdHhuLm1hbmFnZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gYW5kIHR4bi5yZXNlcnZlID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vIGFuZCB0eG4uZnJlZXplID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vIGFuZCB0eG4uY2xhd2JhY2sgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgYnogYXNhX21ldGFkYXRhX3JlZ2lzdHJ5X2luaXRfYm9vbF9mYWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzg5X3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NwogICAgLy8gYW5kIHR4bi5yZXNlcnZlID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGRpZyAxCiAgICBndHhucyBDb25maWdBc3NldFJlc2VydmUKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzg5X3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NC00OQogICAgLy8gdHhuLnR5cGUgPT0gVHJhbnNhY3Rpb25UeXBlLkFzc2V0Q29uZmlnCiAgICAvLyBhbmQgdHhuLmNvbmZpZ19hc3NldCA9PSBhc3NldAogICAgLy8gYW5kIHR4bi5tYW5hZ2VyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vIGFuZCB0eG4ucmVzZXJ2ZSA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyBhbmQgdHhuLmZyZWV6ZSA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyBhbmQgdHhuLmNsYXdiYWNrID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGJ6IGFzYV9tZXRhZGF0YV9yZWdpc3RyeV9pbml0X2Jvb2xfZmFsc2VAMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6NDgKICAgIC8vIGFuZCB0eG4uZnJlZXplID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGRpZyAxCiAgICBndHhucyBDb25maWdBc3NldEZyZWV6ZQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjODlfc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ0LTQ5CiAgICAvLyB0eG4udHlwZSA9PSBUcmFuc2FjdGlvblR5cGUuQXNzZXRDb25maWcKICAgIC8vIGFuZCB0eG4uY29uZmlnX2Fzc2V0ID09IGFzc2V0CiAgICAvLyBhbmQgdHhuLm1hbmFnZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gYW5kIHR4bi5yZXNlcnZlID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vIGFuZCB0eG4uZnJlZXplID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vIGFuZCB0eG4uY2xhd2JhY2sgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgYnogYXNhX21ldGFkYXRhX3JlZ2lzdHJ5X2luaXRfYm9vbF9mYWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzg5X3NtYXJ0X2FzYS9jb250cmFjdC5weTo0OQogICAgLy8gYW5kIHR4bi5jbGF3YmFjayA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBkaWcgMQogICAgZ3R4bnMgQ29uZmlnQXNzZXRDbGF3YmFjawogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjODlfc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ0LTQ5CiAgICAvLyB0eG4udHlwZSA9PSBUcmFuc2FjdGlvblR5cGUuQXNzZXRDb25maWcKICAgIC8vIGFuZCB0eG4uY29uZmlnX2Fzc2V0ID09IGFzc2V0CiAgICAvLyBhbmQgdHhuLm1hbmFnZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gYW5kIHR4bi5yZXNlcnZlID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vIGFuZCB0eG4uZnJlZXplID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vIGFuZCB0eG4uY2xhd2JhY2sgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgYnogYXNhX21ldGFkYXRhX3JlZ2lzdHJ5X2luaXRfYm9vbF9mYWxzZUAxNQogICAgaW50Y18xIC8vIDEKCmFzYV9tZXRhZGF0YV9yZWdpc3RyeV9pbml0X2Jvb2xfbWVyZ2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjODlfc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQzLTUwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHR4bi50eXBlID09IFRyYW5zYWN0aW9uVHlwZS5Bc3NldENvbmZpZwogICAgLy8gICAgIGFuZCB0eG4uY29uZmlnX2Fzc2V0ID09IGFzc2V0CiAgICAvLyAgICAgYW5kIHR4bi5tYW5hZ2VyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICAgICBhbmQgdHhuLnJlc2VydmUgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gICAgIGFuZCB0eG4uZnJlZXplID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICAgICBhbmQgdHhuLmNsYXdiYWNrID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX0NUUkxfQVNBX1JCQUNfUkVDT05GSUcKICAgIGFzc2VydCAvLyBNdXN0IGdyYW50IENvbnRyb2xsZWQgQVNBIFJCQUMgdG8gdGhlIFNtYXJ0IEFTQQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzg5X3NtYXJ0X2FzYS9jb250cmFjdC5weToxMDAKICAgIC8vIG1hbmFnZXI9c2VsZi5tYW5hZ2VyX2FkZHIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibWFuYWdlcl9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hbmFnZXJfYWRkciBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzg5X3NtYXJ0X2FzYS9jb250cmFjdC5weToxMDItMTAzCiAgICAvLyBmcmVlemU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vIGNsYXdiYWNrPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo2OS03NQogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBjb25maWdfYXNzZXQ9Y29uZmlnX2Fzc2V0LAogICAgLy8gICAgIG1hbmFnZXI9bWFuYWdlciwKICAgIC8vICAgICByZXNlcnZlPXJlc2VydmUsCiAgICAvLyAgICAgZnJlZXplPWZyZWV6ZSwKICAgIC8vICAgICBjbGF3YmFjaz1jbGF3YmFjaywKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRDbGF3YmFjawogICAgaXR4bl9maWVsZCBDb25maWdBc3NldEZyZWV6ZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFJlc2VydmUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRNYW5hZ2VyCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6NjkKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6NjktNzUKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgY29uZmlnX2Fzc2V0PWNvbmZpZ19hc3NldCwKICAgIC8vICAgICBtYW5hZ2VyPW1hbmFnZXIsCiAgICAvLyAgICAgcmVzZXJ2ZT1yZXNlcnZlLAogICAgLy8gICAgIGZyZWV6ZT1mcmVlemUsCiAgICAvLyAgICAgY2xhd2JhY2s9Y2xhd2JhY2ssCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzg5X3NtYXJ0X2FzYS9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc2FfbWV0YWRhdGFfcmVnaXN0cnlfaW5pdF9ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNhX21ldGFkYXRhX3JlZ2lzdHJ5X2luaXRfYm9vbF9tZXJnZUAxNgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hcmM4OV9zbWFydF9hc2EuY29udHJhY3QuQXJjODlTbWFydEFzYS5hcmM2Ml9nZXRfY2lyY3VsYXRpbmdfc3VwcGx5W3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNjJfZ2V0X2NpcmN1bGF0aW5nX3N1cHBseToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6MTA2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6MTE5LTEyMAogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoYXNzZXQpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzg5X3NtYXJ0X2FzYS9jb250cmFjdC5weToxMjItMTIzCiAgICAvLyAjIEVmZmVjdHMKICAgIC8vIHJldHVybiBzZWxmLl9jaXJjdWxhdGluZ19zdXBwbHkoYXNzZXQpCiAgICBjYWxsc3ViIF9jaXJjdWxhdGluZ19zdXBwbHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM4OV9zbWFydF9hc2EvY29udHJhY3QucHk6MTA2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGl0b2IKICAgIGJ5dGVjIDEwIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnNtYXJ0X2FzYS5jb250cmFjdC5TbWFydEFzYS5hc3NldF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF9jcmVhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQzMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjM2LTIzNwogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gVW5hdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnNtYXJ0X2FzYV9pZCwgZXJyLkVYSVNUSU5HX0NUUkxfQVNBCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAic21hcnRfYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNtYXJ0X2FzYV9pZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBDb250cm9sbGVkIEFTQSBhbHJlYWR5IGNyZWF0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjQwCiAgICAvLyBtZXRhZGF0YV9oYXNoLmxlbmd0aCA9PSBjZmcuTUVUQURBVEFfSEFTSF9MRU5HVEgKICAgIGRpZyA0CiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjM5LTI0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBtZXRhZGF0YV9oYXNoLmxlbmd0aCA9PSBjZmcuTUVUQURBVEFfSEFTSF9MRU5HVEgKICAgIC8vICksIGVyci5JTlZBTElEX01FVEFEQVRBX0hBU0hfTEVOR1RIICAjIE5vbi1ub3JtYXRpdmUKICAgIGFzc2VydCAvLyBJbnZhbGlkIE1ldGFkYXRhIEhhc2ggbGVuZ3RoLCBtdXN0IGJlIDMyIGJ5dGVzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjUzLTI1NQogICAgLy8gcmVzZXJ2ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gZnJlZXplPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyBjbGF3YmFjaz1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6NDItNTUKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9dG90YWwsCiAgICAvLyAgICAgZGVjaW1hbHM9ZGVjaW1hbHMsCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49ZGVmYXVsdF9mcm96ZW4sCiAgICAvLyAgICAgdW5pdF9uYW1lPXVuaXRfbmFtZSwKICAgIC8vICAgICBhc3NldF9uYW1lPW5hbWUsCiAgICAvLyAgICAgdXJsPXVybCwKICAgIC8vICAgICBtZXRhZGF0YV9oYXNoPW1ldGFkYXRhX2hhc2gsCiAgICAvLyAgICAgbWFuYWdlcj1tYW5hZ2VyLAogICAgLy8gICAgIHJlc2VydmU9cmVzZXJ2ZSwKICAgIC8vICAgICBmcmVlemU9ZnJlZXplLAogICAgLy8gICAgIGNsYXdiYWNrPWNsYXdiYWNrLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0Q2xhd2JhY2sKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRGcmVlemUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRSZXNlcnZlCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgZGlnIDQKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRNZXRhZGF0YUhhc2gKICAgIGRpZyA1CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VVJMCiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIGRpZyA3CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjQ3CiAgICAvLyBkZWZhdWx0X2Zyb3plbj1jZmcuREVGQVVMVF9GUk9aRU4sCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjQ2CiAgICAvLyBkZWNpbWFscz1VSW50NjQoY2ZnLkRFQ0lNQUxTKSwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVjaW1hbHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjQ1CiAgICAvLyB0b3RhbD1VSW50NjQoY2ZnLlRPVEFMKSwKICAgIGludGMgNCAvLyAxODQ0Njc0NDA3MzcwOTU1MTYxNQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6NDIKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6NDItNTUKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9dG90YWwsCiAgICAvLyAgICAgZGVjaW1hbHM9ZGVjaW1hbHMsCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49ZGVmYXVsdF9mcm96ZW4sCiAgICAvLyAgICAgdW5pdF9uYW1lPXVuaXRfbmFtZSwKICAgIC8vICAgICBhc3NldF9uYW1lPW5hbWUsCiAgICAvLyAgICAgdXJsPXVybCwKICAgIC8vICAgICBtZXRhZGF0YV9oYXNoPW1ldGFkYXRhX2hhc2gsCiAgICAvLyAgICAgbWFuYWdlcj1tYW5hZ2VyLAogICAgLy8gICAgIHJlc2VydmU9cmVzZXJ2ZSwKICAgIC8vICAgICBmcmVlemU9ZnJlZXplLAogICAgLy8gICAgIGNsYXdiYWNrPWNsYXdiYWNrLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyNDMtMjQ0CiAgICAvLyAjIENyZWF0ZSB0aGUgdW5kZXJseWluZyBDb250cm9sbGVkIEFTQQogICAgLy8gc2VsZi5zbWFydF9hc2FfaWQgPSBpbm5lcl9hc3NldF9jcmVhdGUoCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6NDItNTYKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9dG90YWwsCiAgICAvLyAgICAgZGVjaW1hbHM9ZGVjaW1hbHMsCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49ZGVmYXVsdF9mcm96ZW4sCiAgICAvLyAgICAgdW5pdF9uYW1lPXVuaXRfbmFtZSwKICAgIC8vICAgICBhc3NldF9uYW1lPW5hbWUsCiAgICAvLyAgICAgdXJsPXVybCwKICAgIC8vICAgICBtZXRhZGF0YV9oYXNoPW1ldGFkYXRhX2hhc2gsCiAgICAvLyAgICAgbWFuYWdlcj1tYW5hZ2VyLAogICAgLy8gICAgIHJlc2VydmU9cmVzZXJ2ZSwKICAgIC8vICAgICBmcmVlemU9ZnJlZXplLAogICAgLy8gICAgIGNsYXdiYWNrPWNsYXdiYWNrLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hc3NldC5pZAogICAgaXR4biBDcmVhdGVkQXNzZXRJRAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyNDMtMjU2CiAgICAvLyAjIENyZWF0ZSB0aGUgdW5kZXJseWluZyBDb250cm9sbGVkIEFTQQogICAgLy8gc2VsZi5zbWFydF9hc2FfaWQgPSBpbm5lcl9hc3NldF9jcmVhdGUoCiAgICAvLyAgICAgdG90YWw9VUludDY0KGNmZy5UT1RBTCksCiAgICAvLyAgICAgZGVjaW1hbHM9VUludDY0KGNmZy5ERUNJTUFMUyksCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49Y2ZnLkRFRkFVTFRfRlJPWkVOLAogICAgLy8gICAgIHVuaXRfbmFtZT11bml0X25hbWUsCiAgICAvLyAgICAgbmFtZT1uYW1lLAogICAgLy8gICAgIHVybD11cmwsCiAgICAvLyAgICAgbWV0YWRhdGFfaGFzaD1tZXRhZGF0YV9oYXNoLAogICAgLy8gICAgIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgZnJlZXplPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgY2xhd2JhY2s9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gZGVjaW1hbHM9ZGVjaW1hbHMuYXNfdWludDY0KCksCiAgICB1bmNvdmVyIDkKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTg5CiAgICAvLyBzZWxmLnRvdGFsID0gdG90YWwKICAgIGJ5dGVjIDggLy8gInRvdGFsIgogICAgdW5jb3ZlciAxMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTkwCiAgICAvLyBzZWxmLmRlY2ltYWxzID0gZGVjaW1hbHMKICAgIGJ5dGVjIDExIC8vICJkZWNpbWFscyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2VsZi5kZWZhdWx0X2Zyb3plbiA9IGRlZmF1bHRfZnJvemVuCiAgICBieXRlYyA5IC8vICJkZWZhdWx0X2Zyb3plbiIKICAgIHVuY292ZXIgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTkyCiAgICAvLyBzZWxmLnVuaXRfbmFtZSA9IHVuaXRfbmFtZQogICAgYnl0ZWMgMTIgLy8gInVuaXRfbmFtZSIKICAgIHVuY292ZXIgOAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTkzCiAgICAvLyBzZWxmLm5hbWUgPSBuYW1lCiAgICBieXRlYyAxMyAvLyAibmFtZSIKICAgIHVuY292ZXIgNwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTk0CiAgICAvLyBzZWxmLnVybCA9IHVybAogICAgYnl0ZWMgMTQgLy8gInVybCIKICAgIHVuY292ZXIgNgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTk1CiAgICAvLyBzZWxmLm1ldGFkYXRhX2hhc2ggPSBtZXRhZGF0YV9oYXNoCiAgICBieXRlYyAxNSAvLyAibWV0YWRhdGFfaGFzaCIKICAgIHVuY292ZXIgNQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLm1hbmFnZXJfYWRkciA9IG1hbmFnZXJfYWRkcgogICAgYnl0ZWMgNSAvLyAibWFuYWdlcl9hZGRyIgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTcKICAgIC8vIHNlbGYucmVzZXJ2ZV9hZGRyID0gcmVzZXJ2ZV9hZGRyCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2FkZHIiCiAgICB1bmNvdmVyIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gc2VsZi5mcmVlemVfYWRkciA9IGZyZWV6ZV9hZGRyCiAgICBieXRlYyA2IC8vICJmcmVlemVfYWRkciIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTk5CiAgICAvLyBzZWxmLmNsYXdiYWNrX2FkZHIgPSBjbGF3YmFja19hZGRyCiAgICBieXRlY18yIC8vICJjbGF3YmFja19hZGRyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjczCiAgICAvLyByZXR1cm4gc2VsZi5zbWFydF9hc2FfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc21hcnRfYXNhX2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWMgMTAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmFzc2V0X29wdF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X29wdF9pbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mjc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mjg2LTI4NwogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoYXNzZXQpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI5MQogICAgLy8gYXNzZXJ0IGN0cmxfYXNhX29wdF9pbi54ZmVyX2Fzc2V0LmlkID09IHNlbGYuc21hcnRfYXNhX2lkLCBlcnIuT1BUX0lOX1dST05HX0FTQQogICAgZHVwCiAgICBndHhucyBYZmVyQXNzZXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc21hcnRfYXNhX2lkIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgQVNBIE9wdCBJbiBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyOTIKICAgIC8vIGFzc2VydCBjdHJsX2FzYV9vcHRfaW4uc2VuZGVyID09IFR4bi5zZW5kZXIsIGVyci5PUFRfSU5fV1JPTkdfU0VOREVSCiAgICBkaWcgMQogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEFTQSBPcHQgSW4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI5MwogICAgLy8gYXNzZXJ0IGN0cmxfYXNhX29wdF9pbi5hc3NldF9yZWNlaXZlciA9PSBUeG4uc2VuZGVyLCBlcnIuT1BUX0lOX1dST05HX1JFQ0VJVkVSCiAgICBkaWcgMQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBBU0EgT3B0IEluIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI5NQogICAgLy8gY3RybF9hc2Ffb3B0X2luLmFzc2V0X2Ftb3VudCA9PSAwCiAgICBkaWcgMQogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mjk0LTI5NgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjdHJsX2FzYV9vcHRfaW4uYXNzZXRfYW1vdW50ID09IDAKICAgIC8vICksIGVyci5PUFRfSU5fV1JPTkdfQU1PVU5UICAjIFBlZGFudDogQ29udHJvbGxlZCBBU0EgaXMgZGVmYXVsdCBmcm96ZW4KICAgIGFzc2VydCAvLyBXcm9uZyBBU0EgT3B0IEluIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyOTgKICAgIC8vIGN0cmxfYXNhX29wdF9pbi5hc3NldF9jbG9zZV90byA9PSBHbG9iYWwuemVyb19hZGRyZXNzCiAgICBzd2FwCiAgICBndHhucyBBc3NldENsb3NlVG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mjk3LTI5OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjdHJsX2FzYV9vcHRfaW4uYXNzZXRfY2xvc2VfdG8gPT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgLy8gKSwgZXJyLk9QVF9JTl9XUk9OR19DTE9TRV9UTwogICAgYXNzZXJ0IC8vIEZvcmJpZGRlbiBDbG9zZSBPdXQgb24gT3B0IEluCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMwMAogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uT3B0SW4sIGVyci5XUk9OR19PTl9DT01QTEVURQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18xIC8vIE9wdEluCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIE9uIENvbXBsZXRlIEFjdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozMDEKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyLmlzX29wdGVkX2luKAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozMDEtMzAzCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlci5pc19vcHRlZF9pbigKICAgIC8vICAgICBhc3NldAogICAgLy8gKSwgZXJyLk1JU1NJTkdfQ1RSTF9BU0EgICMgUGVkYW50OiBjdHJsX2FzYV9vcHRfaW4gaXMgY2hlY2tlZCBwcm9wZXJseQogICAgdW5jb3ZlciAyCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIE1pc3NpbmcgQ29udHJvbGxlZCBBU0EKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzA1LTMwNgogICAgLy8gIyBMb2NhbCBTdGF0ZSBJbml0CiAgICAvLyBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW1R4bi5zZW5kZXJdID0gc2VsZi5zbWFydF9hc2FfaWQKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjXzMgLy8gImFjY291bnRfc21hcnRfYXNhX2lkIgogICAgdW5jb3ZlciAyCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMwNwogICAgLy8gc2VsZi5hY2NvdW50X2Zyb3plbltUeG4uc2VuZGVyXSA9IEZhbHNlCiAgICB0eG4gU2VuZGVyCiAgICBieXRlYyA0IC8vICJhY2NvdW50X2Zyb3plbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMxMQogICAgLy8gc2VsZi5kZWZhdWx0X2Zyb3plbiBvciBhc3NldC5iYWxhbmNlKFR4bi5zZW5kZXIpID4gMAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImRlZmF1bHRfZnJvemVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRfZnJvemVuIGV4aXN0cwogICAgYm56IGFzc2V0X29wdF9pbl9pZl9ib2R5QDMKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIGJ6IGFzc2V0X29wdF9pbl9hZnRlcl9pZl9lbHNlQDQKCmFzc2V0X29wdF9pbl9pZl9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gc2VsZi5hY2NvdW50X2Zyb3plbltUeG4uc2VuZGVyXSA9IFRydWUKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjIDQgLy8gImFjY291bnRfZnJvemVuIgogICAgaW50Y18xIC8vIDEKICAgIGFwcF9sb2NhbF9wdXQKCmFzc2V0X29wdF9pbl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuYXNzZXRfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQzMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzQ5LTM1MAogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoY29uZmlnX2Fzc2V0KQogICAgc3dhcAogICAgY2FsbHN1YiBfYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5tYW5hZ2VyX2FkZHIsIGVyci5VTkFVVEhPUklaRURfTUFOQUdFUgogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gIm1hbmFnZXJfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYW5hZ2VyX2FkZHIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIFVuYXV0aG9yaXplZCBNYW5hZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM1MgogICAgLy8gaWYgcmVzZXJ2ZV9hZGRyICE9IHNlbGYucmVzZXJ2ZV9hZGRyOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlX2FkZHIgZXhpc3RzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNTMKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVfYWRkciAhPSBHbG9iYWwuemVyb19hZGRyZXNzLCBlcnIuRElTQUJMRURfUkVTRVJWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlX2FkZHIgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gUmVzZXJ2ZSBBZGRyZXNzIGhhcyBiZWVuIGRlbGV0ZWQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM1NAogICAgLy8gaWYgZnJlZXplX2FkZHIgIT0gc2VsZi5mcmVlemVfYWRkcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJmcmVlemVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mcmVlemVfYWRkciBleGlzdHMKICAgIGRpZyAyCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNTUKICAgIC8vIGFzc2VydCBzZWxmLmZyZWV6ZV9hZGRyICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MsIGVyci5ESVNBQkxFRF9GUkVFWkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJmcmVlemVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mcmVlemVfYWRkciBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBGcmVlemUgQWRkcmVzcyBoYXMgYmVlbiBkZWxldGVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNTYKICAgIC8vIGlmIGNsYXdiYWNrX2FkZHIgIT0gc2VsZi5jbGF3YmFja19hZGRyOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNsYXdiYWNrX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2xhd2JhY2tfYWRkciBleGlzdHMKICAgIGRpZyAxCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNTcKICAgIC8vIGFzc2VydCBzZWxmLmNsYXdiYWNrX2FkZHIgIT0gR2xvYmFsLnplcm9fYWRkcmVzcywgZXJyLkRJU0FCTEVEX0NMQVdCQUNLCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2xhd2JhY2tfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jbGF3YmFja19hZGRyIGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIENsYXdiYWNrIEFkZHJlc3MgaGFzIGJlZW4gZGVsZXRlZAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzU4CiAgICAvLyBhc3NlcnQgdG90YWwgPj0gc2VsZi5fY2lyY3VsYXRpbmdfc3VwcGx5KGNvbmZpZ19hc3NldCksIGVyci5JTlZBTElEX1RPVEFMCiAgICB1bmNvdmVyIDExCiAgICBjYWxsc3ViIF9jaXJjdWxhdGluZ19zdXBwbHkKICAgIHVuY292ZXIgMTEKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEludmFsaWQgVG90YWwsIG11c3QgYmUgPj0gY2lyY3VsYXRpbmcgc3VwcGx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM2MwogICAgLy8gZGVjaW1hbHM9ZGVjaW1hbHMuYXNfdWludDY0KCksCiAgICB1bmNvdmVyIDEwCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gc2VsZi50b3RhbCA9IHRvdGFsCiAgICBieXRlYyA4IC8vICJ0b3RhbCIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTkwCiAgICAvLyBzZWxmLmRlY2ltYWxzID0gZGVjaW1hbHMKICAgIGJ5dGVjIDExIC8vICJkZWNpbWFscyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2VsZi5kZWZhdWx0X2Zyb3plbiA9IGRlZmF1bHRfZnJvemVuCiAgICBieXRlYyA5IC8vICJkZWZhdWx0X2Zyb3plbiIKICAgIHVuY292ZXIgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTkyCiAgICAvLyBzZWxmLnVuaXRfbmFtZSA9IHVuaXRfbmFtZQogICAgYnl0ZWMgMTIgLy8gInVuaXRfbmFtZSIKICAgIHVuY292ZXIgOAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTkzCiAgICAvLyBzZWxmLm5hbWUgPSBuYW1lCiAgICBieXRlYyAxMyAvLyAibmFtZSIKICAgIHVuY292ZXIgNwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTk0CiAgICAvLyBzZWxmLnVybCA9IHVybAogICAgYnl0ZWMgMTQgLy8gInVybCIKICAgIHVuY292ZXIgNgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTk1CiAgICAvLyBzZWxmLm1ldGFkYXRhX2hhc2ggPSBtZXRhZGF0YV9oYXNoCiAgICBieXRlYyAxNSAvLyAibWV0YWRhdGFfaGFzaCIKICAgIHVuY292ZXIgNQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLm1hbmFnZXJfYWRkciA9IG1hbmFnZXJfYWRkcgogICAgYnl0ZWMgNSAvLyAibWFuYWdlcl9hZGRyIgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTcKICAgIC8vIHNlbGYucmVzZXJ2ZV9hZGRyID0gcmVzZXJ2ZV9hZGRyCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2FkZHIiCiAgICB1bmNvdmVyIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gc2VsZi5mcmVlemVfYWRkciA9IGZyZWV6ZV9hZGRyCiAgICBieXRlYyA2IC8vICJmcmVlemVfYWRkciIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTk5CiAgICAvLyBzZWxmLmNsYXdiYWNrX2FkZHIgPSBjbGF3YmFja19hZGRyCiAgICBieXRlY18yIC8vICJjbGF3YmFja19hZGRyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmFzc2V0X3RyYW5zZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfdHJhbnNmZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzkzLTM5NAogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoeGZlcl9hc3NldCkKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozOTUKICAgIC8vIGlmIGFzc2V0X3NlbmRlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzOgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo4Mi04MwogICAgLy8gIyBNaW50IHBlcm1pc3Npb24gcmVzdHJpY3RlZCB0byBSZXNlcnZlLgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5yZXNlcnZlX2FkZHIsIGVyci5VTkFVVEhPUklaRURfUkVTRVJWRQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlX2FkZHIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIFVuYXV0aG9yaXplZCBSZXNlcnZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojg0LTg1CiAgICAvLyAjIEZvcmJpZGRlbiBzZWxmLW1pbnQgKHRvIENyZWF0b3IpIGFuZCBvdmVyLW1pbnQgKD4gdG90YWwpLgogICAgLy8gYXNzZXJ0IGFzc2V0X3JlY2VpdmVyICE9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsIGVyci5TRUxGX01JTlQKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgICE9CiAgICBhc3NlcnQgLy8gRm9yYmlkZGVuIHNlbGYgbWludGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo4NwogICAgLy8gYXNzZXRfYW1vdW50ICsgc2VsZi5fY2lyY3VsYXRpbmdfc3VwcGx5KEFzc2V0KHNlbGYuc21hcnRfYXNhX2lkKSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc21hcnRfYXNhX2lkIGV4aXN0cwogICAgY2FsbHN1YiBfY2lyY3VsYXRpbmdfc3VwcGx5CiAgICBkaWcgNAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo4OAogICAgLy8gPD0gc2VsZi50b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInRvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo4Ny04OAogICAgLy8gYXNzZXRfYW1vdW50ICsgc2VsZi5fY2lyY3VsYXRpbmdfc3VwcGx5KEFzc2V0KHNlbGYuc21hcnRfYXNhX2lkKSkKICAgIC8vIDw9IHNlbGYudG90YWwKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojg2LTg5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGFzc2V0X2Ftb3VudCArIHNlbGYuX2NpcmN1bGF0aW5nX3N1cHBseShBc3NldChzZWxmLnNtYXJ0X2FzYV9pZCkpCiAgICAvLyAgICAgPD0gc2VsZi50b3RhbAogICAgLy8gKSwgZXJyLk9WRVJfTUlOVAogICAgYXNzZXJ0IC8vIEZvcmJpZGRlbiBvdmVyIG1pbnRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6OTIKICAgIC8vIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbYXNzZXRfcmVjZWl2ZXJdID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiYWNjb3VudF9zbWFydF9hc2FfaWQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZCBleGlzdHMgZm9yIGFjY291bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc21hcnRfYXNhX2lkIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6OTAtOTMKICAgIC8vICMgSW4gdGhlIGNhc2Ugb2YgQ29udHJvbGxlZCBBU0EgZGVzdHJveWVkIGFuZCByZS1jcmVhdGVkLCB0aGUgU21hcnQgQURBIElEIGluIExvY2FsIFN0YXRlIGNvdWxkIGJlIG91dGRhdGVkLgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2Fzc2V0X3JlY2VpdmVyXSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfQ1RSTF9BU0EKICAgIGFzc2VydCAvLyBJbnZhbGlkIENvbnRyb2xsZWQgQVNBIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZ2xvYmFsX2Zyb3plbiwgZXJyLkdMT0JBTF9GUk9aRU4KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJnbG9iYWxfZnJvemVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JhbF9mcm96ZW4gZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU21hcnQgQVNBIGlzIGdsb2JhbCBmcm96ZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6OTUKICAgIC8vIGlmIHNlbGYucmVzZXJ2ZV9hZGRyICE9IHNlbGYuY2xhd2JhY2tfYWRkcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZV9hZGRyIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNsYXdiYWNrX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2xhd2JhY2tfYWRkciBleGlzdHMKICAgICE9CiAgICBieiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudF9mcm96ZW5bYXNzZXRfcmVjZWl2ZXJdLCBlcnIuUkVDRUlWRVJfRlJPWkVOCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFjY291bnRfZnJvemVuIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9mcm96ZW4gZXhpc3RzIGZvciBhY2NvdW50CiAgICAhCiAgICBhc3NlcnQgLy8gUmVjZWl2ZXIgYWNjb3VudCBpcyBmcm96ZW4KCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQxMC00MTYKICAgIC8vICMgRWZmZWN0cwogICAgLy8gaW5uZXJfYXNzZXRfdHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD14ZmVyX2Fzc2V0LAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hc3NldF9hbW91bnQsCiAgICAvLyAgICAgYXNzZXRfc2VuZGVyPWFzc2V0X3NlbmRlciwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1hc3NldF9yZWNlaXZlciwKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBpbm5lcl9hc3NldF90cmFuc2ZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gZWxpZiBhc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzOgogICAgZGlnIDEKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYnogYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6OTktMTAwCiAgICAvLyAjIEJ1cm4gcGVybWlzc2lvbiByZXN0cmljdGVkIHRvIFJlc2VydmUuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLnJlc2VydmVfYWRkciwgZXJyLlVOQVVUSE9SSVpFRF9SRVNFUlZFCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAicmVzZXJ2ZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVfYWRkciBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIFVuYXV0aG9yaXplZCBSZXNlcnZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFthc3NldF9zZW5kZXJdID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFjY291bnRfc21hcnRfYXNhX2lkIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWQgZXhpc3RzIGZvciBhY2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAic21hcnRfYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNtYXJ0X2FzYV9pZCBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjEwMS0xMDQKICAgIC8vICMgSW4gY2FzZSBvZiBDb250cm9sbGVkIEFTQSBkZXN0cm95ZWQgYW5kIHJlLWNyZWF0ZWQgdGhlIFNtYXJ0IEFEQSBJRCBpbiBMb2NhbCBTdGF0ZSBjb3VsZCBiZSBvdXRkYXRlZC4KICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFthc3NldF9zZW5kZXJdID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9DVFJMX0FTQQogICAgYXNzZXJ0IC8vIEludmFsaWQgQ29udHJvbGxlZCBBU0EgSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTA1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZ2xvYmFsX2Zyb3plbiwgZXJyLkdMT0JBTF9GUk9aRU4KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJnbG9iYWxfZnJvemVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JhbF9mcm96ZW4gZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU21hcnQgQVNBIGlzIGdsb2JhbCBmcm96ZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTA2CiAgICAvLyBpZiBzZWxmLnJlc2VydmVfYWRkciAhPSBzZWxmLmNsYXdiYWNrX2FkZHI6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2xhd2JhY2tfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jbGF3YmFja19hZGRyIGV4aXN0cwogICAgIT0KICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTA3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudF9mcm96ZW5bYXNzZXRfc2VuZGVyXSwgZXJyLlNFTkRFUl9GUk9aRU4KICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFjY291bnRfZnJvemVuIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9mcm96ZW4gZXhpc3RzIGZvciBhY2NvdW50CiAgICAhCiAgICBhc3NlcnQgLy8gU2VuZGVyIGFjY291bnQgaXMgZnJvemVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjEwOC0xMDkKICAgIC8vICMgRm9yYmlkZGVuIGNsYXdiYWNrIHRocm91Z2ggYnVybmluZyAoYnVybmVkIGFtb3VudCBub3QgZnJvbSBSZXNlcnZlKS4KICAgIC8vIGFzc2VydCBhc3NldF9zZW5kZXIgPT0gc2VsZi5yZXNlcnZlX2FkZHIsIGVyci5DTEFXQkFDS19CVVJOCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAicmVzZXJ2ZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVfYWRkciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gRm9yYmlkZGVuIGNsYXdiYWNrIGJ1cm5pbmcKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMAoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gZWxpZiBUeG4uc2VuZGVyID09IHNlbGYuY2xhd2JhY2tfYWRkcjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjbGF3YmFja19hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNsYXdiYWNrX2FkZHIgZXhpc3RzCiAgICA9PQogICAgYnogYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTE2CiAgICAvLyBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2Fzc2V0X3NlbmRlcl0gPT0gc2VsZi5zbWFydF9hc2FfaWQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFjY291bnRfc21hcnRfYXNhX2lkIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWQgZXhpc3RzIGZvciBhY2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAic21hcnRfYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNtYXJ0X2FzYV9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMTQtMTE3CiAgICAvLyAjIEluIHRoZSBjYXNlIG9mIENvbnRyb2xsZWQgQVNBIGRlc3Ryb3llZCBhbmQgcmUtY3JlYXRlZCwgdGhlIFNtYXJ0IEFEQSBJRCBpbiBMb2NhbCBTdGF0ZSBjb3VsZCBiZSBvdXRkYXRlZC4KICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFthc3NldF9zZW5kZXJdID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9DVFJMX0FTQQogICAgYXNzZXJ0IC8vIEludmFsaWQgQ29udHJvbGxlZCBBU0EgSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTE5CiAgICAvLyBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2Fzc2V0X3JlY2VpdmVyXSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJhY2NvdW50X3NtYXJ0X2FzYV9pZCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkIGV4aXN0cyBmb3IgYWNjb3VudAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTE4LTEyMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2Fzc2V0X3JlY2VpdmVyXSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfQ1RSTF9BU0EKICAgIGFzc2VydCAvLyBJbnZhbGlkIENvbnRyb2xsZWQgQVNBIElECiAgICBiIGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTAKCmFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMjUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGFzc2V0X3NlbmRlciwgZXJyLlVOQVVUSE9SSVpFRF9DTEFXQkFDSwogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBVbmF1dGhvcml6ZWQgQ2xhd2JhY2sKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTI4CiAgICAvLyBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2Fzc2V0X3NlbmRlcl0gPT0gc2VsZi5zbWFydF9hc2FfaWQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFjY291bnRfc21hcnRfYXNhX2lkIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWQgZXhpc3RzIGZvciBhY2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAic21hcnRfYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNtYXJ0X2FzYV9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMjYtMTI5CiAgICAvLyAjIEluIHRoZSBjYXNlIG9mIENvbnRyb2xsZWQgQVNBIGRlc3Ryb3llZCBhbmQgcmUtY3JlYXRlZCwgdGhlIFNtYXJ0IEFEQSBJRCBpbiBMb2NhbCBTdGF0ZSBjb3VsZCBiZSBvdXRkYXRlZC4KICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFthc3NldF9zZW5kZXJdID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9DVFJMX0FTQQogICAgYXNzZXJ0IC8vIEludmFsaWQgQ29udHJvbGxlZCBBU0EgSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTMxCiAgICAvLyBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2Fzc2V0X3JlY2VpdmVyXSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFjY291bnRfc21hcnRfYXNhX2lkIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWQgZXhpc3RzIGZvciBhY2NvdW50CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMzAtMTMyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbYXNzZXRfcmVjZWl2ZXJdID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9DVFJMX0FTQQogICAgYXNzZXJ0IC8vIEludmFsaWQgQ29udHJvbGxlZCBBU0EgSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTMzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZ2xvYmFsX2Zyb3plbiwgZXJyLkdMT0JBTF9GUk9aRU4KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJnbG9iYWxfZnJvemVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JhbF9mcm96ZW4gZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU21hcnQgQVNBIGlzIGdsb2JhbCBmcm96ZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTM0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudF9mcm96ZW5bYXNzZXRfc2VuZGVyXSwgZXJyLlNFTkRFUl9GUk9aRU4KICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJhY2NvdW50X2Zyb3plbiIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfZnJvemVuIGV4aXN0cyBmb3IgYWNjb3VudAogICAgIQogICAgYXNzZXJ0IC8vIFNlbmRlciBhY2NvdW50IGlzIGZyb3plbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMzUKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50X2Zyb3plblthc3NldF9yZWNlaXZlcl0sIGVyci5SRUNFSVZFUl9GUk9aRU4KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJhY2NvdW50X2Zyb3plbiIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfZnJvemVuIGV4aXN0cyBmb3IgYWNjb3VudAogICAgIQogICAgYXNzZXJ0IC8vIFJlY2VpdmVyIGFjY291bnQgaXMgZnJvemVuCiAgICBiIGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTAKCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmFzc2V0X2ZyZWV6ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X2ZyZWV6ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQyNy00MjgKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5fYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKGZyZWV6ZV9hc3NldCkKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0MjkKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuZnJlZXplX2FkZHIsIGVyci5VTkFVVEhPUklaRURfRlJFRVpFCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiZnJlZXplX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZnJlZXplX2FkZHIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIFVuYXV0aG9yaXplZCBGcmVlemUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDMxLTQzMgogICAgLy8gIyBFZmZlY3RzCiAgICAvLyBzZWxmLmdsb2JhbF9mcm96ZW4gPSBhc3NldF9mcm96ZW4KICAgIGJ5dGVjIDcgLy8gImdsb2JhbF9mcm96ZW4iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuYWNjb3VudF9mcmVlemVbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2ZyZWV6ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDQ2LTQ0NwogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoZnJlZXplX2Fzc2V0KQogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDQ5CiAgICAvLyBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2ZyZWV6ZV9hY2NvdW50XSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJhY2NvdW50X3NtYXJ0X2FzYV9pZCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkIGV4aXN0cyBmb3IgYWNjb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NDgtNDUwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbZnJlZXplX2FjY291bnRdID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9DVFJMX0FTQQogICAgYXNzZXJ0IC8vIEludmFsaWQgQ29udHJvbGxlZCBBU0EgSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDUxCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmZyZWV6ZV9hZGRyLCBlcnIuVU5BVVRIT1JJWkVEX0ZSRUVaRQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImZyZWV6ZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZyZWV6ZV9hZGRyIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBVbmF1dGhvcml6ZWQgRnJlZXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ1My00NTQKICAgIC8vICMgRWZmZWN0cwogICAgLy8gc2VsZi5hY2NvdW50X2Zyb3plbltmcmVlemVfYWNjb3VudF0gPSBhc3NldF9mcm96ZW4KICAgIGJ5dGVjIDQgLy8gImFjY291bnRfZnJvemVuIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuYXNzZXRfY2xvc2Vfb3V0W3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfY2xvc2Vfb3V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiQ2xvc2VPdXQiXSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gYXNhX2Nsb3NlX291dF9yZWxhdGl2ZV9pZHggPSBUeG4uZ3JvdXBfaW5kZXggKyAxCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTM5CiAgICAvLyBhc2FfY2xvc2Vfb3V0X3R4biA9IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uKGFzYV9jbG9zZV9vdXRfcmVsYXRpdmVfaWR4KQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTQwCiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5DbG9zZU91dCwgZXJyLldST05HX09OX0NPTVBMRVRFCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDIgLy8gQ2xvc2VPdXQKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgT24gQ29tcGxldGUgQWN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE0MgogICAgLy8gc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFtUeG4uc2VuZGVyXSA9PSBjbG9zZV9hc3NldC5pZAogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFjY291bnRfc21hcnRfYXNhX2lkIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWQgZXhpc3RzIGZvciBhY2NvdW50CiAgICBkaWcgMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTQxLTE0MwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW1R4bi5zZW5kZXJdID09IGNsb3NlX2Fzc2V0LmlkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9DVFJMX0FTQQogICAgYXNzZXJ0IC8vIEludmFsaWQgQ29udHJvbGxlZCBBU0EgSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTQ1CiAgICAvLyBHbG9iYWwuZ3JvdXBfc2l6ZSA+IGFzYV9jbG9zZV9vdXRfcmVsYXRpdmVfaWR4CiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICBkaWcgMQogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5ncm91cF9zaXplID4gYXNhX2Nsb3NlX291dF9yZWxhdGl2ZV9pZHgKICAgIC8vICksIGVyci5JTlZBTElEX0NMT1NFX09VVF9HUk9VUF9TSVpFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBDbG9zZSBPdXQgZ3JvdXAgc2l6ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNTEKICAgIC8vIGFzYV9jbG9zZV9vdXRfdHhuLnhmZXJfYXNzZXQuaWQgPT0gY2xvc2VfYXNzZXQuaWQKICAgIGR1cAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBkaWcgMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTUwLTE1MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBhc2FfY2xvc2Vfb3V0X3R4bi54ZmVyX2Fzc2V0LmlkID09IGNsb3NlX2Fzc2V0LmlkCiAgICAvLyApLCBlcnIuQ0xPU0VfT1VUX1dST05HX0FTQQogICAgYXNzZXJ0IC8vIFdyb25nIEFTQSBDbG9zZSBPdXQgSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTUzCiAgICAvLyBhc3NlcnQgYXNhX2Nsb3NlX291dF90eG4uc2VuZGVyID09IFR4bi5zZW5kZXIsIGVyci5DTE9TRV9PVVRfV1JPTkdfU0VOREVSCiAgICBkdXAKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBBU0EgQ2xvc2UgT3V0IFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNTQKICAgIC8vIGFzc2VydCBhc2FfY2xvc2Vfb3V0X3R4bi5hc3NldF9hbW91bnQgPT0gVUludDY0KDApLCBlcnIuQ0xPU0VfT1VUX1dST05HX0FNT1VOVAogICAgZHVwCiAgICBndHhucyBBc3NldEFtb3VudAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIEFTQSBDbG9zZSBPdXQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gYXNhX2Nsb3NlX291dF90eG4uYXNzZXRfY2xvc2VfdG8gIT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgZ3R4bnMgQXNzZXRDbG9zZVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE1NS0xNTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYXNhX2Nsb3NlX291dF90eG4uYXNzZXRfY2xvc2VfdG8gIT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgLy8gKSwgZXJyLkNMT1NFX09VVF9XUk9OR19DTE9TRV9UTwogICAgYXNzZXJ0IC8vIFdyb25nIENsb3NlIE91dCBvbiBDbG9zZSBPdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDY3CiAgICAvLyBjcmVhdG9yLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jcmVhdG9yKGNsb3NlX2Fzc2V0LmlkKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDY4CiAgICAvLyBpZiBleGlzdHM6ICAjIFNtYXJ0IEFTQSBoYXMgbm90IGJlZW4gZGVzdHJveWVkCiAgICBieiBhc3NldF9jbG9zZV9vdXRfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gYXNhX2Nsb3NlX291dF9yZWxhdGl2ZV9pZHggPSBUeG4uZ3JvdXBfaW5kZXggKyAxCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTYzCiAgICAvLyBhc2FfY2xvc2Vfb3V0X3R4biA9IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uKGFzYV9jbG9zZV9vdXRfcmVsYXRpdmVfaWR4KQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTY1CiAgICAvLyBhc2FfY2xvc2Vfb3V0X3R4bi5hc3NldF9jbG9zZV90byA9PSBhc3NldF9jcmVhdG9yCiAgICBndHhucyBBc3NldENsb3NlVG8KICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE2NC0xNjYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYXNhX2Nsb3NlX291dF90eG4uYXNzZXRfY2xvc2VfdG8gPT0gYXNzZXRfY3JlYXRvcgogICAgLy8gKSwgZXJyLkNMT1NFX09VVF9XUk9OR19DTE9TRV9UTwogICAgYXNzZXJ0IC8vIFdyb25nIENsb3NlIE91dCBvbiBDbG9zZSBPdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTY3CiAgICAvLyBhc3NlcnQgY2xvc2VfYXNzZXQuaWQgPT0gc2VsZi5zbWFydF9hc2FfaWQsIGVyci5JTlZBTElEX0NUUkxfQVNBCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAic21hcnRfYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNtYXJ0X2FzYV9pZCBleGlzdHMKICAgIGRpZyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgQ29udHJvbGxlZCBBU0EgSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDcxCiAgICAvLyBjbG9zZV90byAhPSBjcmVhdG9yCiAgICBkaWcgMgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDcwLTQ3MgogICAgLy8gaWYgKAogICAgLy8gICAgIGNsb3NlX3RvICE9IGNyZWF0b3IKICAgIC8vICk6ICAjIElmIGNsb3NlLW91dCB0YXJnZXQgaXMgbm90IHRoZSBDcmVhdG9yLCB0aGVuIGNsb3NlLW91dCB0YXJnZXQgTVVTVCBiZSBvcHRlZC1pbgogICAgYnogYXNzZXRfY2xvc2Vfb3V0X2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NzQKICAgIC8vIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbY2xvc2VfdG9dID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiYWNjb3VudF9zbWFydF9hc2FfaWQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZCBleGlzdHMgZm9yIGFjY291bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc21hcnRfYXNhX2lkIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDczLTQ3NQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2Nsb3NlX3RvXSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfQ1RSTF9BU0EKICAgIGFzc2VydCAvLyBJbnZhbGlkIENvbnRyb2xsZWQgQVNBIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmdsb2JhbF9mcm96ZW4sIGVyci5HTE9CQUxfRlJPWkVOCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiZ2xvYmFsX2Zyb3plbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iYWxfZnJvemVuIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFNtYXJ0IEFTQSBpcyBnbG9iYWwgZnJvemVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRfZnJvemVuW1R4bi5zZW5kZXJdLCBlcnIuU0VOREVSX0ZST1pFTgogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFjY291bnRfZnJvemVuIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9mcm96ZW4gZXhpc3RzIGZvciBhY2NvdW50CiAgICAhCiAgICBhc3NlcnQgLy8gU2VuZGVyIGFjY291bnQgaXMgZnJvemVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRfZnJvemVuW2Nsb3NlX3RvXSwgZXJyLkNMT1NFX1RPX0ZST1pFTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFjY291bnRfZnJvemVuIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9mcm96ZW4gZXhpc3RzIGZvciBhY2NvdW50CiAgICAhCiAgICBhc3NlcnQgLy8gQ2xvc2UgdG8gYWNjb3VudCBpcyBmcm96ZW4KCmFzc2V0X2Nsb3NlX291dF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ4MQogICAgLy8gYXNzZXRfYW1vdW50PWNsb3NlX2Fzc2V0LmJhbGFuY2UoVHhuLnNlbmRlciksCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDgyCiAgICAvLyBhc3NldF9zZW5kZXI9VHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDc4LTQ4NAogICAgLy8gIyBFZmZlY3RzCiAgICAvLyBpbm5lcl9hc3NldF90cmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWNsb3NlX2Fzc2V0LAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1jbG9zZV9hc3NldC5iYWxhbmNlKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIGFzc2V0X3NlbmRlcj1UeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPWNsb3NlX3RvLAogICAgLy8gKQogICAgZGlnIDQKICAgIGNhbGxzdWIgaW5uZXJfYXNzZXRfdHJhbnNmZXIKCmFzc2V0X2Nsb3NlX291dF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJDbG9zZU91dCJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuYXNzZXRfZGVzdHJveVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X2Rlc3Ryb3k6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0OTQtNDk1CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhkZXN0cm95X2Fzc2V0KQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDk2CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLm1hbmFnZXJfYWRkciwgZXJyLlVOQVVUSE9SSVpFRF9NQU5BR0VSCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibWFuYWdlcl9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hbmFnZXJfYWRkciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gVW5hdXRob3JpemVkIE1hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo5Ni05OAogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBjb25maWdfYXNzZXQ9ZGVzdHJveV9hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo5NgogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIHB1c2hpbnQgMyAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo5Ni05OAogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBjb25maWdfYXNzZXQ9ZGVzdHJveV9hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUwMAogICAgLy8gc2VsZi50b3RhbCA9IFVJbnQ2NCgpCiAgICBieXRlYyA4IC8vICJ0b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MDEKICAgIC8vIHNlbGYuZGVjaW1hbHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gImRlY2ltYWxzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUwMgogICAgLy8gc2VsZi5kZWZhdWx0X2Zyb3plbiA9IEZhbHNlCiAgICBieXRlYyA5IC8vICJkZWZhdWx0X2Zyb3plbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MDMKICAgIC8vIHNlbGYudW5pdF9uYW1lID0gU3RyaW5nKCkKICAgIGJ5dGVjIDEyIC8vICJ1bml0X25hbWUiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUwNAogICAgLy8gc2VsZi5uYW1lID0gU3RyaW5nKCkKICAgIGJ5dGVjIDEzIC8vICJuYW1lIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MDUKICAgIC8vIHNlbGYudXJsID0gU3RyaW5nKCkKICAgIGJ5dGVjIDE0IC8vICJ1cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUwNgogICAgLy8gc2VsZi5tZXRhZGF0YV9oYXNoID0gQnl0ZXMoKQogICAgYnl0ZWMgMTUgLy8gIm1ldGFkYXRhX2hhc2giCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUwNwogICAgLy8gc2VsZi5tYW5hZ2VyX2FkZHIgPSBBY2NvdW50KCkKICAgIGJ5dGVjIDUgLy8gIm1hbmFnZXJfYWRkciIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTA4CiAgICAvLyBzZWxmLnJlc2VydmVfYWRkciA9IEFjY291bnQoKQogICAgYnl0ZWNfMSAvLyAicmVzZXJ2ZV9hZGRyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MDkKICAgIC8vIHNlbGYuZnJlZXplX2FkZHIgPSBBY2NvdW50KCkKICAgIGJ5dGVjIDYgLy8gImZyZWV6ZV9hZGRyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MTAKICAgIC8vIHNlbGYuY2xhd2JhY2tfYWRkciA9IEFjY291bnQoKQogICAgYnl0ZWNfMiAvLyAiY2xhd2JhY2tfYWRkciIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTExCiAgICAvLyBzZWxmLnNtYXJ0X2FzYV9pZCA9IFVJbnQ2NCgpCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTEyCiAgICAvLyBzZWxmLmdsb2JhbF9mcm96ZW4gPSBGYWxzZQogICAgYnl0ZWMgNyAvLyAiZ2xvYmFsX2Zyb3plbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmdldF9hc3NldF9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXNzZXRfY29uZmlnOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MjUtNTI2CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhhc3NldCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MzAKICAgIC8vIHRvdGFsPXNlbGYudG90YWwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAidG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWwgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gZGVjaW1hbHM9YXJjNC5VSW50MzIoc2VsZi5kZWNpbWFscyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gImRlY2ltYWxzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlY2ltYWxzIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMyAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA0IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTMyCiAgICAvLyBkZWZhdWx0X2Zyb3plbj1zZWxmLmRlZmF1bHRfZnJvemVuLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImRlZmF1bHRfZnJvemVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRfZnJvemVuIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MzMKICAgIC8vIHVuaXRfbmFtZT1zZWxmLnVuaXRfbmFtZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidW5pdF9uYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfbmFtZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTM0CiAgICAvLyBuYW1lPXNlbGYubmFtZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAibmFtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uYW1lIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MzUKICAgIC8vIHVybD1zZWxmLnVybCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidXJsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVybCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTM2CiAgICAvLyBtZXRhZGF0YV9oYXNoPXNlbGYubWV0YWRhdGFfaGFzaCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAibWV0YWRhdGFfaGFzaCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZXRhZGF0YV9oYXNoIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MzcKICAgIC8vIG1hbmFnZXJfYWRkcj1zZWxmLm1hbmFnZXJfYWRkciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJtYW5hZ2VyX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFuYWdlcl9hZGRyIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MzgKICAgIC8vIHJlc2VydmVfYWRkcj1zZWxmLnJlc2VydmVfYWRkciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZV9hZGRyIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MzkKICAgIC8vIGZyZWV6ZV9hZGRyPXNlbGYuZnJlZXplX2FkZHIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiZnJlZXplX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZnJlZXplX2FkZHIgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU0MAogICAgLy8gY2xhd2JhY2tfYWRkcj1zZWxmLmNsYXdiYWNrX2FkZHIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2xhd2JhY2tfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jbGF3YmFja19hZGRyIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MjgtNTQxCiAgICAvLyAjIEVmZmVjdHMKICAgIC8vIHJldHVybiBBc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD1zZWxmLnRvdGFsLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDMyKHNlbGYuZGVjaW1hbHMpLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPXNlbGYuZGVmYXVsdF9mcm96ZW4sCiAgICAvLyAgICAgdW5pdF9uYW1lPXNlbGYudW5pdF9uYW1lLAogICAgLy8gICAgIG5hbWU9c2VsZi5uYW1lLAogICAgLy8gICAgIHVybD1zZWxmLnVybCwKICAgIC8vICAgICBtZXRhZGF0YV9oYXNoPXNlbGYubWV0YWRhdGFfaGFzaCwKICAgIC8vICAgICBtYW5hZ2VyX2FkZHI9c2VsZi5tYW5hZ2VyX2FkZHIsCiAgICAvLyAgICAgcmVzZXJ2ZV9hZGRyPXNlbGYucmVzZXJ2ZV9hZGRyLAogICAgLy8gICAgIGZyZWV6ZV9hZGRyPXNlbGYuZnJlZXplX2FkZHIsCiAgICAvLyAgICAgY2xhd2JhY2tfYWRkcj1zZWxmLmNsYXdiYWNrX2FkZHIsCiAgICAvLyApCiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIGJ5dGVjIDE2IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDExCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZGlnIDgKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDk1CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMTQ5CiAgICArCiAgICBkaWcgOQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgICsKICAgIGRpZyA5CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgKwogICAgZGlnIDkKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyAxMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuZ2V0X2Fzc2V0X2lzX2Zyb3plbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hc3NldF9pc19mcm96ZW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU1NC01NTUKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5fYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKGZyZWV6ZV9hc3NldCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1NTctNTU4CiAgICAvLyAjIEVmZmVjdHMKICAgIC8vIHJldHVybiBzZWxmLmdsb2JhbF9mcm96ZW4KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJnbG9iYWxfZnJvemVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JhbF9mcm96ZW4gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyAxNiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDEwIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnNtYXJ0X2FzYS5jb250cmFjdC5TbWFydEFzYS5nZXRfYWNjb3VudF9pc19mcm96ZW5bcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYWNjb3VudF9pc19mcm96ZW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTc0LTU3NQogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoZnJlZXplX2Fzc2V0KQogICAgc3dhcAogICAgY2FsbHN1YiBfYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU3Ny01NzgKICAgIC8vICMgRWZmZWN0cwogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9mcm96ZW5bZnJlZXplX2FjY291bnRdCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWNjb3VudF9mcm96ZW4iCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X2Zyb3plbiBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDE2IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWMgMTAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmdldF9jaXJjdWxhdGluZ19zdXBwbHlbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfY2lyY3VsYXRpbmdfc3VwcGx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1OTEtNTkyCiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhhc3NldCkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU5NC01OTUKICAgIC8vICMgRWZmZWN0cwogICAgLy8gcmV0dXJuIHNlbGYuX2NpcmN1bGF0aW5nX3N1cHBseShhc3NldCkKICAgIGNhbGxzdWIgX2NpcmN1bGF0aW5nX3N1cHBseQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgaXRvYgogICAgYnl0ZWMgMTAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLl9jaXJjdWxhdGluZ19zdXBwbHkoY3RybF9hc3NldDogdWludDY0KSAtPiB1aW50NjQ6Cl9jaXJjdWxhdGluZ19zdXBwbHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBkZWYgX2NpcmN1bGF0aW5nX3N1cHBseShzZWxmLCBjdHJsX2Fzc2V0OiBBc3NldCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjczCiAgICAvLyByZXR1cm4gY2ZnLlRPVEFMIC0gY3RybF9hc3NldC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIGludGMgNCAvLyAxODQ0Njc0NDA3MzcwOTU1MTYxNQogICAgc3dhcAogICAgLQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnNtYXJ0X2FzYS5jb250cmFjdC5TbWFydEFzYS5fYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKGFzc2V0OiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBkZWYgX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLnNtYXJ0X2FzYV9pZCwgZXJyLk1JU1NJTkdfQ1RSTF9BU0EKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc21hcnRfYXNhX2lkIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTWlzc2luZyBDb250cm9sbGVkIEFTQQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuc21hcnRfYXNhX2lkID09IGFzc2V0LmlkLCBlcnIuSU5WQUxJRF9DVFJMX0FTQQogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgQ29udHJvbGxlZCBBU0EgSUQKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAGAAEIIP///////////wEAJhEMc21hcnRfYXNhX2lkDHJlc2VydmVfYWRkcg1jbGF3YmFja19hZGRyFGFjY291bnRfc21hcnRfYXNhX2lkDmFjY291bnRfZnJvemVuDG1hbmFnZXJfYWRkcgtmcmVlemVfYWRkcg1nbG9iYWxfZnJvemVuBXRvdGFsDmRlZmF1bHRfZnJvemVuBBUffHUIZGVjaW1hbHMJdW5pdF9uYW1lBG5hbWUDdXJsDW1ldGFkYXRhX2hhc2gBADEYQABOMTUkEkQxNIEFEkQxNxREMTaBAhJEJwgiZycLImcnCSJnJwyAAGcnDYAAZycOgABnJw+AAGcnBTIDZykyA2cnBjIDZyoyA2coImcnByJnMRtBAJuCAwRIZBZFBDoEW9wE7WRFLzYaAI4DAHQAaABcMRkURDEYRIILBMw2mGwEXMLFNQTn7NWoBPiBn+sEfqy3dQShM9WBBP9Tre8ELpuQOASXm5lyBEimPMkERq0NUjYaAI4LAEkBFwEvAq0DzwT1BRsGXgcxB08HdgAxGYEFEjEYEERCBfUxGYECEjEYEERCBT0xGSMSMRgQREICEjEZFDEYFBBDigQAsYv/shSL/rITi/2yEov8shGBBLIQIrIBs4mAADYaAUkVJBJEF0k2GgJJFSQSRBdMNhoDSRUjEkQiU0yIBzAxACInBWVEEkQxFkxBAAgjCEk4ECMSRCMISU8CCEUDSUsDDEEAI0k4EIEGEkEAFkk4GCEFEkEADUk4GUAAByNEIwhC/9oiQv/2SEsBOBCBAxJBAFJLATghSwESQQBISwE4KTIKEkEAPksBOCoyChJBADRLATgrMgoSQQAqSwE4LDIKEkEAICNEIicFZUQyCkcCsbIssiuyKrIpsiGBA7IQIrIBsyNDIkL/3TYaAUkVJBJEF0mIBnmIBmcWJwpMULAjQzYaAUkVJBJEFzYaAkkVgQQSRDYaA0kVIxJEIlM2GgRJIlmBAghLARUSRFcCADYaBUkiWYECCEsBFRJEVwIANhoGSSJZgQIISwEVEkRXAgA2GgdJIlmBAghLARUSRFcCADYaCEkVJRJENhoJSRUlEkQ2GgpJFSUSRDYaC0kVJRJEMQAyCRJEIihlRBRESwQVJRJEMgpHA7GyLLIrsiqyKUsEsihLBbInSwayJksHsiUjsiQisiMhBLIigQOyECKyAbMotDxnTwkXJwhPC2cnC0xnJwlPCWcnDE8IZycNTwdnJw5PBmcnD08FZycFTwRnKU8DZycGTwJnKkxnIihlRBYnCkxQsCNDNhoBSRUkEkQXSTEWIwlJOBCBBBJESwGIBU1JOBEiKGVETEsBEkRLATgAMQASREsBOBQxABJESwE4EhRETDgVMgMSRDEZIxJEMQBPAnAARQFEMQArTwJmMQAnBCJmIicJZURAAAoxAEsBcABEQQAGMQAnBCNmI0M2GgFJFSQSRBdJNhoCSRUkEkQXTDYaA0lOAhWBBBJENhoESRUjEkQiU0w2GgVJIlmBAghLARUSRFcCAEw2GgZJIlmBAghLARUSRFcCAEw2GgdJIlmBAghLARUSRFcCAEw2GghJIlmBAghLARUSRFcCAEw2GglJTgIVJRJENhoKSU4CSRUlEkQ2GgtJTgMVJRJENhoMSU4DFSUSREyIBFExACInBWVEEkQiKWVEE0EACCIpZUQyAxNEIicGZURLAhNBAAkiJwZlRDIDE0QiKmVESwETQQAIIiplRDIDE0RPC4gD/k8LSU8CD0RPChcnCE8CZycLTGcnCU8JZycMTwhnJw1PB2cnDk8GZycPTwVnJwVPBGcpTwNnJwZPAmcqTGcjQzYaAUkVJBJEF0k2GgJJFSQSRBdMNhoDSU4CSRUlEkQ2GgRJTgQVJRJETIgDoTIKEkEAVTEAIillRBJEMgpLAklPAhNEIihlRIgDdEsECCInCGVEDkQiK2NEIihlRBJEIicHZUQURCIpZUQiKmVEE0EACUsBIicEY0QURE8DTwNPAk8DiPvXI0NLATIKEkEAODEAIillRExLARJESwEiK2NEIihlRBJEIicHZUQURCIqZUQTQf/FRwIiJwRjRBREIillRBJEQv+zMQAiKmVEEkEAGUkiK2NEIihlRExLARJESwIiK2NEEkRC/5AxAEsBSU4CEkRJIitjRCIoZURMSwESREsDSU4CIitjRBJEIicHZUQUREwiJwRjRBREIicEY0QUREL/VTYaAUkVJBJEFzYaAkkVIxJEIlNMiAKRMQAiJwZlRBJEJwdMZyNDNhoBSRUkEkQXNhoCSRUlEkQ2GgNJFSMSRCJTTwKIAmJLASIrY0QiKGVEEkQxACInBmVEEkQnBExmI0M2GgFJFSQSRBdJNhoCSU4CFSUSRDEWIwhJOBCBBBJEMRmBAhJEMQAiK2NESwISRDIESwENREk4EUsCEkRJOAAxABJESTgSFEQ4FTIDE0RxC0EAVzEWIwhJOBCBBBJEOBVLAUlOAhJEIihlREsEEkRLAhNBACRLAUkiK2NEIihlRBJEIicHZUQURDEAIicEY0QURCInBGNEFEQxAEsDSU4CcABEMQBLBIj6LCNDNhoBSRUkEkQXSYgBjjEAIicFZUQSRLGyIYEDshAisgGzJwgiZycLImcnCSJnJwyAAGcnDYAAZycOgABnJw+AAGcnBTIDZykyA2cnBjIDZyoyA2coImcnByJnI0M2GgFJFSQSRBeIATMiJwhlRCInC2VEFkmTJQ5EVwQEIicJZUQiJwxlRCInDWVEIicOZUQiJw9lRCInBWVEIillRCInBmVEIiplRE8KFk8KUCcQIk8LVFBLCBUWVwYCTwlQTIACAJVQSwEVgZUBCEsJFRZXBgJPClBLARZXBgJPA0xQSwEVTwMISwkVFlcGAk8KUEsBFlcGAk8DTFBLARVPAwhLCRUWVwYCTwpQTBZXBgJPAkxQTwhQTwdQTwZQTwVQTwRQTwNQTwJQTFAnCkxQsCNDNhoBSRUkEkQXiABgIicHZUQnECJPAlQnCkxQsCNDNhoBSRUkEkQXNhoCSRUlEkRMiAA5IicEY0QnECJPAlQnCkxQsCNDNhoBSRUkEkQXSYgAGogACBYnCkxQsCNDigEBMgqL/3AARCEETAmJigEAIihlRElEi/8SRIk=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 9, "patch": 0 } }, "events": [], "templateVariables": { "ARC89_APP_ID": { "type": "AVMUint64" } } }