{ "name": "SmartAsa", "structs": { "AssetConfig": [ { "name": "total", "type": "uint64" }, { "name": "decimals", "type": "uint32" }, { "name": "default_frozen", "type": "bool" }, { "name": "unit_name", "type": "string" }, { "name": "name", "type": "string" }, { "name": "url", "type": "string" }, { "name": "metadata_hash", "type": "byte[]" }, { "name": "manager_addr", "type": "address" }, { "name": "reserve_addr", "type": "address" }, { "name": "freeze_addr", "type": "address" }, { "name": "clawback_addr", "type": "address" } ] }, "methods": [ { "name": "asset_create", "args": [ { "type": "uint64", "name": "total", "desc": "The total number of base units of the Smart ASA to create" }, { "type": "uint32", "name": "decimals", "desc": "The number of digits to use after the decimal point when displaying the Smart ASA" }, { "type": "bool", "name": "default_frozen", "desc": "Smart ASA default frozen (True to freeze holdings by default)" }, { "type": "string", "name": "unit_name", "desc": "The name of a unit of Smart ASA" }, { "type": "string", "name": "name", "desc": "The name of the Smart ASA" }, { "type": "string", "name": "url", "desc": "Smart ASA external URL" }, { "type": "byte[]", "name": "metadata_hash", "desc": "Smart ASA metadata hash" }, { "type": "address", "name": "manager_addr", "desc": "Account that can manage the configuration of the Smart ASA and destroy it" }, { "type": "address", "name": "reserve_addr", "desc": "Account that holds the reserve (non-minted) units of Smart ASA and can mint or burn it" }, { "type": "address", "name": "freeze_addr", "desc": "Account that can freeze/unfreeze holdings of the Smart ASA globally or locally" }, { "type": "address", "name": "clawback_addr", "desc": "Account that can clawback holdings of the Smart ASA" } ], "returns": { "type": "uint64", "desc": "Controlled ASA ID" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create the Controlled ASA", "events": [], "recommendations": {} }, { "name": "asset_opt_in", "args": [ { "type": "uint64", "name": "asset", "desc": "Smart ASA ID" }, { "type": "axfer", "name": "ctrl_asa_opt_in", "desc": "Controlled ASA opt in transaction" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "OptIn" ] }, "readonly": false, "desc": "Smart ASA opt in (App and Controlled ASA)", "events": [], "recommendations": {} }, { "name": "asset_config", "args": [ { "type": "uint64", "name": "config_asset", "desc": "Smart ASA ID to configure" }, { "type": "uint64", "name": "total", "desc": "Total number of base units if the Smart ASA. It can not be less than current circulating supply" }, { "type": "uint32", "name": "decimals", "desc": "The number of digits to use after the decimal point when displaying the Smart ASA" }, { "type": "bool", "name": "default_frozen", "desc": "Smart ASA default frozen (True to freeze holdings by default)" }, { "type": "string", "name": "unit_name", "desc": "The name of a unit of Smart ASA" }, { "type": "string", "name": "name", "desc": "The name of the Smart ASA" }, { "type": "string", "name": "url", "desc": "Smart ASA external URL" }, { "type": "byte[]", "name": "metadata_hash", "desc": "Smart ASA metadata hash" }, { "type": "address", "name": "manager_addr", "desc": "Account that can manage the configuration of the Smart ASA and destroy it" }, { "type": "address", "name": "reserve_addr", "desc": "Account that holds the reserve (non-minted) units of Smart ASA and can mint or burn it" }, { "type": "address", "name": "freeze_addr", "desc": "Account that can freeze/unfreeze holdings of the Smart ASA globally or locally" }, { "type": "address", "name": "clawback_addr", "desc": "Account that can clawback holdings of the Smart ASA" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Configure Smart ASA (for unchanged parameters use existing value - no optional args on AVM)", "events": [], "recommendations": {} }, { "name": "asset_transfer", "args": [ { "type": "uint64", "name": "xfer_asset", "desc": "Smart ASA ID to transfer" }, { "type": "uint64", "name": "asset_amount", "desc": "Amount to transfer" }, { "type": "address", "name": "asset_sender", "desc": "Smart ASA sender" }, { "type": "address", "name": "asset_receiver", "desc": "Smart ASA receiver" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Smart ASA transfers: regular, clawback, mint, burn", "events": [], "recommendations": {} }, { "name": "asset_freeze", "args": [ { "type": "uint64", "name": "freeze_asset", "desc": "Smart ASA ID to globally freeze/unfreeze" }, { "type": "bool", "name": "asset_frozen", "desc": "Smart ASA frozen status" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Smart ASA global freeze (all accounts)", "events": [], "recommendations": {} }, { "name": "account_freeze", "args": [ { "type": "uint64", "name": "freeze_asset", "desc": "Smart ASA ID to locally freeze/unfreeze" }, { "type": "address", "name": "freeze_account", "desc": "Account to freeze/unfreeze" }, { "type": "bool", "name": "asset_frozen", "desc": "Smart ASA frozen status" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Smart ASA local freeze (account specific)", "events": [], "recommendations": {} }, { "name": "asset_close_out", "args": [ { "type": "uint64", "name": "close_asset", "desc": "Smart ASA ID to close out" }, { "type": "address", "name": "close_to", "desc": "Account to send all the Smart ASA remainder to." } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "CloseOut" ] }, "readonly": false, "desc": "Smart ASA close out (App and Controlled ASA)", "events": [], "recommendations": {} }, { "name": "asset_destroy", "args": [ { "type": "uint64", "name": "destroy_asset", "desc": "Smart ASA ID to destroy" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Destroy the Controlled 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 ARC-0020 (Smart ASA) - Reference Implementation\n ", "networks": {}, "state": { "schema": { "global": { "ints": 5, "bytes": 8 }, "local": { "ints": 2, "bytes": 0 } }, "keys": { "global": { "total": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dG90YWw=" }, "decimals": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZGVjaW1hbHM=" }, "default_frozen": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZGVmYXVsdF9mcm96ZW4=" }, "unit_name": { "keyType": "AVMString", "valueType": "AVMString", "key": "dW5pdF9uYW1l" }, "name": { "keyType": "AVMString", "valueType": "AVMString", "key": "bmFtZQ==" }, "url": { "keyType": "AVMString", "valueType": "AVMString", "key": "dXJs" }, "metadata_hash": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "bWV0YWRhdGFfaGFzaA==" }, "manager_addr": { "keyType": "AVMString", "valueType": "address", "key": "bWFuYWdlcl9hZGRy" }, "reserve_addr": { "keyType": "AVMString", "valueType": "address", "key": "cmVzZXJ2ZV9hZGRy" }, "freeze_addr": { "keyType": "AVMString", "valueType": "address", "key": "ZnJlZXplX2FkZHI=" }, "clawback_addr": { "keyType": "AVMString", "valueType": "address", "key": "Y2xhd2JhY2tfYWRkcg==" }, "smart_asa_id": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c21hcnRfYXNhX2lk" }, "global_frozen": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Z2xvYmFsX2Zyb3plbg==" } }, "local": { "account_smart_asa_id": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWNjb3VudF9zbWFydF9hc2FfaWQ=" }, "account_frozen": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWNjb3VudF9mcm96ZW4=" } }, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1113 ], "errorMessage": "Clawback Address has been deleted" }, { "pc": [ 1751 ], "errorMessage": "Close to account is frozen" }, { "pc": [ 555 ], "errorMessage": "Controlled ASA already created" }, { "pc": [ 848 ], "errorMessage": "Forbidden Close Out on Opt In" }, { "pc": [ 1403 ], "errorMessage": "Forbidden clawback burning" }, { "pc": [ 1290 ], "errorMessage": "Forbidden over minting" }, { "pc": [ 1273 ], "errorMessage": "Forbidden self minting" }, { "pc": [ 1095 ], "errorMessage": "Freeze Address has been deleted" }, { "pc": [ 1651 ], "errorMessage": "Invalid Close Out group size" }, { "pc": [ 1300, 1372, 1431, 1439, 1465, 1476, 1581, 1645, 1709, 1728, 2184 ], "errorMessage": "Invalid Controlled ASA ID" }, { "pc": [ 1126 ], "errorMessage": "Invalid Total, must be >= circulating supply" }, { "pc": [ 862, 2180 ], "errorMessage": "Missing Controlled ASA" }, { "pc": [ 406 ], "errorMessage": "OnCompletion must be CloseOut && can only call when not creating" }, { "pc": [ 316 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 428 ], "errorMessage": "OnCompletion must be NoOp && can only call when creating" }, { "pc": [ 417 ], "errorMessage": "OnCompletion must be OptIn && can only call when not creating" }, { "pc": [ 1327, 1498 ], "errorMessage": "Receiver account is frozen" }, { "pc": [ 1075 ], "errorMessage": "Reserve Address has been deleted" }, { "pc": [ 1397, 1491, 1744 ], "errorMessage": "Sender account is frozen" }, { "pc": [ 1307, 1379, 1483, 1735 ], "errorMessage": "Smart ASA is global frozen" }, { "pc": [ 549 ], "errorMessage": "Unauthorized" }, { "pc": [ 1451 ], "errorMessage": "Unauthorized Clawback" }, { "pc": [ 1531, 1590 ], "errorMessage": "Unauthorized Freeze" }, { "pc": [ 1059, 1792 ], "errorMessage": "Unauthorized Manager" }, { "pc": [ 1264, 1360 ], "errorMessage": "Unauthorized Reserve" }, { "pc": [ 1670 ], "errorMessage": "Wrong ASA Close Out Amount" }, { "pc": [ 1658 ], "errorMessage": "Wrong ASA Close Out ID" }, { "pc": [ 1665 ], "errorMessage": "Wrong ASA Close Out Sender" }, { "pc": [ 841 ], "errorMessage": "Wrong ASA Opt In Amount" }, { "pc": [ 819 ], "errorMessage": "Wrong ASA Opt In ID" }, { "pc": [ 835 ], "errorMessage": "Wrong ASA Opt In Receiver" }, { "pc": [ 827 ], "errorMessage": "Wrong ASA Opt In Sender" }, { "pc": [ 1676, 1701 ], "errorMessage": "Wrong Close Out on Close Out" }, { "pc": [ 213 ], "errorMessage": "Wrong Global Bytes allocation" }, { "pc": [ 219 ], "errorMessage": "Wrong Global UInts allocation" }, { "pc": [ 223 ], "errorMessage": "Wrong Local Bytes allocation" }, { "pc": [ 229 ], "errorMessage": "Wrong Local UInts allocation" }, { "pc": [ 853, 1635 ], "errorMessage": "Wrong On Complete Action" }, { "pc": [ 889, 1761, 2166 ], "errorMessage": "account opted into asset" }, { "pc": [ 1325, 1395, 1489, 1496, 1742, 1749, 2119 ], "errorMessage": "check self.account_frozen exists for account" }, { "pc": [ 1294, 1366, 1422, 1437, 1456, 1474, 1575, 1641, 1722 ], "errorMessage": "check self.account_smart_asa_id exists for account" }, { "pc": [ 1099, 1109, 1315, 1383, 1412, 1979 ], "errorMessage": "check self.clawback_addr exists" }, { "pc": [ 1889 ], "errorMessage": "check self.decimals exists" }, { "pc": [ 879, 1903 ], "errorMessage": "check self.default_frozen exists" }, { "pc": [ 1080, 1091, 1529, 1588, 1975 ], "errorMessage": "check self.freeze_addr exists" }, { "pc": [ 1305, 1377, 1481, 1733, 2080 ], "errorMessage": "check self.global_frozen exists" }, { "pc": [ 1057, 1790, 1966 ], "errorMessage": "check self.manager_addr exists" }, { "pc": [ 1953 ], "errorMessage": "check self.metadata_hash exists" }, { "pc": [ 1927 ], "errorMessage": "check self.name exists" }, { "pc": [ 1063, 1071, 1262, 1311, 1355, 1401, 1970 ], "errorMessage": "check self.reserve_addr exists" }, { "pc": [ 553, 773, 814, 1277, 1298, 1370, 1426, 1460, 1579, 1705, 1726, 2178 ], "errorMessage": "check self.smart_asa_id exists" }, { "pc": [ 1288, 1883 ], "errorMessage": "check self.total exists" }, { "pc": [ 1914 ], "errorMessage": "check self.unit_name exists" }, { "pc": [ 1940 ], "errorMessage": "check self.url exists" }, { "pc": [ 462, 476, 490, 504, 950, 966, 982, 998 ], "errorMessage": "invalid array length header" }, { "pc": [ 455, 941, 1518, 1564 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 469, 483, 497, 511, 957, 973, 989, 1005 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 519, 527, 535, 543, 1015, 1026, 1036, 1046, 1233, 1243, 1556, 1618, 2110 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 447, 931 ], "errorMessage": "invalid number of bytes for arc4.uint32" }, { "pc": [ 438, 789, 908, 920, 1210, 1222, 1509, 1547, 1606, 1778, 1874, 2071, 2101, 2140 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 1895 ], "errorMessage": "overflow" }, { "pc": [ 802, 1629, 1692 ], "errorMessage": "transaction type is axfer" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxODQ0Njc0NDA3MzcwOTU1MTYxNQogICAgYnl0ZWNibG9jayAic21hcnRfYXNhX2lkIiAicmVzZXJ2ZV9hZGRyIiAiY2xhd2JhY2tfYWRkciIgImFjY291bnRfc21hcnRfYXNhX2lkIiAiYWNjb3VudF9mcm96ZW4iICJmcmVlemVfYWRkciIgImdsb2JhbF9mcm96ZW4iICJtYW5hZ2VyX2FkZHIiICJ0b3RhbCIgImRlZmF1bHRfZnJvemVuIiAiZGVjaW1hbHMiICJ1bml0X25hbWUiICJuYW1lIiAidXJsIiAibWV0YWRhdGFfaGFzaCIgMHgxNTFmN2M3NSAweDAwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDQKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDctNDkKICAgIC8vICMgR0xPQkFMIFNUQVRFCiAgICAvLyAjIEFTQSBGaWVsZHMKICAgIC8vIHNlbGYudG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgOCAvLyAidG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTAKICAgIC8vIHNlbGYuZGVjaW1hbHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gImRlY2ltYWxzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBzZWxmLmRlZmF1bHRfZnJvemVuID0gRmFsc2UKICAgIGJ5dGVjIDkgLy8gImRlZmF1bHRfZnJvemVuIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUyCiAgICAvLyBzZWxmLnVuaXRfbmFtZSA9IFN0cmluZygpCiAgICBieXRlYyAxMSAvLyAidW5pdF9uYW1lIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MwogICAgLy8gc2VsZi5uYW1lID0gU3RyaW5nKCkKICAgIGJ5dGVjIDEyIC8vICJuYW1lIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1NAogICAgLy8gc2VsZi51cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgMTMgLy8gInVybCIKICAgIHB1c2hieXRlcyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTUKICAgIC8vIHNlbGYubWV0YWRhdGFfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDE0IC8vICJtZXRhZGF0YV9oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1NgogICAgLy8gc2VsZi5tYW5hZ2VyX2FkZHIgPSBBY2NvdW50KCkKICAgIGJ5dGVjIDcgLy8gIm1hbmFnZXJfYWRkciIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTcKICAgIC8vIHNlbGYucmVzZXJ2ZV9hZGRyID0gQWNjb3VudCgpCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2FkZHIiCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBzZWxmLmZyZWV6ZV9hZGRyID0gQWNjb3VudCgpCiAgICBieXRlYyA1IC8vICJmcmVlemVfYWRkciIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTkKICAgIC8vIHNlbGYuY2xhd2JhY2tfYWRkciA9IEFjY291bnQoKQogICAgYnl0ZWNfMiAvLyAiY2xhd2JhY2tfYWRkciIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NjAtNjEKICAgIC8vICMgU21hcnQgQVNBIEZpZWxkcwogICAgLy8gc2VsZi5zbWFydF9hc2FfaWQgPSBVSW50NjQoKQogICAgYnl0ZWNfMCAvLyAic21hcnRfYXNhX2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBzZWxmLmdsb2JhbF9mcm96ZW4gPSBGYWxzZQogICAgYnl0ZWMgNiAvLyAiZ2xvYmFsX2Zyb3plbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI3LTM1CiAgICAvLyBjbGFzcyBTbWFydEFzYSgKICAgIC8vICAgICBBUkM0Q29udHJhY3QsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMjIKICAgIHB1c2hieXRlc3MgMHg0ODY0MTY0NSAweDNhMDQ1YmRjIC8vIG1ldGhvZCAiYXNzZXRfb3B0X2luKHVpbnQ2NCxheGZlcil2b2lkIiwgbWV0aG9kICJhc3NldF9jbG9zZV9vdXQodWludDY0LGFkZHJlc3Mpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYXNzZXRfb3B0X2luX3JvdXRlQDUgbWFpbl9hc3NldF9jbG9zZV9vdXRfcm91dGVANgoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI3LTM1CiAgICAvLyBjbGFzcyBTbWFydEFzYSgKICAgIC8vICAgICBBUkM0Q29udHJhY3QsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhlN2VjZDVhOCAweGY4ODE5ZmViIDB4N2VhY2I3NzUgMHhhMTMzZDU4MSAweGZmNTNhZGVmIDB4ZWQ2NDQ1MmYgMHgyZTliOTAzOCAweDk3OWI5OTcyIDB4NDhhNjNjYzkgMHg0NmFkMGQ1MiAvLyBtZXRob2QgImFzc2V0X2NyZWF0ZSh1aW50NjQsdWludDMyLGJvb2wsc3RyaW5nLHN0cmluZyxzdHJpbmcsYnl0ZVtdLGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50MzIsYm9vbCxzdHJpbmcsc3RyaW5nLHN0cmluZyxieXRlW10sYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJhc3NldF90cmFuc2Zlcih1aW50NjQsdWludDY0LGFkZHJlc3MsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJhc3NldF9mcmVlemUodWludDY0LGJvb2wpdm9pZCIsIG1ldGhvZCAiYWNjb3VudF9mcmVlemUodWludDY0LGFkZHJlc3MsYm9vbCl2b2lkIiwgbWV0aG9kICJhc3NldF9kZXN0cm95KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfY29uZmlnKHVpbnQ2NCkodWludDY0LHVpbnQzMixib29sLHN0cmluZyxzdHJpbmcsc3RyaW5nLGJ5dGVbXSxhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2lzX2Zyb3plbih1aW50NjQpYm9vbCIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaXNfZnJvemVuKHVpbnQ2NCxhZGRyZXNzKWJvb2wiLCBtZXRob2QgImdldF9jaXJjdWxhdGluZ19zdXBwbHkodWludDY0KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGFzc2V0X2NyZWF0ZSBhc3NldF9jb25maWcgYXNzZXRfdHJhbnNmZXIgYXNzZXRfZnJlZXplIGFjY291bnRfZnJlZXplIGFzc2V0X2Rlc3Ryb3kgZ2V0X2Fzc2V0X2NvbmZpZyBnZXRfYXNzZXRfaXNfZnJvemVuIGdldF9hY2NvdW50X2lzX2Zyb3plbiBnZXRfY2lyY3VsYXRpbmdfc3VwcGx5CiAgICBlcnIKCm1haW5fYXNzZXRfY2xvc2Vfb3V0X3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJDbG9zZU91dCJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCAyIC8vIENsb3NlT3V0CiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgQ2xvc2VPdXQgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBhc3NldF9jbG9zZV9vdXQKCm1haW5fYXNzZXRfb3B0X2luX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18xIC8vIE9wdEluCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgT3B0SW4gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBhc3NldF9vcHRfaW4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMjI6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuYXNzZXRfY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyMzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQzMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjY5LTI3MAogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gVW5hdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI3MQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnNtYXJ0X2FzYV9pZCwgZXJyLkVYSVNUSU5HX0NUUkxfQVNBCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAic21hcnRfYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNtYXJ0X2FzYV9pZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBDb250cm9sbGVkIEFTQSBhbHJlYWR5IGNyZWF0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTkyLTIwNQogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICB0b3RhbD1jZmcuVE9UQUwsCiAgICAvLyAgICAgZGVjaW1hbHM9Y2ZnLkRFQ0lNQUxTLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPWNmZy5ERUZBVUxUX0ZST1pFTiwKICAgIC8vICAgICB1bml0X25hbWU9Y2ZnLlVOSVRfTkFNRSwKICAgIC8vICAgICBhc3NldF9uYW1lPWNmZy5OQU1FLAogICAgLy8gICAgIHVybD1jZmcuQVBQX0JJTkRJTkcgKyBzZWxmLml0b2EoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQpLAogICAgLy8gICAgIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgZnJlZXplPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgY2xhd2JhY2s9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTkKICAgIC8vIHVybD1jZmcuQVBQX0JJTkRJTkcgKyBzZWxmLml0b2EoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQpLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBhY2MgPSBCeXRlcygpCiAgICBwdXNoYnl0ZXMgMHgKCmFzc2V0X2NyZWF0ZV93aGlsZV90b3BAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NzMKICAgIC8vIHdoaWxlIG4gPiAwOgogICAgZGlnIDEKICAgIGJ6IGFzc2V0X2NyZWF0ZV9hZnRlcl93aGlsZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhY2MgPSBkaWdpdHNbbiAlIDEwXSArIGFjYwogICAgZGlnIDEKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgJQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo3MQogICAgLy8gZGlnaXRzID0gQnl0ZXMoYiIwMTIzNDU2Nzg5IikKICAgIHB1c2hieXRlcyAweDMwMzEzMjMzMzQzNTM2MzczODM5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhY2MgPSBkaWdpdHNbbiAlIDEwXSArIGFjYwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NzUKICAgIC8vIG4gLy89IDEwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICAvCiAgICBidXJ5IDIKICAgIGIgYXNzZXRfY3JlYXRlX3doaWxlX3RvcEAyCgphc3NldF9jcmVhdGVfYWZ0ZXJfd2hpbGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NzYKICAgIC8vIHJldHVybiBhY2Mgb3IgQnl0ZXMoYiIwIikKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoYnl0ZXMgMHgzMAogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8gdXJsPWNmZy5BUFBfQklORElORyArIHNlbGYuaXRvYShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCksCiAgICBwdXNoYnl0ZXMgMHg2MTZjNjc2ZjcyNjE2ZTY0M2EyZjJmNjE3MDcwMmYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyMDAKICAgIC8vIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjIwMS0yMDMKICAgIC8vIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vIGZyZWV6ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gY2xhd2JhY2s9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGR1cG4gMwogICAgaXR4bl9maWVsZCBDb25maWdBc3NldENsYXdiYWNrCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RnJlZXplCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0UmVzZXJ2ZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE1hbmFnZXIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVUkwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTk4CiAgICAvLyBhc3NldF9uYW1lPWNmZy5OQU1FLAogICAgcHVzaGJ5dGVzICJBUkMtMjAgU21hcnQgQVNBIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTk3CiAgICAvLyB1bml0X25hbWU9Y2ZnLlVOSVRfTkFNRSwKICAgIHB1c2hieXRlcyAiQVJDLTIwIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gZGVmYXVsdF9mcm96ZW49Y2ZnLkRFRkFVTFRfRlJPWkVOLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWZhdWx0RnJvemVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gZGVjaW1hbHM9Y2ZnLkRFQ0lNQUxTLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxOTQKICAgIC8vIHRvdGFsPWNmZy5UT1RBTCwKICAgIGludGMgNCAvLyAxODQ0Njc0NDA3MzcwOTU1MTYxNQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE5MgogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIHB1c2hpbnQgMyAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gZmVlPTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTkyLTIwNQogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICB0b3RhbD1jZmcuVE9UQUwsCiAgICAvLyAgICAgZGVjaW1hbHM9Y2ZnLkRFQ0lNQUxTLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPWNmZy5ERUZBVUxUX0ZST1pFTiwKICAgIC8vICAgICB1bml0X25hbWU9Y2ZnLlVOSVRfTkFNRSwKICAgIC8vICAgICBhc3NldF9uYW1lPWNmZy5OQU1FLAogICAgLy8gICAgIHVybD1jZmcuQVBQX0JJTkRJTkcgKyBzZWxmLml0b2EoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQpLAogICAgLy8gICAgIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgZnJlZXplPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgY2xhd2JhY2s9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjczLTI3NAogICAgLy8gIyBFZmZlY3RzCiAgICAvLyBzZWxmLnNtYXJ0X2FzYV9pZCA9IHNlbGYuaW5uZXJfYXNzZXRfY29uZmlnKCkKICAgIGJ5dGVjXzAgLy8gInNtYXJ0X2FzYV9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTkyLTIwNgogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICB0b3RhbD1jZmcuVE9UQUwsCiAgICAvLyAgICAgZGVjaW1hbHM9Y2ZnLkRFQ0lNQUxTLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPWNmZy5ERUZBVUxUX0ZST1pFTiwKICAgIC8vICAgICB1bml0X25hbWU9Y2ZnLlVOSVRfTkFNRSwKICAgIC8vICAgICBhc3NldF9uYW1lPWNmZy5OQU1FLAogICAgLy8gICAgIHVybD1jZmcuQVBQX0JJTkRJTkcgKyBzZWxmLml0b2EoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQpLAogICAgLy8gICAgIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgZnJlZXplPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgY2xhd2JhY2s9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXNzZXQuaWQKICAgIGl0eG4gQ3JlYXRlZEFzc2V0SUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjczLTI3NAogICAgLy8gIyBFZmZlY3RzCiAgICAvLyBzZWxmLnNtYXJ0X2FzYV9pZCA9IHNlbGYuaW5uZXJfYXNzZXRfY29uZmlnKCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gc2VsZi50b3RhbCA9IHRvdGFsLm5hdGl2ZQogICAgZGlnIDEyCiAgICBidG9pCiAgICBieXRlYyA4IC8vICJ0b3RhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI3NgogICAgLy8gc2VsZi5kZWNpbWFscyA9IGRlY2ltYWxzLm5hdGl2ZQogICAgZGlnIDExCiAgICBidG9pCiAgICBieXRlYyAxMCAvLyAiZGVjaW1hbHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyNzcKICAgIC8vIHNlbGYuZGVmYXVsdF9mcm96ZW4gPSBkZWZhdWx0X2Zyb3plbi5uYXRpdmUKICAgIGRpZyAxMAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgOSAvLyAiZGVmYXVsdF9mcm96ZW4iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyNzgKICAgIC8vIHNlbGYudW5pdF9uYW1lID0gdW5pdF9uYW1lLm5hdGl2ZQogICAgZGlnIDkKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlYyAxMSAvLyAidW5pdF9uYW1lIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mjc5CiAgICAvLyBzZWxmLm5hbWUgPSBuYW1lLm5hdGl2ZQogICAgZGlnIDgKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlYyAxMiAvLyAibmFtZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI4MAogICAgLy8gc2VsZi51cmwgPSB1cmwubmF0aXZlCiAgICBkaWcgNwogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDEzIC8vICJ1cmwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyODEKICAgIC8vIHNlbGYubWV0YWRhdGFfaGFzaCA9IG1ldGFkYXRhX2hhc2gubmF0aXZlCiAgICBkaWcgNgogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDE0IC8vICJtZXRhZGF0YV9oYXNoIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjgyCiAgICAvLyBzZWxmLm1hbmFnZXJfYWRkciA9IG1hbmFnZXJfYWRkci5uYXRpdmUKICAgIGJ5dGVjIDcgLy8gIm1hbmFnZXJfYWRkciIKICAgIGRpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyODMKICAgIC8vIHNlbGYucmVzZXJ2ZV9hZGRyID0gcmVzZXJ2ZV9hZGRyLm5hdGl2ZQogICAgYnl0ZWNfMSAvLyAicmVzZXJ2ZV9hZGRyIgogICAgZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI4NAogICAgLy8gc2VsZi5mcmVlemVfYWRkciA9IGZyZWV6ZV9hZGRyLm5hdGl2ZQogICAgYnl0ZWMgNSAvLyAiZnJlZXplX2FkZHIiCiAgICBkaWcgNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mjg1CiAgICAvLyBzZWxmLmNsYXdiYWNrX2FkZHIgPSBjbGF3YmFja19hZGRyLm5hdGl2ZQogICAgYnl0ZWNfMiAvLyAiY2xhd2JhY2tfYWRkciIKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyODYKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChzZWxmLnNtYXJ0X2FzYV9pZCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc21hcnRfYXNhX2lkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyMzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmFzc2V0X29wdF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X29wdF9pbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mjg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mjk5LTMwMAogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLmFzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhhc3NldC5pZCkKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozMDQKICAgIC8vIGFzc2VydCBjdHJsX2FzYV9vcHRfaW4ueGZlcl9hc3NldC5pZCA9PSBzZWxmLnNtYXJ0X2FzYV9pZCwgZXJyLk9QVF9JTl9XUk9OR19BU0EKICAgIGR1cAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAic21hcnRfYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNtYXJ0X2FzYV9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEFTQSBPcHQgSW4gSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzA1CiAgICAvLyBhc3NlcnQgY3RybF9hc2Ffb3B0X2luLnNlbmRlciA9PSBUeG4uc2VuZGVyLCBlcnIuT1BUX0lOX1dST05HX1NFTkRFUgogICAgZGlnIDEKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBBU0EgT3B0IEluIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozMDYKICAgIC8vIGFzc2VydCBjdHJsX2FzYV9vcHRfaW4uYXNzZXRfcmVjZWl2ZXIgPT0gVHhuLnNlbmRlciwgZXJyLk9QVF9JTl9XUk9OR19SRUNFSVZFUgogICAgZGlnIDEKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgQVNBIE9wdCBJbiBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozMDgKICAgIC8vIGN0cmxfYXNhX29wdF9pbi5hc3NldF9hbW91bnQgPT0gMAogICAgZGlnIDEKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMwNy0zMDkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY3RybF9hc2Ffb3B0X2luLmFzc2V0X2Ftb3VudCA9PSAwCiAgICAvLyApLCBlcnIuT1BUX0lOX1dST05HX0FNT1VOVCAgIyBQZWRhbnQ6IENvbnRyb2xsZWQgQVNBIGlzIGRlZmF1bHQgZnJvemVuCiAgICBhc3NlcnQgLy8gV3JvbmcgQVNBIE9wdCBJbiBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzExCiAgICAvLyBjdHJsX2FzYV9vcHRfaW4uYXNzZXRfY2xvc2VfdG8gPT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgc3dhcAogICAgZ3R4bnMgQXNzZXRDbG9zZVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMxMC0zMTIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY3RybF9hc2Ffb3B0X2luLmFzc2V0X2Nsb3NlX3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIC8vICksIGVyci5PUFRfSU5fV1JPTkdfQ0xPU0VfVE8KICAgIGFzc2VydCAvLyBGb3JiaWRkZW4gQ2xvc2UgT3V0IG9uIE9wdCBJbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozMTMKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk9wdEluLCBlcnIuV1JPTkdfT05fQ09NUExFVEUKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMSAvLyBPcHRJbgogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBPbiBDb21wbGV0ZSBBY3Rpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzE0CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlci5pc19vcHRlZF9pbigKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzE0LTMxNgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgYXNzZXQKICAgIC8vICksIGVyci5NSVNTSU5HX0NUUkxfQVNBICAjIFBlZGFudDogY3RybF9hc2Ffb3B0X2luIGlzIGNoZWNrZWQgcHJvcGVybHkKICAgIHVuY292ZXIgMgogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBNaXNzaW5nIENvbnRyb2xsZWQgQVNBCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMxOC0zMTkKICAgIC8vICMgTG9jYWwgU3RhdGUgSW5pdAogICAgLy8gc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFtUeG4uc2VuZGVyXSA9IHNlbGYuc21hcnRfYXNhX2lkCiAgICB0eG4gU2VuZGVyCiAgICBieXRlY18zIC8vICJhY2NvdW50X3NtYXJ0X2FzYV9pZCIKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozMjAKICAgIC8vIHNlbGYuYWNjb3VudF9mcm96ZW5bVHhuLnNlbmRlcl0gPSBGYWxzZQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWMgNCAvLyAiYWNjb3VudF9mcm96ZW4iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozMjQKICAgIC8vIHNlbGYuZGVmYXVsdF9mcm96ZW4gb3IgYXNzZXQuYmFsYW5jZShUeG4uc2VuZGVyKSA+IDAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJkZWZhdWx0X2Zyb3plbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0X2Zyb3plbiBleGlzdHMKICAgIGJueiBhc3NldF9vcHRfaW5faWZfYm9keUAzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICBieiBhc3NldF9vcHRfaW5fYWZ0ZXJfaWZfZWxzZUA0Cgphc3NldF9vcHRfaW5faWZfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozMjYKICAgIC8vIHNlbGYuYWNjb3VudF9mcm96ZW5bVHhuLnNlbmRlcl0gPSBUcnVlCiAgICB0eG4gU2VuZGVyCiAgICBieXRlYyA0IC8vICJhY2NvdW50X2Zyb3plbiIKICAgIGludGNfMSAvLyAxCiAgICBhcHBfbG9jYWxfcHV0Cgphc3NldF9vcHRfaW5fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmFzc2V0X2NvbmZpZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X2NvbmZpZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQzMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNjEtMzYyCiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKGNvbmZpZ19hc3NldC5pZCkKICAgIHN3YXAKICAgIGNhbGxzdWIgYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM2MwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5tYW5hZ2VyX2FkZHIsIGVyci5VTkFVVEhPUklaRURfTUFOQUdFUgogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gIm1hbmFnZXJfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYW5hZ2VyX2FkZHIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIFVuYXV0aG9yaXplZCBNYW5hZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gaWYgcmVzZXJ2ZV9hZGRyICE9IHNlbGYucmVzZXJ2ZV9hZGRyOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlX2FkZHIgZXhpc3RzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNjUKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVfYWRkciAhPSBHbG9iYWwuemVyb19hZGRyZXNzLCBlcnIuRElTQUJMRURfUkVTRVJWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlX2FkZHIgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gUmVzZXJ2ZSBBZGRyZXNzIGhhcyBiZWVuIGRlbGV0ZWQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM2NgogICAgLy8gaWYgZnJlZXplX2FkZHIgIT0gc2VsZi5mcmVlemVfYWRkcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmcmVlemVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mcmVlemVfYWRkciBleGlzdHMKICAgIGRpZyAyCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNjcKICAgIC8vIGFzc2VydCBzZWxmLmZyZWV6ZV9hZGRyICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MsIGVyci5ESVNBQkxFRF9GUkVFWkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmcmVlemVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mcmVlemVfYWRkciBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBGcmVlemUgQWRkcmVzcyBoYXMgYmVlbiBkZWxldGVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNjgKICAgIC8vIGlmIGNsYXdiYWNrX2FkZHIgIT0gc2VsZi5jbGF3YmFja19hZGRyOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNsYXdiYWNrX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2xhd2JhY2tfYWRkciBleGlzdHMKICAgIGRpZyAxCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNjkKICAgIC8vIGFzc2VydCBzZWxmLmNsYXdiYWNrX2FkZHIgIT0gR2xvYmFsLnplcm9fYWRkcmVzcywgZXJyLkRJU0FCTEVEX0NMQVdCQUNLCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2xhd2JhY2tfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jbGF3YmFja19hZGRyIGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIENsYXdiYWNrIEFkZHJlc3MgaGFzIGJlZW4gZGVsZXRlZAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzcwCiAgICAvLyBhc3NlcnQgdG90YWwgPj0gc2VsZi5jaXJjdWxhdGluZ19zdXBwbHkoY29uZmlnX2Fzc2V0KSwgZXJyLklOVkFMSURfVE9UQUwKICAgIGRpZyAxMQogICAgY2FsbHN1YiBjaXJjdWxhdGluZ19zdXBwbHkKICAgIGl0b2IKICAgIGRpZyAxMQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGI+PQogICAgYXNzZXJ0IC8vIEludmFsaWQgVG90YWwsIG11c3QgYmUgPj0gY2lyY3VsYXRpbmcgc3VwcGx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM3Mi0zNzMKICAgIC8vICMgRWZmZWN0cwogICAgLy8gc2VsZi50b3RhbCA9IHRvdGFsLm5hdGl2ZQogICAgYnRvaQogICAgYnl0ZWMgOCAvLyAidG90YWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNzQKICAgIC8vIHNlbGYuZGVjaW1hbHMgPSBkZWNpbWFscy5uYXRpdmUKICAgIGRpZyA5CiAgICBidG9pCiAgICBieXRlYyAxMCAvLyAiZGVjaW1hbHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNzUKICAgIC8vIHNlbGYuZGVmYXVsdF9mcm96ZW4gPSBkZWZhdWx0X2Zyb3plbi5uYXRpdmUKICAgIGRpZyA4CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyA5IC8vICJkZWZhdWx0X2Zyb3plbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM3NgogICAgLy8gc2VsZi51bml0X25hbWUgPSB1bml0X25hbWUubmF0aXZlCiAgICBkaWcgNwogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDExIC8vICJ1bml0X25hbWUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNzcKICAgIC8vIHNlbGYubmFtZSA9IG5hbWUubmF0aXZlCiAgICBkaWcgNgogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDEyIC8vICJuYW1lIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mzc4CiAgICAvLyBzZWxmLnVybCA9IHVybC5uYXRpdmUKICAgIGRpZyA1CiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgMTMgLy8gInVybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM3OQogICAgLy8gc2VsZi5tZXRhZGF0YV9oYXNoID0gbWV0YWRhdGFfaGFzaC5uYXRpdmUKICAgIGRpZyA0CiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgMTQgLy8gIm1ldGFkYXRhX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozODAKICAgIC8vIHNlbGYubWFuYWdlcl9hZGRyID0gbWFuYWdlcl9hZGRyLm5hdGl2ZQogICAgYnl0ZWMgNyAvLyAibWFuYWdlcl9hZGRyIgogICAgZGlnIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM4MQogICAgLy8gc2VsZi5yZXNlcnZlX2FkZHIgPSByZXNlcnZlX2FkZHIubmF0aXZlCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2FkZHIiCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzgyCiAgICAvLyBzZWxmLmZyZWV6ZV9hZGRyID0gZnJlZXplX2FkZHIubmF0aXZlCiAgICBieXRlYyA1IC8vICJmcmVlemVfYWRkciIKICAgIGRpZyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozODMKICAgIC8vIHNlbGYuY2xhd2JhY2tfYWRkciA9IGNsYXdiYWNrX2FkZHIubmF0aXZlCiAgICBieXRlY18yIC8vICJjbGF3YmFja19hZGRyIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnNtYXJ0X2FzYS5jb250cmFjdC5TbWFydEFzYS5hc3NldF90cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X3RyYW5zZmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQwMi00MDMKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoeGZlcl9hc3NldC5pZCkKICAgIHN3YXAKICAgIGNhbGxzdWIgYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gaWYgYXNzZXRfc2VuZGVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3M6CiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQwNgogICAgLy8gYXNzZXRfcmVjZWl2ZXI9YXNzZXRfcmVjZWl2ZXIsIGFzc2V0X2Ftb3VudD1hc3NldF9hbW91bnQubmF0aXZlCiAgICBkaWcgMgogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo5MS05MgogICAgLy8gIyBNaW50IHBlcm1pc3Npb24gcmVzdHJpY3RlZCB0byBSZXNlcnZlLgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5yZXNlcnZlX2FkZHIsIGVyci5VTkFVVEhPUklaRURfUkVTRVJWRQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlX2FkZHIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIFVuYXV0aG9yaXplZCBSZXNlcnZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjkzLTk0CiAgICAvLyAjIEZvcmJpZGRlbiBzZWxmLW1pbnQgKHRvIENyZWF0b3IpIGFuZCBvdmVyLW1pbnQgKD4gdG90YWwpLgogICAgLy8gYXNzZXJ0IGFzc2V0X3JlY2VpdmVyICE9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsIGVyci5TRUxGX01JTlQKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgICE9CiAgICBhc3NlcnQgLy8gRm9yYmlkZGVuIHNlbGYgbWludGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo5NgogICAgLy8gYXNzZXRfYW1vdW50ICsgc2VsZi5jaXJjdWxhdGluZ19zdXBwbHkoQXNzZXQoc2VsZi5zbWFydF9hc2FfaWQpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICBjYWxsc3ViIGNpcmN1bGF0aW5nX3N1cHBseQogICAgdW5jb3ZlciAyCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyA8PSBzZWxmLnRvdGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAidG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWwgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojk2LTk3CiAgICAvLyBhc3NldF9hbW91bnQgKyBzZWxmLmNpcmN1bGF0aW5nX3N1cHBseShBc3NldChzZWxmLnNtYXJ0X2FzYV9pZCkpCiAgICAvLyA8PSBzZWxmLnRvdGFsCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo5NS05OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBhc3NldF9hbW91bnQgKyBzZWxmLmNpcmN1bGF0aW5nX3N1cHBseShBc3NldChzZWxmLnNtYXJ0X2FzYV9pZCkpCiAgICAvLyAgICAgPD0gc2VsZi50b3RhbAogICAgLy8gKSwgZXJyLk9WRVJfTUlOVAogICAgYXNzZXJ0IC8vIEZvcmJpZGRlbiBvdmVyIG1pbnRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2Fzc2V0X3JlY2VpdmVyXSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFjY291bnRfc21hcnRfYXNhX2lkIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWQgZXhpc3RzIGZvciBhY2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAic21hcnRfYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNtYXJ0X2FzYV9pZCBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojk5LTEwMgogICAgLy8gIyBJbiB0aGUgY2FzZSBvZiBDb250cm9sbGVkIEFTQSBkZXN0cm95ZWQgYW5kIHJlLWNyZWF0ZWQsIHRoZSBTbWFydCBBREEgSUQgaW4gTG9jYWwgU3RhdGUgY291bGQgYmUgb3V0ZGF0ZWQuCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbYXNzZXRfcmVjZWl2ZXJdID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9DVFJMX0FTQQogICAgYXNzZXJ0IC8vIEludmFsaWQgQ29udHJvbGxlZCBBU0EgSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZ2xvYmFsX2Zyb3plbiwgZXJyLkdMT0JBTF9GUk9aRU4KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJnbG9iYWxfZnJvemVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JhbF9mcm96ZW4gZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU21hcnQgQVNBIGlzIGdsb2JhbCBmcm96ZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyBpZiBzZWxmLnJlc2VydmVfYWRkciAhPSBzZWxmLmNsYXdiYWNrX2FkZHI6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAicmVzZXJ2ZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVfYWRkciBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjbGF3YmFja19hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNsYXdiYWNrX2FkZHIgZXhpc3RzCiAgICAhPQogICAgYnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50X2Zyb3plblthc3NldF9yZWNlaXZlcl0sIGVyci5SRUNFSVZFUl9GUk9aRU4KICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFjY291bnRfZnJvemVuIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9mcm96ZW4gZXhpc3RzIGZvciBhY2NvdW50CiAgICAhCiAgICBhc3NlcnQgLy8gUmVjZWl2ZXIgYWNjb3VudCBpcyBmcm96ZW4KCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQyMgogICAgLy8gYXNzZXRfYW1vdW50PWFzc2V0X2Ftb3VudC5uYXRpdmUsCiAgICBkaWcgMgogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0MTktNDI1CiAgICAvLyAjIEVmZmVjdHMKICAgIC8vIHNlbGYuaW5uZXJfYXNzZXRfdHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD14ZmVyX2Fzc2V0LAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hc3NldF9hbW91bnQubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X3NlbmRlcj1hc3NldF9zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9YXNzZXRfcmVjZWl2ZXIsCiAgICAvLyApCiAgICBkaWcgNAogICAgc3dhcAogICAgZGlnIDMKICAgIGRpZyAzCiAgICBjYWxsc3ViIGlubmVyX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDA4CiAgICAvLyBlbGlmIGFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3M6CiAgICBkdXAKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYnogYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gIyBCdXJuIHBlcm1pc3Npb24gcmVzdHJpY3RlZCB0byBSZXNlcnZlLgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5yZXNlcnZlX2FkZHIsIGVyci5VTkFVVEhPUklaRURfUkVTRVJWRQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlX2FkZHIgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBVbmF1dGhvcml6ZWQgUmVzZXJ2ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMTMKICAgIC8vIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbYXNzZXRfc2VuZGVyXSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJhY2NvdW50X3NtYXJ0X2FzYV9pZCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkIGV4aXN0cyBmb3IgYWNjb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMTEtMTE0CiAgICAvLyAjIEluIGNhc2Ugb2YgQ29udHJvbGxlZCBBU0EgZGVzdHJveWVkIGFuZCByZS1jcmVhdGVkIHRoZSBTbWFydCBBREEgSUQgaW4gTG9jYWwgU3RhdGUgY291bGQgYmUgb3V0ZGF0ZWQuCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbYXNzZXRfc2VuZGVyXSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfQ1RSTF9BU0EKICAgIGFzc2VydCAvLyBJbnZhbGlkIENvbnRyb2xsZWQgQVNBIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjExNQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmdsb2JhbF9mcm96ZW4sIGVyci5HTE9CQUxfRlJPWkVOCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiZ2xvYmFsX2Zyb3plbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iYWxfZnJvemVuIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFNtYXJ0IEFTQSBpcyBnbG9iYWwgZnJvemVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjExNgogICAgLy8gaWYgc2VsZi5yZXNlcnZlX2FkZHIgIT0gc2VsZi5jbGF3YmFja19hZGRyOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNsYXdiYWNrX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2xhd2JhY2tfYWRkciBleGlzdHMKICAgICE9CiAgICBieiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRfZnJvemVuW2Fzc2V0X3NlbmRlcl0sIGVyci5TRU5ERVJfRlJPWkVOCiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWNjb3VudF9mcm96ZW4iCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X2Zyb3plbiBleGlzdHMgZm9yIGFjY291bnQKICAgICEKICAgIGFzc2VydCAvLyBTZW5kZXIgYWNjb3VudCBpcyBmcm96ZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTE4LTExOQogICAgLy8gIyBGb3JiaWRkZW4gY2xhd2JhY2sgdGhyb3VnaCBidXJuaW5nIChidXJuZWQgYW1vdW50IG5vdCBmcm9tIFJlc2VydmUpLgogICAgLy8gYXNzZXJ0IGFzc2V0X3NlbmRlciA9PSBzZWxmLnJlc2VydmVfYWRkciwgZXJyLkNMQVdCQUNLX0JVUk4KICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZV9hZGRyIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBGb3JiaWRkZW4gY2xhd2JhY2sgYnVybmluZwogICAgYiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDEwCgphc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDEwCiAgICAvLyBlbGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5jbGF3YmFja19hZGRyOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNsYXdiYWNrX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2xhd2JhY2tfYWRkciBleGlzdHMKICAgID09CiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlANwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMjcKICAgIC8vIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbYXNzZXRfc2VuZGVyXSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJhY2NvdW50X3NtYXJ0X2FzYV9pZCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkIGV4aXN0cyBmb3IgYWNjb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTI1LTEyOAogICAgLy8gIyBJbiB0aGUgY2FzZSBvZiBDb250cm9sbGVkIEFTQSBkZXN0cm95ZWQgYW5kIHJlLWNyZWF0ZWQsIHRoZSBTbWFydCBBREEgSUQgaW4gTG9jYWwgU3RhdGUgY291bGQgYmUgb3V0ZGF0ZWQuCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbYXNzZXRfc2VuZGVyXSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfQ1RSTF9BU0EKICAgIGFzc2VydCAvLyBJbnZhbGlkIENvbnRyb2xsZWQgQVNBIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjEzMAogICAgLy8gc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFthc3NldF9yZWNlaXZlcl0gPT0gc2VsZi5zbWFydF9hc2FfaWQKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiYWNjb3VudF9zbWFydF9hc2FfaWQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZCBleGlzdHMgZm9yIGFjY291bnQKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjEyOS0xMzEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFthc3NldF9yZWNlaXZlcl0gPT0gc2VsZi5zbWFydF9hc2FfaWQKICAgIC8vICksIGVyci5JTlZBTElEX0NUUkxfQVNBCiAgICBhc3NlcnQgLy8gSW52YWxpZCBDb250cm9sbGVkIEFTQSBJRAogICAgYiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDEwCgphc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTM3CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBhc3NldF9zZW5kZXIsIGVyci5VTkFVVEhPUklaRURfQ0xBV0JBQ0sKICAgIHR4biBTZW5kZXIKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gVW5hdXRob3JpemVkIENsYXdiYWNrCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE0MAogICAgLy8gc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFthc3NldF9zZW5kZXJdID09IHNlbGYuc21hcnRfYXNhX2lkCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJhY2NvdW50X3NtYXJ0X2FzYV9pZCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkIGV4aXN0cyBmb3IgYWNjb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTM4LTE0MQogICAgLy8gIyBJbiB0aGUgY2FzZSBvZiBDb250cm9sbGVkIEFTQSBkZXN0cm95ZWQgYW5kIHJlLWNyZWF0ZWQsIHRoZSBTbWFydCBBREEgSUQgaW4gTG9jYWwgU3RhdGUgY291bGQgYmUgb3V0ZGF0ZWQuCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbYXNzZXRfc2VuZGVyXSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfQ1RSTF9BU0EKICAgIGFzc2VydCAvLyBJbnZhbGlkIENvbnRyb2xsZWQgQVNBIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFthc3NldF9yZWNlaXZlcl0gPT0gc2VsZi5zbWFydF9hc2FfaWQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJhY2NvdW50X3NtYXJ0X2FzYV9pZCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkIGV4aXN0cyBmb3IgYWNjb3VudAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTQyLTE0NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2Fzc2V0X3JlY2VpdmVyXSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfQ1RSTF9BU0EKICAgIGFzc2VydCAvLyBJbnZhbGlkIENvbnRyb2xsZWQgQVNBIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmdsb2JhbF9mcm96ZW4sIGVyci5HTE9CQUxfRlJPWkVOCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiZ2xvYmFsX2Zyb3plbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iYWxfZnJvemVuIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFNtYXJ0IEFTQSBpcyBnbG9iYWwgZnJvemVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRfZnJvemVuW2Fzc2V0X3NlbmRlcl0sIGVyci5TRU5ERVJfRlJPWkVOCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWNjb3VudF9mcm96ZW4iCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X2Zyb3plbiBleGlzdHMgZm9yIGFjY291bnQKICAgICEKICAgIGFzc2VydCAvLyBTZW5kZXIgYWNjb3VudCBpcyBmcm96ZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudF9mcm96ZW5bYXNzZXRfcmVjZWl2ZXJdLCBlcnIuUkVDRUlWRVJfRlJPWkVOCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWNjb3VudF9mcm96ZW4iCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X2Zyb3plbiBleGlzdHMgZm9yIGFjY291bnQKICAgICEKICAgIGFzc2VydCAvLyBSZWNlaXZlciBhY2NvdW50IGlzIGZyb3plbgogICAgYiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDEwCgoKLy8gc21hcnRfY29udHJhY3RzLnNtYXJ0X2FzYS5jb250cmFjdC5TbWFydEFzYS5hc3NldF9mcmVlemVbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF9mcmVlemU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0MzYtNDM3CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKGZyZWV6ZV9hc3NldC5pZCkKICAgIHN3YXAKICAgIGNhbGxzdWIgYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQzOAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5mcmVlemVfYWRkciwgZXJyLlVOQVVUSE9SSVpFRF9GUkVFWkUKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmcmVlemVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mcmVlemVfYWRkciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gVW5hdXRob3JpemVkIEZyZWV6ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NDAtNDQxCiAgICAvLyAjIEVmZmVjdHMKICAgIC8vIHNlbGYuZ2xvYmFsX2Zyb3plbiA9IGFzc2V0X2Zyb3plbi5uYXRpdmUKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDYgLy8gImdsb2JhbF9mcm96ZW4iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuYWNjb3VudF9mcmVlemVbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2ZyZWV6ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDU1LTQ1NgogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLmFzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhmcmVlemVfYXNzZXQuaWQpCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ1OAogICAgLy8gc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFtmcmVlemVfYWNjb3VudF0gPT0gc2VsZi5zbWFydF9hc2FfaWQKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiYWNjb3VudF9zbWFydF9hc2FfaWQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZCBleGlzdHMgZm9yIGFjY291bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc21hcnRfYXNhX2lkIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDU3LTQ1OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2ZyZWV6ZV9hY2NvdW50XSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfQ1RSTF9BU0EKICAgIGFzc2VydCAvLyBJbnZhbGlkIENvbnRyb2xsZWQgQVNBIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ2MAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5mcmVlemVfYWRkciwgZXJyLlVOQVVUSE9SSVpFRF9GUkVFWkUKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmcmVlemVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mcmVlemVfYWRkciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gVW5hdXRob3JpemVkIEZyZWV6ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NjItNDYzCiAgICAvLyAjIEVmZmVjdHMKICAgIC8vIHNlbGYuYWNjb3VudF9mcm96ZW5bZnJlZXplX2FjY291bnRdID0gYXNzZXRfZnJvemVuLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgNCAvLyAiYWNjb3VudF9mcm96ZW4iCiAgICBzd2FwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnNtYXJ0X2FzYS5jb250cmFjdC5TbWFydEFzYS5hc3NldF9jbG9zZV9vdXRbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF9jbG9zZV9vdXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJDbG9zZU91dCJdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTUxCiAgICAvLyBhc2FfY2xvc2Vfb3V0X3JlbGF0aXZlX2lkeCA9IFR4bi5ncm91cF9pbmRleCArIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNTIKICAgIC8vIGFzYV9jbG9zZV9vdXRfdHhuID0gZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24oYXNhX2Nsb3NlX291dF9yZWxhdGl2ZV9pZHgpCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNTMKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLkNsb3NlT3V0LCBlcnIuV1JPTkdfT05fQ09NUExFVEUKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgMiAvLyBDbG9zZU91dAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBPbiBDb21wbGV0ZSBBY3Rpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTU1CiAgICAvLyBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW1R4bi5zZW5kZXJdID09IGNsb3NlX2Fzc2V0LmlkCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiYWNjb3VudF9zbWFydF9hc2FfaWQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZCBleGlzdHMgZm9yIGFjY291bnQKICAgIGRpZyAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNTQtMTU2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWRbVHhuLnNlbmRlcl0gPT0gY2xvc2VfYXNzZXQuaWQKICAgIC8vICksIGVyci5JTlZBTElEX0NUUkxfQVNBCiAgICBhc3NlcnQgLy8gSW52YWxpZCBDb250cm9sbGVkIEFTQSBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNTgKICAgIC8vIEdsb2JhbC5ncm91cF9zaXplID4gYXNhX2Nsb3NlX291dF9yZWxhdGl2ZV9pZHgKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIGRpZyAxCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE1Ny0xNTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmdyb3VwX3NpemUgPiBhc2FfY2xvc2Vfb3V0X3JlbGF0aXZlX2lkeAogICAgLy8gKSwgZXJyLklOVkFMSURfQ0xPU0VfT1VUX0dST1VQX1NJWkUKICAgIGFzc2VydCAvLyBJbnZhbGlkIENsb3NlIE91dCBncm91cCBzaXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gYXNhX2Nsb3NlX291dF90eG4ueGZlcl9hc3NldC5pZCA9PSBjbG9zZV9hc3NldC5pZAogICAgZHVwCiAgICBndHhucyBYZmVyQXNzZXQKICAgIGRpZyAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNjMtMTY1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGFzYV9jbG9zZV9vdXRfdHhuLnhmZXJfYXNzZXQuaWQgPT0gY2xvc2VfYXNzZXQuaWQKICAgIC8vICksIGVyci5DTE9TRV9PVVRfV1JPTkdfQVNBCiAgICBhc3NlcnQgLy8gV3JvbmcgQVNBIENsb3NlIE91dCBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNjYKICAgIC8vIGFzc2VydCBhc2FfY2xvc2Vfb3V0X3R4bi5zZW5kZXIgPT0gVHhuLnNlbmRlciwgZXJyLkNMT1NFX09VVF9XUk9OR19TRU5ERVIKICAgIGR1cAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEFTQSBDbG9zZSBPdXQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE2NwogICAgLy8gYXNzZXJ0IGFzYV9jbG9zZV9vdXRfdHhuLmFzc2V0X2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5DTE9TRV9PVVRfV1JPTkdfQU1PVU5UCiAgICBkdXAKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgQVNBIENsb3NlIE91dCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTY5CiAgICAvLyBhc2FfY2xvc2Vfb3V0X3R4bi5hc3NldF9jbG9zZV90byAhPSBHbG9iYWwuemVyb19hZGRyZXNzCiAgICBndHhucyBBc3NldENsb3NlVG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTY4LTE3MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBhc2FfY2xvc2Vfb3V0X3R4bi5hc3NldF9jbG9zZV90byAhPSBHbG9iYWwuemVyb19hZGRyZXNzCiAgICAvLyApLCBlcnIuQ0xPU0VfT1VUX1dST05HX0NMT1NFX1RPCiAgICBhc3NlcnQgLy8gV3JvbmcgQ2xvc2UgT3V0IG9uIENsb3NlIE91dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NzYKICAgIC8vIChjcmVhdG9yLCBleGlzdHMpID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihjbG9zZV9hc3NldC5pZCkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ3NwogICAgLy8gaWYgZXhpc3RzOiAgIyBTbWFydCBBU0EgaGFzIG5vdCBiZWVuIGRlc3Ryb3llZAogICAgYnogYXNzZXRfY2xvc2Vfb3V0X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNzYKICAgIC8vIGFzYV9jbG9zZV9vdXRfcmVsYXRpdmVfaWR4ID0gVHhuLmdyb3VwX2luZGV4ICsgMQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gYXNhX2Nsb3NlX291dF90eG4gPSBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbihhc2FfY2xvc2Vfb3V0X3JlbGF0aXZlX2lkeCkKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gYXNhX2Nsb3NlX291dF90eG4uYXNzZXRfY2xvc2VfdG8gPT0gYXNzZXRfY3JlYXRvcgogICAgZ3R4bnMgQXNzZXRDbG9zZVRvCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNzgtMTgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGFzYV9jbG9zZV9vdXRfdHhuLmFzc2V0X2Nsb3NlX3RvID09IGFzc2V0X2NyZWF0b3IKICAgIC8vICksIGVyci5DTE9TRV9PVVRfV1JPTkdfQ0xPU0VfVE8KICAgIGFzc2VydCAvLyBXcm9uZyBDbG9zZSBPdXQgb24gQ2xvc2UgT3V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gYXNzZXJ0IGNsb3NlX2Fzc2V0LmlkID09IHNlbGYuc21hcnRfYXNhX2lkLCBlcnIuSU5WQUxJRF9DVFJMX0FTQQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICBkaWcgNAogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIENvbnRyb2xsZWQgQVNBIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ4MAogICAgLy8gY2xvc2VfdG8gIT0gY3JlYXRvcgogICAgZGlnIDIKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ3OS00ODEKICAgIC8vIGlmICgKICAgIC8vICAgICBjbG9zZV90byAhPSBjcmVhdG9yCiAgICAvLyApOiAgIyBJZiBjbG9zZS1vdXQgdGFyZ2V0IGlzIG5vdCB0aGUgQ3JlYXRvciwgdGhlbiBjbG9zZS1vdXQgdGFyZ2V0IE1VU1QgYmUgb3B0ZWQtaW4KICAgIGJ6IGFzc2V0X2Nsb3NlX291dF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDgzCiAgICAvLyBzZWxmLmFjY291bnRfc21hcnRfYXNhX2lkW2Nsb3NlX3RvXSA9PSBzZWxmLnNtYXJ0X2FzYV9pZAogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFjY291bnRfc21hcnRfYXNhX2lkIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9zbWFydF9hc2FfaWQgZXhpc3RzIGZvciBhY2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAic21hcnRfYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNtYXJ0X2FzYV9pZCBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ4Mi00ODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X3NtYXJ0X2FzYV9pZFtjbG9zZV90b10gPT0gc2VsZi5zbWFydF9hc2FfaWQKICAgIC8vICksIGVyci5JTlZBTElEX0NUUkxfQVNBCiAgICBhc3NlcnQgLy8gSW52YWxpZCBDb250cm9sbGVkIEFTQSBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxODUKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5nbG9iYWxfZnJvemVuLCBlcnIuR0xPQkFMX0ZST1pFTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImdsb2JhbF9mcm96ZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYmFsX2Zyb3plbiBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTbWFydCBBU0EgaXMgZ2xvYmFsIGZyb3plbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxODYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50X2Zyb3plbltUeG4uc2VuZGVyXSwgZXJyLlNFTkRFUl9GUk9aRU4KICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJhY2NvdW50X2Zyb3plbiIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfZnJvemVuIGV4aXN0cyBmb3IgYWNjb3VudAogICAgIQogICAgYXNzZXJ0IC8vIFNlbmRlciBhY2NvdW50IGlzIGZyb3plbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxODcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50X2Zyb3plbltjbG9zZV90b10sIGVyci5DTE9TRV9UT19GUk9aRU4KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJhY2NvdW50X2Zyb3plbiIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfZnJvemVuIGV4aXN0cyBmb3IgYWNjb3VudAogICAgIQogICAgYXNzZXJ0IC8vIENsb3NlIHRvIGFjY291bnQgaXMgZnJvemVuCgphc3NldF9jbG9zZV9vdXRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0OTAKICAgIC8vIGFzc2V0X2Ftb3VudD1jbG9zZV9hc3NldC5iYWxhbmNlKFR4bi5zZW5kZXIpLAogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ5MQogICAgLy8gYXNzZXRfc2VuZGVyPVR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ4Ny00OTMKICAgIC8vICMgRWZmZWN0cwogICAgLy8gc2VsZi5pbm5lcl9hc3NldF90cmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWNsb3NlX2Fzc2V0LAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1jbG9zZV9hc3NldC5iYWxhbmNlKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIGFzc2V0X3NlbmRlcj1UeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPWNsb3NlX3RvLAogICAgLy8gKQogICAgZGlnIDQKICAgIGNhbGxzdWIgaW5uZXJfYXNzZXRfdHJhbnNmZXIKCmFzc2V0X2Nsb3NlX291dF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJDbG9zZU91dCJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuYXNzZXRfZGVzdHJveVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X2Rlc3Ryb3k6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUwMy01MDQKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoZGVzdHJveV9hc3NldC5pZCkKICAgIGR1cAogICAgY2FsbHN1YiBhc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTA1CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLm1hbmFnZXJfYWRkciwgZXJyLlVOQVVUSE9SSVpFRF9NQU5BR0VSCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAibWFuYWdlcl9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hbmFnZXJfYWRkciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gVW5hdXRob3JpemVkIE1hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjI5LTIzMwogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICBjb25maWdfYXNzZXQ9ZGVzdHJveV9hc3NldCwKICAgIC8vICAgICBzZW5kZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjMyCiAgICAvLyBzZW5kZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyMjkKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyMzAKICAgIC8vIGZlZT0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjIyOS0yMzMKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyAgICAgY29uZmlnX2Fzc2V0PWRlc3Ryb3lfYXNzZXQsCiAgICAvLyAgICAgc2VuZGVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MDkKICAgIC8vIHNlbGYudG90YWwgPSBVSW50NjQoKQogICAgYnl0ZWMgOCAvLyAidG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTEwCiAgICAvLyBzZWxmLmRlY2ltYWxzID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJkZWNpbWFscyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MTEKICAgIC8vIHNlbGYuZGVmYXVsdF9mcm96ZW4gPSBGYWxzZQogICAgYnl0ZWMgOSAvLyAiZGVmYXVsdF9mcm96ZW4iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTEyCiAgICAvLyBzZWxmLnVuaXRfbmFtZSA9IFN0cmluZygpCiAgICBieXRlYyAxMSAvLyAidW5pdF9uYW1lIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MTMKICAgIC8vIHNlbGYubmFtZSA9IFN0cmluZygpCiAgICBieXRlYyAxMiAvLyAibmFtZSIKICAgIHB1c2hieXRlcyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTE0CiAgICAvLyBzZWxmLnVybCA9IFN0cmluZygpCiAgICBieXRlYyAxMyAvLyAidXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MTUKICAgIC8vIHNlbGYubWV0YWRhdGFfaGFzaCA9IEJ5dGVzKCkKICAgIGJ5dGVjIDE0IC8vICJtZXRhZGF0YV9oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MTYKICAgIC8vIHNlbGYubWFuYWdlcl9hZGRyID0gQWNjb3VudCgpCiAgICBieXRlYyA3IC8vICJtYW5hZ2VyX2FkZHIiCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5yZXNlcnZlX2FkZHIgPSBBY2NvdW50KCkKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYWRkciIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTE4CiAgICAvLyBzZWxmLmZyZWV6ZV9hZGRyID0gQWNjb3VudCgpCiAgICBieXRlYyA1IC8vICJmcmVlemVfYWRkciIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTE5CiAgICAvLyBzZWxmLmNsYXdiYWNrX2FkZHIgPSBBY2NvdW50KCkKICAgIGJ5dGVjXzIgLy8gImNsYXdiYWNrX2FkZHIiCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUyMAogICAgLy8gc2VsZi5zbWFydF9hc2FfaWQgPSBVSW50NjQoKQogICAgYnl0ZWNfMCAvLyAic21hcnRfYXNhX2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUyMQogICAgLy8gc2VsZi5nbG9iYWxfZnJvemVuID0gRmFsc2UKICAgIGJ5dGVjIDYgLy8gImdsb2JhbF9mcm96ZW4iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmdldF9hc3NldF9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXNzZXRfY29uZmlnOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MzQtNTM1CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKGFzc2V0LmlkKQogICAgY2FsbHN1YiBhc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTM5CiAgICAvLyB0b3RhbD1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJ0b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTQwCiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQzMihzZWxmLmRlY2ltYWxzKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiZGVjaW1hbHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVjaW1hbHMgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDQgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1NDEKICAgIC8vIGRlZmF1bHRfZnJvemVuPWFyYzQuQm9vbChzZWxmLmRlZmF1bHRfZnJvemVuKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJkZWZhdWx0X2Zyb3plbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0X2Zyb3plbiBleGlzdHMKICAgIGJ5dGVjIDE2IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1NDIKICAgIC8vIHVuaXRfbmFtZT1hcmM0LlN0cmluZyhzZWxmLnVuaXRfbmFtZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInVuaXRfbmFtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X25hbWUgZXhpc3RzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1NDMKICAgIC8vIG5hbWU9YXJjNC5TdHJpbmcoc2VsZi5uYW1lKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAibmFtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uYW1lIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTQ0CiAgICAvLyB1cmw9YXJjNC5TdHJpbmcoc2VsZi51cmwpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ1cmwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudXJsIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTQ1CiAgICAvLyBtZXRhZGF0YV9oYXNoPWFyYzQuRHluYW1pY0J5dGVzKHNlbGYubWV0YWRhdGFfaGFzaCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm1ldGFkYXRhX2hhc2giCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGFfaGFzaCBleGlzdHMKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU0NgogICAgLy8gbWFuYWdlcl9hZGRyPWFyYzQuQWRkcmVzcyhzZWxmLm1hbmFnZXJfYWRkciksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAibWFuYWdlcl9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hbmFnZXJfYWRkciBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTQ3CiAgICAvLyByZXNlcnZlX2FkZHI9YXJjNC5BZGRyZXNzKHNlbGYucmVzZXJ2ZV9hZGRyKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZV9hZGRyIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1NDgKICAgIC8vIGZyZWV6ZV9hZGRyPWFyYzQuQWRkcmVzcyhzZWxmLmZyZWV6ZV9hZGRyKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmcmVlemVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mcmVlemVfYWRkciBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTQ5CiAgICAvLyBjbGF3YmFja19hZGRyPWFyYzQuQWRkcmVzcyhzZWxmLmNsYXdiYWNrX2FkZHIpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNsYXdiYWNrX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2xhd2JhY2tfYWRkciBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTM3LTU1MAogICAgLy8gIyBFZmZlY3RzCiAgICAvLyByZXR1cm4gQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoc2VsZi50b3RhbCksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50MzIoc2VsZi5kZWNpbWFscyksCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49YXJjNC5Cb29sKHNlbGYuZGVmYXVsdF9mcm96ZW4pLAogICAgLy8gICAgIHVuaXRfbmFtZT1hcmM0LlN0cmluZyhzZWxmLnVuaXRfbmFtZSksCiAgICAvLyAgICAgbmFtZT1hcmM0LlN0cmluZyhzZWxmLm5hbWUpLAogICAgLy8gICAgIHVybD1hcmM0LlN0cmluZyhzZWxmLnVybCksCiAgICAvLyAgICAgbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhzZWxmLm1ldGFkYXRhX2hhc2gpLAogICAgLy8gICAgIG1hbmFnZXJfYWRkcj1hcmM0LkFkZHJlc3Moc2VsZi5tYW5hZ2VyX2FkZHIpLAogICAgLy8gICAgIHJlc2VydmVfYWRkcj1hcmM0LkFkZHJlc3Moc2VsZi5yZXNlcnZlX2FkZHIpLAogICAgLy8gICAgIGZyZWV6ZV9hZGRyPWFyYzQuQWRkcmVzcyhzZWxmLmZyZWV6ZV9hZGRyKSwKICAgIC8vICAgICBjbGF3YmFja19hZGRyPWFyYzQuQWRkcmVzcyhzZWxmLmNsYXdiYWNrX2FkZHIpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDA5NQogICAgY29uY2F0CiAgICBkaWcgOAogICAgbGVuCiAgICBwdXNoaW50IDE0OSAvLyAxNDkKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgOAogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgNwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyAxNSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuZ2V0X2Fzc2V0X2lzX2Zyb3plbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hc3NldF9pc19mcm96ZW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU2My01NjQKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoZnJlZXplX2Fzc2V0LmlkKQogICAgY2FsbHN1YiBhc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTY2LTU2NwogICAgLy8gIyBFZmZlY3RzCiAgICAvLyByZXR1cm4gYXJjNC5Cb29sKHNlbGYuZ2xvYmFsX2Zyb3plbikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJnbG9iYWxfZnJvemVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JhbF9mcm96ZW4gZXhpc3RzCiAgICBieXRlYyAxNiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDE1IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnNtYXJ0X2FzYS5jb250cmFjdC5TbWFydEFzYS5nZXRfYWNjb3VudF9pc19mcm96ZW5bcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYWNjb3VudF9pc19mcm96ZW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjU2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTgzLTU4NAogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLmFzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhmcmVlemVfYXNzZXQuaWQpCiAgICBzd2FwCiAgICBjYWxsc3ViIGFzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1ODYtNTg3CiAgICAvLyAjIEVmZmVjdHMKICAgIC8vIHJldHVybiBhcmM0LkJvb2woc2VsZi5hY2NvdW50X2Zyb3plbltmcmVlemVfYWNjb3VudF0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWNjb3VudF9mcm96ZW4iCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X2Zyb3plbiBleGlzdHMgZm9yIGFjY291bnQKICAgIGJ5dGVjIDE2IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmdldF9jaXJjdWxhdGluZ19zdXBwbHlbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfY2lyY3VsYXRpbmdfc3VwcGx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo2MDAtNjAxCiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKGFzc2V0LmlkKQogICAgZHVwCiAgICBjYWxsc3ViIGFzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo2MDMtNjA0CiAgICAvLyAjIEVmZmVjdHMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3N1cHBseShhc3NldCkpCiAgICBjYWxsc3ViIGNpcmN1bGF0aW5nX3N1cHBseQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmNpcmN1bGF0aW5nX3N1cHBseShjdHJsX2Fzc2V0OiB1aW50NjQpIC0+IHVpbnQ2NDoKY2lyY3VsYXRpbmdfc3VwcGx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo3OC03OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjaXJjdWxhdGluZ19zdXBwbHkoc2VsZiwgY3RybF9hc3NldDogQXNzZXQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo4MAogICAgLy8gcmV0dXJuIGNmZy5UT1RBTCAtIGN0cmxfYXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICBpbnRjIDQgLy8gMTg0NDY3NDQwNzM3MDk1NTE2MTUKICAgIHN3YXAKICAgIC0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKGFzc2V0X2lkOiB1aW50NjQpIC0+IHZvaWQ6CmFzc2VydF9jb21tb25fcHJlY29uZGl0aW9uczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6ODItODMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6ODQKICAgIC8vIGFzc2VydCBzZWxmLnNtYXJ0X2FzYV9pZCwgZXJyLk1JU1NJTkdfQ1RSTF9BU0EKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJzbWFydF9hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc21hcnRfYXNhX2lkIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTWlzc2luZyBDb250cm9sbGVkIEFTQQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo4NQogICAgLy8gYXNzZXJ0IHNlbGYuc21hcnRfYXNhX2lkID09IGFzc2V0X2lkLCBlcnIuSU5WQUxJRF9DVFJMX0FTQQogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgQ29udHJvbGxlZCBBU0EgSUQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuaW5uZXJfYXNzZXRfdHJhbnNmZXIoeGZlcl9hc3NldDogdWludDY0LCBhc3NldF9hbW91bnQ6IHVpbnQ2NCwgYXNzZXRfc2VuZGVyOiBieXRlcywgYXNzZXRfcmVjZWl2ZXI6IGJ5dGVzKSAtPiB2b2lkOgppbm5lcl9hc3NldF90cmFuc2ZlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjA5LTIxNwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBpbm5lcl9hc3NldF90cmFuc2ZlcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgICosCiAgICAvLyAgICAgeGZlcl9hc3NldDogQXNzZXQsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50OiBVSW50NjQsCiAgICAvLyAgICAgYXNzZXRfc2VuZGVyOiBBY2NvdW50LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyOiBBY2NvdW50CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA0IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjE4LTIyNQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gICAgIHhmZXJfYXNzZXQ9eGZlcl9hc3NldC5pZCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YXNzZXRfYW1vdW50LAogICAgLy8gICAgIGFzc2V0X3NlbmRlcj1hc3NldF9zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9YXNzZXRfcmVjZWl2ZXIsCiAgICAvLyAgICAgc2VuZGVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gc2VuZGVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRTZW5kZXIKICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC00CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyMTgKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyMTkKICAgIC8vIGZlZT0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjIxOC0yMjUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXhmZXJfYXNzZXQuaWQsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFzc2V0X2Ftb3VudCwKICAgIC8vICAgICBhc3NldF9zZW5kZXI9YXNzZXRfc2VuZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPWFzc2V0X3JlY2VpdmVyLAogICAgLy8gICAgIHNlbmRlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { "approval": "CyAFAAEIIP///////////wEmEQxzbWFydF9hc2FfaWQMcmVzZXJ2ZV9hZGRyDWNsYXdiYWNrX2FkZHIUYWNjb3VudF9zbWFydF9hc2FfaWQOYWNjb3VudF9mcm96ZW4LZnJlZXplX2FkZHINZ2xvYmFsX2Zyb3plbgxtYW5hZ2VyX2FkZHIFdG90YWwOZGVmYXVsdF9mcm96ZW4IZGVjaW1hbHMJdW5pdF9uYW1lBG5hbWUDdXJsDW1ldGFkYXRhX2hhc2gEFR98dQEAMRhAAE4xNSQSRDE0gQUSRDE3FEQxNoECEkQnCCJnJwoiZycJImcnC4AAZycMgABnJw2AAGcnDoAAZycHMgNnKTIDZycFMgNnKjIDZygiZycGImcxG0EAgYICBEhkFkUEOgRb3DYaAI4CAGEAVTEZFEQxGESCCgTn7NWoBPiBn+sEfqy3dQShM9WBBP9Tre8E7WRFLwQum5A4BJebmXIESKY8yQRGrQ1SNhoAjgoAIgH4AyYEUQR3BV4FvgaDBqEGyAAxGYECEjEYEERCBKUxGSMSMRgQREIBaTEZFDEYFBBEI0M2GgFJFSQSRDYaAkkVgQQSRDYaA0kVIxJENhoERwIiWYECCEwVEkQ2GgVHAiJZgQIITBUSRDYaBkcCIlmBAghMFRJENhoHRwIiWYECCEwVEkQ2GghJFSUSRDYaCUkVJRJENhoKSRUlEkQ2GgtJFSUSRDEAMgkSRCIoZUQURLEyCIAASwFBACJLAUmBChiACjAxMjM0NTY3ODlMI1hLAlBFAoEKCkUCQv/ZRwIVgAEwTgJNgA9hbGdvcmFuZDovL2FwcC9MUDIKRwOyLLIrsiqyKbIngBBBUkMtMjAgU21hcnQgQVNBsiaABkFSQy0yMLIlI7IkIrIjIQSyIoEDshAisgGzKLQ8Z0sMFycITGdLCxcnCkxnSwoiUycJTGdLCVcCACcLTGdLCFcCACcMTGdLB1cCACcNTGdLBlcCACcOTGcnB0sGZylLBWcnBUsEZypLA2ciKGVEFicPTFCwI0M2GgFJFSQSRBdJMRYjCUk4EIEEEkRLAYgFVEk4ESIoZURMSwESREsBOAAxABJESwE4FDEAEkRLATgSFERMOBUyAxJEMRkjEkQxAE8CcABFAUQxACtPAmYxACcEImYiJwllREAACjEASwFwAERBAAYxACcEI2YjQzYaAUkVJBJEF0k2GgJJTgIVJBJENhoDSU4CFYEEEkQ2GgRJTgIVIxJENhoFSU4CSSJZgQIITBUSRDYaBklOAkkiWYECCEwVEkQ2GgdJTgJJIlmBAghMFRJENhoISU4CSSJZgQIITBUSRDYaCUlOAhUlEkQ2GgpJTgJJFSUSRDYaC0lOAxUlEkQ2GgxJTgMVJRJETIgEYTEAIicHZUQSRCIpZUQTQQAIIillRDIDE0QiJwVlREsCE0EACSInBWVEMgMTRCIqZURLARNBAAgiKmVEMgMTREsLiAQOFksLSU8Cp0QXJwhMZ0sJFycKTGdLCCJTJwlMZ0sHVwIAJwtMZ0sGVwIAJwxMZ0sFVwIAJw1MZ0sEVwIAJw5MZycHSwRnKUsDZycFSwJnKksBZyNDNhoBSRUkEkQXSTYaAklOAhUkEkQ2GgNJTgJJFSUSRDYaBElOAxUlEkRMiAOcMgoSQQBZSwIXMQAiKWVEEkQyCksCSU8CE0QiKGVEiANsTwIIIicIZUQORCIrY0QiKGVEEkQiJwZlRBREIillRCIqZUQTQQAISSInBGNEFERLAhdLBExLA0sDiANNI0NJMgoSQQA5MQAiKWVETEsBEkRLAiIrY0QiKGVEEkQiJwZlRBREIiplRBNB/8RLAUkiJwRjRBREIillRBJEQv+xMQAiKmVEEkEAGksBIitjRCIoZURMSwESREsBIitjRBJEQv+NMQBLAklOAhJESSIrY0QiKGVETEsBEkRLAklOAiIrY0QSRCInBmVEFERMIicEY0QURCInBGNEFERC/1I2GgFJFSQSRBc2GgJJFSMSREyIAokxACInBWVEEkQiUycGTGcjQzYaAUkVJBJEFzYaAkkVJRJENhoDSRUjEkRPAogCWksBIitjRCIoZUQSRDEAIicFZUQSRCJTJwRMZiNDNhoBSRUkEkQXSTYaAklOAhUlEkQxFiMISTgQgQQSRDEZgQISRDEAIitjREsCEkQyBEsBDURJOBFLAhJESTgAMQASREk4EhREOBUyAxNEcQtBAFcxFiMISTgQgQQSRDgVSwFJTgISRCIoZURLBBJESwITQQAkSwFJIitjRCIoZUQSRCInBmVEFEQxACInBGNEFEQiJwRjRBREMQBLA0lOAnAARDEASwSIAaEjQzYaAUkVJBJEF0mIAYQxACInB2VEEkSxMgqyALIhgQOyECKyAbMnCCJnJwoiZycJImcnC4AAZycMgABnJw2AAGcnDoAAZycHMgNnKTIDZycFMgNnKjIDZygiZycGImcjQzYaAUkVJBJEF4gBJSInCGVEFiInCmVEFkmTJQ5EVwQEIicJZUQnECJPAlQiJwtlREkVFlcGAkxQIicMZURJFRZXBgJMUCInDWVESRUWVwYCTFAiJw5lREkVFlcGAkxQIicHZUQiKWVEIicFZUQiKmVETwpPClBPCVCAAgCVUEsIFYGVAQhJFlcGAk8CTFBLCBVPAghJFlcGAk8CTFBLBxVPAggWVwYCUE8EUE8DUE8CUExQTwRQTwNQTwJQTFAnD0xQsCNDNhoBSRUkEkQXiABgIicGZUQnECJPAlQnD0xQsCNDNhoBSRUkEkQXNhoCSRUlEkRMiAA5IicEY0QnECJPAlQnD0xQsCNDNhoBSRUkEkQXSYgAGogACBYnD0xQsCNDigEBMgqL/3AARCEETAmJigEAIihlRElEi/8SRImKBACxMgqyAIv/shSL/rITi/2yEov8shGBBLIQIrIBs4k=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 4, "patch": 0 } }, "events": [], "templateVariables": {} }