From fd871e82190109aba59917dd22350d10edd40a56 Mon Sep 17 00:00:00 2001 From: Tamir-Polymath Date: Wed, 26 May 2021 07:36:42 -0400 Subject: [PATCH 1/3] NCBD-166 Flatten repo --- .gitignore | 3 +- .gitmodules | 10 +- docker-compose-alcyon.yml | 18 + docker-compose-local.yml | 14 +- docker-compose-staging.yml | 18 + docker-compose-tooling.yml | 18 + explorer-api | 1 - explorer-gui | 1 - harvester | 1 - pm-explorer-api/.dockerignore | 58 + pm-explorer-api/.gitignore | 105 + pm-explorer-api/Dockerfile | 18 + pm-explorer-api/LICENSE | 674 + pm-explorer-api/README.md | 8 + pm-explorer-api/app/__init__.py | 20 + pm-explorer-api/app/main.py | 96 + pm-explorer-api/app/middleware/__init__.py | 20 + pm-explorer-api/app/middleware/cache.py | 34 + pm-explorer-api/app/middleware/context.py | 35 + .../app/middleware/sessionmanager.py | 34 + pm-explorer-api/app/models/__init__.py | 20 + pm-explorer-api/app/models/base.py | 85 + pm-explorer-api/app/models/data.py | 789 ++ pm-explorer-api/app/resources/__init__.py | 21 + pm-explorer-api/app/resources/base.py | 190 + pm-explorer-api/app/resources/polkascan.py | 1250 ++ pm-explorer-api/app/schemas/__init__.py | 12 + pm-explorer-api/app/settings.py | 100 + pm-explorer-api/app/utils/__init__.py | 20 + pm-explorer-api/app/utils/ss58.py | 121 + pm-explorer-api/docker-compose.yml | 27 + pm-explorer-api/requirements.txt | 40 + pm-explorer-api/start.sh | 22 + pm-explorer-gui/.dockerignore | 3 + pm-explorer-gui/.editorconfig | 13 + pm-explorer-gui/.gitignore | 46 + pm-explorer-gui/Dockerfile | 66 + pm-explorer-gui/LICENSE | 674 + pm-explorer-gui/README.md | 13 + pm-explorer-gui/nginx/polkascan-dev.conf | 23 + pm-explorer-gui/nginx/polkascan-gui.conf | 12 + pm-explorer-gui/nginx/polkascan-nomad.conf | 31 + pm-explorer-gui/nginx/polkascan-prod.conf | 31 + pm-harvester/.dockerignore | 58 + pm-harvester/.gitignore | 108 + pm-harvester/Dockerfile | 18 + pm-harvester/LICENSE | 674 + pm-harvester/README.md | 8 + pm-harvester/alembic.ini | 74 + pm-harvester/app/__init__.py | 19 + pm-harvester/app/db/AddColumnIfNotExists.sql | 21 + pm-harvester/app/db/AddIndexIfNotExists.sql | 21 + pm-harvester/app/db/ColumnsAndIndices.sql | 112 + pm-harvester/app/db/README | 1 + pm-harvester/app/db/env.py | 89 + pm-harvester/app/db/script.py.mako | 24 + ...e4d4_accountid_nullable_in_accountindex.py | 28 + .../38a7f29de7c7_initial_db_layout.py | 841 ++ ...5f_added_module_index_for_runtime_error.py | 294 + pm-harvester/app/main.py | 65 + pm-harvester/app/middleware/__init__.py | 20 + pm-harvester/app/middleware/context.py | 35 + pm-harvester/app/middleware/sessionmanager.py | 34 + pm-harvester/app/models/__init__.py | 20 + pm-harvester/app/models/base.py | 53 + pm-harvester/app/models/data.py | 764 + pm-harvester/app/models/harvester.py | 48 + pm-harvester/app/processors/__init__.py | 23 + pm-harvester/app/processors/base.py | 199 + pm-harvester/app/processors/block.py | 524 + pm-harvester/app/processors/converters.py | 1133 ++ pm-harvester/app/processors/event.py | 1374 ++ pm-harvester/app/processors/extrinsic.py | 340 + pm-harvester/app/resources/__init__.py | 21 + pm-harvester/app/resources/base.py | 59 + pm-harvester/app/resources/harvester.py | 365 + pm-harvester/app/resources/tools.py | 160 + pm-harvester/app/schemas/__init__.py | 32 + pm-harvester/app/schemas/start_harvester.json | 9 + pm-harvester/app/settings.py | 199 + pm-harvester/app/tasks.py | 391 + .../app/type_registry/custom_types.json | 251 + .../substrate-node-template.json | 30 + pm-harvester/app/utils/__init__.py | 20 + pm-harvester/app/utils/ss58.py | 121 + pm-harvester/docker-compose-dev.yml | 91 + pm-harvester/docker-compose-local.yml | 72 + pm-harvester/docker-compose-test.yml | 91 + pm-harvester/docker-compose.yml | 91 + pm-harvester/requirements.txt | 51 + pm-harvester/start.sh | 33 + py-scale-codec/.github/workflows/deploy.yml | 40 + py-scale-codec/.github/workflows/test.yml | 32 + py-scale-codec/.gitignore | 105 + py-scale-codec/.travis.yml | 3 + py-scale-codec/LICENSE | 201 + py-scale-codec/README.md | 101 + py-scale-codec/docs/_config.yml | 1 + py-scale-codec/docs/base.html | 1411 ++ py-scale-codec/docs/block.html | 1740 +++ py-scale-codec/docs/exceptions.html | 134 + py-scale-codec/docs/index.html | 116 + py-scale-codec/docs/metadata.html | 5996 ++++++++ py-scale-codec/docs/type_registry/index.html | 115 + py-scale-codec/docs/types.html | 11656 ++++++++++++++++ py-scale-codec/docs/utils/index.html | 88 + py-scale-codec/docs/utils/ss58.html | 319 + py-scale-codec/requirements.txt | 10 + py-scale-codec/scalecodec/__init__.py | 20 + py-scale-codec/scalecodec/base.py | 372 + py-scale-codec/scalecodec/block.py | 477 + py-scale-codec/scalecodec/exceptions.py | 23 + py-scale-codec/scalecodec/metadata.py | 1714 +++ .../scalecodec/type_registry/__init__.py | 32 + .../scalecodec/type_registry/acala.json | 105 + .../scalecodec/type_registry/centrifuge.json | 38 + .../scalecodec/type_registry/darwinia.json | 112 + .../scalecodec/type_registry/default.json | 5223 +++++++ .../scalecodec/type_registry/edgeware.json | 124 + .../scalecodec/type_registry/joystream.json | 49 + .../scalecodec/type_registry/kulupu.json | 30 + .../scalecodec/type_registry/kusama.json | 340 + .../scalecodec/type_registry/nodle.json | 15 + .../scalecodec/type_registry/plasm.json | 89 + .../scalecodec/type_registry/polkadot.json | 98 + .../scalecodec/type_registry/polymesh.json | 1531 ++ .../type_registry/polymesh_hacks.md | 30 + .../scalecodec/type_registry/robonomics.json | 39 + .../substrate-node-template.json | 29 + .../scalecodec/type_registry/test.json | 31 + .../scalecodec/type_registry/westend.json | 88 + py-scale-codec/scalecodec/types.py | 1404 ++ py-scale-codec/scalecodec/updater.py | 58 + py-scale-codec/scalecodec/utils/__init__.py | 17 + py-scale-codec/scalecodec/utils/math.py | 41 + py-scale-codec/scalecodec/utils/ss58.py | 118 + py-scale-codec/setup.py | 235 + py-scale-codec/test/__init__.py | 15 + py-scale-codec/test/fixtures.py | 36 + py-scale-codec/test/test_extrinsic_payload.py | 2237 +++ py-scale-codec/test/test_metadata.py | 134 + .../test/test_runtime_configuration.py | 41 + py-scale-codec/test/test_scale_types.py | 397 + py-scale-codec/test/test_scalebytes.py | 77 + py-scale-codec/test/test_type_encoding.py | 346 + py-scale-codec/test/test_type_registry.py | 224 + .../.github/workflows/deploy.yml | 40 + .../.github/workflows/unittests.yml | 33 + py-substrate-interface/.gitignore | 107 + py-substrate-interface/.travis.yml | 3 + py-substrate-interface/LICENSE | 201 + py-substrate-interface/README.md | 332 + py-substrate-interface/_config.yml | 1 + py-substrate-interface/docs/constants.html | 76 + py-substrate-interface/docs/exceptions.html | 159 + py-substrate-interface/docs/index.html | 6426 +++++++++ py-substrate-interface/docs/subkey.html | 685 + py-substrate-interface/docs/utils/hasher.html | 383 + py-substrate-interface/docs/utils/index.html | 91 + py-substrate-interface/docs/utils/ss58.html | 450 + py-substrate-interface/examples.py | 87 + py-substrate-interface/requirements.txt | 15 + py-substrate-interface/setup.py | 251 + .../substrateinterface/__init__.py | 2036 +++ .../substrateinterface/constants.py | 20 + .../substrateinterface/exceptions.py | 27 + .../substrateinterface/key.py | 61 + .../substrateinterface/utils/__init__.py | 17 + .../substrateinterface/utils/hasher.py | 118 + .../substrateinterface/utils/ss58.py | 165 + py-substrate-interface/test.py | 43 + py-substrate-interface/test/__init__.py | 15 + py-substrate-interface/test/fixtures.py | 20 + py-substrate-interface/test/settings.py | 21 + .../test/test_create_extrinsics.py | 186 + .../test/test_helper_functions.py | 115 + py-substrate-interface/test/test_keypair.py | 215 + .../test/test_runtime_state.py | 189 + .../test/test_type_registry.py | 70 + 179 files changed, 64600 insertions(+), 19 deletions(-) delete mode 160000 explorer-api delete mode 160000 explorer-gui delete mode 160000 harvester create mode 100644 pm-explorer-api/.dockerignore create mode 100644 pm-explorer-api/.gitignore create mode 100644 pm-explorer-api/Dockerfile create mode 100644 pm-explorer-api/LICENSE create mode 100644 pm-explorer-api/README.md create mode 100644 pm-explorer-api/app/__init__.py create mode 100644 pm-explorer-api/app/main.py create mode 100644 pm-explorer-api/app/middleware/__init__.py create mode 100644 pm-explorer-api/app/middleware/cache.py create mode 100644 pm-explorer-api/app/middleware/context.py create mode 100644 pm-explorer-api/app/middleware/sessionmanager.py create mode 100644 pm-explorer-api/app/models/__init__.py create mode 100644 pm-explorer-api/app/models/base.py create mode 100644 pm-explorer-api/app/models/data.py create mode 100644 pm-explorer-api/app/resources/__init__.py create mode 100644 pm-explorer-api/app/resources/base.py create mode 100644 pm-explorer-api/app/resources/polkascan.py create mode 100644 pm-explorer-api/app/schemas/__init__.py create mode 100644 pm-explorer-api/app/settings.py create mode 100644 pm-explorer-api/app/utils/__init__.py create mode 100644 pm-explorer-api/app/utils/ss58.py create mode 100644 pm-explorer-api/docker-compose.yml create mode 100644 pm-explorer-api/requirements.txt create mode 100755 pm-explorer-api/start.sh create mode 100644 pm-explorer-gui/.dockerignore create mode 100644 pm-explorer-gui/.editorconfig create mode 100644 pm-explorer-gui/.gitignore create mode 100755 pm-explorer-gui/Dockerfile create mode 100644 pm-explorer-gui/LICENSE create mode 100644 pm-explorer-gui/README.md create mode 100644 pm-explorer-gui/nginx/polkascan-dev.conf create mode 100644 pm-explorer-gui/nginx/polkascan-gui.conf create mode 100644 pm-explorer-gui/nginx/polkascan-nomad.conf create mode 100644 pm-explorer-gui/nginx/polkascan-prod.conf create mode 100644 pm-harvester/.dockerignore create mode 100644 pm-harvester/.gitignore create mode 100644 pm-harvester/Dockerfile create mode 100644 pm-harvester/LICENSE create mode 100644 pm-harvester/README.md create mode 100644 pm-harvester/alembic.ini create mode 100644 pm-harvester/app/__init__.py create mode 100644 pm-harvester/app/db/AddColumnIfNotExists.sql create mode 100644 pm-harvester/app/db/AddIndexIfNotExists.sql create mode 100644 pm-harvester/app/db/ColumnsAndIndices.sql create mode 100644 pm-harvester/app/db/README create mode 100644 pm-harvester/app/db/env.py create mode 100644 pm-harvester/app/db/script.py.mako create mode 100644 pm-harvester/app/db/versions/2e13a031e4d4_accountid_nullable_in_accountindex.py create mode 100644 pm-harvester/app/db/versions/38a7f29de7c7_initial_db_layout.py create mode 100644 pm-harvester/app/db/versions/3aa6678d275f_added_module_index_for_runtime_error.py create mode 100644 pm-harvester/app/main.py create mode 100644 pm-harvester/app/middleware/__init__.py create mode 100644 pm-harvester/app/middleware/context.py create mode 100644 pm-harvester/app/middleware/sessionmanager.py create mode 100644 pm-harvester/app/models/__init__.py create mode 100644 pm-harvester/app/models/base.py create mode 100644 pm-harvester/app/models/data.py create mode 100644 pm-harvester/app/models/harvester.py create mode 100644 pm-harvester/app/processors/__init__.py create mode 100644 pm-harvester/app/processors/base.py create mode 100644 pm-harvester/app/processors/block.py create mode 100644 pm-harvester/app/processors/converters.py create mode 100644 pm-harvester/app/processors/event.py create mode 100644 pm-harvester/app/processors/extrinsic.py create mode 100644 pm-harvester/app/resources/__init__.py create mode 100644 pm-harvester/app/resources/base.py create mode 100644 pm-harvester/app/resources/harvester.py create mode 100644 pm-harvester/app/resources/tools.py create mode 100644 pm-harvester/app/schemas/__init__.py create mode 100644 pm-harvester/app/schemas/start_harvester.json create mode 100644 pm-harvester/app/settings.py create mode 100644 pm-harvester/app/tasks.py create mode 100644 pm-harvester/app/type_registry/custom_types.json create mode 100644 pm-harvester/app/type_registry/substrate-node-template.json create mode 100644 pm-harvester/app/utils/__init__.py create mode 100644 pm-harvester/app/utils/ss58.py create mode 100644 pm-harvester/docker-compose-dev.yml create mode 100644 pm-harvester/docker-compose-local.yml create mode 100644 pm-harvester/docker-compose-test.yml create mode 100644 pm-harvester/docker-compose.yml create mode 100644 pm-harvester/requirements.txt create mode 100755 pm-harvester/start.sh create mode 100644 py-scale-codec/.github/workflows/deploy.yml create mode 100644 py-scale-codec/.github/workflows/test.yml create mode 100644 py-scale-codec/.gitignore create mode 100644 py-scale-codec/.travis.yml create mode 100644 py-scale-codec/LICENSE create mode 100644 py-scale-codec/README.md create mode 100644 py-scale-codec/docs/_config.yml create mode 100644 py-scale-codec/docs/base.html create mode 100644 py-scale-codec/docs/block.html create mode 100644 py-scale-codec/docs/exceptions.html create mode 100644 py-scale-codec/docs/index.html create mode 100644 py-scale-codec/docs/metadata.html create mode 100644 py-scale-codec/docs/type_registry/index.html create mode 100644 py-scale-codec/docs/types.html create mode 100644 py-scale-codec/docs/utils/index.html create mode 100644 py-scale-codec/docs/utils/ss58.html create mode 100644 py-scale-codec/requirements.txt create mode 100644 py-scale-codec/scalecodec/__init__.py create mode 100644 py-scale-codec/scalecodec/base.py create mode 100644 py-scale-codec/scalecodec/block.py create mode 100644 py-scale-codec/scalecodec/exceptions.py create mode 100644 py-scale-codec/scalecodec/metadata.py create mode 100644 py-scale-codec/scalecodec/type_registry/__init__.py create mode 100644 py-scale-codec/scalecodec/type_registry/acala.json create mode 100644 py-scale-codec/scalecodec/type_registry/centrifuge.json create mode 100644 py-scale-codec/scalecodec/type_registry/darwinia.json create mode 100644 py-scale-codec/scalecodec/type_registry/default.json create mode 100644 py-scale-codec/scalecodec/type_registry/edgeware.json create mode 100644 py-scale-codec/scalecodec/type_registry/joystream.json create mode 100644 py-scale-codec/scalecodec/type_registry/kulupu.json create mode 100644 py-scale-codec/scalecodec/type_registry/kusama.json create mode 100644 py-scale-codec/scalecodec/type_registry/nodle.json create mode 100644 py-scale-codec/scalecodec/type_registry/plasm.json create mode 100644 py-scale-codec/scalecodec/type_registry/polkadot.json create mode 100644 py-scale-codec/scalecodec/type_registry/polymesh.json create mode 100644 py-scale-codec/scalecodec/type_registry/polymesh_hacks.md create mode 100644 py-scale-codec/scalecodec/type_registry/robonomics.json create mode 100644 py-scale-codec/scalecodec/type_registry/substrate-node-template.json create mode 100644 py-scale-codec/scalecodec/type_registry/test.json create mode 100644 py-scale-codec/scalecodec/type_registry/westend.json create mode 100644 py-scale-codec/scalecodec/types.py create mode 100644 py-scale-codec/scalecodec/updater.py create mode 100644 py-scale-codec/scalecodec/utils/__init__.py create mode 100644 py-scale-codec/scalecodec/utils/math.py create mode 100644 py-scale-codec/scalecodec/utils/ss58.py create mode 100644 py-scale-codec/setup.py create mode 100644 py-scale-codec/test/__init__.py create mode 100644 py-scale-codec/test/fixtures.py create mode 100644 py-scale-codec/test/test_extrinsic_payload.py create mode 100644 py-scale-codec/test/test_metadata.py create mode 100644 py-scale-codec/test/test_runtime_configuration.py create mode 100644 py-scale-codec/test/test_scale_types.py create mode 100644 py-scale-codec/test/test_scalebytes.py create mode 100644 py-scale-codec/test/test_type_encoding.py create mode 100644 py-scale-codec/test/test_type_registry.py create mode 100644 py-substrate-interface/.github/workflows/deploy.yml create mode 100644 py-substrate-interface/.github/workflows/unittests.yml create mode 100644 py-substrate-interface/.gitignore create mode 100644 py-substrate-interface/.travis.yml create mode 100644 py-substrate-interface/LICENSE create mode 100644 py-substrate-interface/README.md create mode 100644 py-substrate-interface/_config.yml create mode 100644 py-substrate-interface/docs/constants.html create mode 100644 py-substrate-interface/docs/exceptions.html create mode 100644 py-substrate-interface/docs/index.html create mode 100644 py-substrate-interface/docs/subkey.html create mode 100644 py-substrate-interface/docs/utils/hasher.html create mode 100644 py-substrate-interface/docs/utils/index.html create mode 100644 py-substrate-interface/docs/utils/ss58.html create mode 100644 py-substrate-interface/examples.py create mode 100644 py-substrate-interface/requirements.txt create mode 100644 py-substrate-interface/setup.py create mode 100644 py-substrate-interface/substrateinterface/__init__.py create mode 100644 py-substrate-interface/substrateinterface/constants.py create mode 100644 py-substrate-interface/substrateinterface/exceptions.py create mode 100644 py-substrate-interface/substrateinterface/key.py create mode 100644 py-substrate-interface/substrateinterface/utils/__init__.py create mode 100644 py-substrate-interface/substrateinterface/utils/hasher.py create mode 100644 py-substrate-interface/substrateinterface/utils/ss58.py create mode 100644 py-substrate-interface/test.py create mode 100644 py-substrate-interface/test/__init__.py create mode 100644 py-substrate-interface/test/fixtures.py create mode 100644 py-substrate-interface/test/settings.py create mode 100644 py-substrate-interface/test/test_create_extrinsics.py create mode 100644 py-substrate-interface/test/test_helper_functions.py create mode 100644 py-substrate-interface/test/test_keypair.py create mode 100644 py-substrate-interface/test/test_runtime_state.py create mode 100644 py-substrate-interface/test/test_type_registry.py diff --git a/.gitignore b/.gitignore index 33462274..12d9495d 100644 --- a/.gitignore +++ b/.gitignore @@ -105,4 +105,5 @@ venv.bak/ .idea/ data/ -.env.* \ No newline at end of file +.env.* +.DS_Store diff --git a/.gitmodules b/.gitmodules index 62d7251e..98e85650 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,3 @@ -[submodule "harvester"] - path = harvester - url = https://github.com/polymathnetwork/polkascan-pre-harvester.git -[submodule "explorer-api"] - path = explorer-api - url = https://github.com/PolymathNetwork/polkascan-pre-explorer-api.git [submodule "explorer-gui"] - path = explorer-gui - url = https://github.com/PolymathNetwork/polkascan-pre-explorer-gui.git + path = pm-explorer-gui/explorer-gui + url = https://github.com/polkascan/polkascan-explorer-gui.git diff --git a/docker-compose-alcyon.yml b/docker-compose-alcyon.yml index 25cfdb86..361b6082 100644 --- a/docker-compose-alcyon.yml +++ b/docker-compose-alcyon.yml @@ -2,6 +2,9 @@ version: '3' services: explorer-api: + build: + context: pm-explorer-api/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/alcyon-explorer-api:latest hostname: explorer-api ports: @@ -32,6 +35,9 @@ services: - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} harvester-api: + build: + context: pm-harvester/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest hostname: harvester-api volumes: @@ -62,6 +68,9 @@ services: - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} harvester-worker: + build: + context: pm-harvester/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest volumes: - "/usr/src/app" @@ -77,6 +86,9 @@ services: environment: *env harvester-beat: + build: + context: pm-harvester/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest volumes: - "/usr/src/app" @@ -93,6 +105,9 @@ services: environment: *env harvester-monitor: + build: + context: pm-harvester/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest ports: - "5555:5555" @@ -119,6 +134,9 @@ services: awslogs-stream-prefix: redis explorer-gui: + build: + context: pm-explorer-gui/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/alcyon-explorer-gui:latest ports: - '80:80' diff --git a/docker-compose-local.yml b/docker-compose-local.yml index 754b7ca6..f81957fe 100644 --- a/docker-compose-local.yml +++ b/docker-compose-local.yml @@ -3,11 +3,11 @@ version: '3.2' services: explorer-api: - build: explorer-api/. + build: pm-explorer-api/. image: polkascan/pre-explorer-api:latest hostname: explorer-api volumes: - - './explorer-api:/usr/src/app' + - './pm-explorer-api:/usr/src/app' command: ./start.sh environment: - PYTHONPATH=/usr/src/app @@ -24,7 +24,7 @@ services: - mysql harvester-api: - build: harvester/. + build: pm-harvester/. image: polkascan/pre-harvester:latest hostname: harvester-api volumes: @@ -50,7 +50,7 @@ services: - mysql harvester-worker: - build: harvester/. + build: pm-harvester/. image: polkascan/pre-harvester:latest volumes: - './harvester:/usr/src/app' @@ -61,7 +61,7 @@ services: - mysql harvester-beat: - build: harvester/. + build: pm-harvester/. image: polkascan/pre-harvester:latest volumes: - './harvester:/usr/src/app' @@ -72,7 +72,7 @@ services: - redis harvester-monitor: - build: harvester/. + build: pm-harvester/. image: polkascan/pre-harvester:latest ports: - '5555:5555' @@ -98,7 +98,7 @@ services: explorer-gui: image: polkascan/pre-explorer-gui:latest build: - context: explorer-gui/. + context: pm-explorer-gui/. args: - NETWORK_NAME=${NETWORK_NAME} - NETWORK_ID=${NETWORK_ID} diff --git a/docker-compose-staging.yml b/docker-compose-staging.yml index 07f0b7ac..78445b41 100644 --- a/docker-compose-staging.yml +++ b/docker-compose-staging.yml @@ -2,6 +2,9 @@ version: '3' services: explorer-api: + build: + context: pm-explorer-api/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-explorer-api:latest hostname: explorer-api links: @@ -30,6 +33,9 @@ services: - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} harvester-api: + build: + context: pm-harvester/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest hostname: harvester-api volumes: @@ -60,6 +66,9 @@ services: - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} harvester-worker: + build: + context: pm-harvester/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest volumes: - "/usr/src/app" @@ -75,6 +84,9 @@ services: environment: *env harvester-beat: + build: + context: pm-harvester/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest volumes: - "/usr/src/app" @@ -91,6 +103,9 @@ services: environment: *env harvester-monitor: + build: + context: pm-harvester/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest ports: - "5555:5555" @@ -117,6 +132,9 @@ services: awslogs-stream-prefix: redis explorer-gui: + build: + context: pm-explorer-gui/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-explorer-gui:latest ports: - '80:80' diff --git a/docker-compose-tooling.yml b/docker-compose-tooling.yml index 30bd7197..fec5a90a 100644 --- a/docker-compose-tooling.yml +++ b/docker-compose-tooling.yml @@ -2,6 +2,9 @@ version: '3' services: explorer-api: + build: + context: pm-explorer-api/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-explorer:latest hostname: explorer-api ports: @@ -32,6 +35,9 @@ services: - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} harvester-api: + build: + context: pm-harvester/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest hostname: harvester-api volumes: @@ -62,6 +68,9 @@ services: - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} harvester-worker: + build: + context: pm-harvester/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest volumes: - "/usr/src/app" @@ -77,6 +86,9 @@ services: environment: *env harvester-beat: + build: + context: pm-harvester/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest volumes: - "/usr/src/app" @@ -93,6 +105,9 @@ services: environment: *env harvester-monitor: + build: + context: pm-harvester/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest ports: - "5555:5555" @@ -119,6 +134,9 @@ services: awslogs-stream-prefix: redis explorer-gui: + build: + context: pm-explorer-gui/ + dockerfile: Dockerfile image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-explorer-gui:latest ports: - '80:80' diff --git a/explorer-api b/explorer-api deleted file mode 160000 index cb0985aa..00000000 --- a/explorer-api +++ /dev/null @@ -1 +0,0 @@ -Subproject commit cb0985aa7ca537fc86a4c46f337f8be0ee8406eb diff --git a/explorer-gui b/explorer-gui deleted file mode 160000 index 515dca65..00000000 --- a/explorer-gui +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 515dca651fda8a2cddb37fc6a59ab816cee632e0 diff --git a/harvester b/harvester deleted file mode 160000 index 3ff769cb..00000000 --- a/harvester +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3ff769cb9ba054105e18d1c5574c53e2f540144e diff --git a/pm-explorer-api/.dockerignore b/pm-explorer-api/.dockerignore new file mode 100644 index 00000000..96798ee0 --- /dev/null +++ b/pm-explorer-api/.dockerignore @@ -0,0 +1,58 @@ +# Created by .ignore support plugin (hsz.mobi) +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +data/ +logs/ +frontend/ \ No newline at end of file diff --git a/pm-explorer-api/.gitignore b/pm-explorer-api/.gitignore new file mode 100644 index 00000000..e6715635 --- /dev/null +++ b/pm-explorer-api/.gitignore @@ -0,0 +1,105 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site +data/ +# mypy +.mypy_cache/ +.idea diff --git a/pm-explorer-api/Dockerfile b/pm-explorer-api/Dockerfile new file mode 100644 index 00000000..67ed7c4d --- /dev/null +++ b/pm-explorer-api/Dockerfile @@ -0,0 +1,18 @@ +# base image +FROM python:3.8-buster +ENV PYTHONUNBUFFERED 1 + +# set working directory +RUN mkdir -p /usr/src/app +WORKDIR /usr/src/app + +RUN pip3 install --upgrade pip + +# add requirements +COPY ./requirements.txt /usr/src/app/requirements.txt + +# install requirements +RUN pip3 install -r requirements.txt + +# add app +COPY . /usr/src/app diff --git a/pm-explorer-api/LICENSE b/pm-explorer-api/LICENSE new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/pm-explorer-api/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/pm-explorer-api/README.md b/pm-explorer-api/README.md new file mode 100644 index 00000000..2714a035 --- /dev/null +++ b/pm-explorer-api/README.md @@ -0,0 +1,8 @@ +# Polkascan PRE Explorer API +Polkascan PRE Explorer API Python Application + +## Description +The Polkascan PRE Explorer API Application makes the data which is produced by the Polkascan PRE Harvester Application accessible to developers by providing JSON-API data on RESTful endpoint. The Polkascan PRE Explorer API Application will provide endpoints to all harvested data. + +## License +https://github.com/polkascan/polkascan-pre-explorer-api/blob/master/LICENSE diff --git a/pm-explorer-api/app/__init__.py b/pm-explorer-api/app/__init__.py new file mode 100644 index 00000000..6b7b9c4d --- /dev/null +++ b/pm-explorer-api/app/__init__.py @@ -0,0 +1,20 @@ +# Polkascan PRE Explorer API +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# __init__.py + diff --git a/pm-explorer-api/app/main.py b/pm-explorer-api/app/main.py new file mode 100644 index 00000000..72cb1a22 --- /dev/null +++ b/pm-explorer-api/app/main.py @@ -0,0 +1,96 @@ +# Polkascan PRE Explorer API +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# main.py + +import falcon + +from dogpile.cache import make_region + +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from app.settings import DB_CONNECTION, DEBUG, DOGPILE_CACHE_SETTINGS + +from app.middleware.context import ContextMiddleware +from app.middleware.sessionmanager import SQLAlchemySessionManager +from app.middleware.cache import CacheMiddleware + +from app.resources import polkascan + + +# Database connection +engine = create_engine(DB_CONNECTION, echo=DEBUG, isolation_level="READ_UNCOMMITTED", pool_pre_ping=True) +session_factory = sessionmaker(bind=engine, autoflush=False, autocommit=False) + +# Define cache region +cache_region = make_region().configure( + 'dogpile.cache.redis', + arguments={ + 'host': DOGPILE_CACHE_SETTINGS['host'], + 'port': DOGPILE_CACHE_SETTINGS['port'], + 'db': DOGPILE_CACHE_SETTINGS['db'], + 'redis_expiration_time': 60*60*2, # 2 hours + 'distributed_lock': True + } +) + +# Define application +app = falcon.API(middleware=[ + ContextMiddleware(), + SQLAlchemySessionManager(session_factory), + CacheMiddleware(cache_region) +]) + +# Application routes +app.add_route('/block', polkascan.BlockListResource()) +app.add_route('/block/{block_id}', polkascan.BlockDetailsResource()) +app.add_route('/block-total', polkascan.BlockTotalListResource()) +app.add_route('/block-total/{item_id}', polkascan.BlockTotalDetailsResource()) +app.add_route('/extrinsic', polkascan.ExtrinsicListResource()) +app.add_route('/extrinsic/{extrinsic_id}', polkascan.ExtrinsicDetailResource()) +app.add_route('/event', polkascan.EventsListResource()) +app.add_route('/event/{event_id}', polkascan.EventDetailResource()) +app.add_route('/runtime', polkascan.RuntimeListResource()) +app.add_route('/runtime/{item_id}', polkascan.RuntimeDetailResource()) +app.add_route('/runtime-call', polkascan.RuntimeCallListResource()) +app.add_route('/runtime-call/{runtime_call_id}', polkascan.RuntimeCallDetailResource()) +app.add_route('/runtime-event', polkascan.RuntimeEventListResource()) +app.add_route('/runtime-event/{runtime_event_id}', polkascan.RuntimeEventDetailResource()) +app.add_route('/runtime-module', polkascan.RuntimeModuleListResource()) +app.add_route('/runtime-module/{item_id}', polkascan.RuntimeModuleDetailResource()) +app.add_route('/runtime-storage/{item_id}', polkascan.RuntimeStorageDetailResource()) +app.add_route('/runtime-constant', polkascan.RuntimeConstantListResource()) +app.add_route('/runtime-constant/{item_id}', polkascan.RuntimeConstantDetailResource()) +app.add_route('/runtime-type', polkascan.RuntimeTypeListResource()) +app.add_route('/networkstats/{network_id}', polkascan.NetworkStatisticsResource()) +app.add_route('/balances/transfer', polkascan.BalanceTransferListResource()) +app.add_route('/balances/transfer/{item_id}', polkascan.BalanceTransferDetailResource()) +app.add_route('/account', polkascan.AccountResource()) +app.add_route('/account/{item_id}', polkascan.AccountDetailResource()) +app.add_route('/accountindex', polkascan.AccountIndexListResource()) +app.add_route('/accountindex/{item_id}', polkascan.AccountIndexDetailResource()) +app.add_route('/log', polkascan.LogListResource()) +app.add_route('/log/{item_id}', polkascan.LogDetailResource()) +app.add_route('/session/session', polkascan.SessionListResource()) +app.add_route('/session/session/{item_id}', polkascan.SessionDetailResource()) +app.add_route('/session/validator', polkascan.SessionValidatorListResource()) +app.add_route('/session/nominator', polkascan.SessionNominatorListResource()) +app.add_route('/session/validator/{item_id}', polkascan.SessionValidatorDetailResource()) +app.add_route('/contract/contract', polkascan.ContractListResource()) +app.add_route('/contract/contract/{item_id}', polkascan.ContractDetailResource()) diff --git a/pm-explorer-api/app/middleware/__init__.py b/pm-explorer-api/app/middleware/__init__.py new file mode 100644 index 00000000..6b7b9c4d --- /dev/null +++ b/pm-explorer-api/app/middleware/__init__.py @@ -0,0 +1,20 @@ +# Polkascan PRE Explorer API +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# __init__.py + diff --git a/pm-explorer-api/app/middleware/cache.py b/pm-explorer-api/app/middleware/cache.py new file mode 100644 index 00000000..68fe46ea --- /dev/null +++ b/pm-explorer-api/app/middleware/cache.py @@ -0,0 +1,34 @@ +# Polkascan PRE Explorer API +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# cache.py + + +class CacheMiddleware: + + def __init__(self, cache_region): + self.cache_region = cache_region + + def process_request(self, req, resp): + pass + + def process_resource(self, req, resp, resource, params): + resource.cache_region = self.cache_region + + def process_response(self, req, resp, resource, req_succeeded): + pass diff --git a/pm-explorer-api/app/middleware/context.py b/pm-explorer-api/app/middleware/context.py new file mode 100644 index 00000000..960ab16f --- /dev/null +++ b/pm-explorer-api/app/middleware/context.py @@ -0,0 +1,35 @@ +# Polkascan PRE Explorer API +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# context.py + +import uuid + + +def set_context(req, resp): + if not req.context.get('request_id'): + req.context['request_id'] = str(uuid.uuid4()) + + resp.set_header('request-id', req.context['request_id']) + resp.set_header('Access-Control-Allow-Origin', '*') + resp.set_header('Access-Control-Allow-Headers', '*') + + +class ContextMiddleware(object): + def process_request(self, req, resp): + set_context(req, resp) diff --git a/pm-explorer-api/app/middleware/sessionmanager.py b/pm-explorer-api/app/middleware/sessionmanager.py new file mode 100644 index 00000000..f1ba0fe2 --- /dev/null +++ b/pm-explorer-api/app/middleware/sessionmanager.py @@ -0,0 +1,34 @@ +# Polkascan PRE Explorer API +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# sessionmanager.py + +from sqlalchemy.orm import scoped_session + + +class SQLAlchemySessionManager: + + def __init__(self, session_factory): + self.session_factory = session_factory + + def process_resource(self, req, resp, resource, params): + resource.session = scoped_session(self.session_factory) + + def process_response(self, req, resp, resource, req_succeeded): + if hasattr(resource, 'session'): + resource.session.remove() diff --git a/pm-explorer-api/app/models/__init__.py b/pm-explorer-api/app/models/__init__.py new file mode 100644 index 00000000..6b7b9c4d --- /dev/null +++ b/pm-explorer-api/app/models/__init__.py @@ -0,0 +1,20 @@ +# Polkascan PRE Explorer API +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# __init__.py + diff --git a/pm-explorer-api/app/models/base.py b/pm-explorer-api/app/models/base.py new file mode 100644 index 00000000..f4d1a79d --- /dev/null +++ b/pm-explorer-api/app/models/base.py @@ -0,0 +1,85 @@ +# Polkascan PRE Explorer API +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# base.py +import decimal +from datetime import datetime + +import pytz +from dictalchemy import DictableModel +from sqlalchemy.ext.declarative import declarative_base +from substrateinterface.utils.ss58 import ss58_encode + +from app.settings import SUBSTRATE_ADDRESS_TYPE + + +class BaseModelObj(DictableModel): + + serialize_exclude = None + + def save(self, session): + session.add(self) + session.flush() + + @property + def serialize_type(self): + return self.__class__.__name__.lower() + + def serialize_id(self): + return self.id + + def serialize_formatting_hook(self, obj_dict): + """ Hook to be able to process data before being serialized """ + return obj_dict + + def serialize(self, exclude=None): + """ Serializes current model to a dict representation + :param exclude: list of property names to exclude in serialization + :returns: dict respresentation of current model + """ + + obj_dict = { + 'type': self.serialize_type, + 'id': self.serialize_id(), + 'attributes': self.asdict(exclude=exclude or self.serialize_exclude) + } + + obj_dict = self.serialize_formatting_hook(obj_dict) + + # Reformat certain data type + for key, value in obj_dict['attributes'].items(): + if type(value) is datetime: + obj_dict['attributes'][key] = value.replace(tzinfo=pytz.UTC).isoformat() + + if isinstance(value, decimal.Decimal): + obj_dict['attributes'][key] = float(value) + + return obj_dict + + @classmethod + def query(cls, session): + return session.query(cls) + + def format_address(self, item): + item['orig_value'] = item['value'].replace('0x', '') + item['value'] = ss58_encode(item['value'].replace('0x', ''), SUBSTRATE_ADDRESS_TYPE) + return item + + +BaseModel = declarative_base(cls=BaseModelObj) ## type: BaseModelObj + diff --git a/pm-explorer-api/app/models/data.py b/pm-explorer-api/app/models/data.py new file mode 100644 index 00000000..d2524954 --- /dev/null +++ b/pm-explorer-api/app/models/data.py @@ -0,0 +1,789 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# data.py + +import sqlalchemy as sa +from sqlalchemy import text +from sqlalchemy.orm import relationship, column_property +from sqlalchemy.dialects.mysql import LONGTEXT + +from app.models.base import BaseModel +from app.utils.ss58 import ss58_encode, ss58_encode_account_index +from app.settings import LOG_TYPE_AUTHORITIESCHANGE, SUBSTRATE_ADDRESS_TYPE + + +class Account(BaseModel): + __tablename__ = 'data_account' + + id = sa.Column(sa.String(64), primary_key=True) + address = sa.Column(sa.String(48), index=True) + index_address = sa.Column(sa.String(24), index=True) + is_reaped = sa.Column(sa.Boolean, default=False) + + is_validator = sa.Column(sa.Boolean, default=False, index=True) + was_validator = sa.Column(sa.Boolean, default=False, index=True) + is_nominator = sa.Column(sa.Boolean, default=False, index=True) + was_nominator = sa.Column(sa.Boolean, default=False, index=True) + is_council_member = sa.Column(sa.Boolean, default=False, index=True) + was_council_member = sa.Column(sa.Boolean, default=False, index=True) + is_tech_comm_member = sa.Column(sa.Boolean, default=False, index=True) + was_tech_comm_member = sa.Column(sa.Boolean, default=False, index=True) + is_registrar = sa.Column(sa.Boolean, default=False, index=True) + was_registrar = sa.Column(sa.Boolean, default=False, index=True) + is_sudo = sa.Column(sa.Boolean, default=False, index=True) + was_sudo = sa.Column(sa.Boolean, default=False, index=True) + + is_treasury = sa.Column(sa.Boolean, default=False, index=True) + is_contract = sa.Column(sa.Boolean, default=False, index=True) + + count_reaped = sa.Column(sa.Integer(), default=0) + hash_blake2b = sa.Column(sa.String(64), index=True, nullable=True) + + balance_total = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True, index=True) + balance_free = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True, index=True) + balance_reserved = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True, index=True) + nonce = sa.Column(sa.Integer(), nullable=True) + account_info = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + + has_identity = sa.Column(sa.Boolean, default=False, index=True) + has_subidentity = sa.Column(sa.Boolean, default=False, index=True) + identity_display = sa.Column(sa.String(32), index=True, nullable=True) + identity_legal = sa.Column(sa.String(32), nullable=True) + identity_web = sa.Column(sa.String(32), nullable=True) + identity_riot = sa.Column(sa.String(32), nullable=True) + identity_email = sa.Column(sa.String(32), nullable=True) + identity_twitter = sa.Column(sa.String(32), nullable=True) + identity_judgement_good = sa.Column(sa.Integer(), default=0) + identity_judgement_bad = sa.Column(sa.Integer(), default=0) + parent_identity = sa.Column(sa.String(64), index=True, nullable=True) + subidentity_display = sa.Column(sa.String(32), nullable=True) + + created_at_block = sa.Column(sa.Integer(), nullable=False) + updated_at_block = sa.Column(sa.Integer(), nullable=False) + + def serialize_id(self): + return self.id + + +class AccountAudit(BaseModel): + __tablename__ = 'data_account_audit' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=True) + account_id = sa.Column(sa.String(64), primary_key=True) + block_id = sa.Column(sa.Integer(), index=True, nullable=False) + extrinsic_idx = sa.Column(sa.Integer()) + event_idx = sa.Column(sa.Integer()) + type_id = sa.Column(sa.Integer(), nullable=False) + data = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + + +class AccountInfoSnapshot(BaseModel): + __tablename__ = 'data_account_info_snapshot' + + block_id = sa.Column(sa.Integer(), primary_key=True, index=True) + account_id = sa.Column(sa.String(64), primary_key=True, index=True) + + balance_total = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True, index=True) + balance_free = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True, index=True) + balance_reserved = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True, index=True) + nonce = sa.Column(sa.Integer(), nullable=True) + account_info = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + + +class Block(BaseModel): + __tablename__ = 'data_block' + + serialize_exclude = ['debug_info'] + + serialize_type = 'block' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + parent_id = sa.Column(sa.Integer(), nullable=False) + hash = sa.Column(sa.String(66), unique=True, index=True, nullable=False) + parent_hash = sa.Column(sa.String(66), index=True, nullable=False) + state_root = sa.Column(sa.String(66), nullable=False) + extrinsics_root = sa.Column(sa.String(66), nullable=False) + count_extrinsics = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_unsigned = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_signed = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_error = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_success = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_signedby_address = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_signedby_index = sa.Column(sa.Integer(), nullable=False) + count_events = sa.Column(sa.Integer(), nullable=False) + count_events_system = sa.Column(sa.Integer(), nullable=False) + count_events_module = sa.Column(sa.Integer(), nullable=False) + count_events_extrinsic = sa.Column(sa.Integer(), nullable=False) + count_events_finalization = sa.Column(sa.Integer(), nullable=False) + count_accounts = sa.Column(sa.Integer(), nullable=False) + count_accounts_new = sa.Column(sa.Integer(), nullable=False) + count_accounts_reaped = sa.Column(sa.Integer(), nullable=False) + count_sessions_new = sa.Column(sa.Integer(), nullable=False) + count_contracts_new = sa.Column(sa.Integer(), nullable=False) + count_log = sa.Column(sa.Integer(), nullable=False) + range10000 = sa.Column(sa.Integer(), nullable=False) + range100000 = sa.Column(sa.Integer(), nullable=False) + range1000000 = sa.Column(sa.Integer(), nullable=False) + datetime = sa.Column(sa.DateTime(timezone=True)) + year = sa.Column(sa.Integer(), nullable=True) + month = sa.Column(sa.Integer(), nullable=True) + week = sa.Column(sa.Integer(), nullable=True) + day = sa.Column(sa.Integer(), nullable=True) + hour = sa.Column(sa.Integer(), nullable=True) + full_month = sa.Column(sa.Integer(), nullable=True) + full_week = sa.Column(sa.Integer(), nullable=True) + full_day = sa.Column(sa.Integer(), nullable=True) + full_hour = sa.Column(sa.Integer(), nullable=True) + logs = sa.Column(sa.JSON(), default=None, server_default=None) + spec_version_id = sa.Column(sa.String(64), nullable=False) + debug_info = sa.Column(sa.JSON(), default=None, server_default=None) + + @classmethod + def get_head(cls, session): + with session.begin(): + query = session.query(cls) + model = query.order_by(cls.id.desc()).first() + + return model + + @classmethod + def get_missing_block_ids(cls, session): + return session.execute(text(""" + SELECT + z.expected as block_from, z.got-1 as block_to + FROM ( + SELECT + @rownum:=@rownum+1 AS expected, + IF(@rownum=id, 0, @rownum:=id) AS got + FROM + (SELECT @rownum:=0) AS a + JOIN data_block + ORDER BY id + ) AS z + WHERE z.got!=0 + ORDER BY block_from DESC + """) + ) + + def get_x_axis_value(self): + return self.id + + +class BlockTotal(BaseModel): + __tablename__ = 'data_block_total' + + serialize_type = 'block-total' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + session_id = sa.Column(sa.Integer()) + parent_datetime = sa.Column(sa.DateTime()) + blocktime = sa.Column(sa.Integer(), nullable=False) + author = sa.Column(sa.String(64), nullable=True, index=True) + author_account = relationship(Account, foreign_keys=[author], primaryjoin=author == Account.id) + total_extrinsics = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_extrinsics_success = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_extrinsics_error = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_extrinsics_signed = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_extrinsics_unsigned = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_extrinsics_signedby_address = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_extrinsics_signedby_index = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_events = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_events_system = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_events_module = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_events_extrinsic = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_events_finalization = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_logs = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_blocktime = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_accounts = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_accounts_new = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_accounts_reaped = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_sessions_new = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_contracts_new = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + + def serialize_formatting_hook(self, obj_dict): + + if self.author: + obj_dict['attributes']['author_id'] = self.author + obj_dict['attributes']['author'] = ss58_encode(self.author.replace('0x', ''), SUBSTRATE_ADDRESS_TYPE) + + return obj_dict + + def get_x_axis_value(self): + return self.id + + +class Event(BaseModel): + __tablename__ = 'data_event' + + block_id = sa.Column(sa.Integer(), primary_key=True, index=True) + block = relationship(Block, foreign_keys=[block_id], primaryjoin=block_id == Block.id) + + event_idx = sa.Column(sa.Integer(), primary_key=True, index=True) + + extrinsic_idx = sa.Column(sa.Integer(), index=True) + + type = sa.Column(sa.String(4), index=True) + + spec_version_id = sa.Column(sa.Integer()) + + module_id = sa.Column(sa.String(64), index=True) + event_id = sa.Column(sa.String(64), index=True) + + system = sa.Column(sa.SmallInteger(), index=True, nullable=False) + module = sa.Column(sa.SmallInteger(), index=True, nullable=False) + phase = sa.Column(sa.SmallInteger()) + + attributes = sa.Column(sa.JSON()) + + codec_error = sa.Column(sa.Boolean()) + + def serialize_id(self): + return '{}-{}'.format(self.block_id, self.event_idx) + + def serialize_formatting_hook(self, obj_dict): + + for item in obj_dict['attributes']['attributes']: + if item['type'] in ['AccountId', 'AuthorityId', 'Address'] and item['value']: + # SS58 format AccountId public keys + item['orig_value'] = item['value'].replace('0x', '') + item['value'] = ss58_encode(item['value'].replace('0x', ''), SUBSTRATE_ADDRESS_TYPE) + + elif item['type'] in ['AccountIndex'] and item['value']: + # SS58 format Account index + item['orig_value'] = item['value'] + item['value'] = ss58_encode_account_index(item['value'], SUBSTRATE_ADDRESS_TYPE) + elif item['type'] in ['AuthorityList'] and item['value']: + for idx, vec_item in enumerate(item['value']): + item['value'][idx]['AuthorityId'] = { + 'name': 'AuthorityId', + 'type': 'Address', + 'value': ss58_encode(vec_item['AuthorityId'].replace('0x', ''), SUBSTRATE_ADDRESS_TYPE), + 'orig_value': vec_item['AuthorityId'].replace('0x', '') + } + elif item['type'] == 'Vec': + for idx, vec_item in enumerate(item['value']): + item['value'][idx]['validatorId'] = { + 'name': 'validatorId', + 'type': 'Address', + 'value': ss58_encode(vec_item['validatorId'].replace('0x', ''), SUBSTRATE_ADDRESS_TYPE), + 'orig_value': vec_item['validatorId'].replace('0x', '') + } + + for other_idx, other_item in enumerate(vec_item['exposure']['others']): + item['value'][idx]['exposure']['others'][other_idx]['who'] = { + 'name': 'validatorId', + 'type': 'Address', + 'value': ss58_encode(other_item['who'].replace('0x', ''), SUBSTRATE_ADDRESS_TYPE), + 'orig_value': other_item['who'].replace('0x', '') + } + elif item['type'] in ['Vec<(AccountId, Balance)>'] and item['value']: + for idx, vec_item in enumerate(item['value']): + item['value'][idx]['account'] = { + 'name': 'account', + 'type': 'Address', + 'value': ss58_encode(vec_item['account'].replace('0x', ''), SUBSTRATE_ADDRESS_TYPE), + 'orig_value': vec_item['account'].replace('0x', '') + } + return obj_dict + + +class Extrinsic(BaseModel): + __tablename__ = 'data_extrinsic' + + block_id = sa.Column(sa.Integer(), primary_key=True, index=True) + block = relationship(Block, foreign_keys=[block_id], primaryjoin=block_id == Block.id) + + extrinsic_idx = sa.Column(sa.Integer(), primary_key=True, index=True) + extrinsic_hash = sa.Column(sa.String(64), index=True, nullable=True) + + extrinsic_length = sa.Column(sa.String(10)) + extrinsic_version = sa.Column(sa.String(2)) + + signed = sa.Column(sa.SmallInteger(), index=True, nullable=False) + unsigned = sa.Column(sa.SmallInteger(), index=True, nullable=False) + signedby_address = sa.Column(sa.SmallInteger(), nullable=False) + signedby_index = sa.Column(sa.SmallInteger(), nullable=False) + + address_length = sa.Column(sa.String(2)) + address = sa.Column(sa.String(64), index=True) + account = relationship(Account, foreign_keys=[address], primaryjoin=address == Account.id, lazy='subquery') + + account_index = sa.Column(sa.String(16), index=True) + account_idx = sa.Column(sa.Integer(), index=True) + signature = sa.Column(sa.String(128)) + nonce = sa.Column(sa.Integer()) + + era = sa.Column(sa.String(4)) + + call = sa.Column(sa.String(4)) + module_id = sa.Column(sa.String(64), index=True) + call_id = sa.Column(sa.String(64), index=True) + params = sa.Column(sa.JSON()) + + success = sa.Column(sa.SmallInteger(), default=0, nullable=False) + error = sa.Column(sa.SmallInteger(), default=0, nullable=False) + + spec_version_id = sa.Column(sa.Integer()) + + codec_error = sa.Column(sa.Boolean(), default=False) + + def serialize_id(self): + return '{}-{}'.format(self.block_id, self.extrinsic_idx) + + def serialize_formatting_hook(self, obj_dict): + + if self.account: + obj_dict['attributes']['account'] = self.account.serialize() + + if obj_dict['attributes'].get('address'): + obj_dict['attributes']['address_id'] = obj_dict['attributes']['address'].replace('0x', '') + obj_dict['attributes']['address'] = ss58_encode(obj_dict['attributes']['address'].replace('0x', ''), SUBSTRATE_ADDRESS_TYPE) + + for item in obj_dict['attributes'].get('params', []): + # SS58 format Addresses public keys + if item['type'] in ['Address', 'AccountId'] and item['value']: + self.format_address(item) + elif item['type'] in ['Vec
', 'Vec', 'Vec<::Source>'] and item['value']: + for idx, vec_item in enumerate(item['value']): + item['value'][idx] = { + 'name': idx, + 'type': 'Address', + 'value': ss58_encode(vec_item.replace('0x', ''), SUBSTRATE_ADDRESS_TYPE), + 'orig_value': vec_item.replace('0x', '') + } + elif item['type'] == 'Box': + for proposal_param in item['value'].get('call_args', []): + if proposal_param['type'] == 'Address': + self.format_address(proposal_param) + + return obj_dict + + +class Log(BaseModel): + __tablename__ = 'data_log' + + block_id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + log_idx = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + type_id = sa.Column(sa.Integer(), index=True) + type = sa.Column(sa.String(64)) + data = sa.Column(sa.JSON()) + + def serialize_id(self): + return '{}-{}'.format(self.block_id, self.log_idx) + + def serialize_formatting_hook(self, obj_dict): + + if self.type_id == LOG_TYPE_AUTHORITIESCHANGE: + + for idx, item in enumerate(obj_dict['attributes']['data']['value']): + obj_dict['attributes']['data']['value'][idx] = ss58_encode(item.replace('0x', ''), SUBSTRATE_ADDRESS_TYPE) + + return obj_dict + + +data_session = sa.Table('data_session', BaseModel.metadata, + sa.Column('id', sa.Integer(), primary_key=True, autoincrement=False), + sa.Column('start_at_block', sa.Integer()), + sa.Column('era', sa.Integer()), + sa.Column('era_idx', sa.Integer()), + sa.Column('created_at_block', sa.Integer(), nullable=False), + sa.Column('created_at_extrinsic', sa.Integer()), + sa.Column('created_at_event', sa.Integer()), + sa.Column('count_validators', sa.Integer()), + sa.Column('count_nominators', sa.Integer()) +) + + +data_session_total = sa.Table('data_session_total', BaseModel.metadata, + sa.Column('id', sa.Integer(), sa.ForeignKey('data_session.id'), primary_key=True, autoincrement=False), + sa.Column('end_at_block', sa.Integer()), + sa.Column('count_blocks', sa.Integer()) +) + + +class Session(BaseModel): + __table__ = sa.outerjoin(data_session, data_session_total) + + id = column_property( + data_session.c.id, + data_session_total.c.id + ) + + start_at_block = data_session.c.start_at_block + era = data_session.c.era + era_idx = data_session.c.era_idx + created_at_block = data_session.c.created_at_block + created_at_extrinsic = data_session.c.created_at_extrinsic + created_at_event = data_session.c.created_at_event + count_validators = data_session.c.count_validators + count_nominators = data_session.c.count_nominators + end_at_block = data_session_total.c.end_at_block + count_blocks = data_session_total.c.count_blocks + + +class SessionValidator(BaseModel): + __tablename__ = 'data_session_validator' + + session_id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + rank_validator = sa.Column(sa.Integer(), primary_key=True, autoincrement=False, index=True) + validator_stash = sa.Column(sa.String(64), index=True) + validator_stash_account = relationship(Account, foreign_keys=[validator_stash], primaryjoin=validator_stash == Account.id, lazy='subquery') + validator_controller = sa.Column(sa.String(64), index=True) + validator_controller_account = relationship(Account, foreign_keys=[validator_controller], + primaryjoin=validator_controller == Account.id) + validator_session = sa.Column(sa.String(64), index=True) + bonded_total = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + bonded_active = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + bonded_nominators = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + bonded_own = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + unlocking = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + count_nominators = sa.Column(sa.Integer(), nullable=True) + unstake_threshold = sa.Column(sa.Integer(), nullable=True) + commission = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True) + + def serialize_id(self): + return '{}-{}'.format(self.session_id, self.rank_validator) + + def serialize_formatting_hook(self, obj_dict): + + if self.validator_stash_account: + obj_dict['attributes']['validator_stash_account'] = self.validator_stash_account.serialize() + + obj_dict['attributes']['validator_stash_id'] = self.validator_stash + if self.validator_stash: + obj_dict['attributes']['validator_stash'] = ss58_encode(self.validator_stash.replace('0x', ''), + SUBSTRATE_ADDRESS_TYPE) + else: + obj_dict['attributes']['validator_stash'] = None + + obj_dict['attributes']['validator_controller_id'] = self.validator_controller + + if self.validator_controller: + obj_dict['attributes']['validator_controller'] = ss58_encode(self.validator_controller.replace('0x', ''), + SUBSTRATE_ADDRESS_TYPE) + else: + obj_dict['attributes']['validator_controller'] = None + + obj_dict['attributes']['validator_session_id'] = self.validator_session + if self.validator_session: + obj_dict['attributes']['validator_session'] = ss58_encode(self.validator_session.replace('0x', ''), + SUBSTRATE_ADDRESS_TYPE) + else: + obj_dict['attributes']['validator_session'] = None + + return obj_dict + + +class SessionNominator(BaseModel): + __tablename__ = 'data_session_nominator' + + session_id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + rank_validator = sa.Column(sa.Integer(), primary_key=True, autoincrement=False, index=True) + rank_nominator = sa.Column(sa.Integer(), primary_key=True, autoincrement=False, index=True) + nominator_stash = sa.Column(sa.String(64), index=True) + nominator_stash_account = relationship(Account, foreign_keys=[nominator_stash], + primaryjoin=nominator_stash == Account.id, lazy='subquery') + nominator_controller = sa.Column(sa.String(64), index=True, nullable=True) + bonded = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + + def serialize_id(self): + return '{}-{}-{}'.format(self.session_id, self.rank_validator, self.rank_nominator) + + def serialize_formatting_hook(self, obj_dict): + + if self.nominator_stash_account: + obj_dict['attributes']['nominator_stash_account'] = self.nominator_stash_account.serialize() + else: + obj_dict['attributes']['nominator_stash_account'] = { + 'type': 'account', + 'id': self.nominator_stash.replace('0x', ''), + 'attributes': { + 'id': self.nominator_stash.replace('0x', ''), + 'address': ss58_encode(self.nominator_stash.replace('0x', ''), SUBSTRATE_ADDRESS_TYPE) + } + } + + if self.nominator_controller: + obj_dict['attributes']['nominator_controller_id'] = self.nominator_controller + obj_dict['attributes']['nominator_controller'] = ss58_encode(self.nominator_controller.replace('0x', ''), + SUBSTRATE_ADDRESS_TYPE) + + return obj_dict + + +class AccountIndex(BaseModel): + __tablename__ = 'data_account_index' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + short_address = sa.Column(sa.String(24), index=True) + account_id = sa.Column(sa.String(64), index=True) + account = relationship(Account, foreign_keys=[account_id], primaryjoin=account_id == Account.id) + is_reclaimable = sa.Column(sa.Boolean, default=False) + is_reclaimed = sa.Column(sa.Boolean, default=False) + created_at_block = sa.Column(sa.Integer(), nullable=False) + updated_at_block = sa.Column(sa.Integer(), nullable=False) + + def serialize_id(self): + return self.short_address + + def serialize_formatting_hook(self, obj_dict): + obj_dict['attributes']['account_id'] = self.account_id + if self.account_id: + obj_dict['attributes']['address'] = ss58_encode(self.account_id.replace('0x', ''), SUBSTRATE_ADDRESS_TYPE) + else: + obj_dict['attributes']['address'] = None + + return obj_dict + + +class AccountIndexAudit(BaseModel): + __tablename__ = 'data_account_index_audit' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=True) + account_index_id = sa.Column(sa.Integer(), nullable=True, index=True) + account_id = sa.Column(sa.String(64), index=True, nullable=False) + block_id = sa.Column(sa.Integer(), index=True, nullable=False) + extrinsic_idx = sa.Column(sa.Integer()) + event_idx = sa.Column(sa.Integer()) + type_id = sa.Column(sa.Integer(), nullable=False) + data = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + + +class Contract(BaseModel): + __tablename__ = 'data_contract' + + code_hash = sa.Column(sa.String(64), primary_key=True) + bytecode = sa.Column(LONGTEXT()) + source = sa.Column(LONGTEXT()) + abi = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + compiler = sa.Column(sa.String(64)) + created_at_block = sa.Column(sa.Integer(), nullable=False) + created_at_extrinsic = sa.Column(sa.Integer()) + created_at_event = sa.Column(sa.Integer()) + + def serialize_id(self): + return self.code_hash + + +class Runtime(BaseModel): + __tablename__ = 'runtime' + + serialize_exclude = ['json_metadata', 'json_metadata_decoded'] + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + impl_name = sa.Column(sa.String(255)) + impl_version = sa.Column(sa.Integer()) + spec_version = sa.Column(sa.Integer(), nullable=False, unique=True) + spec_name = sa.Column(sa.String(255)) + authoring_version = sa.Column(sa.Integer()) + apis = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + json_metadata = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + json_metadata_decoded = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + count_modules = sa.Column(sa.Integer(), default=0, nullable=False) + count_call_functions = sa.Column(sa.Integer(), default=0, nullable=False) + count_storage_functions = sa.Column(sa.Integer(), default=0, nullable=False) + count_events = sa.Column(sa.Integer(), default=0, nullable=False) + count_constants = sa.Column(sa.Integer(), nullable=False, server_default='0') + count_errors = sa.Column(sa.Integer(), nullable=False, server_default='0') + + def serialize_id(self): + return self.spec_version + + +class RuntimeModule(BaseModel): + __tablename__ = 'runtime_module' + __table_args__ = (sa.UniqueConstraint('spec_version', 'module_id'),) + + id = sa.Column(sa.Integer(), primary_key=True) + spec_version = sa.Column(sa.Integer(), nullable=False) + module_id = sa.Column(sa.String(64), nullable=False) + prefix = sa.Column(sa.String(255)) + # TODO unused? + code = sa.Column(sa.String(255)) + name = sa.Column(sa.String(255)) + # TODO unused? + lookup = sa.Column(sa.String(4), index=True) + count_call_functions = sa.Column(sa.Integer(), nullable=False) + count_storage_functions = sa.Column(sa.Integer(), nullable=False) + count_events = sa.Column(sa.Integer(), nullable=False) + count_constants = sa.Column(sa.Integer(), nullable=False, server_default='0') + count_errors = sa.Column(sa.Integer(), nullable=False, server_default='0') + + def serialize_id(self): + return '{}-{}'.format(self.spec_version, self.module_id) + + +class RuntimeCall(BaseModel): + __tablename__ = 'runtime_call' + __table_args__ = (sa.UniqueConstraint('spec_version', 'module_id', 'call_id'),) + + id = sa.Column(sa.Integer(), primary_key=True) + spec_version = sa.Column(sa.Integer(), nullable=False) + module_id = sa.Column(sa.String(64), nullable=False) + call_id = sa.Column(sa.String(64), nullable=False) + index = sa.Column(sa.Integer(), nullable=False) + prefix = sa.Column(sa.String(255)) + code = sa.Column(sa.String(255)) + name = sa.Column(sa.String(255)) + lookup = sa.Column(sa.String(4), index=True) + documentation = sa.Column(sa.Text()) + count_params = sa.Column(sa.Integer(), nullable=False) + + def serialize_id(self): + return '{}-{}-{}'.format(self.spec_version, self.module_id, self.call_id) + + +class RuntimeCallParam(BaseModel): + __tablename__ = 'runtime_call_param' + __table_args__ = (sa.UniqueConstraint('runtime_call_id', 'name'),) + + id = sa.Column(sa.Integer(), primary_key=True) + runtime_call_id = sa.Column(sa.Integer(), nullable=False) + name = sa.Column(sa.String(255)) + type = sa.Column(sa.String(255)) + + +class RuntimeEvent(BaseModel): + __tablename__ = 'runtime_event' + __table_args__ = (sa.UniqueConstraint('spec_version', 'module_id', 'event_id'),) + + id = sa.Column(sa.Integer(), primary_key=True) + spec_version = sa.Column(sa.Integer(), nullable=False) + module_id = sa.Column(sa.String(64), nullable=False) + event_id = sa.Column(sa.String(64), nullable=False) + index = sa.Column(sa.Integer(), nullable=False) + prefix = sa.Column(sa.String(255)) + code = sa.Column(sa.String(255)) + name = sa.Column(sa.String(255)) + lookup = sa.Column(sa.String(4), index=True) + documentation = sa.Column(sa.Text()) + count_attributes = sa.Column(sa.Integer(), nullable=False) + + def serialize_id(self): + return '{}-{}-{}'.format(self.spec_version, self.module_id, self.event_id) + + +class RuntimeEventAttribute(BaseModel): + __tablename__ = 'runtime_event_attribute' + __table_args__ = (sa.UniqueConstraint('runtime_event_id', 'index'),) + + id = sa.Column(sa.Integer(), primary_key=True) + runtime_event_id = sa.Column(sa.Integer(), nullable=False) + index = sa.Column(sa.Integer(), nullable=False) + type = sa.Column(sa.String(255)) + + +class RuntimeStorage(BaseModel): + __tablename__ = 'runtime_storage' + + id = sa.Column(sa.Integer(), primary_key=True) + spec_version = sa.Column(sa.Integer()) + module_id = sa.Column(sa.String(64)) + storage_key = sa.Column(sa.String(32)) + index = sa.Column(sa.Integer()) + name = sa.Column(sa.String(255)) + lookup = sa.Column(sa.String(4), index=True) + default = sa.Column(sa.String(255)) + modifier = sa.Column(sa.String(64)) + type_hasher = sa.Column(sa.String(255)) + type_key1 = sa.Column(sa.String(255)) + type_key2 = sa.Column(sa.String(255)) + type_value = sa.Column(sa.String(255)) + type_is_linked = sa.Column(sa.SmallInteger()) + type_key2hasher = sa.Column(sa.String(255)) + documentation = sa.Column(sa.Text()) + + def serialize_id(self): + return '{}-{}-{}'.format(self.spec_version, self.module_id, self.name) + + +class RuntimeConstant(BaseModel): + __tablename__ = 'runtime_constant' + + id = sa.Column(sa.Integer(), primary_key=True) + spec_version = sa.Column(sa.Integer()) + module_id = sa.Column(sa.String(64)) + index = sa.Column(sa.Integer()) + name = sa.Column(sa.String(255), index=True) + type = sa.Column(sa.String(255)) + value = sa.Column(sa.String(255)) + documentation = sa.Column(sa.Text()) + + def serialize_id(self): + return '{}-{}-{}'.format(self.spec_version, self.module_id, self.name) + + +class RuntimeErrorMessage(BaseModel): + __tablename__ = 'runtime_error' + + id = sa.Column(sa.Integer(), primary_key=True) + spec_version = sa.Column(sa.Integer()) + module_id = sa.Column(sa.String(64)) + module_index = sa.Column(sa.Integer()) + index = sa.Column(sa.Integer()) + name = sa.Column(sa.String(255), index=True) + documentation = sa.Column(sa.Text()) + + def serialize_id(self): + return '{}-{}-{}'.format(self.spec_version, self.module_id, self.index) + + +class RuntimeType(BaseModel): + __tablename__ = 'runtime_type' + __table_args__ = (sa.UniqueConstraint('spec_version', 'type_string'),) + + id = sa.Column(sa.Integer(), primary_key=True) + spec_version = sa.Column(sa.Integer(), nullable=False) + type_string = sa.Column(sa.String(255)) + decoder_class = sa.Column(sa.String(255), nullable=True) + is_primitive_runtime = sa.Column(sa.Boolean(), default=False) + is_primitive_core = sa.Column(sa.Boolean(), default=False) + + def serialize_id(self): + return '{}-{}'.format(self.spec_version, self.type_string) + + +class IdentityJudgement(BaseModel): + __tablename__ = 'data_identity_judgement' + + registrar_index = sa.Column(sa.Integer(), primary_key=True) + account_id = sa.Column(sa.String(64), primary_key=True, index=True) + judgement = sa.Column(sa.String(32)) + created_at_block = sa.Column(sa.Integer(), nullable=False) + updated_at_block = sa.Column(sa.Integer(), nullable=False) + + +class SearchIndex(BaseModel): + __tablename__ = 'data_account_search_index' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=True) + block_id = sa.Column(sa.Integer(), nullable=False, index=True) + extrinsic_idx = sa.Column(sa.Integer(), nullable=True, index=True) + event_idx = sa.Column(sa.Integer(), nullable=True, index=True) + account_id = sa.Column(sa.String(64), nullable=True, index=True) + index_type_id = sa.Column(sa.Integer(), nullable=False, index=True) + sorting_value = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True, index=True) + + +class SearchIndexType(BaseModel): + __tablename__ = 'data_account_search_index_type' + + id = sa.Column(sa.Integer(), primary_key=True) + name = sa.Column(sa.String(64), nullable=False, index=True) + diff --git a/pm-explorer-api/app/resources/__init__.py b/pm-explorer-api/app/resources/__init__.py new file mode 100644 index 00000000..1e77ade1 --- /dev/null +++ b/pm-explorer-api/app/resources/__init__.py @@ -0,0 +1,21 @@ +# Polkascan PRE Explorer API +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# __init__.py + + diff --git a/pm-explorer-api/app/resources/base.py b/pm-explorer-api/app/resources/base.py new file mode 100644 index 00000000..903901bf --- /dev/null +++ b/pm-explorer-api/app/resources/base.py @@ -0,0 +1,190 @@ +# Polkascan PRE Explorer API +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# base.py +from abc import ABC, abstractmethod + +import falcon +from dogpile.cache import CacheRegion +from dogpile.cache.api import NO_VALUE +from sqlalchemy.orm import Session + +from app.models.base import BaseModel +from app.settings import MAX_RESOURCE_PAGE_SIZE, DOGPILE_CACHE_SETTINGS + + +class BaseResource(object): + + session: Session + cache_region: CacheRegion + + +class JSONAPIResource(BaseResource): + + cache_expiration_time = None + + def apply_filters(self, query, params): + return query + + def get_meta(self): + return {} + + def serialize_item(self, item): + return item.serialize() + + def process_get_response(self, req, resp, **kwargs): + return { + 'status': falcon.HTTP_200, + 'media': self.get_jsonapi_response(data=None), + 'cacheable': False + } + + def get_jsonapi_response(self, data, meta=None, errors=None, links=None, relationships=None, included=None): + + result = { + 'meta': { + "authors": [ + "WEB3SCAN", + "POLKASCAN", + "openAware BV" + ] + }, + 'errors': [], + "data": data, + "links": {} + } + + if meta: + result['meta'].update(meta) + + if errors: + result['errors'] = errors + + if links: + result['links'] = links + + if included: + result['included'] = included + + if relationships: + result['data']['relationships'] = {} + + if 'included' not in result: + result['included'] = [] + + for key, objects in relationships.items(): + result['data']['relationships'][key] = {'data': [{'type': obj.serialize_type, 'id': obj.serialize_id()} for obj in objects]} + result['included'] += [obj.serialize() for obj in objects] + + return result + + def on_get(self, req, resp, **kwargs): + + cache_key = '{}-{}'.format(req.method, req.url) + + if self.cache_expiration_time: + # Try to retrieve request from cache + cache_response = self.cache_region.get(cache_key, self.cache_expiration_time) + + if cache_response is not NO_VALUE: + resp.set_header('X-Cache', 'HIT') + + else: + # Process request + cache_response = self.process_get_response(req, resp, **kwargs) + + if cache_response.get('cacheable'): + # Store result in cache + self.cache_region.set(cache_key, cache_response) + resp.set_header('X-Cache', 'MISS') + else: + cache_response = self.process_get_response(req, resp, **kwargs) + + resp.status = cache_response.get('status') + resp.media = cache_response.get('media') + + +class JSONAPIListResource(JSONAPIResource, ABC): + + cache_expiration_time = DOGPILE_CACHE_SETTINGS['default_list_cache_expiration_time'] + + def get_included_items(self, items): + return [] + + @abstractmethod + def get_query(self): + raise NotImplementedError() + + def apply_paging(self, query, params): + page = int(params.get('page[number]', 1)) - 1 + page_size = min(int(params.get('page[size]', 25)), MAX_RESOURCE_PAGE_SIZE) + return query[page * page_size: page * page_size + page_size] + + def process_get_response(self, req, resp, **kwargs): + items = self.get_query() + items = self.apply_filters(items, req.params) + items = self.apply_paging(items, req.params) + + return { + 'status': falcon.HTTP_200, + 'media': self.get_jsonapi_response( + data=[self.serialize_item(item) for item in items], + meta=self.get_meta(), + included=self.get_included_items(items) + ), + 'cacheable': True + } + + +class JSONAPIDetailResource(JSONAPIResource, ABC): + + cache_expiration_time = DOGPILE_CACHE_SETTINGS['default_detail_cache_expiration_time'] + + def get_item_url_name(self): + return 'item_id' + + @abstractmethod + def get_item(self, item_id): + raise NotImplementedError() + + def get_relationships(self, include_list, item): + return {} + + def process_get_response(self, req, resp, **kwargs): + item = self.get_item(kwargs.get(self.get_item_url_name())) + + if not item: + response = { + 'status': falcon.HTTP_404, + 'media': None, + 'cacheable': False + } + + else: + + response = { + 'status': falcon.HTTP_200, + 'media': self.get_jsonapi_response( + data=self.serialize_item(item), + relationships=self.get_relationships(req.params.get('include', []), item), + meta=self.get_meta() + ), + 'cacheable': True + } + + return response diff --git a/pm-explorer-api/app/resources/polkascan.py b/pm-explorer-api/app/resources/polkascan.py new file mode 100644 index 00000000..323ff811 --- /dev/null +++ b/pm-explorer-api/app/resources/polkascan.py @@ -0,0 +1,1250 @@ +# Polkascan PRE Explorer API +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# polkascan.py +from hashlib import blake2b + +import binascii + +import falcon +import pytz +from dogpile.cache.api import NO_VALUE +from scalecodec.type_registry import load_type_registry_preset +from sqlalchemy import func, tuple_, or_ +from sqlalchemy.orm import defer, subqueryload, lazyload, lazyload_all + +from app import settings +from app.models.data import Block, Extrinsic, Event, RuntimeCall, RuntimeEvent, Runtime, RuntimeModule, \ + RuntimeCallParam, RuntimeEventAttribute, RuntimeType, RuntimeStorage, Account, Session, Contract, \ + BlockTotal, SessionValidator, Log, AccountIndex, RuntimeConstant, SessionNominator, \ + RuntimeErrorMessage, SearchIndex, AccountInfoSnapshot +from app.resources.base import JSONAPIResource, JSONAPIListResource, JSONAPIDetailResource, BaseResource +from app.utils.ss58 import ss58_decode, ss58_encode +from scalecodec.base import RuntimeConfiguration +from substrateinterface import SubstrateInterface + + +class BlockDetailsResource(JSONAPIDetailResource): + + def get_item_url_name(self): + return 'block_id' + + def get_item(self, item_id): + if item_id.isnumeric(): + return Block.query(self.session).filter_by(id=item_id).first() + else: + return Block.query(self.session).filter_by(hash=item_id).first() + + def get_relationships(self, include_list, item): + relationships = {} + + if 'extrinsics' in include_list: + relationships['extrinsics'] = Extrinsic.query(self.session).filter_by(block_id=item.id).order_by( + 'extrinsic_idx') + if 'transactions' in include_list: + relationships['transactions'] = Extrinsic.query(self.session).options(defer('params')).filter_by(block_id=item.id, signed=1).order_by( + 'extrinsic_idx') + if 'inherents' in include_list: + relationships['inherents'] = Extrinsic.query(self.session).options(defer('params')).filter_by(block_id=item.id, signed=0).order_by( + 'extrinsic_idx') + if 'events' in include_list: + relationships['events'] = Event.query(self.session).filter_by(block_id=item.id).order_by( + 'event_idx') + if 'logs' in include_list: + relationships['logs'] = Log.query(self.session).filter_by(block_id=item.id).order_by( + 'log_idx') + + return relationships + + +class BlockListResource(JSONAPIListResource): + + def get_query(self): + return Block.query(self.session).order_by( + Block.id.desc() + ) + + +class BlockTotalDetailsResource(JSONAPIDetailResource): + + def get_item(self, item_id): + if item_id.isnumeric(): + return BlockTotal.query(self.session).get(item_id) + else: + block = Block.query(self.session).filter_by(hash=item_id).first() + if block: + return BlockTotal.query(self.session).get(block.id) + + def serialize_item(self, item): + # Exclude large params from list view + data = item.serialize() + + # Include author account + if item.author_account: + data['attributes']['author_account'] = item.author_account.serialize() + return data + + def serialize_item(self, item): + # Exclude large params from list view + data = item.serialize() + + # Include author account + if item.author_account: + data['attributes']['author_account'] = item.author_account.serialize() + return data + + +class BlockTotalListResource(JSONAPIListResource): + + def get_query(self): + return BlockTotal.query(self.session).order_by( + BlockTotal.id.desc() + ) + + def apply_filters(self, query, params): + + if params.get('filter[author]'): + + if len(params.get('filter[author]')) == 64: + account_id = params.get('filter[author]') + else: + try: + account_id = ss58_decode(params.get('filter[author]'), settings.SUBSTRATE_ADDRESS_TYPE) + except ValueError: + return query.filter(False) + + query = query.filter_by(author=account_id) + + return query + + +class ExtrinsicListResource(JSONAPIListResource): + + exclude_params = True + + def get_query(self): + return Extrinsic.query(self.session).options(defer('params')).order_by( + Extrinsic.block_id.desc() + ) + + def serialize_item(self, item): + # Exclude large params from list view + + if self.exclude_params: + data = item.serialize(exclude=['params']) + else: + data = item.serialize() + + # Add account as relationship + if item.account: + # data['relationships'] = {'account': {"type": "account", "id": item.account.id}} + data['attributes']['account'] = item.account.serialize() + return data + + # def get_included_items(self, items): + # # Include account items + # return [item.account.serialize() for item in items if item.account] + + def apply_filters(self, query, params): + + if params.get('filter[address]'): + + if len(params.get('filter[address]')) == 64: + account_id = params.get('filter[address]') + else: + try: + account_id = ss58_decode(params.get('filter[address]'), settings.SUBSTRATE_ADDRESS_TYPE) + except ValueError: + return query.filter(False) + else: + account_id = None + + if params.get('filter[search_index]'): + + self.exclude_params = False + + if type(params.get('filter[search_index]')) != list: + params['filter[search_index]'] = [params.get('filter[search_index]')] + + search_index = SearchIndex.query(self.session).filter( + SearchIndex.index_type_id.in_(params.get('filter[search_index]')), + SearchIndex.account_id == account_id + ).order_by(SearchIndex.sorting_value.desc()) + + query = query.filter(tuple_(Extrinsic.block_id, Extrinsic.extrinsic_idx).in_( + [[s.block_id, s.extrinsic_idx] for s in search_index] + )) + else: + + self.exclude_params = True + + if params.get('filter[signed]'): + + query = query.filter_by(signed=params.get('filter[signed]')) + + if params.get('filter[module_id]'): + + query = query.filter_by(module_id=params.get('filter[module_id]')) + + if params.get('filter[call_id]'): + + query = query.filter_by(call_id=params.get('filter[call_id]')) + + if params.get('filter[address]'): + + query = query.filter_by(address=account_id) + + return query + + +class ExtrinsicDetailResource(JSONAPIDetailResource): + + def get_item_url_name(self): + return 'extrinsic_id' + + def get_item(self, item_id): + + if item_id[0:2] == '0x': + extrinsic = Extrinsic.query(self.session).filter_by(extrinsic_hash=item_id[2:]).first() + else: + + if len(item_id.split('-')) != 2: + return None + + extrinsic = Extrinsic.query(self.session).get(item_id.split('-')) + + return extrinsic + + def get_relationships(self, include_list, item): + relationships = {} + + if 'events' in include_list: + relationships['events'] = Event.query(self.session).filter_by( + block_id=item.block_id, + extrinsic_idx=item.extrinsic_idx + ).order_by('event_idx') + + return relationships + + def check_params(self, params, identifier): + for idx, param in enumerate(params): + + if 'value' in param and 'type' in param: + + if type(param['value']) is list: + param['value'] = self.check_params(param['value'], identifier) + + else: + if param['type'] == 'Box': + param['value']['call_args'] = self.check_params(param['value']['call_args'], identifier) + + elif type(param['value']) is str and len(param['value']) > 200000: + param['value'] = "{}/{}".format( + identifier, + blake2b(bytes.fromhex(param['value'].replace('0x', '')), digest_size=32).digest().hex() + ) + param["type"] = "DownloadableBytesHash" + param['valueRaw'] = "" + + return params + + def serialize_item(self, item): + data = item.serialize() + + runtime_call = RuntimeCall.query(self.session).filter_by( + module_id=item.module_id, + call_id=item.call_id, + spec_version=item.spec_version_id + ).first() + + data['attributes']['documentation'] = runtime_call.documentation + + block = Block.query(self.session).get(item.block_id) + + data['attributes']['datetime'] = block.datetime.replace(tzinfo=pytz.UTC).isoformat() + + if item.account: + data['attributes']['account'] = item.account.serialize() + + if item.params: + item.params = self.check_params(item.params, item.serialize_id()) + + if item.error: + # Retrieve ExtrinsicFailed event + extrinsic_failed_event = Event.query(self.session).filter_by( + block_id=item.block_id, + event_id='ExtrinsicFailed' + ).first() + + # Retrieve runtime error + if extrinsic_failed_event: + if 'Module' in extrinsic_failed_event.attributes[0]['value']: + + error = RuntimeErrorMessage.query(self.session).filter_by( + module_index=extrinsic_failed_event.attributes[0]['value']['Module']['index'], + index=extrinsic_failed_event.attributes[0]['value']['Module']['error'], + spec_version=item.spec_version_id + ).first() + + if error: + data['attributes']['error_message'] = error.documentation + elif 'BadOrigin' in extrinsic_failed_event.attributes[0]['value']: + data['attributes']['error_message'] = 'Bad origin' + elif 'CannotLookup' in extrinsic_failed_event.attributes[0]['value']: + data['attributes']['error_message'] = 'Cannot lookup' + + return data + + +class EventsListResource(JSONAPIListResource): + + def apply_filters(self, query, params): + + if params.get('filter[address]'): + + if len(params.get('filter[address]')) == 64: + account_id = params.get('filter[address]') + else: + try: + account_id = ss58_decode(params.get('filter[address]'), settings.SUBSTRATE_ADDRESS_TYPE) + except ValueError: + return query.filter(False) + else: + account_id = None + + if params.get('filter[search_index]'): + + if type(params.get('filter[search_index]')) != list: + params['filter[search_index]'] = [params.get('filter[search_index]')] + + search_index = SearchIndex.query(self.session).filter( + SearchIndex.index_type_id.in_(params.get('filter[search_index]')), + SearchIndex.account_id == account_id + ).order_by(SearchIndex.sorting_value.desc()) + + query = query.filter(tuple_(Event.block_id, Event.event_idx).in_( + [[s.block_id, s.event_idx] for s in search_index] + )) + else: + + if params.get('filter[module_id]'): + query = query.filter_by(module_id=params.get('filter[module_id]')) + + if params.get('filter[event_id]'): + + query = query.filter_by(event_id=params.get('filter[event_id]')) + else: + query = query.filter(Event.event_id.notin_(['ExtrinsicSuccess', 'ExtrinsicFailed'])) + + return query + + def get_query(self): + return Event.query(self.session).order_by( + Event.block_id.desc() + ) + + +class EventDetailResource(JSONAPIDetailResource): + + def get_item_url_name(self): + return 'event_id' + + def get_item(self, item_id): + if len(item_id.split('-')) != 2: + return None + return Event.query(self.session).get(item_id.split('-')) + + def serialize_item(self, item): + data = item.serialize() + + runtime_event = RuntimeEvent.query(self.session).filter_by( + module_id=item.module_id, + event_id=item.event_id, + spec_version=item.spec_version_id + ).first() + + data['attributes']['documentation'] = runtime_event.documentation + + return data + + +class LogListResource(JSONAPIListResource): + + def get_query(self): + return Log.query(self.session).order_by( + Log.block_id.desc() + ) + + +class LogDetailResource(JSONAPIDetailResource): + + def get_item(self, item_id): + if len(item_id.split('-')) != 2: + return None + return Log.query(self.session).get(item_id.split('-')) + + +class NetworkStatisticsResource(JSONAPIResource): + + cache_expiration_time = 6 + + def on_get(self, req, resp, network_id=None): + resp.status = falcon.HTTP_200 + + # TODO make caching more generic for custom resources + + cache_key = '{}-{}'.format(req.method, req.url) + + response = self.cache_region.get(cache_key, self.cache_expiration_time) + + if response is NO_VALUE: + + best_block = BlockTotal.query(self.session).filter_by(id=self.session.query(func.max(BlockTotal.id)).one()[0]).first() + if best_block: + response = self.get_jsonapi_response( + data={ + 'type': 'networkstats', + 'id': network_id, + 'attributes': { + 'best_block': best_block.id, + 'total_signed_extrinsics': int(best_block.total_extrinsics_signed), + 'total_events': int(best_block.total_events), + 'total_events_module': int(best_block.total_events_module), + 'total_blocks': 'N/A', + 'total_accounts': int(best_block.total_accounts), + 'total_runtimes': Runtime.query(self.session).count() + } + }, + ) + else: + response = self.get_jsonapi_response( + data={ + 'type': 'networkstats', + 'id': network_id, + 'attributes': { + 'best_block': 0, + 'total_signed_extrinsics': 0, + 'total_events': 0, + 'total_events_module': 0, + 'total_blocks': 'N/A', + 'total_accounts': 0, + 'total_runtimes': 0 + } + }, + ) + self.cache_region.set(cache_key, response) + resp.set_header('X-Cache', 'MISS') + else: + resp.set_header('X-Cache', 'HIT') + + resp.media = response + + +class BalanceTransferListResource(JSONAPIListResource): + + def get_query(self): + return Event.query(self.session).filter( + Event.module_id == 'balances', Event.event_id == 'Transfer' + ).order_by(Event.block_id.desc()) + + def apply_filters(self, query, params): + if params.get('filter[address]'): + + if len(params.get('filter[address]')) == 64: + account_id = params.get('filter[address]') + else: + try: + account_id = ss58_decode(params.get('filter[address]'), settings.SUBSTRATE_ADDRESS_TYPE) + except ValueError: + return query.filter(False) + + search_index = SearchIndex.query(self.session).filter( + SearchIndex.index_type_id.in_([ + settings.SEARCH_INDEX_BALANCETRANSFER, + settings.SEARCH_INDEX_CLAIMS_CLAIMED, + settings.SEARCH_INDEX_BALANCES_DEPOSIT, + settings.SEARCH_INDEX_STAKING_REWARD + ]), + SearchIndex.account_id == account_id + ).order_by(SearchIndex.sorting_value.desc()) + + query = Event.query(self.session).filter(tuple_(Event.block_id, Event.event_idx).in_( + [[s.block_id, s.event_idx] for s in search_index] + )).order_by(Event.block_id.desc()) + + + return query + + def serialize_item(self, item): + + if item.event_id == 'Transfer': + + sender = Account.query(self.session).get(item.attributes[0]['value'].replace('0x', '')) + + if sender: + sender_data = sender.serialize() + else: + sender_data = { + 'type': 'account', + 'id': item.attributes[0]['value'].replace('0x', ''), + 'attributes': { + 'id': item.attributes[0]['value'].replace('0x', ''), + 'address': ss58_encode(item.attributes[0]['value'].replace('0x', ''), settings.SUBSTRATE_ADDRESS_TYPE) + } + } + + destination = Account.query(self.session).get(item.attributes[1]['value'].replace('0x', '')) + + if destination: + destination_data = destination.serialize() + else: + destination_data = { + 'type': 'account', + 'id': item.attributes[1]['value'].replace('0x', ''), + 'attributes': { + 'id': item.attributes[1]['value'].replace('0x', ''), + 'address': ss58_encode(item.attributes[1]['value'].replace('0x', ''), settings.SUBSTRATE_ADDRESS_TYPE) + } + } + # Some networks don't have fees + if len(item.attributes) == 4: + fee = item.attributes[3]['value'] + else: + fee = 0 + + value = item.attributes[2]['value'] + elif item.event_id == 'Claimed': + + fee = 0 + sender_data = {'name': 'Claim', 'eth_address': item.attributes[1]['value']} + destination_data = {} + value = item.attributes[2]['value'] + + elif item.event_id == 'Deposit': + + fee = 0 + sender_data = {'name': 'Deposit'} + destination_data = {} + value = item.attributes[1]['value'] + + elif item.event_id == 'Reward': + fee = 0 + sender_data = {'name': 'Staking reward'} + destination_data = {} + value = item.attributes[1]['value'] + else: + sender_data = {} + fee = 0 + destination_data = {} + value = None + + return { + 'type': 'balancetransfer', + 'id': '{}-{}'.format(item.block_id, item.event_idx), + 'attributes': { + 'block_id': item.block_id, + 'event_id': item.event_id, + 'event_idx': '{}-{}'.format(item.block_id, item.event_idx), + 'sender': sender_data, + 'destination': destination_data, + 'value': value, + 'fee': fee + } + } + + +class BalanceTransferDetailResource(JSONAPIDetailResource): + + def get_item(self, item_id): + return Event.query(self.session).get(item_id.split('-')) + + def serialize_item(self, item): + + sender = Account.query(self.session).get(item.attributes[0]['value'].replace('0x', '')) + + if sender: + sender_data = sender.serialize() + else: + sender_data = { + 'type': 'account', + 'id': item.attributes[0]['value'].replace('0x', ''), + 'attributes': { + 'id': item.attributes[0]['value'].replace('0x', ''), + 'address': ss58_encode(item.attributes[0]['value'].replace('0x', ''), settings.SUBSTRATE_ADDRESS_TYPE) + } + } + + destination = Account.query(self.session).get(item.attributes[1]['value'].replace('0x', '')) + + if destination: + destination_data = destination.serialize() + else: + destination_data = { + 'type': 'account', + 'id': item.attributes[1]['value'].replace('0x', ''), + 'attributes': { + 'id': item.attributes[1]['value'].replace('0x', ''), + 'address': ss58_encode(item.attributes[1]['value'].replace('0x', ''), settings.SUBSTRATE_ADDRESS_TYPE) + } + } + + # Some networks don't have fees + if len(item.attributes) == 4: + fee = item.attributes[3]['value'] + else: + fee = 0 + + return { + 'type': 'balancetransfer', + 'id': '{}-{}'.format(item.block_id, item.event_idx), + 'attributes': { + 'block_id': item.block_id, + 'event_idx': '{}-{}'.format(item.block_id, item.event_idx), + 'sender': sender_data, + 'destination': destination_data, + 'value': item.attributes[2]['value'], + 'fee': fee + } + } + + +class AccountResource(JSONAPIListResource): + + def get_query(self): + return Account.query(self.session).order_by( + Account.balance_total.desc() + ) + + def apply_filters(self, query, params): + + if params.get('filter[is_validator]'): + query = query.filter_by(is_validator=True) + + if params.get('filter[is_nominator]'): + query = query.filter_by(is_nominator=True) + + if params.get('filter[is_council_member]'): + query = query.filter_by(is_council_member=True) + + if params.get('filter[is_registrar]'): + query = query.filter_by(is_registrar=True) + + if params.get('filter[is_sudo]'): + query = query.filter_by(is_sudo=True) + + if params.get('filter[is_tech_comm_member]'): + query = query.filter_by(is_tech_comm_member=True) + + if params.get('filter[is_treasury]'): + query = query.filter_by(is_treasury=True) + + if params.get('filter[was_validator]'): + query = query.filter_by(was_validator=True) + + if params.get('filter[was_nominator]'): + query = query.filter_by(was_nominator=True) + + if params.get('filter[was_council_member]'): + query = query.filter_by(was_council_member=True) + + if params.get('filter[was_registrar]'): + query = query.filter_by(was_registrar=True) + + if params.get('filter[was_sudo]'): + query = query.filter_by(was_sudo=True) + + if params.get('filter[was_tech_comm_member]'): + query = query.filter_by(was_tech_comm_member=True) + + if params.get('filter[has_identity]'): + query = query.filter_by(has_identity=True, identity_judgement_bad=0) + + if params.get('filter[has_subidentity]'): + query = query.filter_by(has_subidentity=True, identity_judgement_bad=0) + + if params.get('filter[identity_judgement_good]'): + query = query.filter(Account.identity_judgement_good > 0, Account.identity_judgement_bad == 0) + + if params.get('filter[blacklist]'): + query = query.filter(Account.identity_judgement_bad > 0) + + return query + + +class AccountDetailResource(JSONAPIDetailResource): + + cache_expiration_time = 12 + + def __init__(self): + RuntimeConfiguration().update_type_registry(load_type_registry_preset('default')) + if settings.TYPE_REGISTRY != 'default': + RuntimeConfiguration().update_type_registry(load_type_registry_preset(settings.TYPE_REGISTRY)) + super(AccountDetailResource, self).__init__() + + def get_item(self, item_id): + return Account.query(self.session).filter(or_(Account.address == item_id, Account.index_address == item_id)).first() + + def get_relationships(self, include_list, item): + relationships = {} + + if 'recent_extrinsics' in include_list: + relationships['recent_extrinsics'] = Extrinsic.query(self.session).filter_by( + address=item.id).order_by(Extrinsic.block_id.desc())[:10] + + if 'indices' in include_list: + relationships['indices'] = AccountIndex.query(self.session).filter_by( + account_id=item.id).order_by(AccountIndex.updated_at_block.desc()) + + return relationships + + def serialize_item(self, item): + data = item.serialize() + + # Get balance history + account_info_snapshot = AccountInfoSnapshot.query(self.session).filter_by( + account_id=item.id + ).order_by(AccountInfoSnapshot.block_id.desc())[:1000] + + data['attributes']['balance_history'] = [ + { + 'name': "Total balance", + 'type': 'line', + 'data': [ + [item.block_id, float((item.balance_total or 0) / 10**settings.SUBSTRATE_TOKEN_DECIMALS)] + for item in reversed(account_info_snapshot) + ], + } + ] + + if settings.USE_NODE_RETRIEVE_BALANCES == 'True': + + substrate = SubstrateInterface(settings.SUBSTRATE_RPC_URL) + + if settings.SUBSTRATE_STORAGE_BALANCE == 'Account': + storage_call = RuntimeStorage.query(self.session).filter_by( + module_id='system', + name='Account', + ).order_by(RuntimeStorage.spec_version.desc()).first() + + if storage_call: + account_data = substrate.get_storage( + block_hash=None, + module='System', + function='Account', + params=item.id, + return_scale_type=storage_call.type_value, + hasher=storage_call.type_hasher, + metadata_version=settings.SUBSTRATE_METADATA_VERSION + ) + + if account_data: + data['attributes']['free_balance'] = account_data['data']['free'] + data['attributes']['reserved_balance'] = account_data['data']['reserved'] + data['attributes']['misc_frozen_balance'] = account_data['data']['miscFrozen'] + data['attributes']['fee_frozen_balance'] = account_data['data']['feeFrozen'] + data['attributes']['nonce'] = account_data['nonce'] + + elif settings.SUBSTRATE_STORAGE_BALANCE == 'Balances.Account': + + storage_call = RuntimeStorage.query(self.session).filter_by( + module_id='balances', + name='Account', + ).order_by(RuntimeStorage.spec_version.desc()).first() + + if storage_call: + account_data = substrate.get_storage( + block_hash=None, + module='Balances', + function='Account', + params=item.id, + return_scale_type=storage_call.type_value, + hasher=storage_call.type_hasher, + metadata_version=settings.SUBSTRATE_METADATA_VERSION + ) + + if account_data: + data['attributes']['balance_free'] = account_data['free'] + data['attributes']['balance_reserved'] = account_data['reserved'] + data['attributes']['misc_frozen_balance'] = account_data['miscFrozen'] + data['attributes']['fee_frozen_balance'] = account_data['feeFrozen'] + data['attributes']['nonce'] = None + else: + + storage_call = RuntimeStorage.query(self.session).filter_by( + module_id='balances', + name='FreeBalance', + ).order_by(RuntimeStorage.spec_version.desc()).first() + + if storage_call: + data['attributes']['free_balance'] = substrate.get_storage( + block_hash=None, + module='Balances', + function='FreeBalance', + params=item.id, + return_scale_type=storage_call.type_value, + hasher=storage_call.type_hasher, + metadata_version=settings.SUBSTRATE_METADATA_VERSION + ) + + storage_call = RuntimeStorage.query(self.session).filter_by( + module_id='balances', + name='ReservedBalance', + ).order_by(RuntimeStorage.spec_version.desc()).first() + + if storage_call: + data['attributes']['reserved_balance'] = substrate.get_storage( + block_hash=None, + module='Balances', + function='ReservedBalance', + params=item.id, + return_scale_type=storage_call.type_value, + hasher=storage_call.type_hasher, + metadata_version=settings.SUBSTRATE_METADATA_VERSION + ) + + storage_call = RuntimeStorage.query(self.session).filter_by( + module_id='system', + name='AccountNonce', + ).order_by(RuntimeStorage.spec_version.desc()).first() + + if storage_call: + + data['attributes']['nonce'] = substrate.get_storage( + block_hash=None, + module='System', + function='AccountNonce', + params=item.id, + return_scale_type=storage_call.type_value, + hasher=storage_call.type_hasher, + metadata_version=settings.SUBSTRATE_METADATA_VERSION + ) + + return data + + +class AccountIndexListResource(JSONAPIListResource): + + def get_query(self): + return AccountIndex.query(self.session).order_by( + AccountIndex.updated_at_block.desc() + ) + + +class AccountIndexDetailResource(JSONAPIDetailResource): + + def get_item(self, item_id): + return AccountIndex.query(self.session).filter_by(short_address=item_id).first() + + def get_relationships(self, include_list, item): + relationships = {} + + if 'recent_extrinsics' in include_list: + relationships['recent_extrinsics'] = Extrinsic.query(self.session).filter_by( + address=item.account_id).order_by(Extrinsic.block_id.desc())[:10] + + return relationships + + def serialize_item(self, item): + data = item.serialize() + + if item.account: + data['attributes']['account'] = item.account.serialize() + + return data + + +class SessionListResource(JSONAPIListResource): + + cache_expiration_time = 60 + + def get_query(self): + return Session.query(self.session).order_by( + Session.id.desc() + ) + + +class SessionDetailResource(JSONAPIDetailResource): + + def get_item(self, item_id): + return Session.query(self.session).get(item_id) + + def get_relationships(self, include_list, item): + relationships = {} + + if 'blocks' in include_list: + relationships['blocks'] = Block.query(self.session).filter_by( + session_id=item.id + ).order_by(Block.id.desc()) + + if 'validators' in include_list: + relationships['validators'] = SessionValidator.query(self.session).filter_by( + session_id=item.id + ).order_by(SessionValidator.rank_validator) + + return relationships + + +class SessionValidatorListResource(JSONAPIListResource): + + cache_expiration_time = 60 + + def get_query(self): + return SessionValidator.query(self.session).order_by( + SessionValidator.session_id, SessionValidator.rank_validator + ) + + def apply_filters(self, query, params): + + if params.get('filter[latestSession]'): + + session = Session.query(self.session).order_by(Session.id.desc()).first() + + query = query.filter_by(session_id=session.id) + + return query + + +class SessionValidatorDetailResource(JSONAPIDetailResource): + + def get_item(self, item_id): + + if len(item_id.split('-')) != 2: + return None + + session_id, rank_validator = item_id.split('-') + return SessionValidator.query(self.session).filter_by( + session_id=session_id, + rank_validator=rank_validator + ).first() + + def get_relationships(self, include_list, item): + relationships = {} + + if 'nominators' in include_list: + relationships['nominators'] = SessionNominator.query(self.session).filter_by( + session_id=item.session_id, rank_validator=item.rank_validator + ).order_by(SessionNominator.rank_nominator) + + return relationships + + def serialize_item(self, item): + data = item.serialize() + + if item.validator_stash_account: + data['attributes']['validator_stash_account'] = item.validator_stash_account.serialize() + + if item.validator_controller_account: + data['attributes']['validator_controller_account'] = item.validator_controller_account.serialize() + + return data + + +class SessionNominatorListResource(JSONAPIListResource): + + cache_expiration_time = 60 + + def get_query(self): + return SessionNominator.query(self.session).order_by( + SessionNominator.session_id, SessionNominator.rank_validator, SessionNominator.rank_nominator + ) + + def apply_filters(self, query, params): + + if params.get('filter[latestSession]'): + + session = Session.query(self.session).order_by(Session.id.desc()).first() + + query = query.filter_by(session_id=session.id) + + return query + + +class ContractListResource(JSONAPIListResource): + + def get_query(self): + return Contract.query(self.session).order_by( + Contract.created_at_block.desc() + ) + + +class ContractDetailResource(JSONAPIDetailResource): + + def get_item(self, item_id): + return Contract.query(self.session).get(item_id) + + +class RuntimeListResource(JSONAPIListResource): + + cache_expiration_time = 60 + + def get_query(self): + return Runtime.query(self.session).order_by( + Runtime.id.desc() + ) + + +class RuntimeDetailResource(JSONAPIDetailResource): + + def get_item(self, item_id): + return Runtime.query(self.session).get(item_id) + + def get_relationships(self, include_list, item): + relationships = {} + + if 'modules' in include_list: + relationships['modules'] = RuntimeModule.query(self.session).filter_by( + spec_version=item.spec_version + ).order_by('lookup', 'id') + + if 'types' in include_list: + relationships['types'] = RuntimeType.query(self.session).filter_by( + spec_version=item.spec_version + ).order_by('type_string') + + return relationships + + +class RuntimeCallListResource(JSONAPIListResource): + + cache_expiration_time = 3600 + + def apply_filters(self, query, params): + + if params.get('filter[latestRuntime]'): + + latest_runtime = Runtime.query(self.session).order_by(Runtime.spec_version.desc()).first() + + query = query.filter_by(spec_version=latest_runtime.spec_version) + + if params.get('filter[module_id]'): + + query = query.filter_by(module_id=params.get('filter[module_id]')) + + return query + + def get_query(self): + return RuntimeCall.query(self.session).order_by( + RuntimeCall.spec_version.asc(), RuntimeCall.module_id.asc(), RuntimeCall.call_id.asc() + ) + + +class RuntimeCallDetailResource(JSONAPIDetailResource): + + def get_item_url_name(self): + return 'runtime_call_id' + + def get_item(self, item_id): + + if len(item_id.split('-')) != 3: + return None + + spec_version, module_id, call_id = item_id.split('-') + return RuntimeCall.query(self.session).filter_by( + spec_version=spec_version, + module_id=module_id, + call_id=call_id + ).first() + + def get_relationships(self, include_list, item): + relationships = {} + + if 'params' in include_list: + relationships['params'] = RuntimeCallParam.query(self.session).filter_by( + runtime_call_id=item.id).order_by('id') + + if 'recent_extrinsics' in include_list: + relationships['recent_extrinsics'] = Extrinsic.query(self.session).filter_by( + call_id=item.call_id, module_id=item.module_id).order_by(Extrinsic.block_id.desc())[:10] + + return relationships + + +class RuntimeEventListResource(JSONAPIListResource): + + cache_expiration_time = 3600 + + def apply_filters(self, query, params): + + if params.get('filter[latestRuntime]'): + + latest_runtime = Runtime.query(self.session).order_by(Runtime.spec_version.desc()).first() + + query = query.filter_by(spec_version=latest_runtime.spec_version) + + if params.get('filter[module_id]'): + + query = query.filter_by(module_id=params.get('filter[module_id]')) + + return query + + def get_query(self): + return RuntimeEvent.query(self.session).order_by( + RuntimeEvent.spec_version.asc(), RuntimeEvent.module_id.asc(), RuntimeEvent.event_id.asc() + ) + + +class RuntimeEventDetailResource(JSONAPIDetailResource): + + def get_item_url_name(self): + return 'runtime_event_id' + + def get_item(self, item_id): + + if len(item_id.split('-')) != 3: + return None + + spec_version, module_id, event_id = item_id.split('-') + return RuntimeEvent.query(self.session).filter_by( + spec_version=spec_version, + module_id=module_id, + event_id=event_id + ).first() + + def get_relationships(self, include_list, item): + relationships = {} + + if 'attributes' in include_list: + relationships['attributes'] = RuntimeEventAttribute.query(self.session).filter_by( + runtime_event_id=item.id).order_by('id') + + if 'recent_events' in include_list: + relationships['recent_events'] = Event.query(self.session).filter_by( + event_id=item.event_id, module_id=item.module_id).order_by(Event.block_id.desc())[:10] + + return relationships + + +class RuntimeTypeListResource(JSONAPIListResource): + + cache_expiration_time = 3600 + + def get_query(self): + return RuntimeType.query(self.session).order_by( + 'spec_version', 'type_string' + ) + + def apply_filters(self, query, params): + + if params.get('filter[latestRuntime]'): + + latest_runtime = Runtime.query(self.session).order_by(Runtime.spec_version.desc()).first() + + query = query.filter_by(spec_version=latest_runtime.spec_version) + + return query + + +class RuntimeModuleListResource(JSONAPIListResource): + + cache_expiration_time = 3600 + + def get_query(self): + return RuntimeModule.query(self.session).order_by( + 'spec_version', 'name' + ) + + def apply_filters(self, query, params): + + if params.get('filter[latestRuntime]'): + + latest_runtime = Runtime.query(self.session).order_by(Runtime.spec_version.desc()).first() + + query = query.filter_by(spec_version=latest_runtime.spec_version) + + return query + + +class RuntimeModuleDetailResource(JSONAPIDetailResource): + + def get_item(self, item_id): + + if len(item_id.split('-')) != 2: + return None + + spec_version, module_id = item_id.split('-') + return RuntimeModule.query(self.session).filter_by(spec_version=spec_version, module_id=module_id).first() + + def get_relationships(self, include_list, item): + relationships = {} + + if 'calls' in include_list: + relationships['calls'] = RuntimeCall.query(self.session).filter_by( + spec_version=item.spec_version, module_id=item.module_id).order_by( + 'lookup', 'id') + + if 'events' in include_list: + relationships['events'] = RuntimeEvent.query(self.session).filter_by( + spec_version=item.spec_version, module_id=item.module_id).order_by( + 'lookup', 'id') + + if 'storage' in include_list: + relationships['storage'] = RuntimeStorage.query(self.session).filter_by( + spec_version=item.spec_version, module_id=item.module_id).order_by( + 'name') + + if 'constants' in include_list: + relationships['constants'] = RuntimeConstant.query(self.session).filter_by( + spec_version=item.spec_version, module_id=item.module_id).order_by( + 'name') + + if 'errors' in include_list: + relationships['errors'] = RuntimeErrorMessage.query(self.session).filter_by( + spec_version=item.spec_version, module_id=item.module_id).order_by( + 'name').order_by(RuntimeErrorMessage.index) + + return relationships + + +class RuntimeStorageDetailResource(JSONAPIDetailResource): + + def get_item(self, item_id): + + if len(item_id.split('-')) != 3: + return None + + spec_version, module_id, name = item_id.split('-') + return RuntimeStorage.query(self.session).filter_by( + spec_version=spec_version, + module_id=module_id, + name=name + ).first() + + +class RuntimeConstantListResource(JSONAPIListResource): + + cache_expiration_time = 3600 + + def get_query(self): + return RuntimeConstant.query(self.session).order_by( + RuntimeConstant.spec_version.desc(), RuntimeConstant.module_id.asc(), RuntimeConstant.name.asc() + ) + + +class RuntimeConstantDetailResource(JSONAPIDetailResource): + + def get_item(self, item_id): + + if len(item_id.split('-')) != 3: + return None + + spec_version, module_id, name = item_id.split('-') + return RuntimeConstant.query(self.session).filter_by( + spec_version=spec_version, + module_id=module_id, + name=name + ).first() diff --git a/pm-explorer-api/app/schemas/__init__.py b/pm-explorer-api/app/schemas/__init__.py new file mode 100644 index 00000000..2cfaba6f --- /dev/null +++ b/pm-explorer-api/app/schemas/__init__.py @@ -0,0 +1,12 @@ +import os +import json + + +def load_schema(name): + module_path = os.path.dirname(__file__) + path = os.path.join(module_path, '{}.json'.format(name)) + + with open(os.path.abspath(path), 'r') as fp: + data = fp.read() + + return json.loads(data) diff --git a/pm-explorer-api/app/settings.py b/pm-explorer-api/app/settings.py new file mode 100644 index 00000000..0aa6c393 --- /dev/null +++ b/pm-explorer-api/app/settings.py @@ -0,0 +1,100 @@ +# Polkascan PRE Explorer API +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# settings.py +import os + +DB_NAME = os.environ.get("DB_NAME", "polkascan") +DB_HOST = os.environ.get("DB_HOST", "mysql") +DB_PORT = os.environ.get("DB_PORT", 3306) +DB_USERNAME = os.environ.get("DB_USERNAME", "root") +DB_PASSWORD = os.environ.get("DB_PASSWORD", "root") + +DB_CONNECTION = os.environ.get("DB_CONNECTION", "mysql+mysqlconnector://{}:{}@{}:{}/{}".format( + DB_USERNAME, DB_PASSWORD, DB_HOST, DB_PORT, DB_NAME +)) + +SUBSTRATE_RPC_URL = os.environ.get("SUBSTRATE_RPC_URL", "http://substrate-node:9933/") +SUBSTRATE_ADDRESS_TYPE = int(os.environ.get("SUBSTRATE_ADDRESS_TYPE", 42)) +SUBSTRATE_TOKEN_DECIMALS = int(os.environ.get("SUBSTRATE_TOKEN_DECIMALS", 12)) +SUBSTRATE_METADATA_VERSION = int(os.environ.get("SUBSTRATE_METADATA_VERSION", 8)) + +TYPE_REGISTRY = os.environ.get("TYPE_REGISTRY", "default") + +DOGPILE_CACHE_SETTINGS = { + + 'default_list_cache_expiration_time': 6, + 'default_detail_cache_expiration_time': 3600, + 'host': os.environ.get("DOGPILE_CACHE_HOST", "redis"), + 'port': os.environ.get("DOGPILE_CACHE_PORT", 6379), + 'db': os.environ.get("DOGPILE_CACHE_DB", 10) +} + + +DEBUG = False + +MAX_RESOURCE_PAGE_SIZE = 100 +LOG_TYPE_AUTHORITIESCHANGE = 1 + +SEARCH_INDEX_SLASHED_ACCOUNT = 1 +SEARCH_INDEX_BALANCETRANSFER = 2 +SEARCH_INDEX_HEARTBEATRECEIVED = 3 +SEARCH_INDEX_COUNCIL_PROPOSED = 4 +SEARCH_INDEX_COUNCIL_VOTE = 5 +SEARCH_INDEX_STAKING_BONDED = 6 +SEARCH_INDEX_STAKING_UNBONDED = 7 +SEARCH_INDEX_STAKING_WITHDRAWN = 8 +SEARCH_INDEX_IMONLINE_SOMEOFFLINE = 9 +SEARCH_INDEX_STAKING_NOMINATE = 10 +SEARCH_INDEX_STAKING_VALIDATE = 11 +SEARCH_INDEX_STAKING_CHILL = 12 +SEARCH_INDEX_STAKING_SET_PAYEE = 19 +SEARCH_INDEX_IDENTITY_SET = 13 +SEARCH_INDEX_IDENTITY_SET_SUBS = 14 +SEARCH_INDEX_IDENTITY_CLEARED = 15 +SEARCH_INDEX_IDENTITY_KILLED = 16 +SEARCH_INDEX_IDENTITY_JUDGEMENT_REQUESTED = 17 +SEARCH_INDEX_IDENTITY_JUDGEMENT_GIVEN = 18 +SEARCH_INDEX_IDENTITY_JUDGEMENT_UNREQUESTED = 20 +SEARCH_INDEX_ACCOUNT_KILLED = 21 +SEARCH_INDEX_ACCOUNT_CREATED = 22 +SEARCH_INDEX_COUNCIL_MEMBER_ELECTED = 23 +SEARCH_INDEX_COUNCIL_MEMBER_KICKED = 24 +SEARCH_INDEX_COUNCIL_CANDIDACY_RENOUNCED = 25 +SEARCH_INDEX_COUNCIL_CANDIDACY_SUBMIT = 26 +SEARCH_INDEX_COUNCIL_CANDIDACY_VOTE = 27 +SEARCH_INDEX_TREASURY_PROPOSED = 28 +SEARCH_INDEX_TREASURY_AWARDED = 37 +SEARCH_INDEX_DEMOCRACY_VOTE = 29 +SEARCH_INDEX_DEMOCRACY_PROXY_VOTE = 30 +SEARCH_INDEX_DEMOCRACY_PROPOSE = 31 +SEARCH_INDEX_DEMOCRACY_SECOND = 32 +SEARCH_INDEX_TECHCOMM_VOTED = 33 +SEARCH_INDEX_TECHCOMM_PROPOSED = 34 +SEARCH_INDEX_BALANCES_DEPOSIT = 35 +SEARCH_INDEX_CLAIMS_CLAIMED = 36 +SEARCH_INDEX_STAKING_SESSION = 38 +SEARCH_INDEX_SIGNED_EXTRINSIC = 99 + +SUBSTRATE_STORAGE_BALANCE = os.environ.get("SUBSTRATE_STORAGE_BALANCE", "FreeBalance") +USE_NODE_RETRIEVE_BALANCES = os.environ.get("USE_NODE_RETRIEVE_BALANCES", "False") + +try: + from app.local_settings import * +except ImportError: + pass diff --git a/pm-explorer-api/app/utils/__init__.py b/pm-explorer-api/app/utils/__init__.py new file mode 100644 index 00000000..6b7b9c4d --- /dev/null +++ b/pm-explorer-api/app/utils/__init__.py @@ -0,0 +1,20 @@ +# Polkascan PRE Explorer API +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# __init__.py + diff --git a/pm-explorer-api/app/utils/ss58.py b/pm-explorer-api/app/utils/ss58.py new file mode 100644 index 00000000..ed25dfed --- /dev/null +++ b/pm-explorer-api/app/utils/ss58.py @@ -0,0 +1,121 @@ +# Polkascan PRE Explorer API +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# ss58.py + +""" SS58 is a simple address format designed for Substrate based chains. + Encoding/decoding according to specification on https://wiki.parity.io/External-Address-Format-(SS58) + +""" +import base58 +from hashlib import blake2b + +from scalecodec import ScaleBytes +from scalecodec.types import U8, U16, U32, U64 + + +def ss58_decode(address, valid_address_type=42): + checksum_prefix = b'SS58PRE' + + ss58_format = base58.b58decode(address) + + if ss58_format[0] != valid_address_type: + raise ValueError("Invalid Address type") + + # Determine checksum length according to length of address string + if len(ss58_format) in [3, 4, 6, 10]: + checksum_length = 1 + elif len(ss58_format) in [5, 7, 11, 35]: + checksum_length = 2 + elif len(ss58_format) in [8, 12]: + checksum_length = 3 + elif len(ss58_format) in [9, 13]: + checksum_length = 4 + elif len(ss58_format) in [14]: + checksum_length = 5 + elif len(ss58_format) in [15]: + checksum_length = 6 + elif len(ss58_format) in [16]: + checksum_length = 7 + elif len(ss58_format) in [17]: + checksum_length = 8 + else: + raise ValueError("Invalid address length") + + checksum = blake2b(checksum_prefix + ss58_format[0:-checksum_length]).digest() + + if checksum[0:checksum_length] != ss58_format[-checksum_length:]: + raise ValueError("Invalid checksum") + + return ss58_format[1:len(ss58_format)-checksum_length].hex() + + +def ss58_encode(address, address_type=42): + checksum_prefix = b'SS58PRE' + + if type(address) is bytes or type(address) is bytearray: + address_bytes = address + else: + address_bytes = bytes.fromhex(address) + + if len(address_bytes) == 32: + # Checksum size is 2 bytes for public key + checksum_length = 2 + elif len(address_bytes) in [1, 2, 4, 8]: + # Checksum size is 1 byte for account index + checksum_length = 1 + else: + raise ValueError("Invalid length for address") + + address_format = bytes([address_type]) + address_bytes + checksum = blake2b(checksum_prefix + address_format).digest() + + return base58.b58encode(address_format + checksum[:checksum_length]).decode() + + +def ss58_encode_account_index(account_index, address_type=42): + + if 0 <= account_index <= 2**8 - 1: + account_idx_encoder = U8() + elif 2**8 <= account_index <= 2**16 - 1: + account_idx_encoder = U16() + elif 2**16 <= account_index <= 2**32 - 1: + account_idx_encoder = U32() + elif 2**32 <= account_index <= 2**64 - 1: + account_idx_encoder = U64() + else: + raise ValueError("Value too large for an account index") + + return ss58_encode(account_idx_encoder.encode(account_index).data, address_type) + + +def ss58_decode_account_index(address, valid_address_type=42): + + account_index_bytes = ss58_decode(address, valid_address_type) + + if len(account_index_bytes) == 2: + return U8(ScaleBytes('0x{}'.format(account_index_bytes))).decode() + if len(account_index_bytes) == 4: + return U16(ScaleBytes('0x{}'.format(account_index_bytes))).decode() + if len(account_index_bytes) == 8: + return U32(ScaleBytes('0x{}'.format(account_index_bytes))).decode() + if len(account_index_bytes) == 16: + return U64(ScaleBytes('0x{}'.format(account_index_bytes))).decode() + else: + raise ValueError("Invalid account index length") + diff --git a/pm-explorer-api/docker-compose.yml b/pm-explorer-api/docker-compose.yml new file mode 100644 index 00000000..2df1fcb0 --- /dev/null +++ b/pm-explorer-api/docker-compose.yml @@ -0,0 +1,27 @@ +version: '3.2' + +services: + + explorer-api: + build: . + image: polkascan-explorer-api + ports: + - '8000:8000' + volumes: + - '.:/usr/src/app' + command: ./start.sh + environment: + - PYTHONPATH=/usr/src/app + - ENVIRONMENT=dev + depends_on: + - mysql + + mysql: + image: mysql:latest + volumes: + - './data/mysql:/var/lib/mysql' + ports: + - '33061:3306' + environment: + - MYSQL_ROOT_PASSWORD=root + - MYSQL_DATABASE=polkascan \ No newline at end of file diff --git a/pm-explorer-api/requirements.txt b/pm-explorer-api/requirements.txt new file mode 100644 index 00000000..8b87ad98 --- /dev/null +++ b/pm-explorer-api/requirements.txt @@ -0,0 +1,40 @@ +alembic==1.1.0 +atomicwrites==1.3.0 +attrs==19.1.0 +base58==2.0.1 +certifi==2019.6.16 +chardet==3.0.4 +decorator==4.4.0 +dictalchemy==0.1.2.7 +dogpile.cache==0.7.1 +falcon==1.4.1 +greenlet==0.4.15 +gunicorn==19.9.0 +idna==2.8 +importlib-metadata==0.19 +jsonschema==2.6.0 +Mako==1.0.14 +MarkupSafe==1.1.1 +meinheld==1.0.1 +more-itertools==6.0.0 +mysql-connector==2.1.7 +mysql-connector-python==8.0.15 +pluggy==0.12.0 +protobuf==3.9.1 +py==1.8.0 +pytest==4.3.1 +python-dateutil==2.8.0 +python-editor==1.0.4 +python-mimeparse==1.6.0 +pytz==2018.9 +redis==3.2.1 +requests==2.24.0 +requests-mock==1.7.0 +six==1.12.0 +SQLAlchemy==1.3.8 +urllib3==1.25.10 +xxhash==1.3.0 +zipp==0.5.2 + +polymath-scalecodec==3.0.2 +polymath-substrate-interface==3.0.2 diff --git a/pm-explorer-api/start.sh b/pm-explorer-api/start.sh new file mode 100755 index 00000000..7df0100f --- /dev/null +++ b/pm-explorer-api/start.sh @@ -0,0 +1,22 @@ +#! /usr/bin/env sh + +if [ -z $ENVIRONMENT ] || [ "$ENVIRONMENT" = "dev" ]; then + ENVIRONMENT="dev" +fi + +echo "===========================" +echo "Environment: $ENVIRONMENT" +echo "===========================" + +echo "Running gunicorn..." + +if [ "$ENVIRONMENT" = "dev" ]; then + # Expand path to local versions of packages + export PYTHONPATH=$PYTHONPATH:./py-substrate-interface/:./py-scale-codec/ + + gunicorn -b 0.0.0.0:8000 --workers=1 app.main:app --reload --timeout 600 +fi + +if [ "$ENVIRONMENT" = "prod" ]; then + gunicorn -b 0.0.0.0:8000 --workers=5 app.main:app --worker-class="egg:meinheld#gunicorn_worker" +fi diff --git a/pm-explorer-gui/.dockerignore b/pm-explorer-gui/.dockerignore new file mode 100644 index 00000000..16b156d2 --- /dev/null +++ b/pm-explorer-gui/.dockerignore @@ -0,0 +1,3 @@ +explorer-gui/node_modules +.git +dist diff --git a/pm-explorer-gui/.editorconfig b/pm-explorer-gui/.editorconfig new file mode 100644 index 00000000..e89330a6 --- /dev/null +++ b/pm-explorer-gui/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/pm-explorer-gui/.gitignore b/pm-explorer-gui/.gitignore new file mode 100644 index 00000000..f4f46a5f --- /dev/null +++ b/pm-explorer-gui/.gitignore @@ -0,0 +1,46 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events.json +speed-measure-plugin.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/pm-explorer-gui/Dockerfile b/pm-explorer-gui/Dockerfile new file mode 100755 index 00000000..d17a1267 --- /dev/null +++ b/pm-explorer-gui/Dockerfile @@ -0,0 +1,66 @@ +### STAGE 1: Build ### +# We label our stage as ‘builder’ +FROM node:10-alpine as builder + +COPY explorer-gui/package.json explorer-gui/package-lock.json ./ + +## Storing node modules on a separate layer will prevent unnecessary npm installs at each build + +RUN npm ci && mkdir /ng-app && mv ./node_modules ./ng-app + +WORKDIR /ng-app + +COPY explorer-gui/ /ng-app/ + +## Build the angular app in production mode and store the artifacts in dist folder +ARG ENV_CONFIG=docker-pre +ENV ENV_CONFIG=$ENV_CONFIG + +ARG API_URL=/api/v1 +ENV API_URL=$API_URL + +ARG NETWORK_NAME=Polymesh +ENV NETWORK_NAME=$NETWORK_NAME + +ARG NETWORK_ID=POLYMESH +ENV NETWORK_ID=$NETWORK_ID + +ARG NETWORK_TYPE=pre +ENV NETWORK_TYPE=$NETWORK_TYPE + +ARG CHAIN_TYPE=relay +ENV CHAIN_TYPE=$CHAIN_TYPE + +ARG NETWORK_TOKEN_SYMBOL=POLYX +ENV NETWORK_TOKEN_SYMBOL=$NETWORK_TOKEN_SYMBOL + +ARG NETWORK_TOKEN_DECIMALS=6 +ENV NETWORK_TOKEN_DECIMALS=$NETWORK_TOKEN_DECIMALS + +ARG NETWORK_COLOR_CODE=1348E4 +ENV NETWORK_COLOR_CODE=$NETWORK_COLOR_CODE + +RUN npm run ng build -- --configuration=${ENV_CONFIG} --output-path=dist + + +### STAGE 2: Setup ### +FROM nginx:1.14.1-alpine + +## Allow for various nginx proxy configuration +ARG NGINX_CONF=nginx/polkascan-prod.conf +ENV NGINX_CONF=$NGINX_CONF + +## Remove default nginx configs +RUN rm -rf /etc/nginx/conf.d/* + +## Copy our default nginx config +#COPY nginx/polkascan.conf /etc/nginx/conf.d/ +COPY ${NGINX_CONF} /etc/nginx/conf.d/ + +## Remove default nginx website +RUN rm -rf /usr/share/nginx/html/* + +## From ‘builder’ stage copy over the artifacts in dist folder to default nginx public folder +COPY --from=builder /ng-app/dist /usr/share/nginx/html + +CMD ["nginx", "-g", "daemon off;"] diff --git a/pm-explorer-gui/LICENSE b/pm-explorer-gui/LICENSE new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/pm-explorer-gui/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/pm-explorer-gui/README.md b/pm-explorer-gui/README.md new file mode 100644 index 00000000..74aef175 --- /dev/null +++ b/pm-explorer-gui/README.md @@ -0,0 +1,13 @@ +# Polkascan Explorer GUI +Polkascan Explorer GUI Angular Application +# Polkascan PRE Explorer GUI +Polkascan PRE Explorer GUI Angular Application + +## Description +The purpose of the Explorer GUI Application is to make the data which is produced by the Polkascan Harvester Application and disseminated by the Polkascan Explorer API Application accessible to day-to-day end-user. The Polkascan Explorer GUI Application provides a user interface to the Polkascan Explorer API Application and intends to showcase what developers should be able to build on top of the Polkascan Explorer API Application for a wide audience of day-to-day users. +The purpose of the Polkascan PRE Explorer GUI Application is to make the data which is produced by the Polkascan PRE Harvester Application and disseminated by the Polkascan PRE Explorer API Application accessible to day-to-day end-user. The Polkascan PRE Explorer GUI Application provides a user interface to the Polkascan PRE Explorer API Application and intends to showcase what developers should be able to build on top of the Polkascan PRE Explorer API Application for a wide audience of day-to-day users. + +## License +https://github.com/polkascan/polkascan-explorer-gui/blob/master/LICENSE +https://github.com/polkascan/polkascan-pre-explorer-gui/blob/master/LICENSE + diff --git a/pm-explorer-gui/nginx/polkascan-dev.conf b/pm-explorer-gui/nginx/polkascan-dev.conf new file mode 100644 index 00000000..1fff834b --- /dev/null +++ b/pm-explorer-gui/nginx/polkascan-dev.conf @@ -0,0 +1,23 @@ +upstream api { + ip_hash; + server api:8000; +} + +upstream frontend { + ip_hash; + server frontend:4200; +} + +# portal +server { + location /api/v1/ { + proxy_pass http://api/; + } + # Development + location / { + proxy_pass http://frontend/; + } + + listen 80; + server_name localhost; +} diff --git a/pm-explorer-gui/nginx/polkascan-gui.conf b/pm-explorer-gui/nginx/polkascan-gui.conf new file mode 100644 index 00000000..fc7ddc32 --- /dev/null +++ b/pm-explorer-gui/nginx/polkascan-gui.conf @@ -0,0 +1,12 @@ +# portal +server { + # Production + location / { + root /usr/share/nginx/html; + index index.html; + try_files $uri $uri/ /index.html; + } + + listen 80; + server_name localhost; +} diff --git a/pm-explorer-gui/nginx/polkascan-nomad.conf b/pm-explorer-gui/nginx/polkascan-nomad.conf new file mode 100644 index 00000000..a2a95a15 --- /dev/null +++ b/pm-explorer-gui/nginx/polkascan-nomad.conf @@ -0,0 +1,31 @@ +upstream explorer-api { + ip_hash; + server 127.0.0.1:8000; +} + +upstream harvester-api { + ip_hash; + server 127.0.0.1:8001; +} + +# portal +server { + + location /api/v1/harvester { + proxy_pass http://harvester-api/; + } + + location /api/v1/ { + proxy_pass http://pm-explorer-api/; + } + + # Production + location / { + root /usr/share/nginx/html; + index index.html; + try_files $uri $uri/ /index.html; + } + + listen 80; + server_name localhost; +} diff --git a/pm-explorer-gui/nginx/polkascan-prod.conf b/pm-explorer-gui/nginx/polkascan-prod.conf new file mode 100644 index 00000000..8431af3f --- /dev/null +++ b/pm-explorer-gui/nginx/polkascan-prod.conf @@ -0,0 +1,31 @@ +upstream explorer-api { + ip_hash; + server explorer-api:8000; +} + +upstream harvester-api { + ip_hash; + server harvester-api:8000; +} + +# portal +server { + + location /api/v1/harvester { + proxy_pass http://harvester-api/; + } + + location /api/v1/ { + proxy_pass http://pm-explorer-api/; + } + + # Production + location / { + root /usr/share/nginx/html; + index index.html; + try_files $uri $uri/ /index.html; + } + + listen 80; + server_name localhost; +} diff --git a/pm-harvester/.dockerignore b/pm-harvester/.dockerignore new file mode 100644 index 00000000..96798ee0 --- /dev/null +++ b/pm-harvester/.dockerignore @@ -0,0 +1,58 @@ +# Created by .ignore support plugin (hsz.mobi) +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +data/ +logs/ +frontend/ \ No newline at end of file diff --git a/pm-harvester/.gitignore b/pm-harvester/.gitignore new file mode 100644 index 00000000..44dc2212 --- /dev/null +++ b/pm-harvester/.gitignore @@ -0,0 +1,108 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site +data/ +# mypy +.mypy_cache/ +.idea + + +.env.* \ No newline at end of file diff --git a/pm-harvester/Dockerfile b/pm-harvester/Dockerfile new file mode 100644 index 00000000..67ed7c4d --- /dev/null +++ b/pm-harvester/Dockerfile @@ -0,0 +1,18 @@ +# base image +FROM python:3.8-buster +ENV PYTHONUNBUFFERED 1 + +# set working directory +RUN mkdir -p /usr/src/app +WORKDIR /usr/src/app + +RUN pip3 install --upgrade pip + +# add requirements +COPY ./requirements.txt /usr/src/app/requirements.txt + +# install requirements +RUN pip3 install -r requirements.txt + +# add app +COPY . /usr/src/app diff --git a/pm-harvester/LICENSE b/pm-harvester/LICENSE new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/pm-harvester/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/pm-harvester/README.md b/pm-harvester/README.md new file mode 100644 index 00000000..a83a1674 --- /dev/null +++ b/pm-harvester/README.md @@ -0,0 +1,8 @@ +# Polkascan PRE Harvester +Polkascan PRE Harvester Python Application + +## Description +The Polkascan PRE Harvester Application transforms a Substrate node's raw data into relational data for various classes of objects, such as: blocks, runtime metadata entities, extrinsics, events and various runtime data entities, such as: timestamps, accounts and balances. + +## License +https://github.com/polkascan/polkascan-pre-harvester/blob/master/LICENSE diff --git a/pm-harvester/alembic.ini b/pm-harvester/alembic.ini new file mode 100644 index 00000000..e19b2444 --- /dev/null +++ b/pm-harvester/alembic.ini @@ -0,0 +1,74 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = app/db + +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# timezone to use when rendering the date +# within the migration file as well as the filename. +# string value is passed to dateutil.tz.gettz() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the +# "slug" field +#truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; this defaults +# to app/db/versions. When using multiple version +# directories, initial revisions must be specified with --version-path +# version_locations = %(here)s/bar %(here)s/bat app/db/versions + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +sqlalchemy.url = driver://user:pass@localhost/dbname + + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/pm-harvester/app/__init__.py b/pm-harvester/app/__init__.py new file mode 100644 index 00000000..029b5465 --- /dev/null +++ b/pm-harvester/app/__init__.py @@ -0,0 +1,19 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# __init__.py diff --git a/pm-harvester/app/db/AddColumnIfNotExists.sql b/pm-harvester/app/db/AddColumnIfNotExists.sql new file mode 100644 index 00000000..301d62f1 --- /dev/null +++ b/pm-harvester/app/db/AddColumnIfNotExists.sql @@ -0,0 +1,21 @@ +DROP PROCEDURE IF EXISTS AddColumnIfNotExists; +DELIMITER // +CREATE PROCEDURE AddColumnIfNotExists( + IN dbName tinytext, + IN tableName tinytext, + IN fieldName tinytext, + IN fieldDef text) + BEGIN + IF NOT EXISTS ( + SELECT * FROM information_schema.COLUMNS + WHERE column_name=fieldName + and table_name=tableName + and table_schema=dbName + ) + THEN + SET @ddl=CONCAT('ALTER TABLE `',dbName,'`.`',tableName,'` ADD COLUMN ',fieldName,' ',fieldDef); + PREPARE stmt FROM @ddl; + EXECUTE stmt; + END IF; + END // +DELIMITER ; diff --git a/pm-harvester/app/db/AddIndexIfNotExists.sql b/pm-harvester/app/db/AddIndexIfNotExists.sql new file mode 100644 index 00000000..f2aecbf0 --- /dev/null +++ b/pm-harvester/app/db/AddIndexIfNotExists.sql @@ -0,0 +1,21 @@ +DROP PROCEDURE IF EXISTS AddIndexIfNotExists; +DELIMITER // +CREATE PROCEDURE AddIndexIfNotExists( + IN dbName tinytext, + IN tableName tinytext, + IN indexName tinytext, + IN indexFields text) + BEGIN + IF NOT EXISTS ( + SELECT * FROM information_schema.STATISTICS + WHERE index_name=indexName + and table_name=tableName + and table_schema=dbName + ) + THEN + SET @ddl=CONCAT('CREATE INDEX `',indexName,'` ON `',dbName,'`.`',tableName,'` (',indexFields,')'); + PREPARE stmt FROM @ddl; + EXECUTE stmt; + END IF; + END // +DELIMITER ; diff --git a/pm-harvester/app/db/ColumnsAndIndices.sql b/pm-harvester/app/db/ColumnsAndIndices.sql new file mode 100644 index 00000000..d799d396 --- /dev/null +++ b/pm-harvester/app/db/ColumnsAndIndices.sql @@ -0,0 +1,112 @@ +call AddColumnIfNotExists( + 'polymesh-harvester', + 'data_event', + 'event_arg_0', + "varchar(100) GENERATED ALWAYS AS (attributes->>'$[0].value') STORED NULL AFTER `attributes`"); + +call AddColumnIfNotExists( + 'polymesh-harvester', + 'data_event', + 'event_arg_1', + "varchar(100) GENERATED ALWAYS AS (attributes->>'$[1].value') STORED NULL AFTER `event_arg_0`"); + +call AddColumnIfNotExists( + 'polymesh-harvester', + 'data_event', + 'event_arg_2', + "varchar(100) GENERATED ALWAYS AS (attributes->>'$[2].value') STORED NULL AFTER `event_arg_1`"); + +call AddColumnIfNotExists( + 'polymesh-harvester', + 'data_event', + 'event_arg_3', + "varchar(100) GENERATED ALWAYS AS (attributes->>'$[3].value') STORED NULL AFTER `event_arg_2`"); + +call AddColumnIfNotExists( + 'polymesh-harvester', + 'data_event', + 'claim_type', + "varchar(30) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(attributes, '$[1].value.claim'), '$[0]'))) STORED NULL AFTER `event_arg_3`"); + +call AddColumnIfNotExists( + 'polymesh-harvester', + 'data_event', + 'claim_scope', + "varchar(100) GENERATED ALWAYS AS ( + CASE + WHEN JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(attributes, '$[1].value.claim'), '$[0]')) = 'CustomerDueDiligence' THEN null + WHEN JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(attributes, '$[1].value.claim'), '$[0]')) = 'InvestorUniqueness' THEN JSON_OBJECT('type', JSON_EXTRACT(JSON_KEYS(JSON_EXTRACT(JSON_EXTRACT(attributes->>'$[1].value.claim[0].*', '$[0]'), '$.col1')), '$[0]'), 'value', JSON_EXTRACT(JSON_EXTRACT(JSON_EXTRACT(attributes->>'$[1].value.claim[0].*', '$[0]'), '$.col1.*'), '$[0]')) + WHEN JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(attributes, '$[1].value.claim'), '$[0]')) <> 'Jurisdiction' THEN JSON_OBJECT('type', JSON_EXTRACT(JSON_KEYS(JSON_EXTRACT(attributes->>'$[1].value.claim[0].*', '$[0]')), '$[0]'), 'value', JSON_EXTRACT(JSON_EXTRACT(attributes->>'$[1].value.claim[0].*', '$[0].*'), '$[0]')) + ELSE JSON_OBJECT('type', JSON_EXTRACT(JSON_KEYS(JSON_EXTRACT(JSON_EXTRACT(attributes->>'$[1].value.claim[0].*', '$[0]'), '$.col2')), '$[0]'), 'value', JSON_EXTRACT(JSON_EXTRACT(JSON_EXTRACT(attributes->>'$[1].value.claim[0].*', '$[0]'), '$.col2.*'), '$[0]')) + END) STORED NULL AFTER `claim_type` + "); + +call AddColumnIfNotExists( + 'polymesh-harvester', + 'data_event', + 'claim_issuer', + "varchar(66) GENERATED ALWAYS AS (attributes->>'$[1].value.claim_issuer') STORED NULL AFTER `claim_scope`"); + +call AddColumnIfNotExists( + 'polymesh-harvester', + 'data_event', + 'claim_expiry', + "varchar(15) GENERATED ALWAYS AS ( + CASE + WHEN attributes->>'$[1].value.expiry' = 'null' THEN null + ELSE attributes->>'$[1].value.expiry' + END) STORED NULL AFTER `claim_issuer`"); + +call AddIndexIfNotExists( + 'polymesh-harvester', + 'data_event', + 'ix_data_event_event_arg_0', + 'event_arg_0'); + +call AddIndexIfNotExists( + 'polymesh-harvester', + 'data_event', + 'ix_data_event_event_arg_1', + 'event_arg_1'); + +call AddIndexIfNotExists( + 'polymesh-harvester', + 'data_event', + 'ix_data_event_event_arg_2', + 'event_arg_2'); + +call AddIndexIfNotExists( + 'polymesh-harvester', + 'data_event', + 'ix_data_event_event_arg_3', + 'event_arg_3'); + +call AddIndexIfNotExists( + 'polymesh-harvester', + 'data_event', + 'ix_data_event_claim_type', + 'claim_type'); + +call AddIndexIfNotExists( + 'polymesh-harvester', + 'data_event', + 'ix_data_event_claim_scope', + 'claim_scope'); + +call AddIndexIfNotExists( + 'polymesh-harvester', + 'data_event', + 'ix_data_event_claim_issuer', + 'claim_issuer'); + +call AddIndexIfNotExists( + 'polymesh-harvester', + 'data_event', + 'ix_data_event_spec_version_id', + 'spec_version_id'); + +call AddIndexIfNotExists( + 'polymesh-harvester', + 'data_event', + 'ix_data_event_module_id_event_id_event_arg_2', + 'module_id, event_id, event_arg_2'); diff --git a/pm-harvester/app/db/README b/pm-harvester/app/db/README new file mode 100644 index 00000000..98e4f9c4 --- /dev/null +++ b/pm-harvester/app/db/README @@ -0,0 +1 @@ +Generic single-database configuration. \ No newline at end of file diff --git a/pm-harvester/app/db/env.py b/pm-harvester/app/db/env.py new file mode 100644 index 00000000..5e0770ca --- /dev/null +++ b/pm-harvester/app/db/env.py @@ -0,0 +1,89 @@ +from __future__ import with_statement + +from logging.config import fileConfig + +from sqlalchemy import engine_from_config +from sqlalchemy import pool + +from alembic import context + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +from app.settings import DB_CONNECTION, DEBUG + +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +fileConfig(config.config_file_name) + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata + +from app.models.base import BaseModel +from app.models.data import * +from app.models.harvester import * + +target_metadata = BaseModel.metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, target_metadata=target_metadata, literal_binds=True, compare_type=True + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + + config = { + 'sqlalchemy.url': DB_CONNECTION, + 'sqlalchemy.echo': DEBUG + } + + connectable = engine_from_config( + config, + prefix="sqlalchemy.", + poolclass=pool.NullPool, + ) + + with connectable.connect() as connection: + context.configure( + connection=connection, target_metadata=target_metadata, compare_type=True + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/pm-harvester/app/db/script.py.mako b/pm-harvester/app/db/script.py.mako new file mode 100644 index 00000000..2c015630 --- /dev/null +++ b/pm-harvester/app/db/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/pm-harvester/app/db/versions/2e13a031e4d4_accountid_nullable_in_accountindex.py b/pm-harvester/app/db/versions/2e13a031e4d4_accountid_nullable_in_accountindex.py new file mode 100644 index 00000000..21025eb9 --- /dev/null +++ b/pm-harvester/app/db/versions/2e13a031e4d4_accountid_nullable_in_accountindex.py @@ -0,0 +1,28 @@ +"""Accountid nullable in accountindex + +Revision ID: 2e13a031e4d4 +Revises: 3aa6678d275f +Create Date: 2020-07-01 11:27:18.752541 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +# revision identifiers, used by Alembic. +revision = '2e13a031e4d4' +down_revision = '3aa6678d275f' +branch_labels = None +depends_on = None + + +def upgrade(): + op.alter_column('data_account_index_audit', 'account_id', + existing_type=mysql.VARCHAR(length=64), + nullable=True) + + +def downgrade(): + op.alter_column('data_account_index_audit', 'account_id', + existing_type=mysql.VARCHAR(length=64), + nullable=False) diff --git a/pm-harvester/app/db/versions/38a7f29de7c7_initial_db_layout.py b/pm-harvester/app/db/versions/38a7f29de7c7_initial_db_layout.py new file mode 100644 index 00000000..f50005c5 --- /dev/null +++ b/pm-harvester/app/db/versions/38a7f29de7c7_initial_db_layout.py @@ -0,0 +1,841 @@ +"""Initial db layout + +Revision ID: 38a7f29de7c7 +Revises: +Create Date: 2020-04-16 12:51:44.832584 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +# revision identifiers, used by Alembic. +revision = '38a7f29de7c7' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('data_account', + sa.Column('id', sa.String(length=64), nullable=False), + sa.Column('address', sa.String(length=48), nullable=True), + sa.Column('index_address', sa.String(length=24), nullable=True), + sa.Column('is_reaped', sa.Boolean(), nullable=True), + sa.Column('is_validator', sa.Boolean(), nullable=True), + sa.Column('was_validator', sa.Boolean(), nullable=True), + sa.Column('is_nominator', sa.Boolean(), nullable=True), + sa.Column('was_nominator', sa.Boolean(), nullable=True), + sa.Column('is_council_member', sa.Boolean(), nullable=True), + sa.Column('was_council_member', sa.Boolean(), nullable=True), + sa.Column('is_tech_comm_member', sa.Boolean(), nullable=True), + sa.Column('was_tech_comm_member', sa.Boolean(), nullable=True), + sa.Column('is_registrar', sa.Boolean(), nullable=True), + sa.Column('was_registrar', sa.Boolean(), nullable=True), + sa.Column('is_sudo', sa.Boolean(), nullable=True), + sa.Column('was_sudo', sa.Boolean(), nullable=True), + sa.Column('is_treasury', sa.Boolean(), nullable=True), + sa.Column('is_contract', sa.Boolean(), nullable=True), + sa.Column('count_reaped', sa.Integer(), nullable=True), + sa.Column('hash_blake2b', sa.String(length=64), nullable=True), + sa.Column('balance_total', sa.Numeric(precision=65, scale=0), nullable=True), + sa.Column('balance_free', sa.Numeric(precision=65, scale=0), nullable=True), + sa.Column('balance_reserved', sa.Numeric(precision=65, scale=0), nullable=True), + sa.Column('nonce', sa.Integer(), nullable=True), + sa.Column('account_info', sa.JSON(), nullable=True), + sa.Column('has_identity', sa.Boolean(), nullable=True), + sa.Column('has_subidentity', sa.Boolean(), nullable=True), + sa.Column('identity_display', sa.String(length=32), nullable=True), + sa.Column('identity_legal', sa.String(length=32), nullable=True), + sa.Column('identity_web', sa.String(length=32), nullable=True), + sa.Column('identity_riot', sa.String(length=32), nullable=True), + sa.Column('identity_email', sa.String(length=32), nullable=True), + sa.Column('identity_twitter', sa.String(length=32), nullable=True), + sa.Column('identity_judgement_good', sa.Integer(), nullable=True), + sa.Column('identity_judgement_bad', sa.Integer(), nullable=True), + sa.Column('parent_identity', sa.String(length=64), nullable=True), + sa.Column('subidentity_display', sa.String(length=32), nullable=True), + sa.Column('created_at_block', sa.Integer(), nullable=False), + sa.Column('updated_at_block', sa.Integer(), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_data_account_address'), 'data_account', ['address'], unique=False) + op.create_index(op.f('ix_data_account_balance_free'), 'data_account', ['balance_free'], unique=False) + op.create_index(op.f('ix_data_account_balance_reserved'), 'data_account', ['balance_reserved'], unique=False) + op.create_index(op.f('ix_data_account_balance_total'), 'data_account', ['balance_total'], unique=False) + op.create_index(op.f('ix_data_account_has_identity'), 'data_account', ['has_identity'], unique=False) + op.create_index(op.f('ix_data_account_has_subidentity'), 'data_account', ['has_subidentity'], unique=False) + op.create_index(op.f('ix_data_account_hash_blake2b'), 'data_account', ['hash_blake2b'], unique=False) + op.create_index(op.f('ix_data_account_identity_display'), 'data_account', ['identity_display'], unique=False) + op.create_index(op.f('ix_data_account_index_address'), 'data_account', ['index_address'], unique=False) + op.create_index(op.f('ix_data_account_is_contract'), 'data_account', ['is_contract'], unique=False) + op.create_index(op.f('ix_data_account_is_council_member'), 'data_account', ['is_council_member'], unique=False) + op.create_index(op.f('ix_data_account_is_nominator'), 'data_account', ['is_nominator'], unique=False) + op.create_index(op.f('ix_data_account_is_registrar'), 'data_account', ['is_registrar'], unique=False) + op.create_index(op.f('ix_data_account_is_sudo'), 'data_account', ['is_sudo'], unique=False) + op.create_index(op.f('ix_data_account_is_tech_comm_member'), 'data_account', ['is_tech_comm_member'], unique=False) + op.create_index(op.f('ix_data_account_is_treasury'), 'data_account', ['is_treasury'], unique=False) + op.create_index(op.f('ix_data_account_is_validator'), 'data_account', ['is_validator'], unique=False) + op.create_index(op.f('ix_data_account_parent_identity'), 'data_account', ['parent_identity'], unique=False) + op.create_index(op.f('ix_data_account_was_council_member'), 'data_account', ['was_council_member'], unique=False) + op.create_index(op.f('ix_data_account_was_nominator'), 'data_account', ['was_nominator'], unique=False) + op.create_index(op.f('ix_data_account_was_registrar'), 'data_account', ['was_registrar'], unique=False) + op.create_index(op.f('ix_data_account_was_sudo'), 'data_account', ['was_sudo'], unique=False) + op.create_index(op.f('ix_data_account_was_tech_comm_member'), 'data_account', ['was_tech_comm_member'], unique=False) + op.create_index(op.f('ix_data_account_was_validator'), 'data_account', ['was_validator'], unique=False) + op.create_table('data_account_audit', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('account_id', sa.String(length=64), nullable=True), + sa.Column('block_id', sa.Integer(), nullable=False), + sa.Column('extrinsic_idx', sa.Integer(), nullable=True), + sa.Column('event_idx', sa.Integer(), nullable=True), + sa.Column('type_id', sa.Integer(), nullable=False), + sa.Column('data', sa.JSON(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_data_account_audit_block_id'), 'data_account_audit', ['block_id'], unique=False) + op.create_table('data_account_index', + sa.Column('id', sa.Integer(), autoincrement=False, nullable=False), + sa.Column('short_address', sa.String(length=24), nullable=True), + sa.Column('account_id', sa.String(length=64), nullable=True), + sa.Column('is_reclaimable', sa.Boolean(), nullable=True), + sa.Column('is_reclaimed', sa.Boolean(), nullable=True), + sa.Column('created_at_block', sa.Integer(), nullable=False), + sa.Column('updated_at_block', sa.Integer(), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_data_account_index_account_id'), 'data_account_index', ['account_id'], unique=False) + op.create_index(op.f('ix_data_account_index_short_address'), 'data_account_index', ['short_address'], unique=False) + op.create_table('data_account_index_audit', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('account_index_id', sa.Integer(), nullable=True), + sa.Column('account_id', sa.String(length=64), nullable=False), + sa.Column('block_id', sa.Integer(), nullable=False), + sa.Column('extrinsic_idx', sa.Integer(), nullable=True), + sa.Column('event_idx', sa.Integer(), nullable=True), + sa.Column('type_id', sa.Integer(), nullable=False), + sa.Column('data', sa.JSON(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_data_account_index_audit_account_id'), 'data_account_index_audit', ['account_id'], unique=False) + op.create_index(op.f('ix_data_account_index_audit_account_index_id'), 'data_account_index_audit', ['account_index_id'], unique=False) + op.create_index(op.f('ix_data_account_index_audit_block_id'), 'data_account_index_audit', ['block_id'], unique=False) + op.create_table('data_account_info_snapshot', + sa.Column('block_id', sa.Integer(), nullable=False), + sa.Column('account_id', sa.String(length=64), nullable=False), + sa.Column('balance_total', sa.Numeric(precision=65, scale=0), nullable=True), + sa.Column('balance_free', sa.Numeric(precision=65, scale=0), nullable=True), + sa.Column('balance_reserved', sa.Numeric(precision=65, scale=0), nullable=True), + sa.Column('nonce', sa.Integer(), nullable=True), + sa.Column('account_info', sa.JSON(), nullable=True), + sa.PrimaryKeyConstraint('block_id', 'account_id') + ) + op.create_index(op.f('ix_data_account_info_snapshot_account_id'), 'data_account_info_snapshot', ['account_id'], unique=False) + op.create_index(op.f('ix_data_account_info_snapshot_balance_free'), 'data_account_info_snapshot', ['balance_free'], unique=False) + op.create_index(op.f('ix_data_account_info_snapshot_balance_reserved'), 'data_account_info_snapshot', ['balance_reserved'], unique=False) + op.create_index(op.f('ix_data_account_info_snapshot_balance_total'), 'data_account_info_snapshot', ['balance_total'], unique=False) + op.create_index(op.f('ix_data_account_info_snapshot_block_id'), 'data_account_info_snapshot', ['block_id'], unique=False) + op.create_table('data_account_search_index', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('block_id', sa.Integer(), nullable=False), + sa.Column('extrinsic_idx', sa.Integer(), nullable=True), + sa.Column('event_idx', sa.Integer(), nullable=True), + sa.Column('account_id', sa.String(length=64), nullable=True), + sa.Column('index_type_id', sa.Integer(), nullable=False), + sa.Column('sorting_value', sa.Numeric(precision=65, scale=0), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_data_account_search_index_account_id'), 'data_account_search_index', ['account_id'], unique=False) + op.create_index(op.f('ix_data_account_search_index_block_id'), 'data_account_search_index', ['block_id'], unique=False) + op.create_index(op.f('ix_data_account_search_index_event_idx'), 'data_account_search_index', ['event_idx'], unique=False) + op.create_index(op.f('ix_data_account_search_index_extrinsic_idx'), 'data_account_search_index', ['extrinsic_idx'], unique=False) + op.create_index(op.f('ix_data_account_search_index_index_type_id'), 'data_account_search_index', ['index_type_id'], unique=False) + op.create_index(op.f('ix_data_account_search_index_sorting_value'), 'data_account_search_index', ['sorting_value'], unique=False) + op.create_table('data_account_search_index_type', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=64), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_data_account_search_index_type_name'), 'data_account_search_index_type', ['name'], unique=False) + op.create_table('data_block', + sa.Column('id', sa.Integer(), autoincrement=False, nullable=False), + sa.Column('parent_id', sa.Integer(), nullable=False), + sa.Column('hash', sa.String(length=66), nullable=False), + sa.Column('parent_hash', sa.String(length=66), nullable=False), + sa.Column('state_root', sa.String(length=66), nullable=False), + sa.Column('extrinsics_root', sa.String(length=66), nullable=False), + sa.Column('count_extrinsics', sa.Integer(), nullable=False), + sa.Column('count_extrinsics_unsigned', sa.Integer(), nullable=False), + sa.Column('count_extrinsics_signed', sa.Integer(), nullable=False), + sa.Column('count_extrinsics_error', sa.Integer(), nullable=False), + sa.Column('count_extrinsics_success', sa.Integer(), nullable=False), + sa.Column('count_extrinsics_signedby_address', sa.Integer(), nullable=False), + sa.Column('count_extrinsics_signedby_index', sa.Integer(), nullable=False), + sa.Column('count_events', sa.Integer(), nullable=False), + sa.Column('count_events_system', sa.Integer(), nullable=False), + sa.Column('count_events_module', sa.Integer(), nullable=False), + sa.Column('count_events_extrinsic', sa.Integer(), nullable=False), + sa.Column('count_events_finalization', sa.Integer(), nullable=False), + sa.Column('count_accounts', sa.Integer(), nullable=False), + sa.Column('count_accounts_new', sa.Integer(), nullable=False), + sa.Column('count_accounts_reaped', sa.Integer(), nullable=False), + sa.Column('count_sessions_new', sa.Integer(), nullable=False), + sa.Column('count_contracts_new', sa.Integer(), nullable=False), + sa.Column('count_log', sa.Integer(), nullable=False), + sa.Column('range10000', sa.Integer(), nullable=False), + sa.Column('range100000', sa.Integer(), nullable=False), + sa.Column('range1000000', sa.Integer(), nullable=False), + sa.Column('datetime', sa.DateTime(timezone=True), nullable=True), + sa.Column('year', sa.Integer(), nullable=True), + sa.Column('month', sa.Integer(), nullable=True), + sa.Column('week', sa.Integer(), nullable=True), + sa.Column('day', sa.Integer(), nullable=True), + sa.Column('hour', sa.Integer(), nullable=True), + sa.Column('full_month', sa.Integer(), nullable=True), + sa.Column('full_week', sa.Integer(), nullable=True), + sa.Column('full_day', sa.Integer(), nullable=True), + sa.Column('full_hour', sa.Integer(), nullable=True), + sa.Column('logs', sa.JSON(), nullable=True), + sa.Column('authority_index', sa.Integer(), nullable=True), + sa.Column('slot_number', sa.Numeric(precision=65, scale=0), nullable=True), + sa.Column('spec_version_id', sa.String(length=64), nullable=False), + sa.Column('debug_info', sa.JSON(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_data_block_hash'), 'data_block', ['hash'], unique=True) + op.create_index(op.f('ix_data_block_parent_hash'), 'data_block', ['parent_hash'], unique=False) + op.create_table('data_block_total', + sa.Column('id', sa.Integer(), autoincrement=False, nullable=False), + sa.Column('session_id', sa.Integer(), nullable=True), + sa.Column('parent_datetime', sa.DateTime(), nullable=True), + sa.Column('blocktime', sa.Integer(), nullable=False), + sa.Column('author', sa.String(length=64), nullable=True), + sa.Column('total_extrinsics', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_extrinsics_success', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_extrinsics_error', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_extrinsics_signed', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_extrinsics_unsigned', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_extrinsics_signedby_address', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_extrinsics_signedby_index', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_events', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_events_system', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_events_module', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_events_extrinsic', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_events_finalization', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_logs', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_blocktime', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_accounts', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_accounts_new', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_accounts_reaped', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_sessions_new', sa.Numeric(precision=65, scale=0), nullable=False), + sa.Column('total_contracts_new', sa.Numeric(precision=65, scale=0), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_data_block_total_author'), 'data_block_total', ['author'], unique=False) + op.create_table('data_contract', + sa.Column('code_hash', sa.String(length=64), nullable=False), + sa.Column('bytecode', mysql.LONGTEXT(), nullable=True), + sa.Column('source', mysql.LONGTEXT(), nullable=True), + sa.Column('abi', sa.JSON(), nullable=True), + sa.Column('compiler', sa.String(length=64), nullable=True), + sa.Column('created_at_block', sa.Integer(), nullable=False), + sa.Column('created_at_extrinsic', sa.Integer(), nullable=True), + sa.Column('created_at_event', sa.Integer(), nullable=True), + sa.PrimaryKeyConstraint('code_hash') + ) + op.create_table('data_event', + sa.Column('block_id', sa.Integer(), nullable=False), + sa.Column('event_idx', sa.Integer(), nullable=False), + sa.Column('extrinsic_idx', sa.Integer(), nullable=True), + sa.Column('type', sa.String(length=4), nullable=True), + sa.Column('spec_version_id', sa.Integer(), nullable=True), + sa.Column('module_id', sa.String(length=64), nullable=True), + sa.Column('event_id', sa.String(length=64), nullable=True), + sa.Column('system', sa.SmallInteger(), nullable=False), + sa.Column('module', sa.SmallInteger(), nullable=False), + sa.Column('phase', sa.SmallInteger(), nullable=True), + sa.Column('attributes', sa.JSON(), nullable=True), + sa.Column('codec_error', sa.Boolean(), nullable=True), + sa.PrimaryKeyConstraint('block_id', 'event_idx') + ) + op.create_index(op.f('ix_data_event_block_id'), 'data_event', ['block_id'], unique=False) + op.create_index(op.f('ix_data_event_event_id'), 'data_event', ['event_id'], unique=False) + op.create_index(op.f('ix_data_event_event_idx'), 'data_event', ['event_idx'], unique=False) + op.create_index(op.f('ix_data_event_extrinsic_idx'), 'data_event', ['extrinsic_idx'], unique=False) + op.create_index(op.f('ix_data_event_module'), 'data_event', ['module'], unique=False) + op.create_index(op.f('ix_data_event_module_id'), 'data_event', ['module_id'], unique=False) + op.create_index(op.f('ix_data_event_system'), 'data_event', ['system'], unique=False) + op.create_index(op.f('ix_data_event_type'), 'data_event', ['type'], unique=False) + op.create_table('data_extrinsic', + sa.Column('block_id', sa.Integer(), nullable=False), + sa.Column('extrinsic_idx', sa.Integer(), nullable=False), + sa.Column('extrinsic_hash', sa.String(length=64), nullable=True), + sa.Column('extrinsic_length', sa.String(length=10), nullable=True), + sa.Column('extrinsic_version', sa.String(length=2), nullable=True), + sa.Column('signed', sa.SmallInteger(), nullable=False), + sa.Column('unsigned', sa.SmallInteger(), nullable=False), + sa.Column('signedby_address', sa.SmallInteger(), nullable=False), + sa.Column('signedby_index', sa.SmallInteger(), nullable=False), + sa.Column('address_length', sa.String(length=2), nullable=True), + sa.Column('address', sa.String(length=64), nullable=True), + sa.Column('account_index', sa.String(length=16), nullable=True), + sa.Column('account_idx', sa.Integer(), nullable=True), + sa.Column('signature', sa.String(length=128), nullable=True), + sa.Column('nonce', sa.Integer(), nullable=True), + sa.Column('era', sa.String(length=4), nullable=True), + sa.Column('call', sa.String(length=4), nullable=True), + sa.Column('module_id', sa.String(length=64), nullable=True), + sa.Column('call_id', sa.String(length=64), nullable=True), + sa.Column('params', sa.JSON(), nullable=True), + sa.Column('success', sa.SmallInteger(), nullable=False), + sa.Column('error', sa.SmallInteger(), nullable=False), + sa.Column('spec_version_id', sa.Integer(), nullable=True), + sa.Column('codec_error', sa.Boolean(), nullable=True), + sa.PrimaryKeyConstraint('block_id', 'extrinsic_idx') + ) + op.create_index(op.f('ix_data_extrinsic_account_idx'), 'data_extrinsic', ['account_idx'], unique=False) + op.create_index(op.f('ix_data_extrinsic_account_index'), 'data_extrinsic', ['account_index'], unique=False) + op.create_index(op.f('ix_data_extrinsic_address'), 'data_extrinsic', ['address'], unique=False) + op.create_index(op.f('ix_data_extrinsic_block_id'), 'data_extrinsic', ['block_id'], unique=False) + op.create_index(op.f('ix_data_extrinsic_call_id'), 'data_extrinsic', ['call_id'], unique=False) + op.create_index(op.f('ix_data_extrinsic_extrinsic_hash'), 'data_extrinsic', ['extrinsic_hash'], unique=False) + op.create_index(op.f('ix_data_extrinsic_extrinsic_idx'), 'data_extrinsic', ['extrinsic_idx'], unique=False) + op.create_index(op.f('ix_data_extrinsic_module_id'), 'data_extrinsic', ['module_id'], unique=False) + op.create_index(op.f('ix_data_extrinsic_signed'), 'data_extrinsic', ['signed'], unique=False) + op.create_index(op.f('ix_data_extrinsic_unsigned'), 'data_extrinsic', ['unsigned'], unique=False) + op.create_table('data_identity_audit', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('account_id', sa.String(length=64), nullable=True), + sa.Column('block_id', sa.Integer(), nullable=False), + sa.Column('extrinsic_idx', sa.Integer(), nullable=True), + sa.Column('event_idx', sa.Integer(), nullable=True), + sa.Column('type_id', sa.Integer(), nullable=False), + sa.Column('data', sa.JSON(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_data_identity_audit_block_id'), 'data_identity_audit', ['block_id'], unique=False) + op.create_table('data_identity_judgement', + sa.Column('registrar_index', sa.Integer(), nullable=False), + sa.Column('account_id', sa.String(length=64), nullable=False), + sa.Column('judgement', sa.String(length=32), nullable=True), + sa.Column('created_at_block', sa.Integer(), nullable=False), + sa.Column('updated_at_block', sa.Integer(), nullable=False), + sa.PrimaryKeyConstraint('registrar_index', 'account_id') + ) + op.create_index(op.f('ix_data_identity_judgement_account_id'), 'data_identity_judgement', ['account_id'], unique=False) + op.create_table('data_identity_judgement_audit', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('registrar_index', sa.Integer(), nullable=True), + sa.Column('account_id', sa.String(length=64), nullable=True), + sa.Column('block_id', sa.Integer(), nullable=False), + sa.Column('extrinsic_idx', sa.Integer(), nullable=True), + sa.Column('event_idx', sa.Integer(), nullable=True), + sa.Column('type_id', sa.Integer(), nullable=False), + sa.Column('data', sa.JSON(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_data_identity_judgement_audit_block_id'), 'data_identity_judgement_audit', ['block_id'], unique=False) + op.create_table('data_log', + sa.Column('block_id', sa.Integer(), autoincrement=False, nullable=False), + sa.Column('log_idx', sa.Integer(), autoincrement=False, nullable=False), + sa.Column('type_id', sa.Integer(), nullable=True), + sa.Column('type', sa.String(length=64), nullable=True), + sa.Column('data', sa.JSON(), nullable=True), + sa.PrimaryKeyConstraint('block_id', 'log_idx') + ) + op.create_index(op.f('ix_data_log_type_id'), 'data_log', ['type_id'], unique=False) + op.create_table('data_reorg_block', + sa.Column('hash', sa.String(length=66), nullable=False), + sa.Column('id', sa.Integer(), autoincrement=False, nullable=True), + sa.Column('parent_id', sa.Integer(), nullable=False), + sa.Column('parent_hash', sa.String(length=66), nullable=False), + sa.Column('state_root', sa.String(length=66), nullable=False), + sa.Column('extrinsics_root', sa.String(length=66), nullable=False), + sa.Column('count_extrinsics', sa.Integer(), nullable=False), + sa.Column('count_extrinsics_unsigned', sa.Integer(), nullable=False), + sa.Column('count_extrinsics_signed', sa.Integer(), nullable=False), + sa.Column('count_extrinsics_error', sa.Integer(), nullable=False), + sa.Column('count_extrinsics_success', sa.Integer(), nullable=False), + sa.Column('count_extrinsics_signedby_address', sa.Integer(), nullable=False), + sa.Column('count_extrinsics_signedby_index', sa.Integer(), nullable=False), + sa.Column('count_events', sa.Integer(), nullable=False), + sa.Column('count_events_system', sa.Integer(), nullable=False), + sa.Column('count_events_module', sa.Integer(), nullable=False), + sa.Column('count_events_extrinsic', sa.Integer(), nullable=False), + sa.Column('count_events_finalization', sa.Integer(), nullable=False), + sa.Column('count_accounts', sa.Integer(), nullable=False), + sa.Column('count_accounts_new', sa.Integer(), nullable=False), + sa.Column('count_accounts_reaped', sa.Integer(), nullable=False), + sa.Column('count_sessions_new', sa.Integer(), nullable=False), + sa.Column('count_contracts_new', sa.Integer(), nullable=False), + sa.Column('count_log', sa.Integer(), nullable=False), + sa.Column('range10000', sa.Integer(), nullable=False), + sa.Column('range100000', sa.Integer(), nullable=False), + sa.Column('range1000000', sa.Integer(), nullable=False), + sa.Column('datetime', sa.DateTime(timezone=True), nullable=True), + sa.Column('year', sa.Integer(), nullable=True), + sa.Column('month', sa.Integer(), nullable=True), + sa.Column('week', sa.Integer(), nullable=True), + sa.Column('day', sa.Integer(), nullable=True), + sa.Column('hour', sa.Integer(), nullable=True), + sa.Column('full_month', sa.Integer(), nullable=True), + sa.Column('full_week', sa.Integer(), nullable=True), + sa.Column('full_day', sa.Integer(), nullable=True), + sa.Column('full_hour', sa.Integer(), nullable=True), + sa.Column('logs', sa.JSON(), nullable=True), + sa.Column('authority_index', sa.Integer(), nullable=True), + sa.Column('slot_number', sa.Numeric(precision=65, scale=0), nullable=True), + sa.Column('spec_version_id', sa.String(length=64), nullable=False), + sa.Column('debug_info', sa.JSON(), nullable=True), + sa.PrimaryKeyConstraint('hash') + ) + op.create_index(op.f('ix_data_reorg_block_hash'), 'data_reorg_block', ['hash'], unique=False) + op.create_index(op.f('ix_data_reorg_block_id'), 'data_reorg_block', ['id'], unique=False) + op.create_index(op.f('ix_data_reorg_block_parent_hash'), 'data_reorg_block', ['parent_hash'], unique=False) + op.create_table('data_reorg_event', + sa.Column('block_hash', sa.String(length=66), nullable=False), + sa.Column('block_id', sa.Integer(), nullable=True), + sa.Column('event_idx', sa.Integer(), nullable=False), + sa.Column('extrinsic_idx', sa.Integer(), nullable=True), + sa.Column('type', sa.String(length=4), nullable=True), + sa.Column('spec_version_id', sa.Integer(), nullable=True), + sa.Column('module_id', sa.String(length=64), nullable=True), + sa.Column('event_id', sa.String(length=64), nullable=True), + sa.Column('system', sa.SmallInteger(), nullable=False), + sa.Column('module', sa.SmallInteger(), nullable=False), + sa.Column('phase', sa.SmallInteger(), nullable=True), + sa.Column('attributes', sa.JSON(), nullable=True), + sa.Column('codec_error', sa.Boolean(), nullable=True), + sa.PrimaryKeyConstraint('block_hash', 'event_idx') + ) + op.create_index(op.f('ix_data_reorg_event_block_hash'), 'data_reorg_event', ['block_hash'], unique=False) + op.create_index(op.f('ix_data_reorg_event_block_id'), 'data_reorg_event', ['block_id'], unique=False) + op.create_index(op.f('ix_data_reorg_event_event_id'), 'data_reorg_event', ['event_id'], unique=False) + op.create_index(op.f('ix_data_reorg_event_event_idx'), 'data_reorg_event', ['event_idx'], unique=False) + op.create_index(op.f('ix_data_reorg_event_extrinsic_idx'), 'data_reorg_event', ['extrinsic_idx'], unique=False) + op.create_index(op.f('ix_data_reorg_event_module'), 'data_reorg_event', ['module'], unique=False) + op.create_index(op.f('ix_data_reorg_event_module_id'), 'data_reorg_event', ['module_id'], unique=False) + op.create_index(op.f('ix_data_reorg_event_system'), 'data_reorg_event', ['system'], unique=False) + op.create_index(op.f('ix_data_reorg_event_type'), 'data_reorg_event', ['type'], unique=False) + op.create_table('data_reorg_extrinsic', + sa.Column('block_hash', sa.String(length=66), nullable=False), + sa.Column('block_id', sa.Integer(), nullable=True), + sa.Column('extrinsic_idx', sa.Integer(), nullable=False), + sa.Column('extrinsic_hash', sa.String(length=64), nullable=True), + sa.Column('extrinsic_length', sa.String(length=10), nullable=True), + sa.Column('extrinsic_version', sa.String(length=2), nullable=True), + sa.Column('signed', sa.SmallInteger(), nullable=False), + sa.Column('unsigned', sa.SmallInteger(), nullable=False), + sa.Column('signedby_address', sa.SmallInteger(), nullable=False), + sa.Column('signedby_index', sa.SmallInteger(), nullable=False), + sa.Column('address_length', sa.String(length=2), nullable=True), + sa.Column('address', sa.String(length=64), nullable=True), + sa.Column('account_index', sa.String(length=16), nullable=True), + sa.Column('account_idx', sa.Integer(), nullable=True), + sa.Column('signature', sa.String(length=128), nullable=True), + sa.Column('nonce', sa.Integer(), nullable=True), + sa.Column('era', sa.String(length=4), nullable=True), + sa.Column('call', sa.String(length=4), nullable=True), + sa.Column('module_id', sa.String(length=64), nullable=True), + sa.Column('call_id', sa.String(length=64), nullable=True), + sa.Column('params', sa.JSON(), nullable=True), + sa.Column('success', sa.SmallInteger(), nullable=False), + sa.Column('error', sa.SmallInteger(), nullable=False), + sa.Column('spec_version_id', sa.Integer(), nullable=True), + sa.Column('codec_error', sa.Boolean(), nullable=True), + sa.PrimaryKeyConstraint('block_hash', 'extrinsic_idx') + ) + op.create_index(op.f('ix_data_reorg_extrinsic_account_idx'), 'data_reorg_extrinsic', ['account_idx'], unique=False) + op.create_index(op.f('ix_data_reorg_extrinsic_account_index'), 'data_reorg_extrinsic', ['account_index'], unique=False) + op.create_index(op.f('ix_data_reorg_extrinsic_address'), 'data_reorg_extrinsic', ['address'], unique=False) + op.create_index(op.f('ix_data_reorg_extrinsic_block_hash'), 'data_reorg_extrinsic', ['block_hash'], unique=False) + op.create_index(op.f('ix_data_reorg_extrinsic_block_id'), 'data_reorg_extrinsic', ['block_id'], unique=False) + op.create_index(op.f('ix_data_reorg_extrinsic_call_id'), 'data_reorg_extrinsic', ['call_id'], unique=False) + op.create_index(op.f('ix_data_reorg_extrinsic_extrinsic_hash'), 'data_reorg_extrinsic', ['extrinsic_hash'], unique=False) + op.create_index(op.f('ix_data_reorg_extrinsic_extrinsic_idx'), 'data_reorg_extrinsic', ['extrinsic_idx'], unique=False) + op.create_index(op.f('ix_data_reorg_extrinsic_module_id'), 'data_reorg_extrinsic', ['module_id'], unique=False) + op.create_index(op.f('ix_data_reorg_extrinsic_signed'), 'data_reorg_extrinsic', ['signed'], unique=False) + op.create_index(op.f('ix_data_reorg_extrinsic_unsigned'), 'data_reorg_extrinsic', ['unsigned'], unique=False) + op.create_table('data_reorg_log', + sa.Column('block_hash', sa.String(length=66), nullable=False), + sa.Column('block_id', sa.Integer(), autoincrement=False, nullable=True), + sa.Column('log_idx', sa.Integer(), autoincrement=False, nullable=False), + sa.Column('type_id', sa.Integer(), nullable=True), + sa.Column('type', sa.String(length=64), nullable=True), + sa.Column('data', sa.JSON(), nullable=True), + sa.PrimaryKeyConstraint('block_hash', 'log_idx') + ) + op.create_index(op.f('ix_data_reorg_log_block_hash'), 'data_reorg_log', ['block_hash'], unique=False) + op.create_index(op.f('ix_data_reorg_log_type_id'), 'data_reorg_log', ['type_id'], unique=False) + op.create_table('data_session', + sa.Column('id', sa.Integer(), autoincrement=False, nullable=False), + sa.Column('start_at_block', sa.Integer(), nullable=True), + sa.Column('era', sa.Integer(), nullable=True), + sa.Column('era_idx', sa.Integer(), nullable=True), + sa.Column('created_at_block', sa.Integer(), nullable=False), + sa.Column('created_at_extrinsic', sa.Integer(), nullable=True), + sa.Column('created_at_event', sa.Integer(), nullable=True), + sa.Column('count_validators', sa.Integer(), nullable=True), + sa.Column('count_nominators', sa.Integer(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('data_session_nominator', + sa.Column('session_id', sa.Integer(), autoincrement=False, nullable=False), + sa.Column('rank_validator', sa.Integer(), autoincrement=False, nullable=False), + sa.Column('rank_nominator', sa.Integer(), autoincrement=False, nullable=False), + sa.Column('nominator_stash', sa.String(length=64), nullable=True), + sa.Column('nominator_controller', sa.String(length=64), nullable=True), + sa.Column('bonded', sa.Numeric(precision=65, scale=0), nullable=True), + sa.PrimaryKeyConstraint('session_id', 'rank_validator', 'rank_nominator') + ) + op.create_index(op.f('ix_data_session_nominator_nominator_controller'), 'data_session_nominator', ['nominator_controller'], unique=False) + op.create_index(op.f('ix_data_session_nominator_nominator_stash'), 'data_session_nominator', ['nominator_stash'], unique=False) + op.create_index(op.f('ix_data_session_nominator_rank_nominator'), 'data_session_nominator', ['rank_nominator'], unique=False) + op.create_index(op.f('ix_data_session_nominator_rank_validator'), 'data_session_nominator', ['rank_validator'], unique=False) + op.create_table('data_session_total', + sa.Column('id', sa.Integer(), autoincrement=False, nullable=False), + sa.Column('end_at_block', sa.Integer(), nullable=True), + sa.Column('count_blocks', sa.Integer(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('data_session_validator', + sa.Column('session_id', sa.Integer(), autoincrement=False, nullable=False), + sa.Column('rank_validator', sa.Integer(), autoincrement=False, nullable=False), + sa.Column('validator_stash', sa.String(length=64), nullable=True), + sa.Column('validator_controller', sa.String(length=64), nullable=True), + sa.Column('validator_session', sa.String(length=64), nullable=True), + sa.Column('bonded_total', sa.Numeric(precision=65, scale=0), nullable=True), + sa.Column('bonded_active', sa.Numeric(precision=65, scale=0), nullable=True), + sa.Column('bonded_nominators', sa.Numeric(precision=65, scale=0), nullable=True), + sa.Column('bonded_own', sa.Numeric(precision=65, scale=0), nullable=True), + sa.Column('unlocking', sa.JSON(), nullable=True), + sa.Column('count_nominators', sa.Integer(), nullable=True), + sa.Column('unstake_threshold', sa.Integer(), nullable=True), + sa.Column('commission', sa.Numeric(precision=65, scale=0), nullable=True), + sa.PrimaryKeyConstraint('session_id', 'rank_validator') + ) + op.create_index(op.f('ix_data_session_validator_rank_validator'), 'data_session_validator', ['rank_validator'], unique=False) + op.create_index(op.f('ix_data_session_validator_validator_controller'), 'data_session_validator', ['validator_controller'], unique=False) + op.create_index(op.f('ix_data_session_validator_validator_session'), 'data_session_validator', ['validator_session'], unique=False) + op.create_index(op.f('ix_data_session_validator_validator_stash'), 'data_session_validator', ['validator_stash'], unique=False) + op.create_table('data_storage', + sa.Column('block_id', sa.Integer(), autoincrement=False, nullable=False), + sa.Column('storage_key', sa.String(length=255), nullable=False), + sa.Column('storage_key_prefix', sa.String(length=64), nullable=True), + sa.Column('spec_version_id', sa.Integer(), nullable=True), + sa.Column('module_prefix', sa.String(length=255), nullable=True), + sa.Column('function_name', sa.String(length=255), nullable=True), + sa.Column('return_type', sa.String(length=255), nullable=True), + sa.Column('data', sa.JSON(), nullable=True), + sa.Column('data_raw', mysql.LONGTEXT(), nullable=True), + sa.Column('error', sa.SmallInteger(), nullable=False), + sa.Column('comments', mysql.LONGTEXT(), nullable=True), + sa.PrimaryKeyConstraint('block_id', 'storage_key') + ) + op.create_index(op.f('ix_data_storage_block_id'), 'data_storage', ['block_id'], unique=False) + op.create_index(op.f('ix_data_storage_spec_version_id'), 'data_storage', ['spec_version_id'], unique=False) + op.create_index(op.f('ix_data_storage_storage_key'), 'data_storage', ['storage_key'], unique=False) + op.create_index(op.f('ix_data_storage_storage_key_prefix'), 'data_storage', ['storage_key_prefix'], unique=False) + op.create_table('harvester_setting', + sa.Column('key', sa.String(length=64), nullable=False), + sa.Column('value', sa.String(length=255), nullable=True), + sa.Column('notes', sa.String(length=255), nullable=True), + sa.PrimaryKeyConstraint('key') + ) + op.create_table('harvester_status', + sa.Column('key', sa.String(length=64), nullable=False), + sa.Column('value', sa.String(length=255), nullable=True), + sa.Column('last_modified', sa.DateTime(timezone=True), nullable=True), + sa.Column('notes', sa.String(length=255), nullable=True), + sa.PrimaryKeyConstraint('key') + ) + op.create_table('runtime', + sa.Column('id', sa.Integer(), autoincrement=False, nullable=False), + sa.Column('impl_name', sa.String(length=255), nullable=True), + sa.Column('impl_version', sa.Integer(), nullable=True), + sa.Column('spec_version', sa.Integer(), nullable=False), + sa.Column('spec_name', sa.String(length=255), nullable=True), + sa.Column('authoring_version', sa.Integer(), nullable=True), + sa.Column('apis', sa.JSON(), nullable=True), + sa.Column('json_metadata', sa.JSON(), nullable=True), + sa.Column('json_metadata_decoded', sa.JSON(), nullable=True), + sa.Column('count_modules', sa.Integer(), nullable=False), + sa.Column('count_call_functions', sa.Integer(), nullable=False), + sa.Column('count_storage_functions', sa.Integer(), nullable=False), + sa.Column('count_events', sa.Integer(), nullable=False), + sa.Column('count_constants', sa.Integer(), server_default='0', nullable=False), + sa.Column('count_errors', sa.Integer(), server_default='0', nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('spec_version') + ) + op.create_table('runtime_call', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('spec_version', sa.Integer(), nullable=False), + sa.Column('module_id', sa.String(length=64), nullable=False), + sa.Column('call_id', sa.String(length=64), nullable=False), + sa.Column('index', sa.Integer(), nullable=False), + sa.Column('prefix', sa.String(length=255), nullable=True), + sa.Column('code', sa.String(length=255), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('lookup', sa.String(length=4), nullable=True), + sa.Column('documentation', sa.Text(), nullable=True), + sa.Column('count_params', sa.Integer(), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('spec_version', 'module_id', 'call_id') + ) + op.create_index(op.f('ix_runtime_call_lookup'), 'runtime_call', ['lookup'], unique=False) + op.create_table('runtime_call_param', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('runtime_call_id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('type', sa.String(length=255), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('runtime_call_id', 'name') + ) + op.create_table('runtime_constant', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('spec_version', sa.Integer(), nullable=True), + sa.Column('module_id', sa.String(length=64), nullable=True), + sa.Column('index', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('type', sa.String(length=255), nullable=True), + sa.Column('value', sa.String(length=255), nullable=True), + sa.Column('documentation', sa.Text(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_runtime_constant_name'), 'runtime_constant', ['name'], unique=False) + op.create_table('runtime_error', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('spec_version', sa.Integer(), nullable=True), + sa.Column('module_id', sa.String(length=64), nullable=True), + sa.Column('index', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('documentation', sa.Text(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_runtime_error_name'), 'runtime_error', ['name'], unique=False) + op.create_table('runtime_event', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('spec_version', sa.Integer(), nullable=False), + sa.Column('module_id', sa.String(length=64), nullable=False), + sa.Column('event_id', sa.String(length=64), nullable=False), + sa.Column('index', sa.Integer(), nullable=False), + sa.Column('prefix', sa.String(length=255), nullable=True), + sa.Column('code', sa.String(length=255), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('lookup', sa.String(length=4), nullable=True), + sa.Column('documentation', sa.Text(), nullable=True), + sa.Column('count_attributes', sa.Integer(), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('spec_version', 'module_id', 'event_id') + ) + op.create_index(op.f('ix_runtime_event_lookup'), 'runtime_event', ['lookup'], unique=False) + op.create_table('runtime_event_attribute', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('runtime_event_id', sa.Integer(), nullable=False), + sa.Column('index', sa.Integer(), nullable=False), + sa.Column('type', sa.String(length=255), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('runtime_event_id', 'index') + ) + op.create_table('runtime_module', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('spec_version', sa.Integer(), nullable=False), + sa.Column('module_id', sa.String(length=64), nullable=False), + sa.Column('prefix', sa.String(length=255), nullable=True), + sa.Column('code', sa.String(length=255), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('lookup', sa.String(length=4), nullable=True), + sa.Column('count_call_functions', sa.Integer(), nullable=False), + sa.Column('count_storage_functions', sa.Integer(), nullable=False), + sa.Column('count_events', sa.Integer(), nullable=False), + sa.Column('count_constants', sa.Integer(), server_default='0', nullable=False), + sa.Column('count_errors', sa.Integer(), server_default='0', nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('spec_version', 'module_id') + ) + op.create_index(op.f('ix_runtime_module_lookup'), 'runtime_module', ['lookup'], unique=False) + op.create_table('runtime_storage', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('spec_version', sa.Integer(), nullable=True), + sa.Column('module_id', sa.String(length=64), nullable=True), + sa.Column('storage_key', sa.String(length=255), nullable=True), + sa.Column('index', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('lookup', sa.String(length=4), nullable=True), + sa.Column('default', sa.String(length=300), nullable=True), + sa.Column('modifier', sa.String(length=64), nullable=True), + sa.Column('type_hasher', sa.String(length=255), nullable=True), + sa.Column('type_key1', sa.String(length=255), nullable=True), + sa.Column('type_key2', sa.String(length=255), nullable=True), + sa.Column('type_value', sa.String(length=255), nullable=True), + sa.Column('type_is_linked', sa.SmallInteger(), nullable=True), + sa.Column('type_key2hasher', sa.String(length=255), nullable=True), + sa.Column('documentation', sa.Text(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_runtime_storage_lookup'), 'runtime_storage', ['lookup'], unique=False) + op.create_table('runtime_type', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('spec_version', sa.Integer(), nullable=False), + sa.Column('type_string', sa.String(length=255), nullable=True), + sa.Column('decoder_class', sa.String(length=255), nullable=True), + sa.Column('is_primitive_runtime', sa.Boolean(), nullable=True), + sa.Column('is_primitive_core', sa.Boolean(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('spec_version', 'type_string') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('runtime_type') + op.drop_index(op.f('ix_runtime_storage_lookup'), table_name='runtime_storage') + op.drop_table('runtime_storage') + op.drop_index(op.f('ix_runtime_module_lookup'), table_name='runtime_module') + op.drop_table('runtime_module') + op.drop_table('runtime_event_attribute') + op.drop_index(op.f('ix_runtime_event_lookup'), table_name='runtime_event') + op.drop_table('runtime_event') + op.drop_index(op.f('ix_runtime_error_name'), table_name='runtime_error') + op.drop_table('runtime_error') + op.drop_index(op.f('ix_runtime_constant_name'), table_name='runtime_constant') + op.drop_table('runtime_constant') + op.drop_table('runtime_call_param') + op.drop_index(op.f('ix_runtime_call_lookup'), table_name='runtime_call') + op.drop_table('runtime_call') + op.drop_table('runtime') + op.drop_table('harvester_status') + op.drop_table('harvester_setting') + op.drop_index(op.f('ix_data_storage_storage_key_prefix'), table_name='data_storage') + op.drop_index(op.f('ix_data_storage_storage_key'), table_name='data_storage') + op.drop_index(op.f('ix_data_storage_spec_version_id'), table_name='data_storage') + op.drop_index(op.f('ix_data_storage_block_id'), table_name='data_storage') + op.drop_table('data_storage') + op.drop_index(op.f('ix_data_session_validator_validator_stash'), table_name='data_session_validator') + op.drop_index(op.f('ix_data_session_validator_validator_session'), table_name='data_session_validator') + op.drop_index(op.f('ix_data_session_validator_validator_controller'), table_name='data_session_validator') + op.drop_index(op.f('ix_data_session_validator_rank_validator'), table_name='data_session_validator') + op.drop_table('data_session_validator') + op.drop_table('data_session_total') + op.drop_index(op.f('ix_data_session_nominator_rank_validator'), table_name='data_session_nominator') + op.drop_index(op.f('ix_data_session_nominator_rank_nominator'), table_name='data_session_nominator') + op.drop_index(op.f('ix_data_session_nominator_nominator_stash'), table_name='data_session_nominator') + op.drop_index(op.f('ix_data_session_nominator_nominator_controller'), table_name='data_session_nominator') + op.drop_table('data_session_nominator') + op.drop_table('data_session') + op.drop_index(op.f('ix_data_reorg_log_type_id'), table_name='data_reorg_log') + op.drop_index(op.f('ix_data_reorg_log_block_hash'), table_name='data_reorg_log') + op.drop_table('data_reorg_log') + op.drop_index(op.f('ix_data_reorg_extrinsic_unsigned'), table_name='data_reorg_extrinsic') + op.drop_index(op.f('ix_data_reorg_extrinsic_signed'), table_name='data_reorg_extrinsic') + op.drop_index(op.f('ix_data_reorg_extrinsic_module_id'), table_name='data_reorg_extrinsic') + op.drop_index(op.f('ix_data_reorg_extrinsic_extrinsic_idx'), table_name='data_reorg_extrinsic') + op.drop_index(op.f('ix_data_reorg_extrinsic_extrinsic_hash'), table_name='data_reorg_extrinsic') + op.drop_index(op.f('ix_data_reorg_extrinsic_call_id'), table_name='data_reorg_extrinsic') + op.drop_index(op.f('ix_data_reorg_extrinsic_block_id'), table_name='data_reorg_extrinsic') + op.drop_index(op.f('ix_data_reorg_extrinsic_block_hash'), table_name='data_reorg_extrinsic') + op.drop_index(op.f('ix_data_reorg_extrinsic_address'), table_name='data_reorg_extrinsic') + op.drop_index(op.f('ix_data_reorg_extrinsic_account_index'), table_name='data_reorg_extrinsic') + op.drop_index(op.f('ix_data_reorg_extrinsic_account_idx'), table_name='data_reorg_extrinsic') + op.drop_table('data_reorg_extrinsic') + op.drop_index(op.f('ix_data_reorg_event_type'), table_name='data_reorg_event') + op.drop_index(op.f('ix_data_reorg_event_system'), table_name='data_reorg_event') + op.drop_index(op.f('ix_data_reorg_event_module_id'), table_name='data_reorg_event') + op.drop_index(op.f('ix_data_reorg_event_module'), table_name='data_reorg_event') + op.drop_index(op.f('ix_data_reorg_event_extrinsic_idx'), table_name='data_reorg_event') + op.drop_index(op.f('ix_data_reorg_event_event_idx'), table_name='data_reorg_event') + op.drop_index(op.f('ix_data_reorg_event_event_id'), table_name='data_reorg_event') + op.drop_index(op.f('ix_data_reorg_event_block_id'), table_name='data_reorg_event') + op.drop_index(op.f('ix_data_reorg_event_block_hash'), table_name='data_reorg_event') + op.drop_table('data_reorg_event') + op.drop_index(op.f('ix_data_reorg_block_parent_hash'), table_name='data_reorg_block') + op.drop_index(op.f('ix_data_reorg_block_id'), table_name='data_reorg_block') + op.drop_index(op.f('ix_data_reorg_block_hash'), table_name='data_reorg_block') + op.drop_table('data_reorg_block') + op.drop_index(op.f('ix_data_log_type_id'), table_name='data_log') + op.drop_table('data_log') + op.drop_index(op.f('ix_data_identity_judgement_audit_block_id'), table_name='data_identity_judgement_audit') + op.drop_table('data_identity_judgement_audit') + op.drop_index(op.f('ix_data_identity_judgement_account_id'), table_name='data_identity_judgement') + op.drop_table('data_identity_judgement') + op.drop_index(op.f('ix_data_identity_audit_block_id'), table_name='data_identity_audit') + op.drop_table('data_identity_audit') + op.drop_index(op.f('ix_data_extrinsic_unsigned'), table_name='data_extrinsic') + op.drop_index(op.f('ix_data_extrinsic_signed'), table_name='data_extrinsic') + op.drop_index(op.f('ix_data_extrinsic_module_id'), table_name='data_extrinsic') + op.drop_index(op.f('ix_data_extrinsic_extrinsic_idx'), table_name='data_extrinsic') + op.drop_index(op.f('ix_data_extrinsic_extrinsic_hash'), table_name='data_extrinsic') + op.drop_index(op.f('ix_data_extrinsic_call_id'), table_name='data_extrinsic') + op.drop_index(op.f('ix_data_extrinsic_block_id'), table_name='data_extrinsic') + op.drop_index(op.f('ix_data_extrinsic_address'), table_name='data_extrinsic') + op.drop_index(op.f('ix_data_extrinsic_account_index'), table_name='data_extrinsic') + op.drop_index(op.f('ix_data_extrinsic_account_idx'), table_name='data_extrinsic') + op.drop_table('data_extrinsic') + op.drop_index(op.f('ix_data_event_type'), table_name='data_event') + op.drop_index(op.f('ix_data_event_system'), table_name='data_event') + op.drop_index(op.f('ix_data_event_module_id'), table_name='data_event') + op.drop_index(op.f('ix_data_event_module'), table_name='data_event') + op.drop_index(op.f('ix_data_event_extrinsic_idx'), table_name='data_event') + op.drop_index(op.f('ix_data_event_event_idx'), table_name='data_event') + op.drop_index(op.f('ix_data_event_event_id'), table_name='data_event') + op.drop_index(op.f('ix_data_event_block_id'), table_name='data_event') + op.drop_table('data_event') + op.drop_table('data_contract') + op.drop_index(op.f('ix_data_block_total_author'), table_name='data_block_total') + op.drop_table('data_block_total') + op.drop_index(op.f('ix_data_block_parent_hash'), table_name='data_block') + op.drop_index(op.f('ix_data_block_hash'), table_name='data_block') + op.drop_table('data_block') + op.drop_index(op.f('ix_data_account_search_index_type_name'), table_name='data_account_search_index_type') + op.drop_table('data_account_search_index_type') + op.drop_index(op.f('ix_data_account_search_index_sorting_value'), table_name='data_account_search_index') + op.drop_index(op.f('ix_data_account_search_index_index_type_id'), table_name='data_account_search_index') + op.drop_index(op.f('ix_data_account_search_index_extrinsic_idx'), table_name='data_account_search_index') + op.drop_index(op.f('ix_data_account_search_index_event_idx'), table_name='data_account_search_index') + op.drop_index(op.f('ix_data_account_search_index_block_id'), table_name='data_account_search_index') + op.drop_index(op.f('ix_data_account_search_index_account_id'), table_name='data_account_search_index') + op.drop_table('data_account_search_index') + op.drop_index(op.f('ix_data_account_info_snapshot_block_id'), table_name='data_account_info_snapshot') + op.drop_index(op.f('ix_data_account_info_snapshot_balance_total'), table_name='data_account_info_snapshot') + op.drop_index(op.f('ix_data_account_info_snapshot_balance_reserved'), table_name='data_account_info_snapshot') + op.drop_index(op.f('ix_data_account_info_snapshot_balance_free'), table_name='data_account_info_snapshot') + op.drop_index(op.f('ix_data_account_info_snapshot_account_id'), table_name='data_account_info_snapshot') + op.drop_table('data_account_info_snapshot') + op.drop_index(op.f('ix_data_account_index_audit_block_id'), table_name='data_account_index_audit') + op.drop_index(op.f('ix_data_account_index_audit_account_index_id'), table_name='data_account_index_audit') + op.drop_index(op.f('ix_data_account_index_audit_account_id'), table_name='data_account_index_audit') + op.drop_table('data_account_index_audit') + op.drop_index(op.f('ix_data_account_index_short_address'), table_name='data_account_index') + op.drop_index(op.f('ix_data_account_index_account_id'), table_name='data_account_index') + op.drop_table('data_account_index') + op.drop_index(op.f('ix_data_account_audit_block_id'), table_name='data_account_audit') + op.drop_table('data_account_audit') + op.drop_index(op.f('ix_data_account_was_validator'), table_name='data_account') + op.drop_index(op.f('ix_data_account_was_tech_comm_member'), table_name='data_account') + op.drop_index(op.f('ix_data_account_was_sudo'), table_name='data_account') + op.drop_index(op.f('ix_data_account_was_registrar'), table_name='data_account') + op.drop_index(op.f('ix_data_account_was_nominator'), table_name='data_account') + op.drop_index(op.f('ix_data_account_was_council_member'), table_name='data_account') + op.drop_index(op.f('ix_data_account_parent_identity'), table_name='data_account') + op.drop_index(op.f('ix_data_account_is_validator'), table_name='data_account') + op.drop_index(op.f('ix_data_account_is_treasury'), table_name='data_account') + op.drop_index(op.f('ix_data_account_is_tech_comm_member'), table_name='data_account') + op.drop_index(op.f('ix_data_account_is_sudo'), table_name='data_account') + op.drop_index(op.f('ix_data_account_is_registrar'), table_name='data_account') + op.drop_index(op.f('ix_data_account_is_nominator'), table_name='data_account') + op.drop_index(op.f('ix_data_account_is_council_member'), table_name='data_account') + op.drop_index(op.f('ix_data_account_is_contract'), table_name='data_account') + op.drop_index(op.f('ix_data_account_index_address'), table_name='data_account') + op.drop_index(op.f('ix_data_account_identity_display'), table_name='data_account') + op.drop_index(op.f('ix_data_account_hash_blake2b'), table_name='data_account') + op.drop_index(op.f('ix_data_account_has_subidentity'), table_name='data_account') + op.drop_index(op.f('ix_data_account_has_identity'), table_name='data_account') + op.drop_index(op.f('ix_data_account_balance_total'), table_name='data_account') + op.drop_index(op.f('ix_data_account_balance_reserved'), table_name='data_account') + op.drop_index(op.f('ix_data_account_balance_free'), table_name='data_account') + op.drop_index(op.f('ix_data_account_address'), table_name='data_account') + op.drop_table('data_account') + # ### end Alembic commands ### diff --git a/pm-harvester/app/db/versions/3aa6678d275f_added_module_index_for_runtime_error.py b/pm-harvester/app/db/versions/3aa6678d275f_added_module_index_for_runtime_error.py new file mode 100644 index 00000000..581ce063 --- /dev/null +++ b/pm-harvester/app/db/versions/3aa6678d275f_added_module_index_for_runtime_error.py @@ -0,0 +1,294 @@ +"""Added module index for runtime error + +Revision ID: 3aa6678d275f +Revises: 38a7f29de7c7 +Create Date: 2020-06-22 13:56:59.441054 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +# revision identifiers, used by Alembic. +revision = '3aa6678d275f' +down_revision = '38a7f29de7c7' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index('ix_data_storage_block_id', table_name='data_storage') + op.drop_index('ix_data_storage_spec_version_id', table_name='data_storage') + op.drop_index('ix_data_storage_storage_key', table_name='data_storage') + op.drop_index('ix_data_storage_storage_key_prefix', table_name='data_storage') + op.drop_table('data_storage') + op.alter_column('data_account', 'has_identity', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'has_subidentity', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'is_contract', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'is_council_member', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'is_nominator', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'is_reaped', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'is_registrar', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'is_sudo', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'is_tech_comm_member', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'is_treasury', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'is_validator', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'was_council_member', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'was_nominator', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'was_registrar', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'was_sudo', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'was_tech_comm_member', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account', 'was_validator', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account_index', 'is_reclaimable', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_account_index', 'is_reclaimed', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_block', 'datetime', + existing_type=mysql.DATETIME(), + type_=sa.DateTime(timezone=True), + existing_nullable=True) + op.alter_column('data_event', 'codec_error', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_extrinsic', 'codec_error', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_extrinsic', 'signature', + existing_type=mysql.VARCHAR(length=128), + type_=sa.String(length=130), + existing_nullable=True) + op.alter_column('data_reorg_block', 'datetime', + existing_type=mysql.DATETIME(), + type_=sa.DateTime(timezone=True), + existing_nullable=True) + op.alter_column('data_reorg_event', 'codec_error', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_reorg_extrinsic', 'codec_error', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('data_reorg_extrinsic', 'signature', + existing_type=mysql.VARCHAR(length=128), + type_=sa.String(length=130), + existing_nullable=True) + op.alter_column('harvester_status', 'last_modified', + existing_type=mysql.DATETIME(), + type_=sa.DateTime(timezone=True), + existing_nullable=True) + op.add_column('runtime_error', sa.Column('module_index', sa.Integer(), nullable=True)) + op.alter_column('runtime_type', 'is_primitive_core', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + op.alter_column('runtime_type', 'is_primitive_runtime', + existing_type=mysql.TINYINT(display_width=1), + type_=sa.Boolean(), + existing_nullable=True) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column('runtime_type', 'is_primitive_runtime', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('runtime_type', 'is_primitive_core', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.drop_column('runtime_error', 'module_index') + op.alter_column('harvester_status', 'last_modified', + existing_type=sa.DateTime(timezone=True), + type_=mysql.DATETIME(), + existing_nullable=True) + op.alter_column('data_reorg_extrinsic', 'signature', + existing_type=sa.String(length=130), + type_=mysql.VARCHAR(length=128), + existing_nullable=True) + op.alter_column('data_reorg_extrinsic', 'codec_error', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_reorg_event', 'codec_error', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_reorg_block', 'datetime', + existing_type=sa.DateTime(timezone=True), + type_=mysql.DATETIME(), + existing_nullable=True) + op.alter_column('data_extrinsic', 'signature', + existing_type=sa.String(length=130), + type_=mysql.VARCHAR(length=128), + existing_nullable=True) + op.alter_column('data_extrinsic', 'codec_error', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_event', 'codec_error', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_block', 'datetime', + existing_type=sa.DateTime(timezone=True), + type_=mysql.DATETIME(), + existing_nullable=True) + op.alter_column('data_account_index', 'is_reclaimed', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account_index', 'is_reclaimable', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'was_validator', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'was_tech_comm_member', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'was_sudo', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'was_registrar', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'was_nominator', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'was_council_member', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'is_validator', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'is_treasury', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'is_tech_comm_member', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'is_sudo', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'is_registrar', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'is_reaped', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'is_nominator', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'is_council_member', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'is_contract', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'has_subidentity', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.alter_column('data_account', 'has_identity', + existing_type=sa.Boolean(), + type_=mysql.TINYINT(display_width=1), + existing_nullable=True) + op.create_table('data_storage', + sa.Column('block_id', mysql.INTEGER(), autoincrement=False, nullable=False), + sa.Column('storage_key', mysql.VARCHAR(length=255), nullable=False), + sa.Column('storage_key_prefix', mysql.VARCHAR(length=64), nullable=True), + sa.Column('spec_version_id', mysql.INTEGER(), autoincrement=False, nullable=True), + sa.Column('module_prefix', mysql.VARCHAR(length=255), nullable=True), + sa.Column('function_name', mysql.VARCHAR(length=255), nullable=True), + sa.Column('return_type', mysql.VARCHAR(length=255), nullable=True), + sa.Column('data', mysql.JSON(), nullable=True), + sa.Column('data_raw', mysql.LONGTEXT(), nullable=True), + sa.Column('error', mysql.SMALLINT(), autoincrement=False, nullable=False), + sa.Column('comments', mysql.LONGTEXT(), nullable=True), + sa.PrimaryKeyConstraint('block_id', 'storage_key'), + mysql_collate='utf8mb4_0900_ai_ci', + mysql_default_charset='utf8mb4', + mysql_engine='InnoDB' + ) + op.create_index('ix_data_storage_storage_key_prefix', 'data_storage', ['storage_key_prefix'], unique=False) + op.create_index('ix_data_storage_storage_key', 'data_storage', ['storage_key'], unique=False) + op.create_index('ix_data_storage_spec_version_id', 'data_storage', ['spec_version_id'], unique=False) + op.create_index('ix_data_storage_block_id', 'data_storage', ['block_id'], unique=False) + # ### end Alembic commands ### diff --git a/pm-harvester/app/main.py b/pm-harvester/app/main.py new file mode 100644 index 00000000..7bcf988d --- /dev/null +++ b/pm-harvester/app/main.py @@ -0,0 +1,65 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# main.py + +from app.settings import DB_CONNECTION, DEBUG + +import falcon + +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from app.middleware.context import ContextMiddleware +from app.middleware.sessionmanager import SQLAlchemySessionManager + +from app.resources.harvester import PolkascanStartHarvesterResource, PolkascanStopHarvesterResource, \ + PolkascanHarvesterStatusResource, PolkascanProcessBlockResource, \ + PolkaScanCheckHarvesterTaskResource, SequenceBlockResource, StartSequenceBlockResource, StartIntegrityResource, \ + RebuildSearchIndexResource, ProcessGenesisBlockResource, PolkascanHarvesterQueueResource, RebuildAccountInfoResource +from app.resources.tools import ExtractMetadataResource, ExtractExtrinsicsResource, \ + HealthCheckResource, ExtractEventsResource, CreateSnapshotResource + +# Database connection +engine = create_engine(DB_CONNECTION, echo=DEBUG, isolation_level="READ_UNCOMMITTED", pool_pre_ping=True) +session_factory = sessionmaker(bind=engine, autoflush=False, autocommit=False) + +# Define application +app = falcon.API(middleware=[ContextMiddleware(), SQLAlchemySessionManager(session_factory)]) + +# Application routes +app.add_route('/healthcheck', HealthCheckResource()) + +app.add_route('/start', PolkascanStartHarvesterResource()) +app.add_route('/stop', PolkascanStopHarvesterResource()) +app.add_route('/status', PolkascanHarvesterStatusResource()) +app.add_route('/queue', PolkascanHarvesterQueueResource()) +app.add_route('/process', PolkascanProcessBlockResource()) +app.add_route('/sequence', SequenceBlockResource()) +app.add_route('/sequencer/start', StartSequenceBlockResource()) +app.add_route('/integrity-check', StartIntegrityResource()) +app.add_route('/process-genesis', ProcessGenesisBlockResource()) +app.add_route('/rebuild-searchindex', RebuildSearchIndexResource()) +app.add_route('/rebuild-balances', RebuildAccountInfoResource()) +app.add_route('/task/result/{task_id}', PolkaScanCheckHarvesterTaskResource()) + +app.add_route('/tools/metadata/extract', ExtractMetadataResource()) +app.add_route('/tools/extrinsics/extract', ExtractExtrinsicsResource()) +app.add_route('/tools/events/extract', ExtractEventsResource()) +app.add_route('/tools/balance-snapshot', CreateSnapshotResource()) + diff --git a/pm-harvester/app/middleware/__init__.py b/pm-harvester/app/middleware/__init__.py new file mode 100644 index 00000000..294881cd --- /dev/null +++ b/pm-harvester/app/middleware/__init__.py @@ -0,0 +1,20 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# __init__.py + diff --git a/pm-harvester/app/middleware/context.py b/pm-harvester/app/middleware/context.py new file mode 100644 index 00000000..d1675281 --- /dev/null +++ b/pm-harvester/app/middleware/context.py @@ -0,0 +1,35 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# context.py + +import uuid + + +def set_context(req, resp): + if not req.context.get('request_id'): + req.context['request_id'] = str(uuid.uuid4()) + + resp.set_header('request-id', req.context['request_id']) + resp.set_header('Access-Control-Allow-Origin', '*') + resp.set_header('Access-Control-Allow-Headers', '*') + + +class ContextMiddleware(object): + def process_request(self, req, resp): + set_context(req, resp) diff --git a/pm-harvester/app/middleware/sessionmanager.py b/pm-harvester/app/middleware/sessionmanager.py new file mode 100644 index 00000000..a3ac0b92 --- /dev/null +++ b/pm-harvester/app/middleware/sessionmanager.py @@ -0,0 +1,34 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# sessionmanager.py + +from sqlalchemy.orm import scoped_session + + +class SQLAlchemySessionManager: + + def __init__(self, session_factory): + self.session_factory = session_factory + + def process_resource(self, req, resp, resource, params): + resource.session = scoped_session(self.session_factory) + + def process_response(self, req, resp, resource, req_succeeded): + if hasattr(resource, 'session'): + resource.session.remove() diff --git a/pm-harvester/app/models/__init__.py b/pm-harvester/app/models/__init__.py new file mode 100644 index 00000000..294881cd --- /dev/null +++ b/pm-harvester/app/models/__init__.py @@ -0,0 +1,20 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# __init__.py + diff --git a/pm-harvester/app/models/base.py b/pm-harvester/app/models/base.py new file mode 100644 index 00000000..99aefb8c --- /dev/null +++ b/pm-harvester/app/models/base.py @@ -0,0 +1,53 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# base.py + +from dictalchemy import DictableModel +from sqlalchemy.ext.declarative import declarative_base + + +class BaseModelObj(DictableModel): + + serialize_exclude = None + + def save(self, session): + session.add(self) + session.flush() + + @property + def serialize_type(self): + return self.__class__.__name__.lower() + + def serialize_id(self): + return self.id + + def serialize(self, exclude=None): + return { + 'type': self.serialize_type, + 'id': self.serialize_id(), + 'attributes': self.asdict(exclude=exclude or self.serialize_exclude) + } + + @classmethod + def query(cls, session): + return session.query(cls) + + +BaseModel = declarative_base(cls=BaseModelObj) ## type: BaseModelObj + diff --git a/pm-harvester/app/models/data.py b/pm-harvester/app/models/data.py new file mode 100644 index 00000000..bca662cc --- /dev/null +++ b/pm-harvester/app/models/data.py @@ -0,0 +1,764 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# data.py + +import sqlalchemy as sa +from sqlalchemy import text +from sqlalchemy.dialects.mysql import LONGTEXT +from sqlalchemy.orm import relationship + +from app.models.base import BaseModel + + +class Block(BaseModel): + __tablename__ = 'data_block' + + serialize_exclude = ['debug_info'] + + serialize_type = 'block' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + parent_id = sa.Column(sa.Integer(), nullable=False) + hash = sa.Column(sa.String(66), unique=True, index=True, nullable=False) + parent_hash = sa.Column(sa.String(66), index=True, nullable=False) + state_root = sa.Column(sa.String(66), nullable=False) + extrinsics_root = sa.Column(sa.String(66), nullable=False) + count_extrinsics = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_unsigned = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_signed = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_error = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_success = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_signedby_address = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_signedby_index = sa.Column(sa.Integer(), nullable=False) + count_events = sa.Column(sa.Integer(), nullable=False) + count_events_system = sa.Column(sa.Integer(), nullable=False) + count_events_module = sa.Column(sa.Integer(), nullable=False) + count_events_extrinsic = sa.Column(sa.Integer(), nullable=False) + count_events_finalization = sa.Column(sa.Integer(), nullable=False) + count_accounts = sa.Column(sa.Integer(), nullable=False) + count_accounts_new = sa.Column(sa.Integer(), nullable=False) + count_accounts_reaped = sa.Column(sa.Integer(), nullable=False) + count_sessions_new = sa.Column(sa.Integer(), nullable=False) + count_contracts_new = sa.Column(sa.Integer(), nullable=False) + count_log = sa.Column(sa.Integer(), nullable=False) + range10000 = sa.Column(sa.Integer(), nullable=False) + range100000 = sa.Column(sa.Integer(), nullable=False) + range1000000 = sa.Column(sa.Integer(), nullable=False) + datetime = sa.Column(sa.DateTime(timezone=True)) + year = sa.Column(sa.Integer(), nullable=True) + month = sa.Column(sa.Integer(), nullable=True) + week = sa.Column(sa.Integer(), nullable=True) + day = sa.Column(sa.Integer(), nullable=True) + hour = sa.Column(sa.Integer(), nullable=True) + full_month = sa.Column(sa.Integer(), nullable=True) + full_week = sa.Column(sa.Integer(), nullable=True) + full_day = sa.Column(sa.Integer(), nullable=True) + full_hour = sa.Column(sa.Integer(), nullable=True) + logs = sa.Column(sa.JSON(), default=None, server_default=None) + authority_index = sa.Column(sa.Integer(), nullable=True) + slot_number = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True) + spec_version_id = sa.Column(sa.String(64), nullable=False) + debug_info = sa.Column(sa.JSON(), default=None, server_default=None) + + def set_datetime(self, datetime): + self.datetime = datetime + self.year = self.datetime.year + self.month = self.datetime.month + self.week = self.datetime.strftime("%W") + self.day = self.datetime.day + self.hour = self.datetime.hour + self.full_month = self.datetime.strftime("%Y%m") + self.full_week = self.datetime.strftime("%Y%W") + self.full_day = self.datetime.strftime("%Y%m%d") + self.full_hour = self.datetime.strftime("%Y%m%d%H") + + @classmethod + def get_head(cls, session): + with session.begin(): + query = session.query(cls) + model = query.order_by(cls.id.desc()).first() + + return model + + @classmethod + def get_missing_block_ids(cls, session): + return session.execute(text(""" + SELECT + z.expected as block_from, z.got-1 as block_to + FROM ( + SELECT + @rownum:=@rownum+1 AS expected, + IF(@rownum=id, 0, @rownum:=id) AS got + FROM + (SELECT @rownum:=0) AS a + JOIN data_block + ORDER BY id + ) AS z + WHERE z.got!=0 + ORDER BY block_from DESC + """) + ) + + +class BlockTotal(BaseModel): + __tablename__ = 'data_block_total' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + session_id = sa.Column(sa.Integer()) + parent_datetime = sa.Column(sa.DateTime()) + blocktime = sa.Column(sa.Integer(), nullable=False) + author = sa.Column(sa.String(64), nullable=True, index=True) + total_extrinsics = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_extrinsics_success = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_extrinsics_error = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_extrinsics_signed = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_extrinsics_unsigned = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_extrinsics_signedby_address = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_extrinsics_signedby_index = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_events = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_events_system = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_events_module = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_events_extrinsic = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_events_finalization = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_logs = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_blocktime = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_accounts = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_accounts_new = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_accounts_reaped = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_sessions_new = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + total_contracts_new = sa.Column(sa.Numeric(precision=65, scale=0), nullable=False) + + +class Event(BaseModel): + __tablename__ = 'data_event' + + block_id = sa.Column(sa.Integer(), primary_key=True, index=True) + block = relationship(Block, foreign_keys=[block_id], primaryjoin=block_id == Block.id) + + event_idx = sa.Column(sa.Integer(), primary_key=True, index=True) + + extrinsic_idx = sa.Column(sa.Integer(), index=True) + + type = sa.Column(sa.String(4), index=True) + + spec_version_id = sa.Column(sa.Integer()) + + module_id = sa.Column(sa.String(64), index=True) + event_id = sa.Column(sa.String(64), index=True) + + system = sa.Column(sa.SmallInteger(), index=True, nullable=False) + module = sa.Column(sa.SmallInteger(), index=True, nullable=False) + phase = sa.Column(sa.SmallInteger()) + + attributes = sa.Column(sa.JSON()) + + codec_error = sa.Column(sa.Boolean()) + + def serialize_id(self): + return '{}-{}'.format(self.block_id, self.event_idx) + + +class Extrinsic(BaseModel): + __tablename__ = 'data_extrinsic' + + block_id = sa.Column(sa.Integer(), primary_key=True, index=True) + block = relationship(Block, foreign_keys=[block_id], primaryjoin=block_id == Block.id) + + extrinsic_idx = sa.Column(sa.Integer(), primary_key=True, index=True) + extrinsic_hash = sa.Column(sa.String(64), index=True, nullable=True) + + extrinsic_length = sa.Column(sa.String(10)) + extrinsic_version = sa.Column(sa.String(2)) + + signed = sa.Column(sa.SmallInteger(), index=True, nullable=False) + unsigned = sa.Column(sa.SmallInteger(), index=True, nullable=False) + signedby_address = sa.Column(sa.SmallInteger(), nullable=False) + signedby_index = sa.Column(sa.SmallInteger(), nullable=False) + + address_length = sa.Column(sa.String(2)) + address = sa.Column(sa.String(64), index=True) + account_index = sa.Column(sa.String(16), index=True) + account_idx = sa.Column(sa.Integer(), index=True) + signature = sa.Column(sa.String(130)) + nonce = sa.Column(sa.Integer()) + + era = sa.Column(sa.String(4)) + + call = sa.Column(sa.String(4)) + module_id = sa.Column(sa.String(64), index=True) + call_id = sa.Column(sa.String(64), index=True) + params = sa.Column(sa.JSON()) + + success = sa.Column(sa.SmallInteger(), default=0, nullable=False) + error = sa.Column(sa.SmallInteger(), default=0, nullable=False) + + spec_version_id = sa.Column(sa.Integer()) + + codec_error = sa.Column(sa.Boolean(), default=False) + + def serialize_id(self): + return '{}-{}'.format(self.block_id, self.extrinsic_idx) + + +class Log(BaseModel): + __tablename__ = 'data_log' + + block_id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + log_idx = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + type_id = sa.Column(sa.Integer(), index=True) + type = sa.Column(sa.String(64)) + data = sa.Column(sa.JSON()) + + +class Account(BaseModel): + __tablename__ = 'data_account' + + id = sa.Column(sa.String(64), primary_key=True) + address = sa.Column(sa.String(48), index=True) + index_address = sa.Column(sa.String(24), index=True) + is_reaped = sa.Column(sa.Boolean, default=False) + + is_validator = sa.Column(sa.Boolean, default=False, index=True) + was_validator = sa.Column(sa.Boolean, default=False, index=True) + is_nominator = sa.Column(sa.Boolean, default=False, index=True) + was_nominator = sa.Column(sa.Boolean, default=False, index=True) + is_council_member = sa.Column(sa.Boolean, default=False, index=True) + was_council_member = sa.Column(sa.Boolean, default=False, index=True) + is_tech_comm_member = sa.Column(sa.Boolean, default=False, index=True) + was_tech_comm_member = sa.Column(sa.Boolean, default=False, index=True) + is_registrar = sa.Column(sa.Boolean, default=False, index=True) + was_registrar = sa.Column(sa.Boolean, default=False, index=True) + is_sudo = sa.Column(sa.Boolean, default=False, index=True) + was_sudo = sa.Column(sa.Boolean, default=False, index=True) + + is_treasury = sa.Column(sa.Boolean, default=False, index=True) + is_contract = sa.Column(sa.Boolean, default=False, index=True) + + count_reaped = sa.Column(sa.Integer(), default=0) + hash_blake2b = sa.Column(sa.String(64), index=True, nullable=True) + + balance_total = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True, index=True) + balance_free = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True, index=True) + balance_reserved = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True, index=True) + nonce = sa.Column(sa.Integer(), nullable=True) + account_info = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + + has_identity = sa.Column(sa.Boolean, default=False, index=True) + has_subidentity = sa.Column(sa.Boolean, default=False, index=True) + identity_display = sa.Column(sa.String(32), index=True, nullable=True) + identity_legal = sa.Column(sa.String(32), nullable=True) + identity_web = sa.Column(sa.String(32), nullable=True) + identity_riot = sa.Column(sa.String(32), nullable=True) + identity_email = sa.Column(sa.String(32), nullable=True) + identity_twitter = sa.Column(sa.String(32), nullable=True) + identity_judgement_good = sa.Column(sa.Integer(), default=0) + identity_judgement_bad = sa.Column(sa.Integer(), default=0) + parent_identity = sa.Column(sa.String(64), index=True, nullable=True) + subidentity_display = sa.Column(sa.String(32), nullable=True) + + created_at_block = sa.Column(sa.Integer(), nullable=False) + updated_at_block = sa.Column(sa.Integer(), nullable=False) + + +class AccountAudit(BaseModel): + __tablename__ = 'data_account_audit' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=True) + account_id = sa.Column(sa.String(64)) + block_id = sa.Column(sa.Integer(), index=True, nullable=False) + extrinsic_idx = sa.Column(sa.Integer()) + event_idx = sa.Column(sa.Integer()) + type_id = sa.Column(sa.Integer(), nullable=False) + data = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + + +class AccountInfoSnapshot(BaseModel): + __tablename__ = 'data_account_info_snapshot' + + block_id = sa.Column(sa.Integer(), primary_key=True, index=True) + account_id = sa.Column(sa.String(64), primary_key=True, index=True) + + balance_total = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True, index=True) + balance_free = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True, index=True) + balance_reserved = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True, index=True) + nonce = sa.Column(sa.Integer(), nullable=True) + account_info = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + + +class Session(BaseModel): + __tablename__ = 'data_session' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + start_at_block = sa.Column(sa.Integer()) + era = sa.Column(sa.Integer()) + era_idx = sa.Column(sa.Integer()) + created_at_block = sa.Column(sa.Integer(), nullable=False) + created_at_extrinsic = sa.Column(sa.Integer()) + created_at_event = sa.Column(sa.Integer()) + count_validators = sa.Column(sa.Integer()) + count_nominators = sa.Column(sa.Integer()) + + +class SessionTotal(BaseModel): + __tablename__ = 'data_session_total' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + end_at_block = sa.Column(sa.Integer()) + count_blocks = sa.Column(sa.Integer()) + + +class SessionValidator(BaseModel): + __tablename__ = 'data_session_validator' + + session_id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + rank_validator = sa.Column(sa.Integer(), primary_key=True, autoincrement=False, index=True) + validator_stash = sa.Column(sa.String(64), index=True) + validator_controller = sa.Column(sa.String(64), index=True) + validator_session = sa.Column(sa.String(64), index=True) + bonded_total = sa.Column(sa.Numeric(precision=65, scale=0)) + bonded_active = sa.Column(sa.Numeric(precision=65, scale=0)) + bonded_nominators = sa.Column(sa.Numeric(precision=65, scale=0)) + bonded_own = sa.Column(sa.Numeric(precision=65, scale=0)) + unlocking = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + count_nominators = sa.Column(sa.Integer(), nullable=True) + unstake_threshold = sa.Column(sa.Integer(), nullable=True) + commission = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True) + + +class SessionNominator(BaseModel): + __tablename__ = 'data_session_nominator' + + session_id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + rank_validator = sa.Column(sa.Integer(), primary_key=True, autoincrement=False, index=True) + rank_nominator = sa.Column(sa.Integer(), primary_key=True, autoincrement=False, index=True) + nominator_stash = sa.Column(sa.String(64), index=True) + nominator_controller = sa.Column(sa.String(64), index=True, nullable=True) + bonded = sa.Column(sa.Numeric(precision=65, scale=0)) + + +class AccountIndex(BaseModel): + __tablename__ = 'data_account_index' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + short_address = sa.Column(sa.String(24), index=True) + account_id = sa.Column(sa.String(64), index=True) + is_reclaimable = sa.Column(sa.Boolean, default=False) + is_reclaimed = sa.Column(sa.Boolean, default=False) + created_at_block = sa.Column(sa.Integer(), nullable=False) + updated_at_block = sa.Column(sa.Integer(), nullable=False) + + +class AccountIndexAudit(BaseModel): + __tablename__ = 'data_account_index_audit' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=True) + account_index_id = sa.Column(sa.Integer(), nullable=True, index=True) + account_id = sa.Column(sa.String(64), index=True, nullable=True) + block_id = sa.Column(sa.Integer(), index=True, nullable=False) + extrinsic_idx = sa.Column(sa.Integer()) + event_idx = sa.Column(sa.Integer()) + type_id = sa.Column(sa.Integer(), nullable=False) + data = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + + + +class Contract(BaseModel): + __tablename__ = 'data_contract' + + code_hash = sa.Column(sa.String(64), primary_key=True) + bytecode = sa.Column(LONGTEXT()) + source = sa.Column(LONGTEXT()) + abi = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + compiler = sa.Column(sa.String(64)) + created_at_block = sa.Column(sa.Integer(), nullable=False) + created_at_extrinsic = sa.Column(sa.Integer()) + created_at_event = sa.Column(sa.Integer()) + + +class Runtime(BaseModel): + __tablename__ = 'runtime' + + serialize_exclude = ['json_metadata', 'json_metadata_decoded'] + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + impl_name = sa.Column(sa.String(255)) + impl_version = sa.Column(sa.Integer()) + spec_version = sa.Column(sa.Integer(), nullable=False, unique=True) + spec_name = sa.Column(sa.String(255)) + authoring_version = sa.Column(sa.Integer()) + apis = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + json_metadata = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + json_metadata_decoded = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + count_modules = sa.Column(sa.Integer(), default=0, nullable=False) + count_call_functions = sa.Column(sa.Integer(), default=0, nullable=False) + count_storage_functions = sa.Column(sa.Integer(), default=0, nullable=False) + count_events = sa.Column(sa.Integer(), default=0, nullable=False) + count_constants = sa.Column(sa.Integer(), nullable=False, server_default='0') + count_errors = sa.Column(sa.Integer(), nullable=False, server_default='0') + + def serialize_id(self): + return self.spec_version + + +class RuntimeModule(BaseModel): + __tablename__ = 'runtime_module' + __table_args__ = (sa.UniqueConstraint('spec_version', 'module_id'),) + + id = sa.Column(sa.Integer(), primary_key=True) + spec_version = sa.Column(sa.Integer(), nullable=False) + module_id = sa.Column(sa.String(64), nullable=False) + prefix = sa.Column(sa.String(255)) + # TODO unused? + code = sa.Column(sa.String(255)) + name = sa.Column(sa.String(255)) + # TODO unused? + lookup = sa.Column(sa.String(4), index=True) + count_call_functions = sa.Column(sa.Integer(), nullable=False) + count_storage_functions = sa.Column(sa.Integer(), nullable=False) + count_events = sa.Column(sa.Integer(), nullable=False) + count_constants = sa.Column(sa.Integer(), nullable=False, server_default='0') + count_errors = sa.Column(sa.Integer(), nullable=False, server_default='0') + + def serialize_id(self): + return '{}-{}'.format(self.spec_version, self.module_id) + + +class RuntimeCall(BaseModel): + __tablename__ = 'runtime_call' + __table_args__ = (sa.UniqueConstraint('spec_version', 'module_id', 'call_id'),) + + id = sa.Column(sa.Integer(), primary_key=True) + spec_version = sa.Column(sa.Integer(), nullable=False) + module_id = sa.Column(sa.String(64), nullable=False) + call_id = sa.Column(sa.String(64), nullable=False) + index = sa.Column(sa.Integer(), nullable=False) + prefix = sa.Column(sa.String(255)) + code = sa.Column(sa.String(255)) + name = sa.Column(sa.String(255)) + lookup = sa.Column(sa.String(4), index=True) + documentation = sa.Column(sa.Text()) + count_params = sa.Column(sa.Integer(), nullable=False) + + def serialize_id(self): + return '{}-{}-{}'.format(self.spec_version, self.module_id, self.call_id) + + +class RuntimeCallParam(BaseModel): + __tablename__ = 'runtime_call_param' + __table_args__ = (sa.UniqueConstraint('runtime_call_id', 'name'),) + + id = sa.Column(sa.Integer(), primary_key=True) + runtime_call_id = sa.Column(sa.Integer(), nullable=False) + name = sa.Column(sa.String(255)) + type = sa.Column(sa.String(255)) + + +class RuntimeEvent(BaseModel): + __tablename__ = 'runtime_event' + __table_args__ = (sa.UniqueConstraint('spec_version', 'module_id', 'event_id'),) + + id = sa.Column(sa.Integer(), primary_key=True) + spec_version = sa.Column(sa.Integer(), nullable=False) + module_id = sa.Column(sa.String(64), nullable=False) + event_id = sa.Column(sa.String(64), nullable=False) + index = sa.Column(sa.Integer(), nullable=False) + prefix = sa.Column(sa.String(255)) + code = sa.Column(sa.String(255)) + name = sa.Column(sa.String(255)) + lookup = sa.Column(sa.String(4), index=True) + documentation = sa.Column(sa.Text()) + count_attributes = sa.Column(sa.Integer(), nullable=False) + + def serialize_id(self): + return '{}-{}-{}'.format(self.spec_version, self.module_id, self.event_id) + + +class RuntimeEventAttribute(BaseModel): + __tablename__ = 'runtime_event_attribute' + __table_args__ = (sa.UniqueConstraint('runtime_event_id', 'index'),) + + id = sa.Column(sa.Integer(), primary_key=True) + runtime_event_id = sa.Column(sa.Integer(), nullable=False) + index = sa.Column(sa.Integer(), nullable=False) + type = sa.Column(sa.String(255)) + + +class RuntimeStorage(BaseModel): + __tablename__ = 'runtime_storage' + + id = sa.Column(sa.Integer(), primary_key=True) + spec_version = sa.Column(sa.Integer()) + module_id = sa.Column(sa.String(64)) + storage_key = sa.Column(sa.String(255)) + index = sa.Column(sa.Integer()) + name = sa.Column(sa.String(255)) + lookup = sa.Column(sa.String(4), index=True) + default = sa.Column(sa.String(255)) + modifier = sa.Column(sa.String(64)) + type_hasher = sa.Column(sa.String(255)) + type_key1 = sa.Column(sa.String(255)) + type_key2 = sa.Column(sa.String(255)) + type_value = sa.Column(sa.String(255)) + type_is_linked = sa.Column(sa.SmallInteger()) + type_key2hasher = sa.Column(sa.String(255)) + documentation = sa.Column(sa.Text()) + + def get_return_type(self): + if self.type_is_linked: + return '({}, Linkage)'.format(self.type_value) + else: + return self.type_value + + def serialize_id(self): + return '{}-{}-{}'.format(self.spec_version, self.module_id, self.name) + + +class RuntimeConstant(BaseModel): + __tablename__ = 'runtime_constant' + + id = sa.Column(sa.Integer(), primary_key=True) + spec_version = sa.Column(sa.Integer()) + module_id = sa.Column(sa.String(64)) + index = sa.Column(sa.Integer()) + name = sa.Column(sa.String(255), index=True) + type = sa.Column(sa.String(255)) + value = sa.Column(sa.String(255)) + documentation = sa.Column(sa.Text()) + + def serialize_id(self): + return '{}-{}-{}'.format(self.spec_version, self.module_id, self.name) + + +class RuntimeErrorMessage(BaseModel): + __tablename__ = 'runtime_error' + + id = sa.Column(sa.Integer(), primary_key=True) + spec_version = sa.Column(sa.Integer()) + module_id = sa.Column(sa.String(64)) + module_index = sa.Column(sa.Integer()) + index = sa.Column(sa.Integer()) + name = sa.Column(sa.String(255), index=True) + documentation = sa.Column(sa.Text()) + + def serialize_id(self): + return '{}-{}-{}'.format(self.spec_version, self.module_id, self.index) + + +class RuntimeType(BaseModel): + __tablename__ = 'runtime_type' + __table_args__ = (sa.UniqueConstraint('spec_version', 'type_string'),) + + id = sa.Column(sa.Integer(), primary_key=True) + spec_version = sa.Column(sa.Integer(), nullable=False) + type_string = sa.Column(sa.String(255)) + decoder_class = sa.Column(sa.String(255), nullable=True) + is_primitive_runtime = sa.Column(sa.Boolean(), default=False) + is_primitive_core = sa.Column(sa.Boolean(), default=False) + + +class ReorgBlock(BaseModel): + __tablename__ = 'data_reorg_block' + + serialize_exclude = ['debug_info'] + + hash = sa.Column(sa.String(66), primary_key=True, index=True, nullable=False) + id = sa.Column(sa.Integer(), index=True, autoincrement=False) + parent_id = sa.Column(sa.Integer(), nullable=False) + parent_hash = sa.Column(sa.String(66), index=True, nullable=False) + state_root = sa.Column(sa.String(66), nullable=False) + extrinsics_root = sa.Column(sa.String(66), nullable=False) + count_extrinsics = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_unsigned = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_signed = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_error = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_success = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_signedby_address = sa.Column(sa.Integer(), nullable=False) + count_extrinsics_signedby_index = sa.Column(sa.Integer(), nullable=False) + count_events = sa.Column(sa.Integer(), nullable=False) + count_events_system = sa.Column(sa.Integer(), nullable=False) + count_events_module = sa.Column(sa.Integer(), nullable=False) + count_events_extrinsic = sa.Column(sa.Integer(), nullable=False) + count_events_finalization = sa.Column(sa.Integer(), nullable=False) + count_accounts = sa.Column(sa.Integer(), nullable=False) + count_accounts_new = sa.Column(sa.Integer(), nullable=False) + count_accounts_reaped = sa.Column(sa.Integer(), nullable=False) + count_sessions_new = sa.Column(sa.Integer(), nullable=False) + count_contracts_new = sa.Column(sa.Integer(), nullable=False) + count_log = sa.Column(sa.Integer(), nullable=False) + range10000 = sa.Column(sa.Integer(), nullable=False) + range100000 = sa.Column(sa.Integer(), nullable=False) + range1000000 = sa.Column(sa.Integer(), nullable=False) + datetime = sa.Column(sa.DateTime(timezone=True)) + year = sa.Column(sa.Integer(), nullable=True) + month = sa.Column(sa.Integer(), nullable=True) + week = sa.Column(sa.Integer(), nullable=True) + day = sa.Column(sa.Integer(), nullable=True) + hour = sa.Column(sa.Integer(), nullable=True) + full_month = sa.Column(sa.Integer(), nullable=True) + full_week = sa.Column(sa.Integer(), nullable=True) + full_day = sa.Column(sa.Integer(), nullable=True) + full_hour = sa.Column(sa.Integer(), nullable=True) + logs = sa.Column(sa.JSON(), default=None, server_default=None) + authority_index = sa.Column(sa.Integer(), nullable=True) + slot_number = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True) + spec_version_id = sa.Column(sa.String(64), nullable=False) + debug_info = sa.Column(sa.JSON(), default=None, server_default=None) + + +class ReorgEvent(BaseModel): + __tablename__ = 'data_reorg_event' + + block_hash = sa.Column(sa.String(66), primary_key=True, index=True, nullable=False) + block_id = sa.Column(sa.Integer(), index=True) + block = relationship(Block, foreign_keys=[block_id], primaryjoin=block_id == Block.id) + + event_idx = sa.Column(sa.Integer(), primary_key=True, index=True) + + extrinsic_idx = sa.Column(sa.Integer(), index=True) + + type = sa.Column(sa.String(4), index=True) + + spec_version_id = sa.Column(sa.Integer()) + + module_id = sa.Column(sa.String(64), index=True) + event_id = sa.Column(sa.String(64), index=True) + + system = sa.Column(sa.SmallInteger(), index=True, nullable=False) + module = sa.Column(sa.SmallInteger(), index=True, nullable=False) + phase = sa.Column(sa.SmallInteger()) + + attributes = sa.Column(sa.JSON()) + + codec_error = sa.Column(sa.Boolean()) + + def serialize_id(self): + return '{}-{}'.format(self.block_id, self.event_idx) + + +class ReorgExtrinsic(BaseModel): + __tablename__ = 'data_reorg_extrinsic' + + block_hash = sa.Column(sa.String(66), primary_key=True, index=True, nullable=False) + block_id = sa.Column(sa.Integer(), index=True) + block = relationship(Block, foreign_keys=[block_id], primaryjoin=block_id == Block.id) + + extrinsic_idx = sa.Column(sa.Integer(), primary_key=True, index=True) + extrinsic_hash = sa.Column(sa.String(64), index=True, nullable=True) + + extrinsic_length = sa.Column(sa.String(10)) + extrinsic_version = sa.Column(sa.String(2)) + + signed = sa.Column(sa.SmallInteger(), index=True, nullable=False) + unsigned = sa.Column(sa.SmallInteger(), index=True, nullable=False) + signedby_address = sa.Column(sa.SmallInteger(), nullable=False) + signedby_index = sa.Column(sa.SmallInteger(), nullable=False) + + address_length = sa.Column(sa.String(2)) + address = sa.Column(sa.String(64), index=True) + account_index = sa.Column(sa.String(16), index=True) + account_idx = sa.Column(sa.Integer(), index=True) + signature = sa.Column(sa.String(130)) + nonce = sa.Column(sa.Integer()) + + era = sa.Column(sa.String(4)) + + call = sa.Column(sa.String(4)) + module_id = sa.Column(sa.String(64), index=True) + call_id = sa.Column(sa.String(64), index=True) + params = sa.Column(sa.JSON()) + + success = sa.Column(sa.SmallInteger(), default=0, nullable=False) + error = sa.Column(sa.SmallInteger(), default=0, nullable=False) + + spec_version_id = sa.Column(sa.Integer()) + + codec_error = sa.Column(sa.Boolean(), default=False) + + def serialize_id(self): + return '{}-{}'.format(self.block_id, self.extrinsic_idx) + + +class ReorgLog(BaseModel): + __tablename__ = 'data_reorg_log' + + block_hash = sa.Column(sa.String(66), primary_key=True, index=True, nullable=False) + block_id = sa.Column(sa.Integer(), autoincrement=False) + log_idx = sa.Column(sa.Integer(), primary_key=True, autoincrement=False) + type_id = sa.Column(sa.Integer(), index=True) + type = sa.Column(sa.String(64)) + data = sa.Column(sa.JSON()) + + def serialize_id(self): + return '{}-{}'.format(self.block_id, self.log_idx) + + +class IdentityAudit(BaseModel): + __tablename__ = 'data_identity_audit' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=True) + account_id = sa.Column(sa.String(64)) + block_id = sa.Column(sa.Integer(), index=True, nullable=False) + extrinsic_idx = sa.Column(sa.Integer()) + event_idx = sa.Column(sa.Integer()) + type_id = sa.Column(sa.Integer(), nullable=False) + data = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + + +class IdentityJudgement(BaseModel): + __tablename__ = 'data_identity_judgement' + + registrar_index = sa.Column(sa.Integer(), primary_key=True) + account_id = sa.Column(sa.String(64), primary_key=True, index=True) + judgement = sa.Column(sa.String(32)) + created_at_block = sa.Column(sa.Integer(), nullable=False) + updated_at_block = sa.Column(sa.Integer(), nullable=False) + + +class IdentityJudgementAudit(BaseModel): + __tablename__ = 'data_identity_judgement_audit' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=True) + registrar_index = sa.Column(sa.Integer()) + account_id = sa.Column(sa.String(64)) + block_id = sa.Column(sa.Integer(), index=True, nullable=False) + extrinsic_idx = sa.Column(sa.Integer()) + event_idx = sa.Column(sa.Integer()) + type_id = sa.Column(sa.Integer(), nullable=False) + data = sa.Column(sa.JSON(), default=None, server_default=None, nullable=True) + + +class SearchIndexType(BaseModel): + __tablename__ = 'data_account_search_index_type' + + id = sa.Column(sa.Integer(), primary_key=True) + name = sa.Column(sa.String(64), nullable=False, index=True) + + +class SearchIndex(BaseModel): + __tablename__ = 'data_account_search_index' + + id = sa.Column(sa.Integer(), primary_key=True, autoincrement=True) + block_id = sa.Column(sa.Integer(), nullable=False, index=True) + extrinsic_idx = sa.Column(sa.Integer(), nullable=True, index=True) + event_idx = sa.Column(sa.Integer(), nullable=True, index=True) + account_id = sa.Column(sa.String(64), nullable=True, index=True) + index_type_id = sa.Column(sa.Integer(), nullable=False, index=True) + sorting_value = sa.Column(sa.Numeric(precision=65, scale=0), nullable=True, index=True) + + diff --git a/pm-harvester/app/models/harvester.py b/pm-harvester/app/models/harvester.py new file mode 100644 index 00000000..7e27cf08 --- /dev/null +++ b/pm-harvester/app/models/harvester.py @@ -0,0 +1,48 @@ +# Polkascan PRE Explorer GUI +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# harvester.py +# +from app.models.base import BaseModel +import sqlalchemy as sa + + +class Status(BaseModel): + __tablename__ = 'harvester_status' + key = sa.Column(sa.String(64), primary_key=True) + value = sa.Column(sa.String(255)) + last_modified = sa.Column(sa.DateTime(timezone=True)) + notes = sa.Column(sa.String(255)) + + @classmethod + def get_status(cls, session, key): + model = session.query(cls).filter_by(key=key).first() + + if not model: + return Status( + key=key + ) + + return model + + +class Setting(BaseModel): + __tablename__ = 'harvester_setting' + key = sa.Column(sa.String(64), primary_key=True) + value = sa.Column(sa.String(255)) + notes = sa.Column(sa.String(255)) diff --git a/pm-harvester/app/processors/__init__.py b/pm-harvester/app/processors/__init__.py new file mode 100644 index 00000000..458971a4 --- /dev/null +++ b/pm-harvester/app/processors/__init__.py @@ -0,0 +1,23 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# __init__.py + +from .block import * +from .extrinsic import * +from .event import * diff --git a/pm-harvester/app/processors/base.py b/pm-harvester/app/processors/base.py new file mode 100644 index 00000000..a951e241 --- /dev/null +++ b/pm-harvester/app/processors/base.py @@ -0,0 +1,199 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# base.py +from app.models.data import SearchIndex + + +class BaseService(object): + pass + + +class Singleton(type): + _instances = {} + + def __call__(cls, *args, **kwargs): + if cls not in cls._instances: + cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) + return cls._instances[cls] + + +class ProcessorRegistry(metaclass=Singleton): + + registry = {'event': {}, 'extrinsic': {}, 'block': []} + + @classmethod + def all_subclasses(cls, class_): + return set(class_.__subclasses__()).union( + [s for c in class_.__subclasses__() for s in cls.all_subclasses(c)]) + + def __init__(self): + for cls in self.all_subclasses(EventProcessor): + key = '{}-{}'.format(cls.module_id, cls.event_id) + + if key not in self.registry['event']: + self.registry['event'][key] = [] + + self.registry['event']['{}-{}'.format(cls.module_id, cls.event_id)].append(cls) + + for cls in self.all_subclasses(ExtrinsicProcessor): + key = '{}-{}'.format(cls.module_id, cls.call_id) + + if key not in self.registry['extrinsic']: + self.registry['extrinsic'][key] = [] + + self.registry['extrinsic'][key].append(cls) + + for cls in self.all_subclasses(BlockProcessor): + self.registry['block'].append(cls) + + def get_event_processors(self, module_id, event_id): + return self.registry['event'].get('{}-{}'.format(module_id, event_id), []) + + def get_extrinsic_processors(self, module_id, call_id): + return self.registry['extrinsic'].get('{}-{}'.format(module_id, call_id), []) + + def get_block_processors(self): + return self.registry['block'] + + +class Processor(object): + + def initialization_hook(self, db_session): + """ + Hook during initialization phase, which will be a one-time call during processing of the genesis block + :param db_session: + :type db_session: sqlalchemy.orm.Session + :return: + """ + pass + + def accumulation_hook(self, db_session): + """ + Hook during accumulation phase, which means processing on an isolated block level; no context outside the + current block is available + :param db_session: + :type db_session: sqlalchemy.orm.Session + :return: + """ + pass + + def accumulation_revert(self, db_session): + """ + Revert hook during accumulation phase when block was not on correct chain, e.g. fork or uncle, which means + processing on an isolated block level; no context outside the current block is available + :param db_session: + :type db_session: sqlalchemy.orm.Session + :return: + """ + pass + + def sequencing_hook(self, db_session, parent_block, parent_sequenced_block): + """ + Hook during sequencing phase, which means processing block for block from genesis to chaintip where this order + of processing is crucial + :param parent_block: + :param parent_sequenced_block: + :type parent_sequenced_block: BlockTotal + :param db_session: + :type db_session: sqlalchemy.orm.Session + :return: + """ + pass + + def aggregation_hook(self, db_session): + """ + Hook during aggregation phase, which will be a periodic call on several pre-defined timeframes in order to + write aggregated data over this timeframe + :param db_session: + :type db_session: sqlalchemy.orm.Session + :return: + """ + pass + + +class EventProcessor(Processor): + + module_id = None + event_id = None + + def __init__(self, block, event, extrinsic=None, metadata=None, substrate=None): + self.block = block + self.event = event + self.extrinsic = extrinsic + self.metadata = metadata + self.substrate = substrate + + def add_search_index(self, index_type_id, account_id=None, sorting_value=None): + return SearchIndex( + index_type_id=index_type_id, + block_id=self.block.id, + event_idx=self.event.event_idx, + extrinsic_idx=self.event.extrinsic_idx, + account_id=account_id, + sorting_value=sorting_value + ) + + def process_search_index(self, db_session): + pass + + def add_search_index(self, index_type_id, account_id=None, sorting_value=None): + return SearchIndex( + index_type_id=index_type_id, + block_id=self.block.id, + event_idx=self.event.event_idx, + extrinsic_idx=self.event.extrinsic_idx, + account_id=account_id, + sorting_value=sorting_value + ) + + def process_search_index(self, db_session): + pass + + +class ExtrinsicProcessor(Processor): + + module_id = None + call_id = None + + def __init__(self, block, extrinsic, substrate=None): + self.block = block + self.extrinsic = extrinsic + self.substrate = substrate + + def add_search_index(self, index_type_id, account_id=None, sorting_value=None): + return SearchIndex( + index_type_id=index_type_id, + block_id=self.block.id, + event_idx=None, + extrinsic_idx=self.extrinsic.extrinsic_idx, + account_id=account_id, + sorting_value=sorting_value + ) + + def process_search_index(self, db_session): + pass + + +class BlockProcessor(Processor): + + def __init__(self, block, sequenced_block=None, substrate=None, harvester=None): + self.block = block + self.sequenced_block = sequenced_block + self.substrate = substrate + self.harvester = harvester diff --git a/pm-harvester/app/processors/block.py b/pm-harvester/app/processors/block.py new file mode 100644 index 00000000..dcd47fba --- /dev/null +++ b/pm-harvester/app/processors/block.py @@ -0,0 +1,524 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# block.py +# +import binascii +import dateutil +from sqlalchemy import distinct + +from sqlalchemy.orm.exc import NoResultFound +from substrateinterface.utils.hasher import blake2_256 + +from app import settings +from substrateinterface.utils.hasher import blake2_256 + +from app.models.data import Log, AccountAudit, Account, AccountIndexAudit, AccountIndex, \ + SessionValidator, IdentityAudit, IdentityJudgementAudit, IdentityJudgement, SearchIndex, AccountInfoSnapshot + +from app.utils.ss58 import ss58_encode, ss58_encode_account_index +from scalecodec.base import ScaleBytes, RuntimeConfiguration + +from app.processors.base import BlockProcessor +from scalecodec.block import LogDigest + + +class LogBlockProcessor(BlockProcessor): + + def accumulation_hook(self, db_session): + + self.block.count_log = len(self.block.logs) + + for idx, log_data in enumerate(self.block.logs): + log_digest = LogDigest(ScaleBytes(log_data)) + log_digest.decode() + + log = Log( + block_id=self.block.id, + log_idx=idx, + type_id=log_digest.index, + type=log_digest.index_value, + data=log_digest.value, + ) + + if log.type == 'PreRuntime': + if log.data['value']['engine'] == 'BABE': + # Determine block producer + babe_predigest_cls = RuntimeConfiguration().get_decoder_class('RawBabePreDigest') + + babe_predigest = babe_predigest_cls( + ScaleBytes(bytearray.fromhex(log.data['value']['data'].replace('0x', ''))) + ).decode() + + if len(list(babe_predigest.values())) > 0: + + babe_predigest_value = list(babe_predigest.values())[0] + + log.data['value']['data'] = babe_predigest_value + self.block.authority_index = log.data['value']['data']['authorityIndex'] + self.block.slot_number = log.data['value']['data']['slotNumber'] + + if log.data['value']['engine'] == 'aura': + aura_predigest_cls = RuntimeConfiguration().get_decoder_class('RawAuraPreDigest') + + aura_predigest = aura_predigest_cls( + ScaleBytes(bytearray.fromhex(log.data['value']['data'].replace('0x', ''))) + ).decode() + + log.data['value']['data'] = aura_predigest + self.block.slot_number = aura_predigest['slotNumber'] + + log.save(db_session) + + def accumulation_revert(self, db_session): + for item in Log.query(db_session).filter_by(block_id=self.block.id): + db_session.delete(item) + + self.block.authority_index = None + self.block.slot_number = None + + +class BlockTotalProcessor(BlockProcessor): + + def sequencing_hook(self, db_session, parent_block_data, parent_sequenced_block_data): + + if not parent_sequenced_block_data: + parent_sequenced_block_data = {} + + if parent_block_data and parent_block_data['datetime']: + self.sequenced_block.parent_datetime = parent_block_data['datetime'] + + if type(parent_block_data['datetime']) is str: + self.sequenced_block.blocktime = (self.block.datetime - dateutil.parser.parse(parent_block_data['datetime'])).total_seconds() + else: + self.sequenced_block.blocktime = (self.block.datetime - parent_block_data['datetime']).total_seconds() + else: + self.sequenced_block.blocktime = 0 + self.sequenced_block.parent_datetime = self.block.datetime + + self.sequenced_block.total_extrinsics = int(parent_sequenced_block_data.get('total_extrinsics', 0)) + self.block.count_extrinsics + self.sequenced_block.total_extrinsics_success = int(parent_sequenced_block_data.get('total_extrinsics_success', 0)) + self.block.count_extrinsics_success + self.sequenced_block.total_extrinsics_error = int(parent_sequenced_block_data.get('total_extrinsics_error', 0)) + self.block.count_extrinsics_error + self.sequenced_block.total_extrinsics_signed = int(parent_sequenced_block_data.get('total_extrinsics_signed', 0)) + self.block.count_extrinsics_signed + self.sequenced_block.total_extrinsics_unsigned = int(parent_sequenced_block_data.get('total_extrinsics_unsigned', 0)) + self.block.count_extrinsics_unsigned + self.sequenced_block.total_extrinsics_signedby_address = int(parent_sequenced_block_data.get('total_extrinsics_signedby_address', 0)) + self.block.count_extrinsics_signedby_address + self.sequenced_block.total_extrinsics_signedby_index = int(parent_sequenced_block_data.get('total_extrinsics_signedby_index', 0)) + self.block.count_extrinsics_signedby_index + self.sequenced_block.total_events = int(parent_sequenced_block_data.get('total_events', 0)) + self.block.count_events + self.sequenced_block.total_events_system = int(parent_sequenced_block_data.get('total_events_system', 0)) + self.block.count_events_system + self.sequenced_block.total_events_module = int(parent_sequenced_block_data.get('total_events_module', 0)) + self.block.count_events_module + self.sequenced_block.total_events_extrinsic = int(parent_sequenced_block_data.get('total_events_extrinsic', 0)) + self.block.count_events_extrinsic + self.sequenced_block.total_events_finalization = int(parent_sequenced_block_data.get('total_events_finalization', 0)) + self.block.count_events_finalization + self.sequenced_block.total_blocktime = int(parent_sequenced_block_data.get('total_blocktime', 0)) + self.sequenced_block.blocktime + self.sequenced_block.total_accounts_new = int(parent_sequenced_block_data.get('total_accounts_new', 0)) + self.block.count_accounts_new + + self.sequenced_block.total_logs = int(parent_sequenced_block_data.get('total_logs', 0)) + self.block.count_log + self.sequenced_block.total_accounts = int(parent_sequenced_block_data.get('total_accounts', 0)) + self.block.count_accounts + self.sequenced_block.total_accounts_reaped = int(parent_sequenced_block_data.get('total_accounts_reaped', 0)) + self.block.count_accounts_reaped + self.sequenced_block.total_sessions_new = int(parent_sequenced_block_data.get('total_sessions_new', 0)) + self.block.count_sessions_new + self.sequenced_block.total_contracts_new = int(parent_sequenced_block_data.get('total_contracts_new', 0)) + self.block.count_contracts_new + + self.sequenced_block.session_id = int(parent_sequenced_block_data.get('session_id', 0)) + + if parent_block_data and parent_block_data['count_sessions_new'] > 0: + self.sequenced_block.session_id += 1 + + if self.block.slot_number is not None: + + rank_validator = None + + if self.block.authority_index is not None: + rank_validator = self.block.authority_index + else: + # In case of AURA, validator slot is determined by unique slot number + validator_count = SessionValidator.query(db_session).filter_by( + session_id=self.sequenced_block.session_id + ).count() + + if validator_count > 0: + rank_validator = int(self.block.slot_number) % validator_count + + # Retrieve block producer from session validator set + validator = SessionValidator.query(db_session).filter_by( + session_id=self.sequenced_block.session_id, + rank_validator=rank_validator).first() + + if validator: + self.sequenced_block.author = validator.validator_stash + + +class AccountBlockProcessor(BlockProcessor): + + def accumulation_hook(self, db_session): + self.block.count_accounts_new += len(set(self.block._accounts_new)) + self.block.count_accounts_reaped += len(set(self.block._accounts_reaped)) + + self.block.count_accounts = self.block.count_accounts_new - self.block.count_accounts_reaped + + def sequencing_hook(self, db_session, parent_block_data, parent_sequenced_block_data): + + for account_audit in AccountAudit.query(db_session).filter_by(block_id=self.block.id).order_by('event_idx'): + try: + account = Account.query(db_session).filter_by(id=account_audit.account_id).one() + + if account_audit.type_id == settings.ACCOUNT_AUDIT_TYPE_REAPED: + account.count_reaped += 1 + account.is_reaped = True + + elif account_audit.type_id == settings.ACCOUNT_AUDIT_TYPE_NEW: + account.is_reaped = False + + account.updated_at_block = self.block.id + + except NoResultFound: + + account = Account( + id=account_audit.account_id, + address=ss58_encode(account_audit.account_id, settings.SUBSTRATE_ADDRESS_TYPE), + hash_blake2b=blake2_256(binascii.unhexlify(account_audit.account_id)), + is_treasury=(account_audit.data or {}).get('is_treasury', False), + is_sudo=(account_audit.data or {}).get('is_sudo', False), + was_sudo=(account_audit.data or {}).get('is_sudo', False), + created_at_block=self.block.id, + updated_at_block=self.block.id + ) + + # Retrieve index in corresponding account + account_index = AccountIndex.query(db_session).filter_by(account_id=account.id).first() + + if account_index: + + account.index_address = account_index.short_address + + # Retrieve and set initial balance + try: + account_info_data = self.substrate.get_runtime_state( + module='System', + storage_function='Account', + params=['0x{}'.format(account.id)], + block_hash=self.block.hash + ).get('result') + + if account_info_data: + + account.balance_free = account_info_data["data"]["free"] + account.balance_reserved = account_info_data["data"]["reserved"] + account.balance_total = account_info_data["data"]["free"] + account_info_data["data"]["reserved"] + account.nonce = account_info_data["nonce"] + except ValueError: + pass + + # # If reaped but does not exist, create new account for now + # if account_audit.type_id != ACCOUNT_AUDIT_TYPE_NEW: + # account.is_reaped = True + # account.count_reaped = 1 + + account.save(db_session) + + # Until SUDO and batch calls are processed separately we need to do a safety check to be sure we include all + # accounts that have activity (lookup in account_index) in current block + # TODO implement calls + + for search_index in db_session.query(SearchIndex.account_id).filter( + SearchIndex.block_id == self.block.id, + SearchIndex.account_id.notin_(db_session.query(Account.id)) + ).distinct(): + + account = Account( + id=search_index.account_id, + address=ss58_encode(search_index.account_id, settings.SUBSTRATE_ADDRESS_TYPE), + hash_blake2b=blake2_256(binascii.unhexlify(search_index.account_id)), + created_at_block=self.block.id, + updated_at_block=self.block.id + ) + + try: + account_info_data = self.substrate.get_runtime_state( + module='System', + storage_function='Account', + params=['0x{}'.format(account.id)], + block_hash=self.block.hash + ).get('result') + + if account_info_data: + account.balance_free = account_info_data["data"]["free"] + account.balance_reserved = account_info_data["data"]["reserved"] + account.balance_total = account_info_data["data"]["free"] + account_info_data["data"]["reserved"] + account.nonce = account_info_data["nonce"] + except ValueError: + pass + + account.save(db_session) + + +class AccountIndexBlockProcessor(BlockProcessor): + + def sequencing_hook(self, db_session, parent_block_data, parent_sequenced_block_data): + + for account_index_audit in AccountIndexAudit.query(db_session).filter_by( + block_id=self.block.id + ).order_by('event_idx'): + + if account_index_audit.type_id == settings.ACCOUNT_INDEX_AUDIT_TYPE_NEW: + + # Check if account index already exists + account_index = AccountIndex.query(db_session).filter_by( + id=account_index_audit.account_index_id + ).first() + + if not account_index: + + account_index = AccountIndex( + id=account_index_audit.account_index_id, + created_at_block=self.block.id + ) + + account_index.account_id = account_index_audit.account_id + account_index.short_address = ss58_encode_account_index( + account_index_audit.account_index_id, + settings.SUBSTRATE_ADDRESS_TYPE + ) + account_index.updated_at_block = self.block.id + + account_index.save(db_session) + + # Update index in corresponding account + account = Account.query(db_session).get(account_index.account_id) + + if account: + account.index_address = account_index.short_address + account.save(db_session) + + elif account_index_audit.type_id == settings.ACCOUNT_INDEX_AUDIT_TYPE_REAPED: + + if account_index_audit.account_index_id: + account_index_list = AccountIndex.query(db_session).filter_by( + id=account_index_audit.account_index_id + ) + else: + account_index_list = AccountIndex.query(db_session).filter_by( + account_id=account_index_audit.account_id + ) + + for account_index in account_index_list: + + account_index.account_id = None + account_index.is_reclaimable = True + account_index.updated_at_block = self.block.id + account_index.save(db_session) + + +class IdentityBlockProcessor(BlockProcessor): + + def sequencing_hook(self, db_session, parent_block_data, parent_sequenced_block_data): + + for identity_audit in IdentityAudit.query(db_session).filter_by(block_id=self.block.id).order_by('event_idx'): + + account = Account.query(db_session).get(identity_audit.account_id) + + if account: + + if identity_audit.type_id == settings.IDENTITY_TYPE_SET: + + account.has_identity = True + + account.identity_display = identity_audit.data.get('display') + account.identity_email = identity_audit.data.get('email') + account.identity_legal = identity_audit.data.get('legal') + account.identity_riot = identity_audit.data.get('riot') + account.identity_web = identity_audit.data.get('web') + account.identity_twitter = identity_audit.data.get('twitter') + + if account.has_subidentity: + # Update sub accounts + sub_accounts = Account.query(db_session).filter_by(parent_identity=account.id) + for sub_account in sub_accounts: + sub_account.identity_display = account.identity_display + sub_account.identity_email = account.identity_email + sub_account.identity_legal = account.identity_legal + sub_account.identity_riot = account.identity_riot + sub_account.identity_web = account.identity_web + sub_account.identity_twitter = account.identity_twitter + + sub_account.save(db_session) + + account.save(db_session) + elif identity_audit.type_id in [settings.IDENTITY_TYPE_CLEARED, settings.IDENTITY_TYPE_KILLED]: + + if account.has_subidentity: + # Clear sub accounts + sub_accounts = Account.query(db_session).filter_by(parent_identity=account.id) + for sub_account in sub_accounts: + sub_account.identity_display = None + sub_account.identity_email = None + sub_account.identity_legal = None + sub_account.identity_riot = None + sub_account.identity_web = None + sub_account.identity_twitter = None + sub_account.parent_identity = None + sub_account.has_identity = False + + sub_account.identity_judgement_good = 0 + sub_account.identity_judgement_bad = 0 + + sub_account.save(db_session) + + account.has_identity = False + account.has_subidentity = False + + account.identity_display = None + account.identity_email = None + account.identity_legal = None + account.identity_riot = None + account.identity_web = None + account.identity_twitter = None + + account.identity_judgement_good = 0 + account.identity_judgement_bad = 0 + + account.save(db_session) + + elif identity_audit.type_id == settings.IDENTITY_TYPE_SET_SUBS: + + # Clear current subs + sub_accounts = Account.query(db_session).filter_by(parent_identity=account.id) + for sub_account in sub_accounts: + sub_account.identity_display = None + sub_account.identity_email = None + sub_account.identity_legal = None + sub_account.identity_riot = None + sub_account.identity_web = None + sub_account.identity_twitter = None + sub_account.parent_identity = None + sub_account.identity_judgement_good = 0 + sub_account.identity_judgement_bad = 0 + sub_account.has_identity = False + + sub_account.save(db_session) + + account.has_subidentity = False + + # Process sub indenties + if len(identity_audit.data.get('subs', [])) > 0: + + account.has_subidentity = True + + for sub_identity in identity_audit.data.get('subs'): + sub_account = Account.query(db_session).get(sub_identity['account'].replace('0x', '')) + if sub_account: + sub_account.parent_identity = account.id + sub_account.subidentity_display = sub_identity['name'] + + sub_account.identity_display = account.identity_display + sub_account.identity_email = account.identity_email + sub_account.identity_legal = account.identity_legal + sub_account.identity_riot = account.identity_riot + sub_account.identity_web = account.identity_web + sub_account.identity_twitter = account.identity_twitter + + sub_account.identity_judgement_good = account.identity_judgement_good + sub_account.identity_judgement_bad = account.identity_judgement_bad + + sub_account.has_identity = True + + sub_account.save(db_session) + + account.save(db_session) + + +class IdentityJudgementBlockProcessor(BlockProcessor): + + def sequencing_hook(self, db_session, parent_block_data, parent_sequenced_block_data): + + for identity_audit in IdentityJudgementAudit.query(db_session).filter_by(block_id=self.block.id).order_by('event_idx'): + + if identity_audit.type_id == settings.IDENTITY_JUDGEMENT_TYPE_GIVEN: + + judgement = IdentityJudgement.query(db_session).filter_by( + account_id=identity_audit.account_id, + registrar_index=identity_audit.registrar_index + ).first() + + if not judgement: + + judgement = IdentityJudgement( + account_id=identity_audit.account_id, + registrar_index=identity_audit.registrar_index, + created_at_block=self.block.id + ) + + if identity_audit.data: + judgement.judgement = identity_audit.data.get('judgement') + judgement.updated_at_block = self.block.id + + judgement.save(db_session) + + account = Account.query(db_session).get(identity_audit.account_id) + + if account: + + if judgement.judgement in ['Reasonable', 'KnownGood']: + account.identity_judgement_good += 1 + + if judgement.judgement in ['LowQuality', 'Erroneous']: + account.identity_judgement_bad += 1 + + account.save(db_session) + + if account.has_subidentity: + # Update sub identities + sub_accounts = Account.query(db_session).filter_by(parent_identity=account.id) + for sub_account in sub_accounts: + sub_account.identity_judgement_good = account.identity_judgement_good + sub_account.identity_judgement_bad = account.identity_judgement_bad + sub_account.save(db_session) + + +class AccountInfoBlockProcessor(BlockProcessor): + + def accumulation_hook(self, db_session): + # Store in AccountInfoSnapshot for all processed search indices and per 10000 blocks + + if self.block.id % settings.BALANCE_FULL_SNAPSHOT_INTERVAL == 0: + from app.tasks import update_balances_in_block + + if settings.CELERY_RUNNING: + update_balances_in_block.delay(self.block.id) + else: + update_balances_in_block(self.block.id) + else: + # Retrieve unique accounts in all searchindex records for current block + for search_index in db_session.query(distinct(SearchIndex.account_id)).filter_by(block_id=self.block.id): + self.harvester.create_balance_snapshot( + block_id=self.block.id, + block_hash=self.block.hash, + account_id=search_index[0] + ) + + def sequencing_hook(self, db_session, parent_block, parent_sequenced_block): + # Update Account according to AccountInfoSnapshot + + for account_info in AccountInfoSnapshot.query(db_session).filter_by(block_id=self.block.id): + account = Account.query(db_session).get(account_info.account_id) + if account: + account.balance_total = account_info.balance_total + account.balance_reserved = account_info.balance_reserved + account.balance_free = account_info.balance_free + account.nonce = account_info.nonce + account.save(db_session) + + diff --git a/pm-harvester/app/processors/converters.py b/pm-harvester/app/processors/converters.py new file mode 100644 index 00000000..554f5c6a --- /dev/null +++ b/pm-harvester/app/processors/converters.py @@ -0,0 +1,1133 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# converters.py +import json +import logging + +import math + +from app import settings + +from sqlalchemy import func, distinct +from sqlalchemy.exc import SQLAlchemyError +from app.models.harvester import Status +from app.processors import NewSessionEventProcessor, Log, SlashEventProcessor, BalancesTransferProcessor +from scalecodec.base import ScaleBytes, ScaleDecoder, RuntimeConfiguration +from scalecodec.exceptions import RemainingScaleBytesNotEmptyException +from scalecodec.block import ExtrinsicsDecoder + +from app.processors.base import BaseService, ProcessorRegistry +from scalecodec.type_registry import load_type_registry_file +from substrateinterface import SubstrateInterface, SubstrateRequestException, xxh128, logger + +from app.models.data import Extrinsic, Block, Event, Runtime, RuntimeModule, RuntimeCall, RuntimeCallParam, \ + RuntimeEvent, RuntimeEventAttribute, RuntimeType, RuntimeStorage, BlockTotal, RuntimeConstant, AccountAudit, \ + AccountIndexAudit, ReorgBlock, ReorgExtrinsic, ReorgEvent, ReorgLog, RuntimeErrorMessage, Account, \ + AccountInfoSnapshot, SearchIndex + + +if settings.DEBUG: + # Set Logger level to Debug + logger.setLevel(logging.DEBUG) + ch = logging.StreamHandler() + logger.addHandler(ch) + + +class HarvesterCouldNotAddBlock(Exception): + pass + + +class BlockAlreadyAdded(Exception): + pass + + +class BlockIntegrityError(Exception): + pass + + +class PolkascanHarvesterService(BaseService): + + def __init__(self, db_session, type_registry='default', type_registry_file=None): + self.db_session = db_session + + if type_registry_file: + custom_type_registry = load_type_registry_file(type_registry_file) + else: + custom_type_registry = None + + self.substrate = SubstrateInterface( + url=settings.SUBSTRATE_RPC_URL, + type_registry=custom_type_registry, + type_registry_preset=type_registry + ) + self.metadata_store = {} + + def process_genesis(self, block): + + # Set block time of parent block + child_block = Block.query(self.db_session).filter_by(parent_hash=block.hash).first() + block.set_datetime(child_block.datetime) + + # Retrieve genesis accounts + if settings.get_versioned_setting('SUBSTRATE_STORAGE_INDICES', block.spec_version_id) == 'Accounts': + + # Get accounts from storage keys + storage_key_prefix = self.substrate.generate_storage_hash( + storage_module='System', + storage_function='Account', + metadata_version=settings.SUBSTRATE_METADATA_VERSION + ) + + rpc_result = self.substrate.rpc_request( + 'state_getKeys', + [storage_key_prefix, block.hash] + ).get('result') + # Extract accounts from storage key + genesis_accounts = [storage_key[-64:] for storage_key in rpc_result if len(storage_key) == 162] + + for account_id in genesis_accounts: + account_audit = AccountAudit( + account_id=account_id, + block_id=block.id, + extrinsic_idx=None, + event_idx=None, + type_id=settings.ACCOUNT_AUDIT_TYPE_NEW + ) + + account_audit.save(self.db_session) + + elif settings.get_versioned_setting('SUBSTRATE_STORAGE_INDICES', block.spec_version_id) == 'EnumSet': + + genesis_account_page_count = self.substrate.get_runtime_state( + module="Indices", + storage_function="NextEnumSet", + block_hash=block.hash + ).get('result', 0) + + # Get Accounts on EnumSet + block.count_accounts_new = 0 + block.count_accounts = 0 + + for enum_set_nr in range(0, genesis_account_page_count + 1): + + genesis_accounts = self.substrate.get_runtime_state( + module="Indices", + storage_function="EnumSet", + params=[enum_set_nr], + block_hash=block.hash + ).get('result') + + if genesis_accounts: + block.count_accounts_new += len(genesis_accounts) + block.count_accounts += len(genesis_accounts) + + for idx, account_id in enumerate(genesis_accounts): + account_audit = AccountAudit( + account_id=account_id.replace('0x', ''), + block_id=block.id, + extrinsic_idx=None, + event_idx=None, + type_id=settings.ACCOUNT_AUDIT_TYPE_NEW + ) + + account_audit.save(self.db_session) + + account_index_id = enum_set_nr * 64 + idx + + account_index_audit = AccountIndexAudit( + account_index_id=account_index_id, + account_id=account_id.replace('0x', ''), + block_id=block.id, + extrinsic_idx=None, + event_idx=None, + type_id=settings.ACCOUNT_INDEX_AUDIT_TYPE_NEW + ) + + account_index_audit.save(self.db_session) + + block.save(self.db_session) + + # Add hardcoded account like treasury stored in settings + for account_id in settings.SUBSTRATE_TREASURY_ACCOUNTS: + account_audit = AccountAudit( + account_id=account_id, + block_id=block.id, + extrinsic_idx=None, + event_idx=None, + data={'is_treasury': True}, + type_id=settings.ACCOUNT_AUDIT_TYPE_NEW + ) + + account_audit.save(self.db_session) + + # Check for sudo accounts + try: + # Update sudo key + sudo_key = self.substrate.get_runtime_state( + module='Sudo', + storage_function='Key', + block_hash=block.hash + ).get('result') + + account_audit = AccountAudit( + account_id=sudo_key.replace('0x', ''), + block_id=block.id, + extrinsic_idx=None, + event_idx=None, + data={'is_sudo': True}, + type_id=settings.ACCOUNT_AUDIT_TYPE_NEW + ) + + account_audit.save(self.db_session) + except ValueError: + pass + + # Create initial session + initial_session_event = NewSessionEventProcessor( + block=block, event=Event(), substrate=self.substrate + ) + + if settings.get_versioned_setting('NEW_SESSION_EVENT_HANDLER', block.spec_version_id): + initial_session_event.add_session(db_session=self.db_session, session_id=0) + else: + initial_session_event.add_session_old(db_session=self.db_session, session_id=0) + + def process_metadata(self, spec_version, block_hash): + + # Check if metadata already stored + + runtime = Runtime.query(self.db_session).get(spec_version) + + if runtime: + + if spec_version in self.substrate.metadata_cache: + self.metadata_store[spec_version] = self.substrate.metadata_cache[spec_version] + else: + self.metadata_store[spec_version] = self.substrate.get_block_metadata(block_hash=block_hash) + + else: + print('Metadata: CACHE MISS', spec_version) + + runtime_version_data = self.substrate.get_block_runtime_version(block_hash) + + self.db_session.begin(subtransactions=True) + try: + + # Store metadata in database + runtime = Runtime( + id=spec_version, + impl_name=runtime_version_data["implName"], + impl_version=runtime_version_data["implVersion"], + spec_name=runtime_version_data["specName"], + spec_version=spec_version, + json_metadata=str(self.substrate.metadata_decoder.data), + json_metadata_decoded=self.substrate.metadata_decoder.value, + apis=runtime_version_data["apis"], + authoring_version=runtime_version_data["authoringVersion"], + count_call_functions=0, + count_events=0, + count_modules=len(self.substrate.metadata_decoder.metadata.modules), + count_storage_functions=0, + count_constants=0, + count_errors=0 + ) + + runtime.save(self.db_session) + + print('store version to db', self.substrate.metadata_decoder.version) + + for module_index, module in enumerate(self.substrate.metadata_decoder.metadata.modules): + + # Fixed incorrect module index when metadata version > 12 + # https://github.com/polkascan/polkascan-pre-harvester/commit/bf6991585fd61ba8cc25c558dbd278b4ea2ac8f5 + if hasattr(module, 'index'): + module_index = module.index + + # Check if module exists + if RuntimeModule.query(self.db_session).filter_by( + spec_version=spec_version, + module_id=module.get_identifier() + ).count() == 0: + module_id = module.get_identifier() + else: + module_id = '{}_1'.format(module.get_identifier()) + + # Storage backwards compt check + if module.storage and isinstance(module.storage, list): + storage_functions = module.storage + elif module.storage and isinstance(getattr(module.storage, 'value'), dict): + storage_functions = module.storage.items + else: + storage_functions = [] + + runtime_module = RuntimeModule( + spec_version=spec_version, + module_id=module_id, + prefix=module.prefix, + name=module.name, + count_call_functions=len(module.calls or []), + count_storage_functions=len(storage_functions), + count_events=len(module.events or []), + count_constants=len(module.constants or []), + count_errors=len(module.errors or []), + ) + runtime_module.save(self.db_session) + + # Update totals in runtime + runtime.count_call_functions += runtime_module.count_call_functions + runtime.count_events += runtime_module.count_events + runtime.count_storage_functions += runtime_module.count_storage_functions + runtime.count_constants += runtime_module.count_constants + runtime.count_errors += runtime_module.count_errors + + if len(module.calls or []) > 0: + for idx, call in enumerate(module.calls): + runtime_call = RuntimeCall( + spec_version=spec_version, + module_id=module_id, + call_id=call.get_identifier(), + index=idx, + name=call.name, + lookup=call.lookup, + documentation='\n'.join(call.docs), + count_params=len(call.args) + ) + runtime_call.save(self.db_session) + + for arg in call.args: + runtime_call_param = RuntimeCallParam( + runtime_call_id=runtime_call.id, + name=arg.name, + type=arg.type + ) + runtime_call_param.save(self.db_session) + + if len(module.events or []) > 0: + for event_index, event in enumerate(module.events): + runtime_event = RuntimeEvent( + spec_version=spec_version, + module_id=module_id, + event_id=event.name, + index=event_index, + name=event.name, + lookup=event.lookup, + documentation='\n'.join(event.docs), + count_attributes=len(event.args) + ) + runtime_event.save(self.db_session) + + for arg_index, arg in enumerate(event.args): + runtime_event_attr = RuntimeEventAttribute( + runtime_event_id=runtime_event.id, + index=arg_index, + type=arg + ) + runtime_event_attr.save(self.db_session) + + if len(storage_functions) > 0: + for idx, storage in enumerate(storage_functions): + + # Determine type + type_hasher = None + type_key1 = None + type_key2 = None + type_value = None + type_is_linked = None + type_key2hasher = None + + if storage.type.get('PlainType'): + type_value = storage.type.get('PlainType') + + elif storage.type.get('MapType'): + type_hasher = storage.type['MapType'].get('hasher') + type_key1 = storage.type['MapType'].get('key') + type_value = storage.type['MapType'].get('value') + type_is_linked = storage.type['MapType'].get('isLinked', False) + + elif storage.type.get('DoubleMapType'): + type_hasher = storage.type['DoubleMapType'].get('hasher') + type_key1 = storage.type['DoubleMapType'].get('key1') + type_key2 = storage.type['DoubleMapType'].get('key2') + type_value = storage.type['DoubleMapType'].get('value') + type_key2hasher = storage.type['DoubleMapType'].get('key2Hasher') + + runtime_storage = RuntimeStorage( + spec_version=spec_version, + module_id=module_id, + index=idx, + name=storage.name, + lookup=None, + default=storage.fallback, + modifier=storage.modifier, + type_hasher=type_hasher, + storage_key=xxh128(module.prefix.encode()) + xxh128(storage.name.encode()), + type_key1=type_key1, + type_key2=type_key2, + type_value=type_value, + type_is_linked=type_is_linked, + type_key2hasher=type_key2hasher, + documentation='\n'.join(storage.docs) + ) + runtime_storage.save(self.db_session) + + if len(module.constants or []) > 0: + for idx, constant in enumerate(module.constants): + + # Decode value + try: + value_obj = ScaleDecoder.get_decoder_class( + constant.type, + ScaleBytes(constant.constant_value) + ) + value_obj.decode() + value = value_obj.serialize() + except ValueError: + value = constant.constant_value + except RemainingScaleBytesNotEmptyException: + value = constant.constant_value + except NotImplementedError: + value = constant.constant_value + + if type(value) is list or type(value) is dict: + value = json.dumps(value) + + runtime_constant = RuntimeConstant( + spec_version=spec_version, + module_id=module_id, + index=idx, + name=constant.name, + type=constant.type, + value=value, + documentation='\n'.join(constant.docs) + ) + runtime_constant.save(self.db_session) + + if len(module.errors or []) > 0: + for idx, error in enumerate(module.errors): + runtime_error = RuntimeErrorMessage( + spec_version=spec_version, + module_id=module_id, + module_index=module_index, + index=idx, + name=error.name, + documentation='\n'.join(error.docs) + ) + runtime_error.save(self.db_session) + + runtime.save(self.db_session) + + # Process types + for runtime_type_data in list(self.substrate.get_type_registry(block_hash=block_hash).values()): + + runtime_type = RuntimeType( + spec_version=runtime_type_data["spec_version"], + type_string=runtime_type_data["type_string"], + decoder_class=runtime_type_data["decoder_class"], + is_primitive_core=runtime_type_data["is_primitive_core"], + is_primitive_runtime=runtime_type_data["is_primitive_runtime"] + ) + runtime_type.save(self.db_session) + + self.db_session.commit() + + # Put in local store + self.metadata_store[spec_version] = self.substrate.metadata_decoder + except SQLAlchemyError as e: + self.db_session.rollback() + + def add_block(self, block_hash): + + # Check if block is already process + if Block.query(self.db_session).filter_by(hash=block_hash).count() > 0: + raise BlockAlreadyAdded(block_hash) + + if settings.SUBSTRATE_MOCK_EXTRINSICS: + self.substrate.mock_extrinsics = settings.SUBSTRATE_MOCK_EXTRINSICS + + json_block = self.substrate.get_chain_block(block_hash) + + parent_hash = json_block['block']['header'].pop('parentHash') + block_id = json_block['block']['header'].pop('number') + extrinsics_root = json_block['block']['header'].pop('extrinsicsRoot') + state_root = json_block['block']['header'].pop('stateRoot') + digest_logs = json_block['block']['header'].get('digest', {}).pop('logs', None) + + # Convert block number to numeric + if not block_id.isnumeric(): + block_id = int(block_id, 16) + + # ==== Get block runtime from Substrate ================== + + self.substrate.init_runtime(block_hash=block_hash) + + self.process_metadata(self.substrate.runtime_version, block_hash) + + # ==== Get parent block runtime =================== + + if block_id > 0: + json_parent_runtime_version = self.substrate.get_block_runtime_version(parent_hash) + + parent_spec_version = json_parent_runtime_version.get('specVersion', 0) + + self.process_metadata(parent_spec_version, parent_hash) + else: + parent_spec_version = self.substrate.runtime_version + + # ==== Set initial block properties ===================== + + block = Block( + id=block_id, + parent_id=block_id - 1, + hash=block_hash, + parent_hash=parent_hash, + state_root=state_root, + extrinsics_root=extrinsics_root, + count_extrinsics=0, + count_events=0, + count_accounts_new=0, + count_accounts_reaped=0, + count_accounts=0, + count_events_extrinsic=0, + count_events_finalization=0, + count_events_module=0, + count_events_system=0, + count_extrinsics_error=0, + count_extrinsics_signed=0, + count_extrinsics_signedby_address=0, + count_extrinsics_signedby_index=0, + count_extrinsics_success=0, + count_extrinsics_unsigned=0, + count_sessions_new=0, + count_contracts_new=0, + count_log=0, + range10000=math.floor(block_id / 10000), + range100000=math.floor(block_id / 100000), + range1000000=math.floor(block_id / 1000000), + spec_version_id=self.substrate.runtime_version, + logs=digest_logs + ) + + # Set temp helper variables + block._accounts_new = [] + block._accounts_reaped = [] + + # ==== Get block events from Substrate ================== + extrinsic_success_idx = {} + events = [] + + try: + # TODO implemented solution in substrate interface for runtime transition blocks + # Events are decoded against runtime of parent block + RuntimeConfiguration().set_active_spec_version_id(parent_spec_version) + events_decoder = self.substrate.get_block_events(block_hash, self.metadata_store[parent_spec_version]) + + # Revert back to current runtime + RuntimeConfiguration().set_active_spec_version_id(block.spec_version_id) + + event_idx = 0 + + for event in events_decoder.elements: + + event.value['module_id'] = event.value['module_id'].lower() + + model = Event( + block_id=block_id, + event_idx=event_idx, + phase=event.value['phase'], + extrinsic_idx=event.value['extrinsic_idx'], + type=event.value['type'], + spec_version_id=parent_spec_version, + module_id=event.value['module_id'], + event_id=event.value['event_id'], + system=int(event.value['module_id'] == 'system'), + module=int(event.value['module_id'] != 'system'), + attributes=event.value['params'], + codec_error=False + ) + + # Process event + + if event.value['phase'] == 0: + block.count_events_extrinsic += 1 + elif event.value['phase'] == 1: + block.count_events_finalization += 1 + + if event.value['module_id'] == 'system': + + block.count_events_system += 1 + + # Store result of extrinsic + if event.value['event_id'] == 'ExtrinsicSuccess': + extrinsic_success_idx[event.value['extrinsic_idx']] = True + block.count_extrinsics_success += 1 + + if event.value['event_id'] == 'ExtrinsicFailed': + extrinsic_success_idx[event.value['extrinsic_idx']] = False + block.count_extrinsics_error += 1 + else: + + block.count_events_module += 1 + + model.save(self.db_session) + + events.append(model) + + event_idx += 1 + + block.count_events = len(events_decoder.elements) + + except SubstrateRequestException: + block.count_events = 0 + + # === Extract extrinsics from block ==== + + extrinsics_data = json_block['block'].pop('extrinsics') + + block.count_extrinsics = len(extrinsics_data) + + extrinsic_idx = 0 + + extrinsics = [] + + for extrinsic in extrinsics_data: + + extrinsics_decoder = ExtrinsicsDecoder( + data=ScaleBytes(extrinsic), + metadata=self.metadata_store[parent_spec_version] + ) + + extrinsic_data = extrinsics_decoder.decode() + + # Lookup result of extrinsic + extrinsic_success = extrinsic_success_idx.get(extrinsic_idx, False) + + if extrinsics_decoder.era: + era = extrinsics_decoder.era.raw_value + else: + era = None + + model = Extrinsic( + block_id=block_id, + extrinsic_idx=extrinsic_idx, + extrinsic_hash=extrinsics_decoder.extrinsic_hash, + extrinsic_length=extrinsic_data.get('extrinsic_length'), + extrinsic_version=extrinsic_data.get('version_info'), + signed=extrinsics_decoder.contains_transaction, + unsigned=not extrinsics_decoder.contains_transaction, + signedby_address=bool(extrinsics_decoder.contains_transaction and extrinsic_data.get('account_id')), + signedby_index=bool(extrinsics_decoder.contains_transaction and extrinsic_data.get('account_index')), + address_length=extrinsic_data.get('account_length'), + address=extrinsic_data.get('account_id'), + account_index=extrinsic_data.get('account_index'), + account_idx=extrinsic_data.get('account_idx'), + signature=extrinsic_data.get('signature'), + nonce=extrinsic_data.get('nonce'), + era=era, + call=extrinsic_data.get('call_code'), + module_id=extrinsic_data.get('call_module'), + call_id=extrinsic_data.get('call_function'), + params=extrinsic_data.get('params'), + spec_version_id=parent_spec_version, + success=int(extrinsic_success), + error=int(not extrinsic_success), + codec_error=False + ) + model.save(self.db_session) + + extrinsics.append(model) + + extrinsic_idx += 1 + + # Process extrinsic + if extrinsics_decoder.contains_transaction: + block.count_extrinsics_signed += 1 + + if model.signedby_address: + block.count_extrinsics_signedby_address += 1 + if model.signedby_index: + block.count_extrinsics_signedby_index += 1 + + # Add search index for signed extrinsics + search_index = SearchIndex( + index_type_id=settings.SEARCH_INDEX_SIGNED_EXTRINSIC, + block_id=block.id, + extrinsic_idx=model.extrinsic_idx, + account_id=model.address + ) + search_index.save(self.db_session) + + else: + block.count_extrinsics_unsigned += 1 + + # Process extrinsic processors + for processor_class in ProcessorRegistry().get_extrinsic_processors(model.module_id, model.call_id): + extrinsic_processor = processor_class(block, model, substrate=self.substrate) + extrinsic_processor.accumulation_hook(self.db_session) + extrinsic_processor.process_search_index(self.db_session) + + # Process event processors + for event in events: + extrinsic = None + if event.extrinsic_idx is not None: + try: + extrinsic = extrinsics[event.extrinsic_idx] + except IndexError: + extrinsic = None + + for processor_class in ProcessorRegistry().get_event_processors(event.module_id, event.event_id): + event_processor = processor_class(block, event, extrinsic, + metadata=self.metadata_store.get(block.spec_version_id), + substrate=self.substrate) + event_processor.accumulation_hook(self.db_session) + event_processor.process_search_index(self.db_session) + + # Process block processors + for processor_class in ProcessorRegistry().get_block_processors(): + block_processor = processor_class(block, substrate=self.substrate, harvester=self) + block_processor.accumulation_hook(self.db_session) + + # Debug info + if settings.DEBUG: + block.debug_info = json_block + + # ==== Save data block ================================== + + block.save(self.db_session) + + return block + + def remove_block(self, block_hash): + # Retrieve block + block = Block.query(self.db_session).filter_by(hash=block_hash).first() + + # Revert event processors + for event in Event.query(self.db_session).filter_by(block_id=block.id): + for processor_class in ProcessorRegistry().get_event_processors(event.module_id, event.event_id): + event_processor = processor_class(block, event, None) + event_processor.accumulation_revert(self.db_session) + + # Revert extrinsic processors + for extrinsic in Extrinsic.query(self.db_session).filter_by(block_id=block.id): + for processor_class in ProcessorRegistry().get_extrinsic_processors(extrinsic.module_id, extrinsic.call_id): + extrinsic_processor = processor_class(block, extrinsic) + extrinsic_processor.accumulation_revert(self.db_session) + + # Revert block processors + for processor_class in ProcessorRegistry().get_block_processors(): + block_processor = processor_class(block) + block_processor.accumulation_revert(self.db_session) + + # Delete events + for item in Event.query(self.db_session).filter_by(block_id=block.id): + self.db_session.delete(item) + # Delete extrinsics + for item in Extrinsic.query(self.db_session).filter_by(block_id=block.id): + self.db_session.delete(item) + + # Delete block + self.db_session.delete(block) + + def sequence_block(self, block, parent_block_data=None, parent_sequenced_block_data=None): + + sequenced_block = BlockTotal( + id=block.id + ) + + # Process block processors + for processor_class in ProcessorRegistry().get_block_processors(): + block_processor = processor_class(block, sequenced_block, substrate=self.substrate) + block_processor.sequencing_hook( + self.db_session, + parent_block_data, + parent_sequenced_block_data + ) + + extrinsics = Extrinsic.query(self.db_session).filter_by(block_id=block.id).order_by('extrinsic_idx') + + for extrinsic in extrinsics: + # Process extrinsic processors + for processor_class in ProcessorRegistry().get_extrinsic_processors(extrinsic.module_id, extrinsic.call_id): + extrinsic_processor = processor_class(block, extrinsic, substrate=self.substrate) + extrinsic_processor.sequencing_hook( + self.db_session, + parent_block_data, + parent_sequenced_block_data + ) + + events = Event.query(self.db_session).filter_by(block_id=block.id).order_by('event_idx') + + # Process event processors + for event in events: + extrinsic = None + if event.extrinsic_idx is not None: + try: + extrinsic = extrinsics[event.extrinsic_idx] + except IndexError: + extrinsic = None + + for processor_class in ProcessorRegistry().get_event_processors(event.module_id, event.event_id): + event_processor = processor_class(block, event, extrinsic, substrate=self.substrate) + event_processor.sequencing_hook( + self.db_session, + parent_block_data, + parent_sequenced_block_data + ) + + sequenced_block.save(self.db_session) + + return sequenced_block + + def integrity_checks(self): + + # 1. Check finalized head + substrate = SubstrateInterface(settings.SUBSTRATE_RPC_URL) + + if settings.FINALIZATION_BY_BLOCK_CONFIRMATIONS > 0: + finalized_block_hash = substrate.get_chain_head() + finalized_block_number = max( + substrate.get_block_number(finalized_block_hash) - settings.FINALIZATION_BY_BLOCK_CONFIRMATIONS, 0 + ) + else: + finalized_block_hash = substrate.get_chain_finalised_head() + finalized_block_number = substrate.get_block_number(finalized_block_hash) + + # 2. Check integrity head + integrity_head = Status.get_status(self.db_session, 'INTEGRITY_HEAD') + + if not integrity_head.value: + # Only continue if block #1 exists + if Block.query(self.db_session).filter_by(id=1).count() == 0: + raise BlockIntegrityError('Chain not at genesis') + + integrity_head.value = 0 + else: + integrity_head.value = int(integrity_head.value) + + start_block_id = max(integrity_head.value - 1, 0) + end_block_id = finalized_block_number + chunk_size = 1000 + parent_block = None + + if start_block_id < end_block_id: + # Continue integrity check + + # print('== Start integrity checks from {} to {} =='.format(start_block_id, end_block_id)) + + for block_nr in range(start_block_id, end_block_id, chunk_size): + # TODO replace limit with filter_by block range + block_range = Block.query(self.db_session).order_by('id')[block_nr:block_nr + chunk_size] + for block in block_range: + if parent_block: + if block.id != parent_block.id + 1: + + # Save integrity head if block hash of parent matches with hash in node + if parent_block.hash == substrate.get_block_hash(integrity_head.value): + integrity_head.save(self.db_session) + self.db_session.commit() + + raise BlockIntegrityError('Block #{} is missing.. stopping check '.format(parent_block.id + 1)) + elif block.parent_hash != parent_block.hash: + + self.process_reorg_block(parent_block) + self.process_reorg_block(block) + + self.remove_block(block.hash) + self.remove_block(parent_block.hash) + self.db_session.commit() + + self.add_block(substrate.get_block_hash(block.id)) + self.add_block(substrate.get_block_hash(parent_block.id)) + self.db_session.commit() + + integrity_head.value = parent_block.id - 1 + + # Save integrity head if block hash of parent matches with hash in node + #if parent_block.parent_hash == substrate.get_block_hash(integrity_head.value): + integrity_head.save(self.db_session) + self.db_session.commit() + + raise BlockIntegrityError('Block #{} failed integrity checks, Re-adding #{}.. '.format(parent_block.id, block.id)) + else: + integrity_head.value = block.id + + parent_block = block + + if block.id == end_block_id: + break + + if parent_block: + if parent_block.hash == substrate.get_block_hash(int(integrity_head.value)): + integrity_head.save(self.db_session) + self.db_session.commit() + + return {'integrity_head': integrity_head.value} + + def start_sequencer(self): + integrity_status = self.integrity_checks() + self.db_session.commit() + + block_nr = None + + integrity_head = Status.get_status(self.db_session, 'INTEGRITY_HEAD') + + if not integrity_head.value: + integrity_head.value = 0 + + # 3. Check sequence head + sequencer_head = self.db_session.query(func.max(BlockTotal.id)).one()[0] + + if sequencer_head is None: + sequencer_head = -1 + + # Start sequencing process + + sequencer_parent_block = BlockTotal.query(self.db_session).filter_by(id=sequencer_head).first() + parent_block = Block.query(self.db_session).filter_by(id=sequencer_head).first() + + for block_nr in range(sequencer_head + 1, int(integrity_head.value) + 1): + + if block_nr == 0: + # No block ever sequenced, check if chain is at genesis state + assert (not sequencer_parent_block) + + block = Block.query(self.db_session).order_by('id').first() + + if not block: + self.db_session.commit() + return {'error': 'Chain not at genesis'} + + if block.id == 1: + # Add genesis block + block = self.add_block(block.parent_hash) + + if block.id != 0: + self.db_session.commit() + return {'error': 'Chain not at genesis'} + + self.process_genesis(block) + + sequencer_parent_block_data = None + parent_block_data = None + else: + block_id = sequencer_parent_block.id + 1 + + assert (block_id == block_nr) + + block = Block.query(self.db_session).get(block_nr) + + if not block: + self.db_session.commit() + return {'result': 'Finished at #{}'.format(sequencer_parent_block.id)} + + sequencer_parent_block_data = sequencer_parent_block.asdict() + parent_block_data = parent_block.asdict() + + sequenced_block = self.sequence_block(block, parent_block_data, sequencer_parent_block_data) + self.db_session.commit() + + parent_block = block + sequencer_parent_block = sequenced_block + + if block_nr: + return {'result': 'Finished at #{}'.format(block_nr)} + else: + return {'result': 'Nothing to sequence'} + + def process_reorg_block(self, block): + + # Check if reorg already exists + if ReorgBlock.query(self.db_session).filter_by(hash=block.hash).count() == 0: + + model = ReorgBlock(**block.asdict()) + model.save(self.db_session) + + for extrinsic in Extrinsic.query(self.db_session).filter_by(block_id=block.id): + model = ReorgExtrinsic(block_hash=block.hash, **extrinsic.asdict()) + model.save(self.db_session) + + for event in Event.query(self.db_session).filter_by(block_id=block.id): + model = ReorgEvent(block_hash=block.hash, **event.asdict()) + model.save(self.db_session) + + for log in Log.query(self.db_session).filter_by(block_id=block.id): + model = ReorgLog(block_hash=block.hash, **log.asdict()) + model.save(self.db_session) + + def rebuild_search_index(self): + + self.db_session.execute('truncate table {}'.format(SearchIndex.__tablename__)) + + for block in Block.query(self.db_session).order_by('id').yield_per(1000): + + extrinsic_lookup = {} + block._accounts_new = [] + block._accounts_reaped = [] + + for extrinsic in Extrinsic.query(self.db_session).filter_by(block_id=block.id).order_by('extrinsic_idx'): + extrinsic_lookup[extrinsic.extrinsic_idx] = extrinsic + + # Add search index for signed extrinsics + if extrinsic.address: + search_index = SearchIndex( + index_type_id=settings.SEARCH_INDEX_SIGNED_EXTRINSIC, + block_id=block.id, + extrinsic_idx=extrinsic.extrinsic_idx, + account_id=extrinsic.address + ) + search_index.save(self.db_session) + + # Process extrinsic processors + for processor_class in ProcessorRegistry().get_extrinsic_processors(extrinsic.module_id, extrinsic.call_id): + extrinsic_processor = processor_class(block=block, extrinsic=extrinsic, substrate=self.substrate) + extrinsic_processor.process_search_index(self.db_session) + + for event in Event.query(self.db_session).filter_by(block_id=block.id).order_by('event_idx'): + extrinsic = None + if event.extrinsic_idx is not None: + try: + extrinsic = extrinsic_lookup[event.extrinsic_idx] + except (IndexError, KeyError): + extrinsic = None + + for processor_class in ProcessorRegistry().get_event_processors(event.module_id, event.event_id): + event_processor = processor_class(block, event, extrinsic, + metadata=self.metadata_store.get(block.spec_version_id), + substrate=self.substrate) + event_processor.process_search_index(self.db_session) + + self.db_session.commit() + + def create_full_balance_snaphot(self, block_id): + + block_hash = self.substrate.get_block_hash(block_id) + + # Determine if keys have Blake2_128Concat format so AccountId is stored in storage key + storage_method = self.substrate.get_metadata_storage_function( + module_name="System", + storage_name="Account", + block_hash=block_hash + ) + + if storage_method: + if storage_method.get("type_hasher_key1") == "Blake2_128Concat": + + # get balances storage prefix + storage_key_prefix = self.substrate.generate_storage_hash( + storage_module='System', + storage_function='Account', + metadata_version=settings.SUBSTRATE_METADATA_VERSION + ) + + rpc_result = self.substrate.rpc_request( + 'state_getKeys', + [storage_key_prefix, block_hash] + ).get('result') + # Extract accounts from storage key + accounts = [storage_key[-64:] for storage_key in rpc_result if len(storage_key) == 162] + else: + # Retrieve accounts from database for legacy blocks + accounts = [account[0] for account in self.db_session.query(distinct(Account.id))] + + for account_id in accounts: + + self.create_balance_snapshot(block_id=block_id, account_id=account_id, block_hash=block_hash) + + def create_balance_snapshot(self, block_id, account_id, block_hash=None): + + if not block_hash: + block_hash = self.substrate.get_block_hash(block_id) + + # Get balance for account + try: + account_info_data = self.substrate.get_runtime_state( + module='System', + storage_function='Account', + params=['0x{}'.format(account_id)], + block_hash=block_hash + ).get('result') + + # Make sure no rows inserted before processing this record + AccountInfoSnapshot.query(self.db_session).filter_by(block_id=block_id, account_id=account_id).delete() + + if account_info_data: + account_info_obj = AccountInfoSnapshot( + block_id=block_id, + account_id=account_id, + account_info=account_info_data, + balance_free=account_info_data["data"]["free"], + balance_reserved=account_info_data["data"]["reserved"], + balance_total=account_info_data["data"]["free"] + account_info_data["data"]["reserved"], + nonce=account_info_data["nonce"] + ) + else: + account_info_obj = AccountInfoSnapshot( + block_id=block_id, + account_id=account_id, + account_info=None, + balance_free=None, + balance_reserved=None, + balance_total=None, + nonce=None + ) + + account_info_obj.save(self.db_session) + except ValueError: + pass + + def update_account_balances(self): + # set balances according to most recent snapshot + account_info = self.db_session.execute(""" + select + a.account_id, + a.balance_total, + a.balance_free, + a.balance_reserved, + a.nonce + from + data_account_info_snapshot as a + inner join ( + select + account_id, max(block_id) as max_block_id + from data_account_info_snapshot + group by account_id + ) as b + on a.account_id = b.account_id and a.block_id = b.max_block_id + """) + + for account_id, balance_total, balance_free, balance_reserved, nonce in account_info: + Account.query(self.db_session).filter_by(id=account_id).update( + { + Account.balance_total: balance_total, + Account.balance_free: balance_free, + Account.balance_reserved: balance_reserved, + Account.nonce: nonce, + }, synchronize_session='fetch' + ) + + + + + + + + + + + + diff --git a/pm-harvester/app/processors/event.py b/pm-harvester/app/processors/event.py new file mode 100644 index 00000000..dc81a2db --- /dev/null +++ b/pm-harvester/app/processors/event.py @@ -0,0 +1,1374 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2019 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# event.py +# +from packaging import version + +from app import settings +from app.models.data import Contract, Session, AccountAudit, \ + AccountIndexAudit, SessionTotal, SessionValidator, RuntimeStorage, \ + SessionNominator, IdentityAudit, IdentityJudgementAudit, Account +from app.processors.base import EventProcessor +from app.settings import ACCOUNT_AUDIT_TYPE_NEW, ACCOUNT_AUDIT_TYPE_REAPED, ACCOUNT_INDEX_AUDIT_TYPE_NEW, \ + ACCOUNT_INDEX_AUDIT_TYPE_REAPED, LEGACY_SESSION_VALIDATOR_LOOKUP, SEARCH_INDEX_SLASHED_ACCOUNT, \ + SEARCH_INDEX_BALANCETRANSFER, SEARCH_INDEX_HEARTBEATRECEIVED, SUBSTRATE_METADATA_VERSION, \ + IDENTITY_TYPE_SET, IDENTITY_TYPE_CLEARED, IDENTITY_TYPE_KILLED, \ + IDENTITY_JUDGEMENT_TYPE_GIVEN + +from scalecodec.exceptions import RemainingScaleBytesNotEmptyException +from substrateinterface import SubstrateInterface, StorageFunctionNotFound + + +class NewSessionEventProcessor(EventProcessor): + + module_id = 'session' + event_id = 'NewSession' + + def add_session(self, db_session, session_id): + + nominators = [] + + # Retrieve current era + try: + current_era = self.substrate.get_runtime_state( + module="Staking", + storage_function="CurrentEra", + params=[], + block_hash=self.block.hash + ).get('result') + except StorageFunctionNotFound: + current_era = None + + # Retrieve validators for new session from storage + try: + validators = self.substrate.get_runtime_state( + module="Session", + storage_function="Validators", + params=[], + block_hash=self.block.hash + ).get('result', []) + except StorageFunctionNotFound: + validators = [] + + for rank_nr, validator_account in enumerate(validators): + validator_ledger = {} + validator_session = None + + validator_stash = validator_account.replace('0x', '') + + # Retrieve controller account + try: + validator_controller = self.substrate.get_runtime_state( + module="Staking", + storage_function="Bonded", + params=[validator_account], + block_hash=self.block.hash + ).get('result') + + if validator_controller: + validator_controller = validator_controller.replace('0x', '') + except StorageFunctionNotFound: + validator_controller = None + + # Retrieve validator preferences for stash account + try: + validator_prefs = self.substrate.get_runtime_state( + module="Staking", + storage_function="ErasValidatorPrefs", + params=[current_era, validator_account], + block_hash=self.block.hash + ).get('result') + except StorageFunctionNotFound: + validator_prefs = None + + if not validator_prefs: + validator_prefs = {'commission': None} + + # Retrieve bonded + try: + exposure = self.substrate.get_runtime_state( + module="Staking", + storage_function="ErasStakers", + params=[current_era, validator_account], + block_hash=self.block.hash + ).get('result') + except StorageFunctionNotFound: + exposure = None + + if not exposure: + exposure = {} + + if exposure.get('total'): + bonded_nominators = exposure.get('total') - exposure.get('own') + else: + bonded_nominators = None + + session_validator = SessionValidator( + session_id=session_id, + validator_controller=validator_controller, + validator_stash=validator_stash, + bonded_total=exposure.get('total'), + bonded_active=validator_ledger.get('active'), + bonded_own=exposure.get('own'), + bonded_nominators=bonded_nominators, + validator_session=validator_session, + rank_validator=rank_nr, + unlocking=validator_ledger.get('unlocking'), + count_nominators=len(exposure.get('others', [])), + unstake_threshold=None, + commission=validator_prefs.get('commission') + ) + + session_validator.save(db_session) + + # Store nominators + for rank_nominator, nominator_info in enumerate(exposure.get('others', [])): + nominator_stash = nominator_info.get('who').replace('0x', '') + nominators.append(nominator_stash) + + session_nominator = SessionNominator( + session_id=session_id, + rank_validator=rank_nr, + rank_nominator=rank_nominator, + nominator_stash=nominator_stash, + bonded=nominator_info.get('value'), + ) + + session_nominator.save(db_session) + + # Store session + session = Session( + id=session_id, + start_at_block=self.block.id + 1, + created_at_block=self.block.id, + created_at_extrinsic=self.event.extrinsic_idx, + created_at_event=self.event.event_idx, + count_validators=len(validators), + count_nominators=len(set(nominators)), + era=current_era + ) + + session.save(db_session) + + # Retrieve previous session to calculate count_blocks + prev_session = Session.query(db_session).filter_by(id=session_id - 1).first() + + if prev_session: + count_blocks = self.block.id - prev_session.start_at_block + 1 + else: + count_blocks = self.block.id + + session_total = SessionTotal( + id=session_id - 1, + end_at_block=self.block.id, + count_blocks=count_blocks + ) + + session_total.save(db_session) + + # Update validator flags + validator_ids = [v.replace('0x', '') for v in validators] + + Account.query(db_session).filter( + Account.id.in_(validator_ids), Account.was_validator == False + ).update({Account.was_validator: True}, synchronize_session='fetch') + + Account.query(db_session).filter( + Account.id.notin_(validator_ids), Account.is_validator == True + ).update({Account.is_validator: False}, synchronize_session='fetch') + + Account.query(db_session).filter( + Account.id.in_(validator_ids), Account.is_validator == False + ).update({Account.is_validator: True}, synchronize_session='fetch') + + # Update nominator flags + Account.query(db_session).filter( + Account.id.in_(nominators), Account.was_nominator == False + ).update({Account.was_nominator: True}, synchronize_session='fetch') + + Account.query(db_session).filter( + Account.id.notin_(nominators), Account.is_nominator == True + ).update({Account.is_nominator: False}, synchronize_session='fetch') + + Account.query(db_session).filter( + Account.id.in_(nominators), Account.is_nominator == False + ).update({Account.is_nominator: True}, synchronize_session='fetch') + + def add_session_old(self, db_session, session_id): + current_era = None + validators = [] + nominators = [] + validation_session_lookup = {} + + substrate = SubstrateInterface(settings.SUBSTRATE_RPC_URL) + + # Retrieve current era + storage_call = RuntimeStorage.query(db_session).filter_by( + module_id='staking', + name='CurrentEra', + spec_version=self.block.spec_version_id + ).first() + + if storage_call: + try: + current_era = substrate.get_storage( + block_hash=self.block.hash, + module="Staking", + function="CurrentEra", + return_scale_type=storage_call.get_return_type(), + hasher=storage_call.type_hasher, + metadata_version=SUBSTRATE_METADATA_VERSION + ) + except RemainingScaleBytesNotEmptyException: + pass + + # Retrieve validators for new session from storage + + storage_call = RuntimeStorage.query(db_session).filter_by( + module_id='session', + name='Validators', + spec_version=self.block.spec_version_id + ).first() + + if storage_call: + try: + validators = substrate.get_storage( + block_hash=self.block.hash, + module="Session", + function="Validators", + return_scale_type=storage_call.get_return_type(), + hasher=storage_call.type_hasher, + metadata_version=SUBSTRATE_METADATA_VERSION + ) or [] + except RemainingScaleBytesNotEmptyException: + pass + + # Retrieve all sessions in one call + if not LEGACY_SESSION_VALIDATOR_LOOKUP: + + # Retrieve session account + # TODO move to network specific data types + storage_call = RuntimeStorage.query(db_session).filter_by( + module_id='session', + name='QueuedKeys', + spec_version=self.block.spec_version_id + ).first() + + if storage_call: + try: + validator_session_list = substrate.get_storage( + block_hash=self.block.hash, + module="Session", + function="QueuedKeys", + return_scale_type=storage_call.get_return_type(), + hasher=storage_call.type_hasher, + metadata_version=SUBSTRATE_METADATA_VERSION + ) or [] + except RemainingScaleBytesNotEmptyException: + + try: + validator_session_list = substrate.get_storage( + block_hash=self.block.hash, + module="Session", + function="QueuedKeys", + return_scale_type='Vec<(ValidatorId, LegacyKeys)>', + hasher=storage_call.type_hasher, + metadata_version=SUBSTRATE_METADATA_VERSION + ) or [] + except RemainingScaleBytesNotEmptyException: + validator_session_list = substrate.get_storage( + block_hash=self.block.hash, + module="Session", + function="QueuedKeys", + return_scale_type='Vec<(ValidatorId, EdgewareKeys)>', + hasher=storage_call.type_hasher, + metadata_version=SUBSTRATE_METADATA_VERSION + ) or [] + + # build lookup dict + validation_session_lookup = {} + for validator_session_item in validator_session_list: + session_key = '' + + if validator_session_item['keys'].get('grandpa'): + session_key = validator_session_item['keys'].get('grandpa') + + if validator_session_item['keys'].get('ed25519'): + session_key = validator_session_item['keys'].get('ed25519') + + validation_session_lookup[ + validator_session_item['validator'].replace('0x', '')] = session_key.replace('0x', '') + + for rank_nr, validator_account in enumerate(validators): + validator_stash = None + validator_controller = None + validator_ledger = {} + validator_prefs = {} + validator_session = '' + exposure = {} + + if not LEGACY_SESSION_VALIDATOR_LOOKUP: + validator_stash = validator_account.replace('0x', '') + + # Retrieve stash account + storage_call = RuntimeStorage.query(db_session).filter_by( + module_id='staking', + name='Bonded', + spec_version=self.block.spec_version_id + ).first() + + if storage_call: + try: + validator_controller = substrate.get_storage( + block_hash=self.block.hash, + module="Staking", + function="Bonded", + params=validator_stash, + return_scale_type=storage_call.get_return_type(), + hasher=storage_call.type_hasher, + metadata_version=SUBSTRATE_METADATA_VERSION + ) or '' + + validator_controller = validator_controller.replace('0x', '') + + except RemainingScaleBytesNotEmptyException: + pass + + # Retrieve session account + validator_session = validation_session_lookup.get(validator_stash) + + else: + validator_controller = validator_account.replace('0x', '') + + # Retrieve stash account + storage_call = RuntimeStorage.query(db_session).filter_by( + module_id='staking', + name='Ledger', + spec_version=self.block.spec_version_id + ).first() + + if storage_call: + try: + validator_ledger = substrate.get_storage( + block_hash=self.block.hash, + module="Staking", + function="Ledger", + params=validator_controller, + return_scale_type=storage_call.get_return_type(), + hasher=storage_call.type_hasher, + metadata_version=SUBSTRATE_METADATA_VERSION + ) or {} + + validator_stash = validator_ledger.get('stash', '').replace('0x', '') + + except RemainingScaleBytesNotEmptyException: + pass + + # Retrieve session account + storage_call = RuntimeStorage.query(db_session).filter_by( + module_id='session', + name='NextKeyFor', + spec_version=self.block.spec_version_id + ).first() + + if storage_call: + try: + validator_session = substrate.get_storage( + block_hash=self.block.hash, + module="Session", + function="NextKeyFor", + params=validator_controller, + return_scale_type=storage_call.get_return_type(), + hasher=storage_call.type_hasher, + metadata_version=SUBSTRATE_METADATA_VERSION + ) or '' + except RemainingScaleBytesNotEmptyException: + pass + + validator_session = validator_session.replace('0x', '') + + # Retrieve validator preferences for stash account + storage_call = RuntimeStorage.query(db_session).filter_by( + module_id='staking', + name='Validators', + spec_version=self.block.spec_version_id + ).first() + + if storage_call: + try: + validator_prefs = substrate.get_storage( + block_hash=self.block.hash, + module="Staking", + function="Validators", + params=validator_stash, + return_scale_type=storage_call.get_return_type(), + hasher=storage_call.type_hasher, + metadata_version=SUBSTRATE_METADATA_VERSION + ) or {'col1': {}, 'col2': {}} + except RemainingScaleBytesNotEmptyException: + pass + + # Retrieve nominators + storage_call = RuntimeStorage.query(db_session).filter_by( + module_id='staking', + name='Stakers', + spec_version=self.block.spec_version_id + ).first() + + if storage_call: + try: + exposure = substrate.get_storage( + block_hash=self.block.hash, + module="Staking", + function="Stakers", + params=validator_stash, + return_scale_type=storage_call.get_return_type(), + hasher=storage_call.type_hasher, + metadata_version=SUBSTRATE_METADATA_VERSION + ) or {} + except RemainingScaleBytesNotEmptyException: + pass + + if exposure.get('total'): + bonded_nominators = exposure.get('total') - exposure.get('own') + else: + bonded_nominators = None + + session_validator = SessionValidator( + session_id=session_id, + validator_controller=validator_controller, + validator_stash=validator_stash, + bonded_total=exposure.get('total'), + bonded_active=validator_ledger.get('active'), + bonded_own=exposure.get('own'), + bonded_nominators=bonded_nominators, + validator_session=validator_session, + rank_validator=rank_nr, + unlocking=validator_ledger.get('unlocking'), + count_nominators=len(exposure.get('others', [])), + unstake_threshold=validator_prefs.get('col1', {}).get('unstakeThreshold'), + commission=validator_prefs.get('col1', {}).get('validatorPayment') + ) + + session_validator.save(db_session) + + # Store nominators + for rank_nominator, nominator_info in enumerate(exposure.get('others', [])): + nominator_stash = nominator_info.get('who').replace('0x', '') + nominators.append(nominator_stash) + + session_nominator = SessionNominator( + session_id=session_id, + rank_validator=rank_nr, + rank_nominator=rank_nominator, + nominator_stash=nominator_stash, + bonded=nominator_info.get('value'), + ) + + session_nominator.save(db_session) + + # Store session + session = Session( + id=session_id, + start_at_block=self.block.id + 1, + created_at_block=self.block.id, + created_at_extrinsic=self.event.extrinsic_idx, + created_at_event=self.event.event_idx, + count_validators=len(validators), + count_nominators=len(set(nominators)), + era=current_era + ) + + session.save(db_session) + + # Retrieve previous session to calculate count_blocks + prev_session = Session.query(db_session).filter_by(id=session_id - 1).first() + + if prev_session: + count_blocks = self.block.id - prev_session.start_at_block + 1 + else: + count_blocks = self.block.id + + session_total = SessionTotal( + id=session_id - 1, + end_at_block=self.block.id, + count_blocks=count_blocks + ) + + session_total.save(db_session) + + # Update validator flags + validator_ids = [v.replace('0x', '') for v in validators] + + Account.query(db_session).filter( + Account.id.in_(validator_ids), Account.was_validator == False + ).update({Account.was_validator: True}, synchronize_session='fetch') + + Account.query(db_session).filter( + Account.id.notin_(validator_ids), Account.is_validator == True + ).update({Account.is_validator: False}, synchronize_session='fetch') + + Account.query(db_session).filter( + Account.id.in_(validator_ids), Account.is_validator == False + ).update({Account.is_validator: True}, synchronize_session='fetch') + + # Update nominator flags + Account.query(db_session).filter( + Account.id.in_(nominators), Account.was_nominator == False + ).update({Account.was_nominator: True}, synchronize_session='fetch') + + Account.query(db_session).filter( + Account.id.notin_(nominators), Account.is_nominator == True + ).update({Account.is_nominator: False}, synchronize_session='fetch') + + Account.query(db_session).filter( + Account.id.in_(nominators), Account.is_nominator == False + ).update({Account.is_nominator: True}, synchronize_session='fetch') + + def accumulation_hook(self, db_session): + self.block.count_sessions_new += 1 + + def sequencing_hook(self, db_session, parent_block_data, parent_sequenced_block_data): + session_id = self.event.attributes[0]['value'] + + if settings.get_versioned_setting('NEW_SESSION_EVENT_HANDLER', self.block.spec_version_id): + self.add_session(db_session, session_id) + else: + self.add_session_old(db_session, session_id) + + def process_search_index(self, db_session): + try: + validators = self.substrate.get_runtime_state( + module="Session", + storage_function="Validators", + params=[], + block_hash=self.block.hash + ).get('result', []) + + # Add search indices for validators sessions + for account_id in validators: + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_STAKING_SESSION, + account_id=account_id.replace('0x', '') + ) + + search_index.save(db_session) + except ValueError: + pass + + +class NewAccountEventProcessor(EventProcessor): + + module_id = 'balances' + event_id = 'NewAccount' + + def accumulation_hook(self, db_session): + + # Check event requirements + if len(self.event.attributes) == 2 and \ + self.event.attributes[0]['type'] == 'AccountId' and self.event.attributes[1]['type'] == 'Balance': + + account_id = self.event.attributes[0]['value'].replace('0x', '') + balance = self.event.attributes[1]['value'] + + self.block._accounts_new.append(account_id) + + account_audit = AccountAudit( + account_id=account_id, + block_id=self.event.block_id, + extrinsic_idx=self.event.extrinsic_idx, + event_idx=self.event.event_idx, + type_id=ACCOUNT_AUDIT_TYPE_NEW + ) + + account_audit.save(db_session) + + def accumulation_revert(self, db_session): + for item in AccountAudit.query(db_session).filter_by(block_id=self.block.id): + db_session.delete(item) + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_ACCOUNT_CREATED, + account_id=self.event.attributes[0]['value'].replace('0x', '') + ) + + search_index.save(db_session) + + +class SystemNewAccountEventProcessor(EventProcessor): + + module_id = 'system' + event_id = 'NewAccount' + + def accumulation_hook(self, db_session): + + # Check event requirements + if len(self.event.attributes) == 1 and \ + self.event.attributes[0]['type'] == 'AccountId': + + account_id = self.event.attributes[0]['value'].replace('0x', '') + + self.block._accounts_new.append(account_id) + + account_audit = AccountAudit( + account_id=account_id, + block_id=self.event.block_id, + extrinsic_idx=self.event.extrinsic_idx, + event_idx=self.event.event_idx, + type_id=ACCOUNT_AUDIT_TYPE_NEW + ) + + account_audit.save(db_session) + + def accumulation_revert(self, db_session): + for item in AccountAudit.query(db_session).filter_by(block_id=self.block.id): + db_session.delete(item) + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_ACCOUNT_CREATED, + account_id=self.event.attributes[0]['value'].replace('0x', '') + ) + + search_index.save(db_session) + + +class ReapedAccount(EventProcessor): + module_id = 'balances' + event_id = 'ReapedAccount' + + def accumulation_hook(self, db_session): + # Check event requirements + if len(self.event.attributes) == 1 and \ + self.event.attributes[0]['type'] == 'AccountId': + + account_id = self.event.attributes[0]['value'].replace('0x', '') + + elif len(self.event.attributes) == 2 and \ + self.event.attributes[0]['type'] == 'AccountId' and \ + self.event.attributes[1]['type'] == 'Balance': + + account_id = self.event.attributes[0]['value'].replace('0x', '') + else: + raise ValueError('Event doensn\'t meet requirements') + + self.block._accounts_reaped.append(account_id) + + account_audit = AccountAudit( + account_id=account_id, + block_id=self.event.block_id, + extrinsic_idx=self.event.extrinsic_idx, + event_idx=self.event.event_idx, + type_id=ACCOUNT_AUDIT_TYPE_REAPED + ) + + account_audit.save(db_session) + + # Insert account index audit record + + new_account_index_audit = AccountIndexAudit( + account_index_id=None, + account_id=account_id, + block_id=self.event.block_id, + extrinsic_idx=self.event.extrinsic_idx, + event_idx=self.event.event_idx, + type_id=ACCOUNT_INDEX_AUDIT_TYPE_REAPED + ) + + new_account_index_audit.save(db_session) + + def accumulation_revert(self, db_session): + + for item in AccountIndexAudit.query(db_session).filter_by(block_id=self.block.id): + db_session.delete(item) + + for item in AccountAudit.query(db_session).filter_by(block_id=self.block.id): + db_session.delete(item) + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_ACCOUNT_KILLED, + account_id=self.event.attributes[0]['value'].replace('0x', '') + ) + + search_index.save(db_session) + + +class KilledAccount(EventProcessor): + module_id = 'system' + event_id = 'KilledAccount' + + def accumulation_hook(self, db_session): + # Check event requirements + if len(self.event.attributes) == 1 and \ + self.event.attributes[0]['type'] == 'AccountId': + + account_id = self.event.attributes[0]['value'].replace('0x', '') + else: + raise ValueError('Event doensn\'t meet requirements') + + self.block._accounts_reaped.append(account_id) + + account_audit = AccountAudit( + account_id=account_id, + block_id=self.event.block_id, + extrinsic_idx=self.event.extrinsic_idx, + event_idx=self.event.event_idx, + type_id=ACCOUNT_AUDIT_TYPE_REAPED + ) + + account_audit.save(db_session) + + def accumulation_revert(self, db_session): + + for item in AccountAudit.query(db_session).filter_by(block_id=self.block.id): + db_session.delete(item) + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_ACCOUNT_KILLED, + account_id=self.event.attributes[0]['value'].replace('0x', '') + ) + + search_index.save(db_session) + + +class NewAccountIndexEventProcessor(EventProcessor): + + module_id = 'indices' + event_id = 'NewAccountIndex' + + def accumulation_hook(self, db_session): + + account_id = self.event.attributes[0]['value'].replace('0x', '') + id = self.event.attributes[1]['value'] + + account_index_audit = AccountIndexAudit( + account_index_id=id, + account_id=account_id, + block_id=self.event.block_id, + extrinsic_idx=self.event.extrinsic_idx, + event_idx=self.event.event_idx, + type_id=ACCOUNT_INDEX_AUDIT_TYPE_NEW + ) + + account_index_audit.save(db_session) + + def accumulation_revert(self, db_session): + for item in AccountIndexAudit.query(db_session).filter_by(block_id=self.block.id): + db_session.delete(item) + + +class IndexAssignedEventProcessor(EventProcessor): + + module_id = 'indices' + event_id = 'IndexAssigned' + + def accumulation_hook(self, db_session): + + account_id = self.event.attributes[0]['value'].replace('0x', '') + id = self.event.attributes[1]['value'] + + account_index_audit = AccountIndexAudit( + account_index_id=id, + account_id=account_id, + block_id=self.event.block_id, + extrinsic_idx=self.event.extrinsic_idx, + event_idx=self.event.event_idx, + type_id=ACCOUNT_INDEX_AUDIT_TYPE_NEW + ) + + account_index_audit.save(db_session) + + def accumulation_revert(self, db_session): + for item in AccountIndexAudit.query(db_session).filter_by(block_id=self.block.id): + db_session.delete(item) + + +class IndexFreedEventProcessor(EventProcessor): + + module_id = 'indices' + event_id = 'IndexFreed' + + def accumulation_hook(self, db_session): + + account_index = self.event.attributes[0]['value'] + + new_account_index_audit = AccountIndexAudit( + account_index_id=account_index, + account_id=None, + block_id=self.event.block_id, + extrinsic_idx=self.event.extrinsic_idx, + event_idx=self.event.event_idx, + type_id=ACCOUNT_INDEX_AUDIT_TYPE_REAPED + ) + + new_account_index_audit.save(db_session) + + def accumulation_revert(self, db_session): + for item in AccountIndexAudit.query(db_session).filter_by(block_id=self.block.id): + db_session.delete(item) + + +class ProposedEventProcessor(EventProcessor): + + module_id = 'democracy' + event_id = 'Proposed' + + def process_search_index(self, db_session): + + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_DEMOCRACY_PROPOSE, + account_id=self.extrinsic.address, + sorting_value=self.extrinsic.params[1]['value'] + ) + + search_index.save(db_session) + + +class TechCommProposedEventProcessor(EventProcessor): + + module_id = 'technicalcommittee' + event_id = 'Proposed' + + def process_search_index(self, db_session): + + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_TECHCOMM_PROPOSED, + account_id=self.extrinsic.address + ) + + search_index.save(db_session) + + +class TechCommVotedEventProcessor(EventProcessor): + + module_id = 'technicalcommittee' + event_id = 'Voted' + + def process_search_index(self, db_session): + + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_TECHCOMM_VOTED, + account_id=self.extrinsic.address + ) + + search_index.save(db_session) + + +class TreasuryAwardedEventProcessor(EventProcessor): + + module_id = 'treasury' + event_id = 'Awarded' + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_TREASURY_AWARDED, + account_id=self.event.attributes[2]['value'].replace('0x', ''), + sorting_value=self.event.attributes[1]['value'] + ) + + search_index.save(db_session) + + +class CodeStoredEventProcessor(EventProcessor): + + module_id = 'contract' + event_id = 'CodeStored' + + def accumulation_hook(self, db_session): + + self.block.count_contracts_new += 1 + + contract = Contract( + code_hash=self.event.attributes[0]['value'].replace('0x', ''), + created_at_block=self.event.block_id, + created_at_extrinsic=self.event.extrinsic_idx, + created_at_event=self.event.event_idx, + ) + + for param in self.extrinsic.params: + if param.get('name') == 'code': + contract.bytecode = param.get('value') + + contract.save(db_session) + + def accumulation_revert(self, db_session): + for item in Contract.query(db_session).filter_by(created_at_block=self.block.id): + db_session.delete(item) + + +class SlashEventProcessor(EventProcessor): + + module_id = 'staking' + event_id = 'Slash' + + def process_search_index(self, db_session): + + search_index = self.add_search_index( + index_type_id=SEARCH_INDEX_SLASHED_ACCOUNT, + account_id=self.event.attributes[0]['value'].replace('0x', ''), + sorting_value=self.event.attributes[1]['value'] + ) + + search_index.save(db_session) + + +class BalancesTransferProcessor(EventProcessor): + module_id = 'balances' + event_id = 'Transfer' + + def process_search_index(self, db_session): + # VV - POLYMESH customization - Index are changed as Polymath has more arguments in the Transfer event + search_index = self.add_search_index( + index_type_id=SEARCH_INDEX_BALANCETRANSFER, + account_id=self.event.attributes[1]['value'].replace('0x', ''), + sorting_value=self.event.attributes[4]['value'] + ) + + search_index.save(db_session) + + # VV - POLYMESH customization - Index are changed as Polymath has more arguments in the Transfer event + search_index = self.add_search_index( + index_type_id=SEARCH_INDEX_BALANCETRANSFER, + account_id=self.event.attributes[3]['value'].replace('0x', ''), + sorting_value=self.event.attributes[4]['value'] + ) + + search_index.save(db_session) + + +class BalancesDeposit(EventProcessor): + module_id = 'balances' + event_id = 'Deposit' + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_BALANCES_DEPOSIT, + account_id=self.event.attributes[0]['value'].replace('0x', ''), + sorting_value=self.event.attributes[1]['value'] + ) + + search_index.save(db_session) + + +class HeartbeatReceivedEventProcessor(EventProcessor): + + module_id = 'imonline' + event_id = 'HeartbeatReceived' + + def process_search_index(self, db_session): + + search_index = self.add_search_index( + index_type_id=SEARCH_INDEX_HEARTBEATRECEIVED, + account_id=self.event.attributes[0]['value'].replace('0x', ''), + sorting_value=None + ) + + search_index.save(db_session) + + +class SomeOffline(EventProcessor): + + module_id = 'imonline' + event_id = 'SomeOffline' + + def process_search_index(self, db_session): + + for item in self.event.attributes[0]['value']: + + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_IMONLINE_SOMEOFFLINE, + account_id=item['validatorId'].replace('0x', ''), + sorting_value=None + ) + + search_index.save(db_session) + + +class IdentitySetEventProcessor(EventProcessor): + + module_id = 'identity' + event_id = 'IdentitySet' + + def accumulation_hook(self, db_session): + + # Check event requirements + if len(self.event.attributes) == 1 and \ + self.event.attributes[0]['type'] == 'AccountId': + + identity_audit = IdentityAudit( + account_id=self.event.attributes[0]['value'].replace('0x', ''), + block_id=self.event.block_id, + extrinsic_idx=self.event.extrinsic_idx, + event_idx=self.event.event_idx, + type_id=IDENTITY_TYPE_SET + ) + + identity_audit.data = { + 'display': None, + 'email': None, + 'legal': None, + 'riot': None, + 'web': None, + 'twitter': None + } + + for param in self.extrinsic.params: + if param.get('name') == 'info': + identity_audit.data['display'] = param.get('value', {}).get('display', {}).get('Raw') + identity_audit.data['email'] = param.get('value', {}).get('email', {}).get('Raw') + identity_audit.data['legal'] = param.get('value', {}).get('legal', {}).get('Raw') + identity_audit.data['web'] = param.get('value', {}).get('web', {}).get('Raw') + identity_audit.data['riot'] = param.get('value', {}).get('riot', {}).get('Raw') + identity_audit.data['twitter'] = param.get('value', {}).get('twitter', {}).get('Raw') + + identity_audit.save(db_session) + + def accumulation_revert(self, db_session): + for item in IdentityAudit.query(db_session).filter_by(block_id=self.block.id): + db_session.delete(item) + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_IDENTITY_SET, + account_id=self.event.attributes[0]['value'].replace('0x', '') + ) + + search_index.save(db_session) + + +class IdentityClearedEventProcessor(EventProcessor): + + module_id = 'identity' + event_id = 'IdentityCleared' + + def accumulation_hook(self, db_session): + + # Check event requirements + if len(self.event.attributes) == 2 and \ + self.event.attributes[0]['type'] == 'AccountId' and \ + self.event.attributes[1]['type'] == 'Balance': + + identity_audit = IdentityAudit( + account_id=self.event.attributes[0]['value'].replace('0x', ''), + block_id=self.event.block_id, + extrinsic_idx=self.event.extrinsic_idx, + event_idx=self.event.event_idx, + type_id=IDENTITY_TYPE_CLEARED + ) + + identity_audit.save(db_session) + + def accumulation_revert(self, db_session): + for item in IdentityAudit.query(db_session).filter_by(block_id=self.block.id): + db_session.delete(item) + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_IDENTITY_CLEARED, + account_id=self.event.attributes[0]['value'].replace('0x', '') + ) + + search_index.save(db_session) + + +class IdentityKilledEventProcessor(EventProcessor): + + module_id = 'identity' + event_id = 'IdentityKilled' + + def accumulation_hook(self, db_session): + + # Check event requirements + if len(self.event.attributes) == 2 and \ + self.event.attributes[0]['type'] == 'AccountId' and \ + self.event.attributes[1]['type'] == 'Balance': + + identity_audit = IdentityAudit( + account_id=self.event.attributes[0]['value'].replace('0x', ''), + block_id=self.event.block_id, + extrinsic_idx=self.event.extrinsic_idx, + event_idx=self.event.event_idx, + type_id=IDENTITY_TYPE_KILLED + ) + + identity_audit.save(db_session) + + def accumulation_revert(self, db_session): + for item in IdentityAudit.query(db_session).filter_by(block_id=self.block.id): + db_session.delete(item) + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_IDENTITY_KILLED, + account_id=self.event.attributes[0]['value'].replace('0x', '') + ) + + search_index.save(db_session) + + +class IdentityJudgementGivenEventProcessor(EventProcessor): + + module_id = 'identity' + event_id = 'JudgementGiven' + + def accumulation_hook(self, db_session): + + # Check event requirements + if len(self.event.attributes) == 2 and \ + self.event.attributes[0]['type'] == 'AccountId' and \ + self.event.attributes[1]['type'] == 'RegistrarIndex': + + identity_audit = IdentityJudgementAudit( + account_id=self.event.attributes[0]['value'].replace('0x', ''), + registrar_index=self.event.attributes[1]['value'], + block_id=self.event.block_id, + extrinsic_idx=self.event.extrinsic_idx, + event_idx=self.event.event_idx, + type_id=IDENTITY_JUDGEMENT_TYPE_GIVEN + ) + + for param in self.extrinsic.params: + if param.get('name') == 'judgement': + identity_audit.data = {'judgement': list(param.get('value').keys())[0]} + + identity_audit.save(db_session) + + def accumulation_revert(self, db_session): + for item in IdentityJudgementAudit.query(db_session).filter_by(block_id=self.block.id): + db_session.delete(item) + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_IDENTITY_JUDGEMENT_GIVEN, + account_id=self.event.attributes[0]['value'].replace('0x', '') + ) + + search_index.save(db_session) + + +class IdentityJudgementRequested(EventProcessor): + module_id = 'identity' + event_id = 'JudgementRequested' + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_IDENTITY_JUDGEMENT_REQUESTED, + account_id=self.event.attributes[0]['value'].replace('0x', '') + ) + + search_index.save(db_session) + + +class IdentityJudgementUnrequested(EventProcessor): + module_id = 'identity' + event_id = 'JudgementUnrequested' + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_IDENTITY_JUDGEMENT_UNREQUESTED, + account_id=self.event.attributes[0]['value'].replace('0x', '') + ) + + search_index.save(db_session) + + +class CouncilNewTermEventProcessor(EventProcessor): + + module_id = 'electionsphragmen' + event_id = 'NewTerm' + + def sequencing_hook(self, db_session, parent_block, parent_sequenced_block): + + new_member_ids = [ + member_struct['account'].replace('0x', '') for member_struct in self.event.attributes[0]['value'] + ] + + Account.query(db_session).filter( + Account.id.in_(new_member_ids), Account.was_council_member == False + ).update({Account.was_council_member: True}, synchronize_session='fetch') + + Account.query(db_session).filter( + Account.id.notin_(new_member_ids), Account.is_council_member == True + ).update({Account.is_council_member: False}, synchronize_session='fetch') + + Account.query(db_session).filter( + Account.id.in_(new_member_ids), Account.is_council_member == False + ).update({Account.is_council_member: True}, synchronize_session='fetch') + + def process_search_index(self, db_session): + + for member_struct in self.event.attributes[0]['value']: + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_COUNCIL_MEMBER_ELECTED, + account_id=member_struct['account'].replace('0x', ''), + sorting_value=member_struct['balance'] + ) + + search_index.save(db_session) + + +class CouncilMemberKicked(EventProcessor): + + module_id = 'electionsphragmen' + event_id = 'MemberKicked' + + def process_search_index(self, db_session): + + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_COUNCIL_MEMBER_KICKED, + account_id=self.event.attributes[0]['value'].replace('0x', '') + ) + + search_index.save(db_session) + + +class CouncilMemberRenounced(EventProcessor): + + module_id = 'electionsphragmen' + event_id = 'MemberRenounced' + + def process_search_index(self, db_session): + + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_COUNCIL_CANDIDACY_RENOUNCED, + account_id=self.event.attributes[0]['value'].replace('0x', '') + ) + + search_index.save(db_session) + + +class CouncilProposedEventProcessor(EventProcessor): + + module_id = 'council' + event_id = 'Proposed' + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_COUNCIL_PROPOSED, + account_id=self.event.attributes[0]['value'].replace('0x', '') + ) + + search_index.save(db_session) + + +class CouncilVotedEventProcessor(EventProcessor): + + module_id = 'council' + event_id = 'Voted' + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_COUNCIL_VOTE, + account_id=self.event.attributes[0]['value'].replace('0x', '') + ) + + search_index.save(db_session) + + +class RegistrarAddedEventProcessor(EventProcessor): + + module_id = 'identity' + event_id = 'RegistrarAdded' + + def sequencing_hook(self, db_session, parent_block, parent_sequenced_block): + + registrars = self.substrate.get_runtime_state( + module="Identity", + storage_function="Registrars", + params=[] + ).get('result') + + if not registrars: + registrars = [] + + registrar_ids = [registrar['account'].replace('0x', '') for registrar in registrars] + + Account.query(db_session).filter( + Account.id.in_(registrar_ids), Account.was_registrar == False + ).update({Account.was_registrar: True}, synchronize_session='fetch') + + Account.query(db_session).filter( + Account.id.notin_(registrar_ids), Account.is_registrar == True + ).update({Account.is_registrar: False}, synchronize_session='fetch') + + Account.query(db_session).filter( + Account.id.in_(registrar_ids), Account.is_registrar == False + ).update({Account.is_registrar: True}, synchronize_session='fetch') + + +class StakingBonded(EventProcessor): + + module_id = 'staking' + event_id = 'Bonded' + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_STAKING_BONDED, + account_id=self.event.attributes[0]['value'].replace('0x', ''), + sorting_value=self.event.attributes[1]['value'] + ) + + search_index.save(db_session) + + +class StakingUnbonded(EventProcessor): + + module_id = 'staking' + event_id = 'Unbonded' + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_STAKING_UNBONDED, + account_id=self.event.attributes[0]['value'].replace('0x', ''), + sorting_value=self.event.attributes[1]['value'] + ) + + search_index.save(db_session) + + +class StakingWithdrawn(EventProcessor): + + module_id = 'staking' + event_id = 'Withdrawn' + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_STAKING_WITHDRAWN, + account_id=self.event.attributes[0]['value'].replace('0x', ''), + sorting_value=self.event.attributes[1]['value'] + ) + + search_index.save(db_session) + + +class ClaimsClaimed(EventProcessor): + module_id = 'claims' + event_id = 'Claimed' + + def process_search_index(self, db_session): + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_CLAIMS_CLAIMED, + account_id=self.event.attributes[0]['value'].replace('0x', ''), + sorting_value=self.event.attributes[2]['value'] + ) + + search_index.save(db_session) diff --git a/pm-harvester/app/processors/extrinsic.py b/pm-harvester/app/processors/extrinsic.py new file mode 100644 index 00000000..33fa8df2 --- /dev/null +++ b/pm-harvester/app/processors/extrinsic.py @@ -0,0 +1,340 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# extrinsic.py +# + +import dateutil.parser +import pytz + +from app import settings +from app.models.data import IdentityAudit, Account +from app.processors.base import ExtrinsicProcessor + + +class TimestampExtrinsicProcessor(ExtrinsicProcessor): + + module_id = 'timestamp' + call_id = 'set' + + def accumulation_hook(self, db_session): + + if self.extrinsic.success: + # Store block date time related fields + for param in self.extrinsic.params: + if param.get('name') == 'now': + self.block.set_datetime(dateutil.parser.parse(param.get('value')).replace(tzinfo=pytz.UTC)) + + +class DemocracyVoteExtrinsicProcessor(ExtrinsicProcessor): + + module_id = 'democracy' + call_id = 'vote' + + def process_search_index(self, db_session): + + if self.extrinsic.success: + + sorting_value = None + + # Try to retrieve balance of vote + if self.extrinsic.params[1]['type'] == 'AccountVote': + if 'Standard' in self.extrinsic.params[1]['value']: + sorting_value = self.extrinsic.params[1]['value']['Standard']['balance'] + + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_DEMOCRACY_VOTE, + account_id=self.extrinsic.address, + sorting_value=sorting_value + ) + + search_index.save(db_session) + + +class DemocracyProxyVote(ExtrinsicProcessor): + + module_id = 'democracy' + call_id = 'proxy_vote' + + def process_search_index(self, db_session): + + if self.extrinsic.success: + + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_DEMOCRACY_PROXY_VOTE, + account_id=self.extrinsic.address + ) + + search_index.save(db_session) + + +class DemocracySecond(ExtrinsicProcessor): + + module_id = 'democracy' + call_id = 'second' + + def process_search_index(self, db_session): + + if self.extrinsic.success: + + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_DEMOCRACY_SECOND, + account_id=self.extrinsic.address + ) + + search_index.save(db_session) + + +class IndentitySetSubsExtrinsicProcessor(ExtrinsicProcessor): + + module_id = 'identity' + call_id = 'set_subs' + + def process_search_index(self, db_session): + + if self.extrinsic.success: + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_IDENTITY_SET_SUBS, + account_id=self.extrinsic.address + ) + + search_index.save(db_session) + + +class StakingBond(ExtrinsicProcessor): + + module_id = 'staking' + call_id = 'bond' + + def process_search_index(self, db_session): + + if self.extrinsic.success: + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_STAKING_BONDED, + account_id=self.extrinsic.address, + sorting_value=self.extrinsic.params[1]['value'] + ) + + search_index.save(db_session) + + +class StakingBondExtra(ExtrinsicProcessor): + + module_id = 'staking' + call_id = 'bond_extra' + + def process_search_index(self, db_session): + + if self.extrinsic.success: + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_STAKING_BONDED, + account_id=self.extrinsic.address, + sorting_value=self.extrinsic.params[0]['value'] + ) + + search_index.save(db_session) + + +class StakingUnbond(ExtrinsicProcessor): + + module_id = 'staking' + call_id = 'unbond' + + def process_search_index(self, db_session): + + if self.extrinsic.success: + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_STAKING_UNBONDED, + account_id=self.extrinsic.address, + sorting_value=self.extrinsic.params[0]['value'] + ) + + search_index.save(db_session) + + +class StakingWithdrawUnbonded(ExtrinsicProcessor): + + module_id = 'staking' + call_id = 'withdraw_unbonded' + + def process_search_index(self, db_session): + + if self.extrinsic.success: + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_STAKING_WITHDRAWN, + account_id=self.extrinsic.address + ) + + search_index.save(db_session) + + +class StakingNominate(ExtrinsicProcessor): + + module_id = 'staking' + call_id = 'nominate' + + def process_search_index(self, db_session): + + if self.extrinsic.success: + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_STAKING_NOMINATE, + account_id=self.extrinsic.address + ) + + search_index.save(db_session) + + +class StakingValidate(ExtrinsicProcessor): + + module_id = 'staking' + call_id = 'validate' + + def process_search_index(self, db_session): + + if self.extrinsic.success: + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_STAKING_VALIDATE, + account_id=self.extrinsic.address + ) + + search_index.save(db_session) + + +class StakingChill(ExtrinsicProcessor): + + module_id = 'staking' + call_id = 'chill' + + def process_search_index(self, db_session): + + if self.extrinsic.success: + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_STAKING_CHILL, + account_id=self.extrinsic.address + ) + + search_index.save(db_session) + + +class StakingSetPayee(ExtrinsicProcessor): + + module_id = 'staking' + call_id = 'set_payee' + + def process_search_index(self, db_session): + + if self.extrinsic.success: + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_STAKING_SET_PAYEE, + account_id=self.extrinsic.address + ) + + search_index.save(db_session) + + +class ElectionsSubmitCandidacy(ExtrinsicProcessor): + + module_id = 'electionsphragmen' + call_id = 'submit_candidacy' + + def process_search_index(self, db_session): + + if self.extrinsic.success: + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_COUNCIL_CANDIDACY_SUBMIT, + account_id=self.extrinsic.address + ) + + search_index.save(db_session) + + +class ElectionsVote(ExtrinsicProcessor): + + module_id = 'electionsphragmen' + call_id = 'vote' + + def process_search_index(self, db_session): + + if self.extrinsic.success: + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_COUNCIL_CANDIDACY_VOTE, + account_id=self.extrinsic.address, + sorting_value=self.extrinsic.params[1]['value'] + ) + + search_index.save(db_session) + + # Reverse lookup + for candidate in self.extrinsic.params[0]['value']: + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_COUNCIL_CANDIDACY_VOTE, + account_id=candidate.replace('0x', ''), + sorting_value=self.extrinsic.params[1]['value'] + ) + + search_index.save(db_session) + + +class TreasuryProposeSpend(ExtrinsicProcessor): + + module_id = 'treasury' + call_id = 'propose_spend' + + def process_search_index(self, db_session): + + if self.extrinsic.success: + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_TREASURY_PROPOSED, + account_id=self.extrinsic.address, + sorting_value=self.extrinsic.params[0]['value'] + ) + + search_index.save(db_session) + + # Add Beneficiary + + search_index = self.add_search_index( + index_type_id=settings.SEARCH_INDEX_TREASURY_PROPOSED, + account_id=self.extrinsic.params[1]['value'].replace('0x', ''), + sorting_value=self.extrinsic.params[0]['value'] + ) + + search_index.save(db_session) + + +class SudoSetKey(ExtrinsicProcessor): + + module_id = 'sudo' + call_id = 'set_key' + + def sequencing_hook(self, db_session, parent_block, parent_sequenced_block): + if self.extrinsic.success: + + sudo_key = self.extrinsic.params[0]['value'].replace('0x', '') + + Account.query(db_session).filter( + Account.id == sudo_key, Account.was_sudo == False + ).update({Account.was_sudo: True}, synchronize_session='fetch') + + Account.query(db_session).filter( + Account.id != sudo_key, Account.is_sudo == True + ).update({Account.is_sudo: False}, synchronize_session='fetch') + + Account.query(db_session).filter( + Account.id == sudo_key, Account.is_sudo == False + ).update({Account.is_sudo: True}, synchronize_session='fetch') diff --git a/pm-harvester/app/resources/__init__.py b/pm-harvester/app/resources/__init__.py new file mode 100644 index 00000000..e49256fe --- /dev/null +++ b/pm-harvester/app/resources/__init__.py @@ -0,0 +1,21 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# __init__.py + + diff --git a/pm-harvester/app/resources/base.py b/pm-harvester/app/resources/base.py new file mode 100644 index 00000000..d388f75c --- /dev/null +++ b/pm-harvester/app/resources/base.py @@ -0,0 +1,59 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# base.py + +from sqlalchemy.orm import Session + + +class BaseResource(object): + + session: Session + + def get_jsonapi_response(self, data, meta=None, errors=None, links=None, relationships=None, included=None): + + result = { + 'meta': { + "authors": [ + "WEB3SCAN", + "POLKASCAN", + "openAware BV" + ] + }, + 'errors': [], + "data": data, + "links": {} + } + + if meta: + result['meta'].update(meta) + + if errors: + result['errors'] = errors + + if links: + result['links'] = links + + if relationships: + result['data']['relationships'] = relationships + + if included: + result['included'] = included + + return result + diff --git a/pm-harvester/app/resources/harvester.py b/pm-harvester/app/resources/harvester.py new file mode 100644 index 00000000..39adf635 --- /dev/null +++ b/pm-harvester/app/resources/harvester.py @@ -0,0 +1,365 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# harvester.py + +import datetime +import uuid + +import falcon +import pytz +from celery.result import AsyncResult +from falcon.media.validators.jsonschema import validate +from sqlalchemy import text, func + +from app import settings +from app.models.data import Block, BlockTotal +from app.models.harvester import Setting, Status +from app.resources.base import BaseResource +from app.schemas import load_schema +from app.processors.converters import PolkascanHarvesterService, BlockAlreadyAdded, BlockIntegrityError +from substrateinterface import SubstrateInterface +from app.tasks import accumulate_block_recursive, start_harvester, rebuild_search_index, rebuild_account_info_snapshot +from app.settings import SUBSTRATE_RPC_URL, TYPE_REGISTRY, TYPE_REGISTRY_FILE + + +class PolkascanStartHarvesterResource(BaseResource): + + #@validate(load_schema('start_harvester')) + def on_post(self, req, resp): + + task = start_harvester.delay(check_gaps=True) + + resp.status = falcon.HTTP_201 + + resp.media = { + 'status': 'success', + 'data': { + 'task_id': task.id + } + } + + +class PolkascanStopHarvesterResource(BaseResource): + + def on_post(self, req, resp): + + resp.status = falcon.HTTP_404 + + resp.media = { + 'status': 'success', + 'data': { + 'message': 'TODO' + } + } + + +class PolkaScanCheckHarvesterTaskResource(BaseResource): + + def on_get(self, req, resp, task_id): + + task_result = AsyncResult(task_id) + result = {'status': task_result.status, 'result': task_result.result} + resp.status = falcon.HTTP_200 + resp.media = result + + +class PolkascanHarvesterQueueResource(BaseResource): + + def on_get(self, req, resp): + + last_known_block = Block.query(self.session).order_by(Block.id.desc()).first() + + if not last_known_block: + resp.media = { + 'status': 'success', + 'data': { + 'message': 'Harvester waiting for first run' + } + } + else: + + remaining_sets_result = Block.get_missing_block_ids(self.session) + + resp.status = falcon.HTTP_200 + + resp.media = { + 'status': 'success', + 'data': { + 'harvester_head': last_known_block.id, + 'block_process_queue': [ + {'from': block_set['block_from'], 'to': block_set['block_to']} + for block_set in remaining_sets_result + ] + } + } + + +class PolkascanHarvesterStatusResource(BaseResource): + + def on_get(self, req, resp): + + sequencer_task = Status.get_status(self.session, 'SEQUENCER_TASK_ID') + integrity_head = Status.get_status(self.session, 'INTEGRITY_HEAD') + sequencer_head = self.session.query(func.max(BlockTotal.id)).one()[0] + best_block = Block.query(self.session).filter_by( + id=self.session.query(func.max(Block.id)).one()[0]).first() + + if best_block: + best_block_datetime = best_block.datetime.replace(tzinfo=pytz.UTC).timestamp() * 1000 + best_block_nr = best_block.id + else: + best_block_datetime = None + best_block_nr = None + + substrate = SubstrateInterface(SUBSTRATE_RPC_URL) + chain_head_block_id = substrate.get_block_number(substrate.get_chain_head()) + chain_finalized_block_id = substrate.get_block_number(substrate.get_chain_finalised_head()) + + resp.media = { + 'best_block_datetime': best_block_datetime, + 'best_block_nr': best_block_nr, + 'sequencer_task': sequencer_task.value, + 'sequencer_head': sequencer_head, + 'integrity_head': int(integrity_head.value), + 'chain_head_block_id': chain_head_block_id, + 'chain_finalized_block_id': chain_finalized_block_id + } + + +class PolkascanProcessBlockResource(BaseResource): + + def on_post(self, req, resp): + + block_hash = None + + if req.media.get('block_id'): + substrate = SubstrateInterface(SUBSTRATE_RPC_URL) + block_hash = substrate.get_block_hash(req.media.get('block_id')) + elif req.media.get('block_hash'): + block_hash = req.media.get('block_hash') + else: + resp.status = falcon.HTTP_BAD_REQUEST + resp.media = {'errors': ['Either block_hash or block_id should be supplied']} + + if block_hash: + print('Processing {} ...'.format(block_hash)) + harvester = PolkascanHarvesterService( + db_session=self.session, + type_registry=TYPE_REGISTRY, + type_registry_file=TYPE_REGISTRY_FILE + ) + + block = Block.query(self.session).filter(Block.hash == block_hash).first() + + if block: + resp.status = falcon.HTTP_200 + resp.media = {'result': 'already exists', 'parentHash': block.parent_hash} + else: + + amount = req.media.get('amount', 1) + + for nr in range(0, amount): + try: + block = harvester.add_block(block_hash) + except BlockAlreadyAdded as e: + print('Skipping {}'.format(block_hash)) + block_hash = block.parent_hash + if block.id == 0: + break + + self.session.commit() + + resp.status = falcon.HTTP_201 + resp.media = {'result': 'added', 'parentHash': block.parent_hash} + + else: + resp.status = falcon.HTTP_404 + resp.media = {'result': 'Block not found'} + + +class SequenceBlockResource(BaseResource): + + def on_post(self, req, resp): + + block_hash = None + + if 'block_id' in req.media: + block = Block.query(self.session).filter(Block.id == req.media.get('block_id')).first() + elif req.media.get('block_hash'): + block_hash = req.media.get('block_hash') + block = Block.query(self.session).filter(Block.hash == block_hash).first() + else: + block = None + resp.status = falcon.HTTP_BAD_REQUEST + resp.media = {'errors': ['Either block_hash or block_id should be supplied']} + + if block: + print('Sequencing #{} ...'.format(block.id)) + + harvester = PolkascanHarvesterService( + db_session=self.session, + type_registry=TYPE_REGISTRY, + type_registry_file=TYPE_REGISTRY_FILE + ) + + if block.id == 1: + # Add genesis block + parent_block = harvester.add_block(block.parent_hash) + + block_total = BlockTotal.query(self.session).filter_by(id=block.id).first() + parent_block = Block.query(self.session).filter(Block.id == block.id - 1).first() + parent_block_total = BlockTotal.query(self.session).filter_by(id=block.id - 1).first() + + if block_total: + resp.status = falcon.HTTP_200 + resp.media = {'result': 'already exists', 'blockId': block.id} + else: + + if parent_block_total: + parent_block_total = parent_block_total.asdict() + + if parent_block: + parent_block = parent_block.asdict() + + harvester.sequence_block(block, parent_block, parent_block_total) + + self.session.commit() + + resp.status = falcon.HTTP_201 + resp.media = {'result': 'added', 'parentHash': block.parent_hash} + + else: + resp.status = falcon.HTTP_404 + resp.media = {'result': 'Block not found'} + + +class StartSequenceBlockResource(BaseResource): + + def on_post(self, req, resp): + + sequencer_task = Status.get_status(self.session, 'SEQUENCER_TASK_ID') + + if sequencer_task.value is None: + # 3. IF NOT RUNNING: set task id is status table + sequencer_task.value = "123" + sequencer_task.save(self.session) + + harvester = PolkascanHarvesterService( + db_session=self.session, + type_registry=TYPE_REGISTRY, + type_registry_file=TYPE_REGISTRY_FILE + ) + result = harvester.start_sequencer() + + sequencer_task.value = None + sequencer_task.save(self.session) + + # 4. IF RUNNING: check if task id is active + else: + + # task_result = AsyncResult(sequencer_task) + # task_result = {'status': task_result.status, 'result': task_result.result} + sequencer_task.value = None + sequencer_task.save(self.session) + + result = 'Busy' + + self.session.commit() + + resp.media = { + 'result': result + } + + +class ProcessGenesisBlockResource(BaseResource): + + def on_post(self, req, resp): + + harvester = PolkascanHarvesterService( + db_session=self.session, + type_registry=TYPE_REGISTRY, + type_registry_file=TYPE_REGISTRY_FILE + ) + block = Block.query(self.session).get(1) + if block: + result = harvester.process_genesis(block=block) + else: + result = 'Block #1 required to process genesis' + + self.session.commit() + + resp.media = { + 'result': result + } + + +class StartIntegrityResource(BaseResource): + + def on_post(self, req, resp): + harvester = PolkascanHarvesterService( + db_session=self.session, + type_registry=TYPE_REGISTRY, + type_registry_file=TYPE_REGISTRY_FILE + ) + try: + result = harvester.integrity_checks() + except BlockIntegrityError as e: + result = str(e) + + resp.media = { + 'result': result + } + + +class RebuildSearchIndexResource(BaseResource): + + def on_post(self, req, resp): + if settings.CELERY_RUNNING: + task = rebuild_search_index.delay() + data = { + 'task_id': task.id + } + else: + data = rebuild_search_index() + + resp.status = falcon.HTTP_201 + + resp.media = { + 'status': 'Search index rebuild task created', + 'data': data + } + + +class RebuildAccountInfoResource(BaseResource): + + def on_post(self, req, resp): + if settings.CELERY_RUNNING: + task = rebuild_account_info_snapshot.delay() + data = { + 'task_id': task.id + } + else: + data = rebuild_account_info_snapshot() + + resp.status = falcon.HTTP_201 + + resp.media = { + 'status': 'Search index rebuild task created', + 'data': data + } diff --git a/pm-harvester/app/resources/tools.py b/pm-harvester/app/resources/tools.py new file mode 100644 index 00000000..317cbc4d --- /dev/null +++ b/pm-harvester/app/resources/tools.py @@ -0,0 +1,160 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# tools.py + +import falcon + +from app.processors.converters import PolkascanHarvesterService +from app.resources.base import BaseResource + +from scalecodec.base import ScaleBytes +from scalecodec.metadata import MetadataDecoder +from scalecodec.block import EventsDecoder, ExtrinsicsDecoder, ExtrinsicsBlock61181Decoder + +from substrateinterface import SubstrateInterface +from app.settings import SUBSTRATE_RPC_URL, SUBSTRATE_METADATA_VERSION +from app.tasks import balance_snapshot + + +class ExtractMetadataResource(BaseResource): + + def on_get(self, req, resp): + + if 'block_hash' in req.params: + substrate = SubstrateInterface(SUBSTRATE_RPC_URL) + metadata = substrate.get_block_metadata(req.params.get('block_hash')) + + resp.status = falcon.HTTP_200 + resp.media = metadata.value + else: + resp.status = falcon.HTTP_BAD_REQUEST + + def on_post(self, req, resp): + metadata = MetadataDecoder(ScaleBytes(req.media.get('result'))) + + resp.status = falcon.HTTP_200 + resp.media = metadata.process() + + +class ExtractExtrinsicsResource(BaseResource): + + def on_get(self, req, resp): + + substrate = SubstrateInterface(SUBSTRATE_RPC_URL) + + # Get extrinsics + json_block = substrate.get_chain_block(req.params.get('block_hash')) + + if not json_block: + resp.status = falcon.HTTP_404 + else: + + extrinsics = json_block['block']['extrinsics'] + + # Get metadata + metadata_decoder = substrate.get_block_metadata(json_block['block']['header']['parentHash']) + + #result = [{'runtime': substrate.get_block_runtime_version(req.params.get('block_hash')), 'metadata': metadata_result.get_data_dict()}] + result = [] + + for extrinsic in extrinsics: + if int(json_block['block']['header']['number'], 16) == 61181: + extrinsics_decoder = ExtrinsicsBlock61181Decoder(ScaleBytes(extrinsic), metadata=metadata_decoder) + else: + extrinsics_decoder = ExtrinsicsDecoder(ScaleBytes(extrinsic), metadata=metadata_decoder) + result.append(extrinsics_decoder.decode()) + + resp.status = falcon.HTTP_201 + resp.media = result + + +class ExtractEventsResource(BaseResource): + + def on_get(self, req, resp): + + substrate = SubstrateInterface(SUBSTRATE_RPC_URL) + + # Get Parent hash + json_block = substrate.get_block_header(req.params.get('block_hash')) + + # Get metadata + metadata_decoder = substrate.get_block_metadata(json_block['parentHash']) + + # Get events for block hash + events_decoder = substrate.get_block_events(req.params.get('block_hash'), metadata_decoder=metadata_decoder) + + resp.status = falcon.HTTP_201 + resp.media = {'events': events_decoder.value, 'runtime': substrate.get_block_runtime_version(req.params.get('block_hash'))} + + +class HealthCheckResource(BaseResource): + def on_get(self, req, resp): + resp.media = {'status': 'OK'} + + +class StorageValidatorResource(BaseResource): + + def on_get(self, req, resp): + + substrate = SubstrateInterface(SUBSTRATE_RPC_URL) + + resp.status = falcon.HTTP_200 + + current_era = substrate.get_storage( + block_hash="0x519fc882113d886615ad5c7a93f8319640270ab8a09546798f7f8d973a99b017", + module="Staking", + function="CurrentEra", + return_scale_type='BlockNumber', + metadata_version=SUBSTRATE_METADATA_VERSION + ) + + # Retrieve validator for new session from storage + validators = substrate.get_storage( + block_hash="0x519fc882113d886615ad5c7a93f8319640270ab8a09546798f7f8d973a99b017", + module="Session", + function="Validators", + return_scale_type='Vec', + metadata_version=SUBSTRATE_METADATA_VERSION + ) or [] + + # for validator in validators: + # storage_bytes = substrate.get_storage("0x904871d0e6284c0555134fa187891580979a2fc426a4f8873a8d15d8cca6020f", + # "Balances", "FreeBalance", validator.replace('0x', '')) + # #print(validator.replace('0x', '')) + # + # if storage_bytes: + # obj = ScaleDecoder.get_decoder_class('Balance', ScaleBytes(storage_bytes)) + # nominators.append(obj.decode()) + + resp.media = {'validators': validators, 'current_era': current_era} + + +class CreateSnapshotResource(BaseResource): + + def on_post(self, req, resp): + + task = balance_snapshot.delay( + account_id=req.media.get('account_id'), + block_start=req.media.get('block_start'), + block_end=req.media.get('block_end'), + block_ids=req.media.get('block_ids') + ) + + resp.media = {'result': 'Balance snapshop task started', 'task_id': task.id} + diff --git a/pm-harvester/app/schemas/__init__.py b/pm-harvester/app/schemas/__init__.py new file mode 100644 index 00000000..2b7ac3da --- /dev/null +++ b/pm-harvester/app/schemas/__init__.py @@ -0,0 +1,32 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# __init__.py + +import os +import json + + +def load_schema(name): + module_path = os.path.dirname(__file__) + path = os.path.join(module_path, '{}.json'.format(name)) + + with open(os.path.abspath(path), 'r') as fp: + data = fp.read() + + return json.loads(data) diff --git a/pm-harvester/app/schemas/start_harvester.json b/pm-harvester/app/schemas/start_harvester.json new file mode 100644 index 00000000..86104f7b --- /dev/null +++ b/pm-harvester/app/schemas/start_harvester.json @@ -0,0 +1,9 @@ +{ + "title": "Start Harvester", + "type": "object", + "properties": { + "block_hash": { + "type": "string" + } + } +} \ No newline at end of file diff --git a/pm-harvester/app/settings.py b/pm-harvester/app/settings.py new file mode 100644 index 00000000..7f52b348 --- /dev/null +++ b/pm-harvester/app/settings.py @@ -0,0 +1,199 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# settings.py + +import os + +DB_NAME = os.environ.get("DB_NAME", "polkascan") +DB_HOST = os.environ.get("DB_HOST", "mysql") +DB_PORT = os.environ.get("DB_PORT", 3306) +DB_USERNAME = os.environ.get("DB_USERNAME", "root") +DB_PASSWORD = os.environ.get("DB_PASSWORD", "root") + +DB_CONNECTION = os.environ.get("DB_CONNECTION", "mysql+mysqlconnector://{}:{}@{}:{}/{}".format( + DB_USERNAME, DB_PASSWORD, DB_HOST, DB_PORT, DB_NAME +)) + +SUBSTRATE_RPC_URL = os.environ.get("SUBSTRATE_RPC_URL", "http://substrate-node:9933/") +SUBSTRATE_ADDRESS_TYPE = int(os.environ.get("SUBSTRATE_ADDRESS_TYPE", 42)) + +SUBSTRATE_TREASURY_ACCOUNTS = [ + "6d6f646c70792f74727372790000000000000000000000000000000000000000", + "6d6f646c70792f736f6369650000000000000000000000000000000000000000" +] + +# Simulate Scale encoded extrinsics per block for e.g. performance tests +# Example: +# SUBSTRATE_MOCK_EXTRINSICS = ["0xa50383ff76729e17ad31469debcb60f3ce3622f79143e442e77b58d6e2195d9ea998680d283c1715298aada424241284e4c3d2bec57a8b89e1bfa5502c0f84866cb94f64b666c04ceb88b7274612fea6bcdf7683701b96c13264d5326ecdcd5661df5502d500080008000f69590e7c83f3b71826537aff19ce9d173efeb887cca69c02b991f6ca75a8f43e05e5ef718a29d168e8df39367398cc60b9b45c7815fb2bfa362693a281676e1c7e66ad780b39e767f22efe0065929db7c69cef006d69a0ea8739c22fa1a06cf257d1cc14c340bdf2944ba8615b2a32cdc5774c9f93af6ef7eb3eab07caf94f00"] * 5000 +SUBSTRATE_MOCK_EXTRINSICS = os.environ.get("SUBSTRATE_MOCK_EXTRINSICS", None) + +TYPE_REGISTRY = os.environ.get("TYPE_REGISTRY", "default") +TYPE_REGISTRY_FILE = os.environ.get("TYPE_REGISTRY_FILE") + +FINALIZATION_BY_BLOCK_CONFIRMATIONS = int(os.environ.get("FINALIZATION_BY_BLOCK_CONFIRMATIONS", 0)) +FINALIZATION_ONLY = int(os.environ.get("FINALIZATION_ONLY", 0)) + +DEBUG = bool(os.environ.get("DEBUG", False)) + +BALANCE_FULL_SNAPSHOT_INTERVAL = 10000 +CELERY_RUNNING = True + + +# Version compatibility switches + +LEGACY_SESSION_VALIDATOR_LOOKUP = bool(os.environ.get("LEGACY_SESSION_VALIDATOR_LOOKUP", False)) +SUBSTRATE_METADATA_VERSION = int(os.environ.get("SUBSTRATE_METADATA_VERSION", 8)) +SUBSTRATE_STORAGE_BALANCE = os.environ.get("SUBSTRATE_STORAGE_BALANCE", "FreeBalance") +SUBSTRATE_STORAGE_INDICES = os.environ.get("SUBSTRATE_STORAGE_INDICES", "EnumSet") +NEW_SESSION_EVENT_HANDLER = bool(os.environ.get("NEW_SESSION_EVENT_HANDLER", True)) +BALANCE_SYSTEM_ACCOUNT_MIN_BLOCK = int(os.environ.get("BALANCE_SYSTEM_ACCOUNT_MIN_BLOCK", 0)) + +# Constants + +ACCOUNT_AUDIT_TYPE_NEW = 1 +ACCOUNT_AUDIT_TYPE_REAPED = 2 + +ACCOUNT_INDEX_AUDIT_TYPE_NEW = 1 +ACCOUNT_INDEX_AUDIT_TYPE_REAPED = 2 + +DEMOCRACY_PREIMAGE_AUDIT_TYPE_NOTED = 1 +DEMOCRACY_PREIMAGE_AUDIT_TYPE_USED = 2 +DEMOCRACY_PREIMAGE_AUDIT_TYPE_INVALID = 3 +DEMOCRACY_PREIMAGE_AUDIT_TYPE_MISSING = 4 +DEMOCRACY_PREIMAGE_AUDIT_TYPE_REAPED = 5 + +DEMOCRACY_PROPOSAL_AUDIT_TYPE_PROPOSED = 1 +DEMOCRACY_PROPOSAL_AUDIT_TYPE_TABLED = 2 + +DEMOCRACY_REFERENDUM_AUDIT_TYPE_STARTED = 1 +DEMOCRACY_REFERENDUM_AUDIT_TYPE_PASSED = 2 +DEMOCRACY_REFERENDUM_AUDIT_TYPE_NOTPASSED = 3 +DEMOCRACY_REFERENDUM_AUDIT_TYPE_CANCELLED = 4 +DEMOCRACY_REFERENDUM_AUDIT_TYPE_EXECUTED = 5 + +DEMOCRACY_VOTE_AUDIT_TYPE_NORMAL = 1 +DEMOCRACY_VOTE_AUDIT_TYPE_PROXY = 2 + + +# Search indices +SEARCH_INDEX_SLASHED_ACCOUNT = 1 +SEARCH_INDEX_BALANCETRANSFER = 2 +SEARCH_INDEX_HEARTBEATRECEIVED = 3 +SEARCH_INDEX_COUNCIL_PROPOSED = 4 +SEARCH_INDEX_COUNCIL_VOTE = 5 +SEARCH_INDEX_STAKING_BONDED = 6 +SEARCH_INDEX_STAKING_UNBONDED = 7 +SEARCH_INDEX_STAKING_WITHDRAWN = 8 +SEARCH_INDEX_IMONLINE_SOMEOFFLINE = 9 +SEARCH_INDEX_STAKING_NOMINATE = 10 +SEARCH_INDEX_STAKING_VALIDATE = 11 +SEARCH_INDEX_STAKING_CHILL = 12 +SEARCH_INDEX_STAKING_SET_PAYEE = 19 +SEARCH_INDEX_IDENTITY_SET = 13 +SEARCH_INDEX_IDENTITY_SET_SUBS = 14 +SEARCH_INDEX_IDENTITY_CLEARED = 15 +SEARCH_INDEX_IDENTITY_KILLED = 16 +SEARCH_INDEX_IDENTITY_JUDGEMENT_REQUESTED = 17 +SEARCH_INDEX_IDENTITY_JUDGEMENT_GIVEN = 18 +SEARCH_INDEX_IDENTITY_JUDGEMENT_UNREQUESTED = 20 +SEARCH_INDEX_ACCOUNT_KILLED = 21 +SEARCH_INDEX_ACCOUNT_CREATED = 22 +SEARCH_INDEX_COUNCIL_MEMBER_ELECTED = 23 +SEARCH_INDEX_COUNCIL_MEMBER_KICKED = 24 +SEARCH_INDEX_COUNCIL_CANDIDACY_RENOUNCED = 25 +SEARCH_INDEX_COUNCIL_CANDIDACY_SUBMIT = 26 +SEARCH_INDEX_COUNCIL_CANDIDACY_VOTE = 27 +SEARCH_INDEX_TREASURY_PROPOSED = 28 +SEARCH_INDEX_TREASURY_AWARDED = 37 +SEARCH_INDEX_DEMOCRACY_VOTE = 29 +SEARCH_INDEX_DEMOCRACY_PROXY_VOTE = 30 +SEARCH_INDEX_DEMOCRACY_PROPOSE = 31 +SEARCH_INDEX_DEMOCRACY_SECOND = 32 +SEARCH_INDEX_TECHCOMM_VOTED = 33 +SEARCH_INDEX_TECHCOMM_PROPOSED = 34 +SEARCH_INDEX_BALANCES_DEPOSIT = 35 +SEARCH_INDEX_CLAIMS_CLAIMED = 36 +SEARCH_INDEX_STAKING_SESSION = 38 +SEARCH_INDEX_SIGNED_EXTRINSIC = 99 + +COUNCIL_MOTION_TYPE_PROPOSED = 1 +COUNCIL_MOTION_TYPE_APPROVED = 2 +COUNCIL_MOTION_TYPE_DISAPPROVED = 3 +COUNCIL_MOTION_TYPE_EXECUTED = 4 + +TECHCOMM_PROPOSAL_TYPE_PROPOSED = 1 +TECHCOMM_PROPOSAL_TYPE_APPROVED = 2 +TECHCOMM_PROPOSAL_TYPE_DISAPPROVED = 3 +TECHCOMM_PROPOSAL_TYPE_EXECUTED = 4 + +TREASURY_PROPOSAL_TYPE_PROPOSED = 1 +TREASURY_PROPOSAL_TYPE_AWARDED = 2 +TREASURY_PROPOSAL_TYPE_REJECTED = 3 + + +IDENTITY_TYPE_SET = 1 +IDENTITY_TYPE_CLEARED = 2 +IDENTITY_TYPE_KILLED = 3 +IDENTITY_TYPE_SET_SUBS = 4 + +IDENTITY_JUDGEMENT_TYPE_REQUESTED = 1 +IDENTITY_JUDGEMENT_TYPE_UNREQUESTED = 2 +IDENTITY_JUDGEMENT_TYPE_GIVEN = 3 + +IDENTITY_JUDGEMENT_VALUE_UNKNOWN = 0 +IDENTITY_JUDGEMENT_VALUE_FEEPAID = 1 +IDENTITY_JUDGEMENT_VALUE_REASONABLE = 2 +IDENTITY_JUDGEMENT_VALUE_KNOWNGOOD = 3 +IDENTITY_JUDGEMENT_VALUE_OUTOFDATE = 4 +IDENTITY_JUDGEMENT_VALUE_LOWQUALITY = 5 +IDENTITY_JUDGEMENT_VALUE_ERRONEOUS = 6 + +try: + from app.local_settings import * +except ImportError: + pass + +VERSIONED_SETTINGS = { + 'kusama': [ + { + "runtime_range": [1000, 1045], + "settings": { + "SUBSTRATE_STORAGE_BALANCE": "FreeBalance", + "NEW_SESSION_EVENT_HANDLER": False + } + }, + { + "runtime_range": [1050, None], + "settings": { + "SUBSTRATE_STORAGE_BALANCE": "Account", + "NEW_SESSION_EVENT_HANDLER": True + } + } + ] +} + + +def get_versioned_setting(setting, runtime_id): + for versioning_item in VERSIONED_SETTINGS.get(TYPE_REGISTRY, []): + if versioning_item['runtime_range'][0] <= int(runtime_id) and \ + (not versioning_item['runtime_range'][1] or versioning_item['runtime_range'][1] >= int(runtime_id)) and\ + setting in versioning_item['settings']: + return versioning_item['settings'].get(setting) + # Fallback to default settings + return globals().get(setting) diff --git a/pm-harvester/app/tasks.py b/pm-harvester/app/tasks.py new file mode 100644 index 00000000..f204ee29 --- /dev/null +++ b/pm-harvester/app/tasks.py @@ -0,0 +1,391 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# tasks.py + +import os +from time import sleep + +import celery +from celery.result import AsyncResult + +from app import settings +from scalecodec.base import ScaleDecoder, ScaleBytes + +from sqlalchemy import create_engine, text, distinct +from sqlalchemy.exc import SQLAlchemyError, IntegrityError +from sqlalchemy.orm import sessionmaker, scoped_session +from sqlalchemy.sql import func + +from app.models.data import Extrinsic, Block, BlockTotal, Account, AccountInfoSnapshot, SearchIndex +from app.models.harvester import Status +from app.processors.converters import PolkascanHarvesterService, HarvesterCouldNotAddBlock, BlockAlreadyAdded, \ + BlockIntegrityError +from scalecodec.exceptions import RemainingScaleBytesNotEmptyException +from substrateinterface import SubstrateInterface, xxh128 + +from app.settings import DB_CONNECTION, DEBUG, SUBSTRATE_RPC_URL, TYPE_REGISTRY, FINALIZATION_ONLY, TYPE_REGISTRY_FILE + +CELERY_BROKER = os.environ.get('CELERY_BROKER') +CELERY_BACKEND = os.environ.get('CELERY_BACKEND') + +app = celery.Celery('tasks', broker=CELERY_BROKER, backend=CELERY_BACKEND) + +app.conf.beat_schedule = { + 'check-head-4-seconds': { + 'task': 'app.tasks.start_harvester', + 'schedule': 4.0, + 'args': () + }, + 'check-gaps-120-seconds': { + 'task': 'app.tasks.start_harvester', + 'schedule': 120.0, + 'args': [True] + }, +} + +app.conf.timezone = 'UTC' + + +class BaseTask(celery.Task): + + def __init__(self): + self.metadata_store = {} + + def __call__(self, *args, **kwargs): + self.engine = create_engine(DB_CONNECTION, echo=DEBUG, isolation_level="READ_UNCOMMITTED", pool_pre_ping=True) + session_factory = sessionmaker(bind=self.engine, autoflush=False, autocommit=False) + self.session = scoped_session(session_factory) + + return super().__call__(*args, **kwargs) + + def after_return(self, status, retval, task_id, args, kwargs, einfo): + if hasattr(self, 'session'): + self.session.remove() + if hasattr(self, 'engine'): + self.engine.engine.dispose() + + +@app.task(base=BaseTask, bind=True) +def accumulate_block_recursive(self, block_hash, end_block_hash=None): + + harvester = PolkascanHarvesterService( + db_session=self.session, + type_registry=TYPE_REGISTRY, + type_registry_file=TYPE_REGISTRY_FILE + ) + + harvester.metadata_store = self.metadata_store + # harvester.substrate.metadata_cache = self.metadata_store + + # If metadata store isn't initialized yet, perform some tests + if not harvester.metadata_store: + print('Init: create entrypoints') + # Check if blocks exists + max_block_id = self.session.query(func.max(Block.id)).one()[0] + + if not max_block_id: + # Speed up accumulating by creating several entry points + substrate = SubstrateInterface(SUBSTRATE_RPC_URL) + block_nr = substrate.get_block_number(block_hash) + if block_nr > 100: + for entry_point in range(0, block_nr, block_nr // 4)[1:-1]: + entry_point_hash = substrate.get_block_hash(entry_point) + accumulate_block_recursive.delay(entry_point_hash) + + block = None + max_sequenced_block_id = False + + add_count = 0 + + try: + + for nr in range(0, 10): + if not block or block.id > 0: + # Process block + block = harvester.add_block(block_hash) + + print('+ Added {} '.format(block_hash)) + + add_count += 1 + + self.session.commit() + + # Break loop if targeted end block hash is reached + if block_hash == end_block_hash or block.id == 0: + break + + # Continue with parent block hash + block_hash = block.parent_hash + + # Update persistent metadata store in Celery task + self.metadata_store = harvester.metadata_store + + if block_hash != end_block_hash and block and block.id > 0: + accumulate_block_recursive.delay(block.parent_hash, end_block_hash) + + except BlockAlreadyAdded as e: + print('. Skipped {} '.format(block_hash)) + except IntegrityError as e: + print('. Skipped duplicate {} '.format(block_hash)) + except Exception as exc: + print('! ERROR adding {}'.format(block_hash)) + raise HarvesterCouldNotAddBlock(block_hash) from exc + + return { + 'result': '{} blocks added'.format(add_count), + 'lastAddedBlockHash': block_hash, + 'sequencerStartedFrom': max_sequenced_block_id + } + + +@app.task(base=BaseTask, bind=True) +def start_sequencer(self): + sequencer_task = Status.get_status(self.session, 'SEQUENCER_TASK_ID') + + if sequencer_task.value: + task_result = AsyncResult(sequencer_task.value) + if not task_result or task_result.ready(): + sequencer_task.value = None + sequencer_task.save(self.session) + + if sequencer_task.value is None: + sequencer_task.value = self.request.id + sequencer_task.save(self.session) + + harvester = PolkascanHarvesterService( + db_session=self.session, + type_registry=TYPE_REGISTRY, + type_registry_file=TYPE_REGISTRY_FILE + ) + try: + result = harvester.start_sequencer() + except BlockIntegrityError as e: + result = {'result': str(e)} + + sequencer_task.value = None + sequencer_task.save(self.session) + + self.session.commit() + + # Check if analytics data need to be generated + #start_generate_analytics.delay() + + return result + else: + return {'result': 'Sequencer already running'} + + +@app.task(base=BaseTask, bind=True) +def rebuilding_search_index(self, search_index_id=None, truncate=False): + if truncate: + # Clear search index table + self.session.execute('delete from analytics_search_index where index_type_id={}'.format(search_index_id)) + self.session.commit() + + harvester = PolkascanHarvesterService( + db_session=self.session, + type_registry=TYPE_REGISTRY, + type_registry_file=TYPE_REGISTRY_FILE + ) + harvester.rebuild_search_index() + + return {'result': 'index rebuilt'} + + +@app.task(base=BaseTask, bind=True) +def start_harvester(self, check_gaps=False): + + substrate = SubstrateInterface(SUBSTRATE_RPC_URL) + + block_sets = [] + + if check_gaps: + # Check for gaps between already harvested blocks and try to fill them first + remaining_sets_result = Block.get_missing_block_ids(self.session) + + for block_set in remaining_sets_result: + + # Get start and end block hash + end_block_hash = substrate.get_block_hash(int(block_set['block_from'])) + start_block_hash = substrate.get_block_hash(int(block_set['block_to'])) + + # Start processing task + accumulate_block_recursive.delay(start_block_hash, end_block_hash) + + block_sets.append({ + 'start_block_hash': start_block_hash, + 'end_block_hash': end_block_hash + }) + + # Start sequencer + sequencer_task = start_sequencer.delay() + + # Continue from current (finalised) head + if FINALIZATION_ONLY == 1: + start_block_hash = substrate.get_chain_finalised_head() + else: + start_block_hash = substrate.get_chain_head() + + end_block_hash = None + + accumulate_block_recursive.delay(start_block_hash, end_block_hash) + + block_sets.append({ + 'start_block_hash': start_block_hash, + 'end_block_hash': end_block_hash + }) + + return { + 'result': 'Harvester job started', + 'block_sets': block_sets, + 'sequencer_task_id': sequencer_task.task_id + } + + +@app.task(base=BaseTask, bind=True) +def start_generate_analytics(self): + self.session.execute('CALL generate_analytics_data()') + self.session.commit() + return {'status': 'OK'} + + +@app.task(base=BaseTask, bind=True) +def rebuild_search_index(self): + harvester = PolkascanHarvesterService( + db_session=self.session, + type_registry=TYPE_REGISTRY, + type_registry_file=TYPE_REGISTRY_FILE + ) + harvester.rebuild_search_index() + + return {'result': 'search index rebuilt'} + + +@app.task(base=BaseTask, bind=True) +def rebuild_account_info_snapshot(self): + harvester = PolkascanHarvesterService( + db_session=self.session, + type_registry=TYPE_REGISTRY, + type_registry_file=TYPE_REGISTRY_FILE + ) + + last_full_snapshot_block_nr = 0 + + self.session.execute('truncate table {}'.format(AccountInfoSnapshot.__tablename__)) + + for account_id, block_id in self.session.query(SearchIndex.account_id, SearchIndex.block_id).filter( + SearchIndex.block_id >= settings.BALANCE_SYSTEM_ACCOUNT_MIN_BLOCK + ).order_by('block_id').group_by(SearchIndex.account_id, SearchIndex.block_id).yield_per(1000): + + if block_id > last_full_snapshot_block_nr + settings.BALANCE_FULL_SNAPSHOT_INTERVAL: + + last_full_snapshot_block_nr = block_id - block_id % settings.BALANCE_FULL_SNAPSHOT_INTERVAL + harvester.create_full_balance_snaphot(last_full_snapshot_block_nr) + self.session.commit() + else: + harvester.create_balance_snapshot(block_id, account_id) + self.session.commit() + + # set balances according to most recent snapshot + account_info = self.session.execute(""" + select + a.account_id, + a.balance_total, + a.balance_free, + a.balance_reserved, + a.nonce + from + data_account_info_snapshot as a + inner join ( + select + account_id, max(block_id) as max_block_id + from data_account_info_snapshot + group by account_id + ) as b + on a.account_id = b.account_id and a.block_id = b.max_block_id + """) + + for account_id, balance_total, balance_free, balance_reserved, nonce in account_info: + Account.query(self.session).filter_by(id=account_id).update( + { + Account.balance_total: balance_total, + Account.balance_free: balance_free, + Account.balance_reserved: balance_reserved, + Account.nonce: nonce, + }, synchronize_session='fetch' + ) + self.session.commit() + + + return {'result': 'account info snapshots rebuilt'} + + +@app.task(base=BaseTask, bind=True) +def balance_snapshot(self, account_id=None, block_start=1, block_end=None, block_ids=None): + if account_id: + accounts = [account_id] + else: + accounts = [account.id for account in Account.query(self.session)] + + harvester = PolkascanHarvesterService( + db_session=self.session, + type_registry=TYPE_REGISTRY, + type_registry_file=TYPE_REGISTRY_FILE + ) + + if block_ids: + block_range = block_ids + else: + + if block_end is None: + # Set block end to chaintip + substrate = SubstrateInterface(SUBSTRATE_RPC_URL) + block_end = substrate.get_block_number(substrate.get_chain_finalised_head()) + + block_range = range(block_start, block_end + 1) + + for block_id in block_range: + for account in accounts: + harvester.create_balance_snapshot(block_id, account) + self.session.commit() + + return { + 'message': 'Snapshop created', + 'account_id': account_id, + 'block_start': block_start, + 'block_end': block_end, + 'block_ids': block_ids + } + + +@app.task(base=BaseTask, bind=True) +def update_balances_in_block(self, block_id): + harvester = PolkascanHarvesterService( + db_session=self.session, + type_registry=TYPE_REGISTRY, + type_registry_file=TYPE_REGISTRY_FILE + ) + + harvester.create_full_balance_snaphot(block_id) + self.session.commit() + + harvester.update_account_balances() + self.session.commit() + + return 'Snapshot created for block {}'.format(block_id) diff --git a/pm-harvester/app/type_registry/custom_types.json b/pm-harvester/app/type_registry/custom_types.json new file mode 100644 index 00000000..6ef941b7 --- /dev/null +++ b/pm-harvester/app/type_registry/custom_types.json @@ -0,0 +1,251 @@ +{ + "runtime_id": 1062, + "types": { + "Address": "AccountIdAddress", + "BlockNumber": "U32", + "LeasePeriod": "BlockNumber", + "Weight": "u64", + "SessionKeysPolkadot": { + "type": "struct", + "type_mapping": [ + ["grandpa", "AccountId"], + ["babe", "AccountId"], + ["im_online", "AccountId"], + ["authority_discovery", "AccountId"], + ["parachains", "AccountId"] + ] + }, + "Keys": "SessionKeysPolkadot", + "DispatchInfo": { + "type": "struct", + "type_mapping": [ + ["weight", "Weight"], + ["class", "DispatchClass"], + ["paysFee", "Pays"] + ] + } + }, + "versioning": [ + { + "runtime_range": [1019, 1031], + "types": { + "DispatchError": { + "type": "struct", + "type_mapping": [ + ["module", "Option"], + ["error", "u8"] + ] + } + } + }, + { + "runtime_range": [1032, null], + "types": { + "DispatchError": { + "type": "enum", + "type_mapping": [ + ["Other", "Null"], + ["CannotLookup", "Null"], + ["BadOrigin", "Null"], + ["Module", "DispatchErrorModule"] + ] + } + } + }, + { + "runtime_range": [1019, 1037], + "types": { + "IdentityInfo": { + "type": "struct", + "type_mapping": [ + ["additional", "Vec"], + ["display", "Data"], + ["legal", "Data"], + ["web", "Data"], + ["riot", "Data"], + ["email", "Data"], + ["pgpFingerprint", "Option"], + ["image", "Data"] + ] + } + } + }, + { + "runtime_range": [1038, null], + "types": { + "IdentityInfo": { + "type": "struct", + "type_mapping": [ + ["additional", "Vec"], + ["display", "Data"], + ["legal", "Data"], + ["web", "Data"], + ["riot", "Data"], + ["email", "Data"], + ["pgpFingerprint", "Option"], + ["image", "Data"], + ["twitter", "Data"] + ] + } + } + }, + { + "runtime_range": [1019, 1042], + "types": { + "SlashingSpans": { + "type": "struct", + "type_mapping": [ + ["spanIndex", "SpanIndex"], + ["lastStart", "EraIndex"], + ["prior", "Vec"] + ] + } + } + }, + { + "runtime_range": [1043, null], + "types": { + "SlashingSpans": { + "type": "struct", + "type_mapping": [ + ["spanIndex", "SpanIndex"], + ["lastStart", "EraIndex"], + ["lastNonzeroSlash", "EraIndex"], + ["prior", "Vec"] + ] + } + } + }, + { + "runtime_range": [1019, 1045], + "types": { + "Address": "RawAddress", + "StakingLedger": { + "type": "struct", + "type_mapping": [ + ["stash", "AccountId"], + ["total", "Compact"], + ["active", "Compact"], + ["unlocking", "Vec>"] + ] + }, + "BalanceLock": { + "type": "struct", + "type_mapping": [ + ["id", "LockIdentifier"], + ["amount", "Balance"], + ["until", "BlockNumber"], + ["reasons", "WithdrawReasons"] + ] + } + } + }, + { + "runtime_range": [1050, null], + "types": { + "Address": "AccountIdAddress", + "StakingLedger": { + "type": "struct", + "type_mapping": [ + ["stash", "AccountId"], + ["total", "Compact"], + ["active", "Compact"], + ["unlocking", "Vec>"], + ["lastReward", "Option"] + ] + }, + "BalanceLock": { + "type": "struct", + "type_mapping": [ + ["id", "LockIdentifier"], + ["amount", "Balance"], + ["reasons", "Reasons"] + ] + } + } + }, + { + "runtime_range": [1019, 1054], + "types": { + "ReferendumInfo": { + "type": "struct", + "type_mapping": [ + ["end", "BlockNumber"], + ["proposal", "Proposal"], + ["threshold", "VoteThreshold"], + ["delay", "BlockNumber"] + ] + } + } + }, + { + "runtime_range": [1054, null], + "types": { + "ReferendumInfo": { + "type": "enum", + "type_mapping": [ + ["Ongoing", "ReferendumStatus"], + ["Finished", "ReferendumInfoFinished"] + ] + } + } + }, + { + "runtime_range": [1019, 1056], + "types": { + "Weight": "u32" + } + }, + { + "runtime_range": [1057, null], + "types": { + "Weight": "u64" + } + }, + { + "runtime_range": [1019, 1061], + "types": { + "Heartbeat": { + "type": "struct", + "type_mapping": [ + ["blockNumber", "BlockNumber"], + ["networkState", "OpaqueNetworkState"], + ["sessionIndex", "SessionIndex"], + ["authorityIndex", "AuthIndex"] + ] + }, + "DispatchInfo": { + "type": "struct", + "type_mapping": [ + ["weight", "Weight"], + ["class", "DispatchClass"], + ["paysFee", "bool"] + ] + } + } + }, + { + "runtime_range": [1062, null], + "types": { + "Heartbeat": { + "type": "struct", + "type_mapping": [ + ["blockNumber", "BlockNumber"], + ["networkState", "OpaqueNetworkState"], + ["sessionIndex", "SessionIndex"], + ["authorityIndex", "AuthIndex"], + ["validatorsLen", "u32"] + ] + }, + "DispatchInfo": { + "type": "struct", + "type_mapping": [ + ["weight", "Weight"], + ["class", "DispatchClass"], + ["paysFee", "Pays"] + ] + } + } + } + ] +} diff --git a/pm-harvester/app/type_registry/substrate-node-template.json b/pm-harvester/app/type_registry/substrate-node-template.json new file mode 100644 index 00000000..1abe6d62 --- /dev/null +++ b/pm-harvester/app/type_registry/substrate-node-template.json @@ -0,0 +1,30 @@ +{ + "runtime_id": 1, + "types": { + "Address": "AccountIdAddress", + "BlockNumber": "U32", + "LeasePeriod": "BlockNumber", + "Weight": "u64", + "SessionKeysPolkadot": { + "type": "struct", + "type_mapping": [ + ["grandpa", "AccountId"], + ["babe", "AccountId"], + ["im_online", "AccountId"], + ["authority_discovery", "AccountId"], + ["parachains", "AccountId"] + ] + }, + "Keys": "SessionKeysPolkadot", + "DispatchInfo": { + "type": "struct", + "type_mapping": [ + ["weight", "Weight"], + ["class", "DispatchClass"], + ["paysFee", "Pays"] + ] + } + }, + "versioning": [ + ] +} diff --git a/pm-harvester/app/utils/__init__.py b/pm-harvester/app/utils/__init__.py new file mode 100644 index 00000000..294881cd --- /dev/null +++ b/pm-harvester/app/utils/__init__.py @@ -0,0 +1,20 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# __init__.py + diff --git a/pm-harvester/app/utils/ss58.py b/pm-harvester/app/utils/ss58.py new file mode 100644 index 00000000..51f99e6a --- /dev/null +++ b/pm-harvester/app/utils/ss58.py @@ -0,0 +1,121 @@ +# Polkascan PRE Harvester +# +# Copyright 2018-2020 openAware BV (NL). +# This file is part of Polkascan. +# +# Polkascan is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Polkascan is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Polkascan. If not, see . +# +# ss58.py + +""" SS58 is a simple address format designed for Substrate based chains. + Encoding/decoding according to specification on https://wiki.parity.io/External-Address-Format-(SS58) + +""" +import base58 +from hashlib import blake2b + +from scalecodec import ScaleBytes +from scalecodec.types import U8, U16, U32, U64 + + +def ss58_decode(address, valid_address_type=42): + checksum_prefix = b'SS58PRE' + + ss58_format = base58.b58decode(address) + + if ss58_format[0] != valid_address_type: + raise ValueError("Invalid Address type") + + # Public keys has a two byte checksum, account index 1 byte + if len(ss58_format) in [3, 4, 6, 10]: + checksum_length = 1 + elif len(ss58_format) in [5, 7, 11, 35]: + checksum_length = 2 + elif len(ss58_format) in [8, 12]: + checksum_length = 3 + elif len(ss58_format) in [9, 13]: + checksum_length = 4 + elif len(ss58_format) in [14]: + checksum_length = 5 + elif len(ss58_format) in [15]: + checksum_length = 6 + elif len(ss58_format) in [16]: + checksum_length = 7 + elif len(ss58_format) in [17]: + checksum_length = 8 + else: + raise ValueError("Invalid address length") + + checksum = blake2b(checksum_prefix + ss58_format[0:-checksum_length]).digest() + + if checksum[0:checksum_length] != ss58_format[-checksum_length:]: + raise ValueError("Invalid checksum") + + return ss58_format[1:len(ss58_format)-checksum_length].hex() + + +def ss58_encode(address, address_type=42): + checksum_prefix = b'SS58PRE' + + if type(address) is bytes or type(address) is bytearray: + address_bytes = address + else: + address_bytes = bytes.fromhex(address) + + if len(address_bytes) == 32: + # Checksum size is 2 bytes for public key + checksum_length = 2 + elif len(address_bytes) in [1, 2, 4, 8]: + # Checksum size is 1 byte for account index + checksum_length = 1 + else: + raise ValueError("Invalid length for address") + + address_format = bytes([address_type]) + address_bytes + checksum = blake2b(checksum_prefix + address_format).digest() + + return base58.b58encode(address_format + checksum[:checksum_length]).decode() + + +def ss58_encode_account_index(account_index, address_type=42): + + if 0 <= account_index <= 2**8 - 1: + account_idx_encoder = U8() + elif 2**8 <= account_index <= 2**16 - 1: + account_idx_encoder = U16() + elif 2**16 <= account_index <= 2**32 - 1: + account_idx_encoder = U32() + elif 2**32 <= account_index <= 2**64 - 1: + account_idx_encoder = U64() + else: + raise ValueError("Value too large for an account index") + + return ss58_encode(account_idx_encoder.encode(account_index).data, address_type) + + +def ss58_decode_account_index(address, valid_address_type=42): + + account_index_bytes = ss58_decode(address, valid_address_type) + + if len(account_index_bytes) == 2: + return U8(ScaleBytes('0x{}'.format(account_index_bytes))).decode() + if len(account_index_bytes) == 4: + return U16(ScaleBytes('0x{}'.format(account_index_bytes))).decode() + if len(account_index_bytes) == 8: + return U32(ScaleBytes('0x{}'.format(account_index_bytes))).decode() + if len(account_index_bytes) == 16: + return U64(ScaleBytes('0x{}'.format(account_index_bytes))).decode() + else: + raise ValueError("Invalid account index length") + diff --git a/pm-harvester/docker-compose-dev.yml b/pm-harvester/docker-compose-dev.yml new file mode 100644 index 00000000..de43adc0 --- /dev/null +++ b/pm-harvester/docker-compose-dev.yml @@ -0,0 +1,91 @@ +version: "3" + +services: + harvester-api: + image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest + hostname: harvester-api + ports: + - "8000:8000" + volumes: + - "/usr/src/app" + command: ./start.sh + links: + - redis + logging: + driver: awslogs + options: + awslogs-group: polymesh-harvester-dev + awslogs-region: us-east-2 + awslogs-stream-prefix: harvester-api + environment: &env + - CELERY_BROKER=redis://redis:6379/0 + - CELERY_BACKEND=redis://redis:6379/0 + - PYTHONPATH=/usr/src/app + - TYPE_REGISTRY=polymesh + - SUBSTRATE_ADDRESS_TYPE=42 + - SUBSTRATE_STORAGE_INDICES=Accounts + - NEW_SESSION_EVENT_HANDLER=True + - ENVIRONMENT=${ENVIRONMENT} + - DB_HOST=${DB_HOST} + - DB_PORT=${DB_PORT} + - DB_USERNAME=${DB_USERNAME} + - DB_PASSWORD=${DB_PASSWORD} + - DB_NAME=${DB_NAME} + - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} + + harvester-worker: + image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest + volumes: + - "/usr/src/app" + command: celery -A app.tasks worker --concurrency=4 --loglevel=INFO + links: + - redis + logging: + driver: awslogs + options: + awslogs-group: polymesh-harvester-dev + awslogs-region: us-east-2 + awslogs-stream-prefix: worker + environment: *env + + harvester-beat: + image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest + volumes: + - "/usr/src/app" + - "/usr/src/app/data" + links: + - redis + command: celery -A app.tasks beat --loglevel=INFO --schedule="data/celerybeat-schedule" --pidfile="data/celerybeat.pid" + logging: + driver: awslogs + options: + awslogs-group: polymesh-harvester-dev + awslogs-region: us-east-2 + awslogs-stream-prefix: beat + environment: *env + + harvester-monitor: + image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest + ports: + - "5555:5555" + links: + - redis + command: flower -A app.tasks --port=5555 --broker=redis://redis:6379/0 + logging: + driver: awslogs + options: + awslogs-group: polymesh-harvester-dev + awslogs-region: us-east-2 + awslogs-stream-prefix: monitor + + redis: + image: redis:3.2.11 + ports: + - 6379:6379 + hostname: redis + logging: + driver: awslogs + options: + awslogs-group: polymesh-harvester-dev + awslogs-region: us-east-2 + awslogs-stream-prefix: redis diff --git a/pm-harvester/docker-compose-local.yml b/pm-harvester/docker-compose-local.yml new file mode 100644 index 00000000..48cb3f1d --- /dev/null +++ b/pm-harvester/docker-compose-local.yml @@ -0,0 +1,72 @@ +version: "3.2" + +services: + harvester-api: + build: . + image: &app polymesh-harvester:latest + ports: + - "8000:8000" + volumes: + - ".:/usr/src/app" + command: ./start.sh + environment: &env + - CELERY_BROKER=redis://redis:6379/0 + - CELERY_BACKEND=redis://redis:6379/0 + - PYTHONPATH=/usr/src/app + - TYPE_REGISTRY=polymesh + - SUBSTRATE_ADDRESS_TYPE=42 + - SUBSTRATE_STORAGE_INDICES=Accounts + - NEW_SESSION_EVENT_HANDLER=True + - ENVIRONMENT=${ENVIRONMENT} + - DB_HOST=${DB_HOST} + - DB_PORT=${DB_PORT} + - DB_USERNAME=${DB_USERNAME} + - DB_PASSWORD=${DB_PASSWORD} + - DB_NAME=${DB_NAME} + - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} + depends_on: + - redis + - mysql + + harvester-worker: + build: . + image: *app + volumes: + - ".:/usr/src/app" + command: celery -A app.tasks worker --loglevel=INFO + environment: *env + depends_on: + - redis + - mysql + + harvester-beat: + build: . + image: *app + volumes: + - ".:/usr/src/app" + command: celery -A app.tasks beat --loglevel=INFO --schedule="data/celerybeat-schedule" --pidfile="data/celerybeat.pid" + environment: *env + depends_on: + - redis + + harvester-monitor: + build: . + image: *app + ports: + - "5555:5555" + command: flower -A app.tasks --port=5555 --broker=redis://redis:6379/0 + depends_on: + - redis + + redis: + image: redis:3.2.11 + + mysql: + image: mysql:latest + volumes: + - "./data/mysql:/var/lib/mysql" + ports: + - "33061:3306" + environment: + - MYSQL_ROOT_PASSWORD=root + - MYSQL_DATABASE=polkascan diff --git a/pm-harvester/docker-compose-test.yml b/pm-harvester/docker-compose-test.yml new file mode 100644 index 00000000..16df1cef --- /dev/null +++ b/pm-harvester/docker-compose-test.yml @@ -0,0 +1,91 @@ +version: "3" + +services: + harvester-api: + image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest + hostname: harvester-api + ports: + - "8000:8000" + volumes: + - "/usr/src/app" + command: ./start.sh + links: + - redis + logging: + driver: awslogs + options: + awslogs-group: polymesh-harvester-test + awslogs-region: us-east-2 + awslogs-stream-prefix: harvester-api + environment: &env + - CELERY_BROKER=redis://redis:6379/0 + - CELERY_BACKEND=redis://redis:6379/0 + - PYTHONPATH=/usr/src/app + - TYPE_REGISTRY=polymesh + - SUBSTRATE_ADDRESS_TYPE=42 + - SUBSTRATE_STORAGE_INDICES=Accounts + - NEW_SESSION_EVENT_HANDLER=True + - ENVIRONMENT=${ENVIRONMENT} + - DB_HOST=${DB_HOST} + - DB_PORT=${DB_PORT} + - DB_USERNAME=${DB_USERNAME} + - DB_PASSWORD=${DB_PASSWORD} + - DB_NAME=${DB_NAME} + - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} + + harvester-worker: + image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest + volumes: + - "/usr/src/app" + command: celery -A app.tasks worker --concurrency=8 --loglevel=INFO + links: + - redis + logging: + driver: awslogs + options: + awslogs-group: polymesh-harvester-test + awslogs-region: us-east-2 + awslogs-stream-prefix: worker + environment: *env + + harvester-beat: + image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest + volumes: + - "/usr/src/app" + - "/usr/src/app/data" + links: + - redis + command: celery -A app.tasks beat --loglevel=INFO --schedule="data/celerybeat-schedule" --pidfile="data/celerybeat.pid" + logging: + driver: awslogs + options: + awslogs-group: polymesh-harvester-test + awslogs-region: us-east-2 + awslogs-stream-prefix: beat + environment: *env + + harvester-monitor: + image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest + ports: + - "5555:5555" + links: + - redis + command: flower -A app.tasks --port=5555 --broker=redis://redis:6379/0 + logging: + driver: awslogs + options: + awslogs-group: polymesh-harvester-test + awslogs-region: us-east-2 + awslogs-stream-prefix: monitor + + redis: + image: redis:3.2.11 + ports: + - 6379:6379 + hostname: redis + logging: + driver: awslogs + options: + awslogs-group: polymesh-harvester-test + awslogs-region: us-east-2 + awslogs-stream-prefix: redis diff --git a/pm-harvester/docker-compose.yml b/pm-harvester/docker-compose.yml new file mode 100644 index 00000000..d2f09d34 --- /dev/null +++ b/pm-harvester/docker-compose.yml @@ -0,0 +1,91 @@ +version: "3" + +services: + harvester-api: + image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest + hostname: harvester-api + ports: + - "8000:8000" + volumes: + - "/usr/src/app" + command: ./start.sh + links: + - redis + logging: + driver: awslogs + options: + awslogs-group: polymesh-harvester + awslogs-region: us-east-2 + awslogs-stream-prefix: harvester-api + environment: &env + - CELERY_BROKER=redis://redis:6379/0 + - CELERY_BACKEND=redis://redis:6379/0 + - PYTHONPATH=/usr/src/app + - TYPE_REGISTRY=polymesh + - SUBSTRATE_ADDRESS_TYPE=42 + - SUBSTRATE_STORAGE_INDICES=Accounts + - NEW_SESSION_EVENT_HANDLER=True + - ENVIRONMENT=${ENVIRONMENT} + - DB_HOST=${DB_HOST} + - DB_PORT=${DB_PORT} + - DB_USERNAME=${DB_USERNAME} + - DB_PASSWORD=${DB_PASSWORD} + - DB_NAME=${DB_NAME} + - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} + + harvester-worker: + image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest + volumes: + - "/usr/src/app" + command: celery -A app.tasks worker --concurrency=4 --loglevel=INFO + links: + - redis + logging: + driver: awslogs + options: + awslogs-group: polymesh-harvester + awslogs-region: us-east-2 + awslogs-stream-prefix: worker + environment: *env + + harvester-beat: + image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest + volumes: + - "/usr/src/app" + - "/usr/src/app/data" + links: + - redis + command: celery -A app.tasks beat --loglevel=INFO --schedule="data/celerybeat-schedule" --pidfile="data/celerybeat.pid" + logging: + driver: awslogs + options: + awslogs-group: polymesh-harvester + awslogs-region: us-east-2 + awslogs-stream-prefix: beat + environment: *env + + harvester-monitor: + image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest + ports: + - "5555:5555" + links: + - redis + command: flower -A app.tasks --port=5555 --broker=redis://redis:6379/0 + logging: + driver: awslogs + options: + awslogs-group: polymesh-harvester + awslogs-region: us-east-2 + awslogs-stream-prefix: monitor + + redis: + image: redis:3.2.11 + ports: + - 6379:6379 + hostname: redis + logging: + driver: awslogs + options: + awslogs-group: polymesh-harvester + awslogs-region: us-east-2 + awslogs-stream-prefix: redis diff --git a/pm-harvester/requirements.txt b/pm-harvester/requirements.txt new file mode 100644 index 00000000..f93edfd8 --- /dev/null +++ b/pm-harvester/requirements.txt @@ -0,0 +1,51 @@ +alembic==1.1.0 +amqp==2.6.0 +atomicwrites==1.3.0 +attrs==19.1.0 +Babel==2.6.0 +base58==2.0.1 +celery==4.4.6 +certifi==2019.6.16 +chardet==3.0.4 +dictalchemy==0.1.2.7 +falcon==1.4.1 +flower==0.9.4 +greenlet==0.4.15 +gunicorn==19.9.0 +idna==2.8 +jsonschema==2.6.0 +Mako==1.0.8 +MarkupSafe==1.1.1 +meinheld==1.0.2 +more-itertools==6.0.0 +mysql-connector-python==8.0.15 +packaging==19.1 +pluggy==0.9.0 +protobuf==3.6.1 +py==1.8.0 +pyparsing==2.4.2 +pytest==4.3.1 +python-dateutil==2.8.0 +python-editor==1.0.4 +python-mimeparse==1.6.0 +pytz==2018.9 +redis==3.5.3 +requests==2.24.0 +requests-mock==1.7.0 +six==1.12.0 +SQLAlchemy==1.3.8 +tornado==5.1.1 +urllib3==1.25.10 +xxhash==1.3.0 + +# Development +docker==4.2.0 +asyncio==3.4.3 +websockets==8.1 +pydevd-pycharm + +py-sr25519-bindings>=0.1.2 +py-bip39-bindings>=0.1.6 + +polymath-scalecodec==3.0.2 +polymath-substrate-interface==3.0.2 diff --git a/pm-harvester/start.sh b/pm-harvester/start.sh new file mode 100755 index 00000000..56edacd7 --- /dev/null +++ b/pm-harvester/start.sh @@ -0,0 +1,33 @@ +#! /usr/bin/env sh + +if [ -z $ENVIRONMENT ] || [ "$ENVIRONMENT" = "dev" ]; then + ENVIRONMENT="dev" +fi + +echo "===========================" +echo "Environment: $ENVIRONMENT" +echo "===========================" + +if [ "$ENVIRONMENT" = "prod" ]; then + echo "Wait for database..." + # Let the DB start + sleep 10; +fi + +# Set path +export PYTHONPATH=$PYTHONPATH:$PWD:$PWD/py-substrate-interface/:$PWD/py-scale-codec/ + +echo "Running migrations..." + +# Run migrations +alembic upgrade head + +echo "Running gunicorn..." + +if [ "$ENVIRONMENT" = "dev" ]; then + gunicorn -b 0.0.0.0:8000 --workers=2 app.main:app --reload --timeout 600 +fi + +if [ "$ENVIRONMENT" = "prod" ]; then + gunicorn -b 0.0.0.0:8000 --workers=5 app.main:app --worker-class="egg:meinheld#gunicorn_worker" +fi diff --git a/py-scale-codec/.github/workflows/deploy.yml b/py-scale-codec/.github/workflows/deploy.yml new file mode 100644 index 00000000..d46886b1 --- /dev/null +++ b/py-scale-codec/.github/workflows/deploy.yml @@ -0,0 +1,40 @@ +name: Test and Deploy + +on: + release: + types: [created] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v1 + with: + python-version: "3.x" + - name: Install project dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Lint with flake8 + run: | + pip install flake8 + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + pip install pytest + pytest + - name: Install deploy dependencies + run: | + pip install setuptools wheel twine + - name: Build and publish + env: + TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: | + python setup.py sdist bdist_wheel + twine upload dist/* diff --git a/py-scale-codec/.github/workflows/test.yml b/py-scale-codec/.github/workflows/test.yml new file mode 100644 index 00000000..152bcf98 --- /dev/null +++ b/py-scale-codec/.github/workflows/test.yml @@ -0,0 +1,32 @@ +name: Test + +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.6, 3.7] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Lint with flake8 + run: | + pip install flake8 + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + pip install pytest + pytest diff --git a/py-scale-codec/.gitignore b/py-scale-codec/.gitignore new file mode 100644 index 00000000..0642a920 --- /dev/null +++ b/py-scale-codec/.gitignore @@ -0,0 +1,105 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +/.idea diff --git a/py-scale-codec/.travis.yml b/py-scale-codec/.travis.yml new file mode 100644 index 00000000..95a33349 --- /dev/null +++ b/py-scale-codec/.travis.yml @@ -0,0 +1,3 @@ +language: python +python: 3.6 +script: pytest diff --git a/py-scale-codec/LICENSE b/py-scale-codec/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/py-scale-codec/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/py-scale-codec/README.md b/py-scale-codec/README.md new file mode 100644 index 00000000..a66745a9 --- /dev/null +++ b/py-scale-codec/README.md @@ -0,0 +1,101 @@ +#### This project is forked from https://github.com/polkascan/py-scale-codec + +# Python Polymath SCALE Codec + +[![Latest Version](https://img.shields.io/pypi/v/polymath-scalecodec.svg)](https://pypi.org/project/polymath-scalecodec) +[![Supported Python versions](https://img.shields.io/pypi/pyversions/polymath-scalecodec.svg)](https://pypi.org/project/polymath-scalecodec/) + +Python Polymath SCALE Codec Library + +## Description + +Most of the data that the Substrate RPCs output is encoded with the SCALE Codec. This codec is used by the Substrate nodes' internal runtime. In order to get to meaningful data this data will need to be decoded. The Python SCALE Codec Library will specialize in this task. + +## Documentation + +https://polkascan.github.io/py-scale-codec/ + +## Installation + +```bash +pip install polymath-scalecodec +``` + +## Examples + +Decode a SCALE-encoded Compact\ + +```python +RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) +RuntimeConfiguration().update_type_registry(load_type_registry_preset("kusama")) +obj = ScaleDecoder.get_decoder_class('Compact', ScaleBytes("0x130080cd103d71bc22")) +obj.decode() +print(obj.value) +``` + +Encode to Compact\ + +```python +RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) +obj = ScaleDecoder.get_decoder_class('Compact') +scale_data = obj.encode(2503000000000000000) +print(scale_data) +``` + +Encode to Vec\ + +```python +RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) +value = ['test', 'vec'] +obj = ScaleDecoder.get_decoder_class('Vec') +scale_data = obj.encode(value) +print(scale_data) +``` + +Add custom types to type registry + +```python +RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) + +custom_types = { + "types": { + "MyCustomType": "u32", + "CustomNextAuthority": { + "type": "struct", + "type_mapping": [ + ["AuthorityId", "AuthorityId"], + ["weight", "AuthorityWeight"] + ] + } + } +} + +RuntimeConfiguration().update_type_registry(custom_types) +``` + +Or from a custom JSON file + +```python +RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) +RuntimeConfiguration().update_type_registry(load_type_registry_file("/path/to/type_registry.json")) +``` + +## Using the type registry updater in your application + +To ensure the type registries are in sync with the current runtime of the blockchain, you can use +the updater function in your application: + +```python +from scalecodec.updater import update_type_registries + +# Update type registries with latest version from Github +try: + update_type_registries() +except Exception: + pass +``` + + +## License + +https://github.com/PolymathNetwork/py-scale-codec/blob/master/LICENSE diff --git a/py-scale-codec/docs/_config.yml b/py-scale-codec/docs/_config.yml new file mode 100644 index 00000000..2f7efbea --- /dev/null +++ b/py-scale-codec/docs/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-minimal \ No newline at end of file diff --git a/py-scale-codec/docs/base.html b/py-scale-codec/docs/base.html new file mode 100644 index 00000000..39fd9ec8 --- /dev/null +++ b/py-scale-codec/docs/base.html @@ -0,0 +1,1411 @@ + + + + + + +scalecodec.base API documentation + + + + + + + + + +
+
+
+

Module scalecodec.base

+
+
+
+ +Expand source code + +
# Python SCALE Codec Library
+#
+# Copyright 2018-2019 openAware BV (NL).
+# This file is part of Polkascan.
+#
+# Polkascan is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Polkascan is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Polkascan. If not, see <http://www.gnu.org/licenses/>.
+
+import re
+from abc import ABC, abstractmethod
+
+from scalecodec.exceptions import RemainingScaleBytesNotEmptyException, InvalidScaleTypeValueException
+
+
+class Singleton(type):
+    _instances = {}
+
+    def __call__(cls, *args, **kwargs):
+        if cls not in cls._instances:
+            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
+        return cls._instances[cls]
+
+
+class RuntimeConfiguration(metaclass=Singleton):
+
+    @classmethod
+    def all_subclasses(cls, class_):
+        return set(class_.__subclasses__()).union(
+            [s for c in class_.__subclasses__() for s in cls.all_subclasses(c)])
+
+    def __init__(self):
+        self.type_registry = {}
+        self.clear_type_registry()
+        self.active_spec_version_id = None
+
+    def get_decoder_class(self, type_string, spec_version_id='default'):
+        # TODO move ScaleDecoder.get_decoder_class logic to here
+        return self.type_registry.get('types', {}).get(type_string.lower(), None)
+
+    def clear_type_registry(self):
+        self.type_registry = {'types': {cls.type_string.lower(): cls for cls in self.all_subclasses(ScaleDecoder) if
+                                        cls.type_string}}
+        self.type_registry['types'].update({cls.__name__.lower(): cls for cls in self.all_subclasses(ScaleDecoder)})
+
+    def update_type_registry_types(self, types_dict):
+        from scalecodec.types import Enum, Struct, Set
+
+        for type_string, decoder_class_data in types_dict.items():
+
+            if type(decoder_class_data) == dict:
+                # Create dynamic decoder class
+                if decoder_class_data['type'] == 'struct':
+
+                    decoder_class = type(type_string, (Struct,), {'type_mapping': decoder_class_data['type_mapping']})
+
+                elif decoder_class_data['type'] == 'enum':
+
+                    decoder_class = type(type_string, (Enum,), {
+                        'value_list': decoder_class_data.get('value_list'),
+                        'type_mapping': decoder_class_data.get('type_mapping')
+                    })
+
+                elif decoder_class_data['type'] == 'set':
+
+                    decoder_class = type(type_string, (Set,), {
+                        'value_list': decoder_class_data.get('value_list'),
+                    })
+
+                else:
+                    raise NotImplementedError("Dynamic decoding type '{}' not supported".format(
+                        decoder_class_data['type'])
+                    )
+            else:
+                decoder_class = self.get_decoder_class(decoder_class_data)
+
+            self.type_registry['types'][type_string.lower()] = decoder_class
+
+    def update_type_registry(self, type_registry):
+
+        # Set runtime ID if set
+        self.active_spec_version_id = type_registry.get('runtime_id')
+
+        # Set versioning
+        if 'versioning' in type_registry:
+            self.type_registry['versioning'] = type_registry.get('versioning')
+
+        # Update types
+        if 'types' in type_registry:
+            self.update_type_registry_types(type_registry.get('types'))
+
+    def set_active_spec_version_id(self, spec_version_id):
+
+        if spec_version_id != self.active_spec_version_id:
+
+            self.active_spec_version_id = spec_version_id
+
+            # Updated type registry with versioned types
+            for versioning_item in self.type_registry.get('versioning', []):
+                # Check if versioning item is in current version range
+                if versioning_item['runtime_range'][0] <= spec_version_id and \
+                        (not versioning_item['runtime_range'][1] or versioning_item['runtime_range'][1] >= spec_version_id):
+                    # Update types in type registry
+                    self.update_type_registry_types(versioning_item['types'])
+
+
+class ScaleBytes:
+
+    def __init__(self, data):
+        self.offset = 0
+
+        if type(data) is bytearray:
+            self.data = data
+        elif data[0:2] == '0x':
+            self.data = bytearray.fromhex(data[2:])
+        else:
+            raise ValueError("Provided data is not in supported format: provided '{}'".format(type(data)))
+
+        self.length = len(self.data)
+
+    def get_next_bytes(self, length):
+        data = self.data[self.offset:self.offset + length]
+        self.offset += length
+        return data
+
+    def get_remaining_bytes(self):
+        data = self.data[self.offset:]
+        self.offset = self.length
+        return data
+
+    def get_remaining_length(self):
+        return self.length - self.offset
+
+    def reset(self):
+        self.offset = 0
+
+    def __str__(self):
+        return "0x{}".format(self.data.hex())
+
+    def __add__(self, data):
+
+        if type(data) == ScaleBytes:
+            return ScaleBytes(self.data + data.data)
+
+        if type(data) == bytes:
+            data = bytearray(data)
+        elif type(data) == str and data[0:2] == '0x':
+            data = bytearray.fromhex(data[2:])
+
+        if type(data) == bytearray:
+            return ScaleBytes(self.data + data)
+
+
+class ScaleDecoder(ABC):
+
+    type_string = None
+
+    type_mapping = None
+
+    debug = False
+
+    def __init__(self, data, sub_type=None):
+
+        self.sub_type = sub_type
+
+        if self.type_mapping is None and self.type_string:
+            self.build_type_mapping()
+
+        if data:
+            assert(type(data) == ScaleBytes)
+
+        self.data = data
+        self.raw_value = ''
+        self.value = None
+
+    @classmethod
+    def build_type_mapping(cls):
+
+        if cls.type_string and cls.type_string[0] == '(' and cls.type_string[-1] == ')':
+            type_mapping = ()
+            n = 1
+            for struct_element in cls.type_string[1:-1].split(','):
+                type_mapping += (('col{}'.format(n), struct_element.strip()),)
+                n += 1
+
+            cls.type_mapping = type_mapping
+
+    def get_next_bytes(self, length):
+        data = self.data.get_next_bytes(length)
+        self.raw_value += data.hex()
+        return data
+
+    def get_next_u8(self):
+        return int.from_bytes(self.get_next_bytes(1), byteorder='little')
+
+    def get_next_bool(self):
+        data = self.get_next_bytes(1)
+        if data not in [b'\x00', b'\x01']:
+            raise InvalidScaleTypeValueException('Invalid value for datatype "bool"')
+        return data == b'\x01'
+
+    def get_remaining_bytes(self):
+        data = self.data.get_remaining_bytes()
+        self.raw_value += data.hex()
+        return data
+
+    @abstractmethod
+    def process(self):
+        pass
+
+    def decode(self, check_remaining=True):
+        self.value = self.process()
+
+        if check_remaining and self.data.offset != self.data.length:
+            raise RemainingScaleBytesNotEmptyException('Current offset: {} / length: {}'.format(self.data.offset, self.data.length))
+
+        return self.value
+
+    def __str__(self):
+        return str(self.value) or ''
+
+    def encode(self, value):
+        self.data = self.process_encode(value)
+        return self.data
+
+    def process_encode(self, value):
+        raise NotImplementedError("Encoding not implemented for this ScaleType")
+
+    @classmethod
+    def get_decoder_class(cls, type_string, data=None, **kwargs):
+
+        type_parts = None
+
+        type_string = cls.convert_type(type_string)
+
+        if type_string[-1:] == '>':
+            # Check for specific implementation for composite type
+            decoder_class = RuntimeConfiguration().get_decoder_class(
+                type_string.lower(),
+                spec_version_id=kwargs.get('spec_version_id', 'default')
+            )
+
+            if decoder_class:
+                return decoder_class(data, **kwargs)
+
+            # Extract sub types
+            type_parts = re.match(r'^([^<]*)<(.+)>$', type_string)
+
+            if type_parts:
+                type_parts = type_parts.groups()
+
+        if type_parts:
+            decoder_class = RuntimeConfiguration().get_decoder_class(
+                type_parts[0].lower(),
+                spec_version_id=kwargs.get('spec_version_id', 'default')
+            )
+            if decoder_class:
+                return decoder_class(data, sub_type=type_parts[1], **kwargs)
+        else:
+            decoder_class = RuntimeConfiguration().get_decoder_class(
+                type_string.lower(),
+                spec_version_id=kwargs.get('spec_version_id', 'default')
+            )
+            if decoder_class:
+                return decoder_class(data, **kwargs)
+
+        # Custom tuple
+        # TODO tuples should be converted to list not dict
+        if type_string != '()' and type_string[0] == '(' and type_string[-1] == ')':
+            decoder_class = RuntimeConfiguration().get_decoder_class('struct')
+            decoder_class.type_string = type_string
+
+            decoder_class.build_type_mapping()
+
+            return decoder_class(data, **kwargs)
+
+        raise NotImplementedError('Decoder class for "{}" not found'.format(type_string))
+
+    # TODO rename to decode_type (confusing when encoding is introduced)
+    def process_type(self, type_string, **kwargs):
+        obj = self.get_decoder_class(type_string, self.data, **kwargs)
+        obj.decode(check_remaining=False)
+        if self.debug:
+            print('=======================\nClass:\t{}\nType:\t{}\nValue:\t{}\nRaw:\t{}\n\nOffset:\t{} / {}\n'.format(
+                self.__class__.__name__, type_string, obj.value, obj.raw_value, self.data.offset, self.data.length
+            ))
+        return obj
+
+    def serialize(self):
+        return self.value
+
+    # TODO convert to TYPE_ALIAS per class Address: TYPE_ALIAS = ('<Lookup as StaticLookup>::Source',)
+    @classmethod
+    def convert_type(cls, name):
+
+        name = re.sub(r'T::', "", name)
+        name = re.sub(r'<T>', "", name)
+        name = re.sub(r'<T as Trait>::', "", name)
+        name = re.sub(r'\n', "", name)
+
+        if name == '()':
+            return "Null"
+        if name == 'Vec<u8>':
+            return "Bytes"
+        if name == '<Lookup as StaticLookup>::Source':
+            return 'Address'
+        if name == 'Vec<<Lookup as StaticLookup>::Source>':
+            return 'Vec<Address>'
+        if name == '<Balance as HasCompact>::Type':
+            return 'Compact<Balance>'
+        if name == '<BlockNumber as HasCompact>::Type':
+            return 'Compact<BlockNumber>'
+        if name == '<Balance as HasCompact>::Type':
+            return 'Compact<Balance>'
+        if name == '<Moment as HasCompact>::Type':
+            return 'Compact<Moment>'
+        if name == '<InherentOfflineReport as InherentOfflineReport>::Inherent':
+            return 'InherentOfflineReport'
+
+        return name
+
+
+# TODO move type_string and sub_type behaviour to this sub class
+class ScaleType(ScaleDecoder, ABC):
+
+    def __init__(self, data=None, sub_type=None, metadata=None):
+        self.metadata = metadata
+        if not data:
+            data = ScaleBytes(bytearray())
+        super().__init__(data, sub_type)
+
+
+
+
+
+
+
+
+
+

Classes

+
+
+class RuntimeConfiguration +(*args, **kwargs) +
+
+
+
+ +Expand source code + +
class RuntimeConfiguration(metaclass=Singleton):
+
+    @classmethod
+    def all_subclasses(cls, class_):
+        return set(class_.__subclasses__()).union(
+            [s for c in class_.__subclasses__() for s in cls.all_subclasses(c)])
+
+    def __init__(self):
+        self.type_registry = {}
+        self.clear_type_registry()
+        self.active_spec_version_id = None
+
+    def get_decoder_class(self, type_string, spec_version_id='default'):
+        # TODO move ScaleDecoder.get_decoder_class logic to here
+        return self.type_registry.get('types', {}).get(type_string.lower(), None)
+
+    def clear_type_registry(self):
+        self.type_registry = {'types': {cls.type_string.lower(): cls for cls in self.all_subclasses(ScaleDecoder) if
+                                        cls.type_string}}
+        self.type_registry['types'].update({cls.__name__.lower(): cls for cls in self.all_subclasses(ScaleDecoder)})
+
+    def update_type_registry_types(self, types_dict):
+        from scalecodec.types import Enum, Struct, Set
+
+        for type_string, decoder_class_data in types_dict.items():
+
+            if type(decoder_class_data) == dict:
+                # Create dynamic decoder class
+                if decoder_class_data['type'] == 'struct':
+
+                    decoder_class = type(type_string, (Struct,), {'type_mapping': decoder_class_data['type_mapping']})
+
+                elif decoder_class_data['type'] == 'enum':
+
+                    decoder_class = type(type_string, (Enum,), {
+                        'value_list': decoder_class_data.get('value_list'),
+                        'type_mapping': decoder_class_data.get('type_mapping')
+                    })
+
+                elif decoder_class_data['type'] == 'set':
+
+                    decoder_class = type(type_string, (Set,), {
+                        'value_list': decoder_class_data.get('value_list'),
+                    })
+
+                else:
+                    raise NotImplementedError("Dynamic decoding type '{}' not supported".format(
+                        decoder_class_data['type'])
+                    )
+            else:
+                decoder_class = self.get_decoder_class(decoder_class_data)
+
+            self.type_registry['types'][type_string.lower()] = decoder_class
+
+    def update_type_registry(self, type_registry):
+
+        # Set runtime ID if set
+        self.active_spec_version_id = type_registry.get('runtime_id')
+
+        # Set versioning
+        if 'versioning' in type_registry:
+            self.type_registry['versioning'] = type_registry.get('versioning')
+
+        # Update types
+        if 'types' in type_registry:
+            self.update_type_registry_types(type_registry.get('types'))
+
+    def set_active_spec_version_id(self, spec_version_id):
+
+        if spec_version_id != self.active_spec_version_id:
+
+            self.active_spec_version_id = spec_version_id
+
+            # Updated type registry with versioned types
+            for versioning_item in self.type_registry.get('versioning', []):
+                # Check if versioning item is in current version range
+                if versioning_item['runtime_range'][0] <= spec_version_id and \
+                        (not versioning_item['runtime_range'][1] or versioning_item['runtime_range'][1] >= spec_version_id):
+                    # Update types in type registry
+                    self.update_type_registry_types(versioning_item['types'])
+
+

Static methods

+
+
+def all_subclasses(class_) +
+
+
+
+ +Expand source code + +
@classmethod
+def all_subclasses(cls, class_):
+    return set(class_.__subclasses__()).union(
+        [s for c in class_.__subclasses__() for s in cls.all_subclasses(c)])
+
+
+
+

Methods

+
+
+def clear_type_registry(self) +
+
+
+
+ +Expand source code + +
def clear_type_registry(self):
+    self.type_registry = {'types': {cls.type_string.lower(): cls for cls in self.all_subclasses(ScaleDecoder) if
+                                    cls.type_string}}
+    self.type_registry['types'].update({cls.__name__.lower(): cls for cls in self.all_subclasses(ScaleDecoder)})
+
+
+
+def get_decoder_class(self, type_string, spec_version_id='default') +
+
+
+
+ +Expand source code + +
def get_decoder_class(self, type_string, spec_version_id='default'):
+    # TODO move ScaleDecoder.get_decoder_class logic to here
+    return self.type_registry.get('types', {}).get(type_string.lower(), None)
+
+
+
+def set_active_spec_version_id(self, spec_version_id) +
+
+
+
+ +Expand source code + +
def set_active_spec_version_id(self, spec_version_id):
+
+    if spec_version_id != self.active_spec_version_id:
+
+        self.active_spec_version_id = spec_version_id
+
+        # Updated type registry with versioned types
+        for versioning_item in self.type_registry.get('versioning', []):
+            # Check if versioning item is in current version range
+            if versioning_item['runtime_range'][0] <= spec_version_id and \
+                    (not versioning_item['runtime_range'][1] or versioning_item['runtime_range'][1] >= spec_version_id):
+                # Update types in type registry
+                self.update_type_registry_types(versioning_item['types'])
+
+
+
+def update_type_registry(self, type_registry) +
+
+
+
+ +Expand source code + +
def update_type_registry(self, type_registry):
+
+    # Set runtime ID if set
+    self.active_spec_version_id = type_registry.get('runtime_id')
+
+    # Set versioning
+    if 'versioning' in type_registry:
+        self.type_registry['versioning'] = type_registry.get('versioning')
+
+    # Update types
+    if 'types' in type_registry:
+        self.update_type_registry_types(type_registry.get('types'))
+
+
+
+def update_type_registry_types(self, types_dict) +
+
+
+
+ +Expand source code + +
def update_type_registry_types(self, types_dict):
+    from scalecodec.types import Enum, Struct, Set
+
+    for type_string, decoder_class_data in types_dict.items():
+
+        if type(decoder_class_data) == dict:
+            # Create dynamic decoder class
+            if decoder_class_data['type'] == 'struct':
+
+                decoder_class = type(type_string, (Struct,), {'type_mapping': decoder_class_data['type_mapping']})
+
+            elif decoder_class_data['type'] == 'enum':
+
+                decoder_class = type(type_string, (Enum,), {
+                    'value_list': decoder_class_data.get('value_list'),
+                    'type_mapping': decoder_class_data.get('type_mapping')
+                })
+
+            elif decoder_class_data['type'] == 'set':
+
+                decoder_class = type(type_string, (Set,), {
+                    'value_list': decoder_class_data.get('value_list'),
+                })
+
+            else:
+                raise NotImplementedError("Dynamic decoding type '{}' not supported".format(
+                    decoder_class_data['type'])
+                )
+        else:
+            decoder_class = self.get_decoder_class(decoder_class_data)
+
+        self.type_registry['types'][type_string.lower()] = decoder_class
+
+
+
+
+
+class ScaleBytes +(data) +
+
+
+
+ +Expand source code + +
class ScaleBytes:
+
+    def __init__(self, data):
+        self.offset = 0
+
+        if type(data) is bytearray:
+            self.data = data
+        elif data[0:2] == '0x':
+            self.data = bytearray.fromhex(data[2:])
+        else:
+            raise ValueError("Provided data is not in supported format: provided '{}'".format(type(data)))
+
+        self.length = len(self.data)
+
+    def get_next_bytes(self, length):
+        data = self.data[self.offset:self.offset + length]
+        self.offset += length
+        return data
+
+    def get_remaining_bytes(self):
+        data = self.data[self.offset:]
+        self.offset = self.length
+        return data
+
+    def get_remaining_length(self):
+        return self.length - self.offset
+
+    def reset(self):
+        self.offset = 0
+
+    def __str__(self):
+        return "0x{}".format(self.data.hex())
+
+    def __add__(self, data):
+
+        if type(data) == ScaleBytes:
+            return ScaleBytes(self.data + data.data)
+
+        if type(data) == bytes:
+            data = bytearray(data)
+        elif type(data) == str and data[0:2] == '0x':
+            data = bytearray.fromhex(data[2:])
+
+        if type(data) == bytearray:
+            return ScaleBytes(self.data + data)
+
+

Methods

+
+
+def get_next_bytes(self, length) +
+
+
+
+ +Expand source code + +
def get_next_bytes(self, length):
+    data = self.data[self.offset:self.offset + length]
+    self.offset += length
+    return data
+
+
+
+def get_remaining_bytes(self) +
+
+
+
+ +Expand source code + +
def get_remaining_bytes(self):
+    data = self.data[self.offset:]
+    self.offset = self.length
+    return data
+
+
+
+def get_remaining_length(self) +
+
+
+
+ +Expand source code + +
def get_remaining_length(self):
+    return self.length - self.offset
+
+
+
+def reset(self) +
+
+
+
+ +Expand source code + +
def reset(self):
+    self.offset = 0
+
+
+
+
+
+class ScaleDecoder +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ScaleDecoder(ABC):
+
+    type_string = None
+
+    type_mapping = None
+
+    debug = False
+
+    def __init__(self, data, sub_type=None):
+
+        self.sub_type = sub_type
+
+        if self.type_mapping is None and self.type_string:
+            self.build_type_mapping()
+
+        if data:
+            assert(type(data) == ScaleBytes)
+
+        self.data = data
+        self.raw_value = ''
+        self.value = None
+
+    @classmethod
+    def build_type_mapping(cls):
+
+        if cls.type_string and cls.type_string[0] == '(' and cls.type_string[-1] == ')':
+            type_mapping = ()
+            n = 1
+            for struct_element in cls.type_string[1:-1].split(','):
+                type_mapping += (('col{}'.format(n), struct_element.strip()),)
+                n += 1
+
+            cls.type_mapping = type_mapping
+
+    def get_next_bytes(self, length):
+        data = self.data.get_next_bytes(length)
+        self.raw_value += data.hex()
+        return data
+
+    def get_next_u8(self):
+        return int.from_bytes(self.get_next_bytes(1), byteorder='little')
+
+    def get_next_bool(self):
+        data = self.get_next_bytes(1)
+        if data not in [b'\x00', b'\x01']:
+            raise InvalidScaleTypeValueException('Invalid value for datatype "bool"')
+        return data == b'\x01'
+
+    def get_remaining_bytes(self):
+        data = self.data.get_remaining_bytes()
+        self.raw_value += data.hex()
+        return data
+
+    @abstractmethod
+    def process(self):
+        pass
+
+    def decode(self, check_remaining=True):
+        self.value = self.process()
+
+        if check_remaining and self.data.offset != self.data.length:
+            raise RemainingScaleBytesNotEmptyException('Current offset: {} / length: {}'.format(self.data.offset, self.data.length))
+
+        return self.value
+
+    def __str__(self):
+        return str(self.value) or ''
+
+    def encode(self, value):
+        self.data = self.process_encode(value)
+        return self.data
+
+    def process_encode(self, value):
+        raise NotImplementedError("Encoding not implemented for this ScaleType")
+
+    @classmethod
+    def get_decoder_class(cls, type_string, data=None, **kwargs):
+
+        type_parts = None
+
+        type_string = cls.convert_type(type_string)
+
+        if type_string[-1:] == '>':
+            # Check for specific implementation for composite type
+            decoder_class = RuntimeConfiguration().get_decoder_class(
+                type_string.lower(),
+                spec_version_id=kwargs.get('spec_version_id', 'default')
+            )
+
+            if decoder_class:
+                return decoder_class(data, **kwargs)
+
+            # Extract sub types
+            type_parts = re.match(r'^([^<]*)<(.+)>$', type_string)
+
+            if type_parts:
+                type_parts = type_parts.groups()
+
+        if type_parts:
+            decoder_class = RuntimeConfiguration().get_decoder_class(
+                type_parts[0].lower(),
+                spec_version_id=kwargs.get('spec_version_id', 'default')
+            )
+            if decoder_class:
+                return decoder_class(data, sub_type=type_parts[1], **kwargs)
+        else:
+            decoder_class = RuntimeConfiguration().get_decoder_class(
+                type_string.lower(),
+                spec_version_id=kwargs.get('spec_version_id', 'default')
+            )
+            if decoder_class:
+                return decoder_class(data, **kwargs)
+
+        # Custom tuple
+        # TODO tuples should be converted to list not dict
+        if type_string != '()' and type_string[0] == '(' and type_string[-1] == ')':
+            decoder_class = RuntimeConfiguration().get_decoder_class('struct')
+            decoder_class.type_string = type_string
+
+            decoder_class.build_type_mapping()
+
+            return decoder_class(data, **kwargs)
+
+        raise NotImplementedError('Decoder class for "{}" not found'.format(type_string))
+
+    # TODO rename to decode_type (confusing when encoding is introduced)
+    def process_type(self, type_string, **kwargs):
+        obj = self.get_decoder_class(type_string, self.data, **kwargs)
+        obj.decode(check_remaining=False)
+        if self.debug:
+            print('=======================\nClass:\t{}\nType:\t{}\nValue:\t{}\nRaw:\t{}\n\nOffset:\t{} / {}\n'.format(
+                self.__class__.__name__, type_string, obj.value, obj.raw_value, self.data.offset, self.data.length
+            ))
+        return obj
+
+    def serialize(self):
+        return self.value
+
+    # TODO convert to TYPE_ALIAS per class Address: TYPE_ALIAS = ('<Lookup as StaticLookup>::Source',)
+    @classmethod
+    def convert_type(cls, name):
+
+        name = re.sub(r'T::', "", name)
+        name = re.sub(r'<T>', "", name)
+        name = re.sub(r'<T as Trait>::', "", name)
+        name = re.sub(r'\n', "", name)
+
+        if name == '()':
+            return "Null"
+        if name == 'Vec<u8>':
+            return "Bytes"
+        if name == '<Lookup as StaticLookup>::Source':
+            return 'Address'
+        if name == 'Vec<<Lookup as StaticLookup>::Source>':
+            return 'Vec<Address>'
+        if name == '<Balance as HasCompact>::Type':
+            return 'Compact<Balance>'
+        if name == '<BlockNumber as HasCompact>::Type':
+            return 'Compact<BlockNumber>'
+        if name == '<Balance as HasCompact>::Type':
+            return 'Compact<Balance>'
+        if name == '<Moment as HasCompact>::Type':
+            return 'Compact<Moment>'
+        if name == '<InherentOfflineReport as InherentOfflineReport>::Inherent':
+            return 'InherentOfflineReport'
+
+        return name
+
+

Ancestors

+
    +
  • abc.ABC
  • +
+

Subclasses

+ +

Class variables

+
+
var debug
+
+

bool(x) -> bool

+

Returns True when the argument x is true, False otherwise. +The builtins True and False are the only two instances of the class bool. +The class bool is a subclass of the class int, and cannot be subclassed.

+
+
var type_mapping
+
+
+
+
var type_string
+
+
+
+
+

Static methods

+
+
+def build_type_mapping() +
+
+
+
+ +Expand source code + +
@classmethod
+def build_type_mapping(cls):
+
+    if cls.type_string and cls.type_string[0] == '(' and cls.type_string[-1] == ')':
+        type_mapping = ()
+        n = 1
+        for struct_element in cls.type_string[1:-1].split(','):
+            type_mapping += (('col{}'.format(n), struct_element.strip()),)
+            n += 1
+
+        cls.type_mapping = type_mapping
+
+
+
+def convert_type(name) +
+
+
+
+ +Expand source code + +
@classmethod
+def convert_type(cls, name):
+
+    name = re.sub(r'T::', "", name)
+    name = re.sub(r'<T>', "", name)
+    name = re.sub(r'<T as Trait>::', "", name)
+    name = re.sub(r'\n', "", name)
+
+    if name == '()':
+        return "Null"
+    if name == 'Vec<u8>':
+        return "Bytes"
+    if name == '<Lookup as StaticLookup>::Source':
+        return 'Address'
+    if name == 'Vec<<Lookup as StaticLookup>::Source>':
+        return 'Vec<Address>'
+    if name == '<Balance as HasCompact>::Type':
+        return 'Compact<Balance>'
+    if name == '<BlockNumber as HasCompact>::Type':
+        return 'Compact<BlockNumber>'
+    if name == '<Balance as HasCompact>::Type':
+        return 'Compact<Balance>'
+    if name == '<Moment as HasCompact>::Type':
+        return 'Compact<Moment>'
+    if name == '<InherentOfflineReport as InherentOfflineReport>::Inherent':
+        return 'InherentOfflineReport'
+
+    return name
+
+
+
+def get_decoder_class(type_string, data=None, **kwargs) +
+
+
+
+ +Expand source code + +
@classmethod
+def get_decoder_class(cls, type_string, data=None, **kwargs):
+
+    type_parts = None
+
+    type_string = cls.convert_type(type_string)
+
+    if type_string[-1:] == '>':
+        # Check for specific implementation for composite type
+        decoder_class = RuntimeConfiguration().get_decoder_class(
+            type_string.lower(),
+            spec_version_id=kwargs.get('spec_version_id', 'default')
+        )
+
+        if decoder_class:
+            return decoder_class(data, **kwargs)
+
+        # Extract sub types
+        type_parts = re.match(r'^([^<]*)<(.+)>$', type_string)
+
+        if type_parts:
+            type_parts = type_parts.groups()
+
+    if type_parts:
+        decoder_class = RuntimeConfiguration().get_decoder_class(
+            type_parts[0].lower(),
+            spec_version_id=kwargs.get('spec_version_id', 'default')
+        )
+        if decoder_class:
+            return decoder_class(data, sub_type=type_parts[1], **kwargs)
+    else:
+        decoder_class = RuntimeConfiguration().get_decoder_class(
+            type_string.lower(),
+            spec_version_id=kwargs.get('spec_version_id', 'default')
+        )
+        if decoder_class:
+            return decoder_class(data, **kwargs)
+
+    # Custom tuple
+    # TODO tuples should be converted to list not dict
+    if type_string != '()' and type_string[0] == '(' and type_string[-1] == ')':
+        decoder_class = RuntimeConfiguration().get_decoder_class('struct')
+        decoder_class.type_string = type_string
+
+        decoder_class.build_type_mapping()
+
+        return decoder_class(data, **kwargs)
+
+    raise NotImplementedError('Decoder class for "{}" not found'.format(type_string))
+
+
+
+

Methods

+
+
+def decode(self, check_remaining=True) +
+
+
+
+ +Expand source code + +
def decode(self, check_remaining=True):
+    self.value = self.process()
+
+    if check_remaining and self.data.offset != self.data.length:
+        raise RemainingScaleBytesNotEmptyException('Current offset: {} / length: {}'.format(self.data.offset, self.data.length))
+
+    return self.value
+
+
+
+def encode(self, value) +
+
+
+
+ +Expand source code + +
def encode(self, value):
+    self.data = self.process_encode(value)
+    return self.data
+
+
+
+def get_next_bool(self) +
+
+
+
+ +Expand source code + +
def get_next_bool(self):
+    data = self.get_next_bytes(1)
+    if data not in [b'\x00', b'\x01']:
+        raise InvalidScaleTypeValueException('Invalid value for datatype "bool"')
+    return data == b'\x01'
+
+
+
+def get_next_bytes(self, length) +
+
+
+
+ +Expand source code + +
def get_next_bytes(self, length):
+    data = self.data.get_next_bytes(length)
+    self.raw_value += data.hex()
+    return data
+
+
+
+def get_next_u8(self) +
+
+
+
+ +Expand source code + +
def get_next_u8(self):
+    return int.from_bytes(self.get_next_bytes(1), byteorder='little')
+
+
+
+def get_remaining_bytes(self) +
+
+
+
+ +Expand source code + +
def get_remaining_bytes(self):
+    data = self.data.get_remaining_bytes()
+    self.raw_value += data.hex()
+    return data
+
+
+
+def process(self) +
+
+
+
+ +Expand source code + +
@abstractmethod
+def process(self):
+    pass
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    raise NotImplementedError("Encoding not implemented for this ScaleType")
+
+
+
+def process_type(self, type_string, **kwargs) +
+
+
+
+ +Expand source code + +
def process_type(self, type_string, **kwargs):
+    obj = self.get_decoder_class(type_string, self.data, **kwargs)
+    obj.decode(check_remaining=False)
+    if self.debug:
+        print('=======================\nClass:\t{}\nType:\t{}\nValue:\t{}\nRaw:\t{}\n\nOffset:\t{} / {}\n'.format(
+            self.__class__.__name__, type_string, obj.value, obj.raw_value, self.data.offset, self.data.length
+        ))
+    return obj
+
+
+
+def serialize(self) +
+
+
+
+ +Expand source code + +
def serialize(self):
+    return self.value
+
+
+
+
+
+class ScaleType +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ScaleType(ScaleDecoder, ABC):
+
+    def __init__(self, data=None, sub_type=None, metadata=None):
+        self.metadata = metadata
+        if not data:
+            data = ScaleBytes(bytearray())
+        super().__init__(data, sub_type)
+
+

Ancestors

+ +

Subclasses

+ +

Inherited members

+ +
+
+class Singleton +(...) +
+
+

type(object_or_name, bases, dict) +type(object) -> the object's type +type(name, bases, dict) -> a new type

+
+ +Expand source code + +
class Singleton(type):
+    _instances = {}
+
+    def __call__(cls, *args, **kwargs):
+        if cls not in cls._instances:
+            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
+        return cls._instances[cls]
+
+

Ancestors

+
    +
  • builtins.type
  • +
+
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/py-scale-codec/docs/block.html b/py-scale-codec/docs/block.html new file mode 100644 index 00000000..b0696827 --- /dev/null +++ b/py-scale-codec/docs/block.html @@ -0,0 +1,1740 @@ + + + + + + +scalecodec.block API documentation + + + + + + + + + +
+
+
+

Module scalecodec.block

+
+
+
+ +Expand source code + +
#  Scale Codec
+#  Copyright (C) 2019  openAware B.V.
+#
+#  This program is free software: you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+from hashlib import blake2b
+from collections import OrderedDict
+
+from scalecodec.base import ScaleDecoder, ScaleBytes
+from scalecodec.metadata import MetadataDecoder
+from scalecodec.types import Vec, CompactU32, Enum, Bytes, Struct, VecU8Length4
+from scalecodec.utils.ss58 import ss58_decode, ss58_decode_account_index
+
+
+class ExtrinsicsDecoder(ScaleDecoder):
+    type_mapping = (
+        ('extrinsic_length', 'Compact<u32>'),
+        ('version_info', 'u8'),
+        ('address', 'Address'),
+        ('signature', 'Signature'),
+        ('nonce', 'Compact<u32>'),
+        ('era', 'Era'),
+        ('call_index', '(u8,u8)'),
+    )
+
+    def __init__(self, data=None, sub_type=None, metadata: MetadataDecoder = None, address_type=42):
+
+        assert (type(metadata) == MetadataDecoder)
+
+        self.metadata = metadata
+        self.address_type = address_type
+        self.extrinsic_length = None
+        self.extrinsic_hash = None
+        self.version_info = None
+        self.contains_transaction = False
+        self.address = None
+        self.signature_version = None
+        self.signature = None
+        self.nonce = None
+        self.era = None
+        self.tip = None
+        self.call_index = None
+        self.call_module = None
+        self.call = None
+        self.call_args = None
+        self.params_raw = None
+        self.params = []
+        super().__init__(data, sub_type)
+
+    def generate_hash(self):
+        if self.contains_transaction:
+
+            if self.extrinsic_length:
+                extrinsic_data = self.data.data
+            else:
+                # Fallback for legacy version, prefix additional Compact<u32> with length
+                extrinsic_length_type = CompactU32(ScaleBytes(bytearray()))
+                extrinsic_length_type.encode(self.data.length)
+                extrinsic_data = extrinsic_length_type.data.data + self.data.data
+
+            return blake2b(extrinsic_data, digest_size=32).digest().hex()
+        else:
+            return None
+
+    def process(self):
+        # TODO for all attributes
+        attribute_types = OrderedDict(self.type_mapping)
+
+        self.extrinsic_length = self.process_type('Compact<u32>').value
+
+        if self.extrinsic_length != self.data.get_remaining_length():
+            # Fallback for legacy version
+            self.extrinsic_length = None
+            self.data.reset()
+
+        self.version_info = self.get_next_bytes(1).hex()
+
+        self.contains_transaction = int(self.version_info, 16) >= 80
+
+        if self.version_info == '01' or self.version_info == '81':
+
+            if self.contains_transaction:
+                self.address = self.process_type('Address')
+
+                self.signature = self.process_type('Signature')
+
+                self.nonce = self.process_type(attribute_types['nonce'])
+
+                self.era = self.process_type('Era')
+
+                self.extrinsic_hash = self.generate_hash()
+
+            self.call_index = self.get_next_bytes(2).hex()
+
+        elif self.version_info == '02' or self.version_info == '82':
+
+            if self.contains_transaction:
+                self.address = self.process_type('Address')
+
+                self.signature = self.process_type('Signature')
+
+                self.era = self.process_type('Era')
+
+                self.nonce = self.process_type('Compact<U64>')
+
+                self.tip = self.process_type('Compact<Balance>')
+
+                self.extrinsic_hash = self.generate_hash()
+
+            self.call_index = self.get_next_bytes(2).hex()
+
+        elif self.version_info == '03' or self.version_info == '83':
+
+            if self.contains_transaction:
+                self.address = self.process_type('Address')
+
+                self.signature = self.process_type('Signature')
+
+                self.era = self.process_type('Era')
+
+                self.nonce = self.process_type('Compact<U64>')
+
+                self.tip = self.process_type('Compact<Balance>')
+
+                self.extrinsic_hash = self.generate_hash()
+
+            self.call_index = self.get_next_bytes(2).hex()
+
+        elif self.version_info == '04' or self.version_info == '84':
+
+            if self.contains_transaction:
+                self.address = self.process_type('Address')
+
+                self.signature_version = self.process_type('U8')
+
+                self.signature = self.process_type('Signature')
+
+                self.era = self.process_type('Era')
+
+                self.nonce = self.process_type('Compact<U64>')
+
+                self.tip = self.process_type('Compact<Balance>')
+
+                self.extrinsic_hash = self.generate_hash()
+
+            self.call_index = self.get_next_bytes(2).hex()
+        else:
+            raise NotImplementedError('Extrinsics version "{}" is not implemented'.format(self.version_info))
+
+        if self.call_index:
+
+            self.params_raw = self.data.data[self.data.offset:]
+
+            # Decode params
+
+            self.call = self.metadata.call_index[self.call_index][1]
+            self.call_module = self.metadata.call_index[self.call_index][0]
+
+            if self.debug:
+                print('Call: ', self.call.name)
+                print('Module: ', self.call_module.name)
+
+            for arg in self.call.args:
+                if self.debug:
+                    print('Param: ', arg.name, arg.type)
+
+                arg_type_obj = self.process_type(arg.type, metadata=self.metadata)
+
+                self.params.append({
+                    'name': arg.name,
+                    'type': arg.type,
+                    'value': arg_type_obj.serialize(),
+                    'valueRaw': arg_type_obj.raw_value
+                })
+
+        result = {
+            'valueRaw': self.raw_value,
+            'extrinsic_length': self.extrinsic_length,
+            'version_info': self.version_info,
+        }
+
+        if self.contains_transaction:
+            result['account_length'] = self.address.account_length
+            result['account_id'] = self.address.account_id
+            result['account_index'] = self.address.account_index
+            result['account_idx'] = self.address.account_idx
+            result['signature'] = self.signature.value.replace('0x', '')
+            result['extrinsic_hash'] = self.extrinsic_hash
+        if self.call_index:
+            result['call_code'] = self.call_index
+            result['call_function'] = self.call.get_identifier()
+            result['call_module'] = self.call_module.get_identifier()
+
+        if self.nonce:
+            result['nonce'] = self.nonce.value
+
+        if self.era:
+            result['era'] = self.era.value
+
+        if self.tip:
+            result['tip'] = self.tip.value
+
+        result['params'] = self.params
+
+        return result
+
+    def process_encode(self, value):
+        # Check requirements
+        if 'call_index' in value:
+            self.call_index = value['call_index']
+
+        elif 'call_module' in value and 'call_function' in value:
+            # Look up call module from metadata
+            for call_index, (call_module, call) in self.metadata.call_index.items():
+                if call_module.name == value['call_module'] and call.name == value['call_function']:
+                    self.call_index = call_index
+                    self.call_module = call_module
+                    self.call = call
+                    break
+
+            if not self.call_index:
+                raise ValueError('Specified call module and function not found in metadata')
+
+        elif not self.call_module or not self.call:
+            raise ValueError('No call module and function specified')
+
+        if self.contains_transaction:
+            data = ScaleBytes('0x84')
+            raise NotImplementedError('Encoding of signed extrinsics not supported')
+        else:
+            data = ScaleBytes('0x04')
+
+        data += ScaleBytes(bytearray.fromhex(self.call_index))
+
+        # Encode call params
+        if len(self.call.args) > 0:
+            for arg in self.call.args:
+                if arg.name not in value.get('call_args', {}):
+                    raise ValueError('Parameter \'{}\' not specified'.format(arg.name))
+                else:
+                    param_value = value['call_args'][arg.name]
+
+                    arg_obj = self.get_decoder_class(arg.type, metadata=self.metadata)
+                    data += arg_obj.encode(param_value)
+
+        # Wrap payload with een length Compact<u32>
+        length_obj = self.get_decoder_class('Compact<u32>')
+        data = length_obj.encode(data.length) + data
+
+        return data
+
+
+class ExtrinsicsBlock61181Decoder(ExtrinsicsDecoder):
+    type_mapping = (
+        ('extrinsic_length', 'Compact<u32>'),
+        ('version_info', 'u8'),
+        ('address', 'Address'),
+        ('signature', 'Signature'),
+        ('nonce', 'u64'),
+        ('era', 'Era'),
+        ('call_index', '(u8,u8)'),
+    )
+
+
+class EventsDecoder(Vec):
+    type_string = 'Vec<EventRecord<Event, Hash>>'
+
+    def __init__(self, data, metadata=None, **kwargs):
+        assert (not metadata or type(metadata) == MetadataDecoder)
+
+        self.metadata = metadata
+        self.elements = []
+
+        super().__init__(data, metadata=metadata, **kwargs)
+
+    def process(self):
+        element_count = self.process_type('Compact<u32>').value
+
+        for i in range(0, element_count):
+            element = self.process_type('EventRecord', metadata=self.metadata)
+            element.value['event_idx'] = i
+            self.elements.append(element)
+
+        return [e.value for e in self.elements]
+
+
+class EventRecord(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None, metadata: MetadataDecoder = None):
+
+        assert (not metadata or type(metadata) == MetadataDecoder)
+
+        self.metadata = metadata
+
+        self.phase = None
+        self.extrinsic_idx = None
+        self.type = None
+        self.params = []
+        self.event = None
+        self.event_module = None
+        self.topics = []
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        # TODO Create option type
+        self.phase = self.get_next_u8()
+
+        if self.phase == 0:
+            self.extrinsic_idx = self.process_type('U32').value
+
+        self.type = self.get_next_bytes(2).hex()
+
+        # Decode params
+
+        self.event = self.metadata.event_index[self.type][1]
+        self.event_module = self.metadata.event_index[self.type][0]
+
+        for arg_type in self.event.args:
+            arg_type_obj = self.process_type(arg_type)
+
+            self.params.append({
+                'type': arg_type,
+                'value': arg_type_obj.serialize(),
+                'valueRaw': arg_type_obj.raw_value
+            })
+
+        # Topics introduced since MetadataV5
+        if self.metadata.version and self.metadata.version.index >= 5:
+            self.topics = self.process_type('Vec<Hash>').value
+
+        return {
+            'phase': self.phase,
+            'extrinsic_idx': self.extrinsic_idx,
+            'type': self.type,
+            'module_id': self.event_module.name,
+            'event_id': self.event.name,
+            'params': self.params,
+            'topics': self.topics
+        }
+
+
+class Other(Bytes):
+    pass
+
+
+class AuthoritiesChange(Vec):
+    type_string = 'Vec<AccountId>'
+
+    def __init__(self, data, **kwargs):
+
+        super().__init__(data, sub_type='AccountId', **kwargs)
+
+
+class ConsensusEngineId(VecU8Length4):
+    pass
+
+
+class ChangesTrieRoot(Bytes):
+    pass
+
+
+class SealV0(Struct):
+    type_string = '(u64, Signature)'
+
+    type_mapping = (('slot', 'u64'), ('signature', 'Signature'))
+
+
+class Consensus(Struct):
+    type_string = '(ConsensusEngineId, Vec<u8>)'
+
+    type_mapping = (('engine', 'ConsensusEngineId'), ('data', 'HexBytes'))
+
+
+class Seal(Struct):
+    type_string = '(ConsensusEngineId, Bytes)'
+
+    type_mapping = (('engine', 'ConsensusEngineId'), ('data', 'HexBytes'))
+
+
+class PreRuntime(Struct):
+    type_string = '(ConsensusEngineId, Bytes)'
+
+    type_mapping = (('engine', 'ConsensusEngineId'), ('data', 'HexBytes'))
+
+
+class LogDigest(Enum):
+
+    value_list = ['Other', 'AuthoritiesChange', 'ChangesTrieRoot', 'SealV0', 'Consensus', 'Seal', 'PreRuntime']
+
+    def __init__(self, data, **kwargs):
+        self.log_type = None
+        self.index_value = None
+        super().__init__(data, **kwargs)
+
+    def process(self):
+        self.index = int(self.get_next_bytes(1).hex())
+        self.index_value = self.value_list[self.index]
+        self.log_type = self.process_type(self.value_list[self.index])
+
+        return {'type': self.log_type.type_string, 'value': self.log_type.value}
+
+
+
+
+
+
+
+
+
+

Classes

+
+
+class AuthoritiesChange +(data, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class AuthoritiesChange(Vec):
+    type_string = 'Vec<AccountId>'
+
+    def __init__(self, data, **kwargs):
+
+        super().__init__(data, sub_type='AccountId', **kwargs)
+
+

Ancestors

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class ChangesTrieRoot +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ChangesTrieRoot(Bytes):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Consensus +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Consensus(Struct):
+    type_string = '(ConsensusEngineId, Vec<u8>)'
+
+    type_mapping = (('engine', 'ConsensusEngineId'), ('data', 'HexBytes'))
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class ConsensusEngineId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ConsensusEngineId(VecU8Length4):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class EventRecord +(data, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class EventRecord(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None, metadata: MetadataDecoder = None):
+
+        assert (not metadata or type(metadata) == MetadataDecoder)
+
+        self.metadata = metadata
+
+        self.phase = None
+        self.extrinsic_idx = None
+        self.type = None
+        self.params = []
+        self.event = None
+        self.event_module = None
+        self.topics = []
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        # TODO Create option type
+        self.phase = self.get_next_u8()
+
+        if self.phase == 0:
+            self.extrinsic_idx = self.process_type('U32').value
+
+        self.type = self.get_next_bytes(2).hex()
+
+        # Decode params
+
+        self.event = self.metadata.event_index[self.type][1]
+        self.event_module = self.metadata.event_index[self.type][0]
+
+        for arg_type in self.event.args:
+            arg_type_obj = self.process_type(arg_type)
+
+            self.params.append({
+                'type': arg_type,
+                'value': arg_type_obj.serialize(),
+                'valueRaw': arg_type_obj.raw_value
+            })
+
+        # Topics introduced since MetadataV5
+        if self.metadata.version and self.metadata.version.index >= 5:
+            self.topics = self.process_type('Vec<Hash>').value
+
+        return {
+            'phase': self.phase,
+            'extrinsic_idx': self.extrinsic_idx,
+            'type': self.type,
+            'module_id': self.event_module.name,
+            'event_id': self.event.name,
+            'params': self.params,
+            'topics': self.topics
+        }
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    # TODO Create option type
+    self.phase = self.get_next_u8()
+
+    if self.phase == 0:
+        self.extrinsic_idx = self.process_type('U32').value
+
+    self.type = self.get_next_bytes(2).hex()
+
+    # Decode params
+
+    self.event = self.metadata.event_index[self.type][1]
+    self.event_module = self.metadata.event_index[self.type][0]
+
+    for arg_type in self.event.args:
+        arg_type_obj = self.process_type(arg_type)
+
+        self.params.append({
+            'type': arg_type,
+            'value': arg_type_obj.serialize(),
+            'valueRaw': arg_type_obj.raw_value
+        })
+
+    # Topics introduced since MetadataV5
+    if self.metadata.version and self.metadata.version.index >= 5:
+        self.topics = self.process_type('Vec<Hash>').value
+
+    return {
+        'phase': self.phase,
+        'extrinsic_idx': self.extrinsic_idx,
+        'type': self.type,
+        'module_id': self.event_module.name,
+        'event_id': self.event.name,
+        'params': self.params,
+        'topics': self.topics
+    }
+
+
+
+

Inherited members

+ +
+
+class EventsDecoder +(data, metadata=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class EventsDecoder(Vec):
+    type_string = 'Vec<EventRecord<Event, Hash>>'
+
+    def __init__(self, data, metadata=None, **kwargs):
+        assert (not metadata or type(metadata) == MetadataDecoder)
+
+        self.metadata = metadata
+        self.elements = []
+
+        super().__init__(data, metadata=metadata, **kwargs)
+
+    def process(self):
+        element_count = self.process_type('Compact<u32>').value
+
+        for i in range(0, element_count):
+            element = self.process_type('EventRecord', metadata=self.metadata)
+            element.value['event_idx'] = i
+            self.elements.append(element)
+
+        return [e.value for e in self.elements]
+
+

Ancestors

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    element_count = self.process_type('Compact<u32>').value
+
+    for i in range(0, element_count):
+        element = self.process_type('EventRecord', metadata=self.metadata)
+        element.value['event_idx'] = i
+        self.elements.append(element)
+
+    return [e.value for e in self.elements]
+
+
+
+

Inherited members

+ +
+
+class ExtrinsicsBlock61181Decoder +(data=None, sub_type=None, metadata=None, address_type=42) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ExtrinsicsBlock61181Decoder(ExtrinsicsDecoder):
+    type_mapping = (
+        ('extrinsic_length', 'Compact<u32>'),
+        ('version_info', 'u8'),
+        ('address', 'Address'),
+        ('signature', 'Signature'),
+        ('nonce', 'u64'),
+        ('era', 'Era'),
+        ('call_index', '(u8,u8)'),
+    )
+
+

Ancestors

+ +

Inherited members

+ +
+
+class ExtrinsicsDecoder +(data=None, sub_type=None, metadata=None, address_type=42) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ExtrinsicsDecoder(ScaleDecoder):
+    type_mapping = (
+        ('extrinsic_length', 'Compact<u32>'),
+        ('version_info', 'u8'),
+        ('address', 'Address'),
+        ('signature', 'Signature'),
+        ('nonce', 'Compact<u32>'),
+        ('era', 'Era'),
+        ('call_index', '(u8,u8)'),
+    )
+
+    def __init__(self, data=None, sub_type=None, metadata: MetadataDecoder = None, address_type=42):
+
+        assert (type(metadata) == MetadataDecoder)
+
+        self.metadata = metadata
+        self.address_type = address_type
+        self.extrinsic_length = None
+        self.extrinsic_hash = None
+        self.version_info = None
+        self.contains_transaction = False
+        self.address = None
+        self.signature_version = None
+        self.signature = None
+        self.nonce = None
+        self.era = None
+        self.tip = None
+        self.call_index = None
+        self.call_module = None
+        self.call = None
+        self.call_args = None
+        self.params_raw = None
+        self.params = []
+        super().__init__(data, sub_type)
+
+    def generate_hash(self):
+        if self.contains_transaction:
+
+            if self.extrinsic_length:
+                extrinsic_data = self.data.data
+            else:
+                # Fallback for legacy version, prefix additional Compact<u32> with length
+                extrinsic_length_type = CompactU32(ScaleBytes(bytearray()))
+                extrinsic_length_type.encode(self.data.length)
+                extrinsic_data = extrinsic_length_type.data.data + self.data.data
+
+            return blake2b(extrinsic_data, digest_size=32).digest().hex()
+        else:
+            return None
+
+    def process(self):
+        # TODO for all attributes
+        attribute_types = OrderedDict(self.type_mapping)
+
+        self.extrinsic_length = self.process_type('Compact<u32>').value
+
+        if self.extrinsic_length != self.data.get_remaining_length():
+            # Fallback for legacy version
+            self.extrinsic_length = None
+            self.data.reset()
+
+        self.version_info = self.get_next_bytes(1).hex()
+
+        self.contains_transaction = int(self.version_info, 16) >= 80
+
+        if self.version_info == '01' or self.version_info == '81':
+
+            if self.contains_transaction:
+                self.address = self.process_type('Address')
+
+                self.signature = self.process_type('Signature')
+
+                self.nonce = self.process_type(attribute_types['nonce'])
+
+                self.era = self.process_type('Era')
+
+                self.extrinsic_hash = self.generate_hash()
+
+            self.call_index = self.get_next_bytes(2).hex()
+
+        elif self.version_info == '02' or self.version_info == '82':
+
+            if self.contains_transaction:
+                self.address = self.process_type('Address')
+
+                self.signature = self.process_type('Signature')
+
+                self.era = self.process_type('Era')
+
+                self.nonce = self.process_type('Compact<U64>')
+
+                self.tip = self.process_type('Compact<Balance>')
+
+                self.extrinsic_hash = self.generate_hash()
+
+            self.call_index = self.get_next_bytes(2).hex()
+
+        elif self.version_info == '03' or self.version_info == '83':
+
+            if self.contains_transaction:
+                self.address = self.process_type('Address')
+
+                self.signature = self.process_type('Signature')
+
+                self.era = self.process_type('Era')
+
+                self.nonce = self.process_type('Compact<U64>')
+
+                self.tip = self.process_type('Compact<Balance>')
+
+                self.extrinsic_hash = self.generate_hash()
+
+            self.call_index = self.get_next_bytes(2).hex()
+
+        elif self.version_info == '04' or self.version_info == '84':
+
+            if self.contains_transaction:
+                self.address = self.process_type('Address')
+
+                self.signature_version = self.process_type('U8')
+
+                self.signature = self.process_type('Signature')
+
+                self.era = self.process_type('Era')
+
+                self.nonce = self.process_type('Compact<U64>')
+
+                self.tip = self.process_type('Compact<Balance>')
+
+                self.extrinsic_hash = self.generate_hash()
+
+            self.call_index = self.get_next_bytes(2).hex()
+        else:
+            raise NotImplementedError('Extrinsics version "{}" is not implemented'.format(self.version_info))
+
+        if self.call_index:
+
+            self.params_raw = self.data.data[self.data.offset:]
+
+            # Decode params
+
+            self.call = self.metadata.call_index[self.call_index][1]
+            self.call_module = self.metadata.call_index[self.call_index][0]
+
+            if self.debug:
+                print('Call: ', self.call.name)
+                print('Module: ', self.call_module.name)
+
+            for arg in self.call.args:
+                if self.debug:
+                    print('Param: ', arg.name, arg.type)
+
+                arg_type_obj = self.process_type(arg.type, metadata=self.metadata)
+
+                self.params.append({
+                    'name': arg.name,
+                    'type': arg.type,
+                    'value': arg_type_obj.serialize(),
+                    'valueRaw': arg_type_obj.raw_value
+                })
+
+        result = {
+            'valueRaw': self.raw_value,
+            'extrinsic_length': self.extrinsic_length,
+            'version_info': self.version_info,
+        }
+
+        if self.contains_transaction:
+            result['account_length'] = self.address.account_length
+            result['account_id'] = self.address.account_id
+            result['account_index'] = self.address.account_index
+            result['account_idx'] = self.address.account_idx
+            result['signature'] = self.signature.value.replace('0x', '')
+            result['extrinsic_hash'] = self.extrinsic_hash
+        if self.call_index:
+            result['call_code'] = self.call_index
+            result['call_function'] = self.call.get_identifier()
+            result['call_module'] = self.call_module.get_identifier()
+
+        if self.nonce:
+            result['nonce'] = self.nonce.value
+
+        if self.era:
+            result['era'] = self.era.value
+
+        if self.tip:
+            result['tip'] = self.tip.value
+
+        result['params'] = self.params
+
+        return result
+
+    def process_encode(self, value):
+        # Check requirements
+        if 'call_index' in value:
+            self.call_index = value['call_index']
+
+        elif 'call_module' in value and 'call_function' in value:
+            # Look up call module from metadata
+            for call_index, (call_module, call) in self.metadata.call_index.items():
+                if call_module.name == value['call_module'] and call.name == value['call_function']:
+                    self.call_index = call_index
+                    self.call_module = call_module
+                    self.call = call
+                    break
+
+            if not self.call_index:
+                raise ValueError('Specified call module and function not found in metadata')
+
+        elif not self.call_module or not self.call:
+            raise ValueError('No call module and function specified')
+
+        if self.contains_transaction:
+            data = ScaleBytes('0x84')
+            raise NotImplementedError('Encoding of signed extrinsics not supported')
+        else:
+            data = ScaleBytes('0x04')
+
+        data += ScaleBytes(bytearray.fromhex(self.call_index))
+
+        # Encode call params
+        if len(self.call.args) > 0:
+            for arg in self.call.args:
+                if arg.name not in value.get('call_args', {}):
+                    raise ValueError('Parameter \'{}\' not specified'.format(arg.name))
+                else:
+                    param_value = value['call_args'][arg.name]
+
+                    arg_obj = self.get_decoder_class(arg.type, metadata=self.metadata)
+                    data += arg_obj.encode(param_value)
+
+        # Wrap payload with een length Compact<u32>
+        length_obj = self.get_decoder_class('Compact<u32>')
+        data = length_obj.encode(data.length) + data
+
+        return data
+
+

Ancestors

+ +

Subclasses

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Methods

+
+
+def generate_hash(self) +
+
+
+
+ +Expand source code + +
def generate_hash(self):
+    if self.contains_transaction:
+
+        if self.extrinsic_length:
+            extrinsic_data = self.data.data
+        else:
+            # Fallback for legacy version, prefix additional Compact<u32> with length
+            extrinsic_length_type = CompactU32(ScaleBytes(bytearray()))
+            extrinsic_length_type.encode(self.data.length)
+            extrinsic_data = extrinsic_length_type.data.data + self.data.data
+
+        return blake2b(extrinsic_data, digest_size=32).digest().hex()
+    else:
+        return None
+
+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    # TODO for all attributes
+    attribute_types = OrderedDict(self.type_mapping)
+
+    self.extrinsic_length = self.process_type('Compact<u32>').value
+
+    if self.extrinsic_length != self.data.get_remaining_length():
+        # Fallback for legacy version
+        self.extrinsic_length = None
+        self.data.reset()
+
+    self.version_info = self.get_next_bytes(1).hex()
+
+    self.contains_transaction = int(self.version_info, 16) >= 80
+
+    if self.version_info == '01' or self.version_info == '81':
+
+        if self.contains_transaction:
+            self.address = self.process_type('Address')
+
+            self.signature = self.process_type('Signature')
+
+            self.nonce = self.process_type(attribute_types['nonce'])
+
+            self.era = self.process_type('Era')
+
+            self.extrinsic_hash = self.generate_hash()
+
+        self.call_index = self.get_next_bytes(2).hex()
+
+    elif self.version_info == '02' or self.version_info == '82':
+
+        if self.contains_transaction:
+            self.address = self.process_type('Address')
+
+            self.signature = self.process_type('Signature')
+
+            self.era = self.process_type('Era')
+
+            self.nonce = self.process_type('Compact<U64>')
+
+            self.tip = self.process_type('Compact<Balance>')
+
+            self.extrinsic_hash = self.generate_hash()
+
+        self.call_index = self.get_next_bytes(2).hex()
+
+    elif self.version_info == '03' or self.version_info == '83':
+
+        if self.contains_transaction:
+            self.address = self.process_type('Address')
+
+            self.signature = self.process_type('Signature')
+
+            self.era = self.process_type('Era')
+
+            self.nonce = self.process_type('Compact<U64>')
+
+            self.tip = self.process_type('Compact<Balance>')
+
+            self.extrinsic_hash = self.generate_hash()
+
+        self.call_index = self.get_next_bytes(2).hex()
+
+    elif self.version_info == '04' or self.version_info == '84':
+
+        if self.contains_transaction:
+            self.address = self.process_type('Address')
+
+            self.signature_version = self.process_type('U8')
+
+            self.signature = self.process_type('Signature')
+
+            self.era = self.process_type('Era')
+
+            self.nonce = self.process_type('Compact<U64>')
+
+            self.tip = self.process_type('Compact<Balance>')
+
+            self.extrinsic_hash = self.generate_hash()
+
+        self.call_index = self.get_next_bytes(2).hex()
+    else:
+        raise NotImplementedError('Extrinsics version "{}" is not implemented'.format(self.version_info))
+
+    if self.call_index:
+
+        self.params_raw = self.data.data[self.data.offset:]
+
+        # Decode params
+
+        self.call = self.metadata.call_index[self.call_index][1]
+        self.call_module = self.metadata.call_index[self.call_index][0]
+
+        if self.debug:
+            print('Call: ', self.call.name)
+            print('Module: ', self.call_module.name)
+
+        for arg in self.call.args:
+            if self.debug:
+                print('Param: ', arg.name, arg.type)
+
+            arg_type_obj = self.process_type(arg.type, metadata=self.metadata)
+
+            self.params.append({
+                'name': arg.name,
+                'type': arg.type,
+                'value': arg_type_obj.serialize(),
+                'valueRaw': arg_type_obj.raw_value
+            })
+
+    result = {
+        'valueRaw': self.raw_value,
+        'extrinsic_length': self.extrinsic_length,
+        'version_info': self.version_info,
+    }
+
+    if self.contains_transaction:
+        result['account_length'] = self.address.account_length
+        result['account_id'] = self.address.account_id
+        result['account_index'] = self.address.account_index
+        result['account_idx'] = self.address.account_idx
+        result['signature'] = self.signature.value.replace('0x', '')
+        result['extrinsic_hash'] = self.extrinsic_hash
+    if self.call_index:
+        result['call_code'] = self.call_index
+        result['call_function'] = self.call.get_identifier()
+        result['call_module'] = self.call_module.get_identifier()
+
+    if self.nonce:
+        result['nonce'] = self.nonce.value
+
+    if self.era:
+        result['era'] = self.era.value
+
+    if self.tip:
+        result['tip'] = self.tip.value
+
+    result['params'] = self.params
+
+    return result
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    # Check requirements
+    if 'call_index' in value:
+        self.call_index = value['call_index']
+
+    elif 'call_module' in value and 'call_function' in value:
+        # Look up call module from metadata
+        for call_index, (call_module, call) in self.metadata.call_index.items():
+            if call_module.name == value['call_module'] and call.name == value['call_function']:
+                self.call_index = call_index
+                self.call_module = call_module
+                self.call = call
+                break
+
+        if not self.call_index:
+            raise ValueError('Specified call module and function not found in metadata')
+
+    elif not self.call_module or not self.call:
+        raise ValueError('No call module and function specified')
+
+    if self.contains_transaction:
+        data = ScaleBytes('0x84')
+        raise NotImplementedError('Encoding of signed extrinsics not supported')
+    else:
+        data = ScaleBytes('0x04')
+
+    data += ScaleBytes(bytearray.fromhex(self.call_index))
+
+    # Encode call params
+    if len(self.call.args) > 0:
+        for arg in self.call.args:
+            if arg.name not in value.get('call_args', {}):
+                raise ValueError('Parameter \'{}\' not specified'.format(arg.name))
+            else:
+                param_value = value['call_args'][arg.name]
+
+                arg_obj = self.get_decoder_class(arg.type, metadata=self.metadata)
+                data += arg_obj.encode(param_value)
+
+    # Wrap payload with een length Compact<u32>
+    length_obj = self.get_decoder_class('Compact<u32>')
+    data = length_obj.encode(data.length) + data
+
+    return data
+
+
+
+

Inherited members

+ +
+
+class LogDigest +(data, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class LogDigest(Enum):
+
+    value_list = ['Other', 'AuthoritiesChange', 'ChangesTrieRoot', 'SealV0', 'Consensus', 'Seal', 'PreRuntime']
+
+    def __init__(self, data, **kwargs):
+        self.log_type = None
+        self.index_value = None
+        super().__init__(data, **kwargs)
+
+    def process(self):
+        self.index = int(self.get_next_bytes(1).hex())
+        self.index_value = self.value_list[self.index]
+        self.log_type = self.process_type(self.value_list[self.index])
+
+        return {'type': self.log_type.type_string, 'value': self.log_type.value}
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.index = int(self.get_next_bytes(1).hex())
+    self.index_value = self.value_list[self.index]
+    self.log_type = self.process_type(self.value_list[self.index])
+
+    return {'type': self.log_type.type_string, 'value': self.log_type.value}
+
+
+
+

Inherited members

+ +
+
+class Other +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Other(Bytes):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class PreRuntime +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class PreRuntime(Struct):
+    type_string = '(ConsensusEngineId, Bytes)'
+
+    type_mapping = (('engine', 'ConsensusEngineId'), ('data', 'HexBytes'))
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class Seal +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Seal(Struct):
+    type_string = '(ConsensusEngineId, Bytes)'
+
+    type_mapping = (('engine', 'ConsensusEngineId'), ('data', 'HexBytes'))
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class SealV0 +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class SealV0(Struct):
+    type_string = '(u64, Signature)'
+
+    type_mapping = (('slot', 'u64'), ('signature', 'Signature'))
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/py-scale-codec/docs/exceptions.html b/py-scale-codec/docs/exceptions.html new file mode 100644 index 00000000..5035e5ff --- /dev/null +++ b/py-scale-codec/docs/exceptions.html @@ -0,0 +1,134 @@ + + + + + + +scalecodec.exceptions API documentation + + + + + + + + + +
+
+
+

Module scalecodec.exceptions

+
+
+
+ +Expand source code + +
# Python SCALE Codec Library
+#
+# Copyright 2018-2019 openAware BV (NL).
+# This file is part of Polkascan.
+#
+# Polkascan is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Polkascan is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Polkascan. If not, see <http://www.gnu.org/licenses/>.
+
+
+class RemainingScaleBytesNotEmptyException(Exception):
+    pass
+
+
+class InvalidScaleTypeValueException(Exception):
+    pass
+
+
+
+
+
+
+
+
+
+

Classes

+
+
+class InvalidScaleTypeValueException +(...) +
+
+

Common base class for all non-exit exceptions.

+
+ +Expand source code + +
class InvalidScaleTypeValueException(Exception):
+    pass
+
+

Ancestors

+
    +
  • builtins.Exception
  • +
  • builtins.BaseException
  • +
+
+
+class RemainingScaleBytesNotEmptyException +(...) +
+
+

Common base class for all non-exit exceptions.

+
+ +Expand source code + +
class RemainingScaleBytesNotEmptyException(Exception):
+    pass
+
+

Ancestors

+
    +
  • builtins.Exception
  • +
  • builtins.BaseException
  • +
+
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/py-scale-codec/docs/index.html b/py-scale-codec/docs/index.html new file mode 100644 index 00000000..07808642 --- /dev/null +++ b/py-scale-codec/docs/index.html @@ -0,0 +1,116 @@ + + + + + + +scalecodec API documentation + + + + + + + + + +
+
+
+

Module scalecodec

+
+
+
+ +Expand source code + +
# Python SCALE Codec Library
+#
+# Copyright 2018-2019 openAware BV (NL).
+# This file is part of Polkascan.
+#
+# Polkascan is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Polkascan is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Polkascan. If not, see <http://www.gnu.org/licenses/>.
+
+# TODO temp import all to make sure types classes are registered with RuntimeConfiguration.
+# TODO implemented type mapping registry per spec version id (/runtime)
+from .types import *
+
+
+
+

Sub-modules

+
+
scalecodec.base
+
+
+
+
scalecodec.block
+
+
+
+
scalecodec.exceptions
+
+
+
+
scalecodec.metadata
+
+
+
+
scalecodec.type_registry
+
+
+
+
scalecodec.types
+
+
+
+
scalecodec.utils
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/py-scale-codec/docs/metadata.html b/py-scale-codec/docs/metadata.html new file mode 100644 index 00000000..c78f9c5d --- /dev/null +++ b/py-scale-codec/docs/metadata.html @@ -0,0 +1,5996 @@ + + + + + + +scalecodec.metadata API documentation + + + + + + + + + +
+
+
+

Module scalecodec.metadata

+
+
+
+ +Expand source code + +
#  Scale Codec
+#  Copyright (C) 2019  openAware B.V.
+#
+#  This program is free software: you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from scalecodec.base import ScaleDecoder, ScaleType
+
+
+class MetadataDecoder(ScaleDecoder):
+
+    def __init__(self, data, **kwargs):
+        self.version = None
+        self.metadata = None
+        self.call_index = None
+        self.event_index = None
+        super().__init__(data, **kwargs)
+
+    def process(self):
+        magic_bytes = self.get_next_bytes(4)
+
+        if magic_bytes == b'meta':
+
+            self.version = self.process_type('Enum', value_list=[
+                "MetadataV0Decoder",
+                "MetadataV1Decoder",
+                "MetadataV2Decoder",
+                "MetadataV3Decoder",
+                "MetadataV4Decoder",
+                "MetadataV5Decoder",
+                "MetadataV6Decoder",
+                "MetadataV7Decoder",
+                "MetadataV8Decoder",
+                "MetadataV9Decoder",
+                "MetadataV10Decoder"
+            ])
+
+            self.metadata = self.process_type(self.version.value)
+
+            # TODO remove duplicate reference?
+            self.call_index = self.metadata.call_index
+            self.event_index = self.metadata.event_index
+
+            return self.metadata.value
+
+        else:
+            # Fall back to version unaware legacy MetadataV0
+            self.data.reset()
+
+            self.metadata = self.process_type('MetadataV0Decoder')
+
+            # TODO remove duplicate reference?
+            self.call_index = self.metadata.call_index
+            self.event_index = self.metadata.event_index
+
+            return self.metadata.value
+
+
+class MetadataV4Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV4": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV4Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV4"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+
+class MetadataV4Module(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.prefix = None
+        self.call_index = None
+        self.has_storage = False
+        self.storage = None
+        self.has_calls = False
+        self.calls = None
+        self.has_events = False
+        self.events = None
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    def get_identifier(self):
+        return self.name.lower()
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.prefix = self.process_type('Bytes').value
+
+        result = {
+            "name": self.name,
+            "prefix": self.prefix,
+            "storage": self.storage,
+            "calls": self.calls,
+            "events": self.events,
+            "constants": self.constants,
+            "errors": self.errors
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            # TODO convert to Option<Vec<MetadataModuleStorage>>
+            self.storage = self.process_type('Vec<MetadataV4ModuleStorage>').elements
+            result["storage"] = [s.value for s in self.storage]
+
+        self.has_calls = self.process_type('bool').value
+
+        if self.has_calls:
+            # TODO convert to Option<Vec<MetadataModuleCall>>
+            self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+            result["calls"] = [s.value for s in self.calls]
+
+        self.has_events = self.process_type('bool').value
+
+        if self.has_events:
+            # TODO convert to Option<Vec<MetadataModuleEvent>>
+            self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+            result["events"] = [s.value for s in self.events]
+
+        return result
+
+
+class MetadataV4ModuleStorage(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.modifier = None
+        self.type = {}
+        self.fallback = None
+        self.docs = []
+        self.hasher = None
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+        storage_function_type = self.process_type('Enum', value_list=["PlainType", "MapType", "DoubleMapType"]).value
+
+        if storage_function_type == 'MapType':
+            self.hasher = self.process_type('StorageHasher')
+            self.type = {
+                "MapType": {
+                    "hasher": self.hasher.value,
+                    "key": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value),
+                    "isLinked": self.process_type('bool').value
+                }
+            }
+        elif storage_function_type == 'DoubleMapType':
+            self.hasher = self.process_type('StorageHasher')
+            self.type = {
+                "DoubleMapType": {
+                    "hasher": self.hasher.value,
+                    "key1": self.convert_type(self.process_type('Bytes').value),
+                    "key2": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value),
+                    "key2Hasher": self.process_type('Bytes').value
+                }
+            }
+
+        elif storage_function_type == 'PlainType':
+            self.type = {
+                "PlainType": self.convert_type(self.process_type('Bytes').value)
+            }
+
+        self.fallback = self.process_type('HexBytes').value
+
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "modifier": self.modifier,
+            "type": self.type,
+            "fallback": self.fallback,
+            "docs": self.docs
+        }
+
+
+class MetadataV5Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV5": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV4Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV5"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+
+class MetadataV5Module(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.prefix = None
+        self.call_index = None
+        self.has_storage = False
+        self.storage = None
+        self.has_calls = False
+        self.calls = None
+        self.has_events = False
+        self.events = None
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    def get_identifier(self):
+        return self.name.lower()
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.prefix = self.process_type('Bytes').value
+
+        result = {
+            "name": self.name,
+            "prefix": self.prefix,
+            "storage": self.storage,
+            "calls": self.calls,
+            "events": self.events,
+            "constants": self.constants,
+            "errors": self.errors
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            # TODO convert to Option<Vec<MetadataModuleStorage>>
+            self.storage = self.process_type('Vec<MetadataV5ModuleStorage>').elements
+            result["storage"] = [s.value for s in self.storage]
+
+        self.has_calls = self.process_type('bool').value
+
+        if self.has_calls:
+            # TODO convert to Option<Vec<MetadataModuleCall>>
+            self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+            result["calls"] = [s.value for s in self.calls]
+
+        self.has_events = self.process_type('bool').value
+
+        if self.has_events:
+            # TODO convert to Option<Vec<MetadataModuleEvent>>
+            self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+            result["events"] = [s.value for s in self.events]
+
+        return result
+
+
+class MetadataV5ModuleStorage(ScaleType):
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.modifier = None
+        self.type = {}
+        self.fallback = None
+        self.docs = []
+        self.hasher = None
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+        storage_function_type = self.process_type('Enum', value_list=["PlainType", "MapType", "DoubleMapType"]).value
+
+        if storage_function_type == 'MapType':
+            self.hasher = self.process_type('StorageHasher')
+            self.type = {
+                "MapType": {
+                    "hasher": self.hasher.value,
+                    "key": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value),
+                    "isLinked": self.process_type('bool').value
+                }
+            }
+        elif storage_function_type == 'DoubleMapType':
+            self.hasher = self.process_type('StorageHasher')
+            self.type = {
+                "DoubleMapType": {
+                    "hasher": self.hasher.value,
+                    "key1": self.convert_type(self.process_type('Bytes').value),
+                    "key2": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value),
+                    "key2Hasher": self.process_type('StorageHasher').value
+                }
+            }
+
+        elif storage_function_type == 'PlainType':
+            self.type = {
+                "PlainType": self.convert_type(self.process_type('Bytes').value)
+            }
+
+        self.fallback = self.process_type('HexBytes').value
+
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "modifier": self.modifier,
+            "type": self.type,
+            "fallback": self.fallback,
+            "docs": self.docs
+        }
+
+
+class MetadataV6Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV6": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV6Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV6"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+
+class MetadataV6Module(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.prefix = None
+        self.call_index = None
+        self.has_storage = False
+        self.storage = None
+        self.has_calls = False
+        self.calls = None
+        self.has_events = False
+        self.events = None
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    def get_identifier(self):
+        return self.name.lower()
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.prefix = self.process_type('Bytes').value
+
+        result = {
+            "name": self.name,
+            "prefix": self.prefix,
+            "storage": self.storage,
+            "calls": self.calls,
+            "events": self.events,
+            "constants": self.constants,
+            "errors": self.errors
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            # TODO convert to Option<Vec<MetadataModuleStorage>>
+            self.storage = self.process_type('Vec<MetadataV6ModuleStorage>').elements
+            result["storage"] = [s.value for s in self.storage]
+
+        self.has_calls = self.process_type('bool').value
+
+        if self.has_calls:
+            # TODO convert to Option<Vec<MetadataModuleCall>>
+            self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+            result["calls"] = [s.value for s in self.calls]
+
+        self.has_events = self.process_type('bool').value
+
+        if self.has_events:
+            # TODO convert to Option<Vec<MetadataModuleEvent>>
+            self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+            result["events"] = [s.value for s in self.events]
+
+        self.constants = self.process_type('Vec<MetadataV6ModuleConstants>').elements
+        result["constants"] = [s.value for s in self.constants]
+
+        return result
+
+
+class MetadataV6ModuleStorage(MetadataV5ModuleStorage):
+    pass
+
+
+class MetadataV6ModuleConstants(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.type = None
+        self.constant_value = None
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.type = self.convert_type(self.process_type('Bytes').value)
+        self.constant_value = self.process_type('HexBytes').value
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "type": self.type,
+            "value": self.constant_value,
+            "docs": self.docs
+        }
+
+
+class MetadataV7Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV7": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV7Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV7"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+
+class MetadataV7Module(MetadataV6Module):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.prefix = None
+        self.call_index = None
+        self.has_storage = False
+        self.storage = None
+        self.has_calls = False
+        self.calls = None
+        self.has_events = False
+        self.events = None
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+
+        result = {
+            "name": self.name,
+            "prefix": self.prefix,
+            "storage": self.storage,
+            "calls": self.calls,
+            "events": self.events,
+            "constants": self.constants,
+            "errors": self.errors
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            # TODO convert to Option<Vec<MetadataModuleStorage>>
+            self.storage = self.process_type('MetadataV7ModuleStorage')
+            result["storage"] = self.storage.value
+            # TODO moved to storage, change data model
+            self.prefix = self.storage.prefix
+            result["prefix"] = self.prefix
+
+        self.has_calls = self.process_type('bool').value
+
+        if self.has_calls:
+            # TODO convert to Option<Vec<MetadataModuleCall>>
+            self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+            result["calls"] = [s.value for s in self.calls]
+
+        self.has_events = self.process_type('bool').value
+
+        if self.has_events:
+            # TODO convert to Option<Vec<MetadataModuleEvent>>
+            self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+            result["events"] = [s.value for s in self.events]
+
+        self.constants = self.process_type('Vec<MetadataV7ModuleConstants>').elements
+        result["constants"] = [s.value for s in self.constants]
+
+        return result
+
+
+class MetadataV7ModuleStorage(MetadataV6ModuleStorage):
+
+    def __init__(self, data, sub_type=None):
+        self.prefix = None
+        self.items = []
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.prefix = self.process_type('Bytes').value
+        self.items = self.process_type('Vec<MetadataV7ModuleStorageEntry>').elements
+
+        return {
+            "prefix": self.prefix,
+            "items": [s.value for s in self.items]
+        }
+
+
+class MetadataV7ModuleStorageEntry(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.modifier = None
+        self.type = {}
+        self.fallback = None
+        self.docs = []
+        self.hasher = None
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+        storage_function_type = self.process_type('Enum', value_list=["PlainType", "MapType", "DoubleMapType"]).value
+
+        if storage_function_type == 'MapType':
+            self.hasher = self.process_type('StorageHasher')
+            self.type = {
+                "MapType": {
+                    "hasher": self.hasher.value,
+                    "key": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value),
+                    "isLinked": self.process_type('bool').value
+                }
+            }
+        elif storage_function_type == 'DoubleMapType':
+            self.hasher = self.process_type('StorageHasher')
+            self.type = {
+                "DoubleMapType": {
+                    "hasher": self.hasher.value,
+                    "key1": self.convert_type(self.process_type('Bytes').value),
+                    "key2": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value),
+                    "key2Hasher": self.process_type('StorageHasher').value
+                }
+            }
+
+        elif storage_function_type == 'PlainType':
+            self.type = {
+                "PlainType": self.convert_type(self.process_type('Bytes').value)
+            }
+
+        self.fallback = self.process_type('HexBytes').value
+
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "modifier": self.modifier,
+            "type": self.type,
+            "fallback": self.fallback,
+            "docs": self.docs
+        }
+
+
+class MetadataV7ModuleConstants(MetadataV6ModuleConstants):
+    pass
+
+
+class MetadataV8Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV8": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV8Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV8"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+
+class MetadataV8Module(MetadataV6Module):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.prefix = None
+        self.call_index = None
+        self.has_storage = False
+        self.storage = None
+        self.has_calls = False
+        self.calls = None
+        self.has_events = False
+        self.events = None
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+
+        result = {
+            "name": self.name,
+            "prefix": self.prefix,
+            "storage": self.storage,
+            "calls": self.calls,
+            "events": self.events,
+            "constants": self.constants,
+            "errors": self.errors
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            # TODO convert to Option<Vec<MetadataModuleStorage>>
+            self.storage = self.process_type('MetadataV7ModuleStorage')
+            result["storage"] = self.storage.value
+            # TODO moved to storage, change data model
+            self.prefix = self.storage.prefix
+            result["prefix"] = self.prefix
+
+        self.has_calls = self.process_type('bool').value
+
+        if self.has_calls:
+            # TODO convert to Option<Vec<MetadataModuleCall>>
+            self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+            result["calls"] = [s.value for s in self.calls]
+
+        self.has_events = self.process_type('bool').value
+
+        if self.has_events:
+            # TODO convert to Option<Vec<MetadataModuleEvent>>
+            self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+            result["events"] = [s.value for s in self.events]
+
+        self.constants = self.process_type('Vec<MetadataV7ModuleConstants>').elements
+        result["constants"] = [s.value for s in self.constants]
+
+        self.errors = self.process_type('Vec<MetadataModuleError>').elements
+        result["errors"] = [s.value for s in self.errors]
+
+        return result
+
+
+class MetadataModuleError(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "docs": self.docs
+        }
+
+
+class MetadataV9Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV9": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV8Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV9"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+
+class MetadataV10Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV10": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV8Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV10"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+
+class MetadataV3Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV3": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataModule>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV3"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+
+class MetadataV2Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV2": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataModule>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV2"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+
+class MetadataV1Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV1": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV1Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV1"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+
+class MetadataV0Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.events_modules = []
+        self.modules = []
+        self.sections = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "metadata": {
+                "MetadataV0": {
+                    "outerEvent": {
+                        "name": self.process_type('Bytes').value,
+                        "events": []
+                    },
+                    "modules": [],
+                    "sections": []
+                }
+            }
+        }
+
+        self.events_modules = self.process_type('Vec<MetadataV0EventModule>').elements
+
+        self.modules = self.process_type('Vec<MetadataV0Module>').elements
+
+        # TODO why "Call" unused?
+        _ = self.process_type('Bytes').value
+
+        self.sections = self.process_type('Vec<MetadataV0Section>').elements
+
+        # Build call and event index
+        call_module_index = 0
+        for module_index, module in enumerate(self.modules):
+            if module_index > 0 and (len(module.functions) > 0 or len(module.storage) > 0):
+
+                for call_index, call in enumerate(module.functions):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+
+                call_module_index += 1
+
+        for event_module_index, event_module in enumerate(self.events_modules):
+            for event_index, event in enumerate(event_module.events):
+                event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                self.event_index[event.lookup] = (event_module, event)
+
+        result_data["metadata"]["MetadataV0"]["outerEvent"]["events"] = [e.value for e in self.events_modules]
+        result_data["metadata"]["MetadataV0"]["modules"] = [m.value for m in self.modules]
+        result_data["metadata"]["MetadataV0"]["sections"] = [s.value for s in self.sections]
+
+        return result_data
+
+
+class MetadataV0EventModule(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.events = None
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.events = self.process_type('Vec<MetadataV0Event>').elements
+
+        return {
+            'name': self.name,
+            'events': [s.value for s in self.events]
+        }
+
+
+class MetadataV0Event(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.args = []
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.args = self.process_type('Vec<Bytes>').value
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "arguments": self.args,
+            "docs": self.docs
+        }
+
+
+class MetadataV0Module(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.prefix = None
+        self.name = None
+        self.call_name = None
+        self.functions = []
+        self.has_storage = False
+        self.storage_prefix = None
+        self.storage = []
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    # TODO move to version agnostic superclass MetadataModule
+    def get_identifier(self):
+        return self.prefix.lower()
+
+    def process(self):
+        self.prefix = self.process_type('Bytes').value
+        self.name = self.process_type('Bytes').value
+        self.call_name = self.process_type('Bytes').value
+
+        self.functions = self.process_type('Vec<MetadataV0ModuleFunction>').elements
+
+        result = {
+            "prefix": self.prefix,
+            "index": None,
+            "module": {
+                "name": self.name,
+                "call": {
+                    "name": self.call_name,
+                    "functions": [s.value for s in self.functions]
+                }
+
+            },
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            self.storage_prefix = self.process_type('Bytes').value
+            self.storage = self.process_type('Vec<MetadataV0ModuleStorage>').elements
+
+            result["storage"] = {
+                "prefix": self.storage_prefix,
+                "functions": [s.value for s in self.storage]
+            }
+
+        return result
+
+
+class MetadataV0ModuleFunction(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.id = None
+        self.name = None
+        self.args = []
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def get_identifier(self):
+        return self.name
+
+    def process(self):
+        self.id = self.get_next_bytes(2).hex()
+        self.name = self.process_type('Bytes').value
+        self.args = self.process_type('Vec<MetadataModuleCallArgument>').elements
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "id": self.id,
+            "name": self.name,
+            "args": [s.value for s in self.args],
+            "docs": self.docs
+        }
+
+
+class MetadataV0ModuleStorage(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.modifier = None
+        self.type = {}
+        self.fallback = None
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+        is_key_value = self.process_type('bool').value
+
+        if is_key_value:
+            self.type = {
+                "MapType": {
+                    "key": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value)}
+            }
+        else:
+            self.type = {
+                "PlainType": self.convert_type(self.process_type('Bytes').value)
+            }
+
+        self.fallback = self.process_type('HexBytes').value
+
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "modifier": self.modifier,
+            "type": self.type,
+            "default": self.fallback,
+            "docs": self.docs
+        }
+
+
+class MetadataV0Section(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.code = None
+        self.id = None
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.code = self.process_type('Bytes').value
+        self.id = self.get_next_bytes(2).hex()
+
+        return {
+            "name": self.name,
+            "code": self.code,
+            "id": self.id
+        }
+
+
+class MetadataModule(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.prefix = None
+        self.call_index = None
+        self.has_storage = False
+        self.storage = None
+        self.has_calls = False
+        self.calls = None
+        self.has_events = False
+        self.events = None
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    def get_identifier(self):
+        return self.name.lower()
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.prefix = self.process_type('Bytes').value
+
+        result = {
+            "name": self.name,
+            "prefix": self.prefix,
+            "storage": self.storage,
+            "calls": self.calls,
+            "events": self.events,
+            "constants": self.constants
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            # TODO convert to Option<Vec<MetadataModuleStorage>>
+            self.storage = self.process_type('Vec<MetadataModuleStorage>').elements
+            result["storage"] = [s.value for s in self.storage]
+
+        self.has_calls = self.process_type('bool').value
+
+        if self.has_calls:
+            # TODO convert to Option<Vec<MetadataModuleCall>>
+            self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+            result["calls"] = [s.value for s in self.calls]
+
+        self.has_events = self.process_type('bool').value
+
+        if self.has_events:
+            # TODO convert to Option<Vec<MetadataModuleEvent>>
+            self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+            result["events"] = [s.value for s in self.events]
+
+        return result
+
+
+class MetadataV1Module(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.prefix = None
+        self.call_index = None
+        self.has_storage = False
+        self.storage = None
+        self.has_calls = False
+        self.calls = None
+        self.has_events = False
+        self.events = None
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    def get_identifier(self):
+        return self.name.lower()
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.prefix = self.process_type('Bytes').value
+
+        result = {
+            "name": self.name,
+            "prefix": self.prefix,
+            "storage": self.storage,
+            "calls": self.calls,
+            "events": self.events,
+            "constants": self.constants
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            # TODO convert to Option<Vec<MetadataModuleStorage>>
+            self.storage = self.process_type('Vec<MetadataV1ModuleStorage>').elements
+            result["storage"] = [s.value for s in self.storage]
+
+        self.has_calls = self.process_type('bool').value
+
+        if self.has_calls:
+            # TODO convert to Option<Vec<MetadataModuleCall>>
+            self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+            result["calls"] = [s.value for s in self.calls]
+
+        self.has_events = self.process_type('bool').value
+
+        if self.has_events:
+            # TODO convert to Option<Vec<MetadataModuleEvent>>
+            self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+            result["events"] = [s.value for s in self.events]
+
+        return result
+
+
+class MetadataModuleStorage(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.modifier = None
+        self.type = {}
+        self.fallback = None
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+        is_key_value = self.process_type('bool').value
+
+        if is_key_value:
+            self.type = {
+                "MapType": {
+                    "key": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value),
+                    "isLinked": self.process_type('bool').value
+                }
+
+            }
+        else:
+            self.type = {
+                "PlainType": self.convert_type(self.process_type('Bytes').value)
+            }
+
+        self.fallback = self.process_type('HexBytes').value
+
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "modifier": self.modifier,
+            "type": self.type,
+            "fallback": self.fallback,
+            "docs": self.docs
+        }
+
+
+class MetadataV1ModuleStorage(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.modifier = None
+        self.type = {}
+        self.fallback = None
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+        is_key_value = self.process_type('bool').value
+
+        if is_key_value:
+            self.type = {
+                "MapType": {
+                    "key": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value)
+                }
+
+            }
+        else:
+            self.type = {
+                "PlainType": self.convert_type(self.process_type('Bytes').value)
+            }
+
+        self.fallback = self.process_type('HexBytes').value
+
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "modifier": self.modifier,
+            "type": self.type,
+            "fallback": self.fallback,
+            "docs": self.docs
+        }
+
+
+class MetadataModuleCall(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.args = []
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def get_identifier(self):
+        return self.name
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+
+        self.args = self.process_type('Vec<MetadataModuleCallArgument>').elements
+
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "args": [a.value for a in self.args],
+            "docs": self.docs
+        }
+
+
+class MetadataModuleCallArgument(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.type = None
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.type = self.convert_type(self.process_type('Bytes').value)
+
+        return {
+            "name": self.name,
+            "type": self.type
+        }
+
+
+class MetadataModuleEvent(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.args = []
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.args = self.process_type('Vec<Bytes>').value
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "args": self.args,
+            "docs": self.docs
+        }
+
+
+
+
+
+
+
+
+
+

Classes

+
+
+class MetadataDecoder +(data, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataDecoder(ScaleDecoder):
+
+    def __init__(self, data, **kwargs):
+        self.version = None
+        self.metadata = None
+        self.call_index = None
+        self.event_index = None
+        super().__init__(data, **kwargs)
+
+    def process(self):
+        magic_bytes = self.get_next_bytes(4)
+
+        if magic_bytes == b'meta':
+
+            self.version = self.process_type('Enum', value_list=[
+                "MetadataV0Decoder",
+                "MetadataV1Decoder",
+                "MetadataV2Decoder",
+                "MetadataV3Decoder",
+                "MetadataV4Decoder",
+                "MetadataV5Decoder",
+                "MetadataV6Decoder",
+                "MetadataV7Decoder",
+                "MetadataV8Decoder",
+                "MetadataV9Decoder",
+                "MetadataV10Decoder"
+            ])
+
+            self.metadata = self.process_type(self.version.value)
+
+            # TODO remove duplicate reference?
+            self.call_index = self.metadata.call_index
+            self.event_index = self.metadata.event_index
+
+            return self.metadata.value
+
+        else:
+            # Fall back to version unaware legacy MetadataV0
+            self.data.reset()
+
+            self.metadata = self.process_type('MetadataV0Decoder')
+
+            # TODO remove duplicate reference?
+            self.call_index = self.metadata.call_index
+            self.event_index = self.metadata.event_index
+
+            return self.metadata.value
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    magic_bytes = self.get_next_bytes(4)
+
+    if magic_bytes == b'meta':
+
+        self.version = self.process_type('Enum', value_list=[
+            "MetadataV0Decoder",
+            "MetadataV1Decoder",
+            "MetadataV2Decoder",
+            "MetadataV3Decoder",
+            "MetadataV4Decoder",
+            "MetadataV5Decoder",
+            "MetadataV6Decoder",
+            "MetadataV7Decoder",
+            "MetadataV8Decoder",
+            "MetadataV9Decoder",
+            "MetadataV10Decoder"
+        ])
+
+        self.metadata = self.process_type(self.version.value)
+
+        # TODO remove duplicate reference?
+        self.call_index = self.metadata.call_index
+        self.event_index = self.metadata.event_index
+
+        return self.metadata.value
+
+    else:
+        # Fall back to version unaware legacy MetadataV0
+        self.data.reset()
+
+        self.metadata = self.process_type('MetadataV0Decoder')
+
+        # TODO remove duplicate reference?
+        self.call_index = self.metadata.call_index
+        self.event_index = self.metadata.event_index
+
+        return self.metadata.value
+
+
+
+

Inherited members

+ +
+
+class MetadataModule +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataModule(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.prefix = None
+        self.call_index = None
+        self.has_storage = False
+        self.storage = None
+        self.has_calls = False
+        self.calls = None
+        self.has_events = False
+        self.events = None
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    def get_identifier(self):
+        return self.name.lower()
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.prefix = self.process_type('Bytes').value
+
+        result = {
+            "name": self.name,
+            "prefix": self.prefix,
+            "storage": self.storage,
+            "calls": self.calls,
+            "events": self.events,
+            "constants": self.constants
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            # TODO convert to Option<Vec<MetadataModuleStorage>>
+            self.storage = self.process_type('Vec<MetadataModuleStorage>').elements
+            result["storage"] = [s.value for s in self.storage]
+
+        self.has_calls = self.process_type('bool').value
+
+        if self.has_calls:
+            # TODO convert to Option<Vec<MetadataModuleCall>>
+            self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+            result["calls"] = [s.value for s in self.calls]
+
+        self.has_events = self.process_type('bool').value
+
+        if self.has_events:
+            # TODO convert to Option<Vec<MetadataModuleEvent>>
+            self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+            result["events"] = [s.value for s in self.events]
+
+        return result
+
+

Ancestors

+ +

Methods

+
+
+def get_identifier(self) +
+
+
+
+ +Expand source code + +
def get_identifier(self):
+    return self.name.lower()
+
+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.name = self.process_type('Bytes').value
+    self.prefix = self.process_type('Bytes').value
+
+    result = {
+        "name": self.name,
+        "prefix": self.prefix,
+        "storage": self.storage,
+        "calls": self.calls,
+        "events": self.events,
+        "constants": self.constants
+    }
+
+    self.has_storage = self.process_type('bool').value
+
+    if self.has_storage:
+        # TODO convert to Option<Vec<MetadataModuleStorage>>
+        self.storage = self.process_type('Vec<MetadataModuleStorage>').elements
+        result["storage"] = [s.value for s in self.storage]
+
+    self.has_calls = self.process_type('bool').value
+
+    if self.has_calls:
+        # TODO convert to Option<Vec<MetadataModuleCall>>
+        self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+        result["calls"] = [s.value for s in self.calls]
+
+    self.has_events = self.process_type('bool').value
+
+    if self.has_events:
+        # TODO convert to Option<Vec<MetadataModuleEvent>>
+        self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+        result["events"] = [s.value for s in self.events]
+
+    return result
+
+
+
+

Inherited members

+ +
+
+class MetadataModuleCall +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataModuleCall(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.args = []
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def get_identifier(self):
+        return self.name
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+
+        self.args = self.process_type('Vec<MetadataModuleCallArgument>').elements
+
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "args": [a.value for a in self.args],
+            "docs": self.docs
+        }
+
+

Ancestors

+ +

Methods

+
+
+def get_identifier(self) +
+
+
+
+ +Expand source code + +
def get_identifier(self):
+    return self.name
+
+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.name = self.process_type('Bytes').value
+
+    self.args = self.process_type('Vec<MetadataModuleCallArgument>').elements
+
+    self.docs = self.process_type('Vec<Bytes>').value
+
+    return {
+        "name": self.name,
+        "args": [a.value for a in self.args],
+        "docs": self.docs
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataModuleCallArgument +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataModuleCallArgument(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.type = None
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.type = self.convert_type(self.process_type('Bytes').value)
+
+        return {
+            "name": self.name,
+            "type": self.type
+        }
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.name = self.process_type('Bytes').value
+    self.type = self.convert_type(self.process_type('Bytes').value)
+
+    return {
+        "name": self.name,
+        "type": self.type
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataModuleError +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataModuleError(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "docs": self.docs
+        }
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.name = self.process_type('Bytes').value
+    self.docs = self.process_type('Vec<Bytes>').value
+
+    return {
+        "name": self.name,
+        "docs": self.docs
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataModuleEvent +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataModuleEvent(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.args = []
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.args = self.process_type('Vec<Bytes>').value
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "args": self.args,
+            "docs": self.docs
+        }
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.name = self.process_type('Bytes').value
+    self.args = self.process_type('Vec<Bytes>').value
+    self.docs = self.process_type('Vec<Bytes>').value
+
+    return {
+        "name": self.name,
+        "args": self.args,
+        "docs": self.docs
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataModuleStorage +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataModuleStorage(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.modifier = None
+        self.type = {}
+        self.fallback = None
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+        is_key_value = self.process_type('bool').value
+
+        if is_key_value:
+            self.type = {
+                "MapType": {
+                    "key": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value),
+                    "isLinked": self.process_type('bool').value
+                }
+
+            }
+        else:
+            self.type = {
+                "PlainType": self.convert_type(self.process_type('Bytes').value)
+            }
+
+        self.fallback = self.process_type('HexBytes').value
+
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "modifier": self.modifier,
+            "type": self.type,
+            "fallback": self.fallback,
+            "docs": self.docs
+        }
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.name = self.process_type('Bytes').value
+    self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+    is_key_value = self.process_type('bool').value
+
+    if is_key_value:
+        self.type = {
+            "MapType": {
+                "key": self.convert_type(self.process_type('Bytes').value),
+                "value": self.convert_type(self.process_type('Bytes').value),
+                "isLinked": self.process_type('bool').value
+            }
+
+        }
+    else:
+        self.type = {
+            "PlainType": self.convert_type(self.process_type('Bytes').value)
+        }
+
+    self.fallback = self.process_type('HexBytes').value
+
+    self.docs = self.process_type('Vec<Bytes>').value
+
+    return {
+        "name": self.name,
+        "modifier": self.modifier,
+        "type": self.type,
+        "fallback": self.fallback,
+        "docs": self.docs
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataV0Decoder +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV0Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.events_modules = []
+        self.modules = []
+        self.sections = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "metadata": {
+                "MetadataV0": {
+                    "outerEvent": {
+                        "name": self.process_type('Bytes').value,
+                        "events": []
+                    },
+                    "modules": [],
+                    "sections": []
+                }
+            }
+        }
+
+        self.events_modules = self.process_type('Vec<MetadataV0EventModule>').elements
+
+        self.modules = self.process_type('Vec<MetadataV0Module>').elements
+
+        # TODO why "Call" unused?
+        _ = self.process_type('Bytes').value
+
+        self.sections = self.process_type('Vec<MetadataV0Section>').elements
+
+        # Build call and event index
+        call_module_index = 0
+        for module_index, module in enumerate(self.modules):
+            if module_index > 0 and (len(module.functions) > 0 or len(module.storage) > 0):
+
+                for call_index, call in enumerate(module.functions):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+
+                call_module_index += 1
+
+        for event_module_index, event_module in enumerate(self.events_modules):
+            for event_index, event in enumerate(event_module.events):
+                event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                self.event_index[event.lookup] = (event_module, event)
+
+        result_data["metadata"]["MetadataV0"]["outerEvent"]["events"] = [e.value for e in self.events_modules]
+        result_data["metadata"]["MetadataV0"]["modules"] = [m.value for m in self.modules]
+        result_data["metadata"]["MetadataV0"]["sections"] = [s.value for s in self.sections]
+
+        return result_data
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    result_data = {
+        "metadata": {
+            "MetadataV0": {
+                "outerEvent": {
+                    "name": self.process_type('Bytes').value,
+                    "events": []
+                },
+                "modules": [],
+                "sections": []
+            }
+        }
+    }
+
+    self.events_modules = self.process_type('Vec<MetadataV0EventModule>').elements
+
+    self.modules = self.process_type('Vec<MetadataV0Module>').elements
+
+    # TODO why "Call" unused?
+    _ = self.process_type('Bytes').value
+
+    self.sections = self.process_type('Vec<MetadataV0Section>').elements
+
+    # Build call and event index
+    call_module_index = 0
+    for module_index, module in enumerate(self.modules):
+        if module_index > 0 and (len(module.functions) > 0 or len(module.storage) > 0):
+
+            for call_index, call in enumerate(module.functions):
+                call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                self.call_index[call.lookup] = (module, call)
+
+            call_module_index += 1
+
+    for event_module_index, event_module in enumerate(self.events_modules):
+        for event_index, event in enumerate(event_module.events):
+            event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+            self.event_index[event.lookup] = (event_module, event)
+
+    result_data["metadata"]["MetadataV0"]["outerEvent"]["events"] = [e.value for e in self.events_modules]
+    result_data["metadata"]["MetadataV0"]["modules"] = [m.value for m in self.modules]
+    result_data["metadata"]["MetadataV0"]["sections"] = [s.value for s in self.sections]
+
+    return result_data
+
+
+
+

Inherited members

+ +
+
+class MetadataV0Event +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV0Event(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.args = []
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.args = self.process_type('Vec<Bytes>').value
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "arguments": self.args,
+            "docs": self.docs
+        }
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.name = self.process_type('Bytes').value
+    self.args = self.process_type('Vec<Bytes>').value
+    self.docs = self.process_type('Vec<Bytes>').value
+
+    return {
+        "name": self.name,
+        "arguments": self.args,
+        "docs": self.docs
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataV0EventModule +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV0EventModule(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.events = None
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.events = self.process_type('Vec<MetadataV0Event>').elements
+
+        return {
+            'name': self.name,
+            'events': [s.value for s in self.events]
+        }
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.name = self.process_type('Bytes').value
+    self.events = self.process_type('Vec<MetadataV0Event>').elements
+
+    return {
+        'name': self.name,
+        'events': [s.value for s in self.events]
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataV0Module +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV0Module(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.prefix = None
+        self.name = None
+        self.call_name = None
+        self.functions = []
+        self.has_storage = False
+        self.storage_prefix = None
+        self.storage = []
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    # TODO move to version agnostic superclass MetadataModule
+    def get_identifier(self):
+        return self.prefix.lower()
+
+    def process(self):
+        self.prefix = self.process_type('Bytes').value
+        self.name = self.process_type('Bytes').value
+        self.call_name = self.process_type('Bytes').value
+
+        self.functions = self.process_type('Vec<MetadataV0ModuleFunction>').elements
+
+        result = {
+            "prefix": self.prefix,
+            "index": None,
+            "module": {
+                "name": self.name,
+                "call": {
+                    "name": self.call_name,
+                    "functions": [s.value for s in self.functions]
+                }
+
+            },
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            self.storage_prefix = self.process_type('Bytes').value
+            self.storage = self.process_type('Vec<MetadataV0ModuleStorage>').elements
+
+            result["storage"] = {
+                "prefix": self.storage_prefix,
+                "functions": [s.value for s in self.storage]
+            }
+
+        return result
+
+

Ancestors

+ +

Methods

+
+
+def get_identifier(self) +
+
+
+
+ +Expand source code + +
def get_identifier(self):
+    return self.prefix.lower()
+
+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.prefix = self.process_type('Bytes').value
+    self.name = self.process_type('Bytes').value
+    self.call_name = self.process_type('Bytes').value
+
+    self.functions = self.process_type('Vec<MetadataV0ModuleFunction>').elements
+
+    result = {
+        "prefix": self.prefix,
+        "index": None,
+        "module": {
+            "name": self.name,
+            "call": {
+                "name": self.call_name,
+                "functions": [s.value for s in self.functions]
+            }
+
+        },
+    }
+
+    self.has_storage = self.process_type('bool').value
+
+    if self.has_storage:
+        self.storage_prefix = self.process_type('Bytes').value
+        self.storage = self.process_type('Vec<MetadataV0ModuleStorage>').elements
+
+        result["storage"] = {
+            "prefix": self.storage_prefix,
+            "functions": [s.value for s in self.storage]
+        }
+
+    return result
+
+
+
+

Inherited members

+ +
+
+class MetadataV0ModuleFunction +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV0ModuleFunction(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.id = None
+        self.name = None
+        self.args = []
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def get_identifier(self):
+        return self.name
+
+    def process(self):
+        self.id = self.get_next_bytes(2).hex()
+        self.name = self.process_type('Bytes').value
+        self.args = self.process_type('Vec<MetadataModuleCallArgument>').elements
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "id": self.id,
+            "name": self.name,
+            "args": [s.value for s in self.args],
+            "docs": self.docs
+        }
+
+

Ancestors

+ +

Methods

+
+
+def get_identifier(self) +
+
+
+
+ +Expand source code + +
def get_identifier(self):
+    return self.name
+
+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.id = self.get_next_bytes(2).hex()
+    self.name = self.process_type('Bytes').value
+    self.args = self.process_type('Vec<MetadataModuleCallArgument>').elements
+    self.docs = self.process_type('Vec<Bytes>').value
+
+    return {
+        "id": self.id,
+        "name": self.name,
+        "args": [s.value for s in self.args],
+        "docs": self.docs
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataV0ModuleStorage +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV0ModuleStorage(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.modifier = None
+        self.type = {}
+        self.fallback = None
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+        is_key_value = self.process_type('bool').value
+
+        if is_key_value:
+            self.type = {
+                "MapType": {
+                    "key": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value)}
+            }
+        else:
+            self.type = {
+                "PlainType": self.convert_type(self.process_type('Bytes').value)
+            }
+
+        self.fallback = self.process_type('HexBytes').value
+
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "modifier": self.modifier,
+            "type": self.type,
+            "default": self.fallback,
+            "docs": self.docs
+        }
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.name = self.process_type('Bytes').value
+    self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+    is_key_value = self.process_type('bool').value
+
+    if is_key_value:
+        self.type = {
+            "MapType": {
+                "key": self.convert_type(self.process_type('Bytes').value),
+                "value": self.convert_type(self.process_type('Bytes').value)}
+        }
+    else:
+        self.type = {
+            "PlainType": self.convert_type(self.process_type('Bytes').value)
+        }
+
+    self.fallback = self.process_type('HexBytes').value
+
+    self.docs = self.process_type('Vec<Bytes>').value
+
+    return {
+        "name": self.name,
+        "modifier": self.modifier,
+        "type": self.type,
+        "default": self.fallback,
+        "docs": self.docs
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataV0Section +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV0Section(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.code = None
+        self.id = None
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.code = self.process_type('Bytes').value
+        self.id = self.get_next_bytes(2).hex()
+
+        return {
+            "name": self.name,
+            "code": self.code,
+            "id": self.id
+        }
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.name = self.process_type('Bytes').value
+    self.code = self.process_type('Bytes').value
+    self.id = self.get_next_bytes(2).hex()
+
+    return {
+        "name": self.name,
+        "code": self.code,
+        "id": self.id
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataV10Decoder +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV10Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV10": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV8Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV10"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    result_data = {
+        "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+        "metadata": {
+            "MetadataV10": {
+                "modules": [],
+            }
+        }
+    }
+
+    self.modules = self.process_type('Vec<MetadataV8Module>').elements
+
+    # Build call and event index
+
+    call_module_index = 0
+    event_module_index = 0
+
+    for module in self.modules:
+        if module.calls is not None:
+            for call_index, call in enumerate(module.calls):
+                call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                self.call_index[call.lookup] = (module, call)
+            call_module_index += 1
+
+        if module.events is not None:
+            for event_index, event in enumerate(module.events):
+                event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                self.event_index[event.lookup] = (module, event)
+            event_module_index += 1
+
+    result_data["metadata"]["MetadataV10"]["modules"] = [m.value for m in self.modules]
+
+    return result_data
+
+
+
+

Inherited members

+ +
+
+class MetadataV1Decoder +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV1Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV1": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV1Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV1"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    result_data = {
+        "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+        "metadata": {
+            "MetadataV1": {
+                "modules": [],
+            }
+        }
+    }
+
+    self.modules = self.process_type('Vec<MetadataV1Module>').elements
+
+    # Build call and event index
+
+    call_module_index = 0
+    event_module_index = 0
+
+    for module in self.modules:
+        if module.calls is not None:
+            for call_index, call in enumerate(module.calls):
+                call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                self.call_index[call.lookup] = (module, call)
+            call_module_index += 1
+
+        if module.events is not None:
+            for event_index, event in enumerate(module.events):
+                event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                self.event_index[event.lookup] = (module, event)
+            event_module_index += 1
+
+    result_data["metadata"]["MetadataV1"]["modules"] = [m.value for m in self.modules]
+
+    return result_data
+
+
+
+

Inherited members

+ +
+
+class MetadataV1Module +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV1Module(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.prefix = None
+        self.call_index = None
+        self.has_storage = False
+        self.storage = None
+        self.has_calls = False
+        self.calls = None
+        self.has_events = False
+        self.events = None
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    def get_identifier(self):
+        return self.name.lower()
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.prefix = self.process_type('Bytes').value
+
+        result = {
+            "name": self.name,
+            "prefix": self.prefix,
+            "storage": self.storage,
+            "calls": self.calls,
+            "events": self.events,
+            "constants": self.constants
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            # TODO convert to Option<Vec<MetadataModuleStorage>>
+            self.storage = self.process_type('Vec<MetadataV1ModuleStorage>').elements
+            result["storage"] = [s.value for s in self.storage]
+
+        self.has_calls = self.process_type('bool').value
+
+        if self.has_calls:
+            # TODO convert to Option<Vec<MetadataModuleCall>>
+            self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+            result["calls"] = [s.value for s in self.calls]
+
+        self.has_events = self.process_type('bool').value
+
+        if self.has_events:
+            # TODO convert to Option<Vec<MetadataModuleEvent>>
+            self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+            result["events"] = [s.value for s in self.events]
+
+        return result
+
+

Ancestors

+ +

Methods

+
+
+def get_identifier(self) +
+
+
+
+ +Expand source code + +
def get_identifier(self):
+    return self.name.lower()
+
+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.name = self.process_type('Bytes').value
+    self.prefix = self.process_type('Bytes').value
+
+    result = {
+        "name": self.name,
+        "prefix": self.prefix,
+        "storage": self.storage,
+        "calls": self.calls,
+        "events": self.events,
+        "constants": self.constants
+    }
+
+    self.has_storage = self.process_type('bool').value
+
+    if self.has_storage:
+        # TODO convert to Option<Vec<MetadataModuleStorage>>
+        self.storage = self.process_type('Vec<MetadataV1ModuleStorage>').elements
+        result["storage"] = [s.value for s in self.storage]
+
+    self.has_calls = self.process_type('bool').value
+
+    if self.has_calls:
+        # TODO convert to Option<Vec<MetadataModuleCall>>
+        self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+        result["calls"] = [s.value for s in self.calls]
+
+    self.has_events = self.process_type('bool').value
+
+    if self.has_events:
+        # TODO convert to Option<Vec<MetadataModuleEvent>>
+        self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+        result["events"] = [s.value for s in self.events]
+
+    return result
+
+
+
+

Inherited members

+ +
+
+class MetadataV1ModuleStorage +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV1ModuleStorage(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.modifier = None
+        self.type = {}
+        self.fallback = None
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+        self.name = self.process_type('Bytes').value
+        self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+        is_key_value = self.process_type('bool').value
+
+        if is_key_value:
+            self.type = {
+                "MapType": {
+                    "key": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value)
+                }
+
+            }
+        else:
+            self.type = {
+                "PlainType": self.convert_type(self.process_type('Bytes').value)
+            }
+
+        self.fallback = self.process_type('HexBytes').value
+
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "modifier": self.modifier,
+            "type": self.type,
+            "fallback": self.fallback,
+            "docs": self.docs
+        }
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.name = self.process_type('Bytes').value
+    self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+    is_key_value = self.process_type('bool').value
+
+    if is_key_value:
+        self.type = {
+            "MapType": {
+                "key": self.convert_type(self.process_type('Bytes').value),
+                "value": self.convert_type(self.process_type('Bytes').value)
+            }
+
+        }
+    else:
+        self.type = {
+            "PlainType": self.convert_type(self.process_type('Bytes').value)
+        }
+
+    self.fallback = self.process_type('HexBytes').value
+
+    self.docs = self.process_type('Vec<Bytes>').value
+
+    return {
+        "name": self.name,
+        "modifier": self.modifier,
+        "type": self.type,
+        "fallback": self.fallback,
+        "docs": self.docs
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataV2Decoder +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV2Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV2": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataModule>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV2"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    result_data = {
+        "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+        "metadata": {
+            "MetadataV2": {
+                "modules": [],
+            }
+        }
+    }
+
+    self.modules = self.process_type('Vec<MetadataModule>').elements
+
+    # Build call and event index
+
+    call_module_index = 0
+    event_module_index = 0
+
+    for module in self.modules:
+        if module.calls is not None:
+            for call_index, call in enumerate(module.calls):
+                call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                self.call_index[call.lookup] = (module, call)
+            call_module_index += 1
+
+        if module.events is not None:
+            for event_index, event in enumerate(module.events):
+                event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                self.event_index[event.lookup] = (module, event)
+            event_module_index += 1
+
+    result_data["metadata"]["MetadataV2"]["modules"] = [m.value for m in self.modules]
+
+    return result_data
+
+
+
+

Inherited members

+ +
+
+class MetadataV3Decoder +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV3Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV3": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataModule>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV3"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    result_data = {
+        "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+        "metadata": {
+            "MetadataV3": {
+                "modules": [],
+            }
+        }
+    }
+
+    self.modules = self.process_type('Vec<MetadataModule>').elements
+
+    # Build call and event index
+
+    call_module_index = 0
+    event_module_index = 0
+
+    for module in self.modules:
+        if module.calls is not None:
+            for call_index, call in enumerate(module.calls):
+                call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                self.call_index[call.lookup] = (module, call)
+            call_module_index += 1
+
+        if module.events is not None:
+            for event_index, event in enumerate(module.events):
+                event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                self.event_index[event.lookup] = (module, event)
+            event_module_index += 1
+
+    result_data["metadata"]["MetadataV3"]["modules"] = [m.value for m in self.modules]
+
+    return result_data
+
+
+
+

Inherited members

+ +
+
+class MetadataV4Decoder +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV4Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV4": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV4Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV4"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    result_data = {
+        "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+        "metadata": {
+            "MetadataV4": {
+                "modules": [],
+            }
+        }
+    }
+
+    self.modules = self.process_type('Vec<MetadataV4Module>').elements
+
+    # Build call and event index
+
+    call_module_index = 0
+    event_module_index = 0
+
+    for module in self.modules:
+        if module.calls is not None:
+            for call_index, call in enumerate(module.calls):
+                call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                self.call_index[call.lookup] = (module, call)
+            call_module_index += 1
+
+        if module.events is not None:
+            for event_index, event in enumerate(module.events):
+                event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                self.event_index[event.lookup] = (module, event)
+            event_module_index += 1
+
+    result_data["metadata"]["MetadataV4"]["modules"] = [m.value for m in self.modules]
+
+    return result_data
+
+
+
+

Inherited members

+ +
+
+class MetadataV4Module +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV4Module(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.prefix = None
+        self.call_index = None
+        self.has_storage = False
+        self.storage = None
+        self.has_calls = False
+        self.calls = None
+        self.has_events = False
+        self.events = None
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    def get_identifier(self):
+        return self.name.lower()
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.prefix = self.process_type('Bytes').value
+
+        result = {
+            "name": self.name,
+            "prefix": self.prefix,
+            "storage": self.storage,
+            "calls": self.calls,
+            "events": self.events,
+            "constants": self.constants,
+            "errors": self.errors
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            # TODO convert to Option<Vec<MetadataModuleStorage>>
+            self.storage = self.process_type('Vec<MetadataV4ModuleStorage>').elements
+            result["storage"] = [s.value for s in self.storage]
+
+        self.has_calls = self.process_type('bool').value
+
+        if self.has_calls:
+            # TODO convert to Option<Vec<MetadataModuleCall>>
+            self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+            result["calls"] = [s.value for s in self.calls]
+
+        self.has_events = self.process_type('bool').value
+
+        if self.has_events:
+            # TODO convert to Option<Vec<MetadataModuleEvent>>
+            self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+            result["events"] = [s.value for s in self.events]
+
+        return result
+
+

Ancestors

+ +

Methods

+
+
+def get_identifier(self) +
+
+
+
+ +Expand source code + +
def get_identifier(self):
+    return self.name.lower()
+
+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.name = self.process_type('Bytes').value
+    self.prefix = self.process_type('Bytes').value
+
+    result = {
+        "name": self.name,
+        "prefix": self.prefix,
+        "storage": self.storage,
+        "calls": self.calls,
+        "events": self.events,
+        "constants": self.constants,
+        "errors": self.errors
+    }
+
+    self.has_storage = self.process_type('bool').value
+
+    if self.has_storage:
+        # TODO convert to Option<Vec<MetadataModuleStorage>>
+        self.storage = self.process_type('Vec<MetadataV4ModuleStorage>').elements
+        result["storage"] = [s.value for s in self.storage]
+
+    self.has_calls = self.process_type('bool').value
+
+    if self.has_calls:
+        # TODO convert to Option<Vec<MetadataModuleCall>>
+        self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+        result["calls"] = [s.value for s in self.calls]
+
+    self.has_events = self.process_type('bool').value
+
+    if self.has_events:
+        # TODO convert to Option<Vec<MetadataModuleEvent>>
+        self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+        result["events"] = [s.value for s in self.events]
+
+    return result
+
+
+
+

Inherited members

+ +
+
+class MetadataV4ModuleStorage +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV4ModuleStorage(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.modifier = None
+        self.type = {}
+        self.fallback = None
+        self.docs = []
+        self.hasher = None
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+        storage_function_type = self.process_type('Enum', value_list=["PlainType", "MapType", "DoubleMapType"]).value
+
+        if storage_function_type == 'MapType':
+            self.hasher = self.process_type('StorageHasher')
+            self.type = {
+                "MapType": {
+                    "hasher": self.hasher.value,
+                    "key": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value),
+                    "isLinked": self.process_type('bool').value
+                }
+            }
+        elif storage_function_type == 'DoubleMapType':
+            self.hasher = self.process_type('StorageHasher')
+            self.type = {
+                "DoubleMapType": {
+                    "hasher": self.hasher.value,
+                    "key1": self.convert_type(self.process_type('Bytes').value),
+                    "key2": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value),
+                    "key2Hasher": self.process_type('Bytes').value
+                }
+            }
+
+        elif storage_function_type == 'PlainType':
+            self.type = {
+                "PlainType": self.convert_type(self.process_type('Bytes').value)
+            }
+
+        self.fallback = self.process_type('HexBytes').value
+
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "modifier": self.modifier,
+            "type": self.type,
+            "fallback": self.fallback,
+            "docs": self.docs
+        }
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.name = self.process_type('Bytes').value
+    self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+    storage_function_type = self.process_type('Enum', value_list=["PlainType", "MapType", "DoubleMapType"]).value
+
+    if storage_function_type == 'MapType':
+        self.hasher = self.process_type('StorageHasher')
+        self.type = {
+            "MapType": {
+                "hasher": self.hasher.value,
+                "key": self.convert_type(self.process_type('Bytes').value),
+                "value": self.convert_type(self.process_type('Bytes').value),
+                "isLinked": self.process_type('bool').value
+            }
+        }
+    elif storage_function_type == 'DoubleMapType':
+        self.hasher = self.process_type('StorageHasher')
+        self.type = {
+            "DoubleMapType": {
+                "hasher": self.hasher.value,
+                "key1": self.convert_type(self.process_type('Bytes').value),
+                "key2": self.convert_type(self.process_type('Bytes').value),
+                "value": self.convert_type(self.process_type('Bytes').value),
+                "key2Hasher": self.process_type('Bytes').value
+            }
+        }
+
+    elif storage_function_type == 'PlainType':
+        self.type = {
+            "PlainType": self.convert_type(self.process_type('Bytes').value)
+        }
+
+    self.fallback = self.process_type('HexBytes').value
+
+    self.docs = self.process_type('Vec<Bytes>').value
+
+    return {
+        "name": self.name,
+        "modifier": self.modifier,
+        "type": self.type,
+        "fallback": self.fallback,
+        "docs": self.docs
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataV5Decoder +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV5Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV5": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV4Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV5"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    result_data = {
+        "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+        "metadata": {
+            "MetadataV5": {
+                "modules": [],
+            }
+        }
+    }
+
+    self.modules = self.process_type('Vec<MetadataV4Module>').elements
+
+    # Build call and event index
+
+    call_module_index = 0
+    event_module_index = 0
+
+    for module in self.modules:
+        if module.calls is not None:
+            for call_index, call in enumerate(module.calls):
+                call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                self.call_index[call.lookup] = (module, call)
+            call_module_index += 1
+
+        if module.events is not None:
+            for event_index, event in enumerate(module.events):
+                event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                self.event_index[event.lookup] = (module, event)
+            event_module_index += 1
+
+    result_data["metadata"]["MetadataV5"]["modules"] = [m.value for m in self.modules]
+
+    return result_data
+
+
+
+

Inherited members

+ +
+
+class MetadataV5Module +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV5Module(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.prefix = None
+        self.call_index = None
+        self.has_storage = False
+        self.storage = None
+        self.has_calls = False
+        self.calls = None
+        self.has_events = False
+        self.events = None
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    def get_identifier(self):
+        return self.name.lower()
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.prefix = self.process_type('Bytes').value
+
+        result = {
+            "name": self.name,
+            "prefix": self.prefix,
+            "storage": self.storage,
+            "calls": self.calls,
+            "events": self.events,
+            "constants": self.constants,
+            "errors": self.errors
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            # TODO convert to Option<Vec<MetadataModuleStorage>>
+            self.storage = self.process_type('Vec<MetadataV5ModuleStorage>').elements
+            result["storage"] = [s.value for s in self.storage]
+
+        self.has_calls = self.process_type('bool').value
+
+        if self.has_calls:
+            # TODO convert to Option<Vec<MetadataModuleCall>>
+            self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+            result["calls"] = [s.value for s in self.calls]
+
+        self.has_events = self.process_type('bool').value
+
+        if self.has_events:
+            # TODO convert to Option<Vec<MetadataModuleEvent>>
+            self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+            result["events"] = [s.value for s in self.events]
+
+        return result
+
+

Ancestors

+ +

Methods

+
+
+def get_identifier(self) +
+
+
+
+ +Expand source code + +
def get_identifier(self):
+    return self.name.lower()
+
+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.name = self.process_type('Bytes').value
+    self.prefix = self.process_type('Bytes').value
+
+    result = {
+        "name": self.name,
+        "prefix": self.prefix,
+        "storage": self.storage,
+        "calls": self.calls,
+        "events": self.events,
+        "constants": self.constants,
+        "errors": self.errors
+    }
+
+    self.has_storage = self.process_type('bool').value
+
+    if self.has_storage:
+        # TODO convert to Option<Vec<MetadataModuleStorage>>
+        self.storage = self.process_type('Vec<MetadataV5ModuleStorage>').elements
+        result["storage"] = [s.value for s in self.storage]
+
+    self.has_calls = self.process_type('bool').value
+
+    if self.has_calls:
+        # TODO convert to Option<Vec<MetadataModuleCall>>
+        self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+        result["calls"] = [s.value for s in self.calls]
+
+    self.has_events = self.process_type('bool').value
+
+    if self.has_events:
+        # TODO convert to Option<Vec<MetadataModuleEvent>>
+        self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+        result["events"] = [s.value for s in self.events]
+
+    return result
+
+
+
+

Inherited members

+ +
+
+class MetadataV5ModuleStorage +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV5ModuleStorage(ScaleType):
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.modifier = None
+        self.type = {}
+        self.fallback = None
+        self.docs = []
+        self.hasher = None
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+        storage_function_type = self.process_type('Enum', value_list=["PlainType", "MapType", "DoubleMapType"]).value
+
+        if storage_function_type == 'MapType':
+            self.hasher = self.process_type('StorageHasher')
+            self.type = {
+                "MapType": {
+                    "hasher": self.hasher.value,
+                    "key": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value),
+                    "isLinked": self.process_type('bool').value
+                }
+            }
+        elif storage_function_type == 'DoubleMapType':
+            self.hasher = self.process_type('StorageHasher')
+            self.type = {
+                "DoubleMapType": {
+                    "hasher": self.hasher.value,
+                    "key1": self.convert_type(self.process_type('Bytes').value),
+                    "key2": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value),
+                    "key2Hasher": self.process_type('StorageHasher').value
+                }
+            }
+
+        elif storage_function_type == 'PlainType':
+            self.type = {
+                "PlainType": self.convert_type(self.process_type('Bytes').value)
+            }
+
+        self.fallback = self.process_type('HexBytes').value
+
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "modifier": self.modifier,
+            "type": self.type,
+            "fallback": self.fallback,
+            "docs": self.docs
+        }
+
+

Ancestors

+ +

Subclasses

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.name = self.process_type('Bytes').value
+    self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+    storage_function_type = self.process_type('Enum', value_list=["PlainType", "MapType", "DoubleMapType"]).value
+
+    if storage_function_type == 'MapType':
+        self.hasher = self.process_type('StorageHasher')
+        self.type = {
+            "MapType": {
+                "hasher": self.hasher.value,
+                "key": self.convert_type(self.process_type('Bytes').value),
+                "value": self.convert_type(self.process_type('Bytes').value),
+                "isLinked": self.process_type('bool').value
+            }
+        }
+    elif storage_function_type == 'DoubleMapType':
+        self.hasher = self.process_type('StorageHasher')
+        self.type = {
+            "DoubleMapType": {
+                "hasher": self.hasher.value,
+                "key1": self.convert_type(self.process_type('Bytes').value),
+                "key2": self.convert_type(self.process_type('Bytes').value),
+                "value": self.convert_type(self.process_type('Bytes').value),
+                "key2Hasher": self.process_type('StorageHasher').value
+            }
+        }
+
+    elif storage_function_type == 'PlainType':
+        self.type = {
+            "PlainType": self.convert_type(self.process_type('Bytes').value)
+        }
+
+    self.fallback = self.process_type('HexBytes').value
+
+    self.docs = self.process_type('Vec<Bytes>').value
+
+    return {
+        "name": self.name,
+        "modifier": self.modifier,
+        "type": self.type,
+        "fallback": self.fallback,
+        "docs": self.docs
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataV6Decoder +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV6Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV6": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV6Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV6"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    result_data = {
+        "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+        "metadata": {
+            "MetadataV6": {
+                "modules": [],
+            }
+        }
+    }
+
+    self.modules = self.process_type('Vec<MetadataV6Module>').elements
+
+    # Build call and event index
+
+    call_module_index = 0
+    event_module_index = 0
+
+    for module in self.modules:
+        if module.calls is not None:
+            for call_index, call in enumerate(module.calls):
+                call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                self.call_index[call.lookup] = (module, call)
+            call_module_index += 1
+
+        if module.events is not None:
+            for event_index, event in enumerate(module.events):
+                event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                self.event_index[event.lookup] = (module, event)
+            event_module_index += 1
+
+    result_data["metadata"]["MetadataV6"]["modules"] = [m.value for m in self.modules]
+
+    return result_data
+
+
+
+

Inherited members

+ +
+
+class MetadataV6Module +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV6Module(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.prefix = None
+        self.call_index = None
+        self.has_storage = False
+        self.storage = None
+        self.has_calls = False
+        self.calls = None
+        self.has_events = False
+        self.events = None
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    def get_identifier(self):
+        return self.name.lower()
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.prefix = self.process_type('Bytes').value
+
+        result = {
+            "name": self.name,
+            "prefix": self.prefix,
+            "storage": self.storage,
+            "calls": self.calls,
+            "events": self.events,
+            "constants": self.constants,
+            "errors": self.errors
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            # TODO convert to Option<Vec<MetadataModuleStorage>>
+            self.storage = self.process_type('Vec<MetadataV6ModuleStorage>').elements
+            result["storage"] = [s.value for s in self.storage]
+
+        self.has_calls = self.process_type('bool').value
+
+        if self.has_calls:
+            # TODO convert to Option<Vec<MetadataModuleCall>>
+            self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+            result["calls"] = [s.value for s in self.calls]
+
+        self.has_events = self.process_type('bool').value
+
+        if self.has_events:
+            # TODO convert to Option<Vec<MetadataModuleEvent>>
+            self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+            result["events"] = [s.value for s in self.events]
+
+        self.constants = self.process_type('Vec<MetadataV6ModuleConstants>').elements
+        result["constants"] = [s.value for s in self.constants]
+
+        return result
+
+

Ancestors

+ +

Subclasses

+ +

Methods

+
+
+def get_identifier(self) +
+
+
+
+ +Expand source code + +
def get_identifier(self):
+    return self.name.lower()
+
+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.name = self.process_type('Bytes').value
+    self.prefix = self.process_type('Bytes').value
+
+    result = {
+        "name": self.name,
+        "prefix": self.prefix,
+        "storage": self.storage,
+        "calls": self.calls,
+        "events": self.events,
+        "constants": self.constants,
+        "errors": self.errors
+    }
+
+    self.has_storage = self.process_type('bool').value
+
+    if self.has_storage:
+        # TODO convert to Option<Vec<MetadataModuleStorage>>
+        self.storage = self.process_type('Vec<MetadataV6ModuleStorage>').elements
+        result["storage"] = [s.value for s in self.storage]
+
+    self.has_calls = self.process_type('bool').value
+
+    if self.has_calls:
+        # TODO convert to Option<Vec<MetadataModuleCall>>
+        self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+        result["calls"] = [s.value for s in self.calls]
+
+    self.has_events = self.process_type('bool').value
+
+    if self.has_events:
+        # TODO convert to Option<Vec<MetadataModuleEvent>>
+        self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+        result["events"] = [s.value for s in self.events]
+
+    self.constants = self.process_type('Vec<MetadataV6ModuleConstants>').elements
+    result["constants"] = [s.value for s in self.constants]
+
+    return result
+
+
+
+

Inherited members

+ +
+
+class MetadataV6ModuleConstants +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV6ModuleConstants(ScaleType):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.type = None
+        self.constant_value = None
+        self.docs = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.type = self.convert_type(self.process_type('Bytes').value)
+        self.constant_value = self.process_type('HexBytes').value
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "type": self.type,
+            "value": self.constant_value,
+            "docs": self.docs
+        }
+
+

Ancestors

+ +

Subclasses

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.name = self.process_type('Bytes').value
+    self.type = self.convert_type(self.process_type('Bytes').value)
+    self.constant_value = self.process_type('HexBytes').value
+    self.docs = self.process_type('Vec<Bytes>').value
+
+    return {
+        "name": self.name,
+        "type": self.type,
+        "value": self.constant_value,
+        "docs": self.docs
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataV6ModuleStorage +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV6ModuleStorage(MetadataV5ModuleStorage):
+    pass
+
+

Ancestors

+ +

Subclasses

+ +

Inherited members

+ +
+
+class MetadataV7Decoder +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV7Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV7": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV7Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV7"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    result_data = {
+        "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+        "metadata": {
+            "MetadataV7": {
+                "modules": [],
+            }
+        }
+    }
+
+    self.modules = self.process_type('Vec<MetadataV7Module>').elements
+
+    # Build call and event index
+
+    call_module_index = 0
+    event_module_index = 0
+
+    for module in self.modules:
+        if module.calls is not None:
+            for call_index, call in enumerate(module.calls):
+                call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                self.call_index[call.lookup] = (module, call)
+            call_module_index += 1
+
+        if module.events is not None:
+            for event_index, event in enumerate(module.events):
+                event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                self.event_index[event.lookup] = (module, event)
+            event_module_index += 1
+
+    result_data["metadata"]["MetadataV7"]["modules"] = [m.value for m in self.modules]
+
+    return result_data
+
+
+
+

Inherited members

+ +
+
+class MetadataV7Module +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV7Module(MetadataV6Module):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.prefix = None
+        self.call_index = None
+        self.has_storage = False
+        self.storage = None
+        self.has_calls = False
+        self.calls = None
+        self.has_events = False
+        self.events = None
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+
+        result = {
+            "name": self.name,
+            "prefix": self.prefix,
+            "storage": self.storage,
+            "calls": self.calls,
+            "events": self.events,
+            "constants": self.constants,
+            "errors": self.errors
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            # TODO convert to Option<Vec<MetadataModuleStorage>>
+            self.storage = self.process_type('MetadataV7ModuleStorage')
+            result["storage"] = self.storage.value
+            # TODO moved to storage, change data model
+            self.prefix = self.storage.prefix
+            result["prefix"] = self.prefix
+
+        self.has_calls = self.process_type('bool').value
+
+        if self.has_calls:
+            # TODO convert to Option<Vec<MetadataModuleCall>>
+            self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+            result["calls"] = [s.value for s in self.calls]
+
+        self.has_events = self.process_type('bool').value
+
+        if self.has_events:
+            # TODO convert to Option<Vec<MetadataModuleEvent>>
+            self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+            result["events"] = [s.value for s in self.events]
+
+        self.constants = self.process_type('Vec<MetadataV7ModuleConstants>').elements
+        result["constants"] = [s.value for s in self.constants]
+
+        return result
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.name = self.process_type('Bytes').value
+
+    result = {
+        "name": self.name,
+        "prefix": self.prefix,
+        "storage": self.storage,
+        "calls": self.calls,
+        "events": self.events,
+        "constants": self.constants,
+        "errors": self.errors
+    }
+
+    self.has_storage = self.process_type('bool').value
+
+    if self.has_storage:
+        # TODO convert to Option<Vec<MetadataModuleStorage>>
+        self.storage = self.process_type('MetadataV7ModuleStorage')
+        result["storage"] = self.storage.value
+        # TODO moved to storage, change data model
+        self.prefix = self.storage.prefix
+        result["prefix"] = self.prefix
+
+    self.has_calls = self.process_type('bool').value
+
+    if self.has_calls:
+        # TODO convert to Option<Vec<MetadataModuleCall>>
+        self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+        result["calls"] = [s.value for s in self.calls]
+
+    self.has_events = self.process_type('bool').value
+
+    if self.has_events:
+        # TODO convert to Option<Vec<MetadataModuleEvent>>
+        self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+        result["events"] = [s.value for s in self.events]
+
+    self.constants = self.process_type('Vec<MetadataV7ModuleConstants>').elements
+    result["constants"] = [s.value for s in self.constants]
+
+    return result
+
+
+
+

Inherited members

+ +
+
+class MetadataV7ModuleConstants +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV7ModuleConstants(MetadataV6ModuleConstants):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class MetadataV7ModuleStorage +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV7ModuleStorage(MetadataV6ModuleStorage):
+
+    def __init__(self, data, sub_type=None):
+        self.prefix = None
+        self.items = []
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.prefix = self.process_type('Bytes').value
+        self.items = self.process_type('Vec<MetadataV7ModuleStorageEntry>').elements
+
+        return {
+            "prefix": self.prefix,
+            "items": [s.value for s in self.items]
+        }
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.prefix = self.process_type('Bytes').value
+    self.items = self.process_type('Vec<MetadataV7ModuleStorageEntry>').elements
+
+    return {
+        "prefix": self.prefix,
+        "items": [s.value for s in self.items]
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataV7ModuleStorageEntry +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV7ModuleStorageEntry(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.modifier = None
+        self.type = {}
+        self.fallback = None
+        self.docs = []
+        self.hasher = None
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+        self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+        storage_function_type = self.process_type('Enum', value_list=["PlainType", "MapType", "DoubleMapType"]).value
+
+        if storage_function_type == 'MapType':
+            self.hasher = self.process_type('StorageHasher')
+            self.type = {
+                "MapType": {
+                    "hasher": self.hasher.value,
+                    "key": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value),
+                    "isLinked": self.process_type('bool').value
+                }
+            }
+        elif storage_function_type == 'DoubleMapType':
+            self.hasher = self.process_type('StorageHasher')
+            self.type = {
+                "DoubleMapType": {
+                    "hasher": self.hasher.value,
+                    "key1": self.convert_type(self.process_type('Bytes').value),
+                    "key2": self.convert_type(self.process_type('Bytes').value),
+                    "value": self.convert_type(self.process_type('Bytes').value),
+                    "key2Hasher": self.process_type('StorageHasher').value
+                }
+            }
+
+        elif storage_function_type == 'PlainType':
+            self.type = {
+                "PlainType": self.convert_type(self.process_type('Bytes').value)
+            }
+
+        self.fallback = self.process_type('HexBytes').value
+
+        self.docs = self.process_type('Vec<Bytes>').value
+
+        return {
+            "name": self.name,
+            "modifier": self.modifier,
+            "type": self.type,
+            "fallback": self.fallback,
+            "docs": self.docs
+        }
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.name = self.process_type('Bytes').value
+    self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value
+
+    storage_function_type = self.process_type('Enum', value_list=["PlainType", "MapType", "DoubleMapType"]).value
+
+    if storage_function_type == 'MapType':
+        self.hasher = self.process_type('StorageHasher')
+        self.type = {
+            "MapType": {
+                "hasher": self.hasher.value,
+                "key": self.convert_type(self.process_type('Bytes').value),
+                "value": self.convert_type(self.process_type('Bytes').value),
+                "isLinked": self.process_type('bool').value
+            }
+        }
+    elif storage_function_type == 'DoubleMapType':
+        self.hasher = self.process_type('StorageHasher')
+        self.type = {
+            "DoubleMapType": {
+                "hasher": self.hasher.value,
+                "key1": self.convert_type(self.process_type('Bytes').value),
+                "key2": self.convert_type(self.process_type('Bytes').value),
+                "value": self.convert_type(self.process_type('Bytes').value),
+                "key2Hasher": self.process_type('StorageHasher').value
+            }
+        }
+
+    elif storage_function_type == 'PlainType':
+        self.type = {
+            "PlainType": self.convert_type(self.process_type('Bytes').value)
+        }
+
+    self.fallback = self.process_type('HexBytes').value
+
+    self.docs = self.process_type('Vec<Bytes>').value
+
+    return {
+        "name": self.name,
+        "modifier": self.modifier,
+        "type": self.type,
+        "fallback": self.fallback,
+        "docs": self.docs
+    }
+
+
+
+

Inherited members

+ +
+
+class MetadataV8Decoder +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV8Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV8": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV8Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV8"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    result_data = {
+        "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+        "metadata": {
+            "MetadataV8": {
+                "modules": [],
+            }
+        }
+    }
+
+    self.modules = self.process_type('Vec<MetadataV8Module>').elements
+
+    # Build call and event index
+
+    call_module_index = 0
+    event_module_index = 0
+
+    for module in self.modules:
+        if module.calls is not None:
+            for call_index, call in enumerate(module.calls):
+                call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                self.call_index[call.lookup] = (module, call)
+            call_module_index += 1
+
+        if module.events is not None:
+            for event_index, event in enumerate(module.events):
+                event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                self.event_index[event.lookup] = (module, event)
+            event_module_index += 1
+
+    result_data["metadata"]["MetadataV8"]["modules"] = [m.value for m in self.modules]
+
+    return result_data
+
+
+
+

Inherited members

+ +
+
+class MetadataV8Module +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV8Module(MetadataV6Module):
+
+    def __init__(self, data, sub_type=None):
+        self.name = None
+        self.prefix = None
+        self.call_index = None
+        self.has_storage = False
+        self.storage = None
+        self.has_calls = False
+        self.calls = None
+        self.has_events = False
+        self.events = None
+        self.constants = []
+        self.errors = []
+        super().__init__(data, sub_type)
+
+    def process(self):
+
+        self.name = self.process_type('Bytes').value
+
+        result = {
+            "name": self.name,
+            "prefix": self.prefix,
+            "storage": self.storage,
+            "calls": self.calls,
+            "events": self.events,
+            "constants": self.constants,
+            "errors": self.errors
+        }
+
+        self.has_storage = self.process_type('bool').value
+
+        if self.has_storage:
+            # TODO convert to Option<Vec<MetadataModuleStorage>>
+            self.storage = self.process_type('MetadataV7ModuleStorage')
+            result["storage"] = self.storage.value
+            # TODO moved to storage, change data model
+            self.prefix = self.storage.prefix
+            result["prefix"] = self.prefix
+
+        self.has_calls = self.process_type('bool').value
+
+        if self.has_calls:
+            # TODO convert to Option<Vec<MetadataModuleCall>>
+            self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+            result["calls"] = [s.value for s in self.calls]
+
+        self.has_events = self.process_type('bool').value
+
+        if self.has_events:
+            # TODO convert to Option<Vec<MetadataModuleEvent>>
+            self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+            result["events"] = [s.value for s in self.events]
+
+        self.constants = self.process_type('Vec<MetadataV7ModuleConstants>').elements
+        result["constants"] = [s.value for s in self.constants]
+
+        self.errors = self.process_type('Vec<MetadataModuleError>').elements
+        result["errors"] = [s.value for s in self.errors]
+
+        return result
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.name = self.process_type('Bytes').value
+
+    result = {
+        "name": self.name,
+        "prefix": self.prefix,
+        "storage": self.storage,
+        "calls": self.calls,
+        "events": self.events,
+        "constants": self.constants,
+        "errors": self.errors
+    }
+
+    self.has_storage = self.process_type('bool').value
+
+    if self.has_storage:
+        # TODO convert to Option<Vec<MetadataModuleStorage>>
+        self.storage = self.process_type('MetadataV7ModuleStorage')
+        result["storage"] = self.storage.value
+        # TODO moved to storage, change data model
+        self.prefix = self.storage.prefix
+        result["prefix"] = self.prefix
+
+    self.has_calls = self.process_type('bool').value
+
+    if self.has_calls:
+        # TODO convert to Option<Vec<MetadataModuleCall>>
+        self.calls = self.process_type('Vec<MetadataModuleCall>').elements
+        result["calls"] = [s.value for s in self.calls]
+
+    self.has_events = self.process_type('bool').value
+
+    if self.has_events:
+        # TODO convert to Option<Vec<MetadataModuleEvent>>
+        self.events = self.process_type('Vec<MetadataModuleEvent>').elements
+        result["events"] = [s.value for s in self.events]
+
+    self.constants = self.process_type('Vec<MetadataV7ModuleConstants>').elements
+    result["constants"] = [s.value for s in self.constants]
+
+    self.errors = self.process_type('Vec<MetadataModuleError>').elements
+    result["errors"] = [s.value for s in self.errors]
+
+    return result
+
+
+
+

Inherited members

+ +
+
+class MetadataV9Decoder +(data, sub_type=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MetadataV9Decoder(ScaleDecoder):
+
+    def __init__(self, data, sub_type=None):
+        self.version = None
+        self.modules = []
+        self.call_index = {}
+        self.event_index = {}
+
+        super().__init__(data, sub_type)
+
+    def process(self):
+        result_data = {
+            "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+            "metadata": {
+                "MetadataV9": {
+                    "modules": [],
+                }
+            }
+        }
+
+        self.modules = self.process_type('Vec<MetadataV8Module>').elements
+
+        # Build call and event index
+
+        call_module_index = 0
+        event_module_index = 0
+
+        for module in self.modules:
+            if module.calls is not None:
+                for call_index, call in enumerate(module.calls):
+                    call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                    self.call_index[call.lookup] = (module, call)
+                call_module_index += 1
+
+            if module.events is not None:
+                for event_index, event in enumerate(module.events):
+                    event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                    self.event_index[event.lookup] = (module, event)
+                event_module_index += 1
+
+        result_data["metadata"]["MetadataV9"]["modules"] = [m.value for m in self.modules]
+
+        return result_data
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    result_data = {
+        "magicNumber": 1635018093,  # struct.unpack('<L', bytearray.fromhex("6174656d")),
+        "metadata": {
+            "MetadataV9": {
+                "modules": [],
+            }
+        }
+    }
+
+    self.modules = self.process_type('Vec<MetadataV8Module>').elements
+
+    # Build call and event index
+
+    call_module_index = 0
+    event_module_index = 0
+
+    for module in self.modules:
+        if module.calls is not None:
+            for call_index, call in enumerate(module.calls):
+                call.lookup = "{:02x}{:02x}".format(call_module_index, call_index)
+                self.call_index[call.lookup] = (module, call)
+            call_module_index += 1
+
+        if module.events is not None:
+            for event_index, event in enumerate(module.events):
+                event.lookup = "{:02x}{:02x}".format(event_module_index, event_index)
+                self.event_index[event.lookup] = (module, event)
+            event_module_index += 1
+
+    result_data["metadata"]["MetadataV9"]["modules"] = [m.value for m in self.modules]
+
+    return result_data
+
+
+
+

Inherited members

+ +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/py-scale-codec/docs/type_registry/index.html b/py-scale-codec/docs/type_registry/index.html new file mode 100644 index 00000000..9fce3a3a --- /dev/null +++ b/py-scale-codec/docs/type_registry/index.html @@ -0,0 +1,115 @@ + + + + + + +scalecodec.type_registry API documentation + + + + + + + + + +
+
+
+

Module scalecodec.type_registry

+
+
+
+ +Expand source code + +
import os
+import json
+
+
+def load_type_registry_preset(name):
+    module_path = os.path.dirname(__file__)
+    path = os.path.join(module_path, '{}.json'.format(name))
+    return load_type_registry_file(path)
+
+
+def load_type_registry_file(file_path):
+
+    with open(os.path.abspath(file_path), 'r') as fp:
+        data = fp.read()
+
+    return json.loads(data)
+
+
+
+
+
+
+
+

Functions

+
+
+def load_type_registry_file(file_path) +
+
+
+
+ +Expand source code + +
def load_type_registry_file(file_path):
+
+    with open(os.path.abspath(file_path), 'r') as fp:
+        data = fp.read()
+
+    return json.loads(data)
+
+
+
+def load_type_registry_preset(name) +
+
+
+
+ +Expand source code + +
def load_type_registry_preset(name):
+    module_path = os.path.dirname(__file__)
+    path = os.path.join(module_path, '{}.json'.format(name))
+    return load_type_registry_file(path)
+
+
+
+
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/py-scale-codec/docs/types.html b/py-scale-codec/docs/types.html new file mode 100644 index 00000000..58c126d9 --- /dev/null +++ b/py-scale-codec/docs/types.html @@ -0,0 +1,11656 @@ + + + + + + +scalecodec.types API documentation + + + + + + + + + +
+
+
+

Module scalecodec.types

+
+
+
+ +Expand source code + +
# Python SCALE Codec Library
+#
+# Copyright 2018-2019 openAware BV (NL).
+# This file is part of Polkascan.
+#
+# Polkascan is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Polkascan is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Polkascan. If not, see <http://www.gnu.org/licenses/>.
+
+from datetime import datetime
+from scalecodec.base import ScaleType, ScaleBytes
+from scalecodec.exceptions import InvalidScaleTypeValueException
+
+
+class Compact(ScaleType):
+
+    def __init__(self, data=None, **kwargs):
+        self.compact_length = 0
+        self.compact_bytes = None
+        super().__init__(data, **kwargs)
+
+    def process_compact_bytes(self):
+        compact_byte = self.get_next_bytes(1)
+        try:
+            byte_mod = compact_byte[0] % 4
+        except IndexError:
+            raise InvalidScaleTypeValueException("Invalid byte for Compact")
+
+        if byte_mod == 0:
+            self.compact_length = 1
+        elif byte_mod == 1:
+            self.compact_length = 2
+        elif byte_mod == 2:
+            self.compact_length = 4
+        else:
+            self.compact_length = int(5 + (compact_byte[0] - 3) / 4)
+
+        if self.compact_length == 1:
+            self.compact_bytes = compact_byte
+        elif self.compact_length in [2, 4]:
+            self.compact_bytes = compact_byte + self.get_next_bytes(self.compact_length - 1)
+        else:
+            self.compact_bytes = self.get_next_bytes(self.compact_length - 1)
+
+        return self.compact_bytes
+
+    def process(self):
+
+        self.process_compact_bytes()
+
+        if self.sub_type:
+
+            byte_data = self.get_decoder_class(self.sub_type, ScaleBytes(self.compact_bytes)).process()
+
+            if type(byte_data) is int and self.compact_length <= 4:
+                return int(byte_data / 4)
+            else:
+                return byte_data
+        else:
+            return self.compact_bytes
+
+    def process_encode(self, value):
+
+        if value <= 0b00111111:
+            return ScaleBytes(bytearray(int(value << 2).to_bytes(1, 'little')))
+
+        elif value <= 0b0011111111111111:
+            return ScaleBytes(bytearray(int((value << 2) | 0b01).to_bytes(2, 'little')))
+
+        elif value <= 0b00111111111111111111111111111111:
+
+            return ScaleBytes(bytearray(int((value << 2) | 0b10).to_bytes(4, 'little')))
+
+        else:
+            for bytes_length in range(4, 68):
+                if 2 ** (8 * (bytes_length - 1)) <= value < 2 ** (8 * bytes_length):
+                    return ScaleBytes(bytearray(
+                        ((bytes_length - 4) << 2 | 0b11).to_bytes(1, 'little') + value.to_bytes(bytes_length,
+                                                                                                'little')))
+            else:
+                raise ValueError('{} out of range'.format(value))
+
+
+# Example of specialized composite implementation for performance improvement
+class CompactU32(Compact):
+
+    type_string = 'Compact<u32>'
+
+    def process(self):
+        self.process_compact_bytes()
+
+        if self.compact_length <= 4:
+            return int(int.from_bytes(self.compact_bytes, byteorder='little') / 4)
+        else:
+            return int.from_bytes(self.compact_bytes, byteorder='little')
+
+    def process_encode(self, value):
+
+        if value <= 0b00111111:
+            return ScaleBytes(bytearray(int(value << 2).to_bytes(1, 'little')))
+
+        elif value <= 0b0011111111111111:
+            return ScaleBytes(bytearray(int((value << 2) | 0b01).to_bytes(2, 'little')))
+
+        elif value <= 0b00111111111111111111111111111111:
+
+            return ScaleBytes(bytearray(int((value << 2) | 0b10).to_bytes(4, 'little')))
+
+        else:
+            for bytes_length in range(4, 68):
+                if 2 ** (8 * (bytes_length-1)) <= value < 2 ** (8 * bytes_length):
+                    return ScaleBytes(bytearray(((bytes_length - 4) << 2 | 0b11).to_bytes(1, 'little') + value.to_bytes(bytes_length, 'little')))
+            else:
+                raise ValueError('{} out of range'.format(value))
+
+
+class Option(ScaleType):
+    def process(self):
+
+        option_byte = self.get_next_bytes(1)
+
+        if self.sub_type and option_byte != b'\x00':
+            return self.process_type(self.sub_type).value
+
+        return None
+
+    def process_encode(self, value):
+
+        if value is not None and self.sub_type:
+            sub_type_obj = self.get_decoder_class(self.sub_type)
+            return ScaleBytes('0x01') + sub_type_obj.encode(value)
+
+        return ScaleBytes('0x00')
+
+
+class Bytes(ScaleType):
+
+    type_string = 'Vec<u8>'
+
+    def process(self):
+
+        length = self.process_type('Compact<u32>').value
+        value = self.get_next_bytes(length)
+
+        try:
+            return value.decode()
+        except UnicodeDecodeError:
+            return '0x{}'.format(value.hex())
+
+    def process_encode(self, value):
+        string_length_compact = CompactU32()
+
+        if value[0:2] == '0x':
+            # TODO implicit HexBytes conversion can have unexpected result if string is actually starting with '0x'
+            value = bytes.fromhex(value[2:])
+            data = string_length_compact.encode(len(value))
+            data += value
+        else:
+            data = string_length_compact.encode(len(value))
+            data += value.encode()
+
+        return data
+
+
+class OptionBytes(ScaleType):
+
+    type_string = 'Option<Vec<u8>>'
+
+    def process(self):
+
+        option_byte = self.get_next_bytes(1)
+
+        if option_byte != b'\x00':
+            return self.process_type('Bytes').value
+
+        return None
+
+
+# TODO replace in metadata
+class String(ScaleType):
+
+    def process(self):
+
+        length = self.process_type('Compact<u32>').value
+        value = self.get_next_bytes(length)
+
+        return value.decode()
+
+    def process_encode(self, value):
+        string_length_compact = CompactU32()
+        data = string_length_compact.encode(len(value))
+        data += value.encode()
+        return data
+
+
+class HexBytes(ScaleType):
+
+    def process(self):
+
+        length = self.process_type('Compact<u32>').value
+
+        return '0x{}'.format(self.get_next_bytes(length).hex())
+
+    def process_encode(self, value):
+
+        if value[0:2] != '0x':
+            raise ValueError('HexBytes value should start with "0x"')
+
+        value = bytes.fromhex(value[2:])
+
+        string_length_compact = CompactU32()
+        data = string_length_compact.encode(len(value))
+        data += value
+        return data
+
+
+class U8(ScaleType):
+
+    def process(self):
+        return self.get_next_u8()
+
+    def process_encode(self, value):
+        if 0 <= value <= 2**8 - 1:
+            return ScaleBytes(bytearray(int(value).to_bytes(1, 'little')))
+        else:
+            raise ValueError('{} out of range for u8'.format(value))
+
+
+class U16(ScaleType):
+
+    def process(self):
+        return int.from_bytes(self.get_next_bytes(2), byteorder='little')
+
+    def process_encode(self, value):
+        if 0 <= value <= 2**16 - 1:
+            return ScaleBytes(bytearray(int(value).to_bytes(2, 'little')))
+        else:
+            raise ValueError('{} out of range for u16'.format(value))
+
+
+class U32(ScaleType):
+
+    def process(self):
+        return int.from_bytes(self.get_next_bytes(4), byteorder='little')
+
+    def process_encode(self, value):
+        if 0 <= value <= 2**32 - 1:
+            return ScaleBytes(bytearray(int(value).to_bytes(4, 'little')))
+        else:
+            raise ValueError('{} out of range for u32'.format(value))
+
+
+class U64(ScaleType):
+
+    def process(self):
+        return int(int.from_bytes(self.get_next_bytes(8), byteorder='little'))
+
+    def process_encode(self, value):
+        if 0 <= value <= 2**64 - 1:
+            return ScaleBytes(bytearray(int(value).to_bytes(8, 'little')))
+        else:
+            raise ValueError('{} out of range for u64'.format(value))
+
+
+class U128(ScaleType):
+
+    def process(self):
+        return int(int.from_bytes(self.get_next_bytes(16), byteorder='little'))
+
+    def process_encode(self, value):
+        if 0 <= value <= 2**128 - 1:
+            return ScaleBytes(bytearray(int(value).to_bytes(16, 'little')))
+        else:
+            raise ValueError('{} out of range for u128'.format(value))
+
+
+class H160(ScaleType):
+
+    def process(self):
+        return '0x{}'.format(self.get_next_bytes(20).hex())
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 22:
+            raise ValueError('Value should start with "0x" and should be 20 bytes long')
+        return ScaleBytes(value)
+
+
+class H256(ScaleType):
+
+    def process(self):
+        return '0x{}'.format(self.get_next_bytes(32).hex())
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 66:
+            raise ValueError('Value should start with "0x" and should be 32 bytes long')
+        return ScaleBytes(value)
+
+
+class H512(ScaleType):
+
+    def process(self):
+        return '0x{}'.format(self.get_next_bytes(64).hex())
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 130:
+            raise ValueError('Value should start with "0x" and should be 64 bytes long')
+        return ScaleBytes(value)
+
+
+class VecU8Length64(ScaleType):
+    type_string = '[u8; 64]'
+
+    def process(self):
+        return '0x{}'.format(self.get_next_bytes(64).hex())
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 130:
+            raise ValueError('Value should start with "0x" and should be 64 bytes long')
+        return ScaleBytes(value)
+
+
+class VecU8Length32(ScaleType):
+    type_string = '[u8; 32]'
+
+    def process(self):
+        return '0x{}'.format(self.get_next_bytes(32).hex())
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 66:
+            raise ValueError('Value should start with "0x" and should be 32 bytes long')
+        return ScaleBytes(value)
+
+
+class VecU8Length16(ScaleType):
+    type_string = '[u8; 16]'
+
+    def process(self):
+        value = self.get_next_bytes(16)
+        try:
+            return value.decode()
+        except UnicodeDecodeError:
+            return value.hex()
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 34:
+            raise ValueError('Value should start with "0x" and should be 16 bytes long')
+        return ScaleBytes(value)
+
+
+class VecU8Length8(ScaleType):
+    type_string = '[u8; 8]'
+
+    def process(self):
+        value = self.get_next_bytes(8)
+        try:
+            return value.decode()
+        except UnicodeDecodeError:
+            return value.hex()
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 18:
+            raise ValueError('Value should start with "0x" and should be 8 bytes long')
+        return ScaleBytes(value)
+
+
+class VecU8Length4(ScaleType):
+    type_string = '[u8; 4]'
+
+    def process(self):
+        value = self.get_next_bytes(4)
+        try:
+            return value.decode()
+        except UnicodeDecodeError:
+            return value.hex()
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 10:
+            raise ValueError('Value should start with "0x" and should be 4 bytes long')
+        return ScaleBytes(value)
+
+
+class VecU8Length2(ScaleType):
+    type_string = '[u8; 2]'
+
+    def process(self):
+        value = self.get_next_bytes(2)
+        try:
+            return value.decode()
+        except UnicodeDecodeError:
+            return value.hex()
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 6:
+            raise ValueError('Value should start with "0x" and should be 2 bytes long')
+        return ScaleBytes(value)
+
+
+class Struct(ScaleType):
+
+    def __init__(self, data, type_mapping=None, **kwargs):
+
+        if type_mapping:
+            self.type_mapping = type_mapping
+
+        super().__init__(data, **kwargs)
+
+    def process(self):
+
+        result = {}
+        for key, data_type in self.type_mapping:
+            result[key] = self.process_type(data_type, metadata=self.metadata).value
+
+        return result
+
+    def process_encode(self, value):
+        data = ScaleBytes(bytearray())
+
+        if type(value) is list:
+            if len(value) != len(self.type_mapping):
+                raise ValueError('Element count of value ({}) doesn\'t match type_mapping ({})'.format(len(value), len(self.type_mapping)))
+
+            for idx, (key, data_type) in enumerate(self.type_mapping):
+
+                element_obj = self.get_decoder_class(data_type, metadata=self.metadata)
+                data += element_obj.encode(value[idx])
+
+        else:
+            for key, data_type in self.type_mapping:
+                if key not in value:
+                    raise ValueError('Element "{}" of struct is missing in given value'.format(key))
+
+                element_obj = self.get_decoder_class(data_type, metadata=self.metadata)
+                data += element_obj.encode(value[key])
+
+        return data
+
+
+class Set(ScaleType):
+    value_list = []
+
+    def __init__(self, data, value_list=None, **kwargs):
+        self.set_value = None
+        if value_list:
+            self.value_list = value_list
+
+        super().__init__(data, **kwargs)
+
+    def process(self):
+        self.set_value = self.process_type('u64').value
+        result = []
+        if self.set_value > 0:
+
+            for value, set_mask in self.value_list.items():
+                if self.set_value & set_mask > 0:
+                    result.append(value)
+        return result
+
+    def process_encode(self, value):
+        result = 0
+        if type(value) is not list:
+            raise ValueError('Value for encoding a set must be a list')
+
+        for item, set_mask in self.value_list.items():
+            if item in value:
+                result += set_mask
+
+        u64_obj = self.get_decoder_class('u64')
+
+        return u64_obj.encode(result)
+
+
+
+class Era(ScaleType):
+
+    def process(self):
+
+        option_byte = self.get_next_bytes(1).hex()
+        if option_byte == '00':
+            return option_byte
+        else:
+            return option_byte + self.get_next_bytes(1).hex()
+
+
+class EraIndex(U32):
+    pass
+
+
+class Bool(ScaleType):
+
+    def process(self):
+        return self.get_next_bool()
+
+    def process_encode(self, value):
+        if value is True:
+            return ScaleBytes('0x01')
+        elif value is False:
+            return ScaleBytes('0x00')
+        else:
+            raise ValueError("Value must be boolean")
+
+
+class Moment(U64):
+    pass
+
+
+class CompactMoment(CompactU32):
+    type_string = 'Compact<Moment>'
+
+    def process(self):
+        int_value = super().process()
+
+        if int_value > 10000000000:
+            int_value = int_value / 1000
+
+        return datetime.utcfromtimestamp(int_value)
+
+    def serialize(self):
+        return self.value.isoformat()
+
+
+class BoxProposal(ScaleType):
+    type_string = 'Box<Proposal>'
+
+    def __init__(self, data, **kwargs):
+        self.call_index = None
+        self.call_function = None
+        self.call_module = None
+        self.call_args = []
+        super().__init__(data, **kwargs)
+
+    def process(self):
+
+        self.call_index = self.get_next_bytes(2).hex()
+
+        self.call_module, self.call_function = self.metadata.call_index[self.call_index]
+
+        for arg in self.call_function.args:
+            arg_type_obj = self.process_type(arg.type, metadata=self.metadata)
+
+            self.call_args.append({
+                'name': arg.name,
+                'type': arg.type,
+                'value': arg_type_obj.serialize(),
+                'valueRaw': arg_type_obj.raw_value
+            })
+
+        return {
+            'call_index': self.call_index,
+            'call_function': self.call_function.name,
+            'call_module': self.call_module.name,
+            'call_args': self.call_args
+        }
+
+    def process_encode(self, value):
+        # Check requirements
+        if 'call_index' in value:
+            self.call_index = value['call_index']
+
+        elif 'call_module' in value and 'call_function' in value:
+            # Look up call module from metadata
+            for call_index, (call_module, call_function) in self.metadata.call_index.items():
+
+                if call_module.name == value['call_module'] and call_function.name == value['call_function']:
+                    self.call_index = call_index
+                    self.call_module = call_module
+                    self.call_function = call_function
+                    break
+
+            if not self.call_index:
+                raise ValueError('Specified call module and function not found in metadata')
+
+        elif not self.call_module or not self.call_function:
+            raise ValueError('No call module and function specified')
+
+        data = ScaleBytes(bytearray.fromhex(self.call_index))
+
+        # Encode call params
+        if len(self.call_function.args) > 0:
+            for arg in self.call_function.args:
+                if arg.name not in value['call_args']:
+                    raise ValueError('Parameter \'{}\' not specified'.format(arg.name))
+                else:
+                    param_value = value['call_args'][arg.name]
+
+                    arg_obj = self.get_decoder_class(arg.type, metadata=self.metadata)
+                    data += arg_obj.encode(param_value)
+
+        return data
+
+
+class ProposalPreimage(Struct):
+    type_string = '(Vec<u8>, AccountId, BalanceOf, BlockNumber)'
+
+    type_mapping = (
+        ("proposal", "HexBytes"),
+        ("registredBy", "AccountId"),
+        ("deposit", "BalanceOf"),
+        ("blockNumber", "BlockNumber")
+    )
+    def process(self):
+
+        result = {}
+        for key, data_type in self.type_mapping:
+            result[key] = self.process_type(data_type, metadata=self.metadata).value
+
+        # Replace HexBytes with actual proposal
+        result['proposal'] = Proposal(ScaleBytes(result['proposal']), metadata=self.metadata).decode()
+
+        return result
+
+
+class Proposal(BoxProposal):
+    type_string = '<T as Trait<I>>::Proposal'
+
+
+class ValidatorPrefs(Struct):
+    type_string = '(Compact<Balance>)'
+
+    type_mapping = (('commission', 'Compact<Balance>'),)
+
+
+class ValidatorPrefsLegacy(Struct):
+    type_string = '(Compact<u32>,Compact<Balance>)'
+
+    type_mapping = (('unstakeThreshold', 'Compact<u32>'), ('validatorPayment', 'Compact<Balance>'))
+
+
+class Linkage(Struct):
+    type_string = 'Linkage<AccountId>'
+
+    type_mapping = (
+        ('previous', 'Option<AccountId>'),
+        ('next', 'Option<AccountId>')
+    )
+
+
+class AccountId(H256):
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 47:
+            from scalecodec.utils.ss58 import ss58_decode
+            value = '0x{}'.format(ss58_decode(value))
+        return super().process_encode(value)
+
+
+class AccountIndex(U32):
+    pass
+
+
+class ReferendumIndex(U32):
+    pass
+
+
+class PropIndex(U32):
+    pass
+
+
+class Vote(U8):
+    pass
+
+
+class SessionKey(H256):
+    pass
+
+
+class SessionIndex(U32):
+    pass
+
+
+class Balance(U128):
+    pass
+
+
+class ParaId(U32):
+    pass
+
+
+class Key(Bytes):
+    pass
+
+
+class KeyValue(Struct):
+    type_string = '(Vec<u8>, Vec<u8>)'
+    type_mapping = (('key', 'Vec<u8>'), ('value', 'Vec<u8>'))
+
+
+class BalanceOf(Balance):
+    pass
+
+
+class BlockNumber(U64):
+    pass
+
+
+class NewAccountOutcome(CompactU32):
+    type_string = 'NewAccountOutcome'
+
+
+class Index(U64):
+    pass
+
+
+class Vec(ScaleType):
+
+    def __init__(self, data=None, **kwargs):
+        self.elements = []
+        super().__init__(data, **kwargs)
+
+    def process(self):
+        element_count = self.process_type('Compact<u32>').value
+
+        result = []
+        for _ in range(0, element_count):
+            element = self.process_type(self.sub_type)
+            self.elements.append(element)
+            result.append(element.value)
+
+        return result
+
+    def process_encode(self, value):
+
+        if type(value) is not list:
+            raise ValueError("Provided value is not a list")
+
+        # encode element count to Compact<u32>
+        element_count_compact = CompactU32()
+
+        element_count_compact.encode(len(value))
+
+        data = element_count_compact.data
+
+        for element in value:
+
+            element_obj = self.get_decoder_class(self.sub_type, metadata=self.metadata)
+            data += element_obj.encode(element)
+
+        return data
+
+
+class VecNextAuthority(Vec):
+    type_string = 'Vec<NextAuthority>'
+
+    def process(self):
+        element_count = self.process_type('Compact<u32>').value
+
+        result = []
+        for _ in range(0, element_count):
+            element = self.process_type('NextAuthority')
+            self.elements.append(element)
+            result.append(element.value)
+
+        return result
+
+# class BalanceTransferExtrinsic(Decoder):
+#
+#     type_string = '(Address,Compact<Balance>)'
+#
+#     type_mapping = {'to': 'Address', 'balance': 'Compact<Balance>'}
+
+
+class Address(ScaleType):
+
+    def __init__(self, data, **kwargs):
+        self.account_length = None
+        self.account_id = None
+        self.account_index = None
+        self.account_idx = None
+        super().__init__(data, **kwargs)
+
+    def process(self):
+        self.account_length = self.get_next_bytes(1)
+
+        if self.account_length == b'\xff':
+            self.account_id = self.get_next_bytes(32).hex()
+            self.account_length = self.account_length.hex()
+
+            return self.account_id
+        else:
+            if self.account_length == b'\xfc':
+                account_index = self.get_next_bytes(2)
+            elif self.account_length == b'\xfd':
+                account_index = self.get_next_bytes(4)
+            elif self.account_length == b'\xfe':
+                account_index = self.get_next_bytes(8)
+            else:
+                account_index = self.account_length
+
+            self.account_index = account_index.hex()
+            self.account_idx = int.from_bytes(account_index, byteorder='little')
+
+            self.account_length = self.account_length.hex()
+
+            return self.account_index
+
+    def process_encode(self, value):
+
+        if type(value) == str and value[0:2] != '0x':
+            # Assume SS58 encoding address
+            if len(value) == 47:
+                from scalecodec.utils.ss58 import ss58_decode
+                value = '0x{}'.format(ss58_decode(value))
+            else:
+                from scalecodec.utils.ss58 import ss58_decode_account_index
+                index_obj = AccountIndex()
+                value = index_obj.encode(ss58_decode_account_index(value))
+
+        if type(value) == str and value[0:2] == '0x' and len(value) == 66:
+            # value is AccountId
+            return ScaleBytes('0xff{}'.format(value[2:]))
+        elif type(value) == int:
+            # value is AccountIndex
+            raise NotImplementedError('Encoding of AccountIndex Adresses not supported yet')
+        else:
+            raise ValueError('Value is in unsupported format, expected 32 bytes hex-string for AccountIds or int for AccountIndex')
+
+    def serialize(self):
+        if self.account_id:
+            return '0x{}'.format(self.value)
+        else:
+            return self.value
+
+
+class RawAddress(Address):
+    pass
+
+
+class Enum(ScaleType):
+
+    value_list = []
+    type_mapping = None
+
+    def __init__(self, data, value_list=None, type_mapping=None, **kwargs):
+
+        self.index = None
+
+        if type_mapping:
+            self.type_mapping = type_mapping
+
+        if value_list:
+            self.value_list = value_list
+
+        super().__init__(data, **kwargs)
+
+    def process(self):
+        self.index = int(self.get_next_bytes(1).hex(), 16)
+
+        if self.type_mapping:
+            try:
+                enum_type_mapping = self.type_mapping[self.index]
+                return self.process_type('Struct', type_mapping=[enum_type_mapping]).value
+
+            except IndexError:
+                raise ValueError("Index '{}' not present in Enum type mapping".format(self.index))
+        else:
+            try:
+                return self.value_list[self.index]
+            except IndexError:
+                raise ValueError("Index '{}' not present in Enum value list".format(self.index))
+
+    def process_encode(self, value):
+        if self.type_mapping:
+
+            if type(value) != dict:
+                raise ValueError("Value must be a dict when type_mapping is set, not '{}'".format(value))
+
+            if len(value) != 1:
+                raise ValueError("Value for enum with type_mapping can only have one value")
+
+            for enum_key, enum_value in value.items():
+                for idx, (item_key, item_value) in enumerate(self.type_mapping):
+                    if item_key == enum_key:
+                        self.index = idx
+                        struct_obj = self.get_decoder_class('Struct', type_mapping=[self.type_mapping[self.index]])
+                        return ScaleBytes(bytearray([self.index])) + struct_obj.encode(value)
+
+                raise ValueError("Value '{}' not present in type_mapping of this enum".format(enum_key))
+
+        else:
+            for idx, item in enumerate(self.value_list):
+                if item == value:
+                    self.index = idx
+                    return ScaleBytes(bytearray([self.index]))
+
+            raise ValueError("Value '{}' not present in value list of this enum".format(value))
+
+
+class Data(Enum):
+    type_mapping = [
+        ["None", "Null"],
+        ["Raw", "Bytes"],
+        ["BlakeTwo256", "H256"],
+        ["Sha256", "H256"],
+        ["Keccak256", "H256"],
+        ["ShaThree256", "H256"]
+      ]
+
+    def process(self):
+
+        self.index = int(self.get_next_bytes(1).hex(), 16)
+
+        if self.index == 0:
+            return {'None': None}
+
+        elif self.index >= 1 and self.index <= 33:
+            # Determine value of Raw type (length is processed in index byte)
+            data = self.get_next_bytes(self.index - 1)
+
+            try:
+                value = data.decode()
+            except UnicodeDecodeError:
+                value = '0x{}'.format(data.hex())
+            return {"Raw": value}
+
+        elif self.index >= 34 and self.index <= 37:
+
+            enum_value = self.type_mapping[self.index - 32][0]
+
+            return {enum_value: self.process_type(self.type_mapping[self.index - 32][1]).value}
+
+        raise ValueError("Unable to decode Data, invalid indicator byte '{}'".format(self.index))
+
+    def process_encode(self, value):
+
+        if type(value) != dict:
+            raise ValueError("Value must be a dict when type_mapping is set, not '{}'".format(value))
+
+        if len(value) != 1:
+            raise ValueError("Value for enum with type_mapping can only have one value")
+
+        for enum_key, enum_value in value.items():
+
+            for idx, (item_key, item_value) in enumerate(self.type_mapping):
+                if item_key == enum_key:
+                    self.index = idx
+
+                    if item_value == 'Null':
+                        return ScaleBytes(bytearray([0]))
+
+                    elif item_value == 'Bytes':
+
+                        if enum_value[0:2] == '0x':
+
+                            if len(enum_value) > 66:
+                                raise ValueError("Raw type in Data cannot exceed 32 bytes")
+
+                            enum_value = bytes.fromhex(enum_value[2:])
+                            data = bytes([len(enum_value) + 1]) + enum_value
+                            return ScaleBytes(bytearray(data))
+                        else:
+
+                            if len(enum_value) > 32:
+                                raise ValueError("Raw type in Data cannot exceed 32 bytes")
+
+                            data = bytes([len(enum_value) + 1]) + enum_value.encode()
+                            return ScaleBytes(bytearray(data))
+                    else:
+
+                        struct_obj = self.get_decoder_class('Struct', type_mapping=[self.type_mapping[self.index]])
+                        return ScaleBytes(bytearray([self.index])) + struct_obj.encode(value)
+
+            raise ValueError("Value '{}' not present in type_mapping of this enum".format(enum_key))
+
+
+class RewardDestination(Enum):
+
+    value_list = ['Staked', 'Stash', 'Controller']
+
+
+class StakingLedger(Struct):
+    type_string = 'StakingLedger<AccountId, BalanceOf, BlockNumber>'
+    type_mapping = (
+        ('stash', 'AccountId'),
+        ('total', 'Compact<Balance>'),
+        ('active', 'Compact<Balance>'),
+        ('unlocking', 'Vec<UnlockChunk<Balance>>'),
+    )
+
+
+class UnlockChunk(Struct):
+    type_string = 'UnlockChunk<Balance>'
+    type_mapping = (
+        ('value', 'Compact<Balance>'),
+        ('era', 'Compact<EraIndex>'),
+    )
+
+
+class Exposure(Struct):
+    type_string = 'Exposure<AccountId, BalanceOf>'
+    type_mapping = (
+        ('total', 'Compact<Balance>'),
+        ('own', 'Compact<Balance>'),
+        ('others', 'Vec<IndividualExposure>'),
+    )
+
+
+class IndividualExposure(Struct):
+    type_string = 'IndividualExposure<AccountId, Balance>'
+    type_mapping = (
+        ('who', 'AccountId'),
+        ('value', 'Compact<Balance>'),
+    )
+
+
+class BabeAuthorityWeight(U64):
+    pass
+
+
+class KeyTypeId(VecU8Length4):
+    pass
+
+
+class Points(U32):
+    pass
+
+
+class EraPoints(Struct):
+    type_mapping = (
+        ('total', 'Points'),
+        ('individual', 'Vec<Points>'),
+    )
+
+
+class VoteThreshold(Enum):
+
+    value_list = ['SuperMajorityApprove', 'SuperMajorityAgainst', 'SimpleMajority']
+
+
+class Null(ScaleType):
+
+    def process(self):
+        return None
+
+    def process_encode(self, value):
+        return ScaleBytes(bytearray())
+
+
+class InherentOfflineReport(Null):
+    pass
+
+
+class LockPeriods(U8):
+    pass
+
+
+class Hash(H256):
+    pass
+
+
+class VoteIndex(U32):
+    pass
+
+
+class ProposalIndex(U32):
+    pass
+
+
+class Permill(U32):
+    pass
+
+
+class Perbill(U32):
+    pass
+
+
+class ApprovalFlag(U32):
+    pass
+
+
+class SetIndex(U32):
+    pass
+
+
+class AuthorityId(AccountId):
+    pass
+
+
+class ValidatorId(AccountId):
+    pass
+
+
+class AuthorityWeight(U64):
+    pass
+
+
+class StoredPendingChange(Struct):
+    type_mapping = (
+        ('scheduled_at', 'u32'),
+        ('forced', 'u32'),
+    )
+
+
+class ReportIdOf(Hash):
+    pass
+
+
+class StorageHasher(Enum):
+
+    value_list = ['Blake2_128', 'Blake2_256', 'Blake2_128Concat', 'Twox128', 'Twox256', 'Twox64Concat']
+
+    def is_blake2_128(self):
+        return self.index == 0
+
+    def is_blake2_256(self):
+        return self.index == 1
+
+    def is_twoblake2_128_concat(self):
+        return self.index == 2
+
+    def is_twox128(self):
+        return self.index == 3
+
+    def is_twox256(self):
+        return self.index == 4
+
+    def is_twox64_concat(self):
+        return self.index == 5
+
+
+class VoterInfo(Struct):
+    type_string = 'VoterInfo<Balance>'
+
+    type_mapping = (
+        ('last_active', 'VoteIndex'),
+        ('last_win', 'VoteIndex'),
+        ('pot', 'Balance'),
+        ('stake', 'Balance'),
+    )
+
+
+class Gas(U64):
+    pass
+
+
+class CodeHash(Hash):
+    pass
+
+
+class PrefabWasmModule(Struct):
+    type_string = 'wasm::PrefabWasmModule'
+
+    type_mapping = (
+        ('scheduleVersion', 'Compact<u32>'),
+        ('initial', 'Compact<u32>'),
+        ('maximum', 'Compact<u32>'),
+        ('_reserved', 'Option<Null>'),
+        ('code', 'Bytes'),
+    )
+
+
+class OpaqueNetworkState(Struct):
+
+    type_mapping = (
+        ('peerId', 'OpaquePeerId'),
+        ('externalAddresses', 'Vec<OpaqueMultiaddr>'),
+    )
+
+
+class OpaquePeerId(Bytes):
+    pass
+
+
+class OpaqueMultiaddr(Bytes):
+    pass
+
+
+class SessionKeysSubstrate(Struct):
+
+    type_mapping = (
+        ('grandpa', 'AccountId'),
+        ('babe', 'AccountId'),
+        ('im_online', 'AccountId'),
+    )
+
+class LegacyKeys(Struct):
+
+    type_mapping = (
+        ('grandpa', 'AccountId'),
+        ('babe', 'AccountId'),
+    )
+
+
+class EdgewareKeys(Struct):
+    type_mapping = (
+        ('grandpa', 'AccountId'),
+    )
+
+
+class QueuedKeys(Struct):
+
+    type_string = '(ValidatorId, Keys)'
+
+    type_mapping = (
+        ('validator', 'ValidatorId'),
+        ('keys', 'Keys'),
+    )
+
+
+class LegacyQueuedKeys(Struct):
+
+    type_string = '(ValidatorId, LegacyKeys)'
+
+    type_mapping = (
+        ('validator', 'ValidatorId'),
+        ('keys', 'LegacyKeys'),
+    )
+
+
+class EdgewareQueuedKeys(Struct):
+
+    type_string = '(ValidatorId, EdgewareKeys)'
+
+    type_mapping = (
+        ('validator', 'ValidatorId'),
+        ('keys', 'EdgewareKeys'),
+    )
+
+
+class VecQueuedKeys(Vec):
+    type_string = 'Vec<(ValidatorId, Keys)>'
+
+    def process(self):
+        element_count = self.process_type('Compact<u32>').value
+        result = []
+        for _ in range(0, element_count):
+            element = self.process_type('QueuedKeys')
+            self.elements.append(element)
+            result.append(element.value)
+
+        return result
+
+
+class EthereumAddress(ScaleType):
+
+    def process(self):
+        value = self.get_next_bytes(20)
+        return value.hex()
+
+    def process_encode(self, value):
+        if value[0:2] == '0x' and len(value) == 42:
+            return ScaleBytes(value)
+        else:
+            raise ValueError('Value should start with "0x" and must be 20 bytes long')
+
+
+class EcdsaSignature(ScaleType):
+
+    def process(self):
+        value = self.get_next_bytes(65)
+        return value.hex()
+
+    def process_encode(self, value):
+        if value[0:2] == '0x' and len(value) == 132:
+            return ScaleBytes(value)
+        else:
+            raise ValueError('Value should start with "0x" and must be 65 bytes long')
+
+
+class BalanceLock(Struct):
+    type_string = 'BalanceLock<Balance, BlockNumber>'
+
+    type_mapping = (
+        ('id', 'LockIdentifier'),
+        ('amount', 'Balance'),
+        ('until', 'U32'),
+        ('reasons', 'WithdrawReasons'),
+    )
+
+
+class WithdrawReasons(Enum):
+
+    value_list = ['TransactionPayment', 'Transfer', 'Reserve', 'Fee']
+
+
+class Bidder(Enum):
+    type_string = 'Bidder<AccountId, ParaIdOf>'
+
+    value_list = ['NewBidder', 'ParaId']
+
+
+class BlockAttestations(Struct):
+
+    type_mapping = (
+        ('receipt', 'CandidateReceipt'),
+        ('valid', 'Vec<AccountId>'),
+        ('invalid', 'Vec<AccountId>'),
+    )
+
+
+class IncludedBlocks(Struct):
+
+    type_mapping = (
+        ('actualNumber', 'BlockNumber'),
+        ('session', 'SessionIndex'),
+        ('randomSeed', 'H256'),
+        ('activeParachains', 'Vec<ParaId>'),
+        ('paraBlocks', 'Vec<Hash>'),
+    )
+
+class HeadData(Bytes):
+    pass
+
+
+class Conviction(Enum):
+    CONVICTION_MASK = 0b01111111
+    DEFAULT_CONVICTION = 0b00000000
+
+    value_list = ['None', 'Locked1x', 'Locked2x', 'Locked3x', 'Locked4x', 'Locked5x', 'Locked6x']
+
+
+class EraRewards(Struct):
+
+    type_mapping = (
+        ('total', 'u32'),
+        ('rewards', 'Vec<u32>'),
+    )
+
+
+class SlashJournalEntry(Struct):
+    type_mapping = (
+        ('who', 'AccountId'),
+        ('amount', 'Balance'),
+        ('ownSlash', 'Balance'),
+    )
+
+
+class UpwardMessage(Struct):
+    type_mapping = (
+        ('origin', 'ParachainDispatchOrigin'),
+        ('data', 'Bytes'),
+    )
+
+
+class ParachainDispatchOrigin(Enum):
+    value_list = ['Signed', 'Parachain']
+
+
+class StoredState(Enum):
+    value_list = ['Live', 'PendingPause', 'Paused', 'PendingResume']
+
+
+class Votes(Struct):
+    type_mapping = (
+        ('index', 'ProposalIndex'),
+        ('threshold', 'MemberCount'),
+        ('ayes', 'Vec<AccountId>'),
+        ('nays', 'Vec<AccountId>'),
+    )
+
+
+class WinningDataEntry(Struct):
+    type_mapping = (
+        ('AccountId', 'AccountId'),
+        ('ParaIdOf', 'ParaIdOf'),
+        ('BalanceOf', 'BalanceOf'),
+    )
+
+# Edgeware types
+# TODO move to RuntimeConfiguration per network
+
+
+class IdentityType(Bytes):
+    pass
+
+
+class VoteType(Enum):
+
+    type_string = 'voting::VoteType'
+
+    value_list = ['Binary', 'MultiOption']
+
+
+class VoteOutcome(ScaleType):
+
+    def process(self):
+        return list(self.get_next_bytes(32))
+
+
+class Identity(Bytes):
+    pass
+
+
+class ProposalTitle(Bytes):
+    pass
+
+
+class ProposalContents(Bytes):
+    pass
+
+
+class ProposalStage(Enum):
+    value_list = ['PreVoting', 'Voting', 'Completed']
+
+
+class ProposalCategory(Enum):
+    value_list = ['Signaling']
+
+
+class VoteStage(Enum):
+    value_list = ['PreVoting', 'Commit', 'Voting', 'Completed']
+
+
+class TallyType(Enum):
+
+    type_string = 'voting::TallyType'
+
+    value_list = ['OnePerson', 'OneCoin']
+
+
+class Attestation(Bytes):
+    pass
+
+
+# Joystream types
+# TODO move to RuntimeConfiguration per network
+
+class ContentId(H256):
+    pass
+
+
+class MemberId(U64):
+    pass
+
+
+class PaidTermId(U64):
+    pass
+
+
+class SubscriptionId(U64):
+    pass
+
+
+class SchemaId(U64):
+    pass
+
+
+class DownloadSessionId(U64):
+    pass
+
+
+class UserInfo(Struct):
+
+    type_mapping = (
+        ('handle', 'Option<Vec<u8>>'),
+        ('avatar_uri', 'Option<Vec<u8>>'),
+        ('about', 'Option<Vec<u8>>')
+    )
+
+
+class Role(Enum):
+
+    value_list = ['Storage']
+
+
+class ContentVisibility(Enum):
+    value_list = ['Draft', 'Public']
+
+
+class ContentMetadata(Struct):
+    type_mapping = (
+        ('owner', 'AccountId'),
+        ('added_at', 'BlockAndTime'),
+        ('children_ids', 'Vec<ContentId>'),
+        ('visibility', 'ContentVisibility'),
+        ('schema', 'SchemaId'),
+        ('json', 'Vec<u8>'),
+
+    )
+
+
+class ContentMetadataUpdate(Struct):
+    type_mapping = (
+        ('children_ids', 'Option<Vec<ContentId>>'),
+        ('visibility', 'Option<ContentVisibility>'),
+        ('schema', 'Option<SchemaId>'),
+        ('json', 'Option<Vec<u8>>')
+    )
+
+
+class LiaisonJudgement(Enum):
+    value_list = ['Pending', 'Accepted', 'Rejected']
+
+
+class BlockAndTime(Struct):
+    type_mapping = (
+        ('block', 'BlockNumber'),
+        ('time', 'Moment')
+    )
+
+
+class DataObjectTypeId(U64):
+    type_string = "<T as DOTRTrait>::DataObjectTypeId"
+
+
+class DataObject(Struct):
+    type_mapping = (
+        ('owner', 'AccountId'),
+        ('added_at', 'BlockAndTime'),
+        ('type_id', 'DataObjectTypeId'),
+        ('size', 'u64'),
+        ('liaison', 'AccountId'),
+        ('liaison_judgement', 'LiaisonJudgement'),
+        ('ipfs_content_id', 'Bytes'),
+    )
+
+
+class DataObjectStorageRelationshipId(U64):
+    pass
+
+
+class IPNSIdentity(Bytes):
+    pass
+
+
+class AccountInfo(Struct):
+    type_string = 'AccountInfo<BlockNumber>'
+
+    type_mapping = (
+        ('identity', 'IPNSIdentity'),
+        ('expires_at', 'BlockNumber'),
+    )
+
+
+class DownloadState(Enum):
+    value_list = ['Started', 'Ended']
+
+
+class DownloadSession(Struct):
+
+    type_mapping = (
+        ('content_id', 'ContentId'),
+        ('consumer', 'AccountId'),
+        ('distributor', 'AccountId'),
+        ('initiated_at_block', 'BlockNumber'),
+        ('initiated_at_time', 'BlockNumber'),
+        ('state', 'DownloadState'),
+        ('transmitted_bytes', 'u64'),
+    )
+
+
+class Url(Bytes):
+    pass
+
+
+class EntryMethod(Enum):
+    value_list = ['Paid', 'Screening']
+
+
+class Profile(Struct):
+    type_mapping = (
+        ('id', 'MemberId'),
+        ('handle', 'Bytes'),
+        ('avatar_uri', 'Bytes'),
+        ('about', 'Bytes'),
+        ('registered_at_block', 'BlockNumber'),
+        ('registered_at_time', 'Moment'),
+        ('entry', 'EntryMethod'),
+        ('suspended', 'bool'),
+        ('subscription', 'Option<SubscriptionId>'),
+    )
+
+
+class PaidMembershipTerms(Struct):
+    type_mapping = (
+        ('id', 'PaidTermId'),
+        ('fee', 'BalanceOf'),
+        ('text', 'Bytes'),
+    )
+
+
+class ThreadId(U64):
+    pass
+
+
+class InputValidationLengthConstraint(Struct):
+    type_mapping = (
+        ('min', 'u16'),
+        ('max_min_diff', 'u16'),
+    )
+
+
+class BlockchainTimestamp(Struct):
+    type_string = 'BlockchainTimestamp<BlockNumber, Moment>'
+
+    type_mapping = (
+        ('block', 'BlockNumber'),
+        ('time', 'Moment'),
+    )
+
+
+class ModerationAction(Struct):
+    type_mapping = (
+        ('moderated_at', 'BlockchainTimestamp<BlockNumber, Moment>'),
+        ('moderator_id', 'AccountId'),
+        ('rationale', 'Vec<u8>'),
+    )
+
+
+class PostId(U64):
+    pass
+
+
+class PostTextChange(Struct):
+    type_string = 'PostTextChange<BlockNumber, Moment>'
+
+    type_mapping = (
+        ('expired_at', 'BlockchainTimestamp<BlockNumber, Moment>'),
+        ('text', 'Vec<u8>'),
+    )
+
+
+class Post(Struct):
+    type_string = 'Post<BlockNumber, Moment, AccountId>'
+
+    type_mapping = (
+        ('id', 'PostId'),
+        ('thread_id', 'ThreadId'),
+        ('nr_in_thread', 'u32'),
+        ('current_text', 'Vec<u8>'),
+        ('moderation', 'Option<ModerationAction<BlockNumber, Moment, AccountId>>'),
+        ('text_change_history', 'Vec<PostTextChange<BlockNumber, Moment>>'),
+        ('created_at', 'BlockchainTimestamp<BlockNumber, Moment>'),
+        ('author_id', 'AccountId'),
+
+    )
+
+
+class Thread(Struct):
+    type_string = 'Thread<BlockNumber, Moment, AccountId>'
+
+    type_mapping = (
+        ('id', 'ThreadId'),
+        ('title', 'Vec<u8>'),
+        ('category_id', 'CategoryId'),
+        ('nr_in_category', 'u32'),
+        ('moderation', 'Option<ModerationAction<BlockNumber, Moment, AccountId>>'),
+        ('num_unmoderated_posts', 'u32'),
+        ('num_moderated_posts', 'u32'),
+        ('author_id', 'AccountId'),
+        ('created_at', 'BlockchainTimestamp<BlockNumber, Moment>'),
+        ('author_id', 'AccountId'),
+    )
+
+
+class CategoryId(U64):
+    pass
+
+
+class ChildPositionInParentCategory(Struct):
+
+    type_mapping = (
+        ('parent_id', 'CategoryId'),
+        ('child_nr_in_parent_category', 'u32'),
+    )
+
+
+class Category(Struct):
+    type_string = 'Category<BlockNumber, Moment, AccountId>'
+
+    type_mapping = (
+        ('id', 'CategoryId'),
+        ('title', 'Vec<u8>'),
+        ('description', 'Vec<u8>'),
+        ('created_at', 'BlockchainTimestamp<BlockNumber, Moment>'),
+        ('deleted', 'bool'),
+        ('archived', 'bool'),
+        ('num_direct_subcategories', 'u32'),
+        ('num_direct_unmoderated_threads', 'u32'),
+        ('num_direct_moderated_threads', 'u32'),
+        ('position_in_parent_category', 'Option<ChildPositionInParentCategory>'),
+        ('moderator_id', 'AccountId'),
+    )
+
+
+class ProposalStatus(Enum):
+    value_list = ['Active', 'Cancelled', 'Expired', 'Approved', 'Rejected', 'Slashed']
+
+
+class VoteKind(Enum):
+    value_list = ['Abstain', 'Approve', 'Reject', 'Slash']
+
+
+class RuntimeUpgradeProposal(Struct):
+    type_string = 'RuntimeUpgradeProposal<AccountId, Balance, BlockNumber, Hash>'
+
+    type_mapping = (
+        ('id', 'u32'),
+        ('proposer', 'AccountId'),
+        ('stake', 'Balance'),
+        ('name', 'Vec<u8>'),
+        ('description', 'Vec<u8>'),
+        ('wasm_hash', 'Hash'),
+        ('proposed_at', 'BlockNumber'),
+        ('status', 'ProposalStatus'),
+    )
+
+
+class TallyResult(Struct):
+    type_string = 'TallyResult<BlockNumber>'
+
+    type_mapping = (
+        ('proposal_id', 'u32'),
+        ('abstentions', 'u32'),
+        ('approvals', 'u32'),
+        ('rejections', 'u32'),
+        ('slashes', 'u32'),
+        ('status', 'ProposalStatus'),
+        ('finalized_at', 'BlockNumber'),
+    )
+
+
+class Call(ScaleType):
+
+    type_string = "Box<Call>"
+
+    def __init__(self, data, **kwargs):
+        self.call_index = None
+        self.call_function = None
+        self.call_args = []
+        self.call_module = None
+
+        super().__init__(data, **kwargs)
+
+    def process(self):
+
+        self.call_index = self.get_next_bytes(2).hex()
+
+        self.call_module, self.call_function = self.metadata.call_index[self.call_index]
+
+        for arg in self.call_function.args:
+            arg_type_obj = self.process_type(arg.type, metadata=self.metadata)
+
+            self.call_args.append({
+                'name': arg.name,
+                'type': arg.type,
+                'value': arg_type_obj.serialize(),
+                'valueRaw': arg_type_obj.raw_value
+            })
+
+        return {
+            'call_index': self.call_index,
+            'call_function': self.call_function.name,
+            'call_module': self.call_module.name,
+            'call_args': self.call_args
+        }
+
+    def process_encode(self, value):
+        # Check requirements
+        if 'call_index' in value:
+            self.call_index = value['call_index']
+
+        elif 'call_module' in value and 'call_function' in value:
+            # Look up call module from metadata
+            for call_index, (call_module, call_function) in self.metadata.call_index.items():
+
+                if call_module.name == value['call_module'] and call_function.name == value['call_function']:
+                    self.call_index = call_index
+                    self.call_module = call_module
+                    self.call_function = call_function
+                    break
+
+            if not self.call_index:
+                raise ValueError('Specified call module and function not found in metadata')
+
+        elif not self.call_module or not self.call_function:
+            raise ValueError('No call module and function specified')
+
+        data = ScaleBytes(bytearray.fromhex(self.call_index))
+
+        # Encode call params
+        if len(self.call_function.args) > 0:
+            for arg in self.call_function.args:
+                if arg.name not in value['call_args']:
+                    raise ValueError('Parameter \'{}\' not specified'.format(arg.name))
+                else:
+                    param_value = value['call_args'][arg.name]
+
+                    arg_obj = self.get_decoder_class(arg.type, metadata=self.metadata)
+                    data += arg_obj.encode(param_value)
+
+        return data
+
+
+
+
+
+
+
+
+
+

Classes

+
+
+class AccountId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class AccountId(H256):
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 47:
+            from scalecodec.utils.ss58 import ss58_decode
+            value = '0x{}'.format(ss58_decode(value))
+        return super().process_encode(value)
+
+

Ancestors

+ +

Subclasses

+ +

Methods

+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if value[0:2] != '0x' and len(value) == 47:
+        from scalecodec.utils.ss58 import ss58_decode
+        value = '0x{}'.format(ss58_decode(value))
+    return super().process_encode(value)
+
+
+
+

Inherited members

+ +
+
+class AccountIndex +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class AccountIndex(U32):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class AccountInfo +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class AccountInfo(Struct):
+    type_string = 'AccountInfo<BlockNumber>'
+
+    type_mapping = (
+        ('identity', 'IPNSIdentity'),
+        ('expires_at', 'BlockNumber'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class Address +(data, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Address(ScaleType):
+
+    def __init__(self, data, **kwargs):
+        self.account_length = None
+        self.account_id = None
+        self.account_index = None
+        self.account_idx = None
+        super().__init__(data, **kwargs)
+
+    def process(self):
+        self.account_length = self.get_next_bytes(1)
+
+        if self.account_length == b'\xff':
+            self.account_id = self.get_next_bytes(32).hex()
+            self.account_length = self.account_length.hex()
+
+            return self.account_id
+        else:
+            if self.account_length == b'\xfc':
+                account_index = self.get_next_bytes(2)
+            elif self.account_length == b'\xfd':
+                account_index = self.get_next_bytes(4)
+            elif self.account_length == b'\xfe':
+                account_index = self.get_next_bytes(8)
+            else:
+                account_index = self.account_length
+
+            self.account_index = account_index.hex()
+            self.account_idx = int.from_bytes(account_index, byteorder='little')
+
+            self.account_length = self.account_length.hex()
+
+            return self.account_index
+
+    def process_encode(self, value):
+
+        if type(value) == str and value[0:2] != '0x':
+            # Assume SS58 encoding address
+            if len(value) == 47:
+                from scalecodec.utils.ss58 import ss58_decode
+                value = '0x{}'.format(ss58_decode(value))
+            else:
+                from scalecodec.utils.ss58 import ss58_decode_account_index
+                index_obj = AccountIndex()
+                value = index_obj.encode(ss58_decode_account_index(value))
+
+        if type(value) == str and value[0:2] == '0x' and len(value) == 66:
+            # value is AccountId
+            return ScaleBytes('0xff{}'.format(value[2:]))
+        elif type(value) == int:
+            # value is AccountIndex
+            raise NotImplementedError('Encoding of AccountIndex Adresses not supported yet')
+        else:
+            raise ValueError('Value is in unsupported format, expected 32 bytes hex-string for AccountIds or int for AccountIndex')
+
+    def serialize(self):
+        if self.account_id:
+            return '0x{}'.format(self.value)
+        else:
+            return self.value
+
+

Ancestors

+ +

Subclasses

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.account_length = self.get_next_bytes(1)
+
+    if self.account_length == b'\xff':
+        self.account_id = self.get_next_bytes(32).hex()
+        self.account_length = self.account_length.hex()
+
+        return self.account_id
+    else:
+        if self.account_length == b'\xfc':
+            account_index = self.get_next_bytes(2)
+        elif self.account_length == b'\xfd':
+            account_index = self.get_next_bytes(4)
+        elif self.account_length == b'\xfe':
+            account_index = self.get_next_bytes(8)
+        else:
+            account_index = self.account_length
+
+        self.account_index = account_index.hex()
+        self.account_idx = int.from_bytes(account_index, byteorder='little')
+
+        self.account_length = self.account_length.hex()
+
+        return self.account_index
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+
+    if type(value) == str and value[0:2] != '0x':
+        # Assume SS58 encoding address
+        if len(value) == 47:
+            from scalecodec.utils.ss58 import ss58_decode
+            value = '0x{}'.format(ss58_decode(value))
+        else:
+            from scalecodec.utils.ss58 import ss58_decode_account_index
+            index_obj = AccountIndex()
+            value = index_obj.encode(ss58_decode_account_index(value))
+
+    if type(value) == str and value[0:2] == '0x' and len(value) == 66:
+        # value is AccountId
+        return ScaleBytes('0xff{}'.format(value[2:]))
+    elif type(value) == int:
+        # value is AccountIndex
+        raise NotImplementedError('Encoding of AccountIndex Adresses not supported yet')
+    else:
+        raise ValueError('Value is in unsupported format, expected 32 bytes hex-string for AccountIds or int for AccountIndex')
+
+
+
+def serialize(self) +
+
+
+
+ +Expand source code + +
def serialize(self):
+    if self.account_id:
+        return '0x{}'.format(self.value)
+    else:
+        return self.value
+
+
+
+

Inherited members

+ +
+
+class ApprovalFlag +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ApprovalFlag(U32):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Attestation +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Attestation(Bytes):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class AuthorityId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class AuthorityId(AccountId):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class AuthorityWeight +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class AuthorityWeight(U64):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class BabeAuthorityWeight +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class BabeAuthorityWeight(U64):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Balance +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Balance(U128):
+    pass
+
+

Ancestors

+ +

Subclasses

+ +

Inherited members

+ +
+
+class BalanceLock +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class BalanceLock(Struct):
+    type_string = 'BalanceLock<Balance, BlockNumber>'
+
+    type_mapping = (
+        ('id', 'LockIdentifier'),
+        ('amount', 'Balance'),
+        ('until', 'U32'),
+        ('reasons', 'WithdrawReasons'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class BalanceOf +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class BalanceOf(Balance):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Bidder +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Bidder(Enum):
+    type_string = 'Bidder<AccountId, ParaIdOf>'
+
+    value_list = ['NewBidder', 'ParaId']
+
+

Ancestors

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class BlockAndTime +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class BlockAndTime(Struct):
+    type_mapping = (
+        ('block', 'BlockNumber'),
+        ('time', 'Moment')
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class BlockAttestations +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class BlockAttestations(Struct):
+
+    type_mapping = (
+        ('receipt', 'CandidateReceipt'),
+        ('valid', 'Vec<AccountId>'),
+        ('invalid', 'Vec<AccountId>'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class BlockNumber +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class BlockNumber(U64):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class BlockchainTimestamp +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class BlockchainTimestamp(Struct):
+    type_string = 'BlockchainTimestamp<BlockNumber, Moment>'
+
+    type_mapping = (
+        ('block', 'BlockNumber'),
+        ('time', 'Moment'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class Bool +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Bool(ScaleType):
+
+    def process(self):
+        return self.get_next_bool()
+
+    def process_encode(self, value):
+        if value is True:
+            return ScaleBytes('0x01')
+        elif value is False:
+            return ScaleBytes('0x00')
+        else:
+            raise ValueError("Value must be boolean")
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    return self.get_next_bool()
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if value is True:
+        return ScaleBytes('0x01')
+    elif value is False:
+        return ScaleBytes('0x00')
+    else:
+        raise ValueError("Value must be boolean")
+
+
+
+

Inherited members

+ +
+
+class BoxProposal +(data, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class BoxProposal(ScaleType):
+    type_string = 'Box<Proposal>'
+
+    def __init__(self, data, **kwargs):
+        self.call_index = None
+        self.call_function = None
+        self.call_module = None
+        self.call_args = []
+        super().__init__(data, **kwargs)
+
+    def process(self):
+
+        self.call_index = self.get_next_bytes(2).hex()
+
+        self.call_module, self.call_function = self.metadata.call_index[self.call_index]
+
+        for arg in self.call_function.args:
+            arg_type_obj = self.process_type(arg.type, metadata=self.metadata)
+
+            self.call_args.append({
+                'name': arg.name,
+                'type': arg.type,
+                'value': arg_type_obj.serialize(),
+                'valueRaw': arg_type_obj.raw_value
+            })
+
+        return {
+            'call_index': self.call_index,
+            'call_function': self.call_function.name,
+            'call_module': self.call_module.name,
+            'call_args': self.call_args
+        }
+
+    def process_encode(self, value):
+        # Check requirements
+        if 'call_index' in value:
+            self.call_index = value['call_index']
+
+        elif 'call_module' in value and 'call_function' in value:
+            # Look up call module from metadata
+            for call_index, (call_module, call_function) in self.metadata.call_index.items():
+
+                if call_module.name == value['call_module'] and call_function.name == value['call_function']:
+                    self.call_index = call_index
+                    self.call_module = call_module
+                    self.call_function = call_function
+                    break
+
+            if not self.call_index:
+                raise ValueError('Specified call module and function not found in metadata')
+
+        elif not self.call_module or not self.call_function:
+            raise ValueError('No call module and function specified')
+
+        data = ScaleBytes(bytearray.fromhex(self.call_index))
+
+        # Encode call params
+        if len(self.call_function.args) > 0:
+            for arg in self.call_function.args:
+                if arg.name not in value['call_args']:
+                    raise ValueError('Parameter \'{}\' not specified'.format(arg.name))
+                else:
+                    param_value = value['call_args'][arg.name]
+
+                    arg_obj = self.get_decoder_class(arg.type, metadata=self.metadata)
+                    data += arg_obj.encode(param_value)
+
+        return data
+
+

Ancestors

+ +

Subclasses

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.call_index = self.get_next_bytes(2).hex()
+
+    self.call_module, self.call_function = self.metadata.call_index[self.call_index]
+
+    for arg in self.call_function.args:
+        arg_type_obj = self.process_type(arg.type, metadata=self.metadata)
+
+        self.call_args.append({
+            'name': arg.name,
+            'type': arg.type,
+            'value': arg_type_obj.serialize(),
+            'valueRaw': arg_type_obj.raw_value
+        })
+
+    return {
+        'call_index': self.call_index,
+        'call_function': self.call_function.name,
+        'call_module': self.call_module.name,
+        'call_args': self.call_args
+    }
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    # Check requirements
+    if 'call_index' in value:
+        self.call_index = value['call_index']
+
+    elif 'call_module' in value and 'call_function' in value:
+        # Look up call module from metadata
+        for call_index, (call_module, call_function) in self.metadata.call_index.items():
+
+            if call_module.name == value['call_module'] and call_function.name == value['call_function']:
+                self.call_index = call_index
+                self.call_module = call_module
+                self.call_function = call_function
+                break
+
+        if not self.call_index:
+            raise ValueError('Specified call module and function not found in metadata')
+
+    elif not self.call_module or not self.call_function:
+        raise ValueError('No call module and function specified')
+
+    data = ScaleBytes(bytearray.fromhex(self.call_index))
+
+    # Encode call params
+    if len(self.call_function.args) > 0:
+        for arg in self.call_function.args:
+            if arg.name not in value['call_args']:
+                raise ValueError('Parameter \'{}\' not specified'.format(arg.name))
+            else:
+                param_value = value['call_args'][arg.name]
+
+                arg_obj = self.get_decoder_class(arg.type, metadata=self.metadata)
+                data += arg_obj.encode(param_value)
+
+    return data
+
+
+
+

Inherited members

+ +
+
+class Bytes +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Bytes(ScaleType):
+
+    type_string = 'Vec<u8>'
+
+    def process(self):
+
+        length = self.process_type('Compact<u32>').value
+        value = self.get_next_bytes(length)
+
+        try:
+            return value.decode()
+        except UnicodeDecodeError:
+            return '0x{}'.format(value.hex())
+
+    def process_encode(self, value):
+        string_length_compact = CompactU32()
+
+        if value[0:2] == '0x':
+            # TODO implicit HexBytes conversion can have unexpected result if string is actually starting with '0x'
+            value = bytes.fromhex(value[2:])
+            data = string_length_compact.encode(len(value))
+            data += value
+        else:
+            data = string_length_compact.encode(len(value))
+            data += value.encode()
+
+        return data
+
+

Ancestors

+ +

Subclasses

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    length = self.process_type('Compact<u32>').value
+    value = self.get_next_bytes(length)
+
+    try:
+        return value.decode()
+    except UnicodeDecodeError:
+        return '0x{}'.format(value.hex())
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    string_length_compact = CompactU32()
+
+    if value[0:2] == '0x':
+        # TODO implicit HexBytes conversion can have unexpected result if string is actually starting with '0x'
+        value = bytes.fromhex(value[2:])
+        data = string_length_compact.encode(len(value))
+        data += value
+    else:
+        data = string_length_compact.encode(len(value))
+        data += value.encode()
+
+    return data
+
+
+
+

Inherited members

+ +
+
+class Call +(data, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Call(ScaleType):
+
+    type_string = "Box<Call>"
+
+    def __init__(self, data, **kwargs):
+        self.call_index = None
+        self.call_function = None
+        self.call_args = []
+        self.call_module = None
+
+        super().__init__(data, **kwargs)
+
+    def process(self):
+
+        self.call_index = self.get_next_bytes(2).hex()
+
+        self.call_module, self.call_function = self.metadata.call_index[self.call_index]
+
+        for arg in self.call_function.args:
+            arg_type_obj = self.process_type(arg.type, metadata=self.metadata)
+
+            self.call_args.append({
+                'name': arg.name,
+                'type': arg.type,
+                'value': arg_type_obj.serialize(),
+                'valueRaw': arg_type_obj.raw_value
+            })
+
+        return {
+            'call_index': self.call_index,
+            'call_function': self.call_function.name,
+            'call_module': self.call_module.name,
+            'call_args': self.call_args
+        }
+
+    def process_encode(self, value):
+        # Check requirements
+        if 'call_index' in value:
+            self.call_index = value['call_index']
+
+        elif 'call_module' in value and 'call_function' in value:
+            # Look up call module from metadata
+            for call_index, (call_module, call_function) in self.metadata.call_index.items():
+
+                if call_module.name == value['call_module'] and call_function.name == value['call_function']:
+                    self.call_index = call_index
+                    self.call_module = call_module
+                    self.call_function = call_function
+                    break
+
+            if not self.call_index:
+                raise ValueError('Specified call module and function not found in metadata')
+
+        elif not self.call_module or not self.call_function:
+            raise ValueError('No call module and function specified')
+
+        data = ScaleBytes(bytearray.fromhex(self.call_index))
+
+        # Encode call params
+        if len(self.call_function.args) > 0:
+            for arg in self.call_function.args:
+                if arg.name not in value['call_args']:
+                    raise ValueError('Parameter \'{}\' not specified'.format(arg.name))
+                else:
+                    param_value = value['call_args'][arg.name]
+
+                    arg_obj = self.get_decoder_class(arg.type, metadata=self.metadata)
+                    data += arg_obj.encode(param_value)
+
+        return data
+
+

Ancestors

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.call_index = self.get_next_bytes(2).hex()
+
+    self.call_module, self.call_function = self.metadata.call_index[self.call_index]
+
+    for arg in self.call_function.args:
+        arg_type_obj = self.process_type(arg.type, metadata=self.metadata)
+
+        self.call_args.append({
+            'name': arg.name,
+            'type': arg.type,
+            'value': arg_type_obj.serialize(),
+            'valueRaw': arg_type_obj.raw_value
+        })
+
+    return {
+        'call_index': self.call_index,
+        'call_function': self.call_function.name,
+        'call_module': self.call_module.name,
+        'call_args': self.call_args
+    }
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    # Check requirements
+    if 'call_index' in value:
+        self.call_index = value['call_index']
+
+    elif 'call_module' in value and 'call_function' in value:
+        # Look up call module from metadata
+        for call_index, (call_module, call_function) in self.metadata.call_index.items():
+
+            if call_module.name == value['call_module'] and call_function.name == value['call_function']:
+                self.call_index = call_index
+                self.call_module = call_module
+                self.call_function = call_function
+                break
+
+        if not self.call_index:
+            raise ValueError('Specified call module and function not found in metadata')
+
+    elif not self.call_module or not self.call_function:
+        raise ValueError('No call module and function specified')
+
+    data = ScaleBytes(bytearray.fromhex(self.call_index))
+
+    # Encode call params
+    if len(self.call_function.args) > 0:
+        for arg in self.call_function.args:
+            if arg.name not in value['call_args']:
+                raise ValueError('Parameter \'{}\' not specified'.format(arg.name))
+            else:
+                param_value = value['call_args'][arg.name]
+
+                arg_obj = self.get_decoder_class(arg.type, metadata=self.metadata)
+                data += arg_obj.encode(param_value)
+
+    return data
+
+
+
+

Inherited members

+ +
+
+class Category +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Category(Struct):
+    type_string = 'Category<BlockNumber, Moment, AccountId>'
+
+    type_mapping = (
+        ('id', 'CategoryId'),
+        ('title', 'Vec<u8>'),
+        ('description', 'Vec<u8>'),
+        ('created_at', 'BlockchainTimestamp<BlockNumber, Moment>'),
+        ('deleted', 'bool'),
+        ('archived', 'bool'),
+        ('num_direct_subcategories', 'u32'),
+        ('num_direct_unmoderated_threads', 'u32'),
+        ('num_direct_moderated_threads', 'u32'),
+        ('position_in_parent_category', 'Option<ChildPositionInParentCategory>'),
+        ('moderator_id', 'AccountId'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class CategoryId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class CategoryId(U64):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class ChildPositionInParentCategory +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ChildPositionInParentCategory(Struct):
+
+    type_mapping = (
+        ('parent_id', 'CategoryId'),
+        ('child_nr_in_parent_category', 'u32'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class CodeHash +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class CodeHash(Hash):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Compact +(data=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Compact(ScaleType):
+
+    def __init__(self, data=None, **kwargs):
+        self.compact_length = 0
+        self.compact_bytes = None
+        super().__init__(data, **kwargs)
+
+    def process_compact_bytes(self):
+        compact_byte = self.get_next_bytes(1)
+        try:
+            byte_mod = compact_byte[0] % 4
+        except IndexError:
+            raise InvalidScaleTypeValueException("Invalid byte for Compact")
+
+        if byte_mod == 0:
+            self.compact_length = 1
+        elif byte_mod == 1:
+            self.compact_length = 2
+        elif byte_mod == 2:
+            self.compact_length = 4
+        else:
+            self.compact_length = int(5 + (compact_byte[0] - 3) / 4)
+
+        if self.compact_length == 1:
+            self.compact_bytes = compact_byte
+        elif self.compact_length in [2, 4]:
+            self.compact_bytes = compact_byte + self.get_next_bytes(self.compact_length - 1)
+        else:
+            self.compact_bytes = self.get_next_bytes(self.compact_length - 1)
+
+        return self.compact_bytes
+
+    def process(self):
+
+        self.process_compact_bytes()
+
+        if self.sub_type:
+
+            byte_data = self.get_decoder_class(self.sub_type, ScaleBytes(self.compact_bytes)).process()
+
+            if type(byte_data) is int and self.compact_length <= 4:
+                return int(byte_data / 4)
+            else:
+                return byte_data
+        else:
+            return self.compact_bytes
+
+    def process_encode(self, value):
+
+        if value <= 0b00111111:
+            return ScaleBytes(bytearray(int(value << 2).to_bytes(1, 'little')))
+
+        elif value <= 0b0011111111111111:
+            return ScaleBytes(bytearray(int((value << 2) | 0b01).to_bytes(2, 'little')))
+
+        elif value <= 0b00111111111111111111111111111111:
+
+            return ScaleBytes(bytearray(int((value << 2) | 0b10).to_bytes(4, 'little')))
+
+        else:
+            for bytes_length in range(4, 68):
+                if 2 ** (8 * (bytes_length - 1)) <= value < 2 ** (8 * bytes_length):
+                    return ScaleBytes(bytearray(
+                        ((bytes_length - 4) << 2 | 0b11).to_bytes(1, 'little') + value.to_bytes(bytes_length,
+                                                                                                'little')))
+            else:
+                raise ValueError('{} out of range'.format(value))
+
+

Ancestors

+ +

Subclasses

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.process_compact_bytes()
+
+    if self.sub_type:
+
+        byte_data = self.get_decoder_class(self.sub_type, ScaleBytes(self.compact_bytes)).process()
+
+        if type(byte_data) is int and self.compact_length <= 4:
+            return int(byte_data / 4)
+        else:
+            return byte_data
+    else:
+        return self.compact_bytes
+
+
+
+def process_compact_bytes(self) +
+
+
+
+ +Expand source code + +
def process_compact_bytes(self):
+    compact_byte = self.get_next_bytes(1)
+    try:
+        byte_mod = compact_byte[0] % 4
+    except IndexError:
+        raise InvalidScaleTypeValueException("Invalid byte for Compact")
+
+    if byte_mod == 0:
+        self.compact_length = 1
+    elif byte_mod == 1:
+        self.compact_length = 2
+    elif byte_mod == 2:
+        self.compact_length = 4
+    else:
+        self.compact_length = int(5 + (compact_byte[0] - 3) / 4)
+
+    if self.compact_length == 1:
+        self.compact_bytes = compact_byte
+    elif self.compact_length in [2, 4]:
+        self.compact_bytes = compact_byte + self.get_next_bytes(self.compact_length - 1)
+    else:
+        self.compact_bytes = self.get_next_bytes(self.compact_length - 1)
+
+    return self.compact_bytes
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+
+    if value <= 0b00111111:
+        return ScaleBytes(bytearray(int(value << 2).to_bytes(1, 'little')))
+
+    elif value <= 0b0011111111111111:
+        return ScaleBytes(bytearray(int((value << 2) | 0b01).to_bytes(2, 'little')))
+
+    elif value <= 0b00111111111111111111111111111111:
+
+        return ScaleBytes(bytearray(int((value << 2) | 0b10).to_bytes(4, 'little')))
+
+    else:
+        for bytes_length in range(4, 68):
+            if 2 ** (8 * (bytes_length - 1)) <= value < 2 ** (8 * bytes_length):
+                return ScaleBytes(bytearray(
+                    ((bytes_length - 4) << 2 | 0b11).to_bytes(1, 'little') + value.to_bytes(bytes_length,
+                                                                                            'little')))
+        else:
+            raise ValueError('{} out of range'.format(value))
+
+
+
+

Inherited members

+ +
+
+class CompactMoment +(data=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class CompactMoment(CompactU32):
+    type_string = 'Compact<Moment>'
+
+    def process(self):
+        int_value = super().process()
+
+        if int_value > 10000000000:
+            int_value = int_value / 1000
+
+        return datetime.utcfromtimestamp(int_value)
+
+    def serialize(self):
+        return self.value.isoformat()
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    int_value = super().process()
+
+    if int_value > 10000000000:
+        int_value = int_value / 1000
+
+    return datetime.utcfromtimestamp(int_value)
+
+
+
+def serialize(self) +
+
+
+
+ +Expand source code + +
def serialize(self):
+    return self.value.isoformat()
+
+
+
+

Inherited members

+ +
+
+class CompactU32 +(data=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class CompactU32(Compact):
+
+    type_string = 'Compact<u32>'
+
+    def process(self):
+        self.process_compact_bytes()
+
+        if self.compact_length <= 4:
+            return int(int.from_bytes(self.compact_bytes, byteorder='little') / 4)
+        else:
+            return int.from_bytes(self.compact_bytes, byteorder='little')
+
+    def process_encode(self, value):
+
+        if value <= 0b00111111:
+            return ScaleBytes(bytearray(int(value << 2).to_bytes(1, 'little')))
+
+        elif value <= 0b0011111111111111:
+            return ScaleBytes(bytearray(int((value << 2) | 0b01).to_bytes(2, 'little')))
+
+        elif value <= 0b00111111111111111111111111111111:
+
+            return ScaleBytes(bytearray(int((value << 2) | 0b10).to_bytes(4, 'little')))
+
+        else:
+            for bytes_length in range(4, 68):
+                if 2 ** (8 * (bytes_length-1)) <= value < 2 ** (8 * bytes_length):
+                    return ScaleBytes(bytearray(((bytes_length - 4) << 2 | 0b11).to_bytes(1, 'little') + value.to_bytes(bytes_length, 'little')))
+            else:
+                raise ValueError('{} out of range'.format(value))
+
+

Ancestors

+ +

Subclasses

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.process_compact_bytes()
+
+    if self.compact_length <= 4:
+        return int(int.from_bytes(self.compact_bytes, byteorder='little') / 4)
+    else:
+        return int.from_bytes(self.compact_bytes, byteorder='little')
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+
+    if value <= 0b00111111:
+        return ScaleBytes(bytearray(int(value << 2).to_bytes(1, 'little')))
+
+    elif value <= 0b0011111111111111:
+        return ScaleBytes(bytearray(int((value << 2) | 0b01).to_bytes(2, 'little')))
+
+    elif value <= 0b00111111111111111111111111111111:
+
+        return ScaleBytes(bytearray(int((value << 2) | 0b10).to_bytes(4, 'little')))
+
+    else:
+        for bytes_length in range(4, 68):
+            if 2 ** (8 * (bytes_length-1)) <= value < 2 ** (8 * bytes_length):
+                return ScaleBytes(bytearray(((bytes_length - 4) << 2 | 0b11).to_bytes(1, 'little') + value.to_bytes(bytes_length, 'little')))
+        else:
+            raise ValueError('{} out of range'.format(value))
+
+
+
+

Inherited members

+ +
+
+class ContentId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ContentId(H256):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class ContentMetadata +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ContentMetadata(Struct):
+    type_mapping = (
+        ('owner', 'AccountId'),
+        ('added_at', 'BlockAndTime'),
+        ('children_ids', 'Vec<ContentId>'),
+        ('visibility', 'ContentVisibility'),
+        ('schema', 'SchemaId'),
+        ('json', 'Vec<u8>'),
+
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class ContentMetadataUpdate +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ContentMetadataUpdate(Struct):
+    type_mapping = (
+        ('children_ids', 'Option<Vec<ContentId>>'),
+        ('visibility', 'Option<ContentVisibility>'),
+        ('schema', 'Option<SchemaId>'),
+        ('json', 'Option<Vec<u8>>')
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class ContentVisibility +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ContentVisibility(Enum):
+    value_list = ['Draft', 'Public']
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Conviction +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Conviction(Enum):
+    CONVICTION_MASK = 0b01111111
+    DEFAULT_CONVICTION = 0b00000000
+
+    value_list = ['None', 'Locked1x', 'Locked2x', 'Locked3x', 'Locked4x', 'Locked5x', 'Locked6x']
+
+

Ancestors

+ +

Class variables

+
+
var CONVICTION_MASK
+
+

int([x]) -> integer +int(x, base=10) -> integer

+

Convert a number or string to an integer, or return 0 if no arguments +are given. +If x is a number, return x.int(). +For floating point +numbers, this truncates towards zero.

+

If x is not a number or if base is given, then x must be a string, +bytes, or bytearray instance representing an integer literal in the +given base. +The literal can be preceded by '+' or '-' and be surrounded +by whitespace. +The base defaults to 10. +Valid bases are 0 and 2-36. +Base 0 means to interpret the base from the string as an integer literal.

+
>>> int('0b100', base=0)
+4
+
+
+
var DEFAULT_CONVICTION
+
+

int([x]) -> integer +int(x, base=10) -> integer

+

Convert a number or string to an integer, or return 0 if no arguments +are given. +If x is a number, return x.int(). +For floating point +numbers, this truncates towards zero.

+

If x is not a number or if base is given, then x must be a string, +bytes, or bytearray instance representing an integer literal in the +given base. +The literal can be preceded by '+' or '-' and be surrounded +by whitespace. +The base defaults to 10. +Valid bases are 0 and 2-36. +Base 0 means to interpret the base from the string as an integer literal.

+
>>> int('0b100', base=0)
+4
+
+
+
+

Inherited members

+ +
+
+class Data +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Data(Enum):
+    type_mapping = [
+        ["None", "Null"],
+        ["Raw", "Bytes"],
+        ["BlakeTwo256", "H256"],
+        ["Sha256", "H256"],
+        ["Keccak256", "H256"],
+        ["ShaThree256", "H256"]
+      ]
+
+    def process(self):
+
+        self.index = int(self.get_next_bytes(1).hex(), 16)
+
+        if self.index == 0:
+            return {'None': None}
+
+        elif self.index >= 1 and self.index <= 33:
+            # Determine value of Raw type (length is processed in index byte)
+            data = self.get_next_bytes(self.index - 1)
+
+            try:
+                value = data.decode()
+            except UnicodeDecodeError:
+                value = '0x{}'.format(data.hex())
+            return {"Raw": value}
+
+        elif self.index >= 34 and self.index <= 37:
+
+            enum_value = self.type_mapping[self.index - 32][0]
+
+            return {enum_value: self.process_type(self.type_mapping[self.index - 32][1]).value}
+
+        raise ValueError("Unable to decode Data, invalid indicator byte '{}'".format(self.index))
+
+    def process_encode(self, value):
+
+        if type(value) != dict:
+            raise ValueError("Value must be a dict when type_mapping is set, not '{}'".format(value))
+
+        if len(value) != 1:
+            raise ValueError("Value for enum with type_mapping can only have one value")
+
+        for enum_key, enum_value in value.items():
+
+            for idx, (item_key, item_value) in enumerate(self.type_mapping):
+                if item_key == enum_key:
+                    self.index = idx
+
+                    if item_value == 'Null':
+                        return ScaleBytes(bytearray([0]))
+
+                    elif item_value == 'Bytes':
+
+                        if enum_value[0:2] == '0x':
+
+                            if len(enum_value) > 66:
+                                raise ValueError("Raw type in Data cannot exceed 32 bytes")
+
+                            enum_value = bytes.fromhex(enum_value[2:])
+                            data = bytes([len(enum_value) + 1]) + enum_value
+                            return ScaleBytes(bytearray(data))
+                        else:
+
+                            if len(enum_value) > 32:
+                                raise ValueError("Raw type in Data cannot exceed 32 bytes")
+
+                            data = bytes([len(enum_value) + 1]) + enum_value.encode()
+                            return ScaleBytes(bytearray(data))
+                    else:
+
+                        struct_obj = self.get_decoder_class('Struct', type_mapping=[self.type_mapping[self.index]])
+                        return ScaleBytes(bytearray([self.index])) + struct_obj.encode(value)
+
+            raise ValueError("Value '{}' not present in type_mapping of this enum".format(enum_key))
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in mutable sequence.

+

If no argument is given, the constructor creates a new empty list. +The argument must be an iterable if specified.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    self.index = int(self.get_next_bytes(1).hex(), 16)
+
+    if self.index == 0:
+        return {'None': None}
+
+    elif self.index >= 1 and self.index <= 33:
+        # Determine value of Raw type (length is processed in index byte)
+        data = self.get_next_bytes(self.index - 1)
+
+        try:
+            value = data.decode()
+        except UnicodeDecodeError:
+            value = '0x{}'.format(data.hex())
+        return {"Raw": value}
+
+    elif self.index >= 34 and self.index <= 37:
+
+        enum_value = self.type_mapping[self.index - 32][0]
+
+        return {enum_value: self.process_type(self.type_mapping[self.index - 32][1]).value}
+
+    raise ValueError("Unable to decode Data, invalid indicator byte '{}'".format(self.index))
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+
+    if type(value) != dict:
+        raise ValueError("Value must be a dict when type_mapping is set, not '{}'".format(value))
+
+    if len(value) != 1:
+        raise ValueError("Value for enum with type_mapping can only have one value")
+
+    for enum_key, enum_value in value.items():
+
+        for idx, (item_key, item_value) in enumerate(self.type_mapping):
+            if item_key == enum_key:
+                self.index = idx
+
+                if item_value == 'Null':
+                    return ScaleBytes(bytearray([0]))
+
+                elif item_value == 'Bytes':
+
+                    if enum_value[0:2] == '0x':
+
+                        if len(enum_value) > 66:
+                            raise ValueError("Raw type in Data cannot exceed 32 bytes")
+
+                        enum_value = bytes.fromhex(enum_value[2:])
+                        data = bytes([len(enum_value) + 1]) + enum_value
+                        return ScaleBytes(bytearray(data))
+                    else:
+
+                        if len(enum_value) > 32:
+                            raise ValueError("Raw type in Data cannot exceed 32 bytes")
+
+                        data = bytes([len(enum_value) + 1]) + enum_value.encode()
+                        return ScaleBytes(bytearray(data))
+                else:
+
+                    struct_obj = self.get_decoder_class('Struct', type_mapping=[self.type_mapping[self.index]])
+                    return ScaleBytes(bytearray([self.index])) + struct_obj.encode(value)
+
+        raise ValueError("Value '{}' not present in type_mapping of this enum".format(enum_key))
+
+
+
+

Inherited members

+ +
+
+class DataObject +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class DataObject(Struct):
+    type_mapping = (
+        ('owner', 'AccountId'),
+        ('added_at', 'BlockAndTime'),
+        ('type_id', 'DataObjectTypeId'),
+        ('size', 'u64'),
+        ('liaison', 'AccountId'),
+        ('liaison_judgement', 'LiaisonJudgement'),
+        ('ipfs_content_id', 'Bytes'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class DataObjectStorageRelationshipId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class DataObjectStorageRelationshipId(U64):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class DataObjectTypeId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class DataObjectTypeId(U64):
+    type_string = "<T as DOTRTrait>::DataObjectTypeId"
+
+

Ancestors

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class DownloadSession +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class DownloadSession(Struct):
+
+    type_mapping = (
+        ('content_id', 'ContentId'),
+        ('consumer', 'AccountId'),
+        ('distributor', 'AccountId'),
+        ('initiated_at_block', 'BlockNumber'),
+        ('initiated_at_time', 'BlockNumber'),
+        ('state', 'DownloadState'),
+        ('transmitted_bytes', 'u64'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class DownloadSessionId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class DownloadSessionId(U64):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class DownloadState +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class DownloadState(Enum):
+    value_list = ['Started', 'Ended']
+
+

Ancestors

+ +

Inherited members

+ +
+
+class EcdsaSignature +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class EcdsaSignature(ScaleType):
+
+    def process(self):
+        value = self.get_next_bytes(65)
+        return value.hex()
+
+    def process_encode(self, value):
+        if value[0:2] == '0x' and len(value) == 132:
+            return ScaleBytes(value)
+        else:
+            raise ValueError('Value should start with "0x" and must be 65 bytes long')
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    value = self.get_next_bytes(65)
+    return value.hex()
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if value[0:2] == '0x' and len(value) == 132:
+        return ScaleBytes(value)
+    else:
+        raise ValueError('Value should start with "0x" and must be 65 bytes long')
+
+
+
+

Inherited members

+ +
+
+class EdgewareKeys +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class EdgewareKeys(Struct):
+    type_mapping = (
+        ('grandpa', 'AccountId'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class EdgewareQueuedKeys +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class EdgewareQueuedKeys(Struct):
+
+    type_string = '(ValidatorId, EdgewareKeys)'
+
+    type_mapping = (
+        ('validator', 'ValidatorId'),
+        ('keys', 'EdgewareKeys'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class EntryMethod +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class EntryMethod(Enum):
+    value_list = ['Paid', 'Screening']
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Enum +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Enum(ScaleType):
+
+    value_list = []
+    type_mapping = None
+
+    def __init__(self, data, value_list=None, type_mapping=None, **kwargs):
+
+        self.index = None
+
+        if type_mapping:
+            self.type_mapping = type_mapping
+
+        if value_list:
+            self.value_list = value_list
+
+        super().__init__(data, **kwargs)
+
+    def process(self):
+        self.index = int(self.get_next_bytes(1).hex(), 16)
+
+        if self.type_mapping:
+            try:
+                enum_type_mapping = self.type_mapping[self.index]
+                return self.process_type('Struct', type_mapping=[enum_type_mapping]).value
+
+            except IndexError:
+                raise ValueError("Index '{}' not present in Enum type mapping".format(self.index))
+        else:
+            try:
+                return self.value_list[self.index]
+            except IndexError:
+                raise ValueError("Index '{}' not present in Enum value list".format(self.index))
+
+    def process_encode(self, value):
+        if self.type_mapping:
+
+            if type(value) != dict:
+                raise ValueError("Value must be a dict when type_mapping is set, not '{}'".format(value))
+
+            if len(value) != 1:
+                raise ValueError("Value for enum with type_mapping can only have one value")
+
+            for enum_key, enum_value in value.items():
+                for idx, (item_key, item_value) in enumerate(self.type_mapping):
+                    if item_key == enum_key:
+                        self.index = idx
+                        struct_obj = self.get_decoder_class('Struct', type_mapping=[self.type_mapping[self.index]])
+                        return ScaleBytes(bytearray([self.index])) + struct_obj.encode(value)
+
+                raise ValueError("Value '{}' not present in type_mapping of this enum".format(enum_key))
+
+        else:
+            for idx, item in enumerate(self.value_list):
+                if item == value:
+                    self.index = idx
+                    return ScaleBytes(bytearray([self.index]))
+
+            raise ValueError("Value '{}' not present in value list of this enum".format(value))
+
+

Ancestors

+ +

Subclasses

+ +

Class variables

+
+
var type_mapping
+
+
+
+
var value_list
+
+

Built-in mutable sequence.

+

If no argument is given, the constructor creates a new empty list. +The argument must be an iterable if specified.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.index = int(self.get_next_bytes(1).hex(), 16)
+
+    if self.type_mapping:
+        try:
+            enum_type_mapping = self.type_mapping[self.index]
+            return self.process_type('Struct', type_mapping=[enum_type_mapping]).value
+
+        except IndexError:
+            raise ValueError("Index '{}' not present in Enum type mapping".format(self.index))
+    else:
+        try:
+            return self.value_list[self.index]
+        except IndexError:
+            raise ValueError("Index '{}' not present in Enum value list".format(self.index))
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if self.type_mapping:
+
+        if type(value) != dict:
+            raise ValueError("Value must be a dict when type_mapping is set, not '{}'".format(value))
+
+        if len(value) != 1:
+            raise ValueError("Value for enum with type_mapping can only have one value")
+
+        for enum_key, enum_value in value.items():
+            for idx, (item_key, item_value) in enumerate(self.type_mapping):
+                if item_key == enum_key:
+                    self.index = idx
+                    struct_obj = self.get_decoder_class('Struct', type_mapping=[self.type_mapping[self.index]])
+                    return ScaleBytes(bytearray([self.index])) + struct_obj.encode(value)
+
+            raise ValueError("Value '{}' not present in type_mapping of this enum".format(enum_key))
+
+    else:
+        for idx, item in enumerate(self.value_list):
+            if item == value:
+                self.index = idx
+                return ScaleBytes(bytearray([self.index]))
+
+        raise ValueError("Value '{}' not present in value list of this enum".format(value))
+
+
+
+

Inherited members

+ +
+
+class Era +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Era(ScaleType):
+
+    def process(self):
+
+        option_byte = self.get_next_bytes(1).hex()
+        if option_byte == '00':
+            return option_byte
+        else:
+            return option_byte + self.get_next_bytes(1).hex()
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    option_byte = self.get_next_bytes(1).hex()
+    if option_byte == '00':
+        return option_byte
+    else:
+        return option_byte + self.get_next_bytes(1).hex()
+
+
+
+

Inherited members

+ +
+
+class EraIndex +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class EraIndex(U32):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class EraPoints +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class EraPoints(Struct):
+    type_mapping = (
+        ('total', 'Points'),
+        ('individual', 'Vec<Points>'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class EraRewards +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class EraRewards(Struct):
+
+    type_mapping = (
+        ('total', 'u32'),
+        ('rewards', 'Vec<u32>'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class EthereumAddress +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class EthereumAddress(ScaleType):
+
+    def process(self):
+        value = self.get_next_bytes(20)
+        return value.hex()
+
+    def process_encode(self, value):
+        if value[0:2] == '0x' and len(value) == 42:
+            return ScaleBytes(value)
+        else:
+            raise ValueError('Value should start with "0x" and must be 20 bytes long')
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    value = self.get_next_bytes(20)
+    return value.hex()
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if value[0:2] == '0x' and len(value) == 42:
+        return ScaleBytes(value)
+    else:
+        raise ValueError('Value should start with "0x" and must be 20 bytes long')
+
+
+
+

Inherited members

+ +
+
+class Exposure +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Exposure(Struct):
+    type_string = 'Exposure<AccountId, BalanceOf>'
+    type_mapping = (
+        ('total', 'Compact<Balance>'),
+        ('own', 'Compact<Balance>'),
+        ('others', 'Vec<IndividualExposure>'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class Gas +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Gas(U64):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class H160 +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class H160(ScaleType):
+
+    def process(self):
+        return '0x{}'.format(self.get_next_bytes(20).hex())
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 22:
+            raise ValueError('Value should start with "0x" and should be 20 bytes long')
+        return ScaleBytes(value)
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    return '0x{}'.format(self.get_next_bytes(20).hex())
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if value[0:2] != '0x' and len(value) == 22:
+        raise ValueError('Value should start with "0x" and should be 20 bytes long')
+    return ScaleBytes(value)
+
+
+
+

Inherited members

+ +
+
+class H256 +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class H256(ScaleType):
+
+    def process(self):
+        return '0x{}'.format(self.get_next_bytes(32).hex())
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 66:
+            raise ValueError('Value should start with "0x" and should be 32 bytes long')
+        return ScaleBytes(value)
+
+

Ancestors

+ +

Subclasses

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    return '0x{}'.format(self.get_next_bytes(32).hex())
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if value[0:2] != '0x' and len(value) == 66:
+        raise ValueError('Value should start with "0x" and should be 32 bytes long')
+    return ScaleBytes(value)
+
+
+
+

Inherited members

+ +
+
+class H512 +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class H512(ScaleType):
+
+    def process(self):
+        return '0x{}'.format(self.get_next_bytes(64).hex())
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 130:
+            raise ValueError('Value should start with "0x" and should be 64 bytes long')
+        return ScaleBytes(value)
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    return '0x{}'.format(self.get_next_bytes(64).hex())
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if value[0:2] != '0x' and len(value) == 130:
+        raise ValueError('Value should start with "0x" and should be 64 bytes long')
+    return ScaleBytes(value)
+
+
+
+

Inherited members

+ +
+
+class Hash +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Hash(H256):
+    pass
+
+

Ancestors

+ +

Subclasses

+ +

Inherited members

+ +
+
+class HeadData +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class HeadData(Bytes):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class HexBytes +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class HexBytes(ScaleType):
+
+    def process(self):
+
+        length = self.process_type('Compact<u32>').value
+
+        return '0x{}'.format(self.get_next_bytes(length).hex())
+
+    def process_encode(self, value):
+
+        if value[0:2] != '0x':
+            raise ValueError('HexBytes value should start with "0x"')
+
+        value = bytes.fromhex(value[2:])
+
+        string_length_compact = CompactU32()
+        data = string_length_compact.encode(len(value))
+        data += value
+        return data
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    length = self.process_type('Compact<u32>').value
+
+    return '0x{}'.format(self.get_next_bytes(length).hex())
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+
+    if value[0:2] != '0x':
+        raise ValueError('HexBytes value should start with "0x"')
+
+    value = bytes.fromhex(value[2:])
+
+    string_length_compact = CompactU32()
+    data = string_length_compact.encode(len(value))
+    data += value
+    return data
+
+
+
+

Inherited members

+ +
+
+class IPNSIdentity +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class IPNSIdentity(Bytes):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Identity +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Identity(Bytes):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class IdentityType +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class IdentityType(Bytes):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class IncludedBlocks +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class IncludedBlocks(Struct):
+
+    type_mapping = (
+        ('actualNumber', 'BlockNumber'),
+        ('session', 'SessionIndex'),
+        ('randomSeed', 'H256'),
+        ('activeParachains', 'Vec<ParaId>'),
+        ('paraBlocks', 'Vec<Hash>'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class Index +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Index(U64):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class IndividualExposure +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class IndividualExposure(Struct):
+    type_string = 'IndividualExposure<AccountId, Balance>'
+    type_mapping = (
+        ('who', 'AccountId'),
+        ('value', 'Compact<Balance>'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class InherentOfflineReport +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class InherentOfflineReport(Null):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class InputValidationLengthConstraint +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class InputValidationLengthConstraint(Struct):
+    type_mapping = (
+        ('min', 'u16'),
+        ('max_min_diff', 'u16'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class Key +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Key(Bytes):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class KeyTypeId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class KeyTypeId(VecU8Length4):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class KeyValue +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class KeyValue(Struct):
+    type_string = '(Vec<u8>, Vec<u8>)'
+    type_mapping = (('key', 'Vec<u8>'), ('value', 'Vec<u8>'))
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class LegacyKeys +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class LegacyKeys(Struct):
+
+    type_mapping = (
+        ('grandpa', 'AccountId'),
+        ('babe', 'AccountId'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class LegacyQueuedKeys +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class LegacyQueuedKeys(Struct):
+
+    type_string = '(ValidatorId, LegacyKeys)'
+
+    type_mapping = (
+        ('validator', 'ValidatorId'),
+        ('keys', 'LegacyKeys'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class LiaisonJudgement +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class LiaisonJudgement(Enum):
+    value_list = ['Pending', 'Accepted', 'Rejected']
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Linkage +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Linkage(Struct):
+    type_string = 'Linkage<AccountId>'
+
+    type_mapping = (
+        ('previous', 'Option<AccountId>'),
+        ('next', 'Option<AccountId>')
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class LockPeriods +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class LockPeriods(U8):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class MemberId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class MemberId(U64):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class ModerationAction +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ModerationAction(Struct):
+    type_mapping = (
+        ('moderated_at', 'BlockchainTimestamp<BlockNumber, Moment>'),
+        ('moderator_id', 'AccountId'),
+        ('rationale', 'Vec<u8>'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class Moment +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Moment(U64):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class NewAccountOutcome +(data=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class NewAccountOutcome(CompactU32):
+    type_string = 'NewAccountOutcome'
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Null +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Null(ScaleType):
+
+    def process(self):
+        return None
+
+    def process_encode(self, value):
+        return ScaleBytes(bytearray())
+
+

Ancestors

+ +

Subclasses

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    return None
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    return ScaleBytes(bytearray())
+
+
+
+

Inherited members

+ +
+
+class OpaqueMultiaddr +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class OpaqueMultiaddr(Bytes):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class OpaqueNetworkState +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class OpaqueNetworkState(Struct):
+
+    type_mapping = (
+        ('peerId', 'OpaquePeerId'),
+        ('externalAddresses', 'Vec<OpaqueMultiaddr>'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class OpaquePeerId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class OpaquePeerId(Bytes):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Option +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Option(ScaleType):
+    def process(self):
+
+        option_byte = self.get_next_bytes(1)
+
+        if self.sub_type and option_byte != b'\x00':
+            return self.process_type(self.sub_type).value
+
+        return None
+
+    def process_encode(self, value):
+
+        if value is not None and self.sub_type:
+            sub_type_obj = self.get_decoder_class(self.sub_type)
+            return ScaleBytes('0x01') + sub_type_obj.encode(value)
+
+        return ScaleBytes('0x00')
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    option_byte = self.get_next_bytes(1)
+
+    if self.sub_type and option_byte != b'\x00':
+        return self.process_type(self.sub_type).value
+
+    return None
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+
+    if value is not None and self.sub_type:
+        sub_type_obj = self.get_decoder_class(self.sub_type)
+        return ScaleBytes('0x01') + sub_type_obj.encode(value)
+
+    return ScaleBytes('0x00')
+
+
+
+

Inherited members

+ +
+
+class OptionBytes +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class OptionBytes(ScaleType):
+
+    type_string = 'Option<Vec<u8>>'
+
+    def process(self):
+
+        option_byte = self.get_next_bytes(1)
+
+        if option_byte != b'\x00':
+            return self.process_type('Bytes').value
+
+        return None
+
+

Ancestors

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    option_byte = self.get_next_bytes(1)
+
+    if option_byte != b'\x00':
+        return self.process_type('Bytes').value
+
+    return None
+
+
+
+

Inherited members

+ +
+
+class PaidMembershipTerms +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class PaidMembershipTerms(Struct):
+    type_mapping = (
+        ('id', 'PaidTermId'),
+        ('fee', 'BalanceOf'),
+        ('text', 'Bytes'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class PaidTermId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class PaidTermId(U64):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class ParaId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ParaId(U32):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class ParachainDispatchOrigin +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ParachainDispatchOrigin(Enum):
+    value_list = ['Signed', 'Parachain']
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Perbill +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Perbill(U32):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Permill +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Permill(U32):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Points +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Points(U32):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Post +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Post(Struct):
+    type_string = 'Post<BlockNumber, Moment, AccountId>'
+
+    type_mapping = (
+        ('id', 'PostId'),
+        ('thread_id', 'ThreadId'),
+        ('nr_in_thread', 'u32'),
+        ('current_text', 'Vec<u8>'),
+        ('moderation', 'Option<ModerationAction<BlockNumber, Moment, AccountId>>'),
+        ('text_change_history', 'Vec<PostTextChange<BlockNumber, Moment>>'),
+        ('created_at', 'BlockchainTimestamp<BlockNumber, Moment>'),
+        ('author_id', 'AccountId'),
+
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class PostId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class PostId(U64):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class PostTextChange +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class PostTextChange(Struct):
+    type_string = 'PostTextChange<BlockNumber, Moment>'
+
+    type_mapping = (
+        ('expired_at', 'BlockchainTimestamp<BlockNumber, Moment>'),
+        ('text', 'Vec<u8>'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class PrefabWasmModule +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class PrefabWasmModule(Struct):
+    type_string = 'wasm::PrefabWasmModule'
+
+    type_mapping = (
+        ('scheduleVersion', 'Compact<u32>'),
+        ('initial', 'Compact<u32>'),
+        ('maximum', 'Compact<u32>'),
+        ('_reserved', 'Option<Null>'),
+        ('code', 'Bytes'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class Profile +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Profile(Struct):
+    type_mapping = (
+        ('id', 'MemberId'),
+        ('handle', 'Bytes'),
+        ('avatar_uri', 'Bytes'),
+        ('about', 'Bytes'),
+        ('registered_at_block', 'BlockNumber'),
+        ('registered_at_time', 'Moment'),
+        ('entry', 'EntryMethod'),
+        ('suspended', 'bool'),
+        ('subscription', 'Option<SubscriptionId>'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class PropIndex +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class PropIndex(U32):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Proposal +(data, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Proposal(BoxProposal):
+    type_string = '<T as Trait<I>>::Proposal'
+
+

Ancestors

+ +

Inherited members

+ +
+
+class ProposalCategory +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ProposalCategory(Enum):
+    value_list = ['Signaling']
+
+

Ancestors

+ +

Inherited members

+ +
+
+class ProposalContents +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ProposalContents(Bytes):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class ProposalIndex +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ProposalIndex(U32):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class ProposalPreimage +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ProposalPreimage(Struct):
+    type_string = '(Vec<u8>, AccountId, BalanceOf, BlockNumber)'
+
+    type_mapping = (
+        ("proposal", "HexBytes"),
+        ("registredBy", "AccountId"),
+        ("deposit", "BalanceOf"),
+        ("blockNumber", "BlockNumber")
+    )
+    def process(self):
+
+        result = {}
+        for key, data_type in self.type_mapping:
+            result[key] = self.process_type(data_type, metadata=self.metadata).value
+
+        # Replace HexBytes with actual proposal
+        result['proposal'] = Proposal(ScaleBytes(result['proposal']), metadata=self.metadata).decode()
+
+        return result
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    result = {}
+    for key, data_type in self.type_mapping:
+        result[key] = self.process_type(data_type, metadata=self.metadata).value
+
+    # Replace HexBytes with actual proposal
+    result['proposal'] = Proposal(ScaleBytes(result['proposal']), metadata=self.metadata).decode()
+
+    return result
+
+
+
+

Inherited members

+ +
+
+class ProposalStage +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ProposalStage(Enum):
+    value_list = ['PreVoting', 'Voting', 'Completed']
+
+

Ancestors

+ +

Inherited members

+ +
+
+class ProposalStatus +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ProposalStatus(Enum):
+    value_list = ['Active', 'Cancelled', 'Expired', 'Approved', 'Rejected', 'Slashed']
+
+

Ancestors

+ +

Inherited members

+ +
+
+class ProposalTitle +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ProposalTitle(Bytes):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class QueuedKeys +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class QueuedKeys(Struct):
+
+    type_string = '(ValidatorId, Keys)'
+
+    type_mapping = (
+        ('validator', 'ValidatorId'),
+        ('keys', 'Keys'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class RawAddress +(data, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class RawAddress(Address):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class ReferendumIndex +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ReferendumIndex(U32):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class ReportIdOf +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ReportIdOf(Hash):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class RewardDestination +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class RewardDestination(Enum):
+
+    value_list = ['Staked', 'Stash', 'Controller']
+
+

Ancestors

+ +

Inherited members

+ +
+
+class Role +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Role(Enum):
+
+    value_list = ['Storage']
+
+

Ancestors

+ +

Inherited members

+ +
+
+class RuntimeUpgradeProposal +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class RuntimeUpgradeProposal(Struct):
+    type_string = 'RuntimeUpgradeProposal<AccountId, Balance, BlockNumber, Hash>'
+
+    type_mapping = (
+        ('id', 'u32'),
+        ('proposer', 'AccountId'),
+        ('stake', 'Balance'),
+        ('name', 'Vec<u8>'),
+        ('description', 'Vec<u8>'),
+        ('wasm_hash', 'Hash'),
+        ('proposed_at', 'BlockNumber'),
+        ('status', 'ProposalStatus'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class SchemaId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class SchemaId(U64):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class SessionIndex +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class SessionIndex(U32):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class SessionKey +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class SessionKey(H256):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class SessionKeysSubstrate +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class SessionKeysSubstrate(Struct):
+
+    type_mapping = (
+        ('grandpa', 'AccountId'),
+        ('babe', 'AccountId'),
+        ('im_online', 'AccountId'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class Set +(data, value_list=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Set(ScaleType):
+    value_list = []
+
+    def __init__(self, data, value_list=None, **kwargs):
+        self.set_value = None
+        if value_list:
+            self.value_list = value_list
+
+        super().__init__(data, **kwargs)
+
+    def process(self):
+        self.set_value = self.process_type('u64').value
+        result = []
+        if self.set_value > 0:
+
+            for value, set_mask in self.value_list.items():
+                if self.set_value & set_mask > 0:
+                    result.append(value)
+        return result
+
+    def process_encode(self, value):
+        result = 0
+        if type(value) is not list:
+            raise ValueError('Value for encoding a set must be a list')
+
+        for item, set_mask in self.value_list.items():
+            if item in value:
+                result += set_mask
+
+        u64_obj = self.get_decoder_class('u64')
+
+        return u64_obj.encode(result)
+
+

Ancestors

+ +

Class variables

+
+
var value_list
+
+

Built-in mutable sequence.

+

If no argument is given, the constructor creates a new empty list. +The argument must be an iterable if specified.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    self.set_value = self.process_type('u64').value
+    result = []
+    if self.set_value > 0:
+
+        for value, set_mask in self.value_list.items():
+            if self.set_value & set_mask > 0:
+                result.append(value)
+    return result
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    result = 0
+    if type(value) is not list:
+        raise ValueError('Value for encoding a set must be a list')
+
+    for item, set_mask in self.value_list.items():
+        if item in value:
+            result += set_mask
+
+    u64_obj = self.get_decoder_class('u64')
+
+    return u64_obj.encode(result)
+
+
+
+

Inherited members

+ +
+
+class SetIndex +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class SetIndex(U32):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class SlashJournalEntry +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class SlashJournalEntry(Struct):
+    type_mapping = (
+        ('who', 'AccountId'),
+        ('amount', 'Balance'),
+        ('ownSlash', 'Balance'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class StakingLedger +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class StakingLedger(Struct):
+    type_string = 'StakingLedger<AccountId, BalanceOf, BlockNumber>'
+    type_mapping = (
+        ('stash', 'AccountId'),
+        ('total', 'Compact<Balance>'),
+        ('active', 'Compact<Balance>'),
+        ('unlocking', 'Vec<UnlockChunk<Balance>>'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class StorageHasher +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class StorageHasher(Enum):
+
+    value_list = ['Blake2_128', 'Blake2_256', 'Blake2_128Concat', 'Twox128', 'Twox256', 'Twox64Concat']
+
+    def is_blake2_128(self):
+        return self.index == 0
+
+    def is_blake2_256(self):
+        return self.index == 1
+
+    def is_twoblake2_128_concat(self):
+        return self.index == 2
+
+    def is_twox128(self):
+        return self.index == 3
+
+    def is_twox256(self):
+        return self.index == 4
+
+    def is_twox64_concat(self):
+        return self.index == 5
+
+

Ancestors

+ +

Methods

+
+
+def is_blake2_128(self) +
+
+
+
+ +Expand source code + +
def is_blake2_128(self):
+    return self.index == 0
+
+
+
+def is_blake2_256(self) +
+
+
+
+ +Expand source code + +
def is_blake2_256(self):
+    return self.index == 1
+
+
+
+def is_twoblake2_128_concat(self) +
+
+
+
+ +Expand source code + +
def is_twoblake2_128_concat(self):
+    return self.index == 2
+
+
+
+def is_twox128(self) +
+
+
+
+ +Expand source code + +
def is_twox128(self):
+    return self.index == 3
+
+
+
+def is_twox256(self) +
+
+
+
+ +Expand source code + +
def is_twox256(self):
+    return self.index == 4
+
+
+
+def is_twox64_concat(self) +
+
+
+
+ +Expand source code + +
def is_twox64_concat(self):
+    return self.index == 5
+
+
+
+

Inherited members

+ +
+
+class StoredPendingChange +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class StoredPendingChange(Struct):
+    type_mapping = (
+        ('scheduled_at', 'u32'),
+        ('forced', 'u32'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class StoredState +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class StoredState(Enum):
+    value_list = ['Live', 'PendingPause', 'Paused', 'PendingResume']
+
+

Ancestors

+ +

Inherited members

+ +
+
+class String +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class String(ScaleType):
+
+    def process(self):
+
+        length = self.process_type('Compact<u32>').value
+        value = self.get_next_bytes(length)
+
+        return value.decode()
+
+    def process_encode(self, value):
+        string_length_compact = CompactU32()
+        data = string_length_compact.encode(len(value))
+        data += value.encode()
+        return data
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    length = self.process_type('Compact<u32>').value
+    value = self.get_next_bytes(length)
+
+    return value.decode()
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    string_length_compact = CompactU32()
+    data = string_length_compact.encode(len(value))
+    data += value.encode()
+    return data
+
+
+
+

Inherited members

+ +
+
+class Struct +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Struct(ScaleType):
+
+    def __init__(self, data, type_mapping=None, **kwargs):
+
+        if type_mapping:
+            self.type_mapping = type_mapping
+
+        super().__init__(data, **kwargs)
+
+    def process(self):
+
+        result = {}
+        for key, data_type in self.type_mapping:
+            result[key] = self.process_type(data_type, metadata=self.metadata).value
+
+        return result
+
+    def process_encode(self, value):
+        data = ScaleBytes(bytearray())
+
+        if type(value) is list:
+            if len(value) != len(self.type_mapping):
+                raise ValueError('Element count of value ({}) doesn\'t match type_mapping ({})'.format(len(value), len(self.type_mapping)))
+
+            for idx, (key, data_type) in enumerate(self.type_mapping):
+
+                element_obj = self.get_decoder_class(data_type, metadata=self.metadata)
+                data += element_obj.encode(value[idx])
+
+        else:
+            for key, data_type in self.type_mapping:
+                if key not in value:
+                    raise ValueError('Element "{}" of struct is missing in given value'.format(key))
+
+                element_obj = self.get_decoder_class(data_type, metadata=self.metadata)
+                data += element_obj.encode(value[key])
+
+        return data
+
+

Ancestors

+ +

Subclasses

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+
+    result = {}
+    for key, data_type in self.type_mapping:
+        result[key] = self.process_type(data_type, metadata=self.metadata).value
+
+    return result
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    data = ScaleBytes(bytearray())
+
+    if type(value) is list:
+        if len(value) != len(self.type_mapping):
+            raise ValueError('Element count of value ({}) doesn\'t match type_mapping ({})'.format(len(value), len(self.type_mapping)))
+
+        for idx, (key, data_type) in enumerate(self.type_mapping):
+
+            element_obj = self.get_decoder_class(data_type, metadata=self.metadata)
+            data += element_obj.encode(value[idx])
+
+    else:
+        for key, data_type in self.type_mapping:
+            if key not in value:
+                raise ValueError('Element "{}" of struct is missing in given value'.format(key))
+
+            element_obj = self.get_decoder_class(data_type, metadata=self.metadata)
+            data += element_obj.encode(value[key])
+
+    return data
+
+
+
+

Inherited members

+ +
+
+class SubscriptionId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class SubscriptionId(U64):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class TallyResult +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class TallyResult(Struct):
+    type_string = 'TallyResult<BlockNumber>'
+
+    type_mapping = (
+        ('proposal_id', 'u32'),
+        ('abstentions', 'u32'),
+        ('approvals', 'u32'),
+        ('rejections', 'u32'),
+        ('slashes', 'u32'),
+        ('status', 'ProposalStatus'),
+        ('finalized_at', 'BlockNumber'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class TallyType +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class TallyType(Enum):
+
+    type_string = 'voting::TallyType'
+
+    value_list = ['OnePerson', 'OneCoin']
+
+

Ancestors

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class Thread +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Thread(Struct):
+    type_string = 'Thread<BlockNumber, Moment, AccountId>'
+
+    type_mapping = (
+        ('id', 'ThreadId'),
+        ('title', 'Vec<u8>'),
+        ('category_id', 'CategoryId'),
+        ('nr_in_category', 'u32'),
+        ('moderation', 'Option<ModerationAction<BlockNumber, Moment, AccountId>>'),
+        ('num_unmoderated_posts', 'u32'),
+        ('num_moderated_posts', 'u32'),
+        ('author_id', 'AccountId'),
+        ('created_at', 'BlockchainTimestamp<BlockNumber, Moment>'),
+        ('author_id', 'AccountId'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class ThreadId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ThreadId(U64):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class U128 +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class U128(ScaleType):
+
+    def process(self):
+        return int(int.from_bytes(self.get_next_bytes(16), byteorder='little'))
+
+    def process_encode(self, value):
+        if 0 <= value <= 2**128 - 1:
+            return ScaleBytes(bytearray(int(value).to_bytes(16, 'little')))
+        else:
+            raise ValueError('{} out of range for u128'.format(value))
+
+

Ancestors

+ +

Subclasses

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    return int(int.from_bytes(self.get_next_bytes(16), byteorder='little'))
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if 0 <= value <= 2**128 - 1:
+        return ScaleBytes(bytearray(int(value).to_bytes(16, 'little')))
+    else:
+        raise ValueError('{} out of range for u128'.format(value))
+
+
+
+

Inherited members

+ +
+
+class U16 +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class U16(ScaleType):
+
+    def process(self):
+        return int.from_bytes(self.get_next_bytes(2), byteorder='little')
+
+    def process_encode(self, value):
+        if 0 <= value <= 2**16 - 1:
+            return ScaleBytes(bytearray(int(value).to_bytes(2, 'little')))
+        else:
+            raise ValueError('{} out of range for u16'.format(value))
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    return int.from_bytes(self.get_next_bytes(2), byteorder='little')
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if 0 <= value <= 2**16 - 1:
+        return ScaleBytes(bytearray(int(value).to_bytes(2, 'little')))
+    else:
+        raise ValueError('{} out of range for u16'.format(value))
+
+
+
+

Inherited members

+ +
+
+class U32 +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class U32(ScaleType):
+
+    def process(self):
+        return int.from_bytes(self.get_next_bytes(4), byteorder='little')
+
+    def process_encode(self, value):
+        if 0 <= value <= 2**32 - 1:
+            return ScaleBytes(bytearray(int(value).to_bytes(4, 'little')))
+        else:
+            raise ValueError('{} out of range for u32'.format(value))
+
+

Ancestors

+ +

Subclasses

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    return int.from_bytes(self.get_next_bytes(4), byteorder='little')
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if 0 <= value <= 2**32 - 1:
+        return ScaleBytes(bytearray(int(value).to_bytes(4, 'little')))
+    else:
+        raise ValueError('{} out of range for u32'.format(value))
+
+
+
+

Inherited members

+ +
+
+class U64 +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class U64(ScaleType):
+
+    def process(self):
+        return int(int.from_bytes(self.get_next_bytes(8), byteorder='little'))
+
+    def process_encode(self, value):
+        if 0 <= value <= 2**64 - 1:
+            return ScaleBytes(bytearray(int(value).to_bytes(8, 'little')))
+        else:
+            raise ValueError('{} out of range for u64'.format(value))
+
+

Ancestors

+ +

Subclasses

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    return int(int.from_bytes(self.get_next_bytes(8), byteorder='little'))
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if 0 <= value <= 2**64 - 1:
+        return ScaleBytes(bytearray(int(value).to_bytes(8, 'little')))
+    else:
+        raise ValueError('{} out of range for u64'.format(value))
+
+
+
+

Inherited members

+ +
+
+class U8 +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class U8(ScaleType):
+
+    def process(self):
+        return self.get_next_u8()
+
+    def process_encode(self, value):
+        if 0 <= value <= 2**8 - 1:
+            return ScaleBytes(bytearray(int(value).to_bytes(1, 'little')))
+        else:
+            raise ValueError('{} out of range for u8'.format(value))
+
+

Ancestors

+ +

Subclasses

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    return self.get_next_u8()
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if 0 <= value <= 2**8 - 1:
+        return ScaleBytes(bytearray(int(value).to_bytes(1, 'little')))
+    else:
+        raise ValueError('{} out of range for u8'.format(value))
+
+
+
+

Inherited members

+ +
+
+class UnlockChunk +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class UnlockChunk(Struct):
+    type_string = 'UnlockChunk<Balance>'
+    type_mapping = (
+        ('value', 'Compact<Balance>'),
+        ('era', 'Compact<EraIndex>'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class UpwardMessage +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class UpwardMessage(Struct):
+    type_mapping = (
+        ('origin', 'ParachainDispatchOrigin'),
+        ('data', 'Bytes'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class Url +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Url(Bytes):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class UserInfo +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class UserInfo(Struct):
+
+    type_mapping = (
+        ('handle', 'Option<Vec<u8>>'),
+        ('avatar_uri', 'Option<Vec<u8>>'),
+        ('about', 'Option<Vec<u8>>')
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class ValidatorId +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ValidatorId(AccountId):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class ValidatorPrefs +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ValidatorPrefs(Struct):
+    type_string = '(Compact<Balance>)'
+
+    type_mapping = (('commission', 'Compact<Balance>'),)
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class ValidatorPrefsLegacy +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class ValidatorPrefsLegacy(Struct):
+    type_string = '(Compact<u32>,Compact<Balance>)'
+
+    type_mapping = (('unstakeThreshold', 'Compact<u32>'), ('validatorPayment', 'Compact<Balance>'))
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class Vec +(data=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Vec(ScaleType):
+
+    def __init__(self, data=None, **kwargs):
+        self.elements = []
+        super().__init__(data, **kwargs)
+
+    def process(self):
+        element_count = self.process_type('Compact<u32>').value
+
+        result = []
+        for _ in range(0, element_count):
+            element = self.process_type(self.sub_type)
+            self.elements.append(element)
+            result.append(element.value)
+
+        return result
+
+    def process_encode(self, value):
+
+        if type(value) is not list:
+            raise ValueError("Provided value is not a list")
+
+        # encode element count to Compact<u32>
+        element_count_compact = CompactU32()
+
+        element_count_compact.encode(len(value))
+
+        data = element_count_compact.data
+
+        for element in value:
+
+            element_obj = self.get_decoder_class(self.sub_type, metadata=self.metadata)
+            data += element_obj.encode(element)
+
+        return data
+
+

Ancestors

+ +

Subclasses

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    element_count = self.process_type('Compact<u32>').value
+
+    result = []
+    for _ in range(0, element_count):
+        element = self.process_type(self.sub_type)
+        self.elements.append(element)
+        result.append(element.value)
+
+    return result
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+
+    if type(value) is not list:
+        raise ValueError("Provided value is not a list")
+
+    # encode element count to Compact<u32>
+    element_count_compact = CompactU32()
+
+    element_count_compact.encode(len(value))
+
+    data = element_count_compact.data
+
+    for element in value:
+
+        element_obj = self.get_decoder_class(self.sub_type, metadata=self.metadata)
+        data += element_obj.encode(element)
+
+    return data
+
+
+
+

Inherited members

+ +
+
+class VecNextAuthority +(data=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class VecNextAuthority(Vec):
+    type_string = 'Vec<NextAuthority>'
+
+    def process(self):
+        element_count = self.process_type('Compact<u32>').value
+
+        result = []
+        for _ in range(0, element_count):
+            element = self.process_type('NextAuthority')
+            self.elements.append(element)
+            result.append(element.value)
+
+        return result
+
+

Ancestors

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    element_count = self.process_type('Compact<u32>').value
+
+    result = []
+    for _ in range(0, element_count):
+        element = self.process_type('NextAuthority')
+        self.elements.append(element)
+        result.append(element.value)
+
+    return result
+
+
+
+

Inherited members

+ +
+
+class VecQueuedKeys +(data=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class VecQueuedKeys(Vec):
+    type_string = 'Vec<(ValidatorId, Keys)>'
+
+    def process(self):
+        element_count = self.process_type('Compact<u32>').value
+        result = []
+        for _ in range(0, element_count):
+            element = self.process_type('QueuedKeys')
+            self.elements.append(element)
+            result.append(element.value)
+
+        return result
+
+

Ancestors

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    element_count = self.process_type('Compact<u32>').value
+    result = []
+    for _ in range(0, element_count):
+        element = self.process_type('QueuedKeys')
+        self.elements.append(element)
+        result.append(element.value)
+
+    return result
+
+
+
+

Inherited members

+ +
+
+class VecU8Length16 +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class VecU8Length16(ScaleType):
+    type_string = '[u8; 16]'
+
+    def process(self):
+        value = self.get_next_bytes(16)
+        try:
+            return value.decode()
+        except UnicodeDecodeError:
+            return value.hex()
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 34:
+            raise ValueError('Value should start with "0x" and should be 16 bytes long')
+        return ScaleBytes(value)
+
+

Ancestors

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    value = self.get_next_bytes(16)
+    try:
+        return value.decode()
+    except UnicodeDecodeError:
+        return value.hex()
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if value[0:2] != '0x' and len(value) == 34:
+        raise ValueError('Value should start with "0x" and should be 16 bytes long')
+    return ScaleBytes(value)
+
+
+
+

Inherited members

+ +
+
+class VecU8Length2 +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class VecU8Length2(ScaleType):
+    type_string = '[u8; 2]'
+
+    def process(self):
+        value = self.get_next_bytes(2)
+        try:
+            return value.decode()
+        except UnicodeDecodeError:
+            return value.hex()
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 6:
+            raise ValueError('Value should start with "0x" and should be 2 bytes long')
+        return ScaleBytes(value)
+
+

Ancestors

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    value = self.get_next_bytes(2)
+    try:
+        return value.decode()
+    except UnicodeDecodeError:
+        return value.hex()
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if value[0:2] != '0x' and len(value) == 6:
+        raise ValueError('Value should start with "0x" and should be 2 bytes long')
+    return ScaleBytes(value)
+
+
+
+

Inherited members

+ +
+
+class VecU8Length32 +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class VecU8Length32(ScaleType):
+    type_string = '[u8; 32]'
+
+    def process(self):
+        return '0x{}'.format(self.get_next_bytes(32).hex())
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 66:
+            raise ValueError('Value should start with "0x" and should be 32 bytes long')
+        return ScaleBytes(value)
+
+

Ancestors

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    return '0x{}'.format(self.get_next_bytes(32).hex())
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if value[0:2] != '0x' and len(value) == 66:
+        raise ValueError('Value should start with "0x" and should be 32 bytes long')
+    return ScaleBytes(value)
+
+
+
+

Inherited members

+ +
+
+class VecU8Length4 +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class VecU8Length4(ScaleType):
+    type_string = '[u8; 4]'
+
+    def process(self):
+        value = self.get_next_bytes(4)
+        try:
+            return value.decode()
+        except UnicodeDecodeError:
+            return value.hex()
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 10:
+            raise ValueError('Value should start with "0x" and should be 4 bytes long')
+        return ScaleBytes(value)
+
+

Ancestors

+ +

Subclasses

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    value = self.get_next_bytes(4)
+    try:
+        return value.decode()
+    except UnicodeDecodeError:
+        return value.hex()
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if value[0:2] != '0x' and len(value) == 10:
+        raise ValueError('Value should start with "0x" and should be 4 bytes long')
+    return ScaleBytes(value)
+
+
+
+

Inherited members

+ +
+
+class VecU8Length64 +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class VecU8Length64(ScaleType):
+    type_string = '[u8; 64]'
+
+    def process(self):
+        return '0x{}'.format(self.get_next_bytes(64).hex())
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 130:
+            raise ValueError('Value should start with "0x" and should be 64 bytes long')
+        return ScaleBytes(value)
+
+

Ancestors

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    return '0x{}'.format(self.get_next_bytes(64).hex())
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if value[0:2] != '0x' and len(value) == 130:
+        raise ValueError('Value should start with "0x" and should be 64 bytes long')
+    return ScaleBytes(value)
+
+
+
+

Inherited members

+ +
+
+class VecU8Length8 +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class VecU8Length8(ScaleType):
+    type_string = '[u8; 8]'
+
+    def process(self):
+        value = self.get_next_bytes(8)
+        try:
+            return value.decode()
+        except UnicodeDecodeError:
+            return value.hex()
+
+    def process_encode(self, value):
+        if value[0:2] != '0x' and len(value) == 18:
+            raise ValueError('Value should start with "0x" and should be 8 bytes long')
+        return ScaleBytes(value)
+
+

Ancestors

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    value = self.get_next_bytes(8)
+    try:
+        return value.decode()
+    except UnicodeDecodeError:
+        return value.hex()
+
+
+
+def process_encode(self, value) +
+
+
+
+ +Expand source code + +
def process_encode(self, value):
+    if value[0:2] != '0x' and len(value) == 18:
+        raise ValueError('Value should start with "0x" and should be 8 bytes long')
+    return ScaleBytes(value)
+
+
+
+

Inherited members

+ +
+
+class Vote +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Vote(U8):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class VoteIndex +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class VoteIndex(U32):
+    pass
+
+

Ancestors

+ +

Inherited members

+ +
+
+class VoteKind +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class VoteKind(Enum):
+    value_list = ['Abstain', 'Approve', 'Reject', 'Slash']
+
+

Ancestors

+ +

Inherited members

+ +
+
+class VoteOutcome +(data=None, sub_type=None, metadata=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class VoteOutcome(ScaleType):
+
+    def process(self):
+        return list(self.get_next_bytes(32))
+
+

Ancestors

+ +

Methods

+
+
+def process(self) +
+
+
+
+ +Expand source code + +
def process(self):
+    return list(self.get_next_bytes(32))
+
+
+
+

Inherited members

+ +
+
+class VoteStage +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class VoteStage(Enum):
+    value_list = ['PreVoting', 'Commit', 'Voting', 'Completed']
+
+

Ancestors

+ +

Inherited members

+ +
+
+class VoteThreshold +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class VoteThreshold(Enum):
+
+    value_list = ['SuperMajorityApprove', 'SuperMajorityAgainst', 'SimpleMajority']
+
+

Ancestors

+ +

Inherited members

+ +
+
+class VoteType +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class VoteType(Enum):
+
+    type_string = 'voting::VoteType'
+
+    value_list = ['Binary', 'MultiOption']
+
+

Ancestors

+ +

Class variables

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class VoterInfo +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class VoterInfo(Struct):
+    type_string = 'VoterInfo<Balance>'
+
+    type_mapping = (
+        ('last_active', 'VoteIndex'),
+        ('last_win', 'VoteIndex'),
+        ('pot', 'Balance'),
+        ('stake', 'Balance'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
var type_string
+
+

str(object='') -> str +str(bytes_or_buffer[, encoding[, errors]]) -> str

+

Create a new string object from the given object. If encoding or +errors is specified, then the object must expose a data buffer +that will be decoded using the given encoding and error handler. +Otherwise, returns the result of object.str() (if defined) +or repr(object). +encoding defaults to sys.getdefaultencoding(). +errors defaults to 'strict'.

+
+
+

Inherited members

+ +
+
+class Votes +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class Votes(Struct):
+    type_mapping = (
+        ('index', 'ProposalIndex'),
+        ('threshold', 'MemberCount'),
+        ('ayes', 'Vec<AccountId>'),
+        ('nays', 'Vec<AccountId>'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class WinningDataEntry +(data, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class WinningDataEntry(Struct):
+    type_mapping = (
+        ('AccountId', 'AccountId'),
+        ('ParaIdOf', 'ParaIdOf'),
+        ('BalanceOf', 'BalanceOf'),
+    )
+
+

Ancestors

+ +

Class variables

+
+
var type_mapping
+
+

Built-in immutable sequence.

+

If no argument is given, the constructor returns an empty tuple. +If iterable is specified the tuple is initialized from iterable's items.

+

If the argument is a tuple, the return value is the same object.

+
+
+

Inherited members

+ +
+
+class WithdrawReasons +(data, value_list=None, type_mapping=None, **kwargs) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class WithdrawReasons(Enum):
+
+    value_list = ['TransactionPayment', 'Transfer', 'Reserve', 'Fee']
+
+

Ancestors

+ +

Inherited members

+ +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/py-scale-codec/docs/utils/index.html b/py-scale-codec/docs/utils/index.html new file mode 100644 index 00000000..b43bdb01 --- /dev/null +++ b/py-scale-codec/docs/utils/index.html @@ -0,0 +1,88 @@ + + + + + + +scalecodec.utils API documentation + + + + + + + + + +
+
+
+

Module scalecodec.utils

+
+
+
+ +Expand source code + +
# Python Substrate Interface
+#
+# Copyright 2018-2019 openAware BV (NL).
+# This file is part of Polkascan.
+#
+# Polkascan is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Polkascan is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Polkascan. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+

Sub-modules

+
+
scalecodec.utils.ss58
+
+

SS58 is a simple address format designed for Substrate based chains. +Encoding/decoding according to specification on …

+
+
+
+
+
+
+
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/py-scale-codec/docs/utils/ss58.html b/py-scale-codec/docs/utils/ss58.html new file mode 100644 index 00000000..cdc62aeb --- /dev/null +++ b/py-scale-codec/docs/utils/ss58.html @@ -0,0 +1,319 @@ + + + + + + +scalecodec.utils.ss58 API documentation + + + + + + + + + +
+
+
+

Module scalecodec.utils.ss58

+
+
+

SS58 is a simple address format designed for Substrate based chains. +Encoding/decoding according to specification on https://wiki.parity.io/External-Address-Format-(SS58)

+
+ +Expand source code + +
# Python Scale Codec
+#
+# Copyright 2018-2019 openAware BV (NL).
+# This file is part of Polkascan.
+#
+# Polkascan is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Polkascan is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Polkascan. If not, see <http://www.gnu.org/licenses/>.
+#
+#  ss58.py
+
+""" SS58 is a simple address format designed for Substrate based chains.
+    Encoding/decoding according to specification on https://wiki.parity.io/External-Address-Format-(SS58)
+
+"""
+import base58
+from hashlib import blake2b
+
+from scalecodec import ScaleBytes
+from scalecodec.types import U8, U16, U32, U64
+
+
+def ss58_decode(address, valid_address_type=None):
+    checksum_prefix = b'SS58PRE'
+
+    ss58_format = base58.b58decode(address)
+
+    if valid_address_type and ss58_format[0] != valid_address_type:
+        raise ValueError("Invalid Address type")
+
+    # Determine checksum length according to length of address string
+    if len(ss58_format) in [3, 4, 6, 10]:
+        checksum_length = 1
+    elif len(ss58_format) in [5, 7, 11, 35]:
+        checksum_length = 2
+    elif len(ss58_format) in [8, 12]:
+        checksum_length = 3
+    elif len(ss58_format) in [9, 13]:
+        checksum_length = 4
+    elif len(ss58_format) in [14]:
+        checksum_length = 5
+    elif len(ss58_format) in [15]:
+        checksum_length = 6
+    elif len(ss58_format) in [16]:
+        checksum_length = 7
+    elif len(ss58_format) in [17]:
+        checksum_length = 8
+    else:
+        raise ValueError("Invalid address length")
+
+    checksum = blake2b(checksum_prefix + ss58_format[0:-checksum_length]).digest()
+
+    if checksum[0:checksum_length] != ss58_format[-checksum_length:]:
+        raise ValueError("Invalid checksum")
+
+    return ss58_format[1:len(ss58_format)-checksum_length].hex()
+
+
+def ss58_encode(address, address_type=42):
+    checksum_prefix = b'SS58PRE'
+
+    if type(address) is bytes or type(address) is bytearray:
+        address_bytes = address
+    else:
+        address_bytes = bytes.fromhex(address)
+
+    if len(address_bytes) == 32:
+        # Checksum size is 2 bytes for public key
+        checksum_length = 2
+    elif len(address_bytes) in [1, 2, 4, 8]:
+        # Checksum size is 1 byte for account index
+        checksum_length = 1
+    else:
+        raise ValueError("Invalid length for address")
+
+    address_format = bytes([address_type]) + address_bytes
+    checksum = blake2b(checksum_prefix + address_format).digest()
+
+    return base58.b58encode(address_format + checksum[:checksum_length]).decode()
+
+
+def ss58_encode_account_index(account_index, address_type=42):
+
+    if 0 <= account_index <= 2**8 - 1:
+        account_idx_encoder = U8()
+    elif 2**8 <= account_index <= 2**16 - 1:
+        account_idx_encoder = U16()
+    elif 2**16 <= account_index <= 2**32 - 1:
+        account_idx_encoder = U32()
+    elif 2**32 <= account_index <= 2**64 - 1:
+        account_idx_encoder = U64()
+    else:
+        raise ValueError("Value too large for an account index")
+
+    return ss58_encode(account_idx_encoder.encode(account_index).data, address_type)
+
+
+def ss58_decode_account_index(address, valid_address_type=None):
+
+    account_index_bytes = ss58_decode(address, valid_address_type)
+
+    if len(account_index_bytes) == 2:
+        return U8(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    if len(account_index_bytes) == 4:
+        return U16(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    if len(account_index_bytes) == 8:
+        return U32(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    if len(account_index_bytes) == 16:
+        return U64(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    else:
+        raise ValueError("Invalid account index length")
+
+
+
+
+
+
+
+

Functions

+
+
+def ss58_decode(address, valid_address_type=None) +
+
+
+
+ +Expand source code + +
def ss58_decode(address, valid_address_type=None):
+    checksum_prefix = b'SS58PRE'
+
+    ss58_format = base58.b58decode(address)
+
+    if valid_address_type and ss58_format[0] != valid_address_type:
+        raise ValueError("Invalid Address type")
+
+    # Determine checksum length according to length of address string
+    if len(ss58_format) in [3, 4, 6, 10]:
+        checksum_length = 1
+    elif len(ss58_format) in [5, 7, 11, 35]:
+        checksum_length = 2
+    elif len(ss58_format) in [8, 12]:
+        checksum_length = 3
+    elif len(ss58_format) in [9, 13]:
+        checksum_length = 4
+    elif len(ss58_format) in [14]:
+        checksum_length = 5
+    elif len(ss58_format) in [15]:
+        checksum_length = 6
+    elif len(ss58_format) in [16]:
+        checksum_length = 7
+    elif len(ss58_format) in [17]:
+        checksum_length = 8
+    else:
+        raise ValueError("Invalid address length")
+
+    checksum = blake2b(checksum_prefix + ss58_format[0:-checksum_length]).digest()
+
+    if checksum[0:checksum_length] != ss58_format[-checksum_length:]:
+        raise ValueError("Invalid checksum")
+
+    return ss58_format[1:len(ss58_format)-checksum_length].hex()
+
+
+
+def ss58_decode_account_index(address, valid_address_type=None) +
+
+
+
+ +Expand source code + +
def ss58_decode_account_index(address, valid_address_type=None):
+
+    account_index_bytes = ss58_decode(address, valid_address_type)
+
+    if len(account_index_bytes) == 2:
+        return U8(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    if len(account_index_bytes) == 4:
+        return U16(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    if len(account_index_bytes) == 8:
+        return U32(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    if len(account_index_bytes) == 16:
+        return U64(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    else:
+        raise ValueError("Invalid account index length")
+
+
+
+def ss58_encode(address, address_type=42) +
+
+
+
+ +Expand source code + +
def ss58_encode(address, address_type=42):
+    checksum_prefix = b'SS58PRE'
+
+    if type(address) is bytes or type(address) is bytearray:
+        address_bytes = address
+    else:
+        address_bytes = bytes.fromhex(address)
+
+    if len(address_bytes) == 32:
+        # Checksum size is 2 bytes for public key
+        checksum_length = 2
+    elif len(address_bytes) in [1, 2, 4, 8]:
+        # Checksum size is 1 byte for account index
+        checksum_length = 1
+    else:
+        raise ValueError("Invalid length for address")
+
+    address_format = bytes([address_type]) + address_bytes
+    checksum = blake2b(checksum_prefix + address_format).digest()
+
+    return base58.b58encode(address_format + checksum[:checksum_length]).decode()
+
+
+
+def ss58_encode_account_index(account_index, address_type=42) +
+
+
+
+ +Expand source code + +
def ss58_encode_account_index(account_index, address_type=42):
+
+    if 0 <= account_index <= 2**8 - 1:
+        account_idx_encoder = U8()
+    elif 2**8 <= account_index <= 2**16 - 1:
+        account_idx_encoder = U16()
+    elif 2**16 <= account_index <= 2**32 - 1:
+        account_idx_encoder = U32()
+    elif 2**32 <= account_index <= 2**64 - 1:
+        account_idx_encoder = U64()
+    else:
+        raise ValueError("Value too large for an account index")
+
+    return ss58_encode(account_idx_encoder.encode(account_index).data, address_type)
+
+
+
+
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/py-scale-codec/requirements.txt b/py-scale-codec/requirements.txt new file mode 100644 index 00000000..a63375db --- /dev/null +++ b/py-scale-codec/requirements.txt @@ -0,0 +1,10 @@ +base58==2.0.1 +atomicwrites==1.4.0 +attrs==20.2.0 +coverage==5.3 +more-itertools==8.5.0 +pluggy==0.13.1 +py==1.9.0 +pytest==6.1.1 +requests==2.24.0 +six==1.15.0 diff --git a/py-scale-codec/scalecodec/__init__.py b/py-scale-codec/scalecodec/__init__.py new file mode 100644 index 00000000..45994b93 --- /dev/null +++ b/py-scale-codec/scalecodec/__init__.py @@ -0,0 +1,20 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# TODO temp import all to make sure types classes are registered with RuntimeConfiguration. +# TODO implemented type mapping registry per spec version id (/runtime) +from .types import * +from .block import * diff --git a/py-scale-codec/scalecodec/base.py b/py-scale-codec/scalecodec/base.py new file mode 100644 index 00000000..d9c110c0 --- /dev/null +++ b/py-scale-codec/scalecodec/base.py @@ -0,0 +1,372 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import re +from abc import ABC, abstractmethod + +from scalecodec.exceptions import RemainingScaleBytesNotEmptyException, InvalidScaleTypeValueException + + +class Singleton(type): + _instances = {} + + def __call__(cls, *args, **kwargs): + if cls not in cls._instances: + cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) + return cls._instances[cls] + + +class RuntimeConfiguration(metaclass=Singleton): + + @classmethod + def all_subclasses(cls, class_): + return set(class_.__subclasses__()).union( + [s for c in class_.__subclasses__() for s in cls.all_subclasses(c)]) + + def __init__(self): + self.type_registry = {} + self.clear_type_registry() + self.active_spec_version_id = None + + def get_decoder_class(self, type_string, spec_version_id='default'): + + decoder_class = self.type_registry.get('types', {}).get(type_string.lower(), None) + + if not decoder_class: + + # Type string containg subtype + if type_string[-1:] == '>': + + # Extract sub types + type_parts = re.match(r'^([^<]*)<(.+)>$', type_string) + + if type_parts: + type_parts = type_parts.groups() + + if type_parts: + # Create dynamic class for Part1 based on Part1 and set class variable Part2 as sub_type + base_class = self.type_registry.get('types', {}).get(type_parts[0].lower(), None) + if base_class: + decoder_class = type(type_string, (base_class,), {'sub_type': type_parts[1]}) + + # Custom tuples + elif type_string != '()' and type_string[0] == '(' and type_string[-1] == ')': + + decoder_class = type(type_string, (RuntimeConfiguration().get_decoder_class('struct'),), { + 'type_string': type_string + }) + + decoder_class.build_type_mapping() + + elif type_string[0] == '[' and type_string[-1] == ']': + type_parts = re.match(r'^\[([A-Za-z0-9]+); ([0-9]+)\]$', type_string) + + if type_parts: + type_parts = type_parts.groups() + + if type_parts: + # Create dynamic class for e.g. [u8; 4] resulting in array of u8 with 4 elements + decoder_class = type(type_string, (RuntimeConfiguration().get_decoder_class('FixedLengthArray'),), { + 'sub_type': type_parts[0], + 'element_count': int(type_parts[1]) + }) + + return decoder_class + + def clear_type_registry(self): + self.type_registry = {'types': {cls.type_string.lower(): cls for cls in self.all_subclasses(ScaleDecoder) if + cls.type_string}} + self.type_registry['types'].update({cls.__name__.lower(): cls for cls in self.all_subclasses(ScaleDecoder)}) + + def update_type_registry_types(self, types_dict): + from scalecodec.types import Enum, Struct, Set + + for type_string, decoder_class_data in types_dict.items(): + + if type(decoder_class_data) == dict: + + # Create dynamic decoder class + if decoder_class_data['type'] == 'struct': + + decoder_class = type(type_string, (Struct,), {'type_mapping': decoder_class_data['type_mapping']}) + + elif decoder_class_data['type'] == 'enum': + + decoder_class = type(type_string, (Enum,), { + 'value_list': decoder_class_data.get('value_list'), + 'type_mapping': decoder_class_data.get('type_mapping') + }) + + elif decoder_class_data['type'] == 'set': + + decoder_class = type(type_string, (Set,), { + 'value_list': decoder_class_data.get('value_list'), + 'value_type': decoder_class_data.get('value_type', 'u64') + }) + + else: + raise NotImplementedError("Dynamic decoding type '{}' not supported".format( + decoder_class_data['type']) + ) + else: + decoder_class = self.get_decoder_class(decoder_class_data) + + self.type_registry['types'][type_string.lower()] = decoder_class + + def update_type_registry(self, type_registry): + + # Set runtime ID if set + self.active_spec_version_id = type_registry.get('runtime_id') + + # Set versioning + if 'versioning' in type_registry: + self.type_registry['versioning'] = type_registry.get('versioning') + + # Update types + if 'types' in type_registry: + self.update_type_registry_types(type_registry.get('types')) + + def set_active_spec_version_id(self, spec_version_id): + + if spec_version_id != self.active_spec_version_id: + + self.active_spec_version_id = spec_version_id + + # Updated type registry with versioned types + for versioning_item in self.type_registry.get('versioning', []): + # Check if versioning item is in current version range + if versioning_item['runtime_range'][0] <= spec_version_id and \ + (not versioning_item['runtime_range'][1] or versioning_item['runtime_range'][1] >= spec_version_id): + # Update types in type registry + self.update_type_registry_types(versioning_item['types']) + + +class ScaleBytes: + + def __init__(self, data): + self.offset = 0 + + if type(data) is bytearray: + self.data = data + elif type(data) is bytes: + self.data = bytearray(data) + elif type(data) is str and data[0:2] == '0x': + self.data = bytearray.fromhex(data[2:]) + else: + raise ValueError("Provided data is not in supported format: provided '{}'".format(type(data))) + + self.length = len(self.data) + + def get_next_bytes(self, length): + data = self.data[self.offset:self.offset + length] + self.offset += length + return data + + def get_remaining_bytes(self): + data = self.data[self.offset:] + self.offset = self.length + return data + + def get_remaining_length(self): + return self.length - self.offset + + def reset(self): + self.offset = 0 + + def __str__(self): + return "0x{}".format(self.data.hex()) + + def __add__(self, data): + + if type(data) == ScaleBytes: + return ScaleBytes(self.data + data.data) + + if type(data) == bytes: + data = bytearray(data) + elif type(data) == str and data[0:2] == '0x': + data = bytearray.fromhex(data[2:]) + + if type(data) == bytearray: + return ScaleBytes(self.data + data) + + +class ScaleDecoder(ABC): + + type_string = None + + type_mapping = None + + debug = False + + sub_type = None + + PRIMITIVES = ('bool', 'u8', 'u16', 'u32', 'u64', 'u128', 'u256', 'i8', 'i16', 'i32', 'i64', 'i128', 'i256', 'h160', + 'h256', 'h512', '[u8; 4]', '[u8; 4]', '[u8; 8]', '[u8; 12]', '[u8; 16]', '[u8; 32]', '&[u8]') + + def __init__(self, data, sub_type=None): + + if sub_type: + self.sub_type = sub_type + + if self.type_mapping is None and self.type_string: + self.build_type_mapping() + + if data: + assert(type(data) == ScaleBytes) + + self.data = data + self.raw_value = '' + self.value = None + + @classmethod + def build_type_mapping(cls): + + if cls.type_string and cls.type_string[0] == '(' and cls.type_string[-1] == ')': + type_mapping = () + + tuple_contents = cls.type_string[1:-1] + + # replace subtype types + sub_types = re.search(r'([A-Za-z]+[<][^>]*[>])', tuple_contents) + if sub_types: + sub_types = sub_types.groups() + for sub_type in sub_types: + tuple_contents = tuple_contents.replace(sub_type, sub_type.replace(',', '|')) + + n = 1 + for struct_element in tuple_contents.split(','): + type_mapping += (('col{}'.format(n), struct_element.strip().replace('|', ',')),) + n += 1 + + cls.type_mapping = type_mapping + + def get_next_bytes(self, length): + data = self.data.get_next_bytes(length) + self.raw_value += data.hex() + return data + + def get_next_u8(self): + return int.from_bytes(self.get_next_bytes(1), byteorder='little') + + def get_next_bool(self): + data = self.get_next_bytes(1) + if data not in [b'\x00', b'\x01']: + raise InvalidScaleTypeValueException('Invalid value for datatype "bool"') + return data == b'\x01' + + def get_remaining_bytes(self): + data = self.data.get_remaining_bytes() + self.raw_value += data.hex() + return data + + @abstractmethod + def process(self): + raise NotImplementedError + + def decode(self, check_remaining=True): + self.value = self.process() + + if check_remaining and self.data.offset < self.data.length: + raise RemainingScaleBytesNotEmptyException('Current offset: {} / length: {}'.format(self.data.offset, self.data.length)) + + if self.data.offset > self.data.length: + raise RemainingScaleBytesNotEmptyException( + 'No more bytes available (offset: {} / length: {})'.format(self.data.offset, self.data.length)) + + return self.value + + def __str__(self): + return str(self.value) or '' + + def encode(self, value): + self.value = value + self.data = self.process_encode(value) + return self.data + + def process_encode(self, value): + raise NotImplementedError("Encoding not implemented for this ScaleType") + + @classmethod + def get_decoder_class(cls, type_string, data=None, **kwargs): + """ + :param type_string: + :param data: + :param kwargs: + :return: ScaleType + """ + + type_string = cls.convert_type(type_string) + + decoder_class = RuntimeConfiguration().get_decoder_class( + type_string.lower(), + spec_version_id=kwargs.get('spec_version_id', 'default') + ) + if decoder_class: + return decoder_class(data, **kwargs) + + raise NotImplementedError('Decoder class for "{}" not found'.format(type_string)) + + # TODO rename to decode_type (confusing when encoding is introduced) + def process_type(self, type_string, **kwargs): + obj = self.get_decoder_class(type_string, self.data, **kwargs) + obj.decode(check_remaining=False) + return obj + + def serialize(self): + return self.value + + # TODO convert to TYPE_ALIAS per class Address: TYPE_ALIAS = ('::Source',) + @classmethod + def convert_type(cls, name): + + name = re.sub(r'T::', "", name) + name = re.sub(r'', "", name) + name = re.sub(r'::', "", name) + name = re.sub(r'\n', "", name) + name = re.sub(r'(grandpa|session|slashing)::', "", name) + + if name == '()': + return "Null" + if name in ['Vec', '&[u8]']: + return "Bytes" + if name == '::Source': + return 'Address' + if name == 'Vec<::Source>': + return 'Vec
' + if name == '::Type': + return 'Compact' + if name == '::Type': + return 'Compact' + if name == '::Type': + return 'Compact' + if name == '::Inherent': + return 'InherentOfflineReport' + if name == 'RawAddress': + return 'Address' + + return name + + +# TODO move type_string and sub_type behaviour to this sub class +class ScaleType(ScaleDecoder, ABC): + + def __init__(self, data=None, sub_type=None, metadata=None): + self.metadata = metadata + if not data: + data = ScaleBytes(bytearray()) + super().__init__(data, sub_type) + + diff --git a/py-scale-codec/scalecodec/block.py b/py-scale-codec/scalecodec/block.py new file mode 100644 index 00000000..2524aad1 --- /dev/null +++ b/py-scale-codec/scalecodec/block.py @@ -0,0 +1,477 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from hashlib import blake2b +from collections import OrderedDict + +from scalecodec.base import ScaleDecoder, ScaleBytes +from scalecodec.types import FixedLengthArray +from scalecodec.metadata import MetadataDecoder +from scalecodec.types import Vec, Enum, Bytes, Struct + + +class ExtrinsicsDecoder(ScaleDecoder): + type_mapping = ( + ('extrinsic_length', 'Compact'), + ('version_info', 'u8'), + ('address', 'Address'), + ('signature', 'Signature'), + ('nonce', 'Compact'), + ('era', 'Era'), + ('call_index', '(u8,u8)'), + ) + + def __init__(self, data=None, sub_type=None, metadata: MetadataDecoder = None, address_type=42): + + assert (type(metadata) == MetadataDecoder) + + self.metadata = metadata + self.address_type = address_type + self.extrinsic_length = None + self.extrinsic_hash = None + self.version_info = None + self.contains_transaction = False + self.address = None + self.signature_version = None + self.signature = None + self.nonce = None + self.era = None + self.tip = None + self.call_index = None + self.call_module = None + self.call = None + self.call_args = None + self.params_raw = None + self.params = [] + super().__init__(data, sub_type) + + def generate_hash(self): + if self.contains_transaction: + return blake2b(self.data.data, digest_size=32).digest().hex() + + def process(self): + # TODO for all attributes + + attribute_types = OrderedDict(self.type_mapping) + + self.extrinsic_length = self.process_type('Compact').value + + if self.extrinsic_length != self.data.get_remaining_length(): + # Fallback for legacy version + self.extrinsic_length = None + self.data.reset() + + self.version_info = self.get_next_bytes(1).hex() + + self.contains_transaction = int(self.version_info, 16) >= 80 + + if self.version_info == '01' or self.version_info == '81': + + if self.contains_transaction: + self.address = self.process_type('Address') + + self.signature = self.process_type('Signature').value + + self.nonce = self.process_type(attribute_types['nonce']) + + self.era = self.process_type('Era') + + self.extrinsic_hash = self.generate_hash() + + self.call_index = self.get_next_bytes(2).hex() + + elif self.version_info == '02' or self.version_info == '82': + + if self.contains_transaction: + self.address = self.process_type('Address') + + self.signature = self.process_type('Signature').value + + self.era = self.process_type('Era') + + self.nonce = self.process_type('Compact') + + self.tip = self.process_type('Compact') + + self.extrinsic_hash = self.generate_hash() + + self.call_index = self.get_next_bytes(2).hex() + + elif self.version_info == '03' or self.version_info == '83': + + if self.contains_transaction: + self.address = self.process_type('Address') + + self.signature = self.process_type('Signature').value + + self.era = self.process_type('Era') + + self.nonce = self.process_type('Compact') + + self.tip = self.process_type('Compact') + + self.extrinsic_hash = self.generate_hash() + + self.call_index = self.get_next_bytes(2).hex() + + elif self.version_info == '04' or self.version_info == '84': + + if self.contains_transaction: + self.address = self.process_type('Address') + + multi_signature = self.process_type("MultiSignature") + + self.signature_version = multi_signature.index + + self.signature = multi_signature.get_enum_value() + + self.era = self.process_type('Era') + + self.nonce = self.process_type('Compact') + + self.tip = self.process_type('Compact') + + self.extrinsic_hash = self.generate_hash() + + self.call_index = self.get_next_bytes(2).hex() + else: + raise NotImplementedError('Extrinsics version "{}" is not implemented'.format(self.version_info)) + + if self.call_index: + + self.params_raw = self.data.data[self.data.offset:] + + # Decode params + + self.call = self.metadata.call_index[self.call_index][1] + self.call_module = self.metadata.call_index[self.call_index][0] + + for arg in self.call.args: + + arg_type_obj = self.process_type(arg.type, metadata=self.metadata) + + self.params.append({ + 'name': arg.name, + 'type': arg.type, + 'value': arg_type_obj.serialize(), + 'valueRaw': arg_type_obj.raw_value + }) + + result = { + 'valueRaw': self.raw_value, + 'extrinsic_length': self.extrinsic_length, + 'version_info': self.version_info, + } + + if self.contains_transaction: + result['account_length'] = self.address.account_length + result['account_id'] = self.address.account_id + result['account_index'] = self.address.account_index + result['account_idx'] = self.address.account_idx + result['signature_version'] = self.signature_version + result['signature'] = self.signature.replace('0x', '') + result['extrinsic_hash'] = self.extrinsic_hash + if self.call_index: + result['call_code'] = self.call_index + result['call_function'] = self.call.get_identifier() + result['call_module'] = self.call_module.get_identifier() + + if self.nonce: + result['nonce'] = self.nonce.value + + if self.era: + result['era'] = self.era.value + + if self.tip: + result['tip'] = self.tip.value + + result['params'] = self.params + + return result + + def process_encode(self, value): + + if 'call_index' in value: + self.call_index = value['call_index'] + + elif 'call_module' in value and 'call_function' in value: + # Look up call module from metadata + for call_index, (call_module, call) in self.metadata.call_index.items(): + if call_module.name.lower() == value['call_module'].lower() and call.name == value['call_function']: + self.call_index = call_index + self.call_module = call_module + self.call = call + break + + if not self.call_index: + raise ValueError('Specified call module and function not found in metadata') + + elif not self.call_module or not self.call: + raise ValueError('No call module and function specified') + + # Determine version (Fixed to V4 for now) + if 'account_id' in value: + self.version_info = '84' + self.contains_transaction = True + else: + self.version_info = '04' + self.contains_transaction = False + + if self.contains_transaction: + data = ScaleBytes('0x84') + + self.address = self.get_decoder_class('Address', metadata=self.metadata) + data += self.address.encode(value['account_id']) + + self.signature_version = self.get_decoder_class('U8', metadata=self.metadata) + data += self.signature_version.encode(value['signature_version']) + + self.signature = self.get_decoder_class('Signature', metadata=self.metadata) + data += self.signature.encode('0x{}'.format(value['signature'].replace('0x', ''))) + + self.era = self.get_decoder_class('Era', metadata=self.metadata) + data += self.era.encode(value['era']) + + self.nonce = self.get_decoder_class('Compact', metadata=self.metadata) + data += self.nonce.encode(value['nonce']) + + self.tip = self.get_decoder_class('Compact', metadata=self.metadata) + data += self.tip.encode(value['tip']) + + else: + data = ScaleBytes('0x04') + + data += ScaleBytes(bytearray.fromhex(self.call_index)) + + # Convert params to call_args TODO refactor + if not value.get('call_args') and value.get('params'): + value['call_args'] = {call_arg['name']: call_arg['value'] for call_arg in value.get('params')} + + # Encode call params + if len(self.call.args) > 0: + for arg in self.call.args: + if arg.name not in value.get('call_args', {}): + raise ValueError('Parameter \'{}\' not specified'.format(arg.name)) + else: + param_value = value['call_args'][arg.name] + + arg_obj = self.get_decoder_class(arg.type, metadata=self.metadata) + data += arg_obj.encode(param_value) + + # Wrap payload with a length Compact + length_obj = self.get_decoder_class('Compact') + data = length_obj.encode(data.length) + data + + return data + + +class ExtrinsicsBlock61181Decoder(ExtrinsicsDecoder): + type_mapping = ( + ('extrinsic_length', 'Compact'), + ('version_info', 'u8'), + ('address', 'Address'), + ('signature', 'Signature'), + ('nonce', 'u64'), + ('era', 'Era'), + ('call_index', '(u8,u8)'), + ) + + +class EventsDecoder(Vec): + type_string = 'Vec>' + + def __init__(self, data, metadata=None, **kwargs): + assert (not metadata or type(metadata) == MetadataDecoder) + + self.metadata = metadata + self.elements = [] + + super().__init__(data, metadata=metadata, **kwargs) + + def process(self): + element_count = self.process_type('Compact').value + + for i in range(0, element_count): + element = self.process_type('EventRecord', metadata=self.metadata) + element.value['event_idx'] = i + self.elements.append(element) + + return [e.value for e in self.elements] + + +class GenericEvent(ScaleDecoder): + + def __init__(self, data, sub_type=None, metadata: MetadataDecoder = None): + + assert (not metadata or type(metadata) == MetadataDecoder) + + self.metadata = metadata + + self.extrinsic_idx = None + self.type = None + self.params = [] + self.event = None + self.event_module = None + + super().__init__(data, sub_type) + + def process(self): + + self.type = self.get_next_bytes(2).hex() + + # Decode params + + self.event = self.metadata.event_index[self.type][1] + self.event_module = self.metadata.event_index[self.type][0] + + for arg_type in self.event.args: + arg_type_obj = self.process_type(arg_type) + + self.params.append({ + 'type': arg_type, + 'value': arg_type_obj.serialize(), + 'valueRaw': arg_type_obj.raw_value + }) + + return { + 'extrinsic_idx': self.extrinsic_idx, + 'type': self.type, + 'module_id': self.event_module.name, + 'event_id': self.event.name, + 'params': self.params, + } + + +class EventRecord(ScaleDecoder): + + def __init__(self, data, sub_type=None, metadata: MetadataDecoder = None): + + assert (not metadata or type(metadata) == MetadataDecoder) + + self.metadata = metadata + + self.phase = None + self.extrinsic_idx = None + self.type = None + self.params = [] + self.event = None + self.event_module = None + self.topics = [] + + super().__init__(data, sub_type) + + def process(self): + + # TODO Create option type + self.phase = self.get_next_u8() + + if self.phase == 0: + self.extrinsic_idx = self.process_type('U32').value + + self.type = self.get_next_bytes(2).hex() + + # Decode params + + self.event = self.metadata.event_index[self.type][1] + self.event_module = self.metadata.event_index[self.type][0] + + for arg_type in self.event.args: + arg_type_obj = self.process_type(arg_type) + + self.params.append({ + 'type': arg_type, + 'value': arg_type_obj.serialize(), + 'valueRaw': arg_type_obj.raw_value + }) + + # Topics introduced since MetadataV5 + if self.metadata.version and self.metadata.version.index >= 5: + self.topics = self.process_type('Vec').value + + return { + 'phase': self.phase, + 'extrinsic_idx': self.extrinsic_idx, + 'type': self.type, + 'module_id': self.event_module.name, + 'event_id': self.event.name, + 'params': self.params, + 'topics': self.topics + } + + +class Other(Bytes): + pass + + +class AuthoritiesChange(Vec): + type_string = 'Vec' + + def __init__(self, data, **kwargs): + + super().__init__(data, sub_type='AccountId', **kwargs) + + +class GenericConsensusEngineId(FixedLengthArray): + sub_type = 'u8' + element_count = 4 + + def process(self): + return self.get_next_bytes(self.element_count).decode() + + +class ChangesTrieRoot(Bytes): + pass + + +class SealV0(Struct): + type_string = '(u64, Signature)' + + type_mapping = (('slot', 'u64'), ('signature', 'Signature')) + + +class Consensus(Struct): + type_string = '(ConsensusEngineId, Vec)' + + type_mapping = (('engine', 'ConsensusEngineId'), ('data', 'HexBytes')) + + +class Seal(Struct): + type_string = '(ConsensusEngineId, Bytes)' + + type_mapping = (('engine', 'ConsensusEngineId'), ('data', 'HexBytes')) + + +class PreRuntime(Struct): + type_string = '(ConsensusEngineId, Bytes)' + + type_mapping = (('engine', 'ConsensusEngineId'), ('data', 'HexBytes')) + + +class LogDigest(Enum): + + value_list = ['Other', 'AuthoritiesChange', 'ChangesTrieRoot', 'SealV0', 'Consensus', 'Seal', 'PreRuntime'] + + def __init__(self, data, **kwargs): + self.log_type = None + self.index_value = None + super().__init__(data, **kwargs) + + def process(self): + self.index = int(self.get_next_bytes(1).hex()) + self.index_value = self.value_list[self.index] + self.log_type = self.process_type(self.value_list[self.index]) + + return {'type': self.log_type.type_string, 'value': self.log_type.value} + diff --git a/py-scale-codec/scalecodec/exceptions.py b/py-scale-codec/scalecodec/exceptions.py new file mode 100644 index 00000000..3b4b4527 --- /dev/null +++ b/py-scale-codec/scalecodec/exceptions.py @@ -0,0 +1,23 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +class RemainingScaleBytesNotEmptyException(Exception): + pass + + +class InvalidScaleTypeValueException(Exception): + pass diff --git a/py-scale-codec/scalecodec/metadata.py b/py-scale-codec/scalecodec/metadata.py new file mode 100644 index 00000000..c9dddd5f --- /dev/null +++ b/py-scale-codec/scalecodec/metadata.py @@ -0,0 +1,1714 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from scalecodec.base import ScaleDecoder, ScaleType + + +class MetadataDecoder(ScaleDecoder): + + def __init__(self, data, **kwargs): + self.version = None + self.metadata = None + self.call_index = None + self.event_index = None + super().__init__(data, **kwargs) + + def process(self): + magic_bytes = self.get_next_bytes(4) + + if magic_bytes == b'meta': + + self.version = self.process_type('Enum', value_list=[ + "MetadataV0Decoder", + "MetadataV1Decoder", + "MetadataV2Decoder", + "MetadataV3Decoder", + "MetadataV4Decoder", + "MetadataV5Decoder", + "MetadataV6Decoder", + "MetadataV7Decoder", + "MetadataV8Decoder", + "MetadataV9Decoder", + "MetadataV10Decoder", + "MetadataV11Decoder", + "MetadataV12Decoder" + ]) + + self.metadata = self.process_type(self.version.value) + + # TODO remove duplicate reference? + self.call_index = self.metadata.call_index + self.event_index = self.metadata.event_index + + return self.metadata.value + + else: + # Fall back to version unaware legacy MetadataV0 + self.data.reset() + + self.metadata = self.process_type('MetadataV0Decoder') + + # TODO remove duplicate reference? + self.call_index = self.metadata.call_index + self.event_index = self.metadata.event_index + + return self.metadata.value + + +class MetadataV4Decoder(ScaleDecoder): + + def __init__(self, data, sub_type=None): + self.version = None + self.modules = [] + self.call_index = {} + self.event_index = {} + + super().__init__(data, sub_type) + + def process(self): + result_data = { + "magicNumber": 1635018093, # struct.unpack('').elements + + # Build call and event index + + call_module_index = 0 + event_module_index = 0 + + for module in self.modules: + if module.calls is not None: + for call_index, call in enumerate(module.calls): + call.lookup = "{:02x}{:02x}".format(call_module_index, call_index) + self.call_index[call.lookup] = (module, call) + call_module_index += 1 + + if module.events is not None: + for event_index, event in enumerate(module.events): + event.lookup = "{:02x}{:02x}".format(event_module_index, event_index) + self.event_index[event.lookup] = (module, event) + event_module_index += 1 + + result_data["metadata"]["MetadataV4"]["modules"] = [m.value for m in self.modules] + + return result_data + + +class MetadataV4Module(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.prefix = None + self.call_index = None + self.has_storage = False + self.storage = None + self.has_calls = False + self.calls = None + self.has_events = False + self.events = None + self.constants = [] + self.errors = [] + super().__init__(data, sub_type, **kwargs) + + def get_identifier(self): + return self.name.lower() + + def process(self): + + self.name = self.process_type('Bytes').value + self.prefix = self.process_type('Bytes').value + + result = { + "name": self.name, + "prefix": self.prefix, + "storage": self.storage, + "calls": self.calls, + "events": self.events, + "constants": self.constants, + "errors": self.errors + } + + self.has_storage = self.process_type('bool').value + + if self.has_storage: + # TODO convert to Option> + self.storage = self.process_type('Vec').elements + result["storage"] = [s.value for s in self.storage] + + self.has_calls = self.process_type('bool').value + + if self.has_calls: + # TODO convert to Option> + self.calls = self.process_type('Vec').elements + result["calls"] = [s.value for s in self.calls] + + self.has_events = self.process_type('bool').value + + if self.has_events: + # TODO convert to Option> + self.events = self.process_type('Vec').elements + result["events"] = [s.value for s in self.events] + + return result + + +class MetadataV4ModuleStorage(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.modifier = None + self.type = {} + self.fallback = None + self.docs = [] + self.hasher = None + super().__init__(data, sub_type, **kwargs) + + def process(self): + + self.name = self.process_type('Bytes').value + self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value + + storage_function_type = self.process_type('Enum', value_list=["PlainType", "MapType", "DoubleMapType"]).value + + if storage_function_type == 'MapType': + self.hasher = self.process_type('StorageHasher') + self.type = { + "MapType": { + "hasher": self.hasher.value, + "key": self.convert_type(self.process_type('Bytes').value), + "value": self.convert_type(self.process_type('Bytes').value), + "isLinked": self.process_type('bool').value + } + } + elif storage_function_type == 'DoubleMapType': + self.hasher = self.process_type('StorageHasher') + self.type = { + "DoubleMapType": { + "hasher": self.hasher.value, + "key1": self.convert_type(self.process_type('Bytes').value), + "key2": self.convert_type(self.process_type('Bytes').value), + "value": self.convert_type(self.process_type('Bytes').value), + "key2Hasher": self.process_type('Bytes').value + } + } + + elif storage_function_type == 'PlainType': + self.type = { + "PlainType": self.convert_type(self.process_type('Bytes').value) + } + + self.fallback = self.process_type('HexBytes').value + + self.docs = self.process_type('Vec').value + + return { + "name": self.name, + "modifier": self.modifier, + "type": self.type, + "fallback": self.fallback, + "docs": self.docs + } + + +class MetadataV5Decoder(ScaleDecoder): + + def __init__(self, data, sub_type=None): + self.version = None + self.modules = [] + self.call_index = {} + self.event_index = {} + + super().__init__(data, sub_type) + + def process(self): + result_data = { + "magicNumber": 1635018093, # struct.unpack('').elements + + # Build call and event index + + call_module_index = 0 + event_module_index = 0 + + for module in self.modules: + if module.calls is not None: + for call_index, call in enumerate(module.calls): + call.lookup = "{:02x}{:02x}".format(call_module_index, call_index) + self.call_index[call.lookup] = (module, call) + call_module_index += 1 + + if module.events is not None: + for event_index, event in enumerate(module.events): + event.lookup = "{:02x}{:02x}".format(event_module_index, event_index) + self.event_index[event.lookup] = (module, event) + event_module_index += 1 + + result_data["metadata"]["MetadataV5"]["modules"] = [m.value for m in self.modules] + + return result_data + + +class MetadataV5Module(ScaleType): + + def __init__(self, data, sub_type=None): + self.name = None + self.prefix = None + self.call_index = None + self.has_storage = False + self.storage = None + self.has_calls = False + self.calls = None + self.has_events = False + self.events = None + self.constants = [] + self.errors = [] + super().__init__(data, sub_type) + + def get_identifier(self): + return self.name.lower() + + def process(self): + + self.name = self.process_type('Bytes').value + self.prefix = self.process_type('Bytes').value + + result = { + "name": self.name, + "prefix": self.prefix, + "storage": self.storage, + "calls": self.calls, + "events": self.events, + "constants": self.constants, + "errors": self.errors + } + + self.has_storage = self.process_type('bool').value + + if self.has_storage: + # TODO convert to Option> + self.storage = self.process_type('Vec').elements + result["storage"] = [s.value for s in self.storage] + + self.has_calls = self.process_type('bool').value + + if self.has_calls: + # TODO convert to Option> + self.calls = self.process_type('Vec').elements + result["calls"] = [s.value for s in self.calls] + + self.has_events = self.process_type('bool').value + + if self.has_events: + # TODO convert to Option> + self.events = self.process_type('Vec').elements + result["events"] = [s.value for s in self.events] + + return result + + +class MetadataV5ModuleStorage(ScaleType): + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.modifier = None + self.type = {} + self.fallback = None + self.docs = [] + self.hasher = None + super().__init__(data, sub_type, **kwargs) + + def process(self): + + self.name = self.process_type('Bytes').value + self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value + + storage_function_type = self.process_type('Enum', value_list=["PlainType", "MapType", "DoubleMapType"]).value + + if storage_function_type == 'MapType': + self.hasher = self.process_type('StorageHasher') + self.type = { + "MapType": { + "hasher": self.hasher.value, + "key": self.convert_type(self.process_type('Bytes').value), + "value": self.convert_type(self.process_type('Bytes').value), + "isLinked": self.process_type('bool').value + } + } + elif storage_function_type == 'DoubleMapType': + self.hasher = self.process_type('StorageHasher') + self.type = { + "DoubleMapType": { + "hasher": self.hasher.value, + "key1": self.convert_type(self.process_type('Bytes').value), + "key2": self.convert_type(self.process_type('Bytes').value), + "value": self.convert_type(self.process_type('Bytes').value), + "key2Hasher": self.process_type('StorageHasher').value + } + } + + elif storage_function_type == 'PlainType': + self.type = { + "PlainType": self.convert_type(self.process_type('Bytes').value) + } + + self.fallback = self.process_type('HexBytes').value + + self.docs = self.process_type('Vec').value + + return { + "name": self.name, + "modifier": self.modifier, + "type": self.type, + "fallback": self.fallback, + "docs": self.docs + } + + +class MetadataV6Decoder(ScaleDecoder): + + def __init__(self, data, sub_type=None): + self.version = None + self.modules = [] + self.call_index = {} + self.event_index = {} + + super().__init__(data, sub_type) + + def process(self): + result_data = { + "magicNumber": 1635018093, # struct.unpack('').elements + + # Build call and event index + + call_module_index = 0 + event_module_index = 0 + + for module in self.modules: + if module.calls is not None: + for call_index, call in enumerate(module.calls): + call.lookup = "{:02x}{:02x}".format(call_module_index, call_index) + self.call_index[call.lookup] = (module, call) + call_module_index += 1 + + if module.events is not None: + for event_index, event in enumerate(module.events): + event.lookup = "{:02x}{:02x}".format(event_module_index, event_index) + self.event_index[event.lookup] = (module, event) + event_module_index += 1 + + result_data["metadata"]["MetadataV6"]["modules"] = [m.value for m in self.modules] + + return result_data + + +class MetadataV6Module(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.prefix = None + self.call_index = None + self.has_storage = False + self.storage = None + self.has_calls = False + self.calls = None + self.has_events = False + self.events = None + self.constants = [] + self.errors = [] + super().__init__(data, sub_type, **kwargs) + + def get_identifier(self): + return self.name.lower() + + def process(self): + + self.name = self.process_type('Bytes').value + self.prefix = self.process_type('Bytes').value + + result = { + "name": self.name, + "prefix": self.prefix, + "storage": self.storage, + "calls": self.calls, + "events": self.events, + "constants": self.constants, + "errors": self.errors + } + + self.has_storage = self.process_type('bool').value + + if self.has_storage: + # TODO convert to Option> + self.storage = self.process_type('Vec').elements + result["storage"] = [s.value for s in self.storage] + + self.has_calls = self.process_type('bool').value + + if self.has_calls: + # TODO convert to Option> + self.calls = self.process_type('Vec').elements + result["calls"] = [s.value for s in self.calls] + + self.has_events = self.process_type('bool').value + + if self.has_events: + # TODO convert to Option> + self.events = self.process_type('Vec').elements + result["events"] = [s.value for s in self.events] + + self.constants = self.process_type('Vec').elements + result["constants"] = [s.value for s in self.constants] + + return result + + +class MetadataV6ModuleStorage(MetadataV5ModuleStorage): + pass + + +class MetadataV6ModuleConstants(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.type = None + self.constant_value = None + self.docs = [] + super().__init__(data, sub_type, **kwargs) + + def process(self): + + self.name = self.process_type('Bytes').value + self.type = self.convert_type(self.process_type('Bytes').value) + self.constant_value = self.process_type('HexBytes').value + self.docs = self.process_type('Vec').value + + return { + "name": self.name, + "type": self.type, + "value": self.constant_value, + "docs": self.docs + } + + +class MetadataV7Decoder(ScaleDecoder): + + def __init__(self, data, sub_type=None): + self.version = None + self.modules = [] + self.call_index = {} + self.event_index = {} + + super().__init__(data, sub_type) + + def process(self): + result_data = { + "magicNumber": 1635018093, # struct.unpack('').elements + + # Build call and event index + + call_module_index = 0 + event_module_index = 0 + + for module in self.modules: + if module.calls is not None: + for call_index, call in enumerate(module.calls): + call.lookup = "{:02x}{:02x}".format(call_module_index, call_index) + self.call_index[call.lookup] = (module, call) + call_module_index += 1 + + if module.events is not None: + for event_index, event in enumerate(module.events): + event.lookup = "{:02x}{:02x}".format(event_module_index, event_index) + self.event_index[event.lookup] = (module, event) + event_module_index += 1 + + result_data["metadata"]["MetadataV7"]["modules"] = [m.value for m in self.modules] + + return result_data + + +class MetadataV7Module(MetadataV6Module): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.prefix = None + self.call_index = None + self.has_storage = False + self.storage = None + self.has_calls = False + self.calls = None + self.has_events = False + self.events = None + self.constants = [] + self.errors = [] + super().__init__(data, sub_type, **kwargs) + + def process(self): + + self.name = self.process_type('Bytes').value + + result = { + "name": self.name, + "prefix": self.prefix, + "storage": self.storage, + "calls": self.calls, + "events": self.events, + "constants": self.constants, + "errors": self.errors + } + + self.has_storage = self.process_type('bool').value + + if self.has_storage: + # TODO convert to Option> + self.storage = self.process_type('MetadataV7ModuleStorage') + result["storage"] = self.storage.value + # TODO moved to storage, change data model + self.prefix = self.storage.prefix + result["prefix"] = self.prefix + + self.has_calls = self.process_type('bool').value + + if self.has_calls: + # TODO convert to Option> + self.calls = self.process_type('Vec').elements + result["calls"] = [s.value for s in self.calls] + + self.has_events = self.process_type('bool').value + + if self.has_events: + # TODO convert to Option> + self.events = self.process_type('Vec').elements + result["events"] = [s.value for s in self.events] + + self.constants = self.process_type('Vec').elements + result["constants"] = [s.value for s in self.constants] + + return result + + +class MetadataV7ModuleStorage(MetadataV6ModuleStorage): + + def __init__(self, data, sub_type=None, **kwargs): + self.prefix = None + self.items = [] + + super().__init__(data, sub_type, **kwargs) + + def process(self): + + self.prefix = self.process_type('Bytes').value + self.items = self.process_type('Vec').elements + + return { + "prefix": self.prefix, + "items": [s.value for s in self.items] + } + + +class MetadataV7ModuleStorageEntry(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.modifier = None + self.type = {} + self.fallback = None + self.docs = [] + self.hasher = None + super().__init__(data, sub_type, **kwargs) + + def process(self): + + self.name = self.process_type('Bytes').value + self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value + + storage_function_type = self.process_type('Enum', value_list=["PlainType", "MapType", "DoubleMapType"]).value + + if storage_function_type == 'MapType': + self.hasher = self.process_type('StorageHasher') + self.type = { + "MapType": { + "hasher": self.hasher.value, + "key": self.convert_type(self.process_type('Bytes').value), + "value": self.convert_type(self.process_type('Bytes').value), + "isLinked": self.process_type('bool').value + } + } + elif storage_function_type == 'DoubleMapType': + self.hasher = self.process_type('StorageHasher') + self.type = { + "DoubleMapType": { + "hasher": self.hasher.value, + "key1": self.convert_type(self.process_type('Bytes').value), + "key2": self.convert_type(self.process_type('Bytes').value), + "value": self.convert_type(self.process_type('Bytes').value), + "key2Hasher": self.process_type('StorageHasher').value + } + } + + elif storage_function_type == 'PlainType': + self.type = { + "PlainType": self.convert_type(self.process_type('Bytes').value) + } + + self.fallback = self.process_type('HexBytes').value + + self.docs = self.process_type('Vec').value + + return { + "name": self.name, + "modifier": self.modifier, + "type": self.type, + "fallback": self.fallback, + "docs": self.docs + } + + +class MetadataV7ModuleConstants(MetadataV6ModuleConstants): + pass + + +class MetadataV8Decoder(ScaleDecoder): + + def __init__(self, data, sub_type=None): + self.version = None + self.modules = [] + self.call_index = {} + self.event_index = {} + + super().__init__(data, sub_type) + + def process(self): + result_data = { + "magicNumber": 1635018093, # struct.unpack('').elements + + # Build call and event index + + call_module_index = 0 + event_module_index = 0 + + for module in self.modules: + if module.calls is not None: + for call_index, call in enumerate(module.calls): + call.lookup = "{:02x}{:02x}".format(call_module_index, call_index) + self.call_index[call.lookup] = (module, call) + call_module_index += 1 + + if module.events is not None: + for event_index, event in enumerate(module.events): + event.lookup = "{:02x}{:02x}".format(event_module_index, event_index) + self.event_index[event.lookup] = (module, event) + event_module_index += 1 + + result_data["metadata"]["MetadataV8"]["modules"] = [m.value for m in self.modules] + + return result_data + + +class MetadataV8Module(MetadataV6Module): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.prefix = None + self.call_index = None + self.has_storage = False + self.storage = None + self.has_calls = False + self.calls = None + self.has_events = False + self.events = None + self.constants = [] + self.errors = [] + super().__init__(data, sub_type, **kwargs) + + def process(self): + + self.name = self.process_type('Bytes').value + + result = { + "name": self.name, + "prefix": self.prefix, + "storage": self.storage, + "calls": self.calls, + "events": self.events, + "constants": self.constants, + "errors": self.errors + } + + self.has_storage = self.process_type('bool').value + + if self.has_storage: + # TODO convert to Option> + self.storage = self.process_type('MetadataV7ModuleStorage') + result["storage"] = self.storage.value + # TODO moved to storage, change data model + self.prefix = self.storage.prefix + result["prefix"] = self.prefix + + self.has_calls = self.process_type('bool').value + + if self.has_calls: + # TODO convert to Option> + self.calls = self.process_type('Vec').elements + result["calls"] = [s.value for s in self.calls] + + self.has_events = self.process_type('bool').value + + if self.has_events: + # TODO convert to Option> + self.events = self.process_type('Vec').elements + result["events"] = [s.value for s in self.events] + + self.constants = self.process_type('Vec').elements + result["constants"] = [s.value for s in self.constants] + + self.errors = self.process_type('Vec').elements + result["errors"] = [s.value for s in self.errors] + + return result + + +class MetadataModuleError(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.docs = [] + super().__init__(data, sub_type, **kwargs) + + def process(self): + + self.name = self.process_type('Bytes').value + self.docs = self.process_type('Vec').value + + return { + "name": self.name, + "docs": self.docs + } + + +class MetadataV9Decoder(ScaleDecoder): + + def __init__(self, data, sub_type=None): + self.version = None + self.modules = [] + self.call_index = {} + self.event_index = {} + + super().__init__(data, sub_type) + + def process(self): + result_data = { + "magicNumber": 1635018093, # struct.unpack('').elements + + # Build call and event index + + call_module_index = 0 + event_module_index = 0 + + for module in self.modules: + if module.calls is not None: + for call_index, call in enumerate(module.calls): + call.lookup = "{:02x}{:02x}".format(call_module_index, call_index) + self.call_index[call.lookup] = (module, call) + call_module_index += 1 + + if module.events is not None: + for event_index, event in enumerate(module.events): + event.lookup = "{:02x}{:02x}".format(event_module_index, event_index) + self.event_index[event.lookup] = (module, event) + event_module_index += 1 + + result_data["metadata"]["MetadataV9"]["modules"] = [m.value for m in self.modules] + + return result_data + + +class MetadataV10Decoder(ScaleDecoder): + + def __init__(self, data, sub_type=None): + self.version = None + self.modules = [] + self.call_index = {} + self.event_index = {} + + super().__init__(data, sub_type) + + def process(self): + result_data = { + "magicNumber": 1635018093, # struct.unpack('').elements + + # Build call and event index + + call_module_index = 0 + event_module_index = 0 + + for module in self.modules: + if module.calls is not None: + for call_index, call in enumerate(module.calls): + call.lookup = "{:02x}{:02x}".format(call_module_index, call_index) + self.call_index[call.lookup] = (module, call) + call_module_index += 1 + + if module.events is not None: + for event_index, event in enumerate(module.events): + event.lookup = "{:02x}{:02x}".format(event_module_index, event_index) + self.event_index[event.lookup] = (module, event) + event_module_index += 1 + + result_data["metadata"]["MetadataV10"]["modules"] = [m.value for m in self.modules] + + return result_data + + +class MetadataV11Decoder(ScaleDecoder): + + def __init__(self, data, sub_type=None): + self.version = None + self.modules = [] + self.call_index = {} + self.event_index = {} + + super().__init__(data, sub_type) + + def process(self): + result_data = { + "magicNumber": 1635018093, # struct.unpack('').elements + + # Build call and event index + + call_module_index = 0 + event_module_index = 0 + + for module in self.modules: + if module.calls is not None: + for call_index, call in enumerate(module.calls): + call.lookup = "{:02x}{:02x}".format(call_module_index, call_index) + self.call_index[call.lookup] = (module, call) + call_module_index += 1 + + if module.events is not None: + for event_index, event in enumerate(module.events): + event.lookup = "{:02x}{:02x}".format(event_module_index, event_index) + self.event_index[event.lookup] = (module, event) + event_module_index += 1 + + result_data["metadata"]["MetadataV11"]["modules"] = [m.value for m in self.modules] + result_data["metadata"]["MetadataV11"]["extrinsic"] = self.process_type("ExtrinsicMetadata").value + + return result_data + + +class MetadataV12Decoder(ScaleDecoder): + + def __init__(self, data, sub_type=None): + self.version = None + self.modules = [] + self.call_index = {} + self.event_index = {} + + super().__init__(data, sub_type) + + def process(self): + result_data = { + "magicNumber": 1635018093, # struct.unpack('').elements + + # Build call and event index + + for module in self.modules: + if module.calls is not None: + for call_index, call in enumerate(module.calls): + call.lookup = "{:02x}{:02x}".format(module.index, call_index) + self.call_index[call.lookup] = (module, call) + + if module.events is not None: + for event_index, event in enumerate(module.events): + event.lookup = "{:02x}{:02x}".format(module.index, event_index) + self.event_index[event.lookup] = (module, event) + + result_data["metadata"]["MetadataV12"]["modules"] = [m.value for m in self.modules] + result_data["metadata"]["MetadataV12"]["extrinsic"] = self.process_type("ExtrinsicMetadata").value + + return result_data + + +class MetadataV12Module(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.prefix = None + self.call_index = None + self.has_storage = False + self.storage = None + self.has_calls = False + self.calls = None + self.has_events = False + self.events = None + self.constants = [] + self.errors = [] + self.index = None + super().__init__(data, sub_type, **kwargs) + + def get_identifier(self): + return self.name.lower() + + def process(self): + + self.name = self.process_type('Bytes').value + + result = { + "name": self.name, + "prefix": self.prefix, + "storage": self.storage, + "calls": self.calls, + "events": self.events, + "constants": self.constants, + "errors": self.errors, + "index": self.index + } + + self.has_storage = self.process_type('bool').value + + if self.has_storage: + # TODO convert to Option> + self.storage = self.process_type('MetadataV7ModuleStorage') + result["storage"] = self.storage.value + # TODO moved to storage, change data model + self.prefix = self.storage.prefix + result["prefix"] = self.prefix + + self.has_calls = self.process_type('bool').value + + if self.has_calls: + # TODO convert to Option> + self.calls = self.process_type('Vec').elements + result["calls"] = [s.value for s in self.calls] + + self.has_events = self.process_type('bool').value + + if self.has_events: + # TODO convert to Option> + self.events = self.process_type('Vec').elements + result["events"] = [s.value for s in self.events] + + self.constants = self.process_type('Vec').elements + result["constants"] = [s.value for s in self.constants] + + self.errors = self.process_type('Vec').elements + result["errors"] = [s.value for s in self.errors] + + self.index = self.process_type('u8').value + result["index"] = self.index + + return result + + +class MetadataV3Decoder(ScaleDecoder): + + def __init__(self, data, sub_type=None): + self.version = None + self.modules = [] + self.call_index = {} + self.event_index = {} + + super().__init__(data, sub_type) + + def process(self): + result_data = { + "magicNumber": 1635018093, # struct.unpack('').elements + + # Build call and event index + + call_module_index = 0 + event_module_index = 0 + + for module in self.modules: + if module.calls is not None: + for call_index, call in enumerate(module.calls): + call.lookup = "{:02x}{:02x}".format(call_module_index, call_index) + self.call_index[call.lookup] = (module, call) + call_module_index += 1 + + if module.events is not None: + for event_index, event in enumerate(module.events): + event.lookup = "{:02x}{:02x}".format(event_module_index, event_index) + self.event_index[event.lookup] = (module, event) + event_module_index += 1 + + result_data["metadata"]["MetadataV3"]["modules"] = [m.value for m in self.modules] + + return result_data + + +class MetadataV2Decoder(ScaleDecoder): + + def __init__(self, data, sub_type=None): + self.version = None + self.modules = [] + self.call_index = {} + self.event_index = {} + + super().__init__(data, sub_type) + + def process(self): + result_data = { + "magicNumber": 1635018093, # struct.unpack('').elements + + # Build call and event index + + call_module_index = 0 + event_module_index = 0 + + for module in self.modules: + if module.calls is not None: + for call_index, call in enumerate(module.calls): + call.lookup = "{:02x}{:02x}".format(call_module_index, call_index) + self.call_index[call.lookup] = (module, call) + call_module_index += 1 + + if module.events is not None: + for event_index, event in enumerate(module.events): + event.lookup = "{:02x}{:02x}".format(event_module_index, event_index) + self.event_index[event.lookup] = (module, event) + event_module_index += 1 + + result_data["metadata"]["MetadataV2"]["modules"] = [m.value for m in self.modules] + + return result_data + + +class MetadataV1Decoder(ScaleDecoder): + + def __init__(self, data, sub_type=None): + self.version = None + self.modules = [] + self.call_index = {} + self.event_index = {} + + super().__init__(data, sub_type) + + def process(self): + result_data = { + "magicNumber": 1635018093, # struct.unpack('').elements + + # Build call and event index + + call_module_index = 0 + event_module_index = 0 + + for module in self.modules: + if module.calls is not None: + for call_index, call in enumerate(module.calls): + call.lookup = "{:02x}{:02x}".format(call_module_index, call_index) + self.call_index[call.lookup] = (module, call) + call_module_index += 1 + + if module.events is not None: + for event_index, event in enumerate(module.events): + event.lookup = "{:02x}{:02x}".format(event_module_index, event_index) + self.event_index[event.lookup] = (module, event) + event_module_index += 1 + + result_data["metadata"]["MetadataV1"]["modules"] = [m.value for m in self.modules] + + return result_data + + +class MetadataV0Decoder(ScaleDecoder): + + def __init__(self, data, sub_type=None): + self.version = None + self.events_modules = [] + self.modules = [] + self.sections = [] + self.call_index = {} + self.event_index = {} + + super().__init__(data, sub_type) + + def process(self): + result_data = { + "metadata": { + "MetadataV0": { + "outerEvent": { + "name": self.process_type('Bytes').value, + "events": [] + }, + "modules": [], + "sections": [] + } + } + } + + self.events_modules = self.process_type('Vec').elements + + self.modules = self.process_type('Vec').elements + + # TODO why "Call" unused? + _ = self.process_type('Bytes').value + + self.sections = self.process_type('Vec').elements + + # Build call and event index + call_module_index = 0 + for module_index, module in enumerate(self.modules): + if module_index > 0 and (len(module.functions) > 0 or len(module.storage) > 0): + + for call_index, call in enumerate(module.functions): + call.lookup = "{:02x}{:02x}".format(call_module_index, call_index) + self.call_index[call.lookup] = (module, call) + + call_module_index += 1 + + for event_module_index, event_module in enumerate(self.events_modules): + for event_index, event in enumerate(event_module.events): + event.lookup = "{:02x}{:02x}".format(event_module_index, event_index) + self.event_index[event.lookup] = (event_module, event) + + result_data["metadata"]["MetadataV0"]["outerEvent"]["events"] = [e.value for e in self.events_modules] + result_data["metadata"]["MetadataV0"]["modules"] = [m.value for m in self.modules] + result_data["metadata"]["MetadataV0"]["sections"] = [s.value for s in self.sections] + + return result_data + + +class MetadataV0EventModule(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.events = None + super().__init__(data, sub_type, **kwargs) + + def process(self): + self.name = self.process_type('Bytes').value + self.events = self.process_type('Vec').elements + + return { + 'name': self.name, + 'events': [s.value for s in self.events] + } + + +class MetadataV0Event(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.args = [] + self.docs = [] + super().__init__(data, sub_type, **kwargs) + + def process(self): + self.name = self.process_type('Bytes').value + self.args = self.process_type('Vec').value + self.docs = self.process_type('Vec').value + + return { + "name": self.name, + "arguments": self.args, + "docs": self.docs + } + + +class MetadataV0Module(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.prefix = None + self.name = None + self.call_name = None + self.functions = [] + self.has_storage = False + self.storage_prefix = None + self.storage = [] + self.constants = [] + self.errors = [] + super().__init__(data, sub_type, **kwargs) + + # TODO move to version agnostic superclass MetadataModule + def get_identifier(self): + return self.prefix.lower() + + def process(self): + self.prefix = self.process_type('Bytes').value + self.name = self.process_type('Bytes').value + self.call_name = self.process_type('Bytes').value + + self.functions = self.process_type('Vec').elements + + result = { + "prefix": self.prefix, + "index": None, + "module": { + "name": self.name, + "call": { + "name": self.call_name, + "functions": [s.value for s in self.functions] + } + + }, + } + + self.has_storage = self.process_type('bool').value + + if self.has_storage: + self.storage_prefix = self.process_type('Bytes').value + self.storage = self.process_type('Vec').elements + + result["storage"] = { + "prefix": self.storage_prefix, + "functions": [s.value for s in self.storage] + } + + return result + + +class MetadataV0ModuleFunction(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.id = None + self.name = None + self.args = [] + self.docs = [] + super().__init__(data, sub_type, **kwargs) + + def get_identifier(self): + return self.name + + def process(self): + self.id = self.get_next_bytes(2).hex() + self.name = self.process_type('Bytes').value + self.args = self.process_type('Vec').elements + self.docs = self.process_type('Vec').value + + return { + "id": self.id, + "name": self.name, + "args": [s.value for s in self.args], + "docs": self.docs + } + + +class MetadataV0ModuleStorage(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.modifier = None + self.type = {} + self.fallback = None + self.docs = [] + super().__init__(data, sub_type, **kwargs) + + def process(self): + self.name = self.process_type('Bytes').value + self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value + + is_key_value = self.process_type('bool').value + + if is_key_value: + self.type = { + "MapType": { + "key": self.convert_type(self.process_type('Bytes').value), + "value": self.convert_type(self.process_type('Bytes').value)} + } + else: + self.type = { + "PlainType": self.convert_type(self.process_type('Bytes').value) + } + + self.fallback = self.process_type('HexBytes').value + + self.docs = self.process_type('Vec').value + + return { + "name": self.name, + "modifier": self.modifier, + "type": self.type, + "default": self.fallback, + "docs": self.docs + } + + +class MetadataV0Section(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.code = None + self.id = None + + super().__init__(data, sub_type, **kwargs) + + def process(self): + self.name = self.process_type('Bytes').value + self.code = self.process_type('Bytes').value + self.id = self.get_next_bytes(2).hex() + + return { + "name": self.name, + "code": self.code, + "id": self.id + } + + +class MetadataModule(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.prefix = None + self.call_index = None + self.has_storage = False + self.storage = None + self.has_calls = False + self.calls = None + self.has_events = False + self.events = None + self.constants = [] + self.errors = [] + super().__init__(data, sub_type, **kwargs) + + def get_identifier(self): + return self.name.lower() + + def process(self): + + self.name = self.process_type('Bytes').value + self.prefix = self.process_type('Bytes').value + + result = { + "name": self.name, + "prefix": self.prefix, + "storage": self.storage, + "calls": self.calls, + "events": self.events, + "constants": self.constants + } + + self.has_storage = self.process_type('bool').value + + if self.has_storage: + # TODO convert to Option> + self.storage = self.process_type('Vec').elements + result["storage"] = [s.value for s in self.storage] + + self.has_calls = self.process_type('bool').value + + if self.has_calls: + # TODO convert to Option> + self.calls = self.process_type('Vec').elements + result["calls"] = [s.value for s in self.calls] + + self.has_events = self.process_type('bool').value + + if self.has_events: + # TODO convert to Option> + self.events = self.process_type('Vec').elements + result["events"] = [s.value for s in self.events] + + return result + + +class MetadataV1Module(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.prefix = None + self.call_index = None + self.has_storage = False + self.storage = None + self.has_calls = False + self.calls = None + self.has_events = False + self.events = None + self.constants = [] + self.errors = [] + super().__init__(data, sub_type, **kwargs) + + def get_identifier(self): + return self.name.lower() + + def process(self): + + self.name = self.process_type('Bytes').value + self.prefix = self.process_type('Bytes').value + + result = { + "name": self.name, + "prefix": self.prefix, + "storage": self.storage, + "calls": self.calls, + "events": self.events, + "constants": self.constants + } + + self.has_storage = self.process_type('bool').value + + if self.has_storage: + # TODO convert to Option> + self.storage = self.process_type('Vec').elements + result["storage"] = [s.value for s in self.storage] + + self.has_calls = self.process_type('bool').value + + if self.has_calls: + # TODO convert to Option> + self.calls = self.process_type('Vec').elements + result["calls"] = [s.value for s in self.calls] + + self.has_events = self.process_type('bool').value + + if self.has_events: + # TODO convert to Option> + self.events = self.process_type('Vec').elements + result["events"] = [s.value for s in self.events] + + return result + + +class MetadataModuleStorage(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.modifier = None + self.type = {} + self.fallback = None + self.docs = [] + super().__init__(data, sub_type, **kwargs) + + def process(self): + self.name = self.process_type('Bytes').value + self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value + + is_key_value = self.process_type('bool').value + + if is_key_value: + self.type = { + "MapType": { + "key": self.convert_type(self.process_type('Bytes').value), + "value": self.convert_type(self.process_type('Bytes').value), + "isLinked": self.process_type('bool').value + } + + } + else: + self.type = { + "PlainType": self.convert_type(self.process_type('Bytes').value) + } + + self.fallback = self.process_type('HexBytes').value + + self.docs = self.process_type('Vec').value + + return { + "name": self.name, + "modifier": self.modifier, + "type": self.type, + "fallback": self.fallback, + "docs": self.docs + } + + +class MetadataV1ModuleStorage(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.modifier = None + self.type = {} + self.fallback = None + self.docs = [] + super().__init__(data, sub_type, **kwargs) + + def process(self): + self.name = self.process_type('Bytes').value + self.modifier = self.process_type('Enum', value_list=["Optional", "Default"]).value + + is_key_value = self.process_type('bool').value + + if is_key_value: + self.type = { + "MapType": { + "key": self.convert_type(self.process_type('Bytes').value), + "value": self.convert_type(self.process_type('Bytes').value) + } + + } + else: + self.type = { + "PlainType": self.convert_type(self.process_type('Bytes').value) + } + + self.fallback = self.process_type('HexBytes').value + + self.docs = self.process_type('Vec').value + + return { + "name": self.name, + "modifier": self.modifier, + "type": self.type, + "fallback": self.fallback, + "docs": self.docs + } + + +class MetadataModuleCall(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.args = [] + self.docs = [] + super().__init__(data, sub_type, **kwargs) + + def get_identifier(self): + return self.name + + def process(self): + self.name = self.process_type('Bytes').value + + self.args = self.process_type('Vec').elements + + self.docs = self.process_type('Vec').value + + return { + "name": self.name, + "args": [a.value for a in self.args], + "docs": self.docs + } + + +class MetadataModuleCallArgument(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.type = None + + super().__init__(data, sub_type, **kwargs) + + def process(self): + self.name = self.process_type('Bytes').value + self.type = self.convert_type(self.process_type('Bytes').value) + + return { + "name": self.name, + "type": self.type + } + + +class MetadataModuleEvent(ScaleType): + + def __init__(self, data, sub_type=None, **kwargs): + self.name = None + self.args = [] + self.docs = [] + super().__init__(data, sub_type, **kwargs) + + def process(self): + self.name = self.process_type('Bytes').value + self.args = self.process_type('Vec').value + self.docs = self.process_type('Vec').value + + return { + "name": self.name, + "args": self.args, + "docs": self.docs + } diff --git a/py-scale-codec/scalecodec/type_registry/__init__.py b/py-scale-codec/scalecodec/type_registry/__init__.py new file mode 100644 index 00000000..69dd4fb1 --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/__init__.py @@ -0,0 +1,32 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import json + + +def load_type_registry_preset(name): + module_path = os.path.dirname(__file__) + path = os.path.join(module_path, '{}.json'.format(name)) + return load_type_registry_file(path) + + +def load_type_registry_file(file_path): + + with open(os.path.abspath(file_path), 'r') as fp: + data = fp.read() + + return json.loads(data) diff --git a/py-scale-codec/scalecodec/type_registry/acala.json b/py-scale-codec/scalecodec/type_registry/acala.json new file mode 100644 index 00000000..39d68697 --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/acala.json @@ -0,0 +1,105 @@ +{ + "runtime_id": 402, + "types": { + "Keys": { + "type": "struct", + "type_mapping": [ + ["grandpa", "AccountId"], + ["babe", "AccountId"] + ] + }, + "FixedU128": "u128", + "AirDropCurrencyId": { + "type": "enum", + "value_list": [ + "KAR", + "ACA" + ] + }, + "AuctionId": "u32", + "AuctionIdOf": "AuctionId", + "CurrencyId": { + "type": "enum", + "value_list": [ + "ACA", + "AUSD", + "DOT", + "XBTC", + "LDOT" + ] + }, + "CurrencyIdOf": "CurrencyId", + "Amount": "i128", + "AmountOf": "Amount", + "DebitAmount": "Amount", + "DebitAmountOf": "DebitAmount", + "DebitBalance": "Balance", + "DebitBalanceOf": "Balance", + "DepositBalanceOf": "Amount", + "AuctionIdLinkedItem": { + "type": "struct", + "type_mapping": [ + ["prev", "Option"], + ["next", "Option"] + ] + }, + "ExchangeRate": "FixedU128", + "OracleKey": "CurrencyId", + "OracleValue": "FixedU128", + "Rate": "FixedU128", + "Ratio": "FixedU128", + "Share": "u128", + "AuctionItem": { + "type": "struct", + "type_mapping": [ + ["owner", "AccountId"], + ["currencyId", "CurrencyId"], + ["amount", "Balance"], + ["target", "Balance"], + ["startTime", "BlockNumber"] + ] + }, + "CollateralAuctionItem": { + "type": "struct", + "type_mapping": [ + ["owner", "AccountId"], + ["currencyId", "CurrencyId"], + ["amount", "Balance"], + ["target", "Balance"], + ["startTime", "BlockNumber"] + ] + }, + "DebitAuctionItem": { + "type": "struct", + "type_mapping": [ + ["amount", "Balance"], + ["fix", "Balance"], + ["startTime", "BlockNumber"] + ] + }, + "SurplusAuctionItem": { + "type": "struct", + "type_mapping": [ + ["amount", "Balance"], + ["startTime", "BlockNumber"] + ] + }, + "TimestampedValue": { + "type": "struct", + "type_mapping": [ + ["value", "OracleValue"], + ["timestamp", "Moment"] + ] + }, + "TimestampedValueOf": "TimestampedValue", + "Price": "FixedU128", + "AuctionInfo": { + "type": "struct", + "type_mapping": [ + ["bid", "Option<(AccountId, Balance)>"], + ["start", "BlockNumber"], + ["end", "Option"] + ] + } + } +} diff --git a/py-scale-codec/scalecodec/type_registry/centrifuge.json b/py-scale-codec/scalecodec/type_registry/centrifuge.json new file mode 100644 index 00000000..83aa17a5 --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/centrifuge.json @@ -0,0 +1,38 @@ +{ + "runtime_id": 226, + "types": { + "Address": "AccountIdAddress", + "BlockNumber": "u32", + "Keys": { + "type": "struct", + "type_mapping": [ + ["grandpa", "AccountId"], + ["babe", "AccountId"], + ["im_online", "AccountId"], + ["authority_discovery", "AccountId"] + ] + }, + "Fee": { + "type": "struct", + "type_mapping": [ + ["key", "Hash"], + ["price", "Balance"] + ] + }, + "PreCommitData": { + "type": "struct", + "type_mapping": [ + ["signing_root", "Hash"], + ["identity", "AccountId"], + ["expiration_block", "BlockNumber"] + ] + }, + "Proof": { + "type": "struct", + "type_mapping": [ + ["leaf_hash", "H256"], + ["sorted_hashes", "Vec"] + ] + } + } +} diff --git a/py-scale-codec/scalecodec/type_registry/darwinia.json b/py-scale-codec/scalecodec/type_registry/darwinia.json new file mode 100644 index 00000000..1c39b14a --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/darwinia.json @@ -0,0 +1,112 @@ +{ + "types": { + "EpochDuration": "u64", + "EraIndex": "u32", + "Index": "U64", + "RingBalanceOf": "u128", + "KtonBalanceOf": "u128", + "ExtendedBalance": "u128", + "Keys": { + "type": "struct", + "type_mapping": [ + ["grandpa", "AccountId"], + ["babe", "AccountId"] + ] + }, + "ValidatorPrefs": "ValidatorPrefsLegacy", + "StakingBalance": { + "type": "enum", + "type_mapping": [ + ["Ring", "RingBalanceOf"], + ["Kton", "KtonBalanceOf"] + ] + }, + "TimeDepositItem": { + "type": "struct", + "type_mapping": [ + ["value", "Compact"], + ["start_time", "Compact"], + ["expire_time", "Compact"] + ] + }, + "UnlockChunk": { + "type": "struct", + "type_mapping": [ + ["value", "StakingBalance"], + ["era", "Compact"], + ["is_time_deposit", "bool"] + ] + }, + "StakingLedgers": { + "type": "struct", + "type_mapping": [ + ["stash", "AccountId"], + ["total_ring", "Compact"], + ["total_deposit_ring", "Compact"], + ["active_ring", "Compact"], + ["active_deposit_ring", "Compact"], + ["total_kton", "Compact"], + ["active_kton", "Compact"], + ["deposit_items", "Vec"], + ["unlocking", "Vec"] + ] + }, + "IndividualExpo": { + "type": "struct", + "type_mapping": [ + ["who", "AccountId"], + ["value", "ExtendedBalance"] + ] + }, + "Exposures": { + "type": "struct", + "type_mapping": [ + ["total", "ExtendedBalance"], + ["own", "ExtendedBalance"], + ["others", "Vec"] + ] + }, + "TokenBalance": "u128", + "Currency": "u128", + "CurrencyOf": "u128", + "Auction": { + "type": "struct", + "type_mapping": [ + ["seller", "AccountId"], + ["startAt", "Moment"], + ["duration", "u64"], + ["startingPrice", "TokenBalance"], + ["endingPrice", "TokenBalance"], + ["lastRecord", "TokenBalance"], + ["lastBidder", "AccountId"], + ["lastBidStartAt", "Moment"] + ] + }, + "DepositInfo": { + "type": "struct", + "type_mapping": [ + ["month", "Moment"], + ["start_at", "Moment"], + ["value", "CurrencyOf"], + ["unit_interest", "u64"], + ["claimed", "bool"] + ] + }, + "Deposit": { + "type": "struct", + "type_mapping": [ + ["total_deposit", "CurrencyOf"], + ["deposit_list", "Vec"] + ] + }, + "Revenue": { + "type": "struct", + "type_mapping": [ + ["team", "TokenBalance"], + ["contribution", "TokenBalance"], + ["ktoner", "TokenBalance"], + ["lottery", "TokenBalance"] + ] + } + } +} diff --git a/py-scale-codec/scalecodec/type_registry/default.json b/py-scale-codec/scalecodec/type_registry/default.json new file mode 100644 index 00000000..a84bdbb2 --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/default.json @@ -0,0 +1,5223 @@ +{ + "types": { + "Balance": "u128", + "BalanceOf": "Balance", + "Block": "GenericBlock", + "Call": "GenericCall", + "H160": "H160", + "H256": "H256", + "H512": "H512", + "Hash": "H256", + "CallHash": "Hash", + "CallHashOf": "CallHash", + "Fixed64": "u64", + "Fixed128": "u128", + "AccountId": "GenericAccountId", + "AccountIdOf": "AccountId", + "AccountVoteSplit": { + "type": "struct", + "type_mapping": [ + [ + "aye", + "Balance" + ], + [ + "nay", + "Balance" + ] + ] + }, + "AccountVoteStandard": { + "type": "struct", + "type_mapping": [ + [ + "vote", + "Vote" + ], + [ + "balance", + "Balance" + ] + ] + }, + "AccountVote": { + "type": "enum", + "type_mapping": [ + [ + "Standard", + "AccountVoteStandard" + ], + [ + "Split", + "AccountVoteSplit" + ] + ] + }, + "Delegations": { + "type": "struct", + "type_mapping": [ + [ + "votes", + "Balance" + ], + [ + "capital", + "Balance" + ] + ] + }, + "PriorLock": { + "type": "struct", + "type_mapping": [ + ["blockNumber", "BlockNumber"], + ["balance", "Balance"] + ] + }, + "ReferendumInfoFinished": { + "type": "struct", + "type_mapping": [ + [ + "approved", + "bool" + ], + [ + "end", + "BlockNumber" + ] + ] + }, + "Tally": { + "type": "struct", + "type_mapping": [ + [ + "ayes", + "Balance" + ], + [ + "nays", + "Balance" + ], + [ + "turnout", + "Balance" + ] + ] + }, + "ReferendumStatus": { + "type": "struct", + "type_mapping": [ + [ + "end", + "BlockNumber" + ], + [ + "proposalHash", + "Hash" + ], + [ + "threshold", + "VoteThreshold" + ], + [ + "delay", + "BlockNumber" + ], + [ + "tally", + "Tally" + ] + ] + }, + "ReferendumInfo": { + "type": "enum", + "type_mapping": [ + [ + "Ongoing", + "ReferendumStatus" + ], + [ + "Finished", + "ReferendumInfoFinished" + ] + ] + }, + "VotingDirectVote": { + "type": "struct", + "type_mapping": [ + ["referendumIndex", "ReferendumIndex"], + ["accountVote", "AccountVote"] + ] + }, + "VotingDirect": { + "type": "struct", + "type_mapping": [ + [ + "votes", + "Vec" + ], + [ + "delegations", + "Delegations" + ], + [ + "prior", + "PriorLock" + ] + ] + }, + "VotingDelegating": { + "type": "struct", + "type_mapping": [ + [ + "balance", + "Balance" + ], + [ + "target", + "AccountId" + ], + [ + "conviction", + "Conviction" + ], + [ + "delegations", + "Delegations" + ], + [ + "prior", + "PriorLock" + ] + ] + }, + "Voting": { + "type": "enum", + "type_mapping": [ + [ + "Direct", + "VotingDirect" + ], + [ + "Delegating", + "VotingDelegating" + ] + ] + }, + "(AccountId, Balance)": { + "type": "struct", + "type_mapping": [ + [ + "account", + "AccountId" + ], + [ + "balance", + "Balance" + ] + ] + }, + "(BalanceOf, BidKind>)": { + "type": "struct", + "type_mapping": [ + [ + "balance", + "Balance" + ], + [ + "bidkind", + "BidKind" + ] + ] + }, + "RawOrigin": { + "type": "enum", + "type_mapping": [ + [ + "Root", + "Null" + ], + [ + "Signed", + "AccountId" + ], + [ + "None", + "Null" + ] + ] + }, + "RefCount": "u32", + "RefCountTo259": "u8", + "SyncState": { + "type": "struct", + "type_mapping": [ + [ + "startingBlock", + "BlockNumber" + ], + [ + "currentBlock", + "BlockNumber" + ], + [ + "highestBlock", + "Option" + ] + ] + }, + "SystemOrigin": "RawOrigin", + "Moment": "u64", + "AccountData": { + "type": "struct", + "type_mapping": [ + [ + "free", + "Balance" + ], + [ + "reserved", + "Balance" + ], + [ + "miscFrozen", + "Balance" + ], + [ + "feeFrozen", + "Balance" + ] + ] + }, + "AccountInfo": { + "type": "struct", + "type_mapping": [ + [ + "nonce", + "Index" + ], + [ + "refcount", + "RefCount" + ], + [ + "data", + "AccountData" + ] + ] + }, + "ActiveEraInfo": { + "type": "struct", + "type_mapping": [ + [ + "index", + "EraIndex" + ], + [ + "start", + "Option" + ] + ] + }, + "BlockNumber": "u32", + "CandidateReceipt": { + "type": "struct", + "type_mapping": [ + [ + "parachainIndex", + "ParaId" + ], + [ + "relayParent", + "Hash" + ], + [ + "head_data", + "HeadData" + ], + [ + "collator", + "CollatorId" + ], + [ + "signature", + "CollatorSignature" + ], + [ + "povBlockHash", + "Hash" + ], + [ + "globalValidation", + "GlobalValidationSchedule" + ], + [ + "localValidation", + "LocalValidationData" + ], + [ + "commitments", + "CandidateCommitments" + ] + ] + }, + "ValidityVote": { + "type": "struct", + "type_mapping": [ + [ + "accountId", + "AccountId" + ], + [ + "validityAttestation", + "ValidityAttestation" + ] + ] + }, + "AttestedCandidate": { + "type": "struct", + "type_mapping": [ + [ + "candidate", + "AbridgedCandidateReceipt" + ], + [ + "validityVotes", + "Vec" + ], + [ + "validatorIndices", + "BitVec" + ] + ] + }, + "LockIdentifier": "[u8; 8]", + "TransactionPriority": "u64", + "BalanceLock": { + "type": "struct", + "type_mapping": [ + [ + "id", + "LockIdentifier" + ], + [ + "amount", + "Balance" + ], + [ + "reasons", + "Reasons" + ] + ] + }, + "FullIdentification": { + "type": "struct", + "type_mapping": [ + ["total", "Compact"], + ["own", "Compact"], + ["others", "Vec"] + ] + }, + "IdentificationTuple": { + "type": "struct", + "type_mapping": [ + ["validatorId", "ValidatorId"], + ["exposure", "FullIdentification"] + ] + }, + "SetId": "u64", + "Reasons": { + "type": "enum", + "value_list": ["Fee", "Misc", "All"] + }, + "RoundNumber": "U64", + "SessionIndex": "u32", + "AuctionIndex": "u32", + "AuthIndex": "u32", + "AuthorityIndex": "u64", + "Signature": "H512", + "CollatorSignature": "Signature", + "AuthorityWeight": "u64", + "EncodedFinalityProofs": "Bytes", + "NextAuthority": { + "type": "struct", + "type_mapping": [ + ["AuthorityId", "AuthorityId"], + ["weight", "AuthorityWeight"] + ] + }, + "AuthorityList": "Vec", + "BalanceUpload": { + "type": "struct", + "type_mapping": [ + [ + "accountId", + "AccountId" + ], + [ + "balance", + "u64" + ] + ] + }, + "CollatorId": "[u8; 32]", + "ContractInfo": { + "type": "enum", + "type_mapping": [ + [ + "Alive", + "AliveContractInfo" + ], + [ + "Tombstone", + "TombstoneContractInfo" + ] + ] + }, + "TrieId": "Bytes", + "RawAliveContractInfo": { + "type": "struct", + "type_mapping": [ + [ + "trie_id", + "TrieId" + ], + [ + "storage_size", + "u32" + ], + [ + "code_hash", + "CodeHash" + ], + [ + "rent_allowance", + "Balance" + ], + [ + "deduct_block", + "BlockNumber" + ], + [ + "last_write", + "Option" + ] + ] + }, + "Pays": { + "type": "enum", + "value_list": [ + "Yes", + "No" + ] + }, + "DispatchClass": { + "type": "enum", + "value_list": ["Normal", "Operational", "Mandatory"] + }, + "DispatchInfo": { + "type": "struct", + "type_mapping": [ + [ + "weight", + "Weight" + ], + [ + "class", + "DispatchClass" + ], + [ + "paysFee", + "Pays" + ] + ] + }, + "EgressQueueRoot": { + "type": "struct", + "type_mapping": [ + [ + "paraId", + "ParaId" + ], + [ + "hash", + "Hash" + ] + ] + }, + "EventIndex": "u32", + "Extrinsic": "ExtrinsicsDecoder", + "ExtrinsicSignature": "MultiSignature", + "ExtrinsicPayloadValue": { + "type": "struct", + "type_mapping": [ + [ + "call", + "CallBytes" + ], + [ + "era", + "Era" + ], + [ + "nonce", + "Compact" + ], + [ + "tip", + "Compact" + ], + [ + "specVersion", + "u32" + ], + [ + "transactionVersion", + "u32" + ], + [ + "genesisHash", + "Hash" + ], + [ + "blockHash", + "Hash" + ] + ] + }, + "Gas": "u64", + "IdentityFields": { + "type": "set", + "value_type": "u64", + "value_list": { + "Display": 1, + "Legal": 2, + "Web": 4, + "Riot": 8, + "Email": 16, + "PgpFingerprint": 32, + "Image": 64, + "Twitter": 128 + } + }, + "IdentityInfoAdditional": { + "type": "struct", + "type_mapping": [ + ["field", "Data"], + ["value", "Data"] + ] + }, + "IdentityInfo": { + "type": "struct", + "type_mapping": [ + [ + "additional", + "Vec" + ], + [ + "display", + "Data" + ], + [ + "legal", + "Data" + ], + [ + "web", + "Data" + ], + [ + "riot", + "Data" + ], + [ + "email", + "Data" + ], + [ + "pgpFingerprint", + "Option" + ], + [ + "image", + "Data" + ], + [ + "twitter", + "Data" + ] + ] + }, + "IdentityJudgement": { + "type": "enum", + "type_mapping": [ + [ + "Unknown", + "Null" + ], + [ + "FeePaid", + "Balance" + ], + [ + "Reasonable", + "Null" + ], + [ + "KnownGood", + "Null" + ], + [ + "OutOfDate", + "Null" + ], + [ + "LowQuality", + "Null" + ], + [ + "Erroneous", + "Null" + ] + ] + }, + "Judgement": "IdentityJudgement", + "Judgement": "IdentityJudgement", + "LeasePeriod": "BlockNumber", + "LeasePeriodOf": "LeasePeriod", + "(LeasePeriodOf, IncomingParachain)": { + "type": "struct", + "type_mapping": [ + [ + "leasePeriod", + "LeasePeriodOf" + ], + [ + "incomingParachain", + "IncomingParachain" + ] + ] + }, + "(ParaId, Option<(CollatorId, Retriable)>)": { + "type": "struct", + "type_mapping": [ + [ + "ParaId", + "ParaId" + ], + [ + "CollatorId-Retriable", + "Option<(CollatorId, Retriable)>" + ] + ] + }, + "MaybeVrf": "Option", + "MemberCount": "u32", + "CollectiveOrigin": { + "type": "enum", + "type_mapping": [ + [ + "Members", + "(MemberCount, MemberCount)" + ], + [ + "Member", + "AccountId" + ] + ] + }, + "MomentOf": "Moment", + "MoreAttestations": { + "type": "struct", + "type_mapping": [] + }, + "Multiplier": "Fixed128", + "Timepoint": { + "type": "struct", + "type_mapping": [ + [ + "height", + "BlockNumber" + ], + [ + "index", + "u32" + ] + ] + }, + "Multisig": { + "type": "struct", + "type_mapping": [ + [ + "when", + "Timepoint" + ], + [ + "deposit", + "Balance" + ], + [ + "depositor", + "AccountId" + ], + [ + "approvals", + "Vec" + ] + ] + }, + "Offender": "IdentificationTuple", + "PhantomData": "Null", + "sp_std::marker::PhantomData<(AccountId, Event)>": "PhantomData", + "Reporter": "AccountId", + "OffenceDetails": { + "type": "struct", + "type_mapping": [ + [ + "offender", + "Offender" + ], + [ + "reporters", + "Vec" + ] + ] + }, + "BountyStatusActive": { + "type": "struct", + "type_mapping": [ + [ + "curator", + "AccountId" + ], + [ + "updateDue", + "BlockNumber" + ] + ] + }, + "BountyStatusCuratorProposed": { + "type": "struct", + "type_mapping": [ + [ + "curator", + "AccountId" + ] + ] + }, + "BountyStatusPendingPayout": { + "type": "struct", + "type_mapping": [ + [ + "curator", + "AccountId" + ], + [ + "beneficiary", + "AccountId" + ], + [ + "unlockAt", + "BlockNumber" + ] + ] + }, + "BountyIndex": "u32", + "BountyStatus": { + "type": "enum", + "type_mapping": [ + [ + "Proposed", + "Null" + ], + [ + "Approved", + "Null" + ], + [ + "Funded", + "Null" + ], + [ + "CuratorProposed", + "BountyStatusCuratorProposed" + ], + [ + "Active", + "BountyStatusActive" + ], + [ + "PendingPayout", + "BountyStatusPendingPayout" + ] + ] + }, + "Bounty": { + "type": "struct", + "type_mapping": [ + [ + "proposer", + "AccountId" + ], + [ + "value", + "Balance" + ], + [ + "fee", + "Balance" + ], + [ + "curatorDeposit", + "Balance" + ], + [ + "bond", + "Balance" + ], + [ + "status", + "BountyStatus" + ] + ] + }, + "OpenTipFinder": "(AccountId, Balance)", + "OpenTipTip": "(AccountId, Balance)", + "OpenTip": { + "type": "struct", + "type_mapping": [ + [ + "reason", + "Hash" + ], + [ + "who", + "AccountId" + ], + [ + "finder", + "AccountId" + ], + [ + "deposit", + "Balance" + ], + [ + "closes", + "Option" + ], + [ + "tips", + "Vec" + ], + [ + "findersFee", + "bool" + ] + ] + }, + "ParaId": "u32", + "ParaIdOf": "ParaId", + "ParaScheduling": { + "type": "enum", + "value_list": ["Always", "Dynamic"] + }, + "ParaInfo": { + "type": "struct", + "type_mapping": [ + [ + "scheduling", + "Scheduling" + ] + ] + }, + "Percent": "u8", + "SlotNumber": "u64", + "VrfData": "[u8; 32]", + "VrfProof": "[u8; 64]", + "RawAuraPreDigest": { + "type": "struct", + "type_mapping": [ + [ + "slotNumber", + "u64" + ] + ] + }, + "RawBabePreDigest": { + "type": "enum", + "type_mapping": [ + [ + "Phantom", + "Null" + ], + [ + "Primary", + "RawBabePreDigestPrimary" + ], + [ + "SecondaryPlain", + "RawBabePreDigestSecondaryPlain" + ], + [ + "SecondaryVRF", + "RawBabePreDigestSecondaryVRF" + ] + ] + }, + "RawBabePreDigestPrimary": { + "type": "struct", + "type_mapping": [ + [ + "authorityIndex", + "u32" + ], + [ + "slotNumber", + "SlotNumber" + ], + [ + "vrfOutput", + "VrfOutput" + ], + [ + "vrfProof", + "VrfProof" + ] + ] + }, + "RawBabePreDigestSecondaryPlain": { + "type": "struct", + "type_mapping": [ + [ + "authorityIndex", + "u32" + ], + [ + "slotNumber", + "SlotNumber" + ] + ] + }, + "RawBabePreDigestSecondaryVRF": { + "type": "struct", + "type_mapping": [ + [ + "authorityIndex", + "u32" + ], + [ + "slotNumber", + "SlotNumber" + ], + [ + "vrfOutput", + "VrfOutput" + ], + [ + "vrfProof", + "VrfProof" + ] + ] + }, + "ReferendumInfo": { + "type": "struct", + "type_mapping": [ + [ + "end", + "BlockNumber" + ], + [ + "proposal", + "Proposal" + ], + [ + "threshold", + "VoteThreshold" + ], + [ + "delay", + "BlockNumber" + ] + ] + }, + "(ReferendumInfo)": "ReferendumInfo", + "ReferendumInfo": { + "type": "struct", + "type_mapping": [ + [ + "end", + "BlockNumber" + ], + [ + "proposalHash", + "Hash" + ], + [ + "threshold", + "VoteThreshold" + ], + [ + "delay", + "BlockNumber" + ] + ] + }, + "(ReferendumInfo)": "ReferendumInfo", + "RegistrarIndex": "u32", + "RegistrarInfo": { + "type": "struct", + "type_mapping": [ + [ + "account", + "AccountId" + ], + [ + "fee", + "Balance" + ], + [ + "fields", + "IdentityFields" + ] + ] + }, + "RegistrationJudgement": { + "type": "struct", + "type_mapping": [ + ["registrarIndex", "RegistrarIndex"], + ["judgement", "Judgement"] + ] + }, + "Registration": { + "type": "struct", + "type_mapping": [ + [ + "judgements", + "Vec" + ], + [ + "deposit", + "Balance" + ], + [ + "info", + "IdentityInfo" + ] + ] + }, + "ReportIdOf": "Hash", + "ScheduleTo258": { + "type": "struct", + "type_mapping": [ + [ + "version", + "u32" + ], + [ + "putCodePerByteCost", + "Gas" + ], + [ + "growMemCost", + "Gas" + ], + [ + "regularOpCost", + "Gas" + ], + [ + "returnDataPerByteCost", + "Gas" + ], + [ + "eventDataPerByteCost", + "Gas" + ], + [ + "eventPerTopicCost", + "Gas" + ], + [ + "eventBaseCost", + "Gas" + ], + [ + "sandboxDataReadCost", + "Gas" + ], + [ + "sandboxDataWriteCost", + "Gas" + ], + [ + "transferCost", + "Gas" + ], + [ + "maxEventTopics", + "u32" + ], + [ + "maxStackHeight", + "u32" + ], + [ + "maxMemoryPages", + "u32" + ], + [ + "enablePrintln", + "bool" + ], + [ + "maxSubjectLen", + "u32" + ] + ] + }, + "Schedule": { + "type": "struct", + "type_mapping": [ + [ + "version", + "u32" + ], + [ + "enablePrintln", + "bool" + ], + [ + "limits", + "Limits" + ], + [ + "instructionWeights", + "InstructionWeights" + ], + [ + "hostFnWeights", + "HostFnWeights" + ] + ] + }, + "SubId": "u32", + "UncleEntryItem": { + "type": "enum", + "value_list": ["InclusionHeight", "Uncle"] + }, + "ValidatorPrefs": { + "type": "struct", + "type_mapping": [ + [ + "commission", + "Compact" + ] + ] + }, + "VestingSchedule": { + "type": "struct", + "type_mapping": [ + [ + "offset", + "Balance" + ], + [ + "perBlock", + "Balance" + ], + [ + "startingBlock", + "BlockNumber" + ] + ] + }, + "Weight": "u64", + "WeightMultiplier": "Fixed64", + "WinningDataEntry": "Option", + "WinningData": "[WinningDataEntry; 10]", + "WithdrawReasons": { + "type": "set", + "value_type": "u64", + "value_list": { + "TransactionPayment": 1, + "Transfer": 2, + "Reserve": 4, + "Fee": 8, + "Tip": 16 + } + }, + "Index": "u32", + "Kind": "[u8; 16]", + "Nominations": { + "type": "struct", + "type_mapping": [ + [ + "targets", + "Vec" + ], + [ + "submittedIn", + "EraIndex" + ], + [ + "suppressed", + "bool" + ] + ] + }, + "OpaqueTimeSlot": "Bytes", + "Box<>::Proposal>": "BoxProposal", + "AuthoritySignature": "Signature", + "::Signature": "AuthoritySignature", + "&[u8]": "Bytes", + "Text": "Bytes", + "Forcing": { + "type": "enum", + "value_list": [ + "NotForcing", + "ForceNew", + "ForceNone", + "ForceAlways" + ] + }, + "Heartbeat": { + "type": "struct", + "type_mapping": [ + [ + "blockNumber", + "BlockNumber" + ], + [ + "networkState", + "OpaqueNetworkState" + ], + [ + "sessionIndex", + "SessionIndex" + ], + [ + "authorityIndex", + "AuthIndex" + ], + [ + "validatorsLen", + "u32" + ] + ] + }, + "RewardDestination": { + "type": "enum", + "type_mapping": [ + [ + "Staked", + "Null" + ], + [ + "Stash", + "Null" + ], + [ + "Controller", + "Null" + ], + [ + "Account", + "AccountId" + ] + ] + }, + "RewardDestinationTo257": { + "type": "enum", + "value_list": [ + "Staked", + "Stash", + "Controller" + ] + }, + "ChangesTrieConfiguration": { + "type": "struct", + "type_mapping": [ + [ + "digestInterval", + "u32" + ], + [ + "digestLevels", + "u32" + ] + ] + }, + "ConsensusEngineId": "GenericConsensusEngineId", + "DigestItem": { + "type": "enum", + "type_mapping": [ + [ + "Other", + "Bytes" + ], + [ + "AuthoritiesChange", + "Vec" + ], + [ + "ChangesTrieRoot", + "Hash" + ], + [ + "SealV0", + "SealV0" + ], + [ + "Consensus", + "Consensus" + ], + [ + "Seal", + "Seal" + ], + [ + "PreRuntime", + "PreRuntime" + ] + ] + }, + "Digest": { + "type": "struct", + "type_mapping": [ + [ + "logs", + "Vec" + ] + ] + }, + "DigestOf": "Digest", + "SpanIndex": "u32", + "slashing::SpanIndex": "SpanIndex", + "SlashingSpans": { + "type": "struct", + "type_mapping": [ + [ + "spanIndex", + "SpanIndex" + ], + [ + "lastStart", + "EraIndex" + ], + [ + "lastNonzeroSlash", + "EraIndex" + ], + [ + "prior", + "Vec" + ] + ] + }, + "slashing::SlashingSpans": "SlashingSpans", + "SpanRecord": { + "type": "struct", + "type_mapping": [ + [ + "slashed", + "Balance" + ], + [ + "paidOut", + "Balance" + ] + ] + }, + "slashing::SpanRecord": "SpanRecord", + "UnappliedSlashOther": { + "type": "struct", + "type_mapping": [ + ["account", "AccountId"], + ["amount", "Balance"] + ] + }, + "UnappliedSlash": { + "type": "struct", + "type_mapping": [ + [ + "validator", + "AccountId" + ], + [ + "own", + "AccountId" + ], + [ + "others", + "Vec" + ], + [ + "reporters", + "Vec" + ], + [ + "payout", + "Balance" + ] + ] + }, + "Keys": "SessionKeysSubstrate", + "Header": { + "type": "struct", + "type_mapping": [ + [ + "parentHash", + "Hash" + ], + [ + "number", + "Compact" + ], + [ + "stateRoot", + "Hash" + ], + [ + "extrinsicsRoot", + "Hash" + ], + [ + "digest", + "Digest" + ] + ] + }, + "DispatchErrorModule": { + "type": "struct", + "type_mapping": [ + [ + "index", + "u8" + ], + [ + "error", + "u8" + ] + ] + }, + "DispatchError": { + "type": "enum", + "type_mapping": [ + [ + "Other", + "Null" + ], + [ + "CannotLookup", + "Null" + ], + [ + "BadOrigin", + "Null" + ], + [ + "Module", + "DispatchErrorModule" + ] + ] + }, + "DispatchResult": { + "type": "enum", + "type_mapping": [ + [ + "Ok", + "Null" + ], + [ + "Error", + "DispatchError" + ] + ] + }, + "ActiveRecovery": { + "type": "struct", + "type_mapping": [ + [ + "created", + "BlockNumber" + ], + [ + "deposit", + "Balance" + ], + [ + "friends", + "Vec" + ] + ] + }, + "RecoveryConfig": { + "type": "struct", + "type_mapping": [ + [ + "delayPeriod", + "BlockNumber" + ], + [ + "deposit", + "Balance" + ], + [ + "friends", + "Vec" + ], + [ + "threshold", + "u16" + ] + ] + }, + "BidKindVouch": { + "type": "struct", + "type_mapping": [ + [ + "account", + "AccountId" + ], + [ + "amount", + "Balance" + ] + ] + }, + "BidKind": { + "type": "enum", + "type_mapping": [ + [ + "Deposit", + "Balance" + ], + [ + "Vouch", + "(AccountId, Balance)" + ] + ] + }, + "BidKind": "Bidkind", + "BidKind>": "Bidkind", + "Bid": { + "type": "struct", + "type_mapping": [ + [ + "who", + "AccountId" + ], + [ + "kind", + "BidKind" + ], + [ + "value", + "Balance" + ] + ] + }, + "StrikeCount": "u32", + "VouchingStatus": { + "type": "enum", + "value_list": ["Vouching", "Banned"] + }, + "ExtrinsicMetadata": { + "type": "struct", + "type_mapping": [ + [ + "version", + "u8" + ], + [ + "signedExtensions", + "Vec" + ] + ] + }, + "RewardPoint": "u32", + "BTreeMap": "Vec<(AccountId, RewardPoint)>", + "EraRewardPoints": { + "type": "struct", + "type_mapping": [ + [ + "total", + "RewardPoint" + ], + [ + "individual", + "BTreeMap" + ] + ] + }, + "IncomingParachainDeploy": { + "type": "struct", + "type_mapping": [ + [ + "code", + "ValidationCode" + ], + [ + "initialHeadData", + "HeadData" + ] + ] + }, + "NewBidder": { + "type": "struct", + "type_mapping": [ + [ + "who", + "AccountId" + ], + [ + "sub", + "SubId" + ] + ] + }, + "IncomingParachainFixed": { + "type": "struct", + "type_mapping": [ + [ + "codeHash", + "Hash" + ], + [ + "codeSize", + "u32" + ], + [ + "initialHeadData", + "HeadData" + ] + ] + }, + "IncomingParachain": { + "type": "enum", + "type_mapping": [ + [ + "Unset", + "NewBidder" + ], + [ + "Fixed", + "IncomingParachainFixed" + ], + [ + "Deploy", + "IncomingParachainDeploy" + ] + ] + }, + "LastRuntimeUpgradeInfo": { + "type": "struct", + "type_mapping": [ + [ + "specVersion", + "Compact" + ], + [ + "specName", + "Text" + ] + ] + }, + "ProxyState": { + "type": "enum", + "type_mapping": [ + [ + "Open", + "AccountId" + ], + [ + "Active", + "AccountId" + ] + ] + }, + "ReleasesBalances": { + "type": "enum", + "value_list": ["V1_0_0", "V2_0_0"] + }, + "Releases": { + "type": "enum", + "value_list": [ + "V1", + "V2", + "V3", + "V4", + "V5", + "V6", + "V7", + "V8", + "V9", + "V10" + ] + }, + "SlotRange": { + "type": "enum", + "value_list": [ + "ZeroZero", + "ZeroOne", + "ZeroTwo", + "ZeroThree", + "OneOne", + "OneTwo", + "OneThree", + "TwoTwo", + "TwoThree", + "ThreeThree" + ] + }, + "ValidityAttestation": { + "type": "enum", + "type_mapping": [ + [ + "Never", + "Null" + ], + [ + "Implicit", + "ValidatorSignature" + ], + [ + "Explicit", + "ValidatorSignature" + ] + ] + }, + "VestingInfo": { + "type": "struct", + "type_mapping": [ + [ + "locked", + "Balance" + ], + [ + "perBlock", + "Balance" + ], + [ + "startingBlock", + "BlockNumber" + ] + ] + }, + "NominatorIndex": "u32", + "ValidatorIndex": "u16", + "PerU16": "u16", + "ValidatorIndexCompact": "Compact", + "NominatorIndexCompact": "Compact", + "OffchainAccuracy": "PerU16", + "OffchainAccuracyCompact": "Compact", + "CompactScoreCompact": { + "type": "struct", + "type_mapping": [ + ["validatorIndex", "ValidatorIndexCompact"], + ["offchainAccuracy", "OffchainAccuracyCompact"] + ] + }, + "CompactScore": { + "type": "struct", + "type_mapping": [ + ["validatorIndex", "ValidatorIndex"], + ["offchainAccuracy", "OffchainAccuracy"] + ] + }, + "CompactAssignmentsFrom258": { + "type": "struct", + "type_mapping": [ + [ + "votes1", + "Vec<(NominatorIndexCompact, ValidatorIndexCompact)>" + ], + [ + "votes2", + "Vec<(NominatorIndexCompact, CompactScoreCompact, ValidatorIndexCompact)>" + ], + [ + "votes3", + "Vec<(NominatorIndexCompact, [CompactScoreCompact; 2], ValidatorIndexCompact)>" + ], + [ + "votes4", + "Vec<(NominatorIndexCompact, [CompactScoreCompact; 3], ValidatorIndexCompact)>" + ], + [ + "votes5", + "Vec<(NominatorIndexCompact, [CompactScoreCompact; 4], ValidatorIndexCompact)>" + ], + [ + "votes6", + "Vec<(NominatorIndexCompact, [CompactScoreCompact; 5], ValidatorIndexCompact)>" + ], + [ + "votes7", + "Vec<(NominatorIndexCompact, [CompactScoreCompact; 6], ValidatorIndexCompact)>" + ], + [ + "votes8", + "Vec<(NominatorIndexCompact, [CompactScoreCompact; 7], ValidatorIndexCompact)>" + ], + [ + "votes9", + "Vec<(NominatorIndexCompact, [CompactScoreCompact; 8], ValidatorIndexCompact)>" + ], + [ + "votes10", + "Vec<(NominatorIndexCompact, [CompactScoreCompact; 9], ValidatorIndexCompact)>" + ], + [ + "votes11", + "Vec<(NominatorIndexCompact, [CompactScoreCompact; 10], ValidatorIndexCompact)>" + ], + [ + "votes12", + "Vec<(NominatorIndexCompact, [CompactScoreCompact; 11], ValidatorIndexCompact)>" + ], + [ + "votes13", + "Vec<(NominatorIndexCompact, [CompactScoreCompact; 12], ValidatorIndexCompact)>" + ], + [ + "votes14", + "Vec<(NominatorIndexCompact, [CompactScoreCompact; 13], ValidatorIndexCompact)>" + ], + [ + "votes15", + "Vec<(NominatorIndexCompact, [CompactScoreCompact; 14], ValidatorIndexCompact)>" + ], + [ + "votes16", + "Vec<(NominatorIndexCompact, [CompactScoreCompact; 15], ValidatorIndexCompact)>" + ] + ] + }, + "CompactAssignmentsTo257": { + "type": "struct", + "type_mapping": [ + [ + "votes1", + "Vec<(NominatorIndex, [CompactScore; 0], ValidatorIndex)>" + ], + [ + "votes2", + "Vec<(NominatorIndex, [CompactScore; 1], ValidatorIndex)>" + ], + [ + "votes3", + "Vec<(NominatorIndex, [CompactScore; 2], ValidatorIndex)>" + ], + [ + "votes4", + "Vec<(NominatorIndex, [CompactScore; 3], ValidatorIndex)>" + ], + [ + "votes5", + "Vec<(NominatorIndex, [CompactScore; 4], ValidatorIndex)>" + ], + [ + "votes6", + "Vec<(NominatorIndex, [CompactScore; 5], ValidatorIndex)>" + ], + [ + "votes7", + "Vec<(NominatorIndex, [CompactScore; 6], ValidatorIndex)>" + ], + [ + "votes8", + "Vec<(NominatorIndex, [CompactScore; 7], ValidatorIndex)>" + ], + [ + "votes9", + "Vec<(NominatorIndex, [CompactScore; 8], ValidatorIndex)>" + ], + [ + "votes10", + "Vec<(NominatorIndex, [CompactScore; 9], ValidatorIndex)>" + ], + [ + "votes11", + "Vec<(NominatorIndex, [CompactScore; 10], ValidatorIndex)>" + ], + [ + "votes12", + "Vec<(NominatorIndex, [CompactScore; 11], ValidatorIndex)>" + ], + [ + "votes13", + "Vec<(NominatorIndex, [CompactScore; 12], ValidatorIndex)>" + ], + [ + "votes14", + "Vec<(NominatorIndex, [CompactScore; 13], ValidatorIndex)>" + ], + [ + "votes15", + "Vec<(NominatorIndex, [CompactScore; 14], ValidatorIndex)>" + ], + [ + "votes16", + "Vec<(NominatorIndex, [CompactScore; 15], ValidatorIndex)>" + ] + ] + }, + "CompactAssignments": "CompactAssignmentsFrom258", + "DeferredOffenceOf": { + "type": "struct", + "type_mapping": [ + ["offences", "Vec"], + ["perc", "Vec"], + ["session", "SessionIndex"] + ] + }, + "Statement": { + "type": "enum", + "type_mapping": [ + [ + "Never", + "Null" + ], + [ + "Candidate", + "Hash" + ], + [ + "Valid", + "Hash" + ], + [ + "Invalid", + "Hash" + ] + ] + }, + "ValidatorSignature": "Signature", + "DoubleVoteReportStatement": { + "type": "struct", + "type_mapping": [ + [ + "statement", + "Statement" + ], + [ + "signature", + "ValidatorSignature" + ] + ] + }, + "DoubleVoteReportProof": { + "type": "struct", + "type_mapping": [ + [ + "session", + "SessionIndex" + ], + [ + "trieNodes", + "Vec" + ] + ] + }, + "SigningContext": { + "type": "struct", + "type_mapping": [ + [ + "sessionIndex", + "SessionIndex" + ], + [ + "parentHash", + "Hash" + ] + ] + }, + "DoubleVoteReport": { + "type": "struct", + "type_mapping": [ + [ + "identity", + "ValidatorId" + ], + [ + "first", + "(Statement, ValidatorSignature)" + ], + [ + "second", + "(Statement, ValidatorSignature)" + ], + [ + "proof", + "MembershipProof" + ], + [ + "signingContext", + "SigningContext" + ] + ] + }, + "ElectionCompute": { + "type": "enum", + "value_list": [ + "OnChain", + "Signed", + "Authority" + ] + }, + "ElectionResult": { + "type": "struct", + "type_mapping": [ + [ + "compute", + "ElectionCompute" + ], + [ + "slotStake", + "Balance" + ], + [ + "electedStashes", + "Vec" + ], + [ + "exposures", + "Vec<(AccountId, Exposure)>" + ] + ] + }, + "ElectionStatus": { + "type": "enum", + "type_mapping": [ + [ + "Close", + "Null" + ], + [ + "Open", + "BlockNumber" + ] + ] + }, + "Phase": { + "type": "enum", + "type_mapping": [ + [ + "ApplyExtrinsic", + "u32" + ], + [ + "Finalization", + "Null" + ], + [ + "Initialization", + "Null" + ] + ] + }, + "PhragmenScore": "[u128; 3]", + "PreimageStatusAvailable": { + "type": "struct", + "type_mapping": [ + [ + "data", + "Bytes" + ], + [ + "provider", + "AccountId" + ], + [ + "deposit", + "Balance" + ], + [ + "since", + "BlockNumber" + ], + [ + "expiry", + "Option" + ] + ] + }, + "PreimageStatus": { + "type": "enum", + "type_mapping": [ + [ + "Missing", + "BlockNumber" + ], + [ + "Available", + "PreimageStatusAvailable" + ] + ] + }, + "Randomness": "Hash", + "MaybeRandomness": "Option", + "schnorrkel::Randomness": "Hash", + "schnorrkel::RawVRFOutput": "[u8; 32]", + "TaskAddress": { + "type": "struct", + "type_mapping": [ + ["blockNumber", "BlockNumber"], + ["index", "u32"] + ] + }, + "ValidationFunctionParams": { + "type": "struct", + "type_mapping": [ + [ + "maxCodeSize", + "u32" + ], + [ + "relayChainHeight", + "RelayChainBlockNumber" + ], + [ + "codeUpgradeAllowed", + "Option" + ] + ] + }, + "ValidationCode": "Bytes", + "ParaPastCodeMeta": { + "type": "struct", + "type_mapping": [ + [ + "upgradeTimes", + "Vec" + ], + [ + "lastPruned", + "Option" + ] + ] + }, + "ModuleId": "LockIdentifier", + "MultiAddress": "GenericMultiAddress", + "RuntimeDbWeight": { + "type": "struct", + "type_mapping": [ + [ + "read", + "Weight" + ], + [ + "write", + "Weight" + ] + ] + }, + "Renouncing": { + "type": "enum", + "type_mapping": [ + [ + "Member", + "Null" + ], + [ + "RunnerUp", + "Null" + ], + [ + "Candidate", + "Compact" + ] + ] + }, + "ExtrinsicsWeight": { + "type": "struct", + "type_mapping": [ + [ + "normal", + "Weight" + ], + [ + "operational", + "Weight" + ] + ] + }, + "weights::ExtrinsicsWeight": "ExtrinsicsWeight", + "ValidatorCount": "u32", + "MembershipProof": { + "type": "struct", + "type_mapping": [ + [ + "session", + "SessionIndex" + ], + [ + "trieNodes", + "Vec>" + ], + [ + "validatorCount", + "ValidatorCount" + ] + ] + }, + "JustificationNotification": "Bytes", + "KeyOwnerProof": "MembershipProof", + "DefunctVoter": { + "type": "struct", + "type_mapping": [ + [ + "who", + "AccountId" + ], + [ + "voteCount", + "Compact" + ], + [ + "candidateCount", + "Compact" + ] + ] + }, + "ElectionScore": "[u128; 3]", + "ElectionSize": { + "type": "struct", + "type_mapping": [ + [ + "validators", + "Compact" + ], + [ + "nominators", + "Compact" + ] + ] + }, + "SiField": { + "type": "struct", + "type_mapping": [ + [ + "name", + "Option" + ], + [ + "type", + "SiLookupTypeId" + ] + ] + }, + "SiLookupTypeId": "u32", + "SiPath": "Vec", + "SiType": { + "type": "struct", + "type_mapping": [ + [ + "path", + "SiPath" + ], + [ + "params", + "Vec" + ], + [ + "def", + "SiTypeDef" + ] + ] + }, + "SiTypeDef": { + "type": "enum", + "type_mapping": [ + [ + "Composite", + "SiTypeDefComposite" + ], + [ + "Variant", + "SiTypeDefVariant" + ], + [ + "Sequence", + "SiTypeDefSequence" + ], + [ + "Array", + "SiTypeDefArray" + ], + [ + "Tuple", + "SiTypeDefTuple" + ], + [ + "Primitive", + "SiTypeDefPrimitive" + ] + ] + }, + "SiTypeDefArray": { + "type": "struct", + "type_mapping": [ + [ + "len", + "u16" + ], + [ + "type", + "SiLookupTypeId" + ] + ] + }, + "SiTypeDefComposite": { + "type": "struct", + "type_mapping": [ + [ + "fields", + "Vec" + ] + ] + }, + "SiTypeDefVariant": { + "type": "struct", + "type_mapping": [ + [ + "variants", + "Vec" + ] + ] + }, + "SiTypeDefPrimitive": { + "type": "enum", + "value_list": [ + "Bool", + "Char", + "Str", + "U8", + "U16", + "U32", + "U64", + "U128", + "U256", + "I8", + "I16", + "I32", + "I64", + "I128", + "I256" + ] + }, + "SiTypeDefSequence": { + "type": "struct", + "type_mapping": [ + [ + "type", + "SiLookupTypeId" + ] + ] + }, + "SiTypeDefTuple": "Vec", + "SiVariant": { + "type": "struct", + "type_mapping": [ + [ + "name", + "Text" + ], + [ + "fields", + "Vec" + ], + [ + "discriminant", + "Option" + ] + ] + }, + "AllowedSlots": { + "type": "enum", + "value_list": [ + "PrimarySlots", + "PrimaryAndSecondaryPlainSlots", + "PrimaryAndSecondaryVRFSlots" + ] + }, + "NextConfigDescriptorV1": { + "type": "struct", + "type_mapping": [ + [ + "c", + "(u64, u64)" + ], + [ + "allowedSlots", + "AllowedSlots" + ] + ] + }, + "NextConfigDescriptor": { + "type": "enum", + "type_mapping": [ + [ + "V0", + "Null" + ], + [ + "V1", + "NextConfigDescriptorV1" + ] + ] + }, + "StatementKind": { + "type": "enum", + "value_list": [ + "Regular", + "Saft" + ] + }, + "schedule::Priority": "u8", + "GrandpaEquivocation": { + "type": "enum", + "type_mapping": [ + [ + "Prevote", + "GrandpaEquivocationValue" + ], + [ + "Precommit", + "GrandpaEquivocationValue" + ] + ] + }, + "GrandpaPrevote": { + "type": "struct", + "type_mapping": [ + [ + "targetHash", + "Hash" + ], + [ + "targetNumber", + "BlockNumber" + ] + ] + }, + "Equivocation": "GrandpaEquivocation", + "EquivocationProof": { + "type": "struct", + "type_mapping": [ + [ + "setId", + "SetId" + ], + [ + "equivocation", + "Equivocation" + ] + ] + }, + "ProxyType": { + "type": "enum", + "value_list": [ + "Any", + "NonTransfer", + "Governance", + "Staking" + ] + }, + "BalanceStatus": { + "type": "enum", + "value_list": [ + "Free", + "Reserved" + ] + }, + "Status": "BalanceStatus", + "EcdsaSignature": "[u8; 65]", + "Ed25519Signature": "H512", + "Sr25519Signature": "H512", + "AnySignature": "H512", + "MultiSignature": { + "type": "enum", + "type_mapping": [ + [ + "Ed25519", + "Ed25519Signature" + ], + [ + "Sr25519", + "Sr25519Signature" + ], + [ + "Ecdsa", + "EcdsaSignature" + ] + ] + }, + "schedule::period": "(BlockNumber, u32)", + "OpaqueCall": "OpaqueCall", + "OriginCaller": { + "type": "enum", + "type_mapping": [ + [ + "System", + "SystemOrigin" + ] + ] + }, + "PalletsOrigin": "OriginCaller", + "PalletVersion": { + "type": "struct", + "type_mapping": [ + [ + "major", + "u16" + ], + [ + "minor", + "u8" + ], + [ + "patch", + "u8" + ] + ] + }, + "AuthorityId": "AccountId", + "RawVRFOutput": "[u8; 32]", + "BlockAttestations": { + "type": "struct", + "type_mapping": [ + [ + "receipt", + "CandidateReceipt" + ], + [ + "valid", + "Vec" + ], + [ + "invalid", + "Vec" + ] + ] + }, + "IncludedBlocks": { + "type": "struct", + "type_mapping": [ + [ + "actualNumber", + "BlockNumber" + ], + [ + "session", + "SessionIndex" + ], + [ + "randomSeed", + "H256" + ], + [ + "activeParachains", + "Vec" + ], + [ + "paraBlocks", + "Vec" + ] + ] + }, + "HeartbeatTo244": { + "type": "struct", + "type_mapping": [ + [ + "blockNumber", + "BlockNumber" + ], + [ + "networkState", + "OpaqueNetworkState" + ], + [ + "sessionIndex", + "SessionIndex" + ], + [ + "authorityIndex", + "AuthIndex" + ] + ] + }, + "OpaqueMultiaddr": "Bytes", + "OpaquePeerId": "Bytes", + "OpaqueNetworkState": { + "type": "struct", + "type_mapping": [ + [ + "peerId", + "OpaquePeerId" + ], + [ + "externalAddresses", + "Vec" + ] + ] + }, + "ProposalIndex": "u32", + "VotesTo230": { + "type": "struct", + "type_mapping": [ + [ + "index", + "ProposalIndex" + ], + [ + "threshold", + "MemberCount" + ], + [ + "ayes", + "Vec" + ], + [ + "nays", + "Vec" + ] + ] + }, + "Votes": { + "type": "struct", + "type_mapping": [ + [ + "index", + "ProposalIndex" + ], + [ + "threshold", + "MemberCount" + ], + [ + "ayes", + "Vec" + ], + [ + "nays", + "Vec" + ], + [ + "end", + "BlockNumber" + ] + ] + }, + "RuntimeDispatchInfo": { + "type": "struct", + "type_mapping": [ + [ + "weight", + "Weight" + ], + [ + "class", + "DispatchClass" + ], + [ + "partialFee", + "Balance" + ] + ] + }, + "AliveContractInfo": { + "type": "struct", + "type_mapping": [ + [ + "trieId", + "TrieId" + ], + [ + "storageSize", + "u32" + ], + [ + "emptyPairCount", + "u32" + ], + [ + "totalPairCount", + "u32" + ], + [ + "codeHash", + "CodeHash" + ], + [ + "rentAllowance", + "Balance" + ], + [ + "deductBlock", + "BlockNumber" + ], + [ + "lastWrite", + "Option" + ] + ] + }, + "CodeHash": "Hash", + "ContractCallRequest": { + "type": "struct", + "type_mapping": [ + [ + "origin", + "AccountId" + ], + [ + "dest", + "AccountId" + ], + [ + "value", + "Balance" + ], + [ + "gasLimit", + "u64" + ], + [ + "inputData", + "Bytes" + ] + ] + }, + "ContractExecResultSuccessTo260": { + "type": "struct", + "type_mapping": [ + [ + "flags", + "u32" + ], + [ + "data", + "Bytes" + ], + [ + "gasConsumed", + "u64" + ] + ] + }, + "ContractExecResultTo260": { + "type": "enum", + "type_mapping": [ + [ + "Success", + "ContractExecResultSuccessTo260" + ], + [ + "Error", + "Null" + ] + ] + }, + "ContractExecResultErrModule": { + "type": "struct", + "type_mapping": [ + [ + "index", + "u8" + ], + [ + "error", + "u8" + ], + [ + "message", + "Option" + ] + ] + }, + "ContractExecResultErr": { + "type": "enum", + "type_mapping": [ + [ + "Other", + "Text" + ], + [ + "CannotLookup", + "Null" + ], + [ + "BadOrigin", + "Null" + ], + [ + "Module", + "ContractExecResultErrModule" + ] + ] + }, + "ContractExecResultOk": { + "type": "struct", + "type_mapping": [ + [ + "flags", + "u32" + ], + [ + "data", + "Bytes" + ] + ] + }, + "ContractExecResultResult": { + "type": "enum", + "type_mapping": [ + [ + "Ok", + "ContractExecResultOk" + ], + [ + "Err", + "ContractExecResultErr" + ] + ] + }, + "ContractExecResult": { + "type": "struct", + "type_mapping": [ + [ + "gasConsumed", + "u64" + ], + [ + "debugMessage", + "Text" + ], + [ + "result", + "ContractExecResultResult" + ] + ] + }, + "ContractStorageKey": "[u8; 32]", + "HostFnWeights": { + "type": "struct", + "type_mapping": [ + [ + "caller", + "Weight" + ], + [ + "address", + "Weight" + ], + [ + "gasLeft", + "Weight" + ], + [ + "balance", + "Weight" + ], + [ + "valueTransferred", + "Weight" + ], + [ + "minimumBalance", + "Weight" + ], + [ + "tombstoneDeposit", + "Weight" + ], + [ + "rentAllowance", + "Weight" + ], + [ + "blockNumber", + "Weight" + ], + [ + "now", + "Weight" + ], + [ + "weightToFee", + "Weight" + ], + [ + "gas", + "Weight" + ], + [ + "input", + "Weight" + ], + [ + "inputPerByte", + "Weight" + ], + [ + "return", + "Weight" + ], + [ + "returnPerByte", + "Weight" + ], + [ + "terminate", + "Weight" + ], + [ + "restoreTo", + "Weight" + ], + [ + "restoreToPerDelta", + "Weight" + ], + [ + "random", + "Weight" + ], + [ + "depositEvent", + "Weight" + ], + [ + "depositEventPerTopic", + "Weight" + ], + [ + "depositEventPerByte", + "Weight" + ], + [ + "setRentAllowance", + "Weight" + ], + [ + "setStorage", + "Weight" + ], + [ + "setStoragePerByte", + "Weight" + ], + [ + "clearStorage", + "Weight" + ], + [ + "getStorage", + "Weight" + ], + [ + "getStoragePerByte", + "Weight" + ], + [ + "transfer", + "Weight" + ], + [ + "call", + "Weight" + ], + [ + "callTransferSurcharge", + "Weight" + ], + [ + "callPerInputByte", + "Weight" + ], + [ + "callPerOutputByte", + "Weight" + ], + [ + "instantiate", + "Weight" + ], + [ + "instantiatePerInputByte", + "Weight" + ], + [ + "instantiatePerOutputByte", + "Weight" + ], + [ + "hashSha2256", + "Weight" + ], + [ + "hashSha2256PerByte", + "Weight" + ], + [ + "hashKeccak256", + "Weight" + ], + [ + "hashKeccak256PerByte", + "Weight" + ], + [ + "hashBlake2256", + "Weight" + ], + [ + "hashBlake2256PerByte", + "Weight" + ], + [ + "hashBlake2128", + "Weight" + ], + [ + "hashBlake2128PerByte", + "Weight" + ] + ] + }, + "InstructionWeights": { + "type": "struct", + "type_mapping": [ + [ + "i64const", + "u32" + ], + [ + "i64load", + "u32" + ], + [ + "i64store", + "u32" + ], + [ + "select", + "u32" + ], + [ + "rIf", + "u32" + ], + [ + "br", + "u32" + ], + [ + "brIf", + "u32" + ], + [ + "brIable", + "u32" + ], + [ + "brIablePerEntry", + "u32" + ], + [ + "call", + "u32" + ], + [ + "callIndirect", + "u32" + ], + [ + "callIndirectPerParam", + "u32" + ], + [ + "localGet", + "u32" + ], + [ + "localSet", + "u32" + ], + [ + "local_tee", + "u32" + ], + [ + "globalGet", + "u32" + ], + [ + "globalSet", + "u32" + ], + [ + "memoryCurrent", + "u32" + ], + [ + "memoryGrow", + "u32" + ], + [ + "i64clz", + "u32" + ], + [ + "i64ctz", + "u32" + ], + [ + "i64popcnt", + "u32" + ], + [ + "i64eqz", + "u32" + ], + [ + "i64extendsi32", + "u32" + ], + [ + "i64extendui32", + "u32" + ], + [ + "i32wrapi64", + "u32" + ], + [ + "i64eq", + "u32" + ], + [ + "i64ne", + "u32" + ], + [ + "i64lts", + "u32" + ], + [ + "i64ltu", + "u32" + ], + [ + "i64gts", + "u32" + ], + [ + "i64gtu", + "u32" + ], + [ + "i64les", + "u32" + ], + [ + "i64leu", + "u32" + ], + [ + "i64ges", + "u32" + ], + [ + "i64geu", + "u32" + ], + [ + "i64add", + "u32" + ], + [ + "i64sub", + "u32" + ], + [ + "i64mul", + "u32" + ], + [ + "i64divs", + "u32" + ], + [ + "i64divu", + "u32" + ], + [ + "i64rems", + "u32" + ], + [ + "i64remu", + "u32" + ], + [ + "i64and", + "u32" + ], + [ + "i64or", + "u32" + ], + [ + "i64xor", + "u32" + ], + [ + "i64shl", + "u32" + ], + [ + "i64shrs", + "u32" + ], + [ + "i64shru", + "u32" + ], + [ + "i64rotl", + "u32" + ], + [ + "i64rotr", + "u32" + ] + ] + }, + "Limits": { + "type": "struct", + "type_mapping": [ + [ + "eventTopics", + "u32" + ], + [ + "stackHeight", + "u32" + ], + [ + "globals", + "u32" + ], + [ + "parameters", + "u32" + ], + [ + "memoryPages", + "u32" + ], + [ + "tableSize", + "u32" + ], + [ + "brTableSize", + "u32" + ], + [ + "subjectLen", + "u32" + ], + [ + "codeSize", + "u32" + ] + ] + }, + "PrefabWasmModule": { + "type": "struct", + "type_mapping": [ + [ + "scheduleVersion", + "Compact" + ], + [ + "initial", + "Compact" + ], + [ + "maximum", + "Compact" + ], + [ + "_reserved", + "PrefabWasmModuleReserved" + ], + [ + "code", + "Bytes" + ] + ] + }, + "PrefabWasmModuleReserved": "Option", + "ScheduleTo212": { + "type": "struct", + "type_mapping": [ + [ + "version", + "u32" + ], + [ + "putCodePerByteCost", + "Gas" + ], + [ + "growMemCost", + "Gas" + ], + [ + "regularOpCost", + "Gas" + ], + [ + "returnDataPerByteCost", + "Gas" + ], + [ + "eventDataPerByteCost", + "Gas" + ], + [ + "eventPerTopicCost", + "Gas" + ], + [ + "eventBaseCost", + "Gas" + ], + [ + "sandboxDataReadCost", + "Gas" + ], + [ + "sandboxDataWriteCost", + "Gas" + ], + [ + "maxEventTopics", + "u32" + ], + [ + "maxStackHeight", + "u32" + ], + [ + "maxMemoryPages", + "u32" + ], + [ + "enablePrintln", + "bool" + ], + [ + "maxSubjectLen", + "u32" + ] + ] + }, + "SeedOf": "Hash", + "TombstoneContractInfo": "Hash", + "ExtrinsicOrHash": { + "type": "enum", + "type_mapping": [ + [ + "Hash", + "Hash" + ], + [ + "Extrinsic", + "Bytes" + ] + ] + }, + "ExtrinsicStatus": { + "type": "enum", + "type_mapping": [ + [ + "Future", + "Null" + ], + [ + "Ready", + "Null" + ], + [ + "Broadcast", + "Vec" + ], + [ + "InBlock", + "Hash" + ], + [ + "Retracted", + "Hash" + ], + [ + "FinalityTimeout", + "Hash" + ], + [ + "Finalized", + "Hash" + ], + [ + "Usurped", + "Hash" + ], + [ + "Dropped", + "Null" + ], + [ + "Invalid", + "Null" + ] + ] + }, + "StorageKey": "Bytes", + "PrefixedStorageKey": "StorageKey", + "ContractProject": { + "type": "struct", + "type_mapping": [ + [ + "metadataVersion", + "Text" + ], + [ + "source", + "ContractProjectSource" + ], + [ + "contract", + "ContractProjectContract" + ], + [ + "types", + "Vec" + ], + [ + "spec", + "ContractContractSpec" + ] + ] + }, + "ContractProjectContract": { + "type": "struct", + "type_mapping": [ + [ + "name", + "Text" + ], + [ + "version", + "Text" + ], + [ + "authors", + "Vec" + ], + [ + "description", + "Option" + ], + [ + "documentation", + "Option" + ], + [ + "repository", + "Option" + ], + [ + "homepage", + "Option" + ], + [ + "license", + "Option" + ] + ] + }, + "ContractProjectSource": { + "type": "struct", + "type_mapping": [ + [ + "hash", + "[u8; 32]" + ], + [ + "language", + "Text" + ], + [ + "compiler", + "Text" + ], + [ + "wasm", + "Raw" + ] + ] + }, + "AccountIndex": "GenericAccountIndex", + "Address": "GenericAddress", + "AssetId": "u32", + "Justification": "Bytes", + "StorageData": "Bytes", + "KeyValue": { + "type": "struct", + "type_mapping": [ + [ + "key", + "StorageKey" + ], + [ + "value", + "StorageData" + ] + ] + }, + "KeyTypeId": "u32", + "LookupSource": "Address", + "LookupTarget": "AccountId", + "Perbill": "u32", + "Permill": "u32", + "Perquintill": "u64", + "Phantom": "Null", + "SignedBlock": { + "type": "struct", + "type_mapping": [ + [ + "block", + "Block" + ], + [ + "justification", + "Justification" + ] + ] + }, + "ValidatorId": "AccountId", + "PreRuntime": "(ConsensusEngineId, Bytes)", + "SealV0": "(u64, Signature)", + "Seal": "(ConsensusEngineId, Bytes)", + "Consensus": "(ConsensusEngineId, Bytes)", + "Period": "(BlockNumber, u32)", + "Priority": "u8", + "SchedulePeriod": "Period", + "SchedulePriority": "Priority", + "Scheduled": { + "type": "struct", + "type_mapping": [ + [ + "maybeId", + "Option" + ], + [ + "priority", + "SchedulePriority" + ], + [ + "call", + "Call" + ], + [ + "maybePeriodic", + "Option" + ], + [ + "origin", + "PalletsOrigin" + ] + ] + }, + "ScheduledTo254": { + "type": "struct", + "type_mapping": [ + [ + "maybeId", + "Option" + ], + [ + "priority", + "SchedulePriority" + ], + [ + "call", + "Call" + ], + [ + "maybePeriodic", + "Option" + ] + ] + }, + "SocietyJudgement": { + "type": "enum", + "value_list": [ + "Rebid", + "Reject", + "Approve" + ] + }, + "SocietyVote": { + "type": "enum", + "value_list": [ + "Skeptic", + "Reject", + "Approve" + ] + }, + "BlockHash": "Hash", + "UncleEntryItem": { + "type": "enum", + "type_mapping": [ + [ + "InclusionHeight", + "BlockNumber" + ], + [ + "Uncle", + "(Hash, Option)" + ] + ] + }, + "ApiId": "[u8; 8]", + "KeyValueOption": "(StorageKey, Option)", + "ReadProof": { + "type": "struct", + "type_mapping": [ + [ + "at", + "Hash" + ], + [ + "proof", + "Vec" + ] + ] + }, + "RuntimeVersionApi": "(ApiId, u32)", + "RuntimeVersion": { + "type": "struct", + "type_mapping": [ + [ + "specName", + "Text" + ], + [ + "implName", + "Text" + ], + [ + "authoringVersion", + "u32" + ], + [ + "specVersion", + "u32" + ], + [ + "implVersion", + "u32" + ], + [ + "apis", + "Vec" + ], + [ + "transactionVersion", + "u32" + ] + ] + }, + "StorageChangeSet": { + "type": "struct", + "type_mapping": [ + [ + "block", + "Hash" + ], + [ + "changes", + "Vec" + ] + ] + }, + "GrandpaEquivocationProof": { + "type": "struct", + "type_mapping": [ + [ + "setId", + "SetId" + ], + [ + "equivocation", + "GrandpaEquivocation" + ] + ] + }, + "GrandpaEquivocationValue": { + "type": "struct", + "type_mapping": [ + [ + "roundNumber", + "u64" + ], + [ + "identity", + "AuthorityId" + ], + [ + "first", + "(GrandpaPrevote, AuthoritySignature)" + ], + [ + "second", + "(GrandpaPrevote, AuthoritySignature)" + ] + ] + }, + "PendingPause": { + "type": "struct", + "type_mapping": [ + [ + "scheduledAt", + "BlockNumber" + ], + [ + "delay", + "BlockNumber" + ] + ] + }, + "PendingResume": { + "type": "struct", + "type_mapping": [ + [ + "scheduledAt", + "BlockNumber" + ], + [ + "delay", + "BlockNumber" + ] + ] + }, + "Precommits": { + "type": "struct", + "type_mapping": [ + [ + "currentWeight", + "u32" + ], + [ + "missing", + "BTreeSet" + ] + ] + }, + "Prevotes": { + "type": "struct", + "type_mapping": [ + [ + "currentWeight", + "u32" + ], + [ + "missing", + "BTreeSet" + ] + ] + }, + "ReportedRoundStates": { + "type": "struct", + "type_mapping": [ + [ + "setId", + "u32" + ], + [ + "best", + "RoundState" + ], + [ + "background", + "Vec" + ] + ] + }, + "RoundState": { + "type": "struct", + "type_mapping": [ + [ + "round", + "u32" + ], + [ + "totalWeight", + "u32" + ], + [ + "thresholdWeight", + "u32" + ], + [ + "prevotes", + "Prevotes" + ], + [ + "precommits", + "Precommits" + ] + ] + }, + "StoredPendingChange": { + "type": "struct", + "type_mapping": [ + [ + "scheduledAt", + "BlockNumber" + ], + [ + "delay", + "BlockNumber" + ], + [ + "nextAuthorities", + "AuthorityList" + ] + ] + }, + "StoredState": { + "type": "enum", + "type_mapping": [ + [ + "Live", + "Null" + ], + [ + "PendingPause", + "PendingPause" + ], + [ + "Paused", + "Null" + ], + [ + "PendingResume", + "PendingResume" + ] + ] + }, + "AccountInfo": { + "type": "struct", + "type_mapping": [ + [ + "nonce", + "Index" + ], + [ + "refcount", + "RefCount" + ], + [ + "data", + "AccountData" + ] + ] + }, + "ChainProperties": { + "type": "struct", + "type_mapping": [ + [ + "ss58Format", + "Option" + ], + [ + "tokenDecimals", + "Option" + ], + [ + "tokenSymbol", + "Option" + ] + ] + }, + "ChainType": { + "type": "enum", + "type_mapping": [ + [ + "Development", + "Null" + ], + [ + "Local", + "Null" + ], + [ + "Live", + "Null" + ], + [ + "Custom", + "Text" + ] + ] + }, + "DispatchErrorTo198": { + "type": "struct", + "type_mapping": [ + [ + "module", + "Option" + ], + [ + "error", + "u8" + ] + ] + }, + "DispatchInfoTo190": { + "type": "struct", + "type_mapping": [ + [ + "weight", + "Weight" + ], + [ + "class", + "DispatchClass" + ] + ] + }, + "DispatchInfoTo244": { + "type": "struct", + "type_mapping": [ + [ + "weight", + "Weight" + ], + [ + "class", + "DispatchClass" + ], + [ + "paysFee", + "bool" + ] + ] + }, + "DispatchResultOf": "DispatchResult", + "Event": "GenericEvent", + "EventId": "[u8; 2]", + "EventRecord": "EventRecord", + "EventRecordTo76": { + "type": "struct", + "type_mapping": [ + [ + "phase", + "Phase" + ], + [ + "event", + "Event" + ] + ] + }, + "Health": { + "type": "struct", + "type_mapping": [ + [ + "peers", + "u64" + ], + [ + "isSyncing", + "bool" + ], + [ + "shouldHavePeers", + "bool" + ] + ] + }, + "InvalidTransaction": { + "type": "enum", + "type_mapping": [ + [ + "Call", + "Null" + ], + [ + "Payment", + "Null" + ], + [ + "Future", + "Null" + ], + [ + "Stale", + "Null" + ], + [ + "BadProof", + "Null" + ], + [ + "AncientBirthBlock", + "Null" + ], + [ + "ExhaustsResources", + "Null" + ], + [ + "Custom", + "u8" + ], + [ + "BadMandatory", + "Null" + ], + [ + "MandatoryDispatch", + "Null" + ] + ] + }, + "Key": "Bytes", + "NetworkState": { + "type": "struct", + "type_mapping": [ + [ + "peerId", + "Text" + ], + [ + "listenedAddresses", + "Vec" + ], + [ + "externalAddresses", + "Vec" + ], + [ + "connectedPeers", + "HashMap" + ], + [ + "notConnectedPeers", + "HashMap" + ], + [ + "averageDownloadPerSec", + "u64" + ], + [ + "averageUploadPerSec", + "u64" + ], + [ + "peerset", + "NetworkStatePeerset" + ] + ] + }, + "NetworkStatePeerset": { + "type": "struct", + "type_mapping": [ + [ + "messageQueue", + "u64" + ], + [ + "nodes", + "HashMap" + ] + ] + }, + "NetworkStatePeersetInfo": { + "type": "struct", + "type_mapping": [ + [ + "connected", + "bool" + ], + [ + "reputation", + "i32" + ] + ] + }, + "NodeRole": { + "type": "enum", + "type_mapping": [ + [ + "Full", + "Null" + ], + [ + "LightClient", + "Null" + ], + [ + "Authority", + "Null" + ], + [ + "UnknownRole", + "u8" + ] + ] + }, + "NotConnectedPeer": { + "type": "struct", + "type_mapping": [ + [ + "knownAddresses", + "Vec" + ], + [ + "latestPingTime", + "Option" + ], + [ + "versionString", + "Option" + ] + ] + }, + "Peer": { + "type": "struct", + "type_mapping": [ + [ + "enabled", + "bool" + ], + [ + "endpoint", + "PeerEndpoint" + ], + [ + "knownAddresses", + "Vec" + ], + [ + "latestPingTime", + "PeerPing" + ], + [ + "open", + "bool" + ], + [ + "versionString", + "Text" + ] + ] + }, + "PeerEndpoint": { + "type": "struct", + "type_mapping": [ + [ + "listening", + "PeerEndpointAddr" + ] + ] + }, + "PeerEndpointAddr": { + "type": "struct", + "type_mapping": [ + [ + "_alias", + { + "localAddr": "local_addr", + "sendBackAddr": "send_back_addr" + } + ], + [ + "localAddr", + "Text" + ], + [ + "sendBackAddr", + "Text" + ] + ] + }, + "PeerPing": { + "type": "struct", + "type_mapping": [ + [ + "nanos", + "u64" + ], + [ + "secs", + "u64" + ] + ] + }, + "PeerInfo": { + "type": "struct", + "type_mapping": [ + [ + "peerId", + "Text" + ], + [ + "roles", + "Text" + ], + [ + "protocolVersion", + "u32" + ], + [ + "bestHash", + "Hash" + ], + [ + "bestNumber", + "BlockNumber" + ] + ] + }, + "TransactionValidityError": { + "type": "enum", + "type_mapping": [ + [ + "Invalid", + "InvalidTransaction" + ], + [ + "Unknown", + "UnknownTransaction" + ] + ] + }, + "UnknownTransaction": { + "type": "enum", + "type_mapping": [ + [ + "CannotLookup", + "Null" + ], + [ + "NoUnsignedValidator", + "Null" + ], + [ + "Custom", + "u8" + ] + ] + }, + "WeightToFeeCoefficient": { + "type": "struct", + "type_mapping": [ + [ + "coeffInteger", + "Balance" + ], + [ + "coeffFrac", + "Perbill" + ], + [ + "negative", + "bool" + ], + [ + "degree", + "u8" + ] + ] + }, + "EraIndex": "u32", + "EraRewards": { + "type": "struct", + "type_mapping": [ + [ + "total", + "u32" + ], + [ + "rewards", + "Vec" + ] + ] + }, + "Exposure": { + "type": "struct", + "type_mapping": [ + [ + "total", + "Compact" + ], + [ + "own", + "Compact" + ], + [ + "others", + "Vec" + ] + ] + }, + "IndividualExposure": { + "type": "struct", + "type_mapping": [ + [ + "who", + "AccountId" + ], + [ + "value", + "Compact" + ] + ] + }, + "KeyType": "AccountId", + "Points": "u32", + "SlashJournalEntry": { + "type": "struct", + "type_mapping": [ + [ + "who", + "AccountId" + ], + [ + "amount", + "Balance" + ], + [ + "ownSlash", + "Balance" + ] + ] + }, + "SlashingSpansTo204": { + "type": "struct", + "type_mapping": [ + [ + "spanIndex", + "SpanIndex" + ], + [ + "lastStart", + "EraIndex" + ], + [ + "prior", + "Vec" + ] + ] + }, + "StakingLedgerTo223": { + "type": "struct", + "type_mapping": [ + [ + "stash", + "AccountId" + ], + [ + "total", + "Compact" + ], + [ + "active", + "Compact" + ], + [ + "unlocking", + "Vec" + ] + ] + }, + "StakingLedgerTo240": { + "type": "struct", + "type_mapping": [ + [ + "stash", + "AccountId" + ], + [ + "total", + "Compact" + ], + [ + "active", + "Compact" + ], + [ + "unlocking", + "Vec" + ], + [ + "lastReward", + "Option" + ] + ] + }, + "StakingLedger": { + "type": "struct", + "type_mapping": [ + [ + "stash", + "AccountId" + ], + [ + "total", + "Compact" + ], + [ + "active", + "Compact" + ], + [ + "unlocking", + "Vec" + ], + [ + "claimedRewards", + "Vec" + ] + ] + }, + "UnappliedSlash": { + "type": "struct", + "type_mapping": [ + [ + "validator", + "AccountId" + ], + [ + "own", + "Balance" + ], + [ + "others", + "Vec" + ], + [ + "reporters", + "Vec" + ], + [ + "payout", + "Balance" + ] + ] + }, + "UnlockChunk": { + "type": "struct", + "type_mapping": [ + [ + "value", + "Compact" + ], + [ + "era", + "Compact" + ] + ] + }, + "ValidatorPrefsTo196": { + "type": "struct", + "type_mapping": [ + [ + "validatorPayment", + "Compact" + ] + ] + }, + "ValidatorPrefsTo145": { + "type": "struct", + "type_mapping": [ + [ + "unstakeThreshold", + "Compact" + ], + [ + "validatorPayment", + "Compact" + ] + ] + }, + "BalanceLockTo212": { + "type": "struct", + "type_mapping": [ + [ + "id", + "LockIdentifier" + ], + [ + "amount", + "Balance" + ], + [ + "until", + "BlockNumber" + ], + [ + "reasons", + "WithdrawReasons" + ] + ] + }, + "VestingSchedule": { + "type": "struct", + "type_mapping": [ + [ + "offset", + "Balance" + ], + [ + "perBlock", + "Balance" + ], + [ + "startingBlock", + "BlockNumber" + ] + ] + }, + "Account": { + "type": "struct", + "type_mapping": [ + [ + "nonce", + "u256" + ], + [ + "balance", + "u256" + ] + ] + }, + "Log": { + "type": "struct", + "type_mapping": [ + [ + "address", + "H160" + ], + [ + "topics", + "Vec" + ], + [ + "data", + "Bytes" + ] + ] + }, + "Vicinity": { + "type": "struct", + "type_mapping": [ + [ + "gasPrice", + "u256" + ], + [ + "origin", + "H160" + ] + ] + }, + "StorageKind": { + "type": "enum", + "value_list": [ + "__UNUSED", + "PERSISTENT", + "LOCAL" + ] + }, + "OpenTipTo225": { + "type": "struct", + "type_mapping": [ + [ + "reason", + "Hash" + ], + [ + "who", + "AccountId" + ], + [ + "finder", + "Option" + ], + [ + "closes", + "Option" + ], + [ + "tips", + "Vec" + ] + ] + }, + "OpenTipFinderTo225": "(AccountId, Balance)", + "TreasuryProposal": { + "type": "struct", + "type_mapping": [ + [ + "proposer", + "AccountId" + ], + [ + "value", + "Balance" + ], + [ + "beneficiary", + "AccountId" + ], + [ + "bond", + "Balance" + ] + ] + }, + "BabeAuthorityWeight": "u64", + "BabeBlockWeight": "u32", + "equivocationproof
": "BabeEquivocationProof", + "BabeEquivocationProof": { + "type": "struct", + "type_mapping": [ + [ + "offender", + "AuthorityId" + ], + [ + "slotNumber", + "SlotNumber" + ], + [ + "firstHeader", + "Header" + ], + [ + "secondHeader", + "Header" + ] + ] + }, + "BabeWeight": "u64", + "EpochAuthorship": { + "type": "struct", + "type_mapping": [ + [ + "primary", + "Vec" + ], + [ + "secondary", + "Vec" + ], + [ + "secondary_vrf", + "Vec" + ] + ] + }, + "RawBabePreDigestTo159": { + "type": "enum", + "type_mapping": [ + [ + "Primary", + "RawBabePreDigestPrimaryTo159" + ], + [ + "Secondary", + "RawBabePreDigestSecondaryTo159" + ] + ] + }, + "RawBabePreDigestPrimaryTo159": { + "type": "struct", + "type_mapping": [ + [ + "authorityIndex", + "u32" + ], + [ + "slotNumber", + "SlotNumber" + ], + [ + "weight", + "BabeBlockWeight" + ], + [ + "vrfOutput", + "VrfOutput" + ], + [ + "vrfProof", + "VrfProof" + ] + ] + }, + "RawBabePreDigestSecondaryTo159": { + "type": "struct", + "type_mapping": [ + [ + "authorityIndex", + "u32" + ], + [ + "slotNumber", + "SlotNumber" + ], + [ + "weight", + "BabeBlockWeight" + ] + ] + }, + "RawBabePreDigestCompat": { + "type": "enum", + "type_mapping": [ + [ + "Zero", + "u32" + ], + [ + "One", + "u32" + ], + [ + "Two", + "u32" + ], + [ + "Three", + "u32" + ] + ] + }, + "VrfOutput": "[u8; 32]", + "RpcMethods": { + "type": "struct", + "type_mapping": [ + [ + "version", + "u32" + ], + [ + "methods", + "Vec" + ] + ] + }, + "CreatedBlock": { + "type": "struct", + "type_mapping": [ + [ + "hash", + "BlockHash" + ], + [ + "aux", + "ImportedAux" + ] + ] + }, + "ImportedAux": { + "type": "struct", + "type_mapping": [ + [ + "headerOnly", + "bool" + ], + [ + "clearJustificationRequests", + "bool" + ], + [ + "needsJustification", + "bool" + ], + [ + "badJustification", + "bool" + ], + [ + "needsFinalityProof", + "bool" + ], + [ + "isNewBest", + "bool" + ] + ] + }, + "Conviction": { + "type": "enum", + "value_list": [ + "None", + "Locked1x", + "Locked2x", + "Locked3x", + "Locked4x", + "Locked5x", + "Locked6x" + ] + }, + "PropIndex": "u32", + "Proposal": "Call", + "ReferendumIndex": "u32", + "ReferendumInfoTo239": { + "type": "struct", + "type_mapping": [ + [ + "end", + "BlockNumber" + ], + [ + "proposalHash", + "Hash" + ], + [ + "threshold", + "VoteThreshold" + ], + [ + "delay", + "BlockNumber" + ] + ] + }, + "ApprovalFlag": "u32", + "SetIndex": "u32", + "Vote": "GenericVote", + "VoteIndex": "u32", + "VoterInfo": { + "type": "struct", + "type_mapping": [ + [ + "lastActive", + "VoteIndex" + ], + [ + "lastWin", + "VoteIndex" + ], + [ + "pot", + "Balance" + ], + [ + "stake", + "Balance" + ] + ] + }, + "VoteThreshold": { + "type": "enum", + "value_list": [ + "Super majority approval", + "Super majority rejection", + "Simple majority" + ] + }, + "EthereumAddress": "H160", + "AbridgedCandidateReceipt": { + "type": "struct", + "type_mapping": [ + [ + "parachainIndex", + "ParaId" + ], + [ + "relayParent", + "Hash" + ], + [ + "headData", + "HeadData" + ], + [ + "collator", + "CollatorId" + ], + [ + "signature", + "CollatorSignature" + ], + [ + "povBlockHash", + "Hash" + ], + [ + "commitments", + "CandidateCommitments" + ] + ] + }, + "Bidder": { + "type": "enum", + "type_mapping": [ + [ + "New", + "NewBidder" + ], + [ + "Existing", + "ParaId" + ] + ] + }, + "CandidateCommitments": { + "type": "struct", + "type_mapping": [ + [ + "fees", + "Balance" + ], + [ + "upwardMessages", + "Vec" + ], + [ + "erasureRoot", + "Hash" + ], + [ + "newValidationCode", + "Option" + ], + [ + "processedDownwardMessages", + "u32" + ] + ] + }, + "DownwardMessage": { + "type": "enum", + "type_mapping": [ + [ + "TransferInto", + "(AccountId, Balance, Remark)" + ], + [ + "Opaque", + "Vec" + ] + ] + }, + "GlobalValidationSchedule": { + "type": "struct", + "type_mapping": [ + [ + "maxCodeSize", + "u32" + ], + [ + "maxHeadDataSize", + "u32" + ], + [ + "blockNumber", + "BlockNumber" + ] + ] + }, + "HeadData": "Bytes", + "LocalValidationData": { + "type": "struct", + "type_mapping": [ + [ + "parentHead", + "HeadData" + ], + [ + "balance", + "Balance" + ], + [ + "codeUpgradeAllowed", + "Option" + ] + ] + }, + "ParachainDispatchOrigin": { + "type": "enum", + "value_list": [ + "Signed", + "Parachain", + "Root" + ] + }, + "RelayChainBlockNumber": "BlockNumber", + "Remark": "[u8; 32]", + "Retriable": { + "type": "enum", + "type_mapping": [ + [ + "Never", + "Null" + ], + [ + "WithRetries", + "u32" + ] + ] + }, + "Scheduling": { + "type": "enum", + "value_list": [ + "Always", + "Dynamic" + ] + }, + "UpwardMessage": { + "type": "struct", + "type_mapping": [ + [ + "origin", + "ParachainDispatchOrigin" + ], + [ + "data", + "Vec" + ] + ] + }, + "AssetOptions": { + "type": "struct", + "type_mapping": [ + [ + "initalIssuance", + "Compact" + ], + [ + "permissions", + "PermissionLatest" + ] + ] + }, + "Owner": { + "type": "enum", + "type_mapping": [ + [ + "None", + "Null" + ], + [ + "Address", + "AccountId" + ] + ] + }, + "PermissionsV1": { + "type": "struct", + "type_mapping": [ + [ + "update", + "Owner" + ], + [ + "mint", + "Owner" + ], + [ + "burn", + "Owner" + ] + ] + }, + "PermissionVersions": { + "type": "enum", + "type_mapping": [ + [ + "V1", + "PermissionsV1" + ] + ] + }, + "PermissionLatest": "PermissionsV1", + "Approvals": "[bool; 4]", + "ContractExecResultSuccessTo255": { + "type": "struct", + "type_mapping": [ + [ + "status", + "u8" + ], + [ + "data", + "Raw" + ] + ] + }, + "ContractExecResultTo255": { + "type": "enum", + "type_mapping": [ + [ + "Success", + "ContractExecResultSuccessTo255" + ], + [ + "Error", + "Null" + ] + ] + }, + "AccountStatus": { + "type": "struct", + "type_mapping": [ + [ + "validity", + "AccountValidity" + ], + [ + "freeBalance", + "Balance" + ], + [ + "lockedBalance", + "Balance" + ], + [ + "signature", + "Vec" + ], + [ + "vat", + "Permill" + ] + ] + }, + "AccountValidity": { + "type": "enum", + "value_list": [ + "Invalid", + "Initiated", + "Pending", + "ValidLow", + "ValidHigh", + "Completed" + ] + } + } +} diff --git a/py-scale-codec/scalecodec/type_registry/edgeware.json b/py-scale-codec/scalecodec/type_registry/edgeware.json new file mode 100644 index 00000000..54d0aec3 --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/edgeware.json @@ -0,0 +1,124 @@ +{ + "runtime_id": 27, + "types": { + "Keys": { + "type": "struct", + "type_mapping": [ + ["grandpa", "AccountId"], + ["babe", "AccountId"], + ["im_online", "AccountId"], + ["authority_discovery", "AccountId"] + ] + }, + "BlockNumber": "U32", + "SessionIndex": "U32", + "AuctionIndex": "U32", + "AuthIndex": "U32", + "BalanceUpload": "(AccountId, u64)", + "EgressQueueRoot": "(ParaId, Hash)", + "EventIndex": "u32", + "LeasePeriodOf": "LeasePeriod", + "LeasePeriod": "BlockNumber", + "MemberCount": "u32", + "MomentOf": "Moment", + "Offender": "(ValidatorId, Exposure)", + "ReportIdOf": "Hash", + "SubId": "u32", + "Weight": "u32", + "WeightMultiplier": "u64", + "WinningData": "Vec", + "Index": "U32", + "Kind": "[u8; 16]", + "OpaqueTimeSlot": "Bytes", + "Box<>::Proposal>": "BoxProposal", + "Forcing": { + "type": "enum", + "value_list": [ + "NotForcing", + "ForceNew", + "ForceNone" + ] + }, + "VoteData": { + "type": "struct", + "type_mapping": [ + ["initiator", "AccountId"], + ["stage", "VoteStage"], + ["vote_type", "VoteType"], + ["tally_type", "TallyType"], + ["is_commit_reveal", "Bool"] + ] + }, + "VoteRecord": { + "type": "struct", + "type_mapping": [ + ["id", "u64"], + ["commitments", "Vec<(AccountId, VoteOutcome)>"], + ["reveals", "Vec<(AccountId, VoteOutcome)>"], + ["data", "VoteData"], + ["outcomes", "Vec<(VoteOutcome)>"] + ] + }, + "VoteType": { + "type": "enum", + "value_list": ["Binary", "MultiOption"] + }, + "IdentityStage": { + "type": "enum", + "value_list": ["Registered", "Attested", "Verified"] + }, + "IdentityRecord": { + "type": "struct", + "type_mapping": [ + ["account", "AccountId"], + ["identity_type", "String"], + ["identity", "Bytes"], + ["stage", "IdentityStage"], + ["expiration_time", "BlockNumber"], + ["proof", "Bytes"], + ["metadata", "Bytes"] + ] + }, + "MetadataRecord": { + "type": "struct", + "type_mapping": [ + ["avatar", "String"], + ["display_name", "String"], + ["tagline", "String"] + ] + }, + "ProposalCategory": { + "type": "enum", + "value_list": ["Signaling"] + }, + "ProposalStage": { + "type": "enum", + "value_list": ["PreVoting", "Voting", "Completed"] + }, + "ProposalRecord": { + "type": "struct", + "type_mapping": [ + ["index", "u32"], + ["author", "AccountId"], + ["stage", "ProposalStage"], + ["transition_time", "BlockNumber"], + ["category", "ProposalCategory"], + ["title", "Vec"], + ["contents", "Vec"], + ["vote_id", "u64"], + ["ProposalTitle", "Vec"], + ["ProposalContents", "Vec"] + ] + }, + "Balance2": "Balance", + "ReferendumInfo": { + "type": "struct", + "type_mapping": [ + ["end", "BlockNumber"], + ["proposal", "Proposal"], + ["threshold", "VoteThreshold"], + ["delay", "BlockNumber"] + ] + } + } +} diff --git a/py-scale-codec/scalecodec/type_registry/joystream.json b/py-scale-codec/scalecodec/type_registry/joystream.json new file mode 100644 index 00000000..607051b2 --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/joystream.json @@ -0,0 +1,49 @@ +{ + "runtime_id": 4, + "types": { + "ValidatorPrefs": "ValidatorPrefsLegacy", + "Index": "U64", + "::ContentId": "ContentId", + "RoleParameters": { + "type": "struct", + "type_mapping": [ + ["min_stake", "BalanceOf"], + ["min_actors", "u32"], + ["max_actors", "u32"], + ["reward", "BalanceOf"], + ["reward_period", "BlockNumber"], + ["bonding_period", "BlockNumber"], + ["unbonding_period", "BlockNumber"], + ["min_service_period", "BlockNumber"], + ["startup_grace_period", "BlockNumber"], + ["entry_request_fee", "BalanceOf"] + ] + }, + "Actor": { + "type": "struct", + "type_mapping": [ + ["member_id", "MemberId"], + ["role", "Role"], + ["account", "AccountId"], + ["joined_at", "BlockNumber"] + ] + }, + "DataObjectStorageRelationship": { + "type": "struct", + "type_mapping": [ + ["content_id", "ContentId"], + ["storage_provider", "AccountId"], + ["ready", "bool"] + ] + }, + "DataObjectType": { + "type": "struct", + "type_mapping": [ + ["description", "Vec"], + ["active", "bool"] + ] + }, + "DataObjectTypeId": "u64", + "::DataObjectTypeId": "u64" + } +} diff --git a/py-scale-codec/scalecodec/type_registry/kulupu.json b/py-scale-codec/scalecodec/type_registry/kulupu.json new file mode 100644 index 00000000..d929cf95 --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/kulupu.json @@ -0,0 +1,30 @@ +{ + "runtime_id": 11, + "types": { + "BlockNumber": "U32", + "Weight": "u64", + "DispatchInfo": { + "type": "struct", + "type_mapping": [ + ["weight", "Weight"], + ["class", "DispatchClass"], + ["paysFee", "Pays"] + ] + }, + "RefCount": "u32" + }, + "versioning": [ + { + "runtime_range": [0, 10], + "types": { + "RefCount": "u8" + } + }, + { + "runtime_range": [11, null], + "types": { + "RefCount": "u32" + } + } + ] +} diff --git a/py-scale-codec/scalecodec/type_registry/kusama.json b/py-scale-codec/scalecodec/type_registry/kusama.json new file mode 100644 index 00000000..e39bee9b --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/kusama.json @@ -0,0 +1,340 @@ +{ + "runtime_id": 2026, + "types": { + "Address": "AccountIdAddress", + "BlockNumber": "U32", + "LeasePeriod": "BlockNumber", + "Weight": "u64", + "SessionKeysPolkadot": { + "type": "struct", + "type_mapping": [ + ["grandpa", "AccountId"], + ["babe", "AccountId"], + ["im_online", "AccountId"], + ["authority_discovery", "AccountId"], + ["parachains", "AccountId"] + ] + }, + "Keys": "SessionKeysPolkadot", + "DispatchInfo": { + "type": "struct", + "type_mapping": [ + ["weight", "Weight"], + ["class", "DispatchClass"], + ["paysFee", "Pays"] + ] + }, + "ProxyType": { + "type": "enum", + "value_list": [ + "Any", + "NonTransfer", + "Governance", + "Staking", + "IdentityJudgement" + ] + }, + "RefCount": "u32" + }, + "versioning": [ + { + "runtime_range": [1019, 1031], + "types": { + "DispatchError": { + "type": "struct", + "type_mapping": [ + ["module", "Option"], + ["error", "u8"] + ] + } + } + }, + { + "runtime_range": [1032, null], + "types": { + "DispatchError": { + "type": "enum", + "type_mapping": [ + ["Other", "Null"], + ["CannotLookup", "Null"], + ["BadOrigin", "Null"], + ["Module", "DispatchErrorModule"] + ] + } + } + }, + { + "runtime_range": [1019, 1037], + "types": { + "IdentityInfo": { + "type": "struct", + "type_mapping": [ + ["additional", "Vec"], + ["display", "Data"], + ["legal", "Data"], + ["web", "Data"], + ["riot", "Data"], + ["email", "Data"], + ["pgpFingerprint", "Option"], + ["image", "Data"] + ] + } + } + }, + { + "runtime_range": [1038, null], + "types": { + "IdentityInfo": { + "type": "struct", + "type_mapping": [ + ["additional", "Vec"], + ["display", "Data"], + ["legal", "Data"], + ["web", "Data"], + ["riot", "Data"], + ["email", "Data"], + ["pgpFingerprint", "Option"], + ["image", "Data"], + ["twitter", "Data"] + ] + } + } + }, + { + "runtime_range": [1019, 1042], + "types": { + "SlashingSpans": { + "type": "struct", + "type_mapping": [ + ["spanIndex", "SpanIndex"], + ["lastStart", "EraIndex"], + ["prior", "Vec"] + ] + } + } + }, + { + "runtime_range": [1043, null], + "types": { + "SlashingSpans": { + "type": "struct", + "type_mapping": [ + ["spanIndex", "SpanIndex"], + ["lastStart", "EraIndex"], + ["lastNonzeroSlash", "EraIndex"], + ["prior", "Vec"] + ] + } + } + }, + { + "runtime_range": [1019, 1045], + "types": { + "Address": "RawAddress", + "StakingLedger": "StakingLedgerTo223", + "BalanceLock": { + "type": "struct", + "type_mapping": [ + ["id", "LockIdentifier"], + ["amount", "Balance"], + ["until", "BlockNumber"], + ["reasons", "WithdrawReasons"] + ] + } + } + }, + { + "runtime_range": [1050, 1056], + "types": { + "Address": "AccountIdAddress", + "StakingLedger": "StakingLedgerTo240", + "BalanceLock": { + "type": "struct", + "type_mapping": [ + ["id", "LockIdentifier"], + ["amount", "Balance"], + ["reasons", "Reasons"] + ] + } + } + }, + { + "runtime_range": [1057, null], + "types": { + "Address": "AccountIdAddress", + "StakingLedger": { + "type": "struct", + "type_mapping": [ + [ + "stash", + "AccountId" + ], + [ + "total", + "Compact" + ], + [ + "active", + "Compact" + ], + [ + "unlocking", + "Vec" + ], + [ + "claimedRewards", + "Vec" + ] + ] + }, + "BalanceLock": { + "type": "struct", + "type_mapping": [ + ["id", "LockIdentifier"], + ["amount", "Balance"], + ["reasons", "Reasons"] + ] + } + } + }, + { + "runtime_range": [1019, 1054], + "types": { + "ReferendumInfo": { + "type": "struct", + "type_mapping": [ + ["end", "BlockNumber"], + ["proposal", "Proposal"], + ["threshold", "VoteThreshold"], + ["delay", "BlockNumber"] + ] + } + } + }, + { + "runtime_range": [1054, null], + "types": { + "ReferendumInfo": { + "type": "enum", + "type_mapping": [ + ["Ongoing", "ReferendumStatus"], + ["Finished", "ReferendumInfoFinished"] + ] + } + } + }, + { + "runtime_range": [1019, 1056], + "types": { + "Weight": "u32" + } + }, + { + "runtime_range": [1057, null], + "types": { + "Weight": "u64" + } + }, + { + "runtime_range": [1019, 1061], + "types": { + "Heartbeat": { + "type": "struct", + "type_mapping": [ + ["blockNumber", "BlockNumber"], + ["networkState", "OpaqueNetworkState"], + ["sessionIndex", "SessionIndex"], + ["authorityIndex", "AuthIndex"] + ] + }, + "DispatchInfo": { + "type": "struct", + "type_mapping": [ + ["weight", "Weight"], + ["class", "DispatchClass"], + ["paysFee", "bool"] + ] + } + } + }, + { + "runtime_range": [1062, null], + "types": { + "Heartbeat": { + "type": "struct", + "type_mapping": [ + ["blockNumber", "BlockNumber"], + ["networkState", "OpaqueNetworkState"], + ["sessionIndex", "SessionIndex"], + ["authorityIndex", "AuthIndex"], + ["validatorsLen", "u32"] + ] + }, + "DispatchInfo": { + "type": "struct", + "type_mapping": [ + ["weight", "Weight"], + ["class", "DispatchClass"], + ["paysFee", "Pays"] + ] + } + } + }, + { + "runtime_range": [1019, 2012], + "types": { + "OpenTip": { + "type": "struct", + "type_mapping": [ + ["reason", "Hash"], + ["who", "AccountId"], + ["finder", "Option"], + ["closes", "Option"], + ["tips", "Vec"] + ] + } + } + }, + { + "runtime_range": [2013, null], + "types": { + "OpenTip": { + "type": "struct", + "type_mapping": [ + ["reason", "Hash"], + ["who", "AccountId"], + ["finder", "AccountId"], + ["deposit", "Balance"], + ["closes", "Option"], + ["tips", "Vec"], + ["findersFee", "bool"] + ] + } + } + }, + { + "runtime_range": [1019, 2022], + "types": { + "CompactAssignments": "CompactAssignmentsTo257" + } + }, + { + "runtime_range": [2023, null], + "types": { + "CompactAssignments": "CompactAssignmentsFrom258" + } + }, + { + "runtime_range": [1019, 2024], + "types": { + "RefCount": "u8" + } + }, + { + "runtime_range": [2025, null], + "types": { + "RefCount": "u32" + } + } + ] +} diff --git a/py-scale-codec/scalecodec/type_registry/nodle.json b/py-scale-codec/scalecodec/type_registry/nodle.json new file mode 100644 index 00000000..6a4a1d78 --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/nodle.json @@ -0,0 +1,15 @@ +{ + "runtime_id": 13, + "types": { + "BlockNumber": "u32", + "Keys": { + "type": "struct", + "type_mapping": [ + ["grandpa", "AccountId"], + ["babe", "AccountId"], + ["im_online", "AccountId"], + ["authority_discovery", "AccountId"] + ] + } + } +} diff --git a/py-scale-codec/scalecodec/type_registry/plasm.json b/py-scale-codec/scalecodec/type_registry/plasm.json new file mode 100644 index 00000000..82291924 --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/plasm.json @@ -0,0 +1,89 @@ +{ + "types": { + "Keys": { + "type": "struct", + "type_mapping": [ + ["grandpa", "AccountId"], + ["babe", "AccountId"] + ] + }, + "Balance": "u128", + "Index": "U32", + "Era": "[u8; 2]", + "BlockNumber": "U32", + "Range": { + "type": "struct", + "type_mapping": [ + ["start", "u128"], + ["end", "u128"] + ] + }, + "StateObject": { + "type": "struct", + "type_mapping": [ + ["predicate", "AccountId"], + ["data", "Vec"] + ] + }, + "StateUpdate": { + "type": "struct", + "type_mapping": [ + ["range", "Range"], + ["state_object", "StateObject"], + ["plasma_block_number", "BlockNumber"] + ] + }, + "Checkpoint": { + "type": "struct", + "type_mapping": [ + ["state_update", "StateUpdate"], + ["sub_range", "Range"] + ] + }, + "Transaction": { + "type": "struct", + "type_mapping": [ + ["predicate", "AccountId"], + ["range", "Range"], + ["body", "Range"] + ] + }, + "TransactionBody": { + "type": "struct", + "type_mapping": [ + ["new_state", "StateObject"], + ["origin_block", "BlockNumber"], + ["max_block", "BlockNumber"] + ] + }, + "Challenge": { + "type": "struct", + "type_mapping": [ + ["challenged_checkpoint", "Checkpoint"], + ["challenging_checkpoint", "Checkpoint"] + ] + }, + "MerkleIntervalTreeInternalNode": { + "type": "struct", + "type_mapping": [ + ["index", "Index"], + ["hash", "Hash"] + ] + }, + "InclusionProof": { + "type": "struct", + "type_mapping": [ + ["proofs", "Vec"], + ["idx", "u128"] + ] + }, + "Parameters": { + "type": "struct", + "type_mapping": [ + ["can_be_nominated", "bool"], + ["option_expired", "u128"], + ["option_p", "u32"] + ] + } + } +} diff --git a/py-scale-codec/scalecodec/type_registry/polkadot.json b/py-scale-codec/scalecodec/type_registry/polkadot.json new file mode 100644 index 00000000..3b00b96e --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/polkadot.json @@ -0,0 +1,98 @@ +{ + "runtime_id": 26, + "types": { + "Address": "AccountIdAddress", + "BlockNumber": "U32", + "LeasePeriod": "BlockNumber", + "Weight": "u64", + "SessionKeysPolkadot": { + "type": "struct", + "type_mapping": [ + ["grandpa", "AccountId"], + ["babe", "AccountId"], + ["im_online", "AccountId"], + ["authority_discovery", "AccountId"], + ["parachains", "AccountId"] + ] + }, + "Keys": "SessionKeysPolkadot", + "DispatchInfo": { + "type": "struct", + "type_mapping": [ + ["weight", "Weight"], + ["class", "DispatchClass"], + ["paysFee", "Pays"] + ] + }, + "ProxyType": { + "type": "enum", + "value_list": [ + "Any", + "NonTransfer", + "Governance", + "Staking", + "SudoBalances", + "IdentityJudgement" + ] + }, + "RefCount": "u32" + }, + "versioning": [ + { + "runtime_range": [0, 12], + "types": { + "OpenTip": { + "type": "struct", + "type_mapping": [ + ["reason", "Hash"], + ["who", "AccountId"], + ["finder", "Option"], + ["closes", "Option"], + ["tips", "Vec"] + ] + } + } + }, + { + "runtime_range": [13, null], + "types": { + "OpenTip": { + "type": "struct", + "type_mapping": [ + ["reason", "Hash"], + ["who", "AccountId"], + ["finder", "AccountId"], + ["deposit", "Balance"], + ["closes", "Option"], + ["tips", "Vec"], + ["findersFee", "bool"] + ] + } + } + }, + { + "runtime_range": [0, 22], + "types": { + "CompactAssignments": "CompactAssignmentsTo257" + } + }, + { + "runtime_range": [23, null], + "types": { + "CompactAssignments": "CompactAssignmentsFrom258" + } + }, + { + "runtime_range": [0, 24], + "types": { + "RefCount": "u8" + } + }, + { + "runtime_range": [25, null], + "types": { + "RefCount": "u32" + } + } + ] +} diff --git a/py-scale-codec/scalecodec/type_registry/polymesh.json b/py-scale-codec/scalecodec/type_registry/polymesh.json new file mode 100644 index 00000000..5e05f963 --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/polymesh.json @@ -0,0 +1,1531 @@ +{ + "types": { + "ValidatorPrefsWithBlocked": { + "type": "struct", + "type_mapping": [ + ["commission", "Compact"] + ] + }, + "IdentityId": "H256", + "EventDid": "IdentityId", + "InvestorUid": "[u8; 16]", + "Ticker": "Ticker", + "CddId": "H256", + "ScopeId": "H256", + "(u32, u32)": { + "type": "struct", + "type_mapping": [ + ["u32", "u32"], + ["u32", "u32"] + ] + }, + "PosRatio": "(u32, u32)", + "DocumentId": "u32", + "DocumentName": "String", + "DocumentUri": "String", + "DocumentHash": { + "type": "enum", + "type_mapping": [ + ["None", "Null"], + ["H512", "[u8; 64]"], + ["H384", "[u8; 48]"], + ["H320", "[u8; 40]"], + ["H256", "[u8; 32]"], + ["H224", "[u8; 28]"], + ["H192", "[u8; 24]"], + ["H160", "[u8; 20]"], + ["H128", "[u8; 16]"] + ] + }, + "DocumentType": "String", + "Document": { + "type": "struct", + "type_mapping": [ + ["uri", "DocumentUri"], + ["content_hash", "DocumentHash"], + ["name", "DocumentName"], + ["doc_type", "Option"], + ["filing_date", "Option"] + ] + }, + "Version": "u8", + "AssetType": { + "type": "enum", + "type_mapping": [ + ["EquityCommon", "Null"], + ["EquityPreferred", "Null"], + ["Commodity", "Null"], + ["FixedIncome", "Null"], + ["REIT", "Null"], + ["Fund", "Null"], + ["RevenueShareAgreement", "Null"], + ["StructuredProduct", "Null"], + ["Derivative", "Null"], + ["Custom", "Vec"], + ["StableCoin", "Null"] + ] + }, + "AssetIdentifier": { + "type": "enum", + "type_mapping": [ + ["CUSIP", "[u8; 9]"], + ["CINS", "[u8; 9]"], + ["ISIN", "[u8; 12]"], + ["LEI", "[u8; 20]"] + ] + }, + "AssetOwnershipRelation": { + "type": "enum", + "type_mapping": [ + ["NotOwned", "Null"], + ["TickerOwned", "Null"], + ["AssetOwned", "Null"] + ] + }, + "AssetName": "String", + "FundingRoundName": "String", + "VenueDetails": "String", + "SecurityToken": { + "type": "struct", + "type_mapping": [ + ["name", "AssetName"], + ["total_supply", "Balance"], + ["owner_did", "IdentityId"], + ["divisible", "bool"], + ["asset_type", "AssetType"], + ["primary_issuance_agent", "Option"] + ] + }, + "PalletName": "String", + "DispatchableName": "String", + "PalletPermissions": { + "type": "struct", + "type_mapping": [ + ["pallet_name", "PalletName"], + ["dispatchable_names", "Option>"] + ] + }, + "Permissions": { + "type": "struct", + "type_mapping": [ + ["asset", "Option>"], + ["extrinsic", "Option>"], + ["portfolio", "Option>"] + ] + }, + "LegacyPalletPermissions": { + "type": "struct", + "type_mapping": [ + ["pallet_name", "PalletName"], + ["total", "bool"], + ["dispatchable_names", "Vec"] + ] + }, + "LegacyPermissions": { + "type": "struct", + "type_mapping": [ + ["asset", "Option>"], + ["extrinsic", "Option>"], + ["portfolio", "Option>"] + ] + }, + "Signatory": { + "type": "enum", + "type_mapping": [ + ["Identity", "IdentityId"], + ["Account", "AccountId"] + ] + }, + "SecondaryKey": { + "type": "struct", + "type_mapping": [ + ["signer", "Signatory"], + ["permissions", "Permissions"] + ] + }, + "SecondaryKeyWithAuth": { + "type": "struct", + "type_mapping": [ + ["secondary_key", "SecondaryKey"], + ["auth_signature", "Signature"] + ] + }, + "IdentityRole": { + "type": "enum", + "value_list": [ + "Issuer", + "SimpleTokenIssuer", + "Validator", + "ClaimIssuer", + "Investor", + "NodeRunner", + "PM", + "CDDAMLClaimIssuer", + "AccreditedInvestorClaimIssuer", + "VerifiedIdentityClaimIssuer" + ] + }, + "PreAuthorizedKeyInfo": { + "type": "struct", + "type_mapping": [ + ["target_id", "IdentityId"], + ["secondary_key", "SecondaryKey"] + ] + }, + "DidRecord": { + "type": "struct", + "type_mapping": [ + ["primary_key", "AccountId"], + ["secondary_key", "Vec"] + ] + }, + "KeyIdentityData": { + "type": "struct", + "type_mapping": [ + ["identity", "IdentityId"], + ["permissions", "Option"] + ] + }, + "CountryCode": { + "type": "enum", + "value_list": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BA", + "BW", + "BV", + "BR", + "VG", + "IO", + "BN", + "BG", + "BF", + "BI", + "KH", + "CM", + "CA", + "CV", + "KY", + "CF", + "TD", + "CL", + "CN", + "HK", + "MO", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MK", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "AN", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SZ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW", + "BQ", + "CW", + "SX" + ] + }, + "Scope": { + "type": "enum", + "type_mapping": [ + [ "Identity", "IdentityId"], + [ "Ticker", "Ticker"], + [ "Custom", "Vec"] + ] + }, + "InvestorZKProofData": "Signature", + "Scalar": "[u8; 32]", + "RistrettoPoint": "[u8; 32]", + "ZkProofData": { + "type": "struct", + "type_mapping": [ + ["challenge_responses", "[Scalar; 2]"], + ["subtract_expressions_res", "RistrettoPoint"], + ["blinded_scope_did_hash", "RistrettoPoint"] + ] + }, + "ScopeClaimProof": { + "type": "struct", + "type_mapping": [ + ["proof_scope_id_wellformed", "Signature"], + ["proof_scope_id_cdd_id_match", "ZkProofData"], + ["scope_id", "RistrettoPoint"] + ] + }, + "Claim": { + "type": "enum", + "type_mapping": [ + ["Accredited", "Scope"], + ["Affiliate", "Scope"], + ["BuyLockup", "Scope"], + ["SellLockup", "Scope"], + ["CustomerDueDiligence", "CddId"], + ["KnowYourCustomer", "Scope"], + ["Jurisdiction", "(CountryCode, Scope)"], + ["Exempted", "Scope"], + ["Blocked", "Scope"], + ["InvestorUniqueness", "(Scope, ScopeId, CddId)"], + ["NoData", "Null"], + ["InvestorUniquenessV2", "(CddId)"] + ] + }, + "ClaimType": { + "type": "enum", + "type_mapping": [ + ["Accredited", "Null"], + ["Affiliate", "Null"], + ["BuyLockup", "Null"], + ["SellLockup", "Null"], + ["CustomerDueDiligence", "Null"], + ["KnowYourCustomer", "Null"], + ["Jurisdiction", "Null"], + ["Exempted", "Null"], + ["Blocked", "Null"], + ["InvestorUniqueness", "Null"], + ["NoData", "Null"] + ] + }, + "IdentityClaim": { + "type": "struct", + "type_mapping": [ + ["claim_issuer", "IdentityId"], + ["issuance_date", "Moment"], + ["last_update_date", "Moment"], + ["expiry", "Option"], + ["claim", "Claim"] + ] + }, + "IdentityClaimKey": { + "type": "struct", + "type_mapping": [ + ["id", "IdentityId"], + ["claim_type", "ClaimType"] + ] + }, + "ComplianceRequirement": { + "type": "struct", + "type_mapping": [ + ["sender_conditions", "Vec"], + ["receiver_conditions", "Vec"], + ["id", "u32"] + ] + }, + "ComplianceRequirementResult": { + "type": "struct", + "type_mapping": [ + ["sender_conditions", "Vec"], + ["receiver_conditions", "Vec"], + ["id", "u32"], + ["result", "bool"] + ] + }, + "ConditionType": { + "type": "enum", + "type_mapping": [ + ["IsPresent", "Claim"], + ["IsAbsent", "Claim"], + ["IsAnyOf", "Vec"], + ["IsNoneOf", "Vec"], + ["IsIdentity", "TargetIdentity"] + ] + }, + "TrustedFor": { + "type": "enum", + "type_mapping": [ + ["Any", "Null"], + ["Specific", "Vec"] + ] + }, + "TrustedIssuer": { + "type": "struct", + "type_mapping": [ + ["issuer", "IdentityId"], + ["trusted_for", "TrustedFor"] + ] + }, + "Condition": { + "type": "struct", + "type_mapping": [ + ["condition_type", "ConditionType"], + ["issuers", "Vec"] + ] + }, + "ConditionResult": { + "type": "struct", + "type_mapping": [ + ["condition", "Condition"], + ["result", "bool"] + ] + }, + "SimpleTokenRecord": { + "type": "struct", + "type_mapping": [ + ["ticker", "Ticker"], + ["total_supply", "Balance"], + ["owner_did", "IdentityId"] + ] + }, + "FeeOf": "Balance", + "TargetIdAuthorization": { + "type": "struct", + "type_mapping": [ + ["target_id", "IdentityId"], + ["nonce", "u64"], + ["expires_at", "Moment"] + ] + }, + "TickerRegistration": { + "type": "struct", + "type_mapping": [ + ["owner", "IdentityId"], + ["expiry", "Option"] + ] + }, + "TickerRegistrationConfig": { + "type": "struct", + "type_mapping": [ + ["max_ticker_length", "u8"], + ["registration_length", "Option"] + ] + }, + "ClassicTickerRegistration": { + "type": "struct", + "type_mapping": [ + ["eth_owner", "EthereumAddress"], + ["is_created", "bool"] + ] + }, + "ClassicTickerImport": { + "type": "struct", + "type_mapping": [ + ["eth_owner", "EthereumAddress"], + ["ticker", "Ticker"], + ["is_contract", "bool"], + ["is_created", "bool"] + ] + }, + "EthereumAddress": "[u8; 20]", + "EcdsaSignature": "[u8; 65]", + "MotionTitle": "String", + "MotionInfoLink": "String", + "ChoiceTitle": "String", + "Motion": { + "type": "struct", + "type_mapping": [ + ["title", "MotionTitle"], + ["info_link", "MotionInfoLink"], + ["choices", "Vec"] + ] + }, + "BallotTitle": "String", + "BallotMeta": { + "type": "struct", + "type_mapping": [ + ["title", "BallotTitle"], + ["motions", "Vec"] + ] + }, + "BallotTimeRange": { + "type": "struct", + "type_mapping": [ + ["start", "Moment"], + ["end", "Moment"] + ] + }, + "BallotVote": { + "type": "struct", + "type_mapping": [ + ["power", "Balance"], + ["fallback", "Option"] + ] + }, + "MaybeBlock": { + "type": "enum", + "type_mapping": [ + ["Some", "BlockNumber"], + ["None", "Null"] + ] + }, + "Url": "String", + "PipDescription": "String", + "PipsMetadata": { + "type": "struct", + "type_mapping": [ + ["id", "PipId"], + ["url", "Option"], + ["description", "Option"], + ["created_at", "BlockNumber"], + ["transaction_version", "u32"], + ["expiry", "MaybeBlock"] + ] + }, + "Proposer": { + "type": "enum", + "type_mapping": [ + ["Community", "AccountId"], + ["Committee", "Committee"] + ] + }, + "Committee": { + "type": "enum", + "type_mapping": [ + ["Technical", "Null"], + ["Upgrade", "Null"] + ] + }, + "SkippedCount": "u8", + "SnapshottedPip": { + "type": "struct", + "type_mapping": [ + ["id", "PipId"], + ["weight", "(bool, Balance)"] + ] + }, + "SnapshotId": "u32", + "SnapshotMetadata": { + "type": "struct", + "type_mapping": [ + ["created_at", "BlockNumber"], + ["made_by", "AccountId"], + ["id", "SnapshotId"] + ] + }, + "SnapshotResult": { + "type": "enum", + "type_mapping": [ + ["Approve", "Null"], + ["Reject", "Null"], + ["Skip", "Null"] + ] + }, + "Beneficiary": { + "type": "struct", + "type_mapping": [ + ["id", "IdentityId"], + ["amount", "Balance"] + ] + }, + "DepositInfo": { + "type": "struct", + "type_mapping": [ + ["owner", "AccountId"], + ["amount", "Balance"] + ] + }, + "PolymeshVotes": { + "type": "struct", + "type_mapping": [ + ["index", "u32"], + ["ayes", "Vec<(IdentityId, Balance)>"], + ["nays", "Vec<(IdentityId, Balance)>"], + ["end", "BlockNumber"], + ["expiry", "MaybeBlock"] + ] + }, + "PipId": "u32", + "ProposalState": { + "type": "enum", + "value_list": ["Pending", "Rejected", "Scheduled", "Failed", "Executed", "Expired"] + }, + "Pip": { + "type": "struct", + "type_mapping": [ + ["id", "PipId"], + ["proposal", "Call"], + ["state", "ProposalState"], + ["proposer", "Proposer"] + ] + }, + "ProposalData" : { + "type": "enum", + "type_mapping": [ + ["Hash", "Hash"], + ["Proposal", "HexBytes"] + ] + }, + "TickerTransferApproval": { + "type": "struct", + "type_mapping": [ + ["authorized_by", "IdentityId"], + ["next_ticker", "Option"], + ["previous_ticker", "Option"] + ] + }, + "OffChainSignature": { + "type": "enum", + "type_mapping": [ + ["Ed25519", "H512"], + ["Sr25519", "H512"], + ["Ecdsa", "H512"] + ] + }, + "Authorization": { + "type": "struct", + "type_mapping": [ + ["authorization_data", "AuthorizationData"], + ["authorized_by", "IdentityId"], + ["expiry", "Option"], + ["auth_id", "u64"] + ] + }, + "AuthorizationData": { + "type": "enum", + "type_mapping": [ + ["AttestPrimaryKeyRotation", "IdentityId"], + ["RotatePrimaryKey", "IdentityId"], + ["TransferTicker", "Ticker"], + ["TransferPrimaryIssuanceAgent", "Ticker"], + ["AddMultiSigSigner", "AccountId"], + ["TransferAssetOwnership", "Ticker"], + ["JoinIdentity", "Permissions"], + ["PortfolioCustody", "PortfolioId"], + ["Custom", "Ticker"], + ["NoData", "Null"], + ["TransferCorporateActionAgent", "Ticker"] + ] + }, + "AuthIdentifier": { + "type": "struct", + "type_mapping": [ + ["signatory", "Signatory"], + ["auth_id", "u64"] + ] + }, + "SmartExtensionType": { + "type": "enum", + "type_mapping": [ + ["TransferManager", "Null"], + ["Offerings", "Null"], + ["SmartWallet", "Null"], + ["Custom", "Vec"] + ] + }, + "SmartExtensionName": "String", + "SmartExtension": { + "type": "struct", + "type_mapping": [ + ["extension_type", "SmartExtensionType"], + ["extension_name", "SmartExtensionName"], + ["extension_id", "AccountId"], + ["is_archive", "bool"] + ] + }, + "MetaUrl": "String", + "MetaDescription": "String", + "MetaVersion": "u32", + "ExtVersion": "u32", + "TemplateMetadata": { + "type": "struct", + "type_mapping": [ + ["url", "Option"], + ["se_type", "SmartExtensionType"], + ["usage_fee", "Balance"], + ["description", "MetaDescription"], + ["version", "MetaVersion"] + ] + }, + "TemplateDetails": { + "type": "struct", + "type_mapping": [ + ["instantiation_fee", "Balance"], + ["owner", "IdentityId"], + ["frozen", "bool"] + ] + }, + "ProportionMatch": { + "type": "enum", + "value_list": ["AtLeast", "MoreThan"] + }, + "AuthorizationNonce": "u64", + "Counter": "u64", + "Percentage": "Permill", + "TransferManager": { + "type": "enum", + "type_mapping": [ + ["CountTransferManager", "Counter"], + ["PercentageTransferManager", "Percentage"] + ] + }, + "RestrictionResult": { + "type": "enum", + "value_list": ["Valid", "Invalid", "ForceValid"] + }, + "Memo": "[u8; 32]", + "IssueRecipient": { + "type": "enum", + "type_mapping": [ + ["Account", "AccountId"], + ["Identity", "IdentityId"] + ] + }, + "BridgeTx": { + "type": "struct", + "type_mapping": [ + ["nonce", "u32"], + ["recipient", "AccountId"], + ["value", "Balance"], + ["tx_hash", "H256"] + ] + }, + "PendingTx": { + "type": "struct", + "type_mapping": [ + ["did", "IdentityId"], + ["bridge_tx", "BridgeTx"] + ] + }, + "OfflineSlashingParams": { + "type": "struct", + "type_mapping": [ + ["max_offline_percent", "u32"], + ["constant", "u32"], + ["max_slash_percent", "u32"] + ] + }, + "AssetCompliance": { + "type": "struct", + "type_mapping": [ + ["is_paused", "bool"], + ["requirements", "Vec"] + ] + }, + "AssetComplianceResult": { + "type": "struct", + "type_mapping": [ + ["paused", "bool"], + ["requirements", "Vec"], + ["result", "bool"] + ] + }, + "Claim1stKey": { + "type": "struct", + "type_mapping": [ + ["target", "IdentityId"], + ["claim_type", "ClaimType"] + ] + }, + "Claim2ndKey": { + "type": "struct", + "type_mapping": [ + ["issuer", "IdentityId"], + ["scope", "Option"] + ] + }, + "BatchAddClaimItem": { + "type": "struct", + "type_mapping": [ + ["target", "IdentityId"], + ["claim", "Claim"], + ["expiry", "Option"] + ] + }, + "BatchRevokeClaimItem": { + "type": "struct", + "type_mapping": [ + ["target", "IdentityId"], + ["claim", "Claim"] + ] + }, + "InactiveMember": { + "type": "struct", + "type_mapping": [ + ["id", "IdentityId"], + ["deactivated_at", "Moment"], + ["expiry", "Option"] + ] + }, + "VotingResult": { + "type": "enum", + "type_mapping": [ + ["ayes_count", "u32"], + ["ayes_stake", "Balance"], + ["nays_count", "u32"], + ["nays_stake", "Balance"] + ] + }, + "ProtocolOp": { + "type": "enum", + "value_list": [ + "AssetRegisterTicker", + "AssetIssue", + "AssetAddDocument", + "AssetCreateAsset", + "AssetCreateCheckpointSchedule", + "DividendNew", + "ComplianceManagerAddComplianceRequirement", + "IdentityRegisterDid", + "IdentityCddRegisterDid", + "IdentityAddClaim", + "IdentitySetPrimaryKey", + "IdentityAddSecondaryKeysWithAuthorization", + "PipsPropose", + "VotingAddBallot", + "ContractsPutCode", + "BallotAttachBallot", + "DistributionDistribute" + ] + }, + "CddStatus": { + "type": "enum", + "type_mapping": [ + ["Ok", "IdentityId"], + ["Err", "Vec"] + ] + }, + "AssetDidResult": { + "type": "enum", + "type_mapping": [ + ["Ok", "IdentityId"], + ["Err", "Vec"] + ] + }, + "DidRecordsSuccess": { + "type": "struct", + "type_mapping": [ + ["primary_key", "AccountId"], + ["secondary_key", "Vec"] + ] + }, + "DidRecords": { + "type": "enum", + "type_mapping": [ + ["Success", "DidRecordsSuccess"], + ["IdNotFound", "Vec"] + ] + }, + "VoteCountProposalFound": { + "type": "struct", + "type_mapping": [ + ["ayes", "u64"], + ["nays", "u64"] + ] + }, + "VoteCount": { + "type": "enum", + "type_mapping": [ + ["ProposalFound", "VoteCountProposalFound"], + ["ProposalNotFound", "Vec"] + ] + }, + "Vote": "(bool, Balance)", + "VoteByPip": { + "type": "struct", + "type_mapping": [ + ["pip", "PipId"], + ["vote", "Vote"] + ] + }, + "HistoricalVotingByAddress": "Vec", + "HistoricalVotingById": "Vec<(AccountId, HistoricalVotingByAddress)>", + "BridgeTxDetail": { + "type": "struct", + "type_mapping": [ + ["amount", "Balance"], + ["status", "BridgeTxStatus"], + ["execution_block", "BlockNumber"], + ["tx_hash", "H256"] + ] + }, + "BridgeTxStatus": { + "type": "enum", + "type_mapping": [ + ["Absent", "Null"], + ["Pending", "u8"], + ["Frozen", "Null"], + ["Timelocked", "Null"], + ["Handled", "Null"] + ] + }, + "HandledTxStatus": { + "type": "enum", + "type_mapping": [ + ["Success", "Null"], + ["Error", "String"] + ] + }, + "CappedFee": "u64", + "CanTransferResult": { + "type": "struct", + "type_mapping": [ + ["Ok", "u8"], + ["Err", "Vec"] + ] + }, + "AuthorizationType": { + "type": "enum", + "value_list": [ + "AttestPrimaryKeyRotation", + "RotatePrimaryKey", + "TransferTicker", + "TransferPrimaryIssuanceAgent", + "AddMultiSigSigner", + "TransferAssetOwnership", + "JoinIdentity", + "PortfolioCustody", + "Custom", + "NoData", + "TransferCorporateActionAgent" + ] + }, + "ProposalDetails": { + "type": "struct", + "type_mapping": [ + ["approvals", "u64"], + ["rejections", "u64"], + ["status", "ProposalStatus"], + ["expiry", "Option"], + ["auto_close", "bool"] + ] + }, + "ProposalStatus": { + "type": "enum", + "value_list": [ + ["Invalid"], + ["ActiveOrExpired"], + ["ExecutionSuccessful"], + ["ExecutionFailed"], + ["Rejected"] + ] + }, + "DidStatus": { + "type": "enum", + "value_list": [ + ["Unknown"], + ["Exists"], + ["CddVerified"] + ] + }, + "PortfolioName": "String", + "PortfolioNumber": "u64", + "PortfolioKind": { + "type": "enum", + "type_mapping": [ + ["Default", "Null"], + ["User", "PortfolioNumber"] + ] + }, + "PortfolioId" : { + "type": "struct", + "type_mapping": [ + ["did", "IdentityId"], + ["kind", "PortfolioKind"] + ] + }, + "ProverTickerKey": { + "type": "struct", + "type_mapping": [ + ["prover", "IdentityId"], + ["ticker", "Ticker"] + ] + }, + "TickerRangeProof": { + "type": "struct", + "type_mapping": [ + ["initial_message", "[u8; 32]"], + ["final_response", "Vec"], + ["max_two_exp", "u32"] + ] + }, + "Moment": "u64", + "CalendarUnit": { + "type": "enum", + "value_list": [ + "Second", + "Minute", + "Hour", + "Day", + "Week", + "Month", + "Year" + ] + }, + "CalendarPeriod": { + "type": "struct", + "type_mapping": [ + ["unit", "CalendarUnit"], + ["amount", "u64"] + ] + }, + "CheckpointSchedule": { + "type": "struct", + "type_mapping": [ + ["start", "Moment"], + ["period", "CalendarPeriod"] + ] + }, + "CheckpointId": "u64", + "ScheduleId": "u64", + "StoredSchedule": { + "type": "struct", + "type_mapping": [ + ["schedule", "CheckpointSchedule"], + ["id", "ScheduleId"], + ["at", "Moment"], + ["remaining", "u32"] + ] + }, + "ScheduleSpec": { + "type": "struct", + "type_mapping": [ + ["start", "Option"], + ["period", "CalendarPeriod"], + ["remaining", "u32"] + ] + }, + "InstructionStatus": { + "type": "enum", + "value_list": ["Unknown", "Pending"] + }, + "LegStatus": { + "type": "enum", + "type_mapping": [ + ["PendingTokenLock", "Null"], + ["ExecutionPending", "Null"], + ["ExecutionToBeSkipped", "(AccountId, u64)"] + ] + }, + "AffirmationStatus": { + "type": "enum", + "value_list": [ + ["Unknown"], + ["Pending"], + ["Affirmed"], + ["Rejected"] + ] + }, + "SettlementType": { + "type": "enum", + "type_mapping": [ + ["SettleOnAffirmation", "Null"], + ["SettleOnBlock", "BlockNumber"] + ] + }, + "Instruction": { + "type": "struct", + "type_mapping": [ + ["instruction_id", "u64"], + ["venue_id", "u64"], + ["status", "InstructionStatus"], + ["settlement_type", "SettlementType"], + ["created_at", "Option"], + ["trade_date", "Option"], + ["value_date", "Option"] + ] + }, + "Leg": { + "type": "struct", + "type_mapping": [ + ["from", "PortfolioId"], + ["to", "PortfolioId"], + ["asset", "Ticker"], + ["amount", "Balance"] + ] + }, + "Venue": { + "type": "struct", + "type_mapping": [ + ["creator", "IdentityId"], + ["instructions", "Vec"], + ["details", "VenueDetails"], + ["venue_type", "VenueType"] + ] + }, + "Receipt": { + "type": "struct", + "type_mapping": [ + ["receipt_uid", "u64"], + ["from", "PortfolioId"], + ["to", "PortfolioId"], + ["asset", "Ticker"], + ["amount", "Balance"] + ] + }, + "ReceiptMetadata": "String", + "ReceiptDetails": { + "type": "struct", + "type_mapping": [ + ["receipt_uid", "u64"], + ["leg_id", "u64"], + ["signer", "AccountId"], + ["signature", "OffChainSignature"], + ["metadata", "ReceiptMetadata"] + ] + }, + "UniqueCall": { + "type": "struct", + "type_mapping": [ + ["nonce", "u64"], + ["call", "Call"] + ] + }, + "MovePortfolioItem": { + "type": "struct", + "type_mapping": [ + ["ticker", "Ticker"], + ["amount", "Balance"] + ] + }, + "WeightToFeeCoefficient": { + "type": "struct", + "type_mapping": [ + ["coeffInteger", "Balance"], + ["coeffFrac", "Perbill"], + ["negative", "bool"], + ["degree", "u8"] + ] + }, + "TargetIdentity": { + "type": "enum", + "type_mapping": [ + ["PrimaryIssuanceAgent", "Null"], + ["Specific", "IdentityId"] + ] + }, + "FundraiserName": "String", + "FundraiserStatus": { + "type": "enum", + "type_mapping": [ + ["Live", "Null"], + ["Frozen", "Null"], + ["Closed", "Null"], + ["ClosedEarly", "Null"] + ] + }, + "FundraiserTier": { + "type": "struct", + "type_mapping": [ + ["total", "Balance"], + ["price", "Balance"], + ["remaining", "Balance"] + ] + }, + "Fundraiser": { + "type": "struct", + "type_mapping": [ + ["creator", "IdentityId"], + ["offering_portfolio", "PortfolioId"], + ["offering_asset", "Ticker"], + ["raising_portfolio", "PortfolioId"], + ["raising_asset", "Ticker"], + ["tiers", "Vec"], + ["venue_id", "u64"], + ["start", "Moment"], + ["end", "Option"], + ["status", "FundraiserStatus"], + ["minimum_investment", "Balance"] + ] + }, + "VenueType": { + "type": "enum", + "value_list": ["Other", "Distribution", "Sto", "Exchange"] + }, + "Payload": { + "type": "struct", + "type_mapping": [ + ["block_number", "BlockNumber"], + ["nominators", "Vec"], + ["public", "H256"] + ] + }, + "ExtensionAttributes": { + "type": "struct", + "type_mapping": [ + ["usage_fee", "Balance"], + ["version", "MetaVersion"] + ] + }, + "Tax": "Permill", + "TargetIdentities": { + "type": "struct", + "type_mapping": [ + ["identities", "Vec"], + ["treatment", "TargetTreatment"] + ] + }, + "TargetTreatment": { + "type": "enum", + "value_list": [ + "Include", + "Exclude" + ] + }, + "CAKind": { + "type": "enum", + "value_list": [ + "PredictableBenefit", + "UnpredictableBenefit", + "IssuerNotice", + "Reorganization", + "Other" + ] + }, + "CADetails": "String", + "CACheckpoint": { + "type": "enum", + "type_mapping": [ + ["Scheduled", "(ScheduleId, u64)"], + ["Existing", "CheckpointId"] + ] + }, + "RecordDate": { + "type": "struct", + "type_mapping": [ + ["date", "Moment"], + ["checkpoint", "CACheckpoint"] + ] + }, + "RecordDateSpec": { + "type": "enum", + "type_mapping": [ + ["Scheduled", "Moment"], + ["ExistingSchedule", "ScheduleId"], + ["Existing", "CheckpointId"] + ] + }, + "CorporateAction": { + "type": "struct", + "type_mapping": [ + ["kind", "CAKind"], + ["decl_date", "Moment"], + ["record_date", "Option"], + ["details", "String"], + ["targets", "TargetIdentities"], + ["default_withholding_tax", "Tax"], + ["withholding_tax", "Vec<(IdentityId, Tax)>"] + ] + }, + "LocalCAId": "u32", + "CAId": { + "type": "struct", + "type_mapping": [ + ["ticker", "Ticker"], + ["local_id", "LocalCAId"] + ] + }, + "Distribution": { + "type": "struct", + "type_mapping": [ + ["from", "PortfolioId"], + ["currency", "Ticker"], + ["per_share", "Balance"], + ["amount", "Balance"], + ["remaining", "Balance"], + ["reclaimed", "bool"], + ["payment_at", "Moment"], + ["expires_at", "Option"] + ] + }, + "SlashingSwitch": { + "type": "enum", + "value_list": [ + "Validator", + "ValidatorAndNominator", + "None" + ] + }, + "PriceTier": { + "type": "struct", + "type_mapping": [ + ["total", "Balance"], + ["price", "Balance"] + ] + }, + "AssetMigrationError": { + "type": "enum", + "type_mapping": [ + ["AssetDocumentFail", "(Ticker, DocumentId)"] + ] + }, + "MigrationError": { + "type": "enum", + "type_mapping": [ + ["DecodeKey", "Vec"], + ["Map", "AssetMigrationError"] + ] + }, + "PermissionedIdentityPrefs": { + "type": "struct", + "type_mapping": [ + ["intended_count", "u32"], + ["running_count", "u32"] + ] + }, + "GranularCanTransferResult": { + "type": "struct", + "type_mapping": [ + ["invalid_granularity", "bool"], + ["self_transfer", "bool"], + ["invalid_receiver_cdd", "bool"], + ["invalid_sender_cdd", "bool"], + ["missing_scope_claim", "bool"], + ["receiver_custodian_error", "bool"], + ["sender_custodian_error", "bool"], + ["sender_insufficient_balance", "bool"], + ["portfolio_validity_result", "PortfolioValidityResult"], + ["asset_frozen", "bool"], + ["statistics_result", "Vec"], + ["compliance_result", "AssetComplianceResult"], + ["result", "bool"] + ] + }, + "PortfolioValidityResult": { + "type": "struct", + "type_mapping": [ + ["receiver_is_same_portfolio", "bool"], + ["sender_portfolio_does_not_exist", "bool"], + ["receiver_portfolio_does_not_exist", "bool"], + ["sender_insufficient_balance", "bool"], + ["result", "bool"] + ] + }, + "TransferManagerResult": { + "type": "struct", + "type_mapping": [ + ["tm", "TransferManager"], + ["result", "bool"] + ] + }, + "BalanceAtResult": { + "type": "enum", + "type_mapping": [ + ["Ok", "Vec"], + ["Err", "Vec"] + ] + }, + "CompactAssignments": "CompactAssignmentsFrom258", + "RefCount": "RefCount", + "secondary_key::api::LegacyPermissions": "LegacyPermissions", + "secondary_key::api::secondarykey": "SecondaryKey", + "::OffChainSignature": "OffChainSignature", + "ethereum::EcdsaSignature": "EcdsaSignature", + "ethereum::EthereumAddress": "EthereumAddress", + "SessionKeysPolkadot": { + "type": "struct", + "type_mapping": [ + ["grandpa", "AccountId"], + ["babe", "AccountId"], + ["im_online", "AccountId"], + ["authority_discovery", "AccountId"] + ] + }, + "Keys": "SessionKeysPolkadot", + "Box<::Call>":"BoxProposal", + "::Call":"Proposal" + } +} diff --git a/py-scale-codec/scalecodec/type_registry/polymesh_hacks.md b/py-scale-codec/scalecodec/type_registry/polymesh_hacks.md new file mode 100644 index 00000000..ebd09160 --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/polymesh_hacks.md @@ -0,0 +1,30 @@ + +DO NOT ADD THESE: +``` + "AccountInfo": "AccountInfoWithRefCount", + "Address": "IndicesLookupSource", + "LookupSource": "IndicesLookupSource", +``` + +Polymesh hacks are found at the end of `polymesh.json` : +``` + "CompactAssignments": "CompactAssignmentsFrom258", + "RefCount": "RefCount", + "secondary_key::api::LegacyPermissions": "LegacyPermissions", + "secondary_key::api::secondarykey": "SecondaryKey", + "::OffChainSignature": "OffChainSignature", + "ethereum::EcdsaSignature": "EcdsaSignature", + "ethereum::EthereumAddress": "EthereumAddress", + "SessionKeysPolkadot": { + "type": "struct", + "type_mapping": [ + ["grandpa", "AccountId"], + ["babe", "AccountId"], + ["im_online", "AccountId"], + ["authority_discovery", "AccountId"] + ] + }, + "Keys": "SessionKeysPolkadot", + "Box<::Call>":"BoxProposal", + "::Call":"Proposal" +``` diff --git a/py-scale-codec/scalecodec/type_registry/robonomics.json b/py-scale-codec/scalecodec/type_registry/robonomics.json new file mode 100644 index 00000000..6e3b0e42 --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/robonomics.json @@ -0,0 +1,39 @@ +{ + "types": { + "Keys": "SessionKeysSubstrate", + "Index": "U64", + "LiabilityIndex": "U64", + "Order": { + "type": "struct", + "type_mapping": [ + ["models", "Vec"], + ["objective", "Vec"], + ["cost", "Balance"], + ["custodian", "Option"] + ] + }, + "Offer": { + "type": "struct", + "type_mapping": [ + ["order", "Order"], + ["sender", "AccountId"] + ] + }, + "Demand": { + "type": "struct", + "type_mapping": [ + ["order", "Order"], + ["sender", "AccountId"] + ] + }, + "Liability": { + "type": "struct", + "type_mapping": [ + ["order", "Order"], + ["promisee", "AccountId"], + ["promisor", "AccountId"], + ["result", "Option>"] + ] + } + } +} diff --git a/py-scale-codec/scalecodec/type_registry/substrate-node-template.json b/py-scale-codec/scalecodec/type_registry/substrate-node-template.json new file mode 100644 index 00000000..fda91023 --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/substrate-node-template.json @@ -0,0 +1,29 @@ +{ + "runtime_id": 1, + "types": { + "Address": "AccountIdAddress", + "BlockNumber": "U32", + "LeasePeriod": "BlockNumber", + "Weight": "u64", + "Keys": { + "type": "struct", + "type_mapping": [ + ["grandpa", "AccountId"], + ["babe", "AccountId"], + ["im_online", "AccountId"], + ["authority_discovery", "AccountId"], + ["parachains", "AccountId"] + ] + }, + "DispatchInfo": { + "type": "struct", + "type_mapping": [ + ["weight", "Weight"], + ["class", "DispatchClass"], + ["paysFee", "Pays"] + ] + } + }, + "versioning": [ + ] +} diff --git a/py-scale-codec/scalecodec/type_registry/test.json b/py-scale-codec/scalecodec/type_registry/test.json new file mode 100644 index 00000000..29f62b64 --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/test.json @@ -0,0 +1,31 @@ +{ + "types": { + "BlockNumber": "U64", + "SpecificTestType": "u32", + "DigestItem": { + "type": "enum", + "type_mapping": [ + ["Other", "Vec"], + ["AuthoritiesChange", "Vec"], + ["ChangesTrieRoot", "Hash"], + ["SealV0", "SealV0"], + ["Consensus", "Consensus"], + ["Seal", "Seal"], + ["PreRuntime", "PreRuntime"] + ] + }, + "IdentityFields": { + "type": "set", + "value_list": { + "Display": 1, + "Legal": 2, + "Web": 4, + "Riot": 8, + "Email": 16, + "PgpFingerprint": 32, + "Image": 64, + "Twitter": 128 + } + } + } +} diff --git a/py-scale-codec/scalecodec/type_registry/westend.json b/py-scale-codec/scalecodec/type_registry/westend.json new file mode 100644 index 00000000..84ef6c36 --- /dev/null +++ b/py-scale-codec/scalecodec/type_registry/westend.json @@ -0,0 +1,88 @@ +{ + "runtime_id": 45, + "types": { + "Address": "AccountIdAddress", + "BlockNumber": "U32", + "LeasePeriod": "BlockNumber", + "SessionKeysPolkadot": { + "type": "struct", + "type_mapping": [ + ["grandpa", "AccountId"], + ["babe", "AccountId"], + ["im_online", "AccountId"], + ["authority_discovery", "AccountId"], + ["parachains", "AccountId"] + ] + }, + "Keys": "SessionKeysPolkadot", + "ProxyType": { + "type": "enum", + "value_list": [ + "Any", + "NonTransfer", + "Staking", + "SudoBalances", + "IdentityJudgement" + ] + }, + "RefCount": "u32" + }, + "versioning": [ + { + "runtime_range": [3, 22], + "types": { + "OpenTip": { + "type": "struct", + "type_mapping": [ + ["reason", "Hash"], + ["who", "AccountId"], + ["finder", "Option"], + ["closes", "Option"], + ["tips", "Vec"] + ] + } + } + }, + { + "runtime_range": [23, null], + "types": { + "OpenTip": { + "type": "struct", + "type_mapping": [ + ["reason", "Hash"], + ["who", "AccountId"], + ["finder", "AccountId"], + ["deposit", "Balance"], + ["closes", "Option"], + ["tips", "Vec"], + ["findersFee", "bool"] + ] + } + } + }, + { + "runtime_range": [3, 44], + "types": { + "RefCount": "u8" + } + }, + { + "runtime_range": [45, null], + "types": { + "RefCount": "u32" + } + }, + { + "runtime_range": [1, 42], + "types": { + "CompactAssignments": "CompactAssignmentsTo257" + } + }, + { + "runtime_range": [43, null], + "types": { + "CompactAssignments": "CompactAssignmentsFrom258" + } + } + ] +} diff --git a/py-scale-codec/scalecodec/types.py b/py-scale-codec/scalecodec/types.py new file mode 100644 index 00000000..62aa0f91 --- /dev/null +++ b/py-scale-codec/scalecodec/types.py @@ -0,0 +1,1404 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from datetime import datetime +from hashlib import blake2b + +from scalecodec.utils.ss58 import ss58_decode_account_index + +from scalecodec.base import ScaleType, ScaleBytes +from scalecodec.exceptions import InvalidScaleTypeValueException +from scalecodec.utils.math import trailing_zeros, next_power_of_two + + +class Compact(ScaleType): + + def __init__(self, data=None, **kwargs): + self.compact_length = 0 + self.compact_bytes = None + super().__init__(data, **kwargs) + + def process_compact_bytes(self): + compact_byte = self.get_next_bytes(1) + if compact_byte == b'': + self.compact_bytes = compact_byte + return self.compact_bytes + try: + byte_mod = compact_byte[0] % 4 + except IndexError: + raise InvalidScaleTypeValueException("Invalid byte for Compact") + + if byte_mod == 0: + self.compact_length = 1 + elif byte_mod == 1: + self.compact_length = 2 + elif byte_mod == 2: + self.compact_length = 4 + else: + self.compact_length = int(5 + (compact_byte[0] - 3) / 4) + + if self.compact_length == 1: + self.compact_bytes = compact_byte + elif self.compact_length in [2, 4]: + self.compact_bytes = compact_byte + self.get_next_bytes(self.compact_length - 1) + else: + self.compact_bytes = self.get_next_bytes(self.compact_length - 1) + + return self.compact_bytes + + def process(self): + + self.process_compact_bytes() + + if self.sub_type: + + byte_data = self.get_decoder_class(self.sub_type, ScaleBytes(self.compact_bytes)).process() + + if type(byte_data) is int and self.compact_length <= 4: + return int(byte_data / 4) + else: + return byte_data + else: + return self.compact_bytes + + def process_encode(self, value): + + value = int(value) + + if value <= 0b00111111: + return ScaleBytes(bytearray(int(value << 2).to_bytes(1, 'little'))) + + elif value <= 0b0011111111111111: + return ScaleBytes(bytearray(int((value << 2) | 0b01).to_bytes(2, 'little'))) + + elif value <= 0b00111111111111111111111111111111: + + return ScaleBytes(bytearray(int((value << 2) | 0b10).to_bytes(4, 'little'))) + + else: + for bytes_length in range(4, 68): + if 2 ** (8 * (bytes_length - 1)) <= value < 2 ** (8 * bytes_length): + return ScaleBytes(bytearray( + ((bytes_length - 4) << 2 | 0b11).to_bytes(1, 'little') + value.to_bytes(bytes_length, + 'little'))) + else: + raise ValueError('{} out of range'.format(value)) + + +class CompactU32(Compact): + """ + Specialized composite implementation for performance improvement + """ + + type_string = 'Compact' + + def process(self): + self.process_compact_bytes() + + if self.compact_length <= 4: + return int(int.from_bytes(self.compact_bytes, byteorder='little') / 4) + else: + return int.from_bytes(self.compact_bytes, byteorder='little') + + def process_encode(self, value): + + if value <= 0b00111111: + return ScaleBytes(bytearray(int(value << 2).to_bytes(1, 'little'))) + + elif value <= 0b0011111111111111: + return ScaleBytes(bytearray(int((value << 2) | 0b01).to_bytes(2, 'little'))) + + elif value <= 0b00111111111111111111111111111111: + + return ScaleBytes(bytearray(int((value << 2) | 0b10).to_bytes(4, 'little'))) + + else: + for bytes_length in range(4, 68): + if 2 ** (8 * (bytes_length-1)) <= value < 2 ** (8 * bytes_length): + return ScaleBytes(bytearray(((bytes_length - 4) << 2 | 0b11).to_bytes(1, 'little') + value.to_bytes(bytes_length, 'little'))) + else: + raise ValueError('{} out of range'.format(value)) + + +class Option(ScaleType): + def process(self): + + option_byte = self.get_next_bytes(1) + + if self.sub_type and option_byte != b'\x00': + return self.process_type(self.sub_type).value + + return None + + def process_encode(self, value): + + if value is not None and self.sub_type: + sub_type_obj = self.get_decoder_class(self.sub_type) + return ScaleBytes('0x01') + sub_type_obj.encode(value) + + return ScaleBytes('0x00') + + +class Bytes(ScaleType): + + type_string = 'Vec' + + def process(self): + + length = self.process_type('Compact').value + value = self.get_next_bytes(length) + + try: + return value.decode() + except UnicodeDecodeError: + return '0x{}'.format(value.hex()) + + def process_encode(self, value): + string_length_compact = CompactU32() + + if value[0:2] == '0x': + # TODO implicit HexBytes conversion can have unexpected result if string is actually starting with '0x' + value = bytes.fromhex(value[2:]) + data = string_length_compact.encode(len(value)) + data += value + else: + data = string_length_compact.encode(len(value)) + data += value.encode() + + return data + + +class OptionBytes(ScaleType): + + type_string = 'Option>' + + def process(self): + + option_byte = self.get_next_bytes(1) + + if option_byte != b'\x00': + return self.process_type('Bytes').value + + return None + + +# TODO replace in metadata +class String(ScaleType): + + def process(self): + + length = self.process_type('Compact').value + value = self.get_next_bytes(length) + + return value.decode() + + def process_encode(self, value): + string_length_compact = CompactU32() + data = string_length_compact.encode(len(value)) + data += value.encode() + return data + + +class HexBytes(ScaleType): + + def __init__(self, *args, **kwargs): + self.length_obj = None + super().__init__(*args, **kwargs) + + def process(self): + + self.length_obj = self.process_type('Compact') + + return '0x{}'.format(self.get_next_bytes(self.length_obj.value).hex()) + + def process_encode(self, value): + + if value[0:2] != '0x': + raise ValueError('HexBytes value should start with "0x"') + + value = bytes.fromhex(value[2:]) + + string_length_compact = CompactU32() + data = string_length_compact.encode(len(value)) + data += value + return data + + +class CallBytes(ScaleType): + + def process(self): + raise NotImplementedError() + + def process_encode(self, value): + return bytes.fromhex(value[2:]) + + +class U8(ScaleType): + + def process(self): + return self.get_next_u8() + + def process_encode(self, value): + + if 0 <= int(value) <= 2**8 - 1: + return ScaleBytes(bytearray(int(value).to_bytes(1, 'little'))) + else: + raise ValueError('{} out of range for u8'.format(value)) + + +class U16(ScaleType): + + def process(self): + return int.from_bytes(self.get_next_bytes(2), byteorder='little') + + def process_encode(self, value): + + if 0 <= int(value) <= 2**16 - 1: + return ScaleBytes(bytearray(int(value).to_bytes(2, 'little'))) + else: + raise ValueError('{} out of range for u16'.format(value)) + + +class U32(ScaleType): + + def process(self): + return int.from_bytes(self.get_next_bytes(4), byteorder='little') + + def process_encode(self, value): + + if 0 <= int(value) <= 2**32 - 1: + return ScaleBytes(bytearray(int(value).to_bytes(4, 'little'))) + else: + raise ValueError('{} out of range for u32'.format(value)) + + +class U64(ScaleType): + + def process(self): + return int(int.from_bytes(self.get_next_bytes(8), byteorder='little')) + + def process_encode(self, value): + + if 0 <= int(value) <= 2**64 - 1: + return ScaleBytes(bytearray(int(value).to_bytes(8, 'little'))) + else: + raise ValueError('{} out of range for u64'.format(value)) + + +class U128(ScaleType): + + def process(self): + return int(int.from_bytes(self.get_next_bytes(16), byteorder='little')) + + def process_encode(self, value): + + if 0 <= int(value) <= 2**128 - 1: + return ScaleBytes(bytearray(int(value).to_bytes(16, 'little'))) + else: + raise ValueError('{} out of range for u128'.format(value)) + + +class I8(ScaleType): + + def process(self): + return int.from_bytes(self.get_next_bytes(1), byteorder='little', signed=True) + + def process_encode(self, value): + + if -128 <= int(value) <= 127: + return ScaleBytes(bytearray(int(value).to_bytes(1, 'little', signed=True))) + else: + raise ValueError('{} out of range for i8'.format(value)) + + +class I16(ScaleType): + + def process(self): + return int.from_bytes(self.get_next_bytes(2), byteorder='little', signed=True) + + def process_encode(self, value): + + if -32768 <= int(value) <= 32767: + return ScaleBytes(bytearray(int(value).to_bytes(2, 'little', signed=True))) + else: + raise ValueError('{} out of range for i16'.format(value)) + + +class I32(ScaleType): + + def process(self): + return int.from_bytes(self.get_next_bytes(4), byteorder='little', signed=True) + + def process_encode(self, value): + + if -2147483648 <= int(value) <= 2147483647: + return ScaleBytes(bytearray(int(value).to_bytes(4, 'little', signed=True))) + else: + raise ValueError('{} out of range for i32'.format(value)) + + +class I64(ScaleType): + + def process(self): + return int.from_bytes(self.get_next_bytes(8), byteorder='little', signed=True) + + def process_encode(self, value): + + if -2**64 <= int(value) <= 2**64-1: + return ScaleBytes(bytearray(int(value).to_bytes(8, 'little', signed=True))) + else: + raise ValueError('{} out of range for i64'.format(value)) + + +class I128(ScaleType): + + def process(self): + return int.from_bytes(self.get_next_bytes(16), byteorder='little', signed=True) + + def process_encode(self, value): + + if -2**128 <= int(value) <= 2**128-1: + return ScaleBytes(bytearray(int(value).to_bytes(16, 'little', signed=True))) + else: + raise ValueError('{} out of range for i128'.format(value)) + + +class I256(ScaleType): + + def process(self): + return int.from_bytes(self.get_next_bytes(32), byteorder='little', signed=True) + + def process_encode(self, value): + + if -2**256 <= int(value) <= 2**256-1: + return ScaleBytes(bytearray(int(value).to_bytes(32, 'little', signed=True))) + else: + raise ValueError('{} out of range for i256'.format(value)) + + +class H160(ScaleType): + + def process(self): + return '0x{}'.format(self.get_next_bytes(20).hex()) + + def process_encode(self, value): + if value[0:2] != '0x' or len(value) != 42: + raise ValueError('Value should start with "0x" and should be 20 bytes long') + return ScaleBytes(value) + + +class H256(ScaleType): + + def process(self): + return '0x{}'.format(self.get_next_bytes(32).hex()) + + def process_encode(self, value): + if value[0:2] != '0x' or len(value) != 66: + raise ValueError('Value should start with "0x" and should be 32 bytes long') + return ScaleBytes(value) + + +class H512(ScaleType): + + def process(self): + return '0x{}'.format(self.get_next_bytes(64).hex()) + + def process_encode(self, value): + if value[0:2] != '0x' or len(value) != 130: + raise ValueError('Value should start with "0x" and should be 64 bytes long') + return ScaleBytes(value) + + +class Struct(ScaleType): + + def __init__(self, data, type_mapping=None, **kwargs): + + if type_mapping: + self.type_mapping = type_mapping + + super().__init__(data, **kwargs) + + def process(self): + + result = {} + + for key, data_type in self.type_mapping: + if data_type is None: + data_type = 'Null' + result[key] = self.process_type(data_type, metadata=self.metadata).value + + return result + + def process_encode(self, value): + data = ScaleBytes(bytearray()) + + if type(value) is list: + if len(value) != len(self.type_mapping): + raise ValueError('Element count of value ({}) doesn\'t match type_mapping ({})'.format(len(value), len(self.type_mapping))) + + for idx, (key, data_type) in enumerate(self.type_mapping): + + element_obj = self.get_decoder_class(data_type, metadata=self.metadata) + data += element_obj.encode(value[idx]) + + else: + for key, data_type in self.type_mapping: + if key not in value: + raise ValueError('Element "{}" of struct is missing in given value'.format(key)) + + element_obj = self.get_decoder_class(data_type, metadata=self.metadata) + data += element_obj.encode(value[key]) + + return data + + +class Set(ScaleType): + value_list = [] + value_type = 'u64' + + def __init__(self, data, value_list=None, **kwargs): + self.set_value = None + + if value_list: + self.value_list = value_list + + super().__init__(data, **kwargs) + + def process(self): + self.set_value = self.process_type(self.value_type).value + result = [] + if self.set_value > 0: + + for value, set_mask in self.value_list.items(): + if self.set_value & set_mask > 0: + result.append(value) + return result + + def process_encode(self, value): + result = 0 + if type(value) is not list: + raise ValueError('Value for encoding a set must be a list') + + for item, set_mask in self.value_list.items(): + if item in value: + result += set_mask + + u64_obj = self.get_decoder_class(self.value_type) + + return u64_obj.encode(result) + + +class Era(ScaleType): + """ + An Era represents a range of blocks in which a transaction is allowed to be + executed. + + An Era may either be "immortal", in which case the transaction is always valid, + or "mortal", in which case the transaction has a defined start block and period + in which it is valid. + """ + + def __init__(self, data=None, sub_type=None, metadata=None): + self.period = None + self.phase = None + super().__init__(data, sub_type, metadata) + + def process(self): + + option_byte = self.get_next_bytes(1).hex() + if option_byte == '00': + self.period = None + self.phase = None + return option_byte + else: + encoded = int(option_byte, base=16) + (int(self.get_next_bytes(1).hex(), base=16) << 8) + self.period = 2 << (encoded % (1 << 4)) + quantize_factor = max(1, (self.period >> 12)) + self.phase = (encoded >> 4) * quantize_factor + if self.period >= 4 and self.phase < self.period: + return (self.period, self.phase) + else: + raise ValueError('Invalid phase and period: {}, {}'.format(self.phase, self.period)) + + def _tuple_from_dict(self, value): + if 'period' not in value: + raise ValueError("Value missing required field 'period' in dict Era") + period = value['period'] + + if 'phase' in value: + return (period, value['phase']) + + # If phase not specified explicitly, let the user specify the current block, + # and calculate the phase from that. + if 'current' not in value: + raise ValueError("Dict Era must have one of the fields 'phase' or 'current'") + + current = value['current'] + + # Period must be a power of two between 4 and 2**16 + period = max(4, min(1 << 16, next_power_of_two(period))) + phase = current % period + quantize_factor = max(1, (period >> 12)) + quantized_phase = (phase // quantize_factor) * quantize_factor + + return (period, quantized_phase) + + def process_encode(self, value): + if value == '00': + self.period = None + self.phase = None + return ScaleBytes('0x00') + if isinstance(value, dict): + value = self._tuple_from_dict(value) + if isinstance(value, tuple) and len(value) == 2: + period, phase = value + if not isinstance(phase, int) or not isinstance(period, int): + raise ValueError("Phase and period must be ints") + if phase > period: + raise ValueError("Phase must be less than period") + self.period = period + self.phase = phase + quantize_factor = max(period >> 12, 1) + encoded = min(15, max(1, trailing_zeros(period) - 1)) | ((phase // quantize_factor) << 4) + return ScaleBytes(encoded.to_bytes(length=2, byteorder='little', signed=False)) + + raise ValueError("Value must be the string '00' or tuple of two ints") + + def is_immortal(self) -> bool: + """Returns true if the era is immortal, false if mortal.""" + return self.period is None or self.phase is None + + def birth(self, current: int) -> int: + """Gets the block number of the start of the era given, with `current` + as the reference block number for the era, normally included as part + of the transaction. + """ + if self.is_immortal(): + return 0 + return (max(current, self.phase) - self.phase) // self.period * self.period + self.phase + + def death(self, current: int) -> int: + """Gets the block number of the first block at which the era has ended. + + If the era is immortal, 2**64 - 1 (the maximum unsigned 64-bit integer) is returned. + """ + if self.is_immortal(): + return 2**64 - 1 + return self.birth(current) + self.period + + +class Bool(ScaleType): + + def process(self): + return self.get_next_bool() + + def process_encode(self, value): + if value is True: + return ScaleBytes('0x01') + elif value is False: + return ScaleBytes('0x00') + else: + raise ValueError("Value must be boolean") + + +class CompactMoment(CompactU32): + type_string = 'Compact' + + def process(self): + int_value = super().process() + + if int_value > 10000000000: + int_value = int_value / 1000 + + return datetime.utcfromtimestamp(int_value) + + def serialize(self): + return self.value.isoformat() + + +class BoxProposal(ScaleType): + type_string = 'Box' + + def __init__(self, data, **kwargs): + self.call_index = None + self.call_function = None + self.call_module = None + self.call_args = [] + super().__init__(data, **kwargs) + + def process(self): + + self.call_index = self.get_next_bytes(2).hex() + + self.call_module, self.call_function = self.metadata.call_index[self.call_index] + + for arg in self.call_function.args: + arg_type_obj = self.process_type(arg.type, metadata=self.metadata) + + self.call_args.append({ + 'name': arg.name, + 'type': arg.type, + 'value': arg_type_obj.serialize(), + 'valueRaw': arg_type_obj.raw_value + }) + + return { + 'call_index': self.call_index, + 'call_function': self.call_function.name, + 'call_module': self.call_module.name, + 'call_args': self.call_args + } + + def process_encode(self, value): + # Check requirements + if 'call_index' in value: + self.call_index = value['call_index'] + + elif 'call_module' in value and 'call_function' in value: + # Look up call module from metadata + for call_index, (call_module, call_function) in self.metadata.call_index.items(): + + if call_module.name == value['call_module'] and call_function.name == value['call_function']: + self.call_index = call_index + self.call_module = call_module + self.call_function = call_function + break + + if not self.call_index: + raise ValueError('Specified call module and function not found in metadata') + + elif not self.call_module or not self.call_function: + raise ValueError('No call module and function specified') + + data = ScaleBytes(bytearray.fromhex(self.call_index)) + + # Encode call params + if len(self.call_function.args) > 0: + for arg in self.call_function.args: + if arg.name not in value['call_args']: + raise ValueError('Parameter \'{}\' not specified'.format(arg.name)) + else: + param_value = value['call_args'][arg.name] + + arg_obj = self.get_decoder_class(arg.type, metadata=self.metadata) + data += arg_obj.encode(param_value) + + return data + + +class ProposalPreimage(Struct): + type_string = '(Vec, AccountId, BalanceOf, BlockNumber)' + + type_mapping = ( + ("proposal", "HexBytes"), + ("registredBy", "AccountId"), + ("deposit", "BalanceOf"), + ("blockNumber", "BlockNumber") + ) + def process(self): + + result = {} + for key, data_type in self.type_mapping: + result[key] = self.process_type(data_type, metadata=self.metadata).value + + # Replace HexBytes with actual proposal + result['proposal'] = Proposal(ScaleBytes(result['proposal']), metadata=self.metadata).decode() + + return result + + +class Proposal(BoxProposal): + type_string = '>::Proposal' + + +class ValidatorPrefs(Struct): + type_string = '(Compact)' + + type_mapping = (('commission', 'Compact'),) + + +class ValidatorPrefsLegacy(Struct): + type_string = '(Compact,Compact)' + + type_mapping = (('unstakeThreshold', 'Compact'), ('validatorPayment', 'Compact')) + + +class Linkage(Struct): + type_string = 'Linkage' + + type_mapping = ( + ('previous', 'Option'), + ('next', 'Option') + ) + + +class GenericAccountId(H256): + + def __init__(self, data=None, sub_type=None, metadata=None): + self.ss58_address = None + super().__init__(data, sub_type, metadata) + + def process_encode(self, value): + if value[0:2] != '0x' and len(value) == 47: + from scalecodec.utils.ss58 import ss58_decode + self.ss58_address = value + value = '0x{}'.format(ss58_decode(value)) + return super().process_encode(value) + + +class GenericAccountIndex(U32): + pass + + +class KeyValue(Struct): + type_string = '(Vec, Vec)' + type_mapping = (('key', 'Vec'), ('value', 'Vec')) + + +class NewAccountOutcome(CompactU32): + type_string = 'NewAccountOutcome' + + +class Vec(ScaleType): + + def __init__(self, data=None, **kwargs): + self.elements = [] + super().__init__(data, **kwargs) + + def process(self): + element_count = self.process_type('Compact').value + + result = [] + for _ in range(0, element_count): + element = self.process_type(self.sub_type, metadata=self.metadata) + self.elements.append(element) + result.append(element.value) + + return result + + def process_encode(self, value): + + if type(value) is not list: + raise ValueError("Provided value is not a list") + + # encode element count to Compact + element_count_compact = CompactU32() + + element_count_compact.encode(len(value)) + + data = element_count_compact.data + + for element in value: + + element_obj = self.get_decoder_class(self.sub_type, metadata=self.metadata) + data += element_obj.encode(element) + + return data + + +class BitVec(Vec): + # TODO: A BitVec that represents an array of bits. The bits are however stored encoded. The difference between this + # * and a normal Bytes would be that the length prefix indicates the number of bits encoded, not the bytes + pass + + +class GenericAddress(ScaleType): + + def __init__(self, data, **kwargs): + self.account_length = None + self.account_id = None + self.account_index = None + self.account_idx = None + super().__init__(data, **kwargs) + + def process(self): + self.account_length = self.get_next_bytes(1) + + if self.account_length == b'\xff': + self.account_id = self.get_next_bytes(32).hex() + self.account_length = self.account_length.hex() + + return self.account_id + else: + if self.account_length == b'\xfc': + account_index = self.get_next_bytes(2) + elif self.account_length == b'\xfd': + account_index = self.get_next_bytes(4) + elif self.account_length == b'\xfe': + account_index = self.get_next_bytes(8) + else: + account_index = self.account_length + + self.account_index = account_index.hex() + self.account_idx = int.from_bytes(account_index, byteorder='little') + + self.account_length = self.account_length.hex() + + return self.account_index + + def process_encode(self, value): + + if type(value) == str and value[0:2] != '0x': + # Assume SS58 encoding address + if len(value) >= 46: + from scalecodec.utils.ss58 import ss58_decode + value = '0x{}'.format(ss58_decode(value)) + else: + from scalecodec.utils.ss58 import ss58_decode_account_index + index_obj = GenericAccountIndex() + value = index_obj.encode(ss58_decode_account_index(value)) + + if type(value) == str and value[0:2] == '0x' and len(value) == 66: + # value is AccountId + return ScaleBytes('0xff{}'.format(value[2:])) + elif type(value) == int: + # value is AccountIndex + raise NotImplementedError('Encoding of AccountIndex Adresses not supported yet') + else: + raise ValueError('Value is in unsupported format, expected 32 bytes hex-string for AccountIds or int for AccountIndex') + + def serialize(self): + if self.account_id: + return '0x{}'.format(self.value) + else: + return self.value + + +class AccountIdAddress(GenericAddress): + + def process(self): + self.account_id = self.process_type('AccountId').value.replace('0x', '') + self.account_length = 'ff' + return self.account_id + + def process_encode(self, value): + if type(value) == str and value[0:2] != '0x': + # Assume SS58 encoding address + if len(value) >= 46: + from scalecodec.utils.ss58 import ss58_decode + value = '0x{}'.format(ss58_decode(value)) + else: + from scalecodec.utils.ss58 import ss58_decode_account_index + index_obj = GenericAccountIndex() + value = index_obj.encode(ss58_decode_account_index(value)) + + if type(value) == str and value[0:2] == '0x' and len(value) == 66: + # value is AccountId + return ScaleBytes('0x{}'.format(value[2:])) + elif type(value) == int: + # value is AccountIndex + raise NotImplementedError('Encoding of AccountIndex Adresses not supported yet') + else: + raise ValueError('Value is in unsupported format, expected 32 bytes hex-string for AccountIds or int for AccountIndex') + + +class RawAddress(GenericAddress): + pass + + +class Enum(ScaleType): + + value_list = [] + type_mapping = None + + def __init__(self, data, value_list=None, type_mapping=None, **kwargs): + + self.index = None + + if type_mapping: + self.type_mapping = type_mapping + + if value_list: + self.value_list = value_list + + super().__init__(data, **kwargs) + + def process(self): + self.index = int(self.get_next_bytes(1).hex(), 16) + + if self.type_mapping: + try: + enum_type_mapping = self.type_mapping[self.index] + return self.process_type('Struct', type_mapping=[enum_type_mapping]).value + + except IndexError: + raise ValueError("Index '{}' not present in Enum type mapping".format(self.index)) + else: + try: + return self.value_list[self.index] + except IndexError: + raise ValueError("Index '{}' not present in Enum value list".format(self.index)) + + def process_encode(self, value): + if self.type_mapping: + + if type(value) == str: + # Convert simple enum values + value = {value: None} + + if type(value) != dict: + raise ValueError("Value must be a dict when type_mapping is set, not '{}'".format(value)) + + if len(value) != 1: + raise ValueError("Value for enum with type_mapping can only have one value") + + for enum_key, enum_value in value.items(): + for idx, (item_key, item_value) in enumerate(self.type_mapping): + if item_key == enum_key: + self.index = idx + struct_obj = self.get_decoder_class('Struct', type_mapping=[self.type_mapping[self.index]]) + return ScaleBytes(bytearray([self.index])) + struct_obj.encode(value) + + raise ValueError("Value '{}' not present in type_mapping of this enum".format(enum_key)) + + else: + for idx, item in enumerate(self.value_list): + if item == value: + self.index = idx + return ScaleBytes(bytearray([self.index])) + + raise ValueError("Value '{}' not present in value list of this enum".format(value)) + + def get_enum_value(self): + if self.value: + + if self.type_mapping: + return list(self.value.values())[0] + else: + return self.value_list[self.index] + + +class Data(Enum): + type_mapping = [ + ["None", "Null"], + ["Raw", "Bytes"], + ["BlakeTwo256", "H256"], + ["Sha256", "H256"], + ["Keccak256", "H256"], + ["ShaThree256", "H256"] + ] + + def process(self): + + self.index = int(self.get_next_bytes(1).hex(), 16) + + if self.index == 0: + return {'None': None} + + elif self.index >= 1 and self.index <= 33: + # Determine value of Raw type (length is processed in index byte) + data = self.get_next_bytes(self.index - 1) + + try: + value = data.decode() + except UnicodeDecodeError: + value = '0x{}'.format(data.hex()) + return {"Raw": value} + + elif self.index >= 34 and self.index <= 37: + + enum_value = self.type_mapping[self.index - 32][0] + + return {enum_value: self.process_type(self.type_mapping[self.index - 32][1]).value} + + raise ValueError("Unable to decode Data, invalid indicator byte '{}'".format(self.index)) + + def process_encode(self, value): + + if type(value) != dict: + raise ValueError("Value must be a dict when type_mapping is set, not '{}'".format(value)) + + if len(value) != 1: + raise ValueError("Value for enum with type_mapping can only have one value") + + for enum_key, enum_value in value.items(): + + for idx, (item_key, item_value) in enumerate(self.type_mapping): + if item_key == enum_key: + self.index = idx + + if item_value == 'Null': + return ScaleBytes(bytearray([0])) + + elif item_value == 'Bytes': + + if enum_value[0:2] == '0x': + + if len(enum_value) > 66: + raise ValueError("Raw type in Data cannot exceed 32 bytes") + + enum_value = bytes.fromhex(enum_value[2:]) + data = bytes([len(enum_value) + 1]) + enum_value + return ScaleBytes(bytearray(data)) + else: + + if len(enum_value) > 32: + raise ValueError("Raw type in Data cannot exceed 32 bytes") + + data = bytes([len(enum_value) + 1]) + enum_value.encode() + return ScaleBytes(bytearray(data)) + else: + + struct_obj = self.get_decoder_class('Struct', type_mapping=[self.type_mapping[self.index]]) + return ScaleBytes(bytearray([self.index])) + struct_obj.encode(value) + + raise ValueError("Value '{}' not present in type_mapping of this enum".format(enum_key)) + + +class Null(ScaleType): + + def process(self): + return None + + def process_encode(self, value): + return ScaleBytes(bytearray()) + + +class InherentOfflineReport(Null): + pass + + +class StorageHasher(Enum): + + value_list = ['Blake2_128', 'Blake2_256', 'Blake2_128Concat', 'Twox128', 'Twox256', 'Twox64Concat', 'Identity'] + + def is_blake2_128(self): + return self.index == 0 + + def is_blake2_256(self): + return self.index == 1 + + def is_twoblake2_128_concat(self): + return self.index == 2 + + def is_twox128(self): + return self.index == 3 + + def is_twox256(self): + return self.index == 4 + + def is_twox64_concat(self): + return self.index == 5 + + def is_identity(self): + return self.index == 6 + + +class LockPeriods(U8): + pass + + +class SessionKey(H256): + pass + + +class PrefabWasmModule(Struct): + type_string = 'wasm::PrefabWasmModule' + + type_mapping = ( + ('scheduleVersion', 'Compact'), + ('initial', 'Compact'), + ('maximum', 'Compact'), + ('_reserved', 'Option'), + ('code', 'Bytes'), + ) + + +class SessionKeysSubstrate(Struct): + + type_mapping = ( + ('grandpa', 'AccountId'), + ('babe', 'AccountId'), + ('im_online', 'AccountId'), + ) + + +class LegacyKeys(Struct): + + type_mapping = ( + ('grandpa', 'AccountId'), + ('babe', 'AccountId'), + ) + + +class EdgewareKeys(Struct): + type_mapping = ( + ('grandpa', 'AccountId'), + ) + + +class QueuedKeys(Struct): + + type_string = '(ValidatorId, Keys)' + + type_mapping = ( + ('validator', 'ValidatorId'), + ('keys', 'Keys'), + ) + + +class LegacyQueuedKeys(Struct): + + type_string = '(ValidatorId, LegacyKeys)' + + type_mapping = ( + ('validator', 'ValidatorId'), + ('keys', 'LegacyKeys'), + ) + + +class EdgewareQueuedKeys(Struct): + + type_string = '(ValidatorId, EdgewareKeys)' + + type_mapping = ( + ('validator', 'ValidatorId'), + ('keys', 'EdgewareKeys'), + ) + + +class VecQueuedKeys(Vec): + type_string = 'Vec<(ValidatorId, Keys)>' + + def process(self): + element_count = self.process_type('Compact').value + result = [] + for _ in range(0, element_count): + element = self.process_type('QueuedKeys') + self.elements.append(element) + result.append(element.value) + + return result + + +class Conviction(Enum): + CONVICTION_MASK = 0b01111111 + DEFAULT_CONVICTION = 0b00000000 + + value_list = ['None', 'Locked1x', 'Locked2x', 'Locked3x', 'Locked4x', 'Locked5x', 'Locked6x'] + + +class GenericBlock(ScaleType): + # TODO implement generic block type + + def process(self): + raise NotImplementedError() + + def process_encode(self, value): + raise NotImplementedError() + + +class GenericVote(U8): + pass + + +class GenericCall(ScaleType): + + type_string = "Box" + + def __init__(self, data, **kwargs): + self.call_index = None + self.call_function = None + self.call_args = [] + self.call_module = None + + super().__init__(data, **kwargs) + + def process(self): + + self.call_index = self.get_next_bytes(2).hex() + + self.call_module, self.call_function = self.metadata.call_index[self.call_index] + + for arg in self.call_function.args: + arg_type_obj = self.process_type(arg.type, metadata=self.metadata) + + self.call_args.append({ + 'name': arg.name, + 'type': arg.type, + 'value': arg_type_obj.serialize(), + 'valueRaw': arg_type_obj.raw_value + }) + + return { + 'call_index': self.call_index, + 'call_function': self.call_function.name, + 'call_module': self.call_module.name, + 'call_args': self.call_args + } + + def process_encode(self, value): + + if type(value) is not dict: + raise TypeError("value must be of type dict to encode a GenericCall") + + # Check requirements + if 'call_index' in value: + self.call_index = value['call_index'] + + elif 'call_module' in value and 'call_function' in value: + # Look up call module from metadata + for call_index, (call_module, call_function) in self.metadata.call_index.items(): + + if call_module.name == value['call_module'] and call_function.name == value['call_function']: + self.call_index = call_index + self.call_module = call_module + self.call_function = call_function + break + + if not self.call_index: + raise ValueError('Specified call module and function not found in metadata') + + elif not self.call_module or not self.call_function: + raise ValueError('No call module and function specified') + + data = ScaleBytes(bytearray.fromhex(self.call_index)) + + # Encode call params + if len(self.call_function.args) > 0: + for arg in self.call_function.args: + if arg.name not in value['call_args']: + raise ValueError('Parameter \'{}\' not specified'.format(arg.name)) + else: + param_value = value['call_args'][arg.name] + + arg_obj = self.get_decoder_class(arg.type, metadata=self.metadata) + data += arg_obj.encode(param_value) + return data + + +class OpaqueCall(Bytes): + + def process_encode(self, value): + call_obj = self.get_decoder_class('Call', metadata=self.metadata) + return super().process_encode(str(call_obj.encode(value))) + + def process(self): + value = super().process() + try: + call_obj = self.get_decoder_class( + type_string='Call', + data=ScaleBytes('0x{}'.format(self.raw_value)), + metadata=self.metadata + ) + + return call_obj.process() + except: + return value + + +class MultiAccountId(GenericAccountId): + + @classmethod + def create_from_account_list(cls, accounts, threshold): + from scalecodec.utils.ss58 import ss58_decode + + account_ids = [] + for account in accounts: + if account[0:2] != '0x': + account = '0x{}'.format(ss58_decode(account)) + account_ids.append(account) + + account_list_cls = cls.get_decoder_class('Vec') + account_list_data = account_list_cls.encode(sorted(account_ids)) + threshold_data = cls.get_decoder_class("u16").encode(threshold) + + multi_account_id = "0x{}".format(blake2b( + b"modlpy/utilisuba" + bytes(account_list_data.data) + bytes(threshold_data.data), digest_size=32 + ).digest().hex()) + + multi_account_obj = cls() + multi_account_obj.encode(multi_account_id) + + return multi_account_obj + + +class FixedLengthArray(ScaleType): + + element_count = 0 + + def process(self): + + if self.element_count: + if self.sub_type == 'u8': + return '0x{}'.format(self.get_next_bytes(self.element_count).hex()) + else: + result = [] + for idx in range(self.element_count): + result.append(self.process_type(self.sub_type).value) + else: + result = [] + + return result + + def process_encode(self, value): + data = ScaleBytes(bytearray()) + + value = value or [] + + if self.sub_type == 'u8': + # u8 arrays are represented as hex-bytes (e.g. [u8; 3] as 0x123456) + if value[0:2] != '0x' or len(value[2:]) != self.element_count * 2: + raise ValueError('Value should start with "0x" and should be {} bytes long'.format(self.element_count)) + + return ScaleBytes(value) + + else: + + if not type(value) is list: + raise ValueError('Given value is not a list') + + for element_value in value: + element_obj = self.get_decoder_class(self.sub_type, metadata=self.metadata) + data += element_obj.encode(element_value) + + return data + +class Ticker(ScaleType): + + type_string = 'Ticker' + + def process(self): + value = self.get_next_bytes(12) + try: + return value.decode() + except UnicodeDecodeError: + return value.hex() + + def process_encode(self, value): + if value[0:2] != '0x' and len(value) == 26: + raise ValueError('Value should start with "0x" and should be 12 bytes long') + return ScaleBytes(value) + + +class GenericMultiAddress(Enum): + type_mapping = [ + ["Id", "AccountId"], + ["Index", "Compact"], + ["Raw", "Bytes"], + ["Address32", "H256"], + ["Address20", "H160"], + ] + + def process_encode(self, value): + + if type(value) == str: + if len(value) <= 8: + value = {"Index": ss58_decode_account_index(value)} + else: + value = {"Id": value} + + return super().process_encode(value) diff --git a/py-scale-codec/scalecodec/updater.py b/py-scale-codec/scalecodec/updater.py new file mode 100644 index 00000000..42756db9 --- /dev/null +++ b/py-scale-codec/scalecodec/updater.py @@ -0,0 +1,58 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import json +import os + +import requests + +TYPE_REGISTRY_CONFIG = [ + { + 'name': 'default', + 'remote': 'https://raw.githubusercontent.com/polkascan/py-scale-codec/master/scalecodec/type_registry/default.json' + }, + { + 'name': 'polkadot', + 'remote': 'https://raw.githubusercontent.com/polkascan/py-scale-codec/master/scalecodec/type_registry/polkadot.json' + }, + { + 'name': 'kusama', + 'remote': 'https://raw.githubusercontent.com/polkascan/py-scale-codec/master/scalecodec/type_registry/kusama.json' + }, + { + 'name': 'kulupu', + 'remote': 'https://raw.githubusercontent.com/polkascan/py-scale-codec/master/scalecodec/type_registry/kulupu.json' + } +] + + +def update_type_registries(): + + for type_registry in TYPE_REGISTRY_CONFIG: + + remote_type_reg = requests.get(type_registry['remote']).content + + module_path = os.path.dirname(__file__) + path = os.path.join(module_path, 'type_registry/{}.json'.format(type_registry['name'])) + + f = open(path, 'wb') + f.write(remote_type_reg) + f.close() + + +if __name__ == '__main__': + print('Updating type registries...') + update_type_registries() + print('Type registries updated') diff --git a/py-scale-codec/scalecodec/utils/__init__.py b/py-scale-codec/scalecodec/utils/__init__.py new file mode 100644 index 00000000..d75e6511 --- /dev/null +++ b/py-scale-codec/scalecodec/utils/__init__.py @@ -0,0 +1,17 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + diff --git a/py-scale-codec/scalecodec/utils/math.py b/py-scale-codec/scalecodec/utils/math.py new file mode 100644 index 00000000..7d2cb35e --- /dev/null +++ b/py-scale-codec/scalecodec/utils/math.py @@ -0,0 +1,41 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# math.py + +"""Some simple math-related utility functions not present in the standard + library. +""" + +from math import ceil, log2 + +def trailing_zeros(value: int) -> int: + """Returns the number of trailing zeros in the binary representation of + the given integer. + """ + num_zeros = 0 + while value & 1 == 0: + num_zeros += 1 + value >>= 1 + return num_zeros + +def next_power_of_two(value: int) -> int: + """Returns the smallest power of two that is greater than or equal + to the given integer. + """ + if value < 0: + raise ValueError("Negative integers not supported") + return 1 if value == 0 else 1 << ceil(log2(value)) diff --git a/py-scale-codec/scalecodec/utils/ss58.py b/py-scale-codec/scalecodec/utils/ss58.py new file mode 100644 index 00000000..eef5b4d5 --- /dev/null +++ b/py-scale-codec/scalecodec/utils/ss58.py @@ -0,0 +1,118 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ss58.py + +""" SS58 is a simple address format designed for Substrate based chains. + Encoding/decoding according to specification on https://wiki.parity.io/External-Address-Format-(SS58) + +""" +import base58 +from hashlib import blake2b + +from scalecodec.base import ScaleBytes, ScaleDecoder + + +def ss58_decode(address, valid_address_type=None): + checksum_prefix = b'SS58PRE' + + ss58_format = base58.b58decode(address) + + if valid_address_type and ss58_format[0] != valid_address_type: + raise ValueError("Invalid Address type") + + # Determine checksum length according to length of address string + if len(ss58_format) in [3, 4, 6, 10]: + checksum_length = 1 + elif len(ss58_format) in [5, 7, 11, 35]: + checksum_length = 2 + elif len(ss58_format) in [8, 12]: + checksum_length = 3 + elif len(ss58_format) in [9, 13]: + checksum_length = 4 + elif len(ss58_format) in [14]: + checksum_length = 5 + elif len(ss58_format) in [15]: + checksum_length = 6 + elif len(ss58_format) in [16]: + checksum_length = 7 + elif len(ss58_format) in [17]: + checksum_length = 8 + else: + raise ValueError("Invalid address length") + + checksum = blake2b(checksum_prefix + ss58_format[0:-checksum_length]).digest() + + if checksum[0:checksum_length] != ss58_format[-checksum_length:]: + raise ValueError("Invalid checksum") + + return ss58_format[1:len(ss58_format)-checksum_length].hex() + + +def ss58_encode(address, address_type=42): + checksum_prefix = b'SS58PRE' + + if type(address) is bytes or type(address) is bytearray: + address_bytes = address + else: + address_bytes = bytes.fromhex(address) + + if len(address_bytes) == 32: + # Checksum size is 2 bytes for public key + checksum_length = 2 + elif len(address_bytes) in [1, 2, 4, 8]: + # Checksum size is 1 byte for account index + checksum_length = 1 + else: + raise ValueError("Invalid length for address") + + address_format = bytes([address_type]) + address_bytes + checksum = blake2b(checksum_prefix + address_format).digest() + + return base58.b58encode(address_format + checksum[:checksum_length]).decode() + + +def ss58_encode_account_index(account_index, address_type=42): + + if 0 <= account_index <= 2**8 - 1: + account_idx_encoder = ScaleDecoder.get_decoder_class('u8') + elif 2**8 <= account_index <= 2**16 - 1: + account_idx_encoder = ScaleDecoder.get_decoder_class('u16') + elif 2**16 <= account_index <= 2**32 - 1: + account_idx_encoder = ScaleDecoder.get_decoder_class('u32') + elif 2**32 <= account_index <= 2**64 - 1: + account_idx_encoder = ScaleDecoder.get_decoder_class('u64') + else: + raise ValueError("Value too large for an account index") + + return ss58_encode(account_idx_encoder.encode(account_index).data, address_type) + + +def ss58_decode_account_index(address, valid_address_type=None): + + account_index_bytes = ss58_decode(address, valid_address_type) + + if len(account_index_bytes) == 2: + return ScaleDecoder.get_decoder_class('u8', data=ScaleBytes('0x{}'.format(account_index_bytes))).decode() + if len(account_index_bytes) == 4: + return ScaleDecoder.get_decoder_class('u16', data=ScaleBytes('0x{}'.format(account_index_bytes))).decode() + if len(account_index_bytes) == 8: + return ScaleDecoder.get_decoder_class('u32', data=ScaleBytes('0x{}'.format(account_index_bytes))).decode() + if len(account_index_bytes) == 16: + return ScaleDecoder.get_decoder_class('u64', data=ScaleBytes('0x{}'.format(account_index_bytes))).decode() + else: + raise ValueError("Invalid account index length") + diff --git a/py-scale-codec/setup.py b/py-scale-codec/setup.py new file mode 100644 index 00000000..c714c55d --- /dev/null +++ b/py-scale-codec/setup.py @@ -0,0 +1,235 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""A setuptools based setup module. + +See: +https://packaging.python.org/guides/distributing-packages-using-setuptools/ +https://github.com/pypa/sampleproject +""" + +# Always prefer setuptools over distutils +from setuptools import setup, find_packages +from os import path, environ +# io.open is needed for projects that support Python 2.7 +# It ensures open() defaults to text mode with universal newlines, +# and accepts an argument to specify the text encoding +# Python 3 only projects can skip this import +from io import open + + +if environ.get('TRAVIS_TAG'): + version = environ['TRAVIS_TAG'].replace('v', '') +elif environ.get('CI_COMMIT_TAG'): + version = environ['CI_COMMIT_TAG'].replace('v', '') +elif environ.get('GITHUB_REF'): + + if not environ['GITHUB_REF'].startswith('refs/tags/v'): + raise ValueError('Incorrect tag format {}'.format(environ['GITHUB_REF'])) + + version = environ['GITHUB_REF'].replace('refs/tags/v', '') +else: + raise ValueError('Missing commit tag, can\'t set version') + +here = path.abspath(path.dirname(__file__)) + +# Get the long description from the README file +with open(path.join(here, 'README.md'), encoding='utf-8') as f: + long_description = f.read() + +# Arguments marked as "Required" below must be included for upload to PyPI. +# Fields marked as "Optional" may be commented out. + +setup( + # This is the name of your project. The first time you publish this + # package, this name will be registered for you. It will determine how + # users can install this project, e.g.: + # + # $ pip install sampleproject + # + # And where it will live on PyPI: https://pypi.org/project/sampleproject/ + # + # There are some restrictions on what makes a valid project name + # specification here: + # https://packaging.python.org/specifications/core-metadata/#name + name='polymath-scalecodec', # Required + + # Versions should comply with PEP 440: + # https://www.python.org/dev/peps/pep-0440/ + # + # For a discussion on single-sourcing the version across setup.py and the + # project code, see + # https://packaging.python.org/en/latest/single_source_version.html + version=version, # Required + + # This is a one-line description or tagline of what your project does. This + # corresponds to the "Summary" metadata field: + # https://packaging.python.org/specifications/core-metadata/#summary + description='Python SCALE Codec Library for Polymesh', # Optional + + # This is an optional longer description of your project that represents + # the body of text which users will see when they visit PyPI. + # + # Often, this is the same as your README, so you can just read it in from + # that file directly (as we have already done above) + # + # This field corresponds to the "Description" metadata field: + # https://packaging.python.org/specifications/core-metadata/#description-optional + long_description=long_description, # Optional + + # Denotes that our long_description is in Markdown; valid values are + # text/plain, text/x-rst, and text/markdown + # + # Optional if long_description is written in reStructuredText (rst) but + # required for plain-text or Markdown; if unspecified, "applications should + # attempt to render [the long_description] as text/x-rst; charset=UTF-8 and + # fall back to text/plain if it is not valid rst" (see link below) + # + # This field corresponds to the "Description-Content-Type" metadata field: + # https://packaging.python.org/specifications/core-metadata/#description-content-type-optional + long_description_content_type='text/markdown', # Optional (see note above) + + # This should be a valid link to your project's main homepage. + # + # This field corresponds to the "Home-Page" metadata field: + # https://packaging.python.org/specifications/core-metadata/#home-page-optional + url='https://github.com/polymathnetwork/py-scale-codec', # Optional + + # This should be your name or the name of the organization which owns the + # project. + author='Polymath', # Optional + + # Classifiers help users find your project by categorizing it. + # + # For a list of valid classifiers, see https://pypi.org/classifiers/ + classifiers=[ # Optional + # How mature is this project? Common values are + # 3 - Alpha + # 4 - Beta + # 5 - Production/Stable + 'Development Status :: 4 - Beta', + + # Indicate who your project is intended for + 'Intended Audience :: Developers', + + # Pick your license as you wish + 'License :: OSI Approved :: Apache Software License', + + # Specify the Python versions you support here. In particular, ensure + # that you indicate whether you support Python 2, Python 3 or both. + # These classifiers are *not* checked by 'pip install'. See instead + # 'python_requires' below. + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + ], + + # This field adds keywords for your project which will appear on the + # project page. What does your project relate to? + # + # Note that this is a string of words separated by whitespace, not a list. + keywords='scale codec polkascan polkadot substrate blockchain polymesh', # Optional + + # You can just specify package directories manually here if your project is + # simple. Or you can use find_packages(). + # + # Alternatively, if you just want to distribute a single Python file, use + # the `py_modules` argument instead as follows, which will expect a file + # called `my_module.py` to exist: + # + # py_modules=["my_module"], + # + #packages=find_packages(exclude=['contrib', 'docs', 'tests', 'test']), # Required + packages=find_packages(exclude=['contrib', 'docs', 'tests', 'test']), # Required + + # Specify which Python versions you support. In contrast to the + # 'Programming Language' classifiers above, 'pip install' will check this + # and refuse to install the project if the version does not match. If you + # do not support Python 2, you can simplify this to '>=3.5' or similar, see + # https://packaging.python.org/guides/distributing-packages-using-setuptools/#python-requires + + #python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4', + python_requires='>=3.6, <4', + + # This field lists other packages that your project depends on to run. + # Any package you put here will be installed by pip when your project is + # installed, so they must be valid existing projects. + # + # For an analysis of "install_requires" vs pip's requirements files see: + # https://packaging.python.org/en/latest/requirements.html + install_requires=['more-itertools', 'base58>=2.0.1', 'requests>=2.24.0'], # Optional + + # List additional groups of dependencies here (e.g. development + # dependencies). Users will be able to install these using the "extras" + # syntax, for example: + # + # $ pip install sampleproject[dev] + # + # Similar to `install_requires` above, these must be valid existing + # projects. + extras_require={ # Optional + #'dev': ['check-manifest'], + 'test': ['coverage', 'pytest'], + }, + + # If there are data files included in your packages that need to be + # installed, specify them here. + # + # If using Python 2.6 or earlier, then these have to be included in + # MANIFEST.in as well. + + package_data={ # Optional + 'scalecodec.type_registry': ['*.json'], + }, + + # Although 'package_data' is the preferred approach, in some case you may + # need to place data files outside of your packages. See: + # http://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files + # + # In this case, 'data_file' will be installed into '/my_data' + # data_files=[('type_registry', ['scalecodec/type_registry/*.json'])], # Optional + + # To provide executable scripts, use entry points in preference to the + # "scripts" keyword. Entry points provide cross-platform support and allow + # `pip` to create the appropriate form of executable for the target + # platform. + # + # For example, the following would provide a command called `sample` which + # executes the function `main` from this package when invoked: + + # entry_points={ # Optional + # 'console_scripts': [ + # 'sample=sample:main', + # ], + # }, + + # List additional URLs that are relevant to your project as a dict. + # + # This field corresponds to the "Project-URL" metadata fields: + # https://packaging.python.org/specifications/core-metadata/#project-url-multiple-use + # + # Examples listed include a pattern for specifying where the package tracks + # issues, where the source is hosted, where to say thanks to the package + # maintainers, and where to support the project financially. The key is + # what's used to render the link text on PyPI. + # project_urls={ # Optional + # 'Bug Reports': 'https://github.com/pypa/sampleproject/issues', + # 'Funding': 'https://donate.pypi.org', + # 'Say Thanks!': 'http://saythanks.io/to/example', + # 'Source': 'https://github.com/pypa/sampleproject/', + # }, +) diff --git a/py-scale-codec/test/__init__.py b/py-scale-codec/test/__init__.py new file mode 100644 index 00000000..d6dbc562 --- /dev/null +++ b/py-scale-codec/test/__init__.py @@ -0,0 +1,15 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/py-scale-codec/test/fixtures.py b/py-scale-codec/test/fixtures.py new file mode 100644 index 00000000..b2a00063 --- /dev/null +++ b/py-scale-codec/test/fixtures.py @@ -0,0 +1,36 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# fixtures.py +# + +metadata_v3_hex = "0x6d65746103441873797374656d1853797374656d012c304163636f756e744e6f6e6365010130543a3a4163636f756e74496420543a3a496e64657800200000000000000000047c2045787472696e73696373206e6f6e636520666f72206163636f756e74732e3845787472696e736963436f756e7400000c753332040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e40416c6c45787472696e736963734c656e00000c753332040004390120546f74616c206c656e67746820696e20627974657320666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b48617368010138543a3a426c6f636b4e756d6265721c543a3a48617368008000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e7369634461746101010c7533321c5665633c75383e0004000431012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d6170732065787472696e736963277320696e64657820746f206974732064617461292e2852616e646f6d5365656401001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000004882052616e646f6d2073656564206f66207468652063757272656e7420626c6f636b2e184e756d626572010038543a3a426c6f636b4e756d626572200000000000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e3845787472696e73696373526f6f7401001c543a3a486173688000000000000000000000000000000000000000000000000000000000000000000415012045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e18446967657374010024543a3a446967657374040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e74730100685665633c4576656e745265636f72643c543a3a4576656e743e3e040004a0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e0001084045787472696e7369635375636365737300049420416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c656400045420416e2065787472696e736963206661696c65642e1061757261000000002474696d657374616d702454696d657374616d7001100c4e6f77010024543a3a4d6f6d656e7420000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e2c426c6f636b506572696f64000024543a3a4d6f6d656e740400044501204f6c642073746f72616765206974656d2070726f766964656420666f7220636f6d7061746962696c6974792e2052656d6f766520616674657220616c6c206e6574776f726b732075706772616465642e344d696e696d756d506572696f64010024543a3a4d6f6d656e7420030000000000000010690120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f64690120746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c79650120776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c6520746869737020706572696f64206f6e2064656661756c742073657474696e67732e24446964557064617465010010626f6f6c040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01040c736574040c6e6f7748436f6d706163743c543a3a4d6f6d656e743e205820536574207468652063757272656e742074696d652e00750120546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652cbc20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e008d01205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920606d696e696d756d5f706572696f64602e0420d820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e0024636f6e73656e73757324436f6e73656e73757301044c4f726967696e616c417574686f7269746965730000485665633c543a3a53657373696f6e4b65793e040000011c487265706f72745f6d69736265686176696f72041c5f7265706f72741c5665633c75383e0464205265706f727420736f6d65206d69736265686176696f722e306e6f74655f6f66666c696e65041c6f66666c696e65f43c543a3a496e686572656e744f66666c696e655265706f727420617320496e686572656e744f66666c696e655265706f72743e3a3a496e686572656e74045101204e6f74652074686174207468652070726576696f757320626c6f636b27732076616c696461746f72206d697373656420697473206f70706f7274756e69747920746f2070726f706f7365206120626c6f636b2e1872656d61726b041c5f72656d61726b1c5665633c75383e046c204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e387365745f686561705f7061676573041470616765730c75363404fc2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040c6e65771c5665633c75383e04482053657420746865206e657720636f64652e2c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e046c2053657420736f6d65206974656d73206f662073746f726167652e306b696c6c5f73746f7261676504106b657973205665633c4b65793e0478204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e001c696e64696365731c496e646963657301082c4e657874456e756d53657401003c543a3a4163636f756e74496e6465781000000000047c20546865206e657874206672656520656e756d65726174696f6e207365742e1c456e756d53657401013c543a3a4163636f756e74496e646578445665633c543a3a4163636f756e7449643e00040004582054686520656e756d65726174696f6e20736574732e010001043c4e65774163636f756e74496e64657808244163636f756e744964304163636f756e74496e64657810882041206e6577206163636f756e7420696e646578207761732061737369676e65642e0005012054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e65646020746f20616e6f7468657220604163636f756e744964602e2062616c616e6365732042616c616e636573012834546f74616c49737375616e6365010028543a3a42616c616e6365400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e484578697374656e7469616c4465706f736974010028543a3a42616c616e6365400000000000000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2c5472616e73666572466565010028543a3a42616c616e636540000000000000000000000000000000000494205468652066656520726571756972656420746f206d616b652061207472616e736665722e2c4372656174696f6e466565010028543a3a42616c616e63654000000000000000000000000000000000049c205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e485472616e73616374696f6e42617365466565010028543a3a42616c616e6365400000000000000000000000000000000004dc205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e485472616e73616374696f6e42797465466565010028543a3a42616c616e63654000000000000000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e1c56657374696e67000130543a3a4163636f756e7449646c56657374696e675363686564756c653c543a3a42616c616e63653e00040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e2c4672656542616c616e6365010130543a3a4163636f756e74496428543a3a42616c616e63650040000000000000000000000000000000002c9c20546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e004101205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e204974750120616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e207468697355012062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069733d012064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b450120697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f636961746564207769746854207468652064656c65746564206163636f756e742e005d01206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473150120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e3c526573657276656442616c616e6365010130543a3a4163636f756e74496428543a3a42616c616e63650040000000000000000000000000000000002c75012054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c206765749c20736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e006d0120546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e732501207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e007501205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e7427b42069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e004d01206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473190120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e29144c6f636b73010130543a3a4163636f756e744964b05665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e00040004b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e0108207472616e736665720810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e20d8205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e00090120607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e21012049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e1501204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b4206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e00190120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e2c7365745f62616c616e63650c0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636510667265654c436f6d706163743c543a3a42616c616e63653e2072657365727665644c436f6d706163743c543a3a42616c616e63653e209420536574207468652062616c616e636573206f66206120676976656e206163636f756e742e00010120546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e190120496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c25012069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e63656029d820616e6420726573657420746865206163636f756e74206e6f6e636520286073797374656d3a3a4163636f756e744e6f6e636560292e00b420546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e010c284e65774163636f756e7408244163636f756e7449641c42616c616e6365046c2041206e6577206163636f756e742077617320637265617465642e345265617065644163636f756e7404244163636f756e744964045c20416e206163636f756e7420776173207265617065642e205472616e7366657210244163636f756e744964244163636f756e7449641c42616c616e63651c42616c616e636504b0205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e1c73657373696f6e1c53657373696f6e01202856616c696461746f72730100445665633c543a3a4163636f756e7449643e0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3453657373696f6e4c656e677468010038543a3a426c6f636b4e756d62657220e803000000000000047c2043757272656e74206c656e677468206f66207468652073657373696f6e2e3043757272656e74496e646578010038543a3a426c6f636b4e756d62657220000000000000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e3043757272656e745374617274010024543a3a4d6f6d656e7420000000000000000004a02054696d657374616d70207768656e2063757272656e742073657373696f6e20737461727465642e44466f7263696e674e657753657373696f6e000010626f6f6c0400087901204e65772073657373696f6e206973206265696e6720666f72636564206966207468697320656e747279206578697374733b20696e20776869636820636173652c2074686520626f6f6c65616e2076616c75652069732077686574686572810120746865206e65772073657373696f6e2073686f756c6420626520636f6e736964657265642061206e6f726d616c20726f746174696f6e202872657761726461626c6529206f7220657863657074696f6e616c2028736c61736861626c65292e404c6173744c656e6774684368616e6765000038543a3a426c6f636b4e756d626572040004c020426c6f636b206174207768696368207468652073657373696f6e206c656e677468206c617374206368616e6765642e284e6578744b6579466f72000130543a3a4163636f756e74496434543a3a53657373696f6e4b6579000400049020546865206e657874206b657920666f72206120676976656e2076616c696461746f722e444e65787453657373696f6e4c656e677468000038543a3a426c6f636b4e756d6265720400046420546865206e6578742073657373696f6e206c656e6774682e010c1c7365745f6b6579040c6b657934543a3a53657373696f6e4b65790861012053657473207468652073657373696f6e206b6579206f6620605f76616c696461746f726020746f20605f6b6579602e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e657874242073657373696f6e2e287365745f6c656e677468040c6e65775c436f6d706163743c543a3a426c6f636b4e756d6265723e046d01205365742061206e65772073657373696f6e206c656e6774682e20576f6e2774206b69636b20696e20756e74696c20746865206e6578742073657373696f6e206368616e6765202861742063757272656e74206c656e677468292e44666f7263655f6e65775f73657373696f6e04346170706c795f7265776172647310626f6f6c045820466f726365732061206e65772073657373696f6e2e0104284e657753657373696f6e042c426c6f636b4e756d626572085501204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b88206e756d626572206173207468652074797065206d6967687420737567676573742e1c7374616b696e671c5374616b696e6701603856616c696461746f72436f756e7401000c753332100000000004a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e7401000c7533321004000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e3853657373696f6e73506572457261010038543a3a426c6f636b4e756d62657220e80300000000000004a420546865206c656e677468206f662061207374616b696e672065726120696e2073657373696f6e732e3453657373696f6e52657761726401001c50657262696c6c103c000000042101204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e304f66666c696e65536c61736801001c50657262696c6c1040420f0004510120536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e444f66666c696e65536c617368477261636501000c7533321000000000043901204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e3c426f6e64696e674475726174696f6e010038543a3a426c6f636b4e756d62657220e80300000000000004b820546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20626c6f636b732e34496e76756c6e657261626c65730100445665633c543a3a4163636f756e7449643e040008a50120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697a65ad0120616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e646564000130543a3a4163636f756e74496430543a3a4163636f756e744964000400040101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e184c6564676572000130543a3a4163636f756e744964e45374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e000400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e145061796565010130543a3a4163636f756e7449644452657761726444657374696e6174696f6e00040004e42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e2856616c696461746f7273010130543a3a4163636f756e7449647056616c696461746f7250726566733c42616c616e63654f663c543e3e01080c0004450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e284e6f6d696e61746f7273010130543a3a4163636f756e744964445665633c543a3a4163636f756e7449643e01040004650120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e1c5374616b657273010130543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000c00000010b101204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652cc02062757420796f752063616e2066696e64207468656d20696e20746865206073657373696f6e7360206d6f64756c652e00902054686973206973206b6579656420627920746865207374617368206163636f756e742e3843757272656e74456c65637465640100445665633c543a3a4163636f756e7449643e040004fc205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e2843757272656e74457261010038543a3a426c6f636b4e756d626572200000000000000000045c205468652063757272656e742065726120696e6465782e5043757272656e7453657373696f6e52657761726401003042616c616e63654f663c543e4000000000000000000000000000000000042101204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e4043757272656e7445726152657761726401003042616c616e63654f663c543e40000000000000000000000000000000000869012054686520616363756d756c617465642072657761726420666f72207468652063757272656e74206572612e20526573657420746f207a65726f2061742074686520626567696e6e696e67206f66207468652065726120616e64cc20696e6372656173656420666f72206576657279207375636365737366756c6c792066696e69736865642073657373696f6e2e484e65787453657373696f6e73506572457261000038543a3a426c6f636b4e756d6265720400049020546865206e6578742076616c7565206f662073657373696f6e7320706572206572612e4c4c6173744572614c656e6774684368616e6765010038543a3a426c6f636b4e756d62657220000000000000000004e0205468652073657373696f6e20696e6465782061742077686963682074686520657261206c656e677468206c617374206368616e6765642e24536c6f745374616b6501003042616c616e63654f663c543e40000000000000000000000000000000000c31012054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e00c02054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e28536c617368436f756e74010130543a3a4163636f756e7449640c75333200100000000004d10120546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e34466f7263696e674e65774572610000082829040004682057652061726520666f7263696e672061206e6577206572612e3c526563656e746c794f66666c696e650100a05665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265722c20753332293e040004f101204d6f737420726563656e742060524543454e545f4f46464c494e455f434f554e546020696e7374616e6365732e202877686f206974207761732c207768656e20697420776173207265706f727465642c20686f77206d616e7920696e7374616e63657320746865792077657265206f66666c696e6520666f72292e013c10626f6e640c28636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e1470617965654452657761726444657374696e6174696f6e1081012054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c2062652074686568206163636f756e74207468617420636f6e74726f6c732069742e00250120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e28626f6e645f657874726104386d61785f6164646974696f6e616c54436f6d706163743c42616c616e63654f663c543e3e1875012041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f7224207374616b696e672e00510120557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e18756e626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e285501205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64010120706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e350120543a3a43757272656e63793a3a6578697374656e7469616c5f6465706f73697428292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e004901204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665c0207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e00982053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e4477697468647261775f756e626f6e64656400202d012052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e003501205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4c2077686174657665722069742077616e74732e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e006c2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e2076616c6964617465041470726566737056616c696461746f7250726566733c42616c616e63654f663c543e3e14e8204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e206e6f6d696e617465041c74617267657473a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e141101204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e146368696c6c0014c8204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e247365745f7061796565041470617965654452657761726444657374696e6174696f6e14b8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e387365745f636f6e74726f6c6c65720428636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636514b8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e507365745f73657373696f6e735f7065725f657261040c6e65775c436f6d706163743c543a3a426c6f636b4e756d6265723e04982053657420746865206e756d626572206f662073657373696f6e7320696e20616e206572612e507365745f626f6e64696e675f6475726174696f6e040c6e65775c436f6d706163743c543a3a426c6f636b4e756d6265723e04b020546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20657261732e4c7365745f76616c696461746f725f636f756e74040c6e657730436f6d706163743c7533323e04802054686520696465616c206e756d626572206f662076616c696461746f72732e34666f7263655f6e65775f65726104346170706c795f7265776172647310626f6f6c083d0120466f72636520746865726520746f2062652061206e6577206572612e205468697320616c736f20666f726365732061206e65772073657373696f6e20696d6d6564696174656c792061667465722e250120606170706c795f72657761726473602073686f756c64206265207472756520666f722076616c696461746f727320746f20676574207468652073657373696f6e207265776172642e5c7365745f6f66666c696e655f736c6173685f6772616365040c6e657730436f6d706163743c7533323e04902053657420746865206f66666c696e6520736c61736820677261636520706572696f642e447365745f696e76756c6e657261626c6573042876616c696461746f7273445665633c543a3a4163636f756e7449643e04cc20536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e010c18526577617264041c42616c616e636504e020416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e384f66666c696e655761726e696e6708244163636f756e7449640c753332085501204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20676976656e2061206f66666c696e652d7761726e696e67202874686579277265207374696c6c15012077697468696e207468656972206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e304f66666c696e65536c61736808244163636f756e7449641c42616c616e6365042d01204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e2464656d6f63726163792444656d6f637261637901403c5075626c696350726f70436f756e7401002450726f70496e646578100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f70730100ac5665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e0400048020546865207075626c69632070726f706f73616c732e20556e736f727465642e244465706f7369744f6600012450726f70496e646578842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e2900040004842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e304c61756e6368506572696f64010038543a3a426c6f636b4e756d62657220e80300000000000004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e384d696e696d756d4465706f73697401003042616c616e63654f663c543e400000000000000000000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e2c5075626c696344656c6179010038543a3a426c6f636b4e756d62657220000000000000000004d4205468652064656c6179206265666f726520656e6163746d656e7420666f7220616c6c207075626c6963207265666572656e64612e384d61784c6f636b506572696f647301002c4c6f636b506572696f6473040004d90120546865206d6178696d756d206e756d626572206f66206164646974696f6e616c206c6f636b20706572696f6473206120766f746572206d6179206f6666657220746f20737472656e677468656e20746865697220766f74652e204d756c7469706c6573206f6620605075626c696344656c6179602e30566f74696e67506572696f64010038543a3a426c6f636b4e756d62657220e80300000000000004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e3c5265666572656e64756d436f756e7401003c5265666572656e64756d496e646578100000000004390120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e64756d73207374617274656420736f206661722e244e65787454616c6c7901003c5265666572656e64756d496e646578100000000004c820546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e405265666572656e64756d496e666f4f6600013c5265666572656e64756d496e646578b4285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e2900040004b420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e3444697370617463685175657565010138543a3a426c6f636b4e756d626572ac5665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e00040004c0205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e24566f74657273466f7201013c5265666572656e64756d496e646578445665633c543a3a4163636f756e7449643e00040004a4204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e18566f74654f6601017c285265666572656e64756d496e6465782c20543a3a4163636f756e7449642910566f74650004000cd501204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c7564657320746865c90120766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b61012060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e1450726f7879000130543a3a4163636f756e74496430543a3a4163636f756e74496400040004b9012057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b65792069732074686520766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e2c44656c65676174696f6e73010130543a3a4163636f756e7449646c28543a3a4163636f756e7449642c204c6f636b506572696f64732901840000000000000000000000000000000000000000000000000000000000000000000441012047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e01301c70726f706f7365082070726f706f73616c40426f783c543a3a50726f706f73616c3e1476616c756554436f6d706163743c42616c616e63654f663c543e3e04a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e187365636f6e64042070726f706f73616c48436f6d706163743c50726f70496e6465783e04a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e10766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f746510566f746508350120566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bbc206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e2870726f78795f766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f746510566f746508890120566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bbc206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e4073746172745f7265666572656e64756d0c2070726f706f73616c40426f783c543a3a50726f706f73616c3e247468726573686f6c6434566f74655468726573686f6c641464656c617938543a3a426c6f636b4e756d62657204502053746172742061207265666572656e64756d2e4463616e63656c5f7265666572656e64756d04247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e04542052656d6f76652061207265666572656e64756d2e3463616e63656c5f71756575656408107768656e5c436f6d706163743c543a3a426c6f636b4e756d6265723e14776869636830436f6d706163743c7533323e04a02043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e247365745f70726f7879041470726f787930543a3a4163636f756e7449640498205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e3072657369676e5f70726f787900049820436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e3072656d6f76655f70726f7879041470726f787930543a3a4163636f756e744964049820436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e2064656c65676174650808746f30543a3a4163636f756e744964306c6f636b5f706572696f64732c4c6f636b506572696f6473043c2044656c656761746520766f74652e28756e64656c656761746500044420556e64656c656761746520766f74652e01242050726f706f736564082450726f70496e6465781c42616c616e636500185461626c65640c2450726f70496e6465781c42616c616e6365385665633c4163636f756e7449643e001c53746172746564083c5265666572656e64756d496e64657834566f74655468726573686f6c640018506173736564043c5265666572656e64756d496e64657800244e6f74506173736564043c5265666572656e64756d496e646578002443616e63656c6c6564043c5265666572656e64756d496e64657800204578656375746564083c5265666572656e64756d496e64657810626f6f6c002444656c65676174656408244163636f756e744964244163636f756e744964002c556e64656c65676174656404244163636f756e744964001c6772616e6470613c4772616e64706146696e616c69747901083450656e64696e674368616e67650000c853746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265722c20543a3a53657373696f6e4b65793e040000284e657874466f72636564000038543a3a426c6f636b4e756d6265720400000104487265706f72745f6d69736265686176696f72041c5f7265706f72741c5665633c75383e0464205265706f727420736f6d65206d69736265686176696f722e0104384e6577417574686f72697469657304585665633c2853657373696f6e4b65792c20753634293e0490204e657720617574686f726974792073657420686173206265656e206170706c6965642e3c637572617465645f6772616e64706138437572617465644772616e64706101043453687566666c65506572696f64010038543a3a426c6f636b4e756d6265722000000000000000000c9c20486f77206f6674656e20746f2073687566666c6520746865204752414e44504120736574732e003c2030206d65616e73206e657665722e0104287365745f766f746572730418766f74657273645665633c28543a3a53657373696f6e4b65792c20753634293e047c204368616e67657320746865204752414e44504120766f746572207365742e001c636f756e63696c1c436f756e63696c01503443616e646964616379426f6e6401003042616c616e63654f663c543e400900000000000000000000000000000004050120486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e28566f74696e67426f6e6401003042616c616e63654f663c543e400000000000000000000000000000000004090120486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e5050726573656e74536c617368506572566f74657201003042616c616e63654f663c543e4001000000000000000000000000000000040d01205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e284361727279436f756e7401000c753332100200000004350120486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e5050726573656e746174696f6e4475726174696f6e010038543a3a426c6f636b4e756d62657220e803000000000000043d0120486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e4c496e6163746976654772616365506572696f64010024566f7465496e646578100100000008a10120486f77206d616e7920766f746520696e6465786573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e206265207265617065642069662074686569725020617070726f76616c7320617265206d6f6f742e30566f74696e67506572696f64010038543a3a426c6f636b4e756d62657220e80300000000000004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e305465726d4475726174696f6e010038543a3a426c6f636b4e756d626572200500000000000000049820486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e3044657369726564536561747301000c753332100000000004e8204e756d626572206f66206163636f756e747320746861742073686f756c642062652073697474696e67206f6e2074686520636f756e63696c2e34416374697665436f756e63696c01008c5665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e0400106d01205468652063757272656e7420636f756e63696c2e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f72206578656375746976657101206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b207468617420746865697220706f736974696f6e20697371012061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e2074686520636f756e63696c206d656d6265722077617320656c65637465646820616e64207468656972207465726d206475726174696f6e292e24566f7465436f756e74010024566f7465496e64657810000000000405012054686520746f74616c206e756d626572206f6620766f746573207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e2c417070726f76616c734f66010130543a3a4163636f756e744964245665633c626f6f6c3e000400086d012041206c697374206f6620766f74657320666f72206561636820766f7465722c2072657370656374696e6720746865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f7465722077617340206c617374206163746976652061742e385265676973746572496e666f4f66000130543a3a4163636f756e7449644028566f7465496e6465782c2075333229000400087d012054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f74582063757272656e746c7920726567697374657265642e304c6173744163746976654f66000130543a3a4163636f756e74496424566f7465496e64657800040004010120546865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e18566f746572730100445665633c543a3a4163636f756e7449643e04000460205468652070726573656e7420766f746572206c6973742e2843616e646964617465730100445665633c543a3a4163636f756e7449643e04000470205468652070726573656e742063616e646964617465206c6973742e3843616e646964617465436f756e7401000c753332100000000000304e65787446696e616c697a650000a028543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e29040004210120546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e40536e617073686f7465645374616b65730100445665633c42616c616e63654f663c543e3e040004e820546865207374616b6573206173207468657920776572652061742074686520706f696e7420746861742074686520766f746520656e6465642e2c4c6561646572626f6172640000845665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e040004e02047657420746865206c6561646572626f61726420696620776527726520696e207468652070726573656e746174696f6e2070686173652e0128347365745f617070726f76616c730814766f746573245665633c626f6f6c3e14696e64657848436f6d706163743c566f7465496e6465783e086101205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473402061726520726567697374657265642e4c70726f78795f7365745f617070726f76616c730814766f746573245665633c626f6f6c3e14696e64657848436f6d706163743c566f7465496e6465783e089501205365742063616e64696461746520617070726f76616c732066726f6d20612070726f78792e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473402061726520726567697374657265642e4c726561705f696e6163746976655f766f74657210387265706f727465725f696e64657830436f6d706163743c7533323e0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652477686f5f696e64657830436f6d706163743c7533323e48617373756d65645f766f74655f696e64657848436f6d706163743c566f7465496e6465783e1461012052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e64696365737101206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f74206166746572a02074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e000101204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e34726574726163745f766f7465720414696e64657830436f6d706163743c7533323e042d012052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e407375626d69745f63616e6469646163790410736c6f7430436f6d706163743c7533323e0c78205375626d6974206f6e6573656c6620666f722063616e6469646163792e001101204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e3870726573656e745f77696e6e65720c2463616e6469646174658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636514746f74616c54436f6d706163743c42616c616e63654f663c543e3e14696e64657848436f6d706163743c566f7465496e6465783e0c650120436c61696d207468617420607369676e656460206973206f6e65206f662074686520746f702053656c663a3a63617272795f636f756e742829202b2063757272656e745f766f746528292e312063616e646964617465732ea501204f6e6c7920776f726b73206966207468652060626c6f636b5f6e756d626572203e3d2063757272656e745f766f746528292e306020616e6420603c2063757272656e745f766f746528292e30202b2070726573656e746174696f6e5f6475726174696f6e282960607820607369676e6564602073686f756c642068617665206174206c65617374447365745f646573697265645f73656174730414636f756e7430436f6d706163743c7533323e0c650120536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f74206265207570690120656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c72656164793420696e2070726f67726573732e3472656d6f76655f6d656d626572040c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650c71012052656d6f7665206120706172746963756c6172206d656d6265722e20412074616c6c792077696c6c2068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e410120706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e7c20546869732069732065666665637469766520696d6d6564696174656c792e647365745f70726573656e746174696f6e5f6475726174696f6e0414636f756e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08590120536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c6020696e766f6b65206066696e616c697a655f766f7465602e447365745f7465726d5f6475726174696f6e0414636f756e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08510120536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c6020696e766f6b65206066696e616c697a655f766f7465602e01102c566f74657252656170656408244163636f756e744964244163636f756e74496404542072656170656420766f7465722c2072656170657240426164526561706572536c617368656404244163636f756e744964043c20736c6173686564207265617065723054616c6c7953746172746564040c75333204f420412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320737461727465642e3854616c6c7946696e616c697a656408385665633c4163636f756e7449643e385665633c4163636f756e7449643e04690120412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e38636f756e63696c5f766f74696e6734436f756e63696c566f74696e67012034436f6f6c6f6666506572696f64010038543a3a426c6f636b4e756d62657220e8030000000000000030566f74696e67506572696f64010038543a3a426c6f636b4e756d6265722003000000000000000040456e61637444656c6179506572696f64010038543a3a426c6f636b4e756d62657220000000000000000004cd01204e756d626572206f6620626c6f636b7320627920776869636820746f2064656c617920656e6163746d656e74206f66207375636365737366756c2c206e6f6e2d756e616e696d6f75732d636f756e63696c2d696e7374696761746564207265666572656e64756d2070726f706f73616c732e2450726f706f73616c730100785665633c28543a3a426c6f636b4e756d6265722c20543a3a48617368293e0400002850726f706f73616c4f6600011c543a3a486173682c543a3a50726f706f73616c000400003850726f706f73616c566f7465727301011c543a3a48617368445665633c543a3a4163636f756e7449643e0004000034436f756e63696c566f74654f6600015c28543a3a486173682c20543a3a4163636f756e7449642910626f6f6c00040000385665746f656450726f706f73616c00011c543a3a486173688c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e290004000001141c70726f706f7365042070726f706f73616c40426f783c543a3a50726f706f73616c3e0010766f7465082070726f706f73616c1c543a3a486173681c617070726f766510626f6f6c00107665746f043470726f706f73616c5f686173681c543a3a4861736800487365745f636f6f6c6f66665f706572696f640418626c6f636b735c436f6d706163743c543a3a426c6f636b4e756d6265723e00447365745f766f74696e675f706572696f640418626c6f636b735c436f6d706163743c543a3a426c6f636b4e756d6265723e0001084054616c6c7943616e63656c6174696f6e1010486173680c7533320c7533320c753332080101204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d2063616e63656c6c6174696f6e20766f74652ea0204c61737420746872656520617265207965732c206e6f2c206162737461696e20636f756e74732e3c54616c6c795265666572656e64756d1010486173680c7533320c7533320c75333208cc204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d20766f74652ea0204c61737420746872656520617265207965732c206e6f2c206162737461696e20636f756e74732e3c636f756e63696c5f6d6f74696f6e7338436f756e63696c4d6f74696f6e7301102450726f706f73616c730100305665633c543a3a486173683e04000498205468652028686173686573206f662920746865206163746976652070726f706f73616c732e2850726f706f73616c4f6600011c543a3a48617368583c542061732054726169743e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e6700011c543a3a48617368e82850726f706f73616c496e6465782c207533322c205665633c543a3a4163636f756e7449643e2c205665633c543a3a4163636f756e7449643e2900040004250120566f74657320666f72206120676976656e2070726f706f73616c3a202872657175697265645f7965735f766f7465732c207965735f766f746572732c206e6f5f766f74657273292e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e01081c70726f706f736508247468726573686f6c6430436f6d706163743c7533323e2070726f706f73616c6c426f783c3c542061732054726169743e3a3a50726f706f73616c3e0010766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c0001142050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173680c7533320465012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20753332292e14566f74656414244163636f756e744964104861736810626f6f6c0c7533320c7533320809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67f420612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e206173207533327320726573706563746976656c79292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408104861736810626f6f6c0405012041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e20747265617375727920547265617375727901203050726f706f73616c426f6e6401001c5065726d696c6c10000000000851012050726f706f7274696f6e206f662066756e647320746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c61636520612070726f706f73616c2e20416e206163636570746564dc2070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f65736e27742e4c50726f706f73616c426f6e644d696e696d756d01003042616c616e63654f663c543e4000000000000000000000000000000000044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f64010038543a3a426c6f636b4e756d626572200100000000000000048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e01001c5065726d696c6c10000000000411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e0c506f7401003042616c616e63654f663c543e400000000000000000000000000000000004cc20546f74616c2066756e647320617661696c61626c6520746f2074686973206d6f64756c6520666f72207370656e64696e672e3450726f706f73616c436f756e7401003450726f706f73616c496e646578100000000004a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c7300013450726f706f73616c496e6465789050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c730100485665633c50726f706f73616c496e6465783e040004f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e01143470726f706f73655f7370656e64081476616c756554436f6d706163743c42616c616e63654f663c543e3e2c62656e65666963696172798c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650c2d012050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c7565350120697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e636520746865542070726f706f73616c20697320617761726465642e1c7365745f706f74041c6e65775f706f7454436f6d706163743c42616c616e63654f663c543e3e04b420536574207468652062616c616e6365206f662066756e647320617661696c61626c6520746f207370656e642e24636f6e666967757265103470726f706f73616c5f626f6e6440436f6d706163743c5065726d696c6c3e5470726f706f73616c5f626f6e645f6d696e696d756d54436f6d706163743c42616c616e63654f663c543e3e307370656e645f706572696f645c436f6d706163743c543a3a426c6f636b4e756d6265723e106275726e40436f6d706163743c5065726d696c6c3e0470202852652d29636f6e6669677572652074686973206d6f64756c652e3c72656a6563745f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e04fc2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e40617070726f76655f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e085d0120417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e6566696369617279ac20616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e01142050726f706f736564043450726f706f73616c496e6465780438204e65772070726f706f73616c2e205370656e64696e67041c42616c616e636504e8205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e1c417761726465640c3450726f706f73616c496e6465781c42616c616e6365244163636f756e744964048020536f6d652066756e64732068617665206265656e20616c6c6f63617465642e144275726e74041c42616c616e6365048c20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20526f6c6c6f766572041c42616c616e6365043101205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e2870617261636861696e732850617261636861696e7301102850617261636861696e7301002c5665633c5061726149643e04000010436f64650001185061726149641c5665633c75383e000400001448656164730001185061726149641c5665633c75383e0004000024446964557064617465010010626f6f6c040000010c247365745f686561647304146865616473585665633c417474657374656443616e6469646174653e0415012050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e4872656769737465725f70617261636861696e0c0869641850617261496410636f64651c5665633c75383e44696e697469616c5f686561645f646174611c5665633c75383e089820526567697374657220612070617261636861696e207769746820676976656e20636f64652e8c204661696c7320696620676976656e20494420697320616c726561647920757365642e50646572656769737465725f70617261636861696e04086964185061726149640494204465726567697374657220612070617261636861696e207769746820676976656e20696400107375646f105375646f01040c4b6579010030543a3a4163636f756e74496480000000000000000000000000000000000000000000000000000000000000000004842054686520604163636f756e74496460206f6620746865207375646f206b65792e0108107375646f042070726f706f73616c40426f783c543a3a50726f706f73616c3e0c39012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e1c7365745f6b6579040c6e65778c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650c75012041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e01081453756469640410626f6f6c04602041207375646f206a75737420746f6f6b20706c6163652e284b65794368616e67656404244163636f756e74496404f020546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e" +metadata_v2_hex = "0x6d65746102441873797374656d1853797374656d012c304163636f756e744e6f6e6365010130543a3a4163636f756e74496420543a3a496e64657800200000000000000000003845787472696e736963436f756e7400000c75333204000040416c6c45787472696e736963734c656e00000c75333204000024426c6f636b48617368010138543a3a426c6f636b4e756d6265721c543a3a4861736800800000000000000000000000000000000000000000000000000000000000000000003445787472696e7369634461746101010c7533321c5665633c75383e000400002852616e646f6d5365656401001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000000184e756d626572010038543a3a426c6f636b4e756d626572200000000000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801001c543a3a48617368800000000000000000000000000000000000000000000000000000000000000000003845787472696e73696373526f6f7401001c543a3a486173688000000000000000000000000000000000000000000000000000000000000000000018446967657374010024543a3a446967657374040000184576656e74730100685665633c4576656e745265636f72643c543a3a4576656e743e3e0400000001084045787472696e7369635375636365737300049420416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c656400045420416e2065787472696e736963206661696c65642e1061757261000000002474696d657374616d702454696d657374616d70010c0c4e6f77010024543a3a4d6f6d656e7420000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e2c426c6f636b506572696f64010024543a3a4d6f6d656e7420050000000000000004c420546865206d696e696d756d2028616e6420616476697365642920706572696f64206265747765656e20626c6f636b732e24446964557064617465010010626f6f6c040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01040c736574040c6e6f7748436f6d706163743c543a3a4d6f6d656e743e205820536574207468652063757272656e742074696d652e00750120546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652cbc20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e008501205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e74207370656369666965642062792060626c6f636b5f706572696f64602e0420d820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e0024636f6e73656e73757324436f6e73656e73757301044c4f726967696e616c417574686f7269746965730000485665633c543a3a53657373696f6e4b65793e040000011c487265706f72745f6d69736265686176696f72041c5f7265706f72741c5665633c75383e0468205265706f727420736f6d65206d69736265686176696f75722e306e6f74655f6f66666c696e65041c6f66666c696e65f43c543a3a496e686572656e744f66666c696e655265706f727420617320496e686572656e744f66666c696e655265706f72743e3a3a496e686572656e74044501204e6f7465207468652070726576696f757320626c6f636b27732076616c696461746f72206d6973736564207468656972206f70706f7274756e69747920746f2070726f706f7365206120626c6f636b2e1872656d61726b041c5f72656d61726b1c5665633c75383e046c204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e387365745f686561705f7061676573041470616765730c75363404fc2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040c6e65771c5665633c75383e04482053657420746865206e657720636f64652e2c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e046c2053657420736f6d65206974656d73206f662073746f726167652e306b696c6c5f73746f7261676504106b657973205665633c4b65793e0478204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e001c696e64696365731c496e646963657301082c4e657874456e756d53657401003c543a3a4163636f756e74496e6465781000000000047c20546865206e657874206672656520656e756d65726174696f6e207365742e1c456e756d53657401013c543a3a4163636f756e74496e646578445665633c543a3a4163636f756e7449643e00040004582054686520656e756d65726174696f6e20736574732e010001043c4e65774163636f756e74496e64657808244163636f756e744964304163636f756e74496e64657810882041206e6577206163636f756e7420696e646578207761732061737369676e65642e0005012054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e65646020746f20616e6f7468657220604163636f756e744964602e2062616c616e6365732042616c616e636573012834546f74616c49737375616e6365010028543a3a42616c616e6365400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e484578697374656e7469616c4465706f736974010028543a3a42616c616e6365400000000000000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2c5472616e73666572466565010028543a3a42616c616e636540000000000000000000000000000000000494205468652066656520726571756972656420746f206d616b652061207472616e736665722e2c4372656174696f6e466565010028543a3a42616c616e63654000000000000000000000000000000000049c205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e485472616e73616374696f6e42617365466565010028543a3a42616c616e6365400000000000000000000000000000000004dc205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e485472616e73616374696f6e42797465466565010028543a3a42616c616e63654000000000000000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e1c56657374696e67000130543a3a4163636f756e7449646c56657374696e675363686564756c653c543a3a42616c616e63653e00040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e2c4672656542616c616e6365010130543a3a4163636f756e74496428543a3a42616c616e63650040000000000000000000000000000000002c9c20546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e004101205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e204974750120616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e207468697355012062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069733d012064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b450120697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f636961746564207769746854207468652064656c65746564206163636f756e742e005d01206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473150120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e3c526573657276656442616c616e6365010130543a3a4163636f756e74496428543a3a42616c616e63650040000000000000000000000000000000002c75012054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c206765749c20736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e006d0120546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e732501207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e007501205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e7427b42069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e004d01206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473190120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e29144c6f636b73010130543a3a4163636f756e744964b05665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e00040004b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e0108207472616e736665720810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e20d8205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e00090120607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e21012049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e1501204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b4206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e00190120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e2c7365745f62616c616e63650c0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636510667265654c436f6d706163743c543a3a42616c616e63653e2072657365727665644c436f6d706163743c543a3a42616c616e63653e209420536574207468652062616c616e636573206f66206120676976656e206163636f756e742e00010120546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e190120496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c25012069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e63656029d820616e6420726573657420746865206163636f756e74206e6f6e636520286073797374656d3a3a4163636f756e744e6f6e636560292e00b420546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e010c284e65774163636f756e7408244163636f756e7449641c42616c616e6365046c2041206e6577206163636f756e742077617320637265617465642e345265617065644163636f756e7404244163636f756e744964045c20416e206163636f756e7420776173207265617065642e205472616e7366657210244163636f756e744964244163636f756e7449641c42616c616e63651c42616c616e636504b0205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e1c73657373696f6e1c53657373696f6e01202856616c696461746f72730100445665633c543a3a4163636f756e7449643e0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3453657373696f6e4c656e677468010038543a3a426c6f636b4e756d62657220e803000000000000047c2043757272656e74206c656e677468206f66207468652073657373696f6e2e3043757272656e74496e646578010038543a3a426c6f636b4e756d62657220000000000000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e3043757272656e745374617274010024543a3a4d6f6d656e7420000000000000000004a02054696d657374616d70207768656e2063757272656e742073657373696f6e20737461727465642e44466f7263696e674e657753657373696f6e000010626f6f6c0400087901204e65772073657373696f6e206973206265696e6720666f72636564206973207468697320656e747279206578697374733b20696e20776869636820636173652c2074686520626f6f6c65616e2076616c75652069732077686574686572810120746865206e65772073657373696f6e2073686f756c6420626520636f6e736964657265642061206e6f726d616c20726f746174696f6e202872657761726461626c6529206f7220657863657074696f6e616c2028736c61736861626c65292e404c6173744c656e6774684368616e6765000038543a3a426c6f636b4e756d626572040004c020426c6f636b206174207768696368207468652073657373696f6e206c656e677468206c617374206368616e6765642e284e6578744b6579466f72000130543a3a4163636f756e74496434543a3a53657373696f6e4b6579000400049020546865206e657874206b657920666f72206120676976656e2076616c696461746f722e444e65787453657373696f6e4c656e677468000038543a3a426c6f636b4e756d6265720400046420546865206e6578742073657373696f6e206c656e6774682e010c1c7365745f6b6579040c6b657934543a3a53657373696f6e4b65790861012053657473207468652073657373696f6e206b6579206f6620605f76616c696461746f726020746f20605f6b6579602e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e657874242073657373696f6e2e287365745f6c656e677468040c6e65775c436f6d706163743c543a3a426c6f636b4e756d6265723e046d01205365742061206e65772073657373696f6e206c656e6774682e20576f6e2774206b69636b20696e20756e74696c20746865206e6578742073657373696f6e206368616e6765202861742063757272656e74206c656e677468292e44666f7263655f6e65775f73657373696f6e04346170706c795f7265776172647310626f6f6c045820466f726365732061206e65772073657373696f6e2e0104284e657753657373696f6e042c426c6f636b4e756d626572085501204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b88206e756d626572206173207468652074797065206d6967687420737567676573742e1c7374616b696e671c5374616b696e6701603856616c696461746f72436f756e7401000c753332100000000004a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e7401000c7533321004000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e3853657373696f6e73506572457261010038543a3a426c6f636b4e756d62657220e80300000000000004a420546865206c656e677468206f662061207374616b696e672065726120696e2073657373696f6e732e3453657373696f6e52657761726401001c50657262696c6c103c000000042101204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e304f66666c696e65536c61736801001c50657262696c6c1040420f0004510120536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e444f66666c696e65536c617368477261636501000c7533321000000000043901204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e3c426f6e64696e674475726174696f6e010038543a3a426c6f636b4e756d62657220e80300000000000004b820546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20626c6f636b732e34496e76756c6e657261626c65730100445665633c543a3a4163636f756e7449643e040008a50120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697365ad0120616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e646564000130543a3a4163636f756e74496430543a3a4163636f756e744964000400040101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e184c6564676572000130543a3a4163636f756e744964e45374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e000400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e145061796565010130543a3a4163636f756e7449644452657761726444657374696e6174696f6e00040004e42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e2856616c696461746f7273010130543a3a4163636f756e7449647056616c696461746f7250726566733c42616c616e63654f663c543e3e01080c0004450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e284e6f6d696e61746f7273010130543a3a4163636f756e744964445665633c543a3a4163636f756e7449643e01040004650120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e1c5374616b657273010130543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000c00000010b101204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652cc02062757420796f752063616e2066696e64207468656d20696e20746865206073657373696f6e7360206d6f64756c652e00902054686973206973206b6579656420627920746865207374617368206163636f756e742e3843757272656e74456c65637465640100445665633c543a3a4163636f756e7449643e040004fc205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e2843757272656e74457261010038543a3a426c6f636b4e756d626572200000000000000000045c205468652063757272656e742065726120696e6465782e5043757272656e7453657373696f6e52657761726401003042616c616e63654f663c543e4000000000000000000000000000000000042101204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e4043757272656e7445726152657761726401003042616c616e63654f663c543e40000000000000000000000000000000000869012054686520616363756d756c617465642072657761726420666f72207468652063757272656e74206572612e20526573657420746f207a65726f2061742074686520626567696e6e696e67206f66207468652065726120616e64cc20696e6372656173656420666f72206576657279207375636365737366756c6c792066696e69736865642073657373696f6e2e484e65787453657373696f6e73506572457261000038543a3a426c6f636b4e756d6265720400049020546865206e6578742076616c7565206f662073657373696f6e7320706572206572612e4c4c6173744572614c656e6774684368616e6765010038543a3a426c6f636b4e756d62657220000000000000000004e0205468652073657373696f6e20696e6465782061742077686963682074686520657261206c656e677468206c617374206368616e6765642e24536c6f745374616b6501003042616c616e63654f663c543e40000000000000000000000000000000000c31012054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e00c02054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e28536c617368436f756e74010130543a3a4163636f756e7449640c75333200100000000004d10120546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e34466f7263696e674e65774572610000082829040004682057652061726520666f7263696e672061206e6577206572612e3c526563656e746c794f66666c696e650100a05665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265722c20753332293e040004f101204d6f737420726563656e742060524543454e545f4f46464c494e455f434f554e546020696e7374616e6365732e202877686f206974207761732c207768656e20697420776173207265706f727465642c20686f77206d616e7920696e7374616e63657320746865792077657265206f66666c696e6520666f72292e013c10626f6e640c28636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e1470617965654452657761726444657374696e6174696f6e1081012054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c2062652074686568206163636f756e74207468617420636f6e74726f6c732069742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e28626f6e645f657874726104386d61785f6164646974696f6e616c54436f6d706163743c42616c616e63654f663c543e3e1875012041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f7224207374616b696e672e00510120557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e18756e626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e285501205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64010120706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e350120543a3a43757272656e63793a3a6578697374656e7469616c5f6465706f73697428292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e004901204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665c0207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e00982053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e4477697468647261775f756e626f6e64656400202d012052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e003501205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4c2077686174657665722069742077616e74732e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e006c2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e2076616c6964617465041470726566737056616c696461746f7250726566733c42616c616e63654f663c543e3e14e8204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e206e6f6d696e617465041c74617267657473a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e141101204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e146368696c6c0014c8204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e247365745f7061796565041470617965654452657761726444657374696e6174696f6e14b8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e387365745f636f6e74726f6c6c65720428636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636514b8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e507365745f73657373696f6e735f7065725f657261040c6e65775c436f6d706163743c543a3a426c6f636b4e756d6265723e04982053657420746865206e756d626572206f662073657373696f6e7320696e20616e206572612e507365745f626f6e64696e675f6475726174696f6e040c6e65775c436f6d706163743c543a3a426c6f636b4e756d6265723e04b020546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20657261732e4c7365745f76616c696461746f725f636f756e74040c6e657730436f6d706163743c7533323e04802054686520696465616c206e756d626572206f662076616c696461746f72732e34666f7263655f6e65775f65726104346170706c795f7265776172647310626f6f6c083d0120466f72636520746865726520746f2062652061206e6577206572612e205468697320616c736f20666f726365732061206e65772073657373696f6e20696d6d6564696174656c792061667465722e250120606170706c795f72657761726473602073686f756c64206265207472756520666f722076616c696461746f727320746f20676574207468652073657373696f6e207265776172642e5c7365745f6f66666c696e655f736c6173685f6772616365040c6e657730436f6d706163743c7533323e04902053657420746865206f66666c696e6520736c61736820677261636520706572696f642e447365745f696e76756c6e657261626c6573042876616c696461746f7273445665633c543a3a4163636f756e7449643e04cc20536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e010c18526577617264041c42616c616e636504e020416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e384f66666c696e655761726e696e6708244163636f756e7449640c753332085501204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20676976656e2061206f66666c696e652d7761726e696e67202874686579277265207374696c6c15012077697468696e207468656972206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e304f66666c696e65536c61736808244163636f756e7449641c42616c616e6365042d01204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e2464656d6f63726163792444656d6f6372616379013c3c5075626c696350726f70436f756e7401002450726f70496e646578100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f70730100ac5665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e0400048020546865207075626c69632070726f706f73616c732e20556e736f727465642e244465706f7369744f6600012450726f70496e646578842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e2900040004842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e304c61756e6368506572696f64010038543a3a426c6f636b4e756d62657220e80300000000000004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e384d696e696d756d4465706f73697401003042616c616e63654f663c543e400000000000000000000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e2c5075626c696344656c6179010038543a3a426c6f636b4e756d62657220000000000000000004d4205468652064656c6179206265666f726520656e6163746d656e7420666f7220616c6c207075626c6963207265666572656e64612e384d61784c6f636b506572696f647301002c4c6f636b506572696f6473040004d90120546865206d6178696d756d206e756d626572206f66206164646974696f6e616c206c6f636b20706572696f6473206120766f746572206d6179206f6666657220746f20737472656e677468656e20746865697220766f74652e204d756c7469706c6573206f6620605075626c696344656c6179602e30566f74696e67506572696f64010038543a3a426c6f636b4e756d62657220e80300000000000004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e3c5265666572656e64756d436f756e7401003c5265666572656e64756d496e646578100000000004390120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e64756d73207374617274656420736f206661722e244e65787454616c6c7901003c5265666572656e64756d496e646578100000000004c820546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e405265666572656e64756d496e666f4f6600013c5265666572656e64756d496e646578b4285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e2900040004b420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e3444697370617463685175657565010138543a3a426c6f636b4e756d626572ac5665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e00040004c0205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e24566f74657273466f7201013c5265666572656e64756d496e646578445665633c543a3a4163636f756e7449643e00040004a4204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e18566f74654f6601017c285265666572656e64756d496e6465782c20543a3a4163636f756e7449642910566f74650004000cd501204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c7564657320746865c90120766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b61012060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e2c44656c65676174696f6e73010130543a3a4163636f756e7449646c28543a3a4163636f756e7449642c204c6f636b506572696f64732901840000000000000000000000000000000000000000000000000000000000000000000441012047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e01201c70726f706f7365082070726f706f73616c40426f783c543a3a50726f706f73616c3e1476616c756554436f6d706163743c42616c616e63654f663c543e3e04a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e187365636f6e64042070726f706f73616c48436f6d706163743c50726f70496e6465783e04a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e10766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f746510566f746508350120566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bbc206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e4073746172745f7265666572656e64756d0c2070726f706f73616c40426f783c543a3a50726f706f73616c3e247468726573686f6c6434566f74655468726573686f6c641464656c617938543a3a426c6f636b4e756d62657204502053746172742061207265666572656e64756d2e4463616e63656c5f7265666572656e64756d04247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e04542052656d6f76652061207265666572656e64756d2e3463616e63656c5f71756575656408107768656e5c436f6d706163743c543a3a426c6f636b4e756d6265723e14776869636830436f6d706163743c7533323e04a02043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e2064656c65676174650808746f30543a3a4163636f756e744964306c6f636b5f706572696f64732c4c6f636b506572696f6473043c2044656c656761746520766f74652e28756e64656c656761746500044420556e64656c656761746520766f74652e01242050726f706f736564082450726f70496e6465781c42616c616e636500185461626c65640c2450726f70496e6465781c42616c616e6365385665633c4163636f756e7449643e001c53746172746564083c5265666572656e64756d496e64657834566f74655468726573686f6c640018506173736564043c5265666572656e64756d496e64657800244e6f74506173736564043c5265666572656e64756d496e646578002443616e63656c6c6564043c5265666572656e64756d496e64657800204578656375746564083c5265666572656e64756d496e64657810626f6f6c002444656c65676174656408244163636f756e744964244163636f756e744964002c556e64656c65676174656404244163636f756e744964001c6772616e6470613c4772616e64706146696e616c69747901083450656e64696e674368616e67650000c853746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265722c20543a3a53657373696f6e4b65793e040000284e657874466f72636564000038543a3a426c6f636b4e756d6265720400000104487265706f72745f6d69736265686176696f72041c5f7265706f72741c5665633c75383e0468205265706f727420736f6d65206d69736265686176696f75722e0104384e6577417574686f72697469657304585665633c2853657373696f6e4b65792c20753634293e0490204e657720617574686f726974792073657420686173206265656e206170706c6965642e3c637572617465645f6772616e64706138437572617465644772616e64706101043453687566666c65506572696f64010038543a3a426c6f636b4e756d6265722000000000000000000c9c20486f77206f6674656e20746f2073687566666c6520746865204752414e44504120736574732e003c2030206d65616e73206e657665722e0104287365745f766f746572730418766f74657273645665633c28543a3a53657373696f6e4b65792c20753634293e047c204368616e67657320746865204752414e44504120766f746572207365742e001c636f756e63696c1c436f756e63696c01503443616e646964616379426f6e6401003042616c616e63654f663c543e400900000000000000000000000000000004050120486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e28566f74696e67426f6e6401003042616c616e63654f663c543e400000000000000000000000000000000004090120486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e5050726573656e74536c617368506572566f74657201003042616c616e63654f663c543e4001000000000000000000000000000000040d01205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e284361727279436f756e7401000c753332100200000004350120486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e5050726573656e746174696f6e4475726174696f6e010038543a3a426c6f636b4e756d62657220e803000000000000043d0120486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e4c496e6163746976654772616365506572696f64010024566f7465496e646578100100000008a10120486f77206d616e7920766f746520696e6465786573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e206265207265617065642069662074686569725020617070726f76616c7320617265206d6f6f742e30566f74696e67506572696f64010038543a3a426c6f636b4e756d62657220e80300000000000004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e305465726d4475726174696f6e010038543a3a426c6f636b4e756d626572200500000000000000049820486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e3044657369726564536561747301000c753332100000000004e8204e756d626572206f66206163636f756e747320746861742073686f756c642062652073697474696e67206f6e2074686520636f756e63696c2e34416374697665436f756e63696c01008c5665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e0400106d01205468652063757272656e7420636f756e63696c2e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f72206578656375746976657101206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b207468617420746865697220706f736974696f6e20697371012061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e2074686520636f756e63696c206d656d6265722077617320656c65637465646820616e64207468656972207465726d206475726174696f6e292e24566f7465436f756e74010024566f7465496e64657810000000000405012054686520746f74616c206e756d626572206f6620766f746573207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e2c417070726f76616c734f66010130543a3a4163636f756e744964245665633c626f6f6c3e000400086d012041206c697374206f6620766f74657320666f72206561636820766f7465722c2072657370656374696e6720746865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f7465722077617340206c617374206163746976652061742e385265676973746572496e666f4f66000130543a3a4163636f756e7449644028566f7465496e6465782c2075333229000400087d012054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f74582063757272656e746c7920726567697374657265642e304c6173744163746976654f66000130543a3a4163636f756e74496424566f7465496e64657800040004010120546865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e18566f746572730100445665633c543a3a4163636f756e7449643e04000460205468652070726573656e7420766f746572206c6973742e2843616e646964617465730100445665633c543a3a4163636f756e7449643e04000470205468652070726573656e742063616e646964617465206c6973742e3843616e646964617465436f756e7401000c753332100000000000304e65787446696e616c6973650000a028543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e29040004210120546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e40536e617073686f7465645374616b65730100445665633c42616c616e63654f663c543e3e040004e820546865207374616b6573206173207468657920776572652061742074686520706f696e7420746861742074686520766f746520656e6465642e2c4c6561646572626f6172640000845665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e040004e02047657420746865206c6561646572626f6172642069662077653b726520696e207468652070726573656e746174696f6e2070686173652e0124347365745f617070726f76616c730814766f746573245665633c626f6f6c3e14696e64657848436f6d706163743c566f7465496e6465783e086101205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473402061726520726567697374657265642e4c726561705f696e6163746976655f766f74657210387265706f727465725f696e64657830436f6d706163743c7533323e0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652477686f5f696e64657830436f6d706163743c7533323e48617373756d65645f766f74655f696e64657848436f6d706163743c566f7465496e6465783e1461012052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e64696365737101206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f74206166746572a02074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e000101204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e34726574726163745f766f7465720414696e64657830436f6d706163743c7533323e042d012052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e407375626d69745f63616e6469646163790410736c6f7430436f6d706163743c7533323e0c78205375626d6974206f6e6573656c6620666f722063616e6469646163792e001101204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e3870726573656e745f77696e6e65720c2463616e6469646174658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636514746f74616c54436f6d706163743c42616c616e63654f663c543e3e14696e64657848436f6d706163743c566f7465496e6465783e0c650120436c61696d207468617420607369676e656460206973206f6e65206f662074686520746f702053656c663a3a63617272795f636f756e742829202b2063757272656e745f766f746528292e312063616e646964617465732ea501204f6e6c7920776f726b73206966207468652060626c6f636b5f6e756d626572203e3d2063757272656e745f766f746528292e306020616e6420603c2063757272656e745f766f746528292e30202b2070726573656e746174696f6e5f6475726174696f6e282960607820607369676e6564602073686f756c642068617665206174206c65617374447365745f646573697265645f73656174730414636f756e7430436f6d706163743c7533323e0c650120536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f74206265207570690120656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c72656164793420696e2070726f67726573732e3472656d6f76655f6d656d626572040c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650c71012052656d6f7665206120706172746963756c6172206d656d6265722e20412074616c6c792077696c6c2068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e410120706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e7c20546869732069732065666665637469766520696d6d6564696174656c792e647365745f70726573656e746174696f6e5f6475726174696f6e0414636f756e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08590120536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c6020696e766f6b65206066696e616c6973655f766f7465602e447365745f7465726d5f6475726174696f6e0414636f756e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08510120536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c6020696e766f6b65206066696e616c6973655f766f7465602e01102c566f74657252656170656408244163636f756e744964244163636f756e74496404542072656170656420766f7465722c2072656170657240426164526561706572536c617368656404244163636f756e744964043c20736c6173686564207265617065723054616c6c7953746172746564040c75333204f420412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320737461727465642e3854616c6c7946696e616c6973656408385665633c4163636f756e7449643e385665633c4163636f756e7449643e04690120412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e38636f756e63696c5f766f74696e6734436f756e63696c566f74696e67012034436f6f6c6f6666506572696f64010038543a3a426c6f636b4e756d62657220e8030000000000000030566f74696e67506572696f64010038543a3a426c6f636b4e756d6265722003000000000000000040456e61637444656c6179506572696f64010038543a3a426c6f636b4e756d62657220000000000000000004cd01204e756d626572206f6620626c6f636b7320627920776869636820746f2064656c617920656e6163746d656e74206f66207375636365737366756c2c206e6f6e2d756e616e696d6f75732d636f756e63696c2d696e7374696761746564207265666572656e64756d2070726f706f73616c732e2450726f706f73616c730100785665633c28543a3a426c6f636b4e756d6265722c20543a3a48617368293e0400002850726f706f73616c4f6600011c543a3a486173682c543a3a50726f706f73616c000400003850726f706f73616c566f7465727301011c543a3a48617368445665633c543a3a4163636f756e7449643e0004000034436f756e63696c566f74654f6600015c28543a3a486173682c20543a3a4163636f756e7449642910626f6f6c00040000385665746f656450726f706f73616c00011c543a3a486173688c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e290004000001141c70726f706f7365042070726f706f73616c40426f783c543a3a50726f706f73616c3e0010766f7465082070726f706f73616c1c543a3a486173681c617070726f766510626f6f6c00107665746f043470726f706f73616c5f686173681c543a3a4861736800487365745f636f6f6c6f66665f706572696f640418626c6f636b735c436f6d706163743c543a3a426c6f636b4e756d6265723e00447365745f766f74696e675f706572696f640418626c6f636b735c436f6d706163743c543a3a426c6f636b4e756d6265723e0001084054616c6c7943616e63656c6174696f6e1010486173680c7533320c7533320c753332080101204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d2063616e63656c6c6174696f6e20766f74652ea0204c61737420746872656520617265207965732c206e6f2c206162737461696e20636f756e74732e3c54616c6c795265666572656e64756d1010486173680c7533320c7533320c75333208cc204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d20766f74652ea0204c61737420746872656520617265207965732c206e6f2c206162737461696e20636f756e74732e3c636f756e63696c5f6d6f74696f6e7338436f756e63696c4d6f74696f6e7301102450726f706f73616c730100305665633c543a3a486173683e04000498205468652028686173686573206f662920746865206163746976652070726f706f73616c732e2850726f706f73616c4f6600011c543a3a48617368583c542061732054726169743e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e6700011c543a3a48617368e82850726f706f73616c496e6465782c207533322c205665633c543a3a4163636f756e7449643e2c205665633c543a3a4163636f756e7449643e2900040004250120566f74657320666f72206120676976656e2070726f706f73616c3a202872657175697265645f7965735f766f7465732c207965735f766f746572732c206e6f5f766f74657273292e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e01081c70726f706f736508247468726573686f6c6430436f6d706163743c7533323e2070726f706f73616c6c426f783c3c542061732054726169743e3a3a50726f706f73616c3e0010766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c0001142050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173680c7533320465012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20753332292e14566f74656414244163636f756e744964104861736810626f6f6c0c7533320c7533320809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67f420612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e206173207533327320726573706563746976656c79292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408104861736810626f6f6c0405012041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e20747265617375727920547265617375727901203050726f706f73616c426f6e6401001c5065726d696c6c10000000000851012050726f706f7274696f6e206f662066756e647320746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c61636520612070726f706f73616c2e20416e206163636570746564dc2070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f65736e27742e4c50726f706f73616c426f6e644d696e696d756d01003042616c616e63654f663c543e4000000000000000000000000000000000044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f64010038543a3a426c6f636b4e756d626572200100000000000000048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e01001c5065726d696c6c10000000000411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e0c506f7401003042616c616e63654f663c543e400000000000000000000000000000000004cc20546f74616c2066756e647320617661696c61626c6520746f2074686973206d6f64756c6520666f72207370656e64696e672e3450726f706f73616c436f756e7401003450726f706f73616c496e646578100000000004a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c7300013450726f706f73616c496e6465789050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c730100485665633c50726f706f73616c496e6465783e040004f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e01143470726f706f73655f7370656e64081476616c756554436f6d706163743c42616c616e63654f663c543e3e2c62656e65666963696172798c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650c2d012050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c7565350120697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e636520746865542070726f706f73616c20697320617761726465642e1c7365745f706f74041c6e65775f706f7454436f6d706163743c42616c616e63654f663c543e3e04b420536574207468652062616c616e6365206f662066756e647320617661696c61626c6520746f207370656e642e24636f6e666967757265103470726f706f73616c5f626f6e6440436f6d706163743c5065726d696c6c3e5470726f706f73616c5f626f6e645f6d696e696d756d54436f6d706163743c42616c616e63654f663c543e3e307370656e645f706572696f645c436f6d706163743c543a3a426c6f636b4e756d6265723e106275726e40436f6d706163743c5065726d696c6c3e0470202852652d29636f6e6669677572652074686973206d6f64756c652e3c72656a6563745f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e04fc2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e40617070726f76655f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e085d0120417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e6566696369617279ac20616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e01142050726f706f736564043450726f706f73616c496e6465780438204e65772070726f706f73616c2e205370656e64696e67041c42616c616e636504e8205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e1c417761726465640c3450726f706f73616c496e6465781c42616c616e6365244163636f756e744964048020536f6d652066756e64732068617665206265656e20616c6c6f63617465642e144275726e74041c42616c616e6365048c20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20526f6c6c6f766572041c42616c616e6365043101205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e2870617261636861696e732850617261636861696e7301102850617261636861696e7301002c5665633c5061726149643e04000010436f64650001185061726149641c5665633c75383e000400001448656164730001185061726149641c5665633c75383e0004000024446964557064617465010010626f6f6c040000010c247365745f686561647304146865616473585665633c417474657374656443616e6469646174653e0415012050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e4872656769737465725f70617261636861696e0c0869641850617261496410636f64651c5665633c75383e44696e697469616c5f686561645f646174611c5665633c75383e089820526567697374657220612070617261636861696e207769746820676976656e20636f64652e8c204661696c7320696620676976656e20494420697320616c726561647920757365642e50646572656769737465725f70617261636861696e04086964185061726149640494204465726567697374657220612070617261636861696e207769746820676976656e20696400107375646f105375646f01040c4b6579010030543a3a4163636f756e744964800000000000000000000000000000000000000000000000000000000000000000000108107375646f042070726f706f73616c40426f783c543a3a50726f706f73616c3e001c7365745f6b6579040c6e65778c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001081453756469640410626f6f6c04602041207375646f206a75737420746f6f6b20706c6163652e284b65794368616e67656404244163636f756e74496404f020546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e" +metadata_v1_hex = "0x6d65746101441873797374656d1853797374656d012c304163636f756e744e6f6e6365010130543a3a4163636f756e74496420543a3a496e646578200000000000000000003845787472696e736963436f756e7400000c75333204000040416c6c45787472696e736963734c656e00000c75333204000024426c6f636b48617368010138543a3a426c6f636b4e756d6265721c543a3a48617368800000000000000000000000000000000000000000000000000000000000000000003445787472696e7369634461746101010c7533321c5665633c75383e0400002852616e646f6d5365656401001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000000184e756d626572010038543a3a426c6f636b4e756d626572200000000000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801001c543a3a48617368800000000000000000000000000000000000000000000000000000000000000000003845787472696e73696373526f6f7401001c543a3a486173688000000000000000000000000000000000000000000000000000000000000000000018446967657374010024543a3a446967657374040000184576656e74730100685665633c4576656e745265636f72643c543a3a4576656e743e3e0400000001084045787472696e7369635375636365737300049420416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c656400045420416e2065787472696e736963206661696c65642e1061757261000000002474696d657374616d702454696d657374616d70010c0c4e6f77010024543a3a4d6f6d656e7420000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e2c426c6f636b506572696f64010024543a3a4d6f6d656e7420050000000000000004c420546865206d696e696d756d2028616e6420616476697365642920706572696f64206265747765656e20626c6f636b732e24446964557064617465010010626f6f6c040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01040c736574040c6e6f7748436f6d706163743c543a3a4d6f6d656e743e205820536574207468652063757272656e742074696d652e00750120546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652cbc20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e008501205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e74207370656369666965642062792060626c6f636b5f706572696f64602e0420d820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e0024636f6e73656e73757324436f6e73656e73757301044c4f726967696e616c417574686f7269746965730000485665633c543a3a53657373696f6e4b65793e0400000118487265706f72745f6d69736265686176696f72041c5f7265706f72741c5665633c75383e0468205265706f727420736f6d65206d69736265686176696f75722e306e6f74655f6f66666c696e65041c6f66666c696e65f43c543a3a496e686572656e744f66666c696e655265706f727420617320496e686572656e744f66666c696e655265706f72743e3a3a496e686572656e74044501204e6f7465207468652070726576696f757320626c6f636b27732076616c696461746f72206d6973736564207468656972206f70706f7274756e69747920746f2070726f706f7365206120626c6f636b2e1872656d61726b041c5f72656d61726b1c5665633c75383e046c204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e387365745f686561705f7061676573041470616765730c75363404fc2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040c6e65771c5665633c75383e04482053657420746865206e657720636f64652e2c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e046c2053657420736f6d65206974656d73206f662073746f726167652e001c696e64696365731c496e646963657301082c4e657874456e756d53657401003c543a3a4163636f756e74496e6465781000000000047c20546865206e657874206672656520656e756d65726174696f6e207365742e1c456e756d53657401013c543a3a4163636f756e74496e646578445665633c543a3a4163636f756e7449643e040004582054686520656e756d65726174696f6e20736574732e010001043c4e65774163636f756e74496e64657808244163636f756e744964304163636f756e74496e64657810882041206e6577206163636f756e7420696e646578207761732061737369676e65642e0005012054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e65646020746f20616e6f7468657220604163636f756e744964602e2062616c616e6365732042616c616e636573012834546f74616c49737375616e6365010028543a3a42616c616e6365400000000000000000000000000000000004a42054686520746f74616c20616d6f756e74206f66207374616b65206f6e207468652073797374656d2e484578697374656e7469616c4465706f736974010028543a3a42616c616e6365400000000000000000000000000000000004d020546865206d696e696d756d20616d6f756e7420616c6c6f77656420746f206b65657020616e206163636f756e74206f70656e2e2c5472616e73666572466565010028543a3a42616c616e636540000000000000000000000000000000000494205468652066656520726571756972656420746f206d616b652061207472616e736665722e2c4372656174696f6e466565010028543a3a42616c616e63654000000000000000000000000000000000042501205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e204174206c6561737420617320626967206173205265636c61696d5265626174652e485472616e73616374696f6e42617365466565010028543a3a42616c616e6365400000000000000000000000000000000004dc205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e485472616e73616374696f6e42797465466565010028543a3a42616c616e63654000000000000000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e1c56657374696e67000130543a3a4163636f756e7449646c56657374696e675363686564756c653c543a3a42616c616e63653e040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e2c4672656542616c616e6365010130543a3a4163636f756e74496428543a3a42616c616e636540000000000000000000000000000000002c9c20546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e004d01205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e204974206973690120616c6f6e65207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e207468697355012062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069733d012064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865726d6f72652c20604f6e4672656542616c616e63655a65726f602063616c6c6261636b410120697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e75702064617461206173736f636961746564207769746854207468652064656c65746564206163636f756e742e005d01206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473150120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e3c526573657276656442616c616e6365010130543a3a4163636f756e74496428543a3a42616c616e636540000000000000000000000000000000003075012054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c206765749c20736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e006d0120546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e737101207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e20285468697320697320646966666572656e74290120616e642077686f6c6c7920756e72656c6174656420746f207468652060426f6e64616765602073797374656d207573656420696e20746865207374616b696e67206d6f64756c652e29007501205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e7427b42069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e004d01206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473150120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e144c6f636b73010130543a3a4163636f756e744964b05665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e040004b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e0108207472616e736665720810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e04d4205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572207374616b65722e2c7365745f62616c616e63650c0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636510667265654c436f6d706163743c543a3a42616c616e63653e2072657365727665644c436f6d706163743c543a3a42616c616e63653e049420536574207468652062616c616e636573206f66206120676976656e206163636f756e742e010c284e65774163636f756e7408244163636f756e7449641c42616c616e6365046c2041206e6577206163636f756e742077617320637265617465642e345265617065644163636f756e7404244163636f756e744964045c20416e206163636f756e7420776173207265617065642e205472616e7366657210244163636f756e744964244163636f756e7449641c42616c616e63651c42616c616e636504b0205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e1c73657373696f6e1c53657373696f6e01202856616c696461746f72730100445665633c543a3a4163636f756e7449643e0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3453657373696f6e4c656e677468010038543a3a426c6f636b4e756d62657220e803000000000000047c2043757272656e74206c656e677468206f66207468652073657373696f6e2e3043757272656e74496e646578010038543a3a426c6f636b4e756d62657220000000000000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e3043757272656e745374617274010024543a3a4d6f6d656e7420000000000000000004a02054696d657374616d70207768656e2063757272656e742073657373696f6e20737461727465642e44466f7263696e674e657753657373696f6e000010626f6f6c0400087901204e65772073657373696f6e206973206265696e6720666f72636564206973207468697320656e747279206578697374733b20696e20776869636820636173652c2074686520626f6f6c65616e2076616c75652069732077686574686572810120746865206e65772073657373696f6e2073686f756c6420626520636f6e736964657265642061206e6f726d616c20726f746174696f6e202872657761726461626c6529206f7220657863657074696f6e616c2028736c61736861626c65292e404c6173744c656e6774684368616e6765000038543a3a426c6f636b4e756d626572040004c020426c6f636b206174207768696368207468652073657373696f6e206c656e677468206c617374206368616e6765642e284e6578744b6579466f72000130543a3a4163636f756e74496434543a3a53657373696f6e4b65790400049020546865206e657874206b657920666f72206120676976656e2076616c696461746f722e444e65787453657373696f6e4c656e677468000038543a3a426c6f636b4e756d6265720400046420546865206e6578742073657373696f6e206c656e6774682e010c1c7365745f6b6579040c6b657934543a3a53657373696f6e4b65790861012053657473207468652073657373696f6e206b6579206f6620605f76616c696461746f726020746f20605f6b6579602e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e657874242073657373696f6e2e287365745f6c656e677468040c6e65775c436f6d706163743c543a3a426c6f636b4e756d6265723e046d01205365742061206e65772073657373696f6e206c656e6774682e20576f6e2774206b69636b20696e20756e74696c20746865206e6578742073657373696f6e206368616e6765202861742063757272656e74206c656e677468292e44666f7263655f6e65775f73657373696f6e04346170706c795f7265776172647310626f6f6c045820466f726365732061206e65772073657373696f6e2e0104284e657753657373696f6e042c426c6f636b4e756d626572085501204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b88206e756d626572206173207468652074797065206d6967687420737567676573742e1c7374616b696e671c5374616b696e6701643856616c696461746f72436f756e7401000c753332100000000004a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e7401000c7533321004000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e3853657373696f6e73506572457261010038543a3a426c6f636b4e756d62657220e80300000000000004a420546865206c656e677468206f662061207374616b696e672065726120696e2073657373696f6e732e3453657373696f6e52657761726401001c50657262696c6c103c000000042101204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e304f66666c696e65536c61736801001c50657262696c6c1040420f0004510120536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e444f66666c696e65536c617368477261636501000c7533321000000000043901204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e3c426f6e64696e674475726174696f6e010038543a3a426c6f636b4e756d62657220e80300000000000004b820546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20626c6f636b732e30496e76756c657261626c65730100445665633c543a3a4163636f756e7449643e04000034496e76756c6e657261626c65730100445665633c543a3a4163636f756e7449643e040008a50120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697365ad0120616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e646564000130543a3a4163636f756e74496430543a3a4163636f756e7449640400040101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e184c6564676572000130543a3a4163636f756e744964e45374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e0400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e145061796565010130543a3a4163636f756e7449644452657761726444657374696e6174696f6e040004a42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e2856616c696461746f7273010130543a3a4163636f756e7449647056616c696461746f7250726566733c42616c616e63654f663c543e3e080c000cec2054686520736574206f66206b6579732061726520616c6c20636f6e74726f6c6c65727320746861742077616e7420746f2076616c69646174652e00d4205468652076616c756573206172652074686520707265666572656e636573207468617420612076616c696461746f72206861732e284e6f6d696e61746f7273010130543a3a4163636f756e744964445665633c543a3a4163636f756e7449643e04000cec2054686520736574206f66206b6579732061726520616c6c20636f6e74726f6c6c65727320746861742077616e7420746f206e6f6d696e6174652e007c205468652076616c75652061726520746865206e6f6d696e6174696f6e732e1c5374616b657273010130543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e0c00000008b101204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652cc02062757420796f752063616e2066696e64207468656d20696e20746865206073657373696f6e7360206d6f64756c652e2843757272656e74457261010038543a3a426c6f636b4e756d626572200000000000000000045c205468652063757272656e742065726120696e6465782e5043757272656e7453657373696f6e52657761726401003042616c616e63654f663c543e4000000000000000000000000000000000042101204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e4c43757272656e744f66666c696e65536c61736801003042616c616e63654f663c543e400000000000000000000000000000000004510120536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e4043757272656e7445726152657761726401003042616c616e63654f663c543e40000000000000000000000000000000000869012054686520616363756d756c617465642072657761726420666f72207468652063757272656e74206572612e20526573657420746f207a65726f2061742074686520626567696e6e696e67206f66207468652065726120616e64cc20696e6372656173656420666f72206576657279207375636365737366756c6c792066696e69736865642073657373696f6e2e484e65787453657373696f6e73506572457261000038543a3a426c6f636b4e756d6265720400049020546865206e6578742076616c7565206f662073657373696f6e7320706572206572612e4c4c6173744572614c656e6774684368616e6765010038543a3a426c6f636b4e756d62657220000000000000000004e0205468652073657373696f6e20696e6465782061742077686963682074686520657261206c656e677468206c617374206368616e6765642e24536c6f745374616b6501003042616c616e63654f663c543e40000000000000000000000000000000000c31012054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e00c02054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e28536c617368436f756e74010130543a3a4163636f756e7449640c753332100000000004d10120546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e34466f7263696e674e65774572610000082829040004682057652061726520666f7263696e672061206e6577206572612e3c526563656e746c794f66666c696e650100a05665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265722c20753332293e040004f101204d6f737420726563656e742060524543454e545f4f46464c494e455f434f554e546020696e7374616e6365732e202877686f206974207761732c207768656e20697420776173207265706f727465642c20686f77206d616e7920696e7374616e63657320746865792077657265206f66666c696e6520666f72292e013810626f6e640c28636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e1470617965654452657761726444657374696e6174696f6e0881012054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c2062652074686568206163636f756e74207468617420636f6e74726f6c732069742e28626f6e645f657874726104386d61785f6164646974696f6e616c3042616c616e63654f663c543e1875012041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f7224207374616b696e672e00510120557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e00fc204e4f54453a20546869732063616c6c206d757374206265206d6164652062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e18756e626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e285501205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64010120706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e350120543a3a43757272656e63793a3a6578697374656e7469616c5f6465706f73697428292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e004901204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665c0207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e00fc204e4f54453a20546869732063616c6c206d757374206265206d6164652062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e00982053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e4477697468647261775f756e626f6e64656400202d012052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e003501205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4c2077686174657665722069742077616e74732e00fc204e4f54453a20546869732063616c6c206d757374206265206d6164652062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e006c2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e2076616c6964617465041470726566737056616c696461746f7250726566733c42616c616e63654f663c543e3e14e8204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00fc204e4f54453a20546869732063616c6c206d757374206265206d6164652062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e206e6f6d696e617465041c74617267657473a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e141101204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00fc204e4f54453a20546869732063616c6c206d757374206265206d6164652062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e146368696c6c0014c8204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00fc204e4f54453a20546869732063616c6c206d757374206265206d6164652062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e247365745f7061796565041470617965654452657761726444657374696e6174696f6e14b8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00fc204e4f54453a20546869732063616c6c206d757374206265206d6164652062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e507365745f73657373696f6e735f7065725f657261040c6e65775c436f6d706163743c543a3a426c6f636b4e756d6265723e04982053657420746865206e756d626572206f662073657373696f6e7320696e20616e206572612e507365745f626f6e64696e675f6475726174696f6e040c6e65775c436f6d706163743c543a3a426c6f636b4e756d6265723e04b020546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20657261732e4c7365745f76616c696461746f725f636f756e74040c6e657730436f6d706163743c7533323e04802054686520696465616c206e756d626572206f662076616c696461746f72732e34666f7263655f6e65775f65726104346170706c795f7265776172647310626f6f6c083d0120466f72636520746865726520746f2062652061206e6577206572612e205468697320616c736f20666f726365732061206e65772073657373696f6e20696d6d6564696174656c792061667465722e250120606170706c795f72657761726473602073686f756c64206265207472756520666f722076616c696461746f727320746f20676574207468652073657373696f6e207265776172642e5c7365745f6f66666c696e655f736c6173685f6772616365040c6e657730436f6d706163743c7533323e04902053657420746865206f66666c696e6520736c61736820677261636520706572696f642e447365745f696e76756c6e657261626c6573042876616c696461746f7273445665633c543a3a4163636f756e7449643e04cc20536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e010c18526577617264041c42616c616e636504e020416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e384f66666c696e655761726e696e6708244163636f756e7449640c753332085501204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20676976656e2061206f66666c696e652d7761726e696e67202874686579277265207374696c6c15012077697468696e207468656972206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e304f66666c696e65536c61736808244163636f756e7449641c42616c616e6365042d01204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e2464656d6f63726163792444656d6f6372616379013c3c5075626c696350726f70436f756e7401002450726f70496e646578100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f70730100ac5665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e0400048020546865207075626c69632070726f706f73616c732e20556e736f727465642e244465706f7369744f6600012450726f70496e646578842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29040004842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e304c61756e6368506572696f64010038543a3a426c6f636b4e756d62657220e80300000000000004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e384d696e696d756d4465706f73697401003042616c616e63654f663c543e400000000000000000000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e2c5075626c696344656c6179010038543a3a426c6f636b4e756d62657220000000000000000004d4205468652064656c6179206265666f726520656e6163746d656e7420666f7220616c6c207075626c6963207265666572656e64612e384d61784c6f636b506572696f647301002c4c6f636b506572696f6473040004d90120546865206d6178696d756d206e756d626572206f66206164646974696f6e616c206c6f636b20706572696f6473206120766f746572206d6179206f6666657220746f20737472656e677468656e20746865697220766f74652e204d756c7469706c6573206f6620605075626c696344656c6179602e30566f74696e67506572696f64010038543a3a426c6f636b4e756d62657220e80300000000000004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e3c5265666572656e64756d436f756e7401003c5265666572656e64756d496e646578100000000004390120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e64756d73207374617274656420736f206661722e244e65787454616c6c7901003c5265666572656e64756d496e646578100000000004c820546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e405265666572656e64756d496e666f4f6600013c5265666572656e64756d496e646578b4285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e29040004b420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e3444697370617463685175657565010138543a3a426c6f636b4e756d626572ac5665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e040004c0205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e24566f74657273466f7201013c5265666572656e64756d496e646578445665633c543a3a4163636f756e7449643e040004a4204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e18566f74654f6601017c285265666572656e64756d496e6465782c20543a3a4163636f756e7449642910566f746504000cd501204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c7564657320746865c90120766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b61012060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e2c44656c65676174696f6e73010130543a3a4163636f756e7449646c28543a3a4163636f756e7449642c204c6f636b506572696f647329840000000000000000000000000000000000000000000000000000000000000000000441012047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e01201c70726f706f7365082070726f706f73616c40426f783c543a3a50726f706f73616c3e1476616c756554436f6d706163743c42616c616e63654f663c543e3e04a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e187365636f6e64042070726f706f73616c48436f6d706163743c50726f70496e6465783e04a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e10766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f746510566f746508350120566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bbc206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e4073746172745f7265666572656e64756d0c2070726f706f73616c40426f783c543a3a50726f706f73616c3e247468726573686f6c6434566f74655468726573686f6c641464656c617938543a3a426c6f636b4e756d62657204502053746172742061207265666572656e64756d2e4463616e63656c5f7265666572656e64756d04247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e04542052656d6f76652061207265666572656e64756d2e3463616e63656c5f71756575656408107768656e5c436f6d706163743c543a3a426c6f636b4e756d6265723e14776869636830436f6d706163743c7533323e04a02043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e2064656c65676174650808746f30543a3a4163636f756e744964306c6f636b5f706572696f64732c4c6f636b506572696f6473043c2044656c656761746520766f74652e28756e64656c656761746500044420556e64656c656761746520766f74652e01242050726f706f736564082450726f70496e6465781c42616c616e636500185461626c65640c2450726f70496e6465781c42616c616e6365385665633c4163636f756e7449643e001c53746172746564083c5265666572656e64756d496e64657834566f74655468726573686f6c640018506173736564043c5265666572656e64756d496e64657800244e6f74506173736564043c5265666572656e64756d496e646578002443616e63656c6c6564043c5265666572656e64756d496e64657800204578656375746564083c5265666572656e64756d496e64657810626f6f6c002444656c65676174656408244163636f756e744964244163636f756e744964002c556e64656c65676174656404244163636f756e744964001c6772616e6470613c4772616e64706146696e616c69747901083450656e64696e674368616e67650000c853746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265722c20543a3a53657373696f6e4b65793e040000284e657874466f72636564000038543a3a426c6f636b4e756d6265720400000104487265706f72745f6d69736265686176696f72041c5f7265706f72741c5665633c75383e0468205265706f727420736f6d65206d69736265686176696f75722e0104384e6577417574686f72697469657304585665633c2853657373696f6e4b65792c20753634293e0490204e657720617574686f726974792073657420686173206265656e206170706c6965642e3c637572617465645f6772616e64706138437572617465644772616e64706101043453687566666c65506572696f64010038543a3a426c6f636b4e756d6265722000000000000000000c9c20486f77206f6674656e20746f2073687566666c6520746865204752414e44504120736574732e003c2030206d65616e73206e657665722e0104287365745f766f746572730418766f74657273645665633c28543a3a53657373696f6e4b65792c20753634293e047c204368616e67657320746865204752414e44504120766f746572207365742e001c636f756e63696c1c436f756e63696c01503443616e646964616379426f6e6401003042616c616e63654f663c543e400900000000000000000000000000000004050120486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e28566f74696e67426f6e6401003042616c616e63654f663c543e400000000000000000000000000000000004090120486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e5050726573656e74536c617368506572566f74657201003042616c616e63654f663c543e4001000000000000000000000000000000040d01205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e284361727279436f756e7401000c753332100200000004350120486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e5050726573656e746174696f6e4475726174696f6e010038543a3a426c6f636b4e756d62657220e803000000000000043d0120486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e4c496e6163746976654772616365506572696f64010024566f7465496e646578100100000008a10120486f77206d616e7920766f746520696e6465786573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e206265207265617065642069662074686569725020617070726f76616c7320617265206d6f6f742e30566f74696e67506572696f64010038543a3a426c6f636b4e756d62657220e80300000000000004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e305465726d4475726174696f6e010038543a3a426c6f636b4e756d626572200500000000000000049820486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e3044657369726564536561747301000c753332100000000004e8204e756d626572206f66206163636f756e747320746861742073686f756c642062652073697474696e67206f6e2074686520636f756e63696c2e34416374697665436f756e63696c01008c5665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e0400106d01205468652063757272656e7420636f756e63696c2e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f72206578656375746976657101206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b207468617420746865697220706f736974696f6e20697371012061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e2074686520636f756e63696c206d656d6265722077617320656c65637465646820616e64207468656972207465726d206475726174696f6e292e24566f7465436f756e74010024566f7465496e64657810000000000405012054686520746f74616c206e756d626572206f6620766f746573207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e2c417070726f76616c734f66010130543a3a4163636f756e744964245665633c626f6f6c3e0400086d012041206c697374206f6620766f74657320666f72206561636820766f7465722c2072657370656374696e6720746865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f7465722077617340206c617374206163746976652061742e385265676973746572496e666f4f66000130543a3a4163636f756e7449644028566f7465496e6465782c20753332290400087d012054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f74582063757272656e746c7920726567697374657265642e304c6173744163746976654f66000130543a3a4163636f756e74496424566f7465496e646578040004010120546865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e18566f746572730100445665633c543a3a4163636f756e7449643e04000460205468652070726573656e7420766f746572206c6973742e2843616e646964617465730100445665633c543a3a4163636f756e7449643e04000470205468652070726573656e742063616e646964617465206c6973742e3843616e646964617465436f756e7401000c753332100000000000304e65787446696e616c6973650000a028543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e29040004210120546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e40536e617073686f7465645374616b65730100445665633c42616c616e63654f663c543e3e040004e820546865207374616b6573206173207468657920776572652061742074686520706f696e7420746861742074686520766f746520656e6465642e2c4c6561646572626f6172640000845665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e040004e02047657420746865206c6561646572626f6172642069662077653b726520696e207468652070726573656e746174696f6e2070686173652e0124347365745f617070726f76616c730814766f746573245665633c626f6f6c3e14696e64657848436f6d706163743c566f7465496e6465783e086101205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473402061726520726567697374657265642e4c726561705f696e6163746976655f766f74657210387265706f727465725f696e64657830436f6d706163743c7533323e0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652477686f5f696e64657830436f6d706163743c7533323e48617373756d65645f766f74655f696e64657848436f6d706163743c566f7465496e6465783e1461012052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e64696365737101206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f74206166746572a02074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e000101204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e34726574726163745f766f7465720414696e64657830436f6d706163743c7533323e042d012052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e407375626d69745f63616e6469646163790410736c6f7430436f6d706163743c7533323e0c78205375626d6974206f6e6573656c6620666f722063616e6469646163792e001101204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e3870726573656e745f77696e6e65720c2463616e6469646174658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636514746f74616c54436f6d706163743c42616c616e63654f663c543e3e14696e64657848436f6d706163743c566f7465496e6465783e0c650120436c61696d207468617420607369676e656460206973206f6e65206f662074686520746f702053656c663a3a63617272795f636f756e742829202b2063757272656e745f766f746528292e312063616e646964617465732ea501204f6e6c7920776f726b73206966207468652060626c6f636b5f6e756d626572203e3d2063757272656e745f766f746528292e306020616e6420603c2063757272656e745f766f746528292e30202b2070726573656e746174696f6e5f6475726174696f6e282960607820607369676e6564602073686f756c642068617665206174206c65617374447365745f646573697265645f73656174730414636f756e7430436f6d706163743c7533323e0c650120536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f74206265207570690120656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c72656164793420696e2070726f67726573732e3472656d6f76655f6d656d626572040c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650c71012052656d6f7665206120706172746963756c6172206d656d6265722e20412074616c6c792077696c6c2068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e410120706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e7c20546869732069732065666665637469766520696d6d6564696174656c792e647365745f70726573656e746174696f6e5f6475726174696f6e0414636f756e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08590120536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c6020696e766f6b65206066696e616c6973655f766f7465602e447365745f7465726d5f6475726174696f6e0414636f756e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08510120536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c6020696e766f6b65206066696e616c6973655f766f7465602e01102c566f74657252656170656408244163636f756e744964244163636f756e74496404542072656170656420766f7465722c2072656170657240426164526561706572536c617368656404244163636f756e744964043c20736c6173686564207265617065723054616c6c7953746172746564040c75333204f420412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320737461727465642e3854616c6c7946696e616c6973656408385665633c4163636f756e7449643e385665633c4163636f756e7449643e04690120412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e38636f756e63696c5f766f74696e6734436f756e63696c566f74696e67012034436f6f6c6f6666506572696f64010038543a3a426c6f636b4e756d62657220e8030000000000000030566f74696e67506572696f64010038543a3a426c6f636b4e756d6265722003000000000000000040456e61637444656c6179506572696f64010038543a3a426c6f636b4e756d62657220000000000000000004cd01204e756d626572206f6620626c6f636b7320627920776869636820746f2064656c617920656e6163746d656e74206f66207375636365737366756c2c206e6f6e2d756e616e696d6f75732d636f756e63696c2d696e7374696761746564207265666572656e64756d2070726f706f73616c732e2450726f706f73616c730100785665633c28543a3a426c6f636b4e756d6265722c20543a3a48617368293e0400002850726f706f73616c4f6600011c543a3a486173682c543a3a50726f706f73616c0400003850726f706f73616c566f7465727301011c543a3a48617368445665633c543a3a4163636f756e7449643e04000034436f756e63696c566f74654f6600015c28543a3a486173682c20543a3a4163636f756e7449642910626f6f6c040000385665746f656450726f706f73616c00011c543a3a486173688c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e2904000001141c70726f706f7365042070726f706f73616c40426f783c543a3a50726f706f73616c3e0010766f7465082070726f706f73616c1c543a3a486173681c617070726f766510626f6f6c00107665746f043470726f706f73616c5f686173681c543a3a4861736800487365745f636f6f6c6f66665f706572696f640418626c6f636b735c436f6d706163743c543a3a426c6f636b4e756d6265723e00447365745f766f74696e675f706572696f640418626c6f636b735c436f6d706163743c543a3a426c6f636b4e756d6265723e0001084054616c6c7943616e63656c6174696f6e1010486173680c7533320c7533320c753332080101204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d2063616e63656c6c6174696f6e20766f74652ea0204c61737420746872656520617265207965732c206e6f2c206162737461696e20636f756e74732e3c54616c6c795265666572656e64756d1010486173680c7533320c7533320c75333208cc204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d20766f74652ea0204c61737420746872656520617265207965732c206e6f2c206162737461696e20636f756e74732e3c636f756e63696c5f6d6f74696f6e7338436f756e63696c4d6f74696f6e7301102450726f706f73616c730100305665633c543a3a486173683e04000498205468652028686173686573206f662920746865206163746976652070726f706f73616c732e2850726f706f73616c4f6600011c543a3a48617368583c542061732054726169743e3a3a50726f706f73616c040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e6700011c543a3a48617368e82850726f706f73616c496e6465782c207533322c205665633c543a3a4163636f756e7449643e2c205665633c543a3a4163636f756e7449643e29040004250120566f74657320666f72206120676976656e2070726f706f73616c3a202872657175697265645f7965735f766f7465732c207965735f766f746572732c206e6f5f766f74657273292e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e01081c70726f706f736508247468726573686f6c6430436f6d706163743c7533323e2070726f706f73616c6c426f783c3c542061732054726169743e3a3a50726f706f73616c3e0010766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c0001142050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173680c7533320465012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20753332292e14566f74656414244163636f756e744964104861736810626f6f6c0c7533320c7533320809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67f420612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e206173207533327320726573706563746976656c79292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408104861736810626f6f6c0405012041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e20747265617375727920547265617375727901203050726f706f73616c426f6e6401001c5065726d696c6c10000000000851012050726f706f7274696f6e206f662066756e647320746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c61636520612070726f706f73616c2e20416e206163636570746564dc2070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f65736e27742e4c50726f706f73616c426f6e644d696e696d756d01003042616c616e63654f663c543e4000000000000000000000000000000000044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f64010038543a3a426c6f636b4e756d626572200100000000000000048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e01001c5065726d696c6c10000000000411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e0c506f7401003042616c616e63654f663c543e400000000000000000000000000000000004cc20546f74616c2066756e647320617661696c61626c6520746f2074686973206d6f64756c6520666f72207370656e64696e672e3450726f706f73616c436f756e7401003450726f706f73616c496e646578100000000004a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c7300013450726f706f73616c496e6465789050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e0400047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c730100485665633c50726f706f73616c496e6465783e040004f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e01143470726f706f73655f7370656e64081476616c756554436f6d706163743c42616c616e63654f663c543e3e2c62656e65666963696172798c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650c2d012050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c7565350120697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e636520746865542070726f706f73616c20697320617761726465642e1c7365745f706f74041c6e65775f706f7454436f6d706163743c42616c616e63654f663c543e3e04b420536574207468652062616c616e6365206f662066756e647320617661696c61626c6520746f207370656e642e24636f6e666967757265103470726f706f73616c5f626f6e6440436f6d706163743c5065726d696c6c3e5470726f706f73616c5f626f6e645f6d696e696d756d54436f6d706163743c42616c616e63654f663c543e3e307370656e645f706572696f645c436f6d706163743c543a3a426c6f636b4e756d6265723e106275726e40436f6d706163743c5065726d696c6c3e0470202852652d29636f6e6669677572652074686973206d6f64756c652e3c72656a6563745f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e04fc2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e40617070726f76655f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e085d0120417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e6566696369617279ac20616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e01142050726f706f736564043450726f706f73616c496e6465780438204e65772070726f706f73616c2e205370656e64696e67041c42616c616e636504e8205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e1c417761726465640c3450726f706f73616c496e6465781c42616c616e6365244163636f756e744964048020536f6d652066756e64732068617665206265656e20616c6c6f63617465642e144275726e74041c42616c616e6365048c20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20526f6c6c6f766572041c42616c616e6365043101205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e2870617261636861696e732850617261636861696e7301102850617261636861696e7301002c5665633c5061726149643e04000010436f64650001185061726149641c5665633c75383e0400001448656164730001185061726149641c5665633c75383e04000024446964557064617465010010626f6f6c040000010c247365745f686561647304146865616473585665633c417474657374656443616e6469646174653e0415012050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e4872656769737465725f70617261636861696e0c0869641850617261496410636f64651c5665633c75383e44696e697469616c5f686561645f646174611c5665633c75383e089820526567697374657220612070617261636861696e207769746820676976656e20636f64652e8c204661696c7320696620676976656e20494420697320616c726561647920757365642e50646572656769737465725f70617261636861696e04086964185061726149640494204465726567697374657220612070617261636861696e207769746820676976656e20696400107375646f105375646f01040c4b6579010030543a3a4163636f756e744964800000000000000000000000000000000000000000000000000000000000000000000108107375646f042070726f706f73616c40426f783c543a3a50726f706f73616c3e001c7365745f6b6579040c6e65778c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001081453756469640410626f6f6c04602041207375646f206a75737420746f6f6b20706c6163652e284b65794368616e67656404244163636f756e74496404f020546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e" +invalid_metadata_v1_hex = "0x6d65746101441873797374656d1853797374656d012c304163636f756e744e6f6e6365010130543a3a4163636f756e74496420543a3a496e646578200000000000000000003845787472696e736963436f756e7400000c75333204000040416c6c45787472696e736963734c656e00000c75333204000024426c6f636b48617368010138543a3a426c6f636b4e756d6265721c543a3a48617368800000000000000000000000000000000000000000000000000000000000000000003445787472696e7369634461746101010c7533321c5665633c75383e0400002852616e646f6d5365656401001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000000184e756d626572010038543a3a426c6f636b4e756d626572200000000000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801001c543a3a48617368800000000000000000000000000000000000000000000000000000000000000000003845787472696e73696373526f6f7401001c543a3a486173688000000000000000000000000000000000000000000000000000000000000000000018446967657374010024543a3a446967657374040000184576656e74730100685665633c4576656e745265636f72643c543a3a4576656e743e3e0400000001084045787472696e7369635375636365737300049420416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c656400045420416e2065787472696e736963206661696c65642e1061757261000000002474696d657374616d702454696d657374616d70010c0c4e6f77010024543a3a4d6f6d656e7420000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e2c426c6f636b506572696f64010024543a3a4d6f6d656e7420050000000000000004c420546865206d696e696d756d2028616e6420616476697365642920706572696f64206265747765656e20626c6f636b732e24446964557064617465010010626f6f6c040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01040c736574040c6e6f7748436f6d706163743c543a3a4d6f6d656e743e205820536574207468652063757272656e742074696d652e00750120546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652cbc20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e008501205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e74207370656369666965642062792060626c6f636b5f706572696f64602e0420d820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e0024636f6e73656e73757324436f6e73656e73757301044c4f726967696e616c417574686f7269746965730000485665633c543a3a53657373696f6e4b65793e0400000118487265706f72745f6d69736265686176696f72041c5f7265706f72741c5665633c75383e0468205265706f727420736f6d65206d69736265686176696f75722e306e6f74655f6f66666c696e65041c6f66666c696e65f43c543a3a496e686572656e744f66666c696e655265706f727420617320496e686572656e744f66666c696e655265706f72743e3a3a496e686572656e74044501204e6f7465207468652070726576696f757320626c6f636b27732076616c696461746f72206d6973736564207468656972206f70706f7274756e69747920746f2070726f706f7365206120626c6f636b2e1872656d61726b041c5f72656d61726b1c5665633c75383e046c204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e387365745f686561705f7061676573041470616765730c75363404fc2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040c6e65771c5665633c75383e04482053657420746865206e657720636f64652e2c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e046c2053657420736f6d65206974656d73206f662073746f726167652e001c696e64696365731c496e646963657301082c4e657874456e756d53657401003c543a3a4163636f756e74496e6465781000000000047c20546865206e657874206672656520656e756d65726174696f6e207365742e1c456e756d53657401013c543a3a4163636f756e74496e646578445665633c543a3a4163636f756e7449643e040004582054686520656e756d65726174696f6e20736574732e010001043c4e65774163636f756e74496e64657808244163636f756e744964304163636f756e74496e64657810882041206e6577206163636f756e7420696e646578207761732061737369676e65642e0005012054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e65646020746f20616e6f7468657220604163636f756e744964602e2062616c616e6365732042616c616e636573012834546f74616c49737375616e6365010028543a3a42616c616e6365400000000000000000000000000000000004a42054686520746f74616c20616d6f756e74206f66207374616b65206f6e207468652073797374656d2e484578697374656e7469616c4465706f736974010028543a3a42616c616e6365400000000000000000000000000000000004d020546865206d696e696d756d20616d6f756e7420616c6c6f77656420746f206b65657020616e206163636f756e74206f70656e2e2c5472616e73666572466565010028543a3a42616c616e636540000000000000000000000000000000000494205468652066656520726571756972656420746f206d616b652061207472616e736665722e2c4372656174696f6e466565010028543a3a42616c616e63654000000000000000000000000000000000042501205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e204174206c6561737420617320626967206173205265636c61696d5265626174652e485472616e73616374696f6e42617365466565010028543a3a42616c616e6365400000000000000000000000000000000004dc205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e485472616e73616374696f6e42797465466565010028543a3a42616c616e63654000000000000000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e1c56657374696e67000130543a3a4163636f756e7449646c56657374696e675363686564756c653c543a3a42616c616e63653e040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e2c4672656542616c616e6365010130543a3a4163636f756e74496428543a3a42616c616e636540000000000000000000000000000000002c9c20546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e004d01205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e204974206973690120616c6f6e65207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e207468697355012062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069733d012064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865726d6f72652c20604f6e4672656542616c616e63655a65726f602063616c6c6261636b410120697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e75702064617461206173736f636961746564207769746854207468652064656c65746564206163636f756e742e005d01206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473150120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e3c526573657276656442616c616e6365010130543a3a4163636f756e74496428543a3a42616c616e636540000000000000000000000000000000003075012054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c206765749c20736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e006d0120546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e737101207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e20285468697320697320646966666572656e74290120616e642077686f6c6c7920756e72656c6174656420746f207468652060426f6e64616765602073797374656d207573656420696e20746865207374616b696e67206d6f64756c652e29007501205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e7427b42069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e004d01206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473150120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e144c6f636b73010130543a3a4163636f756e744964b05665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e040004b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e0108207472616e736665720810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e04d4205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572207374616b65722e2c7365745f62616c616e63650c0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636510667265654c436f6d706163743c543a3a42616c616e63653e2072657365727665644c436f6d706163743c543a3a42616c616e63653e049420536574207468652062616c616e636573206f66206120676976656e206163636f756e742e010c284e65774163636f756e7408244163636f756e7449641c42616c616e6365046c2041206e6577206163636f756e742077617320637265617465642e345265617065644163636f756e7404244163636f756e744964045c20416e206163636f756e7420776173207265617065642e205472616e7366657210244163636f756e744964244163636f756e7449641c42616c616e63651c42616c616e636504b0205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e1c73657373696f6e1c53657373696f6e01202856616c696461746f72730100445665633c543a3a4163636f756e7449643e0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3453657373696f6e4c656e677468010038543a3a426c6f636b4e756d62657220e803000000000000047c2043757272656e74206c656e677468206f66207468652073657373696f6e2e3043757272656e74496e646578010038543a3a426c6f636b4e756d62657220000000000000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e3043757272656e745374617274010024543a3a4d6f6d656e7420000000000000000004a02054696d657374616d70207768656e2063757272656e742073657373696f6e20737461727465642e44466f7263696e674e657753657373696f6e000010626f6f6c0400087901204e65772073657373696f6e206973206265696e6720666f72636564206973207468697320656e747279206578697374733b20696e20776869636820636173652c2074686520626f6f6c65616e2076616c75652069732077686574686572810120746865206e65772073657373696f6e2073686f756c6420626520636f6e736964657265642061206e6f726d616c20726f746174696f6e202872657761726461626c6529206f7220657863657074696f6e616c2028736c61736861626c65292e404c6173744c656e6774684368616e6765000038543a3a426c6f636b4e756d626572040004c020426c6f636b206174207768696368207468652073657373696f6e206c656e677468206c617374206368616e6765642e284e6578744b6579466f72000130543a3a4163636f756e74496434543a3a53657373696f6e4b65790400049020546865206e657874206b657920666f72206120676976656e2076616c696461746f722e444e65787453657373696f6e4c656e677468000038543a3a426c6f636b4e756d6265720400046420546865206e6578742073657373696f6e206c656e6774682e010c1c7365745f6b6579040c6b657934543a3a53657373696f6e4b65790861012053657473207468652073657373696f6e206b6579206f6620605f76616c696461746f726020746f20605f6b6579602e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e657874242073657373696f6e2e287365745f6c656e677468040c6e65775c436f6d706163743c543a3a426c6f636b4e756d6265723e046d01205365742061206e65772073657373696f6e206c656e6774682e20576f6e2774206b69636b20696e20756e74696c20746865206e6578742073657373696f6e206368616e6765202861742063757272656e74206c656e677468292e44666f7263655f6e65775f73657373696f6e04346170706c795f7265776172647310626f6f6c045820466f726365732061206e65772073657373696f6e2e0104284e657753657373696f6e042c426c6f636b4e756d626572085501204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b88206e756d626572206173207468652074797065206d6967687420737567676573742e1c7374616b696e671c5374616b696e6701643856616c696461746f72436f756e7401000c753332100000000004a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e7401000c7533321004000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e3853657373696f6e73506572457261010038543a3a426c6f636b4e756d62657220e80300000000000004a420546865206c656e677468206f662061207374616b696e672065726120696e2073657373696f6e732e3453657373696f6e52657761726401001c50657262696c6c103c000000042101204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e304f66666c696e65536c61736801001c50657262696c6c1040420f0004510120536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e444f66666c696e65536c617368477261636501000c7533321000000000043901204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e3c426f6e64696e674475726174696f6e010038543a3a426c6f636b4e756d62657220e80300000000000004b820546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20626c6f636b732e30496e76756c657261626c65730100445665633c543a3a4163636f756e7449643e04000034496e76756c6e657261626c65730100445665633c543a3a4163636f756e7449643e040008a50120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697365ad0120616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e646564000130543a3a4163636f756e74496430543a3a4163636f756e7449640400040101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e184c6564676572000130543a3a4163636f756e744964e45374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e0400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e145061796565010130543a3a4163636f756e7449644452657761726444657374696e6174696f6e040004a42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e2856616c696461746f7273010130543a3a4163636f756e7449647056616c696461746f7250726566733c42616c616e63654f663c543e3e080c000cec2054686520736574206f66206b6579732061726520616c6c20636f6e74726f6c6c65727320746861742077616e7420746f2076616c69646174652e00d4205468652076616c756573206172652074686520707265666572656e636573207468617420612076616c696461746f72206861732e284e6f6d696e61746f7273010130543a3a4163636f756e744964445665633c543a3a4163636f756e7449643e04000cec2054686520736574206f66206b6579732061726520616c6c20636f6e74726f6c6c65727320746861742077616e7420746f206e6f6d696e6174652e007c205468652076616c75652061726520746865206e6f6d696e6174696f6e732e1c5374616b657273010130543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e0c00000008b101204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652cc02062757420796f752063616e2066696e64207468656d20696e20746865206073657373696f6e7360206d6f64756c652e2843757272656e74457261010038543a3a426c6f636b4e756d626572200000000000000000045c205468652063757272656e742065726120696e6465782e5043757272656e7453657373696f6e52657761726401003042616c616e63654f663c543e4000000000000000000000000000000000042101204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e4c43757272656e744f66666c696e65536c61736801003042616c616e63654f663c543e400000000000000000000000000000000004510120536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e4043757272656e7445726152657761726401003042616c616e63654f663c543e40000000000000000000000000000000000869012054686520616363756d756c617465642072657761726420666f72207468652063757272656e74206572612e20526573657420746f207a65726f2061742074686520626567696e6e696e67206f66207468652065726120616e64cc20696e6372656173656420666f72206576657279207375636365737366756c6c792066696e69736865642073657373696f6e2e484e65787453657373696f6e73506572457261000038543a3a426c6f636b4e756d6265720400049020546865206e6578742076616c7565206f662073657373696f6e7320706572206572612e4c4c6173744572614c656e6774684368616e6765010038543a3a426c6f636b4e756d62657220000000000000000004e0205468652073657373696f6e20696e6465782061742077686963682074686520657261206c656e677468206c617374206368616e6765642e24536c6f745374616b6501003042616c616e63654f663c543e40000000000000000000000000000000000c31012054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e00c02054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e28536c617368436f756e74010130543a3a4163636f756e7449640c753332100000000004d10120546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e34466f7263696e674e65774572610000082829040004682057652061726520666f7263696e672061206e6577206572612e3c526563656e746c794f66666c696e650100a05665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265722c20753332293e040004f101204d6f737420726563656e742060524543454e545f4f46464c494e455f434f554e546020696e7374616e6365732e202877686f206974207761732c207768656e20697420776173207265706f727465642c20686f77206d616e7920696e7374616e63657320746865792077657265206f66666c696e6520666f72292e013810626f6e640c28636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e1470617965654452657761726444657374696e6174696f6e0881012054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c2062652074686568206163636f756e74207468617420636f6e74726f6c732069742e28626f6e645f657874726104386d61785f6164646974696f6e616c3042616c616e63654f663c543e1875012041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f7224207374616b696e672e00510120557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e00fc204e4f54453a20546869732063616c6c206d757374206265206d6164652062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e18756e626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e285501205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64010120706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e350120543a3a43757272656e63793a3a6578697374656e7469616c5f6465706f73697428292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e004901204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665c0207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e00fc204e4f54453a20546869732063616c6c206d757374206265206d6164652062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e00982053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e4477697468647261775f756e626f6e64656400202d012052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e003501205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4c2077686174657665722069742077616e74732e00fc204e4f54453a20546869732063616c6c206d757374206265206d6164652062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e006c2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e2076616c6964617465041470726566737056616c696461746f7250726566733c42616c616e63654f663c543e3e14e8204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00fc204e4f54453a20546869732063616c6c206d757374206265206d6164652062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e206e6f6d696e617465041c74617267657473a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e141101204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00fc204e4f54453a20546869732063616c6c206d757374206265206d6164652062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e146368696c6c0014c8204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00fc204e4f54453a20546869732063616c6c206d757374206265206d6164652062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e247365745f7061796565041470617965654452657761726444657374696e6174696f6e14b8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00fc204e4f54453a20546869732063616c6c206d757374206265206d6164652062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e507365745f73657373696f6e735f7065725f657261040c6e65775c436f6d706163743c543a3a426c6f636b4e756d6265723e04982053657420746865206e756d626572206f662073657373696f6e7320696e20616e206572612e507365745f626f6e64696e675f6475726174696f6e040c6e65775c436f6d706163743c543a3a426c6f636b4e756d6265723e04b020546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20657261732e4c7365745f76616c696461746f725f636f756e74040c6e657730436f6d706163743c7533323e04802054686520696465616c206e756d626572206f662076616c696461746f72732e34666f7263655f6e65775f65726104346170706c795f7265776172647310626f6f6c083d0120466f72636520746865726520746f2062652061206e6577206572612e205468697320616c736f20666f726365732061206e65772073657373696f6e20696d6d6564696174656c792061667465722e250120606170706c795f72657761726473602073686f756c64206265207472756520666f722076616c696461746f727320746f20676574207468652073657373696f6e207265776172642e5c7365745f6f66666c696e655f736c6173685f6772616365040c6e657730436f6d706163743c7533323e04902053657420746865206f66666c696e6520736c61736820677261636520706572696f642e447365745f696e76756c6e657261626c6573042876616c696461746f7273445665633c543a3a4163636f756e7449643e04cc20536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e010c18526577617264041c42616c616e636504e020416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e384f66666c696e655761726e696e6708244163636f756e7449640c753332085501204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20676976656e2061206f66666c696e652d7761726e696e67202874686579277265207374696c6c15012077697468696e207468656972206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e304f66666c696e65536c61736808244163636f756e7449641c42616c616e6365042d01204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e2464656d6f63726163792444656d6f6372616379013c3c5075626c696350726f70436f756e7401002450726f70496e646578100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f70730100ac5665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e0400048020546865207075626c69632070726f706f73616c732e20556e736f727465642e244465706f7369744f6600012450726f70496e646578842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29040004842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e304c61756e6368506572696f64010038543a3a426c6f636b4e756d62657220e80300000000000004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e384d696e696d756d4465706f73697401003042616c616e63654f663c543e400000000000000000000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e2c5075626c696344656c6179010038543a3a426c6f636b4e756d62657220000000000000000004d4205468652064656c6179206265666f726520656e6163746d656e7420666f7220616c6c207075626c6963207265666572656e64612e384d61784c6f636b506572696f647301002c4c6f636b506572696f6473040004d90120546865206d6178696d756d206e756d626572206f66206164646974696f6e616c206c6f636b20706572696f6473206120766f746572206d6179206f6666657220746f20737472656e677468656e20746865697220766f74652e204d756c7469706c6573206f6620605075626c696344656c6179602e30566f74696e67506572696f64010038543a3a426c6f636b4e756d62657220e80300000000000004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e3c5265666572656e64756d436f756e7401003c5265666572656e64756d496e646578100000000004390120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e64756d73207374617274656420736f206661722e244e65787454616c6c7901003c5265666572656e64756d496e646578100000000004c820546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e405265666572656e64756d496e666f4f6600013c5265666572656e64756d496e646578b4285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e29040004b420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e3444697370617463685175657565010138543a3a426c6f636b4e756d626572ac5665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e040004c0205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e24566f74657273466f7201013c5265666572656e64756d496e646578445665633c543a3a4163636f756e7449643e040004a4204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e18566f74654f6601017c285265666572656e64756d496e6465782c20543a3a4163636f756e7449642910566f746504000cd501204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c7564657320746865c90120766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b61012060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e2c44656c65676174696f6e73010130543a3a4163636f756e7449646c28543a3a4163636f756e7449642c204c6f636b506572696f647329840000000000000000000000000000000000000000000000000000000000000000000441012047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e01201c70726f706f7365082070726f706f73616c40426f783c543a3a50726f706f73616c3e1476616c756554436f6d706163743c42616c616e63654f663c543e3e04a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e187365636f6e64042070726f706f73616c48436f6d706163743c50726f70496e6465783e04a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e10766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f746510566f746508350120566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bbc206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e4073746172745f7265666572656e64756d0c2070726f706f73616c40426f783c543a3a50726f706f73616c3e247468726573686f6c6434566f74655468726573686f6c641464656c617938543a3a426c6f636b4e756d62657204502053746172742061207265666572656e64756d2e4463616e63656c5f7265666572656e64756d04247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e04542052656d6f76652061207265666572656e64756d2e3463616e63656c5f71756575656408107768656e5c436f6d706163743c543a3a426c6f636b4e756d6265723e14776869636830436f6d706163743c7533323e04a02043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e2064656c65676174650808746f30543a3a4163636f756e744964306c6f636b5f706572696f64732c4c6f636b506572696f6473043c2044656c656761746520766f74652e28756e64656c656761746500044420556e64656c656761746520766f74652e01242050726f706f736564082450726f70496e6465781c42616c616e636500185461626c65640c2450726f70496e6465781c42616c616e6365385665633c4163636f756e7449643e001c53746172746564083c5265666572656e64756d496e64657834566f74655468726573686f6c640018506173736564043c5265666572656e64756d496e64657800244e6f74506173736564043c5265666572656e64756d496e646578002443616e63656c6c6564043c5265666572656e64756d496e64657800204578656375746564083c5265666572656e64756d496e64657810626f6f6c002444656c65676174656408244163636f756e744964244163636f756e744964002c556e64656c65676174656404244163636f756e744964001c6772616e6470613c4772616e64706146696e616c69747901083450656e64696e674368616e67650000c853746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265722c20543a3a53657373696f6e4b65793e040000284e657874466f72636564000038543a3a426c6f636b4e756d6265720400000104487265706f72745f6d69736265686176696f72041c5f7265706f72741c5665633c75383e0468205265706f727420736f6d65206d69736265686176696f75722e0104384e6577417574686f72697469657304585665633c2853657373696f6e4b65792c20753634293e0490204e657720617574686f726974792073657420686173206265656e206170706c6965642e3c637572617465645f6772616e64706138437572617465644772616e64706101043453687566666c65506572696f64010038543a3a426c6f636b4e756d6265722000000000000000000c9c20486f77206f6674656e20746f2073687566666c6520746865204752414e44504120736574732e003c2030206d65616e73206e657665722e0104287365745f766f746572730418766f74657273645665633c28543a3a53657373696f6e4b65792c20753634293e047c204368616e67657320746865204752414e44504120766f746572207365742e001c636f756e63696c1c436f756e63696c01503443616e646964616379426f6e6401003042616c616e63654f663c543e400900000000000000000000000000000004050120486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e28566f74696e67426f6e6401003042616c616e63654f663c543e400000000000000000000000000000000004090120486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e5050726573656e74536c617368506572566f74657201003042616c616e63654f663c543e4001000000000000000000000000000000040d01205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e284361727279436f756e7401000c753332100200000004350120486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e5050726573656e746174696f6e4475726174696f6e010038543a3a426c6f636b4e756d62657220e803000000000000043d0120486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e4c496e6163746976654772616365506572696f64010024566f7465496e646578100100000008a10120486f77206d616e7920766f746520696e6465786573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e206265207265617065642069662074686569725020617070726f76616c7320617265206d6f6f742e30566f74696e67506572696f64010038543a3a426c6f636b4e756d62657220e80300000000000004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e305465726d4475726174696f6e010038543a3a426c6f636b4e756d626572200500000000000000049820486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e3044657369726564536561747301000c753332100000000004e8204e756d626572206f66206163636f756e747320746861742073686f756c642062652073697474696e67206f6e2074686520636f756e63696c2e34416374697665436f756e63696c01008c5665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e0400106d01205468652063757272656e7420636f756e63696c2e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f72206578656375746976657101206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b207468617420746865697220706f736974696f6e20697371012061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e2074686520636f756e63696c206d656d6265722077617320656c65637465646820616e64207468656972207465726d206475726174696f6e292e24566f7465436f756e74010024566f7465496e64657810000000000405012054686520746f74616c206e756d626572206f6620766f746573207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e2c417070726f76616c734f66010130543a3a4163636f756e744964245665633c626f6f6c3e0400086d012041206c697374206f6620766f74657320666f72206561636820766f7465722c2072657370656374696e6720746865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f7465722077617340206c617374206163746976652061742e385265676973746572496e666f4f66000130543a3a4163636f756e7449644028566f7465496e6465782c20753332290400087d012054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f74582063757272656e746c7920726567697374657265642e304c6173744163746976654f66000130543a3a4163636f756e74496424566f7465496e646578040004010120546865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e18566f746572730100445665633c543a3a4163636f756e7449643e04000460205468652070726573656e7420766f746572206c6973742e2843616e646964617465730100445665633c543a3a4163636f756e7449643e04000470205468652070726573656e742063616e646964617465206c6973742e3843616e646964617465436f756e7401000c753332100000000000304e65787446696e616c6973650000a028543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e29040004210120546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e40536e617073686f7465645374616b65730100445665633c42616c616e63654f663c543e3e040004e820546865207374616b6573206173207468657920776572652061742074686520706f696e7420746861742074686520766f746520656e6465642e2c4c6561646572626f6172640000845665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e040004e02047657420746865206c6561646572626f6172642069662077653b726520696e207468652070726573656e746174696f6e2070686173652e0124347365745f617070726f76616c730814766f746573245665633c626f6f6c3e14696e64657848436f6d706163743c566f7465496e6465783e086101205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473402061726520726567697374657265642e4c726561705f696e6163746976655f766f74657210387265706f727465725f696e64657830436f6d706163743c7533323e0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652477686f5f696e64657830436f6d706163743c7533323e48617373756d65645f766f74655f696e64657848436f6d706163743c566f7465496e6465783e1461012052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e64696365737101206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f74206166746572a02074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e000101204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e34726574726163745f766f7465720414696e64657830436f6d706163743c7533323e042d012052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e407375626d69745f63616e6469646163790410736c6f7430436f6d706163743c7533323e0c78205375626d6974206f6e6573656c6620666f722063616e6469646163792e001101204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e3870726573656e745f77696e6e65720c2463616e6469646174658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636514746f74616c54436f6d706163743c42616c616e63654f663c543e3e14696e64657848436f6d706163743c566f7465496e6465783e0c650120436c61696d207468617420607369676e656460206973206f6e65206f662074686520746f702053656c663a3a63617272795f636f756e742829202b2063757272656e745f766f746528292e312063616e646964617465732ea501204f6e6c7920776f726b73206966207468652060626c6f636b5f6e756d626572203e3d2063757272656e745f766f746528292e306020616e6420603c2063757272656e745f766f746528292e30202b2070726573656e746174696f6e5f6475726174696f6e282960607820607369676e6564602073686f756c642068617665206174206c65617374447365745f646573697265645f73656174730414636f756e7430436f6d706163743c7533323e0c650120536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f74206265207570690120656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c72656164793420696e2070726f67726573732e3472656d6f76655f6d656d626572040c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650c71012052656d6f7665206120706172746963756c6172206d656d6265722e20412074616c6c792077696c6c2068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e410120706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e7c20546869732069732065666665637469766520696d6d6564696174656c792e647365745f70726573656e746174696f6e5f6475726174696f6e0414636f756e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08590120536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c6020696e766f6b65206066696e616c6973655f766f7465602e447365745f7465726d5f6475726174696f6e0414636f756e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08510120536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c6020696e766f6b65206066696e616c6973655f766f7465602e01102c566f74657252656170656408244163636f756e744964244163636f756e74496404542072656170656420766f7465722c2072656170657240426164526561706572536c617368656404244163636f756e744964043c20736c6173686564207265617065723054616c6c7953746172746564040c75333204f420412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320737461727465642e3854616c6c7946696e616c6973656408385665633c4163636f756e7449643e385665633c4163636f756e7449643e04690120412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e38636f756e63696c5f766f74696e6734436f756e63696c566f74696e67012034436f6f6c6f6666506572696f64010038543a3a426c6f636b4e756d62657220e8030000000000000030566f74696e67506572696f64010038543a3a426c6f636b4e756d6265722003000000000000000040456e61637444656c6179506572696f64010038543a3a426c6f636b4e756d62657220000000000000000004cd01204e756d626572206f6620626c6f636b7320627920776869636820746f2064656c617920656e6163746d656e74206f66207375636365737366756c2c206e6f6e2d756e616e696d6f75732d636f756e63696c2d696e7374696761746564207265666572656e64756d2070726f706f73616c732e2450726f706f73616c730100785665633c28543a3a426c6f636b4e756d6265722c20543a3a48617368293e0400002850726f706f73616c4f6600011c543a3a486173682c543a3a50726f706f73616c0400003850726f706f73616c566f7465727301011c543a3a48617368445665633c543a3a4163636f756e7449643e04000034436f756e63696c566f74654f6600015c28543a3a486173682c20543a3a4163636f756e7449642910626f6f6c040000385665746f656450726f706f73616c00011c543a3a486173688c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e2904000001141c70726f706f7365042070726f706f73616c40426f783c543a3a50726f706f73616c3e0010766f7465082070726f706f73616c1c543a3a486173681c617070726f766510626f6f6c00107665746f043470726f706f73616c5f686173681c543a3a4861736800487365745f636f6f6c6f66665f706572696f640418626c6f636b735c436f6d706163743c543a3a426c6f636b4e756d6265723e00447365745f766f74696e675f706572696f640418626c6f636b735c436f6d706163743c543a3a426c6f636b4e756d6265723e0001084054616c6c7943616e63656c6174696f6e1010486173680c7533320c7533320c753332080101204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d2063616e63656c6c6174696f6e20766f74652ea0204c61737420746872656520617265207965732c206e6f2c206162737461696e20636f756e74732e3c54616c6c795265666572656e64756d1010486173680c7533320c7533320c75333208cc204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d20766f74652ea0204c61737420746872656520617265207965732c206e6f2c206162737461696e20636f756e74732e3c636f756e63696c5f6d6f74696f6e7338436f756e63696c4d6f74696f6e7301102450726f706f73616c730100305665633c543a3a486173683e04000498205468652028686173686573206f662920746865206163746976652070726f706f73616c732e2850726f706f73616c4f6600011c543a3a48617368583c542061732054726169743e3a3a50726f706f73616c040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e6700011c543a3a48617368e82850726f706f73616c496e6465782c207533322c205665633c543a3a4163636f756e7449643e2c205665633c543a3a4163636f756e7449643e29040004250120566f74657320666f72206120676976656e2070726f706f73616c3a202872657175697265645f7965735f766f7465732c207965735f766f746572732c206e6f5f766f74657273292e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e01081c70726f706f736508247468726573686f6c6430436f6d706163743c7533323e2070726f706f73616c6c426f783c3c542061732054726169743e3a3a50726f706f73616c3e0010766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c0001142050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173680c7533320465012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20753332292e14566f74656414244163636f756e744964104861736810626f6f6c0c7533320c7533320809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67f420612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e206173207533327320726573706563746976656c79292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408104861736810626f6f6c0405012041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e20747265617375727920547265617375727901203050726f706f73616c426f6e6401001c5065726d696c6c10000000000851012050726f706f7274696f6e206f662066756e647320746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c61636520612070726f706f73616c2e20416e206163636570746564dc2070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f65736e27742e4c50726f706f73616c426f6e644d696e696d756d01003042616c616e63654f663c543e4000000000000000000000000000000000044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f64010038543a3a426c6f636b4e756d626572200100000000000000048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e01001c5065726d696c6c10000000000411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e0c506f7401003042616c616e63654f663c543e400000000000000000000000000000000004cc20546f74616c2066756e647320617661696c61626c6520746f2074686973206d6f64756c6520666f72207370656e64696e672e3450726f706f73616c436f756e7401003450726f706f73616c496e646578100000000004a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c7300013450726f706f73616c496e6465789050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e0400047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c730100485665633c50726f706f73616c496e6465783e040004f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e01143470726f706f73655f7370656e64081476616c756554436f6d706163743c42616c616e63654f663c543e3e2c62656e65666963696172798c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650c2d012050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c7565350120697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e636520746865542070726f706f73616c20697320617761726465642e1c7365745f706f74041c6e65775f706f7454436f6d706163743c42616c616e63654f663c543e3e04b420536574207468652062616c616e6365206f662066756e647320617661696c61626c6520746f207370656e642e24636f6e666967757265103470726f706f73616c5f626f6e6440436f6d706163743c5065726d696c6c3e5470726f706f73616c5f626f6e645f6d696e696d756d54436f6d706163743c42616c616e63654f663c543e3e307370656e645f706572696f645c436f6d706163743c543a3a426c6f636b4e756d6265723e106275726e40436f6d706163743c5065726d696c6c3e0470202852652d29636f6e6669677572652074686973206d6f64756c652e3c72656a6563745f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e04fc2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e40617070726f76655f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e085d0120417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e6566696369617279ac20616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e01142050726f706f736564043450726f706f73616c496e6465780438204e65772070726f706f73616c2e205370656e64696e67041c42616c616e636504e8205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e1c417761726465640c3450726f706f73616c496e6465781c42616c616e6365244163636f756e744964048020536f6d652066756e64732068617665206265656e20616c6c6f63617465642e144275726e74041c42616c616e6365048c20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20526f6c6c6f766572041c42616c616e6365043101205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e2870617261636861696e732850617261636861696e7301102850617261636861696e7301002c5665633c5061726149643e04000010436f64650001185061726149641c5665633c75383e0400001448656164730001185061726149641c5665633c75383e04000024446964557064617465010010626f6f6c040000010c247365745f686561647304146865616473585665633c417474657374656443616e6469646174653e0415012050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e4872656769737465725f70617261636861696e0c0869641850617261496410636f64651c5665633c75383e44696e697469616c5f686561645f646174611c5665633c75383e089820526567697374657220612070617261636861696e207769746820676976656e20636f64652e8c204661696c7320696620676976656e20494420697320616c726561647920757365642e50646572656769737465725f70617261636861696e04086964185061726149640494204465726567697374657220612070617261636861696e207769746820676976656e20696400107375646f105375646f01040c4b6579010030543a3a4163636f756e744964800000000000000000000000000000000000000000000000000000000000000000000108107375646f042070726f706f73616c40426f783c543a3a50726f706f73616c3e001c7365745f6b6579040c6e65778c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001081453756469640410626f6f6c04602041207375646f206a75737420746f6f6b20706c6163652e284b65794368616e67656404244163636f756e74496404f020546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c696564" + +metadata_v10_hex = "0x6d6574610a701853797374656d011853797374656d34304163636f756e744e6f6e636501010130543a3a4163636f756e74496420543a3a496e646578001000000000047c2045787472696e73696373206e6f6e636520666f72206163636f756e74732e3845787472696e736963436f756e7400000c753332040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e4c416c6c45787472696e73696373576569676874000018576569676874040004150120546f74616c2077656967687420666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e40416c6c45787472696e736963734c656e00000c753332040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b4861736801010138543a3a426c6f636b4e756d6265721c543a3a48617368008000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101010c7533321c5665633c75383e000400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d626572010038543a3a426c6f636b4e756d6265721000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e3845787472696e73696373526f6f7401001c543a3a486173688000000000000000000000000000000000000000000000000000000000000000000415012045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e1844696765737401002c4469676573744f663c543e040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301008c5665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e040004a0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e284576656e74436f756e740100284576656e74496e646578100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f706963730101011c543a3a48617368845665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e000400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e011c2866696c6c5f626c6f636b0004210120412062696720646973706174636820746861742077696c6c20646973616c6c6f7720616e79206f74686572207472616e73616374696f6e20746f20626520696e636c756465642e1872656d61726b041c5f72656d61726b1c5665633c75383e046c204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e387365745f686561705f7061676573041470616765730c75363404fc2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040c6e65771c5665633c75383e04482053657420746865206e657720636f64652e2c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e046c2053657420736f6d65206974656d73206f662073746f726167652e306b696c6c5f73746f7261676504106b657973205665633c4b65793e0478204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e2c6b696c6c5f70726566697804187072656669780c4b6579041501204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e01084045787472696e7369635375636365737304304469737061746368496e666f049420416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c6564083444697370617463684572726f72304469737061746368496e666f045420416e2065787472696e736963206661696c65642e00006052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100305665633c543a3a486173683e04000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e000000001042616265011042616265242845706f6368496e64657801000c75363420000000000000000004542043757272656e742065706f636820696e6465782e2c417574686f72697469657301009c5665633c28417574686f7269747949642c2042616265417574686f72697479576569676874293e0400046c2043757272656e742065706f636820617574686f7269746965732e2c47656e65736973536c6f7401000c75363420000000000000000008f82054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e205468697320697320309020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2c43757272656e74536c6f7401000c75363420000000000000000004542043757272656e7420736c6f74206e756d6265722e2852616e646f6d6e6573730100205b75383b2033325d80000000000000000000000000000000000000000000000000000000000000000028b8205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e002c20232053656375726974790005012054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061f8206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e7915012063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d6265727320746861742074686973150120286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e206265050120757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e0d01206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e384e65787452616e646f6d6e6573730100205b75383b2033325d800000000000000000000000000000000000000000000000000000000000000000045c204e6578742065706f63682072616e646f6d6e6573732e305365676d656e74496e64657801000c7533321000000000247c2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e00f4205765206d616b6520612074726164656f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e01012057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f942060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e00ec204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e090120576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572791c2065706f63682e44556e646572436f6e737472756374696f6e0101010c753332345665633c5b75383b2033325d3e000400002c496e697469616c697a65640000204d6179626556726604000801012054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d65601d01206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e010000083445706f63684475726174696f6e0c753634205802000000000000080d0120546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746ffc2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e444578706563746564426c6f636b54696d6524543a3a4d6f6d656e7420701700000000000014050120546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e67110120626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f75740501207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f740901206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473a0207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e002454696d657374616d70012454696d657374616d70080c4e6f77010024543a3a4d6f6d656e7420000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e24446964557064617465010010626f6f6c040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01040c736574040c6e6f7748436f6d706163743c543a3a4d6f6d656e743e245820536574207468652063757272656e742074696d652e00590120546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed82070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e004501205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e74207370656369666965642062794420604d696e696d756d506572696f64602e00d820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e0004344d696e696d756d506572696f6424543a3a4d6f6d656e7420b80b00000000000010690120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f64690120746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c79650120776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c6520746869737020706572696f64206f6e2064656661756c742073657474696e67732e001c496e6469636573011c496e6469636573082c4e657874456e756d53657401003c543a3a4163636f756e74496e6465781000000000047c20546865206e657874206672656520656e756d65726174696f6e207365742e1c456e756d5365740101013c543a3a4163636f756e74496e646578445665633c543a3a4163636f756e7449643e00040004582054686520656e756d65726174696f6e20736574732e010001043c4e65774163636f756e74496e64657808244163636f756e744964304163636f756e74496e64657810882041206e6577206163636f756e7420696e646578207761732061737369676e65642e0005012054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e65646020746f20616e6f7468657220604163636f756e744964602e00002042616c616e636573012042616c616e6365731434546f74616c49737375616e6365010028543a3a42616c616e6365400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e1c56657374696e6700010130543a3a4163636f756e744964ac56657374696e675363686564756c653c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e00040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e2c4672656542616c616e636501010130543a3a4163636f756e74496428543a3a42616c616e63650040000000000000000000000000000000002c9c20546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e004101205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e204974750120616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e207468697355012062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069733d012064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b450120697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f636961746564207769746854207468652064656c65746564206163636f756e742e00750120606672616d655f73797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473150120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e3c526573657276656442616c616e636501010130543a3a4163636f756e74496428543a3a42616c616e63650040000000000000000000000000000000002c75012054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c206765749c20736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e006d0120546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e732501207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e007501205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e7427b42069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e00650120606672616d655f73797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473190120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e29144c6f636b7301010130543a3a4163636f756e744964b05665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e00040004b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e0110207472616e736665720810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e64d8205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e00090120607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e21012049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e1501204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b4206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e00190120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e002c2023203c7765696768743e3101202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72cc202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e6901202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e004c2052656c617465642066756e6374696f6e733a0051012020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2d012020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365d420202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642edc2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765725901202020202060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e6365646020616e642060543a3a4f6e4672656542616c616e63655a65726f3a3a6f6e5f667265655f62616c616e63655f7a65726f602e49012020202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616cf82020202020636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e00302023203c2f7765696768743e2c7365745f62616c616e63650c0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365206e65775f667265654c436f6d706163743c543a3a42616c616e63653e306e65775f72657365727665644c436f6d706163743c543a3a42616c616e63653e349420536574207468652062616c616e636573206f66206120676976656e206163636f756e742e00210120546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c090120616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e190120496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c01012069742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e00b420546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e002c2023203c7765696768743e80202d20496e646570656e64656e74206f662074686520617267756d656e74732ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e302023203c2f7765696768743e38666f7263655f7472616e736665720c18736f757263658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636510646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e0851012045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d61792062652c207370656369666965642e4c7472616e736665725f6b6565705f616c6976650810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e1851012053616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c2074686540206f726967696e206163636f756e742e00bc20393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e00c4205b607472616e73666572605d3a207374727563742e4d6f64756c652e68746d6c236d6574686f642e7472616e736665720114284e65774163636f756e7408244163636f756e7449641c42616c616e6365046c2041206e6577206163636f756e742077617320637265617465642e345265617065644163636f756e7408244163636f756e7449641c42616c616e6365045c20416e206163636f756e7420776173207265617065642e205472616e7366657210244163636f756e744964244163636f756e7449641c42616c616e63651c42616c616e636504b0205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e2842616c616e63655365740c244163636f756e7449641c42616c616e63651c42616c616e636504c420412062616c616e6365207761732073657420627920726f6f74202877686f2c20667265652c207265736572766564292e1c4465706f73697408244163636f756e7449641c42616c616e636504dc20536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e0c484578697374656e7469616c4465706f73697428543a3a42616c616e63654000e40b5402000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2c5472616e7366657246656528543a3a42616c616e63654000e40b540200000000000000000000000494205468652066656520726571756972656420746f206d616b652061207472616e736665722e2c4372656174696f6e46656528543a3a42616c616e63654000e40b54020000000000000000000000049c205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e203856657374696e6742616c616e6365049c2056657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c7565544c69717569646974795265737472696374696f6e7304c8204163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c204f766572666c6f77047420476f7420616e206f766572666c6f7720616674657220616464696e674c496e73756666696369656e7442616c616e636504782042616c616e636520746f6f206c6f7720746f2073656e642076616c7565484578697374656e7469616c4465706f73697404ec2056616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f736974244b656570416c6976650490205472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e745c4578697374696e6756657374696e675363686564756c6504cc20412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742c446561644163636f756e74048c2042656e6566696369617279206163636f756e74206d757374207072652d6578697374485472616e73616374696f6e5061796d656e74012042616c616e63657304444e6578744665654d756c7469706c6965720100284d756c7469706c69657220000000000000000000000008485472616e73616374696f6e426173654665653042616c616e63654f663c543e4000e40b5402000000000000000000000004dc205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e485472616e73616374696f6e427974654665653042616c616e63654f663c543e4000e1f505000000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e0028417574686f72736869700128417574686f72736869700c18556e636c65730100e85665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e0400041c20556e636c657318417574686f72000030543a3a4163636f756e7449640400046420417574686f72206f662063757272656e7420626c6f636b2e30446964536574556e636c6573010010626f6f6c040004bc205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e0104287365745f756e636c657304286e65775f756e636c6573385665633c543a3a4865616465723e04642050726f76696465206120736574206f6620756e636c65732e00001c48496e76616c6964556e636c65506172656e74048c2054686520756e636c6520706172656e74206e6f7420696e2074686520636861696e2e40556e636c6573416c7265616479536574048420556e636c657320616c72656164792073657420696e2074686520626c6f636b2e34546f6f4d616e79556e636c6573044420546f6f206d616e7920756e636c65732e3047656e65736973556e636c6504582054686520756e636c652069732067656e657369732e30546f6f48696768556e636c6504802054686520756e636c6520697320746f6f206869676820696e20636861696e2e50556e636c65416c7265616479496e636c75646564047c2054686520756e636c6520697320616c726561647920696e636c756465642e204f6c64556e636c6504b82054686520756e636c652069736e277420726563656e7420656e6f75676820746f20626520696e636c756465642e1c5374616b696e67011c5374616b696e67683856616c696461746f72436f756e7401000c753332100000000004a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e7401000c7533321004000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e34496e76756c6e657261626c65730100445665633c543a3a4163636f756e7449643e04000c590120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e636520746865792772654d01206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f7572ac20696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e64656400010130543a3a4163636f756e74496430543a3a4163636f756e744964000400040101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e184c656467657200010130543a3a4163636f756e744964a45374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e14506179656501010130543a3a4163636f756e7449644452657761726444657374696e6174696f6e00040004e42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e2856616c696461746f727301010130543a3a4163636f756e7449643856616c696461746f72507265667301040004450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e284e6f6d696e61746f727300010130543a3a4163636f756e744964644e6f6d696e6174696f6e733c543a3a4163636f756e7449643e01040010650120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e003501204e4f54453a206973207072697661746520736f20746861742077652063616e20656e73757265207570677261646564206265666f726520616c6c207479706963616c2061636365737365732ed8204469726563742073746f7261676520415049732063616e207374696c6c2062797061737320746869732070726f74656374696f6e2e1c5374616b65727301010130543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000c000000104d01204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e277420697465726174651901207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e207468652053657373696f6e206d6f64756c652e00902054686973206973206b6579656420627920746865207374617368206163636f756e742e3843757272656e74456c65637465640100445665633c543a3a4163636f756e7449643e040004fc205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e2843757272656e74457261010020457261496e6465781000000000045c205468652063757272656e742065726120696e6465782e3c43757272656e74457261537461727401002c4d6f6d656e744f663c543e200000000000000000047820546865207374617274206f66207468652063757272656e74206572612e6c43757272656e74457261537461727453657373696f6e496e64657801003053657373696f6e496e646578100000000004d0205468652073657373696f6e20696e646578206174207768696368207468652063757272656e742065726120737461727465642e5843757272656e74457261506f696e74734561726e6564010024457261506f696e7473140000000000040d01205265776172647320666f72207468652063757272656e74206572612e205573696e6720696e6469636573206f662063757272656e7420656c6563746564207365742e24536c6f745374616b6501003042616c616e63654f663c543e40000000000000000000000000000000000c31012054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e00c02054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e20466f72636545726101001c466f7263696e670400041d01205472756520696620746865206e6578742073657373696f6e206368616e67652077696c6c2062652061206e657720657261207265676172646c657373206f6620696e6465782e4c536c6173685265776172644672616374696f6e01001c50657262696c6c10000000000cf8205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e00e4205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e4c43616e63656c6564536c6173685061796f757401003042616c616e63654f663c543e40000000000000000000000000000000000815012054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e7420776869636820776173ec2063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e40556e6170706c696564536c617368657301010120457261496e646578bc5665633c556e6170706c696564536c6173683c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3e00040004c420416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e28426f6e646564457261730100745665633c28457261496e6465782c2053657373696f6e496e646578293e04000425012041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e4c56616c696461746f72536c617368496e45726100020120457261496e64657830543a3a4163636f756e7449645c2850657262696c6c2c2042616c616e63654f663c543e2903040008450120416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e7020616e6420736c6173682076616c7565206f6620746865206572612e4c4e6f6d696e61746f72536c617368496e45726100020120457261496e64657830543a3a4163636f756e7449643042616c616e63654f663c543e03040004610120416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e34536c617368696e675370616e7300010130543a3a4163636f756e7449645c736c617368696e673a3a536c617368696e675370616e73000400048c20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e245370616e536c6173680101018c28543a3a4163636f756e7449642c20736c617368696e673a3a5370616e496e6465782988736c617368696e673a3a5370616e5265636f72643c42616c616e63654f663c543e3e00800000000000000000000000000000000000000000000000000000000000000000083d01205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2cb82061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e584561726c69657374556e6170706c696564536c617368000020457261496e646578040004fc20546865206561726c696573742065726120666f72207768696368207765206861766520612070656e64696e672c20756e6170706c69656420736c6173682e3853746f7261676556657273696f6e01000c75333210000000000490205468652076657273696f6e206f662073746f7261676520666f7220757067726164652e014410626f6e640c28636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e1470617965654452657761726444657374696e6174696f6e3c65012054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c8420626520746865206163636f756e74207468617420636f6e74726f6c732069742e003101206076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e00250120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e002c2023203c7765696768743ed4202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e20202d204f2831292e68202d20546872656520657874726120444220656e74726965732e006d01204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e656420756e6c65737325012074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e302023203c2f7765696768743e28626f6e645f657874726104386d61785f6164646974696f6e616c54436f6d706163743c42616c616e63654f663c543e3e3865012041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e63652075703420666f72207374616b696e672e00510120557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e650120556e6c696b65205b60626f6e64605d206f72205b60756e626f6e64605d20746869732066756e6374696f6e20646f6573206e6f7420696d706f736520616e79206c696d69746174696f6e206f6e2074686520616d6f756e744c20746861742063616e2062652061646465642e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e20202d204f2831292e40202d204f6e6520444220656e7472792e302023203c2f7765696768743e18756e626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e5c5501205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64010120706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e250120543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e004901204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665c0207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e003d01204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360293d012063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e656564fc20746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e00982053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e002c2023203c7765696768743e4101202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e6501202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e63656029710120202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652ea501202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c656420766961206077697468647261775f756e626f6e646564602e40202d204f6e6520444220656e7472792e28203c2f7765696768743e187265626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e18e0205265626f6e64206120706f7274696f6e206f6620746865207374617368207363686564756c656420746f20626520756e6c6f636b65642e002c2023203c7765696768743ef0202d2054696d6520636f6d706c65786974793a204f2831292e20426f756e64656420627920604d41585f554e4c4f434b494e475f4348554e4b53602ef4202d2053746f72616765206368616e6765733a2043616e277420696e6372656173652073746f726167652c206f6e6c792064656372656173652069742e302023203c2f7765696768743e4477697468647261775f756e626f6e64656400402d012052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e003501205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4c2077686174657665722069742077616e74732e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e006c2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e002c2023203c7765696768743e5501202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e45012020497420696d706c6965732060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c207768696368206973f42020696e6469726563746c7920757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e7901202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e2076616c6964617465041470726566733856616c696461746f7250726566732ce8204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e206e6f6d696e617465041c74617267657473a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e2c1101204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743e2501202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f66206074617267657473602c982077686963682069732063617070656420617420604d41585f4e4f4d494e4154494f4e53602ed8202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e302023203c2f7765696768743e146368696c6c002cc8204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e54202d20436f6e7461696e73206f6e6520726561642ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e247365745f7061796565041470617965654452657761726444657374696e6174696f6e2cb8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e387365745f636f6e74726f6c6c65720428636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652c90202852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e4c7365745f76616c696461746f725f636f756e74040c6e657730436f6d706163743c7533323e04802054686520696465616c206e756d626572206f662076616c696461746f72732e34666f7263655f6e6f5f657261730014b020466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e302023203c2f7765696768743e34666f7263655f6e65775f65726100184d0120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c206265a020726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e302023203c2f7765696768743e447365745f696e76756c6e657261626c6573042876616c696461746f7273445665633c543a3a4163636f756e7449643e04cc20536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e34666f7263655f756e7374616b650414737461736830543a3a4163636f756e744964040d0120466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e50666f7263655f6e65775f6572615f616c776179730014050120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e002c2023203c7765696768743e50202d204f6e652073746f72616765207772697465302023203c2f7765696768743e5463616e63656c5f64656665727265645f736c617368080c65726120457261496e64657834736c6173685f696e6469636573205665633c7533323e1c45012043616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e2043616e2062652063616c6c6564206279206569746865722074686520726f6f74206f726967696e206f7270207468652060543a3a536c61736843616e63656c4f726967696e602e05012070617373696e67207468652065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e002c2023203c7765696768743e54202d204f6e652073746f726167652077726974652e302023203c2f7765696768743e010c18526577617264081c42616c616e63651c42616c616e636508510120416c6c2076616c696461746f72732068617665206265656e207265776172646564206279207468652066697273742062616c616e63653b20746865207365636f6e64206973207468652072656d61696e6465728c2066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642e14536c61736808244163636f756e7449641c42616c616e6365042501204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e684f6c64536c617368696e675265706f7274446973636172646564043053657373696f6e496e646578081d0120416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c6448206e6f742062652070726f6365737365642e083853657373696f6e735065724572613053657373696f6e496e64657810060000000470204e756d626572206f662073657373696f6e7320706572206572612e3c426f6e64696e674475726174696f6e20457261496e646578101c00000004e4204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e28344e6f74436f6e74726f6c6c65720468204e6f74206120636f6e74726f6c6c6572206163636f756e742e204e6f7453746173680454204e6f742061207374617368206163636f756e742e34416c7265616479426f6e646564046420537461736820697320616c726561647920626f6e6465642e34416c7265616479506169726564047820436f6e74726f6c6c657220697320616c7265616479207061697265642e30456d70747954617267657473046420546172676574732063616e6e6f7420626520656d7074792e384475706c6963617465496e6465780444204475706c696361746520696e6465782e44496e76616c6964536c617368496e646578048820536c617368207265636f726420696e646578206f7574206f6620626f756e64732e44496e73756666696369656e7456616c756504cc2043616e206e6f7420626f6e6420776974682076616c7565206c657373207468616e206d696e696d756d2062616c616e63652e304e6f4d6f72654368756e6b7304942043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e344e6f556e6c6f636b4368756e6b04a42043616e206e6f74207265626f6e6420776974686f757420756e6c6f636b696e67206368756e6b732e204f6666656e63657301204f6666656e6365730c1c5265706f727473000101345265706f727449644f663c543ed04f6666656e636544657461696c733c543a3a4163636f756e7449642c20543a3a4964656e74696669636174696f6e5475706c653e00040004490120546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e58436f6e63757272656e745265706f727473496e646578010201104b696e64384f706171756554696d65536c6f74485665633c5265706f727449644f663c543e3e010400042901204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e485265706f72747342794b696e64496e646578010101104b696e641c5665633c75383e00040018110120456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e00bc20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e004901204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f66690120646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e010001041c4f6666656e636508104b696e64384f706171756554696d65536c6f7408550120546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e64390120286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e00001c53657373696f6e011c53657373696f6e1c2856616c696461746f727301004c5665633c543a3a56616c696461746f7249643e0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e64657801003053657373696f6e496e646578100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e676564010010626f6f6c040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b6579730100785665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e0400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f72730100205665633c7533323e04000c8020496e6469636573206f662064697361626c65642076616c696461746f72732e003501205468652073657420697320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e732061206e657720736574206f66206964656e7469746965732e204e6578744b6579730002051c5665633c75383e38543a3a56616c696461746f7249641c543a3a4b657973010400109c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e00590120546865206669727374206b657920697320616c77617973206044454455505f4b45595f5052454649586020746f206861766520616c6c20746865206461746120696e207468652073616d65206272616e6368206f6661012074686520747269652e20486176696e6720616c6c206461746120696e207468652073616d65206272616e63682073686f756c642070726576656e7420736c6f77696e6720646f776e206f7468657220717565726965732e204b65794f776e65720002051c5665633c75383e50284b65795479706549642c205665633c75383e2938543a3a56616c696461746f72496401040010250120546865206f776e6572206f662061206b65792e20546865207365636f6e64206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e00590120546865206669727374206b657920697320616c77617973206044454455505f4b45595f5052454649586020746f206861766520616c6c20746865206461746120696e207468652073616d65206272616e6368206f6661012074686520747269652e20486176696e6720616c6c206461746120696e207468652073616d65206272616e63682073686f756c642070726576656e7420736c6f77696e6720646f776e206f7468657220717565726965732e0104207365745f6b65797308106b6579731c543a3a4b6579731470726f6f661c5665633c75383e28e42053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b6579602e210120416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec4205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d420546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002c2023203c7765696768743e88202d204f286c6f67206e2920696e206e756d626572206f66206163636f756e74732e58202d204f6e6520657874726120444220656e7472792e302023203c2f7765696768743e0104284e657753657373696f6e043053657373696f6e496e646578085501204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b88206e756d626572206173207468652074797065206d6967687420737567676573742e044044454455505f4b45595f50524546495814265b75385d38343a73657373696f6e3a6b6579730865012055736564206173206669727374206b657920666f7220604e6578744b6579736020616e6420604b65794f776e65726020746f2070757420616c6c20746865206461746120696e746f207468652073616d65206272616e636834206f662074686520747269652e0c30496e76616c696450726f6f66046420496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f72496404a0204e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b657904682052656769737465726564206475706c6963617465206b65792e3c46696e616c697479547261636b65720001042866696e616c5f68696e74041068696e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08f42048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a65646c20626c6f636b2069732074686520676976656e206e756d6265722e00082857696e646f7753697a6538543a3a426c6f636b4e756d626572106500000004190120546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e345265706f72744c6174656e637938543a3a426c6f636b4e756d62657210e8030000041d01205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e0838416c72656164795570646174656404c82046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b1c42616448696e7404902046696e616c697a6564206865696768742061626f766520626c6f636b206e756d6265721c4772616e647061013c4772616e64706146696e616c6974791c2c417574686f726974696573010034417574686f726974794c6973740400102c20444550524543415445440061012054686973207573656420746f2073746f7265207468652063757272656e7420617574686f72697479207365742c20776869636820686173206265656e206d6967726174656420746f207468652077656c6c2d6b6e6f776e94204752414e4450415f415554484f52495445535f4b455920756e686173686564206b65792e14537461746501006c53746f72656453746174653c543a3a426c6f636b4e756d6265723e04000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e676500008c53746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000038543a3a426c6f636b4e756d626572040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c656400008028543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d626572290400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e7453657449640100145365744964200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e0001011453657449643053657373696f6e496e64657800040004c1012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f7220776869636820697473206d656d62657273207765726520726573706f6e7369626c652e0104487265706f72745f6d69736265686176696f72041c5f7265706f72741c5665633c75383e0464205265706f727420736f6d65206d69736265686176696f722e010c384e6577417574686f7269746965730434417574686f726974794c6973740490204e657720617574686f726974792073657420686173206265656e206170706c6965642e1850617573656400049c2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640004a02043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e00102c50617573654661696c656408090120417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665a8202865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e30526573756d654661696c656408150120417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e277420706175736564a42028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e344368616e676550656e64696e6704ec20417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e1c546f6f536f6f6e04c02043616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e20496d4f6e6c696e650120496d4f6e6c696e651020476f737369704174010038543a3a426c6f636b4e756d626572100000000004a02054686520626c6f636b206e756d626572207768656e2077652073686f756c6420676f737369702e104b65797301004c5665633c543a3a417574686f7269747949643e040004d0205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e485265636569766564486561727462656174730002013053657373696f6e496e6465782441757468496e6465781c5665633c75383e01040008e420466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206041757468496e646578608c20746f20606f6666636861696e3a3a4f70617175654e6574776f726b5374617465602e38417574686f726564426c6f636b730102013053657373696f6e496e64657838543a3a56616c696461746f7249640c75333201100000000008150120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f662060543a3a56616c696461746f7249646020746f20746865c8206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e0104246865617274626561740824686561727462656174644865617274626561743c543a3a426c6f636b4e756d6265723e285f7369676e6174757265bc3c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e617475726500010c444865617274626561745265636569766564042c417574686f72697479496404c02041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f726974794964601c416c6c476f6f640004d42041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2c536f6d654f66666c696e6504605665633c4964656e74696669636174696f6e5475706c653e0431012041742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e63652076616c696461746f722077617320666f756e6420746f206265206f66666c696e652e000828496e76616c69644b65790464204e6f6e206578697374656e74207075626c6963206b65792e4c4475706c6963617465644865617274626561740458204475706c696361746564206865617274626561742e48417574686f72697479446973636f766572790001000000002444656d6f6372616379012444656d6f6372616379403c5075626c696350726f70436f756e7401002450726f70496e646578100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f707301009c5665633c2850726f70496e6465782c20543a3a486173682c20543a3a4163636f756e744964293e040004210120546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865207365636f6e64206974656d206973207468652070726f706f73616c277320686173682e24507265696d616765730001011c543a3a48617368d4285665633c75383e2c20543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d62657229000400086101204d6170206f662068617368657320746f207468652070726f706f73616c20707265696d6167652c20616c6f6e6720776974682077686f207265676973746572656420697420616e64207468656972206465706f7369742ee42054686520626c6f636b206e756d6265722069732074686520626c6f636b20617420776869636820697420776173206465706f73697465642e244465706f7369744f660001012450726f70496e646578842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e2900040004842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e3c5265666572656e64756d436f756e7401003c5265666572656e64756d496e646578100000000004310120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e344c6f77657374556e62616b656401003c5265666572656e64756d496e646578100000000008250120546865206c6f77657374207265666572656e64756d20696e64657820726570726573656e74696e6720616e20756e62616b6564207265666572656e64756d2e20457175616c20746fdc20605265666572656e64756d436f756e74602069662074686572652069736e2774206120756e62616b6564207265666572656e64756d2e405265666572656e64756d496e666f4f660001013c5265666572656e64756d496e6465789c5265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a486173683e00040004b420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e34446973706174636851756575650100bc5665633c28543a3a426c6f636b4e756d6265722c20543a3a486173682c205265666572656e64756d496e646578293e0400044101205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e2053746f726564206f72646572656420627920626c6f636b206e756d6265722e24566f74657273466f720101013c5265666572656e64756d496e646578445665633c543a3a4163636f756e7449643e00040004a4204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e18566f74654f660101017c285265666572656e64756d496e6465782c20543a3a4163636f756e7449642910566f7465000400106101204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c794d012069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468655d012064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616ef420616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e1450726f787900010130543a3a4163636f756e74496430543a3a4163636f756e7449640004000831012057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b6579206973207468658820766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e2c44656c65676174696f6e7301010130543a3a4163636f756e7449646828543a3a4163636f756e7449642c20436f6e76696374696f6e2901840000000000000000000000000000000000000000000000000000000000000000000441012047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e544c6173745461626c656457617345787465726e616c010010626f6f6c0400085901205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c6963282070726f706f73616c2e304e65787445787465726e616c00006028543a3a486173682c20566f74655468726573686f6c6429040010590120546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e550120546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743aa4202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f7268202d20605075626c696350726f70736020697320656d7074792e24426c61636b6c6973740001011c543a3a486173688c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e290004000851012041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d626572e82028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e3443616e63656c6c6174696f6e730101011c543a3a4861736810626f6f6c000400042901205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e01541c70726f706f7365083470726f706f73616c5f686173681c543a3a486173681476616c756554436f6d706163743c42616c616e63654f663c543e3e18a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e002c2023203c7765696768743e20202d204f2831292e80202d2054776f204442206368616e6765732c206f6e6520444220656e7472792e302023203c2f7765696768743e187365636f6e64042070726f706f73616c48436f6d706163743c50726f70496e6465783e18a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e002c2023203c7765696768743e20202d204f2831292e40202d204f6e6520444220656e7472792e302023203c2f7765696768743e10766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f746510566f74651c350120566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bbc206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e002c2023203c7765696768743e20202d204f2831292e7c202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e302023203c2f7765696768743e2870726f78795f766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f746510566f74651c510120566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374f8207468652070726f706f73616c3b20206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e002c2023203c7765696768743e20202d204f2831292e7c202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e302023203c2f7765696768743e40656d657267656e63795f63616e63656c04247265665f696e6465783c5265666572656e64756d496e646578085101205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d6530207265666572656e64756d2e4065787465726e616c5f70726f706f7365043470726f706f73616c5f686173681c543a3a48617368083101205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c30207265666572656e64756d2e6465787465726e616c5f70726f706f73655f6d616a6f72697479043470726f706f73616c5f686173681c543a3a48617368145901205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c656020616e2065787465726e616c207265666572656e64756d2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e6065787465726e616c5f70726f706f73655f64656661756c74043470726f706f73616c5f686173681c543a3a48617368144901205363686564756c652061206e656761746976652d7475726e6f75742d62696173207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f84207363686564756c6520616e2065787465726e616c207265666572656e64756d2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e28666173745f747261636b0c3470726f706f73616c5f686173681c543a3a4861736834766f74696e675f706572696f6438543a3a426c6f636b4e756d6265721464656c617938543a3a426c6f636b4e756d626572245101205363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564650120696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e65ec20627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e00f8202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e6101202d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e20496e6372656173656420746f9820202060456d657267656e6379566f74696e67506572696f646020696620746f6f206c6f772e5501202d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265bc202020656e61637465642e205468697320646f65736e277420686176652061206d696e696d756d20616d6f756e742e347665746f5f65787465726e616c043470726f706f73616c5f686173681c543a3a4861736804bc205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e4463616e63656c5f7265666572656e64756d04247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e04542052656d6f76652061207265666572656e64756d2e3463616e63656c5f717565756564041477686963683c5265666572656e64756d496e64657804a02043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e247365745f70726f7879041470726f787930543a3a4163636f756e7449641498205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e002c2023203c7765696768743e58202d204f6e6520657874726120444220656e7472792e302023203c2f7765696768743e3072657369676e5f70726f787900149820436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e002c2023203c7765696768743e40202d204f6e6520444220636c6561722e302023203c2f7765696768743e3072656d6f76655f70726f7879041470726f787930543a3a4163636f756e744964149820436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e002c2023203c7765696768743e40202d204f6e6520444220636c6561722e302023203c2f7765696768743e2064656c65676174650808746f30543a3a4163636f756e74496428636f6e76696374696f6e28436f6e76696374696f6e143c2044656c656761746520766f74652e002c2023203c7765696768743e58202d204f6e6520657874726120444220656e7472792e302023203c2f7765696768743e28756e64656c656761746500144420556e64656c656761746520766f74652e002c2023203c7765696768743e20202d204f2831292e302023203c2f7765696768743e58636c6561725f7075626c69635f70726f706f73616c7300040101205665746f20616e6420626c61636b6c697374207468652070726f706f73616c20686173682e204d7573742062652066726f6d20526f6f74206f726967696e2e346e6f74655f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e0861012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e205468697320646f65736e27742072657175697265207468652070726f706f73616c20746f206265250120696e207468652064697370617463682071756575652062757420646f657320726571756972652061206465706f7369742c2072657475726e6564206f6e636520656e61637465642e586e6f74655f696d6d696e656e745f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e0845012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e2054686973207265717569726573207468652070726f706f73616c20746f206265b420696e207468652064697370617463682071756575652e204e6f206465706f736974206973206e65656465642e34726561705f707265696d616765043470726f706f73616c5f686173681c543a3a4861736814f42052656d6f766520616e20657870697265642070726f706f73616c20707265696d61676520616e6420636f6c6c65637420746865206465706f7369742e00510120546869732077696c6c206f6e6c7920776f726b2061667465722060566f74696e67506572696f646020626c6f636b732066726f6d207468652074696d6520746861742074686520707265696d616765207761735d01206e6f7465642c2069662069742773207468652073616d65206163636f756e7420646f696e672069742e2049662069742773206120646966666572656e74206163636f756e742c207468656e206974276c6c206f6e6c79b020776f726b20616e206164646974696f6e616c2060456e6163746d656e74506572696f6460206c617465722e01402050726f706f736564082450726f70496e6465781c42616c616e636504c02041206d6f74696f6e20686173206265656e2070726f706f7365642062792061207075626c6963206163636f756e742e185461626c65640c2450726f70496e6465781c42616c616e6365385665633c4163636f756e7449643e04dc2041207075626c69632070726f706f73616c20686173206265656e207461626c656420666f72207265666572656e64756d20766f74652e3845787465726e616c5461626c656400049820416e2065787465726e616c2070726f706f73616c20686173206265656e207461626c65642e1c53746172746564083c5265666572656e64756d496e64657834566f74655468726573686f6c6404602041207265666572656e64756d2068617320626567756e2e18506173736564043c5265666572656e64756d496e64657804b020412070726f706f73616c20686173206265656e20617070726f766564206279207265666572656e64756d2e244e6f74506173736564043c5265666572656e64756d496e64657804b020412070726f706f73616c20686173206265656e2072656a6563746564206279207265666572656e64756d2e2443616e63656c6c6564043c5265666572656e64756d496e64657804842041207265666572656e64756d20686173206265656e2063616e63656c6c65642e204578656375746564083c5265666572656e64756d496e64657810626f6f6c047420412070726f706f73616c20686173206265656e20656e61637465642e2444656c65676174656408244163636f756e744964244163636f756e74496404e020416e206163636f756e74206861732064656c65676174656420746865697220766f746520746f20616e6f74686572206163636f756e742e2c556e64656c65676174656404244163636f756e74496404e820416e206163636f756e74206861732063616e63656c6c656420612070726576696f75732064656c65676174696f6e206f7065726174696f6e2e185665746f65640c244163636f756e74496410486173682c426c6f636b4e756d626572049820416e2065787465726e616c2070726f706f73616c20686173206265656e207665746f65642e34507265696d6167654e6f7465640c1048617368244163636f756e7449641c42616c616e636504e020412070726f706f73616c277320707265696d61676520776173206e6f7465642c20616e6420746865206465706f7369742074616b656e2e30507265696d616765557365640c1048617368244163636f756e7449641c42616c616e636504150120412070726f706f73616c20707265696d616765207761732072656d6f76656420616e6420757365642028746865206465706f736974207761732072657475726e6564292e3c507265696d616765496e76616c69640810486173683c5265666572656e64756d496e646578040d0120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d6167652077617320696e76616c69642e3c507265696d6167654d697373696e670810486173683c5265666572656e64756d496e646578040d0120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d61676520776173206d697373696e672e38507265696d616765526561706564101048617368244163636f756e7449641c42616c616e6365244163636f756e744964045d012041207265676973746572656420707265696d616765207761732072656d6f76656420616e6420746865206465706f73697420636f6c6c6563746564206279207468652072656170657220286c617374206974656d292e1c3c456e6163746d656e74506572696f6438543a3a426c6f636b4e756d6265721000c2010014710120546865206d696e696d756d20706572696f64206f66206c6f636b696e6720616e642074686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e0031012049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e737572652074686174690120766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e2074686520636173652077686572659c207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e304c61756e6368506572696f6438543a3a426c6f636b4e756d62657210c089010004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e30566f74696e67506572696f6438543a3a426c6f636b4e756d62657210c089010004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e384d696e696d756d4465706f7369743042616c616e63654f663c543e400010a5d4e8000000000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e54456d657267656e6379566f74696e67506572696f6438543a3a426c6f636b4e756d626572100807000004ec204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f7220616e20656d657267656e6379207265666572656e64756d2e34436f6f6c6f6666506572696f6438543a3a426c6f636b4e756d62657210c089010004610120506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e4c507265696d616765427974654465706f7369743042616c616e63654f663c543e4000e1f5050000000000000000000000000429012054686520616d6f756e74206f662062616c616e63652074686174206d757374206265206465706f7369746564207065722062797465206f6620707265696d6167652073746f7265642e582056616c75654c6f7704382056616c756520746f6f206c6f773c50726f706f73616c4d697373696e6704602050726f706f73616c20646f6573206e6f74206578697374204e6f7450726f78790430204e6f7420612070726f787920426164496e646578043820556e6b6e6f776e20696e6465783c416c726561647943616e63656c656404982043616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365444475706c696361746550726f706f73616c04582050726f706f73616c20616c7265616479206d6164654c50726f706f73616c426c61636b6c6973746564046c2050726f706f73616c207374696c6c20626c61636b6c6973746564444e6f7453696d706c654d616a6f7269747904ac204e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f726974792c496e76616c696448617368043420496e76616c69642068617368284e6f50726f706f73616c0454204e6f2065787465726e616c2070726f706f73616c34416c72656164795665746f6564049c204964656e74697479206d6179206e6f74207665746f20612070726f706f73616c20747769636530416c726561647950726f7879044020416c726561647920612070726f78792857726f6e6750726f787904302057726f6e672070726f7879304e6f7444656c6567617465640438204e6f742064656c656761746564444475706c6963617465507265696d616765045c20507265696d61676520616c7265616479206e6f7465642c4e6f74496d6d696e656e740434204e6f7420696d6d696e656e74144561726c79042820546f6f206561726c7920496d6d696e656e74042420496d6d696e656e743c507265696d6167654d697373696e67044c20507265696d616765206e6f7420666f756e64445265666572656e64756d496e76616c6964048820566f746520676976656e20666f7220696e76616c6964207265666572656e64756d3c507265696d616765496e76616c6964044420496e76616c696420707265696d6167652c4e6f6e6557616974696e670454204e6f2070726f706f73616c732077616974696e671c436f756e63696c014c496e7374616e636531436f6c6c656374697665142450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001011c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001011c543a3a486173684c566f7465733c543a3a4163636f756e7449643e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e01102c7365745f6d656d62657273042c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e105101205365742074686520636f6c6c6563746976652773206d656d62657273686970206d616e75616c6c7920746f20606e65775f6d656d62657273602e204265206e69636520746f2074686520636861696e20616e645c2070726f76696465206974207072652d736f727465642e005820526571756972657320726f6f74206f726967696e2e1c65786563757465042070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e0cf420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e1c70726f706f736508247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e102c2023203c7765696768743e90202d20426f756e6465642073746f7261676520726561647320616e64207772697465732eb8202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c102c2023203c7765696768743e8c202d20426f756e6465642073746f72616765207265616420616e64207772697465732e5501202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e302023203c2f7765696768743e01182050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e74084d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292e14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408104861736810626f6f6c0405012041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408104861736810626f6f6c042d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e0018244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642148546563686e6963616c436f6d6d6974746565014c496e7374616e636532436f6c6c656374697665142450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001011c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001011c543a3a486173684c566f7465733c543a3a4163636f756e7449643e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e01102c7365745f6d656d62657273042c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e105101205365742074686520636f6c6c6563746976652773206d656d62657273686970206d616e75616c6c7920746f20606e65775f6d656d62657273602e204265206e69636520746f2074686520636861696e20616e645c2070726f76696465206974207072652d736f727465642e005820526571756972657320726f6f74206f726967696e2e1c65786563757465042070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e0cf420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e1c70726f706f736508247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e102c2023203c7765696768743e90202d20426f756e6465642073746f7261676520726561647320616e64207772697465732eb8202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c102c2023203c7765696768743e8c202d20426f756e6465642073746f72616765207265616420616e64207772697465732e5501202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e302023203c2f7765696768743e01182050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e74084d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292e14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408104861736810626f6f6c0405012041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408104861736810626f6f6c042d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e0018244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642144456c656374696f6e7350687261676d656e014050687261676d656e456c656374696f6e181c4d656d626572730100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e040004f0205468652063757272656e7420656c6563746564206d656d626572736869702e20536f72746564206261736564206f6e206163636f756e742069642e2452756e6e65727355700100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e0400044901205468652063757272656e742072756e6e6572735f75702e20536f72746564206261736564206f6e206c6f7720746f2068696768206d657269742028776f72736520746f20626573742072756e6e6572292e38456c656374696f6e526f756e647301000c75333210000000000441012054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e65642c206578636c7564696e6720746865207570636f6d696e67206f6e652e1c566f7465734f6601010130543a3a4163636f756e744964445665633c543a3a4163636f756e7449643e01040004010120566f746573206f66206120706172746963756c617220766f7465722c20776974682074686520726f756e6420696e646578206f662074686520766f7465732e1c5374616b654f6601010130543a3a4163636f756e7449643042616c616e63654f663c543e0040000000000000000000000000000000000464204c6f636b6564207374616b65206f66206120766f7465722e2843616e646964617465730100445665633c543a3a4163636f756e7449643e0400086501205468652070726573656e742063616e646964617465206c6973742e20536f72746564206261736564206f6e206163636f756e742069642e20412063757272656e74206d656d6265722063616e206e6576657220656e7465720101207468697320766563746f7220616e6420697320616c7761797320696d706c696369746c7920617373756d656420746f20626520612063616e6469646174652e011810766f74650814766f746573445665633c543a3a4163636f756e7449643e1476616c756554436f6d706163743c42616c616e63654f663c543e3e3c050120566f746520666f72206120736574206f662063616e6469646174657320666f7220746865207570636f6d696e6720726f756e64206f6620656c656374696f6e2e0050205468652060766f746573602073686f756c643a482020202d206e6f7420626520656d7074792eac2020202d206265206c657373207468616e20746865206e756d626572206f662063616e646964617465732e005d012055706f6e20766f74696e672c206076616c75656020756e697473206f66206077686f6027732062616c616e6365206973206c6f636b656420616e64206120626f6e6420616d6f756e742069732072657365727665642e5d012049742069732074686520726573706f6e736962696c697479206f66207468652063616c6c657220746f206e6f7420706c61636520616c6c206f662074686569722062616c616e636520696e746f20746865206c6f636ba020616e64206b65657020736f6d6520666f722066757274686572207472616e73616374696f6e732e002c2023203c7765696768743e2c2023232323205374617465302052656164733a204f283129c8205772697465733a204f28562920676976656e2060566020766f7465732e205620697320626f756e6465642062792031362e302023203c2f7765696768743e3072656d6f76655f766f746572001c21012052656d6f766520606f726967696e60206173206120766f7465722e20546869732072656d6f76657320746865206c6f636b20616e642072657475726e732074686520626f6e642e002c2023203c7765696768743e2c2023232323205374617465302052656164733a204f28312934205772697465733a204f283129302023203c2f7765696768743e507265706f72745f646566756e63745f766f74657204187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365345d01205265706f727420607461726765746020666f72206265696e6720616e20646566756e637420766f7465722e20496e2063617365206f6620612076616c6964207265706f72742c20746865207265706f727465722069735d012072657761726465642062792074686520626f6e6420616d6f756e74206f662060746172676574602e204f74686572776973652c20746865207265706f7274657220697473656c662069732072656d6f76656420616e645c20746865697220626f6e6420697320736c61736865642e0088204120646566756e637420766f74657220697320646566696e656420746f2062653a4d012020202d206120766f7465722077686f73652063757272656e74207375626d697474656420766f7465732061726520616c6c20696e76616c69642e20692e652e20616c6c206f66207468656d20617265206e6fb420202020206c6f6e67657220612063616e646964617465206e6f7220616e20616374697665206d656d6265722e002c2023203c7765696768743e2c202323232320537461746515012052656164733a204f284e4c6f674d2920676976656e204d2063757272656e742063616e6469646174657320616e64204e20766f74657320666f722060746172676574602e34205772697465733a204f283129302023203c2f7765696768743e407375626d69745f63616e646964616379003478205375626d6974206f6e6573656c6620666f722063616e6469646163792e006420412063616e6469646174652077696c6c206569746865723aec2020202d204c6f73652061742074686520656e64206f6620746865207465726d20616e6420666f7266656974207468656972206465706f7369742e2d012020202d2057696e20616e64206265636f6d652061206d656d6265722e204d656d626572732077696c6c206576656e7475616c6c7920676574207468656972207374617368206261636b2e55012020202d204265636f6d6520612072756e6e65722d75702e2052756e6e6572732d75707320617265207265736572766564206d656d6265727320696e2063617365206f6e65206765747320666f72636566756c6c7934202020202072656d6f7665642e002c2023203c7765696768743e2c20232323232053746174658c2052656164733a204f284c6f674e2920476976656e204e2063616e646964617465732e34205772697465733a204f283129302023203c2f7765696768743e4872656e6f756e63655f63616e646964616379002451012052656e6f756e6365206f6e65277320696e74656e74696f6e20746f20626520612063616e64696461746520666f7220746865206e65787420656c656374696f6e20726f756e642e203320706f74656e7469616c40206f7574636f6d65732065786973743a4101202d20606f726967696e6020697320612063616e64696461746520616e64206e6f7420656c656374656420696e20616e79207365742e20496e207468697320636173652c2074686520626f6e64206973f4202020756e72657365727665642c2072657475726e656420616e64206f726967696e2069732072656d6f76656420617320612063616e6469646174652e5901202d20606f726967696e6020697320612063757272656e742072756e6e65722075702e20496e207468697320636173652c2074686520626f6e6420697320756e72657365727665642c2072657475726e656420616e64842020206f726967696e2069732072656d6f76656420617320612072756e6e65722e4d01202d20606f726967696e6020697320612063757272656e74206d656d6265722e20496e207468697320636173652c2074686520626f6e6420697320756e726573657276656420616e64206f726967696e206973590120202072656d6f7665642061732061206d656d6265722c20636f6e73657175656e746c79206e6f74206265696e6720612063616e64696461746520666f7220746865206e65787420726f756e6420616e796d6f72652e650120202053696d696c617220746f205b6072656d6f76655f766f746572605d2c206966207265706c6163656d656e742072756e6e657273206578697374732c20746865792061726520696d6d6564696174656c7920757365642e3472656d6f76655f6d656d626572040c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365345d012052656d6f7665206120706172746963756c6172206d656d6265722066726f6d20746865207365742e20546869732069732065666665637469766520696d6d6564696174656c7920616e642074686520626f6e64206f668020746865206f7574676f696e67206d656d62657220697320736c61736865642e00590120496620612072756e6e65722d757020697320617661696c61626c652c207468656e2074686520626573742072756e6e65722d75702077696c6c2062652072656d6f76656420616e64207265706c6163657320746865f4206f7574676f696e67206d656d6265722e204f74686572776973652c2061206e65772070687261676d656e20726f756e6420697320737461727465642e004501204e6f74652074686174207468697320646f6573206e6f7420616666656374207468652064657369676e6174656420626c6f636b206e756d626572206f6620746865206e65787420656c656374696f6e2e002c2023203c7765696768743e2c2023232323205374617465582052656164733a204f28646f5f70687261676d656e295c205772697465733a204f28646f5f70687261676d656e29302023203c2f7765696768743e01141c4e65775465726d04645665633c284163636f756e7449642c2042616c616e6365293e0855012041206e6577207465726d2077697468206e6577206d656d626572732e205468697320696e64696361746573207468617420656e6f7567682063616e6469646174657320657869737465642c206e6f742074686174450120656e6f756768206861766520686173206265656e20656c65637465642e2054686520696e6e65722076616c7565206d757374206265206578616d696e656420666f72207468697320707572706f73652e24456d7074795465726d0004d8204e6f20286f72206e6f7420656e6f756768292063616e64696461746573206578697374656420666f72207468697320726f756e642e304d656d6265724b69636b656404244163636f756e7449640845012041206d656d62657220686173206265656e2072656d6f7665642e20546869732073686f756c6420616c7761797320626520666f6c6c6f7765642062792065697468657220604e65775465726d60206f74342060456d7074795465726d602e3c4d656d62657252656e6f756e63656404244163636f756e74496404a02041206d656d626572206861732072656e6f756e6365642074686569722063616e6469646163792e34566f7465725265706f727465640c244163636f756e744964244163636f756e74496410626f6f6c086101204120766f7465722028666972737420656c656d656e742920776173207265706f72746564202862797420746865207365636f6e6420656c656d656e742920776974682074686520746865207265706f7274206265696e678c207375636365737366756c206f72206e6f742028746869726420656c656d656e74292e143443616e646964616379426f6e643042616c616e63654f663c543e400010a5d4e800000000000000000000000028566f74696e67426f6e643042616c616e63654f663c543e4000743ba40b00000000000000000000000038446573697265644d656d626572730c753332100d00000000404465736972656452756e6e65727355700c753332100700000000305465726d4475726174696f6e38543a3a426c6f636b4e756d6265721040380000003830556e61626c65546f566f746504c42043616e6e6f7420766f7465207768656e206e6f2063616e64696461746573206f72206d656d626572732065786973742e1c4e6f566f7465730498204d75737420766f746520666f72206174206c65617374206f6e652063616e6469646174652e30546f6f4d616e79566f74657304882043616e6e6f7420766f7465206d6f7265207468616e2063616e646964617465732e504d6178696d756d566f7465734578636565646564049c2043616e6e6f7420766f7465206d6f7265207468616e206d6178696d756d20616c6c6f7765642e284c6f7742616c616e636504c82043616e6e6f7420766f74652077697468207374616b65206c657373207468616e206d696e696d756d2062616c616e63652e3c556e61626c65546f506179426f6e64047c20566f7465722063616e206e6f742070617920766f74696e6720626f6e642e2c4d7573744265566f7465720444204d757374206265206120766f7465722e285265706f727453656c6604502043616e6e6f74207265706f72742073656c662e4c4475706c69636174656443616e6469646174650484204475706c6963617465642063616e646964617465207375626d697373696f6e2e304d656d6265725375626d6974048c204d656d6265722063616e6e6f742072652d7375626d69742063616e6469646163792e3052756e6e65725375626d6974048c2052756e6e65722063616e6e6f742072652d7375626d69742063616e6469646163792e68496e73756666696369656e7443616e64696461746546756e647304982043616e64696461746520646f6573206e6f74206861766520656e6f7567682066756e64732e34496e76616c69644f726967696e04c8204f726967696e206973206e6f7420612063616e6469646174652c206d656d626572206f7220612072756e6e65722075702e244e6f744d656d6265720438204e6f742061206d656d6265722e4c546563686e6963616c4d656d62657273686970014c496e7374616e6365314d656d62657273686970041c4d656d626572730100445665633c543a3a4163636f756e7449643e040004c8205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e0114286164645f6d656d626572040c77686f30543a3a4163636f756e7449640c7c204164642061206d656d626572206077686f6020746f20746865207365742e00b4204d6179206f6e6c792062652063616c6c65642066726f6d20604164644f726967696e60206f7220726f6f742e3472656d6f76655f6d656d626572040c77686f30543a3a4163636f756e7449640c902052656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e00c0204d6179206f6e6c792062652063616c6c65642066726f6d206052656d6f76654f726967696e60206f7220726f6f742e2c737761705f6d656d626572081872656d6f766530543a3a4163636f756e7449640c61646430543a3a4163636f756e7449640cc02053776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e00b8204d6179206f6e6c792062652063616c6c65642066726f6d2060537761704f726967696e60206f7220726f6f742e3472657365745f6d656d62657273041c6d656d62657273445665633c543a3a4163636f756e7449643e105901204368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e646c207061737320606d656d6265727360207072652d736f727465642e00bc204d6179206f6e6c792062652063616c6c65642066726f6d206052657365744f726967696e60206f7220726f6f742e286368616e67655f6b6579040c6e657730543a3a4163636f756e7449640cd82053776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e00f4204d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e01182c4d656d62657241646465640004e42054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e344d656d62657252656d6f7665640004ec2054686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e384d656d62657273537761707065640004dc2054776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e304d656d6265727352657365740004190120546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e284b65794368616e676564000488204f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e1444756d6d7904bc73705f7374643a3a6d61726b65723a3a5068616e746f6d446174613c284163636f756e7449642c204576656e74293e0470205068616e746f6d206d656d6265722c206e6576657220757365642e000020547265617375727901205472656173757279143450726f706f73616c436f756e7401003450726f706f73616c496e646578100000000004a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c730001013450726f706f73616c496e6465789050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c730100485665633c50726f706f73616c496e6465783e040004f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e10546970730001051c543a3a48617368f04f70656e5469703c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265722c20543a3a486173683e0004000c59012054697073207468617420617265206e6f742079657420636f6d706c657465642e204b65796564206279207468652068617368206f66206028726561736f6e2c2077686f29602066726f6d207468652076616c75652e3d012054686973206861732074686520696e73656375726520656e756d657261626c6520686173682066756e6374696f6e2073696e636520746865206b657920697473656c6620697320616c7265616479802067756172616e7465656420746f20626520612073656375726520686173682e1c526561736f6e730001051c543a3a486173681c5665633c75383e0004000849012053696d706c6520707265696d616765206c6f6f6b75702066726f6d2074686520726561736f6e2773206861736820746f20746865206f726967696e616c20646174612e20416761696e2c2068617320616e610120696e73656375726520656e756d657261626c6520686173682073696e636520746865206b65792069732067756172616e7465656420746f2062652074686520726573756c74206f6620612073656375726520686173682e0120387265706f72745f617765736f6d650818726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e7449644c5d01205265706f727420736f6d657468696e672060726561736f6e60207468617420646573657276657320612074697020616e6420636c61696d20616e79206576656e7475616c207468652066696e6465722773206665652e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005501205061796d656e743a20605469705265706f72744465706f73697442617365602077696c6c2062652072657365727665642066726f6d20746865206f726967696e206163636f756e742c2061732077656c6c206173d420605469705265706f72744465706f736974506572427974656020666f722065616368206279746520696e2060726561736f6e602e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743e9c202d20604f2852296020776865726520605260206c656e677468206f662060726561736f6e602e64202d204f6e652062616c616e6365206f7065726174696f6e2e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e2c726574726163745f7469700410686173681c543a3a486173684c550120526574726163742061207072696f72207469702d7265706f72742066726f6d20607265706f72745f617765736f6d65602c20616e642063616e63656c207468652070726f63657373206f662074697070696e672e00e0204966207375636365737366756c2c20746865206f726967696e616c206465706f7369742077696c6c20626520756e72657365727665642e00510120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642074686520746970206964656e746966696564206279206068617368604501206d7573742068617665206265656e207265706f7274656420627920746865207369676e696e67206163636f756e74207468726f75676820607265706f72745f617765736f6d65602028616e64206e6f7450207468726f75676820607469705f6e657760292e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e009020456d697473206054697052657472616374656460206966207375636365737366756c2e002c2023203c7765696768743e24202d20604f2854296064202d204f6e652062616c616e6365206f7065726174696f6e2ec4202d2054776f2073746f726167652072656d6f76616c7320286f6e6520726561642c20636f64656320604f28542960292e34202d204f6e65206576656e742e302023203c2f7765696768743e1c7469705f6e65770c18726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e744964247469705f76616c75653042616c616e63654f663c543e4cf4204769766520612074697020666f7220736f6d657468696e67206e65773b206e6f2066696e6465722773206665652077696c6c2062652074616b656e2e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743e4101202d20604f2852202b2054296020776865726520605260206c656e677468206f662060726561736f6e602c2060546020697320746865206e756d626572206f6620746970706572732e2060546020697345012020206e61747572616c6c79206361707065642061732061206d656d62657273686970207365742c20605260206973206c696d69746564207468726f756768207472616e73616374696f6e2d73697a652e0d01202d2054776f2073746f7261676520696e73657274696f6e732028636f6465637320604f285229602c20604f28542960292c206f6e65207265616420604f283129602e34202d204f6e65206576656e742e302023203c2f7765696768743e0c7469700810686173681c543a3a48617368247469705f76616c75653042616c616e63654f663c543e4cb4204465636c6172652061207469702076616c756520666f7220616e20616c72656164792d6f70656e207469702e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f66207468652068617368206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279382020206163636f756e742049442e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e00650120456d6974732060546970436c6f73696e676020696620746865207468726573686f6c64206f66207469707065727320686173206265656e207265616368656420616e642074686520636f756e74646f776e20706572696f64342068617320737461727465642e002c2023203c7765696768743e24202d20604f285429600101202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28542960292c206f6e652073746f72616765207265616420604f283129602e4c202d20557020746f206f6e65206576656e742e302023203c2f7765696768743e24636c6f73655f7469700410686173681c543a3a48617368386020436c6f736520616e64207061796f75742061207469702e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0019012054686520746970206964656e74696669656420627920606861736860206d75737420686176652066696e69736865642069747320636f756e74646f776e20706572696f642e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e002c2023203c7765696768743e24202d20604f28542960e4202d204f6e652073746f726167652072657472696576616c2028636f64656320604f285429602920616e642074776f2072656d6f76616c732e88202d20557020746f2074687265652062616c616e6365206f7065726174696f6e732e302023203c2f7765696768743e3470726f706f73655f7370656e64081476616c756554436f6d706163743c42616c616e63654f663c543e3e2c62656e65666963696172798c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365242d012050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c7565350120697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e636520746865542070726f706f73616c20697320617761726465642e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e94202d204f6e65204442206368616e67652c206f6e6520657874726120444220656e7472792e302023203c2f7765696768743e3c72656a6563745f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e1cfc2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e40202d204f6e6520444220636c6561722e302023203c2f7765696768743e40617070726f76655f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e205d0120417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e6566696369617279ac20616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e44202d204f6e65204442206368616e67652e302023203c2f7765696768743e012c2050726f706f736564043450726f706f73616c496e6465780438204e65772070726f706f73616c2e205370656e64696e67041c42616c616e636504e8205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e1c417761726465640c3450726f706f73616c496e6465781c42616c616e6365244163636f756e744964048020536f6d652066756e64732068617665206265656e20616c6c6f63617465642e2052656a6563746564083450726f706f73616c496e6465781c42616c616e636504b420412070726f706f73616c207761732072656a65637465643b2066756e6473207765726520736c61736865642e144275726e74041c42616c616e6365048c20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20526f6c6c6f766572041c42616c616e6365043101205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e1c4465706f736974041c42616c616e6365048020536f6d652066756e64732068617665206265656e206465706f73697465642e184e657754697004104861736804982041206e6577207469702073756767657374696f6e20686173206265656e206f70656e65642e28546970436c6f73696e6704104861736804dc2041207469702073756767657374696f6e206861732072656163686564207468726573686f6c6420616e6420697320636c6f73696e672e24546970436c6f7365640c1048617368244163636f756e7449641c42616c616e636504882041207469702073756767657374696f6e20686173206265656e20636c6f7365642e3054697052657472616374656404104861736804942041207469702073756767657374696f6e20686173206265656e207265747261637465642e203050726f706f73616c426f6e641c5065726d696c6c1050c30000085501204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e110120416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e4c50726f706f73616c426f6e644d696e696d756d3042616c616e63654f663c543e400040e59c301200000000000000000000044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f6438543a3a426c6f636b4e756d6265721080510100048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e1c5065726d696c6c10000000000411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e30546970436f756e74646f776e38543a3a426c6f636b4e756d62657210403800000445012054686520706572696f6420666f722077686963682061207469702072656d61696e73206f70656e20616674657220697320686173206163686965766564207468726573686f6c6420746970706572732e3454697046696e646572734665651c50657263656e7404140431012054686520616d6f756e74206f66207468652066696e616c2074697020776869636820676f657320746f20746865206f726967696e616c207265706f72746572206f6620746865207469702e505469705265706f72744465706f736974426173653042616c616e63654f663c543e400010a5d4e8000000000000000000000004d42054686520616d6f756e742068656c64206f6e206465706f73697420666f7220706c6163696e67206120746970207265706f72742e5c5469705265706f72744465706f736974506572427974653042616c616e63654f663c543e4000e40b540200000000000000000000000409012054686520616d6f756e742068656c64206f6e206465706f7369742070657220627974652077697468696e2074686520746970207265706f727420726561736f6e2e2070496e73756666696369656e7450726f706f7365727342616c616e6365047c2050726f706f73657227732062616c616e636520697320746f6f206c6f772e50496e76616c696450726f706f73616c496e646578046c204e6f2070726f706f73616c206174207468617420696e6465782e30526561736f6e546f6f42696704882054686520726561736f6e20676976656e206973206a75737420746f6f206269672e30416c72656164794b6e6f776e048c20546865207469702077617320616c726561647920666f756e642f737461727465642e28556e6b6e6f776e54697004642054686520746970206861736820697320756e6b6e6f776e2e244e6f7446696e64657204210120546865206163636f756e7420617474656d7074696e6720746f20726574726163742074686520746970206973206e6f74207468652066696e646572206f6620746865207469702e245374696c6c4f70656e042d0120546865207469702063616e6e6f7420626520636c61696d65642f636c6f736564206265636175736520746865726520617265206e6f7420656e6f7567682074697070657273207965742e245072656d617475726504350120546865207469702063616e6e6f7420626520636c61696d65642f636c6f73656420626563617573652069742773207374696c6c20696e2074686520636f756e74646f776e20706572696f642e18436c61696d730118436c61696d730c18436c61696d730001013c457468657265756d416464726573733042616c616e63654f663c543e0004000014546f74616c01003042616c616e63654f663c543e4000000000000000000000000000000000001c56657374696e670001013c457468657265756d41646472657373b02842616c616e63654f663c543e2c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265722900040010782056657374696e67207363686564756c6520666f72206120636c61696d2e0d012046697273742062616c616e63652069732074686520746f74616c20616d6f756e7420746861742073686f756c642062652068656c6420666f722076657374696e672ee4205365636f6e642062616c616e636520697320686f77206d7563682073686f756c6420626520756e6c6f636b65642070657220626c6f636b2ecc2054686520626c6f636b206e756d626572206973207768656e207468652076657374696e672073686f756c642073746172742e010814636c61696d08106465737430543a3a4163636f756e74496448657468657265756d5f7369676e61747572653845636473615369676e61747572650438204d616b65206120636c61696d2e286d696e745f636c61696d0c0c77686f3c457468657265756d416464726573731476616c75653042616c616e63654f663c543e4076657374696e675f7363686564756c65d04f7074696f6e3c2842616c616e63654f663c543e2c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d626572293e0488204164642061206e657720636c61696d2c20696620796f752061726520726f6f742e01041c436c61696d65640c244163636f756e7449643c457468657265756d416464726573731c42616c616e6365046c20536f6d656f6e6520636c61696d656420736f6d6520444f54732e041850726566697814265b75385d807c506179204b534d7320746f20746865204b7573616d61206163636f756e743a04150120546865205072656669782074686174206973207573656420696e207369676e656420457468657265756d206d6573736167657320666f722074686973206e6574776f726b002850617261636861696e73012850617261636861696e73242c417574686f7269746965730100405665633c56616c696461746f7249643e0400049420416c6c20617574686f72697469657327206b65797320617420746865206d6f6d656e742e10436f6465000101185061726149641c5665633c75383e0004000498205468652070617261636861696e7320726567697374657265642061742070726573656e742e144865616473000101185061726149641c5665633c75383e00040004cc20546865206865616473206f66207468652070617261636861696e7320726567697374657265642061742070726573656e742e2857617465726d61726b730001011850617261496438543a3a426c6f636b4e756d6265720004000cfc205468652077617465726d61726b2068656967687473206f66207468652070617261636861696e7320726567697374657265642061742070726573656e742e410120466f722065766572792070617261636861696e2c20746869732069732074686520626c6f636b206865696768742066726f6d20776869636820616c6c206d6573736167657320746172676574696e675d0120746861742070617261636861696e2068617665206265656e2070726f6365737365642e2043616e20626520604e6f6e6560206f6e6c79206966207468652070617261636861696e20646f65736e27742065786973742e3c556e726f75746564496e67726573730001016028543a3a426c6f636b4e756d6265722c20506172614964294c5665633c285061726149642c2048617368293e00040010550120556e726f7574656420696e67726573732e204d6170732028426c6f636b4e756d6265722c20746f5f636861696e2920706169727320746f205b2866726f6d5f636861696e2c206567726573735f726f6f74295d2e004d01205468657265206d617920626520616e20656e74727920756e6465722028692c20702920696e2074686973206d617020666f722065766572792069206265747765656e207468652070617261636861696e2773842077617465726d61726b20616e64207468652063757272656e7420626c6f636b2e4852656c61794469737061746368517565756501010118506172614964485665633c5570776172644d6573736167653e000400081d01204d6573736167657320726561647920746f2062652064697370617463686564206f6e746f207468652072656c617920636861696e2e204974206973207375626a65637420746fc820604d41585f4d4553534147455f434f554e546020616e64206057415445524d41524b5f4d4553534147455f53495a45602e5852656c61794469737061746368517565756553697a650101011850617261496428287533322c2075333229002000000000000000000c45012053697a65206f6620746865206469737061746368207175657565732e205365706172617465642066726f6d2061637475616c206461746120696e206f7264657220746f2061766f696420636f73746c795901206465636f64696e67207768656e20636865636b696e6720726563656970742076616c69646974792e204669727374206974656d20696e207475706c652069732074686520636f756e74206f66206d65737361676573fc097365636f6e642069662074686520746f74616c206c656e6774682028696e20627974657329206f6620746865206d657373616765207061796c6f6164732e344e65656473446973706174636801002c5665633c5061726149643e040004110120546865206f726465726564206c697374206f662050617261496473207468617420686176652061206052656c6179446973706174636851756575656020656e7472792e2444696455706461746500002c5665633c5061726149643e040010650120536f6d65206966207468652070617261636861696e20686561647320676574207570646174656420696e207468697320626c6f636b2c20616c6f6e672077697468207468652070617261636861696e204944732074686174350120646964207570646174652e204f72646572656420696e207468652073616d652077617920617320607265676973747261723a3a416374697665602028692e652e20627920506172614964292e0064204e6f6e65206966206e6f742079657420757064617465642e0104247365745f686561647304146865616473585665633c417474657374656443616e6469646174653e0415012050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e000000304174746573746174696f6e7301304174746573746174696f6e730c40526563656e7450617261426c6f636b7300010138543a3a426c6f636b4e756d62657244496e636c75646564426c6f636b733c543e00040008f02041206d617070696e672066726f6d206d6f64756c617220626c6f636b206e756d62657220286e2025204174746573746174696f6e506572696f6429cc20746f2073657373696f6e20696e64657820616e6420746865206c697374206f662063616e646964617465206861736865732e5450617261426c6f636b4174746573746174696f6e7300020138543a3a426c6f636b4e756d626572104861736850426c6f636b4174746573746174696f6e733c543e00040004a8204174746573746174696f6e73206f6e206120726563656e742070617261636861696e20626c6f636b2e24446964557064617465010010626f6f6c0400000104446d6f72655f6174746573746174696f6e7304145f6d6f7265404d6f72654174746573746174696f6e730415012050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e00000014536c6f74730114536c6f7473243841756374696f6e436f756e74657201003041756374696f6e496e646578100000000004d820546865206e756d626572206f662061756374696f6e7320746861742068617665206265656e207374617274656420736f206661722e284d616e6167656449647301002c5665633c5061726149643e0400084d01204f726465726564206c697374206f6620616c6c2060506172614964602076616c756573207468617420617265206d616e616765642062792074686973206d6f64756c652e205468697320696e636c75646573290120636861696e73207468617420617265206e6f7420796574206465706c6f7965642028627574206861766520776f6e20616e2061756374696f6e20696e2074686520667574757265292e204465706f7369747301010118506172614964445665633c42616c616e63654f663c543e3e000400345d0120566172696f757320616d6f756e7473206f6e206465706f73697420666f7220656163682070617261636861696e2e20416e20656e74727920696e20604d616e616765644964736020696d706c6965732061206e6f6e2d502064656661756c7420656e74727920686572652e006501205468652061637475616c20616d6f756e74206c6f636b6564206f6e2069747320626568616c6620617420616e792074696d6520697320746865206d6178696d756d206974656d20696e2074686973206c6973742e205468655101206669727374206974656d20696e20746865206c6973742069732074686520616d6f756e74206c6f636b656420666f72207468652063757272656e74204c6561736520506572696f642e20466f6c6c6f77696e67b0206974656d732061726520666f72207468652073756273657175656e74206c6561736520706572696f64732e006101205468652064656661756c742076616c75652028616e20656d707479206c6973742920696d706c6965732074686174207468652070617261636861696e206e6f206c6f6e6765722065786973747320286f72206e65766572b4206578697374656429206173206661722061732074686973206d6f64756c6520697320636f6e6365726e65642e00510120496620612070617261636861696e20646f65736e2774206578697374202a7965742a20627574206973207363686564756c656420746f20657869737420696e20746865206675747572652c207468656e2069745d012077696c6c206265206c6566742d7061646465642077697468206f6e65206f72206d6f7265207a65726f657320746f2064656e6f74652074686520666163742074686174206e6f7468696e672069732068656c64206f6e5d01206465706f73697420666f7220746865206e6f6e2d6578697374656e7420636861696e2063757272656e746c792c206275742069732068656c6420617420736f6d6520706f696e7420696e20746865206675747572652e2c41756374696f6e496e666f000088284c65617365506572696f644f663c543e2c20543a3a426c6f636b4e756d62657229040014f820496e666f726d6174696f6e2072656c6174696e6720746f207468652063757272656e742061756374696f6e2c206966207468657265206973206f6e652e00450120546865206669727374206974656d20696e20746865207475706c6520697320746865206c6561736520706572696f6420696e646578207468617420746865206669727374206f662074686520666f7572510120636f6e746967756f7573206c6561736520706572696f6473206f6e2061756374696f6e20697320666f722e20546865207365636f6e642069732074686520626c6f636b206e756d626572207768656e207468655d012061756374696f6e2077696c6c2022626567696e20746f20656e64222c20692e652e2074686520666972737420626c6f636b206f662074686520456e64696e6720506572696f64206f66207468652061756374696f6e2e1c57696e6e696e6700010138543a3a426c6f636b4e756d6265723857696e6e696e67446174613c543e0004000c5d01205468652077696e6e696e67206269647320666f722065616368206f66207468652031302072616e676573206174206561636820626c6f636b20696e207468652066696e616c20456e64696e6720506572696f64206f665101207468652063757272656e742061756374696f6e2e20546865206d61702773206b65792069732074686520302d626173656420696e64657820696e746f2074686520456e64696e6720506572696f642e205468651d0120666972737420626c6f636b206f662074686520656e64696e6720706572696f6420697320303b20746865206c6173742069732060456e64696e67506572696f64202d2031602e3c5265736572766564416d6f756e7473000101504269646465723c543a3a4163636f756e7449643e3042616c616e63654f663c543e00040008310120416d6f756e74732063757272656e746c7920726573657276656420696e20746865206163636f756e7473206f662074686520626964646572732063757272656e746c792077696e6e696e673820287375622d2972616e6765732e304f6e626f6172645175657565010101404c65617365506572696f644f663c543e2c5665633c5061726149643e0004000865012054686520736574206f662050617261204944732074686174206861766520776f6e20616e64206e65656420746f206265206f6e2d626f617264656420617420616e207570636f6d696e67206c656173652d706572696f642ef0205468697320697320636c6561726564206f7574206f6e2074686520666972737420626c6f636b206f6620746865206c6561736520706572696f642e284f6e626f617264696e6700010118506172614964f0284c65617365506572696f644f663c543e2c20496e636f6d696e6750617261636861696e3c543a3a4163636f756e7449642c20543a3a486173683e29000400104d01205468652061637475616c206f6e2d626f617264696e6720696e666f726d6174696f6e2e204f6e6c7920657869737473207768656e206f6e65206f662074686520666f6c6c6f77696e6720697320747275653a2501202d204974206973206265666f726520746865206c6561736520706572696f642074686174207468652070617261636861696e2073686f756c64206265206f6e2d626f61726465642e5901202d205468652066756c6c206f6e2d626f617264696e6720696e666f726d6174696f6e20686173206e6f7420796574206265656e2070726f766964656420616e64207468652070617261636861696e206973206e6f746c207965742064756520746f206265206f66662d626f61726465642e2c4f6666626f617264696e670101011850617261496430543a3a4163636f756e74496400800000000000000000000000000000000000000000000000000000000000000000086501204f66662d626f617264696e67206163636f756e743b2063757272656e63792068656c64206f6e206465706f73697420666f72207468652070617261636861696e206765747320706c6163656420686572652069662074686539012070617261636861696e2067657473206f66662d626f61726465643b20692e652e20697473206c6561736520706572696f6420697320757020616e642069742069736e27742072656e657765642e01182c6e65775f61756374696f6e08206475726174696f6e5c436f6d706163743c543a3a426c6f636b4e756d6265723e486c656173655f706572696f645f696e64657864436f6d706163743c4c65617365506572696f644f663c543e3e1458204372656174652061206e65772061756374696f6e2e00550120546869732063616e206f6e6c792068617070656e207768656e2074686572652069736e277420616c726561647920616e2061756374696f6e20696e2070726f677265737320616e64206d6179206f6e6c7920626529012063616c6c65642062792074686520726f6f74206f726967696e2e20416363657074732074686520606475726174696f6e60206f6620746869732061756374696f6e20616e64207468655d0120606c656173655f706572696f645f696e64657860206f662074686520696e697469616c206c6561736520706572696f64206f662074686520666f757220746861742061726520746f2062652061756374696f6e65642e0c626964140c73756238436f6d706163743c53756249643e3461756374696f6e5f696e64657854436f6d706163743c41756374696f6e496e6465783e2866697273745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e246c6173745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e18616d6f756e7454436f6d706163743c42616c616e63654f663c543e3e404d01204d616b652061206e6577206269642066726f6d20616e206163636f756e742028696e636c7564696e6720612070617261636861696e206163636f756e742920666f72206465706c6f79696e672061206e65772c2070617261636861696e2e005d01204d756c7469706c652073696d756c74616e656f757320626964732066726f6d207468652073616d65206269646465722061726520616c6c6f776564206f6e6c79206173206c6f6e6720617320616c6c2061637469766541012062696473206f7665726c61702065616368206f746865722028692e652e20617265206d757475616c6c79206578636c7573697665292e20426964732063616e6e6f742062652072656461637465642e005901202d20607375626020697320746865207375622d6269646465722049442c20616c6c6f77696e6720666f72206d756c7469706c6520636f6d706574696e67206269647320746f206265206d6164652062792028616e64742066756e64656420627929207468652073616d65206163636f756e742e5101202d206061756374696f6e5f696e646578602069732074686520696e646578206f66207468652061756374696f6e20746f20626964206f6e2e2053686f756c64206a757374206265207468652070726573656e746c2076616c7565206f66206041756374696f6e436f756e746572602e4d01202d206066697273745f736c6f746020697320746865206669727374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4501202d20606c6173745f736c6f746020697320746865206c617374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4d01202d2060616d6f756e74602069732074686520616d6f756e7420746f2062696420746f2062652068656c64206173206465706f73697420666f72207468652070617261636861696e2073686f756c6420746865cc206269642077696e2e205468697320616d6f756e742069732068656c64207468726f7567686f7574207468652072616e67652e246269645f72656e6577103461756374696f6e5f696e64657854436f6d706163743c41756374696f6e496e6465783e2866697273745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e246c6173745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e18616d6f756e7454436f6d706163743c42616c616e63654f663c543e3e3c5101204d616b652061206e6577206269642066726f6d20612070617261636861696e206163636f756e7420666f722072656e6577696e67207468617420287072652d6578697374696e67292070617261636861696e2e00a820546865206f726967696e202a6d7573742a20626520612070617261636861696e206163636f756e742e005d01204d756c7469706c652073696d756c74616e656f757320626964732066726f6d207468652073616d65206269646465722061726520616c6c6f776564206f6e6c79206173206c6f6e6720617320616c6c2061637469766541012062696473206f7665726c61702065616368206f746865722028692e652e20617265206d757475616c6c79206578636c7573697665292e20426964732063616e6e6f742062652072656461637465642e005101202d206061756374696f6e5f696e646578602069732074686520696e646578206f66207468652061756374696f6e20746f20626964206f6e2e2053686f756c64206a757374206265207468652070726573656e746c2076616c7565206f66206041756374696f6e436f756e746572602e4d01202d206066697273745f736c6f746020697320746865206669727374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4501202d20606c6173745f736c6f746020697320746865206c617374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4d01202d2060616d6f756e74602069732074686520616d6f756e7420746f2062696420746f2062652068656c64206173206465706f73697420666f72207468652070617261636861696e2073686f756c6420746865cc206269642077696e2e205468697320616d6f756e742069732068656c64207468726f7567686f7574207468652072616e67652e3c7365745f6f6666626f617264696e670410646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636514c82053657420746865206f66662d626f617264696e6720696e666f726d6174696f6e20666f7220612070617261636861696e2e00a820546865206f726967696e202a6d7573742a20626520612070617261636861696e206163636f756e742e002101202d20606465737460206973207468652064657374696e6174696f6e206163636f756e7420746f2072656365697665207468652070617261636861696e2773206465706f7369742e3c6669785f6465706c6f795f64617461100c73756238436f6d706163743c53756249643e1c706172615f69643c436f6d706163743c5061726149643e24636f64655f686173681c543a3a4861736844696e697469616c5f686561645f646174611c5665633c75383e1c2d012053657420746865206465706c6f7920696e666f726d6174696f6e20666f722061207375636365737366756c2062696420746f206465706c6f792061206e65772070617261636861696e2e00c8202d20606f726967696e60206d75737420626520746865207375636365737366756c20626964646572206163636f756e742eb0202d20607375626020697320746865207375622d626964646572204944206f6620746865206269646465722e0101202d2060706172615f696460206973207468652070617261636861696e20494420616c6c6f7474656420746f207468652077696e6e696e67206269646465722e1d01202d2060636f64655f6861736860206973207468652068617368206f66207468652070617261636861696e2773205761736d2076616c69646174696f6e2066756e6374696f6e2ef0202d2060696e697469616c5f686561645f6461746160206973207468652070617261636861696e277320696e697469616c206865616420646174612e54656c61626f726174655f6465706c6f795f64617461081c706172615f69643c436f6d706163743c5061726149643e10636f64651c5665633c75383e3074204e6f74652061206e65772070617261636861696e277320636f64652e004d012054686973206d7573742062652063616c6c656420616674657220606669785f6465706c6f795f646174616020616e642060636f646560206d7573742062652074686520707265696d616765206f6620746865c42060636f64655f68617368602070617373656420746865726520666f72207468652073616d652060706172615f6964602e0061012054686973206d61792062652063616c6c6564206265666f7265206f722061667465722074686520626567696e6e696e67206f66207468652070617261636861696e2773206669727374206c6561736520706572696f642e45012049662063616c6c6564206265666f7265207468656e207468652070617261636861696e2077696c6c206265636f6d65206163746976652061742074686520666972737420626c6f636b206f66206974736501207374617274696e67206c6561736520706572696f642e2049662061667465722c207468656e2069742077696c6c206265636f6d652061637469766520696d6d6564696174656c7920616674657220746869732063616c6c2e006c202d20605f6f726967696e6020697320697272656c6576616e742efc202d2060706172615f696460206973207468652070617261636861696e2049442077686f736520636f64652077696c6c20626520656c61626f72617465642e1501202d2060636f6465602069732074686520707265696d616765206f662074686520726567697374657265642060636f64655f6861736860206f662060706172615f6964602e011c384e65774c65617365506572696f64042c4c65617365506572696f6404842041206e6577206c6561736520706572696f6420697320626567696e6e696e672e3841756374696f6e537461727465640c3041756374696f6e496e6465782c4c65617365506572696f642c426c6f636b4e756d626572084d0120416e2061756374696f6e20737461727465642e2050726f76696465732069747320696e64657820616e642074686520626c6f636b206e756d6265722077686572652069742077696c6c20626567696e20746f190120636c6f736520616e6420746865206669727374206c6561736520706572696f64206f662074686520717561647275706c657420746861742069732061756374696f6e65642e3441756374696f6e436c6f736564043041756374696f6e496e64657804bc20416e2061756374696f6e20656e6465642e20416c6c2066756e6473206265636f6d6520756e72657365727665642e24576f6e4465706c6f7910504e65774269646465723c4163636f756e7449643e24536c6f7452616e6765185061726149641c42616c616e636504550120536f6d656f6e6520776f6e2074686520726967687420746f206465706c6f7920612070617261636861696e2e2042616c616e636520616d6f756e7420697320646564756374656420666f72206465706f7369742e28576f6e52656e6577616c101850617261496424536c6f7452616e67651c42616c616e63651c42616c616e636508c420416e206578697374696e672070617261636861696e20776f6e2074686520726967687420746f20636f6e74696e75652e41012046697273742062616c616e63652069732074686520657874726120616d6f756e7420726573657665642e205365636f6e642069732074686520746f74616c20616d6f756e742072657365727665642e2052657365727665640c244163636f756e7449641c42616c616e63651c42616c616e6365084d012046756e6473207765726520726573657276656420666f7220612077696e6e696e67206269642e2046697273742062616c616e63652069732074686520657874726120616d6f756e742072657365727665642e54205365636f6e642069732074686520746f74616c2e28556e726573657276656408244163636f756e7449641c42616c616e636504e02046756e6473207765726520756e72657365727665642073696e636520626964646572206973206e6f206c6f6e676572206163746976652e0000245265676973747261720124526567697374726172242850617261636861696e7301002c5665633c5061726149643e0400002c546872656164436f756e7401000c753332100000000004b420546865206e756d626572206f66207468726561647320746f207363686564756c652070657220626c6f636b2e3c53656c6563746564546872656164730100785665633c5665633c285061726149642c20436f6c6c61746f724964293e3e040008510120416e206172726179206f6620746865207175657565206f6620736574206f662074687265616473207363686564756c656420666f722074686520636f6d696e6720626c6f636b733b206f726465726564206279310120617363656e64696e6720706172612049442e2054686572652063616e206265206e6f206475706c696361746573206f66207061726120494420696e2065616368206c697374206974656d2e184163746976650100b85665633c285061726149642c204f7074696f6e3c28436f6c6c61746f7249642c20526574726961626c65293e293e0400185d012050617261746872656164732f636861696e73207363686564756c656420666f7220657865637574696f6e207468697320626c6f636b2e2049662074686520636f6c6c61746f72204944206973207365742c207468656e6101206120706172746963756c617220636f6c6c61746f722068617320616c7265616479206265656e2063686f73656e20666f7220746865206e65787420626c6f636b2c20616e64206e6f206f7468657220636f6c6c61746f725901206d61792070726f766964652074686520626c6f636b2e20496e2074686973206361736520776520616c6c6f772074686520706f73736962696c697479206f662074686520636f6d62696e6174696f6e206265696e67d0207265747269656420696e2061206c6174657220626c6f636b2c206578707265737365642062792060526574726961626c65602e004c204f726465726564206279205061726149642e284e65787446726565496401001850617261496410e8030000083d0120546865206e65787420756e75736564205061726149642076616c75652e2053746172742074686973206869676820696e206f7264657220746f206b656570206c6f77206e756d6265727320666f72542073797374656d2d6c6576656c20636861696e732e2c50656e64696e6753776170000101185061726149641850617261496400040004642050656e64696e672073776170206f7065726174696f6e732e145061726173000101185061726149642050617261496e666f00040004a8204d6170206f6620616c6c20726567697374657265642070617261746872656164732f636861696e732e28526574727951756575650100785665633c5665633c285061726149642c20436f6c6c61746f724964293e3e040004e8205468652063757272656e7420717565756520666f7220706172617468726561647320746861742073686f756c6420626520726574726965642e1c446562746f72730101011850617261496430543a3a4163636f756e7449640080000000000000000000000000000000000000000000000000000000000000000004ac2055736572732077686f20686176652070616964206120706172617468726561642773206465706f736974011c3472656769737465725f70617261100869643c436f6d706163743c5061726149643e10696e666f2050617261496e666f10636f64651c5665633c75383e44696e697469616c5f686561645f646174611c5665633c75383e089820526567697374657220612070617261636861696e207769746820676976656e20636f64652e8c204661696c7320696620676976656e20494420697320616c726561647920757365642e3c646572656769737465725f70617261040869643c436f6d706163743c5061726149643e0494204465726567697374657220612070617261636861696e207769746820676976656e206964407365745f7468726561645f636f756e740414636f756e740c75333214410120526573657420746865206e756d626572206f6620706172617468726561647320746861742063616e2070617920746f206265207363686564756c656420696e20612073696e676c6520626c6f636b2e0098202d2060636f756e74603a20546865206e756d626572206f662070617261746872656164732e0084204d7573742062652063616c6c65642066726f6d20526f6f74206f726967696e2e4c72656769737465725f706172617468726561640810636f64651c5665633c75383e44696e697469616c5f686561645f646174611c5665633c75383e10a42052656769737465722061207061726174687265616420666f7220696d6d656469617465207573652e004d01204d7573742062652073656e742066726f6d2061205369676e6564206f726967696e20746861742069732061626c6520746f206861766520506172617468726561644465706f7369742072657365727665642e39012060636f64656020616e642060696e697469616c5f686561645f646174616020617265207573656420746f20696e697469616c697a6520746865207061726174687265616427732073746174652e4473656c6563745f706172617468726561640c0c5f69643c436f6d706163743c5061726149643e245f636f6c6c61746f7228436f6c6c61746f724964285f686561645f686173681c543a3a4861736814050120506c61636520612062696420666f722061207061726174687265616420746f2062652070726f6772657373656420696e20746865206e65787420626c6f636b2e00410120546869732069732061206b696e64206f66207370656369616c207472616e73616374696f6e20746861742073686f756c642062652068656176696c79207072696f726974697a656420696e207468655d01207472616e73616374696f6e20706f6f6c206163636f7264696e6720746f20746865206076616c7565603b206f6e6c792060546872656164436f756e7460206f66207468656d206d61792062652070726573656e7465645420696e20616e792073696e676c6520626c6f636b2e54646572656769737465725f70617261746872656164001cc820446572656769737465722061207061726174687265616420616e6420726574726965766520746865206465706f7369742e002101204d7573742062652073656e742066726f6d2061206050617261636861696e60206f726967696e2077686963682069732063757272656e746c79206120706172617468726561642e00590120456e737572652074686174206265666f72652063616c6c696e672074686973207468617420616e792066756e647320796f752077616e7420656d70746965642066726f6d20746865207061726174687265616427734501206163636f756e74206973206d6f766564206f75743b20616674657220746869732069742077696c6c20626520696d706f737369626c6520746f207265747269657665207468656d2028776974686f75746820676f7665726e616e636520696e74657276656e74696f6e292e107377617004146f746865723c436f6d706163743c5061726149643e206501205377617020612070617261636861696e207769746820616e6f746865722070617261636861696e206f7220706172617468726561642e20546865206f726967696e206d7573742062652061206050617261636861696e602e65012054686520737761702077696c6c2068617070656e206f6e6c7920696620746865726520697320616c726561647920616e206f70706f7369746520737761702070656e64696e672e204966207468657265206973206e6f742c5d012074686520737761702077696c6c2062652073746f72656420696e207468652070656e64696e67207377617073206d61702c20726561647920666f722061206c6174657220636f6e6669726d61746f727920737761702e00610120546865206050617261496460732072656d61696e206d617070656420746f207468652073616d652068656164206461746120616e6420636f646520736f2065787465726e616c20636f64652063616e2072656c79206f6e410120605061726149646020746f2062652061206c6f6e672d7465726d206964656e746966696572206f662061206e6f74696f6e616c202270617261636861696e222e20486f77657665722c2074686569725901207363686564756c696e6720696e666f2028692e652e2077686574686572207468657927726520612070617261746872656164206f722070617261636861696e292c2061756374696f6e20696e666f726d6174696f6e9820616e64207468652061756374696f6e206465706f736974206172652073776974636865642e0108505061726174687265616452656769737465726564041850617261496404d4204120706172617468726561642077617320726567697374657265643b20697473206e657720494420697320737570706c6965642e5850617261746872656164446572656769737465726564041850617261496404d4205468652070617261746872656164206f662074686520737570706c696564204944207761732064652d726567697374657265642e00001c5574696c697479011c5574696c69747904244d756c74697369677300020530543a3a4163636f756e744964205b75383b2033325dd04d756c74697369673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e02040004942054686520736574206f66206f70656e206d756c7469736967206f7065726174696f6e732e0114146261746368041463616c6c735c5665633c3c542061732054726169743e3a3a43616c6c3e48802053656e642061206261746368206f662064697370617463682063616c6c732e00ec20546869732077696c6c206578656375746520756e74696c20746865206669727374206f6e65206661696c7320616e64207468656e2073746f702e007c204d61792062652063616c6c65642066726f6d20616e79206f726967696e2e00f0202d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e002c2023203c7765696768743ea4202d205468652073756d206f66207468652077656967687473206f6620746865206063616c6c73602e34202d204f6e65206576656e742e302023203c2f7765696768743e00590120546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e3501206576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e20746865590120604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d616465510120616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c657465646050206576656e74206973206465706f73697465642e1861735f7375620814696e6465780c7531361063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e1ce02053656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e70202d2054686520776569676874206f6620746865206063616c6c602e302023203c2f7765696768743e2061735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e1063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3ea4590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e00b42049662074686572652061726520656e6f7567682c207468656e206469737061746368207468652063616c6c2e005101205061796d656e743a20604d756c74697369674465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573610120607468726573686f6c64602074696d657320604d756c74697369674465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2e8c202d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e002101204e4f54453a20556e6c6573732074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2067656e6572616c6c792077616e7420746f207573651d012060617070726f76655f61735f6d756c74696020696e73746561642c2073696e6365206974206f6e6c7920726571756972657320612068617368206f66207468652063616c6c2e005d0120526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c7420696620607468726573686f6c64602069732065786163746c79206031602e204f74686572776973655901206f6e20737563636573732c20726573756c7420697320604f6b6020616e642074686520726573756c742066726f6d2074686520696e746572696f722063616c6c2c206966206974207761732065786563757465642ce0206d617920626520666f756e6420696e20746865206465706f736974656420604d756c7469736967457865637574656460206576656e742e002c2023203c7765696768743e54202d20604f2853202b205a202b2043616c6c29602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2e2501202d204f6e652063616c6c20656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285a296020776865726520605a602069732074782d6c656e2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e70202d2054686520776569676874206f6620746865206063616c6c602e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66f4202020604d756c74697369674465706f73697442617365202b207468726573686f6c64202a204d756c74697369674465706f736974466163746f72602e302023203c2f7765696768743e40617070726f76655f61735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e2463616c6c5f68617368205b75383b2033325d80590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e005101205061796d656e743a20604d756c74697369674465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573610120607468726573686f6c64602074696d657320604d756c74697369674465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e003901204e4f54453a2049662074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2077616e7420746f20757365206061735f6d756c74696020696e73746561642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66f4202020604d756c74697369674465706f73697442617365202b207468726573686f6c64202a204d756c74697369674465706f736974466163746f72602e302023203c2f7765696768743e3c63616e63656c5f61735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e2474696d65706f696e746454696d65706f696e743c543a3a426c6f636b4e756d6265723e2463616c6c5f68617368205b75383b2033325d5859012043616e63656c2061207072652d6578697374696e672c206f6e2d676f696e67206d756c7469736967207472616e73616374696f6e2e20416e79206465706f7369742072657365727665642070726576696f75736c79c820666f722074686973206f7065726174696f6e2077696c6c20626520756e7265736572766564206f6e20737563636573732e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e6101202d206074696d65706f696e74603a205468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c7c207472616e73616374696f6e20666f7220746869732064697370617463682ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602e34202d204f6e65206576656e742e88202d20492f4f3a2031207265616420604f285329602c206f6e652072656d6f76652e74202d2053746f726167653a2072656d6f766573206f6e65206974656d2e302023203c2f7765696768743e0118404261746368496e746572727570746564080c7533323444697370617463684572726f72085901204261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c2061734c2077656c6c20617320746865206572726f722e384261746368436f6d706c657465640004cc204261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e2c4e65774d756c746973696708244163636f756e744964244163636f756e7449640849012041206e6577206d756c7469736967206f7065726174696f6e2068617320626567756e2e20466972737420706172616d20697320746865206163636f756e74207468617420697320617070726f76696e672c80207365636f6e6420697320746865206d756c7469736967206163636f756e742e404d756c7469736967417070726f76616c0c244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449640859012041206d756c7469736967206f7065726174696f6e20686173206265656e20617070726f76656420627920736f6d656f6e652e20466972737420706172616d20697320746865206163636f756e742074686174206973a820617070726f76696e672c20746869726420697320746865206d756c7469736967206163636f756e742e404d756c7469736967457865637574656410244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e744964384469737061746368526573756c74082d012041206d756c7469736967206f7065726174696f6e20686173206265656e2065786563757465642e20466972737420706172616d20697320746865206163636f756e742074686174206973a820617070726f76696e672c20746869726420697320746865206d756c7469736967206163636f756e742e444d756c746973696743616e63656c6c65640c244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449640831012041206d756c7469736967206f7065726174696f6e20686173206265656e2063616e63656c6c65642e20466972737420706172616d20697320746865206163636f756e742074686174206973ac2063616e63656c6c696e672c20746869726420697320746865206d756c7469736967206163636f756e742e0000204964656e7469747901105375646f10284964656e746974794f6600010130543a3a4163636f756e74496468526567697374726174696f6e3c42616c616e63654f663c543e3e00040004210120496e666f726d6174696f6e20746861742069732070657274696e656e7420746f206964656e746966792074686520656e7469747920626568696e6420616e206163636f756e742e1c53757065724f6600010130543a3a4163636f756e7449645028543a3a4163636f756e7449642c204461746129000400086101205468652073757065722d6964656e74697479206f6620616e20616c7465726e6174697665202273756222206964656e7469747920746f676574686572207769746820697473206e616d652c2077697468696e2074686174510120636f6e746578742e20496620746865206163636f756e74206973206e6f7420736f6d65206f74686572206163636f756e742773207375622d6964656e746974792c207468656e206a75737420604e6f6e65602e18537562734f6601010130543a3a4163636f756e744964842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29004400000000000000000000000000000000000cb820416c7465726e6174697665202273756222206964656e746974696573206f662074686973206163636f756e742e001d0120546865206669727374206974656d20697320746865206465706f7369742c20746865207365636f6e64206973206120766563746f72206f6620746865206163636f756e74732e28526567697374726172730100d85665633c4f7074696f6e3c526567697374726172496e666f3c42616c616e63654f663c543e2c20543a3a4163636f756e7449643e3e3e0400104d012054686520736574206f6620726567697374726172732e204e6f7420657870656374656420746f206765742076657279206269672061732063616e206f6e6c79206265206164646564207468726f7567682061a8207370656369616c206f726967696e20286c696b656c79206120636f756e63696c206d6f74696f6e292e0029012054686520696e64657820696e746f20746869732063616e206265206361737420746f2060526567697374726172496e6465786020746f2067657420612076616c69642076616c75652e012c346164645f726567697374726172041c6163636f756e7430543a3a4163636f756e744964347c2041646420612072656769737472617220746f207468652073797374656d2e001d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605265676973747261724f726967696e60206f722060526f6f74602e00ac202d20606163636f756e74603a20746865206163636f756e74206f6620746865207265676973747261722e009820456d6974732060526567697374726172416464656460206966207375636365737366756c2e002c2023203c7765696768743ee4202d20604f2852296020776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e646564292e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e307365745f6964656e746974790410696e666f304964656e74697479496e666f482d012053657420616e206163636f756e742773206964656e7469747920696e666f726d6174696f6e20616e6420726573657276652074686520617070726f707269617465206465706f7369742e00590120496620746865206163636f756e7420616c726561647920686173206964656e7469747920696e666f726d6174696f6e2c20746865206465706f7369742069732074616b656e2061732070617274207061796d656e745420666f7220746865206e6577206465706f7369742e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e0090202d2060696e666f603a20546865206964656e7469747920696e666f726d6174696f6e2e008c20456d69747320604964656e7469747953657460206966207375636365737366756c2e002c2023203c7765696768743e0501202d20604f2858202b2052296020776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e646564292e88202d204174206d6f73742074776f2062616c616e6365206f7065726174696f6e732eac202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f2858202b20522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e207365745f73756273041073756273645665633c28543a3a4163636f756e7449642c2044617461293e40902053657420746865207375622d6163636f756e7473206f66207468652073656e6465722e005901205061796d656e743a20416e79206167677265676174652062616c616e63652072657365727665642062792070726576696f757320607365745f73756273602063616c6c732077696c6c2062652072657475726e6564310120616e6420616e20616d6f756e7420605375624163636f756e744465706f736974602077696c6c20626520726573657276656420666f722065616368206974656d20696e206073756273602e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e009c202d206073756273603a20546865206964656e746974792773207375622d6163636f756e74732e002c2023203c7765696768743eec202d20604f285329602077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e88202d204174206d6f73742074776f2062616c616e6365206f7065726174696f6e732e4101202d204174206d6f7374204f2832202a2053202b2031292073746f72616765206d75746174696f6e733b20636f64656320636f6d706c657869747920604f2831202a2053202b2053202a20312960293b582020206f6e652073746f726167652d6578697374732e302023203c2f7765696768743e38636c6561725f6964656e74697479003c390120436c65617220616e206163636f756e742773206964656e7469747920696e666f20616e6420616c6c207375622d6163636f756e7420616e642072657475726e20616c6c206465706f736974732e00f0205061796d656e743a20416c6c2072657365727665642062616c616e636573206f6e20746865206163636f756e74206172652072657475726e65642e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e009c20456d69747320604964656e74697479436c656172656460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2852202b2053202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e74202d206053202b2032602073746f726167652064656c6574696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e44726571756573745f6a756467656d656e7408247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e1c6d61785f66656554436f6d706163743c42616c616e63654f663c543e3e5c9820526571756573742061206a756467656d656e742066726f6d2061207265676973747261722e005901205061796d656e743a204174206d6f737420606d61785f666565602077696c6c20626520726573657276656420666f72207061796d656e7420746f2074686520726567697374726172206966206a756467656d656e741c20676976656e2e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e002101202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973207265717565737465642e5901202d20606d61785f666565603a20546865206d6178696d756d206665652074686174206d617920626520706169642e20546869732073686f756c64206a757374206265206175746f2d706f70756c617465642061733a0034206060606e6f636f6d70696c65a42053656c663a3a72656769737472617273287265675f696e646578292e75776e72617028292e666565102060606000a820456d69747320604a756467656d656e7452657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2858202b205229602e34202d204f6e65206576656e742e302023203c2f7765696768743e3863616e63656c5f7265717565737404247265675f696e64657838526567697374726172496e646578446c2043616e63656c20612070726576696f757320726571756573742e00fc205061796d656e743a20412070726576696f75736c79207265736572766564206465706f7369742069732072657475726e6564206f6e20737563636573732e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e004901202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206e6f206c6f6e676572207265717565737465642e00b020456d69747320604a756467656d656e74556e72657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e8c202d204f6e652073746f72616765206d75746174696f6e20604f2852202b205829602e34202d204f6e65206576656e742e302023203c2f7765696768743e1c7365745f6665650814696e6465785c436f6d706163743c526567697374726172496e6465783e0c66656554436f6d706163743c42616c616e63654f663c543e3e301d0120536574207468652066656520726571756972656420666f722061206a756467656d656e7420746f206265207265717565737465642066726f6d2061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e58202d2060666565603a20746865206e6577206665652e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602e302023203c2f7765696768743e387365745f6163636f756e745f69640814696e6465785c436f6d706163743c526567697374726172496e6465783e0c6e657730543a3a4163636f756e74496430c0204368616e676520746865206163636f756e74206173736f63696174656420776974682061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e74202d20606e6577603a20746865206e6577206163636f756e742049442e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602e302023203c2f7765696768743e287365745f6669656c64730814696e6465785c436f6d706163743c526567697374726172496e6465783e186669656c6473384964656e746974794669656c647330ac2053657420746865206669656c6420696e666f726d6174696f6e20666f722061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e1101202d20606669656c6473603a20746865206669656c64732074686174207468652072656769737472617220636f6e6365726e73207468656d73656c76657320776974682e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602e302023203c2f7765696768743e4470726f766964655f6a756467656d656e740c247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365246a756467656d656e745c4a756467656d656e743c42616c616e63654f663c543e3e4cbc2050726f766964652061206a756467656d656e7420666f7220616e206163636f756e742773206964656e746974792e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74b4206f6620746865207265676973747261722077686f736520696e64657820697320607265675f696e646578602e002501202d20607265675f696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206265696e67206d6164652e5901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e4d01202d20606a756467656d656e74603a20746865206a756467656d656e74206f662074686520726567697374726172206f6620696e64657820607265675f696e646578602061626f75742060746172676574602e009820456d69747320604a756467656d656e74476976656e60206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e88202d204f6e652062616c616e63652d7472616e73666572206f7065726174696f6e2e98202d20557020746f206f6e65206163636f756e742d6c6f6f6b7570206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2852202b205829602e34202d204f6e65206576656e742e302023203c2f7765696768743e346b696c6c5f6964656e7469747904187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654c45012052656d6f766520616e206163636f756e742773206964656e7469747920616e64207375622d6163636f756e7420696e666f726d6174696f6e20616e6420736c61736820746865206465706f736974732e006501205061796d656e743a2052657365727665642062616c616e6365732066726f6d20607365745f737562736020616e6420607365745f6964656e74697479602061726520736c617368656420616e642068616e646c656420627949012060536c617368602e20566572696669636174696f6e2072657175657374206465706f7369747320617265206e6f742072657475726e65643b20746865792073686f756c642062652063616e63656c6c656484206d616e75616c6c79207573696e67206063616e63656c5f72657175657374602e00310120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f206f72206d617463682060543a3a466f7263654f726967696e602e005901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e009820456d69747320604964656e746974794b696c6c656460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2852202b2053202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e74202d206053202b2032602073746f72616765206d75746174696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e011c2c4964656e7469747953657404244163636f756e74496404f02041206e616d652077617320736574206f72207265736574202877686963682077696c6c2072656d6f766520616c6c206a756467656d656e7473292e3c4964656e74697479436c656172656408244163636f756e7449641c42616c616e636504d02041206e616d652077617320636c65617265642c20616e642074686520676976656e2062616c616e63652072657475726e65642e384964656e746974794b696c6c656408244163636f756e7449641c42616c616e636504c82041206e616d65207761732072656d6f76656420616e642074686520676976656e2062616c616e636520736c61736865642e484a756467656d656e7452657175657374656408244163636f756e74496438526567697374726172496e64657804a02041206a756467656d656e74207761732061736b65642066726f6d2061207265676973747261722e504a756467656d656e74556e72657175657374656408244163636f756e74496438526567697374726172496e646578048c2041206a756467656d656e74207265717565737420776173207265747261637465642e384a756467656d656e74476976656e08244163636f756e74496438526567697374726172496e64657804982041206a756467656d656e742077617320676976656e2062792061207265676973747261722e3852656769737472617241646465640438526567697374726172496e646578045c204120726567697374726172207761732061646465642e002c48546f6f4d616e795375624163636f756e7473046020546f6f206d616e7920737562732d6163636f756e74732e204e6f74466f756e640454204163636f756e742069736e277420666f756e642e204e6f744e616d65640454204163636f756e742069736e2774206e616d65642e28456d707479496e646578043420456d70747920696e6465782e284665654368616e676564044020466565206973206368616e6765642e284e6f4964656e74697479044c204e6f206964656e7469747920666f756e642e3c537469636b794a756467656d656e74044820537469636b79206a756467656d656e742e384a756467656d656e74476976656e0444204a756467656d656e7420676976656e2e40496e76616c69644a756467656d656e74044c20496e76616c6964206a756467656d656e742e30496e76616c6964496e64657804582054686520696e64657820697320696e76616c69642e34496e76616c6964546172676574045c205468652074617267657420697320696e76616c69642e" +metadata_1045_hex = "0x6d6574610a701853797374656d011853797374656d34304163636f756e744e6f6e636501010130543a3a4163636f756e74496420543a3a496e646578001000000000047c2045787472696e73696373206e6f6e636520666f72206163636f756e74732e3845787472696e736963436f756e7400000c753332040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e4c416c6c45787472696e73696373576569676874000018576569676874040004150120546f74616c2077656967687420666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e40416c6c45787472696e736963734c656e00000c753332040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b4861736801010138543a3a426c6f636b4e756d6265721c543a3a48617368008000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101010c7533321c5665633c75383e000400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d626572010038543a3a426c6f636b4e756d6265721000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e3845787472696e73696373526f6f7401001c543a3a486173688000000000000000000000000000000000000000000000000000000000000000000415012045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e1844696765737401002c4469676573744f663c543e040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301008c5665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e040004a0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e284576656e74436f756e740100284576656e74496e646578100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f706963730101011c543a3a48617368845665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e000400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e011c2866696c6c5f626c6f636b0004210120412062696720646973706174636820746861742077696c6c20646973616c6c6f7720616e79206f74686572207472616e73616374696f6e20746f20626520696e636c756465642e1872656d61726b041c5f72656d61726b1c5665633c75383e046c204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e387365745f686561705f7061676573041470616765730c75363404fc2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040c6e65771c5665633c75383e04482053657420746865206e657720636f64652e2c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e046c2053657420736f6d65206974656d73206f662073746f726167652e306b696c6c5f73746f7261676504106b657973205665633c4b65793e0478204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e2c6b696c6c5f70726566697804187072656669780c4b6579041501204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e01084045787472696e7369635375636365737304304469737061746368496e666f049420416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c6564083444697370617463684572726f72304469737061746368496e666f045420416e2065787472696e736963206661696c65642e00006052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100305665633c543a3a486173683e04000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e000000001042616265011042616265242845706f6368496e64657801000c75363420000000000000000004542043757272656e742065706f636820696e6465782e2c417574686f72697469657301009c5665633c28417574686f7269747949642c2042616265417574686f72697479576569676874293e0400046c2043757272656e742065706f636820617574686f7269746965732e2c47656e65736973536c6f7401000c75363420000000000000000008f82054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e205468697320697320309020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2c43757272656e74536c6f7401000c75363420000000000000000004542043757272656e7420736c6f74206e756d6265722e2852616e646f6d6e6573730100205b75383b2033325d80000000000000000000000000000000000000000000000000000000000000000028b8205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e002c20232053656375726974790005012054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061f8206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e7915012063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d6265727320746861742074686973150120286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e206265050120757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e0d01206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e384e65787452616e646f6d6e6573730100205b75383b2033325d800000000000000000000000000000000000000000000000000000000000000000045c204e6578742065706f63682072616e646f6d6e6573732e305365676d656e74496e64657801000c7533321000000000247c2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e00f4205765206d616b6520612074726164656f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e01012057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f942060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e00ec204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e090120576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572791c2065706f63682e44556e646572436f6e737472756374696f6e0101010c753332345665633c5b75383b2033325d3e000400002c496e697469616c697a65640000204d6179626556726604000801012054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d65601d01206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e010000083445706f63684475726174696f6e0c753634205802000000000000080d0120546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746ffc2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e444578706563746564426c6f636b54696d6524543a3a4d6f6d656e7420701700000000000014050120546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e67110120626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f75740501207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f740901206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473a0207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e002454696d657374616d70012454696d657374616d70080c4e6f77010024543a3a4d6f6d656e7420000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e24446964557064617465010010626f6f6c040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01040c736574040c6e6f7748436f6d706163743c543a3a4d6f6d656e743e245820536574207468652063757272656e742074696d652e00590120546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed82070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e004501205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e74207370656369666965642062794420604d696e696d756d506572696f64602e00d820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e0004344d696e696d756d506572696f6424543a3a4d6f6d656e7420b80b00000000000010690120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f64690120746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c79650120776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c6520746869737020706572696f64206f6e2064656661756c742073657474696e67732e001c496e6469636573011c496e6469636573082c4e657874456e756d53657401003c543a3a4163636f756e74496e6465781000000000047c20546865206e657874206672656520656e756d65726174696f6e207365742e1c456e756d5365740101013c543a3a4163636f756e74496e646578445665633c543a3a4163636f756e7449643e00040004582054686520656e756d65726174696f6e20736574732e010001043c4e65774163636f756e74496e64657808244163636f756e744964304163636f756e74496e64657810882041206e6577206163636f756e7420696e646578207761732061737369676e65642e0005012054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e65646020746f20616e6f7468657220604163636f756e744964602e00002042616c616e636573012042616c616e6365731434546f74616c49737375616e6365010028543a3a42616c616e6365400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e1c56657374696e6700010130543a3a4163636f756e744964ac56657374696e675363686564756c653c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e00040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e2c4672656542616c616e636501010130543a3a4163636f756e74496428543a3a42616c616e63650040000000000000000000000000000000002c9c20546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e004101205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e204974750120616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e207468697355012062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069733d012064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b450120697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f636961746564207769746854207468652064656c65746564206163636f756e742e00750120606672616d655f73797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473150120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e3c526573657276656442616c616e636501010130543a3a4163636f756e74496428543a3a42616c616e63650040000000000000000000000000000000002c75012054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c206765749c20736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e006d0120546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e732501207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e007501205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e7427b42069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e00650120606672616d655f73797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473190120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e29144c6f636b7301010130543a3a4163636f756e744964b05665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e00040004b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e0110207472616e736665720810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e64d8205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e00090120607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e21012049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e1501204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b4206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e00190120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e002c2023203c7765696768743e3101202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72cc202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e6901202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e004c2052656c617465642066756e6374696f6e733a0051012020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2d012020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365d420202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642edc2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765725901202020202060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e6365646020616e642060543a3a4f6e4672656542616c616e63655a65726f3a3a6f6e5f667265655f62616c616e63655f7a65726f602e49012020202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616cf82020202020636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e00302023203c2f7765696768743e2c7365745f62616c616e63650c0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365206e65775f667265654c436f6d706163743c543a3a42616c616e63653e306e65775f72657365727665644c436f6d706163743c543a3a42616c616e63653e349420536574207468652062616c616e636573206f66206120676976656e206163636f756e742e00210120546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c090120616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e190120496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c01012069742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e00b420546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e002c2023203c7765696768743e80202d20496e646570656e64656e74206f662074686520617267756d656e74732ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e302023203c2f7765696768743e38666f7263655f7472616e736665720c18736f757263658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636510646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e0851012045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d61792062652c207370656369666965642e4c7472616e736665725f6b6565705f616c6976650810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e1851012053616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c2074686540206f726967696e206163636f756e742e00bc20393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e00c4205b607472616e73666572605d3a207374727563742e4d6f64756c652e68746d6c236d6574686f642e7472616e736665720114284e65774163636f756e7408244163636f756e7449641c42616c616e6365046c2041206e6577206163636f756e742077617320637265617465642e345265617065644163636f756e7408244163636f756e7449641c42616c616e6365045c20416e206163636f756e7420776173207265617065642e205472616e7366657210244163636f756e744964244163636f756e7449641c42616c616e63651c42616c616e636504b0205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e2842616c616e63655365740c244163636f756e7449641c42616c616e63651c42616c616e636504c420412062616c616e6365207761732073657420627920726f6f74202877686f2c20667265652c207265736572766564292e1c4465706f73697408244163636f756e7449641c42616c616e636504dc20536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e0c484578697374656e7469616c4465706f73697428543a3a42616c616e63654000e40b5402000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2c5472616e7366657246656528543a3a42616c616e63654000e40b540200000000000000000000000494205468652066656520726571756972656420746f206d616b652061207472616e736665722e2c4372656174696f6e46656528543a3a42616c616e63654000e40b54020000000000000000000000049c205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e203856657374696e6742616c616e6365049c2056657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c7565544c69717569646974795265737472696374696f6e7304c8204163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c204f766572666c6f77047420476f7420616e206f766572666c6f7720616674657220616464696e674c496e73756666696369656e7442616c616e636504782042616c616e636520746f6f206c6f7720746f2073656e642076616c7565484578697374656e7469616c4465706f73697404ec2056616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f736974244b656570416c6976650490205472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e745c4578697374696e6756657374696e675363686564756c6504cc20412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742c446561644163636f756e74048c2042656e6566696369617279206163636f756e74206d757374207072652d6578697374485472616e73616374696f6e5061796d656e74012042616c616e63657304444e6578744665654d756c7469706c6965720100284d756c7469706c69657220000000000000000000000008485472616e73616374696f6e426173654665653042616c616e63654f663c543e4000e40b5402000000000000000000000004dc205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e485472616e73616374696f6e427974654665653042616c616e63654f663c543e4000e1f505000000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e0028417574686f72736869700128417574686f72736869700c18556e636c65730100e85665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e0400041c20556e636c657318417574686f72000030543a3a4163636f756e7449640400046420417574686f72206f662063757272656e7420626c6f636b2e30446964536574556e636c6573010010626f6f6c040004bc205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e0104287365745f756e636c657304286e65775f756e636c6573385665633c543a3a4865616465723e04642050726f76696465206120736574206f6620756e636c65732e00001c48496e76616c6964556e636c65506172656e74048c2054686520756e636c6520706172656e74206e6f7420696e2074686520636861696e2e40556e636c6573416c7265616479536574048420556e636c657320616c72656164792073657420696e2074686520626c6f636b2e34546f6f4d616e79556e636c6573044420546f6f206d616e7920756e636c65732e3047656e65736973556e636c6504582054686520756e636c652069732067656e657369732e30546f6f48696768556e636c6504802054686520756e636c6520697320746f6f206869676820696e20636861696e2e50556e636c65416c7265616479496e636c75646564047c2054686520756e636c6520697320616c726561647920696e636c756465642e204f6c64556e636c6504b82054686520756e636c652069736e277420726563656e7420656e6f75676820746f20626520696e636c756465642e1c5374616b696e67011c5374616b696e67683856616c696461746f72436f756e7401000c753332100000000004a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e7401000c7533321004000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e34496e76756c6e657261626c65730100445665633c543a3a4163636f756e7449643e04000c590120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e636520746865792772654d01206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f7572ac20696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e64656400010130543a3a4163636f756e74496430543a3a4163636f756e744964000400040101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e184c656467657200010130543a3a4163636f756e744964a45374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e14506179656501010130543a3a4163636f756e7449644452657761726444657374696e6174696f6e00040004e42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e2856616c696461746f727301010130543a3a4163636f756e7449643856616c696461746f72507265667301040004450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e284e6f6d696e61746f727300010130543a3a4163636f756e744964644e6f6d696e6174696f6e733c543a3a4163636f756e7449643e01040010650120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e003501204e4f54453a206973207072697661746520736f20746861742077652063616e20656e73757265207570677261646564206265666f726520616c6c207479706963616c2061636365737365732ed8204469726563742073746f7261676520415049732063616e207374696c6c2062797061737320746869732070726f74656374696f6e2e1c5374616b65727301010130543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000c000000104d01204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e277420697465726174651901207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e207468652053657373696f6e206d6f64756c652e00902054686973206973206b6579656420627920746865207374617368206163636f756e742e3843757272656e74456c65637465640100445665633c543a3a4163636f756e7449643e040004fc205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e2843757272656e74457261010020457261496e6465781000000000045c205468652063757272656e742065726120696e6465782e3c43757272656e74457261537461727401002c4d6f6d656e744f663c543e200000000000000000047820546865207374617274206f66207468652063757272656e74206572612e6c43757272656e74457261537461727453657373696f6e496e64657801003053657373696f6e496e646578100000000004d0205468652073657373696f6e20696e646578206174207768696368207468652063757272656e742065726120737461727465642e5843757272656e74457261506f696e74734561726e6564010024457261506f696e7473140000000000040d01205265776172647320666f72207468652063757272656e74206572612e205573696e6720696e6469636573206f662063757272656e7420656c6563746564207365742e24536c6f745374616b6501003042616c616e63654f663c543e40000000000000000000000000000000000c31012054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e00c02054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e20466f72636545726101001c466f7263696e670400041d01205472756520696620746865206e6578742073657373696f6e206368616e67652077696c6c2062652061206e657720657261207265676172646c657373206f6620696e6465782e4c536c6173685265776172644672616374696f6e01001c50657262696c6c10000000000cf8205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e00e4205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e4c43616e63656c6564536c6173685061796f757401003042616c616e63654f663c543e40000000000000000000000000000000000815012054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e7420776869636820776173ec2063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e40556e6170706c696564536c617368657301010120457261496e646578bc5665633c556e6170706c696564536c6173683c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3e00040004c420416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e28426f6e646564457261730100745665633c28457261496e6465782c2053657373696f6e496e646578293e04000425012041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e4c56616c696461746f72536c617368496e45726100020120457261496e64657830543a3a4163636f756e7449645c2850657262696c6c2c2042616c616e63654f663c543e2903040008450120416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e7020616e6420736c6173682076616c7565206f6620746865206572612e4c4e6f6d696e61746f72536c617368496e45726100020120457261496e64657830543a3a4163636f756e7449643042616c616e63654f663c543e03040004610120416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e34536c617368696e675370616e7300010130543a3a4163636f756e7449645c736c617368696e673a3a536c617368696e675370616e73000400048c20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e245370616e536c6173680101018c28543a3a4163636f756e7449642c20736c617368696e673a3a5370616e496e6465782988736c617368696e673a3a5370616e5265636f72643c42616c616e63654f663c543e3e00800000000000000000000000000000000000000000000000000000000000000000083d01205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2cb82061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e584561726c69657374556e6170706c696564536c617368000020457261496e646578040004fc20546865206561726c696573742065726120666f72207768696368207765206861766520612070656e64696e672c20756e6170706c69656420736c6173682e3853746f7261676556657273696f6e01000c75333210000000000490205468652076657273696f6e206f662073746f7261676520666f7220757067726164652e014410626f6e640c28636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e1470617965654452657761726444657374696e6174696f6e3c65012054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c8420626520746865206163636f756e74207468617420636f6e74726f6c732069742e003101206076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e00250120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e002c2023203c7765696768743ed4202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e20202d204f2831292e68202d20546872656520657874726120444220656e74726965732e006d01204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e656420756e6c65737325012074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e302023203c2f7765696768743e28626f6e645f657874726104386d61785f6164646974696f6e616c54436f6d706163743c42616c616e63654f663c543e3e3865012041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e63652075703420666f72207374616b696e672e00510120557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e650120556e6c696b65205b60626f6e64605d206f72205b60756e626f6e64605d20746869732066756e6374696f6e20646f6573206e6f7420696d706f736520616e79206c696d69746174696f6e206f6e2074686520616d6f756e744c20746861742063616e2062652061646465642e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e20202d204f2831292e40202d204f6e6520444220656e7472792e302023203c2f7765696768743e18756e626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e5c5501205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64010120706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e250120543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e004901204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665c0207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e003d01204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360293d012063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e656564fc20746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e00982053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e002c2023203c7765696768743e4101202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e6501202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e63656029710120202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652ea501202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c656420766961206077697468647261775f756e626f6e646564602e40202d204f6e6520444220656e7472792e28203c2f7765696768743e4477697468647261775f756e626f6e64656400402d012052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e003501205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4c2077686174657665722069742077616e74732e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e006c2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e002c2023203c7765696768743e5501202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e45012020497420696d706c6965732060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c207768696368206973f42020696e6469726563746c7920757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e7901202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e2076616c6964617465041470726566733856616c696461746f7250726566732ce8204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e206e6f6d696e617465041c74617267657473a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e2c1101204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743e2501202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f66206074617267657473602c982077686963682069732063617070656420617420604d41585f4e4f4d494e4154494f4e53602ed8202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e302023203c2f7765696768743e146368696c6c002cc8204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e54202d20436f6e7461696e73206f6e6520726561642ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e247365745f7061796565041470617965654452657761726444657374696e6174696f6e2cb8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e387365745f636f6e74726f6c6c65720428636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652c90202852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e4c7365745f76616c696461746f725f636f756e74040c6e657730436f6d706163743c7533323e04802054686520696465616c206e756d626572206f662076616c696461746f72732e34666f7263655f6e6f5f657261730014b020466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e302023203c2f7765696768743e34666f7263655f6e65775f65726100184d0120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c206265a020726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e302023203c2f7765696768743e447365745f696e76756c6e657261626c6573042876616c696461746f7273445665633c543a3a4163636f756e7449643e04cc20536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e34666f7263655f756e7374616b650414737461736830543a3a4163636f756e744964040d0120466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e50666f7263655f6e65775f6572615f616c776179730014050120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e002c2023203c7765696768743e50202d204f6e652073746f72616765207772697465302023203c2f7765696768743e5463616e63656c5f64656665727265645f736c617368080c65726120457261496e64657834736c6173685f696e6469636573205665633c7533323e1c45012043616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e2043616e2062652063616c6c6564206279206569746865722074686520726f6f74206f726967696e206f7270207468652060543a3a536c61736843616e63656c4f726967696e602e05012070617373696e67207468652065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e002c2023203c7765696768743e54202d204f6e652073746f726167652077726974652e302023203c2f7765696768743e187265626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e18e0205265626f6e64206120706f7274696f6e206f6620746865207374617368207363686564756c656420746f20626520756e6c6f636b65642e002c2023203c7765696768743ef0202d2054696d6520636f6d706c65786974793a204f2831292e20426f756e64656420627920604d41585f554e4c4f434b494e475f4348554e4b53602ef4202d2053746f72616765206368616e6765733a2043616e277420696e6372656173652073746f726167652c206f6e6c792064656372656173652069742e302023203c2f7765696768743e010c18526577617264081c42616c616e63651c42616c616e636508510120416c6c2076616c696461746f72732068617665206265656e207265776172646564206279207468652066697273742062616c616e63653b20746865207365636f6e64206973207468652072656d61696e6465728c2066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642e14536c61736808244163636f756e7449641c42616c616e6365042501204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e684f6c64536c617368696e675265706f7274446973636172646564043053657373696f6e496e646578081d0120416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c6448206e6f742062652070726f6365737365642e083853657373696f6e735065724572613053657373696f6e496e64657810060000000470204e756d626572206f662073657373696f6e7320706572206572612e3c426f6e64696e674475726174696f6e20457261496e646578101c00000004e4204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e28344e6f74436f6e74726f6c6c65720468204e6f74206120636f6e74726f6c6c6572206163636f756e742e204e6f7453746173680454204e6f742061207374617368206163636f756e742e34416c7265616479426f6e646564046420537461736820697320616c726561647920626f6e6465642e34416c7265616479506169726564047820436f6e74726f6c6c657220697320616c7265616479207061697265642e30456d70747954617267657473046420546172676574732063616e6e6f7420626520656d7074792e384475706c6963617465496e6465780444204475706c696361746520696e6465782e44496e76616c6964536c617368496e646578048820536c617368207265636f726420696e646578206f7574206f6620626f756e64732e44496e73756666696369656e7456616c756504cc2043616e206e6f7420626f6e6420776974682076616c7565206c657373207468616e206d696e696d756d2062616c616e63652e304e6f4d6f72654368756e6b7304942043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e344e6f556e6c6f636b4368756e6b04a42043616e206e6f74207265626f6e6420776974686f757420756e6c6f636b696e67206368756e6b732e204f6666656e63657301204f6666656e6365730c1c5265706f727473000101345265706f727449644f663c543ed04f6666656e636544657461696c733c543a3a4163636f756e7449642c20543a3a4964656e74696669636174696f6e5475706c653e00040004490120546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e58436f6e63757272656e745265706f727473496e646578010201104b696e64384f706171756554696d65536c6f74485665633c5265706f727449644f663c543e3e010400042901204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e485265706f72747342794b696e64496e646578010101104b696e641c5665633c75383e00040018110120456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e00bc20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e004901204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f66690120646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e010001041c4f6666656e636508104b696e64384f706171756554696d65536c6f7408550120546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e64390120286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e00001c53657373696f6e011c53657373696f6e1c2856616c696461746f727301004c5665633c543a3a56616c696461746f7249643e0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e64657801003053657373696f6e496e646578100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e676564010010626f6f6c040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b6579730100785665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e0400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f72730100205665633c7533323e04000c8020496e6469636573206f662064697361626c65642076616c696461746f72732e003501205468652073657420697320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e732061206e657720736574206f66206964656e7469746965732e204e6578744b6579730002051c5665633c75383e38543a3a56616c696461746f7249641c543a3a4b657973010400109c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e00590120546865206669727374206b657920697320616c77617973206044454455505f4b45595f5052454649586020746f206861766520616c6c20746865206461746120696e207468652073616d65206272616e6368206f6661012074686520747269652e20486176696e6720616c6c206461746120696e207468652073616d65206272616e63682073686f756c642070726576656e7420736c6f77696e6720646f776e206f7468657220717565726965732e204b65794f776e65720002051c5665633c75383e50284b65795479706549642c205665633c75383e2938543a3a56616c696461746f72496401040010250120546865206f776e6572206f662061206b65792e20546865207365636f6e64206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e00590120546865206669727374206b657920697320616c77617973206044454455505f4b45595f5052454649586020746f206861766520616c6c20746865206461746120696e207468652073616d65206272616e6368206f6661012074686520747269652e20486176696e6720616c6c206461746120696e207468652073616d65206272616e63682073686f756c642070726576656e7420736c6f77696e6720646f776e206f7468657220717565726965732e0104207365745f6b65797308106b6579731c543a3a4b6579731470726f6f661c5665633c75383e28e42053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b6579602e210120416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec4205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d420546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002c2023203c7765696768743e88202d204f286c6f67206e2920696e206e756d626572206f66206163636f756e74732e58202d204f6e6520657874726120444220656e7472792e302023203c2f7765696768743e0104284e657753657373696f6e043053657373696f6e496e646578085501204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b88206e756d626572206173207468652074797065206d6967687420737567676573742e044044454455505f4b45595f50524546495814265b75385d38343a73657373696f6e3a6b6579730865012055736564206173206669727374206b657920666f7220604e6578744b6579736020616e6420604b65794f776e65726020746f2070757420616c6c20746865206461746120696e746f207468652073616d65206272616e636834206f662074686520747269652e0c30496e76616c696450726f6f66046420496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f72496404a0204e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b657904682052656769737465726564206475706c6963617465206b65792e3c46696e616c697479547261636b65720001042866696e616c5f68696e74041068696e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08f42048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a65646c20626c6f636b2069732074686520676976656e206e756d6265722e00082857696e646f7753697a6538543a3a426c6f636b4e756d626572106500000004190120546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e345265706f72744c6174656e637938543a3a426c6f636b4e756d62657210e8030000041d01205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e0838416c72656164795570646174656404c82046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b1c42616448696e7404902046696e616c697a6564206865696768742061626f766520626c6f636b206e756d6265721c4772616e647061013c4772616e64706146696e616c6974791c2c417574686f726974696573010034417574686f726974794c6973740400102c20444550524543415445440061012054686973207573656420746f2073746f7265207468652063757272656e7420617574686f72697479207365742c20776869636820686173206265656e206d6967726174656420746f207468652077656c6c2d6b6e6f776e94204752414e4450415f415554484f52495445535f4b455920756e686173686564206b65792e14537461746501006c53746f72656453746174653c543a3a426c6f636b4e756d6265723e04000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e676500008c53746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000038543a3a426c6f636b4e756d626572040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c656400008028543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d626572290400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e7453657449640100145365744964200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e0001011453657449643053657373696f6e496e64657800040004c1012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f7220776869636820697473206d656d62657273207765726520726573706f6e7369626c652e0104487265706f72745f6d69736265686176696f72041c5f7265706f72741c5665633c75383e0464205265706f727420736f6d65206d69736265686176696f722e010c384e6577417574686f7269746965730434417574686f726974794c6973740490204e657720617574686f726974792073657420686173206265656e206170706c6965642e1850617573656400049c2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640004a02043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e00102c50617573654661696c656408090120417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665a8202865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e30526573756d654661696c656408150120417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e277420706175736564a42028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e344368616e676550656e64696e6704ec20417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e1c546f6f536f6f6e04c02043616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e20496d4f6e6c696e650120496d4f6e6c696e651020476f737369704174010038543a3a426c6f636b4e756d626572100000000004a02054686520626c6f636b206e756d626572207768656e2077652073686f756c6420676f737369702e104b65797301004c5665633c543a3a417574686f7269747949643e040004d0205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e485265636569766564486561727462656174730002013053657373696f6e496e6465782441757468496e6465781c5665633c75383e01040008e420466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206041757468496e646578608c20746f20606f6666636861696e3a3a4f70617175654e6574776f726b5374617465602e38417574686f726564426c6f636b730102013053657373696f6e496e64657838543a3a56616c696461746f7249640c75333201100000000008150120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f662060543a3a56616c696461746f7249646020746f20746865c8206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e0104246865617274626561740824686561727462656174644865617274626561743c543a3a426c6f636b4e756d6265723e285f7369676e6174757265bc3c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e617475726500010c444865617274626561745265636569766564042c417574686f72697479496404c02041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f726974794964601c416c6c476f6f640004d42041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2c536f6d654f66666c696e6504605665633c4964656e74696669636174696f6e5475706c653e0431012041742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e63652076616c696461746f722077617320666f756e6420746f206265206f66666c696e652e000828496e76616c69644b65790464204e6f6e206578697374656e74207075626c6963206b65792e4c4475706c6963617465644865617274626561740458204475706c696361746564206865617274626561742e48417574686f72697479446973636f766572790001000000002444656d6f6372616379012444656d6f6372616379403c5075626c696350726f70436f756e7401002450726f70496e646578100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f707301009c5665633c2850726f70496e6465782c20543a3a486173682c20543a3a4163636f756e744964293e040004210120546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865207365636f6e64206974656d206973207468652070726f706f73616c277320686173682e24507265696d616765730001011c543a3a48617368d4285665633c75383e2c20543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d62657229000400086101204d6170206f662068617368657320746f207468652070726f706f73616c20707265696d6167652c20616c6f6e6720776974682077686f207265676973746572656420697420616e64207468656972206465706f7369742ee42054686520626c6f636b206e756d6265722069732074686520626c6f636b20617420776869636820697420776173206465706f73697465642e244465706f7369744f660001012450726f70496e646578842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e2900040004842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e3c5265666572656e64756d436f756e7401003c5265666572656e64756d496e646578100000000004310120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e344c6f77657374556e62616b656401003c5265666572656e64756d496e646578100000000008250120546865206c6f77657374207265666572656e64756d20696e64657820726570726573656e74696e6720616e20756e62616b6564207265666572656e64756d2e20457175616c20746fdc20605265666572656e64756d436f756e74602069662074686572652069736e2774206120756e62616b6564207265666572656e64756d2e405265666572656e64756d496e666f4f660001013c5265666572656e64756d496e6465789c5265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a486173683e00040004b420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e34446973706174636851756575650100bc5665633c28543a3a426c6f636b4e756d6265722c20543a3a486173682c205265666572656e64756d496e646578293e0400044101205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e2053746f726564206f72646572656420627920626c6f636b206e756d6265722e24566f74657273466f720101013c5265666572656e64756d496e646578445665633c543a3a4163636f756e7449643e00040004a4204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e18566f74654f660101017c285265666572656e64756d496e6465782c20543a3a4163636f756e7449642910566f7465000400106101204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c794d012069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468655d012064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616ef420616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e1450726f787900010130543a3a4163636f756e74496430543a3a4163636f756e7449640004000831012057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b6579206973207468658820766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e2c44656c65676174696f6e7301010130543a3a4163636f756e7449646828543a3a4163636f756e7449642c20436f6e76696374696f6e2901840000000000000000000000000000000000000000000000000000000000000000000441012047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e544c6173745461626c656457617345787465726e616c010010626f6f6c0400085901205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c6963282070726f706f73616c2e304e65787445787465726e616c00006028543a3a486173682c20566f74655468726573686f6c6429040010590120546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e550120546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743aa4202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f7268202d20605075626c696350726f70736020697320656d7074792e24426c61636b6c6973740001011c543a3a486173688c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e290004000851012041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d626572e82028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e3443616e63656c6c6174696f6e730101011c543a3a4861736810626f6f6c000400042901205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e01541c70726f706f7365083470726f706f73616c5f686173681c543a3a486173681476616c756554436f6d706163743c42616c616e63654f663c543e3e18a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e002c2023203c7765696768743e20202d204f2831292e80202d2054776f204442206368616e6765732c206f6e6520444220656e7472792e302023203c2f7765696768743e187365636f6e64042070726f706f73616c48436f6d706163743c50726f70496e6465783e18a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e002c2023203c7765696768743e20202d204f2831292e40202d204f6e6520444220656e7472792e302023203c2f7765696768743e10766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f746510566f74651c350120566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bbc206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e002c2023203c7765696768743e20202d204f2831292e7c202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e302023203c2f7765696768743e2870726f78795f766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f746510566f74651c510120566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374f8207468652070726f706f73616c3b20206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e002c2023203c7765696768743e20202d204f2831292e7c202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e302023203c2f7765696768743e40656d657267656e63795f63616e63656c04247265665f696e6465783c5265666572656e64756d496e646578085101205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d6530207265666572656e64756d2e4065787465726e616c5f70726f706f7365043470726f706f73616c5f686173681c543a3a48617368083101205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c30207265666572656e64756d2e6465787465726e616c5f70726f706f73655f6d616a6f72697479043470726f706f73616c5f686173681c543a3a48617368145901205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c656020616e2065787465726e616c207265666572656e64756d2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e6065787465726e616c5f70726f706f73655f64656661756c74043470726f706f73616c5f686173681c543a3a48617368144901205363686564756c652061206e656761746976652d7475726e6f75742d62696173207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f84207363686564756c6520616e2065787465726e616c207265666572656e64756d2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e28666173745f747261636b0c3470726f706f73616c5f686173681c543a3a4861736834766f74696e675f706572696f6438543a3a426c6f636b4e756d6265721464656c617938543a3a426c6f636b4e756d626572245101205363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564650120696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e65ec20627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e00f8202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e6101202d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e20496e6372656173656420746f9820202060456d657267656e6379566f74696e67506572696f646020696620746f6f206c6f772e5501202d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265bc202020656e61637465642e205468697320646f65736e277420686176652061206d696e696d756d20616d6f756e742e347665746f5f65787465726e616c043470726f706f73616c5f686173681c543a3a4861736804bc205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e4463616e63656c5f7265666572656e64756d04247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e04542052656d6f76652061207265666572656e64756d2e3463616e63656c5f717565756564041477686963683c5265666572656e64756d496e64657804a02043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e247365745f70726f7879041470726f787930543a3a4163636f756e7449641498205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e002c2023203c7765696768743e58202d204f6e6520657874726120444220656e7472792e302023203c2f7765696768743e3072657369676e5f70726f787900149820436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e002c2023203c7765696768743e40202d204f6e6520444220636c6561722e302023203c2f7765696768743e3072656d6f76655f70726f7879041470726f787930543a3a4163636f756e744964149820436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e002c2023203c7765696768743e40202d204f6e6520444220636c6561722e302023203c2f7765696768743e2064656c65676174650808746f30543a3a4163636f756e74496428636f6e76696374696f6e28436f6e76696374696f6e143c2044656c656761746520766f74652e002c2023203c7765696768743e58202d204f6e6520657874726120444220656e7472792e302023203c2f7765696768743e28756e64656c656761746500144420556e64656c656761746520766f74652e002c2023203c7765696768743e20202d204f2831292e302023203c2f7765696768743e58636c6561725f7075626c69635f70726f706f73616c7300040101205665746f20616e6420626c61636b6c697374207468652070726f706f73616c20686173682e204d7573742062652066726f6d20526f6f74206f726967696e2e346e6f74655f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e0861012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e205468697320646f65736e27742072657175697265207468652070726f706f73616c20746f206265250120696e207468652064697370617463682071756575652062757420646f657320726571756972652061206465706f7369742c2072657475726e6564206f6e636520656e61637465642e586e6f74655f696d6d696e656e745f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e0845012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e2054686973207265717569726573207468652070726f706f73616c20746f206265b420696e207468652064697370617463682071756575652e204e6f206465706f736974206973206e65656465642e34726561705f707265696d616765043470726f706f73616c5f686173681c543a3a4861736814f42052656d6f766520616e20657870697265642070726f706f73616c20707265696d61676520616e6420636f6c6c65637420746865206465706f7369742e00510120546869732077696c6c206f6e6c7920776f726b2061667465722060566f74696e67506572696f646020626c6f636b732066726f6d207468652074696d6520746861742074686520707265696d616765207761735d01206e6f7465642c2069662069742773207468652073616d65206163636f756e7420646f696e672069742e2049662069742773206120646966666572656e74206163636f756e742c207468656e206974276c6c206f6e6c79b020776f726b20616e206164646974696f6e616c2060456e6163746d656e74506572696f6460206c617465722e01402050726f706f736564082450726f70496e6465781c42616c616e636504c02041206d6f74696f6e20686173206265656e2070726f706f7365642062792061207075626c6963206163636f756e742e185461626c65640c2450726f70496e6465781c42616c616e6365385665633c4163636f756e7449643e04dc2041207075626c69632070726f706f73616c20686173206265656e207461626c656420666f72207265666572656e64756d20766f74652e3845787465726e616c5461626c656400049820416e2065787465726e616c2070726f706f73616c20686173206265656e207461626c65642e1c53746172746564083c5265666572656e64756d496e64657834566f74655468726573686f6c6404602041207265666572656e64756d2068617320626567756e2e18506173736564043c5265666572656e64756d496e64657804b020412070726f706f73616c20686173206265656e20617070726f766564206279207265666572656e64756d2e244e6f74506173736564043c5265666572656e64756d496e64657804b020412070726f706f73616c20686173206265656e2072656a6563746564206279207265666572656e64756d2e2443616e63656c6c6564043c5265666572656e64756d496e64657804842041207265666572656e64756d20686173206265656e2063616e63656c6c65642e204578656375746564083c5265666572656e64756d496e64657810626f6f6c047420412070726f706f73616c20686173206265656e20656e61637465642e2444656c65676174656408244163636f756e744964244163636f756e74496404e020416e206163636f756e74206861732064656c65676174656420746865697220766f746520746f20616e6f74686572206163636f756e742e2c556e64656c65676174656404244163636f756e74496404e820416e206163636f756e74206861732063616e63656c6c656420612070726576696f75732064656c65676174696f6e206f7065726174696f6e2e185665746f65640c244163636f756e74496410486173682c426c6f636b4e756d626572049820416e2065787465726e616c2070726f706f73616c20686173206265656e207665746f65642e34507265696d6167654e6f7465640c1048617368244163636f756e7449641c42616c616e636504e020412070726f706f73616c277320707265696d61676520776173206e6f7465642c20616e6420746865206465706f7369742074616b656e2e30507265696d616765557365640c1048617368244163636f756e7449641c42616c616e636504150120412070726f706f73616c20707265696d616765207761732072656d6f76656420616e6420757365642028746865206465706f736974207761732072657475726e6564292e3c507265696d616765496e76616c69640810486173683c5265666572656e64756d496e646578040d0120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d6167652077617320696e76616c69642e3c507265696d6167654d697373696e670810486173683c5265666572656e64756d496e646578040d0120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d61676520776173206d697373696e672e38507265696d616765526561706564101048617368244163636f756e7449641c42616c616e6365244163636f756e744964045d012041207265676973746572656420707265696d616765207761732072656d6f76656420616e6420746865206465706f73697420636f6c6c6563746564206279207468652072656170657220286c617374206974656d292e1c3c456e6163746d656e74506572696f6438543a3a426c6f636b4e756d6265721000c2010014710120546865206d696e696d756d20706572696f64206f66206c6f636b696e6720616e642074686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e0031012049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e737572652074686174690120766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e2074686520636173652077686572659c207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e304c61756e6368506572696f6438543a3a426c6f636b4e756d62657210c089010004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e30566f74696e67506572696f6438543a3a426c6f636b4e756d62657210c089010004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e384d696e696d756d4465706f7369743042616c616e63654f663c543e400010a5d4e8000000000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e54456d657267656e6379566f74696e67506572696f6438543a3a426c6f636b4e756d626572100807000004ec204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f7220616e20656d657267656e6379207265666572656e64756d2e34436f6f6c6f6666506572696f6438543a3a426c6f636b4e756d62657210c089010004610120506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e4c507265696d616765427974654465706f7369743042616c616e63654f663c543e4000e1f5050000000000000000000000000429012054686520616d6f756e74206f662062616c616e63652074686174206d757374206265206465706f7369746564207065722062797465206f6620707265696d6167652073746f7265642e582056616c75654c6f7704382056616c756520746f6f206c6f773c50726f706f73616c4d697373696e6704602050726f706f73616c20646f6573206e6f74206578697374204e6f7450726f78790430204e6f7420612070726f787920426164496e646578043820556e6b6e6f776e20696e6465783c416c726561647943616e63656c656404982043616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365444475706c696361746550726f706f73616c04582050726f706f73616c20616c7265616479206d6164654c50726f706f73616c426c61636b6c6973746564046c2050726f706f73616c207374696c6c20626c61636b6c6973746564444e6f7453696d706c654d616a6f7269747904ac204e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f726974792c496e76616c696448617368043420496e76616c69642068617368284e6f50726f706f73616c0454204e6f2065787465726e616c2070726f706f73616c34416c72656164795665746f6564049c204964656e74697479206d6179206e6f74207665746f20612070726f706f73616c20747769636530416c726561647950726f7879044020416c726561647920612070726f78792857726f6e6750726f787904302057726f6e672070726f7879304e6f7444656c6567617465640438204e6f742064656c656761746564444475706c6963617465507265696d616765045c20507265696d61676520616c7265616479206e6f7465642c4e6f74496d6d696e656e740434204e6f7420696d6d696e656e74144561726c79042820546f6f206561726c7920496d6d696e656e74042420496d6d696e656e743c507265696d6167654d697373696e67044c20507265696d616765206e6f7420666f756e64445265666572656e64756d496e76616c6964048820566f746520676976656e20666f7220696e76616c6964207265666572656e64756d3c507265696d616765496e76616c6964044420496e76616c696420707265696d6167652c4e6f6e6557616974696e670454204e6f2070726f706f73616c732077616974696e671c436f756e63696c014c496e7374616e636531436f6c6c656374697665142450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001011c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001011c543a3a486173684c566f7465733c543a3a4163636f756e7449643e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e01102c7365745f6d656d62657273042c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e105101205365742074686520636f6c6c6563746976652773206d656d62657273686970206d616e75616c6c7920746f20606e65775f6d656d62657273602e204265206e69636520746f2074686520636861696e20616e645c2070726f76696465206974207072652d736f727465642e005820526571756972657320726f6f74206f726967696e2e1c65786563757465042070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e0cf420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e1c70726f706f736508247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e102c2023203c7765696768743e90202d20426f756e6465642073746f7261676520726561647320616e64207772697465732eb8202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c102c2023203c7765696768743e8c202d20426f756e6465642073746f72616765207265616420616e64207772697465732e5501202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e302023203c2f7765696768743e01182050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e74084d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292e14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408104861736810626f6f6c0405012041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408104861736810626f6f6c042d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e0018244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642148546563686e6963616c436f6d6d6974746565014c496e7374616e636532436f6c6c656374697665142450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001011c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001011c543a3a486173684c566f7465733c543a3a4163636f756e7449643e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e01102c7365745f6d656d62657273042c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e105101205365742074686520636f6c6c6563746976652773206d656d62657273686970206d616e75616c6c7920746f20606e65775f6d656d62657273602e204265206e69636520746f2074686520636861696e20616e645c2070726f76696465206974207072652d736f727465642e005820526571756972657320726f6f74206f726967696e2e1c65786563757465042070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e0cf420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e1c70726f706f736508247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e102c2023203c7765696768743e90202d20426f756e6465642073746f7261676520726561647320616e64207772697465732eb8202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c102c2023203c7765696768743e8c202d20426f756e6465642073746f72616765207265616420616e64207772697465732e5501202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e302023203c2f7765696768743e01182050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e74084d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292e14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408104861736810626f6f6c0405012041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408104861736810626f6f6c042d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e0018244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642144456c656374696f6e7350687261676d656e014050687261676d656e456c656374696f6e181c4d656d626572730100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e040004f0205468652063757272656e7420656c6563746564206d656d626572736869702e20536f72746564206261736564206f6e206163636f756e742069642e2452756e6e65727355700100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e0400044901205468652063757272656e742072756e6e6572735f75702e20536f72746564206261736564206f6e206c6f7720746f2068696768206d657269742028776f72736520746f20626573742072756e6e6572292e38456c656374696f6e526f756e647301000c75333210000000000441012054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e65642c206578636c7564696e6720746865207570636f6d696e67206f6e652e1c566f7465734f6601010130543a3a4163636f756e744964445665633c543a3a4163636f756e7449643e01040004010120566f746573206f66206120706172746963756c617220766f7465722c20776974682074686520726f756e6420696e646578206f662074686520766f7465732e1c5374616b654f6601010130543a3a4163636f756e7449643042616c616e63654f663c543e0040000000000000000000000000000000000464204c6f636b6564207374616b65206f66206120766f7465722e2843616e646964617465730100445665633c543a3a4163636f756e7449643e0400086501205468652070726573656e742063616e646964617465206c6973742e20536f72746564206261736564206f6e206163636f756e742d69642e20412063757272656e74206d656d626572206f7220612072756e6e65722063616e3101206e6576657220656e746572207468697320766563746f7220616e6420697320616c7761797320696d706c696369746c7920617373756d656420746f20626520612063616e6469646174652e011810766f74650814766f746573445665633c543a3a4163636f756e7449643e1476616c756554436f6d706163743c42616c616e63654f663c543e3e3c050120566f746520666f72206120736574206f662063616e6469646174657320666f7220746865207570636f6d696e6720726f756e64206f6620656c656374696f6e2e0050205468652060766f746573602073686f756c643a482020202d206e6f7420626520656d7074792eac2020202d206265206c657373207468616e20746865206e756d626572206f662063616e646964617465732e005d012055706f6e20766f74696e672c206076616c75656020756e697473206f66206077686f6027732062616c616e6365206973206c6f636b656420616e64206120626f6e6420616d6f756e742069732072657365727665642e5d012049742069732074686520726573706f6e736962696c697479206f66207468652063616c6c657220746f206e6f7420706c61636520616c6c206f662074686569722062616c616e636520696e746f20746865206c6f636ba020616e64206b65657020736f6d6520666f722066757274686572207472616e73616374696f6e732e002c2023203c7765696768743e2c2023232323205374617465302052656164733a204f283129c8205772697465733a204f28562920676976656e2060566020766f7465732e205620697320626f756e6465642062792031362e302023203c2f7765696768743e3072656d6f76655f766f746572001c21012052656d6f766520606f726967696e60206173206120766f7465722e20546869732072656d6f76657320746865206c6f636b20616e642072657475726e732074686520626f6e642e002c2023203c7765696768743e2c2023232323205374617465302052656164733a204f28312934205772697465733a204f283129302023203c2f7765696768743e507265706f72745f646566756e63745f766f74657204187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365345d01205265706f727420607461726765746020666f72206265696e6720616e20646566756e637420766f7465722e20496e2063617365206f6620612076616c6964207265706f72742c20746865207265706f727465722069735d012072657761726465642062792074686520626f6e6420616d6f756e74206f662060746172676574602e204f74686572776973652c20746865207265706f7274657220697473656c662069732072656d6f76656420616e645c20746865697220626f6e6420697320736c61736865642e0088204120646566756e637420766f74657220697320646566696e656420746f2062653a4d012020202d206120766f7465722077686f73652063757272656e74207375626d697474656420766f7465732061726520616c6c20696e76616c69642e20692e652e20616c6c206f66207468656d20617265206e6fb420202020206c6f6e67657220612063616e646964617465206e6f7220616e20616374697665206d656d6265722e002c2023203c7765696768743e2c202323232320537461746515012052656164733a204f284e4c6f674d2920676976656e204d2063757272656e742063616e6469646174657320616e64204e20766f74657320666f722060746172676574602e34205772697465733a204f283129302023203c2f7765696768743e407375626d69745f63616e646964616379003478205375626d6974206f6e6573656c6620666f722063616e6469646163792e006420412063616e6469646174652077696c6c206569746865723aec2020202d204c6f73652061742074686520656e64206f6620746865207465726d20616e6420666f7266656974207468656972206465706f7369742e2d012020202d2057696e20616e64206265636f6d652061206d656d6265722e204d656d626572732077696c6c206576656e7475616c6c7920676574207468656972207374617368206261636b2e55012020202d204265636f6d6520612072756e6e65722d75702e2052756e6e6572732d75707320617265207265736572766564206d656d6265727320696e2063617365206f6e65206765747320666f72636566756c6c7934202020202072656d6f7665642e002c2023203c7765696768743e2c20232323232053746174658c2052656164733a204f284c6f674e2920476976656e204e2063616e646964617465732e34205772697465733a204f283129302023203c2f7765696768743e4872656e6f756e63655f63616e646964616379002451012052656e6f756e6365206f6e65277320696e74656e74696f6e20746f20626520612063616e64696461746520666f7220746865206e65787420656c656374696f6e20726f756e642e203320706f74656e7469616c40206f7574636f6d65732065786973743a4101202d20606f726967696e6020697320612063616e64696461746520616e64206e6f7420656c656374656420696e20616e79207365742e20496e207468697320636173652c2074686520626f6e64206973f4202020756e72657365727665642c2072657475726e656420616e64206f726967696e2069732072656d6f76656420617320612063616e6469646174652e5901202d20606f726967696e6020697320612063757272656e742072756e6e65722075702e20496e207468697320636173652c2074686520626f6e6420697320756e72657365727665642c2072657475726e656420616e64842020206f726967696e2069732072656d6f76656420617320612072756e6e65722e4d01202d20606f726967696e6020697320612063757272656e74206d656d6265722e20496e207468697320636173652c2074686520626f6e6420697320756e726573657276656420616e64206f726967696e206973590120202072656d6f7665642061732061206d656d6265722c20636f6e73657175656e746c79206e6f74206265696e6720612063616e64696461746520666f7220746865206e65787420726f756e6420616e796d6f72652e650120202053696d696c617220746f205b6072656d6f76655f766f746572605d2c206966207265706c6163656d656e742072756e6e657273206578697374732c20746865792061726520696d6d6564696174656c7920757365642e3472656d6f76655f6d656d626572040c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365345d012052656d6f7665206120706172746963756c6172206d656d6265722066726f6d20746865207365742e20546869732069732065666665637469766520696d6d6564696174656c7920616e642074686520626f6e64206f668020746865206f7574676f696e67206d656d62657220697320736c61736865642e00590120496620612072756e6e65722d757020697320617661696c61626c652c207468656e2074686520626573742072756e6e65722d75702077696c6c2062652072656d6f76656420616e64207265706c6163657320746865f4206f7574676f696e67206d656d6265722e204f74686572776973652c2061206e65772070687261676d656e20726f756e6420697320737461727465642e004501204e6f74652074686174207468697320646f6573206e6f7420616666656374207468652064657369676e6174656420626c6f636b206e756d626572206f6620746865206e65787420656c656374696f6e2e002c2023203c7765696768743e2c2023232323205374617465582052656164733a204f28646f5f70687261676d656e295c205772697465733a204f28646f5f70687261676d656e29302023203c2f7765696768743e01141c4e65775465726d04645665633c284163636f756e7449642c2042616c616e6365293e0855012041206e6577207465726d2077697468206e6577206d656d626572732e205468697320696e64696361746573207468617420656e6f7567682063616e6469646174657320657869737465642c206e6f742074686174450120656e6f756768206861766520686173206265656e20656c65637465642e2054686520696e6e65722076616c7565206d757374206265206578616d696e656420666f72207468697320707572706f73652e24456d7074795465726d0004d8204e6f20286f72206e6f7420656e6f756768292063616e64696461746573206578697374656420666f72207468697320726f756e642e304d656d6265724b69636b656404244163636f756e7449640845012041206d656d62657220686173206265656e2072656d6f7665642e20546869732073686f756c6420616c7761797320626520666f6c6c6f7765642062792065697468657220604e65775465726d60206f74342060456d7074795465726d602e3c4d656d62657252656e6f756e63656404244163636f756e74496404a02041206d656d626572206861732072656e6f756e6365642074686569722063616e6469646163792e34566f7465725265706f727465640c244163636f756e744964244163636f756e74496410626f6f6c086101204120766f7465722028666972737420656c656d656e742920776173207265706f72746564202862797420746865207365636f6e6420656c656d656e742920776974682074686520746865207265706f7274206265696e678c207375636365737366756c206f72206e6f742028746869726420656c656d656e74292e143443616e646964616379426f6e643042616c616e63654f663c543e400010a5d4e800000000000000000000000028566f74696e67426f6e643042616c616e63654f663c543e4000743ba40b00000000000000000000000038446573697265644d656d626572730c753332100d00000000404465736972656452756e6e65727355700c753332100700000000305465726d4475726174696f6e38543a3a426c6f636b4e756d6265721040380000003830556e61626c65546f566f746504c42043616e6e6f7420766f7465207768656e206e6f2063616e64696461746573206f72206d656d626572732065786973742e1c4e6f566f7465730498204d75737420766f746520666f72206174206c65617374206f6e652063616e6469646174652e30546f6f4d616e79566f74657304882043616e6e6f7420766f7465206d6f7265207468616e2063616e646964617465732e504d6178696d756d566f7465734578636565646564049c2043616e6e6f7420766f7465206d6f7265207468616e206d6178696d756d20616c6c6f7765642e284c6f7742616c616e636504c82043616e6e6f7420766f74652077697468207374616b65206c657373207468616e206d696e696d756d2062616c616e63652e3c556e61626c65546f506179426f6e64047c20566f7465722063616e206e6f742070617920766f74696e6720626f6e642e2c4d7573744265566f7465720444204d757374206265206120766f7465722e285265706f727453656c6604502043616e6e6f74207265706f72742073656c662e4c4475706c69636174656443616e6469646174650484204475706c6963617465642063616e646964617465207375626d697373696f6e2e304d656d6265725375626d6974048c204d656d6265722063616e6e6f742072652d7375626d69742063616e6469646163792e3052756e6e65725375626d6974048c2052756e6e65722063616e6e6f742072652d7375626d69742063616e6469646163792e68496e73756666696369656e7443616e64696461746546756e647304982043616e64696461746520646f6573206e6f74206861766520656e6f7567682066756e64732e34496e76616c69644f726967696e04c8204f726967696e206973206e6f7420612063616e6469646174652c206d656d626572206f7220612072756e6e65722075702e244e6f744d656d6265720438204e6f742061206d656d6265722e4c546563686e6963616c4d656d62657273686970014c496e7374616e6365314d656d62657273686970041c4d656d626572730100445665633c543a3a4163636f756e7449643e040004c8205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e0114286164645f6d656d626572040c77686f30543a3a4163636f756e7449640c7c204164642061206d656d626572206077686f6020746f20746865207365742e00b4204d6179206f6e6c792062652063616c6c65642066726f6d20604164644f726967696e60206f7220726f6f742e3472656d6f76655f6d656d626572040c77686f30543a3a4163636f756e7449640c902052656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e00c0204d6179206f6e6c792062652063616c6c65642066726f6d206052656d6f76654f726967696e60206f7220726f6f742e2c737761705f6d656d626572081872656d6f766530543a3a4163636f756e7449640c61646430543a3a4163636f756e7449640cc02053776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e00b8204d6179206f6e6c792062652063616c6c65642066726f6d2060537761704f726967696e60206f7220726f6f742e3472657365745f6d656d62657273041c6d656d62657273445665633c543a3a4163636f756e7449643e105901204368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e646c207061737320606d656d6265727360207072652d736f727465642e00bc204d6179206f6e6c792062652063616c6c65642066726f6d206052657365744f726967696e60206f7220726f6f742e286368616e67655f6b6579040c6e657730543a3a4163636f756e7449640cd82053776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e00f4204d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e01182c4d656d62657241646465640004e42054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e344d656d62657252656d6f7665640004ec2054686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e384d656d62657273537761707065640004dc2054776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e304d656d6265727352657365740004190120546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e284b65794368616e676564000488204f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e1444756d6d7904bc73705f7374643a3a6d61726b65723a3a5068616e746f6d446174613c284163636f756e7449642c204576656e74293e0470205068616e746f6d206d656d6265722c206e6576657220757365642e000020547265617375727901205472656173757279143450726f706f73616c436f756e7401003450726f706f73616c496e646578100000000004a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c730001013450726f706f73616c496e6465789050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c730100485665633c50726f706f73616c496e6465783e040004f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e10546970730001051c543a3a48617368f04f70656e5469703c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265722c20543a3a486173683e0004000c59012054697073207468617420617265206e6f742079657420636f6d706c657465642e204b65796564206279207468652068617368206f66206028726561736f6e2c2077686f29602066726f6d207468652076616c75652e3d012054686973206861732074686520696e73656375726520656e756d657261626c6520686173682066756e6374696f6e2073696e636520746865206b657920697473656c6620697320616c7265616479802067756172616e7465656420746f20626520612073656375726520686173682e1c526561736f6e730001051c543a3a486173681c5665633c75383e0004000849012053696d706c6520707265696d616765206c6f6f6b75702066726f6d2074686520726561736f6e2773206861736820746f20746865206f726967696e616c20646174612e20416761696e2c2068617320616e610120696e73656375726520656e756d657261626c6520686173682073696e636520746865206b65792069732067756172616e7465656420746f2062652074686520726573756c74206f6620612073656375726520686173682e01203470726f706f73655f7370656e64081476616c756554436f6d706163743c42616c616e63654f663c543e3e2c62656e65666963696172798c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365242d012050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c7565350120697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e636520746865542070726f706f73616c20697320617761726465642e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e94202d204f6e65204442206368616e67652c206f6e6520657874726120444220656e7472792e302023203c2f7765696768743e3c72656a6563745f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e1cfc2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e40202d204f6e6520444220636c6561722e302023203c2f7765696768743e40617070726f76655f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e205d0120417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e6566696369617279ac20616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e44202d204f6e65204442206368616e67652e302023203c2f7765696768743e387265706f72745f617765736f6d650818726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e7449644c5d01205265706f727420736f6d657468696e672060726561736f6e60207468617420646573657276657320612074697020616e6420636c61696d20616e79206576656e7475616c207468652066696e6465722773206665652e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005501205061796d656e743a20605469705265706f72744465706f73697442617365602077696c6c2062652072657365727665642066726f6d20746865206f726967696e206163636f756e742c2061732077656c6c206173d420605469705265706f72744465706f736974506572427974656020666f722065616368206279746520696e2060726561736f6e602e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743e9c202d20604f2852296020776865726520605260206c656e677468206f662060726561736f6e602e64202d204f6e652062616c616e6365206f7065726174696f6e2e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e2c726574726163745f7469700410686173681c543a3a486173684c550120526574726163742061207072696f72207469702d7265706f72742066726f6d20607265706f72745f617765736f6d65602c20616e642063616e63656c207468652070726f63657373206f662074697070696e672e00e0204966207375636365737366756c2c20746865206f726967696e616c206465706f7369742077696c6c20626520756e72657365727665642e00510120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642074686520746970206964656e746966696564206279206068617368604501206d7573742068617665206265656e207265706f7274656420627920746865207369676e696e67206163636f756e74207468726f75676820607265706f72745f617765736f6d65602028616e64206e6f7450207468726f75676820607469705f6e657760292e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e009020456d697473206054697052657472616374656460206966207375636365737366756c2e002c2023203c7765696768743e24202d20604f2854296064202d204f6e652062616c616e6365206f7065726174696f6e2ec4202d2054776f2073746f726167652072656d6f76616c7320286f6e6520726561642c20636f64656320604f28542960292e34202d204f6e65206576656e742e302023203c2f7765696768743e1c7469705f6e65770c18726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e744964247469705f76616c75653042616c616e63654f663c543e4cf4204769766520612074697020666f7220736f6d657468696e67206e65773b206e6f2066696e6465722773206665652077696c6c2062652074616b656e2e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743e4101202d20604f2852202b2054296020776865726520605260206c656e677468206f662060726561736f6e602c2060546020697320746865206e756d626572206f6620746970706572732e2060546020697345012020206e61747572616c6c79206361707065642061732061206d656d62657273686970207365742c20605260206973206c696d69746564207468726f756768207472616e73616374696f6e2d73697a652e0d01202d2054776f2073746f7261676520696e73657274696f6e732028636f6465637320604f285229602c20604f28542960292c206f6e65207265616420604f283129602e34202d204f6e65206576656e742e302023203c2f7765696768743e0c7469700810686173681c543a3a48617368247469705f76616c75653042616c616e63654f663c543e4cb4204465636c6172652061207469702076616c756520666f7220616e20616c72656164792d6f70656e207469702e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f66207468652068617368206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279382020206163636f756e742049442e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e00650120456d6974732060546970436c6f73696e676020696620746865207468726573686f6c64206f66207469707065727320686173206265656e207265616368656420616e642074686520636f756e74646f776e20706572696f64342068617320737461727465642e002c2023203c7765696768743e24202d20604f285429600101202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28542960292c206f6e652073746f72616765207265616420604f283129602e4c202d20557020746f206f6e65206576656e742e302023203c2f7765696768743e24636c6f73655f7469700410686173681c543a3a48617368386020436c6f736520616e64207061796f75742061207469702e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0019012054686520746970206964656e74696669656420627920606861736860206d75737420686176652066696e69736865642069747320636f756e74646f776e20706572696f642e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e002c2023203c7765696768743e24202d20604f28542960e4202d204f6e652073746f726167652072657472696576616c2028636f64656320604f285429602920616e642074776f2072656d6f76616c732e88202d20557020746f2074687265652062616c616e6365206f7065726174696f6e732e302023203c2f7765696768743e012c2050726f706f736564043450726f706f73616c496e6465780438204e65772070726f706f73616c2e205370656e64696e67041c42616c616e636504e8205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e1c417761726465640c3450726f706f73616c496e6465781c42616c616e6365244163636f756e744964048020536f6d652066756e64732068617665206265656e20616c6c6f63617465642e2052656a6563746564083450726f706f73616c496e6465781c42616c616e636504b420412070726f706f73616c207761732072656a65637465643b2066756e6473207765726520736c61736865642e144275726e74041c42616c616e6365048c20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20526f6c6c6f766572041c42616c616e6365043101205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e1c4465706f736974041c42616c616e6365048020536f6d652066756e64732068617665206265656e206465706f73697465642e184e657754697004104861736804982041206e6577207469702073756767657374696f6e20686173206265656e206f70656e65642e28546970436c6f73696e6704104861736804dc2041207469702073756767657374696f6e206861732072656163686564207468726573686f6c6420616e6420697320636c6f73696e672e24546970436c6f7365640c1048617368244163636f756e7449641c42616c616e636504882041207469702073756767657374696f6e20686173206265656e20636c6f7365642e3054697052657472616374656404104861736804942041207469702073756767657374696f6e20686173206265656e207265747261637465642e203050726f706f73616c426f6e641c5065726d696c6c1050c30000085501204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e110120416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e4c50726f706f73616c426f6e644d696e696d756d3042616c616e63654f663c543e400040e59c301200000000000000000000044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f6438543a3a426c6f636b4e756d6265721080510100048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e1c5065726d696c6c10000000000411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e30546970436f756e74646f776e38543a3a426c6f636b4e756d62657210403800000445012054686520706572696f6420666f722077686963682061207469702072656d61696e73206f70656e20616674657220697320686173206163686965766564207468726573686f6c6420746970706572732e3454697046696e646572734665651c50657263656e7404140431012054686520616d6f756e74206f66207468652066696e616c2074697020776869636820676f657320746f20746865206f726967696e616c207265706f72746572206f6620746865207469702e505469705265706f72744465706f736974426173653042616c616e63654f663c543e400010a5d4e8000000000000000000000004d42054686520616d6f756e742068656c64206f6e206465706f73697420666f7220706c6163696e67206120746970207265706f72742e5c5469705265706f72744465706f736974506572427974653042616c616e63654f663c543e4000e40b540200000000000000000000000409012054686520616d6f756e742068656c64206f6e206465706f7369742070657220627974652077697468696e2074686520746970207265706f727420726561736f6e2e2070496e73756666696369656e7450726f706f7365727342616c616e6365047c2050726f706f73657227732062616c616e636520697320746f6f206c6f772e50496e76616c696450726f706f73616c496e646578046c204e6f2070726f706f73616c206174207468617420696e6465782e30526561736f6e546f6f42696704882054686520726561736f6e20676976656e206973206a75737420746f6f206269672e30416c72656164794b6e6f776e048c20546865207469702077617320616c726561647920666f756e642f737461727465642e28556e6b6e6f776e54697004642054686520746970206861736820697320756e6b6e6f776e2e244e6f7446696e64657204210120546865206163636f756e7420617474656d7074696e6720746f20726574726163742074686520746970206973206e6f74207468652066696e646572206f6620746865207469702e245374696c6c4f70656e042d0120546865207469702063616e6e6f7420626520636c61696d65642f636c6f736564206265636175736520746865726520617265206e6f7420656e6f7567682074697070657273207965742e245072656d617475726504350120546865207469702063616e6e6f7420626520636c61696d65642f636c6f73656420626563617573652069742773207374696c6c20696e2074686520636f756e74646f776e20706572696f642e18436c61696d730118436c61696d730c18436c61696d730001013c457468657265756d416464726573733042616c616e63654f663c543e0004000014546f74616c01003042616c616e63654f663c543e4000000000000000000000000000000000001c56657374696e670001013c457468657265756d41646472657373b02842616c616e63654f663c543e2c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265722900040010782056657374696e67207363686564756c6520666f72206120636c61696d2e0d012046697273742062616c616e63652069732074686520746f74616c20616d6f756e7420746861742073686f756c642062652068656c6420666f722076657374696e672ee4205365636f6e642062616c616e636520697320686f77206d7563682073686f756c6420626520756e6c6f636b65642070657220626c6f636b2ecc2054686520626c6f636b206e756d626572206973207768656e207468652076657374696e672073686f756c642073746172742e010814636c61696d08106465737430543a3a4163636f756e74496448657468657265756d5f7369676e61747572653845636473615369676e61747572650438204d616b65206120636c61696d2e286d696e745f636c61696d0c0c77686f3c457468657265756d416464726573731476616c75653042616c616e63654f663c543e4076657374696e675f7363686564756c65d04f7074696f6e3c2842616c616e63654f663c543e2c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d626572293e0488204164642061206e657720636c61696d2c20696620796f752061726520726f6f742e01041c436c61696d65640c244163636f756e7449643c457468657265756d416464726573731c42616c616e6365046c20536f6d656f6e6520636c61696d656420736f6d6520444f54732e041850726566697814265b75385d807c506179204b534d7320746f20746865204b7573616d61206163636f756e743a04150120546865205072656669782074686174206973207573656420696e207369676e656420457468657265756d206d6573736167657320666f722074686973206e6574776f726b002850617261636861696e73012850617261636861696e73242c417574686f7269746965730100405665633c56616c696461746f7249643e0400049420416c6c20617574686f72697469657327206b65797320617420746865206d6f6d656e742e10436f6465000101185061726149641c5665633c75383e0004000498205468652070617261636861696e7320726567697374657265642061742070726573656e742e144865616473000101185061726149641c5665633c75383e00040004cc20546865206865616473206f66207468652070617261636861696e7320726567697374657265642061742070726573656e742e2857617465726d61726b730001011850617261496438543a3a426c6f636b4e756d6265720004000cfc205468652077617465726d61726b2068656967687473206f66207468652070617261636861696e7320726567697374657265642061742070726573656e742e410120466f722065766572792070617261636861696e2c20746869732069732074686520626c6f636b206865696768742066726f6d20776869636820616c6c206d6573736167657320746172676574696e675d0120746861742070617261636861696e2068617665206265656e2070726f6365737365642e2043616e20626520604e6f6e6560206f6e6c79206966207468652070617261636861696e20646f65736e27742065786973742e3c556e726f75746564496e67726573730001016028543a3a426c6f636b4e756d6265722c20506172614964294c5665633c285061726149642c2048617368293e00040010550120556e726f7574656420696e67726573732e204d6170732028426c6f636b4e756d6265722c20746f5f636861696e2920706169727320746f205b2866726f6d5f636861696e2c206567726573735f726f6f74295d2e004d01205468657265206d617920626520616e20656e74727920756e6465722028692c20702920696e2074686973206d617020666f722065766572792069206265747765656e207468652070617261636861696e2773842077617465726d61726b20616e64207468652063757272656e7420626c6f636b2e4852656c61794469737061746368517565756501010118506172614964485665633c5570776172644d6573736167653e000400081d01204d6573736167657320726561647920746f2062652064697370617463686564206f6e746f207468652072656c617920636861696e2e204974206973207375626a65637420746fc820604d41585f4d4553534147455f434f554e546020616e64206057415445524d41524b5f4d4553534147455f53495a45602e5852656c61794469737061746368517565756553697a650101011850617261496428287533322c2075333229002000000000000000000c45012053697a65206f6620746865206469737061746368207175657565732e205365706172617465642066726f6d2061637475616c206461746120696e206f7264657220746f2061766f696420636f73746c795901206465636f64696e67207768656e20636865636b696e6720726563656970742076616c69646974792e204669727374206974656d20696e207475706c652069732074686520636f756e74206f66206d65737361676573fc097365636f6e642069662074686520746f74616c206c656e6774682028696e20627974657329206f6620746865206d657373616765207061796c6f6164732e344e65656473446973706174636801002c5665633c5061726149643e040004110120546865206f726465726564206c697374206f662050617261496473207468617420686176652061206052656c6179446973706174636851756575656020656e7472792e2444696455706461746500002c5665633c5061726149643e040010650120536f6d65206966207468652070617261636861696e20686561647320676574207570646174656420696e207468697320626c6f636b2c20616c6f6e672077697468207468652070617261636861696e204944732074686174350120646964207570646174652e204f72646572656420696e207468652073616d652077617920617320607265676973747261723a3a416374697665602028692e652e20627920506172614964292e0064204e6f6e65206966206e6f742079657420757064617465642e0104247365745f686561647304146865616473585665633c417474657374656443616e6469646174653e0415012050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e000000304174746573746174696f6e7301304174746573746174696f6e730c40526563656e7450617261426c6f636b7300010138543a3a426c6f636b4e756d62657244496e636c75646564426c6f636b733c543e00040008f02041206d617070696e672066726f6d206d6f64756c617220626c6f636b206e756d62657220286e2025204174746573746174696f6e506572696f6429cc20746f2073657373696f6e20696e64657820616e6420746865206c697374206f662063616e646964617465206861736865732e5450617261426c6f636b4174746573746174696f6e7300020138543a3a426c6f636b4e756d626572104861736850426c6f636b4174746573746174696f6e733c543e00040004a8204174746573746174696f6e73206f6e206120726563656e742070617261636861696e20626c6f636b2e24446964557064617465010010626f6f6c0400000104446d6f72655f6174746573746174696f6e7304145f6d6f7265404d6f72654174746573746174696f6e730415012050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e00000014536c6f74730114536c6f7473243841756374696f6e436f756e74657201003041756374696f6e496e646578100000000004d820546865206e756d626572206f662061756374696f6e7320746861742068617665206265656e207374617274656420736f206661722e284d616e6167656449647301002c5665633c5061726149643e0400084d01204f726465726564206c697374206f6620616c6c2060506172614964602076616c756573207468617420617265206d616e616765642062792074686973206d6f64756c652e205468697320696e636c75646573290120636861696e73207468617420617265206e6f7420796574206465706c6f7965642028627574206861766520776f6e20616e2061756374696f6e20696e2074686520667574757265292e204465706f7369747301010118506172614964445665633c42616c616e63654f663c543e3e000400345d0120566172696f757320616d6f756e7473206f6e206465706f73697420666f7220656163682070617261636861696e2e20416e20656e74727920696e20604d616e616765644964736020696d706c6965732061206e6f6e2d502064656661756c7420656e74727920686572652e006501205468652061637475616c20616d6f756e74206c6f636b6564206f6e2069747320626568616c6620617420616e792074696d6520697320746865206d6178696d756d206974656d20696e2074686973206c6973742e205468655101206669727374206974656d20696e20746865206c6973742069732074686520616d6f756e74206c6f636b656420666f72207468652063757272656e74204c6561736520506572696f642e20466f6c6c6f77696e67b0206974656d732061726520666f72207468652073756273657175656e74206c6561736520706572696f64732e006101205468652064656661756c742076616c75652028616e20656d707479206c6973742920696d706c6965732074686174207468652070617261636861696e206e6f206c6f6e6765722065786973747320286f72206e65766572b4206578697374656429206173206661722061732074686973206d6f64756c6520697320636f6e6365726e65642e00510120496620612070617261636861696e20646f65736e2774206578697374202a7965742a20627574206973207363686564756c656420746f20657869737420696e20746865206675747572652c207468656e2069745d012077696c6c206265206c6566742d7061646465642077697468206f6e65206f72206d6f7265207a65726f657320746f2064656e6f74652074686520666163742074686174206e6f7468696e672069732068656c64206f6e5d01206465706f73697420666f7220746865206e6f6e2d6578697374656e7420636861696e2063757272656e746c792c206275742069732068656c6420617420736f6d6520706f696e7420696e20746865206675747572652e2c41756374696f6e496e666f000088284c65617365506572696f644f663c543e2c20543a3a426c6f636b4e756d62657229040014f820496e666f726d6174696f6e2072656c6174696e6720746f207468652063757272656e742061756374696f6e2c206966207468657265206973206f6e652e00450120546865206669727374206974656d20696e20746865207475706c6520697320746865206c6561736520706572696f6420696e646578207468617420746865206669727374206f662074686520666f7572510120636f6e746967756f7573206c6561736520706572696f6473206f6e2061756374696f6e20697320666f722e20546865207365636f6e642069732074686520626c6f636b206e756d626572207768656e207468655d012061756374696f6e2077696c6c2022626567696e20746f20656e64222c20692e652e2074686520666972737420626c6f636b206f662074686520456e64696e6720506572696f64206f66207468652061756374696f6e2e1c57696e6e696e6700010138543a3a426c6f636b4e756d6265723857696e6e696e67446174613c543e0004000c5d01205468652077696e6e696e67206269647320666f722065616368206f66207468652031302072616e676573206174206561636820626c6f636b20696e207468652066696e616c20456e64696e6720506572696f64206f665101207468652063757272656e742061756374696f6e2e20546865206d61702773206b65792069732074686520302d626173656420696e64657820696e746f2074686520456e64696e6720506572696f642e205468651d0120666972737420626c6f636b206f662074686520656e64696e6720706572696f6420697320303b20746865206c6173742069732060456e64696e67506572696f64202d2031602e3c5265736572766564416d6f756e7473000101504269646465723c543a3a4163636f756e7449643e3042616c616e63654f663c543e00040008310120416d6f756e74732063757272656e746c7920726573657276656420696e20746865206163636f756e7473206f662074686520626964646572732063757272656e746c792077696e6e696e673820287375622d2972616e6765732e304f6e626f6172645175657565010101404c65617365506572696f644f663c543e2c5665633c5061726149643e0004000865012054686520736574206f662050617261204944732074686174206861766520776f6e20616e64206e65656420746f206265206f6e2d626f617264656420617420616e207570636f6d696e67206c656173652d706572696f642ef0205468697320697320636c6561726564206f7574206f6e2074686520666972737420626c6f636b206f6620746865206c6561736520706572696f642e284f6e626f617264696e6700010118506172614964f0284c65617365506572696f644f663c543e2c20496e636f6d696e6750617261636861696e3c543a3a4163636f756e7449642c20543a3a486173683e29000400104d01205468652061637475616c206f6e2d626f617264696e6720696e666f726d6174696f6e2e204f6e6c7920657869737473207768656e206f6e65206f662074686520666f6c6c6f77696e6720697320747275653a2501202d204974206973206265666f726520746865206c6561736520706572696f642074686174207468652070617261636861696e2073686f756c64206265206f6e2d626f61726465642e5901202d205468652066756c6c206f6e2d626f617264696e6720696e666f726d6174696f6e20686173206e6f7420796574206265656e2070726f766964656420616e64207468652070617261636861696e206973206e6f746c207965742064756520746f206265206f66662d626f61726465642e2c4f6666626f617264696e670101011850617261496430543a3a4163636f756e74496400800000000000000000000000000000000000000000000000000000000000000000086501204f66662d626f617264696e67206163636f756e743b2063757272656e63792068656c64206f6e206465706f73697420666f72207468652070617261636861696e206765747320706c6163656420686572652069662074686539012070617261636861696e2067657473206f66662d626f61726465643b20692e652e20697473206c6561736520706572696f6420697320757020616e642069742069736e27742072656e657765642e01182c6e65775f61756374696f6e08206475726174696f6e5c436f6d706163743c543a3a426c6f636b4e756d6265723e486c656173655f706572696f645f696e64657864436f6d706163743c4c65617365506572696f644f663c543e3e1458204372656174652061206e65772061756374696f6e2e00550120546869732063616e206f6e6c792068617070656e207768656e2074686572652069736e277420616c726561647920616e2061756374696f6e20696e2070726f677265737320616e64206d6179206f6e6c7920626529012063616c6c65642062792074686520726f6f74206f726967696e2e20416363657074732074686520606475726174696f6e60206f6620746869732061756374696f6e20616e64207468655d0120606c656173655f706572696f645f696e64657860206f662074686520696e697469616c206c6561736520706572696f64206f662074686520666f757220746861742061726520746f2062652061756374696f6e65642e0c626964140c73756238436f6d706163743c53756249643e3461756374696f6e5f696e64657854436f6d706163743c41756374696f6e496e6465783e2866697273745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e246c6173745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e18616d6f756e7454436f6d706163743c42616c616e63654f663c543e3e404d01204d616b652061206e6577206269642066726f6d20616e206163636f756e742028696e636c7564696e6720612070617261636861696e206163636f756e742920666f72206465706c6f79696e672061206e65772c2070617261636861696e2e005d01204d756c7469706c652073696d756c74616e656f757320626964732066726f6d207468652073616d65206269646465722061726520616c6c6f776564206f6e6c79206173206c6f6e6720617320616c6c2061637469766541012062696473206f7665726c61702065616368206f746865722028692e652e20617265206d757475616c6c79206578636c7573697665292e20426964732063616e6e6f742062652072656461637465642e005901202d20607375626020697320746865207375622d6269646465722049442c20616c6c6f77696e6720666f72206d756c7469706c6520636f6d706574696e67206269647320746f206265206d6164652062792028616e64742066756e64656420627929207468652073616d65206163636f756e742e5101202d206061756374696f6e5f696e646578602069732074686520696e646578206f66207468652061756374696f6e20746f20626964206f6e2e2053686f756c64206a757374206265207468652070726573656e746c2076616c7565206f66206041756374696f6e436f756e746572602e4d01202d206066697273745f736c6f746020697320746865206669727374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4501202d20606c6173745f736c6f746020697320746865206c617374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4d01202d2060616d6f756e74602069732074686520616d6f756e7420746f2062696420746f2062652068656c64206173206465706f73697420666f72207468652070617261636861696e2073686f756c6420746865cc206269642077696e2e205468697320616d6f756e742069732068656c64207468726f7567686f7574207468652072616e67652e246269645f72656e6577103461756374696f6e5f696e64657854436f6d706163743c41756374696f6e496e6465783e2866697273745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e246c6173745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e18616d6f756e7454436f6d706163743c42616c616e63654f663c543e3e3c5101204d616b652061206e6577206269642066726f6d20612070617261636861696e206163636f756e7420666f722072656e6577696e67207468617420287072652d6578697374696e67292070617261636861696e2e00a820546865206f726967696e202a6d7573742a20626520612070617261636861696e206163636f756e742e005d01204d756c7469706c652073696d756c74616e656f757320626964732066726f6d207468652073616d65206269646465722061726520616c6c6f776564206f6e6c79206173206c6f6e6720617320616c6c2061637469766541012062696473206f7665726c61702065616368206f746865722028692e652e20617265206d757475616c6c79206578636c7573697665292e20426964732063616e6e6f742062652072656461637465642e005101202d206061756374696f6e5f696e646578602069732074686520696e646578206f66207468652061756374696f6e20746f20626964206f6e2e2053686f756c64206a757374206265207468652070726573656e746c2076616c7565206f66206041756374696f6e436f756e746572602e4d01202d206066697273745f736c6f746020697320746865206669727374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4501202d20606c6173745f736c6f746020697320746865206c617374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4d01202d2060616d6f756e74602069732074686520616d6f756e7420746f2062696420746f2062652068656c64206173206465706f73697420666f72207468652070617261636861696e2073686f756c6420746865cc206269642077696e2e205468697320616d6f756e742069732068656c64207468726f7567686f7574207468652072616e67652e3c7365745f6f6666626f617264696e670410646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636514c82053657420746865206f66662d626f617264696e6720696e666f726d6174696f6e20666f7220612070617261636861696e2e00a820546865206f726967696e202a6d7573742a20626520612070617261636861696e206163636f756e742e002101202d20606465737460206973207468652064657374696e6174696f6e206163636f756e7420746f2072656365697665207468652070617261636861696e2773206465706f7369742e3c6669785f6465706c6f795f64617461100c73756238436f6d706163743c53756249643e1c706172615f69643c436f6d706163743c5061726149643e24636f64655f686173681c543a3a4861736844696e697469616c5f686561645f646174611c5665633c75383e1c2d012053657420746865206465706c6f7920696e666f726d6174696f6e20666f722061207375636365737366756c2062696420746f206465706c6f792061206e65772070617261636861696e2e00c8202d20606f726967696e60206d75737420626520746865207375636365737366756c20626964646572206163636f756e742eb0202d20607375626020697320746865207375622d626964646572204944206f6620746865206269646465722e0101202d2060706172615f696460206973207468652070617261636861696e20494420616c6c6f7474656420746f207468652077696e6e696e67206269646465722e1d01202d2060636f64655f6861736860206973207468652068617368206f66207468652070617261636861696e2773205761736d2076616c69646174696f6e2066756e6374696f6e2ef0202d2060696e697469616c5f686561645f6461746160206973207468652070617261636861696e277320696e697469616c206865616420646174612e54656c61626f726174655f6465706c6f795f64617461081c706172615f69643c436f6d706163743c5061726149643e10636f64651c5665633c75383e3074204e6f74652061206e65772070617261636861696e277320636f64652e004d012054686973206d7573742062652063616c6c656420616674657220606669785f6465706c6f795f646174616020616e642060636f646560206d7573742062652074686520707265696d616765206f6620746865c42060636f64655f68617368602070617373656420746865726520666f72207468652073616d652060706172615f6964602e0061012054686973206d61792062652063616c6c6564206265666f7265206f722061667465722074686520626567696e6e696e67206f66207468652070617261636861696e2773206669727374206c6561736520706572696f642e45012049662063616c6c6564206265666f7265207468656e207468652070617261636861696e2077696c6c206265636f6d65206163746976652061742074686520666972737420626c6f636b206f66206974736501207374617274696e67206c6561736520706572696f642e2049662061667465722c207468656e2069742077696c6c206265636f6d652061637469766520696d6d6564696174656c7920616674657220746869732063616c6c2e006c202d20605f6f726967696e6020697320697272656c6576616e742efc202d2060706172615f696460206973207468652070617261636861696e2049442077686f736520636f64652077696c6c20626520656c61626f72617465642e1501202d2060636f6465602069732074686520707265696d616765206f662074686520726567697374657265642060636f64655f6861736860206f662060706172615f6964602e011c384e65774c65617365506572696f64042c4c65617365506572696f6404842041206e6577206c6561736520706572696f6420697320626567696e6e696e672e3841756374696f6e537461727465640c3041756374696f6e496e6465782c4c65617365506572696f642c426c6f636b4e756d626572084d0120416e2061756374696f6e20737461727465642e2050726f76696465732069747320696e64657820616e642074686520626c6f636b206e756d6265722077686572652069742077696c6c20626567696e20746f190120636c6f736520616e6420746865206669727374206c6561736520706572696f64206f662074686520717561647275706c657420746861742069732061756374696f6e65642e3441756374696f6e436c6f736564043041756374696f6e496e64657804bc20416e2061756374696f6e20656e6465642e20416c6c2066756e6473206265636f6d6520756e72657365727665642e24576f6e4465706c6f7910504e65774269646465723c4163636f756e7449643e24536c6f7452616e6765185061726149641c42616c616e636504550120536f6d656f6e6520776f6e2074686520726967687420746f206465706c6f7920612070617261636861696e2e2042616c616e636520616d6f756e7420697320646564756374656420666f72206465706f7369742e28576f6e52656e6577616c101850617261496424536c6f7452616e67651c42616c616e63651c42616c616e636508c420416e206578697374696e672070617261636861696e20776f6e2074686520726967687420746f20636f6e74696e75652e41012046697273742062616c616e63652069732074686520657874726120616d6f756e7420726573657665642e205365636f6e642069732074686520746f74616c20616d6f756e742072657365727665642e2052657365727665640c244163636f756e7449641c42616c616e63651c42616c616e6365084d012046756e6473207765726520726573657276656420666f7220612077696e6e696e67206269642e2046697273742062616c616e63652069732074686520657874726120616d6f756e742072657365727665642e54205365636f6e642069732074686520746f74616c2e28556e726573657276656408244163636f756e7449641c42616c616e636504e02046756e6473207765726520756e72657365727665642073696e636520626964646572206973206e6f206c6f6e676572206163746976652e0000245265676973747261720124526567697374726172242850617261636861696e7301002c5665633c5061726149643e0400002c546872656164436f756e7401000c753332100000000004b420546865206e756d626572206f66207468726561647320746f207363686564756c652070657220626c6f636b2e3c53656c6563746564546872656164730100785665633c5665633c285061726149642c20436f6c6c61746f724964293e3e040008510120416e206172726179206f6620746865207175657565206f6620736574206f662074687265616473207363686564756c656420666f722074686520636f6d696e6720626c6f636b733b206f726465726564206279310120617363656e64696e6720706172612049442e2054686572652063616e206265206e6f206475706c696361746573206f66207061726120494420696e2065616368206c697374206974656d2e184163746976650100b85665633c285061726149642c204f7074696f6e3c28436f6c6c61746f7249642c20526574726961626c65293e293e0400185d012050617261746872656164732f636861696e73207363686564756c656420666f7220657865637574696f6e207468697320626c6f636b2e2049662074686520636f6c6c61746f72204944206973207365742c207468656e6101206120706172746963756c617220636f6c6c61746f722068617320616c7265616479206265656e2063686f73656e20666f7220746865206e65787420626c6f636b2c20616e64206e6f206f7468657220636f6c6c61746f725901206d61792070726f766964652074686520626c6f636b2e20496e2074686973206361736520776520616c6c6f772074686520706f73736962696c697479206f662074686520636f6d62696e6174696f6e206265696e67d0207265747269656420696e2061206c6174657220626c6f636b2c206578707265737365642062792060526574726961626c65602e004c204f726465726564206279205061726149642e284e65787446726565496401001850617261496410e8030000083d0120546865206e65787420756e75736564205061726149642076616c75652e2053746172742074686973206869676820696e206f7264657220746f206b656570206c6f77206e756d6265727320666f72542073797374656d2d6c6576656c20636861696e732e2c50656e64696e6753776170000101185061726149641850617261496400040004642050656e64696e672073776170206f7065726174696f6e732e145061726173000101185061726149642050617261496e666f00040004a8204d6170206f6620616c6c20726567697374657265642070617261746872656164732f636861696e732e28526574727951756575650100785665633c5665633c285061726149642c20436f6c6c61746f724964293e3e040004e8205468652063757272656e7420717565756520666f7220706172617468726561647320746861742073686f756c6420626520726574726965642e1c446562746f72730101011850617261496430543a3a4163636f756e7449640080000000000000000000000000000000000000000000000000000000000000000004ac2055736572732077686f20686176652070616964206120706172617468726561642773206465706f736974011c3472656769737465725f70617261100869643c436f6d706163743c5061726149643e10696e666f2050617261496e666f10636f64651c5665633c75383e44696e697469616c5f686561645f646174611c5665633c75383e089820526567697374657220612070617261636861696e207769746820676976656e20636f64652e8c204661696c7320696620676976656e20494420697320616c726561647920757365642e3c646572656769737465725f70617261040869643c436f6d706163743c5061726149643e0494204465726567697374657220612070617261636861696e207769746820676976656e206964407365745f7468726561645f636f756e740414636f756e740c75333214410120526573657420746865206e756d626572206f6620706172617468726561647320746861742063616e2070617920746f206265207363686564756c656420696e20612073696e676c6520626c6f636b2e0098202d2060636f756e74603a20546865206e756d626572206f662070617261746872656164732e0084204d7573742062652063616c6c65642066726f6d20526f6f74206f726967696e2e4c72656769737465725f706172617468726561640810636f64651c5665633c75383e44696e697469616c5f686561645f646174611c5665633c75383e10a42052656769737465722061207061726174687265616420666f7220696d6d656469617465207573652e004d01204d7573742062652073656e742066726f6d2061205369676e6564206f726967696e20746861742069732061626c6520746f206861766520506172617468726561644465706f7369742072657365727665642e39012060636f64656020616e642060696e697469616c5f686561645f646174616020617265207573656420746f20696e697469616c697a6520746865207061726174687265616427732073746174652e4473656c6563745f706172617468726561640c0c5f69643c436f6d706163743c5061726149643e245f636f6c6c61746f7228436f6c6c61746f724964285f686561645f686173681c543a3a4861736814050120506c61636520612062696420666f722061207061726174687265616420746f2062652070726f6772657373656420696e20746865206e65787420626c6f636b2e00410120546869732069732061206b696e64206f66207370656369616c207472616e73616374696f6e20746861742073686f756c642062652068656176696c79207072696f726974697a656420696e207468655d01207472616e73616374696f6e20706f6f6c206163636f7264696e6720746f20746865206076616c7565603b206f6e6c792060546872656164436f756e7460206f66207468656d206d61792062652070726573656e7465645420696e20616e792073696e676c6520626c6f636b2e54646572656769737465725f70617261746872656164001cc820446572656769737465722061207061726174687265616420616e6420726574726965766520746865206465706f7369742e002101204d7573742062652073656e742066726f6d2061206050617261636861696e60206f726967696e2077686963682069732063757272656e746c79206120706172617468726561642e00590120456e737572652074686174206265666f72652063616c6c696e672074686973207468617420616e792066756e647320796f752077616e7420656d70746965642066726f6d20746865207061726174687265616427734501206163636f756e74206973206d6f766564206f75743b20616674657220746869732069742077696c6c20626520696d706f737369626c6520746f207265747269657665207468656d2028776974686f75746820676f7665726e616e636520696e74657276656e74696f6e292e107377617004146f746865723c436f6d706163743c5061726149643e206501205377617020612070617261636861696e207769746820616e6f746865722070617261636861696e206f7220706172617468726561642e20546865206f726967696e206d7573742062652061206050617261636861696e602e65012054686520737761702077696c6c2068617070656e206f6e6c7920696620746865726520697320616c726561647920616e206f70706f7369746520737761702070656e64696e672e204966207468657265206973206e6f742c5d012074686520737761702077696c6c2062652073746f72656420696e207468652070656e64696e67207377617073206d61702c20726561647920666f722061206c6174657220636f6e6669726d61746f727920737761702e00610120546865206050617261496460732072656d61696e206d617070656420746f207468652073616d652068656164206461746120616e6420636f646520736f2065787465726e616c20636f64652063616e2072656c79206f6e410120605061726149646020746f2062652061206c6f6e672d7465726d206964656e746966696572206f662061206e6f74696f6e616c202270617261636861696e222e20486f77657665722c2074686569725901207363686564756c696e6720696e666f2028692e652e2077686574686572207468657927726520612070617261746872656164206f722070617261636861696e292c2061756374696f6e20696e666f726d6174696f6e9820616e64207468652061756374696f6e206465706f736974206172652073776974636865642e0108505061726174687265616452656769737465726564041850617261496404d4204120706172617468726561642077617320726567697374657265643b20697473206e657720494420697320737570706c6965642e5850617261746872656164446572656769737465726564041850617261496404d4205468652070617261746872656164206f662074686520737570706c696564204944207761732064652d726567697374657265642e00001c5574696c697479011c5574696c69747904244d756c74697369677300020530543a3a4163636f756e744964205b75383b2033325dd04d756c74697369673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e02040004942054686520736574206f66206f70656e206d756c7469736967206f7065726174696f6e732e0114146261746368041463616c6c735c5665633c3c542061732054726169743e3a3a43616c6c3e48802053656e642061206261746368206f662064697370617463682063616c6c732e00ec20546869732077696c6c206578656375746520756e74696c20746865206669727374206f6e65206661696c7320616e64207468656e2073746f702e007c204d61792062652063616c6c65642066726f6d20616e79206f726967696e2e00f0202d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e002c2023203c7765696768743ea4202d205468652073756d206f66207468652077656967687473206f6620746865206063616c6c73602e34202d204f6e65206576656e742e302023203c2f7765696768743e00590120546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e3501206576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e20746865590120604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d616465510120616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c657465646050206576656e74206973206465706f73697465642e1861735f7375620814696e6465780c7531361063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e1ce02053656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e70202d2054686520776569676874206f6620746865206063616c6c602e302023203c2f7765696768743e2061735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e1063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3ea4590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e00b42049662074686572652061726520656e6f7567682c207468656e206469737061746368207468652063616c6c2e005101205061796d656e743a20604d756c74697369674465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573610120607468726573686f6c64602074696d657320604d756c74697369674465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2e8c202d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e002101204e4f54453a20556e6c6573732074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2067656e6572616c6c792077616e7420746f207573651d012060617070726f76655f61735f6d756c74696020696e73746561642c2073696e6365206974206f6e6c7920726571756972657320612068617368206f66207468652063616c6c2e005d0120526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c7420696620607468726573686f6c64602069732065786163746c79206031602e204f74686572776973655901206f6e20737563636573732c20726573756c7420697320604f6b6020616e642074686520726573756c742066726f6d2074686520696e746572696f722063616c6c2c206966206974207761732065786563757465642ce0206d617920626520666f756e6420696e20746865206465706f736974656420604d756c7469736967457865637574656460206576656e742e002c2023203c7765696768743e54202d20604f2853202b205a202b2043616c6c29602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2e2501202d204f6e652063616c6c20656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285a296020776865726520605a602069732074782d6c656e2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e70202d2054686520776569676874206f6620746865206063616c6c602e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66f4202020604d756c74697369674465706f73697442617365202b207468726573686f6c64202a204d756c74697369674465706f736974466163746f72602e302023203c2f7765696768743e40617070726f76655f61735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e2463616c6c5f68617368205b75383b2033325d80590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e005101205061796d656e743a20604d756c74697369674465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573610120607468726573686f6c64602074696d657320604d756c74697369674465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e003901204e4f54453a2049662074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2077616e7420746f20757365206061735f6d756c74696020696e73746561642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66f4202020604d756c74697369674465706f73697442617365202b207468726573686f6c64202a204d756c74697369674465706f736974466163746f72602e302023203c2f7765696768743e3c63616e63656c5f61735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e2474696d65706f696e746454696d65706f696e743c543a3a426c6f636b4e756d6265723e2463616c6c5f68617368205b75383b2033325d5859012043616e63656c2061207072652d6578697374696e672c206f6e2d676f696e67206d756c7469736967207472616e73616374696f6e2e20416e79206465706f7369742072657365727665642070726576696f75736c79c820666f722074686973206f7065726174696f6e2077696c6c20626520756e7265736572766564206f6e20737563636573732e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e6101202d206074696d65706f696e74603a205468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c7c207472616e73616374696f6e20666f7220746869732064697370617463682ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602e34202d204f6e65206576656e742e88202d20492f4f3a2031207265616420604f285329602c206f6e652072656d6f76652e74202d2053746f726167653a2072656d6f766573206f6e65206974656d2e302023203c2f7765696768743e0118404261746368496e746572727570746564080c7533323444697370617463684572726f72085901204261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c2061734c2077656c6c20617320746865206572726f722e384261746368436f6d706c657465640004cc204261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e2c4e65774d756c746973696708244163636f756e744964244163636f756e7449640849012041206e6577206d756c7469736967206f7065726174696f6e2068617320626567756e2e20466972737420706172616d20697320746865206163636f756e74207468617420697320617070726f76696e672c80207365636f6e6420697320746865206d756c7469736967206163636f756e742e404d756c7469736967417070726f76616c0c244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449640859012041206d756c7469736967206f7065726174696f6e20686173206265656e20617070726f76656420627920736f6d656f6e652e20466972737420706172616d20697320746865206163636f756e742074686174206973a820617070726f76696e672c20746869726420697320746865206d756c7469736967206163636f756e742e404d756c7469736967457865637574656410244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e744964384469737061746368526573756c74082d012041206d756c7469736967206f7065726174696f6e20686173206265656e2065786563757465642e20466972737420706172616d20697320746865206163636f756e742074686174206973a820617070726f76696e672c20746869726420697320746865206d756c7469736967206163636f756e742e444d756c746973696743616e63656c6c65640c244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449640831012041206d756c7469736967206f7065726174696f6e20686173206265656e2063616e63656c6c65642e20466972737420706172616d20697320746865206163636f756e742074686174206973ac2063616e63656c6c696e672c20746869726420697320746865206d756c7469736967206163636f756e742e0000204964656e7469747901105375646f10284964656e746974794f6600010130543a3a4163636f756e74496468526567697374726174696f6e3c42616c616e63654f663c543e3e00040004210120496e666f726d6174696f6e20746861742069732070657274696e656e7420746f206964656e746966792074686520656e7469747920626568696e6420616e206163636f756e742e1c53757065724f6600010130543a3a4163636f756e7449645028543a3a4163636f756e7449642c204461746129000400086101205468652073757065722d6964656e74697479206f6620616e20616c7465726e6174697665202273756222206964656e7469747920746f676574686572207769746820697473206e616d652c2077697468696e2074686174510120636f6e746578742e20496620746865206163636f756e74206973206e6f7420736f6d65206f74686572206163636f756e742773207375622d6964656e746974792c207468656e206a75737420604e6f6e65602e18537562734f6601010130543a3a4163636f756e744964842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29004400000000000000000000000000000000000cb820416c7465726e6174697665202273756222206964656e746974696573206f662074686973206163636f756e742e001d0120546865206669727374206974656d20697320746865206465706f7369742c20746865207365636f6e64206973206120766563746f72206f6620746865206163636f756e74732e28526567697374726172730100d85665633c4f7074696f6e3c526567697374726172496e666f3c42616c616e63654f663c543e2c20543a3a4163636f756e7449643e3e3e0400104d012054686520736574206f6620726567697374726172732e204e6f7420657870656374656420746f206765742076657279206269672061732063616e206f6e6c79206265206164646564207468726f7567682061a8207370656369616c206f726967696e20286c696b656c79206120636f756e63696c206d6f74696f6e292e0029012054686520696e64657820696e746f20746869732063616e206265206361737420746f2060526567697374726172496e6465786020746f2067657420612076616c69642076616c75652e012c346164645f726567697374726172041c6163636f756e7430543a3a4163636f756e744964347c2041646420612072656769737472617220746f207468652073797374656d2e001d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605265676973747261724f726967696e60206f722060526f6f74602e00ac202d20606163636f756e74603a20746865206163636f756e74206f6620746865207265676973747261722e009820456d6974732060526567697374726172416464656460206966207375636365737366756c2e002c2023203c7765696768743ee4202d20604f2852296020776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e646564292e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e307365745f6964656e746974790410696e666f304964656e74697479496e666f482d012053657420616e206163636f756e742773206964656e7469747920696e666f726d6174696f6e20616e6420726573657276652074686520617070726f707269617465206465706f7369742e00590120496620746865206163636f756e7420616c726561647920686173206964656e7469747920696e666f726d6174696f6e2c20746865206465706f7369742069732074616b656e2061732070617274207061796d656e745420666f7220746865206e6577206465706f7369742e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e0090202d2060696e666f603a20546865206964656e7469747920696e666f726d6174696f6e2e008c20456d69747320604964656e7469747953657460206966207375636365737366756c2e002c2023203c7765696768743e0501202d20604f2858202b2052296020776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e646564292e88202d204174206d6f73742074776f2062616c616e6365206f7065726174696f6e732eac202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f2858202b20522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e207365745f73756273041073756273645665633c28543a3a4163636f756e7449642c2044617461293e40902053657420746865207375622d6163636f756e7473206f66207468652073656e6465722e005901205061796d656e743a20416e79206167677265676174652062616c616e63652072657365727665642062792070726576696f757320607365745f73756273602063616c6c732077696c6c2062652072657475726e6564310120616e6420616e20616d6f756e7420605375624163636f756e744465706f736974602077696c6c20626520726573657276656420666f722065616368206974656d20696e206073756273602e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e009c202d206073756273603a20546865206964656e746974792773207375622d6163636f756e74732e002c2023203c7765696768743eec202d20604f285329602077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e88202d204174206d6f73742074776f2062616c616e6365206f7065726174696f6e732e4101202d204174206d6f7374204f2832202a2053202b2031292073746f72616765206d75746174696f6e733b20636f64656320636f6d706c657869747920604f2831202a2053202b2053202a20312960293b582020206f6e652073746f726167652d6578697374732e302023203c2f7765696768743e38636c6561725f6964656e74697479003c390120436c65617220616e206163636f756e742773206964656e7469747920696e666f20616e6420616c6c207375622d6163636f756e7420616e642072657475726e20616c6c206465706f736974732e00f0205061796d656e743a20416c6c2072657365727665642062616c616e636573206f6e20746865206163636f756e74206172652072657475726e65642e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e009c20456d69747320604964656e74697479436c656172656460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2852202b2053202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e74202d206053202b2032602073746f726167652064656c6574696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e44726571756573745f6a756467656d656e7408247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e1c6d61785f66656554436f6d706163743c42616c616e63654f663c543e3e5c9820526571756573742061206a756467656d656e742066726f6d2061207265676973747261722e005901205061796d656e743a204174206d6f737420606d61785f666565602077696c6c20626520726573657276656420666f72207061796d656e7420746f2074686520726567697374726172206966206a756467656d656e741c20676976656e2e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e002101202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973207265717565737465642e5901202d20606d61785f666565603a20546865206d6178696d756d206665652074686174206d617920626520706169642e20546869732073686f756c64206a757374206265206175746f2d706f70756c617465642061733a0034206060606e6f636f6d70696c65a42053656c663a3a72656769737472617273287265675f696e646578292e75776e72617028292e666565102060606000a820456d69747320604a756467656d656e7452657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2858202b205229602e34202d204f6e65206576656e742e302023203c2f7765696768743e3863616e63656c5f7265717565737404247265675f696e64657838526567697374726172496e646578446c2043616e63656c20612070726576696f757320726571756573742e00fc205061796d656e743a20412070726576696f75736c79207265736572766564206465706f7369742069732072657475726e6564206f6e20737563636573732e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e004901202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206e6f206c6f6e676572207265717565737465642e00b020456d69747320604a756467656d656e74556e72657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e8c202d204f6e652073746f72616765206d75746174696f6e20604f2852202b205829602e34202d204f6e65206576656e742e302023203c2f7765696768743e1c7365745f6665650814696e6465785c436f6d706163743c526567697374726172496e6465783e0c66656554436f6d706163743c42616c616e63654f663c543e3e301d0120536574207468652066656520726571756972656420666f722061206a756467656d656e7420746f206265207265717565737465642066726f6d2061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e58202d2060666565603a20746865206e6577206665652e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602e302023203c2f7765696768743e387365745f6163636f756e745f69640814696e6465785c436f6d706163743c526567697374726172496e6465783e0c6e657730543a3a4163636f756e74496430c0204368616e676520746865206163636f756e74206173736f63696174656420776974682061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e74202d20606e6577603a20746865206e6577206163636f756e742049442e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602e302023203c2f7765696768743e287365745f6669656c64730814696e6465785c436f6d706163743c526567697374726172496e6465783e186669656c6473384964656e746974794669656c647330ac2053657420746865206669656c6420696e666f726d6174696f6e20666f722061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e1101202d20606669656c6473603a20746865206669656c64732074686174207468652072656769737472617220636f6e6365726e73207468656d73656c76657320776974682e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602e302023203c2f7765696768743e4470726f766964655f6a756467656d656e740c247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365246a756467656d656e745c4a756467656d656e743c42616c616e63654f663c543e3e4cbc2050726f766964652061206a756467656d656e7420666f7220616e206163636f756e742773206964656e746974792e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74b4206f6620746865207265676973747261722077686f736520696e64657820697320607265675f696e646578602e002501202d20607265675f696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206265696e67206d6164652e5901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e4d01202d20606a756467656d656e74603a20746865206a756467656d656e74206f662074686520726567697374726172206f6620696e64657820607265675f696e646578602061626f75742060746172676574602e009820456d69747320604a756467656d656e74476976656e60206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e88202d204f6e652062616c616e63652d7472616e73666572206f7065726174696f6e2e98202d20557020746f206f6e65206163636f756e742d6c6f6f6b7570206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2852202b205829602e34202d204f6e65206576656e742e302023203c2f7765696768743e346b696c6c5f6964656e7469747904187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654c45012052656d6f766520616e206163636f756e742773206964656e7469747920616e64207375622d6163636f756e7420696e666f726d6174696f6e20616e6420736c61736820746865206465706f736974732e006501205061796d656e743a2052657365727665642062616c616e6365732066726f6d20607365745f737562736020616e6420607365745f6964656e74697479602061726520736c617368656420616e642068616e646c656420627949012060536c617368602e20566572696669636174696f6e2072657175657374206465706f7369747320617265206e6f742072657475726e65643b20746865792073686f756c642062652063616e63656c6c656484206d616e75616c6c79207573696e67206063616e63656c5f72657175657374602e00310120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f206f72206d617463682060543a3a466f7263654f726967696e602e005901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e009820456d69747320604964656e746974794b696c6c656460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2852202b2053202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e74202d206053202b2032602073746f72616765206d75746174696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e011c2c4964656e7469747953657404244163636f756e74496404f02041206e616d652077617320736574206f72207265736574202877686963682077696c6c2072656d6f766520616c6c206a756467656d656e7473292e3c4964656e74697479436c656172656408244163636f756e7449641c42616c616e636504d02041206e616d652077617320636c65617265642c20616e642074686520676976656e2062616c616e63652072657475726e65642e384964656e746974794b696c6c656408244163636f756e7449641c42616c616e636504c82041206e616d65207761732072656d6f76656420616e642074686520676976656e2062616c616e636520736c61736865642e484a756467656d656e7452657175657374656408244163636f756e74496438526567697374726172496e64657804a02041206a756467656d656e74207761732061736b65642066726f6d2061207265676973747261722e504a756467656d656e74556e72657175657374656408244163636f756e74496438526567697374726172496e646578048c2041206a756467656d656e74207265717565737420776173207265747261637465642e384a756467656d656e74476976656e08244163636f756e74496438526567697374726172496e64657804982041206a756467656d656e742077617320676976656e2062792061207265676973747261722e3852656769737472617241646465640438526567697374726172496e646578045c204120726567697374726172207761732061646465642e002c48546f6f4d616e795375624163636f756e7473046020546f6f206d616e7920737562732d6163636f756e74732e204e6f74466f756e640454204163636f756e742069736e277420666f756e642e204e6f744e616d65640454204163636f756e742069736e2774206e616d65642e28456d707479496e646578043420456d70747920696e6465782e284665654368616e676564044020466565206973206368616e6765642e284e6f4964656e74697479044c204e6f206964656e7469747920666f756e642e3c537469636b794a756467656d656e74044820537469636b79206a756467656d656e742e384a756467656d656e74476976656e0444204a756467656d656e7420676976656e2e40496e76616c69644a756467656d656e74044c20496e76616c6964206a756467656d656e742e30496e76616c6964496e64657804582054686520696e64657820697320696e76616c69642e34496e76616c6964546172676574045c205468652074617267657420697320696e76616c69642e" + +kusama_metadata_hex = "0x6d6574610b8c1853797374656d011853797374656d3c1c4163636f756e7401010230543a3a4163636f756e744964944163636f756e74496e666f3c543a3a496e6465782c20543a3a4163636f756e74446174613e00150100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e8205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e3845787472696e736963436f756e7400000c753332040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2c426c6f636b576569676874010064776569676874733a3a45787472696e7369637357656967687440000000000000000000000000000000000488205468652063757272656e742077656967687420666f722074686520626c6f636b2e40416c6c45787472696e736963734c656e00000c753332040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b4861736801010538543a3a426c6f636b4e756d6265721c543a3a48617368008000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101050c7533321c5665633c75383e000400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d626572010038543a3a426c6f636b4e756d6265721000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e3845787472696e73696373526f6f7401001c543a3a486173688000000000000000000000000000000000000000000000000000000000000000000415012045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e1844696765737401002c4469676573744f663c543e040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301008c5665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e040004a0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e284576656e74436f756e740100284576656e74496e646578100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f706963730101021c543a3a48617368845665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e000400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e484c61737452756e74696d65557067726164650000584c61737452756e74696d6555706772616465496e666f04000455012053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e38457865637574696f6e50686173650000145068617365040004882054686520657865637574696f6e207068617365206f662074686520626c6f636b2e01282866696c6c5f626c6f636b04185f726174696f1c50657262696c6c040901204120646973706174636820746861742077696c6c2066696c6c2074686520626c6f636b2077656967687420757020746f2074686520676976656e20726174696f2e1872656d61726b041c5f72656d61726b1c5665633c75383e1c6c204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e002c2023203c7765696768743e24202d20604f28312960e0202d2042617365205765696768743a20302e36363520c2b5732c20696e646570656e64656e74206f662072656d61726b206c656e6774682e50202d204e6f204442206f7065726174696f6e732e302023203c2f7765696768743e387365745f686561705f7061676573041470616765730c75363420fc2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e002c2023203c7765696768743e24202d20604f283129604c202d20312073746f726167652077726974652e64202d2042617365205765696768743a20312e34303520c2b57360202d203120777269746520746f20484541505f5041474553302023203c2f7765696768743e207365745f636f64650410636f64651c5665633c75383e28682053657420746865206e65772072756e74696d6520636f64652e002c2023203c7765696768743e3501202d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f64656088202d20312073746f726167652077726974652028636f64656320604f28432960292e7901202d20312063616c6c20746f206063616e5f7365745f636f6465603a20604f28532960202863616c6c73206073705f696f3a3a6d6973633a3a72756e74696d655f76657273696f6e6020776869636820697320657870656e73697665292e2c202d2031206576656e742e7d012054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652c206275742067656e6572616c6c792074686973206973207665727920657870656e736976652e902057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e302023203c2f7765696768743e5c7365745f636f64655f776974686f75745f636865636b730410636f64651c5665633c75383e201d012053657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e002c2023203c7765696768743e90202d20604f2843296020776865726520604360206c656e677468206f662060636f64656088202d20312073746f726167652077726974652028636f64656320604f28432960292e2c202d2031206576656e742e75012054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e302023203c2f7765696768743e5c7365745f6368616e6765735f747269655f636f6e666967044c6368616e6765735f747269655f636f6e666967804f7074696f6e3c4368616e67657354726965436f6e66696775726174696f6e3e28a02053657420746865206e6577206368616e676573207472696520636f6e66696775726174696f6e2e002c2023203c7765696768743e24202d20604f28312960b0202d20312073746f72616765207772697465206f722064656c6574652028636f64656320604f28312960292ed8202d20312063616c6c20746f20606465706f7369745f6c6f67603a20557365732060617070656e6460204150492c20736f204f28312964202d2042617365205765696768743a20372e32313820c2b57334202d204442205765696768743aa820202020202d205772697465733a204368616e67657320547269652c2053797374656d20446967657374302023203c2f7765696768743e2c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e206c2053657420736f6d65206974656d73206f662073746f726167652e002c2023203c7765696768743e94202d20604f2849296020776865726520604960206c656e677468206f6620606974656d73607c202d206049602073746f72616765207772697465732028604f28312960292e74202d2042617365205765696768743a20302e353638202a206920c2b57368202d205772697465733a204e756d626572206f66206974656d73302023203c2f7765696768743e306b696c6c5f73746f7261676504106b657973205665633c4b65793e2078204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e002c2023203c7765696768743efc202d20604f28494b296020776865726520604960206c656e677468206f6620606b6579736020616e6420604b60206c656e677468206f66206f6e65206b657964202d206049602073746f726167652064656c6574696f6e732e70202d2042617365205765696768743a202e333738202a206920c2b57368202d205772697465733a204e756d626572206f66206974656d73302023203c2f7765696768743e2c6b696c6c5f70726566697808187072656669780c4b6579205f7375626b6579730c7533322c1501204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e003d01202a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e64657241012074686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e002c2023203c7765696768743edc202d20604f285029602077686572652060506020616d6f756e74206f66206b65797320776974682070726566697820607072656669786064202d206050602073746f726167652064656c6574696f6e732e74202d2042617365205765696768743a20302e383334202a205020c2b57380202d205772697465733a204e756d626572206f66207375626b657973202b2031302023203c2f7765696768743e1c7375696369646500286501204b696c6c207468652073656e64696e67206163636f756e742c20617373756d696e6720746865726520617265206e6f207265666572656e636573206f75747374616e64696e6720616e642074686520636f6d706f7369746590206461746120697320657175616c20746f206974732064656661756c742076616c75652e002c2023203c7765696768743e24202d20604f283129607c202d20312073746f72616765207265616420616e642064656c6574696f6e2e54202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a20382e36323620c2b5731101204e6f2044422052656164206f72205772697465206f7065726174696f6e7320626563617573652063616c6c657220697320616c726561647920696e206f7665726c6179302023203c2f7765696768743e01144045787472696e7369635375636365737304304469737061746368496e666f04b020416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e205b696e666f5d3c45787472696e7369634661696c6564083444697370617463684572726f72304469737061746368496e666f048c20416e2065787472696e736963206661696c65642e205b6572726f722c20696e666f5d2c436f64655570646174656400045420603a636f6465602077617320757064617465642e284e65774163636f756e7404244163636f756e74496404742041206e6577205b6163636f756e745d2077617320637265617465642e344b696c6c65644163636f756e7404244163636f756e744964046420416e205b6163636f756e745d20776173207265617065642e1838426c6f636b48617368436f756e7438543a3a426c6f636b4e756d626572106009000004d820546865206d6178696d756d206e756d626572206f6620626c6f636b7320746f20616c6c6f7720696e206d6f7274616c20657261732e484d6178696d756d426c6f636b576569676874185765696768742000204aa9d1010000047c20546865206d6178696d756d20776569676874206f66206120626c6f636b2e2044625765696768743c52756e74696d6544625765696768744040787d010000000000e1f505000000000409012054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e50426c6f636b457865637574696f6e576569676874185765696768742000f2052a0100000004510120546865206261736520776569676874206f6620657865637574696e67206120626c6f636b2c20696e646570656e64656e74206f6620746865207472616e73616374696f6e7320696e2074686520626c6f636b2e4c45787472696e736963426173655765696768741857656967687420405973070000000004790120546865206261736520776569676874206f6620616e2045787472696e73696320696e2074686520626c6f636b2c20696e646570656e64656e74206f6620746865206f662065787472696e736963206265696e672065786563757465642e484d6178696d756d426c6f636b4c656e6774680c753332100000500004a820546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e143c496e76616c6964537065634e616d6508150120546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d655420616e6420746865206e65772072756e74696d652e685370656356657273696f6e4e65656473546f496e637265617365084501205468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d655420616e6420746865206e65772072756e74696d652e744661696c6564546f4578747261637452756e74696d6556657273696f6e0cf0204661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e000d01204569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e4c4e6f6e44656661756c74436f6d706f7369746504010120537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e3c4e6f6e5a65726f526566436f756e740439012054686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e6052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100305665633c543a3a486173683e04000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e0000000010426162650110426162652c2845706f6368496e64657801000c75363420000000000000000004542043757272656e742065706f636820696e6465782e2c417574686f72697469657301009c5665633c28417574686f7269747949642c2042616265417574686f72697479576569676874293e0400046c2043757272656e742065706f636820617574686f7269746965732e2c47656e65736973536c6f7401000c75363420000000000000000008f82054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e205468697320697320309020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2c43757272656e74536c6f7401000c75363420000000000000000004542043757272656e7420736c6f74206e756d6265722e2852616e646f6d6e6573730100587363686e6f72726b656c3a3a52616e646f6d6e65737380000000000000000000000000000000000000000000000000000000000000000028b8205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e002c20232053656375726974790005012054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061f8206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e7915012063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d6265727320746861742074686973150120286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e206265050120757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e0d01206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e3c4e65787445706f6368436f6e6669670000504e657874436f6e66696744657363726970746f7204000498204e6578742065706f636820636f6e66696775726174696f6e2c206966206368616e6765642e384e65787452616e646f6d6e6573730100587363686e6f72726b656c3a3a52616e646f6d6e657373800000000000000000000000000000000000000000000000000000000000000000045c204e6578742065706f63682072616e646f6d6e6573732e305365676d656e74496e64657801000c7533321000000000247c2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e00f4205765206d616b6520612074726164656f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e01012057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f942060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e00ec204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e090120576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572791c2065706f63682e44556e646572436f6e737472756374696f6e0101050c7533326c5665633c7363686e6f72726b656c3a3a52616e646f6d6e6573733e0004000415012054574f582d4e4f54453a20605365676d656e74496e6465786020697320616e20696e6372656173696e6720696e74656765722c20736f2074686973206973206f6b61792e2c496e697469616c697a656400003c4d6179626552616e646f6d6e65737304000801012054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d65601d01206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e204c6174656e657373010038543a3a426c6f636b4e756d626572100000000014d820486f77206c617465207468652063757272656e7420626c6f636b20697320636f6d706172656420746f2069747320706172656e742e001501205468697320656e74727920697320706f70756c617465642061732070617274206f6620626c6f636b20657865637574696f6e20616e6420697320636c65616e65642075701101206f6e20626c6f636b2066696e616c697a6174696f6e2e205175657279696e6720746869732073746f7261676520656e747279206f757473696465206f6620626c6f636bb020657865637574696f6e20636f6e746578742073686f756c6420616c77617973207969656c64207a65726f2e01084c7265706f72745f65717569766f636174696f6e084865717569766f636174696f6e5f70726f6f667045717569766f636174696f6e50726f6f663c543a3a4865616465723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66100d01205265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c207665726966790901207468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66110120616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c34206265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e6564084865717569766f636174696f6e5f70726f6f667045717569766f636174696f6e50726f6f663c543a3a4865616465723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66200d01205265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c207665726966790901207468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66110120616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c34206265207265706f727465642e110120546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c79190120626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c206173207375636819012069662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e28207265706f727465722e00083445706f63684475726174696f6e0c753634205802000000000000080d0120546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746ffc2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e444578706563746564426c6f636b54696d6524543a3a4d6f6d656e7420701700000000000014050120546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e67110120626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f75740501207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f740901206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473a0207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e002454696d657374616d70012454696d657374616d70080c4e6f77010024543a3a4d6f6d656e7420000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e24446964557064617465010010626f6f6c040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01040c736574040c6e6f7748436f6d706163743c543a3a4d6f6d656e743e485820536574207468652063757272656e742074696d652e00590120546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed82070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e004501205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e74207370656369666965642062794420604d696e696d756d506572696f64602e00d820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e002c2023203c7765696768743ed0202d20604f285429602077686572652060546020636f6d706c6578697479206f6620606f6e5f74696d657374616d705f73657460a101202d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202862656361757365206f6620604469645570646174653a3a74616b656020696e20606f6e5f66696e616c697a656029b4202d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f7365746020604f285429602ea8202d2042656e63686d61726b3a20372e36373820286d696e207371756172657320616e616c797369732981012020202d204e4f54453a20546869732062656e63686d61726b2077617320646f6e6520666f7220612072756e74696d65207769746820696e7369676e69666963616e7420606f6e5f74696d657374616d705f736574602068616e646c6572732ee420202020204e65772062656e63686d61726b696e67206973206e6565646564207768656e20616464696e67206e65772068616e646c6572732e302023203c2f7765696768743e0004344d696e696d756d506572696f6424543a3a4d6f6d656e7420b80b00000000000010690120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f64690120746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c79650120776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c6520746869737020706572696f64206f6e2064656661756c742073657474696e67732e001c496e6469636573011c496e646963657304204163636f756e74730001023c543a3a4163636f756e74496e6465788828543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20626f6f6c29000400048820546865206c6f6f6b75702066726f6d20696e64657820746f206163636f756e742e011414636c61696d0414696e6465783c543a3a4163636f756e74496e6465784c9c2041737369676e20616e2070726576696f75736c7920756e61737369676e656420696e6465782e00e0205061796d656e743a20604465706f736974602069732072657365727665642066726f6d207468652073656e646572206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00f4202d2060696e646578603a2074686520696e64657820746f20626520636c61696d65642e2054686973206d757374206e6f7420626520696e207573652e009420456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e64202d204f6e652072657365727665206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2032382e363920c2b57394202d204442205765696768743a203120526561642f577269746520284163636f756e747329302023203c2f7765696768743e207472616e73666572080c6e657730543a3a4163636f756e74496414696e6465783c543a3a4163636f756e74496e6465785461012041737369676e20616e20696e64657820616c7265616479206f776e6564206279207468652073656e64657220746f20616e6f74686572206163636f756e742e205468652062616c616e6365207265736572766174696f6ebc206973206566666563746976656c79207472616e7366657272656420746f20746865206e6577206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002901202d2060696e646578603a2074686520696e64657820746f2062652072652d61737369676e65642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e6101202d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e009420456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e68202d204f6e65207472616e73666572206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2033332e373420c2b57334202d204442205765696768743ae4202020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e7429e8202020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e7429302023203c2f7765696768743e10667265650414696e6465783c543a3a4163636f756e74496e6465784c98204672656520757020616e20696e646578206f776e6564206279207468652073656e6465722e006101205061796d656e743a20416e792070726576696f7573206465706f73697420706c6163656420666f722074686520696e64657820697320756e726573657276656420696e207468652073656e646572206163636f756e742e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206f776e2074686520696e6465782e001101202d2060696e646578603a2074686520696e64657820746f2062652066726565642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e008820456d6974732060496e646578467265656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e64202d204f6e652072657365727665206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2032352e353320c2b57394202d204442205765696768743a203120526561642f577269746520284163636f756e747329302023203c2f7765696768743e38666f7263655f7472616e736665720c0c6e657730543a3a4163636f756e74496414696e6465783c543a3a4163636f756e74496e64657818667265657a6510626f6f6c58590120466f72636520616e20696e64657820746f20616e206163636f756e742e205468697320646f65736e277420726571756972652061206465706f7369742e2049662074686520696e64657820697320616c7265616479ec2068656c642c207468656e20616e79206465706f736974206973207265696d62757273656420746f206974732063757272656e74206f776e65722e00c820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e00a8202d2060696e646578603a2074686520696e64657820746f206265202872652d2961737369676e65642e6101202d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e4501202d2060667265657a65603a2069662073657420746f206074727565602c2077696c6c20667265657a652074686520696e64657820736f2069742063616e6e6f74206265207472616e736665727265642e009420456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e7c202d20557020746f206f6e652072657365727665206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2032362e383320c2b57334202d204442205765696768743af8202020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e657229fc202020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e657229302023203c2f7765696768743e18667265657a650414696e6465783c543a3a4163636f756e74496e64657848690120467265657a6520616e20696e64657820736f2069742077696c6c20616c7761797320706f696e7420746f207468652073656e646572206163636f756e742e205468697320636f6e73756d657320746865206465706f7369742e005d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d7573742068617665206170206e6f6e2d66726f7a656e206163636f756e742060696e646578602e00b0202d2060696e646578603a2074686520696e64657820746f2062652066726f7a656e20696e20706c6163652e008c20456d6974732060496e64657846726f7a656e60206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e74202d20557020746f206f6e6520736c617368206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2033302e383620c2b57394202d204442205765696768743a203120526561642f577269746520284163636f756e747329302023203c2f7765696768743e010c34496e64657841737369676e656408244163636f756e744964304163636f756e74496e64657804ac2041206163636f756e7420696e646578207761732061737369676e65642e205b77686f2c20696e6465785d28496e646578467265656404304163636f756e74496e64657804e02041206163636f756e7420696e64657820686173206265656e2066726565642075702028756e61737369676e6564292e205b696e6465785d2c496e64657846726f7a656e08304163636f756e74496e646578244163636f756e7449640421012041206163636f756e7420696e64657820686173206265656e2066726f7a656e20746f206974732063757272656e74206163636f756e742049442e205b77686f2c20696e6465785d00002042616c616e636573012042616c616e6365731034546f74616c49737375616e6365010028543a3a42616c616e6365400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e1c4163636f756e7401010230543a3a4163636f756e7449645c4163636f756e74446174613c543a3a42616c616e63653e000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6c205468652062616c616e6365206f6620616e206163636f756e742e004101204e4f54453a2054686973206973206f6e6c79207573656420696e20746865206361736520746861742074686973206d6f64756c65206973207573656420746f2073746f72652062616c616e6365732e144c6f636b7301010230543a3a4163636f756e744964705665633c42616c616e63654c6f636b3c543a3a42616c616e63653e3e00040008b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2501204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e3853746f7261676556657273696f6e01002052656c656173657304000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e00a020546869732069732073657420746f2076322e302e3020666f72206e6577206e6574776f726b732e0110207472616e736665720810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e6cd8205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e00090120607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e21012049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e1501204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b4206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e00190120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e002c2023203c7765696768743e3101202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72cc202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e6901202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e004c2052656c617465642066756e6374696f6e733a0051012020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2d012020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365d420202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e61012020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765722060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e636564602e49012020202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616cf82020202020636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e88202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d4501202d2042617365205765696768743a2037332e363420c2b5732c20776f7273742063617365207363656e6172696f20286163636f756e7420637265617465642c206163636f756e742072656d6f76656429dc202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374696e6174696f6e206163636f756e741501202d204f726967696e206163636f756e7420697320616c726561647920696e206d656d6f72792c20736f206e6f204442206f7065726174696f6e7320666f72207468656d2e302023203c2f7765696768743e2c7365745f62616c616e63650c0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365206e65775f667265654c436f6d706163743c543a3a42616c616e63653e306e65775f72657365727665644c436f6d706163743c543a3a42616c616e63653e489420536574207468652062616c616e636573206f66206120676976656e206163636f756e742e00210120546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c090120616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e190120496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c01012069742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e00b420546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e002c2023203c7765696768743e80202d20496e646570656e64656e74206f662074686520617267756d656e74732ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e58202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743a6820202020202d204372656174696e673a2032372e353620c2b5736420202020202d204b696c6c696e673a2033352e313120c2b57398202d204442205765696768743a203120526561642c203120577269746520746f206077686f60302023203c2f7765696768743e38666f7263655f7472616e736665720c18736f757263658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636510646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e1851012045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d61792062652c207370656369666965642e2c2023203c7765696768743e4101202d2053616d65206173207472616e736665722c20627574206164646974696f6e616c207265616420616e6420777269746520626563617573652074686520736f75726365206163636f756e74206973902020206e6f7420617373756d656420746f20626520696e20746865206f7665726c61792e302023203c2f7765696768743e4c7472616e736665725f6b6565705f616c6976650810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e2c51012053616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c2074686540206f726967696e206163636f756e742e00bc20393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e00c4205b607472616e73666572605d3a207374727563742e4d6f64756c652e68746d6c236d6574686f642e7472616e736665722c2023203c7765696768743ee8202d2043686561706572207468616e207472616e736665722062656361757365206163636f756e742063616e6e6f74206265206b696c6c65642e60202d2042617365205765696768743a2035312e3420c2b5731d01202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374202873656e64657220697320696e206f7665726c617920616c7265616479292c20233c2f7765696768743e01201c456e646f77656408244163636f756e7449641c42616c616e6365041d0120416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e205b6163636f756e742c20667265655f62616c616e63655d20447573744c6f737408244163636f756e7449641c42616c616e636508410120416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77204578697374656e7469616c4465706f7369742cc820726573756c74696e6720696e20616e206f75747269676874206c6f73732e205b6163636f756e742c2062616c616e63655d205472616e736665720c244163636f756e744964244163636f756e7449641c42616c616e63650498205472616e73666572207375636365656465642e205b66726f6d2c20746f2c2076616c75655d2842616c616e63655365740c244163636f756e7449641c42616c616e63651c42616c616e636504c420412062616c616e6365207761732073657420627920726f6f742e205b77686f2c20667265652c2072657365727665645d1c4465706f73697408244163636f756e7449641c42616c616e636504190120536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e205b77686f2c206465706f7369745d20526573657276656408244163636f756e7449641c42616c616e636504190120536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e205b77686f2c2076616c75655d28556e726573657276656408244163636f756e7449641c42616c616e636504210120536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e205b77686f2c2076616c75655d4852657365727665526570617472696174656410244163636f756e744964244163636f756e7449641c42616c616e6365185374617475730c510120536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742edc2046696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652ea0205b66726f6d2c20746f2c2062616c616e63652c2064657374696e6174696f6e5f7374617475735d04484578697374656e7469616c4465706f73697428543a3a42616c616e636540aa50576300000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e203856657374696e6742616c616e6365049c2056657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c7565544c69717569646974795265737472696374696f6e7304c8204163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c204f766572666c6f77047420476f7420616e206f766572666c6f7720616674657220616464696e674c496e73756666696369656e7442616c616e636504782042616c616e636520746f6f206c6f7720746f2073656e642076616c7565484578697374656e7469616c4465706f73697404ec2056616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f736974244b656570416c6976650490205472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e745c4578697374696e6756657374696e675363686564756c6504cc20412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742c446561644163636f756e74048c2042656e6566696369617279206163636f756e74206d757374207072652d6578697374485472616e73616374696f6e5061796d656e7401485472616e73616374696f6e5061796d656e7408444e6578744665654d756c7469706c6965720100284d756c7469706c69657240000064a7b3b6e00d0000000000000000003853746f7261676556657273696f6e01002052656c6561736573040000000008485472616e73616374696f6e427974654665653042616c616e63654f663c543e402450fe00000000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e2c576569676874546f466565a45665633c576569676874546f466565436f656666696369656e743c42616c616e63654f663c543e3e3e5c04010000000000000000000000000000005443de130001040d012054686520706f6c796e6f6d69616c2074686174206973206170706c69656420696e206f7264657220746f20646572697665206665652066726f6d207765696768742e0028417574686f72736869700128417574686f72736869700c18556e636c65730100e85665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e0400041c20556e636c657318417574686f72000030543a3a4163636f756e7449640400046420417574686f72206f662063757272656e7420626c6f636b2e30446964536574556e636c6573010010626f6f6c040004bc205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e0104287365745f756e636c657304286e65775f756e636c6573385665633c543a3a4865616465723e04642050726f76696465206120736574206f6620756e636c65732e00001c48496e76616c6964556e636c65506172656e74048c2054686520756e636c6520706172656e74206e6f7420696e2074686520636861696e2e40556e636c6573416c7265616479536574048420556e636c657320616c72656164792073657420696e2074686520626c6f636b2e34546f6f4d616e79556e636c6573044420546f6f206d616e7920756e636c65732e3047656e65736973556e636c6504582054686520756e636c652069732067656e657369732e30546f6f48696768556e636c6504802054686520756e636c6520697320746f6f206869676820696e20636861696e2e50556e636c65416c7265616479496e636c75646564047c2054686520756e636c6520697320616c726561647920696e636c756465642e204f6c64556e636c6504b82054686520756e636c652069736e277420726563656e7420656e6f75676820746f20626520696e636c756465642e1c5374616b696e67011c5374616b696e678c30486973746f7279446570746801000c75333210540000001c8c204e756d626572206f66206572617320746f206b65657020696e20686973746f72792e00390120496e666f726d6174696f6e206973206b65707420666f72206572617320696e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e006101204d757374206265206d6f7265207468616e20746865206e756d626572206f6620657261732064656c617965642062792073657373696f6e206f74686572776973652e20492e652e2061637469766520657261206d757374390120616c7761797320626520696e20686973746f72792e20492e652e20606163746976655f657261203e2063757272656e745f657261202d20686973746f72795f646570746860206d757374206265302067756172616e746565642e3856616c696461746f72436f756e7401000c753332100000000004a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e7401000c7533321004000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e34496e76756c6e657261626c65730100445665633c543a3a4163636f756e7449643e04000c590120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e636520746865792772654d01206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f7572ac20696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e64656400010530543a3a4163636f756e74496430543a3a4163636f756e744964000400040101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e184c656467657200010230543a3a4163636f756e744964a45374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e14506179656501010530543a3a4163636f756e7449644452657761726444657374696e6174696f6e00040004e42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e2856616c696461746f727301010530543a3a4163636f756e7449643856616c696461746f72507265667300040004450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e284e6f6d696e61746f727300010530543a3a4163636f756e744964644e6f6d696e6174696f6e733c543a3a4163636f756e7449643e00040004650120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e2843757272656e74457261000020457261496e6465780400105c205468652063757272656e742065726120696e6465782e006501205468697320697320746865206c617465737420706c616e6e6564206572612c20646570656e64696e67206f6e20686f77207468652053657373696f6e2070616c6c657420717565756573207468652076616c696461746f7280207365742c206974206d6967687420626520616374697665206f72206e6f742e24416374697665457261000034416374697665457261496e666f040010d820546865206163746976652065726120696e666f726d6174696f6e2c20697420686f6c647320696e64657820616e642073746172742e00b820546865206163746976652065726120697320746865206572612063757272656e746c792072657761726465642e2d012056616c696461746f7220736574206f66207468697320657261206d75737420626520657175616c20746f206053657373696f6e496e746572666163653a3a76616c696461746f7273602e5445726173537461727453657373696f6e496e64657800010520457261496e6465783053657373696f6e496e646578000400043101205468652073657373696f6e20696e646578206174207768696368207468652065726120737461727420666f7220746865206c6173742060484953544f52595f44455054486020657261732e2c457261735374616b65727301020520457261496e64657830543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e050c0000001878204578706f73757265206f662076616c696461746f72206174206572612e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e48457261735374616b657273436c697070656401020520457261496e64657830543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e050c0000002c9820436c6970706564204578706f73757265206f662076616c696461746f72206174206572612e00590120546869732069732073696d696c617220746f205b60457261735374616b657273605d20627574206e756d626572206f66206e6f6d696e61746f7273206578706f736564206973207265647563656420746f20746865dc2060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732e1d0120284e6f74653a20746865206669656c642060746f74616c6020616e6420606f776e60206f6620746865206578706f737572652072656d61696e7320756e6368616e676564292ef42054686973206973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e005d012054686973206973206b657965642066697374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e484572617356616c696461746f72507265667301020520457261496e64657830543a3a4163636f756e7449643856616c696461746f7250726566730504001411012053696d696c617220746f2060457261735374616b657273602c207468697320686f6c64732074686520707265666572656e636573206f662076616c696461746f72732e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4c4572617356616c696461746f7252657761726400010520457261496e6465783042616c616e63654f663c543e0004000c09012054686520746f74616c2076616c696461746f7220657261207061796f757420666f7220746865206c6173742060484953544f52595f44455054486020657261732e0021012045726173207468617420686176656e27742066696e697368656420796574206f7220686173206265656e2072656d6f76656420646f65736e27742068617665207265776172642e4045726173526577617264506f696e747301010520457261496e64657874457261526577617264506f696e74733c543a3a4163636f756e7449643e0014000000000008ac205265776172647320666f7220746865206c6173742060484953544f52595f44455054486020657261732e250120496620726577617264206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207265776172642069732072657475726e65642e3845726173546f74616c5374616b6501010520457261496e6465783042616c616e63654f663c543e00400000000000000000000000000000000008ec2054686520746f74616c20616d6f756e74207374616b656420666f7220746865206c6173742060484953544f52595f44455054486020657261732e1d0120496620746f74616c206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207374616b652069732072657475726e65642e20466f72636545726101001c466f7263696e6704000454204d6f6465206f662065726120666f7263696e672e4c536c6173685265776172644672616374696f6e01001c50657262696c6c10000000000cf8205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e00e4205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e4c43616e63656c6564536c6173685061796f757401003042616c616e63654f663c543e40000000000000000000000000000000000815012054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e7420776869636820776173ec2063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e40556e6170706c696564536c617368657301010520457261496e646578bc5665633c556e6170706c696564536c6173683c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3e00040004c420416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e28426f6e646564457261730100745665633c28457261496e6465782c2053657373696f6e496e646578293e04001025012041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e00c8204d75737420636f6e7461696e7320696e666f726d6174696f6e20666f72206572617320666f72207468652072616e67653abc20605b6163746976655f657261202d20626f756e64696e675f6475726174696f6e3b206163746976655f6572615d604c56616c696461746f72536c617368496e45726100020520457261496e64657830543a3a4163636f756e7449645c2850657262696c6c2c2042616c616e63654f663c543e2905040008450120416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e7020616e6420736c6173682076616c7565206f6620746865206572612e4c4e6f6d696e61746f72536c617368496e45726100020520457261496e64657830543a3a4163636f756e7449643042616c616e63654f663c543e05040004610120416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e34536c617368696e675370616e7300010530543a3a4163636f756e7449645c736c617368696e673a3a536c617368696e675370616e73000400048c20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e245370616e536c6173680101058c28543a3a4163636f756e7449642c20736c617368696e673a3a5370616e496e6465782988736c617368696e673a3a5370616e5265636f72643c42616c616e63654f663c543e3e00800000000000000000000000000000000000000000000000000000000000000000083d01205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2cb82061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e584561726c69657374556e6170706c696564536c617368000020457261496e646578040004fc20546865206561726c696573742065726120666f72207768696368207765206861766520612070656e64696e672c20756e6170706c69656420736c6173682e48536e617073686f7456616c696461746f72730000445665633c543a3a4163636f756e7449643e040008650120536e617073686f74206f662076616c696461746f72732061742074686520626567696e6e696e67206f66207468652063757272656e7420656c656374696f6e2077696e646f772e20546869732073686f756c64206f6e6c791901206861766520612076616c7565207768656e205b60457261456c656374696f6e537461747573605d203d3d2060456c656374696f6e5374617475733a3a4f70656e285f29602e48536e617073686f744e6f6d696e61746f72730000445665633c543a3a4163636f756e7449643e040008650120536e617073686f74206f66206e6f6d696e61746f72732061742074686520626567696e6e696e67206f66207468652063757272656e7420656c656374696f6e2077696e646f772e20546869732073686f756c64206f6e6c791901206861766520612076616c7565207768656e205b60457261456c656374696f6e537461747573605d203d3d2060456c656374696f6e5374617475733a3a4f70656e285f29602e34517565756564456c65637465640000a8456c656374696f6e526573756c743c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e04000c650120546865206e6578742076616c696461746f72207365742e2041742074686520656e64206f6620616e206572612c206966207468697320697320617661696c61626c652028706f74656e7469616c6c792066726f6d20746865610120726573756c74206f6620616e206f6666636861696e20776f726b6572292c20697420697320696d6d6564696174656c7920757365642e204f74686572776973652c20746865206f6e2d636861696e20656c656374696f6e342069732065786563757465642e2c51756575656453636f7265000034456c656374696f6e53636f7265040004b0205468652073636f7265206f66207468652063757272656e74205b60517565756564456c6563746564605d2e44457261456c656374696f6e537461747573010078456c656374696f6e5374617475733c543a3a426c6f636b4e756d6265723e040008490120466c616720746f20636f6e74726f6c2074686520657865637574696f6e206f6620746865206f6666636861696e20656c656374696f6e2e205768656e20604f70656e285f29602c207765206163636570746c20736f6c7574696f6e7320746f206265207375626d69747465642e54497343757272656e7453657373696f6e46696e616c010010626f6f6c0400084d012054727565206966207468652063757272656e74202a2a706c616e6e65642a2a2073657373696f6e2069732066696e616c2e204e6f74652074686174207468697320646f6573206e6f742074616b65206572615820666f7263696e6720696e746f206163636f756e742e3853746f7261676556657273696f6e01002052656c6561736573040310cc2054727565206966206e6574776f726b20686173206265656e20757067726164656420746f20746869732076657273696f6e2e7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e00a020546869732069732073657420746f2076332e302e3020666f72206e6577206e6574776f726b732e016010626f6e640c28636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e1470617965654452657761726444657374696e6174696f6e5865012054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c8420626520746865206163636f756e74207468617420636f6e74726f6c732069742e003101206076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e00250120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e004020456d6974732060426f6e646564602e002c2023203c7765696768743ed4202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e20202d204f2831292e68202d20546872656520657874726120444220656e74726965732e005101204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e6564410120756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e4c202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2036372e383720c2b5732c204442205765696768743a3101202d20526561643a20426f6e6465642c204c65646765722c205b4f726967696e204163636f756e745d2c2043757272656e74204572612c20486973746f72792044657074682c204c6f636b73e0202d2057726974653a20426f6e6465642c2050617965652c205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572302023203c2f7765696768743e28626f6e645f657874726104386d61785f6164646974696f6e616c54436f6d706163743c42616c616e63654f663c543e3e5865012041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e63652075703420666f72207374616b696e672e00510120557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e650120556e6c696b65205b60626f6e64605d206f72205b60756e626f6e64605d20746869732066756e6374696f6e20646f6573206e6f7420696d706f736520616e79206c696d69746174696f6e206f6e2074686520616d6f756e744c20746861742063616e2062652061646465642e00610120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c657220616e64f82069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e004020456d6974732060426f6e646564602e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e20202d204f2831292e40202d204f6e6520444220656e7472792e34202d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2035342e383820c2b5732c204442205765696768743a1501202d20526561643a2045726120456c656374696f6e205374617475732c20426f6e6465642c204c65646765722c205b4f726967696e204163636f756e745d2c204c6f636b73a4202d2057726974653a205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572302023203c2f7765696768743e18756e626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e805501205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64010120706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e250120543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e004901204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665c0207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e003d01204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360293d012063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e656564fc20746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e004820456d6974732060556e626f6e646564602e00982053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e002c2023203c7765696768743e4101202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e6501202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e63656029710120202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652e5101202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c6564207669615c2020206077697468647261775f756e626f6e646564602e40202d204f6e6520444220656e7472792e2c202d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2035302e333420c2b5732c204442205765696768743a2901202d20526561643a2045726120456c656374696f6e205374617475732c204c65646765722c2043757272656e74204572612c204c6f636b732c205b4f726967696e204163636f756e745da4202d2057726974653a205b4f726967696e204163636f756e745d2c204c6f636b732c204c656467657228203c2f7765696768743e4477697468647261775f756e626f6e64656404486e756d5f736c617368696e675f7370616e730c753332782d012052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e003501205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4c2077686174657665722069742077616e74732e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e004c20456d697473206057697468647261776e602e006c2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e002c2023203c7765696768743e5501202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e45012020497420696d706c6965732060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c207768696368206973f42020696e6469726563746c7920757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e7901202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e40202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d090120436f6d706c6578697479204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2072656d6f7665342042617365205765696768743a74205570646174653a2035302e3532202b202e303238202a205320c2b5732501202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c2043757272656e74204572612c204c6f636b732c205b4f726967696e204163636f756e745da8202d205772697465733a205b4f726967696e204163636f756e745d2c204c6f636b732c204c656467657270204b696c6c3a2037392e3431202b20322e333636202a205320c2b5738501202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c2043757272656e74204572612c20426f6e6465642c20536c617368696e67205370616e732c205b4f726967696e204163636f756e745d2c204c6f636b73b101202d205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c205b4f726967696e204163636f756e745d2c204c6f636b7374202d2057726974657320456163683a205370616e536c617368202a20530d01204e4f54453a2057656967687420616e6e6f746174696f6e20697320746865206b696c6c207363656e6172696f2c20776520726566756e64206f74686572776973652e302023203c2f7765696768743e2076616c6964617465041470726566733856616c696461746f72507265667344e8204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e30202d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2031372e313320c2b5732c204442205765696768743a90202d20526561643a2045726120456c656374696f6e205374617475732c204c656467657280202d2057726974653a204e6f6d696e61746f72732c2056616c696461746f7273302023203c2f7765696768743e206e6f6d696e617465041c74617267657473a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e4c1101204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00510120456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546869732063616e206f6e6c792062652063616c6c6564207768656e8c205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743e3101202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f662060746172676574736020284e2901012077686963682069732063617070656420617420436f6d7061637441737369676e6d656e74733a3a4c494d495420284d41585f4e4f4d494e4154494f4e53292ed8202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e28202d2d2d2d2d2d2d2d2d842042617365205765696768743a2032322e3334202b202e3336202a204e20c2b57384207768657265204e20697320746865206e756d626572206f6620746172676574732c204442205765696768743ac8202d2052656164733a2045726120456c656374696f6e205374617475732c204c65646765722c2043757272656e742045726184202d205772697465733a2056616c696461746f72732c204e6f6d696e61746f7273302023203c2f7765696768743e146368696c6c0044c8204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e54202d20436f6e7461696e73206f6e6520726561642ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e24202d2d2d2d2d2d2d2d5c2042617365205765696768743a2031362e353320c2b5732c204442205765696768743a88202d20526561643a20457261456c656374696f6e5374617475732c204c656467657280202d2057726974653a2056616c696461746f72732c204e6f6d696e61746f7273302023203c2f7765696768743e247365745f7061796565041470617965654452657761726444657374696e6174696f6e40b8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e28202d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2031312e333320c2b57334202d204442205765696768743a4c20202020202d20526561643a204c65646765724c20202020202d2057726974653a205061796565302023203c2f7765696768743e387365745f636f6e74726f6c6c65720428636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654090202852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e2c202d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2032352e323220c2b5732c204442205765696768743af4202d20526561643a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c6572f8202d2057726974653a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c6572302023203c2f7765696768743e4c7365745f76616c696461746f725f636f756e74040c6e657730436f6d706163743c7533323e209420536574732074686520696465616c206e756d626572206f662076616c696461746f72732e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e5c2042617365205765696768743a20312e37313720c2b5735c2057726974653a2056616c696461746f7220436f756e74302023203c2f7765696768743e60696e6372656173655f76616c696461746f725f636f756e7404286164646974696f6e616c30436f6d706163743c7533323e20ac20496e6372656d656e74732074686520696465616c206e756d626572206f662076616c696461746f72732e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e5c2042617365205765696768743a20312e37313720c2b5737020526561642f57726974653a2056616c696461746f7220436f756e74302023203c2f7765696768743e547363616c655f76616c696461746f725f636f756e740418666163746f721c50657263656e7420d4205363616c652075702074686520696465616c206e756d626572206f662076616c696461746f7273206279206120666163746f722e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e5c2042617365205765696768743a20312e37313720c2b5737020526561642f57726974653a2056616c696461746f7220436f756e74302023203c2f7765696768743e34666f7263655f6e6f5f657261730024b020466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e64202d2042617365205765696768743a20312e38353720c2b57348202d2057726974653a20466f726365457261302023203c2f7765696768743e34666f7263655f6e65775f65726100284d0120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c206265a020726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e64202d2042617365205765696768743a20312e39353920c2b57344202d20577269746520466f726365457261302023203c2f7765696768743e447365745f696e76756c6e657261626c6573042876616c696461746f7273445665633c543a3a4163636f756e7449643e24cc20536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e1c202d204f28562990202d2042617365205765696768743a20322e323038202b202e303036202a205620c2b5735c202d2057726974653a20496e76756c6e657261626c6573302023203c2f7765696768743e34666f7263655f756e7374616b650814737461736830543a3a4163636f756e744964486e756d5f736c617368696e675f7370616e730c7533322c0d0120466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743eec204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2062652072656d6f7665648c2042617365205765696768743a2035332e3037202b20322e333635202a205320c2b573b82052656164733a20426f6e6465642c20536c617368696e67205370616e732c204163636f756e742c204c6f636b738501205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c204163636f756e742c204c6f636b736c2057726974657320456163683a205370616e536c617368202a2053302023203c2f7765696768743e50666f7263655f6e65775f6572615f616c776179730020050120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e60202d2042617365205765696768743a20322e303520c2b57348202d2057726974653a20466f726365457261302023203c2f7765696768743e5463616e63656c5f64656665727265645f736c617368080c65726120457261496e64657834736c6173685f696e6469636573205665633c7533323e38982043616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e00b42043616e2062652063616c6c6564206279207468652060543a3a536c61736843616e63656c4f726967696e602e00050120506172616d65746572733a2065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e002c2023203c7765696768743e5420436f6d706c65786974793a204f2855202b205329b82077697468205520756e6170706c69656420736c6173686573207765696768746564207769746820553d31303030d420616e64205320697320746865206e756d626572206f6620736c61736820696e646963657320746f2062652063616e63656c65642e74202d20426173653a2035383730202b2033342e3631202a205320c2b57368202d20526561643a20556e6170706c69656420536c61736865736c202d2057726974653a20556e6170706c69656420536c6173686573302023203c2f7765696768743e387061796f75745f7374616b657273083c76616c696461746f725f737461736830543a3a4163636f756e7449640c65726120457261496e64657864110120506179206f757420616c6c20746865207374616b65727320626568696e6420612073696e676c652076616c696461746f7220666f7220612073696e676c65206572612e004d01202d206076616c696461746f725f73746173686020697320746865207374617368206163636f756e74206f66207468652076616c696461746f722e205468656972206e6f6d696e61746f72732c20757020746f290120202060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602c2077696c6c20616c736f207265636569766520746865697220726577617264732e3501202d206065726160206d617920626520616e7920657261206265747765656e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e00590120546865206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e20416e79206163636f756e742063616e2063616c6c20746869732066756e6374696f6e2c206576656e20696678206974206973206e6f74206f6e65206f6620746865207374616b6572732e00010120546869732063616e206f6e6c792062652063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743e0101202d2054696d6520636f6d706c65786974793a206174206d6f7374204f284d61784e6f6d696e61746f72526577617264656450657256616c696461746f72292ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e30202d2d2d2d2d2d2d2d2d2d2d1d01204e20697320746865204e756d626572206f66207061796f75747320666f72207468652076616c696461746f722028696e636c7564696e67207468652076616c696461746f7229342042617365205765696768743a0101202d205265776172642044657374696e6174696f6e205374616b65643a20313130202b2035342e32202a204e20c2b57320284d656469616e20536c6f706573294101202d205265776172642044657374696e6174696f6e20436f6e74726f6c6c657220284372656174696e67293a20313230202b2034312e3935202a204e20c2b57320284d656469616e20536c6f706573292c204442205765696768743a2901202d20526561643a20457261456c656374696f6e5374617475732c2043757272656e744572612c20486973746f727944657074682c204572617356616c696461746f725265776172642c2d01202020202020202020457261735374616b657273436c69707065642c2045726173526577617264506f696e74732c204572617356616c696461746f725072656673202838206974656d73291101202d205265616420456163683a20426f6e6465642c204c65646765722c2050617965652c204c6f636b732c2053797374656d204163636f756e74202835206974656d7329d8202d20577269746520456163683a2053797374656d204163636f756e742c204c6f636b732c204c6564676572202833206974656d7329302023203c2f7765696768743e187265626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e3ce0205265626f6e64206120706f7274696f6e206f6620746865207374617368207363686564756c656420746f20626520756e6c6f636b65642e00550120546865206469737061746368206f726967696e206d757374206265207369676e65642062792074686520636f6e74726f6c6c65722c20616e642069742063616e206265206f6e6c792063616c6c6564207768656e8c205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743ed4202d2054696d6520636f6d706c65786974793a204f284c292c207768657265204c20697320756e6c6f636b696e67206368756e6b7394202d20426f756e64656420627920604d41585f554e4c4f434b494e475f4348554e4b53602ef4202d2053746f72616765206368616e6765733a2043616e277420696e6372656173652073746f726167652c206f6e6c792064656372656173652069742e40202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d98202d2042617365205765696768743a2033342e353120c2b573202a202e303438204c20c2b57334202d204442205765696768743a010120202020202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c204c6f636b732c205b4f726967696e204163636f756e745db820202020202d205772697465733a205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572302023203c2f7765696768743e447365745f686973746f72795f646570746808446e65775f686973746f72795f646570746844436f6d706163743c457261496e6465783e485f6572615f6974656d735f64656c6574656430436f6d706163743c7533323e543101205365742060486973746f72794465707468602076616c75652e20546869732066756e6374696f6e2077696c6c2064656c65746520616e7920686973746f727920696e666f726d6174696f6e80207768656e2060486973746f727944657074686020697320726564756365642e003020506172616d65746572733a1101202d20606e65775f686973746f72795f6465707468603a20546865206e657720686973746f727920646570746820796f7520776f756c64206c696b6520746f207365742e4901202d20606572615f6974656d735f64656c65746564603a20546865206e756d626572206f66206974656d7320746861742077696c6c2062652064656c6574656420627920746869732064697370617463682e450120202020546869732073686f756c64207265706f727420616c6c207468652073746f72616765206974656d7320746861742077696c6c2062652064656c6574656420627920636c656172696e67206f6c6445012020202065726120686973746f72792e204e656564656420746f207265706f727420616e2061636375726174652077656967687420666f72207468652064697370617463682e2054727573746564206279a02020202060526f6f746020746f207265706f727420616e206163637572617465206e756d6265722e0054204f726967696e206d75737420626520726f6f742e002c2023203c7765696768743ee0202d20453a204e756d626572206f6620686973746f7279206465707468732072656d6f7665642c20692e652e203130202d3e2037203d203374202d2042617365205765696768743a2032392e3133202a204520c2b57334202d204442205765696768743aa020202020202d2052656164733a2043757272656e74204572612c20486973746f72792044657074687020202020202d205772697465733a20486973746f7279204465707468310120202020202d20436c6561722050726566697820456163683a20457261205374616b6572732c204572615374616b657273436c69707065642c204572617356616c696461746f725072656673810120202020202d2057726974657320456163683a204572617356616c696461746f725265776172642c2045726173526577617264506f696e74732c2045726173546f74616c5374616b652c2045726173537461727453657373696f6e496e646578302023203c2f7765696768743e28726561705f73746173680814737461736830543a3a4163636f756e744964486e756d5f736c617368696e675f7370616e730c7533324039012052656d6f766520616c6c20646174612073747275637475726520636f6e6365726e696e672061207374616b65722f7374617368206f6e6365206974732062616c616e6365206973207a65726f2e6101205468697320697320657373656e7469616c6c79206571756976616c656e7420746f206077697468647261775f756e626f6e64656460206578636570742069742063616e2062652063616c6c656420627920616e796f6e65c020616e6420746865207461726765742060737461736860206d7573742068617665206e6f2066756e6473206c6566742e009020546869732063616e2062652063616c6c65642066726f6d20616e79206f726967696e2e000101202d20607374617368603a20546865207374617368206163636f756e7420746f20726561702e204974732062616c616e6365206d757374206265207a65726f2e002c2023203c7765696768743e250120436f6d706c65786974793a204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e73206f6e20746865206163636f756e742e8c2042617365205765696768743a2037352e3934202b20322e333936202a205320c2b5732c204442205765696768743ad8202d2052656164733a205374617368204163636f756e742c20426f6e6465642c20536c617368696e67205370616e732c204c6f636b73a501202d205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c205374617368204163636f756e742c204c6f636b7374202d2057726974657320456163683a205370616e536c617368202a2053302023203c2f7765696768743e607375626d69745f656c656374696f6e5f736f6c7574696f6e141c77696e6e6572734c5665633c56616c696461746f72496e6465783e1c636f6d7061637448436f6d7061637441737369676e6d656e74731473636f726534456c656374696f6e53636f72650c65726120457261496e6465781073697a6530456c656374696f6e53697a65bce4205375626d697420616e20656c656374696f6e20726573756c7420746f2074686520636861696e2e2049662074686520736f6c7574696f6e3a003420312e2069732076616c69642e150120322e206861732061206265747465722073636f7265207468616e206120706f74656e7469616c6c79206578697374696e6720736f6c7574696f6e206f6e20636861696e2e0084207468656e2c2069742077696c6c206265205f7075745f206f6e20636861696e2e00ac204120736f6c7574696f6e20636f6e7369737473206f662074776f20706965636573206f6620646174613a00f420312e206077696e6e657273603a206120666c617420766563746f72206f6620616c6c207468652077696e6e657273206f662074686520726f756e642e510120322e206061737369676e6d656e7473603a2074686520636f6d706163742076657273696f6e206f6620616e2061737369676e6d656e7420766563746f72207468617420656e636f6465732074686520656467653020202020776569676874732e00210120426f7468206f66207768696368206d617920626520636f6d7075746564207573696e67205f70687261676d656e5f2c206f7220616e79206f7468657220616c676f726974686d2e00a8204164646974696f6e616c6c792c20746865207375626d6974746572206d7573742070726f766964653a00c8202d20546865206073636f7265602074686174207468657920636c61696d20746865697220736f6c7574696f6e206861732e004d0120426f74682076616c696461746f727320616e64206e6f6d696e61746f72732077696c6c20626520726570726573656e74656420627920696e646963657320696e2074686520736f6c7574696f6e2e205468651d0120696e64696365732073686f756c6420726573706563742074686520636f72726573706f6e64696e6720747970657320285b6056616c696461746f72496e646578605d20616e643101205b604e6f6d696e61746f72496e646578605d292e204d6f72656f7665722c20746865792073686f756c642062652076616c6964207768656e207573656420746f20696e64657820696e746f5101205b60536e617073686f7456616c696461746f7273605d20616e64205b60536e617073686f744e6f6d696e61746f7273605d2e20416e7920696e76616c696420696e6465782077696c6c20636175736520746865610120736f6c7574696f6e20746f2062652072656a65637465642e2054686573652074776f2073746f72616765206974656d73206172652073657420647572696e672074686520656c656374696f6e2077696e646f7720616e6498206d6179206265207573656420746f2064657465726d696e652074686520696e64696365732e0060204120736f6c7574696f6e2069732076616c69642069663a00e420302e204974206973207375626d6974746564207768656e205b60457261456c656374696f6e537461747573605d20697320604f70656e602ef820312e2049747320636c61696d65642073636f726520697320657175616c20746f207468652073636f726520636f6d7075746564206f6e2d636861696e2eac20322e2050726573656e74732074686520636f7272656374206e756d626572206f662077696e6e6572732e550120332e20416c6c20696e6465786573206d7573742062652076616c7565206163636f7264696e6720746f2074686520736e617073686f7420766563746f72732e20416c6c20656467652076616c756573206d7573745d0120202020616c736f20626520636f727265637420616e642073686f756c64206e6f74206f766572666c6f7720746865206772616e756c6172697479206f662074686520726174696f20747970652028692e652e2032353640202020206f722062696c6c696f6e292e0d0120342e20466f72206561636820656467652c20616c6c2074617267657473206172652061637475616c6c79206e6f6d696e617465642062792074686520766f7465722e6c20352e2048617320636f72726563742073656c662d766f7465732e00c0204120736f6c7574696f6e732073636f726520697320636f6e736973746564206f66203320706172616d65746572733a00650120312e20606d696e207b20737570706f72742e746f74616c207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c64206265206d6178696d697a65642e650120322e206073756d207b20737570706f72742e746f74616c207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c64206265206d696e696d697a65642e410120332e206073756d207b20737570706f72742e746f74616c5e32207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c642062659c202020206d696e696d697a65642028746f20656e73757265206c6573732076617269616e636529002c2023203c7765696768743e7020536565206063726174653a3a77656967687460206d6f64756c652e302023203c2f7765696768743e847375626d69745f656c656374696f6e5f736f6c7574696f6e5f756e7369676e6564141c77696e6e6572734c5665633c56616c696461746f72496e6465783e1c636f6d7061637448436f6d7061637441737369676e6d656e74731473636f726534456c656374696f6e53636f72650c65726120457261496e6465781073697a6530456c656374696f6e53697a6524c020556e7369676e65642076657273696f6e206f6620607375626d69745f656c656374696f6e5f736f6c7574696f6e602e005d01204e6f746520746861742074686973206d757374207061737320746865205b6056616c6964617465556e7369676e6564605d20636865636b207768696368206f6e6c7920616c6c6f7773207472616e73616374696f6e7361012066726f6d20746865206c6f63616c206e6f646520746f20626520696e636c756465642e20496e206f7468657220776f7264732c206f6e6c792074686520626c6f636b20617574686f722063616e20696e636c756465206168207472616e73616374696f6e20696e2074686520626c6f636b2e002c2023203c7765696768743e7020536565206063726174653a3a77656967687460206d6f64756c652e302023203c2f7765696768743e0124244572615061796f75740c20457261496e6465781c42616c616e63651c42616c616e63650c59012054686520657261207061796f757420686173206265656e207365743b207468652066697273742062616c616e6365206973207468652076616c696461746f722d7061796f75743b20746865207365636f6e64206973c8207468652072656d61696e6465722066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642e20a4205b6572615f696e6465782c2076616c696461746f725f7061796f75742c2072656d61696e6465725d1852657761726408244163636f756e7449641c42616c616e636504f420546865207374616b657220686173206265656e207265776172646564206279207468697320616d6f756e742e205b73746173682c20616d6f756e745d14536c61736808244163636f756e7449641c42616c616e6365082901204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e2050205b76616c696461746f722c20616d6f756e745d684f6c64536c617368696e675265706f7274446973636172646564043053657373696f6e496e646578081d0120416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c6488206e6f742062652070726f6365737365642e205b73657373696f6e5f696e6465785d3c5374616b696e67456c656374696f6e043c456c656374696f6e436f6d7075746504ec2041206e657720736574206f66207374616b6572732077617320656c656374656420776974682074686520676976656e205b636f6d707574655d2e38536f6c7574696f6e53746f726564043c456c656374696f6e436f6d707574650411012041206e657720736f6c7574696f6e20666f7220746865207570636f6d696e6720656c656374696f6e20686173206265656e2073746f7265642e205b636f6d707574655d18426f6e64656408244163636f756e7449641c42616c616e636510cc20416e206163636f756e742068617320626f6e646564207468697320616d6f756e742e205b73746173682c20616d6f756e745d005101204e4f54453a2054686973206576656e74206973206f6e6c7920656d6974746564207768656e2066756e64732061726520626f6e64656420766961206120646973706174636861626c652e204e6f7461626c792c25012069742077696c6c206e6f7420626520656d697474656420666f72207374616b696e672072657761726473207768656e20746865792061726520616464656420746f207374616b652e20556e626f6e64656408244163636f756e7449641c42616c616e636504d420416e206163636f756e742068617320756e626f6e646564207468697320616d6f756e742e205b73746173682c20616d6f756e745d2457697468647261776e08244163636f756e7449641c42616c616e6365085d0120416e206163636f756e74206861732063616c6c6564206077697468647261775f756e626f6e6465646020616e642072656d6f76656420756e626f6e64696e67206368756e6b7320776f727468206042616c616e636560a82066726f6d2074686520756e6c6f636b696e672071756575652e205b73746173682c20616d6f756e745d1c3853657373696f6e735065724572613053657373696f6e496e64657810060000000470204e756d626572206f662073657373696f6e7320706572206572612e3c426f6e64696e674475726174696f6e20457261496e646578101c00000004e4204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e48536c61736844656665724475726174696f6e20457261496e646578101c000000140101204e756d626572206f662065726173207468617420736c6173686573206172652064656665727265642062792c20616674657220636f6d7075746174696f6e2e00bc20546869732073686f756c64206265206c657373207468616e2074686520626f6e64696e67206475726174696f6e2e2d012053657420746f203020696620736c61736865732073686f756c64206265206170706c69656420696d6d6564696174656c792c20776974686f7574206f70706f7274756e69747920666f723820696e74657276656e74696f6e2e44456c656374696f6e4c6f6f6b616865616438543a3a426c6f636b4e756d62657210960000001c710120546865206e756d626572206f6620626c6f636b73206265666f72652074686520656e64206f6620746865206572612066726f6d20776869636820656c656374696f6e207375626d697373696f6e732061726520616c6c6f7765642e006d012053657474696e67207468697320746f207a65726f2077696c6c2064697361626c6520746865206f6666636861696e20636f6d7075746520616e64206f6e6c79206f6e2d636861696e207365712d70687261676d656e2077696c6c2420626520757365642e007501205468697320697320626f756e646564206279206265696e672077697468696e20746865206c6173742073657373696f6e2e2048656e63652c2073657474696e6720697420746f20612076616c7565206d6f7265207468616e207468659c206c656e677468206f6620612073657373696f6e2077696c6c20626520706f696e746c6573732e344d6178497465726174696f6e730c753332100a0000000c2901204d6178696d756d206e756d626572206f662062616c616e63696e6720697465726174696f6e7320746f2072756e20696e20746865206f6666636861696e207375626d697373696f6e2e00ec2049662073657420746f20302c2062616c616e63655f736f6c7574696f6e2077696c6c206e6f7420626520657865637574656420617420616c6c2e504d696e536f6c7574696f6e53636f726542756d701c50657262696c6c1020a1070004610120546865207468726573686f6c64206f6620696d70726f76656d656e7420746861742073686f756c642062652070726f766964656420666f722061206e657720736f6c7574696f6e20746f2062652061636365707465642e804d61784e6f6d696e61746f72526577617264656450657256616c696461746f720c753332104000000010f820546865206d6178696d756d206e756d626572206f66206e6f6d696e61746f727320726577617264656420666f7220656163682076616c696461746f722e00690120466f7220656163682076616c696461746f72206f6e6c79207468652060244d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732063616e20636c61696d2101207468656972207265776172642e2054686973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e7c344e6f74436f6e74726f6c6c65720468204e6f74206120636f6e74726f6c6c6572206163636f756e742e204e6f7453746173680454204e6f742061207374617368206163636f756e742e34416c7265616479426f6e646564046420537461736820697320616c726561647920626f6e6465642e34416c7265616479506169726564047820436f6e74726f6c6c657220697320616c7265616479207061697265642e30456d70747954617267657473046420546172676574732063616e6e6f7420626520656d7074792e384475706c6963617465496e6465780444204475706c696361746520696e6465782e44496e76616c6964536c617368496e646578048820536c617368207265636f726420696e646578206f7574206f6620626f756e64732e44496e73756666696369656e7456616c756504cc2043616e206e6f7420626f6e6420776974682076616c7565206c657373207468616e206d696e696d756d2062616c616e63652e304e6f4d6f72654368756e6b7304942043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e344e6f556e6c6f636b4368756e6b04a42043616e206e6f74207265626f6e6420776974686f757420756e6c6f636b696e67206368756e6b732e3046756e64656454617267657404cc20417474656d7074696e6720746f2074617267657420612073746173682074686174207374696c6c206861732066756e64732e48496e76616c6964457261546f526577617264045c20496e76616c69642065726120746f207265776172642e68496e76616c69644e756d6265724f664e6f6d696e6174696f6e73047c20496e76616c6964206e756d626572206f66206e6f6d696e6174696f6e732e484e6f74536f72746564416e64556e697175650484204974656d7320617265206e6f7420736f7274656420616e6420756e697175652e38416c7265616479436c61696d6564040d01205265776172647320666f72207468697320657261206861766520616c7265616479206265656e20636c61696d656420666f7220746869732076616c696461746f722e5c50687261676d656e4561726c795375626d697373696f6e04e420546865207375626d697474656420726573756c74206973207265636569766564206f7574206f6620746865206f70656e2077696e646f772e5850687261676d656e5765616b5375626d697373696f6e04010120546865207375626d697474656420726573756c74206973206e6f7420617320676f6f6420617320746865206f6e652073746f726564206f6e20636861696e2e4c536e617073686f74556e617661696c61626c6504d02054686520736e617073686f742064617461206f66207468652063757272656e742077696e646f77206973206d697373696e672e6050687261676d656e426f67757357696e6e6572436f756e7404b020496e636f7272656374206e756d626572206f662077696e6e65727320776572652070726573656e7465642e4c50687261676d656e426f67757357696e6e6572086101204f6e65206f6620746865207375626d69747465642077696e6e657273206973206e6f7420616e206163746976652063616e646964617465206f6e20636861696e2028696e646578206973206f7574206f662072616e67653820696e20736e617073686f74292e5050687261676d656e426f677573436f6d70616374085d01204572726f72207768696c65206275696c64696e67207468652061737369676e6d656e7420747970652066726f6d2074686520636f6d706163742e20546869732063616e2068617070656e20696620616e20696e646578a820697320696e76616c69642c206f72206966207468652077656967687473205f6f766572666c6f775f2e5850687261676d656e426f6775734e6f6d696e61746f72041501204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f7273206973206e6f7420616e20616374697665206e6f6d696e61746f72206f6e20636861696e2e5c50687261676d656e426f6775734e6f6d696e6174696f6e044d01204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f72732068617320616e206564676520746f20776869636820746865792068617665206e6f7420766f746564206f6e20636861696e2e6450687261676d656e536c61736865644e6f6d696e6174696f6e086101204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f72732068617320616e2065646765207768696368206973207375626d6974746564206265666f726520746865206c617374206e6f6e2d7a65726f5420736c617368206f6620746865207461726765742e5450687261676d656e426f67757353656c66566f746504250120412073656c6620766f7465206d757374206f6e6c79206265206f726967696e617465642066726f6d20612076616c696461746f7220746f204f4e4c59207468656d73656c7665732e4450687261676d656e426f6775734564676504450120546865207375626d697474656420726573756c742068617320756e6b6e6f776e206564676573207468617420617265206e6f7420616d6f6e67207468652070726573656e7465642077696e6e6572732e4850687261676d656e426f67757353636f72650419012054686520636c61696d65642073636f726520646f6573206e6f74206d61746368207769746820746865206f6e6520636f6d70757465642066726f6d2074686520646174612e6450687261676d656e426f677573456c656374696f6e53697a6504782054686520656c656374696f6e2073697a6520697320696e76616c69642e3843616c6c4e6f74416c6c6f776564044901205468652063616c6c206973206e6f7420616c6c6f7765642061742074686520676976656e2074696d652064756520746f207265737472696374696f6e73206f6620656c656374696f6e20706572696f642e54496e636f7272656374486973746f7279446570746804c420496e636f72726563742070726576696f757320686973746f727920646570746820696e7075742070726f76696465642e58496e636f7272656374536c617368696e675370616e7304b420496e636f7272656374206e756d626572206f6620736c617368696e67207370616e732070726f76696465642e204f6666656e63657301204f6666656e636573101c5265706f727473000105345265706f727449644f663c543ed04f6666656e636544657461696c733c543a3a4163636f756e7449642c20543a3a4964656e74696669636174696f6e5475706c653e00040004490120546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e4044656665727265644f6666656e6365730100645665633c44656665727265644f6666656e63654f663c543e3e0400086501204465666572726564207265706f72747320746861742068617665206265656e2072656a656374656420627920746865206f6666656e63652068616e646c657220616e64206e65656420746f206265207375626d6974746564442061742061206c617465722074696d652e58436f6e63757272656e745265706f727473496e646578010205104b696e64384f706171756554696d65536c6f74485665633c5265706f727449644f663c543e3e050400042901204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e485265706f72747342794b696e64496e646578010105104b696e641c5665633c75383e00040018110120456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e00bc20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e004901204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f66690120646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e010001041c4f6666656e63650c104b696e64384f706171756554696d65536c6f7410626f6f6c10550120546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e644d0120286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e206c6173741d0120656c656d656e7420696e64696361746573206f6620746865206f6666656e636520776173206170706c69656420287472756529206f7220717565756564202866616c736529206c205b6b696e642c2074696d65736c6f742c206170706c6965645d2e000028486973746f726963616c00000000001c53657373696f6e011c53657373696f6e1c2856616c696461746f727301004c5665633c543a3a56616c696461746f7249643e0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e64657801003053657373696f6e496e646578100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e676564010010626f6f6c040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b6579730100785665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e0400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f72730100205665633c7533323e04000c8020496e6469636573206f662064697361626c65642076616c696461746f72732e003501205468652073657420697320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e732061206e657720736574206f66206964656e7469746965732e204e6578744b65797300010538543a3a56616c696461746f7249641c543a3a4b657973000400049c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e204b65794f776e657200010550284b65795479706549642c205665633c75383e2938543a3a56616c696461746f72496400040004090120546865206f776e6572206f662061206b65792e20546865206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e0108207365745f6b65797308106b6579731c543a3a4b6579731470726f6f661c5665633c75383e38e82053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b657973602e210120416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec4205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d420546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960590120202041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642ef0202d20446252656164733a20606f726967696e206163636f756e74602c2060543a3a56616c696461746f7249644f66602c20604e6578744b65797360a4202d2044625772697465733a20606f726967696e206163636f756e74602c20604e6578744b6579736084202d204462526561647320706572206b65792069643a20604b65794f776e65726088202d20446257726974657320706572206b65792069643a20604b65794f776e657260302023203c2f7765696768743e2870757267655f6b6579730030cc2052656d6f76657320616e792073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c65722ec4205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d420546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002c2023203c7765696768743eb4202d20436f6d706c65786974793a20604f2831296020696e206e756d626572206f66206b65792074797065732e590120202041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642ef0202d20446252656164733a2060543a3a56616c696461746f7249644f66602c20604e6578744b657973602c20606f726967696e206163636f756e7460a4202d2044625772697465733a20604e6578744b657973602c20606f726967696e206163636f756e74608c202d20446257726974657320706572206b65792069643a20604b65794f776e64657260302023203c2f7765696768743e0104284e657753657373696f6e043053657373696f6e496e646578085d01204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e7420697320746865205b73657373696f6e5f696e6465785d2c206e6f742074686520626c6f636b88206e756d626572206173207468652074797065206d6967687420737567676573742e001030496e76616c696450726f6f66046420496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f72496404a0204e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b657904682052656769737465726564206475706c6963617465206b65792e184e6f4b65797304a8204e6f206b65797320617265206173736f63696174656420776974682074686973206163636f756e742e3c46696e616c697479547261636b6572013c46696e616c697479547261636b6572142c526563656e7448696e747301004c5665633c543a3a426c6f636b4e756d6265723e0400043820526563656e742068696e74732e304f72646572656448696e747301004c5665633c543a3a426c6f636b4e756d6265723e04000458204f72646572656420726563656e742068696e74732e184d656469616e010038543a3a426c6f636b4e756d6265721000000000043020546865206d656469616e2e18557064617465000038543a3a426c6f636b4e756d62657204000405012046696e616c2068696e7420746f206170706c7920696e2074686520626c6f636b2e20604e6f6e6560206d65616e73202273616d6520617320706172656e74222e2c496e697469616c697a6564010010626f6f6c04000001042866696e616c5f68696e74041068696e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08f42048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a65646c20626c6f636b2069732074686520676976656e206e756d6265722e00082857696e646f7753697a6538543a3a426c6f636b4e756d626572106500000004190120546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e345265706f72744c6174656e637938543a3a426c6f636b4e756d62657210e8030000041d01205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e0838416c72656164795570646174656404c82046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b1c42616448696e7404902046696e616c697a6564206865696768742061626f766520626c6f636b206e756d6265721c4772616e647061013c4772616e64706146696e616c6974791814537461746501006c53746f72656453746174653c543a3a426c6f636b4e756d6265723e04000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e676500008c53746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000038543a3a426c6f636b4e756d626572040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c656400008028543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d626572290400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e7453657449640100145365744964200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e0001051453657449643053657373696f6e496e6465780004001059012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f722077686963682069747368206d656d62657273207765726520726573706f6e7369626c652e00b82054574f582d4e4f54453a2060536574496460206973206e6f7420756e646572207573657220636f6e74726f6c2e01084c7265706f72745f65717569766f636174696f6e084865717569766f636174696f6e5f70726f6f66a845717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66100d01205265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f82065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66fc20616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e6365482077696c6c206265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e6564084865717569766f636174696f6e5f70726f6f66a845717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66240d01205265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f82065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66fc20616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e6365482077696c6c206265207265706f727465642e00110120546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c79190120626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c206173207375636819012069662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e28207265706f727465722e010c384e6577417574686f7269746965730434417574686f726974794c69737404d0204e657720617574686f726974792073657420686173206265656e206170706c6965642e205b617574686f726974795f7365745d1850617573656400049c2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640004a02043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e001c2c50617573654661696c656408090120417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665a8202865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e30526573756d654661696c656408150120417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e277420706175736564a42028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e344368616e676550656e64696e6704ec20417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e1c546f6f536f6f6e04c02043616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e60496e76616c69644b65794f776e65727368697050726f6f660435012041206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e60496e76616c696445717569766f636174696f6e50726f6f6604350120416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f7274041901204120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e20496d4f6e6c696e650120496d4f6e6c696e6510384865617274626561744166746572010038543a3a426c6f636b4e756d62657210000000001831012054686520626c6f636b206e756d6265722061667465722077686963682069742773206f6b20746f2073656e64206865617274626561747320696e2063757272656e742073657373696f6e2e0011012041742074686520626567696e6e696e67206f6620656163682073657373696f6e20776520736574207468697320746f20612076616c756520746861742073686f756c64d02066616c6c20726f7567686c7920696e20746865206d6964646c65206f66207468652073657373696f6e206475726174696f6e2e010120546865206964656120697320746f206669727374207761697420666f72207468652076616c696461746f727320746f2070726f64756365206120626c6f636b390120696e207468652063757272656e742073657373696f6e2c20736f20746861742074686520686561727462656174206c61746572206f6e2077696c6c206e6f74206265206e65636573736172792e104b65797301004c5665633c543a3a417574686f7269747949643e040004d0205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e485265636569766564486561727462656174730002053053657373696f6e496e6465782441757468496e6465781c5665633c75383e05040008f020466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206041757468496e6465786020746f8020606f6666636861696e3a3a4f70617175654e6574776f726b5374617465602e38417574686f726564426c6f636b730102053053657373696f6e496e64657838543a3a56616c696461746f7249640c75333205100000000008150120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f662060543a3a56616c696461746f7249646020746f20746865c8206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e0104246865617274626561740824686561727462656174644865617274626561743c543a3a426c6f636b4e756d6265723e285f7369676e6174757265bc3c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e6174757265282c2023203c7765696768743e2101202d20436f6d706c65786974793a20604f284b202b20452960207768657265204b206973206c656e677468206f6620604b6579736020616e642045206973206c656e677468206f66b4202020604865617274626561742e6e6574776f726b5f73746174652e65787465726e616c5f6164647265737360008c2020202d20604f284b29603a206465636f64696e67206f66206c656e67746820604b60b02020202d20604f284529603a206465636f64696e672f656e636f64696e67206f66206c656e677468206045603d01202d20446252656164733a2070616c6c65745f73657373696f6e206056616c696461746f7273602c2070616c6c65745f73657373696f6e206043757272656e74496e646578602c20604b657973602c5c202020605265636569766564486561727462656174736084202d2044625772697465733a206052656365697665644865617274626561747360302023203c2f7765696768743e010c444865617274626561745265636569766564042c417574686f72697479496404fc2041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f72697479496460205b617574686f726974795f69645d1c416c6c476f6f640004d42041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2c536f6d654f66666c696e6504605665633c4964656e74696669636174696f6e5475706c653e0435012041742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e652076616c696461746f722077617320666f756e6420746f206265205b6f66666c696e655d2e000828496e76616c69644b65790464204e6f6e206578697374656e74207075626c6963206b65792e4c4475706c6963617465644865617274626561740458204475706c696361746564206865617274626561742e48417574686f72697479446973636f766572790001000000002444656d6f6372616379012444656d6f6372616379383c5075626c696350726f70436f756e7401002450726f70496e646578100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f707301009c5665633c2850726f70496e6465782c20543a3a486173682c20543a3a4163636f756e744964293e040004210120546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865207365636f6e64206974656d206973207468652070726f706f73616c277320686173682e244465706f7369744f660001052450726f70496e64657884285665633c543a3a4163636f756e7449643e2c2042616c616e63654f663c543e290004000c842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e00d82054574f582d4e4f54453a20536166652c20617320696e6372656173696e6720696e7465676572206b6579732061726520736166652e24507265696d616765730001061c543a3a48617368e8507265696d6167655374617475733c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e000400086101204d6170206f662068617368657320746f207468652070726f706f73616c20707265696d6167652c20616c6f6e6720776974682077686f207265676973746572656420697420616e64207468656972206465706f7369742ee42054686520626c6f636b206e756d6265722069732074686520626c6f636b20617420776869636820697420776173206465706f73697465642e3c5265666572656e64756d436f756e7401003c5265666572656e64756d496e646578100000000004310120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e344c6f77657374556e62616b656401003c5265666572656e64756d496e646578100000000008250120546865206c6f77657374207265666572656e64756d20696e64657820726570726573656e74696e6720616e20756e62616b6564207265666572656e64756d2e20457175616c20746fdc20605265666572656e64756d436f756e74602069662074686572652069736e2774206120756e62616b6564207265666572656e64756d2e405265666572656e64756d496e666f4f660001053c5265666572656e64756d496e646578d45265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a486173682c2042616c616e63654f663c543e3e0004000cb420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e0009012054574f582d4e4f54453a205341464520617320696e646578657320617265206e6f7420756e64657220616e2061747461636b6572e280997320636f6e74726f6c2e20566f74696e674f6601010530543a3a4163636f756e744964c8566f74696e673c42616c616e63654f663c543e2c20543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265723e00d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105d0120416c6c20766f74657320666f72206120706172746963756c617220766f7465722e2057652073746f7265207468652062616c616e636520666f7220746865206e756d626572206f6620766f74657320746861742077655d012068617665207265636f726465642e20546865207365636f6e64206974656d2069732074686520746f74616c20616d6f756e74206f662064656c65676174696f6e732c20746861742077696c6c2062652061646465642e00e82054574f582d4e4f54453a205341464520617320604163636f756e7449646073206172652063727970746f2068617368657320616e797761792e144c6f636b7300010530543a3a4163636f756e74496438543a3a426c6f636b4e756d626572000400105d01204163636f756e747320666f7220776869636820746865726520617265206c6f636b7320696e20616374696f6e207768696368206d61792062652072656d6f76656420617420736f6d6520706f696e7420696e207468655101206675747572652e205468652076616c75652069732074686520626c6f636b206e756d62657220617420776869636820746865206c6f636b206578706972657320616e64206d61792062652072656d6f7665642e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e544c6173745461626c656457617345787465726e616c010010626f6f6c0400085901205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c6963282070726f706f73616c2e304e65787445787465726e616c00006028543a3a486173682c20566f74655468726573686f6c6429040010590120546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e550120546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743aa4202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f7268202d20605075626c696350726f70736020697320656d7074792e24426c61636b6c6973740001061c543a3a486173688c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e290004000851012041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d626572e82028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e3443616e63656c6c6174696f6e730101061c543a3a4861736810626f6f6c000400042901205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e3853746f7261676556657273696f6e00002052656c656173657304000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e0098204e6577206e6574776f726b732073746172742077697468206c6173742076657273696f6e2e015c1c70726f706f7365083470726f706f73616c5f686173681c543a3a486173681476616c756554436f6d706163743c42616c616e63654f663c543e3e44a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e00190120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573748420686176652066756e647320746f20636f76657220746865206465706f7369742e00d8202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20707265696d6167652e1901202d206076616c7565603a2054686520616d6f756e74206f66206465706f73697420286d757374206265206174206c6561737420604d696e696d756d4465706f73697460292e004820456d697473206050726f706f736564602e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960b4202d2044622072656164733a20605075626c696350726f70436f756e74602c20605075626c696350726f707360ec202d204462207772697465733a20605075626c696350726f70436f756e74602c20605075626c696350726f7073602c20604465706f7369744f666050202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d45012042617365205765696768743a2034322e3538202b202e313237202a205020c2b57320776974682060506020746865206e756d626572206f662070726f706f73616c7320605075626c696350726f707360302023203c2f7765696768743e187365636f6e64082070726f706f73616c48436f6d706163743c50726f70496e6465783e4c7365636f6e64735f75707065725f626f756e6430436f6d706163743c7533323e40b8205369676e616c732061677265656d656e742077697468206120706172746963756c61722070726f706f73616c2e00050120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e6465721501206d75737420686176652066756e647320746f20636f76657220746865206465706f7369742c20657175616c20746f20746865206f726967696e616c206465706f7369742e00cc202d206070726f706f73616c603a2054686520696e646578206f66207468652070726f706f73616c20746f207365636f6e642e4501202d20607365636f6e64735f75707065725f626f756e64603a20616e20757070657220626f756e64206f6e207468652063757272656e74206e756d626572206f66207365636f6e6473206f6e2074686973290120202070726f706f73616c2e2045787472696e736963206973207765696768746564206163636f7264696e6720746f20746869732076616c75652077697468206e6f20726566756e642e002c2023203c7765696768743e3901202d20436f6d706c65786974793a20604f28532960207768657265205320697320746865206e756d626572206f66207365636f6e647320612070726f706f73616c20616c7265616479206861732e60202d2044622072656164733a20604465706f7369744f666064202d204462207772697465733a20604465706f7369744f666028202d2d2d2d2d2d2d2d2d90202d2042617365205765696768743a2032322e3238202b202e323239202a205320c2b573302023203c2f7765696768743e10766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f7465644163636f756e74566f74653c42616c616e63654f663c543e3e48350120566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bbc206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00e0202d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f20766f746520666f722e88202d2060766f7465603a2054686520766f746520636f6e66696775726174696f6e2e002c2023203c7765696768743e4901202d20436f6d706c65786974793a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722068617320766f746564206f6e2ea42020207765696768742069732063686172676564206173206966206d6178696d756d20766f7465732ef4202d2044622072656164733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f66602c206062616c616e636573206c6f636b7360f8202d204462207772697465733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f66602c206062616c616e636573206c6f636b736054202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743a9420202020202d20566f7465204e65773a2034392e3234202b202e333333202a205220c2b573a820202020202d20566f7465204578697374696e673a2034392e3934202b202e333433202a205220c2b573302023203c2f7765696768743e40656d657267656e63795f63616e63656c04247265665f696e6465783c5265666572656e64756d496e646578385101205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d6530207265666572656e64756d2e00fc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206043616e63656c6c6174696f6e4f726967696e602e00d4202d607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e002c2023203c7765696768743e58202d20436f6d706c65786974793a20604f283129602ec0202d2044622072656164733a20605265666572656e64756d496e666f4f66602c206043616e63656c6c6174696f6e7360c4202d204462207772697465733a20605265666572656e64756d496e666f4f66602c206043616e63656c6c6174696f6e736038202d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2033342e323520c2b573302023203c2f7765696768743e4065787465726e616c5f70726f706f7365043470726f706f73616c5f686173681c543a3a48617368383101205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c30207265666572656e64756d2e00ec20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206045787465726e616c4f726967696e602e00d8202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e002c2023203c7765696768743e2d01202d20436f6d706c657869747920604f2856296020776974682056206e756d626572206f66207665746f65727320696e2074686520626c61636b6c697374206f662070726f706f73616c2ebc2020204465636f64696e6720766563206f66206c656e67746820562e2043686172676564206173206d6178696d756da0202d2044622072656164733a20604e65787445787465726e616c602c2060426c61636b6c6973746070202d204462207772697465733a20604e65787445787465726e616c608c202d2042617365205765696768743a2031332e38202b202e313036202a205620c2b573302023203c2f7765696768743e6465787465726e616c5f70726f706f73655f6d616a6f72697479043470726f706f73616c5f686173681c543a3a486173683c5901205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c656020616e2065787465726e616c207265666572656e64756d2e00f020546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c4d616a6f726974794f726967696e602e00d8202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f283129606c202d2044622077726974653a20604e65787445787465726e616c6064202d2042617365205765696768743a20332e30363520c2b573302023203c2f7765696768743e6065787465726e616c5f70726f706f73655f64656661756c74043470726f706f73616c5f686173681c543a3a486173683c4901205363686564756c652061206e656761746976652d7475726e6f75742d62696173207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f84207363686564756c6520616e2065787465726e616c207265666572656e64756d2e00ec20546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c44656661756c744f726967696e602e00d8202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f283129606c202d2044622077726974653a20604e65787445787465726e616c6064202d2042617365205765696768743a20332e30383720c2b573302023203c2f7765696768743e28666173745f747261636b0c3470726f706f73616c5f686173681c543a3a4861736834766f74696e675f706572696f6438543a3a426c6f636b4e756d6265721464656c617938543a3a426c6f636b4e756d626572505101205363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564650120696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e65ec20627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e00d420546865206469737061746368206f6620746869732063616c6c206d757374206265206046617374547261636b4f726967696e602e00f8202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e6101202d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e20496e6372656173656420746f982020206046617374547261636b566f74696e67506572696f646020696620746f6f206c6f772e5501202d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265bc202020656e61637465642e205468697320646f65736e277420686176652061206d696e696d756d20616d6f756e742e004420456d697473206053746172746564602e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960b8202d2044622072656164733a20604e65787445787465726e616c602c20605265666572656e64756d436f756e74600d01202d204462207772697465733a20604e65787445787465726e616c602c20605265666572656e64756d436f756e74602c20605265666572656e64756d496e666f4f666060202d2042617365205765696768743a2033302e3120c2b573302023203c2f7765696768743e347665746f5f65787465726e616c043470726f706f73616c5f686173681c543a3a486173683cbc205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e00dc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d75737420626520605665746f4f726967696e602e003101202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c20746f207665746f20616e6420626c61636b6c6973742e004020456d69747320605665746f6564602e002c2023203c7765696768743e1901202d20436f6d706c65786974793a20604f2856202b206c6f6728562929602077686572652056206973206e756d626572206f6620606578697374696e67207665746f657273604501202020506572666f726d7320612062696e61727920736561726368206f6e20606578697374696e675f7665746f657273602077686963682073686f756c64206e6f742062652076657279206c617267652ea0202d2044622072656164733a20604e65787445787465726e616c602c2060426c61636b6c69737460a4202d204462207772697465733a20604e65787445787465726e616c602c2060426c61636b6c6973746090202d2042617365205765696768743a2032392e3837202b202e313838202a205620c2b573302023203c2f7765696768743e4463616e63656c5f7265666572656e64756d04247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e2c542052656d6f76652061207265666572656e64756d2e00c420546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e00d8202d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e002c2023203c7765696768743e58202d20436f6d706c65786974793a20604f283129602e80202d204462207772697465733a20605265666572656e64756d496e666f4f666064202d2042617365205765696768743a2032312e353720c2b573302023203c2f7765696768743e3463616e63656c5f717565756564041477686963683c5265666572656e64756d496e64657830a02043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e00c420546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e00c8202d20607768696368603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e002c2023203c7765696768743e3501202d20604f284429602077686572652060446020697320746865206974656d7320696e207468652064697370617463682071756575652e205765696768746564206173206044203d203130602ec8202d2044622072656164733a20607363686564756c6572206c6f6f6b7570602c207363686564756c6572206167656e646160cc202d204462207772697465733a20607363686564756c6572206c6f6f6b7570602c207363686564756c6572206167656e64616094202d2042617365205765696768743a2033362e3738202b20332e323737202a204420c2b573302023203c2f7765696768743e2064656c65676174650c08746f30543a3a4163636f756e74496428636f6e76696374696f6e28436f6e76696374696f6e1c62616c616e63653042616c616e63654f663c543e6c3d012044656c65676174652074686520766f74696e6720706f77657220287769746820736f6d6520676976656e20636f6e76696374696f6e29206f66207468652073656e64696e67206163636f756e742e005901205468652062616c616e63652064656c656761746564206973206c6f636b656420666f72206173206c6f6e6720617320697427732064656c6567617465642c20616e64207468657265616674657220666f7220746865cc2074696d6520617070726f70726961746520666f722074686520636f6e76696374696f6e2773206c6f636b20706572696f642e00610120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e696e67206163636f756e74206d757374206569746865723a782020202d2062652064656c65676174696e6720616c72656164793b206f725d012020202d2068617665206e6f20766f74696e67206163746976697479202869662074686572652069732c207468656e2069742077696c6c206e65656420746f2062652072656d6f7665642f636f6e736f6c6964617465649820202020207468726f7567682060726561705f766f746560206f722060756e766f746560292e004901202d2060746f603a20546865206163636f756e742077686f736520766f74696e6720746865206074617267657460206163636f756e74277320766f74696e6720706f7765722077696c6c20666f6c6c6f772e5901202d2060636f6e76696374696f6e603a2054686520636f6e76696374696f6e20746861742077696c6c20626520617474616368656420746f207468652064656c65676174656420766f7465732e205768656e2074686545012020206163636f756e7420697320756e64656c6567617465642c207468652066756e64732077696c6c206265206c6f636b656420666f722074686520636f72726573706f6e64696e6720706572696f642e5501202d206062616c616e6365603a2054686520616d6f756e74206f6620746865206163636f756e7427732062616c616e636520746f206265207573656420696e2064656c65676174696e672e2054686973206d757374c82020206e6f74206265206d6f7265207468616e20746865206163636f756e7427732063757272656e742062616c616e63652e004c20456d697473206044656c656761746564602e002c2023203c7765696768743e5901202d20436f6d706c65786974793a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173cc202020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732eac202d2044622072656164733a20322a60566f74696e674f66602c206062616c616e636573206c6f636b7360b0202d204462207772697465733a20322a60566f74696e674f66602c206062616c616e636573206c6f636b7360a4202d2044622072656164732070657220766f7465733a20605265666572656e64756d496e666f4f6660a8202d204462207772697465732070657220766f7465733a20605265666572656e64756d496e666f4f666094202d2042617365205765696768743a2036352e3738202b20382e323239202a205220c2b573302023203c2f7765696768743e28756e64656c6567617465004cd020556e64656c65676174652074686520766f74696e6720706f776572206f66207468652073656e64696e67206163636f756e742e00610120546f6b656e73206d617920626520756e6c6f636b656420666f6c6c6f77696e67206f6e636520616e20616d6f756e74206f662074696d6520636f6e73697374656e74207769746820746865206c6f636b20706572696f64e0206f662074686520636f6e76696374696f6e2077697468207768696368207468652064656c65676174696f6e20776173206973737565642e00490120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265582063757272656e746c792064656c65676174696e672e005420456d6974732060556e64656c656761746564602e002c2023203c7765696768743e5901202d20436f6d706c65786974793a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173cc202020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732e64202d2044622072656164733a20322a60566f74696e674f666068202d204462207772697465733a20322a60566f74696e674f6660a4202d2044622072656164732070657220766f7465733a20605265666572656e64756d496e666f4f6660a8202d204462207772697465732070657220766f7465733a20605265666572656e64756d496e666f4f666094202d2042617365205765696768743a2033332e3239202b20382e313034202a205220c2b573302023203c2f7765696768743e58636c6561725f7075626c69635f70726f706f73616c7300247420436c6561727320616c6c207075626c69632070726f706f73616c732e00c420546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e002c2023203c7765696768743e28202d20604f283129602e6c202d204462207772697465733a20605075626c696350726f70736064202d2042617365205765696768743a20322e35303520c2b573302023203c2f7765696768743e346e6f74655f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e3061012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e205468697320646f65736e27742072657175697265207468652070726f706f73616c20746f206265250120696e207468652064697370617463682071756575652062757420646f657320726571756972652061206465706f7369742c2072657475726e6564206f6e636520656e61637465642e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00c8202d2060656e636f6465645f70726f706f73616c603a2054686520707265696d616765206f6620612070726f706f73616c2e005c20456d6974732060507265696d6167654e6f746564602e002c2023203c7765696768743e802073656520607765696768745f666f723a3a6e6f74655f707265696d61676560302023203c2f7765696768743e646e6f74655f707265696d6167655f6f7065726174696f6e616c0440656e636f6465645f70726f706f73616c1c5665633c75383e040d012053616d6520617320606e6f74655f707265696d6167656020627574206f726967696e20697320604f7065726174696f6e616c507265696d6167654f726967696e602e586e6f74655f696d6d696e656e745f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e3045012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e2054686973207265717569726573207468652070726f706f73616c20746f206265b420696e207468652064697370617463682071756575652e204e6f206465706f736974206973206e65656465642e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00c8202d2060656e636f6465645f70726f706f73616c603a2054686520707265696d616765206f6620612070726f706f73616c2e005c20456d6974732060507265696d6167654e6f746564602e002c2023203c7765696768743e802073656520607765696768745f666f723a3a6e6f74655f707265696d61676560302023203c2f7765696768743e886e6f74655f696d6d696e656e745f707265696d6167655f6f7065726174696f6e616c0440656e636f6465645f70726f706f73616c1c5665633c75383e0431012053616d6520617320606e6f74655f696d6d696e656e745f707265696d6167656020627574206f726967696e20697320604f7065726174696f6e616c507265696d6167654f726967696e602e34726561705f707265696d616765083470726f706f73616c5f686173681c543a3a486173686070726f706f73616c5f6c656e5f75707065725f626f756e6430436f6d706163743c7533323e50f42052656d6f766520616e20657870697265642070726f706f73616c20707265696d61676520616e6420636f6c6c65637420746865206465706f7369742e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00d0202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f6620612070726f706f73616c2e2d01202d206070726f706f73616c5f6c656e6774685f75707065725f626f756e64603a20616e20757070657220626f756e64206f6e206c656e677468206f66207468652070726f706f73616c2e010120202045787472696e736963206973207765696768746564206163636f7264696e6720746f20746869732076616c75652077697468206e6f20726566756e642e00510120546869732077696c6c206f6e6c7920776f726b2061667465722060566f74696e67506572696f646020626c6f636b732066726f6d207468652074696d6520746861742074686520707265696d616765207761735d01206e6f7465642c2069662069742773207468652073616d65206163636f756e7420646f696e672069742e2049662069742773206120646966666572656e74206163636f756e742c207468656e206974276c6c206f6e6c79b020776f726b20616e206164646974696f6e616c2060456e6163746d656e74506572696f6460206c617465722e006020456d6974732060507265696d616765526561706564602e002c2023203c7765696768743ed0202d20436f6d706c65786974793a20604f284429602077686572652044206973206c656e677468206f662070726f706f73616c2e60202d2044622072656164733a2060507265696d616765736064202d204462207772697465733a2060507265696d616765736090202d2042617365205765696768743a2033392e3331202b202e303033202a206220c2b573302023203c2f7765696768743e18756e6c6f636b041874617267657430543a3a4163636f756e74496438a420556e6c6f636b20746f6b656e732074686174206861766520616e2065787069726564206c6f636b2e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00bc202d2060746172676574603a20546865206163636f756e7420746f2072656d6f766520746865206c6f636b206f6e2e002c2023203c7765696768743ed4202d20436f6d706c657869747920604f2852296020776974682052206e756d626572206f6620766f7465206f66207461726765742eec202d2044622072656164733a2060566f74696e674f66602c206062616c616e636573206c6f636b73602c2060746172676574206163636f756e7460f0202d204462207772697465733a2060566f74696e674f66602c206062616c616e636573206c6f636b73602c2060746172676574206163636f756e74603c202d2042617365205765696768743a9820202020202d20556e6c6f636b2052656d6f76653a2034322e3936202b202e303438202a20528c20202020202d20556e6c6f636b205365743a2033372e3633202b202e333237202a2052302023203c2f7765696768743e2c72656d6f76655f766f74650414696e6465783c5265666572656e64756d496e64657880802052656d6f7665206120766f746520666f722061207265666572656e64756d2e00102049663a8c202d20746865207265666572656e64756d207761732063616e63656c6c65642c206f7280202d20746865207265666572656e64756d206973206f6e676f696e672c206f7294202d20746865207265666572656e64756d2068617320656e6465642073756368207468617401012020202d2074686520766f7465206f6620746865206163636f756e742077617320696e206f70706f736974696f6e20746f2074686520726573756c743b206f72d82020202d20746865726520776173206e6f20636f6e76696374696f6e20746f20746865206163636f756e74277320766f74653b206f72882020202d20746865206163636f756e74206d61646520612073706c697420766f74656101202e2e2e7468656e2074686520766f74652069732072656d6f76656420636c65616e6c7920616e64206120666f6c6c6f77696e672063616c6c20746f2060756e6c6f636b60206d617920726573756c7420696e206d6f72655c2066756e6473206265696e6720617661696c61626c652e00ac2049662c20686f77657665722c20746865207265666572656e64756d2068617320656e64656420616e643af0202d2069742066696e697368656420636f72726573706f6e64696e6720746f2074686520766f7465206f6620746865206163636f756e742c20616e64e0202d20746865206163636f756e74206d6164652061207374616e6461726420766f7465207769746820636f6e76696374696f6e2c20616e64c0202d20746865206c6f636b20706572696f64206f662074686520636f6e76696374696f6e206973206e6f74206f7665725d01202e2e2e7468656e20746865206c6f636b2077696c6c206265206167677265676174656420696e746f20746865206f766572616c6c206163636f756e742773206c6f636b2c207768696368206d617920696e766f6c76655d01202a6f7665726c6f636b696e672a20287768657265207468652074776f206c6f636b732061726520636f6d62696e656420696e746f20612073696e676c65206c6f636b207468617420697320746865206d6178696d756de8206f6620626f74682074686520616d6f756e74206c6f636b656420616e64207468652074696d65206973206974206c6f636b656420666f72292e004d0120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e6572206d7573742068617665206120766f74658c207265676973746572656420666f72207265666572656e64756d2060696e646578602e00f8202d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e002c2023203c7765696768743e4101202d20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2edc2020205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652eac202d2044622072656164733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f6660b0202d204462207772697465733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f666080202d2042617365205765696768743a2032312e3033202b202e333539202a2052302023203c2f7765696768743e4472656d6f76655f6f746865725f766f7465081874617267657430543a3a4163636f756e74496414696e6465783c5265666572656e64756d496e64657850802052656d6f7665206120766f746520666f722061207265666572656e64756d2e0051012049662074686520607461726765746020697320657175616c20746f20746865207369676e65722c207468656e20746869732066756e6374696f6e2069732065786163746c79206571756976616c656e7420746f3101206072656d6f76655f766f7465602e204966206e6f7420657175616c20746f20746865207369676e65722c207468656e2074686520766f7465206d757374206861766520657870697265642c590120656974686572206265636175736520746865207265666572656e64756d207761732063616e63656c6c65642c20626563617573652074686520766f746572206c6f737420746865207265666572656e64756d206f729c20626563617573652074686520636f6e76696374696f6e20706572696f64206973206f7665722e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e005101202d2060746172676574603a20546865206163636f756e74206f662074686520766f746520746f2062652072656d6f7665643b2074686973206163636f756e74206d757374206861766520766f74656420666f72582020207265666572656e64756d2060696e646578602ef8202d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e002c2023203c7765696768743e4101202d20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2edc2020205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652eac202d2044622072656164733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f6660b0202d204462207772697465733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f666080202d2042617365205765696768743a2031392e3135202b202e333732202a2052302023203c2f7765696768743e38656e6163745f70726f706f73616c083470726f706f73616c5f686173681c543a3a4861736814696e6465783c5265666572656e64756d496e64657804510120456e61637420612070726f706f73616c2066726f6d2061207265666572656e64756d2e20466f72206e6f77207765206a757374206d616b65207468652077656967687420626520746865206d6178696d756d2e01442050726f706f736564082450726f70496e6465781c42616c616e63650429012041206d6f74696f6e20686173206265656e2070726f706f7365642062792061207075626c6963206163636f756e742e205b70726f706f73616c5f696e6465782c206465706f7369745d185461626c65640c2450726f70496e6465781c42616c616e6365385665633c4163636f756e7449643e0475012041207075626c69632070726f706f73616c20686173206265656e207461626c656420666f72207265666572656e64756d20766f74652e205b70726f706f73616c5f696e6465782c206465706f7369742c206465706f7369746f72735d3845787465726e616c5461626c656400049820416e2065787465726e616c2070726f706f73616c20686173206265656e207461626c65642e1c53746172746564083c5265666572656e64756d496e64657834566f74655468726573686f6c6404bc2041207265666572656e64756d2068617320626567756e2e205b7265665f696e6465782c207468726573686f6c645d18506173736564043c5265666572656e64756d496e64657804e020412070726f706f73616c20686173206265656e20617070726f766564206279207265666572656e64756d2e205b7265665f696e6465785d244e6f74506173736564043c5265666572656e64756d496e64657804e020412070726f706f73616c20686173206265656e2072656a6563746564206279207265666572656e64756d2e205b7265665f696e6465785d2443616e63656c6c6564043c5265666572656e64756d496e64657804b42041207265666572656e64756d20686173206265656e2063616e63656c6c65642e205b7265665f696e6465785d204578656375746564083c5265666572656e64756d496e64657810626f6f6c04c020412070726f706f73616c20686173206265656e20656e61637465642e205b7265665f696e6465782c2069735f6f6b5d2444656c65676174656408244163636f756e744964244163636f756e74496404190120416e206163636f756e74206861732064656c65676174656420746865697220766f746520746f20616e6f74686572206163636f756e742e205b77686f2c207461726765745d2c556e64656c65676174656404244163636f756e74496404f020416e205b6163636f756e745d206861732063616e63656c6c656420612070726576696f75732064656c65676174696f6e206f7065726174696f6e2e185665746f65640c244163636f756e74496410486173682c426c6f636b4e756d62657204090120416e2065787465726e616c2070726f706f73616c20686173206265656e207665746f65642e205b77686f2c2070726f706f73616c5f686173682c20756e74696c5d34507265696d6167654e6f7465640c1048617368244163636f756e7449641c42616c616e636504590120412070726f706f73616c277320707265696d61676520776173206e6f7465642c20616e6420746865206465706f7369742074616b656e2e205b70726f706f73616c5f686173682c2077686f2c206465706f7369745d30507265696d616765557365640c1048617368244163636f756e7449641c42616c616e636508190120412070726f706f73616c20707265696d616765207761732072656d6f76656420616e6420757365642028746865206465706f736974207761732072657475726e6564292e208c205b70726f706f73616c5f686173682c2070726f76696465722c206465706f7369745d3c507265696d616765496e76616c69640810486173683c5265666572656e64756d496e64657804790120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d6167652077617320696e76616c69642e205b70726f706f73616c5f686173682c207265665f696e6465785d3c507265696d6167654d697373696e670810486173683c5265666572656e64756d496e64657804790120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d61676520776173206d697373696e672e205b70726f706f73616c5f686173682c207265665f696e6465785d38507265696d616765526561706564101048617368244163636f756e7449641c42616c616e6365244163636f756e7449640831012041207265676973746572656420707265696d616765207761732072656d6f76656420616e6420746865206465706f73697420636f6c6c656374656420627920746865207265617065722e20ac205b70726f706f73616c5f686173682c2070726f76696465722c206465706f7369742c207265617065725d20556e6c6f636b656404244163636f756e74496404b420416e205b6163636f756e745d20686173206265656e20756e6c6f636b6564207375636365737366756c6c792e203c456e6163746d656e74506572696f6438543a3a426c6f636b4e756d6265721000c2010014710120546865206d696e696d756d20706572696f64206f66206c6f636b696e6720616e642074686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e0031012049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e737572652074686174690120766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e2074686520636173652077686572659c207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e304c61756e6368506572696f6438543a3a426c6f636b4e756d62657210c089010004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e30566f74696e67506572696f6438543a3a426c6f636b4e756d62657210c089010004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e384d696e696d756d4465706f7369743042616c616e63654f663c543e40aa821bce26000000000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e5446617374547261636b566f74696e67506572696f6438543a3a426c6f636b4e756d626572100807000004ec204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f7220616e20656d657267656e6379207265666572656e64756d2e34436f6f6c6f6666506572696f6438543a3a426c6f636b4e756d62657210c089010004610120506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e4c507265696d616765427974654465706f7369743042616c616e63654f663c543e402450fe000000000000000000000000000429012054686520616d6f756e74206f662062616c616e63652074686174206d757374206265206465706f7369746564207065722062797465206f6620707265696d6167652073746f7265642e204d6178566f7465730c753332106400000004b020546865206d6178696d756d206e756d626572206f6620766f74657320666f7220616e206163636f756e742e842056616c75654c6f7704382056616c756520746f6f206c6f773c50726f706f73616c4d697373696e6704602050726f706f73616c20646f6573206e6f7420657869737420426164496e646578043820556e6b6e6f776e20696e6465783c416c726561647943616e63656c656404982043616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365444475706c696361746550726f706f73616c04582050726f706f73616c20616c7265616479206d6164654c50726f706f73616c426c61636b6c6973746564046c2050726f706f73616c207374696c6c20626c61636b6c6973746564444e6f7453696d706c654d616a6f7269747904ac204e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f726974792c496e76616c696448617368043420496e76616c69642068617368284e6f50726f706f73616c0454204e6f2065787465726e616c2070726f706f73616c34416c72656164795665746f6564049c204964656e74697479206d6179206e6f74207665746f20612070726f706f73616c207477696365304e6f7444656c6567617465640438204e6f742064656c656761746564444475706c6963617465507265696d616765045c20507265696d61676520616c7265616479206e6f7465642c4e6f74496d6d696e656e740434204e6f7420696d6d696e656e7420546f6f4561726c79042820546f6f206561726c7920496d6d696e656e74042420496d6d696e656e743c507265696d6167654d697373696e67044c20507265696d616765206e6f7420666f756e64445265666572656e64756d496e76616c6964048820566f746520676976656e20666f7220696e76616c6964207265666572656e64756d3c507265696d616765496e76616c6964044420496e76616c696420707265696d6167652c4e6f6e6557616974696e670454204e6f2070726f706f73616c732077616974696e67244e6f744c6f636b656404a42054686520746172676574206163636f756e7420646f6573206e6f7420686176652061206c6f636b2e284e6f744578706972656404f020546865206c6f636b206f6e20746865206163636f756e7420746f20626520756e6c6f636b656420686173206e6f742079657420657870697265642e204e6f74566f74657204c82054686520676976656e206163636f756e7420646964206e6f7420766f7465206f6e20746865207265666572656e64756d2e304e6f5065726d697373696f6e04cc20546865206163746f7220686173206e6f207065726d697373696f6e20746f20636f6e647563742074686520616374696f6e2e44416c726561647944656c65676174696e67048c20546865206163636f756e7420697320616c72656164792064656c65676174696e672e204f766572666c6f7704a420416e20756e657870656374656420696e7465676572206f766572666c6f77206f636375727265642e24556e646572666c6f7704a820416e20756e657870656374656420696e746567657220756e646572666c6f77206f636375727265642e44496e73756666696369656e7446756e647304010120546f6f206869676820612062616c616e6365207761732070726f7669646564207468617420746865206163636f756e742063616e6e6f74206166666f72642e344e6f7444656c65676174696e6704a420546865206163636f756e74206973206e6f742063757272656e746c792064656c65676174696e672e28566f746573457869737408590120546865206163636f756e742063757272656e746c792068617320766f74657320617474616368656420746f20697420616e6420746865206f7065726174696f6e2063616e6e6f74207375636365656420756e74696cec207468657365206172652072656d6f7665642c20656974686572207468726f7567682060756e766f746560206f722060726561705f766f7465602e44496e7374616e744e6f74416c6c6f77656404dc2054686520696e7374616e74207265666572656e64756d206f726967696e2069732063757272656e746c7920646973616c6c6f7765642e204e6f6e73656e736504982044656c65676174696f6e20746f206f6e6573656c66206d616b6573206e6f2073656e73652e3c57726f6e675570706572426f756e64045420496e76616c696420757070657220626f756e642e3c4d6178566f746573526561636865640484204d6178696d756d206e756d626572206f6620766f74657320726561636865642e1c436f756e63696c014c496e7374616e636531436f6c6c656374697665182450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001061c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001061c543a3a486173688c566f7465733c543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265723e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000030543a3a4163636f756e7449640400085d0120546865206d656d6265722077686f2070726f7669646573207468652064656661756c7420766f746520666f7220616e79206f74686572206d656d62657273207468617420646f206e6f7420766f7465206265666f7265e4207468652074696d656f75742e204966204e6f6e652c207468656e206e6f206d656d6265722068617320746861742070726976696c6567652e01182c7365745f6d656d626572730c2c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e147072696d65504f7074696f6e3c543a3a4163636f756e7449643e246f6c645f636f756e742c4d656d626572436f756e746084205365742074686520636f6c6c6563746976652773206d656d626572736869702e004901202d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee4202d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e3901202d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652eac202020202020202020202020202020205573656420666f722077656967687420657374696d6174696f6e2e005820526571756972657320726f6f74206f726967696e2e005901204e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d41585f4d454d4245525360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c206275742501202020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002c2023203c7765696768743e282023232057656967687454202d20604f284d50202b204e29602077686572653ae42020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e42020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299c2020202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e6465642918202d2044423a75012020202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e6720746865206d656d62657273f02020202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c7349012020202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c61012020202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e65302023203c2f7765696768743e1c65786563757465082070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e28f420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002c2023203c7765696768743e28202323205765696768748501202d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e67206070726f706f73616c60d8202d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c6028202d2031206576656e74302023203c2f7765696768743e1c70726f706f73650c247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e6cfc204164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e0088205265717569726573207468652073656e64657220746f206265206d656d6265722e00450120607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c2032602958206f722070757420757020666f7220766f74696e672e002c2023203c7765696768743e2820232320576569676874b0202d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c82020202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af820202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029010120202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d2032602918202d2044423ab82020202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f42020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029ac2020202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0d0120202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029bc20202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029dc202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e8202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029d0202020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029c0202020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d296029302020202d2031206576656e74302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c30f42041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e0090205265717569726573207468652073656e64657220746f2062652061206d656d6265722e002c2023203c7765696768743e28202323205765696768740d01202d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e6465642918202d2044423ab02020202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029bc2020202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d29602928202d2031206576656e74302023203c2f7765696768743e14636c6f7365103470726f706f73616c5f686173681c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e5470726f706f73616c5f7765696768745f626f756e643c436f6d706163743c5765696768743e306c656e6774685f626f756e6430436f6d706163743c7533323e6c510120436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e005901204d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e004d012049662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973c02068617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e004d012049662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e73290120756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e008d01202b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642070726f706f73616c2e6501202b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b6564207669618101202020202020202020202020202020202020206073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002c2023203c7765696768743e282023232057656967687478202d20604f2842202b204d202b205031202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429cc2020202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea82020202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e6465642918202d2044423a110120202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f2831296029810120202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f64656320604f285032296029e020202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c602028605031602944202d20757020746f2033206576656e7473302023203c2f7765696768743e4c646973617070726f76655f70726f706f73616c043470726f706f73616c5f686173681c543a3a4861736838790120446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e742073746174652e008c204d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e003020506172616d65746572733a2101202a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002c2023203c7765696768743ee020436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c73542042617365205765696768743a202e3439202a20502c204442205765696768743a4c202a2052656164733a2050726f706f73616c73a0202a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f66302023203c2f7765696768743e011c2050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e740c4d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292ed0205b6163636f756e742c2070726f706f73616c5f696e6465782c2070726f706f73616c5f686173682c207468726573686f6c645d14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740c09012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292ea4205b6163636f756e742c2070726f706f73616c5f686173682c20766f7465642c207965732c206e6f5d20417070726f76656404104861736808c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e40205b70726f706f73616c5f686173685d2c446973617070726f76656404104861736808d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e40205b70726f706f73616c5f686173685d204578656375746564081048617368384469737061746368526573756c740825012041206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e60205b70726f706f73616c5f686173682c20726573756c745d384d656d6265724578656375746564081048617368384469737061746368526573756c74084d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e60205b70726f706f73616c5f686173682c20726573756c745d18436c6f7365640c10486173682c4d656d626572436f756e742c4d656d626572436f756e7408590120412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e64205b70726f706f73616c5f686173682c207965732c206e6f5d0028244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c790405012054686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c730401012054686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c57656967687404d42054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e67746804d42054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e48546563686e6963616c436f6d6d6974746565014c496e7374616e636532436f6c6c656374697665182450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001061c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001061c543a3a486173688c566f7465733c543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265723e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000030543a3a4163636f756e7449640400085d0120546865206d656d6265722077686f2070726f7669646573207468652064656661756c7420766f746520666f7220616e79206f74686572206d656d62657273207468617420646f206e6f7420766f7465206265666f7265e4207468652074696d656f75742e204966204e6f6e652c207468656e206e6f206d656d6265722068617320746861742070726976696c6567652e01182c7365745f6d656d626572730c2c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e147072696d65504f7074696f6e3c543a3a4163636f756e7449643e246f6c645f636f756e742c4d656d626572436f756e746084205365742074686520636f6c6c6563746976652773206d656d626572736869702e004901202d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee4202d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e3901202d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652eac202020202020202020202020202020205573656420666f722077656967687420657374696d6174696f6e2e005820526571756972657320726f6f74206f726967696e2e005901204e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d41585f4d454d4245525360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c206275742501202020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002c2023203c7765696768743e282023232057656967687454202d20604f284d50202b204e29602077686572653ae42020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e42020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299c2020202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e6465642918202d2044423a75012020202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e6720746865206d656d62657273f02020202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c7349012020202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c61012020202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e65302023203c2f7765696768743e1c65786563757465082070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e28f420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002c2023203c7765696768743e28202323205765696768748501202d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e67206070726f706f73616c60d8202d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c6028202d2031206576656e74302023203c2f7765696768743e1c70726f706f73650c247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e6cfc204164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e0088205265717569726573207468652073656e64657220746f206265206d656d6265722e00450120607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c2032602958206f722070757420757020666f7220766f74696e672e002c2023203c7765696768743e2820232320576569676874b0202d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c82020202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af820202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029010120202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d2032602918202d2044423ab82020202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f42020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029ac2020202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0d0120202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029bc20202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029dc202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e8202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029d0202020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029c0202020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d296029302020202d2031206576656e74302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c30f42041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e0090205265717569726573207468652073656e64657220746f2062652061206d656d6265722e002c2023203c7765696768743e28202323205765696768740d01202d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e6465642918202d2044423ab02020202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029bc2020202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d29602928202d2031206576656e74302023203c2f7765696768743e14636c6f7365103470726f706f73616c5f686173681c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e5470726f706f73616c5f7765696768745f626f756e643c436f6d706163743c5765696768743e306c656e6774685f626f756e6430436f6d706163743c7533323e6c510120436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e005901204d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e004d012049662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973c02068617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e004d012049662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e73290120756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e008d01202b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642070726f706f73616c2e6501202b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b6564207669618101202020202020202020202020202020202020206073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002c2023203c7765696768743e282023232057656967687478202d20604f2842202b204d202b205031202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429cc2020202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea82020202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e6465642918202d2044423a110120202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f2831296029810120202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f64656320604f285032296029e020202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c602028605031602944202d20757020746f2033206576656e7473302023203c2f7765696768743e4c646973617070726f76655f70726f706f73616c043470726f706f73616c5f686173681c543a3a4861736838790120446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e742073746174652e008c204d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e003020506172616d65746572733a2101202a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002c2023203c7765696768743ee020436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c73542042617365205765696768743a202e3439202a20502c204442205765696768743a4c202a2052656164733a2050726f706f73616c73a0202a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f66302023203c2f7765696768743e011c2050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e740c4d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292ed0205b6163636f756e742c2070726f706f73616c5f696e6465782c2070726f706f73616c5f686173682c207468726573686f6c645d14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740c09012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292ea4205b6163636f756e742c2070726f706f73616c5f686173682c20766f7465642c207965732c206e6f5d20417070726f76656404104861736808c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e40205b70726f706f73616c5f686173685d2c446973617070726f76656404104861736808d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e40205b70726f706f73616c5f686173685d204578656375746564081048617368384469737061746368526573756c740825012041206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e60205b70726f706f73616c5f686173682c20726573756c745d384d656d6265724578656375746564081048617368384469737061746368526573756c74084d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e60205b70726f706f73616c5f686173682c20726573756c745d18436c6f7365640c10486173682c4d656d626572436f756e742c4d656d626572436f756e7408590120412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e64205b70726f706f73616c5f686173682c207965732c206e6f5d0028244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c790405012054686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c730401012054686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c57656967687404d42054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e67746804d42054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e44456c656374696f6e7350687261676d656e014050687261676d656e456c656374696f6e141c4d656d626572730100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e040004f0205468652063757272656e7420656c6563746564206d656d626572736869702e20536f72746564206261736564206f6e206163636f756e742069642e2452756e6e65727355700100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e0400044901205468652063757272656e742072756e6e6572735f75702e20536f72746564206261736564206f6e206c6f7720746f2068696768206d657269742028776f72736520746f20626573742072756e6e6572292e38456c656374696f6e526f756e647301000c75333210000000000441012054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e65642c206578636c7564696e6720746865207570636f6d696e67206f6e652e18566f74696e6701010530543a3a4163636f756e744964842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29004400000000000000000000000000000000000cb820566f74657320616e64206c6f636b6564207374616b65206f66206120706172746963756c617220766f7465722e00c02054574f582d4e4f54453a205341464520617320604163636f756e7449646020697320612063727970746f20686173682843616e646964617465730100445665633c543a3a4163636f756e7449643e0400085901205468652070726573656e742063616e646964617465206c6973742e20536f72746564206261736564206f6e206163636f756e742d69642e20412063757272656e74206d656d626572206f722072756e6e65722d757041012063616e206e6576657220656e746572207468697320766563746f7220616e6420697320616c7761797320696d706c696369746c7920617373756d656420746f20626520612063616e6469646174652e011810766f74650814766f746573445665633c543a3a4163636f756e7449643e1476616c756554436f6d706163743c42616c616e63654f663c543e3e645d0120566f746520666f72206120736574206f662063616e6469646174657320666f7220746865207570636f6d696e6720726f756e64206f6620656c656374696f6e2e20546869732063616e2062652063616c6c656420746fe4207365742074686520696e697469616c20766f7465732c206f722075706461746520616c7265616479206578697374696e6720766f7465732e0055012055706f6e20696e697469616c20766f74696e672c206076616c75656020756e697473206f66206077686f6027732062616c616e6365206973206c6f636b656420616e64206120626f6e6420616d6f756e74206973282072657365727665642e0050205468652060766f746573602073686f756c643a482020202d206e6f7420626520656d7074792e59012020202d206265206c657373207468616e20746865206e756d626572206f6620706f737369626c652063616e646964617465732e204e6f7465207468617420616c6c2063757272656e74206d656d6265727320616e641501202020202072756e6e6572732d75702061726520616c736f206175746f6d61746963616c6c792063616e6469646174657320666f7220746865206e65787420726f756e642e005d012049742069732074686520726573706f6e736962696c697479206f66207468652063616c6c657220746f206e6f7420706c61636520616c6c206f662074686569722062616c616e636520696e746f20746865206c6f636ba020616e64206b65657020736f6d6520666f722066757274686572207472616e73616374696f6e732e002c2023203c7765696768743e5c2042617365207765696768743a2034372e393320c2b573342053746174652072656164733ad820092d2043616e646964617465732e6c656e2829202b204d656d626572732e6c656e2829202b2052756e6e65727355702e6c656e28295420092d20566f74696e67202869735f766f74657229d420092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665202b20746f74616c5f62616c616e6365295d38205374617465207772697465733a2820092d20566f74696e672020092d204c6f636b1d0120092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665202d2d206f6e6c79207768656e206372656174696e672061206e657720766f746572295d302023203c2f7765696768743e3072656d6f76655f766f746572003421012052656d6f766520606f726967696e60206173206120766f7465722e20546869732072656d6f76657320746865206c6f636b20616e642072657475726e732074686520626f6e642e002c2023203c7765696768743e582042617365207765696768743a2033362e3820c2b573a820416c6c207374617465206163636573732069732066726f6d20646f5f72656d6f76655f766f7465722e342053746174652072656164733a2820092d20566f74696e675820092d205b4163636f756e74446174612877686f295d38205374617465207772697465733a2820092d20566f74696e672420092d204c6f636b735820092d205b4163636f756e74446174612877686f295d302023203c2f7765696768743e507265706f72745f646566756e63745f766f746572041c646566756e6374c4446566756e6374566f7465723c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e6c5d01205265706f727420607461726765746020666f72206265696e6720616e20646566756e637420766f7465722e20496e2063617365206f6620612076616c6964207265706f72742c20746865207265706f727465722069735d012072657761726465642062792074686520626f6e6420616d6f756e74206f662060746172676574602e204f74686572776973652c20746865207265706f7274657220697473656c662069732072656d6f76656420616e645c20746865697220626f6e6420697320736c61736865642e0088204120646566756e637420766f74657220697320646566696e656420746f2062653a4d012020202d206120766f7465722077686f73652063757272656e74207375626d697474656420766f7465732061726520616c6c20696e76616c69642e20692e652e20616c6c206f66207468656d20617265206e6ff020202020206c6f6e67657220612063616e646964617465206e6f7220616e20616374697665206d656d626572206f7220612072756e6e65722d75702e0000690120546865206f726967696e206d7573742070726f7669646520746865206e756d626572206f662063757272656e742063616e6469646174657320616e6420766f746573206f6620746865207265706f7274656420746172676574c020666f722074686520707572706f7365206f66206163637572617465207765696768742063616c63756c6174696f6e2e002c2023203c7765696768743eb4204e6f204261736520776569676874206261736564206f6e206d696e2073717561726520616e616c797369732ea420436f6d706c6578697479206f662063616e6469646174655f636f756e743a20312e37353520c2b5739020436f6d706c6578697479206f6620766f74655f636f756e743a2031382e353120c2b573342053746174652072656164733a542020092d20566f74696e67287265706f7274657229502020092d2043616e6469646174652e6c656e28294c2020092d20566f74696e672854617267657429d82020092d2043616e646964617465732c204d656d626572732c2052756e6e6572735570202869735f646566756e63745f766f7465722938205374617465207772697465733a7020092d204c6f636b287265706f72746572207c7c2074617267657429dc20092d205b4163636f756e7442616c616e6365287265706f72746572295d202b204163636f756e7442616c616e636528746172676574297820092d20566f74696e67287265706f72746572207c7c20746172676574295901204e6f74653a207468652064622061636365737320697320776f7273652077697468207265737065637420746f2064622c207768696368206973207768656e20746865207265706f727420697320636f72726563742e302023203c2f7765696768743e407375626d69745f63616e646964616379043c63616e6469646174655f636f756e7430436f6d706163743c7533323e5478205375626d6974206f6e6573656c6620666f722063616e6469646163792e006420412063616e6469646174652077696c6c206569746865723aec2020202d204c6f73652061742074686520656e64206f6620746865207465726d20616e6420666f7266656974207468656972206465706f7369742e2d012020202d2057696e20616e64206265636f6d652061206d656d6265722e204d656d626572732077696c6c206576656e7475616c6c7920676574207468656972207374617368206261636b2e55012020202d204265636f6d6520612072756e6e65722d75702e2052756e6e6572732d75707320617265207265736572766564206d656d6265727320696e2063617365206f6e65206765747320666f72636566756c6c7934202020202072656d6f7665642e002c2023203c7765696768743e60204261736520776569676874203d2033332e333320c2b573a420436f6d706c6578697479206f662063616e6469646174655f636f756e743a20302e33373520c2b573342053746174652072656164733a5020092d2043616e646964617465732e6c656e28293820092d2043616e646964617465732c20092d204d656d626572733420092d2052756e6e65727355706420092d205b4163636f756e7442616c616e63652877686f295d38205374617465207772697465733a6420092d205b4163636f756e7442616c616e63652877686f295d3820092d2043616e64696461746573302023203c2f7765696768743e4872656e6f756e63655f63616e646964616379042872656e6f756e63696e672852656e6f756e63696e679851012052656e6f756e6365206f6e65277320696e74656e74696f6e20746f20626520612063616e64696461746520666f7220746865206e65787420656c656374696f6e20726f756e642e203320706f74656e7469616c40206f7574636f6d65732065786973743a4101202d20606f726967696e6020697320612063616e64696461746520616e64206e6f7420656c656374656420696e20616e79207365742e20496e207468697320636173652c2074686520626f6e64206973f4202020756e72657365727665642c2072657475726e656420616e64206f726967696e2069732072656d6f76656420617320612063616e6469646174652e5901202d20606f726967696e6020697320612063757272656e742072756e6e65722d75702e20496e207468697320636173652c2074686520626f6e6420697320756e72657365727665642c2072657475726e656420616e64902020206f726967696e2069732072656d6f76656420617320612072756e6e65722d75702e4d01202d20606f726967696e6020697320612063757272656e74206d656d6265722e20496e207468697320636173652c2074686520626f6e6420697320756e726573657276656420616e64206f726967696e206973590120202072656d6f7665642061732061206d656d6265722c20636f6e73657175656e746c79206e6f74206265696e6720612063616e64696461746520666f7220746865206e65787420726f756e6420616e796d6f72652e650120202053696d696c617220746f205b6072656d6f76655f766f746572605d2c206966207265706c6163656d656e742072756e6e657273206578697374732c20746865792061726520696d6d6564696174656c7920757365642e24203c7765696768743e7820496620612063616e6469646174652069732072656e6f756e63696e673a60200942617365207765696768743a2031372e323820c2b573a82009436f6d706c6578697479206f662063616e6469646174655f636f756e743a20302e32333520c2b57338200953746174652072656164733a3c2009092d2043616e64696461746573982009092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665295d3c20095374617465207772697465733a3c2009092d2043616e64696461746573982009092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665295d64204966206d656d6265722069732072656e6f756e63696e673a60200942617365207765696768743a2034362e323520c2b57338200953746174652072656164733ad02009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d3c20095374617465207772697465733ad02009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d642049662072756e6e65722069732072656e6f756e63696e673a60200942617365207765696768743a2034362e323520c2b57338200953746174652072656164733aac2009092d2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d3c20095374617465207772697465733aac2009092d2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d000d0120576569676874206e6f74653a205468652063616c6c20696e746f206368616e67654d656d62657273206e65656420746f206265206163636f756e74656420666f722e28203c2f7765696768743e3472656d6f76655f6d656d626572080c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653c6861735f7265706c6163656d656e7410626f6f6c485d012052656d6f7665206120706172746963756c6172206d656d6265722066726f6d20746865207365742e20546869732069732065666665637469766520696d6d6564696174656c7920616e642074686520626f6e64206f668020746865206f7574676f696e67206d656d62657220697320736c61736865642e00590120496620612072756e6e65722d757020697320617661696c61626c652c207468656e2074686520626573742072756e6e65722d75702077696c6c2062652072656d6f76656420616e64207265706c61636573207468650101206f7574676f696e67206d656d6265722e204f74686572776973652c2061206e65772070687261676d656e20656c656374696f6e20697320737461727465642e004501204e6f74652074686174207468697320646f6573206e6f7420616666656374207468652064657369676e6174656420626c6f636b206e756d626572206f6620746865206e65787420656c656374696f6e2e002c2023203c7765696768743e6820496620776520686176652061207265706c6163656d656e743a6820092d2042617365207765696768743a2035302e393320c2b5734020092d2053746174652072656164733a502009092d2052756e6e65727355702e6c656e2829cc2009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572294420092d205374617465207772697465733acc2009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d62657229650120456c73652c2073696e63652074686973206973206120726f6f742063616c6c20616e642077696c6c20676f20696e746f2070687261676d656e2c20776520617373756d652066756c6c20626c6f636b20666f72206e6f772e302023203c2f7765696768743e01141c4e65775465726d04645665633c284163636f756e7449642c2042616c616e6365293e1061012041206e6577207465726d2077697468205b6e65775f6d656d626572735d2e205468697320696e64696361746573207468617420656e6f7567682063616e64696461746573206578697374656420746f2072756e20746865590120656c656374696f6e2c206e6f74207468617420656e6f756768206861766520686173206265656e20656c65637465642e2054686520696e6e65722076616c7565206d757374206265206578616d696e656420666f726101207468697320707572706f73652e204120604e65775465726d285b5d296020696e64696361746573207468617420736f6d652063616e6469646174657320676f7420746865697220626f6e6420736c617368656420616e645901206e6f6e65207765726520656c65637465642c207768696c73742060456d7074795465726d60206d65616e732074686174206e6f2063616e64696461746573206578697374656420746f20626567696e20776974682e24456d7074795465726d00083501204e6f20286f72206e6f7420656e6f756768292063616e64696461746573206578697374656420666f72207468697320726f756e642e205468697320697320646966666572656e742066726f6dc420604e65775465726d285b5d29602e2053656520746865206465736372697074696f6e206f6620604e65775465726d602e304d656d6265724b69636b656404244163636f756e744964084d012041205b6d656d6265725d20686173206265656e2072656d6f7665642e20546869732073686f756c6420616c7761797320626520666f6c6c6f7765642062792065697468657220604e65775465726d60206f74342060456d7074795465726d602e3c4d656d62657252656e6f756e63656404244163636f756e74496404a82041205b6d656d6265725d206861732072656e6f756e6365642074686569722063616e6469646163792e34566f7465725265706f727465640c244163636f756e744964244163636f756e74496410626f6f6c080901204120766f74657220776173207265706f7274656420776974682074686520746865207265706f7274206265696e67207375636365737366756c206f72206e6f742e6c205b766f7465722c207265706f727465722c20737563636573735d183443616e646964616379426f6e643042616c616e63654f663c543e40aa821bce2600000000000000000000000028566f74696e67426f6e643042616c616e63654f663c543e405293b4f00100000000000000000000000038446573697265644d656d626572730c753332101100000000404465736972656452756e6e65727355700c753332100700000000305465726d4475726174696f6e38543a3a426c6f636b4e756d626572104038000000204d6f64756c654964384c6f636b4964656e74696669657220706872656c656374004430556e61626c65546f566f746504c42043616e6e6f7420766f7465207768656e206e6f2063616e64696461746573206f72206d656d626572732065786973742e1c4e6f566f7465730498204d75737420766f746520666f72206174206c65617374206f6e652063616e6469646174652e30546f6f4d616e79566f74657304882043616e6e6f7420766f7465206d6f7265207468616e2063616e646964617465732e504d6178696d756d566f7465734578636565646564049c2043616e6e6f7420766f7465206d6f7265207468616e206d6178696d756d20616c6c6f7765642e284c6f7742616c616e636504c82043616e6e6f7420766f74652077697468207374616b65206c657373207468616e206d696e696d756d2062616c616e63652e3c556e61626c65546f506179426f6e64047c20566f7465722063616e206e6f742070617920766f74696e6720626f6e642e2c4d7573744265566f7465720444204d757374206265206120766f7465722e285265706f727453656c6604502043616e6e6f74207265706f72742073656c662e4c4475706c69636174656443616e6469646174650484204475706c6963617465642063616e646964617465207375626d697373696f6e2e304d656d6265725375626d6974048c204d656d6265722063616e6e6f742072652d7375626d69742063616e6469646163792e3052756e6e65725375626d6974048c2052756e6e65722063616e6e6f742072652d7375626d69742063616e6469646163792e68496e73756666696369656e7443616e64696461746546756e647304982043616e64696461746520646f6573206e6f74206861766520656e6f7567682066756e64732e244e6f744d656d6265720438204e6f742061206d656d6265722e54496e76616c696443616e646964617465436f756e7404e4205468652070726f766964656420636f756e74206f66206e756d626572206f662063616e6469646174657320697320696e636f72726563742e40496e76616c6964566f7465436f756e7404d0205468652070726f766964656420636f756e74206f66206e756d626572206f6620766f74657320697320696e636f72726563742e44496e76616c696452656e6f756e63696e67040101205468652072656e6f756e63696e67206f726967696e2070726573656e74656420612077726f6e67206052656e6f756e63696e676020706172616d657465722e48496e76616c69645265706c6163656d656e740401012050726564696374696f6e20726567617264696e67207265706c6163656d656e74206166746572206d656d6265722072656d6f76616c2069732077726f6e672e4c546563686e6963616c4d656d62657273686970014c496e7374616e6365314d656d62657273686970081c4d656d626572730100445665633c543a3a4163636f756e7449643e040004c8205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e145072696d65000030543a3a4163636f756e744964040004a4205468652063757272656e74207072696d65206d656d6265722c206966206f6e65206578697374732e011c286164645f6d656d626572040c77686f30543a3a4163636f756e7449640c7c204164642061206d656d626572206077686f6020746f20746865207365742e00a0204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a4164644f726967696e602e3472656d6f76655f6d656d626572040c77686f30543a3a4163636f756e7449640c902052656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e00ac204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656d6f76654f726967696e602e2c737761705f6d656d626572081872656d6f766530543a3a4163636f756e7449640c61646430543a3a4163636f756e74496414c02053776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e00a4204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a537761704f726967696e602e001101205072696d65206d656d62657273686970206973202a6e6f742a207061737365642066726f6d206072656d6f76656020746f2060616464602c20696620657874616e742e3472657365745f6d656d62657273041c6d656d62657273445665633c543a3a4163636f756e7449643e105901204368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e646c207061737320606d656d6265727360207072652d736f727465642e00a8204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52657365744f726967696e602e286368616e67655f6b6579040c6e657730543a3a4163636f756e74496414d82053776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e00f4204d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e002101205072696d65206d656d62657273686970206973207061737365642066726f6d20746865206f726967696e206163636f756e7420746f20606e6577602c20696620657874616e742e247365745f7072696d65040c77686f30543a3a4163636f756e7449640cc02053657420746865207072696d65206d656d6265722e204d75737420626520612063757272656e74206d656d6265722e00a8204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e2c636c6561725f7072696d65000c982052656d6f766520746865207072696d65206d656d626572206966206974206578697374732e00a8204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e01182c4d656d62657241646465640004e42054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e344d656d62657252656d6f7665640004ec2054686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e384d656d62657273537761707065640004dc2054776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e304d656d6265727352657365740004190120546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e284b65794368616e676564000488204f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e1444756d6d7904bc73705f7374643a3a6d61726b65723a3a5068616e746f6d446174613c284163636f756e7449642c204576656e74293e0470205068616e746f6d206d656d6265722c206e6576657220757365642e000020547265617375727901205472656173757279143450726f706f73616c436f756e7401003450726f706f73616c496e646578100000000004a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c730001053450726f706f73616c496e6465789050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c730100485665633c50726f706f73616c496e6465783e040004f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e10546970730001051c543a3a48617368f04f70656e5469703c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265722c20543a3a486173683e0004000c59012054697073207468617420617265206e6f742079657420636f6d706c657465642e204b65796564206279207468652068617368206f66206028726561736f6e2c2077686f29602066726f6d207468652076616c75652e3d012054686973206861732074686520696e73656375726520656e756d657261626c6520686173682066756e6374696f6e2073696e636520746865206b657920697473656c6620697320616c7265616479802067756172616e7465656420746f20626520612073656375726520686173682e1c526561736f6e730001061c543a3a486173681c5665633c75383e0004000849012053696d706c6520707265696d616765206c6f6f6b75702066726f6d2074686520726561736f6e2773206861736820746f20746865206f726967696e616c20646174612e20416761696e2c2068617320616e610120696e73656375726520656e756d657261626c6520686173682073696e636520746865206b65792069732067756172616e7465656420746f2062652074686520726573756c74206f6620612073656375726520686173682e01203470726f706f73655f7370656e64081476616c756554436f6d706163743c42616c616e63654f663c543e3e2c62656e65666963696172798c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365242d012050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c7565350120697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e636520746865542070726f706f73616c20697320617761726465642e002c2023203c7765696768743e4c202d20436f6d706c65786974793a204f283129b4202d20446252656164733a206050726f706f73616c436f756e74602c20606f726967696e206163636f756e7460ec202d2044625772697465733a206050726f706f73616c436f756e74602c206050726f706f73616c73602c20606f726967696e206163636f756e7460302023203c2f7765696768743e3c72656a6563745f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e24fc2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e00ac204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656a6563744f726967696e602e002c2023203c7765696768743e4c202d20436f6d706c65786974793a204f283129d0202d20446252656164733a206050726f706f73616c73602c206072656a65637465642070726f706f736572206163636f756e7460d4202d2044625772697465733a206050726f706f73616c73602c206072656a65637465642070726f706f736572206163636f756e7460302023203c2f7765696768743e40617070726f76655f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e285d0120417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e6566696369617279ac20616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e00b0204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a417070726f76654f726967696e602e002c2023203c7765696768743e50202d20436f6d706c65786974793a204f2831292e90202d20446252656164733a206050726f706f73616c73602c2060417070726f76616c73605c202d20446257726974653a2060417070726f76616c7360302023203c2f7765696768743e387265706f72745f617765736f6d650818726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e7449644c5d01205265706f727420736f6d657468696e672060726561736f6e60207468617420646573657276657320612074697020616e6420636c61696d20616e79206576656e7475616c207468652066696e6465722773206665652e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005501205061796d656e743a20605469705265706f72744465706f73697442617365602077696c6c2062652072657365727665642066726f6d20746865206f726967696e206163636f756e742c2061732077656c6c206173d420605469705265706f72744465706f736974506572427974656020666f722065616368206279746520696e2060726561736f6e602e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743ecc202d20436f6d706c65786974793a20604f2852296020776865726520605260206c656e677468206f662060726561736f6e602e942020202d20656e636f64696e6720616e642068617368696e67206f662027726561736f6e27c4202d20446252656164733a2060526561736f6e73602c206054697073602c206077686f206163636f756e742064617461609c202d2044625772697465733a206054697073602c206077686f206163636f756e74206461746160302023203c2f7765696768743e2c726574726163745f7469700410686173681c543a3a486173684c550120526574726163742061207072696f72207469702d7265706f72742066726f6d20607265706f72745f617765736f6d65602c20616e642063616e63656c207468652070726f63657373206f662074697070696e672e00e0204966207375636365737366756c2c20746865206f726967696e616c206465706f7369742077696c6c20626520756e72657365727665642e00510120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642074686520746970206964656e746966696564206279206068617368604501206d7573742068617665206265656e207265706f7274656420627920746865207369676e696e67206163636f756e74207468726f75676820607265706f72745f617765736f6d65602028616e64206e6f7450207468726f75676820607469705f6e657760292e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e009020456d697473206054697052657472616374656460206966207375636365737366756c2e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960dc2020202d20446570656e6473206f6e20746865206c656e677468206f662060543a3a48617368602077686963682069732066697865642e90202d20446252656164733a206054697073602c20606f726967696e206163636f756e7460c0202d2044625772697465733a2060526561736f6e73602c206054697073602c20606f726967696e206163636f756e7460302023203c2f7765696768743e1c7469705f6e65770c18726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e744964247469705f76616c75653042616c616e63654f663c543e58f4204769766520612074697020666f7220736f6d657468696e67206e65773b206e6f2066696e6465722773206665652077696c6c2062652074616b656e2e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743e5501202d20436f6d706c65786974793a20604f2852202b2054296020776865726520605260206c656e677468206f662060726561736f6e602c2060546020697320746865206e756d626572206f6620746970706572732ec02020202d20604f285429603a206465636f64696e6720605469707065726020766563206f66206c656e6774682060546009012020202020605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e0d0120202020205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602ee42020202d20604f285229603a2068617368696e6720616e6420656e636f64696e67206f6620726561736f6e206f66206c656e6774682060526080202d20446252656164733a206054697070657273602c2060526561736f6e736078202d2044625772697465733a2060526561736f6e73602c20605469707360302023203c2f7765696768743e0c7469700810686173681c543a3a48617368247469705f76616c75653042616c616e63654f663c543e64b4204465636c6172652061207469702076616c756520666f7220616e20616c72656164792d6f70656e207469702e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f66207468652068617368206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279382020206163636f756e742049442e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e00650120456d6974732060546970436c6f73696e676020696620746865207468726573686f6c64206f66207469707065727320686173206265656e207265616368656420616e642074686520636f756e74646f776e20706572696f64342068617320737461727465642e002c2023203c7765696768743ee4202d20436f6d706c65786974793a20604f285429602077686572652060546020697320746865206e756d626572206f6620746970706572732e15012020206465636f64696e6720605469707065726020766563206f66206c656e677468206054602c20696e736572742074697020616e6420636865636b20636c6f73696e672c0101202020605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e05012020205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602e00610120202041637475616c6c792077656967687420636f756c64206265206c6f77657220617320697420646570656e6473206f6e20686f77206d616e7920746970732061726520696e20604f70656e5469706020627574206974d4202020697320776569676874656420617320696620616c6d6f73742066756c6c20692e65206f66206c656e6774682060542d31602e74202d20446252656164733a206054697070657273602c206054697073604c202d2044625772697465733a20605469707360302023203c2f7765696768743e24636c6f73655f7469700410686173681c543a3a48617368446020436c6f736520616e64207061796f75742061207469702e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0019012054686520746970206964656e74696669656420627920606861736860206d75737420686176652066696e69736865642069747320636f756e74646f776e20706572696f642e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e002c2023203c7765696768743ee4202d20436f6d706c65786974793a20604f285429602077686572652060546020697320746865206e756d626572206f6620746970706572732e9c2020206465636f64696e6720605469707065726020766563206f66206c656e677468206054602e0101202020605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e05012020205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602eac202d20446252656164733a206054697073602c206054697070657273602c20607469702066696e64657260dc202d2044625772697465733a2060526561736f6e73602c206054697073602c206054697070657273602c20607469702066696e64657260302023203c2f7765696768743e012c2050726f706f736564043450726f706f73616c496e646578047c204e65772070726f706f73616c2e205b70726f706f73616c5f696e6465785d205370656e64696e67041c42616c616e6365043501205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e205b6275646765745f72656d61696e696e675d1c417761726465640c3450726f706f73616c496e6465781c42616c616e6365244163636f756e74496404150120536f6d652066756e64732068617665206265656e20616c6c6f63617465642e205b70726f706f73616c5f696e6465782c2061776172642c2062656e65666963696172795d2052656a6563746564083450726f706f73616c496e6465781c42616c616e6365041d0120412070726f706f73616c207761732072656a65637465643b2066756e6473207765726520736c61736865642e205b70726f706f73616c5f696e6465782c20736c61736865645d144275726e74041c42616c616e636504a820536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e205b6275726e5d20526f6c6c6f766572041c42616c616e6365047d01205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e205b6275646765745f72656d61696e696e675d1c4465706f736974041c42616c616e636504a820536f6d652066756e64732068617665206265656e206465706f73697465642e205b6465706f7369745d184e657754697004104861736804c42041206e6577207469702073756767657374696f6e20686173206265656e206f70656e65642e205b7469705f686173685d28546970436c6f73696e670410486173680409012041207469702073756767657374696f6e206861732072656163686564207468726573686f6c6420616e6420697320636c6f73696e672e205b7469705f686173685d24546970436c6f7365640c1048617368244163636f756e7449641c42616c616e636504e82041207469702073756767657374696f6e20686173206265656e20636c6f7365642e205b7469705f686173682c2077686f2c207061796f75745d3054697052657472616374656404104861736804c02041207469702073756767657374696f6e20686173206265656e207265747261637465642e205b7469705f686173685d243050726f706f73616c426f6e641c5065726d696c6c1050c30000085501204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e110120416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e4c50726f706f73616c426f6e644d696e696d756d3042616c616e63654f663c543e404835261a080300000000000000000000044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f6438543a3a426c6f636b4e756d6265721080510100048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e1c5065726d696c6c10d00700000411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e30546970436f756e74646f776e38543a3a426c6f636b4e756d62657210403800000445012054686520706572696f6420666f722077686963682061207469702072656d61696e73206f70656e20616674657220697320686173206163686965766564207468726573686f6c6420746970706572732e3454697046696e646572734665651c50657263656e7404140431012054686520616d6f756e74206f66207468652066696e616c2074697020776869636820676f657320746f20746865206f726967696e616c207265706f72746572206f6620746865207469702e505469705265706f72744465706f736974426173653042616c616e63654f663c543e40aa821bce26000000000000000000000004d42054686520616d6f756e742068656c64206f6e206465706f73697420666f7220706c6163696e67206120746970207265706f72742e5c5469705265706f72744465706f736974506572427974653042616c616e63654f663c543e40aa5057630000000000000000000000000409012054686520616d6f756e742068656c64206f6e206465706f7369742070657220627974652077697468696e2074686520746970207265706f727420726561736f6e2e204d6f64756c654964204d6f64756c6549642070792f7472737279041901205468652074726561737572792773206d6f64756c652069642c207573656420666f72206465726976696e672069747320736f7665726569676e206163636f756e742049442e2070496e73756666696369656e7450726f706f7365727342616c616e6365047c2050726f706f73657227732062616c616e636520697320746f6f206c6f772e50496e76616c696450726f706f73616c496e646578046c204e6f2070726f706f73616c206174207468617420696e6465782e30526561736f6e546f6f42696704882054686520726561736f6e20676976656e206973206a75737420746f6f206269672e30416c72656164794b6e6f776e048c20546865207469702077617320616c726561647920666f756e642f737461727465642e28556e6b6e6f776e54697004642054686520746970206861736820697320756e6b6e6f776e2e244e6f7446696e64657204210120546865206163636f756e7420617474656d7074696e6720746f20726574726163742074686520746970206973206e6f74207468652066696e646572206f6620746865207469702e245374696c6c4f70656e042d0120546865207469702063616e6e6f7420626520636c61696d65642f636c6f736564206265636175736520746865726520617265206e6f7420656e6f7567682074697070657273207965742e245072656d617475726504350120546865207469702063616e6e6f7420626520636c61696d65642f636c6f73656420626563617573652069742773207374696c6c20696e2074686520636f756e74646f776e20706572696f642e18436c61696d730118436c61696d731418436c61696d730001063c457468657265756d416464726573733042616c616e63654f663c543e0004000014546f74616c01003042616c616e63654f663c543e4000000000000000000000000000000000001c56657374696e670001063c457468657265756d41646472657373b02842616c616e63654f663c543e2c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265722900040010782056657374696e67207363686564756c6520666f72206120636c61696d2e0d012046697273742062616c616e63652069732074686520746f74616c20616d6f756e7420746861742073686f756c642062652068656c6420666f722076657374696e672ee4205365636f6e642062616c616e636520697320686f77206d7563682073686f756c6420626520756e6c6f636b65642070657220626c6f636b2ecc2054686520626c6f636b206e756d626572206973207768656e207468652076657374696e672073686f756c642073746172742e1c5369676e696e670001063c457468657265756d416464726573733453746174656d656e744b696e6400040004c0205468652073746174656d656e74206b696e642074686174206d757374206265207369676e65642c20696620616e792e24507265636c61696d7300010630543a3a4163636f756e7449643c457468657265756d41646472657373000400042d01205072652d636c61696d656420457468657265756d206163636f756e74732c20627920746865204163636f756e74204944207468617420746865792061726520636c61696d656420746f2e011414636c61696d08106465737430543a3a4163636f756e74496448657468657265756d5f7369676e61747572653845636473615369676e6174757265988c204d616b65206120636c61696d20746f20636f6c6c65637420796f757220444f54732e00c820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f4e6f6e655f2e005420556e7369676e65642056616c69646174696f6e3a090120412063616c6c20746f20636c61696d206973206465656d65642076616c696420696620746865207369676e61747572652070726f7669646564206d6174636865738020746865206578706563746564207369676e6564206d657373616765206f663a006c203e20457468657265756d205369676e6564204d6573736167653a98203e2028636f6e666967757265642070726566697820737472696e672928616464726573732900a820616e6420606164647265737360206d6174636865732074686520606465737460206163636f756e742e003020506172616d65746572733adc202d206064657374603a205468652064657374696e6174696f6e206163636f756e7420746f207061796f75742074686520636c61696d2e1101202d2060657468657265756d5f7369676e6174757265603a20546865207369676e6174757265206f6620616e20657468657265756d207369676e6564206d657373616765a0202020206d61746368696e672074686520666f726d6174206465736372696265642061626f76652e0024203c7765696768743e01012054686520776569676874206f6620746869732063616c6c20697320696e76617269616e74206f7665722074686520696e70757420706172616d65746572732e0501202d204f6e6520606574685f7265636f76657260206f7065726174696f6e20776869636820696e766f6c7665732061206b656363616b206861736820616e642061442020206563647361207265636f7665722e0901202d2054687265652073746f7261676520726561647320746f20636865636b206966206120636c61696d2065786973747320666f722074686520757365722c20746f1d01202020676574207468652063757272656e7420706f742073697a652c20746f207365652069662074686572652065786973747320612076657374696e67207363686564756c652ef4202d20557020746f206f6e652073746f7261676520777269746520666f7220616464696e672061206e65772076657374696e67207363686564756c652ea0202d204f6e6520606465706f7369745f6372656174696e67602043757272656e63792063616c6c2ea4202d204f6e652073746f7261676520777269746520746f207570646174652074686520746f74616c2eec202d2054776f2073746f726167652072656d6f76616c7320666f722076657374696e6720616e6420636c61696d7320696e666f726d6174696f6e2e54202d204f6e65206465706f736974206576656e742e005c20546f74616c20436f6d706c65786974793a204f28312974202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a203236392e3720c2b5732c204442205765696768743a5d01202d20526561643a205369676e696e672c20436c61696d732c20546f74616c2c20436c61696d732056657374696e672c2056657374696e672056657374696e672c2042616c616e6365204c6f636b2c204163636f756e745d01202d2057726974653a2056657374696e672056657374696e672c204163636f756e742c2042616c616e6365204c6f636b2c20546f74616c2c20436c61696d2c20436c61696d732056657374696e672c205369676e696e67782056616c696461746520556e7369676e65643a202b3138382e3720c2b57328203c2f7765696768743e286d696e745f636c61696d100c77686f3c457468657265756d416464726573731476616c75653042616c616e63654f663c543e4076657374696e675f7363686564756c65d04f7074696f6e3c2842616c616e63654f663c543e2c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d626572293e2473746174656d656e74544f7074696f6e3c53746174656d656e744b696e643e5c88204d696e742061206e657720636c61696d20746f20636f6c6c65637420444f54732e00c820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e003020506172616d65746572733af4202d206077686f603a2054686520457468657265756d206164647265737320616c6c6f77656420746f20636f6c6c656374207468697320636c61696d2ed0202d206076616c7565603a20546865206e756d626572206f6620444f547320746861742077696c6c20626520636c61696d65642e0d01202d206076657374696e675f7363686564756c65603a20416e206f7074696f6e616c2076657374696e67207363686564756c6520666f7220746865736520444f54732e0024203c7765696768743e01012054686520776569676874206f6620746869732063616c6c20697320696e76617269616e74206f7665722074686520696e70757420706172616d65746572732ef4202d204f6e652073746f72616765206d757461746520746f20696e6372656173652074686520746f74616c20636c61696d7320617661696c61626c652ea0202d204f6e652073746f7261676520777269746520746f206164642061206e657720636c61696d2ee4202d20557020746f206f6e652073746f7261676520777269746520746f206164642061206e65772076657374696e67207363686564756c652e005c20546f74616c20436f6d706c65786974793a204f28312958202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2031302e343620c2b5732c204442205765696768743a3c202d2052656164733a20546f74616c60202d205772697465733a20546f74616c2c20436c61696d7388202d204d617962652057726974653a2056657374696e672c2053746174656d656e7428203c2f7765696768743e30636c61696d5f6174746573740c106465737430543a3a4163636f756e74496448657468657265756d5f7369676e61747572653845636473615369676e61747572652473746174656d656e741c5665633c75383ea4e8204d616b65206120636c61696d20746f20636f6c6c65637420796f757220444f5473206279207369676e696e6720612073746174656d656e742e00c820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f4e6f6e655f2e005420556e7369676e65642056616c69646174696f6e3a2d0120412063616c6c20746f2060636c61696d5f61747465737460206973206465656d65642076616c696420696620746865207369676e61747572652070726f7669646564206d6174636865738020746865206578706563746564207369676e6564206d657373616765206f663a006c203e20457468657265756d205369676e6564204d6573736167653ac4203e2028636f6e666967757265642070726566697820737472696e67292861646472657373292873746174656d656e7429004d0120616e6420606164647265737360206d6174636865732074686520606465737460206163636f756e743b20746865206073746174656d656e7460206d757374206d617463682074686174207768696368206973c4206578706563746564206163636f7264696e6720746f20796f757220707572636861736520617272616e67656d656e742e003020506172616d65746572733adc202d206064657374603a205468652064657374696e6174696f6e206163636f756e7420746f207061796f75742074686520636c61696d2e1101202d2060657468657265756d5f7369676e6174757265603a20546865207369676e6174757265206f6620616e20657468657265756d207369676e6564206d657373616765a0202020206d61746368696e672074686520666f726d6174206465736372696265642061626f76652e6901202d206073746174656d656e74603a20546865206964656e74697479206f66207468652073746174656d656e74207768696368206973206265696e6720617474657374656420746f20696e20746865207369676e61747572652e0024203c7765696768743e01012054686520776569676874206f6620746869732063616c6c20697320696e76617269616e74206f7665722074686520696e70757420706172616d65746572732e0501202d204f6e6520606574685f7265636f76657260206f7065726174696f6e20776869636820696e766f6c7665732061206b656363616b206861736820616e642061442020206563647361207265636f7665722e0501202d20466f75722073746f7261676520726561647320746f20636865636b206966206120636c61696d2065786973747320666f722074686520757365722c20746f4901202020676574207468652063757272656e7420706f742073697a652c20746f207365652069662074686572652065786973747320612076657374696e67207363686564756c652c20746f20676574207468655820202072657175697265642073746174656d656e742ef4202d20557020746f206f6e652073746f7261676520777269746520666f7220616464696e672061206e65772076657374696e67207363686564756c652ea0202d204f6e6520606465706f7369745f6372656174696e67602043757272656e63792063616c6c2ea4202d204f6e652073746f7261676520777269746520746f207570646174652074686520746f74616c2eec202d2054776f2073746f726167652072656d6f76616c7320666f722076657374696e6720616e6420636c61696d7320696e666f726d6174696f6e2e54202d204f6e65206465706f736974206576656e742e005c20546f74616c20436f6d706c65786974793a204f28312974202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a203237302e3220c2b5732c204442205765696768743a5d01202d20526561643a205369676e696e672c20436c61696d732c20546f74616c2c20436c61696d732056657374696e672c2056657374696e672056657374696e672c2042616c616e6365204c6f636b2c204163636f756e745d01202d2057726974653a2056657374696e672056657374696e672c204163636f756e742c2042616c616e6365204c6f636b2c20546f74616c2c20436c61696d2c20436c61696d732056657374696e672c205369676e696e67782056616c696461746520556e7369676e65643a202b3139302e3120c2b57328203c2f7765696768743e18617474657374042473746174656d656e741c5665633c75383e50f82041747465737420746f20612073746174656d656e742c206e656564656420746f2066696e616c697a652074686520636c61696d732070726f636573732e006901205741524e494e473a20496e73656375726520756e6c65737320796f757220636861696e20696e636c75646573206050726576616c69646174654174746573747360206173206120605369676e6564457874656e73696f6e602e005420556e7369676e65642056616c69646174696f6e3a2d0120412063616c6c20746f20617474657374206973206465656d65642076616c6964206966207468652073656e6465722068617320612060507265636c61696d602072656769737465726564f820616e642070726f76696465732061206073746174656d656e746020776869636820697320657870656374656420666f7220746865206163636f756e742e003020506172616d65746572733a6901202d206073746174656d656e74603a20546865206964656e74697479206f66207468652073746174656d656e74207768696368206973206265696e6720617474657374656420746f20696e20746865207369676e61747572652e0024203c7765696768743e5c20546f74616c20436f6d706c65786974793a204f28312974202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d582042617365205765696768743a2039332e3320c2b5732c204442205765696768743a8901202d20526561643a20507265636c61696d732c205369676e696e672c20436c61696d732c20546f74616c2c20436c61696d732056657374696e672c2056657374696e672056657374696e672c2042616c616e6365204c6f636b2c204163636f756e748901202d2057726974653a2056657374696e672056657374696e672c204163636f756e742c2042616c616e6365204c6f636b2c20546f74616c2c20436c61696d2c20436c61696d732056657374696e672c205369676e696e672c20507265636c61696d73a02056616c69646174652050726556616c6964617465417474657374733a202b382e36333120c2b57328203c2f7765696768743e286d6f76655f636c61696d0c0c6f6c643c457468657265756d416464726573730c6e65773c457468657265756d41646472657373386d617962655f707265636c61696d504f7074696f6e3c543a3a4163636f756e7449643e0001041c436c61696d65640c244163636f756e7449643c457468657265756d416464726573731c42616c616e6365046c20536f6d656f6e6520636c61696d656420736f6d6520444f54732e041850726566697814265b75385d807c506179204b534d7320746f20746865204b7573616d61206163636f756e743a04150120546865205072656669782074686174206973207573656420696e207369676e656420457468657265756d206d6573736167657320666f722074686973206e6574776f726b1860496e76616c6964457468657265756d5369676e6174757265047020496e76616c696420457468657265756d207369676e61747572652e405369676e65724861734e6f436c61696d047c20457468657265756d206164647265737320686173206e6f20636c61696d2e4053656e6465724861734e6f436c61696d0490204163636f756e742049442073656e64696e6720747820686173206e6f20636c61696d2e30506f74556e646572666c6f770865012054686572652773206e6f7420656e6f75676820696e2074686520706f7420746f20706179206f757420736f6d6520756e76657374656420616d6f756e742e2047656e6572616c6c7920696d706c6965732061206c6f6769631c206572726f722e40496e76616c696453746174656d656e7404942041206e65656465642073746174656d656e7420776173206e6f7420696e636c756465642e4c56657374656442616c616e636545786973747304a820546865206163636f756e7420616c7265616479206861732061207665737465642062616c616e63652e2850617261636861696e73012850617261636861696e73342c417574686f7269746965730100405665633c56616c696461746f7249643e0400049420416c6c20617574686f72697469657327206b65797320617420746865206d6f6d656e742e10436f6465000105185061726149643856616c69646174696f6e436f646500040004d4205468652061637469766520636f6465206f6620612063757272656e746c792d726567697374657265642070617261636861696e2e3050617374436f64654d65746101010518506172614964805061726150617374436f64654d6574613c543a3a426c6f636b4e756d6265723e000800000c4901205061737420636f6465206f662070617261636861696e732e205468652070617261636861696e73207468656d73656c766573206d6179206e6f74206265207265676973746572656420616e796d6f72652c49012062757420776520616c736f206b65657020746865697220636f6465206f6e2d636861696e20666f72207468652073616d6520616d6f756e74206f662074696d65206173206f7574646174656420636f64657420746f20617373697374207769746820617661696c6162696c6974792e2050617374436f646500010560285061726149642c20543a3a426c6f636b4e756d626572293856616c69646174696f6e436f64650004000839012041637475616c207061737420636f64652c20696e64696361746564206279207468652070617261636861696e20616e642074686520626c6f636b206e756d6265722061742077686963682069744420626563616d65206f757464617465642e3c50617374436f64655072756e696e670100745665633c285061726149642c20543a3a426c6f636b4e756d626572293e040004a4205061737420636f6465207072756e696e672c20696e206f72646572206f66207072696f726974792e48467574757265436f646555706772616465730001051850617261496438543a3a426c6f636b4e756d6265720004000028467574757265436f6465010105185061726149643856616c69646174696f6e436f6465000400001448656164730001051850617261496420486561644461746100040004cc20546865206865616473206f66207468652070617261636861696e7320726567697374657265642061742070726573656e742e4852656c61794469737061746368517565756501010518506172614964485665633c5570776172644d6573736167653e000400081d01204d6573736167657320726561647920746f2062652064697370617463686564206f6e746f207468652072656c617920636861696e2e204974206973207375626a65637420746fc820604d41585f4d4553534147455f434f554e546020616e64206057415445524d41524b5f4d4553534147455f53495a45602e5852656c61794469737061746368517565756553697a650101051850617261496428287533322c2075333229002000000000000000000c45012053697a65206f6620746865206469737061746368207175657565732e205365706172617465642066726f6d2061637475616c206461746120696e206f7264657220746f2061766f696420636f73746c795901206465636f64696e67207768656e20636865636b696e6720726563656970742076616c69646974792e204669727374206974656d20696e207475706c652069732074686520636f756e74206f66206d65737361676573fc207365636f6e642069662074686520746f74616c206c656e6774682028696e20627974657329206f6620746865206d657373616765207061796c6f6164732e344e65656473446973706174636801002c5665633c5061726149643e040004110120546865206f726465726564206c697374206f662050617261496473207468617420686176652061206052656c6179446973706174636851756575656020656e7472792e2444696455706461746500002c5665633c5061726149643e04001059012060536f6d6560206966207468652070617261636861696e20686561647320676574207570646174656420696e207468697320626c6f636b2c20616c6f6e672077697468207468652070617261636861696e204944734901207468617420646964207570646174652e204f72646572656420696e207468652073616d652077617920617320607265676973747261723a3a416374697665602028692e652e20627920506172614964292e006c20604e6f6e6560206966206e6f742079657420757064617465642e50446f776e776172644d657373616765517565756501010518506172614964885665633c446f776e776172644d6573736167653c543a3a4163636f756e7449643e3e000400042901204d657373616765732077616974696e6720746f2062652064656c6976657265642066726f6d207468652052656c617920636861696e20696e746f207468652070617261636861696e2e0110247365745f686561647304146865616473585665633c417474657374656443616e6469646174653e0415012050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e487265706f72745f646f75626c655f766f746504187265706f7274cd01446f75626c65566f74655265706f72743c3c543a3a4b65794f776e657250726f6f6653797374656d2061730a20202020202020202020202020202020204b65794f776e657250726f6f6653797374656d3c284b65795479706549642c2056616c696461746f724964293e3e3a3a50726f6f663e1001012050726f7669646520612070726f6f66207468617420736f6d652076616c696461746f722068617320636f6d6d69746564206120646f75626c652d766f74652e001901205468652077656967687420697320303b20696e206f7264657220746f2061766f696420446f53206120605369676e6564457874656e73696f6e602076616c69646174696f6e4020697320696d706c656d656e7465642e547472616e736665725f746f5f70617261636861696e0c08746f1850617261496418616d6f756e741c42616c616e63651872656d61726b1852656d61726b046101205472616e7366657220736f6d6520746f6b656e7320696e746f20612070617261636861696e20616e64206c656176652061206d65737361676520696e2074686520646f776e7761726420717565756520666f722069742e4473656e645f78636d705f6d6573736167650808746f185061726149640c6d73671c5665633c75383e0cb02053656e6420612058434d50206d65737361676520746f2074686520676976656e2070617261636861696e2e009820546865206f726967696e206d75737420626520616e6f746865722070617261636861696e2e00005048546f6f4d616e79486561645570646174657304e02050617261636861696e206865616473206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b2e54546f6f4d616e795061726143616e64696461746573047c20546f6f206d616e792070617261636861696e2063616e646964617465732e3c48656164734f75744f664f726465720429012050726f706f736564206865616473206d75737420626520617363656e64696e67206f726465722062792070617261636861696e20494420776974686f7574206475706c69636174652e40556e726567697374657265645061726104b02043616e64696461746520697320666f7220616e20756e726567697374657265642070617261636861696e2e3c496e76616c6964436f6c6c61746f72044820496e76616c696420636f6c6c61746f722e24517565756546756c6c041d0120546865206d6573736167652071756575652069732066756c6c2e204d657373616765732077696c6c206265206164646564207768656e2074686572652069732073706163652e50496e76616c69644d6573736167654f726967696e047c20546865206d657373616765206f726967696e20697320696e76616c69642e404e6f56616c696461746f7247726f75700488204e6f2076616c696461746f722067726f757020666f722070617261636861696e2e584e6f74456e6f75676856616c6964697479566f74657304a4204e6f7420656e6f7567682076616c696469747920766f74657320666f722063616e6469646174652e5c566f74657345786365656473417574686f72697469657304f820546865206e756d626572206f66206174746573746174696f6e73206578636565647320746865206e756d626572206f6620617574686f7269746965732e5c57726f6e6756616c696461746f72417474657374696e6704e420417474657374696e672076616c696461746f72206e6f74206f6e207468697320636861696e27732076616c69646174696f6e20647574792e40496e76616c69645369676e6174757265048420496e76616c6964207369676e61747572652066726f6d2061747465737465722e34556e746167676564566f74657304d020457874726120756e7461676765642076616c696469747920766f74657320616c6f6e6720776974682063616e6469646174652e38506172656e744d69736d6174636804a42057726f6e6720706172656e74206865616420666f722070617261636861696e20726563656970742e404865616444617461546f6f4c617267650464204865616420646174612077617320746f6f206c617267652e5856616c69646174696f6e436f6465546f6f4c61726765048c204e65772076616c69646174696f6e20636f64652077617320746f6f206c617267652e54446973616c6c6f776564436f646555706772616465046420446973616c6c6f77656420636f646520757067726164652e3443616e6e6f745061794665657304bc205061726120646f6573206e6f74206861766520656e6f7567682062616c616e636520746f2070617920666565732e54556e657870656374656452656c6179506172656e7404c420556e65787065637465642072656c61792d706172656e7420666f7220612063616e64696461746520726563656970742e60446f776e776172644d657373616765517565756546756c6c04c820446f776e77617264206d6573736167652071756575652069732066756c6c20666f72207468652050617261636861696e2e304174746573746174696f6e7301304174746573746174696f6e730c40526563656e7450617261426c6f636b7300010538543a3a426c6f636b4e756d62657244496e636c75646564426c6f636b733c543e00040008f02041206d617070696e672066726f6d206d6f64756c617220626c6f636b206e756d62657220286e2025204174746573746174696f6e506572696f6429cc20746f2073657373696f6e20696e64657820616e6420746865206c697374206f662063616e646964617465206861736865732e5450617261426c6f636b4174746573746174696f6e7300020538543a3a426c6f636b4e756d626572104861736850426c6f636b4174746573746174696f6e733c543e06040004a8204174746573746174696f6e73206f6e206120726563656e742070617261636861696e20626c6f636b2e24446964557064617465010010626f6f6c0400000104446d6f72655f6174746573746174696f6e7304145f6d6f7265404d6f72654174746573746174696f6e730415012050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e0000044c546f6f4d616e794174746573746174696f6e7304d4204d6f7265206174746573746174696f6e732063616e206265206164646564206f6e6c79206f6e636520696e206120626c6f636b2e14536c6f74730114536c6f7473243841756374696f6e436f756e74657201003041756374696f6e496e646578100000000004d820546865206e756d626572206f662061756374696f6e7320746861742068617665206265656e207374617274656420736f206661722e284d616e6167656449647301002c5665633c5061726149643e0400084d01204f726465726564206c697374206f6620616c6c2060506172614964602076616c756573207468617420617265206d616e616765642062792074686973206d6f64756c652e205468697320696e636c75646573290120636861696e73207468617420617265206e6f7420796574206465706c6f7965642028627574206861766520776f6e20616e2061756374696f6e20696e2074686520667574757265292e204465706f7369747301010518506172614964445665633c42616c616e63654f663c543e3e000400345d0120566172696f757320616d6f756e7473206f6e206465706f73697420666f7220656163682070617261636861696e2e20416e20656e74727920696e20604d616e616765644964736020696d706c6965732061206e6f6e2d502064656661756c7420656e74727920686572652e006501205468652061637475616c20616d6f756e74206c6f636b6564206f6e2069747320626568616c6620617420616e792074696d6520697320746865206d6178696d756d206974656d20696e2074686973206c6973742e205468655101206669727374206974656d20696e20746865206c6973742069732074686520616d6f756e74206c6f636b656420666f72207468652063757272656e74204c6561736520506572696f642e20466f6c6c6f77696e67b0206974656d732061726520666f72207468652073756273657175656e74206c6561736520706572696f64732e006101205468652064656661756c742076616c75652028616e20656d707479206c6973742920696d706c6965732074686174207468652070617261636861696e206e6f206c6f6e6765722065786973747320286f72206e65766572b4206578697374656429206173206661722061732074686973206d6f64756c6520697320636f6e6365726e65642e00510120496620612070617261636861696e20646f65736e2774206578697374202a7965742a20627574206973207363686564756c656420746f20657869737420696e20746865206675747572652c207468656e2069745d012077696c6c206265206c6566742d7061646465642077697468206f6e65206f72206d6f7265207a65726f657320746f2064656e6f74652074686520666163742074686174206e6f7468696e672069732068656c64206f6e5d01206465706f73697420666f7220746865206e6f6e2d6578697374656e7420636861696e2063757272656e746c792c206275742069732068656c6420617420736f6d6520706f696e7420696e20746865206675747572652e2c41756374696f6e496e666f000088284c65617365506572696f644f663c543e2c20543a3a426c6f636b4e756d62657229040014f820496e666f726d6174696f6e2072656c6174696e6720746f207468652063757272656e742061756374696f6e2c206966207468657265206973206f6e652e00450120546865206669727374206974656d20696e20746865207475706c6520697320746865206c6561736520706572696f6420696e646578207468617420746865206669727374206f662074686520666f7572510120636f6e746967756f7573206c6561736520706572696f6473206f6e2061756374696f6e20697320666f722e20546865207365636f6e642069732074686520626c6f636b206e756d626572207768656e207468655d012061756374696f6e2077696c6c2022626567696e20746f20656e64222c20692e652e2074686520666972737420626c6f636b206f662074686520456e64696e6720506572696f64206f66207468652061756374696f6e2e1c57696e6e696e6700010538543a3a426c6f636b4e756d6265723857696e6e696e67446174613c543e0004000c5d01205468652077696e6e696e67206269647320666f722065616368206f66207468652031302072616e676573206174206561636820626c6f636b20696e207468652066696e616c20456e64696e6720506572696f64206f665101207468652063757272656e742061756374696f6e2e20546865206d61702773206b65792069732074686520302d626173656420696e64657820696e746f2074686520456e64696e6720506572696f642e205468651d0120666972737420626c6f636b206f662074686520656e64696e6720706572696f6420697320303b20746865206c6173742069732060456e64696e67506572696f64202d2031602e3c5265736572766564416d6f756e7473000105504269646465723c543a3a4163636f756e7449643e3042616c616e63654f663c543e00040008310120416d6f756e74732063757272656e746c7920726573657276656420696e20746865206163636f756e7473206f662074686520626964646572732063757272656e746c792077696e6e696e673820287375622d2972616e6765732e304f6e626f6172645175657565010105404c65617365506572696f644f663c543e2c5665633c5061726149643e0004000865012054686520736574206f662050617261204944732074686174206861766520776f6e20616e64206e65656420746f206265206f6e2d626f617264656420617420616e207570636f6d696e67206c656173652d706572696f642ef0205468697320697320636c6561726564206f7574206f6e2074686520666972737420626c6f636b206f6620746865206c6561736520706572696f642e284f6e626f617264696e6700010518506172614964f0284c65617365506572696f644f663c543e2c20496e636f6d696e6750617261636861696e3c543a3a4163636f756e7449642c20543a3a486173683e29000400104d01205468652061637475616c206f6e2d626f617264696e6720696e666f726d6174696f6e2e204f6e6c7920657869737473207768656e206f6e65206f662074686520666f6c6c6f77696e6720697320747275653a2501202d204974206973206265666f726520746865206c6561736520706572696f642074686174207468652070617261636861696e2073686f756c64206265206f6e2d626f61726465642e5901202d205468652066756c6c206f6e2d626f617264696e6720696e666f726d6174696f6e20686173206e6f7420796574206265656e2070726f766964656420616e64207468652070617261636861696e206973206e6f746c207965742064756520746f206265206f66662d626f61726465642e2c4f6666626f617264696e670101051850617261496430543a3a4163636f756e74496400800000000000000000000000000000000000000000000000000000000000000000086501204f66662d626f617264696e67206163636f756e743b2063757272656e63792068656c64206f6e206465706f73697420666f72207468652070617261636861696e206765747320706c6163656420686572652069662074686539012070617261636861696e2067657473206f66662d626f61726465643b20692e652e20697473206c6561736520706572696f6420697320757020616e642069742069736e27742072656e657765642e01182c6e65775f61756374696f6e08206475726174696f6e5c436f6d706163743c543a3a426c6f636b4e756d6265723e486c656173655f706572696f645f696e64657864436f6d706163743c4c65617365506572696f644f663c543e3e1458204372656174652061206e65772061756374696f6e2e00550120546869732063616e206f6e6c792068617070656e207768656e2074686572652069736e277420616c726561647920616e2061756374696f6e20696e2070726f677265737320616e64206d6179206f6e6c7920626529012063616c6c65642062792074686520726f6f74206f726967696e2e20416363657074732074686520606475726174696f6e60206f6620746869732061756374696f6e20616e64207468655d0120606c656173655f706572696f645f696e64657860206f662074686520696e697469616c206c6561736520706572696f64206f662074686520666f757220746861742061726520746f2062652061756374696f6e65642e0c626964140c73756238436f6d706163743c53756249643e3461756374696f6e5f696e64657854436f6d706163743c41756374696f6e496e6465783e2866697273745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e246c6173745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e18616d6f756e7454436f6d706163743c42616c616e63654f663c543e3e404d01204d616b652061206e6577206269642066726f6d20616e206163636f756e742028696e636c7564696e6720612070617261636861696e206163636f756e742920666f72206465706c6f79696e672061206e65772c2070617261636861696e2e005d01204d756c7469706c652073696d756c74616e656f757320626964732066726f6d207468652073616d65206269646465722061726520616c6c6f776564206f6e6c79206173206c6f6e6720617320616c6c2061637469766541012062696473206f7665726c61702065616368206f746865722028692e652e20617265206d757475616c6c79206578636c7573697665292e20426964732063616e6e6f742062652072656461637465642e005901202d20607375626020697320746865207375622d6269646465722049442c20616c6c6f77696e6720666f72206d756c7469706c6520636f6d706574696e67206269647320746f206265206d6164652062792028616e64742066756e64656420627929207468652073616d65206163636f756e742e5101202d206061756374696f6e5f696e646578602069732074686520696e646578206f66207468652061756374696f6e20746f20626964206f6e2e2053686f756c64206a757374206265207468652070726573656e746c2076616c7565206f66206041756374696f6e436f756e746572602e4d01202d206066697273745f736c6f746020697320746865206669727374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4501202d20606c6173745f736c6f746020697320746865206c617374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4d01202d2060616d6f756e74602069732074686520616d6f756e7420746f2062696420746f2062652068656c64206173206465706f73697420666f72207468652070617261636861696e2073686f756c6420746865cc206269642077696e2e205468697320616d6f756e742069732068656c64207468726f7567686f7574207468652072616e67652e246269645f72656e6577103461756374696f6e5f696e64657854436f6d706163743c41756374696f6e496e6465783e2866697273745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e246c6173745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e18616d6f756e7454436f6d706163743c42616c616e63654f663c543e3e3c5101204d616b652061206e6577206269642066726f6d20612070617261636861696e206163636f756e7420666f722072656e6577696e67207468617420287072652d6578697374696e67292070617261636861696e2e00a820546865206f726967696e202a6d7573742a20626520612070617261636861696e206163636f756e742e005d01204d756c7469706c652073696d756c74616e656f757320626964732066726f6d207468652073616d65206269646465722061726520616c6c6f776564206f6e6c79206173206c6f6e6720617320616c6c2061637469766541012062696473206f7665726c61702065616368206f746865722028692e652e20617265206d757475616c6c79206578636c7573697665292e20426964732063616e6e6f742062652072656461637465642e005101202d206061756374696f6e5f696e646578602069732074686520696e646578206f66207468652061756374696f6e20746f20626964206f6e2e2053686f756c64206a757374206265207468652070726573656e746c2076616c7565206f66206041756374696f6e436f756e746572602e4d01202d206066697273745f736c6f746020697320746865206669727374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4501202d20606c6173745f736c6f746020697320746865206c617374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4d01202d2060616d6f756e74602069732074686520616d6f756e7420746f2062696420746f2062652068656c64206173206465706f73697420666f72207468652070617261636861696e2073686f756c6420746865cc206269642077696e2e205468697320616d6f756e742069732068656c64207468726f7567686f7574207468652072616e67652e3c7365745f6f6666626f617264696e670410646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636514c82053657420746865206f66662d626f617264696e6720696e666f726d6174696f6e20666f7220612070617261636861696e2e00a820546865206f726967696e202a6d7573742a20626520612070617261636861696e206163636f756e742e002101202d20606465737460206973207468652064657374696e6174696f6e206163636f756e7420746f2072656365697665207468652070617261636861696e2773206465706f7369742e3c6669785f6465706c6f795f64617461140c73756238436f6d706163743c53756249643e1c706172615f69643c436f6d706163743c5061726149643e24636f64655f686173681c543a3a4861736824636f64655f73697a650c75333244696e697469616c5f686561645f646174612048656164446174611c2d012053657420746865206465706c6f7920696e666f726d6174696f6e20666f722061207375636365737366756c2062696420746f206465706c6f792061206e65772070617261636861696e2e00c8202d20606f726967696e60206d75737420626520746865207375636365737366756c20626964646572206163636f756e742eb0202d20607375626020697320746865207375622d626964646572204944206f6620746865206269646465722e0101202d2060706172615f696460206973207468652070617261636861696e20494420616c6c6f7474656420746f207468652077696e6e696e67206269646465722e1d01202d2060636f64655f6861736860206973207468652068617368206f66207468652070617261636861696e2773205761736d2076616c69646174696f6e2066756e6374696f6e2ef0202d2060696e697469616c5f686561645f6461746160206973207468652070617261636861696e277320696e697469616c206865616420646174612e54656c61626f726174655f6465706c6f795f64617461081c706172615f69643c436f6d706163743c5061726149643e10636f64653856616c69646174696f6e436f64653074204e6f74652061206e65772070617261636861696e277320636f64652e004d012054686973206d7573742062652063616c6c656420616674657220606669785f6465706c6f795f646174616020616e642060636f646560206d7573742062652074686520707265696d616765206f6620746865c42060636f64655f68617368602070617373656420746865726520666f72207468652073616d652060706172615f6964602e0061012054686973206d61792062652063616c6c6564206265666f7265206f722061667465722074686520626567696e6e696e67206f66207468652070617261636861696e2773206669727374206c6561736520706572696f642e45012049662063616c6c6564206265666f7265207468656e207468652070617261636861696e2077696c6c206265636f6d65206163746976652061742074686520666972737420626c6f636b206f66206974736501207374617274696e67206c6561736520706572696f642e2049662061667465722c207468656e2069742077696c6c206265636f6d652061637469766520696d6d6564696174656c7920616674657220746869732063616c6c2e006c202d20605f6f726967696e6020697320697272656c6576616e742efc202d2060706172615f696460206973207468652070617261636861696e2049442077686f736520636f64652077696c6c20626520656c61626f72617465642e1501202d2060636f6465602069732074686520707265696d616765206f662074686520726567697374657265642060636f64655f6861736860206f662060706172615f6964602e011c384e65774c65617365506572696f64042c4c65617365506572696f6404842041206e6577206c6561736520706572696f6420697320626567696e6e696e672e3841756374696f6e537461727465640c3041756374696f6e496e6465782c4c65617365506572696f642c426c6f636b4e756d626572084d0120416e2061756374696f6e20737461727465642e2050726f76696465732069747320696e64657820616e642074686520626c6f636b206e756d6265722077686572652069742077696c6c20626567696e20746f190120636c6f736520616e6420746865206669727374206c6561736520706572696f64206f662074686520717561647275706c657420746861742069732061756374696f6e65642e3441756374696f6e436c6f736564043041756374696f6e496e64657804bc20416e2061756374696f6e20656e6465642e20416c6c2066756e6473206265636f6d6520756e72657365727665642e24576f6e4465706c6f7910504e65774269646465723c4163636f756e7449643e24536c6f7452616e6765185061726149641c42616c616e636504550120536f6d656f6e6520776f6e2074686520726967687420746f206465706c6f7920612070617261636861696e2e2042616c616e636520616d6f756e7420697320646564756374656420666f72206465706f7369742e28576f6e52656e6577616c101850617261496424536c6f7452616e67651c42616c616e63651c42616c616e636508c420416e206578697374696e672070617261636861696e20776f6e2074686520726967687420746f20636f6e74696e75652e41012046697273742062616c616e63652069732074686520657874726120616d6f756e7420726573657665642e205365636f6e642069732074686520746f74616c20616d6f756e742072657365727665642e2052657365727665640c244163636f756e7449641c42616c616e63651c42616c616e6365084d012046756e6473207765726520726573657276656420666f7220612077696e6e696e67206269642e2046697273742062616c616e63652069732074686520657874726120616d6f756e742072657365727665642e54205365636f6e642069732074686520746f74616c2e28556e726573657276656408244163636f756e7449641c42616c616e636504e02046756e6473207765726520756e72657365727665642073696e636520626964646572206973206e6f206c6f6e676572206163746976652e00344441756374696f6e496e50726f6772657373049420546869732061756374696f6e20697320616c726561647920696e2070726f67726573732e444c65617365506572696f64496e50617374048420546865206c6561736520706572696f6420697320696e2074686520706173742e344e6f74506172614f726967696e04b820546865206f726967696e20666f7220746869732063616c6c206d75737420626520612070617261636861696e2e44506172614e6f744f6e626f617264696e670490205468652070617261636861696e204944206973206e6f74206f6e626f617264696e672e34496e76616c69644f726967696e04290120546865206f726967696e20666f7220746869732063616c6c206d75737420626520746865206f726967696e2077686f2072656769737465726564207468652070617261636861696e2e44416c72656164795265676973746572656404842050617261636861696e20697320616c726561647920726567697374657265642e2c496e76616c6964436f646504982054686520636f6465206d75737420636f72726573706f6e6420746f2074686520686173682e3c556e7365744465706c6f794461746104d4204465706c6f796d656e74206461746120686173206e6f74206265656e2073657420666f7220746869732070617261636861696e2e504e6f6e496e74657273656374696e6752616e676504b82054686520626964206d757374206f7665726c617020616c6c20696e74657273656374696e672072616e6765732e444e6f7443757272656e7441756374696f6e045c204e6f7420612063757272656e742061756374696f6e2e284e6f7441756374696f6e0440204e6f7420616e2061756374696f6e2e30436f6465546f6f4c61726765047820476976656e20636f64652073697a6520697320746f6f206c617267652e404865616444617461546f6f4c61726765049820476976656e20696e697469616c2068656164206461746120697320746f6f206c617267652e245265676973747261720124526567697374726172242850617261636861696e7301002c5665633c5061726149643e0400002c546872656164436f756e7401000c753332100000000004b420546865206e756d626572206f66207468726561647320746f207363686564756c652070657220626c6f636b2e3c53656c6563746564546872656164730100785665633c5665633c285061726149642c20436f6c6c61746f724964293e3e040008510120416e206172726179206f6620746865207175657565206f6620736574206f662074687265616473207363686564756c656420666f722074686520636f6d696e6720626c6f636b733b206f726465726564206279310120617363656e64696e6720706172612049442e2054686572652063616e206265206e6f206475706c696361746573206f66207061726120494420696e2065616368206c697374206974656d2e184163746976650100b85665633c285061726149642c204f7074696f6e3c28436f6c6c61746f7249642c20526574726961626c65293e293e0400185d012050617261746872656164732f636861696e73207363686564756c656420666f7220657865637574696f6e207468697320626c6f636b2e2049662074686520636f6c6c61746f72204944206973207365742c207468656e6101206120706172746963756c617220636f6c6c61746f722068617320616c7265616479206265656e2063686f73656e20666f7220746865206e65787420626c6f636b2c20616e64206e6f206f7468657220636f6c6c61746f725901206d61792070726f766964652074686520626c6f636b2e20496e2074686973206361736520776520616c6c6f772074686520706f73736962696c697479206f662074686520636f6d62696e6174696f6e206265696e67d0207265747269656420696e2061206c6174657220626c6f636b2c206578707265737365642062792060526574726961626c65602e004c204f726465726564206279205061726149642e284e65787446726565496401001850617261496410e8030000083d0120546865206e65787420756e75736564205061726149642076616c75652e2053746172742074686973206869676820696e206f7264657220746f206b656570206c6f77206e756d6265727320666f72542073797374656d2d6c6576656c20636861696e732e2c50656e64696e6753776170000105185061726149641850617261496400040004642050656e64696e672073776170206f7065726174696f6e732e145061726173000105185061726149642050617261496e666f00040004a8204d6170206f6620616c6c20726567697374657265642070617261746872656164732f636861696e732e28526574727951756575650100785665633c5665633c285061726149642c20436f6c6c61746f724964293e3e040004e8205468652063757272656e7420717565756520666f7220706172617468726561647320746861742073686f756c6420626520726574726965642e1c446562746f72730101051850617261496430543a3a4163636f756e7449640080000000000000000000000000000000000000000000000000000000000000000004ac2055736572732077686f20686176652070616964206120706172617468726561642773206465706f736974011c3472656769737465725f70617261100869643c436f6d706163743c5061726149643e10696e666f2050617261496e666f10636f64653856616c69646174696f6e436f646544696e697469616c5f686561645f6461746120486561644461746114f820526567697374657220612070617261636861696e207769746820676976656e20636f64652e204d7573742062652063616c6c656420627920726f6f742e8c204661696c7320696620676976656e20494420697320616c726561647920757365642e00f420556e6c696b65207468652060526567697374726172602074726169742066756e6374696f6e206f66207468652073616d65206e616d652c2074686973cc20636865636b732074686520636f646520616e642068656164206461746120616761696e73742073697a65206c696d6974732e3c646572656769737465725f70617261040869643c436f6d706163743c5061726149643e0494204465726567697374657220612070617261636861696e207769746820676976656e206964407365745f7468726561645f636f756e740414636f756e740c75333214410120526573657420746865206e756d626572206f6620706172617468726561647320746861742063616e2070617920746f206265207363686564756c656420696e20612073696e676c6520626c6f636b2e0098202d2060636f756e74603a20546865206e756d626572206f662070617261746872656164732e0084204d7573742062652063616c6c65642066726f6d20526f6f74206f726967696e2e4c72656769737465725f706172617468726561640810636f64653856616c69646174696f6e436f646544696e697469616c5f686561645f6461746120486561644461746120a42052656769737465722061207061726174687265616420666f7220696d6d656469617465207573652e004d01204d7573742062652073656e742066726f6d2061205369676e6564206f726967696e20746861742069732061626c6520746f206861766520506172617468726561644465706f7369742072657365727665642e39012060636f64656020616e642060696e697469616c5f686561645f646174616020617265207573656420746f20696e697469616c697a6520746865207061726174687265616427732073746174652e00310120556e6c696b65206072656769737465725f70617261602c20746869732066756e6374696f6e20646f657320636865636b207468617420746865206d6178696d756d20636f64652073697a65290120616e64206865616420646174612073697a6520617265207265737065637465642c206173207061726174687265616420726567697374726174696f6e20697320616e2061746f6d69632020616374696f6e2e4473656c6563745f706172617468726561640c0c5f69643c436f6d706163743c5061726149643e245f636f6c6c61746f7228436f6c6c61746f724964285f686561645f686173681c543a3a4861736814050120506c61636520612062696420666f722061207061726174687265616420746f2062652070726f6772657373656420696e20746865206e65787420626c6f636b2e00410120546869732069732061206b696e64206f66207370656369616c207472616e73616374696f6e20746861742073686f756c642062652068656176696c79207072696f726974697a656420696e207468655d01207472616e73616374696f6e20706f6f6c206163636f7264696e6720746f20746865206076616c7565603b206f6e6c792060546872656164436f756e7460206f66207468656d206d61792062652070726573656e7465645420696e20616e792073696e676c6520626c6f636b2e54646572656769737465725f70617261746872656164001cc820446572656769737465722061207061726174687265616420616e6420726574726965766520746865206465706f7369742e002101204d7573742062652073656e742066726f6d2061206050617261636861696e60206f726967696e2077686963682069732063757272656e746c79206120706172617468726561642e00590120456e737572652074686174206265666f72652063616c6c696e672074686973207468617420616e792066756e647320796f752077616e7420656d70746965642066726f6d20746865207061726174687265616427734501206163636f756e74206973206d6f766564206f75743b20616674657220746869732069742077696c6c20626520696d706f737369626c6520746f207265747269657665207468656d2028776974686f75746820676f7665726e616e636520696e74657276656e74696f6e292e107377617004146f746865723c436f6d706163743c5061726149643e206501205377617020612070617261636861696e207769746820616e6f746865722070617261636861696e206f7220706172617468726561642e20546865206f726967696e206d7573742062652061206050617261636861696e602e65012054686520737761702077696c6c2068617070656e206f6e6c7920696620746865726520697320616c726561647920616e206f70706f7369746520737761702070656e64696e672e204966207468657265206973206e6f742c5d012074686520737761702077696c6c2062652073746f72656420696e207468652070656e64696e67207377617073206d61702c20726561647920666f722061206c6174657220636f6e6669726d61746f727920737761702e00610120546865206050617261496460732072656d61696e206d617070656420746f207468652073616d652068656164206461746120616e6420636f646520736f2065787465726e616c20636f64652063616e2072656c79206f6e410120605061726149646020746f2062652061206c6f6e672d7465726d206964656e746966696572206f662061206e6f74696f6e616c202270617261636861696e222e20486f77657665722c2074686569725901207363686564756c696e6720696e666f2028692e652e2077686574686572207468657927726520612070617261746872656164206f722070617261636861696e292c2061756374696f6e20696e666f726d6174696f6e9820616e64207468652061756374696f6e206465706f736974206172652073776974636865642e0108505061726174687265616452656769737465726564041850617261496404d4204120706172617468726561642077617320726567697374657265643b20697473206e657720494420697320737570706c6965642e5850617261746872656164446572656769737465726564041850617261496404d4205468652070617261746872656164206f662074686520737570706c696564204944207761732064652d726567697374657265642e00144450617261416c726561647945786973747304682050617261636861696e20616c7265616479206578697374732e38496e76616c6964436861696e4964045820496e76616c69642070617261636861696e2049442e3c496e76616c69645468726561644964045c20496e76616c696420706172617468726561642049442e30436f6465546f6f4c61726765046020496e76616c6964207061726120636f64652073697a652e404865616444617461546f6f4c61726765047420496e76616c69642070617261206865616420646174612073697a652e1c5574696c697479000108146261746368041463616c6c735c5665633c3c542061732054726169743e3a3a43616c6c3e50802053656e642061206261746368206f662064697370617463682063616c6c732e007c204d61792062652063616c6c65642066726f6d20616e79206f726967696e2e00f0202d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e006101204966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c75646573c820627970617373696e6720606672616d655f73797374656d3a3a54726169743a3a4261736543616c6c46696c74657260292e002c2023203c7765696768743e90202d2042617365207765696768743a2031342e3339202b202e393837202a206320c2b573b8202d20506c7573207468652073756d206f66207468652077656967687473206f6620746865206063616c6c73602ec4202d20506c7573206f6e65206164646974696f6e616c206576656e742e202872657065617420726561642f777269746529302023203c2f7765696768743e00590120546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e3501206576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e20746865590120604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d616465510120616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c657465646050206576656e74206973206465706f73697465642e3461735f646572697661746976650814696e6465780c7531361063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e48e02053656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e0059012046696c7465722066726f6d206f726967696e206172652070617373656420616c6f6e672e205468652063616c6c2077696c6c2062652064697370617463686564207769746820616e206f726967696e207768696368c020757365207468652073616d652066696c74657220617320746865206f726967696e206f6620746869732063616c6c2e004901204e4f54453a20496620796f75206e65656420746f20656e73757265207468617420616e79206163636f756e742d62617365642066696c746572696e67206973206e6f7420686f6e6f7265642028692e652e6501206265636175736520796f7520657870656374206070726f78796020746f2068617665206265656e2075736564207072696f7220696e207468652063616c6c20737461636b20616e6420796f7520646f206e6f742077616e745501207468652063616c6c207265737472696374696f6e7320746f206170706c7920746f20616e79207375622d6163636f756e7473292c207468656e20757365206061735f6d756c74695f7468726573686f6c645f31608020696e20746865204d756c74697369672070616c6c657420696e73746561642e00f8204e4f54453a205072696f7220746f2076657273696f6e202a31322c2074686973207761732063616c6c6564206061735f6c696d697465645f737562602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e64202d2042617365207765696768743a20322e38363120c2b57380202d20506c75732074686520776569676874206f6620746865206063616c6c60302023203c2f7765696768743e0108404261746368496e746572727570746564080c7533323444697370617463684572726f72085901204261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c206173882077656c6c20617320746865206572726f722e205b696e6465782c206572726f725d384261746368436f6d706c657465640004cc204261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e0000204964656e7469747901204964656e7469747910284964656e746974794f6600010530543a3a4163636f756e74496468526567697374726174696f6e3c42616c616e63654f663c543e3e0004000c210120496e666f726d6174696f6e20746861742069732070657274696e656e7420746f206964656e746966792074686520656e7469747920626568696e6420616e206163636f756e742e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e1c53757065724f6600010230543a3a4163636f756e7449645028543a3a4163636f756e7449642c204461746129000400086101205468652073757065722d6964656e74697479206f6620616e20616c7465726e6174697665202273756222206964656e7469747920746f676574686572207769746820697473206e616d652c2077697468696e2074686174510120636f6e746578742e20496620746865206163636f756e74206973206e6f7420736f6d65206f74686572206163636f756e742773207375622d6964656e746974792c207468656e206a75737420604e6f6e65602e18537562734f6601010530543a3a4163636f756e744964842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e290044000000000000000000000000000000000014b820416c7465726e6174697665202273756222206964656e746974696573206f662074686973206163636f756e742e001d0120546865206669727374206974656d20697320746865206465706f7369742c20746865207365636f6e64206973206120766563746f72206f6620746865206163636f756e74732e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e28526567697374726172730100d85665633c4f7074696f6e3c526567697374726172496e666f3c42616c616e63654f663c543e2c20543a3a4163636f756e7449643e3e3e0400104d012054686520736574206f6620726567697374726172732e204e6f7420657870656374656420746f206765742076657279206269672061732063616e206f6e6c79206265206164646564207468726f7567682061a8207370656369616c206f726967696e20286c696b656c79206120636f756e63696c206d6f74696f6e292e0029012054686520696e64657820696e746f20746869732063616e206265206361737420746f2060526567697374726172496e6465786020746f2067657420612076616c69642076616c75652e013c346164645f726567697374726172041c6163636f756e7430543a3a4163636f756e744964347c2041646420612072656769737472617220746f207468652073797374656d2e00010120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060543a3a5265676973747261724f726967696e602e00ac202d20606163636f756e74603a20746865206163636f756e74206f6620746865207265676973747261722e009820456d6974732060526567697374726172416464656460206966207375636365737366756c2e002c2023203c7765696768743e2901202d20604f2852296020776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e64656420616e6420636f64652d626f756e646564292e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e307365745f6964656e746974790410696e666f304964656e74697479496e666f4c2d012053657420616e206163636f756e742773206964656e7469747920696e666f726d6174696f6e20616e6420726573657276652074686520617070726f707269617465206465706f7369742e00590120496620746865206163636f756e7420616c726561647920686173206964656e7469747920696e666f726d6174696f6e2c20746865206465706f7369742069732074616b656e2061732070617274207061796d656e745420666f7220746865206e6577206465706f7369742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0090202d2060696e666f603a20546865206964656e7469747920696e666f726d6174696f6e2e008c20456d69747320604964656e7469747953657460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2858202b205827202b2052296021012020202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e64656429e42020202d20776865726520605260206a756467656d656e74732d636f756e7420287265676973747261722d636f756e742d626f756e6465642984202d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e2501202d204f6e652073746f72616765206d75746174696f6e2028636f6465632d7265616420604f285827202b205229602c20636f6465632d777269746520604f2858202b20522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e207365745f73756273041073756273645665633c28543a3a4163636f756e7449642c2044617461293e54902053657420746865207375622d6163636f756e7473206f66207468652073656e6465722e005901205061796d656e743a20416e79206167677265676174652062616c616e63652072657365727665642062792070726576696f757320607365745f73756273602063616c6c732077696c6c2062652072657475726e6564310120616e6420616e20616d6f756e7420605375624163636f756e744465706f736974602077696c6c20626520726573657276656420666f722065616368206974656d20696e206073756273602e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e00b4202d206073756273603a20546865206964656e74697479277320286e657729207375622d6163636f756e74732e002c2023203c7765696768743e34202d20604f2850202b20532960e82020202d20776865726520605060206f6c642d737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292ed82020202d2077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e88202d204174206d6f7374206f6e652062616c616e6365206f7065726174696f6e732e18202d2044423ae02020202d206050202b2053602073746f72616765206d75746174696f6e732028636f64656320636f6d706c657869747920604f2831296029c02020202d204f6e652073746f7261676520726561642028636f64656320636f6d706c657869747920604f28502960292ec42020202d204f6e652073746f726167652077726974652028636f64656320636f6d706c657869747920604f28532960292ed42020202d204f6e652073746f726167652d6578697374732028604964656e746974794f663a3a636f6e7461696e735f6b657960292e302023203c2f7765696768743e38636c6561725f6964656e7469747900483d0120436c65617220616e206163636f756e742773206964656e7469747920696e666f20616e6420616c6c207375622d6163636f756e747320616e642072657475726e20616c6c206465706f736974732e00f0205061796d656e743a20416c6c2072657365727665642062616c616e636573206f6e20746865206163636f756e74206172652072657475726e65642e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e009c20456d69747320604964656e74697479436c656172656460206966207375636365737366756c2e002c2023203c7765696768743e44202d20604f2852202b2053202b20582960d02020202d20776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e646564292ed82020202d2077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e25012020202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e646564292e8c202d204f6e652062616c616e63652d756e72657365727665206f7065726174696f6e2ecc202d206032602073746f7261676520726561647320616e64206053202b2032602073746f726167652064656c6574696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e44726571756573745f6a756467656d656e7408247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e1c6d61785f66656554436f6d706163743c42616c616e63654f663c543e3e5c9820526571756573742061206a756467656d656e742066726f6d2061207265676973747261722e005901205061796d656e743a204174206d6f737420606d61785f666565602077696c6c20626520726573657276656420666f72207061796d656e7420746f2074686520726567697374726172206966206a756467656d656e741c20676976656e2e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e002101202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973207265717565737465642e5901202d20606d61785f666565603a20546865206d6178696d756d206665652074686174206d617920626520706169642e20546869732073686f756c64206a757374206265206175746f2d706f70756c617465642061733a0034206060606e6f636f6d70696c65bc2053656c663a3a7265676973747261727328292e676574287265675f696e646578292e756e7772617028292e666565102060606000a820456d69747320604a756467656d656e7452657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2858202b205229602e34202d204f6e65206576656e742e302023203c2f7765696768743e3863616e63656c5f7265717565737404247265675f696e64657838526567697374726172496e646578446c2043616e63656c20612070726576696f757320726571756573742e00fc205061796d656e743a20412070726576696f75736c79207265736572766564206465706f7369742069732072657475726e6564206f6e20737563636573732e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e004901202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206e6f206c6f6e676572207265717565737465642e00b020456d69747320604a756467656d656e74556e72657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e8c202d204f6e652073746f72616765206d75746174696f6e20604f2852202b205829602e30202d204f6e65206576656e74302023203c2f7765696768743e1c7365745f6665650814696e6465785c436f6d706163743c526567697374726172496e6465783e0c66656554436f6d706163743c42616c616e63654f663c543e3e341d0120536574207468652066656520726571756972656420666f722061206a756467656d656e7420746f206265207265717565737465642066726f6d2061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e58202d2060666565603a20746865206e6577206665652e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602ee8202d2042656e63686d61726b3a20372e333135202b2052202a20302e33323920c2b57320286d696e207371756172657320616e616c7973697329302023203c2f7765696768743e387365745f6163636f756e745f69640814696e6465785c436f6d706163743c526567697374726172496e6465783e0c6e657730543a3a4163636f756e74496434c0204368616e676520746865206163636f756e74206173736f63696174656420776974682061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e74202d20606e6577603a20746865206e6577206163636f756e742049442e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602ee4202d2042656e63686d61726b3a20382e383233202b2052202a20302e333220c2b57320286d696e207371756172657320616e616c7973697329302023203c2f7765696768743e287365745f6669656c64730814696e6465785c436f6d706163743c526567697374726172496e6465783e186669656c6473384964656e746974794669656c647334ac2053657420746865206669656c6420696e666f726d6174696f6e20666f722061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e1101202d20606669656c6473603a20746865206669656c64732074686174207468652072656769737472617220636f6e6365726e73207468656d73656c76657320776974682e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602ee8202d2042656e63686d61726b3a20372e343634202b2052202a20302e33323520c2b57320286d696e207371756172657320616e616c7973697329302023203c2f7765696768743e4470726f766964655f6a756467656d656e740c247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365246a756467656d656e745c4a756467656d656e743c42616c616e63654f663c543e3e4cbc2050726f766964652061206a756467656d656e7420666f7220616e206163636f756e742773206964656e746974792e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74b4206f6620746865207265676973747261722077686f736520696e64657820697320607265675f696e646578602e002501202d20607265675f696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206265696e67206d6164652e5901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e4d01202d20606a756467656d656e74603a20746865206a756467656d656e74206f662074686520726567697374726172206f6620696e64657820607265675f696e646578602061626f75742060746172676574602e009820456d69747320604a756467656d656e74476976656e60206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e88202d204f6e652062616c616e63652d7472616e73666572206f7065726174696f6e2e98202d20557020746f206f6e65206163636f756e742d6c6f6f6b7570206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2852202b205829602e34202d204f6e65206576656e742e302023203c2f7765696768743e346b696c6c5f6964656e7469747904187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654c45012052656d6f766520616e206163636f756e742773206964656e7469747920616e64207375622d6163636f756e7420696e666f726d6174696f6e20616e6420736c61736820746865206465706f736974732e006501205061796d656e743a2052657365727665642062616c616e6365732066726f6d20607365745f737562736020616e6420607365745f6964656e74697479602061726520736c617368656420616e642068616e646c656420627949012060536c617368602e20566572696669636174696f6e2072657175657374206465706f7369747320617265206e6f742072657475726e65643b20746865792073686f756c642062652063616e63656c6c656484206d616e75616c6c79207573696e67206063616e63656c5f72657175657374602e00fc20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206d617463682060543a3a466f7263654f726967696e602e005901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e009820456d69747320604964656e746974794b696c6c656460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2852202b2053202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e74202d206053202b2032602073746f72616765206d75746174696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e1c6164645f737562080c7375628c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365106461746110446174611cb0204164642074686520676976656e206163636f756e7420746f207468652073656e646572277320737562732e006101205061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c2062652072657061747269617465643c20746f207468652073656e6465722e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573742068617665206120726567697374657265645c20737562206964656e74697479206f662060737562602e2872656e616d655f737562080c7375628c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651064617461104461746110d020416c74657220746865206173736f636961746564206e616d65206f662074686520676976656e207375622d6163636f756e742e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573742068617665206120726567697374657265645c20737562206964656e74697479206f662060737562602e2872656d6f76655f737562040c7375628c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651cc42052656d6f76652074686520676976656e206163636f756e742066726f6d207468652073656e646572277320737562732e006101205061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c2062652072657061747269617465643c20746f207468652073656e6465722e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573742068617665206120726567697374657265645c20737562206964656e74697479206f662060737562602e20717569745f7375620028902052656d6f7665207468652073656e6465722061732061207375622d6163636f756e742e006101205061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c206265207265706174726961746564b820746f207468652073656e64657220282a6e6f742a20746865206f726967696e616c206465706f7369746f72292e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206861766520612072656769737465726564402073757065722d6964656e746974792e004901204e4f54453a20546869732073686f756c64206e6f74206e6f726d616c6c7920626520757365642c206275742069732070726f766964656420696e207468652063617365207468617420746865206e6f6e2d150120636f6e74726f6c6c6572206f6620616e206163636f756e74206973206d616c6963696f75736c7920726567697374657265642061732061207375622d6163636f756e742e01282c4964656e7469747953657404244163636f756e7449640409012041206e616d652077617320736574206f72207265736574202877686963682077696c6c2072656d6f766520616c6c206a756467656d656e7473292e205b77686f5d3c4964656e74697479436c656172656408244163636f756e7449641c42616c616e6365040d012041206e616d652077617320636c65617265642c20616e642074686520676976656e2062616c616e63652072657475726e65642e205b77686f2c206465706f7369745d384964656e746974794b696c6c656408244163636f756e7449641c42616c616e63650405012041206e616d65207761732072656d6f76656420616e642074686520676976656e2062616c616e636520736c61736865642e205b77686f2c206465706f7369745d484a756467656d656e7452657175657374656408244163636f756e74496438526567697374726172496e64657804fc2041206a756467656d656e74207761732061736b65642066726f6d2061207265676973747261722e205b77686f2c207265676973747261725f696e6465785d504a756467656d656e74556e72657175657374656408244163636f756e74496438526567697374726172496e64657804e82041206a756467656d656e74207265717565737420776173207265747261637465642e205b77686f2c207265676973747261725f696e6465785d384a756467656d656e74476976656e08244163636f756e74496438526567697374726172496e6465780401012041206a756467656d656e742077617320676976656e2062792061207265676973747261722e205b7461726765742c207265676973747261725f696e6465785d3852656769737472617241646465640438526567697374726172496e64657804a4204120726567697374726172207761732061646465642e205b7265676973747261725f696e6465785d405375624964656e7469747941646465640c244163636f756e744964244163636f756e7449641c42616c616e6365044d012041207375622d6964656e746974792077617320616464656420746f20616e206964656e7469747920616e6420746865206465706f73697420706169642e205b7375622c206d61696e2c206465706f7369745d485375624964656e7469747952656d6f7665640c244163636f756e744964244163636f756e7449641c42616c616e6365080d012041207375622d6964656e74697479207761732072656d6f7665642066726f6d20616e206964656e7469747920616e6420746865206465706f7369742066726565642e54205b7375622c206d61696e2c206465706f7369745d485375624964656e746974795265766f6b65640c244163636f756e744964244163636f756e7449641c42616c616e6365081d012041207375622d6964656e746974792077617320636c65617265642c20616e642074686520676976656e206465706f7369742072657061747269617465642066726f6d207468652101206d61696e206964656e74697479206163636f756e7420746f20746865207375622d6964656e74697479206163636f756e742e205b7375622c206d61696e2c206465706f7369745d183042617369634465706f7369743042616c616e63654f663c543e40a41a130d84010000000000000000000004d82054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564206964656e746974792e304669656c644465706f7369743042616c616e63654f663c543e4004c64403610000000000000000000000042d012054686520616d6f756e742068656c64206f6e206465706f73697420706572206164646974696f6e616c206669656c6420666f7220612072656769737465726564206964656e746974792e445375624163636f756e744465706f7369743042616c616e63654f663c543e405405379c4d00000000000000000000000c65012054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564207375626163636f756e742e20546869732073686f756c64206163636f756e7420666f7220746865206661637471012074686174206f6e652073746f72616765206974656d27732076616c75652077696c6c20696e637265617365206279207468652073697a65206f6620616e206163636f756e742049442c20616e642074686572652077696c6c206265290120616e6f746865722074726965206974656d2077686f73652076616c7565206973207468652073697a65206f6620616e206163636f756e7420494420706c75732033322062797465732e384d61785375624163636f756e74730c7533321064000000040d0120546865206d6178696d756d206e756d626572206f66207375622d6163636f756e747320616c6c6f77656420706572206964656e746966696564206163636f756e742e4c4d61784164646974696f6e616c4669656c64730c7533321064000000086501204d6178696d756d206e756d626572206f66206164646974696f6e616c206669656c64732074686174206d61792062652073746f72656420696e20616e2049442e204e656564656420746f20626f756e642074686520492f4fe020726571756972656420746f2061636365737320616e206964656e746974792c206275742063616e2062652070726574747920686967682e344d6178526567697374726172730c7533321014000000085101204d61786d696d756d206e756d626572206f66207265676973747261727320616c6c6f77656420696e207468652073797374656d2e204e656564656420746f20626f756e642074686520636f6d706c65786974797c206f662c20652e672e2c207570646174696e67206a756467656d656e74732e4048546f6f4d616e795375624163636f756e7473046020546f6f206d616e7920737562732d6163636f756e74732e204e6f74466f756e640454204163636f756e742069736e277420666f756e642e204e6f744e616d65640454204163636f756e742069736e2774206e616d65642e28456d707479496e646578043420456d70747920696e6465782e284665654368616e676564044020466565206973206368616e6765642e284e6f4964656e74697479044c204e6f206964656e7469747920666f756e642e3c537469636b794a756467656d656e74044820537469636b79206a756467656d656e742e384a756467656d656e74476976656e0444204a756467656d656e7420676976656e2e40496e76616c69644a756467656d656e74044c20496e76616c6964206a756467656d656e742e30496e76616c6964496e64657804582054686520696e64657820697320696e76616c69642e34496e76616c6964546172676574045c205468652074617267657420697320696e76616c69642e34546f6f4d616e794669656c6473047020546f6f206d616e79206164646974696f6e616c206669656c64732e44546f6f4d616e795265676973747261727304ec204d6178696d756d20616d6f756e74206f66207265676973747261727320726561636865642e2043616e6e6f742061646420616e79206d6f72652e38416c7265616479436c61696d65640474204163636f756e7420494420697320616c7265616479206e616d65642e184e6f7453756204742053656e646572206973206e6f742061207375622d6163636f756e742e204e6f744f776e6564048c205375622d6163636f756e742069736e2774206f776e65642062792073656e6465722e1c536f6369657479011c536f6369657479401c466f756e646572000030543a3a4163636f756e7449640400044820546865206669727374206d656d6265722e1452756c657300001c543a3a48617368040008510120412068617368206f66207468652072756c6573206f66207468697320736f636965747920636f6e6365726e696e67206d656d626572736869702e2043616e206f6e6c7920626520736574206f6e636520616e6454206f6e6c792062792074686520666f756e6465722e2843616e6469646174657301009c5665633c4269643c543a3a4163636f756e7449642c2042616c616e63654f663c542c20493e3e3e0400043901205468652063757272656e7420736574206f662063616e646964617465733b206269646465727320746861742061726520617474656d7074696e6720746f206265636f6d65206d656d626572732e4c53757370656e64656443616e6469646174657300010530543a3a4163636f756e744964e42842616c616e63654f663c542c20493e2c204269644b696e643c543a3a4163636f756e7449642c2042616c616e63654f663c542c20493e3e2900040004842054686520736574206f662073757370656e6465642063616e646964617465732e0c506f7401003c42616c616e63654f663c542c20493e400000000000000000000000000000000004410120416d6f756e74206f66206f7572206163636f756e742062616c616e63652074686174206973207370656369666963616c6c7920666f7220746865206e65787420726f756e642773206269642873292e1048656164000030543a3a4163636f756e744964040004e820546865206d6f7374207072696d6172792066726f6d20746865206d6f737420726563656e746c7920617070726f766564206d656d626572732e1c4d656d626572730100445665633c543a3a4163636f756e7449643e04000494205468652063757272656e7420736574206f66206d656d626572732c206f7264657265642e4053757370656e6465644d656d6265727301010530543a3a4163636f756e74496410626f6f6c00040004782054686520736574206f662073757370656e646564206d656d626572732e104269647301009c5665633c4269643c543a3a4163636f756e7449642c2042616c616e63654f663c542c20493e3e3e040004e8205468652063757272656e7420626964732c2073746f726564206f726465726564206279207468652076616c7565206f6620746865206269642e20566f756368696e6700010530543a3a4163636f756e74496438566f756368696e6753746174757300040004e4204d656d626572732063757272656e746c7920766f756368696e67206f722062616e6e65642066726f6d20766f756368696e6720616761696e1c5061796f75747301010530543a3a4163636f756e744964985665633c28543a3a426c6f636b4e756d6265722c2042616c616e63654f663c542c20493e293e000400044d012050656e64696e67207061796f7574733b206f72646572656420627920626c6f636b206e756d6265722c20776974682074686520616d6f756e7420746861742073686f756c642062652070616964206f75742e1c537472696b657301010530543a3a4163636f756e7449642c537472696b65436f756e7400100000000004dc20546865206f6e676f696e67206e756d626572206f66206c6f73696e6720766f746573206361737420627920746865206d656d6265722e14566f74657300020530543a3a4163636f756e74496430543a3a4163636f756e74496410566f746505040004d020446f75626c65206d61702066726f6d2043616e646964617465202d3e20566f746572202d3e20284d617962652920566f74652e20446566656e646572000030543a3a4163636f756e744964040004c42054686520646566656e64696e67206d656d6265722063757272656e746c79206265696e67206368616c6c656e6765642e34446566656e646572566f74657300010530543a3a4163636f756e74496410566f7465000400046020566f74657320666f722074686520646566656e6465722e284d61784d656d6265727301000c753332100000000004dc20546865206d6178206e756d626572206f66206d656d6265727320666f722074686520736f6369657479206174206f6e652074696d652e01300c626964041476616c75653c42616c616e63654f663c542c20493e84e020412075736572206f757473696465206f662074686520736f63696574792063616e206d616b6520612062696420666f7220656e7472792e003901205061796d656e743a206043616e6469646174654465706f736974602077696c6c20626520726573657276656420666f72206d616b696e672061206269642e2049742069732072657475726e6564f0207768656e2074686520626964206265636f6d65732061206d656d6265722c206f7220696620746865206269642063616c6c732060756e626964602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a5901202d206076616c7565603a2041206f6e652074696d65207061796d656e74207468652062696420776f756c64206c696b6520746f2072656365697665207768656e206a6f696e696e672074686520736f63696574792e002c2023203c7765696768743e5501204b65793a204220286c656e206f662062696473292c204320286c656e206f662063616e64696461746573292c204d20286c656e206f66206d656d62657273292c2058202862616c616e636520726573657276652944202d2053746f726167652052656164733aec20092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e6465642063616e6469646174652e204f283129e020092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e646564206d656d6265722e204f283129dc20092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e7420626964732e204f284229f420092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e742063616e646964617465732e204f284329c820092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c206d656d626572732e204f284d2948202d2053746f72616765205772697465733a810120092d204f6e652073746f72616765206d757461746520746f206164642061206e65772062696420746f2074686520766563746f72204f2842292028544f444f3a20706f737369626c65206f7074696d697a6174696f6e20772f207265616429010120092d20557020746f206f6e652073746f726167652072656d6f76616c206966206269642e6c656e2829203e204d41585f4249445f434f554e542e204f2831295c202d204e6f7461626c6520436f6d7075746174696f6e3a2d0120092d204f2842202b2043202b206c6f67204d292073656172636820746f20636865636b2075736572206973206e6f7420616c726561647920612070617274206f6620736f63696574792ec420092d204f286c6f672042292073656172636820746f20696e7365727420746865206e65772062696420736f727465642e78202d2045787465726e616c204d6f64756c65204f7065726174696f6e733a9c20092d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e204f285829210120092d20557020746f206f6e652062616c616e636520756e72657365727665206f7065726174696f6e20696620626964732e6c656e2829203e204d41585f4249445f434f554e542e28202d204576656e74733a6820092d204f6e65206576656e7420666f72206e6577206269642efc20092d20557020746f206f6e65206576656e7420666f72204175746f556e626964206966206269642e6c656e2829203e204d41585f4249445f434f554e542e00c420546f74616c20436f6d706c65786974793a204f284d202b2042202b2043202b206c6f674d202b206c6f6742202b205829302023203c2f7765696768743e14756e626964040c706f730c7533324cd82041206269646465722063616e2072656d6f76652074686569722062696420666f7220656e74727920696e746f20736f63696574792e010120427920646f696e6720736f2c20746865792077696c6c20686176652074686569722063616e646964617465206465706f7369742072657475726e6564206f728420746865792077696c6c20756e766f75636820746865697220766f75636865722e00fc205061796d656e743a2054686520626964206465706f73697420697320756e7265736572766564206966207468652075736572206d6164652061206269642e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206269646465722e003020506172616d65746572733a1901202d2060706f73603a20506f736974696f6e20696e207468652060426964736020766563746f72206f6620746865206269642077686f2077616e747320746f20756e6269642e002c2023203c7765696768743eb0204b65793a204220286c656e206f662062696473292c2058202862616c616e636520756e72657365727665290d01202d204f6e652073746f72616765207265616420616e6420777269746520746f20726574726965766520616e64207570646174652074686520626964732e204f2842294501202d20456974686572206f6e6520756e726573657276652062616c616e636520616374696f6e204f285829206f72206f6e6520766f756368696e672073746f726167652072656d6f76616c2e204f28312934202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2842202b205829302023203c2f7765696768743e14766f7563680c0c77686f30543a3a4163636f756e7449641476616c75653c42616c616e63654f663c542c20493e0c7469703c42616c616e63654f663c542c20493eb045012041732061206d656d6265722c20766f75636820666f7220736f6d656f6e6520746f206a6f696e20736f636965747920627920706c6163696e67206120626964206f6e20746865697220626568616c662e005501205468657265206973206e6f206465706f73697420726571756972656420746f20766f75636820666f722061206e6577206269642c206275742061206d656d6265722063616e206f6e6c7920766f75636820666f725d01206f6e652062696420617420612074696d652e2049662074686520626964206265636f6d657320612073757370656e6465642063616e64696461746520616e6420756c74696d6174656c792072656a65637465642062794101207468652073757370656e73696f6e206a756467656d656e74206f726967696e2c20746865206d656d6265722077696c6c2062652062616e6e65642066726f6d20766f756368696e6720616761696e2e005901204173206120766f756368696e67206d656d6265722c20796f752063616e20636c61696d206120746970206966207468652063616e6469646174652069732061636365707465642e2054686973207469702077696c6c51012062652070616964206173206120706f7274696f6e206f66207468652072657761726420746865206d656d6265722077696c6c207265636569766520666f72206a6f696e696e672074686520736f63696574792e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d6265722e003020506172616d65746572733acc202d206077686f603a2054686520757365722077686f20796f7520776f756c64206c696b6520746f20766f75636820666f722e5101202d206076616c7565603a2054686520746f74616c2072657761726420746f2062652070616964206265747765656e20796f7520616e64207468652063616e6469646174652069662074686579206265636f6d65642061206d656d62657220696e2074686520736f63696574792e4901202d2060746970603a20596f757220637574206f662074686520746f74616c206076616c756560207061796f7574207768656e207468652063616e64696461746520697320696e64756374656420696e746f15012074686520736f63696574792e2054697073206c6172676572207468616e206076616c7565602077696c6c206265207361747572617465642075706f6e207061796f75742e002c2023203c7765696768743e0101204b65793a204220286c656e206f662062696473292c204320286c656e206f662063616e64696461746573292c204d20286c656e206f66206d656d626572732944202d2053746f726167652052656164733ac820092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c206d656d626572732e204f284d29090120092d204f6e652073746f72616765207265616420746f20636865636b206d656d626572206973206e6f7420616c726561647920766f756368696e672e204f283129ec20092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e6465642063616e6469646174652e204f283129e020092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e646564206d656d6265722e204f283129dc20092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e7420626964732e204f284229f420092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e742063616e646964617465732e204f28432948202d2053746f72616765205772697465733a0d0120092d204f6e652073746f7261676520777269746520746f20696e7365727420766f756368696e672073746174757320746f20746865206d656d6265722e204f283129810120092d204f6e652073746f72616765206d757461746520746f206164642061206e65772062696420746f2074686520766563746f72204f2842292028544f444f3a20706f737369626c65206f7074696d697a6174696f6e20772f207265616429010120092d20557020746f206f6e652073746f726167652072656d6f76616c206966206269642e6c656e2829203e204d41585f4249445f434f554e542e204f2831295c202d204e6f7461626c6520436f6d7075746174696f6e3ac020092d204f286c6f67204d292073656172636820746f20636865636b2073656e6465722069732061206d656d6265722e2d0120092d204f2842202b2043202b206c6f67204d292073656172636820746f20636865636b2075736572206973206e6f7420616c726561647920612070617274206f6620736f63696574792ec420092d204f286c6f672042292073656172636820746f20696e7365727420746865206e65772062696420736f727465642e78202d2045787465726e616c204d6f64756c65204f7065726174696f6e733a9c20092d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e204f285829210120092d20557020746f206f6e652062616c616e636520756e72657365727665206f7065726174696f6e20696620626964732e6c656e2829203e204d41585f4249445f434f554e542e28202d204576656e74733a6020092d204f6e65206576656e7420666f7220766f7563682efc20092d20557020746f206f6e65206576656e7420666f72204175746f556e626964206966206269642e6c656e2829203e204d41585f4249445f434f554e542e00c420546f74616c20436f6d706c65786974793a204f284d202b2042202b2043202b206c6f674d202b206c6f6742202b205829302023203c2f7765696768743e1c756e766f756368040c706f730c753332442d01204173206120766f756368696e67206d656d6265722c20756e766f7563682061206269642e2054686973206f6e6c7920776f726b73207768696c6520766f7563686564207573657220697394206f6e6c792061206269646465722028616e64206e6f7420612063616e646964617465292e00290120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206120766f756368696e67206d656d6265722e003020506172616d65746572733a2d01202d2060706f73603a20506f736974696f6e20696e207468652060426964736020766563746f72206f6620746865206269642077686f2073686f756c6420626520756e766f75636865642e002c2023203c7765696768743e54204b65793a204220286c656e206f662062696473290901202d204f6e652073746f726167652072656164204f28312920746f20636865636b20746865207369676e6572206973206120766f756368696e67206d656d6265722eec202d204f6e652073746f72616765206d757461746520746f20726574726965766520616e64207570646174652074686520626964732e204f28422994202d204f6e6520766f756368696e672073746f726167652072656d6f76616c2e204f28312934202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f284229302023203c2f7765696768743e10766f7465082463616e6469646174658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651c617070726f766510626f6f6c4c882041732061206d656d6265722c20766f7465206f6e20612063616e6469646174652e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d6265722e003020506172616d65746572733a0d01202d206063616e646964617465603a205468652063616e646964617465207468617420746865206d656d62657220776f756c64206c696b6520746f20626964206f6e2ef4202d2060617070726f7665603a204120626f6f6c65616e2077686963682073617973206966207468652063616e6469646174652073686f756c64206265d82020202020202020202020202020617070726f766564202860747275656029206f722072656a656374656420286066616c736560292e002c2023203c7765696768743ebc204b65793a204320286c656e206f662063616e64696461746573292c204d20286c656e206f66206d656d62657273291d01202d204f6e652073746f726167652072656164204f284d2920616e64204f286c6f67204d292073656172636820746f20636865636b20757365722069732061206d656d6265722e58202d204f6e65206163636f756e74206c6f6f6b75702e2d01202d204f6e652073746f726167652072656164204f28432920616e64204f2843292073656172636820746f20636865636b2074686174207573657220697320612063616e6469646174652ebc202d204f6e652073746f7261676520777269746520746f2061646420766f746520746f20766f7465732e204f28312934202d204f6e65206576656e742e008820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b204329302023203c2f7765696768743e34646566656e6465725f766f7465041c617070726f766510626f6f6c408c2041732061206d656d6265722c20766f7465206f6e2074686520646566656e6465722e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d6265722e003020506172616d65746572733af4202d2060617070726f7665603a204120626f6f6c65616e2077686963682073617973206966207468652063616e6469646174652073686f756c64206265a420617070726f766564202860747275656029206f722072656a656374656420286066616c736560292e002c2023203c7765696768743e68202d204b65793a204d20286c656e206f66206d656d62657273291d01202d204f6e652073746f726167652072656164204f284d2920616e64204f286c6f67204d292073656172636820746f20636865636b20757365722069732061206d656d6265722ebc202d204f6e652073746f7261676520777269746520746f2061646420766f746520746f20766f7465732e204f28312934202d204f6e65206576656e742e007820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d29302023203c2f7765696768743e187061796f757400504501205472616e7366657220746865206669727374206d617475726564207061796f757420666f72207468652073656e64657220616e642072656d6f76652069742066726f6d20746865207265636f7264732e006901204e4f54453a20546869732065787472696e736963206e6565647320746f2062652063616c6c6564206d756c7469706c652074696d657320746f20636c61696d206d756c7469706c65206d617475726564207061796f7574732e002101205061796d656e743a20546865206d656d6265722077696c6c20726563656976652061207061796d656e7420657175616c20746f207468656972206669727374206d61747572656478207061796f757420746f20746865697220667265652062616c616e63652e00150120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d62657220776974684c207061796f7574732072656d61696e696e672e002c2023203c7765696768743e1d01204b65793a204d20286c656e206f66206d656d62657273292c205020286e756d626572206f66207061796f75747320666f72206120706172746963756c6172206d656d626572292501202d204f6e652073746f726167652072656164204f284d2920616e64204f286c6f67204d292073656172636820746f20636865636b207369676e65722069732061206d656d6265722ee4202d204f6e652073746f726167652072656164204f28502920746f2067657420616c6c207061796f75747320666f722061206d656d6265722ee4202d204f6e652073746f726167652072656164204f28312920746f20676574207468652063757272656e7420626c6f636b206e756d6265722e8c202d204f6e652063757272656e6379207472616e736665722063616c6c2e204f2858291101202d204f6e652073746f72616765207772697465206f722072656d6f76616c20746f2075706461746520746865206d656d6265722773207061796f7574732e204f285029009820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b2050202b205829302023203c2f7765696768743e14666f756e640c1c666f756e64657230543a3a4163636f756e7449642c6d61785f6d656d626572730c7533321472756c65731c5665633c75383e4c4c20466f756e642074686520736f63696574792e00f0205468697320697320646f6e65206173206120646973637265746520616374696f6e20696e206f7264657220746f20616c6c6f7720666f72207468651901206d6f64756c6520746f20626520696e636c7564656420696e746f20612072756e6e696e6720636861696e20616e642063616e206f6e6c7920626520646f6e65206f6e63652e001d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d20746865205f466f756e6465725365744f726967696e5f2e003020506172616d65746572733a1901202d2060666f756e64657260202d20546865206669727374206d656d62657220616e642068656164206f6620746865206e65776c7920666f756e64656420736f63696574792e1501202d20606d61785f6d656d6265727360202d2054686520696e697469616c206d6178206e756d626572206f66206d656d6265727320666f722074686520736f63696574792ef4202d206072756c657360202d205468652072756c6573206f66207468697320736f636965747920636f6e6365726e696e67206d656d626572736869702e002c2023203c7765696768743ee0202d2054776f2073746f72616765206d75746174657320746f207365742060486561646020616e642060466f756e646572602e204f283129f4202d204f6e652073746f7261676520777269746520746f2061646420746865206669727374206d656d62657220746f20736f63696574792e204f28312934202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f283129302023203c2f7765696768743e1c756e666f756e6400348c20416e6e756c2074686520666f756e64696e67206f662074686520736f63696574792e005d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205369676e65642c20616e6420746865207369676e696e67206163636f756e74206d75737420626520626f74685901207468652060466f756e6465726020616e6420746865206048656164602e205468697320696d706c6965732074686174206974206d6179206f6e6c7920626520646f6e65207768656e207468657265206973206f6e6520206d656d6265722e002c2023203c7765696768743e68202d2054776f2073746f72616765207265616473204f2831292e78202d20466f75722073746f726167652072656d6f76616c73204f2831292e34202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f283129302023203c2f7765696768743e586a756467655f73757370656e6465645f6d656d626572080c77686f30543a3a4163636f756e7449641c666f726769766510626f6f6c6c2d0120416c6c6f772073757370656e73696f6e206a756467656d656e74206f726967696e20746f206d616b65206a756467656d656e74206f6e20612073757370656e646564206d656d6265722e00590120496620612073757370656e646564206d656d62657220697320666f72676976656e2c2077652073696d706c7920616464207468656d206261636b2061732061206d656d6265722c206e6f7420616666656374696e67cc20616e79206f6620746865206578697374696e672073746f72616765206974656d7320666f722074686174206d656d6265722e00490120496620612073757370656e646564206d656d6265722069732072656a65637465642c2072656d6f766520616c6c206173736f6369617465642073746f72616765206974656d732c20696e636c7564696e670101207468656972207061796f7574732c20616e642072656d6f766520616e7920766f7563686564206269647320746865792063757272656e746c7920686176652e00410120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d20746865205f53757370656e73696f6e4a756467656d656e744f726967696e5f2e003020506172616d65746572733ab4202d206077686f60202d205468652073757370656e646564206d656d62657220746f206265206a75646765642e3501202d2060666f726769766560202d204120626f6f6c65616e20726570726573656e74696e672077686574686572207468652073757370656e73696f6e206a756467656d656e74206f726967696e2501202020202020202020202020202020666f726769766573202860747275656029206f722072656a6563747320286066616c7365602920612073757370656e646564206d656d6265722e002c2023203c7765696768743ea4204b65793a204220286c656e206f662062696473292c204d20286c656e206f66206d656d6265727329f8202d204f6e652073746f72616765207265616420746f20636865636b206077686f6020697320612073757370656e646564206d656d6265722e204f2831297101202d20557020746f206f6e652073746f72616765207772697465204f284d292077697468204f286c6f67204d292062696e6172792073656172636820746f206164642061206d656d626572206261636b20746f20736f63696574792ef8202d20557020746f20332073746f726167652072656d6f76616c73204f28312920746f20636c65616e20757020612072656d6f766564206d656d6265722e4501202d20557020746f206f6e652073746f72616765207772697465204f2842292077697468204f2842292073656172636820746f2072656d6f766520766f7563686564206269642066726f6d20626964732ed4202d20557020746f206f6e65206164646974696f6e616c206576656e7420696620756e766f7563682074616b657320706c6163652e70202d204f6e652073746f726167652072656d6f76616c2e204f2831297c202d204f6e65206576656e7420666f7220746865206a756467656d656e742e008820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b204229302023203c2f7765696768743e646a756467655f73757370656e6465645f63616e646964617465080c77686f30543a3a4163636f756e744964246a756467656d656e74244a756467656d656e74a0350120416c6c6f772073757370656e646564206a756467656d656e74206f726967696e20746f206d616b65206a756467656d656e74206f6e20612073757370656e6465642063616e6469646174652e005d0120496620746865206a756467656d656e742069732060417070726f7665602c20776520616464207468656d20746f20736f63696574792061732061206d656d62657220776974682074686520617070726f70726961746574207061796d656e7420666f72206a6f696e696e6720736f63696574792e00550120496620746865206a756467656d656e74206973206052656a656374602c2077652065697468657220736c61736820746865206465706f736974206f6620746865206269642c20676976696e67206974206261636b110120746f2074686520736f63696574792074726561737572792c206f722077652062616e2074686520766f75636865722066726f6d20766f756368696e6720616761696e2e005d0120496620746865206a756467656d656e7420697320605265626964602c20776520707574207468652063616e646964617465206261636b20696e207468652062696420706f6f6c20616e64206c6574207468656d20676f94207468726f7567682074686520696e64756374696f6e2070726f6365737320616761696e2e00410120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d20746865205f53757370656e73696f6e4a756467656d656e744f726967696e5f2e003020506172616d65746572733ac0202d206077686f60202d205468652073757370656e6465642063616e64696461746520746f206265206a75646765642ec4202d20606a756467656d656e7460202d2060417070726f7665602c206052656a656374602c206f7220605265626964602e002c2023203c7765696768743ef4204b65793a204220286c656e206f662062696473292c204d20286c656e206f66206d656d62657273292c2058202862616c616e636520616374696f6e29f0202d204f6e652073746f72616765207265616420746f20636865636b206077686f6020697320612073757370656e6465642063616e6469646174652ec8202d204f6e652073746f726167652072656d6f76616c206f66207468652073757370656e6465642063616e6469646174652e40202d20417070726f7665204c6f676963150120092d204f6e652073746f72616765207265616420746f206765742074686520617661696c61626c6520706f7420746f2070617920757365727320776974682e204f283129dc20092d204f6e652073746f7261676520777269746520746f207570646174652074686520617661696c61626c6520706f742e204f283129e820092d204f6e652073746f72616765207265616420746f20676574207468652063757272656e7420626c6f636b206e756d6265722e204f283129b420092d204f6e652073746f72616765207265616420746f2067657420616c6c206d656d626572732e204f284d29a020092d20557020746f206f6e6520756e726573657276652063757272656e637920616374696f6e2eb020092d20557020746f2074776f206e65772073746f726167652077726974657320746f207061796f7574732e4d0120092d20557020746f206f6e652073746f726167652077726974652077697468204f286c6f67204d292062696e6172792073656172636820746f206164642061206d656d62657220746f20736f63696574792e3c202d2052656a656374204c6f676963dc20092d20557020746f206f6e6520726570617472696174652072657365727665642063757272656e637920616374696f6e2e204f2858292d0120092d20557020746f206f6e652073746f7261676520777269746520746f2062616e2074686520766f756368696e67206d656d6265722066726f6d20766f756368696e6720616761696e2e38202d205265626964204c6f676963410120092d2053746f72616765206d75746174652077697468204f286c6f672042292062696e6172792073656172636820746f20706c616365207468652075736572206261636b20696e746f20626964732ed4202d20557020746f206f6e65206164646974696f6e616c206576656e7420696620756e766f7563682074616b657320706c6163652e5c202d204f6e652073746f726167652072656d6f76616c2e7c202d204f6e65206576656e7420666f7220746865206a756467656d656e742e009820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b2042202b205829302023203c2f7765696768743e3c7365745f6d61785f6d656d62657273040c6d61780c753332381d0120416c6c6f777320726f6f74206f726967696e20746f206368616e676520746865206d6178696d756d206e756d626572206f66206d656d6265727320696e20736f63696574792eb4204d6178206d656d6265727368697020636f756e74206d7573742062652067726561746572207468616e20312e00dc20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d205f524f4f545f2e003020506172616d65746572733ae4202d20606d617860202d20546865206d6178696d756d206e756d626572206f66206d656d6265727320666f722074686520736f63696574792e002c2023203c7765696768743eb0202d204f6e652073746f7261676520777269746520746f2075706461746520746865206d61782e204f28312934202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f283129302023203c2f7765696768743e01401c466f756e64656404244163636f756e74496404e02054686520736f636965747920697320666f756e6465642062792074686520676976656e206964656e746974792e205b666f756e6465725d0c42696408244163636f756e7449641c42616c616e63650861012041206d656d6265727368697020626964206a7573742068617070656e65642e2054686520676976656e206163636f756e74206973207468652063616e646964617465277320494420616e64207468656972206f666665729420697320746865207365636f6e642e205b63616e6469646174655f69642c206f666665725d14566f7563680c244163636f756e7449641c42616c616e6365244163636f756e7449640861012041206d656d6265727368697020626964206a7573742068617070656e656420627920766f756368696e672e2054686520676976656e206163636f756e74206973207468652063616e646964617465277320494420616e647101207468656972206f6666657220697320746865207365636f6e642e2054686520766f756368696e67207061727479206973207468652074686972642e205b63616e6469646174655f69642c206f666665722c20766f756368696e675d244175746f556e62696404244163636f756e7449640411012041205b63616e6469646174655d207761732064726f70706564202864756520746f20616e20657863657373206f66206269647320696e207468652073797374656d292e14556e62696404244163636f756e74496404b82041205b63616e6469646174655d207761732064726f70706564202862792074686569722072657175657374292e1c556e766f75636804244163636f756e7449640401012041205b63616e6469646174655d207761732064726f70706564202862792072657175657374206f662077686f20766f756368656420666f72207468656d292e20496e64756374656408244163636f756e744964385665633c4163636f756e7449643e08590120412067726f7570206f662063616e646964617465732068617665206265656e20696e6475637465642e205468652062617463682773207072696d617279206973207468652066697273742076616c75652c20746865cc20626174636820696e2066756c6c20697320746865207365636f6e642e205b7072696d6172792c2063616e646964617465735d6053757370656e6465644d656d6265724a756467656d656e7408244163636f756e74496410626f6f6c04c820412073757370656e646564206d656d62657220686173206265656e206a75646765642e205b77686f2c206a75646765645d4843616e64696461746553757370656e64656404244163636f756e74496404842041205b63616e6469646174655d20686173206265656e2073757370656e6465643c4d656d62657253757370656e64656404244163636f756e74496404782041205b6d656d6265725d20686173206265656e2073757370656e646564284368616c6c656e67656404244163636f756e744964047c2041205b6d656d6265725d20686173206265656e206368616c6c656e67656410566f74650c244163636f756e744964244163636f756e74496410626f6f6c04c0204120766f746520686173206265656e20706c61636564205b63616e6469646174652c20766f7465722c20766f74655d30446566656e646572566f746508244163636f756e74496410626f6f6c04f0204120766f746520686173206265656e20706c6163656420666f72206120646566656e64696e67206d656d626572205b766f7465722c20766f74655d344e65774d61784d656d62657273040c75333204982041206e6577205b6d61785d206d656d62657220636f756e7420686173206265656e2073657424556e666f756e64656404244163636f756e744964048020536f636965747920697320756e666f756e6465642e205b666f756e6465725d1c4465706f736974041c42616c616e636504f020536f6d652066756e64732077657265206465706f736974656420696e746f2074686520736f6369657479206163636f756e742e205b76616c75655d1c4043616e6469646174654465706f7369743c42616c616e63654f663c542c20493e40a41a130d84010000000000000000000004fc20546865206d696e696d756d20616d6f756e74206f662061206465706f73697420726571756972656420666f7220612062696420746f206265206d6164652e4857726f6e6753696465446564756374696f6e3c42616c616e63654f663c542c20493e405405379c4d00000000000000000000000855012054686520616d6f756e74206f662074686520756e70616964207265776172642074686174206765747320646564756374656420696e207468652063617365207468617420656974686572206120736b6570746963c020646f65736e277420766f7465206f7220736f6d656f6e6520766f74657320696e207468652077726f6e67207761792e284d6178537472696b65730c753332100a00000008750120546865206e756d626572206f662074696d65732061206d656d626572206d617920766f7465207468652077726f6e672077617920286f72206e6f7420617420616c6c2c207768656e207468657920617265206120736b65707469632978206265666f72652074686579206265636f6d652073757370656e6465642e2c506572696f645370656e643c42616c616e63654f663c542c20493e400834bb8dca4b00000000000000000000042d012054686520616d6f756e74206f6620696e63656e7469766520706169642077697468696e206561636820706572696f642e20446f65736e277420696e636c75646520566f7465725469702e38526f746174696f6e506572696f6438543a3a426c6f636b4e756d6265721080bb000004110120546865206e756d626572206f6620626c6f636b73206265747765656e2063616e6469646174652f6d656d6265727368697020726f746174696f6e20706572696f64732e3c4368616c6c656e6765506572696f6438543a3a426c6f636b4e756d62657210c089010004d020546865206e756d626572206f6620626c6f636b73206265747765656e206d656d62657273686970206368616c6c656e6765732e204d6f64756c654964204d6f64756c6549642070792f736f63696504682054686520736f636965746965732773206d6f64756c65206964482c426164506f736974696f6e049020416e20696e636f727265637420706f736974696f6e207761732070726f76696465642e244e6f744d656d62657204582055736572206973206e6f742061206d656d6265722e34416c72656164794d656d6265720468205573657220697320616c72656164792061206d656d6265722e2453757370656e646564044c20557365722069732073757370656e6465642e304e6f7453757370656e646564045c2055736572206973206e6f742073757370656e6465642e204e6f5061796f7574044c204e6f7468696e6720746f207061796f75742e38416c7265616479466f756e646564046420536f636965747920616c726561647920666f756e6465642e3c496e73756666696369656e74506f74049c204e6f7420656e6f75676820696e20706f7420746f206163636570742063616e6469646174652e3c416c7265616479566f756368696e6704e8204d656d62657220697320616c726561647920766f756368696e67206f722062616e6e65642066726f6d20766f756368696e6720616761696e2e2c4e6f74566f756368696e670460204d656d626572206973206e6f7420766f756368696e672e104865616404942043616e6e6f742072656d6f7665207468652068656164206f662074686520636861696e2e1c466f756e646572046c2043616e6e6f742072656d6f76652074686520666f756e6465722e28416c7265616479426964047420557365722068617320616c7265616479206d6164652061206269642e40416c726561647943616e6469646174650474205573657220697320616c726561647920612063616e6469646174652e304e6f7443616e64696461746504642055736572206973206e6f7420612063616e6469646174652e284d61784d656d62657273048420546f6f206d616e79206d656d6265727320696e2074686520736f63696574792e284e6f74466f756e646572047c205468652063616c6c6572206973206e6f742074686520666f756e6465722e1c4e6f74486561640470205468652063616c6c6572206973206e6f742074686520686561642e205265636f7665727901205265636f766572790c2c5265636f76657261626c6500010530543a3a4163636f756e744964e85265636f76657279436f6e6669673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e0004000409012054686520736574206f66207265636f76657261626c65206163636f756e747320616e64207468656972207265636f7665727920636f6e66696775726174696f6e2e404163746976655265636f76657269657300020530543a3a4163636f756e74496430543a3a4163636f756e744964e84163746976655265636f766572793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e050400106820416374697665207265636f7665727920617474656d7074732e001501204669727374206163636f756e7420697320746865206163636f756e7420746f206265207265636f76657265642c20616e6420746865207365636f6e64206163636f756e74ac20697320746865207573657220747279696e6720746f207265636f76657220746865206163636f756e742e1450726f787900010230543a3a4163636f756e74496430543a3a4163636f756e7449640004000c9020546865206c697374206f6620616c6c6f7765642070726f7879206163636f756e74732e00f8204d61702066726f6d2074686520757365722077686f2063616e2061636365737320697420746f20746865207265636f7665726564206163636f756e742e01243061735f7265636f7665726564081c6163636f756e7430543a3a4163636f756e7449641063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e34a42053656e6420612063616c6c207468726f7567682061207265636f7665726564206163636f756e742e00150120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207265676973746572656420746fe82062652061626c6520746f206d616b652063616c6c73206f6e20626568616c66206f6620746865207265636f7665726564206163636f756e742e003020506172616d65746572733a2501202d20606163636f756e74603a20546865207265636f7665726564206163636f756e7420796f752077616e7420746f206d616b6520612063616c6c206f6e2d626568616c662d6f662e0101202d206063616c6c603a205468652063616c6c20796f752077616e7420746f206d616b65207769746820746865207265636f7665726564206163636f756e742e002c2023203c7765696768743e94202d2054686520776569676874206f6620746865206063616c6c60202b2031302c3030302e0901202d204f6e652073746f72616765206c6f6f6b757020746f20636865636b206163636f756e74206973207265636f7665726564206279206077686f602e204f283129302023203c2f7765696768743e347365745f7265636f766572656408106c6f737430543a3a4163636f756e7449641c7265736375657230543a3a4163636f756e744964341d0120416c6c6f7720524f4f5420746f2062797061737320746865207265636f766572792070726f6365737320616e642073657420616e20612072657363756572206163636f756e747420666f722061206c6f7374206163636f756e74206469726563746c792e00c820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f524f4f545f2e003020506172616d65746572733ab8202d20606c6f7374603a2054686520226c6f7374206163636f756e742220746f206265207265636f76657265642e1d01202d206072657363756572603a20546865202272657363756572206163636f756e74222077686963682063616e2063616c6c20617320746865206c6f7374206163636f756e742e002c2023203c7765696768743e64202d204f6e652073746f72616765207772697465204f28312930202d204f6e65206576656e74302023203c2f7765696768743e3c6372656174655f7265636f766572790c1c667269656e6473445665633c543a3a4163636f756e7449643e247468726573686f6c640c7531363064656c61795f706572696f6438543a3a426c6f636b4e756d6265726c5d01204372656174652061207265636f7665727920636f6e66696775726174696f6e20666f7220796f7572206163636f756e742e2054686973206d616b657320796f7572206163636f756e74207265636f76657261626c652e003101205061796d656e743a2060436f6e6669674465706f7369744261736560202b2060467269656e644465706f736974466163746f7260202a20235f6f665f667269656e64732062616c616e636549012077696c6c20626520726573657276656420666f722073746f72696e6720746865207265636f7665727920636f6e66696775726174696f6e2e2054686973206465706f7369742069732072657475726e6564bc20696e2066756c6c207768656e2074686520757365722063616c6c73206072656d6f76655f7265636f76657279602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a2501202d2060667269656e6473603a2041206c697374206f6620667269656e647320796f7520747275737420746f20766f75636820666f72207265636f7665727920617474656d7074732ed420202053686f756c64206265206f72646572656420616e6420636f6e7461696e206e6f206475706c69636174652076616c7565732e3101202d20607468726573686f6c64603a20546865206e756d626572206f6620667269656e64732074686174206d75737420766f75636820666f722061207265636f7665727920617474656d70741d012020206265666f726520746865206163636f756e742063616e206265207265636f76657265642e2053686f756c64206265206c657373207468616e206f7220657175616c20746f94202020746865206c656e677468206f6620746865206c697374206f6620667269656e64732e3d01202d206064656c61795f706572696f64603a20546865206e756d626572206f6620626c6f636b732061667465722061207265636f7665727920617474656d707420697320696e697469616c697a6564e820202074686174206e6565647320746f2070617373206265666f726520746865206163636f756e742063616e206265207265636f76657265642e002c2023203c7765696768743e68202d204b65793a204620286c656e206f6620667269656e6473292d01202d204f6e652073746f72616765207265616420746f20636865636b2074686174206163636f756e74206973206e6f7420616c7265616479207265636f76657261626c652e204f2831292eec202d204120636865636b20746861742074686520667269656e6473206c69737420697320736f7274656420616e6420756e697175652e204f2846299c202d204f6e652063757272656e63792072657365727665206f7065726174696f6e2e204f2858299c202d204f6e652073746f726167652077726974652e204f2831292e20436f646563204f2846292e34202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205829302023203c2f7765696768743e44696e6974696174655f7265636f76657279041c6163636f756e7430543a3a4163636f756e74496458ec20496e697469617465207468652070726f6365737320666f72207265636f766572696e672061207265636f76657261626c65206163636f756e742e001d01205061796d656e743a20605265636f766572794465706f736974602062616c616e63652077696c6c20626520726573657276656420666f7220696e6974696174696e67207468652501207265636f766572792070726f636573732e2054686973206465706f7369742077696c6c20616c7761797320626520726570617472696174656420746f20746865206163636f756e74b820747279696e6720746f206265207265636f76657265642e205365652060636c6f73655f7265636f76657279602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1501202d20606163636f756e74603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f207265636f7665722e2054686973206163636f756e7401012020206e6565647320746f206265207265636f76657261626c652028692e652e20686176652061207265636f7665727920636f6e66696775726174696f6e292e002c2023203c7765696768743ef8202d204f6e652073746f72616765207265616420746f20636865636b2074686174206163636f756e74206973207265636f76657261626c652e204f2846295101202d204f6e652073746f72616765207265616420746f20636865636b20746861742074686973207265636f766572792070726f63657373206861736e277420616c726561647920737461727465642e204f2831299c202d204f6e652063757272656e63792072657365727665206f7065726174696f6e2e204f285829e4202d204f6e652073746f72616765207265616420746f20676574207468652063757272656e7420626c6f636b206e756d6265722e204f2831296c202d204f6e652073746f726167652077726974652e204f2831292e34202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205829302023203c2f7765696768743e38766f7563685f7265636f7665727908106c6f737430543a3a4163636f756e7449641c7265736375657230543a3a4163636f756e74496464290120416c6c6f7720612022667269656e6422206f662061207265636f76657261626c65206163636f756e7420746f20766f75636820666f7220616e20616374697665207265636f76657279682070726f6365737320666f722074686174206163636f756e742e00290120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d75737420626520612022667269656e64227420666f7220746865207265636f76657261626c65206163636f756e742e003020506172616d65746572733ad4202d20606c6f7374603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f207265636f7665722e1101202d206072657363756572603a20546865206163636f756e7420747279696e6720746f2072657363756520746865206c6f7374206163636f756e74207468617420796f755420202077616e7420746f20766f75636820666f722e0025012054686520636f6d62696e6174696f6e206f662074686573652074776f20706172616d6574657273206d75737420706f696e7420746f20616e20616374697665207265636f76657279242070726f636573732e002c2023203c7765696768743efc204b65793a204620286c656e206f6620667269656e647320696e20636f6e666967292c205620286c656e206f6620766f756368696e6720667269656e6473291d01202d204f6e652073746f72616765207265616420746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f2846292101202d204f6e652073746f72616765207265616420746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629ec202d204f6e652062696e6172792073656172636820746f20636f6e6669726d2063616c6c6572206973206120667269656e642e204f286c6f6746291d01202d204f6e652062696e6172792073656172636820746f20636f6e6669726d2063616c6c657220686173206e6f7420616c726561647920766f75636865642e204f286c6f6756299c202d204f6e652073746f726167652077726974652e204f2831292c20436f646563204f2856292e34202d204f6e65206576656e742e00a420546f74616c20436f6d706c65786974793a204f2846202b206c6f6746202b2056202b206c6f675629302023203c2f7765696768743e38636c61696d5f7265636f76657279041c6163636f756e7430543a3a4163636f756e74496450f420416c6c6f772061207375636365737366756c207265736375657220746f20636c61696d207468656972207265636f7665726564206163636f756e742e002d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061202272657363756572221d012077686f20686173207375636365737366756c6c7920636f6d706c6574656420746865206163636f756e74207265636f766572792070726f636573733a20636f6c6c6563746564310120607468726573686f6c6460206f72206d6f726520766f75636865732c20776169746564206064656c61795f706572696f646020626c6f636b732073696e636520696e6974696174696f6e2e003020506172616d65746572733a2d01202d20606163636f756e74603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f20636c61696d20686173206265656e207375636365737366756c6c79502020207265636f766572656420627920796f752e002c2023203c7765696768743efc204b65793a204620286c656e206f6620667269656e647320696e20636f6e666967292c205620286c656e206f6620766f756368696e6720667269656e6473291d01202d204f6e652073746f72616765207265616420746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f2846292101202d204f6e652073746f72616765207265616420746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629e4202d204f6e652073746f72616765207265616420746f20676574207468652063757272656e7420626c6f636b206e756d6265722e204f2831299c202d204f6e652073746f726167652077726974652e204f2831292c20436f646563204f2856292e34202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205629302023203c2f7765696768743e38636c6f73655f7265636f76657279041c7265736375657230543a3a4163636f756e7449645015012041732074686520636f6e74726f6c6c6572206f662061207265636f76657261626c65206163636f756e742c20636c6f736520616e20616374697665207265636f76657279682070726f6365737320666f7220796f7572206163636f756e742e002101205061796d656e743a2042792063616c6c696e6720746869732066756e6374696f6e2c20746865207265636f76657261626c65206163636f756e742077696c6c2072656365697665f820746865207265636f76657279206465706f73697420605265636f766572794465706f7369746020706c616365642062792074686520726573637565722e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061f0207265636f76657261626c65206163636f756e74207769746820616e20616374697665207265636f766572792070726f6365737320666f722069742e003020506172616d65746572733a1101202d206072657363756572603a20546865206163636f756e7420747279696e6720746f207265736375652074686973207265636f76657261626c65206163636f756e742e002c2023203c7765696768743e84204b65793a205620286c656e206f6620766f756368696e6720667269656e6473293d01202d204f6e652073746f7261676520726561642f72656d6f766520746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629c0202d204f6e652062616c616e63652063616c6c20746f20726570617472696174652072657365727665642e204f28582934202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2856202b205829302023203c2f7765696768743e3c72656d6f76655f7265636f7665727900545d012052656d6f766520746865207265636f766572792070726f6365737320666f7220796f7572206163636f756e742e205265636f7665726564206163636f756e747320617265207374696c6c2061636365737369626c652e001501204e4f54453a205468652075736572206d757374206d616b65207375726520746f2063616c6c2060636c6f73655f7265636f7665727960206f6e20616c6c206163746976650901207265636f7665727920617474656d707473206265666f72652063616c6c696e6720746869732066756e6374696f6e20656c73652069742077696c6c206661696c2e002501205061796d656e743a2042792063616c6c696e6720746869732066756e6374696f6e20746865207265636f76657261626c65206163636f756e742077696c6c20756e7265736572766598207468656972207265636f7665727920636f6e66696775726174696f6e206465706f7369742ef4202860436f6e6669674465706f7369744261736560202b2060467269656e644465706f736974466163746f7260202a20235f6f665f667269656e64732900050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061e4207265636f76657261626c65206163636f756e742028692e652e206861732061207265636f7665727920636f6e66696775726174696f6e292e002c2023203c7765696768743e60204b65793a204620286c656e206f6620667269656e6473292901202d204f6e652073746f72616765207265616420746f206765742074686520707265666978206974657261746f7220666f7220616374697665207265636f7665726965732e204f2831293901202d204f6e652073746f7261676520726561642f72656d6f766520746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f2846299c202d204f6e652062616c616e63652063616c6c20746f20756e72657365727665642e204f28582934202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205829302023203c2f7765696768743e4063616e63656c5f7265636f7665726564041c6163636f756e7430543a3a4163636f756e7449642ce02043616e63656c20746865206162696c69747920746f20757365206061735f7265636f76657265646020666f7220606163636f756e74602e00150120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207265676973746572656420746fe82062652061626c6520746f206d616b652063616c6c73206f6e20626568616c66206f6620746865207265636f7665726564206163636f756e742e003020506172616d65746572733a1901202d20606163636f756e74603a20546865207265636f7665726564206163636f756e7420796f75206172652061626c6520746f2063616c6c206f6e2d626568616c662d6f662e002c2023203c7765696768743e1101202d204f6e652073746f72616765206d75746174696f6e20746f20636865636b206163636f756e74206973207265636f7665726564206279206077686f602e204f283129302023203c2f7765696768743e01183c5265636f766572794372656174656404244163636f756e74496404d42041207265636f766572792070726f6365737320686173206265656e2073657420757020666f7220616e205b6163636f756e745d2e445265636f76657279496e6974696174656408244163636f756e744964244163636f756e744964082d012041207265636f766572792070726f6365737320686173206265656e20696e6974696174656420666f72206c6f7374206163636f756e742062792072657363756572206163636f756e742e40205b6c6f73742c20726573637565725d3c5265636f76657279566f75636865640c244163636f756e744964244163636f756e744964244163636f756e744964085d012041207265636f766572792070726f6365737320666f72206c6f7374206163636f756e742062792072657363756572206163636f756e7420686173206265656e20766f756368656420666f722062792073656e6465722e60205b6c6f73742c20726573637565722c2073656e6465725d385265636f76657279436c6f73656408244163636f756e744964244163636f756e7449640821012041207265636f766572792070726f6365737320666f72206c6f7374206163636f756e742062792072657363756572206163636f756e7420686173206265656e20636c6f7365642e40205b6c6f73742c20726573637565725d404163636f756e745265636f766572656408244163636f756e744964244163636f756e744964080501204c6f7374206163636f756e7420686173206265656e207375636365737366756c6c79207265636f76657265642062792072657363756572206163636f756e742e40205b6c6f73742c20726573637565725d3c5265636f7665727952656d6f76656404244163636f756e74496404d82041207265636f766572792070726f6365737320686173206265656e2072656d6f76656420666f7220616e205b6163636f756e745d2e1044436f6e6669674465706f736974426173653042616c616e63654f663c543e40528d8906c2000000000000000000000004550120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e672061207265636f7665727920636f6e66696775726174696f6e2e4c467269656e644465706f736974466163746f723042616c616e63654f663c543e4034c10d671300000000000000000000000469012054686520616d6f756e74206f662063757272656e6379206e656564656420706572206164646974696f6e616c2075736572207768656e206372656174696e672061207265636f7665727920636f6e66696775726174696f6e2e284d6178467269656e64730c753136080900040d0120546865206d6178696d756d20616d6f756e74206f6620667269656e647320616c6c6f77656420696e2061207265636f7665727920636f6e66696775726174696f6e2e3c5265636f766572794465706f7369743042616c616e63654f663c543e40528d8906c20000000000000000000000041d0120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72207374617274696e672061207265636f766572792e40284e6f74416c6c6f77656404f42055736572206973206e6f7420616c6c6f77656420746f206d616b6520612063616c6c206f6e20626568616c66206f662074686973206163636f756e74345a65726f5468726573686f6c640490205468726573686f6c64206d7573742062652067726561746572207468616e207a65726f404e6f74456e6f756768467269656e647304d420467269656e6473206c697374206d7573742062652067726561746572207468616e207a65726f20616e64207468726573686f6c64284d6178467269656e647304ac20467269656e6473206c697374206d757374206265206c657373207468616e206d617820667269656e6473244e6f74536f7274656404cc20467269656e6473206c697374206d75737420626520736f7274656420616e642066726565206f66206475706c696361746573384e6f745265636f76657261626c6504a02054686973206163636f756e74206973206e6f742073657420757020666f72207265636f7665727948416c72656164795265636f76657261626c6504b02054686973206163636f756e7420697320616c72656164792073657420757020666f72207265636f7665727938416c72656164795374617274656404e02041207265636f766572792070726f636573732068617320616c7265616479207374617274656420666f722074686973206163636f756e74284e6f745374617274656404d02041207265636f766572792070726f6365737320686173206e6f74207374617274656420666f7220746869732072657363756572244e6f74467269656e6404ac2054686973206163636f756e74206973206e6f74206120667269656e642077686f2063616e20766f7563682c44656c6179506572696f64041d012054686520667269656e64206d757374207761697420756e74696c207468652064656c617920706572696f6420746f20766f75636820666f722074686973207265636f7665727938416c7265616479566f756368656404c0205468697320757365722068617320616c726561647920766f756368656420666f722074686973207265636f76657279245468726573686f6c6404ec20546865207468726573686f6c6420666f72207265636f766572696e672074686973206163636f756e7420686173206e6f74206265656e206d65742c5374696c6c41637469766504010120546865726520617265207374696c6c20616374697665207265636f7665727920617474656d7074732074686174206e65656420746f20626520636c6f736564204f766572666c6f77049c2054686572652077617320616e206f766572666c6f7720696e20612063616c63756c6174696f6e30416c726561647950726f787904b02054686973206163636f756e7420697320616c72656164792073657420757020666f72207265636f766572791c56657374696e67011c56657374696e67041c56657374696e6700010230543a3a4163636f756e744964a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e00040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e011010766573740044bc20556e6c6f636b20616e79207665737465642066756e6473206f66207468652073656e646572206163636f756e742e00610120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652066756e6473207374696c6c68206c6f636b656420756e6465722074686973206d6f64756c652e00d420456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20322052656164732c203220577269746573fc20202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745d010120202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745d34202d2042656e63686d61726b3aec20202020202d20556e6c6f636b65643a2034382e3736202b202e303438202a206c20c2b57320286d696e2073717561726520616e616c7973697329e420202020202d204c6f636b65643a2034342e3433202b202e323834202a206c20c2b57320286d696e2073717561726520616e616c7973697329ad01202d205573696e6720353020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e28766573745f6f7468657204187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654cbc20556e6c6f636b20616e79207665737465642066756e6473206f662061206074617267657460206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005501202d2060746172676574603a20546865206163636f756e742077686f7365207665737465642066756e64732073686f756c6420626520756e6c6f636b65642e204d75737420686176652066756e6473207374696c6c68206c6f636b656420756e6465722074686973206d6f64756c652e00d420456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20332052656164732c203320577269746573f420202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e74f820202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e7434202d2042656e63686d61726b3ae820202020202d20556e6c6f636b65643a2034342e33202b202e323934202a206c20c2b57320286d696e2073717561726520616e616c7973697329e420202020202d204c6f636b65643a2034382e3136202b202e313033202a206c20c2b57320286d696e2073717561726520616e616c7973697329ad01202d205573696e6720353020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e3c7665737465645f7472616e7366657208187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365207363686564756c65a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e486820437265617465206120766573746564207472616e736665722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e001501202d2060746172676574603a20546865206163636f756e7420746861742073686f756c64206265207472616e7366657272656420746865207665737465642066756e64732e0101202d2060616d6f756e74603a2054686520616d6f756e74206f662066756e647320746f207472616e7366657220616e642077696c6c206265207665737465642ef4202d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e006020456d697473206056657374696e6743726561746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20332052656164732c2033205772697465733d0120202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745d410120202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745de0202d2042656e63686d61726b3a203130302e33202b202e333635202a206c20c2b57320286d696e2073717561726520616e616c7973697329b101202d205573696e672031303020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e54666f7263655f7665737465645f7472616e736665720c18736f757263658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365207363686564756c65a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e4c6420466f726365206120766573746564207472616e736665722e00c820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e00ec202d2060736f75726365603a20546865206163636f756e742077686f73652066756e64732073686f756c64206265207472616e736665727265642e1501202d2060746172676574603a20546865206163636f756e7420746861742073686f756c64206265207472616e7366657272656420746865207665737465642066756e64732e0101202d2060616d6f756e74603a2054686520616d6f756e74206f662066756e647320746f207472616e7366657220616e642077696c6c206265207665737465642ef4202d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e006020456d697473206056657374696e6743726561746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20342052656164732c203420577269746573350120202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e74390120202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e74e0202d2042656e63686d61726b3a203130302e33202b202e333635202a206c20c2b57320286d696e2073717561726520616e616c7973697329b101202d205573696e672031303020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e01083856657374696e675570646174656408244163636f756e7449641c42616c616e63650c59012054686520616d6f756e742076657374656420686173206265656e20757064617465642e205468697320636f756c6420696e646963617465206d6f72652066756e64732061726520617661696c61626c652e205468651d012062616c616e636520676976656e2069732074686520616d6f756e74207768696368206973206c65667420756e7665737465642028616e642074687573206c6f636b6564292e2050205b6163636f756e742c20756e7665737465645d4056657374696e67436f6d706c6574656404244163636f756e74496404150120416e205b6163636f756e745d20686173206265636f6d652066756c6c79207665737465642e204e6f20667572746865722076657374696e672063616e2068617070656e2e04444d696e5665737465645472616e736665723042616c616e63654f663c543e40680abf82280f00000000000000000000041d0120546865206d696e696d756d20616d6f756e7420746f206265207472616e7366657272656420746f206372656174652061206e65772076657374696e67207363686564756c652e0c284e6f7456657374696e67048820546865206163636f756e7420676976656e206973206e6f742076657374696e672e5c4578697374696e6756657374696e675363686564756c65045d0120416e206578697374696e672076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e7420746861742063616e6e6f7420626520636c6f6262657265642e24416d6f756e744c6f7704090120416d6f756e74206265696e67207472616e7366657272656420697320746f6f206c6f7720746f2063726561746520612076657374696e67207363686564756c652e245363686564756c657201245363686564756c65720c184167656e646101010538543a3a426c6f636b4e756d6265726d015665633c4f7074696f6e3c5363686564756c65643c3c542061732054726169743e3a3a43616c6c2c20543a3a426c6f636b4e756d6265722c20543a3a0a50616c6c6574734f726967696e2c20543a3a4163636f756e7449643e3e3e000400044d01204974656d7320746f2062652065786563757465642c20696e64657865642062792074686520626c6f636b206e756d626572207468617420746865792073686f756c64206265206578656375746564206f6e2e184c6f6f6b75700001051c5665633c75383e6c5461736b416464726573733c543a3a426c6f636b4e756d6265723e000400040101204c6f6f6b75702066726f6d206964656e7469747920746f2074686520626c6f636b206e756d62657220616e6420696e646578206f6620746865207461736b2e3853746f7261676556657273696f6e01002052656c656173657304000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e0098204e6577206e6574776f726b732073746172742077697468206c6173742076657273696f6e2e0118207363686564756c6510107768656e38543a3a426c6f636b4e756d626572386d617962655f706572696f646963a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e207072696f72697479487363686564756c653a3a5072696f726974791063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e287420416e6f6e796d6f75736c79207363686564756c652061207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c7390202d2042617365205765696768743a2032322e3239202b202e313236202a205320c2b57334202d204442205765696768743a4c20202020202d20526561643a204167656e64615020202020202d2057726974653a204167656e64613d01202d2057696c6c20757365206261736520776569676874206f662032352077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c73302023203c2f7765696768743e1863616e63656c08107768656e38543a3a426c6f636b4e756d62657214696e6465780c75333228982043616e63656c20616e20616e6f6e796d6f75736c79207363686564756c6564207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c7394202d2042617365205765696768743a2032322e3135202b20322e383639202a205320c2b57334202d204442205765696768743a4c20202020202d20526561643a204167656e64617020202020202d2057726974653a204167656e64612c204c6f6f6b75704101202d2057696c6c20757365206261736520776569676874206f66203130302077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c73302023203c2f7765696768743e387363686564756c655f6e616d6564140869641c5665633c75383e107768656e38543a3a426c6f636b4e756d626572386d617962655f706572696f646963a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e207072696f72697479487363686564756c653a3a5072696f726974791063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e285c205363686564756c652061206e616d6564207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c738c202d2042617365205765696768743a2032392e36202b202e313539202a205320c2b57334202d204442205765696768743a6c20202020202d20526561643a204167656e64612c204c6f6f6b75707020202020202d2057726974653a204167656e64612c204c6f6f6b75704d01202d2057696c6c20757365206261736520776569676874206f662033352077686963682073686f756c6420626520676f6f6420666f72206d6f7265207468616e203330207363686564756c65642063616c6c73302023203c2f7765696768743e3063616e63656c5f6e616d6564040869641c5665633c75383e287c2043616e63656c2061206e616d6564207363686564756c6564207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c7394202d2042617365205765696768743a2032342e3931202b20322e393037202a205320c2b57334202d204442205765696768743a6c20202020202d20526561643a204167656e64612c204c6f6f6b75707020202020202d2057726974653a204167656e64612c204c6f6f6b75704101202d2057696c6c20757365206261736520776569676874206f66203130302077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c73302023203c2f7765696768743e387363686564756c655f61667465721014616674657238543a3a426c6f636b4e756d626572386d617962655f706572696f646963a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e207072696f72697479487363686564756c653a3a5072696f726974791063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e14ac20416e6f6e796d6f75736c79207363686564756c652061207461736b20616674657220612064656c61792e002c2023203c7765696768743e582053616d65206173205b607363686564756c65605d2e302023203c2f7765696768743e507363686564756c655f6e616d65645f6166746572140869641c5665633c75383e14616674657238543a3a426c6f636b4e756d626572386d617962655f706572696f646963a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e207072696f72697479487363686564756c653a3a5072696f726974791063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e1494205363686564756c652061206e616d6564207461736b20616674657220612064656c61792e002c2023203c7765696768743e702053616d65206173205b607363686564756c655f6e616d6564605d2e302023203c2f7765696768743e010c245363686564756c6564082c426c6f636b4e756d6265720c753332048c205363686564756c656420736f6d65207461736b2e205b7768656e2c20696e6465785d2043616e63656c6564082c426c6f636b4e756d6265720c75333204882043616e63656c656420736f6d65207461736b2e205b7768656e2c20696e6465785d28446973706174636865640c605461736b416464726573733c426c6f636b4e756d6265723e3c4f7074696f6e3c5665633c75383e3e384469737061746368526573756c7404a4204469737061746368656420736f6d65207461736b2e205b7461736b2c2069642c20726573756c745d000c404661696c6564546f5363686564756c650468204661696c656420746f207363686564756c6520612063616c6c384661696c6564546f43616e63656c0488204661696c656420746f2063616e63656c2061207363686564756c65642063616c6c5c546172676574426c6f636b4e756d626572496e5061737404a820476976656e2074617267657420626c6f636b206e756d62657220697320696e2074686520706173742e1450726f7879011450726f7879041c50726f7869657301010530543a3a4163636f756e744964c4285665633c28543a3a4163636f756e7449642c20543a3a50726f787954797065293e2c2042616c616e63654f663c543e29004400000000000000000000000000000000000845012054686520736574206f66206163636f756e742070726f786965732e204d61707320746865206163636f756e74207768696368206861732064656c65676174656420746f20746865206163636f756e7473210120776869636820617265206265696e672064656c65676174656420746f2c20746f67657468657220776974682074686520616d6f756e742068656c64206f6e206465706f7369742e01181470726f78790c107265616c30543a3a4163636f756e74496440666f7263655f70726f78795f74797065504f7074696f6e3c543a3a50726f7879547970653e1063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e4051012044697370617463682074686520676976656e206063616c6c602066726f6d20616e206163636f756e742074686174207468652073656e64657220697320617574686f726973656420666f72207468726f7567683420606164645f70726f7879602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1101202d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e6501202d2060666f7263655f70726f78795f74797065603a2053706563696679207468652065786163742070726f7879207479706520746f206265207573656420616e6420636865636b656420666f7220746869732063616c6c2ed4202d206063616c6c603a205468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002c2023203c7765696768743ea0205020697320746865206e756d626572206f662070726f786965732074686520757365722068617390202d2042617365207765696768743a2031392e3837202b202e313431202a205020c2b57374202d204442207765696768743a20312073746f7261676520726561642e80202d20506c75732074686520776569676874206f6620746865206063616c6c60302023203c2f7765696768743e246164645f70726f7879081470726f787930543a3a4163636f756e7449642870726f78795f7479706530543a3a50726f78795479706534490120526567697374657220612070726f7879206163636f756e7420666f72207468652073656e64657220746861742069732061626c6520746f206d616b652063616c6c73206f6e2069747320626568616c662e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1501202d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f206d616b6520612070726f78792e0101202d206070726f78795f74797065603a20546865207065726d697373696f6e7320616c6c6f77656420666f7220746869732070726f7879206163636f756e742e002c2023203c7765696768743ea0205020697320746865206e756d626572206f662070726f786965732074686520757365722068617390202d2042617365207765696768743a2031372e3438202b202e313736202a205020c2b5739c202d204442207765696768743a20312073746f72616765207265616420616e642077726974652e302023203c2f7765696768743e3072656d6f76655f70726f7879081470726f787930543a3a4163636f756e7449642870726f78795f7479706530543a3a50726f78795479706534ac20556e726567697374657220612070726f7879206163636f756e7420666f72207468652073656e6465722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a2901202d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f2072656d6f766520617320612070726f78792e4501202d206070726f78795f74797065603a20546865207065726d697373696f6e732063757272656e746c7920656e61626c656420666f72207468652072656d6f7665642070726f7879206163636f756e742e002c2023203c7765696768743ea0205020697320746865206e756d626572206f662070726f786965732074686520757365722068617390202d2042617365207765696768743a2031342e3337202b202e313634202a205020c2b5739c202d204442207765696768743a20312073746f72616765207265616420616e642077726974652e302023203c2f7765696768743e3872656d6f76655f70726f786965730030b820556e726567697374657220616c6c2070726f7879206163636f756e747320666f72207468652073656e6465722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901205741524e494e473a2054686973206d61792062652063616c6c6564206f6e206163636f756e747320637265617465642062792060616e6f6e796d6f7573602c20686f776576657220696620646f6e652c207468656e5d012074686520756e726573657276656420666565732077696c6c20626520696e61636365737369626c652e202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a002c2023203c7765696768743ea0205020697320746865206e756d626572206f662070726f786965732074686520757365722068617390202d2042617365207765696768743a2031332e3733202b202e313239202a205020c2b5739c202d204442207765696768743a20312073746f72616765207265616420616e642077726974652e302023203c2f7765696768743e24616e6f6e796d6f7573082870726f78795f7479706530543a3a50726f78795479706514696e6465780c753136583d0120537061776e2061206672657368206e6577206163636f756e7420746861742069732067756172616e7465656420746f206265206f746865727769736520696e61636365737369626c652c20616e64010120696e697469616c697a65206974207769746820612070726f7879206f66206070726f78795f747970656020666f7220606f726967696e602073656e6465722e0070205265717569726573206120605369676e656460206f726967696e2e005501202d206070726f78795f74797065603a205468652074797065206f66207468652070726f78792074686174207468652073656e6465722077696c6c2062652072656769737465726564206173206f766572207468655101206e6577206163636f756e742e20546869732077696c6c20616c6d6f737420616c7761797320626520746865206d6f7374207065726d697373697665206050726f7879547970656020706f737369626c6520746f7c20616c6c6f7720666f72206d6178696d756d20666c65786962696c6974792e5501202d2060696e646578603a204120646973616d626967756174696f6e20696e6465782c20696e206361736520746869732069732063616c6c6564206d756c7469706c652074696d657320696e207468652073616d656101207472616e73616374696f6e2028652e672e207769746820607574696c6974793a3a626174636860292e20556e6c65737320796f75277265207573696e67206062617463686020796f752070726f6261626c79206a757374442077616e7420746f20757365206030602e005501204661696c73207769746820604475706c69636174656020696620746869732068617320616c7265616479206265656e2063616c6c656420696e2074686973207472616e73616374696f6e2c2066726f6d207468659c2073616d652073656e6465722c2077697468207468652073616d6520706172616d65746572732e00e8204661696c732069662074686572652061726520696e73756666696369656e742066756e647320746f2070617920666f72206465706f7369742e002c2023203c7765696768743ea0205020697320746865206e756d626572206f662070726f786965732074686520757365722068617390202d2042617365207765696768743a2033362e3438202b202e303339202a205020c2b5739c202d204442207765696768743a20312073746f72616765207265616420616e642077726974652e302023203c2f7765696768743e386b696c6c5f616e6f6e796d6f7573141c737061776e657230543a3a4163636f756e7449642870726f78795f7479706530543a3a50726f78795479706514696e6465780c753136186865696768745c436f6d706163743c543a3a426c6f636b4e756d6265723e246578745f696e64657830436f6d706163743c7533323e58b82052656d6f76657320612070726576696f75736c7920737061776e656420616e6f6e796d6f75732070726f78792e004d01205741524e494e473a202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a20416e792066756e64732068656c6420696e2069742077696c6c2062653820696e61636365737369626c652e005d01205265717569726573206120605369676e656460206f726967696e2c20616e64207468652073656e646572206163636f756e74206d7573742068617665206265656e206372656174656420627920612063616c6c20746fac2060616e6f6e796d6f757360207769746820636f72726573706f6e64696e6720706172616d65746572732e005101202d2060737061776e6572603a20546865206163636f756e742074686174206f726967696e616c6c792063616c6c65642060616e6f6e796d6f75736020746f206372656174652074686973206163636f756e742e5101202d2060696e646578603a2054686520646973616d626967756174696f6e20696e646578206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e2050726f6261626c79206030602e0501202d206070726f78795f74797065603a205468652070726f78792074797065206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e4101202d2060686569676874603a2054686520686569676874206f662074686520636861696e207768656e207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e4d01202d20606578745f696e646578603a205468652065787472696e73696320696e64657820696e207768696368207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e004d01204661696c73207769746820604e6f5065726d697373696f6e6020696e2063617365207468652063616c6c6572206973206e6f7420612070726576696f75736c79206372656174656420616e6f6e796d6f7573f4206163636f756e742077686f73652060616e6f6e796d6f7573602063616c6c2068617320636f72726573706f6e64696e6720706172616d65746572732e002c2023203c7765696768743ea0205020697320746865206e756d626572206f662070726f786965732074686520757365722068617390202d2042617365207765696768743a2031352e3635202b202e313337202a205020c2b5739c202d204442207765696768743a20312073746f72616765207265616420616e642077726974652e302023203c2f7765696768743e01083450726f7879457865637574656404384469737061746368526573756c7404e420412070726f78792077617320657865637574656420636f72726563746c792c20776974682074686520676976656e205b726573756c745d2e40416e6f6e796d6f75734372656174656410244163636f756e744964244163636f756e7449642450726f7879547970650c75313608ec20416e6f6e796d6f7573206163636f756e7420686173206265656e2063726561746564206279206e65772070726f7879207769746820676976656e610120646973616d626967756174696f6e20696e64657820616e642070726f787920747970652e205b616e6f6e796d6f75732c2077686f2c2070726f78795f747970652c20646973616d626967756174696f6e5f696e6465785d0c4050726f78794465706f736974426173653042616c616e63654f663c543e4088409f6908030000000000000000000004110120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e6720612070726f78792e4850726f78794465706f736974466163746f723042616c616e63654f663c543e40684ed34701000000000000000000000004bc2054686520616d6f756e74206f662063757272656e6379206e6565646564207065722070726f78792061646465642e284d617850726f786965730c75313608200004f020546865206d6178696d756d20616d6f756e74206f662070726f7869657320616c6c6f77656420666f7220612073696e676c65206163636f756e742e181c546f6f4d616e79049c2054686572652061726520746f6f206d616e792070726f7869657320726567697374657265642e204e6f74466f756e6404782050726f787920726567697374726174696f6e206e6f7420666f756e642e204e6f7450726f787904d02053656e646572206973206e6f7420612070726f7879206f6620746865206163636f756e7420746f2062652070726f786965642e2c556e70726f787961626c6504250120412063616c6c20776869636820697320696e636f6d70617469626c652077697468207468652070726f7879207479706527732066696c7465722077617320617474656d707465642e244475706c69636174650470204163636f756e7420697320616c726561647920612070726f78792e304e6f5065726d697373696f6e0419012043616c6c206d6179206e6f74206265206d6164652062792070726f78792062656361757365206974206d617920657363616c617465206974732070726976696c656765732e204d756c746973696701204d756c746973696708244d756c74697369677300020530543a3a4163636f756e744964205b75383b2033325dd04d756c74697369673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e02040004942054686520736574206f66206f70656e206d756c7469736967206f7065726174696f6e732e1443616c6c73000106205b75383b2033325da0284f706171756543616c6c2c20543a3a4163636f756e7449642c2042616c616e63654f663c543e290004000001105061735f6d756c74695f7468726573686f6c645f3108446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e1063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e44550120496d6d6564696174656c792064697370617463682061206d756c74692d7369676e61747572652063616c6c207573696e6720612073696e676c6520617070726f76616c2066726f6d207468652063616c6c65722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e004101202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f206172652070617274206f66207468650501206d756c74692d7369676e61747572652c2062757420646f206e6f7420706172746963697061746520696e2074686520617070726f76616c2070726f636573732e8c202d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e00bc20526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c742e002c2023203c7765696768743e1d01204f285a202b204329207768657265205a20697320746865206c656e677468206f66207468652063616c6c20616e6420432069747320657865637574696f6e207765696768742e80202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d94202d2042617365205765696768743a2033332e3732202b20302e303032202a205a20c2b57348202d204442205765696768743a204e6f6e654c202d20506c75732043616c6c20576569676874302023203c2f7765696768743e2061735f6d756c746918247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e1063616c6c284f706171756543616c6c2873746f72655f63616c6c10626f6f6c286d61785f77656967687418576569676874cc590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e00b42049662074686572652061726520656e6f7567682c207468656e206469737061746368207468652063616c6c2e003101205061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573410120607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2e8c202d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e002101204e4f54453a20556e6c6573732074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2067656e6572616c6c792077616e7420746f207573651d012060617070726f76655f61735f6d756c74696020696e73746561642c2073696e6365206974206f6e6c7920726571756972657320612068617368206f66207468652063616c6c2e005d0120526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c7420696620607468726573686f6c64602069732065786163746c79206031602e204f74686572776973655901206f6e20737563636573732c20726573756c7420697320604f6b6020616e642074686520726573756c742066726f6d2074686520696e746572696f722063616c6c2c206966206974207761732065786563757465642ce0206d617920626520666f756e6420696e20746865206465706f736974656420604d756c7469736967457865637574656460206576656e742e002c2023203c7765696768743e54202d20604f2853202b205a202b2043616c6c29602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2e2501202d204f6e652063616c6c20656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285a296020776865726520605a602069732074782d6c656e2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e70202d2054686520776569676874206f6620746865206063616c6c602e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66b4202020604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e80202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743ae020202020202d204372656174653a2020202020202020202034312e3839202b20302e313138202a2053202b202e303032202a205a20c2b573e020202020202d2043726561746520772f2053746f72653a2035332e3537202b20302e313139202a2053202b202e303033202a205a20c2b573e020202020202d20417070726f76653a20202020202020202033312e3339202b20302e313336202a2053202b202e303032202a205a20c2b573e020202020202d20436f6d706c6574653a202020202020202033392e3934202b20302e323620202a2053202b202e303032202a205a20c2b57334202d204442205765696768743a250120202020202d2052656164733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c6029290120202020202d205772697465733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c60294c202d20506c75732043616c6c20576569676874302023203c2f7765696768743e40617070726f76655f61735f6d756c746914247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e2463616c6c5f68617368205b75383b2033325d286d61785f776569676874185765696768749c590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e003101205061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573410120607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e003901204e4f54453a2049662074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2077616e7420746f20757365206061735f6d756c74696020696e73746561642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66b4202020604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e8c202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743a8020202020202d204372656174653a2034342e3731202b20302e303838202a20538420202020202d20417070726f76653a2033312e3438202b20302e313136202a205334202d204442205765696768743abc20202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745dc020202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d302023203c2f7765696768743e3c63616e63656c5f61735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e2474696d65706f696e746454696d65706f696e743c543a3a426c6f636b4e756d6265723e2463616c6c5f68617368205b75383b2033325d6c59012043616e63656c2061207072652d6578697374696e672c206f6e2d676f696e67206d756c7469736967207472616e73616374696f6e2e20416e79206465706f7369742072657365727665642070726576696f75736c79c820666f722074686973206f7065726174696f6e2077696c6c20626520756e7265736572766564206f6e20737563636573732e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e6101202d206074696d65706f696e74603a205468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c7c207472616e73616374696f6e20666f7220746869732064697370617463682ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602e34202d204f6e65206576656e742e88202d20492f4f3a2031207265616420604f285329602c206f6e652072656d6f76652e74202d2053746f726167653a2072656d6f766573206f6e65206974656d2e8c202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d84202d2042617365205765696768743a2033362e3037202b20302e313234202a205334202d204442205765696768743a190120202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c731d0120202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c73302023203c2f7765696768743e01102c4e65774d756c74697369670c244163636f756e744964244163636f756e7449642043616c6c486173680415012041206e6577206d756c7469736967206f7065726174696f6e2068617320626567756e2e205b617070726f76696e672c206d756c74697369672c2063616c6c5f686173685d404d756c7469736967417070726f76616c10244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449642043616c6c48617368047d012041206d756c7469736967206f7065726174696f6e20686173206265656e20617070726f76656420627920736f6d656f6e652e205b617070726f76696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d404d756c7469736967457865637574656414244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449642043616c6c48617368384469737061746368526573756c740451012041206d756c7469736967206f7065726174696f6e20686173206265656e2065786563757465642e205b617070726f76696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d444d756c746973696743616e63656c6c656410244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449642043616c6c486173680459012041206d756c7469736967206f7065726174696f6e20686173206265656e2063616e63656c6c65642e205b63616e63656c6c696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d0038404d696e696d756d5468726573686f6c640480205468726573686f6c64206d7573742062652032206f7220677265617465722e3c416c7265616479417070726f76656404b02043616c6c20697320616c726561647920617070726f7665642062792074686973207369676e61746f72792e444e6f417070726f76616c734e656564656404a02043616c6c20646f65736e2774206e65656420616e7920286d6f72652920617070726f76616c732e44546f6f4665775369676e61746f7269657304ac2054686572652061726520746f6f20666577207369676e61746f7269657320696e20746865206c6973742e48546f6f4d616e795369676e61746f7269657304b02054686572652061726520746f6f206d616e79207369676e61746f7269657320696e20746865206c6973742e545369676e61746f726965734f75744f664f7264657204110120546865207369676e61746f7269657320776572652070726f7669646564206f7574206f66206f726465723b20746865792073686f756c64206265206f7264657265642e4c53656e646572496e5369676e61746f72696573041101205468652073656e6465722077617320636f6e7461696e656420696e20746865206f74686572207369676e61746f726965733b2069742073686f756c646e27742062652e204e6f74466f756e6404e0204d756c7469736967206f7065726174696f6e206e6f7420666f756e64207768656e20617474656d7074696e6720746f2063616e63656c2e204e6f744f776e6572043101204f6e6c7920746865206163636f756e742074686174206f726967696e616c6c79206372656174656420746865206d756c74697369672069732061626c6520746f2063616e63656c2069742e2c4e6f54696d65706f696e74042101204e6f2074696d65706f696e742077617320676976656e2c2079657420746865206d756c7469736967206f7065726174696f6e20697320616c726561647920756e6465727761792e3857726f6e6754696d65706f696e74043101204120646966666572656e742074696d65706f696e742077617320676976656e20746f20746865206d756c7469736967206f7065726174696f6e207468617420697320756e6465727761792e4c556e657870656374656454696d65706f696e7404f820412074696d65706f696e742077617320676976656e2c20796574206e6f206d756c7469736967206f7065726174696f6e20697320756e6465727761792e30576569676874546f6f4c6f7704d420546865206d6178696d756d2077656967687420696e666f726d6174696f6e2070726f76696465642077617320746f6f206c6f772e34416c726561647953746f72656404a420546865206461746120746f2062652073746f72656420697320616c72656164792073746f7265642e042440436865636b5370656356657273696f6e38436865636b547856657273696f6e30436865636b47656e6573697338436865636b4d6f7274616c69747928436865636b4e6f6e63652c436865636b576569676874604368617267655472616e73616374696f6e5061796d656e74584c696d697450617261746872656164436f6d6d6974736456616c6964617465446f75626c65566f74655265706f727473 " + +metadata_v12_hex = '0x6d6574610c801853797374656d011853797374656d3c1c4163636f756e7401010230543a3a4163636f756e744964944163636f756e74496e666f3c543a3a496e6465782c20543a3a4163636f756e74446174613e00150100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e8205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e3845787472696e736963436f756e7400000c753332040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2c426c6f636b576569676874010064776569676874733a3a45787472696e7369637357656967687440000000000000000000000000000000000488205468652063757272656e742077656967687420666f722074686520626c6f636b2e40416c6c45787472696e736963734c656e00000c753332040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b4861736801010538543a3a426c6f636b4e756d6265721c543a3a48617368008000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101050c7533321c5665633c75383e000400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d626572010038543a3a426c6f636b4e756d6265721000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e3845787472696e73696373526f6f7401001c543a3a486173688000000000000000000000000000000000000000000000000000000000000000000415012045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e1844696765737401002c4469676573744f663c543e040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301008c5665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e040004a0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e284576656e74436f756e740100284576656e74496e646578100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f706963730101021c543a3a48617368845665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e000400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e484c61737452756e74696d65557067726164650000584c61737452756e74696d6555706772616465496e666f04000455012053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e38457865637574696f6e50686173650000145068617365040004882054686520657865637574696f6e207068617365206f662074686520626c6f636b2e01282866696c6c5f626c6f636b04185f726174696f1c50657262696c6c040901204120646973706174636820746861742077696c6c2066696c6c2074686520626c6f636b2077656967687420757020746f2074686520676976656e20726174696f2e1872656d61726b041c5f72656d61726b1c5665633c75383e1c6c204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e002c2023203c7765696768743e24202d20604f28312960e0202d2042617365205765696768743a20302e36363520c2b5732c20696e646570656e64656e74206f662072656d61726b206c656e6774682e50202d204e6f204442206f7065726174696f6e732e302023203c2f7765696768743e387365745f686561705f7061676573041470616765730c75363420fc2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e002c2023203c7765696768743e24202d20604f283129604c202d20312073746f726167652077726974652e64202d2042617365205765696768743a20312e34303520c2b57360202d203120777269746520746f20484541505f5041474553302023203c2f7765696768743e207365745f636f64650410636f64651c5665633c75383e28682053657420746865206e65772072756e74696d6520636f64652e002c2023203c7765696768743e3501202d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f64656088202d20312073746f726167652077726974652028636f64656320604f28432960292e7901202d20312063616c6c20746f206063616e5f7365745f636f6465603a20604f28532960202863616c6c73206073705f696f3a3a6d6973633a3a72756e74696d655f76657273696f6e6020776869636820697320657870656e73697665292e2c202d2031206576656e742e7d012054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652c206275742067656e6572616c6c792074686973206973207665727920657870656e736976652e902057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e302023203c2f7765696768743e5c7365745f636f64655f776974686f75745f636865636b730410636f64651c5665633c75383e201d012053657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e002c2023203c7765696768743e90202d20604f2843296020776865726520604360206c656e677468206f662060636f64656088202d20312073746f726167652077726974652028636f64656320604f28432960292e2c202d2031206576656e742e75012054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e302023203c2f7765696768743e5c7365745f6368616e6765735f747269655f636f6e666967044c6368616e6765735f747269655f636f6e666967804f7074696f6e3c4368616e67657354726965436f6e66696775726174696f6e3e28a02053657420746865206e6577206368616e676573207472696520636f6e66696775726174696f6e2e002c2023203c7765696768743e24202d20604f28312960b0202d20312073746f72616765207772697465206f722064656c6574652028636f64656320604f28312960292ed8202d20312063616c6c20746f20606465706f7369745f6c6f67603a20557365732060617070656e6460204150492c20736f204f28312964202d2042617365205765696768743a20372e32313820c2b57334202d204442205765696768743aa820202020202d205772697465733a204368616e67657320547269652c2053797374656d20446967657374302023203c2f7765696768743e2c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e206c2053657420736f6d65206974656d73206f662073746f726167652e002c2023203c7765696768743e94202d20604f2849296020776865726520604960206c656e677468206f6620606974656d73607c202d206049602073746f72616765207772697465732028604f28312960292e74202d2042617365205765696768743a20302e353638202a206920c2b57368202d205772697465733a204e756d626572206f66206974656d73302023203c2f7765696768743e306b696c6c5f73746f7261676504106b657973205665633c4b65793e2078204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e002c2023203c7765696768743efc202d20604f28494b296020776865726520604960206c656e677468206f6620606b6579736020616e6420604b60206c656e677468206f66206f6e65206b657964202d206049602073746f726167652064656c6574696f6e732e70202d2042617365205765696768743a202e333738202a206920c2b57368202d205772697465733a204e756d626572206f66206974656d73302023203c2f7765696768743e2c6b696c6c5f70726566697808187072656669780c4b6579205f7375626b6579730c7533322c1501204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e003d01202a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e64657241012074686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e002c2023203c7765696768743edc202d20604f285029602077686572652060506020616d6f756e74206f66206b65797320776974682070726566697820607072656669786064202d206050602073746f726167652064656c6574696f6e732e74202d2042617365205765696768743a20302e383334202a205020c2b57380202d205772697465733a204e756d626572206f66207375626b657973202b2031302023203c2f7765696768743e1c7375696369646500286501204b696c6c207468652073656e64696e67206163636f756e742c20617373756d696e6720746865726520617265206e6f207265666572656e636573206f75747374616e64696e6720616e642074686520636f6d706f7369746590206461746120697320657175616c20746f206974732064656661756c742076616c75652e002c2023203c7765696768743e24202d20604f283129607c202d20312073746f72616765207265616420616e642064656c6574696f6e2e54202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a20382e36323620c2b5731101204e6f2044422052656164206f72205772697465206f7065726174696f6e7320626563617573652063616c6c657220697320616c726561647920696e206f7665726c6179302023203c2f7765696768743e01144045787472696e7369635375636365737304304469737061746368496e666f04b020416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e205b696e666f5d3c45787472696e7369634661696c6564083444697370617463684572726f72304469737061746368496e666f048c20416e2065787472696e736963206661696c65642e205b6572726f722c20696e666f5d2c436f64655570646174656400045420603a636f6465602077617320757064617465642e284e65774163636f756e7404244163636f756e74496404742041206e6577205b6163636f756e745d2077617320637265617465642e344b696c6c65644163636f756e7404244163636f756e744964046420416e205b6163636f756e745d20776173207265617065642e1838426c6f636b48617368436f756e7438543a3a426c6f636b4e756d626572106009000004d820546865206d6178696d756d206e756d626572206f6620626c6f636b7320746f20616c6c6f7720696e206d6f7274616c20657261732e484d6178696d756d426c6f636b576569676874185765696768742000204aa9d1010000047c20546865206d6178696d756d20776569676874206f66206120626c6f636b2e2044625765696768743c52756e74696d6544625765696768744040787d010000000000e1f505000000000409012054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e50426c6f636b457865637574696f6e576569676874185765696768742000f2052a0100000004510120546865206261736520776569676874206f6620657865637574696e67206120626c6f636b2c20696e646570656e64656e74206f6620746865207472616e73616374696f6e7320696e2074686520626c6f636b2e4c45787472696e736963426173655765696768741857656967687420405973070000000004790120546865206261736520776569676874206f6620616e2045787472696e73696320696e2074686520626c6f636b2c20696e646570656e64656e74206f6620746865206f662065787472696e736963206265696e672065786563757465642e484d6178696d756d426c6f636b4c656e6774680c753332100000500004a820546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e143c496e76616c6964537065634e616d6508150120546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d655420616e6420746865206e65772072756e74696d652e685370656356657273696f6e4e65656473546f496e637265617365084501205468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d655420616e6420746865206e65772072756e74696d652e744661696c6564546f4578747261637452756e74696d6556657273696f6e0cf0204661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e000d01204569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e4c4e6f6e44656661756c74436f6d706f7369746504010120537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e3c4e6f6e5a65726f526566436f756e740439012054686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e001c5574696c697479000108146261746368041463616c6c735c5665633c3c542061732054726169743e3a3a43616c6c3e50802053656e642061206261746368206f662064697370617463682063616c6c732e007c204d61792062652063616c6c65642066726f6d20616e79206f726967696e2e00f0202d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e006101204966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c75646573c820627970617373696e6720606672616d655f73797374656d3a3a54726169743a3a4261736543616c6c46696c74657260292e002c2023203c7765696768743e90202d2042617365207765696768743a2031342e3339202b202e393837202a206320c2b573b8202d20506c7573207468652073756d206f66207468652077656967687473206f6620746865206063616c6c73602ec4202d20506c7573206f6e65206164646974696f6e616c206576656e742e202872657065617420726561642f777269746529302023203c2f7765696768743e00590120546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e3501206576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e20746865590120604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d616465510120616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c657465646050206576656e74206973206465706f73697465642e3461735f646572697661746976650814696e6465780c7531361063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e34e02053656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e0059012046696c7465722066726f6d206f726967696e206172652070617373656420616c6f6e672e205468652063616c6c2077696c6c2062652064697370617463686564207769746820616e206f726967696e207768696368c020757365207468652073616d652066696c74657220617320746865206f726967696e206f6620746869732063616c6c2e004901204e4f54453a20496620796f75206e65656420746f20656e73757265207468617420616e79206163636f756e742d62617365642066696c746572696e67206973206e6f7420686f6e6f7265642028692e652e6501206265636175736520796f7520657870656374206070726f78796020746f2068617665206265656e2075736564207072696f7220696e207468652063616c6c20737461636b20616e6420796f7520646f206e6f742077616e745501207468652063616c6c207265737472696374696f6e7320746f206170706c7920746f20616e79207375622d6163636f756e7473292c207468656e20757365206061735f6d756c74695f7468726573686f6c645f31608020696e20746865204d756c74697369672070616c6c657420696e73746561642e00f8204e4f54453a205072696f7220746f2076657273696f6e202a31322c2074686973207761732063616c6c6564206061735f6c696d697465645f737562602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0108404261746368496e746572727570746564080c7533323444697370617463684572726f72085901204261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c206173882077656c6c20617320746865206572726f722e205b696e6465782c206572726f725d384261746368436f6d706c657465640004cc204261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e00000110426162650110426162652c2845706f6368496e64657801000c75363420000000000000000004542043757272656e742065706f636820696e6465782e2c417574686f72697469657301009c5665633c28417574686f7269747949642c2042616265417574686f72697479576569676874293e0400046c2043757272656e742065706f636820617574686f7269746965732e2c47656e65736973536c6f7401000c75363420000000000000000008f82054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e205468697320697320309020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2c43757272656e74536c6f7401000c75363420000000000000000004542043757272656e7420736c6f74206e756d6265722e2852616e646f6d6e6573730100587363686e6f72726b656c3a3a52616e646f6d6e65737380000000000000000000000000000000000000000000000000000000000000000028b8205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e002c20232053656375726974790005012054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061f8206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e7915012063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d6265727320746861742074686973150120286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e206265050120757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e0d01206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e3c4e65787445706f6368436f6e6669670000504e657874436f6e66696744657363726970746f7204000498204e6578742065706f636820636f6e66696775726174696f6e2c206966206368616e6765642e384e65787452616e646f6d6e6573730100587363686e6f72726b656c3a3a52616e646f6d6e657373800000000000000000000000000000000000000000000000000000000000000000045c204e6578742065706f63682072616e646f6d6e6573732e305365676d656e74496e64657801000c7533321000000000247c2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e00f4205765206d616b6520612074726164656f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e01012057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f942060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e00ec204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e090120576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572791c2065706f63682e44556e646572436f6e737472756374696f6e0101050c7533326c5665633c7363686e6f72726b656c3a3a52616e646f6d6e6573733e0004000415012054574f582d4e4f54453a20605365676d656e74496e6465786020697320616e20696e6372656173696e6720696e74656765722c20736f2074686973206973206f6b61792e2c496e697469616c697a656400003c4d6179626552616e646f6d6e65737304000801012054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d65601d01206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e204c6174656e657373010038543a3a426c6f636b4e756d626572100000000014d820486f77206c617465207468652063757272656e7420626c6f636b20697320636f6d706172656420746f2069747320706172656e742e001501205468697320656e74727920697320706f70756c617465642061732070617274206f6620626c6f636b20657865637574696f6e20616e6420697320636c65616e65642075701101206f6e20626c6f636b2066696e616c697a6174696f6e2e205175657279696e6720746869732073746f7261676520656e747279206f757473696465206f6620626c6f636bb020657865637574696f6e20636f6e746578742073686f756c6420616c77617973207969656c64207a65726f2e01084c7265706f72745f65717569766f636174696f6e084865717569766f636174696f6e5f70726f6f667045717569766f636174696f6e50726f6f663c543a3a4865616465723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66100d01205265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c207665726966790901207468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66110120616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c34206265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e6564084865717569766f636174696f6e5f70726f6f667045717569766f636174696f6e50726f6f663c543a3a4865616465723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66200d01205265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c207665726966790901207468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66110120616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c34206265207265706f727465642e110120546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c79190120626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c206173207375636819012069662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e28207265706f727465722e00083445706f63684475726174696f6e0c75363420c800000000000000080d0120546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746ffc2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e444578706563746564426c6f636b54696d6524543a3a4d6f6d656e7420b80b00000000000014050120546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e67110120626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f75740501207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f740901206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473a0207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e00022454696d657374616d70012454696d657374616d70080c4e6f77010024543a3a4d6f6d656e7420000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e24446964557064617465010010626f6f6c040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01040c736574040c6e6f7748436f6d706163743c543a3a4d6f6d656e743e3c5820536574207468652063757272656e742074696d652e00590120546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed82070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e004501205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e74207370656369666965642062794420604d696e696d756d506572696f64602e00d820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e002c2023203c7765696768743ed0202d20604f285429602077686572652060546020636f6d706c6578697479206f6620606f6e5f74696d657374616d705f73657460a101202d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202862656361757365206f6620604469645570646174653a3a74616b656020696e20606f6e5f66696e616c697a656029b4202d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f7365746020604f285429602e302023203c2f7765696768743e0004344d696e696d756d506572696f6424543a3a4d6f6d656e7420dc0500000000000010690120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f64690120746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c79650120776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c6520746869737020706572696f64206f6e2064656661756c742073657474696e67732e000328417574686f72736869700128417574686f72736869700c18556e636c65730100e85665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e0400041c20556e636c657318417574686f72000030543a3a4163636f756e7449640400046420417574686f72206f662063757272656e7420626c6f636b2e30446964536574556e636c6573010010626f6f6c040004bc205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e0104287365745f756e636c657304286e65775f756e636c6573385665633c543a3a4865616465723e04642050726f76696465206120736574206f6620756e636c65732e00001c48496e76616c6964556e636c65506172656e74048c2054686520756e636c6520706172656e74206e6f7420696e2074686520636861696e2e40556e636c6573416c7265616479536574048420556e636c657320616c72656164792073657420696e2074686520626c6f636b2e34546f6f4d616e79556e636c6573044420546f6f206d616e7920756e636c65732e3047656e65736973556e636c6504582054686520756e636c652069732067656e657369732e30546f6f48696768556e636c6504802054686520756e636c6520697320746f6f206869676820696e20636861696e2e50556e636c65416c7265616479496e636c75646564047c2054686520756e636c6520697320616c726561647920696e636c756465642e204f6c64556e636c6504b82054686520756e636c652069736e277420726563656e7420656e6f75676820746f20626520696e636c756465642e041c496e6469636573011c496e646963657304204163636f756e74730001023c543a3a4163636f756e74496e6465788828543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20626f6f6c29000400048820546865206c6f6f6b75702066726f6d20696e64657820746f206163636f756e742e011414636c61696d0414696e6465783c543a3a4163636f756e74496e6465784c9c2041737369676e20616e2070726576696f75736c7920756e61737369676e656420696e6465782e00e0205061796d656e743a20604465706f736974602069732072657365727665642066726f6d207468652073656e646572206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00f4202d2060696e646578603a2074686520696e64657820746f20626520636c61696d65642e2054686973206d757374206e6f7420626520696e207573652e009420456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e64202d204f6e652072657365727665206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2032382e363920c2b57394202d204442205765696768743a203120526561642f577269746520284163636f756e747329302023203c2f7765696768743e207472616e73666572080c6e657730543a3a4163636f756e74496414696e6465783c543a3a4163636f756e74496e6465785461012041737369676e20616e20696e64657820616c7265616479206f776e6564206279207468652073656e64657220746f20616e6f74686572206163636f756e742e205468652062616c616e6365207265736572766174696f6ebc206973206566666563746976656c79207472616e7366657272656420746f20746865206e6577206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002901202d2060696e646578603a2074686520696e64657820746f2062652072652d61737369676e65642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e6101202d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e009420456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e68202d204f6e65207472616e73666572206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2033332e373420c2b57334202d204442205765696768743ae4202020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e7429e8202020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e7429302023203c2f7765696768743e10667265650414696e6465783c543a3a4163636f756e74496e6465784c98204672656520757020616e20696e646578206f776e6564206279207468652073656e6465722e006101205061796d656e743a20416e792070726576696f7573206465706f73697420706c6163656420666f722074686520696e64657820697320756e726573657276656420696e207468652073656e646572206163636f756e742e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206f776e2074686520696e6465782e001101202d2060696e646578603a2074686520696e64657820746f2062652066726565642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e008820456d6974732060496e646578467265656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e64202d204f6e652072657365727665206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2032352e353320c2b57394202d204442205765696768743a203120526561642f577269746520284163636f756e747329302023203c2f7765696768743e38666f7263655f7472616e736665720c0c6e657730543a3a4163636f756e74496414696e6465783c543a3a4163636f756e74496e64657818667265657a6510626f6f6c58590120466f72636520616e20696e64657820746f20616e206163636f756e742e205468697320646f65736e277420726571756972652061206465706f7369742e2049662074686520696e64657820697320616c7265616479ec2068656c642c207468656e20616e79206465706f736974206973207265696d62757273656420746f206974732063757272656e74206f776e65722e00c820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e00a8202d2060696e646578603a2074686520696e64657820746f206265202872652d2961737369676e65642e6101202d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e4501202d2060667265657a65603a2069662073657420746f206074727565602c2077696c6c20667265657a652074686520696e64657820736f2069742063616e6e6f74206265207472616e736665727265642e009420456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e7c202d20557020746f206f6e652072657365727665206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2032362e383320c2b57334202d204442205765696768743af8202020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e657229fc202020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e657229302023203c2f7765696768743e18667265657a650414696e6465783c543a3a4163636f756e74496e64657848690120467265657a6520616e20696e64657820736f2069742077696c6c20616c7761797320706f696e7420746f207468652073656e646572206163636f756e742e205468697320636f6e73756d657320746865206465706f7369742e005d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d7573742068617665206170206e6f6e2d66726f7a656e206163636f756e742060696e646578602e00b0202d2060696e646578603a2074686520696e64657820746f2062652066726f7a656e20696e20706c6163652e008c20456d6974732060496e64657846726f7a656e60206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e74202d20557020746f206f6e6520736c617368206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2033302e383620c2b57394202d204442205765696768743a203120526561642f577269746520284163636f756e747329302023203c2f7765696768743e010c34496e64657841737369676e656408244163636f756e744964304163636f756e74496e64657804ac2041206163636f756e7420696e646578207761732061737369676e65642e205b77686f2c20696e6465785d28496e646578467265656404304163636f756e74496e64657804e02041206163636f756e7420696e64657820686173206265656e2066726565642075702028756e61737369676e6564292e205b696e6465785d2c496e64657846726f7a656e08304163636f756e74496e646578244163636f756e7449640421012041206163636f756e7420696e64657820686173206265656e2066726f7a656e20746f206974732063757272656e74206163636f756e742049442e205b77686f2c20696e6465785d041c4465706f7369743042616c616e63654f663c543e4000407a10f35a0000000000000000000004ac20546865206465706f736974206e656564656420666f7220726573657276696e6720616e20696e6465782e00052042616c616e636573012042616c616e6365731034546f74616c49737375616e6365010028543a3a42616c616e6365400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e1c4163636f756e7401010230543a3a4163636f756e7449645c4163636f756e74446174613c543a3a42616c616e63653e000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6c205468652062616c616e6365206f6620616e206163636f756e742e004101204e4f54453a2054686973206973206f6e6c79207573656420696e20746865206361736520746861742074686973206d6f64756c65206973207573656420746f2073746f72652062616c616e6365732e144c6f636b7301010230543a3a4163636f756e744964705665633c42616c616e63654c6f636b3c543a3a42616c616e63653e3e00040008b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2501204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e3853746f7261676556657273696f6e01002052656c656173657304000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e00a020546869732069732073657420746f2076322e302e3020666f72206e6577206e6574776f726b732e0110207472616e736665720810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e6cd8205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e00090120607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e21012049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e1501204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b4206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e00190120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e002c2023203c7765696768743e3101202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72cc202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e6901202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e004c2052656c617465642066756e6374696f6e733a0051012020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2d012020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365d420202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e61012020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765722060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e636564602e49012020202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616cf82020202020636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e88202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d4501202d2042617365205765696768743a2037332e363420c2b5732c20776f7273742063617365207363656e6172696f20286163636f756e7420637265617465642c206163636f756e742072656d6f76656429dc202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374696e6174696f6e206163636f756e741501202d204f726967696e206163636f756e7420697320616c726561647920696e206d656d6f72792c20736f206e6f204442206f7065726174696f6e7320666f72207468656d2e302023203c2f7765696768743e2c7365745f62616c616e63650c0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365206e65775f667265654c436f6d706163743c543a3a42616c616e63653e306e65775f72657365727665644c436f6d706163743c543a3a42616c616e63653e489420536574207468652062616c616e636573206f66206120676976656e206163636f756e742e00210120546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c090120616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e190120496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c01012069742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e00b420546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e002c2023203c7765696768743e80202d20496e646570656e64656e74206f662074686520617267756d656e74732ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e58202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743a6820202020202d204372656174696e673a2032372e353620c2b5736420202020202d204b696c6c696e673a2033352e313120c2b57398202d204442205765696768743a203120526561642c203120577269746520746f206077686f60302023203c2f7765696768743e38666f7263655f7472616e736665720c18736f757263658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636510646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e1851012045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d61792062652c207370656369666965642e2c2023203c7765696768743e4101202d2053616d65206173207472616e736665722c20627574206164646974696f6e616c207265616420616e6420777269746520626563617573652074686520736f75726365206163636f756e74206973902020206e6f7420617373756d656420746f20626520696e20746865206f7665726c61792e302023203c2f7765696768743e4c7472616e736665725f6b6565705f616c6976650810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e2c51012053616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c2074686540206f726967696e206163636f756e742e00bc20393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e00c4205b607472616e73666572605d3a207374727563742e4d6f64756c652e68746d6c236d6574686f642e7472616e736665722c2023203c7765696768743ee8202d2043686561706572207468616e207472616e736665722062656361757365206163636f756e742063616e6e6f74206265206b696c6c65642e60202d2042617365205765696768743a2035312e3420c2b5731d01202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374202873656e64657220697320696e206f7665726c617920616c7265616479292c20233c2f7765696768743e01201c456e646f77656408244163636f756e7449641c42616c616e6365041d0120416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e205b6163636f756e742c20667265655f62616c616e63655d20447573744c6f737408244163636f756e7449641c42616c616e636508410120416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77204578697374656e7469616c4465706f7369742cc820726573756c74696e6720696e20616e206f75747269676874206c6f73732e205b6163636f756e742c2062616c616e63655d205472616e736665720c244163636f756e744964244163636f756e7449641c42616c616e63650498205472616e73666572207375636365656465642e205b66726f6d2c20746f2c2076616c75655d2842616c616e63655365740c244163636f756e7449641c42616c616e63651c42616c616e636504c420412062616c616e6365207761732073657420627920726f6f742e205b77686f2c20667265652c2072657365727665645d1c4465706f73697408244163636f756e7449641c42616c616e636504190120536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e205b77686f2c206465706f7369745d20526573657276656408244163636f756e7449641c42616c616e636504190120536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e205b77686f2c2076616c75655d28556e726573657276656408244163636f756e7449641c42616c616e636504210120536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e205b77686f2c2076616c75655d4852657365727665526570617472696174656410244163636f756e744964244163636f756e7449641c42616c616e6365185374617475730c510120536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742edc2046696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652ea0205b66726f6d2c20746f2c2062616c616e63652c2064657374696e6174696f6e5f7374617475735d04484578697374656e7469616c4465706f73697428543a3a42616c616e63654000407a10f35a0000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e203856657374696e6742616c616e6365049c2056657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c7565544c69717569646974795265737472696374696f6e7304c8204163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c204f766572666c6f77047420476f7420616e206f766572666c6f7720616674657220616464696e674c496e73756666696369656e7442616c616e636504782042616c616e636520746f6f206c6f7720746f2073656e642076616c7565484578697374656e7469616c4465706f73697404ec2056616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f736974244b656570416c6976650490205472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e745c4578697374696e6756657374696e675363686564756c6504cc20412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742c446561644163636f756e74048c2042656e6566696369617279206163636f756e74206d757374207072652d657869737406485472616e73616374696f6e5061796d656e7401485472616e73616374696f6e5061796d656e7408444e6578744665654d756c7469706c6965720100284d756c7469706c69657240000064a7b3b6e00d0000000000000000003853746f7261676556657273696f6e01002052656c6561736573040000000008485472616e73616374696f6e427974654665653042616c616e63654f663c543e4000e40b54020000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e2c576569676874546f466565a45665633c576569676874546f466565436f656666696369656e743c42616c616e63654f663c543e3e3e5c0401000000000000000000000000000000000000000001040d012054686520706f6c796e6f6d69616c2074686174206973206170706c69656420696e206f7264657220746f20646572697665206665652066726f6d207765696768742e00071c5374616b696e67011c5374616b696e678c30486973746f7279446570746801000c75333210540000001c8c204e756d626572206f66206572617320746f206b65657020696e20686973746f72792e00390120496e666f726d6174696f6e206973206b65707420666f72206572617320696e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e006101204d757374206265206d6f7265207468616e20746865206e756d626572206f6620657261732064656c617965642062792073657373696f6e206f74686572776973652e20492e652e2061637469766520657261206d757374390120616c7761797320626520696e20686973746f72792e20492e652e20606163746976655f657261203e2063757272656e745f657261202d20686973746f72795f646570746860206d757374206265302067756172616e746565642e3856616c696461746f72436f756e7401000c753332100000000004a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e7401000c7533321000000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e34496e76756c6e657261626c65730100445665633c543a3a4163636f756e7449643e04000c590120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e636520746865792772654d01206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f7572ac20696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e64656400010530543a3a4163636f756e74496430543a3a4163636f756e744964000400040101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e184c656467657200010230543a3a4163636f756e744964a45374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e14506179656501010530543a3a4163636f756e7449647c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e00040004e42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e2856616c696461746f727301010530543a3a4163636f756e7449643856616c696461746f72507265667300040004450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e284e6f6d696e61746f727300010530543a3a4163636f756e744964644e6f6d696e6174696f6e733c543a3a4163636f756e7449643e00040004650120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e2843757272656e74457261000020457261496e6465780400105c205468652063757272656e742065726120696e6465782e006501205468697320697320746865206c617465737420706c616e6e6564206572612c20646570656e64696e67206f6e20686f77207468652053657373696f6e2070616c6c657420717565756573207468652076616c696461746f7280207365742c206974206d6967687420626520616374697665206f72206e6f742e24416374697665457261000034416374697665457261496e666f040010d820546865206163746976652065726120696e666f726d6174696f6e2c20697420686f6c647320696e64657820616e642073746172742e00b820546865206163746976652065726120697320746865206572612063757272656e746c792072657761726465642e2d012056616c696461746f7220736574206f66207468697320657261206d75737420626520657175616c20746f206053657373696f6e496e746572666163653a3a76616c696461746f7273602e5445726173537461727453657373696f6e496e64657800010520457261496e6465783053657373696f6e496e646578000400043101205468652073657373696f6e20696e646578206174207768696368207468652065726120737461727420666f7220746865206c6173742060484953544f52595f44455054486020657261732e2c457261735374616b65727301020520457261496e64657830543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e050c0000001878204578706f73757265206f662076616c696461746f72206174206572612e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e48457261735374616b657273436c697070656401020520457261496e64657830543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e050c0000002c9820436c6970706564204578706f73757265206f662076616c696461746f72206174206572612e00590120546869732069732073696d696c617220746f205b60457261735374616b657273605d20627574206e756d626572206f66206e6f6d696e61746f7273206578706f736564206973207265647563656420746f20746865dc2060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732e1d0120284e6f74653a20746865206669656c642060746f74616c6020616e6420606f776e60206f6620746865206578706f737572652072656d61696e7320756e6368616e676564292ef42054686973206973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e005d012054686973206973206b657965642066697374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e484572617356616c696461746f72507265667301020520457261496e64657830543a3a4163636f756e7449643856616c696461746f7250726566730504001411012053696d696c617220746f2060457261735374616b657273602c207468697320686f6c64732074686520707265666572656e636573206f662076616c696461746f72732e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4c4572617356616c696461746f7252657761726400010520457261496e6465783042616c616e63654f663c543e0004000c09012054686520746f74616c2076616c696461746f7220657261207061796f757420666f7220746865206c6173742060484953544f52595f44455054486020657261732e0021012045726173207468617420686176656e27742066696e697368656420796574206f7220686173206265656e2072656d6f76656420646f65736e27742068617665207265776172642e4045726173526577617264506f696e747301010520457261496e64657874457261526577617264506f696e74733c543a3a4163636f756e7449643e0014000000000008ac205265776172647320666f7220746865206c6173742060484953544f52595f44455054486020657261732e250120496620726577617264206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207265776172642069732072657475726e65642e3845726173546f74616c5374616b6501010520457261496e6465783042616c616e63654f663c543e00400000000000000000000000000000000008ec2054686520746f74616c20616d6f756e74207374616b656420666f7220746865206c6173742060484953544f52595f44455054486020657261732e1d0120496620746f74616c206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207374616b652069732072657475726e65642e20466f72636545726101001c466f7263696e6704000454204d6f6465206f662065726120666f7263696e672e4c536c6173685265776172644672616374696f6e01001c50657262696c6c10000000000cf8205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e00e4205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e4c43616e63656c6564536c6173685061796f757401003042616c616e63654f663c543e40000000000000000000000000000000000815012054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e7420776869636820776173ec2063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e40556e6170706c696564536c617368657301010520457261496e646578bc5665633c556e6170706c696564536c6173683c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3e00040004c420416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e28426f6e646564457261730100745665633c28457261496e6465782c2053657373696f6e496e646578293e04001025012041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e00c8204d75737420636f6e7461696e7320696e666f726d6174696f6e20666f72206572617320666f72207468652072616e67653abc20605b6163746976655f657261202d20626f756e64696e675f6475726174696f6e3b206163746976655f6572615d604c56616c696461746f72536c617368496e45726100020520457261496e64657830543a3a4163636f756e7449645c2850657262696c6c2c2042616c616e63654f663c543e2905040008450120416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e7020616e6420736c6173682076616c7565206f6620746865206572612e4c4e6f6d696e61746f72536c617368496e45726100020520457261496e64657830543a3a4163636f756e7449643042616c616e63654f663c543e05040004610120416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e34536c617368696e675370616e7300010530543a3a4163636f756e7449645c736c617368696e673a3a536c617368696e675370616e73000400048c20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e245370616e536c6173680101058c28543a3a4163636f756e7449642c20736c617368696e673a3a5370616e496e6465782988736c617368696e673a3a5370616e5265636f72643c42616c616e63654f663c543e3e00800000000000000000000000000000000000000000000000000000000000000000083d01205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2cb82061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e584561726c69657374556e6170706c696564536c617368000020457261496e646578040004fc20546865206561726c696573742065726120666f72207768696368207765206861766520612070656e64696e672c20756e6170706c69656420736c6173682e48536e617073686f7456616c696461746f72730000445665633c543a3a4163636f756e7449643e040008650120536e617073686f74206f662076616c696461746f72732061742074686520626567696e6e696e67206f66207468652063757272656e7420656c656374696f6e2077696e646f772e20546869732073686f756c64206f6e6c791901206861766520612076616c7565207768656e205b60457261456c656374696f6e537461747573605d203d3d2060456c656374696f6e5374617475733a3a4f70656e285f29602e48536e617073686f744e6f6d696e61746f72730000445665633c543a3a4163636f756e7449643e040008650120536e617073686f74206f66206e6f6d696e61746f72732061742074686520626567696e6e696e67206f66207468652063757272656e7420656c656374696f6e2077696e646f772e20546869732073686f756c64206f6e6c791901206861766520612076616c7565207768656e205b60457261456c656374696f6e537461747573605d203d3d2060456c656374696f6e5374617475733a3a4f70656e285f29602e34517565756564456c65637465640000a8456c656374696f6e526573756c743c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e04000c650120546865206e6578742076616c696461746f72207365742e2041742074686520656e64206f6620616e206572612c206966207468697320697320617661696c61626c652028706f74656e7469616c6c792066726f6d20746865610120726573756c74206f6620616e206f6666636861696e20776f726b6572292c20697420697320696d6d6564696174656c7920757365642e204f74686572776973652c20746865206f6e2d636861696e20656c656374696f6e342069732065786563757465642e2c51756575656453636f7265000034456c656374696f6e53636f7265040004b0205468652073636f7265206f66207468652063757272656e74205b60517565756564456c6563746564605d2e44457261456c656374696f6e537461747573010078456c656374696f6e5374617475733c543a3a426c6f636b4e756d6265723e040008490120466c616720746f20636f6e74726f6c2074686520657865637574696f6e206f6620746865206f6666636861696e20656c656374696f6e2e205768656e20604f70656e285f29602c207765206163636570746c20736f6c7574696f6e7320746f206265207375626d69747465642e54497343757272656e7453657373696f6e46696e616c010010626f6f6c0400084d012054727565206966207468652063757272656e74202a2a706c616e6e65642a2a2073657373696f6e2069732066696e616c2e204e6f74652074686174207468697320646f6573206e6f742074616b65206572615820666f7263696e6720696e746f206163636f756e742e3853746f7261676556657273696f6e01002052656c6561736573040310cc2054727565206966206e6574776f726b20686173206265656e20757067726164656420746f20746869732076657273696f6e2e7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e00a020546869732069732073657420746f2076332e302e3020666f72206e6577206e6574776f726b732e016010626f6e640c28636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e1470617965657c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e5865012054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c8420626520746865206163636f756e74207468617420636f6e74726f6c732069742e003101206076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e00250120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e004020456d6974732060426f6e646564602e002c2023203c7765696768743ed4202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e20202d204f2831292e68202d20546872656520657874726120444220656e74726965732e005101204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e6564410120756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e4c202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2036372e383720c2b5732c204442205765696768743a3101202d20526561643a20426f6e6465642c204c65646765722c205b4f726967696e204163636f756e745d2c2043757272656e74204572612c20486973746f72792044657074682c204c6f636b73e0202d2057726974653a20426f6e6465642c2050617965652c205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572302023203c2f7765696768743e28626f6e645f657874726104386d61785f6164646974696f6e616c54436f6d706163743c42616c616e63654f663c543e3e5865012041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e63652075703420666f72207374616b696e672e00510120557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e650120556e6c696b65205b60626f6e64605d206f72205b60756e626f6e64605d20746869732066756e6374696f6e20646f6573206e6f7420696d706f736520616e79206c696d69746174696f6e206f6e2074686520616d6f756e744c20746861742063616e2062652061646465642e00610120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c657220616e64f82069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e004020456d6974732060426f6e646564602e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e20202d204f2831292e40202d204f6e6520444220656e7472792e34202d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2035342e383820c2b5732c204442205765696768743a1501202d20526561643a2045726120456c656374696f6e205374617475732c20426f6e6465642c204c65646765722c205b4f726967696e204163636f756e745d2c204c6f636b73a4202d2057726974653a205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572302023203c2f7765696768743e18756e626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e805501205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64010120706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e250120543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e004901204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665c0207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e003d01204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360293d012063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e656564fc20746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e004820456d6974732060556e626f6e646564602e00982053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e002c2023203c7765696768743e4101202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e6501202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e63656029710120202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652e5101202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c6564207669615c2020206077697468647261775f756e626f6e646564602e40202d204f6e6520444220656e7472792e2c202d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2035302e333420c2b5732c204442205765696768743a2901202d20526561643a2045726120456c656374696f6e205374617475732c204c65646765722c2043757272656e74204572612c204c6f636b732c205b4f726967696e204163636f756e745da4202d2057726974653a205b4f726967696e204163636f756e745d2c204c6f636b732c204c656467657228203c2f7765696768743e4477697468647261775f756e626f6e64656404486e756d5f736c617368696e675f7370616e730c753332782d012052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e003501205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4c2077686174657665722069742077616e74732e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e004c20456d697473206057697468647261776e602e006c2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e002c2023203c7765696768743e5501202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e45012020497420696d706c6965732060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c207768696368206973f42020696e6469726563746c7920757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e7901202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e40202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d090120436f6d706c6578697479204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2072656d6f7665342042617365205765696768743a74205570646174653a2035302e3532202b202e303238202a205320c2b5732501202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c2043757272656e74204572612c204c6f636b732c205b4f726967696e204163636f756e745da8202d205772697465733a205b4f726967696e204163636f756e745d2c204c6f636b732c204c656467657270204b696c6c3a2037392e3431202b20322e333636202a205320c2b5738501202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c2043757272656e74204572612c20426f6e6465642c20536c617368696e67205370616e732c205b4f726967696e204163636f756e745d2c204c6f636b73b101202d205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c205b4f726967696e204163636f756e745d2c204c6f636b7374202d2057726974657320456163683a205370616e536c617368202a20530d01204e4f54453a2057656967687420616e6e6f746174696f6e20697320746865206b696c6c207363656e6172696f2c20776520726566756e64206f74686572776973652e302023203c2f7765696768743e2076616c6964617465041470726566733856616c696461746f72507265667344e8204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e30202d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2031372e313320c2b5732c204442205765696768743a90202d20526561643a2045726120456c656374696f6e205374617475732c204c656467657280202d2057726974653a204e6f6d696e61746f72732c2056616c696461746f7273302023203c2f7765696768743e206e6f6d696e617465041c74617267657473a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e4c1101204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00510120456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546869732063616e206f6e6c792062652063616c6c6564207768656e8c205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743e3101202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f662060746172676574736020284e2901012077686963682069732063617070656420617420436f6d7061637441737369676e6d656e74733a3a4c494d495420284d41585f4e4f4d494e4154494f4e53292ed8202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e28202d2d2d2d2d2d2d2d2d842042617365205765696768743a2032322e3334202b202e3336202a204e20c2b57384207768657265204e20697320746865206e756d626572206f6620746172676574732c204442205765696768743ac8202d2052656164733a2045726120456c656374696f6e205374617475732c204c65646765722c2043757272656e742045726184202d205772697465733a2056616c696461746f72732c204e6f6d696e61746f7273302023203c2f7765696768743e146368696c6c0044c8204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e54202d20436f6e7461696e73206f6e6520726561642ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e24202d2d2d2d2d2d2d2d5c2042617365205765696768743a2031362e353320c2b5732c204442205765696768743a88202d20526561643a20457261456c656374696f6e5374617475732c204c656467657280202d2057726974653a2056616c696461746f72732c204e6f6d696e61746f7273302023203c2f7765696768743e247365745f7061796565041470617965657c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e40b8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e28202d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2031312e333320c2b57334202d204442205765696768743a4c20202020202d20526561643a204c65646765724c20202020202d2057726974653a205061796565302023203c2f7765696768743e387365745f636f6e74726f6c6c65720428636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654090202852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e2c202d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2032352e323220c2b5732c204442205765696768743af4202d20526561643a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c6572f8202d2057726974653a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c6572302023203c2f7765696768743e4c7365745f76616c696461746f725f636f756e74040c6e657730436f6d706163743c7533323e209420536574732074686520696465616c206e756d626572206f662076616c696461746f72732e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e5c2042617365205765696768743a20312e37313720c2b5735c2057726974653a2056616c696461746f7220436f756e74302023203c2f7765696768743e60696e6372656173655f76616c696461746f725f636f756e7404286164646974696f6e616c30436f6d706163743c7533323e20ac20496e6372656d656e74732074686520696465616c206e756d626572206f662076616c696461746f72732e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e5c2042617365205765696768743a20312e37313720c2b5737020526561642f57726974653a2056616c696461746f7220436f756e74302023203c2f7765696768743e547363616c655f76616c696461746f725f636f756e740418666163746f721c50657263656e7420d4205363616c652075702074686520696465616c206e756d626572206f662076616c696461746f7273206279206120666163746f722e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e5c2042617365205765696768743a20312e37313720c2b5737020526561642f57726974653a2056616c696461746f7220436f756e74302023203c2f7765696768743e34666f7263655f6e6f5f657261730024b020466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e64202d2042617365205765696768743a20312e38353720c2b57348202d2057726974653a20466f726365457261302023203c2f7765696768743e34666f7263655f6e65775f65726100284d0120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c206265a020726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e64202d2042617365205765696768743a20312e39353920c2b57344202d20577269746520466f726365457261302023203c2f7765696768743e447365745f696e76756c6e657261626c6573042876616c696461746f7273445665633c543a3a4163636f756e7449643e24cc20536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e1c202d204f28562990202d2042617365205765696768743a20322e323038202b202e303036202a205620c2b5735c202d2057726974653a20496e76756c6e657261626c6573302023203c2f7765696768743e34666f7263655f756e7374616b650814737461736830543a3a4163636f756e744964486e756d5f736c617368696e675f7370616e730c7533322c0d0120466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743eec204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2062652072656d6f7665648c2042617365205765696768743a2035332e3037202b20322e333635202a205320c2b573b82052656164733a20426f6e6465642c20536c617368696e67205370616e732c204163636f756e742c204c6f636b738501205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c204163636f756e742c204c6f636b736c2057726974657320456163683a205370616e536c617368202a2053302023203c2f7765696768743e50666f7263655f6e65775f6572615f616c776179730020050120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e60202d2042617365205765696768743a20322e303520c2b57348202d2057726974653a20466f726365457261302023203c2f7765696768743e5463616e63656c5f64656665727265645f736c617368080c65726120457261496e64657834736c6173685f696e6469636573205665633c7533323e38982043616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e00b42043616e2062652063616c6c6564206279207468652060543a3a536c61736843616e63656c4f726967696e602e00050120506172616d65746572733a2065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e002c2023203c7765696768743e5420436f6d706c65786974793a204f2855202b205329b82077697468205520756e6170706c69656420736c6173686573207765696768746564207769746820553d31303030d420616e64205320697320746865206e756d626572206f6620736c61736820696e646963657320746f2062652063616e63656c65642e74202d20426173653a2035383730202b2033342e3631202a205320c2b57368202d20526561643a20556e6170706c69656420536c61736865736c202d2057726974653a20556e6170706c69656420536c6173686573302023203c2f7765696768743e387061796f75745f7374616b657273083c76616c696461746f725f737461736830543a3a4163636f756e7449640c65726120457261496e64657864110120506179206f757420616c6c20746865207374616b65727320626568696e6420612073696e676c652076616c696461746f7220666f7220612073696e676c65206572612e004d01202d206076616c696461746f725f73746173686020697320746865207374617368206163636f756e74206f66207468652076616c696461746f722e205468656972206e6f6d696e61746f72732c20757020746f290120202060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602c2077696c6c20616c736f207265636569766520746865697220726577617264732e3501202d206065726160206d617920626520616e7920657261206265747765656e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e00590120546865206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e20416e79206163636f756e742063616e2063616c6c20746869732066756e6374696f6e2c206576656e20696678206974206973206e6f74206f6e65206f6620746865207374616b6572732e00010120546869732063616e206f6e6c792062652063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743e0101202d2054696d6520636f6d706c65786974793a206174206d6f7374204f284d61784e6f6d696e61746f72526577617264656450657256616c696461746f72292ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e30202d2d2d2d2d2d2d2d2d2d2d1d01204e20697320746865204e756d626572206f66207061796f75747320666f72207468652076616c696461746f722028696e636c7564696e67207468652076616c696461746f7229342042617365205765696768743a0101202d205265776172642044657374696e6174696f6e205374616b65643a20313130202b2035342e32202a204e20c2b57320284d656469616e20536c6f706573294101202d205265776172642044657374696e6174696f6e20436f6e74726f6c6c657220284372656174696e67293a20313230202b2034312e3935202a204e20c2b57320284d656469616e20536c6f706573292c204442205765696768743a2901202d20526561643a20457261456c656374696f6e5374617475732c2043757272656e744572612c20486973746f727944657074682c204572617356616c696461746f725265776172642c2d01202020202020202020457261735374616b657273436c69707065642c2045726173526577617264506f696e74732c204572617356616c696461746f725072656673202838206974656d73291101202d205265616420456163683a20426f6e6465642c204c65646765722c2050617965652c204c6f636b732c2053797374656d204163636f756e74202835206974656d7329d8202d20577269746520456163683a2053797374656d204163636f756e742c204c6f636b732c204c6564676572202833206974656d7329302023203c2f7765696768743e187265626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e3ce0205265626f6e64206120706f7274696f6e206f6620746865207374617368207363686564756c656420746f20626520756e6c6f636b65642e00550120546865206469737061746368206f726967696e206d757374206265207369676e65642062792074686520636f6e74726f6c6c65722c20616e642069742063616e206265206f6e6c792063616c6c6564207768656e8c205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743ed4202d2054696d6520636f6d706c65786974793a204f284c292c207768657265204c20697320756e6c6f636b696e67206368756e6b7394202d20426f756e64656420627920604d41585f554e4c4f434b494e475f4348554e4b53602ef4202d2053746f72616765206368616e6765733a2043616e277420696e6372656173652073746f726167652c206f6e6c792064656372656173652069742e40202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d98202d2042617365205765696768743a2033342e353120c2b573202a202e303438204c20c2b57334202d204442205765696768743a010120202020202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c204c6f636b732c205b4f726967696e204163636f756e745db820202020202d205772697465733a205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572302023203c2f7765696768743e447365745f686973746f72795f646570746808446e65775f686973746f72795f646570746844436f6d706163743c457261496e6465783e485f6572615f6974656d735f64656c6574656430436f6d706163743c7533323e543101205365742060486973746f72794465707468602076616c75652e20546869732066756e6374696f6e2077696c6c2064656c65746520616e7920686973746f727920696e666f726d6174696f6e80207768656e2060486973746f727944657074686020697320726564756365642e003020506172616d65746572733a1101202d20606e65775f686973746f72795f6465707468603a20546865206e657720686973746f727920646570746820796f7520776f756c64206c696b6520746f207365742e4901202d20606572615f6974656d735f64656c65746564603a20546865206e756d626572206f66206974656d7320746861742077696c6c2062652064656c6574656420627920746869732064697370617463682e450120202020546869732073686f756c64207265706f727420616c6c207468652073746f72616765206974656d7320746861742077696c6c2062652064656c6574656420627920636c656172696e67206f6c6445012020202065726120686973746f72792e204e656564656420746f207265706f727420616e2061636375726174652077656967687420666f72207468652064697370617463682e2054727573746564206279a02020202060526f6f746020746f207265706f727420616e206163637572617465206e756d6265722e0054204f726967696e206d75737420626520726f6f742e002c2023203c7765696768743ee0202d20453a204e756d626572206f6620686973746f7279206465707468732072656d6f7665642c20692e652e203130202d3e2037203d203374202d2042617365205765696768743a2032392e3133202a204520c2b57334202d204442205765696768743aa020202020202d2052656164733a2043757272656e74204572612c20486973746f72792044657074687020202020202d205772697465733a20486973746f7279204465707468310120202020202d20436c6561722050726566697820456163683a20457261205374616b6572732c204572615374616b657273436c69707065642c204572617356616c696461746f725072656673810120202020202d2057726974657320456163683a204572617356616c696461746f725265776172642c2045726173526577617264506f696e74732c2045726173546f74616c5374616b652c2045726173537461727453657373696f6e496e646578302023203c2f7765696768743e28726561705f73746173680814737461736830543a3a4163636f756e744964486e756d5f736c617368696e675f7370616e730c7533324039012052656d6f766520616c6c20646174612073747275637475726520636f6e6365726e696e672061207374616b65722f7374617368206f6e6365206974732062616c616e6365206973207a65726f2e6101205468697320697320657373656e7469616c6c79206571756976616c656e7420746f206077697468647261775f756e626f6e64656460206578636570742069742063616e2062652063616c6c656420627920616e796f6e65c020616e6420746865207461726765742060737461736860206d7573742068617665206e6f2066756e6473206c6566742e009020546869732063616e2062652063616c6c65642066726f6d20616e79206f726967696e2e000101202d20607374617368603a20546865207374617368206163636f756e7420746f20726561702e204974732062616c616e6365206d757374206265207a65726f2e002c2023203c7765696768743e250120436f6d706c65786974793a204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e73206f6e20746865206163636f756e742e8c2042617365205765696768743a2037352e3934202b20322e333936202a205320c2b5732c204442205765696768743ad8202d2052656164733a205374617368204163636f756e742c20426f6e6465642c20536c617368696e67205370616e732c204c6f636b73a501202d205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c205374617368204163636f756e742c204c6f636b7374202d2057726974657320456163683a205370616e536c617368202a2053302023203c2f7765696768743e607375626d69745f656c656374696f6e5f736f6c7574696f6e141c77696e6e6572734c5665633c56616c696461746f72496e6465783e1c636f6d7061637448436f6d7061637441737369676e6d656e74731473636f726534456c656374696f6e53636f72650c65726120457261496e6465781073697a6530456c656374696f6e53697a65bce4205375626d697420616e20656c656374696f6e20726573756c7420746f2074686520636861696e2e2049662074686520736f6c7574696f6e3a003420312e2069732076616c69642e150120322e206861732061206265747465722073636f7265207468616e206120706f74656e7469616c6c79206578697374696e6720736f6c7574696f6e206f6e20636861696e2e0084207468656e2c2069742077696c6c206265205f7075745f206f6e20636861696e2e00ac204120736f6c7574696f6e20636f6e7369737473206f662074776f20706965636573206f6620646174613a00f420312e206077696e6e657273603a206120666c617420766563746f72206f6620616c6c207468652077696e6e657273206f662074686520726f756e642e510120322e206061737369676e6d656e7473603a2074686520636f6d706163742076657273696f6e206f6620616e2061737369676e6d656e7420766563746f72207468617420656e636f6465732074686520656467653020202020776569676874732e00210120426f7468206f66207768696368206d617920626520636f6d7075746564207573696e67205f70687261676d656e5f2c206f7220616e79206f7468657220616c676f726974686d2e00a8204164646974696f6e616c6c792c20746865207375626d6974746572206d7573742070726f766964653a00c8202d20546865206073636f7265602074686174207468657920636c61696d20746865697220736f6c7574696f6e206861732e004d0120426f74682076616c696461746f727320616e64206e6f6d696e61746f72732077696c6c20626520726570726573656e74656420627920696e646963657320696e2074686520736f6c7574696f6e2e205468651d0120696e64696365732073686f756c6420726573706563742074686520636f72726573706f6e64696e6720747970657320285b6056616c696461746f72496e646578605d20616e643101205b604e6f6d696e61746f72496e646578605d292e204d6f72656f7665722c20746865792073686f756c642062652076616c6964207768656e207573656420746f20696e64657820696e746f5101205b60536e617073686f7456616c696461746f7273605d20616e64205b60536e617073686f744e6f6d696e61746f7273605d2e20416e7920696e76616c696420696e6465782077696c6c20636175736520746865610120736f6c7574696f6e20746f2062652072656a65637465642e2054686573652074776f2073746f72616765206974656d73206172652073657420647572696e672074686520656c656374696f6e2077696e646f7720616e6498206d6179206265207573656420746f2064657465726d696e652074686520696e64696365732e0060204120736f6c7574696f6e2069732076616c69642069663a00e420302e204974206973207375626d6974746564207768656e205b60457261456c656374696f6e537461747573605d20697320604f70656e602ef820312e2049747320636c61696d65642073636f726520697320657175616c20746f207468652073636f726520636f6d7075746564206f6e2d636861696e2eac20322e2050726573656e74732074686520636f7272656374206e756d626572206f662077696e6e6572732e550120332e20416c6c20696e6465786573206d7573742062652076616c7565206163636f7264696e6720746f2074686520736e617073686f7420766563746f72732e20416c6c20656467652076616c756573206d7573745d0120202020616c736f20626520636f727265637420616e642073686f756c64206e6f74206f766572666c6f7720746865206772616e756c6172697479206f662074686520726174696f20747970652028692e652e2032353640202020206f722062696c6c696f6e292e0d0120342e20466f72206561636820656467652c20616c6c2074617267657473206172652061637475616c6c79206e6f6d696e617465642062792074686520766f7465722e6c20352e2048617320636f72726563742073656c662d766f7465732e00c0204120736f6c7574696f6e732073636f726520697320636f6e736973746564206f66203320706172616d65746572733a00650120312e20606d696e207b20737570706f72742e746f74616c207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c64206265206d6178696d697a65642e650120322e206073756d207b20737570706f72742e746f74616c207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c64206265206d696e696d697a65642e410120332e206073756d207b20737570706f72742e746f74616c5e32207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c642062659c202020206d696e696d697a65642028746f20656e73757265206c6573732076617269616e636529002c2023203c7765696768743e7020536565206063726174653a3a77656967687460206d6f64756c652e302023203c2f7765696768743e847375626d69745f656c656374696f6e5f736f6c7574696f6e5f756e7369676e6564141c77696e6e6572734c5665633c56616c696461746f72496e6465783e1c636f6d7061637448436f6d7061637441737369676e6d656e74731473636f726534456c656374696f6e53636f72650c65726120457261496e6465781073697a6530456c656374696f6e53697a6524c020556e7369676e65642076657273696f6e206f6620607375626d69745f656c656374696f6e5f736f6c7574696f6e602e005d01204e6f746520746861742074686973206d757374207061737320746865205b6056616c6964617465556e7369676e6564605d20636865636b207768696368206f6e6c7920616c6c6f7773207472616e73616374696f6e7361012066726f6d20746865206c6f63616c206e6f646520746f20626520696e636c756465642e20496e206f7468657220776f7264732c206f6e6c792074686520626c6f636b20617574686f722063616e20696e636c756465206168207472616e73616374696f6e20696e2074686520626c6f636b2e002c2023203c7765696768743e7020536565206063726174653a3a77656967687460206d6f64756c652e302023203c2f7765696768743e0124244572615061796f75740c20457261496e6465781c42616c616e63651c42616c616e63650c59012054686520657261207061796f757420686173206265656e207365743b207468652066697273742062616c616e6365206973207468652076616c696461746f722d7061796f75743b20746865207365636f6e64206973c4207468652072656d61696e6465722066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642ea4205b6572615f696e6465782c2076616c696461746f725f7061796f75742c2072656d61696e6465725d1852657761726408244163636f756e7449641c42616c616e636504f420546865207374616b657220686173206265656e207265776172646564206279207468697320616d6f756e742e205b73746173682c20616d6f756e745d14536c61736808244163636f756e7449641c42616c616e6365082501204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e50205b76616c696461746f722c20616d6f756e745d684f6c64536c617368696e675265706f7274446973636172646564043053657373696f6e496e646578081d0120416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c6488206e6f742062652070726f6365737365642e205b73657373696f6e5f696e6465785d3c5374616b696e67456c656374696f6e043c456c656374696f6e436f6d7075746504ec2041206e657720736574206f66207374616b6572732077617320656c656374656420776974682074686520676976656e205b636f6d707574655d2e38536f6c7574696f6e53746f726564043c456c656374696f6e436f6d707574650411012041206e657720736f6c7574696f6e20666f7220746865207570636f6d696e6720656c656374696f6e20686173206265656e2073746f7265642e205b636f6d707574655d18426f6e64656408244163636f756e7449641c42616c616e636510cc20416e206163636f756e742068617320626f6e646564207468697320616d6f756e742e205b73746173682c20616d6f756e745d005101204e4f54453a2054686973206576656e74206973206f6e6c7920656d6974746564207768656e2066756e64732061726520626f6e64656420766961206120646973706174636861626c652e204e6f7461626c792c25012069742077696c6c206e6f7420626520656d697474656420666f72207374616b696e672072657761726473207768656e20746865792061726520616464656420746f207374616b652e20556e626f6e64656408244163636f756e7449641c42616c616e636504d420416e206163636f756e742068617320756e626f6e646564207468697320616d6f756e742e205b73746173682c20616d6f756e745d2457697468647261776e08244163636f756e7449641c42616c616e6365085d0120416e206163636f756e74206861732063616c6c6564206077697468647261775f756e626f6e6465646020616e642072656d6f76656420756e626f6e64696e67206368756e6b7320776f727468206042616c616e636560a82066726f6d2074686520756e6c6f636b696e672071756575652e205b73746173682c20616d6f756e745d1c3853657373696f6e735065724572613053657373696f6e496e64657810060000000470204e756d626572206f662073657373696f6e7320706572206572612e3c426f6e64696e674475726174696f6e20457261496e64657810a002000004e4204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e48536c61736844656665724475726174696f6e20457261496e64657810a8000000140101204e756d626572206f662065726173207468617420736c6173686573206172652064656665727265642062792c20616674657220636f6d7075746174696f6e2e00bc20546869732073686f756c64206265206c657373207468616e2074686520626f6e64696e67206475726174696f6e2e2d012053657420746f203020696620736c61736865732073686f756c64206265206170706c69656420696d6d6564696174656c792c20776974686f7574206f70706f7274756e69747920666f723820696e74657276656e74696f6e2e44456c656374696f6e4c6f6f6b616865616438543a3a426c6f636b4e756d62657210320000001c710120546865206e756d626572206f6620626c6f636b73206265666f72652074686520656e64206f6620746865206572612066726f6d20776869636820656c656374696f6e207375626d697373696f6e732061726520616c6c6f7765642e006d012053657474696e67207468697320746f207a65726f2077696c6c2064697361626c6520746865206f6666636861696e20636f6d7075746520616e64206f6e6c79206f6e2d636861696e207365712d70687261676d656e2077696c6c2420626520757365642e007501205468697320697320626f756e646564206279206265696e672077697468696e20746865206c6173742073657373696f6e2e2048656e63652c2073657474696e6720697420746f20612076616c7565206d6f7265207468616e207468659c206c656e677468206f6620612073657373696f6e2077696c6c20626520706f696e746c6573732e344d6178497465726174696f6e730c753332100a0000000c2901204d6178696d756d206e756d626572206f662062616c616e63696e6720697465726174696f6e7320746f2072756e20696e20746865206f6666636861696e207375626d697373696f6e2e00ec2049662073657420746f20302c2062616c616e63655f736f6c7574696f6e2077696c6c206e6f7420626520657865637574656420617420616c6c2e504d696e536f6c7574696f6e53636f726542756d701c50657262696c6c1020a1070004610120546865207468726573686f6c64206f6620696d70726f76656d656e7420746861742073686f756c642062652070726f766964656420666f722061206e657720736f6c7574696f6e20746f2062652061636365707465642e804d61784e6f6d696e61746f72526577617264656450657256616c696461746f720c753332104000000010f820546865206d6178696d756d206e756d626572206f66206e6f6d696e61746f727320726577617264656420666f7220656163682076616c696461746f722e00690120466f7220656163682076616c696461746f72206f6e6c79207468652060244d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732063616e20636c61696d2101207468656972207265776172642e2054686973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e7c344e6f74436f6e74726f6c6c65720468204e6f74206120636f6e74726f6c6c6572206163636f756e742e204e6f7453746173680454204e6f742061207374617368206163636f756e742e34416c7265616479426f6e646564046420537461736820697320616c726561647920626f6e6465642e34416c7265616479506169726564047820436f6e74726f6c6c657220697320616c7265616479207061697265642e30456d70747954617267657473046420546172676574732063616e6e6f7420626520656d7074792e384475706c6963617465496e6465780444204475706c696361746520696e6465782e44496e76616c6964536c617368496e646578048820536c617368207265636f726420696e646578206f7574206f6620626f756e64732e44496e73756666696369656e7456616c756504cc2043616e206e6f7420626f6e6420776974682076616c7565206c657373207468616e206d696e696d756d2062616c616e63652e304e6f4d6f72654368756e6b7304942043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e344e6f556e6c6f636b4368756e6b04a42043616e206e6f74207265626f6e6420776974686f757420756e6c6f636b696e67206368756e6b732e3046756e64656454617267657404cc20417474656d7074696e6720746f2074617267657420612073746173682074686174207374696c6c206861732066756e64732e48496e76616c6964457261546f526577617264045c20496e76616c69642065726120746f207265776172642e68496e76616c69644e756d6265724f664e6f6d696e6174696f6e73047c20496e76616c6964206e756d626572206f66206e6f6d696e6174696f6e732e484e6f74536f72746564416e64556e697175650484204974656d7320617265206e6f7420736f7274656420616e6420756e697175652e38416c7265616479436c61696d6564040d01205265776172647320666f72207468697320657261206861766520616c7265616479206265656e20636c61696d656420666f7220746869732076616c696461746f722e7c4f6666636861696e456c656374696f6e4561726c795375626d697373696f6e04e420546865207375626d697474656420726573756c74206973207265636569766564206f7574206f6620746865206f70656e2077696e646f772e784f6666636861696e456c656374696f6e5765616b5375626d697373696f6e04010120546865207375626d697474656420726573756c74206973206e6f7420617320676f6f6420617320746865206f6e652073746f726564206f6e20636861696e2e4c536e617073686f74556e617661696c61626c6504d02054686520736e617073686f742064617461206f66207468652063757272656e742077696e646f77206973206d697373696e672e804f6666636861696e456c656374696f6e426f67757357696e6e6572436f756e7404b020496e636f7272656374206e756d626572206f662077696e6e65727320776572652070726573656e7465642e6c4f6666636861696e456c656374696f6e426f67757357696e6e6572086101204f6e65206f6620746865207375626d69747465642077696e6e657273206973206e6f7420616e206163746976652063616e646964617465206f6e20636861696e2028696e646578206973206f7574206f662072616e67653820696e20736e617073686f74292e704f6666636861696e456c656374696f6e426f677573436f6d70616374085d01204572726f72207768696c65206275696c64696e67207468652061737369676e6d656e7420747970652066726f6d2074686520636f6d706163742e20546869732063616e2068617070656e20696620616e20696e646578a820697320696e76616c69642c206f72206966207468652077656967687473205f6f766572666c6f775f2e784f6666636861696e456c656374696f6e426f6775734e6f6d696e61746f72041501204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f7273206973206e6f7420616e20616374697665206e6f6d696e61746f72206f6e20636861696e2e7c4f6666636861696e456c656374696f6e426f6775734e6f6d696e6174696f6e044d01204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f72732068617320616e206564676520746f20776869636820746865792068617665206e6f7420766f746564206f6e20636861696e2e844f6666636861696e456c656374696f6e536c61736865644e6f6d696e6174696f6e086101204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f72732068617320616e2065646765207768696368206973207375626d6974746564206265666f726520746865206c617374206e6f6e2d7a65726f5420736c617368206f6620746865207461726765742e744f6666636861696e456c656374696f6e426f67757353656c66566f746504250120412073656c6620766f7465206d757374206f6e6c79206265206f726967696e617465642066726f6d20612076616c696461746f7220746f204f4e4c59207468656d73656c7665732e644f6666636861696e456c656374696f6e426f6775734564676504450120546865207375626d697474656420726573756c742068617320756e6b6e6f776e206564676573207468617420617265206e6f7420616d6f6e67207468652070726573656e7465642077696e6e6572732e684f6666636861696e456c656374696f6e426f67757353636f72650419012054686520636c61696d65642073636f726520646f6573206e6f74206d61746368207769746820746865206f6e6520636f6d70757465642066726f6d2074686520646174612e844f6666636861696e456c656374696f6e426f677573456c656374696f6e53697a6504782054686520656c656374696f6e2073697a6520697320696e76616c69642e3843616c6c4e6f74416c6c6f776564044901205468652063616c6c206973206e6f7420616c6c6f7765642061742074686520676976656e2074696d652064756520746f207265737472696374696f6e73206f6620656c656374696f6e20706572696f642e54496e636f7272656374486973746f7279446570746804c420496e636f72726563742070726576696f757320686973746f727920646570746820696e7075742070726f76696465642e58496e636f7272656374536c617368696e675370616e7304b420496e636f7272656374206e756d626572206f6620736c617368696e67207370616e732070726f76696465642e081c53657373696f6e011c53657373696f6e1c2856616c696461746f727301004c5665633c543a3a56616c696461746f7249643e0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e64657801003053657373696f6e496e646578100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e676564010010626f6f6c040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b6579730100785665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e0400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f72730100205665633c7533323e04000c8020496e6469636573206f662064697361626c65642076616c696461746f72732e003501205468652073657420697320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e732061206e657720736574206f66206964656e7469746965732e204e6578744b65797300010538543a3a56616c696461746f7249641c543a3a4b657973000400049c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e204b65794f776e657200010550284b65795479706549642c205665633c75383e2938543a3a56616c696461746f72496400040004090120546865206f776e6572206f662061206b65792e20546865206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e0108207365745f6b65797308106b6579731c543a3a4b6579731470726f6f661c5665633c75383e38e82053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b657973602e210120416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec4205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d420546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960590120202041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642ef0202d20446252656164733a20606f726967696e206163636f756e74602c2060543a3a56616c696461746f7249644f66602c20604e6578744b65797360a4202d2044625772697465733a20606f726967696e206163636f756e74602c20604e6578744b6579736084202d204462526561647320706572206b65792069643a20604b65794f776e65726088202d20446257726974657320706572206b65792069643a20604b65794f776e657260302023203c2f7765696768743e2870757267655f6b6579730030cc2052656d6f76657320616e792073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c65722ec4205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d420546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002c2023203c7765696768743eb4202d20436f6d706c65786974793a20604f2831296020696e206e756d626572206f66206b65792074797065732e590120202041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642ef0202d20446252656164733a2060543a3a56616c696461746f7249644f66602c20604e6578744b657973602c20606f726967696e206163636f756e7460a4202d2044625772697465733a20604e6578744b657973602c20606f726967696e206163636f756e74608c202d20446257726974657320706572206b65792069643a20604b65794f776e64657260302023203c2f7765696768743e0104284e657753657373696f6e043053657373696f6e496e646578085d01204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e7420697320746865205b73657373696f6e5f696e6465785d2c206e6f742074686520626c6f636b88206e756d626572206173207468652074797065206d6967687420737567676573742e001030496e76616c696450726f6f66046420496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f72496404a0204e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b657904682052656769737465726564206475706c6963617465206b65792e184e6f4b65797304a8204e6f206b65797320617265206173736f63696174656420776974682074686973206163636f756e742e092444656d6f6372616379012444656d6f6372616379383c5075626c696350726f70436f756e7401002450726f70496e646578100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f707301009c5665633c2850726f70496e6465782c20543a3a486173682c20543a3a4163636f756e744964293e040004210120546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865207365636f6e64206974656d206973207468652070726f706f73616c277320686173682e244465706f7369744f660001052450726f70496e64657884285665633c543a3a4163636f756e7449643e2c2042616c616e63654f663c543e290004000c842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e00d82054574f582d4e4f54453a20536166652c20617320696e6372656173696e6720696e7465676572206b6579732061726520736166652e24507265696d616765730001061c543a3a48617368e8507265696d6167655374617475733c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e000400086101204d6170206f662068617368657320746f207468652070726f706f73616c20707265696d6167652c20616c6f6e6720776974682077686f207265676973746572656420697420616e64207468656972206465706f7369742ee42054686520626c6f636b206e756d6265722069732074686520626c6f636b20617420776869636820697420776173206465706f73697465642e3c5265666572656e64756d436f756e7401003c5265666572656e64756d496e646578100000000004310120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e344c6f77657374556e62616b656401003c5265666572656e64756d496e646578100000000008250120546865206c6f77657374207265666572656e64756d20696e64657820726570726573656e74696e6720616e20756e62616b6564207265666572656e64756d2e20457175616c20746fdc20605265666572656e64756d436f756e74602069662074686572652069736e2774206120756e62616b6564207265666572656e64756d2e405265666572656e64756d496e666f4f660001053c5265666572656e64756d496e646578d45265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a486173682c2042616c616e63654f663c543e3e0004000cb420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e0009012054574f582d4e4f54453a205341464520617320696e646578657320617265206e6f7420756e64657220616e2061747461636b6572e280997320636f6e74726f6c2e20566f74696e674f6601010530543a3a4163636f756e744964c8566f74696e673c42616c616e63654f663c543e2c20543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265723e00d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105d0120416c6c20766f74657320666f72206120706172746963756c617220766f7465722e2057652073746f7265207468652062616c616e636520666f7220746865206e756d626572206f6620766f74657320746861742077655d012068617665207265636f726465642e20546865207365636f6e64206974656d2069732074686520746f74616c20616d6f756e74206f662064656c65676174696f6e732c20746861742077696c6c2062652061646465642e00e82054574f582d4e4f54453a205341464520617320604163636f756e7449646073206172652063727970746f2068617368657320616e797761792e144c6f636b7300010530543a3a4163636f756e74496438543a3a426c6f636b4e756d626572000400105d01204163636f756e747320666f7220776869636820746865726520617265206c6f636b7320696e20616374696f6e207768696368206d61792062652072656d6f76656420617420736f6d6520706f696e7420696e207468655101206675747572652e205468652076616c75652069732074686520626c6f636b206e756d62657220617420776869636820746865206c6f636b206578706972657320616e64206d61792062652072656d6f7665642e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e544c6173745461626c656457617345787465726e616c010010626f6f6c0400085901205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c6963282070726f706f73616c2e304e65787445787465726e616c00006028543a3a486173682c20566f74655468726573686f6c6429040010590120546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e550120546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743aa4202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f7268202d20605075626c696350726f70736020697320656d7074792e24426c61636b6c6973740001061c543a3a486173688c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e290004000851012041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d626572e82028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e3443616e63656c6c6174696f6e730101061c543a3a4861736810626f6f6c000400042901205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e3853746f7261676556657273696f6e00002052656c656173657304000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e0098204e6577206e6574776f726b732073746172742077697468206c6173742076657273696f6e2e015c1c70726f706f7365083470726f706f73616c5f686173681c543a3a486173681476616c756554436f6d706163743c42616c616e63654f663c543e3e3ca02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e00190120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573748420686176652066756e647320746f20636f76657220746865206465706f7369742e00d8202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20707265696d6167652e1901202d206076616c7565603a2054686520616d6f756e74206f66206465706f73697420286d757374206265206174206c6561737420604d696e696d756d4465706f73697460292e004820456d697473206050726f706f736564602e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960b4202d2044622072656164733a20605075626c696350726f70436f756e74602c20605075626c696350726f707360ec202d204462207772697465733a20605075626c696350726f70436f756e74602c20605075626c696350726f7073602c20604465706f7369744f6660302023203c2f7765696768743e187365636f6e64082070726f706f73616c48436f6d706163743c50726f70496e6465783e4c7365636f6e64735f75707065725f626f756e6430436f6d706163743c7533323e38b8205369676e616c732061677265656d656e742077697468206120706172746963756c61722070726f706f73616c2e00050120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e6465721501206d75737420686176652066756e647320746f20636f76657220746865206465706f7369742c20657175616c20746f20746865206f726967696e616c206465706f7369742e00cc202d206070726f706f73616c603a2054686520696e646578206f66207468652070726f706f73616c20746f207365636f6e642e4501202d20607365636f6e64735f75707065725f626f756e64603a20616e20757070657220626f756e64206f6e207468652063757272656e74206e756d626572206f66207365636f6e6473206f6e2074686973290120202070726f706f73616c2e2045787472696e736963206973207765696768746564206163636f7264696e6720746f20746869732076616c75652077697468206e6f20726566756e642e002c2023203c7765696768743e3901202d20436f6d706c65786974793a20604f28532960207768657265205320697320746865206e756d626572206f66207365636f6e647320612070726f706f73616c20616c7265616479206861732e60202d2044622072656164733a20604465706f7369744f666064202d204462207772697465733a20604465706f7369744f6660302023203c2f7765696768743e10766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f7465644163636f756e74566f74653c42616c616e63654f663c543e3e38350120566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bbc206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00e0202d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f20766f746520666f722e88202d2060766f7465603a2054686520766f746520636f6e66696775726174696f6e2e002c2023203c7765696768743e4901202d20436f6d706c65786974793a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722068617320766f746564206f6e2ea42020207765696768742069732063686172676564206173206966206d6178696d756d20766f7465732ef4202d2044622072656164733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f66602c206062616c616e636573206c6f636b7360f8202d204462207772697465733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f66602c206062616c616e636573206c6f636b7360302023203c2f7765696768743e40656d657267656e63795f63616e63656c04247265665f696e6465783c5265666572656e64756d496e646578305101205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d6530207265666572656e64756d2e00fc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206043616e63656c6c6174696f6e4f726967696e602e00d4202d607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e002c2023203c7765696768743e58202d20436f6d706c65786974793a20604f283129602ec0202d2044622072656164733a20605265666572656e64756d496e666f4f66602c206043616e63656c6c6174696f6e7360c4202d204462207772697465733a20605265666572656e64756d496e666f4f66602c206043616e63656c6c6174696f6e7360302023203c2f7765696768743e4065787465726e616c5f70726f706f7365043470726f706f73616c5f686173681c543a3a48617368343101205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c30207265666572656e64756d2e00ec20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206045787465726e616c4f726967696e602e00d8202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e002c2023203c7765696768743e2d01202d20436f6d706c657869747920604f2856296020776974682056206e756d626572206f66207665746f65727320696e2074686520626c61636b6c697374206f662070726f706f73616c2ebc2020204465636f64696e6720766563206f66206c656e67746820562e2043686172676564206173206d6178696d756da0202d2044622072656164733a20604e65787445787465726e616c602c2060426c61636b6c6973746070202d204462207772697465733a20604e65787445787465726e616c60302023203c2f7765696768743e6465787465726e616c5f70726f706f73655f6d616a6f72697479043470726f706f73616c5f686173681c543a3a48617368385901205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c656020616e2065787465726e616c207265666572656e64756d2e00f020546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c4d616a6f726974794f726967696e602e00d8202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f283129606c202d2044622077726974653a20604e65787445787465726e616c60302023203c2f7765696768743e6065787465726e616c5f70726f706f73655f64656661756c74043470726f706f73616c5f686173681c543a3a48617368384901205363686564756c652061206e656761746976652d7475726e6f75742d62696173207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f84207363686564756c6520616e2065787465726e616c207265666572656e64756d2e00ec20546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c44656661756c744f726967696e602e00d8202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f283129606c202d2044622077726974653a20604e65787445787465726e616c60302023203c2f7765696768743e28666173745f747261636b0c3470726f706f73616c5f686173681c543a3a4861736834766f74696e675f706572696f6438543a3a426c6f636b4e756d6265721464656c617938543a3a426c6f636b4e756d626572505101205363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564650120696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e65ec20627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e00d420546865206469737061746368206f6620746869732063616c6c206d757374206265206046617374547261636b4f726967696e602e00f8202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e6101202d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e20496e6372656173656420746f982020206046617374547261636b566f74696e67506572696f646020696620746f6f206c6f772e5501202d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265bc202020656e61637465642e205468697320646f65736e277420686176652061206d696e696d756d20616d6f756e742e004420456d697473206053746172746564602e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960b8202d2044622072656164733a20604e65787445787465726e616c602c20605265666572656e64756d436f756e74600d01202d204462207772697465733a20604e65787445787465726e616c602c20605265666572656e64756d436f756e74602c20605265666572656e64756d496e666f4f666060202d2042617365205765696768743a2033302e3120c2b573302023203c2f7765696768743e347665746f5f65787465726e616c043470726f706f73616c5f686173681c543a3a4861736838bc205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e00dc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d75737420626520605665746f4f726967696e602e003101202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c20746f207665746f20616e6420626c61636b6c6973742e004020456d69747320605665746f6564602e002c2023203c7765696768743e1901202d20436f6d706c65786974793a20604f2856202b206c6f6728562929602077686572652056206973206e756d626572206f6620606578697374696e67207665746f657273604501202020506572666f726d7320612062696e61727920736561726368206f6e20606578697374696e675f7665746f657273602077686963682073686f756c64206e6f742062652076657279206c617267652ea0202d2044622072656164733a20604e65787445787465726e616c602c2060426c61636b6c69737460a4202d204462207772697465733a20604e65787445787465726e616c602c2060426c61636b6c69737460302023203c2f7765696768743e4463616e63656c5f7265666572656e64756d04247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e28542052656d6f76652061207265666572656e64756d2e00c420546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e00d8202d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e002c2023203c7765696768743e58202d20436f6d706c65786974793a20604f283129602e80202d204462207772697465733a20605265666572656e64756d496e666f4f6660302023203c2f7765696768743e3463616e63656c5f717565756564041477686963683c5265666572656e64756d496e6465782ca02043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e00c420546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e00c8202d20607768696368603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e002c2023203c7765696768743e3501202d20604f284429602077686572652060446020697320746865206974656d7320696e207468652064697370617463682071756575652e205765696768746564206173206044203d203130602ec8202d2044622072656164733a20607363686564756c6572206c6f6f6b7570602c207363686564756c6572206167656e646160cc202d204462207772697465733a20607363686564756c6572206c6f6f6b7570602c207363686564756c6572206167656e646160302023203c2f7765696768743e2064656c65676174650c08746f30543a3a4163636f756e74496428636f6e76696374696f6e28436f6e76696374696f6e1c62616c616e63653042616c616e63654f663c543e683d012044656c65676174652074686520766f74696e6720706f77657220287769746820736f6d6520676976656e20636f6e76696374696f6e29206f66207468652073656e64696e67206163636f756e742e005901205468652062616c616e63652064656c656761746564206973206c6f636b656420666f72206173206c6f6e6720617320697427732064656c6567617465642c20616e64207468657265616674657220666f7220746865cc2074696d6520617070726f70726961746520666f722074686520636f6e76696374696f6e2773206c6f636b20706572696f642e00610120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e696e67206163636f756e74206d757374206569746865723a782020202d2062652064656c65676174696e6720616c72656164793b206f725d012020202d2068617665206e6f20766f74696e67206163746976697479202869662074686572652069732c207468656e2069742077696c6c206e65656420746f2062652072656d6f7665642f636f6e736f6c6964617465649820202020207468726f7567682060726561705f766f746560206f722060756e766f746560292e004901202d2060746f603a20546865206163636f756e742077686f736520766f74696e6720746865206074617267657460206163636f756e74277320766f74696e6720706f7765722077696c6c20666f6c6c6f772e5901202d2060636f6e76696374696f6e603a2054686520636f6e76696374696f6e20746861742077696c6c20626520617474616368656420746f207468652064656c65676174656420766f7465732e205768656e2074686545012020206163636f756e7420697320756e64656c6567617465642c207468652066756e64732077696c6c206265206c6f636b656420666f722074686520636f72726573706f6e64696e6720706572696f642e5501202d206062616c616e6365603a2054686520616d6f756e74206f6620746865206163636f756e7427732062616c616e636520746f206265207573656420696e2064656c65676174696e672e2054686973206d757374c82020206e6f74206265206d6f7265207468616e20746865206163636f756e7427732063757272656e742062616c616e63652e004c20456d697473206044656c656761746564602e002c2023203c7765696768743e5901202d20436f6d706c65786974793a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173cc202020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732ec4202d2044622072656164733a20332a60566f74696e674f66602c20606f726967696e206163636f756e74206c6f636b7360c8202d204462207772697465733a20332a60566f74696e674f66602c20606f726967696e206163636f756e74206c6f636b7360a4202d2044622072656164732070657220766f7465733a20605265666572656e64756d496e666f4f6660a8202d204462207772697465732070657220766f7465733a20605265666572656e64756d496e666f4f6660302023203c2f7765696768743e28756e64656c65676174650048d020556e64656c65676174652074686520766f74696e6720706f776572206f66207468652073656e64696e67206163636f756e742e00610120546f6b656e73206d617920626520756e6c6f636b656420666f6c6c6f77696e67206f6e636520616e20616d6f756e74206f662074696d6520636f6e73697374656e74207769746820746865206c6f636b20706572696f64e0206f662074686520636f6e76696374696f6e2077697468207768696368207468652064656c65676174696f6e20776173206973737565642e00490120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265582063757272656e746c792064656c65676174696e672e005420456d6974732060556e64656c656761746564602e002c2023203c7765696768743e5901202d20436f6d706c65786974793a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173cc202020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732e64202d2044622072656164733a20322a60566f74696e674f666068202d204462207772697465733a20322a60566f74696e674f6660a4202d2044622072656164732070657220766f7465733a20605265666572656e64756d496e666f4f6660a8202d204462207772697465732070657220766f7465733a20605265666572656e64756d496e666f4f6660302023203c2f7765696768743e58636c6561725f7075626c69635f70726f706f73616c7300207420436c6561727320616c6c207075626c69632070726f706f73616c732e00c420546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e002c2023203c7765696768743e28202d20604f283129602e6c202d204462207772697465733a20605075626c696350726f707360302023203c2f7765696768743e346e6f74655f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e3861012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e205468697320646f65736e27742072657175697265207468652070726f706f73616c20746f206265250120696e207468652064697370617463682071756575652062757420646f657320726571756972652061206465706f7369742c2072657475726e6564206f6e636520656e61637465642e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00c8202d2060656e636f6465645f70726f706f73616c603a2054686520707265696d616765206f6620612070726f706f73616c2e005c20456d6974732060507265696d6167654e6f746564602e002c2023203c7765696768743e6901202d20436f6d706c65786974793a20604f28452960207769746820452073697a65206f662060656e636f6465645f70726f706f73616c60202870726f7465637465642062792061207265717569726564206465706f736974292e60202d2044622072656164733a2060507265696d616765736064202d204462207772697465733a2060507265696d6167657360302023203c2f7765696768743e646e6f74655f707265696d6167655f6f7065726174696f6e616c0440656e636f6465645f70726f706f73616c1c5665633c75383e040d012053616d6520617320606e6f74655f707265696d6167656020627574206f726967696e20697320604f7065726174696f6e616c507265696d6167654f726967696e602e586e6f74655f696d6d696e656e745f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e4045012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e2054686973207265717569726573207468652070726f706f73616c20746f206265410120696e207468652064697370617463682071756575652e204e6f206465706f736974206973206e65656465642e205768656e20746869732063616c6c206973207375636365737366756c2c20692e652e39012074686520707265696d61676520686173206e6f74206265656e2075706c6f61646564206265666f726520616e64206d61746368657320736f6d6520696d6d696e656e742070726f706f73616c2c40206e6f2066656520697320706169642e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00c8202d2060656e636f6465645f70726f706f73616c603a2054686520707265696d616765206f6620612070726f706f73616c2e005c20456d6974732060507265696d6167654e6f746564602e002c2023203c7765696768743e6901202d20436f6d706c65786974793a20604f28452960207769746820452073697a65206f662060656e636f6465645f70726f706f73616c60202870726f7465637465642062792061207265717569726564206465706f736974292e60202d2044622072656164733a2060507265696d616765736064202d204462207772697465733a2060507265696d6167657360302023203c2f7765696768743e886e6f74655f696d6d696e656e745f707265696d6167655f6f7065726174696f6e616c0440656e636f6465645f70726f706f73616c1c5665633c75383e0431012053616d6520617320606e6f74655f696d6d696e656e745f707265696d6167656020627574206f726967696e20697320604f7065726174696f6e616c507265696d6167654f726967696e602e34726561705f707265696d616765083470726f706f73616c5f686173681c543a3a486173686070726f706f73616c5f6c656e5f75707065725f626f756e6430436f6d706163743c7533323e4cf42052656d6f766520616e20657870697265642070726f706f73616c20707265696d61676520616e6420636f6c6c65637420746865206465706f7369742e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00d0202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f6620612070726f706f73616c2e2d01202d206070726f706f73616c5f6c656e6774685f75707065725f626f756e64603a20616e20757070657220626f756e64206f6e206c656e677468206f66207468652070726f706f73616c2e010120202045787472696e736963206973207765696768746564206163636f7264696e6720746f20746869732076616c75652077697468206e6f20726566756e642e00510120546869732077696c6c206f6e6c7920776f726b2061667465722060566f74696e67506572696f646020626c6f636b732066726f6d207468652074696d6520746861742074686520707265696d616765207761735d01206e6f7465642c2069662069742773207468652073616d65206163636f756e7420646f696e672069742e2049662069742773206120646966666572656e74206163636f756e742c207468656e206974276c6c206f6e6c79b020776f726b20616e206164646974696f6e616c2060456e6163746d656e74506572696f6460206c617465722e006020456d6974732060507265696d616765526561706564602e002c2023203c7765696768743ed0202d20436f6d706c65786974793a20604f284429602077686572652044206973206c656e677468206f662070726f706f73616c2ebc202d2044622072656164733a2060507265696d61676573602c2070726f7669646572206163636f756e742064617461bc202d204462207772697465733a2060507265696d61676573602070726f7669646572206163636f756e742064617461302023203c2f7765696768743e18756e6c6f636b041874617267657430543a3a4163636f756e7449642ca420556e6c6f636b20746f6b656e732074686174206861766520616e2065787069726564206c6f636b2e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00bc202d2060746172676574603a20546865206163636f756e7420746f2072656d6f766520746865206c6f636b206f6e2e002c2023203c7765696768743ed4202d20436f6d706c657869747920604f2852296020776974682052206e756d626572206f6620766f7465206f66207461726765742eec202d2044622072656164733a2060566f74696e674f66602c206062616c616e636573206c6f636b73602c2060746172676574206163636f756e7460f0202d204462207772697465733a2060566f74696e674f66602c206062616c616e636573206c6f636b73602c2060746172676574206163636f756e7460302023203c2f7765696768743e2c72656d6f76655f766f74650414696e6465783c5265666572656e64756d496e6465787c802052656d6f7665206120766f746520666f722061207265666572656e64756d2e00102049663a8c202d20746865207265666572656e64756d207761732063616e63656c6c65642c206f7280202d20746865207265666572656e64756d206973206f6e676f696e672c206f7294202d20746865207265666572656e64756d2068617320656e6465642073756368207468617401012020202d2074686520766f7465206f6620746865206163636f756e742077617320696e206f70706f736974696f6e20746f2074686520726573756c743b206f72d82020202d20746865726520776173206e6f20636f6e76696374696f6e20746f20746865206163636f756e74277320766f74653b206f72882020202d20746865206163636f756e74206d61646520612073706c697420766f74656101202e2e2e7468656e2074686520766f74652069732072656d6f76656420636c65616e6c7920616e64206120666f6c6c6f77696e672063616c6c20746f2060756e6c6f636b60206d617920726573756c7420696e206d6f72655c2066756e6473206265696e6720617661696c61626c652e00ac2049662c20686f77657665722c20746865207265666572656e64756d2068617320656e64656420616e643af0202d2069742066696e697368656420636f72726573706f6e64696e6720746f2074686520766f7465206f6620746865206163636f756e742c20616e64e0202d20746865206163636f756e74206d6164652061207374616e6461726420766f7465207769746820636f6e76696374696f6e2c20616e64c0202d20746865206c6f636b20706572696f64206f662074686520636f6e76696374696f6e206973206e6f74206f7665725d01202e2e2e7468656e20746865206c6f636b2077696c6c206265206167677265676174656420696e746f20746865206f766572616c6c206163636f756e742773206c6f636b2c207768696368206d617920696e766f6c76655d01202a6f7665726c6f636b696e672a20287768657265207468652074776f206c6f636b732061726520636f6d62696e656420696e746f20612073696e676c65206c6f636b207468617420697320746865206d6178696d756de8206f6620626f74682074686520616d6f756e74206c6f636b656420616e64207468652074696d65206973206974206c6f636b656420666f72292e004d0120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e6572206d7573742068617665206120766f74658c207265676973746572656420666f72207265666572656e64756d2060696e646578602e00f8202d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e002c2023203c7765696768743e4101202d20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2edc2020205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652eac202d2044622072656164733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f6660b0202d204462207772697465733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f6660302023203c2f7765696768743e4472656d6f76655f6f746865725f766f7465081874617267657430543a3a4163636f756e74496414696e6465783c5265666572656e64756d496e6465784c802052656d6f7665206120766f746520666f722061207265666572656e64756d2e0051012049662074686520607461726765746020697320657175616c20746f20746865207369676e65722c207468656e20746869732066756e6374696f6e2069732065786163746c79206571756976616c656e7420746f3101206072656d6f76655f766f7465602e204966206e6f7420657175616c20746f20746865207369676e65722c207468656e2074686520766f7465206d757374206861766520657870697265642c590120656974686572206265636175736520746865207265666572656e64756d207761732063616e63656c6c65642c20626563617573652074686520766f746572206c6f737420746865207265666572656e64756d206f729c20626563617573652074686520636f6e76696374696f6e20706572696f64206973206f7665722e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e005101202d2060746172676574603a20546865206163636f756e74206f662074686520766f746520746f2062652072656d6f7665643b2074686973206163636f756e74206d757374206861766520766f74656420666f72582020207265666572656e64756d2060696e646578602ef8202d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e002c2023203c7765696768743e4101202d20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2edc2020205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652eac202d2044622072656164733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f6660b0202d204462207772697465733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f6660302023203c2f7765696768743e38656e6163745f70726f706f73616c083470726f706f73616c5f686173681c543a3a4861736814696e6465783c5265666572656e64756d496e64657804510120456e61637420612070726f706f73616c2066726f6d2061207265666572656e64756d2e20466f72206e6f77207765206a757374206d616b65207468652077656967687420626520746865206d6178696d756d2e01442050726f706f736564082450726f70496e6465781c42616c616e63650429012041206d6f74696f6e20686173206265656e2070726f706f7365642062792061207075626c6963206163636f756e742e205b70726f706f73616c5f696e6465782c206465706f7369745d185461626c65640c2450726f70496e6465781c42616c616e6365385665633c4163636f756e7449643e0475012041207075626c69632070726f706f73616c20686173206265656e207461626c656420666f72207265666572656e64756d20766f74652e205b70726f706f73616c5f696e6465782c206465706f7369742c206465706f7369746f72735d3845787465726e616c5461626c656400049820416e2065787465726e616c2070726f706f73616c20686173206265656e207461626c65642e1c53746172746564083c5265666572656e64756d496e64657834566f74655468726573686f6c6404bc2041207265666572656e64756d2068617320626567756e2e205b7265665f696e6465782c207468726573686f6c645d18506173736564043c5265666572656e64756d496e64657804e020412070726f706f73616c20686173206265656e20617070726f766564206279207265666572656e64756d2e205b7265665f696e6465785d244e6f74506173736564043c5265666572656e64756d496e64657804e020412070726f706f73616c20686173206265656e2072656a6563746564206279207265666572656e64756d2e205b7265665f696e6465785d2443616e63656c6c6564043c5265666572656e64756d496e64657804b42041207265666572656e64756d20686173206265656e2063616e63656c6c65642e205b7265665f696e6465785d204578656375746564083c5265666572656e64756d496e64657810626f6f6c04c020412070726f706f73616c20686173206265656e20656e61637465642e205b7265665f696e6465782c2069735f6f6b5d2444656c65676174656408244163636f756e744964244163636f756e74496404190120416e206163636f756e74206861732064656c65676174656420746865697220766f746520746f20616e6f74686572206163636f756e742e205b77686f2c207461726765745d2c556e64656c65676174656404244163636f756e74496404f020416e205b6163636f756e745d206861732063616e63656c6c656420612070726576696f75732064656c65676174696f6e206f7065726174696f6e2e185665746f65640c244163636f756e74496410486173682c426c6f636b4e756d62657204090120416e2065787465726e616c2070726f706f73616c20686173206265656e207665746f65642e205b77686f2c2070726f706f73616c5f686173682c20756e74696c5d34507265696d6167654e6f7465640c1048617368244163636f756e7449641c42616c616e636504590120412070726f706f73616c277320707265696d61676520776173206e6f7465642c20616e6420746865206465706f7369742074616b656e2e205b70726f706f73616c5f686173682c2077686f2c206465706f7369745d30507265696d616765557365640c1048617368244163636f756e7449641c42616c616e636508150120412070726f706f73616c20707265696d616765207761732072656d6f76656420616e6420757365642028746865206465706f736974207761732072657475726e6564292e8c205b70726f706f73616c5f686173682c2070726f76696465722c206465706f7369745d3c507265696d616765496e76616c69640810486173683c5265666572656e64756d496e64657804790120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d6167652077617320696e76616c69642e205b70726f706f73616c5f686173682c207265665f696e6465785d3c507265696d6167654d697373696e670810486173683c5265666572656e64756d496e64657804790120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d61676520776173206d697373696e672e205b70726f706f73616c5f686173682c207265665f696e6465785d38507265696d616765526561706564101048617368244163636f756e7449641c42616c616e6365244163636f756e744964082d012041207265676973746572656420707265696d616765207761732072656d6f76656420616e6420746865206465706f73697420636f6c6c656374656420627920746865207265617065722eac205b70726f706f73616c5f686173682c2070726f76696465722c206465706f7369742c207265617065725d20556e6c6f636b656404244163636f756e74496404b420416e205b6163636f756e745d20686173206265656e20756e6c6f636b6564207375636365737366756c6c792e203c456e6163746d656e74506572696f6438543a3a426c6f636b4e756d62657210002f0d0014710120546865206d696e696d756d20706572696f64206f66206c6f636b696e6720616e642074686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e0031012049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e737572652074686174690120766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e2074686520636173652077686572659c207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e304c61756e6368506572696f6438543a3a426c6f636b4e756d62657210004e0c0004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e30566f74696e67506572696f6438543a3a426c6f636b4e756d62657210004e0c0004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e384d696e696d756d4465706f7369743042616c616e63654f663c543e400000c16ff2862300000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e5446617374547261636b566f74696e67506572696f6438543a3a426c6f636b4e756d626572108051010004ec204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f7220616e20656d657267656e6379207265666572656e64756d2e34436f6f6c6f6666506572696f6438543a3a426c6f636b4e756d62657210004e0c0004610120506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e4c507265696d616765427974654465706f7369743042616c616e63654f663c543e400010a5d4e800000000000000000000000429012054686520616d6f756e74206f662062616c616e63652074686174206d757374206265206465706f7369746564207065722062797465206f6620707265696d6167652073746f7265642e204d6178566f7465730c753332106400000004b020546865206d6178696d756d206e756d626572206f6620766f74657320666f7220616e206163636f756e742e842056616c75654c6f7704382056616c756520746f6f206c6f773c50726f706f73616c4d697373696e6704602050726f706f73616c20646f6573206e6f7420657869737420426164496e646578043820556e6b6e6f776e20696e6465783c416c726561647943616e63656c656404982043616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365444475706c696361746550726f706f73616c04582050726f706f73616c20616c7265616479206d6164654c50726f706f73616c426c61636b6c6973746564046c2050726f706f73616c207374696c6c20626c61636b6c6973746564444e6f7453696d706c654d616a6f7269747904ac204e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f726974792c496e76616c696448617368043420496e76616c69642068617368284e6f50726f706f73616c0454204e6f2065787465726e616c2070726f706f73616c34416c72656164795665746f6564049c204964656e74697479206d6179206e6f74207665746f20612070726f706f73616c207477696365304e6f7444656c6567617465640438204e6f742064656c656761746564444475706c6963617465507265696d616765045c20507265696d61676520616c7265616479206e6f7465642c4e6f74496d6d696e656e740434204e6f7420696d6d696e656e7420546f6f4561726c79042820546f6f206561726c7920496d6d696e656e74042420496d6d696e656e743c507265696d6167654d697373696e67044c20507265696d616765206e6f7420666f756e64445265666572656e64756d496e76616c6964048820566f746520676976656e20666f7220696e76616c6964207265666572656e64756d3c507265696d616765496e76616c6964044420496e76616c696420707265696d6167652c4e6f6e6557616974696e670454204e6f2070726f706f73616c732077616974696e67244e6f744c6f636b656404a42054686520746172676574206163636f756e7420646f6573206e6f7420686176652061206c6f636b2e284e6f744578706972656404f020546865206c6f636b206f6e20746865206163636f756e7420746f20626520756e6c6f636b656420686173206e6f742079657420657870697265642e204e6f74566f74657204c82054686520676976656e206163636f756e7420646964206e6f7420766f7465206f6e20746865207265666572656e64756d2e304e6f5065726d697373696f6e04cc20546865206163746f7220686173206e6f207065726d697373696f6e20746f20636f6e647563742074686520616374696f6e2e44416c726561647944656c65676174696e67048c20546865206163636f756e7420697320616c72656164792064656c65676174696e672e204f766572666c6f7704a420416e20756e657870656374656420696e7465676572206f766572666c6f77206f636375727265642e24556e646572666c6f7704a820416e20756e657870656374656420696e746567657220756e646572666c6f77206f636375727265642e44496e73756666696369656e7446756e647304010120546f6f206869676820612062616c616e6365207761732070726f7669646564207468617420746865206163636f756e742063616e6e6f74206166666f72642e344e6f7444656c65676174696e6704a420546865206163636f756e74206973206e6f742063757272656e746c792064656c65676174696e672e28566f746573457869737408590120546865206163636f756e742063757272656e746c792068617320766f74657320617474616368656420746f20697420616e6420746865206f7065726174696f6e2063616e6e6f74207375636365656420756e74696cec207468657365206172652072656d6f7665642c20656974686572207468726f7567682060756e766f746560206f722060726561705f766f7465602e44496e7374616e744e6f74416c6c6f77656404dc2054686520696e7374616e74207265666572656e64756d206f726967696e2069732063757272656e746c7920646973616c6c6f7765642e204e6f6e73656e736504982044656c65676174696f6e20746f206f6e6573656c66206d616b6573206e6f2073656e73652e3c57726f6e675570706572426f756e64045420496e76616c696420757070657220626f756e642e3c4d6178566f746573526561636865640484204d6178696d756d206e756d626572206f6620766f74657320726561636865642e0a1c436f756e63696c014c496e7374616e636531436f6c6c656374697665182450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001061c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001061c543a3a486173688c566f7465733c543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265723e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000030543a3a4163636f756e7449640400085d0120546865206d656d6265722077686f2070726f7669646573207468652064656661756c7420766f746520666f7220616e79206f74686572206d656d62657273207468617420646f206e6f7420766f7465206265666f7265e4207468652074696d656f75742e204966204e6f6e652c207468656e206e6f206d656d6265722068617320746861742070726976696c6567652e01182c7365745f6d656d626572730c2c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e147072696d65504f7074696f6e3c543a3a4163636f756e7449643e246f6c645f636f756e742c4d656d626572436f756e746084205365742074686520636f6c6c6563746976652773206d656d626572736869702e004901202d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee4202d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e3901202d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652eac202020202020202020202020202020205573656420666f722077656967687420657374696d6174696f6e2e005820526571756972657320726f6f74206f726967696e2e005501204e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d61784d656d6265727360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c206275742501202020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002c2023203c7765696768743e282023232057656967687454202d20604f284d50202b204e29602077686572653ae42020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e42020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299c2020202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e6465642918202d2044423a75012020202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e6720746865206d656d62657273f02020202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c7349012020202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c61012020202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e65302023203c2f7765696768743e1c65786563757465082070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e28f420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002c2023203c7765696768743e28202323205765696768748501202d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e67206070726f706f73616c60d8202d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c6028202d2031206576656e74302023203c2f7765696768743e1c70726f706f73650c247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e6cfc204164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e0088205265717569726573207468652073656e64657220746f206265206d656d6265722e00450120607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c2032602958206f722070757420757020666f7220766f74696e672e002c2023203c7765696768743e2820232320576569676874b0202d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c82020202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af820202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029010120202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d2032602918202d2044423ab82020202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f42020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029ac2020202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0d0120202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029bc20202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029dc202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e8202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029d0202020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029c0202020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d296029302020202d2031206576656e74302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c30f42041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e0090205265717569726573207468652073656e64657220746f2062652061206d656d6265722e002c2023203c7765696768743e28202323205765696768740d01202d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e6465642918202d2044423ab02020202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029bc2020202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d29602928202d2031206576656e74302023203c2f7765696768743e14636c6f7365103470726f706f73616c5f686173681c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e5470726f706f73616c5f7765696768745f626f756e643c436f6d706163743c5765696768743e306c656e6774685f626f756e6430436f6d706163743c7533323e6c510120436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e005901204d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e004d012049662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973c02068617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e004d012049662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e73290120756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e008d01202b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642070726f706f73616c2e6501202b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b6564207669618101202020202020202020202020202020202020206073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002c2023203c7765696768743e282023232057656967687478202d20604f2842202b204d202b205031202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429cc2020202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea82020202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e6465642918202d2044423a110120202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f2831296029810120202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f64656320604f285032296029e020202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c602028605031602944202d20757020746f2033206576656e7473302023203c2f7765696768743e4c646973617070726f76655f70726f706f73616c043470726f706f73616c5f686173681c543a3a4861736834790120446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e742073746174652e008c204d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e003020506172616d65746572733a2101202a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002c2023203c7765696768743ee020436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c732c204442205765696768743a4c202a2052656164733a2050726f706f73616c73a0202a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f66302023203c2f7765696768743e011c2050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e740c4d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292ed0205b6163636f756e742c2070726f706f73616c5f696e6465782c2070726f706f73616c5f686173682c207468726573686f6c645d14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740c09012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292ea4205b6163636f756e742c2070726f706f73616c5f686173682c20766f7465642c207965732c206e6f5d20417070726f76656404104861736808c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e40205b70726f706f73616c5f686173685d2c446973617070726f76656404104861736808d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e40205b70726f706f73616c5f686173685d204578656375746564081048617368384469737061746368526573756c740825012041206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e60205b70726f706f73616c5f686173682c20726573756c745d384d656d6265724578656375746564081048617368384469737061746368526573756c74084d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e60205b70726f706f73616c5f686173682c20726573756c745d18436c6f7365640c10486173682c4d656d626572436f756e742c4d656d626572436f756e7408590120412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e64205b70726f706f73616c5f686173682c207965732c206e6f5d0028244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c790405012054686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c730401012054686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c57656967687404d42054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e67746804d42054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e0b48546563686e6963616c436f6d6d6974746565014c496e7374616e636532436f6c6c656374697665182450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001061c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001061c543a3a486173688c566f7465733c543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265723e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000030543a3a4163636f756e7449640400085d0120546865206d656d6265722077686f2070726f7669646573207468652064656661756c7420766f746520666f7220616e79206f74686572206d656d62657273207468617420646f206e6f7420766f7465206265666f7265e4207468652074696d656f75742e204966204e6f6e652c207468656e206e6f206d656d6265722068617320746861742070726976696c6567652e01182c7365745f6d656d626572730c2c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e147072696d65504f7074696f6e3c543a3a4163636f756e7449643e246f6c645f636f756e742c4d656d626572436f756e746084205365742074686520636f6c6c6563746976652773206d656d626572736869702e004901202d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee4202d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e3901202d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652eac202020202020202020202020202020205573656420666f722077656967687420657374696d6174696f6e2e005820526571756972657320726f6f74206f726967696e2e005501204e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d61784d656d6265727360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c206275742501202020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002c2023203c7765696768743e282023232057656967687454202d20604f284d50202b204e29602077686572653ae42020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e42020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299c2020202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e6465642918202d2044423a75012020202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e6720746865206d656d62657273f02020202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c7349012020202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c61012020202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e65302023203c2f7765696768743e1c65786563757465082070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e28f420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002c2023203c7765696768743e28202323205765696768748501202d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e67206070726f706f73616c60d8202d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c6028202d2031206576656e74302023203c2f7765696768743e1c70726f706f73650c247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e6cfc204164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e0088205265717569726573207468652073656e64657220746f206265206d656d6265722e00450120607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c2032602958206f722070757420757020666f7220766f74696e672e002c2023203c7765696768743e2820232320576569676874b0202d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c82020202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af820202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029010120202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d2032602918202d2044423ab82020202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f42020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029ac2020202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0d0120202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029bc20202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029dc202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e8202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029d0202020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029c0202020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d296029302020202d2031206576656e74302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c30f42041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e0090205265717569726573207468652073656e64657220746f2062652061206d656d6265722e002c2023203c7765696768743e28202323205765696768740d01202d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e6465642918202d2044423ab02020202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029bc2020202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d29602928202d2031206576656e74302023203c2f7765696768743e14636c6f7365103470726f706f73616c5f686173681c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e5470726f706f73616c5f7765696768745f626f756e643c436f6d706163743c5765696768743e306c656e6774685f626f756e6430436f6d706163743c7533323e6c510120436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e005901204d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e004d012049662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973c02068617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e004d012049662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e73290120756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e008d01202b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642070726f706f73616c2e6501202b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b6564207669618101202020202020202020202020202020202020206073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002c2023203c7765696768743e282023232057656967687478202d20604f2842202b204d202b205031202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429cc2020202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea82020202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e6465642918202d2044423a110120202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f2831296029810120202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f64656320604f285032296029e020202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c602028605031602944202d20757020746f2033206576656e7473302023203c2f7765696768743e4c646973617070726f76655f70726f706f73616c043470726f706f73616c5f686173681c543a3a4861736834790120446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e742073746174652e008c204d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e003020506172616d65746572733a2101202a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002c2023203c7765696768743ee020436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c732c204442205765696768743a4c202a2052656164733a2050726f706f73616c73a0202a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f66302023203c2f7765696768743e011c2050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e740c4d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292ed0205b6163636f756e742c2070726f706f73616c5f696e6465782c2070726f706f73616c5f686173682c207468726573686f6c645d14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740c09012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292ea4205b6163636f756e742c2070726f706f73616c5f686173682c20766f7465642c207965732c206e6f5d20417070726f76656404104861736808c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e40205b70726f706f73616c5f686173685d2c446973617070726f76656404104861736808d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e40205b70726f706f73616c5f686173685d204578656375746564081048617368384469737061746368526573756c740825012041206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e60205b70726f706f73616c5f686173682c20726573756c745d384d656d6265724578656375746564081048617368384469737061746368526573756c74084d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e60205b70726f706f73616c5f686173682c20726573756c745d18436c6f7365640c10486173682c4d656d626572436f756e742c4d656d626572436f756e7408590120412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e64205b70726f706f73616c5f686173682c207965732c206e6f5d0028244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c790405012054686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c730401012054686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c57656967687404d42054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e67746804d42054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e0c24456c656374696f6e73014050687261676d656e456c656374696f6e141c4d656d626572730100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e040004f0205468652063757272656e7420656c6563746564206d656d626572736869702e20536f72746564206261736564206f6e206163636f756e742069642e2452756e6e65727355700100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e0400044901205468652063757272656e742072756e6e6572735f75702e20536f72746564206261736564206f6e206c6f7720746f2068696768206d657269742028776f72736520746f20626573742072756e6e6572292e38456c656374696f6e526f756e647301000c75333210000000000441012054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e65642c206578636c7564696e6720746865207570636f6d696e67206f6e652e18566f74696e6701010530543a3a4163636f756e744964842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29004400000000000000000000000000000000000cb820566f74657320616e64206c6f636b6564207374616b65206f66206120706172746963756c617220766f7465722e00c02054574f582d4e4f54453a205341464520617320604163636f756e7449646020697320612063727970746f20686173682843616e646964617465730100445665633c543a3a4163636f756e7449643e0400085901205468652070726573656e742063616e646964617465206c6973742e20536f72746564206261736564206f6e206163636f756e742d69642e20412063757272656e74206d656d626572206f722072756e6e65722d757041012063616e206e6576657220656e746572207468697320766563746f7220616e6420697320616c7761797320696d706c696369746c7920617373756d656420746f20626520612063616e6469646174652e011810766f74650814766f746573445665633c543a3a4163636f756e7449643e1476616c756554436f6d706163743c42616c616e63654f663c543e3e645d0120566f746520666f72206120736574206f662063616e6469646174657320666f7220746865207570636f6d696e6720726f756e64206f6620656c656374696f6e2e20546869732063616e2062652063616c6c656420746fe4207365742074686520696e697469616c20766f7465732c206f722075706461746520616c7265616479206578697374696e6720766f7465732e0055012055706f6e20696e697469616c20766f74696e672c206076616c75656020756e697473206f66206077686f6027732062616c616e6365206973206c6f636b656420616e64206120626f6e6420616d6f756e74206973282072657365727665642e0050205468652060766f746573602073686f756c643a482020202d206e6f7420626520656d7074792e59012020202d206265206c657373207468616e20746865206e756d626572206f6620706f737369626c652063616e646964617465732e204e6f7465207468617420616c6c2063757272656e74206d656d6265727320616e641501202020202072756e6e6572732d75702061726520616c736f206175746f6d61746963616c6c792063616e6469646174657320666f7220746865206e65787420726f756e642e005d012049742069732074686520726573706f6e736962696c697479206f66207468652063616c6c657220746f206e6f7420706c61636520616c6c206f662074686569722062616c616e636520696e746f20746865206c6f636ba020616e64206b65657020736f6d6520666f722066757274686572207472616e73616374696f6e732e002c2023203c7765696768743e5c2042617365207765696768743a2034372e393320c2b573342053746174652072656164733ad820092d2043616e646964617465732e6c656e2829202b204d656d626572732e6c656e2829202b2052756e6e65727355702e6c656e28295420092d20566f74696e67202869735f766f74657229d420092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665202b20746f74616c5f62616c616e6365295d38205374617465207772697465733a2820092d20566f74696e672020092d204c6f636b1d0120092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665202d2d206f6e6c79207768656e206372656174696e672061206e657720766f746572295d302023203c2f7765696768743e3072656d6f76655f766f746572003421012052656d6f766520606f726967696e60206173206120766f7465722e20546869732072656d6f76657320746865206c6f636b20616e642072657475726e732074686520626f6e642e002c2023203c7765696768743e582042617365207765696768743a2033362e3820c2b573a820416c6c207374617465206163636573732069732066726f6d20646f5f72656d6f76655f766f7465722e342053746174652072656164733a2820092d20566f74696e675820092d205b4163636f756e74446174612877686f295d38205374617465207772697465733a2820092d20566f74696e672420092d204c6f636b735820092d205b4163636f756e74446174612877686f295d302023203c2f7765696768743e507265706f72745f646566756e63745f766f746572041c646566756e6374c4446566756e6374566f7465723c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e6c5d01205265706f727420607461726765746020666f72206265696e6720616e20646566756e637420766f7465722e20496e2063617365206f6620612076616c6964207265706f72742c20746865207265706f727465722069735d012072657761726465642062792074686520626f6e6420616d6f756e74206f662060746172676574602e204f74686572776973652c20746865207265706f7274657220697473656c662069732072656d6f76656420616e645c20746865697220626f6e6420697320736c61736865642e0088204120646566756e637420766f74657220697320646566696e656420746f2062653a4d012020202d206120766f7465722077686f73652063757272656e74207375626d697474656420766f7465732061726520616c6c20696e76616c69642e20692e652e20616c6c206f66207468656d20617265206e6ff020202020206c6f6e67657220612063616e646964617465206e6f7220616e20616374697665206d656d626572206f7220612072756e6e65722d75702e0000690120546865206f726967696e206d7573742070726f7669646520746865206e756d626572206f662063757272656e742063616e6469646174657320616e6420766f746573206f6620746865207265706f7274656420746172676574c020666f722074686520707572706f7365206f66206163637572617465207765696768742063616c63756c6174696f6e2e002c2023203c7765696768743eb4204e6f204261736520776569676874206261736564206f6e206d696e2073717561726520616e616c797369732ea420436f6d706c6578697479206f662063616e6469646174655f636f756e743a20312e37353520c2b5739020436f6d706c6578697479206f6620766f74655f636f756e743a2031382e353120c2b573342053746174652072656164733a542020092d20566f74696e67287265706f7274657229502020092d2043616e6469646174652e6c656e28294c2020092d20566f74696e672854617267657429d82020092d2043616e646964617465732c204d656d626572732c2052756e6e6572735570202869735f646566756e63745f766f7465722938205374617465207772697465733a7020092d204c6f636b287265706f72746572207c7c2074617267657429dc20092d205b4163636f756e7442616c616e6365287265706f72746572295d202b204163636f756e7442616c616e636528746172676574297820092d20566f74696e67287265706f72746572207c7c20746172676574295901204e6f74653a207468652064622061636365737320697320776f7273652077697468207265737065637420746f2064622c207768696368206973207768656e20746865207265706f727420697320636f72726563742e302023203c2f7765696768743e407375626d69745f63616e646964616379043c63616e6469646174655f636f756e7430436f6d706163743c7533323e5478205375626d6974206f6e6573656c6620666f722063616e6469646163792e006420412063616e6469646174652077696c6c206569746865723aec2020202d204c6f73652061742074686520656e64206f6620746865207465726d20616e6420666f7266656974207468656972206465706f7369742e2d012020202d2057696e20616e64206265636f6d652061206d656d6265722e204d656d626572732077696c6c206576656e7475616c6c7920676574207468656972207374617368206261636b2e55012020202d204265636f6d6520612072756e6e65722d75702e2052756e6e6572732d75707320617265207265736572766564206d656d6265727320696e2063617365206f6e65206765747320666f72636566756c6c7934202020202072656d6f7665642e002c2023203c7765696768743e60204261736520776569676874203d2033332e333320c2b573a420436f6d706c6578697479206f662063616e6469646174655f636f756e743a20302e33373520c2b573342053746174652072656164733a5020092d2043616e646964617465732e6c656e28293820092d2043616e646964617465732c20092d204d656d626572733420092d2052756e6e65727355706420092d205b4163636f756e7442616c616e63652877686f295d38205374617465207772697465733a6420092d205b4163636f756e7442616c616e63652877686f295d3820092d2043616e64696461746573302023203c2f7765696768743e4872656e6f756e63655f63616e646964616379042872656e6f756e63696e672852656e6f756e63696e679851012052656e6f756e6365206f6e65277320696e74656e74696f6e20746f20626520612063616e64696461746520666f7220746865206e65787420656c656374696f6e20726f756e642e203320706f74656e7469616c40206f7574636f6d65732065786973743a4101202d20606f726967696e6020697320612063616e64696461746520616e64206e6f7420656c656374656420696e20616e79207365742e20496e207468697320636173652c2074686520626f6e64206973f4202020756e72657365727665642c2072657475726e656420616e64206f726967696e2069732072656d6f76656420617320612063616e6469646174652e5901202d20606f726967696e6020697320612063757272656e742072756e6e65722d75702e20496e207468697320636173652c2074686520626f6e6420697320756e72657365727665642c2072657475726e656420616e64902020206f726967696e2069732072656d6f76656420617320612072756e6e65722d75702e4d01202d20606f726967696e6020697320612063757272656e74206d656d6265722e20496e207468697320636173652c2074686520626f6e6420697320756e726573657276656420616e64206f726967696e206973590120202072656d6f7665642061732061206d656d6265722c20636f6e73657175656e746c79206e6f74206265696e6720612063616e64696461746520666f7220746865206e65787420726f756e6420616e796d6f72652e650120202053696d696c617220746f205b6072656d6f76655f766f746572605d2c206966207265706c6163656d656e742072756e6e657273206578697374732c20746865792061726520696d6d6564696174656c7920757365642e24203c7765696768743e7820496620612063616e6469646174652069732072656e6f756e63696e673a60200942617365207765696768743a2031372e323820c2b573a82009436f6d706c6578697479206f662063616e6469646174655f636f756e743a20302e32333520c2b57338200953746174652072656164733a3c2009092d2043616e64696461746573982009092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665295d3c20095374617465207772697465733a3c2009092d2043616e64696461746573982009092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665295d64204966206d656d6265722069732072656e6f756e63696e673a60200942617365207765696768743a2034362e323520c2b57338200953746174652072656164733ad02009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d3c20095374617465207772697465733ad02009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d642049662072756e6e65722069732072656e6f756e63696e673a60200942617365207765696768743a2034362e323520c2b57338200953746174652072656164733aac2009092d2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d3c20095374617465207772697465733aac2009092d2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d000d0120576569676874206e6f74653a205468652063616c6c20696e746f206368616e67654d656d62657273206e65656420746f206265206163636f756e74656420666f722e28203c2f7765696768743e3472656d6f76655f6d656d626572080c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653c6861735f7265706c6163656d656e7410626f6f6c485d012052656d6f7665206120706172746963756c6172206d656d6265722066726f6d20746865207365742e20546869732069732065666665637469766520696d6d6564696174656c7920616e642074686520626f6e64206f668020746865206f7574676f696e67206d656d62657220697320736c61736865642e00590120496620612072756e6e65722d757020697320617661696c61626c652c207468656e2074686520626573742072756e6e65722d75702077696c6c2062652072656d6f76656420616e64207265706c61636573207468650101206f7574676f696e67206d656d6265722e204f74686572776973652c2061206e65772070687261676d656e20656c656374696f6e20697320737461727465642e004501204e6f74652074686174207468697320646f6573206e6f7420616666656374207468652064657369676e6174656420626c6f636b206e756d626572206f6620746865206e65787420656c656374696f6e2e002c2023203c7765696768743e6820496620776520686176652061207265706c6163656d656e743a6820092d2042617365207765696768743a2035302e393320c2b5734020092d2053746174652072656164733a502009092d2052756e6e65727355702e6c656e2829cc2009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572294420092d205374617465207772697465733acc2009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d62657229650120456c73652c2073696e63652074686973206973206120726f6f742063616c6c20616e642077696c6c20676f20696e746f2070687261676d656e2c20776520617373756d652066756c6c20626c6f636b20666f72206e6f772e302023203c2f7765696768743e01141c4e65775465726d04645665633c284163636f756e7449642c2042616c616e6365293e1061012041206e6577207465726d2077697468205b6e65775f6d656d626572735d2e205468697320696e64696361746573207468617420656e6f7567682063616e64696461746573206578697374656420746f2072756e20746865590120656c656374696f6e2c206e6f74207468617420656e6f756768206861766520686173206265656e20656c65637465642e2054686520696e6e65722076616c7565206d757374206265206578616d696e656420666f726101207468697320707572706f73652e204120604e65775465726d285b5d296020696e64696361746573207468617420736f6d652063616e6469646174657320676f7420746865697220626f6e6420736c617368656420616e645901206e6f6e65207765726520656c65637465642c207768696c73742060456d7074795465726d60206d65616e732074686174206e6f2063616e64696461746573206578697374656420746f20626567696e20776974682e24456d7074795465726d00083501204e6f20286f72206e6f7420656e6f756768292063616e64696461746573206578697374656420666f72207468697320726f756e642e205468697320697320646966666572656e742066726f6dc420604e65775465726d285b5d29602e2053656520746865206465736372697074696f6e206f6620604e65775465726d602e304d656d6265724b69636b656404244163636f756e744964084d012041205b6d656d6265725d20686173206265656e2072656d6f7665642e20546869732073686f756c6420616c7761797320626520666f6c6c6f7765642062792065697468657220604e65775465726d60206f74342060456d7074795465726d602e3c4d656d62657252656e6f756e63656404244163636f756e74496404a82041205b6d656d6265725d206861732072656e6f756e6365642074686569722063616e6469646163792e34566f7465725265706f727465640c244163636f756e744964244163636f756e74496410626f6f6c080901204120766f74657220776173207265706f7274656420776974682074686520746865207265706f7274206265696e67207375636365737366756c206f72206e6f742e6c205b766f7465722c207265706f727465722c20737563636573735d183443616e646964616379426f6e643042616c616e63654f663c543e400080c6a47e8d030000000000000000000028566f74696e67426f6e643042616c616e63654f663c543e4000407a10f35a000000000000000000000038446573697265644d656d626572730c753332100d00000000404465736972656452756e6e65727355700c753332100700000000305465726d4475726174696f6e38543a3a426c6f636b4e756d626572108013030000204d6f64756c654964384c6f636b4964656e74696669657220706872656c656374004430556e61626c65546f566f746504c42043616e6e6f7420766f7465207768656e206e6f2063616e64696461746573206f72206d656d626572732065786973742e1c4e6f566f7465730498204d75737420766f746520666f72206174206c65617374206f6e652063616e6469646174652e30546f6f4d616e79566f74657304882043616e6e6f7420766f7465206d6f7265207468616e2063616e646964617465732e504d6178696d756d566f7465734578636565646564049c2043616e6e6f7420766f7465206d6f7265207468616e206d6178696d756d20616c6c6f7765642e284c6f7742616c616e636504c82043616e6e6f7420766f74652077697468207374616b65206c657373207468616e206d696e696d756d2062616c616e63652e3c556e61626c65546f506179426f6e64047c20566f7465722063616e206e6f742070617920766f74696e6720626f6e642e2c4d7573744265566f7465720444204d757374206265206120766f7465722e285265706f727453656c6604502043616e6e6f74207265706f72742073656c662e4c4475706c69636174656443616e6469646174650484204475706c6963617465642063616e646964617465207375626d697373696f6e2e304d656d6265725375626d6974048c204d656d6265722063616e6e6f742072652d7375626d69742063616e6469646163792e3052756e6e65725375626d6974048c2052756e6e65722063616e6e6f742072652d7375626d69742063616e6469646163792e68496e73756666696369656e7443616e64696461746546756e647304982043616e64696461746520646f6573206e6f74206861766520656e6f7567682066756e64732e244e6f744d656d6265720438204e6f742061206d656d6265722e54496e76616c696443616e646964617465436f756e7404e4205468652070726f766964656420636f756e74206f66206e756d626572206f662063616e6469646174657320697320696e636f72726563742e40496e76616c6964566f7465436f756e7404d0205468652070726f766964656420636f756e74206f66206e756d626572206f6620766f74657320697320696e636f72726563742e44496e76616c696452656e6f756e63696e67040101205468652072656e6f756e63696e67206f726967696e2070726573656e74656420612077726f6e67206052656e6f756e63696e676020706172616d657465722e48496e76616c69645265706c6163656d656e740401012050726564696374696f6e20726567617264696e67207265706c6163656d656e74206166746572206d656d6265722072656d6f76616c2069732077726f6e672e0d4c546563686e6963616c4d656d62657273686970014c496e7374616e6365314d656d62657273686970081c4d656d626572730100445665633c543a3a4163636f756e7449643e040004c8205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e145072696d65000030543a3a4163636f756e744964040004a4205468652063757272656e74207072696d65206d656d6265722c206966206f6e65206578697374732e011c286164645f6d656d626572040c77686f30543a3a4163636f756e7449640c7c204164642061206d656d626572206077686f6020746f20746865207365742e00a0204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a4164644f726967696e602e3472656d6f76655f6d656d626572040c77686f30543a3a4163636f756e7449640c902052656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e00ac204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656d6f76654f726967696e602e2c737761705f6d656d626572081872656d6f766530543a3a4163636f756e7449640c61646430543a3a4163636f756e74496414c02053776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e00a4204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a537761704f726967696e602e001101205072696d65206d656d62657273686970206973202a6e6f742a207061737365642066726f6d206072656d6f76656020746f2060616464602c20696620657874616e742e3472657365745f6d656d62657273041c6d656d62657273445665633c543a3a4163636f756e7449643e105901204368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e646c207061737320606d656d6265727360207072652d736f727465642e00a8204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52657365744f726967696e602e286368616e67655f6b6579040c6e657730543a3a4163636f756e74496414d82053776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e00f4204d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e002101205072696d65206d656d62657273686970206973207061737365642066726f6d20746865206f726967696e206163636f756e7420746f20606e6577602c20696620657874616e742e247365745f7072696d65040c77686f30543a3a4163636f756e7449640cc02053657420746865207072696d65206d656d6265722e204d75737420626520612063757272656e74206d656d6265722e00a8204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e2c636c6561725f7072696d65000c982052656d6f766520746865207072696d65206d656d626572206966206974206578697374732e00a8204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e01182c4d656d62657241646465640004e42054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e344d656d62657252656d6f7665640004ec2054686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e384d656d62657273537761707065640004dc2054776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e304d656d6265727352657365740004190120546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e284b65794368616e676564000488204f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e1444756d6d7904bc73705f7374643a3a6d61726b65723a3a5068616e746f6d446174613c284163636f756e7449642c204576656e74293e0470205068616e746f6d206d656d6265722c206e6576657220757365642e00000e3c46696e616c697479547261636b65720001042866696e616c5f68696e74041068696e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08f42048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a65646c20626c6f636b2069732074686520676976656e206e756d6265722e00082857696e646f7753697a6538543a3a426c6f636b4e756d626572106500000004190120546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e345265706f72744c6174656e637938543a3a426c6f636b4e756d62657210e8030000041d01205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e0838416c72656164795570646174656404c82046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b1c42616448696e7404902046696e616c697a6564206865696768742061626f766520626c6f636b206e756d6265720f1c4772616e647061013c4772616e64706146696e616c6974791814537461746501006c53746f72656453746174653c543a3a426c6f636b4e756d6265723e04000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e676500008c53746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000038543a3a426c6f636b4e756d626572040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c656400008028543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d626572290400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e7453657449640100145365744964200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e0001051453657449643053657373696f6e496e6465780004001059012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f722077686963682069747368206d656d62657273207765726520726573706f6e7369626c652e00b82054574f582d4e4f54453a2060536574496460206973206e6f7420756e646572207573657220636f6e74726f6c2e010c4c7265706f72745f65717569766f636174696f6e084865717569766f636174696f6e5f70726f6f66a845717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66100d01205265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f82065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66fc20616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e6365482077696c6c206265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e6564084865717569766f636174696f6e5f70726f6f66a845717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66240d01205265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f82065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66fc20616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e6365482077696c6c206265207265706f727465642e00110120546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c79190120626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c206173207375636819012069662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e28207265706f727465722e306e6f74655f7374616c6c6564081464656c617938543a3a426c6f636b4e756d6265726c626573745f66696e616c697a65645f626c6f636b5f6e756d62657238543a3a426c6f636b4e756d6265721c1d01204e6f74652074686174207468652063757272656e7420617574686f7269747920736574206f6620746865204752414e4450412066696e616c69747920676164676574206861732901207374616c6c65642e20546869732077696c6c2074726967676572206120666f7263656420617574686f7269747920736574206368616e67652061742074686520626567696e6e696e672101206f6620746865206e6578742073657373696f6e2c20746f20626520656e6163746564206064656c61796020626c6f636b7320616674657220746861742e205468652064656c617915012073686f756c64206265206869676820656e6f75676820746f20736166656c7920617373756d6520746861742074686520626c6f636b207369676e616c6c696e6720746865290120666f72636564206368616e67652077696c6c206e6f742062652072652d6f726765642028652e672e203130303020626c6f636b73292e20546865204752414e44504120766f7465727329012077696c6c20737461727420746865206e657720617574686f7269747920736574207573696e672074686520676976656e2066696e616c697a656420626c6f636b20617320626173652e5c204f6e6c792063616c6c61626c6520627920726f6f742e010c384e6577417574686f7269746965730434417574686f726974794c69737404d0204e657720617574686f726974792073657420686173206265656e206170706c6965642e205b617574686f726974795f7365745d1850617573656400049c2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640004a02043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e001c2c50617573654661696c656408090120417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665a8202865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e30526573756d654661696c656408150120417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e277420706175736564a42028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e344368616e676550656e64696e6704ec20417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e1c546f6f536f6f6e04c02043616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e60496e76616c69644b65794f776e65727368697050726f6f660435012041206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e60496e76616c696445717569766f636174696f6e50726f6f6604350120416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f7274041901204120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e1020547265617375727901205472656173757279143450726f706f73616c436f756e7401003450726f706f73616c496e646578100000000004a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c730001053450726f706f73616c496e6465789050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c730100485665633c50726f706f73616c496e6465783e040004f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e10546970730001051c543a3a48617368f04f70656e5469703c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265722c20543a3a486173683e0004000c59012054697073207468617420617265206e6f742079657420636f6d706c657465642e204b65796564206279207468652068617368206f66206028726561736f6e2c2077686f29602066726f6d207468652076616c75652e3d012054686973206861732074686520696e73656375726520656e756d657261626c6520686173682066756e6374696f6e2073696e636520746865206b657920697473656c6620697320616c7265616479802067756172616e7465656420746f20626520612073656375726520686173682e1c526561736f6e730001061c543a3a486173681c5665633c75383e0004000849012053696d706c6520707265696d616765206c6f6f6b75702066726f6d2074686520726561736f6e2773206861736820746f20746865206f726967696e616c20646174612e20416761696e2c2068617320616e610120696e73656375726520656e756d657261626c6520686173682073696e636520746865206b65792069732067756172616e7465656420746f2062652074686520726573756c74206f6620612073656375726520686173682e01203470726f706f73655f7370656e64081476616c756554436f6d706163743c42616c616e63654f663c543e3e2c62656e65666963696172798c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365242d012050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c7565350120697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e636520746865542070726f706f73616c20697320617761726465642e002c2023203c7765696768743e4c202d20436f6d706c65786974793a204f283129b4202d20446252656164733a206050726f706f73616c436f756e74602c20606f726967696e206163636f756e7460ec202d2044625772697465733a206050726f706f73616c436f756e74602c206050726f706f73616c73602c20606f726967696e206163636f756e7460302023203c2f7765696768743e3c72656a6563745f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e24fc2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e00ac204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656a6563744f726967696e602e002c2023203c7765696768743e4c202d20436f6d706c65786974793a204f283129d0202d20446252656164733a206050726f706f73616c73602c206072656a65637465642070726f706f736572206163636f756e7460d4202d2044625772697465733a206050726f706f73616c73602c206072656a65637465642070726f706f736572206163636f756e7460302023203c2f7765696768743e40617070726f76655f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e285d0120417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e6566696369617279ac20616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e00b0204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a417070726f76654f726967696e602e002c2023203c7765696768743e50202d20436f6d706c65786974793a204f2831292e90202d20446252656164733a206050726f706f73616c73602c2060417070726f76616c73605c202d20446257726974653a2060417070726f76616c7360302023203c2f7765696768743e387265706f72745f617765736f6d650818726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e7449644c5d01205265706f727420736f6d657468696e672060726561736f6e60207468617420646573657276657320612074697020616e6420636c61696d20616e79206576656e7475616c207468652066696e6465722773206665652e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005501205061796d656e743a20605469705265706f72744465706f73697442617365602077696c6c2062652072657365727665642066726f6d20746865206f726967696e206163636f756e742c2061732077656c6c206173d420605469705265706f72744465706f736974506572427974656020666f722065616368206279746520696e2060726561736f6e602e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743ecc202d20436f6d706c65786974793a20604f2852296020776865726520605260206c656e677468206f662060726561736f6e602e942020202d20656e636f64696e6720616e642068617368696e67206f662027726561736f6e27c4202d20446252656164733a2060526561736f6e73602c206054697073602c206077686f206163636f756e742064617461609c202d2044625772697465733a206054697073602c206077686f206163636f756e74206461746160302023203c2f7765696768743e2c726574726163745f7469700410686173681c543a3a486173684c550120526574726163742061207072696f72207469702d7265706f72742066726f6d20607265706f72745f617765736f6d65602c20616e642063616e63656c207468652070726f63657373206f662074697070696e672e00e0204966207375636365737366756c2c20746865206f726967696e616c206465706f7369742077696c6c20626520756e72657365727665642e00510120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642074686520746970206964656e746966696564206279206068617368604501206d7573742068617665206265656e207265706f7274656420627920746865207369676e696e67206163636f756e74207468726f75676820607265706f72745f617765736f6d65602028616e64206e6f7450207468726f75676820607469705f6e657760292e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e009020456d697473206054697052657472616374656460206966207375636365737366756c2e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960dc2020202d20446570656e6473206f6e20746865206c656e677468206f662060543a3a48617368602077686963682069732066697865642e90202d20446252656164733a206054697073602c20606f726967696e206163636f756e7460c0202d2044625772697465733a2060526561736f6e73602c206054697073602c20606f726967696e206163636f756e7460302023203c2f7765696768743e1c7469705f6e65770c18726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e744964247469705f76616c75653042616c616e63654f663c543e58f4204769766520612074697020666f7220736f6d657468696e67206e65773b206e6f2066696e6465722773206665652077696c6c2062652074616b656e2e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743e5501202d20436f6d706c65786974793a20604f2852202b2054296020776865726520605260206c656e677468206f662060726561736f6e602c2060546020697320746865206e756d626572206f6620746970706572732ec02020202d20604f285429603a206465636f64696e6720605469707065726020766563206f66206c656e6774682060546009012020202020605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e0d0120202020205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602ee42020202d20604f285229603a2068617368696e6720616e6420656e636f64696e67206f6620726561736f6e206f66206c656e6774682060526080202d20446252656164733a206054697070657273602c2060526561736f6e736078202d2044625772697465733a2060526561736f6e73602c20605469707360302023203c2f7765696768743e0c7469700810686173681c543a3a48617368247469705f76616c75653042616c616e63654f663c543e64b4204465636c6172652061207469702076616c756520666f7220616e20616c72656164792d6f70656e207469702e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f66207468652068617368206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279382020206163636f756e742049442e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e00650120456d6974732060546970436c6f73696e676020696620746865207468726573686f6c64206f66207469707065727320686173206265656e207265616368656420616e642074686520636f756e74646f776e20706572696f64342068617320737461727465642e002c2023203c7765696768743ee4202d20436f6d706c65786974793a20604f285429602077686572652060546020697320746865206e756d626572206f6620746970706572732e15012020206465636f64696e6720605469707065726020766563206f66206c656e677468206054602c20696e736572742074697020616e6420636865636b20636c6f73696e672c0101202020605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e05012020205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602e00610120202041637475616c6c792077656967687420636f756c64206265206c6f77657220617320697420646570656e6473206f6e20686f77206d616e7920746970732061726520696e20604f70656e5469706020627574206974d4202020697320776569676874656420617320696620616c6d6f73742066756c6c20692e65206f66206c656e6774682060542d31602e74202d20446252656164733a206054697070657273602c206054697073604c202d2044625772697465733a20605469707360302023203c2f7765696768743e24636c6f73655f7469700410686173681c543a3a48617368446020436c6f736520616e64207061796f75742061207469702e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0019012054686520746970206964656e74696669656420627920606861736860206d75737420686176652066696e69736865642069747320636f756e74646f776e20706572696f642e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e002c2023203c7765696768743ee4202d20436f6d706c65786974793a20604f285429602077686572652060546020697320746865206e756d626572206f6620746970706572732e9c2020206465636f64696e6720605469707065726020766563206f66206c656e677468206054602e0101202020605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e05012020205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602eac202d20446252656164733a206054697073602c206054697070657273602c20607469702066696e64657260dc202d2044625772697465733a2060526561736f6e73602c206054697073602c206054697070657273602c20607469702066696e64657260302023203c2f7765696768743e012c2050726f706f736564043450726f706f73616c496e646578047c204e65772070726f706f73616c2e205b70726f706f73616c5f696e6465785d205370656e64696e67041c42616c616e6365043501205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e205b6275646765745f72656d61696e696e675d1c417761726465640c3450726f706f73616c496e6465781c42616c616e6365244163636f756e74496404150120536f6d652066756e64732068617665206265656e20616c6c6f63617465642e205b70726f706f73616c5f696e6465782c2061776172642c2062656e65666963696172795d2052656a6563746564083450726f706f73616c496e6465781c42616c616e6365041d0120412070726f706f73616c207761732072656a65637465643b2066756e6473207765726520736c61736865642e205b70726f706f73616c5f696e6465782c20736c61736865645d144275726e74041c42616c616e636504a820536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e205b6275726e5d20526f6c6c6f766572041c42616c616e6365047d01205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e205b6275646765745f72656d61696e696e675d1c4465706f736974041c42616c616e636504a820536f6d652066756e64732068617665206265656e206465706f73697465642e205b6465706f7369745d184e657754697004104861736804c42041206e6577207469702073756767657374696f6e20686173206265656e206f70656e65642e205b7469705f686173685d28546970436c6f73696e670410486173680409012041207469702073756767657374696f6e206861732072656163686564207468726573686f6c6420616e6420697320636c6f73696e672e205b7469705f686173685d24546970436c6f7365640c1048617368244163636f756e7449641c42616c616e636504e82041207469702073756767657374696f6e20686173206265656e20636c6f7365642e205b7469705f686173682c2077686f2c207061796f75745d3054697052657472616374656404104861736804c02041207469702073756767657374696f6e20686173206265656e207265747261637465642e205b7469705f686173685d243050726f706f73616c426f6e641c5065726d696c6c1050c30000085501204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e110120416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e4c50726f706f73616c426f6e644d696e696d756d3042616c616e63654f663c543e4000407a10f35a00000000000000000000044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f6438543a3a426c6f636b4e756d6265721080700000048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e1c5065726d696c6c1020a107000411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e30546970436f756e74646f776e38543a3a426c6f636b4e756d62657210807000000445012054686520706572696f6420666f722077686963682061207469702072656d61696e73206f70656e20616674657220697320686173206163686965766564207468726573686f6c6420746970706572732e3454697046696e646572734665651c50657263656e7404140431012054686520616d6f756e74206f66207468652066696e616c2074697020776869636820676f657320746f20746865206f726967696e616c207265706f72746572206f6620746865207469702e505469705265706f72744465706f736974426173653042616c616e63654f663c543e4000407a10f35a0000000000000000000004d42054686520616d6f756e742068656c64206f6e206465706f73697420666f7220706c6163696e67206120746970207265706f72742e5c5469705265706f72744465706f736974506572427974653042616c616e63654f663c543e400010a5d4e800000000000000000000000409012054686520616d6f756e742068656c64206f6e206465706f7369742070657220627974652077697468696e2074686520746970207265706f727420726561736f6e2e204d6f64756c654964204d6f64756c6549642070792f7472737279041901205468652074726561737572792773206d6f64756c652069642c207573656420666f72206465726976696e672069747320736f7665726569676e206163636f756e742049442e2070496e73756666696369656e7450726f706f7365727342616c616e6365047c2050726f706f73657227732062616c616e636520697320746f6f206c6f772e50496e76616c696450726f706f73616c496e646578046c204e6f2070726f706f73616c206174207468617420696e6465782e30526561736f6e546f6f42696704882054686520726561736f6e20676976656e206973206a75737420746f6f206269672e30416c72656164794b6e6f776e048c20546865207469702077617320616c726561647920666f756e642f737461727465642e28556e6b6e6f776e54697004642054686520746970206861736820697320756e6b6e6f776e2e244e6f7446696e64657204210120546865206163636f756e7420617474656d7074696e6720746f20726574726163742074686520746970206973206e6f74207468652066696e646572206f6620746865207469702e245374696c6c4f70656e042d0120546865207469702063616e6e6f7420626520636c61696d65642f636c6f736564206265636175736520746865726520617265206e6f7420656e6f7567682074697070657273207965742e245072656d617475726504350120546865207469702063616e6e6f7420626520636c61696d65642f636c6f73656420626563617573652069742773207374696c6c20696e2074686520636f756e74646f776e20706572696f642e1124436f6e7472616374730124436f6e747261637473143c43757272656e745363686564756c650100205363686564756c6535020000000020a107000000000020a107000000000020a107000000000020a107000000000020a107000000000020a107000000000020a1070000000000e0f7050400000000e024370500000000e0f705040000000020a107000000000020a107000000000080f0fa020000000000e1f505000000000400000000000100100000000040000000200000000000080004942043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e305072697374696e65436f64650001062c436f6465486173683c543e1c5665633c75383e0004000465012041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2c436f646553746f726167650001062c436f6465486173683c543e587761736d3a3a5072656661625761736d4d6f64756c650004000465012041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f7220657865637574696f6e2e384163636f756e74436f756e74657201000c753634200000000000000000045420546865207375627472696520636f756e7465722e38436f6e7472616374496e666f4f6600010530543a3a4163636f756e7449643c436f6e7472616374496e666f3c543e0004000ca82054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e01143c7570646174655f7363686564756c6504207363686564756c65205363686564756c650cb4205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e000d0120546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e207075745f636f64650410636f64651c5665633c75383e085d012053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e27732073746f7261676520616e642072657475726e73206974732060636f646568617368602ed420596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e1063616c6c1010646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e246761735f6c696d697430436f6d706163743c4761733e10646174611c5665633c75383e1c0901204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e002901202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c206265b020657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e1901202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e4901202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c1501206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e2c696e7374616e74696174651024656e646f776d656e7454436f6d706163743c42616c616e63654f663c543e3e246761735f6c696d697430436f6d706163743c4761733e24636f64655f686173682c436f6465486173683c543e10646174611c5665633c75383e28bd0120496e7374616e7469617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e009820496e7374616e74696174696f6e20697320657865637574656420617320666f6c6c6f77733a004101202d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e0501202d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e6d01202d20546865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e204275666665722072657475726e65645d0120202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b6564a820202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e7c202d2054686520636f6e747261637420697320696e697469616c697a65642e3c636c61696d5f73757263686172676508106465737430543a3a4163636f756e744964286175785f73656e646572504f7074696f6e3c543a3a4163636f756e7449643e14710120416c6c6f777320626c6f636b2070726f64756365727320746f20636c61696d206120736d616c6c2072657761726420666f72206576696374696e67206120636f6e74726163742e204966206120626c6f636b2070726f64756365721501206661696c7320746f20646f20736f2c206120726567756c61722075736572732077696c6c20626520616c6c6f77656420746f20636c61696d20746865207265776172642e00390120496620636f6e7472616374206973206e6f742065766963746564206173206120726573756c74206f6620746869732063616c6c2c206e6f20616374696f6e73206172652074616b656e20616e64ac207468652073656e646572206973206e6f7420656c696769626c6520666f7220746865207265776172642e011830496e7374616e74696174656408244163636f756e744964244163636f756e74496404250120436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e205b6f776e65722c20636f6e74726163745d1c4576696374656408244163636f756e74496410626f6f6c1ce420436f6e747261637420686173206265656e206576696374656420616e64206973206e6f7720696e20746f6d6273746f6e652073746174652e58205b636f6e74726163742c20746f6d6273746f6e655d042024202320506172616d73000d01202d2060636f6e7472616374603a20604163636f756e744964603a20546865206163636f756e74204944206f6620746865206576696374656420636f6e74726163742e3501202d2060746f6d6273746f6e65603a2060626f6f6c603a205472756520696620746865206576696374656420636f6e7472616374206c65667420626568696e64206120746f6d6273746f6e652e20526573746f72656410244163636f756e744964244163636f756e74496410486173681c42616c616e636524c020526573746f726174696f6e20666f72206120636f6e747261637420686173206265656e207375636365737366756c2ea4205b646f6e6f722c20646573742c20636f64655f686173682c2072656e745f616c6c6f77616e63655d042024202320506172616d7300f4202d2060646f6e6f72603a20604163636f756e744964603a204163636f756e74204944206f662074686520726573746f72696e6720636f6e7472616374ec202d206064657374603a20604163636f756e744964603a204163636f756e74204944206f662074686520726573746f72656420636f6e7472616374e8202d2060636f64655f68617368603a206048617368603a20436f64652068617368206f662074686520726573746f72656420636f6e74726163741901202d206072656e745f616c6c6f77616e63653a206042616c616e6365603a2052656e7420616c6c6f77616e6365206f662074686520726573746f72656420636f6e747261637428436f646553746f72656404104861736808b820436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e30205b636f64655f686173685d3c5363686564756c6555706461746564040c75333204c820547269676765726564207768656e207468652063757272656e74205b7363686564756c655d20697320757064617465642e44436f6e7472616374457865637574696f6e08244163636f756e7449641c5665633c75383e08090120416e206576656e74206465706f73697465642075706f6e20657865637574696f6e206f66206120636f6e74726163742066726f6d20746865206163636f756e742e40205b6163636f756e742c20646174615d204c5369676e6564436c61696d48616e646963617038543a3a426c6f636b4e756d626572100200000010e0204e756d626572206f6620626c6f636b2064656c617920616e2065787472696e73696320636c61696d20737572636861726765206861732e000d01205768656e20636c61696d207375726368617267652069732063616c6c656420627920616e2065787472696e736963207468652072656e7420697320636865636b65646820666f722063757272656e745f626c6f636b202d2064656c617940546f6d6273746f6e654465706f7369743042616c616e63654f663c543e4000a0acb903000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f2067656e6572617465206120746f6d6273746f6e652e4453746f7261676553697a654f66667365740c753332100800000018710120412073697a65206f666673657420666f7220616e20636f6e74726163742e2041206a7573742063726561746564206163636f756e74207769746820756e746f75636865642073746f726167652077696c6c20686176652074686174e0206d756368206f662073746f726167652066726f6d20746865207065727370656374697665206f66207468652073746174652072656e742e006101205468697320697320612073696d706c652077617920746f20656e73757265207468617420636f6e747261637473207769746820656d7074792073746f72616765206576656e7475616c6c79206765742064656c657465646501206279206d616b696e67207468656d207061792072656e742e2054686973206372656174657320616e20696e63656e7469766520746f2072656d6f7665207468656d206561726c7920696e206f7264657220746f2073617665182072656e742e2c52656e74427974654665653042616c616e63654f663c543e4000286bee000000000000000000000000043501205072696365206f6620612062797465206f662073746f7261676520706572206f6e6520626c6f636b20696e74657276616c2e2053686f756c642062652067726561746572207468616e20302e4452656e744465706f7369744f66667365743042616c616e63654f663c543e400010a5d4e800000000000000000000001c05012054686520616d6f756e74206f662066756e6473206120636f6e74726163742073686f756c64206465706f73697420696e206f7264657220746f206f6666736574582074686520636f7374206f66206f6e6520627974652e006901204c6574277320737570706f736520746865206465706f73697420697320312c303030204255202862616c616e636520756e697473292f6279746520616e64207468652072656e7420697320312042552f627974652f6461792c5901207468656e206120636f6e7472616374207769746820312c3030302c3030302042552074686174207573657320312c303030206279746573206f662073746f7261676520776f756c6420706179206e6f2072656e742e4d0120427574206966207468652062616c616e6365207265647563656420746f203530302c30303020425520616e64207468652073746f7261676520737461796564207468652073616d6520617420312c3030302c78207468656e20697420776f756c6420706179203530302042552f6461792e3c5375726368617267655265776172643042616c616e63654f663c543e40005cb2ec22000000000000000000000008e4205265776172642074686174206973207265636569766564206279207468652070617274792077686f736520746f75636820686173206c65646820746f2072656d6f76616c206f66206120636f6e74726163742e204d617844657074680c753332102000000008310120546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f696e7374616e746961746520737461636b2e204120726561736f6e61626c652064656661756c74382076616c7565206973203130302e304d617856616c756553697a650c753332100040000004390120546865206d6178696d756d2073697a65206f6620612073746f726167652076616c756520696e2062797465732e204120726561736f6e61626c652064656661756c74206973203136204b69422e4858496e76616c69645363686564756c6556657273696f6e0405012041206e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652063757272656e74206f6e652e54496e76616c6964537572636861726765436c61696d04550120416e206f726967696e206d757374206265207369676e6564206f7220696e686572656e7420616e6420617578696c696172792073656e646572206f6e6c792070726f7669646564206f6e20696e686572656e742e54496e76616c6964536f75726365436f6e747261637404dc2043616e6e6f7420726573746f72652066726f6d206e6f6e6578697374696e67206f7220746f6d6273746f6e6520636f6e74726163742e68496e76616c696444657374696e6174696f6e436f6e747261637404c42043616e6e6f7420726573746f726520746f206e6f6e6578697374696e67206f7220616c69766520636f6e74726163742e40496e76616c6964546f6d6273746f6e65046020546f6d6273746f6e657320646f6e2774206d617463682e54496e76616c6964436f6e74726163744f726967696e04bc20416e206f726967696e20547269654964207772697474656e20696e207468652063757272656e7420626c6f636b2e204f75744f6647617304bc2054686520657865637574656420636f6e7472616374206578686175737465642069747320676173206c696d69742e504f7574707574427566666572546f6f536d616c6c04050120546865206f75747075742062756666657220737570706c69656420746f206120636f6e7472616374204150492063616c6c2077617320746f6f20736d616c6c2e6442656c6f7753756273697374656e63655468726573686f6c6410210120506572666f726d696e672074686520726571756573746564207472616e7366657220776f756c6420686176652062726f756768742074686520636f6e74726163742062656c6f773d01207468652073756273697374656e6365207468726573686f6c642e204e6f207472616e7366657220697320616c6c6f77656420746f20646f207468697320696e206f7264657220746f20616c6c6f77450120666f72206120746f6d6273746f6e6520746f20626520637265617465642e2055736520607365616c5f7465726d696e6174656020746f2072656d6f7665206120636f6e747261637420776974686f757470206c656176696e67206120746f6d6273746f6e6520626568696e642e504e6577436f6e74726163744e6f7446756e64656408390120546865206e65776c79206372656174656420636f6e74726163742069732062656c6f77207468652073756273697374656e6365207468726573686f6c6420616674657220657865637574696e6721012069747320636f6e74727563746f722e204e6f20636f6e7472616374732061726520616c6c6f77656420746f2065786973742062656c6f772074686174207468726573686f6c642e385472616e736665724661696c65640c250120506572666f726d696e672074686520726571756573746564207472616e73666572206661696c656420666f72206120726561736f6e206f726967696e6174696e6720696e2074686531012063686f73656e2063757272656e637920696d706c656d656e746174696f6e206f66207468652072756e74696d652e204d6f73742070726f6261626c79207468652062616c616e63652069738c20746f6f206c6f77206f72206c6f636b732061726520706c61636564206f6e2069742e4c4d617843616c6c44657074685265616368656408250120506572666f726d696e6720612063616c6c207761732064656e6965642062656361757365207468652063616c6c696e67206465707468207265616368656420746865206c696d697498206f6620776861742069732073706563696669656420696e20746865207363686564756c652e2c4e6f7443616c6c61626c650831012054686520636f6e74726163742074686174207761732063616c6c656420697320656974686572206e6f20636f6e747261637420617420616c6c20286120706c61696e206163636f756e74294c206f72206973206120746f6d6273746f6e652e30436f6465546f6f4c617267650455012054686520636f646520737570706c69656420746f20607075745f636f646560206578636565647320746865206c696d69742073706563696669656420696e207468652063757272656e74207363686564756c652e30436f64654e6f74466f756e6404c8204e6f20636f646520636f756c6420626520666f756e642061742074686520737570706c69656420636f646520686173682e2c4f75744f66426f756e6473042901204120627566666572206f757473696465206f662073616e64626f78206d656d6f7279207761732070617373656420746f206120636f6e7472616374204150492066756e6374696f6e2e384465636f64696e674661696c6564042d0120496e7075742070617373656420746f206120636f6e7472616374204150492066756e6374696f6e206661696c656420746f206465636f646520617320657870656374656420747970652e3c436f6e747261637454726170706564048c20436f6e7472616374207472617070656420647572696e6720657865637574696f6e2e12105375646f01105375646f040c4b6579010030543a3a4163636f756e74496480000000000000000000000000000000000000000000000000000000000000000004842054686520604163636f756e74496460206f6620746865207375646f206b65792e0110107375646f041063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e2839012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e60202d204f6e6520444220777269746520286576656e74292ec8202d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e302023203c2f7765696768743e547375646f5f756e636865636b65645f776569676874081063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e1c5f776569676874185765696768742839012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e310120546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865b4205375646f207573657220746f20737065636966792074686520776569676874206f66207468652063616c6c2e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292ed0202d2054686520776569676874206f6620746869732063616c6c20697320646566696e6564206279207468652063616c6c65722e302023203c2f7765696768743e1c7365745f6b6579040c6e65778c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652475012041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e44202d204f6e65204442206368616e67652e302023203c2f7765696768743e1c7375646f5f6173080c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e2c51012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d44206120676976656e206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e60202d204f6e6520444220777269746520286576656e74292ec8202d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e302023203c2f7765696768743e010c14537564696404384469737061746368526573756c7404842041207375646f206a75737420746f6f6b20706c6163652e205b726573756c745d284b65794368616e67656404244163636f756e74496404f820546865205b7375646f65725d206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e285375646f4173446f6e650410626f6f6c04842041207375646f206a75737420746f6f6b20706c6163652e205b726573756c745d00042c526571756972655375646f04802053656e646572206d75737420626520746865205375646f206163636f756e741320496d4f6e6c696e650120496d4f6e6c696e6510384865617274626561744166746572010038543a3a426c6f636b4e756d62657210000000001831012054686520626c6f636b206e756d6265722061667465722077686963682069742773206f6b20746f2073656e64206865617274626561747320696e2063757272656e742073657373696f6e2e0011012041742074686520626567696e6e696e67206f6620656163682073657373696f6e20776520736574207468697320746f20612076616c756520746861742073686f756c64d02066616c6c20726f7567686c7920696e20746865206d6964646c65206f66207468652073657373696f6e206475726174696f6e2e010120546865206964656120697320746f206669727374207761697420666f72207468652076616c696461746f727320746f2070726f64756365206120626c6f636b390120696e207468652063757272656e742073657373696f6e2c20736f20746861742074686520686561727462656174206c61746572206f6e2077696c6c206e6f74206265206e65636573736172792e104b65797301004c5665633c543a3a417574686f7269747949643e040004d0205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e485265636569766564486561727462656174730002053053657373696f6e496e6465782441757468496e6465781c5665633c75383e05040008f020466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206041757468496e6465786020746f8020606f6666636861696e3a3a4f70617175654e6574776f726b5374617465602e38417574686f726564426c6f636b730102053053657373696f6e496e64657838543a3a56616c696461746f7249640c75333205100000000008150120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f662060543a3a56616c696461746f7249646020746f20746865c8206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e0104246865617274626561740824686561727462656174644865617274626561743c543a3a426c6f636b4e756d6265723e285f7369676e6174757265bc3c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e6174757265282c2023203c7765696768743e2101202d20436f6d706c65786974793a20604f284b202b20452960207768657265204b206973206c656e677468206f6620604b6579736020616e642045206973206c656e677468206f66b4202020604865617274626561742e6e6574776f726b5f73746174652e65787465726e616c5f6164647265737360008c2020202d20604f284b29603a206465636f64696e67206f66206c656e67746820604b60b02020202d20604f284529603a206465636f64696e672f656e636f64696e67206f66206c656e677468206045603d01202d20446252656164733a2070616c6c65745f73657373696f6e206056616c696461746f7273602c2070616c6c65745f73657373696f6e206043757272656e74496e646578602c20604b657973602c5c202020605265636569766564486561727462656174736084202d2044625772697465733a206052656365697665644865617274626561747360302023203c2f7765696768743e010c444865617274626561745265636569766564042c417574686f72697479496404fc2041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f72697479496460205b617574686f726974795f69645d1c416c6c476f6f640004d42041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2c536f6d654f66666c696e6504605665633c4964656e74696669636174696f6e5475706c653e0435012041742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e652076616c696461746f722077617320666f756e6420746f206265205b6f66666c696e655d2e000828496e76616c69644b65790464204e6f6e206578697374656e74207075626c6963206b65792e4c4475706c6963617465644865617274626561740458204475706c696361746564206865617274626561742e1448417574686f72697479446973636f7665727900010000000015204f6666656e63657301204f6666656e636573101c5265706f727473000105345265706f727449644f663c543ed04f6666656e636544657461696c733c543a3a4163636f756e7449642c20543a3a4964656e74696669636174696f6e5475706c653e00040004490120546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e4044656665727265644f6666656e6365730100645665633c44656665727265644f6666656e63654f663c543e3e0400086501204465666572726564207265706f72747320746861742068617665206265656e2072656a656374656420627920746865206f6666656e63652068616e646c657220616e64206e65656420746f206265207375626d6974746564442061742061206c617465722074696d652e58436f6e63757272656e745265706f727473496e646578010205104b696e64384f706171756554696d65536c6f74485665633c5265706f727449644f663c543e3e050400042901204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e485265706f72747342794b696e64496e646578010105104b696e641c5665633c75383e00040018110120456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e00bc20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e004901204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f66690120646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e010001041c4f6666656e63650c104b696e64384f706171756554696d65536c6f7410626f6f6c10550120546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e644d0120286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e206c6173741d0120656c656d656e7420696e64696361746573206f6620746865206f6666656e636520776173206170706c69656420287472756529206f7220717565756564202866616c736529206c205b6b696e642c2074696d65736c6f742c206170706c6965645d2e00001628486973746f726963616c0000000000176052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100305665633c543a3a486173683e04000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e010000000018204964656e7469747901204964656e7469747910284964656e746974794f6600010530543a3a4163636f756e74496468526567697374726174696f6e3c42616c616e63654f663c543e3e0004000c210120496e666f726d6174696f6e20746861742069732070657274696e656e7420746f206964656e746966792074686520656e7469747920626568696e6420616e206163636f756e742e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e1c53757065724f6600010230543a3a4163636f756e7449645028543a3a4163636f756e7449642c204461746129000400086101205468652073757065722d6964656e74697479206f6620616e20616c7465726e6174697665202273756222206964656e7469747920746f676574686572207769746820697473206e616d652c2077697468696e2074686174510120636f6e746578742e20496620746865206163636f756e74206973206e6f7420736f6d65206f74686572206163636f756e742773207375622d6964656e746974792c207468656e206a75737420604e6f6e65602e18537562734f6601010530543a3a4163636f756e744964842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e290044000000000000000000000000000000000014b820416c7465726e6174697665202273756222206964656e746974696573206f662074686973206163636f756e742e001d0120546865206669727374206974656d20697320746865206465706f7369742c20746865207365636f6e64206973206120766563746f72206f6620746865206163636f756e74732e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e28526567697374726172730100d85665633c4f7074696f6e3c526567697374726172496e666f3c42616c616e63654f663c543e2c20543a3a4163636f756e7449643e3e3e0400104d012054686520736574206f6620726567697374726172732e204e6f7420657870656374656420746f206765742076657279206269672061732063616e206f6e6c79206265206164646564207468726f7567682061a8207370656369616c206f726967696e20286c696b656c79206120636f756e63696c206d6f74696f6e292e0029012054686520696e64657820696e746f20746869732063616e206265206361737420746f2060526567697374726172496e6465786020746f2067657420612076616c69642076616c75652e013c346164645f726567697374726172041c6163636f756e7430543a3a4163636f756e744964347c2041646420612072656769737472617220746f207468652073797374656d2e00010120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060543a3a5265676973747261724f726967696e602e00ac202d20606163636f756e74603a20746865206163636f756e74206f6620746865207265676973747261722e009820456d6974732060526567697374726172416464656460206966207375636365737366756c2e002c2023203c7765696768743e2901202d20604f2852296020776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e64656420616e6420636f64652d626f756e646564292e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e307365745f6964656e746974790410696e666f304964656e74697479496e666f4c2d012053657420616e206163636f756e742773206964656e7469747920696e666f726d6174696f6e20616e6420726573657276652074686520617070726f707269617465206465706f7369742e00590120496620746865206163636f756e7420616c726561647920686173206964656e7469747920696e666f726d6174696f6e2c20746865206465706f7369742069732074616b656e2061732070617274207061796d656e745420666f7220746865206e6577206465706f7369742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0090202d2060696e666f603a20546865206964656e7469747920696e666f726d6174696f6e2e008c20456d69747320604964656e7469747953657460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2858202b205827202b2052296021012020202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e64656429e42020202d20776865726520605260206a756467656d656e74732d636f756e7420287265676973747261722d636f756e742d626f756e6465642984202d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e2501202d204f6e652073746f72616765206d75746174696f6e2028636f6465632d7265616420604f285827202b205229602c20636f6465632d777269746520604f2858202b20522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e207365745f73756273041073756273645665633c28543a3a4163636f756e7449642c2044617461293e54902053657420746865207375622d6163636f756e7473206f66207468652073656e6465722e005901205061796d656e743a20416e79206167677265676174652062616c616e63652072657365727665642062792070726576696f757320607365745f73756273602063616c6c732077696c6c2062652072657475726e6564310120616e6420616e20616d6f756e7420605375624163636f756e744465706f736974602077696c6c20626520726573657276656420666f722065616368206974656d20696e206073756273602e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e00b4202d206073756273603a20546865206964656e74697479277320286e657729207375622d6163636f756e74732e002c2023203c7765696768743e34202d20604f2850202b20532960e82020202d20776865726520605060206f6c642d737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292ed82020202d2077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e88202d204174206d6f7374206f6e652062616c616e6365206f7065726174696f6e732e18202d2044423ae02020202d206050202b2053602073746f72616765206d75746174696f6e732028636f64656320636f6d706c657869747920604f2831296029c02020202d204f6e652073746f7261676520726561642028636f64656320636f6d706c657869747920604f28502960292ec42020202d204f6e652073746f726167652077726974652028636f64656320636f6d706c657869747920604f28532960292ed42020202d204f6e652073746f726167652d6578697374732028604964656e746974794f663a3a636f6e7461696e735f6b657960292e302023203c2f7765696768743e38636c6561725f6964656e7469747900483d0120436c65617220616e206163636f756e742773206964656e7469747920696e666f20616e6420616c6c207375622d6163636f756e747320616e642072657475726e20616c6c206465706f736974732e00f0205061796d656e743a20416c6c2072657365727665642062616c616e636573206f6e20746865206163636f756e74206172652072657475726e65642e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e009c20456d69747320604964656e74697479436c656172656460206966207375636365737366756c2e002c2023203c7765696768743e44202d20604f2852202b2053202b20582960d02020202d20776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e646564292ed82020202d2077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e25012020202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e646564292e8c202d204f6e652062616c616e63652d756e72657365727665206f7065726174696f6e2ecc202d206032602073746f7261676520726561647320616e64206053202b2032602073746f726167652064656c6574696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e44726571756573745f6a756467656d656e7408247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e1c6d61785f66656554436f6d706163743c42616c616e63654f663c543e3e5c9820526571756573742061206a756467656d656e742066726f6d2061207265676973747261722e005901205061796d656e743a204174206d6f737420606d61785f666565602077696c6c20626520726573657276656420666f72207061796d656e7420746f2074686520726567697374726172206966206a756467656d656e741c20676976656e2e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e002101202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973207265717565737465642e5901202d20606d61785f666565603a20546865206d6178696d756d206665652074686174206d617920626520706169642e20546869732073686f756c64206a757374206265206175746f2d706f70756c617465642061733a0034206060606e6f636f6d70696c65bc2053656c663a3a7265676973747261727328292e676574287265675f696e646578292e756e7772617028292e666565102060606000a820456d69747320604a756467656d656e7452657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2858202b205229602e34202d204f6e65206576656e742e302023203c2f7765696768743e3863616e63656c5f7265717565737404247265675f696e64657838526567697374726172496e646578446c2043616e63656c20612070726576696f757320726571756573742e00fc205061796d656e743a20412070726576696f75736c79207265736572766564206465706f7369742069732072657475726e6564206f6e20737563636573732e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e004901202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206e6f206c6f6e676572207265717565737465642e00b020456d69747320604a756467656d656e74556e72657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e8c202d204f6e652073746f72616765206d75746174696f6e20604f2852202b205829602e30202d204f6e65206576656e74302023203c2f7765696768743e1c7365745f6665650814696e6465785c436f6d706163743c526567697374726172496e6465783e0c66656554436f6d706163743c42616c616e63654f663c543e3e341d0120536574207468652066656520726571756972656420666f722061206a756467656d656e7420746f206265207265717565737465642066726f6d2061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e58202d2060666565603a20746865206e6577206665652e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602ee8202d2042656e63686d61726b3a20372e333135202b2052202a20302e33323920c2b57320286d696e207371756172657320616e616c7973697329302023203c2f7765696768743e387365745f6163636f756e745f69640814696e6465785c436f6d706163743c526567697374726172496e6465783e0c6e657730543a3a4163636f756e74496434c0204368616e676520746865206163636f756e74206173736f63696174656420776974682061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e74202d20606e6577603a20746865206e6577206163636f756e742049442e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602ee4202d2042656e63686d61726b3a20382e383233202b2052202a20302e333220c2b57320286d696e207371756172657320616e616c7973697329302023203c2f7765696768743e287365745f6669656c64730814696e6465785c436f6d706163743c526567697374726172496e6465783e186669656c6473384964656e746974794669656c647334ac2053657420746865206669656c6420696e666f726d6174696f6e20666f722061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e1101202d20606669656c6473603a20746865206669656c64732074686174207468652072656769737472617220636f6e6365726e73207468656d73656c76657320776974682e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602ee8202d2042656e63686d61726b3a20372e343634202b2052202a20302e33323520c2b57320286d696e207371756172657320616e616c7973697329302023203c2f7765696768743e4470726f766964655f6a756467656d656e740c247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365246a756467656d656e745c4a756467656d656e743c42616c616e63654f663c543e3e4cbc2050726f766964652061206a756467656d656e7420666f7220616e206163636f756e742773206964656e746974792e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74b4206f6620746865207265676973747261722077686f736520696e64657820697320607265675f696e646578602e002501202d20607265675f696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206265696e67206d6164652e5901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e4d01202d20606a756467656d656e74603a20746865206a756467656d656e74206f662074686520726567697374726172206f6620696e64657820607265675f696e646578602061626f75742060746172676574602e009820456d69747320604a756467656d656e74476976656e60206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e88202d204f6e652062616c616e63652d7472616e73666572206f7065726174696f6e2e98202d20557020746f206f6e65206163636f756e742d6c6f6f6b7570206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2852202b205829602e34202d204f6e65206576656e742e302023203c2f7765696768743e346b696c6c5f6964656e7469747904187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654c45012052656d6f766520616e206163636f756e742773206964656e7469747920616e64207375622d6163636f756e7420696e666f726d6174696f6e20616e6420736c61736820746865206465706f736974732e006501205061796d656e743a2052657365727665642062616c616e6365732066726f6d20607365745f737562736020616e6420607365745f6964656e74697479602061726520736c617368656420616e642068616e646c656420627949012060536c617368602e20566572696669636174696f6e2072657175657374206465706f7369747320617265206e6f742072657475726e65643b20746865792073686f756c642062652063616e63656c6c656484206d616e75616c6c79207573696e67206063616e63656c5f72657175657374602e00fc20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206d617463682060543a3a466f7263654f726967696e602e005901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e009820456d69747320604964656e746974794b696c6c656460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2852202b2053202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e74202d206053202b2032602073746f72616765206d75746174696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e1c6164645f737562080c7375628c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365106461746110446174611cb0204164642074686520676976656e206163636f756e7420746f207468652073656e646572277320737562732e006101205061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c2062652072657061747269617465643c20746f207468652073656e6465722e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573742068617665206120726567697374657265645c20737562206964656e74697479206f662060737562602e2872656e616d655f737562080c7375628c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651064617461104461746110d020416c74657220746865206173736f636961746564206e616d65206f662074686520676976656e207375622d6163636f756e742e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573742068617665206120726567697374657265645c20737562206964656e74697479206f662060737562602e2872656d6f76655f737562040c7375628c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651cc42052656d6f76652074686520676976656e206163636f756e742066726f6d207468652073656e646572277320737562732e006101205061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c2062652072657061747269617465643c20746f207468652073656e6465722e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573742068617665206120726567697374657265645c20737562206964656e74697479206f662060737562602e20717569745f7375620028902052656d6f7665207468652073656e6465722061732061207375622d6163636f756e742e006101205061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c206265207265706174726961746564b820746f207468652073656e64657220282a6e6f742a20746865206f726967696e616c206465706f7369746f72292e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206861766520612072656769737465726564402073757065722d6964656e746974792e004901204e4f54453a20546869732073686f756c64206e6f74206e6f726d616c6c7920626520757365642c206275742069732070726f766964656420696e207468652063617365207468617420746865206e6f6e2d150120636f6e74726f6c6c6572206f6620616e206163636f756e74206973206d616c6963696f75736c7920726567697374657265642061732061207375622d6163636f756e742e01282c4964656e7469747953657404244163636f756e7449640409012041206e616d652077617320736574206f72207265736574202877686963682077696c6c2072656d6f766520616c6c206a756467656d656e7473292e205b77686f5d3c4964656e74697479436c656172656408244163636f756e7449641c42616c616e6365040d012041206e616d652077617320636c65617265642c20616e642074686520676976656e2062616c616e63652072657475726e65642e205b77686f2c206465706f7369745d384964656e746974794b696c6c656408244163636f756e7449641c42616c616e63650405012041206e616d65207761732072656d6f76656420616e642074686520676976656e2062616c616e636520736c61736865642e205b77686f2c206465706f7369745d484a756467656d656e7452657175657374656408244163636f756e74496438526567697374726172496e64657804fc2041206a756467656d656e74207761732061736b65642066726f6d2061207265676973747261722e205b77686f2c207265676973747261725f696e6465785d504a756467656d656e74556e72657175657374656408244163636f756e74496438526567697374726172496e64657804e82041206a756467656d656e74207265717565737420776173207265747261637465642e205b77686f2c207265676973747261725f696e6465785d384a756467656d656e74476976656e08244163636f756e74496438526567697374726172496e6465780401012041206a756467656d656e742077617320676976656e2062792061207265676973747261722e205b7461726765742c207265676973747261725f696e6465785d3852656769737472617241646465640438526567697374726172496e64657804a4204120726567697374726172207761732061646465642e205b7265676973747261725f696e6465785d405375624964656e7469747941646465640c244163636f756e744964244163636f756e7449641c42616c616e6365044d012041207375622d6964656e746974792077617320616464656420746f20616e206964656e7469747920616e6420746865206465706f73697420706169642e205b7375622c206d61696e2c206465706f7369745d485375624964656e7469747952656d6f7665640c244163636f756e744964244163636f756e7449641c42616c616e6365080d012041207375622d6964656e74697479207761732072656d6f7665642066726f6d20616e206964656e7469747920616e6420746865206465706f7369742066726565642e54205b7375622c206d61696e2c206465706f7369745d485375624964656e746974795265766f6b65640c244163636f756e744964244163636f756e7449641c42616c616e6365081d012041207375622d6964656e746974792077617320636c65617265642c20616e642074686520676976656e206465706f7369742072657061747269617465642066726f6d207468652101206d61696e206964656e74697479206163636f756e7420746f20746865207375622d6964656e74697479206163636f756e742e205b7375622c206d61696e2c206465706f7369745d183042617369634465706f7369743042616c616e63654f663c543e400080c6a47e8d0300000000000000000004d82054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564206964656e746974792e304669656c644465706f7369743042616c616e63654f663c543e4000a031a95fe300000000000000000000042d012054686520616d6f756e742068656c64206f6e206465706f73697420706572206164646974696f6e616c206669656c6420666f7220612072656769737465726564206964656e746974792e445375624163636f756e744465706f7369743042616c616e63654f663c543e400080f420e6b5000000000000000000000c65012054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564207375626163636f756e742e20546869732073686f756c64206163636f756e7420666f7220746865206661637471012074686174206f6e652073746f72616765206974656d27732076616c75652077696c6c20696e637265617365206279207468652073697a65206f6620616e206163636f756e742049442c20616e642074686572652077696c6c206265290120616e6f746865722074726965206974656d2077686f73652076616c7565206973207468652073697a65206f6620616e206163636f756e7420494420706c75732033322062797465732e384d61785375624163636f756e74730c7533321064000000040d0120546865206d6178696d756d206e756d626572206f66207375622d6163636f756e747320616c6c6f77656420706572206964656e746966696564206163636f756e742e4c4d61784164646974696f6e616c4669656c64730c7533321064000000086501204d6178696d756d206e756d626572206f66206164646974696f6e616c206669656c64732074686174206d61792062652073746f72656420696e20616e2049442e204e656564656420746f20626f756e642074686520492f4fe020726571756972656420746f2061636365737320616e206964656e746974792c206275742063616e2062652070726574747920686967682e344d6178526567697374726172730c7533321014000000085101204d61786d696d756d206e756d626572206f66207265676973747261727320616c6c6f77656420696e207468652073797374656d2e204e656564656420746f20626f756e642074686520636f6d706c65786974797c206f662c20652e672e2c207570646174696e67206a756467656d656e74732e4048546f6f4d616e795375624163636f756e7473046020546f6f206d616e7920737562732d6163636f756e74732e204e6f74466f756e640454204163636f756e742069736e277420666f756e642e204e6f744e616d65640454204163636f756e742069736e2774206e616d65642e28456d707479496e646578043420456d70747920696e6465782e284665654368616e676564044020466565206973206368616e6765642e284e6f4964656e74697479044c204e6f206964656e7469747920666f756e642e3c537469636b794a756467656d656e74044820537469636b79206a756467656d656e742e384a756467656d656e74476976656e0444204a756467656d656e7420676976656e2e40496e76616c69644a756467656d656e74044c20496e76616c6964206a756467656d656e742e30496e76616c6964496e64657804582054686520696e64657820697320696e76616c69642e34496e76616c6964546172676574045c205468652074617267657420697320696e76616c69642e34546f6f4d616e794669656c6473047020546f6f206d616e79206164646974696f6e616c206669656c64732e44546f6f4d616e795265676973747261727304ec204d6178696d756d20616d6f756e74206f66207265676973747261727320726561636865642e2043616e6e6f742061646420616e79206d6f72652e38416c7265616479436c61696d65640474204163636f756e7420494420697320616c7265616479206e616d65642e184e6f7453756204742053656e646572206973206e6f742061207375622d6163636f756e742e204e6f744f776e6564048c205375622d6163636f756e742069736e2774206f776e65642062792073656e6465722e191c536f6369657479011c536f6369657479401c466f756e646572000030543a3a4163636f756e7449640400044820546865206669727374206d656d6265722e1452756c657300001c543a3a48617368040008510120412068617368206f66207468652072756c6573206f66207468697320736f636965747920636f6e6365726e696e67206d656d626572736869702e2043616e206f6e6c7920626520736574206f6e636520616e6454206f6e6c792062792074686520666f756e6465722e2843616e6469646174657301009c5665633c4269643c543a3a4163636f756e7449642c2042616c616e63654f663c542c20493e3e3e0400043901205468652063757272656e7420736574206f662063616e646964617465733b206269646465727320746861742061726520617474656d7074696e6720746f206265636f6d65206d656d626572732e4c53757370656e64656443616e6469646174657300010530543a3a4163636f756e744964e42842616c616e63654f663c542c20493e2c204269644b696e643c543a3a4163636f756e7449642c2042616c616e63654f663c542c20493e3e2900040004842054686520736574206f662073757370656e6465642063616e646964617465732e0c506f7401003c42616c616e63654f663c542c20493e400000000000000000000000000000000004410120416d6f756e74206f66206f7572206163636f756e742062616c616e63652074686174206973207370656369666963616c6c7920666f7220746865206e65787420726f756e642773206269642873292e1048656164000030543a3a4163636f756e744964040004e820546865206d6f7374207072696d6172792066726f6d20746865206d6f737420726563656e746c7920617070726f766564206d656d626572732e1c4d656d626572730100445665633c543a3a4163636f756e7449643e04000494205468652063757272656e7420736574206f66206d656d626572732c206f7264657265642e4053757370656e6465644d656d6265727301010530543a3a4163636f756e74496410626f6f6c00040004782054686520736574206f662073757370656e646564206d656d626572732e104269647301009c5665633c4269643c543a3a4163636f756e7449642c2042616c616e63654f663c542c20493e3e3e040004e8205468652063757272656e7420626964732c2073746f726564206f726465726564206279207468652076616c7565206f6620746865206269642e20566f756368696e6700010530543a3a4163636f756e74496438566f756368696e6753746174757300040004e4204d656d626572732063757272656e746c7920766f756368696e67206f722062616e6e65642066726f6d20766f756368696e6720616761696e1c5061796f75747301010530543a3a4163636f756e744964985665633c28543a3a426c6f636b4e756d6265722c2042616c616e63654f663c542c20493e293e000400044d012050656e64696e67207061796f7574733b206f72646572656420627920626c6f636b206e756d6265722c20776974682074686520616d6f756e7420746861742073686f756c642062652070616964206f75742e1c537472696b657301010530543a3a4163636f756e7449642c537472696b65436f756e7400100000000004dc20546865206f6e676f696e67206e756d626572206f66206c6f73696e6720766f746573206361737420627920746865206d656d6265722e14566f74657300020530543a3a4163636f756e74496430543a3a4163636f756e74496410566f746505040004d020446f75626c65206d61702066726f6d2043616e646964617465202d3e20566f746572202d3e20284d617962652920566f74652e20446566656e646572000030543a3a4163636f756e744964040004c42054686520646566656e64696e67206d656d6265722063757272656e746c79206265696e67206368616c6c656e6765642e34446566656e646572566f74657300010530543a3a4163636f756e74496410566f7465000400046020566f74657320666f722074686520646566656e6465722e284d61784d656d6265727301000c753332100000000004dc20546865206d6178206e756d626572206f66206d656d6265727320666f722074686520736f6369657479206174206f6e652074696d652e01300c626964041476616c75653c42616c616e63654f663c542c20493e84e020412075736572206f757473696465206f662074686520736f63696574792063616e206d616b6520612062696420666f7220656e7472792e003901205061796d656e743a206043616e6469646174654465706f736974602077696c6c20626520726573657276656420666f72206d616b696e672061206269642e2049742069732072657475726e6564f0207768656e2074686520626964206265636f6d65732061206d656d6265722c206f7220696620746865206269642063616c6c732060756e626964602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a5901202d206076616c7565603a2041206f6e652074696d65207061796d656e74207468652062696420776f756c64206c696b6520746f2072656365697665207768656e206a6f696e696e672074686520736f63696574792e002c2023203c7765696768743e5501204b65793a204220286c656e206f662062696473292c204320286c656e206f662063616e64696461746573292c204d20286c656e206f66206d656d62657273292c2058202862616c616e636520726573657276652944202d2053746f726167652052656164733aec20092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e6465642063616e6469646174652e204f283129e020092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e646564206d656d6265722e204f283129dc20092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e7420626964732e204f284229f420092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e742063616e646964617465732e204f284329c820092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c206d656d626572732e204f284d2948202d2053746f72616765205772697465733a810120092d204f6e652073746f72616765206d757461746520746f206164642061206e65772062696420746f2074686520766563746f72204f2842292028544f444f3a20706f737369626c65206f7074696d697a6174696f6e20772f207265616429010120092d20557020746f206f6e652073746f726167652072656d6f76616c206966206269642e6c656e2829203e204d41585f4249445f434f554e542e204f2831295c202d204e6f7461626c6520436f6d7075746174696f6e3a2d0120092d204f2842202b2043202b206c6f67204d292073656172636820746f20636865636b2075736572206973206e6f7420616c726561647920612070617274206f6620736f63696574792ec420092d204f286c6f672042292073656172636820746f20696e7365727420746865206e65772062696420736f727465642e78202d2045787465726e616c204d6f64756c65204f7065726174696f6e733a9c20092d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e204f285829210120092d20557020746f206f6e652062616c616e636520756e72657365727665206f7065726174696f6e20696620626964732e6c656e2829203e204d41585f4249445f434f554e542e28202d204576656e74733a6820092d204f6e65206576656e7420666f72206e6577206269642efc20092d20557020746f206f6e65206576656e7420666f72204175746f556e626964206966206269642e6c656e2829203e204d41585f4249445f434f554e542e00c420546f74616c20436f6d706c65786974793a204f284d202b2042202b2043202b206c6f674d202b206c6f6742202b205829302023203c2f7765696768743e14756e626964040c706f730c7533324cd82041206269646465722063616e2072656d6f76652074686569722062696420666f7220656e74727920696e746f20736f63696574792e010120427920646f696e6720736f2c20746865792077696c6c20686176652074686569722063616e646964617465206465706f7369742072657475726e6564206f728420746865792077696c6c20756e766f75636820746865697220766f75636865722e00fc205061796d656e743a2054686520626964206465706f73697420697320756e7265736572766564206966207468652075736572206d6164652061206269642e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206269646465722e003020506172616d65746572733a1901202d2060706f73603a20506f736974696f6e20696e207468652060426964736020766563746f72206f6620746865206269642077686f2077616e747320746f20756e6269642e002c2023203c7765696768743eb0204b65793a204220286c656e206f662062696473292c2058202862616c616e636520756e72657365727665290d01202d204f6e652073746f72616765207265616420616e6420777269746520746f20726574726965766520616e64207570646174652074686520626964732e204f2842294501202d20456974686572206f6e6520756e726573657276652062616c616e636520616374696f6e204f285829206f72206f6e6520766f756368696e672073746f726167652072656d6f76616c2e204f28312934202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2842202b205829302023203c2f7765696768743e14766f7563680c0c77686f30543a3a4163636f756e7449641476616c75653c42616c616e63654f663c542c20493e0c7469703c42616c616e63654f663c542c20493eb045012041732061206d656d6265722c20766f75636820666f7220736f6d656f6e6520746f206a6f696e20736f636965747920627920706c6163696e67206120626964206f6e20746865697220626568616c662e005501205468657265206973206e6f206465706f73697420726571756972656420746f20766f75636820666f722061206e6577206269642c206275742061206d656d6265722063616e206f6e6c7920766f75636820666f725d01206f6e652062696420617420612074696d652e2049662074686520626964206265636f6d657320612073757370656e6465642063616e64696461746520616e6420756c74696d6174656c792072656a65637465642062794101207468652073757370656e73696f6e206a756467656d656e74206f726967696e2c20746865206d656d6265722077696c6c2062652062616e6e65642066726f6d20766f756368696e6720616761696e2e005901204173206120766f756368696e67206d656d6265722c20796f752063616e20636c61696d206120746970206966207468652063616e6469646174652069732061636365707465642e2054686973207469702077696c6c51012062652070616964206173206120706f7274696f6e206f66207468652072657761726420746865206d656d6265722077696c6c207265636569766520666f72206a6f696e696e672074686520736f63696574792e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d6265722e003020506172616d65746572733acc202d206077686f603a2054686520757365722077686f20796f7520776f756c64206c696b6520746f20766f75636820666f722e5101202d206076616c7565603a2054686520746f74616c2072657761726420746f2062652070616964206265747765656e20796f7520616e64207468652063616e6469646174652069662074686579206265636f6d65642061206d656d62657220696e2074686520736f63696574792e4901202d2060746970603a20596f757220637574206f662074686520746f74616c206076616c756560207061796f7574207768656e207468652063616e64696461746520697320696e64756374656420696e746f15012074686520736f63696574792e2054697073206c6172676572207468616e206076616c7565602077696c6c206265207361747572617465642075706f6e207061796f75742e002c2023203c7765696768743e0101204b65793a204220286c656e206f662062696473292c204320286c656e206f662063616e64696461746573292c204d20286c656e206f66206d656d626572732944202d2053746f726167652052656164733ac820092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c206d656d626572732e204f284d29090120092d204f6e652073746f72616765207265616420746f20636865636b206d656d626572206973206e6f7420616c726561647920766f756368696e672e204f283129ec20092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e6465642063616e6469646174652e204f283129e020092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e646564206d656d6265722e204f283129dc20092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e7420626964732e204f284229f420092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e742063616e646964617465732e204f28432948202d2053746f72616765205772697465733a0d0120092d204f6e652073746f7261676520777269746520746f20696e7365727420766f756368696e672073746174757320746f20746865206d656d6265722e204f283129810120092d204f6e652073746f72616765206d757461746520746f206164642061206e65772062696420746f2074686520766563746f72204f2842292028544f444f3a20706f737369626c65206f7074696d697a6174696f6e20772f207265616429010120092d20557020746f206f6e652073746f726167652072656d6f76616c206966206269642e6c656e2829203e204d41585f4249445f434f554e542e204f2831295c202d204e6f7461626c6520436f6d7075746174696f6e3ac020092d204f286c6f67204d292073656172636820746f20636865636b2073656e6465722069732061206d656d6265722e2d0120092d204f2842202b2043202b206c6f67204d292073656172636820746f20636865636b2075736572206973206e6f7420616c726561647920612070617274206f6620736f63696574792ec420092d204f286c6f672042292073656172636820746f20696e7365727420746865206e65772062696420736f727465642e78202d2045787465726e616c204d6f64756c65204f7065726174696f6e733a9c20092d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e204f285829210120092d20557020746f206f6e652062616c616e636520756e72657365727665206f7065726174696f6e20696620626964732e6c656e2829203e204d41585f4249445f434f554e542e28202d204576656e74733a6020092d204f6e65206576656e7420666f7220766f7563682efc20092d20557020746f206f6e65206576656e7420666f72204175746f556e626964206966206269642e6c656e2829203e204d41585f4249445f434f554e542e00c420546f74616c20436f6d706c65786974793a204f284d202b2042202b2043202b206c6f674d202b206c6f6742202b205829302023203c2f7765696768743e1c756e766f756368040c706f730c753332442d01204173206120766f756368696e67206d656d6265722c20756e766f7563682061206269642e2054686973206f6e6c7920776f726b73207768696c6520766f7563686564207573657220697394206f6e6c792061206269646465722028616e64206e6f7420612063616e646964617465292e00290120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206120766f756368696e67206d656d6265722e003020506172616d65746572733a2d01202d2060706f73603a20506f736974696f6e20696e207468652060426964736020766563746f72206f6620746865206269642077686f2073686f756c6420626520756e766f75636865642e002c2023203c7765696768743e54204b65793a204220286c656e206f662062696473290901202d204f6e652073746f726167652072656164204f28312920746f20636865636b20746865207369676e6572206973206120766f756368696e67206d656d6265722eec202d204f6e652073746f72616765206d757461746520746f20726574726965766520616e64207570646174652074686520626964732e204f28422994202d204f6e6520766f756368696e672073746f726167652072656d6f76616c2e204f28312934202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f284229302023203c2f7765696768743e10766f7465082463616e6469646174658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651c617070726f766510626f6f6c4c882041732061206d656d6265722c20766f7465206f6e20612063616e6469646174652e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d6265722e003020506172616d65746572733a0d01202d206063616e646964617465603a205468652063616e646964617465207468617420746865206d656d62657220776f756c64206c696b6520746f20626964206f6e2ef4202d2060617070726f7665603a204120626f6f6c65616e2077686963682073617973206966207468652063616e6469646174652073686f756c64206265d82020202020202020202020202020617070726f766564202860747275656029206f722072656a656374656420286066616c736560292e002c2023203c7765696768743ebc204b65793a204320286c656e206f662063616e64696461746573292c204d20286c656e206f66206d656d62657273291d01202d204f6e652073746f726167652072656164204f284d2920616e64204f286c6f67204d292073656172636820746f20636865636b20757365722069732061206d656d6265722e58202d204f6e65206163636f756e74206c6f6f6b75702e2d01202d204f6e652073746f726167652072656164204f28432920616e64204f2843292073656172636820746f20636865636b2074686174207573657220697320612063616e6469646174652ebc202d204f6e652073746f7261676520777269746520746f2061646420766f746520746f20766f7465732e204f28312934202d204f6e65206576656e742e008820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b204329302023203c2f7765696768743e34646566656e6465725f766f7465041c617070726f766510626f6f6c408c2041732061206d656d6265722c20766f7465206f6e2074686520646566656e6465722e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d6265722e003020506172616d65746572733af4202d2060617070726f7665603a204120626f6f6c65616e2077686963682073617973206966207468652063616e6469646174652073686f756c64206265a420617070726f766564202860747275656029206f722072656a656374656420286066616c736560292e002c2023203c7765696768743e68202d204b65793a204d20286c656e206f66206d656d62657273291d01202d204f6e652073746f726167652072656164204f284d2920616e64204f286c6f67204d292073656172636820746f20636865636b20757365722069732061206d656d6265722ebc202d204f6e652073746f7261676520777269746520746f2061646420766f746520746f20766f7465732e204f28312934202d204f6e65206576656e742e007820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d29302023203c2f7765696768743e187061796f757400504501205472616e7366657220746865206669727374206d617475726564207061796f757420666f72207468652073656e64657220616e642072656d6f76652069742066726f6d20746865207265636f7264732e006901204e4f54453a20546869732065787472696e736963206e6565647320746f2062652063616c6c6564206d756c7469706c652074696d657320746f20636c61696d206d756c7469706c65206d617475726564207061796f7574732e002101205061796d656e743a20546865206d656d6265722077696c6c20726563656976652061207061796d656e7420657175616c20746f207468656972206669727374206d61747572656478207061796f757420746f20746865697220667265652062616c616e63652e00150120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d62657220776974684c207061796f7574732072656d61696e696e672e002c2023203c7765696768743e1d01204b65793a204d20286c656e206f66206d656d62657273292c205020286e756d626572206f66207061796f75747320666f72206120706172746963756c6172206d656d626572292501202d204f6e652073746f726167652072656164204f284d2920616e64204f286c6f67204d292073656172636820746f20636865636b207369676e65722069732061206d656d6265722ee4202d204f6e652073746f726167652072656164204f28502920746f2067657420616c6c207061796f75747320666f722061206d656d6265722ee4202d204f6e652073746f726167652072656164204f28312920746f20676574207468652063757272656e7420626c6f636b206e756d6265722e8c202d204f6e652063757272656e6379207472616e736665722063616c6c2e204f2858291101202d204f6e652073746f72616765207772697465206f722072656d6f76616c20746f2075706461746520746865206d656d6265722773207061796f7574732e204f285029009820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b2050202b205829302023203c2f7765696768743e14666f756e640c1c666f756e64657230543a3a4163636f756e7449642c6d61785f6d656d626572730c7533321472756c65731c5665633c75383e4c4c20466f756e642074686520736f63696574792e00f0205468697320697320646f6e65206173206120646973637265746520616374696f6e20696e206f7264657220746f20616c6c6f7720666f72207468651901206d6f64756c6520746f20626520696e636c7564656420696e746f20612072756e6e696e6720636861696e20616e642063616e206f6e6c7920626520646f6e65206f6e63652e001d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d20746865205f466f756e6465725365744f726967696e5f2e003020506172616d65746572733a1901202d2060666f756e64657260202d20546865206669727374206d656d62657220616e642068656164206f6620746865206e65776c7920666f756e64656420736f63696574792e1501202d20606d61785f6d656d6265727360202d2054686520696e697469616c206d6178206e756d626572206f66206d656d6265727320666f722074686520736f63696574792ef4202d206072756c657360202d205468652072756c6573206f66207468697320736f636965747920636f6e6365726e696e67206d656d626572736869702e002c2023203c7765696768743ee0202d2054776f2073746f72616765206d75746174657320746f207365742060486561646020616e642060466f756e646572602e204f283129f4202d204f6e652073746f7261676520777269746520746f2061646420746865206669727374206d656d62657220746f20736f63696574792e204f28312934202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f283129302023203c2f7765696768743e1c756e666f756e6400348c20416e6e756c2074686520666f756e64696e67206f662074686520736f63696574792e005d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205369676e65642c20616e6420746865207369676e696e67206163636f756e74206d75737420626520626f74685901207468652060466f756e6465726020616e6420746865206048656164602e205468697320696d706c6965732074686174206974206d6179206f6e6c7920626520646f6e65207768656e207468657265206973206f6e6520206d656d6265722e002c2023203c7765696768743e68202d2054776f2073746f72616765207265616473204f2831292e78202d20466f75722073746f726167652072656d6f76616c73204f2831292e34202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f283129302023203c2f7765696768743e586a756467655f73757370656e6465645f6d656d626572080c77686f30543a3a4163636f756e7449641c666f726769766510626f6f6c6c2d0120416c6c6f772073757370656e73696f6e206a756467656d656e74206f726967696e20746f206d616b65206a756467656d656e74206f6e20612073757370656e646564206d656d6265722e00590120496620612073757370656e646564206d656d62657220697320666f72676976656e2c2077652073696d706c7920616464207468656d206261636b2061732061206d656d6265722c206e6f7420616666656374696e67cc20616e79206f6620746865206578697374696e672073746f72616765206974656d7320666f722074686174206d656d6265722e00490120496620612073757370656e646564206d656d6265722069732072656a65637465642c2072656d6f766520616c6c206173736f6369617465642073746f72616765206974656d732c20696e636c7564696e670101207468656972207061796f7574732c20616e642072656d6f766520616e7920766f7563686564206269647320746865792063757272656e746c7920686176652e00410120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d20746865205f53757370656e73696f6e4a756467656d656e744f726967696e5f2e003020506172616d65746572733ab4202d206077686f60202d205468652073757370656e646564206d656d62657220746f206265206a75646765642e3501202d2060666f726769766560202d204120626f6f6c65616e20726570726573656e74696e672077686574686572207468652073757370656e73696f6e206a756467656d656e74206f726967696e2501202020202020202020202020202020666f726769766573202860747275656029206f722072656a6563747320286066616c7365602920612073757370656e646564206d656d6265722e002c2023203c7765696768743ea4204b65793a204220286c656e206f662062696473292c204d20286c656e206f66206d656d6265727329f8202d204f6e652073746f72616765207265616420746f20636865636b206077686f6020697320612073757370656e646564206d656d6265722e204f2831297101202d20557020746f206f6e652073746f72616765207772697465204f284d292077697468204f286c6f67204d292062696e6172792073656172636820746f206164642061206d656d626572206261636b20746f20736f63696574792ef8202d20557020746f20332073746f726167652072656d6f76616c73204f28312920746f20636c65616e20757020612072656d6f766564206d656d6265722e4501202d20557020746f206f6e652073746f72616765207772697465204f2842292077697468204f2842292073656172636820746f2072656d6f766520766f7563686564206269642066726f6d20626964732ed4202d20557020746f206f6e65206164646974696f6e616c206576656e7420696620756e766f7563682074616b657320706c6163652e70202d204f6e652073746f726167652072656d6f76616c2e204f2831297c202d204f6e65206576656e7420666f7220746865206a756467656d656e742e008820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b204229302023203c2f7765696768743e646a756467655f73757370656e6465645f63616e646964617465080c77686f30543a3a4163636f756e744964246a756467656d656e74244a756467656d656e74a0350120416c6c6f772073757370656e646564206a756467656d656e74206f726967696e20746f206d616b65206a756467656d656e74206f6e20612073757370656e6465642063616e6469646174652e005d0120496620746865206a756467656d656e742069732060417070726f7665602c20776520616464207468656d20746f20736f63696574792061732061206d656d62657220776974682074686520617070726f70726961746574207061796d656e7420666f72206a6f696e696e6720736f63696574792e00550120496620746865206a756467656d656e74206973206052656a656374602c2077652065697468657220736c61736820746865206465706f736974206f6620746865206269642c20676976696e67206974206261636b110120746f2074686520736f63696574792074726561737572792c206f722077652062616e2074686520766f75636865722066726f6d20766f756368696e6720616761696e2e005d0120496620746865206a756467656d656e7420697320605265626964602c20776520707574207468652063616e646964617465206261636b20696e207468652062696420706f6f6c20616e64206c6574207468656d20676f94207468726f7567682074686520696e64756374696f6e2070726f6365737320616761696e2e00410120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d20746865205f53757370656e73696f6e4a756467656d656e744f726967696e5f2e003020506172616d65746572733ac0202d206077686f60202d205468652073757370656e6465642063616e64696461746520746f206265206a75646765642ec4202d20606a756467656d656e7460202d2060417070726f7665602c206052656a656374602c206f7220605265626964602e002c2023203c7765696768743ef4204b65793a204220286c656e206f662062696473292c204d20286c656e206f66206d656d62657273292c2058202862616c616e636520616374696f6e29f0202d204f6e652073746f72616765207265616420746f20636865636b206077686f6020697320612073757370656e6465642063616e6469646174652ec8202d204f6e652073746f726167652072656d6f76616c206f66207468652073757370656e6465642063616e6469646174652e40202d20417070726f7665204c6f676963150120092d204f6e652073746f72616765207265616420746f206765742074686520617661696c61626c6520706f7420746f2070617920757365727320776974682e204f283129dc20092d204f6e652073746f7261676520777269746520746f207570646174652074686520617661696c61626c6520706f742e204f283129e820092d204f6e652073746f72616765207265616420746f20676574207468652063757272656e7420626c6f636b206e756d6265722e204f283129b420092d204f6e652073746f72616765207265616420746f2067657420616c6c206d656d626572732e204f284d29a020092d20557020746f206f6e6520756e726573657276652063757272656e637920616374696f6e2eb020092d20557020746f2074776f206e65772073746f726167652077726974657320746f207061796f7574732e4d0120092d20557020746f206f6e652073746f726167652077726974652077697468204f286c6f67204d292062696e6172792073656172636820746f206164642061206d656d62657220746f20736f63696574792e3c202d2052656a656374204c6f676963dc20092d20557020746f206f6e6520726570617472696174652072657365727665642063757272656e637920616374696f6e2e204f2858292d0120092d20557020746f206f6e652073746f7261676520777269746520746f2062616e2074686520766f756368696e67206d656d6265722066726f6d20766f756368696e6720616761696e2e38202d205265626964204c6f676963410120092d2053746f72616765206d75746174652077697468204f286c6f672042292062696e6172792073656172636820746f20706c616365207468652075736572206261636b20696e746f20626964732ed4202d20557020746f206f6e65206164646974696f6e616c206576656e7420696620756e766f7563682074616b657320706c6163652e5c202d204f6e652073746f726167652072656d6f76616c2e7c202d204f6e65206576656e7420666f7220746865206a756467656d656e742e009820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b2042202b205829302023203c2f7765696768743e3c7365745f6d61785f6d656d62657273040c6d61780c753332381d0120416c6c6f777320726f6f74206f726967696e20746f206368616e676520746865206d6178696d756d206e756d626572206f66206d656d6265727320696e20736f63696574792eb4204d6178206d656d6265727368697020636f756e74206d7573742062652067726561746572207468616e20312e00dc20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d205f524f4f545f2e003020506172616d65746572733ae4202d20606d617860202d20546865206d6178696d756d206e756d626572206f66206d656d6265727320666f722074686520736f63696574792e002c2023203c7765696768743eb0202d204f6e652073746f7261676520777269746520746f2075706461746520746865206d61782e204f28312934202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f283129302023203c2f7765696768743e01401c466f756e64656404244163636f756e74496404e02054686520736f636965747920697320666f756e6465642062792074686520676976656e206964656e746974792e205b666f756e6465725d0c42696408244163636f756e7449641c42616c616e63650861012041206d656d6265727368697020626964206a7573742068617070656e65642e2054686520676976656e206163636f756e74206973207468652063616e646964617465277320494420616e64207468656972206f666665729420697320746865207365636f6e642e205b63616e6469646174655f69642c206f666665725d14566f7563680c244163636f756e7449641c42616c616e6365244163636f756e7449640861012041206d656d6265727368697020626964206a7573742068617070656e656420627920766f756368696e672e2054686520676976656e206163636f756e74206973207468652063616e646964617465277320494420616e647101207468656972206f6666657220697320746865207365636f6e642e2054686520766f756368696e67207061727479206973207468652074686972642e205b63616e6469646174655f69642c206f666665722c20766f756368696e675d244175746f556e62696404244163636f756e7449640411012041205b63616e6469646174655d207761732064726f70706564202864756520746f20616e20657863657373206f66206269647320696e207468652073797374656d292e14556e62696404244163636f756e74496404b82041205b63616e6469646174655d207761732064726f70706564202862792074686569722072657175657374292e1c556e766f75636804244163636f756e7449640401012041205b63616e6469646174655d207761732064726f70706564202862792072657175657374206f662077686f20766f756368656420666f72207468656d292e20496e64756374656408244163636f756e744964385665633c4163636f756e7449643e08590120412067726f7570206f662063616e646964617465732068617665206265656e20696e6475637465642e205468652062617463682773207072696d617279206973207468652066697273742076616c75652c20746865cc20626174636820696e2066756c6c20697320746865207365636f6e642e205b7072696d6172792c2063616e646964617465735d6053757370656e6465644d656d6265724a756467656d656e7408244163636f756e74496410626f6f6c04c820412073757370656e646564206d656d62657220686173206265656e206a75646765642e205b77686f2c206a75646765645d4843616e64696461746553757370656e64656404244163636f756e74496404842041205b63616e6469646174655d20686173206265656e2073757370656e6465643c4d656d62657253757370656e64656404244163636f756e74496404782041205b6d656d6265725d20686173206265656e2073757370656e646564284368616c6c656e67656404244163636f756e744964047c2041205b6d656d6265725d20686173206265656e206368616c6c656e67656410566f74650c244163636f756e744964244163636f756e74496410626f6f6c04c0204120766f746520686173206265656e20706c61636564205b63616e6469646174652c20766f7465722c20766f74655d30446566656e646572566f746508244163636f756e74496410626f6f6c04f0204120766f746520686173206265656e20706c6163656420666f72206120646566656e64696e67206d656d626572205b766f7465722c20766f74655d344e65774d61784d656d62657273040c75333204982041206e6577205b6d61785d206d656d62657220636f756e7420686173206265656e2073657424556e666f756e64656404244163636f756e744964048020536f636965747920697320756e666f756e6465642e205b666f756e6465725d1c4465706f736974041c42616c616e636504f020536f6d652066756e64732077657265206465706f736974656420696e746f2074686520736f6369657479206163636f756e742e205b76616c75655d1c4043616e6469646174654465706f7369743c42616c616e63654f663c542c20493e400080c6a47e8d0300000000000000000004fc20546865206d696e696d756d20616d6f756e74206f662061206465706f73697420726571756972656420666f7220612062696420746f206265206d6164652e4857726f6e6753696465446564756374696f6e3c42616c616e63654f663c542c20493e400080f420e6b5000000000000000000000855012054686520616d6f756e74206f662074686520756e70616964207265776172642074686174206765747320646564756374656420696e207468652063617365207468617420656974686572206120736b6570746963c020646f65736e277420766f7465206f7220736f6d656f6e6520766f74657320696e207468652077726f6e67207761792e284d6178537472696b65730c753332100a00000008750120546865206e756d626572206f662074696d65732061206d656d626572206d617920766f7465207468652077726f6e672077617920286f72206e6f7420617420616c6c2c207768656e207468657920617265206120736b65707469632978206265666f72652074686579206265636f6d652073757370656e6465642e2c506572696f645370656e643c42616c616e63654f663c542c20493e400000c52ebca2b1000000000000000000042d012054686520616d6f756e74206f6620696e63656e7469766520706169642077697468696e206561636820706572696f642e20446f65736e277420696e636c75646520566f7465725469702e38526f746174696f6e506572696f6438543a3a426c6f636b4e756d626572100077010004110120546865206e756d626572206f6620626c6f636b73206265747765656e2063616e6469646174652f6d656d6265727368697020726f746174696f6e20706572696f64732e3c4368616c6c656e6765506572696f6438543a3a426c6f636b4e756d626572108013030004d020546865206e756d626572206f6620626c6f636b73206265747765656e206d656d62657273686970206368616c6c656e6765732e204d6f64756c654964204d6f64756c6549642070792f736f63696504682054686520736f636965746965732773206d6f64756c65206964482c426164506f736974696f6e049020416e20696e636f727265637420706f736974696f6e207761732070726f76696465642e244e6f744d656d62657204582055736572206973206e6f742061206d656d6265722e34416c72656164794d656d6265720468205573657220697320616c72656164792061206d656d6265722e2453757370656e646564044c20557365722069732073757370656e6465642e304e6f7453757370656e646564045c2055736572206973206e6f742073757370656e6465642e204e6f5061796f7574044c204e6f7468696e6720746f207061796f75742e38416c7265616479466f756e646564046420536f636965747920616c726561647920666f756e6465642e3c496e73756666696369656e74506f74049c204e6f7420656e6f75676820696e20706f7420746f206163636570742063616e6469646174652e3c416c7265616479566f756368696e6704e8204d656d62657220697320616c726561647920766f756368696e67206f722062616e6e65642066726f6d20766f756368696e6720616761696e2e2c4e6f74566f756368696e670460204d656d626572206973206e6f7420766f756368696e672e104865616404942043616e6e6f742072656d6f7665207468652068656164206f662074686520636861696e2e1c466f756e646572046c2043616e6e6f742072656d6f76652074686520666f756e6465722e28416c7265616479426964047420557365722068617320616c7265616479206d6164652061206269642e40416c726561647943616e6469646174650474205573657220697320616c726561647920612063616e6469646174652e304e6f7443616e64696461746504642055736572206973206e6f7420612063616e6469646174652e284d61784d656d62657273048420546f6f206d616e79206d656d6265727320696e2074686520736f63696574792e284e6f74466f756e646572047c205468652063616c6c6572206973206e6f742074686520666f756e6465722e1c4e6f74486561640470205468652063616c6c6572206973206e6f742074686520686561642e1a205265636f7665727901205265636f766572790c2c5265636f76657261626c6500010530543a3a4163636f756e744964e85265636f76657279436f6e6669673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e0004000409012054686520736574206f66207265636f76657261626c65206163636f756e747320616e64207468656972207265636f7665727920636f6e66696775726174696f6e2e404163746976655265636f76657269657300020530543a3a4163636f756e74496430543a3a4163636f756e744964e84163746976655265636f766572793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e050400106820416374697665207265636f7665727920617474656d7074732e001501204669727374206163636f756e7420697320746865206163636f756e7420746f206265207265636f76657265642c20616e6420746865207365636f6e64206163636f756e74ac20697320746865207573657220747279696e6720746f207265636f76657220746865206163636f756e742e1450726f787900010230543a3a4163636f756e74496430543a3a4163636f756e7449640004000c9020546865206c697374206f6620616c6c6f7765642070726f7879206163636f756e74732e00f8204d61702066726f6d2074686520757365722077686f2063616e2061636365737320697420746f20746865207265636f7665726564206163636f756e742e01243061735f7265636f7665726564081c6163636f756e7430543a3a4163636f756e7449641063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e34a42053656e6420612063616c6c207468726f7567682061207265636f7665726564206163636f756e742e00150120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207265676973746572656420746fe82062652061626c6520746f206d616b652063616c6c73206f6e20626568616c66206f6620746865207265636f7665726564206163636f756e742e003020506172616d65746572733a2501202d20606163636f756e74603a20546865207265636f7665726564206163636f756e7420796f752077616e7420746f206d616b6520612063616c6c206f6e2d626568616c662d6f662e0101202d206063616c6c603a205468652063616c6c20796f752077616e7420746f206d616b65207769746820746865207265636f7665726564206163636f756e742e002c2023203c7765696768743e94202d2054686520776569676874206f6620746865206063616c6c60202b2031302c3030302e0901202d204f6e652073746f72616765206c6f6f6b757020746f20636865636b206163636f756e74206973207265636f7665726564206279206077686f602e204f283129302023203c2f7765696768743e347365745f7265636f766572656408106c6f737430543a3a4163636f756e7449641c7265736375657230543a3a4163636f756e744964341d0120416c6c6f7720524f4f5420746f2062797061737320746865207265636f766572792070726f6365737320616e642073657420616e20612072657363756572206163636f756e747420666f722061206c6f7374206163636f756e74206469726563746c792e00c820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f524f4f545f2e003020506172616d65746572733ab8202d20606c6f7374603a2054686520226c6f7374206163636f756e742220746f206265207265636f76657265642e1d01202d206072657363756572603a20546865202272657363756572206163636f756e74222077686963682063616e2063616c6c20617320746865206c6f7374206163636f756e742e002c2023203c7765696768743e64202d204f6e652073746f72616765207772697465204f28312930202d204f6e65206576656e74302023203c2f7765696768743e3c6372656174655f7265636f766572790c1c667269656e6473445665633c543a3a4163636f756e7449643e247468726573686f6c640c7531363064656c61795f706572696f6438543a3a426c6f636b4e756d6265726c5d01204372656174652061207265636f7665727920636f6e66696775726174696f6e20666f7220796f7572206163636f756e742e2054686973206d616b657320796f7572206163636f756e74207265636f76657261626c652e003101205061796d656e743a2060436f6e6669674465706f7369744261736560202b2060467269656e644465706f736974466163746f7260202a20235f6f665f667269656e64732062616c616e636549012077696c6c20626520726573657276656420666f722073746f72696e6720746865207265636f7665727920636f6e66696775726174696f6e2e2054686973206465706f7369742069732072657475726e6564bc20696e2066756c6c207768656e2074686520757365722063616c6c73206072656d6f76655f7265636f76657279602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a2501202d2060667269656e6473603a2041206c697374206f6620667269656e647320796f7520747275737420746f20766f75636820666f72207265636f7665727920617474656d7074732ed420202053686f756c64206265206f72646572656420616e6420636f6e7461696e206e6f206475706c69636174652076616c7565732e3101202d20607468726573686f6c64603a20546865206e756d626572206f6620667269656e64732074686174206d75737420766f75636820666f722061207265636f7665727920617474656d70741d012020206265666f726520746865206163636f756e742063616e206265207265636f76657265642e2053686f756c64206265206c657373207468616e206f7220657175616c20746f94202020746865206c656e677468206f6620746865206c697374206f6620667269656e64732e3d01202d206064656c61795f706572696f64603a20546865206e756d626572206f6620626c6f636b732061667465722061207265636f7665727920617474656d707420697320696e697469616c697a6564e820202074686174206e6565647320746f2070617373206265666f726520746865206163636f756e742063616e206265207265636f76657265642e002c2023203c7765696768743e68202d204b65793a204620286c656e206f6620667269656e6473292d01202d204f6e652073746f72616765207265616420746f20636865636b2074686174206163636f756e74206973206e6f7420616c7265616479207265636f76657261626c652e204f2831292eec202d204120636865636b20746861742074686520667269656e6473206c69737420697320736f7274656420616e6420756e697175652e204f2846299c202d204f6e652063757272656e63792072657365727665206f7065726174696f6e2e204f2858299c202d204f6e652073746f726167652077726974652e204f2831292e20436f646563204f2846292e34202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205829302023203c2f7765696768743e44696e6974696174655f7265636f76657279041c6163636f756e7430543a3a4163636f756e74496458ec20496e697469617465207468652070726f6365737320666f72207265636f766572696e672061207265636f76657261626c65206163636f756e742e001d01205061796d656e743a20605265636f766572794465706f736974602062616c616e63652077696c6c20626520726573657276656420666f7220696e6974696174696e67207468652501207265636f766572792070726f636573732e2054686973206465706f7369742077696c6c20616c7761797320626520726570617472696174656420746f20746865206163636f756e74b820747279696e6720746f206265207265636f76657265642e205365652060636c6f73655f7265636f76657279602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1501202d20606163636f756e74603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f207265636f7665722e2054686973206163636f756e7401012020206e6565647320746f206265207265636f76657261626c652028692e652e20686176652061207265636f7665727920636f6e66696775726174696f6e292e002c2023203c7765696768743ef8202d204f6e652073746f72616765207265616420746f20636865636b2074686174206163636f756e74206973207265636f76657261626c652e204f2846295101202d204f6e652073746f72616765207265616420746f20636865636b20746861742074686973207265636f766572792070726f63657373206861736e277420616c726561647920737461727465642e204f2831299c202d204f6e652063757272656e63792072657365727665206f7065726174696f6e2e204f285829e4202d204f6e652073746f72616765207265616420746f20676574207468652063757272656e7420626c6f636b206e756d6265722e204f2831296c202d204f6e652073746f726167652077726974652e204f2831292e34202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205829302023203c2f7765696768743e38766f7563685f7265636f7665727908106c6f737430543a3a4163636f756e7449641c7265736375657230543a3a4163636f756e74496464290120416c6c6f7720612022667269656e6422206f662061207265636f76657261626c65206163636f756e7420746f20766f75636820666f7220616e20616374697665207265636f76657279682070726f6365737320666f722074686174206163636f756e742e00290120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d75737420626520612022667269656e64227420666f7220746865207265636f76657261626c65206163636f756e742e003020506172616d65746572733ad4202d20606c6f7374603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f207265636f7665722e1101202d206072657363756572603a20546865206163636f756e7420747279696e6720746f2072657363756520746865206c6f7374206163636f756e74207468617420796f755420202077616e7420746f20766f75636820666f722e0025012054686520636f6d62696e6174696f6e206f662074686573652074776f20706172616d6574657273206d75737420706f696e7420746f20616e20616374697665207265636f76657279242070726f636573732e002c2023203c7765696768743efc204b65793a204620286c656e206f6620667269656e647320696e20636f6e666967292c205620286c656e206f6620766f756368696e6720667269656e6473291d01202d204f6e652073746f72616765207265616420746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f2846292101202d204f6e652073746f72616765207265616420746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629ec202d204f6e652062696e6172792073656172636820746f20636f6e6669726d2063616c6c6572206973206120667269656e642e204f286c6f6746291d01202d204f6e652062696e6172792073656172636820746f20636f6e6669726d2063616c6c657220686173206e6f7420616c726561647920766f75636865642e204f286c6f6756299c202d204f6e652073746f726167652077726974652e204f2831292c20436f646563204f2856292e34202d204f6e65206576656e742e00a420546f74616c20436f6d706c65786974793a204f2846202b206c6f6746202b2056202b206c6f675629302023203c2f7765696768743e38636c61696d5f7265636f76657279041c6163636f756e7430543a3a4163636f756e74496450f420416c6c6f772061207375636365737366756c207265736375657220746f20636c61696d207468656972207265636f7665726564206163636f756e742e002d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061202272657363756572221d012077686f20686173207375636365737366756c6c7920636f6d706c6574656420746865206163636f756e74207265636f766572792070726f636573733a20636f6c6c6563746564310120607468726573686f6c6460206f72206d6f726520766f75636865732c20776169746564206064656c61795f706572696f646020626c6f636b732073696e636520696e6974696174696f6e2e003020506172616d65746572733a2d01202d20606163636f756e74603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f20636c61696d20686173206265656e207375636365737366756c6c79502020207265636f766572656420627920796f752e002c2023203c7765696768743efc204b65793a204620286c656e206f6620667269656e647320696e20636f6e666967292c205620286c656e206f6620766f756368696e6720667269656e6473291d01202d204f6e652073746f72616765207265616420746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f2846292101202d204f6e652073746f72616765207265616420746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629e4202d204f6e652073746f72616765207265616420746f20676574207468652063757272656e7420626c6f636b206e756d6265722e204f2831299c202d204f6e652073746f726167652077726974652e204f2831292c20436f646563204f2856292e34202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205629302023203c2f7765696768743e38636c6f73655f7265636f76657279041c7265736375657230543a3a4163636f756e7449645015012041732074686520636f6e74726f6c6c6572206f662061207265636f76657261626c65206163636f756e742c20636c6f736520616e20616374697665207265636f76657279682070726f6365737320666f7220796f7572206163636f756e742e002101205061796d656e743a2042792063616c6c696e6720746869732066756e6374696f6e2c20746865207265636f76657261626c65206163636f756e742077696c6c2072656365697665f820746865207265636f76657279206465706f73697420605265636f766572794465706f7369746020706c616365642062792074686520726573637565722e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061f0207265636f76657261626c65206163636f756e74207769746820616e20616374697665207265636f766572792070726f6365737320666f722069742e003020506172616d65746572733a1101202d206072657363756572603a20546865206163636f756e7420747279696e6720746f207265736375652074686973207265636f76657261626c65206163636f756e742e002c2023203c7765696768743e84204b65793a205620286c656e206f6620766f756368696e6720667269656e6473293d01202d204f6e652073746f7261676520726561642f72656d6f766520746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629c0202d204f6e652062616c616e63652063616c6c20746f20726570617472696174652072657365727665642e204f28582934202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2856202b205829302023203c2f7765696768743e3c72656d6f76655f7265636f7665727900545d012052656d6f766520746865207265636f766572792070726f6365737320666f7220796f7572206163636f756e742e205265636f7665726564206163636f756e747320617265207374696c6c2061636365737369626c652e001501204e4f54453a205468652075736572206d757374206d616b65207375726520746f2063616c6c2060636c6f73655f7265636f7665727960206f6e20616c6c206163746976650901207265636f7665727920617474656d707473206265666f72652063616c6c696e6720746869732066756e6374696f6e20656c73652069742077696c6c206661696c2e002501205061796d656e743a2042792063616c6c696e6720746869732066756e6374696f6e20746865207265636f76657261626c65206163636f756e742077696c6c20756e7265736572766598207468656972207265636f7665727920636f6e66696775726174696f6e206465706f7369742ef4202860436f6e6669674465706f7369744261736560202b2060467269656e644465706f736974466163746f7260202a20235f6f665f667269656e64732900050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061e4207265636f76657261626c65206163636f756e742028692e652e206861732061207265636f7665727920636f6e66696775726174696f6e292e002c2023203c7765696768743e60204b65793a204620286c656e206f6620667269656e6473292901202d204f6e652073746f72616765207265616420746f206765742074686520707265666978206974657261746f7220666f7220616374697665207265636f7665726965732e204f2831293901202d204f6e652073746f7261676520726561642f72656d6f766520746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f2846299c202d204f6e652062616c616e63652063616c6c20746f20756e72657365727665642e204f28582934202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205829302023203c2f7765696768743e4063616e63656c5f7265636f7665726564041c6163636f756e7430543a3a4163636f756e7449642ce02043616e63656c20746865206162696c69747920746f20757365206061735f7265636f76657265646020666f7220606163636f756e74602e00150120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207265676973746572656420746fe82062652061626c6520746f206d616b652063616c6c73206f6e20626568616c66206f6620746865207265636f7665726564206163636f756e742e003020506172616d65746572733a1901202d20606163636f756e74603a20546865207265636f7665726564206163636f756e7420796f75206172652061626c6520746f2063616c6c206f6e2d626568616c662d6f662e002c2023203c7765696768743e1101202d204f6e652073746f72616765206d75746174696f6e20746f20636865636b206163636f756e74206973207265636f7665726564206279206077686f602e204f283129302023203c2f7765696768743e01183c5265636f766572794372656174656404244163636f756e74496404d42041207265636f766572792070726f6365737320686173206265656e2073657420757020666f7220616e205b6163636f756e745d2e445265636f76657279496e6974696174656408244163636f756e744964244163636f756e744964082d012041207265636f766572792070726f6365737320686173206265656e20696e6974696174656420666f72206c6f7374206163636f756e742062792072657363756572206163636f756e742e40205b6c6f73742c20726573637565725d3c5265636f76657279566f75636865640c244163636f756e744964244163636f756e744964244163636f756e744964085d012041207265636f766572792070726f6365737320666f72206c6f7374206163636f756e742062792072657363756572206163636f756e7420686173206265656e20766f756368656420666f722062792073656e6465722e60205b6c6f73742c20726573637565722c2073656e6465725d385265636f76657279436c6f73656408244163636f756e744964244163636f756e7449640821012041207265636f766572792070726f6365737320666f72206c6f7374206163636f756e742062792072657363756572206163636f756e7420686173206265656e20636c6f7365642e40205b6c6f73742c20726573637565725d404163636f756e745265636f766572656408244163636f756e744964244163636f756e744964080501204c6f7374206163636f756e7420686173206265656e207375636365737366756c6c79207265636f76657265642062792072657363756572206163636f756e742e40205b6c6f73742c20726573637565725d3c5265636f7665727952656d6f76656404244163636f756e74496404d82041207265636f766572792070726f6365737320686173206265656e2072656d6f76656420666f7220616e205b6163636f756e745d2e1044436f6e6669674465706f736974426173653042616c616e63654f663c543e4000406352bfc60100000000000000000004550120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e672061207265636f7665727920636f6e66696775726174696f6e2e4c467269656e644465706f736974466163746f723042616c616e63654f663c543e4000203d88792d000000000000000000000469012054686520616d6f756e74206f662063757272656e6379206e656564656420706572206164646974696f6e616c2075736572207768656e206372656174696e672061207265636f7665727920636f6e66696775726174696f6e2e284d6178467269656e64730c753136080900040d0120546865206d6178696d756d20616d6f756e74206f6620667269656e647320616c6c6f77656420696e2061207265636f7665727920636f6e66696775726174696f6e2e3c5265636f766572794465706f7369743042616c616e63654f663c543e4000406352bfc601000000000000000000041d0120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72207374617274696e672061207265636f766572792e40284e6f74416c6c6f77656404f42055736572206973206e6f7420616c6c6f77656420746f206d616b6520612063616c6c206f6e20626568616c66206f662074686973206163636f756e74345a65726f5468726573686f6c640490205468726573686f6c64206d7573742062652067726561746572207468616e207a65726f404e6f74456e6f756768467269656e647304d420467269656e6473206c697374206d7573742062652067726561746572207468616e207a65726f20616e64207468726573686f6c64284d6178467269656e647304ac20467269656e6473206c697374206d757374206265206c657373207468616e206d617820667269656e6473244e6f74536f7274656404cc20467269656e6473206c697374206d75737420626520736f7274656420616e642066726565206f66206475706c696361746573384e6f745265636f76657261626c6504a02054686973206163636f756e74206973206e6f742073657420757020666f72207265636f7665727948416c72656164795265636f76657261626c6504b02054686973206163636f756e7420697320616c72656164792073657420757020666f72207265636f7665727938416c72656164795374617274656404e02041207265636f766572792070726f636573732068617320616c7265616479207374617274656420666f722074686973206163636f756e74284e6f745374617274656404d02041207265636f766572792070726f6365737320686173206e6f74207374617274656420666f7220746869732072657363756572244e6f74467269656e6404ac2054686973206163636f756e74206973206e6f74206120667269656e642077686f2063616e20766f7563682c44656c6179506572696f64041d012054686520667269656e64206d757374207761697420756e74696c207468652064656c617920706572696f6420746f20766f75636820666f722074686973207265636f7665727938416c7265616479566f756368656404c0205468697320757365722068617320616c726561647920766f756368656420666f722074686973207265636f76657279245468726573686f6c6404ec20546865207468726573686f6c6420666f72207265636f766572696e672074686973206163636f756e7420686173206e6f74206265656e206d65742c5374696c6c41637469766504010120546865726520617265207374696c6c20616374697665207265636f7665727920617474656d7074732074686174206e65656420746f20626520636c6f736564204f766572666c6f77049c2054686572652077617320616e206f766572666c6f7720696e20612063616c63756c6174696f6e30416c726561647950726f787904b02054686973206163636f756e7420697320616c72656164792073657420757020666f72207265636f766572791b1c56657374696e67011c56657374696e67041c56657374696e6700010230543a3a4163636f756e744964a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e00040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e011010766573740044bc20556e6c6f636b20616e79207665737465642066756e6473206f66207468652073656e646572206163636f756e742e00610120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652066756e6473207374696c6c68206c6f636b656420756e6465722074686973206d6f64756c652e00d420456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20322052656164732c203220577269746573fc20202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745d010120202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745d34202d2042656e63686d61726b3aec20202020202d20556e6c6f636b65643a2034382e3736202b202e303438202a206c20c2b57320286d696e2073717561726520616e616c7973697329e420202020202d204c6f636b65643a2034342e3433202b202e323834202a206c20c2b57320286d696e2073717561726520616e616c7973697329ad01202d205573696e6720353020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e28766573745f6f7468657204187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654cbc20556e6c6f636b20616e79207665737465642066756e6473206f662061206074617267657460206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005501202d2060746172676574603a20546865206163636f756e742077686f7365207665737465642066756e64732073686f756c6420626520756e6c6f636b65642e204d75737420686176652066756e6473207374696c6c68206c6f636b656420756e6465722074686973206d6f64756c652e00d420456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20332052656164732c203320577269746573f420202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e74f820202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e7434202d2042656e63686d61726b3ae820202020202d20556e6c6f636b65643a2034342e33202b202e323934202a206c20c2b57320286d696e2073717561726520616e616c7973697329e420202020202d204c6f636b65643a2034382e3136202b202e313033202a206c20c2b57320286d696e2073717561726520616e616c7973697329ad01202d205573696e6720353020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e3c7665737465645f7472616e7366657208187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365207363686564756c65a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e486820437265617465206120766573746564207472616e736665722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e001501202d2060746172676574603a20546865206163636f756e7420746861742073686f756c64206265207472616e7366657272656420746865207665737465642066756e64732e0101202d2060616d6f756e74603a2054686520616d6f756e74206f662066756e647320746f207472616e7366657220616e642077696c6c206265207665737465642ef4202d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e006020456d697473206056657374696e6743726561746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20332052656164732c2033205772697465733d0120202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745d410120202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745de0202d2042656e63686d61726b3a203130302e33202b202e333635202a206c20c2b57320286d696e2073717561726520616e616c7973697329b101202d205573696e672031303020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e54666f7263655f7665737465645f7472616e736665720c18736f757263658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365207363686564756c65a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e4c6420466f726365206120766573746564207472616e736665722e00c820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e00ec202d2060736f75726365603a20546865206163636f756e742077686f73652066756e64732073686f756c64206265207472616e736665727265642e1501202d2060746172676574603a20546865206163636f756e7420746861742073686f756c64206265207472616e7366657272656420746865207665737465642066756e64732e0101202d2060616d6f756e74603a2054686520616d6f756e74206f662066756e647320746f207472616e7366657220616e642077696c6c206265207665737465642ef4202d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e006020456d697473206056657374696e6743726561746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20342052656164732c203420577269746573350120202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e74390120202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e74e0202d2042656e63686d61726b3a203130302e33202b202e333635202a206c20c2b57320286d696e2073717561726520616e616c7973697329b101202d205573696e672031303020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e01083856657374696e675570646174656408244163636f756e7449641c42616c616e63650c59012054686520616d6f756e742076657374656420686173206265656e20757064617465642e205468697320636f756c6420696e646963617465206d6f72652066756e64732061726520617661696c61626c652e205468651d012062616c616e636520676976656e2069732074686520616d6f756e74207768696368206973206c65667420756e7665737465642028616e642074687573206c6f636b6564292e2050205b6163636f756e742c20756e7665737465645d4056657374696e67436f6d706c6574656404244163636f756e74496404150120416e205b6163636f756e745d20686173206265636f6d652066756c6c79207665737465642e204e6f20667572746865722076657374696e672063616e2068617070656e2e04444d696e5665737465645472616e736665723042616c616e63654f663c543e400000c16ff28623000000000000000000041d0120546865206d696e696d756d20616d6f756e7420746f206265207472616e7366657272656420746f206372656174652061206e65772076657374696e67207363686564756c652e0c284e6f7456657374696e67048820546865206163636f756e7420676976656e206973206e6f742076657374696e672e5c4578697374696e6756657374696e675363686564756c65045d0120416e206578697374696e672076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e7420746861742063616e6e6f7420626520636c6f6262657265642e24416d6f756e744c6f7704090120416d6f756e74206265696e67207472616e7366657272656420697320746f6f206c6f7720746f2063726561746520612076657374696e67207363686564756c652e1c245363686564756c657201245363686564756c65720c184167656e646101010538543a3a426c6f636b4e756d6265726d015665633c4f7074696f6e3c5363686564756c65643c3c542061732054726169743e3a3a43616c6c2c20543a3a426c6f636b4e756d6265722c20543a3a0a50616c6c6574734f726967696e2c20543a3a4163636f756e7449643e3e3e000400044d01204974656d7320746f2062652065786563757465642c20696e64657865642062792074686520626c6f636b206e756d626572207468617420746865792073686f756c64206265206578656375746564206f6e2e184c6f6f6b75700001051c5665633c75383e6c5461736b416464726573733c543a3a426c6f636b4e756d6265723e000400040101204c6f6f6b75702066726f6d206964656e7469747920746f2074686520626c6f636b206e756d62657220616e6420696e646578206f6620746865207461736b2e3853746f7261676556657273696f6e01002052656c656173657304000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e0098204e6577206e6574776f726b732073746172742077697468206c6173742076657273696f6e2e0118207363686564756c6510107768656e38543a3a426c6f636b4e756d626572386d617962655f706572696f646963a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e207072696f72697479487363686564756c653a3a5072696f726974791063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e287420416e6f6e796d6f75736c79207363686564756c652061207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c7390202d2042617365205765696768743a2032322e3239202b202e313236202a205320c2b57334202d204442205765696768743a4c20202020202d20526561643a204167656e64615020202020202d2057726974653a204167656e64613d01202d2057696c6c20757365206261736520776569676874206f662032352077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c73302023203c2f7765696768743e1863616e63656c08107768656e38543a3a426c6f636b4e756d62657214696e6465780c75333228982043616e63656c20616e20616e6f6e796d6f75736c79207363686564756c6564207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c7394202d2042617365205765696768743a2032322e3135202b20322e383639202a205320c2b57334202d204442205765696768743a4c20202020202d20526561643a204167656e64617020202020202d2057726974653a204167656e64612c204c6f6f6b75704101202d2057696c6c20757365206261736520776569676874206f66203130302077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c73302023203c2f7765696768743e387363686564756c655f6e616d6564140869641c5665633c75383e107768656e38543a3a426c6f636b4e756d626572386d617962655f706572696f646963a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e207072696f72697479487363686564756c653a3a5072696f726974791063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e285c205363686564756c652061206e616d6564207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c738c202d2042617365205765696768743a2032392e36202b202e313539202a205320c2b57334202d204442205765696768743a6c20202020202d20526561643a204167656e64612c204c6f6f6b75707020202020202d2057726974653a204167656e64612c204c6f6f6b75704d01202d2057696c6c20757365206261736520776569676874206f662033352077686963682073686f756c6420626520676f6f6420666f72206d6f7265207468616e203330207363686564756c65642063616c6c73302023203c2f7765696768743e3063616e63656c5f6e616d6564040869641c5665633c75383e287c2043616e63656c2061206e616d6564207363686564756c6564207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c7394202d2042617365205765696768743a2032342e3931202b20322e393037202a205320c2b57334202d204442205765696768743a6c20202020202d20526561643a204167656e64612c204c6f6f6b75707020202020202d2057726974653a204167656e64612c204c6f6f6b75704101202d2057696c6c20757365206261736520776569676874206f66203130302077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c73302023203c2f7765696768743e387363686564756c655f61667465721014616674657238543a3a426c6f636b4e756d626572386d617962655f706572696f646963a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e207072696f72697479487363686564756c653a3a5072696f726974791063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e14ac20416e6f6e796d6f75736c79207363686564756c652061207461736b20616674657220612064656c61792e002c2023203c7765696768743e582053616d65206173205b607363686564756c65605d2e302023203c2f7765696768743e507363686564756c655f6e616d65645f6166746572140869641c5665633c75383e14616674657238543a3a426c6f636b4e756d626572386d617962655f706572696f646963a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e207072696f72697479487363686564756c653a3a5072696f726974791063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e1494205363686564756c652061206e616d6564207461736b20616674657220612064656c61792e002c2023203c7765696768743e702053616d65206173205b607363686564756c655f6e616d6564605d2e302023203c2f7765696768743e010c245363686564756c6564082c426c6f636b4e756d6265720c753332048c205363686564756c656420736f6d65207461736b2e205b7768656e2c20696e6465785d2043616e63656c6564082c426c6f636b4e756d6265720c75333204882043616e63656c656420736f6d65207461736b2e205b7768656e2c20696e6465785d28446973706174636865640c605461736b416464726573733c426c6f636b4e756d6265723e3c4f7074696f6e3c5665633c75383e3e384469737061746368526573756c7404a4204469737061746368656420736f6d65207461736b2e205b7461736b2c2069642c20726573756c745d000c404661696c6564546f5363686564756c650468204661696c656420746f207363686564756c6520612063616c6c384661696c6564546f43616e63656c0488204661696c656420746f2063616e63656c2061207363686564756c65642063616c6c5c546172676574426c6f636b4e756d626572496e5061737404a820476976656e2074617267657420626c6f636b206e756d62657220697320696e2074686520706173742e1d1450726f7879011450726f7879081c50726f7869657301010530543a3a4163636f756e7449644501285665633c50726f7879446566696e6974696f6e3c543a3a4163636f756e7449642c20543a3a50726f7879547970652c20543a3a426c6f636b4e756d6265723e3e2c0a2042616c616e63654f663c543e29004400000000000000000000000000000000000845012054686520736574206f66206163636f756e742070726f786965732e204d61707320746865206163636f756e74207768696368206861732064656c65676174656420746f20746865206163636f756e7473210120776869636820617265206265696e672064656c65676174656420746f2c20746f67657468657220776974682074686520616d6f756e742068656c64206f6e206465706f7369742e34416e6e6f756e63656d656e747301010530543a3a4163636f756e7449643d01285665633c416e6e6f756e63656d656e743c543a3a4163636f756e7449642c2043616c6c486173684f663c543e2c20543a3a426c6f636b4e756d6265723e3e2c0a2042616c616e63654f663c543e290044000000000000000000000000000000000004ac2054686520616e6e6f756e63656d656e7473206d616465206279207468652070726f787920286b6579292e01281470726f78790c107265616c30543a3a4163636f756e74496440666f7263655f70726f78795f74797065504f7074696f6e3c543a3a50726f7879547970653e1063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e3c51012044697370617463682074686520676976656e206063616c6c602066726f6d20616e206163636f756e742074686174207468652073656e64657220697320617574686f726973656420666f72207468726f7567683420606164645f70726f7879602e00ac2052656d6f76657320616e7920636f72726573706f6e64696e6720616e6e6f756e63656d656e742873292e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1101202d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e6501202d2060666f7263655f70726f78795f74797065603a2053706563696679207468652065786163742070726f7879207479706520746f206265207573656420616e6420636865636b656420666f7220746869732063616c6c2ed4202d206063616c6c603a205468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002c2023203c7765696768743e01012057656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e302023203c2f7765696768743e246164645f70726f78790c2064656c656761746530543a3a4163636f756e7449642870726f78795f7479706530543a3a50726f7879547970651464656c617938543a3a426c6f636b4e756d6265722c490120526567697374657220612070726f7879206163636f756e7420666f72207468652073656e64657220746861742069732061626c6520746f206d616b652063616c6c73206f6e2069747320626568616c662e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1501202d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f206d616b6520612070726f78792e0101202d206070726f78795f74797065603a20546865207065726d697373696f6e7320616c6c6f77656420666f7220746869732070726f7879206163636f756e742e002c2023203c7765696768743e01012057656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e302023203c2f7765696768743e3072656d6f76655f70726f78790c2064656c656761746530543a3a4163636f756e7449642870726f78795f7479706530543a3a50726f7879547970651464656c617938543a3a426c6f636b4e756d6265722cac20556e726567697374657220612070726f7879206163636f756e7420666f72207468652073656e6465722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a2901202d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f2072656d6f766520617320612070726f78792e4501202d206070726f78795f74797065603a20546865207065726d697373696f6e732063757272656e746c7920656e61626c656420666f72207468652072656d6f7665642070726f7879206163636f756e742e002c2023203c7765696768743e01012057656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e302023203c2f7765696768743e3872656d6f76655f70726f786965730028b820556e726567697374657220616c6c2070726f7879206163636f756e747320666f72207468652073656e6465722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901205741524e494e473a2054686973206d61792062652063616c6c6564206f6e206163636f756e747320637265617465642062792060616e6f6e796d6f7573602c20686f776576657220696620646f6e652c207468656e5d012074686520756e726573657276656420666565732077696c6c20626520696e61636365737369626c652e202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a002c2023203c7765696768743e01012057656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e302023203c2f7765696768743e24616e6f6e796d6f75730c2870726f78795f7479706530543a3a50726f7879547970651464656c617938543a3a426c6f636b4e756d62657214696e6465780c7531365c3d0120537061776e2061206672657368206e6577206163636f756e7420746861742069732067756172616e7465656420746f206265206f746865727769736520696e61636365737369626c652c20616e64010120696e697469616c697a65206974207769746820612070726f7879206f66206070726f78795f747970656020666f7220606f726967696e602073656e6465722e0070205265717569726573206120605369676e656460206f726967696e2e005501202d206070726f78795f74797065603a205468652074797065206f66207468652070726f78792074686174207468652073656e6465722077696c6c2062652072656769737465726564206173206f766572207468655101206e6577206163636f756e742e20546869732077696c6c20616c6d6f737420616c7761797320626520746865206d6f7374207065726d697373697665206050726f7879547970656020706f737369626c6520746f7c20616c6c6f7720666f72206d6178696d756d20666c65786962696c6974792e5501202d2060696e646578603a204120646973616d626967756174696f6e20696e6465782c20696e206361736520746869732069732063616c6c6564206d756c7469706c652074696d657320696e207468652073616d656101207472616e73616374696f6e2028652e672e207769746820607574696c6974793a3a626174636860292e20556e6c65737320796f75277265207573696e67206062617463686020796f752070726f6261626c79206a757374442077616e7420746f20757365206030602e5101202d206064656c6179603a2054686520616e6e6f756e63656d656e7420706572696f64207265717569726564206f662074686520696e697469616c2070726f78792e2057696c6c2067656e6572616c6c7920626518207a65726f2e005501204661696c73207769746820604475706c69636174656020696620746869732068617320616c7265616479206265656e2063616c6c656420696e2074686973207472616e73616374696f6e2c2066726f6d207468659c2073616d652073656e6465722c2077697468207468652073616d6520706172616d65746572732e00e8204661696c732069662074686572652061726520696e73756666696369656e742066756e647320746f2070617920666f72206465706f7369742e002c2023203c7765696768743e01012057656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e302023203c2f7765696768743e9020544f444f3a204d69676874206265206f76657220636f756e74696e6720312072656164386b696c6c5f616e6f6e796d6f7573141c737061776e657230543a3a4163636f756e7449642870726f78795f7479706530543a3a50726f78795479706514696e6465780c753136186865696768745c436f6d706163743c543a3a426c6f636b4e756d6265723e246578745f696e64657830436f6d706163743c7533323e50b82052656d6f76657320612070726576696f75736c7920737061776e656420616e6f6e796d6f75732070726f78792e004d01205741524e494e473a202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a20416e792066756e64732068656c6420696e2069742077696c6c2062653820696e61636365737369626c652e005d01205265717569726573206120605369676e656460206f726967696e2c20616e64207468652073656e646572206163636f756e74206d7573742068617665206265656e206372656174656420627920612063616c6c20746fac2060616e6f6e796d6f757360207769746820636f72726573706f6e64696e6720706172616d65746572732e005101202d2060737061776e6572603a20546865206163636f756e742074686174206f726967696e616c6c792063616c6c65642060616e6f6e796d6f75736020746f206372656174652074686973206163636f756e742e5101202d2060696e646578603a2054686520646973616d626967756174696f6e20696e646578206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e2050726f6261626c79206030602e0501202d206070726f78795f74797065603a205468652070726f78792074797065206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e4101202d2060686569676874603a2054686520686569676874206f662074686520636861696e207768656e207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e4d01202d20606578745f696e646578603a205468652065787472696e73696320696e64657820696e207768696368207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e004d01204661696c73207769746820604e6f5065726d697373696f6e6020696e2063617365207468652063616c6c6572206973206e6f7420612070726576696f75736c79206372656174656420616e6f6e796d6f7573f4206163636f756e742077686f73652060616e6f6e796d6f7573602063616c6c2068617320636f72726573706f6e64696e6720706172616d65746572732e002c2023203c7765696768743e01012057656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e302023203c2f7765696768743e20616e6e6f756e636508107265616c30543a3a4163636f756e7449642463616c6c5f686173683443616c6c486173684f663c543e540901205075626c697368207468652068617368206f6620612070726f78792d63616c6c20746861742077696c6c206265206d61646520696e20746865206675747572652e0061012054686973206d7573742062652063616c6c656420736f6d65206e756d626572206f6620626c6f636b73206265666f72652074686520636f72726573706f6e64696e67206070726f78796020697320617474656d707465642901206966207468652064656c6179206173736f6369617465642077697468207468652070726f78792072656c6174696f6e736869702069732067726561746572207468616e207a65726f2e001501204e6f206d6f7265207468616e20604d617850656e64696e676020616e6e6f756e63656d656e7473206d6179206265206d61646520617420616e79206f6e652074696d652e000d0120546869732077696c6c2074616b652061206465706f736974206f662060416e6e6f756e63656d656e744465706f736974466163746f72602061732077656c6c2061731d012060416e6e6f756e63656d656e744465706f736974426173656020696620746865726520617265206e6f206f746865722070656e64696e6720616e6e6f756e63656d656e74732e00290120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420612070726f7879206f6620607265616c602e003020506172616d65746572733a1101202d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e1901202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002c2023203c7765696768743e642057656967687420697320612066756e6374696f6e206f663a9c202d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea4202d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e302023203c2f7765696768743e4c72656d6f76655f616e6e6f756e63656d656e7408107265616c30543a3a4163636f756e7449642463616c6c5f686173683443616c6c486173684f663c543e40742052656d6f7665206120676976656e20616e6e6f756e63656d656e742e005d01204d61792062652063616c6c656420627920612070726f7879206163636f756e7420746f2072656d6f766520612063616c6c20746865792070726576696f75736c7920616e6e6f756e63656420616e642072657475726e3420746865206465706f7369742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1101202d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e1901202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002c2023203c7765696768743e642057656967687420697320612066756e6374696f6e206f663a9c202d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea4202d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e302023203c2f7765696768743e4c72656a6563745f616e6e6f756e63656d656e74082064656c656761746530543a3a4163636f756e7449642463616c6c5f686173683443616c6c486173684f663c543e40b42052656d6f76652074686520676976656e20616e6e6f756e63656d656e74206f6620612064656c65676174652e006501204d61792062652063616c6c6564206279206120746172676574202870726f7869656429206163636f756e7420746f2072656d6f766520612063616c6c2074686174206f6e65206f662074686569722064656c656761746573290120286064656c656761746560292068617320616e6e6f756e63656420746865792077616e7420746f20657865637574652e20546865206465706f7369742069732072657475726e65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733af8202d206064656c6567617465603a20546865206163636f756e7420746861742070726576696f75736c7920616e6e6f756e636564207468652063616c6c2ec0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f206265206d6164652e002c2023203c7765696768743e642057656967687420697320612066756e6374696f6e206f663a9c202d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea4202d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e302023203c2f7765696768743e3c70726f78795f616e6e6f756e636564102064656c656761746530543a3a4163636f756e744964107265616c30543a3a4163636f756e74496440666f7263655f70726f78795f74797065504f7074696f6e3c543a3a50726f7879547970653e1063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e4451012044697370617463682074686520676976656e206063616c6c602066726f6d20616e206163636f756e742074686174207468652073656e64657220697320617574686f726973656420666f72207468726f7567683420606164645f70726f7879602e00ac2052656d6f76657320616e7920636f72726573706f6e64696e6720616e6e6f756e63656d656e742873292e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1101202d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e6501202d2060666f7263655f70726f78795f74797065603a2053706563696679207468652065786163742070726f7879207479706520746f206265207573656420616e6420636865636b656420666f7220746869732063616c6c2ed4202d206063616c6c603a205468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002c2023203c7765696768743e642057656967687420697320612066756e6374696f6e206f663a9c202d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea4202d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e302023203c2f7765696768743e010c3450726f7879457865637574656404384469737061746368526573756c7404e420412070726f78792077617320657865637574656420636f72726563746c792c20776974682074686520676976656e205b726573756c745d2e40416e6f6e796d6f75734372656174656410244163636f756e744964244163636f756e7449642450726f7879547970650c75313608ec20416e6f6e796d6f7573206163636f756e7420686173206265656e2063726561746564206279206e65772070726f7879207769746820676976656e610120646973616d626967756174696f6e20696e64657820616e642070726f787920747970652e205b616e6f6e796d6f75732c2077686f2c2070726f78795f747970652c20646973616d626967756174696f6e5f696e6465785d24416e6e6f756e6365640c244163636f756e744964244163636f756e744964104861736804490120416e20616e6e6f756e63656d656e742077617320706c6163656420746f206d616b6520612063616c6c20696e20746865206675747572652e205b7265616c2c2070726f78792c2063616c6c5f686173685d184050726f78794465706f736974426173653042616c616e63654f663c543e4000f09e544c390000000000000000000004110120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e6720612070726f78792e4850726f78794465706f736974466163746f723042616c616e63654f663c543e400060aa7714b40000000000000000000004bc2054686520616d6f756e74206f662063757272656e6379206e6565646564207065722070726f78792061646465642e284d617850726f786965730c75313608200004f020546865206d6178696d756d20616d6f756e74206f662070726f7869657320616c6c6f77656420666f7220612073696e676c65206163636f756e742e284d617850656e64696e670c7533321020000000047820604d617850656e64696e6760206d6574616461746120736861646f772e5c416e6e6f756e63656d656e744465706f736974426173653042616c616e63654f663c543e4000f09e544c390000000000000000000004ac2060416e6e6f756e63656d656e744465706f7369744261736560206d6574616461746120736861646f772e64416e6e6f756e63656d656e744465706f736974466163746f723042616c616e63654f663c543e4000c054ef28680100000000000000000004b42060416e6e6f756e63656d656e744465706f736974466163746f7260206d6574616461746120736861646f772e1c1c546f6f4d616e790425012054686572652061726520746f6f206d616e792070726f786965732072656769737465726564206f7220746f6f206d616e7920616e6e6f756e63656d656e74732070656e64696e672e204e6f74466f756e6404782050726f787920726567697374726174696f6e206e6f7420666f756e642e204e6f7450726f787904d02053656e646572206973206e6f7420612070726f7879206f6620746865206163636f756e7420746f2062652070726f786965642e2c556e70726f787961626c6504250120412063616c6c20776869636820697320696e636f6d70617469626c652077697468207468652070726f7879207479706527732066696c7465722077617320617474656d707465642e244475706c69636174650470204163636f756e7420697320616c726561647920612070726f78792e304e6f5065726d697373696f6e0419012043616c6c206d6179206e6f74206265206d6164652062792070726f78792062656361757365206974206d617920657363616c617465206974732070726976696c656765732e2c556e616e6e6f756e63656404d420416e6e6f756e63656d656e742c206966206d61646520617420616c6c2c20776173206d61646520746f6f20726563656e746c792e1e204d756c746973696701204d756c746973696708244d756c74697369677300020530543a3a4163636f756e744964205b75383b2033325dd04d756c74697369673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e02040004942054686520736574206f66206f70656e206d756c7469736967206f7065726174696f6e732e1443616c6c73000106205b75383b2033325da0284f706171756543616c6c2c20543a3a4163636f756e7449642c2042616c616e63654f663c543e290004000001105061735f6d756c74695f7468726573686f6c645f3108446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e1063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e44550120496d6d6564696174656c792064697370617463682061206d756c74692d7369676e61747572652063616c6c207573696e6720612073696e676c6520617070726f76616c2066726f6d207468652063616c6c65722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e004101202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f206172652070617274206f66207468650501206d756c74692d7369676e61747572652c2062757420646f206e6f7420706172746963697061746520696e2074686520617070726f76616c2070726f636573732e8c202d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e00bc20526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c742e002c2023203c7765696768743e1d01204f285a202b204329207768657265205a20697320746865206c656e677468206f66207468652063616c6c20616e6420432069747320657865637574696f6e207765696768742e80202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d94202d2042617365205765696768743a2033332e3732202b20302e303032202a205a20c2b57348202d204442205765696768743a204e6f6e654c202d20506c75732043616c6c20576569676874302023203c2f7765696768743e2061735f6d756c746918247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e1063616c6c284f706171756543616c6c2873746f72655f63616c6c10626f6f6c286d61785f77656967687418576569676874cc590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e00b42049662074686572652061726520656e6f7567682c207468656e206469737061746368207468652063616c6c2e003101205061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573410120607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2e8c202d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e002101204e4f54453a20556e6c6573732074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2067656e6572616c6c792077616e7420746f207573651d012060617070726f76655f61735f6d756c74696020696e73746561642c2073696e6365206974206f6e6c7920726571756972657320612068617368206f66207468652063616c6c2e005d0120526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c7420696620607468726573686f6c64602069732065786163746c79206031602e204f74686572776973655901206f6e20737563636573732c20726573756c7420697320604f6b6020616e642074686520726573756c742066726f6d2074686520696e746572696f722063616c6c2c206966206974207761732065786563757465642ce0206d617920626520666f756e6420696e20746865206465706f736974656420604d756c7469736967457865637574656460206576656e742e002c2023203c7765696768743e54202d20604f2853202b205a202b2043616c6c29602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2e2501202d204f6e652063616c6c20656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285a296020776865726520605a602069732074782d6c656e2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e70202d2054686520776569676874206f6620746865206063616c6c602e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66b4202020604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e80202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743ae020202020202d204372656174653a2020202020202020202034312e3839202b20302e313138202a2053202b202e303032202a205a20c2b573e020202020202d2043726561746520772f2053746f72653a2035332e3537202b20302e313139202a2053202b202e303033202a205a20c2b573e020202020202d20417070726f76653a20202020202020202033312e3339202b20302e313336202a2053202b202e303032202a205a20c2b573e020202020202d20436f6d706c6574653a202020202020202033392e3934202b20302e323620202a2053202b202e303032202a205a20c2b57334202d204442205765696768743a250120202020202d2052656164733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c6029290120202020202d205772697465733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c60294c202d20506c75732043616c6c20576569676874302023203c2f7765696768743e40617070726f76655f61735f6d756c746914247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e2463616c6c5f68617368205b75383b2033325d286d61785f776569676874185765696768749c590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e003101205061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573410120607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e003901204e4f54453a2049662074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2077616e7420746f20757365206061735f6d756c74696020696e73746561642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66b4202020604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e8c202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743a8020202020202d204372656174653a2034342e3731202b20302e303838202a20538420202020202d20417070726f76653a2033312e3438202b20302e313136202a205334202d204442205765696768743abc20202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745dc020202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d302023203c2f7765696768743e3c63616e63656c5f61735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e2474696d65706f696e746454696d65706f696e743c543a3a426c6f636b4e756d6265723e2463616c6c5f68617368205b75383b2033325d6c59012043616e63656c2061207072652d6578697374696e672c206f6e2d676f696e67206d756c7469736967207472616e73616374696f6e2e20416e79206465706f7369742072657365727665642070726576696f75736c79c820666f722074686973206f7065726174696f6e2077696c6c20626520756e7265736572766564206f6e20737563636573732e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e6101202d206074696d65706f696e74603a205468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c7c207472616e73616374696f6e20666f7220746869732064697370617463682ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602e34202d204f6e65206576656e742e88202d20492f4f3a2031207265616420604f285329602c206f6e652072656d6f76652e74202d2053746f726167653a2072656d6f766573206f6e65206974656d2e8c202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d84202d2042617365205765696768743a2033362e3037202b20302e313234202a205334202d204442205765696768743a190120202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c731d0120202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c73302023203c2f7765696768743e01102c4e65774d756c74697369670c244163636f756e744964244163636f756e7449642043616c6c486173680415012041206e6577206d756c7469736967206f7065726174696f6e2068617320626567756e2e205b617070726f76696e672c206d756c74697369672c2063616c6c5f686173685d404d756c7469736967417070726f76616c10244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449642043616c6c48617368047d012041206d756c7469736967206f7065726174696f6e20686173206265656e20617070726f76656420627920736f6d656f6e652e205b617070726f76696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d404d756c7469736967457865637574656414244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449642043616c6c48617368384469737061746368526573756c740451012041206d756c7469736967206f7065726174696f6e20686173206265656e2065786563757465642e205b617070726f76696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d444d756c746973696743616e63656c6c656410244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449642043616c6c486173680459012041206d756c7469736967206f7065726174696f6e20686173206265656e2063616e63656c6c65642e205b63616e63656c6c696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d0c2c4465706f736974426173653042616c616e63654f663c543e4000f01c0adbed0100000000000000000008710120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e672061206d756c746973696720657865637574696f6e206f7220746f2073746f72656c20612064697370617463682063616c6c20666f72206c617465722e344465706f736974466163746f723042616c616e63654f663c543e400000cc7b9fae000000000000000000000455012054686520616d6f756e74206f662063757272656e6379206e65656465642070657220756e6974207468726573686f6c64207768656e206372656174696e672061206d756c746973696720657865637574696f6e2e384d61785369676e61746f726965730c75313608640004010120546865206d6178696d756d20616d6f756e74206f66207369676e61746f7269657320616c6c6f77656420666f72206120676976656e206d756c74697369672e38404d696e696d756d5468726573686f6c640480205468726573686f6c64206d7573742062652032206f7220677265617465722e3c416c7265616479417070726f76656404b02043616c6c20697320616c726561647920617070726f7665642062792074686973207369676e61746f72792e444e6f417070726f76616c734e656564656404a02043616c6c20646f65736e2774206e65656420616e7920286d6f72652920617070726f76616c732e44546f6f4665775369676e61746f7269657304ac2054686572652061726520746f6f20666577207369676e61746f7269657320696e20746865206c6973742e48546f6f4d616e795369676e61746f7269657304b02054686572652061726520746f6f206d616e79207369676e61746f7269657320696e20746865206c6973742e545369676e61746f726965734f75744f664f7264657204110120546865207369676e61746f7269657320776572652070726f7669646564206f7574206f66206f726465723b20746865792073686f756c64206265206f7264657265642e4c53656e646572496e5369676e61746f72696573041101205468652073656e6465722077617320636f6e7461696e656420696e20746865206f74686572207369676e61746f726965733b2069742073686f756c646e27742062652e204e6f74466f756e6404e0204d756c7469736967206f7065726174696f6e206e6f7420666f756e64207768656e20617474656d7074696e6720746f2063616e63656c2e204e6f744f776e6572043101204f6e6c7920746865206163636f756e742074686174206f726967696e616c6c79206372656174656420746865206d756c74697369672069732061626c6520746f2063616e63656c2069742e2c4e6f54696d65706f696e74042101204e6f2074696d65706f696e742077617320676976656e2c2079657420746865206d756c7469736967206f7065726174696f6e20697320616c726561647920756e6465727761792e3857726f6e6754696d65706f696e74043101204120646966666572656e742074696d65706f696e742077617320676976656e20746f20746865206d756c7469736967206f7065726174696f6e207468617420697320756e6465727761792e4c556e657870656374656454696d65706f696e7404f820412074696d65706f696e742077617320676976656e2c20796574206e6f206d756c7469736967206f7065726174696f6e20697320756e6465727761792e30576569676874546f6f4c6f7704d420546865206d6178696d756d2077656967687420696e666f726d6174696f6e2070726f76696465642077617320746f6f206c6f772e34416c726561647953746f72656404a420546865206461746120746f2062652073746f72656420697320616c72656164792073746f7265642e1f041c40436865636b5370656356657273696f6e38436865636b547856657273696f6e30436865636b47656e6573697338436865636b4d6f7274616c69747928436865636b4e6f6e63652c436865636b576569676874604368617267655472616e73616374696f6e5061796d656e74' + +metadata_v11_hex = '0x6d6574610b801853797374656d011853797374656d3c1c4163636f756e7401010230543a3a4163636f756e744964944163636f756e74496e666f3c543a3a496e6465782c20543a3a4163636f756e74446174613e00150100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e8205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e3845787472696e736963436f756e7400000c753332040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2c426c6f636b576569676874010064776569676874733a3a45787472696e7369637357656967687440000000000000000000000000000000000488205468652063757272656e742077656967687420666f722074686520626c6f636b2e40416c6c45787472696e736963734c656e00000c753332040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b4861736801010538543a3a426c6f636b4e756d6265721c543a3a48617368008000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101050c7533321c5665633c75383e000400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d626572010038543a3a426c6f636b4e756d6265721000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e3845787472696e73696373526f6f7401001c543a3a486173688000000000000000000000000000000000000000000000000000000000000000000415012045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e1844696765737401002c4469676573744f663c543e040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301008c5665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e040004a0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e284576656e74436f756e740100284576656e74496e646578100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f706963730101021c543a3a48617368845665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e000400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e484c61737452756e74696d65557067726164650000584c61737452756e74696d6555706772616465496e666f04000455012053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e38457865637574696f6e50686173650000145068617365040004882054686520657865637574696f6e207068617365206f662074686520626c6f636b2e01282866696c6c5f626c6f636b04185f726174696f1c50657262696c6c040901204120646973706174636820746861742077696c6c2066696c6c2074686520626c6f636b2077656967687420757020746f2074686520676976656e20726174696f2e1872656d61726b041c5f72656d61726b1c5665633c75383e1c6c204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e002c2023203c7765696768743e24202d20604f28312960e0202d2042617365205765696768743a20302e36363520c2b5732c20696e646570656e64656e74206f662072656d61726b206c656e6774682e50202d204e6f204442206f7065726174696f6e732e302023203c2f7765696768743e387365745f686561705f7061676573041470616765730c75363420fc2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e002c2023203c7765696768743e24202d20604f283129604c202d20312073746f726167652077726974652e64202d2042617365205765696768743a20312e34303520c2b57360202d203120777269746520746f20484541505f5041474553302023203c2f7765696768743e207365745f636f64650410636f64651c5665633c75383e28682053657420746865206e65772072756e74696d6520636f64652e002c2023203c7765696768743e3501202d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f64656088202d20312073746f726167652077726974652028636f64656320604f28432960292e7901202d20312063616c6c20746f206063616e5f7365745f636f6465603a20604f28532960202863616c6c73206073705f696f3a3a6d6973633a3a72756e74696d655f76657273696f6e6020776869636820697320657870656e73697665292e2c202d2031206576656e742e7d012054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652c206275742067656e6572616c6c792074686973206973207665727920657870656e736976652e902057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e302023203c2f7765696768743e5c7365745f636f64655f776974686f75745f636865636b730410636f64651c5665633c75383e201d012053657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e002c2023203c7765696768743e90202d20604f2843296020776865726520604360206c656e677468206f662060636f64656088202d20312073746f726167652077726974652028636f64656320604f28432960292e2c202d2031206576656e742e75012054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e302023203c2f7765696768743e5c7365745f6368616e6765735f747269655f636f6e666967044c6368616e6765735f747269655f636f6e666967804f7074696f6e3c4368616e67657354726965436f6e66696775726174696f6e3e28a02053657420746865206e6577206368616e676573207472696520636f6e66696775726174696f6e2e002c2023203c7765696768743e24202d20604f28312960b0202d20312073746f72616765207772697465206f722064656c6574652028636f64656320604f28312960292ed8202d20312063616c6c20746f20606465706f7369745f6c6f67603a20557365732060617070656e6460204150492c20736f204f28312964202d2042617365205765696768743a20372e32313820c2b57334202d204442205765696768743aa820202020202d205772697465733a204368616e67657320547269652c2053797374656d20446967657374302023203c2f7765696768743e2c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e206c2053657420736f6d65206974656d73206f662073746f726167652e002c2023203c7765696768743e94202d20604f2849296020776865726520604960206c656e677468206f6620606974656d73607c202d206049602073746f72616765207772697465732028604f28312960292e74202d2042617365205765696768743a20302e353638202a206920c2b57368202d205772697465733a204e756d626572206f66206974656d73302023203c2f7765696768743e306b696c6c5f73746f7261676504106b657973205665633c4b65793e2078204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e002c2023203c7765696768743efc202d20604f28494b296020776865726520604960206c656e677468206f6620606b6579736020616e6420604b60206c656e677468206f66206f6e65206b657964202d206049602073746f726167652064656c6574696f6e732e70202d2042617365205765696768743a202e333738202a206920c2b57368202d205772697465733a204e756d626572206f66206974656d73302023203c2f7765696768743e2c6b696c6c5f70726566697808187072656669780c4b6579205f7375626b6579730c7533322c1501204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e003d01202a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e64657241012074686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e002c2023203c7765696768743edc202d20604f285029602077686572652060506020616d6f756e74206f66206b65797320776974682070726566697820607072656669786064202d206050602073746f726167652064656c6574696f6e732e74202d2042617365205765696768743a20302e383334202a205020c2b57380202d205772697465733a204e756d626572206f66207375626b657973202b2031302023203c2f7765696768743e1c7375696369646500286501204b696c6c207468652073656e64696e67206163636f756e742c20617373756d696e6720746865726520617265206e6f207265666572656e636573206f75747374616e64696e6720616e642074686520636f6d706f7369746590206461746120697320657175616c20746f206974732064656661756c742076616c75652e002c2023203c7765696768743e24202d20604f283129607c202d20312073746f72616765207265616420616e642064656c6574696f6e2e54202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a20382e36323620c2b5731101204e6f2044422052656164206f72205772697465206f7065726174696f6e7320626563617573652063616c6c657220697320616c726561647920696e206f7665726c6179302023203c2f7765696768743e01144045787472696e7369635375636365737304304469737061746368496e666f04b020416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e205b696e666f5d3c45787472696e7369634661696c6564083444697370617463684572726f72304469737061746368496e666f048c20416e2065787472696e736963206661696c65642e205b6572726f722c20696e666f5d2c436f64655570646174656400045420603a636f6465602077617320757064617465642e284e65774163636f756e7404244163636f756e74496404742041206e6577205b6163636f756e745d2077617320637265617465642e344b696c6c65644163636f756e7404244163636f756e744964046420416e205b6163636f756e745d20776173207265617065642e1838426c6f636b48617368436f756e7438543a3a426c6f636b4e756d626572106009000004d820546865206d6178696d756d206e756d626572206f6620626c6f636b7320746f20616c6c6f7720696e206d6f7274616c20657261732e484d6178696d756d426c6f636b576569676874185765696768742000204aa9d1010000047c20546865206d6178696d756d20776569676874206f66206120626c6f636b2e2044625765696768743c52756e74696d6544625765696768744040787d010000000000e1f505000000000409012054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e50426c6f636b457865637574696f6e576569676874185765696768742000f2052a0100000004510120546865206261736520776569676874206f6620657865637574696e67206120626c6f636b2c20696e646570656e64656e74206f6620746865207472616e73616374696f6e7320696e2074686520626c6f636b2e4c45787472696e736963426173655765696768741857656967687420405973070000000004790120546865206261736520776569676874206f6620616e2045787472696e73696320696e2074686520626c6f636b2c20696e646570656e64656e74206f6620746865206f662065787472696e736963206265696e672065786563757465642e484d6178696d756d426c6f636b4c656e6774680c753332100000500004a820546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e143c496e76616c6964537065634e616d6508150120546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d655420616e6420746865206e65772072756e74696d652e685370656356657273696f6e4e65656473546f496e637265617365084501205468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d655420616e6420746865206e65772072756e74696d652e744661696c6564546f4578747261637452756e74696d6556657273696f6e0cf0204661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e000d01204569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e4c4e6f6e44656661756c74436f6d706f7369746504010120537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e3c4e6f6e5a65726f526566436f756e740439012054686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e1c5574696c697479000108146261746368041463616c6c735c5665633c3c542061732054726169743e3a3a43616c6c3e50802053656e642061206261746368206f662064697370617463682063616c6c732e007c204d61792062652063616c6c65642066726f6d20616e79206f726967696e2e00f0202d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e006101204966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c75646573c820627970617373696e6720606672616d655f73797374656d3a3a54726169743a3a4261736543616c6c46696c74657260292e002c2023203c7765696768743e90202d2042617365207765696768743a2031342e3339202b202e393837202a206320c2b573b8202d20506c7573207468652073756d206f66207468652077656967687473206f6620746865206063616c6c73602ec4202d20506c7573206f6e65206164646974696f6e616c206576656e742e202872657065617420726561642f777269746529302023203c2f7765696768743e00590120546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e3501206576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e20746865590120604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d616465510120616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c657465646050206576656e74206973206465706f73697465642e3461735f646572697661746976650814696e6465780c7531361063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e34e02053656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e0059012046696c7465722066726f6d206f726967696e206172652070617373656420616c6f6e672e205468652063616c6c2077696c6c2062652064697370617463686564207769746820616e206f726967696e207768696368c020757365207468652073616d652066696c74657220617320746865206f726967696e206f6620746869732063616c6c2e004901204e4f54453a20496620796f75206e65656420746f20656e73757265207468617420616e79206163636f756e742d62617365642066696c746572696e67206973206e6f7420686f6e6f7265642028692e652e6501206265636175736520796f7520657870656374206070726f78796020746f2068617665206265656e2075736564207072696f7220696e207468652063616c6c20737461636b20616e6420796f7520646f206e6f742077616e745501207468652063616c6c207265737472696374696f6e7320746f206170706c7920746f20616e79207375622d6163636f756e7473292c207468656e20757365206061735f6d756c74695f7468726573686f6c645f31608020696e20746865204d756c74697369672070616c6c657420696e73746561642e00f8204e4f54453a205072696f7220746f2076657273696f6e202a31322c2074686973207761732063616c6c6564206061735f6c696d697465645f737562602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0108404261746368496e746572727570746564080c7533323444697370617463684572726f72085901204261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c206173882077656c6c20617320746865206572726f722e205b696e6465782c206572726f725d384261746368436f6d706c657465640004cc204261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e000010426162650110426162652c2845706f6368496e64657801000c75363420000000000000000004542043757272656e742065706f636820696e6465782e2c417574686f72697469657301009c5665633c28417574686f7269747949642c2042616265417574686f72697479576569676874293e0400046c2043757272656e742065706f636820617574686f7269746965732e2c47656e65736973536c6f7401000c75363420000000000000000008f82054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e205468697320697320309020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2c43757272656e74536c6f7401000c75363420000000000000000004542043757272656e7420736c6f74206e756d6265722e2852616e646f6d6e6573730100587363686e6f72726b656c3a3a52616e646f6d6e65737380000000000000000000000000000000000000000000000000000000000000000028b8205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e002c20232053656375726974790005012054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061f8206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e7915012063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d6265727320746861742074686973150120286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e206265050120757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e0d01206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e3c4e65787445706f6368436f6e6669670000504e657874436f6e66696744657363726970746f7204000498204e6578742065706f636820636f6e66696775726174696f6e2c206966206368616e6765642e384e65787452616e646f6d6e6573730100587363686e6f72726b656c3a3a52616e646f6d6e657373800000000000000000000000000000000000000000000000000000000000000000045c204e6578742065706f63682072616e646f6d6e6573732e305365676d656e74496e64657801000c7533321000000000247c2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e00f4205765206d616b6520612074726164656f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e01012057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f942060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e00ec204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e090120576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572791c2065706f63682e44556e646572436f6e737472756374696f6e0101050c7533326c5665633c7363686e6f72726b656c3a3a52616e646f6d6e6573733e0004000415012054574f582d4e4f54453a20605365676d656e74496e6465786020697320616e20696e6372656173696e6720696e74656765722c20736f2074686973206973206f6b61792e2c496e697469616c697a656400003c4d6179626552616e646f6d6e65737304000801012054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d65601d01206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e204c6174656e657373010038543a3a426c6f636b4e756d626572100000000014d820486f77206c617465207468652063757272656e7420626c6f636b20697320636f6d706172656420746f2069747320706172656e742e001501205468697320656e74727920697320706f70756c617465642061732070617274206f6620626c6f636b20657865637574696f6e20616e6420697320636c65616e65642075701101206f6e20626c6f636b2066696e616c697a6174696f6e2e205175657279696e6720746869732073746f7261676520656e747279206f757473696465206f6620626c6f636bb020657865637574696f6e20636f6e746578742073686f756c6420616c77617973207969656c64207a65726f2e01084c7265706f72745f65717569766f636174696f6e084865717569766f636174696f6e5f70726f6f667045717569766f636174696f6e50726f6f663c543a3a4865616465723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66100d01205265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c207665726966790901207468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66110120616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c34206265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e6564084865717569766f636174696f6e5f70726f6f667045717569766f636174696f6e50726f6f663c543a3a4865616465723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66200d01205265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c207665726966790901207468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66110120616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c34206265207265706f727465642e110120546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c79190120626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c206173207375636819012069662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e28207265706f727465722e00083445706f63684475726174696f6e0c75363420c800000000000000080d0120546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746ffc2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e444578706563746564426c6f636b54696d6524543a3a4d6f6d656e7420b80b00000000000014050120546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e67110120626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f75740501207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f740901206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473a0207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e002454696d657374616d70012454696d657374616d70080c4e6f77010024543a3a4d6f6d656e7420000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e24446964557064617465010010626f6f6c040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01040c736574040c6e6f7748436f6d706163743c543a3a4d6f6d656e743e3c5820536574207468652063757272656e742074696d652e00590120546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed82070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e004501205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e74207370656369666965642062794420604d696e696d756d506572696f64602e00d820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e002c2023203c7765696768743ed0202d20604f285429602077686572652060546020636f6d706c6578697479206f6620606f6e5f74696d657374616d705f73657460a101202d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202862656361757365206f6620604469645570646174653a3a74616b656020696e20606f6e5f66696e616c697a656029b4202d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f7365746020604f285429602e302023203c2f7765696768743e0004344d696e696d756d506572696f6424543a3a4d6f6d656e7420dc0500000000000010690120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f64690120746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c79650120776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c6520746869737020706572696f64206f6e2064656661756c742073657474696e67732e0028417574686f72736869700128417574686f72736869700c18556e636c65730100e85665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e0400041c20556e636c657318417574686f72000030543a3a4163636f756e7449640400046420417574686f72206f662063757272656e7420626c6f636b2e30446964536574556e636c6573010010626f6f6c040004bc205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e0104287365745f756e636c657304286e65775f756e636c6573385665633c543a3a4865616465723e04642050726f76696465206120736574206f6620756e636c65732e00001c48496e76616c6964556e636c65506172656e74048c2054686520756e636c6520706172656e74206e6f7420696e2074686520636861696e2e40556e636c6573416c7265616479536574048420556e636c657320616c72656164792073657420696e2074686520626c6f636b2e34546f6f4d616e79556e636c6573044420546f6f206d616e7920756e636c65732e3047656e65736973556e636c6504582054686520756e636c652069732067656e657369732e30546f6f48696768556e636c6504802054686520756e636c6520697320746f6f206869676820696e20636861696e2e50556e636c65416c7265616479496e636c75646564047c2054686520756e636c6520697320616c726561647920696e636c756465642e204f6c64556e636c6504b82054686520756e636c652069736e277420726563656e7420656e6f75676820746f20626520696e636c756465642e1c496e6469636573011c496e646963657304204163636f756e74730001023c543a3a4163636f756e74496e6465788828543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20626f6f6c29000400048820546865206c6f6f6b75702066726f6d20696e64657820746f206163636f756e742e011414636c61696d0414696e6465783c543a3a4163636f756e74496e6465784c9c2041737369676e20616e2070726576696f75736c7920756e61737369676e656420696e6465782e00e0205061796d656e743a20604465706f736974602069732072657365727665642066726f6d207468652073656e646572206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00f4202d2060696e646578603a2074686520696e64657820746f20626520636c61696d65642e2054686973206d757374206e6f7420626520696e207573652e009420456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e64202d204f6e652072657365727665206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2032382e363920c2b57394202d204442205765696768743a203120526561642f577269746520284163636f756e747329302023203c2f7765696768743e207472616e73666572080c6e657730543a3a4163636f756e74496414696e6465783c543a3a4163636f756e74496e6465785461012041737369676e20616e20696e64657820616c7265616479206f776e6564206279207468652073656e64657220746f20616e6f74686572206163636f756e742e205468652062616c616e6365207265736572766174696f6ebc206973206566666563746976656c79207472616e7366657272656420746f20746865206e6577206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002901202d2060696e646578603a2074686520696e64657820746f2062652072652d61737369676e65642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e6101202d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e009420456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e68202d204f6e65207472616e73666572206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2033332e373420c2b57334202d204442205765696768743ae4202020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e7429e8202020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e7429302023203c2f7765696768743e10667265650414696e6465783c543a3a4163636f756e74496e6465784c98204672656520757020616e20696e646578206f776e6564206279207468652073656e6465722e006101205061796d656e743a20416e792070726576696f7573206465706f73697420706c6163656420666f722074686520696e64657820697320756e726573657276656420696e207468652073656e646572206163636f756e742e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206f776e2074686520696e6465782e001101202d2060696e646578603a2074686520696e64657820746f2062652066726565642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e008820456d6974732060496e646578467265656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e64202d204f6e652072657365727665206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2032352e353320c2b57394202d204442205765696768743a203120526561642f577269746520284163636f756e747329302023203c2f7765696768743e38666f7263655f7472616e736665720c0c6e657730543a3a4163636f756e74496414696e6465783c543a3a4163636f756e74496e64657818667265657a6510626f6f6c58590120466f72636520616e20696e64657820746f20616e206163636f756e742e205468697320646f65736e277420726571756972652061206465706f7369742e2049662074686520696e64657820697320616c7265616479ec2068656c642c207468656e20616e79206465706f736974206973207265696d62757273656420746f206974732063757272656e74206f776e65722e00c820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e00a8202d2060696e646578603a2074686520696e64657820746f206265202872652d2961737369676e65642e6101202d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e4501202d2060667265657a65603a2069662073657420746f206074727565602c2077696c6c20667265657a652074686520696e64657820736f2069742063616e6e6f74206265207472616e736665727265642e009420456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e7c202d20557020746f206f6e652072657365727665206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2032362e383320c2b57334202d204442205765696768743af8202020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e657229fc202020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e657229302023203c2f7765696768743e18667265657a650414696e6465783c543a3a4163636f756e74496e64657848690120467265657a6520616e20696e64657820736f2069742077696c6c20616c7761797320706f696e7420746f207468652073656e646572206163636f756e742e205468697320636f6e73756d657320746865206465706f7369742e005d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d7573742068617665206170206e6f6e2d66726f7a656e206163636f756e742060696e646578602e00b0202d2060696e646578603a2074686520696e64657820746f2062652066726f7a656e20696e20706c6163652e008c20456d6974732060496e64657846726f7a656e60206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e74202d20557020746f206f6e6520736c617368206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2033302e383620c2b57394202d204442205765696768743a203120526561642f577269746520284163636f756e747329302023203c2f7765696768743e010c34496e64657841737369676e656408244163636f756e744964304163636f756e74496e64657804ac2041206163636f756e7420696e646578207761732061737369676e65642e205b77686f2c20696e6465785d28496e646578467265656404304163636f756e74496e64657804e02041206163636f756e7420696e64657820686173206265656e2066726565642075702028756e61737369676e6564292e205b696e6465785d2c496e64657846726f7a656e08304163636f756e74496e646578244163636f756e7449640421012041206163636f756e7420696e64657820686173206265656e2066726f7a656e20746f206974732063757272656e74206163636f756e742049442e205b77686f2c20696e6465785d041c4465706f7369743042616c616e63654f663c543e4000407a10f35a0000000000000000000004ac20546865206465706f736974206e656564656420666f7220726573657276696e6720616e20696e6465782e002042616c616e636573012042616c616e6365731034546f74616c49737375616e6365010028543a3a42616c616e6365400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e1c4163636f756e7401010230543a3a4163636f756e7449645c4163636f756e74446174613c543a3a42616c616e63653e000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6c205468652062616c616e6365206f6620616e206163636f756e742e004101204e4f54453a2054686973206973206f6e6c79207573656420696e20746865206361736520746861742074686973206d6f64756c65206973207573656420746f2073746f72652062616c616e6365732e144c6f636b7301010230543a3a4163636f756e744964705665633c42616c616e63654c6f636b3c543a3a42616c616e63653e3e00040008b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2501204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e3853746f7261676556657273696f6e01002052656c656173657304000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e00a020546869732069732073657420746f2076322e302e3020666f72206e6577206e6574776f726b732e0110207472616e736665720810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e6cd8205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e00090120607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e21012049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e1501204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b4206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e00190120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e002c2023203c7765696768743e3101202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72cc202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e6901202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e004c2052656c617465642066756e6374696f6e733a0051012020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2d012020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365d420202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e61012020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765722060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e636564602e49012020202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616cf82020202020636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e88202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d4501202d2042617365205765696768743a2037332e363420c2b5732c20776f7273742063617365207363656e6172696f20286163636f756e7420637265617465642c206163636f756e742072656d6f76656429dc202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374696e6174696f6e206163636f756e741501202d204f726967696e206163636f756e7420697320616c726561647920696e206d656d6f72792c20736f206e6f204442206f7065726174696f6e7320666f72207468656d2e302023203c2f7765696768743e2c7365745f62616c616e63650c0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365206e65775f667265654c436f6d706163743c543a3a42616c616e63653e306e65775f72657365727665644c436f6d706163743c543a3a42616c616e63653e489420536574207468652062616c616e636573206f66206120676976656e206163636f756e742e00210120546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c090120616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e190120496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c01012069742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e00b420546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e002c2023203c7765696768743e80202d20496e646570656e64656e74206f662074686520617267756d656e74732ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e58202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743a6820202020202d204372656174696e673a2032372e353620c2b5736420202020202d204b696c6c696e673a2033352e313120c2b57398202d204442205765696768743a203120526561642c203120577269746520746f206077686f60302023203c2f7765696768743e38666f7263655f7472616e736665720c18736f757263658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636510646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e1851012045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d61792062652c207370656369666965642e2c2023203c7765696768743e4101202d2053616d65206173207472616e736665722c20627574206164646974696f6e616c207265616420616e6420777269746520626563617573652074686520736f75726365206163636f756e74206973902020206e6f7420617373756d656420746f20626520696e20746865206f7665726c61792e302023203c2f7765696768743e4c7472616e736665725f6b6565705f616c6976650810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e2c51012053616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c2074686540206f726967696e206163636f756e742e00bc20393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e00c4205b607472616e73666572605d3a207374727563742e4d6f64756c652e68746d6c236d6574686f642e7472616e736665722c2023203c7765696768743ee8202d2043686561706572207468616e207472616e736665722062656361757365206163636f756e742063616e6e6f74206265206b696c6c65642e60202d2042617365205765696768743a2035312e3420c2b5731d01202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374202873656e64657220697320696e206f7665726c617920616c7265616479292c20233c2f7765696768743e01201c456e646f77656408244163636f756e7449641c42616c616e6365041d0120416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e205b6163636f756e742c20667265655f62616c616e63655d20447573744c6f737408244163636f756e7449641c42616c616e636508410120416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77204578697374656e7469616c4465706f7369742cc820726573756c74696e6720696e20616e206f75747269676874206c6f73732e205b6163636f756e742c2062616c616e63655d205472616e736665720c244163636f756e744964244163636f756e7449641c42616c616e63650498205472616e73666572207375636365656465642e205b66726f6d2c20746f2c2076616c75655d2842616c616e63655365740c244163636f756e7449641c42616c616e63651c42616c616e636504c420412062616c616e6365207761732073657420627920726f6f742e205b77686f2c20667265652c2072657365727665645d1c4465706f73697408244163636f756e7449641c42616c616e636504190120536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e205b77686f2c206465706f7369745d20526573657276656408244163636f756e7449641c42616c616e636504190120536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e205b77686f2c2076616c75655d28556e726573657276656408244163636f756e7449641c42616c616e636504210120536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e205b77686f2c2076616c75655d4852657365727665526570617472696174656410244163636f756e744964244163636f756e7449641c42616c616e6365185374617475730c510120536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742edc2046696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652ea0205b66726f6d2c20746f2c2062616c616e63652c2064657374696e6174696f6e5f7374617475735d04484578697374656e7469616c4465706f73697428543a3a42616c616e63654000407a10f35a0000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e203856657374696e6742616c616e6365049c2056657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c7565544c69717569646974795265737472696374696f6e7304c8204163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c204f766572666c6f77047420476f7420616e206f766572666c6f7720616674657220616464696e674c496e73756666696369656e7442616c616e636504782042616c616e636520746f6f206c6f7720746f2073656e642076616c7565484578697374656e7469616c4465706f73697404ec2056616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f736974244b656570416c6976650490205472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e745c4578697374696e6756657374696e675363686564756c6504cc20412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742c446561644163636f756e74048c2042656e6566696369617279206163636f756e74206d757374207072652d6578697374485472616e73616374696f6e5061796d656e7401485472616e73616374696f6e5061796d656e7408444e6578744665654d756c7469706c6965720100284d756c7469706c69657240000064a7b3b6e00d0000000000000000003853746f7261676556657273696f6e01002052656c6561736573040000000008485472616e73616374696f6e427974654665653042616c616e63654f663c543e4000e40b54020000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e2c576569676874546f466565a45665633c576569676874546f466565436f656666696369656e743c42616c616e63654f663c543e3e3e5c0401000000000000000000000000000000000000000001040d012054686520706f6c796e6f6d69616c2074686174206973206170706c69656420696e206f7264657220746f20646572697665206665652066726f6d207765696768742e001c5374616b696e67011c5374616b696e678c30486973746f7279446570746801000c75333210540000001c8c204e756d626572206f66206572617320746f206b65657020696e20686973746f72792e00390120496e666f726d6174696f6e206973206b65707420666f72206572617320696e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e006101204d757374206265206d6f7265207468616e20746865206e756d626572206f6620657261732064656c617965642062792073657373696f6e206f74686572776973652e20492e652e2061637469766520657261206d757374390120616c7761797320626520696e20686973746f72792e20492e652e20606163746976655f657261203e2063757272656e745f657261202d20686973746f72795f646570746860206d757374206265302067756172616e746565642e3856616c696461746f72436f756e7401000c753332100000000004a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e7401000c7533321000000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e34496e76756c6e657261626c65730100445665633c543a3a4163636f756e7449643e04000c590120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e636520746865792772654d01206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f7572ac20696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e64656400010530543a3a4163636f756e74496430543a3a4163636f756e744964000400040101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e184c656467657200010230543a3a4163636f756e744964a45374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e14506179656501010530543a3a4163636f756e7449647c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e00040004e42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e2856616c696461746f727301010530543a3a4163636f756e7449643856616c696461746f72507265667300040004450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e284e6f6d696e61746f727300010530543a3a4163636f756e744964644e6f6d696e6174696f6e733c543a3a4163636f756e7449643e00040004650120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e2843757272656e74457261000020457261496e6465780400105c205468652063757272656e742065726120696e6465782e006501205468697320697320746865206c617465737420706c616e6e6564206572612c20646570656e64696e67206f6e20686f77207468652053657373696f6e2070616c6c657420717565756573207468652076616c696461746f7280207365742c206974206d6967687420626520616374697665206f72206e6f742e24416374697665457261000034416374697665457261496e666f040010d820546865206163746976652065726120696e666f726d6174696f6e2c20697420686f6c647320696e64657820616e642073746172742e00b820546865206163746976652065726120697320746865206572612063757272656e746c792072657761726465642e2d012056616c696461746f7220736574206f66207468697320657261206d75737420626520657175616c20746f206053657373696f6e496e746572666163653a3a76616c696461746f7273602e5445726173537461727453657373696f6e496e64657800010520457261496e6465783053657373696f6e496e646578000400043101205468652073657373696f6e20696e646578206174207768696368207468652065726120737461727420666f7220746865206c6173742060484953544f52595f44455054486020657261732e2c457261735374616b65727301020520457261496e64657830543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e050c0000001878204578706f73757265206f662076616c696461746f72206174206572612e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e48457261735374616b657273436c697070656401020520457261496e64657830543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e050c0000002c9820436c6970706564204578706f73757265206f662076616c696461746f72206174206572612e00590120546869732069732073696d696c617220746f205b60457261735374616b657273605d20627574206e756d626572206f66206e6f6d696e61746f7273206578706f736564206973207265647563656420746f20746865dc2060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732e1d0120284e6f74653a20746865206669656c642060746f74616c6020616e6420606f776e60206f6620746865206578706f737572652072656d61696e7320756e6368616e676564292ef42054686973206973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e005d012054686973206973206b657965642066697374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e484572617356616c696461746f72507265667301020520457261496e64657830543a3a4163636f756e7449643856616c696461746f7250726566730504001411012053696d696c617220746f2060457261735374616b657273602c207468697320686f6c64732074686520707265666572656e636573206f662076616c696461746f72732e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4c4572617356616c696461746f7252657761726400010520457261496e6465783042616c616e63654f663c543e0004000c09012054686520746f74616c2076616c696461746f7220657261207061796f757420666f7220746865206c6173742060484953544f52595f44455054486020657261732e0021012045726173207468617420686176656e27742066696e697368656420796574206f7220686173206265656e2072656d6f76656420646f65736e27742068617665207265776172642e4045726173526577617264506f696e747301010520457261496e64657874457261526577617264506f696e74733c543a3a4163636f756e7449643e0014000000000008ac205265776172647320666f7220746865206c6173742060484953544f52595f44455054486020657261732e250120496620726577617264206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207265776172642069732072657475726e65642e3845726173546f74616c5374616b6501010520457261496e6465783042616c616e63654f663c543e00400000000000000000000000000000000008ec2054686520746f74616c20616d6f756e74207374616b656420666f7220746865206c6173742060484953544f52595f44455054486020657261732e1d0120496620746f74616c206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207374616b652069732072657475726e65642e20466f72636545726101001c466f7263696e6704000454204d6f6465206f662065726120666f7263696e672e4c536c6173685265776172644672616374696f6e01001c50657262696c6c10000000000cf8205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e00e4205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e4c43616e63656c6564536c6173685061796f757401003042616c616e63654f663c543e40000000000000000000000000000000000815012054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e7420776869636820776173ec2063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e40556e6170706c696564536c617368657301010520457261496e646578bc5665633c556e6170706c696564536c6173683c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3e00040004c420416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e28426f6e646564457261730100745665633c28457261496e6465782c2053657373696f6e496e646578293e04001025012041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e00c8204d75737420636f6e7461696e7320696e666f726d6174696f6e20666f72206572617320666f72207468652072616e67653abc20605b6163746976655f657261202d20626f756e64696e675f6475726174696f6e3b206163746976655f6572615d604c56616c696461746f72536c617368496e45726100020520457261496e64657830543a3a4163636f756e7449645c2850657262696c6c2c2042616c616e63654f663c543e2905040008450120416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e7020616e6420736c6173682076616c7565206f6620746865206572612e4c4e6f6d696e61746f72536c617368496e45726100020520457261496e64657830543a3a4163636f756e7449643042616c616e63654f663c543e05040004610120416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e34536c617368696e675370616e7300010530543a3a4163636f756e7449645c736c617368696e673a3a536c617368696e675370616e73000400048c20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e245370616e536c6173680101058c28543a3a4163636f756e7449642c20736c617368696e673a3a5370616e496e6465782988736c617368696e673a3a5370616e5265636f72643c42616c616e63654f663c543e3e00800000000000000000000000000000000000000000000000000000000000000000083d01205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2cb82061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e584561726c69657374556e6170706c696564536c617368000020457261496e646578040004fc20546865206561726c696573742065726120666f72207768696368207765206861766520612070656e64696e672c20756e6170706c69656420736c6173682e48536e617073686f7456616c696461746f72730000445665633c543a3a4163636f756e7449643e040008650120536e617073686f74206f662076616c696461746f72732061742074686520626567696e6e696e67206f66207468652063757272656e7420656c656374696f6e2077696e646f772e20546869732073686f756c64206f6e6c791901206861766520612076616c7565207768656e205b60457261456c656374696f6e537461747573605d203d3d2060456c656374696f6e5374617475733a3a4f70656e285f29602e48536e617073686f744e6f6d696e61746f72730000445665633c543a3a4163636f756e7449643e040008650120536e617073686f74206f66206e6f6d696e61746f72732061742074686520626567696e6e696e67206f66207468652063757272656e7420656c656374696f6e2077696e646f772e20546869732073686f756c64206f6e6c791901206861766520612076616c7565207768656e205b60457261456c656374696f6e537461747573605d203d3d2060456c656374696f6e5374617475733a3a4f70656e285f29602e34517565756564456c65637465640000a8456c656374696f6e526573756c743c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e04000c650120546865206e6578742076616c696461746f72207365742e2041742074686520656e64206f6620616e206572612c206966207468697320697320617661696c61626c652028706f74656e7469616c6c792066726f6d20746865610120726573756c74206f6620616e206f6666636861696e20776f726b6572292c20697420697320696d6d6564696174656c7920757365642e204f74686572776973652c20746865206f6e2d636861696e20656c656374696f6e342069732065786563757465642e2c51756575656453636f7265000034456c656374696f6e53636f7265040004b0205468652073636f7265206f66207468652063757272656e74205b60517565756564456c6563746564605d2e44457261456c656374696f6e537461747573010078456c656374696f6e5374617475733c543a3a426c6f636b4e756d6265723e040008490120466c616720746f20636f6e74726f6c2074686520657865637574696f6e206f6620746865206f6666636861696e20656c656374696f6e2e205768656e20604f70656e285f29602c207765206163636570746c20736f6c7574696f6e7320746f206265207375626d69747465642e54497343757272656e7453657373696f6e46696e616c010010626f6f6c0400084d012054727565206966207468652063757272656e74202a2a706c616e6e65642a2a2073657373696f6e2069732066696e616c2e204e6f74652074686174207468697320646f6573206e6f742074616b65206572615820666f7263696e6720696e746f206163636f756e742e3853746f7261676556657273696f6e01002052656c6561736573040310cc2054727565206966206e6574776f726b20686173206265656e20757067726164656420746f20746869732076657273696f6e2e7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e00a020546869732069732073657420746f2076332e302e3020666f72206e6577206e6574776f726b732e016010626f6e640c28636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e1470617965657c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e5865012054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c8420626520746865206163636f756e74207468617420636f6e74726f6c732069742e003101206076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e00250120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e004020456d6974732060426f6e646564602e002c2023203c7765696768743ed4202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e20202d204f2831292e68202d20546872656520657874726120444220656e74726965732e005101204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e6564410120756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e4c202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2036372e383720c2b5732c204442205765696768743a3101202d20526561643a20426f6e6465642c204c65646765722c205b4f726967696e204163636f756e745d2c2043757272656e74204572612c20486973746f72792044657074682c204c6f636b73e0202d2057726974653a20426f6e6465642c2050617965652c205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572302023203c2f7765696768743e28626f6e645f657874726104386d61785f6164646974696f6e616c54436f6d706163743c42616c616e63654f663c543e3e5865012041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e63652075703420666f72207374616b696e672e00510120557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e650120556e6c696b65205b60626f6e64605d206f72205b60756e626f6e64605d20746869732066756e6374696f6e20646f6573206e6f7420696d706f736520616e79206c696d69746174696f6e206f6e2074686520616d6f756e744c20746861742063616e2062652061646465642e00610120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c657220616e64f82069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e004020456d6974732060426f6e646564602e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e20202d204f2831292e40202d204f6e6520444220656e7472792e34202d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2035342e383820c2b5732c204442205765696768743a1501202d20526561643a2045726120456c656374696f6e205374617475732c20426f6e6465642c204c65646765722c205b4f726967696e204163636f756e745d2c204c6f636b73a4202d2057726974653a205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572302023203c2f7765696768743e18756e626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e805501205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64010120706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e250120543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e004901204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665c0207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e003d01204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360293d012063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e656564fc20746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e004820456d6974732060556e626f6e646564602e00982053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e002c2023203c7765696768743e4101202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e6501202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e63656029710120202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652e5101202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c6564207669615c2020206077697468647261775f756e626f6e646564602e40202d204f6e6520444220656e7472792e2c202d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2035302e333420c2b5732c204442205765696768743a2901202d20526561643a2045726120456c656374696f6e205374617475732c204c65646765722c2043757272656e74204572612c204c6f636b732c205b4f726967696e204163636f756e745da4202d2057726974653a205b4f726967696e204163636f756e745d2c204c6f636b732c204c656467657228203c2f7765696768743e4477697468647261775f756e626f6e64656404486e756d5f736c617368696e675f7370616e730c753332782d012052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e003501205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4c2077686174657665722069742077616e74732e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e004c20456d697473206057697468647261776e602e006c2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e002c2023203c7765696768743e5501202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e45012020497420696d706c6965732060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c207768696368206973f42020696e6469726563746c7920757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e7901202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e40202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d090120436f6d706c6578697479204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2072656d6f7665342042617365205765696768743a74205570646174653a2035302e3532202b202e303238202a205320c2b5732501202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c2043757272656e74204572612c204c6f636b732c205b4f726967696e204163636f756e745da8202d205772697465733a205b4f726967696e204163636f756e745d2c204c6f636b732c204c656467657270204b696c6c3a2037392e3431202b20322e333636202a205320c2b5738501202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c2043757272656e74204572612c20426f6e6465642c20536c617368696e67205370616e732c205b4f726967696e204163636f756e745d2c204c6f636b73b101202d205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c205b4f726967696e204163636f756e745d2c204c6f636b7374202d2057726974657320456163683a205370616e536c617368202a20530d01204e4f54453a2057656967687420616e6e6f746174696f6e20697320746865206b696c6c207363656e6172696f2c20776520726566756e64206f74686572776973652e302023203c2f7765696768743e2076616c6964617465041470726566733856616c696461746f72507265667344e8204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e30202d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2031372e313320c2b5732c204442205765696768743a90202d20526561643a2045726120456c656374696f6e205374617475732c204c656467657280202d2057726974653a204e6f6d696e61746f72732c2056616c696461746f7273302023203c2f7765696768743e206e6f6d696e617465041c74617267657473a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e4c1101204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00510120456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546869732063616e206f6e6c792062652063616c6c6564207768656e8c205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743e3101202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f662060746172676574736020284e2901012077686963682069732063617070656420617420436f6d7061637441737369676e6d656e74733a3a4c494d495420284d41585f4e4f4d494e4154494f4e53292ed8202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e28202d2d2d2d2d2d2d2d2d842042617365205765696768743a2032322e3334202b202e3336202a204e20c2b57384207768657265204e20697320746865206e756d626572206f6620746172676574732c204442205765696768743ac8202d2052656164733a2045726120456c656374696f6e205374617475732c204c65646765722c2043757272656e742045726184202d205772697465733a2056616c696461746f72732c204e6f6d696e61746f7273302023203c2f7765696768743e146368696c6c0044c8204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e54202d20436f6e7461696e73206f6e6520726561642ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e24202d2d2d2d2d2d2d2d5c2042617365205765696768743a2031362e353320c2b5732c204442205765696768743a88202d20526561643a20457261456c656374696f6e5374617475732c204c656467657280202d2057726974653a2056616c696461746f72732c204e6f6d696e61746f7273302023203c2f7765696768743e247365745f7061796565041470617965657c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e40b8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e28202d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2031312e333320c2b57334202d204442205765696768743a4c20202020202d20526561643a204c65646765724c20202020202d2057726974653a205061796565302023203c2f7765696768743e387365745f636f6e74726f6c6c65720428636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654090202852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e2c202d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2032352e323220c2b5732c204442205765696768743af4202d20526561643a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c6572f8202d2057726974653a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c6572302023203c2f7765696768743e4c7365745f76616c696461746f725f636f756e74040c6e657730436f6d706163743c7533323e209420536574732074686520696465616c206e756d626572206f662076616c696461746f72732e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e5c2042617365205765696768743a20312e37313720c2b5735c2057726974653a2056616c696461746f7220436f756e74302023203c2f7765696768743e60696e6372656173655f76616c696461746f725f636f756e7404286164646974696f6e616c30436f6d706163743c7533323e20ac20496e6372656d656e74732074686520696465616c206e756d626572206f662076616c696461746f72732e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e5c2042617365205765696768743a20312e37313720c2b5737020526561642f57726974653a2056616c696461746f7220436f756e74302023203c2f7765696768743e547363616c655f76616c696461746f725f636f756e740418666163746f721c50657263656e7420d4205363616c652075702074686520696465616c206e756d626572206f662076616c696461746f7273206279206120666163746f722e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e5c2042617365205765696768743a20312e37313720c2b5737020526561642f57726974653a2056616c696461746f7220436f756e74302023203c2f7765696768743e34666f7263655f6e6f5f657261730024b020466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e64202d2042617365205765696768743a20312e38353720c2b57348202d2057726974653a20466f726365457261302023203c2f7765696768743e34666f7263655f6e65775f65726100284d0120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c206265a020726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e64202d2042617365205765696768743a20312e39353920c2b57344202d20577269746520466f726365457261302023203c2f7765696768743e447365745f696e76756c6e657261626c6573042876616c696461746f7273445665633c543a3a4163636f756e7449643e24cc20536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e1c202d204f28562990202d2042617365205765696768743a20322e323038202b202e303036202a205620c2b5735c202d2057726974653a20496e76756c6e657261626c6573302023203c2f7765696768743e34666f7263655f756e7374616b650814737461736830543a3a4163636f756e744964486e756d5f736c617368696e675f7370616e730c7533322c0d0120466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743eec204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2062652072656d6f7665648c2042617365205765696768743a2035332e3037202b20322e333635202a205320c2b573b82052656164733a20426f6e6465642c20536c617368696e67205370616e732c204163636f756e742c204c6f636b738501205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c204163636f756e742c204c6f636b736c2057726974657320456163683a205370616e536c617368202a2053302023203c2f7765696768743e50666f7263655f6e65775f6572615f616c776179730020050120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e60202d2042617365205765696768743a20322e303520c2b57348202d2057726974653a20466f726365457261302023203c2f7765696768743e5463616e63656c5f64656665727265645f736c617368080c65726120457261496e64657834736c6173685f696e6469636573205665633c7533323e38982043616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e00b42043616e2062652063616c6c6564206279207468652060543a3a536c61736843616e63656c4f726967696e602e00050120506172616d65746572733a2065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e002c2023203c7765696768743e5420436f6d706c65786974793a204f2855202b205329b82077697468205520756e6170706c69656420736c6173686573207765696768746564207769746820553d31303030d420616e64205320697320746865206e756d626572206f6620736c61736820696e646963657320746f2062652063616e63656c65642e74202d20426173653a2035383730202b2033342e3631202a205320c2b57368202d20526561643a20556e6170706c69656420536c61736865736c202d2057726974653a20556e6170706c69656420536c6173686573302023203c2f7765696768743e387061796f75745f7374616b657273083c76616c696461746f725f737461736830543a3a4163636f756e7449640c65726120457261496e64657864110120506179206f757420616c6c20746865207374616b65727320626568696e6420612073696e676c652076616c696461746f7220666f7220612073696e676c65206572612e004d01202d206076616c696461746f725f73746173686020697320746865207374617368206163636f756e74206f66207468652076616c696461746f722e205468656972206e6f6d696e61746f72732c20757020746f290120202060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602c2077696c6c20616c736f207265636569766520746865697220726577617264732e3501202d206065726160206d617920626520616e7920657261206265747765656e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e00590120546865206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e20416e79206163636f756e742063616e2063616c6c20746869732066756e6374696f6e2c206576656e20696678206974206973206e6f74206f6e65206f6620746865207374616b6572732e00010120546869732063616e206f6e6c792062652063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743e0101202d2054696d6520636f6d706c65786974793a206174206d6f7374204f284d61784e6f6d696e61746f72526577617264656450657256616c696461746f72292ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e30202d2d2d2d2d2d2d2d2d2d2d1d01204e20697320746865204e756d626572206f66207061796f75747320666f72207468652076616c696461746f722028696e636c7564696e67207468652076616c696461746f7229342042617365205765696768743a0101202d205265776172642044657374696e6174696f6e205374616b65643a20313130202b2035342e32202a204e20c2b57320284d656469616e20536c6f706573294101202d205265776172642044657374696e6174696f6e20436f6e74726f6c6c657220284372656174696e67293a20313230202b2034312e3935202a204e20c2b57320284d656469616e20536c6f706573292c204442205765696768743a2901202d20526561643a20457261456c656374696f6e5374617475732c2043757272656e744572612c20486973746f727944657074682c204572617356616c696461746f725265776172642c2d01202020202020202020457261735374616b657273436c69707065642c2045726173526577617264506f696e74732c204572617356616c696461746f725072656673202838206974656d73291101202d205265616420456163683a20426f6e6465642c204c65646765722c2050617965652c204c6f636b732c2053797374656d204163636f756e74202835206974656d7329d8202d20577269746520456163683a2053797374656d204163636f756e742c204c6f636b732c204c6564676572202833206974656d7329302023203c2f7765696768743e187265626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e3ce0205265626f6e64206120706f7274696f6e206f6620746865207374617368207363686564756c656420746f20626520756e6c6f636b65642e00550120546865206469737061746368206f726967696e206d757374206265207369676e65642062792074686520636f6e74726f6c6c65722c20616e642069742063616e206265206f6e6c792063616c6c6564207768656e8c205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743ed4202d2054696d6520636f6d706c65786974793a204f284c292c207768657265204c20697320756e6c6f636b696e67206368756e6b7394202d20426f756e64656420627920604d41585f554e4c4f434b494e475f4348554e4b53602ef4202d2053746f72616765206368616e6765733a2043616e277420696e6372656173652073746f726167652c206f6e6c792064656372656173652069742e40202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d98202d2042617365205765696768743a2033342e353120c2b573202a202e303438204c20c2b57334202d204442205765696768743a010120202020202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c204c6f636b732c205b4f726967696e204163636f756e745db820202020202d205772697465733a205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572302023203c2f7765696768743e447365745f686973746f72795f646570746808446e65775f686973746f72795f646570746844436f6d706163743c457261496e6465783e485f6572615f6974656d735f64656c6574656430436f6d706163743c7533323e543101205365742060486973746f72794465707468602076616c75652e20546869732066756e6374696f6e2077696c6c2064656c65746520616e7920686973746f727920696e666f726d6174696f6e80207768656e2060486973746f727944657074686020697320726564756365642e003020506172616d65746572733a1101202d20606e65775f686973746f72795f6465707468603a20546865206e657720686973746f727920646570746820796f7520776f756c64206c696b6520746f207365742e4901202d20606572615f6974656d735f64656c65746564603a20546865206e756d626572206f66206974656d7320746861742077696c6c2062652064656c6574656420627920746869732064697370617463682e450120202020546869732073686f756c64207265706f727420616c6c207468652073746f72616765206974656d7320746861742077696c6c2062652064656c6574656420627920636c656172696e67206f6c6445012020202065726120686973746f72792e204e656564656420746f207265706f727420616e2061636375726174652077656967687420666f72207468652064697370617463682e2054727573746564206279a02020202060526f6f746020746f207265706f727420616e206163637572617465206e756d6265722e0054204f726967696e206d75737420626520726f6f742e002c2023203c7765696768743ee0202d20453a204e756d626572206f6620686973746f7279206465707468732072656d6f7665642c20692e652e203130202d3e2037203d203374202d2042617365205765696768743a2032392e3133202a204520c2b57334202d204442205765696768743aa020202020202d2052656164733a2043757272656e74204572612c20486973746f72792044657074687020202020202d205772697465733a20486973746f7279204465707468310120202020202d20436c6561722050726566697820456163683a20457261205374616b6572732c204572615374616b657273436c69707065642c204572617356616c696461746f725072656673810120202020202d2057726974657320456163683a204572617356616c696461746f725265776172642c2045726173526577617264506f696e74732c2045726173546f74616c5374616b652c2045726173537461727453657373696f6e496e646578302023203c2f7765696768743e28726561705f73746173680814737461736830543a3a4163636f756e744964486e756d5f736c617368696e675f7370616e730c7533324039012052656d6f766520616c6c20646174612073747275637475726520636f6e6365726e696e672061207374616b65722f7374617368206f6e6365206974732062616c616e6365206973207a65726f2e6101205468697320697320657373656e7469616c6c79206571756976616c656e7420746f206077697468647261775f756e626f6e64656460206578636570742069742063616e2062652063616c6c656420627920616e796f6e65c020616e6420746865207461726765742060737461736860206d7573742068617665206e6f2066756e6473206c6566742e009020546869732063616e2062652063616c6c65642066726f6d20616e79206f726967696e2e000101202d20607374617368603a20546865207374617368206163636f756e7420746f20726561702e204974732062616c616e6365206d757374206265207a65726f2e002c2023203c7765696768743e250120436f6d706c65786974793a204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e73206f6e20746865206163636f756e742e8c2042617365205765696768743a2037352e3934202b20322e333936202a205320c2b5732c204442205765696768743ad8202d2052656164733a205374617368204163636f756e742c20426f6e6465642c20536c617368696e67205370616e732c204c6f636b73a501202d205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c205374617368204163636f756e742c204c6f636b7374202d2057726974657320456163683a205370616e536c617368202a2053302023203c2f7765696768743e607375626d69745f656c656374696f6e5f736f6c7574696f6e141c77696e6e6572734c5665633c56616c696461746f72496e6465783e1c636f6d7061637448436f6d7061637441737369676e6d656e74731473636f726534456c656374696f6e53636f72650c65726120457261496e6465781073697a6530456c656374696f6e53697a65bce4205375626d697420616e20656c656374696f6e20726573756c7420746f2074686520636861696e2e2049662074686520736f6c7574696f6e3a003420312e2069732076616c69642e150120322e206861732061206265747465722073636f7265207468616e206120706f74656e7469616c6c79206578697374696e6720736f6c7574696f6e206f6e20636861696e2e0084207468656e2c2069742077696c6c206265205f7075745f206f6e20636861696e2e00ac204120736f6c7574696f6e20636f6e7369737473206f662074776f20706965636573206f6620646174613a00f420312e206077696e6e657273603a206120666c617420766563746f72206f6620616c6c207468652077696e6e657273206f662074686520726f756e642e510120322e206061737369676e6d656e7473603a2074686520636f6d706163742076657273696f6e206f6620616e2061737369676e6d656e7420766563746f72207468617420656e636f6465732074686520656467653020202020776569676874732e00210120426f7468206f66207768696368206d617920626520636f6d7075746564207573696e67205f70687261676d656e5f2c206f7220616e79206f7468657220616c676f726974686d2e00a8204164646974696f6e616c6c792c20746865207375626d6974746572206d7573742070726f766964653a00c8202d20546865206073636f7265602074686174207468657920636c61696d20746865697220736f6c7574696f6e206861732e004d0120426f74682076616c696461746f727320616e64206e6f6d696e61746f72732077696c6c20626520726570726573656e74656420627920696e646963657320696e2074686520736f6c7574696f6e2e205468651d0120696e64696365732073686f756c6420726573706563742074686520636f72726573706f6e64696e6720747970657320285b6056616c696461746f72496e646578605d20616e643101205b604e6f6d696e61746f72496e646578605d292e204d6f72656f7665722c20746865792073686f756c642062652076616c6964207768656e207573656420746f20696e64657820696e746f5101205b60536e617073686f7456616c696461746f7273605d20616e64205b60536e617073686f744e6f6d696e61746f7273605d2e20416e7920696e76616c696420696e6465782077696c6c20636175736520746865610120736f6c7574696f6e20746f2062652072656a65637465642e2054686573652074776f2073746f72616765206974656d73206172652073657420647572696e672074686520656c656374696f6e2077696e646f7720616e6498206d6179206265207573656420746f2064657465726d696e652074686520696e64696365732e0060204120736f6c7574696f6e2069732076616c69642069663a00e420302e204974206973207375626d6974746564207768656e205b60457261456c656374696f6e537461747573605d20697320604f70656e602ef820312e2049747320636c61696d65642073636f726520697320657175616c20746f207468652073636f726520636f6d7075746564206f6e2d636861696e2eac20322e2050726573656e74732074686520636f7272656374206e756d626572206f662077696e6e6572732e550120332e20416c6c20696e6465786573206d7573742062652076616c7565206163636f7264696e6720746f2074686520736e617073686f7420766563746f72732e20416c6c20656467652076616c756573206d7573745d0120202020616c736f20626520636f727265637420616e642073686f756c64206e6f74206f766572666c6f7720746865206772616e756c6172697479206f662074686520726174696f20747970652028692e652e2032353640202020206f722062696c6c696f6e292e0d0120342e20466f72206561636820656467652c20616c6c2074617267657473206172652061637475616c6c79206e6f6d696e617465642062792074686520766f7465722e6c20352e2048617320636f72726563742073656c662d766f7465732e00c0204120736f6c7574696f6e732073636f726520697320636f6e736973746564206f66203320706172616d65746572733a00650120312e20606d696e207b20737570706f72742e746f74616c207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c64206265206d6178696d697a65642e650120322e206073756d207b20737570706f72742e746f74616c207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c64206265206d696e696d697a65642e410120332e206073756d207b20737570706f72742e746f74616c5e32207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c642062659c202020206d696e696d697a65642028746f20656e73757265206c6573732076617269616e636529002c2023203c7765696768743e7020536565206063726174653a3a77656967687460206d6f64756c652e302023203c2f7765696768743e847375626d69745f656c656374696f6e5f736f6c7574696f6e5f756e7369676e6564141c77696e6e6572734c5665633c56616c696461746f72496e6465783e1c636f6d7061637448436f6d7061637441737369676e6d656e74731473636f726534456c656374696f6e53636f72650c65726120457261496e6465781073697a6530456c656374696f6e53697a6524c020556e7369676e65642076657273696f6e206f6620607375626d69745f656c656374696f6e5f736f6c7574696f6e602e005d01204e6f746520746861742074686973206d757374207061737320746865205b6056616c6964617465556e7369676e6564605d20636865636b207768696368206f6e6c7920616c6c6f7773207472616e73616374696f6e7361012066726f6d20746865206c6f63616c206e6f646520746f20626520696e636c756465642e20496e206f7468657220776f7264732c206f6e6c792074686520626c6f636b20617574686f722063616e20696e636c756465206168207472616e73616374696f6e20696e2074686520626c6f636b2e002c2023203c7765696768743e7020536565206063726174653a3a77656967687460206d6f64756c652e302023203c2f7765696768743e0124244572615061796f75740c20457261496e6465781c42616c616e63651c42616c616e63650c59012054686520657261207061796f757420686173206265656e207365743b207468652066697273742062616c616e6365206973207468652076616c696461746f722d7061796f75743b20746865207365636f6e64206973c4207468652072656d61696e6465722066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642ea4205b6572615f696e6465782c2076616c696461746f725f7061796f75742c2072656d61696e6465725d1852657761726408244163636f756e7449641c42616c616e636504f420546865207374616b657220686173206265656e207265776172646564206279207468697320616d6f756e742e205b73746173682c20616d6f756e745d14536c61736808244163636f756e7449641c42616c616e6365082501204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e50205b76616c696461746f722c20616d6f756e745d684f6c64536c617368696e675265706f7274446973636172646564043053657373696f6e496e646578081d0120416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c6488206e6f742062652070726f6365737365642e205b73657373696f6e5f696e6465785d3c5374616b696e67456c656374696f6e043c456c656374696f6e436f6d7075746504ec2041206e657720736574206f66207374616b6572732077617320656c656374656420776974682074686520676976656e205b636f6d707574655d2e38536f6c7574696f6e53746f726564043c456c656374696f6e436f6d707574650411012041206e657720736f6c7574696f6e20666f7220746865207570636f6d696e6720656c656374696f6e20686173206265656e2073746f7265642e205b636f6d707574655d18426f6e64656408244163636f756e7449641c42616c616e636510cc20416e206163636f756e742068617320626f6e646564207468697320616d6f756e742e205b73746173682c20616d6f756e745d005101204e4f54453a2054686973206576656e74206973206f6e6c7920656d6974746564207768656e2066756e64732061726520626f6e64656420766961206120646973706174636861626c652e204e6f7461626c792c25012069742077696c6c206e6f7420626520656d697474656420666f72207374616b696e672072657761726473207768656e20746865792061726520616464656420746f207374616b652e20556e626f6e64656408244163636f756e7449641c42616c616e636504d420416e206163636f756e742068617320756e626f6e646564207468697320616d6f756e742e205b73746173682c20616d6f756e745d2457697468647261776e08244163636f756e7449641c42616c616e6365085d0120416e206163636f756e74206861732063616c6c6564206077697468647261775f756e626f6e6465646020616e642072656d6f76656420756e626f6e64696e67206368756e6b7320776f727468206042616c616e636560a82066726f6d2074686520756e6c6f636b696e672071756575652e205b73746173682c20616d6f756e745d1c3853657373696f6e735065724572613053657373696f6e496e64657810060000000470204e756d626572206f662073657373696f6e7320706572206572612e3c426f6e64696e674475726174696f6e20457261496e64657810a002000004e4204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e48536c61736844656665724475726174696f6e20457261496e64657810a8000000140101204e756d626572206f662065726173207468617420736c6173686573206172652064656665727265642062792c20616674657220636f6d7075746174696f6e2e00bc20546869732073686f756c64206265206c657373207468616e2074686520626f6e64696e67206475726174696f6e2e2d012053657420746f203020696620736c61736865732073686f756c64206265206170706c69656420696d6d6564696174656c792c20776974686f7574206f70706f7274756e69747920666f723820696e74657276656e74696f6e2e44456c656374696f6e4c6f6f6b616865616438543a3a426c6f636b4e756d62657210320000001c710120546865206e756d626572206f6620626c6f636b73206265666f72652074686520656e64206f6620746865206572612066726f6d20776869636820656c656374696f6e207375626d697373696f6e732061726520616c6c6f7765642e006d012053657474696e67207468697320746f207a65726f2077696c6c2064697361626c6520746865206f6666636861696e20636f6d7075746520616e64206f6e6c79206f6e2d636861696e207365712d70687261676d656e2077696c6c2420626520757365642e007501205468697320697320626f756e646564206279206265696e672077697468696e20746865206c6173742073657373696f6e2e2048656e63652c2073657474696e6720697420746f20612076616c7565206d6f7265207468616e207468659c206c656e677468206f6620612073657373696f6e2077696c6c20626520706f696e746c6573732e344d6178497465726174696f6e730c753332100a0000000c2901204d6178696d756d206e756d626572206f662062616c616e63696e6720697465726174696f6e7320746f2072756e20696e20746865206f6666636861696e207375626d697373696f6e2e00ec2049662073657420746f20302c2062616c616e63655f736f6c7574696f6e2077696c6c206e6f7420626520657865637574656420617420616c6c2e504d696e536f6c7574696f6e53636f726542756d701c50657262696c6c1020a1070004610120546865207468726573686f6c64206f6620696d70726f76656d656e7420746861742073686f756c642062652070726f766964656420666f722061206e657720736f6c7574696f6e20746f2062652061636365707465642e804d61784e6f6d696e61746f72526577617264656450657256616c696461746f720c753332104000000010f820546865206d6178696d756d206e756d626572206f66206e6f6d696e61746f727320726577617264656420666f7220656163682076616c696461746f722e00690120466f7220656163682076616c696461746f72206f6e6c79207468652060244d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732063616e20636c61696d2101207468656972207265776172642e2054686973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e7c344e6f74436f6e74726f6c6c65720468204e6f74206120636f6e74726f6c6c6572206163636f756e742e204e6f7453746173680454204e6f742061207374617368206163636f756e742e34416c7265616479426f6e646564046420537461736820697320616c726561647920626f6e6465642e34416c7265616479506169726564047820436f6e74726f6c6c657220697320616c7265616479207061697265642e30456d70747954617267657473046420546172676574732063616e6e6f7420626520656d7074792e384475706c6963617465496e6465780444204475706c696361746520696e6465782e44496e76616c6964536c617368496e646578048820536c617368207265636f726420696e646578206f7574206f6620626f756e64732e44496e73756666696369656e7456616c756504cc2043616e206e6f7420626f6e6420776974682076616c7565206c657373207468616e206d696e696d756d2062616c616e63652e304e6f4d6f72654368756e6b7304942043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e344e6f556e6c6f636b4368756e6b04a42043616e206e6f74207265626f6e6420776974686f757420756e6c6f636b696e67206368756e6b732e3046756e64656454617267657404cc20417474656d7074696e6720746f2074617267657420612073746173682074686174207374696c6c206861732066756e64732e48496e76616c6964457261546f526577617264045c20496e76616c69642065726120746f207265776172642e68496e76616c69644e756d6265724f664e6f6d696e6174696f6e73047c20496e76616c6964206e756d626572206f66206e6f6d696e6174696f6e732e484e6f74536f72746564416e64556e697175650484204974656d7320617265206e6f7420736f7274656420616e6420756e697175652e38416c7265616479436c61696d6564040d01205265776172647320666f72207468697320657261206861766520616c7265616479206265656e20636c61696d656420666f7220746869732076616c696461746f722e7c4f6666636861696e456c656374696f6e4561726c795375626d697373696f6e04e420546865207375626d697474656420726573756c74206973207265636569766564206f7574206f6620746865206f70656e2077696e646f772e784f6666636861696e456c656374696f6e5765616b5375626d697373696f6e04010120546865207375626d697474656420726573756c74206973206e6f7420617320676f6f6420617320746865206f6e652073746f726564206f6e20636861696e2e4c536e617073686f74556e617661696c61626c6504d02054686520736e617073686f742064617461206f66207468652063757272656e742077696e646f77206973206d697373696e672e804f6666636861696e456c656374696f6e426f67757357696e6e6572436f756e7404b020496e636f7272656374206e756d626572206f662077696e6e65727320776572652070726573656e7465642e6c4f6666636861696e456c656374696f6e426f67757357696e6e6572086101204f6e65206f6620746865207375626d69747465642077696e6e657273206973206e6f7420616e206163746976652063616e646964617465206f6e20636861696e2028696e646578206973206f7574206f662072616e67653820696e20736e617073686f74292e704f6666636861696e456c656374696f6e426f677573436f6d70616374085d01204572726f72207768696c65206275696c64696e67207468652061737369676e6d656e7420747970652066726f6d2074686520636f6d706163742e20546869732063616e2068617070656e20696620616e20696e646578a820697320696e76616c69642c206f72206966207468652077656967687473205f6f766572666c6f775f2e784f6666636861696e456c656374696f6e426f6775734e6f6d696e61746f72041501204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f7273206973206e6f7420616e20616374697665206e6f6d696e61746f72206f6e20636861696e2e7c4f6666636861696e456c656374696f6e426f6775734e6f6d696e6174696f6e044d01204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f72732068617320616e206564676520746f20776869636820746865792068617665206e6f7420766f746564206f6e20636861696e2e844f6666636861696e456c656374696f6e536c61736865644e6f6d696e6174696f6e086101204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f72732068617320616e2065646765207768696368206973207375626d6974746564206265666f726520746865206c617374206e6f6e2d7a65726f5420736c617368206f6620746865207461726765742e744f6666636861696e456c656374696f6e426f67757353656c66566f746504250120412073656c6620766f7465206d757374206f6e6c79206265206f726967696e617465642066726f6d20612076616c696461746f7220746f204f4e4c59207468656d73656c7665732e644f6666636861696e456c656374696f6e426f6775734564676504450120546865207375626d697474656420726573756c742068617320756e6b6e6f776e206564676573207468617420617265206e6f7420616d6f6e67207468652070726573656e7465642077696e6e6572732e684f6666636861696e456c656374696f6e426f67757353636f72650419012054686520636c61696d65642073636f726520646f6573206e6f74206d61746368207769746820746865206f6e6520636f6d70757465642066726f6d2074686520646174612e844f6666636861696e456c656374696f6e426f677573456c656374696f6e53697a6504782054686520656c656374696f6e2073697a6520697320696e76616c69642e3843616c6c4e6f74416c6c6f776564044901205468652063616c6c206973206e6f7420616c6c6f7765642061742074686520676976656e2074696d652064756520746f207265737472696374696f6e73206f6620656c656374696f6e20706572696f642e54496e636f7272656374486973746f7279446570746804c420496e636f72726563742070726576696f757320686973746f727920646570746820696e7075742070726f76696465642e58496e636f7272656374536c617368696e675370616e7304b420496e636f7272656374206e756d626572206f6620736c617368696e67207370616e732070726f76696465642e1c53657373696f6e011c53657373696f6e1c2856616c696461746f727301004c5665633c543a3a56616c696461746f7249643e0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e64657801003053657373696f6e496e646578100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e676564010010626f6f6c040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b6579730100785665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e0400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f72730100205665633c7533323e04000c8020496e6469636573206f662064697361626c65642076616c696461746f72732e003501205468652073657420697320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e732061206e657720736574206f66206964656e7469746965732e204e6578744b65797300010538543a3a56616c696461746f7249641c543a3a4b657973000400049c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e204b65794f776e657200010550284b65795479706549642c205665633c75383e2938543a3a56616c696461746f72496400040004090120546865206f776e6572206f662061206b65792e20546865206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e0108207365745f6b65797308106b6579731c543a3a4b6579731470726f6f661c5665633c75383e38e82053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b657973602e210120416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec4205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d420546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960590120202041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642ef0202d20446252656164733a20606f726967696e206163636f756e74602c2060543a3a56616c696461746f7249644f66602c20604e6578744b65797360a4202d2044625772697465733a20606f726967696e206163636f756e74602c20604e6578744b6579736084202d204462526561647320706572206b65792069643a20604b65794f776e65726088202d20446257726974657320706572206b65792069643a20604b65794f776e657260302023203c2f7765696768743e2870757267655f6b6579730030cc2052656d6f76657320616e792073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c65722ec4205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d420546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002c2023203c7765696768743eb4202d20436f6d706c65786974793a20604f2831296020696e206e756d626572206f66206b65792074797065732e590120202041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642ef0202d20446252656164733a2060543a3a56616c696461746f7249644f66602c20604e6578744b657973602c20606f726967696e206163636f756e7460a4202d2044625772697465733a20604e6578744b657973602c20606f726967696e206163636f756e74608c202d20446257726974657320706572206b65792069643a20604b65794f776e64657260302023203c2f7765696768743e0104284e657753657373696f6e043053657373696f6e496e646578085d01204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e7420697320746865205b73657373696f6e5f696e6465785d2c206e6f742074686520626c6f636b88206e756d626572206173207468652074797065206d6967687420737567676573742e001030496e76616c696450726f6f66046420496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f72496404a0204e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b657904682052656769737465726564206475706c6963617465206b65792e184e6f4b65797304a8204e6f206b65797320617265206173736f63696174656420776974682074686973206163636f756e742e2444656d6f6372616379012444656d6f6372616379383c5075626c696350726f70436f756e7401002450726f70496e646578100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f707301009c5665633c2850726f70496e6465782c20543a3a486173682c20543a3a4163636f756e744964293e040004210120546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865207365636f6e64206974656d206973207468652070726f706f73616c277320686173682e244465706f7369744f660001052450726f70496e64657884285665633c543a3a4163636f756e7449643e2c2042616c616e63654f663c543e290004000c842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e00d82054574f582d4e4f54453a20536166652c20617320696e6372656173696e6720696e7465676572206b6579732061726520736166652e24507265696d616765730001061c543a3a48617368e8507265696d6167655374617475733c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e000400086101204d6170206f662068617368657320746f207468652070726f706f73616c20707265696d6167652c20616c6f6e6720776974682077686f207265676973746572656420697420616e64207468656972206465706f7369742ee42054686520626c6f636b206e756d6265722069732074686520626c6f636b20617420776869636820697420776173206465706f73697465642e3c5265666572656e64756d436f756e7401003c5265666572656e64756d496e646578100000000004310120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e344c6f77657374556e62616b656401003c5265666572656e64756d496e646578100000000008250120546865206c6f77657374207265666572656e64756d20696e64657820726570726573656e74696e6720616e20756e62616b6564207265666572656e64756d2e20457175616c20746fdc20605265666572656e64756d436f756e74602069662074686572652069736e2774206120756e62616b6564207265666572656e64756d2e405265666572656e64756d496e666f4f660001053c5265666572656e64756d496e646578d45265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a486173682c2042616c616e63654f663c543e3e0004000cb420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e0009012054574f582d4e4f54453a205341464520617320696e646578657320617265206e6f7420756e64657220616e2061747461636b6572e280997320636f6e74726f6c2e20566f74696e674f6601010530543a3a4163636f756e744964c8566f74696e673c42616c616e63654f663c543e2c20543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265723e00d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105d0120416c6c20766f74657320666f72206120706172746963756c617220766f7465722e2057652073746f7265207468652062616c616e636520666f7220746865206e756d626572206f6620766f74657320746861742077655d012068617665207265636f726465642e20546865207365636f6e64206974656d2069732074686520746f74616c20616d6f756e74206f662064656c65676174696f6e732c20746861742077696c6c2062652061646465642e00e82054574f582d4e4f54453a205341464520617320604163636f756e7449646073206172652063727970746f2068617368657320616e797761792e144c6f636b7300010530543a3a4163636f756e74496438543a3a426c6f636b4e756d626572000400105d01204163636f756e747320666f7220776869636820746865726520617265206c6f636b7320696e20616374696f6e207768696368206d61792062652072656d6f76656420617420736f6d6520706f696e7420696e207468655101206675747572652e205468652076616c75652069732074686520626c6f636b206e756d62657220617420776869636820746865206c6f636b206578706972657320616e64206d61792062652072656d6f7665642e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e544c6173745461626c656457617345787465726e616c010010626f6f6c0400085901205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c6963282070726f706f73616c2e304e65787445787465726e616c00006028543a3a486173682c20566f74655468726573686f6c6429040010590120546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e550120546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743aa4202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f7268202d20605075626c696350726f70736020697320656d7074792e24426c61636b6c6973740001061c543a3a486173688c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e290004000851012041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d626572e82028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e3443616e63656c6c6174696f6e730101061c543a3a4861736810626f6f6c000400042901205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e3853746f7261676556657273696f6e00002052656c656173657304000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e0098204e6577206e6574776f726b732073746172742077697468206c6173742076657273696f6e2e015c1c70726f706f7365083470726f706f73616c5f686173681c543a3a486173681476616c756554436f6d706163743c42616c616e63654f663c543e3e3ca02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e00190120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573748420686176652066756e647320746f20636f76657220746865206465706f7369742e00d8202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20707265696d6167652e1901202d206076616c7565603a2054686520616d6f756e74206f66206465706f73697420286d757374206265206174206c6561737420604d696e696d756d4465706f73697460292e004820456d697473206050726f706f736564602e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960b4202d2044622072656164733a20605075626c696350726f70436f756e74602c20605075626c696350726f707360ec202d204462207772697465733a20605075626c696350726f70436f756e74602c20605075626c696350726f7073602c20604465706f7369744f6660302023203c2f7765696768743e187365636f6e64082070726f706f73616c48436f6d706163743c50726f70496e6465783e4c7365636f6e64735f75707065725f626f756e6430436f6d706163743c7533323e38b8205369676e616c732061677265656d656e742077697468206120706172746963756c61722070726f706f73616c2e00050120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e6465721501206d75737420686176652066756e647320746f20636f76657220746865206465706f7369742c20657175616c20746f20746865206f726967696e616c206465706f7369742e00cc202d206070726f706f73616c603a2054686520696e646578206f66207468652070726f706f73616c20746f207365636f6e642e4501202d20607365636f6e64735f75707065725f626f756e64603a20616e20757070657220626f756e64206f6e207468652063757272656e74206e756d626572206f66207365636f6e6473206f6e2074686973290120202070726f706f73616c2e2045787472696e736963206973207765696768746564206163636f7264696e6720746f20746869732076616c75652077697468206e6f20726566756e642e002c2023203c7765696768743e3901202d20436f6d706c65786974793a20604f28532960207768657265205320697320746865206e756d626572206f66207365636f6e647320612070726f706f73616c20616c7265616479206861732e60202d2044622072656164733a20604465706f7369744f666064202d204462207772697465733a20604465706f7369744f6660302023203c2f7765696768743e10766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f7465644163636f756e74566f74653c42616c616e63654f663c543e3e38350120566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bbc206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00e0202d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f20766f746520666f722e88202d2060766f7465603a2054686520766f746520636f6e66696775726174696f6e2e002c2023203c7765696768743e4901202d20436f6d706c65786974793a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722068617320766f746564206f6e2ea42020207765696768742069732063686172676564206173206966206d6178696d756d20766f7465732ef4202d2044622072656164733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f66602c206062616c616e636573206c6f636b7360f8202d204462207772697465733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f66602c206062616c616e636573206c6f636b7360302023203c2f7765696768743e40656d657267656e63795f63616e63656c04247265665f696e6465783c5265666572656e64756d496e646578305101205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d6530207265666572656e64756d2e00fc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206043616e63656c6c6174696f6e4f726967696e602e00d4202d607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e002c2023203c7765696768743e58202d20436f6d706c65786974793a20604f283129602ec0202d2044622072656164733a20605265666572656e64756d496e666f4f66602c206043616e63656c6c6174696f6e7360c4202d204462207772697465733a20605265666572656e64756d496e666f4f66602c206043616e63656c6c6174696f6e7360302023203c2f7765696768743e4065787465726e616c5f70726f706f7365043470726f706f73616c5f686173681c543a3a48617368343101205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c30207265666572656e64756d2e00ec20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206045787465726e616c4f726967696e602e00d8202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e002c2023203c7765696768743e2d01202d20436f6d706c657869747920604f2856296020776974682056206e756d626572206f66207665746f65727320696e2074686520626c61636b6c697374206f662070726f706f73616c2ebc2020204465636f64696e6720766563206f66206c656e67746820562e2043686172676564206173206d6178696d756da0202d2044622072656164733a20604e65787445787465726e616c602c2060426c61636b6c6973746070202d204462207772697465733a20604e65787445787465726e616c60302023203c2f7765696768743e6465787465726e616c5f70726f706f73655f6d616a6f72697479043470726f706f73616c5f686173681c543a3a48617368385901205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c656020616e2065787465726e616c207265666572656e64756d2e00f020546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c4d616a6f726974794f726967696e602e00d8202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f283129606c202d2044622077726974653a20604e65787445787465726e616c60302023203c2f7765696768743e6065787465726e616c5f70726f706f73655f64656661756c74043470726f706f73616c5f686173681c543a3a48617368384901205363686564756c652061206e656761746976652d7475726e6f75742d62696173207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f84207363686564756c6520616e2065787465726e616c207265666572656e64756d2e00ec20546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c44656661756c744f726967696e602e00d8202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f283129606c202d2044622077726974653a20604e65787445787465726e616c60302023203c2f7765696768743e28666173745f747261636b0c3470726f706f73616c5f686173681c543a3a4861736834766f74696e675f706572696f6438543a3a426c6f636b4e756d6265721464656c617938543a3a426c6f636b4e756d626572505101205363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564650120696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e65ec20627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e00d420546865206469737061746368206f6620746869732063616c6c206d757374206265206046617374547261636b4f726967696e602e00f8202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e6101202d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e20496e6372656173656420746f982020206046617374547261636b566f74696e67506572696f646020696620746f6f206c6f772e5501202d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265bc202020656e61637465642e205468697320646f65736e277420686176652061206d696e696d756d20616d6f756e742e004420456d697473206053746172746564602e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960b8202d2044622072656164733a20604e65787445787465726e616c602c20605265666572656e64756d436f756e74600d01202d204462207772697465733a20604e65787445787465726e616c602c20605265666572656e64756d436f756e74602c20605265666572656e64756d496e666f4f666060202d2042617365205765696768743a2033302e3120c2b573302023203c2f7765696768743e347665746f5f65787465726e616c043470726f706f73616c5f686173681c543a3a4861736838bc205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e00dc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d75737420626520605665746f4f726967696e602e003101202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c20746f207665746f20616e6420626c61636b6c6973742e004020456d69747320605665746f6564602e002c2023203c7765696768743e1901202d20436f6d706c65786974793a20604f2856202b206c6f6728562929602077686572652056206973206e756d626572206f6620606578697374696e67207665746f657273604501202020506572666f726d7320612062696e61727920736561726368206f6e20606578697374696e675f7665746f657273602077686963682073686f756c64206e6f742062652076657279206c617267652ea0202d2044622072656164733a20604e65787445787465726e616c602c2060426c61636b6c69737460a4202d204462207772697465733a20604e65787445787465726e616c602c2060426c61636b6c69737460302023203c2f7765696768743e4463616e63656c5f7265666572656e64756d04247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e28542052656d6f76652061207265666572656e64756d2e00c420546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e00d8202d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e002c2023203c7765696768743e58202d20436f6d706c65786974793a20604f283129602e80202d204462207772697465733a20605265666572656e64756d496e666f4f6660302023203c2f7765696768743e3463616e63656c5f717565756564041477686963683c5265666572656e64756d496e6465782ca02043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e00c420546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e00c8202d20607768696368603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e002c2023203c7765696768743e3501202d20604f284429602077686572652060446020697320746865206974656d7320696e207468652064697370617463682071756575652e205765696768746564206173206044203d203130602ec8202d2044622072656164733a20607363686564756c6572206c6f6f6b7570602c207363686564756c6572206167656e646160cc202d204462207772697465733a20607363686564756c6572206c6f6f6b7570602c207363686564756c6572206167656e646160302023203c2f7765696768743e2064656c65676174650c08746f30543a3a4163636f756e74496428636f6e76696374696f6e28436f6e76696374696f6e1c62616c616e63653042616c616e63654f663c543e683d012044656c65676174652074686520766f74696e6720706f77657220287769746820736f6d6520676976656e20636f6e76696374696f6e29206f66207468652073656e64696e67206163636f756e742e005901205468652062616c616e63652064656c656761746564206973206c6f636b656420666f72206173206c6f6e6720617320697427732064656c6567617465642c20616e64207468657265616674657220666f7220746865cc2074696d6520617070726f70726961746520666f722074686520636f6e76696374696f6e2773206c6f636b20706572696f642e00610120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e696e67206163636f756e74206d757374206569746865723a782020202d2062652064656c65676174696e6720616c72656164793b206f725d012020202d2068617665206e6f20766f74696e67206163746976697479202869662074686572652069732c207468656e2069742077696c6c206e65656420746f2062652072656d6f7665642f636f6e736f6c6964617465649820202020207468726f7567682060726561705f766f746560206f722060756e766f746560292e004901202d2060746f603a20546865206163636f756e742077686f736520766f74696e6720746865206074617267657460206163636f756e74277320766f74696e6720706f7765722077696c6c20666f6c6c6f772e5901202d2060636f6e76696374696f6e603a2054686520636f6e76696374696f6e20746861742077696c6c20626520617474616368656420746f207468652064656c65676174656420766f7465732e205768656e2074686545012020206163636f756e7420697320756e64656c6567617465642c207468652066756e64732077696c6c206265206c6f636b656420666f722074686520636f72726573706f6e64696e6720706572696f642e5501202d206062616c616e6365603a2054686520616d6f756e74206f6620746865206163636f756e7427732062616c616e636520746f206265207573656420696e2064656c65676174696e672e2054686973206d757374c82020206e6f74206265206d6f7265207468616e20746865206163636f756e7427732063757272656e742062616c616e63652e004c20456d697473206044656c656761746564602e002c2023203c7765696768743e5901202d20436f6d706c65786974793a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173cc202020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732ec4202d2044622072656164733a20332a60566f74696e674f66602c20606f726967696e206163636f756e74206c6f636b7360c8202d204462207772697465733a20332a60566f74696e674f66602c20606f726967696e206163636f756e74206c6f636b7360a4202d2044622072656164732070657220766f7465733a20605265666572656e64756d496e666f4f6660a8202d204462207772697465732070657220766f7465733a20605265666572656e64756d496e666f4f6660302023203c2f7765696768743e28756e64656c65676174650048d020556e64656c65676174652074686520766f74696e6720706f776572206f66207468652073656e64696e67206163636f756e742e00610120546f6b656e73206d617920626520756e6c6f636b656420666f6c6c6f77696e67206f6e636520616e20616d6f756e74206f662074696d6520636f6e73697374656e74207769746820746865206c6f636b20706572696f64e0206f662074686520636f6e76696374696f6e2077697468207768696368207468652064656c65676174696f6e20776173206973737565642e00490120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265582063757272656e746c792064656c65676174696e672e005420456d6974732060556e64656c656761746564602e002c2023203c7765696768743e5901202d20436f6d706c65786974793a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173cc202020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732e64202d2044622072656164733a20322a60566f74696e674f666068202d204462207772697465733a20322a60566f74696e674f6660a4202d2044622072656164732070657220766f7465733a20605265666572656e64756d496e666f4f6660a8202d204462207772697465732070657220766f7465733a20605265666572656e64756d496e666f4f6660302023203c2f7765696768743e58636c6561725f7075626c69635f70726f706f73616c7300207420436c6561727320616c6c207075626c69632070726f706f73616c732e00c420546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e002c2023203c7765696768743e28202d20604f283129602e6c202d204462207772697465733a20605075626c696350726f707360302023203c2f7765696768743e346e6f74655f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e3861012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e205468697320646f65736e27742072657175697265207468652070726f706f73616c20746f206265250120696e207468652064697370617463682071756575652062757420646f657320726571756972652061206465706f7369742c2072657475726e6564206f6e636520656e61637465642e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00c8202d2060656e636f6465645f70726f706f73616c603a2054686520707265696d616765206f6620612070726f706f73616c2e005c20456d6974732060507265696d6167654e6f746564602e002c2023203c7765696768743e6901202d20436f6d706c65786974793a20604f28452960207769746820452073697a65206f662060656e636f6465645f70726f706f73616c60202870726f7465637465642062792061207265717569726564206465706f736974292e60202d2044622072656164733a2060507265696d616765736064202d204462207772697465733a2060507265696d6167657360302023203c2f7765696768743e646e6f74655f707265696d6167655f6f7065726174696f6e616c0440656e636f6465645f70726f706f73616c1c5665633c75383e040d012053616d6520617320606e6f74655f707265696d6167656020627574206f726967696e20697320604f7065726174696f6e616c507265696d6167654f726967696e602e586e6f74655f696d6d696e656e745f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e4045012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e2054686973207265717569726573207468652070726f706f73616c20746f206265410120696e207468652064697370617463682071756575652e204e6f206465706f736974206973206e65656465642e205768656e20746869732063616c6c206973207375636365737366756c2c20692e652e39012074686520707265696d61676520686173206e6f74206265656e2075706c6f61646564206265666f726520616e64206d61746368657320736f6d6520696d6d696e656e742070726f706f73616c2c40206e6f2066656520697320706169642e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00c8202d2060656e636f6465645f70726f706f73616c603a2054686520707265696d616765206f6620612070726f706f73616c2e005c20456d6974732060507265696d6167654e6f746564602e002c2023203c7765696768743e6901202d20436f6d706c65786974793a20604f28452960207769746820452073697a65206f662060656e636f6465645f70726f706f73616c60202870726f7465637465642062792061207265717569726564206465706f736974292e60202d2044622072656164733a2060507265696d616765736064202d204462207772697465733a2060507265696d6167657360302023203c2f7765696768743e886e6f74655f696d6d696e656e745f707265696d6167655f6f7065726174696f6e616c0440656e636f6465645f70726f706f73616c1c5665633c75383e0431012053616d6520617320606e6f74655f696d6d696e656e745f707265696d6167656020627574206f726967696e20697320604f7065726174696f6e616c507265696d6167654f726967696e602e34726561705f707265696d616765083470726f706f73616c5f686173681c543a3a486173686070726f706f73616c5f6c656e5f75707065725f626f756e6430436f6d706163743c7533323e4cf42052656d6f766520616e20657870697265642070726f706f73616c20707265696d61676520616e6420636f6c6c65637420746865206465706f7369742e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00d0202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f6620612070726f706f73616c2e2d01202d206070726f706f73616c5f6c656e6774685f75707065725f626f756e64603a20616e20757070657220626f756e64206f6e206c656e677468206f66207468652070726f706f73616c2e010120202045787472696e736963206973207765696768746564206163636f7264696e6720746f20746869732076616c75652077697468206e6f20726566756e642e00510120546869732077696c6c206f6e6c7920776f726b2061667465722060566f74696e67506572696f646020626c6f636b732066726f6d207468652074696d6520746861742074686520707265696d616765207761735d01206e6f7465642c2069662069742773207468652073616d65206163636f756e7420646f696e672069742e2049662069742773206120646966666572656e74206163636f756e742c207468656e206974276c6c206f6e6c79b020776f726b20616e206164646974696f6e616c2060456e6163746d656e74506572696f6460206c617465722e006020456d6974732060507265696d616765526561706564602e002c2023203c7765696768743ed0202d20436f6d706c65786974793a20604f284429602077686572652044206973206c656e677468206f662070726f706f73616c2ebc202d2044622072656164733a2060507265696d61676573602c2070726f7669646572206163636f756e742064617461bc202d204462207772697465733a2060507265696d61676573602070726f7669646572206163636f756e742064617461302023203c2f7765696768743e18756e6c6f636b041874617267657430543a3a4163636f756e7449642ca420556e6c6f636b20746f6b656e732074686174206861766520616e2065787069726564206c6f636b2e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00bc202d2060746172676574603a20546865206163636f756e7420746f2072656d6f766520746865206c6f636b206f6e2e002c2023203c7765696768743ed4202d20436f6d706c657869747920604f2852296020776974682052206e756d626572206f6620766f7465206f66207461726765742eec202d2044622072656164733a2060566f74696e674f66602c206062616c616e636573206c6f636b73602c2060746172676574206163636f756e7460f0202d204462207772697465733a2060566f74696e674f66602c206062616c616e636573206c6f636b73602c2060746172676574206163636f756e7460302023203c2f7765696768743e2c72656d6f76655f766f74650414696e6465783c5265666572656e64756d496e6465787c802052656d6f7665206120766f746520666f722061207265666572656e64756d2e00102049663a8c202d20746865207265666572656e64756d207761732063616e63656c6c65642c206f7280202d20746865207265666572656e64756d206973206f6e676f696e672c206f7294202d20746865207265666572656e64756d2068617320656e6465642073756368207468617401012020202d2074686520766f7465206f6620746865206163636f756e742077617320696e206f70706f736974696f6e20746f2074686520726573756c743b206f72d82020202d20746865726520776173206e6f20636f6e76696374696f6e20746f20746865206163636f756e74277320766f74653b206f72882020202d20746865206163636f756e74206d61646520612073706c697420766f74656101202e2e2e7468656e2074686520766f74652069732072656d6f76656420636c65616e6c7920616e64206120666f6c6c6f77696e672063616c6c20746f2060756e6c6f636b60206d617920726573756c7420696e206d6f72655c2066756e6473206265696e6720617661696c61626c652e00ac2049662c20686f77657665722c20746865207265666572656e64756d2068617320656e64656420616e643af0202d2069742066696e697368656420636f72726573706f6e64696e6720746f2074686520766f7465206f6620746865206163636f756e742c20616e64e0202d20746865206163636f756e74206d6164652061207374616e6461726420766f7465207769746820636f6e76696374696f6e2c20616e64c0202d20746865206c6f636b20706572696f64206f662074686520636f6e76696374696f6e206973206e6f74206f7665725d01202e2e2e7468656e20746865206c6f636b2077696c6c206265206167677265676174656420696e746f20746865206f766572616c6c206163636f756e742773206c6f636b2c207768696368206d617920696e766f6c76655d01202a6f7665726c6f636b696e672a20287768657265207468652074776f206c6f636b732061726520636f6d62696e656420696e746f20612073696e676c65206c6f636b207468617420697320746865206d6178696d756de8206f6620626f74682074686520616d6f756e74206c6f636b656420616e64207468652074696d65206973206974206c6f636b656420666f72292e004d0120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e6572206d7573742068617665206120766f74658c207265676973746572656420666f72207265666572656e64756d2060696e646578602e00f8202d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e002c2023203c7765696768743e4101202d20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2edc2020205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652eac202d2044622072656164733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f6660b0202d204462207772697465733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f6660302023203c2f7765696768743e4472656d6f76655f6f746865725f766f7465081874617267657430543a3a4163636f756e74496414696e6465783c5265666572656e64756d496e6465784c802052656d6f7665206120766f746520666f722061207265666572656e64756d2e0051012049662074686520607461726765746020697320657175616c20746f20746865207369676e65722c207468656e20746869732066756e6374696f6e2069732065786163746c79206571756976616c656e7420746f3101206072656d6f76655f766f7465602e204966206e6f7420657175616c20746f20746865207369676e65722c207468656e2074686520766f7465206d757374206861766520657870697265642c590120656974686572206265636175736520746865207265666572656e64756d207761732063616e63656c6c65642c20626563617573652074686520766f746572206c6f737420746865207265666572656e64756d206f729c20626563617573652074686520636f6e76696374696f6e20706572696f64206973206f7665722e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e005101202d2060746172676574603a20546865206163636f756e74206f662074686520766f746520746f2062652072656d6f7665643b2074686973206163636f756e74206d757374206861766520766f74656420666f72582020207265666572656e64756d2060696e646578602ef8202d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e002c2023203c7765696768743e4101202d20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2edc2020205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652eac202d2044622072656164733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f6660b0202d204462207772697465733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f6660302023203c2f7765696768743e38656e6163745f70726f706f73616c083470726f706f73616c5f686173681c543a3a4861736814696e6465783c5265666572656e64756d496e64657804510120456e61637420612070726f706f73616c2066726f6d2061207265666572656e64756d2e20466f72206e6f77207765206a757374206d616b65207468652077656967687420626520746865206d6178696d756d2e01442050726f706f736564082450726f70496e6465781c42616c616e63650429012041206d6f74696f6e20686173206265656e2070726f706f7365642062792061207075626c6963206163636f756e742e205b70726f706f73616c5f696e6465782c206465706f7369745d185461626c65640c2450726f70496e6465781c42616c616e6365385665633c4163636f756e7449643e0475012041207075626c69632070726f706f73616c20686173206265656e207461626c656420666f72207265666572656e64756d20766f74652e205b70726f706f73616c5f696e6465782c206465706f7369742c206465706f7369746f72735d3845787465726e616c5461626c656400049820416e2065787465726e616c2070726f706f73616c20686173206265656e207461626c65642e1c53746172746564083c5265666572656e64756d496e64657834566f74655468726573686f6c6404bc2041207265666572656e64756d2068617320626567756e2e205b7265665f696e6465782c207468726573686f6c645d18506173736564043c5265666572656e64756d496e64657804e020412070726f706f73616c20686173206265656e20617070726f766564206279207265666572656e64756d2e205b7265665f696e6465785d244e6f74506173736564043c5265666572656e64756d496e64657804e020412070726f706f73616c20686173206265656e2072656a6563746564206279207265666572656e64756d2e205b7265665f696e6465785d2443616e63656c6c6564043c5265666572656e64756d496e64657804b42041207265666572656e64756d20686173206265656e2063616e63656c6c65642e205b7265665f696e6465785d204578656375746564083c5265666572656e64756d496e64657810626f6f6c04c020412070726f706f73616c20686173206265656e20656e61637465642e205b7265665f696e6465782c2069735f6f6b5d2444656c65676174656408244163636f756e744964244163636f756e74496404190120416e206163636f756e74206861732064656c65676174656420746865697220766f746520746f20616e6f74686572206163636f756e742e205b77686f2c207461726765745d2c556e64656c65676174656404244163636f756e74496404f020416e205b6163636f756e745d206861732063616e63656c6c656420612070726576696f75732064656c65676174696f6e206f7065726174696f6e2e185665746f65640c244163636f756e74496410486173682c426c6f636b4e756d62657204090120416e2065787465726e616c2070726f706f73616c20686173206265656e207665746f65642e205b77686f2c2070726f706f73616c5f686173682c20756e74696c5d34507265696d6167654e6f7465640c1048617368244163636f756e7449641c42616c616e636504590120412070726f706f73616c277320707265696d61676520776173206e6f7465642c20616e6420746865206465706f7369742074616b656e2e205b70726f706f73616c5f686173682c2077686f2c206465706f7369745d30507265696d616765557365640c1048617368244163636f756e7449641c42616c616e636508150120412070726f706f73616c20707265696d616765207761732072656d6f76656420616e6420757365642028746865206465706f736974207761732072657475726e6564292e8c205b70726f706f73616c5f686173682c2070726f76696465722c206465706f7369745d3c507265696d616765496e76616c69640810486173683c5265666572656e64756d496e64657804790120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d6167652077617320696e76616c69642e205b70726f706f73616c5f686173682c207265665f696e6465785d3c507265696d6167654d697373696e670810486173683c5265666572656e64756d496e64657804790120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d61676520776173206d697373696e672e205b70726f706f73616c5f686173682c207265665f696e6465785d38507265696d616765526561706564101048617368244163636f756e7449641c42616c616e6365244163636f756e744964082d012041207265676973746572656420707265696d616765207761732072656d6f76656420616e6420746865206465706f73697420636f6c6c656374656420627920746865207265617065722eac205b70726f706f73616c5f686173682c2070726f76696465722c206465706f7369742c207265617065725d20556e6c6f636b656404244163636f756e74496404b420416e205b6163636f756e745d20686173206265656e20756e6c6f636b6564207375636365737366756c6c792e203c456e6163746d656e74506572696f6438543a3a426c6f636b4e756d62657210002f0d0014710120546865206d696e696d756d20706572696f64206f66206c6f636b696e6720616e642074686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e0031012049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e737572652074686174690120766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e2074686520636173652077686572659c207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e304c61756e6368506572696f6438543a3a426c6f636b4e756d62657210004e0c0004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e30566f74696e67506572696f6438543a3a426c6f636b4e756d62657210004e0c0004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e384d696e696d756d4465706f7369743042616c616e63654f663c543e400000c16ff2862300000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e5446617374547261636b566f74696e67506572696f6438543a3a426c6f636b4e756d626572108051010004ec204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f7220616e20656d657267656e6379207265666572656e64756d2e34436f6f6c6f6666506572696f6438543a3a426c6f636b4e756d62657210004e0c0004610120506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e4c507265696d616765427974654465706f7369743042616c616e63654f663c543e400010a5d4e800000000000000000000000429012054686520616d6f756e74206f662062616c616e63652074686174206d757374206265206465706f7369746564207065722062797465206f6620707265696d6167652073746f7265642e204d6178566f7465730c753332106400000004b020546865206d6178696d756d206e756d626572206f6620766f74657320666f7220616e206163636f756e742e842056616c75654c6f7704382056616c756520746f6f206c6f773c50726f706f73616c4d697373696e6704602050726f706f73616c20646f6573206e6f7420657869737420426164496e646578043820556e6b6e6f776e20696e6465783c416c726561647943616e63656c656404982043616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365444475706c696361746550726f706f73616c04582050726f706f73616c20616c7265616479206d6164654c50726f706f73616c426c61636b6c6973746564046c2050726f706f73616c207374696c6c20626c61636b6c6973746564444e6f7453696d706c654d616a6f7269747904ac204e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f726974792c496e76616c696448617368043420496e76616c69642068617368284e6f50726f706f73616c0454204e6f2065787465726e616c2070726f706f73616c34416c72656164795665746f6564049c204964656e74697479206d6179206e6f74207665746f20612070726f706f73616c207477696365304e6f7444656c6567617465640438204e6f742064656c656761746564444475706c6963617465507265696d616765045c20507265696d61676520616c7265616479206e6f7465642c4e6f74496d6d696e656e740434204e6f7420696d6d696e656e7420546f6f4561726c79042820546f6f206561726c7920496d6d696e656e74042420496d6d696e656e743c507265696d6167654d697373696e67044c20507265696d616765206e6f7420666f756e64445265666572656e64756d496e76616c6964048820566f746520676976656e20666f7220696e76616c6964207265666572656e64756d3c507265696d616765496e76616c6964044420496e76616c696420707265696d6167652c4e6f6e6557616974696e670454204e6f2070726f706f73616c732077616974696e67244e6f744c6f636b656404a42054686520746172676574206163636f756e7420646f6573206e6f7420686176652061206c6f636b2e284e6f744578706972656404f020546865206c6f636b206f6e20746865206163636f756e7420746f20626520756e6c6f636b656420686173206e6f742079657420657870697265642e204e6f74566f74657204c82054686520676976656e206163636f756e7420646964206e6f7420766f7465206f6e20746865207265666572656e64756d2e304e6f5065726d697373696f6e04cc20546865206163746f7220686173206e6f207065726d697373696f6e20746f20636f6e647563742074686520616374696f6e2e44416c726561647944656c65676174696e67048c20546865206163636f756e7420697320616c72656164792064656c65676174696e672e204f766572666c6f7704a420416e20756e657870656374656420696e7465676572206f766572666c6f77206f636375727265642e24556e646572666c6f7704a820416e20756e657870656374656420696e746567657220756e646572666c6f77206f636375727265642e44496e73756666696369656e7446756e647304010120546f6f206869676820612062616c616e6365207761732070726f7669646564207468617420746865206163636f756e742063616e6e6f74206166666f72642e344e6f7444656c65676174696e6704a420546865206163636f756e74206973206e6f742063757272656e746c792064656c65676174696e672e28566f746573457869737408590120546865206163636f756e742063757272656e746c792068617320766f74657320617474616368656420746f20697420616e6420746865206f7065726174696f6e2063616e6e6f74207375636365656420756e74696cec207468657365206172652072656d6f7665642c20656974686572207468726f7567682060756e766f746560206f722060726561705f766f7465602e44496e7374616e744e6f74416c6c6f77656404dc2054686520696e7374616e74207265666572656e64756d206f726967696e2069732063757272656e746c7920646973616c6c6f7765642e204e6f6e73656e736504982044656c65676174696f6e20746f206f6e6573656c66206d616b6573206e6f2073656e73652e3c57726f6e675570706572426f756e64045420496e76616c696420757070657220626f756e642e3c4d6178566f746573526561636865640484204d6178696d756d206e756d626572206f6620766f74657320726561636865642e1c436f756e63696c014c496e7374616e636531436f6c6c656374697665182450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001061c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001061c543a3a486173688c566f7465733c543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265723e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000030543a3a4163636f756e7449640400085d0120546865206d656d6265722077686f2070726f7669646573207468652064656661756c7420766f746520666f7220616e79206f74686572206d656d62657273207468617420646f206e6f7420766f7465206265666f7265e4207468652074696d656f75742e204966204e6f6e652c207468656e206e6f206d656d6265722068617320746861742070726976696c6567652e01182c7365745f6d656d626572730c2c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e147072696d65504f7074696f6e3c543a3a4163636f756e7449643e246f6c645f636f756e742c4d656d626572436f756e746084205365742074686520636f6c6c6563746976652773206d656d626572736869702e004901202d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee4202d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e3901202d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652eac202020202020202020202020202020205573656420666f722077656967687420657374696d6174696f6e2e005820526571756972657320726f6f74206f726967696e2e005501204e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d61784d656d6265727360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c206275742501202020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002c2023203c7765696768743e282023232057656967687454202d20604f284d50202b204e29602077686572653ae42020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e42020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299c2020202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e6465642918202d2044423a75012020202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e6720746865206d656d62657273f02020202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c7349012020202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c61012020202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e65302023203c2f7765696768743e1c65786563757465082070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e28f420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002c2023203c7765696768743e28202323205765696768748501202d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e67206070726f706f73616c60d8202d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c6028202d2031206576656e74302023203c2f7765696768743e1c70726f706f73650c247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e6cfc204164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e0088205265717569726573207468652073656e64657220746f206265206d656d6265722e00450120607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c2032602958206f722070757420757020666f7220766f74696e672e002c2023203c7765696768743e2820232320576569676874b0202d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c82020202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af820202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029010120202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d2032602918202d2044423ab82020202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f42020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029ac2020202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0d0120202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029bc20202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029dc202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e8202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029d0202020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029c0202020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d296029302020202d2031206576656e74302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c30f42041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e0090205265717569726573207468652073656e64657220746f2062652061206d656d6265722e002c2023203c7765696768743e28202323205765696768740d01202d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e6465642918202d2044423ab02020202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029bc2020202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d29602928202d2031206576656e74302023203c2f7765696768743e14636c6f7365103470726f706f73616c5f686173681c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e5470726f706f73616c5f7765696768745f626f756e643c436f6d706163743c5765696768743e306c656e6774685f626f756e6430436f6d706163743c7533323e6c510120436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e005901204d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e004d012049662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973c02068617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e004d012049662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e73290120756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e008d01202b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642070726f706f73616c2e6501202b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b6564207669618101202020202020202020202020202020202020206073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002c2023203c7765696768743e282023232057656967687478202d20604f2842202b204d202b205031202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429cc2020202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea82020202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e6465642918202d2044423a110120202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f2831296029810120202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f64656320604f285032296029e020202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c602028605031602944202d20757020746f2033206576656e7473302023203c2f7765696768743e4c646973617070726f76655f70726f706f73616c043470726f706f73616c5f686173681c543a3a4861736834790120446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e742073746174652e008c204d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e003020506172616d65746572733a2101202a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002c2023203c7765696768743ee020436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c732c204442205765696768743a4c202a2052656164733a2050726f706f73616c73a0202a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f66302023203c2f7765696768743e011c2050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e740c4d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292ed0205b6163636f756e742c2070726f706f73616c5f696e6465782c2070726f706f73616c5f686173682c207468726573686f6c645d14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740c09012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292ea4205b6163636f756e742c2070726f706f73616c5f686173682c20766f7465642c207965732c206e6f5d20417070726f76656404104861736808c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e40205b70726f706f73616c5f686173685d2c446973617070726f76656404104861736808d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e40205b70726f706f73616c5f686173685d204578656375746564081048617368384469737061746368526573756c740825012041206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e60205b70726f706f73616c5f686173682c20726573756c745d384d656d6265724578656375746564081048617368384469737061746368526573756c74084d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e60205b70726f706f73616c5f686173682c20726573756c745d18436c6f7365640c10486173682c4d656d626572436f756e742c4d656d626572436f756e7408590120412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e64205b70726f706f73616c5f686173682c207965732c206e6f5d0028244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c790405012054686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c730401012054686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c57656967687404d42054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e67746804d42054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e48546563686e6963616c436f6d6d6974746565014c496e7374616e636532436f6c6c656374697665182450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001061c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001061c543a3a486173688c566f7465733c543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265723e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000030543a3a4163636f756e7449640400085d0120546865206d656d6265722077686f2070726f7669646573207468652064656661756c7420766f746520666f7220616e79206f74686572206d656d62657273207468617420646f206e6f7420766f7465206265666f7265e4207468652074696d656f75742e204966204e6f6e652c207468656e206e6f206d656d6265722068617320746861742070726976696c6567652e01182c7365745f6d656d626572730c2c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e147072696d65504f7074696f6e3c543a3a4163636f756e7449643e246f6c645f636f756e742c4d656d626572436f756e746084205365742074686520636f6c6c6563746976652773206d656d626572736869702e004901202d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee4202d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e3901202d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652eac202020202020202020202020202020205573656420666f722077656967687420657374696d6174696f6e2e005820526571756972657320726f6f74206f726967696e2e005501204e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d61784d656d6265727360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c206275742501202020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002c2023203c7765696768743e282023232057656967687454202d20604f284d50202b204e29602077686572653ae42020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e42020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299c2020202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e6465642918202d2044423a75012020202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e6720746865206d656d62657273f02020202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c7349012020202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c61012020202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e65302023203c2f7765696768743e1c65786563757465082070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e28f420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002c2023203c7765696768743e28202323205765696768748501202d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e67206070726f706f73616c60d8202d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c6028202d2031206576656e74302023203c2f7765696768743e1c70726f706f73650c247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e6cfc204164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e0088205265717569726573207468652073656e64657220746f206265206d656d6265722e00450120607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c2032602958206f722070757420757020666f7220766f74696e672e002c2023203c7765696768743e2820232320576569676874b0202d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c82020202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af820202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029010120202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d2032602918202d2044423ab82020202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f42020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029ac2020202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0d0120202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029bc20202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029dc202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e8202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029d0202020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029c0202020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d296029302020202d2031206576656e74302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c30f42041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e0090205265717569726573207468652073656e64657220746f2062652061206d656d6265722e002c2023203c7765696768743e28202323205765696768740d01202d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e6465642918202d2044423ab02020202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029bc2020202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d29602928202d2031206576656e74302023203c2f7765696768743e14636c6f7365103470726f706f73616c5f686173681c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e5470726f706f73616c5f7765696768745f626f756e643c436f6d706163743c5765696768743e306c656e6774685f626f756e6430436f6d706163743c7533323e6c510120436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e005901204d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e004d012049662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973c02068617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e004d012049662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e73290120756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e008d01202b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642070726f706f73616c2e6501202b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b6564207669618101202020202020202020202020202020202020206073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002c2023203c7765696768743e282023232057656967687478202d20604f2842202b204d202b205031202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429cc2020202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea82020202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e6465642918202d2044423a110120202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f2831296029810120202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f64656320604f285032296029e020202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c602028605031602944202d20757020746f2033206576656e7473302023203c2f7765696768743e4c646973617070726f76655f70726f706f73616c043470726f706f73616c5f686173681c543a3a4861736834790120446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e742073746174652e008c204d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e003020506172616d65746572733a2101202a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002c2023203c7765696768743ee020436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c732c204442205765696768743a4c202a2052656164733a2050726f706f73616c73a0202a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f66302023203c2f7765696768743e011c2050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e740c4d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292ed0205b6163636f756e742c2070726f706f73616c5f696e6465782c2070726f706f73616c5f686173682c207468726573686f6c645d14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740c09012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292ea4205b6163636f756e742c2070726f706f73616c5f686173682c20766f7465642c207965732c206e6f5d20417070726f76656404104861736808c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e40205b70726f706f73616c5f686173685d2c446973617070726f76656404104861736808d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e40205b70726f706f73616c5f686173685d204578656375746564081048617368384469737061746368526573756c740825012041206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e60205b70726f706f73616c5f686173682c20726573756c745d384d656d6265724578656375746564081048617368384469737061746368526573756c74084d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e60205b70726f706f73616c5f686173682c20726573756c745d18436c6f7365640c10486173682c4d656d626572436f756e742c4d656d626572436f756e7408590120412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e64205b70726f706f73616c5f686173682c207965732c206e6f5d0028244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c790405012054686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c730401012054686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c57656967687404d42054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e67746804d42054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e24456c656374696f6e73014050687261676d656e456c656374696f6e141c4d656d626572730100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e040004f0205468652063757272656e7420656c6563746564206d656d626572736869702e20536f72746564206261736564206f6e206163636f756e742069642e2452756e6e65727355700100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e0400044901205468652063757272656e742072756e6e6572735f75702e20536f72746564206261736564206f6e206c6f7720746f2068696768206d657269742028776f72736520746f20626573742072756e6e6572292e38456c656374696f6e526f756e647301000c75333210000000000441012054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e65642c206578636c7564696e6720746865207570636f6d696e67206f6e652e18566f74696e6701010530543a3a4163636f756e744964842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29004400000000000000000000000000000000000cb820566f74657320616e64206c6f636b6564207374616b65206f66206120706172746963756c617220766f7465722e00c02054574f582d4e4f54453a205341464520617320604163636f756e7449646020697320612063727970746f20686173682843616e646964617465730100445665633c543a3a4163636f756e7449643e0400085901205468652070726573656e742063616e646964617465206c6973742e20536f72746564206261736564206f6e206163636f756e742d69642e20412063757272656e74206d656d626572206f722072756e6e65722d757041012063616e206e6576657220656e746572207468697320766563746f7220616e6420697320616c7761797320696d706c696369746c7920617373756d656420746f20626520612063616e6469646174652e011810766f74650814766f746573445665633c543a3a4163636f756e7449643e1476616c756554436f6d706163743c42616c616e63654f663c543e3e645d0120566f746520666f72206120736574206f662063616e6469646174657320666f7220746865207570636f6d696e6720726f756e64206f6620656c656374696f6e2e20546869732063616e2062652063616c6c656420746fe4207365742074686520696e697469616c20766f7465732c206f722075706461746520616c7265616479206578697374696e6720766f7465732e0055012055706f6e20696e697469616c20766f74696e672c206076616c75656020756e697473206f66206077686f6027732062616c616e6365206973206c6f636b656420616e64206120626f6e6420616d6f756e74206973282072657365727665642e0050205468652060766f746573602073686f756c643a482020202d206e6f7420626520656d7074792e59012020202d206265206c657373207468616e20746865206e756d626572206f6620706f737369626c652063616e646964617465732e204e6f7465207468617420616c6c2063757272656e74206d656d6265727320616e641501202020202072756e6e6572732d75702061726520616c736f206175746f6d61746963616c6c792063616e6469646174657320666f7220746865206e65787420726f756e642e005d012049742069732074686520726573706f6e736962696c697479206f66207468652063616c6c657220746f206e6f7420706c61636520616c6c206f662074686569722062616c616e636520696e746f20746865206c6f636ba020616e64206b65657020736f6d6520666f722066757274686572207472616e73616374696f6e732e002c2023203c7765696768743e5c2042617365207765696768743a2034372e393320c2b573342053746174652072656164733ad820092d2043616e646964617465732e6c656e2829202b204d656d626572732e6c656e2829202b2052756e6e65727355702e6c656e28295420092d20566f74696e67202869735f766f74657229d420092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665202b20746f74616c5f62616c616e6365295d38205374617465207772697465733a2820092d20566f74696e672020092d204c6f636b1d0120092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665202d2d206f6e6c79207768656e206372656174696e672061206e657720766f746572295d302023203c2f7765696768743e3072656d6f76655f766f746572003421012052656d6f766520606f726967696e60206173206120766f7465722e20546869732072656d6f76657320746865206c6f636b20616e642072657475726e732074686520626f6e642e002c2023203c7765696768743e582042617365207765696768743a2033362e3820c2b573a820416c6c207374617465206163636573732069732066726f6d20646f5f72656d6f76655f766f7465722e342053746174652072656164733a2820092d20566f74696e675820092d205b4163636f756e74446174612877686f295d38205374617465207772697465733a2820092d20566f74696e672420092d204c6f636b735820092d205b4163636f756e74446174612877686f295d302023203c2f7765696768743e507265706f72745f646566756e63745f766f746572041c646566756e6374c4446566756e6374566f7465723c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e6c5d01205265706f727420607461726765746020666f72206265696e6720616e20646566756e637420766f7465722e20496e2063617365206f6620612076616c6964207265706f72742c20746865207265706f727465722069735d012072657761726465642062792074686520626f6e6420616d6f756e74206f662060746172676574602e204f74686572776973652c20746865207265706f7274657220697473656c662069732072656d6f76656420616e645c20746865697220626f6e6420697320736c61736865642e0088204120646566756e637420766f74657220697320646566696e656420746f2062653a4d012020202d206120766f7465722077686f73652063757272656e74207375626d697474656420766f7465732061726520616c6c20696e76616c69642e20692e652e20616c6c206f66207468656d20617265206e6ff020202020206c6f6e67657220612063616e646964617465206e6f7220616e20616374697665206d656d626572206f7220612072756e6e65722d75702e0000690120546865206f726967696e206d7573742070726f7669646520746865206e756d626572206f662063757272656e742063616e6469646174657320616e6420766f746573206f6620746865207265706f7274656420746172676574c020666f722074686520707572706f7365206f66206163637572617465207765696768742063616c63756c6174696f6e2e002c2023203c7765696768743eb4204e6f204261736520776569676874206261736564206f6e206d696e2073717561726520616e616c797369732ea420436f6d706c6578697479206f662063616e6469646174655f636f756e743a20312e37353520c2b5739020436f6d706c6578697479206f6620766f74655f636f756e743a2031382e353120c2b573342053746174652072656164733a542020092d20566f74696e67287265706f7274657229502020092d2043616e6469646174652e6c656e28294c2020092d20566f74696e672854617267657429d82020092d2043616e646964617465732c204d656d626572732c2052756e6e6572735570202869735f646566756e63745f766f7465722938205374617465207772697465733a7020092d204c6f636b287265706f72746572207c7c2074617267657429dc20092d205b4163636f756e7442616c616e6365287265706f72746572295d202b204163636f756e7442616c616e636528746172676574297820092d20566f74696e67287265706f72746572207c7c20746172676574295901204e6f74653a207468652064622061636365737320697320776f7273652077697468207265737065637420746f2064622c207768696368206973207768656e20746865207265706f727420697320636f72726563742e302023203c2f7765696768743e407375626d69745f63616e646964616379043c63616e6469646174655f636f756e7430436f6d706163743c7533323e5478205375626d6974206f6e6573656c6620666f722063616e6469646163792e006420412063616e6469646174652077696c6c206569746865723aec2020202d204c6f73652061742074686520656e64206f6620746865207465726d20616e6420666f7266656974207468656972206465706f7369742e2d012020202d2057696e20616e64206265636f6d652061206d656d6265722e204d656d626572732077696c6c206576656e7475616c6c7920676574207468656972207374617368206261636b2e55012020202d204265636f6d6520612072756e6e65722d75702e2052756e6e6572732d75707320617265207265736572766564206d656d6265727320696e2063617365206f6e65206765747320666f72636566756c6c7934202020202072656d6f7665642e002c2023203c7765696768743e60204261736520776569676874203d2033332e333320c2b573a420436f6d706c6578697479206f662063616e6469646174655f636f756e743a20302e33373520c2b573342053746174652072656164733a5020092d2043616e646964617465732e6c656e28293820092d2043616e646964617465732c20092d204d656d626572733420092d2052756e6e65727355706420092d205b4163636f756e7442616c616e63652877686f295d38205374617465207772697465733a6420092d205b4163636f756e7442616c616e63652877686f295d3820092d2043616e64696461746573302023203c2f7765696768743e4872656e6f756e63655f63616e646964616379042872656e6f756e63696e672852656e6f756e63696e679851012052656e6f756e6365206f6e65277320696e74656e74696f6e20746f20626520612063616e64696461746520666f7220746865206e65787420656c656374696f6e20726f756e642e203320706f74656e7469616c40206f7574636f6d65732065786973743a4101202d20606f726967696e6020697320612063616e64696461746520616e64206e6f7420656c656374656420696e20616e79207365742e20496e207468697320636173652c2074686520626f6e64206973f4202020756e72657365727665642c2072657475726e656420616e64206f726967696e2069732072656d6f76656420617320612063616e6469646174652e5901202d20606f726967696e6020697320612063757272656e742072756e6e65722d75702e20496e207468697320636173652c2074686520626f6e6420697320756e72657365727665642c2072657475726e656420616e64902020206f726967696e2069732072656d6f76656420617320612072756e6e65722d75702e4d01202d20606f726967696e6020697320612063757272656e74206d656d6265722e20496e207468697320636173652c2074686520626f6e6420697320756e726573657276656420616e64206f726967696e206973590120202072656d6f7665642061732061206d656d6265722c20636f6e73657175656e746c79206e6f74206265696e6720612063616e64696461746520666f7220746865206e65787420726f756e6420616e796d6f72652e650120202053696d696c617220746f205b6072656d6f76655f766f746572605d2c206966207265706c6163656d656e742072756e6e657273206578697374732c20746865792061726520696d6d6564696174656c7920757365642e24203c7765696768743e7820496620612063616e6469646174652069732072656e6f756e63696e673a60200942617365207765696768743a2031372e323820c2b573a82009436f6d706c6578697479206f662063616e6469646174655f636f756e743a20302e32333520c2b57338200953746174652072656164733a3c2009092d2043616e64696461746573982009092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665295d3c20095374617465207772697465733a3c2009092d2043616e64696461746573982009092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665295d64204966206d656d6265722069732072656e6f756e63696e673a60200942617365207765696768743a2034362e323520c2b57338200953746174652072656164733ad02009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d3c20095374617465207772697465733ad02009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d642049662072756e6e65722069732072656e6f756e63696e673a60200942617365207765696768743a2034362e323520c2b57338200953746174652072656164733aac2009092d2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d3c20095374617465207772697465733aac2009092d2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d000d0120576569676874206e6f74653a205468652063616c6c20696e746f206368616e67654d656d62657273206e65656420746f206265206163636f756e74656420666f722e28203c2f7765696768743e3472656d6f76655f6d656d626572080c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653c6861735f7265706c6163656d656e7410626f6f6c485d012052656d6f7665206120706172746963756c6172206d656d6265722066726f6d20746865207365742e20546869732069732065666665637469766520696d6d6564696174656c7920616e642074686520626f6e64206f668020746865206f7574676f696e67206d656d62657220697320736c61736865642e00590120496620612072756e6e65722d757020697320617661696c61626c652c207468656e2074686520626573742072756e6e65722d75702077696c6c2062652072656d6f76656420616e64207265706c61636573207468650101206f7574676f696e67206d656d6265722e204f74686572776973652c2061206e65772070687261676d656e20656c656374696f6e20697320737461727465642e004501204e6f74652074686174207468697320646f6573206e6f7420616666656374207468652064657369676e6174656420626c6f636b206e756d626572206f6620746865206e65787420656c656374696f6e2e002c2023203c7765696768743e6820496620776520686176652061207265706c6163656d656e743a6820092d2042617365207765696768743a2035302e393320c2b5734020092d2053746174652072656164733a502009092d2052756e6e65727355702e6c656e2829cc2009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572294420092d205374617465207772697465733acc2009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d62657229650120456c73652c2073696e63652074686973206973206120726f6f742063616c6c20616e642077696c6c20676f20696e746f2070687261676d656e2c20776520617373756d652066756c6c20626c6f636b20666f72206e6f772e302023203c2f7765696768743e01141c4e65775465726d04645665633c284163636f756e7449642c2042616c616e6365293e1061012041206e6577207465726d2077697468205b6e65775f6d656d626572735d2e205468697320696e64696361746573207468617420656e6f7567682063616e64696461746573206578697374656420746f2072756e20746865590120656c656374696f6e2c206e6f74207468617420656e6f756768206861766520686173206265656e20656c65637465642e2054686520696e6e65722076616c7565206d757374206265206578616d696e656420666f726101207468697320707572706f73652e204120604e65775465726d285b5d296020696e64696361746573207468617420736f6d652063616e6469646174657320676f7420746865697220626f6e6420736c617368656420616e645901206e6f6e65207765726520656c65637465642c207768696c73742060456d7074795465726d60206d65616e732074686174206e6f2063616e64696461746573206578697374656420746f20626567696e20776974682e24456d7074795465726d00083501204e6f20286f72206e6f7420656e6f756768292063616e64696461746573206578697374656420666f72207468697320726f756e642e205468697320697320646966666572656e742066726f6dc420604e65775465726d285b5d29602e2053656520746865206465736372697074696f6e206f6620604e65775465726d602e304d656d6265724b69636b656404244163636f756e744964084d012041205b6d656d6265725d20686173206265656e2072656d6f7665642e20546869732073686f756c6420616c7761797320626520666f6c6c6f7765642062792065697468657220604e65775465726d60206f74342060456d7074795465726d602e3c4d656d62657252656e6f756e63656404244163636f756e74496404a82041205b6d656d6265725d206861732072656e6f756e6365642074686569722063616e6469646163792e34566f7465725265706f727465640c244163636f756e744964244163636f756e74496410626f6f6c080901204120766f74657220776173207265706f7274656420776974682074686520746865207265706f7274206265696e67207375636365737366756c206f72206e6f742e6c205b766f7465722c207265706f727465722c20737563636573735d183443616e646964616379426f6e643042616c616e63654f663c543e400080c6a47e8d030000000000000000000028566f74696e67426f6e643042616c616e63654f663c543e4000407a10f35a000000000000000000000038446573697265644d656d626572730c753332100d00000000404465736972656452756e6e65727355700c753332100700000000305465726d4475726174696f6e38543a3a426c6f636b4e756d626572108013030000204d6f64756c654964384c6f636b4964656e74696669657220706872656c656374004430556e61626c65546f566f746504c42043616e6e6f7420766f7465207768656e206e6f2063616e64696461746573206f72206d656d626572732065786973742e1c4e6f566f7465730498204d75737420766f746520666f72206174206c65617374206f6e652063616e6469646174652e30546f6f4d616e79566f74657304882043616e6e6f7420766f7465206d6f7265207468616e2063616e646964617465732e504d6178696d756d566f7465734578636565646564049c2043616e6e6f7420766f7465206d6f7265207468616e206d6178696d756d20616c6c6f7765642e284c6f7742616c616e636504c82043616e6e6f7420766f74652077697468207374616b65206c657373207468616e206d696e696d756d2062616c616e63652e3c556e61626c65546f506179426f6e64047c20566f7465722063616e206e6f742070617920766f74696e6720626f6e642e2c4d7573744265566f7465720444204d757374206265206120766f7465722e285265706f727453656c6604502043616e6e6f74207265706f72742073656c662e4c4475706c69636174656443616e6469646174650484204475706c6963617465642063616e646964617465207375626d697373696f6e2e304d656d6265725375626d6974048c204d656d6265722063616e6e6f742072652d7375626d69742063616e6469646163792e3052756e6e65725375626d6974048c2052756e6e65722063616e6e6f742072652d7375626d69742063616e6469646163792e68496e73756666696369656e7443616e64696461746546756e647304982043616e64696461746520646f6573206e6f74206861766520656e6f7567682066756e64732e244e6f744d656d6265720438204e6f742061206d656d6265722e54496e76616c696443616e646964617465436f756e7404e4205468652070726f766964656420636f756e74206f66206e756d626572206f662063616e6469646174657320697320696e636f72726563742e40496e76616c6964566f7465436f756e7404d0205468652070726f766964656420636f756e74206f66206e756d626572206f6620766f74657320697320696e636f72726563742e44496e76616c696452656e6f756e63696e67040101205468652072656e6f756e63696e67206f726967696e2070726573656e74656420612077726f6e67206052656e6f756e63696e676020706172616d657465722e48496e76616c69645265706c6163656d656e740401012050726564696374696f6e20726567617264696e67207265706c6163656d656e74206166746572206d656d6265722072656d6f76616c2069732077726f6e672e4c546563686e6963616c4d656d62657273686970014c496e7374616e6365314d656d62657273686970081c4d656d626572730100445665633c543a3a4163636f756e7449643e040004c8205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e145072696d65000030543a3a4163636f756e744964040004a4205468652063757272656e74207072696d65206d656d6265722c206966206f6e65206578697374732e011c286164645f6d656d626572040c77686f30543a3a4163636f756e7449640c7c204164642061206d656d626572206077686f6020746f20746865207365742e00a0204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a4164644f726967696e602e3472656d6f76655f6d656d626572040c77686f30543a3a4163636f756e7449640c902052656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e00ac204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656d6f76654f726967696e602e2c737761705f6d656d626572081872656d6f766530543a3a4163636f756e7449640c61646430543a3a4163636f756e74496414c02053776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e00a4204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a537761704f726967696e602e001101205072696d65206d656d62657273686970206973202a6e6f742a207061737365642066726f6d206072656d6f76656020746f2060616464602c20696620657874616e742e3472657365745f6d656d62657273041c6d656d62657273445665633c543a3a4163636f756e7449643e105901204368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e646c207061737320606d656d6265727360207072652d736f727465642e00a8204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52657365744f726967696e602e286368616e67655f6b6579040c6e657730543a3a4163636f756e74496414d82053776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e00f4204d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e002101205072696d65206d656d62657273686970206973207061737365642066726f6d20746865206f726967696e206163636f756e7420746f20606e6577602c20696620657874616e742e247365745f7072696d65040c77686f30543a3a4163636f756e7449640cc02053657420746865207072696d65206d656d6265722e204d75737420626520612063757272656e74206d656d6265722e00a8204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e2c636c6561725f7072696d65000c982052656d6f766520746865207072696d65206d656d626572206966206974206578697374732e00a8204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e01182c4d656d62657241646465640004e42054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e344d656d62657252656d6f7665640004ec2054686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e384d656d62657273537761707065640004dc2054776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e304d656d6265727352657365740004190120546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e284b65794368616e676564000488204f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e1444756d6d7904bc73705f7374643a3a6d61726b65723a3a5068616e746f6d446174613c284163636f756e7449642c204576656e74293e0470205068616e746f6d206d656d6265722c206e6576657220757365642e00003c46696e616c697479547261636b65720001042866696e616c5f68696e74041068696e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08f42048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a65646c20626c6f636b2069732074686520676976656e206e756d6265722e00082857696e646f7753697a6538543a3a426c6f636b4e756d626572106500000004190120546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e345265706f72744c6174656e637938543a3a426c6f636b4e756d62657210e8030000041d01205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e0838416c72656164795570646174656404c82046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b1c42616448696e7404902046696e616c697a6564206865696768742061626f766520626c6f636b206e756d6265721c4772616e647061013c4772616e64706146696e616c6974791814537461746501006c53746f72656453746174653c543a3a426c6f636b4e756d6265723e04000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e676500008c53746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000038543a3a426c6f636b4e756d626572040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c656400008028543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d626572290400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e7453657449640100145365744964200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e0001051453657449643053657373696f6e496e6465780004001059012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f722077686963682069747368206d656d62657273207765726520726573706f6e7369626c652e00b82054574f582d4e4f54453a2060536574496460206973206e6f7420756e646572207573657220636f6e74726f6c2e010c4c7265706f72745f65717569766f636174696f6e084865717569766f636174696f6e5f70726f6f66a845717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66100d01205265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f82065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66fc20616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e6365482077696c6c206265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e6564084865717569766f636174696f6e5f70726f6f66a845717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66240d01205265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f82065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66fc20616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e6365482077696c6c206265207265706f727465642e00110120546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c79190120626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c206173207375636819012069662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e28207265706f727465722e306e6f74655f7374616c6c6564081464656c617938543a3a426c6f636b4e756d6265726c626573745f66696e616c697a65645f626c6f636b5f6e756d62657238543a3a426c6f636b4e756d6265721c1d01204e6f74652074686174207468652063757272656e7420617574686f7269747920736574206f6620746865204752414e4450412066696e616c69747920676164676574206861732901207374616c6c65642e20546869732077696c6c2074726967676572206120666f7263656420617574686f7269747920736574206368616e67652061742074686520626567696e6e696e672101206f6620746865206e6578742073657373696f6e2c20746f20626520656e6163746564206064656c61796020626c6f636b7320616674657220746861742e205468652064656c617915012073686f756c64206265206869676820656e6f75676820746f20736166656c7920617373756d6520746861742074686520626c6f636b207369676e616c6c696e6720746865290120666f72636564206368616e67652077696c6c206e6f742062652072652d6f726765642028652e672e203130303020626c6f636b73292e20546865204752414e44504120766f7465727329012077696c6c20737461727420746865206e657720617574686f7269747920736574207573696e672074686520676976656e2066696e616c697a656420626c6f636b20617320626173652e5c204f6e6c792063616c6c61626c6520627920726f6f742e010c384e6577417574686f7269746965730434417574686f726974794c69737404d0204e657720617574686f726974792073657420686173206265656e206170706c6965642e205b617574686f726974795f7365745d1850617573656400049c2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640004a02043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e001c2c50617573654661696c656408090120417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665a8202865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e30526573756d654661696c656408150120417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e277420706175736564a42028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e344368616e676550656e64696e6704ec20417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e1c546f6f536f6f6e04c02043616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e60496e76616c69644b65794f776e65727368697050726f6f660435012041206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e60496e76616c696445717569766f636174696f6e50726f6f6604350120416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f7274041901204120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e20547265617375727901205472656173757279143450726f706f73616c436f756e7401003450726f706f73616c496e646578100000000004a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c730001053450726f706f73616c496e6465789050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c730100485665633c50726f706f73616c496e6465783e040004f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e10546970730001051c543a3a48617368f04f70656e5469703c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265722c20543a3a486173683e0004000c59012054697073207468617420617265206e6f742079657420636f6d706c657465642e204b65796564206279207468652068617368206f66206028726561736f6e2c2077686f29602066726f6d207468652076616c75652e3d012054686973206861732074686520696e73656375726520656e756d657261626c6520686173682066756e6374696f6e2073696e636520746865206b657920697473656c6620697320616c7265616479802067756172616e7465656420746f20626520612073656375726520686173682e1c526561736f6e730001061c543a3a486173681c5665633c75383e0004000849012053696d706c6520707265696d616765206c6f6f6b75702066726f6d2074686520726561736f6e2773206861736820746f20746865206f726967696e616c20646174612e20416761696e2c2068617320616e610120696e73656375726520656e756d657261626c6520686173682073696e636520746865206b65792069732067756172616e7465656420746f2062652074686520726573756c74206f6620612073656375726520686173682e01203470726f706f73655f7370656e64081476616c756554436f6d706163743c42616c616e63654f663c543e3e2c62656e65666963696172798c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365242d012050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c7565350120697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e636520746865542070726f706f73616c20697320617761726465642e002c2023203c7765696768743e4c202d20436f6d706c65786974793a204f283129b4202d20446252656164733a206050726f706f73616c436f756e74602c20606f726967696e206163636f756e7460ec202d2044625772697465733a206050726f706f73616c436f756e74602c206050726f706f73616c73602c20606f726967696e206163636f756e7460302023203c2f7765696768743e3c72656a6563745f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e24fc2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e00ac204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656a6563744f726967696e602e002c2023203c7765696768743e4c202d20436f6d706c65786974793a204f283129d0202d20446252656164733a206050726f706f73616c73602c206072656a65637465642070726f706f736572206163636f756e7460d4202d2044625772697465733a206050726f706f73616c73602c206072656a65637465642070726f706f736572206163636f756e7460302023203c2f7765696768743e40617070726f76655f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e285d0120417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e6566696369617279ac20616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e00b0204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a417070726f76654f726967696e602e002c2023203c7765696768743e50202d20436f6d706c65786974793a204f2831292e90202d20446252656164733a206050726f706f73616c73602c2060417070726f76616c73605c202d20446257726974653a2060417070726f76616c7360302023203c2f7765696768743e387265706f72745f617765736f6d650818726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e7449644c5d01205265706f727420736f6d657468696e672060726561736f6e60207468617420646573657276657320612074697020616e6420636c61696d20616e79206576656e7475616c207468652066696e6465722773206665652e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005501205061796d656e743a20605469705265706f72744465706f73697442617365602077696c6c2062652072657365727665642066726f6d20746865206f726967696e206163636f756e742c2061732077656c6c206173d420605469705265706f72744465706f736974506572427974656020666f722065616368206279746520696e2060726561736f6e602e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743ecc202d20436f6d706c65786974793a20604f2852296020776865726520605260206c656e677468206f662060726561736f6e602e942020202d20656e636f64696e6720616e642068617368696e67206f662027726561736f6e27c4202d20446252656164733a2060526561736f6e73602c206054697073602c206077686f206163636f756e742064617461609c202d2044625772697465733a206054697073602c206077686f206163636f756e74206461746160302023203c2f7765696768743e2c726574726163745f7469700410686173681c543a3a486173684c550120526574726163742061207072696f72207469702d7265706f72742066726f6d20607265706f72745f617765736f6d65602c20616e642063616e63656c207468652070726f63657373206f662074697070696e672e00e0204966207375636365737366756c2c20746865206f726967696e616c206465706f7369742077696c6c20626520756e72657365727665642e00510120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642074686520746970206964656e746966696564206279206068617368604501206d7573742068617665206265656e207265706f7274656420627920746865207369676e696e67206163636f756e74207468726f75676820607265706f72745f617765736f6d65602028616e64206e6f7450207468726f75676820607469705f6e657760292e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e009020456d697473206054697052657472616374656460206966207375636365737366756c2e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960dc2020202d20446570656e6473206f6e20746865206c656e677468206f662060543a3a48617368602077686963682069732066697865642e90202d20446252656164733a206054697073602c20606f726967696e206163636f756e7460c0202d2044625772697465733a2060526561736f6e73602c206054697073602c20606f726967696e206163636f756e7460302023203c2f7765696768743e1c7469705f6e65770c18726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e744964247469705f76616c75653042616c616e63654f663c543e58f4204769766520612074697020666f7220736f6d657468696e67206e65773b206e6f2066696e6465722773206665652077696c6c2062652074616b656e2e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743e5501202d20436f6d706c65786974793a20604f2852202b2054296020776865726520605260206c656e677468206f662060726561736f6e602c2060546020697320746865206e756d626572206f6620746970706572732ec02020202d20604f285429603a206465636f64696e6720605469707065726020766563206f66206c656e6774682060546009012020202020605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e0d0120202020205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602ee42020202d20604f285229603a2068617368696e6720616e6420656e636f64696e67206f6620726561736f6e206f66206c656e6774682060526080202d20446252656164733a206054697070657273602c2060526561736f6e736078202d2044625772697465733a2060526561736f6e73602c20605469707360302023203c2f7765696768743e0c7469700810686173681c543a3a48617368247469705f76616c75653042616c616e63654f663c543e64b4204465636c6172652061207469702076616c756520666f7220616e20616c72656164792d6f70656e207469702e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f66207468652068617368206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279382020206163636f756e742049442e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e00650120456d6974732060546970436c6f73696e676020696620746865207468726573686f6c64206f66207469707065727320686173206265656e207265616368656420616e642074686520636f756e74646f776e20706572696f64342068617320737461727465642e002c2023203c7765696768743ee4202d20436f6d706c65786974793a20604f285429602077686572652060546020697320746865206e756d626572206f6620746970706572732e15012020206465636f64696e6720605469707065726020766563206f66206c656e677468206054602c20696e736572742074697020616e6420636865636b20636c6f73696e672c0101202020605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e05012020205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602e00610120202041637475616c6c792077656967687420636f756c64206265206c6f77657220617320697420646570656e6473206f6e20686f77206d616e7920746970732061726520696e20604f70656e5469706020627574206974d4202020697320776569676874656420617320696620616c6d6f73742066756c6c20692e65206f66206c656e6774682060542d31602e74202d20446252656164733a206054697070657273602c206054697073604c202d2044625772697465733a20605469707360302023203c2f7765696768743e24636c6f73655f7469700410686173681c543a3a48617368446020436c6f736520616e64207061796f75742061207469702e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0019012054686520746970206964656e74696669656420627920606861736860206d75737420686176652066696e69736865642069747320636f756e74646f776e20706572696f642e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e002c2023203c7765696768743ee4202d20436f6d706c65786974793a20604f285429602077686572652060546020697320746865206e756d626572206f6620746970706572732e9c2020206465636f64696e6720605469707065726020766563206f66206c656e677468206054602e0101202020605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e05012020205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602eac202d20446252656164733a206054697073602c206054697070657273602c20607469702066696e64657260dc202d2044625772697465733a2060526561736f6e73602c206054697073602c206054697070657273602c20607469702066696e64657260302023203c2f7765696768743e012c2050726f706f736564043450726f706f73616c496e646578047c204e65772070726f706f73616c2e205b70726f706f73616c5f696e6465785d205370656e64696e67041c42616c616e6365043501205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e205b6275646765745f72656d61696e696e675d1c417761726465640c3450726f706f73616c496e6465781c42616c616e6365244163636f756e74496404150120536f6d652066756e64732068617665206265656e20616c6c6f63617465642e205b70726f706f73616c5f696e6465782c2061776172642c2062656e65666963696172795d2052656a6563746564083450726f706f73616c496e6465781c42616c616e6365041d0120412070726f706f73616c207761732072656a65637465643b2066756e6473207765726520736c61736865642e205b70726f706f73616c5f696e6465782c20736c61736865645d144275726e74041c42616c616e636504a820536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e205b6275726e5d20526f6c6c6f766572041c42616c616e6365047d01205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e205b6275646765745f72656d61696e696e675d1c4465706f736974041c42616c616e636504a820536f6d652066756e64732068617665206265656e206465706f73697465642e205b6465706f7369745d184e657754697004104861736804c42041206e6577207469702073756767657374696f6e20686173206265656e206f70656e65642e205b7469705f686173685d28546970436c6f73696e670410486173680409012041207469702073756767657374696f6e206861732072656163686564207468726573686f6c6420616e6420697320636c6f73696e672e205b7469705f686173685d24546970436c6f7365640c1048617368244163636f756e7449641c42616c616e636504e82041207469702073756767657374696f6e20686173206265656e20636c6f7365642e205b7469705f686173682c2077686f2c207061796f75745d3054697052657472616374656404104861736804c02041207469702073756767657374696f6e20686173206265656e207265747261637465642e205b7469705f686173685d243050726f706f73616c426f6e641c5065726d696c6c1050c30000085501204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e110120416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e4c50726f706f73616c426f6e644d696e696d756d3042616c616e63654f663c543e4000407a10f35a00000000000000000000044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f6438543a3a426c6f636b4e756d6265721080700000048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e1c5065726d696c6c1020a107000411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e30546970436f756e74646f776e38543a3a426c6f636b4e756d62657210807000000445012054686520706572696f6420666f722077686963682061207469702072656d61696e73206f70656e20616674657220697320686173206163686965766564207468726573686f6c6420746970706572732e3454697046696e646572734665651c50657263656e7404140431012054686520616d6f756e74206f66207468652066696e616c2074697020776869636820676f657320746f20746865206f726967696e616c207265706f72746572206f6620746865207469702e505469705265706f72744465706f736974426173653042616c616e63654f663c543e4000407a10f35a0000000000000000000004d42054686520616d6f756e742068656c64206f6e206465706f73697420666f7220706c6163696e67206120746970207265706f72742e5c5469705265706f72744465706f736974506572427974653042616c616e63654f663c543e400010a5d4e800000000000000000000000409012054686520616d6f756e742068656c64206f6e206465706f7369742070657220627974652077697468696e2074686520746970207265706f727420726561736f6e2e204d6f64756c654964204d6f64756c6549642070792f7472737279041901205468652074726561737572792773206d6f64756c652069642c207573656420666f72206465726976696e672069747320736f7665726569676e206163636f756e742049442e2070496e73756666696369656e7450726f706f7365727342616c616e6365047c2050726f706f73657227732062616c616e636520697320746f6f206c6f772e50496e76616c696450726f706f73616c496e646578046c204e6f2070726f706f73616c206174207468617420696e6465782e30526561736f6e546f6f42696704882054686520726561736f6e20676976656e206973206a75737420746f6f206269672e30416c72656164794b6e6f776e048c20546865207469702077617320616c726561647920666f756e642f737461727465642e28556e6b6e6f776e54697004642054686520746970206861736820697320756e6b6e6f776e2e244e6f7446696e64657204210120546865206163636f756e7420617474656d7074696e6720746f20726574726163742074686520746970206973206e6f74207468652066696e646572206f6620746865207469702e245374696c6c4f70656e042d0120546865207469702063616e6e6f7420626520636c61696d65642f636c6f736564206265636175736520746865726520617265206e6f7420656e6f7567682074697070657273207965742e245072656d617475726504350120546865207469702063616e6e6f7420626520636c61696d65642f636c6f73656420626563617573652069742773207374696c6c20696e2074686520636f756e74646f776e20706572696f642e24436f6e7472616374730124436f6e747261637473143c43757272656e745363686564756c650100205363686564756c6535020000000020a107000000000020a107000000000020a107000000000020a107000000000020a107000000000020a107000000000020a1070000000000e0f7050400000000e024370500000000e0f705040000000020a107000000000020a107000000000080f0fa020000000000e1f505000000000400000000000100100000000040000000200000000000080004942043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e305072697374696e65436f64650001062c436f6465486173683c543e1c5665633c75383e0004000465012041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2c436f646553746f726167650001062c436f6465486173683c543e587761736d3a3a5072656661625761736d4d6f64756c650004000465012041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f7220657865637574696f6e2e384163636f756e74436f756e74657201000c753634200000000000000000045420546865207375627472696520636f756e7465722e38436f6e7472616374496e666f4f6600010530543a3a4163636f756e7449643c436f6e7472616374496e666f3c543e0004000ca82054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e01143c7570646174655f7363686564756c6504207363686564756c65205363686564756c650cb4205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e000d0120546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e207075745f636f64650410636f64651c5665633c75383e085d012053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e27732073746f7261676520616e642072657475726e73206974732060636f646568617368602ed420596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e1063616c6c1010646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e246761735f6c696d697430436f6d706163743c4761733e10646174611c5665633c75383e1c0901204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e002901202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c206265b020657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e1901202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e4901202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c1501206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e2c696e7374616e74696174651024656e646f776d656e7454436f6d706163743c42616c616e63654f663c543e3e246761735f6c696d697430436f6d706163743c4761733e24636f64655f686173682c436f6465486173683c543e10646174611c5665633c75383e28bd0120496e7374616e7469617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e009820496e7374616e74696174696f6e20697320657865637574656420617320666f6c6c6f77733a004101202d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e0501202d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e6d01202d20546865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e204275666665722072657475726e65645d0120202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b6564a820202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e7c202d2054686520636f6e747261637420697320696e697469616c697a65642e3c636c61696d5f73757263686172676508106465737430543a3a4163636f756e744964286175785f73656e646572504f7074696f6e3c543a3a4163636f756e7449643e14710120416c6c6f777320626c6f636b2070726f64756365727320746f20636c61696d206120736d616c6c2072657761726420666f72206576696374696e67206120636f6e74726163742e204966206120626c6f636b2070726f64756365721501206661696c7320746f20646f20736f2c206120726567756c61722075736572732077696c6c20626520616c6c6f77656420746f20636c61696d20746865207265776172642e00390120496620636f6e7472616374206973206e6f742065766963746564206173206120726573756c74206f6620746869732063616c6c2c206e6f20616374696f6e73206172652074616b656e20616e64ac207468652073656e646572206973206e6f7420656c696769626c6520666f7220746865207265776172642e011830496e7374616e74696174656408244163636f756e744964244163636f756e74496404250120436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e205b6f776e65722c20636f6e74726163745d1c4576696374656408244163636f756e74496410626f6f6c1ce420436f6e747261637420686173206265656e206576696374656420616e64206973206e6f7720696e20746f6d6273746f6e652073746174652e58205b636f6e74726163742c20746f6d6273746f6e655d042024202320506172616d73000d01202d2060636f6e7472616374603a20604163636f756e744964603a20546865206163636f756e74204944206f6620746865206576696374656420636f6e74726163742e3501202d2060746f6d6273746f6e65603a2060626f6f6c603a205472756520696620746865206576696374656420636f6e7472616374206c65667420626568696e64206120746f6d6273746f6e652e20526573746f72656410244163636f756e744964244163636f756e74496410486173681c42616c616e636524c020526573746f726174696f6e20666f72206120636f6e747261637420686173206265656e207375636365737366756c2ea4205b646f6e6f722c20646573742c20636f64655f686173682c2072656e745f616c6c6f77616e63655d042024202320506172616d7300f4202d2060646f6e6f72603a20604163636f756e744964603a204163636f756e74204944206f662074686520726573746f72696e6720636f6e7472616374ec202d206064657374603a20604163636f756e744964603a204163636f756e74204944206f662074686520726573746f72656420636f6e7472616374e8202d2060636f64655f68617368603a206048617368603a20436f64652068617368206f662074686520726573746f72656420636f6e74726163741901202d206072656e745f616c6c6f77616e63653a206042616c616e6365603a2052656e7420616c6c6f77616e6365206f662074686520726573746f72656420636f6e747261637428436f646553746f72656404104861736808b820436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e30205b636f64655f686173685d3c5363686564756c6555706461746564040c75333204c820547269676765726564207768656e207468652063757272656e74205b7363686564756c655d20697320757064617465642e44436f6e7472616374457865637574696f6e08244163636f756e7449641c5665633c75383e08090120416e206576656e74206465706f73697465642075706f6e20657865637574696f6e206f66206120636f6e74726163742066726f6d20746865206163636f756e742e40205b6163636f756e742c20646174615d204c5369676e6564436c61696d48616e646963617038543a3a426c6f636b4e756d626572100200000010e0204e756d626572206f6620626c6f636b2064656c617920616e2065787472696e73696320636c61696d20737572636861726765206861732e000d01205768656e20636c61696d207375726368617267652069732063616c6c656420627920616e2065787472696e736963207468652072656e7420697320636865636b65646820666f722063757272656e745f626c6f636b202d2064656c617940546f6d6273746f6e654465706f7369743042616c616e63654f663c543e4000a0acb903000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f2067656e6572617465206120746f6d6273746f6e652e4453746f7261676553697a654f66667365740c753332100800000018710120412073697a65206f666673657420666f7220616e20636f6e74726163742e2041206a7573742063726561746564206163636f756e74207769746820756e746f75636865642073746f726167652077696c6c20686176652074686174e0206d756368206f662073746f726167652066726f6d20746865207065727370656374697665206f66207468652073746174652072656e742e006101205468697320697320612073696d706c652077617920746f20656e73757265207468617420636f6e747261637473207769746820656d7074792073746f72616765206576656e7475616c6c79206765742064656c657465646501206279206d616b696e67207468656d207061792072656e742e2054686973206372656174657320616e20696e63656e7469766520746f2072656d6f7665207468656d206561726c7920696e206f7264657220746f2073617665182072656e742e2c52656e74427974654665653042616c616e63654f663c543e4000286bee000000000000000000000000043501205072696365206f6620612062797465206f662073746f7261676520706572206f6e6520626c6f636b20696e74657276616c2e2053686f756c642062652067726561746572207468616e20302e4452656e744465706f7369744f66667365743042616c616e63654f663c543e400010a5d4e800000000000000000000001c05012054686520616d6f756e74206f662066756e6473206120636f6e74726163742073686f756c64206465706f73697420696e206f7264657220746f206f6666736574582074686520636f7374206f66206f6e6520627974652e006901204c6574277320737570706f736520746865206465706f73697420697320312c303030204255202862616c616e636520756e697473292f6279746520616e64207468652072656e7420697320312042552f627974652f6461792c5901207468656e206120636f6e7472616374207769746820312c3030302c3030302042552074686174207573657320312c303030206279746573206f662073746f7261676520776f756c6420706179206e6f2072656e742e4d0120427574206966207468652062616c616e6365207265647563656420746f203530302c30303020425520616e64207468652073746f7261676520737461796564207468652073616d6520617420312c3030302c78207468656e20697420776f756c6420706179203530302042552f6461792e3c5375726368617267655265776172643042616c616e63654f663c543e40005cb2ec22000000000000000000000008e4205265776172642074686174206973207265636569766564206279207468652070617274792077686f736520746f75636820686173206c65646820746f2072656d6f76616c206f66206120636f6e74726163742e204d617844657074680c753332102000000008310120546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f696e7374616e746961746520737461636b2e204120726561736f6e61626c652064656661756c74382076616c7565206973203130302e304d617856616c756553697a650c753332100040000004390120546865206d6178696d756d2073697a65206f6620612073746f726167652076616c756520696e2062797465732e204120726561736f6e61626c652064656661756c74206973203136204b69422e4858496e76616c69645363686564756c6556657273696f6e0405012041206e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652063757272656e74206f6e652e54496e76616c6964537572636861726765436c61696d04550120416e206f726967696e206d757374206265207369676e6564206f7220696e686572656e7420616e6420617578696c696172792073656e646572206f6e6c792070726f7669646564206f6e20696e686572656e742e54496e76616c6964536f75726365436f6e747261637404dc2043616e6e6f7420726573746f72652066726f6d206e6f6e6578697374696e67206f7220746f6d6273746f6e6520636f6e74726163742e68496e76616c696444657374696e6174696f6e436f6e747261637404c42043616e6e6f7420726573746f726520746f206e6f6e6578697374696e67206f7220616c69766520636f6e74726163742e40496e76616c6964546f6d6273746f6e65046020546f6d6273746f6e657320646f6e2774206d617463682e54496e76616c6964436f6e74726163744f726967696e04bc20416e206f726967696e20547269654964207772697474656e20696e207468652063757272656e7420626c6f636b2e204f75744f6647617304bc2054686520657865637574656420636f6e7472616374206578686175737465642069747320676173206c696d69742e504f7574707574427566666572546f6f536d616c6c04050120546865206f75747075742062756666657220737570706c69656420746f206120636f6e7472616374204150492063616c6c2077617320746f6f20736d616c6c2e6442656c6f7753756273697374656e63655468726573686f6c6410210120506572666f726d696e672074686520726571756573746564207472616e7366657220776f756c6420686176652062726f756768742074686520636f6e74726163742062656c6f773d01207468652073756273697374656e6365207468726573686f6c642e204e6f207472616e7366657220697320616c6c6f77656420746f20646f207468697320696e206f7264657220746f20616c6c6f77450120666f72206120746f6d6273746f6e6520746f20626520637265617465642e2055736520607365616c5f7465726d696e6174656020746f2072656d6f7665206120636f6e747261637420776974686f757470206c656176696e67206120746f6d6273746f6e6520626568696e642e504e6577436f6e74726163744e6f7446756e64656408390120546865206e65776c79206372656174656420636f6e74726163742069732062656c6f77207468652073756273697374656e6365207468726573686f6c6420616674657220657865637574696e6721012069747320636f6e74727563746f722e204e6f20636f6e7472616374732061726520616c6c6f77656420746f2065786973742062656c6f772074686174207468726573686f6c642e385472616e736665724661696c65640c250120506572666f726d696e672074686520726571756573746564207472616e73666572206661696c656420666f72206120726561736f6e206f726967696e6174696e6720696e2074686531012063686f73656e2063757272656e637920696d706c656d656e746174696f6e206f66207468652072756e74696d652e204d6f73742070726f6261626c79207468652062616c616e63652069738c20746f6f206c6f77206f72206c6f636b732061726520706c61636564206f6e2069742e4c4d617843616c6c44657074685265616368656408250120506572666f726d696e6720612063616c6c207761732064656e6965642062656361757365207468652063616c6c696e67206465707468207265616368656420746865206c696d697498206f6620776861742069732073706563696669656420696e20746865207363686564756c652e2c4e6f7443616c6c61626c650831012054686520636f6e74726163742074686174207761732063616c6c656420697320656974686572206e6f20636f6e747261637420617420616c6c20286120706c61696e206163636f756e74294c206f72206973206120746f6d6273746f6e652e30436f6465546f6f4c617267650455012054686520636f646520737570706c69656420746f20607075745f636f646560206578636565647320746865206c696d69742073706563696669656420696e207468652063757272656e74207363686564756c652e30436f64654e6f74466f756e6404c8204e6f20636f646520636f756c6420626520666f756e642061742074686520737570706c69656420636f646520686173682e2c4f75744f66426f756e6473042901204120627566666572206f757473696465206f662073616e64626f78206d656d6f7279207761732070617373656420746f206120636f6e7472616374204150492066756e6374696f6e2e384465636f64696e674661696c6564042d0120496e7075742070617373656420746f206120636f6e7472616374204150492066756e6374696f6e206661696c656420746f206465636f646520617320657870656374656420747970652e3c436f6e747261637454726170706564048c20436f6e7472616374207472617070656420647572696e6720657865637574696f6e2e105375646f01105375646f040c4b6579010030543a3a4163636f756e74496480000000000000000000000000000000000000000000000000000000000000000004842054686520604163636f756e74496460206f6620746865207375646f206b65792e0110107375646f041063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e2839012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e60202d204f6e6520444220777269746520286576656e74292ec8202d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e302023203c2f7765696768743e547375646f5f756e636865636b65645f776569676874081063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e1c5f776569676874185765696768742839012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e310120546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865b4205375646f207573657220746f20737065636966792074686520776569676874206f66207468652063616c6c2e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292ed0202d2054686520776569676874206f6620746869732063616c6c20697320646566696e6564206279207468652063616c6c65722e302023203c2f7765696768743e1c7365745f6b6579040c6e65778c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652475012041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e44202d204f6e65204442206368616e67652e302023203c2f7765696768743e1c7375646f5f6173080c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e2c51012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d44206120676976656e206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e60202d204f6e6520444220777269746520286576656e74292ec8202d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e302023203c2f7765696768743e010c14537564696404384469737061746368526573756c7404842041207375646f206a75737420746f6f6b20706c6163652e205b726573756c745d284b65794368616e67656404244163636f756e74496404f820546865205b7375646f65725d206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e285375646f4173446f6e650410626f6f6c04842041207375646f206a75737420746f6f6b20706c6163652e205b726573756c745d00042c526571756972655375646f04802053656e646572206d75737420626520746865205375646f206163636f756e7420496d4f6e6c696e650120496d4f6e6c696e6510384865617274626561744166746572010038543a3a426c6f636b4e756d62657210000000001831012054686520626c6f636b206e756d6265722061667465722077686963682069742773206f6b20746f2073656e64206865617274626561747320696e2063757272656e742073657373696f6e2e0011012041742074686520626567696e6e696e67206f6620656163682073657373696f6e20776520736574207468697320746f20612076616c756520746861742073686f756c64d02066616c6c20726f7567686c7920696e20746865206d6964646c65206f66207468652073657373696f6e206475726174696f6e2e010120546865206964656120697320746f206669727374207761697420666f72207468652076616c696461746f727320746f2070726f64756365206120626c6f636b390120696e207468652063757272656e742073657373696f6e2c20736f20746861742074686520686561727462656174206c61746572206f6e2077696c6c206e6f74206265206e65636573736172792e104b65797301004c5665633c543a3a417574686f7269747949643e040004d0205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e485265636569766564486561727462656174730002053053657373696f6e496e6465782441757468496e6465781c5665633c75383e05040008f020466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206041757468496e6465786020746f8020606f6666636861696e3a3a4f70617175654e6574776f726b5374617465602e38417574686f726564426c6f636b730102053053657373696f6e496e64657838543a3a56616c696461746f7249640c75333205100000000008150120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f662060543a3a56616c696461746f7249646020746f20746865c8206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e0104246865617274626561740824686561727462656174644865617274626561743c543a3a426c6f636b4e756d6265723e285f7369676e6174757265bc3c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e6174757265282c2023203c7765696768743e2101202d20436f6d706c65786974793a20604f284b202b20452960207768657265204b206973206c656e677468206f6620604b6579736020616e642045206973206c656e677468206f66b4202020604865617274626561742e6e6574776f726b5f73746174652e65787465726e616c5f6164647265737360008c2020202d20604f284b29603a206465636f64696e67206f66206c656e67746820604b60b02020202d20604f284529603a206465636f64696e672f656e636f64696e67206f66206c656e677468206045603d01202d20446252656164733a2070616c6c65745f73657373696f6e206056616c696461746f7273602c2070616c6c65745f73657373696f6e206043757272656e74496e646578602c20604b657973602c5c202020605265636569766564486561727462656174736084202d2044625772697465733a206052656365697665644865617274626561747360302023203c2f7765696768743e010c444865617274626561745265636569766564042c417574686f72697479496404fc2041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f72697479496460205b617574686f726974795f69645d1c416c6c476f6f640004d42041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2c536f6d654f66666c696e6504605665633c4964656e74696669636174696f6e5475706c653e0435012041742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e652076616c696461746f722077617320666f756e6420746f206265205b6f66666c696e655d2e000828496e76616c69644b65790464204e6f6e206578697374656e74207075626c6963206b65792e4c4475706c6963617465644865617274626561740458204475706c696361746564206865617274626561742e48417574686f72697479446973636f76657279000100000000204f6666656e63657301204f6666656e636573101c5265706f727473000105345265706f727449644f663c543ed04f6666656e636544657461696c733c543a3a4163636f756e7449642c20543a3a4964656e74696669636174696f6e5475706c653e00040004490120546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e4044656665727265644f6666656e6365730100645665633c44656665727265644f6666656e63654f663c543e3e0400086501204465666572726564207265706f72747320746861742068617665206265656e2072656a656374656420627920746865206f6666656e63652068616e646c657220616e64206e65656420746f206265207375626d6974746564442061742061206c617465722074696d652e58436f6e63757272656e745265706f727473496e646578010205104b696e64384f706171756554696d65536c6f74485665633c5265706f727449644f663c543e3e050400042901204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e485265706f72747342794b696e64496e646578010105104b696e641c5665633c75383e00040018110120456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e00bc20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e004901204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f66690120646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e010001041c4f6666656e63650c104b696e64384f706171756554696d65536c6f7410626f6f6c10550120546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e644d0120286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e206c6173741d0120656c656d656e7420696e64696361746573206f6620746865206f6666656e636520776173206170706c69656420287472756529206f7220717565756564202866616c736529206c205b6b696e642c2074696d65736c6f742c206170706c6965645d2e000028486973746f726963616c00000000006052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100305665633c543a3a486173683e04000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e0100000000204964656e7469747901204964656e7469747910284964656e746974794f6600010530543a3a4163636f756e74496468526567697374726174696f6e3c42616c616e63654f663c543e3e0004000c210120496e666f726d6174696f6e20746861742069732070657274696e656e7420746f206964656e746966792074686520656e7469747920626568696e6420616e206163636f756e742e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e1c53757065724f6600010230543a3a4163636f756e7449645028543a3a4163636f756e7449642c204461746129000400086101205468652073757065722d6964656e74697479206f6620616e20616c7465726e6174697665202273756222206964656e7469747920746f676574686572207769746820697473206e616d652c2077697468696e2074686174510120636f6e746578742e20496620746865206163636f756e74206973206e6f7420736f6d65206f74686572206163636f756e742773207375622d6964656e746974792c207468656e206a75737420604e6f6e65602e18537562734f6601010530543a3a4163636f756e744964842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e290044000000000000000000000000000000000014b820416c7465726e6174697665202273756222206964656e746974696573206f662074686973206163636f756e742e001d0120546865206669727374206974656d20697320746865206465706f7369742c20746865207365636f6e64206973206120766563746f72206f6620746865206163636f756e74732e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e28526567697374726172730100d85665633c4f7074696f6e3c526567697374726172496e666f3c42616c616e63654f663c543e2c20543a3a4163636f756e7449643e3e3e0400104d012054686520736574206f6620726567697374726172732e204e6f7420657870656374656420746f206765742076657279206269672061732063616e206f6e6c79206265206164646564207468726f7567682061a8207370656369616c206f726967696e20286c696b656c79206120636f756e63696c206d6f74696f6e292e0029012054686520696e64657820696e746f20746869732063616e206265206361737420746f2060526567697374726172496e6465786020746f2067657420612076616c69642076616c75652e013c346164645f726567697374726172041c6163636f756e7430543a3a4163636f756e744964347c2041646420612072656769737472617220746f207468652073797374656d2e00010120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060543a3a5265676973747261724f726967696e602e00ac202d20606163636f756e74603a20746865206163636f756e74206f6620746865207265676973747261722e009820456d6974732060526567697374726172416464656460206966207375636365737366756c2e002c2023203c7765696768743e2901202d20604f2852296020776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e64656420616e6420636f64652d626f756e646564292e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e307365745f6964656e746974790410696e666f304964656e74697479496e666f4c2d012053657420616e206163636f756e742773206964656e7469747920696e666f726d6174696f6e20616e6420726573657276652074686520617070726f707269617465206465706f7369742e00590120496620746865206163636f756e7420616c726561647920686173206964656e7469747920696e666f726d6174696f6e2c20746865206465706f7369742069732074616b656e2061732070617274207061796d656e745420666f7220746865206e6577206465706f7369742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0090202d2060696e666f603a20546865206964656e7469747920696e666f726d6174696f6e2e008c20456d69747320604964656e7469747953657460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2858202b205827202b2052296021012020202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e64656429e42020202d20776865726520605260206a756467656d656e74732d636f756e7420287265676973747261722d636f756e742d626f756e6465642984202d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e2501202d204f6e652073746f72616765206d75746174696f6e2028636f6465632d7265616420604f285827202b205229602c20636f6465632d777269746520604f2858202b20522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e207365745f73756273041073756273645665633c28543a3a4163636f756e7449642c2044617461293e54902053657420746865207375622d6163636f756e7473206f66207468652073656e6465722e005901205061796d656e743a20416e79206167677265676174652062616c616e63652072657365727665642062792070726576696f757320607365745f73756273602063616c6c732077696c6c2062652072657475726e6564310120616e6420616e20616d6f756e7420605375624163636f756e744465706f736974602077696c6c20626520726573657276656420666f722065616368206974656d20696e206073756273602e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e00b4202d206073756273603a20546865206964656e74697479277320286e657729207375622d6163636f756e74732e002c2023203c7765696768743e34202d20604f2850202b20532960e82020202d20776865726520605060206f6c642d737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292ed82020202d2077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e88202d204174206d6f7374206f6e652062616c616e6365206f7065726174696f6e732e18202d2044423ae02020202d206050202b2053602073746f72616765206d75746174696f6e732028636f64656320636f6d706c657869747920604f2831296029c02020202d204f6e652073746f7261676520726561642028636f64656320636f6d706c657869747920604f28502960292ec42020202d204f6e652073746f726167652077726974652028636f64656320636f6d706c657869747920604f28532960292ed42020202d204f6e652073746f726167652d6578697374732028604964656e746974794f663a3a636f6e7461696e735f6b657960292e302023203c2f7765696768743e38636c6561725f6964656e7469747900483d0120436c65617220616e206163636f756e742773206964656e7469747920696e666f20616e6420616c6c207375622d6163636f756e747320616e642072657475726e20616c6c206465706f736974732e00f0205061796d656e743a20416c6c2072657365727665642062616c616e636573206f6e20746865206163636f756e74206172652072657475726e65642e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e009c20456d69747320604964656e74697479436c656172656460206966207375636365737366756c2e002c2023203c7765696768743e44202d20604f2852202b2053202b20582960d02020202d20776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e646564292ed82020202d2077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e25012020202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e646564292e8c202d204f6e652062616c616e63652d756e72657365727665206f7065726174696f6e2ecc202d206032602073746f7261676520726561647320616e64206053202b2032602073746f726167652064656c6574696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e44726571756573745f6a756467656d656e7408247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e1c6d61785f66656554436f6d706163743c42616c616e63654f663c543e3e5c9820526571756573742061206a756467656d656e742066726f6d2061207265676973747261722e005901205061796d656e743a204174206d6f737420606d61785f666565602077696c6c20626520726573657276656420666f72207061796d656e7420746f2074686520726567697374726172206966206a756467656d656e741c20676976656e2e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e002101202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973207265717565737465642e5901202d20606d61785f666565603a20546865206d6178696d756d206665652074686174206d617920626520706169642e20546869732073686f756c64206a757374206265206175746f2d706f70756c617465642061733a0034206060606e6f636f6d70696c65bc2053656c663a3a7265676973747261727328292e676574287265675f696e646578292e756e7772617028292e666565102060606000a820456d69747320604a756467656d656e7452657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2858202b205229602e34202d204f6e65206576656e742e302023203c2f7765696768743e3863616e63656c5f7265717565737404247265675f696e64657838526567697374726172496e646578446c2043616e63656c20612070726576696f757320726571756573742e00fc205061796d656e743a20412070726576696f75736c79207265736572766564206465706f7369742069732072657475726e6564206f6e20737563636573732e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e004901202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206e6f206c6f6e676572207265717565737465642e00b020456d69747320604a756467656d656e74556e72657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e8c202d204f6e652073746f72616765206d75746174696f6e20604f2852202b205829602e30202d204f6e65206576656e74302023203c2f7765696768743e1c7365745f6665650814696e6465785c436f6d706163743c526567697374726172496e6465783e0c66656554436f6d706163743c42616c616e63654f663c543e3e341d0120536574207468652066656520726571756972656420666f722061206a756467656d656e7420746f206265207265717565737465642066726f6d2061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e58202d2060666565603a20746865206e6577206665652e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602ee8202d2042656e63686d61726b3a20372e333135202b2052202a20302e33323920c2b57320286d696e207371756172657320616e616c7973697329302023203c2f7765696768743e387365745f6163636f756e745f69640814696e6465785c436f6d706163743c526567697374726172496e6465783e0c6e657730543a3a4163636f756e74496434c0204368616e676520746865206163636f756e74206173736f63696174656420776974682061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e74202d20606e6577603a20746865206e6577206163636f756e742049442e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602ee4202d2042656e63686d61726b3a20382e383233202b2052202a20302e333220c2b57320286d696e207371756172657320616e616c7973697329302023203c2f7765696768743e287365745f6669656c64730814696e6465785c436f6d706163743c526567697374726172496e6465783e186669656c6473384964656e746974794669656c647334ac2053657420746865206669656c6420696e666f726d6174696f6e20666f722061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e1101202d20606669656c6473603a20746865206669656c64732074686174207468652072656769737472617220636f6e6365726e73207468656d73656c76657320776974682e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602ee8202d2042656e63686d61726b3a20372e343634202b2052202a20302e33323520c2b57320286d696e207371756172657320616e616c7973697329302023203c2f7765696768743e4470726f766964655f6a756467656d656e740c247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365246a756467656d656e745c4a756467656d656e743c42616c616e63654f663c543e3e4cbc2050726f766964652061206a756467656d656e7420666f7220616e206163636f756e742773206964656e746974792e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74b4206f6620746865207265676973747261722077686f736520696e64657820697320607265675f696e646578602e002501202d20607265675f696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206265696e67206d6164652e5901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e4d01202d20606a756467656d656e74603a20746865206a756467656d656e74206f662074686520726567697374726172206f6620696e64657820607265675f696e646578602061626f75742060746172676574602e009820456d69747320604a756467656d656e74476976656e60206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e88202d204f6e652062616c616e63652d7472616e73666572206f7065726174696f6e2e98202d20557020746f206f6e65206163636f756e742d6c6f6f6b7570206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2852202b205829602e34202d204f6e65206576656e742e302023203c2f7765696768743e346b696c6c5f6964656e7469747904187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654c45012052656d6f766520616e206163636f756e742773206964656e7469747920616e64207375622d6163636f756e7420696e666f726d6174696f6e20616e6420736c61736820746865206465706f736974732e006501205061796d656e743a2052657365727665642062616c616e6365732066726f6d20607365745f737562736020616e6420607365745f6964656e74697479602061726520736c617368656420616e642068616e646c656420627949012060536c617368602e20566572696669636174696f6e2072657175657374206465706f7369747320617265206e6f742072657475726e65643b20746865792073686f756c642062652063616e63656c6c656484206d616e75616c6c79207573696e67206063616e63656c5f72657175657374602e00fc20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206d617463682060543a3a466f7263654f726967696e602e005901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e009820456d69747320604964656e746974794b696c6c656460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2852202b2053202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e74202d206053202b2032602073746f72616765206d75746174696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e1c6164645f737562080c7375628c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365106461746110446174611cb0204164642074686520676976656e206163636f756e7420746f207468652073656e646572277320737562732e006101205061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c2062652072657061747269617465643c20746f207468652073656e6465722e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573742068617665206120726567697374657265645c20737562206964656e74697479206f662060737562602e2872656e616d655f737562080c7375628c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651064617461104461746110d020416c74657220746865206173736f636961746564206e616d65206f662074686520676976656e207375622d6163636f756e742e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573742068617665206120726567697374657265645c20737562206964656e74697479206f662060737562602e2872656d6f76655f737562040c7375628c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651cc42052656d6f76652074686520676976656e206163636f756e742066726f6d207468652073656e646572277320737562732e006101205061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c2062652072657061747269617465643c20746f207468652073656e6465722e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573742068617665206120726567697374657265645c20737562206964656e74697479206f662060737562602e20717569745f7375620028902052656d6f7665207468652073656e6465722061732061207375622d6163636f756e742e006101205061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c206265207265706174726961746564b820746f207468652073656e64657220282a6e6f742a20746865206f726967696e616c206465706f7369746f72292e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206861766520612072656769737465726564402073757065722d6964656e746974792e004901204e4f54453a20546869732073686f756c64206e6f74206e6f726d616c6c7920626520757365642c206275742069732070726f766964656420696e207468652063617365207468617420746865206e6f6e2d150120636f6e74726f6c6c6572206f6620616e206163636f756e74206973206d616c6963696f75736c7920726567697374657265642061732061207375622d6163636f756e742e01282c4964656e7469747953657404244163636f756e7449640409012041206e616d652077617320736574206f72207265736574202877686963682077696c6c2072656d6f766520616c6c206a756467656d656e7473292e205b77686f5d3c4964656e74697479436c656172656408244163636f756e7449641c42616c616e6365040d012041206e616d652077617320636c65617265642c20616e642074686520676976656e2062616c616e63652072657475726e65642e205b77686f2c206465706f7369745d384964656e746974794b696c6c656408244163636f756e7449641c42616c616e63650405012041206e616d65207761732072656d6f76656420616e642074686520676976656e2062616c616e636520736c61736865642e205b77686f2c206465706f7369745d484a756467656d656e7452657175657374656408244163636f756e74496438526567697374726172496e64657804fc2041206a756467656d656e74207761732061736b65642066726f6d2061207265676973747261722e205b77686f2c207265676973747261725f696e6465785d504a756467656d656e74556e72657175657374656408244163636f756e74496438526567697374726172496e64657804e82041206a756467656d656e74207265717565737420776173207265747261637465642e205b77686f2c207265676973747261725f696e6465785d384a756467656d656e74476976656e08244163636f756e74496438526567697374726172496e6465780401012041206a756467656d656e742077617320676976656e2062792061207265676973747261722e205b7461726765742c207265676973747261725f696e6465785d3852656769737472617241646465640438526567697374726172496e64657804a4204120726567697374726172207761732061646465642e205b7265676973747261725f696e6465785d405375624964656e7469747941646465640c244163636f756e744964244163636f756e7449641c42616c616e6365044d012041207375622d6964656e746974792077617320616464656420746f20616e206964656e7469747920616e6420746865206465706f73697420706169642e205b7375622c206d61696e2c206465706f7369745d485375624964656e7469747952656d6f7665640c244163636f756e744964244163636f756e7449641c42616c616e6365080d012041207375622d6964656e74697479207761732072656d6f7665642066726f6d20616e206964656e7469747920616e6420746865206465706f7369742066726565642e54205b7375622c206d61696e2c206465706f7369745d485375624964656e746974795265766f6b65640c244163636f756e744964244163636f756e7449641c42616c616e6365081d012041207375622d6964656e746974792077617320636c65617265642c20616e642074686520676976656e206465706f7369742072657061747269617465642066726f6d207468652101206d61696e206964656e74697479206163636f756e7420746f20746865207375622d6964656e74697479206163636f756e742e205b7375622c206d61696e2c206465706f7369745d183042617369634465706f7369743042616c616e63654f663c543e400080c6a47e8d0300000000000000000004d82054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564206964656e746974792e304669656c644465706f7369743042616c616e63654f663c543e4000a031a95fe300000000000000000000042d012054686520616d6f756e742068656c64206f6e206465706f73697420706572206164646974696f6e616c206669656c6420666f7220612072656769737465726564206964656e746974792e445375624163636f756e744465706f7369743042616c616e63654f663c543e400080f420e6b5000000000000000000000c65012054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564207375626163636f756e742e20546869732073686f756c64206163636f756e7420666f7220746865206661637471012074686174206f6e652073746f72616765206974656d27732076616c75652077696c6c20696e637265617365206279207468652073697a65206f6620616e206163636f756e742049442c20616e642074686572652077696c6c206265290120616e6f746865722074726965206974656d2077686f73652076616c7565206973207468652073697a65206f6620616e206163636f756e7420494420706c75732033322062797465732e384d61785375624163636f756e74730c7533321064000000040d0120546865206d6178696d756d206e756d626572206f66207375622d6163636f756e747320616c6c6f77656420706572206964656e746966696564206163636f756e742e4c4d61784164646974696f6e616c4669656c64730c7533321064000000086501204d6178696d756d206e756d626572206f66206164646974696f6e616c206669656c64732074686174206d61792062652073746f72656420696e20616e2049442e204e656564656420746f20626f756e642074686520492f4fe020726571756972656420746f2061636365737320616e206964656e746974792c206275742063616e2062652070726574747920686967682e344d6178526567697374726172730c7533321014000000085101204d61786d696d756d206e756d626572206f66207265676973747261727320616c6c6f77656420696e207468652073797374656d2e204e656564656420746f20626f756e642074686520636f6d706c65786974797c206f662c20652e672e2c207570646174696e67206a756467656d656e74732e4048546f6f4d616e795375624163636f756e7473046020546f6f206d616e7920737562732d6163636f756e74732e204e6f74466f756e640454204163636f756e742069736e277420666f756e642e204e6f744e616d65640454204163636f756e742069736e2774206e616d65642e28456d707479496e646578043420456d70747920696e6465782e284665654368616e676564044020466565206973206368616e6765642e284e6f4964656e74697479044c204e6f206964656e7469747920666f756e642e3c537469636b794a756467656d656e74044820537469636b79206a756467656d656e742e384a756467656d656e74476976656e0444204a756467656d656e7420676976656e2e40496e76616c69644a756467656d656e74044c20496e76616c6964206a756467656d656e742e30496e76616c6964496e64657804582054686520696e64657820697320696e76616c69642e34496e76616c6964546172676574045c205468652074617267657420697320696e76616c69642e34546f6f4d616e794669656c6473047020546f6f206d616e79206164646974696f6e616c206669656c64732e44546f6f4d616e795265676973747261727304ec204d6178696d756d20616d6f756e74206f66207265676973747261727320726561636865642e2043616e6e6f742061646420616e79206d6f72652e38416c7265616479436c61696d65640474204163636f756e7420494420697320616c7265616479206e616d65642e184e6f7453756204742053656e646572206973206e6f742061207375622d6163636f756e742e204e6f744f776e6564048c205375622d6163636f756e742069736e2774206f776e65642062792073656e6465722e1c536f6369657479011c536f6369657479401c466f756e646572000030543a3a4163636f756e7449640400044820546865206669727374206d656d6265722e1452756c657300001c543a3a48617368040008510120412068617368206f66207468652072756c6573206f66207468697320736f636965747920636f6e6365726e696e67206d656d626572736869702e2043616e206f6e6c7920626520736574206f6e636520616e6454206f6e6c792062792074686520666f756e6465722e2843616e6469646174657301009c5665633c4269643c543a3a4163636f756e7449642c2042616c616e63654f663c542c20493e3e3e0400043901205468652063757272656e7420736574206f662063616e646964617465733b206269646465727320746861742061726520617474656d7074696e6720746f206265636f6d65206d656d626572732e4c53757370656e64656443616e6469646174657300010530543a3a4163636f756e744964e42842616c616e63654f663c542c20493e2c204269644b696e643c543a3a4163636f756e7449642c2042616c616e63654f663c542c20493e3e2900040004842054686520736574206f662073757370656e6465642063616e646964617465732e0c506f7401003c42616c616e63654f663c542c20493e400000000000000000000000000000000004410120416d6f756e74206f66206f7572206163636f756e742062616c616e63652074686174206973207370656369666963616c6c7920666f7220746865206e65787420726f756e642773206269642873292e1048656164000030543a3a4163636f756e744964040004e820546865206d6f7374207072696d6172792066726f6d20746865206d6f737420726563656e746c7920617070726f766564206d656d626572732e1c4d656d626572730100445665633c543a3a4163636f756e7449643e04000494205468652063757272656e7420736574206f66206d656d626572732c206f7264657265642e4053757370656e6465644d656d6265727301010530543a3a4163636f756e74496410626f6f6c00040004782054686520736574206f662073757370656e646564206d656d626572732e104269647301009c5665633c4269643c543a3a4163636f756e7449642c2042616c616e63654f663c542c20493e3e3e040004e8205468652063757272656e7420626964732c2073746f726564206f726465726564206279207468652076616c7565206f6620746865206269642e20566f756368696e6700010530543a3a4163636f756e74496438566f756368696e6753746174757300040004e4204d656d626572732063757272656e746c7920766f756368696e67206f722062616e6e65642066726f6d20766f756368696e6720616761696e1c5061796f75747301010530543a3a4163636f756e744964985665633c28543a3a426c6f636b4e756d6265722c2042616c616e63654f663c542c20493e293e000400044d012050656e64696e67207061796f7574733b206f72646572656420627920626c6f636b206e756d6265722c20776974682074686520616d6f756e7420746861742073686f756c642062652070616964206f75742e1c537472696b657301010530543a3a4163636f756e7449642c537472696b65436f756e7400100000000004dc20546865206f6e676f696e67206e756d626572206f66206c6f73696e6720766f746573206361737420627920746865206d656d6265722e14566f74657300020530543a3a4163636f756e74496430543a3a4163636f756e74496410566f746505040004d020446f75626c65206d61702066726f6d2043616e646964617465202d3e20566f746572202d3e20284d617962652920566f74652e20446566656e646572000030543a3a4163636f756e744964040004c42054686520646566656e64696e67206d656d6265722063757272656e746c79206265696e67206368616c6c656e6765642e34446566656e646572566f74657300010530543a3a4163636f756e74496410566f7465000400046020566f74657320666f722074686520646566656e6465722e284d61784d656d6265727301000c753332100000000004dc20546865206d6178206e756d626572206f66206d656d6265727320666f722074686520736f6369657479206174206f6e652074696d652e01300c626964041476616c75653c42616c616e63654f663c542c20493e84e020412075736572206f757473696465206f662074686520736f63696574792063616e206d616b6520612062696420666f7220656e7472792e003901205061796d656e743a206043616e6469646174654465706f736974602077696c6c20626520726573657276656420666f72206d616b696e672061206269642e2049742069732072657475726e6564f0207768656e2074686520626964206265636f6d65732061206d656d6265722c206f7220696620746865206269642063616c6c732060756e626964602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a5901202d206076616c7565603a2041206f6e652074696d65207061796d656e74207468652062696420776f756c64206c696b6520746f2072656365697665207768656e206a6f696e696e672074686520736f63696574792e002c2023203c7765696768743e5501204b65793a204220286c656e206f662062696473292c204320286c656e206f662063616e64696461746573292c204d20286c656e206f66206d656d62657273292c2058202862616c616e636520726573657276652944202d2053746f726167652052656164733aec20092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e6465642063616e6469646174652e204f283129e020092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e646564206d656d6265722e204f283129dc20092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e7420626964732e204f284229f420092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e742063616e646964617465732e204f284329c820092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c206d656d626572732e204f284d2948202d2053746f72616765205772697465733a810120092d204f6e652073746f72616765206d757461746520746f206164642061206e65772062696420746f2074686520766563746f72204f2842292028544f444f3a20706f737369626c65206f7074696d697a6174696f6e20772f207265616429010120092d20557020746f206f6e652073746f726167652072656d6f76616c206966206269642e6c656e2829203e204d41585f4249445f434f554e542e204f2831295c202d204e6f7461626c6520436f6d7075746174696f6e3a2d0120092d204f2842202b2043202b206c6f67204d292073656172636820746f20636865636b2075736572206973206e6f7420616c726561647920612070617274206f6620736f63696574792ec420092d204f286c6f672042292073656172636820746f20696e7365727420746865206e65772062696420736f727465642e78202d2045787465726e616c204d6f64756c65204f7065726174696f6e733a9c20092d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e204f285829210120092d20557020746f206f6e652062616c616e636520756e72657365727665206f7065726174696f6e20696620626964732e6c656e2829203e204d41585f4249445f434f554e542e28202d204576656e74733a6820092d204f6e65206576656e7420666f72206e6577206269642efc20092d20557020746f206f6e65206576656e7420666f72204175746f556e626964206966206269642e6c656e2829203e204d41585f4249445f434f554e542e00c420546f74616c20436f6d706c65786974793a204f284d202b2042202b2043202b206c6f674d202b206c6f6742202b205829302023203c2f7765696768743e14756e626964040c706f730c7533324cd82041206269646465722063616e2072656d6f76652074686569722062696420666f7220656e74727920696e746f20736f63696574792e010120427920646f696e6720736f2c20746865792077696c6c20686176652074686569722063616e646964617465206465706f7369742072657475726e6564206f728420746865792077696c6c20756e766f75636820746865697220766f75636865722e00fc205061796d656e743a2054686520626964206465706f73697420697320756e7265736572766564206966207468652075736572206d6164652061206269642e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206269646465722e003020506172616d65746572733a1901202d2060706f73603a20506f736974696f6e20696e207468652060426964736020766563746f72206f6620746865206269642077686f2077616e747320746f20756e6269642e002c2023203c7765696768743eb0204b65793a204220286c656e206f662062696473292c2058202862616c616e636520756e72657365727665290d01202d204f6e652073746f72616765207265616420616e6420777269746520746f20726574726965766520616e64207570646174652074686520626964732e204f2842294501202d20456974686572206f6e6520756e726573657276652062616c616e636520616374696f6e204f285829206f72206f6e6520766f756368696e672073746f726167652072656d6f76616c2e204f28312934202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2842202b205829302023203c2f7765696768743e14766f7563680c0c77686f30543a3a4163636f756e7449641476616c75653c42616c616e63654f663c542c20493e0c7469703c42616c616e63654f663c542c20493eb045012041732061206d656d6265722c20766f75636820666f7220736f6d656f6e6520746f206a6f696e20736f636965747920627920706c6163696e67206120626964206f6e20746865697220626568616c662e005501205468657265206973206e6f206465706f73697420726571756972656420746f20766f75636820666f722061206e6577206269642c206275742061206d656d6265722063616e206f6e6c7920766f75636820666f725d01206f6e652062696420617420612074696d652e2049662074686520626964206265636f6d657320612073757370656e6465642063616e64696461746520616e6420756c74696d6174656c792072656a65637465642062794101207468652073757370656e73696f6e206a756467656d656e74206f726967696e2c20746865206d656d6265722077696c6c2062652062616e6e65642066726f6d20766f756368696e6720616761696e2e005901204173206120766f756368696e67206d656d6265722c20796f752063616e20636c61696d206120746970206966207468652063616e6469646174652069732061636365707465642e2054686973207469702077696c6c51012062652070616964206173206120706f7274696f6e206f66207468652072657761726420746865206d656d6265722077696c6c207265636569766520666f72206a6f696e696e672074686520736f63696574792e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d6265722e003020506172616d65746572733acc202d206077686f603a2054686520757365722077686f20796f7520776f756c64206c696b6520746f20766f75636820666f722e5101202d206076616c7565603a2054686520746f74616c2072657761726420746f2062652070616964206265747765656e20796f7520616e64207468652063616e6469646174652069662074686579206265636f6d65642061206d656d62657220696e2074686520736f63696574792e4901202d2060746970603a20596f757220637574206f662074686520746f74616c206076616c756560207061796f7574207768656e207468652063616e64696461746520697320696e64756374656420696e746f15012074686520736f63696574792e2054697073206c6172676572207468616e206076616c7565602077696c6c206265207361747572617465642075706f6e207061796f75742e002c2023203c7765696768743e0101204b65793a204220286c656e206f662062696473292c204320286c656e206f662063616e64696461746573292c204d20286c656e206f66206d656d626572732944202d2053746f726167652052656164733ac820092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c206d656d626572732e204f284d29090120092d204f6e652073746f72616765207265616420746f20636865636b206d656d626572206973206e6f7420616c726561647920766f756368696e672e204f283129ec20092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e6465642063616e6469646174652e204f283129e020092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e646564206d656d6265722e204f283129dc20092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e7420626964732e204f284229f420092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e742063616e646964617465732e204f28432948202d2053746f72616765205772697465733a0d0120092d204f6e652073746f7261676520777269746520746f20696e7365727420766f756368696e672073746174757320746f20746865206d656d6265722e204f283129810120092d204f6e652073746f72616765206d757461746520746f206164642061206e65772062696420746f2074686520766563746f72204f2842292028544f444f3a20706f737369626c65206f7074696d697a6174696f6e20772f207265616429010120092d20557020746f206f6e652073746f726167652072656d6f76616c206966206269642e6c656e2829203e204d41585f4249445f434f554e542e204f2831295c202d204e6f7461626c6520436f6d7075746174696f6e3ac020092d204f286c6f67204d292073656172636820746f20636865636b2073656e6465722069732061206d656d6265722e2d0120092d204f2842202b2043202b206c6f67204d292073656172636820746f20636865636b2075736572206973206e6f7420616c726561647920612070617274206f6620736f63696574792ec420092d204f286c6f672042292073656172636820746f20696e7365727420746865206e65772062696420736f727465642e78202d2045787465726e616c204d6f64756c65204f7065726174696f6e733a9c20092d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e204f285829210120092d20557020746f206f6e652062616c616e636520756e72657365727665206f7065726174696f6e20696620626964732e6c656e2829203e204d41585f4249445f434f554e542e28202d204576656e74733a6020092d204f6e65206576656e7420666f7220766f7563682efc20092d20557020746f206f6e65206576656e7420666f72204175746f556e626964206966206269642e6c656e2829203e204d41585f4249445f434f554e542e00c420546f74616c20436f6d706c65786974793a204f284d202b2042202b2043202b206c6f674d202b206c6f6742202b205829302023203c2f7765696768743e1c756e766f756368040c706f730c753332442d01204173206120766f756368696e67206d656d6265722c20756e766f7563682061206269642e2054686973206f6e6c7920776f726b73207768696c6520766f7563686564207573657220697394206f6e6c792061206269646465722028616e64206e6f7420612063616e646964617465292e00290120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206120766f756368696e67206d656d6265722e003020506172616d65746572733a2d01202d2060706f73603a20506f736974696f6e20696e207468652060426964736020766563746f72206f6620746865206269642077686f2073686f756c6420626520756e766f75636865642e002c2023203c7765696768743e54204b65793a204220286c656e206f662062696473290901202d204f6e652073746f726167652072656164204f28312920746f20636865636b20746865207369676e6572206973206120766f756368696e67206d656d6265722eec202d204f6e652073746f72616765206d757461746520746f20726574726965766520616e64207570646174652074686520626964732e204f28422994202d204f6e6520766f756368696e672073746f726167652072656d6f76616c2e204f28312934202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f284229302023203c2f7765696768743e10766f7465082463616e6469646174658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651c617070726f766510626f6f6c4c882041732061206d656d6265722c20766f7465206f6e20612063616e6469646174652e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d6265722e003020506172616d65746572733a0d01202d206063616e646964617465603a205468652063616e646964617465207468617420746865206d656d62657220776f756c64206c696b6520746f20626964206f6e2ef4202d2060617070726f7665603a204120626f6f6c65616e2077686963682073617973206966207468652063616e6469646174652073686f756c64206265d82020202020202020202020202020617070726f766564202860747275656029206f722072656a656374656420286066616c736560292e002c2023203c7765696768743ebc204b65793a204320286c656e206f662063616e64696461746573292c204d20286c656e206f66206d656d62657273291d01202d204f6e652073746f726167652072656164204f284d2920616e64204f286c6f67204d292073656172636820746f20636865636b20757365722069732061206d656d6265722e58202d204f6e65206163636f756e74206c6f6f6b75702e2d01202d204f6e652073746f726167652072656164204f28432920616e64204f2843292073656172636820746f20636865636b2074686174207573657220697320612063616e6469646174652ebc202d204f6e652073746f7261676520777269746520746f2061646420766f746520746f20766f7465732e204f28312934202d204f6e65206576656e742e008820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b204329302023203c2f7765696768743e34646566656e6465725f766f7465041c617070726f766510626f6f6c408c2041732061206d656d6265722c20766f7465206f6e2074686520646566656e6465722e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d6265722e003020506172616d65746572733af4202d2060617070726f7665603a204120626f6f6c65616e2077686963682073617973206966207468652063616e6469646174652073686f756c64206265a420617070726f766564202860747275656029206f722072656a656374656420286066616c736560292e002c2023203c7765696768743e68202d204b65793a204d20286c656e206f66206d656d62657273291d01202d204f6e652073746f726167652072656164204f284d2920616e64204f286c6f67204d292073656172636820746f20636865636b20757365722069732061206d656d6265722ebc202d204f6e652073746f7261676520777269746520746f2061646420766f746520746f20766f7465732e204f28312934202d204f6e65206576656e742e007820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d29302023203c2f7765696768743e187061796f757400504501205472616e7366657220746865206669727374206d617475726564207061796f757420666f72207468652073656e64657220616e642072656d6f76652069742066726f6d20746865207265636f7264732e006901204e4f54453a20546869732065787472696e736963206e6565647320746f2062652063616c6c6564206d756c7469706c652074696d657320746f20636c61696d206d756c7469706c65206d617475726564207061796f7574732e002101205061796d656e743a20546865206d656d6265722077696c6c20726563656976652061207061796d656e7420657175616c20746f207468656972206669727374206d61747572656478207061796f757420746f20746865697220667265652062616c616e63652e00150120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d62657220776974684c207061796f7574732072656d61696e696e672e002c2023203c7765696768743e1d01204b65793a204d20286c656e206f66206d656d62657273292c205020286e756d626572206f66207061796f75747320666f72206120706172746963756c6172206d656d626572292501202d204f6e652073746f726167652072656164204f284d2920616e64204f286c6f67204d292073656172636820746f20636865636b207369676e65722069732061206d656d6265722ee4202d204f6e652073746f726167652072656164204f28502920746f2067657420616c6c207061796f75747320666f722061206d656d6265722ee4202d204f6e652073746f726167652072656164204f28312920746f20676574207468652063757272656e7420626c6f636b206e756d6265722e8c202d204f6e652063757272656e6379207472616e736665722063616c6c2e204f2858291101202d204f6e652073746f72616765207772697465206f722072656d6f76616c20746f2075706461746520746865206d656d6265722773207061796f7574732e204f285029009820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b2050202b205829302023203c2f7765696768743e14666f756e640c1c666f756e64657230543a3a4163636f756e7449642c6d61785f6d656d626572730c7533321472756c65731c5665633c75383e4c4c20466f756e642074686520736f63696574792e00f0205468697320697320646f6e65206173206120646973637265746520616374696f6e20696e206f7264657220746f20616c6c6f7720666f72207468651901206d6f64756c6520746f20626520696e636c7564656420696e746f20612072756e6e696e6720636861696e20616e642063616e206f6e6c7920626520646f6e65206f6e63652e001d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d20746865205f466f756e6465725365744f726967696e5f2e003020506172616d65746572733a1901202d2060666f756e64657260202d20546865206669727374206d656d62657220616e642068656164206f6620746865206e65776c7920666f756e64656420736f63696574792e1501202d20606d61785f6d656d6265727360202d2054686520696e697469616c206d6178206e756d626572206f66206d656d6265727320666f722074686520736f63696574792ef4202d206072756c657360202d205468652072756c6573206f66207468697320736f636965747920636f6e6365726e696e67206d656d626572736869702e002c2023203c7765696768743ee0202d2054776f2073746f72616765206d75746174657320746f207365742060486561646020616e642060466f756e646572602e204f283129f4202d204f6e652073746f7261676520777269746520746f2061646420746865206669727374206d656d62657220746f20736f63696574792e204f28312934202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f283129302023203c2f7765696768743e1c756e666f756e6400348c20416e6e756c2074686520666f756e64696e67206f662074686520736f63696574792e005d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205369676e65642c20616e6420746865207369676e696e67206163636f756e74206d75737420626520626f74685901207468652060466f756e6465726020616e6420746865206048656164602e205468697320696d706c6965732074686174206974206d6179206f6e6c7920626520646f6e65207768656e207468657265206973206f6e6520206d656d6265722e002c2023203c7765696768743e68202d2054776f2073746f72616765207265616473204f2831292e78202d20466f75722073746f726167652072656d6f76616c73204f2831292e34202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f283129302023203c2f7765696768743e586a756467655f73757370656e6465645f6d656d626572080c77686f30543a3a4163636f756e7449641c666f726769766510626f6f6c6c2d0120416c6c6f772073757370656e73696f6e206a756467656d656e74206f726967696e20746f206d616b65206a756467656d656e74206f6e20612073757370656e646564206d656d6265722e00590120496620612073757370656e646564206d656d62657220697320666f72676976656e2c2077652073696d706c7920616464207468656d206261636b2061732061206d656d6265722c206e6f7420616666656374696e67cc20616e79206f6620746865206578697374696e672073746f72616765206974656d7320666f722074686174206d656d6265722e00490120496620612073757370656e646564206d656d6265722069732072656a65637465642c2072656d6f766520616c6c206173736f6369617465642073746f72616765206974656d732c20696e636c7564696e670101207468656972207061796f7574732c20616e642072656d6f766520616e7920766f7563686564206269647320746865792063757272656e746c7920686176652e00410120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d20746865205f53757370656e73696f6e4a756467656d656e744f726967696e5f2e003020506172616d65746572733ab4202d206077686f60202d205468652073757370656e646564206d656d62657220746f206265206a75646765642e3501202d2060666f726769766560202d204120626f6f6c65616e20726570726573656e74696e672077686574686572207468652073757370656e73696f6e206a756467656d656e74206f726967696e2501202020202020202020202020202020666f726769766573202860747275656029206f722072656a6563747320286066616c7365602920612073757370656e646564206d656d6265722e002c2023203c7765696768743ea4204b65793a204220286c656e206f662062696473292c204d20286c656e206f66206d656d6265727329f8202d204f6e652073746f72616765207265616420746f20636865636b206077686f6020697320612073757370656e646564206d656d6265722e204f2831297101202d20557020746f206f6e652073746f72616765207772697465204f284d292077697468204f286c6f67204d292062696e6172792073656172636820746f206164642061206d656d626572206261636b20746f20736f63696574792ef8202d20557020746f20332073746f726167652072656d6f76616c73204f28312920746f20636c65616e20757020612072656d6f766564206d656d6265722e4501202d20557020746f206f6e652073746f72616765207772697465204f2842292077697468204f2842292073656172636820746f2072656d6f766520766f7563686564206269642066726f6d20626964732ed4202d20557020746f206f6e65206164646974696f6e616c206576656e7420696620756e766f7563682074616b657320706c6163652e70202d204f6e652073746f726167652072656d6f76616c2e204f2831297c202d204f6e65206576656e7420666f7220746865206a756467656d656e742e008820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b204229302023203c2f7765696768743e646a756467655f73757370656e6465645f63616e646964617465080c77686f30543a3a4163636f756e744964246a756467656d656e74244a756467656d656e74a0350120416c6c6f772073757370656e646564206a756467656d656e74206f726967696e20746f206d616b65206a756467656d656e74206f6e20612073757370656e6465642063616e6469646174652e005d0120496620746865206a756467656d656e742069732060417070726f7665602c20776520616464207468656d20746f20736f63696574792061732061206d656d62657220776974682074686520617070726f70726961746574207061796d656e7420666f72206a6f696e696e6720736f63696574792e00550120496620746865206a756467656d656e74206973206052656a656374602c2077652065697468657220736c61736820746865206465706f736974206f6620746865206269642c20676976696e67206974206261636b110120746f2074686520736f63696574792074726561737572792c206f722077652062616e2074686520766f75636865722066726f6d20766f756368696e6720616761696e2e005d0120496620746865206a756467656d656e7420697320605265626964602c20776520707574207468652063616e646964617465206261636b20696e207468652062696420706f6f6c20616e64206c6574207468656d20676f94207468726f7567682074686520696e64756374696f6e2070726f6365737320616761696e2e00410120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d20746865205f53757370656e73696f6e4a756467656d656e744f726967696e5f2e003020506172616d65746572733ac0202d206077686f60202d205468652073757370656e6465642063616e64696461746520746f206265206a75646765642ec4202d20606a756467656d656e7460202d2060417070726f7665602c206052656a656374602c206f7220605265626964602e002c2023203c7765696768743ef4204b65793a204220286c656e206f662062696473292c204d20286c656e206f66206d656d62657273292c2058202862616c616e636520616374696f6e29f0202d204f6e652073746f72616765207265616420746f20636865636b206077686f6020697320612073757370656e6465642063616e6469646174652ec8202d204f6e652073746f726167652072656d6f76616c206f66207468652073757370656e6465642063616e6469646174652e40202d20417070726f7665204c6f676963150120092d204f6e652073746f72616765207265616420746f206765742074686520617661696c61626c6520706f7420746f2070617920757365727320776974682e204f283129dc20092d204f6e652073746f7261676520777269746520746f207570646174652074686520617661696c61626c6520706f742e204f283129e820092d204f6e652073746f72616765207265616420746f20676574207468652063757272656e7420626c6f636b206e756d6265722e204f283129b420092d204f6e652073746f72616765207265616420746f2067657420616c6c206d656d626572732e204f284d29a020092d20557020746f206f6e6520756e726573657276652063757272656e637920616374696f6e2eb020092d20557020746f2074776f206e65772073746f726167652077726974657320746f207061796f7574732e4d0120092d20557020746f206f6e652073746f726167652077726974652077697468204f286c6f67204d292062696e6172792073656172636820746f206164642061206d656d62657220746f20736f63696574792e3c202d2052656a656374204c6f676963dc20092d20557020746f206f6e6520726570617472696174652072657365727665642063757272656e637920616374696f6e2e204f2858292d0120092d20557020746f206f6e652073746f7261676520777269746520746f2062616e2074686520766f756368696e67206d656d6265722066726f6d20766f756368696e6720616761696e2e38202d205265626964204c6f676963410120092d2053746f72616765206d75746174652077697468204f286c6f672042292062696e6172792073656172636820746f20706c616365207468652075736572206261636b20696e746f20626964732ed4202d20557020746f206f6e65206164646974696f6e616c206576656e7420696620756e766f7563682074616b657320706c6163652e5c202d204f6e652073746f726167652072656d6f76616c2e7c202d204f6e65206576656e7420666f7220746865206a756467656d656e742e009820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b2042202b205829302023203c2f7765696768743e3c7365745f6d61785f6d656d62657273040c6d61780c753332381d0120416c6c6f777320726f6f74206f726967696e20746f206368616e676520746865206d6178696d756d206e756d626572206f66206d656d6265727320696e20736f63696574792eb4204d6178206d656d6265727368697020636f756e74206d7573742062652067726561746572207468616e20312e00dc20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d205f524f4f545f2e003020506172616d65746572733ae4202d20606d617860202d20546865206d6178696d756d206e756d626572206f66206d656d6265727320666f722074686520736f63696574792e002c2023203c7765696768743eb0202d204f6e652073746f7261676520777269746520746f2075706461746520746865206d61782e204f28312934202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f283129302023203c2f7765696768743e01401c466f756e64656404244163636f756e74496404e02054686520736f636965747920697320666f756e6465642062792074686520676976656e206964656e746974792e205b666f756e6465725d0c42696408244163636f756e7449641c42616c616e63650861012041206d656d6265727368697020626964206a7573742068617070656e65642e2054686520676976656e206163636f756e74206973207468652063616e646964617465277320494420616e64207468656972206f666665729420697320746865207365636f6e642e205b63616e6469646174655f69642c206f666665725d14566f7563680c244163636f756e7449641c42616c616e6365244163636f756e7449640861012041206d656d6265727368697020626964206a7573742068617070656e656420627920766f756368696e672e2054686520676976656e206163636f756e74206973207468652063616e646964617465277320494420616e647101207468656972206f6666657220697320746865207365636f6e642e2054686520766f756368696e67207061727479206973207468652074686972642e205b63616e6469646174655f69642c206f666665722c20766f756368696e675d244175746f556e62696404244163636f756e7449640411012041205b63616e6469646174655d207761732064726f70706564202864756520746f20616e20657863657373206f66206269647320696e207468652073797374656d292e14556e62696404244163636f756e74496404b82041205b63616e6469646174655d207761732064726f70706564202862792074686569722072657175657374292e1c556e766f75636804244163636f756e7449640401012041205b63616e6469646174655d207761732064726f70706564202862792072657175657374206f662077686f20766f756368656420666f72207468656d292e20496e64756374656408244163636f756e744964385665633c4163636f756e7449643e08590120412067726f7570206f662063616e646964617465732068617665206265656e20696e6475637465642e205468652062617463682773207072696d617279206973207468652066697273742076616c75652c20746865cc20626174636820696e2066756c6c20697320746865207365636f6e642e205b7072696d6172792c2063616e646964617465735d6053757370656e6465644d656d6265724a756467656d656e7408244163636f756e74496410626f6f6c04c820412073757370656e646564206d656d62657220686173206265656e206a75646765642e205b77686f2c206a75646765645d4843616e64696461746553757370656e64656404244163636f756e74496404842041205b63616e6469646174655d20686173206265656e2073757370656e6465643c4d656d62657253757370656e64656404244163636f756e74496404782041205b6d656d6265725d20686173206265656e2073757370656e646564284368616c6c656e67656404244163636f756e744964047c2041205b6d656d6265725d20686173206265656e206368616c6c656e67656410566f74650c244163636f756e744964244163636f756e74496410626f6f6c04c0204120766f746520686173206265656e20706c61636564205b63616e6469646174652c20766f7465722c20766f74655d30446566656e646572566f746508244163636f756e74496410626f6f6c04f0204120766f746520686173206265656e20706c6163656420666f72206120646566656e64696e67206d656d626572205b766f7465722c20766f74655d344e65774d61784d656d62657273040c75333204982041206e6577205b6d61785d206d656d62657220636f756e7420686173206265656e2073657424556e666f756e64656404244163636f756e744964048020536f636965747920697320756e666f756e6465642e205b666f756e6465725d1c4465706f736974041c42616c616e636504f020536f6d652066756e64732077657265206465706f736974656420696e746f2074686520736f6369657479206163636f756e742e205b76616c75655d1c4043616e6469646174654465706f7369743c42616c616e63654f663c542c20493e400080c6a47e8d0300000000000000000004fc20546865206d696e696d756d20616d6f756e74206f662061206465706f73697420726571756972656420666f7220612062696420746f206265206d6164652e4857726f6e6753696465446564756374696f6e3c42616c616e63654f663c542c20493e400080f420e6b5000000000000000000000855012054686520616d6f756e74206f662074686520756e70616964207265776172642074686174206765747320646564756374656420696e207468652063617365207468617420656974686572206120736b6570746963c020646f65736e277420766f7465206f7220736f6d656f6e6520766f74657320696e207468652077726f6e67207761792e284d6178537472696b65730c753332100a00000008750120546865206e756d626572206f662074696d65732061206d656d626572206d617920766f7465207468652077726f6e672077617920286f72206e6f7420617420616c6c2c207768656e207468657920617265206120736b65707469632978206265666f72652074686579206265636f6d652073757370656e6465642e2c506572696f645370656e643c42616c616e63654f663c542c20493e400000c52ebca2b1000000000000000000042d012054686520616d6f756e74206f6620696e63656e7469766520706169642077697468696e206561636820706572696f642e20446f65736e277420696e636c75646520566f7465725469702e38526f746174696f6e506572696f6438543a3a426c6f636b4e756d626572100077010004110120546865206e756d626572206f6620626c6f636b73206265747765656e2063616e6469646174652f6d656d6265727368697020726f746174696f6e20706572696f64732e3c4368616c6c656e6765506572696f6438543a3a426c6f636b4e756d626572108013030004d020546865206e756d626572206f6620626c6f636b73206265747765656e206d656d62657273686970206368616c6c656e6765732e204d6f64756c654964204d6f64756c6549642070792f736f63696504682054686520736f636965746965732773206d6f64756c65206964482c426164506f736974696f6e049020416e20696e636f727265637420706f736974696f6e207761732070726f76696465642e244e6f744d656d62657204582055736572206973206e6f742061206d656d6265722e34416c72656164794d656d6265720468205573657220697320616c72656164792061206d656d6265722e2453757370656e646564044c20557365722069732073757370656e6465642e304e6f7453757370656e646564045c2055736572206973206e6f742073757370656e6465642e204e6f5061796f7574044c204e6f7468696e6720746f207061796f75742e38416c7265616479466f756e646564046420536f636965747920616c726561647920666f756e6465642e3c496e73756666696369656e74506f74049c204e6f7420656e6f75676820696e20706f7420746f206163636570742063616e6469646174652e3c416c7265616479566f756368696e6704e8204d656d62657220697320616c726561647920766f756368696e67206f722062616e6e65642066726f6d20766f756368696e6720616761696e2e2c4e6f74566f756368696e670460204d656d626572206973206e6f7420766f756368696e672e104865616404942043616e6e6f742072656d6f7665207468652068656164206f662074686520636861696e2e1c466f756e646572046c2043616e6e6f742072656d6f76652074686520666f756e6465722e28416c7265616479426964047420557365722068617320616c7265616479206d6164652061206269642e40416c726561647943616e6469646174650474205573657220697320616c726561647920612063616e6469646174652e304e6f7443616e64696461746504642055736572206973206e6f7420612063616e6469646174652e284d61784d656d62657273048420546f6f206d616e79206d656d6265727320696e2074686520736f63696574792e284e6f74466f756e646572047c205468652063616c6c6572206973206e6f742074686520666f756e6465722e1c4e6f74486561640470205468652063616c6c6572206973206e6f742074686520686561642e205265636f7665727901205265636f766572790c2c5265636f76657261626c6500010530543a3a4163636f756e744964e85265636f76657279436f6e6669673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e0004000409012054686520736574206f66207265636f76657261626c65206163636f756e747320616e64207468656972207265636f7665727920636f6e66696775726174696f6e2e404163746976655265636f76657269657300020530543a3a4163636f756e74496430543a3a4163636f756e744964e84163746976655265636f766572793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e050400106820416374697665207265636f7665727920617474656d7074732e001501204669727374206163636f756e7420697320746865206163636f756e7420746f206265207265636f76657265642c20616e6420746865207365636f6e64206163636f756e74ac20697320746865207573657220747279696e6720746f207265636f76657220746865206163636f756e742e1450726f787900010230543a3a4163636f756e74496430543a3a4163636f756e7449640004000c9020546865206c697374206f6620616c6c6f7765642070726f7879206163636f756e74732e00f8204d61702066726f6d2074686520757365722077686f2063616e2061636365737320697420746f20746865207265636f7665726564206163636f756e742e01243061735f7265636f7665726564081c6163636f756e7430543a3a4163636f756e7449641063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e34a42053656e6420612063616c6c207468726f7567682061207265636f7665726564206163636f756e742e00150120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207265676973746572656420746fe82062652061626c6520746f206d616b652063616c6c73206f6e20626568616c66206f6620746865207265636f7665726564206163636f756e742e003020506172616d65746572733a2501202d20606163636f756e74603a20546865207265636f7665726564206163636f756e7420796f752077616e7420746f206d616b6520612063616c6c206f6e2d626568616c662d6f662e0101202d206063616c6c603a205468652063616c6c20796f752077616e7420746f206d616b65207769746820746865207265636f7665726564206163636f756e742e002c2023203c7765696768743e94202d2054686520776569676874206f6620746865206063616c6c60202b2031302c3030302e0901202d204f6e652073746f72616765206c6f6f6b757020746f20636865636b206163636f756e74206973207265636f7665726564206279206077686f602e204f283129302023203c2f7765696768743e347365745f7265636f766572656408106c6f737430543a3a4163636f756e7449641c7265736375657230543a3a4163636f756e744964341d0120416c6c6f7720524f4f5420746f2062797061737320746865207265636f766572792070726f6365737320616e642073657420616e20612072657363756572206163636f756e747420666f722061206c6f7374206163636f756e74206469726563746c792e00c820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f524f4f545f2e003020506172616d65746572733ab8202d20606c6f7374603a2054686520226c6f7374206163636f756e742220746f206265207265636f76657265642e1d01202d206072657363756572603a20546865202272657363756572206163636f756e74222077686963682063616e2063616c6c20617320746865206c6f7374206163636f756e742e002c2023203c7765696768743e64202d204f6e652073746f72616765207772697465204f28312930202d204f6e65206576656e74302023203c2f7765696768743e3c6372656174655f7265636f766572790c1c667269656e6473445665633c543a3a4163636f756e7449643e247468726573686f6c640c7531363064656c61795f706572696f6438543a3a426c6f636b4e756d6265726c5d01204372656174652061207265636f7665727920636f6e66696775726174696f6e20666f7220796f7572206163636f756e742e2054686973206d616b657320796f7572206163636f756e74207265636f76657261626c652e003101205061796d656e743a2060436f6e6669674465706f7369744261736560202b2060467269656e644465706f736974466163746f7260202a20235f6f665f667269656e64732062616c616e636549012077696c6c20626520726573657276656420666f722073746f72696e6720746865207265636f7665727920636f6e66696775726174696f6e2e2054686973206465706f7369742069732072657475726e6564bc20696e2066756c6c207768656e2074686520757365722063616c6c73206072656d6f76655f7265636f76657279602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a2501202d2060667269656e6473603a2041206c697374206f6620667269656e647320796f7520747275737420746f20766f75636820666f72207265636f7665727920617474656d7074732ed420202053686f756c64206265206f72646572656420616e6420636f6e7461696e206e6f206475706c69636174652076616c7565732e3101202d20607468726573686f6c64603a20546865206e756d626572206f6620667269656e64732074686174206d75737420766f75636820666f722061207265636f7665727920617474656d70741d012020206265666f726520746865206163636f756e742063616e206265207265636f76657265642e2053686f756c64206265206c657373207468616e206f7220657175616c20746f94202020746865206c656e677468206f6620746865206c697374206f6620667269656e64732e3d01202d206064656c61795f706572696f64603a20546865206e756d626572206f6620626c6f636b732061667465722061207265636f7665727920617474656d707420697320696e697469616c697a6564e820202074686174206e6565647320746f2070617373206265666f726520746865206163636f756e742063616e206265207265636f76657265642e002c2023203c7765696768743e68202d204b65793a204620286c656e206f6620667269656e6473292d01202d204f6e652073746f72616765207265616420746f20636865636b2074686174206163636f756e74206973206e6f7420616c7265616479207265636f76657261626c652e204f2831292eec202d204120636865636b20746861742074686520667269656e6473206c69737420697320736f7274656420616e6420756e697175652e204f2846299c202d204f6e652063757272656e63792072657365727665206f7065726174696f6e2e204f2858299c202d204f6e652073746f726167652077726974652e204f2831292e20436f646563204f2846292e34202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205829302023203c2f7765696768743e44696e6974696174655f7265636f76657279041c6163636f756e7430543a3a4163636f756e74496458ec20496e697469617465207468652070726f6365737320666f72207265636f766572696e672061207265636f76657261626c65206163636f756e742e001d01205061796d656e743a20605265636f766572794465706f736974602062616c616e63652077696c6c20626520726573657276656420666f7220696e6974696174696e67207468652501207265636f766572792070726f636573732e2054686973206465706f7369742077696c6c20616c7761797320626520726570617472696174656420746f20746865206163636f756e74b820747279696e6720746f206265207265636f76657265642e205365652060636c6f73655f7265636f76657279602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1501202d20606163636f756e74603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f207265636f7665722e2054686973206163636f756e7401012020206e6565647320746f206265207265636f76657261626c652028692e652e20686176652061207265636f7665727920636f6e66696775726174696f6e292e002c2023203c7765696768743ef8202d204f6e652073746f72616765207265616420746f20636865636b2074686174206163636f756e74206973207265636f76657261626c652e204f2846295101202d204f6e652073746f72616765207265616420746f20636865636b20746861742074686973207265636f766572792070726f63657373206861736e277420616c726561647920737461727465642e204f2831299c202d204f6e652063757272656e63792072657365727665206f7065726174696f6e2e204f285829e4202d204f6e652073746f72616765207265616420746f20676574207468652063757272656e7420626c6f636b206e756d6265722e204f2831296c202d204f6e652073746f726167652077726974652e204f2831292e34202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205829302023203c2f7765696768743e38766f7563685f7265636f7665727908106c6f737430543a3a4163636f756e7449641c7265736375657230543a3a4163636f756e74496464290120416c6c6f7720612022667269656e6422206f662061207265636f76657261626c65206163636f756e7420746f20766f75636820666f7220616e20616374697665207265636f76657279682070726f6365737320666f722074686174206163636f756e742e00290120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d75737420626520612022667269656e64227420666f7220746865207265636f76657261626c65206163636f756e742e003020506172616d65746572733ad4202d20606c6f7374603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f207265636f7665722e1101202d206072657363756572603a20546865206163636f756e7420747279696e6720746f2072657363756520746865206c6f7374206163636f756e74207468617420796f755420202077616e7420746f20766f75636820666f722e0025012054686520636f6d62696e6174696f6e206f662074686573652074776f20706172616d6574657273206d75737420706f696e7420746f20616e20616374697665207265636f76657279242070726f636573732e002c2023203c7765696768743efc204b65793a204620286c656e206f6620667269656e647320696e20636f6e666967292c205620286c656e206f6620766f756368696e6720667269656e6473291d01202d204f6e652073746f72616765207265616420746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f2846292101202d204f6e652073746f72616765207265616420746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629ec202d204f6e652062696e6172792073656172636820746f20636f6e6669726d2063616c6c6572206973206120667269656e642e204f286c6f6746291d01202d204f6e652062696e6172792073656172636820746f20636f6e6669726d2063616c6c657220686173206e6f7420616c726561647920766f75636865642e204f286c6f6756299c202d204f6e652073746f726167652077726974652e204f2831292c20436f646563204f2856292e34202d204f6e65206576656e742e00a420546f74616c20436f6d706c65786974793a204f2846202b206c6f6746202b2056202b206c6f675629302023203c2f7765696768743e38636c61696d5f7265636f76657279041c6163636f756e7430543a3a4163636f756e74496450f420416c6c6f772061207375636365737366756c207265736375657220746f20636c61696d207468656972207265636f7665726564206163636f756e742e002d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061202272657363756572221d012077686f20686173207375636365737366756c6c7920636f6d706c6574656420746865206163636f756e74207265636f766572792070726f636573733a20636f6c6c6563746564310120607468726573686f6c6460206f72206d6f726520766f75636865732c20776169746564206064656c61795f706572696f646020626c6f636b732073696e636520696e6974696174696f6e2e003020506172616d65746572733a2d01202d20606163636f756e74603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f20636c61696d20686173206265656e207375636365737366756c6c79502020207265636f766572656420627920796f752e002c2023203c7765696768743efc204b65793a204620286c656e206f6620667269656e647320696e20636f6e666967292c205620286c656e206f6620766f756368696e6720667269656e6473291d01202d204f6e652073746f72616765207265616420746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f2846292101202d204f6e652073746f72616765207265616420746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629e4202d204f6e652073746f72616765207265616420746f20676574207468652063757272656e7420626c6f636b206e756d6265722e204f2831299c202d204f6e652073746f726167652077726974652e204f2831292c20436f646563204f2856292e34202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205629302023203c2f7765696768743e38636c6f73655f7265636f76657279041c7265736375657230543a3a4163636f756e7449645015012041732074686520636f6e74726f6c6c6572206f662061207265636f76657261626c65206163636f756e742c20636c6f736520616e20616374697665207265636f76657279682070726f6365737320666f7220796f7572206163636f756e742e002101205061796d656e743a2042792063616c6c696e6720746869732066756e6374696f6e2c20746865207265636f76657261626c65206163636f756e742077696c6c2072656365697665f820746865207265636f76657279206465706f73697420605265636f766572794465706f7369746020706c616365642062792074686520726573637565722e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061f0207265636f76657261626c65206163636f756e74207769746820616e20616374697665207265636f766572792070726f6365737320666f722069742e003020506172616d65746572733a1101202d206072657363756572603a20546865206163636f756e7420747279696e6720746f207265736375652074686973207265636f76657261626c65206163636f756e742e002c2023203c7765696768743e84204b65793a205620286c656e206f6620766f756368696e6720667269656e6473293d01202d204f6e652073746f7261676520726561642f72656d6f766520746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629c0202d204f6e652062616c616e63652063616c6c20746f20726570617472696174652072657365727665642e204f28582934202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2856202b205829302023203c2f7765696768743e3c72656d6f76655f7265636f7665727900545d012052656d6f766520746865207265636f766572792070726f6365737320666f7220796f7572206163636f756e742e205265636f7665726564206163636f756e747320617265207374696c6c2061636365737369626c652e001501204e4f54453a205468652075736572206d757374206d616b65207375726520746f2063616c6c2060636c6f73655f7265636f7665727960206f6e20616c6c206163746976650901207265636f7665727920617474656d707473206265666f72652063616c6c696e6720746869732066756e6374696f6e20656c73652069742077696c6c206661696c2e002501205061796d656e743a2042792063616c6c696e6720746869732066756e6374696f6e20746865207265636f76657261626c65206163636f756e742077696c6c20756e7265736572766598207468656972207265636f7665727920636f6e66696775726174696f6e206465706f7369742ef4202860436f6e6669674465706f7369744261736560202b2060467269656e644465706f736974466163746f7260202a20235f6f665f667269656e64732900050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061e4207265636f76657261626c65206163636f756e742028692e652e206861732061207265636f7665727920636f6e66696775726174696f6e292e002c2023203c7765696768743e60204b65793a204620286c656e206f6620667269656e6473292901202d204f6e652073746f72616765207265616420746f206765742074686520707265666978206974657261746f7220666f7220616374697665207265636f7665726965732e204f2831293901202d204f6e652073746f7261676520726561642f72656d6f766520746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f2846299c202d204f6e652062616c616e63652063616c6c20746f20756e72657365727665642e204f28582934202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205829302023203c2f7765696768743e4063616e63656c5f7265636f7665726564041c6163636f756e7430543a3a4163636f756e7449642ce02043616e63656c20746865206162696c69747920746f20757365206061735f7265636f76657265646020666f7220606163636f756e74602e00150120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207265676973746572656420746fe82062652061626c6520746f206d616b652063616c6c73206f6e20626568616c66206f6620746865207265636f7665726564206163636f756e742e003020506172616d65746572733a1901202d20606163636f756e74603a20546865207265636f7665726564206163636f756e7420796f75206172652061626c6520746f2063616c6c206f6e2d626568616c662d6f662e002c2023203c7765696768743e1101202d204f6e652073746f72616765206d75746174696f6e20746f20636865636b206163636f756e74206973207265636f7665726564206279206077686f602e204f283129302023203c2f7765696768743e01183c5265636f766572794372656174656404244163636f756e74496404d42041207265636f766572792070726f6365737320686173206265656e2073657420757020666f7220616e205b6163636f756e745d2e445265636f76657279496e6974696174656408244163636f756e744964244163636f756e744964082d012041207265636f766572792070726f6365737320686173206265656e20696e6974696174656420666f72206c6f7374206163636f756e742062792072657363756572206163636f756e742e40205b6c6f73742c20726573637565725d3c5265636f76657279566f75636865640c244163636f756e744964244163636f756e744964244163636f756e744964085d012041207265636f766572792070726f6365737320666f72206c6f7374206163636f756e742062792072657363756572206163636f756e7420686173206265656e20766f756368656420666f722062792073656e6465722e60205b6c6f73742c20726573637565722c2073656e6465725d385265636f76657279436c6f73656408244163636f756e744964244163636f756e7449640821012041207265636f766572792070726f6365737320666f72206c6f7374206163636f756e742062792072657363756572206163636f756e7420686173206265656e20636c6f7365642e40205b6c6f73742c20726573637565725d404163636f756e745265636f766572656408244163636f756e744964244163636f756e744964080501204c6f7374206163636f756e7420686173206265656e207375636365737366756c6c79207265636f76657265642062792072657363756572206163636f756e742e40205b6c6f73742c20726573637565725d3c5265636f7665727952656d6f76656404244163636f756e74496404d82041207265636f766572792070726f6365737320686173206265656e2072656d6f76656420666f7220616e205b6163636f756e745d2e1044436f6e6669674465706f736974426173653042616c616e63654f663c543e4000406352bfc60100000000000000000004550120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e672061207265636f7665727920636f6e66696775726174696f6e2e4c467269656e644465706f736974466163746f723042616c616e63654f663c543e4000203d88792d000000000000000000000469012054686520616d6f756e74206f662063757272656e6379206e656564656420706572206164646974696f6e616c2075736572207768656e206372656174696e672061207265636f7665727920636f6e66696775726174696f6e2e284d6178467269656e64730c753136080900040d0120546865206d6178696d756d20616d6f756e74206f6620667269656e647320616c6c6f77656420696e2061207265636f7665727920636f6e66696775726174696f6e2e3c5265636f766572794465706f7369743042616c616e63654f663c543e4000406352bfc601000000000000000000041d0120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72207374617274696e672061207265636f766572792e40284e6f74416c6c6f77656404f42055736572206973206e6f7420616c6c6f77656420746f206d616b6520612063616c6c206f6e20626568616c66206f662074686973206163636f756e74345a65726f5468726573686f6c640490205468726573686f6c64206d7573742062652067726561746572207468616e207a65726f404e6f74456e6f756768467269656e647304d420467269656e6473206c697374206d7573742062652067726561746572207468616e207a65726f20616e64207468726573686f6c64284d6178467269656e647304ac20467269656e6473206c697374206d757374206265206c657373207468616e206d617820667269656e6473244e6f74536f7274656404cc20467269656e6473206c697374206d75737420626520736f7274656420616e642066726565206f66206475706c696361746573384e6f745265636f76657261626c6504a02054686973206163636f756e74206973206e6f742073657420757020666f72207265636f7665727948416c72656164795265636f76657261626c6504b02054686973206163636f756e7420697320616c72656164792073657420757020666f72207265636f7665727938416c72656164795374617274656404e02041207265636f766572792070726f636573732068617320616c7265616479207374617274656420666f722074686973206163636f756e74284e6f745374617274656404d02041207265636f766572792070726f6365737320686173206e6f74207374617274656420666f7220746869732072657363756572244e6f74467269656e6404ac2054686973206163636f756e74206973206e6f74206120667269656e642077686f2063616e20766f7563682c44656c6179506572696f64041d012054686520667269656e64206d757374207761697420756e74696c207468652064656c617920706572696f6420746f20766f75636820666f722074686973207265636f7665727938416c7265616479566f756368656404c0205468697320757365722068617320616c726561647920766f756368656420666f722074686973207265636f76657279245468726573686f6c6404ec20546865207468726573686f6c6420666f72207265636f766572696e672074686973206163636f756e7420686173206e6f74206265656e206d65742c5374696c6c41637469766504010120546865726520617265207374696c6c20616374697665207265636f7665727920617474656d7074732074686174206e65656420746f20626520636c6f736564204f766572666c6f77049c2054686572652077617320616e206f766572666c6f7720696e20612063616c63756c6174696f6e30416c726561647950726f787904b02054686973206163636f756e7420697320616c72656164792073657420757020666f72207265636f766572791c56657374696e67011c56657374696e67041c56657374696e6700010230543a3a4163636f756e744964a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e00040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e011010766573740044bc20556e6c6f636b20616e79207665737465642066756e6473206f66207468652073656e646572206163636f756e742e00610120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652066756e6473207374696c6c68206c6f636b656420756e6465722074686973206d6f64756c652e00d420456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20322052656164732c203220577269746573fc20202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745d010120202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745d34202d2042656e63686d61726b3aec20202020202d20556e6c6f636b65643a2034382e3736202b202e303438202a206c20c2b57320286d696e2073717561726520616e616c7973697329e420202020202d204c6f636b65643a2034342e3433202b202e323834202a206c20c2b57320286d696e2073717561726520616e616c7973697329ad01202d205573696e6720353020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e28766573745f6f7468657204187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654cbc20556e6c6f636b20616e79207665737465642066756e6473206f662061206074617267657460206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005501202d2060746172676574603a20546865206163636f756e742077686f7365207665737465642066756e64732073686f756c6420626520756e6c6f636b65642e204d75737420686176652066756e6473207374696c6c68206c6f636b656420756e6465722074686973206d6f64756c652e00d420456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20332052656164732c203320577269746573f420202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e74f820202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e7434202d2042656e63686d61726b3ae820202020202d20556e6c6f636b65643a2034342e33202b202e323934202a206c20c2b57320286d696e2073717561726520616e616c7973697329e420202020202d204c6f636b65643a2034382e3136202b202e313033202a206c20c2b57320286d696e2073717561726520616e616c7973697329ad01202d205573696e6720353020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e3c7665737465645f7472616e7366657208187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365207363686564756c65a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e486820437265617465206120766573746564207472616e736665722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e001501202d2060746172676574603a20546865206163636f756e7420746861742073686f756c64206265207472616e7366657272656420746865207665737465642066756e64732e0101202d2060616d6f756e74603a2054686520616d6f756e74206f662066756e647320746f207472616e7366657220616e642077696c6c206265207665737465642ef4202d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e006020456d697473206056657374696e6743726561746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20332052656164732c2033205772697465733d0120202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745d410120202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745de0202d2042656e63686d61726b3a203130302e33202b202e333635202a206c20c2b57320286d696e2073717561726520616e616c7973697329b101202d205573696e672031303020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e54666f7263655f7665737465645f7472616e736665720c18736f757263658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365207363686564756c65a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e4c6420466f726365206120766573746564207472616e736665722e00c820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e00ec202d2060736f75726365603a20546865206163636f756e742077686f73652066756e64732073686f756c64206265207472616e736665727265642e1501202d2060746172676574603a20546865206163636f756e7420746861742073686f756c64206265207472616e7366657272656420746865207665737465642066756e64732e0101202d2060616d6f756e74603a2054686520616d6f756e74206f662066756e647320746f207472616e7366657220616e642077696c6c206265207665737465642ef4202d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e006020456d697473206056657374696e6743726561746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20342052656164732c203420577269746573350120202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e74390120202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e74e0202d2042656e63686d61726b3a203130302e33202b202e333635202a206c20c2b57320286d696e2073717561726520616e616c7973697329b101202d205573696e672031303020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e01083856657374696e675570646174656408244163636f756e7449641c42616c616e63650c59012054686520616d6f756e742076657374656420686173206265656e20757064617465642e205468697320636f756c6420696e646963617465206d6f72652066756e64732061726520617661696c61626c652e205468651d012062616c616e636520676976656e2069732074686520616d6f756e74207768696368206973206c65667420756e7665737465642028616e642074687573206c6f636b6564292e2050205b6163636f756e742c20756e7665737465645d4056657374696e67436f6d706c6574656404244163636f756e74496404150120416e205b6163636f756e745d20686173206265636f6d652066756c6c79207665737465642e204e6f20667572746865722076657374696e672063616e2068617070656e2e04444d696e5665737465645472616e736665723042616c616e63654f663c543e400000c16ff28623000000000000000000041d0120546865206d696e696d756d20616d6f756e7420746f206265207472616e7366657272656420746f206372656174652061206e65772076657374696e67207363686564756c652e0c284e6f7456657374696e67048820546865206163636f756e7420676976656e206973206e6f742076657374696e672e5c4578697374696e6756657374696e675363686564756c65045d0120416e206578697374696e672076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e7420746861742063616e6e6f7420626520636c6f6262657265642e24416d6f756e744c6f7704090120416d6f756e74206265696e67207472616e7366657272656420697320746f6f206c6f7720746f2063726561746520612076657374696e67207363686564756c652e245363686564756c657201245363686564756c65720c184167656e646101010538543a3a426c6f636b4e756d6265726d015665633c4f7074696f6e3c5363686564756c65643c3c542061732054726169743e3a3a43616c6c2c20543a3a426c6f636b4e756d6265722c20543a3a0a50616c6c6574734f726967696e2c20543a3a4163636f756e7449643e3e3e000400044d01204974656d7320746f2062652065786563757465642c20696e64657865642062792074686520626c6f636b206e756d626572207468617420746865792073686f756c64206265206578656375746564206f6e2e184c6f6f6b75700001051c5665633c75383e6c5461736b416464726573733c543a3a426c6f636b4e756d6265723e000400040101204c6f6f6b75702066726f6d206964656e7469747920746f2074686520626c6f636b206e756d62657220616e6420696e646578206f6620746865207461736b2e3853746f7261676556657273696f6e01002052656c656173657304000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e0098204e6577206e6574776f726b732073746172742077697468206c6173742076657273696f6e2e0118207363686564756c6510107768656e38543a3a426c6f636b4e756d626572386d617962655f706572696f646963a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e207072696f72697479487363686564756c653a3a5072696f726974791063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e287420416e6f6e796d6f75736c79207363686564756c652061207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c7390202d2042617365205765696768743a2032322e3239202b202e313236202a205320c2b57334202d204442205765696768743a4c20202020202d20526561643a204167656e64615020202020202d2057726974653a204167656e64613d01202d2057696c6c20757365206261736520776569676874206f662032352077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c73302023203c2f7765696768743e1863616e63656c08107768656e38543a3a426c6f636b4e756d62657214696e6465780c75333228982043616e63656c20616e20616e6f6e796d6f75736c79207363686564756c6564207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c7394202d2042617365205765696768743a2032322e3135202b20322e383639202a205320c2b57334202d204442205765696768743a4c20202020202d20526561643a204167656e64617020202020202d2057726974653a204167656e64612c204c6f6f6b75704101202d2057696c6c20757365206261736520776569676874206f66203130302077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c73302023203c2f7765696768743e387363686564756c655f6e616d6564140869641c5665633c75383e107768656e38543a3a426c6f636b4e756d626572386d617962655f706572696f646963a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e207072696f72697479487363686564756c653a3a5072696f726974791063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e285c205363686564756c652061206e616d6564207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c738c202d2042617365205765696768743a2032392e36202b202e313539202a205320c2b57334202d204442205765696768743a6c20202020202d20526561643a204167656e64612c204c6f6f6b75707020202020202d2057726974653a204167656e64612c204c6f6f6b75704d01202d2057696c6c20757365206261736520776569676874206f662033352077686963682073686f756c6420626520676f6f6420666f72206d6f7265207468616e203330207363686564756c65642063616c6c73302023203c2f7765696768743e3063616e63656c5f6e616d6564040869641c5665633c75383e287c2043616e63656c2061206e616d6564207363686564756c6564207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c7394202d2042617365205765696768743a2032342e3931202b20322e393037202a205320c2b57334202d204442205765696768743a6c20202020202d20526561643a204167656e64612c204c6f6f6b75707020202020202d2057726974653a204167656e64612c204c6f6f6b75704101202d2057696c6c20757365206261736520776569676874206f66203130302077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c73302023203c2f7765696768743e387363686564756c655f61667465721014616674657238543a3a426c6f636b4e756d626572386d617962655f706572696f646963a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e207072696f72697479487363686564756c653a3a5072696f726974791063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e14ac20416e6f6e796d6f75736c79207363686564756c652061207461736b20616674657220612064656c61792e002c2023203c7765696768743e582053616d65206173205b607363686564756c65605d2e302023203c2f7765696768743e507363686564756c655f6e616d65645f6166746572140869641c5665633c75383e14616674657238543a3a426c6f636b4e756d626572386d617962655f706572696f646963a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e207072696f72697479487363686564756c653a3a5072696f726974791063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e1494205363686564756c652061206e616d6564207461736b20616674657220612064656c61792e002c2023203c7765696768743e702053616d65206173205b607363686564756c655f6e616d6564605d2e302023203c2f7765696768743e010c245363686564756c6564082c426c6f636b4e756d6265720c753332048c205363686564756c656420736f6d65207461736b2e205b7768656e2c20696e6465785d2043616e63656c6564082c426c6f636b4e756d6265720c75333204882043616e63656c656420736f6d65207461736b2e205b7768656e2c20696e6465785d28446973706174636865640c605461736b416464726573733c426c6f636b4e756d6265723e3c4f7074696f6e3c5665633c75383e3e384469737061746368526573756c7404a4204469737061746368656420736f6d65207461736b2e205b7461736b2c2069642c20726573756c745d000c404661696c6564546f5363686564756c650468204661696c656420746f207363686564756c6520612063616c6c384661696c6564546f43616e63656c0488204661696c656420746f2063616e63656c2061207363686564756c65642063616c6c5c546172676574426c6f636b4e756d626572496e5061737404a820476976656e2074617267657420626c6f636b206e756d62657220697320696e2074686520706173742e1450726f7879011450726f7879081c50726f7869657301010530543a3a4163636f756e7449644501285665633c50726f7879446566696e6974696f6e3c543a3a4163636f756e7449642c20543a3a50726f7879547970652c20543a3a426c6f636b4e756d6265723e3e2c0a2042616c616e63654f663c543e29004400000000000000000000000000000000000845012054686520736574206f66206163636f756e742070726f786965732e204d61707320746865206163636f756e74207768696368206861732064656c65676174656420746f20746865206163636f756e7473210120776869636820617265206265696e672064656c65676174656420746f2c20746f67657468657220776974682074686520616d6f756e742068656c64206f6e206465706f7369742e34416e6e6f756e63656d656e747301010530543a3a4163636f756e7449643d01285665633c416e6e6f756e63656d656e743c543a3a4163636f756e7449642c2043616c6c486173684f663c543e2c20543a3a426c6f636b4e756d6265723e3e2c0a2042616c616e63654f663c543e290044000000000000000000000000000000000004ac2054686520616e6e6f756e63656d656e7473206d616465206279207468652070726f787920286b6579292e01281470726f78790c107265616c30543a3a4163636f756e74496440666f7263655f70726f78795f74797065504f7074696f6e3c543a3a50726f7879547970653e1063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e3c51012044697370617463682074686520676976656e206063616c6c602066726f6d20616e206163636f756e742074686174207468652073656e64657220697320617574686f726973656420666f72207468726f7567683420606164645f70726f7879602e00ac2052656d6f76657320616e7920636f72726573706f6e64696e6720616e6e6f756e63656d656e742873292e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1101202d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e6501202d2060666f7263655f70726f78795f74797065603a2053706563696679207468652065786163742070726f7879207479706520746f206265207573656420616e6420636865636b656420666f7220746869732063616c6c2ed4202d206063616c6c603a205468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002c2023203c7765696768743e01012057656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e302023203c2f7765696768743e246164645f70726f78790c2064656c656761746530543a3a4163636f756e7449642870726f78795f7479706530543a3a50726f7879547970651464656c617938543a3a426c6f636b4e756d6265722c490120526567697374657220612070726f7879206163636f756e7420666f72207468652073656e64657220746861742069732061626c6520746f206d616b652063616c6c73206f6e2069747320626568616c662e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1501202d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f206d616b6520612070726f78792e0101202d206070726f78795f74797065603a20546865207065726d697373696f6e7320616c6c6f77656420666f7220746869732070726f7879206163636f756e742e002c2023203c7765696768743e01012057656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e302023203c2f7765696768743e3072656d6f76655f70726f78790c2064656c656761746530543a3a4163636f756e7449642870726f78795f7479706530543a3a50726f7879547970651464656c617938543a3a426c6f636b4e756d6265722cac20556e726567697374657220612070726f7879206163636f756e7420666f72207468652073656e6465722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a2901202d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f2072656d6f766520617320612070726f78792e4501202d206070726f78795f74797065603a20546865207065726d697373696f6e732063757272656e746c7920656e61626c656420666f72207468652072656d6f7665642070726f7879206163636f756e742e002c2023203c7765696768743e01012057656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e302023203c2f7765696768743e3872656d6f76655f70726f786965730028b820556e726567697374657220616c6c2070726f7879206163636f756e747320666f72207468652073656e6465722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901205741524e494e473a2054686973206d61792062652063616c6c6564206f6e206163636f756e747320637265617465642062792060616e6f6e796d6f7573602c20686f776576657220696620646f6e652c207468656e5d012074686520756e726573657276656420666565732077696c6c20626520696e61636365737369626c652e202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a002c2023203c7765696768743e01012057656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e302023203c2f7765696768743e24616e6f6e796d6f75730c2870726f78795f7479706530543a3a50726f7879547970651464656c617938543a3a426c6f636b4e756d62657214696e6465780c7531365c3d0120537061776e2061206672657368206e6577206163636f756e7420746861742069732067756172616e7465656420746f206265206f746865727769736520696e61636365737369626c652c20616e64010120696e697469616c697a65206974207769746820612070726f7879206f66206070726f78795f747970656020666f7220606f726967696e602073656e6465722e0070205265717569726573206120605369676e656460206f726967696e2e005501202d206070726f78795f74797065603a205468652074797065206f66207468652070726f78792074686174207468652073656e6465722077696c6c2062652072656769737465726564206173206f766572207468655101206e6577206163636f756e742e20546869732077696c6c20616c6d6f737420616c7761797320626520746865206d6f7374207065726d697373697665206050726f7879547970656020706f737369626c6520746f7c20616c6c6f7720666f72206d6178696d756d20666c65786962696c6974792e5501202d2060696e646578603a204120646973616d626967756174696f6e20696e6465782c20696e206361736520746869732069732063616c6c6564206d756c7469706c652074696d657320696e207468652073616d656101207472616e73616374696f6e2028652e672e207769746820607574696c6974793a3a626174636860292e20556e6c65737320796f75277265207573696e67206062617463686020796f752070726f6261626c79206a757374442077616e7420746f20757365206030602e5101202d206064656c6179603a2054686520616e6e6f756e63656d656e7420706572696f64207265717569726564206f662074686520696e697469616c2070726f78792e2057696c6c2067656e6572616c6c7920626518207a65726f2e005501204661696c73207769746820604475706c69636174656020696620746869732068617320616c7265616479206265656e2063616c6c656420696e2074686973207472616e73616374696f6e2c2066726f6d207468659c2073616d652073656e6465722c2077697468207468652073616d6520706172616d65746572732e00e8204661696c732069662074686572652061726520696e73756666696369656e742066756e647320746f2070617920666f72206465706f7369742e002c2023203c7765696768743e01012057656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e302023203c2f7765696768743e9020544f444f3a204d69676874206265206f76657220636f756e74696e6720312072656164386b696c6c5f616e6f6e796d6f7573141c737061776e657230543a3a4163636f756e7449642870726f78795f7479706530543a3a50726f78795479706514696e6465780c753136186865696768745c436f6d706163743c543a3a426c6f636b4e756d6265723e246578745f696e64657830436f6d706163743c7533323e50b82052656d6f76657320612070726576696f75736c7920737061776e656420616e6f6e796d6f75732070726f78792e004d01205741524e494e473a202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a20416e792066756e64732068656c6420696e2069742077696c6c2062653820696e61636365737369626c652e005d01205265717569726573206120605369676e656460206f726967696e2c20616e64207468652073656e646572206163636f756e74206d7573742068617665206265656e206372656174656420627920612063616c6c20746fac2060616e6f6e796d6f757360207769746820636f72726573706f6e64696e6720706172616d65746572732e005101202d2060737061776e6572603a20546865206163636f756e742074686174206f726967696e616c6c792063616c6c65642060616e6f6e796d6f75736020746f206372656174652074686973206163636f756e742e5101202d2060696e646578603a2054686520646973616d626967756174696f6e20696e646578206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e2050726f6261626c79206030602e0501202d206070726f78795f74797065603a205468652070726f78792074797065206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e4101202d2060686569676874603a2054686520686569676874206f662074686520636861696e207768656e207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e4d01202d20606578745f696e646578603a205468652065787472696e73696320696e64657820696e207768696368207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e004d01204661696c73207769746820604e6f5065726d697373696f6e6020696e2063617365207468652063616c6c6572206973206e6f7420612070726576696f75736c79206372656174656420616e6f6e796d6f7573f4206163636f756e742077686f73652060616e6f6e796d6f7573602063616c6c2068617320636f72726573706f6e64696e6720706172616d65746572732e002c2023203c7765696768743e01012057656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e302023203c2f7765696768743e20616e6e6f756e636508107265616c30543a3a4163636f756e7449642463616c6c5f686173683443616c6c486173684f663c543e540901205075626c697368207468652068617368206f6620612070726f78792d63616c6c20746861742077696c6c206265206d61646520696e20746865206675747572652e0061012054686973206d7573742062652063616c6c656420736f6d65206e756d626572206f6620626c6f636b73206265666f72652074686520636f72726573706f6e64696e67206070726f78796020697320617474656d707465642901206966207468652064656c6179206173736f6369617465642077697468207468652070726f78792072656c6174696f6e736869702069732067726561746572207468616e207a65726f2e001501204e6f206d6f7265207468616e20604d617850656e64696e676020616e6e6f756e63656d656e7473206d6179206265206d61646520617420616e79206f6e652074696d652e000d0120546869732077696c6c2074616b652061206465706f736974206f662060416e6e6f756e63656d656e744465706f736974466163746f72602061732077656c6c2061731d012060416e6e6f756e63656d656e744465706f736974426173656020696620746865726520617265206e6f206f746865722070656e64696e6720616e6e6f756e63656d656e74732e00290120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420612070726f7879206f6620607265616c602e003020506172616d65746572733a1101202d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e1901202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002c2023203c7765696768743e642057656967687420697320612066756e6374696f6e206f663a9c202d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea4202d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e302023203c2f7765696768743e4c72656d6f76655f616e6e6f756e63656d656e7408107265616c30543a3a4163636f756e7449642463616c6c5f686173683443616c6c486173684f663c543e40742052656d6f7665206120676976656e20616e6e6f756e63656d656e742e005d01204d61792062652063616c6c656420627920612070726f7879206163636f756e7420746f2072656d6f766520612063616c6c20746865792070726576696f75736c7920616e6e6f756e63656420616e642072657475726e3420746865206465706f7369742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1101202d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e1901202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002c2023203c7765696768743e642057656967687420697320612066756e6374696f6e206f663a9c202d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea4202d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e302023203c2f7765696768743e4c72656a6563745f616e6e6f756e63656d656e74082064656c656761746530543a3a4163636f756e7449642463616c6c5f686173683443616c6c486173684f663c543e40b42052656d6f76652074686520676976656e20616e6e6f756e63656d656e74206f6620612064656c65676174652e006501204d61792062652063616c6c6564206279206120746172676574202870726f7869656429206163636f756e7420746f2072656d6f766520612063616c6c2074686174206f6e65206f662074686569722064656c656761746573290120286064656c656761746560292068617320616e6e6f756e63656420746865792077616e7420746f20657865637574652e20546865206465706f7369742069732072657475726e65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733af8202d206064656c6567617465603a20546865206163636f756e7420746861742070726576696f75736c7920616e6e6f756e636564207468652063616c6c2ec0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f206265206d6164652e002c2023203c7765696768743e642057656967687420697320612066756e6374696f6e206f663a9c202d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea4202d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e302023203c2f7765696768743e3c70726f78795f616e6e6f756e636564102064656c656761746530543a3a4163636f756e744964107265616c30543a3a4163636f756e74496440666f7263655f70726f78795f74797065504f7074696f6e3c543a3a50726f7879547970653e1063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e4451012044697370617463682074686520676976656e206063616c6c602066726f6d20616e206163636f756e742074686174207468652073656e64657220697320617574686f726973656420666f72207468726f7567683420606164645f70726f7879602e00ac2052656d6f76657320616e7920636f72726573706f6e64696e6720616e6e6f756e63656d656e742873292e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1101202d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e6501202d2060666f7263655f70726f78795f74797065603a2053706563696679207468652065786163742070726f7879207479706520746f206265207573656420616e6420636865636b656420666f7220746869732063616c6c2ed4202d206063616c6c603a205468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002c2023203c7765696768743e642057656967687420697320612066756e6374696f6e206f663a9c202d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea4202d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e302023203c2f7765696768743e010c3450726f7879457865637574656404384469737061746368526573756c7404e420412070726f78792077617320657865637574656420636f72726563746c792c20776974682074686520676976656e205b726573756c745d2e40416e6f6e796d6f75734372656174656410244163636f756e744964244163636f756e7449642450726f7879547970650c75313608ec20416e6f6e796d6f7573206163636f756e7420686173206265656e2063726561746564206279206e65772070726f7879207769746820676976656e610120646973616d626967756174696f6e20696e64657820616e642070726f787920747970652e205b616e6f6e796d6f75732c2077686f2c2070726f78795f747970652c20646973616d626967756174696f6e5f696e6465785d24416e6e6f756e6365640c244163636f756e744964244163636f756e744964104861736804490120416e20616e6e6f756e63656d656e742077617320706c6163656420746f206d616b6520612063616c6c20696e20746865206675747572652e205b7265616c2c2070726f78792c2063616c6c5f686173685d184050726f78794465706f736974426173653042616c616e63654f663c543e4000f09e544c390000000000000000000004110120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e6720612070726f78792e4850726f78794465706f736974466163746f723042616c616e63654f663c543e400060aa7714b40000000000000000000004bc2054686520616d6f756e74206f662063757272656e6379206e6565646564207065722070726f78792061646465642e284d617850726f786965730c75313608200004f020546865206d6178696d756d20616d6f756e74206f662070726f7869657320616c6c6f77656420666f7220612073696e676c65206163636f756e742e284d617850656e64696e670c7533321020000000047820604d617850656e64696e6760206d6574616461746120736861646f772e5c416e6e6f756e63656d656e744465706f736974426173653042616c616e63654f663c543e4000f09e544c390000000000000000000004ac2060416e6e6f756e63656d656e744465706f7369744261736560206d6574616461746120736861646f772e64416e6e6f756e63656d656e744465706f736974466163746f723042616c616e63654f663c543e4000c054ef28680100000000000000000004b42060416e6e6f756e63656d656e744465706f736974466163746f7260206d6574616461746120736861646f772e1c1c546f6f4d616e790425012054686572652061726520746f6f206d616e792070726f786965732072656769737465726564206f7220746f6f206d616e7920616e6e6f756e63656d656e74732070656e64696e672e204e6f74466f756e6404782050726f787920726567697374726174696f6e206e6f7420666f756e642e204e6f7450726f787904d02053656e646572206973206e6f7420612070726f7879206f6620746865206163636f756e7420746f2062652070726f786965642e2c556e70726f787961626c6504250120412063616c6c20776869636820697320696e636f6d70617469626c652077697468207468652070726f7879207479706527732066696c7465722077617320617474656d707465642e244475706c69636174650470204163636f756e7420697320616c726561647920612070726f78792e304e6f5065726d697373696f6e0419012043616c6c206d6179206e6f74206265206d6164652062792070726f78792062656361757365206974206d617920657363616c617465206974732070726976696c656765732e2c556e616e6e6f756e63656404d420416e6e6f756e63656d656e742c206966206d61646520617420616c6c2c20776173206d61646520746f6f20726563656e746c792e204d756c746973696701204d756c746973696708244d756c74697369677300020530543a3a4163636f756e744964205b75383b2033325dd04d756c74697369673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e02040004942054686520736574206f66206f70656e206d756c7469736967206f7065726174696f6e732e1443616c6c73000106205b75383b2033325da0284f706171756543616c6c2c20543a3a4163636f756e7449642c2042616c616e63654f663c543e290004000001105061735f6d756c74695f7468726573686f6c645f3108446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e1063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e44550120496d6d6564696174656c792064697370617463682061206d756c74692d7369676e61747572652063616c6c207573696e6720612073696e676c6520617070726f76616c2066726f6d207468652063616c6c65722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e004101202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f206172652070617274206f66207468650501206d756c74692d7369676e61747572652c2062757420646f206e6f7420706172746963697061746520696e2074686520617070726f76616c2070726f636573732e8c202d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e00bc20526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c742e002c2023203c7765696768743e1d01204f285a202b204329207768657265205a20697320746865206c656e677468206f66207468652063616c6c20616e6420432069747320657865637574696f6e207765696768742e80202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d94202d2042617365205765696768743a2033332e3732202b20302e303032202a205a20c2b57348202d204442205765696768743a204e6f6e654c202d20506c75732043616c6c20576569676874302023203c2f7765696768743e2061735f6d756c746918247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e1063616c6c284f706171756543616c6c2873746f72655f63616c6c10626f6f6c286d61785f77656967687418576569676874cc590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e00b42049662074686572652061726520656e6f7567682c207468656e206469737061746368207468652063616c6c2e003101205061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573410120607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2e8c202d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e002101204e4f54453a20556e6c6573732074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2067656e6572616c6c792077616e7420746f207573651d012060617070726f76655f61735f6d756c74696020696e73746561642c2073696e6365206974206f6e6c7920726571756972657320612068617368206f66207468652063616c6c2e005d0120526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c7420696620607468726573686f6c64602069732065786163746c79206031602e204f74686572776973655901206f6e20737563636573732c20726573756c7420697320604f6b6020616e642074686520726573756c742066726f6d2074686520696e746572696f722063616c6c2c206966206974207761732065786563757465642ce0206d617920626520666f756e6420696e20746865206465706f736974656420604d756c7469736967457865637574656460206576656e742e002c2023203c7765696768743e54202d20604f2853202b205a202b2043616c6c29602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2e2501202d204f6e652063616c6c20656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285a296020776865726520605a602069732074782d6c656e2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e70202d2054686520776569676874206f6620746865206063616c6c602e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66b4202020604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e80202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743ae020202020202d204372656174653a2020202020202020202034312e3839202b20302e313138202a2053202b202e303032202a205a20c2b573e020202020202d2043726561746520772f2053746f72653a2035332e3537202b20302e313139202a2053202b202e303033202a205a20c2b573e020202020202d20417070726f76653a20202020202020202033312e3339202b20302e313336202a2053202b202e303032202a205a20c2b573e020202020202d20436f6d706c6574653a202020202020202033392e3934202b20302e323620202a2053202b202e303032202a205a20c2b57334202d204442205765696768743a250120202020202d2052656164733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c6029290120202020202d205772697465733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c60294c202d20506c75732043616c6c20576569676874302023203c2f7765696768743e40617070726f76655f61735f6d756c746914247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e2463616c6c5f68617368205b75383b2033325d286d61785f776569676874185765696768749c590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e003101205061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573410120607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e003901204e4f54453a2049662074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2077616e7420746f20757365206061735f6d756c74696020696e73746561642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66b4202020604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e8c202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743a8020202020202d204372656174653a2034342e3731202b20302e303838202a20538420202020202d20417070726f76653a2033312e3438202b20302e313136202a205334202d204442205765696768743abc20202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745dc020202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d302023203c2f7765696768743e3c63616e63656c5f61735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e2474696d65706f696e746454696d65706f696e743c543a3a426c6f636b4e756d6265723e2463616c6c5f68617368205b75383b2033325d6c59012043616e63656c2061207072652d6578697374696e672c206f6e2d676f696e67206d756c7469736967207472616e73616374696f6e2e20416e79206465706f7369742072657365727665642070726576696f75736c79c820666f722074686973206f7065726174696f6e2077696c6c20626520756e7265736572766564206f6e20737563636573732e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e6101202d206074696d65706f696e74603a205468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c7c207472616e73616374696f6e20666f7220746869732064697370617463682ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602e34202d204f6e65206576656e742e88202d20492f4f3a2031207265616420604f285329602c206f6e652072656d6f76652e74202d2053746f726167653a2072656d6f766573206f6e65206974656d2e8c202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d84202d2042617365205765696768743a2033362e3037202b20302e313234202a205334202d204442205765696768743a190120202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c731d0120202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c73302023203c2f7765696768743e01102c4e65774d756c74697369670c244163636f756e744964244163636f756e7449642043616c6c486173680415012041206e6577206d756c7469736967206f7065726174696f6e2068617320626567756e2e205b617070726f76696e672c206d756c74697369672c2063616c6c5f686173685d404d756c7469736967417070726f76616c10244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449642043616c6c48617368047d012041206d756c7469736967206f7065726174696f6e20686173206265656e20617070726f76656420627920736f6d656f6e652e205b617070726f76696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d404d756c7469736967457865637574656414244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449642043616c6c48617368384469737061746368526573756c740451012041206d756c7469736967206f7065726174696f6e20686173206265656e2065786563757465642e205b617070726f76696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d444d756c746973696743616e63656c6c656410244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449642043616c6c486173680459012041206d756c7469736967206f7065726174696f6e20686173206265656e2063616e63656c6c65642e205b63616e63656c6c696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d0038404d696e696d756d5468726573686f6c640480205468726573686f6c64206d7573742062652032206f7220677265617465722e3c416c7265616479417070726f76656404b02043616c6c20697320616c726561647920617070726f7665642062792074686973207369676e61746f72792e444e6f417070726f76616c734e656564656404a02043616c6c20646f65736e2774206e65656420616e7920286d6f72652920617070726f76616c732e44546f6f4665775369676e61746f7269657304ac2054686572652061726520746f6f20666577207369676e61746f7269657320696e20746865206c6973742e48546f6f4d616e795369676e61746f7269657304b02054686572652061726520746f6f206d616e79207369676e61746f7269657320696e20746865206c6973742e545369676e61746f726965734f75744f664f7264657204110120546865207369676e61746f7269657320776572652070726f7669646564206f7574206f66206f726465723b20746865792073686f756c64206265206f7264657265642e4c53656e646572496e5369676e61746f72696573041101205468652073656e6465722077617320636f6e7461696e656420696e20746865206f74686572207369676e61746f726965733b2069742073686f756c646e27742062652e204e6f74466f756e6404e0204d756c7469736967206f7065726174696f6e206e6f7420666f756e64207768656e20617474656d7074696e6720746f2063616e63656c2e204e6f744f776e6572043101204f6e6c7920746865206163636f756e742074686174206f726967696e616c6c79206372656174656420746865206d756c74697369672069732061626c6520746f2063616e63656c2069742e2c4e6f54696d65706f696e74042101204e6f2074696d65706f696e742077617320676976656e2c2079657420746865206d756c7469736967206f7065726174696f6e20697320616c726561647920756e6465727761792e3857726f6e6754696d65706f696e74043101204120646966666572656e742074696d65706f696e742077617320676976656e20746f20746865206d756c7469736967206f7065726174696f6e207468617420697320756e6465727761792e4c556e657870656374656454696d65706f696e7404f820412074696d65706f696e742077617320676976656e2c20796574206e6f206d756c7469736967206f7065726174696f6e20697320756e6465727761792e30576569676874546f6f4c6f7704d420546865206d6178696d756d2077656967687420696e666f726d6174696f6e2070726f76696465642077617320746f6f206c6f772e34416c726561647953746f72656404a420546865206461746120746f2062652073746f72656420697320616c72656164792073746f7265642e041c40436865636b5370656356657273696f6e38436865636b547856657273696f6e30436865636b47656e6573697338436865636b4d6f7274616c69747928436865636b4e6f6e63652c436865636b576569676874604368617267655472616e73616374696f6e5061796d656e74 ' + +metadata_v9_hex = '0x6d65746109641853797374656d011853797374656d34304163636f756e744e6f6e636501010130543a3a4163636f756e74496420543a3a496e646578001000000000047c2045787472696e73696373206e6f6e636520666f72206163636f756e74732e3845787472696e736963436f756e7400000c753332040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e4c416c6c45787472696e73696373576569676874000018576569676874040004150120546f74616c2077656967687420666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e40416c6c45787472696e736963734c656e00000c753332040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b4861736801010138543a3a426c6f636b4e756d6265721c543a3a48617368008000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101010c7533321c5665633c75383e000400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d626572010038543a3a426c6f636b4e756d6265721000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e3845787472696e73696373526f6f7401001c543a3a486173688000000000000000000000000000000000000000000000000000000000000000000415012045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e1844696765737401002c4469676573744f663c543e040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301008c5665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e040004a0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e284576656e74436f756e740100284576656e74496e646578100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f706963730102010828291c543a3a48617368845665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e010400342501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e002d0120546865206669727374206b657920736572766573206e6f20707572706f73652e2054686973206669656c64206973206465636c6172656420617320646f75626c655f6d6170206a757374a820666f7220636f6e76656e69656e6365206f66207573696e67206072656d6f76655f707265666978602e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e011c2866696c6c5f626c6f636b0004210120412062696720646973706174636820746861742077696c6c20646973616c6c6f7720616e79206f74686572207472616e73616374696f6e20746f20626520696e636c756465642e1872656d61726b041c5f72656d61726b1c5665633c75383e046c204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e387365745f686561705f7061676573041470616765730c75363404fc2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040c6e65771c5665633c75383e04482053657420746865206e657720636f64652e2c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e046c2053657420736f6d65206974656d73206f662073746f726167652e306b696c6c5f73746f7261676504106b657973205665633c4b65793e0478204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e2c6b696c6c5f70726566697804187072656669780c4b6579041501204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e01084045787472696e7369635375636365737304304469737061746368496e666f049420416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c6564083444697370617463684572726f72304469737061746368496e666f045420416e2065787472696e736963206661696c65642e000c4c526571756972655369676e65644f726967696e004452657175697265526f6f744f726967696e003c526571756972654e6f4f726967696e001c5574696c697479000104146261746368041463616c6c735c5665633c3c542061732054726169743e3a3a43616c6c3e04b02053656e642061206261746368206f662064697370617463682063616c6c7320286f6e6c7920726f6f74292e0104344261746368457865637574656404785665633c526573756c743c28292c2044697370617463684572726f723e3e0000001042616265011042616265242845706f6368496e64657801000c75363420000000000000000004542043757272656e742065706f636820696e6465782e2c417574686f72697469657301009c5665633c28417574686f7269747949642c2042616265417574686f72697479576569676874293e0400046c2043757272656e742065706f636820617574686f7269746965732e2c47656e65736973536c6f7401000c75363420000000000000000008f82054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e205468697320697320309020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2c43757272656e74536c6f7401000c75363420000000000000000004542043757272656e7420736c6f74206e756d6265722e2852616e646f6d6e6573730100205b75383b2033325d80000000000000000000000000000000000000000000000000000000000000000028b8205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e002c20232053656375726974790005012054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061f8206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e7915012063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d6265727320746861742074686973150120286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e206265050120757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e0d01206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e384e65787452616e646f6d6e6573730100205b75383b2033325d800000000000000000000000000000000000000000000000000000000000000000045c204e6578742065706f63682072616e646f6d6e6573732e305365676d656e74496e64657801000c7533321000000000247c2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e00f4205765206d616b6520612074726164656f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e01012057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f942060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e00ec204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e090120576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572791c2065706f63682e44556e646572436f6e737472756374696f6e0101010c753332345665633c5b75383b2033325d3e000400002c496e697469616c697a65640000204d6179626556726604000801012054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d65601d01206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e010000083445706f63684475726174696f6e0c75363420c800000000000000080d0120546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746ffc2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e444578706563746564426c6f636b54696d6524543a3a4d6f6d656e7420b80b00000000000014050120546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e67110120626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f75740501207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f740901206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473a0207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e002454696d657374616d70012454696d657374616d70080c4e6f77010024543a3a4d6f6d656e7420000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e24446964557064617465010010626f6f6c040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01040c736574040c6e6f7748436f6d706163743c543a3a4d6f6d656e743e245820536574207468652063757272656e742074696d652e00590120546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed82070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e004501205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e74207370656369666965642062794420604d696e696d756d506572696f64602e00d820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e0004344d696e696d756d506572696f6424543a3a4d6f6d656e7420dc0500000000000010690120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f64690120746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c79650120776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c6520746869737020706572696f64206f6e2064656661756c742073657474696e67732e0028417574686f72736869700128417574686f72736869700c18556e636c65730100e85665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e0400041c20556e636c657318417574686f72000030543a3a4163636f756e7449640400046420417574686f72206f662063757272656e7420626c6f636b2e30446964536574556e636c6573010010626f6f6c040004bc205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e0104287365745f756e636c657304286e65775f756e636c6573385665633c543a3a4865616465723e04642050726f76696465206120736574206f6620756e636c65732e0000001c496e6469636573011c496e6469636573082c4e657874456e756d53657401003c543a3a4163636f756e74496e6465781000000000047c20546865206e657874206672656520656e756d65726174696f6e207365742e1c456e756d5365740101013c543a3a4163636f756e74496e646578445665633c543a3a4163636f756e7449643e00040004582054686520656e756d65726174696f6e20736574732e010001043c4e65774163636f756e74496e64657808244163636f756e744964304163636f756e74496e64657810882041206e6577206163636f756e7420696e646578207761732061737369676e65642e0005012054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e65646020746f20616e6f7468657220604163636f756e744964602e00002042616c616e636573012042616c616e6365731434546f74616c49737375616e6365010028543a3a42616c616e6365400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e1c56657374696e6700010130543a3a4163636f756e744964ac56657374696e675363686564756c653c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e00040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e2c4672656542616c616e636501010130543a3a4163636f756e74496428543a3a42616c616e63650040000000000000000000000000000000002c9c20546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e004101205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e204974750120616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e207468697355012062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069733d012064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b450120697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f636961746564207769746854207468652064656c65746564206163636f756e742e005d01206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473150120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e3c526573657276656442616c616e636501010130543a3a4163636f756e74496428543a3a42616c616e63650040000000000000000000000000000000002c75012054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c206765749c20736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e006d0120546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e732501207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e007501205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e7427b42069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e004d01206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473190120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e29144c6f636b7301010130543a3a4163636f756e744964b05665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e00040004b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e0110207472616e736665720810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e64d8205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e00090120607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e21012049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e1501204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b4206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e00190120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e002c2023203c7765696768743e3101202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72cc202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e6901202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e004c2052656c617465642066756e6374696f6e733a0051012020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2d012020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365d420202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642edc2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765725901202020202060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e6365646020616e642060543a3a4f6e4672656542616c616e63655a65726f3a3a6f6e5f667265655f62616c616e63655f7a65726f602e49012020202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616cf82020202020636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e00302023203c2f7765696768743e2c7365745f62616c616e63650c0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365206e65775f667265654c436f6d706163743c543a3a42616c616e63653e306e65775f72657365727665644c436f6d706163743c543a3a42616c616e63653e349420536574207468652062616c616e636573206f66206120676976656e206163636f756e742e00210120546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c090120616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e190120496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742ce82069742077696c6c20726573657420746865206163636f756e74206e6f6e636520286073797374656d3a3a4163636f756e744e6f6e636560292e00b420546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e002c2023203c7765696768743e80202d20496e646570656e64656e74206f662074686520617267756d656e74732ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e302023203c2f7765696768743e38666f7263655f7472616e736665720c18736f757263658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636510646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e0851012045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d61792062652c207370656369666965642e4c7472616e736665725f6b6565705f616c6976650810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e1851012053616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c2074686540206f726967696e206163636f756e742e00bc20393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e00c4205b607472616e73666572605d3a207374727563742e4d6f64756c652e68746d6c236d6574686f642e7472616e73666572010c284e65774163636f756e7408244163636f756e7449641c42616c616e6365046c2041206e6577206163636f756e742077617320637265617465642e345265617065644163636f756e7404244163636f756e744964045c20416e206163636f756e7420776173207265617065642e205472616e7366657210244163636f756e744964244163636f756e7449641c42616c616e63651c42616c616e636504b0205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e0c484578697374656e7469616c4465706f73697428543a3a42616c616e63654000407a10f35a0000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2c5472616e7366657246656528543a3a42616c616e6365400010a5d4e800000000000000000000000494205468652066656520726571756972656420746f206d616b652061207472616e736665722e2c4372656174696f6e46656528543a3a42616c616e6365400010a5d4e80000000000000000000000049c205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e00485472616e73616374696f6e5061796d656e74012042616c616e63657304444e6578744665654d756c7469706c6965720100284d756c7469706c69657220000000000000000000000008485472616e73616374696f6e426173654665653042616c616e63654f663c543e400010a5d4e8000000000000000000000004dc205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e485472616e73616374696f6e427974654665653042616c616e63654f663c543e4000e40b54020000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e001c5374616b696e67011c5374616b696e67683856616c696461746f72436f756e7401000c753332100000000004a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e7401000c7533321004000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e34496e76756c6e657261626c65730100445665633c543a3a4163636f756e7449643e04000c590120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e636520746865792772654d01206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f7572ac20696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e64656400010130543a3a4163636f756e74496430543a3a4163636f756e744964000400040101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e184c656467657200010130543a3a4163636f756e744964a45374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e14506179656501010130543a3a4163636f756e7449644452657761726444657374696e6174696f6e00040004e42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e2856616c696461746f727301010130543a3a4163636f756e7449643856616c696461746f72507265667301040004450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e284e6f6d696e61746f727300010130543a3a4163636f756e744964644e6f6d696e6174696f6e733c543a3a4163636f756e7449643e01040010650120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e003501204e4f54453a206973207072697661746520736f20746861742077652063616e20656e73757265207570677261646564206265666f726520616c6c207479706963616c2061636365737365732ed8204469726563742073746f7261676520415049732063616e207374696c6c2062797061737320746869732070726f74656374696f6e2e1c5374616b65727301010130543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000c000000104d01204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e277420697465726174651901207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e207468652053657373696f6e206d6f64756c652e00902054686973206973206b6579656420627920746865207374617368206163636f756e742e3843757272656e74456c65637465640100445665633c543a3a4163636f756e7449643e040004fc205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e2843757272656e74457261010020457261496e6465781000000000045c205468652063757272656e742065726120696e6465782e3c43757272656e74457261537461727401002c4d6f6d656e744f663c543e200000000000000000047820546865207374617274206f66207468652063757272656e74206572612e6c43757272656e74457261537461727453657373696f6e496e64657801003053657373696f6e496e646578100000000004d0205468652073657373696f6e20696e646578206174207768696368207468652063757272656e742065726120737461727465642e5843757272656e74457261506f696e74734561726e6564010024457261506f696e7473140000000000040d01205265776172647320666f72207468652063757272656e74206572612e205573696e6720696e6469636573206f662063757272656e7420656c6563746564207365742e24536c6f745374616b6501003042616c616e63654f663c543e40000000000000000000000000000000000c31012054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e00c02054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e20466f72636545726101001c466f7263696e670400041d01205472756520696620746865206e6578742073657373696f6e206368616e67652077696c6c2062652061206e657720657261207265676172646c657373206f6620696e6465782e4c536c6173685265776172644672616374696f6e01001c50657262696c6c10000000000cf8205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e00e4205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e4c43616e63656c6564536c6173685061796f757401003042616c616e63654f663c543e40000000000000000000000000000000000815012054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e7420776869636820776173ec2063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e40556e6170706c696564536c617368657301010120457261496e646578bc5665633c556e6170706c696564536c6173683c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3e00040004c420416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e28426f6e646564457261730100745665633c28457261496e6465782c2053657373696f6e496e646578293e04000425012041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e4c56616c696461746f72536c617368496e45726100020120457261496e64657830543a3a4163636f756e7449645c2850657262696c6c2c2042616c616e63654f663c543e2902040008450120416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e7020616e6420736c6173682076616c7565206f6620746865206572612e4c4e6f6d696e61746f72536c617368496e45726100020120457261496e64657830543a3a4163636f756e7449643042616c616e63654f663c543e02040004610120416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e34536c617368696e675370616e7300010130543a3a4163636f756e7449645c736c617368696e673a3a536c617368696e675370616e73000400048c20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e245370616e536c6173680101018c28543a3a4163636f756e7449642c20736c617368696e673a3a5370616e496e6465782988736c617368696e673a3a5370616e5265636f72643c42616c616e63654f663c543e3e00800000000000000000000000000000000000000000000000000000000000000000083d01205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2cb82061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e584561726c69657374556e6170706c696564536c617368000020457261496e646578040004fc20546865206561726c696573742065726120666f72207768696368207765206861766520612070656e64696e672c20756e6170706c69656420736c6173682e3853746f7261676556657273696f6e01000c75333210000000000490205468652076657273696f6e206f662073746f7261676520666f7220757067726164652e014010626f6e640c28636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e1470617965654452657761726444657374696e6174696f6e3c65012054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c8420626520746865206163636f756e74207468617420636f6e74726f6c732069742e003101206076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e00250120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e002c2023203c7765696768743ed4202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e20202d204f2831292e68202d20546872656520657874726120444220656e74726965732e006d01204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e656420756e6c65737325012074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e302023203c2f7765696768743e28626f6e645f657874726104386d61785f6164646974696f6e616c54436f6d706163743c42616c616e63654f663c543e3e3865012041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e63652075703420666f72207374616b696e672e00510120557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e650120556e6c696b65205b60626f6e64605d206f72205b60756e626f6e64605d20746869732066756e6374696f6e20646f6573206e6f7420696d706f736520616e79206c696d69746174696f6e206f6e2074686520616d6f756e744c20746861742063616e2062652061646465642e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e20202d204f2831292e40202d204f6e6520444220656e7472792e302023203c2f7765696768743e18756e626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e5c5501205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64010120706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e250120543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e004901204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665c0207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e003d01204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360293d012063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e656564fc20746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e00982053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e002c2023203c7765696768743e4101202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e6501202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e63656029710120202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652ea501202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c656420766961206077697468647261775f756e626f6e646564602e40202d204f6e6520444220656e7472792e28203c2f7765696768743e4477697468647261775f756e626f6e64656400402d012052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e003501205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4c2077686174657665722069742077616e74732e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e006c2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e002c2023203c7765696768743e5501202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e45012020497420696d706c6965732060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c207768696368206973f42020696e6469726563746c7920757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e7901202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e2076616c6964617465041470726566733856616c696461746f7250726566732ce8204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e206e6f6d696e617465041c74617267657473a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e2c1101204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743e2501202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f66206074617267657473602c982077686963682069732063617070656420617420604d41585f4e4f4d494e4154494f4e53602ed8202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e302023203c2f7765696768743e146368696c6c002cc8204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e54202d20436f6e7461696e73206f6e6520726561642ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e247365745f7061796565041470617965654452657761726444657374696e6174696f6e2cb8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e387365745f636f6e74726f6c6c65720428636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652c90202852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e4c7365745f76616c696461746f725f636f756e74040c6e657730436f6d706163743c7533323e04802054686520696465616c206e756d626572206f662076616c696461746f72732e34666f7263655f6e6f5f657261730014b020466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e302023203c2f7765696768743e34666f7263655f6e65775f65726100184d0120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c206265a020726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e302023203c2f7765696768743e447365745f696e76756c6e657261626c6573042876616c696461746f7273445665633c543a3a4163636f756e7449643e04cc20536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e34666f7263655f756e7374616b650414737461736830543a3a4163636f756e744964040d0120466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e50666f7263655f6e65775f6572615f616c776179730014050120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e002c2023203c7765696768743e50202d204f6e652073746f72616765207772697465302023203c2f7765696768743e5463616e63656c5f64656665727265645f736c617368080c65726120457261496e64657834736c6173685f696e6469636573205665633c7533323e1c45012043616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e2043616e2062652063616c6c6564206279206569746865722074686520726f6f74206f726967696e206f7270207468652060543a3a536c61736843616e63656c4f726967696e602e05012070617373696e67207468652065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e002c2023203c7765696768743e54202d204f6e652073746f726167652077726974652e302023203c2f7765696768743e010c18526577617264081c42616c616e63651c42616c616e636508510120416c6c2076616c696461746f72732068617665206265656e207265776172646564206279207468652066697273742062616c616e63653b20746865207365636f6e64206973207468652072656d61696e6465728c2066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642e14536c61736808244163636f756e7449641c42616c616e6365042501204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e684f6c64536c617368696e675265706f7274446973636172646564043053657373696f6e496e646578081d0120416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c6448206e6f742062652070726f6365737365642e083853657373696f6e735065724572613053657373696f6e496e64657810060000000470204e756d626572206f662073657373696f6e7320706572206572612e3c426f6e64696e674475726174696f6e20457261496e64657810a002000004e4204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e001c53657373696f6e011c53657373696f6e1c2856616c696461746f727301004c5665633c543a3a56616c696461746f7249643e0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e64657801003053657373696f6e496e646578100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e676564010010626f6f6c040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b6579730100785665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e0400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f72730100205665633c7533323e04000c8020496e6469636573206f662064697361626c65642076616c696461746f72732e003501205468652073657420697320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e732061206e657720736574206f66206964656e7469746965732e204e6578744b6579730002041c5665633c75383e38543a3a56616c696461746f7249641c543a3a4b657973010400109c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e00590120546865206669727374206b657920697320616c77617973206044454455505f4b45595f5052454649586020746f206861766520616c6c20746865206461746120696e207468652073616d65206272616e6368206f6661012074686520747269652e20486176696e6720616c6c206461746120696e207468652073616d65206272616e63682073686f756c642070726576656e7420736c6f77696e6720646f776e206f7468657220717565726965732e204b65794f776e65720002041c5665633c75383e50284b65795479706549642c205665633c75383e2938543a3a56616c696461746f72496401040010250120546865206f776e6572206f662061206b65792e20546865207365636f6e64206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e00590120546865206669727374206b657920697320616c77617973206044454455505f4b45595f5052454649586020746f206861766520616c6c20746865206461746120696e207468652073616d65206272616e6368206f6661012074686520747269652e20486176696e6720616c6c206461746120696e207468652073616d65206272616e63682073686f756c642070726576656e7420736c6f77696e6720646f776e206f7468657220717565726965732e0104207365745f6b65797308106b6579731c543a3a4b6579731470726f6f661c5665633c75383e28e42053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b6579602e210120416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec4205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d420546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002c2023203c7765696768743e88202d204f286c6f67206e2920696e206e756d626572206f66206163636f756e74732e58202d204f6e6520657874726120444220656e7472792e302023203c2f7765696768743e0104284e657753657373696f6e043053657373696f6e496e646578085501204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b88206e756d626572206173207468652074797065206d6967687420737567676573742e044044454455505f4b45595f50524546495814265b75385d38343a73657373696f6e3a6b6579730865012055736564206173206669727374206b657920666f7220604e6578744b6579736020616e6420604b65794f776e65726020746f2070757420616c6c20746865206461746120696e746f207468652073616d65206272616e636834206f662074686520747269652e002444656d6f6372616379012444656d6f6372616379403c5075626c696350726f70436f756e7401002450726f70496e646578100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f707301009c5665633c2850726f70496e6465782c20543a3a486173682c20543a3a4163636f756e744964293e040004210120546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865207365636f6e64206974656d206973207468652070726f706f73616c277320686173682e24507265696d616765730001011c543a3a48617368d4285665633c75383e2c20543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d62657229000400086101204d6170206f662068617368657320746f207468652070726f706f73616c20707265696d6167652c20616c6f6e6720776974682077686f207265676973746572656420697420616e64207468656972206465706f7369742ee42054686520626c6f636b206e756d6265722069732074686520626c6f636b20617420776869636820697420776173206465706f73697465642e244465706f7369744f660001012450726f70496e646578842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e2900040004842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e3c5265666572656e64756d436f756e7401003c5265666572656e64756d496e646578100000000004310120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e244e65787454616c6c7901003c5265666572656e64756d496e646578100000000004c820546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e405265666572656e64756d496e666f4f660001013c5265666572656e64756d496e646578a4285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a486173683e2900040004b420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e344469737061746368517565756501010438543a3a426c6f636b4e756d6265729c5665633c4f7074696f6e3c28543a3a486173682c205265666572656e64756d496e646578293e3e00040004c0205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e24566f74657273466f720101013c5265666572656e64756d496e646578445665633c543a3a4163636f756e7449643e00040004a4204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e18566f74654f660101017c285265666572656e64756d496e6465782c20543a3a4163636f756e7449642910566f7465000400106101204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c794d012069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468655d012064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616ef420616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e1450726f787900010130543a3a4163636f756e74496430543a3a4163636f756e7449640004000831012057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b6579206973207468658820766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e2c44656c65676174696f6e7301010130543a3a4163636f756e7449646828543a3a4163636f756e7449642c20436f6e76696374696f6e2901840000000000000000000000000000000000000000000000000000000000000000000441012047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e544c6173745461626c656457617345787465726e616c010010626f6f6c0400085901205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c6963282070726f706f73616c2e304e65787445787465726e616c00006028543a3a486173682c20566f74655468726573686f6c6429040010590120546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e550120546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743aa4202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f7268202d20605075626c696350726f70736020697320656d7074792e24426c61636b6c6973740001011c543a3a486173688c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e290004000851012041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d626572e82028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e3443616e63656c6c6174696f6e730101011c543a3a4861736810626f6f6c000400042901205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e01541c70726f706f7365083470726f706f73616c5f686173681c543a3a486173681476616c756554436f6d706163743c42616c616e63654f663c543e3e18a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e002c2023203c7765696768743e20202d204f2831292e80202d2054776f204442206368616e6765732c206f6e6520444220656e7472792e302023203c2f7765696768743e187365636f6e64042070726f706f73616c48436f6d706163743c50726f70496e6465783e18a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e002c2023203c7765696768743e20202d204f2831292e40202d204f6e6520444220656e7472792e302023203c2f7765696768743e10766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f746510566f74651c350120566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bbc206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e002c2023203c7765696768743e20202d204f2831292e7c202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e302023203c2f7765696768743e2870726f78795f766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f746510566f74651c510120566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374f8207468652070726f706f73616c3b20206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e002c2023203c7765696768743e20202d204f2831292e7c202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e302023203c2f7765696768743e40656d657267656e63795f63616e63656c04247265665f696e6465783c5265666572656e64756d496e646578085101205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d6530207265666572656e64756d2e4065787465726e616c5f70726f706f7365043470726f706f73616c5f686173681c543a3a48617368083101205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c30207265666572656e64756d2e6465787465726e616c5f70726f706f73655f6d616a6f72697479043470726f706f73616c5f686173681c543a3a48617368145901205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c656020616e2065787465726e616c207265666572656e64756d2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e6065787465726e616c5f70726f706f73655f64656661756c74043470726f706f73616c5f686173681c543a3a48617368144901205363686564756c652061206e656761746976652d7475726e6f75742d62696173207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f84207363686564756c6520616e2065787465726e616c207265666572656e64756d2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e28666173745f747261636b0c3470726f706f73616c5f686173681c543a3a4861736834766f74696e675f706572696f6438543a3a426c6f636b4e756d6265721464656c617938543a3a426c6f636b4e756d626572245101205363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564650120696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e65ec20627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e00f8202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e6101202d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e20496e6372656173656420746f9820202060456d657267656e6379566f74696e67506572696f646020696620746f6f206c6f772e5501202d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265bc202020656e61637465642e205468697320646f65736e277420686176652061206d696e696d756d20616d6f756e742e347665746f5f65787465726e616c043470726f706f73616c5f686173681c543a3a4861736804bc205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e4463616e63656c5f7265666572656e64756d04247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e04542052656d6f76652061207265666572656e64756d2e3463616e63656c5f7175657565640c107768656e5c436f6d706163743c543a3a426c6f636b4e756d6265723e14776869636830436f6d706163743c7533323e107768617460436f6d706163743c5265666572656e64756d496e6465783e04a02043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e247365745f70726f7879041470726f787930543a3a4163636f756e7449641498205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e002c2023203c7765696768743e58202d204f6e6520657874726120444220656e7472792e302023203c2f7765696768743e3072657369676e5f70726f787900149820436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e002c2023203c7765696768743e40202d204f6e6520444220636c6561722e302023203c2f7765696768743e3072656d6f76655f70726f7879041470726f787930543a3a4163636f756e744964149820436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e002c2023203c7765696768743e40202d204f6e6520444220636c6561722e302023203c2f7765696768743e2064656c65676174650808746f30543a3a4163636f756e74496428636f6e76696374696f6e28436f6e76696374696f6e143c2044656c656761746520766f74652e002c2023203c7765696768743e58202d204f6e6520657874726120444220656e7472792e302023203c2f7765696768743e28756e64656c656761746500144420556e64656c656761746520766f74652e002c2023203c7765696768743e20202d204f2831292e302023203c2f7765696768743e58636c6561725f7075626c69635f70726f706f73616c7300040101205665746f20616e6420626c61636b6c697374207468652070726f706f73616c20686173682e204d7573742062652066726f6d20526f6f74206f726967696e2e346e6f74655f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e0861012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e205468697320646f65736e27742072657175697265207468652070726f706f73616c20746f206265250120696e207468652064697370617463682071756575652062757420646f657320726571756972652061206465706f7369742c2072657475726e6564206f6e636520656e61637465642e586e6f74655f696d6d696e656e745f707265696d6167650c40656e636f6465645f70726f706f73616c1c5665633c75383e107768656e38543a3a426c6f636b4e756d6265721477686963680c7533320845012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e2054686973207265717569726573207468652070726f706f73616c20746f206265b420696e207468652064697370617463682071756575652e204e6f206465706f736974206973206e65656465642e34726561705f707265696d616765043470726f706f73616c5f686173681c543a3a4861736804f42052656d6f766520616e20657870697265642070726f706f73616c20707265696d61676520616e6420636f6c6c65637420746865206465706f7369742e01402050726f706f736564082450726f70496e6465781c42616c616e636504c02041206d6f74696f6e20686173206265656e2070726f706f7365642062792061207075626c6963206163636f756e742e185461626c65640c2450726f70496e6465781c42616c616e6365385665633c4163636f756e7449643e04dc2041207075626c69632070726f706f73616c20686173206265656e207461626c656420666f72207265666572656e64756d20766f74652e3845787465726e616c5461626c656400049820416e2065787465726e616c2070726f706f73616c20686173206265656e207461626c65642e1c53746172746564083c5265666572656e64756d496e64657834566f74655468726573686f6c6404602041207265666572656e64756d2068617320626567756e2e18506173736564043c5265666572656e64756d496e64657804b020412070726f706f73616c20686173206265656e20617070726f766564206279207265666572656e64756d2e244e6f74506173736564043c5265666572656e64756d496e64657804b020412070726f706f73616c20686173206265656e2072656a6563746564206279207265666572656e64756d2e2443616e63656c6c6564043c5265666572656e64756d496e64657804842041207265666572656e64756d20686173206265656e2063616e63656c6c65642e204578656375746564083c5265666572656e64756d496e64657810626f6f6c047420412070726f706f73616c20686173206265656e20656e61637465642e2444656c65676174656408244163636f756e744964244163636f756e74496404e020416e206163636f756e74206861732064656c65676174656420746865697220766f746520746f20616e6f74686572206163636f756e742e2c556e64656c65676174656404244163636f756e74496404e820416e206163636f756e74206861732063616e63656c6c656420612070726576696f75732064656c65676174696f6e206f7065726174696f6e2e185665746f65640c244163636f756e74496410486173682c426c6f636b4e756d626572049820416e2065787465726e616c2070726f706f73616c20686173206265656e207665746f65642e34507265696d6167654e6f7465640c1048617368244163636f756e7449641c42616c616e636504e020412070726f706f73616c277320707265696d61676520776173206e6f7465642c20616e6420746865206465706f7369742074616b656e2e30507265696d616765557365640c1048617368244163636f756e7449641c42616c616e636504150120412070726f706f73616c20707265696d616765207761732072656d6f76656420616e6420757365642028746865206465706f736974207761732072657475726e6564292e3c507265696d616765496e76616c69640810486173683c5265666572656e64756d496e646578040d0120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d6167652077617320696e76616c69642e3c507265696d6167654d697373696e670810486173683c5265666572656e64756d496e646578040d0120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d61676520776173206d697373696e672e38507265696d616765526561706564101048617368244163636f756e7449641c42616c616e6365244163636f756e744964045d012041207265676973746572656420707265696d616765207761732072656d6f76656420616e6420746865206465706f73697420636f6c6c6563746564206279207468652072656170657220286c617374206974656d292e1c3c456e6163746d656e74506572696f6438543a3a426c6f636b4e756d62657210002f0d0014710120546865206d696e696d756d20706572696f64206f66206c6f636b696e6720616e642074686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e0031012049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e737572652074686174690120766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e2074686520636173652077686572659c207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e304c61756e6368506572696f6438543a3a426c6f636b4e756d62657210004e0c0004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e30566f74696e67506572696f6438543a3a426c6f636b4e756d62657210004e0c0004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e384d696e696d756d4465706f7369743042616c616e63654f663c543e400000c16ff2862300000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e54456d657267656e6379566f74696e67506572696f6438543a3a426c6f636b4e756d626572108051010004ec204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f7220616e20656d657267656e6379207265666572656e64756d2e34436f6f6c6f6666506572696f6438543a3a426c6f636b4e756d62657210004e0c0004610120506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e4c507265696d616765427974654465706f7369743042616c616e63654f663c543e400010a5d4e800000000000000000000000429012054686520616d6f756e74206f662062616c616e63652074686174206d757374206265206465706f7369746564207065722062797465206f6620707265696d6167652073746f7265642e001c436f756e63696c014c496e7374616e636531436f6c6c656374697665142450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001011c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001011c543a3a486173684c566f7465733c543a3a4163636f756e7449643e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e01102c7365745f6d656d62657273042c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e105101205365742074686520636f6c6c6563746976652773206d656d62657273686970206d616e75616c6c7920746f20606e65775f6d656d62657273602e204265206e69636520746f2074686520636861696e20616e645c2070726f76696465206974207072652d736f727465642e005820526571756972657320726f6f74206f726967696e2e1c65786563757465042070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e0cf420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e1c70726f706f736508247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e102c2023203c7765696768743e90202d20426f756e6465642073746f7261676520726561647320616e64207772697465732eb8202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c102c2023203c7765696768743e8c202d20426f756e6465642073746f72616765207265616420616e64207772697465732e5501202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e302023203c2f7765696768743e01182050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e74084d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292e14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408104861736810626f6f6c0405012041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408104861736810626f6f6c042d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e000048546563686e6963616c436f6d6d6974746565014c496e7374616e636532436f6c6c656374697665142450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001011c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001011c543a3a486173684c566f7465733c543a3a4163636f756e7449643e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e01102c7365745f6d656d62657273042c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e105101205365742074686520636f6c6c6563746976652773206d656d62657273686970206d616e75616c6c7920746f20606e65775f6d656d62657273602e204265206e69636520746f2074686520636861696e20616e645c2070726f76696465206974207072652d736f727465642e005820526571756972657320726f6f74206f726967696e2e1c65786563757465042070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e0cf420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e1c70726f706f736508247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e102c2023203c7765696768743e90202d20426f756e6465642073746f7261676520726561647320616e64207772697465732eb8202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c102c2023203c7765696768743e8c202d20426f756e6465642073746f72616765207265616420616e64207772697465732e5501202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e302023203c2f7765696768743e01182050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e74084d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292e14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408104861736810626f6f6c0405012041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408104861736810626f6f6c042d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e000024456c656374696f6e73014050687261676d656e456c656374696f6e181c4d656d626572730100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e040004f0205468652063757272656e7420656c6563746564206d656d626572736869702e20536f72746564206261736564206f6e206163636f756e742069642e2452756e6e65727355700100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e0400044901205468652063757272656e742072756e6e6572735f75702e20536f72746564206261736564206f6e206c6f7720746f2068696768206d657269742028776f72736520746f20626573742072756e6e6572292e38456c656374696f6e526f756e647301000c75333210000000000441012054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e65642c206578636c7564696e6720746865207570636f6d696e67206f6e652e1c566f7465734f6601010130543a3a4163636f756e744964445665633c543a3a4163636f756e7449643e01040004010120566f746573206f66206120706172746963756c617220766f7465722c20776974682074686520726f756e6420696e646578206f662074686520766f7465732e1c5374616b654f6601010130543a3a4163636f756e7449643042616c616e63654f663c543e0040000000000000000000000000000000000464204c6f636b6564207374616b65206f66206120766f7465722e2843616e646964617465730100445665633c543a3a4163636f756e7449643e0400086501205468652070726573656e742063616e646964617465206c6973742e20536f72746564206261736564206f6e206163636f756e742069642e20412063757272656e74206d656d6265722063616e206e6576657220656e7465720101207468697320766563746f7220616e6420697320616c7761797320696d706c696369746c7920617373756d656420746f20626520612063616e6469646174652e011810766f74650814766f746573445665633c543a3a4163636f756e7449643e1476616c756554436f6d706163743c42616c616e63654f663c543e3e3c050120566f746520666f72206120736574206f662063616e6469646174657320666f7220746865207570636f6d696e6720726f756e64206f6620656c656374696f6e2e0050205468652060766f746573602073686f756c643a482020202d206e6f7420626520656d7074792eac2020202d206265206c657373207468616e20746865206e756d626572206f662063616e646964617465732e005d012055706f6e20766f74696e672c206076616c75656020756e697473206f66206077686f6027732062616c616e6365206973206c6f636b656420616e64206120626f6e6420616d6f756e742069732072657365727665642e5d012049742069732074686520726573706f6e736962696c697479206f66207468652063616c6c657220746f206e6f7420706c61636520616c6c206f662074686569722062616c616e636520696e746f20746865206c6f636ba020616e64206b65657020736f6d6520666f722066757274686572207472616e73616374696f6e732e002c2023203c7765696768743e2c2023232323205374617465302052656164733a204f283129c8205772697465733a204f28562920676976656e2060566020766f7465732e205620697320626f756e6465642062792031362e302023203c2f7765696768743e3072656d6f76655f766f746572001c21012052656d6f766520606f726967696e60206173206120766f7465722e20546869732072656d6f76657320746865206c6f636b20616e642072657475726e732074686520626f6e642e002c2023203c7765696768743e2c2023232323205374617465302052656164733a204f28312934205772697465733a204f283129302023203c2f7765696768743e507265706f72745f646566756e63745f766f74657204187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365345d01205265706f727420607461726765746020666f72206265696e6720616e20646566756e637420766f7465722e20496e2063617365206f6620612076616c6964207265706f72742c20746865207265706f727465722069735d012072657761726465642062792074686520626f6e6420616d6f756e74206f662060746172676574602e204f74686572776973652c20746865207265706f7274657220697473656c662069732072656d6f76656420616e645c20746865697220626f6e6420697320736c61736865642e0088204120646566756e637420766f74657220697320646566696e656420746f2062653a4d012020202d206120766f7465722077686f73652063757272656e74207375626d697474656420766f7465732061726520616c6c20696e76616c69642e20692e652e20616c6c206f66207468656d20617265206e6fb420202020206c6f6e67657220612063616e646964617465206e6f7220616e20616374697665206d656d6265722e002c2023203c7765696768743e2c202323232320537461746515012052656164733a204f284e4c6f674d2920676976656e204d2063757272656e742063616e6469646174657320616e64204e20766f74657320666f722060746172676574602e34205772697465733a204f283129302023203c2f7765696768743e407375626d69745f63616e646964616379003478205375626d6974206f6e6573656c6620666f722063616e6469646163792e006420412063616e6469646174652077696c6c206569746865723aec2020202d204c6f73652061742074686520656e64206f6620746865207465726d20616e6420666f7266656974207468656972206465706f7369742e2d012020202d2057696e20616e64206265636f6d652061206d656d6265722e204d656d626572732077696c6c206576656e7475616c6c7920676574207468656972207374617368206261636b2e55012020202d204265636f6d6520612072756e6e65722d75702e2052756e6e6572732d75707320617265207265736572766564206d656d6265727320696e2063617365206f6e65206765747320666f72636566756c6c7934202020202072656d6f7665642e002c2023203c7765696768743e2c20232323232053746174658c2052656164733a204f284c6f674e2920476976656e204e2063616e646964617465732e34205772697465733a204f283129302023203c2f7765696768743e4872656e6f756e63655f63616e646964616379002451012052656e6f756e6365206f6e65277320696e74656e74696f6e20746f20626520612063616e64696461746520666f7220746865206e65787420656c656374696f6e20726f756e642e203320706f74656e7469616c40206f7574636f6d65732065786973743a4101202d20606f726967696e6020697320612063616e64696461746520616e64206e6f7420656c656374656420696e20616e79207365742e20496e207468697320636173652c2074686520626f6e64206973f4202020756e72657365727665642c2072657475726e656420616e64206f726967696e2069732072656d6f76656420617320612063616e6469646174652e5901202d20606f726967696e6020697320612063757272656e742072756e6e65722075702e20496e207468697320636173652c2074686520626f6e6420697320756e72657365727665642c2072657475726e656420616e64842020206f726967696e2069732072656d6f76656420617320612072756e6e65722e4d01202d20606f726967696e6020697320612063757272656e74206d656d6265722e20496e207468697320636173652c2074686520626f6e6420697320756e726573657276656420616e64206f726967696e206973590120202072656d6f7665642061732061206d656d6265722c20636f6e73657175656e746c79206e6f74206265696e6720612063616e64696461746520666f7220746865206e65787420726f756e6420616e796d6f72652e650120202053696d696c617220746f205b6072656d6f76655f766f746572605d2c206966207265706c6163656d656e742072756e6e657273206578697374732c20746865792061726520696d6d6564696174656c7920757365642e3472656d6f76655f6d656d626572040c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365345d012052656d6f7665206120706172746963756c6172206d656d6265722066726f6d20746865207365742e20546869732069732065666665637469766520696d6d6564696174656c7920616e642074686520626f6e64206f668020746865206f7574676f696e67206d656d62657220697320736c61736865642e00590120496620612072756e6e65722d757020697320617661696c61626c652c207468656e2074686520626573742072756e6e65722d75702077696c6c2062652072656d6f76656420616e64207265706c6163657320746865f4206f7574676f696e67206d656d6265722e204f74686572776973652c2061206e65772070687261676d656e20726f756e6420697320737461727465642e004501204e6f74652074686174207468697320646f6573206e6f7420616666656374207468652064657369676e6174656420626c6f636b206e756d626572206f6620746865206e65787420656c656374696f6e2e002c2023203c7765696768743e2c2023232323205374617465582052656164733a204f28646f5f70687261676d656e295c205772697465733a204f28646f5f70687261676d656e29302023203c2f7765696768743e01141c4e65775465726d04645665633c284163636f756e7449642c2042616c616e6365293e0855012041206e6577207465726d2077697468206e6577206d656d626572732e205468697320696e64696361746573207468617420656e6f7567682063616e6469646174657320657869737465642c206e6f742074686174450120656e6f756768206861766520686173206265656e20656c65637465642e2054686520696e6e65722076616c7565206d757374206265206578616d696e656420666f72207468697320707572706f73652e24456d7074795465726d0004d8204e6f20286f72206e6f7420656e6f756768292063616e64696461746573206578697374656420666f72207468697320726f756e642e304d656d6265724b69636b656404244163636f756e7449640845012041206d656d62657220686173206265656e2072656d6f7665642e20546869732073686f756c6420616c7761797320626520666f6c6c6f7765642062792065697468657220604e65775465726d60206f74342060456d7074795465726d602e3c4d656d62657252656e6f756e63656404244163636f756e74496404a02041206d656d626572206861732072656e6f756e6365642074686569722063616e6469646163792e34566f7465725265706f727465640c244163636f756e744964244163636f756e74496410626f6f6c086101204120766f7465722028666972737420656c656d656e742920776173207265706f72746564202862797420746865207365636f6e6420656c656d656e742920776974682074686520746865207265706f7274206265696e678c207375636365737366756c206f72206e6f742028746869726420656c656d656e74292e143443616e646964616379426f6e643042616c616e63654f663c543e400080c6a47e8d030000000000000000000028566f74696e67426f6e643042616c616e63654f663c543e4000407a10f35a000000000000000000000038446573697265644d656d626572730c753332100d00000000404465736972656452756e6e65727355700c753332100700000000305465726d4475726174696f6e38543a3a426c6f636b4e756d626572108013030000004c546563686e6963616c4d656d62657273686970014c496e7374616e6365314d656d62657273686970041c4d656d626572730100445665633c543a3a4163636f756e7449643e040004c8205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e0114286164645f6d656d626572040c77686f30543a3a4163636f756e7449640c7c204164642061206d656d626572206077686f6020746f20746865207365742e00b4204d6179206f6e6c792062652063616c6c65642066726f6d20604164644f726967696e60206f7220726f6f742e3472656d6f76655f6d656d626572040c77686f30543a3a4163636f756e7449640c902052656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e00c0204d6179206f6e6c792062652063616c6c65642066726f6d206052656d6f76654f726967696e60206f7220726f6f742e2c737761705f6d656d626572081872656d6f766530543a3a4163636f756e7449640c61646430543a3a4163636f756e7449640cc02053776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e00b8204d6179206f6e6c792062652063616c6c65642066726f6d2060537761704f726967696e60206f7220726f6f742e3472657365745f6d656d62657273041c6d656d62657273445665633c543a3a4163636f756e7449643e105901204368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e646c207061737320606d656d6265727360207072652d736f727465642e00bc204d6179206f6e6c792062652063616c6c65642066726f6d206052657365744f726967696e60206f7220726f6f742e286368616e67655f6b6579040c6e657730543a3a4163636f756e7449640cd82053776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e00f4204d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e01182c4d656d62657241646465640004e42054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e344d656d62657252656d6f7665640004ec2054686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e384d656d62657273537761707065640004dc2054776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e304d656d6265727352657365740004190120546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e284b65794368616e676564000488204f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e1444756d6d7904b4727374643a3a6d61726b65723a3a5068616e746f6d446174613c284163636f756e7449642c204576656e74293e0470205068616e746f6d206d656d6265722c206e6576657220757365642e00003c46696e616c697479547261636b65720001042866696e616c5f68696e74041068696e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08f42048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a65646c20626c6f636b2069732074686520676976656e206e756d6265722e00082857696e646f7753697a6538543a3a426c6f636b4e756d626572106500000004190120546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e345265706f72744c6174656e637938543a3a426c6f636b4e756d62657210e8030000041d01205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e001c4772616e647061013c4772616e64706146696e616c6974791c2c417574686f726974696573010034417574686f726974794c6973740400102c20444550524543415445440061012054686973207573656420746f2073746f7265207468652063757272656e7420617574686f72697479207365742c20776869636820686173206265656e206d6967726174656420746f207468652077656c6c2d6b6e6f776e94204752414e4450415f415554484f52495445535f4b455920756e686173686564206b65792e14537461746501006c53746f72656453746174653c543a3a426c6f636b4e756d6265723e04000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e676500008c53746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000038543a3a426c6f636b4e756d626572040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c656400008028543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d626572290400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e7453657449640100145365744964200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e0001011453657449643053657373696f6e496e64657800040004c1012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f7220776869636820697473206d656d62657273207765726520726573706f6e7369626c652e0104487265706f72745f6d69736265686176696f72041c5f7265706f72741c5665633c75383e0464205265706f727420736f6d65206d69736265686176696f722e010c384e6577417574686f7269746965730434417574686f726974794c6973740490204e657720617574686f726974792073657420686173206265656e206170706c6965642e1850617573656400049c2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640004a02043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e0000205472656173757279012054726561737572790c3450726f706f73616c436f756e7401003450726f706f73616c496e646578100000000004a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c730001013450726f706f73616c496e6465789050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c730100485665633c50726f706f73616c496e6465783e040004f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e010c3470726f706f73655f7370656e64081476616c756554436f6d706163743c42616c616e63654f663c543e3e2c62656e65666963696172798c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365242d012050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c7565350120697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e636520746865542070726f706f73616c20697320617761726465642e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e94202d204f6e65204442206368616e67652c206f6e6520657874726120444220656e7472792e302023203c2f7765696768743e3c72656a6563745f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e1cfc2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e40202d204f6e6520444220636c6561722e302023203c2f7765696768743e40617070726f76655f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e205d0120417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e6566696369617279ac20616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e44202d204f6e65204442206368616e67652e302023203c2f7765696768743e01182050726f706f736564043450726f706f73616c496e6465780438204e65772070726f706f73616c2e205370656e64696e67041c42616c616e636504e8205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e1c417761726465640c3450726f706f73616c496e6465781c42616c616e6365244163636f756e744964048020536f6d652066756e64732068617665206265656e20616c6c6f63617465642e144275726e74041c42616c616e6365048c20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20526f6c6c6f766572041c42616c616e6365043101205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e1c4465706f736974041c42616c616e6365048020536f6d652066756e64732068617665206265656e206465706f73697465642e103050726f706f73616c426f6e641c5065726d696c6c1050c30000085501204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e110120416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e4c50726f706f73616c426f6e644d696e696d756d3042616c616e63654f663c543e4000407a10f35a00000000000000000000044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f6438543a3a426c6f636b4e756d6265721080700000048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e1c5065726d696c6c1020a107000411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e0024436f6e7472616374730120436f6e74726163741c204761735370656e7401000c476173200000000000000000048020476173207370656e7420736f2066617220696e207468697320626c6f636b2e3c43757272656e745363686564756c650100205363686564756c65c5010000000001000000000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000008700000000000000af000000000000000100000000000000010000000000000004000000000001001000000000400000002000000004942043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e305072697374696e65436f64650001012c436f6465486173683c543e1c5665633c75383e0004000465012041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2c436f646553746f726167650001012c436f6465486173683c543e587761736d3a3a5072656661625761736d4d6f64756c650004000465012041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f7220657865637574696f6e2e384163636f756e74436f756e74657201000c753634200000000000000000045420546865207375627472696520636f756e7465722e38436f6e7472616374496e666f4f6600010130543a3a4163636f756e7449643c436f6e7472616374496e666f3c543e00040004a82054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e20476173507269636501003042616c616e63654f663c543e4001000000000000000000000000000000047820546865207072696365206f66206f6e6520756e6974206f66206761732e01143c7570646174655f7363686564756c6504207363686564756c65205363686564756c650cb4205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e000d0120546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e207075745f636f646508246761735f6c696d697430436f6d706163743c4761733e10636f64651c5665633c75383e085d012053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e27732073746f7261676520616e642072657475726e73206974732060636f646568617368602ed420596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e1063616c6c1010646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e246761735f6c696d697430436f6d706163743c4761733e10646174611c5665633c75383e1c0901204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e002901202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c206265b020657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e1901202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e4901202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c1501206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e2c696e7374616e74696174651024656e646f776d656e7454436f6d706163743c42616c616e63654f663c543e3e246761735f6c696d697430436f6d706163743c4761733e24636f64655f686173682c436f6465486173683c543e10646174611c5665633c75383e28bd0120496e7374616e7469617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e009820496e7374616e74696174696f6e20697320657865637574656420617320666f6c6c6f77733a004101202d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e0501202d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e6d01202d20546865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e204275666665722072657475726e65645d0120202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b6564a820202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e7c202d2054686520636f6e747261637420697320696e697469616c697a65642e3c636c61696d5f73757263686172676508106465737430543a3a4163636f756e744964286175785f73656e646572504f7074696f6e3c543a3a4163636f756e7449643e14710120416c6c6f777320626c6f636b2070726f64756365727320746f20636c61696d206120736d616c6c2072657761726420666f72206576696374696e67206120636f6e74726163742e204966206120626c6f636b2070726f64756365721501206661696c7320746f20646f20736f2c206120726567756c61722075736572732077696c6c20626520616c6c6f77656420746f20636c61696d20746865207265776172642e00390120496620636f6e7472616374206973206e6f742065766963746564206173206120726573756c74206f6620746869732063616c6c2c206e6f20616374696f6e73206172652074616b656e20616e64ac207468652073656e646572206973206e6f7420656c696769626c6520666f7220746865207265776172642e0118205472616e736665720c244163636f756e744964244163636f756e7449641c42616c616e6365046901205472616e736665722068617070656e6564206066726f6d6020746f2060746f60207769746820676976656e206076616c7565602061732070617274206f662061206063616c6c60206f722060696e7374616e7469617465602e30496e7374616e74696174656408244163636f756e744964244163636f756e74496404dc20436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e28436f646553746f72656404104861736804b820436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e3c5363686564756c6555706461746564040c75333204c020547269676765726564207768656e207468652063757272656e74207363686564756c6520697320757064617465642e284469737061746368656408244163636f756e74496410626f6f6c08390120412063616c6c2077617320646973706174636865642066726f6d2074686520676976656e206163636f756e742e2054686520626f6f6c207369676e616c7320776865746865722069742077617374207375636365737366756c20657865637574696f6e206f72206e6f742e20436f6e747261637408244163636f756e7449641c5665633c75383e048c20416e206576656e742066726f6d20636f6e7472616374206f66206163636f756e742e404c5369676e6564436c61696d48616e646963617038543a3a426c6f636b4e756d626572100200000010e0204e756d626572206f6620626c6f636b2064656c617920616e2065787472696e73696320636c61696d20737572636861726765206861732e000d01205768656e20636c61696d207375726368617267652069732063616c6c656420627920616e2065787472696e736963207468652072656e7420697320636865636b65646820666f722063757272656e745f626c6f636b202d2064656c617940546f6d6273746f6e654465706f7369743042616c616e63654f663c543e4000407a10f35a0000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f2067656e6572617465206120746f6d6273746f6e652e4453746f7261676553697a654f66667365740c75333210080000000851012053697a65206f66206120636f6e7472616374206174207468652074696d65206f6620696e7374616e746961696f6e2e205468697320697320612073696d706c652077617920746f20656e737572652074686174a420656d70747920636f6e747261637473206576656e7475616c6c7920676574732064656c657465642e2c52656e74427974654665653042616c616e63654f663c543e4000407a10f35a00000000000000000000043501205072696365206f6620612062797465206f662073746f7261676520706572206f6e6520626c6f636b20696e74657276616c2e2053686f756c642062652067726561746572207468616e20302e4452656e744465706f7369744f66667365743042616c616e63654f663c543e4000008a5d7845630100000000000000001c05012054686520616d6f756e74206f662066756e6473206120636f6e74726163742073686f756c64206465706f73697420696e206f7264657220746f206f6666736574582074686520636f7374206f66206f6e6520627974652e006901204c6574277320737570706f736520746865206465706f73697420697320312c303030204255202862616c616e636520756e697473292f6279746520616e64207468652072656e7420697320312042552f627974652f6461792c5901207468656e206120636f6e7472616374207769746820312c3030302c3030302042552074686174207573657320312c303030206279746573206f662073746f7261676520776f756c6420706179206e6f2072656e742e4d0120427574206966207468652062616c616e6365207265647563656420746f203530302c30303020425520616e64207468652073746f7261676520737461796564207468652073616d6520617420312c3030302c78207468656e20697420776f756c6420706179203530302042552f6461792e3c5375726368617267655265776172643042616c616e63654f663c543e400080a1a76b4a3500000000000000000008e4205265776172642074686174206973207265636569766564206279207468652070617274792077686f736520746f75636820686173206c65646820746f2072656d6f76616c206f66206120636f6e74726163742e2c5472616e736665724665653042616c616e63654f663c543e400010a5d4e800000000000000000000000494205468652066656520726571756972656420746f206d616b652061207472616e736665722e2c4372656174696f6e4665653042616c616e63654f663c543e400010a5d4e80000000000000000000000049c205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e485472616e73616374696f6e426173654665653042616c616e63654f663c543e400010a5d4e8000000000000000000000004dc205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e485472616e73616374696f6e427974654665653042616c616e63654f663c543e4000e40b54020000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e2c436f6e74726163744665653042616c616e63654f663c543e400010a5d4e80000000000000000000000084101205468652066656520726571756972656420746f20696e7374616e7469617465206120636f6e747261637420696e7374616e63652e204120726561736f6e61626c652064656661756c742076616c75651c2069732032312e2c43616c6c426173654665650c47617320e803000000000000081d0120546865206261736520666565206368617267656420666f722063616c6c696e6720696e746f206120636f6e74726163742e204120726561736f6e61626c652064656661756c74382076616c7565206973203133352e48496e7374616e7469617465426173654665650c47617320e80300000000000008390120546865206261736520666565206368617267656420666f7220696e7374616e74696174696e67206120636f6e74726163742e204120726561736f6e61626c652064656661756c742076616c756520206973203137352e204d617844657074680c753332102000000008310120546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f696e7374616e746961746520737461636b2e204120726561736f6e61626c652064656661756c74382076616c7565206973203130302e304d617856616c756553697a650c753332100040000004390120546865206d6178696d756d2073697a65206f6620612073746f726167652076616c756520696e2062797465732e204120726561736f6e61626c652064656661756c74206973203136204b69422e34426c6f636b4761734c696d69740c47617320809698000000000008250120546865206d6178696d756d20616d6f756e74206f6620676173207468617420636f756c6420626520657870656e6465642070657220626c6f636b2e204120726561736f6e61626c65742064656661756c742076616c75652069732031305f3030305f3030302e00105375646f01105375646f040c4b6579010030543a3a4163636f756e74496480000000000000000000000000000000000000000000000000000000000000000004842054686520604163636f756e74496460206f6620746865207375646f206b65792e010c107375646f042070726f706f73616c40426f783c543a3a50726f706f73616c3e2839012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e60202d204f6e6520444220777269746520286576656e74292ed4202d20556e6b6e6f776e20776569676874206f662064657269766174697665206070726f706f73616c6020657865637574696f6e2e302023203c2f7765696768743e1c7365745f6b6579040c6e65778c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652475012041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e44202d204f6e65204442206368616e67652e302023203c2f7765696768743e1c7375646f5f6173080c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652070726f706f73616c40426f783c543a3a50726f706f73616c3e2c51012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d44206120676976656e206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e60202d204f6e6520444220777269746520286576656e74292ed4202d20556e6b6e6f776e20776569676874206f662064657269766174697665206070726f706f73616c6020657865637574696f6e2e302023203c2f7765696768743e010c1453756469640410626f6f6c04602041207375646f206a75737420746f6f6b20706c6163652e284b65794368616e67656404244163636f756e74496404f020546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e285375646f4173446f6e650410626f6f6c04602041207375646f206a75737420746f6f6b20706c6163652e000020496d4f6e6c696e650120496d4f6e6c696e651020476f737369704174010038543a3a426c6f636b4e756d626572100000000004a02054686520626c6f636b206e756d626572207768656e2077652073686f756c6420676f737369702e104b65797301004c5665633c543a3a417574686f7269747949643e040004d0205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e485265636569766564486561727462656174730002013053657373696f6e496e6465782441757468496e6465781c5665633c75383e01040008e420466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206041757468496e646578608c20746f20606f6666636861696e3a3a4f70617175654e6574776f726b5374617465602e38417574686f726564426c6f636b730102013053657373696f6e496e64657838543a3a56616c696461746f7249640c75333201100000000008150120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f662060543a3a56616c696461746f7249646020746f20746865c8206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e0104246865617274626561740824686561727462656174644865617274626561743c543a3a426c6f636b4e756d6265723e285f7369676e6174757265bc3c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e617475726500010c444865617274626561745265636569766564042c417574686f72697479496404c02041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f726974794964601c416c6c476f6f640004d42041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2c536f6d654f66666c696e6504605665633c4964656e74696669636174696f6e5475706c653e0431012041742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e63652076616c696461746f722077617320666f756e6420746f206265206f66666c696e652e000048417574686f72697479446973636f76657279000100000000204f6666656e63657301204f6666656e6365730c1c5265706f727473000101345265706f727449644f663c543ed04f6666656e636544657461696c733c543a3a4163636f756e7449642c20543a3a4964656e74696669636174696f6e5475706c653e00040004490120546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e58436f6e63757272656e745265706f727473496e646578010201104b696e64384f706171756554696d65536c6f74485665633c5265706f727449644f663c543e3e010400042901204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e485265706f72747342794b696e64496e646578010101104b696e641c5665633c75383e00040018110120456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e00bc20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e004901204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f66690120646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e010001041c4f6666656e636508104b696e64384f706171756554696d65536c6f7408550120546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e64390120286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e00006052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100305665633c543a3a486173683e04000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e0100000000144e69636b7301105375646f04184e616d654f6600010130543a3a4163636f756e7449645c285665633c75383e2c2042616c616e63654f663c543e29000400047020546865206c6f6f6b7570207461626c6520666f72206e616d65732e0110207365745f6e616d6504106e616d651c5665633c75383e405d012053657420616e206163636f756e742773206e616d652e20546865206e616d652073686f756c642062652061205554462d382d656e636f64656420737472696e6720627920636f6e76656e74696f6e2c2074686f7567684c20776520646f6e277420636865636b2069742e00610120546865206e616d65206d6179206e6f74206265206d6f7265207468616e2060543a3a4d61784c656e677468602062797465732c206e6f72206c657373207468616e2060543a3a4d696e4c656e677468602062797465732e005d0120496620746865206163636f756e7420646f65736e277420616c726561647920686176652061206e616d652c207468656e206120666565206f6620605265736572766174696f6e466565602069732072657365727665644020696e20746865206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e84202d204174206d6f7374206f6e652062616c616e6365206f7065726174696f6e2e68202d204f6e652073746f7261676520726561642f77726974652e34202d204f6e65206576656e742e302023203c2f7765696768743e28636c6561725f6e616d650028510120436c65617220616e206163636f756e742773206e616d6520616e642072657475726e20746865206465706f7369742e204661696c7320696620746865206163636f756e7420776173206e6f74206e616d65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204f6e652062616c616e6365206f7065726174696f6e2e68202d204f6e652073746f7261676520726561642f77726974652e34202d204f6e65206576656e742e302023203c2f7765696768743e246b696c6c5f6e616d6504187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636534e42052656d6f766520616e206163636f756e742773206e616d6520616e642074616b6520636861726765206f6620746865206465706f7369742e004901204661696c73206966206077686f6020686173206e6f74206265656e206e616d65642e20546865206465706f736974206973206465616c742077697468207468726f7567682060543a3a536c6173686564604c20696d62616c616e63652068616e646c65722e00310120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f206f72206d617463682060543a3a466f7263654f726967696e602e002c2023203c7765696768743e20202d204f2831292edc202d204f6e6520756e62616c616e6365642068616e646c6572202870726f6261626c7920612062616c616e6365207472616e736665722968202d204f6e652073746f7261676520726561642f77726974652e34202d204f6e65206576656e742e302023203c2f7765696768743e28666f7263655f6e616d6508187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365106e616d651c5665633c75383e30c82053657420612074686972642d7061727479206163636f756e742773206e616d652077697468206e6f206465706f7369742e00a0204e6f206c656e67746820636865636b696e6720697320646f6e65206f6e20746865206e616d652e00310120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f206f72206d617463682060543a3a466f7263654f726967696e602e002c2023203c7765696768743e20202d204f2831292e84202d204174206d6f7374206f6e652062616c616e6365206f7065726174696f6e2e68202d204f6e652073746f7261676520726561642f77726974652e34202d204f6e65206576656e742e302023203c2f7765696768743e01141c4e616d6553657404244163636f756e74496404402041206e616d6520776173207365742e284e616d65466f7263656404244163636f756e74496404642041206e616d652077617320666f726369626c79207365742e2c4e616d654368616e67656404244163636f756e74496404502041206e616d6520776173206368616e6765642e2c4e616d65436c656172656408244163636f756e7449641c42616c616e636504d02041206e616d652077617320636c65617265642c20616e642074686520676976656e2062616c616e63652072657475726e65642e284e616d654b696c6c656408244163636f756e7449641c42616c616e636504c82041206e616d65207761732072656d6f76656420616e642074686520676976656e2062616c616e636520736c61736865642e0c385265736572766174696f6e4665653042616c616e63654f663c543e4000407a10f35a000000000000000000000444205265736572766174696f6e206665652e244d696e4c656e6774680c7533321003000000048820546865206d696e696d756d206c656e6774682061206e616d65206d61792062652e244d61784c656e6774680c7533321010000000048820546865206d6178696d756d206c656e6774682061206e616d65206d61792062652e00' + +metadata_substrate_node_template = '0x6d6574610c241853797374656d011853797374656d401c4163636f756e7401010230543a3a4163636f756e744964944163636f756e74496e666f3c543a3a496e6465782c20543a3a4163636f756e74446174613e00210100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e8205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e3845787472696e736963436f756e7400000c753332040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2c426c6f636b576569676874010064776569676874733a3a45787472696e7369637357656967687440000000000000000000000000000000000488205468652063757272656e742077656967687420666f722074686520626c6f636b2e40416c6c45787472696e736963734c656e00000c753332040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b4861736801010538543a3a426c6f636b4e756d6265721c543a3a48617368008000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101050c7533321c5665633c75383e000400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d626572010038543a3a426c6f636b4e756d6265721000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e3845787472696e73696373526f6f7401001c543a3a486173688000000000000000000000000000000000000000000000000000000000000000000415012045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e1844696765737401002c4469676573744f663c543e040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301008c5665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e040004a0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e284576656e74436f756e740100284576656e74496e646578100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f706963730101021c543a3a48617368845665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e000400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e484c61737452756e74696d65557067726164650000584c61737452756e74696d6555706772616465496e666f04000455012053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e545570677261646564546f553332526566436f756e74010010626f6f6c0400044d012054727565206966207765206861766520757067726164656420736f207468617420607479706520526566436f756e74602069732060753332602e2046616c7365202864656661756c7429206966206e6f742e38457865637574696f6e50686173650000145068617365040004882054686520657865637574696f6e207068617365206f662074686520626c6f636b2e01282866696c6c5f626c6f636b04185f726174696f1c50657262696c6c040901204120646973706174636820746861742077696c6c2066696c6c2074686520626c6f636b2077656967687420757020746f2074686520676976656e20726174696f2e1872656d61726b041c5f72656d61726b1c5665633c75383e1c6c204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e002c2023203c7765696768743e24202d20604f28312960e0202d2042617365205765696768743a20302e36363520c2b5732c20696e646570656e64656e74206f662072656d61726b206c656e6774682e50202d204e6f204442206f7065726174696f6e732e302023203c2f7765696768743e387365745f686561705f7061676573041470616765730c75363420fc2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e002c2023203c7765696768743e24202d20604f283129604c202d20312073746f726167652077726974652e64202d2042617365205765696768743a20312e34303520c2b57360202d203120777269746520746f20484541505f5041474553302023203c2f7765696768743e207365745f636f64650410636f64651c5665633c75383e28682053657420746865206e65772072756e74696d6520636f64652e002c2023203c7765696768743e3501202d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f64656088202d20312073746f726167652077726974652028636f64656320604f28432960292e7901202d20312063616c6c20746f206063616e5f7365745f636f6465603a20604f28532960202863616c6c73206073705f696f3a3a6d6973633a3a72756e74696d655f76657273696f6e6020776869636820697320657870656e73697665292e2c202d2031206576656e742e7d012054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652c206275742067656e6572616c6c792074686973206973207665727920657870656e736976652e902057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e302023203c2f7765696768743e5c7365745f636f64655f776974686f75745f636865636b730410636f64651c5665633c75383e201d012053657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e002c2023203c7765696768743e90202d20604f2843296020776865726520604360206c656e677468206f662060636f64656088202d20312073746f726167652077726974652028636f64656320604f28432960292e2c202d2031206576656e742e75012054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e302023203c2f7765696768743e5c7365745f6368616e6765735f747269655f636f6e666967044c6368616e6765735f747269655f636f6e666967804f7074696f6e3c4368616e67657354726965436f6e66696775726174696f6e3e28a02053657420746865206e6577206368616e676573207472696520636f6e66696775726174696f6e2e002c2023203c7765696768743e24202d20604f28312960b0202d20312073746f72616765207772697465206f722064656c6574652028636f64656320604f28312960292ed8202d20312063616c6c20746f20606465706f7369745f6c6f67603a20557365732060617070656e6460204150492c20736f204f28312964202d2042617365205765696768743a20372e32313820c2b57334202d204442205765696768743aa820202020202d205772697465733a204368616e67657320547269652c2053797374656d20446967657374302023203c2f7765696768743e2c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e206c2053657420736f6d65206974656d73206f662073746f726167652e002c2023203c7765696768743e94202d20604f2849296020776865726520604960206c656e677468206f6620606974656d73607c202d206049602073746f72616765207772697465732028604f28312960292e74202d2042617365205765696768743a20302e353638202a206920c2b57368202d205772697465733a204e756d626572206f66206974656d73302023203c2f7765696768743e306b696c6c5f73746f7261676504106b657973205665633c4b65793e2078204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e002c2023203c7765696768743efc202d20604f28494b296020776865726520604960206c656e677468206f6620606b6579736020616e6420604b60206c656e677468206f66206f6e65206b657964202d206049602073746f726167652064656c6574696f6e732e70202d2042617365205765696768743a202e333738202a206920c2b57368202d205772697465733a204e756d626572206f66206974656d73302023203c2f7765696768743e2c6b696c6c5f70726566697808187072656669780c4b6579205f7375626b6579730c7533322c1501204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e003d01202a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e64657241012074686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e002c2023203c7765696768743edc202d20604f285029602077686572652060506020616d6f756e74206f66206b65797320776974682070726566697820607072656669786064202d206050602073746f726167652064656c6574696f6e732e74202d2042617365205765696768743a20302e383334202a205020c2b57380202d205772697465733a204e756d626572206f66207375626b657973202b2031302023203c2f7765696768743e1c7375696369646500286501204b696c6c207468652073656e64696e67206163636f756e742c20617373756d696e6720746865726520617265206e6f207265666572656e636573206f75747374616e64696e6720616e642074686520636f6d706f7369746590206461746120697320657175616c20746f206974732064656661756c742076616c75652e002c2023203c7765696768743e24202d20604f283129607c202d20312073746f72616765207265616420616e642064656c6574696f6e2e54202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a20382e36323620c2b5731101204e6f2044422052656164206f72205772697465206f7065726174696f6e7320626563617573652063616c6c657220697320616c726561647920696e206f7665726c6179302023203c2f7765696768743e01144045787472696e7369635375636365737304304469737061746368496e666f04b820416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e205c5b696e666f5c5d3c45787472696e7369634661696c6564083444697370617463684572726f72304469737061746368496e666f049420416e2065787472696e736963206661696c65642e205c5b6572726f722c20696e666f5c5d2c436f64655570646174656400045420603a636f6465602077617320757064617465642e284e65774163636f756e7404244163636f756e744964047c2041206e6577205c5b6163636f756e745c5d2077617320637265617465642e344b696c6c65644163636f756e7404244163636f756e744964046c20416e205c5b6163636f756e745c5d20776173207265617065642e1838426c6f636b48617368436f756e7438543a3a426c6f636b4e756d626572106009000004d820546865206d6178696d756d206e756d626572206f6620626c6f636b7320746f20616c6c6f7720696e206d6f7274616c20657261732e484d6178696d756d426c6f636b576569676874185765696768742000204aa9d1010000047c20546865206d6178696d756d20776569676874206f66206120626c6f636b2e2044625765696768743c52756e74696d6544625765696768744040787d010000000000e1f505000000000409012054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e50426c6f636b457865637574696f6e576569676874185765696768742000f2052a0100000004510120546865206261736520776569676874206f6620657865637574696e67206120626c6f636b2c20696e646570656e64656e74206f6620746865207472616e73616374696f6e7320696e2074686520626c6f636b2e4c45787472696e736963426173655765696768741857656967687420405973070000000004790120546865206261736520776569676874206f6620616e2045787472696e73696320696e2074686520626c6f636b2c20696e646570656e64656e74206f6620746865206f662065787472696e736963206265696e672065786563757465642e484d6178696d756d426c6f636b4c656e6774680c753332100000500004a820546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e143c496e76616c6964537065634e616d6508150120546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d655420616e6420746865206e65772072756e74696d652e685370656356657273696f6e4e65656473546f496e637265617365084501205468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d655420616e6420746865206e65772072756e74696d652e744661696c6564546f4578747261637452756e74696d6556657273696f6e0cf0204661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e000d01204569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e4c4e6f6e44656661756c74436f6d706f7369746504010120537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e3c4e6f6e5a65726f526566436f756e740439012054686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e006052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100305665633c543a3a486173683e04000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e0100000000012454696d657374616d70012454696d657374616d70080c4e6f77010024543a3a4d6f6d656e7420000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e24446964557064617465010010626f6f6c040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01040c736574040c6e6f7748436f6d706163743c543a3a4d6f6d656e743e3c5820536574207468652063757272656e742074696d652e00590120546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed82070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e004501205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e74207370656369666965642062794420604d696e696d756d506572696f64602e00d820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e002c2023203c7765696768743ed0202d20604f285429602077686572652060546020636f6d706c6578697479206f6620606f6e5f74696d657374616d705f73657460a101202d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202862656361757365206f6620604469645570646174653a3a74616b656020696e20606f6e5f66696e616c697a656029b4202d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f7365746020604f285429602e302023203c2f7765696768743e0004344d696e696d756d506572696f6424543a3a4d6f6d656e7420b80b00000000000010690120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f64690120746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c79650120776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c6520746869737020706572696f64206f6e2064656661756c742073657474696e67732e000210417572610000000000031c4772616e647061013c4772616e64706146696e616c6974791814537461746501006c53746f72656453746174653c543a3a426c6f636b4e756d6265723e04000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e676500008c53746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000038543a3a426c6f636b4e756d626572040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c656400008028543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d626572290400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e7453657449640100145365744964200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e0001051453657449643053657373696f6e496e6465780004001059012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f722077686963682069747368206d656d62657273207765726520726573706f6e7369626c652e00b82054574f582d4e4f54453a2060536574496460206973206e6f7420756e646572207573657220636f6e74726f6c2e010c4c7265706f72745f65717569766f636174696f6e084865717569766f636174696f6e5f70726f6f66a845717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66100d01205265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f82065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66fc20616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e6365482077696c6c206265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e6564084865717569766f636174696f6e5f70726f6f66a845717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66240d01205265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f82065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66fc20616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e6365482077696c6c206265207265706f727465642e00110120546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c79190120626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c206173207375636819012069662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e28207265706f727465722e306e6f74655f7374616c6c6564081464656c617938543a3a426c6f636b4e756d6265726c626573745f66696e616c697a65645f626c6f636b5f6e756d62657238543a3a426c6f636b4e756d6265721c1d01204e6f74652074686174207468652063757272656e7420617574686f7269747920736574206f6620746865204752414e4450412066696e616c69747920676164676574206861732901207374616c6c65642e20546869732077696c6c2074726967676572206120666f7263656420617574686f7269747920736574206368616e67652061742074686520626567696e6e696e672101206f6620746865206e6578742073657373696f6e2c20746f20626520656e6163746564206064656c61796020626c6f636b7320616674657220746861742e205468652064656c617915012073686f756c64206265206869676820656e6f75676820746f20736166656c7920617373756d6520746861742074686520626c6f636b207369676e616c6c696e6720746865290120666f72636564206368616e67652077696c6c206e6f742062652072652d6f726765642028652e672e203130303020626c6f636b73292e20546865204752414e44504120766f7465727329012077696c6c20737461727420746865206e657720617574686f7269747920736574207573696e672074686520676976656e2066696e616c697a656420626c6f636b20617320626173652e5c204f6e6c792063616c6c61626c6520627920726f6f742e010c384e6577417574686f7269746965730434417574686f726974794c69737404d8204e657720617574686f726974792073657420686173206265656e206170706c6965642e205c5b617574686f726974795f7365745c5d1850617573656400049c2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640004a02043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e001c2c50617573654661696c656408090120417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665a8202865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e30526573756d654661696c656408150120417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e277420706175736564a42028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e344368616e676550656e64696e6704ec20417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e1c546f6f536f6f6e04c02043616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e60496e76616c69644b65794f776e65727368697050726f6f660435012041206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e60496e76616c696445717569766f636174696f6e50726f6f6604350120416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f7274041901204120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e042042616c616e636573012042616c616e6365731034546f74616c49737375616e6365010028543a3a42616c616e6365400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e1c4163636f756e7401010230543a3a4163636f756e7449645c4163636f756e74446174613c543a3a42616c616e63653e000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6c205468652062616c616e6365206f6620616e206163636f756e742e004101204e4f54453a2054686973206973206f6e6c79207573656420696e20746865206361736520746861742074686973206d6f64756c65206973207573656420746f2073746f72652062616c616e6365732e144c6f636b7301010230543a3a4163636f756e744964705665633c42616c616e63654c6f636b3c543a3a42616c616e63653e3e00040008b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2501204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e3853746f7261676556657273696f6e01002052656c656173657304000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e00a020546869732069732073657420746f2076322e302e3020666f72206e6577206e6574776f726b732e0110207472616e736665720810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e6cd8205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e00090120607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e21012049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e1501204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b4206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e00190120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e002c2023203c7765696768743e3101202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72cc202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e6901202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e004c2052656c617465642066756e6374696f6e733a0051012020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2d012020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365d420202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e61012020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765722060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e636564602e49012020202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616cf82020202020636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e88202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d4501202d2042617365205765696768743a2037332e363420c2b5732c20776f7273742063617365207363656e6172696f20286163636f756e7420637265617465642c206163636f756e742072656d6f76656429dc202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374696e6174696f6e206163636f756e741501202d204f726967696e206163636f756e7420697320616c726561647920696e206d656d6f72792c20736f206e6f204442206f7065726174696f6e7320666f72207468656d2e302023203c2f7765696768743e2c7365745f62616c616e63650c0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365206e65775f667265654c436f6d706163743c543a3a42616c616e63653e306e65775f72657365727665644c436f6d706163743c543a3a42616c616e63653e489420536574207468652062616c616e636573206f66206120676976656e206163636f756e742e00210120546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c090120616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e190120496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c01012069742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e00b420546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e002c2023203c7765696768743e80202d20496e646570656e64656e74206f662074686520617267756d656e74732ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e58202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743a6820202020202d204372656174696e673a2032372e353620c2b5736420202020202d204b696c6c696e673a2033352e313120c2b57398202d204442205765696768743a203120526561642c203120577269746520746f206077686f60302023203c2f7765696768743e38666f7263655f7472616e736665720c18736f757263658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636510646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e1851012045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d61792062652c207370656369666965642e2c2023203c7765696768743e4101202d2053616d65206173207472616e736665722c20627574206164646974696f6e616c207265616420616e6420777269746520626563617573652074686520736f75726365206163636f756e74206973902020206e6f7420617373756d656420746f20626520696e20746865206f7665726c61792e302023203c2f7765696768743e4c7472616e736665725f6b6565705f616c6976650810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e2c51012053616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c2074686540206f726967696e206163636f756e742e00bc20393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e00c4205b607472616e73666572605d3a207374727563742e4d6f64756c652e68746d6c236d6574686f642e7472616e736665722c2023203c7765696768743ee8202d2043686561706572207468616e207472616e736665722062656361757365206163636f756e742063616e6e6f74206265206b696c6c65642e60202d2042617365205765696768743a2035312e3420c2b5731d01202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374202873656e64657220697320696e206f7665726c617920616c7265616479292c20233c2f7765696768743e01201c456e646f77656408244163636f756e7449641c42616c616e636504250120416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e205c5b6163636f756e742c20667265655f62616c616e63655c5d20447573744c6f737408244163636f756e7449641c42616c616e636508410120416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77204578697374656e7469616c4465706f7369742cd020726573756c74696e6720696e20616e206f75747269676874206c6f73732e205c5b6163636f756e742c2062616c616e63655c5d205472616e736665720c244163636f756e744964244163636f756e7449641c42616c616e636504a0205472616e73666572207375636365656465642e205c5b66726f6d2c20746f2c2076616c75655c5d2842616c616e63655365740c244163636f756e7449641c42616c616e63651c42616c616e636504cc20412062616c616e6365207761732073657420627920726f6f742e205c5b77686f2c20667265652c2072657365727665645c5d1c4465706f73697408244163636f756e7449641c42616c616e636504210120536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e205c5b77686f2c206465706f7369745c5d20526573657276656408244163636f756e7449641c42616c616e636504210120536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e205c5b77686f2c2076616c75655c5d28556e726573657276656408244163636f756e7449641c42616c616e636504290120536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e205c5b77686f2c2076616c75655c5d4852657365727665526570617472696174656410244163636f756e744964244163636f756e7449641c42616c616e6365185374617475730c510120536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742edc2046696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652ea8205c5b66726f6d2c20746f2c2062616c616e63652c2064657374696e6174696f6e5f7374617475735c5d04484578697374656e7469616c4465706f73697428543a3a42616c616e636540f401000000000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e203856657374696e6742616c616e6365049c2056657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c7565544c69717569646974795265737472696374696f6e7304c8204163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c204f766572666c6f77047420476f7420616e206f766572666c6f7720616674657220616464696e674c496e73756666696369656e7442616c616e636504782042616c616e636520746f6f206c6f7720746f2073656e642076616c7565484578697374656e7469616c4465706f73697404ec2056616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f736974244b656570416c6976650490205472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e745c4578697374696e6756657374696e675363686564756c6504cc20412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742c446561644163636f756e74048c2042656e6566696369617279206163636f756e74206d757374207072652d657869737405485472616e73616374696f6e5061796d656e7401485472616e73616374696f6e5061796d656e7408444e6578744665654d756c7469706c6965720100284d756c7469706c69657240000064a7b3b6e00d0000000000000000003853746f7261676556657273696f6e01002052656c6561736573040000000008485472616e73616374696f6e427974654665653042616c616e63654f663c543e4001000000000000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e2c576569676874546f466565a45665633c576569676874546f466565436f656666696369656e743c42616c616e63654f663c543e3e3e5c0401000000000000000000000000000000000000000001040d012054686520706f6c796e6f6d69616c2074686174206973206170706c69656420696e206f7264657220746f20646572697665206665652066726f6d207765696768742e0006105375646f01105375646f040c4b6579010030543a3a4163636f756e74496480000000000000000000000000000000000000000000000000000000000000000004842054686520604163636f756e74496460206f6620746865207375646f206b65792e0110107375646f041063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e2839012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e60202d204f6e6520444220777269746520286576656e74292ec8202d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e302023203c2f7765696768743e547375646f5f756e636865636b65645f776569676874081063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e1c5f776569676874185765696768742839012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e310120546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865b4205375646f207573657220746f20737065636966792074686520776569676874206f66207468652063616c6c2e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292ed0202d2054686520776569676874206f6620746869732063616c6c20697320646566696e6564206279207468652063616c6c65722e302023203c2f7765696768743e1c7365745f6b6579040c6e65778c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652475012041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e44202d204f6e65204442206368616e67652e302023203c2f7765696768743e1c7375646f5f6173080c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e2c51012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d44206120676976656e206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e60202d204f6e6520444220777269746520286576656e74292ec8202d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e302023203c2f7765696768743e010c14537564696404384469737061746368526573756c74048c2041207375646f206a75737420746f6f6b20706c6163652e205c5b726573756c745c5d284b65794368616e67656404244163636f756e74496404010120546865205c5b7375646f65725c5d206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e285375646f4173446f6e650410626f6f6c048c2041207375646f206a75737420746f6f6b20706c6163652e205c5b726573756c745c5d00042c526571756972655375646f04802053656e646572206d75737420626520746865205375646f206163636f756e74073854656d706c6174654d6f64756c65013854656d706c6174654d6f64756c650424536f6d657468696e6700000c753332040000010830646f5f736f6d657468696e670424736f6d657468696e670c753332085d0120416e206578616d706c6520646973706174636861626c6520746861742074616b657320612073696e676c65732076616c7565206173206120706172616d657465722c20777269746573207468652076616c756520746f51012073746f7261676520616e6420656d69747320616e206576656e742e20546869732066756e6374696f6e206d75737420626520646973706174636865642062792061207369676e65642065787472696e7369632e2c63617573655f6572726f720004dc20416e206578616d706c6520646973706174636861626c652074686174206d6179207468726f77206120637573746f6d206572726f722e01043c536f6d657468696e6753746f726564080c753332244163636f756e744964085d01204576656e7420646f63756d656e746174696f6e2073686f756c6420656e64207769746820616e20617272617920746861742070726f7669646573206465736372697074697665206e616d657320666f72206576656e747420706172616d65746572732e205b736f6d657468696e672c2077686f5d0008244e6f6e6556616c7565048c204572726f72206e616d65732073686f756c642062652064657363726970746976652e3c53746f726167654f766572666c6f7704fc204572726f72732073686f756c6420686176652068656c7066756c20646f63756d656e746174696f6e206173736f6369617465642077697468207468656d2e08041c40436865636b5370656356657273696f6e38436865636b547856657273696f6e30436865636b47656e6573697338436865636b4d6f7274616c69747928436865636b4e6f6e63652c436865636b576569676874604368617267655472616e73616374696f6e5061796d656e74' diff --git a/py-scale-codec/test/test_extrinsic_payload.py b/py-scale-codec/test/test_extrinsic_payload.py new file mode 100644 index 00000000..d757b056 --- /dev/null +++ b/py-scale-codec/test/test_extrinsic_payload.py @@ -0,0 +1,2237 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest + +from scalecodec.base import ScaleBytes, ScaleDecoder, RuntimeConfiguration +from scalecodec.block import ExtrinsicsDecoder +from scalecodec.metadata import MetadataDecoder +from scalecodec.type_registry import load_type_registry_preset + +from scalecodec.types import CompactU32, Vec +from test.fixtures import metadata_1045_hex, metadata_substrate_node_template + + +class TestScaleTypeEncoding(unittest.TestCase): + + def setUp(self) -> None: + RuntimeConfiguration().update_type_registry(load_type_registry_preset("kusama")) + RuntimeConfiguration().set_active_spec_version_id(1045) + + + @classmethod + def setUpClass(cls): + RuntimeConfiguration().clear_type_registry() + RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) + + cls.metadata_decoder = MetadataDecoder(ScaleBytes(metadata_1045_hex)) + cls.metadata_decoder.decode() + + def test_decode_balance_transfer_payload(self): + unsigned_payload = "0xa8040400ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409070010a5d4e8" + + extrinsic = ExtrinsicsDecoder( + data=ScaleBytes(unsigned_payload), + metadata=self.metadata_decoder + ) + extrinsic.decode() + + call_module, call_function = self.metadata_decoder.call_index[extrinsic.call_index] + + # Check call module + self.assertEqual(call_module.name, 'Balances') + + # Check call function + self.assertEqual(call_function.name, 'transfer') + + # Check destination address for balance transfer + self.assertEqual(extrinsic.params[0]['type'], 'Address') + self.assertEqual(extrinsic.params[0]['value'], + '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409') + + # Check value of balance transfer + self.assertEqual(extrinsic.params[1]['type'], 'Compact') + self.assertEqual(extrinsic.params[1]['value'], 1000000000000) + + def test_encode_attestations_more_attestations_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Attestations', + 'call_function': 'more_attestations', + 'call_args': { + '_more': {} + } + }) + + self.assertEqual(str(payload), "0x0c041500") + + def test_encode_authorship_set_uncles_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Authorship', + 'call_function': 'set_uncles', + 'call_args': { + 'new_uncles': [ + { + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "number": 0, + "stateRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "extrinsicsRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "digest": {"logs": []} + } + ] + } + }) + + self.assertEqual(str(payload), + "0x9901040500040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") + + def test_encode_balances_force_transfer_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Balances', + 'call_function': 'force_transfer', + 'call_args': { + 'dest': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409', + 'source': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409', + 'value': 1000000000000 + } + }) + + self.assertEqual(str(payload), + "0x2d01040402ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409070010a5d4e8") + + def test_encode_balances_force_transfer_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Balances', + 'call_function': 'force_transfer', + 'call_args': { + 'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'source': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'value': 1000000000000 + } + }) + + self.assertEqual(str(payload), + "0x2d01040402ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409070010a5d4e8") + + def test_encode_balances_set_balance_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Balances', + 'call_function': 'set_balance', + 'call_args': { + 'new_free': 1000000000000, + 'new_reserved': 2000000000000, + 'who': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), + "0xc4040401ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409070010a5d4e80b00204aa9d101") + + def test_encode_balances_set_balance_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Balances', + 'call_function': 'set_balance', + 'call_args': { + 'new_free': 1000000000000, + 'new_reserved': 2000000000000, + 'who': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), + "0xc4040401ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409070010a5d4e80b00204aa9d101") + + def test_encode_balances_transfer_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Balances', + 'call_function': 'transfer', + 'call_args': { + 'dest': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409', + 'value': 1000000000000 + } + }) + + self.assertEqual(str(payload), + "0xa8040400ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409070010a5d4e8") + + def test_encode_balance_transfer_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Balances', + 'call_function': 'transfer', + 'call_args': { + 'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'value': 1000000000000 + } + }) + + self.assertEqual(str(payload), + "0xa8040400ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409070010a5d4e8") + + def test_encode_balances_transfer_keep_alive_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Balances', + 'call_function': 'transfer_keep_alive', + 'call_args': { + 'dest': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409', + 'value': 1000000000000 + } + }) + + self.assertEqual(str(payload), + "0xa8040403ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409070010a5d4e8") + + def test_encode_balances_transfer_keep_alive_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Balances', + 'call_function': 'transfer_keep_alive', + 'call_args': { + 'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'value': 1000000000000 + } + }) + + self.assertEqual(str(payload), + "0xa8040403ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409070010a5d4e8") + + def test_encode_claims_claim_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Claims', + 'call_function': 'claim', + 'call_args': { + 'dest': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409', + 'ethereum_signature': '0xd7c4955996cf00953e65ec1895825b9c3894041ed8ab6bd671c456d53f5d04c13948a58a5f20c7c0d3f1e0d08c33ff590a8c681f6a9db78477ca83c8ab8711f500' + } + }) + + self.assertEqual(str(payload), + "0x9101041300586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409d7c4955996cf00953e65ec1895825b9c3894041ed8ab6bd671c456d53f5d04c13948a58a5f20c7c0d3f1e0d08c33ff590a8c681f6a9db78477ca83c8ab8711f500") + + def test_encode_claims_claim_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Claims', + 'call_function': 'claim', + 'call_args': { + 'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'ethereum_signature': '0xd7c4955996cf00953e65ec1895825b9c3894041ed8ab6bd671c456d53f5d04c13948a58a5f20c7c0d3f1e0d08c33ff590a8c681f6a9db78477ca83c8ab8711f500' + } + }) + + self.assertEqual(str(payload), + "0x9101041300586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409d7c4955996cf00953e65ec1895825b9c3894041ed8ab6bd671c456d53f5d04c13948a58a5f20c7c0d3f1e0d08c33ff590a8c681f6a9db78477ca83c8ab8711f500") + + def test_encode_claims_mint_claim_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Claims', + 'call_function': 'mint_claim', + 'call_args': { + 'value': 1000000000000, + 'vesting_schedule': None, + 'who': '0x0123456789012345678901234567890123456789' + } + }) + + self.assertEqual(str(payload), + "0xa004130101234567890123456789012345678901234567890010a5d4e8000000000000000000000000") + + def test_encode_claims_mint_claim_withvesting_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Claims', + 'call_function': 'mint_claim', + 'call_args': { + 'value': 1000000000000, + 'vesting_schedule': [2000000000000, 3000000000000, 1000000], + 'who': '0x0123456789012345678901234567890123456789' + } + }) + + self.assertEqual(str(payload), + "0x310104130101234567890123456789012345678901234567890010a5d4e800000000000000000000000100204aa9d101000000000000000000000030ef7dba020000000000000000000040420f00") + + def test_encode_council_execute_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Council', + 'call_function': 'execute', + 'call_args': { + 'proposal': { + 'call_module': 'System', + 'call_function': 'remark', + 'call_args': { + '_remark': '0x0123456789' + } + } + } + }) + + self.assertEqual(str(payload), "0x2c040e010001140123456789") + + def test_encode_council_propose_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Council', + 'call_function': 'propose', + 'call_args': { + 'proposal': { + 'call_module': 'System', + 'call_function': 'remark', + 'call_args': { + '_remark': '0x0123456789' + } + }, + 'threshold': 7 + } + }) + + self.assertEqual(str(payload), "0x30040e021c0001140123456789") + + def test_encode_council_set_members_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Council', + 'call_function': 'set_members', + 'call_args': { + 'new_members': ["0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409", + "0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409"] + } + }) + + self.assertEqual(str(payload), + "0x1101040e0008586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_council_set_members_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Council', + 'call_function': 'set_members', + 'call_args': { + 'new_members': ["EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk", + "EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk"] + } + }) + + self.assertEqual(str(payload), + "0x1101040e0008586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_council_vote_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Council', + 'call_function': 'vote', + 'call_args': { + 'approve': True, + 'index': 1, + 'proposal': '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' + } + }) + + self.assertEqual(str(payload), "0x94040e030123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0401") + + def test_encode_democracy_cancel_queued_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'cancel_queued', + 'call_args': { + 'which': 1 + } + }) + + self.assertEqual(str(payload), "0x1c040d0b01000000") + + def test_encode_democracy_cancel_referendum_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'cancel_referendum', + 'call_args': { + 'ref_index': 1 + } + }) + + self.assertEqual(str(payload), "0x10040d0a04") + + def test_encode_democracy_clear_public_proposals_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'clear_public_proposals', + 'call_args': { + } + }) + + self.assertEqual(str(payload), "0x0c040d11") + + def test_encode_democracy_delegate_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'delegate', + 'call_args': { + 'conviction': 'None', + 'to': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), "0x90040d0f586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c40900") + + def test_encode_democracy_delegate_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'delegate', + 'call_args': { + 'conviction': 'None', + 'to': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), "0x90040d0f586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c40900") + + def test_encode_democracy_delegate_withconviction_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'delegate', + 'call_args': { + 'conviction': 'Locked5x', + 'to': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), "0x90040d0f586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c40905") + + def test_encode_democracy_delegate_withconviction_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'delegate', + 'call_args': { + 'conviction': 'Locked5x', + 'to': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), "0x90040d0f586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c40905") + + def test_encode_democracy_emergency_cancel_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'emergency_cancel', + 'call_args': { + 'ref_index': 1 + } + }) + + self.assertEqual(str(payload), "0x1c040d0401000000") + + def test_encode_democracy_external_propose_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'external_propose', + 'call_args': { + 'proposal_hash': '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' + } + }) + + self.assertEqual(str(payload), "0x8c040d050123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef") + + def test_encode_democracy_external_propose_default_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'external_propose_default', + 'call_args': { + 'proposal_hash': '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' + } + }) + + self.assertEqual(str(payload), "0x8c040d070123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef") + + def test_encode_democracy_external_propose_majority_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'external_propose_majority', + 'call_args': { + 'proposal_hash': '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' + } + }) + + self.assertEqual(str(payload), "0x8c040d060123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef") + + def test_encode_democracy_fast_track_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'fast_track', + 'call_args': { + 'delay': 2000, + 'proposal_hash': '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', + 'voting_period': 1000 + } + }) + + self.assertEqual(str(payload), + "0xac040d080123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefe8030000d0070000") + + def test_encode_democracy_note_imminent_preimage_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'note_imminent_preimage', + 'call_args': { + 'encoded_proposal': '0x00' + } + }) + + self.assertEqual(str(payload), "0x14040d130400") + + def test_encode_democracy_note_preimage_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'note_preimage', + 'call_args': { + 'encoded_proposal': '0x00' + } + }) + + self.assertEqual(str(payload), "0x14040d120400") + + def test_encode_democracy_propose_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'propose', + 'call_args': { + 'proposal_hash': '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', + 'value': 1000000000000 + } + }) + + self.assertEqual(str(payload), + "0xa4040d000123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef070010a5d4e8") + + def test_encode_democracy_proxy_vote_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'proxy_vote', + 'call_args': { + 'ref_index': 0, + 'vote': 128 + } + }) + + self.assertEqual(str(payload), "0x14040d030080") + + def test_encode_democracy_reap_preimage_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'reap_preimage', + 'call_args': { + 'proposal_hash': '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' + } + }) + + self.assertEqual(str(payload), "0x8c040d140123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef") + + def test_encode_democracy_remove_proxy_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'remove_proxy', + 'call_args': { + 'proxy': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), "0x8c040d0e586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_democracy_remove_proxy_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'remove_proxy', + 'call_args': { + 'proxy': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), "0x8c040d0e586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_democracy_resign_proxy_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'resign_proxy', + 'call_args': { + + } + }) + + self.assertEqual(str(payload), "0x0c040d0d") + + def test_encode_democracy_second_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'second', + 'call_args': { + 'proposal': 1 + } + }) + + self.assertEqual(str(payload), "0x10040d0104") + + def test_encode_democracy_set_proxy_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'set_proxy', + 'call_args': { + 'proxy': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), "0x8c040d0c586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_democracy_set_proxy_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'set_proxy', + 'call_args': { + 'proxy': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), "0x8c040d0c586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_democracy_undelegate_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'undelegate', + 'call_args': { + + } + }) + + self.assertEqual(str(payload), "0x0c040d10") + + def test_encode_democracy_veto_external_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'veto_external', + 'call_args': { + 'proposal_hash': '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' + } + }) + + self.assertEqual(str(payload), "0x8c040d090123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef") + + def test_encode_democracy_vote_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Democracy', + 'call_function': 'vote', + 'call_args': { + 'ref_index': 0, + 'vote': 128 + } + }) + + self.assertEqual(str(payload), "0x14040d020080") + + def test_encode_electionsphragmen_remove_member_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'ElectionsPhragmen', + 'call_function': 'remove_member', + 'call_args': { + 'who': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), "0x90041005ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_electionsphragmen_remove_member_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'ElectionsPhragmen', + 'call_function': 'remove_member', + 'call_args': { + 'who': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), "0x90041005ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_electionsphragmen_remove_voter_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'ElectionsPhragmen', + 'call_function': 'remove_voter', + 'call_args': { + + } + }) + + self.assertEqual(str(payload), "0x0c041001") + + def test_encode_electionsphragmen_renounce_candidacy_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'ElectionsPhragmen', + 'call_function': 'renounce_candidacy', + 'call_args': { + + } + }) + + self.assertEqual(str(payload), "0x0c041004") + + def test_encode_electionsphragmen_report_defunct_voter_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'ElectionsPhragmen', + 'call_function': 'report_defunct_voter', + 'call_args': { + 'target': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), "0x90041002ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_electionsphragmen_report_defunct_voter_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'ElectionsPhragmen', + 'call_function': 'report_defunct_voter', + 'call_args': { + 'target': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), "0x90041002ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_electionsphragmen_submit_candidacy_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'ElectionsPhragmen', + 'call_function': 'submit_candidacy', + 'call_args': { + + } + }) + + self.assertEqual(str(payload), "0x0c041003") + + def test_encode_electionsphragmen_vote_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'ElectionsPhragmen', + 'call_function': 'vote', + 'call_args': { + 'value': 1000000000000, + 'votes': ["0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409", + "0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409", + "0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409"] + } + }) + + self.assertEqual(str(payload), + "0xa9010410000c586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409070010a5d4e8") + + def test_encode_electionsphragmen_vote_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'ElectionsPhragmen', + 'call_function': 'vote', + 'call_args': { + 'value': 1000000000000, + 'votes': ["EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk", + "EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk", + "EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk"] + } + }) + + self.assertEqual(str(payload), + "0xa9010410000c586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409070010a5d4e8") + + def test_encode_finalitytracker_final_hint_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'FinalityTracker', + 'call_function': 'final_hint', + 'call_args': { + 'hint': 500000 + } + }) + + self.assertEqual(str(payload), "0x1c04090082841e00") + + def test_encode_grandpa_report_misbehavior_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Grandpa', + 'call_function': 'report_misbehavior', + 'call_args': { + '_report': '0x00' + } + }) + + self.assertEqual(str(payload), "0x14040a000400") + + def test_encode_identity_add_registrar_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'add_registrar', + 'call_args': { + 'account': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), "0x8c041900586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_identity_add_registrar_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'add_registrar', + 'call_args': { + 'account': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), "0x8c041900586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_identity_cancel_request_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'cancel_request', + 'call_args': { + 'reg_index': 1 + } + }) + + self.assertEqual(str(payload), "0x1c04190501000000") + + def test_encode_identity_clear_identity_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'clear_identity', + 'call_args': { + + } + }) + + self.assertEqual(str(payload), "0x0c041903") + + def test_encode_identity_kill_identity_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'kill_identity', + 'call_args': { + 'target': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), "0x9004190aff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_identity_kill_identity_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'kill_identity', + 'call_args': { + 'target': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), "0x9004190aff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_identity_provide_judgement_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'provide_judgement', + 'call_args': { + 'judgement': {"KnownGood": None}, + 'reg_index': 1, + 'target': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), + "0x9804190904ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c40903") + + def test_encode_identity_provide_judgement_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'provide_judgement', + 'call_args': { + 'judgement': {"KnownGood": None}, + 'reg_index': 1, + 'target': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), + "0x9804190904ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c40903") + + def test_encode_identity_request_judgement_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'request_judgement', + 'call_args': { + 'max_fee': 2000000000000, + 'reg_index': 1 + } + }) + + self.assertEqual(str(payload), "0x2c041904040b00204aa9d101") + + def test_encode_identity_set_account_id_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'set_account_id', + 'call_args': { + 'index': 1, + 'new': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), "0x9004190704586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_identity_set_account_id_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'set_account_id', + 'call_args': { + 'index': 1, + 'new': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), "0x9004190704586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_identity_set_fee_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'set_fee', + 'call_args': { + 'fee': 1000000000000, + 'index': 1 + } + }) + + self.assertEqual(str(payload), "0x2804190604070010a5d4e8") + + # TODO: Unable to determine default type for {"info":6,"type":"IdentityFields"} + def test_encode_identity_set_fields_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'set_fields', + 'call_args': { + 'fields': ['Display', 'Legal', 'Email', 'Twitter'], + 'index': 1 + } + }) + + self.assertEqual(str(payload), "0x30041908049300000000000000") + + def test_encode_identity_set_identity_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'set_identity', + 'call_args': { + 'info': { + "additional": [], + "display": {"Raw": "Test1"}, + "legal": {"Raw": "Test2"}, + "web": {"None": None}, + "riot": {"Raw": "Test3"}, + "email": {"None": None}, + "pgpFingerprint": None, + "image": {"None": None}, + "twitter": {"None": None} + } + } + }) + + self.assertEqual(str(payload), + "0x6c041901000654657374310654657374320006546573743300000000") + + def test_encode_identity_set_subs_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'set_subs', + 'call_args': { + 'subs': [ + ["0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409", {"None": None}], + ["0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409", {"Raw": "Test"}] + ] + } + }) + + self.assertEqual(str(payload), + "0x290104190208586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c40900586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c4090554657374") + + def test_encode_identity_set_subs_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Identity', + 'call_function': 'set_subs', + 'call_args': { + 'subs': [ + ["EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk", {"None": None}], + ["EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk", {"Raw": "Test"}] + ] + } + }) + + self.assertEqual(str(payload), + "0x290104190208586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c40900586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c4090554657374") + + def test_encode_imonline_heartbeat_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'ImOnline', + 'call_function': 'heartbeat', + 'call_args': { + 'heartbeat': {"blockNumber": 500000, "networkState": {"peerId": "0x012345", "externalAddresses": []}, + "sessionIndex": 1, "authorityIndex": 3}, + '_signature': '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' + } + }) + + self.assertEqual(str(payload), + "0x5101040b0020a107000c0123450001000000030000000123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef") + + def test_encode_parachains_set_heads_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Parachains', + 'call_function': 'set_heads', + 'call_args': { + 'heads': [{ + 'candidate': { + "parachainIndex": 1, + "collator": "0x0000000000000000000000000000000000000000000000000000000000000000", + "relayParent": "0x1ec24d8af5e02482f603722c203659c3373304098d26c6b65be03a2b9e79cc0d", + "signature": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", + "headData": "0x012345", + "balanceUploads": [], + "egressQueueRoots": [], + "fees": 0, + "povBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockDataHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "commitments": { + "fees": 0, + "upwardMessages": [], + "erasureRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValidationCode": None, + "processedDownwardMessages": 1 + } + }, + 'validityVotes': [], + 'validatorIndices': [] + }] + } + }) + + self.assertEqual(str(payload), + "0x910304140004010000001ec24d8af5e02482f603722c203659c3373304098d26c6b65be03a2b9e79cc0d0c01234500000000000000000000000000000000000000000000000000000000000000001234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000") + + def test_encode_registrar_deregister_para_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Registrar', + 'call_function': 'deregister_para', + 'call_args': { + 'id': 1 + } + }) + + self.assertEqual(str(payload), "0x1004170104") + + def test_encode_registrar_deregister_parathread_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Registrar', + 'call_function': 'deregister_parathread', + 'call_args': { + + } + }) + + self.assertEqual(str(payload), "0x0c041705") + + def test_encode_registrar_register_para_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Registrar', + 'call_function': 'register_para', + 'call_args': { + 'code': '0x00', + 'id': 1, + 'info': {"scheduling": "Always"}, + 'initial_head_data': '0x01' + } + }) + + self.assertEqual(str(payload), "0x24041700040004000401") + + def test_encode_registrar_register_parathread_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Registrar', + 'call_function': 'register_parathread', + 'call_args': { + 'code': '0x00', + 'initial_head_data': '0x01' + } + }) + + self.assertEqual(str(payload), "0x1c04170304000401") + + def test_encode_registrar_select_parathread_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Registrar', + 'call_function': 'select_parathread', + 'call_args': { + '_collator': '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', + '_head_hash': '0x0000000000000000000000000000000000000000000000000000000000000000', + '_id': 1 + } + }) + + self.assertEqual(str(payload), + "0x1101041704040123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0000000000000000000000000000000000000000000000000000000000000000") + + def test_encode_registrar_set_thread_count_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Registrar', + 'call_function': 'set_thread_count', + 'call_args': { + 'count': 1000 + } + }) + + self.assertEqual(str(payload), "0x1c041702e8030000") + + def test_encode_registrar_swap_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Registrar', + 'call_function': 'swap', + 'call_args': { + 'other': 1 + } + }) + + self.assertEqual(str(payload), "0x1004170604") + + def test_encode_session_set_keys_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Session', + 'call_function': 'set_keys', + 'call_args': { + 'keys': { + "grandpa": "EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk", + "babe": "EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk", + "im_online": "EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk", + "authority_discovery": "EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk", + "parachains": "EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk" + }, + 'proof': '0x01234567890abcdef01234567890abcdef01234567890abcdef01234567890abcdef01234567890abcdef01234567890abcdef01234567890abcdef01234567890abcdef' + } + }) + + self.assertEqual(str(payload), + "0xa503040800586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409110101234567890abcdef01234567890abcdef01234567890abcdef01234567890abcdef01234567890abcdef01234567890abcdef01234567890abcdef01234567890abcdef") + + def test_encode_slots_bid_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Slots', + 'call_function': 'bid', + 'call_args': { + 'amount': 1000000000000000, + 'auction_index': 2, + 'first_slot': 3, + 'last_slot': 4, + 'sub': 1 + } + }) + + self.assertEqual(str(payload), "0x3c04160104080c100f0080c6a47e8d03") + + def test_encode_slots_bid_renew_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Slots', + 'call_function': 'bid_renew', + 'call_args': { + 'amount': 1000000000000000, + 'auction_index': 1, + 'first_slot': 2, + 'last_slot': 3 + } + }) + + self.assertEqual(str(payload), "0x3804160204080c0f0080c6a47e8d03") + + def test_encode_slots_elaborate_deploy_data_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Slots', + 'call_function': 'elaborate_deploy_data', + 'call_args': { + 'code': '0x00', + 'para_id': 1 + } + }) + + self.assertEqual(str(payload), "0x18041605040400") + + def test_encode_slots_fix_deploy_data_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Slots', + 'call_function': 'fix_deploy_data', + 'call_args': { + 'code_hash': '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', + 'initial_head_data': '0x00', + 'para_id': 2, + 'sub': 1 + } + }) + + self.assertEqual(str(payload), + "0x9c04160404080123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0400") + + def test_encode_slots_new_auction_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Slots', + 'call_function': 'new_auction', + 'call_args': { + 'duration': 100000, + 'lease_period_index': 2 + } + }) + + self.assertEqual(str(payload), "0x20041600821a060008") + + def test_encode_slots_set_offboarding_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Slots', + 'call_function': 'set_offboarding', + 'call_args': { + 'dest': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), "0x90041603ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_slots_set_offboarding_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Slots', + 'call_function': 'set_offboarding', + 'call_args': { + 'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), "0x90041603ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_staking_bond_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'bond', + 'call_args': { + 'controller': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409', + 'payee': 'Staked', + 'value': 1000000000000 + } + }) + + self.assertEqual(str(payload), + "0xac040600ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409070010a5d4e800") + + def test_encode_staking_bond_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'bond', + 'call_args': { + 'controller': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'payee': 'Staked', + 'value': 1000000000000 + } + }) + + self.assertEqual(str(payload), + "0xac040600ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409070010a5d4e800") + + def test_encode_staking_bond_extra_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'bond_extra', + 'call_args': { + 'max_additional': 1000000000000 + } + }) + + self.assertEqual(str(payload), "0x24040601070010a5d4e8") + + def test_encode_staking_cancel_deferred_slash_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'cancel_deferred_slash', + 'call_args': { + 'era': 1, + 'slash_indices': [0, 1, 2] + } + }) + + self.assertEqual(str(payload), "0x5004060f010000000c000000000100000002000000") + + def test_encode_staking_chill_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'chill', + 'call_args': { + + } + }) + + self.assertEqual(str(payload), "0x0c040606") + + def test_encode_staking_force_new_era_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'force_new_era', + 'call_args': { + + } + }) + + self.assertEqual(str(payload), "0x0c04060b") + + def test_encode_staking_force_new_era_always_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'force_new_era_always', + 'call_args': { + + } + }) + + self.assertEqual(str(payload), "0x0c04060e") + + def test_encode_staking_force_no_eras_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'force_no_eras', + 'call_args': { + + } + }) + + self.assertEqual(str(payload), "0x0c04060a") + + def test_encode_staking_force_unstake_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'force_unstake', + 'call_args': { + 'stash': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), "0x8c04060d586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_staking_force_unstake_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'force_unstake', + 'call_args': { + 'stash': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), "0x8c04060d586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_staking_nominate_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'nominate', + 'call_args': { + 'targets': ['0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409'] + } + }) + + self.assertEqual(str(payload), "0x9404060504ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_staking_nominate_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'nominate', + 'call_args': { + 'targets': ['EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk'] + } + }) + + self.assertEqual(str(payload), "0x9404060504ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_staking_set_controller_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'set_controller', + 'call_args': { + 'controller': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), "0x90040608ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_staking_set_controller_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'set_controller', + 'call_args': { + 'controller': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), "0x90040608ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_staking_set_invulnerables_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'set_invulnerables', + 'call_args': { + 'validators': ['0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409', + '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409'] + } + }) + + self.assertEqual(str(payload), + "0x110104060c08586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_staking_set_invulnerables_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'set_invulnerables', + 'call_args': { + 'validators': ['EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk'] + } + }) + + self.assertEqual(str(payload), + "0x110104060c08586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_staking_set_payee_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'set_payee', + 'call_args': { + 'payee': 'Staked' + } + }) + + self.assertEqual(str(payload), "0x1004060700") + + def test_encode_staking_set_validator_count_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'set_validator_count', + 'call_args': { + 'new': 150 + } + }) + + self.assertEqual(str(payload), "0x140406095902") + + def test_encode_staking_unbond_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'unbond', + 'call_args': { + 'value': 1000000000000 + } + }) + + self.assertEqual(str(payload), "0x24040602070010a5d4e8") + + def test_encode_staking_validate_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'validate', + 'call_args': { + 'prefs': {"commission": 100} + } + }) + + self.assertEqual(str(payload), "0x140406049101") + + def test_encode_staking_withdraw_unbonded_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Staking', + 'call_function': 'withdraw_unbonded', + 'call_args': { + + } + }) + + self.assertEqual(str(payload), "0x0c040603") + + def test_encode_system_fill_block_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'System', + 'call_function': 'fill_block', + 'call_args': { + + } + }) + + self.assertEqual(str(payload), "0x0c040000") + + def test_encode_system_kill_prefix_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'System', + 'call_function': 'kill_prefix', + 'call_args': { + 'prefix': '0x012345' + } + }) + + self.assertEqual(str(payload), "0x1c0400060c012345") + + def test_encode_system_kill_storage_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'System', + 'call_function': 'kill_storage', + 'call_args': { + 'keys': ['0x0123456789abcdef', '0x0123456789abcdef'] + } + }) + + self.assertEqual(str(payload), "0x5804000508200123456789abcdef200123456789abcdef") + + def test_encode_system_remark_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'System', + 'call_function': 'remark', + 'call_args': { + '_remark': '0x012345' + } + }) + + self.assertEqual(str(payload), "0x1c0400010c012345") + + def test_encode_system_set_code_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'System', + 'call_function': 'set_code', + 'call_args': { + 'new': '0x012345' + } + }) + + self.assertEqual(str(payload), "0x1c0400030c012345") + + def test_encode_system_set_heap_pages_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'System', + 'call_function': 'set_heap_pages', + 'call_args': { + 'pages': 100 + } + }) + + self.assertEqual(str(payload), "0x2c0400026400000000000000") + + def test_encode_system_set_storage_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'System', + 'call_function': 'set_storage', + 'call_args': { + 'items': [['key', 'value']] + } + }) + + self.assertEqual(str(payload), "0x38040004040c6b65791476616c7565") + + def test_encode_technicalcommittee_execute_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'TechnicalCommittee', + 'call_function': 'execute', + 'call_args': { + 'proposal': { + 'call_module': 'System', + 'call_function': 'remark', + 'call_args': { + '_remark': '0x0123456789' + } + } + } + }) + + self.assertEqual(str(payload), "0x2c040f010001140123456789") + + def test_encode_technicalcommittee_propose_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'TechnicalCommittee', + 'call_function': 'propose', + 'call_args': { + 'proposal': { + 'call_module': 'System', + 'call_function': 'remark', + 'call_args': { + '_remark': '0x0123456789' + } + }, + 'threshold': 7 + } + }) + + self.assertEqual(str(payload), "0x30040f021c0001140123456789") + + def test_encode_technicalcommittee_set_members_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'TechnicalCommittee', + 'call_function': 'set_members', + 'call_args': { + 'new_members': ['0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409', + '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409'] + } + }) + + self.assertEqual(str(payload), + "0x1101040f0008586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_technicalcommittee_set_members_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'TechnicalCommittee', + 'call_function': 'set_members', + 'call_args': { + 'new_members': ['EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk'] + } + }) + + self.assertEqual(str(payload), + "0x1101040f0008586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_technicalcommittee_vote_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'TechnicalCommittee', + 'call_function': 'vote', + 'call_args': { + 'approve': True, + 'index': 1, + 'proposal': '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' + } + }) + + self.assertEqual(str(payload), "0x94040f030123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0401") + + def test_encode_technicalmembership_add_member_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'TechnicalMembership', + 'call_function': 'add_member', + 'call_args': { + 'who': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), "0x8c041100586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_technicalmembership_add_member_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'TechnicalMembership', + 'call_function': 'add_member', + 'call_args': { + 'who': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), "0x8c041100586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_technicalmembership_change_key_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'TechnicalMembership', + 'call_function': 'change_key', + 'call_args': { + 'new': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), "0x8c041104586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_technicalmembership_change_key_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'TechnicalMembership', + 'call_function': 'change_key', + 'call_args': { + 'new': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), "0x8c041104586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_technicalmembership_remove_member_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'TechnicalMembership', + 'call_function': 'remove_member', + 'call_args': { + 'who': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), "0x8c041101586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_technicalmembership_remove_member_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'TechnicalMembership', + 'call_function': 'remove_member', + 'call_args': { + 'who': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), "0x8c041101586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_technicalmembership_reset_members_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'TechnicalMembership', + 'call_function': 'reset_members', + 'call_args': { + 'members': ['0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409', + '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409'] + } + }) + + self.assertEqual(str(payload), + "0x110104110308586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_technicalmembership_reset_members_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'TechnicalMembership', + 'call_function': 'reset_members', + 'call_args': { + 'members': ['EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk'] + } + }) + + self.assertEqual(str(payload), + "0x110104110308586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_technicalmembership_swap_member_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'TechnicalMembership', + 'call_function': 'swap_member', + 'call_args': { + 'add': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409', + 'remove': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + } + }) + + self.assertEqual(str(payload), + "0x0d01041102586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_technicalmembership_swap_member_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'TechnicalMembership', + 'call_function': 'swap_member', + 'call_args': { + 'add': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'remove': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk' + } + }) + + self.assertEqual(str(payload), + "0x0d01041102586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_timestamp_set_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Timestamp', + 'call_function': 'set', + 'call_args': { + 'now': 1 + } + }) + + self.assertEqual(str(payload), "0x1004020004") + + def test_encode_treasury_approve_proposal_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Treasury', + 'call_function': 'approve_proposal', + 'call_args': { + 'proposal_id': 1 + } + }) + + self.assertEqual(str(payload), "0x1004120204") + + def test_encode_treasury_propose_spend_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Treasury', + 'call_function': 'propose_spend', + 'call_args': { + 'beneficiary': '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409', + 'value': 1000000000000 + } + }) + + self.assertEqual(str(payload), + "0xa8041200070010a5d4e8ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_treasury_propose_spend_ss58_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Treasury', + 'call_function': 'propose_spend', + 'call_args': { + 'beneficiary': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'value': 1000000000000 + } + }) + + self.assertEqual(str(payload), + "0xa8041200070010a5d4e8ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409") + + def test_encode_treasury_reject_proposal_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Treasury', + 'call_function': 'reject_proposal', + 'call_args': { + 'proposal_id': 1 + } + }) + + self.assertEqual(str(payload), "0x1004120104") + + def test_encode_utility_approve_as_multi_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Utility', + 'call_function': 'approve_as_multi', + 'call_args': { + 'call_hash': '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', + 'maybe_timepoint': { + 'height': 444, + 'index': 10 + }, + 'other_signatories': ['EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk'], + 'threshold': 4 + } + }) + + self.assertEqual(str(payload), "0x3d01041803040004586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c40901bc0100000a0000000123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef") + + def test_encode_utility_as_multi_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Utility', + 'call_function': 'as_multi', + 'call_args': { + 'call': { + 'call_module': 'System', + 'call_function': 'remark', + 'call_args': { + '_remark': '0x0123456789' + } + }, + 'maybe_timepoint': None, + 'other_signatories': [], + 'threshold': 5 + } + }) + + self.assertEqual(str(payload), + "0x3c041802050000000001140123456789") + + def test_encode_utility_as_sub_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Utility', + 'call_function': 'as_sub', + 'call_args': { + 'call': { + 'call_module': 'System', + 'call_function': 'remark', + 'call_args': { + '_remark': '0x0123456789' + } + }, + 'index': 2 + } + }) + + self.assertEqual(str(payload), "0x3404180102000001140123456789") + + def test_encode_utility_batch_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Utility', + 'call_function': 'batch', + 'call_args': { + 'calls': [{ + 'call_module': 'Balances', + 'call_function': 'transfer', + 'call_args': { + 'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'value': 1000000000000 + } + }] + } + }) + + self.assertEqual(str(payload), "0xb4041800040400ff586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409070010a5d4e8") + + def test_encode_utility_cancel_as_multi_payload(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + payload = extrinsic.encode({ + 'call_module': 'Utility', + 'call_function': 'cancel_as_multi', + 'call_args': { + 'call_hash': '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', + 'other_signatories': [], + 'threshold': 5, + 'timepoint': { + 'height': 10000, + 'index': 1 + } + } + }) + + self.assertEqual(str(payload), "0xb804180405000010270000010000000123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef") + + def test_signed_extrinsic(self): + extrinsic = ExtrinsicsDecoder(metadata=self.metadata_decoder) + + extrinsic_value = { + 'account_id': '5E9oDs9PjpsBbxXxRE9uMaZZhnBAV38n2ouLB28oecBDdeQo', + 'signature_version': 1, + 'signature': '728b4057661816aa24918219ff90d10a34f1db4e81494d23c83ef54991980f77cf901acd970cb36d3c9c9e166d27a83a3aee648d4085e2bdb9e7622c0538e381', + 'call_function': 'transfer', + 'call_module': 'balances', + 'nonce': 0, + 'era': '00', + 'tip': 0, + 'params': [ + {'name': 'dest', 'type': 'Address', + 'value': '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'}, + {'name': 'value', 'type': 'Compact', 'value': 1000000000000} + ] + } + + extrinsic_hex = extrinsic.encode(extrinsic_value) + + obj = ScaleDecoder.get_decoder_class( + "ExtrinsicsDecoder", + data=extrinsic_hex, + metadata=self.metadata_decoder + ) + + decoded_extrinsic = obj.decode() + + self.assertEqual(extrinsic_value['signature'], decoded_extrinsic['signature']) + self.assertEqual(extrinsic_value['params'][0]['value'], decoded_extrinsic['params'][0]['value']) + + def test_decode_mortal_extrinsic(self): + RuntimeConfiguration().update_type_registry(load_type_registry_preset("substrate-node-template")) + + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_substrate_node_template)) + metadata_decoder.decode() + + extrinsic_scale = '0x4102841c0d1aa34c4be7eaddc924b30bab35e45ec22307f2f7304d6e5f9c8f3753de560186be385b2f7b25525518259b00e6b8a61e7e821544f102dca9b6d89c60fc327922229c975c2fa931992b17ab9d5b26f9848eeeff44e0333f6672a98aa8b113836935040005031c0d1aa34c4be7eaddc924b30bab35e45ec22307f2f7304d6e5f9c8f3753de560f0080c6a47e8d03' + + extrinsic = ExtrinsicsDecoder(metadata=metadata_decoder, data=ScaleBytes(extrinsic_scale)) + extrinsic.decode() + + self.assertEqual(extrinsic.call.name, 'transfer_keep_alive') + + era_obj = ScaleDecoder.get_decoder_class('Era') + era_obj.encode({'period': 666, 'current': 4950}) + + self.assertEqual(extrinsic.era.period, era_obj.period) + self.assertEqual(extrinsic.era.phase, era_obj.phase) + self.assertEqual('0x{}'.format(extrinsic.era.raw_value), str(era_obj.data)) + + # Check lifetime of transaction + self.assertEqual(extrinsic.era.birth(4955), 4950) + self.assertEqual(extrinsic.era.death(4955), 5974) + + def test_encode_mortal_extrinsic(self): + RuntimeConfiguration().update_type_registry(load_type_registry_preset("substrate-node-template")) + + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_substrate_node_template)) + metadata_decoder.decode() + + extrinsic = ExtrinsicsDecoder(metadata=metadata_decoder) + + extrinsic_value = { + 'account_id': '5ChV6DCRkvaTfwNHsiE2y3oQyPwTJqDPmhEUoEx1t1dupThE', + 'signature_version': 1, + 'signature': '0x86be385b2f7b25525518259b00e6b8a61e7e821544f102dca9b6d89c60fc327922229c975c2fa931992b17ab9d5b26f9848eeeff44e0333f6672a98aa8b11383', + 'call_function': 'transfer_keep_alive', + 'call_module': 'balances', + 'nonce': 1, + 'era': {'period': 666, 'current': 4950}, + 'tip': 0, + 'params': [ + {'name': 'dest', 'type': 'Address', + 'value': '5ChV6DCRkvaTfwNHsiE2y3oQyPwTJqDPmhEUoEx1t1dupThE'}, + {'name': 'value', 'type': 'Compact', 'value': 1000000000000000} + ] + } + + extrinsic_hex = extrinsic.encode(extrinsic_value) + extrinsic_scale = '0x4102841c0d1aa34c4be7eaddc924b30bab35e45ec22307f2f7304d6e5f9c8f3753de560186be385b2f7b25525518259b00e6b8a61e7e821544f102dca9b6d89c60fc327922229c975c2fa931992b17ab9d5b26f9848eeeff44e0333f6672a98aa8b113836935040005031c0d1aa34c4be7eaddc924b30bab35e45ec22307f2f7304d6e5f9c8f3753de560f0080c6a47e8d03' + + self.assertEqual(str(extrinsic_hex), extrinsic_scale) diff --git a/py-scale-codec/test/test_metadata.py b/py-scale-codec/test/test_metadata.py new file mode 100644 index 00000000..fcaf89a9 --- /dev/null +++ b/py-scale-codec/test/test_metadata.py @@ -0,0 +1,134 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest + +from scalecodec.base import ScaleBytes, RuntimeConfiguration, ScaleDecoder +from scalecodec.metadata import MetadataDecoder +from scalecodec.type_registry import load_type_registry_preset +from test.fixtures import metadata_v3_hex, metadata_v2_hex, metadata_v1_hex, invalid_metadata_v1_hex, metadata_v12_hex, \ + metadata_v11_hex, metadata_v10_hex, metadata_v9_hex + + +class TestMetadata(unittest.TestCase): + + @classmethod + def setUpClass(cls): + RuntimeConfiguration().clear_type_registry() + RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) + + def test_decode_metadata_v3(self): + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v3_hex)) + metadata_decoder.decode() + self.assertEqual(metadata_decoder.version.value, "MetadataV3Decoder") + + def test_decode_metadata_v2(self): + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v2_hex)) + metadata_decoder.decode() + self.assertEqual(metadata_decoder.version.value, "MetadataV2Decoder") + + def test_decode_metadata_v1(self): + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v1_hex)) + metadata_decoder.decode() + self.assertEqual(metadata_decoder.version.value, "MetadataV1Decoder") + + def test_decode_invalid_metadata_v1(self): + metadata_decoder = MetadataDecoder(ScaleBytes(invalid_metadata_v1_hex)) + self.assertRaises(Exception, metadata_decoder.decode) + + def test_all_scale_type_supported_v1(self): + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v1_hex)) + metadata_decoder.decode() + self.assertEqual(metadata_decoder.version.value, "MetadataV1Decoder") + + for module in metadata_decoder.metadata.modules: + if module.calls: + for call in module.calls: + for arg in call.args: + decoder_class = ScaleDecoder.get_decoder_class(arg.type) + self.assertIsNotNone(decoder_class, msg='{} is not supported by metadata'.format(arg.type)) + + def test_all_scale_type_supported_v2(self): + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v2_hex)) + metadata_decoder.decode() + self.assertEqual(metadata_decoder.version.value, "MetadataV2Decoder") + + for module in metadata_decoder.metadata.modules: + if module.calls: + for call in module.calls: + for arg in call.args: + decoder_class = ScaleDecoder.get_decoder_class(arg.type) + self.assertIsNotNone(decoder_class, msg='{} is not supported by metadata'.format(arg.type)) + + def test_all_scale_type_supported_v3(self): + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v3_hex)) + metadata_decoder.decode() + self.assertEqual(metadata_decoder.version.value, "MetadataV3Decoder") + + for module in metadata_decoder.metadata.modules: + if module.calls: + for call in module.calls: + for arg in call.args: + decoder_class = ScaleDecoder.get_decoder_class(arg.type) + self.assertIsNotNone(decoder_class, msg='{} is not supported by metadata'.format(arg.type)) + + def test_metadata_v9(self): + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v9_hex)) + metadata_decoder.decode() + self.assertEqual(metadata_decoder.version.value, "MetadataV9Decoder") + + for module in metadata_decoder.metadata.modules: + if module.calls: + for call in module.calls: + for arg in call.args: + decoder_class = ScaleDecoder.get_decoder_class(arg.type) + self.assertIsNotNone(decoder_class, msg='{} is not supported by metadata'.format(arg.type)) + + def test_metadata_v10(self): + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v10_hex)) + metadata_decoder.decode() + self.assertEqual(metadata_decoder.version.value, "MetadataV10Decoder") + + for module in metadata_decoder.metadata.modules: + if module.calls: + for call in module.calls: + for arg in call.args: + decoder_class = ScaleDecoder.get_decoder_class(arg.type) + self.assertIsNotNone(decoder_class, msg='{} is not supported by metadata'.format(arg.type)) + + def test_metadata_v11(self): + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v11_hex)) + metadata_decoder.decode() + self.assertEqual(metadata_decoder.version.value, "MetadataV11Decoder") + + for module in metadata_decoder.metadata.modules: + if module.calls: + for call in module.calls: + for arg in call.args: + decoder_class = ScaleDecoder.get_decoder_class(arg.type) + self.assertIsNotNone(decoder_class, msg='{} is not supported by metadata'.format(arg.type)) + + def test_metadata_v12(self): + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v12_hex)) + metadata_decoder.decode() + self.assertEqual(metadata_decoder.version.value, "MetadataV12Decoder") + + for module in metadata_decoder.metadata.modules: + if module.calls: + for call in module.calls: + for arg in call.args: + decoder_class = ScaleDecoder.get_decoder_class(arg.type) + self.assertIsNotNone(decoder_class, msg='{} is not supported by metadata'.format(arg.type)) diff --git a/py-scale-codec/test/test_runtime_configuration.py b/py-scale-codec/test/test_runtime_configuration.py new file mode 100644 index 00000000..b31541ce --- /dev/null +++ b/py-scale-codec/test/test_runtime_configuration.py @@ -0,0 +1,41 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# test_runtime_configuration.py +# + +import unittest + +from scalecodec.base import RuntimeConfiguration +from scalecodec.type_registry import load_type_registry_preset + + +class TestScaleDecoderClasses(unittest.TestCase): + + @classmethod + def setUpClass(cls): + RuntimeConfiguration().clear_type_registry() + RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) + + def test_valid_decoding_classes(self): + for type_string in RuntimeConfiguration().type_registry['types'].keys(): + self.assertIsNotNone(RuntimeConfiguration().get_decoder_class( + type_string), msg='"{}" didn\'t return decoding class'.format(type_string) + ) + + +if __name__ == '__main__': + unittest.main() diff --git a/py-scale-codec/test/test_scale_types.py b/py-scale-codec/test/test_scale_types.py new file mode 100644 index 00000000..6ef5dc7e --- /dev/null +++ b/py-scale-codec/test/test_scale_types.py @@ -0,0 +1,397 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import datetime +import unittest + +from scalecodec.metadata import MetadataDecoder + +from scalecodec.base import ScaleDecoder, ScaleBytes, RemainingScaleBytesNotEmptyException, \ + InvalidScaleTypeValueException, RuntimeConfiguration +from scalecodec.type_registry import load_type_registry_preset +from scalecodec.utils.ss58 import ss58_encode, ss58_decode, ss58_decode_account_index, ss58_encode_account_index +from test.fixtures import metadata_v10_hex + + +class TestScaleTypes(unittest.TestCase): + + @classmethod + def setUpClass(cls): + RuntimeConfiguration().clear_type_registry() + RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) + RuntimeConfiguration().update_type_registry(load_type_registry_preset("kusama")) + RuntimeConfiguration().set_active_spec_version_id(1045) + + cls.metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v10_hex)) + cls.metadata_decoder.decode() + + def test_compact_u32(self): + obj = ScaleDecoder.get_decoder_class('Compact', ScaleBytes("0x02093d00")) + obj.decode() + self.assertEqual(obj.value, 1000000) + + def test_compact_u32_1byte(self): + obj = ScaleDecoder.get_decoder_class('Compact', ScaleBytes("0x18")) + obj.decode() + self.assertEqual(obj.value, 6) + + def test_compact_u32_remaining_bytes(self): + obj = ScaleDecoder.get_decoder_class('Compact', ScaleBytes("0x02093d0001")) + self.assertRaises(RemainingScaleBytesNotEmptyException, obj.decode) + + # TODO: fix this test + # def test_compact_u32_invalid(self): + # obj = ScaleDecoder.get_decoder_class('Compact', ScaleBytes("0x")) + # self.assertRaises(InvalidScaleTypeValueException, obj.decode) + + def test_u16(self): + obj = ScaleDecoder.get_decoder_class('u16', ScaleBytes("0x2efb")) + obj.decode() + self.assertEqual(obj.value, 64302) + + def test_i16(self): + obj = ScaleDecoder.get_decoder_class('i16', ScaleBytes("0x2efb")) + obj.decode() + self.assertEqual(obj.value, -1234) + + def test_compact_bool_true(self): + obj = ScaleDecoder.get_decoder_class('bool', ScaleBytes("0x01")) + obj.decode() + self.assertEqual(obj.value, True) + + def test_compact_bool_false(self): + obj = ScaleDecoder.get_decoder_class('bool', ScaleBytes("0x00")) + obj.decode() + self.assertEqual(obj.value, False) + + def test_compact_bool_invalid(self): + obj = ScaleDecoder.get_decoder_class('bool', ScaleBytes("0x02")) + self.assertRaises(InvalidScaleTypeValueException, obj.decode) + + def test_vec_accountid(self): + obj = ScaleDecoder.get_decoder_class( + 'Vec', + ScaleBytes("0x0865d2273adeb04478658e183dc5edf41f1d86e42255442af62e72dbf1e6c0b97765d2273adeb04478658e183dc5edf41f1d86e42255442af62e72dbf1e6c0b977") + ) + obj.decode() + self.assertListEqual(obj.value, [ + '0x65d2273adeb04478658e183dc5edf41f1d86e42255442af62e72dbf1e6c0b977', + '0x65d2273adeb04478658e183dc5edf41f1d86e42255442af62e72dbf1e6c0b977' + ]) + + def test_validatorprefs_struct(self): + obj = ScaleDecoder.get_decoder_class('ValidatorPrefsLegacy', ScaleBytes("0x0c00")) + obj.decode() + self.assertEqual(obj.value, {'unstakeThreshold': 3, 'validatorPayment': 0}) + + def test_implied_struct(self): + obj = ScaleDecoder.get_decoder_class('(Compact,Compact)', ScaleBytes("0x0c00")) + obj.decode() + self.assertEqual(obj.value, {"col1": 3, "col2": 0}) + + def test_address(self): + obj = ScaleDecoder.get_decoder_class( + 'Address', + ScaleBytes("0xff1fa9d1bd1db014b65872ee20aee4fd4d3a942d95d3357f463ea6c799130b6318") + ) + obj.decode() + self.assertEqual(obj.value, '1fa9d1bd1db014b65872ee20aee4fd4d3a942d95d3357f463ea6c799130b6318') + + def test_moment(self): + obj = ScaleDecoder.get_decoder_class('Compact', ScaleBytes("0x03d68b655c")) + obj.decode() + self.assertEqual(obj.value, datetime.datetime(2019, 2, 14, 15, 40, 6)) + + def test_balance(self): + obj = ScaleDecoder.get_decoder_class('Compact', ScaleBytes("0x130080cd103d71bc22")) + obj.decode() + self.assertEqual(obj.value, 2503000000000000000) + + def test_type_registry(self): + # Example type SpecificTestType only define in type registry 'default' + self.assertRaises(NotImplementedError, ScaleDecoder.get_decoder_class, 'SpecificTestType', ScaleBytes("0x01000000")) + + RuntimeConfiguration().update_type_registry(load_type_registry_preset("test")) + + obj = ScaleDecoder.get_decoder_class('SpecificTestType', ScaleBytes("0x06000000")) + obj.decode() + self.assertEqual(obj.value, 6) + + def test_type_registry_overloading(self): + # Type BlockNumber defined as U32 in type registry 'kusama' + RuntimeConfiguration().update_type_registry(load_type_registry_preset("kusama")) + + obj = ScaleDecoder.get_decoder_class('BlockNumber', ScaleBytes("0x0000000000000001")) + self.assertRaises(RemainingScaleBytesNotEmptyException, obj.decode) + + # Type BlockNumber changed to U64 in type registry 'test' + RuntimeConfiguration().update_type_registry(load_type_registry_preset("test")) + + obj = ScaleDecoder.get_decoder_class('BlockNumber', ScaleBytes("0x0000000000000001")) + obj.decode() + self.assertEqual(obj.value, 72057594037927936) + + def test_unknown_decoder_class(self): + self.assertRaises(NotImplementedError, ScaleDecoder.get_decoder_class, 'UnknownType123', ScaleBytes("0x0c00")) + + def test_unknown_dynamic_type(self): + RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) + + # Create set type with u32 + self.assertRaises(NotImplementedError, RuntimeConfiguration().update_type_registry, { + "types": { + "UnknownType": { + "type": "unknown", + "value_a": "u32", + "value_b": { + "Value1": 1, + "Value2": 2 + } + } + } + }) + + def test_dynamic_set(self): + RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) + + obj = ScaleDecoder.get_decoder_class('WithdrawReasons', ScaleBytes("0x0100000000000000")) + obj.decode() + + self.assertEqual(obj.value, ["TransactionPayment"]) + + obj = ScaleDecoder.get_decoder_class('WithdrawReasons', ScaleBytes("0x0300000000000000")) + obj.decode() + + self.assertEqual(obj.value, ["TransactionPayment", "Transfer"]) + + obj = ScaleDecoder.get_decoder_class('WithdrawReasons', ScaleBytes("0x1600000000000000")) + obj.decode() + + self.assertEqual(obj.value, ["Transfer", "Reserve", "Tip"]) + + def test_set_value_type_u32(self): + RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) + + # Create set type with u32 + RuntimeConfiguration().update_type_registry({ + "types": { + "CustomU32Set": { + "type": "set", + "value_type": "u32", + "value_list": { + "Value1": 1, + "Value2": 2, + "Value3": 4, + "Value4": 8, + "Value5": 16 + } + } + } + }) + + obj = ScaleDecoder.get_decoder_class('CustomU32Set', ScaleBytes("0x0100000000000000")) + self.assertRaises(RemainingScaleBytesNotEmptyException, obj.decode) + + obj = ScaleDecoder.get_decoder_class('CustomU32Set', ScaleBytes("0x01000000")) + obj.decode() + + self.assertEqual(obj.value, ["Value1"]) + + obj = ScaleDecoder.get_decoder_class('CustomU32Set', ScaleBytes("0x03000000")) + obj.decode() + + self.assertEqual(obj.value, ["Value1", "Value2"]) + + obj = ScaleDecoder.get_decoder_class('CustomU32Set', ScaleBytes("0x16000000")) + obj.decode() + + self.assertEqual(obj.value, ["Value2", "Value3", "Value5"]) + + def test_box_call(self): + RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) + + scale_value = ScaleBytes("0x0400ff6e57561de4b4e63f0af8bf336008252a9597e5cdcb7622c72de4ff39731c5402070010a5d4e8") + + obj = ScaleDecoder.get_decoder_class('Box', scale_value, metadata=self.metadata_decoder) + value = obj.decode() + + self.assertEqual(value['call_function'], 'transfer') + self.assertEqual(value['call_module'], 'Balances') + self.assertEqual(value['call_args'][0]['value'], '0x6e57561de4b4e63f0af8bf336008252a9597e5cdcb7622c72de4ff39731c5402') + self.assertEqual(value['call_args'][1]['value'], 1000000000000) + + def test_parse_subtype(self): + RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) + + obj = ScaleDecoder.get_decoder_class('(BalanceOf, Vec<(AccountId, Data)>)') + + self.assertEqual(obj.type_mapping[0][1].lower(), "BalanceOf".lower()) + self.assertEqual(obj.type_mapping[1][1].lower(), "Vec<(AccountId, Data)>".lower()) + + obj = ScaleDecoder.get_decoder_class('Vec>') + + self.assertEqual(obj.sub_type, "UncleEntryItem".lower()) + + def test_dynamic_fixed_array_type_decode(self): + obj = ScaleDecoder.get_decoder_class('[u32; 1]', data=ScaleBytes("0x01000000")) + self.assertEqual([1], obj.decode()) + + obj = ScaleDecoder.get_decoder_class('[u32; 3]', data=ScaleBytes("0x010000000200000003000000")) + self.assertEqual([1, 2, 3], obj.decode()) + + obj = ScaleDecoder.get_decoder_class('[u32; 0]', data=ScaleBytes(bytes())) + self.assertEqual([], obj.decode()) + + def test_dynamic_fixed_array_type_decode_u8(self): + obj = ScaleDecoder.get_decoder_class('[u8; 65]', data=ScaleBytes("0xc42b82d02bce3202f6a05d4b06d1ad46963d3be36fd0528bbe90e7f7a4e5fcd38d14234b1c9fcee920d76cfcf43b4ed5dd718e357c2bc1aae3a642975207e67f01")) + self.assertEqual('0xc42b82d02bce3202f6a05d4b06d1ad46963d3be36fd0528bbe90e7f7a4e5fcd38d14234b1c9fcee920d76cfcf43b4ed5dd718e357c2bc1aae3a642975207e67f01', obj.decode()) + + def test_dynamic_fixed_array_type_encode_u8(self): + obj = ScaleDecoder.get_decoder_class('[u8; 1]') + self.assertEqual('0x01', str(obj.encode('0x01'))) + + def test_dynamic_fixed_array_type_encode(self): + obj = ScaleDecoder.get_decoder_class('[u32; 1]') + self.assertEqual('0x0100000002000000', str(obj.encode([1, 2]))) + + obj = ScaleDecoder.get_decoder_class('[u8; 3]') + self.assertEqual('0x010203', str(obj.encode('0x010203'))) + + def test_invalid_fixed_array_type_encode(self): + obj = ScaleDecoder.get_decoder_class('[u8; 3]') + self.assertRaises(ValueError, obj.encode, '0x0102') + + obj = ScaleDecoder.get_decoder_class('[u32; 3]') + self.assertRaises(ValueError, obj.encode, '0x0102') + + def test_custom_tuple(self): + obj = ScaleDecoder.get_decoder_class('(u8,u8)', ScaleBytes("0x0102")) + self.assertEqual({'col1': 1, 'col2': 2}, obj.decode()) + + def test_create_multi_sig_address(self): + MultiAccountId = RuntimeConfiguration().get_decoder_class("MultiAccountId") + + multi_sig_account = MultiAccountId.create_from_account_list( + ["CdVuGwX71W4oRbXHsLuLQxNPns23rnSSiZwZPN4etWf6XYo", + "J9aQobenjZjwWtU2MsnYdGomvcYbgauCnBeb8xGrcqznvJc", + "HvqnQxDQbi3LL2URh7WQfcmi8b2ZWfBhu7TEDmyyn5VK8e2"], 2) + + multi_sig_address = ss58_encode(multi_sig_account.value.replace('0x', ''), 2) + + self.assertEqual(multi_sig_address, "HFXXfXavDuKhLLBhFQTat2aaRQ5CMMw9mwswHzWi76m6iLt") + + def test_opaque_call(self): + + opaque_call_obj = ScaleDecoder.get_decoder_class('OpaqueCall', metadata=self.metadata_decoder) + + call_value = { + 'call_module': 'System', + 'call_function': 'remark', + 'call_args': { + '_remark': '0x0123456789' + } + } + + scale_data = opaque_call_obj.encode(call_value) + + self.assertEqual(str(scale_data), '0x200001140123456789') + + opaque_call_obj = ScaleDecoder.get_decoder_class('OpaqueCall', data=scale_data, metadata=self.metadata_decoder) + + value = opaque_call_obj.decode() + + self.assertEqual(value['call_function'], 'remark') + self.assertEqual(value['call_module'], 'System') + self.assertEqual(value['call_args'][0]['value'], '0x0123456789') + self.assertEqual(value['call_args'][0]['name'], '_remark') + + def test_era_immortal(self): + obj = ScaleDecoder.get_decoder_class('Era', ScaleBytes('0x00')) + obj.decode() + self.assertEqual(obj.value, '00') + self.assertIsNone(obj.period) + self.assertIsNone(obj.phase) + + def test_era_mortal(self): + obj = ScaleDecoder.get_decoder_class('Era', ScaleBytes('0x4e9c')) + obj.decode() + self.assertTupleEqual(obj.value, (32768, 20000)) + self.assertEqual(obj.period, 32768) + self.assertEqual(obj.phase, 20000) + + obj = ScaleDecoder.get_decoder_class('Era', ScaleBytes('0xc503')) + obj.decode() + self.assertTupleEqual(obj.value, (64, 60)) + self.assertEqual(obj.period, 64) + self.assertEqual(obj.phase, 60) + + obj = ScaleDecoder.get_decoder_class('Era', ScaleBytes('0x8502')) + obj.decode() + self.assertTupleEqual(obj.value, (64, 40)) + self.assertEqual(obj.period, 64) + self.assertEqual(obj.phase, 40) + + def test_era_methods(self): + obj = ScaleDecoder.get_decoder_class('Era') + obj.encode('00') + self.assertTrue(obj.is_immortal()) + self.assertEqual(obj.birth(1400), 0) + self.assertEqual(obj.death(1400), 2**64 - 1) + + obj = ScaleDecoder.get_decoder_class('Era') + obj.encode((256, 120)) + self.assertFalse(obj.is_immortal()) + self.assertEqual(obj.birth(1400), 1400) + self.assertEqual(obj.birth(1410), 1400) + self.assertEqual(obj.birth(1399), 1144) + self.assertEqual(obj.death(1400), 1656) + + def test_era_invalid_encode(self): + obj = ScaleDecoder.get_decoder_class('Era') + self.assertRaises(ValueError, obj.encode, (1, 120)) + self.assertRaises(ValueError, obj.encode, ('64', 60)) + self.assertRaises(ValueError, obj.encode, 'x') + self.assertRaises(ValueError, obj.encode, {'phase': 2}) + self.assertRaises(ValueError, obj.encode, {'period': 2}) + + def test_era_invalid_decode(self): + obj = ScaleDecoder.get_decoder_class('Era', ScaleBytes('0x0101')) + self.assertRaises(ValueError, obj.decode) + + def test_multiaddress_ss58_address_as_str(self): + obj = ScaleDecoder.get_decoder_class('Multiaddress') + ss58_address = "CdVuGwX71W4oRbXHsLuLQxNPns23rnSSiZwZPN4etWf6XYo" + + public_key = ss58_decode(ss58_address) + + data = obj.encode(ss58_address) + decode_obj = ScaleDecoder.get_decoder_class('Multiaddress', data=data) + + self.assertEqual(decode_obj.decode(), {"Id": "0x{}".format(public_key)}) + + def test_multiaddress_ss58_index_as_str(self): + obj = ScaleDecoder.get_decoder_class('Multiaddress') + ss58_address = "F7Hs" + + index_id = ss58_decode_account_index(ss58_address) + + data = obj.encode(ss58_address) + decode_obj = ScaleDecoder.get_decoder_class('Multiaddress', data=data) + + self.assertEqual(decode_obj.decode(), {"Index": index_id}) + + def test_ss58_encode_index(self): + self.assertEqual(ss58_encode_account_index(0), 'F7Hs') diff --git a/py-scale-codec/test/test_scalebytes.py b/py-scale-codec/test/test_scalebytes.py new file mode 100644 index 00000000..5aa49eed --- /dev/null +++ b/py-scale-codec/test/test_scalebytes.py @@ -0,0 +1,77 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# test_scalebytes.py +# + +import unittest + +from scalecodec.base import ScaleDecoder, ScaleBytes +from scalecodec.exceptions import RemainingScaleBytesNotEmptyException + + +class TestScaleBytes(unittest.TestCase): + + def test_unknown_data_format(self): + self.assertRaises(ValueError, ScaleBytes, 123) + self.assertRaises(ValueError, ScaleBytes, 'test') + + def test_bytes_data_format(self): + obj = ScaleDecoder.get_decoder_class('Compact', ScaleBytes(b"\x02\x09\x3d\x00")) + obj.decode() + self.assertEqual(obj.value, 1000000) + + def test_remaining_bytes(self): + scale = ScaleBytes("0x01020304") + scale.get_next_bytes(1) + self.assertEqual(scale.get_remaining_bytes(), b'\x02\x03\x04') + + def test_reset(self): + scale = ScaleBytes("0x01020304") + scale.get_next_bytes(1) + scale.reset() + self.assertEqual(scale.get_remaining_bytes(), b'\x01\x02\x03\x04') + + def test_abstract_process(self): + self.assertRaises(NotImplementedError, ScaleDecoder.process, None) + + def test_abstract_encode(self): + self.assertRaises(NotImplementedError, ScaleDecoder.process_encode, None, None) + + def test_add_scalebytes(self): + scale_total = ScaleBytes("0x0102") + "0x0304" + + self.assertEqual(scale_total.data, bytearray.fromhex("01020304")) + + def test_scale_decoder_remaining_bytes(self): + obj = ScaleDecoder.get_decoder_class('[u8; 3]', ScaleBytes("0x010203")) + self.assertEqual(obj.get_remaining_bytes(), b"\x01\x02\x03") + + def test_no_more_bytes_available(self): + obj = ScaleDecoder.get_decoder_class('[u8; 4]', ScaleBytes("0x010203")) + self.assertRaises(RemainingScaleBytesNotEmptyException, obj.decode, False) + + def test_str_representation(self): + obj = ScaleDecoder.get_decoder_class('Bytes', ScaleBytes("0x1054657374")) + obj.decode() + self.assertEqual(str(obj), "Test") + + def test_type_convert(self): + self.assertEqual(ScaleDecoder.convert_type("RawAddress"), "Address") + self.assertEqual(ScaleDecoder.convert_type("::Type"), "Compact") + self.assertEqual(ScaleDecoder.convert_type("::Type"), "Compact") + self.assertEqual(ScaleDecoder.convert_type("::Type"), "Compact") + diff --git a/py-scale-codec/test/test_type_encoding.py b/py-scale-codec/test/test_type_encoding.py new file mode 100644 index 00000000..14462ff9 --- /dev/null +++ b/py-scale-codec/test/test_type_encoding.py @@ -0,0 +1,346 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest + +from scalecodec.base import ScaleBytes, ScaleDecoder, RuntimeConfiguration +from scalecodec.metadata import MetadataDecoder +from scalecodec.type_registry import load_type_registry_preset + +from scalecodec.types import CompactU32, Vec +from test.fixtures import kusama_metadata_hex + + +class TestScaleTypeEncoding(unittest.TestCase): + + @classmethod + def setUpClass(cls): + RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) + cls.metadata_decoder = MetadataDecoder(ScaleBytes(kusama_metadata_hex)) + cls.metadata_decoder.decode() + + def setUp(self) -> None: + RuntimeConfiguration().update_type_registry(load_type_registry_preset("kusama")) + + def tearDown(self) -> None: + RuntimeConfiguration().clear_type_registry() + RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) + + def test_u16(self): + obj = ScaleDecoder.get_decoder_class('u16') + obj.encode(64302) + self.assertEqual(str(obj.data), "0x2efb") + + def test_i16(self): + obj = ScaleDecoder.get_decoder_class('i16') + obj.encode(-1234) + self.assertEqual(str(obj.data), "0x2efb") + + def test_i16_out_of_bounds(self): + obj = ScaleDecoder.get_decoder_class('i16') + self.assertRaises(ValueError, obj.encode, -32769) + + def test_compact_u32_1byte(self): + obj = ScaleDecoder.get_decoder_class('Compact', ScaleBytes("0x18")) + obj.decode() + + obj = ScaleDecoder.get_decoder_class('Compact') + obj.encode(6) + self.assertEqual(str(obj.data), "0x18") + + def test_compact_u32_2bytes(self): + obj = ScaleDecoder.get_decoder_class('Compact', ScaleBytes("0x18")) + obj.decode() + + obj = ScaleDecoder.get_decoder_class('Compact') + obj.encode(6000) + self.assertEqual(str(obj.data), "0xc15d") + + def test_compact_u32_4bytes(self): + + obj = ScaleDecoder.get_decoder_class('Compact') + obj.encode(1000000) + self.assertEqual(str(obj.data), "0x02093d00") + + def test_compact_u32_larger_than_4bytes(self): + + obj = ScaleDecoder.get_decoder_class('Compact') + obj.encode(150000000000000) + self.assertEqual(str(obj.data), "0x0b0060b7986c88") + + def test_compact_u32_encode_decode(self): + + value = 2000001 + + obj = ScaleDecoder.get_decoder_class('Compact') + data = obj.encode(value) + + obj = CompactU32(data) + + self.assertEqual(obj.decode(), value) + + def test_compact_u32_encode_decode_large(self): + + value = 2**30 + + obj = CompactU32(ScaleBytes(bytearray())) + data = obj.encode(value) + + obj = CompactU32(data) + + self.assertEqual(obj.decode(), value) + + def test_vec_string_encode_decode(self): + + value = ['test', 'vec'] + + obj = ScaleDecoder.get_decoder_class('Vec') + data = obj.encode(value) + + obj = ScaleDecoder.get_decoder_class('Vec', data) + + self.assertEqual(obj.decode(), value) + + def test_vec_accountid_encode_decode(self): + + value = [ + '0x0034d9d2dcdcd79451d95fd019a056d47dfa9926d762b94e63f06391b1545aee', + '0x2ce1929ab903f695bdeeeb79a588774d71468362129136f1b7f7b31a32958f98', + '0x88c47944e4aaf9d53a9627400f9a948bb5f355bda38702dbdeda0c5d34553128', + ] + + obj = ScaleDecoder.get_decoder_class('Vec') + data = obj.encode(value) + + obj = ScaleDecoder.get_decoder_class('Vec', data) + + self.assertEqual(obj.decode(), value) + + def test_bytes_encode_decode(self): + + value = 'This is a test' + + obj = ScaleDecoder.get_decoder_class('Bytes') + data = obj.encode(value) + + obj_check = ScaleDecoder.get_decoder_class('Bytes', data) + + self.assertEqual(obj_check.decode(), value) + + def test_hexbytes_encode_decode(self): + + value = '0x5468697320697320612074657374' + + obj = ScaleDecoder.get_decoder_class('HexBytes') + data = obj.encode(value) + + obj_check = ScaleDecoder.get_decoder_class('HexBytes', data) + + self.assertEqual(obj_check.decode(), value) + + def test_accountid_encode_decode(self): + value = '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' + + obj = ScaleDecoder.get_decoder_class('AccountId') + data = obj.encode(value) + + obj_check = ScaleDecoder.get_decoder_class('AccountId', data) + + self.assertEqual(obj_check.decode(), value) + + def test_compact_balance_encode_decode(self): + scale_data = ScaleBytes('0x070010a5d4e8') + value = 1000000000000 + + obj = ScaleDecoder.get_decoder_class('Compact') + data = obj.encode(value) + + self.assertEqual(str(scale_data), str(data)) + + obj_check = ScaleDecoder.get_decoder_class('Compact', data) + + self.assertEqual(obj_check.decode(), value) + + def test_struct_encode_decode(self): + + value = {'unstakeThreshold': 3, 'validatorPayment': 0} + scale_data = ScaleBytes("0x0c00") + + obj = ScaleDecoder.get_decoder_class('ValidatorPrefsLegacy') + data = obj.encode(value) + + self.assertEqual(str(scale_data), str(data)) + + obj_check = ScaleDecoder.get_decoder_class('ValidatorPrefsLegacy', data) + + self.assertEqual(obj_check.decode(), value) + + def test_enum_encode_decode(self): + + value = {'Staked': None} + + obj = ScaleDecoder.get_decoder_class('RewardDestination') + data = obj.encode(value) + + obj_check = ScaleDecoder.get_decoder_class('RewardDestination', data) + + self.assertEqual(obj_check.decode(), value) + + def test_enum_type_mapping_encode_decode(self): + RuntimeConfiguration().update_type_registry(load_type_registry_preset("test")) + + value = {"AuthoritiesChange": ["0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409"]} + + obj = ScaleDecoder.get_decoder_class('DigestItem') + data = obj.encode(value) + + obj_check = ScaleDecoder.get_decoder_class('DigestItem', data) + + self.assertEqual(obj_check.decode(), value) + + def test_option_empty_encode_decode(self): + + value = None + + obj = ScaleDecoder.get_decoder_class('Option') + data = obj.encode(value) + + obj_check = ScaleDecoder.get_decoder_class('Option', data) + + self.assertEqual(obj_check.decode(), value) + + def test_option_bytes_encode_decode(self): + value = "Test" + + obj = ScaleDecoder.get_decoder_class('Option') + data = obj.encode(value) + + obj_check = ScaleDecoder.get_decoder_class('Option', data) + + self.assertEqual(obj_check.decode(), value) + + def test_proposal_encode_decode(self): + + value = { + 'call_module': 'System', + 'call_function': 'remark', + 'call_args': { + '_remark': '0x0123456789' + } + } + + obj = ScaleDecoder.get_decoder_class('Box', metadata=self.metadata_decoder) + data = obj.encode(value) + + obj_check = ScaleDecoder.get_decoder_class('Box', data, metadata=self.metadata_decoder) + + obj_check.decode() + + self.assertEqual(obj_check.value['call_module'], 'System') + self.assertEqual(obj_check.value['call_function'], 'remark') + self.assertEqual(obj_check.value['call_args'][0]['value'], '0x0123456789') + + def test_set_encode_decode(self): + + RuntimeConfiguration().update_type_registry(load_type_registry_preset("test")) + + value = ['Display', 'Legal', 'Email', 'Twitter'] + + obj = ScaleDecoder.get_decoder_class('IdentityFields') + scale_data = obj.encode(value) + + obj = ScaleDecoder.get_decoder_class('IdentityFields', scale_data) + obj.decode() + + self.assertEqual(obj.value, value) + + def test_data_encode_decode(self): + + value = {"Raw": "Test"} + + obj = ScaleDecoder.get_decoder_class('Data') + scale_data = obj.encode(value) + + obj = ScaleDecoder.get_decoder_class('Data', scale_data) + obj.decode() + + self.assertEqual(obj.value, value) + + def test_multi_encode(self): + + as_multi = ScaleDecoder.get_decoder_class("Call", metadata=self.metadata_decoder) + + as_multi.encode( + { + "call_module": "Multisig", + "call_function": "as_multi", + "call_args": { + "call": { + "call_module": "Balances", + "call_function": "transfer", + "call_args": { + "dest": "CofvaLbP3m8PLeNRQmLVPWmTT7jGgAXTwyT69k2wkfPxJ9V", + "value": 10000000000000 + }, + }, + "maybe_timepoint": {"height": 3012294, "index": 3}, + "other_signatories": sorted(['D2bHQwFcQj11SvtkjULEdKhK4WAeP6MThXgosMHjW9DrmbE', + 'CofvaLbP3m8PLeNRQmLVPWmTT7jGgAXTwyT69k2wkfPxJ9V']), + "threshold": 2, + "store_call": True, + "max_weight": 10, + }, + } + ) + self.assertEqual(str(as_multi.data), "0x1f010200080a2ee2acc37fa96e818e2817afc104ce55770bcccb7333bbf8481d5bc3c6fa4614097421065c7bb0efc6770ffc5d604654159d45910cc7a3cb602be16acc552801c6f62d0003000000a404000a2ee2acc37fa96e818e2817afc104ce55770bcccb7333bbf8481d5bc3c6fa460b00a0724e1809010a00000000000000") + + def test_call_encode_invalid_type(self): + call = ScaleDecoder.get_decoder_class("Call", metadata=self.metadata_decoder) + self.assertRaises(TypeError, call.encode, '{"call_module": "Balances", "call_function": "transfer"}') + self.assertRaises(TypeError, call.encode, 2) + + def test_era_immortal_encode(self): + obj = ScaleDecoder.get_decoder_class('Era') + obj.encode('00') + self.assertEqual(str(obj.data), '0x00') + + def test_era_mortal_encode(self): + obj = ScaleDecoder.get_decoder_class('Era') + obj.encode((32768, 20000)) + self.assertEqual(str(obj.data), '0x4e9c') + + obj = ScaleDecoder.get_decoder_class('Era') + obj.encode((64, 60)) + self.assertEqual(str(obj.data), '0xc503') + + obj = ScaleDecoder.get_decoder_class('Era') + obj.encode((64, 40)) + self.assertEqual(str(obj.data), '0x8502') + + def test_era_mortal_encode_dict(self): + obj = ScaleDecoder.get_decoder_class('Era') + obj.encode({'period': 32768, 'phase': 20000}) + self.assertEqual(str(obj.data), '0x4e9c') + + obj = ScaleDecoder.get_decoder_class('Era') + obj.encode({'period': 32768, 'current': (32768 * 3) + 20000}) + self.assertEqual(str(obj.data), '0x4e9c') + + obj = ScaleDecoder.get_decoder_class('Era') + obj.encode({'period': 200, 'current': 1400}) + obj2 = ScaleDecoder.get_decoder_class('Era') + obj2.encode((256, 120)) + self.assertEqual(str(obj.data), str(obj2.data)) diff --git a/py-scale-codec/test/test_type_registry.py b/py-scale-codec/test/test_type_registry.py new file mode 100644 index 00000000..9dd86ddd --- /dev/null +++ b/py-scale-codec/test/test_type_registry.py @@ -0,0 +1,224 @@ +# Python SCALE Codec Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import copy +import os +import unittest +from pathlib import Path + +from scalecodec.block import EventsDecoder, ExtrinsicsDecoder + +from scalecodec.metadata import MetadataDecoder + +from scalecodec.base import RuntimeConfiguration, ScaleBytes +from scalecodec.type_registry import load_type_registry_preset + + +class TestScaleTypeEncoding(unittest.TestCase): + + @classmethod + def setUpClass(cls): + RuntimeConfiguration().clear_type_registry() + RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) + RuntimeConfiguration().update_type_registry(load_type_registry_preset("kusama")) + + metadata_v10_hex = "0x6d6574610a701853797374656d011853797374656d34304163636f756e744e6f6e636501010130543a3a4163636f756e74496420543a3a496e646578001000000000047c2045787472696e73696373206e6f6e636520666f72206163636f756e74732e3845787472696e736963436f756e7400000c753332040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e4c416c6c45787472696e73696373576569676874000018576569676874040004150120546f74616c2077656967687420666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e40416c6c45787472696e736963734c656e00000c753332040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b4861736801010138543a3a426c6f636b4e756d6265721c543a3a48617368008000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101010c7533321c5665633c75383e000400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d626572010038543a3a426c6f636b4e756d6265721000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e3845787472696e73696373526f6f7401001c543a3a486173688000000000000000000000000000000000000000000000000000000000000000000415012045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e1844696765737401002c4469676573744f663c543e040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301008c5665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e040004a0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e284576656e74436f756e740100284576656e74496e646578100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f706963730101011c543a3a48617368845665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e000400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e011c2866696c6c5f626c6f636b0004210120412062696720646973706174636820746861742077696c6c20646973616c6c6f7720616e79206f74686572207472616e73616374696f6e20746f20626520696e636c756465642e1872656d61726b041c5f72656d61726b1c5665633c75383e046c204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e387365745f686561705f7061676573041470616765730c75363404fc2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040c6e65771c5665633c75383e04482053657420746865206e657720636f64652e2c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e046c2053657420736f6d65206974656d73206f662073746f726167652e306b696c6c5f73746f7261676504106b657973205665633c4b65793e0478204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e2c6b696c6c5f70726566697804187072656669780c4b6579041501204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e01084045787472696e7369635375636365737304304469737061746368496e666f049420416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c6564083444697370617463684572726f72304469737061746368496e666f045420416e2065787472696e736963206661696c65642e00006052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100305665633c543a3a486173683e04000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e000000001042616265011042616265242845706f6368496e64657801000c75363420000000000000000004542043757272656e742065706f636820696e6465782e2c417574686f72697469657301009c5665633c28417574686f7269747949642c2042616265417574686f72697479576569676874293e0400046c2043757272656e742065706f636820617574686f7269746965732e2c47656e65736973536c6f7401000c75363420000000000000000008f82054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e205468697320697320309020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2c43757272656e74536c6f7401000c75363420000000000000000004542043757272656e7420736c6f74206e756d6265722e2852616e646f6d6e6573730100205b75383b2033325d80000000000000000000000000000000000000000000000000000000000000000028b8205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e002c20232053656375726974790005012054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061f8206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e7915012063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d6265727320746861742074686973150120286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e206265050120757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e0d01206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e384e65787452616e646f6d6e6573730100205b75383b2033325d800000000000000000000000000000000000000000000000000000000000000000045c204e6578742065706f63682072616e646f6d6e6573732e305365676d656e74496e64657801000c7533321000000000247c2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e00f4205765206d616b6520612074726164656f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e01012057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f942060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e00ec204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e090120576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572791c2065706f63682e44556e646572436f6e737472756374696f6e0101010c753332345665633c5b75383b2033325d3e000400002c496e697469616c697a65640000204d6179626556726604000801012054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d65601d01206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e010000083445706f63684475726174696f6e0c753634205802000000000000080d0120546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746ffc2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e444578706563746564426c6f636b54696d6524543a3a4d6f6d656e7420701700000000000014050120546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e67110120626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f75740501207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f740901206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473a0207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e002454696d657374616d70012454696d657374616d70080c4e6f77010024543a3a4d6f6d656e7420000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e24446964557064617465010010626f6f6c040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01040c736574040c6e6f7748436f6d706163743c543a3a4d6f6d656e743e245820536574207468652063757272656e742074696d652e00590120546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed82070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e004501205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e74207370656369666965642062794420604d696e696d756d506572696f64602e00d820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e0004344d696e696d756d506572696f6424543a3a4d6f6d656e7420b80b00000000000010690120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f64690120746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c79650120776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c6520746869737020706572696f64206f6e2064656661756c742073657474696e67732e001c496e6469636573011c496e6469636573082c4e657874456e756d53657401003c543a3a4163636f756e74496e6465781000000000047c20546865206e657874206672656520656e756d65726174696f6e207365742e1c456e756d5365740101013c543a3a4163636f756e74496e646578445665633c543a3a4163636f756e7449643e00040004582054686520656e756d65726174696f6e20736574732e010001043c4e65774163636f756e74496e64657808244163636f756e744964304163636f756e74496e64657810882041206e6577206163636f756e7420696e646578207761732061737369676e65642e0005012054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e65646020746f20616e6f7468657220604163636f756e744964602e00002042616c616e636573012042616c616e6365731434546f74616c49737375616e6365010028543a3a42616c616e6365400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e1c56657374696e6700010130543a3a4163636f756e744964ac56657374696e675363686564756c653c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e00040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e2c4672656542616c616e636501010130543a3a4163636f756e74496428543a3a42616c616e63650040000000000000000000000000000000002c9c20546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e004101205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e204974750120616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e207468697355012062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069733d012064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b450120697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f636961746564207769746854207468652064656c65746564206163636f756e742e00750120606672616d655f73797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473150120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e3c526573657276656442616c616e636501010130543a3a4163636f756e74496428543a3a42616c616e63650040000000000000000000000000000000002c75012054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c206765749c20736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e006d0120546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e732501207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e007501205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e7427b42069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e00650120606672616d655f73797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473190120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e29144c6f636b7301010130543a3a4163636f756e744964b05665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e00040004b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e0110207472616e736665720810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e64d8205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e00090120607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e21012049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e1501204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b4206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e00190120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e002c2023203c7765696768743e3101202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72cc202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e6901202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e004c2052656c617465642066756e6374696f6e733a0051012020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2d012020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365d420202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642edc2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765725901202020202060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e6365646020616e642060543a3a4f6e4672656542616c616e63655a65726f3a3a6f6e5f667265655f62616c616e63655f7a65726f602e49012020202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616cf82020202020636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e00302023203c2f7765696768743e2c7365745f62616c616e63650c0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365206e65775f667265654c436f6d706163743c543a3a42616c616e63653e306e65775f72657365727665644c436f6d706163743c543a3a42616c616e63653e349420536574207468652062616c616e636573206f66206120676976656e206163636f756e742e00210120546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c090120616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e190120496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c01012069742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e00b420546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e002c2023203c7765696768743e80202d20496e646570656e64656e74206f662074686520617267756d656e74732ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e302023203c2f7765696768743e38666f7263655f7472616e736665720c18736f757263658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636510646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e0851012045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d61792062652c207370656369666965642e4c7472616e736665725f6b6565705f616c6976650810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e1851012053616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c2074686540206f726967696e206163636f756e742e00bc20393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e00c4205b607472616e73666572605d3a207374727563742e4d6f64756c652e68746d6c236d6574686f642e7472616e736665720114284e65774163636f756e7408244163636f756e7449641c42616c616e6365046c2041206e6577206163636f756e742077617320637265617465642e345265617065644163636f756e7408244163636f756e7449641c42616c616e6365045c20416e206163636f756e7420776173207265617065642e205472616e7366657210244163636f756e744964244163636f756e7449641c42616c616e63651c42616c616e636504b0205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e2842616c616e63655365740c244163636f756e7449641c42616c616e63651c42616c616e636504c420412062616c616e6365207761732073657420627920726f6f74202877686f2c20667265652c207265736572766564292e1c4465706f73697408244163636f756e7449641c42616c616e636504dc20536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e0c484578697374656e7469616c4465706f73697428543a3a42616c616e63654000e40b5402000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2c5472616e7366657246656528543a3a42616c616e63654000e40b540200000000000000000000000494205468652066656520726571756972656420746f206d616b652061207472616e736665722e2c4372656174696f6e46656528543a3a42616c616e63654000e40b54020000000000000000000000049c205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e203856657374696e6742616c616e6365049c2056657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c7565544c69717569646974795265737472696374696f6e7304c8204163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c204f766572666c6f77047420476f7420616e206f766572666c6f7720616674657220616464696e674c496e73756666696369656e7442616c616e636504782042616c616e636520746f6f206c6f7720746f2073656e642076616c7565484578697374656e7469616c4465706f73697404ec2056616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f736974244b656570416c6976650490205472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e745c4578697374696e6756657374696e675363686564756c6504cc20412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742c446561644163636f756e74048c2042656e6566696369617279206163636f756e74206d757374207072652d6578697374485472616e73616374696f6e5061796d656e74012042616c616e63657304444e6578744665654d756c7469706c6965720100284d756c7469706c69657220000000000000000000000008485472616e73616374696f6e426173654665653042616c616e63654f663c543e4000e40b5402000000000000000000000004dc205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e485472616e73616374696f6e427974654665653042616c616e63654f663c543e4000e1f505000000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e0028417574686f72736869700128417574686f72736869700c18556e636c65730100e85665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e0400041c20556e636c657318417574686f72000030543a3a4163636f756e7449640400046420417574686f72206f662063757272656e7420626c6f636b2e30446964536574556e636c6573010010626f6f6c040004bc205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e0104287365745f756e636c657304286e65775f756e636c6573385665633c543a3a4865616465723e04642050726f76696465206120736574206f6620756e636c65732e00001c48496e76616c6964556e636c65506172656e74048c2054686520756e636c6520706172656e74206e6f7420696e2074686520636861696e2e40556e636c6573416c7265616479536574048420556e636c657320616c72656164792073657420696e2074686520626c6f636b2e34546f6f4d616e79556e636c6573044420546f6f206d616e7920756e636c65732e3047656e65736973556e636c6504582054686520756e636c652069732067656e657369732e30546f6f48696768556e636c6504802054686520756e636c6520697320746f6f206869676820696e20636861696e2e50556e636c65416c7265616479496e636c75646564047c2054686520756e636c6520697320616c726561647920696e636c756465642e204f6c64556e636c6504b82054686520756e636c652069736e277420726563656e7420656e6f75676820746f20626520696e636c756465642e1c5374616b696e67011c5374616b696e67683856616c696461746f72436f756e7401000c753332100000000004a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e7401000c7533321004000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e34496e76756c6e657261626c65730100445665633c543a3a4163636f756e7449643e04000c590120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e636520746865792772654d01206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f7572ac20696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e64656400010130543a3a4163636f756e74496430543a3a4163636f756e744964000400040101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e184c656467657200010130543a3a4163636f756e744964a45374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e14506179656501010130543a3a4163636f756e7449644452657761726444657374696e6174696f6e00040004e42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e2856616c696461746f727301010130543a3a4163636f756e7449643856616c696461746f72507265667301040004450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e284e6f6d696e61746f727300010130543a3a4163636f756e744964644e6f6d696e6174696f6e733c543a3a4163636f756e7449643e01040010650120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e003501204e4f54453a206973207072697661746520736f20746861742077652063616e20656e73757265207570677261646564206265666f726520616c6c207479706963616c2061636365737365732ed8204469726563742073746f7261676520415049732063616e207374696c6c2062797061737320746869732070726f74656374696f6e2e1c5374616b65727301010130543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000c000000104d01204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e277420697465726174651901207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e207468652053657373696f6e206d6f64756c652e00902054686973206973206b6579656420627920746865207374617368206163636f756e742e3843757272656e74456c65637465640100445665633c543a3a4163636f756e7449643e040004fc205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e2843757272656e74457261010020457261496e6465781000000000045c205468652063757272656e742065726120696e6465782e3c43757272656e74457261537461727401002c4d6f6d656e744f663c543e200000000000000000047820546865207374617274206f66207468652063757272656e74206572612e6c43757272656e74457261537461727453657373696f6e496e64657801003053657373696f6e496e646578100000000004d0205468652073657373696f6e20696e646578206174207768696368207468652063757272656e742065726120737461727465642e5843757272656e74457261506f696e74734561726e6564010024457261506f696e7473140000000000040d01205265776172647320666f72207468652063757272656e74206572612e205573696e6720696e6469636573206f662063757272656e7420656c6563746564207365742e24536c6f745374616b6501003042616c616e63654f663c543e40000000000000000000000000000000000c31012054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e00c02054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e20466f72636545726101001c466f7263696e670400041d01205472756520696620746865206e6578742073657373696f6e206368616e67652077696c6c2062652061206e657720657261207265676172646c657373206f6620696e6465782e4c536c6173685265776172644672616374696f6e01001c50657262696c6c10000000000cf8205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e00e4205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e4c43616e63656c6564536c6173685061796f757401003042616c616e63654f663c543e40000000000000000000000000000000000815012054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e7420776869636820776173ec2063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e40556e6170706c696564536c617368657301010120457261496e646578bc5665633c556e6170706c696564536c6173683c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3e00040004c420416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e28426f6e646564457261730100745665633c28457261496e6465782c2053657373696f6e496e646578293e04000425012041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e4c56616c696461746f72536c617368496e45726100020120457261496e64657830543a3a4163636f756e7449645c2850657262696c6c2c2042616c616e63654f663c543e2903040008450120416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e7020616e6420736c6173682076616c7565206f6620746865206572612e4c4e6f6d696e61746f72536c617368496e45726100020120457261496e64657830543a3a4163636f756e7449643042616c616e63654f663c543e03040004610120416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e34536c617368696e675370616e7300010130543a3a4163636f756e7449645c736c617368696e673a3a536c617368696e675370616e73000400048c20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e245370616e536c6173680101018c28543a3a4163636f756e7449642c20736c617368696e673a3a5370616e496e6465782988736c617368696e673a3a5370616e5265636f72643c42616c616e63654f663c543e3e00800000000000000000000000000000000000000000000000000000000000000000083d01205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2cb82061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e584561726c69657374556e6170706c696564536c617368000020457261496e646578040004fc20546865206561726c696573742065726120666f72207768696368207765206861766520612070656e64696e672c20756e6170706c69656420736c6173682e3853746f7261676556657273696f6e01000c75333210000000000490205468652076657273696f6e206f662073746f7261676520666f7220757067726164652e014410626f6e640c28636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e1470617965654452657761726444657374696e6174696f6e3c65012054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c8420626520746865206163636f756e74207468617420636f6e74726f6c732069742e003101206076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e00250120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e002c2023203c7765696768743ed4202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e20202d204f2831292e68202d20546872656520657874726120444220656e74726965732e006d01204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e656420756e6c65737325012074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e302023203c2f7765696768743e28626f6e645f657874726104386d61785f6164646974696f6e616c54436f6d706163743c42616c616e63654f663c543e3e3865012041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e63652075703420666f72207374616b696e672e00510120557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e650120556e6c696b65205b60626f6e64605d206f72205b60756e626f6e64605d20746869732066756e6374696f6e20646f6573206e6f7420696d706f736520616e79206c696d69746174696f6e206f6e2074686520616d6f756e744c20746861742063616e2062652061646465642e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e20202d204f2831292e40202d204f6e6520444220656e7472792e302023203c2f7765696768743e18756e626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e5c5501205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64010120706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e250120543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e004901204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665c0207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e003d01204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360293d012063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e656564fc20746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e00982053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e002c2023203c7765696768743e4101202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e6501202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e63656029710120202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652ea501202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c656420766961206077697468647261775f756e626f6e646564602e40202d204f6e6520444220656e7472792e28203c2f7765696768743e4477697468647261775f756e626f6e64656400402d012052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e003501205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4c2077686174657665722069742077616e74732e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e006c2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e002c2023203c7765696768743e5501202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e45012020497420696d706c6965732060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c207768696368206973f42020696e6469726563746c7920757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e7901202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e2076616c6964617465041470726566733856616c696461746f7250726566732ce8204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e206e6f6d696e617465041c74617267657473a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e2c1101204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743e2501202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f66206074617267657473602c982077686963682069732063617070656420617420604d41585f4e4f4d494e4154494f4e53602ed8202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e302023203c2f7765696768743e146368696c6c002cc8204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e54202d20436f6e7461696e73206f6e6520726561642ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e247365745f7061796565041470617965654452657761726444657374696e6174696f6e2cb8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e387365745f636f6e74726f6c6c65720428636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652c90202852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e4c7365745f76616c696461746f725f636f756e74040c6e657730436f6d706163743c7533323e04802054686520696465616c206e756d626572206f662076616c696461746f72732e34666f7263655f6e6f5f657261730014b020466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e302023203c2f7765696768743e34666f7263655f6e65775f65726100184d0120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c206265a020726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e302023203c2f7765696768743e447365745f696e76756c6e657261626c6573042876616c696461746f7273445665633c543a3a4163636f756e7449643e04cc20536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e34666f7263655f756e7374616b650414737461736830543a3a4163636f756e744964040d0120466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e50666f7263655f6e65775f6572615f616c776179730014050120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e002c2023203c7765696768743e50202d204f6e652073746f72616765207772697465302023203c2f7765696768743e5463616e63656c5f64656665727265645f736c617368080c65726120457261496e64657834736c6173685f696e6469636573205665633c7533323e1c45012043616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e2043616e2062652063616c6c6564206279206569746865722074686520726f6f74206f726967696e206f7270207468652060543a3a536c61736843616e63656c4f726967696e602e05012070617373696e67207468652065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e002c2023203c7765696768743e54202d204f6e652073746f726167652077726974652e302023203c2f7765696768743e187265626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e18e0205265626f6e64206120706f7274696f6e206f6620746865207374617368207363686564756c656420746f20626520756e6c6f636b65642e002c2023203c7765696768743ef0202d2054696d6520636f6d706c65786974793a204f2831292e20426f756e64656420627920604d41585f554e4c4f434b494e475f4348554e4b53602ef4202d2053746f72616765206368616e6765733a2043616e277420696e6372656173652073746f726167652c206f6e6c792064656372656173652069742e302023203c2f7765696768743e010c18526577617264081c42616c616e63651c42616c616e636508510120416c6c2076616c696461746f72732068617665206265656e207265776172646564206279207468652066697273742062616c616e63653b20746865207365636f6e64206973207468652072656d61696e6465728c2066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642e14536c61736808244163636f756e7449641c42616c616e6365042501204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e684f6c64536c617368696e675265706f7274446973636172646564043053657373696f6e496e646578081d0120416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c6448206e6f742062652070726f6365737365642e083853657373696f6e735065724572613053657373696f6e496e64657810060000000470204e756d626572206f662073657373696f6e7320706572206572612e3c426f6e64696e674475726174696f6e20457261496e646578101c00000004e4204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e28344e6f74436f6e74726f6c6c65720468204e6f74206120636f6e74726f6c6c6572206163636f756e742e204e6f7453746173680454204e6f742061207374617368206163636f756e742e34416c7265616479426f6e646564046420537461736820697320616c726561647920626f6e6465642e34416c7265616479506169726564047820436f6e74726f6c6c657220697320616c7265616479207061697265642e30456d70747954617267657473046420546172676574732063616e6e6f7420626520656d7074792e384475706c6963617465496e6465780444204475706c696361746520696e6465782e44496e76616c6964536c617368496e646578048820536c617368207265636f726420696e646578206f7574206f6620626f756e64732e44496e73756666696369656e7456616c756504cc2043616e206e6f7420626f6e6420776974682076616c7565206c657373207468616e206d696e696d756d2062616c616e63652e304e6f4d6f72654368756e6b7304942043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e344e6f556e6c6f636b4368756e6b04a42043616e206e6f74207265626f6e6420776974686f757420756e6c6f636b696e67206368756e6b732e204f6666656e63657301204f6666656e6365730c1c5265706f727473000101345265706f727449644f663c543ed04f6666656e636544657461696c733c543a3a4163636f756e7449642c20543a3a4964656e74696669636174696f6e5475706c653e00040004490120546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e58436f6e63757272656e745265706f727473496e646578010201104b696e64384f706171756554696d65536c6f74485665633c5265706f727449644f663c543e3e010400042901204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e485265706f72747342794b696e64496e646578010101104b696e641c5665633c75383e00040018110120456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e00bc20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e004901204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f66690120646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e010001041c4f6666656e636508104b696e64384f706171756554696d65536c6f7408550120546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e64390120286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e00001c53657373696f6e011c53657373696f6e1c2856616c696461746f727301004c5665633c543a3a56616c696461746f7249643e0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e64657801003053657373696f6e496e646578100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e676564010010626f6f6c040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b6579730100785665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e0400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f72730100205665633c7533323e04000c8020496e6469636573206f662064697361626c65642076616c696461746f72732e003501205468652073657420697320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e732061206e657720736574206f66206964656e7469746965732e204e6578744b6579730002051c5665633c75383e38543a3a56616c696461746f7249641c543a3a4b657973010400109c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e00590120546865206669727374206b657920697320616c77617973206044454455505f4b45595f5052454649586020746f206861766520616c6c20746865206461746120696e207468652073616d65206272616e6368206f6661012074686520747269652e20486176696e6720616c6c206461746120696e207468652073616d65206272616e63682073686f756c642070726576656e7420736c6f77696e6720646f776e206f7468657220717565726965732e204b65794f776e65720002051c5665633c75383e50284b65795479706549642c205665633c75383e2938543a3a56616c696461746f72496401040010250120546865206f776e6572206f662061206b65792e20546865207365636f6e64206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e00590120546865206669727374206b657920697320616c77617973206044454455505f4b45595f5052454649586020746f206861766520616c6c20746865206461746120696e207468652073616d65206272616e6368206f6661012074686520747269652e20486176696e6720616c6c206461746120696e207468652073616d65206272616e63682073686f756c642070726576656e7420736c6f77696e6720646f776e206f7468657220717565726965732e0104207365745f6b65797308106b6579731c543a3a4b6579731470726f6f661c5665633c75383e28e42053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b6579602e210120416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec4205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d420546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002c2023203c7765696768743e88202d204f286c6f67206e2920696e206e756d626572206f66206163636f756e74732e58202d204f6e6520657874726120444220656e7472792e302023203c2f7765696768743e0104284e657753657373696f6e043053657373696f6e496e646578085501204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b88206e756d626572206173207468652074797065206d6967687420737567676573742e044044454455505f4b45595f50524546495814265b75385d38343a73657373696f6e3a6b6579730865012055736564206173206669727374206b657920666f7220604e6578744b6579736020616e6420604b65794f776e65726020746f2070757420616c6c20746865206461746120696e746f207468652073616d65206272616e636834206f662074686520747269652e0c30496e76616c696450726f6f66046420496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f72496404a0204e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b657904682052656769737465726564206475706c6963617465206b65792e3c46696e616c697479547261636b65720001042866696e616c5f68696e74041068696e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08f42048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a65646c20626c6f636b2069732074686520676976656e206e756d6265722e00082857696e646f7753697a6538543a3a426c6f636b4e756d626572106500000004190120546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e345265706f72744c6174656e637938543a3a426c6f636b4e756d62657210e8030000041d01205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e0838416c72656164795570646174656404c82046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b1c42616448696e7404902046696e616c697a6564206865696768742061626f766520626c6f636b206e756d6265721c4772616e647061013c4772616e64706146696e616c6974791c2c417574686f726974696573010034417574686f726974794c6973740400102c20444550524543415445440061012054686973207573656420746f2073746f7265207468652063757272656e7420617574686f72697479207365742c20776869636820686173206265656e206d6967726174656420746f207468652077656c6c2d6b6e6f776e94204752414e4450415f415554484f52495445535f4b455920756e686173686564206b65792e14537461746501006c53746f72656453746174653c543a3a426c6f636b4e756d6265723e04000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e676500008c53746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000038543a3a426c6f636b4e756d626572040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c656400008028543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d626572290400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e7453657449640100145365744964200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e0001011453657449643053657373696f6e496e64657800040004c1012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f7220776869636820697473206d656d62657273207765726520726573706f6e7369626c652e0104487265706f72745f6d69736265686176696f72041c5f7265706f72741c5665633c75383e0464205265706f727420736f6d65206d69736265686176696f722e010c384e6577417574686f7269746965730434417574686f726974794c6973740490204e657720617574686f726974792073657420686173206265656e206170706c6965642e1850617573656400049c2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640004a02043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e00102c50617573654661696c656408090120417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665a8202865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e30526573756d654661696c656408150120417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e277420706175736564a42028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e344368616e676550656e64696e6704ec20417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e1c546f6f536f6f6e04c02043616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e20496d4f6e6c696e650120496d4f6e6c696e651020476f737369704174010038543a3a426c6f636b4e756d626572100000000004a02054686520626c6f636b206e756d626572207768656e2077652073686f756c6420676f737369702e104b65797301004c5665633c543a3a417574686f7269747949643e040004d0205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e485265636569766564486561727462656174730002013053657373696f6e496e6465782441757468496e6465781c5665633c75383e01040008e420466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206041757468496e646578608c20746f20606f6666636861696e3a3a4f70617175654e6574776f726b5374617465602e38417574686f726564426c6f636b730102013053657373696f6e496e64657838543a3a56616c696461746f7249640c75333201100000000008150120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f662060543a3a56616c696461746f7249646020746f20746865c8206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e0104246865617274626561740824686561727462656174644865617274626561743c543a3a426c6f636b4e756d6265723e285f7369676e6174757265bc3c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e617475726500010c444865617274626561745265636569766564042c417574686f72697479496404c02041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f726974794964601c416c6c476f6f640004d42041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2c536f6d654f66666c696e6504605665633c4964656e74696669636174696f6e5475706c653e0431012041742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e63652076616c696461746f722077617320666f756e6420746f206265206f66666c696e652e000828496e76616c69644b65790464204e6f6e206578697374656e74207075626c6963206b65792e4c4475706c6963617465644865617274626561740458204475706c696361746564206865617274626561742e48417574686f72697479446973636f766572790001000000002444656d6f6372616379012444656d6f6372616379403c5075626c696350726f70436f756e7401002450726f70496e646578100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f707301009c5665633c2850726f70496e6465782c20543a3a486173682c20543a3a4163636f756e744964293e040004210120546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865207365636f6e64206974656d206973207468652070726f706f73616c277320686173682e24507265696d616765730001011c543a3a48617368d4285665633c75383e2c20543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d62657229000400086101204d6170206f662068617368657320746f207468652070726f706f73616c20707265696d6167652c20616c6f6e6720776974682077686f207265676973746572656420697420616e64207468656972206465706f7369742ee42054686520626c6f636b206e756d6265722069732074686520626c6f636b20617420776869636820697420776173206465706f73697465642e244465706f7369744f660001012450726f70496e646578842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e2900040004842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e3c5265666572656e64756d436f756e7401003c5265666572656e64756d496e646578100000000004310120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e344c6f77657374556e62616b656401003c5265666572656e64756d496e646578100000000008250120546865206c6f77657374207265666572656e64756d20696e64657820726570726573656e74696e6720616e20756e62616b6564207265666572656e64756d2e20457175616c20746fdc20605265666572656e64756d436f756e74602069662074686572652069736e2774206120756e62616b6564207265666572656e64756d2e405265666572656e64756d496e666f4f660001013c5265666572656e64756d496e6465789c5265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a486173683e00040004b420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e34446973706174636851756575650100bc5665633c28543a3a426c6f636b4e756d6265722c20543a3a486173682c205265666572656e64756d496e646578293e0400044101205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e2053746f726564206f72646572656420627920626c6f636b206e756d6265722e24566f74657273466f720101013c5265666572656e64756d496e646578445665633c543a3a4163636f756e7449643e00040004a4204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e18566f74654f660101017c285265666572656e64756d496e6465782c20543a3a4163636f756e7449642910566f7465000400106101204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c794d012069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468655d012064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616ef420616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e1450726f787900010130543a3a4163636f756e74496430543a3a4163636f756e7449640004000831012057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b6579206973207468658820766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e2c44656c65676174696f6e7301010130543a3a4163636f756e7449646828543a3a4163636f756e7449642c20436f6e76696374696f6e2901840000000000000000000000000000000000000000000000000000000000000000000441012047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e544c6173745461626c656457617345787465726e616c010010626f6f6c0400085901205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c6963282070726f706f73616c2e304e65787445787465726e616c00006028543a3a486173682c20566f74655468726573686f6c6429040010590120546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e550120546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743aa4202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f7268202d20605075626c696350726f70736020697320656d7074792e24426c61636b6c6973740001011c543a3a486173688c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e290004000851012041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d626572e82028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e3443616e63656c6c6174696f6e730101011c543a3a4861736810626f6f6c000400042901205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e01541c70726f706f7365083470726f706f73616c5f686173681c543a3a486173681476616c756554436f6d706163743c42616c616e63654f663c543e3e18a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e002c2023203c7765696768743e20202d204f2831292e80202d2054776f204442206368616e6765732c206f6e6520444220656e7472792e302023203c2f7765696768743e187365636f6e64042070726f706f73616c48436f6d706163743c50726f70496e6465783e18a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e002c2023203c7765696768743e20202d204f2831292e40202d204f6e6520444220656e7472792e302023203c2f7765696768743e10766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f746510566f74651c350120566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bbc206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e002c2023203c7765696768743e20202d204f2831292e7c202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e302023203c2f7765696768743e2870726f78795f766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f746510566f74651c510120566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374f8207468652070726f706f73616c3b20206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e002c2023203c7765696768743e20202d204f2831292e7c202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e302023203c2f7765696768743e40656d657267656e63795f63616e63656c04247265665f696e6465783c5265666572656e64756d496e646578085101205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d6530207265666572656e64756d2e4065787465726e616c5f70726f706f7365043470726f706f73616c5f686173681c543a3a48617368083101205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c30207265666572656e64756d2e6465787465726e616c5f70726f706f73655f6d616a6f72697479043470726f706f73616c5f686173681c543a3a48617368145901205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c656020616e2065787465726e616c207265666572656e64756d2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e6065787465726e616c5f70726f706f73655f64656661756c74043470726f706f73616c5f686173681c543a3a48617368144901205363686564756c652061206e656761746976652d7475726e6f75742d62696173207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f84207363686564756c6520616e2065787465726e616c207265666572656e64756d2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e28666173745f747261636b0c3470726f706f73616c5f686173681c543a3a4861736834766f74696e675f706572696f6438543a3a426c6f636b4e756d6265721464656c617938543a3a426c6f636b4e756d626572245101205363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564650120696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e65ec20627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e00f8202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e6101202d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e20496e6372656173656420746f9820202060456d657267656e6379566f74696e67506572696f646020696620746f6f206c6f772e5501202d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265bc202020656e61637465642e205468697320646f65736e277420686176652061206d696e696d756d20616d6f756e742e347665746f5f65787465726e616c043470726f706f73616c5f686173681c543a3a4861736804bc205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e4463616e63656c5f7265666572656e64756d04247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e04542052656d6f76652061207265666572656e64756d2e3463616e63656c5f717565756564041477686963683c5265666572656e64756d496e64657804a02043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e247365745f70726f7879041470726f787930543a3a4163636f756e7449641498205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e002c2023203c7765696768743e58202d204f6e6520657874726120444220656e7472792e302023203c2f7765696768743e3072657369676e5f70726f787900149820436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e002c2023203c7765696768743e40202d204f6e6520444220636c6561722e302023203c2f7765696768743e3072656d6f76655f70726f7879041470726f787930543a3a4163636f756e744964149820436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e002c2023203c7765696768743e40202d204f6e6520444220636c6561722e302023203c2f7765696768743e2064656c65676174650808746f30543a3a4163636f756e74496428636f6e76696374696f6e28436f6e76696374696f6e143c2044656c656761746520766f74652e002c2023203c7765696768743e58202d204f6e6520657874726120444220656e7472792e302023203c2f7765696768743e28756e64656c656761746500144420556e64656c656761746520766f74652e002c2023203c7765696768743e20202d204f2831292e302023203c2f7765696768743e58636c6561725f7075626c69635f70726f706f73616c7300040101205665746f20616e6420626c61636b6c697374207468652070726f706f73616c20686173682e204d7573742062652066726f6d20526f6f74206f726967696e2e346e6f74655f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e0861012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e205468697320646f65736e27742072657175697265207468652070726f706f73616c20746f206265250120696e207468652064697370617463682071756575652062757420646f657320726571756972652061206465706f7369742c2072657475726e6564206f6e636520656e61637465642e586e6f74655f696d6d696e656e745f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e0845012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e2054686973207265717569726573207468652070726f706f73616c20746f206265b420696e207468652064697370617463682071756575652e204e6f206465706f736974206973206e65656465642e34726561705f707265696d616765043470726f706f73616c5f686173681c543a3a4861736814f42052656d6f766520616e20657870697265642070726f706f73616c20707265696d61676520616e6420636f6c6c65637420746865206465706f7369742e00510120546869732077696c6c206f6e6c7920776f726b2061667465722060566f74696e67506572696f646020626c6f636b732066726f6d207468652074696d6520746861742074686520707265696d616765207761735d01206e6f7465642c2069662069742773207468652073616d65206163636f756e7420646f696e672069742e2049662069742773206120646966666572656e74206163636f756e742c207468656e206974276c6c206f6e6c79b020776f726b20616e206164646974696f6e616c2060456e6163746d656e74506572696f6460206c617465722e01402050726f706f736564082450726f70496e6465781c42616c616e636504c02041206d6f74696f6e20686173206265656e2070726f706f7365642062792061207075626c6963206163636f756e742e185461626c65640c2450726f70496e6465781c42616c616e6365385665633c4163636f756e7449643e04dc2041207075626c69632070726f706f73616c20686173206265656e207461626c656420666f72207265666572656e64756d20766f74652e3845787465726e616c5461626c656400049820416e2065787465726e616c2070726f706f73616c20686173206265656e207461626c65642e1c53746172746564083c5265666572656e64756d496e64657834566f74655468726573686f6c6404602041207265666572656e64756d2068617320626567756e2e18506173736564043c5265666572656e64756d496e64657804b020412070726f706f73616c20686173206265656e20617070726f766564206279207265666572656e64756d2e244e6f74506173736564043c5265666572656e64756d496e64657804b020412070726f706f73616c20686173206265656e2072656a6563746564206279207265666572656e64756d2e2443616e63656c6c6564043c5265666572656e64756d496e64657804842041207265666572656e64756d20686173206265656e2063616e63656c6c65642e204578656375746564083c5265666572656e64756d496e64657810626f6f6c047420412070726f706f73616c20686173206265656e20656e61637465642e2444656c65676174656408244163636f756e744964244163636f756e74496404e020416e206163636f756e74206861732064656c65676174656420746865697220766f746520746f20616e6f74686572206163636f756e742e2c556e64656c65676174656404244163636f756e74496404e820416e206163636f756e74206861732063616e63656c6c656420612070726576696f75732064656c65676174696f6e206f7065726174696f6e2e185665746f65640c244163636f756e74496410486173682c426c6f636b4e756d626572049820416e2065787465726e616c2070726f706f73616c20686173206265656e207665746f65642e34507265696d6167654e6f7465640c1048617368244163636f756e7449641c42616c616e636504e020412070726f706f73616c277320707265696d61676520776173206e6f7465642c20616e6420746865206465706f7369742074616b656e2e30507265696d616765557365640c1048617368244163636f756e7449641c42616c616e636504150120412070726f706f73616c20707265696d616765207761732072656d6f76656420616e6420757365642028746865206465706f736974207761732072657475726e6564292e3c507265696d616765496e76616c69640810486173683c5265666572656e64756d496e646578040d0120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d6167652077617320696e76616c69642e3c507265696d6167654d697373696e670810486173683c5265666572656e64756d496e646578040d0120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d61676520776173206d697373696e672e38507265696d616765526561706564101048617368244163636f756e7449641c42616c616e6365244163636f756e744964045d012041207265676973746572656420707265696d616765207761732072656d6f76656420616e6420746865206465706f73697420636f6c6c6563746564206279207468652072656170657220286c617374206974656d292e1c3c456e6163746d656e74506572696f6438543a3a426c6f636b4e756d6265721000c2010014710120546865206d696e696d756d20706572696f64206f66206c6f636b696e6720616e642074686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e0031012049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e737572652074686174690120766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e2074686520636173652077686572659c207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e304c61756e6368506572696f6438543a3a426c6f636b4e756d62657210c089010004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e30566f74696e67506572696f6438543a3a426c6f636b4e756d62657210c089010004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e384d696e696d756d4465706f7369743042616c616e63654f663c543e400010a5d4e8000000000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e54456d657267656e6379566f74696e67506572696f6438543a3a426c6f636b4e756d626572100807000004ec204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f7220616e20656d657267656e6379207265666572656e64756d2e34436f6f6c6f6666506572696f6438543a3a426c6f636b4e756d62657210c089010004610120506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e4c507265696d616765427974654465706f7369743042616c616e63654f663c543e4000e1f5050000000000000000000000000429012054686520616d6f756e74206f662062616c616e63652074686174206d757374206265206465706f7369746564207065722062797465206f6620707265696d6167652073746f7265642e582056616c75654c6f7704382056616c756520746f6f206c6f773c50726f706f73616c4d697373696e6704602050726f706f73616c20646f6573206e6f74206578697374204e6f7450726f78790430204e6f7420612070726f787920426164496e646578043820556e6b6e6f776e20696e6465783c416c726561647943616e63656c656404982043616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365444475706c696361746550726f706f73616c04582050726f706f73616c20616c7265616479206d6164654c50726f706f73616c426c61636b6c6973746564046c2050726f706f73616c207374696c6c20626c61636b6c6973746564444e6f7453696d706c654d616a6f7269747904ac204e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f726974792c496e76616c696448617368043420496e76616c69642068617368284e6f50726f706f73616c0454204e6f2065787465726e616c2070726f706f73616c34416c72656164795665746f6564049c204964656e74697479206d6179206e6f74207665746f20612070726f706f73616c20747769636530416c726561647950726f7879044020416c726561647920612070726f78792857726f6e6750726f787904302057726f6e672070726f7879304e6f7444656c6567617465640438204e6f742064656c656761746564444475706c6963617465507265696d616765045c20507265696d61676520616c7265616479206e6f7465642c4e6f74496d6d696e656e740434204e6f7420696d6d696e656e74144561726c79042820546f6f206561726c7920496d6d696e656e74042420496d6d696e656e743c507265696d6167654d697373696e67044c20507265696d616765206e6f7420666f756e64445265666572656e64756d496e76616c6964048820566f746520676976656e20666f7220696e76616c6964207265666572656e64756d3c507265696d616765496e76616c6964044420496e76616c696420707265696d6167652c4e6f6e6557616974696e670454204e6f2070726f706f73616c732077616974696e671c436f756e63696c014c496e7374616e636531436f6c6c656374697665142450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001011c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001011c543a3a486173684c566f7465733c543a3a4163636f756e7449643e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e01102c7365745f6d656d62657273042c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e105101205365742074686520636f6c6c6563746976652773206d656d62657273686970206d616e75616c6c7920746f20606e65775f6d656d62657273602e204265206e69636520746f2074686520636861696e20616e645c2070726f76696465206974207072652d736f727465642e005820526571756972657320726f6f74206f726967696e2e1c65786563757465042070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e0cf420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e1c70726f706f736508247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e102c2023203c7765696768743e90202d20426f756e6465642073746f7261676520726561647320616e64207772697465732eb8202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c102c2023203c7765696768743e8c202d20426f756e6465642073746f72616765207265616420616e64207772697465732e5501202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e302023203c2f7765696768743e01182050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e74084d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292e14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408104861736810626f6f6c0405012041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408104861736810626f6f6c042d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e0018244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642148546563686e6963616c436f6d6d6974746565014c496e7374616e636532436f6c6c656374697665142450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001011c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001011c543a3a486173684c566f7465733c543a3a4163636f756e7449643e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e01102c7365745f6d656d62657273042c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e105101205365742074686520636f6c6c6563746976652773206d656d62657273686970206d616e75616c6c7920746f20606e65775f6d656d62657273602e204265206e69636520746f2074686520636861696e20616e645c2070726f76696465206974207072652d736f727465642e005820526571756972657320726f6f74206f726967696e2e1c65786563757465042070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e0cf420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e1c70726f706f736508247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e102c2023203c7765696768743e90202d20426f756e6465642073746f7261676520726561647320616e64207772697465732eb8202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c102c2023203c7765696768743e8c202d20426f756e6465642073746f72616765207265616420616e64207772697465732e5501202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e302023203c2f7765696768743e01182050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e74084d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292e14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408104861736810626f6f6c0405012041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408104861736810626f6f6c042d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e0018244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642144456c656374696f6e7350687261676d656e014050687261676d656e456c656374696f6e181c4d656d626572730100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e040004f0205468652063757272656e7420656c6563746564206d656d626572736869702e20536f72746564206261736564206f6e206163636f756e742069642e2452756e6e65727355700100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e0400044901205468652063757272656e742072756e6e6572735f75702e20536f72746564206261736564206f6e206c6f7720746f2068696768206d657269742028776f72736520746f20626573742072756e6e6572292e38456c656374696f6e526f756e647301000c75333210000000000441012054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e65642c206578636c7564696e6720746865207570636f6d696e67206f6e652e1c566f7465734f6601010130543a3a4163636f756e744964445665633c543a3a4163636f756e7449643e01040004010120566f746573206f66206120706172746963756c617220766f7465722c20776974682074686520726f756e6420696e646578206f662074686520766f7465732e1c5374616b654f6601010130543a3a4163636f756e7449643042616c616e63654f663c543e0040000000000000000000000000000000000464204c6f636b6564207374616b65206f66206120766f7465722e2843616e646964617465730100445665633c543a3a4163636f756e7449643e0400086501205468652070726573656e742063616e646964617465206c6973742e20536f72746564206261736564206f6e206163636f756e742d69642e20412063757272656e74206d656d626572206f7220612072756e6e65722063616e3101206e6576657220656e746572207468697320766563746f7220616e6420697320616c7761797320696d706c696369746c7920617373756d656420746f20626520612063616e6469646174652e011810766f74650814766f746573445665633c543a3a4163636f756e7449643e1476616c756554436f6d706163743c42616c616e63654f663c543e3e3c050120566f746520666f72206120736574206f662063616e6469646174657320666f7220746865207570636f6d696e6720726f756e64206f6620656c656374696f6e2e0050205468652060766f746573602073686f756c643a482020202d206e6f7420626520656d7074792eac2020202d206265206c657373207468616e20746865206e756d626572206f662063616e646964617465732e005d012055706f6e20766f74696e672c206076616c75656020756e697473206f66206077686f6027732062616c616e6365206973206c6f636b656420616e64206120626f6e6420616d6f756e742069732072657365727665642e5d012049742069732074686520726573706f6e736962696c697479206f66207468652063616c6c657220746f206e6f7420706c61636520616c6c206f662074686569722062616c616e636520696e746f20746865206c6f636ba020616e64206b65657020736f6d6520666f722066757274686572207472616e73616374696f6e732e002c2023203c7765696768743e2c2023232323205374617465302052656164733a204f283129c8205772697465733a204f28562920676976656e2060566020766f7465732e205620697320626f756e6465642062792031362e302023203c2f7765696768743e3072656d6f76655f766f746572001c21012052656d6f766520606f726967696e60206173206120766f7465722e20546869732072656d6f76657320746865206c6f636b20616e642072657475726e732074686520626f6e642e002c2023203c7765696768743e2c2023232323205374617465302052656164733a204f28312934205772697465733a204f283129302023203c2f7765696768743e507265706f72745f646566756e63745f766f74657204187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365345d01205265706f727420607461726765746020666f72206265696e6720616e20646566756e637420766f7465722e20496e2063617365206f6620612076616c6964207265706f72742c20746865207265706f727465722069735d012072657761726465642062792074686520626f6e6420616d6f756e74206f662060746172676574602e204f74686572776973652c20746865207265706f7274657220697473656c662069732072656d6f76656420616e645c20746865697220626f6e6420697320736c61736865642e0088204120646566756e637420766f74657220697320646566696e656420746f2062653a4d012020202d206120766f7465722077686f73652063757272656e74207375626d697474656420766f7465732061726520616c6c20696e76616c69642e20692e652e20616c6c206f66207468656d20617265206e6fb420202020206c6f6e67657220612063616e646964617465206e6f7220616e20616374697665206d656d6265722e002c2023203c7765696768743e2c202323232320537461746515012052656164733a204f284e4c6f674d2920676976656e204d2063757272656e742063616e6469646174657320616e64204e20766f74657320666f722060746172676574602e34205772697465733a204f283129302023203c2f7765696768743e407375626d69745f63616e646964616379003478205375626d6974206f6e6573656c6620666f722063616e6469646163792e006420412063616e6469646174652077696c6c206569746865723aec2020202d204c6f73652061742074686520656e64206f6620746865207465726d20616e6420666f7266656974207468656972206465706f7369742e2d012020202d2057696e20616e64206265636f6d652061206d656d6265722e204d656d626572732077696c6c206576656e7475616c6c7920676574207468656972207374617368206261636b2e55012020202d204265636f6d6520612072756e6e65722d75702e2052756e6e6572732d75707320617265207265736572766564206d656d6265727320696e2063617365206f6e65206765747320666f72636566756c6c7934202020202072656d6f7665642e002c2023203c7765696768743e2c20232323232053746174658c2052656164733a204f284c6f674e2920476976656e204e2063616e646964617465732e34205772697465733a204f283129302023203c2f7765696768743e4872656e6f756e63655f63616e646964616379002451012052656e6f756e6365206f6e65277320696e74656e74696f6e20746f20626520612063616e64696461746520666f7220746865206e65787420656c656374696f6e20726f756e642e203320706f74656e7469616c40206f7574636f6d65732065786973743a4101202d20606f726967696e6020697320612063616e64696461746520616e64206e6f7420656c656374656420696e20616e79207365742e20496e207468697320636173652c2074686520626f6e64206973f4202020756e72657365727665642c2072657475726e656420616e64206f726967696e2069732072656d6f76656420617320612063616e6469646174652e5901202d20606f726967696e6020697320612063757272656e742072756e6e65722075702e20496e207468697320636173652c2074686520626f6e6420697320756e72657365727665642c2072657475726e656420616e64842020206f726967696e2069732072656d6f76656420617320612072756e6e65722e4d01202d20606f726967696e6020697320612063757272656e74206d656d6265722e20496e207468697320636173652c2074686520626f6e6420697320756e726573657276656420616e64206f726967696e206973590120202072656d6f7665642061732061206d656d6265722c20636f6e73657175656e746c79206e6f74206265696e6720612063616e64696461746520666f7220746865206e65787420726f756e6420616e796d6f72652e650120202053696d696c617220746f205b6072656d6f76655f766f746572605d2c206966207265706c6163656d656e742072756e6e657273206578697374732c20746865792061726520696d6d6564696174656c7920757365642e3472656d6f76655f6d656d626572040c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365345d012052656d6f7665206120706172746963756c6172206d656d6265722066726f6d20746865207365742e20546869732069732065666665637469766520696d6d6564696174656c7920616e642074686520626f6e64206f668020746865206f7574676f696e67206d656d62657220697320736c61736865642e00590120496620612072756e6e65722d757020697320617661696c61626c652c207468656e2074686520626573742072756e6e65722d75702077696c6c2062652072656d6f76656420616e64207265706c6163657320746865f4206f7574676f696e67206d656d6265722e204f74686572776973652c2061206e65772070687261676d656e20726f756e6420697320737461727465642e004501204e6f74652074686174207468697320646f6573206e6f7420616666656374207468652064657369676e6174656420626c6f636b206e756d626572206f6620746865206e65787420656c656374696f6e2e002c2023203c7765696768743e2c2023232323205374617465582052656164733a204f28646f5f70687261676d656e295c205772697465733a204f28646f5f70687261676d656e29302023203c2f7765696768743e01141c4e65775465726d04645665633c284163636f756e7449642c2042616c616e6365293e0855012041206e6577207465726d2077697468206e6577206d656d626572732e205468697320696e64696361746573207468617420656e6f7567682063616e6469646174657320657869737465642c206e6f742074686174450120656e6f756768206861766520686173206265656e20656c65637465642e2054686520696e6e65722076616c7565206d757374206265206578616d696e656420666f72207468697320707572706f73652e24456d7074795465726d0004d8204e6f20286f72206e6f7420656e6f756768292063616e64696461746573206578697374656420666f72207468697320726f756e642e304d656d6265724b69636b656404244163636f756e7449640845012041206d656d62657220686173206265656e2072656d6f7665642e20546869732073686f756c6420616c7761797320626520666f6c6c6f7765642062792065697468657220604e65775465726d60206f74342060456d7074795465726d602e3c4d656d62657252656e6f756e63656404244163636f756e74496404a02041206d656d626572206861732072656e6f756e6365642074686569722063616e6469646163792e34566f7465725265706f727465640c244163636f756e744964244163636f756e74496410626f6f6c086101204120766f7465722028666972737420656c656d656e742920776173207265706f72746564202862797420746865207365636f6e6420656c656d656e742920776974682074686520746865207265706f7274206265696e678c207375636365737366756c206f72206e6f742028746869726420656c656d656e74292e143443616e646964616379426f6e643042616c616e63654f663c543e400010a5d4e800000000000000000000000028566f74696e67426f6e643042616c616e63654f663c543e4000743ba40b00000000000000000000000038446573697265644d656d626572730c753332100d00000000404465736972656452756e6e65727355700c753332100700000000305465726d4475726174696f6e38543a3a426c6f636b4e756d6265721040380000003830556e61626c65546f566f746504c42043616e6e6f7420766f7465207768656e206e6f2063616e64696461746573206f72206d656d626572732065786973742e1c4e6f566f7465730498204d75737420766f746520666f72206174206c65617374206f6e652063616e6469646174652e30546f6f4d616e79566f74657304882043616e6e6f7420766f7465206d6f7265207468616e2063616e646964617465732e504d6178696d756d566f7465734578636565646564049c2043616e6e6f7420766f7465206d6f7265207468616e206d6178696d756d20616c6c6f7765642e284c6f7742616c616e636504c82043616e6e6f7420766f74652077697468207374616b65206c657373207468616e206d696e696d756d2062616c616e63652e3c556e61626c65546f506179426f6e64047c20566f7465722063616e206e6f742070617920766f74696e6720626f6e642e2c4d7573744265566f7465720444204d757374206265206120766f7465722e285265706f727453656c6604502043616e6e6f74207265706f72742073656c662e4c4475706c69636174656443616e6469646174650484204475706c6963617465642063616e646964617465207375626d697373696f6e2e304d656d6265725375626d6974048c204d656d6265722063616e6e6f742072652d7375626d69742063616e6469646163792e3052756e6e65725375626d6974048c2052756e6e65722063616e6e6f742072652d7375626d69742063616e6469646163792e68496e73756666696369656e7443616e64696461746546756e647304982043616e64696461746520646f6573206e6f74206861766520656e6f7567682066756e64732e34496e76616c69644f726967696e04c8204f726967696e206973206e6f7420612063616e6469646174652c206d656d626572206f7220612072756e6e65722075702e244e6f744d656d6265720438204e6f742061206d656d6265722e4c546563686e6963616c4d656d62657273686970014c496e7374616e6365314d656d62657273686970041c4d656d626572730100445665633c543a3a4163636f756e7449643e040004c8205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e0114286164645f6d656d626572040c77686f30543a3a4163636f756e7449640c7c204164642061206d656d626572206077686f6020746f20746865207365742e00b4204d6179206f6e6c792062652063616c6c65642066726f6d20604164644f726967696e60206f7220726f6f742e3472656d6f76655f6d656d626572040c77686f30543a3a4163636f756e7449640c902052656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e00c0204d6179206f6e6c792062652063616c6c65642066726f6d206052656d6f76654f726967696e60206f7220726f6f742e2c737761705f6d656d626572081872656d6f766530543a3a4163636f756e7449640c61646430543a3a4163636f756e7449640cc02053776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e00b8204d6179206f6e6c792062652063616c6c65642066726f6d2060537761704f726967696e60206f7220726f6f742e3472657365745f6d656d62657273041c6d656d62657273445665633c543a3a4163636f756e7449643e105901204368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e646c207061737320606d656d6265727360207072652d736f727465642e00bc204d6179206f6e6c792062652063616c6c65642066726f6d206052657365744f726967696e60206f7220726f6f742e286368616e67655f6b6579040c6e657730543a3a4163636f756e7449640cd82053776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e00f4204d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e01182c4d656d62657241646465640004e42054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e344d656d62657252656d6f7665640004ec2054686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e384d656d62657273537761707065640004dc2054776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e304d656d6265727352657365740004190120546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e284b65794368616e676564000488204f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e1444756d6d7904bc73705f7374643a3a6d61726b65723a3a5068616e746f6d446174613c284163636f756e7449642c204576656e74293e0470205068616e746f6d206d656d6265722c206e6576657220757365642e000020547265617375727901205472656173757279143450726f706f73616c436f756e7401003450726f706f73616c496e646578100000000004a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c730001013450726f706f73616c496e6465789050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c730100485665633c50726f706f73616c496e6465783e040004f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e10546970730001051c543a3a48617368f04f70656e5469703c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265722c20543a3a486173683e0004000c59012054697073207468617420617265206e6f742079657420636f6d706c657465642e204b65796564206279207468652068617368206f66206028726561736f6e2c2077686f29602066726f6d207468652076616c75652e3d012054686973206861732074686520696e73656375726520656e756d657261626c6520686173682066756e6374696f6e2073696e636520746865206b657920697473656c6620697320616c7265616479802067756172616e7465656420746f20626520612073656375726520686173682e1c526561736f6e730001051c543a3a486173681c5665633c75383e0004000849012053696d706c6520707265696d616765206c6f6f6b75702066726f6d2074686520726561736f6e2773206861736820746f20746865206f726967696e616c20646174612e20416761696e2c2068617320616e610120696e73656375726520656e756d657261626c6520686173682073696e636520746865206b65792069732067756172616e7465656420746f2062652074686520726573756c74206f6620612073656375726520686173682e01203470726f706f73655f7370656e64081476616c756554436f6d706163743c42616c616e63654f663c543e3e2c62656e65666963696172798c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365242d012050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c7565350120697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e636520746865542070726f706f73616c20697320617761726465642e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e94202d204f6e65204442206368616e67652c206f6e6520657874726120444220656e7472792e302023203c2f7765696768743e3c72656a6563745f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e1cfc2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e40202d204f6e6520444220636c6561722e302023203c2f7765696768743e40617070726f76655f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e205d0120417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e6566696369617279ac20616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e44202d204f6e65204442206368616e67652e302023203c2f7765696768743e387265706f72745f617765736f6d650818726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e7449644c5d01205265706f727420736f6d657468696e672060726561736f6e60207468617420646573657276657320612074697020616e6420636c61696d20616e79206576656e7475616c207468652066696e6465722773206665652e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005501205061796d656e743a20605469705265706f72744465706f73697442617365602077696c6c2062652072657365727665642066726f6d20746865206f726967696e206163636f756e742c2061732077656c6c206173d420605469705265706f72744465706f736974506572427974656020666f722065616368206279746520696e2060726561736f6e602e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743e9c202d20604f2852296020776865726520605260206c656e677468206f662060726561736f6e602e64202d204f6e652062616c616e6365206f7065726174696f6e2e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e2c726574726163745f7469700410686173681c543a3a486173684c550120526574726163742061207072696f72207469702d7265706f72742066726f6d20607265706f72745f617765736f6d65602c20616e642063616e63656c207468652070726f63657373206f662074697070696e672e00e0204966207375636365737366756c2c20746865206f726967696e616c206465706f7369742077696c6c20626520756e72657365727665642e00510120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642074686520746970206964656e746966696564206279206068617368604501206d7573742068617665206265656e207265706f7274656420627920746865207369676e696e67206163636f756e74207468726f75676820607265706f72745f617765736f6d65602028616e64206e6f7450207468726f75676820607469705f6e657760292e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e009020456d697473206054697052657472616374656460206966207375636365737366756c2e002c2023203c7765696768743e24202d20604f2854296064202d204f6e652062616c616e6365206f7065726174696f6e2ec4202d2054776f2073746f726167652072656d6f76616c7320286f6e6520726561642c20636f64656320604f28542960292e34202d204f6e65206576656e742e302023203c2f7765696768743e1c7469705f6e65770c18726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e744964247469705f76616c75653042616c616e63654f663c543e4cf4204769766520612074697020666f7220736f6d657468696e67206e65773b206e6f2066696e6465722773206665652077696c6c2062652074616b656e2e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743e4101202d20604f2852202b2054296020776865726520605260206c656e677468206f662060726561736f6e602c2060546020697320746865206e756d626572206f6620746970706572732e2060546020697345012020206e61747572616c6c79206361707065642061732061206d656d62657273686970207365742c20605260206973206c696d69746564207468726f756768207472616e73616374696f6e2d73697a652e0d01202d2054776f2073746f7261676520696e73657274696f6e732028636f6465637320604f285229602c20604f28542960292c206f6e65207265616420604f283129602e34202d204f6e65206576656e742e302023203c2f7765696768743e0c7469700810686173681c543a3a48617368247469705f76616c75653042616c616e63654f663c543e4cb4204465636c6172652061207469702076616c756520666f7220616e20616c72656164792d6f70656e207469702e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f66207468652068617368206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279382020206163636f756e742049442e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e00650120456d6974732060546970436c6f73696e676020696620746865207468726573686f6c64206f66207469707065727320686173206265656e207265616368656420616e642074686520636f756e74646f776e20706572696f64342068617320737461727465642e002c2023203c7765696768743e24202d20604f285429600101202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28542960292c206f6e652073746f72616765207265616420604f283129602e4c202d20557020746f206f6e65206576656e742e302023203c2f7765696768743e24636c6f73655f7469700410686173681c543a3a48617368386020436c6f736520616e64207061796f75742061207469702e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0019012054686520746970206964656e74696669656420627920606861736860206d75737420686176652066696e69736865642069747320636f756e74646f776e20706572696f642e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e002c2023203c7765696768743e24202d20604f28542960e4202d204f6e652073746f726167652072657472696576616c2028636f64656320604f285429602920616e642074776f2072656d6f76616c732e88202d20557020746f2074687265652062616c616e6365206f7065726174696f6e732e302023203c2f7765696768743e012c2050726f706f736564043450726f706f73616c496e6465780438204e65772070726f706f73616c2e205370656e64696e67041c42616c616e636504e8205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e1c417761726465640c3450726f706f73616c496e6465781c42616c616e6365244163636f756e744964048020536f6d652066756e64732068617665206265656e20616c6c6f63617465642e2052656a6563746564083450726f706f73616c496e6465781c42616c616e636504b420412070726f706f73616c207761732072656a65637465643b2066756e6473207765726520736c61736865642e144275726e74041c42616c616e6365048c20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20526f6c6c6f766572041c42616c616e6365043101205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e1c4465706f736974041c42616c616e6365048020536f6d652066756e64732068617665206265656e206465706f73697465642e184e657754697004104861736804982041206e6577207469702073756767657374696f6e20686173206265656e206f70656e65642e28546970436c6f73696e6704104861736804dc2041207469702073756767657374696f6e206861732072656163686564207468726573686f6c6420616e6420697320636c6f73696e672e24546970436c6f7365640c1048617368244163636f756e7449641c42616c616e636504882041207469702073756767657374696f6e20686173206265656e20636c6f7365642e3054697052657472616374656404104861736804942041207469702073756767657374696f6e20686173206265656e207265747261637465642e203050726f706f73616c426f6e641c5065726d696c6c1050c30000085501204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e110120416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e4c50726f706f73616c426f6e644d696e696d756d3042616c616e63654f663c543e400040e59c301200000000000000000000044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f6438543a3a426c6f636b4e756d6265721080510100048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e1c5065726d696c6c10000000000411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e30546970436f756e74646f776e38543a3a426c6f636b4e756d62657210403800000445012054686520706572696f6420666f722077686963682061207469702072656d61696e73206f70656e20616674657220697320686173206163686965766564207468726573686f6c6420746970706572732e3454697046696e646572734665651c50657263656e7404140431012054686520616d6f756e74206f66207468652066696e616c2074697020776869636820676f657320746f20746865206f726967696e616c207265706f72746572206f6620746865207469702e505469705265706f72744465706f736974426173653042616c616e63654f663c543e400010a5d4e8000000000000000000000004d42054686520616d6f756e742068656c64206f6e206465706f73697420666f7220706c6163696e67206120746970207265706f72742e5c5469705265706f72744465706f736974506572427974653042616c616e63654f663c543e4000e40b540200000000000000000000000409012054686520616d6f756e742068656c64206f6e206465706f7369742070657220627974652077697468696e2074686520746970207265706f727420726561736f6e2e2070496e73756666696369656e7450726f706f7365727342616c616e6365047c2050726f706f73657227732062616c616e636520697320746f6f206c6f772e50496e76616c696450726f706f73616c496e646578046c204e6f2070726f706f73616c206174207468617420696e6465782e30526561736f6e546f6f42696704882054686520726561736f6e20676976656e206973206a75737420746f6f206269672e30416c72656164794b6e6f776e048c20546865207469702077617320616c726561647920666f756e642f737461727465642e28556e6b6e6f776e54697004642054686520746970206861736820697320756e6b6e6f776e2e244e6f7446696e64657204210120546865206163636f756e7420617474656d7074696e6720746f20726574726163742074686520746970206973206e6f74207468652066696e646572206f6620746865207469702e245374696c6c4f70656e042d0120546865207469702063616e6e6f7420626520636c61696d65642f636c6f736564206265636175736520746865726520617265206e6f7420656e6f7567682074697070657273207965742e245072656d617475726504350120546865207469702063616e6e6f7420626520636c61696d65642f636c6f73656420626563617573652069742773207374696c6c20696e2074686520636f756e74646f776e20706572696f642e18436c61696d730118436c61696d730c18436c61696d730001013c457468657265756d416464726573733042616c616e63654f663c543e0004000014546f74616c01003042616c616e63654f663c543e4000000000000000000000000000000000001c56657374696e670001013c457468657265756d41646472657373b02842616c616e63654f663c543e2c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265722900040010782056657374696e67207363686564756c6520666f72206120636c61696d2e0d012046697273742062616c616e63652069732074686520746f74616c20616d6f756e7420746861742073686f756c642062652068656c6420666f722076657374696e672ee4205365636f6e642062616c616e636520697320686f77206d7563682073686f756c6420626520756e6c6f636b65642070657220626c6f636b2ecc2054686520626c6f636b206e756d626572206973207768656e207468652076657374696e672073686f756c642073746172742e010814636c61696d08106465737430543a3a4163636f756e74496448657468657265756d5f7369676e61747572653845636473615369676e61747572650438204d616b65206120636c61696d2e286d696e745f636c61696d0c0c77686f3c457468657265756d416464726573731476616c75653042616c616e63654f663c543e4076657374696e675f7363686564756c65d04f7074696f6e3c2842616c616e63654f663c543e2c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d626572293e0488204164642061206e657720636c61696d2c20696620796f752061726520726f6f742e01041c436c61696d65640c244163636f756e7449643c457468657265756d416464726573731c42616c616e6365046c20536f6d656f6e6520636c61696d656420736f6d6520444f54732e041850726566697814265b75385d807c506179204b534d7320746f20746865204b7573616d61206163636f756e743a04150120546865205072656669782074686174206973207573656420696e207369676e656420457468657265756d206d6573736167657320666f722074686973206e6574776f726b002850617261636861696e73012850617261636861696e73242c417574686f7269746965730100405665633c56616c696461746f7249643e0400049420416c6c20617574686f72697469657327206b65797320617420746865206d6f6d656e742e10436f6465000101185061726149641c5665633c75383e0004000498205468652070617261636861696e7320726567697374657265642061742070726573656e742e144865616473000101185061726149641c5665633c75383e00040004cc20546865206865616473206f66207468652070617261636861696e7320726567697374657265642061742070726573656e742e2857617465726d61726b730001011850617261496438543a3a426c6f636b4e756d6265720004000cfc205468652077617465726d61726b2068656967687473206f66207468652070617261636861696e7320726567697374657265642061742070726573656e742e410120466f722065766572792070617261636861696e2c20746869732069732074686520626c6f636b206865696768742066726f6d20776869636820616c6c206d6573736167657320746172676574696e675d0120746861742070617261636861696e2068617665206265656e2070726f6365737365642e2043616e20626520604e6f6e6560206f6e6c79206966207468652070617261636861696e20646f65736e27742065786973742e3c556e726f75746564496e67726573730001016028543a3a426c6f636b4e756d6265722c20506172614964294c5665633c285061726149642c2048617368293e00040010550120556e726f7574656420696e67726573732e204d6170732028426c6f636b4e756d6265722c20746f5f636861696e2920706169727320746f205b2866726f6d5f636861696e2c206567726573735f726f6f74295d2e004d01205468657265206d617920626520616e20656e74727920756e6465722028692c20702920696e2074686973206d617020666f722065766572792069206265747765656e207468652070617261636861696e2773842077617465726d61726b20616e64207468652063757272656e7420626c6f636b2e4852656c61794469737061746368517565756501010118506172614964485665633c5570776172644d6573736167653e000400081d01204d6573736167657320726561647920746f2062652064697370617463686564206f6e746f207468652072656c617920636861696e2e204974206973207375626a65637420746fc820604d41585f4d4553534147455f434f554e546020616e64206057415445524d41524b5f4d4553534147455f53495a45602e5852656c61794469737061746368517565756553697a650101011850617261496428287533322c2075333229002000000000000000000c45012053697a65206f6620746865206469737061746368207175657565732e205365706172617465642066726f6d2061637475616c206461746120696e206f7264657220746f2061766f696420636f73746c795901206465636f64696e67207768656e20636865636b696e6720726563656970742076616c69646974792e204669727374206974656d20696e207475706c652069732074686520636f756e74206f66206d65737361676573fc097365636f6e642069662074686520746f74616c206c656e6774682028696e20627974657329206f6620746865206d657373616765207061796c6f6164732e344e65656473446973706174636801002c5665633c5061726149643e040004110120546865206f726465726564206c697374206f662050617261496473207468617420686176652061206052656c6179446973706174636851756575656020656e7472792e2444696455706461746500002c5665633c5061726149643e040010650120536f6d65206966207468652070617261636861696e20686561647320676574207570646174656420696e207468697320626c6f636b2c20616c6f6e672077697468207468652070617261636861696e204944732074686174350120646964207570646174652e204f72646572656420696e207468652073616d652077617920617320607265676973747261723a3a416374697665602028692e652e20627920506172614964292e0064204e6f6e65206966206e6f742079657420757064617465642e0104247365745f686561647304146865616473585665633c417474657374656443616e6469646174653e0415012050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e000000304174746573746174696f6e7301304174746573746174696f6e730c40526563656e7450617261426c6f636b7300010138543a3a426c6f636b4e756d62657244496e636c75646564426c6f636b733c543e00040008f02041206d617070696e672066726f6d206d6f64756c617220626c6f636b206e756d62657220286e2025204174746573746174696f6e506572696f6429cc20746f2073657373696f6e20696e64657820616e6420746865206c697374206f662063616e646964617465206861736865732e5450617261426c6f636b4174746573746174696f6e7300020138543a3a426c6f636b4e756d626572104861736850426c6f636b4174746573746174696f6e733c543e00040004a8204174746573746174696f6e73206f6e206120726563656e742070617261636861696e20626c6f636b2e24446964557064617465010010626f6f6c0400000104446d6f72655f6174746573746174696f6e7304145f6d6f7265404d6f72654174746573746174696f6e730415012050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e00000014536c6f74730114536c6f7473243841756374696f6e436f756e74657201003041756374696f6e496e646578100000000004d820546865206e756d626572206f662061756374696f6e7320746861742068617665206265656e207374617274656420736f206661722e284d616e6167656449647301002c5665633c5061726149643e0400084d01204f726465726564206c697374206f6620616c6c2060506172614964602076616c756573207468617420617265206d616e616765642062792074686973206d6f64756c652e205468697320696e636c75646573290120636861696e73207468617420617265206e6f7420796574206465706c6f7965642028627574206861766520776f6e20616e2061756374696f6e20696e2074686520667574757265292e204465706f7369747301010118506172614964445665633c42616c616e63654f663c543e3e000400345d0120566172696f757320616d6f756e7473206f6e206465706f73697420666f7220656163682070617261636861696e2e20416e20656e74727920696e20604d616e616765644964736020696d706c6965732061206e6f6e2d502064656661756c7420656e74727920686572652e006501205468652061637475616c20616d6f756e74206c6f636b6564206f6e2069747320626568616c6620617420616e792074696d6520697320746865206d6178696d756d206974656d20696e2074686973206c6973742e205468655101206669727374206974656d20696e20746865206c6973742069732074686520616d6f756e74206c6f636b656420666f72207468652063757272656e74204c6561736520506572696f642e20466f6c6c6f77696e67b0206974656d732061726520666f72207468652073756273657175656e74206c6561736520706572696f64732e006101205468652064656661756c742076616c75652028616e20656d707479206c6973742920696d706c6965732074686174207468652070617261636861696e206e6f206c6f6e6765722065786973747320286f72206e65766572b4206578697374656429206173206661722061732074686973206d6f64756c6520697320636f6e6365726e65642e00510120496620612070617261636861696e20646f65736e2774206578697374202a7965742a20627574206973207363686564756c656420746f20657869737420696e20746865206675747572652c207468656e2069745d012077696c6c206265206c6566742d7061646465642077697468206f6e65206f72206d6f7265207a65726f657320746f2064656e6f74652074686520666163742074686174206e6f7468696e672069732068656c64206f6e5d01206465706f73697420666f7220746865206e6f6e2d6578697374656e7420636861696e2063757272656e746c792c206275742069732068656c6420617420736f6d6520706f696e7420696e20746865206675747572652e2c41756374696f6e496e666f000088284c65617365506572696f644f663c543e2c20543a3a426c6f636b4e756d62657229040014f820496e666f726d6174696f6e2072656c6174696e6720746f207468652063757272656e742061756374696f6e2c206966207468657265206973206f6e652e00450120546865206669727374206974656d20696e20746865207475706c6520697320746865206c6561736520706572696f6420696e646578207468617420746865206669727374206f662074686520666f7572510120636f6e746967756f7573206c6561736520706572696f6473206f6e2061756374696f6e20697320666f722e20546865207365636f6e642069732074686520626c6f636b206e756d626572207768656e207468655d012061756374696f6e2077696c6c2022626567696e20746f20656e64222c20692e652e2074686520666972737420626c6f636b206f662074686520456e64696e6720506572696f64206f66207468652061756374696f6e2e1c57696e6e696e6700010138543a3a426c6f636b4e756d6265723857696e6e696e67446174613c543e0004000c5d01205468652077696e6e696e67206269647320666f722065616368206f66207468652031302072616e676573206174206561636820626c6f636b20696e207468652066696e616c20456e64696e6720506572696f64206f665101207468652063757272656e742061756374696f6e2e20546865206d61702773206b65792069732074686520302d626173656420696e64657820696e746f2074686520456e64696e6720506572696f642e205468651d0120666972737420626c6f636b206f662074686520656e64696e6720706572696f6420697320303b20746865206c6173742069732060456e64696e67506572696f64202d2031602e3c5265736572766564416d6f756e7473000101504269646465723c543a3a4163636f756e7449643e3042616c616e63654f663c543e00040008310120416d6f756e74732063757272656e746c7920726573657276656420696e20746865206163636f756e7473206f662074686520626964646572732063757272656e746c792077696e6e696e673820287375622d2972616e6765732e304f6e626f6172645175657565010101404c65617365506572696f644f663c543e2c5665633c5061726149643e0004000865012054686520736574206f662050617261204944732074686174206861766520776f6e20616e64206e65656420746f206265206f6e2d626f617264656420617420616e207570636f6d696e67206c656173652d706572696f642ef0205468697320697320636c6561726564206f7574206f6e2074686520666972737420626c6f636b206f6620746865206c6561736520706572696f642e284f6e626f617264696e6700010118506172614964f0284c65617365506572696f644f663c543e2c20496e636f6d696e6750617261636861696e3c543a3a4163636f756e7449642c20543a3a486173683e29000400104d01205468652061637475616c206f6e2d626f617264696e6720696e666f726d6174696f6e2e204f6e6c7920657869737473207768656e206f6e65206f662074686520666f6c6c6f77696e6720697320747275653a2501202d204974206973206265666f726520746865206c6561736520706572696f642074686174207468652070617261636861696e2073686f756c64206265206f6e2d626f61726465642e5901202d205468652066756c6c206f6e2d626f617264696e6720696e666f726d6174696f6e20686173206e6f7420796574206265656e2070726f766964656420616e64207468652070617261636861696e206973206e6f746c207965742064756520746f206265206f66662d626f61726465642e2c4f6666626f617264696e670101011850617261496430543a3a4163636f756e74496400800000000000000000000000000000000000000000000000000000000000000000086501204f66662d626f617264696e67206163636f756e743b2063757272656e63792068656c64206f6e206465706f73697420666f72207468652070617261636861696e206765747320706c6163656420686572652069662074686539012070617261636861696e2067657473206f66662d626f61726465643b20692e652e20697473206c6561736520706572696f6420697320757020616e642069742069736e27742072656e657765642e01182c6e65775f61756374696f6e08206475726174696f6e5c436f6d706163743c543a3a426c6f636b4e756d6265723e486c656173655f706572696f645f696e64657864436f6d706163743c4c65617365506572696f644f663c543e3e1458204372656174652061206e65772061756374696f6e2e00550120546869732063616e206f6e6c792068617070656e207768656e2074686572652069736e277420616c726561647920616e2061756374696f6e20696e2070726f677265737320616e64206d6179206f6e6c7920626529012063616c6c65642062792074686520726f6f74206f726967696e2e20416363657074732074686520606475726174696f6e60206f6620746869732061756374696f6e20616e64207468655d0120606c656173655f706572696f645f696e64657860206f662074686520696e697469616c206c6561736520706572696f64206f662074686520666f757220746861742061726520746f2062652061756374696f6e65642e0c626964140c73756238436f6d706163743c53756249643e3461756374696f6e5f696e64657854436f6d706163743c41756374696f6e496e6465783e2866697273745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e246c6173745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e18616d6f756e7454436f6d706163743c42616c616e63654f663c543e3e404d01204d616b652061206e6577206269642066726f6d20616e206163636f756e742028696e636c7564696e6720612070617261636861696e206163636f756e742920666f72206465706c6f79696e672061206e65772c2070617261636861696e2e005d01204d756c7469706c652073696d756c74616e656f757320626964732066726f6d207468652073616d65206269646465722061726520616c6c6f776564206f6e6c79206173206c6f6e6720617320616c6c2061637469766541012062696473206f7665726c61702065616368206f746865722028692e652e20617265206d757475616c6c79206578636c7573697665292e20426964732063616e6e6f742062652072656461637465642e005901202d20607375626020697320746865207375622d6269646465722049442c20616c6c6f77696e6720666f72206d756c7469706c6520636f6d706574696e67206269647320746f206265206d6164652062792028616e64742066756e64656420627929207468652073616d65206163636f756e742e5101202d206061756374696f6e5f696e646578602069732074686520696e646578206f66207468652061756374696f6e20746f20626964206f6e2e2053686f756c64206a757374206265207468652070726573656e746c2076616c7565206f66206041756374696f6e436f756e746572602e4d01202d206066697273745f736c6f746020697320746865206669727374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4501202d20606c6173745f736c6f746020697320746865206c617374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4d01202d2060616d6f756e74602069732074686520616d6f756e7420746f2062696420746f2062652068656c64206173206465706f73697420666f72207468652070617261636861696e2073686f756c6420746865cc206269642077696e2e205468697320616d6f756e742069732068656c64207468726f7567686f7574207468652072616e67652e246269645f72656e6577103461756374696f6e5f696e64657854436f6d706163743c41756374696f6e496e6465783e2866697273745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e246c6173745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e18616d6f756e7454436f6d706163743c42616c616e63654f663c543e3e3c5101204d616b652061206e6577206269642066726f6d20612070617261636861696e206163636f756e7420666f722072656e6577696e67207468617420287072652d6578697374696e67292070617261636861696e2e00a820546865206f726967696e202a6d7573742a20626520612070617261636861696e206163636f756e742e005d01204d756c7469706c652073696d756c74616e656f757320626964732066726f6d207468652073616d65206269646465722061726520616c6c6f776564206f6e6c79206173206c6f6e6720617320616c6c2061637469766541012062696473206f7665726c61702065616368206f746865722028692e652e20617265206d757475616c6c79206578636c7573697665292e20426964732063616e6e6f742062652072656461637465642e005101202d206061756374696f6e5f696e646578602069732074686520696e646578206f66207468652061756374696f6e20746f20626964206f6e2e2053686f756c64206a757374206265207468652070726573656e746c2076616c7565206f66206041756374696f6e436f756e746572602e4d01202d206066697273745f736c6f746020697320746865206669727374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4501202d20606c6173745f736c6f746020697320746865206c617374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4d01202d2060616d6f756e74602069732074686520616d6f756e7420746f2062696420746f2062652068656c64206173206465706f73697420666f72207468652070617261636861696e2073686f756c6420746865cc206269642077696e2e205468697320616d6f756e742069732068656c64207468726f7567686f7574207468652072616e67652e3c7365745f6f6666626f617264696e670410646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636514c82053657420746865206f66662d626f617264696e6720696e666f726d6174696f6e20666f7220612070617261636861696e2e00a820546865206f726967696e202a6d7573742a20626520612070617261636861696e206163636f756e742e002101202d20606465737460206973207468652064657374696e6174696f6e206163636f756e7420746f2072656365697665207468652070617261636861696e2773206465706f7369742e3c6669785f6465706c6f795f64617461100c73756238436f6d706163743c53756249643e1c706172615f69643c436f6d706163743c5061726149643e24636f64655f686173681c543a3a4861736844696e697469616c5f686561645f646174611c5665633c75383e1c2d012053657420746865206465706c6f7920696e666f726d6174696f6e20666f722061207375636365737366756c2062696420746f206465706c6f792061206e65772070617261636861696e2e00c8202d20606f726967696e60206d75737420626520746865207375636365737366756c20626964646572206163636f756e742eb0202d20607375626020697320746865207375622d626964646572204944206f6620746865206269646465722e0101202d2060706172615f696460206973207468652070617261636861696e20494420616c6c6f7474656420746f207468652077696e6e696e67206269646465722e1d01202d2060636f64655f6861736860206973207468652068617368206f66207468652070617261636861696e2773205761736d2076616c69646174696f6e2066756e6374696f6e2ef0202d2060696e697469616c5f686561645f6461746160206973207468652070617261636861696e277320696e697469616c206865616420646174612e54656c61626f726174655f6465706c6f795f64617461081c706172615f69643c436f6d706163743c5061726149643e10636f64651c5665633c75383e3074204e6f74652061206e65772070617261636861696e277320636f64652e004d012054686973206d7573742062652063616c6c656420616674657220606669785f6465706c6f795f646174616020616e642060636f646560206d7573742062652074686520707265696d616765206f6620746865c42060636f64655f68617368602070617373656420746865726520666f72207468652073616d652060706172615f6964602e0061012054686973206d61792062652063616c6c6564206265666f7265206f722061667465722074686520626567696e6e696e67206f66207468652070617261636861696e2773206669727374206c6561736520706572696f642e45012049662063616c6c6564206265666f7265207468656e207468652070617261636861696e2077696c6c206265636f6d65206163746976652061742074686520666972737420626c6f636b206f66206974736501207374617274696e67206c6561736520706572696f642e2049662061667465722c207468656e2069742077696c6c206265636f6d652061637469766520696d6d6564696174656c7920616674657220746869732063616c6c2e006c202d20605f6f726967696e6020697320697272656c6576616e742efc202d2060706172615f696460206973207468652070617261636861696e2049442077686f736520636f64652077696c6c20626520656c61626f72617465642e1501202d2060636f6465602069732074686520707265696d616765206f662074686520726567697374657265642060636f64655f6861736860206f662060706172615f6964602e011c384e65774c65617365506572696f64042c4c65617365506572696f6404842041206e6577206c6561736520706572696f6420697320626567696e6e696e672e3841756374696f6e537461727465640c3041756374696f6e496e6465782c4c65617365506572696f642c426c6f636b4e756d626572084d0120416e2061756374696f6e20737461727465642e2050726f76696465732069747320696e64657820616e642074686520626c6f636b206e756d6265722077686572652069742077696c6c20626567696e20746f190120636c6f736520616e6420746865206669727374206c6561736520706572696f64206f662074686520717561647275706c657420746861742069732061756374696f6e65642e3441756374696f6e436c6f736564043041756374696f6e496e64657804bc20416e2061756374696f6e20656e6465642e20416c6c2066756e6473206265636f6d6520756e72657365727665642e24576f6e4465706c6f7910504e65774269646465723c4163636f756e7449643e24536c6f7452616e6765185061726149641c42616c616e636504550120536f6d656f6e6520776f6e2074686520726967687420746f206465706c6f7920612070617261636861696e2e2042616c616e636520616d6f756e7420697320646564756374656420666f72206465706f7369742e28576f6e52656e6577616c101850617261496424536c6f7452616e67651c42616c616e63651c42616c616e636508c420416e206578697374696e672070617261636861696e20776f6e2074686520726967687420746f20636f6e74696e75652e41012046697273742062616c616e63652069732074686520657874726120616d6f756e7420726573657665642e205365636f6e642069732074686520746f74616c20616d6f756e742072657365727665642e2052657365727665640c244163636f756e7449641c42616c616e63651c42616c616e6365084d012046756e6473207765726520726573657276656420666f7220612077696e6e696e67206269642e2046697273742062616c616e63652069732074686520657874726120616d6f756e742072657365727665642e54205365636f6e642069732074686520746f74616c2e28556e726573657276656408244163636f756e7449641c42616c616e636504e02046756e6473207765726520756e72657365727665642073696e636520626964646572206973206e6f206c6f6e676572206163746976652e0000245265676973747261720124526567697374726172242850617261636861696e7301002c5665633c5061726149643e0400002c546872656164436f756e7401000c753332100000000004b420546865206e756d626572206f66207468726561647320746f207363686564756c652070657220626c6f636b2e3c53656c6563746564546872656164730100785665633c5665633c285061726149642c20436f6c6c61746f724964293e3e040008510120416e206172726179206f6620746865207175657565206f6620736574206f662074687265616473207363686564756c656420666f722074686520636f6d696e6720626c6f636b733b206f726465726564206279310120617363656e64696e6720706172612049442e2054686572652063616e206265206e6f206475706c696361746573206f66207061726120494420696e2065616368206c697374206974656d2e184163746976650100b85665633c285061726149642c204f7074696f6e3c28436f6c6c61746f7249642c20526574726961626c65293e293e0400185d012050617261746872656164732f636861696e73207363686564756c656420666f7220657865637574696f6e207468697320626c6f636b2e2049662074686520636f6c6c61746f72204944206973207365742c207468656e6101206120706172746963756c617220636f6c6c61746f722068617320616c7265616479206265656e2063686f73656e20666f7220746865206e65787420626c6f636b2c20616e64206e6f206f7468657220636f6c6c61746f725901206d61792070726f766964652074686520626c6f636b2e20496e2074686973206361736520776520616c6c6f772074686520706f73736962696c697479206f662074686520636f6d62696e6174696f6e206265696e67d0207265747269656420696e2061206c6174657220626c6f636b2c206578707265737365642062792060526574726961626c65602e004c204f726465726564206279205061726149642e284e65787446726565496401001850617261496410e8030000083d0120546865206e65787420756e75736564205061726149642076616c75652e2053746172742074686973206869676820696e206f7264657220746f206b656570206c6f77206e756d6265727320666f72542073797374656d2d6c6576656c20636861696e732e2c50656e64696e6753776170000101185061726149641850617261496400040004642050656e64696e672073776170206f7065726174696f6e732e145061726173000101185061726149642050617261496e666f00040004a8204d6170206f6620616c6c20726567697374657265642070617261746872656164732f636861696e732e28526574727951756575650100785665633c5665633c285061726149642c20436f6c6c61746f724964293e3e040004e8205468652063757272656e7420717565756520666f7220706172617468726561647320746861742073686f756c6420626520726574726965642e1c446562746f72730101011850617261496430543a3a4163636f756e7449640080000000000000000000000000000000000000000000000000000000000000000004ac2055736572732077686f20686176652070616964206120706172617468726561642773206465706f736974011c3472656769737465725f70617261100869643c436f6d706163743c5061726149643e10696e666f2050617261496e666f10636f64651c5665633c75383e44696e697469616c5f686561645f646174611c5665633c75383e089820526567697374657220612070617261636861696e207769746820676976656e20636f64652e8c204661696c7320696620676976656e20494420697320616c726561647920757365642e3c646572656769737465725f70617261040869643c436f6d706163743c5061726149643e0494204465726567697374657220612070617261636861696e207769746820676976656e206964407365745f7468726561645f636f756e740414636f756e740c75333214410120526573657420746865206e756d626572206f6620706172617468726561647320746861742063616e2070617920746f206265207363686564756c656420696e20612073696e676c6520626c6f636b2e0098202d2060636f756e74603a20546865206e756d626572206f662070617261746872656164732e0084204d7573742062652063616c6c65642066726f6d20526f6f74206f726967696e2e4c72656769737465725f706172617468726561640810636f64651c5665633c75383e44696e697469616c5f686561645f646174611c5665633c75383e10a42052656769737465722061207061726174687265616420666f7220696d6d656469617465207573652e004d01204d7573742062652073656e742066726f6d2061205369676e6564206f726967696e20746861742069732061626c6520746f206861766520506172617468726561644465706f7369742072657365727665642e39012060636f64656020616e642060696e697469616c5f686561645f646174616020617265207573656420746f20696e697469616c697a6520746865207061726174687265616427732073746174652e4473656c6563745f706172617468726561640c0c5f69643c436f6d706163743c5061726149643e245f636f6c6c61746f7228436f6c6c61746f724964285f686561645f686173681c543a3a4861736814050120506c61636520612062696420666f722061207061726174687265616420746f2062652070726f6772657373656420696e20746865206e65787420626c6f636b2e00410120546869732069732061206b696e64206f66207370656369616c207472616e73616374696f6e20746861742073686f756c642062652068656176696c79207072696f726974697a656420696e207468655d01207472616e73616374696f6e20706f6f6c206163636f7264696e6720746f20746865206076616c7565603b206f6e6c792060546872656164436f756e7460206f66207468656d206d61792062652070726573656e7465645420696e20616e792073696e676c6520626c6f636b2e54646572656769737465725f70617261746872656164001cc820446572656769737465722061207061726174687265616420616e6420726574726965766520746865206465706f7369742e002101204d7573742062652073656e742066726f6d2061206050617261636861696e60206f726967696e2077686963682069732063757272656e746c79206120706172617468726561642e00590120456e737572652074686174206265666f72652063616c6c696e672074686973207468617420616e792066756e647320796f752077616e7420656d70746965642066726f6d20746865207061726174687265616427734501206163636f756e74206973206d6f766564206f75743b20616674657220746869732069742077696c6c20626520696d706f737369626c6520746f207265747269657665207468656d2028776974686f75746820676f7665726e616e636520696e74657276656e74696f6e292e107377617004146f746865723c436f6d706163743c5061726149643e206501205377617020612070617261636861696e207769746820616e6f746865722070617261636861696e206f7220706172617468726561642e20546865206f726967696e206d7573742062652061206050617261636861696e602e65012054686520737761702077696c6c2068617070656e206f6e6c7920696620746865726520697320616c726561647920616e206f70706f7369746520737761702070656e64696e672e204966207468657265206973206e6f742c5d012074686520737761702077696c6c2062652073746f72656420696e207468652070656e64696e67207377617073206d61702c20726561647920666f722061206c6174657220636f6e6669726d61746f727920737761702e00610120546865206050617261496460732072656d61696e206d617070656420746f207468652073616d652068656164206461746120616e6420636f646520736f2065787465726e616c20636f64652063616e2072656c79206f6e410120605061726149646020746f2062652061206c6f6e672d7465726d206964656e746966696572206f662061206e6f74696f6e616c202270617261636861696e222e20486f77657665722c2074686569725901207363686564756c696e6720696e666f2028692e652e2077686574686572207468657927726520612070617261746872656164206f722070617261636861696e292c2061756374696f6e20696e666f726d6174696f6e9820616e64207468652061756374696f6e206465706f736974206172652073776974636865642e0108505061726174687265616452656769737465726564041850617261496404d4204120706172617468726561642077617320726567697374657265643b20697473206e657720494420697320737570706c6965642e5850617261746872656164446572656769737465726564041850617261496404d4205468652070617261746872656164206f662074686520737570706c696564204944207761732064652d726567697374657265642e00001c5574696c697479011c5574696c69747904244d756c74697369677300020530543a3a4163636f756e744964205b75383b2033325dd04d756c74697369673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e02040004942054686520736574206f66206f70656e206d756c7469736967206f7065726174696f6e732e0114146261746368041463616c6c735c5665633c3c542061732054726169743e3a3a43616c6c3e48802053656e642061206261746368206f662064697370617463682063616c6c732e00ec20546869732077696c6c206578656375746520756e74696c20746865206669727374206f6e65206661696c7320616e64207468656e2073746f702e007c204d61792062652063616c6c65642066726f6d20616e79206f726967696e2e00f0202d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e002c2023203c7765696768743ea4202d205468652073756d206f66207468652077656967687473206f6620746865206063616c6c73602e34202d204f6e65206576656e742e302023203c2f7765696768743e00590120546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e3501206576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e20746865590120604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d616465510120616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c657465646050206576656e74206973206465706f73697465642e1861735f7375620814696e6465780c7531361063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e1ce02053656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e70202d2054686520776569676874206f6620746865206063616c6c602e302023203c2f7765696768743e2061735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e1063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3ea4590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e00b42049662074686572652061726520656e6f7567682c207468656e206469737061746368207468652063616c6c2e005101205061796d656e743a20604d756c74697369674465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573610120607468726573686f6c64602074696d657320604d756c74697369674465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2e8c202d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e002101204e4f54453a20556e6c6573732074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2067656e6572616c6c792077616e7420746f207573651d012060617070726f76655f61735f6d756c74696020696e73746561642c2073696e6365206974206f6e6c7920726571756972657320612068617368206f66207468652063616c6c2e005d0120526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c7420696620607468726573686f6c64602069732065786163746c79206031602e204f74686572776973655901206f6e20737563636573732c20726573756c7420697320604f6b6020616e642074686520726573756c742066726f6d2074686520696e746572696f722063616c6c2c206966206974207761732065786563757465642ce0206d617920626520666f756e6420696e20746865206465706f736974656420604d756c7469736967457865637574656460206576656e742e002c2023203c7765696768743e54202d20604f2853202b205a202b2043616c6c29602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2e2501202d204f6e652063616c6c20656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285a296020776865726520605a602069732074782d6c656e2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e70202d2054686520776569676874206f6620746865206063616c6c602e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66f4202020604d756c74697369674465706f73697442617365202b207468726573686f6c64202a204d756c74697369674465706f736974466163746f72602e302023203c2f7765696768743e40617070726f76655f61735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e2463616c6c5f68617368205b75383b2033325d80590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e005101205061796d656e743a20604d756c74697369674465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573610120607468726573686f6c64602074696d657320604d756c74697369674465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e003901204e4f54453a2049662074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2077616e7420746f20757365206061735f6d756c74696020696e73746561642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66f4202020604d756c74697369674465706f73697442617365202b207468726573686f6c64202a204d756c74697369674465706f736974466163746f72602e302023203c2f7765696768743e3c63616e63656c5f61735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e2474696d65706f696e746454696d65706f696e743c543a3a426c6f636b4e756d6265723e2463616c6c5f68617368205b75383b2033325d5859012043616e63656c2061207072652d6578697374696e672c206f6e2d676f696e67206d756c7469736967207472616e73616374696f6e2e20416e79206465706f7369742072657365727665642070726576696f75736c79c820666f722074686973206f7065726174696f6e2077696c6c20626520756e7265736572766564206f6e20737563636573732e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e6101202d206074696d65706f696e74603a205468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c7c207472616e73616374696f6e20666f7220746869732064697370617463682ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602e34202d204f6e65206576656e742e88202d20492f4f3a2031207265616420604f285329602c206f6e652072656d6f76652e74202d2053746f726167653a2072656d6f766573206f6e65206974656d2e302023203c2f7765696768743e0118404261746368496e746572727570746564080c7533323444697370617463684572726f72085901204261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c2061734c2077656c6c20617320746865206572726f722e384261746368436f6d706c657465640004cc204261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e2c4e65774d756c746973696708244163636f756e744964244163636f756e7449640849012041206e6577206d756c7469736967206f7065726174696f6e2068617320626567756e2e20466972737420706172616d20697320746865206163636f756e74207468617420697320617070726f76696e672c80207365636f6e6420697320746865206d756c7469736967206163636f756e742e404d756c7469736967417070726f76616c0c244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449640859012041206d756c7469736967206f7065726174696f6e20686173206265656e20617070726f76656420627920736f6d656f6e652e20466972737420706172616d20697320746865206163636f756e742074686174206973a820617070726f76696e672c20746869726420697320746865206d756c7469736967206163636f756e742e404d756c7469736967457865637574656410244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e744964384469737061746368526573756c74082d012041206d756c7469736967206f7065726174696f6e20686173206265656e2065786563757465642e20466972737420706172616d20697320746865206163636f756e742074686174206973a820617070726f76696e672c20746869726420697320746865206d756c7469736967206163636f756e742e444d756c746973696743616e63656c6c65640c244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449640831012041206d756c7469736967206f7065726174696f6e20686173206265656e2063616e63656c6c65642e20466972737420706172616d20697320746865206163636f756e742074686174206973ac2063616e63656c6c696e672c20746869726420697320746865206d756c7469736967206163636f756e742e0000204964656e7469747901105375646f10284964656e746974794f6600010130543a3a4163636f756e74496468526567697374726174696f6e3c42616c616e63654f663c543e3e00040004210120496e666f726d6174696f6e20746861742069732070657274696e656e7420746f206964656e746966792074686520656e7469747920626568696e6420616e206163636f756e742e1c53757065724f6600010130543a3a4163636f756e7449645028543a3a4163636f756e7449642c204461746129000400086101205468652073757065722d6964656e74697479206f6620616e20616c7465726e6174697665202273756222206964656e7469747920746f676574686572207769746820697473206e616d652c2077697468696e2074686174510120636f6e746578742e20496620746865206163636f756e74206973206e6f7420736f6d65206f74686572206163636f756e742773207375622d6964656e746974792c207468656e206a75737420604e6f6e65602e18537562734f6601010130543a3a4163636f756e744964842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29004400000000000000000000000000000000000cb820416c7465726e6174697665202273756222206964656e746974696573206f662074686973206163636f756e742e001d0120546865206669727374206974656d20697320746865206465706f7369742c20746865207365636f6e64206973206120766563746f72206f6620746865206163636f756e74732e28526567697374726172730100d85665633c4f7074696f6e3c526567697374726172496e666f3c42616c616e63654f663c543e2c20543a3a4163636f756e7449643e3e3e0400104d012054686520736574206f6620726567697374726172732e204e6f7420657870656374656420746f206765742076657279206269672061732063616e206f6e6c79206265206164646564207468726f7567682061a8207370656369616c206f726967696e20286c696b656c79206120636f756e63696c206d6f74696f6e292e0029012054686520696e64657820696e746f20746869732063616e206265206361737420746f2060526567697374726172496e6465786020746f2067657420612076616c69642076616c75652e012c346164645f726567697374726172041c6163636f756e7430543a3a4163636f756e744964347c2041646420612072656769737472617220746f207468652073797374656d2e001d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605265676973747261724f726967696e60206f722060526f6f74602e00ac202d20606163636f756e74603a20746865206163636f756e74206f6620746865207265676973747261722e009820456d6974732060526567697374726172416464656460206966207375636365737366756c2e002c2023203c7765696768743ee4202d20604f2852296020776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e646564292e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e307365745f6964656e746974790410696e666f304964656e74697479496e666f482d012053657420616e206163636f756e742773206964656e7469747920696e666f726d6174696f6e20616e6420726573657276652074686520617070726f707269617465206465706f7369742e00590120496620746865206163636f756e7420616c726561647920686173206964656e7469747920696e666f726d6174696f6e2c20746865206465706f7369742069732074616b656e2061732070617274207061796d656e745420666f7220746865206e6577206465706f7369742e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e0090202d2060696e666f603a20546865206964656e7469747920696e666f726d6174696f6e2e008c20456d69747320604964656e7469747953657460206966207375636365737366756c2e002c2023203c7765696768743e0501202d20604f2858202b2052296020776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e646564292e88202d204174206d6f73742074776f2062616c616e6365206f7065726174696f6e732eac202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f2858202b20522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e207365745f73756273041073756273645665633c28543a3a4163636f756e7449642c2044617461293e40902053657420746865207375622d6163636f756e7473206f66207468652073656e6465722e005901205061796d656e743a20416e79206167677265676174652062616c616e63652072657365727665642062792070726576696f757320607365745f73756273602063616c6c732077696c6c2062652072657475726e6564310120616e6420616e20616d6f756e7420605375624163636f756e744465706f736974602077696c6c20626520726573657276656420666f722065616368206974656d20696e206073756273602e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e009c202d206073756273603a20546865206964656e746974792773207375622d6163636f756e74732e002c2023203c7765696768743eec202d20604f285329602077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e88202d204174206d6f73742074776f2062616c616e6365206f7065726174696f6e732e4101202d204174206d6f7374204f2832202a2053202b2031292073746f72616765206d75746174696f6e733b20636f64656320636f6d706c657869747920604f2831202a2053202b2053202a20312960293b582020206f6e652073746f726167652d6578697374732e302023203c2f7765696768743e38636c6561725f6964656e74697479003c390120436c65617220616e206163636f756e742773206964656e7469747920696e666f20616e6420616c6c207375622d6163636f756e7420616e642072657475726e20616c6c206465706f736974732e00f0205061796d656e743a20416c6c2072657365727665642062616c616e636573206f6e20746865206163636f756e74206172652072657475726e65642e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e009c20456d69747320604964656e74697479436c656172656460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2852202b2053202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e74202d206053202b2032602073746f726167652064656c6574696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e44726571756573745f6a756467656d656e7408247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e1c6d61785f66656554436f6d706163743c42616c616e63654f663c543e3e5c9820526571756573742061206a756467656d656e742066726f6d2061207265676973747261722e005901205061796d656e743a204174206d6f737420606d61785f666565602077696c6c20626520726573657276656420666f72207061796d656e7420746f2074686520726567697374726172206966206a756467656d656e741c20676976656e2e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e002101202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973207265717565737465642e5901202d20606d61785f666565603a20546865206d6178696d756d206665652074686174206d617920626520706169642e20546869732073686f756c64206a757374206265206175746f2d706f70756c617465642061733a0034206060606e6f636f6d70696c65a42053656c663a3a72656769737472617273287265675f696e646578292e75776e72617028292e666565102060606000a820456d69747320604a756467656d656e7452657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2858202b205229602e34202d204f6e65206576656e742e302023203c2f7765696768743e3863616e63656c5f7265717565737404247265675f696e64657838526567697374726172496e646578446c2043616e63656c20612070726576696f757320726571756573742e00fc205061796d656e743a20412070726576696f75736c79207265736572766564206465706f7369742069732072657475726e6564206f6e20737563636573732e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e004901202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206e6f206c6f6e676572207265717565737465642e00b020456d69747320604a756467656d656e74556e72657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e8c202d204f6e652073746f72616765206d75746174696f6e20604f2852202b205829602e34202d204f6e65206576656e742e302023203c2f7765696768743e1c7365745f6665650814696e6465785c436f6d706163743c526567697374726172496e6465783e0c66656554436f6d706163743c42616c616e63654f663c543e3e301d0120536574207468652066656520726571756972656420666f722061206a756467656d656e7420746f206265207265717565737465642066726f6d2061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e58202d2060666565603a20746865206e6577206665652e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602e302023203c2f7765696768743e387365745f6163636f756e745f69640814696e6465785c436f6d706163743c526567697374726172496e6465783e0c6e657730543a3a4163636f756e74496430c0204368616e676520746865206163636f756e74206173736f63696174656420776974682061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e74202d20606e6577603a20746865206e6577206163636f756e742049442e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602e302023203c2f7765696768743e287365745f6669656c64730814696e6465785c436f6d706163743c526567697374726172496e6465783e186669656c6473384964656e746974794669656c647330ac2053657420746865206669656c6420696e666f726d6174696f6e20666f722061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e1101202d20606669656c6473603a20746865206669656c64732074686174207468652072656769737472617220636f6e6365726e73207468656d73656c76657320776974682e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602e302023203c2f7765696768743e4470726f766964655f6a756467656d656e740c247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365246a756467656d656e745c4a756467656d656e743c42616c616e63654f663c543e3e4cbc2050726f766964652061206a756467656d656e7420666f7220616e206163636f756e742773206964656e746974792e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74b4206f6620746865207265676973747261722077686f736520696e64657820697320607265675f696e646578602e002501202d20607265675f696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206265696e67206d6164652e5901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e4d01202d20606a756467656d656e74603a20746865206a756467656d656e74206f662074686520726567697374726172206f6620696e64657820607265675f696e646578602061626f75742060746172676574602e009820456d69747320604a756467656d656e74476976656e60206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e88202d204f6e652062616c616e63652d7472616e73666572206f7065726174696f6e2e98202d20557020746f206f6e65206163636f756e742d6c6f6f6b7570206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2852202b205829602e34202d204f6e65206576656e742e302023203c2f7765696768743e346b696c6c5f6964656e7469747904187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654c45012052656d6f766520616e206163636f756e742773206964656e7469747920616e64207375622d6163636f756e7420696e666f726d6174696f6e20616e6420736c61736820746865206465706f736974732e006501205061796d656e743a2052657365727665642062616c616e6365732066726f6d20607365745f737562736020616e6420607365745f6964656e74697479602061726520736c617368656420616e642068616e646c656420627949012060536c617368602e20566572696669636174696f6e2072657175657374206465706f7369747320617265206e6f742072657475726e65643b20746865792073686f756c642062652063616e63656c6c656484206d616e75616c6c79207573696e67206063616e63656c5f72657175657374602e00310120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f206f72206d617463682060543a3a466f7263654f726967696e602e005901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e009820456d69747320604964656e746974794b696c6c656460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2852202b2053202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e74202d206053202b2032602073746f72616765206d75746174696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e011c2c4964656e7469747953657404244163636f756e74496404f02041206e616d652077617320736574206f72207265736574202877686963682077696c6c2072656d6f766520616c6c206a756467656d656e7473292e3c4964656e74697479436c656172656408244163636f756e7449641c42616c616e636504d02041206e616d652077617320636c65617265642c20616e642074686520676976656e2062616c616e63652072657475726e65642e384964656e746974794b696c6c656408244163636f756e7449641c42616c616e636504c82041206e616d65207761732072656d6f76656420616e642074686520676976656e2062616c616e636520736c61736865642e484a756467656d656e7452657175657374656408244163636f756e74496438526567697374726172496e64657804a02041206a756467656d656e74207761732061736b65642066726f6d2061207265676973747261722e504a756467656d656e74556e72657175657374656408244163636f756e74496438526567697374726172496e646578048c2041206a756467656d656e74207265717565737420776173207265747261637465642e384a756467656d656e74476976656e08244163636f756e74496438526567697374726172496e64657804982041206a756467656d656e742077617320676976656e2062792061207265676973747261722e3852656769737472617241646465640438526567697374726172496e646578045c204120726567697374726172207761732061646465642e002c48546f6f4d616e795375624163636f756e7473046020546f6f206d616e7920737562732d6163636f756e74732e204e6f74466f756e640454204163636f756e742069736e277420666f756e642e204e6f744e616d65640454204163636f756e742069736e2774206e616d65642e28456d707479496e646578043420456d70747920696e6465782e284665654368616e676564044020466565206973206368616e6765642e284e6f4964656e74697479044c204e6f206964656e7469747920666f756e642e3c537469636b794a756467656d656e74044820537469636b79206a756467656d656e742e384a756467656d656e74476976656e0444204a756467656d656e7420676976656e2e40496e76616c69644a756467656d656e74044c20496e76616c6964206a756467656d656e742e30496e76616c6964496e64657804582054686520696e64657820697320696e76616c69642e34496e76616c6964546172676574045c205468652074617267657420697320696e76616c69642e" + + cls.metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v10_hex)) + cls.metadata_decoder.decode() + + def test_type_registry_versioning(self): + # Event containing old definition of DispatchError which changed since runtime version 1032 + + RuntimeConfiguration().set_active_spec_version_id(1032) + + events_payload_1020 = '0x14000000000000001027000001010000010000000000102700000001000002000000000040420f0000010000030000000d05e8f6971c000000000000000000000000000003000000000101060020a10700000100' + # events_payload_1022 = '0x14000000000000001027000001010000010000000000102700000001000002000000000040420f0000010000030000000d054cb927160000000000000000000000000000030000000001011000a0860100000100' + + events_decoder = EventsDecoder( + data=ScaleBytes(events_payload_1020), + metadata=self.metadata_decoder + ) + + # Should fail with current runtime version + self.assertRaises(ValueError, events_decoder.decode) + + # Change runtime version id + RuntimeConfiguration().set_active_spec_version_id(1020) + + events_decoder = EventsDecoder( + data=ScaleBytes(events_payload_1020), + metadata=self.metadata_decoder + ) + + # Now should succeed + events_decoder.decode() + + self.assertEqual(len(events_decoder.value), 5) + self.assertEqual(events_decoder.value[4]['event_id'], "ExtrinsicFailed") + + def test_type_registry_versioning_struct(self): + RuntimeConfiguration().clear_type_registry() + RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) + RuntimeConfiguration().update_type_registry(load_type_registry_preset("kusama")) + + RuntimeConfiguration().set_active_spec_version_id(1019) + type_cls = RuntimeConfiguration().get_decoder_class("StakingLedger") + + self.assertEqual(type_cls.type_mapping, [ + [ + "stash", + "AccountId" + ], + [ + "total", + "Compact" + ], + [ + "active", + "Compact" + ], + [ + "unlocking", + "Vec" + ] + ]) + + RuntimeConfiguration().set_active_spec_version_id(1055) + type_cls = RuntimeConfiguration().get_decoder_class("StakingLedger") + + self.assertEqual(type_cls.type_mapping, [ + [ + "stash", + "AccountId" + ], + [ + "total", + "Compact" + ], + [ + "active", + "Compact" + ], + [ + "unlocking", + "Vec" + ], + [ + "lastReward", + "Option" + ] + ]) + + RuntimeConfiguration().set_active_spec_version_id(2019) + type_cls = RuntimeConfiguration().get_decoder_class("StakingLedger") + + self.assertEqual(type_cls.type_mapping, [ + [ + "stash", + "AccountId" + ], + [ + "total", + "Compact" + ], + [ + "active", + "Compact" + ], + [ + "unlocking", + "Vec" + ], + [ + "claimedRewards", + "Vec" + ] + ]) + + def test_type_registry_versioning_type_changed(self): + # Extrinsic containing identity.set_identity without 'twitter' field introduced since runtime version 1038 + extrinsic_payload_1030 = '0xdd0284ff8d2879e723893e28c9a7aad53b7c2f464e87019b36d84d990be4509a2e76c64900b84842431eee87e277592d652bc6d911dc11b2b49098c9a307b0e9e774a3149a0a9c205a77d6d74e09cdafdea7ddf815ae210bd54776c68d9557a2d4370d5c0c25000800190100085733462d3031361357656220332e3020466f756e646174696f6e1868747470733a2f2f776562332e666f756e646174696f6e00176465766f707340776562332e666f756e646174696f6e0000' + extrinsic_payload_1040 = '0x150384ff8ef5289702f6b8c7d22b3562ffda7d5593a5f6414226925e72097efbf9b25720013e8921e59463f8fef5a45b879b0f6f24b689ccfcef9ab793e21fcd0b638aa8744d6b45c11a410feeee122b6f9f8e3f6b51c4583b0ddfe15047162070fcdf730f650340001901000d5265676973747261722023310d5265676973747261722023311868747470733a2f2f7777772e63686576646f722e636f6d144063686576646f723a6d61747269782e6f72671263686576646f7240676d61696c2e636f6d000000' + + # Change runtime version id + RuntimeConfiguration().set_active_spec_version_id(1030) + + extrinsics_decoder = ExtrinsicsDecoder( + data=ScaleBytes(extrinsic_payload_1030), + metadata=self.metadata_decoder + ) + + extrinsic_data = extrinsics_decoder.decode() + + self.assertEqual(extrinsic_data['call_function'], 'set_identity') + self.assertEqual(extrinsic_data['call_module'], 'identity') + self.assertNotIn('twitter', extrinsic_data['params'][0]['value']) + + # Change runtime version id + RuntimeConfiguration().set_active_spec_version_id(1040) + + extrinsics_decoder = ExtrinsicsDecoder( + data=ScaleBytes(extrinsic_payload_1040), + metadata=self.metadata_decoder + ) + + extrinsic_data = extrinsics_decoder.decode() + + self.assertEqual(extrinsic_data['call_function'], 'set_identity') + self.assertEqual(extrinsic_data['call_module'], 'identity') + self.assertIn('twitter', extrinsic_data['params'][0]['value']) + + def test_valid_type_registry_presets(self): + preset_path = os.path.join(os.path.dirname(__file__), '..', 'scalecodec', 'type_registry') + + for filename in os.listdir(preset_path): + + filename_obj = Path(filename) + if filename_obj.suffix == '.json': + + type_registry = load_type_registry_preset(Path(filename).stem) + + # Check requirements of JSON file + self.assertIn('types', type_registry) + + # Try to apply type registry preset + RuntimeConfiguration().clear_type_registry() + RuntimeConfiguration().update_type_registry(load_type_registry_preset('default')) + RuntimeConfiguration().update_type_registry(type_registry) + + original_type_reg = copy.deepcopy(RuntimeConfiguration().type_registry) + + if 'runtime_id' in type_registry: + self.assertTrue(isinstance(type_registry['runtime_id'], int)) + latest_runtime_id = type_registry['runtime_id'] + + # Switch type registry versioning state + RuntimeConfiguration().set_active_spec_version_id(0) + RuntimeConfiguration().set_active_spec_version_id(latest_runtime_id) + + # Test if switch resulted in identical type registry + for type_string, type_definition in RuntimeConfiguration().type_registry['types'].items(): + if type_definition: + self.assertEqual( + type_definition.__name__, + original_type_reg['types'][type_string].__name__, + 'Type string "{}" mismatch between latest state and when versioning is applied'.format( + type_string + ) + ) + + + diff --git a/py-substrate-interface/.github/workflows/deploy.yml b/py-substrate-interface/.github/workflows/deploy.yml new file mode 100644 index 00000000..141a104e --- /dev/null +++ b/py-substrate-interface/.github/workflows/deploy.yml @@ -0,0 +1,40 @@ +name: Test and Deploy + +on: + release: + types: [created] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v1 + with: + python-version: '3.8' + - name: Install project dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Lint with flake8 + run: | + pip install flake8 + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + pip install pytest + pytest + - name: Install deploy dependencies + run: | + pip install setuptools wheel twine + - name: Build and publish + env: + TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: | + python setup.py sdist bdist_wheel + twine upload dist/* diff --git a/py-substrate-interface/.github/workflows/unittests.yml b/py-substrate-interface/.github/workflows/unittests.yml new file mode 100644 index 00000000..c6bbaa47 --- /dev/null +++ b/py-substrate-interface/.github/workflows/unittests.yml @@ -0,0 +1,33 @@ +name: Run unit tests + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.6, 3.7, 3.8] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Lint with flake8 + run: | + pip install flake8 + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + pip install pytest + pytest diff --git a/py-substrate-interface/.gitignore b/py-substrate-interface/.gitignore new file mode 100644 index 00000000..db48caa6 --- /dev/null +++ b/py-substrate-interface/.gitignore @@ -0,0 +1,107 @@ +.vscode + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +/.idea diff --git a/py-substrate-interface/.travis.yml b/py-substrate-interface/.travis.yml new file mode 100644 index 00000000..a9cdd012 --- /dev/null +++ b/py-substrate-interface/.travis.yml @@ -0,0 +1,3 @@ +language: python +python: 3.8 +script: pytest diff --git a/py-substrate-interface/LICENSE b/py-substrate-interface/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/py-substrate-interface/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/py-substrate-interface/README.md b/py-substrate-interface/README.md new file mode 100644 index 00000000..7b8dc7d5 --- /dev/null +++ b/py-substrate-interface/README.md @@ -0,0 +1,332 @@ +#### This project is forked from https://github.com/polkascan/py-substrate-interface + +# Python Polymath Substrate Interface + +[![Latest Version](https://img.shields.io/pypi/v/polymath-substrate-interface.svg)](https://pypi.org/project/polymath-substrate-interface/) +[![Supported Python versions](https://img.shields.io/pypi/pyversions/polymath-substrate-interface.svg)](https://pypi.org/project/polymath-substrate-interface/) + +Python Polymath Substrate Interface Library + +## Description +This library specializes in interfacing with a Polymesh node, providing additional convenience methods to deal with +SCALE encoding/decoding (the default output and input format of the Substrate JSONRPC), metadata parsing, type registry +management and versioning of types. + +## Documentation + +https://polkascan.github.io/py-substrate-interface/ + +## Installation + +```bash +pip install polymath-substrate-interface +``` + +### Initialization + +The following examples show how to initialize for Polymesh chain: + +#### Substrate Node Template +Compatible with https://github.com/substrate-developer-hub/substrate-node-template + +```python +substrate = SubstrateInterface( + url="http://127.0.0.1:9933", + address_type=42, + type_registry_preset='substrate-node-template' +) + +``` + +If custom types are introduced in the Substrate chain, the following example will add compatibility by creating a custom type +registry JSON file and including this during initialization: + +```json +{ + "runtime_id": 2, + "types": { + "MyCustomInt": "u32", + "MyStruct": { + "type": "struct", + "type_mapping": [ + ["account", "AccountId"], + ["message", "Vec"] + ] + } + }, + "versioning": [ + ] +} +``` + +```python +custom_type_registry = load_type_registry_file("my-custom-types.json") + +substrate = SubstrateInterface( + url="http://127.0.0.1:9933", + address_type=42, + type_registry_preset='substrate-node-template', + type_registry=custom_type_registry +) + +``` + +## Keeping type registry presets up to date + +When on-chain runtime upgrades occur, types used in call- or storage functions can be added or modified. Therefor it is +important to keep the type registry presets up to date. At the moment the type registry for Polymesh is being actively maintained for this library and an check and update procedure can be triggered with: + +```python +substrate.update_type_registry_presets() +``` + +## Examples + +### Get extrinsics for a certain block + +```python +# Set block_hash to None for chaintip +block_hash = "0x588930468212316d8a75ede0bec0bc949451c164e2cea07ccfc425f497b077b7" + +# Retrieve extrinsics in block +result = substrate.get_runtime_block(block_hash=block_hash) + +for extrinsic in result['block']['extrinsics']: + + if 'account_id' in extrinsic: + signed_by_address = ss58_encode(address=extrinsic['account_id'], address_type=2) + else: + signed_by_address = None + + print('\nModule: {}\nCall: {}\nSigned by: {}'.format( + extrinsic['call_module'], + extrinsic['call_function'], + signed_by_address + )) + + # Loop through params + for param in extrinsic['params']: + + if param['type'] == 'Address': + param['value'] = ss58_encode(address=param['value'], address_type=2) + + if param['type'] == 'Compact': + param['value'] = '{} DOT'.format(param['value'] / 10**12) + + print("Param '{}': {}".format(param['name'], param['value'])) +``` + +### Make a storage call +The modules and storage functions are provided in the metadata (see `substrate.get_metadata_storage_functions()`), +parameters will be automatically converted to SCALE-bytes (also including decoding of SS58 addresses). + +```python +balance_info = substrate.get_runtime_state( + module='System', + storage_function='Account', + params=['5E9oDs9PjpsBbxXxRE9uMaZZhnBAV38n2ouLB28oecBDdeQo'] +).get('result') + +if balance_info: + print("\n\nCurrent free balance: {} KSM".format( + balance_info.get('data').get('free', 0) / 10**12 + )) +``` + +Or get a historic balance at a certain block hash: + +```python +balance_info = substrate.get_runtime_state( + module='System', + storage_function='Account', + params=['5E9oDs9PjpsBbxXxRE9uMaZZhnBAV38n2ouLB28oecBDdeQo'], + block_hash=block_hash +).get('result') + +if balance_info: + print("\n\nFree balance @ {}: {} KSM".format( + block_hash, + balance_info.get('data').get('free', 0) / 10**12 + )) +``` + +Or get all the key pairs of a map: + +```python +# Get all the stash and controller bondings. +all_bonded_stash_ctrls = substrate.iterate_map( + module='Staking', + storage_function='Bonded', + block_hash=block_hash +) +``` + +### Create and send signed extrinsics + +The following code snippet illustrates how to create a call, wrap it in an signed extrinsic and send it to the network: + +```python +from substrateinterface import SubstrateInterface, SubstrateRequestException, Keypair + +substrate = SubstrateInterface( + url="ws://127.0.0.1:9944", + address_type=42, + type_registry_preset='kusama' +) + +keypair = Keypair.create_from_mnemonic('episode together nose spoon dose oil faculty zoo ankle evoke admit walnut') + +call = substrate.compose_call( + call_module='Balances', + call_function='transfer', + call_params={ + 'dest': '5E9oDs9PjpsBbxXxRE9uMaZZhnBAV38n2ouLB28oecBDdeQo', + 'value': 1 * 10**12 + } +) + +extrinsic = substrate.create_signed_extrinsic(call=call, keypair=keypair) + +try: + result = substrate.submit_extrinsic(extrinsic, wait_for_inclusion=True) + print("Extrinsic '{}' sent and included in block '{}'".format(result['extrinsic_hash'], result['block_hash'])) + +except SubstrateRequestException as e: + print("Failed to send: {}".format(e)) +``` + +### Create mortal extrinsics + +By default `immortal` extrinsics are created, which means they have an indefinite lifetime for being included in a +block. However it is recommended to use specify an expiry window, so you know after a certain amount of time if the +extrinsic is not included in a block, it will be invalidated. + +```python +extrinsic = substrate.create_signed_extrinsic(call=call, keypair=keypair, era={'period': 64}) +``` + +The `period` specifies the number of blocks the extrinsic is valid counted from current head. + + +### Keypair creation and signing + +```python +mnemonic = Keypair.generate_mnemonic() +keypair = Keypair.create_from_mnemonic(mnemonic) +signature = keypair.sign("Test123") +if keypair.verify("Test123", signature): + print('Verified') +``` + +By default a keypair is using SR25519 cryptography, alternatively ED25519 can be explictly specified: + +```python +keypair = Keypair.create_from_mnemonic(mnemonic, crypto_type=KeypairType.ED25519) +``` + +### Creating keypairs with soft and hard key derivation paths + +```python +mnemonic = Keypair.generate_mnemonic() +keypair = Keypair.create_from_uri(mnemonic + '//hard/soft') +``` + +By omitting the mnemonic the default development mnemonic is used: + +```python +keypair = Keypair.create_from_uri('//Alice') +``` + +### Getting estimate of network fees for extrinsic in advance + +```python +keypair = Keypair(ss58_address="EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk") + +call = self.kusama_substrate.compose_call( + call_module='Balances', + call_function='transfer', + call_params={ + 'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'value': 2 * 10 ** 3 + } +) +payment_info = self.kusama_substrate.get_payment_info(call=call, keypair=keypair) +``` + +### Offline signing of extrinsics + +This example generates a signature payload which can be signed on another (offline) machine and later on sent to the +network with the generated signature. + +Generate signature payload on online machine: +```python +substrate = SubstrateInterface( + url="http://127.0.0.1:9933", + address_type=42, + type_registry_preset='substrate-node-template', +) + +call = substrate.compose_call( + call_module='Balances', + call_function='transfer', + call_params={ + 'dest': '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', + 'value': 2 * 10**8 + } +) + +era = {'period': 64, 'current': 22719} +nonce = 0 + +signature_payload = substrate.generate_signature_payload(call=call, era=era, nonce=nonce) +``` + +Then on another (offline) machine generate the signature with given `signature_payload`: + +```python +keypair = Keypair.create_from_mnemonic("nature exchange gasp toy result bacon coin broccoli rule oyster believe lyrics") +signature = keypair.sign(signature_payload) +``` + +Finally on the online machine send the extrinsic with generated signature: + +```python +keypair = Keypair(ss58_address="5EChUec3ZQhUvY1g52ZbfBVkqjUY9Kcr6mcEvQMbmd38shQL") + +extrinsic = substrate.create_signed_extrinsic( + call=call, + keypair=keypair, + era=era, + nonce=nonce, + signature=signature +) + +result = substrate.submit_extrinsic( + extrinsic=extrinsic +) + +print(result['extrinsic_hash']) +``` + +### Metadata and type versioning + +Py-substrate-interface makes it also possible to easily interprete changed types and historic runtimes. As an example +we create an (not very useful) historic call of a module that has been removed later on: retrieval of historic metadata and +apply the correct version of types in the type registry is all done automatically. Because parsing of metadata and +type registry is quite heavy, the result will be cached per runtime id. In the future there could be support for +caching backends like Redis to make this cache more persistent. + +Create an unsigned extrinsic of a module that was removed by providing block hash: + +```python +payload = substrate.compose_call( + call_module='Nicks', + call_function='clear_name', + call_params={}, + block_hash="0x918107632d7994d50f3661db3af353d2aa378f696e47a393bab573f63f7d6c3a" +) +``` + +## License + +https://github.com/PolymathNetwork/py-substrate-interface/blob/master/LICENSE diff --git a/py-substrate-interface/_config.yml b/py-substrate-interface/_config.yml new file mode 100644 index 00000000..2f7efbea --- /dev/null +++ b/py-substrate-interface/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-minimal \ No newline at end of file diff --git a/py-substrate-interface/docs/constants.html b/py-substrate-interface/docs/constants.html new file mode 100644 index 00000000..799ae46a --- /dev/null +++ b/py-substrate-interface/docs/constants.html @@ -0,0 +1,76 @@ + + + + + + +substrateinterface.constants API documentation + + + + + + + + + + + +
+
+
+

Module substrateinterface.constants

+
+
+
+ +Expand source code + +
# Python Substrate Interface Library
+#
+# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+STORAGE_HASH_SYSTEM_EVENTS = "0xcc956bdb7605e3547539f321ac2bc95c"
+STORAGE_HASH_SYSTEM_EVENTS_V9 = "0x26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7"
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/py-substrate-interface/docs/exceptions.html b/py-substrate-interface/docs/exceptions.html new file mode 100644 index 00000000..da459248 --- /dev/null +++ b/py-substrate-interface/docs/exceptions.html @@ -0,0 +1,159 @@ + + + + + + +substrateinterface.exceptions API documentation + + + + + + + + + + + +
+
+
+

Module substrateinterface.exceptions

+
+
+
+ +Expand source code + +
# Python Substrate Interface Library
+#
+# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+class SubstrateRequestException(Exception):
+    pass
+
+
+class StorageFunctionNotFound(ValueError):
+    pass
+
+
+class ConfigurationError(Exception):
+    pass
+
+
+
+
+
+
+
+
+
+

Classes

+
+
+class ConfigurationError +(...) +
+
+

Common base class for all non-exit exceptions.

+
+ +Expand source code + +
class ConfigurationError(Exception):
+    pass
+
+

Ancestors

+
    +
  • builtins.Exception
  • +
  • builtins.BaseException
  • +
+
+
+class StorageFunctionNotFound +(...) +
+
+

Inappropriate argument value (of correct type).

+
+ +Expand source code + +
class StorageFunctionNotFound(ValueError):
+    pass
+
+

Ancestors

+
    +
  • builtins.ValueError
  • +
  • builtins.Exception
  • +
  • builtins.BaseException
  • +
+
+
+class SubstrateRequestException +(...) +
+
+

Common base class for all non-exit exceptions.

+
+ +Expand source code + +
class SubstrateRequestException(Exception):
+    pass
+
+

Ancestors

+
    +
  • builtins.Exception
  • +
  • builtins.BaseException
  • +
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/py-substrate-interface/docs/index.html b/py-substrate-interface/docs/index.html new file mode 100644 index 00000000..e3dac138 --- /dev/null +++ b/py-substrate-interface/docs/index.html @@ -0,0 +1,6426 @@ + + + + + + +substrateinterface API documentation + + + + + + + + + + + +
+
+
+

Package substrateinterface

+
+
+
+ +Expand source code + +
# Python Substrate Interface Library
+#
+# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import asyncio
+import binascii
+import json
+import logging
+import re
+
+import requests
+import websockets
+
+from scalecodec import ScaleBytes, GenericCall
+from scalecodec.base import ScaleDecoder, RuntimeConfiguration
+from scalecodec.block import ExtrinsicsDecoder, EventsDecoder, LogDigest
+from scalecodec.metadata import MetadataDecoder
+from scalecodec.type_registry import load_type_registry_preset
+
+from .subkey import Subkey
+from .utils.hasher import blake2_256, two_x64_concat, xxh64, xxh128, blake2_128, blake2_128_concat, identity
+from .exceptions import SubstrateRequestException, ConfigurationError, StorageFunctionNotFound
+from .constants import *
+from .utils.ss58 import ss58_decode, ss58_encode
+from bip39 import bip39_to_mini_secret, bip39_generate
+import sr25519
+
+
+logger = logging.getLogger(__name__)
+
+
+class Keypair:
+
+    def __init__(self, ss58_address=None, public_key=None, private_key=None, address_type=42):
+
+        if ss58_address and not public_key:
+            public_key = ss58_decode(ss58_address)
+
+        if not public_key:
+            raise ValueError('No SS58 formatted address or public key provided')
+
+        public_key = '0x{}'.format(public_key.replace('0x', ''))
+
+        if len(public_key) != 66:
+            raise ValueError('Public key should be 32 bytes long')
+
+        if not ss58_address:
+            ss58_address = ss58_encode(public_key, address_type=address_type)
+
+        self.public_key = public_key
+        self.ss58_address = ss58_address
+
+        if private_key:
+            private_key = '0x{}'.format(private_key.replace('0x', ''))
+
+            if len(private_key) != 130:
+                raise ValueError('Secret key should be 64 bytes long')
+
+        self.private_key = private_key
+        self.address_type = address_type
+
+        self.mnemonic = None
+
+    @classmethod
+    def generate_mnemonic(cls, words=12):
+        return bip39_generate(words)
+
+    @classmethod
+    def create_from_mnemonic(cls, mnemonic, address_type=42):
+        seed_array = bip39_to_mini_secret(mnemonic, "")
+
+        keypair = cls.create_from_seed(
+            seed_hex=binascii.hexlify(bytearray(seed_array)).decode("ascii"),
+            address_type=address_type
+        )
+        keypair.mnemonic = mnemonic
+
+        return keypair
+
+    @classmethod
+    def create_from_seed(cls, seed_hex, address_type=42):
+        keypair = sr25519.pair_from_seed(bytes.fromhex(seed_hex.replace('0x', '')))
+        public_key = keypair[0].hex()
+        private_key = keypair[1].hex()
+        ss58_address = ss58_encode(keypair[0], address_type)
+        return cls(ss58_address=ss58_address, public_key=public_key, private_key=private_key, address_type=address_type)
+
+    @classmethod
+    def create_from_private_key(cls, private_key, public_key=None, ss58_address=None, address_type=42):
+        return cls(ss58_address=ss58_address, public_key=public_key, private_key=private_key, address_type=address_type)
+
+    def sign(self, data):
+        """
+        Creates a sr25519 signature with give data
+
+        Parameters
+        ----------
+        data
+
+        Returns
+        -------
+        sr25519 signature
+
+        """
+        if type(data) is ScaleBytes:
+            data = bytes(data.data)
+        elif data[0:2] == '0x':
+            data = bytes.fromhex(data[2:])
+        else:
+            data = data.encode()
+
+        if not self.private_key:
+            raise ConfigurationError('No private key set to create sr25519 signatures')
+
+        signature = sr25519.sign(
+            (bytes.fromhex(self.public_key[2:]), bytes.fromhex(self.private_key[2:])),
+            data
+        )
+        return "0x{}".format(signature.hex())
+
+    def verify(self, data, signature):
+
+        if type(data) is ScaleBytes:
+            data = bytes(data.data)
+        elif data[0:2] == '0x':
+            data = bytes.fromhex(data[2:])
+        else:
+            data = data.encode()
+
+        if type(signature) is str and signature[0:2] == '0x':
+            signature = bytes.fromhex(signature[2:])
+
+        if type(signature) is not bytes:
+            raise TypeError("Signature should be of type bytes or a hex-string")
+
+        return sr25519.verify(signature, data, bytes.fromhex(self.public_key[2:]))
+
+
+class SubstrateInterface:
+
+    def __init__(self, url, address_type=None, type_registry=None, type_registry_preset="default", cache_region=None,
+                 sub_key: Subkey = None):
+        """
+        A specialized class in interfacing with a Substrate node.
+
+        Parameters
+        ----------
+        url: the URL to the substrate node, either in format https://127.0.0.1:9933 or wss://127.0.0.1:9944
+        address_type: The address type which account IDs will be SS58-encoded to Substrate addresses. Defaults to 42, for Kusama the address type is 2
+        type_registry: A dict containing the custom type registry in format: {'types': {'customType': 'u32'},..}
+        type_registry_preset: The name of the predefined type registry shipped with the SCALE-codec, e.g. kusama
+        cache_region: a Dogpile cache region as a central store for the metadata cache
+        """
+        self.cache_region = cache_region
+
+        if type_registry_preset:
+            # Load type registries in runtime configuration
+            RuntimeConfiguration().update_type_registry(load_type_registry_preset("default"))
+
+            if type_registry != "default":
+                RuntimeConfiguration().update_type_registry(load_type_registry_preset(type_registry_preset))
+
+        if type_registry:
+            # Load type registries in runtime configuration
+            RuntimeConfiguration().update_type_registry(type_registry)
+
+        self.request_id = 1
+        self.url = url
+
+        self._ws_result = None
+
+        self.address_type = address_type
+
+        self.mock_extrinsics = None
+        self._version = None
+        self.default_headers = {
+            'content-type': "application/json",
+            'cache-control': "no-cache"
+        }
+
+        self.metadata_decoder = None
+
+        self.runtime_version = None
+        self.transaction_version = None
+
+        self.block_hash = None
+        self.block_id = None
+
+        self.metadata_cache = {}
+        self.type_registry_cache = {}
+
+        self.sub_key = sub_key
+
+        self.debug = False
+
+    def debug_message(self, message):
+        logger.debug(message)
+
+    def rpc_request(self, method, params, result_handler=None):
+        """
+        Method that handles the actual RPC request to the Substrate node. The other implemented functions eventually
+        use this method to perform the request.
+
+        Parameters
+        ----------
+        result_handler: Callback of function that processes the result received from the node
+        method: method of the JSONRPC request
+        params: a list containing the parameters of the JSONRPC request
+
+        Returns
+        -------
+        a dict with the parsed result of the request.
+        """
+        payload = {
+            "jsonrpc": "2.0",
+            "method": method,
+            "params": params,
+            "id": self.request_id
+        }
+
+        self.debug_message('RPC request "{}"'.format(method))
+
+        if self.url[0:6] == 'wss://' or self.url[0:5] == 'ws://':
+            ws_result = {}
+
+            async def ws_request(ws_payload):
+                """
+                Internal method to handle the request if url is a websocket address (wss:// or ws://)
+
+                Parameters
+                ----------
+                ws_payload: a dict that contains the JSONRPC payload of the request
+
+                Returns
+                -------
+                This method doesn't return but updates the `ws_result` object variable with the result
+                """
+                async with websockets.connect(
+                        self.url
+                ) as websocket:
+                    await websocket.send(json.dumps(ws_payload))
+
+                    if callable(result_handler):
+                        event_number = 0
+                        while not ws_result:
+                            result = json.loads(await websocket.recv())
+                            self.debug_message("Websocket result [{}] Received from node: {}".format(event_number, result))
+
+                            # Check if response has error
+                            if 'error' in result:
+                                raise SubstrateRequestException(result['error'])
+
+                            callback_result = result_handler(result)
+                            if callback_result:
+                                ws_result.update(callback_result)
+
+                            event_number += 1
+                    else:
+                        ws_result.update(json.loads(await websocket.recv()))
+
+            asyncio.run(ws_request(payload))
+            json_body = ws_result
+
+        else:
+
+            if result_handler:
+                raise ConfigurationError("Result handlers only available for websockets (ws://) connections")
+
+            response = requests.request("POST", self.url, data=json.dumps(payload), headers=self.default_headers)
+
+            if response.status_code != 200:
+                raise SubstrateRequestException("RPC request failed with HTTP status code {}".format(response.status_code))
+
+            json_body = response.json()
+
+        return json_body
+
+    def get_system_name(self):
+        """
+        A pass-though to existing JSONRPC method `system_name`
+
+        Returns
+        -------
+
+        """
+        response = self.rpc_request("system_name", [])
+        return response.get('result')
+
+    def get_version(self):
+        """
+        A pass-though to existing JSONRPC method `system_version`
+
+        Returns
+        -------
+
+        """
+        if not self._version:
+            response = self.rpc_request("system_version", [])
+            self._version = response.get('result')
+        return self._version
+
+    def get_chain_head(self):
+        """
+        A pass-though to existing JSONRPC method `chain_getHead`
+
+        Returns
+        -------
+
+        """
+        response = self.rpc_request("chain_getHead", [])
+        return response.get('result')
+
+    def get_chain_finalised_head(self):
+        """
+        A pass-though to existing JSONRPC method `chain_getFinalisedHead`
+
+        Returns
+        -------
+
+        """
+        response = self.rpc_request("chain_getFinalisedHead", [])
+        return response.get('result')
+
+    def get_chain_block(self, block_hash=None, block_id=None, metadata_decoder=None):
+        """
+        A pass-though to existing JSONRPC method `chain_getBlock`. For a decoded version see `get_runtime_block()`
+
+        Parameters
+        ----------
+        block_hash
+        block_id
+        metadata_decoder
+
+        Returns
+        -------
+
+        """
+
+        if block_id:
+            block_hash = self.get_block_hash(block_id)
+
+        response = self.rpc_request("chain_getBlock", [block_hash]).get('result')
+
+        if self.mock_extrinsics:
+            # Extend extrinsics with mock_extrinsics for e.g. performance tests
+            response['block']['extrinsics'].extend(self.mock_extrinsics)
+
+        # Decode extrinsics
+        if metadata_decoder:
+
+            response['block']['header']['number'] = int(response['block']['header']['number'], 16)
+
+            for idx, extrinsic_data in enumerate(response['block']['extrinsics']):
+                extrinsic_decoder = ExtrinsicsDecoder(
+                    data=ScaleBytes(extrinsic_data),
+                    metadata=metadata_decoder
+                )
+                extrinsic_decoder.decode()
+                response['block']['extrinsics'][idx] = extrinsic_decoder.value
+
+            for idx, log_data in enumerate(response['block']['header']["digest"]["logs"]):
+                log_digest = LogDigest(ScaleBytes(log_data))
+                log_digest.decode()
+                response['block']['header']["digest"]["logs"][idx] = log_digest.value
+
+        return response
+
+    def get_block_hash(self, block_id):
+        """
+        A pass-though to existing JSONRPC method `chain_getBlockHash`
+
+        Parameters
+        ----------
+        block_id
+
+        Returns
+        -------
+
+        """
+        return self.rpc_request("chain_getBlockHash", [block_id]).get('result')
+
+    def get_block_header(self, block_hash):
+        """
+        A pass-though to existing JSONRPC method `chain_getHeader`
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        response = self.rpc_request("chain_getHeader", [block_hash])
+        return response.get('result')
+
+    def get_block_number(self, block_hash):
+        """
+        A convenience method to get the block number for given block_hash
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        response = self.rpc_request("chain_getHeader", [block_hash])
+        return int(response['result']['number'], 16)
+
+    def get_block_metadata(self, block_hash=None, decode=True):
+        """
+        A pass-though to existing JSONRPC method `state_getMetadata`. For a decoded version see `get_runtime_metadata()`
+
+        Parameters
+        ----------
+        block_hash
+        decode: DEPRECATED use `get_runtime_metadata()` for decoded version
+
+        Returns
+        -------
+
+        """
+        params = None
+        if block_hash:
+            params = [block_hash]
+        response = self.rpc_request("state_getMetadata", params)
+
+        if decode:
+            metadata_decoder = MetadataDecoder(ScaleBytes(response.get('result')))
+            metadata_decoder.decode()
+
+            return metadata_decoder
+
+        return response
+
+    def get_storage(self, block_hash, module, function, params=None, return_scale_type=None, hasher=None,
+                    spec_version_id='default', metadata=None, metadata_version=None):
+        """
+        Retrieves the storage entry for given module, function and optional parameters at given block.
+
+        DEPRECATED: use `get_runtime_state()`
+
+        Parameters
+        ----------
+        block_hash
+        module
+        function
+        params
+        return_scale_type: Scale type string to interprete result
+        hasher: Hashing method used to determine storage key, defaults to 'Twox64Concat' if not provided
+        spec_version_id: DEPRECATED
+        metadata
+        metadata_version: Version index of Metadata, e.g. 9 for MetadataV9
+
+        Returns
+        -------
+
+        """
+        storage_hash = self.generate_storage_hash(
+            storage_module=module,
+            storage_function=function,
+            params=params,
+            hasher=hasher,
+            metadata_version=metadata_version
+        )
+        response = self.rpc_request("state_getStorageAt", [storage_hash, block_hash])
+
+        if 'result' in response:
+
+            if return_scale_type and response.get('result'):
+                obj = ScaleDecoder.get_decoder_class(
+                    return_scale_type,
+                    ScaleBytes(response.get('result')),
+                    metadata=metadata
+                )
+                return obj.decode()
+            else:
+                return response.get('result')
+        else:
+            raise SubstrateRequestException("Error occurred during retrieval of events")
+
+    def get_storage_by_key(self, block_hash, storage_key):
+        """
+        A pass-though to existing JSONRPC method `state_getStorageAt`
+
+        Parameters
+        ----------
+        block_hash
+        storage_key
+
+        Returns
+        -------
+
+        """
+
+        response = self.rpc_request("state_getStorageAt", [storage_key, block_hash])
+        if 'result' in response:
+            return response.get('result')
+        else:
+            raise SubstrateRequestException("Error occurred during retrieval of events")
+
+    def get_block_events(self, block_hash, metadata_decoder=None):
+        """
+        A convenience method to fetch the undecoded events from storage
+
+        Parameters
+        ----------
+        block_hash
+        metadata_decoder
+
+        Returns
+        -------
+
+        """
+
+        if metadata_decoder and metadata_decoder.version.index >= 9:
+            storage_hash = STORAGE_HASH_SYSTEM_EVENTS_V9
+        else:
+            storage_hash = STORAGE_HASH_SYSTEM_EVENTS
+
+        response = self.rpc_request("state_getStorageAt", [storage_hash, block_hash])
+
+        if response.get('result'):
+
+            if metadata_decoder:
+                # Process events
+                events_decoder = EventsDecoder(
+                    data=ScaleBytes(response.get('result')),
+                    metadata=metadata_decoder
+                )
+                events_decoder.decode()
+
+                return events_decoder
+
+            else:
+                return response
+        else:
+            raise SubstrateRequestException("Error occurred during retrieval of events")
+
+    def get_block_runtime_version(self, block_hash):
+        """
+        Retrieve the runtime version id of given block_hash
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        response = self.rpc_request("chain_getRuntimeVersion", [block_hash])
+        return response.get('result')
+
+    def generate_storage_hash(self, storage_module, storage_function, params=None, hasher=None, key2_hasher=None, metadata_version=None):
+        """
+        Generate a storage key for given module/function
+
+        Parameters
+        ----------
+        storage_module
+        storage_function
+        params: Parameters of the storage function, provided in scale encoded hex-bytes
+        hasher: Hashing method used to determine storage key, defaults to 'Twox64Concat' if not provided
+        metadata_version: Version index of Metadata, e.g. 9 for MetadataV9
+
+        Returns
+        -------
+
+        """
+
+        if not metadata_version or metadata_version >= 9:
+            storage_hash = xxh128(storage_module.encode()) + xxh128(storage_function.encode())
+
+            if params:
+
+                if type(params) is not list:
+                    params = [params]
+
+                for idx, param in enumerate(params):
+                    if idx == 0:
+                        param_hasher = hasher
+                    elif idx == 1:
+                        param_hasher = key2_hasher
+                    else:
+                        raise ValueError('Unexpected third parameter for storage call')
+
+                    params_key = bytes()
+
+                    if type(param) is str:
+                        params_key += binascii.unhexlify(param)
+                    elif type(param) is ScaleBytes:
+                        params_key += param.data
+                    elif isinstance(param, ScaleDecoder):
+                        params_key += param.data.data
+
+                    if not param_hasher:
+                        param_hasher = 'Twox128'
+
+                    if param_hasher == 'Blake2_256':
+                        storage_hash += blake2_256(params_key)
+
+                    elif param_hasher == 'Blake2_128':
+                        storage_hash += blake2_128(params_key)
+
+                    elif param_hasher == 'Blake2_128Concat':
+                        storage_hash += blake2_128_concat(params_key)
+
+                    elif param_hasher == 'Twox128':
+                        storage_hash += xxh128(params_key)
+
+                    elif param_hasher == 'Twox64Concat':
+                        storage_hash += two_x64_concat(params_key)
+
+                    elif param_hasher == 'Identity':
+                        storage_hash += identity(params_key)
+
+                    else:
+                        raise ValueError('Unknown storage hasher "{}"'.format(param_hasher))
+
+            return '0x{}'.format(storage_hash)
+
+        else:
+            storage_hash = storage_module.encode() + b" " + storage_function.encode()
+
+            if params:
+                storage_hash += binascii.unhexlify(params)
+
+            # Determine hasher function
+            if not hasher:
+                hasher = 'Twox128'
+
+            if hasher == 'Blake2_256':
+                return "0x{}".format(blake2_256(storage_hash))
+
+            elif hasher == 'Twox128':
+                return "0x{}".format(xxh128(storage_hash))
+
+            elif hasher == 'Twox64Concat':
+                return "0x{}".format(two_x64_concat(storage_hash))
+
+    def convert_storage_parameter(self, scale_type, value):
+        if scale_type == 'AccountId':
+            if value[0:2] != '0x':
+                return '0x{}'.format(ss58_decode(value, self.address_type))
+
+        return value
+
+    # Runtime functions used by Substrate API
+
+    def init_runtime(self, block_hash=None, block_id=None):
+        """
+        This method is used by all other methods that deals with metadata and types defined in the type registry.
+        It optionally retrieves the block_hash when block_id is given and sets the applicable metadata for that
+        block_hash. Also it applies all the versioned types at the time of the block_hash.
+
+        Because parsing of metadata and type registry is quite heavy, the result will be cached per runtime id.
+        In the future there could be support for caching backends like Redis to make this cache more persistent.
+
+        Parameters
+        ----------
+        block_hash
+        block_id
+
+        Returns
+        -------
+
+        """
+
+        if block_id and block_hash:
+            raise ValueError('Cannot provide block_hash and block_id at the same time')
+
+        # Check if runtime state already set to current block
+        if (block_hash and block_hash == self.block_hash) or (block_id and block_id == self.block_id):
+            return
+
+        if block_id is not None:
+            block_hash = self.get_block_hash(block_id)
+
+        self.block_hash = block_hash
+        self.block_id = block_id
+
+        runtime_info = self.get_block_runtime_version(block_hash=self.block_hash)
+
+        # Check if runtime state already set to current block
+        if runtime_info.get("specVersion") == self.runtime_version:
+            return
+
+        self.runtime_version = runtime_info.get("specVersion")
+        self.transaction_version = runtime_info.get("transactionVersion")
+
+        # Set active runtime version
+        RuntimeConfiguration().set_active_spec_version_id(self.runtime_version)
+
+        if self.runtime_version not in self.metadata_cache and self.cache_region:
+            # Try to retrieve metadata from Dogpile cache
+            cached_metadata = self.cache_region.get('METADATA_{}'.format(self.runtime_version))
+            if cached_metadata:
+                self.debug_message('Retrieved metadata for {} from Redis'.format(self.runtime_version))
+                self.metadata_cache[self.runtime_version] = cached_metadata
+
+        if self.runtime_version in self.metadata_cache:
+            # Get metadata from cache
+            self.debug_message('Retrieved metadata for {} from memory'.format(self.runtime_version))
+            self.metadata_decoder = self.metadata_cache[self.runtime_version]
+        else:
+            self.metadata_decoder = self.get_block_metadata(block_hash=self.block_hash, decode=True)
+            self.debug_message('Retrieved metadata for {} from Substrate node'.format(self.runtime_version))
+
+            # Update metadata cache
+            self.metadata_cache[self.runtime_version] = self.metadata_decoder
+
+            if self.cache_region:
+                self.debug_message('Stored metadata for {} in Redis'.format(self.runtime_version))
+                self.cache_region.set('METADATA_{}'.format(self.runtime_version), self.metadata_decoder)
+
+    def get_runtime_state(self, module, storage_function, params=None, block_hash=None):
+        """
+        Retrieves the storage entry for given module, function and optional parameters at given block hash
+
+        Parameters
+        ----------
+        module: The module name in the metadata, e.g. Balances or Account
+        storage_function: The storage function name, e.g. FreeBalance or AccountNonce
+        params: list of params, in the decoded format of the applicable ScaleTypes
+        block_hash: Optional block hash, when left to None the chain tip will be used
+
+        Returns
+        -------
+
+        """
+
+        self.init_runtime(block_hash=block_hash)
+
+        # Search storage call in metadata
+        for metadata_module in self.metadata_decoder.metadata.modules:
+            if metadata_module.name == module:
+                if metadata_module.storage:
+                    for storage_item in metadata_module.storage.items:
+                        if storage_item.name == storage_function:
+
+                            key2_hasher = None
+
+                            if 'PlainType' in storage_item.type:
+                                hasher = 'Twox64Concat'
+                                return_scale_type = storage_item.type.get('PlainType')
+                                if params:
+                                    raise ValueError('Storage call of type "PlainType" doesn\'t accept params')
+
+                            elif 'MapType' in storage_item.type:
+
+                                map_type = storage_item.type.get('MapType')
+                                hasher = map_type.get('hasher')
+                                return_scale_type = map_type.get('value')
+
+                                if not params or len(params) != 1:
+                                    raise ValueError('Storage call of type "MapType" requires 1 parameter')
+
+                                # Encode parameter
+                                params[0] = self.convert_storage_parameter(map_type['key'], params[0])
+                                param_obj = ScaleDecoder.get_decoder_class(map_type['key'])
+                                params[0] = param_obj.encode(params[0])
+
+                            elif 'DoubleMapType' in storage_item.type:
+
+                                map_type = storage_item.type.get('DoubleMapType')
+                                hasher = map_type.get('hasher')
+                                key2_hasher = map_type.get('key2Hasher')
+                                return_scale_type = map_type.get('value')
+
+                                if not params or len(params) != 2:
+                                    raise ValueError('Storage call of type "DoubleMapType" requires 2 parameters')
+
+                                # Encode parameter 1
+                                params[0] = self.convert_storage_parameter(map_type['key1'], params[0])
+                                param_obj = ScaleDecoder.get_decoder_class(map_type['key1'])
+                                params[0] = param_obj.encode(params[0])
+
+                                # Encode parameter 2
+                                params[1] = self.convert_storage_parameter(map_type['key2'], params[1])
+                                param_obj = ScaleDecoder.get_decoder_class(map_type['key2'])
+                                params[1] = param_obj.encode(params[1])
+
+                            else:
+                                raise NotImplementedError("Storage type not implemented")
+
+                            storage_hash = self.generate_storage_hash(
+                                storage_module=metadata_module.prefix,
+                                storage_function=storage_function,
+                                params=params,
+                                hasher=hasher,
+                                key2_hasher=key2_hasher,
+                                metadata_version=self.metadata_decoder.version.index
+                            )
+
+                            response = self.rpc_request("state_getStorageAt", [storage_hash, block_hash])
+
+                            if 'result' in response:
+
+                                if return_scale_type and response.get('result'):
+                                    obj = ScaleDecoder.get_decoder_class(
+                                        return_scale_type,
+                                        ScaleBytes(response.get('result')),
+                                        metadata=self.metadata_decoder
+                                    )
+                                    response['result'] = obj.decode()
+
+                            return response
+
+        raise StorageFunctionNotFound('Storage function "{}.{}" not found'.format(module, storage_function))
+
+    def get_runtime_events(self, block_hash=None):
+        """
+        Convenience method to get events for a certain block (storage call for module 'System' and function 'Events')
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+        Collection of events
+        """
+        return self.get_runtime_state(
+            module="System",
+            storage_function="Events",
+            block_hash=block_hash
+        )
+
+    def get_runtime_metadata(self, block_hash=None):
+        """
+        Retrieves and decodes the metadata for given block or chaintip if block_hash is omitted.
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        params = None
+        if block_hash:
+            params = [block_hash]
+        response = self.rpc_request("state_getMetadata", params)
+
+        if 'result' in response:
+            metadata_decoder = MetadataDecoder(ScaleBytes(response.get('result')))
+            response['result'] = metadata_decoder.decode()
+
+        return response
+
+    def compose_call(self, call_module, call_function, call_params=(), block_hash=None):
+        """
+        Composes a call payload which can be used as an unsigned extrinsic or a proposal.
+
+        Parameters
+        ----------
+        call_module: Name of the runtime module e.g. Balances
+        call_function: Name of the call function e.g. transfer
+        call_params: This is a dict containing the params of the call. e.g. `{'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', 'value': 1000000000000}`
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        call = ScaleDecoder.get_decoder_class('Call', metadata=self.metadata_decoder)
+
+        call.encode({
+            'call_module': call_module,
+            'call_function': call_function,
+            'call_args': call_params
+        })
+
+        return call
+
+    def get_account_nonce(self, account_address):
+        response = self.get_runtime_state('System', 'Account', [account_address])
+        if response.get('result'):
+            return response['result'].get('nonce', 0)
+
+    def generate_signature_payload(self, call, era=None, nonce=0, tip=0, include_call_length=False):
+
+        # Retrieve genesis hash
+        genesis_hash = self.get_block_hash(0)
+
+        if era:
+            if era != '00':
+                # TODO implement MortalEra transactions
+                raise NotImplementedError("Mortal transactions not yet implemented")
+        else:
+            era = '00'
+
+        # Create signature payload
+        signature_payload = ScaleDecoder.get_decoder_class('ExtrinsicPayloadValue')
+
+        if include_call_length:
+
+            length_obj = RuntimeConfiguration().get_decoder_class('Bytes')
+            call_data = str(length_obj().encode(str(call.data)))
+
+        else:
+            call_data = str(call.data)
+
+        payload_dict = {
+            'call': call_data,
+            'era': era,
+            'nonce': nonce,
+            'tip': tip,
+            'specVersion': self.runtime_version,
+            'genesisHash': genesis_hash,
+            'blockHash': genesis_hash
+        }
+
+        if self.transaction_version is not None:
+            payload_dict['transactionVersion'] = self.transaction_version
+
+        signature_payload.encode(payload_dict)
+
+        return signature_payload.data
+
+    def create_signed_extrinsic(self, call, keypair: Keypair, era=None, nonce=None, tip=0, signature=None):
+        """
+        Creates a extrinsic signed by given account details
+
+        Parameters
+        ----------
+        signature
+        era
+        keypair
+        call
+        nonce
+        tip
+
+        Returns
+        -------
+        ExtrinsicsDecoder The signed Extrinsic
+        """
+
+        # Check requirements
+        if not isinstance(call, GenericCall):
+            raise TypeError("'call' must be of type Call")
+
+        # Retrieve nonce
+        if not nonce:
+            nonce = self.get_account_nonce(keypair.public_key) or 0
+
+        if era:
+            if era != '00':
+                # TODO implement MortalEra transactions
+                raise NotImplementedError("Mortal transactions not yet implemented")
+        else:
+            era = '00'
+
+        if signature:
+
+            signature = signature.replace('0x', '')
+
+            # Check if signature is a MultiSignature and contains signature version
+            if len(signature) == 130:
+                signature_version = int(signature[0:2], 16)
+                signature = '0x{}'.format(signature[2:])
+            else:
+                signature_version = 1
+
+        else:
+            # Create signature payload
+            signature_payload = self.generate_signature_payload(call=call, era=era, nonce=nonce, tip=tip)
+
+            # Set Signature version to sr25519
+            signature_version = 1
+
+            # Sign payload
+            signature = keypair.sign(signature_payload)
+
+        # Create extrinsic
+        extrinsic = ScaleDecoder.get_decoder_class('Extrinsic', metadata=self.metadata_decoder)
+
+        extrinsic.encode({
+            'account_id': keypair.public_key,
+            'signature_version': signature_version,
+            'signature': signature,
+            'call_function': call.value['call_function'],
+            'call_module': call.value['call_module'],
+            'call_args': call.value['call_args'],
+            'nonce': nonce,
+            'era': era,
+            'tip': tip
+        })
+
+        # Set extrinsic hash
+        extrinsic.extrinsic_hash = extrinsic.generate_hash()
+
+        return extrinsic
+
+    def create_unsigned_extrinsic(self, call):
+        # Create extrinsic
+        extrinsic = ScaleDecoder.get_decoder_class('Extrinsic', metadata=self.metadata_decoder)
+
+        extrinsic.encode({
+            'call_function': call.value['call_function'],
+            'call_module': call.value['call_module'],
+            'call_args': call.value['call_args']
+        })
+
+        return extrinsic
+
+    def submit_extrinsic(self, extrinsic, wait_for_inclusion=False, wait_for_finalization=False):
+        """
+
+        Parameters
+        ----------
+        extrinsic: ExtrinsicsDecoder The extinsic to be send to the network
+        wait_for_inclusion: wait until extrinsic is included in a block (only works on websocket connections)
+        wait_for_finalization: wait until extrinsic is finalized (only works on websocket connections)
+
+        Returns
+        -------
+        The hash of the extrinsic submitted to the network
+
+        """
+
+        # Check requirements
+        if extrinsic.__class__.__name__ != 'ExtrinsicsDecoder':
+            raise TypeError("'extrinsic' must be of type ExtrinsicsDecoder")
+
+        def result_handler(result):
+            # Check if extrinsic is included and finalized
+            if 'params' in result and type(result['params']['result']) is dict:
+                if 'finalized' in result['params']['result'] and wait_for_finalization:
+                    return {
+                        'block_hash': result['params']['result']['finalized'],
+                        'extrinsic_hash': '0x{}'.format(extrinsic.extrinsic_hash),
+                        'finalized': True
+                    }
+                elif 'inBlock' in result['params']['result'] and wait_for_inclusion and not wait_for_finalization:
+                    return {
+                        'block_hash': result['params']['result']['inBlock'],
+                        'extrinsic_hash': '0x{}'.format(extrinsic.extrinsic_hash),
+                        'finalized': False
+                    }
+
+        if wait_for_inclusion or wait_for_finalization:
+            response = self.rpc_request(
+                "author_submitAndWatchExtrinsic",
+                [str(extrinsic.data)],
+                result_handler=result_handler
+            )
+        else:
+
+            response = self.rpc_request("author_submitExtrinsic", [str(extrinsic.data)])
+
+            if 'result' not in response:
+                raise SubstrateRequestException(response.get('error'))
+
+            response = {
+                'extrinsic_hash': response['result'],
+                'block_hash': None,
+                'finalized': None
+            }
+
+        return response
+
+    def process_metadata_typestring(self, type_string):
+        """
+        Process how given type_string is decoded with active runtime and type registry
+
+        Parameters
+        ----------
+        type_string: RUST variable type, e.g. Vec<Address>
+
+        Returns
+        -------
+
+        dict of properties for given type_string
+
+        E.g.
+
+        `{
+            "type_string": "Vec<Address>",
+            "decoder_class": "Vec",
+            "is_primitive_runtime": false,
+            "is_primitive_core": false,
+            "spec_version": 1030
+        }`
+
+        """
+        decoder_class_obj = None
+
+        type_info = {
+            "type_string": type_string,
+            "decoder_class": None,
+            "is_primitive_runtime": None,
+            "is_primitive_core": False,
+            "spec_version": self.runtime_version
+        }
+
+        if self.runtime_version not in self.type_registry_cache:
+            self.type_registry_cache[self.runtime_version] = {}
+
+        # Check if already added
+        if type_string.lower() in self.type_registry_cache[self.runtime_version]:
+            return self.type_registry_cache[self.runtime_version][type_string.lower()]['decoder_class']
+
+        # Try to get decoder class
+        decoder_class = RuntimeConfiguration().get_decoder_class(type_string)
+
+        if not decoder_class:
+
+            # Not in type registry, try get hard coded decoder classes
+            try:
+                decoder_class_obj = ScaleDecoder.get_decoder_class(type_string)
+                decoder_class = decoder_class_obj.__class__
+            except NotImplementedError as e:
+                decoder_class = None
+
+        # Process classes that contain subtypes (e.g. Option<ChangesTrieConfiguration>)
+        if decoder_class_obj and decoder_class_obj.sub_type:
+            type_info["is_primitive_runtime"] = False
+
+            # Try to split on ',' (e.g. ActiveRecovery<BlockNumber, BalanceOf, AccountId>)
+            if not re.search('[<()>]', decoder_class_obj.sub_type):
+                for element in decoder_class_obj.sub_type.split(','):
+                    if element not in ['T', 'I']:
+                        self.process_metadata_typestring(element.strip())
+
+        # Process classes that contain type_mapping (e.g. Struct and Enum)
+        if decoder_class and hasattr(decoder_class, 'type_mapping') and decoder_class.type_mapping:
+
+            if type_string[0] == '(':
+                type_info["is_primitive_runtime"] = False
+
+            for key, data_type in decoder_class.type_mapping:
+                self.process_metadata_typestring(data_type)
+
+        # Try to get superclass as actual decoding class if not root level 'ScaleType'
+        if decoder_class and len(decoder_class.__mro__) > 1 and decoder_class.__mro__[1].__name__ != 'ScaleType':
+            decoder_class = decoder_class.__mro__[1]
+
+        if decoder_class:
+            type_info['decoder_class'] = decoder_class.__name__
+
+            if type_info["is_primitive_runtime"] is None:
+                type_info["is_primitive_runtime"] = True
+
+            if type_info["is_primitive_runtime"] and type_string.lower() in ScaleDecoder.PRIMITIVES:
+                type_info["is_primitive_core"] = True
+        else:
+            type_info["is_primitive_runtime"] = None
+            type_info["is_primitive_core"] = None
+
+        self.type_registry_cache[self.runtime_version][type_string.lower()] = type_info
+
+        return decoder_class
+
+    def get_type_registry(self, block_hash=None):
+        """
+        Generates an exhaustive list of which RUST types exist in the runtime specified at given block_hash (or
+        chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        block_hash: Chaintip will be used if block_hash is omitted
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        if self.runtime_version not in self.type_registry_cache:
+
+            for module in self.metadata_decoder.metadata.modules:
+
+                # Storage backwards compt check
+                if module.storage and isinstance(module.storage, list):
+                    storage_functions = module.storage
+                elif module.storage and isinstance(getattr(module.storage, 'value'), dict):
+                    storage_functions = module.storage.items
+                else:
+                    storage_functions = []
+
+                if len(module.calls or []) > 0:
+                    for idx, call in enumerate(module.calls):
+                        for arg in call.args:
+                            self.process_metadata_typestring(arg.type)
+
+                if len(module.events or []) > 0:
+                    for event_index, event in enumerate(module.events):
+
+                        for arg_index, arg in enumerate(event.args):
+                            self.process_metadata_typestring(arg)
+
+                if len(storage_functions) > 0:
+                    for idx, storage in enumerate(storage_functions):
+
+                        # Determine type
+                        type_key1 = None
+                        type_key2 = None
+                        type_value = None
+
+                        if storage.type.get('PlainType'):
+                            type_value = storage.type.get('PlainType')
+
+                        elif storage.type.get('MapType'):
+                            type_key1 = storage.type['MapType'].get('key')
+                            type_value = storage.type['MapType'].get('value')
+
+                        elif storage.type.get('DoubleMapType'):
+                            type_key1 = storage.type['DoubleMapType'].get('key1')
+                            type_key2 = storage.type['DoubleMapType'].get('key2')
+                            type_value = storage.type['DoubleMapType'].get('value')
+
+                        self.process_metadata_typestring(type_value)
+
+                        if type_key1:
+                            self.process_metadata_typestring(type_key1)
+
+                        if type_key2:
+                            self.process_metadata_typestring(type_key2)
+
+                if len(module.constants or []) > 0:
+                    for idx, constant in enumerate(module.constants):
+
+                        # Check if types already registered in database
+                        self.process_metadata_typestring(constant.type)
+
+        return self.type_registry_cache[self.runtime_version]
+
+    def get_type_definition(self, type_string, block_hash=None):
+        """
+        Retrieves decoding specifications of given type_string
+
+        Parameters
+        ----------
+        type_string: RUST variable type, e.g. Vec<Address>
+        block_hash
+
+        Returns
+        -------
+
+        """
+        type_registry = self.get_type_registry(block_hash=block_hash)
+        return type_registry.get(type_string)
+
+    def get_metadata_modules(self, block_hash=None):
+        """
+        Retrieves a list of modules in metadata for given block_hash (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        return [{
+            'metadata_index': idx,
+            'module_id': module.get_identifier(),
+            'name': module.name,
+            'prefix': module.prefix,
+            'spec_version': self.runtime_version,
+            'count_call_functions': len(module.calls or []),
+            'count_storage_functions': len(module.calls or []),
+            'count_events': len(module.events or []),
+            'count_constants': len(module.constants or []),
+            'count_errors': len(module.errors or []),
+        } for idx, module in enumerate(self.metadata_decoder.metadata.modules)]
+
+    def get_metadata_call_functions(self, block_hash=None):
+        """
+        Retrieves a list of all call functions in metadata active for given block_hash (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        call_list = []
+
+        for call_index, (module, call) in self.metadata_decoder.call_index.items():
+            call_list.append(
+                self.serialize_module_call(
+                    module, call, self.runtime_version, call_index
+                )
+            )
+        return call_list
+
+    def get_metadata_call_function(self, module_name, call_function_name, block_hash=None):
+        """
+        Retrieves the details of a call function given module name, call function name and block_hash
+        (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        module_name
+        call_function_name
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        result = None
+
+        for call_index, (module, call) in self.metadata_decoder.call_index.items():
+            if module.name == module_name and \
+                    call.get_identifier() == call_function_name:
+                result = self.serialize_module_call(
+                    module, call, self.runtime_version, call_index
+                )
+                break
+
+        return result
+
+    def get_metadata_events(self, block_hash=None):
+        """
+        Retrieves a list of all events in metadata active for given block_hash (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+
+        self.init_runtime(block_hash=block_hash)
+
+        event_list = []
+
+        for event_index, (module, event) in self.metadata_decoder.event_index.items():
+            event_list.append(
+                self.serialize_module_event(
+                    module, event, self.runtime_version, event_index
+                )
+            )
+
+        return event_list
+
+    def get_metadata_event(self, module_name, event_name, block_hash=None):
+        """
+        Retrieves the details of an event for given module name, call function name and block_hash
+        (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        module_name
+        event_name
+        block_hash
+
+        Returns
+        -------
+
+        """
+
+        self.init_runtime(block_hash=block_hash)
+
+        for event_index, (module, event) in self.metadata_decoder.event_index.items():
+            if module.name == module_name and \
+                    event.name == event_name:
+                return self.serialize_module_event(
+                    module, event, self.runtime_version, event_index
+                )
+
+    def get_metadata_constants(self, block_hash=None):
+        """
+        Retrieves a list of all constants in metadata active at given block_hash (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+
+        self.init_runtime(block_hash=block_hash)
+
+        constant_list = []
+
+        for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+            for constant in module.constants or []:
+                constant_list.append(
+                    self.serialize_constant(
+                        constant, module, self.runtime_version
+                    )
+                )
+
+        return constant_list
+
+    def get_metadata_constant(self, module_name, constant_name, block_hash=None):
+        """
+        Retrieves the details of a constant for given module name, call function name and block_hash
+        (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        module_name
+        constant_name
+        block_hash
+
+        Returns
+        -------
+
+        """
+
+        self.init_runtime(block_hash=block_hash)
+
+        for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+
+            if module_name == module.name and module.constants:
+
+                for constant in module.constants:
+                    if constant_name == constant.name:
+                        return self.serialize_constant(
+                            constant, module, self.runtime_version
+                        )
+
+    def get_metadata_storage_functions(self, block_hash=None):
+        """
+        Retrieves a list of all storage functions in metadata active at given block_hash (or chaintip if block_hash is
+        omitted)
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        storage_list = []
+
+        for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+            if module.storage:
+                for storage in module.storage.items:
+                    storage_list.append(
+                        self.serialize_storage_item(
+                            storage_item=storage,
+                            module=module,
+                            spec_version_id=self.runtime_version
+                        )
+                    )
+
+        return storage_list
+
+    def get_metadata_storage_function(self, module_name, storage_name, block_hash=None):
+        """
+        Retrieves the details of a storage function for given module name, call function name and block_hash
+
+        Parameters
+        ----------
+        module_name
+        storage_name
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+            if module.name == module_name and module.storage:
+                for storage in module.storage.items:
+                    if storage.name == storage_name:
+                        return self.serialize_storage_item(
+                            storage_item=storage,
+                            module=module,
+                            spec_version_id=self.runtime_version
+                        )
+
+    def get_metadata_errors(self, block_hash=None):
+        """
+        Retrieves a list of all errors in metadata active at given block_hash (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        error_list = []
+
+        for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+            if module.errors:
+                for error in module.errors:
+                    error_list.append(
+                        self.serialize_module_error(
+                            module=module, error=error, spec_version=self.runtime_version
+                        )
+                    )
+
+        return error_list
+
+    def get_metadata_error(self, module_name, error_name, block_hash=None):
+        """
+        Retrieves the details of an error for given module name, call function name and block_hash
+
+        Parameters
+        ----------
+        module_name
+        error_name
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+            if module.name == module_name and module.errors:
+                for error in module.errors:
+                    if error_name == error.name:
+                        return self.serialize_module_error(
+                            module=module, error=error, spec_version=self.runtime_version
+                        )
+
+    def get_runtime_block(self, block_hash=None, block_id=None):
+        """
+        Retrieves a block with method `chain_getBlock` and in addition decodes extrinsics and log items
+
+        Parameters
+        ----------
+        block_hash
+        block_id
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash, block_id=block_id)
+
+        response = self.rpc_request("chain_getBlock", [self.block_hash]).get('result')
+
+        response['block']['header']['number'] = int(response['block']['header']['number'], 16)
+
+        for idx, extrinsic_data in enumerate(response['block']['extrinsics']):
+            extrinsic_decoder = ExtrinsicsDecoder(
+                data=ScaleBytes(extrinsic_data),
+                metadata=self.metadata_decoder
+            )
+            extrinsic_decoder.decode()
+            response['block']['extrinsics'][idx] = extrinsic_decoder.value
+
+        for idx, log_data in enumerate(response['block']['header']["digest"]["logs"]):
+            log_digest = LogDigest(ScaleBytes(log_data))
+            log_digest.decode()
+            response['block']['header']["digest"]["logs"][idx] = log_digest.value
+
+        return response
+
+    def decode_scale(self, type_string, scale_bytes, block_hash=None):
+        """
+        Helper function to decode arbitrary SCALE-bytes (e.g. 0x02000000) according to given RUST type_string
+        (e.g. BlockNumber). The relevant versioning information of the type (if defined) will be applied if block_hash
+        is set
+
+        Parameters
+        ----------
+        type_string
+        scale_bytes
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        obj = ScaleDecoder.get_decoder_class(type_string, ScaleBytes(scale_bytes), metadata=self.metadata_decoder)
+        return obj.decode()
+
+    def encode_scale(self, type_string, value, block_hash=None):
+        """
+        Helper function to encode arbitrary data into SCALE-bytes for given RUST type_string
+
+        Parameters
+        ----------
+        type_string
+        value
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        obj = ScaleDecoder.get_decoder_class(type_string)
+        return str(obj.encode(value))
+
+    # Serializing helper function
+
+    def serialize_storage_item(self, storage_item, module, spec_version_id):
+        """
+        Helper function to serialize a storage item
+
+        Parameters
+        ----------
+        storage_item
+        module
+        spec_version_id
+
+        Returns
+        -------
+
+        """
+        storage_dict = {
+            "storage_name": storage_item.name,
+            "storage_modifier": storage_item.modifier,
+            "storage_fallback_scale": storage_item.fallback,
+            "storage_fallback": None,
+            "documentation": '\n'.join(storage_item.docs),
+            "module_id": module.get_identifier(),
+            "module_prefix": module.prefix,
+            "module_name": module.name,
+            "spec_version": spec_version_id,
+            "type_key1": None,
+            "type_key2": None,
+            "type_hasher_key1": None,
+            "type_hasher_key2": None,
+            "type_value": None,
+            "type_is_linked": None
+        }
+
+        type_class, type_info = next(iter(storage_item.type.items()))
+
+        storage_dict["type_class"] = type_class
+
+        if type_class == 'PlainType':
+            storage_dict["type_value"] = type_info
+
+        elif type_class == 'MapType':
+            storage_dict["type_value"] = type_info["value"]
+            storage_dict["type_key1"] = type_info["key"]
+            storage_dict["type_hasher_key1"] = type_info["hasher"]
+            storage_dict["type_is_linked"] = type_info["isLinked"]
+
+        elif type_class == 'DoubleMapType':
+
+            storage_dict["type_value"] = type_info["value"]
+            storage_dict["type_key1"] = type_info["key1"]
+            storage_dict["type_key2"] = type_info["key2"]
+            storage_dict["type_hasher_key1"] = type_info["hasher"]
+            storage_dict["type_hasher_key1"] = type_info["key2Hasher"]
+
+        if storage_item.fallback != '0x00':
+            # Decode fallback
+            try:
+                fallback_obj = ScaleDecoder.get_decoder_class(storage_dict["type_value"],
+                                                              ScaleBytes(storage_item.fallback))
+                storage_dict["storage_fallback"] = fallback_obj.decode()
+            except Exception:
+                storage_dict["storage_fallback"] = '[decoding error]'
+
+        return storage_dict
+
+    def serialize_constant(self, constant, module, spec_version_id):
+        """
+        Helper function to serialize a constant
+
+        Parameters
+        ----------
+        constant
+        module
+        spec_version_id
+
+        Returns
+        -------
+
+        """
+        try:
+            value_obj = ScaleDecoder.get_decoder_class(constant.type,
+                                                       ScaleBytes(constant.constant_value))
+            constant_decoded_value = value_obj.decode()
+        except Exception:
+            constant_decoded_value = '[decoding error]'
+
+        return {
+            "constant_name": constant.name,
+            "constant_type": constant.type,
+            "constant_value": constant_decoded_value,
+            "constant_value_scale": constant.constant_value,
+            "documentation": '\n'.join(constant.docs),
+            "module_id": module.get_identifier(),
+            "module_prefix": module.prefix,
+            "module_name": module.name,
+            "spec_version": spec_version_id
+        }
+
+    def serialize_module_call(self, module, call, spec_version, call_index):
+        """
+        Helper function to serialize a call function
+
+        Parameters
+        ----------
+        module
+        call
+        spec_version
+        call_index
+
+        Returns
+        -------
+
+        """
+        return {
+            "call_id": call.get_identifier(),
+            "call_name": call.name,
+            "call_args": [call_arg.value for call_arg in call.args],
+            "lookup": '0x{}'.format(call_index),
+            "documentation": '\n'.join(call.docs),
+            "module_id": module.get_identifier(),
+            "module_prefix": module.prefix,
+            "module_name": module.name,
+            "spec_version": spec_version
+        }
+
+    def serialize_module_event(self, module, event, spec_version, event_index):
+        """
+        Helper function to serialize an event
+
+        Parameters
+        ----------
+        module
+        event
+        spec_version
+        event_index
+
+        Returns
+        -------
+
+        """
+        return {
+            "event_id": event.name,
+            "event_name": event.name,
+            "event_args": [
+                  {
+                    "event_arg_index": idx,
+                    "type": arg
+                  } for idx, arg in enumerate(event.args)
+                ],
+            "lookup": '0x{}'.format(event_index),
+            "documentation": '\n'.join(event.docs),
+            "module_id": module.get_identifier(),
+            "module_prefix": module.prefix,
+            "module_name": module.name,
+            "spec_version": spec_version
+        }
+
+    def serialize_module_error(self, module, error, spec_version):
+        """
+        Helper function to serialize an error
+
+        Parameters
+        ----------
+        module
+        error
+        spec_version
+
+        Returns
+        -------
+
+        """
+        return {
+            "error_name": error.name,
+            "documentation": '\n'.join(error.docs),
+            "module_id": module.get_identifier(),
+            "module_prefix": module.prefix,
+            "module_name": module.name,
+            "spec_version": spec_version
+        }
+
+
+
+

Sub-modules

+
+
substrateinterface.constants
+
+
+
+
substrateinterface.exceptions
+
+
+
+
substrateinterface.subkey
+
+
+
+
substrateinterface.utils
+
+
+
+
+
+
+
+
+

Functions

+
+
+def bip39_generate(...) +
+
+
+
+
+def bip39_to_mini_secret(...) +
+
+
+
+
+
+
+

Classes

+
+
+class Keypair +(ss58_address=None, public_key=None, private_key=None, address_type=42) +
+
+
+
+ +Expand source code + +
class Keypair:
+
+    def __init__(self, ss58_address=None, public_key=None, private_key=None, address_type=42):
+
+        if ss58_address and not public_key:
+            public_key = ss58_decode(ss58_address)
+
+        if not public_key:
+            raise ValueError('No SS58 formatted address or public key provided')
+
+        public_key = '0x{}'.format(public_key.replace('0x', ''))
+
+        if len(public_key) != 66:
+            raise ValueError('Public key should be 32 bytes long')
+
+        if not ss58_address:
+            ss58_address = ss58_encode(public_key, address_type=address_type)
+
+        self.public_key = public_key
+        self.ss58_address = ss58_address
+
+        if private_key:
+            private_key = '0x{}'.format(private_key.replace('0x', ''))
+
+            if len(private_key) != 130:
+                raise ValueError('Secret key should be 64 bytes long')
+
+        self.private_key = private_key
+        self.address_type = address_type
+
+        self.mnemonic = None
+
+    @classmethod
+    def generate_mnemonic(cls, words=12):
+        return bip39_generate(words)
+
+    @classmethod
+    def create_from_mnemonic(cls, mnemonic, address_type=42):
+        seed_array = bip39_to_mini_secret(mnemonic, "")
+
+        keypair = cls.create_from_seed(
+            seed_hex=binascii.hexlify(bytearray(seed_array)).decode("ascii"),
+            address_type=address_type
+        )
+        keypair.mnemonic = mnemonic
+
+        return keypair
+
+    @classmethod
+    def create_from_seed(cls, seed_hex, address_type=42):
+        keypair = sr25519.pair_from_seed(bytes.fromhex(seed_hex.replace('0x', '')))
+        public_key = keypair[0].hex()
+        private_key = keypair[1].hex()
+        ss58_address = ss58_encode(keypair[0], address_type)
+        return cls(ss58_address=ss58_address, public_key=public_key, private_key=private_key, address_type=address_type)
+
+    @classmethod
+    def create_from_private_key(cls, private_key, public_key=None, ss58_address=None, address_type=42):
+        return cls(ss58_address=ss58_address, public_key=public_key, private_key=private_key, address_type=address_type)
+
+    def sign(self, data):
+        """
+        Creates a sr25519 signature with give data
+
+        Parameters
+        ----------
+        data
+
+        Returns
+        -------
+        sr25519 signature
+
+        """
+        if type(data) is ScaleBytes:
+            data = bytes(data.data)
+        elif data[0:2] == '0x':
+            data = bytes.fromhex(data[2:])
+        else:
+            data = data.encode()
+
+        if not self.private_key:
+            raise ConfigurationError('No private key set to create sr25519 signatures')
+
+        signature = sr25519.sign(
+            (bytes.fromhex(self.public_key[2:]), bytes.fromhex(self.private_key[2:])),
+            data
+        )
+        return "0x{}".format(signature.hex())
+
+    def verify(self, data, signature):
+
+        if type(data) is ScaleBytes:
+            data = bytes(data.data)
+        elif data[0:2] == '0x':
+            data = bytes.fromhex(data[2:])
+        else:
+            data = data.encode()
+
+        if type(signature) is str and signature[0:2] == '0x':
+            signature = bytes.fromhex(signature[2:])
+
+        if type(signature) is not bytes:
+            raise TypeError("Signature should be of type bytes or a hex-string")
+
+        return sr25519.verify(signature, data, bytes.fromhex(self.public_key[2:]))
+
+

Static methods

+
+
+def create_from_mnemonic(mnemonic, address_type=42) +
+
+
+
+ +Expand source code + +
@classmethod
+def create_from_mnemonic(cls, mnemonic, address_type=42):
+    seed_array = bip39_to_mini_secret(mnemonic, "")
+
+    keypair = cls.create_from_seed(
+        seed_hex=binascii.hexlify(bytearray(seed_array)).decode("ascii"),
+        address_type=address_type
+    )
+    keypair.mnemonic = mnemonic
+
+    return keypair
+
+
+
+def create_from_private_key(private_key, public_key=None, ss58_address=None, address_type=42) +
+
+
+
+ +Expand source code + +
@classmethod
+def create_from_private_key(cls, private_key, public_key=None, ss58_address=None, address_type=42):
+    return cls(ss58_address=ss58_address, public_key=public_key, private_key=private_key, address_type=address_type)
+
+
+
+def create_from_seed(seed_hex, address_type=42) +
+
+
+
+ +Expand source code + +
@classmethod
+def create_from_seed(cls, seed_hex, address_type=42):
+    keypair = sr25519.pair_from_seed(bytes.fromhex(seed_hex.replace('0x', '')))
+    public_key = keypair[0].hex()
+    private_key = keypair[1].hex()
+    ss58_address = ss58_encode(keypair[0], address_type)
+    return cls(ss58_address=ss58_address, public_key=public_key, private_key=private_key, address_type=address_type)
+
+
+
+def generate_mnemonic(words=12) +
+
+
+
+ +Expand source code + +
@classmethod
+def generate_mnemonic(cls, words=12):
+    return bip39_generate(words)
+
+
+
+

Methods

+
+
+def sign(self, data) +
+
+

Creates a sr25519 signature with give data

+

Parameters

+
+
data
+
 
+
+

Returns

+
+
sr25519 signature
+
 
+
+
+ +Expand source code + +
def sign(self, data):
+    """
+    Creates a sr25519 signature with give data
+
+    Parameters
+    ----------
+    data
+
+    Returns
+    -------
+    sr25519 signature
+
+    """
+    if type(data) is ScaleBytes:
+        data = bytes(data.data)
+    elif data[0:2] == '0x':
+        data = bytes.fromhex(data[2:])
+    else:
+        data = data.encode()
+
+    if not self.private_key:
+        raise ConfigurationError('No private key set to create sr25519 signatures')
+
+    signature = sr25519.sign(
+        (bytes.fromhex(self.public_key[2:]), bytes.fromhex(self.private_key[2:])),
+        data
+    )
+    return "0x{}".format(signature.hex())
+
+
+
+def verify(self, data, signature) +
+
+
+
+ +Expand source code + +
def verify(self, data, signature):
+
+    if type(data) is ScaleBytes:
+        data = bytes(data.data)
+    elif data[0:2] == '0x':
+        data = bytes.fromhex(data[2:])
+    else:
+        data = data.encode()
+
+    if type(signature) is str and signature[0:2] == '0x':
+        signature = bytes.fromhex(signature[2:])
+
+    if type(signature) is not bytes:
+        raise TypeError("Signature should be of type bytes or a hex-string")
+
+    return sr25519.verify(signature, data, bytes.fromhex(self.public_key[2:]))
+
+
+
+
+
+class SubstrateInterface +(url, address_type=None, type_registry=None, type_registry_preset='default', cache_region=None, sub_key: Subkey = None) +
+
+

A specialized class in interfacing with a Substrate node.

+

Parameters

+
+
url : the URL to the substrate node, either in format <https://127.0.0.1:9933> or wss://127.0.0.1:9944
+
 
+
address_type : The address type which account IDs will be SS58-encoded to Substrate addresses. Defaults to 42, for Kusama the address type is 2
+
 
+
type_registry : A dict containing the custom type registry in format: {'types': {'customType': 'u32'},..}
+
 
+
type_registry_preset : The name of the predefined type registry shipped with the SCALE-codec, e.g. kusama
+
 
+
cache_region : a Dogpile cache region as a central store for the metadata cache
+
 
+
+
+ +Expand source code + +
class SubstrateInterface:
+
+    def __init__(self, url, address_type=None, type_registry=None, type_registry_preset="default", cache_region=None,
+                 sub_key: Subkey = None):
+        """
+        A specialized class in interfacing with a Substrate node.
+
+        Parameters
+        ----------
+        url: the URL to the substrate node, either in format https://127.0.0.1:9933 or wss://127.0.0.1:9944
+        address_type: The address type which account IDs will be SS58-encoded to Substrate addresses. Defaults to 42, for Kusama the address type is 2
+        type_registry: A dict containing the custom type registry in format: {'types': {'customType': 'u32'},..}
+        type_registry_preset: The name of the predefined type registry shipped with the SCALE-codec, e.g. kusama
+        cache_region: a Dogpile cache region as a central store for the metadata cache
+        """
+        self.cache_region = cache_region
+
+        if type_registry_preset:
+            # Load type registries in runtime configuration
+            RuntimeConfiguration().update_type_registry(load_type_registry_preset("default"))
+
+            if type_registry != "default":
+                RuntimeConfiguration().update_type_registry(load_type_registry_preset(type_registry_preset))
+
+        if type_registry:
+            # Load type registries in runtime configuration
+            RuntimeConfiguration().update_type_registry(type_registry)
+
+        self.request_id = 1
+        self.url = url
+
+        self._ws_result = None
+
+        self.address_type = address_type
+
+        self.mock_extrinsics = None
+        self._version = None
+        self.default_headers = {
+            'content-type': "application/json",
+            'cache-control': "no-cache"
+        }
+
+        self.metadata_decoder = None
+
+        self.runtime_version = None
+        self.transaction_version = None
+
+        self.block_hash = None
+        self.block_id = None
+
+        self.metadata_cache = {}
+        self.type_registry_cache = {}
+
+        self.sub_key = sub_key
+
+        self.debug = False
+
+    def debug_message(self, message):
+        logger.debug(message)
+
+    def rpc_request(self, method, params, result_handler=None):
+        """
+        Method that handles the actual RPC request to the Substrate node. The other implemented functions eventually
+        use this method to perform the request.
+
+        Parameters
+        ----------
+        result_handler: Callback of function that processes the result received from the node
+        method: method of the JSONRPC request
+        params: a list containing the parameters of the JSONRPC request
+
+        Returns
+        -------
+        a dict with the parsed result of the request.
+        """
+        payload = {
+            "jsonrpc": "2.0",
+            "method": method,
+            "params": params,
+            "id": self.request_id
+        }
+
+        self.debug_message('RPC request "{}"'.format(method))
+
+        if self.url[0:6] == 'wss://' or self.url[0:5] == 'ws://':
+            ws_result = {}
+
+            async def ws_request(ws_payload):
+                """
+                Internal method to handle the request if url is a websocket address (wss:// or ws://)
+
+                Parameters
+                ----------
+                ws_payload: a dict that contains the JSONRPC payload of the request
+
+                Returns
+                -------
+                This method doesn't return but updates the `ws_result` object variable with the result
+                """
+                async with websockets.connect(
+                        self.url
+                ) as websocket:
+                    await websocket.send(json.dumps(ws_payload))
+
+                    if callable(result_handler):
+                        event_number = 0
+                        while not ws_result:
+                            result = json.loads(await websocket.recv())
+                            self.debug_message("Websocket result [{}] Received from node: {}".format(event_number, result))
+
+                            # Check if response has error
+                            if 'error' in result:
+                                raise SubstrateRequestException(result['error'])
+
+                            callback_result = result_handler(result)
+                            if callback_result:
+                                ws_result.update(callback_result)
+
+                            event_number += 1
+                    else:
+                        ws_result.update(json.loads(await websocket.recv()))
+
+            asyncio.run(ws_request(payload))
+            json_body = ws_result
+
+        else:
+
+            if result_handler:
+                raise ConfigurationError("Result handlers only available for websockets (ws://) connections")
+
+            response = requests.request("POST", self.url, data=json.dumps(payload), headers=self.default_headers)
+
+            if response.status_code != 200:
+                raise SubstrateRequestException("RPC request failed with HTTP status code {}".format(response.status_code))
+
+            json_body = response.json()
+
+        return json_body
+
+    def get_system_name(self):
+        """
+        A pass-though to existing JSONRPC method `system_name`
+
+        Returns
+        -------
+
+        """
+        response = self.rpc_request("system_name", [])
+        return response.get('result')
+
+    def get_version(self):
+        """
+        A pass-though to existing JSONRPC method `system_version`
+
+        Returns
+        -------
+
+        """
+        if not self._version:
+            response = self.rpc_request("system_version", [])
+            self._version = response.get('result')
+        return self._version
+
+    def get_chain_head(self):
+        """
+        A pass-though to existing JSONRPC method `chain_getHead`
+
+        Returns
+        -------
+
+        """
+        response = self.rpc_request("chain_getHead", [])
+        return response.get('result')
+
+    def get_chain_finalised_head(self):
+        """
+        A pass-though to existing JSONRPC method `chain_getFinalisedHead`
+
+        Returns
+        -------
+
+        """
+        response = self.rpc_request("chain_getFinalisedHead", [])
+        return response.get('result')
+
+    def get_chain_block(self, block_hash=None, block_id=None, metadata_decoder=None):
+        """
+        A pass-though to existing JSONRPC method `chain_getBlock`. For a decoded version see `get_runtime_block()`
+
+        Parameters
+        ----------
+        block_hash
+        block_id
+        metadata_decoder
+
+        Returns
+        -------
+
+        """
+
+        if block_id:
+            block_hash = self.get_block_hash(block_id)
+
+        response = self.rpc_request("chain_getBlock", [block_hash]).get('result')
+
+        if self.mock_extrinsics:
+            # Extend extrinsics with mock_extrinsics for e.g. performance tests
+            response['block']['extrinsics'].extend(self.mock_extrinsics)
+
+        # Decode extrinsics
+        if metadata_decoder:
+
+            response['block']['header']['number'] = int(response['block']['header']['number'], 16)
+
+            for idx, extrinsic_data in enumerate(response['block']['extrinsics']):
+                extrinsic_decoder = ExtrinsicsDecoder(
+                    data=ScaleBytes(extrinsic_data),
+                    metadata=metadata_decoder
+                )
+                extrinsic_decoder.decode()
+                response['block']['extrinsics'][idx] = extrinsic_decoder.value
+
+            for idx, log_data in enumerate(response['block']['header']["digest"]["logs"]):
+                log_digest = LogDigest(ScaleBytes(log_data))
+                log_digest.decode()
+                response['block']['header']["digest"]["logs"][idx] = log_digest.value
+
+        return response
+
+    def get_block_hash(self, block_id):
+        """
+        A pass-though to existing JSONRPC method `chain_getBlockHash`
+
+        Parameters
+        ----------
+        block_id
+
+        Returns
+        -------
+
+        """
+        return self.rpc_request("chain_getBlockHash", [block_id]).get('result')
+
+    def get_block_header(self, block_hash):
+        """
+        A pass-though to existing JSONRPC method `chain_getHeader`
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        response = self.rpc_request("chain_getHeader", [block_hash])
+        return response.get('result')
+
+    def get_block_number(self, block_hash):
+        """
+        A convenience method to get the block number for given block_hash
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        response = self.rpc_request("chain_getHeader", [block_hash])
+        return int(response['result']['number'], 16)
+
+    def get_block_metadata(self, block_hash=None, decode=True):
+        """
+        A pass-though to existing JSONRPC method `state_getMetadata`. For a decoded version see `get_runtime_metadata()`
+
+        Parameters
+        ----------
+        block_hash
+        decode: DEPRECATED use `get_runtime_metadata()` for decoded version
+
+        Returns
+        -------
+
+        """
+        params = None
+        if block_hash:
+            params = [block_hash]
+        response = self.rpc_request("state_getMetadata", params)
+
+        if decode:
+            metadata_decoder = MetadataDecoder(ScaleBytes(response.get('result')))
+            metadata_decoder.decode()
+
+            return metadata_decoder
+
+        return response
+
+    def get_storage(self, block_hash, module, function, params=None, return_scale_type=None, hasher=None,
+                    spec_version_id='default', metadata=None, metadata_version=None):
+        """
+        Retrieves the storage entry for given module, function and optional parameters at given block.
+
+        DEPRECATED: use `get_runtime_state()`
+
+        Parameters
+        ----------
+        block_hash
+        module
+        function
+        params
+        return_scale_type: Scale type string to interprete result
+        hasher: Hashing method used to determine storage key, defaults to 'Twox64Concat' if not provided
+        spec_version_id: DEPRECATED
+        metadata
+        metadata_version: Version index of Metadata, e.g. 9 for MetadataV9
+
+        Returns
+        -------
+
+        """
+        storage_hash = self.generate_storage_hash(
+            storage_module=module,
+            storage_function=function,
+            params=params,
+            hasher=hasher,
+            metadata_version=metadata_version
+        )
+        response = self.rpc_request("state_getStorageAt", [storage_hash, block_hash])
+
+        if 'result' in response:
+
+            if return_scale_type and response.get('result'):
+                obj = ScaleDecoder.get_decoder_class(
+                    return_scale_type,
+                    ScaleBytes(response.get('result')),
+                    metadata=metadata
+                )
+                return obj.decode()
+            else:
+                return response.get('result')
+        else:
+            raise SubstrateRequestException("Error occurred during retrieval of events")
+
+    def get_storage_by_key(self, block_hash, storage_key):
+        """
+        A pass-though to existing JSONRPC method `state_getStorageAt`
+
+        Parameters
+        ----------
+        block_hash
+        storage_key
+
+        Returns
+        -------
+
+        """
+
+        response = self.rpc_request("state_getStorageAt", [storage_key, block_hash])
+        if 'result' in response:
+            return response.get('result')
+        else:
+            raise SubstrateRequestException("Error occurred during retrieval of events")
+
+    def get_block_events(self, block_hash, metadata_decoder=None):
+        """
+        A convenience method to fetch the undecoded events from storage
+
+        Parameters
+        ----------
+        block_hash
+        metadata_decoder
+
+        Returns
+        -------
+
+        """
+
+        if metadata_decoder and metadata_decoder.version.index >= 9:
+            storage_hash = STORAGE_HASH_SYSTEM_EVENTS_V9
+        else:
+            storage_hash = STORAGE_HASH_SYSTEM_EVENTS
+
+        response = self.rpc_request("state_getStorageAt", [storage_hash, block_hash])
+
+        if response.get('result'):
+
+            if metadata_decoder:
+                # Process events
+                events_decoder = EventsDecoder(
+                    data=ScaleBytes(response.get('result')),
+                    metadata=metadata_decoder
+                )
+                events_decoder.decode()
+
+                return events_decoder
+
+            else:
+                return response
+        else:
+            raise SubstrateRequestException("Error occurred during retrieval of events")
+
+    def get_block_runtime_version(self, block_hash):
+        """
+        Retrieve the runtime version id of given block_hash
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        response = self.rpc_request("chain_getRuntimeVersion", [block_hash])
+        return response.get('result')
+
+    def generate_storage_hash(self, storage_module, storage_function, params=None, hasher=None, key2_hasher=None, metadata_version=None):
+        """
+        Generate a storage key for given module/function
+
+        Parameters
+        ----------
+        storage_module
+        storage_function
+        params: Parameters of the storage function, provided in scale encoded hex-bytes
+        hasher: Hashing method used to determine storage key, defaults to 'Twox64Concat' if not provided
+        metadata_version: Version index of Metadata, e.g. 9 for MetadataV9
+
+        Returns
+        -------
+
+        """
+
+        if not metadata_version or metadata_version >= 9:
+            storage_hash = xxh128(storage_module.encode()) + xxh128(storage_function.encode())
+
+            if params:
+
+                if type(params) is not list:
+                    params = [params]
+
+                for idx, param in enumerate(params):
+                    if idx == 0:
+                        param_hasher = hasher
+                    elif idx == 1:
+                        param_hasher = key2_hasher
+                    else:
+                        raise ValueError('Unexpected third parameter for storage call')
+
+                    params_key = bytes()
+
+                    if type(param) is str:
+                        params_key += binascii.unhexlify(param)
+                    elif type(param) is ScaleBytes:
+                        params_key += param.data
+                    elif isinstance(param, ScaleDecoder):
+                        params_key += param.data.data
+
+                    if not param_hasher:
+                        param_hasher = 'Twox128'
+
+                    if param_hasher == 'Blake2_256':
+                        storage_hash += blake2_256(params_key)
+
+                    elif param_hasher == 'Blake2_128':
+                        storage_hash += blake2_128(params_key)
+
+                    elif param_hasher == 'Blake2_128Concat':
+                        storage_hash += blake2_128_concat(params_key)
+
+                    elif param_hasher == 'Twox128':
+                        storage_hash += xxh128(params_key)
+
+                    elif param_hasher == 'Twox64Concat':
+                        storage_hash += two_x64_concat(params_key)
+
+                    elif param_hasher == 'Identity':
+                        storage_hash += identity(params_key)
+
+                    else:
+                        raise ValueError('Unknown storage hasher "{}"'.format(param_hasher))
+
+            return '0x{}'.format(storage_hash)
+
+        else:
+            storage_hash = storage_module.encode() + b" " + storage_function.encode()
+
+            if params:
+                storage_hash += binascii.unhexlify(params)
+
+            # Determine hasher function
+            if not hasher:
+                hasher = 'Twox128'
+
+            if hasher == 'Blake2_256':
+                return "0x{}".format(blake2_256(storage_hash))
+
+            elif hasher == 'Twox128':
+                return "0x{}".format(xxh128(storage_hash))
+
+            elif hasher == 'Twox64Concat':
+                return "0x{}".format(two_x64_concat(storage_hash))
+
+    def convert_storage_parameter(self, scale_type, value):
+        if scale_type == 'AccountId':
+            if value[0:2] != '0x':
+                return '0x{}'.format(ss58_decode(value, self.address_type))
+
+        return value
+
+    # Runtime functions used by Substrate API
+
+    def init_runtime(self, block_hash=None, block_id=None):
+        """
+        This method is used by all other methods that deals with metadata and types defined in the type registry.
+        It optionally retrieves the block_hash when block_id is given and sets the applicable metadata for that
+        block_hash. Also it applies all the versioned types at the time of the block_hash.
+
+        Because parsing of metadata and type registry is quite heavy, the result will be cached per runtime id.
+        In the future there could be support for caching backends like Redis to make this cache more persistent.
+
+        Parameters
+        ----------
+        block_hash
+        block_id
+
+        Returns
+        -------
+
+        """
+
+        if block_id and block_hash:
+            raise ValueError('Cannot provide block_hash and block_id at the same time')
+
+        # Check if runtime state already set to current block
+        if (block_hash and block_hash == self.block_hash) or (block_id and block_id == self.block_id):
+            return
+
+        if block_id is not None:
+            block_hash = self.get_block_hash(block_id)
+
+        self.block_hash = block_hash
+        self.block_id = block_id
+
+        runtime_info = self.get_block_runtime_version(block_hash=self.block_hash)
+
+        # Check if runtime state already set to current block
+        if runtime_info.get("specVersion") == self.runtime_version:
+            return
+
+        self.runtime_version = runtime_info.get("specVersion")
+        self.transaction_version = runtime_info.get("transactionVersion")
+
+        # Set active runtime version
+        RuntimeConfiguration().set_active_spec_version_id(self.runtime_version)
+
+        if self.runtime_version not in self.metadata_cache and self.cache_region:
+            # Try to retrieve metadata from Dogpile cache
+            cached_metadata = self.cache_region.get('METADATA_{}'.format(self.runtime_version))
+            if cached_metadata:
+                self.debug_message('Retrieved metadata for {} from Redis'.format(self.runtime_version))
+                self.metadata_cache[self.runtime_version] = cached_metadata
+
+        if self.runtime_version in self.metadata_cache:
+            # Get metadata from cache
+            self.debug_message('Retrieved metadata for {} from memory'.format(self.runtime_version))
+            self.metadata_decoder = self.metadata_cache[self.runtime_version]
+        else:
+            self.metadata_decoder = self.get_block_metadata(block_hash=self.block_hash, decode=True)
+            self.debug_message('Retrieved metadata for {} from Substrate node'.format(self.runtime_version))
+
+            # Update metadata cache
+            self.metadata_cache[self.runtime_version] = self.metadata_decoder
+
+            if self.cache_region:
+                self.debug_message('Stored metadata for {} in Redis'.format(self.runtime_version))
+                self.cache_region.set('METADATA_{}'.format(self.runtime_version), self.metadata_decoder)
+
+    def get_runtime_state(self, module, storage_function, params=None, block_hash=None):
+        """
+        Retrieves the storage entry for given module, function and optional parameters at given block hash
+
+        Parameters
+        ----------
+        module: The module name in the metadata, e.g. Balances or Account
+        storage_function: The storage function name, e.g. FreeBalance or AccountNonce
+        params: list of params, in the decoded format of the applicable ScaleTypes
+        block_hash: Optional block hash, when left to None the chain tip will be used
+
+        Returns
+        -------
+
+        """
+
+        self.init_runtime(block_hash=block_hash)
+
+        # Search storage call in metadata
+        for metadata_module in self.metadata_decoder.metadata.modules:
+            if metadata_module.name == module:
+                if metadata_module.storage:
+                    for storage_item in metadata_module.storage.items:
+                        if storage_item.name == storage_function:
+
+                            key2_hasher = None
+
+                            if 'PlainType' in storage_item.type:
+                                hasher = 'Twox64Concat'
+                                return_scale_type = storage_item.type.get('PlainType')
+                                if params:
+                                    raise ValueError('Storage call of type "PlainType" doesn\'t accept params')
+
+                            elif 'MapType' in storage_item.type:
+
+                                map_type = storage_item.type.get('MapType')
+                                hasher = map_type.get('hasher')
+                                return_scale_type = map_type.get('value')
+
+                                if not params or len(params) != 1:
+                                    raise ValueError('Storage call of type "MapType" requires 1 parameter')
+
+                                # Encode parameter
+                                params[0] = self.convert_storage_parameter(map_type['key'], params[0])
+                                param_obj = ScaleDecoder.get_decoder_class(map_type['key'])
+                                params[0] = param_obj.encode(params[0])
+
+                            elif 'DoubleMapType' in storage_item.type:
+
+                                map_type = storage_item.type.get('DoubleMapType')
+                                hasher = map_type.get('hasher')
+                                key2_hasher = map_type.get('key2Hasher')
+                                return_scale_type = map_type.get('value')
+
+                                if not params or len(params) != 2:
+                                    raise ValueError('Storage call of type "DoubleMapType" requires 2 parameters')
+
+                                # Encode parameter 1
+                                params[0] = self.convert_storage_parameter(map_type['key1'], params[0])
+                                param_obj = ScaleDecoder.get_decoder_class(map_type['key1'])
+                                params[0] = param_obj.encode(params[0])
+
+                                # Encode parameter 2
+                                params[1] = self.convert_storage_parameter(map_type['key2'], params[1])
+                                param_obj = ScaleDecoder.get_decoder_class(map_type['key2'])
+                                params[1] = param_obj.encode(params[1])
+
+                            else:
+                                raise NotImplementedError("Storage type not implemented")
+
+                            storage_hash = self.generate_storage_hash(
+                                storage_module=metadata_module.prefix,
+                                storage_function=storage_function,
+                                params=params,
+                                hasher=hasher,
+                                key2_hasher=key2_hasher,
+                                metadata_version=self.metadata_decoder.version.index
+                            )
+
+                            response = self.rpc_request("state_getStorageAt", [storage_hash, block_hash])
+
+                            if 'result' in response:
+
+                                if return_scale_type and response.get('result'):
+                                    obj = ScaleDecoder.get_decoder_class(
+                                        return_scale_type,
+                                        ScaleBytes(response.get('result')),
+                                        metadata=self.metadata_decoder
+                                    )
+                                    response['result'] = obj.decode()
+
+                            return response
+
+        raise StorageFunctionNotFound('Storage function "{}.{}" not found'.format(module, storage_function))
+
+    def get_runtime_events(self, block_hash=None):
+        """
+        Convenience method to get events for a certain block (storage call for module 'System' and function 'Events')
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+        Collection of events
+        """
+        return self.get_runtime_state(
+            module="System",
+            storage_function="Events",
+            block_hash=block_hash
+        )
+
+    def get_runtime_metadata(self, block_hash=None):
+        """
+        Retrieves and decodes the metadata for given block or chaintip if block_hash is omitted.
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        params = None
+        if block_hash:
+            params = [block_hash]
+        response = self.rpc_request("state_getMetadata", params)
+
+        if 'result' in response:
+            metadata_decoder = MetadataDecoder(ScaleBytes(response.get('result')))
+            response['result'] = metadata_decoder.decode()
+
+        return response
+
+    def compose_call(self, call_module, call_function, call_params=(), block_hash=None):
+        """
+        Composes a call payload which can be used as an unsigned extrinsic or a proposal.
+
+        Parameters
+        ----------
+        call_module: Name of the runtime module e.g. Balances
+        call_function: Name of the call function e.g. transfer
+        call_params: This is a dict containing the params of the call. e.g. `{'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', 'value': 1000000000000}`
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        call = ScaleDecoder.get_decoder_class('Call', metadata=self.metadata_decoder)
+
+        call.encode({
+            'call_module': call_module,
+            'call_function': call_function,
+            'call_args': call_params
+        })
+
+        return call
+
+    def get_account_nonce(self, account_address):
+        response = self.get_runtime_state('System', 'Account', [account_address])
+        if response.get('result'):
+            return response['result'].get('nonce', 0)
+
+    def generate_signature_payload(self, call, era=None, nonce=0, tip=0, include_call_length=False):
+
+        # Retrieve genesis hash
+        genesis_hash = self.get_block_hash(0)
+
+        if era:
+            if era != '00':
+                # TODO implement MortalEra transactions
+                raise NotImplementedError("Mortal transactions not yet implemented")
+        else:
+            era = '00'
+
+        # Create signature payload
+        signature_payload = ScaleDecoder.get_decoder_class('ExtrinsicPayloadValue')
+
+        if include_call_length:
+
+            length_obj = RuntimeConfiguration().get_decoder_class('Bytes')
+            call_data = str(length_obj().encode(str(call.data)))
+
+        else:
+            call_data = str(call.data)
+
+        payload_dict = {
+            'call': call_data,
+            'era': era,
+            'nonce': nonce,
+            'tip': tip,
+            'specVersion': self.runtime_version,
+            'genesisHash': genesis_hash,
+            'blockHash': genesis_hash
+        }
+
+        if self.transaction_version is not None:
+            payload_dict['transactionVersion'] = self.transaction_version
+
+        signature_payload.encode(payload_dict)
+
+        return signature_payload.data
+
+    def create_signed_extrinsic(self, call, keypair: Keypair, era=None, nonce=None, tip=0, signature=None):
+        """
+        Creates a extrinsic signed by given account details
+
+        Parameters
+        ----------
+        signature
+        era
+        keypair
+        call
+        nonce
+        tip
+
+        Returns
+        -------
+        ExtrinsicsDecoder The signed Extrinsic
+        """
+
+        # Check requirements
+        if not isinstance(call, GenericCall):
+            raise TypeError("'call' must be of type Call")
+
+        # Retrieve nonce
+        if not nonce:
+            nonce = self.get_account_nonce(keypair.public_key) or 0
+
+        if era:
+            if era != '00':
+                # TODO implement MortalEra transactions
+                raise NotImplementedError("Mortal transactions not yet implemented")
+        else:
+            era = '00'
+
+        if signature:
+
+            signature = signature.replace('0x', '')
+
+            # Check if signature is a MultiSignature and contains signature version
+            if len(signature) == 130:
+                signature_version = int(signature[0:2], 16)
+                signature = '0x{}'.format(signature[2:])
+            else:
+                signature_version = 1
+
+        else:
+            # Create signature payload
+            signature_payload = self.generate_signature_payload(call=call, era=era, nonce=nonce, tip=tip)
+
+            # Set Signature version to sr25519
+            signature_version = 1
+
+            # Sign payload
+            signature = keypair.sign(signature_payload)
+
+        # Create extrinsic
+        extrinsic = ScaleDecoder.get_decoder_class('Extrinsic', metadata=self.metadata_decoder)
+
+        extrinsic.encode({
+            'account_id': keypair.public_key,
+            'signature_version': signature_version,
+            'signature': signature,
+            'call_function': call.value['call_function'],
+            'call_module': call.value['call_module'],
+            'call_args': call.value['call_args'],
+            'nonce': nonce,
+            'era': era,
+            'tip': tip
+        })
+
+        # Set extrinsic hash
+        extrinsic.extrinsic_hash = extrinsic.generate_hash()
+
+        return extrinsic
+
+    def create_unsigned_extrinsic(self, call):
+        # Create extrinsic
+        extrinsic = ScaleDecoder.get_decoder_class('Extrinsic', metadata=self.metadata_decoder)
+
+        extrinsic.encode({
+            'call_function': call.value['call_function'],
+            'call_module': call.value['call_module'],
+            'call_args': call.value['call_args']
+        })
+
+        return extrinsic
+
+    def submit_extrinsic(self, extrinsic, wait_for_inclusion=False, wait_for_finalization=False):
+        """
+
+        Parameters
+        ----------
+        extrinsic: ExtrinsicsDecoder The extinsic to be send to the network
+        wait_for_inclusion: wait until extrinsic is included in a block (only works on websocket connections)
+        wait_for_finalization: wait until extrinsic is finalized (only works on websocket connections)
+
+        Returns
+        -------
+        The hash of the extrinsic submitted to the network
+
+        """
+
+        # Check requirements
+        if extrinsic.__class__.__name__ != 'ExtrinsicsDecoder':
+            raise TypeError("'extrinsic' must be of type ExtrinsicsDecoder")
+
+        def result_handler(result):
+            # Check if extrinsic is included and finalized
+            if 'params' in result and type(result['params']['result']) is dict:
+                if 'finalized' in result['params']['result'] and wait_for_finalization:
+                    return {
+                        'block_hash': result['params']['result']['finalized'],
+                        'extrinsic_hash': '0x{}'.format(extrinsic.extrinsic_hash),
+                        'finalized': True
+                    }
+                elif 'inBlock' in result['params']['result'] and wait_for_inclusion and not wait_for_finalization:
+                    return {
+                        'block_hash': result['params']['result']['inBlock'],
+                        'extrinsic_hash': '0x{}'.format(extrinsic.extrinsic_hash),
+                        'finalized': False
+                    }
+
+        if wait_for_inclusion or wait_for_finalization:
+            response = self.rpc_request(
+                "author_submitAndWatchExtrinsic",
+                [str(extrinsic.data)],
+                result_handler=result_handler
+            )
+        else:
+
+            response = self.rpc_request("author_submitExtrinsic", [str(extrinsic.data)])
+
+            if 'result' not in response:
+                raise SubstrateRequestException(response.get('error'))
+
+            response = {
+                'extrinsic_hash': response['result'],
+                'block_hash': None,
+                'finalized': None
+            }
+
+        return response
+
+    def process_metadata_typestring(self, type_string):
+        """
+        Process how given type_string is decoded with active runtime and type registry
+
+        Parameters
+        ----------
+        type_string: RUST variable type, e.g. Vec<Address>
+
+        Returns
+        -------
+
+        dict of properties for given type_string
+
+        E.g.
+
+        `{
+            "type_string": "Vec<Address>",
+            "decoder_class": "Vec",
+            "is_primitive_runtime": false,
+            "is_primitive_core": false,
+            "spec_version": 1030
+        }`
+
+        """
+        decoder_class_obj = None
+
+        type_info = {
+            "type_string": type_string,
+            "decoder_class": None,
+            "is_primitive_runtime": None,
+            "is_primitive_core": False,
+            "spec_version": self.runtime_version
+        }
+
+        if self.runtime_version not in self.type_registry_cache:
+            self.type_registry_cache[self.runtime_version] = {}
+
+        # Check if already added
+        if type_string.lower() in self.type_registry_cache[self.runtime_version]:
+            return self.type_registry_cache[self.runtime_version][type_string.lower()]['decoder_class']
+
+        # Try to get decoder class
+        decoder_class = RuntimeConfiguration().get_decoder_class(type_string)
+
+        if not decoder_class:
+
+            # Not in type registry, try get hard coded decoder classes
+            try:
+                decoder_class_obj = ScaleDecoder.get_decoder_class(type_string)
+                decoder_class = decoder_class_obj.__class__
+            except NotImplementedError as e:
+                decoder_class = None
+
+        # Process classes that contain subtypes (e.g. Option<ChangesTrieConfiguration>)
+        if decoder_class_obj and decoder_class_obj.sub_type:
+            type_info["is_primitive_runtime"] = False
+
+            # Try to split on ',' (e.g. ActiveRecovery<BlockNumber, BalanceOf, AccountId>)
+            if not re.search('[<()>]', decoder_class_obj.sub_type):
+                for element in decoder_class_obj.sub_type.split(','):
+                    if element not in ['T', 'I']:
+                        self.process_metadata_typestring(element.strip())
+
+        # Process classes that contain type_mapping (e.g. Struct and Enum)
+        if decoder_class and hasattr(decoder_class, 'type_mapping') and decoder_class.type_mapping:
+
+            if type_string[0] == '(':
+                type_info["is_primitive_runtime"] = False
+
+            for key, data_type in decoder_class.type_mapping:
+                self.process_metadata_typestring(data_type)
+
+        # Try to get superclass as actual decoding class if not root level 'ScaleType'
+        if decoder_class and len(decoder_class.__mro__) > 1 and decoder_class.__mro__[1].__name__ != 'ScaleType':
+            decoder_class = decoder_class.__mro__[1]
+
+        if decoder_class:
+            type_info['decoder_class'] = decoder_class.__name__
+
+            if type_info["is_primitive_runtime"] is None:
+                type_info["is_primitive_runtime"] = True
+
+            if type_info["is_primitive_runtime"] and type_string.lower() in ScaleDecoder.PRIMITIVES:
+                type_info["is_primitive_core"] = True
+        else:
+            type_info["is_primitive_runtime"] = None
+            type_info["is_primitive_core"] = None
+
+        self.type_registry_cache[self.runtime_version][type_string.lower()] = type_info
+
+        return decoder_class
+
+    def get_type_registry(self, block_hash=None):
+        """
+        Generates an exhaustive list of which RUST types exist in the runtime specified at given block_hash (or
+        chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        block_hash: Chaintip will be used if block_hash is omitted
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        if self.runtime_version not in self.type_registry_cache:
+
+            for module in self.metadata_decoder.metadata.modules:
+
+                # Storage backwards compt check
+                if module.storage and isinstance(module.storage, list):
+                    storage_functions = module.storage
+                elif module.storage and isinstance(getattr(module.storage, 'value'), dict):
+                    storage_functions = module.storage.items
+                else:
+                    storage_functions = []
+
+                if len(module.calls or []) > 0:
+                    for idx, call in enumerate(module.calls):
+                        for arg in call.args:
+                            self.process_metadata_typestring(arg.type)
+
+                if len(module.events or []) > 0:
+                    for event_index, event in enumerate(module.events):
+
+                        for arg_index, arg in enumerate(event.args):
+                            self.process_metadata_typestring(arg)
+
+                if len(storage_functions) > 0:
+                    for idx, storage in enumerate(storage_functions):
+
+                        # Determine type
+                        type_key1 = None
+                        type_key2 = None
+                        type_value = None
+
+                        if storage.type.get('PlainType'):
+                            type_value = storage.type.get('PlainType')
+
+                        elif storage.type.get('MapType'):
+                            type_key1 = storage.type['MapType'].get('key')
+                            type_value = storage.type['MapType'].get('value')
+
+                        elif storage.type.get('DoubleMapType'):
+                            type_key1 = storage.type['DoubleMapType'].get('key1')
+                            type_key2 = storage.type['DoubleMapType'].get('key2')
+                            type_value = storage.type['DoubleMapType'].get('value')
+
+                        self.process_metadata_typestring(type_value)
+
+                        if type_key1:
+                            self.process_metadata_typestring(type_key1)
+
+                        if type_key2:
+                            self.process_metadata_typestring(type_key2)
+
+                if len(module.constants or []) > 0:
+                    for idx, constant in enumerate(module.constants):
+
+                        # Check if types already registered in database
+                        self.process_metadata_typestring(constant.type)
+
+        return self.type_registry_cache[self.runtime_version]
+
+    def get_type_definition(self, type_string, block_hash=None):
+        """
+        Retrieves decoding specifications of given type_string
+
+        Parameters
+        ----------
+        type_string: RUST variable type, e.g. Vec<Address>
+        block_hash
+
+        Returns
+        -------
+
+        """
+        type_registry = self.get_type_registry(block_hash=block_hash)
+        return type_registry.get(type_string)
+
+    def get_metadata_modules(self, block_hash=None):
+        """
+        Retrieves a list of modules in metadata for given block_hash (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        return [{
+            'metadata_index': idx,
+            'module_id': module.get_identifier(),
+            'name': module.name,
+            'prefix': module.prefix,
+            'spec_version': self.runtime_version,
+            'count_call_functions': len(module.calls or []),
+            'count_storage_functions': len(module.calls or []),
+            'count_events': len(module.events or []),
+            'count_constants': len(module.constants or []),
+            'count_errors': len(module.errors or []),
+        } for idx, module in enumerate(self.metadata_decoder.metadata.modules)]
+
+    def get_metadata_call_functions(self, block_hash=None):
+        """
+        Retrieves a list of all call functions in metadata active for given block_hash (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        call_list = []
+
+        for call_index, (module, call) in self.metadata_decoder.call_index.items():
+            call_list.append(
+                self.serialize_module_call(
+                    module, call, self.runtime_version, call_index
+                )
+            )
+        return call_list
+
+    def get_metadata_call_function(self, module_name, call_function_name, block_hash=None):
+        """
+        Retrieves the details of a call function given module name, call function name and block_hash
+        (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        module_name
+        call_function_name
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        result = None
+
+        for call_index, (module, call) in self.metadata_decoder.call_index.items():
+            if module.name == module_name and \
+                    call.get_identifier() == call_function_name:
+                result = self.serialize_module_call(
+                    module, call, self.runtime_version, call_index
+                )
+                break
+
+        return result
+
+    def get_metadata_events(self, block_hash=None):
+        """
+        Retrieves a list of all events in metadata active for given block_hash (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+
+        self.init_runtime(block_hash=block_hash)
+
+        event_list = []
+
+        for event_index, (module, event) in self.metadata_decoder.event_index.items():
+            event_list.append(
+                self.serialize_module_event(
+                    module, event, self.runtime_version, event_index
+                )
+            )
+
+        return event_list
+
+    def get_metadata_event(self, module_name, event_name, block_hash=None):
+        """
+        Retrieves the details of an event for given module name, call function name and block_hash
+        (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        module_name
+        event_name
+        block_hash
+
+        Returns
+        -------
+
+        """
+
+        self.init_runtime(block_hash=block_hash)
+
+        for event_index, (module, event) in self.metadata_decoder.event_index.items():
+            if module.name == module_name and \
+                    event.name == event_name:
+                return self.serialize_module_event(
+                    module, event, self.runtime_version, event_index
+                )
+
+    def get_metadata_constants(self, block_hash=None):
+        """
+        Retrieves a list of all constants in metadata active at given block_hash (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+
+        self.init_runtime(block_hash=block_hash)
+
+        constant_list = []
+
+        for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+            for constant in module.constants or []:
+                constant_list.append(
+                    self.serialize_constant(
+                        constant, module, self.runtime_version
+                    )
+                )
+
+        return constant_list
+
+    def get_metadata_constant(self, module_name, constant_name, block_hash=None):
+        """
+        Retrieves the details of a constant for given module name, call function name and block_hash
+        (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        module_name
+        constant_name
+        block_hash
+
+        Returns
+        -------
+
+        """
+
+        self.init_runtime(block_hash=block_hash)
+
+        for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+
+            if module_name == module.name and module.constants:
+
+                for constant in module.constants:
+                    if constant_name == constant.name:
+                        return self.serialize_constant(
+                            constant, module, self.runtime_version
+                        )
+
+    def get_metadata_storage_functions(self, block_hash=None):
+        """
+        Retrieves a list of all storage functions in metadata active at given block_hash (or chaintip if block_hash is
+        omitted)
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        storage_list = []
+
+        for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+            if module.storage:
+                for storage in module.storage.items:
+                    storage_list.append(
+                        self.serialize_storage_item(
+                            storage_item=storage,
+                            module=module,
+                            spec_version_id=self.runtime_version
+                        )
+                    )
+
+        return storage_list
+
+    def get_metadata_storage_function(self, module_name, storage_name, block_hash=None):
+        """
+        Retrieves the details of a storage function for given module name, call function name and block_hash
+
+        Parameters
+        ----------
+        module_name
+        storage_name
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+            if module.name == module_name and module.storage:
+                for storage in module.storage.items:
+                    if storage.name == storage_name:
+                        return self.serialize_storage_item(
+                            storage_item=storage,
+                            module=module,
+                            spec_version_id=self.runtime_version
+                        )
+
+    def get_metadata_errors(self, block_hash=None):
+        """
+        Retrieves a list of all errors in metadata active at given block_hash (or chaintip if block_hash is omitted)
+
+        Parameters
+        ----------
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        error_list = []
+
+        for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+            if module.errors:
+                for error in module.errors:
+                    error_list.append(
+                        self.serialize_module_error(
+                            module=module, error=error, spec_version=self.runtime_version
+                        )
+                    )
+
+        return error_list
+
+    def get_metadata_error(self, module_name, error_name, block_hash=None):
+        """
+        Retrieves the details of an error for given module name, call function name and block_hash
+
+        Parameters
+        ----------
+        module_name
+        error_name
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+            if module.name == module_name and module.errors:
+                for error in module.errors:
+                    if error_name == error.name:
+                        return self.serialize_module_error(
+                            module=module, error=error, spec_version=self.runtime_version
+                        )
+
+    def get_runtime_block(self, block_hash=None, block_id=None):
+        """
+        Retrieves a block with method `chain_getBlock` and in addition decodes extrinsics and log items
+
+        Parameters
+        ----------
+        block_hash
+        block_id
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash, block_id=block_id)
+
+        response = self.rpc_request("chain_getBlock", [self.block_hash]).get('result')
+
+        response['block']['header']['number'] = int(response['block']['header']['number'], 16)
+
+        for idx, extrinsic_data in enumerate(response['block']['extrinsics']):
+            extrinsic_decoder = ExtrinsicsDecoder(
+                data=ScaleBytes(extrinsic_data),
+                metadata=self.metadata_decoder
+            )
+            extrinsic_decoder.decode()
+            response['block']['extrinsics'][idx] = extrinsic_decoder.value
+
+        for idx, log_data in enumerate(response['block']['header']["digest"]["logs"]):
+            log_digest = LogDigest(ScaleBytes(log_data))
+            log_digest.decode()
+            response['block']['header']["digest"]["logs"][idx] = log_digest.value
+
+        return response
+
+    def decode_scale(self, type_string, scale_bytes, block_hash=None):
+        """
+        Helper function to decode arbitrary SCALE-bytes (e.g. 0x02000000) according to given RUST type_string
+        (e.g. BlockNumber). The relevant versioning information of the type (if defined) will be applied if block_hash
+        is set
+
+        Parameters
+        ----------
+        type_string
+        scale_bytes
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        obj = ScaleDecoder.get_decoder_class(type_string, ScaleBytes(scale_bytes), metadata=self.metadata_decoder)
+        return obj.decode()
+
+    def encode_scale(self, type_string, value, block_hash=None):
+        """
+        Helper function to encode arbitrary data into SCALE-bytes for given RUST type_string
+
+        Parameters
+        ----------
+        type_string
+        value
+        block_hash
+
+        Returns
+        -------
+
+        """
+        self.init_runtime(block_hash=block_hash)
+
+        obj = ScaleDecoder.get_decoder_class(type_string)
+        return str(obj.encode(value))
+
+    # Serializing helper function
+
+    def serialize_storage_item(self, storage_item, module, spec_version_id):
+        """
+        Helper function to serialize a storage item
+
+        Parameters
+        ----------
+        storage_item
+        module
+        spec_version_id
+
+        Returns
+        -------
+
+        """
+        storage_dict = {
+            "storage_name": storage_item.name,
+            "storage_modifier": storage_item.modifier,
+            "storage_fallback_scale": storage_item.fallback,
+            "storage_fallback": None,
+            "documentation": '\n'.join(storage_item.docs),
+            "module_id": module.get_identifier(),
+            "module_prefix": module.prefix,
+            "module_name": module.name,
+            "spec_version": spec_version_id,
+            "type_key1": None,
+            "type_key2": None,
+            "type_hasher_key1": None,
+            "type_hasher_key2": None,
+            "type_value": None,
+            "type_is_linked": None
+        }
+
+        type_class, type_info = next(iter(storage_item.type.items()))
+
+        storage_dict["type_class"] = type_class
+
+        if type_class == 'PlainType':
+            storage_dict["type_value"] = type_info
+
+        elif type_class == 'MapType':
+            storage_dict["type_value"] = type_info["value"]
+            storage_dict["type_key1"] = type_info["key"]
+            storage_dict["type_hasher_key1"] = type_info["hasher"]
+            storage_dict["type_is_linked"] = type_info["isLinked"]
+
+        elif type_class == 'DoubleMapType':
+
+            storage_dict["type_value"] = type_info["value"]
+            storage_dict["type_key1"] = type_info["key1"]
+            storage_dict["type_key2"] = type_info["key2"]
+            storage_dict["type_hasher_key1"] = type_info["hasher"]
+            storage_dict["type_hasher_key1"] = type_info["key2Hasher"]
+
+        if storage_item.fallback != '0x00':
+            # Decode fallback
+            try:
+                fallback_obj = ScaleDecoder.get_decoder_class(storage_dict["type_value"],
+                                                              ScaleBytes(storage_item.fallback))
+                storage_dict["storage_fallback"] = fallback_obj.decode()
+            except Exception:
+                storage_dict["storage_fallback"] = '[decoding error]'
+
+        return storage_dict
+
+    def serialize_constant(self, constant, module, spec_version_id):
+        """
+        Helper function to serialize a constant
+
+        Parameters
+        ----------
+        constant
+        module
+        spec_version_id
+
+        Returns
+        -------
+
+        """
+        try:
+            value_obj = ScaleDecoder.get_decoder_class(constant.type,
+                                                       ScaleBytes(constant.constant_value))
+            constant_decoded_value = value_obj.decode()
+        except Exception:
+            constant_decoded_value = '[decoding error]'
+
+        return {
+            "constant_name": constant.name,
+            "constant_type": constant.type,
+            "constant_value": constant_decoded_value,
+            "constant_value_scale": constant.constant_value,
+            "documentation": '\n'.join(constant.docs),
+            "module_id": module.get_identifier(),
+            "module_prefix": module.prefix,
+            "module_name": module.name,
+            "spec_version": spec_version_id
+        }
+
+    def serialize_module_call(self, module, call, spec_version, call_index):
+        """
+        Helper function to serialize a call function
+
+        Parameters
+        ----------
+        module
+        call
+        spec_version
+        call_index
+
+        Returns
+        -------
+
+        """
+        return {
+            "call_id": call.get_identifier(),
+            "call_name": call.name,
+            "call_args": [call_arg.value for call_arg in call.args],
+            "lookup": '0x{}'.format(call_index),
+            "documentation": '\n'.join(call.docs),
+            "module_id": module.get_identifier(),
+            "module_prefix": module.prefix,
+            "module_name": module.name,
+            "spec_version": spec_version
+        }
+
+    def serialize_module_event(self, module, event, spec_version, event_index):
+        """
+        Helper function to serialize an event
+
+        Parameters
+        ----------
+        module
+        event
+        spec_version
+        event_index
+
+        Returns
+        -------
+
+        """
+        return {
+            "event_id": event.name,
+            "event_name": event.name,
+            "event_args": [
+                  {
+                    "event_arg_index": idx,
+                    "type": arg
+                  } for idx, arg in enumerate(event.args)
+                ],
+            "lookup": '0x{}'.format(event_index),
+            "documentation": '\n'.join(event.docs),
+            "module_id": module.get_identifier(),
+            "module_prefix": module.prefix,
+            "module_name": module.name,
+            "spec_version": spec_version
+        }
+
+    def serialize_module_error(self, module, error, spec_version):
+        """
+        Helper function to serialize an error
+
+        Parameters
+        ----------
+        module
+        error
+        spec_version
+
+        Returns
+        -------
+
+        """
+        return {
+            "error_name": error.name,
+            "documentation": '\n'.join(error.docs),
+            "module_id": module.get_identifier(),
+            "module_prefix": module.prefix,
+            "module_name": module.name,
+            "spec_version": spec_version
+        }
+
+

Methods

+
+
+def compose_call(self, call_module, call_function, call_params=(), block_hash=None) +
+
+

Composes a call payload which can be used as an unsigned extrinsic or a proposal.

+

Parameters

+
+
call_module : Name of the runtime module e.g. Balances
+
 
+
call_function : Name of the call function e.g. transfer
+
 
+
call_params : This is a dict containing the params of the call. e.g. {'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', 'value': 1000000000000}``
+
 
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def compose_call(self, call_module, call_function, call_params=(), block_hash=None):
+    """
+    Composes a call payload which can be used as an unsigned extrinsic or a proposal.
+
+    Parameters
+    ----------
+    call_module: Name of the runtime module e.g. Balances
+    call_function: Name of the call function e.g. transfer
+    call_params: This is a dict containing the params of the call. e.g. `{'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', 'value': 1000000000000}`
+    block_hash
+
+    Returns
+    -------
+
+    """
+    self.init_runtime(block_hash=block_hash)
+
+    call = ScaleDecoder.get_decoder_class('Call', metadata=self.metadata_decoder)
+
+    call.encode({
+        'call_module': call_module,
+        'call_function': call_function,
+        'call_args': call_params
+    })
+
+    return call
+
+
+
+def convert_storage_parameter(self, scale_type, value) +
+
+
+
+ +Expand source code + +
def convert_storage_parameter(self, scale_type, value):
+    if scale_type == 'AccountId':
+        if value[0:2] != '0x':
+            return '0x{}'.format(ss58_decode(value, self.address_type))
+
+    return value
+
+
+
+def create_signed_extrinsic(self, call, keypair: Keypair, era=None, nonce=None, tip=0, signature=None) +
+
+

Creates a extrinsic signed by given account details

+

Parameters

+
+
signature
+
 
+
era
+
 
+
keypair
+
 
+
call
+
 
+
nonce
+
 
+
tip
+
 
+
+

Returns

+
+
ExtrinsicsDecoder The signed Extrinsic
+
 
+
+
+ +Expand source code + +
def create_signed_extrinsic(self, call, keypair: Keypair, era=None, nonce=None, tip=0, signature=None):
+    """
+    Creates a extrinsic signed by given account details
+
+    Parameters
+    ----------
+    signature
+    era
+    keypair
+    call
+    nonce
+    tip
+
+    Returns
+    -------
+    ExtrinsicsDecoder The signed Extrinsic
+    """
+
+    # Check requirements
+    if not isinstance(call, GenericCall):
+        raise TypeError("'call' must be of type Call")
+
+    # Retrieve nonce
+    if not nonce:
+        nonce = self.get_account_nonce(keypair.public_key) or 0
+
+    if era:
+        if era != '00':
+            # TODO implement MortalEra transactions
+            raise NotImplementedError("Mortal transactions not yet implemented")
+    else:
+        era = '00'
+
+    if signature:
+
+        signature = signature.replace('0x', '')
+
+        # Check if signature is a MultiSignature and contains signature version
+        if len(signature) == 130:
+            signature_version = int(signature[0:2], 16)
+            signature = '0x{}'.format(signature[2:])
+        else:
+            signature_version = 1
+
+    else:
+        # Create signature payload
+        signature_payload = self.generate_signature_payload(call=call, era=era, nonce=nonce, tip=tip)
+
+        # Set Signature version to sr25519
+        signature_version = 1
+
+        # Sign payload
+        signature = keypair.sign(signature_payload)
+
+    # Create extrinsic
+    extrinsic = ScaleDecoder.get_decoder_class('Extrinsic', metadata=self.metadata_decoder)
+
+    extrinsic.encode({
+        'account_id': keypair.public_key,
+        'signature_version': signature_version,
+        'signature': signature,
+        'call_function': call.value['call_function'],
+        'call_module': call.value['call_module'],
+        'call_args': call.value['call_args'],
+        'nonce': nonce,
+        'era': era,
+        'tip': tip
+    })
+
+    # Set extrinsic hash
+    extrinsic.extrinsic_hash = extrinsic.generate_hash()
+
+    return extrinsic
+
+
+
+def create_unsigned_extrinsic(self, call) +
+
+
+
+ +Expand source code + +
def create_unsigned_extrinsic(self, call):
+    # Create extrinsic
+    extrinsic = ScaleDecoder.get_decoder_class('Extrinsic', metadata=self.metadata_decoder)
+
+    extrinsic.encode({
+        'call_function': call.value['call_function'],
+        'call_module': call.value['call_module'],
+        'call_args': call.value['call_args']
+    })
+
+    return extrinsic
+
+
+
+def debug_message(self, message) +
+
+
+
+ +Expand source code + +
def debug_message(self, message):
+    logger.debug(message)
+
+
+
+def decode_scale(self, type_string, scale_bytes, block_hash=None) +
+
+

Helper function to decode arbitrary SCALE-bytes (e.g. 0x02000000) according to given RUST type_string +(e.g. BlockNumber). The relevant versioning information of the type (if defined) will be applied if block_hash +is set

+

Parameters

+
+
type_string
+
 
+
scale_bytes
+
 
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def decode_scale(self, type_string, scale_bytes, block_hash=None):
+    """
+    Helper function to decode arbitrary SCALE-bytes (e.g. 0x02000000) according to given RUST type_string
+    (e.g. BlockNumber). The relevant versioning information of the type (if defined) will be applied if block_hash
+    is set
+
+    Parameters
+    ----------
+    type_string
+    scale_bytes
+    block_hash
+
+    Returns
+    -------
+
+    """
+    self.init_runtime(block_hash=block_hash)
+
+    obj = ScaleDecoder.get_decoder_class(type_string, ScaleBytes(scale_bytes), metadata=self.metadata_decoder)
+    return obj.decode()
+
+
+
+def encode_scale(self, type_string, value, block_hash=None) +
+
+

Helper function to encode arbitrary data into SCALE-bytes for given RUST type_string

+

Parameters

+
+
type_string
+
 
+
value
+
 
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def encode_scale(self, type_string, value, block_hash=None):
+    """
+    Helper function to encode arbitrary data into SCALE-bytes for given RUST type_string
+
+    Parameters
+    ----------
+    type_string
+    value
+    block_hash
+
+    Returns
+    -------
+
+    """
+    self.init_runtime(block_hash=block_hash)
+
+    obj = ScaleDecoder.get_decoder_class(type_string)
+    return str(obj.encode(value))
+
+
+
+def generate_signature_payload(self, call, era=None, nonce=0, tip=0, include_call_length=False) +
+
+
+
+ +Expand source code + +
def generate_signature_payload(self, call, era=None, nonce=0, tip=0, include_call_length=False):
+
+    # Retrieve genesis hash
+    genesis_hash = self.get_block_hash(0)
+
+    if era:
+        if era != '00':
+            # TODO implement MortalEra transactions
+            raise NotImplementedError("Mortal transactions not yet implemented")
+    else:
+        era = '00'
+
+    # Create signature payload
+    signature_payload = ScaleDecoder.get_decoder_class('ExtrinsicPayloadValue')
+
+    if include_call_length:
+
+        length_obj = RuntimeConfiguration().get_decoder_class('Bytes')
+        call_data = str(length_obj().encode(str(call.data)))
+
+    else:
+        call_data = str(call.data)
+
+    payload_dict = {
+        'call': call_data,
+        'era': era,
+        'nonce': nonce,
+        'tip': tip,
+        'specVersion': self.runtime_version,
+        'genesisHash': genesis_hash,
+        'blockHash': genesis_hash
+    }
+
+    if self.transaction_version is not None:
+        payload_dict['transactionVersion'] = self.transaction_version
+
+    signature_payload.encode(payload_dict)
+
+    return signature_payload.data
+
+
+
+def generate_storage_hash(self, storage_module, storage_function, params=None, hasher=None, key2_hasher=None, metadata_version=None) +
+
+

Generate a storage key for given module/function

+

Parameters

+
+
storage_module
+
 
+
storage_function
+
 
+
params : Parameters of the storage function, provided in scale encoded hex-bytes
+
 
+
hasher : Hashing method used to determine storage key, defaults to 'Twox64Concat' if not provided
+
 
+
metadata_version : Version index of Metadata, e.g. 9 for MetadataV9
+
 
+
+

Returns

+
+ +Expand source code + +
def generate_storage_hash(self, storage_module, storage_function, params=None, hasher=None, key2_hasher=None, metadata_version=None):
+    """
+    Generate a storage key for given module/function
+
+    Parameters
+    ----------
+    storage_module
+    storage_function
+    params: Parameters of the storage function, provided in scale encoded hex-bytes
+    hasher: Hashing method used to determine storage key, defaults to 'Twox64Concat' if not provided
+    metadata_version: Version index of Metadata, e.g. 9 for MetadataV9
+
+    Returns
+    -------
+
+    """
+
+    if not metadata_version or metadata_version >= 9:
+        storage_hash = xxh128(storage_module.encode()) + xxh128(storage_function.encode())
+
+        if params:
+
+            if type(params) is not list:
+                params = [params]
+
+            for idx, param in enumerate(params):
+                if idx == 0:
+                    param_hasher = hasher
+                elif idx == 1:
+                    param_hasher = key2_hasher
+                else:
+                    raise ValueError('Unexpected third parameter for storage call')
+
+                params_key = bytes()
+
+                if type(param) is str:
+                    params_key += binascii.unhexlify(param)
+                elif type(param) is ScaleBytes:
+                    params_key += param.data
+                elif isinstance(param, ScaleDecoder):
+                    params_key += param.data.data
+
+                if not param_hasher:
+                    param_hasher = 'Twox128'
+
+                if param_hasher == 'Blake2_256':
+                    storage_hash += blake2_256(params_key)
+
+                elif param_hasher == 'Blake2_128':
+                    storage_hash += blake2_128(params_key)
+
+                elif param_hasher == 'Blake2_128Concat':
+                    storage_hash += blake2_128_concat(params_key)
+
+                elif param_hasher == 'Twox128':
+                    storage_hash += xxh128(params_key)
+
+                elif param_hasher == 'Twox64Concat':
+                    storage_hash += two_x64_concat(params_key)
+
+                elif param_hasher == 'Identity':
+                    storage_hash += identity(params_key)
+
+                else:
+                    raise ValueError('Unknown storage hasher "{}"'.format(param_hasher))
+
+        return '0x{}'.format(storage_hash)
+
+    else:
+        storage_hash = storage_module.encode() + b" " + storage_function.encode()
+
+        if params:
+            storage_hash += binascii.unhexlify(params)
+
+        # Determine hasher function
+        if not hasher:
+            hasher = 'Twox128'
+
+        if hasher == 'Blake2_256':
+            return "0x{}".format(blake2_256(storage_hash))
+
+        elif hasher == 'Twox128':
+            return "0x{}".format(xxh128(storage_hash))
+
+        elif hasher == 'Twox64Concat':
+            return "0x{}".format(two_x64_concat(storage_hash))
+
+
+
+def get_account_nonce(self, account_address) +
+
+
+
+ +Expand source code + +
def get_account_nonce(self, account_address):
+    response = self.get_runtime_state('System', 'Account', [account_address])
+    if response.get('result'):
+        return response['result'].get('nonce', 0)
+
+
+
+def get_block_events(self, block_hash, metadata_decoder=None) +
+
+

A convenience method to fetch the undecoded events from storage

+

Parameters

+
+
block_hash
+
 
+
metadata_decoder
+
 
+
+

Returns

+
+ +Expand source code + +
def get_block_events(self, block_hash, metadata_decoder=None):
+    """
+    A convenience method to fetch the undecoded events from storage
+
+    Parameters
+    ----------
+    block_hash
+    metadata_decoder
+
+    Returns
+    -------
+
+    """
+
+    if metadata_decoder and metadata_decoder.version.index >= 9:
+        storage_hash = STORAGE_HASH_SYSTEM_EVENTS_V9
+    else:
+        storage_hash = STORAGE_HASH_SYSTEM_EVENTS
+
+    response = self.rpc_request("state_getStorageAt", [storage_hash, block_hash])
+
+    if response.get('result'):
+
+        if metadata_decoder:
+            # Process events
+            events_decoder = EventsDecoder(
+                data=ScaleBytes(response.get('result')),
+                metadata=metadata_decoder
+            )
+            events_decoder.decode()
+
+            return events_decoder
+
+        else:
+            return response
+    else:
+        raise SubstrateRequestException("Error occurred during retrieval of events")
+
+
+
+def get_block_hash(self, block_id) +
+
+

A pass-though to existing JSONRPC method chain_getBlockHash

+

Parameters

+
+
block_id
+
 
+
+

Returns

+
+ +Expand source code + +
def get_block_hash(self, block_id):
+    """
+    A pass-though to existing JSONRPC method `chain_getBlockHash`
+
+    Parameters
+    ----------
+    block_id
+
+    Returns
+    -------
+
+    """
+    return self.rpc_request("chain_getBlockHash", [block_id]).get('result')
+
+
+
+def get_block_header(self, block_hash) +
+
+

A pass-though to existing JSONRPC method chain_getHeader

+

Parameters

+
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_block_header(self, block_hash):
+    """
+    A pass-though to existing JSONRPC method `chain_getHeader`
+
+    Parameters
+    ----------
+    block_hash
+
+    Returns
+    -------
+
+    """
+    response = self.rpc_request("chain_getHeader", [block_hash])
+    return response.get('result')
+
+
+
+def get_block_metadata(self, block_hash=None, decode=True) +
+
+

A pass-though to existing JSONRPC method state_getMetadata. For a decoded version see get_runtime_metadata()

+

Parameters

+
+
block_hash
+
 
+
decode : DEPRECATED use get_runtime_metadata() for decoded version
+
 
+
+

Returns

+
+ +Expand source code + +
def get_block_metadata(self, block_hash=None, decode=True):
+    """
+    A pass-though to existing JSONRPC method `state_getMetadata`. For a decoded version see `get_runtime_metadata()`
+
+    Parameters
+    ----------
+    block_hash
+    decode: DEPRECATED use `get_runtime_metadata()` for decoded version
+
+    Returns
+    -------
+
+    """
+    params = None
+    if block_hash:
+        params = [block_hash]
+    response = self.rpc_request("state_getMetadata", params)
+
+    if decode:
+        metadata_decoder = MetadataDecoder(ScaleBytes(response.get('result')))
+        metadata_decoder.decode()
+
+        return metadata_decoder
+
+    return response
+
+
+
+def get_block_number(self, block_hash) +
+
+

A convenience method to get the block number for given block_hash

+

Parameters

+
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_block_number(self, block_hash):
+    """
+    A convenience method to get the block number for given block_hash
+
+    Parameters
+    ----------
+    block_hash
+
+    Returns
+    -------
+
+    """
+    response = self.rpc_request("chain_getHeader", [block_hash])
+    return int(response['result']['number'], 16)
+
+
+
+def get_block_runtime_version(self, block_hash) +
+
+

Retrieve the runtime version id of given block_hash +Parameters

+
+
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_block_runtime_version(self, block_hash):
+    """
+    Retrieve the runtime version id of given block_hash
+    Parameters
+    ----------
+    block_hash
+
+    Returns
+    -------
+
+    """
+    response = self.rpc_request("chain_getRuntimeVersion", [block_hash])
+    return response.get('result')
+
+
+
+def get_chain_block(self, block_hash=None, block_id=None, metadata_decoder=None) +
+
+

A pass-though to existing JSONRPC method chain_getBlock. For a decoded version see get_runtime_block()

+

Parameters

+
+
block_hash
+
 
+
block_id
+
 
+
metadata_decoder
+
 
+
+

Returns

+
+ +Expand source code + +
def get_chain_block(self, block_hash=None, block_id=None, metadata_decoder=None):
+    """
+    A pass-though to existing JSONRPC method `chain_getBlock`. For a decoded version see `get_runtime_block()`
+
+    Parameters
+    ----------
+    block_hash
+    block_id
+    metadata_decoder
+
+    Returns
+    -------
+
+    """
+
+    if block_id:
+        block_hash = self.get_block_hash(block_id)
+
+    response = self.rpc_request("chain_getBlock", [block_hash]).get('result')
+
+    if self.mock_extrinsics:
+        # Extend extrinsics with mock_extrinsics for e.g. performance tests
+        response['block']['extrinsics'].extend(self.mock_extrinsics)
+
+    # Decode extrinsics
+    if metadata_decoder:
+
+        response['block']['header']['number'] = int(response['block']['header']['number'], 16)
+
+        for idx, extrinsic_data in enumerate(response['block']['extrinsics']):
+            extrinsic_decoder = ExtrinsicsDecoder(
+                data=ScaleBytes(extrinsic_data),
+                metadata=metadata_decoder
+            )
+            extrinsic_decoder.decode()
+            response['block']['extrinsics'][idx] = extrinsic_decoder.value
+
+        for idx, log_data in enumerate(response['block']['header']["digest"]["logs"]):
+            log_digest = LogDigest(ScaleBytes(log_data))
+            log_digest.decode()
+            response['block']['header']["digest"]["logs"][idx] = log_digest.value
+
+    return response
+
+
+
+def get_chain_finalised_head(self) +
+
+

A pass-though to existing JSONRPC method chain_getFinalisedHead

+

Returns

+
+ +Expand source code + +
def get_chain_finalised_head(self):
+    """
+    A pass-though to existing JSONRPC method `chain_getFinalisedHead`
+
+    Returns
+    -------
+
+    """
+    response = self.rpc_request("chain_getFinalisedHead", [])
+    return response.get('result')
+
+
+
+def get_chain_head(self) +
+
+

A pass-though to existing JSONRPC method chain_getHead

+

Returns

+
+ +Expand source code + +
def get_chain_head(self):
+    """
+    A pass-though to existing JSONRPC method `chain_getHead`
+
+    Returns
+    -------
+
+    """
+    response = self.rpc_request("chain_getHead", [])
+    return response.get('result')
+
+
+
+def get_metadata_call_function(self, module_name, call_function_name, block_hash=None) +
+
+

Retrieves the details of a call function given module name, call function name and block_hash +(or chaintip if block_hash is omitted)

+

Parameters

+
+
module_name
+
 
+
call_function_name
+
 
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_metadata_call_function(self, module_name, call_function_name, block_hash=None):
+    """
+    Retrieves the details of a call function given module name, call function name and block_hash
+    (or chaintip if block_hash is omitted)
+
+    Parameters
+    ----------
+    module_name
+    call_function_name
+    block_hash
+
+    Returns
+    -------
+
+    """
+    self.init_runtime(block_hash=block_hash)
+
+    result = None
+
+    for call_index, (module, call) in self.metadata_decoder.call_index.items():
+        if module.name == module_name and \
+                call.get_identifier() == call_function_name:
+            result = self.serialize_module_call(
+                module, call, self.runtime_version, call_index
+            )
+            break
+
+    return result
+
+
+
+def get_metadata_call_functions(self, block_hash=None) +
+
+

Retrieves a list of all call functions in metadata active for given block_hash (or chaintip if block_hash is omitted)

+

Parameters

+
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_metadata_call_functions(self, block_hash=None):
+    """
+    Retrieves a list of all call functions in metadata active for given block_hash (or chaintip if block_hash is omitted)
+
+    Parameters
+    ----------
+    block_hash
+
+    Returns
+    -------
+
+    """
+    self.init_runtime(block_hash=block_hash)
+
+    call_list = []
+
+    for call_index, (module, call) in self.metadata_decoder.call_index.items():
+        call_list.append(
+            self.serialize_module_call(
+                module, call, self.runtime_version, call_index
+            )
+        )
+    return call_list
+
+
+
+def get_metadata_constant(self, module_name, constant_name, block_hash=None) +
+
+

Retrieves the details of a constant for given module name, call function name and block_hash +(or chaintip if block_hash is omitted)

+

Parameters

+
+
module_name
+
 
+
constant_name
+
 
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_metadata_constant(self, module_name, constant_name, block_hash=None):
+    """
+    Retrieves the details of a constant for given module name, call function name and block_hash
+    (or chaintip if block_hash is omitted)
+
+    Parameters
+    ----------
+    module_name
+    constant_name
+    block_hash
+
+    Returns
+    -------
+
+    """
+
+    self.init_runtime(block_hash=block_hash)
+
+    for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+
+        if module_name == module.name and module.constants:
+
+            for constant in module.constants:
+                if constant_name == constant.name:
+                    return self.serialize_constant(
+                        constant, module, self.runtime_version
+                    )
+
+
+
+def get_metadata_constants(self, block_hash=None) +
+
+

Retrieves a list of all constants in metadata active at given block_hash (or chaintip if block_hash is omitted)

+

Parameters

+
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_metadata_constants(self, block_hash=None):
+    """
+    Retrieves a list of all constants in metadata active at given block_hash (or chaintip if block_hash is omitted)
+
+    Parameters
+    ----------
+    block_hash
+
+    Returns
+    -------
+
+    """
+
+    self.init_runtime(block_hash=block_hash)
+
+    constant_list = []
+
+    for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+        for constant in module.constants or []:
+            constant_list.append(
+                self.serialize_constant(
+                    constant, module, self.runtime_version
+                )
+            )
+
+    return constant_list
+
+
+
+def get_metadata_error(self, module_name, error_name, block_hash=None) +
+
+

Retrieves the details of an error for given module name, call function name and block_hash

+

Parameters

+
+
module_name
+
 
+
error_name
+
 
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_metadata_error(self, module_name, error_name, block_hash=None):
+    """
+    Retrieves the details of an error for given module name, call function name and block_hash
+
+    Parameters
+    ----------
+    module_name
+    error_name
+    block_hash
+
+    Returns
+    -------
+
+    """
+    self.init_runtime(block_hash=block_hash)
+
+    for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+        if module.name == module_name and module.errors:
+            for error in module.errors:
+                if error_name == error.name:
+                    return self.serialize_module_error(
+                        module=module, error=error, spec_version=self.runtime_version
+                    )
+
+
+
+def get_metadata_errors(self, block_hash=None) +
+
+

Retrieves a list of all errors in metadata active at given block_hash (or chaintip if block_hash is omitted)

+

Parameters

+
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_metadata_errors(self, block_hash=None):
+    """
+    Retrieves a list of all errors in metadata active at given block_hash (or chaintip if block_hash is omitted)
+
+    Parameters
+    ----------
+    block_hash
+
+    Returns
+    -------
+
+    """
+    self.init_runtime(block_hash=block_hash)
+
+    error_list = []
+
+    for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+        if module.errors:
+            for error in module.errors:
+                error_list.append(
+                    self.serialize_module_error(
+                        module=module, error=error, spec_version=self.runtime_version
+                    )
+                )
+
+    return error_list
+
+
+
+def get_metadata_event(self, module_name, event_name, block_hash=None) +
+
+

Retrieves the details of an event for given module name, call function name and block_hash +(or chaintip if block_hash is omitted)

+

Parameters

+
+
module_name
+
 
+
event_name
+
 
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_metadata_event(self, module_name, event_name, block_hash=None):
+    """
+    Retrieves the details of an event for given module name, call function name and block_hash
+    (or chaintip if block_hash is omitted)
+
+    Parameters
+    ----------
+    module_name
+    event_name
+    block_hash
+
+    Returns
+    -------
+
+    """
+
+    self.init_runtime(block_hash=block_hash)
+
+    for event_index, (module, event) in self.metadata_decoder.event_index.items():
+        if module.name == module_name and \
+                event.name == event_name:
+            return self.serialize_module_event(
+                module, event, self.runtime_version, event_index
+            )
+
+
+
+def get_metadata_events(self, block_hash=None) +
+
+

Retrieves a list of all events in metadata active for given block_hash (or chaintip if block_hash is omitted)

+

Parameters

+
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_metadata_events(self, block_hash=None):
+    """
+    Retrieves a list of all events in metadata active for given block_hash (or chaintip if block_hash is omitted)
+
+    Parameters
+    ----------
+    block_hash
+
+    Returns
+    -------
+
+    """
+
+    self.init_runtime(block_hash=block_hash)
+
+    event_list = []
+
+    for event_index, (module, event) in self.metadata_decoder.event_index.items():
+        event_list.append(
+            self.serialize_module_event(
+                module, event, self.runtime_version, event_index
+            )
+        )
+
+    return event_list
+
+
+
+def get_metadata_modules(self, block_hash=None) +
+
+

Retrieves a list of modules in metadata for given block_hash (or chaintip if block_hash is omitted)

+

Parameters

+
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_metadata_modules(self, block_hash=None):
+    """
+    Retrieves a list of modules in metadata for given block_hash (or chaintip if block_hash is omitted)
+
+    Parameters
+    ----------
+    block_hash
+
+    Returns
+    -------
+
+    """
+    self.init_runtime(block_hash=block_hash)
+
+    return [{
+        'metadata_index': idx,
+        'module_id': module.get_identifier(),
+        'name': module.name,
+        'prefix': module.prefix,
+        'spec_version': self.runtime_version,
+        'count_call_functions': len(module.calls or []),
+        'count_storage_functions': len(module.calls or []),
+        'count_events': len(module.events or []),
+        'count_constants': len(module.constants or []),
+        'count_errors': len(module.errors or []),
+    } for idx, module in enumerate(self.metadata_decoder.metadata.modules)]
+
+
+
+def get_metadata_storage_function(self, module_name, storage_name, block_hash=None) +
+
+

Retrieves the details of a storage function for given module name, call function name and block_hash

+

Parameters

+
+
module_name
+
 
+
storage_name
+
 
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_metadata_storage_function(self, module_name, storage_name, block_hash=None):
+    """
+    Retrieves the details of a storage function for given module name, call function name and block_hash
+
+    Parameters
+    ----------
+    module_name
+    storage_name
+    block_hash
+
+    Returns
+    -------
+
+    """
+    self.init_runtime(block_hash=block_hash)
+
+    for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+        if module.name == module_name and module.storage:
+            for storage in module.storage.items:
+                if storage.name == storage_name:
+                    return self.serialize_storage_item(
+                        storage_item=storage,
+                        module=module,
+                        spec_version_id=self.runtime_version
+                    )
+
+
+
+def get_metadata_storage_functions(self, block_hash=None) +
+
+

Retrieves a list of all storage functions in metadata active at given block_hash (or chaintip if block_hash is +omitted)

+

Parameters

+
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_metadata_storage_functions(self, block_hash=None):
+    """
+    Retrieves a list of all storage functions in metadata active at given block_hash (or chaintip if block_hash is
+    omitted)
+
+    Parameters
+    ----------
+    block_hash
+
+    Returns
+    -------
+
+    """
+    self.init_runtime(block_hash=block_hash)
+
+    storage_list = []
+
+    for module_idx, module in enumerate(self.metadata_decoder.metadata.modules):
+        if module.storage:
+            for storage in module.storage.items:
+                storage_list.append(
+                    self.serialize_storage_item(
+                        storage_item=storage,
+                        module=module,
+                        spec_version_id=self.runtime_version
+                    )
+                )
+
+    return storage_list
+
+
+
+def get_runtime_block(self, block_hash=None, block_id=None) +
+
+

Retrieves a block with method chain_getBlock and in addition decodes extrinsics and log items

+

Parameters

+
+
block_hash
+
 
+
block_id
+
 
+
+

Returns

+
+ +Expand source code + +
def get_runtime_block(self, block_hash=None, block_id=None):
+    """
+    Retrieves a block with method `chain_getBlock` and in addition decodes extrinsics and log items
+
+    Parameters
+    ----------
+    block_hash
+    block_id
+
+    Returns
+    -------
+
+    """
+    self.init_runtime(block_hash=block_hash, block_id=block_id)
+
+    response = self.rpc_request("chain_getBlock", [self.block_hash]).get('result')
+
+    response['block']['header']['number'] = int(response['block']['header']['number'], 16)
+
+    for idx, extrinsic_data in enumerate(response['block']['extrinsics']):
+        extrinsic_decoder = ExtrinsicsDecoder(
+            data=ScaleBytes(extrinsic_data),
+            metadata=self.metadata_decoder
+        )
+        extrinsic_decoder.decode()
+        response['block']['extrinsics'][idx] = extrinsic_decoder.value
+
+    for idx, log_data in enumerate(response['block']['header']["digest"]["logs"]):
+        log_digest = LogDigest(ScaleBytes(log_data))
+        log_digest.decode()
+        response['block']['header']["digest"]["logs"][idx] = log_digest.value
+
+    return response
+
+
+
+def get_runtime_events(self, block_hash=None) +
+
+

Convenience method to get events for a certain block (storage call for module 'System' and function 'Events')

+

Parameters

+
+
block_hash
+
 
+
+

Returns

+
+
Collection of events
+
 
+
+
+ +Expand source code + +
def get_runtime_events(self, block_hash=None):
+    """
+    Convenience method to get events for a certain block (storage call for module 'System' and function 'Events')
+
+    Parameters
+    ----------
+    block_hash
+
+    Returns
+    -------
+    Collection of events
+    """
+    return self.get_runtime_state(
+        module="System",
+        storage_function="Events",
+        block_hash=block_hash
+    )
+
+
+
+def get_runtime_metadata(self, block_hash=None) +
+
+

Retrieves and decodes the metadata for given block or chaintip if block_hash is omitted.

+

Parameters

+
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_runtime_metadata(self, block_hash=None):
+    """
+    Retrieves and decodes the metadata for given block or chaintip if block_hash is omitted.
+
+    Parameters
+    ----------
+    block_hash
+
+    Returns
+    -------
+
+    """
+    params = None
+    if block_hash:
+        params = [block_hash]
+    response = self.rpc_request("state_getMetadata", params)
+
+    if 'result' in response:
+        metadata_decoder = MetadataDecoder(ScaleBytes(response.get('result')))
+        response['result'] = metadata_decoder.decode()
+
+    return response
+
+
+
+def get_runtime_state(self, module, storage_function, params=None, block_hash=None) +
+
+

Retrieves the storage entry for given module, function and optional parameters at given block hash

+

Parameters

+
+
module : The module name in the metadata, e.g. Balances or Account
+
 
+
storage_function : The storage function name, e.g. FreeBalance or AccountNonce
+
 
+
params : list of params, in the decoded format of the applicable ScaleTypes
+
 
+
block_hash : Optional block hash, when left to None the chain tip will be used
+
 
+
+

Returns

+
+ +Expand source code + +
def get_runtime_state(self, module, storage_function, params=None, block_hash=None):
+    """
+    Retrieves the storage entry for given module, function and optional parameters at given block hash
+
+    Parameters
+    ----------
+    module: The module name in the metadata, e.g. Balances or Account
+    storage_function: The storage function name, e.g. FreeBalance or AccountNonce
+    params: list of params, in the decoded format of the applicable ScaleTypes
+    block_hash: Optional block hash, when left to None the chain tip will be used
+
+    Returns
+    -------
+
+    """
+
+    self.init_runtime(block_hash=block_hash)
+
+    # Search storage call in metadata
+    for metadata_module in self.metadata_decoder.metadata.modules:
+        if metadata_module.name == module:
+            if metadata_module.storage:
+                for storage_item in metadata_module.storage.items:
+                    if storage_item.name == storage_function:
+
+                        key2_hasher = None
+
+                        if 'PlainType' in storage_item.type:
+                            hasher = 'Twox64Concat'
+                            return_scale_type = storage_item.type.get('PlainType')
+                            if params:
+                                raise ValueError('Storage call of type "PlainType" doesn\'t accept params')
+
+                        elif 'MapType' in storage_item.type:
+
+                            map_type = storage_item.type.get('MapType')
+                            hasher = map_type.get('hasher')
+                            return_scale_type = map_type.get('value')
+
+                            if not params or len(params) != 1:
+                                raise ValueError('Storage call of type "MapType" requires 1 parameter')
+
+                            # Encode parameter
+                            params[0] = self.convert_storage_parameter(map_type['key'], params[0])
+                            param_obj = ScaleDecoder.get_decoder_class(map_type['key'])
+                            params[0] = param_obj.encode(params[0])
+
+                        elif 'DoubleMapType' in storage_item.type:
+
+                            map_type = storage_item.type.get('DoubleMapType')
+                            hasher = map_type.get('hasher')
+                            key2_hasher = map_type.get('key2Hasher')
+                            return_scale_type = map_type.get('value')
+
+                            if not params or len(params) != 2:
+                                raise ValueError('Storage call of type "DoubleMapType" requires 2 parameters')
+
+                            # Encode parameter 1
+                            params[0] = self.convert_storage_parameter(map_type['key1'], params[0])
+                            param_obj = ScaleDecoder.get_decoder_class(map_type['key1'])
+                            params[0] = param_obj.encode(params[0])
+
+                            # Encode parameter 2
+                            params[1] = self.convert_storage_parameter(map_type['key2'], params[1])
+                            param_obj = ScaleDecoder.get_decoder_class(map_type['key2'])
+                            params[1] = param_obj.encode(params[1])
+
+                        else:
+                            raise NotImplementedError("Storage type not implemented")
+
+                        storage_hash = self.generate_storage_hash(
+                            storage_module=metadata_module.prefix,
+                            storage_function=storage_function,
+                            params=params,
+                            hasher=hasher,
+                            key2_hasher=key2_hasher,
+                            metadata_version=self.metadata_decoder.version.index
+                        )
+
+                        response = self.rpc_request("state_getStorageAt", [storage_hash, block_hash])
+
+                        if 'result' in response:
+
+                            if return_scale_type and response.get('result'):
+                                obj = ScaleDecoder.get_decoder_class(
+                                    return_scale_type,
+                                    ScaleBytes(response.get('result')),
+                                    metadata=self.metadata_decoder
+                                )
+                                response['result'] = obj.decode()
+
+                        return response
+
+    raise StorageFunctionNotFound('Storage function "{}.{}" not found'.format(module, storage_function))
+
+
+
+def get_storage(self, block_hash, module, function, params=None, return_scale_type=None, hasher=None, spec_version_id='default', metadata=None, metadata_version=None) +
+
+

Retrieves the storage entry for given module, function and optional parameters at given block.

+

DEPRECATED: use get_runtime_state()

+

Parameters

+
+
block_hash
+
 
+
module
+
 
+
function
+
 
+
params
+
 
+
return_scale_type : Scale type string to interprete result
+
 
+
hasher : Hashing method used to determine storage key, defaults to 'Twox64Concat' if not provided
+
 
+
spec_version_id : DEPRECATED
+
 
+
metadata
+
 
+
metadata_version : Version index of Metadata, e.g. 9 for MetadataV9
+
 
+
+

Returns

+
+ +Expand source code + +
def get_storage(self, block_hash, module, function, params=None, return_scale_type=None, hasher=None,
+                spec_version_id='default', metadata=None, metadata_version=None):
+    """
+    Retrieves the storage entry for given module, function and optional parameters at given block.
+
+    DEPRECATED: use `get_runtime_state()`
+
+    Parameters
+    ----------
+    block_hash
+    module
+    function
+    params
+    return_scale_type: Scale type string to interprete result
+    hasher: Hashing method used to determine storage key, defaults to 'Twox64Concat' if not provided
+    spec_version_id: DEPRECATED
+    metadata
+    metadata_version: Version index of Metadata, e.g. 9 for MetadataV9
+
+    Returns
+    -------
+
+    """
+    storage_hash = self.generate_storage_hash(
+        storage_module=module,
+        storage_function=function,
+        params=params,
+        hasher=hasher,
+        metadata_version=metadata_version
+    )
+    response = self.rpc_request("state_getStorageAt", [storage_hash, block_hash])
+
+    if 'result' in response:
+
+        if return_scale_type and response.get('result'):
+            obj = ScaleDecoder.get_decoder_class(
+                return_scale_type,
+                ScaleBytes(response.get('result')),
+                metadata=metadata
+            )
+            return obj.decode()
+        else:
+            return response.get('result')
+    else:
+        raise SubstrateRequestException("Error occurred during retrieval of events")
+
+
+
+def get_storage_by_key(self, block_hash, storage_key) +
+
+

A pass-though to existing JSONRPC method state_getStorageAt

+

Parameters

+
+
block_hash
+
 
+
storage_key
+
 
+
+

Returns

+
+ +Expand source code + +
def get_storage_by_key(self, block_hash, storage_key):
+    """
+    A pass-though to existing JSONRPC method `state_getStorageAt`
+
+    Parameters
+    ----------
+    block_hash
+    storage_key
+
+    Returns
+    -------
+
+    """
+
+    response = self.rpc_request("state_getStorageAt", [storage_key, block_hash])
+    if 'result' in response:
+        return response.get('result')
+    else:
+        raise SubstrateRequestException("Error occurred during retrieval of events")
+
+
+
+def get_system_name(self) +
+
+

A pass-though to existing JSONRPC method system_name

+

Returns

+
+ +Expand source code + +
def get_system_name(self):
+    """
+    A pass-though to existing JSONRPC method `system_name`
+
+    Returns
+    -------
+
+    """
+    response = self.rpc_request("system_name", [])
+    return response.get('result')
+
+
+
+def get_type_definition(self, type_string, block_hash=None) +
+
+

Retrieves decoding specifications of given type_string

+

Parameters

+
+
type_string : RUST variable type, e.g. Vec<Address>
+
 
+
block_hash
+
 
+
+

Returns

+
+ +Expand source code + +
def get_type_definition(self, type_string, block_hash=None):
+    """
+    Retrieves decoding specifications of given type_string
+
+    Parameters
+    ----------
+    type_string: RUST variable type, e.g. Vec<Address>
+    block_hash
+
+    Returns
+    -------
+
+    """
+    type_registry = self.get_type_registry(block_hash=block_hash)
+    return type_registry.get(type_string)
+
+
+
+def get_type_registry(self, block_hash=None) +
+
+

Generates an exhaustive list of which RUST types exist in the runtime specified at given block_hash (or +chaintip if block_hash is omitted)

+

Parameters

+
+
block_hash : Chaintip will be used if block_hash is omitted
+
 
+
+

Returns

+
+ +Expand source code + +
def get_type_registry(self, block_hash=None):
+    """
+    Generates an exhaustive list of which RUST types exist in the runtime specified at given block_hash (or
+    chaintip if block_hash is omitted)
+
+    Parameters
+    ----------
+    block_hash: Chaintip will be used if block_hash is omitted
+
+    Returns
+    -------
+
+    """
+    self.init_runtime(block_hash=block_hash)
+
+    if self.runtime_version not in self.type_registry_cache:
+
+        for module in self.metadata_decoder.metadata.modules:
+
+            # Storage backwards compt check
+            if module.storage and isinstance(module.storage, list):
+                storage_functions = module.storage
+            elif module.storage and isinstance(getattr(module.storage, 'value'), dict):
+                storage_functions = module.storage.items
+            else:
+                storage_functions = []
+
+            if len(module.calls or []) > 0:
+                for idx, call in enumerate(module.calls):
+                    for arg in call.args:
+                        self.process_metadata_typestring(arg.type)
+
+            if len(module.events or []) > 0:
+                for event_index, event in enumerate(module.events):
+
+                    for arg_index, arg in enumerate(event.args):
+                        self.process_metadata_typestring(arg)
+
+            if len(storage_functions) > 0:
+                for idx, storage in enumerate(storage_functions):
+
+                    # Determine type
+                    type_key1 = None
+                    type_key2 = None
+                    type_value = None
+
+                    if storage.type.get('PlainType'):
+                        type_value = storage.type.get('PlainType')
+
+                    elif storage.type.get('MapType'):
+                        type_key1 = storage.type['MapType'].get('key')
+                        type_value = storage.type['MapType'].get('value')
+
+                    elif storage.type.get('DoubleMapType'):
+                        type_key1 = storage.type['DoubleMapType'].get('key1')
+                        type_key2 = storage.type['DoubleMapType'].get('key2')
+                        type_value = storage.type['DoubleMapType'].get('value')
+
+                    self.process_metadata_typestring(type_value)
+
+                    if type_key1:
+                        self.process_metadata_typestring(type_key1)
+
+                    if type_key2:
+                        self.process_metadata_typestring(type_key2)
+
+            if len(module.constants or []) > 0:
+                for idx, constant in enumerate(module.constants):
+
+                    # Check if types already registered in database
+                    self.process_metadata_typestring(constant.type)
+
+    return self.type_registry_cache[self.runtime_version]
+
+
+
+def get_version(self) +
+
+

A pass-though to existing JSONRPC method system_version

+

Returns

+
+ +Expand source code + +
def get_version(self):
+    """
+    A pass-though to existing JSONRPC method `system_version`
+
+    Returns
+    -------
+
+    """
+    if not self._version:
+        response = self.rpc_request("system_version", [])
+        self._version = response.get('result')
+    return self._version
+
+
+
+def init_runtime(self, block_hash=None, block_id=None) +
+
+

This method is used by all other methods that deals with metadata and types defined in the type registry. +It optionally retrieves the block_hash when block_id is given and sets the applicable metadata for that +block_hash. Also it applies all the versioned types at the time of the block_hash.

+

Because parsing of metadata and type registry is quite heavy, the result will be cached per runtime id. +In the future there could be support for caching backends like Redis to make this cache more persistent.

+

Parameters

+
+
block_hash
+
 
+
block_id
+
 
+
+

Returns

+
+ +Expand source code + +
def init_runtime(self, block_hash=None, block_id=None):
+    """
+    This method is used by all other methods that deals with metadata and types defined in the type registry.
+    It optionally retrieves the block_hash when block_id is given and sets the applicable metadata for that
+    block_hash. Also it applies all the versioned types at the time of the block_hash.
+
+    Because parsing of metadata and type registry is quite heavy, the result will be cached per runtime id.
+    In the future there could be support for caching backends like Redis to make this cache more persistent.
+
+    Parameters
+    ----------
+    block_hash
+    block_id
+
+    Returns
+    -------
+
+    """
+
+    if block_id and block_hash:
+        raise ValueError('Cannot provide block_hash and block_id at the same time')
+
+    # Check if runtime state already set to current block
+    if (block_hash and block_hash == self.block_hash) or (block_id and block_id == self.block_id):
+        return
+
+    if block_id is not None:
+        block_hash = self.get_block_hash(block_id)
+
+    self.block_hash = block_hash
+    self.block_id = block_id
+
+    runtime_info = self.get_block_runtime_version(block_hash=self.block_hash)
+
+    # Check if runtime state already set to current block
+    if runtime_info.get("specVersion") == self.runtime_version:
+        return
+
+    self.runtime_version = runtime_info.get("specVersion")
+    self.transaction_version = runtime_info.get("transactionVersion")
+
+    # Set active runtime version
+    RuntimeConfiguration().set_active_spec_version_id(self.runtime_version)
+
+    if self.runtime_version not in self.metadata_cache and self.cache_region:
+        # Try to retrieve metadata from Dogpile cache
+        cached_metadata = self.cache_region.get('METADATA_{}'.format(self.runtime_version))
+        if cached_metadata:
+            self.debug_message('Retrieved metadata for {} from Redis'.format(self.runtime_version))
+            self.metadata_cache[self.runtime_version] = cached_metadata
+
+    if self.runtime_version in self.metadata_cache:
+        # Get metadata from cache
+        self.debug_message('Retrieved metadata for {} from memory'.format(self.runtime_version))
+        self.metadata_decoder = self.metadata_cache[self.runtime_version]
+    else:
+        self.metadata_decoder = self.get_block_metadata(block_hash=self.block_hash, decode=True)
+        self.debug_message('Retrieved metadata for {} from Substrate node'.format(self.runtime_version))
+
+        # Update metadata cache
+        self.metadata_cache[self.runtime_version] = self.metadata_decoder
+
+        if self.cache_region:
+            self.debug_message('Stored metadata for {} in Redis'.format(self.runtime_version))
+            self.cache_region.set('METADATA_{}'.format(self.runtime_version), self.metadata_decoder)
+
+
+
+def process_metadata_typestring(self, type_string) +
+
+

Process how given type_string is decoded with active runtime and type registry

+

Parameters

+
+
type_string : RUST variable type, e.g. Vec<Address>
+
 
+
+

Returns

+
+
dict of properties for given type_string
+
 
+
+

E.g.

+

{ +"type_string": "Vec<Address>", +"decoder_class": "Vec", +"is_primitive_runtime": false, +"is_primitive_core": false, +"spec_version": 1030 +}

+
+ +Expand source code + +
def process_metadata_typestring(self, type_string):
+    """
+    Process how given type_string is decoded with active runtime and type registry
+
+    Parameters
+    ----------
+    type_string: RUST variable type, e.g. Vec<Address>
+
+    Returns
+    -------
+
+    dict of properties for given type_string
+
+    E.g.
+
+    `{
+        "type_string": "Vec<Address>",
+        "decoder_class": "Vec",
+        "is_primitive_runtime": false,
+        "is_primitive_core": false,
+        "spec_version": 1030
+    }`
+
+    """
+    decoder_class_obj = None
+
+    type_info = {
+        "type_string": type_string,
+        "decoder_class": None,
+        "is_primitive_runtime": None,
+        "is_primitive_core": False,
+        "spec_version": self.runtime_version
+    }
+
+    if self.runtime_version not in self.type_registry_cache:
+        self.type_registry_cache[self.runtime_version] = {}
+
+    # Check if already added
+    if type_string.lower() in self.type_registry_cache[self.runtime_version]:
+        return self.type_registry_cache[self.runtime_version][type_string.lower()]['decoder_class']
+
+    # Try to get decoder class
+    decoder_class = RuntimeConfiguration().get_decoder_class(type_string)
+
+    if not decoder_class:
+
+        # Not in type registry, try get hard coded decoder classes
+        try:
+            decoder_class_obj = ScaleDecoder.get_decoder_class(type_string)
+            decoder_class = decoder_class_obj.__class__
+        except NotImplementedError as e:
+            decoder_class = None
+
+    # Process classes that contain subtypes (e.g. Option<ChangesTrieConfiguration>)
+    if decoder_class_obj and decoder_class_obj.sub_type:
+        type_info["is_primitive_runtime"] = False
+
+        # Try to split on ',' (e.g. ActiveRecovery<BlockNumber, BalanceOf, AccountId>)
+        if not re.search('[<()>]', decoder_class_obj.sub_type):
+            for element in decoder_class_obj.sub_type.split(','):
+                if element not in ['T', 'I']:
+                    self.process_metadata_typestring(element.strip())
+
+    # Process classes that contain type_mapping (e.g. Struct and Enum)
+    if decoder_class and hasattr(decoder_class, 'type_mapping') and decoder_class.type_mapping:
+
+        if type_string[0] == '(':
+            type_info["is_primitive_runtime"] = False
+
+        for key, data_type in decoder_class.type_mapping:
+            self.process_metadata_typestring(data_type)
+
+    # Try to get superclass as actual decoding class if not root level 'ScaleType'
+    if decoder_class and len(decoder_class.__mro__) > 1 and decoder_class.__mro__[1].__name__ != 'ScaleType':
+        decoder_class = decoder_class.__mro__[1]
+
+    if decoder_class:
+        type_info['decoder_class'] = decoder_class.__name__
+
+        if type_info["is_primitive_runtime"] is None:
+            type_info["is_primitive_runtime"] = True
+
+        if type_info["is_primitive_runtime"] and type_string.lower() in ScaleDecoder.PRIMITIVES:
+            type_info["is_primitive_core"] = True
+    else:
+        type_info["is_primitive_runtime"] = None
+        type_info["is_primitive_core"] = None
+
+    self.type_registry_cache[self.runtime_version][type_string.lower()] = type_info
+
+    return decoder_class
+
+
+
+def rpc_request(self, method, params, result_handler=None) +
+
+

Method that handles the actual RPC request to the Substrate node. The other implemented functions eventually +use this method to perform the request.

+

Parameters

+
+
result_handler : Callback of function that processes the result received from the node
+
 
+
method : method of the JSONRPC request
+
 
+
params : a list containing the parameters of the JSONRPC request
+
 
+
+

Returns

+

a dict with the parsed result of the request.

+
+ +Expand source code + +
def rpc_request(self, method, params, result_handler=None):
+    """
+    Method that handles the actual RPC request to the Substrate node. The other implemented functions eventually
+    use this method to perform the request.
+
+    Parameters
+    ----------
+    result_handler: Callback of function that processes the result received from the node
+    method: method of the JSONRPC request
+    params: a list containing the parameters of the JSONRPC request
+
+    Returns
+    -------
+    a dict with the parsed result of the request.
+    """
+    payload = {
+        "jsonrpc": "2.0",
+        "method": method,
+        "params": params,
+        "id": self.request_id
+    }
+
+    self.debug_message('RPC request "{}"'.format(method))
+
+    if self.url[0:6] == 'wss://' or self.url[0:5] == 'ws://':
+        ws_result = {}
+
+        async def ws_request(ws_payload):
+            """
+            Internal method to handle the request if url is a websocket address (wss:// or ws://)
+
+            Parameters
+            ----------
+            ws_payload: a dict that contains the JSONRPC payload of the request
+
+            Returns
+            -------
+            This method doesn't return but updates the `ws_result` object variable with the result
+            """
+            async with websockets.connect(
+                    self.url
+            ) as websocket:
+                await websocket.send(json.dumps(ws_payload))
+
+                if callable(result_handler):
+                    event_number = 0
+                    while not ws_result:
+                        result = json.loads(await websocket.recv())
+                        self.debug_message("Websocket result [{}] Received from node: {}".format(event_number, result))
+
+                        # Check if response has error
+                        if 'error' in result:
+                            raise SubstrateRequestException(result['error'])
+
+                        callback_result = result_handler(result)
+                        if callback_result:
+                            ws_result.update(callback_result)
+
+                        event_number += 1
+                else:
+                    ws_result.update(json.loads(await websocket.recv()))
+
+        asyncio.run(ws_request(payload))
+        json_body = ws_result
+
+    else:
+
+        if result_handler:
+            raise ConfigurationError("Result handlers only available for websockets (ws://) connections")
+
+        response = requests.request("POST", self.url, data=json.dumps(payload), headers=self.default_headers)
+
+        if response.status_code != 200:
+            raise SubstrateRequestException("RPC request failed with HTTP status code {}".format(response.status_code))
+
+        json_body = response.json()
+
+    return json_body
+
+
+
+def serialize_constant(self, constant, module, spec_version_id) +
+
+

Helper function to serialize a constant

+

Parameters

+
+
constant
+
 
+
module
+
 
+
spec_version_id
+
 
+
+

Returns

+
+ +Expand source code + +
def serialize_constant(self, constant, module, spec_version_id):
+    """
+    Helper function to serialize a constant
+
+    Parameters
+    ----------
+    constant
+    module
+    spec_version_id
+
+    Returns
+    -------
+
+    """
+    try:
+        value_obj = ScaleDecoder.get_decoder_class(constant.type,
+                                                   ScaleBytes(constant.constant_value))
+        constant_decoded_value = value_obj.decode()
+    except Exception:
+        constant_decoded_value = '[decoding error]'
+
+    return {
+        "constant_name": constant.name,
+        "constant_type": constant.type,
+        "constant_value": constant_decoded_value,
+        "constant_value_scale": constant.constant_value,
+        "documentation": '\n'.join(constant.docs),
+        "module_id": module.get_identifier(),
+        "module_prefix": module.prefix,
+        "module_name": module.name,
+        "spec_version": spec_version_id
+    }
+
+
+
+def serialize_module_call(self, module, call, spec_version, call_index) +
+
+

Helper function to serialize a call function

+

Parameters

+
+
module
+
 
+
call
+
 
+
spec_version
+
 
+
call_index
+
 
+
+

Returns

+
+ +Expand source code + +
def serialize_module_call(self, module, call, spec_version, call_index):
+    """
+    Helper function to serialize a call function
+
+    Parameters
+    ----------
+    module
+    call
+    spec_version
+    call_index
+
+    Returns
+    -------
+
+    """
+    return {
+        "call_id": call.get_identifier(),
+        "call_name": call.name,
+        "call_args": [call_arg.value for call_arg in call.args],
+        "lookup": '0x{}'.format(call_index),
+        "documentation": '\n'.join(call.docs),
+        "module_id": module.get_identifier(),
+        "module_prefix": module.prefix,
+        "module_name": module.name,
+        "spec_version": spec_version
+    }
+
+
+
+def serialize_module_error(self, module, error, spec_version) +
+
+

Helper function to serialize an error

+

Parameters

+
+
module
+
 
+
error
+
 
+
spec_version
+
 
+
+

Returns

+
+ +Expand source code + +
def serialize_module_error(self, module, error, spec_version):
+    """
+    Helper function to serialize an error
+
+    Parameters
+    ----------
+    module
+    error
+    spec_version
+
+    Returns
+    -------
+
+    """
+    return {
+        "error_name": error.name,
+        "documentation": '\n'.join(error.docs),
+        "module_id": module.get_identifier(),
+        "module_prefix": module.prefix,
+        "module_name": module.name,
+        "spec_version": spec_version
+    }
+
+
+
+def serialize_module_event(self, module, event, spec_version, event_index) +
+
+

Helper function to serialize an event

+

Parameters

+
+
module
+
 
+
event
+
 
+
spec_version
+
 
+
event_index
+
 
+
+

Returns

+
+ +Expand source code + +
def serialize_module_event(self, module, event, spec_version, event_index):
+    """
+    Helper function to serialize an event
+
+    Parameters
+    ----------
+    module
+    event
+    spec_version
+    event_index
+
+    Returns
+    -------
+
+    """
+    return {
+        "event_id": event.name,
+        "event_name": event.name,
+        "event_args": [
+              {
+                "event_arg_index": idx,
+                "type": arg
+              } for idx, arg in enumerate(event.args)
+            ],
+        "lookup": '0x{}'.format(event_index),
+        "documentation": '\n'.join(event.docs),
+        "module_id": module.get_identifier(),
+        "module_prefix": module.prefix,
+        "module_name": module.name,
+        "spec_version": spec_version
+    }
+
+
+
+def serialize_storage_item(self, storage_item, module, spec_version_id) +
+
+

Helper function to serialize a storage item

+

Parameters

+
+
storage_item
+
 
+
module
+
 
+
spec_version_id
+
 
+
+

Returns

+
+ +Expand source code + +
def serialize_storage_item(self, storage_item, module, spec_version_id):
+    """
+    Helper function to serialize a storage item
+
+    Parameters
+    ----------
+    storage_item
+    module
+    spec_version_id
+
+    Returns
+    -------
+
+    """
+    storage_dict = {
+        "storage_name": storage_item.name,
+        "storage_modifier": storage_item.modifier,
+        "storage_fallback_scale": storage_item.fallback,
+        "storage_fallback": None,
+        "documentation": '\n'.join(storage_item.docs),
+        "module_id": module.get_identifier(),
+        "module_prefix": module.prefix,
+        "module_name": module.name,
+        "spec_version": spec_version_id,
+        "type_key1": None,
+        "type_key2": None,
+        "type_hasher_key1": None,
+        "type_hasher_key2": None,
+        "type_value": None,
+        "type_is_linked": None
+    }
+
+    type_class, type_info = next(iter(storage_item.type.items()))
+
+    storage_dict["type_class"] = type_class
+
+    if type_class == 'PlainType':
+        storage_dict["type_value"] = type_info
+
+    elif type_class == 'MapType':
+        storage_dict["type_value"] = type_info["value"]
+        storage_dict["type_key1"] = type_info["key"]
+        storage_dict["type_hasher_key1"] = type_info["hasher"]
+        storage_dict["type_is_linked"] = type_info["isLinked"]
+
+    elif type_class == 'DoubleMapType':
+
+        storage_dict["type_value"] = type_info["value"]
+        storage_dict["type_key1"] = type_info["key1"]
+        storage_dict["type_key2"] = type_info["key2"]
+        storage_dict["type_hasher_key1"] = type_info["hasher"]
+        storage_dict["type_hasher_key1"] = type_info["key2Hasher"]
+
+    if storage_item.fallback != '0x00':
+        # Decode fallback
+        try:
+            fallback_obj = ScaleDecoder.get_decoder_class(storage_dict["type_value"],
+                                                          ScaleBytes(storage_item.fallback))
+            storage_dict["storage_fallback"] = fallback_obj.decode()
+        except Exception:
+            storage_dict["storage_fallback"] = '[decoding error]'
+
+    return storage_dict
+
+
+
+def submit_extrinsic(self, extrinsic, wait_for_inclusion=False, wait_for_finalization=False) +
+
+

Parameters

+
+
extrinsic : ExtrinsicsDecoder The extinsic to be send to the network
+
 
+
wait_for_inclusion : wait until extrinsic is included in a block (only works on websocket connections)
+
 
+
wait_for_finalization : wait until extrinsic is finalized (only works on websocket connections)
+
 
+
+

Returns

+
+
The hash of the extrinsic submitted to the network
+
 
+
+
+ +Expand source code + +
def submit_extrinsic(self, extrinsic, wait_for_inclusion=False, wait_for_finalization=False):
+    """
+
+    Parameters
+    ----------
+    extrinsic: ExtrinsicsDecoder The extinsic to be send to the network
+    wait_for_inclusion: wait until extrinsic is included in a block (only works on websocket connections)
+    wait_for_finalization: wait until extrinsic is finalized (only works on websocket connections)
+
+    Returns
+    -------
+    The hash of the extrinsic submitted to the network
+
+    """
+
+    # Check requirements
+    if extrinsic.__class__.__name__ != 'ExtrinsicsDecoder':
+        raise TypeError("'extrinsic' must be of type ExtrinsicsDecoder")
+
+    def result_handler(result):
+        # Check if extrinsic is included and finalized
+        if 'params' in result and type(result['params']['result']) is dict:
+            if 'finalized' in result['params']['result'] and wait_for_finalization:
+                return {
+                    'block_hash': result['params']['result']['finalized'],
+                    'extrinsic_hash': '0x{}'.format(extrinsic.extrinsic_hash),
+                    'finalized': True
+                }
+            elif 'inBlock' in result['params']['result'] and wait_for_inclusion and not wait_for_finalization:
+                return {
+                    'block_hash': result['params']['result']['inBlock'],
+                    'extrinsic_hash': '0x{}'.format(extrinsic.extrinsic_hash),
+                    'finalized': False
+                }
+
+    if wait_for_inclusion or wait_for_finalization:
+        response = self.rpc_request(
+            "author_submitAndWatchExtrinsic",
+            [str(extrinsic.data)],
+            result_handler=result_handler
+        )
+    else:
+
+        response = self.rpc_request("author_submitExtrinsic", [str(extrinsic.data)])
+
+        if 'result' not in response:
+            raise SubstrateRequestException(response.get('error'))
+
+        response = {
+            'extrinsic_hash': response['result'],
+            'block_hash': None,
+            'finalized': None
+        }
+
+    return response
+
+
+
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/py-substrate-interface/docs/subkey.html b/py-substrate-interface/docs/subkey.html new file mode 100644 index 00000000..f2d90897 --- /dev/null +++ b/py-substrate-interface/docs/subkey.html @@ -0,0 +1,685 @@ + + + + + + +substrateinterface.subkey API documentation + + + + + + + + + + + +
+
+
+

Module substrateinterface.subkey

+
+
+
+ +Expand source code + +
# Python Substrate Interface Library
+#
+# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import json
+import shlex
+import subprocess
+from abc import ABC, abstractmethod
+
+import docker
+from docker.errors import ContainerError
+
+
+class CommandFailException(Exception):
+    pass
+
+
+class InvalidConfigurationError(Exception):
+    pass
+
+
+class SubkeyImplementation(ABC):
+
+    @abstractmethod
+    def execute_command(self, command, stdin=None, json_output=True, **kwargs):
+        pass
+
+    def generate_key(self, network):
+        return self.execute_command(['--network={}'.format(network), 'generate'])
+
+    def inspect(self, network, suri):
+        return self.execute_command(['--network={}'.format(network), 'inspect', suri])
+
+    def sign(self, data, suri, is_hex=True):
+
+        return self.execute_command(
+            command=['sign', '--hex', suri],
+            stdin=data,
+            json_output=False
+        )
+
+
+class DockerSubkeyImplementation(SubkeyImplementation):
+
+    def __init__(self, docker_image=None):
+
+        self.docker_image = docker_image or 'parity/subkey:latest'
+
+    def execute_command(self, command, stdin=None, json_output=True, **kwargs):
+
+        command = ['--output=json'] + command
+
+        full_command = ' '.join([shlex.quote(el) for el in command])
+
+        if stdin:
+            full_command = '-c "echo -n \\"{}\\" | subkey {}"'.format(stdin, full_command)
+        else:
+            full_command = '-c "subkey {}"'.format(full_command)
+
+        client = docker.from_env()
+        try:
+            output = client.containers.run(self.docker_image, full_command, entrypoint='/bin/sh')
+
+            output = output[0:-1].decode()
+
+            if json_output:
+                output = json.loads(output)
+
+            return output
+
+        except ContainerError as e:
+            raise CommandFailException('Docker Error: ', e)
+
+        except json.JSONDecodeError as e:
+            raise CommandFailException('Invalid format: ', e)
+
+
+class LocalSubkeyImplementation(SubkeyImplementation):
+
+    def __init__(self, subkey_path=None):
+        self.subkey_path = subkey_path
+
+    def execute_command(self, command, stdin=None, json_output=True, **kwargs):
+
+        result = subprocess.run([self.subkey_path, '--output=json'] + command, input=stdin, encoding='ascii',
+                                stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+        if result.returncode > 0:
+            raise CommandFailException(result.stderr)
+
+        # Strip the newline in the end of the result
+        output = result.stdout[0:-1]
+
+        if json_output:
+            output = json.loads(output)
+
+        return output
+
+
+class HttpSubkeyImplementation(SubkeyImplementation):
+
+    def execute_command(self, command, stdin=None, json_output=True, **kwargs):
+        pass
+
+
+class Subkey:
+
+    def __init__(self, use_docker=True, docker_image=None, subkey_path=None, subkey_host=None):
+
+        if subkey_path:
+            self.implementation = LocalSubkeyImplementation(subkey_path=subkey_path)
+        elif subkey_host:
+            self.implementation = HttpSubkeyImplementation()
+        elif use_docker:
+            self.implementation = DockerSubkeyImplementation(docker_image=docker_image)
+        else:
+            raise InvalidConfigurationError(
+                'No valid subkey configuration, either set subkey_path, subkey_host or subkey_host'
+            )
+
+    def execute_command(self, command):
+        self.implementation.execute_command(command)
+
+    def generate_key(self, network):
+        return self.implementation.generate_key(network=network)
+
+    def inspect(self, network, suri):
+        return self.implementation.inspect(network=network, suri=suri)
+
+    def sign(self, data, suri, is_hex=True):
+        if is_hex:
+            data = data.replace('0x', '')
+        return self.implementation.sign(data=data, suri=suri, is_hex=is_hex)
+
+
+
+
+
+
+
+
+
+

Classes

+
+
+class CommandFailException +(...) +
+
+

Common base class for all non-exit exceptions.

+
+ +Expand source code + +
class CommandFailException(Exception):
+    pass
+
+

Ancestors

+
    +
  • builtins.Exception
  • +
  • builtins.BaseException
  • +
+
+
+class DockerSubkeyImplementation +(docker_image=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class DockerSubkeyImplementation(SubkeyImplementation):
+
+    def __init__(self, docker_image=None):
+
+        self.docker_image = docker_image or 'parity/subkey:latest'
+
+    def execute_command(self, command, stdin=None, json_output=True, **kwargs):
+
+        command = ['--output=json'] + command
+
+        full_command = ' '.join([shlex.quote(el) for el in command])
+
+        if stdin:
+            full_command = '-c "echo -n \\"{}\\" | subkey {}"'.format(stdin, full_command)
+        else:
+            full_command = '-c "subkey {}"'.format(full_command)
+
+        client = docker.from_env()
+        try:
+            output = client.containers.run(self.docker_image, full_command, entrypoint='/bin/sh')
+
+            output = output[0:-1].decode()
+
+            if json_output:
+                output = json.loads(output)
+
+            return output
+
+        except ContainerError as e:
+            raise CommandFailException('Docker Error: ', e)
+
+        except json.JSONDecodeError as e:
+            raise CommandFailException('Invalid format: ', e)
+
+

Ancestors

+ +

Methods

+
+
+def execute_command(self, command, stdin=None, json_output=True, **kwargs) +
+
+
+
+ +Expand source code + +
def execute_command(self, command, stdin=None, json_output=True, **kwargs):
+
+    command = ['--output=json'] + command
+
+    full_command = ' '.join([shlex.quote(el) for el in command])
+
+    if stdin:
+        full_command = '-c "echo -n \\"{}\\" | subkey {}"'.format(stdin, full_command)
+    else:
+        full_command = '-c "subkey {}"'.format(full_command)
+
+    client = docker.from_env()
+    try:
+        output = client.containers.run(self.docker_image, full_command, entrypoint='/bin/sh')
+
+        output = output[0:-1].decode()
+
+        if json_output:
+            output = json.loads(output)
+
+        return output
+
+    except ContainerError as e:
+        raise CommandFailException('Docker Error: ', e)
+
+    except json.JSONDecodeError as e:
+        raise CommandFailException('Invalid format: ', e)
+
+
+
+
+
+class HttpSubkeyImplementation +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class HttpSubkeyImplementation(SubkeyImplementation):
+
+    def execute_command(self, command, stdin=None, json_output=True, **kwargs):
+        pass
+
+

Ancestors

+ +

Methods

+
+
+def execute_command(self, command, stdin=None, json_output=True, **kwargs) +
+
+
+
+ +Expand source code + +
def execute_command(self, command, stdin=None, json_output=True, **kwargs):
+    pass
+
+
+
+
+
+class InvalidConfigurationError +(...) +
+
+

Common base class for all non-exit exceptions.

+
+ +Expand source code + +
class InvalidConfigurationError(Exception):
+    pass
+
+

Ancestors

+
    +
  • builtins.Exception
  • +
  • builtins.BaseException
  • +
+
+
+class LocalSubkeyImplementation +(subkey_path=None) +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class LocalSubkeyImplementation(SubkeyImplementation):
+
+    def __init__(self, subkey_path=None):
+        self.subkey_path = subkey_path
+
+    def execute_command(self, command, stdin=None, json_output=True, **kwargs):
+
+        result = subprocess.run([self.subkey_path, '--output=json'] + command, input=stdin, encoding='ascii',
+                                stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+        if result.returncode > 0:
+            raise CommandFailException(result.stderr)
+
+        # Strip the newline in the end of the result
+        output = result.stdout[0:-1]
+
+        if json_output:
+            output = json.loads(output)
+
+        return output
+
+

Ancestors

+ +

Methods

+
+
+def execute_command(self, command, stdin=None, json_output=True, **kwargs) +
+
+
+
+ +Expand source code + +
def execute_command(self, command, stdin=None, json_output=True, **kwargs):
+
+    result = subprocess.run([self.subkey_path, '--output=json'] + command, input=stdin, encoding='ascii',
+                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+    if result.returncode > 0:
+        raise CommandFailException(result.stderr)
+
+    # Strip the newline in the end of the result
+    output = result.stdout[0:-1]
+
+    if json_output:
+        output = json.loads(output)
+
+    return output
+
+
+
+
+
+class Subkey +(use_docker=True, docker_image=None, subkey_path=None, subkey_host=None) +
+
+
+
+ +Expand source code + +
class Subkey:
+
+    def __init__(self, use_docker=True, docker_image=None, subkey_path=None, subkey_host=None):
+
+        if subkey_path:
+            self.implementation = LocalSubkeyImplementation(subkey_path=subkey_path)
+        elif subkey_host:
+            self.implementation = HttpSubkeyImplementation()
+        elif use_docker:
+            self.implementation = DockerSubkeyImplementation(docker_image=docker_image)
+        else:
+            raise InvalidConfigurationError(
+                'No valid subkey configuration, either set subkey_path, subkey_host or subkey_host'
+            )
+
+    def execute_command(self, command):
+        self.implementation.execute_command(command)
+
+    def generate_key(self, network):
+        return self.implementation.generate_key(network=network)
+
+    def inspect(self, network, suri):
+        return self.implementation.inspect(network=network, suri=suri)
+
+    def sign(self, data, suri, is_hex=True):
+        if is_hex:
+            data = data.replace('0x', '')
+        return self.implementation.sign(data=data, suri=suri, is_hex=is_hex)
+
+

Methods

+
+
+def execute_command(self, command) +
+
+
+
+ +Expand source code + +
def execute_command(self, command):
+    self.implementation.execute_command(command)
+
+
+
+def generate_key(self, network) +
+
+
+
+ +Expand source code + +
def generate_key(self, network):
+    return self.implementation.generate_key(network=network)
+
+
+
+def inspect(self, network, suri) +
+
+
+
+ +Expand source code + +
def inspect(self, network, suri):
+    return self.implementation.inspect(network=network, suri=suri)
+
+
+
+def sign(self, data, suri, is_hex=True) +
+
+
+
+ +Expand source code + +
def sign(self, data, suri, is_hex=True):
+    if is_hex:
+        data = data.replace('0x', '')
+    return self.implementation.sign(data=data, suri=suri, is_hex=is_hex)
+
+
+
+
+
+class SubkeyImplementation +
+
+

Helper class that provides a standard way to create an ABC using +inheritance.

+
+ +Expand source code + +
class SubkeyImplementation(ABC):
+
+    @abstractmethod
+    def execute_command(self, command, stdin=None, json_output=True, **kwargs):
+        pass
+
+    def generate_key(self, network):
+        return self.execute_command(['--network={}'.format(network), 'generate'])
+
+    def inspect(self, network, suri):
+        return self.execute_command(['--network={}'.format(network), 'inspect', suri])
+
+    def sign(self, data, suri, is_hex=True):
+
+        return self.execute_command(
+            command=['sign', '--hex', suri],
+            stdin=data,
+            json_output=False
+        )
+
+

Ancestors

+
    +
  • abc.ABC
  • +
+

Subclasses

+ +

Methods

+
+
+def execute_command(self, command, stdin=None, json_output=True, **kwargs) +
+
+
+
+ +Expand source code + +
@abstractmethod
+def execute_command(self, command, stdin=None, json_output=True, **kwargs):
+    pass
+
+
+
+def generate_key(self, network) +
+
+
+
+ +Expand source code + +
def generate_key(self, network):
+    return self.execute_command(['--network={}'.format(network), 'generate'])
+
+
+
+def inspect(self, network, suri) +
+
+
+
+ +Expand source code + +
def inspect(self, network, suri):
+    return self.execute_command(['--network={}'.format(network), 'inspect', suri])
+
+
+
+def sign(self, data, suri, is_hex=True) +
+
+
+
+ +Expand source code + +
def sign(self, data, suri, is_hex=True):
+
+    return self.execute_command(
+        command=['sign', '--hex', suri],
+        stdin=data,
+        json_output=False
+    )
+
+
+
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/py-substrate-interface/docs/utils/hasher.html b/py-substrate-interface/docs/utils/hasher.html new file mode 100644 index 00000000..8f0662e1 --- /dev/null +++ b/py-substrate-interface/docs/utils/hasher.html @@ -0,0 +1,383 @@ + + + + + + +substrateinterface.utils.hasher API documentation + + + + + + + + + + + +
+
+
+

Module substrateinterface.utils.hasher

+
+
+

Helper functions used to calculate keys for Substrate storage items

+
+ +Expand source code + +
# Python Substrate Interface Library
+#
+# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+""" Helper functions used to calculate keys for Substrate storage items
+"""
+
+from hashlib import blake2b
+import xxhash
+
+
+def blake2_256(data):
+    """
+    Helper function to calculate a 32 bytes Blake2b hash for provided data, used as key for Substrate storage items
+
+    Parameters
+    ----------
+    data
+
+    Returns
+    -------
+
+    """
+    return blake2b(data, digest_size=32).digest().hex()
+
+
+def blake2_128(data):
+    """
+    Helper function to calculate a 16 bytes Blake2b hash for provided data, used as key for Substrate storage items
+
+    Parameters
+    ----------
+    data
+
+    Returns
+    -------
+
+    """
+    return blake2b(data, digest_size=16).digest().hex()
+
+
+def blake2_128_concat(data):
+    """
+    Helper function to calculate a 16 bytes Blake2b hash for provided data, concatenated with data, used as key
+    for Substrate storage items
+
+    Parameters
+    ----------
+    data
+
+    Returns
+    -------
+
+    """
+    return "{}{}".format(blake2b(data, digest_size=16).digest().hex(), data.hex())
+
+
+def xxh128(data):
+    """
+    Helper function to calculate a 2 concatenated xxh64 hash for provided data, used as key for several Substrate
+
+    Parameters
+    ----------
+    data
+
+    Returns
+    -------
+
+    """
+    storage_key1 = bytearray(xxhash.xxh64(data, seed=0).digest())
+    storage_key1.reverse()
+
+    storage_key2 = bytearray(xxhash.xxh64(data, seed=1).digest())
+    storage_key2.reverse()
+
+    return "{}{}".format(storage_key1.hex(), storage_key2.hex())
+
+
+def two_x64_concat(data):
+    """
+    Helper function to calculate a xxh64 hash with concatenated data for provided data,
+    used as key for several Substrate
+
+    Parameters
+    ----------
+    data
+
+    Returns
+    -------
+
+    """
+    storage_key = bytearray(xxhash.xxh64(data, seed=0).digest())
+    storage_key.reverse()
+
+    return "{}{}".format(storage_key.hex(), data.hex())
+
+
+def xxh64(data):
+    storage_key = bytearray(xxhash.xxh64(data, seed=0).digest())
+    storage_key.reverse()
+
+    return "{}".format(storage_key.hex())
+
+
+def identity(data):
+    return data.hex()
+
+
+
+
+
+
+
+

Functions

+
+
+def blake2_128(data) +
+
+

Helper function to calculate a 16 bytes Blake2b hash for provided data, used as key for Substrate storage items

+

Parameters

+
+
data
+
 
+
+

Returns

+
+ +Expand source code + +
def blake2_128(data):
+    """
+    Helper function to calculate a 16 bytes Blake2b hash for provided data, used as key for Substrate storage items
+
+    Parameters
+    ----------
+    data
+
+    Returns
+    -------
+
+    """
+    return blake2b(data, digest_size=16).digest().hex()
+
+
+
+def blake2_128_concat(data) +
+
+

Helper function to calculate a 16 bytes Blake2b hash for provided data, concatenated with data, used as key +for Substrate storage items

+

Parameters

+
+
data
+
 
+
+

Returns

+
+ +Expand source code + +
def blake2_128_concat(data):
+    """
+    Helper function to calculate a 16 bytes Blake2b hash for provided data, concatenated with data, used as key
+    for Substrate storage items
+
+    Parameters
+    ----------
+    data
+
+    Returns
+    -------
+
+    """
+    return "{}{}".format(blake2b(data, digest_size=16).digest().hex(), data.hex())
+
+
+
+def blake2_256(data) +
+
+

Helper function to calculate a 32 bytes Blake2b hash for provided data, used as key for Substrate storage items

+

Parameters

+
+
data
+
 
+
+

Returns

+
+ +Expand source code + +
def blake2_256(data):
+    """
+    Helper function to calculate a 32 bytes Blake2b hash for provided data, used as key for Substrate storage items
+
+    Parameters
+    ----------
+    data
+
+    Returns
+    -------
+
+    """
+    return blake2b(data, digest_size=32).digest().hex()
+
+
+
+def identity(data) +
+
+
+
+ +Expand source code + +
def identity(data):
+    return data.hex()
+
+
+
+def two_x64_concat(data) +
+
+

Helper function to calculate a xxh64 hash with concatenated data for provided data, +used as key for several Substrate

+

Parameters

+
+
data
+
 
+
+

Returns

+
+ +Expand source code + +
def two_x64_concat(data):
+    """
+    Helper function to calculate a xxh64 hash with concatenated data for provided data,
+    used as key for several Substrate
+
+    Parameters
+    ----------
+    data
+
+    Returns
+    -------
+
+    """
+    storage_key = bytearray(xxhash.xxh64(data, seed=0).digest())
+    storage_key.reverse()
+
+    return "{}{}".format(storage_key.hex(), data.hex())
+
+
+
+def xxh128(data) +
+
+

Helper function to calculate a 2 concatenated xxh64 hash for provided data, used as key for several Substrate

+

Parameters

+
+
data
+
 
+
+

Returns

+
+ +Expand source code + +
def xxh128(data):
+    """
+    Helper function to calculate a 2 concatenated xxh64 hash for provided data, used as key for several Substrate
+
+    Parameters
+    ----------
+    data
+
+    Returns
+    -------
+
+    """
+    storage_key1 = bytearray(xxhash.xxh64(data, seed=0).digest())
+    storage_key1.reverse()
+
+    storage_key2 = bytearray(xxhash.xxh64(data, seed=1).digest())
+    storage_key2.reverse()
+
+    return "{}{}".format(storage_key1.hex(), storage_key2.hex())
+
+
+
+def xxh64(data) +
+
+
+
+ +Expand source code + +
def xxh64(data):
+    storage_key = bytearray(xxhash.xxh64(data, seed=0).digest())
+    storage_key.reverse()
+
+    return "{}".format(storage_key.hex())
+
+
+
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/py-substrate-interface/docs/utils/index.html b/py-substrate-interface/docs/utils/index.html new file mode 100644 index 00000000..f31d313b --- /dev/null +++ b/py-substrate-interface/docs/utils/index.html @@ -0,0 +1,91 @@ + + + + + + +substrateinterface.utils API documentation + + + + + + + + + + + +
+
+
+

Module substrateinterface.utils

+
+
+
+ +Expand source code + +
# Python Substrate Interface Library
+#
+# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+
+

Sub-modules

+
+
substrateinterface.utils.hasher
+
+

Helper functions used to calculate keys for Substrate storage items

+
+
substrateinterface.utils.ss58
+
+

SS58 is a simple address format designed for Substrate based chains. +Encoding/decoding according to specification on …

+
+
+
+
+
+
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/py-substrate-interface/docs/utils/ss58.html b/py-substrate-interface/docs/utils/ss58.html new file mode 100644 index 00000000..8ee75c12 --- /dev/null +++ b/py-substrate-interface/docs/utils/ss58.html @@ -0,0 +1,450 @@ + + + + + + +substrateinterface.utils.ss58 API documentation + + + + + + + + + + + +
+
+
+

Module substrateinterface.utils.ss58

+
+
+

SS58 is a simple address format designed for Substrate based chains. +Encoding/decoding according to specification on https://wiki.parity.io/External-Address-Format-(SS58)

+
+ +Expand source code + +
# Python Substrate Interface Library
+#
+# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  ss58.py
+
+""" SS58 is a simple address format designed for Substrate based chains.
+    Encoding/decoding according to specification on https://wiki.parity.io/External-Address-Format-(SS58)
+
+"""
+import base58
+from hashlib import blake2b
+
+from scalecodec import ScaleBytes
+from scalecodec.types import U8, U16, U32, U64
+
+
+def ss58_decode(address, valid_address_type=None):
+    """
+    Decodes given SS58 encoded address to an account ID
+    Parameters
+    ----------
+    address: e.g. EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk
+    valid_address_type
+
+    Returns
+    -------
+    Decoded string AccountId
+    """
+    checksum_prefix = b'SS58PRE'
+
+    ss58_format = base58.b58decode(address)
+
+    if valid_address_type and ss58_format[0] != valid_address_type:
+        raise ValueError("Invalid Address type")
+
+    # Determine checksum length according to length of address string
+    if len(ss58_format) in [3, 4, 6, 10]:
+        checksum_length = 1
+    elif len(ss58_format) in [5, 7, 11, 35]:
+        checksum_length = 2
+    elif len(ss58_format) in [8, 12]:
+        checksum_length = 3
+    elif len(ss58_format) in [9, 13]:
+        checksum_length = 4
+    elif len(ss58_format) in [14]:
+        checksum_length = 5
+    elif len(ss58_format) in [15]:
+        checksum_length = 6
+    elif len(ss58_format) in [16]:
+        checksum_length = 7
+    elif len(ss58_format) in [17]:
+        checksum_length = 8
+    else:
+        raise ValueError("Invalid address length")
+
+    checksum = blake2b(checksum_prefix + ss58_format[0:-checksum_length]).digest()
+
+    if checksum[0:checksum_length] != ss58_format[-checksum_length:]:
+        raise ValueError("Invalid checksum")
+
+    return ss58_format[1:len(ss58_format)-checksum_length].hex()
+
+
+def ss58_encode(address, address_type=42):
+    """
+    Encodes an account ID to an Substrate address according to provided address_type
+
+    Parameters
+    ----------
+    address
+    address_type
+
+    Returns
+    -------
+
+    """
+    checksum_prefix = b'SS58PRE'
+
+    if type(address) is bytes or type(address) is bytearray:
+        address_bytes = address
+    else:
+        address_bytes = bytes.fromhex(address.replace('0x', ''))
+
+    if len(address_bytes) == 32:
+        # Checksum size is 2 bytes for public key
+        checksum_length = 2
+    elif len(address_bytes) in [1, 2, 4, 8]:
+        # Checksum size is 1 byte for account index
+        checksum_length = 1
+    else:
+        raise ValueError("Invalid length for address")
+
+    address_format = bytes([address_type]) + address_bytes
+    checksum = blake2b(checksum_prefix + address_format).digest()
+
+    return base58.b58encode(address_format + checksum[:checksum_length]).decode()
+
+
+def ss58_encode_account_index(account_index, address_type=42):
+    """
+    Encodes an AccountIndex to an Substrate address according to provided address_type
+
+    Parameters
+    ----------
+    account_index
+    address_type
+
+    Returns
+    -------
+
+    """
+
+    if 0 <= account_index <= 2**8 - 1:
+        account_idx_encoder = U8()
+    elif 2**8 <= account_index <= 2**16 - 1:
+        account_idx_encoder = U16()
+    elif 2**16 <= account_index <= 2**32 - 1:
+        account_idx_encoder = U32()
+    elif 2**32 <= account_index <= 2**64 - 1:
+        account_idx_encoder = U64()
+    else:
+        raise ValueError("Value too large for an account index")
+
+    return ss58_encode(account_idx_encoder.encode(account_index).data, address_type)
+
+
+def ss58_decode_account_index(address, valid_address_type=42):
+    """
+    Decodes given SS58 encoded address to an AccountIndex
+
+    Parameters
+    ----------
+    address
+    valid_address_type
+
+    Returns
+    -------
+    Decoded int AccountIndex
+    """
+    account_index_bytes = ss58_decode(address, valid_address_type)
+
+    if len(account_index_bytes) == 2:
+        return U8(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    if len(account_index_bytes) == 4:
+        return U16(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    if len(account_index_bytes) == 8:
+        return U32(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    if len(account_index_bytes) == 16:
+        return U64(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    else:
+        raise ValueError("Invalid account index length")
+
+
+
+
+
+
+
+

Functions

+
+
+def ss58_decode(address, valid_address_type=None) +
+
+

Decodes given SS58 encoded address to an account ID +Parameters

+
+
+
address : e.g. EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk
+
 
+
valid_address_type
+
 
+
+

Returns

+
+
Decoded string AccountId
+
 
+
+
+ +Expand source code + +
def ss58_decode(address, valid_address_type=None):
+    """
+    Decodes given SS58 encoded address to an account ID
+    Parameters
+    ----------
+    address: e.g. EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk
+    valid_address_type
+
+    Returns
+    -------
+    Decoded string AccountId
+    """
+    checksum_prefix = b'SS58PRE'
+
+    ss58_format = base58.b58decode(address)
+
+    if valid_address_type and ss58_format[0] != valid_address_type:
+        raise ValueError("Invalid Address type")
+
+    # Determine checksum length according to length of address string
+    if len(ss58_format) in [3, 4, 6, 10]:
+        checksum_length = 1
+    elif len(ss58_format) in [5, 7, 11, 35]:
+        checksum_length = 2
+    elif len(ss58_format) in [8, 12]:
+        checksum_length = 3
+    elif len(ss58_format) in [9, 13]:
+        checksum_length = 4
+    elif len(ss58_format) in [14]:
+        checksum_length = 5
+    elif len(ss58_format) in [15]:
+        checksum_length = 6
+    elif len(ss58_format) in [16]:
+        checksum_length = 7
+    elif len(ss58_format) in [17]:
+        checksum_length = 8
+    else:
+        raise ValueError("Invalid address length")
+
+    checksum = blake2b(checksum_prefix + ss58_format[0:-checksum_length]).digest()
+
+    if checksum[0:checksum_length] != ss58_format[-checksum_length:]:
+        raise ValueError("Invalid checksum")
+
+    return ss58_format[1:len(ss58_format)-checksum_length].hex()
+
+
+
+def ss58_decode_account_index(address, valid_address_type=42) +
+
+

Decodes given SS58 encoded address to an AccountIndex

+

Parameters

+
+
address
+
 
+
valid_address_type
+
 
+
+

Returns

+
+
Decoded int AccountIndex
+
 
+
+
+ +Expand source code + +
def ss58_decode_account_index(address, valid_address_type=42):
+    """
+    Decodes given SS58 encoded address to an AccountIndex
+
+    Parameters
+    ----------
+    address
+    valid_address_type
+
+    Returns
+    -------
+    Decoded int AccountIndex
+    """
+    account_index_bytes = ss58_decode(address, valid_address_type)
+
+    if len(account_index_bytes) == 2:
+        return U8(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    if len(account_index_bytes) == 4:
+        return U16(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    if len(account_index_bytes) == 8:
+        return U32(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    if len(account_index_bytes) == 16:
+        return U64(ScaleBytes('0x{}'.format(account_index_bytes))).decode()
+    else:
+        raise ValueError("Invalid account index length")
+
+
+
+def ss58_encode(address, address_type=42) +
+
+

Encodes an account ID to an Substrate address according to provided address_type

+

Parameters

+
+
address
+
 
+
address_type
+
 
+
+

Returns

+
+ +Expand source code + +
def ss58_encode(address, address_type=42):
+    """
+    Encodes an account ID to an Substrate address according to provided address_type
+
+    Parameters
+    ----------
+    address
+    address_type
+
+    Returns
+    -------
+
+    """
+    checksum_prefix = b'SS58PRE'
+
+    if type(address) is bytes or type(address) is bytearray:
+        address_bytes = address
+    else:
+        address_bytes = bytes.fromhex(address.replace('0x', ''))
+
+    if len(address_bytes) == 32:
+        # Checksum size is 2 bytes for public key
+        checksum_length = 2
+    elif len(address_bytes) in [1, 2, 4, 8]:
+        # Checksum size is 1 byte for account index
+        checksum_length = 1
+    else:
+        raise ValueError("Invalid length for address")
+
+    address_format = bytes([address_type]) + address_bytes
+    checksum = blake2b(checksum_prefix + address_format).digest()
+
+    return base58.b58encode(address_format + checksum[:checksum_length]).decode()
+
+
+
+def ss58_encode_account_index(account_index, address_type=42) +
+
+

Encodes an AccountIndex to an Substrate address according to provided address_type

+

Parameters

+
+
account_index
+
 
+
address_type
+
 
+
+

Returns

+
+ +Expand source code + +
def ss58_encode_account_index(account_index, address_type=42):
+    """
+    Encodes an AccountIndex to an Substrate address according to provided address_type
+
+    Parameters
+    ----------
+    account_index
+    address_type
+
+    Returns
+    -------
+
+    """
+
+    if 0 <= account_index <= 2**8 - 1:
+        account_idx_encoder = U8()
+    elif 2**8 <= account_index <= 2**16 - 1:
+        account_idx_encoder = U16()
+    elif 2**16 <= account_index <= 2**32 - 1:
+        account_idx_encoder = U32()
+    elif 2**32 <= account_index <= 2**64 - 1:
+        account_idx_encoder = U64()
+    else:
+        raise ValueError("Value too large for an account index")
+
+    return ss58_encode(account_idx_encoder.encode(account_index).data, address_type)
+
+
+
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/py-substrate-interface/examples.py b/py-substrate-interface/examples.py new file mode 100644 index 00000000..9a359ed4 --- /dev/null +++ b/py-substrate-interface/examples.py @@ -0,0 +1,87 @@ +from substrateinterface import SubstrateInterface, Keypair, SubstrateRequestException +from substrateinterface.utils.ss58 import ss58_encode + +substrate = SubstrateInterface( + url="wss://kusama-rpc.polkadot.io/", + address_type=2, + type_registry_preset='kusama' +) + +# Set block_hash to None for chaintip +block_hash = "0x588930468212316d8a75ede0bec0bc949451c164e2cea07ccfc425f497b077b7" + + +# Retrieve extrinsics in block +result = substrate.get_runtime_block(block_hash=block_hash) + +for extrinsic in result['block']['extrinsics']: + + if 'account_id' in extrinsic: + signed_by_address = ss58_encode(address=extrinsic['account_id'], address_type=2) + else: + signed_by_address = None + + print('\nModule: {}\nCall: {}\nSigned by: {}'.format( + extrinsic['call_module'], + extrinsic['call_function'], + signed_by_address + )) + + for param in extrinsic['params']: + + if param['type'] == 'Address': + param['value'] = ss58_encode(address=param['value'], address_type=2) + + if param['type'] == 'Compact': + param['value'] = '{} DOT'.format(param['value'] / 10**12) + + print("Param '{}': {}".format(param['name'], param['value'])) + +# Storage call examples +print("\n\nCurrent Account info: {} DOT".format( + substrate.get_runtime_state( + module='System', + storage_function='Account', + params=['EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk'] + ).get('result') +)) + +print("Balance @ {}: {} DOT".format( + block_hash, + substrate.get_runtime_state( + module='Balances', + storage_function='FreeBalance', + params=['EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk'], + block_hash=block_hash + ).get('result') +)) + +# Create, sign and submit extrinsic example + +mnemonic = Keypair.generate_mnemonic() + +keypair = Keypair.create_from_mnemonic(mnemonic, 2) + +print("Created address: {}".format(keypair.ss58_address)) + +call = substrate.compose_call( + call_module='Balances', + call_function='transfer', + call_params={ + 'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'value': 2 * 10**3 + } +) + +extrinsic = substrate.create_signed_extrinsic(call=call, keypair=keypair) + +try: + # result = substrate.send_extrinsic(extrinsic) + result = substrate.submit_extrinsic(extrinsic, wait_for_inclusion=True) + + print('Extrinsic "{}" included in block "{}"'.format( + result['extrinsic_hash'], result.get('block_hash') + )) + +except SubstrateRequestException as e: + print("Failed to send: {}".format(e)) diff --git a/py-substrate-interface/requirements.txt b/py-substrate-interface/requirements.txt new file mode 100644 index 00000000..52c28b62 --- /dev/null +++ b/py-substrate-interface/requirements.txt @@ -0,0 +1,15 @@ +docker>=4.3.1 +websockets==8.1 +base58>=2.0.1 +certifi>=2020.6.20 +chardet>=3.0.4 +idna>=2.10 +requests==2.24.0 +urllib3>=1.25.11 +xxhash>=1.3.0 +pytest>=6.1.1 + +polymath-scalecodec==3.0.2 +py-sr25519-bindings>=0.1.2 +py-ed25519-bindings>=0.1.1 +py-bip39-bindings>=0.1.6 diff --git a/py-substrate-interface/setup.py b/py-substrate-interface/setup.py new file mode 100644 index 00000000..805b6767 --- /dev/null +++ b/py-substrate-interface/setup.py @@ -0,0 +1,251 @@ +# Python Substrate Interface Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""A setuptools based setup module. + +See: +https://packaging.python.org/guides/distributing-packages-using-setuptools/ +https://github.com/pypa/sampleproject +""" + +# Always prefer setuptools over distutils +from setuptools import setup, find_packages +from os import path, environ +# io.open is needed for projects that support Python 2.7 +# It ensures open() defaults to text mode with universal newlines, +# and accepts an argument to specify the text encoding +# Python 3 only projects can skip this import +from io import open + +if environ.get('TRAVIS_TAG'): + version = environ['TRAVIS_TAG'].replace('v', '') +elif environ.get('CI_COMMIT_TAG'): + version = environ['CI_COMMIT_TAG'].replace('v', '') +elif environ.get('GITHUB_REF'): + + if not environ['GITHUB_REF'].startswith('refs/tags/v'): + raise ValueError('Incorrect tag format {}'.format(environ['GITHUB_REF'])) + + version = environ['GITHUB_REF'].replace('refs/tags/v', '') +else: + raise ValueError('Missing commit tag, can\'t set version') + +here = path.abspath(path.dirname(__file__)) + +# Get the long description from the README file +with open(path.join(here, 'README.md'), encoding='utf-8') as f: + long_description = f.read() + +# Arguments marked as "Required" below must be included for upload to PyPI. +# Fields marked as "Optional" may be commented out. + +setup( + # This is the name of your project. The first time you publish this + # package, this name will be registered for you. It will determine how + # users can install this project, e.g.: + # + # $ pip install sampleproject + # + # And where it will live on PyPI: https://pypi.org/project/sampleproject/ + # + # There are some restrictions on what makes a valid project name + # specification here: + # https://packaging.python.org/specifications/core-metadata/#name + name='polymath-substrate-interface', # Required + + # Versions should comply with PEP 440: + # https://www.python.org/dev/peps/pep-0440/ + # + # For a discussion on single-sourcing the version across setup.py and the + # project code, see + # https://packaging.python.org/en/latest/single_source_version.html + version=version, # Required + + # This is a one-line description or tagline of what your project does. This + # corresponds to the "Summary" metadata field: + # https://packaging.python.org/specifications/core-metadata/#summary + description='Library for interfacing with a Polymesh node', # Optional + + # This is an optional longer description of your project that represents + # the body of text which users will see when they visit PyPI. + # + # Often, this is the same as your README, so you can just read it in from + # that file directly (as we have already done above) + # + # This field corresponds to the "Description" metadata field: + # https://packaging.python.org/specifications/core-metadata/#description-optional + long_description=long_description, # Optional + + # Denotes that our long_description is in Markdown; valid values are + # text/plain, text/x-rst, and text/markdown + # + # Optional if long_description is written in reStructuredText (rst) but + # required for plain-text or Markdown; if unspecified, "applications should + # attempt to render [the long_description] as text/x-rst; charset=UTF-8 and + # fall back to text/plain if it is not valid rst" (see link below) + # + # This field corresponds to the "Description-Content-Type" metadata field: + # https://packaging.python.org/specifications/core-metadata/#description-content-type-optional + long_description_content_type='text/markdown', # Optional (see note above) + + # This should be a valid link to your project's main homepage. + # + # This field corresponds to the "Home-Page" metadata field: + # https://packaging.python.org/specifications/core-metadata/#home-page-optional + url='https://github.com/polkascan/py-substrate-interface', # Optional + + # This should be your name or the name of the organization which owns the + # project. + author='Polymath', # Optional + + # This should be a valid email address corresponding to the author listed + # above. + # author_email='', # Optional + + # Classifiers help users find your project by categorizing it. + # + # For a list of valid classifiers, see https://pypi.org/classifiers/ + classifiers=[ # Optional + # How mature is this project? Common values are + # 3 - Alpha + # 4 - Beta + # 5 - Production/Stable + 'Development Status :: 4 - Beta', + + # Indicate who your project is intended for + 'Intended Audience :: Developers', + + # Pick your license as you wish + 'License :: OSI Approved :: Apache Software License', + + # Specify the Python versions you support here. In particular, ensure + # that you indicate whether you support Python 2, Python 3 or both. + # These classifiers are *not* checked by 'pip install'. See instead + # 'python_requires' below. + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + ], + + # This field adds keywords for your project which will appear on the + # project page. What does your project relate to? + # + # Note that this is a string of words separated by whitespace, not a list. + keywords='interface polkascan polkadot substrate blockchain rpc polymesh', # Optional + + # You can just specify package directories manually here if your project is + # simple. Or you can use find_packages(). + # + # Alternatively, if you just want to distribute a single Python file, use + # the `py_modules` argument instead as follows, which will expect a file + # called `my_module.py` to exist: + # + # py_modules=["my_module"], + # + #packages=find_packages(exclude=['contrib', 'docs', 'tests', 'test']), # Required + packages=find_packages(), # Required + + # Specify which Python versions you support. In contrast to the + # 'Programming Language' classifiers above, 'pip install' will check this + # and refuse to install the project if the version does not match. If you + # do not support Python 2, you can simplify this to '>=3.5' or similar, see + # https://packaging.python.org/guides/distributing-packages-using-setuptools/#python-requires + + #python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4', + python_requires='>=3.7, <4', + + # This field lists other packages that your project depends on to run. + # Any package you put here will be installed by pip when your project is + # installed, so they must be valid existing projects. + # + # For an analysis of "install_requires" vs pip's requirements files see: + # https://packaging.python.org/en/latest/requirements.html + install_requires=[ + 'websockets>=8.1', + 'base58>=2.0.1', + 'certifi>=2019.6.16', + 'chardet>=3.0.4', + 'docker>=4.2.0', + 'idna>=2.8', + 'requests>=2.24.0', + 'urllib3>=1.25.10', + 'xxhash>=1.3.0', + 'polymath-scalecodec==3.0.2', + 'py-sr25519-bindings>=0.1.2', + 'py-ed25519-bindings>=0.1.1', + 'py-bip39-bindings>=0.1.6' + ], + + # List additional groups of dependencies here (e.g. development + # dependencies). Users will be able to install these using the "extras" + # syntax, for example: + # + # $ pip install sampleproject[dev] + # + # Similar to `install_requires` above, these must be valid existing + # projects. + extras_require={ # Optional + #'dev': ['check-manifest'], + 'test': ['coverage', 'pytest'], + }, + + # If there are data files included in your packages that need to be + # installed, specify them here. + # + # If using Python 2.6 or earlier, then these have to be included in + # MANIFEST.in as well. + + # package_data={ # Optional + # 'sample': ['package_data.dat'], + # }, + + # Although 'package_data' is the preferred approach, in some case you may + # need to place data files outside of your packages. See: + # http://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files + # + # In this case, 'data_file' will be installed into '/my_data' + # data_files=[('my_data', ['data/data_file'])], # Optional + + # To provide executable scripts, use entry points in preference to the + # "scripts" keyword. Entry points provide cross-platform support and allow + # `pip` to create the appropriate form of executable for the target + # platform. + # + # For example, the following would provide a command called `sample` which + # executes the function `main` from this package when invoked: + + # entry_points={ # Optional + # 'console_scripts': [ + # 'sample=sample:main', + # ], + # }, + + # List additional URLs that are relevant to your project as a dict. + # + # This field corresponds to the "Project-URL" metadata fields: + # https://packaging.python.org/specifications/core-metadata/#project-url-multiple-use + # + # Examples listed include a pattern for specifying where the package tracks + # issues, where the source is hosted, where to say thanks to the package + # maintainers, and where to support the project financially. The key is + # what's used to render the link text on PyPI. + # project_urls={ # Optional + # 'Bug Reports': 'https://github.com/pypa/sampleproject/issues', + # 'Funding': 'https://donate.pypi.org', + # 'Say Thanks!': 'http://saythanks.io/to/example', + # 'Source': 'https://github.com/pypa/sampleproject/', + # }, +) \ No newline at end of file diff --git a/py-substrate-interface/substrateinterface/__init__.py b/py-substrate-interface/substrateinterface/__init__.py new file mode 100644 index 00000000..bd244093 --- /dev/null +++ b/py-substrate-interface/substrateinterface/__init__.py @@ -0,0 +1,2036 @@ +# Python Substrate Interface Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +from hashlib import blake2b + +import binascii +import json +import logging +import re + +import requests +import websockets + +from scalecodec import ScaleBytes, GenericCall +from scalecodec.base import ScaleDecoder, RuntimeConfiguration +from scalecodec.block import ExtrinsicsDecoder, EventsDecoder, LogDigest +from scalecodec.metadata import MetadataDecoder +from scalecodec.type_registry import load_type_registry_preset +from scalecodec.updater import update_type_registries + +from .key import extract_derive_path +from .utils.hasher import blake2_256, two_x64_concat, xxh128, blake2_128, blake2_128_concat, identity +from .exceptions import SubstrateRequestException, ConfigurationError, StorageFunctionNotFound +from .constants import * +from .utils.ss58 import ss58_decode, ss58_encode + +from bip39 import bip39_to_mini_secret, bip39_generate +import sr25519 +import ed25519 + + +logger = logging.getLogger(__name__) + + +class KeypairType: + ED25519 = 0 + SR25519 = 1 + + +class Keypair: + + def __init__(self, ss58_address=None, public_key=None, private_key=None, address_type=42, seed_hex=None, + crypto_type=KeypairType.SR25519): + + self.crypto_type = crypto_type + self.seed_hex = seed_hex + self.derive_path = None + + if ss58_address and not public_key: + public_key = ss58_decode(ss58_address) + + if not public_key: + raise ValueError('No SS58 formatted address or public key provided') + + if type(public_key) is bytes: + public_key = public_key.hex() + + public_key = '0x{}'.format(public_key.replace('0x', '')) + + if len(public_key) != 66: + raise ValueError('Public key should be 32 bytes long') + + if not ss58_address: + ss58_address = ss58_encode(public_key, address_type=address_type) + + self.public_key = public_key + self.ss58_address = ss58_address + + if private_key: + + if type(private_key) is bytes: + private_key = private_key.hex() + + private_key = '0x{}'.format(private_key.replace('0x', '')) + + if self.crypto_type == KeypairType.SR25519 and len(private_key) != 130: + raise ValueError('Secret key should be 64 bytes long') + + self.private_key = private_key + self.address_type = address_type + + self.mnemonic = None + + @classmethod + def generate_mnemonic(cls, words=12): + return bip39_generate(words) + + @classmethod + def create_from_mnemonic(cls, mnemonic, address_type=42, crypto_type=KeypairType.SR25519): + seed_array = bip39_to_mini_secret(mnemonic, "") + + keypair = cls.create_from_seed( + seed_hex=binascii.hexlify(bytearray(seed_array)).decode("ascii"), + address_type=address_type, + crypto_type=crypto_type + ) + keypair.mnemonic = mnemonic + + return keypair + + @classmethod + def create_from_seed(cls, seed_hex, address_type=42, crypto_type=KeypairType.SR25519): + + if crypto_type == KeypairType.SR25519: + public_key, private_key = sr25519.pair_from_seed(bytes.fromhex(seed_hex.replace('0x', ''))) + elif crypto_type == KeypairType.ED25519: + private_key, public_key = ed25519.ed_from_seed(bytes.fromhex(seed_hex.replace('0x', ''))) + else: + raise ValueError('crypto_type "{}" not supported'.format(crypto_type)) + + public_key = public_key.hex() + private_key = private_key.hex() + + ss58_address = ss58_encode(public_key, address_type) + + return cls( + ss58_address=ss58_address, public_key=public_key, private_key=private_key, + address_type=address_type, crypto_type=crypto_type, seed_hex=seed_hex + ) + + @classmethod + def create_from_uri(cls, suri, address_type=42, crypto_type=KeypairType.SR25519): + + if suri and suri.startswith('/'): + suri = DEV_PHRASE + suri + + suri_regex = re.match(r'^(?P\w+( \w+)*)(?P(//?[^/]+)*)(///(?P.*))?$', suri) + + suri_parts = suri_regex.groupdict() + + if suri_parts['password']: + raise NotImplementedError("Passwords in suri not supported") + + derived_keypair = cls.create_from_mnemonic( + suri_parts['phrase'], address_type=address_type, crypto_type=crypto_type + ) + + if suri_parts['path'] != '': + + derived_keypair.derive_path = suri_parts['path'] + + if crypto_type not in [KeypairType.SR25519]: + raise NotImplementedError('Derivation paths for this crypto type not supported') + + derive_junctions = extract_derive_path(suri_parts['path']) + + child_pubkey = bytes.fromhex(derived_keypair.public_key[2:]) + child_privkey = bytes.fromhex(derived_keypair.private_key[2:]) + + for junction in derive_junctions: + + if junction.is_hard: + + _, child_pubkey, child_privkey = sr25519.hard_derive_keypair( + (junction.chain_code, child_pubkey, child_privkey), + b'' + ) + + else: + + _, child_pubkey, child_privkey = sr25519.derive_keypair( + (junction.chain_code, child_pubkey, child_privkey), + b'' + ) + + derived_keypair = Keypair(public_key=child_pubkey, private_key=child_privkey) + + return derived_keypair + + @classmethod + def create_from_private_key( + cls, private_key, public_key=None, ss58_address=None, address_type=42, crypto_type=KeypairType.SR25519 + ): + return cls( + ss58_address=ss58_address, public_key=public_key, private_key=private_key, + address_type=address_type, crypto_type=crypto_type + ) + + def sign(self, data): + """ + Creates a sr25519 signature with give data + + Parameters + ---------- + data + + Returns + ------- + sr25519 signature + + """ + if type(data) is ScaleBytes: + data = bytes(data.data) + elif data[0:2] == '0x': + data = bytes.fromhex(data[2:]) + else: + data = data.encode() + + if not self.private_key: + raise ConfigurationError('No private key set to create signatures') + + if self.crypto_type == KeypairType.SR25519: + + signature = sr25519.sign((bytes.fromhex(self.public_key[2:]), bytes.fromhex(self.private_key[2:])), data) + elif self.crypto_type == KeypairType.ED25519: + signature = ed25519.ed_sign(bytes.fromhex(self.public_key[2:]), bytes.fromhex(self.private_key[2:]), data) + else: + raise ConfigurationError("Crypto type not supported") + + return "0x{}".format(signature.hex()) + + def verify(self, data, signature): + + if type(data) is ScaleBytes: + data = bytes(data.data) + elif data[0:2] == '0x': + data = bytes.fromhex(data[2:]) + else: + data = data.encode() + + if type(signature) is str and signature[0:2] == '0x': + signature = bytes.fromhex(signature[2:]) + + if type(signature) is not bytes: + raise TypeError("Signature should be of type bytes or a hex-string") + + if self.crypto_type == KeypairType.SR25519: + return sr25519.verify(signature, data, bytes.fromhex(self.public_key[2:])) + elif self.crypto_type == KeypairType.ED25519: + return ed25519.ed_verify(signature, data, bytes.fromhex(self.public_key[2:])) + else: + raise ConfigurationError("Crypto type not supported") + + def __repr__(self): + return ''.format(self.ss58_address) + + +class SubstrateInterface: + + def __init__(self, url, address_type=None, type_registry=None, type_registry_preset="default", cache_region=None): + """ + A specialized class in interfacing with a Substrate node. + + Parameters + ---------- + url: the URL to the substrate node, either in format https://127.0.0.1:9933 or wss://127.0.0.1:9944 + address_type: The address type which account IDs will be SS58-encoded to Substrate addresses. Defaults to 42, for Kusama the address type is 2 + type_registry: A dict containing the custom type registry in format: {'types': {'customType': 'u32'},..} + type_registry_preset: The name of the predefined type registry shipped with the SCALE-codec, e.g. kusama + cache_region: a Dogpile cache region as a central store for the metadata cache + """ + self.cache_region = cache_region + + if type_registry_preset: + # Load type registries in runtime configuration + RuntimeConfiguration().update_type_registry(load_type_registry_preset("default")) + + if type_registry != "default": + RuntimeConfiguration().update_type_registry(load_type_registry_preset(type_registry_preset)) + + if type_registry: + # Load type registries in runtime configuration + RuntimeConfiguration().update_type_registry(type_registry) + + self.request_id = 1 + self.url = url + + self._ws_result = None + + self.address_type = address_type + + self.mock_extrinsics = None + self._version = None + self.default_headers = { + 'content-type': "application/json", + 'cache-control': "no-cache" + } + + self.metadata_decoder = None + + self.runtime_version = None + self.transaction_version = None + + self.block_hash = None + self.block_id = None + + self.metadata_cache = {} + self.type_registry_cache = {} + + self.debug = False + + def debug_message(self, message): + logger.debug(message) + + def rpc_request(self, method, params, result_handler=None): + """ + Method that handles the actual RPC request to the Substrate node. The other implemented functions eventually + use this method to perform the request. + + Parameters + ---------- + result_handler: Callback of function that processes the result received from the node + method: method of the JSONRPC request + params: a list containing the parameters of the JSONRPC request + + Returns + ------- + a dict with the parsed result of the request. + """ + payload = { + "jsonrpc": "2.0", + "method": method, + "params": params, + "id": self.request_id + } + + self.debug_message('RPC request "{}"'.format(method)) + + if self.url[0:6] == 'wss://' or self.url[0:5] == 'ws://': + ws_result = {} + + async def ws_request(ws_payload): + """ + Internal method to handle the request if url is a websocket address (wss:// or ws://) + + Parameters + ---------- + ws_payload: a dict that contains the JSONRPC payload of the request + + Returns + ------- + This method doesn't return but updates the `ws_result` object variable with the result + """ + async with websockets.connect( + self.url, + max_size=2**32, + read_limit=2**32, + write_limit=2**32, + ) as websocket: + await websocket.send(json.dumps(ws_payload)) + + if callable(result_handler): + event_number = 0 + while not ws_result: + result = json.loads(await websocket.recv()) + self.debug_message("Websocket result [{}] Received from node: {}".format(event_number, result)) + + # Check if response has error + if 'error' in result: + raise SubstrateRequestException(result['error']) + + callback_result = result_handler(result) + if callback_result: + ws_result.update(callback_result) + + event_number += 1 + else: + ws_result.update(json.loads(await websocket.recv())) + + if hasattr(asyncio, 'run'): + # Python 3.7+ + asyncio.run(ws_request(payload)) + else: + # Python 3.6 compatibility + loop = asyncio.get_event_loop() + loop.run_until_complete(ws_request(payload)) + + json_body = ws_result + + else: + + if result_handler: + raise ConfigurationError("Result handlers only available for websockets (ws://) connections") + + response = requests.request("POST", self.url, data=json.dumps(payload), headers=self.default_headers) + + if response.status_code != 200: + raise SubstrateRequestException("RPC request failed with HTTP status code {}".format(response.status_code)) + + json_body = response.json() + + return json_body + + def get_system_name(self): + """ + A pass-though to existing JSONRPC method `system_name` + + Returns + ------- + + """ + response = self.rpc_request("system_name", []) + return response.get('result') + + def get_version(self): + """ + A pass-though to existing JSONRPC method `system_version` + + Returns + ------- + + """ + if not self._version: + response = self.rpc_request("system_version", []) + self._version = response.get('result') + return self._version + + def get_chain_head(self): + """ + A pass-though to existing JSONRPC method `chain_getHead` + + Returns + ------- + + """ + response = self.rpc_request("chain_getHead", []) + return response.get('result') + + def get_chain_finalised_head(self): + """ + A pass-though to existing JSONRPC method `chain_getFinalisedHead` + + Returns + ------- + + """ + response = self.rpc_request("chain_getFinalisedHead", []) + return response.get('result') + + def get_chain_block(self, block_hash=None, block_id=None, metadata_decoder=None): + """ + A pass-though to existing JSONRPC method `chain_getBlock`. For a decoded version see `get_runtime_block()` + + Parameters + ---------- + block_hash + block_id + metadata_decoder + + Returns + ------- + + """ + + if block_id: + block_hash = self.get_block_hash(block_id) + + response = self.rpc_request("chain_getBlock", [block_hash]).get('result') + + if self.mock_extrinsics: + # Extend extrinsics with mock_extrinsics for e.g. performance tests + response['block']['extrinsics'].extend(self.mock_extrinsics) + + # Decode extrinsics + if metadata_decoder: + + response['block']['header']['number'] = int(response['block']['header']['number'], 16) + + for idx, extrinsic_data in enumerate(response['block']['extrinsics']): + extrinsic_decoder = ExtrinsicsDecoder( + data=ScaleBytes(extrinsic_data), + metadata=metadata_decoder + ) + extrinsic_decoder.decode() + response['block']['extrinsics'][idx] = extrinsic_decoder.value + + for idx, log_data in enumerate(response['block']['header']["digest"]["logs"]): + log_digest = LogDigest(ScaleBytes(log_data)) + log_digest.decode() + response['block']['header']["digest"]["logs"][idx] = log_digest.value + + return response + + def get_block_hash(self, block_id): + """ + A pass-though to existing JSONRPC method `chain_getBlockHash` + + Parameters + ---------- + block_id + + Returns + ------- + + """ + return self.rpc_request("chain_getBlockHash", [block_id]).get('result') + + def get_block_header(self, block_hash): + """ + A pass-though to existing JSONRPC method `chain_getHeader` + + Parameters + ---------- + block_hash + + Returns + ------- + + """ + response = self.rpc_request("chain_getHeader", [block_hash]) + return response.get('result') + + def get_block_number(self, block_hash): + """ + A convenience method to get the block number for given block_hash + + Parameters + ---------- + block_hash + + Returns + ------- + + """ + response = self.rpc_request("chain_getHeader", [block_hash]) + return int(response['result']['number'], 16) + + def get_block_metadata(self, block_hash=None, decode=True): + """ + A pass-though to existing JSONRPC method `state_getMetadata`. For a decoded version see `get_runtime_metadata()` + + Parameters + ---------- + block_hash + decode: DEPRECATED use `get_runtime_metadata()` for decoded version + + Returns + ------- + + """ + params = None + if block_hash: + params = [block_hash] + response = self.rpc_request("state_getMetadata", params) + + if decode: + metadata_decoder = MetadataDecoder(ScaleBytes(response.get('result'))) + metadata_decoder.decode() + + return metadata_decoder + + return response + + def get_storage(self, block_hash, module, function, params=None, return_scale_type=None, hasher=None, + spec_version_id='default', metadata=None, metadata_version=None): + """ + Retrieves the storage entry for given module, function and optional parameters at given block. + + DEPRECATED: use `get_runtime_state()` + + Parameters + ---------- + block_hash + module + function + params + return_scale_type: Scale type string to interprete result + hasher: Hashing method used to determine storage key, defaults to 'Twox64Concat' if not provided + spec_version_id: DEPRECATED + metadata + metadata_version: Version index of Metadata, e.g. 9 for MetadataV9 + + Returns + ------- + + """ + storage_hash = self.generate_storage_hash( + storage_module=module, + storage_function=function, + params=params, + hasher=hasher, + metadata_version=metadata_version + ) + response = self.rpc_request("state_getStorageAt", [storage_hash, block_hash]) + + if 'result' in response: + + if return_scale_type and response.get('result'): + obj = ScaleDecoder.get_decoder_class( + return_scale_type, + ScaleBytes(response.get('result')), + metadata=metadata + ) + return obj.decode() + else: + return response.get('result') + else: + raise SubstrateRequestException("Error occurred during retrieval of events") + + def get_storage_by_key(self, block_hash, storage_key): + """ + A pass-though to existing JSONRPC method `state_getStorageAt` + + Parameters + ---------- + block_hash + storage_key + + Returns + ------- + + """ + + response = self.rpc_request("state_getStorageAt", [storage_key, block_hash]) + if 'result' in response: + return response.get('result') + else: + raise SubstrateRequestException("Error occurred during retrieval of events") + + def get_block_events(self, block_hash, metadata_decoder=None): + """ + A convenience method to fetch the undecoded events from storage + + Parameters + ---------- + block_hash + metadata_decoder + + Returns + ------- + + """ + + if metadata_decoder and metadata_decoder.version.index >= 9: + storage_hash = STORAGE_HASH_SYSTEM_EVENTS_V9 + else: + storage_hash = STORAGE_HASH_SYSTEM_EVENTS + + response = self.rpc_request("state_getStorageAt", [storage_hash, block_hash]) + + if response.get('result'): + + if metadata_decoder: + # Process events + events_decoder = EventsDecoder( + data=ScaleBytes(response.get('result')), + metadata=metadata_decoder + ) + events_decoder.decode() + + return events_decoder + + else: + return response + else: + raise SubstrateRequestException("Error occurred during retrieval of events") + + def get_block_runtime_version(self, block_hash): + """ + Retrieve the runtime version id of given block_hash + Parameters + ---------- + block_hash + + Returns + ------- + + """ + response = self.rpc_request("chain_getRuntimeVersion", [block_hash]) + return response.get('result') + + def generate_storage_hash(self, storage_module, storage_function, params=None, hasher=None, key2_hasher=None, metadata_version=None): + """ + Generate a storage key for given module/function + + Parameters + ---------- + storage_module + storage_function + params: Parameters of the storage function, provided in scale encoded hex-bytes + hasher: Hashing method used to determine storage key, defaults to 'Twox64Concat' if not provided + metadata_version: Version index of Metadata, e.g. 9 for MetadataV9 + + Returns + ------- + + """ + + if not metadata_version or metadata_version >= 9: + storage_hash = xxh128(storage_module.encode()) + xxh128(storage_function.encode()) + + if params: + + if type(params) is not list: + params = [params] + + for idx, param in enumerate(params): + if idx == 0: + param_hasher = hasher + elif idx == 1: + param_hasher = key2_hasher + else: + raise ValueError('Unexpected third parameter for storage call') + + params_key = bytes() + + if type(param) is str: + params_key += binascii.unhexlify(param) + elif type(param) is ScaleBytes: + params_key += param.data + elif isinstance(param, ScaleDecoder): + params_key += param.data.data + + if not param_hasher: + param_hasher = 'Twox128' + + if param_hasher == 'Blake2_256': + storage_hash += blake2_256(params_key) + + elif param_hasher == 'Blake2_128': + storage_hash += blake2_128(params_key) + + elif param_hasher == 'Blake2_128Concat': + storage_hash += blake2_128_concat(params_key) + + elif param_hasher == 'Twox128': + storage_hash += xxh128(params_key) + + elif param_hasher == 'Twox64Concat': + storage_hash += two_x64_concat(params_key) + + elif param_hasher == 'Identity': + storage_hash += identity(params_key) + + else: + raise ValueError('Unknown storage hasher "{}"'.format(param_hasher)) + + return '0x{}'.format(storage_hash) + + else: + storage_hash = storage_module.encode() + b" " + storage_function.encode() + + if params: + storage_hash += binascii.unhexlify(params) + + # Determine hasher function + if not hasher: + hasher = 'Twox128' + + if hasher == 'Blake2_256': + return "0x{}".format(blake2_256(storage_hash)) + + elif hasher == 'Twox128': + return "0x{}".format(xxh128(storage_hash)) + + elif hasher == 'Twox64Concat': + return "0x{}".format(two_x64_concat(storage_hash)) + + def convert_storage_parameter(self, scale_type, value): + if scale_type == 'AccountId': + if value[0:2] != '0x': + return '0x{}'.format(ss58_decode(value, self.address_type)) + + return value + + # Runtime functions used by Substrate API + + def init_runtime(self, block_hash=None, block_id=None): + """ + This method is used by all other methods that deals with metadata and types defined in the type registry. + It optionally retrieves the block_hash when block_id is given and sets the applicable metadata for that + block_hash. Also it applies all the versioned types at the time of the block_hash. + + Because parsing of metadata and type registry is quite heavy, the result will be cached per runtime id. + In the future there could be support for caching backends like Redis to make this cache more persistent. + + Parameters + ---------- + block_hash + block_id + + Returns + ------- + + """ + + if block_id and block_hash: + raise ValueError('Cannot provide block_hash and block_id at the same time') + + # Check if runtime state already set to current block + if (block_hash and block_hash == self.block_hash) or (block_id and block_id == self.block_id): + return + + if block_id is not None: + block_hash = self.get_block_hash(block_id) + + self.block_hash = block_hash + self.block_id = block_id + + # In fact calls and storage functions are decoded against runtime of previous block, therefor retrieve + # metadata and apply type registry of runtime of parent block + block_header = self.get_block_header(block_hash=self.block_hash) or {} + parent_block_hash = block_header.get('parentHash') + + if parent_block_hash == '0x0000000000000000000000000000000000000000000000000000000000000000': + runtime_block_hash = self.block_hash + else: + runtime_block_hash = parent_block_hash + + runtime_info = self.get_block_runtime_version(block_hash=runtime_block_hash) + + # Check if runtime state already set to current block + if runtime_info.get("specVersion") == self.runtime_version: + return + + self.runtime_version = runtime_info.get("specVersion") + self.transaction_version = runtime_info.get("transactionVersion") + + # Set active runtime version + RuntimeConfiguration().set_active_spec_version_id(self.runtime_version) + + if self.runtime_version not in self.metadata_cache and self.cache_region: + # Try to retrieve metadata from Dogpile cache + cached_metadata = self.cache_region.get('METADATA_{}'.format(self.runtime_version)) + if cached_metadata: + self.debug_message('Retrieved metadata for {} from Redis'.format(self.runtime_version)) + self.metadata_cache[self.runtime_version] = cached_metadata + + if self.runtime_version in self.metadata_cache: + # Get metadata from cache + self.debug_message('Retrieved metadata for {} from memory'.format(self.runtime_version)) + self.metadata_decoder = self.metadata_cache[self.runtime_version] + else: + self.metadata_decoder = self.get_block_metadata(block_hash=runtime_block_hash, decode=True) + self.debug_message('Retrieved metadata for {} from Substrate node'.format(self.runtime_version)) + + # Update metadata cache + self.metadata_cache[self.runtime_version] = self.metadata_decoder + + if self.cache_region: + self.debug_message('Stored metadata for {} in Redis'.format(self.runtime_version)) + self.cache_region.set('METADATA_{}'.format(self.runtime_version), self.metadata_decoder) + + def iterate_map(self, module, storage_function, block_hash=None): + """ + iterates over all key-pairs localted at the given module and storage_function. The storage + item must be a map. + + Parameters + ---------- + module: The module name in the metadata, e.g. Balances or Account. + storage_function: The storage function name, e.g. FreeBalance or AccountNonce. + block_hash: Optional block hash, when left to None the chain tip will be used. + + Returns + ------- + A two dimensional list of key-value pairs, both decoded into the given type, e.g. + [[k1, v1], [k2, v2], ...] + """ + self.init_runtime(block_hash=block_hash) + + key_type = None + value_type = None + concat_hash_len = None + for metadata_module in self.metadata_decoder.metadata.modules: + if metadata_module.name == module: + if metadata_module.storage: + for storage_item in metadata_module.storage.items: + if storage_item.name == storage_function: + if 'MapType' in storage_item.type: + key_type = storage_item.type['MapType']['key'] + value_type = storage_item.type['MapType']['value'] + if storage_item.type['MapType']['hasher'] == "Blake2_128Concat": + concat_hash_len = 32 + elif storage_item.type['MapType']['hasher'] == "Twox64Concat": + concat_hash_len = 16 + else: + raise ValueError('Unsupported hash type') + else: + raise ValueError('Given storage is not a map') + + prefix = self.generate_storage_hash(module, storage_function) + prefix_len = len(prefix) + pairs = self.rpc_request(method="state_getPairs", params=[prefix, block_hash]).get('result') + + # convert keys to the portion that needs to be decoded. + pairs = map(lambda kp: ["0x" + kp[0][prefix_len + concat_hash_len:], kp[1]], pairs) + + # decode both of them + pairs = map( + lambda kp: [self.decode_scale(key_type, kp[0]), self.decode_scale(value_type, kp[1])], + list(pairs) + ) + + return list(pairs) + + def get_runtime_state(self, module, storage_function, params=None, block_hash=None): + """ + Retrieves the storage entry for given module, function and optional parameters at given block hash + + Parameters + ---------- + module: The module name in the metadata, e.g. Balances or Account + storage_function: The storage function name, e.g. FreeBalance or AccountNonce + params: list of params, in the decoded format of the applicable ScaleTypes + block_hash: Optional block hash, when left to None the chain tip will be used + + Returns + ------- + + """ + + self.init_runtime(block_hash=block_hash) + + # Search storage call in metadata + for metadata_module in self.metadata_decoder.metadata.modules: + if metadata_module.name == module: + if metadata_module.storage: + for storage_item in metadata_module.storage.items: + if storage_item.name == storage_function: + + key2_hasher = None + + if 'PlainType' in storage_item.type: + hasher = 'Twox64Concat' + return_scale_type = storage_item.type.get('PlainType') + if params: + raise ValueError('Storage call of type "PlainType" doesn\'t accept params') + + elif 'MapType' in storage_item.type: + + map_type = storage_item.type.get('MapType') + hasher = map_type.get('hasher') + return_scale_type = map_type.get('value') + + if not params or len(params) != 1: + raise ValueError('Storage call of type "MapType" requires 1 parameter') + + # Encode parameter + params[0] = self.convert_storage_parameter(map_type['key'], params[0]) + param_obj = ScaleDecoder.get_decoder_class(map_type['key']) + params[0] = param_obj.encode(params[0]) + + elif 'DoubleMapType' in storage_item.type: + + map_type = storage_item.type.get('DoubleMapType') + hasher = map_type.get('hasher') + key2_hasher = map_type.get('key2Hasher') + return_scale_type = map_type.get('value') + + if not params or len(params) != 2: + raise ValueError('Storage call of type "DoubleMapType" requires 2 parameters') + + # Encode parameter 1 + params[0] = self.convert_storage_parameter(map_type['key1'], params[0]) + param_obj = ScaleDecoder.get_decoder_class(map_type['key1']) + params[0] = param_obj.encode(params[0]) + + # Encode parameter 2 + params[1] = self.convert_storage_parameter(map_type['key2'], params[1]) + param_obj = ScaleDecoder.get_decoder_class(map_type['key2']) + params[1] = param_obj.encode(params[1]) + + else: + raise NotImplementedError("Storage type not implemented") + + storage_hash = self.generate_storage_hash( + storage_module=metadata_module.prefix, + storage_function=storage_function, + params=params, + hasher=hasher, + key2_hasher=key2_hasher, + metadata_version=self.metadata_decoder.version.index + ) + + response = self.rpc_request("state_getStorageAt", [storage_hash, block_hash]) + + if 'result' in response: + + if return_scale_type and response.get('result'): + obj = ScaleDecoder.get_decoder_class( + return_scale_type, + ScaleBytes(response.get('result')), + metadata=self.metadata_decoder + ) + response['result'] = obj.decode() + + return response + + raise StorageFunctionNotFound('Storage function "{}.{}" not found'.format(module, storage_function)) + + def get_runtime_events(self, block_hash=None): + """ + Convenience method to get events for a certain block (storage call for module 'System' and function 'Events') + + Parameters + ---------- + block_hash + + Returns + ------- + Collection of events + """ + return self.get_runtime_state( + module="System", + storage_function="Events", + block_hash=block_hash + ) + + def get_runtime_metadata(self, block_hash=None): + """ + Retrieves and decodes the metadata for given block or chaintip if block_hash is omitted. + + Parameters + ---------- + block_hash + + Returns + ------- + + """ + params = None + if block_hash: + params = [block_hash] + response = self.rpc_request("state_getMetadata", params) + + if 'result' in response: + metadata_decoder = MetadataDecoder(ScaleBytes(response.get('result'))) + response['result'] = metadata_decoder.decode() + + return response + + def compose_call(self, call_module, call_function, call_params=(), block_hash=None): + """ + Composes a call payload which can be used as an unsigned extrinsic or a proposal. + + Parameters + ---------- + call_module: Name of the runtime module e.g. Balances + call_function: Name of the call function e.g. transfer + call_params: This is a dict containing the params of the call. e.g. `{'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', 'value': 1000000000000}` + block_hash + + Returns + ------- + + """ + self.init_runtime(block_hash=block_hash) + + call = ScaleDecoder.get_decoder_class('Call', metadata=self.metadata_decoder) + + call.encode({ + 'call_module': call_module, + 'call_function': call_function, + 'call_args': call_params + }) + + return call + + def get_account_nonce(self, account_address): + response = self.get_runtime_state('System', 'Account', [account_address]) + if response.get('result'): + return response['result'].get('nonce', 0) + + def generate_signature_payload(self, call, era=None, nonce=0, tip=0, include_call_length=False): + + # Retrieve genesis hash + genesis_hash = self.get_block_hash(0) + + if not era: + era = '00' + + if era == '00': + block_hash = genesis_hash + else: + era_obj = ScaleDecoder.get_decoder_class('Era') + era_obj.encode(era) + block_hash = self.get_block_hash(block_id=era_obj.birth(era.get('current'))) + + # Create signature payload + signature_payload = ScaleDecoder.get_decoder_class('ExtrinsicPayloadValue') + + if include_call_length: + + length_obj = RuntimeConfiguration().get_decoder_class('Bytes') + call_data = str(length_obj().encode(str(call.data))) + + else: + call_data = str(call.data) + + payload_dict = { + 'call': call_data, + 'era': era, + 'nonce': nonce, + 'tip': tip, + 'specVersion': self.runtime_version, + 'genesisHash': genesis_hash, + 'blockHash': block_hash + } + + if self.transaction_version is not None: + payload_dict['transactionVersion'] = self.transaction_version + + signature_payload.encode(payload_dict) + + if signature_payload.data.length > 256: + return ScaleBytes(data=blake2b(signature_payload.data.data, digest_size=32).digest()) + + return signature_payload.data + + def create_signed_extrinsic(self, call, keypair: Keypair, era=None, nonce=None, tip=0, signature=None): + """ + Creates a extrinsic signed by given account details + + Parameters + ---------- + signature + era + keypair + call + nonce + tip + + Returns + ------- + ExtrinsicsDecoder The signed Extrinsic + """ + + # Check requirements + if not isinstance(call, GenericCall): + raise TypeError("'call' must be of type Call") + + # Retrieve nonce + if nonce is None: + nonce = self.get_account_nonce(keypair.public_key) or 0 + + # Process era + if era is None: + era = '00' + else: + if isinstance(era, dict) and 'current' not in era and 'phase' not in era: + # Retrieve current block id + era['current'] = self.get_block_number(self.get_chain_finalised_head()) + + if signature is not None: + + signature = signature.replace('0x', '') + + # Check if signature is a MultiSignature and contains signature version + if len(signature) == 130: + signature_version = int(signature[0:2], 16) + signature = '0x{}'.format(signature[2:]) + else: + signature_version = keypair.crypto_type + + else: + # Create signature payload + signature_payload = self.generate_signature_payload(call=call, era=era, nonce=nonce, tip=tip) + + # Set Signature version to crypto type of keypair + signature_version = keypair.crypto_type + + # Sign payload + signature = keypair.sign(signature_payload) + + # Create extrinsic + extrinsic = ScaleDecoder.get_decoder_class('Extrinsic', metadata=self.metadata_decoder) + + extrinsic.encode({ + 'account_id': keypair.public_key, + 'signature_version': signature_version, + 'signature': signature, + 'call_function': call.value['call_function'], + 'call_module': call.value['call_module'], + 'call_args': call.value['call_args'], + 'nonce': nonce, + 'era': era, + 'tip': tip + }) + + # Set extrinsic hash + extrinsic.extrinsic_hash = extrinsic.generate_hash() + + return extrinsic + + def create_unsigned_extrinsic(self, call): + # Create extrinsic + extrinsic = ScaleDecoder.get_decoder_class('Extrinsic', metadata=self.metadata_decoder) + + extrinsic.encode({ + 'call_function': call.value['call_function'], + 'call_module': call.value['call_module'], + 'call_args': call.value['call_args'] + }) + + return extrinsic + + def submit_extrinsic(self, extrinsic, wait_for_inclusion=False, wait_for_finalization=False): + """ + + Parameters + ---------- + extrinsic: ExtrinsicsDecoder The extinsic to be send to the network + wait_for_inclusion: wait until extrinsic is included in a block (only works on websocket connections) + wait_for_finalization: wait until extrinsic is finalized (only works on websocket connections) + + Returns + ------- + The hash of the extrinsic submitted to the network + + """ + + # Check requirements + if extrinsic.__class__.__name__ != 'ExtrinsicsDecoder': + raise TypeError("'extrinsic' must be of type ExtrinsicsDecoder") + + def result_handler(result): + # Check if extrinsic is included and finalized + if 'params' in result and type(result['params']['result']) is dict: + if 'finalized' in result['params']['result'] and wait_for_finalization: + return { + 'block_hash': result['params']['result']['finalized'], + 'extrinsic_hash': '0x{}'.format(extrinsic.extrinsic_hash), + 'finalized': True + } + elif 'inBlock' in result['params']['result'] and wait_for_inclusion and not wait_for_finalization: + return { + 'block_hash': result['params']['result']['inBlock'], + 'extrinsic_hash': '0x{}'.format(extrinsic.extrinsic_hash), + 'finalized': False + } + + if wait_for_inclusion or wait_for_finalization: + response = self.rpc_request( + "author_submitAndWatchExtrinsic", + [str(extrinsic.data)], + result_handler=result_handler + ) + else: + + response = self.rpc_request("author_submitExtrinsic", [str(extrinsic.data)]) + + if 'result' not in response: + raise SubstrateRequestException(response.get('error')) + + response = { + 'extrinsic_hash': response['result'], + 'block_hash': None, + 'finalized': None + } + + return response + + def get_payment_info(self, call, keypair): + """ + Retrieves fee estimation via RPC for given extrinsic + + Parameters + ---------- + call Call object to estimate fees for + keypair Keypair of the sender, does not have to include private key because no valid signature is required + + Returns + ------- + Dict with payment info + + E.g. {'class': 'normal', 'partialFee': 151000000, 'weight': 217238000} + + """ + + # Check requirements + if not isinstance(call, GenericCall): + raise TypeError("'call' must be of type Call") + + if not isinstance(keypair, Keypair): + raise TypeError("'keypair' must be of type Keypair") + + # No valid signature is required for fee estimation + signature = '0x' + '00' * 64 + + # Create extrinsic + extrinsic = self.create_signed_extrinsic( + call=call, + keypair=keypair, + signature=signature + ) + + payment_info = self.rpc_request('payment_queryInfo', [str(extrinsic.data)]) + + # convert partialFee to int + if 'result' in payment_info: + payment_info['result']['partialFee'] = int(payment_info['result']['partialFee']) + return payment_info['result'] + else: + raise SubstrateRequestException(payment_info['error']['message']) + + def process_metadata_typestring(self, type_string): + """ + Process how given type_string is decoded with active runtime and type registry + + Parameters + ---------- + type_string: RUST variable type, e.g. Vec
+ + Returns + ------- + + dict of properties for given type_string + + E.g. + + `{ + "type_string": "Vec
", + "decoder_class": "Vec", + "is_primitive_runtime": false, + "is_primitive_core": false, + "spec_version": 1030 + }` + + """ + decoder_class_obj = None + + type_info = { + "type_string": type_string, + "decoder_class": None, + "is_primitive_runtime": None, + "is_primitive_core": False, + "spec_version": self.runtime_version + } + + if self.runtime_version not in self.type_registry_cache: + self.type_registry_cache[self.runtime_version] = {} + + # Check if already added + if type_string.lower() in self.type_registry_cache[self.runtime_version]: + return self.type_registry_cache[self.runtime_version][type_string.lower()]['decoder_class'] + + # Try to get decoder class + decoder_class = RuntimeConfiguration().get_decoder_class(type_string) + + if not decoder_class: + + # Not in type registry, try get hard coded decoder classes + try: + decoder_class_obj = ScaleDecoder.get_decoder_class(type_string) + decoder_class = decoder_class_obj.__class__ + except NotImplementedError as e: + decoder_class = None + + # Process classes that contain subtypes (e.g. Option) + if decoder_class_obj and decoder_class_obj.sub_type: + type_info["is_primitive_runtime"] = False + + # Try to split on ',' (e.g. ActiveRecovery) + if not re.search('[<()>]', decoder_class_obj.sub_type): + for element in decoder_class_obj.sub_type.split(','): + if element not in ['T', 'I']: + self.process_metadata_typestring(element.strip()) + + # Process classes that contain type_mapping (e.g. Struct and Enum) + if decoder_class and hasattr(decoder_class, 'type_mapping') and decoder_class.type_mapping: + + if type_string[0] == '(': + type_info["is_primitive_runtime"] = False + + for key, data_type in decoder_class.type_mapping: + self.process_metadata_typestring(data_type) + + # Try to get superclass as actual decoding class if not root level 'ScaleType' + if decoder_class and len(decoder_class.__mro__) > 1 and decoder_class.__mro__[1].__name__ != 'ScaleType': + decoder_class = decoder_class.__mro__[1] + + if decoder_class: + type_info['decoder_class'] = decoder_class.__name__ + + if type_info["is_primitive_runtime"] is None: + type_info["is_primitive_runtime"] = True + + if type_info["is_primitive_runtime"] and type_string.lower() in ScaleDecoder.PRIMITIVES: + type_info["is_primitive_core"] = True + else: + type_info["is_primitive_runtime"] = None + type_info["is_primitive_core"] = None + + self.type_registry_cache[self.runtime_version][type_string.lower()] = type_info + + return decoder_class + + def get_type_registry(self, block_hash=None): + """ + Generates an exhaustive list of which RUST types exist in the runtime specified at given block_hash (or + chaintip if block_hash is omitted) + + Parameters + ---------- + block_hash: Chaintip will be used if block_hash is omitted + + Returns + ------- + + """ + self.init_runtime(block_hash=block_hash) + + if self.runtime_version not in self.type_registry_cache: + + for module in self.metadata_decoder.metadata.modules: + + # Storage backwards compt check + if module.storage and isinstance(module.storage, list): + storage_functions = module.storage + elif module.storage and isinstance(getattr(module.storage, 'value'), dict): + storage_functions = module.storage.items + else: + storage_functions = [] + + if len(module.calls or []) > 0: + for idx, call in enumerate(module.calls): + for arg in call.args: + self.process_metadata_typestring(arg.type) + + if len(module.events or []) > 0: + for event_index, event in enumerate(module.events): + + for arg_index, arg in enumerate(event.args): + self.process_metadata_typestring(arg) + + if len(storage_functions) > 0: + for idx, storage in enumerate(storage_functions): + + # Determine type + type_key1 = None + type_key2 = None + type_value = None + + if storage.type.get('PlainType'): + type_value = storage.type.get('PlainType') + + elif storage.type.get('MapType'): + type_key1 = storage.type['MapType'].get('key') + type_value = storage.type['MapType'].get('value') + + elif storage.type.get('DoubleMapType'): + type_key1 = storage.type['DoubleMapType'].get('key1') + type_key2 = storage.type['DoubleMapType'].get('key2') + type_value = storage.type['DoubleMapType'].get('value') + + self.process_metadata_typestring(type_value) + + if type_key1: + self.process_metadata_typestring(type_key1) + + if type_key2: + self.process_metadata_typestring(type_key2) + + if len(module.constants or []) > 0: + for idx, constant in enumerate(module.constants): + + # Check if types already registered in database + self.process_metadata_typestring(constant.type) + + return self.type_registry_cache[self.runtime_version] + + def get_type_definition(self, type_string, block_hash=None): + """ + Retrieves decoding specifications of given type_string + + Parameters + ---------- + type_string: RUST variable type, e.g. Vec
+ block_hash + + Returns + ------- + + """ + type_registry = self.get_type_registry(block_hash=block_hash) + return type_registry.get(type_string.lower()) + + def get_metadata_modules(self, block_hash=None): + """ + Retrieves a list of modules in metadata for given block_hash (or chaintip if block_hash is omitted) + + Parameters + ---------- + block_hash + + Returns + ------- + + """ + self.init_runtime(block_hash=block_hash) + + return [{ + 'metadata_index': idx, + 'module_id': module.get_identifier(), + 'name': module.name, + 'prefix': module.prefix, + 'spec_version': self.runtime_version, + 'count_call_functions': len(module.calls or []), + 'count_storage_functions': len(module.calls or []), + 'count_events': len(module.events or []), + 'count_constants': len(module.constants or []), + 'count_errors': len(module.errors or []), + } for idx, module in enumerate(self.metadata_decoder.metadata.modules)] + + def get_metadata_call_functions(self, block_hash=None): + """ + Retrieves a list of all call functions in metadata active for given block_hash (or chaintip if block_hash is omitted) + + Parameters + ---------- + block_hash + + Returns + ------- + + """ + self.init_runtime(block_hash=block_hash) + + call_list = [] + + for call_index, (module, call) in self.metadata_decoder.call_index.items(): + call_list.append( + self.serialize_module_call( + module, call, self.runtime_version, call_index + ) + ) + return call_list + + def get_metadata_call_function(self, module_name, call_function_name, block_hash=None): + """ + Retrieves the details of a call function given module name, call function name and block_hash + (or chaintip if block_hash is omitted) + + Parameters + ---------- + module_name + call_function_name + block_hash + + Returns + ------- + + """ + self.init_runtime(block_hash=block_hash) + + result = None + + for call_index, (module, call) in self.metadata_decoder.call_index.items(): + if module.name == module_name and \ + call.get_identifier() == call_function_name: + result = self.serialize_module_call( + module, call, self.runtime_version, call_index + ) + break + + return result + + def get_metadata_events(self, block_hash=None): + """ + Retrieves a list of all events in metadata active for given block_hash (or chaintip if block_hash is omitted) + + Parameters + ---------- + block_hash + + Returns + ------- + + """ + + self.init_runtime(block_hash=block_hash) + + event_list = [] + + for event_index, (module, event) in self.metadata_decoder.event_index.items(): + event_list.append( + self.serialize_module_event( + module, event, self.runtime_version, event_index + ) + ) + + return event_list + + def get_metadata_event(self, module_name, event_name, block_hash=None): + """ + Retrieves the details of an event for given module name, call function name and block_hash + (or chaintip if block_hash is omitted) + + Parameters + ---------- + module_name + event_name + block_hash + + Returns + ------- + + """ + + self.init_runtime(block_hash=block_hash) + + for event_index, (module, event) in self.metadata_decoder.event_index.items(): + if module.name == module_name and \ + event.name == event_name: + return self.serialize_module_event( + module, event, self.runtime_version, event_index + ) + + def get_metadata_constants(self, block_hash=None): + """ + Retrieves a list of all constants in metadata active at given block_hash (or chaintip if block_hash is omitted) + + Parameters + ---------- + block_hash + + Returns + ------- + + """ + + self.init_runtime(block_hash=block_hash) + + constant_list = [] + + for module_idx, module in enumerate(self.metadata_decoder.metadata.modules): + for constant in module.constants or []: + constant_list.append( + self.serialize_constant( + constant, module, self.runtime_version + ) + ) + + return constant_list + + def get_metadata_constant(self, module_name, constant_name, block_hash=None): + """ + Retrieves the details of a constant for given module name, call function name and block_hash + (or chaintip if block_hash is omitted) + + Parameters + ---------- + module_name + constant_name + block_hash + + Returns + ------- + + """ + + self.init_runtime(block_hash=block_hash) + + for module_idx, module in enumerate(self.metadata_decoder.metadata.modules): + + if module_name == module.name and module.constants: + + for constant in module.constants: + if constant_name == constant.name: + return self.serialize_constant( + constant, module, self.runtime_version + ) + + def get_metadata_storage_functions(self, block_hash=None): + """ + Retrieves a list of all storage functions in metadata active at given block_hash (or chaintip if block_hash is + omitted) + + Parameters + ---------- + block_hash + + Returns + ------- + + """ + self.init_runtime(block_hash=block_hash) + + storage_list = [] + + for module_idx, module in enumerate(self.metadata_decoder.metadata.modules): + if module.storage: + for storage in module.storage.items: + storage_list.append( + self.serialize_storage_item( + storage_item=storage, + module=module, + spec_version_id=self.runtime_version + ) + ) + + return storage_list + + def get_metadata_storage_function(self, module_name, storage_name, block_hash=None): + """ + Retrieves the details of a storage function for given module name, call function name and block_hash + + Parameters + ---------- + module_name + storage_name + block_hash + + Returns + ------- + + """ + self.init_runtime(block_hash=block_hash) + + for module_idx, module in enumerate(self.metadata_decoder.metadata.modules): + if module.name == module_name and module.storage: + for storage in module.storage.items: + if storage.name == storage_name: + return self.serialize_storage_item( + storage_item=storage, + module=module, + spec_version_id=self.runtime_version + ) + + def get_metadata_errors(self, block_hash=None): + """ + Retrieves a list of all errors in metadata active at given block_hash (or chaintip if block_hash is omitted) + + Parameters + ---------- + block_hash + + Returns + ------- + + """ + self.init_runtime(block_hash=block_hash) + + error_list = [] + + for module_idx, module in enumerate(self.metadata_decoder.metadata.modules): + if module.errors: + for error in module.errors: + error_list.append( + self.serialize_module_error( + module=module, error=error, spec_version=self.runtime_version + ) + ) + + return error_list + + def get_metadata_error(self, module_name, error_name, block_hash=None): + """ + Retrieves the details of an error for given module name, call function name and block_hash + + Parameters + ---------- + module_name + error_name + block_hash + + Returns + ------- + + """ + self.init_runtime(block_hash=block_hash) + + for module_idx, module in enumerate(self.metadata_decoder.metadata.modules): + if module.name == module_name and module.errors: + for error in module.errors: + if error_name == error.name: + return self.serialize_module_error( + module=module, error=error, spec_version=self.runtime_version + ) + + def get_runtime_block(self, block_hash=None, block_id=None): + """ + Retrieves a block with method `chain_getBlock` and in addition decodes extrinsics and log items + + Parameters + ---------- + block_hash + block_id + + Returns + ------- + + """ + self.init_runtime(block_hash=block_hash, block_id=block_id) + + response = self.rpc_request("chain_getBlock", [self.block_hash]).get('result') + + response['block']['header']['number'] = int(response['block']['header']['number'], 16) + + for idx, extrinsic_data in enumerate(response['block']['extrinsics']): + extrinsic_decoder = ExtrinsicsDecoder( + data=ScaleBytes(extrinsic_data), + metadata=self.metadata_decoder + ) + extrinsic_decoder.decode() + response['block']['extrinsics'][idx] = extrinsic_decoder.value + + for idx, log_data in enumerate(response['block']['header']["digest"]["logs"]): + log_digest = LogDigest(ScaleBytes(log_data)) + log_digest.decode() + response['block']['header']["digest"]["logs"][idx] = log_digest.value + + return response + + def decode_scale(self, type_string, scale_bytes, block_hash=None): + """ + Helper function to decode arbitrary SCALE-bytes (e.g. 0x02000000) according to given RUST type_string + (e.g. BlockNumber). The relevant versioning information of the type (if defined) will be applied if block_hash + is set + + Parameters + ---------- + type_string + scale_bytes + block_hash + + Returns + ------- + + """ + self.init_runtime(block_hash=block_hash) + + obj = ScaleDecoder.get_decoder_class(type_string, ScaleBytes(scale_bytes), metadata=self.metadata_decoder) + return obj.decode() + + def encode_scale(self, type_string, value, block_hash=None): + """ + Helper function to encode arbitrary data into SCALE-bytes for given RUST type_string + + Parameters + ---------- + type_string + value + block_hash + + Returns + ------- + + """ + self.init_runtime(block_hash=block_hash) + + obj = ScaleDecoder.get_decoder_class(type_string) + return str(obj.encode(value)) + + # Serializing helper function + + def serialize_storage_item(self, storage_item, module, spec_version_id): + """ + Helper function to serialize a storage item + + Parameters + ---------- + storage_item + module + spec_version_id + + Returns + ------- + + """ + storage_dict = { + "storage_name": storage_item.name, + "storage_modifier": storage_item.modifier, + "storage_fallback_scale": storage_item.fallback, + "storage_fallback": None, + "documentation": '\n'.join(storage_item.docs), + "module_id": module.get_identifier(), + "module_prefix": module.prefix, + "module_name": module.name, + "spec_version": spec_version_id, + "type_key1": None, + "type_key2": None, + "type_hasher_key1": None, + "type_hasher_key2": None, + "type_value": None, + "type_is_linked": None + } + + type_class, type_info = next(iter(storage_item.type.items())) + + storage_dict["type_class"] = type_class + + if type_class == 'PlainType': + storage_dict["type_value"] = type_info + + elif type_class == 'MapType': + storage_dict["type_value"] = type_info["value"] + storage_dict["type_key1"] = type_info["key"] + storage_dict["type_hasher_key1"] = type_info["hasher"] + storage_dict["type_is_linked"] = type_info["isLinked"] + + elif type_class == 'DoubleMapType': + + storage_dict["type_value"] = type_info["value"] + storage_dict["type_key1"] = type_info["key1"] + storage_dict["type_key2"] = type_info["key2"] + storage_dict["type_hasher_key1"] = type_info["hasher"] + storage_dict["type_hasher_key2"] = type_info["key2Hasher"] + + if storage_item.fallback != '0x00': + # Decode fallback + try: + fallback_obj = ScaleDecoder.get_decoder_class(storage_dict["type_value"], + ScaleBytes(storage_item.fallback)) + storage_dict["storage_fallback"] = fallback_obj.decode() + except Exception: + storage_dict["storage_fallback"] = '[decoding error]' + + return storage_dict + + def serialize_constant(self, constant, module, spec_version_id): + """ + Helper function to serialize a constant + + Parameters + ---------- + constant + module + spec_version_id + + Returns + ------- + + """ + try: + value_obj = ScaleDecoder.get_decoder_class(constant.type, + ScaleBytes(constant.constant_value)) + constant_decoded_value = value_obj.decode() + except Exception: + constant_decoded_value = '[decoding error]' + + return { + "constant_name": constant.name, + "constant_type": constant.type, + "constant_value": constant_decoded_value, + "constant_value_scale": constant.constant_value, + "documentation": '\n'.join(constant.docs), + "module_id": module.get_identifier(), + "module_prefix": module.prefix, + "module_name": module.name, + "spec_version": spec_version_id + } + + def serialize_module_call(self, module, call, spec_version, call_index): + """ + Helper function to serialize a call function + + Parameters + ---------- + module + call + spec_version + call_index + + Returns + ------- + + """ + return { + "call_id": call.get_identifier(), + "call_name": call.name, + "call_args": [call_arg.value for call_arg in call.args], + "lookup": '0x{}'.format(call_index), + "documentation": '\n'.join(call.docs), + "module_id": module.get_identifier(), + "module_prefix": module.prefix, + "module_name": module.name, + "spec_version": spec_version + } + + def serialize_module_event(self, module, event, spec_version, event_index): + """ + Helper function to serialize an event + + Parameters + ---------- + module + event + spec_version + event_index + + Returns + ------- + + """ + return { + "event_id": event.name, + "event_name": event.name, + "event_args": [ + { + "event_arg_index": idx, + "type": arg + } for idx, arg in enumerate(event.args) + ], + "lookup": '0x{}'.format(event_index), + "documentation": '\n'.join(event.docs), + "module_id": module.get_identifier(), + "module_prefix": module.prefix, + "module_name": module.name, + "spec_version": spec_version + } + + def serialize_module_error(self, module, error, spec_version): + """ + Helper function to serialize an error + + Parameters + ---------- + module + error + spec_version + + Returns + ------- + + """ + return { + "error_name": error.name, + "documentation": '\n'.join(error.docs), + "module_id": module.get_identifier(), + "module_prefix": module.prefix, + "module_name": module.name, + "spec_version": spec_version + } + + def update_type_registry_presets(self): + try: + update_type_registries() + return True + except Exception: + return False diff --git a/py-substrate-interface/substrateinterface/constants.py b/py-substrate-interface/substrateinterface/constants.py new file mode 100644 index 00000000..4258cf4f --- /dev/null +++ b/py-substrate-interface/substrateinterface/constants.py @@ -0,0 +1,20 @@ +# Python Substrate Interface Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +STORAGE_HASH_SYSTEM_EVENTS = "0xcc956bdb7605e3547539f321ac2bc95c" +STORAGE_HASH_SYSTEM_EVENTS_V9 = "0x26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7" + +DEV_PHRASE = 'bottom drive obey lake curtain smoke basket hold race lonely fit walk' diff --git a/py-substrate-interface/substrateinterface/exceptions.py b/py-substrate-interface/substrateinterface/exceptions.py new file mode 100644 index 00000000..68f483ff --- /dev/null +++ b/py-substrate-interface/substrateinterface/exceptions.py @@ -0,0 +1,27 @@ +# Python Substrate Interface Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +class SubstrateRequestException(Exception): + pass + + +class StorageFunctionNotFound(ValueError): + pass + + +class ConfigurationError(Exception): + pass diff --git a/py-substrate-interface/substrateinterface/key.py b/py-substrate-interface/substrateinterface/key.py new file mode 100644 index 00000000..ab463d20 --- /dev/null +++ b/py-substrate-interface/substrateinterface/key.py @@ -0,0 +1,61 @@ +# Python Substrate Interface Library +# +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import re +from hashlib import blake2b + +from scalecodec import ScaleDecoder + +RE_JUNCTION = r'(\/\/?)([^/]+)' +JUNCTION_ID_LEN = 32 + + +class DeriveJunction: + def __init__(self, chain_code, is_hard=False): + self.chain_code = chain_code + self.is_hard = is_hard + + @classmethod + def from_derive_path(cls, path: str, is_hard=False): + + path_scale = ScaleDecoder.get_decoder_class('Bytes') + path_scale.encode(path) + + if len(path) > JUNCTION_ID_LEN: + chain_code = blake2b(path_scale.data.data, digest_size=32).digest() + else: + chain_code = bytes(path_scale.data.data.ljust(32, b'\x00')) + + return cls(chain_code=chain_code, is_hard=is_hard) + + +def extract_derive_path(derive_path: str): + + path_check = '' + junctions = [] + paths = re.findall(RE_JUNCTION, derive_path) + + if paths: + path_check = ''.join(''.join(path) for path in paths) + + for path_separator, path_value in paths: + junctions.append(DeriveJunction.from_derive_path( + path=path_value, is_hard=path_separator == '//') + ) + + if path_check != derive_path: + raise ValueError('Reconstructed path "{}" does not match input'.format(path_check)) + + return junctions + diff --git a/py-substrate-interface/substrateinterface/utils/__init__.py b/py-substrate-interface/substrateinterface/utils/__init__.py new file mode 100644 index 00000000..d46465a9 --- /dev/null +++ b/py-substrate-interface/substrateinterface/utils/__init__.py @@ -0,0 +1,17 @@ +# Python Substrate Interface Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + diff --git a/py-substrate-interface/substrateinterface/utils/hasher.py b/py-substrate-interface/substrateinterface/utils/hasher.py new file mode 100644 index 00000000..f3b52a5e --- /dev/null +++ b/py-substrate-interface/substrateinterface/utils/hasher.py @@ -0,0 +1,118 @@ +# Python Substrate Interface Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" Helper functions used to calculate keys for Substrate storage items +""" + +from hashlib import blake2b +import xxhash + + +def blake2_256(data): + """ + Helper function to calculate a 32 bytes Blake2b hash for provided data, used as key for Substrate storage items + + Parameters + ---------- + data + + Returns + ------- + + """ + return blake2b(data, digest_size=32).digest().hex() + + +def blake2_128(data): + """ + Helper function to calculate a 16 bytes Blake2b hash for provided data, used as key for Substrate storage items + + Parameters + ---------- + data + + Returns + ------- + + """ + return blake2b(data, digest_size=16).digest().hex() + + +def blake2_128_concat(data): + """ + Helper function to calculate a 16 bytes Blake2b hash for provided data, concatenated with data, used as key + for Substrate storage items + + Parameters + ---------- + data + + Returns + ------- + + """ + return "{}{}".format(blake2b(data, digest_size=16).digest().hex(), data.hex()) + + +def xxh128(data): + """ + Helper function to calculate a 2 concatenated xxh64 hash for provided data, used as key for several Substrate + + Parameters + ---------- + data + + Returns + ------- + + """ + storage_key1 = bytearray(xxhash.xxh64(data, seed=0).digest()) + storage_key1.reverse() + + storage_key2 = bytearray(xxhash.xxh64(data, seed=1).digest()) + storage_key2.reverse() + + return "{}{}".format(storage_key1.hex(), storage_key2.hex()) + + +def two_x64_concat(data): + """ + Helper function to calculate a xxh64 hash with concatenated data for provided data, + used as key for several Substrate + + Parameters + ---------- + data + + Returns + ------- + + """ + storage_key = bytearray(xxhash.xxh64(data, seed=0).digest()) + storage_key.reverse() + + return "{}{}".format(storage_key.hex(), data.hex()) + + +def xxh64(data): + storage_key = bytearray(xxhash.xxh64(data, seed=0).digest()) + storage_key.reverse() + + return "{}".format(storage_key.hex()) + + +def identity(data): + return data.hex() diff --git a/py-substrate-interface/substrateinterface/utils/ss58.py b/py-substrate-interface/substrateinterface/utils/ss58.py new file mode 100644 index 00000000..2ea50520 --- /dev/null +++ b/py-substrate-interface/substrateinterface/utils/ss58.py @@ -0,0 +1,165 @@ +# Python Substrate Interface Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ss58.py + +""" SS58 is a simple address format designed for Substrate based chains. + Encoding/decoding according to specification on https://wiki.parity.io/External-Address-Format-(SS58) + +""" +import base58 +from hashlib import blake2b + +from scalecodec import ScaleBytes +from scalecodec.types import U8, U16, U32, U64 + + +def ss58_decode(address, valid_address_type=None): + """ + Decodes given SS58 encoded address to an account ID + Parameters + ---------- + address: e.g. EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk + valid_address_type + + Returns + ------- + Decoded string AccountId + """ + checksum_prefix = b'SS58PRE' + + ss58_format = base58.b58decode(address) + + if valid_address_type and ss58_format[0] != valid_address_type: + raise ValueError("Invalid Address type") + + # Determine checksum length according to length of address string + if len(ss58_format) in [3, 4, 6, 10]: + checksum_length = 1 + elif len(ss58_format) in [5, 7, 11, 35]: + checksum_length = 2 + elif len(ss58_format) in [8, 12]: + checksum_length = 3 + elif len(ss58_format) in [9, 13]: + checksum_length = 4 + elif len(ss58_format) in [14]: + checksum_length = 5 + elif len(ss58_format) in [15]: + checksum_length = 6 + elif len(ss58_format) in [16]: + checksum_length = 7 + elif len(ss58_format) in [17]: + checksum_length = 8 + else: + raise ValueError("Invalid address length") + + checksum = blake2b(checksum_prefix + ss58_format[0:-checksum_length]).digest() + + if checksum[0:checksum_length] != ss58_format[-checksum_length:]: + raise ValueError("Invalid checksum") + + return ss58_format[1:len(ss58_format)-checksum_length].hex() + + +def ss58_encode(address, address_type=42): + """ + Encodes an account ID to an Substrate address according to provided address_type + + Parameters + ---------- + address + address_type + + Returns + ------- + + """ + checksum_prefix = b'SS58PRE' + + if type(address) is bytes or type(address) is bytearray: + address_bytes = address + else: + address_bytes = bytes.fromhex(address.replace('0x', '')) + + if len(address_bytes) == 32: + # Checksum size is 2 bytes for public key + checksum_length = 2 + elif len(address_bytes) in [1, 2, 4, 8]: + # Checksum size is 1 byte for account index + checksum_length = 1 + else: + raise ValueError("Invalid length for address") + + address_format = bytes([address_type]) + address_bytes + checksum = blake2b(checksum_prefix + address_format).digest() + + return base58.b58encode(address_format + checksum[:checksum_length]).decode() + + +def ss58_encode_account_index(account_index, address_type=42): + """ + Encodes an AccountIndex to an Substrate address according to provided address_type + + Parameters + ---------- + account_index + address_type + + Returns + ------- + + """ + + if 0 <= account_index <= 2**8 - 1: + account_idx_encoder = U8() + elif 2**8 <= account_index <= 2**16 - 1: + account_idx_encoder = U16() + elif 2**16 <= account_index <= 2**32 - 1: + account_idx_encoder = U32() + elif 2**32 <= account_index <= 2**64 - 1: + account_idx_encoder = U64() + else: + raise ValueError("Value too large for an account index") + + return ss58_encode(account_idx_encoder.encode(account_index).data, address_type) + + +def ss58_decode_account_index(address, valid_address_type=42): + """ + Decodes given SS58 encoded address to an AccountIndex + + Parameters + ---------- + address + valid_address_type + + Returns + ------- + Decoded int AccountIndex + """ + account_index_bytes = ss58_decode(address, valid_address_type) + + if len(account_index_bytes) == 2: + return U8(ScaleBytes('0x{}'.format(account_index_bytes))).decode() + if len(account_index_bytes) == 4: + return U16(ScaleBytes('0x{}'.format(account_index_bytes))).decode() + if len(account_index_bytes) == 8: + return U32(ScaleBytes('0x{}'.format(account_index_bytes))).decode() + if len(account_index_bytes) == 16: + return U64(ScaleBytes('0x{}'.format(account_index_bytes))).decode() + else: + raise ValueError("Invalid account index length") + diff --git a/py-substrate-interface/test.py b/py-substrate-interface/test.py new file mode 100644 index 00000000..c6e28c8b --- /dev/null +++ b/py-substrate-interface/test.py @@ -0,0 +1,43 @@ +from substrateinterface import SubstrateInterface +from substrateinterface.utils.ss58 import ss58_encode + +substrate = SubstrateInterface( + # url="http://78.47.58.121:9933/", + url="wss://pme.polymath.network/", + address_type=2, + type_registry_preset='polymesh' +) + +# Set block_hash to None for chaintip +block_hash = "0x0a432dd8441621bc2985caa36d10c241170a2d43e764845438069b1caf1eae77" +block_hash = "0xe23e1d389d453935dfe6ee532e06c0930ab51b3e1beaf948d8529f74e68c985b" + +metadata_decoder = substrate.get_block_metadata(block_hash=block_hash, decode=True) +# Retrieve extrinsics in block +result = substrate.get_block_events(block_hash=block_hash, metadata_decoder=metadata_decoder) + +print(result) + +# for extrinsic in result['block']['extrinsics']: + +# if 'account_id' in extrinsic: +# signed_by_address = ss58_encode(address=extrinsic['account_id'], address_type=2) +# else: +# signed_by_address = None + +# print('\nModule: {}\nCall: {}\nSigned by: {}'.format( +# extrinsic['call_module'], +# extrinsic['call_function'], +# signed_by_address +# )) + +# # Loop through params +# for param in extrinsic['params']: + +# if param['type'] == 'Address': +# param['value'] = ss58_encode(address=param['value'], address_type=2) + +# if param['type'] == 'Compact': +# param['value'] = '{} DOT'.format(param['value'] / 10**12) + +# print("Param '{}': {}".format(param['name'], param['value'])) \ No newline at end of file diff --git a/py-substrate-interface/test/__init__.py b/py-substrate-interface/test/__init__.py new file mode 100644 index 00000000..2f78799b --- /dev/null +++ b/py-substrate-interface/test/__init__.py @@ -0,0 +1,15 @@ +# Python Substrate Interface Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/py-substrate-interface/test/fixtures.py b/py-substrate-interface/test/fixtures.py new file mode 100644 index 00000000..68dc92cb --- /dev/null +++ b/py-substrate-interface/test/fixtures.py @@ -0,0 +1,20 @@ +# Python Substrate Interface Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +metadata_v10_hex = "0x6d6574610a701853797374656d011853797374656d34304163636f756e744e6f6e636501010130543a3a4163636f756e74496420543a3a496e646578001000000000047c2045787472696e73696373206e6f6e636520666f72206163636f756e74732e3845787472696e736963436f756e7400000c753332040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e4c416c6c45787472696e73696373576569676874000018576569676874040004150120546f74616c2077656967687420666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e40416c6c45787472696e736963734c656e00000c753332040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b4861736801010138543a3a426c6f636b4e756d6265721c543a3a48617368008000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101010c7533321c5665633c75383e000400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d626572010038543a3a426c6f636b4e756d6265721000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e3845787472696e73696373526f6f7401001c543a3a486173688000000000000000000000000000000000000000000000000000000000000000000415012045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e1844696765737401002c4469676573744f663c543e040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301008c5665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e040004a0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e284576656e74436f756e740100284576656e74496e646578100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f706963730101011c543a3a48617368845665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e000400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e011c2866696c6c5f626c6f636b0004210120412062696720646973706174636820746861742077696c6c20646973616c6c6f7720616e79206f74686572207472616e73616374696f6e20746f20626520696e636c756465642e1872656d61726b041c5f72656d61726b1c5665633c75383e046c204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e387365745f686561705f7061676573041470616765730c75363404fc2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040c6e65771c5665633c75383e04482053657420746865206e657720636f64652e2c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e046c2053657420736f6d65206974656d73206f662073746f726167652e306b696c6c5f73746f7261676504106b657973205665633c4b65793e0478204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e2c6b696c6c5f70726566697804187072656669780c4b6579041501204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e01084045787472696e7369635375636365737304304469737061746368496e666f049420416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c6564083444697370617463684572726f72304469737061746368496e666f045420416e2065787472696e736963206661696c65642e00006052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100305665633c543a3a486173683e04000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e000000001042616265011042616265242845706f6368496e64657801000c75363420000000000000000004542043757272656e742065706f636820696e6465782e2c417574686f72697469657301009c5665633c28417574686f7269747949642c2042616265417574686f72697479576569676874293e0400046c2043757272656e742065706f636820617574686f7269746965732e2c47656e65736973536c6f7401000c75363420000000000000000008f82054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e205468697320697320309020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2c43757272656e74536c6f7401000c75363420000000000000000004542043757272656e7420736c6f74206e756d6265722e2852616e646f6d6e6573730100205b75383b2033325d80000000000000000000000000000000000000000000000000000000000000000028b8205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e002c20232053656375726974790005012054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061f8206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e7915012063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d6265727320746861742074686973150120286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e206265050120757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e0d01206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e384e65787452616e646f6d6e6573730100205b75383b2033325d800000000000000000000000000000000000000000000000000000000000000000045c204e6578742065706f63682072616e646f6d6e6573732e305365676d656e74496e64657801000c7533321000000000247c2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e00f4205765206d616b6520612074726164656f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e01012057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f942060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e00ec204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e090120576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572791c2065706f63682e44556e646572436f6e737472756374696f6e0101010c753332345665633c5b75383b2033325d3e000400002c496e697469616c697a65640000204d6179626556726604000801012054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d65601d01206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e010000083445706f63684475726174696f6e0c753634205802000000000000080d0120546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746ffc2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e444578706563746564426c6f636b54696d6524543a3a4d6f6d656e7420701700000000000014050120546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e67110120626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f75740501207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f740901206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473a0207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e002454696d657374616d70012454696d657374616d70080c4e6f77010024543a3a4d6f6d656e7420000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e24446964557064617465010010626f6f6c040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01040c736574040c6e6f7748436f6d706163743c543a3a4d6f6d656e743e245820536574207468652063757272656e742074696d652e00590120546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed82070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e004501205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e74207370656369666965642062794420604d696e696d756d506572696f64602e00d820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e0004344d696e696d756d506572696f6424543a3a4d6f6d656e7420b80b00000000000010690120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f64690120746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c79650120776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c6520746869737020706572696f64206f6e2064656661756c742073657474696e67732e001c496e6469636573011c496e6469636573082c4e657874456e756d53657401003c543a3a4163636f756e74496e6465781000000000047c20546865206e657874206672656520656e756d65726174696f6e207365742e1c456e756d5365740101013c543a3a4163636f756e74496e646578445665633c543a3a4163636f756e7449643e00040004582054686520656e756d65726174696f6e20736574732e010001043c4e65774163636f756e74496e64657808244163636f756e744964304163636f756e74496e64657810882041206e6577206163636f756e7420696e646578207761732061737369676e65642e0005012054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e65646020746f20616e6f7468657220604163636f756e744964602e00002042616c616e636573012042616c616e6365731434546f74616c49737375616e6365010028543a3a42616c616e6365400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e1c56657374696e6700010130543a3a4163636f756e744964ac56657374696e675363686564756c653c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e00040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e2c4672656542616c616e636501010130543a3a4163636f756e74496428543a3a42616c616e63650040000000000000000000000000000000002c9c20546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e004101205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e204974750120616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e207468697355012062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069733d012064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b450120697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f636961746564207769746854207468652064656c65746564206163636f756e742e00750120606672616d655f73797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473150120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e3c526573657276656442616c616e636501010130543a3a4163636f756e74496428543a3a42616c616e63650040000000000000000000000000000000002c75012054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c206765749c20736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e006d0120546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e732501207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e007501205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e7427b42069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e00650120606672616d655f73797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f2067657473190120636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e29144c6f636b7301010130543a3a4163636f756e744964b05665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e00040004b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e0110207472616e736665720810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e64d8205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e00090120607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e21012049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e1501204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b4206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e00190120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e002c2023203c7765696768743e3101202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72cc202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e6901202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e004c2052656c617465642066756e6374696f6e733a0051012020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2d012020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365d420202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642edc2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765725901202020202060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e6365646020616e642060543a3a4f6e4672656542616c616e63655a65726f3a3a6f6e5f667265655f62616c616e63655f7a65726f602e49012020202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616cf82020202020636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e00302023203c2f7765696768743e2c7365745f62616c616e63650c0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365206e65775f667265654c436f6d706163743c543a3a42616c616e63653e306e65775f72657365727665644c436f6d706163743c543a3a42616c616e63653e349420536574207468652062616c616e636573206f66206120676976656e206163636f756e742e00210120546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c090120616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e190120496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c01012069742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e00b420546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e002c2023203c7765696768743e80202d20496e646570656e64656e74206f662074686520617267756d656e74732ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e302023203c2f7765696768743e38666f7263655f7472616e736665720c18736f757263658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636510646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e0851012045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d61792062652c207370656369666965642e4c7472616e736665725f6b6565705f616c6976650810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e1851012053616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c2074686540206f726967696e206163636f756e742e00bc20393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e00c4205b607472616e73666572605d3a207374727563742e4d6f64756c652e68746d6c236d6574686f642e7472616e736665720114284e65774163636f756e7408244163636f756e7449641c42616c616e6365046c2041206e6577206163636f756e742077617320637265617465642e345265617065644163636f756e7408244163636f756e7449641c42616c616e6365045c20416e206163636f756e7420776173207265617065642e205472616e7366657210244163636f756e744964244163636f756e7449641c42616c616e63651c42616c616e636504b0205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e2842616c616e63655365740c244163636f756e7449641c42616c616e63651c42616c616e636504c420412062616c616e6365207761732073657420627920726f6f74202877686f2c20667265652c207265736572766564292e1c4465706f73697408244163636f756e7449641c42616c616e636504dc20536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e0c484578697374656e7469616c4465706f73697428543a3a42616c616e63654000e40b5402000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2c5472616e7366657246656528543a3a42616c616e63654000e40b540200000000000000000000000494205468652066656520726571756972656420746f206d616b652061207472616e736665722e2c4372656174696f6e46656528543a3a42616c616e63654000e40b54020000000000000000000000049c205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e203856657374696e6742616c616e6365049c2056657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c7565544c69717569646974795265737472696374696f6e7304c8204163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c204f766572666c6f77047420476f7420616e206f766572666c6f7720616674657220616464696e674c496e73756666696369656e7442616c616e636504782042616c616e636520746f6f206c6f7720746f2073656e642076616c7565484578697374656e7469616c4465706f73697404ec2056616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f736974244b656570416c6976650490205472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e745c4578697374696e6756657374696e675363686564756c6504cc20412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742c446561644163636f756e74048c2042656e6566696369617279206163636f756e74206d757374207072652d6578697374485472616e73616374696f6e5061796d656e74012042616c616e63657304444e6578744665654d756c7469706c6965720100284d756c7469706c69657220000000000000000000000008485472616e73616374696f6e426173654665653042616c616e63654f663c543e4000e40b5402000000000000000000000004dc205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e485472616e73616374696f6e427974654665653042616c616e63654f663c543e4000e1f505000000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e0028417574686f72736869700128417574686f72736869700c18556e636c65730100e85665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e0400041c20556e636c657318417574686f72000030543a3a4163636f756e7449640400046420417574686f72206f662063757272656e7420626c6f636b2e30446964536574556e636c6573010010626f6f6c040004bc205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e0104287365745f756e636c657304286e65775f756e636c6573385665633c543a3a4865616465723e04642050726f76696465206120736574206f6620756e636c65732e00001c48496e76616c6964556e636c65506172656e74048c2054686520756e636c6520706172656e74206e6f7420696e2074686520636861696e2e40556e636c6573416c7265616479536574048420556e636c657320616c72656164792073657420696e2074686520626c6f636b2e34546f6f4d616e79556e636c6573044420546f6f206d616e7920756e636c65732e3047656e65736973556e636c6504582054686520756e636c652069732067656e657369732e30546f6f48696768556e636c6504802054686520756e636c6520697320746f6f206869676820696e20636861696e2e50556e636c65416c7265616479496e636c75646564047c2054686520756e636c6520697320616c726561647920696e636c756465642e204f6c64556e636c6504b82054686520756e636c652069736e277420726563656e7420656e6f75676820746f20626520696e636c756465642e1c5374616b696e67011c5374616b696e67683856616c696461746f72436f756e7401000c753332100000000004a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e7401000c7533321004000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e34496e76756c6e657261626c65730100445665633c543a3a4163636f756e7449643e04000c590120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e636520746865792772654d01206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f7572ac20696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e64656400010130543a3a4163636f756e74496430543a3a4163636f756e744964000400040101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e184c656467657200010130543a3a4163636f756e744964a45374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e14506179656501010130543a3a4163636f756e7449644452657761726444657374696e6174696f6e00040004e42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e2856616c696461746f727301010130543a3a4163636f756e7449643856616c696461746f72507265667301040004450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e284e6f6d696e61746f727300010130543a3a4163636f756e744964644e6f6d696e6174696f6e733c543a3a4163636f756e7449643e01040010650120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e003501204e4f54453a206973207072697661746520736f20746861742077652063616e20656e73757265207570677261646564206265666f726520616c6c207479706963616c2061636365737365732ed8204469726563742073746f7261676520415049732063616e207374696c6c2062797061737320746869732070726f74656374696f6e2e1c5374616b65727301010130543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000c000000104d01204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e277420697465726174651901207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e207468652053657373696f6e206d6f64756c652e00902054686973206973206b6579656420627920746865207374617368206163636f756e742e3843757272656e74456c65637465640100445665633c543a3a4163636f756e7449643e040004fc205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e2843757272656e74457261010020457261496e6465781000000000045c205468652063757272656e742065726120696e6465782e3c43757272656e74457261537461727401002c4d6f6d656e744f663c543e200000000000000000047820546865207374617274206f66207468652063757272656e74206572612e6c43757272656e74457261537461727453657373696f6e496e64657801003053657373696f6e496e646578100000000004d0205468652073657373696f6e20696e646578206174207768696368207468652063757272656e742065726120737461727465642e5843757272656e74457261506f696e74734561726e6564010024457261506f696e7473140000000000040d01205265776172647320666f72207468652063757272656e74206572612e205573696e6720696e6469636573206f662063757272656e7420656c6563746564207365742e24536c6f745374616b6501003042616c616e63654f663c543e40000000000000000000000000000000000c31012054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e00c02054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e20466f72636545726101001c466f7263696e670400041d01205472756520696620746865206e6578742073657373696f6e206368616e67652077696c6c2062652061206e657720657261207265676172646c657373206f6620696e6465782e4c536c6173685265776172644672616374696f6e01001c50657262696c6c10000000000cf8205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e00e4205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e4c43616e63656c6564536c6173685061796f757401003042616c616e63654f663c543e40000000000000000000000000000000000815012054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e7420776869636820776173ec2063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e40556e6170706c696564536c617368657301010120457261496e646578bc5665633c556e6170706c696564536c6173683c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3e00040004c420416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e28426f6e646564457261730100745665633c28457261496e6465782c2053657373696f6e496e646578293e04000425012041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e4c56616c696461746f72536c617368496e45726100020120457261496e64657830543a3a4163636f756e7449645c2850657262696c6c2c2042616c616e63654f663c543e2903040008450120416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e7020616e6420736c6173682076616c7565206f6620746865206572612e4c4e6f6d696e61746f72536c617368496e45726100020120457261496e64657830543a3a4163636f756e7449643042616c616e63654f663c543e03040004610120416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e34536c617368696e675370616e7300010130543a3a4163636f756e7449645c736c617368696e673a3a536c617368696e675370616e73000400048c20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e245370616e536c6173680101018c28543a3a4163636f756e7449642c20736c617368696e673a3a5370616e496e6465782988736c617368696e673a3a5370616e5265636f72643c42616c616e63654f663c543e3e00800000000000000000000000000000000000000000000000000000000000000000083d01205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2cb82061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e584561726c69657374556e6170706c696564536c617368000020457261496e646578040004fc20546865206561726c696573742065726120666f72207768696368207765206861766520612070656e64696e672c20756e6170706c69656420736c6173682e3853746f7261676556657273696f6e01000c75333210000000000490205468652076657273696f6e206f662073746f7261676520666f7220757067726164652e014410626f6e640c28636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e1470617965654452657761726444657374696e6174696f6e3c65012054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c8420626520746865206163636f756e74207468617420636f6e74726f6c732069742e003101206076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e00250120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e002c2023203c7765696768743ed4202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e20202d204f2831292e68202d20546872656520657874726120444220656e74726965732e006d01204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e656420756e6c65737325012074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e302023203c2f7765696768743e28626f6e645f657874726104386d61785f6164646974696f6e616c54436f6d706163743c42616c616e63654f663c543e3e3865012041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e63652075703420666f72207374616b696e672e00510120557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e650120556e6c696b65205b60626f6e64605d206f72205b60756e626f6e64605d20746869732066756e6374696f6e20646f6573206e6f7420696d706f736520616e79206c696d69746174696f6e206f6e2074686520616d6f756e744c20746861742063616e2062652061646465642e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e20202d204f2831292e40202d204f6e6520444220656e7472792e302023203c2f7765696768743e18756e626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e5c5501205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64010120706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e250120543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e004901204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665c0207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e003d01204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360293d012063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e656564fc20746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e00982053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e002c2023203c7765696768743e4101202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e6501202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e63656029710120202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652ea501202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c656420766961206077697468647261775f756e626f6e646564602e40202d204f6e6520444220656e7472792e28203c2f7765696768743e187265626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e18e0205265626f6e64206120706f7274696f6e206f6620746865207374617368207363686564756c656420746f20626520756e6c6f636b65642e002c2023203c7765696768743ef0202d2054696d6520636f6d706c65786974793a204f2831292e20426f756e64656420627920604d41585f554e4c4f434b494e475f4348554e4b53602ef4202d2053746f72616765206368616e6765733a2043616e277420696e6372656173652073746f726167652c206f6e6c792064656372656173652069742e302023203c2f7765696768743e4477697468647261775f756e626f6e64656400402d012052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e003501205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4c2077686174657665722069742077616e74732e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e006c2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e002c2023203c7765696768743e5501202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e45012020497420696d706c6965732060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c207768696368206973f42020696e6469726563746c7920757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e7901202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e2076616c6964617465041470726566733856616c696461746f7250726566732ce8204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e206e6f6d696e617465041c74617267657473a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e2c1101204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743e2501202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f66206074617267657473602c982077686963682069732063617070656420617420604d41585f4e4f4d494e4154494f4e53602ed8202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e302023203c2f7765696768743e146368696c6c002cc8204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e54202d20436f6e7461696e73206f6e6520726561642ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e247365745f7061796565041470617965654452657761726444657374696e6174696f6e2cb8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e387365745f636f6e74726f6c6c65720428636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652c90202852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e302023203c2f7765696768743e4c7365745f76616c696461746f725f636f756e74040c6e657730436f6d706163743c7533323e04802054686520696465616c206e756d626572206f662076616c696461746f72732e34666f7263655f6e6f5f657261730014b020466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e302023203c2f7765696768743e34666f7263655f6e65775f65726100184d0120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c206265a020726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e302023203c2f7765696768743e447365745f696e76756c6e657261626c6573042876616c696461746f7273445665633c543a3a4163636f756e7449643e04cc20536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e34666f7263655f756e7374616b650414737461736830543a3a4163636f756e744964040d0120466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e50666f7263655f6e65775f6572615f616c776179730014050120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e002c2023203c7765696768743e50202d204f6e652073746f72616765207772697465302023203c2f7765696768743e5463616e63656c5f64656665727265645f736c617368080c65726120457261496e64657834736c6173685f696e6469636573205665633c7533323e1c45012043616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e2043616e2062652063616c6c6564206279206569746865722074686520726f6f74206f726967696e206f7270207468652060543a3a536c61736843616e63656c4f726967696e602e05012070617373696e67207468652065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e002c2023203c7765696768743e54202d204f6e652073746f726167652077726974652e302023203c2f7765696768743e010c18526577617264081c42616c616e63651c42616c616e636508510120416c6c2076616c696461746f72732068617665206265656e207265776172646564206279207468652066697273742062616c616e63653b20746865207365636f6e64206973207468652072656d61696e6465728c2066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642e14536c61736808244163636f756e7449641c42616c616e6365042501204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e684f6c64536c617368696e675265706f7274446973636172646564043053657373696f6e496e646578081d0120416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c6448206e6f742062652070726f6365737365642e083853657373696f6e735065724572613053657373696f6e496e64657810060000000470204e756d626572206f662073657373696f6e7320706572206572612e3c426f6e64696e674475726174696f6e20457261496e646578101c00000004e4204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e28344e6f74436f6e74726f6c6c65720468204e6f74206120636f6e74726f6c6c6572206163636f756e742e204e6f7453746173680454204e6f742061207374617368206163636f756e742e34416c7265616479426f6e646564046420537461736820697320616c726561647920626f6e6465642e34416c7265616479506169726564047820436f6e74726f6c6c657220697320616c7265616479207061697265642e30456d70747954617267657473046420546172676574732063616e6e6f7420626520656d7074792e384475706c6963617465496e6465780444204475706c696361746520696e6465782e44496e76616c6964536c617368496e646578048820536c617368207265636f726420696e646578206f7574206f6620626f756e64732e44496e73756666696369656e7456616c756504cc2043616e206e6f7420626f6e6420776974682076616c7565206c657373207468616e206d696e696d756d2062616c616e63652e304e6f4d6f72654368756e6b7304942043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e344e6f556e6c6f636b4368756e6b04a42043616e206e6f74207265626f6e6420776974686f757420756e6c6f636b696e67206368756e6b732e204f6666656e63657301204f6666656e6365730c1c5265706f727473000101345265706f727449644f663c543ed04f6666656e636544657461696c733c543a3a4163636f756e7449642c20543a3a4964656e74696669636174696f6e5475706c653e00040004490120546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e58436f6e63757272656e745265706f727473496e646578010201104b696e64384f706171756554696d65536c6f74485665633c5265706f727449644f663c543e3e010400042901204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e485265706f72747342794b696e64496e646578010101104b696e641c5665633c75383e00040018110120456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e00bc20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e004901204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f66690120646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e010001041c4f6666656e636508104b696e64384f706171756554696d65536c6f7408550120546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e64390120286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e00001c53657373696f6e011c53657373696f6e1c2856616c696461746f727301004c5665633c543a3a56616c696461746f7249643e0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e64657801003053657373696f6e496e646578100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e676564010010626f6f6c040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b6579730100785665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e0400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f72730100205665633c7533323e04000c8020496e6469636573206f662064697361626c65642076616c696461746f72732e003501205468652073657420697320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e732061206e657720736574206f66206964656e7469746965732e204e6578744b6579730002051c5665633c75383e38543a3a56616c696461746f7249641c543a3a4b657973010400109c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e00590120546865206669727374206b657920697320616c77617973206044454455505f4b45595f5052454649586020746f206861766520616c6c20746865206461746120696e207468652073616d65206272616e6368206f6661012074686520747269652e20486176696e6720616c6c206461746120696e207468652073616d65206272616e63682073686f756c642070726576656e7420736c6f77696e6720646f776e206f7468657220717565726965732e204b65794f776e65720002051c5665633c75383e50284b65795479706549642c205665633c75383e2938543a3a56616c696461746f72496401040010250120546865206f776e6572206f662061206b65792e20546865207365636f6e64206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e00590120546865206669727374206b657920697320616c77617973206044454455505f4b45595f5052454649586020746f206861766520616c6c20746865206461746120696e207468652073616d65206272616e6368206f6661012074686520747269652e20486176696e6720616c6c206461746120696e207468652073616d65206272616e63682073686f756c642070726576656e7420736c6f77696e6720646f776e206f7468657220717565726965732e0104207365745f6b65797308106b6579731c543a3a4b6579731470726f6f661c5665633c75383e28e42053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b6579602e210120416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec4205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d420546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002c2023203c7765696768743e88202d204f286c6f67206e2920696e206e756d626572206f66206163636f756e74732e58202d204f6e6520657874726120444220656e7472792e302023203c2f7765696768743e0104284e657753657373696f6e043053657373696f6e496e646578085501204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b88206e756d626572206173207468652074797065206d6967687420737567676573742e044044454455505f4b45595f50524546495814265b75385d38343a73657373696f6e3a6b6579730865012055736564206173206669727374206b657920666f7220604e6578744b6579736020616e6420604b65794f776e65726020746f2070757420616c6c20746865206461746120696e746f207468652073616d65206272616e636834206f662074686520747269652e0c30496e76616c696450726f6f66046420496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f72496404a0204e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b657904682052656769737465726564206475706c6963617465206b65792e3c46696e616c697479547261636b65720001042866696e616c5f68696e74041068696e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08f42048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a65646c20626c6f636b2069732074686520676976656e206e756d6265722e00082857696e646f7753697a6538543a3a426c6f636b4e756d626572106500000004190120546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e345265706f72744c6174656e637938543a3a426c6f636b4e756d62657210e8030000041d01205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e0838416c72656164795570646174656404c82046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b1c42616448696e7404902046696e616c697a6564206865696768742061626f766520626c6f636b206e756d6265721c4772616e647061013c4772616e64706146696e616c6974791c2c417574686f726974696573010034417574686f726974794c6973740400102c20444550524543415445440061012054686973207573656420746f2073746f7265207468652063757272656e7420617574686f72697479207365742c20776869636820686173206265656e206d6967726174656420746f207468652077656c6c2d6b6e6f776e94204752414e4450415f415554484f52495445535f4b455920756e686173686564206b65792e14537461746501006c53746f72656453746174653c543a3a426c6f636b4e756d6265723e04000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e676500008c53746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000038543a3a426c6f636b4e756d626572040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c656400008028543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d626572290400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e7453657449640100145365744964200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e0001011453657449643053657373696f6e496e64657800040004c1012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f7220776869636820697473206d656d62657273207765726520726573706f6e7369626c652e0104487265706f72745f6d69736265686176696f72041c5f7265706f72741c5665633c75383e0464205265706f727420736f6d65206d69736265686176696f722e010c384e6577417574686f7269746965730434417574686f726974794c6973740490204e657720617574686f726974792073657420686173206265656e206170706c6965642e1850617573656400049c2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640004a02043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e00102c50617573654661696c656408090120417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665a8202865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e30526573756d654661696c656408150120417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e277420706175736564a42028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e344368616e676550656e64696e6704ec20417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e1c546f6f536f6f6e04c02043616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e20496d4f6e6c696e650120496d4f6e6c696e651020476f737369704174010038543a3a426c6f636b4e756d626572100000000004a02054686520626c6f636b206e756d626572207768656e2077652073686f756c6420676f737369702e104b65797301004c5665633c543a3a417574686f7269747949643e040004d0205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e485265636569766564486561727462656174730002013053657373696f6e496e6465782441757468496e6465781c5665633c75383e01040008e420466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206041757468496e646578608c20746f20606f6666636861696e3a3a4f70617175654e6574776f726b5374617465602e38417574686f726564426c6f636b730102013053657373696f6e496e64657838543a3a56616c696461746f7249640c75333201100000000008150120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f662060543a3a56616c696461746f7249646020746f20746865c8206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e0104246865617274626561740824686561727462656174644865617274626561743c543a3a426c6f636b4e756d6265723e285f7369676e6174757265bc3c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e617475726500010c444865617274626561745265636569766564042c417574686f72697479496404c02041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f726974794964601c416c6c476f6f640004d42041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2c536f6d654f66666c696e6504605665633c4964656e74696669636174696f6e5475706c653e0431012041742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e63652076616c696461746f722077617320666f756e6420746f206265206f66666c696e652e000828496e76616c69644b65790464204e6f6e206578697374656e74207075626c6963206b65792e4c4475706c6963617465644865617274626561740458204475706c696361746564206865617274626561742e48417574686f72697479446973636f766572790001000000002444656d6f6372616379012444656d6f6372616379403c5075626c696350726f70436f756e7401002450726f70496e646578100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f707301009c5665633c2850726f70496e6465782c20543a3a486173682c20543a3a4163636f756e744964293e040004210120546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865207365636f6e64206974656d206973207468652070726f706f73616c277320686173682e24507265696d616765730001011c543a3a48617368d4285665633c75383e2c20543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d62657229000400086101204d6170206f662068617368657320746f207468652070726f706f73616c20707265696d6167652c20616c6f6e6720776974682077686f207265676973746572656420697420616e64207468656972206465706f7369742ee42054686520626c6f636b206e756d6265722069732074686520626c6f636b20617420776869636820697420776173206465706f73697465642e244465706f7369744f660001012450726f70496e646578842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e2900040004842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e3c5265666572656e64756d436f756e7401003c5265666572656e64756d496e646578100000000004310120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e344c6f77657374556e62616b656401003c5265666572656e64756d496e646578100000000008250120546865206c6f77657374207265666572656e64756d20696e64657820726570726573656e74696e6720616e20756e62616b6564207265666572656e64756d2e20457175616c20746fdc20605265666572656e64756d436f756e74602069662074686572652069736e2774206120756e62616b6564207265666572656e64756d2e405265666572656e64756d496e666f4f660001013c5265666572656e64756d496e6465789c5265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a486173683e00040004b420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e34446973706174636851756575650100bc5665633c28543a3a426c6f636b4e756d6265722c20543a3a486173682c205265666572656e64756d496e646578293e0400044101205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e2053746f726564206f72646572656420627920626c6f636b206e756d6265722e24566f74657273466f720101013c5265666572656e64756d496e646578445665633c543a3a4163636f756e7449643e00040004a4204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e18566f74654f660101017c285265666572656e64756d496e6465782c20543a3a4163636f756e7449642910566f7465000400106101204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c794d012069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468655d012064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616ef420616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e1450726f787900010130543a3a4163636f756e74496430543a3a4163636f756e7449640004000831012057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b6579206973207468658820766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e2c44656c65676174696f6e7301010130543a3a4163636f756e7449646828543a3a4163636f756e7449642c20436f6e76696374696f6e2901840000000000000000000000000000000000000000000000000000000000000000000441012047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e544c6173745461626c656457617345787465726e616c010010626f6f6c0400085901205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c6963282070726f706f73616c2e304e65787445787465726e616c00006028543a3a486173682c20566f74655468726573686f6c6429040010590120546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e550120546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743aa4202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f7268202d20605075626c696350726f70736020697320656d7074792e24426c61636b6c6973740001011c543a3a486173688c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e290004000851012041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d626572e82028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e3443616e63656c6c6174696f6e730101011c543a3a4861736810626f6f6c000400042901205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e01541c70726f706f7365083470726f706f73616c5f686173681c543a3a486173681476616c756554436f6d706163743c42616c616e63654f663c543e3e18a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e002c2023203c7765696768743e20202d204f2831292e80202d2054776f204442206368616e6765732c206f6e6520444220656e7472792e302023203c2f7765696768743e187365636f6e64042070726f706f73616c48436f6d706163743c50726f70496e6465783e18a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e002c2023203c7765696768743e20202d204f2831292e40202d204f6e6520444220656e7472792e302023203c2f7765696768743e10766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f746510566f74651c350120566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bbc206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e002c2023203c7765696768743e20202d204f2831292e7c202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e302023203c2f7765696768743e2870726f78795f766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f746510566f74651c510120566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374f8207468652070726f706f73616c3b20206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e002c2023203c7765696768743e20202d204f2831292e7c202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e302023203c2f7765696768743e40656d657267656e63795f63616e63656c04247265665f696e6465783c5265666572656e64756d496e646578085101205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d6530207265666572656e64756d2e4065787465726e616c5f70726f706f7365043470726f706f73616c5f686173681c543a3a48617368083101205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c30207265666572656e64756d2e6465787465726e616c5f70726f706f73655f6d616a6f72697479043470726f706f73616c5f686173681c543a3a48617368145901205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c656020616e2065787465726e616c207265666572656e64756d2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e6065787465726e616c5f70726f706f73655f64656661756c74043470726f706f73616c5f686173681c543a3a48617368144901205363686564756c652061206e656761746976652d7475726e6f75742d62696173207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f84207363686564756c6520616e2065787465726e616c207265666572656e64756d2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e28666173745f747261636b0c3470726f706f73616c5f686173681c543a3a4861736834766f74696e675f706572696f6438543a3a426c6f636b4e756d6265721464656c617938543a3a426c6f636b4e756d626572245101205363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564650120696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e65ec20627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e00f8202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e6101202d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e20496e6372656173656420746f9820202060456d657267656e6379566f74696e67506572696f646020696620746f6f206c6f772e5501202d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265bc202020656e61637465642e205468697320646f65736e277420686176652061206d696e696d756d20616d6f756e742e347665746f5f65787465726e616c043470726f706f73616c5f686173681c543a3a4861736804bc205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e4463616e63656c5f7265666572656e64756d04247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e04542052656d6f76652061207265666572656e64756d2e3463616e63656c5f717565756564041477686963683c5265666572656e64756d496e64657804a02043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e247365745f70726f7879041470726f787930543a3a4163636f756e7449641498205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e002c2023203c7765696768743e58202d204f6e6520657874726120444220656e7472792e302023203c2f7765696768743e3072657369676e5f70726f787900149820436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e002c2023203c7765696768743e40202d204f6e6520444220636c6561722e302023203c2f7765696768743e3072656d6f76655f70726f7879041470726f787930543a3a4163636f756e744964149820436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e002c2023203c7765696768743e40202d204f6e6520444220636c6561722e302023203c2f7765696768743e2064656c65676174650808746f30543a3a4163636f756e74496428636f6e76696374696f6e28436f6e76696374696f6e143c2044656c656761746520766f74652e002c2023203c7765696768743e58202d204f6e6520657874726120444220656e7472792e302023203c2f7765696768743e28756e64656c656761746500144420556e64656c656761746520766f74652e002c2023203c7765696768743e20202d204f2831292e302023203c2f7765696768743e58636c6561725f7075626c69635f70726f706f73616c7300040101205665746f20616e6420626c61636b6c697374207468652070726f706f73616c20686173682e204d7573742062652066726f6d20526f6f74206f726967696e2e346e6f74655f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e0861012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e205468697320646f65736e27742072657175697265207468652070726f706f73616c20746f206265250120696e207468652064697370617463682071756575652062757420646f657320726571756972652061206465706f7369742c2072657475726e6564206f6e636520656e61637465642e586e6f74655f696d6d696e656e745f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e0845012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e2054686973207265717569726573207468652070726f706f73616c20746f206265b420696e207468652064697370617463682071756575652e204e6f206465706f736974206973206e65656465642e34726561705f707265696d616765043470726f706f73616c5f686173681c543a3a4861736814f42052656d6f766520616e20657870697265642070726f706f73616c20707265696d61676520616e6420636f6c6c65637420746865206465706f7369742e00510120546869732077696c6c206f6e6c7920776f726b2061667465722060566f74696e67506572696f646020626c6f636b732066726f6d207468652074696d6520746861742074686520707265696d616765207761735d01206e6f7465642c2069662069742773207468652073616d65206163636f756e7420646f696e672069742e2049662069742773206120646966666572656e74206163636f756e742c207468656e206974276c6c206f6e6c79b020776f726b20616e206164646974696f6e616c2060456e6163746d656e74506572696f6460206c617465722e01402050726f706f736564082450726f70496e6465781c42616c616e636504c02041206d6f74696f6e20686173206265656e2070726f706f7365642062792061207075626c6963206163636f756e742e185461626c65640c2450726f70496e6465781c42616c616e6365385665633c4163636f756e7449643e04dc2041207075626c69632070726f706f73616c20686173206265656e207461626c656420666f72207265666572656e64756d20766f74652e3845787465726e616c5461626c656400049820416e2065787465726e616c2070726f706f73616c20686173206265656e207461626c65642e1c53746172746564083c5265666572656e64756d496e64657834566f74655468726573686f6c6404602041207265666572656e64756d2068617320626567756e2e18506173736564043c5265666572656e64756d496e64657804b020412070726f706f73616c20686173206265656e20617070726f766564206279207265666572656e64756d2e244e6f74506173736564043c5265666572656e64756d496e64657804b020412070726f706f73616c20686173206265656e2072656a6563746564206279207265666572656e64756d2e2443616e63656c6c6564043c5265666572656e64756d496e64657804842041207265666572656e64756d20686173206265656e2063616e63656c6c65642e204578656375746564083c5265666572656e64756d496e64657810626f6f6c047420412070726f706f73616c20686173206265656e20656e61637465642e2444656c65676174656408244163636f756e744964244163636f756e74496404e020416e206163636f756e74206861732064656c65676174656420746865697220766f746520746f20616e6f74686572206163636f756e742e2c556e64656c65676174656404244163636f756e74496404e820416e206163636f756e74206861732063616e63656c6c656420612070726576696f75732064656c65676174696f6e206f7065726174696f6e2e185665746f65640c244163636f756e74496410486173682c426c6f636b4e756d626572049820416e2065787465726e616c2070726f706f73616c20686173206265656e207665746f65642e34507265696d6167654e6f7465640c1048617368244163636f756e7449641c42616c616e636504e020412070726f706f73616c277320707265696d61676520776173206e6f7465642c20616e6420746865206465706f7369742074616b656e2e30507265696d616765557365640c1048617368244163636f756e7449641c42616c616e636504150120412070726f706f73616c20707265696d616765207761732072656d6f76656420616e6420757365642028746865206465706f736974207761732072657475726e6564292e3c507265696d616765496e76616c69640810486173683c5265666572656e64756d496e646578040d0120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d6167652077617320696e76616c69642e3c507265696d6167654d697373696e670810486173683c5265666572656e64756d496e646578040d0120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d61676520776173206d697373696e672e38507265696d616765526561706564101048617368244163636f756e7449641c42616c616e6365244163636f756e744964045d012041207265676973746572656420707265696d616765207761732072656d6f76656420616e6420746865206465706f73697420636f6c6c6563746564206279207468652072656170657220286c617374206974656d292e1c3c456e6163746d656e74506572696f6438543a3a426c6f636b4e756d6265721000c2010014710120546865206d696e696d756d20706572696f64206f66206c6f636b696e6720616e642074686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e0031012049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e737572652074686174690120766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e2074686520636173652077686572659c207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e304c61756e6368506572696f6438543a3a426c6f636b4e756d62657210c089010004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e30566f74696e67506572696f6438543a3a426c6f636b4e756d62657210c089010004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e384d696e696d756d4465706f7369743042616c616e63654f663c543e400010a5d4e8000000000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e54456d657267656e6379566f74696e67506572696f6438543a3a426c6f636b4e756d626572100807000004ec204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f7220616e20656d657267656e6379207265666572656e64756d2e34436f6f6c6f6666506572696f6438543a3a426c6f636b4e756d62657210c089010004610120506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e4c507265696d616765427974654465706f7369743042616c616e63654f663c543e4000e1f5050000000000000000000000000429012054686520616d6f756e74206f662062616c616e63652074686174206d757374206265206465706f7369746564207065722062797465206f6620707265696d6167652073746f7265642e582056616c75654c6f7704382056616c756520746f6f206c6f773c50726f706f73616c4d697373696e6704602050726f706f73616c20646f6573206e6f74206578697374204e6f7450726f78790430204e6f7420612070726f787920426164496e646578043820556e6b6e6f776e20696e6465783c416c726561647943616e63656c656404982043616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365444475706c696361746550726f706f73616c04582050726f706f73616c20616c7265616479206d6164654c50726f706f73616c426c61636b6c6973746564046c2050726f706f73616c207374696c6c20626c61636b6c6973746564444e6f7453696d706c654d616a6f7269747904ac204e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f726974792c496e76616c696448617368043420496e76616c69642068617368284e6f50726f706f73616c0454204e6f2065787465726e616c2070726f706f73616c34416c72656164795665746f6564049c204964656e74697479206d6179206e6f74207665746f20612070726f706f73616c20747769636530416c726561647950726f7879044020416c726561647920612070726f78792857726f6e6750726f787904302057726f6e672070726f7879304e6f7444656c6567617465640438204e6f742064656c656761746564444475706c6963617465507265696d616765045c20507265696d61676520616c7265616479206e6f7465642c4e6f74496d6d696e656e740434204e6f7420696d6d696e656e74144561726c79042820546f6f206561726c7920496d6d696e656e74042420496d6d696e656e743c507265696d6167654d697373696e67044c20507265696d616765206e6f7420666f756e64445265666572656e64756d496e76616c6964048820566f746520676976656e20666f7220696e76616c6964207265666572656e64756d3c507265696d616765496e76616c6964044420496e76616c696420707265696d6167652c4e6f6e6557616974696e670454204e6f2070726f706f73616c732077616974696e671c436f756e63696c014c496e7374616e636531436f6c6c656374697665142450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001011c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001011c543a3a486173684c566f7465733c543a3a4163636f756e7449643e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e01102c7365745f6d656d62657273042c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e105101205365742074686520636f6c6c6563746976652773206d656d62657273686970206d616e75616c6c7920746f20606e65775f6d656d62657273602e204265206e69636520746f2074686520636861696e20616e645c2070726f76696465206974207072652d736f727465642e005820526571756972657320726f6f74206f726967696e2e1c65786563757465042070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e0cf420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e1c70726f706f736508247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e102c2023203c7765696768743e90202d20426f756e6465642073746f7261676520726561647320616e64207772697465732eb8202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c102c2023203c7765696768743e8c202d20426f756e6465642073746f72616765207265616420616e64207772697465732e5501202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e302023203c2f7765696768743e01182050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e74084d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292e14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408104861736810626f6f6c0405012041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408104861736810626f6f6c042d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e0018244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642148546563686e6963616c436f6d6d6974746565014c496e7374616e636532436f6c6c656374697665142450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001011c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001011c543a3a486173684c566f7465733c543a3a4163636f756e7449643e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e01102c7365745f6d656d62657273042c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e105101205365742074686520636f6c6c6563746976652773206d656d62657273686970206d616e75616c6c7920746f20606e65775f6d656d62657273602e204265206e69636520746f2074686520636861696e20616e645c2070726f76696465206974207072652d736f727465642e005820526571756972657320726f6f74206f726967696e2e1c65786563757465042070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e0cf420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e1c70726f706f736508247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e102c2023203c7765696768743e90202d20426f756e6465642073746f7261676520726561647320616e64207772697465732eb8202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c102c2023203c7765696768743e8c202d20426f756e6465642073746f72616765207265616420616e64207772697465732e5501202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e302023203c2f7765696768743e01182050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e74084d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292e14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408104861736810626f6f6c0405012041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408104861736810626f6f6c042d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e0018244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642144456c656374696f6e7350687261676d656e014050687261676d656e456c656374696f6e181c4d656d626572730100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e040004f0205468652063757272656e7420656c6563746564206d656d626572736869702e20536f72746564206261736564206f6e206163636f756e742069642e2452756e6e65727355700100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e0400044901205468652063757272656e742072756e6e6572735f75702e20536f72746564206261736564206f6e206c6f7720746f2068696768206d657269742028776f72736520746f20626573742072756e6e6572292e38456c656374696f6e526f756e647301000c75333210000000000441012054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e65642c206578636c7564696e6720746865207570636f6d696e67206f6e652e1c566f7465734f6601010130543a3a4163636f756e744964445665633c543a3a4163636f756e7449643e01040004010120566f746573206f66206120706172746963756c617220766f7465722c20776974682074686520726f756e6420696e646578206f662074686520766f7465732e1c5374616b654f6601010130543a3a4163636f756e7449643042616c616e63654f663c543e0040000000000000000000000000000000000464204c6f636b6564207374616b65206f66206120766f7465722e2843616e646964617465730100445665633c543a3a4163636f756e7449643e0400086501205468652070726573656e742063616e646964617465206c6973742e20536f72746564206261736564206f6e206163636f756e742069642e20412063757272656e74206d656d6265722063616e206e6576657220656e7465720101207468697320766563746f7220616e6420697320616c7761797320696d706c696369746c7920617373756d656420746f20626520612063616e6469646174652e011810766f74650814766f746573445665633c543a3a4163636f756e7449643e1476616c756554436f6d706163743c42616c616e63654f663c543e3e3c050120566f746520666f72206120736574206f662063616e6469646174657320666f7220746865207570636f6d696e6720726f756e64206f6620656c656374696f6e2e0050205468652060766f746573602073686f756c643a482020202d206e6f7420626520656d7074792eac2020202d206265206c657373207468616e20746865206e756d626572206f662063616e646964617465732e005d012055706f6e20766f74696e672c206076616c75656020756e697473206f66206077686f6027732062616c616e6365206973206c6f636b656420616e64206120626f6e6420616d6f756e742069732072657365727665642e5d012049742069732074686520726573706f6e736962696c697479206f66207468652063616c6c657220746f206e6f7420706c61636520616c6c206f662074686569722062616c616e636520696e746f20746865206c6f636ba020616e64206b65657020736f6d6520666f722066757274686572207472616e73616374696f6e732e002c2023203c7765696768743e2c2023232323205374617465302052656164733a204f283129c8205772697465733a204f28562920676976656e2060566020766f7465732e205620697320626f756e6465642062792031362e302023203c2f7765696768743e3072656d6f76655f766f746572001c21012052656d6f766520606f726967696e60206173206120766f7465722e20546869732072656d6f76657320746865206c6f636b20616e642072657475726e732074686520626f6e642e002c2023203c7765696768743e2c2023232323205374617465302052656164733a204f28312934205772697465733a204f283129302023203c2f7765696768743e507265706f72745f646566756e63745f766f74657204187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365345d01205265706f727420607461726765746020666f72206265696e6720616e20646566756e637420766f7465722e20496e2063617365206f6620612076616c6964207265706f72742c20746865207265706f727465722069735d012072657761726465642062792074686520626f6e6420616d6f756e74206f662060746172676574602e204f74686572776973652c20746865207265706f7274657220697473656c662069732072656d6f76656420616e645c20746865697220626f6e6420697320736c61736865642e0088204120646566756e637420766f74657220697320646566696e656420746f2062653a4d012020202d206120766f7465722077686f73652063757272656e74207375626d697474656420766f7465732061726520616c6c20696e76616c69642e20692e652e20616c6c206f66207468656d20617265206e6fb420202020206c6f6e67657220612063616e646964617465206e6f7220616e20616374697665206d656d6265722e002c2023203c7765696768743e2c202323232320537461746515012052656164733a204f284e4c6f674d2920676976656e204d2063757272656e742063616e6469646174657320616e64204e20766f74657320666f722060746172676574602e34205772697465733a204f283129302023203c2f7765696768743e407375626d69745f63616e646964616379003478205375626d6974206f6e6573656c6620666f722063616e6469646163792e006420412063616e6469646174652077696c6c206569746865723aec2020202d204c6f73652061742074686520656e64206f6620746865207465726d20616e6420666f7266656974207468656972206465706f7369742e2d012020202d2057696e20616e64206265636f6d652061206d656d6265722e204d656d626572732077696c6c206576656e7475616c6c7920676574207468656972207374617368206261636b2e55012020202d204265636f6d6520612072756e6e65722d75702e2052756e6e6572732d75707320617265207265736572766564206d656d6265727320696e2063617365206f6e65206765747320666f72636566756c6c7934202020202072656d6f7665642e002c2023203c7765696768743e2c20232323232053746174658c2052656164733a204f284c6f674e2920476976656e204e2063616e646964617465732e34205772697465733a204f283129302023203c2f7765696768743e4872656e6f756e63655f63616e646964616379002451012052656e6f756e6365206f6e65277320696e74656e74696f6e20746f20626520612063616e64696461746520666f7220746865206e65787420656c656374696f6e20726f756e642e203320706f74656e7469616c40206f7574636f6d65732065786973743a4101202d20606f726967696e6020697320612063616e64696461746520616e64206e6f7420656c656374656420696e20616e79207365742e20496e207468697320636173652c2074686520626f6e64206973f4202020756e72657365727665642c2072657475726e656420616e64206f726967696e2069732072656d6f76656420617320612063616e6469646174652e5901202d20606f726967696e6020697320612063757272656e742072756e6e65722075702e20496e207468697320636173652c2074686520626f6e6420697320756e72657365727665642c2072657475726e656420616e64842020206f726967696e2069732072656d6f76656420617320612072756e6e65722e4d01202d20606f726967696e6020697320612063757272656e74206d656d6265722e20496e207468697320636173652c2074686520626f6e6420697320756e726573657276656420616e64206f726967696e206973590120202072656d6f7665642061732061206d656d6265722c20636f6e73657175656e746c79206e6f74206265696e6720612063616e64696461746520666f7220746865206e65787420726f756e6420616e796d6f72652e650120202053696d696c617220746f205b6072656d6f76655f766f746572605d2c206966207265706c6163656d656e742072756e6e657273206578697374732c20746865792061726520696d6d6564696174656c7920757365642e3472656d6f76655f6d656d626572040c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365345d012052656d6f7665206120706172746963756c6172206d656d6265722066726f6d20746865207365742e20546869732069732065666665637469766520696d6d6564696174656c7920616e642074686520626f6e64206f668020746865206f7574676f696e67206d656d62657220697320736c61736865642e00590120496620612072756e6e65722d757020697320617661696c61626c652c207468656e2074686520626573742072756e6e65722d75702077696c6c2062652072656d6f76656420616e64207265706c6163657320746865f4206f7574676f696e67206d656d6265722e204f74686572776973652c2061206e65772070687261676d656e20726f756e6420697320737461727465642e004501204e6f74652074686174207468697320646f6573206e6f7420616666656374207468652064657369676e6174656420626c6f636b206e756d626572206f6620746865206e65787420656c656374696f6e2e002c2023203c7765696768743e2c2023232323205374617465582052656164733a204f28646f5f70687261676d656e295c205772697465733a204f28646f5f70687261676d656e29302023203c2f7765696768743e01141c4e65775465726d04645665633c284163636f756e7449642c2042616c616e6365293e0855012041206e6577207465726d2077697468206e6577206d656d626572732e205468697320696e64696361746573207468617420656e6f7567682063616e6469646174657320657869737465642c206e6f742074686174450120656e6f756768206861766520686173206265656e20656c65637465642e2054686520696e6e65722076616c7565206d757374206265206578616d696e656420666f72207468697320707572706f73652e24456d7074795465726d0004d8204e6f20286f72206e6f7420656e6f756768292063616e64696461746573206578697374656420666f72207468697320726f756e642e304d656d6265724b69636b656404244163636f756e7449640845012041206d656d62657220686173206265656e2072656d6f7665642e20546869732073686f756c6420616c7761797320626520666f6c6c6f7765642062792065697468657220604e65775465726d60206f74342060456d7074795465726d602e3c4d656d62657252656e6f756e63656404244163636f756e74496404a02041206d656d626572206861732072656e6f756e6365642074686569722063616e6469646163792e34566f7465725265706f727465640c244163636f756e744964244163636f756e74496410626f6f6c086101204120766f7465722028666972737420656c656d656e742920776173207265706f72746564202862797420746865207365636f6e6420656c656d656e742920776974682074686520746865207265706f7274206265696e678c207375636365737366756c206f72206e6f742028746869726420656c656d656e74292e143443616e646964616379426f6e643042616c616e63654f663c543e400010a5d4e800000000000000000000000028566f74696e67426f6e643042616c616e63654f663c543e4000743ba40b00000000000000000000000038446573697265644d656d626572730c753332100d00000000404465736972656452756e6e65727355700c753332100700000000305465726d4475726174696f6e38543a3a426c6f636b4e756d6265721040380000003830556e61626c65546f566f746504c42043616e6e6f7420766f7465207768656e206e6f2063616e64696461746573206f72206d656d626572732065786973742e1c4e6f566f7465730498204d75737420766f746520666f72206174206c65617374206f6e652063616e6469646174652e30546f6f4d616e79566f74657304882043616e6e6f7420766f7465206d6f7265207468616e2063616e646964617465732e504d6178696d756d566f7465734578636565646564049c2043616e6e6f7420766f7465206d6f7265207468616e206d6178696d756d20616c6c6f7765642e284c6f7742616c616e636504c82043616e6e6f7420766f74652077697468207374616b65206c657373207468616e206d696e696d756d2062616c616e63652e3c556e61626c65546f506179426f6e64047c20566f7465722063616e206e6f742070617920766f74696e6720626f6e642e2c4d7573744265566f7465720444204d757374206265206120766f7465722e285265706f727453656c6604502043616e6e6f74207265706f72742073656c662e4c4475706c69636174656443616e6469646174650484204475706c6963617465642063616e646964617465207375626d697373696f6e2e304d656d6265725375626d6974048c204d656d6265722063616e6e6f742072652d7375626d69742063616e6469646163792e3052756e6e65725375626d6974048c2052756e6e65722063616e6e6f742072652d7375626d69742063616e6469646163792e68496e73756666696369656e7443616e64696461746546756e647304982043616e64696461746520646f6573206e6f74206861766520656e6f7567682066756e64732e34496e76616c69644f726967696e04c8204f726967696e206973206e6f7420612063616e6469646174652c206d656d626572206f7220612072756e6e65722075702e244e6f744d656d6265720438204e6f742061206d656d6265722e4c546563686e6963616c4d656d62657273686970014c496e7374616e6365314d656d62657273686970041c4d656d626572730100445665633c543a3a4163636f756e7449643e040004c8205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e0114286164645f6d656d626572040c77686f30543a3a4163636f756e7449640c7c204164642061206d656d626572206077686f6020746f20746865207365742e00b4204d6179206f6e6c792062652063616c6c65642066726f6d20604164644f726967696e60206f7220726f6f742e3472656d6f76655f6d656d626572040c77686f30543a3a4163636f756e7449640c902052656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e00c0204d6179206f6e6c792062652063616c6c65642066726f6d206052656d6f76654f726967696e60206f7220726f6f742e2c737761705f6d656d626572081872656d6f766530543a3a4163636f756e7449640c61646430543a3a4163636f756e7449640cc02053776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e00b8204d6179206f6e6c792062652063616c6c65642066726f6d2060537761704f726967696e60206f7220726f6f742e3472657365745f6d656d62657273041c6d656d62657273445665633c543a3a4163636f756e7449643e105901204368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e646c207061737320606d656d6265727360207072652d736f727465642e00bc204d6179206f6e6c792062652063616c6c65642066726f6d206052657365744f726967696e60206f7220726f6f742e286368616e67655f6b6579040c6e657730543a3a4163636f756e7449640cd82053776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e00f4204d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e01182c4d656d62657241646465640004e42054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e344d656d62657252656d6f7665640004ec2054686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e384d656d62657273537761707065640004dc2054776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e304d656d6265727352657365740004190120546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e284b65794368616e676564000488204f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e1444756d6d7904bc73705f7374643a3a6d61726b65723a3a5068616e746f6d446174613c284163636f756e7449642c204576656e74293e0470205068616e746f6d206d656d6265722c206e6576657220757365642e000020547265617375727901205472656173757279143450726f706f73616c436f756e7401003450726f706f73616c496e646578100000000004a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c730001013450726f706f73616c496e6465789050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c730100485665633c50726f706f73616c496e6465783e040004f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e10546970730001051c543a3a48617368f04f70656e5469703c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265722c20543a3a486173683e0004000c59012054697073207468617420617265206e6f742079657420636f6d706c657465642e204b65796564206279207468652068617368206f66206028726561736f6e2c2077686f29602066726f6d207468652076616c75652e3d012054686973206861732074686520696e73656375726520656e756d657261626c6520686173682066756e6374696f6e2073696e636520746865206b657920697473656c6620697320616c7265616479802067756172616e7465656420746f20626520612073656375726520686173682e1c526561736f6e730001051c543a3a486173681c5665633c75383e0004000849012053696d706c6520707265696d616765206c6f6f6b75702066726f6d2074686520726561736f6e2773206861736820746f20746865206f726967696e616c20646174612e20416761696e2c2068617320616e610120696e73656375726520656e756d657261626c6520686173682073696e636520746865206b65792069732067756172616e7465656420746f2062652074686520726573756c74206f6620612073656375726520686173682e0120387265706f72745f617765736f6d650818726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e7449644c5d01205265706f727420736f6d657468696e672060726561736f6e60207468617420646573657276657320612074697020616e6420636c61696d20616e79206576656e7475616c207468652066696e6465722773206665652e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005501205061796d656e743a20605469705265706f72744465706f73697442617365602077696c6c2062652072657365727665642066726f6d20746865206f726967696e206163636f756e742c2061732077656c6c206173d420605469705265706f72744465706f736974506572427974656020666f722065616368206279746520696e2060726561736f6e602e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743e9c202d20604f2852296020776865726520605260206c656e677468206f662060726561736f6e602e64202d204f6e652062616c616e6365206f7065726174696f6e2e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e2c726574726163745f7469700410686173681c543a3a486173684c550120526574726163742061207072696f72207469702d7265706f72742066726f6d20607265706f72745f617765736f6d65602c20616e642063616e63656c207468652070726f63657373206f662074697070696e672e00e0204966207375636365737366756c2c20746865206f726967696e616c206465706f7369742077696c6c20626520756e72657365727665642e00510120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642074686520746970206964656e746966696564206279206068617368604501206d7573742068617665206265656e207265706f7274656420627920746865207369676e696e67206163636f756e74207468726f75676820607265706f72745f617765736f6d65602028616e64206e6f7450207468726f75676820607469705f6e657760292e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e009020456d697473206054697052657472616374656460206966207375636365737366756c2e002c2023203c7765696768743e24202d20604f2854296064202d204f6e652062616c616e6365206f7065726174696f6e2ec4202d2054776f2073746f726167652072656d6f76616c7320286f6e6520726561642c20636f64656320604f28542960292e34202d204f6e65206576656e742e302023203c2f7765696768743e1c7469705f6e65770c18726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e744964247469705f76616c75653042616c616e63654f663c543e4cf4204769766520612074697020666f7220736f6d657468696e67206e65773b206e6f2066696e6465722773206665652077696c6c2062652074616b656e2e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743e4101202d20604f2852202b2054296020776865726520605260206c656e677468206f662060726561736f6e602c2060546020697320746865206e756d626572206f6620746970706572732e2060546020697345012020206e61747572616c6c79206361707065642061732061206d656d62657273686970207365742c20605260206973206c696d69746564207468726f756768207472616e73616374696f6e2d73697a652e0d01202d2054776f2073746f7261676520696e73657274696f6e732028636f6465637320604f285229602c20604f28542960292c206f6e65207265616420604f283129602e34202d204f6e65206576656e742e302023203c2f7765696768743e0c7469700810686173681c543a3a48617368247469705f76616c75653042616c616e63654f663c543e4cb4204465636c6172652061207469702076616c756520666f7220616e20616c72656164792d6f70656e207469702e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f66207468652068617368206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279382020206163636f756e742049442e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e00650120456d6974732060546970436c6f73696e676020696620746865207468726573686f6c64206f66207469707065727320686173206265656e207265616368656420616e642074686520636f756e74646f776e20706572696f64342068617320737461727465642e002c2023203c7765696768743e24202d20604f285429600101202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28542960292c206f6e652073746f72616765207265616420604f283129602e4c202d20557020746f206f6e65206576656e742e302023203c2f7765696768743e24636c6f73655f7469700410686173681c543a3a48617368386020436c6f736520616e64207061796f75742061207469702e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0019012054686520746970206964656e74696669656420627920606861736860206d75737420686176652066696e69736865642069747320636f756e74646f776e20706572696f642e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e002c2023203c7765696768743e24202d20604f28542960e4202d204f6e652073746f726167652072657472696576616c2028636f64656320604f285429602920616e642074776f2072656d6f76616c732e88202d20557020746f2074687265652062616c616e6365206f7065726174696f6e732e302023203c2f7765696768743e3470726f706f73655f7370656e64081476616c756554436f6d706163743c42616c616e63654f663c543e3e2c62656e65666963696172798c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365242d012050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c7565350120697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e636520746865542070726f706f73616c20697320617761726465642e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e94202d204f6e65204442206368616e67652c206f6e6520657874726120444220656e7472792e302023203c2f7765696768743e3c72656a6563745f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e1cfc2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e40202d204f6e6520444220636c6561722e302023203c2f7765696768743e40617070726f76655f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e205d0120417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e6566696369617279ac20616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e44202d204f6e65204442206368616e67652e302023203c2f7765696768743e012c2050726f706f736564043450726f706f73616c496e6465780438204e65772070726f706f73616c2e205370656e64696e67041c42616c616e636504e8205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e1c417761726465640c3450726f706f73616c496e6465781c42616c616e6365244163636f756e744964048020536f6d652066756e64732068617665206265656e20616c6c6f63617465642e2052656a6563746564083450726f706f73616c496e6465781c42616c616e636504b420412070726f706f73616c207761732072656a65637465643b2066756e6473207765726520736c61736865642e144275726e74041c42616c616e6365048c20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20526f6c6c6f766572041c42616c616e6365043101205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e1c4465706f736974041c42616c616e6365048020536f6d652066756e64732068617665206265656e206465706f73697465642e184e657754697004104861736804982041206e6577207469702073756767657374696f6e20686173206265656e206f70656e65642e28546970436c6f73696e6704104861736804dc2041207469702073756767657374696f6e206861732072656163686564207468726573686f6c6420616e6420697320636c6f73696e672e24546970436c6f7365640c1048617368244163636f756e7449641c42616c616e636504882041207469702073756767657374696f6e20686173206265656e20636c6f7365642e3054697052657472616374656404104861736804942041207469702073756767657374696f6e20686173206265656e207265747261637465642e203050726f706f73616c426f6e641c5065726d696c6c1050c30000085501204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e110120416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e4c50726f706f73616c426f6e644d696e696d756d3042616c616e63654f663c543e400040e59c301200000000000000000000044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f6438543a3a426c6f636b4e756d6265721080510100048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e1c5065726d696c6c10000000000411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e30546970436f756e74646f776e38543a3a426c6f636b4e756d62657210403800000445012054686520706572696f6420666f722077686963682061207469702072656d61696e73206f70656e20616674657220697320686173206163686965766564207468726573686f6c6420746970706572732e3454697046696e646572734665651c50657263656e7404140431012054686520616d6f756e74206f66207468652066696e616c2074697020776869636820676f657320746f20746865206f726967696e616c207265706f72746572206f6620746865207469702e505469705265706f72744465706f736974426173653042616c616e63654f663c543e400010a5d4e8000000000000000000000004d42054686520616d6f756e742068656c64206f6e206465706f73697420666f7220706c6163696e67206120746970207265706f72742e5c5469705265706f72744465706f736974506572427974653042616c616e63654f663c543e4000e40b540200000000000000000000000409012054686520616d6f756e742068656c64206f6e206465706f7369742070657220627974652077697468696e2074686520746970207265706f727420726561736f6e2e2070496e73756666696369656e7450726f706f7365727342616c616e6365047c2050726f706f73657227732062616c616e636520697320746f6f206c6f772e50496e76616c696450726f706f73616c496e646578046c204e6f2070726f706f73616c206174207468617420696e6465782e30526561736f6e546f6f42696704882054686520726561736f6e20676976656e206973206a75737420746f6f206269672e30416c72656164794b6e6f776e048c20546865207469702077617320616c726561647920666f756e642f737461727465642e28556e6b6e6f776e54697004642054686520746970206861736820697320756e6b6e6f776e2e244e6f7446696e64657204210120546865206163636f756e7420617474656d7074696e6720746f20726574726163742074686520746970206973206e6f74207468652066696e646572206f6620746865207469702e245374696c6c4f70656e042d0120546865207469702063616e6e6f7420626520636c61696d65642f636c6f736564206265636175736520746865726520617265206e6f7420656e6f7567682074697070657273207965742e245072656d617475726504350120546865207469702063616e6e6f7420626520636c61696d65642f636c6f73656420626563617573652069742773207374696c6c20696e2074686520636f756e74646f776e20706572696f642e18436c61696d730118436c61696d730c18436c61696d730001013c457468657265756d416464726573733042616c616e63654f663c543e0004000014546f74616c01003042616c616e63654f663c543e4000000000000000000000000000000000001c56657374696e670001013c457468657265756d41646472657373b02842616c616e63654f663c543e2c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265722900040010782056657374696e67207363686564756c6520666f72206120636c61696d2e0d012046697273742062616c616e63652069732074686520746f74616c20616d6f756e7420746861742073686f756c642062652068656c6420666f722076657374696e672ee4205365636f6e642062616c616e636520697320686f77206d7563682073686f756c6420626520756e6c6f636b65642070657220626c6f636b2ecc2054686520626c6f636b206e756d626572206973207768656e207468652076657374696e672073686f756c642073746172742e010814636c61696d08106465737430543a3a4163636f756e74496448657468657265756d5f7369676e61747572653845636473615369676e61747572650438204d616b65206120636c61696d2e286d696e745f636c61696d0c0c77686f3c457468657265756d416464726573731476616c75653042616c616e63654f663c543e4076657374696e675f7363686564756c65d04f7074696f6e3c2842616c616e63654f663c543e2c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d626572293e0488204164642061206e657720636c61696d2c20696620796f752061726520726f6f742e01041c436c61696d65640c244163636f756e7449643c457468657265756d416464726573731c42616c616e6365046c20536f6d656f6e6520636c61696d656420736f6d6520444f54732e041850726566697814265b75385d807c506179204b534d7320746f20746865204b7573616d61206163636f756e743a04150120546865205072656669782074686174206973207573656420696e207369676e656420457468657265756d206d6573736167657320666f722074686973206e6574776f726b002850617261636861696e73012850617261636861696e73242c417574686f7269746965730100405665633c56616c696461746f7249643e0400049420416c6c20617574686f72697469657327206b65797320617420746865206d6f6d656e742e10436f6465000101185061726149641c5665633c75383e0004000498205468652070617261636861696e7320726567697374657265642061742070726573656e742e144865616473000101185061726149641c5665633c75383e00040004cc20546865206865616473206f66207468652070617261636861696e7320726567697374657265642061742070726573656e742e2857617465726d61726b730001011850617261496438543a3a426c6f636b4e756d6265720004000cfc205468652077617465726d61726b2068656967687473206f66207468652070617261636861696e7320726567697374657265642061742070726573656e742e410120466f722065766572792070617261636861696e2c20746869732069732074686520626c6f636b206865696768742066726f6d20776869636820616c6c206d6573736167657320746172676574696e675d0120746861742070617261636861696e2068617665206265656e2070726f6365737365642e2043616e20626520604e6f6e6560206f6e6c79206966207468652070617261636861696e20646f65736e27742065786973742e3c556e726f75746564496e67726573730001016028543a3a426c6f636b4e756d6265722c20506172614964294c5665633c285061726149642c2048617368293e00040010550120556e726f7574656420696e67726573732e204d6170732028426c6f636b4e756d6265722c20746f5f636861696e2920706169727320746f205b2866726f6d5f636861696e2c206567726573735f726f6f74295d2e004d01205468657265206d617920626520616e20656e74727920756e6465722028692c20702920696e2074686973206d617020666f722065766572792069206265747765656e207468652070617261636861696e2773842077617465726d61726b20616e64207468652063757272656e7420626c6f636b2e4852656c61794469737061746368517565756501010118506172614964485665633c5570776172644d6573736167653e000400081d01204d6573736167657320726561647920746f2062652064697370617463686564206f6e746f207468652072656c617920636861696e2e204974206973207375626a65637420746fc820604d41585f4d4553534147455f434f554e546020616e64206057415445524d41524b5f4d4553534147455f53495a45602e5852656c61794469737061746368517565756553697a650101011850617261496428287533322c2075333229002000000000000000000c45012053697a65206f6620746865206469737061746368207175657565732e205365706172617465642066726f6d2061637475616c206461746120696e206f7264657220746f2061766f696420636f73746c795901206465636f64696e67207768656e20636865636b696e6720726563656970742076616c69646974792e204669727374206974656d20696e207475706c652069732074686520636f756e74206f66206d65737361676573fc097365636f6e642069662074686520746f74616c206c656e6774682028696e20627974657329206f6620746865206d657373616765207061796c6f6164732e344e65656473446973706174636801002c5665633c5061726149643e040004110120546865206f726465726564206c697374206f662050617261496473207468617420686176652061206052656c6179446973706174636851756575656020656e7472792e2444696455706461746500002c5665633c5061726149643e040010650120536f6d65206966207468652070617261636861696e20686561647320676574207570646174656420696e207468697320626c6f636b2c20616c6f6e672077697468207468652070617261636861696e204944732074686174350120646964207570646174652e204f72646572656420696e207468652073616d652077617920617320607265676973747261723a3a416374697665602028692e652e20627920506172614964292e0064204e6f6e65206966206e6f742079657420757064617465642e0104247365745f686561647304146865616473585665633c417474657374656443616e6469646174653e0415012050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e000000304174746573746174696f6e7301304174746573746174696f6e730c40526563656e7450617261426c6f636b7300010138543a3a426c6f636b4e756d62657244496e636c75646564426c6f636b733c543e00040008f02041206d617070696e672066726f6d206d6f64756c617220626c6f636b206e756d62657220286e2025204174746573746174696f6e506572696f6429cc20746f2073657373696f6e20696e64657820616e6420746865206c697374206f662063616e646964617465206861736865732e5450617261426c6f636b4174746573746174696f6e7300020138543a3a426c6f636b4e756d626572104861736850426c6f636b4174746573746174696f6e733c543e00040004a8204174746573746174696f6e73206f6e206120726563656e742070617261636861696e20626c6f636b2e24446964557064617465010010626f6f6c0400000104446d6f72655f6174746573746174696f6e7304145f6d6f7265404d6f72654174746573746174696f6e730415012050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e00000014536c6f74730114536c6f7473243841756374696f6e436f756e74657201003041756374696f6e496e646578100000000004d820546865206e756d626572206f662061756374696f6e7320746861742068617665206265656e207374617274656420736f206661722e284d616e6167656449647301002c5665633c5061726149643e0400084d01204f726465726564206c697374206f6620616c6c2060506172614964602076616c756573207468617420617265206d616e616765642062792074686973206d6f64756c652e205468697320696e636c75646573290120636861696e73207468617420617265206e6f7420796574206465706c6f7965642028627574206861766520776f6e20616e2061756374696f6e20696e2074686520667574757265292e204465706f7369747301010118506172614964445665633c42616c616e63654f663c543e3e000400345d0120566172696f757320616d6f756e7473206f6e206465706f73697420666f7220656163682070617261636861696e2e20416e20656e74727920696e20604d616e616765644964736020696d706c6965732061206e6f6e2d502064656661756c7420656e74727920686572652e006501205468652061637475616c20616d6f756e74206c6f636b6564206f6e2069747320626568616c6620617420616e792074696d6520697320746865206d6178696d756d206974656d20696e2074686973206c6973742e205468655101206669727374206974656d20696e20746865206c6973742069732074686520616d6f756e74206c6f636b656420666f72207468652063757272656e74204c6561736520506572696f642e20466f6c6c6f77696e67b0206974656d732061726520666f72207468652073756273657175656e74206c6561736520706572696f64732e006101205468652064656661756c742076616c75652028616e20656d707479206c6973742920696d706c6965732074686174207468652070617261636861696e206e6f206c6f6e6765722065786973747320286f72206e65766572b4206578697374656429206173206661722061732074686973206d6f64756c6520697320636f6e6365726e65642e00510120496620612070617261636861696e20646f65736e2774206578697374202a7965742a20627574206973207363686564756c656420746f20657869737420696e20746865206675747572652c207468656e2069745d012077696c6c206265206c6566742d7061646465642077697468206f6e65206f72206d6f7265207a65726f657320746f2064656e6f74652074686520666163742074686174206e6f7468696e672069732068656c64206f6e5d01206465706f73697420666f7220746865206e6f6e2d6578697374656e7420636861696e2063757272656e746c792c206275742069732068656c6420617420736f6d6520706f696e7420696e20746865206675747572652e2c41756374696f6e496e666f000088284c65617365506572696f644f663c543e2c20543a3a426c6f636b4e756d62657229040014f820496e666f726d6174696f6e2072656c6174696e6720746f207468652063757272656e742061756374696f6e2c206966207468657265206973206f6e652e00450120546865206669727374206974656d20696e20746865207475706c6520697320746865206c6561736520706572696f6420696e646578207468617420746865206669727374206f662074686520666f7572510120636f6e746967756f7573206c6561736520706572696f6473206f6e2061756374696f6e20697320666f722e20546865207365636f6e642069732074686520626c6f636b206e756d626572207768656e207468655d012061756374696f6e2077696c6c2022626567696e20746f20656e64222c20692e652e2074686520666972737420626c6f636b206f662074686520456e64696e6720506572696f64206f66207468652061756374696f6e2e1c57696e6e696e6700010138543a3a426c6f636b4e756d6265723857696e6e696e67446174613c543e0004000c5d01205468652077696e6e696e67206269647320666f722065616368206f66207468652031302072616e676573206174206561636820626c6f636b20696e207468652066696e616c20456e64696e6720506572696f64206f665101207468652063757272656e742061756374696f6e2e20546865206d61702773206b65792069732074686520302d626173656420696e64657820696e746f2074686520456e64696e6720506572696f642e205468651d0120666972737420626c6f636b206f662074686520656e64696e6720706572696f6420697320303b20746865206c6173742069732060456e64696e67506572696f64202d2031602e3c5265736572766564416d6f756e7473000101504269646465723c543a3a4163636f756e7449643e3042616c616e63654f663c543e00040008310120416d6f756e74732063757272656e746c7920726573657276656420696e20746865206163636f756e7473206f662074686520626964646572732063757272656e746c792077696e6e696e673820287375622d2972616e6765732e304f6e626f6172645175657565010101404c65617365506572696f644f663c543e2c5665633c5061726149643e0004000865012054686520736574206f662050617261204944732074686174206861766520776f6e20616e64206e65656420746f206265206f6e2d626f617264656420617420616e207570636f6d696e67206c656173652d706572696f642ef0205468697320697320636c6561726564206f7574206f6e2074686520666972737420626c6f636b206f6620746865206c6561736520706572696f642e284f6e626f617264696e6700010118506172614964f0284c65617365506572696f644f663c543e2c20496e636f6d696e6750617261636861696e3c543a3a4163636f756e7449642c20543a3a486173683e29000400104d01205468652061637475616c206f6e2d626f617264696e6720696e666f726d6174696f6e2e204f6e6c7920657869737473207768656e206f6e65206f662074686520666f6c6c6f77696e6720697320747275653a2501202d204974206973206265666f726520746865206c6561736520706572696f642074686174207468652070617261636861696e2073686f756c64206265206f6e2d626f61726465642e5901202d205468652066756c6c206f6e2d626f617264696e6720696e666f726d6174696f6e20686173206e6f7420796574206265656e2070726f766964656420616e64207468652070617261636861696e206973206e6f746c207965742064756520746f206265206f66662d626f61726465642e2c4f6666626f617264696e670101011850617261496430543a3a4163636f756e74496400800000000000000000000000000000000000000000000000000000000000000000086501204f66662d626f617264696e67206163636f756e743b2063757272656e63792068656c64206f6e206465706f73697420666f72207468652070617261636861696e206765747320706c6163656420686572652069662074686539012070617261636861696e2067657473206f66662d626f61726465643b20692e652e20697473206c6561736520706572696f6420697320757020616e642069742069736e27742072656e657765642e01182c6e65775f61756374696f6e08206475726174696f6e5c436f6d706163743c543a3a426c6f636b4e756d6265723e486c656173655f706572696f645f696e64657864436f6d706163743c4c65617365506572696f644f663c543e3e1458204372656174652061206e65772061756374696f6e2e00550120546869732063616e206f6e6c792068617070656e207768656e2074686572652069736e277420616c726561647920616e2061756374696f6e20696e2070726f677265737320616e64206d6179206f6e6c7920626529012063616c6c65642062792074686520726f6f74206f726967696e2e20416363657074732074686520606475726174696f6e60206f6620746869732061756374696f6e20616e64207468655d0120606c656173655f706572696f645f696e64657860206f662074686520696e697469616c206c6561736520706572696f64206f662074686520666f757220746861742061726520746f2062652061756374696f6e65642e0c626964140c73756238436f6d706163743c53756249643e3461756374696f6e5f696e64657854436f6d706163743c41756374696f6e496e6465783e2866697273745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e246c6173745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e18616d6f756e7454436f6d706163743c42616c616e63654f663c543e3e404d01204d616b652061206e6577206269642066726f6d20616e206163636f756e742028696e636c7564696e6720612070617261636861696e206163636f756e742920666f72206465706c6f79696e672061206e65772c2070617261636861696e2e005d01204d756c7469706c652073696d756c74616e656f757320626964732066726f6d207468652073616d65206269646465722061726520616c6c6f776564206f6e6c79206173206c6f6e6720617320616c6c2061637469766541012062696473206f7665726c61702065616368206f746865722028692e652e20617265206d757475616c6c79206578636c7573697665292e20426964732063616e6e6f742062652072656461637465642e005901202d20607375626020697320746865207375622d6269646465722049442c20616c6c6f77696e6720666f72206d756c7469706c6520636f6d706574696e67206269647320746f206265206d6164652062792028616e64742066756e64656420627929207468652073616d65206163636f756e742e5101202d206061756374696f6e5f696e646578602069732074686520696e646578206f66207468652061756374696f6e20746f20626964206f6e2e2053686f756c64206a757374206265207468652070726573656e746c2076616c7565206f66206041756374696f6e436f756e746572602e4d01202d206066697273745f736c6f746020697320746865206669727374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4501202d20606c6173745f736c6f746020697320746865206c617374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4d01202d2060616d6f756e74602069732074686520616d6f756e7420746f2062696420746f2062652068656c64206173206465706f73697420666f72207468652070617261636861696e2073686f756c6420746865cc206269642077696e2e205468697320616d6f756e742069732068656c64207468726f7567686f7574207468652072616e67652e246269645f72656e6577103461756374696f6e5f696e64657854436f6d706163743c41756374696f6e496e6465783e2866697273745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e246c6173745f736c6f7464436f6d706163743c4c65617365506572696f644f663c543e3e18616d6f756e7454436f6d706163743c42616c616e63654f663c543e3e3c5101204d616b652061206e6577206269642066726f6d20612070617261636861696e206163636f756e7420666f722072656e6577696e67207468617420287072652d6578697374696e67292070617261636861696e2e00a820546865206f726967696e202a6d7573742a20626520612070617261636861696e206163636f756e742e005d01204d756c7469706c652073696d756c74616e656f757320626964732066726f6d207468652073616d65206269646465722061726520616c6c6f776564206f6e6c79206173206c6f6e6720617320616c6c2061637469766541012062696473206f7665726c61702065616368206f746865722028692e652e20617265206d757475616c6c79206578636c7573697665292e20426964732063616e6e6f742062652072656461637465642e005101202d206061756374696f6e5f696e646578602069732074686520696e646578206f66207468652061756374696f6e20746f20626964206f6e2e2053686f756c64206a757374206265207468652070726573656e746c2076616c7565206f66206041756374696f6e436f756e746572602e4d01202d206066697273745f736c6f746020697320746865206669727374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4501202d20606c6173745f736c6f746020697320746865206c617374206c6561736520706572696f6420696e646578206f66207468652072616e676520746f20626964206f6e2e2054686973206973207468650d01206162736f6c757465206c6561736520706572696f6420696e6465782076616c75652c206e6f7420616e2061756374696f6e2d7370656369666963206f66667365742e4d01202d2060616d6f756e74602069732074686520616d6f756e7420746f2062696420746f2062652068656c64206173206465706f73697420666f72207468652070617261636861696e2073686f756c6420746865cc206269642077696e2e205468697320616d6f756e742069732068656c64207468726f7567686f7574207468652072616e67652e3c7365745f6f6666626f617264696e670410646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636514c82053657420746865206f66662d626f617264696e6720696e666f726d6174696f6e20666f7220612070617261636861696e2e00a820546865206f726967696e202a6d7573742a20626520612070617261636861696e206163636f756e742e002101202d20606465737460206973207468652064657374696e6174696f6e206163636f756e7420746f2072656365697665207468652070617261636861696e2773206465706f7369742e3c6669785f6465706c6f795f64617461100c73756238436f6d706163743c53756249643e1c706172615f69643c436f6d706163743c5061726149643e24636f64655f686173681c543a3a4861736844696e697469616c5f686561645f646174611c5665633c75383e1c2d012053657420746865206465706c6f7920696e666f726d6174696f6e20666f722061207375636365737366756c2062696420746f206465706c6f792061206e65772070617261636861696e2e00c8202d20606f726967696e60206d75737420626520746865207375636365737366756c20626964646572206163636f756e742eb0202d20607375626020697320746865207375622d626964646572204944206f6620746865206269646465722e0101202d2060706172615f696460206973207468652070617261636861696e20494420616c6c6f7474656420746f207468652077696e6e696e67206269646465722e1d01202d2060636f64655f6861736860206973207468652068617368206f66207468652070617261636861696e2773205761736d2076616c69646174696f6e2066756e6374696f6e2ef0202d2060696e697469616c5f686561645f6461746160206973207468652070617261636861696e277320696e697469616c206865616420646174612e54656c61626f726174655f6465706c6f795f64617461081c706172615f69643c436f6d706163743c5061726149643e10636f64651c5665633c75383e3074204e6f74652061206e65772070617261636861696e277320636f64652e004d012054686973206d7573742062652063616c6c656420616674657220606669785f6465706c6f795f646174616020616e642060636f646560206d7573742062652074686520707265696d616765206f6620746865c42060636f64655f68617368602070617373656420746865726520666f72207468652073616d652060706172615f6964602e0061012054686973206d61792062652063616c6c6564206265666f7265206f722061667465722074686520626567696e6e696e67206f66207468652070617261636861696e2773206669727374206c6561736520706572696f642e45012049662063616c6c6564206265666f7265207468656e207468652070617261636861696e2077696c6c206265636f6d65206163746976652061742074686520666972737420626c6f636b206f66206974736501207374617274696e67206c6561736520706572696f642e2049662061667465722c207468656e2069742077696c6c206265636f6d652061637469766520696d6d6564696174656c7920616674657220746869732063616c6c2e006c202d20605f6f726967696e6020697320697272656c6576616e742efc202d2060706172615f696460206973207468652070617261636861696e2049442077686f736520636f64652077696c6c20626520656c61626f72617465642e1501202d2060636f6465602069732074686520707265696d616765206f662074686520726567697374657265642060636f64655f6861736860206f662060706172615f6964602e011c384e65774c65617365506572696f64042c4c65617365506572696f6404842041206e6577206c6561736520706572696f6420697320626567696e6e696e672e3841756374696f6e537461727465640c3041756374696f6e496e6465782c4c65617365506572696f642c426c6f636b4e756d626572084d0120416e2061756374696f6e20737461727465642e2050726f76696465732069747320696e64657820616e642074686520626c6f636b206e756d6265722077686572652069742077696c6c20626567696e20746f190120636c6f736520616e6420746865206669727374206c6561736520706572696f64206f662074686520717561647275706c657420746861742069732061756374696f6e65642e3441756374696f6e436c6f736564043041756374696f6e496e64657804bc20416e2061756374696f6e20656e6465642e20416c6c2066756e6473206265636f6d6520756e72657365727665642e24576f6e4465706c6f7910504e65774269646465723c4163636f756e7449643e24536c6f7452616e6765185061726149641c42616c616e636504550120536f6d656f6e6520776f6e2074686520726967687420746f206465706c6f7920612070617261636861696e2e2042616c616e636520616d6f756e7420697320646564756374656420666f72206465706f7369742e28576f6e52656e6577616c101850617261496424536c6f7452616e67651c42616c616e63651c42616c616e636508c420416e206578697374696e672070617261636861696e20776f6e2074686520726967687420746f20636f6e74696e75652e41012046697273742062616c616e63652069732074686520657874726120616d6f756e7420726573657665642e205365636f6e642069732074686520746f74616c20616d6f756e742072657365727665642e2052657365727665640c244163636f756e7449641c42616c616e63651c42616c616e6365084d012046756e6473207765726520726573657276656420666f7220612077696e6e696e67206269642e2046697273742062616c616e63652069732074686520657874726120616d6f756e742072657365727665642e54205365636f6e642069732074686520746f74616c2e28556e726573657276656408244163636f756e7449641c42616c616e636504e02046756e6473207765726520756e72657365727665642073696e636520626964646572206973206e6f206c6f6e676572206163746976652e0000245265676973747261720124526567697374726172242850617261636861696e7301002c5665633c5061726149643e0400002c546872656164436f756e7401000c753332100000000004b420546865206e756d626572206f66207468726561647320746f207363686564756c652070657220626c6f636b2e3c53656c6563746564546872656164730100785665633c5665633c285061726149642c20436f6c6c61746f724964293e3e040008510120416e206172726179206f6620746865207175657565206f6620736574206f662074687265616473207363686564756c656420666f722074686520636f6d696e6720626c6f636b733b206f726465726564206279310120617363656e64696e6720706172612049442e2054686572652063616e206265206e6f206475706c696361746573206f66207061726120494420696e2065616368206c697374206974656d2e184163746976650100b85665633c285061726149642c204f7074696f6e3c28436f6c6c61746f7249642c20526574726961626c65293e293e0400185d012050617261746872656164732f636861696e73207363686564756c656420666f7220657865637574696f6e207468697320626c6f636b2e2049662074686520636f6c6c61746f72204944206973207365742c207468656e6101206120706172746963756c617220636f6c6c61746f722068617320616c7265616479206265656e2063686f73656e20666f7220746865206e65787420626c6f636b2c20616e64206e6f206f7468657220636f6c6c61746f725901206d61792070726f766964652074686520626c6f636b2e20496e2074686973206361736520776520616c6c6f772074686520706f73736962696c697479206f662074686520636f6d62696e6174696f6e206265696e67d0207265747269656420696e2061206c6174657220626c6f636b2c206578707265737365642062792060526574726961626c65602e004c204f726465726564206279205061726149642e284e65787446726565496401001850617261496410e8030000083d0120546865206e65787420756e75736564205061726149642076616c75652e2053746172742074686973206869676820696e206f7264657220746f206b656570206c6f77206e756d6265727320666f72542073797374656d2d6c6576656c20636861696e732e2c50656e64696e6753776170000101185061726149641850617261496400040004642050656e64696e672073776170206f7065726174696f6e732e145061726173000101185061726149642050617261496e666f00040004a8204d6170206f6620616c6c20726567697374657265642070617261746872656164732f636861696e732e28526574727951756575650100785665633c5665633c285061726149642c20436f6c6c61746f724964293e3e040004e8205468652063757272656e7420717565756520666f7220706172617468726561647320746861742073686f756c6420626520726574726965642e1c446562746f72730101011850617261496430543a3a4163636f756e7449640080000000000000000000000000000000000000000000000000000000000000000004ac2055736572732077686f20686176652070616964206120706172617468726561642773206465706f736974011c3472656769737465725f70617261100869643c436f6d706163743c5061726149643e10696e666f2050617261496e666f10636f64651c5665633c75383e44696e697469616c5f686561645f646174611c5665633c75383e089820526567697374657220612070617261636861696e207769746820676976656e20636f64652e8c204661696c7320696620676976656e20494420697320616c726561647920757365642e3c646572656769737465725f70617261040869643c436f6d706163743c5061726149643e0494204465726567697374657220612070617261636861696e207769746820676976656e206964407365745f7468726561645f636f756e740414636f756e740c75333214410120526573657420746865206e756d626572206f6620706172617468726561647320746861742063616e2070617920746f206265207363686564756c656420696e20612073696e676c6520626c6f636b2e0098202d2060636f756e74603a20546865206e756d626572206f662070617261746872656164732e0084204d7573742062652063616c6c65642066726f6d20526f6f74206f726967696e2e4c72656769737465725f706172617468726561640810636f64651c5665633c75383e44696e697469616c5f686561645f646174611c5665633c75383e10a42052656769737465722061207061726174687265616420666f7220696d6d656469617465207573652e004d01204d7573742062652073656e742066726f6d2061205369676e6564206f726967696e20746861742069732061626c6520746f206861766520506172617468726561644465706f7369742072657365727665642e39012060636f64656020616e642060696e697469616c5f686561645f646174616020617265207573656420746f20696e697469616c697a6520746865207061726174687265616427732073746174652e4473656c6563745f706172617468726561640c0c5f69643c436f6d706163743c5061726149643e245f636f6c6c61746f7228436f6c6c61746f724964285f686561645f686173681c543a3a4861736814050120506c61636520612062696420666f722061207061726174687265616420746f2062652070726f6772657373656420696e20746865206e65787420626c6f636b2e00410120546869732069732061206b696e64206f66207370656369616c207472616e73616374696f6e20746861742073686f756c642062652068656176696c79207072696f726974697a656420696e207468655d01207472616e73616374696f6e20706f6f6c206163636f7264696e6720746f20746865206076616c7565603b206f6e6c792060546872656164436f756e7460206f66207468656d206d61792062652070726573656e7465645420696e20616e792073696e676c6520626c6f636b2e54646572656769737465725f70617261746872656164001cc820446572656769737465722061207061726174687265616420616e6420726574726965766520746865206465706f7369742e002101204d7573742062652073656e742066726f6d2061206050617261636861696e60206f726967696e2077686963682069732063757272656e746c79206120706172617468726561642e00590120456e737572652074686174206265666f72652063616c6c696e672074686973207468617420616e792066756e647320796f752077616e7420656d70746965642066726f6d20746865207061726174687265616427734501206163636f756e74206973206d6f766564206f75743b20616674657220746869732069742077696c6c20626520696d706f737369626c6520746f207265747269657665207468656d2028776974686f75746820676f7665726e616e636520696e74657276656e74696f6e292e107377617004146f746865723c436f6d706163743c5061726149643e206501205377617020612070617261636861696e207769746820616e6f746865722070617261636861696e206f7220706172617468726561642e20546865206f726967696e206d7573742062652061206050617261636861696e602e65012054686520737761702077696c6c2068617070656e206f6e6c7920696620746865726520697320616c726561647920616e206f70706f7369746520737761702070656e64696e672e204966207468657265206973206e6f742c5d012074686520737761702077696c6c2062652073746f72656420696e207468652070656e64696e67207377617073206d61702c20726561647920666f722061206c6174657220636f6e6669726d61746f727920737761702e00610120546865206050617261496460732072656d61696e206d617070656420746f207468652073616d652068656164206461746120616e6420636f646520736f2065787465726e616c20636f64652063616e2072656c79206f6e410120605061726149646020746f2062652061206c6f6e672d7465726d206964656e746966696572206f662061206e6f74696f6e616c202270617261636861696e222e20486f77657665722c2074686569725901207363686564756c696e6720696e666f2028692e652e2077686574686572207468657927726520612070617261746872656164206f722070617261636861696e292c2061756374696f6e20696e666f726d6174696f6e9820616e64207468652061756374696f6e206465706f736974206172652073776974636865642e0108505061726174687265616452656769737465726564041850617261496404d4204120706172617468726561642077617320726567697374657265643b20697473206e657720494420697320737570706c6965642e5850617261746872656164446572656769737465726564041850617261496404d4205468652070617261746872656164206f662074686520737570706c696564204944207761732064652d726567697374657265642e00001c5574696c697479011c5574696c69747904244d756c74697369677300020530543a3a4163636f756e744964205b75383b2033325dd04d756c74697369673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e02040004942054686520736574206f66206f70656e206d756c7469736967206f7065726174696f6e732e0114146261746368041463616c6c735c5665633c3c542061732054726169743e3a3a43616c6c3e48802053656e642061206261746368206f662064697370617463682063616c6c732e00ec20546869732077696c6c206578656375746520756e74696c20746865206669727374206f6e65206661696c7320616e64207468656e2073746f702e007c204d61792062652063616c6c65642066726f6d20616e79206f726967696e2e00f0202d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e002c2023203c7765696768743ea4202d205468652073756d206f66207468652077656967687473206f6620746865206063616c6c73602e34202d204f6e65206576656e742e302023203c2f7765696768743e00590120546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e3501206576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e20746865590120604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d616465510120616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c657465646050206576656e74206973206465706f73697465642e1861735f7375620814696e6465780c7531361063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e1ce02053656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e70202d2054686520776569676874206f6620746865206063616c6c602e302023203c2f7765696768743e2061735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e1063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3ea4590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e00b42049662074686572652061726520656e6f7567682c207468656e206469737061746368207468652063616c6c2e005101205061796d656e743a20604d756c74697369674465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573610120607468726573686f6c64602074696d657320604d756c74697369674465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2e8c202d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e002101204e4f54453a20556e6c6573732074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2067656e6572616c6c792077616e7420746f207573651d012060617070726f76655f61735f6d756c74696020696e73746561642c2073696e6365206974206f6e6c7920726571756972657320612068617368206f66207468652063616c6c2e005d0120526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c7420696620607468726573686f6c64602069732065786163746c79206031602e204f74686572776973655901206f6e20737563636573732c20726573756c7420697320604f6b6020616e642074686520726573756c742066726f6d2074686520696e746572696f722063616c6c2c206966206974207761732065786563757465642ce0206d617920626520666f756e6420696e20746865206465706f736974656420604d756c7469736967457865637574656460206576656e742e002c2023203c7765696768743e54202d20604f2853202b205a202b2043616c6c29602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2e2501202d204f6e652063616c6c20656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285a296020776865726520605a602069732074782d6c656e2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e70202d2054686520776569676874206f6620746865206063616c6c602e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66f4202020604d756c74697369674465706f73697442617365202b207468726573686f6c64202a204d756c74697369674465706f736974466163746f72602e302023203c2f7765696768743e40617070726f76655f61735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e2463616c6c5f68617368205b75383b2033325d80590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e005101205061796d656e743a20604d756c74697369674465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573610120607468726573686f6c64602074696d657320604d756c74697369674465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e003901204e4f54453a2049662074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2077616e7420746f20757365206061735f6d756c74696020696e73746561642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66f4202020604d756c74697369674465706f73697442617365202b207468726573686f6c64202a204d756c74697369674465706f736974466163746f72602e302023203c2f7765696768743e3c63616e63656c5f61735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e2474696d65706f696e746454696d65706f696e743c543a3a426c6f636b4e756d6265723e2463616c6c5f68617368205b75383b2033325d5859012043616e63656c2061207072652d6578697374696e672c206f6e2d676f696e67206d756c7469736967207472616e73616374696f6e2e20416e79206465706f7369742072657365727665642070726576696f75736c79c820666f722074686973206f7065726174696f6e2077696c6c20626520756e7265736572766564206f6e20737563636573732e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e6101202d206074696d65706f696e74603a205468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c7c207472616e73616374696f6e20666f7220746869732064697370617463682ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602e34202d204f6e65206576656e742e88202d20492f4f3a2031207265616420604f285329602c206f6e652072656d6f76652e74202d2053746f726167653a2072656d6f766573206f6e65206974656d2e302023203c2f7765696768743e0118404261746368496e746572727570746564080c7533323444697370617463684572726f72085901204261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c2061734c2077656c6c20617320746865206572726f722e384261746368436f6d706c657465640004cc204261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e2c4e65774d756c746973696708244163636f756e744964244163636f756e7449640849012041206e6577206d756c7469736967206f7065726174696f6e2068617320626567756e2e20466972737420706172616d20697320746865206163636f756e74207468617420697320617070726f76696e672c80207365636f6e6420697320746865206d756c7469736967206163636f756e742e404d756c7469736967417070726f76616c0c244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449640859012041206d756c7469736967206f7065726174696f6e20686173206265656e20617070726f76656420627920736f6d656f6e652e20466972737420706172616d20697320746865206163636f756e742074686174206973a820617070726f76696e672c20746869726420697320746865206d756c7469736967206163636f756e742e404d756c7469736967457865637574656410244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e744964384469737061746368526573756c74082d012041206d756c7469736967206f7065726174696f6e20686173206265656e2065786563757465642e20466972737420706172616d20697320746865206163636f756e742074686174206973a820617070726f76696e672c20746869726420697320746865206d756c7469736967206163636f756e742e444d756c746973696743616e63656c6c65640c244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449640831012041206d756c7469736967206f7065726174696f6e20686173206265656e2063616e63656c6c65642e20466972737420706172616d20697320746865206163636f756e742074686174206973ac2063616e63656c6c696e672c20746869726420697320746865206d756c7469736967206163636f756e742e0000204964656e7469747901105375646f10284964656e746974794f6600010130543a3a4163636f756e74496468526567697374726174696f6e3c42616c616e63654f663c543e3e00040004210120496e666f726d6174696f6e20746861742069732070657274696e656e7420746f206964656e746966792074686520656e7469747920626568696e6420616e206163636f756e742e1c53757065724f6600010130543a3a4163636f756e7449645028543a3a4163636f756e7449642c204461746129000400086101205468652073757065722d6964656e74697479206f6620616e20616c7465726e6174697665202273756222206964656e7469747920746f676574686572207769746820697473206e616d652c2077697468696e2074686174510120636f6e746578742e20496620746865206163636f756e74206973206e6f7420736f6d65206f74686572206163636f756e742773207375622d6964656e746974792c207468656e206a75737420604e6f6e65602e18537562734f6601010130543a3a4163636f756e744964842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29004400000000000000000000000000000000000cb820416c7465726e6174697665202273756222206964656e746974696573206f662074686973206163636f756e742e001d0120546865206669727374206974656d20697320746865206465706f7369742c20746865207365636f6e64206973206120766563746f72206f6620746865206163636f756e74732e28526567697374726172730100d85665633c4f7074696f6e3c526567697374726172496e666f3c42616c616e63654f663c543e2c20543a3a4163636f756e7449643e3e3e0400104d012054686520736574206f6620726567697374726172732e204e6f7420657870656374656420746f206765742076657279206269672061732063616e206f6e6c79206265206164646564207468726f7567682061a8207370656369616c206f726967696e20286c696b656c79206120636f756e63696c206d6f74696f6e292e0029012054686520696e64657820696e746f20746869732063616e206265206361737420746f2060526567697374726172496e6465786020746f2067657420612076616c69642076616c75652e012c346164645f726567697374726172041c6163636f756e7430543a3a4163636f756e744964347c2041646420612072656769737472617220746f207468652073797374656d2e001d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605265676973747261724f726967696e60206f722060526f6f74602e00ac202d20606163636f756e74603a20746865206163636f756e74206f6620746865207265676973747261722e009820456d6974732060526567697374726172416464656460206966207375636365737366756c2e002c2023203c7765696768743ee4202d20604f2852296020776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e646564292e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e307365745f6964656e746974790410696e666f304964656e74697479496e666f482d012053657420616e206163636f756e742773206964656e7469747920696e666f726d6174696f6e20616e6420726573657276652074686520617070726f707269617465206465706f7369742e00590120496620746865206163636f756e7420616c726561647920686173206964656e7469747920696e666f726d6174696f6e2c20746865206465706f7369742069732074616b656e2061732070617274207061796d656e745420666f7220746865206e6577206465706f7369742e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e0090202d2060696e666f603a20546865206964656e7469747920696e666f726d6174696f6e2e008c20456d69747320604964656e7469747953657460206966207375636365737366756c2e002c2023203c7765696768743e0501202d20604f2858202b2052296020776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e646564292e88202d204174206d6f73742074776f2062616c616e6365206f7065726174696f6e732eac202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f2858202b20522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e207365745f73756273041073756273645665633c28543a3a4163636f756e7449642c2044617461293e40902053657420746865207375622d6163636f756e7473206f66207468652073656e6465722e005901205061796d656e743a20416e79206167677265676174652062616c616e63652072657365727665642062792070726576696f757320607365745f73756273602063616c6c732077696c6c2062652072657475726e6564310120616e6420616e20616d6f756e7420605375624163636f756e744465706f736974602077696c6c20626520726573657276656420666f722065616368206974656d20696e206073756273602e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e009c202d206073756273603a20546865206964656e746974792773207375622d6163636f756e74732e002c2023203c7765696768743eec202d20604f285329602077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e88202d204174206d6f73742074776f2062616c616e6365206f7065726174696f6e732e4101202d204174206d6f7374204f2832202a2053202b2031292073746f72616765206d75746174696f6e733b20636f64656320636f6d706c657869747920604f2831202a2053202b2053202a20312960293b582020206f6e652073746f726167652d6578697374732e302023203c2f7765696768743e38636c6561725f6964656e74697479003c390120436c65617220616e206163636f756e742773206964656e7469747920696e666f20616e6420616c6c207375622d6163636f756e7420616e642072657475726e20616c6c206465706f736974732e00f0205061796d656e743a20416c6c2072657365727665642062616c616e636573206f6e20746865206163636f756e74206172652072657475726e65642e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e009c20456d69747320604964656e74697479436c656172656460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2852202b2053202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e74202d206053202b2032602073746f726167652064656c6574696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e44726571756573745f6a756467656d656e7408247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e1c6d61785f66656554436f6d706163743c42616c616e63654f663c543e3e5c9820526571756573742061206a756467656d656e742066726f6d2061207265676973747261722e005901205061796d656e743a204174206d6f737420606d61785f666565602077696c6c20626520726573657276656420666f72207061796d656e7420746f2074686520726567697374726172206966206a756467656d656e741c20676976656e2e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e002101202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973207265717565737465642e5901202d20606d61785f666565603a20546865206d6178696d756d206665652074686174206d617920626520706169642e20546869732073686f756c64206a757374206265206175746f2d706f70756c617465642061733a0034206060606e6f636f6d70696c65a42053656c663a3a72656769737472617273287265675f696e646578292e75776e72617028292e666565102060606000a820456d69747320604a756467656d656e7452657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2858202b205229602e34202d204f6e65206576656e742e302023203c2f7765696768743e3863616e63656c5f7265717565737404247265675f696e64657838526567697374726172496e646578446c2043616e63656c20612070726576696f757320726571756573742e00fc205061796d656e743a20412070726576696f75736c79207265736572766564206465706f7369742069732072657475726e6564206f6e20737563636573732e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e004901202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206e6f206c6f6e676572207265717565737465642e00b020456d69747320604a756467656d656e74556e72657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e8c202d204f6e652073746f72616765206d75746174696f6e20604f2852202b205829602e34202d204f6e65206576656e742e302023203c2f7765696768743e1c7365745f6665650814696e6465785c436f6d706163743c526567697374726172496e6465783e0c66656554436f6d706163743c42616c616e63654f663c543e3e301d0120536574207468652066656520726571756972656420666f722061206a756467656d656e7420746f206265207265717565737465642066726f6d2061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e58202d2060666565603a20746865206e6577206665652e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602e302023203c2f7765696768743e387365745f6163636f756e745f69640814696e6465785c436f6d706163743c526567697374726172496e6465783e0c6e657730543a3a4163636f756e74496430c0204368616e676520746865206163636f756e74206173736f63696174656420776974682061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e74202d20606e6577603a20746865206e6577206163636f756e742049442e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602e302023203c2f7765696768743e287365745f6669656c64730814696e6465785c436f6d706163743c526567697374726172496e6465783e186669656c6473384964656e746974794669656c647330ac2053657420746865206669656c6420696e666f726d6174696f6e20666f722061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e1101202d20606669656c6473603a20746865206669656c64732074686174207468652072656769737472617220636f6e6365726e73207468656d73656c76657320776974682e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602e302023203c2f7765696768743e4470726f766964655f6a756467656d656e740c247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365246a756467656d656e745c4a756467656d656e743c42616c616e63654f663c543e3e4cbc2050726f766964652061206a756467656d656e7420666f7220616e206163636f756e742773206964656e746974792e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74b4206f6620746865207265676973747261722077686f736520696e64657820697320607265675f696e646578602e002501202d20607265675f696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206265696e67206d6164652e5901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e4d01202d20606a756467656d656e74603a20746865206a756467656d656e74206f662074686520726567697374726172206f6620696e64657820607265675f696e646578602061626f75742060746172676574602e009820456d69747320604a756467656d656e74476976656e60206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e88202d204f6e652062616c616e63652d7472616e73666572206f7065726174696f6e2e98202d20557020746f206f6e65206163636f756e742d6c6f6f6b7570206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2852202b205829602e34202d204f6e65206576656e742e302023203c2f7765696768743e346b696c6c5f6964656e7469747904187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654c45012052656d6f766520616e206163636f756e742773206964656e7469747920616e64207375622d6163636f756e7420696e666f726d6174696f6e20616e6420736c61736820746865206465706f736974732e006501205061796d656e743a2052657365727665642062616c616e6365732066726f6d20607365745f737562736020616e6420607365745f6964656e74697479602061726520736c617368656420616e642068616e646c656420627949012060536c617368602e20566572696669636174696f6e2072657175657374206465706f7369747320617265206e6f742072657475726e65643b20746865792073686f756c642062652063616e63656c6c656484206d616e75616c6c79207573696e67206063616e63656c5f72657175657374602e00310120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f206f72206d617463682060543a3a466f7263654f726967696e602e005901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e009820456d69747320604964656e746974794b696c6c656460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2852202b2053202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e74202d206053202b2032602073746f72616765206d75746174696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e011c2c4964656e7469747953657404244163636f756e74496404f02041206e616d652077617320736574206f72207265736574202877686963682077696c6c2072656d6f766520616c6c206a756467656d656e7473292e3c4964656e74697479436c656172656408244163636f756e7449641c42616c616e636504d02041206e616d652077617320636c65617265642c20616e642074686520676976656e2062616c616e63652072657475726e65642e384964656e746974794b696c6c656408244163636f756e7449641c42616c616e636504c82041206e616d65207761732072656d6f76656420616e642074686520676976656e2062616c616e636520736c61736865642e484a756467656d656e7452657175657374656408244163636f756e74496438526567697374726172496e64657804a02041206a756467656d656e74207761732061736b65642066726f6d2061207265676973747261722e504a756467656d656e74556e72657175657374656408244163636f756e74496438526567697374726172496e646578048c2041206a756467656d656e74207265717565737420776173207265747261637465642e384a756467656d656e74476976656e08244163636f756e74496438526567697374726172496e64657804982041206a756467656d656e742077617320676976656e2062792061207265676973747261722e3852656769737472617241646465640438526567697374726172496e646578045c204120726567697374726172207761732061646465642e002c48546f6f4d616e795375624163636f756e7473046020546f6f206d616e7920737562732d6163636f756e74732e204e6f74466f756e640454204163636f756e742069736e277420666f756e642e204e6f744e616d65640454204163636f756e742069736e2774206e616d65642e28456d707479496e646578043420456d70747920696e6465782e284665654368616e676564044020466565206973206368616e6765642e284e6f4964656e74697479044c204e6f206964656e7469747920666f756e642e3c537469636b794a756467656d656e74044820537469636b79206a756467656d656e742e384a756467656d656e74476976656e0444204a756467656d656e7420676976656e2e40496e76616c69644a756467656d656e74044c20496e76616c6964206a756467656d656e742e30496e76616c6964496e64657804582054686520696e64657820697320696e76616c69642e34496e76616c6964546172676574045c205468652074617267657420697320696e76616c69642e" + +metadata_v12_hex = '0x6d6574610b801853797374656d011853797374656d3c1c4163636f756e7401010230543a3a4163636f756e744964944163636f756e74496e666f3c543a3a496e6465782c20543a3a4163636f756e74446174613e00150100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e8205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e3845787472696e736963436f756e7400000c753332040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2c426c6f636b576569676874010064776569676874733a3a45787472696e7369637357656967687440000000000000000000000000000000000488205468652063757272656e742077656967687420666f722074686520626c6f636b2e40416c6c45787472696e736963734c656e00000c753332040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b4861736801010538543a3a426c6f636b4e756d6265721c543a3a48617368008000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101050c7533321c5665633c75383e000400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d626572010038543a3a426c6f636b4e756d6265721000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e3845787472696e73696373526f6f7401001c543a3a486173688000000000000000000000000000000000000000000000000000000000000000000415012045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e1844696765737401002c4469676573744f663c543e040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301008c5665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e040004a0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e284576656e74436f756e740100284576656e74496e646578100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f706963730101021c543a3a48617368845665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e000400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e484c61737452756e74696d65557067726164650000584c61737452756e74696d6555706772616465496e666f04000455012053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e38457865637574696f6e50686173650000145068617365040004882054686520657865637574696f6e207068617365206f662074686520626c6f636b2e01282866696c6c5f626c6f636b04185f726174696f1c50657262696c6c040901204120646973706174636820746861742077696c6c2066696c6c2074686520626c6f636b2077656967687420757020746f2074686520676976656e20726174696f2e1872656d61726b041c5f72656d61726b1c5665633c75383e1c6c204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e002c2023203c7765696768743e24202d20604f28312960e0202d2042617365205765696768743a20302e36363520c2b5732c20696e646570656e64656e74206f662072656d61726b206c656e6774682e50202d204e6f204442206f7065726174696f6e732e302023203c2f7765696768743e387365745f686561705f7061676573041470616765730c75363420fc2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e002c2023203c7765696768743e24202d20604f283129604c202d20312073746f726167652077726974652e64202d2042617365205765696768743a20312e34303520c2b57360202d203120777269746520746f20484541505f5041474553302023203c2f7765696768743e207365745f636f64650410636f64651c5665633c75383e28682053657420746865206e65772072756e74696d6520636f64652e002c2023203c7765696768743e3501202d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f64656088202d20312073746f726167652077726974652028636f64656320604f28432960292e7901202d20312063616c6c20746f206063616e5f7365745f636f6465603a20604f28532960202863616c6c73206073705f696f3a3a6d6973633a3a72756e74696d655f76657273696f6e6020776869636820697320657870656e73697665292e2c202d2031206576656e742e7d012054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652c206275742067656e6572616c6c792074686973206973207665727920657870656e736976652e902057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e302023203c2f7765696768743e5c7365745f636f64655f776974686f75745f636865636b730410636f64651c5665633c75383e201d012053657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e002c2023203c7765696768743e90202d20604f2843296020776865726520604360206c656e677468206f662060636f64656088202d20312073746f726167652077726974652028636f64656320604f28432960292e2c202d2031206576656e742e75012054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e302023203c2f7765696768743e5c7365745f6368616e6765735f747269655f636f6e666967044c6368616e6765735f747269655f636f6e666967804f7074696f6e3c4368616e67657354726965436f6e66696775726174696f6e3e28a02053657420746865206e6577206368616e676573207472696520636f6e66696775726174696f6e2e002c2023203c7765696768743e24202d20604f28312960b0202d20312073746f72616765207772697465206f722064656c6574652028636f64656320604f28312960292ed8202d20312063616c6c20746f20606465706f7369745f6c6f67603a20557365732060617070656e6460204150492c20736f204f28312964202d2042617365205765696768743a20372e32313820c2b57334202d204442205765696768743aa820202020202d205772697465733a204368616e67657320547269652c2053797374656d20446967657374302023203c2f7765696768743e2c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e206c2053657420736f6d65206974656d73206f662073746f726167652e002c2023203c7765696768743e94202d20604f2849296020776865726520604960206c656e677468206f6620606974656d73607c202d206049602073746f72616765207772697465732028604f28312960292e74202d2042617365205765696768743a20302e353638202a206920c2b57368202d205772697465733a204e756d626572206f66206974656d73302023203c2f7765696768743e306b696c6c5f73746f7261676504106b657973205665633c4b65793e2078204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e002c2023203c7765696768743efc202d20604f28494b296020776865726520604960206c656e677468206f6620606b6579736020616e6420604b60206c656e677468206f66206f6e65206b657964202d206049602073746f726167652064656c6574696f6e732e70202d2042617365205765696768743a202e333738202a206920c2b57368202d205772697465733a204e756d626572206f66206974656d73302023203c2f7765696768743e2c6b696c6c5f70726566697808187072656669780c4b6579205f7375626b6579730c7533322c1501204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e003d01202a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e64657241012074686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e002c2023203c7765696768743edc202d20604f285029602077686572652060506020616d6f756e74206f66206b65797320776974682070726566697820607072656669786064202d206050602073746f726167652064656c6574696f6e732e74202d2042617365205765696768743a20302e383334202a205020c2b57380202d205772697465733a204e756d626572206f66207375626b657973202b2031302023203c2f7765696768743e1c7375696369646500286501204b696c6c207468652073656e64696e67206163636f756e742c20617373756d696e6720746865726520617265206e6f207265666572656e636573206f75747374616e64696e6720616e642074686520636f6d706f7369746590206461746120697320657175616c20746f206974732064656661756c742076616c75652e002c2023203c7765696768743e24202d20604f283129607c202d20312073746f72616765207265616420616e642064656c6574696f6e2e54202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a20382e36323620c2b5731101204e6f2044422052656164206f72205772697465206f7065726174696f6e7320626563617573652063616c6c657220697320616c726561647920696e206f7665726c6179302023203c2f7765696768743e01144045787472696e7369635375636365737304304469737061746368496e666f049420416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c6564083444697370617463684572726f72304469737061746368496e666f045420416e2065787472696e736963206661696c65642e2c436f64655570646174656400045420603a636f6465602077617320757064617465642e284e65774163636f756e7404244163636f756e744964046c2041206e6577206163636f756e742077617320637265617465642e344b696c6c65644163636f756e7404244163636f756e744964045c20416e206163636f756e7420776173207265617065642e1838426c6f636b48617368436f756e7438543a3a426c6f636b4e756d626572106009000004d820546865206d6178696d756d206e756d626572206f6620626c6f636b7320746f20616c6c6f7720696e206d6f7274616c20657261732e484d6178696d756d426c6f636b576569676874185765696768742000204aa9d1010000047c20546865206d6178696d756d20776569676874206f66206120626c6f636b2e2044625765696768743c52756e74696d6544625765696768744040787d010000000000e1f505000000000409012054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e50426c6f636b457865637574696f6e576569676874185765696768742000f2052a0100000004510120546865206261736520776569676874206f6620657865637574696e67206120626c6f636b2c20696e646570656e64656e74206f6620746865207472616e73616374696f6e7320696e2074686520626c6f636b2e4c45787472696e736963426173655765696768741857656967687420405973070000000004790120546865206261736520776569676874206f6620616e2045787472696e73696320696e2074686520626c6f636b2c20696e646570656e64656e74206f6620746865206f662065787472696e736963206265696e672065786563757465642e484d6178696d756d426c6f636b4c656e6774680c753332100000500004a820546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e143c496e76616c6964537065634e616d6508150120546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d655420616e6420746865206e65772072756e74696d652e685370656356657273696f6e4e65656473546f496e637265617365084501205468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d655420616e6420746865206e65772072756e74696d652e744661696c6564546f4578747261637452756e74696d6556657273696f6e0cf0204661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e000d01204569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e4c4e6f6e44656661756c74436f6d706f7369746504010120537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e3c4e6f6e5a65726f526566436f756e740439012054686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e1c5574696c69747900010c146261746368041463616c6c735c5665633c3c542061732054726169743e3a3a43616c6c3e50802053656e642061206261746368206f662064697370617463682063616c6c732e007c204d61792062652063616c6c65642066726f6d20616e79206f726967696e2e00f0202d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e006101204966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c75646573c820627970617373696e6720606672616d655f73797374656d3a3a54726169743a3a4261736543616c6c46696c74657260292e002c2023203c7765696768743e90202d2042617365207765696768743a2031342e3339202b202e393837202a206320c2b573b8202d20506c7573207468652073756d206f66207468652077656967687473206f6620746865206063616c6c73602ec4202d20506c7573206f6e65206164646974696f6e616c206576656e742e202872657065617420726561642f777269746529302023203c2f7765696768743e00590120546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e3501206576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e20746865590120604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d616465510120616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c657465646050206576656e74206973206465706f73697465642e1861735f7375620814696e6465780c7531361063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e30e02053656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e005901204e4f54453a20496620796f75206e65656420746f20656e73757265207468617420616e79206163636f756e742d62617365642066696c746572696e6720697320686f6e6f7265642028692e652e2062656361757365650120796f7520657870656374206070726f78796020746f2068617665206265656e2075736564207072696f7220696e207468652063616c6c20737461636b20616e6420796f752077616e7420697420746f206170706c7920746fd820616e79207375622d6163636f756e7473292c207468656e20757365206061735f6c696d697465645f7375626020696e73746561642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e64202d2042617365207765696768743a20322e38363120c2b57380202d20506c75732074686520776569676874206f6620746865206063616c6c60302023203c2f7765696768743e3861735f6c696d697465645f7375620814696e6465780c7531361063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e3ce02053656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e0059012046696c7465722066726f6d206f726967696e206172652070617373656420616c6f6e672e205468652063616c6c2077696c6c2062652064697370617463686564207769746820616e206f726967696e207768696368c020757365207468652073616d652066696c74657220617320746865206f726967696e206f6620746869732063616c6c2e004901204e4f54453a20496620796f75206e65656420746f20656e73757265207468617420616e79206163636f756e742d62617365642066696c746572696e67206973206e6f7420686f6e6f7265642028692e652e6501206265636175736520796f7520657870656374206070726f78796020746f2068617665206265656e2075736564207072696f7220696e207468652063616c6c20737461636b20616e6420796f7520646f206e6f742077616e744101207468652063616c6c207265737472696374696f6e7320746f206170706c7920746f20616e79207375622d6163636f756e7473292c207468656e20757365206061735f7375626020696e73746561642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e64202d2042617365207765696768743a20322e38363120c2b57380202d20506c75732074686520776569676874206f6620746865206063616c6c60302023203c2f7765696768743e0108404261746368496e746572727570746564080c7533323444697370617463684572726f72085901204261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c2061734c2077656c6c20617320746865206572726f722e384261746368436f6d706c657465640004cc204261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e000010426162650110426162652c2845706f6368496e64657801000c75363420000000000000000004542043757272656e742065706f636820696e6465782e2c417574686f72697469657301009c5665633c28417574686f7269747949642c2042616265417574686f72697479576569676874293e0400046c2043757272656e742065706f636820617574686f7269746965732e2c47656e65736973536c6f7401000c75363420000000000000000008f82054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e205468697320697320309020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2c43757272656e74536c6f7401000c75363420000000000000000004542043757272656e7420736c6f74206e756d6265722e2852616e646f6d6e6573730100587363686e6f72726b656c3a3a52616e646f6d6e65737380000000000000000000000000000000000000000000000000000000000000000028b8205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e002c20232053656375726974790005012054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061f8206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e7915012063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d6265727320746861742074686973150120286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e206265050120757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e0d01206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e3c4e65787445706f6368436f6e6669670000504e657874436f6e66696744657363726970746f7204000498204e6578742065706f636820636f6e66696775726174696f6e2c206966206368616e6765642e384e65787452616e646f6d6e6573730100587363686e6f72726b656c3a3a52616e646f6d6e657373800000000000000000000000000000000000000000000000000000000000000000045c204e6578742065706f63682072616e646f6d6e6573732e305365676d656e74496e64657801000c7533321000000000247c2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e00f4205765206d616b6520612074726164656f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e01012057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f942060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e00ec204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e090120576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572791c2065706f63682e44556e646572436f6e737472756374696f6e0101050c7533326c5665633c7363686e6f72726b656c3a3a52616e646f6d6e6573733e0004000415012054574f582d4e4f54453a20605365676d656e74496e6465786020697320616e20696e6372656173696e6720696e74656765722c20736f2074686973206973206f6b61792e2c496e697469616c697a656400003c4d6179626552616e646f6d6e65737304000801012054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d65601d01206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e204c6174656e657373010038543a3a426c6f636b4e756d626572100000000014d820486f77206c617465207468652063757272656e7420626c6f636b20697320636f6d706172656420746f2069747320706172656e742e001501205468697320656e74727920697320706f70756c617465642061732070617274206f6620626c6f636b20657865637574696f6e20616e6420697320636c65616e65642075701101206f6e20626c6f636b2066696e616c697a6174696f6e2e205175657279696e6720746869732073746f7261676520656e747279206f757473696465206f6620626c6f636bb020657865637574696f6e20636f6e746578742073686f756c6420616c77617973207969656c64207a65726f2e010000083445706f63684475726174696f6e0c75363420c800000000000000080d0120546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746ffc2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e444578706563746564426c6f636b54696d6524543a3a4d6f6d656e7420b80b00000000000014050120546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e67110120626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f75740501207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f740901206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473a0207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e002454696d657374616d70012454696d657374616d70080c4e6f77010024543a3a4d6f6d656e7420000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e24446964557064617465010010626f6f6c040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01040c736574040c6e6f7748436f6d706163743c543a3a4d6f6d656e743e485820536574207468652063757272656e742074696d652e00590120546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed82070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e004501205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e74207370656369666965642062794420604d696e696d756d506572696f64602e00d820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e002c2023203c7765696768743ed0202d20604f285429602077686572652060546020636f6d706c6578697479206f6620606f6e5f74696d657374616d705f73657460a101202d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202862656361757365206f6620604469645570646174653a3a74616b656020696e20606f6e5f66696e616c697a656029b4202d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f7365746020604f285429602ea8202d2042656e63686d61726b3a20372e36373820286d696e207371756172657320616e616c797369732981012020202d204e4f54453a20546869732062656e63686d61726b2077617320646f6e6520666f7220612072756e74696d65207769746820696e7369676e69666963616e7420606f6e5f74696d657374616d705f736574602068616e646c6572732ee420202020204e65772062656e63686d61726b696e67206973206e6565646564207768656e20616464696e67206e65772068616e646c6572732e302023203c2f7765696768743e0004344d696e696d756d506572696f6424543a3a4d6f6d656e7420dc0500000000000010690120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f64690120746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c79650120776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c6520746869737020706572696f64206f6e2064656661756c742073657474696e67732e0028417574686f72736869700128417574686f72736869700c18556e636c65730100e85665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e0400041c20556e636c657318417574686f72000030543a3a4163636f756e7449640400046420417574686f72206f662063757272656e7420626c6f636b2e30446964536574556e636c6573010010626f6f6c040004bc205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e0104287365745f756e636c657304286e65775f756e636c6573385665633c543a3a4865616465723e04642050726f76696465206120736574206f6620756e636c65732e00001c48496e76616c6964556e636c65506172656e74048c2054686520756e636c6520706172656e74206e6f7420696e2074686520636861696e2e40556e636c6573416c7265616479536574048420556e636c657320616c72656164792073657420696e2074686520626c6f636b2e34546f6f4d616e79556e636c6573044420546f6f206d616e7920756e636c65732e3047656e65736973556e636c6504582054686520756e636c652069732067656e657369732e30546f6f48696768556e636c6504802054686520756e636c6520697320746f6f206869676820696e20636861696e2e50556e636c65416c7265616479496e636c75646564047c2054686520756e636c6520697320616c726561647920696e636c756465642e204f6c64556e636c6504b82054686520756e636c652069736e277420726563656e7420656e6f75676820746f20626520696e636c756465642e1c496e6469636573011c496e646963657304204163636f756e74730001023c543a3a4163636f756e74496e6465788828543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20626f6f6c29000400048820546865206c6f6f6b75702066726f6d20696e64657820746f206163636f756e742e011414636c61696d0414696e6465783c543a3a4163636f756e74496e6465784c9c2041737369676e20616e2070726576696f75736c7920756e61737369676e656420696e6465782e00e0205061796d656e743a20604465706f736974602069732072657365727665642066726f6d207468652073656e646572206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00f4202d2060696e646578603a2074686520696e64657820746f20626520636c61696d65642e2054686973206d757374206e6f7420626520696e207573652e009420456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e64202d204f6e652072657365727665206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2032382e363920c2b57394202d204442205765696768743a203120526561642f577269746520284163636f756e747329302023203c2f7765696768743e207472616e73666572080c6e657730543a3a4163636f756e74496414696e6465783c543a3a4163636f756e74496e6465785461012041737369676e20616e20696e64657820616c7265616479206f776e6564206279207468652073656e64657220746f20616e6f74686572206163636f756e742e205468652062616c616e6365207265736572766174696f6ebc206973206566666563746976656c79207472616e7366657272656420746f20746865206e6577206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002901202d2060696e646578603a2074686520696e64657820746f2062652072652d61737369676e65642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e6101202d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e009420456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e68202d204f6e65207472616e73666572206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2033332e373420c2b57334202d204442205765696768743ae4202020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e7429e8202020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e7429302023203c2f7765696768743e10667265650414696e6465783c543a3a4163636f756e74496e6465784c98204672656520757020616e20696e646578206f776e6564206279207468652073656e6465722e006101205061796d656e743a20416e792070726576696f7573206465706f73697420706c6163656420666f722074686520696e64657820697320756e726573657276656420696e207468652073656e646572206163636f756e742e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206f776e2074686520696e6465782e001101202d2060696e646578603a2074686520696e64657820746f2062652066726565642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e008820456d6974732060496e646578467265656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e64202d204f6e652072657365727665206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2032352e353320c2b57394202d204442205765696768743a203120526561642f577269746520284163636f756e747329302023203c2f7765696768743e38666f7263655f7472616e736665720c0c6e657730543a3a4163636f756e74496414696e6465783c543a3a4163636f756e74496e64657818667265657a6510626f6f6c58590120466f72636520616e20696e64657820746f20616e206163636f756e742e205468697320646f65736e277420726571756972652061206465706f7369742e2049662074686520696e64657820697320616c7265616479ec2068656c642c207468656e20616e79206465706f736974206973207265696d62757273656420746f206974732063757272656e74206f776e65722e00c820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e00a8202d2060696e646578603a2074686520696e64657820746f206265202872652d2961737369676e65642e6101202d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e4501202d2060667265657a65603a2069662073657420746f206074727565602c2077696c6c20667265657a652074686520696e64657820736f2069742063616e6e6f74206265207472616e736665727265642e009420456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e7c202d20557020746f206f6e652072657365727665206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2032362e383320c2b57334202d204442205765696768743af8202020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e657229fc202020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e657229302023203c2f7765696768743e18667265657a650414696e6465783c543a3a4163636f756e74496e64657848690120467265657a6520616e20696e64657820736f2069742077696c6c20616c7761797320706f696e7420746f207468652073656e646572206163636f756e742e205468697320636f6e73756d657320746865206465706f7369742e005d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d7573742068617665206170206e6f6e2d66726f7a656e206163636f756e742060696e646578602e00b0202d2060696e646578603a2074686520696e64657820746f2062652066726f7a656e20696e20706c6163652e008c20456d6974732060496e64657846726f7a656e60206966207375636365737366756c2e002c2023203c7765696768743e28202d20604f283129602e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e74202d20557020746f206f6e6520736c617368206f7065726174696f6e2e34202d204f6e65206576656e742e50202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2033302e383620c2b57394202d204442205765696768743a203120526561642f577269746520284163636f756e747329302023203c2f7765696768743e010c34496e64657841737369676e656408244163636f756e744964304163636f756e74496e64657804782041206163636f756e7420696e646578207761732061737369676e65642e28496e646578467265656404304163636f756e74496e64657804c02041206163636f756e7420696e64657820686173206265656e2066726565642075702028756e61737369676e6564292e2c496e64657846726f7a656e08304163636f756e74496e646578244163636f756e74496404ec2041206163636f756e7420696e64657820686173206265656e2066726f7a656e20746f206974732063757272656e74206163636f756e742049442e00002042616c616e636573012042616c616e6365731034546f74616c49737375616e6365010028543a3a42616c616e6365400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e1c4163636f756e7401010230543a3a4163636f756e7449645c4163636f756e74446174613c543a3a42616c616e63653e000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6c205468652062616c616e6365206f6620616e206163636f756e742e004101204e4f54453a2054686973206973206f6e6c79207573656420696e20746865206361736520746861742074686973206d6f64756c65206973207573656420746f2073746f72652062616c616e6365732e144c6f636b7301010230543a3a4163636f756e744964705665633c42616c616e63654c6f636b3c543a3a42616c616e63653e3e00040008b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2501204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e3853746f7261676556657273696f6e01002052656c656173657304000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e00a020546869732069732073657420746f2076322e302e3020666f72206e6577206e6574776f726b732e0110207472616e736665720810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e6cd8205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e00090120607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e21012049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e1501204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b4206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e00190120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e002c2023203c7765696768743e3101202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72cc202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e6901202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e004c2052656c617465642066756e6374696f6e733a0051012020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2d012020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365d420202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e61012020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765722060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e636564602e49012020202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616cf82020202020636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e88202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d4501202d2042617365205765696768743a2037332e363420c2b5732c20776f7273742063617365207363656e6172696f20286163636f756e7420637265617465642c206163636f756e742072656d6f76656429dc202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374696e6174696f6e206163636f756e741501202d204f726967696e206163636f756e7420697320616c726561647920696e206d656d6f72792c20736f206e6f204442206f7065726174696f6e7320666f72207468656d2e302023203c2f7765696768743e2c7365745f62616c616e63650c0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365206e65775f667265654c436f6d706163743c543a3a42616c616e63653e306e65775f72657365727665644c436f6d706163743c543a3a42616c616e63653e489420536574207468652062616c616e636573206f66206120676976656e206163636f756e742e00210120546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c090120616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e190120496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c01012069742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e00b420546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e002c2023203c7765696768743e80202d20496e646570656e64656e74206f662074686520617267756d656e74732ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e58202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743a6820202020202d204372656174696e673a2032372e353620c2b5736420202020202d204b696c6c696e673a2033352e313120c2b57398202d204442205765696768743a203120526561642c203120577269746520746f206077686f60302023203c2f7765696768743e38666f7263655f7472616e736665720c18736f757263658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636510646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e1851012045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d61792062652c207370656369666965642e2c2023203c7765696768743e4101202d2053616d65206173207472616e736665722c20627574206164646974696f6e616c207265616420616e6420777269746520626563617573652074686520736f75726365206163636f756e74206973902020206e6f7420617373756d656420746f20626520696e20746865206f7665726c61792e302023203c2f7765696768743e4c7472616e736665725f6b6565705f616c6976650810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e2c51012053616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c2074686540206f726967696e206163636f756e742e00bc20393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e00c4205b607472616e73666572605d3a207374727563742e4d6f64756c652e68746d6c236d6574686f642e7472616e736665722c2023203c7765696768743ee8202d2043686561706572207468616e207472616e736665722062656361757365206163636f756e742063616e6e6f74206265206b696c6c65642e60202d2042617365205765696768743a2035312e3420c2b5731d01202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374202873656e64657220697320696e206f7665726c617920616c7265616479292c20233c2f7765696768743e01201c456e646f77656408244163636f756e7449641c42616c616e636504bc20416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e20447573744c6f737408244163636f756e7449641c42616c616e636508410120416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77204578697374656e7469616c4465706f7369742c7c20726573756c74696e6720696e20616e206f75747269676874206c6f73732e205472616e736665720c244163636f756e744964244163636f756e7449641c42616c616e63650498205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c7565292e2842616c616e63655365740c244163636f756e7449641c42616c616e63651c42616c616e636504c420412062616c616e6365207761732073657420627920726f6f74202877686f2c20667265652c207265736572766564292e1c4465706f73697408244163636f756e7449641c42616c616e636504dc20536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e20526573657276656408244163636f756e7449641c42616c616e636504e420536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e28556e726573657276656408244163636f756e7449641c42616c616e636504ec20536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e4852657365727665526570617472696174656410244163636f756e744964244163636f756e7449641c42616c616e63651853746174757308510120536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742edc2046696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652e04484578697374656e7469616c4465706f73697428543a3a42616c616e63654000407a10f35a0000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e203856657374696e6742616c616e6365049c2056657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c7565544c69717569646974795265737472696374696f6e7304c8204163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c204f766572666c6f77047420476f7420616e206f766572666c6f7720616674657220616464696e674c496e73756666696369656e7442616c616e636504782042616c616e636520746f6f206c6f7720746f2073656e642076616c7565484578697374656e7469616c4465706f73697404ec2056616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f736974244b656570416c6976650490205472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e745c4578697374696e6756657374696e675363686564756c6504cc20412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742c446561644163636f756e74048c2042656e6566696369617279206163636f756e74206d757374207072652d6578697374485472616e73616374696f6e5061796d656e7401485472616e73616374696f6e5061796d656e7408444e6578744665654d756c7469706c6965720100284d756c7469706c69657240000064a7b3b6e00d0000000000000000003853746f7261676556657273696f6e01002052656c6561736573040000000008485472616e73616374696f6e427974654665653042616c616e63654f663c543e4000e40b54020000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e2c576569676874546f466565a45665633c576569676874546f466565436f656666696369656e743c42616c616e63654f663c543e3e3e5c0401000000000000000000000000000000000000000001040d012054686520706f6c796e6f6d69616c2074686174206973206170706c69656420696e206f7264657220746f20646572697665206665652066726f6d207765696768742e001c5374616b696e67011c5374616b696e678c30486973746f7279446570746801000c75333210540000001c8c204e756d626572206f66206572617320746f206b65657020696e20686973746f72792e00390120496e666f726d6174696f6e206973206b65707420666f72206572617320696e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e006101204d757374206265206d6f7265207468616e20746865206e756d626572206f6620657261732064656c617965642062792073657373696f6e206f74686572776973652e20492e652e2061637469766520657261206d757374390120616c7761797320626520696e20686973746f72792e20492e652e20606163746976655f657261203e2063757272656e745f657261202d20686973746f72795f646570746860206d757374206265302067756172616e746565642e3856616c696461746f72436f756e7401000c753332100000000004a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e7401000c7533321004000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e34496e76756c6e657261626c65730100445665633c543a3a4163636f756e7449643e04000c590120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e636520746865792772654d01206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f7572ac20696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e64656400010530543a3a4163636f756e74496430543a3a4163636f756e744964000400040101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e184c656467657200010230543a3a4163636f756e744964a45374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e14506179656501010530543a3a4163636f756e7449644452657761726444657374696e6174696f6e00040004e42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e2856616c696461746f727301010530543a3a4163636f756e7449643856616c696461746f72507265667300040004450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e284e6f6d696e61746f727300010530543a3a4163636f756e744964644e6f6d696e6174696f6e733c543a3a4163636f756e7449643e00040004650120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e2843757272656e74457261000020457261496e6465780400105c205468652063757272656e742065726120696e6465782e006501205468697320697320746865206c617465737420706c616e6e6564206572612c20646570656e64696e67206f6e20686f77207468652053657373696f6e2070616c6c657420717565756573207468652076616c696461746f7280207365742c206974206d6967687420626520616374697665206f72206e6f742e24416374697665457261000034416374697665457261496e666f040010d820546865206163746976652065726120696e666f726d6174696f6e2c20697420686f6c647320696e64657820616e642073746172742e00b820546865206163746976652065726120697320746865206572612063757272656e746c792072657761726465642e2d012056616c696461746f7220736574206f66207468697320657261206d75737420626520657175616c20746f206053657373696f6e496e746572666163653a3a76616c696461746f7273602e5445726173537461727453657373696f6e496e64657800010520457261496e6465783053657373696f6e496e646578000400043101205468652073657373696f6e20696e646578206174207768696368207468652065726120737461727420666f7220746865206c6173742060484953544f52595f44455054486020657261732e2c457261735374616b65727301020520457261496e64657830543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e050c0000001878204578706f73757265206f662076616c696461746f72206174206572612e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e48457261735374616b657273436c697070656401020520457261496e64657830543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e050c0000002c9820436c6970706564204578706f73757265206f662076616c696461746f72206174206572612e00590120546869732069732073696d696c617220746f205b60457261735374616b657273605d20627574206e756d626572206f66206e6f6d696e61746f7273206578706f736564206973207265647563656420746f20746865dc2060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732e1d0120284e6f74653a20746865206669656c642060746f74616c6020616e6420606f776e60206f6620746865206578706f737572652072656d61696e7320756e6368616e676564292ef42054686973206973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e005d012054686973206973206b657965642066697374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e484572617356616c696461746f72507265667301020520457261496e64657830543a3a4163636f756e7449643856616c696461746f7250726566730504001411012053696d696c617220746f2060457261735374616b657273602c207468697320686f6c64732074686520707265666572656e636573206f662076616c696461746f72732e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4c4572617356616c696461746f7252657761726400010520457261496e6465783042616c616e63654f663c543e0004000c09012054686520746f74616c2076616c696461746f7220657261207061796f757420666f7220746865206c6173742060484953544f52595f44455054486020657261732e0021012045726173207468617420686176656e27742066696e697368656420796574206f7220686173206265656e2072656d6f76656420646f65736e27742068617665207265776172642e4045726173526577617264506f696e747301010520457261496e64657874457261526577617264506f696e74733c543a3a4163636f756e7449643e0014000000000008ac205265776172647320666f7220746865206c6173742060484953544f52595f44455054486020657261732e250120496620726577617264206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207265776172642069732072657475726e65642e3845726173546f74616c5374616b6501010520457261496e6465783042616c616e63654f663c543e00400000000000000000000000000000000008ec2054686520746f74616c20616d6f756e74207374616b656420666f7220746865206c6173742060484953544f52595f44455054486020657261732e1d0120496620746f74616c206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207374616b652069732072657475726e65642e20466f72636545726101001c466f7263696e6704000454204d6f6465206f662065726120666f7263696e672e4c536c6173685265776172644672616374696f6e01001c50657262696c6c10000000000cf8205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e00e4205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e4c43616e63656c6564536c6173685061796f757401003042616c616e63654f663c543e40000000000000000000000000000000000815012054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e7420776869636820776173ec2063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e40556e6170706c696564536c617368657301010520457261496e646578bc5665633c556e6170706c696564536c6173683c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3e00040004c420416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e28426f6e646564457261730100745665633c28457261496e6465782c2053657373696f6e496e646578293e04001025012041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e00c8204d75737420636f6e7461696e7320696e666f726d6174696f6e20666f72206572617320666f72207468652072616e67653abc20605b6163746976655f657261202d20626f756e64696e675f6475726174696f6e3b206163746976655f6572615d604c56616c696461746f72536c617368496e45726100020520457261496e64657830543a3a4163636f756e7449645c2850657262696c6c2c2042616c616e63654f663c543e2905040008450120416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e7020616e6420736c6173682076616c7565206f6620746865206572612e4c4e6f6d696e61746f72536c617368496e45726100020520457261496e64657830543a3a4163636f756e7449643042616c616e63654f663c543e05040004610120416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e34536c617368696e675370616e7300010530543a3a4163636f756e7449645c736c617368696e673a3a536c617368696e675370616e73000400048c20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e245370616e536c6173680101058c28543a3a4163636f756e7449642c20736c617368696e673a3a5370616e496e6465782988736c617368696e673a3a5370616e5265636f72643c42616c616e63654f663c543e3e00800000000000000000000000000000000000000000000000000000000000000000083d01205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2cb82061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e584561726c69657374556e6170706c696564536c617368000020457261496e646578040004fc20546865206561726c696573742065726120666f72207768696368207765206861766520612070656e64696e672c20756e6170706c69656420736c6173682e48536e617073686f7456616c696461746f72730000445665633c543a3a4163636f756e7449643e040008650120536e617073686f74206f662076616c696461746f72732061742074686520626567696e6e696e67206f66207468652063757272656e7420656c656374696f6e2077696e646f772e20546869732073686f756c64206f6e6c791901206861766520612076616c7565207768656e205b60457261456c656374696f6e537461747573605d203d3d2060456c656374696f6e5374617475733a3a4f70656e285f29602e48536e617073686f744e6f6d696e61746f72730000445665633c543a3a4163636f756e7449643e040008650120536e617073686f74206f66206e6f6d696e61746f72732061742074686520626567696e6e696e67206f66207468652063757272656e7420656c656374696f6e2077696e646f772e20546869732073686f756c64206f6e6c791901206861766520612076616c7565207768656e205b60457261456c656374696f6e537461747573605d203d3d2060456c656374696f6e5374617475733a3a4f70656e285f29602e34517565756564456c65637465640000a8456c656374696f6e526573756c743c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e04000c650120546865206e6578742076616c696461746f72207365742e2041742074686520656e64206f6620616e206572612c206966207468697320697320617661696c61626c652028706f74656e7469616c6c792066726f6d20746865610120726573756c74206f6620616e206f6666636861696e20776f726b6572292c20697420697320696d6d6564696174656c7920757365642e204f74686572776973652c20746865206f6e2d636861696e20656c656374696f6e342069732065786563757465642e2c51756575656453636f7265000034456c656374696f6e53636f7265040004b0205468652073636f7265206f66207468652063757272656e74205b60517565756564456c6563746564605d2e44457261456c656374696f6e537461747573010078456c656374696f6e5374617475733c543a3a426c6f636b4e756d6265723e040008490120466c616720746f20636f6e74726f6c2074686520657865637574696f6e206f6620746865206f6666636861696e20656c656374696f6e2e205768656e20604f70656e285f29602c207765206163636570746c20736f6c7574696f6e7320746f206265207375626d69747465642e54497343757272656e7453657373696f6e46696e616c010010626f6f6c0400084d012054727565206966207468652063757272656e74202a2a706c616e6e65642a2a2073657373696f6e2069732066696e616c2e204e6f74652074686174207468697320646f6573206e6f742074616b65206572615820666f7263696e6720696e746f206163636f756e742e3853746f7261676556657273696f6e01002052656c6561736573040310cc2054727565206966206e6574776f726b20686173206265656e20757067726164656420746f20746869732076657273696f6e2e7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e00a020546869732069732073657420746f2076332e302e3020666f72206e6577206e6574776f726b732e016010626f6e640c28636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e1470617965654452657761726444657374696e6174696f6e5865012054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c8420626520746865206163636f756e74207468617420636f6e74726f6c732069742e003101206076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e00250120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e004020456d6974732060426f6e646564602e002c2023203c7765696768743ed4202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e20202d204f2831292e68202d20546872656520657874726120444220656e74726965732e005101204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e6564410120756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e4c202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2036372e383720c2b5732c204442205765696768743a3101202d20526561643a20426f6e6465642c204c65646765722c205b4f726967696e204163636f756e745d2c2043757272656e74204572612c20486973746f72792044657074682c204c6f636b73e0202d2057726974653a20426f6e6465642c2050617965652c205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572302023203c2f7765696768743e28626f6e645f657874726104386d61785f6164646974696f6e616c54436f6d706163743c42616c616e63654f663c543e3e5865012041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e63652075703420666f72207374616b696e672e00510120557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e650120556e6c696b65205b60626f6e64605d206f72205b60756e626f6e64605d20746869732066756e6374696f6e20646f6573206e6f7420696d706f736520616e79206c696d69746174696f6e206f6e2074686520616d6f756e744c20746861742063616e2062652061646465642e00610120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c657220616e64f82069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e004020456d6974732060426f6e646564602e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e20202d204f2831292e40202d204f6e6520444220656e7472792e34202d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2035342e383820c2b5732c204442205765696768743a1501202d20526561643a2045726120456c656374696f6e205374617475732c20426f6e6465642c204c65646765722c205b4f726967696e204163636f756e745d2c204c6f636b73a4202d2057726974653a205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572302023203c2f7765696768743e18756e626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e805501205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64010120706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e250120543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e004901204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665c0207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e003d01204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360293d012063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e656564fc20746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e004820456d6974732060556e626f6e646564602e00982053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e002c2023203c7765696768743e4101202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e6501202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e63656029710120202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652e5101202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c6564207669615c2020206077697468647261775f756e626f6e646564602e40202d204f6e6520444220656e7472792e2c202d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2035302e333420c2b5732c204442205765696768743a2901202d20526561643a2045726120456c656374696f6e205374617475732c204c65646765722c2043757272656e74204572612c204c6f636b732c205b4f726967696e204163636f756e745da4202d2057726974653a205b4f726967696e204163636f756e745d2c204c6f636b732c204c656467657228203c2f7765696768743e4477697468647261775f756e626f6e64656404486e756d5f736c617368696e675f7370616e730c753332782d012052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e003501205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4c2077686174657665722069742077616e74732e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e004c20456d697473206057697468647261776e602e006c2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e002c2023203c7765696768743e5501202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e45012020497420696d706c6965732060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c207768696368206973f42020696e6469726563746c7920757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e7901202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e40202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d090120436f6d706c6578697479204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2072656d6f7665342042617365205765696768743a74205570646174653a2035302e3532202b202e303238202a205320c2b5732501202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c2043757272656e74204572612c204c6f636b732c205b4f726967696e204163636f756e745da8202d205772697465733a205b4f726967696e204163636f756e745d2c204c6f636b732c204c656467657270204b696c6c3a2037392e3431202b20322e333636202a205320c2b5738501202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c2043757272656e74204572612c20426f6e6465642c20536c617368696e67205370616e732c205b4f726967696e204163636f756e745d2c204c6f636b73b101202d205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c205b4f726967696e204163636f756e745d2c204c6f636b7374202d2057726974657320456163683a205370616e536c617368202a20530d01204e4f54453a2057656967687420616e6e6f746174696f6e20697320746865206b696c6c207363656e6172696f2c20776520726566756e64206f74686572776973652e302023203c2f7765696768743e2076616c6964617465041470726566733856616c696461746f72507265667344e8204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e30202d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2031372e313320c2b5732c204442205765696768743a90202d20526561643a2045726120456c656374696f6e205374617475732c204c656467657280202d2057726974653a204e6f6d696e61746f72732c2056616c696461746f7273302023203c2f7765696768743e206e6f6d696e617465041c74617267657473a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e4c1101204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00510120456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546869732063616e206f6e6c792062652063616c6c6564207768656e8c205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743e3101202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f662060746172676574736020284e2901012077686963682069732063617070656420617420436f6d7061637441737369676e6d656e74733a3a4c494d495420284d41585f4e4f4d494e4154494f4e53292ed8202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e28202d2d2d2d2d2d2d2d2d842042617365205765696768743a2032322e3334202b202e3336202a204e20c2b57384207768657265204e20697320746865206e756d626572206f6620746172676574732c204442205765696768743ac8202d2052656164733a2045726120456c656374696f6e205374617475732c204c65646765722c2043757272656e742045726184202d205772697465733a2056616c696461746f72732c204e6f6d696e61746f7273302023203c2f7765696768743e146368696c6c0044c8204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e54202d20436f6e7461696e73206f6e6520726561642ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e24202d2d2d2d2d2d2d2d5c2042617365205765696768743a2031362e353320c2b5732c204442205765696768743a88202d20526561643a20457261456c656374696f6e5374617475732c204c656467657280202d2057726974653a2056616c696461746f72732c204e6f6d696e61746f7273302023203c2f7765696768743e247365745f7061796565041470617965654452657761726444657374696e6174696f6e40b8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e28202d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2031312e333320c2b57334202d204442205765696768743a4c20202020202d20526561643a204c65646765724c20202020202d2057726974653a205061796565302023203c2f7765696768743e387365745f636f6e74726f6c6c65720428636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654090202852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e2c202d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a2032352e323220c2b5732c204442205765696768743af4202d20526561643a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c6572f8202d2057726974653a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c6572302023203c2f7765696768743e4c7365745f76616c696461746f725f636f756e74040c6e657730436f6d706163743c7533323e209420536574732074686520696465616c206e756d626572206f662076616c696461746f72732e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e5c2042617365205765696768743a20312e37313720c2b5735c2057726974653a2056616c696461746f7220436f756e74302023203c2f7765696768743e60696e6372656173655f76616c696461746f725f636f756e7404286164646974696f6e616c30436f6d706163743c7533323e20ac20496e6372656d656e74732074686520696465616c206e756d626572206f662076616c696461746f72732e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e5c2042617365205765696768743a20312e37313720c2b5737020526561642f57726974653a2056616c696461746f7220436f756e74302023203c2f7765696768743e547363616c655f76616c696461746f725f636f756e740418666163746f721c50657263656e7420d4205363616c652075702074686520696465616c206e756d626572206f662076616c696461746f7273206279206120666163746f722e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e5c2042617365205765696768743a20312e37313720c2b5737020526561642f57726974653a2056616c696461746f7220436f756e74302023203c2f7765696768743e34666f7263655f6e6f5f657261730024b020466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e64202d2042617365205765696768743a20312e38353720c2b57348202d2057726974653a20466f726365457261302023203c2f7765696768743e34666f7263655f6e65775f65726100284d0120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c206265a020726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e64202d2042617365205765696768743a20312e39353920c2b57344202d20577269746520466f726365457261302023203c2f7765696768743e447365745f696e76756c6e657261626c6573042876616c696461746f7273445665633c543a3a4163636f756e7449643e24cc20536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e1c202d204f28562990202d2042617365205765696768743a20322e323038202b202e303036202a205620c2b5735c202d2057726974653a20496e76756c6e657261626c6573302023203c2f7765696768743e34666f7263655f756e7374616b650814737461736830543a3a4163636f756e744964486e756d5f736c617368696e675f7370616e730c7533322c0d0120466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743eec204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2062652072656d6f7665648c2042617365205765696768743a2035332e3037202b20322e333635202a205320c2b573b82052656164733a20426f6e6465642c20536c617368696e67205370616e732c204163636f756e742c204c6f636b738501205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c204163636f756e742c204c6f636b736c2057726974657320456163683a205370616e536c617368202a2053302023203c2f7765696768743e50666f7263655f6e65775f6572615f616c776179730020050120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e60202d2042617365205765696768743a20322e303520c2b57348202d2057726974653a20466f726365457261302023203c2f7765696768743e5463616e63656c5f64656665727265645f736c617368080c65726120457261496e64657834736c6173685f696e6469636573205665633c7533323e38982043616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e00b42043616e2062652063616c6c6564206279207468652060543a3a536c61736843616e63656c4f726967696e602e00050120506172616d65746572733a2065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e002c2023203c7765696768743e5420436f6d706c65786974793a204f2855202b205329b82077697468205520756e6170706c69656420736c6173686573207765696768746564207769746820553d31303030d420616e64205320697320746865206e756d626572206f6620736c61736820696e646963657320746f2062652063616e63656c65642e74202d20426173653a2035383730202b2033342e3631202a205320c2b57368202d20526561643a20556e6170706c69656420536c61736865736c202d2057726974653a20556e6170706c69656420536c6173686573302023203c2f7765696768743e387061796f75745f7374616b657273083c76616c696461746f725f737461736830543a3a4163636f756e7449640c65726120457261496e64657864110120506179206f757420616c6c20746865207374616b65727320626568696e6420612073696e676c652076616c696461746f7220666f7220612073696e676c65206572612e004d01202d206076616c696461746f725f73746173686020697320746865207374617368206163636f756e74206f66207468652076616c696461746f722e205468656972206e6f6d696e61746f72732c20757020746f290120202060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602c2077696c6c20616c736f207265636569766520746865697220726577617264732e3501202d206065726160206d617920626520616e7920657261206265747765656e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e00590120546865206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e20416e79206163636f756e742063616e2063616c6c20746869732066756e6374696f6e2c206576656e20696678206974206973206e6f74206f6e65206f6620746865207374616b6572732e00010120546869732063616e206f6e6c792062652063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743e0101202d2054696d6520636f6d706c65786974793a206174206d6f7374204f284d61784e6f6d696e61746f72526577617264656450657256616c696461746f72292ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e30202d2d2d2d2d2d2d2d2d2d2d1d01204e20697320746865204e756d626572206f66207061796f75747320666f72207468652076616c696461746f722028696e636c7564696e67207468652076616c696461746f7229342042617365205765696768743a0101202d205265776172642044657374696e6174696f6e205374616b65643a20313130202b2035342e32202a204e20c2b57320284d656469616e20536c6f706573294101202d205265776172642044657374696e6174696f6e20436f6e74726f6c6c657220284372656174696e67293a20313230202b2034312e3935202a204e20c2b57320284d656469616e20536c6f706573292c204442205765696768743a2901202d20526561643a20457261456c656374696f6e5374617475732c2043757272656e744572612c20486973746f727944657074682c204572617356616c696461746f725265776172642c2d01202020202020202020457261735374616b657273436c69707065642c2045726173526577617264506f696e74732c204572617356616c696461746f725072656673202838206974656d73291101202d205265616420456163683a20426f6e6465642c204c65646765722c2050617965652c204c6f636b732c2053797374656d204163636f756e74202835206974656d7329d8202d20577269746520456163683a2053797374656d204163636f756e742c204c6f636b732c204c6564676572202833206974656d7329302023203c2f7765696768743e187265626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e3ce0205265626f6e64206120706f7274696f6e206f6620746865207374617368207363686564756c656420746f20626520756e6c6f636b65642e00550120546865206469737061746368206f726967696e206d757374206265207369676e65642062792074686520636f6e74726f6c6c65722c20616e642069742063616e206265206f6e6c792063616c6c6564207768656e8c205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743ed4202d2054696d6520636f6d706c65786974793a204f284c292c207768657265204c20697320756e6c6f636b696e67206368756e6b7394202d20426f756e64656420627920604d41585f554e4c4f434b494e475f4348554e4b53602ef4202d2053746f72616765206368616e6765733a2043616e277420696e6372656173652073746f726167652c206f6e6c792064656372656173652069742e40202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d98202d2042617365205765696768743a2033342e353120c2b573202a202e303438204c20c2b57334202d204442205765696768743a010120202020202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c204c6f636b732c205b4f726967696e204163636f756e745db820202020202d205772697465733a205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572302023203c2f7765696768743e447365745f686973746f72795f646570746808446e65775f686973746f72795f646570746844436f6d706163743c457261496e6465783e485f6572615f6974656d735f64656c6574656430436f6d706163743c7533323e543101205365742060486973746f72794465707468602076616c75652e20546869732066756e6374696f6e2077696c6c2064656c65746520616e7920686973746f727920696e666f726d6174696f6e80207768656e2060486973746f727944657074686020697320726564756365642e003020506172616d65746572733a1101202d20606e65775f686973746f72795f6465707468603a20546865206e657720686973746f727920646570746820796f7520776f756c64206c696b6520746f207365742e4901202d20606572615f6974656d735f64656c65746564603a20546865206e756d626572206f66206974656d7320746861742077696c6c2062652064656c6574656420627920746869732064697370617463682e450120202020546869732073686f756c64207265706f727420616c6c207468652073746f72616765206974656d7320746861742077696c6c2062652064656c6574656420627920636c656172696e67206f6c6445012020202065726120686973746f72792e204e656564656420746f207265706f727420616e2061636375726174652077656967687420666f72207468652064697370617463682e2054727573746564206279a02020202060526f6f746020746f207265706f727420616e206163637572617465206e756d6265722e0054204f726967696e206d75737420626520726f6f742e002c2023203c7765696768743ee0202d20453a204e756d626572206f6620686973746f7279206465707468732072656d6f7665642c20692e652e203130202d3e2037203d203374202d2042617365205765696768743a2032392e3133202a204520c2b57334202d204442205765696768743aa020202020202d2052656164733a2043757272656e74204572612c20486973746f72792044657074687020202020202d205772697465733a20486973746f7279204465707468310120202020202d20436c6561722050726566697820456163683a20457261205374616b6572732c204572615374616b657273436c69707065642c204572617356616c696461746f725072656673810120202020202d2057726974657320456163683a204572617356616c696461746f725265776172642c2045726173526577617264506f696e74732c2045726173546f74616c5374616b652c2045726173537461727453657373696f6e496e646578302023203c2f7765696768743e28726561705f73746173680814737461736830543a3a4163636f756e744964486e756d5f736c617368696e675f7370616e730c7533324039012052656d6f766520616c6c20646174612073747275637475726520636f6e6365726e696e672061207374616b65722f7374617368206f6e6365206974732062616c616e6365206973207a65726f2e6101205468697320697320657373656e7469616c6c79206571756976616c656e7420746f206077697468647261775f756e626f6e64656460206578636570742069742063616e2062652063616c6c656420627920616e796f6e65c020616e6420746865207461726765742060737461736860206d7573742068617665206e6f2066756e6473206c6566742e009020546869732063616e2062652063616c6c65642066726f6d20616e79206f726967696e2e000101202d20607374617368603a20546865207374617368206163636f756e7420746f20726561702e204974732062616c616e6365206d757374206265207a65726f2e002c2023203c7765696768743e250120436f6d706c65786974793a204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e73206f6e20746865206163636f756e742e8c2042617365205765696768743a2037352e3934202b20322e333936202a205320c2b5732c204442205765696768743ad8202d2052656164733a205374617368204163636f756e742c20426f6e6465642c20536c617368696e67205370616e732c204c6f636b73a501202d205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c205374617368204163636f756e742c204c6f636b7374202d2057726974657320456163683a205370616e536c617368202a2053302023203c2f7765696768743e607375626d69745f656c656374696f6e5f736f6c7574696f6e141c77696e6e6572734c5665633c56616c696461746f72496e6465783e1c636f6d7061637448436f6d7061637441737369676e6d656e74731473636f726534456c656374696f6e53636f72650c65726120457261496e6465781073697a6530456c656374696f6e53697a65bce4205375626d697420616e20656c656374696f6e20726573756c7420746f2074686520636861696e2e2049662074686520736f6c7574696f6e3a003420312e2069732076616c69642e150120322e206861732061206265747465722073636f7265207468616e206120706f74656e7469616c6c79206578697374696e6720736f6c7574696f6e206f6e20636861696e2e0084207468656e2c2069742077696c6c206265205f7075745f206f6e20636861696e2e00ac204120736f6c7574696f6e20636f6e7369737473206f662074776f20706965636573206f6620646174613a00f420312e206077696e6e657273603a206120666c617420766563746f72206f6620616c6c207468652077696e6e657273206f662074686520726f756e642e510120322e206061737369676e6d656e7473603a2074686520636f6d706163742076657273696f6e206f6620616e2061737369676e6d656e7420766563746f72207468617420656e636f6465732074686520656467653020202020776569676874732e00210120426f7468206f66207768696368206d617920626520636f6d7075746564207573696e67205f70687261676d656e5f2c206f7220616e79206f7468657220616c676f726974686d2e00a8204164646974696f6e616c6c792c20746865207375626d6974746572206d7573742070726f766964653a00c8202d20546865206073636f7265602074686174207468657920636c61696d20746865697220736f6c7574696f6e206861732e004d0120426f74682076616c696461746f727320616e64206e6f6d696e61746f72732077696c6c20626520726570726573656e74656420627920696e646963657320696e2074686520736f6c7574696f6e2e205468651d0120696e64696365732073686f756c6420726573706563742074686520636f72726573706f6e64696e6720747970657320285b6056616c696461746f72496e646578605d20616e643101205b604e6f6d696e61746f72496e646578605d292e204d6f72656f7665722c20746865792073686f756c642062652076616c6964207768656e207573656420746f20696e64657820696e746f5101205b60536e617073686f7456616c696461746f7273605d20616e64205b60536e617073686f744e6f6d696e61746f7273605d2e20416e7920696e76616c696420696e6465782077696c6c20636175736520746865610120736f6c7574696f6e20746f2062652072656a65637465642e2054686573652074776f2073746f72616765206974656d73206172652073657420647572696e672074686520656c656374696f6e2077696e646f7720616e6498206d6179206265207573656420746f2064657465726d696e652074686520696e64696365732e0060204120736f6c7574696f6e2069732076616c69642069663a00e420302e204974206973207375626d6974746564207768656e205b60457261456c656374696f6e537461747573605d20697320604f70656e602ef820312e2049747320636c61696d65642073636f726520697320657175616c20746f207468652073636f726520636f6d7075746564206f6e2d636861696e2eac20322e2050726573656e74732074686520636f7272656374206e756d626572206f662077696e6e6572732e550120332e20416c6c20696e6465786573206d7573742062652076616c7565206163636f7264696e6720746f2074686520736e617073686f7420766563746f72732e20416c6c20656467652076616c756573206d7573745d0120202020616c736f20626520636f727265637420616e642073686f756c64206e6f74206f766572666c6f7720746865206772616e756c6172697479206f662074686520726174696f20747970652028692e652e2032353640202020206f722062696c6c696f6e292e0d0120342e20466f72206561636820656467652c20616c6c2074617267657473206172652061637475616c6c79206e6f6d696e617465642062792074686520766f7465722e6c20352e2048617320636f72726563742073656c662d766f7465732e00c0204120736f6c7574696f6e732073636f726520697320636f6e736973746564206f66203320706172616d65746572733a00650120312e20606d696e207b20737570706f72742e746f74616c207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c64206265206d6178696d697a65642e650120322e206073756d207b20737570706f72742e746f74616c207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c64206265206d696e696d697a65642e410120332e206073756d207b20737570706f72742e746f74616c5e32207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c642062659c202020206d696e696d697a65642028746f20656e73757265206c6573732076617269616e636529002c2023203c7765696768743e7020536565206063726174653a3a77656967687460206d6f64756c652e302023203c2f7765696768743e847375626d69745f656c656374696f6e5f736f6c7574696f6e5f756e7369676e6564141c77696e6e6572734c5665633c56616c696461746f72496e6465783e1c636f6d7061637448436f6d7061637441737369676e6d656e74731473636f726534456c656374696f6e53636f72650c65726120457261496e6465781073697a6530456c656374696f6e53697a6524c020556e7369676e65642076657273696f6e206f6620607375626d69745f656c656374696f6e5f736f6c7574696f6e602e005d01204e6f746520746861742074686973206d757374207061737320746865205b6056616c6964617465556e7369676e6564605d20636865636b207768696368206f6e6c7920616c6c6f7773207472616e73616374696f6e7361012066726f6d20746865206c6f63616c206e6f646520746f20626520696e636c756465642e20496e206f7468657220776f7264732c206f6e6c792074686520626c6f636b20617574686f722063616e20696e636c756465206168207472616e73616374696f6e20696e2074686520626c6f636b2e002c2023203c7765696768743e7020536565206063726174653a3a77656967687460206d6f64756c652e302023203c2f7765696768743e0124244572615061796f75740c20457261496e6465781c42616c616e63651c42616c616e63650859012054686520657261207061796f757420686173206265656e207365743b207468652066697273742062616c616e6365206973207468652076616c696461746f722d7061796f75743b20746865207365636f6e64206973c4207468652072656d61696e6465722066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642e1852657761726408244163636f756e7449641c42616c616e6365043d0120546865207374616b657220686173206265656e207265776172646564206279207468697320616d6f756e742e20604163636f756e7449646020697320746865207374617368206163636f756e742e14536c61736808244163636f756e7449641c42616c616e6365042501204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e684f6c64536c617368696e675265706f7274446973636172646564043053657373696f6e496e646578081d0120416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c6448206e6f742062652070726f6365737365642e3c5374616b696e67456c656374696f6e043c456c656374696f6e436f6d707574650411012041206e657720736574206f66207374616b6572732077617320656c656374656420776974682074686520676976656e20636f6d7075746174696f6e206d6574686f642e38536f6c7574696f6e53746f726564043c456c656374696f6e436f6d7075746504e82041206e657720736f6c7574696f6e20666f7220746865207570636f6d696e6720656c656374696f6e20686173206265656e2073746f7265642e18426f6e64656408244163636f756e7449641c42616c616e6365108c20416e206163636f756e742068617320626f6e646564207468697320616d6f756e742e005101204e4f54453a2054686973206576656e74206973206f6e6c7920656d6974746564207768656e2066756e64732061726520626f6e64656420766961206120646973706174636861626c652e204e6f7461626c792c25012069742077696c6c206e6f7420626520656d697474656420666f72207374616b696e672072657761726473207768656e20746865792061726520616464656420746f207374616b652e20556e626f6e64656408244163636f756e7449641c42616c616e6365049420416e206163636f756e742068617320756e626f6e646564207468697320616d6f756e742e2457697468647261776e08244163636f756e7449641c42616c616e6365085d0120416e206163636f756e74206861732063616c6c6564206077697468647261775f756e626f6e6465646020616e642072656d6f76656420756e626f6e64696e67206368756e6b7320776f727468206042616c616e636560682066726f6d2074686520756e6c6f636b696e672071756575652e1c3853657373696f6e735065724572613053657373696f6e496e64657810060000000470204e756d626572206f662073657373696f6e7320706572206572612e3c426f6e64696e674475726174696f6e20457261496e64657810a002000004e4204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e48536c61736844656665724475726174696f6e20457261496e64657810a8000000140101204e756d626572206f662065726173207468617420736c6173686573206172652064656665727265642062792c20616674657220636f6d7075746174696f6e2e00bc20546869732073686f756c64206265206c657373207468616e2074686520626f6e64696e67206475726174696f6e2e2d012053657420746f203020696620736c61736865732073686f756c64206265206170706c69656420696d6d6564696174656c792c20776974686f7574206f70706f7274756e69747920666f723820696e74657276656e74696f6e2e44456c656374696f6e4c6f6f6b616865616438543a3a426c6f636b4e756d62657210320000001c710120546865206e756d626572206f6620626c6f636b73206265666f72652074686520656e64206f6620746865206572612066726f6d20776869636820656c656374696f6e207375626d697373696f6e732061726520616c6c6f7765642e006d012053657474696e67207468697320746f207a65726f2077696c6c2064697361626c6520746865206f6666636861696e20636f6d7075746520616e64206f6e6c79206f6e2d636861696e207365712d70687261676d656e2077696c6c2420626520757365642e007501205468697320697320626f756e646564206279206265696e672077697468696e20746865206c6173742073657373696f6e2e2048656e63652c2073657474696e6720697420746f20612076616c7565206d6f7265207468616e207468659c206c656e677468206f6620612073657373696f6e2077696c6c20626520706f696e746c6573732e344d6178497465726174696f6e730c753332100a0000000c2901204d6178696d756d206e756d626572206f662062616c616e63696e6720697465726174696f6e7320746f2072756e20696e20746865206f6666636861696e207375626d697373696f6e2e00ec2049662073657420746f20302c2062616c616e63655f736f6c7574696f6e2077696c6c206e6f7420626520657865637574656420617420616c6c2e504d696e536f6c7574696f6e53636f726542756d701c50657262696c6c1020a1070004610120546865207468726573686f6c64206f6620696d70726f76656d656e7420746861742073686f756c642062652070726f766964656420666f722061206e657720736f6c7574696f6e20746f2062652061636365707465642e804d61784e6f6d696e61746f72526577617264656450657256616c696461746f720c753332104000000010f820546865206d6178696d756d206e756d626572206f66206e6f6d696e61746f727320726577617264656420666f7220656163682076616c696461746f722e00690120466f7220656163682076616c696461746f72206f6e6c79207468652060244d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732063616e20636c61696d2101207468656972207265776172642e2054686973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e7c344e6f74436f6e74726f6c6c65720468204e6f74206120636f6e74726f6c6c6572206163636f756e742e204e6f7453746173680454204e6f742061207374617368206163636f756e742e34416c7265616479426f6e646564046420537461736820697320616c726561647920626f6e6465642e34416c7265616479506169726564047820436f6e74726f6c6c657220697320616c7265616479207061697265642e30456d70747954617267657473046420546172676574732063616e6e6f7420626520656d7074792e384475706c6963617465496e6465780444204475706c696361746520696e6465782e44496e76616c6964536c617368496e646578048820536c617368207265636f726420696e646578206f7574206f6620626f756e64732e44496e73756666696369656e7456616c756504cc2043616e206e6f7420626f6e6420776974682076616c7565206c657373207468616e206d696e696d756d2062616c616e63652e304e6f4d6f72654368756e6b7304942043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e344e6f556e6c6f636b4368756e6b04a42043616e206e6f74207265626f6e6420776974686f757420756e6c6f636b696e67206368756e6b732e3046756e64656454617267657404cc20417474656d7074696e6720746f2074617267657420612073746173682074686174207374696c6c206861732066756e64732e48496e76616c6964457261546f526577617264045c20496e76616c69642065726120746f207265776172642e68496e76616c69644e756d6265724f664e6f6d696e6174696f6e73047c20496e76616c6964206e756d626572206f66206e6f6d696e6174696f6e732e484e6f74536f72746564416e64556e697175650484204974656d7320617265206e6f7420736f7274656420616e6420756e697175652e38416c7265616479436c61696d6564040d01205265776172647320666f72207468697320657261206861766520616c7265616479206265656e20636c61696d656420666f7220746869732076616c696461746f722e5c50687261676d656e4561726c795375626d697373696f6e04e420546865207375626d697474656420726573756c74206973207265636569766564206f7574206f6620746865206f70656e2077696e646f772e5850687261676d656e5765616b5375626d697373696f6e04010120546865207375626d697474656420726573756c74206973206e6f7420617320676f6f6420617320746865206f6e652073746f726564206f6e20636861696e2e4c536e617073686f74556e617661696c61626c6504d02054686520736e617073686f742064617461206f66207468652063757272656e742077696e646f77206973206d697373696e672e6050687261676d656e426f67757357696e6e6572436f756e7404b020496e636f7272656374206e756d626572206f662077696e6e65727320776572652070726573656e7465642e4c50687261676d656e426f67757357696e6e6572086101204f6e65206f6620746865207375626d69747465642077696e6e657273206973206e6f7420616e206163746976652063616e646964617465206f6e20636861696e2028696e646578206973206f7574206f662072616e67653820696e20736e617073686f74292e5050687261676d656e426f677573436f6d70616374085d01204572726f72207768696c65206275696c64696e67207468652061737369676e6d656e7420747970652066726f6d2074686520636f6d706163742e20546869732063616e2068617070656e20696620616e20696e646578a820697320696e76616c69642c206f72206966207468652077656967687473205f6f766572666c6f775f2e5850687261676d656e426f6775734e6f6d696e61746f72041501204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f7273206973206e6f7420616e20616374697665206e6f6d696e61746f72206f6e20636861696e2e5c50687261676d656e426f6775734e6f6d696e6174696f6e044d01204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f72732068617320616e206564676520746f20776869636820746865792068617665206e6f7420766f746564206f6e20636861696e2e6450687261676d656e536c61736865644e6f6d696e6174696f6e086101204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f72732068617320616e2065646765207768696368206973207375626d6974746564206265666f726520746865206c617374206e6f6e2d7a65726f5420736c617368206f6620746865207461726765742e5450687261676d656e426f67757353656c66566f746504250120412073656c6620766f7465206d757374206f6e6c79206265206f726967696e617465642066726f6d20612076616c696461746f7220746f204f4e4c59207468656d73656c7665732e4450687261676d656e426f6775734564676504450120546865207375626d697474656420726573756c742068617320756e6b6e6f776e206564676573207468617420617265206e6f7420616d6f6e67207468652070726573656e7465642077696e6e6572732e4850687261676d656e426f67757353636f72650419012054686520636c61696d65642073636f726520646f6573206e6f74206d61746368207769746820746865206f6e6520636f6d70757465642066726f6d2074686520646174612e6450687261676d656e426f677573456c656374696f6e53697a6504782054686520656c656374696f6e2073697a6520697320696e76616c69642e3843616c6c4e6f74416c6c6f776564044901205468652063616c6c206973206e6f7420616c6c6f7765642061742074686520676976656e2074696d652064756520746f207265737472696374696f6e73206f6620656c656374696f6e20706572696f642e54496e636f7272656374486973746f7279446570746804c420496e636f72726563742070726576696f757320686973746f727920646570746820696e7075742070726f76696465642e58496e636f7272656374536c617368696e675370616e7304b420496e636f7272656374206e756d626572206f6620736c617368696e67207370616e732070726f76696465642e1c53657373696f6e011c53657373696f6e1c2856616c696461746f727301004c5665633c543a3a56616c696461746f7249643e0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e64657801003053657373696f6e496e646578100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e676564010010626f6f6c040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b6579730100785665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e0400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f72730100205665633c7533323e04000c8020496e6469636573206f662064697361626c65642076616c696461746f72732e003501205468652073657420697320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e732061206e657720736574206f66206964656e7469746965732e204e6578744b65797300010538543a3a56616c696461746f7249641c543a3a4b657973000400049c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e204b65794f776e657200010550284b65795479706549642c205665633c75383e2938543a3a56616c696461746f72496400040004090120546865206f776e6572206f662061206b65792e20546865206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e0108207365745f6b65797308106b6579731c543a3a4b6579731470726f6f661c5665633c75383e38e82053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b657973602e210120416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec4205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d420546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960590120202041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642ef0202d20446252656164733a20606f726967696e206163636f756e74602c2060543a3a56616c696461746f7249644f66602c20604e6578744b65797360a4202d2044625772697465733a20606f726967696e206163636f756e74602c20604e6578744b6579736084202d204462526561647320706572206b65792069643a20604b65794f776e65726088202d20446257726974657320706572206b65792069643a20604b65794f776e657260302023203c2f7765696768743e2870757267655f6b6579730030cc2052656d6f76657320616e792073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c65722ec4205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d420546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002c2023203c7765696768743eb4202d20436f6d706c65786974793a20604f2831296020696e206e756d626572206f66206b65792074797065732e590120202041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642ef0202d20446252656164733a2060543a3a56616c696461746f7249644f66602c20604e6578744b657973602c20606f726967696e206163636f756e7460a4202d2044625772697465733a20604e6578744b657973602c20606f726967696e206163636f756e74608c202d20446257726974657320706572206b65792069643a20604b65794f776e64657260302023203c2f7765696768743e0104284e657753657373696f6e043053657373696f6e496e646578085501204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b88206e756d626572206173207468652074797065206d6967687420737567676573742e001030496e76616c696450726f6f66046420496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f72496404a0204e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b657904682052656769737465726564206475706c6963617465206b65792e184e6f4b65797304a8204e6f206b65797320617265206173736f63696174656420776974682074686973206163636f756e742e2444656d6f6372616379012444656d6f6372616379383c5075626c696350726f70436f756e7401002450726f70496e646578100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f707301009c5665633c2850726f70496e6465782c20543a3a486173682c20543a3a4163636f756e744964293e040004210120546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865207365636f6e64206974656d206973207468652070726f706f73616c277320686173682e244465706f7369744f660001052450726f70496e64657884285665633c543a3a4163636f756e7449643e2c2042616c616e63654f663c543e290004000c842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e00d82054574f582d4e4f54453a20536166652c20617320696e6372656173696e6720696e7465676572206b6579732061726520736166652e24507265696d616765730001061c543a3a48617368e8507265696d6167655374617475733c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e000400086101204d6170206f662068617368657320746f207468652070726f706f73616c20707265696d6167652c20616c6f6e6720776974682077686f207265676973746572656420697420616e64207468656972206465706f7369742ee42054686520626c6f636b206e756d6265722069732074686520626c6f636b20617420776869636820697420776173206465706f73697465642e3c5265666572656e64756d436f756e7401003c5265666572656e64756d496e646578100000000004310120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e344c6f77657374556e62616b656401003c5265666572656e64756d496e646578100000000008250120546865206c6f77657374207265666572656e64756d20696e64657820726570726573656e74696e6720616e20756e62616b6564207265666572656e64756d2e20457175616c20746fdc20605265666572656e64756d436f756e74602069662074686572652069736e2774206120756e62616b6564207265666572656e64756d2e405265666572656e64756d496e666f4f660001053c5265666572656e64756d496e646578d45265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a486173682c2042616c616e63654f663c543e3e0004000cb420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e0009012054574f582d4e4f54453a205341464520617320696e646578657320617265206e6f7420756e64657220616e2061747461636b6572e280997320636f6e74726f6c2e20566f74696e674f6601010530543a3a4163636f756e744964c8566f74696e673c42616c616e63654f663c543e2c20543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265723e00d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105d0120416c6c20766f74657320666f72206120706172746963756c617220766f7465722e2057652073746f7265207468652062616c616e636520666f7220746865206e756d626572206f6620766f74657320746861742077655d012068617665207265636f726465642e20546865207365636f6e64206974656d2069732074686520746f74616c20616d6f756e74206f662064656c65676174696f6e732c20746861742077696c6c2062652061646465642e00e82054574f582d4e4f54453a205341464520617320604163636f756e7449646073206172652063727970746f2068617368657320616e797761792e144c6f636b7300010530543a3a4163636f756e74496438543a3a426c6f636b4e756d626572000400105d01204163636f756e747320666f7220776869636820746865726520617265206c6f636b7320696e20616374696f6e207768696368206d61792062652072656d6f76656420617420736f6d6520706f696e7420696e207468655101206675747572652e205468652076616c75652069732074686520626c6f636b206e756d62657220617420776869636820746865206c6f636b206578706972657320616e64206d61792062652072656d6f7665642e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e544c6173745461626c656457617345787465726e616c010010626f6f6c0400085901205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c6963282070726f706f73616c2e304e65787445787465726e616c00006028543a3a486173682c20566f74655468726573686f6c6429040010590120546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e550120546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743aa4202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f7268202d20605075626c696350726f70736020697320656d7074792e24426c61636b6c6973740001061c543a3a486173688c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e290004000851012041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d626572e82028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e3443616e63656c6c6174696f6e730101061c543a3a4861736810626f6f6c000400042901205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e3853746f7261676556657273696f6e00002052656c656173657304000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e0098204e6577206e6574776f726b732073746172742077697468206c6173742076657273696f6e2e015c1c70726f706f7365083470726f706f73616c5f686173681c543a3a486173681476616c756554436f6d706163743c42616c616e63654f663c543e3e44a02050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e00190120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573748420686176652066756e647320746f20636f76657220746865206465706f7369742e00d8202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20707265696d6167652e1901202d206076616c7565603a2054686520616d6f756e74206f66206465706f73697420286d757374206265206174206c6561737420604d696e696d756d4465706f73697460292e004820456d697473206050726f706f736564602e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960b4202d2044622072656164733a20605075626c696350726f70436f756e74602c20605075626c696350726f707360ec202d204462207772697465733a20605075626c696350726f70436f756e74602c20605075626c696350726f7073602c20604465706f7369744f666050202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d45012042617365205765696768743a2034322e3538202b202e313237202a205020c2b57320776974682060506020746865206e756d626572206f662070726f706f73616c7320605075626c696350726f707360302023203c2f7765696768743e187365636f6e64082070726f706f73616c48436f6d706163743c50726f70496e6465783e4c7365636f6e64735f75707065725f626f756e6430436f6d706163743c7533323e40b8205369676e616c732061677265656d656e742077697468206120706172746963756c61722070726f706f73616c2e00050120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e6465721501206d75737420686176652066756e647320746f20636f76657220746865206465706f7369742c20657175616c20746f20746865206f726967696e616c206465706f7369742e00cc202d206070726f706f73616c603a2054686520696e646578206f66207468652070726f706f73616c20746f207365636f6e642e4501202d20607365636f6e64735f75707065725f626f756e64603a20616e20757070657220626f756e64206f6e207468652063757272656e74206e756d626572206f66207365636f6e6473206f6e2074686973290120202070726f706f73616c2e2045787472696e736963206973207765696768746564206163636f7264696e6720746f20746869732076616c75652077697468206e6f20726566756e642e002c2023203c7765696768743e3901202d20436f6d706c65786974793a20604f28532960207768657265205320697320746865206e756d626572206f66207365636f6e647320612070726f706f73616c20616c7265616479206861732e60202d2044622072656164733a20604465706f7369744f666064202d204462207772697465733a20604465706f7369744f666028202d2d2d2d2d2d2d2d2d90202d2042617365205765696768743a2032322e3238202b202e323239202a205320c2b573302023203c2f7765696768743e10766f746508247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e10766f7465644163636f756e74566f74653c42616c616e63654f663c543e3e48350120566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bbc206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00e0202d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f20766f746520666f722e88202d2060766f7465603a2054686520766f746520636f6e66696775726174696f6e2e002c2023203c7765696768743e4901202d20436f6d706c65786974793a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722068617320766f746564206f6e2ea42020207765696768742069732063686172676564206173206966206d6178696d756d20766f7465732ef4202d2044622072656164733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f66602c206062616c616e636573206c6f636b7360f8202d204462207772697465733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f66602c206062616c616e636573206c6f636b736054202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743a9420202020202d20566f7465204e65773a2034392e3234202b202e333333202a205220c2b573a820202020202d20566f7465204578697374696e673a2034392e3934202b202e333433202a205220c2b573302023203c2f7765696768743e40656d657267656e63795f63616e63656c04247265665f696e6465783c5265666572656e64756d496e646578385101205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d6530207265666572656e64756d2e00fc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206043616e63656c6c6174696f6e4f726967696e602e00d4202d607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e002c2023203c7765696768743e58202d20436f6d706c65786974793a20604f283129602ec0202d2044622072656164733a20605265666572656e64756d496e666f4f66602c206043616e63656c6c6174696f6e7360c4202d204462207772697465733a20605265666572656e64756d496e666f4f66602c206043616e63656c6c6174696f6e736038202d2d2d2d2d2d2d2d2d2d2d2d2d64202d2042617365205765696768743a2033342e323520c2b573302023203c2f7765696768743e4065787465726e616c5f70726f706f7365043470726f706f73616c5f686173681c543a3a48617368383101205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c30207265666572656e64756d2e00ec20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206045787465726e616c4f726967696e602e00d8202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e002c2023203c7765696768743e2d01202d20436f6d706c657869747920604f2856296020776974682056206e756d626572206f66207665746f65727320696e2074686520626c61636b6c697374206f662070726f706f73616c2ebc2020204465636f64696e6720766563206f66206c656e67746820562e2043686172676564206173206d6178696d756da0202d2044622072656164733a20604e65787445787465726e616c602c2060426c61636b6c6973746070202d204462207772697465733a20604e65787445787465726e616c608c202d2042617365205765696768743a2031332e38202b202e313036202a205620c2b573302023203c2f7765696768743e6465787465726e616c5f70726f706f73655f6d616a6f72697479043470726f706f73616c5f686173681c543a3a486173683c5901205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c656020616e2065787465726e616c207265666572656e64756d2e00f020546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c4d616a6f726974794f726967696e602e00d8202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f283129606c202d2044622077726974653a20604e65787445787465726e616c6064202d2042617365205765696768743a20332e30363520c2b573302023203c2f7765696768743e6065787465726e616c5f70726f706f73655f64656661756c74043470726f706f73616c5f686173681c543a3a486173683c4901205363686564756c652061206e656761746976652d7475726e6f75742d62696173207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f84207363686564756c6520616e2065787465726e616c207265666572656e64756d2e00ec20546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c44656661756c744f726967696e602e00d8202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004d0120556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c61636520619c207072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f283129606c202d2044622077726974653a20604e65787445787465726e616c6064202d2042617365205765696768743a20332e30383720c2b573302023203c2f7765696768743e28666173745f747261636b0c3470726f706f73616c5f686173681c543a3a4861736834766f74696e675f706572696f6438543a3a426c6f636b4e756d6265721464656c617938543a3a426c6f636b4e756d626572505101205363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564650120696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e65ec20627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e00d420546865206469737061746368206f6620746869732063616c6c206d757374206265206046617374547261636b4f726967696e602e00f8202d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e6101202d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e20496e6372656173656420746f982020206046617374547261636b566f74696e67506572696f646020696620746f6f206c6f772e5501202d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265bc202020656e61637465642e205468697320646f65736e277420686176652061206d696e696d756d20616d6f756e742e004420456d697473206053746172746564602e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960b8202d2044622072656164733a20604e65787445787465726e616c602c20605265666572656e64756d436f756e74600d01202d204462207772697465733a20604e65787445787465726e616c602c20605265666572656e64756d436f756e74602c20605265666572656e64756d496e666f4f666060202d2042617365205765696768743a2033302e3120c2b573302023203c2f7765696768743e347665746f5f65787465726e616c043470726f706f73616c5f686173681c543a3a486173683cbc205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e00dc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d75737420626520605665746f4f726967696e602e003101202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c20746f207665746f20616e6420626c61636b6c6973742e004020456d69747320605665746f6564602e002c2023203c7765696768743e1901202d20436f6d706c65786974793a20604f2856202b206c6f6728562929602077686572652056206973206e756d626572206f6620606578697374696e67207665746f657273604501202020506572666f726d7320612062696e61727920736561726368206f6e20606578697374696e675f7665746f657273602077686963682073686f756c64206e6f742062652076657279206c617267652ea0202d2044622072656164733a20604e65787445787465726e616c602c2060426c61636b6c69737460a4202d204462207772697465733a20604e65787445787465726e616c602c2060426c61636b6c6973746090202d2042617365205765696768743a2032392e3837202b202e313838202a205620c2b573302023203c2f7765696768743e4463616e63656c5f7265666572656e64756d04247265665f696e64657860436f6d706163743c5265666572656e64756d496e6465783e2c542052656d6f76652061207265666572656e64756d2e00c420546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e00d8202d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e002c2023203c7765696768743e58202d20436f6d706c65786974793a20604f283129602e80202d204462207772697465733a20605265666572656e64756d496e666f4f666064202d2042617365205765696768743a2032312e353720c2b573302023203c2f7765696768743e3463616e63656c5f717565756564041477686963683c5265666572656e64756d496e64657830a02043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e00c420546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e00c8202d20607768696368603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e002c2023203c7765696768743e3501202d20604f284429602077686572652060446020697320746865206974656d7320696e207468652064697370617463682071756575652e205765696768746564206173206044203d203130602ec8202d2044622072656164733a20607363686564756c6572206c6f6f6b7570602c207363686564756c6572206167656e646160cc202d204462207772697465733a20607363686564756c6572206c6f6f6b7570602c207363686564756c6572206167656e64616094202d2042617365205765696768743a2033362e3738202b20332e323737202a204420c2b573302023203c2f7765696768743e2064656c65676174650c08746f30543a3a4163636f756e74496428636f6e76696374696f6e28436f6e76696374696f6e1c62616c616e63653042616c616e63654f663c543e6c3d012044656c65676174652074686520766f74696e6720706f77657220287769746820736f6d6520676976656e20636f6e76696374696f6e29206f66207468652073656e64696e67206163636f756e742e005901205468652062616c616e63652064656c656761746564206973206c6f636b656420666f72206173206c6f6e6720617320697427732064656c6567617465642c20616e64207468657265616674657220666f7220746865cc2074696d6520617070726f70726961746520666f722074686520636f6e76696374696f6e2773206c6f636b20706572696f642e00610120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e696e67206163636f756e74206d757374206569746865723a782020202d2062652064656c65676174696e6720616c72656164793b206f725d012020202d2068617665206e6f20766f74696e67206163746976697479202869662074686572652069732c207468656e2069742077696c6c206e65656420746f2062652072656d6f7665642f636f6e736f6c6964617465649820202020207468726f7567682060726561705f766f746560206f722060756e766f746560292e004901202d2060746f603a20546865206163636f756e742077686f736520766f74696e6720746865206074617267657460206163636f756e74277320766f74696e6720706f7765722077696c6c20666f6c6c6f772e5901202d2060636f6e76696374696f6e603a2054686520636f6e76696374696f6e20746861742077696c6c20626520617474616368656420746f207468652064656c65676174656420766f7465732e205768656e2074686545012020206163636f756e7420697320756e64656c6567617465642c207468652066756e64732077696c6c206265206c6f636b656420666f722074686520636f72726573706f6e64696e6720706572696f642e5501202d206062616c616e6365603a2054686520616d6f756e74206f6620746865206163636f756e7427732062616c616e636520746f206265207573656420696e2064656c65676174696e672e2054686973206d757374c82020206e6f74206265206d6f7265207468616e20746865206163636f756e7427732063757272656e742062616c616e63652e004c20456d697473206044656c656761746564602e002c2023203c7765696768743e5901202d20436f6d706c65786974793a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173cc202020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732eac202d2044622072656164733a20322a60566f74696e674f66602c206062616c616e636573206c6f636b7360b0202d204462207772697465733a20322a60566f74696e674f66602c206062616c616e636573206c6f636b7360a4202d2044622072656164732070657220766f7465733a20605265666572656e64756d496e666f4f6660a8202d204462207772697465732070657220766f7465733a20605265666572656e64756d496e666f4f666094202d2042617365205765696768743a2036352e3738202b20382e323239202a205220c2b573302023203c2f7765696768743e28756e64656c6567617465004cd020556e64656c65676174652074686520766f74696e6720706f776572206f66207468652073656e64696e67206163636f756e742e00610120546f6b656e73206d617920626520756e6c6f636b656420666f6c6c6f77696e67206f6e636520616e20616d6f756e74206f662074696d6520636f6e73697374656e74207769746820746865206c6f636b20706572696f64e0206f662074686520636f6e76696374696f6e2077697468207768696368207468652064656c65676174696f6e20776173206973737565642e00490120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265582063757272656e746c792064656c65676174696e672e005420456d6974732060556e64656c656761746564602e002c2023203c7765696768743e5901202d20436f6d706c65786974793a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173cc202020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732e64202d2044622072656164733a20322a60566f74696e674f666068202d204462207772697465733a20322a60566f74696e674f6660a4202d2044622072656164732070657220766f7465733a20605265666572656e64756d496e666f4f6660a8202d204462207772697465732070657220766f7465733a20605265666572656e64756d496e666f4f666094202d2042617365205765696768743a2033332e3239202b20382e313034202a205220c2b573302023203c2f7765696768743e58636c6561725f7075626c69635f70726f706f73616c7300247420436c6561727320616c6c207075626c69632070726f706f73616c732e00c420546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e002c2023203c7765696768743e28202d20604f283129602e6c202d204462207772697465733a20605075626c696350726f70736064202d2042617365205765696768743a20322e35303520c2b573302023203c2f7765696768743e346e6f74655f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e3061012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e205468697320646f65736e27742072657175697265207468652070726f706f73616c20746f206265250120696e207468652064697370617463682071756575652062757420646f657320726571756972652061206465706f7369742c2072657475726e6564206f6e636520656e61637465642e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00c8202d2060656e636f6465645f70726f706f73616c603a2054686520707265696d616765206f6620612070726f706f73616c2e005c20456d6974732060507265696d6167654e6f746564602e002c2023203c7765696768743e802073656520607765696768745f666f723a3a6e6f74655f707265696d61676560302023203c2f7765696768743e646e6f74655f707265696d6167655f6f7065726174696f6e616c0440656e636f6465645f70726f706f73616c1c5665633c75383e040d012053616d6520617320606e6f74655f707265696d6167656020627574206f726967696e20697320604f7065726174696f6e616c507265696d6167654f726967696e602e586e6f74655f696d6d696e656e745f707265696d6167650440656e636f6465645f70726f706f73616c1c5665633c75383e3045012052656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e2054686973207265717569726573207468652070726f706f73616c20746f206265b420696e207468652064697370617463682071756575652e204e6f206465706f736974206973206e65656465642e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00c8202d2060656e636f6465645f70726f706f73616c603a2054686520707265696d616765206f6620612070726f706f73616c2e005c20456d6974732060507265696d6167654e6f746564602e002c2023203c7765696768743e802073656520607765696768745f666f723a3a6e6f74655f707265696d61676560302023203c2f7765696768743e886e6f74655f696d6d696e656e745f707265696d6167655f6f7065726174696f6e616c0440656e636f6465645f70726f706f73616c1c5665633c75383e0431012053616d6520617320606e6f74655f696d6d696e656e745f707265696d6167656020627574206f726967696e20697320604f7065726174696f6e616c507265696d6167654f726967696e602e34726561705f707265696d616765083470726f706f73616c5f686173681c543a3a486173686070726f706f73616c5f6c656e5f75707065725f626f756e6430436f6d706163743c7533323e50f42052656d6f766520616e20657870697265642070726f706f73616c20707265696d61676520616e6420636f6c6c65637420746865206465706f7369742e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00d0202d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f6620612070726f706f73616c2e2d01202d206070726f706f73616c5f6c656e6774685f75707065725f626f756e64603a20616e20757070657220626f756e64206f6e206c656e677468206f66207468652070726f706f73616c2e010120202045787472696e736963206973207765696768746564206163636f7264696e6720746f20746869732076616c75652077697468206e6f20726566756e642e00510120546869732077696c6c206f6e6c7920776f726b2061667465722060566f74696e67506572696f646020626c6f636b732066726f6d207468652074696d6520746861742074686520707265696d616765207761735d01206e6f7465642c2069662069742773207468652073616d65206163636f756e7420646f696e672069742e2049662069742773206120646966666572656e74206163636f756e742c207468656e206974276c6c206f6e6c79b020776f726b20616e206164646974696f6e616c2060456e6163746d656e74506572696f6460206c617465722e006020456d6974732060507265696d616765526561706564602e002c2023203c7765696768743ed0202d20436f6d706c65786974793a20604f284429602077686572652044206973206c656e677468206f662070726f706f73616c2e60202d2044622072656164733a2060507265696d616765736064202d204462207772697465733a2060507265696d616765736090202d2042617365205765696768743a2033392e3331202b202e303033202a206220c2b573302023203c2f7765696768743e18756e6c6f636b041874617267657430543a3a4163636f756e74496438a420556e6c6f636b20746f6b656e732074686174206861766520616e2065787069726564206c6f636b2e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00bc202d2060746172676574603a20546865206163636f756e7420746f2072656d6f766520746865206c6f636b206f6e2e002c2023203c7765696768743ed4202d20436f6d706c657869747920604f2852296020776974682052206e756d626572206f6620766f7465206f66207461726765742eec202d2044622072656164733a2060566f74696e674f66602c206062616c616e636573206c6f636b73602c2060746172676574206163636f756e7460f0202d204462207772697465733a2060566f74696e674f66602c206062616c616e636573206c6f636b73602c2060746172676574206163636f756e74603c202d2042617365205765696768743a9820202020202d20556e6c6f636b2052656d6f76653a2034322e3936202b202e303438202a20528c20202020202d20556e6c6f636b205365743a2033372e3633202b202e333237202a2052302023203c2f7765696768743e2c72656d6f76655f766f74650414696e6465783c5265666572656e64756d496e64657880802052656d6f7665206120766f746520666f722061207265666572656e64756d2e00102049663a8c202d20746865207265666572656e64756d207761732063616e63656c6c65642c206f7280202d20746865207265666572656e64756d206973206f6e676f696e672c206f7294202d20746865207265666572656e64756d2068617320656e6465642073756368207468617401012020202d2074686520766f7465206f6620746865206163636f756e742077617320696e206f70706f736974696f6e20746f2074686520726573756c743b206f72d82020202d20746865726520776173206e6f20636f6e76696374696f6e20746f20746865206163636f756e74277320766f74653b206f72882020202d20746865206163636f756e74206d61646520612073706c697420766f74656101202e2e2e7468656e2074686520766f74652069732072656d6f76656420636c65616e6c7920616e64206120666f6c6c6f77696e672063616c6c20746f2060756e6c6f636b60206d617920726573756c7420696e206d6f72655c2066756e6473206265696e6720617661696c61626c652e00ac2049662c20686f77657665722c20746865207265666572656e64756d2068617320656e64656420616e643af0202d2069742066696e697368656420636f72726573706f6e64696e6720746f2074686520766f7465206f6620746865206163636f756e742c20616e64e0202d20746865206163636f756e74206d6164652061207374616e6461726420766f7465207769746820636f6e76696374696f6e2c20616e64c0202d20746865206c6f636b20706572696f64206f662074686520636f6e76696374696f6e206973206e6f74206f7665725d01202e2e2e7468656e20746865206c6f636b2077696c6c206265206167677265676174656420696e746f20746865206f766572616c6c206163636f756e742773206c6f636b2c207768696368206d617920696e766f6c76655d01202a6f7665726c6f636b696e672a20287768657265207468652074776f206c6f636b732061726520636f6d62696e656420696e746f20612073696e676c65206c6f636b207468617420697320746865206d6178696d756de8206f6620626f74682074686520616d6f756e74206c6f636b656420616e64207468652074696d65206973206974206c6f636b656420666f72292e004d0120546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e6572206d7573742068617665206120766f74658c207265676973746572656420666f72207265666572656e64756d2060696e646578602e00f8202d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e002c2023203c7765696768743e4101202d20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2edc2020205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652eac202d2044622072656164733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f6660b0202d204462207772697465733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f666080202d2042617365205765696768743a2032312e3033202b202e333539202a2052302023203c2f7765696768743e4472656d6f76655f6f746865725f766f7465081874617267657430543a3a4163636f756e74496414696e6465783c5265666572656e64756d496e64657850802052656d6f7665206120766f746520666f722061207265666572656e64756d2e0051012049662074686520607461726765746020697320657175616c20746f20746865207369676e65722c207468656e20746869732066756e6374696f6e2069732065786163746c79206571756976616c656e7420746f3101206072656d6f76655f766f7465602e204966206e6f7420657175616c20746f20746865207369676e65722c207468656e2074686520766f7465206d757374206861766520657870697265642c590120656974686572206265636175736520746865207265666572656e64756d207761732063616e63656c6c65642c20626563617573652074686520766f746572206c6f737420746865207265666572656e64756d206f729c20626563617573652074686520636f6e76696374696f6e20706572696f64206973206f7665722e00cc20546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e005101202d2060746172676574603a20546865206163636f756e74206f662074686520766f746520746f2062652072656d6f7665643b2074686973206163636f756e74206d757374206861766520766f74656420666f72582020207265666572656e64756d2060696e646578602ef8202d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e002c2023203c7765696768743e4101202d20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2edc2020205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652eac202d2044622072656164733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f6660b0202d204462207772697465733a20605265666572656e64756d496e666f4f66602c2060566f74696e674f666080202d2042617365205765696768743a2031392e3135202b202e333732202a2052302023203c2f7765696768743e38656e6163745f70726f706f73616c083470726f706f73616c5f686173681c543a3a4861736814696e6465783c5265666572656e64756d496e64657804510120456e61637420612070726f706f73616c2066726f6d2061207265666572656e64756d2e20466f72206e6f77207765206a757374206d616b65207468652077656967687420626520746865206d6178696d756d2e01442050726f706f736564082450726f70496e6465781c42616c616e636504c02041206d6f74696f6e20686173206265656e2070726f706f7365642062792061207075626c6963206163636f756e742e185461626c65640c2450726f70496e6465781c42616c616e6365385665633c4163636f756e7449643e04dc2041207075626c69632070726f706f73616c20686173206265656e207461626c656420666f72207265666572656e64756d20766f74652e3845787465726e616c5461626c656400049820416e2065787465726e616c2070726f706f73616c20686173206265656e207461626c65642e1c53746172746564083c5265666572656e64756d496e64657834566f74655468726573686f6c6404602041207265666572656e64756d2068617320626567756e2e18506173736564043c5265666572656e64756d496e64657804b020412070726f706f73616c20686173206265656e20617070726f766564206279207265666572656e64756d2e244e6f74506173736564043c5265666572656e64756d496e64657804b020412070726f706f73616c20686173206265656e2072656a6563746564206279207265666572656e64756d2e2443616e63656c6c6564043c5265666572656e64756d496e64657804842041207265666572656e64756d20686173206265656e2063616e63656c6c65642e204578656375746564083c5265666572656e64756d496e64657810626f6f6c047420412070726f706f73616c20686173206265656e20656e61637465642e2444656c65676174656408244163636f756e744964244163636f756e74496404e020416e206163636f756e74206861732064656c65676174656420746865697220766f746520746f20616e6f74686572206163636f756e742e2c556e64656c65676174656404244163636f756e74496404e820416e206163636f756e74206861732063616e63656c6c656420612070726576696f75732064656c65676174696f6e206f7065726174696f6e2e185665746f65640c244163636f756e74496410486173682c426c6f636b4e756d626572049820416e2065787465726e616c2070726f706f73616c20686173206265656e207665746f65642e34507265696d6167654e6f7465640c1048617368244163636f756e7449641c42616c616e636504e020412070726f706f73616c277320707265696d61676520776173206e6f7465642c20616e6420746865206465706f7369742074616b656e2e30507265696d616765557365640c1048617368244163636f756e7449641c42616c616e636504150120412070726f706f73616c20707265696d616765207761732072656d6f76656420616e6420757365642028746865206465706f736974207761732072657475726e6564292e3c507265696d616765496e76616c69640810486173683c5265666572656e64756d496e646578040d0120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d6167652077617320696e76616c69642e3c507265696d6167654d697373696e670810486173683c5265666572656e64756d496e646578040d0120412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d61676520776173206d697373696e672e38507265696d616765526561706564101048617368244163636f756e7449641c42616c616e6365244163636f756e744964045d012041207265676973746572656420707265696d616765207761732072656d6f76656420616e6420746865206465706f73697420636f6c6c6563746564206279207468652072656170657220286c617374206974656d292e20556e6c6f636b656404244163636f756e74496404ac20416e206163636f756e7420686173206265656e20756e6c6f636b6564207375636365737366756c6c792e203c456e6163746d656e74506572696f6438543a3a426c6f636b4e756d62657210002f0d0014710120546865206d696e696d756d20706572696f64206f66206c6f636b696e6720616e642074686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e0031012049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e737572652074686174690120766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e2074686520636173652077686572659c207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e304c61756e6368506572696f6438543a3a426c6f636b4e756d62657210004e0c0004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e30566f74696e67506572696f6438543a3a426c6f636b4e756d62657210004e0c0004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e384d696e696d756d4465706f7369743042616c616e63654f663c543e400000c16ff2862300000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e5446617374547261636b566f74696e67506572696f6438543a3a426c6f636b4e756d626572108051010004ec204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f7220616e20656d657267656e6379207265666572656e64756d2e34436f6f6c6f6666506572696f6438543a3a426c6f636b4e756d62657210004e0c0004610120506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e4c507265696d616765427974654465706f7369743042616c616e63654f663c543e400010a5d4e800000000000000000000000429012054686520616d6f756e74206f662062616c616e63652074686174206d757374206265206465706f7369746564207065722062797465206f6620707265696d6167652073746f7265642e204d6178566f7465730c753332106400000004b020546865206d6178696d756d206e756d626572206f6620766f74657320666f7220616e206163636f756e742e842056616c75654c6f7704382056616c756520746f6f206c6f773c50726f706f73616c4d697373696e6704602050726f706f73616c20646f6573206e6f7420657869737420426164496e646578043820556e6b6e6f776e20696e6465783c416c726561647943616e63656c656404982043616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365444475706c696361746550726f706f73616c04582050726f706f73616c20616c7265616479206d6164654c50726f706f73616c426c61636b6c6973746564046c2050726f706f73616c207374696c6c20626c61636b6c6973746564444e6f7453696d706c654d616a6f7269747904ac204e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f726974792c496e76616c696448617368043420496e76616c69642068617368284e6f50726f706f73616c0454204e6f2065787465726e616c2070726f706f73616c34416c72656164795665746f6564049c204964656e74697479206d6179206e6f74207665746f20612070726f706f73616c207477696365304e6f7444656c6567617465640438204e6f742064656c656761746564444475706c6963617465507265696d616765045c20507265696d61676520616c7265616479206e6f7465642c4e6f74496d6d696e656e740434204e6f7420696d6d696e656e7420546f6f4561726c79042820546f6f206561726c7920496d6d696e656e74042420496d6d696e656e743c507265696d6167654d697373696e67044c20507265696d616765206e6f7420666f756e64445265666572656e64756d496e76616c6964048820566f746520676976656e20666f7220696e76616c6964207265666572656e64756d3c507265696d616765496e76616c6964044420496e76616c696420707265696d6167652c4e6f6e6557616974696e670454204e6f2070726f706f73616c732077616974696e67244e6f744c6f636b656404a42054686520746172676574206163636f756e7420646f6573206e6f7420686176652061206c6f636b2e284e6f744578706972656404f020546865206c6f636b206f6e20746865206163636f756e7420746f20626520756e6c6f636b656420686173206e6f742079657420657870697265642e204e6f74566f74657204c82054686520676976656e206163636f756e7420646964206e6f7420766f7465206f6e20746865207265666572656e64756d2e304e6f5065726d697373696f6e04cc20546865206163746f7220686173206e6f207065726d697373696f6e20746f20636f6e647563742074686520616374696f6e2e44416c726561647944656c65676174696e67048c20546865206163636f756e7420697320616c72656164792064656c65676174696e672e204f766572666c6f7704a420416e20756e657870656374656420696e7465676572206f766572666c6f77206f636375727265642e24556e646572666c6f7704a820416e20756e657870656374656420696e746567657220756e646572666c6f77206f636375727265642e44496e73756666696369656e7446756e647304010120546f6f206869676820612062616c616e6365207761732070726f7669646564207468617420746865206163636f756e742063616e6e6f74206166666f72642e344e6f7444656c65676174696e6704a420546865206163636f756e74206973206e6f742063757272656e746c792064656c65676174696e672e28566f746573457869737408590120546865206163636f756e742063757272656e746c792068617320766f74657320617474616368656420746f20697420616e6420746865206f7065726174696f6e2063616e6e6f74207375636365656420756e74696cec207468657365206172652072656d6f7665642c20656974686572207468726f7567682060756e766f746560206f722060726561705f766f7465602e44496e7374616e744e6f74416c6c6f77656404dc2054686520696e7374616e74207265666572656e64756d206f726967696e2069732063757272656e746c7920646973616c6c6f7765642e204e6f6e73656e736504982044656c65676174696f6e20746f206f6e6573656c66206d616b6573206e6f2073656e73652e3c57726f6e675570706572426f756e64045420496e76616c696420757070657220626f756e642e3c4d6178566f746573526561636865640484204d6178696d756d206e756d626572206f6620766f74657320726561636865642e1c436f756e63696c014c496e7374616e636531436f6c6c656374697665182450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001061c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001061c543a3a486173688c566f7465733c543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265723e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000030543a3a4163636f756e7449640400085d0120546865206d656d6265722077686f2070726f7669646573207468652064656661756c7420766f746520666f7220616e79206f74686572206d656d62657273207468617420646f206e6f7420766f7465206265666f7265e4207468652074696d656f75742e204966204e6f6e652c207468656e206e6f206d656d6265722068617320746861742070726976696c6567652e01182c7365745f6d656d626572730c2c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e147072696d65504f7074696f6e3c543a3a4163636f756e7449643e246f6c645f636f756e742c4d656d626572436f756e746084205365742074686520636f6c6c6563746976652773206d656d626572736869702e004901202d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee4202d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e3901202d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652eac202020202020202020202020202020205573656420666f722077656967687420657374696d6174696f6e2e005820526571756972657320726f6f74206f726967696e2e005901204e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d41585f4d454d4245525360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c206275742501202020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002c2023203c7765696768743e282023232057656967687454202d20604f284d50202b204e29602077686572653ae42020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e42020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299c2020202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e6465642918202d2044423a75012020202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e6720746865206d656d62657273f02020202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c7349012020202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c61012020202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e65302023203c2f7765696768743e1c65786563757465082070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e28f420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002c2023203c7765696768743e28202323205765696768748501202d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e67206070726f706f73616c60d8202d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c6028202d2031206576656e74302023203c2f7765696768743e1c70726f706f73650c247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e6cfc204164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e0088205265717569726573207468652073656e64657220746f206265206d656d6265722e00450120607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c2032602958206f722070757420757020666f7220766f74696e672e002c2023203c7765696768743e2820232320576569676874b0202d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c82020202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af820202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029010120202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d2032602918202d2044423ab82020202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f42020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029ac2020202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0d0120202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029bc20202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029dc202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e8202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029d0202020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029c0202020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d296029302020202d2031206576656e74302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c30f42041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e0090205265717569726573207468652073656e64657220746f2062652061206d656d6265722e002c2023203c7765696768743e28202323205765696768740d01202d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e6465642918202d2044423ab02020202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029bc2020202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d29602928202d2031206576656e74302023203c2f7765696768743e14636c6f7365103470726f706f73616c5f686173681c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e5470726f706f73616c5f7765696768745f626f756e643c436f6d706163743c5765696768743e306c656e6774685f626f756e6430436f6d706163743c7533323e6c510120436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e005901204d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e004d012049662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973c02068617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e004d012049662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e73290120756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e008d01202b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642070726f706f73616c2e6501202b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b6564207669618101202020202020202020202020202020202020206073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002c2023203c7765696768743e282023232057656967687478202d20604f2842202b204d202b205031202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429cc2020202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea82020202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e6465642918202d2044423a110120202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f2831296029810120202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f64656320604f285032296029e020202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c602028605031602944202d20757020746f2033206576656e7473302023203c2f7765696768743e4c646973617070726f76655f70726f706f73616c043470726f706f73616c5f686173681c543a3a4861736838790120446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e742073746174652e008c204d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e003020506172616d65746572733a2101202a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002c2023203c7765696768743ee020436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c73542042617365205765696768743a202e3439202a20502c204442205765696768743a4c202a2052656164733a2050726f706f73616c73a0202a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f66302023203c2f7765696768743e011c2050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e74084d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292e14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e204578656375746564081048617368384469737061746368526573756c740425012041206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e384d656d6265724578656375746564081048617368384469737061746368526573756c74044d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e18436c6f7365640c10486173682c4d656d626572436f756e742c4d656d626572436f756e7404590120412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e0028244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c790405012054686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c730401012054686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c57656967687404d42054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e67746804d42054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e48546563686e6963616c436f6d6d6974746565014c496e7374616e636532436f6c6c656374697665182450726f706f73616c730100305665633c543a3a486173683e040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f660001061c543a3a48617368643c542061732054726169743c493e3e3a3a50726f706f73616c00040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e670001061c543a3a486173688c566f7465733c543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265723e00040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401000c753332100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100445665633c543a3a4163636f756e7449643e0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000030543a3a4163636f756e7449640400085d0120546865206d656d6265722077686f2070726f7669646573207468652064656661756c7420766f746520666f7220616e79206f74686572206d656d62657273207468617420646f206e6f7420766f7465206265666f7265e4207468652074696d656f75742e204966204e6f6e652c207468656e206e6f206d656d6265722068617320746861742070726976696c6567652e01182c7365745f6d656d626572730c2c6e65775f6d656d62657273445665633c543a3a4163636f756e7449643e147072696d65504f7074696f6e3c543a3a4163636f756e7449643e246f6c645f636f756e742c4d656d626572436f756e746084205365742074686520636f6c6c6563746976652773206d656d626572736869702e004901202d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee4202d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e3901202d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652eac202020202020202020202020202020205573656420666f722077656967687420657374696d6174696f6e2e005820526571756972657320726f6f74206f726967696e2e005901204e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d41585f4d454d4245525360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c206275742501202020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002c2023203c7765696768743e282023232057656967687454202d20604f284d50202b204e29602077686572653ae42020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e42020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299c2020202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e6465642918202d2044423a75012020202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e6720746865206d656d62657273f02020202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c7349012020202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c61012020202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e65302023203c2f7765696768743e1c65786563757465082070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e28f420446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00ac204f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002c2023203c7765696768743e28202323205765696768748501202d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e67206070726f706f73616c60d8202d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c6028202d2031206576656e74302023203c2f7765696768743e1c70726f706f73650c247468726573686f6c6450436f6d706163743c4d656d626572436f756e743e2070726f706f73616c78426f783c3c542061732054726169743c493e3e3a3a50726f706f73616c3e306c656e6774685f626f756e6430436f6d706163743c7533323e6cfc204164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e0088205265717569726573207468652073656e64657220746f206265206d656d6265722e00450120607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c2032602958206f722070757420757020666f7220766f74696e672e002c2023203c7765696768743e2820232320576569676874b0202d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c82020202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af820202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029010120202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d2032602918202d2044423ab82020202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f42020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029ac2020202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0d0120202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029bc20202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029dc202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e8202020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029d0202020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029c0202020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d296029302020202d2031206576656e74302023203c2f7765696768743e10766f74650c2070726f706f73616c1c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e1c617070726f766510626f6f6c30f42041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e0090205265717569726573207468652073656e64657220746f2062652061206d656d6265722e002c2023203c7765696768743e28202323205765696768740d01202d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e6465642918202d2044423ab02020202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029bc2020202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d29602928202d2031206576656e74302023203c2f7765696768743e14636c6f7365103470726f706f73616c5f686173681c543a3a4861736814696e64657858436f6d706163743c50726f706f73616c496e6465783e5470726f706f73616c5f7765696768745f626f756e643c436f6d706163743c5765696768743e306c656e6774685f626f756e6430436f6d706163743c7533323e6c510120436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e005901204d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e004d012049662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973c02068617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e004d012049662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e73290120756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e008d01202b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642070726f706f73616c2e6501202b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b6564207669618101202020202020202020202020202020202020206073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002c2023203c7765696768743e282023232057656967687478202d20604f2842202b204d202b205031202b20503229602077686572653ae42020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429e02020202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429cc2020202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea82020202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e6465642918202d2044423a110120202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f2831296029810120202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f64656320604f285032296029e020202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c602028605031602944202d20757020746f2033206576656e7473302023203c2f7765696768743e4c646973617070726f76655f70726f706f73616c043470726f706f73616c5f686173681c543a3a4861736838790120446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e742073746174652e008c204d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e003020506172616d65746572733a2101202a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002c2023203c7765696768743ee020436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c73542042617365205765696768743a202e3439202a20502c204442205765696768743a4c202a2052656164733a2050726f706f73616c73a0202a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f66302023203c2f7765696768743e011c2050726f706f73656410244163636f756e7449643450726f706f73616c496e64657810486173682c4d656d626572436f756e74084d012041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e4020604d656d626572436f756e7460292e14566f74656414244163636f756e744964104861736810626f6f6c2c4d656d626572436f756e742c4d656d626572436f756e740809012041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e67190120612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404104861736804c42041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404104861736804d42041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e204578656375746564081048617368384469737061746368526573756c740425012041206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e384d656d6265724578656375746564081048617368384469737061746368526573756c74044d0120412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e18436c6f7365640c10486173682c4d656d626572436f756e742c4d656d626572436f756e7404590120412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e0028244e6f744d656d6265720460204163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0480204475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e6704502050726f706f73616c206d7573742065786973742857726f6e67496e6465780444204d69736d61746368656420696e646578344475706c6963617465566f7465045c204475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a65640484204d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c790405012054686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c730401012054686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c57656967687404d42054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e67746804d42054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e24456c656374696f6e73014050687261676d656e456c656374696f6e141c4d656d626572730100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e040004f0205468652063757272656e7420656c6563746564206d656d626572736869702e20536f72746564206261736564206f6e206163636f756e742069642e2452756e6e65727355700100845665633c28543a3a4163636f756e7449642c2042616c616e63654f663c543e293e0400044901205468652063757272656e742072756e6e6572735f75702e20536f72746564206261736564206f6e206c6f7720746f2068696768206d657269742028776f72736520746f20626573742072756e6e6572292e38456c656374696f6e526f756e647301000c75333210000000000441012054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e65642c206578636c7564696e6720746865207570636f6d696e67206f6e652e18566f74696e6701010530543a3a4163636f756e744964842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29004400000000000000000000000000000000000cb820566f74657320616e64206c6f636b6564207374616b65206f66206120706172746963756c617220766f7465722e00c02054574f582d4e4f54453a205341464520617320604163636f756e7449646020697320612063727970746f20686173682843616e646964617465730100445665633c543a3a4163636f756e7449643e0400085901205468652070726573656e742063616e646964617465206c6973742e20536f72746564206261736564206f6e206163636f756e742d69642e20412063757272656e74206d656d626572206f722072756e6e65722d757041012063616e206e6576657220656e746572207468697320766563746f7220616e6420697320616c7761797320696d706c696369746c7920617373756d656420746f20626520612063616e6469646174652e011810766f74650814766f746573445665633c543a3a4163636f756e7449643e1476616c756554436f6d706163743c42616c616e63654f663c543e3e645d0120566f746520666f72206120736574206f662063616e6469646174657320666f7220746865207570636f6d696e6720726f756e64206f6620656c656374696f6e2e20546869732063616e2062652063616c6c656420746fe4207365742074686520696e697469616c20766f7465732c206f722075706461746520616c7265616479206578697374696e6720766f7465732e0055012055706f6e20696e697469616c20766f74696e672c206076616c75656020756e697473206f66206077686f6027732062616c616e6365206973206c6f636b656420616e64206120626f6e6420616d6f756e74206973282072657365727665642e0050205468652060766f746573602073686f756c643a482020202d206e6f7420626520656d7074792e59012020202d206265206c657373207468616e20746865206e756d626572206f6620706f737369626c652063616e646964617465732e204e6f7465207468617420616c6c2063757272656e74206d656d6265727320616e641501202020202072756e6e6572732d75702061726520616c736f206175746f6d61746963616c6c792063616e6469646174657320666f7220746865206e65787420726f756e642e005d012049742069732074686520726573706f6e736962696c697479206f66207468652063616c6c657220746f206e6f7420706c61636520616c6c206f662074686569722062616c616e636520696e746f20746865206c6f636ba020616e64206b65657020736f6d6520666f722066757274686572207472616e73616374696f6e732e002c2023203c7765696768743e5c2042617365207765696768743a2034372e393320c2b573342053746174652072656164733ad820092d2043616e646964617465732e6c656e2829202b204d656d626572732e6c656e2829202b2052756e6e65727355702e6c656e28295420092d20566f74696e67202869735f766f74657229d420092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665202b20746f74616c5f62616c616e6365295d38205374617465207772697465733a2820092d20566f74696e672020092d204c6f636b1d0120092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665202d2d206f6e6c79207768656e206372656174696e672061206e657720766f746572295d302023203c2f7765696768743e3072656d6f76655f766f746572003421012052656d6f766520606f726967696e60206173206120766f7465722e20546869732072656d6f76657320746865206c6f636b20616e642072657475726e732074686520626f6e642e002c2023203c7765696768743e582042617365207765696768743a2033362e3820c2b573a820416c6c207374617465206163636573732069732066726f6d20646f5f72656d6f76655f766f7465722e342053746174652072656164733a2820092d20566f74696e675820092d205b4163636f756e74446174612877686f295d38205374617465207772697465733a2820092d20566f74696e672420092d204c6f636b735820092d205b4163636f756e74446174612877686f295d302023203c2f7765696768743e507265706f72745f646566756e63745f766f746572041c646566756e6374c4446566756e6374566f7465723c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e6c5d01205265706f727420607461726765746020666f72206265696e6720616e20646566756e637420766f7465722e20496e2063617365206f6620612076616c6964207265706f72742c20746865207265706f727465722069735d012072657761726465642062792074686520626f6e6420616d6f756e74206f662060746172676574602e204f74686572776973652c20746865207265706f7274657220697473656c662069732072656d6f76656420616e645c20746865697220626f6e6420697320736c61736865642e0088204120646566756e637420766f74657220697320646566696e656420746f2062653a4d012020202d206120766f7465722077686f73652063757272656e74207375626d697474656420766f7465732061726520616c6c20696e76616c69642e20692e652e20616c6c206f66207468656d20617265206e6ff020202020206c6f6e67657220612063616e646964617465206e6f7220616e20616374697665206d656d626572206f7220612072756e6e65722d75702e0000690120546865206f726967696e206d7573742070726f7669646520746865206e756d626572206f662063757272656e742063616e6469646174657320616e6420766f746573206f6620746865207265706f7274656420746172676574c020666f722074686520707572706f7365206f66206163637572617465207765696768742063616c63756c6174696f6e2e002c2023203c7765696768743eb4204e6f204261736520776569676874206261736564206f6e206d696e2073717561726520616e616c797369732ea420436f6d706c6578697479206f662063616e6469646174655f636f756e743a20312e37353520c2b5739020436f6d706c6578697479206f6620766f74655f636f756e743a2031382e353120c2b573342053746174652072656164733a542020092d20566f74696e67287265706f7274657229502020092d2043616e6469646174652e6c656e28294c2020092d20566f74696e672854617267657429d82020092d2043616e646964617465732c204d656d626572732c2052756e6e6572735570202869735f646566756e63745f766f7465722938205374617465207772697465733a7020092d204c6f636b287265706f72746572207c7c2074617267657429dc20092d205b4163636f756e7442616c616e6365287265706f72746572295d202b204163636f756e7442616c616e636528746172676574297820092d20566f74696e67287265706f72746572207c7c20746172676574295901204e6f74653a207468652064622061636365737320697320776f7273652077697468207265737065637420746f2064622c207768696368206973207768656e20746865207265706f727420697320636f72726563742e302023203c2f7765696768743e407375626d69745f63616e646964616379043c63616e6469646174655f636f756e7430436f6d706163743c7533323e5478205375626d6974206f6e6573656c6620666f722063616e6469646163792e006420412063616e6469646174652077696c6c206569746865723aec2020202d204c6f73652061742074686520656e64206f6620746865207465726d20616e6420666f7266656974207468656972206465706f7369742e2d012020202d2057696e20616e64206265636f6d652061206d656d6265722e204d656d626572732077696c6c206576656e7475616c6c7920676574207468656972207374617368206261636b2e55012020202d204265636f6d6520612072756e6e65722d75702e2052756e6e6572732d75707320617265207265736572766564206d656d6265727320696e2063617365206f6e65206765747320666f72636566756c6c7934202020202072656d6f7665642e002c2023203c7765696768743e60204261736520776569676874203d2033332e333320c2b573a420436f6d706c6578697479206f662063616e6469646174655f636f756e743a20302e33373520c2b573342053746174652072656164733a5020092d2043616e646964617465732e6c656e28293820092d2043616e646964617465732c20092d204d656d626572733420092d2052756e6e65727355706420092d205b4163636f756e7442616c616e63652877686f295d38205374617465207772697465733a6420092d205b4163636f756e7442616c616e63652877686f295d3820092d2043616e64696461746573302023203c2f7765696768743e4872656e6f756e63655f63616e646964616379042872656e6f756e63696e672852656e6f756e63696e679851012052656e6f756e6365206f6e65277320696e74656e74696f6e20746f20626520612063616e64696461746520666f7220746865206e65787420656c656374696f6e20726f756e642e203320706f74656e7469616c40206f7574636f6d65732065786973743a4101202d20606f726967696e6020697320612063616e64696461746520616e64206e6f7420656c656374656420696e20616e79207365742e20496e207468697320636173652c2074686520626f6e64206973f4202020756e72657365727665642c2072657475726e656420616e64206f726967696e2069732072656d6f76656420617320612063616e6469646174652e5901202d20606f726967696e6020697320612063757272656e742072756e6e65722d75702e20496e207468697320636173652c2074686520626f6e6420697320756e72657365727665642c2072657475726e656420616e64902020206f726967696e2069732072656d6f76656420617320612072756e6e65722d75702e4d01202d20606f726967696e6020697320612063757272656e74206d656d6265722e20496e207468697320636173652c2074686520626f6e6420697320756e726573657276656420616e64206f726967696e206973590120202072656d6f7665642061732061206d656d6265722c20636f6e73657175656e746c79206e6f74206265696e6720612063616e64696461746520666f7220746865206e65787420726f756e6420616e796d6f72652e650120202053696d696c617220746f205b6072656d6f76655f766f746572605d2c206966207265706c6163656d656e742072756e6e657273206578697374732c20746865792061726520696d6d6564696174656c7920757365642e24203c7765696768743e7820496620612063616e6469646174652069732072656e6f756e63696e673a60200942617365207765696768743a2031372e323820c2b573a82009436f6d706c6578697479206f662063616e6469646174655f636f756e743a20302e32333520c2b57338200953746174652072656164733a3c2009092d2043616e64696461746573982009092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665295d3c20095374617465207772697465733a3c2009092d2043616e64696461746573982009092d205b4163636f756e7442616c616e63652877686f292028756e72657365727665295d64204966206d656d6265722069732072656e6f756e63696e673a60200942617365207765696768743a2034362e323520c2b57338200953746174652072656164733ad02009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d3c20095374617465207772697465733ad02009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d642049662072756e6e65722069732072656e6f756e63696e673a60200942617365207765696768743a2034362e323520c2b57338200953746174652072656164733aac2009092d2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d3c20095374617465207772697465733aac2009092d2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572292c8c2009092d205b4163636f756e74446174612877686f292028756e72657365727665295d000d0120576569676874206e6f74653a205468652063616c6c20696e746f206368616e67654d656d62657273206e65656420746f206265206163636f756e74656420666f722e28203c2f7765696768743e3472656d6f76655f6d656d626572080c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653c6861735f7265706c6163656d656e7410626f6f6c485d012052656d6f7665206120706172746963756c6172206d656d6265722066726f6d20746865207365742e20546869732069732065666665637469766520696d6d6564696174656c7920616e642074686520626f6e64206f668020746865206f7574676f696e67206d656d62657220697320736c61736865642e00590120496620612072756e6e65722d757020697320617661696c61626c652c207468656e2074686520626573742072756e6e65722d75702077696c6c2062652072656d6f76656420616e64207265706c61636573207468650101206f7574676f696e67206d656d6265722e204f74686572776973652c2061206e65772070687261676d656e20656c656374696f6e20697320737461727465642e004501204e6f74652074686174207468697320646f6573206e6f7420616666656374207468652064657369676e6174656420626c6f636b206e756d626572206f6620746865206e65787420656c656374696f6e2e002c2023203c7765696768743e6820496620776520686176652061207265706c6163656d656e743a6820092d2042617365207765696768743a2035302e393320c2b5734020092d2053746174652072656164733a502009092d2052756e6e65727355702e6c656e2829cc2009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d626572294420092d205374617465207772697465733acc2009092d204d656d626572732c2052756e6e6572735570202872656d6f76655f616e645f7265706c6163655f6d656d62657229650120456c73652c2073696e63652074686973206973206120726f6f742063616c6c20616e642077696c6c20676f20696e746f2070687261676d656e2c20776520617373756d652066756c6c20626c6f636b20666f72206e6f772e302023203c2f7765696768743e01141c4e65775465726d04645665633c284163636f756e7449642c2042616c616e6365293e1059012041206e6577207465726d2077697468206e6577206d656d626572732e205468697320696e64696361746573207468617420656e6f7567682063616e64696461746573206578697374656420746f2072756e20746865590120656c656374696f6e2c206e6f74207468617420656e6f756768206861766520686173206265656e20656c65637465642e2054686520696e6e65722076616c7565206d757374206265206578616d696e656420666f726101207468697320707572706f73652e204120604e65775465726d285b5d296020696e64696361746573207468617420736f6d652063616e6469646174657320676f7420746865697220626f6e6420736c617368656420616e645901206e6f6e65207765726520656c65637465642c207768696c73742060456d7074795465726d60206d65616e732074686174206e6f2063616e64696461746573206578697374656420746f20626567696e20776974682e24456d7074795465726d00083501204e6f20286f72206e6f7420656e6f756768292063616e64696461746573206578697374656420666f72207468697320726f756e642e205468697320697320646966666572656e742066726f6dc420604e65775465726d285b5d29602e2053656520746865206465736372697074696f6e206f6620604e65775465726d602e304d656d6265724b69636b656404244163636f756e7449640845012041206d656d62657220686173206265656e2072656d6f7665642e20546869732073686f756c6420616c7761797320626520666f6c6c6f7765642062792065697468657220604e65775465726d60206f74342060456d7074795465726d602e3c4d656d62657252656e6f756e63656404244163636f756e74496404a02041206d656d626572206861732072656e6f756e6365642074686569722063616e6469646163792e34566f7465725265706f727465640c244163636f756e744964244163636f756e74496410626f6f6c086101204120766f7465722028666972737420656c656d656e742920776173207265706f72746564202862797420746865207365636f6e6420656c656d656e742920776974682074686520746865207265706f7274206265696e678c207375636365737366756c206f72206e6f742028746869726420656c656d656e74292e183443616e646964616379426f6e643042616c616e63654f663c543e400080c6a47e8d030000000000000000000028566f74696e67426f6e643042616c616e63654f663c543e4000407a10f35a000000000000000000000038446573697265644d656d626572730c753332100d00000000404465736972656452756e6e65727355700c753332100700000000305465726d4475726174696f6e38543a3a426c6f636b4e756d626572108013030000204d6f64756c654964384c6f636b4964656e74696669657220706872656c656374004430556e61626c65546f566f746504c42043616e6e6f7420766f7465207768656e206e6f2063616e64696461746573206f72206d656d626572732065786973742e1c4e6f566f7465730498204d75737420766f746520666f72206174206c65617374206f6e652063616e6469646174652e30546f6f4d616e79566f74657304882043616e6e6f7420766f7465206d6f7265207468616e2063616e646964617465732e504d6178696d756d566f7465734578636565646564049c2043616e6e6f7420766f7465206d6f7265207468616e206d6178696d756d20616c6c6f7765642e284c6f7742616c616e636504c82043616e6e6f7420766f74652077697468207374616b65206c657373207468616e206d696e696d756d2062616c616e63652e3c556e61626c65546f506179426f6e64047c20566f7465722063616e206e6f742070617920766f74696e6720626f6e642e2c4d7573744265566f7465720444204d757374206265206120766f7465722e285265706f727453656c6604502043616e6e6f74207265706f72742073656c662e4c4475706c69636174656443616e6469646174650484204475706c6963617465642063616e646964617465207375626d697373696f6e2e304d656d6265725375626d6974048c204d656d6265722063616e6e6f742072652d7375626d69742063616e6469646163792e3052756e6e65725375626d6974048c2052756e6e65722063616e6e6f742072652d7375626d69742063616e6469646163792e68496e73756666696369656e7443616e64696461746546756e647304982043616e64696461746520646f6573206e6f74206861766520656e6f7567682066756e64732e244e6f744d656d6265720438204e6f742061206d656d6265722e54496e76616c696443616e646964617465436f756e7404e4205468652070726f766964656420636f756e74206f66206e756d626572206f662063616e6469646174657320697320696e636f72726563742e40496e76616c6964566f7465436f756e7404d0205468652070726f766964656420636f756e74206f66206e756d626572206f6620766f74657320697320696e636f72726563742e44496e76616c696452656e6f756e63696e67040101205468652072656e6f756e63696e67206f726967696e2070726573656e74656420612077726f6e67206052656e6f756e63696e676020706172616d657465722e48496e76616c69645265706c6163656d656e740401012050726564696374696f6e20726567617264696e67207265706c6163656d656e74206166746572206d656d6265722072656d6f76616c2069732077726f6e672e4c546563686e6963616c4d656d62657273686970014c496e7374616e6365314d656d62657273686970081c4d656d626572730100445665633c543a3a4163636f756e7449643e040004c8205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e145072696d65000030543a3a4163636f756e744964040004a4205468652063757272656e74207072696d65206d656d6265722c206966206f6e65206578697374732e011c286164645f6d656d626572040c77686f30543a3a4163636f756e7449640c7c204164642061206d656d626572206077686f6020746f20746865207365742e00a0204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a4164644f726967696e602e3472656d6f76655f6d656d626572040c77686f30543a3a4163636f756e7449640c902052656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e00ac204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656d6f76654f726967696e602e2c737761705f6d656d626572081872656d6f766530543a3a4163636f756e7449640c61646430543a3a4163636f756e74496414c02053776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e00a4204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a537761704f726967696e602e001101205072696d65206d656d62657273686970206973202a6e6f742a207061737365642066726f6d206072656d6f76656020746f2060616464602c20696620657874616e742e3472657365745f6d656d62657273041c6d656d62657273445665633c543a3a4163636f756e7449643e105901204368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e646c207061737320606d656d6265727360207072652d736f727465642e00a8204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52657365744f726967696e602e286368616e67655f6b6579040c6e657730543a3a4163636f756e74496414d82053776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e00f4204d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e002101205072696d65206d656d62657273686970206973207061737365642066726f6d20746865206f726967696e206163636f756e7420746f20606e6577602c20696620657874616e742e247365745f7072696d65040c77686f30543a3a4163636f756e7449640cc02053657420746865207072696d65206d656d6265722e204d75737420626520612063757272656e74206d656d6265722e00a8204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e2c636c6561725f7072696d65000c982052656d6f766520746865207072696d65206d656d626572206966206974206578697374732e00a8204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e01182c4d656d62657241646465640004e42054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e344d656d62657252656d6f7665640004ec2054686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e384d656d62657273537761707065640004dc2054776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e304d656d6265727352657365740004190120546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e284b65794368616e676564000488204f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e1444756d6d7904bc73705f7374643a3a6d61726b65723a3a5068616e746f6d446174613c284163636f756e7449642c204576656e74293e0470205068616e746f6d206d656d6265722c206e6576657220757365642e00003c46696e616c697479547261636b65720001042866696e616c5f68696e74041068696e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08f42048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a65646c20626c6f636b2069732074686520676976656e206e756d6265722e00082857696e646f7753697a6538543a3a426c6f636b4e756d626572106500000004190120546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e345265706f72744c6174656e637938543a3a426c6f636b4e756d62657210e8030000041d01205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e0838416c72656164795570646174656404c82046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b1c42616448696e7404902046696e616c697a6564206865696768742061626f766520626c6f636b206e756d6265721c4772616e647061013c4772616e64706146696e616c6974791814537461746501006c53746f72656453746174653c543a3a426c6f636b4e756d6265723e04000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e676500008c53746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000038543a3a426c6f636b4e756d626572040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c656400008028543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d626572290400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e7453657449640100145365744964200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e0001051453657449643053657373696f6e496e6465780004001059012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f722077686963682069747368206d656d62657273207765726520726573706f6e7369626c652e00b82054574f582d4e4f54453a2060536574496460206973206e6f7420756e646572207573657220636f6e74726f6c2e01044c7265706f72745f65717569766f636174696f6e084865717569766f636174696f6e5f70726f6f66a845717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66200d01205265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f82065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66fc20616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e6365482077696c6c206265207265706f727465642e0005012053696e63652074686520776569676874206f66207468652065787472696e73696320697320302c20696e206f7264657220746f2061766f696420446f532062792901207375626d697373696f6e206f6620696e76616c69642065717569766f636174696f6e207265706f7274732c2061206d616e6461746f7279207072652d76616c69646174696f6e206f66d4207468652065787472696e73696320697320696d706c656d656e74656420696e206120605369676e6564457874656e73696f6e602e010c384e6577417574686f7269746965730434417574686f726974794c6973740490204e657720617574686f726974792073657420686173206265656e206170706c6965642e1850617573656400049c2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640004a02043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e00182c50617573654661696c656408090120417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665a8202865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e30526573756d654661696c656408150120417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e277420706175736564a42028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e344368616e676550656e64696e6704ec20417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e1c546f6f536f6f6e04c02043616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e60496e76616c69644b65794f776e65727368697050726f6f660435012041206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f7274041901204120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e20547265617375727901205472656173757279143450726f706f73616c436f756e7401003450726f706f73616c496e646578100000000004a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c730001053450726f706f73616c496e6465789050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c730100485665633c50726f706f73616c496e6465783e040004f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e10546970730001051c543a3a48617368f04f70656e5469703c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265722c20543a3a486173683e0004000c59012054697073207468617420617265206e6f742079657420636f6d706c657465642e204b65796564206279207468652068617368206f66206028726561736f6e2c2077686f29602066726f6d207468652076616c75652e3d012054686973206861732074686520696e73656375726520656e756d657261626c6520686173682066756e6374696f6e2073696e636520746865206b657920697473656c6620697320616c7265616479802067756172616e7465656420746f20626520612073656375726520686173682e1c526561736f6e730001061c543a3a486173681c5665633c75383e0004000849012053696d706c6520707265696d616765206c6f6f6b75702066726f6d2074686520726561736f6e2773206861736820746f20746865206f726967696e616c20646174612e20416761696e2c2068617320616e610120696e73656375726520656e756d657261626c6520686173682073696e636520746865206b65792069732067756172616e7465656420746f2062652074686520726573756c74206f6620612073656375726520686173682e01203470726f706f73655f7370656e64081476616c756554436f6d706163743c42616c616e63654f663c543e3e2c62656e65666963696172798c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365242d012050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c7565350120697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e636520746865542070726f706f73616c20697320617761726465642e002c2023203c7765696768743e4c202d20436f6d706c65786974793a204f283129b4202d20446252656164733a206050726f706f73616c436f756e74602c20606f726967696e206163636f756e7460ec202d2044625772697465733a206050726f706f73616c436f756e74602c206050726f706f73616c73602c20606f726967696e206163636f756e7460302023203c2f7765696768743e3c72656a6563745f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e24fc2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e00ac204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656a6563744f726967696e602e002c2023203c7765696768743e4c202d20436f6d706c65786974793a204f283129d0202d20446252656164733a206050726f706f73616c73602c206072656a65637465642070726f706f736572206163636f756e7460d4202d2044625772697465733a206050726f706f73616c73602c206072656a65637465642070726f706f736572206163636f756e7460302023203c2f7765696768743e40617070726f76655f70726f706f73616c042c70726f706f73616c5f696458436f6d706163743c50726f706f73616c496e6465783e285d0120417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e6566696369617279ac20616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e00b0204d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a417070726f76654f726967696e602e002c2023203c7765696768743e50202d20436f6d706c65786974793a204f2831292e90202d20446252656164733a206050726f706f73616c73602c2060417070726f76616c73605c202d20446257726974653a2060417070726f76616c7360302023203c2f7765696768743e387265706f72745f617765736f6d650818726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e7449644c5d01205265706f727420736f6d657468696e672060726561736f6e60207468617420646573657276657320612074697020616e6420636c61696d20616e79206576656e7475616c207468652066696e6465722773206665652e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005501205061796d656e743a20605469705265706f72744465706f73697442617365602077696c6c2062652072657365727665642066726f6d20746865206f726967696e206163636f756e742c2061732077656c6c206173d420605469705265706f72744465706f736974506572427974656020666f722065616368206279746520696e2060726561736f6e602e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743ecc202d20436f6d706c65786974793a20604f2852296020776865726520605260206c656e677468206f662060726561736f6e602e942020202d20656e636f64696e6720616e642068617368696e67206f662027726561736f6e27c4202d20446252656164733a2060526561736f6e73602c206054697073602c206077686f206163636f756e742064617461609c202d2044625772697465733a206054697073602c206077686f206163636f756e74206461746160302023203c2f7765696768743e2c726574726163745f7469700410686173681c543a3a486173684c550120526574726163742061207072696f72207469702d7265706f72742066726f6d20607265706f72745f617765736f6d65602c20616e642063616e63656c207468652070726f63657373206f662074697070696e672e00e0204966207375636365737366756c2c20746865206f726967696e616c206465706f7369742077696c6c20626520756e72657365727665642e00510120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642074686520746970206964656e746966696564206279206068617368604501206d7573742068617665206265656e207265706f7274656420627920746865207369676e696e67206163636f756e74207468726f75676820607265706f72745f617765736f6d65602028616e64206e6f7450207468726f75676820607469705f6e657760292e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e009020456d697473206054697052657472616374656460206966207375636365737366756c2e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960dc2020202d20446570656e6473206f6e20746865206c656e677468206f662060543a3a48617368602077686963682069732066697865642e90202d20446252656164733a206054697073602c20606f726967696e206163636f756e7460c0202d2044625772697465733a2060526561736f6e73602c206054697073602c20606f726967696e206163636f756e7460302023203c2f7765696768743e1c7469705f6e65770c18726561736f6e1c5665633c75383e0c77686f30543a3a4163636f756e744964247469705f76616c75653042616c616e63654f663c543e58f4204769766520612074697020666f7220736f6d657468696e67206e65773b206e6f2066696e6465722773206665652077696c6c2062652074616b656e2e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006101202d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c2062655c20202061205554462d382d656e636f6465642055524c2eec202d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e007820456d69747320604e657754697060206966207375636365737366756c2e002c2023203c7765696768743e5501202d20436f6d706c65786974793a20604f2852202b2054296020776865726520605260206c656e677468206f662060726561736f6e602c2060546020697320746865206e756d626572206f6620746970706572732ec02020202d20604f285429603a206465636f64696e6720605469707065726020766563206f66206c656e6774682060546009012020202020605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e0d0120202020205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602ee42020202d20604f285229603a2068617368696e6720616e6420656e636f64696e67206f6620726561736f6e206f66206c656e6774682060526080202d20446252656164733a206054697070657273602c2060526561736f6e736078202d2044625772697465733a2060526561736f6e73602c20605469707360302023203c2f7765696768743e0c7469700810686173681c543a3a48617368247469705f76616c75653042616c616e63654f663c543e64b4204465636c6172652061207469702076616c756520666f7220616e20616c72656164792d6f70656e207469702e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206265206174206d656d626572206f662074686520605469707065727360207365742e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f66207468652068617368206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279382020206163636f756e742049442e5101202d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d820202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e00650120456d6974732060546970436c6f73696e676020696620746865207468726573686f6c64206f66207469707065727320686173206265656e207265616368656420616e642074686520636f756e74646f776e20706572696f64342068617320737461727465642e002c2023203c7765696768743ee4202d20436f6d706c65786974793a20604f285429602077686572652060546020697320746865206e756d626572206f6620746970706572732e15012020206465636f64696e6720605469707065726020766563206f66206c656e677468206054602c20696e736572742074697020616e6420636865636b20636c6f73696e672c0101202020605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e05012020205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602e00610120202041637475616c6c792077656967687420636f756c64206265206c6f77657220617320697420646570656e6473206f6e20686f77206d616e7920746970732061726520696e20604f70656e5469706020627574206974d4202020697320776569676874656420617320696620616c6d6f73742066756c6c20692e65206f66206c656e6774682060542d31602e74202d20446252656164733a206054697070657273602c206054697073604c202d2044625772697465733a20605469707360302023203c2f7765696768743e24636c6f73655f7469700410686173681c543a3a48617368446020436c6f736520616e64207061796f75742061207469702e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0019012054686520746970206964656e74696669656420627920606861736860206d75737420686176652066696e69736865642069747320636f756e74646f776e20706572696f642e006501202d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d656461012020206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e002c2023203c7765696768743ee4202d20436f6d706c65786974793a20604f285429602077686572652060546020697320746865206e756d626572206f6620746970706572732e9c2020206465636f64696e6720605469707065726020766563206f66206c656e677468206054602e0101202020605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e05012020205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602eac202d20446252656164733a206054697073602c206054697070657273602c20607469702066696e64657260dc202d2044625772697465733a2060526561736f6e73602c206054697073602c206054697070657273602c20607469702066696e64657260302023203c2f7765696768743e012c2050726f706f736564043450726f706f73616c496e6465780438204e65772070726f706f73616c2e205370656e64696e67041c42616c616e636504e8205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e1c417761726465640c3450726f706f73616c496e6465781c42616c616e6365244163636f756e744964048020536f6d652066756e64732068617665206265656e20616c6c6f63617465642e2052656a6563746564083450726f706f73616c496e6465781c42616c616e636504b420412070726f706f73616c207761732072656a65637465643b2066756e6473207765726520736c61736865642e144275726e74041c42616c616e6365048c20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20526f6c6c6f766572041c42616c616e6365043101205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e1c4465706f736974041c42616c616e6365048020536f6d652066756e64732068617665206265656e206465706f73697465642e184e657754697004104861736804982041206e6577207469702073756767657374696f6e20686173206265656e206f70656e65642e28546970436c6f73696e6704104861736804dc2041207469702073756767657374696f6e206861732072656163686564207468726573686f6c6420616e6420697320636c6f73696e672e24546970436c6f7365640c1048617368244163636f756e7449641c42616c616e636504882041207469702073756767657374696f6e20686173206265656e20636c6f7365642e3054697052657472616374656404104861736804942041207469702073756767657374696f6e20686173206265656e207265747261637465642e243050726f706f73616c426f6e641c5065726d696c6c1050c30000085501204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e110120416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e4c50726f706f73616c426f6e644d696e696d756d3042616c616e63654f663c543e4000407a10f35a00000000000000000000044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f6438543a3a426c6f636b4e756d6265721080700000048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e1c5065726d696c6c1020a107000411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e30546970436f756e74646f776e38543a3a426c6f636b4e756d62657210807000000445012054686520706572696f6420666f722077686963682061207469702072656d61696e73206f70656e20616674657220697320686173206163686965766564207468726573686f6c6420746970706572732e3454697046696e646572734665651c50657263656e7404140431012054686520616d6f756e74206f66207468652066696e616c2074697020776869636820676f657320746f20746865206f726967696e616c207265706f72746572206f6620746865207469702e505469705265706f72744465706f736974426173653042616c616e63654f663c543e4000407a10f35a0000000000000000000004d42054686520616d6f756e742068656c64206f6e206465706f73697420666f7220706c6163696e67206120746970207265706f72742e5c5469705265706f72744465706f736974506572427974653042616c616e63654f663c543e400010a5d4e800000000000000000000000409012054686520616d6f756e742068656c64206f6e206465706f7369742070657220627974652077697468696e2074686520746970207265706f727420726561736f6e2e204d6f64756c654964204d6f64756c6549642070792f7472737279041901205468652074726561737572792773206d6f64756c652069642c207573656420666f72206465726976696e672069747320736f7665726569676e206163636f756e742049442e2070496e73756666696369656e7450726f706f7365727342616c616e6365047c2050726f706f73657227732062616c616e636520697320746f6f206c6f772e50496e76616c696450726f706f73616c496e646578046c204e6f2070726f706f73616c206174207468617420696e6465782e30526561736f6e546f6f42696704882054686520726561736f6e20676976656e206973206a75737420746f6f206269672e30416c72656164794b6e6f776e048c20546865207469702077617320616c726561647920666f756e642f737461727465642e28556e6b6e6f776e54697004642054686520746970206861736820697320756e6b6e6f776e2e244e6f7446696e64657204210120546865206163636f756e7420617474656d7074696e6720746f20726574726163742074686520746970206973206e6f74207468652066696e646572206f6620746865207469702e245374696c6c4f70656e042d0120546865207469702063616e6e6f7420626520636c61696d65642f636c6f736564206265636175736520746865726520617265206e6f7420656e6f7567682074697070657273207965742e245072656d617475726504350120546865207469702063616e6e6f7420626520636c61696d65642f636c6f73656420626563617573652069742773207374696c6c20696e2074686520636f756e74646f776e20706572696f642e24436f6e7472616374730124436f6e747261637473143c43757272656e745363686564756c650100205363686564756c6525020000000020a107000000000020a107000000000020a107000000000020a107000000000020a107000000000020a107000000000020a1070000000000e0f7050400000000e024370500000000e0f705040000000020a107000000000020a107000000000080f0fa020000000000e1f5050000000004000000000001001000000000400000002000000004942043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e305072697374696e65436f64650001062c436f6465486173683c543e1c5665633c75383e0004000465012041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2c436f646553746f726167650001062c436f6465486173683c543e587761736d3a3a5072656661625761736d4d6f64756c650004000465012041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f7220657865637574696f6e2e384163636f756e74436f756e74657201000c753634200000000000000000045420546865207375627472696520636f756e7465722e38436f6e7472616374496e666f4f6600010530543a3a4163636f756e7449643c436f6e7472616374496e666f3c543e0004000ca82054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e01143c7570646174655f7363686564756c6504207363686564756c65205363686564756c650cb4205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e000d0120546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e207075745f636f64650410636f64651c5665633c75383e085d012053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e27732073746f7261676520616e642072657475726e73206974732060636f646568617368602ed420596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e1063616c6c1010646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e246761735f6c696d697430436f6d706163743c4761733e10646174611c5665633c75383e1c0901204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e002901202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c206265b020657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e1901202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e4901202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c1501206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e2c696e7374616e74696174651024656e646f776d656e7454436f6d706163743c42616c616e63654f663c543e3e246761735f6c696d697430436f6d706163743c4761733e24636f64655f686173682c436f6465486173683c543e10646174611c5665633c75383e28bd0120496e7374616e7469617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e009820496e7374616e74696174696f6e20697320657865637574656420617320666f6c6c6f77733a004101202d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e0501202d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e6d01202d20546865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e204275666665722072657475726e65645d0120202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b6564a820202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e7c202d2054686520636f6e747261637420697320696e697469616c697a65642e3c636c61696d5f73757263686172676508106465737430543a3a4163636f756e744964286175785f73656e646572504f7074696f6e3c543a3a4163636f756e7449643e14710120416c6c6f777320626c6f636b2070726f64756365727320746f20636c61696d206120736d616c6c2072657761726420666f72206576696374696e67206120636f6e74726163742e204966206120626c6f636b2070726f64756365721501206661696c7320746f20646f20736f2c206120726567756c61722075736572732077696c6c20626520616c6c6f77656420746f20636c61696d20746865207265776172642e00390120496620636f6e7472616374206973206e6f742065766963746564206173206120726573756c74206f6620746869732063616c6c2c206e6f20616374696f6e73206172652074616b656e20616e64ac207468652073656e646572206973206e6f7420656c696769626c6520666f7220746865207265776172642e011c30496e7374616e74696174656408244163636f756e744964244163636f756e74496404dc20436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e1c4576696374656408244163636f756e74496410626f6f6c18e420436f6e747261637420686173206265656e206576696374656420616e64206973206e6f7720696e20746f6d6273746f6e652073746174652e0024202320506172616d73000d01202d2060636f6e7472616374603a20604163636f756e744964603a20546865206163636f756e74204944206f6620746865206576696374656420636f6e74726163742e3501202d2060746f6d6273746f6e65603a2060626f6f6c603a205472756520696620746865206576696374656420636f6e7472616374206c65667420626568696e64206120746f6d6273746f6e652e20526573746f72656410244163636f756e744964244163636f756e74496410486173681c42616c616e636520c020526573746f726174696f6e20666f72206120636f6e747261637420686173206265656e207375636365737366756c2e0024202320506172616d7300f4202d2060646f6e6f72603a20604163636f756e744964603a204163636f756e74204944206f662074686520726573746f72696e6720636f6e7472616374ec202d206064657374603a20604163636f756e744964603a204163636f756e74204944206f662074686520726573746f72656420636f6e7472616374e8202d2060636f64655f68617368603a206048617368603a20436f64652068617368206f662074686520726573746f72656420636f6e74726163741901202d206072656e745f616c6c6f77616e63653a206042616c616e6365603a2052656e7420616c6c6f77616e6365206f662074686520726573746f72656420636f6e747261637428436f646553746f72656404104861736804b820436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e3c5363686564756c6555706461746564040c75333204c020547269676765726564207768656e207468652063757272656e74207363686564756c6520697320757064617465642e284469737061746368656408244163636f756e74496410626f6f6c08390120412063616c6c2077617320646973706174636865642066726f6d2074686520676976656e206163636f756e742e2054686520626f6f6c207369676e616c7320776865746865722069742077617374207375636365737366756c20657865637574696f6e206f72206e6f742e44436f6e7472616374457865637574696f6e08244163636f756e7449641c5665633c75383e04090120416e206576656e74206465706f73697465642075706f6e20657865637574696f6e206f66206120636f6e74726163742066726f6d20746865206163636f756e742e204c5369676e6564436c61696d48616e646963617038543a3a426c6f636b4e756d626572100200000010e0204e756d626572206f6620626c6f636b2064656c617920616e2065787472696e73696320636c61696d20737572636861726765206861732e000d01205768656e20636c61696d207375726368617267652069732063616c6c656420627920616e2065787472696e736963207468652072656e7420697320636865636b65646820666f722063757272656e745f626c6f636b202d2064656c617940546f6d6273746f6e654465706f7369743042616c616e63654f663c543e4000a0acb903000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f2067656e6572617465206120746f6d6273746f6e652e4453746f7261676553697a654f66667365740c753332100800000018710120412073697a65206f666673657420666f7220616e20636f6e74726163742e2041206a7573742063726561746564206163636f756e74207769746820756e746f75636865642073746f726167652077696c6c20686176652074686174e0206d756368206f662073746f726167652066726f6d20746865207065727370656374697665206f66207468652073746174652072656e742e006101205468697320697320612073696d706c652077617920746f20656e73757265207468617420636f6e747261637473207769746820656d7074792073746f72616765206576656e7475616c6c79206765742064656c657465646501206279206d616b696e67207468656d207061792072656e742e2054686973206372656174657320616e20696e63656e7469766520746f2072656d6f7665207468656d206561726c7920696e206f7264657220746f2073617665182072656e742e2c52656e74427974654665653042616c616e63654f663c543e4000286bee000000000000000000000000043501205072696365206f6620612062797465206f662073746f7261676520706572206f6e6520626c6f636b20696e74657276616c2e2053686f756c642062652067726561746572207468616e20302e4452656e744465706f7369744f66667365743042616c616e63654f663c543e400010a5d4e800000000000000000000001c05012054686520616d6f756e74206f662066756e6473206120636f6e74726163742073686f756c64206465706f73697420696e206f7264657220746f206f6666736574582074686520636f7374206f66206f6e6520627974652e006901204c6574277320737570706f736520746865206465706f73697420697320312c303030204255202862616c616e636520756e697473292f6279746520616e64207468652072656e7420697320312042552f627974652f6461792c5901207468656e206120636f6e7472616374207769746820312c3030302c3030302042552074686174207573657320312c303030206279746573206f662073746f7261676520776f756c6420706179206e6f2072656e742e4d0120427574206966207468652062616c616e6365207265647563656420746f203530302c30303020425520616e64207468652073746f7261676520737461796564207468652073616d6520617420312c3030302c78207468656e20697420776f756c6420706179203530302042552f6461792e3c5375726368617267655265776172643042616c616e63654f663c543e40005cb2ec22000000000000000000000008e4205265776172642074686174206973207265636569766564206279207468652070617274792077686f736520746f75636820686173206c65646820746f2072656d6f76616c206f66206120636f6e74726163742e204d617844657074680c753332102000000008310120546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f696e7374616e746961746520737461636b2e204120726561736f6e61626c652064656661756c74382076616c7565206973203130302e304d617856616c756553697a650c753332100040000004390120546865206d6178696d756d2073697a65206f6620612073746f726167652076616c756520696e2062797465732e204120726561736f6e61626c652064656661756c74206973203136204b69422e1858496e76616c69645363686564756c6556657273696f6e0405012041206e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652063757272656e74206f6e652e54496e76616c6964537572636861726765436c61696d04550120416e206f726967696e206d757374206265207369676e6564206f7220696e686572656e7420616e6420617578696c696172792073656e646572206f6e6c792070726f7669646564206f6e20696e686572656e742e54496e76616c6964536f75726365436f6e747261637404dc2043616e6e6f7420726573746f72652066726f6d206e6f6e6578697374696e67206f7220746f6d6273746f6e6520636f6e74726163742e68496e76616c696444657374696e6174696f6e436f6e747261637404c42043616e6e6f7420726573746f726520746f206e6f6e6578697374696e67206f7220616c69766520636f6e74726163742e40496e76616c6964546f6d6273746f6e65046020546f6d6273746f6e657320646f6e2774206d617463682e54496e76616c6964436f6e74726163744f726967696e04bc20416e206f726967696e20547269654964207772697474656e20696e207468652063757272656e7420626c6f636b2e105375646f01105375646f040c4b6579010030543a3a4163636f756e74496480000000000000000000000000000000000000000000000000000000000000000004842054686520604163636f756e74496460206f6620746865207375646f206b65792e0110107375646f041063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e2839012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e60202d204f6e6520444220777269746520286576656e74292ec8202d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e302023203c2f7765696768743e547375646f5f756e636865636b65645f776569676874081063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e1c5f776569676874185765696768742839012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e310120546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865b4205375646f207573657220746f20737065636966792074686520776569676874206f66207468652063616c6c2e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292ed0202d2054686520776569676874206f6620746869732063616c6c20697320646566696e6564206279207468652063616c6c65722e302023203c2f7765696768743e1c7365745f6b6579040c6e65778c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652475012041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e44202d204f6e65204442206368616e67652e302023203c2f7765696768743e1c7375646f5f6173080c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e2c51012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d44206120676976656e206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e60202d204f6e6520444220777269746520286576656e74292ec8202d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e302023203c2f7765696768743e010c14537564696404384469737061746368526573756c7404602041207375646f206a75737420746f6f6b20706c6163652e284b65794368616e67656404244163636f756e74496404f020546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e285375646f4173446f6e650410626f6f6c04602041207375646f206a75737420746f6f6b20706c6163652e00042c526571756972655375646f04802053656e646572206d75737420626520746865205375646f206163636f756e7420496d4f6e6c696e650120496d4f6e6c696e6510384865617274626561744166746572010038543a3a426c6f636b4e756d62657210000000001831012054686520626c6f636b206e756d6265722061667465722077686963682069742773206f6b20746f2073656e64206865617274626561747320696e2063757272656e742073657373696f6e2e0011012041742074686520626567696e6e696e67206f6620656163682073657373696f6e20776520736574207468697320746f20612076616c756520746861742073686f756c64d02066616c6c20726f7567686c7920696e20746865206d6964646c65206f66207468652073657373696f6e206475726174696f6e2e010120546865206964656120697320746f206669727374207761697420666f72207468652076616c696461746f727320746f2070726f64756365206120626c6f636b390120696e207468652063757272656e742073657373696f6e2c20736f20746861742074686520686561727462656174206c61746572206f6e2077696c6c206e6f74206265206e65636573736172792e104b65797301004c5665633c543a3a417574686f7269747949643e040004d0205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e485265636569766564486561727462656174730002053053657373696f6e496e6465782441757468496e6465781c5665633c75383e05040008f020466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206041757468496e6465786020746f8020606f6666636861696e3a3a4f70617175654e6574776f726b5374617465602e38417574686f726564426c6f636b730102053053657373696f6e496e64657838543a3a56616c696461746f7249640c75333205100000000008150120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f662060543a3a56616c696461746f7249646020746f20746865c8206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e0104246865617274626561740824686561727462656174644865617274626561743c543a3a426c6f636b4e756d6265723e285f7369676e6174757265bc3c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e6174757265282c2023203c7765696768743e2101202d20436f6d706c65786974793a20604f284b202b20452960207768657265204b206973206c656e677468206f6620604b6579736020616e642045206973206c656e677468206f66b4202020604865617274626561742e6e6574776f726b5f73746174652e65787465726e616c5f6164647265737360008c2020202d20604f284b29603a206465636f64696e67206f66206c656e67746820604b60b02020202d20604f284529603a206465636f64696e672f656e636f64696e67206f66206c656e677468206045603d01202d20446252656164733a2070616c6c65745f73657373696f6e206056616c696461746f7273602c2070616c6c65745f73657373696f6e206043757272656e74496e646578602c20604b657973602c5c202020605265636569766564486561727462656174736084202d2044625772697465733a206052656365697665644865617274626561747360302023203c2f7765696768743e010c444865617274626561745265636569766564042c417574686f72697479496404c02041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f726974794964601c416c6c476f6f640004d42041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2c536f6d654f66666c696e6504605665633c4964656e74696669636174696f6e5475706c653e042d012041742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e652076616c696461746f722077617320666f756e6420746f206265206f66666c696e652e000828496e76616c69644b65790464204e6f6e206578697374656e74207075626c6963206b65792e4c4475706c6963617465644865617274626561740458204475706c696361746564206865617274626561742e48417574686f72697479446973636f76657279000100000000204f6666656e63657301204f6666656e636573101c5265706f727473000105345265706f727449644f663c543ed04f6666656e636544657461696c733c543a3a4163636f756e7449642c20543a3a4964656e74696669636174696f6e5475706c653e00040004490120546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e4044656665727265644f6666656e6365730100645665633c44656665727265644f6666656e63654f663c543e3e0400086501204465666572726564207265706f72747320746861742068617665206265656e2072656a656374656420627920746865206f6666656e63652068616e646c657220616e64206e65656420746f206265207375626d6974746564442061742061206c617465722074696d652e58436f6e63757272656e745265706f727473496e646578010205104b696e64384f706171756554696d65536c6f74485665633c5265706f727449644f663c543e3e050400042901204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e485265706f72747342794b696e64496e646578010105104b696e641c5665633c75383e00040018110120456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e00bc20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e004901204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f66690120646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e010001041c4f6666656e63650c104b696e64384f706171756554696d65536c6f7410626f6f6c0c550120546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e644d0120286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e206c6173741d0120656c656d656e7420696e64696361746573206f6620746865206f6666656e636520776173206170706c69656420287472756529206f7220717565756564202866616c7365292e000028486973746f726963616c00000000006052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100305665633c543a3a486173683e04000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e0100000000204964656e7469747901204964656e7469747910284964656e746974794f6600010530543a3a4163636f756e74496468526567697374726174696f6e3c42616c616e63654f663c543e3e0004000c210120496e666f726d6174696f6e20746861742069732070657274696e656e7420746f206964656e746966792074686520656e7469747920626568696e6420616e206163636f756e742e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e1c53757065724f6600010230543a3a4163636f756e7449645028543a3a4163636f756e7449642c204461746129000400086101205468652073757065722d6964656e74697479206f6620616e20616c7465726e6174697665202273756222206964656e7469747920746f676574686572207769746820697473206e616d652c2077697468696e2074686174510120636f6e746578742e20496620746865206163636f756e74206973206e6f7420736f6d65206f74686572206163636f756e742773207375622d6964656e746974792c207468656e206a75737420604e6f6e65602e18537562734f6601010530543a3a4163636f756e744964842842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e290044000000000000000000000000000000000014b820416c7465726e6174697665202273756222206964656e746974696573206f662074686973206163636f756e742e001d0120546865206669727374206974656d20697320746865206465706f7369742c20746865207365636f6e64206973206120766563746f72206f6620746865206163636f756e74732e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e28526567697374726172730100d85665633c4f7074696f6e3c526567697374726172496e666f3c42616c616e63654f663c543e2c20543a3a4163636f756e7449643e3e3e0400104d012054686520736574206f6620726567697374726172732e204e6f7420657870656374656420746f206765742076657279206269672061732063616e206f6e6c79206265206164646564207468726f7567682061a8207370656369616c206f726967696e20286c696b656c79206120636f756e63696c206d6f74696f6e292e0029012054686520696e64657820696e746f20746869732063616e206265206361737420746f2060526567697374726172496e6465786020746f2067657420612076616c69642076616c75652e012c346164645f726567697374726172041c6163636f756e7430543a3a4163636f756e744964347c2041646420612072656769737472617220746f207468652073797374656d2e00010120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060543a3a5265676973747261724f726967696e602e00ac202d20606163636f756e74603a20746865206163636f756e74206f6620746865207265676973747261722e009820456d6974732060526567697374726172416464656460206966207375636365737366756c2e002c2023203c7765696768743e2901202d20604f2852296020776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e64656420616e6420636f64652d626f756e646564292e9c202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e307365745f6964656e746974790410696e666f304964656e74697479496e666f4c2d012053657420616e206163636f756e742773206964656e7469747920696e666f726d6174696f6e20616e6420726573657276652074686520617070726f707269617465206465706f7369742e00590120496620746865206163636f756e7420616c726561647920686173206964656e7469747920696e666f726d6174696f6e2c20746865206465706f7369742069732074616b656e2061732070617274207061796d656e745420666f7220746865206e6577206465706f7369742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0090202d2060696e666f603a20546865206964656e7469747920696e666f726d6174696f6e2e008c20456d69747320604964656e7469747953657460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2858202b205827202b2052296021012020202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e64656429e42020202d20776865726520605260206a756467656d656e74732d636f756e7420287265676973747261722d636f756e742d626f756e6465642984202d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e2501202d204f6e652073746f72616765206d75746174696f6e2028636f6465632d7265616420604f285827202b205229602c20636f6465632d777269746520604f2858202b20522960292e34202d204f6e65206576656e742e302023203c2f7765696768743e207365745f73756273041073756273645665633c28543a3a4163636f756e7449642c2044617461293e54902053657420746865207375622d6163636f756e7473206f66207468652073656e6465722e005901205061796d656e743a20416e79206167677265676174652062616c616e63652072657365727665642062792070726576696f757320607365745f73756273602063616c6c732077696c6c2062652072657475726e6564310120616e6420616e20616d6f756e7420605375624163636f756e744465706f736974602077696c6c20626520726573657276656420666f722065616368206974656d20696e206073756273602e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e00b4202d206073756273603a20546865206964656e74697479277320286e657729207375622d6163636f756e74732e002c2023203c7765696768743e34202d20604f2850202b20532960e82020202d20776865726520605060206f6c642d737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292ed82020202d2077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e88202d204174206d6f7374206f6e652062616c616e6365206f7065726174696f6e732e18202d2044423ae02020202d206050202b2053602073746f72616765206d75746174696f6e732028636f64656320636f6d706c657869747920604f2831296029c02020202d204f6e652073746f7261676520726561642028636f64656320636f6d706c657869747920604f28502960292ec42020202d204f6e652073746f726167652077726974652028636f64656320636f6d706c657869747920604f28532960292ed42020202d204f6e652073746f726167652d6578697374732028604964656e746974794f663a3a636f6e7461696e735f6b657960292e302023203c2f7765696768743e38636c6561725f6964656e7469747900483d0120436c65617220616e206163636f756e742773206964656e7469747920696e666f20616e6420616c6c207375622d6163636f756e747320616e642072657475726e20616c6c206465706f736974732e00f0205061796d656e743a20416c6c2072657365727665642062616c616e636573206f6e20746865206163636f756e74206172652072657475726e65642e00650120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656428206964656e746974792e009c20456d69747320604964656e74697479436c656172656460206966207375636365737366756c2e002c2023203c7765696768743e44202d20604f2852202b2053202b20582960d02020202d20776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e646564292ed82020202d2077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e25012020202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e646564292e8c202d204f6e652062616c616e63652d756e72657365727665206f7065726174696f6e2ecc202d206032602073746f7261676520726561647320616e64206053202b2032602073746f726167652064656c6574696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e44726571756573745f6a756467656d656e7408247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e1c6d61785f66656554436f6d706163743c42616c616e63654f663c543e3e5c9820526571756573742061206a756467656d656e742066726f6d2061207265676973747261722e005901205061796d656e743a204174206d6f737420606d61785f666565602077696c6c20626520726573657276656420666f72207061796d656e7420746f2074686520726567697374726172206966206a756467656d656e741c20676976656e2e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e002101202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973207265717565737465642e5901202d20606d61785f666565603a20546865206d6178696d756d206665652074686174206d617920626520706169642e20546869732073686f756c64206a757374206265206175746f2d706f70756c617465642061733a0034206060606e6f636f6d70696c65bc2053656c663a3a7265676973747261727328292e676574287265675f696e646578292e756e7772617028292e666565102060606000a820456d69747320604a756467656d656e7452657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2858202b205229602e34202d204f6e65206576656e742e302023203c2f7765696768743e3863616e63656c5f7265717565737404247265675f696e64657838526567697374726172496e646578446c2043616e63656c20612070726576696f757320726571756573742e00fc205061796d656e743a20412070726576696f75736c79207265736572766564206465706f7369742069732072657475726e6564206f6e20737563636573732e00390120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061542072656769737465726564206964656e746974792e004901202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206e6f206c6f6e676572207265717565737465642e00b020456d69747320604a756467656d656e74556e72657175657374656460206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e8c202d204f6e652073746f72616765206d75746174696f6e20604f2852202b205829602e30202d204f6e65206576656e74302023203c2f7765696768743e1c7365745f6665650814696e6465785c436f6d706163743c526567697374726172496e6465783e0c66656554436f6d706163743c42616c616e63654f663c543e3e341d0120536574207468652066656520726571756972656420666f722061206a756467656d656e7420746f206265207265717565737465642066726f6d2061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e58202d2060666565603a20746865206e6577206665652e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602ee8202d2042656e63686d61726b3a20372e333135202b2052202a20302e33323920c2b57320286d696e207371756172657320616e616c7973697329302023203c2f7765696768743e387365745f6163636f756e745f69640814696e6465785c436f6d706163743c526567697374726172496e6465783e0c6e657730543a3a4163636f756e74496434c0204368616e676520746865206163636f756e74206173736f63696174656420776974682061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e74202d20606e6577603a20746865206e6577206163636f756e742049442e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602ee4202d2042656e63686d61726b3a20382e383233202b2052202a20302e333220c2b57320286d696e207371756172657320616e616c7973697329302023203c2f7765696768743e287365745f6669656c64730814696e6465785c436f6d706163743c526567697374726172496e6465783e186669656c6473384964656e746974794669656c647334ac2053657420746865206669656c6420696e666f726d6174696f6e20666f722061207265676973747261722e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a4206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f8202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e1101202d20606669656c6473603a20746865206669656c64732074686174207468652072656769737472617220636f6e6365726e73207468656d73656c76657320776974682e002c2023203c7765696768743e28202d20604f285229602e7c202d204f6e652073746f72616765206d75746174696f6e20604f285229602ee8202d2042656e63686d61726b3a20372e343634202b2052202a20302e33323520c2b57320286d696e207371756172657320616e616c7973697329302023203c2f7765696768743e4470726f766964655f6a756467656d656e740c247265675f696e6465785c436f6d706163743c526567697374726172496e6465783e187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365246a756467656d656e745c4a756467656d656e743c42616c616e63654f663c543e3e4cbc2050726f766964652061206a756467656d656e7420666f7220616e206163636f756e742773206964656e746974792e00590120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74b4206f6620746865207265676973747261722077686f736520696e64657820697320607265675f696e646578602e002501202d20607265675f696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206265696e67206d6164652e5901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e4d01202d20606a756467656d656e74603a20746865206a756467656d656e74206f662074686520726567697374726172206f6620696e64657820607265675f696e646578602061626f75742060746172676574602e009820456d69747320604a756467656d656e74476976656e60206966207375636365737366756c2e002c2023203c7765696768743e38202d20604f2852202b205829602e88202d204f6e652062616c616e63652d7472616e73666572206f7065726174696f6e2e98202d20557020746f206f6e65206163636f756e742d6c6f6f6b7570206f7065726174696f6e2ebc202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2852202b205829602e34202d204f6e65206576656e742e302023203c2f7765696768743e346b696c6c5f6964656e7469747904187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654c45012052656d6f766520616e206163636f756e742773206964656e7469747920616e64207375622d6163636f756e7420696e666f726d6174696f6e20616e6420736c61736820746865206465706f736974732e006501205061796d656e743a2052657365727665642062616c616e6365732066726f6d20607365745f737562736020616e6420607365745f6964656e74697479602061726520736c617368656420616e642068616e646c656420627949012060536c617368602e20566572696669636174696f6e2072657175657374206465706f7369747320617265206e6f742072657475726e65643b20746865792073686f756c642062652063616e63656c6c656484206d616e75616c6c79207573696e67206063616e63656c5f72657175657374602e00fc20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206d617463682060543a3a466f7263654f726967696e602e005901202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e74782020207769746820612072656769737465726564206964656e746974792e009820456d69747320604964656e746974794b696c6c656460206966207375636365737366756c2e002c2023203c7765696768743e48202d20604f2852202b2053202b205829602e84202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e74202d206053202b2032602073746f72616765206d75746174696f6e732e34202d204f6e65206576656e742e302023203c2f7765696768743e011c2c4964656e7469747953657404244163636f756e74496404f02041206e616d652077617320736574206f72207265736574202877686963682077696c6c2072656d6f766520616c6c206a756467656d656e7473292e3c4964656e74697479436c656172656408244163636f756e7449641c42616c616e636504d02041206e616d652077617320636c65617265642c20616e642074686520676976656e2062616c616e63652072657475726e65642e384964656e746974794b696c6c656408244163636f756e7449641c42616c616e636504c82041206e616d65207761732072656d6f76656420616e642074686520676976656e2062616c616e636520736c61736865642e484a756467656d656e7452657175657374656408244163636f756e74496438526567697374726172496e64657804a02041206a756467656d656e74207761732061736b65642066726f6d2061207265676973747261722e504a756467656d656e74556e72657175657374656408244163636f756e74496438526567697374726172496e646578048c2041206a756467656d656e74207265717565737420776173207265747261637465642e384a756467656d656e74476976656e08244163636f756e74496438526567697374726172496e64657804982041206a756467656d656e742077617320676976656e2062792061207265676973747261722e3852656769737472617241646465640438526567697374726172496e646578045c204120726567697374726172207761732061646465642e183042617369634465706f7369743042616c616e63654f663c543e400080c6a47e8d0300000000000000000004d82054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564206964656e746974792e304669656c644465706f7369743042616c616e63654f663c543e4000a031a95fe300000000000000000000042d012054686520616d6f756e742068656c64206f6e206465706f73697420706572206164646974696f6e616c206669656c6420666f7220612072656769737465726564206964656e746974792e445375624163636f756e744465706f7369743042616c616e63654f663c543e400080f420e6b5000000000000000000000c65012054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564207375626163636f756e742e20546869732073686f756c64206163636f756e7420666f7220746865206661637471012074686174206f6e652073746f72616765206974656d27732076616c75652077696c6c20696e637265617365206279207468652073697a65206f6620616e206163636f756e742049442c20616e642074686572652077696c6c206265290120616e6f746865722074726965206974656d2077686f73652076616c7565206973207468652073697a65206f6620616e206163636f756e7420494420706c75732033322062797465732e384d61785375624163636f756e74730c7533321064000000040d0120546865206d6178696d756d206e756d626572206f66207375622d6163636f756e747320616c6c6f77656420706572206964656e746966696564206163636f756e742e4c4d61784164646974696f6e616c4669656c64730c7533321064000000086501204d6178696d756d206e756d626572206f66206164646974696f6e616c206669656c64732074686174206d61792062652073746f72656420696e20616e2049442e204e656564656420746f20626f756e642074686520492f4fe020726571756972656420746f2061636365737320616e206964656e746974792c206275742063616e2062652070726574747920686967682e344d6178526567697374726172730c7533321014000000085101204d61786d696d756d206e756d626572206f66207265676973747261727320616c6c6f77656420696e207468652073797374656d2e204e656564656420746f20626f756e642074686520636f6d706c65786974797c206f662c20652e672e2c207570646174696e67206a756467656d656e74732e3448546f6f4d616e795375624163636f756e7473046020546f6f206d616e7920737562732d6163636f756e74732e204e6f74466f756e640454204163636f756e742069736e277420666f756e642e204e6f744e616d65640454204163636f756e742069736e2774206e616d65642e28456d707479496e646578043420456d70747920696e6465782e284665654368616e676564044020466565206973206368616e6765642e284e6f4964656e74697479044c204e6f206964656e7469747920666f756e642e3c537469636b794a756467656d656e74044820537469636b79206a756467656d656e742e384a756467656d656e74476976656e0444204a756467656d656e7420676976656e2e40496e76616c69644a756467656d656e74044c20496e76616c6964206a756467656d656e742e30496e76616c6964496e64657804582054686520696e64657820697320696e76616c69642e34496e76616c6964546172676574045c205468652074617267657420697320696e76616c69642e34546f6f4d616e794669656c6473047020546f6f206d616e79206164646974696f6e616c206669656c64732e44546f6f4d616e795265676973747261727304ec204d6178696d756d20616d6f756e74206f66207265676973747261727320726561636865642e2043616e6e6f742061646420616e79206d6f72652e1c536f6369657479011c536f6369657479401c466f756e646572000030543a3a4163636f756e7449640400044820546865206669727374206d656d6265722e1452756c657300001c543a3a48617368040008510120412068617368206f66207468652072756c6573206f66207468697320736f636965747920636f6e6365726e696e67206d656d626572736869702e2043616e206f6e6c7920626520736574206f6e636520616e6454206f6e6c792062792074686520666f756e6465722e2843616e6469646174657301009c5665633c4269643c543a3a4163636f756e7449642c2042616c616e63654f663c542c20493e3e3e0400043901205468652063757272656e7420736574206f662063616e646964617465733b206269646465727320746861742061726520617474656d7074696e6720746f206265636f6d65206d656d626572732e4c53757370656e64656443616e6469646174657300010530543a3a4163636f756e744964e42842616c616e63654f663c542c20493e2c204269644b696e643c543a3a4163636f756e7449642c2042616c616e63654f663c542c20493e3e2900040004842054686520736574206f662073757370656e6465642063616e646964617465732e0c506f7401003c42616c616e63654f663c542c20493e400000000000000000000000000000000004410120416d6f756e74206f66206f7572206163636f756e742062616c616e63652074686174206973207370656369666963616c6c7920666f7220746865206e65787420726f756e642773206269642873292e1048656164000030543a3a4163636f756e744964040004e820546865206d6f7374207072696d6172792066726f6d20746865206d6f737420726563656e746c7920617070726f766564206d656d626572732e1c4d656d626572730100445665633c543a3a4163636f756e7449643e04000494205468652063757272656e7420736574206f66206d656d626572732c206f7264657265642e4053757370656e6465644d656d6265727301010530543a3a4163636f756e74496410626f6f6c00040004782054686520736574206f662073757370656e646564206d656d626572732e104269647301009c5665633c4269643c543a3a4163636f756e7449642c2042616c616e63654f663c542c20493e3e3e040004e8205468652063757272656e7420626964732c2073746f726564206f726465726564206279207468652076616c7565206f6620746865206269642e20566f756368696e6700010530543a3a4163636f756e74496438566f756368696e6753746174757300040004e4204d656d626572732063757272656e746c7920766f756368696e67206f722062616e6e65642066726f6d20766f756368696e6720616761696e1c5061796f75747301010530543a3a4163636f756e744964985665633c28543a3a426c6f636b4e756d6265722c2042616c616e63654f663c542c20493e293e000400044d012050656e64696e67207061796f7574733b206f72646572656420627920626c6f636b206e756d6265722c20776974682074686520616d6f756e7420746861742073686f756c642062652070616964206f75742e1c537472696b657301010530543a3a4163636f756e7449642c537472696b65436f756e7400100000000004dc20546865206f6e676f696e67206e756d626572206f66206c6f73696e6720766f746573206361737420627920746865206d656d6265722e14566f74657300020530543a3a4163636f756e74496430543a3a4163636f756e74496410566f746505040004d020446f75626c65206d61702066726f6d2043616e646964617465202d3e20566f746572202d3e20284d617962652920566f74652e20446566656e646572000030543a3a4163636f756e744964040004c42054686520646566656e64696e67206d656d6265722063757272656e746c79206265696e67206368616c6c656e6765642e34446566656e646572566f74657300010530543a3a4163636f756e74496410566f7465000400046020566f74657320666f722074686520646566656e6465722e284d61784d656d6265727301000c753332100000000004dc20546865206d6178206e756d626572206f66206d656d6265727320666f722074686520736f6369657479206174206f6e652074696d652e01300c626964041476616c75653c42616c616e63654f663c542c20493e84e020412075736572206f757473696465206f662074686520736f63696574792063616e206d616b6520612062696420666f7220656e7472792e003901205061796d656e743a206043616e6469646174654465706f736974602077696c6c20626520726573657276656420666f72206d616b696e672061206269642e2049742069732072657475726e6564f0207768656e2074686520626964206265636f6d65732061206d656d6265722c206f7220696620746865206269642063616c6c732060756e626964602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a5901202d206076616c7565603a2041206f6e652074696d65207061796d656e74207468652062696420776f756c64206c696b6520746f2072656365697665207768656e206a6f696e696e672074686520736f63696574792e002c2023203c7765696768743e5501204b65793a204220286c656e206f662062696473292c204320286c656e206f662063616e64696461746573292c204d20286c656e206f66206d656d62657273292c2058202862616c616e636520726573657276652944202d2053746f726167652052656164733aec20092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e6465642063616e6469646174652e204f283129e020092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e646564206d656d6265722e204f283129dc20092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e7420626964732e204f284229f420092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e742063616e646964617465732e204f284329c820092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c206d656d626572732e204f284d2948202d2053746f72616765205772697465733a810120092d204f6e652073746f72616765206d757461746520746f206164642061206e65772062696420746f2074686520766563746f72204f2842292028544f444f3a20706f737369626c65206f7074696d697a6174696f6e20772f207265616429010120092d20557020746f206f6e652073746f726167652072656d6f76616c206966206269642e6c656e2829203e204d41585f4249445f434f554e542e204f2831295c202d204e6f7461626c6520436f6d7075746174696f6e3a2d0120092d204f2842202b2043202b206c6f67204d292073656172636820746f20636865636b2075736572206973206e6f7420616c726561647920612070617274206f6620736f63696574792ec420092d204f286c6f672042292073656172636820746f20696e7365727420746865206e65772062696420736f727465642e78202d2045787465726e616c204d6f64756c65204f7065726174696f6e733a9c20092d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e204f285829210120092d20557020746f206f6e652062616c616e636520756e72657365727665206f7065726174696f6e20696620626964732e6c656e2829203e204d41585f4249445f434f554e542e28202d204576656e74733a6820092d204f6e65206576656e7420666f72206e6577206269642efc20092d20557020746f206f6e65206576656e7420666f72204175746f556e626964206966206269642e6c656e2829203e204d41585f4249445f434f554e542e00c420546f74616c20436f6d706c65786974793a204f284d202b2042202b2043202b206c6f674d202b206c6f6742202b205829302023203c2f7765696768743e14756e626964040c706f730c7533324cd82041206269646465722063616e2072656d6f76652074686569722062696420666f7220656e74727920696e746f20736f63696574792e010120427920646f696e6720736f2c20746865792077696c6c20686176652074686569722063616e646964617465206465706f7369742072657475726e6564206f728420746865792077696c6c20756e766f75636820746865697220766f75636865722e00fc205061796d656e743a2054686520626964206465706f73697420697320756e7265736572766564206966207468652075736572206d6164652061206269642e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206269646465722e003020506172616d65746572733a1901202d2060706f73603a20506f736974696f6e20696e207468652060426964736020766563746f72206f6620746865206269642077686f2077616e747320746f20756e6269642e002c2023203c7765696768743eb0204b65793a204220286c656e206f662062696473292c2058202862616c616e636520756e72657365727665290d01202d204f6e652073746f72616765207265616420616e6420777269746520746f20726574726965766520616e64207570646174652074686520626964732e204f2842294501202d20456974686572206f6e6520756e726573657276652062616c616e636520616374696f6e204f285829206f72206f6e6520766f756368696e672073746f726167652072656d6f76616c2e204f28312934202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2842202b205829302023203c2f7765696768743e14766f7563680c0c77686f30543a3a4163636f756e7449641476616c75653c42616c616e63654f663c542c20493e0c7469703c42616c616e63654f663c542c20493eb045012041732061206d656d6265722c20766f75636820666f7220736f6d656f6e6520746f206a6f696e20736f636965747920627920706c6163696e67206120626964206f6e20746865697220626568616c662e005501205468657265206973206e6f206465706f73697420726571756972656420746f20766f75636820666f722061206e6577206269642c206275742061206d656d6265722063616e206f6e6c7920766f75636820666f725d01206f6e652062696420617420612074696d652e2049662074686520626964206265636f6d657320612073757370656e6465642063616e64696461746520616e6420756c74696d6174656c792072656a65637465642062794101207468652073757370656e73696f6e206a756467656d656e74206f726967696e2c20746865206d656d6265722077696c6c2062652062616e6e65642066726f6d20766f756368696e6720616761696e2e005901204173206120766f756368696e67206d656d6265722c20796f752063616e20636c61696d206120746970206966207468652063616e6469646174652069732061636365707465642e2054686973207469702077696c6c51012062652070616964206173206120706f7274696f6e206f66207468652072657761726420746865206d656d6265722077696c6c207265636569766520666f72206a6f696e696e672074686520736f63696574792e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d6265722e003020506172616d65746572733acc202d206077686f603a2054686520757365722077686f20796f7520776f756c64206c696b6520746f20766f75636820666f722e5101202d206076616c7565603a2054686520746f74616c2072657761726420746f2062652070616964206265747765656e20796f7520616e64207468652063616e6469646174652069662074686579206265636f6d65642061206d656d62657220696e2074686520736f63696574792e4901202d2060746970603a20596f757220637574206f662074686520746f74616c206076616c756560207061796f7574207768656e207468652063616e64696461746520697320696e64756374656420696e746f15012074686520736f63696574792e2054697073206c6172676572207468616e206076616c7565602077696c6c206265207361747572617465642075706f6e207061796f75742e002c2023203c7765696768743e0101204b65793a204220286c656e206f662062696473292c204320286c656e206f662063616e64696461746573292c204d20286c656e206f66206d656d626572732944202d2053746f726167652052656164733ac820092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c206d656d626572732e204f284d29090120092d204f6e652073746f72616765207265616420746f20636865636b206d656d626572206973206e6f7420616c726561647920766f756368696e672e204f283129ec20092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e6465642063616e6469646174652e204f283129e020092d204f6e652073746f72616765207265616420746f20636865636b20666f722073757370656e646564206d656d6265722e204f283129dc20092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e7420626964732e204f284229f420092d204f6e652073746f72616765207265616420746f20726574726965766520616c6c2063757272656e742063616e646964617465732e204f28432948202d2053746f72616765205772697465733a0d0120092d204f6e652073746f7261676520777269746520746f20696e7365727420766f756368696e672073746174757320746f20746865206d656d6265722e204f283129810120092d204f6e652073746f72616765206d757461746520746f206164642061206e65772062696420746f2074686520766563746f72204f2842292028544f444f3a20706f737369626c65206f7074696d697a6174696f6e20772f207265616429010120092d20557020746f206f6e652073746f726167652072656d6f76616c206966206269642e6c656e2829203e204d41585f4249445f434f554e542e204f2831295c202d204e6f7461626c6520436f6d7075746174696f6e3ac020092d204f286c6f67204d292073656172636820746f20636865636b2073656e6465722069732061206d656d6265722e2d0120092d204f2842202b2043202b206c6f67204d292073656172636820746f20636865636b2075736572206973206e6f7420616c726561647920612070617274206f6620736f63696574792ec420092d204f286c6f672042292073656172636820746f20696e7365727420746865206e65772062696420736f727465642e78202d2045787465726e616c204d6f64756c65204f7065726174696f6e733a9c20092d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e204f285829210120092d20557020746f206f6e652062616c616e636520756e72657365727665206f7065726174696f6e20696620626964732e6c656e2829203e204d41585f4249445f434f554e542e28202d204576656e74733a6020092d204f6e65206576656e7420666f7220766f7563682efc20092d20557020746f206f6e65206576656e7420666f72204175746f556e626964206966206269642e6c656e2829203e204d41585f4249445f434f554e542e00c420546f74616c20436f6d706c65786974793a204f284d202b2042202b2043202b206c6f674d202b206c6f6742202b205829302023203c2f7765696768743e1c756e766f756368040c706f730c753332442d01204173206120766f756368696e67206d656d6265722c20756e766f7563682061206269642e2054686973206f6e6c7920776f726b73207768696c6520766f7563686564207573657220697394206f6e6c792061206269646465722028616e64206e6f7420612063616e646964617465292e00290120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206120766f756368696e67206d656d6265722e003020506172616d65746572733a2d01202d2060706f73603a20506f736974696f6e20696e207468652060426964736020766563746f72206f6620746865206269642077686f2073686f756c6420626520756e766f75636865642e002c2023203c7765696768743e54204b65793a204220286c656e206f662062696473290901202d204f6e652073746f726167652072656164204f28312920746f20636865636b20746865207369676e6572206973206120766f756368696e67206d656d6265722eec202d204f6e652073746f72616765206d757461746520746f20726574726965766520616e64207570646174652074686520626964732e204f28422994202d204f6e6520766f756368696e672073746f726167652072656d6f76616c2e204f28312934202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f284229302023203c2f7765696768743e10766f7465082463616e6469646174658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651c617070726f766510626f6f6c4c882041732061206d656d6265722c20766f7465206f6e20612063616e6469646174652e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d6265722e003020506172616d65746572733a0d01202d206063616e646964617465603a205468652063616e646964617465207468617420746865206d656d62657220776f756c64206c696b6520746f20626964206f6e2ef4202d2060617070726f7665603a204120626f6f6c65616e2077686963682073617973206966207468652063616e6469646174652073686f756c64206265d82020202020202020202020202020617070726f766564202860747275656029206f722072656a656374656420286066616c736560292e002c2023203c7765696768743ebc204b65793a204320286c656e206f662063616e64696461746573292c204d20286c656e206f66206d656d62657273291d01202d204f6e652073746f726167652072656164204f284d2920616e64204f286c6f67204d292073656172636820746f20636865636b20757365722069732061206d656d6265722e58202d204f6e65206163636f756e74206c6f6f6b75702e2d01202d204f6e652073746f726167652072656164204f28432920616e64204f2843292073656172636820746f20636865636b2074686174207573657220697320612063616e6469646174652ebc202d204f6e652073746f7261676520777269746520746f2061646420766f746520746f20766f7465732e204f28312934202d204f6e65206576656e742e008820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b204329302023203c2f7765696768743e34646566656e6465725f766f7465041c617070726f766510626f6f6c408c2041732061206d656d6265722c20766f7465206f6e2074686520646566656e6465722e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d6265722e003020506172616d65746572733af4202d2060617070726f7665603a204120626f6f6c65616e2077686963682073617973206966207468652063616e6469646174652073686f756c64206265a420617070726f766564202860747275656029206f722072656a656374656420286066616c736560292e002c2023203c7765696768743e68202d204b65793a204d20286c656e206f66206d656d62657273291d01202d204f6e652073746f726167652072656164204f284d2920616e64204f286c6f67204d292073656172636820746f20636865636b20757365722069732061206d656d6265722ebc202d204f6e652073746f7261676520777269746520746f2061646420766f746520746f20766f7465732e204f28312934202d204f6e65206576656e742e007820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d29302023203c2f7765696768743e187061796f757400504501205472616e7366657220746865206669727374206d617475726564207061796f757420666f72207468652073656e64657220616e642072656d6f76652069742066726f6d20746865207265636f7264732e006901204e4f54453a20546869732065787472696e736963206e6565647320746f2062652063616c6c6564206d756c7469706c652074696d657320746f20636c61696d206d756c7469706c65206d617475726564207061796f7574732e002101205061796d656e743a20546865206d656d6265722077696c6c20726563656976652061207061796d656e7420657175616c20746f207468656972206669727374206d61747572656478207061796f757420746f20746865697220667265652062616c616e63652e00150120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642061206d656d62657220776974684c207061796f7574732072656d61696e696e672e002c2023203c7765696768743e1d01204b65793a204d20286c656e206f66206d656d62657273292c205020286e756d626572206f66207061796f75747320666f72206120706172746963756c6172206d656d626572292501202d204f6e652073746f726167652072656164204f284d2920616e64204f286c6f67204d292073656172636820746f20636865636b207369676e65722069732061206d656d6265722ee4202d204f6e652073746f726167652072656164204f28502920746f2067657420616c6c207061796f75747320666f722061206d656d6265722ee4202d204f6e652073746f726167652072656164204f28312920746f20676574207468652063757272656e7420626c6f636b206e756d6265722e8c202d204f6e652063757272656e6379207472616e736665722063616c6c2e204f2858291101202d204f6e652073746f72616765207772697465206f722072656d6f76616c20746f2075706461746520746865206d656d6265722773207061796f7574732e204f285029009820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b2050202b205829302023203c2f7765696768743e14666f756e640c1c666f756e64657230543a3a4163636f756e7449642c6d61785f6d656d626572730c7533321472756c65731c5665633c75383e4c4c20466f756e642074686520736f63696574792e00f0205468697320697320646f6e65206173206120646973637265746520616374696f6e20696e206f7264657220746f20616c6c6f7720666f72207468651901206d6f64756c6520746f20626520696e636c7564656420696e746f20612072756e6e696e6720636861696e20616e642063616e206f6e6c7920626520646f6e65206f6e63652e001d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d20746865205f466f756e6465725365744f726967696e5f2e003020506172616d65746572733a1901202d2060666f756e64657260202d20546865206669727374206d656d62657220616e642068656164206f6620746865206e65776c7920666f756e64656420736f63696574792e1501202d20606d61785f6d656d6265727360202d2054686520696e697469616c206d6178206e756d626572206f66206d656d6265727320666f722074686520736f63696574792ef4202d206072756c657360202d205468652072756c6573206f66207468697320736f636965747920636f6e6365726e696e67206d656d626572736869702e002c2023203c7765696768743ee0202d2054776f2073746f72616765206d75746174657320746f207365742060486561646020616e642060466f756e646572602e204f283129f4202d204f6e652073746f7261676520777269746520746f2061646420746865206669727374206d656d62657220746f20736f63696574792e204f28312934202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f283129302023203c2f7765696768743e1c756e666f756e6400348c20416e6e756c2074686520666f756e64696e67206f662074686520736f63696574792e005d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205369676e65642c20616e6420746865207369676e696e67206163636f756e74206d75737420626520626f74685901207468652060466f756e6465726020616e6420746865206048656164602e205468697320696d706c6965732074686174206974206d6179206f6e6c7920626520646f6e65207768656e207468657265206973206f6e6520206d656d6265722e002c2023203c7765696768743e68202d2054776f2073746f72616765207265616473204f2831292e78202d20466f75722073746f726167652072656d6f76616c73204f2831292e34202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f283129302023203c2f7765696768743e586a756467655f73757370656e6465645f6d656d626572080c77686f30543a3a4163636f756e7449641c666f726769766510626f6f6c6c2d0120416c6c6f772073757370656e73696f6e206a756467656d656e74206f726967696e20746f206d616b65206a756467656d656e74206f6e20612073757370656e646564206d656d6265722e00590120496620612073757370656e646564206d656d62657220697320666f72676976656e2c2077652073696d706c7920616464207468656d206261636b2061732061206d656d6265722c206e6f7420616666656374696e67cc20616e79206f6620746865206578697374696e672073746f72616765206974656d7320666f722074686174206d656d6265722e00490120496620612073757370656e646564206d656d6265722069732072656a65637465642c2072656d6f766520616c6c206173736f6369617465642073746f72616765206974656d732c20696e636c7564696e670101207468656972207061796f7574732c20616e642072656d6f766520616e7920766f7563686564206269647320746865792063757272656e746c7920686176652e00410120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d20746865205f53757370656e73696f6e4a756467656d656e744f726967696e5f2e003020506172616d65746572733ab4202d206077686f60202d205468652073757370656e646564206d656d62657220746f206265206a75646765642e3501202d2060666f726769766560202d204120626f6f6c65616e20726570726573656e74696e672077686574686572207468652073757370656e73696f6e206a756467656d656e74206f726967696e2501202020202020202020202020202020666f726769766573202860747275656029206f722072656a6563747320286066616c7365602920612073757370656e646564206d656d6265722e002c2023203c7765696768743ea4204b65793a204220286c656e206f662062696473292c204d20286c656e206f66206d656d6265727329f8202d204f6e652073746f72616765207265616420746f20636865636b206077686f6020697320612073757370656e646564206d656d6265722e204f2831297101202d20557020746f206f6e652073746f72616765207772697465204f284d292077697468204f286c6f67204d292062696e6172792073656172636820746f206164642061206d656d626572206261636b20746f20736f63696574792ef8202d20557020746f20332073746f726167652072656d6f76616c73204f28312920746f20636c65616e20757020612072656d6f766564206d656d6265722e4501202d20557020746f206f6e652073746f72616765207772697465204f2842292077697468204f2842292073656172636820746f2072656d6f766520766f7563686564206269642066726f6d20626964732ed4202d20557020746f206f6e65206164646974696f6e616c206576656e7420696620756e766f7563682074616b657320706c6163652e70202d204f6e652073746f726167652072656d6f76616c2e204f2831297c202d204f6e65206576656e7420666f7220746865206a756467656d656e742e008820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b204229302023203c2f7765696768743e646a756467655f73757370656e6465645f63616e646964617465080c77686f30543a3a4163636f756e744964246a756467656d656e74244a756467656d656e74a0350120416c6c6f772073757370656e646564206a756467656d656e74206f726967696e20746f206d616b65206a756467656d656e74206f6e20612073757370656e6465642063616e6469646174652e005d0120496620746865206a756467656d656e742069732060417070726f7665602c20776520616464207468656d20746f20736f63696574792061732061206d656d62657220776974682074686520617070726f70726961746574207061796d656e7420666f72206a6f696e696e6720736f63696574792e00550120496620746865206a756467656d656e74206973206052656a656374602c2077652065697468657220736c61736820746865206465706f736974206f6620746865206269642c20676976696e67206974206261636b110120746f2074686520736f63696574792074726561737572792c206f722077652062616e2074686520766f75636865722066726f6d20766f756368696e6720616761696e2e005d0120496620746865206a756467656d656e7420697320605265626964602c20776520707574207468652063616e646964617465206261636b20696e207468652062696420706f6f6c20616e64206c6574207468656d20676f94207468726f7567682074686520696e64756374696f6e2070726f6365737320616761696e2e00410120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d20746865205f53757370656e73696f6e4a756467656d656e744f726967696e5f2e003020506172616d65746572733ac0202d206077686f60202d205468652073757370656e6465642063616e64696461746520746f206265206a75646765642ec4202d20606a756467656d656e7460202d2060417070726f7665602c206052656a656374602c206f7220605265626964602e002c2023203c7765696768743ef4204b65793a204220286c656e206f662062696473292c204d20286c656e206f66206d656d62657273292c2058202862616c616e636520616374696f6e29f0202d204f6e652073746f72616765207265616420746f20636865636b206077686f6020697320612073757370656e6465642063616e6469646174652ec8202d204f6e652073746f726167652072656d6f76616c206f66207468652073757370656e6465642063616e6469646174652e40202d20417070726f7665204c6f676963150120092d204f6e652073746f72616765207265616420746f206765742074686520617661696c61626c6520706f7420746f2070617920757365727320776974682e204f283129dc20092d204f6e652073746f7261676520777269746520746f207570646174652074686520617661696c61626c6520706f742e204f283129e820092d204f6e652073746f72616765207265616420746f20676574207468652063757272656e7420626c6f636b206e756d6265722e204f283129b420092d204f6e652073746f72616765207265616420746f2067657420616c6c206d656d626572732e204f284d29a020092d20557020746f206f6e6520756e726573657276652063757272656e637920616374696f6e2eb020092d20557020746f2074776f206e65772073746f726167652077726974657320746f207061796f7574732e4d0120092d20557020746f206f6e652073746f726167652077726974652077697468204f286c6f67204d292062696e6172792073656172636820746f206164642061206d656d62657220746f20736f63696574792e3c202d2052656a656374204c6f676963dc20092d20557020746f206f6e6520726570617472696174652072657365727665642063757272656e637920616374696f6e2e204f2858292d0120092d20557020746f206f6e652073746f7261676520777269746520746f2062616e2074686520766f756368696e67206d656d6265722066726f6d20766f756368696e6720616761696e2e38202d205265626964204c6f676963410120092d2053746f72616765206d75746174652077697468204f286c6f672042292062696e6172792073656172636820746f20706c616365207468652075736572206261636b20696e746f20626964732ed4202d20557020746f206f6e65206164646974696f6e616c206576656e7420696620756e766f7563682074616b657320706c6163652e5c202d204f6e652073746f726167652072656d6f76616c2e7c202d204f6e65206576656e7420666f7220746865206a756467656d656e742e009820546f74616c20436f6d706c65786974793a204f284d202b206c6f674d202b2042202b205829302023203c2f7765696768743e3c7365745f6d61785f6d656d62657273040c6d61780c753332381d0120416c6c6f777320726f6f74206f726967696e20746f206368616e676520746865206d6178696d756d206e756d626572206f66206d656d6265727320696e20736f63696574792eb4204d6178206d656d6265727368697020636f756e74206d7573742062652067726561746572207468616e20312e00dc20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652066726f6d205f524f4f545f2e003020506172616d65746572733ae4202d20606d617860202d20546865206d6178696d756d206e756d626572206f66206d656d6265727320666f722074686520736f63696574792e002c2023203c7765696768743eb0202d204f6e652073746f7261676520777269746520746f2075706461746520746865206d61782e204f28312934202d204f6e65206576656e742e005c20546f74616c20436f6d706c65786974793a204f283129302023203c2f7765696768743e013c1c466f756e64656404244163636f756e74496404b82054686520736f636965747920697320666f756e6465642062792074686520676976656e206964656e746974792e0c42696408244163636f756e7449641c42616c616e63650861012041206d656d6265727368697020626964206a7573742068617070656e65642e2054686520676976656e206163636f756e74206973207468652063616e646964617465277320494420616e64207468656972206f666665723c20697320746865207365636f6e642e14566f7563680c244163636f756e7449641c42616c616e6365244163636f756e7449640861012041206d656d6265727368697020626964206a7573742068617070656e656420627920766f756368696e672e2054686520676976656e206163636f756e74206973207468652063616e646964617465277320494420616e64f0207468656972206f6666657220697320746865207365636f6e642e2054686520766f756368696e67207061727479206973207468652074686972642e244175746f556e62696404244163636f756e74496404090120412063616e646964617465207761732064726f70706564202864756520746f20616e20657863657373206f66206269647320696e207468652073797374656d292e14556e62696404244163636f756e74496404b020412063616e646964617465207761732064726f70706564202862792074686569722072657175657374292e1c556e766f75636804244163636f756e74496404f820412063616e646964617465207761732064726f70706564202862792072657175657374206f662077686f20766f756368656420666f72207468656d292e20496e64756374656408244163636f756e744964385665633c4163636f756e7449643e08590120412067726f7570206f662063616e646964617465732068617665206265656e20696e6475637465642e205468652062617463682773207072696d617279206973207468652066697273742076616c75652c207468657420626174636820696e2066756c6c20697320746865207365636f6e642e6053757370656e6465644d656d6265724a756467656d656e7408244163636f756e74496410626f6f6c048c20412073757370656e646564206d656d62657220686173206265656e206a75646765644843616e64696461746553757370656e64656404244163636f756e744964047c20412063616e64696461746520686173206265656e2073757370656e6465643c4d656d62657253757370656e64656404244163636f756e74496404702041206d656d62657220686173206265656e2073757370656e646564284368616c6c656e67656404244163636f756e74496404742041206d656d62657220686173206265656e206368616c6c656e67656410566f74650c244163636f756e744964244163636f756e74496410626f6f6c04c0204120766f746520686173206265656e20706c61636564202863616e6469646174652c20766f7465722c20766f74652930446566656e646572566f746508244163636f756e74496410626f6f6c04f0204120766f746520686173206265656e20706c6163656420666f72206120646566656e64696e67206d656d6265722028766f7465722c20766f746529344e65774d61784d656d62657273040c75333204902041206e6577206d6178206d656d62657220636f756e7420686173206265656e2073657424556e666f756e64656404244163636f756e744964045820536f636965747920697320756e666f756e6465642e1c4043616e6469646174654465706f7369743c42616c616e63654f663c542c20493e400080c6a47e8d0300000000000000000004fc20546865206d696e696d756d20616d6f756e74206f662061206465706f73697420726571756972656420666f7220612062696420746f206265206d6164652e4857726f6e6753696465446564756374696f6e3c42616c616e63654f663c542c20493e400080f420e6b5000000000000000000000855012054686520616d6f756e74206f662074686520756e70616964207265776172642074686174206765747320646564756374656420696e207468652063617365207468617420656974686572206120736b6570746963c020646f65736e277420766f7465206f7220736f6d656f6e6520766f74657320696e207468652077726f6e67207761792e284d6178537472696b65730c753332100a00000008750120546865206e756d626572206f662074696d65732061206d656d626572206d617920766f7465207468652077726f6e672077617920286f72206e6f7420617420616c6c2c207768656e207468657920617265206120736b65707469632978206265666f72652074686579206265636f6d652073757370656e6465642e2c506572696f645370656e643c42616c616e63654f663c542c20493e400000c52ebca2b1000000000000000000042d012054686520616d6f756e74206f6620696e63656e7469766520706169642077697468696e206561636820706572696f642e20446f65736e277420696e636c75646520566f7465725469702e38526f746174696f6e506572696f6438543a3a426c6f636b4e756d626572100077010004110120546865206e756d626572206f6620626c6f636b73206265747765656e2063616e6469646174652f6d656d6265727368697020726f746174696f6e20706572696f64732e3c4368616c6c656e6765506572696f6438543a3a426c6f636b4e756d626572108013030004d020546865206e756d626572206f6620626c6f636b73206265747765656e206d656d62657273686970206368616c6c656e6765732e204d6f64756c654964204d6f64756c6549642070792f736f63696504682054686520736f636965746965732773206d6f64756c65206964482c426164506f736974696f6e049020416e20696e636f727265637420706f736974696f6e207761732070726f76696465642e244e6f744d656d62657204582055736572206973206e6f742061206d656d6265722e34416c72656164794d656d6265720468205573657220697320616c72656164792061206d656d6265722e2453757370656e646564044c20557365722069732073757370656e6465642e304e6f7453757370656e646564045c2055736572206973206e6f742073757370656e6465642e204e6f5061796f7574044c204e6f7468696e6720746f207061796f75742e38416c7265616479466f756e646564046420536f636965747920616c726561647920666f756e6465642e3c496e73756666696369656e74506f74049c204e6f7420656e6f75676820696e20706f7420746f206163636570742063616e6469646174652e3c416c7265616479566f756368696e6704e8204d656d62657220697320616c726561647920766f756368696e67206f722062616e6e65642066726f6d20766f756368696e6720616761696e2e2c4e6f74566f756368696e670460204d656d626572206973206e6f7420766f756368696e672e104865616404942043616e6e6f742072656d6f7665207468652068656164206f662074686520636861696e2e1c466f756e646572046c2043616e6e6f742072656d6f76652074686520666f756e6465722e28416c7265616479426964047420557365722068617320616c7265616479206d6164652061206269642e40416c726561647943616e6469646174650474205573657220697320616c726561647920612063616e6469646174652e304e6f7443616e64696461746504642055736572206973206e6f7420612063616e6469646174652e284d61784d656d62657273048420546f6f206d616e79206d656d6265727320696e2074686520736f63696574792e284e6f74466f756e646572047c205468652063616c6c6572206973206e6f742074686520666f756e6465722e1c4e6f74486561640470205468652063616c6c6572206973206e6f742074686520686561642e205265636f7665727901205265636f766572790c2c5265636f76657261626c6500010530543a3a4163636f756e744964e85265636f76657279436f6e6669673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e0004000409012054686520736574206f66207265636f76657261626c65206163636f756e747320616e64207468656972207265636f7665727920636f6e66696775726174696f6e2e404163746976655265636f76657269657300020530543a3a4163636f756e74496430543a3a4163636f756e744964e84163746976655265636f766572793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e050400106820416374697665207265636f7665727920617474656d7074732e001501204669727374206163636f756e7420697320746865206163636f756e7420746f206265207265636f76657265642c20616e6420746865207365636f6e64206163636f756e74ac20697320746865207573657220747279696e6720746f207265636f76657220746865206163636f756e742e1450726f787900010230543a3a4163636f756e74496430543a3a4163636f756e7449640004000c9020546865206c697374206f6620616c6c6f7765642070726f7879206163636f756e74732e00f8204d61702066726f6d2074686520757365722077686f2063616e2061636365737320697420746f20746865207265636f7665726564206163636f756e742e01243061735f7265636f7665726564081c6163636f756e7430543a3a4163636f756e7449641063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e34a42053656e6420612063616c6c207468726f7567682061207265636f7665726564206163636f756e742e00150120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207265676973746572656420746fe82062652061626c6520746f206d616b652063616c6c73206f6e20626568616c66206f6620746865207265636f7665726564206163636f756e742e003020506172616d65746572733a2501202d20606163636f756e74603a20546865207265636f7665726564206163636f756e7420796f752077616e7420746f206d616b6520612063616c6c206f6e2d626568616c662d6f662e0101202d206063616c6c603a205468652063616c6c20796f752077616e7420746f206d616b65207769746820746865207265636f7665726564206163636f756e742e002c2023203c7765696768743e94202d2054686520776569676874206f6620746865206063616c6c60202b2031302c3030302e0901202d204f6e652073746f72616765206c6f6f6b757020746f20636865636b206163636f756e74206973207265636f7665726564206279206077686f602e204f283129302023203c2f7765696768743e347365745f7265636f766572656408106c6f737430543a3a4163636f756e7449641c7265736375657230543a3a4163636f756e744964341d0120416c6c6f7720524f4f5420746f2062797061737320746865207265636f766572792070726f6365737320616e642073657420616e20612072657363756572206163636f756e747420666f722061206c6f7374206163636f756e74206469726563746c792e00c820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f524f4f545f2e003020506172616d65746572733ab8202d20606c6f7374603a2054686520226c6f7374206163636f756e742220746f206265207265636f76657265642e1d01202d206072657363756572603a20546865202272657363756572206163636f756e74222077686963682063616e2063616c6c20617320746865206c6f7374206163636f756e742e002c2023203c7765696768743e64202d204f6e652073746f72616765207772697465204f28312930202d204f6e65206576656e74302023203c2f7765696768743e3c6372656174655f7265636f766572790c1c667269656e6473445665633c543a3a4163636f756e7449643e247468726573686f6c640c7531363064656c61795f706572696f6438543a3a426c6f636b4e756d6265726c5d01204372656174652061207265636f7665727920636f6e66696775726174696f6e20666f7220796f7572206163636f756e742e2054686973206d616b657320796f7572206163636f756e74207265636f76657261626c652e003101205061796d656e743a2060436f6e6669674465706f7369744261736560202b2060467269656e644465706f736974466163746f7260202a20235f6f665f667269656e64732062616c616e636549012077696c6c20626520726573657276656420666f722073746f72696e6720746865207265636f7665727920636f6e66696775726174696f6e2e2054686973206465706f7369742069732072657475726e6564bc20696e2066756c6c207768656e2074686520757365722063616c6c73206072656d6f76655f7265636f76657279602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a2501202d2060667269656e6473603a2041206c697374206f6620667269656e647320796f7520747275737420746f20766f75636820666f72207265636f7665727920617474656d7074732ed420202053686f756c64206265206f72646572656420616e6420636f6e7461696e206e6f206475706c69636174652076616c7565732e3101202d20607468726573686f6c64603a20546865206e756d626572206f6620667269656e64732074686174206d75737420766f75636820666f722061207265636f7665727920617474656d70741d012020206265666f726520746865206163636f756e742063616e206265207265636f76657265642e2053686f756c64206265206c657373207468616e206f7220657175616c20746f94202020746865206c656e677468206f6620746865206c697374206f6620667269656e64732e3d01202d206064656c61795f706572696f64603a20546865206e756d626572206f6620626c6f636b732061667465722061207265636f7665727920617474656d707420697320696e697469616c697a6564e820202074686174206e6565647320746f2070617373206265666f726520746865206163636f756e742063616e206265207265636f76657265642e002c2023203c7765696768743e68202d204b65793a204620286c656e206f6620667269656e6473292d01202d204f6e652073746f72616765207265616420746f20636865636b2074686174206163636f756e74206973206e6f7420616c7265616479207265636f76657261626c652e204f2831292eec202d204120636865636b20746861742074686520667269656e6473206c69737420697320736f7274656420616e6420756e697175652e204f2846299c202d204f6e652063757272656e63792072657365727665206f7065726174696f6e2e204f2858299c202d204f6e652073746f726167652077726974652e204f2831292e20436f646563204f2846292e34202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205829302023203c2f7765696768743e44696e6974696174655f7265636f76657279041c6163636f756e7430543a3a4163636f756e74496458ec20496e697469617465207468652070726f6365737320666f72207265636f766572696e672061207265636f76657261626c65206163636f756e742e001d01205061796d656e743a20605265636f766572794465706f736974602062616c616e63652077696c6c20626520726573657276656420666f7220696e6974696174696e67207468652501207265636f766572792070726f636573732e2054686973206465706f7369742077696c6c20616c7761797320626520726570617472696174656420746f20746865206163636f756e74b820747279696e6720746f206265207265636f76657265642e205365652060636c6f73655f7265636f76657279602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1501202d20606163636f756e74603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f207265636f7665722e2054686973206163636f756e7401012020206e6565647320746f206265207265636f76657261626c652028692e652e20686176652061207265636f7665727920636f6e66696775726174696f6e292e002c2023203c7765696768743ef8202d204f6e652073746f72616765207265616420746f20636865636b2074686174206163636f756e74206973207265636f76657261626c652e204f2846295101202d204f6e652073746f72616765207265616420746f20636865636b20746861742074686973207265636f766572792070726f63657373206861736e277420616c726561647920737461727465642e204f2831299c202d204f6e652063757272656e63792072657365727665206f7065726174696f6e2e204f285829e4202d204f6e652073746f72616765207265616420746f20676574207468652063757272656e7420626c6f636b206e756d6265722e204f2831296c202d204f6e652073746f726167652077726974652e204f2831292e34202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205829302023203c2f7765696768743e38766f7563685f7265636f7665727908106c6f737430543a3a4163636f756e7449641c7265736375657230543a3a4163636f756e74496464290120416c6c6f7720612022667269656e6422206f662061207265636f76657261626c65206163636f756e7420746f20766f75636820666f7220616e20616374697665207265636f76657279682070726f6365737320666f722074686174206163636f756e742e00290120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d75737420626520612022667269656e64227420666f7220746865207265636f76657261626c65206163636f756e742e003020506172616d65746572733ad4202d20606c6f7374603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f207265636f7665722e1101202d206072657363756572603a20546865206163636f756e7420747279696e6720746f2072657363756520746865206c6f7374206163636f756e74207468617420796f755420202077616e7420746f20766f75636820666f722e0025012054686520636f6d62696e6174696f6e206f662074686573652074776f20706172616d6574657273206d75737420706f696e7420746f20616e20616374697665207265636f76657279242070726f636573732e002c2023203c7765696768743efc204b65793a204620286c656e206f6620667269656e647320696e20636f6e666967292c205620286c656e206f6620766f756368696e6720667269656e6473291d01202d204f6e652073746f72616765207265616420746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f2846292101202d204f6e652073746f72616765207265616420746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629ec202d204f6e652062696e6172792073656172636820746f20636f6e6669726d2063616c6c6572206973206120667269656e642e204f286c6f6746291d01202d204f6e652062696e6172792073656172636820746f20636f6e6669726d2063616c6c657220686173206e6f7420616c726561647920766f75636865642e204f286c6f6756299c202d204f6e652073746f726167652077726974652e204f2831292c20436f646563204f2856292e34202d204f6e65206576656e742e00a420546f74616c20436f6d706c65786974793a204f2846202b206c6f6746202b2056202b206c6f675629302023203c2f7765696768743e38636c61696d5f7265636f76657279041c6163636f756e7430543a3a4163636f756e74496450f420416c6c6f772061207375636365737366756c207265736375657220746f20636c61696d207468656972207265636f7665726564206163636f756e742e002d0120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061202272657363756572221d012077686f20686173207375636365737366756c6c7920636f6d706c6574656420746865206163636f756e74207265636f766572792070726f636573733a20636f6c6c6563746564310120607468726573686f6c6460206f72206d6f726520766f75636865732c20776169746564206064656c61795f706572696f646020626c6f636b732073696e636520696e6974696174696f6e2e003020506172616d65746572733a2d01202d20606163636f756e74603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f20636c61696d20686173206265656e207375636365737366756c6c79502020207265636f766572656420627920796f752e002c2023203c7765696768743efc204b65793a204620286c656e206f6620667269656e647320696e20636f6e666967292c205620286c656e206f6620766f756368696e6720667269656e6473291d01202d204f6e652073746f72616765207265616420746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f2846292101202d204f6e652073746f72616765207265616420746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629e4202d204f6e652073746f72616765207265616420746f20676574207468652063757272656e7420626c6f636b206e756d6265722e204f2831299c202d204f6e652073746f726167652077726974652e204f2831292c20436f646563204f2856292e34202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205629302023203c2f7765696768743e38636c6f73655f7265636f76657279041c7265736375657230543a3a4163636f756e7449645015012041732074686520636f6e74726f6c6c6572206f662061207265636f76657261626c65206163636f756e742c20636c6f736520616e20616374697665207265636f76657279682070726f6365737320666f7220796f7572206163636f756e742e002101205061796d656e743a2042792063616c6c696e6720746869732066756e6374696f6e2c20746865207265636f76657261626c65206163636f756e742077696c6c2072656365697665f820746865207265636f76657279206465706f73697420605265636f766572794465706f7369746020706c616365642062792074686520726573637565722e00050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061f0207265636f76657261626c65206163636f756e74207769746820616e20616374697665207265636f766572792070726f6365737320666f722069742e003020506172616d65746572733a1101202d206072657363756572603a20546865206163636f756e7420747279696e6720746f207265736375652074686973207265636f76657261626c65206163636f756e742e002c2023203c7765696768743e84204b65793a205620286c656e206f6620766f756368696e6720667269656e6473293d01202d204f6e652073746f7261676520726561642f72656d6f766520746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629c0202d204f6e652062616c616e63652063616c6c20746f20726570617472696174652072657365727665642e204f28582934202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2856202b205829302023203c2f7765696768743e3c72656d6f76655f7265636f7665727900545d012052656d6f766520746865207265636f766572792070726f6365737320666f7220796f7572206163636f756e742e205265636f7665726564206163636f756e747320617265207374696c6c2061636365737369626c652e001501204e4f54453a205468652075736572206d757374206d616b65207375726520746f2063616c6c2060636c6f73655f7265636f7665727960206f6e20616c6c206163746976650901207265636f7665727920617474656d707473206265666f72652063616c6c696e6720746869732066756e6374696f6e20656c73652069742077696c6c206661696c2e002501205061796d656e743a2042792063616c6c696e6720746869732066756e6374696f6e20746865207265636f76657261626c65206163636f756e742077696c6c20756e7265736572766598207468656972207265636f7665727920636f6e66696775726174696f6e206465706f7369742ef4202860436f6e6669674465706f7369744261736560202b2060467269656e644465706f736974466163746f7260202a20235f6f665f667269656e64732900050120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061e4207265636f76657261626c65206163636f756e742028692e652e206861732061207265636f7665727920636f6e66696775726174696f6e292e002c2023203c7765696768743e60204b65793a204620286c656e206f6620667269656e6473292901202d204f6e652073746f72616765207265616420746f206765742074686520707265666978206974657261746f7220666f7220616374697665207265636f7665726965732e204f2831293901202d204f6e652073746f7261676520726561642f72656d6f766520746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f2846299c202d204f6e652062616c616e63652063616c6c20746f20756e72657365727665642e204f28582934202d204f6e65206576656e742e006c20546f74616c20436f6d706c65786974793a204f2846202b205829302023203c2f7765696768743e4063616e63656c5f7265636f7665726564041c6163636f756e7430543a3a4163636f756e7449642ce02043616e63656c20746865206162696c69747920746f20757365206061735f7265636f76657265646020666f7220606163636f756e74602e00150120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207265676973746572656420746fe82062652061626c6520746f206d616b652063616c6c73206f6e20626568616c66206f6620746865207265636f7665726564206163636f756e742e003020506172616d65746572733a1901202d20606163636f756e74603a20546865207265636f7665726564206163636f756e7420796f75206172652061626c6520746f2063616c6c206f6e2d626568616c662d6f662e002c2023203c7765696768743e1101202d204f6e652073746f72616765206d75746174696f6e20746f20636865636b206163636f756e74206973207265636f7665726564206279206077686f602e204f283129302023203c2f7765696768743e01183c5265636f766572794372656174656404244163636f756e74496404c82041207265636f766572792070726f6365737320686173206265656e2073657420757020666f7220616e206163636f756e74445265636f76657279496e6974696174656408244163636f756e744964244163636f756e7449640405012041207265636f766572792070726f6365737320686173206265656e20696e6974696174656420666f72206163636f756e745f31206279206163636f756e745f323c5265636f76657279566f75636865640c244163636f756e744964244163636f756e744964244163636f756e7449640441012041207265636f766572792070726f6365737320666f72206163636f756e745f31206279206163636f756e745f3220686173206265656e20766f756368656420666f72206279206163636f756e745f33385265636f76657279436c6f73656408244163636f756e744964244163636f756e74496404f82041207265636f766572792070726f6365737320666f72206163636f756e745f31206279206163636f756e745f3220686173206265656e20636c6f736564404163636f756e745265636f766572656408244163636f756e744964244163636f756e74496404dc204163636f756e745f3120686173206265656e207375636365737366756c6c79207265636f7665726564206279206163636f756e745f323c5265636f7665727952656d6f76656404244163636f756e74496404cc2041207265636f766572792070726f6365737320686173206265656e2072656d6f76656420666f7220616e206163636f756e741044436f6e6669674465706f736974426173653042616c616e63654f663c543e4000406352bfc60100000000000000000004550120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e672061207265636f7665727920636f6e66696775726174696f6e2e4c467269656e644465706f736974466163746f723042616c616e63654f663c543e4000203d88792d000000000000000000000469012054686520616d6f756e74206f662063757272656e6379206e656564656420706572206164646974696f6e616c2075736572207768656e206372656174696e672061207265636f7665727920636f6e66696775726174696f6e2e284d6178467269656e64730c753136080900040d0120546865206d6178696d756d20616d6f756e74206f6620667269656e647320616c6c6f77656420696e2061207265636f7665727920636f6e66696775726174696f6e2e3c5265636f766572794465706f7369743042616c616e63654f663c543e4000406352bfc601000000000000000000041d0120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72207374617274696e672061207265636f766572792e40284e6f74416c6c6f77656404f42055736572206973206e6f7420616c6c6f77656420746f206d616b6520612063616c6c206f6e20626568616c66206f662074686973206163636f756e74345a65726f5468726573686f6c640490205468726573686f6c64206d7573742062652067726561746572207468616e207a65726f404e6f74456e6f756768467269656e647304d420467269656e6473206c697374206d7573742062652067726561746572207468616e207a65726f20616e64207468726573686f6c64284d6178467269656e647304ac20467269656e6473206c697374206d757374206265206c657373207468616e206d617820667269656e6473244e6f74536f7274656404cc20467269656e6473206c697374206d75737420626520736f7274656420616e642066726565206f66206475706c696361746573384e6f745265636f76657261626c6504a02054686973206163636f756e74206973206e6f742073657420757020666f72207265636f7665727948416c72656164795265636f76657261626c6504b02054686973206163636f756e7420697320616c72656164792073657420757020666f72207265636f7665727938416c72656164795374617274656404e02041207265636f766572792070726f636573732068617320616c7265616479207374617274656420666f722074686973206163636f756e74284e6f745374617274656404d02041207265636f766572792070726f6365737320686173206e6f74207374617274656420666f7220746869732072657363756572244e6f74467269656e6404ac2054686973206163636f756e74206973206e6f74206120667269656e642077686f2063616e20766f7563682c44656c6179506572696f64041d012054686520667269656e64206d757374207761697420756e74696c207468652064656c617920706572696f6420746f20766f75636820666f722074686973207265636f7665727938416c7265616479566f756368656404c0205468697320757365722068617320616c726561647920766f756368656420666f722074686973207265636f76657279245468726573686f6c6404ec20546865207468726573686f6c6420666f72207265636f766572696e672074686973206163636f756e7420686173206e6f74206265656e206d65742c5374696c6c41637469766504010120546865726520617265207374696c6c20616374697665207265636f7665727920617474656d7074732074686174206e65656420746f20626520636c6f736564204f766572666c6f77049c2054686572652077617320616e206f766572666c6f7720696e20612063616c63756c6174696f6e30416c726561647950726f787904b02054686973206163636f756e7420697320616c72656164792073657420757020666f72207265636f766572791c56657374696e67011c56657374696e67041c56657374696e6700010230543a3a4163636f756e744964a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e00040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e011010766573740044bc20556e6c6f636b20616e79207665737465642066756e6473206f66207468652073656e646572206163636f756e742e00610120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652066756e6473207374696c6c68206c6f636b656420756e6465722074686973206d6f64756c652e00d420456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20322052656164732c203220577269746573fc20202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745d010120202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745d34202d2042656e63686d61726b3aec20202020202d20556e6c6f636b65643a2034382e3736202b202e303438202a206c20c2b57320286d696e2073717561726520616e616c7973697329e420202020202d204c6f636b65643a2034342e3433202b202e323834202a206c20c2b57320286d696e2073717561726520616e616c7973697329ad01202d205573696e6720353020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e28766573745f6f7468657204187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654cbc20556e6c6f636b20616e79207665737465642066756e6473206f662061206074617267657460206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005501202d2060746172676574603a20546865206163636f756e742077686f7365207665737465642066756e64732073686f756c6420626520756e6c6f636b65642e204d75737420686176652066756e6473207374696c6c68206c6f636b656420756e6465722074686973206d6f64756c652e00d420456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20332052656164732c203320577269746573f420202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e74f820202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e7434202d2042656e63686d61726b3ae820202020202d20556e6c6f636b65643a2034342e33202b202e323934202a206c20c2b57320286d696e2073717561726520616e616c7973697329e420202020202d204c6f636b65643a2034382e3136202b202e313033202a206c20c2b57320286d696e2073717561726520616e616c7973697329ad01202d205573696e6720353020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e3c7665737465645f7472616e7366657208187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365207363686564756c65a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e486820437265617465206120766573746564207472616e736665722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e001501202d2060746172676574603a20546865206163636f756e7420746861742073686f756c64206265207472616e7366657272656420746865207665737465642066756e64732e0101202d2060616d6f756e74603a2054686520616d6f756e74206f662066756e647320746f207472616e7366657220616e642077696c6c206265207665737465642ef4202d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e006020456d697473206056657374696e6743726561746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20332052656164732c2033205772697465733d0120202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745d410120202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745de0202d2042656e63686d61726b3a203130302e33202b202e333635202a206c20c2b57320286d696e2073717561726520616e616c7973697329b101202d205573696e672031303020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e54666f7263655f7665737465645f7472616e736665720c18736f757263658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365187461726765748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365207363686564756c65a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e4c6420466f726365206120766573746564207472616e736665722e00c820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e00ec202d2060736f75726365603a20546865206163636f756e742077686f73652066756e64732073686f756c64206265207472616e736665727265642e1501202d2060746172676574603a20546865206163636f756e7420746861742073686f756c64206265207472616e7366657272656420746865207665737465642066756e64732e0101202d2060616d6f756e74603a2054686520616d6f756e74206f662066756e647320746f207472616e7366657220616e642077696c6c206265207665737465642ef4202d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e006020456d697473206056657374696e6743726561746564602e002c2023203c7765696768743e28202d20604f283129602e78202d2044625765696768743a20342052656164732c203420577269746573350120202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e74390120202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e74e0202d2042656e63686d61726b3a203130302e33202b202e333635202a206c20c2b57320286d696e2073717561726520616e616c7973697329b101202d205573696e672031303020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e302023203c2f7765696768743e01083856657374696e675570646174656408244163636f756e7449641c42616c616e63650859012054686520616d6f756e742076657374656420686173206265656e20757064617465642e205468697320636f756c6420696e646963617465206d6f72652066756e64732061726520617661696c61626c652e2054686519012062616c616e636520676976656e2069732074686520616d6f756e74207768696368206973206c65667420756e7665737465642028616e642074687573206c6f636b6564292e4056657374696e67436f6d706c6574656404244163636f756e744964042d0120416e206163636f756e742028676976656e2920686173206265636f6d652066756c6c79207665737465642e204e6f20667572746865722076657374696e672063616e2068617070656e2e04444d696e5665737465645472616e736665723042616c616e63654f663c543e400000c16ff28623000000000000000000041d0120546865206d696e696d756d20616d6f756e7420746f206265207472616e7366657272656420746f206372656174652061206e65772076657374696e67207363686564756c652e0c284e6f7456657374696e67048820546865206163636f756e7420676976656e206973206e6f742076657374696e672e5c4578697374696e6756657374696e675363686564756c65045d0120416e206578697374696e672076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e7420746861742063616e6e6f7420626520636c6f6262657265642e24416d6f756e744c6f7704090120416d6f756e74206265696e67207472616e7366657272656420697320746f6f206c6f7720746f2063726561746520612076657374696e67207363686564756c652e245363686564756c657201245363686564756c657208184167656e646101010538543a3a426c6f636b4e756d626572e85665633c4f7074696f6e3c5363686564756c65643c3c542061732054726169743e3a3a43616c6c2c20543a3a426c6f636b4e756d6265723e3e3e000400044d01204974656d7320746f2062652065786563757465642c20696e64657865642062792074686520626c6f636b206e756d626572207468617420746865792073686f756c64206265206578656375746564206f6e2e184c6f6f6b75700001051c5665633c75383e6c5461736b416464726573733c543a3a426c6f636b4e756d6265723e000400040101204c6f6f6b75702066726f6d206964656e7469747920746f2074686520626c6f636b206e756d62657220616e6420696e646578206f6620746865207461736b2e0110207363686564756c6510107768656e38543a3a426c6f636b4e756d626572386d617962655f706572696f646963a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e207072696f72697479487363686564756c653a3a5072696f726974791063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e287420416e6f6e796d6f75736c79207363686564756c652061207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c7390202d2042617365205765696768743a2032322e3239202b202e313236202a205320c2b57334202d204442205765696768743a4c20202020202d20526561643a204167656e64615020202020202d2057726974653a204167656e64613d01202d2057696c6c20757365206261736520776569676874206f662032352077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c73302023203c2f7765696768743e1863616e63656c08107768656e38543a3a426c6f636b4e756d62657214696e6465780c75333228982043616e63656c20616e20616e6f6e796d6f75736c79207363686564756c6564207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c7394202d2042617365205765696768743a2032322e3135202b20322e383639202a205320c2b57334202d204442205765696768743a4c20202020202d20526561643a204167656e64617020202020202d2057726974653a204167656e64612c204c6f6f6b75704101202d2057696c6c20757365206261736520776569676874206f66203130302077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c73302023203c2f7765696768743e387363686564756c655f6e616d6564140869641c5665633c75383e107768656e38543a3a426c6f636b4e756d626572386d617962655f706572696f646963a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e207072696f72697479487363686564756c653a3a5072696f726974791063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e285c205363686564756c652061206e616d6564207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c738c202d2042617365205765696768743a2032392e36202b202e313539202a205320c2b57334202d204442205765696768743a6c20202020202d20526561643a204167656e64612c204c6f6f6b75707020202020202d2057726974653a204167656e64612c204c6f6f6b75704d01202d2057696c6c20757365206261736520776569676874206f662033352077686963682073686f756c6420626520676f6f6420666f72206d6f7265207468616e203330207363686564756c65642063616c6c73302023203c2f7765696768743e3063616e63656c5f6e616d6564040869641c5665633c75383e287c2043616e63656c2061206e616d6564207363686564756c6564207461736b2e002c2023203c7765696768743ea0202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c7394202d2042617365205765696768743a2032342e3931202b20322e393037202a205320c2b57334202d204442205765696768743a6c20202020202d20526561643a204167656e64612c204c6f6f6b75707020202020202d2057726974653a204167656e64612c204c6f6f6b75704101202d2057696c6c20757365206261736520776569676874206f66203130302077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c73302023203c2f7765696768743e010c245363686564756c6564082c426c6f636b4e756d6265720c753332002043616e63656c6564082c426c6f636b4e756d6265720c7533320028446973706174636865640c605461736b416464726573733c426c6f636b4e756d6265723e3c4f7074696f6e3c5665633c75383e3e384469737061746368526573756c740000001450726f7879011450726f7879041c50726f7869657301010530543a3a4163636f756e744964c4285665633c28543a3a4163636f756e7449642c20543a3a50726f787954797065293e2c2042616c616e63654f663c543e29004400000000000000000000000000000000000845012054686520736574206f66206163636f756e742070726f786965732e204d61707320746865206163636f756e74207768696368206861732064656c65676174656420746f20746865206163636f756e7473210120776869636820617265206265696e672064656c65676174656420746f2c20746f67657468657220776974682074686520616d6f756e742068656c64206f6e206465706f7369742e01181470726f78790c107265616c30543a3a4163636f756e74496440666f7263655f70726f78795f74797065504f7074696f6e3c543a3a50726f7879547970653e1063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e4051012044697370617463682074686520676976656e206063616c6c602066726f6d20616e206163636f756e742074686174207468652073656e64657220697320617574686f726973656420666f72207468726f7567683420606164645f70726f7879602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1101202d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e6501202d2060666f7263655f70726f78795f74797065603a2053706563696679207468652065786163742070726f7879207479706520746f206265207573656420616e6420636865636b656420666f7220746869732063616c6c2ed4202d206063616c6c603a205468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002c2023203c7765696768743ea0205020697320746865206e756d626572206f662070726f786965732074686520757365722068617390202d2042617365207765696768743a2031392e3837202b202e313431202a205020c2b57374202d204442207765696768743a20312073746f7261676520726561642e80202d20506c75732074686520776569676874206f6620746865206063616c6c60302023203c2f7765696768743e246164645f70726f7879081470726f787930543a3a4163636f756e7449642870726f78795f7479706530543a3a50726f78795479706534490120526567697374657220612070726f7879206163636f756e7420666f72207468652073656e64657220746861742069732061626c6520746f206d616b652063616c6c73206f6e2069747320626568616c662e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a1501202d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f206d616b6520612070726f78792e0101202d206070726f78795f74797065603a20546865207065726d697373696f6e7320616c6c6f77656420666f7220746869732070726f7879206163636f756e742e002c2023203c7765696768743ea0205020697320746865206e756d626572206f662070726f786965732074686520757365722068617390202d2042617365207765696768743a2031372e3438202b202e313736202a205020c2b5739c202d204442207765696768743a20312073746f72616765207265616420616e642077726974652e302023203c2f7765696768743e3072656d6f76655f70726f7879081470726f787930543a3a4163636f756e7449642870726f78795f7479706530543a3a50726f78795479706534ac20556e726567697374657220612070726f7879206163636f756e7420666f72207468652073656e6465722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003020506172616d65746572733a2901202d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f2072656d6f766520617320612070726f78792e4501202d206070726f78795f74797065603a20546865207065726d697373696f6e732063757272656e746c7920656e61626c656420666f72207468652072656d6f7665642070726f7879206163636f756e742e002c2023203c7765696768743ea0205020697320746865206e756d626572206f662070726f786965732074686520757365722068617390202d2042617365207765696768743a2031342e3337202b202e313634202a205020c2b5739c202d204442207765696768743a20312073746f72616765207265616420616e642077726974652e302023203c2f7765696768743e3872656d6f76655f70726f786965730030b820556e726567697374657220616c6c2070726f7879206163636f756e747320666f72207468652073656e6465722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901205741524e494e473a2054686973206d61792062652063616c6c6564206f6e206163636f756e747320637265617465642062792060616e6f6e796d6f7573602c20686f776576657220696620646f6e652c207468656e5d012074686520756e726573657276656420666565732077696c6c20626520696e61636365737369626c652e202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a002c2023203c7765696768743ea0205020697320746865206e756d626572206f662070726f786965732074686520757365722068617390202d2042617365207765696768743a2031332e3733202b202e313239202a205020c2b5739c202d204442207765696768743a20312073746f72616765207265616420616e642077726974652e302023203c2f7765696768743e24616e6f6e796d6f7573082870726f78795f7479706530543a3a50726f78795479706514696e6465780c753136583d0120537061776e2061206672657368206e6577206163636f756e7420746861742069732067756172616e7465656420746f206265206f746865727769736520696e61636365737369626c652c20616e64010120696e697469616c697a65206974207769746820612070726f7879206f66206070726f78795f747970656020666f7220606f726967696e602073656e6465722e0070205265717569726573206120605369676e656460206f726967696e2e005501202d206070726f78795f74797065603a205468652074797065206f66207468652070726f78792074686174207468652073656e6465722077696c6c2062652072656769737465726564206173206f766572207468655101206e6577206163636f756e742e20546869732077696c6c20616c6d6f737420616c7761797320626520746865206d6f7374207065726d697373697665206050726f7879547970656020706f737369626c6520746f7c20616c6c6f7720666f72206d6178696d756d20666c65786962696c6974792e5501202d2060696e646578603a204120646973616d626967756174696f6e20696e6465782c20696e206361736520746869732069732063616c6c6564206d756c7469706c652074696d657320696e207468652073616d656101207472616e73616374696f6e2028652e672e207769746820607574696c6974793a3a626174636860292e20556e6c65737320796f75277265207573696e67206062617463686020796f752070726f6261626c79206a757374442077616e7420746f20757365206030602e005501204661696c73207769746820604475706c69636174656020696620746869732068617320616c7265616479206265656e2063616c6c656420696e2074686973207472616e73616374696f6e2c2066726f6d207468659c2073616d652073656e6465722c2077697468207468652073616d6520706172616d65746572732e00e8204661696c732069662074686572652061726520696e73756666696369656e742066756e647320746f2070617920666f72206465706f7369742e002c2023203c7765696768743ea0205020697320746865206e756d626572206f662070726f786965732074686520757365722068617390202d2042617365207765696768743a2033362e3438202b202e303339202a205020c2b5739c202d204442207765696768743a20312073746f72616765207265616420616e642077726974652e302023203c2f7765696768743e386b696c6c5f616e6f6e796d6f7573141c737061776e657230543a3a4163636f756e7449642870726f78795f7479706530543a3a50726f78795479706514696e6465780c753136186865696768745c436f6d706163743c543a3a426c6f636b4e756d6265723e246578745f696e64657830436f6d706163743c7533323e58b82052656d6f76657320612070726576696f75736c7920737061776e656420616e6f6e796d6f75732070726f78792e004d01205741524e494e473a202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a20416e792066756e64732068656c6420696e2069742077696c6c2062653820696e61636365737369626c652e005d01205265717569726573206120605369676e656460206f726967696e2c20616e64207468652073656e646572206163636f756e74206d7573742068617665206265656e206372656174656420627920612063616c6c20746fac2060616e6f6e796d6f757360207769746820636f72726573706f6e64696e6720706172616d65746572732e005101202d2060737061776e6572603a20546865206163636f756e742074686174206f726967696e616c6c792063616c6c65642060616e6f6e796d6f75736020746f206372656174652074686973206163636f756e742e5101202d2060696e646578603a2054686520646973616d626967756174696f6e20696e646578206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e2050726f6261626c79206030602e0501202d206070726f78795f74797065603a205468652070726f78792074797065206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e4101202d2060686569676874603a2054686520686569676874206f662074686520636861696e207768656e207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e4d01202d20606578745f696e646578603a205468652065787472696e73696320696e64657820696e207768696368207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e004d01204661696c73207769746820604e6f5065726d697373696f6e6020696e2063617365207468652063616c6c6572206973206e6f7420612070726576696f75736c79206372656174656420616e6f6e796d6f7573f4206163636f756e742077686f73652060616e6f6e796d6f7573602063616c6c2068617320636f72726573706f6e64696e6720706172616d65746572732e002c2023203c7765696768743ea0205020697320746865206e756d626572206f662070726f786965732074686520757365722068617390202d2042617365207765696768743a2031352e3635202b202e313337202a205020c2b5739c202d204442207765696768743a20312073746f72616765207265616420616e642077726974652e302023203c2f7765696768743e01083450726f7879457865637574656404384469737061746368526573756c7404dc20412070726f78792077617320657865637574656420636f72726563746c792c20776974682074686520676976656e20726573756c742e40416e6f6e796d6f75734372656174656410244163636f756e744964244163636f756e7449642450726f7879547970650c75313608590120416e6f6e796d6f7573206163636f756e742028666972737420706172616d657465722920686173206265656e2063726561746564206279206e65772070726f787920287365636f6e6429207769746820676976656e9420646973616d626967756174696f6e20696e64657820616e642070726f787920747970652e0c4050726f78794465706f736974426173653042616c616e63654f663c543e4000f09e544c390000000000000000000004110120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e6720612070726f78792e4850726f78794465706f736974466163746f723042616c616e63654f663c543e400060aa7714b40000000000000000000004bc2054686520616d6f756e74206f662063757272656e6379206e6565646564207065722070726f78792061646465642e284d617850726f786965730c75313608200004f020546865206d6178696d756d20616d6f756e74206f662070726f7869657320616c6c6f77656420666f7220612073696e676c65206163636f756e742e181c546f6f4d616e79049c2054686572652061726520746f6f206d616e792070726f7869657320726567697374657265642e204e6f74466f756e6404782050726f787920726567697374726174696f6e206e6f7420666f756e642e204e6f7450726f787904d02053656e646572206973206e6f7420612070726f7879206f6620746865206163636f756e7420746f2062652070726f786965642e2c556e70726f787961626c6504250120412063616c6c20776869636820697320696e636f6d70617469626c652077697468207468652070726f7879207479706527732066696c7465722077617320617474656d707465642e244475706c69636174650470204163636f756e7420697320616c726561647920612070726f78792e304e6f5065726d697373696f6e0419012043616c6c206d6179206e6f74206265206d6164652062792070726f78792062656361757365206974206d617920657363616c617465206974732070726976696c656765732e204d756c746973696701204d756c746973696708244d756c74697369677300020530543a3a4163636f756e744964205b75383b2033325dd04d756c74697369673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e02040004942054686520736574206f66206f70656e206d756c7469736967206f7065726174696f6e732e1443616c6c73000106205b75383b2033325d94285665633c75383e2c20543a3a4163636f756e7449642c2042616c616e63654f663c543e290004000001105061735f6d756c74695f7468726573686f6c645f3108446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e1063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e44550120496d6d6564696174656c792064697370617463682061206d756c74692d7369676e61747572652063616c6c207573696e6720612073696e676c6520617070726f76616c2066726f6d207468652063616c6c65722e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e004101202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f206172652070617274206f66207468650501206d756c74692d7369676e61747572652c2062757420646f206e6f7420706172746963697061746520696e2074686520617070726f76616c2070726f636573732e8c202d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e00bc20526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c742e002c2023203c7765696768743e1d01204f285a202b204329207768657265205a20697320746865206c656e677468206f66207468652063616c6c20616e6420432069747320657865637574696f6e207765696768742e80202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d94202d2042617365205765696768743a2033332e3732202b20302e303032202a205a20c2b57348202d204442205765696768743a204e6f6e654c202d20506c75732043616c6c20576569676874302023203c2f7765696768743e2061735f6d756c746918247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e1063616c6c1c5665633c75383e2873746f72655f63616c6c10626f6f6c286d61785f77656967687418576569676874cc590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e00b42049662074686572652061726520656e6f7567682c207468656e206469737061746368207468652063616c6c2e003101205061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573410120607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2e8c202d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e002101204e4f54453a20556e6c6573732074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2067656e6572616c6c792077616e7420746f207573651d012060617070726f76655f61735f6d756c74696020696e73746561642c2073696e6365206974206f6e6c7920726571756972657320612068617368206f66207468652063616c6c2e005d0120526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c7420696620607468726573686f6c64602069732065786163746c79206031602e204f74686572776973655901206f6e20737563636573732c20726573756c7420697320604f6b6020616e642074686520726573756c742066726f6d2074686520696e746572696f722063616c6c2c206966206974207761732065786563757465642ce0206d617920626520666f756e6420696e20746865206465706f736974656420604d756c7469736967457865637574656460206576656e742e002c2023203c7765696768743e54202d20604f2853202b205a202b2043616c6c29602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2e2501202d204f6e652063616c6c20656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285a296020776865726520605a602069732074782d6c656e2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e70202d2054686520776569676874206f6620746865206063616c6c602e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66b4202020604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e80202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743ae020202020202d204372656174653a2020202020202020202034312e3839202b20302e313138202a2053202b202e303032202a205a20c2b573e020202020202d2043726561746520772f2053746f72653a2035332e3537202b20302e313139202a2053202b202e303033202a205a20c2b573e020202020202d20417070726f76653a20202020202020202033312e3339202b20302e313336202a2053202b202e303032202a205a20c2b573e020202020202d20436f6d706c6574653a202020202020202033392e3934202b20302e323620202a2053202b202e303032202a205a20c2b57334202d204442205765696768743a250120202020202d2052656164733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c6029290120202020202d205772697465733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c60294c202d20506c75732043616c6c20576569676874302023203c2f7765696768743e40617070726f76655f61735f6d756c746914247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e3c6d617962655f74696d65706f696e74844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e2463616c6c5f68617368205b75383b2033325d286d61785f776569676874185765696768749c590120526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966fc20617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e003101205061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c7573410120607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f72382069732063616e63656c6c65642e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e5d01202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e2049662069742069735501206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d8207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e003901204e4f54453a2049662074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2077616e7420746f20757365206061735f6d756c74696020696e73746561642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed8202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292efc202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e34202d204f6e65206576656e742e3101202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061902020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66b4202020604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e8c202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743a8020202020202d204372656174653a2034342e3731202b20302e303838202a20538420202020202d20417070726f76653a2033312e3438202b20302e313136202a205334202d204442205765696768743abc20202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745dc020202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d302023203c2f7765696768743e3c63616e63656c5f61735f6d756c746910247468726573686f6c640c753136446f746865725f7369676e61746f72696573445665633c543a3a4163636f756e7449643e2474696d65706f696e746454696d65706f696e743c543a3a426c6f636b4e756d6265723e2463616c6c5f68617368205b75383b2033325d6c59012043616e63656c2061207072652d6578697374696e672c206f6e2d676f696e67206d756c7469736967207472616e73616374696f6e2e20416e79206465706f7369742072657365727665642070726576696f75736c79c820666f722074686973206f7065726174696f6e2077696c6c20626520756e7265736572766564206f6e20737563636573732e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e005901202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e4501202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f76652074686973702064697370617463682e204d6179206e6f7420626520656d7074792e6101202d206074696d65706f696e74603a205468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c7c207472616e73616374696f6e20666f7220746869732064697370617463682ed0202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e002c2023203c7765696768743e28202d20604f285329602ed0202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e4101202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f6649012020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ec0202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602e34202d204f6e65206576656e742e88202d20492f4f3a2031207265616420604f285329602c206f6e652072656d6f76652e74202d2053746f726167653a2072656d6f766573206f6e65206974656d2e8c202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d84202d2042617365205765696768743a2033362e3037202b20302e313234202a205334202d204442205765696768743a190120202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c731d0120202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c73302023203c2f7765696768743e01102c4e65774d756c74697369670c244163636f756e744964244163636f756e7449642043616c6c486173680849012041206e6577206d756c7469736967206f7065726174696f6e2068617320626567756e2e20466972737420706172616d20697320746865206163636f756e74207468617420697320617070726f76696e672cec207365636f6e6420697320746865206d756c7469736967206163636f756e742c2074686972642069732068617368206f66207468652063616c6c2e404d756c7469736967417070726f76616c10244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449642043616c6c486173680859012041206d756c7469736967206f7065726174696f6e20686173206265656e20617070726f76656420627920736f6d656f6e652e20466972737420706172616d20697320746865206163636f756e742074686174206973190120617070726f76696e672c20746869726420697320746865206d756c7469736967206163636f756e742c20666f757274682069732068617368206f66207468652063616c6c2e404d756c7469736967457865637574656414244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449642043616c6c48617368384469737061746368526573756c74082d012041206d756c7469736967206f7065726174696f6e20686173206265656e2065786563757465642e20466972737420706172616d20697320746865206163636f756e742074686174206973550120617070726f76696e672c20746869726420697320746865206d756c7469736967206163636f756e742c20666f757274682069732068617368206f66207468652063616c6c20746f2062652065786563757465642e444d756c746973696743616e63656c6c656410244163636f756e7449645854696d65706f696e743c426c6f636b4e756d6265723e244163636f756e7449642043616c6c486173680831012041206d756c7469736967206f7065726174696f6e20686173206265656e2063616e63656c6c65642e20466972737420706172616d20697320746865206163636f756e7420746861742069731d012063616e63656c6c696e672c20746869726420697320746865206d756c7469736967206163636f756e742c20666f757274682069732068617368206f66207468652063616c6c2e0038404d696e696d756d5468726573686f6c640480205468726573686f6c64206d7573742062652032206f7220677265617465722e3c416c7265616479417070726f76656404b02043616c6c20697320616c726561647920617070726f7665642062792074686973207369676e61746f72792e444e6f417070726f76616c734e656564656404a02043616c6c20646f65736e2774206e65656420616e7920286d6f72652920617070726f76616c732e44546f6f4665775369676e61746f7269657304ac2054686572652061726520746f6f20666577207369676e61746f7269657320696e20746865206c6973742e48546f6f4d616e795369676e61746f7269657304b02054686572652061726520746f6f206d616e79207369676e61746f7269657320696e20746865206c6973742e545369676e61746f726965734f75744f664f7264657204110120546865207369676e61746f7269657320776572652070726f7669646564206f7574206f66206f726465723b20746865792073686f756c64206265206f7264657265642e4c53656e646572496e5369676e61746f72696573041101205468652073656e6465722077617320636f6e7461696e656420696e20746865206f74686572207369676e61746f726965733b2069742073686f756c646e27742062652e204e6f74466f756e6404e0204d756c7469736967206f7065726174696f6e206e6f7420666f756e64207768656e20617474656d7074696e6720746f2063616e63656c2e204e6f744f776e6572043101204f6e6c7920746865206163636f756e742074686174206f726967696e616c6c79206372656174656420746865206d756c74697369672069732061626c6520746f2063616e63656c2069742e2c4e6f54696d65706f696e74042101204e6f2074696d65706f696e742077617320676976656e2c2079657420746865206d756c7469736967206f7065726174696f6e20697320616c726561647920756e6465727761792e3857726f6e6754696d65706f696e74043101204120646966666572656e742074696d65706f696e742077617320676976656e20746f20746865206d756c7469736967206f7065726174696f6e207468617420697320756e6465727761792e4c556e657870656374656454696d65706f696e7404f820412074696d65706f696e742077617320676976656e2c20796574206e6f206d756c7469736967206f7065726174696f6e20697320756e6465727761792e30576569676874546f6f4c6f7704d420546865206d6178696d756d2077656967687420696e666f726d6174696f6e2070726f76696465642077617320746f6f206c6f772e34416c726561647953746f72656404a420546865206461746120746f2062652073746f72656420697320616c72656164792073746f7265642e042040436865636b5370656356657273696f6e38436865636b547856657273696f6e30436865636b47656e6573697320436865636b45726128436865636b4e6f6e63652c436865636b576569676874604368617267655472616e73616374696f6e5061796d656e746856616c696461746545717569766f636174696f6e5265706f7274' diff --git a/py-substrate-interface/test/settings.py b/py-substrate-interface/test/settings.py new file mode 100644 index 00000000..819dd24c --- /dev/null +++ b/py-substrate-interface/test/settings.py @@ -0,0 +1,21 @@ +# Python Substrate Interface Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from os import environ + +KUSAMA_NODE_URL = environ.get('SUBSTRATE_NODE_URL_KUSAMA') or 'wss://kusama-rpc.polkadot.io/' +POLKADOT_NODE_URL = environ.get('SUBSTRATE_NODE_URL_POLKADOT') or 'wss://rpc.polkadot.io/' + + diff --git a/py-substrate-interface/test/test_create_extrinsics.py b/py-substrate-interface/test/test_create_extrinsics.py new file mode 100644 index 00000000..81aad4ce --- /dev/null +++ b/py-substrate-interface/test/test_create_extrinsics.py @@ -0,0 +1,186 @@ +# Python Substrate Interface Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest + +from scalecodec.type_registry import load_type_registry_preset +from substrateinterface import SubstrateInterface, Keypair, SubstrateRequestException +from test import settings + + +class CreateExtrinsicsTestCase(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.kusama_substrate = SubstrateInterface( + url=settings.KUSAMA_NODE_URL, + address_type=2, + type_registry_preset='kusama' + ) + + cls.polkadot_substrate = SubstrateInterface( + url=settings.POLKADOT_NODE_URL, + address_type=0, + type_registry_preset='polkadot' + ) + + """ + def test_compatibility_polkadot_runtime(self): + type_reg = load_type_registry_preset("polkadot") + + runtime_data = self.polkadot_substrate.rpc_request('state_getRuntimeVersion', []) + self.assertLessEqual( + runtime_data['result']['specVersion'], type_reg.get('runtime_id'), 'Current runtime is incompatible' + ) + + def test_compatibility_kusama_runtime(self): + type_reg = load_type_registry_preset("kusama") + + runtime_data = self.kusama_substrate.rpc_request('state_getRuntimeVersion', []) + self.assertLessEqual( + runtime_data['result']['specVersion'], type_reg.get('runtime_id'), 'Current runtime is incompatible' + ) + + def test_create_balance_transfer(self): + # Create new keypair + mnemonic = Keypair.generate_mnemonic() + keypair = Keypair.create_from_mnemonic(mnemonic, address_type=2) + + for substrate in [self.kusama_substrate, self.polkadot_substrate]: + + # Create balance transfer call + call = substrate.compose_call( + call_module='Balances', + call_function='transfer', + call_params={ + 'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'value': 2 * 10 ** 3 + } + ) + + extrinsic = substrate.create_signed_extrinsic(call=call, keypair=keypair) + + self.assertEqual(extrinsic.address.value, keypair.public_key) + self.assertEqual(extrinsic.call_module.name, 'Balances') + self.assertEqual(extrinsic.call.name, 'transfer') + + # Randomly created account should always have 0 nonce, otherwise account already exists + self.assertEqual(extrinsic.nonce.value, 0) + + try: + substrate.submit_extrinsic(extrinsic) + + self.fail('Should raise no funds to pay fees exception') + + except SubstrateRequestException as e: + # Extrinsic should be successful if account had balance, eitherwise 'Bad proof' error should be raised + self.assertEqual(e.args[0]['data'], 'Inability to pay some fees (e.g. account balance too low)') + + def test_create_mortal_extrinsic(self): + # Create new keypair + mnemonic = Keypair.generate_mnemonic() + keypair = Keypair.create_from_mnemonic(mnemonic, address_type=2) + + for substrate in [self.kusama_substrate, self.polkadot_substrate]: + + # Create balance transfer call + call = substrate.compose_call( + call_module='Balances', + call_function='transfer', + call_params={ + 'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'value': 2 * 10 ** 3 + } + ) + + extrinsic = substrate.create_signed_extrinsic(call=call, keypair=keypair, era={'period': 64}) + + try: + substrate.submit_extrinsic(extrinsic) + + self.fail('Should raise no funds to pay fees exception') + + except SubstrateRequestException as e: + # Extrinsic should be successful if account had balance, eitherwise 'Bad proof' error should be raised + self.assertEqual(e.args[0]['data'], 'Inability to pay some fees (e.g. account balance too low)') + + """ + + def test_create_unsigned_extrinsic(self): + + call = self.kusama_substrate.compose_call( + call_module='Timestamp', + call_function='set', + call_params={ + 'now': 1602857508000, + } + ) + + extrinsic = self.kusama_substrate.create_unsigned_extrinsic(call) + self.assertEqual(str(extrinsic.data), '0x280402000ba09cc0317501') + + """ + def test_payment_info(self): + keypair = Keypair(ss58_address="EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk") + + call = self.kusama_substrate.compose_call( + call_module='Balances', + call_function='transfer', + call_params={ + 'dest': 'EaG2CRhJWPb7qmdcJvy3LiWdh26Jreu9Dx6R1rXxPmYXoDk', + 'value': 2 * 10 ** 3 + } + ) + payment_info = self.kusama_substrate.get_payment_info(call=call, keypair=keypair) + + self.assertIn('class', payment_info) + self.assertIn('partialFee', payment_info) + self.assertIn('weight', payment_info) + + self.assertGreater(payment_info['partialFee'], 0) + """ + + def test_generate_signature_payload_lte_256_bytes(self): + + call = self.kusama_substrate.compose_call( + call_module='System', + call_function='remark', + call_params={ + '_remark': '0x' + ('01' * 177) + } + ) + + signature_payload = self.kusama_substrate.generate_signature_payload(call=call) + + self.assertEqual(signature_payload.length, 256) + + def test_generate_signature_payload_gt_256_bytes(self): + + call = self.kusama_substrate.compose_call( + call_module='System', + call_function='remark', + call_params={ + '_remark': '0x' + ('01' * 178) + } + ) + + signature_payload = self.kusama_substrate.generate_signature_payload(call=call) + + self.assertEqual(signature_payload.length, 32) + + +if __name__ == '__main__': + unittest.main() diff --git a/py-substrate-interface/test/test_helper_functions.py b/py-substrate-interface/test/test_helper_functions.py new file mode 100644 index 00000000..5abc32c9 --- /dev/null +++ b/py-substrate-interface/test/test_helper_functions.py @@ -0,0 +1,115 @@ +# Python Substrate Interface Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest +from unittest.mock import MagicMock + +from scalecodec import ScaleBytes, Bytes +from scalecodec.metadata import MetadataDecoder + +from substrateinterface import SubstrateInterface +from test.fixtures import metadata_v12_hex + + +class TestHelperFunctions(unittest.TestCase): + + @classmethod + def setUpClass(cls): + + cls.substrate = SubstrateInterface(url='dummy', address_type=42, type_registry_preset='kusama') + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v12_hex)) + metadata_decoder.decode() + cls.substrate.get_block_metadata = MagicMock(return_value=metadata_decoder) + + def mocked_request(method, params): + if method == 'chain_getRuntimeVersion': + return { + "jsonrpc": "2.0", + "result": {"specVersion": 2023}, + "id": 1 + } + elif method == 'chain_getHeader': + return { + "jsonrpc": "2.0", + "result": { + "digest": { + "logs": [ + ] + }, + "extrinsicsRoot": "0xa94148d938c7b7976abf4272dca95724d7a74da2f3649ec0bd53dc3daaedda44", + "number": "0x4abaaa", + "parentHash": "0xe1781813275653a970b4260298b3858b36d38e072256dad674f7c786a0cae236", + "stateRoot": "0xb6aa468385c82d15b343a676b3488d9f141ac100fc548bb8a546f27a7241c44a" + }, + "id": 1 + } + + cls.substrate.rpc_request = MagicMock(side_effect=mocked_request) + + def test_decode_scale(self): + self.assertEqual(self.substrate.decode_scale('Compact', '0x08'), 2) + + def test_encode_scale(self): + self.assertEqual(self.substrate.encode_scale('Compact', 3), '0x0c') + + def test_get_type_definition(self): + self.assertDictEqual(self.substrate.get_type_definition('Bytes'), { + 'decoder_class': 'Bytes', + 'is_primitive_core': False, + 'is_primitive_runtime': True, + 'spec_version': 2023, + 'type_string': 'Bytes'} + ) + + def test_get_metadata_modules(self): + for module in self.substrate.get_metadata_modules(): + self.assertIn('module_id', module) + self.assertIn('name', module) + self.assertEqual(module['spec_version'], 2023) + + def test_get_metadata_call_function(self): + call_function = self.substrate.get_metadata_call_function("Balances", "transfer") + self.assertEqual(call_function['module_name'], "Balances") + self.assertEqual(call_function['call_name'], "transfer") + self.assertEqual(call_function['spec_version'], 2023) + + def test_get_metadata_event(self): + event = self.substrate.get_metadata_event("Balances", "Transfer") + self.assertEqual(event['module_name'], "Balances") + self.assertEqual(event['event_name'], "Transfer") + self.assertEqual(event['spec_version'], 2023) + + def test_get_metadata_constant(self): + constant = self.substrate.get_metadata_constant("System", "BlockHashCount") + self.assertEqual(constant['module_name'], "System") + self.assertEqual(constant['constant_name'], "BlockHashCount") + self.assertEqual(constant['spec_version'], 2023) + + def test_get_metadata_storage_function(self): + storage = self.substrate.get_metadata_storage_function("System", "Account") + self.assertEqual(storage['module_name'], "System") + self.assertEqual(storage['storage_name'], "Account") + self.assertEqual(storage['spec_version'], 2023) + + def test_get_metadata_error(self): + error = self.substrate.get_metadata_error("System", "InvalidSpecName") + self.assertEqual(error['module_name'], "System") + self.assertEqual(error['error_name'], "InvalidSpecName") + self.assertEqual(error['spec_version'], 2023) + + +if __name__ == '__main__': + unittest.main() diff --git a/py-substrate-interface/test/test_keypair.py b/py-substrate-interface/test/test_keypair.py new file mode 100644 index 00000000..c40ad73f --- /dev/null +++ b/py-substrate-interface/test/test_keypair.py @@ -0,0 +1,215 @@ +# Python Substrate Interface Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest + +from scalecodec import ScaleBytes +from substrateinterface import Keypair, KeypairType, extract_derive_path, ConfigurationError, DEV_PHRASE +from bip39 import bip39_validate + + +class KeyPairTestCase(unittest.TestCase): + + def test_generate_mnemonic(self): + mnemonic = Keypair.generate_mnemonic() + self.assertTrue(bip39_validate(mnemonic)) + + def test_invalid_mnemic(self): + mnemonic = "This is an invalid mnemonic" + self.assertFalse(bip39_validate(mnemonic)) + + def test_create_sr25519_keypair(self): + mnemonic = "old leopard transfer rib spatial phone calm indicate online fire caution review" + keypair = Keypair.create_from_mnemonic(mnemonic, address_type=0) + + self.assertEqual(keypair.ss58_address, "16ADqpMa4yzfmWs3nuTSMhfZ2ckeGtvqhPWCNqECEGDcGgU2") + + def test_only_provide_ss58_address(self): + + keypair = Keypair(ss58_address='16ADqpMa4yzfmWs3nuTSMhfZ2ckeGtvqhPWCNqECEGDcGgU2') + self.assertEqual(keypair.public_key, '0xe4359ad3e2716c539a1d663ebd0a51bdc5c98a12e663bb4c4402db47828c9446') + + def test_only_provide_public_key(self): + + keypair = Keypair( + public_key='0xe4359ad3e2716c539a1d663ebd0a51bdc5c98a12e663bb4c4402db47828c9446', + address_type=0 + ) + self.assertEqual(keypair.ss58_address, '16ADqpMa4yzfmWs3nuTSMhfZ2ckeGtvqhPWCNqECEGDcGgU2') + + def test_provide_no_ss58_address_and_public_key(self): + self.assertRaises(ValueError, Keypair) + + def test_incorrect_private_key_length_sr25519(self): + self.assertRaises( + ValueError, Keypair, private_key='0x23', ss58_address='16ADqpMa4yzfmWs3nuTSMhfZ2ckeGtvqhPWCNqECEGDcGgU2' + ) + + def test_incorrect_public_key(self): + self.assertRaises(ValueError, Keypair, public_key='0x23') + + def test_sign_and_verify(self): + mnemonic = Keypair.generate_mnemonic() + keypair = Keypair.create_from_mnemonic(mnemonic) + signature = keypair.sign("Test123") + self.assertTrue(keypair.verify("Test123", signature)) + + def test_sign_and_verify_hex_data(self): + mnemonic = Keypair.generate_mnemonic() + keypair = Keypair.create_from_mnemonic(mnemonic) + signature = keypair.sign("0x1234") + self.assertTrue(keypair.verify("0x1234", signature)) + + def test_sign_and_verify_scale_bytes(self): + mnemonic = Keypair.generate_mnemonic() + keypair = Keypair.create_from_mnemonic(mnemonic) + + data = ScaleBytes('0x1234') + + signature = keypair.sign(data) + self.assertTrue(keypair.verify(data, signature)) + + def test_sign_missing_private_key(self): + keypair = Keypair(ss58_address="5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY") + self.assertRaises(ConfigurationError, keypair.sign, "0x1234") + + def test_sign_unsupported_crypto_type(self): + keypair = Keypair.create_from_private_key( + ss58_address='16ADqpMa4yzfmWs3nuTSMhfZ2ckeGtvqhPWCNqECEGDcGgU2', + private_key='0x1f1995bdf3a17b60626a26cfe6f564b337d46056b7a1281b64c649d592ccda0a9cffd34d9fb01cae1fba61aeed184c817442a2186d5172416729a4b54dd4b84e', + crypto_type=3 + ) + self.assertRaises(ConfigurationError, keypair.sign, "0x1234") + + def test_verify_unsupported_crypto_type(self): + keypair = Keypair.create_from_private_key( + ss58_address='16ADqpMa4yzfmWs3nuTSMhfZ2ckeGtvqhPWCNqECEGDcGgU2', + private_key='0x1f1995bdf3a17b60626a26cfe6f564b337d46056b7a1281b64c649d592ccda0a9cffd34d9fb01cae1fba61aeed184c817442a2186d5172416729a4b54dd4b84e', + crypto_type=3 + ) + self.assertRaises(ConfigurationError, keypair.verify, "0x1234", '0x1234') + + def test_sign_and_verify_incorrect_signature(self): + mnemonic = Keypair.generate_mnemonic() + keypair = Keypair.create_from_mnemonic(mnemonic) + signature = "0x4c291bfb0bb9c1274e86d4b666d13b2ac99a0bacc04a4846fb8ea50bda114677f83c1f164af58fc184451e5140cc8160c4de626163b11451d3bbb208a1889f8a" + self.assertFalse(keypair.verify("Test123", signature)) + + def test_sign_and_verify_invalid_signature(self): + mnemonic = Keypair.generate_mnemonic() + keypair = Keypair.create_from_mnemonic(mnemonic) + signature = "Test" + self.assertRaises(TypeError, keypair.verify, "Test123", signature) + + def test_sign_and_verify_invalid_message(self): + mnemonic = Keypair.generate_mnemonic() + keypair = Keypair.create_from_mnemonic(mnemonic) + signature = keypair.sign("Test123") + self.assertFalse(keypair.verify("OtherMessage", signature)) + + def test_create_ed25519_keypair(self): + mnemonic = "old leopard transfer rib spatial phone calm indicate online fire caution review" + keypair = Keypair.create_from_mnemonic(mnemonic, address_type=0, crypto_type=KeypairType.ED25519) + + self.assertEqual(keypair.ss58_address, "16dYRUXznyhvWHS1ktUENGfNAEjCawyDzHRtN9AdFnJRc38h") + + def test_sign_and_verify_ed25519(self): + mnemonic = Keypair.generate_mnemonic() + keypair = Keypair.create_from_mnemonic(mnemonic, crypto_type=KeypairType.ED25519) + signature = keypair.sign("Test123") + + self.assertTrue(keypair.verify("Test123", signature)) + + def test_sign_and_verify_invalid_signature_ed25519(self): + mnemonic = Keypair.generate_mnemonic() + keypair = Keypair.create_from_mnemonic(mnemonic, crypto_type=KeypairType.ED25519) + signature = "0x4c291bfb0bb9c1274e86d4b666d13b2ac99a0bacc04a4846fb8ea50bda114677f83c1f164af58fc184451e5140cc8160c4de626163b11451d3bbb208a1889f8a" + self.assertFalse(keypair.verify("Test123", signature)) + + def test_unsupport_crypto_type(self): + self.assertRaises( + ValueError, Keypair.create_from_seed, + seed_hex='0xda3cf5b1e9144931?a0f0db65664aab662673b099415a7f8121b7245fb0be4143', + crypto_type=2 + ) + + def test_create_keypair_from_private_key(self): + keypair = Keypair.create_from_private_key( + ss58_address='16ADqpMa4yzfmWs3nuTSMhfZ2ckeGtvqhPWCNqECEGDcGgU2', + private_key='0x1f1995bdf3a17b60626a26cfe6f564b337d46056b7a1281b64c649d592ccda0a9cffd34d9fb01cae1fba61aeed184c817442a2186d5172416729a4b54dd4b84e' + ) + self.assertEqual(keypair.public_key, '0xe4359ad3e2716c539a1d663ebd0a51bdc5c98a12e663bb4c4402db47828c9446') + + def test_hdkd_hard_path(self): + mnemonic = 'old leopard transfer rib spatial phone calm indicate online fire caution review' + derivation_address = '5FEiH8iuDUw271xbqWTWuB6WrDjv5dnCeDX1CyHubAniXDNN' + derivation_path = '//Alice' + + derived_keypair = Keypair.create_from_uri(mnemonic + derivation_path) + + self.assertEqual(derivation_address, derived_keypair.ss58_address) + + def test_hdkd_soft_path(self): + mnemonic = 'old leopard transfer rib spatial phone calm indicate online fire caution review' + derivation_address = '5GNXbA46ma5dg19GXdiKi5JH3mnkZ8Yea3bBtZAvj7t99P9i' + derivation_path = '/Alice' + + derived_keypair = Keypair.create_from_uri(mnemonic + derivation_path) + + self.assertEqual(derivation_address, derived_keypair.ss58_address) + + def test_hdkd_default_to_dev_mnemonic(self): + derivation_address = '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY' + derivation_path = '//Alice' + + derived_keypair = Keypair.create_from_uri(derivation_path) + + self.assertEqual(derivation_address, derived_keypair.ss58_address) + + def test_hdkd_nested_hard_soft_path(self): + derivation_address = '5CJGwWiKXSE16WJaxBdPZhWqUYkotgenLUALv7ZvqQ4TXeqf' + derivation_path = '//Bob/test' + + derived_keypair = Keypair.create_from_uri(derivation_path) + + self.assertEqual(derivation_address, derived_keypair.ss58_address) + + def test_hdkd_nested_soft_hard_path(self): + derivation_address = '5Cwc8tShrshDJUp1P1M21dKUTcYQpV9GcfSa4hUBNmMdV3Cx' + derivation_path = '/Bob//test' + + derived_keypair = Keypair.create_from_uri(derivation_path) + + self.assertEqual(derivation_address, derived_keypair.ss58_address) + + def test_hdkd_path_gt_32_bytes(self): + derivation_address = '5GR5pfZeNs1uQiSWVxZaQiZou3wdZiX894eqgvfNfHbEh7W2' + derivation_path = '//PathNameLongerThan32BytesWhichShouldBeHashed' + + derived_keypair = Keypair.create_from_uri(derivation_path) + + self.assertEqual(derivation_address, derived_keypair.ss58_address) + + def test_hdkd_unsupported_password(self): + self.assertRaises(NotImplementedError, Keypair.create_from_uri, DEV_PHRASE + '///test') + + def test_reconstruct_path_fail(self): + self.assertRaises(ValueError, extract_derive_path, 'no_slashes') + self.assertRaises(ValueError, extract_derive_path, '//') + + +if __name__ == '__main__': + unittest.main() diff --git a/py-substrate-interface/test/test_runtime_state.py b/py-substrate-interface/test/test_runtime_state.py new file mode 100644 index 00000000..76d46940 --- /dev/null +++ b/py-substrate-interface/test/test_runtime_state.py @@ -0,0 +1,189 @@ +# Python Substrate Interface Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest +from unittest.mock import MagicMock + +from scalecodec import ScaleBytes +from scalecodec.metadata import MetadataDecoder + +from substrateinterface import SubstrateInterface +from test.fixtures import metadata_v12_hex + + +class TestRuntimeState(unittest.TestCase): + + @classmethod + def setUpClass(cls): + + cls.substrate = SubstrateInterface(url='dummy', address_type=42, type_registry_preset='kusama') + + def test_plaintype_call(self): + + def mocked_request(method, params): + + if method == 'chain_getRuntimeVersion': + return { + "jsonrpc": "2.0", + "result": {"specVersion": 2023}, + "id": 1 + } + elif method == 'state_getStorageAt': + return { + "jsonrpc": "2.0", + "result": '0x0800000000000000482d7c0900000000020000000100000000000000000000000000020000', + "id": 1 + } + elif method == 'chain_getHeader': + return { + "jsonrpc": "2.0", + "result": { + "digest": { + "logs": [ + ] + }, + "extrinsicsRoot": "0xa94148d938c7b7976abf4272dca95724d7a74da2f3649ec0bd53dc3daaedda44", + "number": "0x4abaaa", + "parentHash": "0xe1781813275653a970b4260298b3858b36d38e072256dad674f7c786a0cae236", + "stateRoot": "0xb6aa468385c82d15b343a676b3488d9f141ac100fc548bb8a546f27a7241c44a" + }, + "id": 1 + } + + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v12_hex)) + metadata_decoder.decode() + self.substrate.get_block_metadata = MagicMock(return_value=metadata_decoder) + self.substrate.rpc_request = MagicMock(side_effect=mocked_request) + + response = self.substrate.get_runtime_state( + module='System', + storage_function='Events' + ) + + self.assertEqual(len(response['result']), 2) + + self.assertEqual(response['result'][0]['module_id'], 'System') + self.assertEqual(response['result'][0]['event_id'], 'ExtrinsicSuccess') + self.assertEqual(response['result'][1]['module_id'], 'System') + self.assertEqual(response['result'][1]['event_id'], 'ExtrinsicSuccess') + + def test_maptype_call(self): + + def mocked_request(method, params): + if method == 'chain_getRuntimeVersion': + return { + "jsonrpc": "2.0", + "result": {"specVersion": 2023}, + "id": 1 + } + elif method == 'state_getStorageAt': + return { + 'jsonrpc': '2.0', + 'result': '0x00000000030000c16ff28623000000000000000000000000000000000000000000000000000000c16ff286230000000000000000000000c16ff28623000000000000000000', + 'id': 1 + } + elif method == 'chain_getHeader': + return { + "jsonrpc": "2.0", + "result": { + "digest": { + "logs": [ + ] + }, + "extrinsicsRoot": "0xa94148d938c7b7976abf4272dca95724d7a74da2f3649ec0bd53dc3daaedda44", + "number": "0x4abaaa", + "parentHash": "0xe1781813275653a970b4260298b3858b36d38e072256dad674f7c786a0cae236", + "stateRoot": "0xb6aa468385c82d15b343a676b3488d9f141ac100fc548bb8a546f27a7241c44a" + }, + "id": 1 + } + + self.substrate.rpc_request = MagicMock(side_effect=mocked_request) + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v12_hex)) + metadata_decoder.decode() + self.substrate.get_block_metadata = MagicMock(return_value=metadata_decoder) + + response = self.substrate.get_runtime_state( + module='System', + storage_function='Account', + params=['5GNJqTPyNqANBkUVMN1LPPrxXnFouWXoe2wNSmmEoLctxiZY'] + ) + + self.assertEqual(response['result'], { + 'data': + { + 'feeFrozen': 10000000000000000, + 'free': 10000000000000000, + 'miscFrozen': 10000000000000000, + 'reserved': 0 + }, + 'nonce': 0, + 'refcount': 3 + }) + + def test_iterate_map(self): + + def mocked_request(method, params): + if method == 'chain_getRuntimeVersion': + return { + "jsonrpc": "2.0", + "result": {"specVersion": 2023}, + "id": 1 + } + elif method == 'state_getPairs': + return { + "jsonrpc": "2.0", + "result": [ + ['0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f', + '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'] + ], + "id": 1 + } + elif method == 'chain_getHeader': + return { + "jsonrpc": "2.0", + "result": { + "digest": { + "logs": [ + ] + }, + "extrinsicsRoot": "0xa94148d938c7b7976abf4272dca95724d7a74da2f3649ec0bd53dc3daaedda44", + "number": "0x4abaaa", + "parentHash": "0xe1781813275653a970b4260298b3858b36d38e072256dad674f7c786a0cae236", + "stateRoot": "0xb6aa468385c82d15b343a676b3488d9f141ac100fc548bb8a546f27a7241c44a" + }, + "id": 1 + } + + self.substrate.rpc_request = MagicMock(side_effect=mocked_request) + metadata_decoder = MetadataDecoder(ScaleBytes(metadata_v12_hex)) + metadata_decoder.decode() + self.substrate.get_block_metadata = MagicMock(return_value=metadata_decoder) + + all_bonded_stash_ctrls = self.substrate.iterate_map( + module='Staking', + storage_function='Bonded', + block_hash='0x7d56e0ff8d3c57f77ea6a1eeef1cd2c0157a7b24d5a1af0f802ca242617922bf' + ) + + self.assertEqual(all_bonded_stash_ctrls, [[ + '0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f', + '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + ]]) + + +if __name__ == '__main__': + unittest.main() diff --git a/py-substrate-interface/test/test_type_registry.py b/py-substrate-interface/test/test_type_registry.py new file mode 100644 index 00000000..825077e4 --- /dev/null +++ b/py-substrate-interface/test/test_type_registry.py @@ -0,0 +1,70 @@ +# Python Substrate Interface Library +# +# Copyright 2018-2020 Stichting Polkascan (Polkascan Foundation). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import sys + +sys.path.append(os.path.abspath('../../py-scale-codec')) + +import unittest + +from scalecodec.base import RuntimeConfiguration, ScaleType + +from substrateinterface import SubstrateInterface, Keypair, SubstrateRequestException +from test import settings + + +class KusamaTypeRegistryTestCase(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.substrate = SubstrateInterface( + url=settings.KUSAMA_NODE_URL, + address_type=2, + type_registry_preset='kusama' + ) + + """ + def test_type_registry_compatibility(self): + for scale_type in self.substrate.get_type_registry(): + obj = RuntimeConfiguration().get_decoder_class(scale_type) + + self.assertIsNotNone(obj, '{} not supported'.format(scale_type)) + """ + +class PolkadotTypeRegistryTestCase(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.substrate = SubstrateInterface( + url=settings.POLKADOT_NODE_URL, + address_type=0, + type_registry_preset='polkadot' + ) + + """ + def test_type_registry_compatibility(self): + + for scale_type in self.substrate.get_type_registry(): + + obj = RuntimeConfiguration().get_decoder_class(scale_type) + + self.assertIsNotNone(obj, '{} not supported'.format(scale_type)) + """ + + +if __name__ == '__main__': + unittest.main() From ee3142b6727f608c63e66c60eb07a21fa0e1410b Mon Sep 17 00:00:00 2001 From: Tamir-Polymath Date: Wed, 26 May 2021 07:44:07 -0400 Subject: [PATCH 2/3] NCBD-166 Fixing explorer-gui submodule --- .gitmodules | 2 +- pm-explorer-gui/explorer-gui | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 160000 pm-explorer-gui/explorer-gui diff --git a/.gitmodules b/.gitmodules index 98e85650..942f6366 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "explorer-gui"] +[submodule "polkascan-explorer-gui"] path = pm-explorer-gui/explorer-gui url = https://github.com/polkascan/polkascan-explorer-gui.git diff --git a/pm-explorer-gui/explorer-gui b/pm-explorer-gui/explorer-gui new file mode 160000 index 00000000..b72cb13c --- /dev/null +++ b/pm-explorer-gui/explorer-gui @@ -0,0 +1 @@ +Subproject commit b72cb13c874be7f132b11c5c97018d78e4e7ccdf From 0da38fd8b5794e9bc7b9d8682240ddfb8a0fa22e Mon Sep 17 00:00:00 2001 From: Tamir-Polymath Date: Wed, 26 May 2021 09:43:03 -0400 Subject: [PATCH 3/3] NCBD-166 Docker files cleanup --- docker-compose-alcyon.yml | 24 ++++++------------------ docker-compose-staging.yml | 24 ++++++------------------ docker-compose-tooling.yml | 24 ++++++------------------ 3 files changed, 18 insertions(+), 54 deletions(-) diff --git a/docker-compose-alcyon.yml b/docker-compose-alcyon.yml index 361b6082..2d635d5e 100644 --- a/docker-compose-alcyon.yml +++ b/docker-compose-alcyon.yml @@ -2,9 +2,7 @@ version: '3' services: explorer-api: - build: - context: pm-explorer-api/ - dockerfile: Dockerfile + build: pm-explorer-api/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/alcyon-explorer-api:latest hostname: explorer-api ports: @@ -35,9 +33,7 @@ services: - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} harvester-api: - build: - context: pm-harvester/ - dockerfile: Dockerfile + build: pm-harvester/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest hostname: harvester-api volumes: @@ -68,9 +64,7 @@ services: - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} harvester-worker: - build: - context: pm-harvester/ - dockerfile: Dockerfile + build: pm-harvester/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest volumes: - "/usr/src/app" @@ -86,9 +80,7 @@ services: environment: *env harvester-beat: - build: - context: pm-harvester/ - dockerfile: Dockerfile + build: pm-harvester/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest volumes: - "/usr/src/app" @@ -105,9 +97,7 @@ services: environment: *env harvester-monitor: - build: - context: pm-harvester/ - dockerfile: Dockerfile + build: pm-harvester/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/polymesh-harvester:latest ports: - "5555:5555" @@ -134,9 +124,7 @@ services: awslogs-stream-prefix: redis explorer-gui: - build: - context: pm-explorer-gui/ - dockerfile: Dockerfile + build: pm-explorer-gui/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/alcyon-explorer-gui:latest ports: - '80:80' diff --git a/docker-compose-staging.yml b/docker-compose-staging.yml index 78445b41..34dd7e9a 100644 --- a/docker-compose-staging.yml +++ b/docker-compose-staging.yml @@ -2,9 +2,7 @@ version: '3' services: explorer-api: - build: - context: pm-explorer-api/ - dockerfile: Dockerfile + build: pm-explorer-api/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-explorer-api:latest hostname: explorer-api links: @@ -33,9 +31,7 @@ services: - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} harvester-api: - build: - context: pm-harvester/ - dockerfile: Dockerfile + build: pm-harvester/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest hostname: harvester-api volumes: @@ -66,9 +62,7 @@ services: - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} harvester-worker: - build: - context: pm-harvester/ - dockerfile: Dockerfile + build: pm-harvester/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest volumes: - "/usr/src/app" @@ -84,9 +78,7 @@ services: environment: *env harvester-beat: - build: - context: pm-harvester/ - dockerfile: Dockerfile + build: pm-harvester/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest volumes: - "/usr/src/app" @@ -103,9 +95,7 @@ services: environment: *env harvester-monitor: - build: - context: pm-harvester/ - dockerfile: Dockerfile + build: pm-harvester/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest ports: - "5555:5555" @@ -132,9 +122,7 @@ services: awslogs-stream-prefix: redis explorer-gui: - build: - context: pm-explorer-gui/ - dockerfile: Dockerfile + build: pm-explorer-gui/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-explorer-gui:latest ports: - '80:80' diff --git a/docker-compose-tooling.yml b/docker-compose-tooling.yml index fec5a90a..a81b6ee9 100644 --- a/docker-compose-tooling.yml +++ b/docker-compose-tooling.yml @@ -2,9 +2,7 @@ version: '3' services: explorer-api: - build: - context: pm-explorer-api/ - dockerfile: Dockerfile + build: pm-explorer-api/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-explorer:latest hostname: explorer-api ports: @@ -35,9 +33,7 @@ services: - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} harvester-api: - build: - context: pm-harvester/ - dockerfile: Dockerfile + build: pm-harvester/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest hostname: harvester-api volumes: @@ -68,9 +64,7 @@ services: - SUBSTRATE_RPC_URL=${SUBSTRATE_RPC_URL} harvester-worker: - build: - context: pm-harvester/ - dockerfile: Dockerfile + build: pm-harvester/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest volumes: - "/usr/src/app" @@ -86,9 +80,7 @@ services: environment: *env harvester-beat: - build: - context: pm-harvester/ - dockerfile: Dockerfile + build: pm-harvester/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest volumes: - "/usr/src/app" @@ -105,9 +97,7 @@ services: environment: *env harvester-monitor: - build: - context: pm-harvester/ - dockerfile: Dockerfile + build: pm-harvester/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-harvester:latest ports: - "5555:5555" @@ -134,9 +124,7 @@ services: awslogs-stream-prefix: redis explorer-gui: - build: - context: pm-explorer-gui/ - dockerfile: Dockerfile + build: pm-explorer-gui/. image: 414255671868.dkr.ecr.us-east-2.amazonaws.com/tooling-explorer-gui:latest ports: - '80:80'