diff --git a/src/tests/data/era/era_info_result.json b/src/tests/data/era/era_info_result.json new file mode 100644 index 00000000..8c6bd58d --- /dev/null +++ b/src/tests/data/era/era_info_result.json @@ -0,0 +1,156 @@ +{ + "EraInfo": { + "seigniorage_allocations": [ + { + "Delegator": { + "delegator_kind": { + "PublicKey": "018b46617b2b97e633b36530f2964b3f4c15916235910a2737e83d4fa2c7fad542" + }, + "validator_public_key": "01509254f22690fbe7fb6134be574c4fbdb060dfa699964653b99753485e518ea6", + "amount": "2515330120214391" + } + }, + { + "Validator": { + "validator_public_key": "01509254f22690fbe7fb6134be574c4fbdb060dfa699964653b99753485e518ea6", + "amount": "2728720430156545" + } + }, + { + "Delegator": { + "delegator_kind": { + "PublicKey": "018b46617b2b97e633b36530f2964b3f4c15916235910a2737e83d4fa2c7fad542" + }, + "validator_public_key": "01509254f22690fbe7fb6134be574c4fbdb060dfa699964653b99753485e518ea6", + "amount": "109303520813010" + } + }, + { + "Validator": { + "validator_public_key": "01509254f22690fbe7fb6134be574c4fbdb060dfa699964653b99753485e518ea6", + "amount": "118554941151112" + } + }, + { + "Delegator": { + "delegator_kind": { + "PublicKey": "0197b79d1a1351f8fb922b9f7f556d2bbfdba5105df9eaa6caa07804c703a641ed" + }, + "validator_public_key": "0190664e16a17594ed2d0e3c279c4cf5894e8db0da15e3b91c938562a1caae32ab", + "amount": "8599696498056110" + } + }, + { + "Validator": { + "validator_public_key": "0190664e16a17594ed2d0e3c279c4cf5894e8db0da15e3b91c938562a1caae32ab", + "amount": "9377950843219784" + } + }, + { + "Delegator": { + "delegator_kind": { + "PublicKey": "0197b79d1a1351f8fb922b9f7f556d2bbfdba5105df9eaa6caa07804c703a641ed" + }, + "validator_public_key": "0190664e16a17594ed2d0e3c279c4cf5894e8db0da15e3b91c938562a1caae32ab", + "amount": "285067736921916" + } + }, + { + "Validator": { + "validator_public_key": "0190664e16a17594ed2d0e3c279c4cf5894e8db0da15e3b91c938562a1caae32ab", + "amount": "310701366981535" + } + }, + { + "Delegator": { + "delegator_kind": { + "PublicKey": "01a5a5b7328118681638be3e06c8749609280dba4c9daf9aeb3d3464b8839b018a" + }, + "validator_public_key": "01c867ff3cf1d4e4e68fc00922fdcb740304def196e223091dee62012f444b9eba", + "amount": "5976757455713484" + } + }, + { + "Validator": { + "validator_public_key": "01c867ff3cf1d4e4e68fc00922fdcb740304def196e223091dee62012f444b9eba", + "amount": "6492754998004464" + } + }, + { + "Delegator": { + "delegator_kind": { + "PublicKey": "01a5a5b7328118681638be3e06c8749609280dba4c9daf9aeb3d3464b8839b018a" + }, + "validator_public_key": "01c867ff3cf1d4e4e68fc00922fdcb740304def196e223091dee62012f444b9eba", + "amount": "162277940193805" + } + }, + { + "Validator": { + "validator_public_key": "01c867ff3cf1d4e4e68fc00922fdcb740304def196e223091dee62012f444b9eba", + "amount": "176125500882714" + } + }, + { + "Delegator": { + "delegator_kind": { + "PublicKey": "0106ed45915392c02b37136618372ac8dde8e0e3b8ee6190b2ca6db539b354ede4" + }, + "validator_public_key": "01f58b94526d280881f79744effebc555426190950d5dfdd2f8aaf10ceaec010c6", + "amount": "6111063397723576" + } + }, + { + "Validator": { + "validator_public_key": "01f58b94526d280881f79744effebc555426190950d5dfdd2f8aaf10ceaec010c6", + "amount": "6660504858490961" + } + }, + { + "Delegator": { + "delegator_kind": { + "PublicKey": "0106ed45915392c02b37136618372ac8dde8e0e3b8ee6190b2ca6db539b354ede4" + }, + "validator_public_key": "01f58b94526d280881f79744effebc555426190950d5dfdd2f8aaf10ceaec010c6", + "amount": "183204228041446" + } + }, + { + "Validator": { + "validator_public_key": "01f58b94526d280881f79744effebc555426190950d5dfdd2f8aaf10ceaec010c6", + "amount": "199637730476608" + } + }, + { + "Delegator": { + "delegator_kind": { + "PublicKey": "0184f6d260f4ee6869ddb36affe15456de6ae045278fa2f467bb677561ce0dad55" + }, + "validator_public_key": "01fed662dc7f1f7af43ad785ba07a8cc05b7a96f9ee69613cfde43bc56bec1140b", + "amount": "2170319328593039" + } + }, + { + "Validator": { + "validator_public_key": "01fed662dc7f1f7af43ad785ba07a8cc05b7a96f9ee69613cfde43bc56bec1140b", + "amount": "2366902069827651" + } + }, + { + "Delegator": { + "delegator_kind": { + "PublicKey": "0184f6d260f4ee6869ddb36affe15456de6ae045278fa2f467bb677561ce0dad55" + }, + "validator_public_key": "01fed662dc7f1f7af43ad785ba07a8cc05b7a96f9ee69613cfde43bc56bec1140b", + "amount": "217749920954248" + } + }, + { + "Validator": { + "validator_public_key": "01fed662dc7f1f7af43ad785ba07a8cc05b7a96f9ee69613cfde43bc56bec1140b", + "amount": "237377113583604" + } + } + ] + } +} diff --git a/src/tests/data/era/index.ts b/src/tests/data/era/index.ts index 5ef96518..531821e7 100644 --- a/src/tests/data/era/index.ts +++ b/src/tests/data/era/index.ts @@ -1,4 +1,5 @@ import eraSummaryJson from './era_summary_example.json'; import eraSummaryV2DelegatorKindJson from './era_summary_v2_delegator_kind_purse.json'; +import eraInfoResultJson from './era_info_result.json'; -export { eraSummaryJson, eraSummaryV2DelegatorKindJson }; +export { eraSummaryJson, eraSummaryV2DelegatorKindJson, eraInfoResultJson }; diff --git a/src/tests/data/rpc_response/index.ts b/src/tests/data/rpc_response/index.ts index 113daddd..ed3516a4 100644 --- a/src/tests/data/rpc_response/index.ts +++ b/src/tests/data/rpc_response/index.ts @@ -1,5 +1,13 @@ import getStatusJson from './get_status.json'; import getBlockByHashJson from './get_block_by_hash.json'; import infoGetTransactionResultV1Json from './info_get_transaction_result_v1.json'; +import stateItemResultV1Json from './state_item_result_v1.json'; +import stateItemResultV2Json from './state_item_result_v2.json'; -export { getStatusJson, getBlockByHashJson, infoGetTransactionResultV1Json }; +export { + getStatusJson, + getBlockByHashJson, + infoGetTransactionResultV1Json, + stateItemResultV1Json, + stateItemResultV2Json +}; diff --git a/src/tests/data/rpc_response/state_item_result_v1.json b/src/tests/data/rpc_response/state_item_result_v1.json new file mode 100644 index 00000000..5fe952d5 --- /dev/null +++ b/src/tests/data/rpc_response/state_item_result_v1.json @@ -0,0 +1,330 @@ +{ + "api_version": "1.5.8", + "stored_value": { + "Contract": { + "contract_package_hash": "contract-package-3cb7d7849ebbd75b08d1883cc2642f846317fc5d86d5327c1102aff4ed9e1482", + "contract_wasm_hash": "contract-wasm-d6b75849a227fcface4dc0a7be92f2efd23254491b807d57ce7f3870d35e8ba4", + "named_keys": [ + { + "name": "allowances", + "key": "uref-a219b99ba605a5847b891ae0aea4932f9e7ba273071b302e6c91549580389369-007" + }, + { + "name": "balances", + "key": "uref-6ce84191c0f0ade8f3673b3a184b13cf1f387764de0794d5c5b3595909a70ce5-007" + }, + { + "name": "meta", + "key": "uref-4ecd21deb6003a419c1777d2052619c9bb39c0370be073ff2ec0c7ec88ee1a82-007" + }, + { + "name": "metadata", + "key": "uref-b5eae6f97e0f57d2d8bf7e321cfc6e8a68ad3ef178459c29dc6bddd5702caee3-007" + }, + { + "name": "name", + "key": "uref-cace633b4e8c2caeca70ab709afe9d8553ad3a08a2115a105f72637d05fc4588-007" + }, + { + "name": "owned_indexes_by_token", + "key": "uref-a1c7f5fddf0a23770df048bf2903c6af4ff82baf5b84848a7cddb91efa112c20-007" + }, + { + "name": "owned_tokens_by_index", + "key": "uref-447e6b00efa7151b58c5f804bc07840580dc31fce6ed7ca175a4ea6bdc4f6a61-007" + }, + { + "name": "owners", + "key": "uref-e286a9828a178aa1f3644598e2db5bf9debda52df26da7fa853ab6bf6e6aebac-007" + }, + { + "name": "symbol", + "key": "uref-fa1439b6001b409921e2fe6ad6f93c0cd3985ec4fffb45f0f437de239c7bb570-007" + }, + { + "name": "total_supply", + "key": "uref-19afa6c24cb2b32dccc2a56b4d2e943d1ce95ea2b478b3a7544c98d464a660c7-007" + } + ], + "entry_points": [ + { + "name": "approve", + "args": [ + { + "name": "spender", + "cl_type": "Key" + }, + { + "name": "token_ids", + "cl_type": { + "List": "U256" + } + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "balance_of", + "args": [ + { + "name": "owner", + "cl_type": "Key" + } + ], + "ret": "U256", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "burn", + "args": [ + { + "name": "owner", + "cl_type": "Key" + }, + { + "name": "token_ids", + "cl_type": { + "List": "U256" + } + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "constructor", + "args": [ + { + "name": "name", + "cl_type": "String" + }, + { + "name": "symbol", + "cl_type": "String" + }, + { + "name": "meta", + "cl_type": { + "Map": { + "key": "String", + "value": "String" + } + } + } + ], + "ret": "Unit", + "access": { + "Groups": [ + "constructor" + ] + }, + "entry_point_type": "Contract" + }, + { + "name": "get_approved", + "args": [ + { + "name": "owner", + "cl_type": "Key" + }, + { + "name": "token_id", + "cl_type": "U256" + } + ], + "ret": { + "Option": "Key" + }, + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "get_token_by_index", + "args": [ + { + "name": "owner", + "cl_type": "Key" + }, + { + "name": "index", + "cl_type": "U256" + } + ], + "ret": { + "Option": "U256" + }, + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "meta", + "args": [], + "ret": { + "Map": { + "key": "String", + "value": "String" + } + }, + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "mint", + "args": [ + { + "name": "recipient", + "cl_type": "Key" + }, + { + "name": "token_ids", + "cl_type": { + "List": "U256" + } + }, + { + "name": "token_metas", + "cl_type": { + "List": { + "Map": { + "key": "String", + "value": "String" + } + } + } + } + ], + "ret": "Unit", + "access": { + "Groups": [ + "admin" + ] + }, + "entry_point_type": "Contract" + }, + { + "name": "name", + "args": [], + "ret": "String", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "owner_of", + "args": [ + { + "name": "token_id", + "cl_type": "U256" + } + ], + "ret": { + "Option": "Key" + }, + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "symbol", + "args": [], + "ret": "String", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "token_meta", + "args": [ + { + "name": "token_id", + "cl_type": "U256" + } + ], + "ret": { + "Map": { + "key": "String", + "value": "String" + } + }, + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "total_supply", + "args": [], + "ret": "U256", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "transfer", + "args": [ + { + "name": "recipient", + "cl_type": "Key" + }, + { + "name": "token_ids", + "cl_type": { + "List": "U256" + } + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "transfer_from", + "args": [ + { + "name": "sender", + "cl_type": "Key" + }, + { + "name": "recipient", + "cl_type": "Key" + }, + { + "name": "token_ids", + "cl_type": { + "List": "U256" + } + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "update_token_meta", + "args": [ + { + "name": "token_id", + "cl_type": "U256" + }, + { + "name": "token_meta", + "cl_type": { + "Map": { + "key": "String", + "value": "String" + } + } + } + ], + "ret": "Unit", + "access": { + "Groups": [ + "admin" + ] + }, + "entry_point_type": "Contract" + } + ], + "protocol_version": "1.4.8" + } + }, + "merkle_proof": "0100000001a37f861cad9bb577d6062512b85695083579056bfcb3c5db56650cc7687e7f17033cb7d7849ebbd75b08d1883cc2642f846317fc5d86d5327c1102aff4ed9e1482d6b75849a227fcface4dc0a7be92f2efd23254491b807d57ce7f3870d35e8ba40a0000000a000000616c6c6f77616e63657302a219b99ba605a5847b891ae0aea4932f9e7ba273071b302e6c91549580389369070800000062616c616e636573026ce84191c0f0ade8f3673b3a184b13cf1f387764de0794d5c5b3595909a70ce507040000006d657461024ecd21deb6003a419c1777d2052619c9bb39c0370be073ff2ec0c7ec88ee1a8207080000006d6574616461746102b5eae6f97e0f57d2d8bf7e321cfc6e8a68ad3ef178459c29dc6bddd5702caee307040000006e616d6502cace633b4e8c2caeca70ab709afe9d8553ad3a08a2115a105f72637d05fc458807160000006f776e65645f696e64657865735f62795f746f6b656e02a1c7f5fddf0a23770df048bf2903c6af4ff82baf5b84848a7cddb91efa112c2007150000006f776e65645f746f6b656e735f62795f696e64657802447e6b00efa7151b58c5f804bc07840580dc31fce6ed7ca175a4ea6bdc4f6a6107060000006f776e65727302e286a9828a178aa1f3644598e2db5bf9debda52df26da7fa853ab6bf6e6aebac070600000073796d626f6c02fa1439b6001b409921e2fe6ad6f93c0cd3985ec4fffb45f0f437de239c7bb570070c000000746f74616c5f737570706c790219afa6c24cb2b32dccc2a56b4d2e943d1ce95ea2b478b3a7544c98d464a660c7071000000007000000617070726f766507000000617070726f766502000000070000007370656e6465720b09000000746f6b656e5f6964730e070901010a00000062616c616e63655f6f660a00000062616c616e63655f6f6601000000050000006f776e65720b070101040000006275726e040000006275726e02000000050000006f776e65720b09000000746f6b656e5f6964730e070901010b000000636f6e7374727563746f720b000000636f6e7374727563746f7203000000040000006e616d650a0600000073796d626f6c0a040000006d657461110a0a0902010000000b000000636f6e7374727563746f72010c0000006765745f617070726f7665640c0000006765745f617070726f76656402000000050000006f776e65720b08000000746f6b656e5f6964070d0b0101120000006765745f746f6b656e5f62795f696e646578120000006765745f746f6b656e5f62795f696e64657802000000050000006f776e65720b05000000696e646578070d070101040000006d657461040000006d65746100000000110a0a0101040000006d696e74040000006d696e740300000009000000726563697069656e740b09000000746f6b656e5f6964730e070b000000746f6b656e5f6d657461730e110a0a0902010000000500000061646d696e01040000006e616d65040000006e616d65000000000a0101080000006f776e65725f6f66080000006f776e65725f6f660100000008000000746f6b656e5f6964070d0b01010600000073796d626f6c0600000073796d626f6c000000000a01010a000000746f6b656e5f6d6574610a000000746f6b656e5f6d6574610100000008000000746f6b656e5f696407110a0a01010c000000746f74616c5f737570706c790c000000746f74616c5f737570706c7900000000070101080000007472616e73666572080000007472616e736665720200000009000000726563697069656e740b09000000746f6b656e5f6964730e070901010d0000007472616e736665725f66726f6d0d0000007472616e736665725f66726f6d030000000600000073656e6465720b09000000726563697069656e740b09000000746f6b656e5f6964730e07090101110000007570646174655f746f6b656e5f6d657461110000007570646174655f746f6b656e5f6d6574610200000008000000746f6b656e5f6964070a000000746f6b656e5f6d657461110a0a0902010000000500000061646d696e0101000000040000000800000004000000008601000000f4004863006d1fb477a9b16240bbd5bb03c6162b5819258b4662359eded1bc5d5f44007f8900000000004192277e4d8c68945e5c983888b85fee93a1ce89bc1b69d1e4fb6ae564d8b3b50100998c0b6e3e7a9e9fed46ce6ce2299bdf23753ff5bdd1fada0d0459e041010a1c02016202757436e8cddcd31a300fd715404ebf7c4674f54c361438c9d96a844c3ef60400d2404788d2aae62ce178ab2434d88e68a20c45a78ad1be6111d3671f4eeacc75060046638a40272bfe620571c229562deeb0360768d0a86ca431d4466caf92b618a40701fdb433affcb65be1ed785fabac716b44a8b1df0e5c9c13f38cea29d72360e92a0b00732901c0e9fac5c3f135e11b75ab807e53187bdf1cb2d82b42692e89bc44ff7f0e0084f4cdbc15a53b8ff12fe41c232f0daad5f26475ff2569035b33fbf4d4bae84611019b74ef3f20897547f3aa5cc6fc80c15cf767a77b92d9aad94adfb1ca6be6335b12003e80882d499bf57717c4ea7d419f29beae14d669873b29ce3ab5e141e00315cd15016345dee471863f55fe27d5383dd90360e502907ec1f861c7bfe814d8492bceb8160075cd99cbc1dd1fa94068f7e7642f11cebba7c7a61614b368f920182de472382518000c1247a538ce596db0d978dc98ac1c0217ae68e33c564dc94161f7cb19f2912419001d37ad153fba4e7a814a117b223ba0d55af05cae280ce22748de61b827edc4221a01403826b6ae236d8f44e9fe7bcdcc8a5bb1089027dc32d98ed5d38ed89a19c05f1c000d69792ea404bdd0e2f877d32361128025830452ffb7100e2ed486110058b3191e011aef3ea17823e6e213514595d2c9128a202eb9775f3388a886dd7e175b20627e2200238a15cfc32c238b13c98abd3116f06e69ec06621d68ba901249ec2849deb6e22700d40aca9088e16d13d36e748ac6b84d0bbf3489362750165b0e42b20dd07cfba9280056546edfec196ee4a3dcde3c0275625024c0b72dbec79b2b62e00718967389e72a00797568c0351b345c02d7f14d2c6459d22e3c08072cccc5eb954cb29bb4d44e5c2b0002c75ae3fe3509a6b5431f2083410e3dba4159d1b7aafde54a9191248d2937fa2c01649220279612ff075611b7366bf048def80ae4afddf89c9d7eef2aafc95155442d00d4704938d9c6012a0b5f8a0be677805ac03f2e619e8a3b5a0f71d12a02c81e053200ca9365281e77f1aa06415c402c95df467fc1f7aba90704e281146072a0dc395136003b99fcf503c645c0f54374f221fd0e97bfdd193c61e7a255aad1e85a4ef4e0e33800c05f90d7aec30351c10fa3cb9aa14d19711adf02625e8e695d27d2fc08582cff390143580ad46085b2034fbeaa128560d92dab0bf7b15a28f44e0af52e0b15b7b3c93c00be2d5f45a330005a5c53a5d09d69cddee9380cf5c8f80e64f969d40c263b266e3d001fbf0d8032448d8a4dfa0dbab6179edbf531488ec53c637ab38cbc44124aa9ab3e016fa083e2df88fa8404150107d2bbe79e0ecf6c5997d9a4ae2afda6898ce740d04100f18a6a0ae7afa21d818bb0bb770f813b6afb8000198246b3dc9d218e22c6468442003cf6f7b89e48be2f1db14d1573ef060189489008d4339d6f08ffcb5b78f238c94301d6f015fc6eec95dc0cf05c3d53f95431e6884caa5af56e99e54bb4f1d02130564600be267e7c5d7f4e344babae507e45b8f426bbf1db2615aded9c7acf083b69cafa480164f748b5dc32b7dc30918b17327723ae7f41a8383a01fc466ff73c39c9c9326d4c0030f2f15767eb2f4ef0630966a4bf90392f0c3814778112a8dd0cc063315a6dcb4d00e9982fe7905f1728a7fb37073fe079b2acba5f1b49a68bb6b6ade76cffa3d7564e003cbfe69a2dd11433e52a6c611498a4d22773cf48f2f916f9ce4afc45936a71be4f0080d2cefb917cedf96d2a76c97af6e67f4fe1d98f8a20ec932e4b51442f9daa96550070c258fd3b825cac5e7f18f43c60e6c306938009c65cf3f61a1fd2e6fb89f09a56000bc12907fe59f02104b25abc1025653fa1556bf8234692a4f7a7938c141789de570033c652aba07f2795ed93a4c28c0140276663d215e8c361ca2712d260221e8cf65c019377031259b93e256ae25a9a96fcd94301b67b4bf6872f414a3144adc62674655d00e05529a841ddf766ef8e53edff1d67e74dd88e8c896665c7e5f290d50746f0e15e00bc6325c352dc590c12c473a008a6c9acdb5503bd5cdd380739de33b7887a1f7c5f005b56360911e91e7e215ee8db0289bafa69cb6e82bdb05c672c916df0210881476001ebd272ef56901f5ca1b0b205f18aa86d2ebd9ce1d219877990e37b5fde24e27a6201537dc662443bcc49267ca8f4c81f22a33759b6bb9e99a636a278839a74c83c706300952a501a4cc93a0e7531b0df3e0ee5fa6cff85acdae0051ce99d0afac6126f2d640055d3c78b53a4fbeb7225e150b597ca8d447bf82b132bbe3c394cdcc4bdc45f876500d884a2249553ca601b0876e06ce7da4a05279f415a5aa7aef68641e57b125f1a6600411fe7b53639c4e94cc2f4f4e6bc9b167e517c8b57b5625d96a9799c12bbf58b690097115c7ac84cb7157724348bce5a664e0198761fb8f783d6338c2ada7619decd6a00a9cf665e63ce56a0444f50adfb879e76b13a9e710e9512858d19de160ead6def6b014f2c02c2c2d31a7a6adc8365eeda53c683e13991bd213f7b74664546588ec6636d007586c946fe30ed0e73f3f205857b1b13e4c506736d2499af0ab02705efc017856e0025a0d6fc8dc62dc5ff62adacd21a447d2ccaa32842eee327c32794f7ea268df36f01b4251c17fe8748fc3ae0631d5404be549fadfdeb31118c9c47fe748a3275533672004ecc95f796aecccd8bf40fb22d2909fd08bc4cbd73a3d39c72797f78c0b10735730179160e34f3464a059b1699c2f20345fdb89b37b24800b08b654590401f8485d074014a8df11bc0d8b28e83cabd045ea588dd37ff3b5edbeb8db8b5f9a808daa2e4d776011b288a06a3ef4444b1d458a98e37c4339ea6e1e6af46eb8eab337a58e4fefd8e7700d15a4f425530fbeae8cf22d5ac1e5f180b224720caae8b75ff0c796ac98e57c278015b56db72e8d0b3f4e4543e815603fbbcbacc3865c68853c9ae7b5103c98695a97a00a680fe6495c4c4fbba49b9766e25b265407cef8f03cd204e0576ab38295368717c007ae55e66b2d42c10c24fbf241c6d906f33c723c3fa5e28c4b6e0d72f69dfc2337d0025b2ea0e28a410ef4bb0273a1a92e71afaedeed09fb96f3f5d946e7616b5d6687e0157e91d2c580f1312052082d5af94be21e056c1717a3fcad311ee59854f709c4a8100bef2626385608b4cf45d74b94e902287751e4b973df206f91109d78d501fcdeb84005110d6ebc3cf1c4326c93ac3d8a040fe4b00588a3318790161501bfeec36042887002d381722b7b16028524b0c855cf741118ae76ad900f98a0ba93dad11f0b608218b000235fea47ed26d6df3ef4ea48ff4ead0406630961dd27d512800412de00fc9d58e0086bbc116d0a49a16b152c79375434a281731180cf37967c3d7f7ff1d5c522b048f0077a5f23c5f85c2677d270fb72c6946f7b6c8dee898abaf7a35af9f6b08e8f319910075711ebfa41bad3080e9a3203c62a6d876fb8cb97192771edf57005ff85e20729200955814d44e46e818734cfc0d205c1f2823db5be35f3c4555332758e98331a3209300cf52ff5fbec191546d60dff2c49370fa6fd0d79ad70c7f942b4034467b7a615c94003635eee718fdcc938176be4962c348ff1086a3447ebc8ebb78343cf93ceb123b9600083aac3952edfbd7543246125fbf8869e0d135da360e404f65498c7e87845e059701b2bcbc674eb9d26c1d1e759029b9ddfceec5a2c9fdcbd95a14e91a94f49b172b9a0006ecfa373f335362aac8f125523b1ad2bfe1cf03746c2550381af73e4557bc4a9c0188e0310281cab94a24837377de3c7c393ef9c60480fe969934cf0c7aebab89bd9d01e7c1e64b2aa216573f7bb7a7ad4958570007917ba4b2390ba0065931b2c982da9f01dd1c4ba4b47bfb356bac801f6ea3c2f6adfff1668d762918031e1b9a9a7bd866a1007abd911041b042ef8a8e1ecdd0d3420de6faca0e29ca70d9fb3d1e92b3ba8a6ba30195cca20694590c78dbe0e41d9897facd6d43fb5afd8bf05bd788d63e34c07a20a400a515346a805420d98eea32932253f69a18f4998ede82358bd46c85d9001b899da5017976919df6d7604c1456f92ad7fea48010b84688bf6a7ca067e4b5b43d756d3fae01dda5aea1aba58dad5163d9a7fde70135fdee775dee0d41b653790b7395a4a952b201daed04b9d2b63af7e7abcdefcb460b4918559a5a2fc63bae3264cb94215babe8b300220d015d0cf57f9f2300c6f921767679839f43d4ff08f0fb36db7cda071b8dbbb4016a18db952ea3933923f2b5b6a1498ca57627d4267c0f70351b4376e913e36b5eb700923eb266b6e4fef658192e873eb0f61c16337b482901f2698b958e661c7a5c76b8017aa17ccb775efdc92f86b6ac2cfe1baba79e7ee78c9a0a38b8e8c0e0c708e053bb01f8f9919d5f5db2e4d0aa1e448fae020456b6df9ea8ae70fce8fb5ae32b834a74bc012c5cc26771e37f6ee9ccfd72e19b38c6bab3875cfb34e36749d70cd89ace77d4be00717f4743b2f6bf2597c3459cbe5aeb5e114eb526098f5f218cd1c51041a533aebf00b30944605ea324477777f712bb82d5bab023d90f8c1475cb3e3590ce0c72e89fc00007d752e924aab50d48a6b07a621088fb0c6a0a44b10e490c247ddb4eb15e7e5fc101a1aa316dcd113a8a2a25e80e28262d79c0b13b396a3d29cdd7f6b7257f2c239ec301684aa3acd22ba95335ceb0efd3f1e3c6f322ddd291622145fd90c95a400239edc401fed888ee310372876d336a35df6f16e141d09ef5377a69ca59ce15629b3e8533c5006cff48cc074e74dfd84edf6441204ea76b9fbca027dc04cd939ad8872972a26ac9011d2437d4891c6e873182852625088a2c9ab03294397ecfd51e5a89326cbc55f6ca0157adb17fd0eab7e7823b137afcc0d4522ce8b28f6e67dd2e8578c33765f127eccb00e11cbd58ad6932fc8e5e2b0d86caef927377e8bd5dd283b96b068ec2eeba7d04cc0082dc7b352d2dfb882cde8b730239ad68e0e54987ecfe0f58a14f5cdca3d1ec34ce001d5fc4c69015febea73f12dea2e824951bc879e1b021f6426547f876662874e3d0002fbc94776ee5b93fde86432bae3487a00598c195ca5d549bff0411edcbdb126ed101f66b1b0c7e566061d3f0104a23c5252cff2579116180bccdadbdda78fe3c2efcd201eeecf61719f46563af149d66d214faca129a5fd78ef3f7ef4bae7a6c655f19e0d301e6838db6bf49036e139316bdeb6e2da63aa4897a6689df860c714550bde141f2d4001a6bc62cdbf3e959a19b049b21fb0f83b006a0fc6c5dceced4729c54a59e2508d800958fe2a45f05f97c8bb1e5b70c35dd105c1bf99e196938168ce75159c617c5b4dc0090f2a1faf8f6302e5d5236ab102eb9b6e66f53e88f8d4bb45fd5af447d03ea1fde006cbea9a33b2affad5ad9b59c6f7fe4103fc95b0dae63f83d8268b0815ef291f2df0086917165ce99306e031f49deec9ca0e950fc91e55a2aa8eeddb15f30f4b95e11e000e4e0569b35af84a7f8f932a0f76a3a1254015bcf8b148f557ac6427e29b26f6de100a7f386848c58cabbbe6c2c1f887a567fd2f9e16aee1976a6b703986dd2d68c85e2009b56865b2300eeb46e32b438bd2a7efb9fd440fa93fc6a5f294ee39408d883f3e3017ba3fe143681da5dcfe4c1c3d08c55c4810a76496189253fde77952dd81fed53e5004fdcfa351552f12c0dc2d4ae9f32695a994ee3445e32087efff8a43468c97088e701a08f665de7802164cf2b83024fce92826f3abba82e83ef40d5491b4943d464e9e800ecf9c04b0a4ae1219ce7bed80994af9dbfe177c8274ded767a1e0bc65371e375ea00e63b10f9f9ad3a60071dac91c80ea9c0ff890964bc04d12b7ffda5cf12a01f9beb013bba32f7bb244457d05438929013c8c3087e2bbee77ff8d0b7dec66997d2b7ffed01795ea5a9275e2dc576369405d96c564f4743539355ebe4e5a66cc93e47b5550bee0018608f7f90c82a1aa631f527ac1a4477fc3b0eff1fe24e4e296c32cd23608ffaef00907d717ed5c3cf9c9bb584759f997340f36283846563a46c1552e9e80f6c8b74f1004b1ce3c5e9bdc0a05f2db854d5f47e33d0d21d28f52454782e80e6ffad3487a7f2002e68adde3b0bf4d4f2824b80d5cbbed3e76ca74069e69ace369407c1d002ddb6f301b0512ab17692d05d1b770f0b827cc481184968bbe85f57298f19b4a548615b8ef5006466dab900d6895f757672051bbcec1fac03581fe7dd409f8be7cfb64daf3aaaf900fde3b00c5e003e5f2a98b152245cbca16a5c51831de79d3a33613580b7c8a2f4fc00255ffd77505decf381d5153cd9fb8f89f4f960465a9a061883e7d4636c93eb67fe00328c68f50a94770c2308820a034d8d1b8c8cc7c75d7a1dc745d5d349d8a5d8f900a3ff000000000164ff14779904815c0d41c668cdea27344f8608b3cf6eaaa246c4e02debcd35c90101e84083e6824c8c673f67a99701a4b66dc3254682500a1bbb2d0a94bcc695a34d02019946f276a0db4f68359070476a703e144b604995a36dea0f92ae003ee35a212603018d40c6df10eb44b7e7005fc2504e9de898db225aec8eae8a0504404593191827040104073d1abb3b9a0aa0f2f16c51c062763eecf0bf13bb16f20d9ff231c939a7270501659cc4cb599e2e6d3557f3d3a5ec65ca2195460f8425153fabb0c191575e955d0601b66067acba64e02f5ababf39765bb33f6ec9697c68a2508f01a333487bbb17ff070136cb58a0b600881163cbc3532507bffe1099ce11f2f1df855dc1f646631dba19080113802ad34be0637453f5e45bc071e34c05c4d5289c878d9760e6c94defad8fc20901af435a3f22a9a1a284d5353786e3686c792f696523fbe04dcabaf949777b759b0a01816239869959e2ec1eceb3a3175b57ee6b071d83097575cd3fb863575dd2406d0b01d2c1e8a92be5fbaab84ab5e27989d4c9527c31a3b58f80dcc12271f05c423ea20c013207f2243ea47eda300bd700c68ced2be976e3b86106b2c7ce17ae9363e27fc40d0132e6e108ec88cd68a31268bad78431de94dcbbdcd29e6689c14dc643b030226b0e017384a252ec395cb738904c65c2ab85029baa8524772b5d65b08a300f9233d5640f0157ee077f6adf998ef8b6826a2fbac781e14412b01bf9bf4d97bd6f78287e0d751001436bf4857acce505cedf7339a3b182921848e58f21e02ee315ab7444d7061b8011017920219c642406539c682616d81555a08c69d04190a6a51f89756600ecec40c11201ac185f83c5d93753a6a6a7d281d7c893da8b4eaa035ed9064cab149f3d8c99ad130143a900e840a69936e93b8e5c72afe0ef603b03c57a99695564fb1f3306d79f711401c2d9610507652e01b6d4448fe8b69768464c8f794d08e6729f4e7f9dfcac534215015040ee337624d67fb9b29def12257b2dda19dea4ffb690dfa385c39fb11e8c7e16016c00681c6ea9a0b7f973e2b59070ee9b8a6da47cb2735f3d6ea8afe063d57aa71701d83c600cd1ba7cfa869911ba5a4a8499e6396abcc6712bb5f5e540c386b428541801626afe87d1bc2be915e3b65b591a6ba0d0a5a4d86f7ea5e0abb822fd7f1ed6f319019ee04d594b76013747a05c18ac8da1eee2f3294a476928b22aa8e1e7f857de8e1a019dc0e571d3dc9a633a9bfd17d0f551c47858b5ca8499a46cd266007496cafd981b01d94cb043bb48903ac8277dbd759ace7ee1964225ecc10c79760122bce3f575f91c016602183c56d1db444dccac77b5451932cb970d5338852ace93fad868a144ce271d01468f806ded1d01cf6ec8b81b1d623206053b75f804001c83b273e9b5be5688b71e01e89839c53e9d667ca78a0100cac7820103f6330febbf3d421f04a181336e46481f01bb11842dbe65220df8ce915b96e39a8d7f9708e6c27c455a10965f22e553ae4820014f6d9db19d64b06fbe08277d2dc34de8280feaeac5d8fb249c3e3d5886bd8da3210178f328c318b146ee8cadf6c8c0a187bf6fc6bc956651d076c06c88067a3d98692201f2821b15125088e0aefc91933e7e7b29b2a11866ad81454f6556a14b617be1822301e073590086ea0a3c1a86aa773e0f3c17d7d5e3daead813e8dea662cb614ab6c924019dcdf86b7a78fd0ce185d693411df2c443058d60b832a758ff91e2bb1a30759a2501e324db5dd60c86b5c6a3823415a9524f50396af75afd42ac2e985c0f5eeec73226014061a8a0198ef858abcd94118e9d7b599ddd497955bcf19e27c1ed40cd45fe2c2701aa7e8f11ede43cb69495b83d8d36bbdb8edce8ccd91a894beecd071a24b0ad742801eec80967105767cf6cceb44cab46c61ad37abe53537b93df72a7beee085dc6ef2901f76cfbb615f9df181b6a8cbbf08f13256a549488e9f5cfcd4d5507e866e321352a015d5231d9916b8abd2b5342b06d0e50d978ec124ce0f0d77498a1e23c92e7bb762b01d49d0803aab70f5c2f41ed4266a77c4064101bb7e20a7caa6fa82f4365fdf14b2c01c2adbfc1fee8f2cac3c1653b5eac41fcef01ec8a4bde109d33dfc36dd139db882d01f4ef7b6f53ac534421e6da784239d951e92e7d334e786c6dee66d5b7d89b213a2e0186298373b63abe2100e829309e76b8631b88ea0bc0df3a178e00450f8260726c2f018cb2fdac807e5ed24973053de418d79fdd2412938dc41957109ec36c6866cfbd3001088848a975971b308c77345b3f34f33af6d2538d3b445dd6a2689038c4dfac8c31016f5bb353abe7968df15a72c3d4e020522478cd0079d448fdc45fa21e2a1cf2483201650349ac295ca50e32b4de990ca3492e6169cb72ff5daf4a14780e7d06bd509c33015c53ad2403243d06d037c8d8c20bd8972ff6b705ee09c933637349f53855e3e73401fda3d95e334a55854e9d45b97d83e69b9cb8d1a82498f52c4f0287b4250f777035014341c96999e996077e6cd9bfc4d086696b1041002e05545f88c6a045b08706043601f412be8de6007ec7b1868c9f1236204fd3dd9c3884277f389c512b5b3eeff34c370153f4826a5b9b813d6f337c7f610a30459974216b189735c219832d4d53287f3038018b8dfd260da9c98a7fdd7103e0670e8d386f2d6a027766f141bac7fef3a3999b3901674bf7c10980be6e5242ca9b99f6329cea03b5b69503ee658af0de09037912263a0163e21006d23060af27ef0e0bdd8771e913d897e3c435e395197944e65b175f2f3b0171cb4d3cc1c1d14e0f0cd1f0a6a6d628ff976c4aa391262c671b16e6e3ed327f3c01da07e3e69df8a981745a47c74baa3129770d42604ac68662a6018b11df7c17f43d0176ca9b427cb0485279dbf4bafacfa7ed6dcef2f5e6714cd6169c55c99460dce33e011ac0ee9c7b6353a8d3a12e90163e7a3b8e964ec4feb7024cd70470bf8f5894e43f01da40de61b53658863abf807563cdc436e5907061ecd132d6e51a51876779f13d4001355a7360d3efc2a62487e34869ea89f5bddf2a0eb597ea69a2c7ca46e63b650d4101bcb273d0f3b43989dc25563579144afd34d0bc38738d7f9c0a7bf5f51bb136924201b383cb15d2c126ac5b9ae83dede0c75493827e004d8f375b035834a2264435844301e980ee10f09e463b3a9634f48e7068fccc73e62dfc3531bf65e973decbf0d257440139344d4312c21ab38040c70108c7b877b59b5e45efac250cec8279fac84baf984501a924e2a37ac1e36edc1889c5b7e4f07dc6d0e7247b5e59af7fb87c00dc67a9c346019fa27e7a8dd89415b6223f7b0887a211e804b042be83847fece493af65626d1747012da3ca46ce6cbe003fdeafc7cc2936c77db9c05bc4989ce5897c1c5983d4e0244801a25842dee9c1f0a7d373ab2f4b57d6707c9d231b7adba8543c5eb322e8cdbc9f4901597b57731099c9c29f168b5f89725e90f14cfedca15b87c0922e400575fbcde54a019ac5446b18a0b2348f873e710c83478934666360c8e5bb0816a79aadc519f1a64b01f2f7cc6584cf57b76299ce35fdb029207bee9a52f06e5c29f0b934e8f205814d4c0144fa7be0b15f9c9961b404ac0834fd8ffc705d497d70328e96a4d6ccd5e711764d0132feee418b5748adf70905698b23204d47c04648f78d6774f3588b02427a2ed94e01d2a8955b10f4fef1788849698e70f454beca93055fd06aa636d4bfabca98c5db4f01ec40f5d672e64b996ac7177c8ebd9e8218a63114d2ce58127c3c8662b20edb0550018eee6f0e8908bdec5dd2bd00abecd70c1774298cee330214df254c1359a75aca5101a056ec2be1bc715177a2a09e2594de55b230b89be77cf23f27cab8fe959e53b452018473948205926e7eba32308be1062a892e008302398d8954aeb6305b6382f6d95301d9bb22aaae42336791fef518d24062a3a6ab1827eabe004dfdf5a7b468c3bc475401841cf0a88e62dbd1b7aa0f3edde8e219c0c5a7f89dff9513755aecf2b449736255017f4ca8495a34a3f936f961c01cd8a88df165995f399fad0ad075a4558c70c7e756011867d233837d1ad6bd53c3c8fa777b5c501faef6aa258a8f72c02d730a6317ee5701ea77975d6ff44a29ca387fbf362bb36b40ae55752e1e5a2932530d366c7e56b45801f0538a5658cdfb53efc020a16aa500c6272c337ed25c5ea6d0f0f4d7d35520055901483cce2a4dd7f2fc4a4b3ef3222d0e4affcc5ee97b3f2567751e92b7ac64b2125a013358bc5ef0d2527d6eeafce09e734744c68216441ddc73d15d669235f4784dec5b010c5dca284402819aadd8f2fd9a51eda488370f922e65c2ed02d2cc9e968a6c0b5c013b15a5abaa3a13aad4c68495122f07aabc9a1b4f0a37091e7acbfed95a7b6e4d5d01eebc229048870366663778a6feccfd1b808bf4e5e9eb054baf7bda9b614ec9a15e01b69ef2e9651fc59e2ef1836387537658c0605fd6273345f222cb0ce806a30c075f01acd562f4d5bb51d1835399768d18b153f822b158435aee40ad528e0e84cc055760011560d847e5368c99221d4e5d04c23159b5c02115be5a1be0d8eb8ac57d556dce6101fdd662901f2913d4d56ce9518fbd0a8a24da81453768705559c1a07bf791154d6201ca825971d5da78476037d0c7636edd2f8451bdfa5108ffce4f21b3b7d67f508563011618959a15a0034a9ab19952decae230c5caa2b8829c6eeb9b6d8b5fbcd92a47640142b923c0cd9797d50849fc0c4c447cb468e54c504aa9ee870256101b4b53d8b565015de4df05e837740755a1894d0e12eaf8cea7b186917cf130d8992000d1324a6166014eed4d5cb840c1dbe870751d66addd8d2ffcddba28ac68d266cdc4a6094975286701edefc5e1d79ce740dae56b721606cf89c63fdacb4b1adff360c5b74b127c6c416801cff956a53527d74c0a5c0593c539be3feb1998ef4860bce4f11db103186cd1f369013c0876fdf86f849ee005bf036a18bf71cc643905a4c5061ee9b01a21d464c4446a019e14b41eec38d202aa1608c4efc8742d7f523b032df50736b5a2eee665cebfd46b0103b38e9da154bd1dffa36f27e6ee64539aa80a3cb124b65a22e840d9a24b48d86c01cd1c70e036ab8f0c6b5a0fea13b1e45196272eab3be90213d5d84c4299351b096d01d3bf4fd37967ae4352ee8f333f4e607637c7adc79597b454d3739192813be96d6e012a9cb77b28b98160fc5673f7794f3074fbc4f984cb885a6ce41921b6eae29f256f015102c99b60c74c936ea9c161c066ffe37119de52a0631b05d9f84cd528ff2b9670011f736fa34f409f8826d458d5135a05761067f24b6c3dd241c63250e849586d877101001fef059df99b02db8e38d906b9e3b6f19729e3f8b528e6cae8a581fb1f8abd7201f2bd39fb879582445422ab9aeded21a0b8336e810331160aa80cac9bf451ead57301b51e468eec3fa0b7fd2fe21715a55a581d27ee04e135deb95b4f6fffea6d328074012a28be421b101101d988ba2fba76b19fe86d517e340cf3e4b0e8e85a73b740177501b8645606450f888208602ac670aa29b196e5ec8eaadd5254c4dd509a8fb4d72176012cf423890ad0b729326afdb5699e0e49fd7965f8f1bd774144a5024c4d3c71d7770115cbfa20781cd8f77e181cd9f22f5da5a64cc1118a2c38d96b5f12a7a9a0cb347801f773b84389c1663e52573e942a159531950d0bfc339d8fdd83bb118304bbc45179013cf60a77f2a1cbe50232e9610b75c2030f05b19607c20511f51468cd3ff30c827a01a9a24496d9c5f32a0082ae9de08cb7ea9afee565ff9f04c8bea1c76dc24c81d97b01a46c23b41d78c60f69ae672cb98f5557df146ecc18de29763bcdb46fae936b8a7c0119a0d4159341148d3b1240c2e3eec1d0eede715796118518b0e4c18722389bbb7d01ebb002231d1b7ae2351df3311ff3fd9190f75d9b426989cb4dc74bcecf2c52c17e01d7935faf97269ac6bf7dc44d9a47160c78d838381802e55513cbebd4c65290b77f0168b9146f078a953024e342f7a43cf2b4c6e2420ba239b7e2fc84f3915544b1748001c9dc50703c058fad76010f9e4fdfd4ead5afe14a20fc20473b890b549a40e2418101b13ea58da74f0dd0d02feb907a4a94fb6d34a5c6fb7c5211b1d895c9a98d0ac7820101178ef5605bbe3111d692d0891f6ad6e169a85b05ec294982ab9061f533da22830131afbad6273bf1f1d10bd398c92fb63699887a971886dcef75ae704add3466f78401a5ab34b7bdeacb0ec3e3ac6ac5404946ca5ac11ba82d555f3f2ddd0d7078c38b850147d6d887f32a2d365cdc831400c28fda4c7bbcb2a58acbc0ab4caff8a8c2d5a98601b6649517dc96c5b315a38a286c9e650315d25f17fb82de3579efddfcf1e01f9f87015926d8483602bb7fee8d080f356a4bd7df8d7d52bddebc2475e251bdefb3a5208801c686025eb559ba5d76cd949f5467153a1c9e9966a4bc90212dfea94d51fa883b8901e0fdb84dac32593f40acdb490aaa7067791f86fe0d21fad37456715a4a50e2c38a0162b34ad51c809398baa876e67a9a700af8a79307db859223fe3e448f55a93fee8b0173a852960a08873b7a0861d9f422a07ae0499d799d257d419ded216ca40388498c01123eebbe910a6d84376f67ed017f44250364cb1c08f004e94a396217337fabc98d0193106533953dfe8ba172ac80e37daa2a5ac8b6fffe9be272c1693cc1f5f42d318e01552e78ae1091627286a0086c45bcedf7e382190996db1319b54cd1ca7c9ec1a78f01fa91c3a836feeb11741ea14b6ef59dfe3c59966e165f677b1dfbba2f66bf8a7f90013ec7360bf3a96fa20cb4d13e951796fdf49569570ab014256845ca2b32ee5a619101ee932d4fd673a590cfe2cbb8bfcad2d484e3183d13f66cf8d924b435495603d49201532c168e58cbcba1ba4fdf39a0a3472e1587f8a2adfae3a65b6e717e3f24f00d9301a42361663dbf1be262babf0a8727221ed45b036775eff4ddac35dab850722c8b9401ede31859beb1c58af1f79c229ca53d3f6db056c8f35378c6287fc2ac615804579501674179b9538cf77576d35491813e327f4afef714817dcfa32438294bc80b48c59601f0e4c350ff24c878bf906a863eea52a419daaa5e1169b8199f5d3955b7242e819701aa93ed2868ed7b92e215de442c766ec756aa494c4fe2e68f390042f5ed06148a98018130865987c048158549571ddb15ba65792a688376db0c0caf392d3fa9c3793699016ba06f72c659975c0858cc5414ecea12cf546f3a6050799af0492c00083e8c299a01efe1b17c5b34d787703c700ef88fc89661642d5af7274366f52be1582650372b9b01ef3e7c6499e87e9e065e7b69f06f41d2693932acdadb9f8ae2fc4c410acb19fd9c010af00b6bc109c8e2d3ec148ab7427c5e46ef9f44462ac4d02e510679773c394d9d013a2e74a54f6d0eeacce3f7aadcc25a20e3e2dde0d04cf37ddfc575d09e5dfcc99e01afa862c0f208deee038278ddcae940dc79b67a9d6774666c71f4a7325be31a589f015390330f5bcab06d8cd699dbc84f6e0f85492359983a0dd9c7bfe564539128b8a001b0de8a9e046dacddbf71e7c054f1114c5f2cd461a2d93895a770862c10f1f57aa10145b7f9dc6373c760f4ba21f64444c667f6b5e944110f3e9602a550f7795f1971a20139432e926f9c7e7b03b8da02235ed9a3653de46e41880a1abcfe5350ce825246a401a6ee6b9d5711c93f73dd17e913ed278ee0af4deecd163fb5b9e2cafe5ad5ff4aa50160f5f0941d684bac712f885d118b6c506684ee79d5aa7165781a4b21ae2a17b1a601a19edc0d76ca0e84734e1d9eb0214754a68234c32abb729c4f6525c72194e942a701a23c5d2fe8a78822d6a2e96a7d53c8ed549e9594c53a69ad4eef8b71272acfa2a8019a957380870b9b0c2aefcd3a7953630678ea1a59f7b56038e4c753923ad2cb63a90159d1cbb5b653ae4e4a5f63e7520ee7302902a6716d0151a9ba3164462fe1f4cdaa01db9ce9d509044eaa11003215d9a7fceb55d20905223d87e8affa5e3cc0231d48ab016818e68e117dd3fe39cedb773aef6802f03f2c7aa140227b067b9db80164724aac013fa48e281f09f1ab6f39ba8bda829bad6c8ffd472304be50182171457a0b4202ad0169d2aa603f7feea328affed6d5116597a618253c43527152a84ef9d543b99f3dae012a3d99f8e6ef8a475cc7cb9ad5768c46eb8cd75fd00c1f9571119879f86d9aeaaf012307dae76eba3777bbd354edd83bad38b547ff23271fe7d33d3d25a13afa9f6fb001adac3e86f7a2b6af1f02e19d0dd9341e670c234ee23e4fad4ebeeca6a958ed6ab1013a57f35f8c7bed3efca364c75e8c74b104b468742b17d64cae40269be9b70c0db201757e90d83f3c0fb1d802e8d26c1bdabc430805353fed7d2683e48591beba60b1b301c0548449f7fdcdc490c1cba341461036ac30f90bb014f5dfb8d58c1adad6fa6bb4011ef44e7a15ec45e191b40265eb0c56f9aa501881bcfd77ebaad0038c92d92f5cb50152217fd4a7e2939949940c3564c50adf52ac18712056e4819a8a8a511cdbc469b6019937cb4ecfd16fb9a0cfe066f966132f530631277f5e4c1ebf55a6aafe1a9a1fb70153c2f770a93e43fa9c12cdfece28b1e20361629d66438953e89fb12c11132ca7b8015e4774686da053a2a466bbd93c759b781ad59f69faaccb5209f149ad81132ebeb90110472b47f89a4b56ab4b730aba46edaeca3c6d47652349893ab775bf50da6de1ba01783177fe103298e4d2ced815973320d7ef9a452bb6bd12657e8d312ccd208db8bb01a5cc935ac6048080c214cb3e45fe39acef37d660a836921df17998a4e52a7ccabc01299970bb660e8f369ab618e7a708cea8de2e0dd4a7c9f3dd5a52fc946ad41d08bd0109adf686de2a528266cdb519aac02af046fcda0e2a69f7df781f9f3e3d930c40be0177bd3ae6ad286930d992eed0269cdecbf27a21ff4eaf33894ad908c8a289c89cbf01011bad95c1492b30949db78b6ad1eba43696de0cce521d2a46218952f07cf564c00193bc46fdc13f291e679260439f9af638702d416d0b3a72df57e5459a98d1e6eec1018ce7c0d209c16752896f4b4a0b48ee088703f5830bc7e1122ba8cfb0a89f0571c201a4d32a46f70ac1f416a3a566f9b728d6d4e7b8d466b0954d6e74c9ea0f1622d1c301c996ccdbd2e1e607869d51c5328f4a3318d5d2885f384c40f8dda65d4287d047c401da1fe647d75001269d8b276fb4f80889953bf51efa8307d9d22a8a56647a60d0c50156c505a4e366efa6c122d8fd600b5c200d1c4d4e111d445f5b87754e3807a2d6c601391f02c084158d96dc72ca0114bcd48113118dbfb78b90c8916df73ba519fe3ac701426e6a59043ae8f495c85661f2a3801d9d41cfbbb811a085f3a30b8080688ff6c80143b933fded4f3f39a09de1a4c98f3049f672eeb26d1bf2a70f07ea147b787997c901f06bb868a5620d3ef492438370bb1fc4ba3f2f7aebba3aadc8e4908896b3d03bca01ea452582ac3c13f534a582265a8f1b9c7d4ad9717d16c977344063fbafcf5799cb01e2b27c5765ae5861f2b8b573870c1f09d67f6b8f0f3c93e92e7a9f4059ffc7d0cc01ca48a4ebab8bc7a701fb0b446747d23520079ffcfef227a0ea95b5a11995f73dcd013f33bb3972c702aa0cdf1e7393ba2063a9c8cd265e824c19b61961f7439da6a0ce0105839dd48776561eb3abf172b0acdd3025ce46a8fcae5c2dd85ae9b62f4f0e95cf012b40a45ead55e931fe7396cd72de807e602ec4a95f5833b2fc7a0b663c0ae0f1d0018027aac7870d7e060fc36c1d5fa63fe37cc23f3076bc2b972a86daadb259f1ead10186260b7a60f57f5a5aaafb8aca4101ae7101e55b8eb9872257c0dba3b5295a01d201952845d5127e853840fe7834ed3c2f9a89bc6fde75db95d3560642297dc24bcdd3018b228f0fb3606887806646c647d6ae89ac755e33fb0da6f78e59d077e549c881d40140612bc692554bfb5be20374f5cbd0d9a3a30660f725e1eaad46299549aa7a55d50172b1339590bb023bfec16eef2dd5e2f048b91cf5dc462213ae5f5e705f17ad42d601a16ddd801a0bafd0d2e3d9f268746fb7df15208e6efee2f86999f99c0ecb44a4d7013ea6e68e554d800a0fa9b3444b04e65ad5238d6c1c480ececa82895f9e1368bad8018233e9a4030981f9405aebd65bf52cae6baca901480db3d0359790050eff75d7d901938561d110475649ea3e53d2959e99a3bde48ed624f84a99a9875dd2a69336fdda01dacbc2a8e89a04d42f61f56ee151799c113ef7d7cd84533cdad1870b78ceeccfdb01bc20ed2b1b2750965d8b1805553b94063417ad82a73cb99d4c77b06fbbd8889adc01b56acb622c67b614f0d3e4b317e35b741cbad5ee3f85010cc610b291ec56f6fedd011ce6c7bf2f8908dc128a6c7648aba44cf1d26e4c684ad3d660c4daefc0d980eede014c974551efbf33066999f39f5b1f6f8fffbb3dfdbe32f8421403e61b8b2033e1df01f08d96b1a32b152cda0a3fa13131bf5b6301bf89ec886be767ed97132f71c205e00185fb7e942c506e6cfabc2d9dadd5cdf97b32c051c4fdcc51b8ec52092ad20318e1014ba19da7179ac96973137be6a2a26ab5f8d726461445b9ff74eff572c7ffe88ae20118fb2387f3c09377c0b1f4eef109d77d0a10e517d335cf5bd301ffd9c04844fde30130f0d4f56ffa836cfe4094ebad140db6a3d8ff421cce57cb1fe7866f14b2f72ee40169e60336bbce52203fa9a73b008d32c59ec4a82a65e621014dad4ed8cac316bee501d225b6321bf0a315b1c090d0337033e28690750ce4497a06415f6aa1d27b532ee601fe60abfeb62a1e1cdcbe04ac2bd5743501edba6f848549c4b3daac2721820fcbe701220ddec651230d2d354f382d0a8f1a93b5c70928fec708a7806c5b7704909165e801eb06bf5806166f882ef552a4265cc472f114eb80ebafc995c97e30122151a4c1e901aab5ea2f6a0e8dae97b4352035af8023428638a76b3390f15d79f41f7d52dc4fea0100c9a28ae13e90f7f299cf53ef0243fdc8f94857f8d55ab283b7cc7cecba51a3eb01416618505db0854b815788f8061cb506d3202b48217619472e6972b362b74314ec01b99775a1f8fc7de19440cb3c3142656337f581b669c0006b3aefd35e5a729041ed011d098402428144a5db43ef765b2224a4e431dca0309931c73b2da6e52088b309ee012c54f74347bc85b3f74342945eec3c9b7b4373e74600c627e4896ea73d232cceef01130049d2d558477040af4bac84619bc98172b174940f9d452e033c86f55f573cf0019f2ec80ccccf3b8df8ebf3c308526426b63aad4143b83ab3135179974b1eabc1f10184a01c59b2b3be25a6e32d7a857112b458d18b0322ec420e8d4123f691fa1119f201c68f8659cc4ee11edc7513c7e75fb75d52a4d8fde1949c1b3d22567157053916f301e698e99acd0f28d7e7b42345713b678a4654371a92d6ce72dd3717501a6b4c8cf401e0f3112ac479d4dc03a49d0c514a1e7bbdd8bdc55b8af68aa7af55c197ca8d1ef5016079b988baee865777436b2fea7fe165edaf4b25a6f57d40f6c5d35d8e254a89f60147623a51e5e9cf160366f71c7da8d13c5f08f3bbec2bd7aa100bb9464eada348f701692f0d52ff164a39f5f7e66c21e02e015ca86ee278c777244cb6eb1bb798ddcdf80137ec8da24b5323e920e9f4367368faf6f2c051fa043bfa223f6ebc7f018e6618f901d7111628a59336119ad1b0ceaeafbfcfb51031797274aa1205a54ebc5d2d6660fa01b1ec0afa3f8d2da1ee43024b38baeb59530779ba472b69019415e7e679a9599bfb0177960ccb6c00885e23bf7d8d574ad688682d3a848c0c2723784551fd365af4b7fc0120d92924a7ed97fbf710fa21e5061e4c69539720a002134cfb6ede716e868b26fd01c762c2c297dbf2e21e9de251ca84dd550f239e92e88c88e3af15f1f9634c00e2fe013afb5f5903c2bb2677d73dc33276bf41113b946310bb40f96258205254251b04ff0163249d665b0c5617b719a340197733d10504356a23def02f295d93a1d9484a3400010d000000000171c5818656febe389f076de5dcf3daa7ee0dd65514373579e0581c709962e4420201a259047084b5815b2cd728ff1f91ffdf5798f79621de3dce89070ac1279140020301c92b446f5987477fc148ff601062ec21c446787bd5f643a30cf4d18f492381440401733d162c05959971ad321db4c366f31954c0495c0c78c095bca62c4a0e95fab10601adfd07a8466cd33c592b634acb9f3224befc76cd06c1cb9920cf1a67281a81f40701a7bb20aba0929f3af640fd9a4afc89734a29a5a628d9c7c60cc75546d05d0a01080120e3d1655ee864bb68e341b17b1aac99d534e879ba32ea74eab82dcd170c216d09017a6505cc0dce03660c9368804f9f42d903ae12af957895a6fb609ee9117d7f1e0a00d462592b93c79b5455bdbb6a24e16a4077452b68525dddccb671bacdade59b640b00a5ab4b9fe55cce9b3f9e4c95b76dcc15d6ccab2f446f43e4310d3868482cc3290c01016a36b36174e31cc1908825fece01e3a56c22c48468b082ee87711fb74722300d0084e404ad533d5c70d1ffde1e045507416e6b22d471204b11dfa860d7fefb856a0e00564fd2f5163ecb66cd2357fcf77b802b22335604ffd49f19475c1fe34337335c" +} diff --git a/src/tests/data/rpc_response/state_item_result_v2.json b/src/tests/data/rpc_response/state_item_result_v2.json new file mode 100644 index 00000000..fccfc857 --- /dev/null +++ b/src/tests/data/rpc_response/state_item_result_v2.json @@ -0,0 +1,450 @@ +{ + "api_version": "2.0.0", + "stored_value": { + "Contract": { + "contract_package_hash": "contract-package-3c3034152dc5183aca4faead260fe71e6805b3c2b45004d3dc19d7dc4f391519", + "contract_wasm_hash": "contract-wasm-c0f08d920cf2c773e1501899ae403ee7a590644c069ce9efadcd3dc3c51e321d", + "named_keys": [ + { + "name": "__contract_main_purse", + "key": "uref-1cd4fc41e3f750e52024f54b1ac3a757027baad64d47ffb6d4e968967618740b-007" + }, + { + "name": "__events", + "key": "uref-71194b85ed7ba3ef39f60a5c48804cd2fa7fd69e93e79558a95f56ae3ac087b7-007" + }, + { + "name": "__events_ces_version", + "key": "uref-c50c2ec1f514fb7585d003786cc0669f7da74b99a0bf1377be6fb5ffb6d54897-007" + }, + { + "name": "__events_length", + "key": "uref-30e051c19d43a62fca78fd2427d2e4e3f36698e12d01b14324eb1af45760fe2d-007" + }, + { + "name": "__events_schema", + "key": "uref-b03e5bf2f75652e054e1374ae823bf4caccfc2b0bc6dcc6cf2898693aef18715-007" + }, + { + "name": "balances", + "key": "uref-d2b037bffbb39d38a6858422a9b9a1a2e659bad35bcf07ed0601acda37098a74-007" + }, + { + "name": "decimals", + "key": "uref-237c28b499bc79032d23b08752205cda1d34e0459ef62a9398c4de745ed25161-007" + }, + { + "name": "name", + "key": "uref-b9c0245b1142a64a2bd768738a5179b4aab0c6ba520a5ef67d4f7df64ab7327e-007" + }, + { + "name": "state", + "key": "uref-2845f6271e849b0b820e321d3ea32d819622a47c17cd78adb0a1a94bc9a3537b-007" + }, + { + "name": "symbol", + "key": "uref-44c7711c9e4fb9bca2e56cd107eb9a12d33652ad95aa20133014a209cc21ab20-007" + }, + { + "name": "total_supply", + "key": "uref-0ab4e3f056f20ef2e179eb99dba9026739fabb0774a30b4de7664197b4096f19-007" + } + ], + "entry_points": [ + { + "entry_point": { + "name": "add_to_the_pool", + "args": [], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "allowance", + "args": [ + { + "name": "owner", + "cl_type": "Key" + }, + { + "name": "spender", + "cl_type": "Key" + } + ], + "ret": "U256", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "approve", + "args": [ + { + "name": "spender", + "cl_type": "Key" + }, + { + "name": "amount", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "balance_of", + "args": [ + { + "name": "account", + "cl_type": "Key" + } + ], + "ret": "U256", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "burn", + "args": [ + { + "name": "owner", + "cl_type": "Key" + }, + { + "name": "amount", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "change_security", + "args": [ + { + "name": "admin_list", + "cl_type": { + "List": "Key" + } + }, + { + "name": "minter_list", + "cl_type": { + "List": "Key" + } + }, + { + "name": "none_list", + "cl_type": { + "List": "Key" + } + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "claim", + "args": [ + { + "name": "receipt_id", + "cl_type": "U32" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "decimals", + "args": [], + "ret": "U8", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "decrease_allowance", + "args": [ + { + "name": "spender", + "cl_type": "Key" + }, + { + "name": "decr_by", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "grant_role", + "args": [ + { + "name": "role", + "cl_type": { + "ByteArray": 32 + } + }, + { + "name": "address", + "cl_type": "Key" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "has_role", + "args": [ + { + "name": "role", + "cl_type": { + "ByteArray": 32 + } + }, + { + "name": "address", + "cl_type": "Key" + } + ], + "ret": "Bool", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "increase_allowance", + "args": [ + { + "name": "spender", + "cl_type": "Key" + }, + { + "name": "inc_by", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "init", + "args": [ + { + "name": "validator_address", + "cl_type": "PublicKey" + }, + { + "name": "claim_time", + "cl_type": "U64" + } + ], + "ret": "Unit", + "access": { + "Groups": [ + "constructor_group" + ] + }, + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "mint", + "args": [ + { + "name": "owner", + "cl_type": "Key" + }, + { + "name": "amount", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "name", + "args": [], + "ret": "String", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "remove_from_the_pool", + "args": [ + { + "name": "amount", + "cl_type": "U512" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "revoke_role", + "args": [ + { + "name": "role", + "cl_type": { + "ByteArray": 32 + } + }, + { + "name": "address", + "cl_type": "Key" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "stake", + "args": [], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "staked_cspr", + "args": [], + "ret": "U512", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "symbol", + "args": [], + "ret": "String", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "total_supply", + "args": [], + "ret": "U256", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "transfer", + "args": [ + { + "name": "recipient", + "cl_type": "Key" + }, + { + "name": "amount", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "transfer_from", + "args": [ + { + "name": "owner", + "cl_type": "Key" + }, + { + "name": "recipient", + "cl_type": "Key" + }, + { + "name": "amount", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "unstake", + "args": [ + { + "name": "scspr_amount", + "cl_type": "U256" + } + ], + "ret": "U32", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "entry_point": { + "name": "withdraw_from_the_pool", + "args": [ + { + "name": "amount", + "cl_type": "U512" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + } + ], + "protocol_version": "2.0.0" + } + }, + "merkle_proof": "01000000012c6f0c826b8c9c97cf71871d5e74d81e0cc8c3d05e68fa4097b637ab687330b3033c3034152dc5183aca4faead260fe71e6805b3c2b45004d3dc19d7dc4f391519c0f08d920cf2c773e1501899ae403ee7a590644c069ce9efadcd3dc3c51e321d0b000000150000005f5f636f6e74726163745f6d61696e5f7075727365021cd4fc41e3f750e52024f54b1ac3a757027baad64d47ffb6d4e968967618740b07080000005f5f6576656e74730271194b85ed7ba3ef39f60a5c48804cd2fa7fd69e93e79558a95f56ae3ac087b707140000005f5f6576656e74735f6365735f76657273696f6e02c50c2ec1f514fb7585d003786cc0669f7da74b99a0bf1377be6fb5ffb6d54897070f0000005f5f6576656e74735f6c656e6774680230e051c19d43a62fca78fd2427d2e4e3f36698e12d01b14324eb1af45760fe2d070f0000005f5f6576656e74735f736368656d6102b03e5bf2f75652e054e1374ae823bf4caccfc2b0bc6dcc6cf2898693aef18715070800000062616c616e63657302d2b037bffbb39d38a6858422a9b9a1a2e659bad35bcf07ed0601acda37098a740708000000646563696d616c7302237c28b499bc79032d23b08752205cda1d34e0459ef62a9398c4de745ed2516107040000006e616d6502b9c0245b1142a64a2bd768738a5179b4aab0c6ba520a5ef67d4f7df64ab7327e07050000007374617465022845f6271e849b0b820e321d3ea32d819622a47c17cd78adb0a1a94bc9a3537b070600000073796d626f6c0244c7711c9e4fb9bca2e56cd107eb9a12d33652ad95aa20133014a209cc21ab20070c000000746f74616c5f737570706c79020ab4e3f056f20ef2e179eb99dba9026739fabb0774a30b4de7664197b4096f1907190000000f0000006164645f746f5f7468655f706f6f6c0f0000006164645f746f5f7468655f706f6f6c0000000009010109000000616c6c6f77616e636509000000616c6c6f77616e636502000000050000006f776e65720b070000007370656e6465720b07010107000000617070726f766507000000617070726f766502000000070000007370656e6465720b06000000616d6f756e74070901010a00000062616c616e63655f6f660a00000062616c616e63655f6f6601000000070000006163636f756e740b070101040000006275726e040000006275726e02000000050000006f776e65720b06000000616d6f756e74070901010f0000006368616e67655f73656375726974790f0000006368616e67655f7365637572697479030000000a00000061646d696e5f6c6973740e0b0b0000006d696e7465725f6c6973740e0b090000006e6f6e655f6c6973740e0b09010105000000636c61696d05000000636c61696d010000000a000000726563656970745f69640409010108000000646563696d616c7308000000646563696d616c73000000000301011200000064656372656173655f616c6c6f77616e63651200000064656372656173655f616c6c6f77616e636502000000070000007370656e6465720b07000000646563725f6279070901010a0000006772616e745f726f6c650a0000006772616e745f726f6c650200000004000000726f6c650f2000000007000000616464726573730b090101080000006861735f726f6c65080000006861735f726f6c650200000004000000726f6c650f2000000007000000616464726573730b00010112000000696e6372656173655f616c6c6f77616e636512000000696e6372656173655f616c6c6f77616e636502000000070000007370656e6465720b06000000696e635f62790709010104000000696e697404000000696e6974020000001100000076616c696461746f725f61646472657373160a000000636c61696d5f74696d650509020100000011000000636f6e7374727563746f725f67726f757001040000006d696e74040000006d696e7402000000050000006f776e65720b06000000616d6f756e7407090101040000006e616d65040000006e616d65000000000a01011400000072656d6f76655f66726f6d5f7468655f706f6f6c1400000072656d6f76655f66726f6d5f7468655f706f6f6c0100000006000000616d6f756e74080901010b0000007265766f6b655f726f6c650b0000007265766f6b655f726f6c650200000004000000726f6c650f2000000007000000616464726573730b090101050000007374616b65050000007374616b65000000000901010b0000007374616b65645f637370720b0000007374616b65645f63737072000000000801010600000073796d626f6c0600000073796d626f6c000000000a01010c000000746f74616c5f737570706c790c000000746f74616c5f737570706c7900000000070101080000007472616e73666572080000007472616e736665720200000009000000726563697069656e740b06000000616d6f756e74070901010d0000007472616e736665725f66726f6d0d0000007472616e736665725f66726f6d03000000050000006f776e65720b09000000726563697069656e740b06000000616d6f756e740709010107000000756e7374616b6507000000756e7374616b65010000000c00000073637370725f616d6f756e74070401011600000077697468647261775f66726f6d5f7468655f706f6f6c1600000077697468647261775f66726f6d5f7468655f706f6f6c0100000006000000616d6f756e740809010102000000000000000000000003000000006f060000000c005de48886fa53ed53dda74fefc01ad40cfab5d55d5d444ba2bf13b662da442362330020aaee46634a5ade23b0fc569a9261f1ffd70bf572a32f367ecfcc40370239dc3b00afbaff698c306ecdf414524fdbab6873ce7141b8693d926097064e02c2ac97c361005d2b0c5fd368de4576f7367fbe5d232e5493f67e2ccfd0fb653c8317660bb9cc620033d762f49c2869619acb00beb81f5fdace1d5c25b340aeb831fa81a4123633ecd4004ead828a26d82e8e8306afeb5588c39123fb0ee8a1ea8477fda0a2820d7dc99a002cff0000000001f616514be112460615371d1174303aa2298ddaca9884ff0965801ccba4a96e35010193702b38b9ffaa05ac4f616ed31393f2629ebeb9bd46b1208c71179ecfa9ea7602019bcbcdef60ce1aa2a5b5efbab607e9c71009a5e8819f74e25d132659ddddf7d703014a8165167075c12351d96c650ba589eb76bf6b55562db84f051d447d5614c69f04016fd84af95ffcae11902a895c4e38e8b67bfa805b2ea32afdcdb243e2c671586005010f6845184256aecc680606a7428bf756d0fa23f8d8d0742868d0140a65c07c3b0601a462f42adb1905fe0615c57f2b169d82d9a00624190b4367e31531e60d226ce30701554f1d0046aca55f027aa90f1563e746c894290dc334001e6ff6889aa2e24fbb0801ff1e35cc7f69131e6552fdc2fef99a81c546db080b09ecced047b6f64bdbcf890901edb2c41b13573a64025e21b88be76e1a55196c8825ef544c9271ff43cdc22c700a01d33596b042ef70d21d487156cb1d04ed232c38f9b75e409d3d1aee94c32ea4db0b014a54decacccc31394a2139559d3bb7e0d3896af3fc52c9305f3637f3586ed8ca0c0197cda2bbf900fc2fe65ac9fd18f3309023566a237af0dc177fc003f26d13101d0d01a0072334144ab7b137116c06eb40a222a4bbb5e63b54f005532b62b8b8b5a1300e0127aa9201920507f8a54096b40fad3122d4e0a0bbe550979eabfee6b549dc729a0f0192582c96169c38a0bd0a3dc2f17450defc34480ae80ba481c1f7cc87068e6b2e1001a0fd8355fc76b52c95b7d34775f08714d52453ee9b4e2345baa54f3505dfa3cd110148fc2b400d2764735b15e85ea9529b36f7af024da40844d72b67ecd7a459d939120153ded3e0f9a9d1b311cabdf7a0683f7a09302571780d2e2e8529d2f850f2a86a130128e8b8beabc53846cccc0fadfb782bf78a9808e8ba8120f16beb1173c856763a1401fb511ffa98fe3f87288e75159a46d512f6c6dd97202e88d4593bb0d6ddc4c43e15015a858f91c57fa059e76f8345315d51d9bf1d791bf5a47efe11df9f37c800fd0a16013110431293415ed0abcf6445647d1e5e6ecedfe5d8ce737e4da37c10f402c9a71701ae3d28f2db545a67629a3904b4cd26879090857ff74cbe8ba164f8e06edc779a1801d926ff0f684e979d211ff19345a5c1aa7c6ff375719d57733922e3db7870946719019beec533495a4ead30816c61ce9e550e8f19eb7a587e409e48c8e51d60a15bbd1a0152c38e64f08dcc11f785df6b1bf3039f1e47dbfe4af7248f64d8eadcd689ac1b1b01275a1c5fb48e5b8bd69303564ad7e34f524ed4471b8a19191a35a4a92bc432cd1c01a202d55ae1fc34a7dc25cb2787f311a81eb9c4b45dc86d3ff793d6c772cf4b981d01b6cbd9b330eda42da8afdaf983bc09ffc61ef5b07612dcdaf2341448f2f955921e0161a0d116e2e406313f911d07cf6c323ae148d3b7ee1023c2c83e159d7851c7a61f0114f7976be424840b633eb52db2777d4f82e1708a19f4ae25d8cd83597f8d21642001ea37817506ce284d46cad918aec6c406ab336a9f342533b2e08ca4b8eefb23f72101857380268c33e53e0c2f5e2608134de6250a0c3402647b166e4b9bb181dd7ee82201a124bf2d6558e9307f8c89fbcb7287703564851285ffd7f98fe84f27bd2c7e1523019d434acbc9554cbe7359e28ca0fd92dac7ad3f1f3dfc8bcd3c2becc51d19e1632401aa7e9a916f961d8b48688e1ea5742b69f2e4247be47d92a705eb15fb1d0b5b522501716cfb8b53dc201bb0cc3a7277a61377f592755dfb76362341b956c66dbced9c2601d88b12c1a208c2330ae87342d686bccece49e91cdd8bafbcf07cd79d3da689792701ff241174388b9834aa5ab9c9a32eca409d424f5338e549bb1461b80cbcdeaf842801dfba613a59911e39f503a366094b8bb7fc3b812263afb7ca9c0cea1efc3c440a29018776d3815c112d9481c2d38764afc63fa621a051fb26d980e30c6e6ecb9475112a017502d0d72482e56635386dc592d1dcaffd744486f22fc4a7a65ae2aff464ffa02b01a1c073f947a9d79f8ebb4e569fe5e358f5488c3f5549f56b7cd23c66075ad7f92d01236c43e2f886d17544123b5c96a241f686b9215b3ba417f35cfef3df1fa27af82e01402bd66a1595402c5e163798612ce7f16d9ec457acc7d4840248be834465fd392f0139cacb653e016e5ebe55ebb00794823b2d8c27d5ef819ae5eaf1f294ebc061b230019cc6ec9729c429a879586d804a32cf203184e64ef510bc19cefdcc5d5b0522ba310121c33075c54d918aa9b6b867fadb7bb891b44bc567f9bafb5d7e3fc733f359e932012ca72e661c3e110a8a9f41bd732b051464bc15a8d8a6d9c7d102fefad21d8d813301dd8cb1a9e05eb08e7bfeb381842fb592731963a9f2e650c74f56dd186313e5343401a8d18269355fac0bc818d9c2af272027014a9458e05e49c787274a6f69c6d9a73501b5031618f6abd122c5bac3326d3e18a33f25cb606903451a8685b20b5069e8eb3601774830b01a316e32bad2b4094b6dd78052a4e858ee5e0fa61a5283c7347ed7bd3701b21e77f30c658489e9b49f77734be641145c568c836e5297beb63ff30f405ff53801b8b980f3eb99d6bbe51cc6d7c2606886e8244a130d433428190a6c6c7a081e673901de61c2f9a5c0760ec41fa155bd73d264dd6e9cd6f47beafbe8fc402d7ce0f7793a01f55b88c6ddc9ce4d78625cd8d406281f88f602125895c5ca95dc7f32df00dbde3b01018f3c91a9ca5aa6456490cd768747dfb3a5343e831d8caac14993770159536f3c0123b0c97b0ce6a051f9b45d6f33f7e16d4d2c35cb9da75bb12f66df39a710cc2d3d01cee84c55da5b5dbe70d0e83604421bcf4fca139e9fad69cc29f0d0afb8219b2b3e0121b8f2e4181e5961d367db6b80dff5e035a049c44ec4465a988a38cd9bc02fe83f019df99674ac50c631bb595c8be5ddc6085cb73459baf200b0a34f33e0e62ca1934001b4c45aed182c6b2f1c7170eb8c29fadd37fabba39773632b08da872e5f78ef5741016ca8f3833e640cae59ca24fe1f711a14eff1378171c291db52c9a8d3d2971c4242019594a09b0b7ebe8dc859ee0b93290ab5e9aeae519b7be51663edb3d17ec062794301a40ce82823dd32b6448e62ed3bbfa51db4ef1b0517f415dcaeaabcf1738492fc4401299ae903de769c5ba04322acfaa2a363165e9ab2e3c2bc54a26a1bf3251605fc450157dc6f54e830e039a6ea872fc3d6dad826041ed776d7ea8afc83590ca8d6c8f846019899a6b4a090d6fad360d771cbfb518ca5d9975a2b6447a44641a58d0b09ebf84701658be10dfd7d4bf1b159af795490bb38d79b259bc6b3c1f3de52ae69420f9725480157a09ec960e47821bce3c45118f694e086aa4f92180b46419ddaec68678f6e3749014ca74e748d2dd9c7bfe18001053f6ee6b8bbde874c2501761d644b41b8f5d95e4a017cf135c2d8362ba6793e9fe8dacb620aed30df5fb0799141aa34b4c7834052db4b010d10a493e57c546bdef46661fe866819e4d24cec21217c3902bf9ea58148b37e4c01e50c3e33f000d78c5057949332db0c7f1c94f0b203de7039ff3b442fc211ef634d01d2102d7214571ea041fbdba8596daa8f216c94e724981d4490ce566c97ad09084e010ca49131979b08b0a4e00d8e844a174dc8cbebefc38849b78710b2ca3dc999b74f019b1519dc8321f875f2147f4a338e8279220d727434ee63707741dbae0a1a97065001ca1c951de5ffcd22a54b8198956756dc80fcb142f935d8850b1116bd5612ee4e51011d41bdbc714eac81589c6578f60ecbe78d1da9453daac3d9cdb56c69bc6c30105201cbe6b760facf39d4296b032a3e9afcf4df69f3fb13a0bd65a494329a4f9e39fb5301c9abf94ade13c74614ab01c04729b2a2a523fb257ef3aa9b07665bc0ac05812a540165cc6a1b99752163c8db7a4d1518f53b7e74ddfe045713042717d3b54f562b1355010e8aca8b71fb13ff05f87afcc8fcfb494d9e3d650473b4f87a6ba333036cc2a05601a0e5e120f47a449c5c348d42a215dea0f5c3a3e7c0356341f0eecde78a911b685701e8a81f7d803875007fe108cbc18fe3340ffcb0dbf6d1680cc7a58d2831e5a64658013feae0575f6d8dfdc8d6fec0979a69378628ae6de9e9596ca337860a81c372215901f616900cfaffcf415b26d27eae7f6d1c2d1f1a61864fa6caf1119728deb0fe365a01de3bc297fcb7ba1a8560bba85a9f45df3ac2e28c42f819a69a2c0de0536c3a785b019860a3e4653b381d1f02e586597f1be57513fb5b3266f514f9ae6c97352398025c016286b572ea5f2f3a7f268c4d3e94c25779e795ac7142ec9c24d0d04b5c663e5f5d015c8ad7044a8d19c064b025e01cdeb715c3cf2f6fbf8193c7dbf80f5b5f79c8885e018d208546b0366fd756e51bd773cf2277598a023c31990c40a17a14f8f57a52e05f0113b3fb18849e3ee738f830c986ceb05dbe1d4ac3742e31a5e6165a7609bc8f236001968526e99b15c1ed413d88cefdf121bc16c1ff96b34b0fab2f599bfa2afad9516101ff6bd3e3f30af6f6dd90f228e8bb104f57bc9820d619d57a808e2304094732ed6201cf6f5a06950df9bbe6dc6e48579b1fc09df894cb4ef7e18a8125a06b1344ff7763015a23cd0b7329fd0297a24f088146e99a50e5e99063c40ba9f56afdabdf405d78640110f9ff0cdf88b6da0cf4457a8f7dd3b55017c2fe573646649b573856b552d7336501bbdcbf38fd70023a9f6b795eec32c13c362a8318759df18b253ec0d5038c0fd26601161add2867375a5b464112bb027f509a185f463a370504bfca536c5340ef417e6701e60bf5a3606d433cf7f1278cac30ee5c9a21590f7edfaf734f3151740eb3c6b5680116db4570ae0cf77dc99e655431d679e27a691ce0f15011f35d6fbcaf8fef74576901df334ad6ce215b162810586fd854c077e8b182aeb4a8b8616ec83a135c000cab6a01842d6f972f4d1acf1573da32a357c73cca96d6c74fa96a14875ef734500141c36b012f4b2d6bd0037f3bf29421000ad6f11546b5ecd95e1b26c607a0533539f767026c0140669fd5770579a0d44a6af41c1fc5eddd4f26176cf51ea03121bde0a5cf53da6d01da6b5416e5ad125ae90f9f85f669119c616d7b30d8275117fc44582f46547bcb6e014d19d051f361bbbed531044feffd566aad641274ca577494c4eab5fa6e83e21d6f013dc8570dce467bfca9297ed32f5996e7b2508310fb91a268970261cb6c07facb7001c329d8b98ea3bb4b6134af03dddf0fb3b02efc6a8ff84ea5a4e7d8fb82a78ee97101b523f51177c865446fab37dad82c1396f05cb8cd9ed8c72f93099dcda140371072010906ba8fb5da4ba9aa822fd64d8298dfa02f8e09bd7225e8708df236dd49f96b7301e7dd9a6e2296076589af50f81194629797f28319e957898196efb32913f2abd274018010c30b3766edc311a6f78a2a87fedea6ed7bbf40319df654a3b2d8f8ed588a750183814750d581a620e375c7059695899c4901b720e129c99eabaf51bf27040dfd760167324344f95e44da0c247a22326aa27814df361619466c24accee5f01fb881487701c4188557bb998ea81394bfa54cda7b1c921a737e48729a0c9ec577bf756767d97801875487449ede2aabcecc300717f4cdfef76510cc0fc13824f16a3e25c94a36347901dd21f520a5a9ddb67c4696be5bddf1dcbd63c6d06ffa6813bef22ac5a22dd6937a01c72efc606bfab2f447a79913b99af62daa8d1c4befedd7c626a751b88a9812cf7b0184b746acfca266ed57ea8826b4abbce4e0ffb2962fad1b71c56c435cf284d5ff7c01569a2dec52f0117ed33f83595ac6c14ca8aae0645faed30650f63db6a5e557d77d01040378a6f30d3e77c7c7da420a75cda349011f041ffdb2f1f547f12919aff0397e01f9df346f7528ee459fc98432c8af9a663c9aa38457b60d4ce31bfa369b52ff767f01d2d5ff3182804a0bea684592c2ba34fc2f384b19e20810205e7fdf1741b6a291800109c88235688234390b0ad9663bb7ebea0e5ffc1b997c9b1de976bd5b9ca23d8b8101b26adfeae0ce0ab849a26a14f7601eea50ef78cc5b7a226d0ef001bfedf9f1d0820128697477cfd50f642d82de5d4206e6bb68bc9fd4c9acccbd8ceba552b1f0c3ba83013e4f7ab547313df6a09e77bfe262c24318f001e65355554c152043d3507fe70184018d8742849ad6cc953ed0b76c092cfcd98489f65ead22ba0a3e933b64bf9ba13385016facdb921949e2cc037d33a767dd190fd5e0f8b62cf22d8b13af68b391f1ec558601ada174603aea75807fc536554df5bba764ad0ef7f3e6d150e874142c9527540e87011eb55f7190bd4a0bbe4e89f95bdedbfab7edf1480020da93483f762e6087e4728801336848db71816c814583cb7d0ee9183ccd7ed8fb921a9dfbe63743425691870b890108a9463f0e49d07798de3d3d4acffd569d137b709f70ccf57a3e40500b02aafd8a014692d87f66437a995033875d71924bcf872dd1050c99a47c6507d4c8049252a38b0136d9a4dd16fcd57808a0c729f43f8b2fdde9524abc98ca3c0d24bebc4a99a4a68c01896f5fb9c50be641218b89e61ed94771f2825a1953e6c820d345f9bd127939188d019987e7c1ee5d29fd3c20ecea3e58083a5ea64dc5ec2d15647b2ede775a851a8f8e01663ffbd6f517d3298a08f4e47e3a39764837c397b51de0ca5290657b9a75d7918f01ec57e60c8eec51a11a454f9eb6a1376cc6c0442c6ebee48ffcc40a89024e08619001a587196846ad1974609b1155e8e73621064f3bb2cac48ae97170c443e8603f34910102064f62eeaf30fcca01bc25830da80ddd05f1de5558c9bdbfe92a88e1cb887f9201b40ade6d39967877b8de2d23c2f9dba39872b9385e9bc3b17c04888cf03da3749301e280a8b8f004279a7ccb43102a9c906587077ce2033fda9044075432ed1916c29401b5f258b8259f46f58cbf23e26e29777b78767800113b512d8963acfc18a992019501469219f4b0ead24139f1fbb4424c5dbcd0bd362a910afdee28e6c1ddee3d3ce89601967e79429174bb2b00a9fa16305b7bc5fb90b317fd24deff21c16b84223055a597011b1068457bccbe6c17c8ec612ff87d6f2c03e2998c4275d49328827f6d569f539801a6b5380eeaf2819a84ff220da4f2f7c159e3f3ca85f7b703b171effed296953399015c07acca8fe1c68f55544cc196091c8b7769945b97cc2bffabd377d5927cb4f69a0102f2ebd7f44cecbac855800284e0f97c89457b79cdfe350e96e09ee34c521e299b0181859d316537841db8d86f76170973f8c96adf4dc88ce2df2bf2e7d77bb6be509c01ee9667afafdcae91eac4a81d64a072df383ad254e4bd4daa094cf6b28d8a854a9d01828c3db55163a55cb62ceb928255b224b031c7952308d0d93fc32d8596fa8f059e017d2b284ae04616f09cc58cbc53aee2951a0307e07817f57d140f68ed184273cd9f01285329b1f5d4cf3895b5c1e20097b7b290d82c3d653789dfca1033ab121ba351a001169aff0f1da280fe83773a7a4965d32120dcc0c273c8ac354b418f6bec3f6188a101d9bbfb9afaa8c7dbd1f4e78e3b551dada09b1008fdf09bd2c8383b250d8194d4a201aca5ef943be3945c54052d0ccfdaeee8683dae8ee3bafef311983c9f71c614eda3012955573fe7eb2e1f585e3eb36e737ff8b78547f7a7d668547d900a645b007338a4010afc09beb1aa72a0d78fdc274079f3a21043c3005dcd1199ec346ee90001faa6a501031c67304fe98c10584ec3bb5abdc477a14f91c93e9291732993d11a804e3f08a6013d8d7e8cb66a011dd0b4e6663f83654e5bb2bc88f076219857cf44ed120839f9a7016b2f76cd3973332d7113004c9d30556495ec4ef3c727511047e65f6d01f6e639a8010c5882a5b92233b9ae43979834e06fc81dbddbf61893877ef79dd4eec6bd3186a901eaf939ba2efd59161a7f937a4b890d79f33274a8a9e2e6e45384e0c2530944a7aa01acfa8b0a19394dde266a4610a42e82a55058ae175f81d4d6ce82508058052ec7ab01b21b87943e8be04a98fbcf32aae73b30b0824dc2fe8f64cf59f75f583f23b590ac01d5f8fffa5a364c691d7f845398e80811ea3a78f67db03631edbbe26831455c50ad01a76961ebabfbc5ba42d324621b466d7be4d41043e22e1a1ff2d2054e7e652288ae017dd6a2a5a73ef34b655fe558632864376a7d215e17d93154a86127cc6acdd0b0af01cff3da04546ff9229edfea1e7b78fc404ef49fbd6eb6022bc40e5c2218ea066eb001140f550d84c3e32fe7708e0aeed2e4faf597844b717b440e177f034c9edf5f33b101180fa853d38afbd693f25a4811f9c4b2e737a332732b79b05bb21bdca474ac83b2011b68c0c4a398828e08a4e9981dadd92f633cb1b5b4d4018b9c438d63161bd340b3015a7d990a9aa2ef8e64fde7a67a223eb972945720a4394e5fbf9a349c3890be2cb40132b20bcfe89eaa708d88e575fadf86ffc3e6fb15f40b173e1c95721d78e2e444b5010210280723fcdcee712b0b1eb89dfe297c6bbf4047b3f835499b79e6315b5ea6b601db5c82e81cab704661cf988cea79e18ce10e76295a4e72aecf9c5ac7bdbffabbb701c50ef71163b4135b06aeb526ae2a906738def7160d6c5b6c23f756f608db3c79b801bac2d64a9a553ab9943e7bafe4acf6044eec01cdc18686671f3d6b77c125d910b901695d15c468f3877abccce4297d92ebe987ed545d9b64d350df8bb642012353ffba011d8b0e96a2406f1dfe10a458b305574980069fda5b248c2058b142f4895f3ca8bb01343f9a8088c69b8554d5c553bd654b4d8c815ee3170d92a75b7f9875b5da0d28bc01a666b7b7c1e18180de60849f7ff9f5710fb3350fdb89af079dda1be94893f54cbd013e2384bd2c0c103183ca45fae0e52006a01acdc139dcc8b75fe2e147aeedf4eabe01891cab35dfe85d052ab22bc16f135d8a126e5e97ea9e923974f079c0eec3da24bf01ceceab4e5de0b7a9a6983421dcbf579f678198128361d2012e839e666a8c9b0cc0015e4b76b593903b706d39c197b2b49451e009383bfd89d085c3e4a23c44b72f2ec1010489487eabf35174e4b63efc45d69153594f968bc1b8133c7e3886b4054f2fccc201c11902495da51678541c05908e99ac18ae4d028d9c86ba9b45dc38497da3c2f7c3011bb1fc673b3881cb094ad2000959a4053c8591398f2b42bc16f6ad92a05b2959c401556c11574524b712f6d34437db8310c4ef79933cf7ed9da997eb7422576d27f9c5012c4205a19b7e4118206a7478aa3d836f757b2ceb41caa1a8a5d781ff66a7060ac601dc65acec7db75135acea35d22ef6a20b27249ad817d9c14fd4f776218f014bfdc701c4f007ebb7f2089511670ee50df74b1e17f722a6297ab3cc92ac95f15d951e5dc8016e11e5bd95d6531712d7fd9027ed4855d2e311aa23e0dea7b61ff4ebf21218dcc901384f3c59a9cdbcfb66f1001169b4a6cf0ca2fac2b78c68539fe0ae6fb7250db5ca01faad38a0a5ea8561e9aa94c96b001db2896d3ba1c6f904d1c1845e51e9874f21cb01b53050d7b06343f8eaa7b964440aa99fdd8c4d840fcf18d2e45bdd342b456600cc014f55d2f6bd9704506470aa1581fca5292150fd8f12a8a272b749205b9ce46d3ccd01dce78d97c34a0e4401fa18fd9b8dcb193cbb4d33a503dfe81a419b44234e6250ce01ceefb5f1c917037eb07a6652440622a2f1b7d555588a00eb406c95d3e609f284cf01fe79dde694c1108728df1cd48f29bfabe3336429e62d33ef1d36b3eb705f62eed00106102d69d0ef8f7508aa278414699727aa8f1deafbd488962601acaf6b549117d101dab217d79211cd19ec8b9e922847f5bb120b8d79072a20864f6d9b3a54ee00f6d2010e8bb6b1d10c0fe943625b9f3dc23770f3f8e7476a8e6d4083243f8421d9ae6fd30118d7b7f2ba8d1d733ec8b8b84b54c6538de65e36ec9bdee9099dd545e6d54ea7d401f57426ce77aaffbc0fd691272bfd2bdd4dd2100c46109dc0c4040aa541acc2d0d50102adf46b0ab3a3ace5ee4674c9fa9c907d792cc8ae95b0cfcc172255693bc8e1d6018d9007da08d93893b69fd76f7ded832b95c22272707fbab46b955a0dbf5712a8d7016b81a64aee0681c3181befd0728cfc100f01b45a6d62fc52905da787114f16efd8014ddf352342dcba660f9ee87837e1109dbe707e643626328ffc44060d6f0660ced901bd2e7caa965e6f6e3588c66bb399fb04a6f96b1bd8e9ef3c848b802527b39f51da01f9b1b2394e15c49d880968b7b9f9b296e7008a2100352755e318ff240f794b45db01874ccfe4d8b16f425cfbdc0ac0c98e723b448b843a484e13e226aa4ece20590adc01caa9cc3bc790020ad9ccef1068f22cd7097072a682ac16cd36a09b53367ca11bdd013352562bdef14b6f9fd8d71ddd6751160d9f1d25140909d0bdd8495e3f9d983ede0153606f0e8823a081d0e686a470b299e703e12d2f05991f9e248f5fcc9892f68edf0165d612e1d7cbc5384e073fe122790e8d30a0db9da48074f8b2e4d41caccdc283e0013883f903d3c210504d71c3d613de709401adaefe853d2f34f3542be528487867e10182f820cf8bf81182e284d204d59e364ad2878852cc73d54963ba9ded7a887d6de201b416b52f88cb470797d9adf59af8ca166f73a3f7d15b3c601969eaebc7e746dce3013711e143434167cd52e2a2b785ee1676c9d0894691f6614c85ee86d96372d73fe4012603923e7f49c3ee0c88aea0e16f53b89ad1dd8a8482867227e2abd95154e021e5016e478b096dcd3e3715565a9fd124e346de52c57f60803220ad556a2358ca39d0e601f1bef5b238d20762b1d2bb399b7d510cc60e813489755fcb762ab445f858fd07e701891b8f2e3d4eaf30ff779cca988e788ef806476d90741c4d66b752263edab6c4e801709fb721e7c55d845274e6f1d5c6157c9a728d6b8ca63652c2d35ea686f58e8fe9012710c6da2482610198ed68b0af6cb157c7b71916670e2ea97a2359d1da405fbbea0104b8d12e6e47be292c7c3490f60e3bf510a3fda6b4d1a6446604f778218023a9eb015dcc00fe727ea124dbf1b2fbe488987279727882f8adda76b88f2d55ca4bfa8aec015bfbe1c3afd299151aad72ed01e178b27c83148ecff1c86161a7a79a0748ec14ed01d9e0726031fb79049ce6407b5696b62ea554b96f3ae0ee5268ac6d71663343d7ee01d6ab9219511326043759df3f678e6c11eb9e97243ba0489feaccebd20179315fef0144ffd5c3331697ef91dfdedb57c30ac80e2ae424f42232bd1e8c12e18ab42339f001c5c01309281e823ec61b09d802c1184aebc213b2962e5dbe3bd66e1842bda24df101889bba12354d74274533db827789f863efcfd07f7f305f3ece71e5d5ad32555ef201a489bda34a5a3ac53607daa76978ce2d059045921de96c4aa6c9bb2040e554d8f301368d201fd97c0f15b453426dab6064e81d9ebe5385c1766be14c7c8399caa522f40137d4436ff920e965240ec671de0691fadb189dc2f8ad0e8d658ef5fb650bd30bf501f2de604ce2e731dca2dde2eb7ba4577423783cefbc13f55f80e98f62b2f0de0af601fb8c777df5fc1567b7e97f5963ddebb99feee7d1942bec59ee62a72c4681f78af7015a16d06dd14875c3b5b0cc1bacf6ef0505efd508eef42469b20885d2345df64ef8019db4ba33df8325ebd16734636d4e1b1f8a57f89416e75625e46f5d5fdc6424fdf901808b69e98df560f61f0c8184c2de7a7b5fa7a15b137274c3fcad7fec6c968aaafa0162c10752d34548801309ac39cd886fd7e974a1d02a27ca05aadb4f20325c10f8fb01ecee92f791eefbfa3da06dc13dda0058552ef8e18253599f9439b36dc2a6f240fc0102e3760bf19b9d7249fcea15d132cbddd345fbb4a291d9e5a983d83ef49b90dcfd01f54f0b6b3e1d1de07052c5e6e00fc492f2bad4ce34d4be7daad9ffca8c465284fe0124c6b6ef79d22ff0b66bc38dc62d5d9b86f0cd29a658f130a2311ecdac665256ff01f5d78d687a143fd11c38df3a6c8877ffb1f6e514fdf786fd51877029b543636000010e0000000001080ee56fd585681120336ccb85c30e186583d3ec0b9e8faad14ca23ea11060ac0201ccb047abdaf3a2aea25406d7ef28a1768f294f73db3fb75951ab947d5b06f6800301fb9af9dd193693539af3cce669cc0a0e0dfb79a87b19d8d8ae1707e7159e039a0401874f241fa16172fb773bb5db80f1a630cf4aafa8e07878b01aeebd0a1e865e6f060185f05f5434188cd10d05886cec3145edaea23fe110655a26082489ac55a3ea090801732d8be21ba8d9d166007384999a8f4887b01534151e5d22a1f388be99412fc40901d6fc154c43a1f8ac20d21fe62786a7ee3c6ba3abfe6079283ce075777fa628240a00aa359968ebc13aeb0ec170d86c230e35d478037aa4cc1441b186501323f5d9c90b0002279fe3a7ad69949a040cd6e432c1ce59526b09453eae4625ebf30123ce66ff0d009cf5b3e485b56677a6902e05ae8eacf3ca43bb72f9a2d95f4694f92ebe4f31f70e0043d39741a6e7b395eace3b1fbbbd5bbf288f7a788e80745a2e2bb0f2173a8b4f0f019f9ed36bf5665ebc10e1088e97fafc726c9b30e9549cd5c406ea669f93d5f29713011391e9fd14328982503755cf2ae152e27af8437efb10050740197a835cc49b2615002c9d70fe82455c8cc1d5d4eee880d07979beb2ba350aa68d01f6da868fe07d5d" +} diff --git a/src/tests/types/StoredValue.test.ts b/src/tests/types/StoredValue.test.ts index e719f960..7cd2a795 100644 --- a/src/tests/types/StoredValue.test.ts +++ b/src/tests/types/StoredValue.test.ts @@ -4,219 +4,119 @@ import { expect } from 'chai'; import { StoredValue, DelegatorAllocation, - ValidatorAllocation + ValidatorAllocation, + NamedEntryPoint } from '../../types'; +import { + stateItemResultV1Json, + stateItemResultV2Json, + eraInfoResultJson +} from '../data'; describe('Test StoredValue', () => { - const json = { - EraInfo: { - seigniorage_allocations: [ - { - Delegator: { - delegator_kind: { - PublicKey: - '018b46617b2b97e633b36530f2964b3f4c15916235910a2737e83d4fa2c7fad542' - }, - validator_public_key: - '01509254f22690fbe7fb6134be574c4fbdb060dfa699964653b99753485e518ea6', - amount: '2515330120214391' - } - }, - { - Validator: { - validator_public_key: - '01509254f22690fbe7fb6134be574c4fbdb060dfa699964653b99753485e518ea6', - amount: '2728720430156545' - } - }, - { - Delegator: { - delegator_kind: { - PublicKey: - '018b46617b2b97e633b36530f2964b3f4c15916235910a2737e83d4fa2c7fad542' - }, - validator_public_key: - '01509254f22690fbe7fb6134be574c4fbdb060dfa699964653b99753485e518ea6', - amount: '109303520813010' - } - }, - { - Validator: { - validator_public_key: - '01509254f22690fbe7fb6134be574c4fbdb060dfa699964653b99753485e518ea6', - amount: '118554941151112' - } - }, - { - Delegator: { - delegator_kind: { - PublicKey: - '0197b79d1a1351f8fb922b9f7f556d2bbfdba5105df9eaa6caa07804c703a641ed' - }, - validator_public_key: - '0190664e16a17594ed2d0e3c279c4cf5894e8db0da15e3b91c938562a1caae32ab', - amount: '8599696498056110' - } - }, - { - Validator: { - validator_public_key: - '0190664e16a17594ed2d0e3c279c4cf5894e8db0da15e3b91c938562a1caae32ab', - amount: '9377950843219784' - } - }, - { - Delegator: { - delegator_kind: { - PublicKey: - '0197b79d1a1351f8fb922b9f7f556d2bbfdba5105df9eaa6caa07804c703a641ed' - }, - validator_public_key: - '0190664e16a17594ed2d0e3c279c4cf5894e8db0da15e3b91c938562a1caae32ab', - amount: '285067736921916' - } - }, - { - Validator: { - validator_public_key: - '0190664e16a17594ed2d0e3c279c4cf5894e8db0da15e3b91c938562a1caae32ab', - amount: '310701366981535' - } - }, - { - Delegator: { - delegator_kind: { - PublicKey: - '01a5a5b7328118681638be3e06c8749609280dba4c9daf9aeb3d3464b8839b018a' - }, - validator_public_key: - '01c867ff3cf1d4e4e68fc00922fdcb740304def196e223091dee62012f444b9eba', - amount: '5976757455713484' - } - }, - { - Validator: { - validator_public_key: - '01c867ff3cf1d4e4e68fc00922fdcb740304def196e223091dee62012f444b9eba', - amount: '6492754998004464' - } - }, - { - Delegator: { - delegator_kind: { - PublicKey: - '01a5a5b7328118681638be3e06c8749609280dba4c9daf9aeb3d3464b8839b018a' - }, - validator_public_key: - '01c867ff3cf1d4e4e68fc00922fdcb740304def196e223091dee62012f444b9eba', - amount: '162277940193805' - } - }, - { - Validator: { - validator_public_key: - '01c867ff3cf1d4e4e68fc00922fdcb740304def196e223091dee62012f444b9eba', - amount: '176125500882714' - } - }, - { - Delegator: { - delegator_kind: { - PublicKey: - '0106ed45915392c02b37136618372ac8dde8e0e3b8ee6190b2ca6db539b354ede4' - }, - validator_public_key: - '01f58b94526d280881f79744effebc555426190950d5dfdd2f8aaf10ceaec010c6', - amount: '6111063397723576' - } - }, - { - Validator: { - validator_public_key: - '01f58b94526d280881f79744effebc555426190950d5dfdd2f8aaf10ceaec010c6', - amount: '6660504858490961' - } - }, - { - Delegator: { - delegator_kind: { - PublicKey: - '0106ed45915392c02b37136618372ac8dde8e0e3b8ee6190b2ca6db539b354ede4' - }, - validator_public_key: - '01f58b94526d280881f79744effebc555426190950d5dfdd2f8aaf10ceaec010c6', - amount: '183204228041446' - } - }, - { - Validator: { - validator_public_key: - '01f58b94526d280881f79744effebc555426190950d5dfdd2f8aaf10ceaec010c6', - amount: '199637730476608' - } - }, - { - Delegator: { - delegator_kind: { - PublicKey: - '0184f6d260f4ee6869ddb36affe15456de6ae045278fa2f467bb677561ce0dad55' - }, - validator_public_key: - '01fed662dc7f1f7af43ad785ba07a8cc05b7a96f9ee69613cfde43bc56bec1140b', - amount: '2170319328593039' - } - }, - { - Validator: { - validator_public_key: - '01fed662dc7f1f7af43ad785ba07a8cc05b7a96f9ee69613cfde43bc56bec1140b', - amount: '2366902069827651' - } - }, - { - Delegator: { - delegator_kind: { - PublicKey: - '0184f6d260f4ee6869ddb36affe15456de6ae045278fa2f467bb677561ce0dad55' - }, - validator_public_key: - '01fed662dc7f1f7af43ad785ba07a8cc05b7a96f9ee69613cfde43bc56bec1140b', - amount: '217749920954248' - } - }, - { - Validator: { - validator_public_key: - '01fed662dc7f1f7af43ad785ba07a8cc05b7a96f9ee69613cfde43bc56bec1140b', - amount: '237377113583604' - } - } - ] - } - }; + describe('era_info', () => { + let storedValue: StoredValue | undefined; - it('should parse the EraInfo JSON into a StoredValue instance', () => { - const parsedValue = new TypedJSON(StoredValue).parse(json); - expect(parsedValue).to.be.an.instanceOf(StoredValue); - expect(parsedValue?.eraInfo).to.exist; - }); + beforeEach(() => { + storedValue = new TypedJSON(StoredValue).parse(eraInfoResultJson); + }); + + it('should parse the EraInfo JSON into a StoredValue instance', () => { + expect(storedValue).to.be.an.instanceOf(StoredValue); + expect(storedValue?.eraInfo).to.exist; + }); + + it('should contain valid seigniorage allocations', () => { + const allocations = storedValue?.eraInfo?.seigniorageAllocations; + expect(allocations, 'Seigniorage allocations should exist').to.exist; + expect(allocations).to.have.lengthOf(20); + }); - it('should contain valid seigniorage allocations', () => { - const parsedValue = new TypedJSON(StoredValue).parse(json); - const allocations = parsedValue?.eraInfo?.seigniorageAllocations; - expect(allocations).to.exist; - expect(allocations).to.have.lengthOf(20); + it('should ensure each allocation is an instance of the correct class', () => { + const allocations = storedValue?.eraInfo?.seigniorageAllocations || []; + allocations.forEach((allocation, index) => { + if (allocation.delegator) { + expect(allocation.delegator).to.be.an.instanceOf(DelegatorAllocation); + } else if (allocation.validator) { + expect(allocation.validator).to.be.an.instanceOf(ValidatorAllocation); + } else { + expect.fail( + `Allocation at index ${index} does not have a delegator or validator property` + ); + } + }); + }); }); - it('should ensure each allocation is an instance of the correct class', () => { - const parsedValue = new TypedJSON(StoredValue).parse(json); - const allocations = parsedValue?.eraInfo?.seigniorageAllocations || []; - allocations.forEach(allocation => { - if (allocation.delegator) { - expect(allocation.delegator).to.be.an.instanceOf(DelegatorAllocation); - } else if (allocation.validator) { - expect(allocation.validator).to.be.an.instanceOf(ValidatorAllocation); - } + describe('entry_points', () => { + describe('error handling', () => { + it('should throw an error when provided with null JSON', () => { + expect(() => NamedEntryPoint.fromJSON(null)).to.throw( + 'Invalid JSON provided for NamedEntryPoint' + ); + }); + }); + + describe('old structure (1.x format)', () => { + let storedValue: StoredValue; + let jsonEntryPoint: any; + + before(() => { + storedValue = new TypedJSON(StoredValue).parse( + stateItemResultV1Json.stored_value + ) as StoredValue; + jsonEntryPoint = + stateItemResultV1Json.stored_value.Contract.entry_points[0]; + }); + + it('should parse and map the entry point correctly for old structure', () => { + const entryPoint = storedValue!.contract!.entryPoints[0]!; + expect(entryPoint).to.exist; + expect(entryPoint).to.be.instanceOf(NamedEntryPoint); + + expect(entryPoint.entryPoint.ret.toJSON()).to.deep.equal( + jsonEntryPoint.ret + ); + expect(entryPoint.entryPoint.name).to.deep.equal(jsonEntryPoint.name); + expect(entryPoint.entryPoint.access).to.deep.equal( + jsonEntryPoint.access + ); + expect(entryPoint.entryPoint.entryPointType).to.deep.equal( + jsonEntryPoint.entry_point_type + ); + }); + }); + + describe('new structure (2.x format)', () => { + let storedValue: StoredValue; + let jsonEntryPoint: any; + + before(() => { + storedValue = new TypedJSON(StoredValue).parse( + stateItemResultV2Json.stored_value + ) as StoredValue; + jsonEntryPoint = + stateItemResultV2Json.stored_value.Contract.entry_points[0]; + }); + + it('should parse and map the entry point correctly for new structure', () => { + const entryPoint = storedValue!.contract!.entryPoints[0]!; + expect(entryPoint).to.exist; + expect(entryPoint).to.be.instanceOf(NamedEntryPoint); + + expect(entryPoint.entryPoint.ret.toJSON()).to.deep.equal( + jsonEntryPoint.entry_point.ret + ); + expect(entryPoint.entryPoint.name).to.deep.equal( + jsonEntryPoint.entry_point.name + ); + expect(entryPoint.entryPoint.access).to.deep.equal( + jsonEntryPoint.entry_point.access + ); + expect(entryPoint.entryPoint.entryPointType).to.deep.equal( + jsonEntryPoint.entry_point.entry_point_type + ); + }); }); }); }); diff --git a/src/types/AddressableEntity.ts b/src/types/AddressableEntity.ts index 248f7f64..43f1ccd3 100644 --- a/src/types/AddressableEntity.ts +++ b/src/types/AddressableEntity.ts @@ -1,4 +1,4 @@ -import { jsonObject, jsonMember, jsonArrayMember } from 'typedjson'; +import { jsonObject, jsonMember, jsonArrayMember, TypedJSON } from 'typedjson'; import { AssociatedKey } from './Account'; import { EntryPointV1 } from './EntryPoint'; import { AccountHash, URef } from './key'; @@ -143,8 +143,29 @@ export class NamedEntryPoint { entryPoint: EntryPointV1; /** - * The name of the entry point, used for identifying and invoking it. + * Creates a new NamedEntryPoint instance from JSON. + * + * This method supports both JSON variants: + * - 1.x: { name, args, ret, access, entry_point_type, ... } + * - 2.x: { entry_point: { name, args, ret, access, entry_point_type, ... } } + * + * @param json The raw JSON to parse. + * @returns A new instance of NamedEntryPoint. */ - @jsonMember({ name: 'name', constructor: String }) - name: string; + public static fromJSON(json: any): NamedEntryPoint { + if (!json) { + throw new Error('Invalid JSON provided for NamedEntryPoint'); + } + + const normalizedJSON = json.entry_point ? json : { entry_point: json }; + const typedJSON = new TypedJSON(NamedEntryPoint); + + const parsed = typedJSON.parse(normalizedJSON); + + if (!parsed) { + throw new Error('Failed to parse NamedEntryPoint JSON'); + } + + return parsed; + } } diff --git a/src/types/Contract.ts b/src/types/Contract.ts index 0ed3890b..a1e733b3 100644 --- a/src/types/Contract.ts +++ b/src/types/Contract.ts @@ -33,7 +33,13 @@ export class Contract { /** * The list of entry points (functions) that can be called on this contract. */ - @jsonArrayMember(NamedEntryPoint, { name: 'entry_points' }) + @jsonArrayMember(NamedEntryPoint, { + name: 'entry_points', + deserializer: json => { + if (!json) return; + return json.map((it: NamedEntryPoint) => NamedEntryPoint.fromJSON(it)); + } + }) entryPoints: NamedEntryPoint[]; /**