From 40ee4ded8431de89b67298eb90936d991ddbb809 Mon Sep 17 00:00:00 2001 From: Song Zhou Date: Tue, 31 May 2022 00:16:19 +0800 Subject: [PATCH] sync with substrate `polkadot v0.9.22` --- Cargo.lock | 3897 ++++++++++------- Cargo.toml | 1 + chain-spec/alphaRaw.json | 41 +- crates/skw-blockchain-node/Cargo.toml | 79 +- crates/skw-blockchain-node/src/chain_spec.rs | 3 +- crates/skw-blockchain-node/src/cli.rs | 26 +- crates/skw-blockchain-node/src/command.rs | 83 +- .../skw-blockchain-node/src/command_helper.rs | 110 + crates/skw-blockchain-node/src/main.rs | 1 + crates/skw-blockchain-node/src/rpc.rs | 23 +- crates/skw-blockchain-node/src/service.rs | 43 +- .../pallet-parentchain/Cargo.toml | 31 +- .../pallet-parentchain/src/benchmarking.rs | 2 + .../pallet-parentchain/src/lib.rs | 22 +- .../pallet-parentchain/src/mock.rs | 40 +- .../pallet-parentchain/src/weights.rs | 57 +- .../pallet-registry/Cargo.toml | 34 +- .../pallet-registry/src/benchmarking.rs | 3 + .../pallet-registry/src/lib.rs | 88 +- .../pallet-registry/src/mock.rs | 28 +- .../pallet-registry/src/weights.rs | 51 +- .../pallet-s-account/Cargo.toml | 36 +- .../pallet-s-account/src/benchmarking.rs | 2 + .../pallet-s-account/src/lib.rs | 7 +- .../pallet-s-contract/Cargo.toml | 35 +- .../pallet-s-contract/src/benchmarking.rs | 3 +- .../pallet-s-contract/src/lib.rs | 89 +- .../pallet-s-contract/src/mock.rs | 32 +- .../pallet-s-contract/src/tests.rs | 8 +- .../pallet-s-contract/src/weights.rs | 79 +- .../pallet-secrets/Cargo.toml | 34 +- .../pallet-secrets/src/benchmarking.rs | 2 +- .../pallet-secrets/src/lib.rs | 46 +- .../pallet-secrets/src/mock.rs | 23 +- .../pallet-secrets/src/weights.rs | 67 +- .../primitives/Cargo.toml | 9 +- crates/skw-blockchain-runtime/Cargo.toml | 108 +- crates/skw-blockchain-runtime/src/lib.rs | 208 +- crates/skw-vm-engine-cli/Cargo.toml | 3 +- crates/skw-vm-interface/Cargo.toml | 3 +- crates/skw-vm-patch/Cargo.toml | 3 +- rust-toolchain | 2 +- skw-tools-scripts/generate-weight.cjs | 90 +- 43 files changed, 3199 insertions(+), 2353 deletions(-) create mode 100644 crates/skw-blockchain-node/src/command_helper.rs diff --git a/Cargo.lock b/Cargo.lock index 530e757..82f3c93 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,22 +12,13 @@ dependencies = [ "regex", ] -[[package]] -name = "addr2line" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61f2b7f93d2c7d2b08263acaa4a363b3e276806c68af6134c44f523bf1aacd" -dependencies = [ - "gimli 0.25.0", -] - [[package]] name = "addr2line" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" dependencies = [ - "gimli 0.26.1", + "gimli", ] [[package]] @@ -53,7 +44,7 @@ checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ "cfg-if 1.0.0", "cipher 0.3.0", - "cpufeatures 0.2.1", + "cpufeatures", "opaque-debug 0.3.0", ] @@ -77,7 +68,7 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.4", + "getrandom 0.2.6", "once_cell", "version_check", ] @@ -97,14 +88,14 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] name = "anyhow" -version = "1.0.53" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94a45b455c14666b85fc40a019e8ab9eb75e3a124e05494f5397122bc9eb06e0" +checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" [[package]] name = "approx" @@ -190,25 +181,24 @@ dependencies = [ [[package]] name = "async-global-executor" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9586ec52317f36de58453159d48351bc244bc24ced3effc1fce22f3d48664af6" +checksum = "fd8b508d585e01084059b60f06ade4cb7415cd2e4084b71dd1cb44e7d3fb9880" dependencies = [ "async-channel", "async-executor", "async-io", - "async-mutex", + "async-lock", "blocking", "futures-lite", - "num_cpus", "once_cell", ] [[package]] name = "async-io" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" +checksum = "e5e18f61464ae81cde0a23e713ae8fd299580c54d697a35820cfd0625b8b0e07" dependencies = [ "concurrent-queue", "futures-lite", @@ -218,34 +208,25 @@ dependencies = [ "parking", "polling", "slab", - "socket2 0.4.4", + "socket2", "waker-fn", - "winapi 0.3.9", + "winapi", ] [[package]] name = "async-lock" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a8ea61bf9947a1007c5cada31e647dbc77b103c679858150003ba697ea798b" -dependencies = [ - "event-listener", -] - -[[package]] -name = "async-mutex" -version = "1.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" +checksum = "e97a171d191782fba31bb902b14ad94e24a68145032b7eedf871ab0bc0d077b6" dependencies = [ "event-listener", ] [[package]] name = "async-process" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83137067e3a2a6a06d67168e49e68a0957d215410473a740cea95a2425c0b7c6" +checksum = "cf2c06e30a24e8c78a3987d07f0930edf76ef35e027e7bdb063fccafdad1f60c" dependencies = [ "async-io", "blocking", @@ -255,14 +236,14 @@ dependencies = [ "libc", "once_cell", "signal-hook", - "winapi 0.3.9", + "winapi", ] [[package]] name = "async-std" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8056f1455169ab86dd47b47391e4ab0cbd25410a70e9fe675544f49bafaf952" +checksum = "52580991739c5cdb36cde8b2a516371c0a3b70dda36d916cc08b82372916808c" dependencies = [ "async-channel", "async-global-executor", @@ -280,7 +261,7 @@ dependencies = [ "memchr", "num_cpus", "once_cell", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "pin-utils", "slab", "wasm-bindgen-futures", @@ -288,59 +269,47 @@ dependencies = [ [[package]] name = "async-std-resolver" -version = "0.20.4" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf3e776afdf3a2477ef4854b85ba0dff3bd85792f685fb3c68948b4d304e4f0" +checksum = "0f2f8a4a203be3325981310ab243a28e6e4ea55b6519bffce05d41ab60e09ad8" dependencies = [ "async-std", "async-trait", "futures-io", "futures-util", "pin-utils", + "socket2", "trust-dns-resolver", ] [[package]] name = "async-task" -version = "4.1.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d306121baf53310a3fd342d88dc0824f6bbeace68347593658525565abee8" +checksum = "30696a84d817107fc028e049980e09d5e140e8da8f1caeb17e8e950658a3cea9" [[package]] name = "async-trait" -version = "0.1.52" +version = "0.1.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3" +checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" dependencies = [ "proc-macro2", "quote", "syn", ] -[[package]] -name = "asynchronous-codec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb4401f0a3622dad2e0763fa79e0eb328bc70fb7dccfdd645341f00d671247d6" -dependencies = [ - "bytes 1.1.0", - "futures-sink", - "futures-util", - "memchr", - "pin-project-lite 0.2.8", -] - [[package]] name = "asynchronous-codec" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0de5164e5edbf51c45fb8c2d9664ae1c095cce1b265ecf7569093c0d66ef690" dependencies = [ - "bytes 1.1.0", + "bytes", "futures-sink", "futures-util", "memchr", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", ] [[package]] @@ -366,7 +335,7 @@ checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi", "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -377,24 +346,30 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e121dee8023ce33ab248d9ce1493df03c3b38a659b240096fcbd7048ff9c31f" +checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" dependencies = [ - "addr2line 0.17.0", + "addr2line", "cc", "cfg-if 1.0.0", "libc", "miniz_oxide", - "object", + "object 0.28.4", "rustc-demangle", ] [[package]] name = "base-x" -version = "0.2.8" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc19a4937b4fbd3fe3379793130e42060d10627a360f2127802b10b87e7baf74" + +[[package]] +name = "base16ct" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" [[package]] name = "base58" @@ -414,6 +389,15 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" +dependencies = [ + "serde", +] + [[package]] name = "bencher" version = "0.1.5" @@ -466,10 +450,22 @@ version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" dependencies = [ - "funty", - "radium", + "funty 1.1.0", + "radium 0.6.2", + "tap", + "wyz 0.2.0", +] + +[[package]] +name = "bitvec" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1489fcb93a5bb47da0462ca93ad252ad6af2145cce58d10d46a83931ba9f016b" +dependencies = [ + "funty 2.0.0", + "radium 0.7.0", "tap", - "wyz", + "wyz 0.5.0", ] [[package]] @@ -483,6 +479,15 @@ dependencies = [ "opaque-debug 0.3.0", ] +[[package]] +name = "blake2" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cf849ee05b2ee5fba5e36f97ff8ec2533916700fc0758d40d92136a42f3388" +dependencies = [ + "digest 0.10.3", +] + [[package]] name = "blake2-rfc" version = "0.2.18" @@ -504,30 +509,39 @@ dependencies = [ "constant_time_eq", ] +[[package]] +name = "blake2b_simd" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72936ee4afc7f8f736d1c38383b56480b5497b4617b4a77bdbf1d2ababc76127" +dependencies = [ + "arrayref", + "arrayvec 0.7.2", + "constant_time_eq", +] + [[package]] name = "blake2s_simd" -version = "0.5.11" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e461a7034e85b211a4acb57ee2e6730b32912b06c08cc242243c39fc21ae6a2" +checksum = "db539cc2b5f6003621f1cd9ef92d7ded8ea5232c7de0f9faa2de251cd98730d4" dependencies = [ "arrayref", - "arrayvec 0.5.2", + "arrayvec 0.7.2", "constant_time_eq", ] [[package]] name = "blake3" -version = "0.3.8" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b64485778c4f16a6a5a9d335e80d449ac6c70cdd6a06d2af18a6f6f775a125b3" +checksum = "a08e53fc5a564bb15bfe6fae56bd71522205f1f91893f9c0116edad6496c183f" dependencies = [ "arrayref", - "arrayvec 0.5.2", + "arrayvec 0.7.2", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "constant_time_eq", - "crypto-mac 0.8.0", - "digest 0.9.0", ] [[package]] @@ -552,6 +566,15 @@ dependencies = [ "generic-array 0.14.5", ] +[[package]] +name = "block-buffer" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +dependencies = [ + "generic-array 0.14.5", +] + [[package]] name = "block-padding" version = "0.1.5" @@ -569,9 +592,9 @@ checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" [[package]] name = "blocking" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046e47d4b2d391b1f6f8b407b1deb8dee56c1852ccd868becf2710f601b5f427" +checksum = "c6ccb65d468978a086b69884437ded69a90faab3bbe6e67f242173ea728acccc" dependencies = [ "async-channel", "async-task", @@ -638,7 +661,10 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" dependencies = [ + "lazy_static", "memchr", + "regex-automata", + "serde", ] [[package]] @@ -658,9 +684,9 @@ checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" [[package]] name = "byte-slice-cast" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d30c751592b77c499e7bce34d99d67c2c11bdc0574e9a488ddade14150a4698" +checksum = "87c5fdd0166095e1d463fc6cc01aa8ce547ad77a4e84d42eb6762b084e28067e" [[package]] name = "byte-tools" @@ -674,16 +700,6 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" -[[package]] -name = "bytes" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" -dependencies = [ - "byteorder", - "iovec", -] - [[package]] name = "bytes" version = "1.1.0" @@ -696,6 +712,17 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c58ec36aac5066d5ca17df51b3e70279f5670a72102f5752cb7e7c856adfc70" +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "c2-chacha" version = "0.3.3" @@ -714,9 +741,9 @@ checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" [[package]] name = "camino" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3132262930b0522068049f5870a856ab8affc80c70d08b6ecb785771a6fc23" +checksum = "869119e97797867fd90f5e22af7d0bd274bd4635ebb9eb68c04f3f513ae6c412" dependencies = [ "serde", ] @@ -738,7 +765,7 @@ checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" dependencies = [ "camino", "cargo-platform", - "semver 1.0.5", + "semver 1.0.9", "serde", "serde_json", ] @@ -775,21 +802,21 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chacha20" -version = "0.7.1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee7ad89dc1128635074c268ee661f90c3f7e83d9fd12910608c36b47d6c3412" +checksum = "01b72a433d0cf2aef113ba70f62634c56fddb0f244e6377185c56a7cadbd8f91" dependencies = [ "cfg-if 1.0.0", "cipher 0.3.0", - "cpufeatures 0.1.5", + "cpufeatures", "zeroize", ] [[package]] name = "chacha20poly1305" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1580317203210c517b6d44794abfbe600698276db18127e37ad3e69bf5e848e5" +checksum = "3b84ed6d1d5f7aa9bdde921a5090e0ca4d934d250ea3b402a5fab3a994e28a2a" dependencies = [ "aead", "chacha20", @@ -808,18 +835,20 @@ dependencies = [ "num-integer", "num-traits", "time", - "winapi 0.3.9", + "winapi", ] [[package]] name = "cid" -version = "0.6.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff0e3bc0b6446b3f9663c1a6aba6ef06c5aeaa1bc92bd18077be337198ab9768" +checksum = "fc949bff6704880faf064c42a4854032ab07bfcf3a4fcb82a57470acededb69c" dependencies = [ + "core2", "multibase", - "multihash 0.13.2", - "unsigned-varint 0.5.1", + "multihash", + "serde", + "unsigned-varint", ] [[package]] @@ -842,9 +871,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.3.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cc00842eed744b858222c4c9faf7243aafc6d33f92f96935263ef4d8a41ce21" +checksum = "5a050e2153c5be08febd6734e29298e844fdb0fa21aeddd63b4eb7baa106c69b" dependencies = [ "glob", "libc", @@ -853,51 +882,43 @@ dependencies = [ [[package]] name = "clap" -version = "2.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" -dependencies = [ - "ansi_term", - "atty", - "bitflags", - "strsim 0.8.0", - "textwrap 0.11.0", - "unicode-width", - "vec_map", -] - -[[package]] -name = "clap" -version = "3.0.0-beta.2" +version = "3.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd1061998a501ee7d4b6d449020df3266ca3124b941ec56cf2005c3779ca142" +checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ "atty", "bitflags", "clap_derive", + "clap_lex", "indexmap", "lazy_static", - "os_str_bytes", - "strsim 0.10.0", + "strsim", "termcolor", - "textwrap 0.12.1", - "unicode-width", - "vec_map", + "textwrap", ] [[package]] name = "clap_derive" -version = "3.0.0-beta.2" +version = "3.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "370f715b81112975b1b69db93e0b56ea4cd4e5002ac43b2da8474106a54096a1" +checksum = "25320346e922cffe59c0bbc5410c8d8784509efb321488971081313cb1e1a33c" dependencies = [ - "heck", + "heck 0.4.0", "proc-macro-error", "proc-macro2", "quote", "syn", ] +[[package]] +name = "clap_lex" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "concurrent-queue" version = "1.2.2" @@ -919,9 +940,15 @@ dependencies = [ "regex", "terminal_size", "unicode-width", - "winapi 0.3.9", + "winapi", ] +[[package]] +name = "const-oid" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" + [[package]] name = "constant_time_eq" version = "0.1.5" @@ -951,52 +978,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" [[package]] -name = "cpp_demangle" -version = "0.3.5" +name = "core2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" dependencies = [ - "cfg-if 1.0.0", + "memchr", ] [[package]] -name = "cpufeatures" -version = "0.1.5" +name = "cpp_demangle" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" +checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" dependencies = [ - "libc", + "cfg-if 1.0.0", ] [[package]] name = "cpufeatures" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" dependencies = [ "libc", ] [[package]] name = "cranelift-bforest" -version = "0.78.0" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc0cb7df82c8cf8f2e6a8dd394a0932a71369c160cc9b027dca414fced242513" +checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.78.0" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4463c15fa42eee909e61e5eac4866b7c6d22d0d8c621e57a0c5380753bfa8c" +checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" dependencies = [ "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.25.0", + "gimli", "log", "regalloc", "smallvec", @@ -1005,34 +1032,33 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.78.0" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793f6a94a053a55404ea16e1700202a88101672b8cd6b4df63e13cde950852bf" +checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" dependencies = [ "cranelift-codegen-shared", - "cranelift-entity", ] [[package]] name = "cranelift-codegen-shared" -version = "0.78.0" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44aa1846df275bce5eb30379d65964c7afc63c05a117076e62a119c25fe174be" +checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" [[package]] name = "cranelift-entity" -version = "0.78.0" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3a45d8d6318bf8fc518154d9298eab2a8154ec068a8885ff113f6db8d69bb3a" +checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" dependencies = [ "serde", ] [[package]] name = "cranelift-frontend" -version = "0.78.0" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e07339bd461766deb7605169de039e01954768ff730fa1254e149001884a8525" +checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" dependencies = [ "cranelift-codegen", "log", @@ -1042,9 +1068,9 @@ dependencies = [ [[package]] name = "cranelift-native" -version = "0.78.0" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e2fca76ff57e0532936a71e3fc267eae6a19a86656716479c66e7f912e3d7b" +checksum = "501241b0cdf903412ec9075385ac9f2b1eb18a89044d1538e97fab603231f70c" dependencies = [ "cranelift-codegen", "libc", @@ -1053,9 +1079,9 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.78.0" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f46fec547a1f8a32c54ea61c28be4f4ad234ad95342b718a9a9adcaadb0c778" +checksum = "16d9e4211bbc3268042a96dd4de5bd979cda22434991d035f5f8eacba987fad2" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1063,7 +1089,7 @@ dependencies = [ "itertools", "log", "smallvec", - "wasmparser 0.81.0", + "wasmparser 0.83.0", "wasmtime-types", ] @@ -1078,9 +1104,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" +checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -1099,10 +1125,11 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00d6d2ea26e8b151d99093005cb442fb9a37aeaca582a03ec70946f49ab5ed9" +checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c" dependencies = [ + "autocfg", "cfg-if 1.0.0", "crossbeam-utils", "lazy_static", @@ -1112,9 +1139,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" +checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" dependencies = [ "cfg-if 1.0.0", "lazy_static", @@ -1126,6 +1153,28 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c6a1d5fa1de37e071642dfa44ec552ca5b299adb128fab16138e24b548fd21" +dependencies = [ + "generic-array 0.14.5", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +dependencies = [ + "generic-array 0.14.5", + "typenum", +] + [[package]] name = "crypto-mac" version = "0.8.0" @@ -1146,20 +1195,42 @@ dependencies = [ "subtle", ] +[[package]] +name = "csv" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" +dependencies = [ + "bstr", + "csv-core", + "itoa 0.4.8", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +dependencies = [ + "memchr", +] + [[package]] name = "ct-logs" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" dependencies = [ - "sct", + "sct 0.6.1", ] [[package]] name = "ctor" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc0a48a9b826acdf4028595adc9db92caea352f7af011a3034acd172a52a0aa" +checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" dependencies = [ "quote", "syn", @@ -1211,6 +1282,19 @@ dependencies = [ "zeroize", ] +[[package]] +name = "curve25519-dalek" +version = "4.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4033478fbf70d6acf2655ac70da91ee65852d69daf7a67bf7a2f518fb47aafcf" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + [[package]] name = "data-encoding" version = "2.3.2" @@ -1257,6 +1341,15 @@ dependencies = [ "syn", ] +[[package]] +name = "der" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" +dependencies = [ + "const-oid", +] + [[package]] name = "derive_arbitrary" version = "1.1.0" @@ -1299,6 +1392,17 @@ dependencies = [ "generic-array 0.14.5", ] +[[package]] +name = "digest" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +dependencies = [ + "block-buffer 0.10.2", + "crypto-common", + "subtle", +] + [[package]] name = "directories" version = "4.0.1" @@ -1318,15 +1422,26 @@ dependencies = [ "dirs-sys-next", ] +[[package]] +name = "dirs" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" +dependencies = [ + "libc", + "redox_users 0.3.5", + "winapi", +] + [[package]] name = "dirs-sys" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", - "redox_users", - "winapi 0.3.9", + "redox_users 0.4.3", + "winapi", ] [[package]] @@ -1336,8 +1451,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ "libc", - "redox_users", - "winapi 0.3.9", + "redox_users 0.4.3", + "winapi", ] [[package]] @@ -1347,7 +1462,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" dependencies = [ "byteorder", - "quick-error 1.2.3", + "quick-error", ] [[package]] @@ -1358,9 +1473,9 @@ checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" [[package]] name = "dtoa" -version = "0.4.8" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" +checksum = "5caaa75cbd2b960ff1e5392d2cfb1f44717fffe12fc1f32b7b5d1267f99732a6" [[package]] name = "dyn-clonable" @@ -1385,15 +1500,27 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.4" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e50f3adc76d6a43f5ed73b698a87d0760ca74617f60f7c3b879003536fdd28" + +[[package]] +name = "ecdsa" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" +checksum = "d0d69ae62e0ce582d56380743515fefaf1a8c70cec685d9677636d7e30ae9dc9" +dependencies = [ + "der", + "elliptic-curve", + "rfc6979", + "signature", +] [[package]] name = "ed25519" -version = "1.3.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74e1069e39f1454367eb2de793ed062fac4c35c2934b76a81d90dd9abcd28816" +checksum = "1e9c280362032ea4203659fc489832d0204ef09f247a0506f170dafcac08c369" dependencies = [ "signature", ] @@ -1427,6 +1554,24 @@ dependencies = [ "heapsize", ] +[[package]] +name = "elliptic-curve" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25b477563c2bfed38a3b7a60964c49e058b2510ad3f12ba3483fd8f62c2306d6" +dependencies = [ + "base16ct", + "crypto-bigint", + "der", + "ff", + "generic-array 0.14.5", + "group", + "rand_core 0.6.3", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "encode_unicode" version = "0.3.6" @@ -1435,20 +1580,20 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.30" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dc8abb250ffdda33912550faa54c88ec8b998dec0b2c55ab224921ce11df" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "enum-as-inner" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c5f0096a91d210159eceb2ff5e1c4da18388a170e1e3ce948aac9c8fdbbf595" +checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" dependencies = [ - "heck", + "heck 0.4.0", "proc-macro2", "quote", "syn", @@ -1501,7 +1646,7 @@ checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" dependencies = [ "errno-dragonfly", "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -1526,7 +1671,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" dependencies = [ - "futures 0.3.21", + "futures", ] [[package]] @@ -1559,6 +1704,16 @@ dependencies = [ "libc", ] +[[package]] +name = "ff" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "131655483be284720a17d74ff97592b8e76576dc25563148601df2d7c9080924" +dependencies = [ + "rand_core 0.6.3", + "subtle", +] + [[package]] name = "file-per-thread-logger" version = "0.1.5" @@ -1571,17 +1726,17 @@ dependencies = [ [[package]] name = "finality-grandpa" -version = "0.14.4" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8ac3ff5224ef91f3c97e03eb1de2db82743427e91aaa5ac635f454f0b164f5a" +checksum = "d9def033d8505edf199f6a5d07aa7e6d2d6185b164293b77f0efd108f4f3e11d" dependencies = [ "either", - "futures 0.3.21", - "futures-timer 3.0.2", + "futures", + "futures-timer", "log", "num-traits", - "parity-scale-codec", - "parking_lot", + "parity-scale-codec 3.1.2", + "parking_lot 0.11.2", "scale-info", ] @@ -1605,13 +1760,11 @@ checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e" [[package]] name = "flate2" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" dependencies = [ - "cfg-if 1.0.0", "crc32fast", - "libc", "libz-sys", "miniz_oxide", ] @@ -1640,9 +1793,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "parity-scale-codec", + "parity-scale-codec 3.1.2", ] [[package]] @@ -1652,22 +1805,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" dependencies = [ "matches", - "percent-encoding 2.1.0", + "percent-encoding", ] [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-support", "frame-system", "linregress", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "paste", "scale-info", + "serde", "sp-api", + "sp-application-crypto", "sp-io", "sp-runtime", "sp-runtime-interface", @@ -1678,37 +1833,61 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "Inflector", "chrono", + "clap", "frame-benchmarking", "frame-support", + "frame-system", "handlebars", + "hash-db", + "hex", + "itertools", + "kvdb", + "lazy_static", "linked-hash-map", "log", - "parity-scale-codec", + "memory-db", + "parity-scale-codec 3.1.2", + "prettytable-rs", + "rand 0.8.5", + "rand_pcg 0.3.1", + "sc-block-builder", "sc-cli", + "sc-client-api", "sc-client-db", "sc-executor", "sc-service", + "sc-sysinfo", "serde", + "serde_json", + "serde_nanos", + "sp-api", + "sp-blockchain", "sp-core", + "sp-database", "sp-externalities", + "sp-inherents", "sp-keystore", "sp-runtime", "sp-state-machine", - "structopt", + "sp-storage", + "sp-trie", + "tempfile", + "thiserror", + "thousands", ] [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-support", "frame-system", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-core", "sp-io", @@ -1719,12 +1898,12 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "14.2.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ed5e5c346de62ca5c184b4325a6600d1eaca210666e4606fe4e449574978d0" +checksum = "df6bb8542ef006ef0de09a5c4420787d79823c0ed7924225822362fd2bf2ff2d" dependencies = [ "cfg-if 1.0.0", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "serde", ] @@ -1732,15 +1911,16 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "bitflags", "frame-metadata", "frame-support-procedural", "impl-trait-for-tuples", + "k256", "log", "once_cell", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "paste", "scale-info", "serde", @@ -1761,7 +1941,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "Inflector", "frame-support-procedural-tools", @@ -1773,10 +1953,10 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-support-procedural-tools-derive", - "proc-macro-crate 1.1.2", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn", @@ -1785,7 +1965,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "proc-macro2", "quote", @@ -1795,11 +1975,11 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-support", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "serde", "sp-core", @@ -1812,12 +1992,12 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-core", "sp-runtime", @@ -1827,10 +2007,21 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" +dependencies = [ + "parity-scale-codec 3.1.2", + "sp-api", +] + +[[package]] +name = "frame-try-runtime" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "parity-scale-codec", + "frame-support", "sp-api", + "sp-runtime", + "sp-std", ] [[package]] @@ -1842,7 +2033,7 @@ dependencies = [ "lazy_static", "libc", "libloading 0.5.2", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -1852,24 +2043,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" dependencies = [ "libc", - "winapi 0.3.9", -] - -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -dependencies = [ - "bitflags", - "fuchsia-zircon-sys", + "winapi", ] [[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" +name = "fs_extra" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" [[package]] name = "funty" @@ -1878,10 +2059,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" [[package]] -name = "futures" -version = "0.1.31" +name = "funty" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" @@ -1943,7 +2124,7 @@ dependencies = [ "futures-io", "memchr", "parking", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "waker-fn", ] @@ -1960,13 +2141,13 @@ dependencies = [ [[package]] name = "futures-rustls" -version = "0.21.1" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1387e07917c711fb4ee4f48ea0adb04a3c9739e53ef85bf43ae1edc2937a8b" +checksum = "e01fe9932a224b72b45336d96040aa86386d674a31d0af27d800ea7bc8ca97fe" dependencies = [ "futures-io", - "rustls", - "webpki", + "rustls 0.20.6", + "webpki 0.22.0", ] [[package]] @@ -1981,12 +2162,6 @@ version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" -[[package]] -name = "futures-timer" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6" - [[package]] name = "futures-timer" version = "3.0.2" @@ -1999,7 +2174,6 @@ version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" dependencies = [ - "futures 0.1.31", "futures-channel", "futures-core", "futures-io", @@ -2007,7 +2181,7 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "pin-utils", "slab", ] @@ -2046,9 +2220,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ "cfg-if 1.0.0", "libc", @@ -2067,21 +2241,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.25.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" dependencies = [ "fallible-iterator", "indexmap", "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" - [[package]] name = "glob" version = "0.3.0" @@ -2103,9 +2271,9 @@ dependencies = [ [[package]] name = "gloo-timers" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d12a7f4e95cfe710f1d624fb1210b7d961a5fb05c4fd942f4feab06e61f590e" +checksum = "5fb7d06c1c8cc2a29bee7ec961009a0b2caa0793ee4900c2ffb348734ba1c8f9" dependencies = [ "futures-channel", "futures-core", @@ -2113,13 +2281,24 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "group" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5ac374b108929de78460075f3dc439fa66df9d8fc77e8f12caa5165fcf0c89" +dependencies = [ + "ff", + "rand_core 0.6.3", + "subtle", +] + [[package]] name = "h2" -version = "0.3.11" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f1f717ddc7b2ba36df7e871fd88db79326551d3d6f1fc406fbfd28b582ff8e" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ - "bytes 1.1.0", + "bytes", "fnv", "futures-core", "futures-sink", @@ -2134,16 +2313,16 @@ dependencies = [ [[package]] name = "handlebars" -version = "4.2.1" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25546a65e5cf1f471f3438796fc634650b31d7fcde01d444c309aeb28b92e3a8" +checksum = "d113a9853e5accd30f43003560b5563ffbb007e3f325e8b103fa0d0029c6e6df" dependencies = [ "log", "pest", "pest_derive", - "quick-error 2.0.1", "serde", "serde_json", + "thiserror", ] [[package]] @@ -2172,9 +2351,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" dependencies = [ "ahash", ] @@ -2185,7 +2364,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] @@ -2197,6 +2376,12 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -2285,36 +2470,36 @@ checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" dependencies = [ "libc", "match_cfg", - "winapi 0.3.9", + "winapi", ] [[package]] name = "http" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb" dependencies = [ - "bytes 1.1.0", + "bytes", "fnv", - "itoa 1.0.1", + "itoa 1.0.2", ] [[package]] name = "http-body" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ - "bytes 1.1.0", + "bytes", "http", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", ] [[package]] name = "httparse" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9100414882e15fb7feccb4897e5f0ff0ff1ca7d1a86a23208ada4d7a18e6c6c4" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" [[package]] name = "httpdate" @@ -2330,11 +2515,11 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.17" +version = "0.14.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043f0e083e9901b6cc658a77d1eb86f4fc650bbb977a4337dd63192826aa85dd" +checksum = "42dc3c131584288d375f2d07f822b0cb012d8c6fb899a5b9fdb3cb7eb9b6004f" dependencies = [ - "bytes 1.1.0", + "bytes", "futures-channel", "futures-core", "futures-util", @@ -2343,9 +2528,9 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.1", - "pin-project-lite 0.2.8", - "socket2 0.4.4", + "itoa 1.0.2", + "pin-project-lite 0.2.9", + "socket2", "tokio", "tower-service", "tracing", @@ -2362,11 +2547,11 @@ dependencies = [ "futures-util", "hyper", "log", - "rustls", - "rustls-native-certs", + "rustls 0.19.1", + "rustls-native-certs 0.5.0", "tokio", - "tokio-rustls", - "webpki", + "tokio-rustls 0.22.0", + "webpki 0.21.4", ] [[package]] @@ -2375,24 +2560,13 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ - "bytes 1.1.0", + "bytes", "hyper", "native-tls", "tokio", "tokio-native-tls", ] -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - [[package]] name = "idna" version = "0.2.3" @@ -2406,39 +2580,30 @@ dependencies = [ [[package]] name = "if-addrs" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2273e421f7c4f0fc99e1934fe4776f59d8df2972f4199d703fc0da9f2a9f73de" -dependencies = [ - "if-addrs-sys", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "if-addrs-sys" -version = "0.3.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de74b9dd780476e837e5eb5ab7c88b49ed304126e412030a0adba99c8efe79ea" +checksum = "cbc0fa01ffc752e9dbc72818cdb072cd028b86be5e09dd04c5a643704fe101a9" dependencies = [ - "cc", "libc", + "winapi", ] [[package]] name = "if-watch" -version = "0.2.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8ab7f67bad3240049cb24fb9cb0b4c2c6af4c245840917fbbdededeee91179" +checksum = "ae8f4a3c3d4c89351ca83e120c1c00b27df945d38e05695668c9d4b4f7bc52f3" dependencies = [ "async-io", - "futures 0.3.21", - "futures-lite", + "core-foundation", + "fnv", + "futures", "if-addrs", "ipnet", - "libc", "log", - "winapi 0.3.9", + "rtnetlink", + "system-configuration", + "windows", ] [[package]] @@ -2447,7 +2612,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "161ebdfec3c8e3b52bf61c4f3550a1eea4f9579d10dc1b936f3171ebdcd6c443" dependencies = [ - "parity-scale-codec", + "parity-scale-codec 2.3.1", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec 3.1.2", ] [[package]] @@ -2472,9 +2646,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.8.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +checksum = "e6012d540c5baa3589337a98ce73408de9b5a25ec9fc2c6fd6be8f0d39e0ca5a" dependencies = [ "autocfg", "hashbrown 0.11.2", @@ -2512,34 +2686,11 @@ dependencies = [ "num-traits", ] -[[package]] -name = "intervalier" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa110ec7b8f493f416eed552740d10e7030ad5f63b2308f82c9608ec2df275" -dependencies = [ - "futures 0.3.21", - "futures-timer 2.0.2", -] - [[package]] name = "io-lifetimes" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "278e90d6f8a6c76a8334b336e306efa3c5f2b604048cbfd486d6f49878e3af14" -dependencies = [ - "rustc_version 0.4.0", - "winapi 0.3.9", -] - -[[package]] -name = "iovec" -version = "0.1.4" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -dependencies = [ - "libc", -] +checksum = "ec58677acfea8a15352d42fc87d11d63596ade9239e0a7c9352914417515dbe6" [[package]] name = "ip_network" @@ -2549,21 +2700,21 @@ checksum = "aa2f047c0a98b2f299aa5d6d7088443570faae494e9ae1305e48be000c9e0eb1" [[package]] name = "ipconfig" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" +checksum = "723519edce41262b05d4143ceb95050e4c614f483e78e9fd9e39a8275a84ad98" dependencies = [ - "socket2 0.3.19", + "socket2", "widestring", - "winapi 0.3.9", - "winreg 0.6.2", + "winapi", + "winreg 0.7.0", ] [[package]] name = "ipnet" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" [[package]] name = "itertools" @@ -2582,9 +2733,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "jobserver" @@ -2597,160 +2748,166 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.56" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" +checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" dependencies = [ "wasm-bindgen", ] [[package]] -name = "jsonrpc-client-transports" -version = "18.0.0" +name = "jsonrpsee" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b99d4207e2a04fb4581746903c2bb7eb376f88de9c699d0f3e10feeac0cd3a" +checksum = "a1f2ab5a60e558e74ea93bcf5164ebc47939a7fff8938fa9b5233bbc63e16061" dependencies = [ - "derive_more", - "futures 0.3.21", - "jsonrpc-core", - "jsonrpc-pubsub", - "log", - "serde", - "serde_json", - "url 1.7.2", + "jsonrpsee-core", + "jsonrpsee-http-server", + "jsonrpsee-proc-macros", + "jsonrpsee-types", + "jsonrpsee-ws-client", + "jsonrpsee-ws-server", + "tracing", ] [[package]] -name = "jsonrpc-core" -version = "18.0.0" +name = "jsonrpsee-client-transport" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +checksum = "26d682f4a55081a2be3e639280c640523070e4aeb8ee2fd8dd9168fdae57a9db" dependencies = [ - "futures 0.3.21", - "futures-executor", "futures-util", - "log", - "serde", - "serde_derive", - "serde_json", + "http", + "jsonrpsee-core", + "jsonrpsee-types", + "pin-project 1.0.10", + "rustls-native-certs 0.6.2", + "soketto", + "thiserror", + "tokio", + "tokio-rustls 0.23.4", + "tokio-util", + "tracing", + "webpki-roots", ] [[package]] -name = "jsonrpc-core-client" -version = "18.0.0" +name = "jsonrpsee-core" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b51da17abecbdab3e3d4f26b01c5ec075e88d3abe3ab3b05dc9aa69392764ec0" +checksum = "6e27462b21279edf9a6a91f46ffbe125e9cdc58b901d2e08bf59b31a47d7d0ab" dependencies = [ - "futures 0.3.21", - "jsonrpc-client-transports", + "anyhow", + "arrayvec 0.7.2", + "async-lock", + "async-trait", + "beef", + "futures-channel", + "futures-timer", + "futures-util", + "hyper", + "jsonrpsee-types", + "parking_lot 0.12.0", + "rand 0.8.5", + "rustc-hash", + "serde", + "serde_json", + "soketto", + "thiserror", + "tokio", + "tracing", ] [[package]] -name = "jsonrpc-derive" -version = "18.0.0" +name = "jsonrpsee-http-server" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b939a78fa820cdfcb7ee7484466746a7377760970f6f9c6fe19f9edcc8a38d2" +checksum = "7178f16eabd7154c094e24d295b9ee355ec1e5f24c328759c56255ff7bbd4548" dependencies = [ - "proc-macro-crate 0.1.5", - "proc-macro2", - "quote", - "syn", + "futures-channel", + "futures-util", + "globset", + "hyper", + "jsonrpsee-core", + "jsonrpsee-types", + "lazy_static", + "serde_json", + "tokio", + "tracing", + "unicase", ] [[package]] -name = "jsonrpc-http-server" -version = "18.0.0" +name = "jsonrpsee-proc-macros" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1dea6e07251d9ce6a552abfb5d7ad6bc290a4596c8dcc3d795fae2bbdc1f3ff" +checksum = "8b8d7f449cab3b747f12c3efc27f5cad537f3b597c6a3838b0fac628f4bf730a" dependencies = [ - "futures 0.3.21", - "hyper", - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "net2", - "parking_lot", - "unicase", + "proc-macro-crate 1.1.3", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "jsonrpc-ipc-server" -version = "18.0.0" +name = "jsonrpsee-types" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382bb0206323ca7cda3dcd7e245cea86d37d02457a02a975e3378fb149a48845" +checksum = "8fd11763134104122ddeb0f97e4bbe393058017dfb077db63fbf44b4dd0dd86e" dependencies = [ - "futures 0.3.21", - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "parity-tokio-ipc", - "parking_lot", - "tower-service", + "anyhow", + "beef", + "serde", + "serde_json", + "thiserror", + "tracing", ] [[package]] -name = "jsonrpc-pubsub" -version = "18.0.0" +name = "jsonrpsee-ws-client" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240f87695e6c6f62fb37f05c02c04953cf68d6408b8c1c89de85c7a0125b1011" +checksum = "76f15180afb3761c7a3a32c0a8b680788176dcfdfe725b24c1758c90b1d1595b" dependencies = [ - "futures 0.3.21", - "jsonrpc-core", - "lazy_static", - "log", - "parking_lot", - "rand 0.7.3", - "serde", + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", ] [[package]] -name = "jsonrpc-server-utils" -version = "18.0.0" +name = "jsonrpsee-ws-server" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4fdea130485b572c39a460d50888beb00afb3e35de23ccd7fad8ff19f0e0d4" +checksum = "dfb6c21556c551582b56e4e8e6e6249b0bbdb69bb7fa39efe9b9a6b54af9f206" dependencies = [ - "bytes 1.1.0", - "futures 0.3.21", - "globset", - "jsonrpc-core", - "lazy_static", - "log", + "futures-channel", + "futures-util", + "jsonrpsee-core", + "jsonrpsee-types", + "serde_json", + "soketto", "tokio", - "tokio-stream", "tokio-util", - "unicase", + "tracing", ] [[package]] -name = "jsonrpc-ws-server" -version = "18.0.0" +name = "k256" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f892c7d766369475ab7b0669f417906302d7c0fb521285c0a0c92e52e7c8e946" +checksum = "19c3a5e0a0b8450278feda242592512e09f61c72e018b8cd5c859482802daf2d" dependencies = [ - "futures 0.3.21", - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "parity-ws", - "parking_lot", - "slab", + "cfg-if 1.0.0", + "ecdsa", + "elliptic-curve", + "sec1", ] [[package]] name = "keccak" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" - -[[package]] -name = "kernel32-sys" -version = "0.2.2" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] +checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" [[package]] name = "kv-log-macro" @@ -2763,9 +2920,9 @@ dependencies = [ [[package]] name = "kvdb" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a3f58dc069ec0e205a27f5b45920722a46faed802a0541538241af6228f512" +checksum = "a301d8ecb7989d4a6e2c57a49baca77d353bdbf879909debe3f375fe25d61f86" dependencies = [ "parity-util-mem", "smallvec", @@ -2773,20 +2930,20 @@ dependencies = [ [[package]] name = "kvdb-memorydb" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b6b85fc643f5acd0bffb2cc8a6d150209379267af0d41db72170021841f9f5" +checksum = "ece7e668abd21387aeb6628130a6f4c802787f014fa46bc83221448322250357" dependencies = [ "kvdb", "parity-util-mem", - "parking_lot", + "parking_lot 0.12.0", ] [[package]] name = "kvdb-rocksdb" -version = "0.14.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1b6ea8f2536f504b645ad78419c8246550e19d2c3419a167080ce08edee35a" +checksum = "ca7fbdfd71cd663dceb0faf3367a99f8cf724514933e9867cec4995b6027cbc1" dependencies = [ "fs-swap", "kvdb", @@ -2794,7 +2951,7 @@ dependencies = [ "num_cpus", "owning_ref", "parity-util-mem", - "parking_lot", + "parking_lot 0.12.0", "regex", "rocksdb", "smallvec", @@ -2802,9 +2959,9 @@ dependencies = [ [[package]] name = "lazy-static-include" -version = "3.1.1" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6002fe04202bdaf9e8d82929a7c9ebfcf47d027d87f671818e8cf9ccb4029908" +checksum = "e559d5071cbb9743796593a892d96a7cc411d90aad711f57cc7dcbbf3893c10c" dependencies = [ "lazy_static", "manifest-dir-macros", @@ -2831,9 +2988,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.118" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e509672465a0504304aa87f9f176f2b2b716ed8fb105ebe5c02dc6dce96a94" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] name = "libloading" @@ -2842,7 +2999,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" dependencies = [ "cc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -2852,7 +3009,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" dependencies = [ "cfg-if 1.0.0", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -2863,14 +3020,18 @@ checksum = "33a33a362ce288760ec6a508b94caaec573ae7d3bbbd91b87aa0bad4456839db" [[package]] name = "libp2p" -version = "0.40.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bec54343492ba5940a6c555e512c6721139835d28c59bc22febece72dfd0d9d" +checksum = "475ce2ac4a9727e53a519f6ee05b38abfcba8f0d39c4d24f103d184e36fd5b0f" dependencies = [ "atomic", - "bytes 1.1.0", - "futures 0.3.21", + "bytes", + "futures", + "futures-timer", + "getrandom 0.2.6", + "instant", "lazy_static", + "libp2p-autonat", "libp2p-core", "libp2p-deflate", "libp2p-dns", @@ -2896,66 +3057,85 @@ dependencies = [ "libp2p-websocket", "libp2p-yamux", "multiaddr", - "parking_lot", + "parking_lot 0.12.0", "pin-project 1.0.10", + "rand 0.7.3", "smallvec", - "wasm-timer", ] [[package]] -name = "libp2p-core" -version = "0.30.2" +name = "libp2p-autonat" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86aad7d54df283db817becded03e611137698a6509d4237a96881976a162340c" +checksum = "a13b690e65046af6a09c0b27bd9508fa1cab0efce889de74b0b643b9d2a98f9a" dependencies = [ - "asn1_der", - "bs58", - "ed25519-dalek", - "either", - "fnv", - "futures 0.3.21", - "futures-timer 3.0.2", + "async-trait", + "futures", + "futures-timer", "instant", - "lazy_static", - "libsecp256k1", - "log", - "multiaddr", - "multihash 0.14.0", + "libp2p-core", + "libp2p-request-response", + "libp2p-swarm", + "log", + "prost", + "prost-build", + "rand 0.8.5", +] + +[[package]] +name = "libp2p-core" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db5b02602099fb75cb2d16f9ea860a320d6eb82ce41e95ab680912c454805cd5" +dependencies = [ + "asn1_der", + "bs58", + "ed25519-dalek", + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "lazy_static", + "libsecp256k1", + "log", + "multiaddr", + "multihash", "multistream-select", - "parking_lot", + "parking_lot 0.12.0", "pin-project 1.0.10", "prost", "prost-build", "rand 0.8.5", "ring", "rw-stream-sink", - "sha2 0.9.9", + "sha2 0.10.2", "smallvec", "thiserror", - "unsigned-varint 0.7.1", + "unsigned-varint", "void", "zeroize", ] [[package]] name = "libp2p-deflate" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51a800adb195f33de63f4b17b63fe64cfc23bf2c6a0d3d0d5321328664e65197" +checksum = "6b1d37f042f748e224f04785d0e987ae09a2aa518d6401d82d412dad83e360ed" dependencies = [ "flate2", - "futures 0.3.21", + "futures", "libp2p-core", ] [[package]] name = "libp2p-dns" -version = "0.30.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb8f89d15cb6e3c5bc22afff7513b11bab7856f2872d3cfba86f7f63a06bc498" +checksum = "066e33e854e10b5c93fc650458bf2179c7e0d143db260b0963e44a94859817f1" dependencies = [ "async-std-resolver", - "futures 0.3.21", + "futures", "libp2p-core", "log", "smallvec", @@ -2964,13 +3144,13 @@ dependencies = [ [[package]] name = "libp2p-floodsub" -version = "0.31.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aab3d7210901ea51b7bae2b581aa34521797af8c4ec738c980bda4a06434067f" +checksum = "733d3ea6ebe7a7a85df2bc86678b93f24b015fae5fe3b3acc4c400e795a55d2d" dependencies = [ "cuckoofilter", "fnv", - "futures 0.3.21", + "futures", "libp2p-core", "libp2p-swarm", "log", @@ -2982,83 +3162,87 @@ dependencies = [ [[package]] name = "libp2p-gossipsub" -version = "0.33.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfeead619eb5dac46e65acc78c535a60aaec803d1428cca6407c3a4fc74d698d" +checksum = "a90c989a7c0969c2ab63e898da9bc735e3be53fb4f376e9c045ce516bcc9f928" dependencies = [ - "asynchronous-codec 0.6.0", + "asynchronous-codec", "base64 0.13.0", "byteorder", - "bytes 1.1.0", + "bytes", "fnv", - "futures 0.3.21", + "futures", "hex_fmt", + "instant", "libp2p-core", "libp2p-swarm", "log", + "prometheus-client", "prost", "prost-build", "rand 0.7.3", "regex", - "sha2 0.9.9", + "sha2 0.10.2", "smallvec", - "unsigned-varint 0.7.1", + "unsigned-varint", "wasm-timer", ] [[package]] name = "libp2p-identify" -version = "0.31.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cca1275574183f288ff8b72d535d5ffa5ea9292ef7829af8b47dcb197c7b0dcd" +checksum = "c5ef5a5b57904c7c33d6713ef918d239dc6b7553458f3475d87f8a18e9c651c8" dependencies = [ - "futures 0.3.21", + "futures", + "futures-timer", "libp2p-core", "libp2p-swarm", "log", - "lru 0.6.6", + "lru 0.7.6", "prost", "prost-build", "smallvec", - "wasm-timer", ] [[package]] name = "libp2p-kad" -version = "0.32.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2297dc0ca285f3a09d1368bde02449e539b46f94d32d53233f53f6625bcd3ba" +checksum = "564e6bd64d177446399ed835b9451a8825b07929d6daa6a94e6405592974725e" dependencies = [ "arrayvec 0.5.2", - "asynchronous-codec 0.6.0", - "bytes 1.1.0", + "asynchronous-codec", + "bytes", "either", "fnv", - "futures 0.3.21", + "futures", + "futures-timer", + "instant", "libp2p-core", "libp2p-swarm", "log", "prost", "prost-build", "rand 0.7.3", - "sha2 0.9.9", + "sha2 0.10.2", "smallvec", + "thiserror", "uint", - "unsigned-varint 0.7.1", + "unsigned-varint", "void", - "wasm-timer", ] [[package]] name = "libp2p-mdns" -version = "0.32.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c864b64bdc8a84ff3910a0df88e6535f256191a450870f1e7e10cbf8e64d45" +checksum = "611ae873c8e280ccfab0d57c7a13cac5644f364529e233114ff07863946058b0" dependencies = [ "async-io", "data-encoding", "dns-parser", - "futures 0.3.21", + "futures", "if-watch", "lazy_static", "libp2p-core", @@ -3066,58 +3250,60 @@ dependencies = [ "log", "rand 0.8.5", "smallvec", - "socket2 0.4.4", + "socket2", "void", ] [[package]] name = "libp2p-metrics" -version = "0.1.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4af432fcdd2f8ba4579b846489f8f0812cfd738ced2c0af39df9b1c48bbb6ab2" +checksum = "985be799bb3796e0c136c768208c3c06604a38430571906a13dcfeda225a3b9d" dependencies = [ "libp2p-core", + "libp2p-gossipsub", "libp2p-identify", "libp2p-kad", "libp2p-ping", + "libp2p-relay", "libp2p-swarm", - "open-metrics-client", + "prometheus-client", ] [[package]] name = "libp2p-mplex" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2cd64ef597f40e14bfce0497f50ecb63dd6d201c61796daeb4227078834fbf" +checksum = "442eb0c9fff0bf22a34f015724b4143ce01877e079ed0963c722d94c07c72160" dependencies = [ - "asynchronous-codec 0.6.0", - "bytes 1.1.0", - "futures 0.3.21", + "asynchronous-codec", + "bytes", + "futures", "libp2p-core", "log", "nohash-hasher", - "parking_lot", + "parking_lot 0.12.0", "rand 0.7.3", "smallvec", - "unsigned-varint 0.7.1", + "unsigned-varint", ] [[package]] name = "libp2p-noise" -version = "0.33.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8772c7a99088221bb7ca9c5c0574bf55046a7ab4c319f3619b275f28c8fb87a" +checksum = "9dd7e0c94051cda67123be68cf6b65211ba3dde7277be9068412de3e7ffd63ef" dependencies = [ - "bytes 1.1.0", + "bytes", "curve25519-dalek 3.2.0", - "futures 0.3.21", + "futures", "lazy_static", "libp2p-core", "log", "prost", "prost-build", "rand 0.8.5", - "sha2 0.9.9", + "sha2 0.10.2", "snow", "static_assertions", "x25519-dalek", @@ -3126,33 +3312,34 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.31.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80ef7b0ec5cf06530d9eb6cf59ae49d46a2c45663bde31c25a12f682664adbcf" +checksum = "bf57a3c2e821331dda9fe612d4654d676ab6e33d18d9434a18cced72630df6ad" dependencies = [ - "futures 0.3.21", + "futures", + "futures-timer", + "instant", "libp2p-core", "libp2p-swarm", "log", "rand 0.7.3", "void", - "wasm-timer", ] [[package]] name = "libp2p-plaintext" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fba1a6ff33e4a274c89a3b1d78b9f34f32af13265cc5c46c16938262d4e945a" +checksum = "962c0fb0e7212fb96a69b87f2d09bcefd317935239bdc79cda900e7a8897a3fe" dependencies = [ - "asynchronous-codec 0.6.0", - "bytes 1.1.0", - "futures 0.3.21", + "asynchronous-codec", + "bytes", + "futures", "libp2p-core", "log", "prost", "prost-build", - "unsigned-varint 0.7.1", + "unsigned-varint", "void", ] @@ -3162,99 +3349,106 @@ version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f1a458bbda880107b5b36fcb9b5a1ef0c329685da0e203ed692a8ebe64cc92c" dependencies = [ - "futures 0.3.21", + "futures", "log", "pin-project 1.0.10", "rand 0.7.3", "salsa20", - "sha3", + "sha3 0.9.1", ] [[package]] name = "libp2p-relay" -version = "0.4.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2852b61c90fa8ce3c8fcc2aba76e6cefc20d648f9df29157d6b3a916278ef3e3" +checksum = "3aa754cb7bccef51ebc3c458c6bbcef89d83b578a9925438389be841527d408f" dependencies = [ - "asynchronous-codec 0.6.0", - "bytes 1.1.0", - "futures 0.3.21", - "futures-timer 3.0.2", + "asynchronous-codec", + "bytes", + "either", + "futures", + "futures-timer", + "instant", "libp2p-core", "libp2p-swarm", "log", "pin-project 1.0.10", "prost", "prost-build", - "rand 0.7.3", + "rand 0.8.5", "smallvec", - "unsigned-varint 0.7.1", + "static_assertions", + "thiserror", + "unsigned-varint", "void", - "wasm-timer", ] [[package]] name = "libp2p-rendezvous" -version = "0.1.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14a6d2b9e7677eff61dc3d2854876aaf3976d84a01ef6664b610c77a0c9407c5" +checksum = "bbd0baab894c5b84da510b915d53264d566c3c35889f09931fe9edbd2a773bee" dependencies = [ - "asynchronous-codec 0.6.0", + "asynchronous-codec", "bimap", - "futures 0.3.21", + "futures", + "futures-timer", + "instant", "libp2p-core", "libp2p-swarm", "log", "prost", "prost-build", "rand 0.8.5", - "sha2 0.9.9", + "sha2 0.10.2", "thiserror", - "unsigned-varint 0.7.1", + "unsigned-varint", "void", - "wasm-timer", ] [[package]] name = "libp2p-request-response" -version = "0.13.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a877a4ced6d46bf84677e1974e8cf61fb434af73b2e96fb48d6cb6223a4634d8" +checksum = "b5e6a6fc6c9ad95661f46989473b34bd2993d14a4de497ff3b2668a910d4b869" dependencies = [ "async-trait", - "bytes 1.1.0", - "futures 0.3.21", + "bytes", + "futures", + "instant", "libp2p-core", "libp2p-swarm", "log", - "lru 0.7.2", "rand 0.7.3", "smallvec", - "unsigned-varint 0.7.1", - "wasm-timer", + "unsigned-varint", ] [[package]] name = "libp2p-swarm" -version = "0.31.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f5184a508f223bc100a12665517773fb8730e9f36fc09eefb670bf01b107ae9" +checksum = "8f0c69ad9e8f7c5fc50ad5ad9c7c8b57f33716532a2b623197f69f93e374d14c" dependencies = [ "either", - "futures 0.3.21", + "fnv", + "futures", + "futures-timer", + "instant", "libp2p-core", "log", + "pin-project 1.0.10", "rand 0.7.3", "smallvec", + "thiserror", "void", - "wasm-timer", ] [[package]] name = "libp2p-swarm-derive" -version = "0.25.0" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "072c290f727d39bdc4e9d6d1c847978693d25a673bd757813681e33e5f6c00c2" +checksum = "daf2fe8c80b43561355f4d51875273b5b6dfbac37952e8f64b1270769305c9d7" dependencies = [ "quote", "syn", @@ -3262,40 +3456,40 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7399c5b6361ef525d41c11fcf51635724f832baf5819b30d3d873eabb4fbae4b" +checksum = "193447aa729c85aac2376828df76d171c1a589c9e6b58fcc7f9d9a020734122c" dependencies = [ "async-io", - "futures 0.3.21", - "futures-timer 3.0.2", + "futures", + "futures-timer", "if-watch", "ipnet", "libc", "libp2p-core", "log", - "socket2 0.4.4", + "socket2", ] [[package]] name = "libp2p-uds" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8b7563e46218165dfd60f64b96f7ce84590d75f53ecbdc74a7dd01450dc5973" +checksum = "24bdab114f7f2701757d6541266e1131b429bbae382008f207f2114ee4222dcb" dependencies = [ "async-std", - "futures 0.3.21", + "futures", "libp2p-core", "log", ] [[package]] name = "libp2p-wasm-ext" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1008a302b73c5020251f9708c653f5ed08368e530e247cc9cd2f109ff30042cf" +checksum = "4f6ea0f84a967ef59a16083f222c18115ae2e91db69809dce275df62e101b279" dependencies = [ - "futures 0.3.21", + "futures", "js-sys", "libp2p-core", "parity-send-wrapper", @@ -3305,45 +3499,48 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.31.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e12df82d1ed64969371a9e65ea92b91064658604cc2576c2757f18ead9a1cf" +checksum = "c932834c3754501c368d1bf3d0fb458487a642b90fc25df082a3a2f3d3b32e37" dependencies = [ "either", - "futures 0.3.21", + "futures", "futures-rustls", "libp2p-core", "log", "quicksink", "rw-stream-sink", "soketto", - "url 2.2.2", + "url", "webpki-roots", ] [[package]] name = "libp2p-yamux" -version = "0.34.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7362abb8867d7187e7e93df17f460d554c997fc5c8ac57dc1259057f6889af" +checksum = "be902ebd89193cd020e89e89107726a38cfc0d16d18f613f4a37d046e92c7517" dependencies = [ - "futures 0.3.21", + "futures", "libp2p-core", - "parking_lot", + "parking_lot 0.12.0", "thiserror", "yamux", ] [[package]] name = "librocksdb-sys" -version = "6.20.3" +version = "0.6.1+6.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c309a9d2470844aceb9a4a098cf5286154d20596868b75a6b36357d2bb9ca25d" +checksum = "81bc587013734dadb7cf23468e531aa120788b87243648be42e2d3a072186291" dependencies = [ "bindgen", + "bzip2-sys", "cc", "glob", "libc", + "libz-sys", + "tikv-jemalloc-sys", ] [[package]] @@ -3396,9 +3593,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.3" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66" +checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" dependencies = [ "cc", "pkg-config", @@ -3432,24 +3629,25 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.0.28" +version = "0.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687387ff42ec7ea4f2149035a5675fedb675d26f98db90a1846ac63d3addb5f5" +checksum = "5284f00d480e1c39af34e72f8ad60b94f47007e3481cd3b731c1d67190ddc7b7" [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if 1.0.0", "value-bag", @@ -3466,9 +3664,9 @@ dependencies = [ [[package]] name = "lru" -version = "0.7.2" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "274353858935c992b13c0ca408752e2121da852d07dec7ce5f108c77dfa14d1f" +checksum = "8015d95cb7b2ddd3c0d32ca38283ceb1eea09b4713ee380bceb942d85a244228" dependencies = [ "hashbrown 0.11.2", ] @@ -3484,9 +3682,9 @@ dependencies = [ [[package]] name = "lz4" -version = "1.23.2" +version = "1.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac20ed6991e01bf6a2e68cc73df2b389707403662a8ba89f68511fb340f724c" +checksum = "4edcb94251b1c375c459e5abe9fb0168c1c826c3370172684844f8f3f8d1a885" dependencies = [ "libc", "lz4-sys", @@ -3494,9 +3692,9 @@ dependencies = [ [[package]] name = "lz4-sys" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca79aa95d8b3226213ad454d328369853be3a1382d89532a854f4d69640acae" +checksum = "d7be8908e2ed6f31c02db8a9fa962f03e36c53fbfde437363eae3306b85d7e17" dependencies = [ "cc", "libc", @@ -3513,9 +3711,9 @@ dependencies = [ [[package]] name = "manifest-dir-macros" -version = "0.1.11" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca7bbc41d799583acd24ed05a9c3db3c9275c93491b4e7cde0e609bb9598f2f0" +checksum = "f08150cf2bab1fc47c2196f4f41173a27fcd0f684165e5458c0046b53a472e2f" dependencies = [ "once_cell", "proc-macro2", @@ -3561,9 +3759,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memmap2" @@ -3594,12 +3792,12 @@ dependencies = [ [[package]] name = "memory-db" -version = "0.27.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de006e09d04fc301a5f7e817b75aa49801c4479a8af753764416b085337ddcc5" +checksum = "6566c70c1016f525ced45d7b7f97730a2bafb037c788211d0c186ef5b2189f0a" dependencies = [ "hash-db", - "hashbrown 0.11.2", + "hashbrown 0.12.1", "parity-util-mem", ] @@ -3651,77 +3849,23 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" dependencies = [ "adler", - "autocfg", -] - -[[package]] -name = "mio" -version = "0.6.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" -dependencies = [ - "cfg-if 0.1.10", - "fuchsia-zircon", - "fuchsia-zircon-sys", - "iovec", - "kernel32-sys", - "libc", - "log", - "miow 0.2.2", - "net2", - "slab", - "winapi 0.2.8", ] [[package]] name = "mio" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba272f85fa0b41fc91872be579b3bbe0f56b792aa361a380eb669469f68dafb2" +checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799" dependencies = [ "libc", "log", - "miow 0.3.7", - "ntapi", - "winapi 0.3.9", -] - -[[package]] -name = "mio-extras" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" -dependencies = [ - "lazycell", - "log", - "mio 0.6.23", - "slab", -] - -[[package]] -name = "miow" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" -dependencies = [ - "kernel32-sys", - "net2", - "winapi 0.2.8", - "ws2_32-sys", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi 0.3.9", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", ] [[package]] @@ -3732,27 +3876,27 @@ checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" [[package]] name = "multiaddr" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ee4ea82141951ac6379f964f71b20876d43712bea8faf6dd1a375e08a46499" +checksum = "3c580bfdd8803cce319b047d239559a22f809094aaea4ac13902a1fdcfcd4261" dependencies = [ "arrayref", "bs58", "byteorder", "data-encoding", - "multihash 0.14.0", - "percent-encoding 2.1.0", + "multihash", + "percent-encoding", "serde", "static_assertions", - "unsigned-varint 0.7.1", - "url 2.2.2", + "unsigned-varint", + "url", ] [[package]] name = "multibase" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b78c60039650ff12e140ae867ef5299a58e19dded4d334c849dc7177083667e2" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" dependencies = [ "base-x", "data-encoding", @@ -3761,41 +3905,28 @@ dependencies = [ [[package]] name = "multihash" -version = "0.13.2" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dac63698b887d2d929306ea48b63760431ff8a24fac40ddb22f9c7f49fb7cab" +checksum = "e3db354f401db558759dfc1e568d010a5d4146f4d3f637be1275ec4a3cf09689" dependencies = [ - "blake2b_simd", + "blake2b_simd 1.0.0", "blake2s_simd", "blake3", - "digest 0.9.0", - "generic-array 0.14.5", - "multihash-derive", - "sha2 0.9.9", - "sha3", - "unsigned-varint 0.5.1", -] - -[[package]] -name = "multihash" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "752a61cd890ff691b4411423d23816d5866dd5621e4d1c5687a53b94b5a979d8" -dependencies = [ - "digest 0.9.0", - "generic-array 0.14.5", + "core2", + "digest 0.10.3", "multihash-derive", - "sha2 0.9.9", - "unsigned-varint 0.7.1", + "sha2 0.10.2", + "sha3 0.10.1", + "unsigned-varint", ] [[package]] name = "multihash-derive" -version = "0.7.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "424f6e86263cd5294cbd7f1e95746b95aca0e0d66bff31e5a40d6baa87b4aa99" +checksum = "fc076939022111618a5026d3be019fd8b366e76314538ff9a1b59ffbcbf98bcd" dependencies = [ - "proc-macro-crate 1.1.2", + "proc-macro-crate 1.1.3", "proc-macro-error", "proc-macro2", "quote", @@ -3811,16 +3942,16 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "multistream-select" -version = "0.10.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56a336acba8bc87c8876f6425407dbbe6c417bf478b22015f8fb0994ef3bc0ab" +checksum = "363a84be6453a70e63513660f4894ef815daf88e3356bffcda9ca27d810ce83b" dependencies = [ - "bytes 1.1.0", - "futures 0.3.21", + "bytes", + "futures", "log", "pin-project 1.0.10", "smallvec", - "unsigned-varint 0.7.1", + "unsigned-varint", ] [[package]] @@ -3854,18 +3985,18 @@ dependencies = [ [[package]] name = "names" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a8690bf09abf659851e58cd666c3d37ac6af07c2bd7a9e332cfba471715775" +checksum = "e7d66043b25d4a6cccb23619d10c19c25304b355a7dccd4a8e11423dd2382146" dependencies = [ "rand 0.8.5", ] [[package]] name = "native-tls" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" dependencies = [ "lazy_static", "libc", @@ -3888,14 +4019,81 @@ dependencies = [ ] [[package]] -name = "net2" -version = "0.2.37" +name = "netlink-packet-core" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" +checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" dependencies = [ - "cfg-if 0.1.10", + "anyhow", + "byteorder", + "libc", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-route" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "733ea73609acfd7fa7ddadfb7bf709b0471668c456ad9513685af543a06342b2" +dependencies = [ + "anyhow", + "bitflags", + "byteorder", + "libc", + "netlink-packet-core", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-utils" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25af9cf0dc55498b7bd94a1508af7a78706aa0ab715a73c5169273e03c84845e" +dependencies = [ + "anyhow", + "byteorder", + "paste", + "thiserror", +] + +[[package]] +name = "netlink-proto" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8785b8141e8432aa45fceb922a7e876d7da3fad37fa7e7ec702ace3aa0826b" +dependencies = [ + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "tokio", +] + +[[package]] +name = "netlink-sys" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e4c9f9547a08241bee7b6558b9b98e1f290d187de8b7cfca2bbb4937bcaa8f8" +dependencies = [ + "async-io", + "bytes", + "futures", + "libc", + "log", +] + +[[package]] +name = "nix" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" +dependencies = [ + "bitflags", + "cc", + "cfg-if 1.0.0", "libc", - "winapi 0.3.9", + "memoffset", ] [[package]] @@ -3912,22 +4110,12 @@ checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" [[package]] name = "nom" -version = "7.1.0" +version = "7.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" dependencies = [ "memchr", "minimal-lexical", - "version_check", -] - -[[package]] -name = "ntapi" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" -dependencies = [ - "winapi 0.3.9", ] [[package]] @@ -3965,18 +4153,28 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085" +checksum = "97fbc387afefefd5e9e39493299f3069e14a140dd34dc19b4c1c1a8fddb6a790" dependencies = [ "num-traits", ] +[[package]] +name = "num-format" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bafe4179722c2894288ee77a9f044f02811c86af699344c498b0840c698a2465" +dependencies = [ + "arrayvec 0.4.12", + "itoa 0.4.8", +] + [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", @@ -4021,9 +4219,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", "libm", @@ -4056,11 +4254,20 @@ dependencies = [ "memchr", ] +[[package]] +name = "object" +version = "0.28.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.9.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" +checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" [[package]] name = "opaque-debug" @@ -4075,42 +4282,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] -name = "open-metrics-client" -version = "0.12.0" +name = "openssl" +version = "0.10.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7337d80c23c2d8b1349563981bc4fb531220733743ba8115454a67b181173f0d" +checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" dependencies = [ - "dtoa", - "itoa 0.4.8", - "open-metrics-client-derive-text-encode", - "owning_ref", + "bitflags", + "cfg-if 1.0.0", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", ] [[package]] -name = "open-metrics-client-derive-text-encode" -version = "0.1.1" +name = "openssl-macros" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c83b586f00268c619c1cb3340ec1a6f59dd9ba1d9833a273a68e6d5cd8ffc" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" dependencies = [ "proc-macro2", "quote", "syn", ] -[[package]] -name = "openssl" -version = "0.10.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" -dependencies = [ - "bitflags", - "cfg-if 1.0.0", - "foreign-types", - "libc", - "once_cell", - "openssl-sys", -] - [[package]] name = "openssl-probe" version = "0.1.5" @@ -4119,9 +4315,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.72" +version = "0.9.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb" +checksum = "9d5fd19fb3e0a8191c1e34935718976a3e70c112ab9a24af6d7cadccd9d90bc0" dependencies = [ "autocfg", "cc", @@ -4132,9 +4328,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "2.4.0" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb2e1c3ee07430c2cf76151675e583e0f19985fa6efae47d6848a3e2c824f85" +checksum = "21326818e99cfe6ce1e524c2a805c189a99b5ae555a35d19f9a284b427d86afa" [[package]] name = "owning_ref" @@ -4148,12 +4344,12 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-support", "frame-system", "pallet-timestamp", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-application-crypto", "sp-consensus-aura", @@ -4164,12 +4360,12 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-support", "frame-system", "impl-trait-for-tuples", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-authorship", "sp-runtime", @@ -4179,13 +4375,13 @@ dependencies = [ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-runtime", "sp-std", @@ -4194,7 +4390,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-benchmarking", "frame-support", @@ -4202,7 +4398,7 @@ dependencies = [ "log", "pallet-authorship", "pallet-session", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-application-crypto", "sp-core", @@ -4218,29 +4414,27 @@ dependencies = [ name = "pallet-parentchain" version = "3.0.0" dependencies = [ - "env_logger 0.9.0", "frame-benchmarking", "frame-support", "frame-system", - "log", "pallet-registry", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", + "skw-blockchain-primitives", "sp-core", "sp-io", "sp-runtime", "sp-std", - "test-env-log", ] [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-support", "frame-system", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "safe-mix", "scale-info", "sp-runtime", @@ -4251,68 +4445,62 @@ dependencies = [ name = "pallet-registry" version = "3.0.0" dependencies = [ - "env_logger 0.9.0", "frame-benchmarking", "frame-support", "frame-system", - "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", + "skw-blockchain-primitives", "sp-core", "sp-io", "sp-runtime", "sp-std", - "test-env-log", ] [[package]] name = "pallet-s-contract" version = "3.0.0" dependencies = [ - "env_logger 0.9.0", "frame-benchmarking", "frame-support", "frame-system", - "log", "pallet-secrets", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", + "skw-blockchain-primitives", "sp-core", "sp-io", "sp-runtime", "sp-std", - "test-env-log", ] [[package]] name = "pallet-secrets" version = "3.0.0" dependencies = [ - "env_logger 0.9.0", "frame-benchmarking", "frame-support", "frame-system", - "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", + "skw-blockchain-primitives", "sp-core", "sp-io", "sp-runtime", "sp-std", - "test-env-log", ] [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-support", "frame-system", "impl-trait-for-tuples", "log", "pallet-timestamp", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-core", "sp-io", @@ -4326,11 +4514,11 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-support", "frame-system", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-io", "sp-runtime", @@ -4340,13 +4528,13 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-inherents", "sp-io", @@ -4358,11 +4546,11 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-support", "frame-system", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "serde", "smallvec", @@ -4375,13 +4563,11 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", + "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sp-api", "sp-blockchain", "sp-core", @@ -4392,22 +4578,38 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "pallet-transaction-payment", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sp-api", "sp-runtime", ] +[[package]] +name = "pallet-treasury" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "pallet-balances", + "parity-scale-codec 3.1.2", + "scale-info", + "serde", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-support", "frame-system", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-core", "sp-io", @@ -4417,9 +4619,9 @@ dependencies = [ [[package]] name = "parity-db" -version = "0.3.6" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68de01cff53da5574397233383dd7f5c15ee958c348245765ea8cb09f2571e6b" +checksum = "55a7901b85874402471e131de3332dde0e51f38432c69a3853627c8e25433048" dependencies = [ "blake2-rfc", "crc32fast", @@ -4429,7 +4631,7 @@ dependencies = [ "log", "lz4", "memmap2 0.2.3", - "parking_lot", + "parking_lot 0.11.2", "rand 0.8.5", "snap", ] @@ -4441,10 +4643,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373b1a4c1338d9cd3d1fa53b3a11bdab5ab6bd80a20f7f7becd76953ae2be909" dependencies = [ "arrayvec 0.7.2", - "bitvec", + "bitvec 0.20.4", "byte-slice-cast", "impl-trait-for-tuples", - "parity-scale-codec-derive", + "parity-scale-codec-derive 2.3.1", + "serde", +] + +[[package]] +name = "parity-scale-codec" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b44461635bbb1a0300f100a841e571e7d919c81c73075ef5d152ffdb521066" +dependencies = [ + "arrayvec 0.7.2", + "bitvec 1.0.0", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive 3.1.2", "serde", ] @@ -4454,7 +4670,19 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1557010476e0595c9b568d16dcfb81b93cdeb157612726f5170d31aa707bed27" dependencies = [ - "proc-macro-crate 1.1.2", + "proc-macro-crate 1.1.3", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c45ed1f39709f5a89338fab50e59816b2e8815f5bb58276e7ddf9afd495f73f8" +dependencies = [ + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn", @@ -4478,34 +4706,20 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" -[[package]] -name = "parity-tokio-ipc" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9981e32fb75e004cc148f5fb70342f393830e0a4aa62e3cc93b50976218d42b6" -dependencies = [ - "futures 0.3.21", - "libc", - "log", - "rand 0.7.3", - "tokio", - "winapi 0.3.9", -] - [[package]] name = "parity-util-mem" -version = "0.10.2" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f4cb4e169446179cbc6b8b6320cc9fca49bd2e94e8db25f25f200a8ea774770" +checksum = "c32561d248d352148124f036cac253a644685a21dc9fea383eb4907d7bd35a8f" dependencies = [ "cfg-if 1.0.0", - "hashbrown 0.11.2", + "hashbrown 0.12.1", "impl-trait-for-tuples", "parity-util-mem-derive", - "parking_lot", - "primitive-types", + "parking_lot 0.12.0", + "primitive-types 0.11.1", "smallvec", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -4534,24 +4748,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" -[[package]] -name = "parity-ws" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5983d3929ad50f12c3eb9a6743f19d691866ecd44da74c0a3308c3f8a56df0c6" -dependencies = [ - "byteorder", - "bytes 0.4.12", - "httparse", - "log", - "mio 0.6.23", - "mio-extras", - "rand 0.7.3", - "sha-1 0.8.2", - "slab", - "url 2.2.2", -] - [[package]] name = "parking" version = "2.0.0" @@ -4566,7 +4762,17 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", - "parking_lot_core", + "parking_lot_core 0.8.5", +] + +[[package]] +name = "parking_lot" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.3", ] [[package]] @@ -4578,16 +4784,29 @@ dependencies = [ "cfg-if 1.0.0", "instant", "libc", - "redox_syscall", + "redox_syscall 0.2.13", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall 0.2.13", "smallvec", - "winapi 0.3.9", + "windows-sys", ] [[package]] name = "paste" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5" +checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" [[package]] name = "pbkdf2" @@ -4613,12 +4832,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" - [[package]] name = "percent-encoding" version = "2.1.0" @@ -4670,9 +4883,9 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f" +checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" dependencies = [ "fixedbitset", "indexmap", @@ -4726,9 +4939,9 @@ checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" [[package]] name = "pin-project-lite" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -4738,9 +4951,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "platforms" @@ -4758,7 +4971,7 @@ dependencies = [ "libc", "log", "wepoll-ffi", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -4767,7 +4980,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" dependencies = [ - "cpufeatures 0.2.1", + "cpufeatures", "opaque-debug 0.3.0", "universal-hash", ] @@ -4779,7 +4992,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" dependencies = [ "cfg-if 1.0.0", - "cpufeatures 0.2.1", + "cpufeatures", "opaque-debug 0.3.0", "universal-hash", ] @@ -4790,6 +5003,20 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +[[package]] +name = "prettytable-rs" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fd04b170004fa2daccf418a7f8253aaf033c27760b5f225889024cf66d7ac2e" +dependencies = [ + "atty", + "csv", + "encode_unicode", + "lazy_static", + "term", + "unicode-width", +] + [[package]] name = "primitive-types" version = "0.10.1" @@ -4797,7 +5024,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" dependencies = [ "fixed-hash", - "impl-codec", + "impl-codec 0.5.1", + "uint", +] + +[[package]] +name = "primitive-types" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28720988bff275df1f51b171e1b2a18c30d194c4d2b61defdacecd625a5d94a" +dependencies = [ + "fixed-hash", + "impl-codec 0.6.0", "impl-serde", "scale-info", "uint", @@ -4814,9 +5052,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dada8c9981fcf32929c3c0f0cd796a9284aca335565227ed88c83babb1d43dc" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" dependencies = [ "thiserror", "toml", @@ -4854,34 +5092,57 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro2" -version = "1.0.36" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] name = "prometheus" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f64969ffd5dd8f39bd57a68ac53c163a095ed9d0fb707146da1b27025a3504" +checksum = "cface98dfa6d645ea4c789839f176e4b072265d085bfcc48eaa8d137f58d3c39" dependencies = [ "cfg-if 1.0.0", "fnv", "lazy_static", "memchr", - "parking_lot", + "parking_lot 0.12.0", "thiserror", ] +[[package]] +name = "prometheus-client" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9a896938cc6018c64f279888b8c7559d3725210d5db9a3a1ee6bc7188d51d34" +dependencies = [ + "dtoa", + "itoa 1.0.2", + "owning_ref", + "prometheus-client-derive-text-encode", +] + +[[package]] +name = "prometheus-client-derive-text-encode" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8e12d01b9d66ad9eb4529c57666b6263fc1993cb30261d83ead658fdd932652" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "prost" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" dependencies = [ - "bytes 1.1.0", + "bytes", "prost-derive", ] @@ -4891,8 +5152,8 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5" dependencies = [ - "bytes 1.1.0", - "heck", + "bytes", + "heck 0.3.3", "itertools", "lazy_static", "log", @@ -4924,15 +5185,15 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a" dependencies = [ - "bytes 1.1.0", + "bytes", "prost", ] [[package]] name = "psm" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eca0fa5dd7c4c96e184cec588f0b1db1ee3165e678db21c09793105acb17e6f" +checksum = "871372391786ccec00d3c5d3d6608905b3d4db263639cfe075d3b60a736d115a" dependencies = [ "cc", ] @@ -4954,12 +5215,6 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - [[package]] name = "quickcheck" version = "0.9.2" @@ -5007,9 +5262,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ "proc-macro2", ] @@ -5020,6 +5275,12 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.7.3" @@ -5031,7 +5292,7 @@ dependencies = [ "rand_chacha 0.2.2", "rand_core 0.5.1", "rand_hc", - "rand_pcg", + "rand_pcg 0.2.1", ] [[package]] @@ -5080,7 +5341,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.4", + "getrandom 0.2.6", ] [[package]] @@ -5111,6 +5372,15 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rand_pcg" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" +dependencies = [ + "rand_core 0.6.3", +] + [[package]] name = "rand_xorshift" version = "0.3.0" @@ -5128,9 +5398,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" dependencies = [ "autocfg", "crossbeam-deque", @@ -5140,50 +5410,67 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" dependencies = [ "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "lazy_static", "num_cpus", ] [[package]] name = "redox_syscall" -version = "0.2.10" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "redox_syscall" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.4.0" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" +dependencies = [ + "getrandom 0.1.16", + "redox_syscall 0.1.57", + "rust-argon2", +] + +[[package]] +name = "redox_users" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.4", - "redox_syscall", + "getrandom 0.2.6", + "redox_syscall 0.2.13", + "thiserror", ] [[package]] name = "ref-cast" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300f2a835d808734ee295d45007adacb9ebb29dd3ae2424acfa17930cae541da" +checksum = "685d58625b6c2b83e4cc88a27c4bf65adb7b6b16dbdc413e515c9405b47432ab" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c38e3aecd2b21cb3959637b883bb3714bc7e43f0268b9a29d3743ee3e55cdd2" +checksum = "a043824e29c94169374ac5183ac0ed43f5724dc4556b19568007486bd840fa1f" dependencies = [ "proc-macro2", "quote", @@ -5192,9 +5479,9 @@ dependencies = [ [[package]] name = "regalloc" -version = "0.0.32" +version = "0.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6304468554ed921da3d32c355ea107b8d13d7b8996c3adfb7aab48d3bc321f4" +checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" dependencies = [ "log", "rustc-hash", @@ -5203,9 +5490,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.5.4" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" dependencies = [ "aho-corasick", "memchr", @@ -5223,9 +5510,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" [[package]] name = "region" @@ -5236,7 +5523,24 @@ dependencies = [ "bitflags", "libc", "mach", - "winapi 0.3.9", + "winapi", +] + +[[package]] +name = "remote-externalities" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" +dependencies = [ + "env_logger 0.9.0", + "jsonrpsee", + "log", + "parity-scale-codec 3.1.2", + "serde", + "serde_json", + "sp-core", + "sp-io", + "sp-runtime", + "sp-version", ] [[package]] @@ -5245,17 +5549,17 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] name = "reqwest" -version = "0.11.9" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f242f1488a539a79bac6dbe7c8609ae43b7914b7736210f239a37cccb32525" +checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" dependencies = [ "base64 0.13.0", - "bytes 1.1.0", + "bytes", "encoding_rs", "futures-core", "futures-util", @@ -5271,18 +5575,18 @@ dependencies = [ "mime", "mime_guess", "native-tls", - "percent-encoding 2.1.0", - "pin-project-lite 0.2.8", + "percent-encoding", + "pin-project-lite 0.2.9", "serde", "serde_json", "serde_urlencoded", "tokio", "tokio-native-tls", - "url 2.2.2", + "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.7.0", + "winreg 0.10.1", ] [[package]] @@ -5292,14 +5596,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" dependencies = [ "hostname", - "quick-error 1.2.3", + "quick-error", ] [[package]] name = "retain_mut" -version = "0.1.6" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4389f1d5789befaf6029ebd9f7dac4af7f7e3d61b69d4f30e2ac02b57e7712b0" + +[[package]] +name = "rfc6979" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51dd4445360338dab5116712bee1388dc727991d51969558a8882ab552e6db30" +checksum = "96ef608575f6392792f9ecf7890c00086591d29a83910939d430753f7c050525" +dependencies = [ + "crypto-bigint", + "hmac 0.11.0", + "zeroize", +] [[package]] name = "ring" @@ -5313,7 +5628,7 @@ dependencies = [ "spin", "untrusted", "web-sys", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -5329,9 +5644,9 @@ dependencies = [ [[package]] name = "rocksdb" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a62eca5cacf2c8261128631bed9f045598d40bfbe4b29f5163f0f802f8f44a7" +checksum = "620f4129485ff1a7128d184bc687470c21c7951b64779ebc9cfdad3dcd920290" dependencies = [ "libc", "librocksdb-sys", @@ -5344,24 +5659,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffc936cf8a7ea60c58f030fd36a612a48f440610214dc54bc36431f9ea0c3efb" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] -name = "rsix" -version = "0.23.9" +name = "rtnetlink" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f64c5788d5aab8b75441499d99576a24eb09f76fb267b36fec7e3d970c66431" +checksum = "6f54290e54521dac3de4149d83ddf9f62a359b3cc93bcb494a794a41e6f4744b" dependencies = [ - "bitflags", - "cc", - "errno", - "io-lifetimes", - "itoa 0.4.8", - "libc", - "linux-raw-sys", - "once_cell", - "rustc_version 0.4.0", + "async-global-executor", + "futures", + "log", + "netlink-packet-route", + "netlink-proto", + "nix", + "thiserror", +] + +[[package]] +name = "rust-argon2" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" +dependencies = [ + "base64 0.13.0", + "blake2b_simd 0.5.11", + "constant_time_eq", + "crossbeam-utils", ] [[package]] @@ -5393,20 +5718,25 @@ dependencies = [ [[package]] name = "rustc_version" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 0.11.0", + "semver 1.0.9", ] [[package]] -name = "rustc_version" -version = "0.4.0" +name = "rustix" +version = "0.33.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "938a344304321a9da4973b9ff4f9f8db9caf4597dfd9dda6a60b523340a0fff0" dependencies = [ - "semver 1.0.5", + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "winapi", ] [[package]] @@ -5418,8 +5748,20 @@ dependencies = [ "base64 0.13.0", "log", "ring", - "sct", - "webpki", + "sct 0.6.1", + "webpki 0.21.4", +] + +[[package]] +name = "rustls" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" +dependencies = [ + "log", + "ring", + "sct 0.7.0", + "webpki 0.22.0", ] [[package]] @@ -5429,11 +5771,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" dependencies = [ "openssl-probe", - "rustls", + "rustls 0.19.1", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" +dependencies = [ + "openssl-probe", + "rustls-pemfile", "schannel", "security-framework", ] +[[package]] +name = "rustls-pemfile" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7522c9de787ff061458fe9a829dc790a3f5b22dc571694fc5883f448b94d9a9" +dependencies = [ + "base64 0.13.0", +] + [[package]] name = "rustversion" version = "1.0.6" @@ -5446,16 +5809,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4da5fcb054c46f5a5dff833b129285a93d3f0179531735e6c866e8cc307d2020" dependencies = [ - "futures 0.3.21", + "futures", "pin-project 0.4.29", "static_assertions", ] [[package]] name = "ryu" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" [[package]] name = "safe-mix" @@ -5487,7 +5850,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "log", "sp-core", @@ -5498,12 +5861,12 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "futures 0.3.21", - "futures-timer 3.0.2", + "futures", + "futures-timer", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sc-block-builder", "sc-client-api", "sc-proposer-metrics", @@ -5521,9 +5884,9 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sc-client-api", "sp-api", "sp-block-builder", @@ -5537,11 +5900,11 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "impl-trait-for-tuples", "memmap2 0.5.3", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sc-chain-spec-derive", "sc-network", "sc-telemetry", @@ -5554,9 +5917,9 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "proc-macro-crate 1.1.2", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn", @@ -5565,20 +5928,22 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "chrono", + "clap", "fdlimit", - "futures 0.3.21", + "futures", "hex", "libp2p", "log", "names", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "rand 0.7.3", "regex", "rpassword", "sc-client-api", + "sc-client-db", "sc-keystore", "sc-network", "sc-service", @@ -5594,7 +5959,6 @@ dependencies = [ "sp-panic-handler", "sp-runtime", "sp-version", - "structopt", "thiserror", "tiny-bip39", "tokio", @@ -5603,14 +5967,14 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "fnv", - "futures 0.3.21", + "futures", "hash-db", "log", - "parity-scale-codec", - "parking_lot", + "parity-scale-codec 3.1.2", + "parking_lot 0.12.0", "sc-executor", "sc-transaction-pool-api", "sc-utils", @@ -5631,7 +5995,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "hash-db", "kvdb", @@ -5640,8 +6004,8 @@ dependencies = [ "linked-hash-map", "log", "parity-db", - "parity-scale-codec", - "parking_lot", + "parity-scale-codec 3.1.2", + "parking_lot 0.12.0", "sc-client-api", "sc-state-db", "sp-arithmetic", @@ -5656,14 +6020,14 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "async-trait", - "futures 0.3.21", - "futures-timer 3.0.2", + "futures", + "futures-timer", "libp2p", "log", - "parking_lot", + "parking_lot 0.12.0", "sc-client-api", "sc-utils", "serde", @@ -5680,13 +6044,12 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "async-trait", - "derive_more", - "futures 0.3.21", + "futures", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sc-block-builder", "sc-client-api", "sc-consensus", @@ -5704,22 +6067,22 @@ dependencies = [ "sp-keystore", "sp-runtime", "substrate-prometheus-endpoint", + "thiserror", ] [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "async-trait", - "futures 0.3.21", - "futures-timer 3.0.2", + "futures", + "futures-timer", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sc-client-api", "sc-consensus", "sc-telemetry", - "sp-api", "sp-arithmetic", "sp-blockchain", "sp-consensus", @@ -5735,13 +6098,12 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "lazy_static", - "libsecp256k1", - "log", - "parity-scale-codec", - "parking_lot", + "lru 0.7.6", + "parity-scale-codec 3.1.2", + "parking_lot 0.12.0", "sc-executor-common", "sc-executor-wasmi", "sc-executor-wasmtime", @@ -5756,39 +6118,38 @@ dependencies = [ "sp-trie", "sp-version", "sp-wasm-interface", + "tracing", "wasmi 0.9.1", ] [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "derive_more", "environmental", - "parity-scale-codec", - "pwasm-utils", + "parity-scale-codec 3.1.2", "sc-allocator", - "sp-core", "sp-maybe-compressed-blob", + "sp-sandbox", "sp-serializer", "sp-wasm-interface", "thiserror", + "wasm-instrument", "wasmi 0.9.1", ] [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sc-allocator", "sc-executor-common", - "scoped-tls", - "sp-core", "sp-runtime-interface", + "sp-sandbox", "sp-wasm-interface", "wasmi 0.9.1", ] @@ -5796,17 +6157,17 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "cfg-if 1.0.0", "libc", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "parity-wasm 0.42.2", "sc-allocator", "sc-executor-common", - "sp-core", "sp-runtime-interface", + "sp-sandbox", "sp-wasm-interface", "wasmtime", ] @@ -5814,20 +6175,22 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ + "ahash", "async-trait", - "derive_more", "dyn-clone", "finality-grandpa", "fork-tree", - "futures 0.3.21", - "futures-timer 3.0.2", + "futures", + "futures-timer", + "hex", "log", - "parity-scale-codec", - "parking_lot", + "parity-scale-codec 3.1.2", + "parking_lot 0.12.0", "rand 0.8.5", "sc-block-builder", + "sc-chain-spec", "sc-client-api", "sc-consensus", "sc-keystore", @@ -5846,16 +6209,17 @@ dependencies = [ "sp-keystore", "sp-runtime", "substrate-prometheus-endpoint", + "thiserror", ] [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "ansi_term", - "futures 0.3.21", - "futures-timer 3.0.2", + "futures", + "futures-timer", "log", "parity-util-mem", "sc-client-api", @@ -5868,44 +6232,42 @@ dependencies = [ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "async-trait", - "derive_more", "hex", - "parking_lot", + "parking_lot 0.12.0", "serde_json", "sp-application-crypto", "sp-core", "sp-keystore", + "thiserror", ] [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "async-std", "async-trait", - "asynchronous-codec 0.5.0", + "asynchronous-codec", "bitflags", - "bytes 1.1.0", + "bytes", "cid", - "derive_more", "either", "fnv", "fork-tree", - "futures 0.3.21", - "futures-timer 3.0.2", + "futures", + "futures-timer", "hex", "ip_network", "libp2p", "linked-hash-map", "linked_hash_set", "log", - "lru 0.7.2", - "parity-scale-codec", - "parking_lot", + "lru 0.7.6", + "parity-scale-codec 3.1.2", + "parking_lot 0.12.0", "pin-project 1.0.10", "prost", "prost-build", @@ -5913,6 +6275,8 @@ dependencies = [ "sc-block-builder", "sc-client-api", "sc-consensus", + "sc-network-common", + "sc-network-sync", "sc-peerset", "sc-utils", "serde", @@ -5926,43 +6290,86 @@ dependencies = [ "sp-runtime", "substrate-prometheus-endpoint", "thiserror", - "unsigned-varint 0.6.0", + "unsigned-varint", "void", "zeroize", ] +[[package]] +name = "sc-network-common" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" +dependencies = [ + "futures", + "libp2p", + "parity-scale-codec 3.1.2", + "prost-build", + "sc-peerset", + "smallvec", +] + [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "futures 0.3.21", - "futures-timer 3.0.2", + "ahash", + "futures", + "futures-timer", "libp2p", "log", - "lru 0.7.2", + "lru 0.7.6", "sc-network", "sp-runtime", "substrate-prometheus-endpoint", "tracing", ] +[[package]] +name = "sc-network-sync" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" +dependencies = [ + "bitflags", + "either", + "fork-tree", + "futures", + "libp2p", + "log", + "lru 0.7.6", + "parity-scale-codec 3.1.2", + "prost", + "prost-build", + "sc-client-api", + "sc-consensus", + "sc-network-common", + "sc-peerset", + "smallvec", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-finality-grandpa", + "sp-runtime", + "thiserror", +] + [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "bytes 1.1.0", + "bytes", "fnv", - "futures 0.3.21", - "futures-timer 3.0.2", + "futures", + "futures-timer", "hex", "hyper", "hyper-rustls", "num_cpus", "once_cell", - "parity-scale-codec", - "parking_lot", + "parity-scale-codec 3.1.2", + "parking_lot 0.12.0", "rand 0.7.3", "sc-client-api", "sc-network", @@ -5978,9 +6385,9 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "futures 0.3.21", + "futures", "libp2p", "log", "sc-utils", @@ -5991,7 +6398,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -6000,15 +6407,14 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "futures 0.3.21", + "futures", "hash-db", - "jsonrpc-core", - "jsonrpc-pubsub", + "jsonrpsee", "log", - "parity-scale-codec", - "parking_lot", + "parity-scale-codec 3.1.2", + "parking_lot 0.12.0", "sc-block-builder", "sc-chain-spec", "sc-client-api", @@ -6031,18 +6437,16 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "futures 0.3.21", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "jsonrpc-pubsub", + "futures", + "jsonrpsee", "log", - "parity-scale-codec", - "parking_lot", + "parity-scale-codec 3.1.2", + "parking_lot 0.12.0", "sc-chain-spec", "sc-transaction-pool-api", + "scale-info", "serde", "serde_json", "sp-core", @@ -6056,14 +6460,10 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" -dependencies = [ - "futures 0.3.21", - "jsonrpc-core", - "jsonrpc-http-server", - "jsonrpc-ipc-server", - "jsonrpc-pubsub", - "jsonrpc-ws-server", +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" +dependencies = [ + "futures", + "jsonrpsee", "log", "serde_json", "substrate-prometheus-endpoint", @@ -6073,20 +6473,19 @@ dependencies = [ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "async-trait", "directories", "exit-future", - "futures 0.3.21", - "futures-timer 3.0.2", + "futures", + "futures-timer", "hash-db", - "jsonrpc-core", - "jsonrpc-pubsub", + "jsonrpsee", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "parity-util-mem", - "parking_lot", + "parking_lot 0.12.0", "pin-project 1.0.10", "rand 0.7.3", "sc-block-builder", @@ -6098,9 +6497,11 @@ dependencies = [ "sc-informant", "sc-keystore", "sc-network", + "sc-network-common", "sc-offchain", "sc-rpc", "sc-rpc-server", + "sc-sysinfo", "sc-telemetry", "sc-tracing", "sc-transaction-pool", @@ -6137,27 +6538,46 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "parity-util-mem", "parity-util-mem-derive", - "parking_lot", + "parking_lot 0.12.0", "sc-client-api", "sp-core", ] +[[package]] +name = "sc-sysinfo" +version = "6.0.0-dev" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" +dependencies = [ + "futures", + "libc", + "log", + "rand 0.7.3", + "rand_pcg 0.2.1", + "regex", + "sc-telemetry", + "serde", + "serde_json", + "sp-core", + "sp-io", + "sp-std", +] + [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "chrono", - "futures 0.3.21", + "futures", "libp2p", "log", - "parking_lot", + "parking_lot 0.12.0", "pin-project 1.0.10", "rand 0.7.3", "serde", @@ -6169,7 +6589,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "ansi_term", "atty", @@ -6178,7 +6598,7 @@ dependencies = [ "libc", "log", "once_cell", - "parking_lot", + "parking_lot 0.12.0", "regex", "rustc-hash", "sc-client-api", @@ -6194,15 +6614,15 @@ dependencies = [ "thiserror", "tracing", "tracing-log", - "tracing-subscriber", + "tracing-subscriber 0.2.25", ] [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "proc-macro-crate 1.1.2", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn", @@ -6211,15 +6631,15 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "futures 0.3.21", - "intervalier", + "futures", + "futures-timer", "linked-hash-map", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "parity-util-mem", - "parking_lot", + "parking_lot 0.12.0", "retain_mut", "sc-client-api", "sc-transaction-pool-api", @@ -6238,10 +6658,9 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "derive_more", - "futures 0.3.21", + "futures", "log", "serde", "sp-blockchain", @@ -6252,35 +6671,37 @@ dependencies = [ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "futures 0.3.21", - "futures-timer 3.0.2", + "futures", + "futures-timer", "lazy_static", + "log", + "parking_lot 0.12.0", "prometheus", ] [[package]] name = "scale-info" -version = "1.0.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c55b744399c25532d63a0d2789b109df8d46fc93752d46b0782991a931a782f" +checksum = "c46be926081c9f4dd5dd9b6f1d3e3229f2360bc6502dd8836f84a93b7c75e99a" dependencies = [ - "bitvec", + "bitvec 1.0.0", "cfg-if 1.0.0", "derive_more", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info-derive", "serde", ] [[package]] name = "scale-info-derive" -version = "1.0.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baeb2780690380592f86205aa4ee49815feb2acad8c2f59e6dd207148c3f1fcd" +checksum = "50e334bb10a245e28e5fd755cabcafd96cfcd167c99ae63a46924ca8d8703a3c" dependencies = [ - "proc-macro-crate 1.1.2", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn", @@ -6288,12 +6709,12 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" dependencies = [ "lazy_static", - "winapi 0.3.9", + "windows-sys", ] [[package]] @@ -6314,12 +6735,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - [[package]] name = "scopeguard" version = "1.1.0" @@ -6336,6 +6751,46 @@ dependencies = [ "untrusted", ] +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sec1" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08da66b8b0965a5555b6bd6639e68ccba85e1e2506f5fbb089e93f8a04e1a2d1" +dependencies = [ + "der", + "generic-array 0.14.5", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c42e6f1735c5f00f51e43e28d6634141f2bcad10931b2609ddd74a86d751260" +dependencies = [ + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957da2573cde917463ece3570eab4a0b3f19de6f1646cde62e6fd3868f566036" +dependencies = [ + "cc", +] + [[package]] name = "secrecy" version = "0.8.0" @@ -6374,7 +6829,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" dependencies = [ - "semver-parser 0.7.0", + "semver-parser", ] [[package]] @@ -6383,23 +6838,14 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "semver-parser 0.7.0", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser 0.10.2", + "semver-parser", ] [[package]] name = "semver" -version = "1.0.5" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0486718e92ec9a68fbed73bb5ef687d71103b142595b406835649bebd33f72c7" +checksum = "8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd" dependencies = [ "serde", ] @@ -6410,29 +6856,20 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - [[package]] name = "serde" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" dependencies = [ "proc-macro2", "quote", @@ -6441,16 +6878,25 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" dependencies = [ "indexmap", - "itoa 1.0.1", + "itoa 1.0.2", "ryu", "serde", ] +[[package]] +name = "serde_nanos" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e44969a61f5d316be20a42ff97816efb3b407a924d06824c3d8a49fa8450de0e" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -6458,7 +6904,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.1", + "itoa 1.0.2", "ryu", "serde", ] @@ -6483,7 +6929,7 @@ checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ "block-buffer 0.9.0", "cfg-if 1.0.0", - "cpufeatures 0.2.1", + "cpufeatures", "digest 0.9.0", "opaque-debug 0.3.0", ] @@ -6508,11 +6954,22 @@ checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", "cfg-if 1.0.0", - "cpufeatures 0.2.1", + "cpufeatures", "digest 0.9.0", "opaque-debug 0.3.0", ] +[[package]] +name = "sha2" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.10.3", +] + [[package]] name = "sha3" version = "0.9.1" @@ -6525,6 +6982,16 @@ dependencies = [ "opaque-debug 0.3.0", ] +[[package]] +name = "sha3" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881bf8156c87b6301fc5ca6b27f11eeb2761224c7081e69b409d5a1951a70c86" +dependencies = [ + "digest 0.10.3", + "keccak", +] + [[package]] name = "sharded-slab" version = "0.1.4" @@ -6542,9 +7009,9 @@ checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" [[package]] name = "signal-hook" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "647c97df271007dcea485bb74ffdb57f2e683f1306c854f468a0c244badabf2d" +checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" dependencies = [ "libc", "signal-hook-registry", @@ -6561,9 +7028,13 @@ dependencies = [ [[package]] name = "signature" -version = "1.5.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" +checksum = "02658e48d89f2bec991f9a78e69cfa4c316f8d6a6c4ec12fae1aeb263d486788" +dependencies = [ + "digest 0.9.0", + "rand_core 0.6.3", +] [[package]] name = "simba" @@ -6577,6 +7048,14 @@ dependencies = [ "paste", ] +[[package]] +name = "skw-blockchain-primitives" +version = "3.0.0" +dependencies = [ + "borsh", + "sp-std", +] + [[package]] name = "skw-contract-macros" version = "0.1.0" @@ -6615,7 +7094,7 @@ dependencies = [ name = "skw-contract-sim" version = "0.1.0" dependencies = [ - "funty", + "funty 1.1.0", "lazy-static-include", "quickcheck 0.9.2", "quickcheck_macros", @@ -6645,7 +7124,7 @@ version = "0.0.0" dependencies = [ "assert_matches", "lazy_static", - "lru 0.7.2", + "lru 0.7.6", "near-test-contracts", "parity-wasm 0.42.2", "pwasm-utils", @@ -6663,8 +7142,7 @@ name = "skw-vm-engine-cli" version = "0.0.0" dependencies = [ "base64 0.13.0", - "clap 3.0.0-beta.2", - "clap_derive", + "clap", "hex", "near-test-contracts", "num-rational 0.3.2", @@ -6689,7 +7167,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.9.9", - "sha3", + "sha3 0.9.1", "skw-vm-primitives", "wasmi 0.11.0", ] @@ -6700,9 +7178,8 @@ version = "0.1.0" dependencies = [ "borsh", "bs58", - "clap 3.0.0-beta.2", - "clap_derive", - "funty", + "clap", + "funty 1.1.0", "lazy-static-include", "quickcheck 0.9.2", "quickcheck_macros", @@ -6722,8 +7199,7 @@ name = "skw-vm-patch" version = "0.1.0" dependencies = [ "bs58", - "clap 3.0.0-beta.2", - "clap_derive", + "clap", "skw-myers-diff", ] @@ -6743,7 +7219,7 @@ version = "0.1.0" dependencies = [ "arrayref", "base64 0.11.0", - "blake2", + "blake2 0.9.2", "borsh", "bs58", "byteorder", @@ -6758,7 +7234,7 @@ dependencies = [ "num-rational 0.3.2", "once_cell", "parity-secp256k1", - "primitive-types", + "primitive-types 0.10.1", "rand 0.7.3", "rand_core 0.5.1", "serde", @@ -6810,7 +7286,7 @@ dependencies = [ "derive_more", "elastic-array", "fs2", - "hashbrown 0.12.0", + "hashbrown 0.12.1", "lru 0.6.6", "num_cpus", "rand 0.7.3", @@ -6837,10 +7313,12 @@ dependencies = [ name = "skyekiwi-node" version = "3.0.0" dependencies = [ + "clap", "frame-benchmarking", "frame-benchmarking-cli", - "hex-literal 0.3.4", - "jsonrpc-core", + "frame-system", + "jsonrpsee", + "pallet-transaction-payment", "pallet-transaction-payment-rpc", "sc-basic-authorship", "sc-cli", @@ -6864,11 +7342,13 @@ dependencies = [ "sp-consensus-aura", "sp-core", "sp-finality-grandpa", + "sp-inherents", + "sp-keyring", "sp-runtime", "sp-timestamp", - "structopt", "substrate-build-script-utils", "substrate-frame-rpc-system", + "try-runtime-cli", ] [[package]] @@ -6881,6 +7361,7 @@ dependencies = [ "frame-system", "frame-system-benchmarking", "frame-system-rpc-runtime-api", + "frame-try-runtime", "hex-literal 0.3.4", "pallet-aura", "pallet-balances", @@ -6894,8 +7375,9 @@ dependencies = [ "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", + "pallet-treasury", "pallet-utility", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-api", "sp-block-builder", @@ -6913,9 +7395,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" [[package]] name = "smallvec" @@ -6942,31 +7424,19 @@ checksum = "45456094d1983e2ee2a18fdfebce3189fa451699d0502cb8e3b49dba5ba41451" [[package]] name = "snow" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6142f7c25e94f6fd25a32c3348ec230df9109b463f59c8c7acc4bd34936babb7" +checksum = "774d05a3edae07ce6d68ea6984f3c05e9bba8927e3dd591e3b479e5b03213d0d" dependencies = [ "aes-gcm", - "blake2", + "blake2 0.10.4", "chacha20poly1305", - "rand 0.8.5", + "curve25519-dalek 4.0.0-pre.1", "rand_core 0.6.3", "ring", - "rustc_version 0.3.3", - "sha2 0.9.9", + "rustc_version 0.4.0", + "sha2 0.10.2", "subtle", - "x25519-dalek", -] - -[[package]] -name = "socket2" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "winapi 0.3.9", ] [[package]] @@ -6976,7 +7446,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -6986,9 +7456,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" dependencies = [ "base64 0.13.0", - "bytes 1.1.0", + "bytes", "flate2", - "futures 0.3.21", + "futures", "httparse", "log", "rand 0.8.5", @@ -6998,11 +7468,11 @@ dependencies = [ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "hash-db", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sp-api-proc-macro", "sp-core", "sp-runtime", @@ -7015,10 +7485,10 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "blake2-rfc", - "proc-macro-crate 1.1.2", + "blake2 0.10.4", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn", @@ -7026,10 +7496,10 @@ dependencies = [ [[package]] name = "sp-application-crypto" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "serde", "sp-core", @@ -7039,12 +7509,12 @@ dependencies = [ [[package]] name = "sp-arithmetic" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "integer-sqrt", "num-traits", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "serde", "sp-debug-derive", @@ -7055,10 +7525,10 @@ dependencies = [ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "async-trait", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sp-inherents", "sp-runtime", "sp-std", @@ -7067,9 +7537,9 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sp-api", "sp-inherents", "sp-runtime", @@ -7079,13 +7549,13 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "futures 0.3.21", + "futures", "log", - "lru 0.7.2", - "parity-scale-codec", - "parking_lot", + "lru 0.7.6", + "parity-scale-codec 3.1.2", + "parking_lot 0.12.0", "sp-api", "sp-consensus", "sp-database", @@ -7097,13 +7567,13 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "async-trait", - "futures 0.3.21", - "futures-timer 3.0.2", + "futures", + "futures-timer", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sp-core", "sp-inherents", "sp-runtime", @@ -7116,10 +7586,10 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "async-trait", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-api", "sp-application-crypto", @@ -7134,19 +7604,21 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "serde", "sp-arithmetic", "sp-runtime", + "sp-std", + "sp-timestamp", ] [[package]] name = "sp-core" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "base58", "bitflags", @@ -7154,7 +7626,7 @@ dependencies = [ "byteorder", "dyn-clonable", "ed25519-dalek", - "futures 0.3.21", + "futures", "hash-db", "hash256-std-hasher", "hex", @@ -7164,17 +7636,17 @@ dependencies = [ "log", "merlin", "num-traits", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "parity-util-mem", - "parking_lot", - "primitive-types", + "parking_lot 0.12.0", + "primitive-types 0.11.1", "rand 0.7.3", "regex", "scale-info", "schnorrkel", + "secp256k1", "secrecy", "serde", - "sha2 0.9.9", "sp-core-hashing", "sp-debug-derive", "sp-externalities", @@ -7185,29 +7657,28 @@ dependencies = [ "substrate-bip39", "thiserror", "tiny-bip39", - "tiny-keccak", - "twox-hash", "wasmi 0.9.1", "zeroize", ] [[package]] name = "sp-core-hashing" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "4.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "blake2-rfc", + "blake2 0.10.4", "byteorder", - "sha2 0.9.9", + "digest 0.10.3", + "sha2 0.10.2", + "sha3 0.10.1", "sp-std", - "tiny-keccak", "twox-hash", ] [[package]] name = "sp-core-hashing-proc-macro" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "proc-macro2", "quote", @@ -7218,16 +7689,16 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "kvdb", - "parking_lot", + "parking_lot 0.12.0", ] [[package]] name = "sp-debug-derive" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "4.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "proc-macro2", "quote", @@ -7236,11 +7707,11 @@ dependencies = [ [[package]] name = "sp-externalities" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "0.12.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "environmental", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sp-std", "sp-storage", ] @@ -7248,11 +7719,11 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "finality-grandpa", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "serde", "sp-api", @@ -7266,11 +7737,11 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "async-trait", "impl-trait-for-tuples", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sp-core", "sp-runtime", "sp-std", @@ -7279,15 +7750,16 @@ dependencies = [ [[package]] name = "sp-io" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "futures 0.3.21", + "futures", "hash-db", "libsecp256k1", "log", - "parity-scale-codec", - "parking_lot", + "parity-scale-codec 3.1.2", + "parking_lot 0.12.0", + "secp256k1", "sp-core", "sp-externalities", "sp-keystore", @@ -7303,44 +7775,45 @@ dependencies = [ [[package]] name = "sp-keyring" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "lazy_static", "sp-core", "sp-runtime", - "strum 0.22.0", + "strum 0.23.0", ] [[package]] name = "sp-keystore" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "0.12.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "async-trait", - "derive_more", - "futures 0.3.21", + "futures", "merlin", - "parity-scale-codec", - "parking_lot", + "parity-scale-codec 3.1.2", + "parking_lot 0.12.0", "schnorrkel", "serde", "sp-core", "sp-externalities", + "thiserror", ] [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ + "thiserror", "zstd", ] [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "sp-api", "sp-core", @@ -7349,8 +7822,8 @@ dependencies = [ [[package]] name = "sp-panic-handler" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "4.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "backtrace", "lazy_static", @@ -7359,8 +7832,8 @@ dependencies = [ [[package]] name = "sp-rpc" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "rustc-hash", "serde", @@ -7369,14 +7842,14 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "either", "hash256-std-hasher", "impl-trait-for-tuples", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "parity-util-mem", "paste", "rand 0.7.3", @@ -7391,12 +7864,12 @@ dependencies = [ [[package]] name = "sp-runtime-interface" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "impl-trait-for-tuples", - "parity-scale-codec", - "primitive-types", + "parity-scale-codec 3.1.2", + "primitive-types 0.11.1", "sp-externalities", "sp-runtime-interface-proc-macro", "sp-std", @@ -7408,20 +7881,34 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "Inflector", - "proc-macro-crate 1.1.2", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn", ] +[[package]] +name = "sp-sandbox" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" +dependencies = [ + "log", + "parity-scale-codec 3.1.2", + "sp-core", + "sp-io", + "sp-std", + "sp-wasm-interface", + "wasmi 0.9.1", +] + [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "serde", "serde_json", @@ -7430,9 +7917,9 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-api", "sp-core", @@ -7444,9 +7931,9 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-runtime", "sp-std", @@ -7454,14 +7941,14 @@ dependencies = [ [[package]] name = "sp-state-machine" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "0.12.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "hash-db", "log", "num-traits", - "parity-scale-codec", - "parking_lot", + "parity-scale-codec 3.1.2", + "parking_lot 0.12.0", "rand 0.7.3", "smallvec", "sp-core", @@ -7471,22 +7958,21 @@ dependencies = [ "sp-trie", "thiserror", "tracing", - "trie-db", "trie-root", ] [[package]] name = "sp-std" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "4.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" [[package]] name = "sp-storage" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "impl-serde", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "ref-cast", "serde", "sp-debug-derive", @@ -7496,7 +7982,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "log", "sp-core", @@ -7509,12 +7995,12 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "async-trait", - "futures-timer 3.0.2", + "futures-timer", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sp-api", "sp-inherents", "sp-runtime", @@ -7524,20 +8010,20 @@ dependencies = [ [[package]] name = "sp-tracing" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sp-std", "tracing", "tracing-core", - "tracing-subscriber", + "tracing-subscriber 0.2.25", ] [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "sp-api", "sp-runtime", @@ -7546,11 +8032,11 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "async-trait", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-core", "sp-inherents", @@ -7561,29 +8047,31 @@ dependencies = [ [[package]] name = "sp-trie" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "hash-db", "memory-db", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "scale-info", "sp-core", "sp-std", + "thiserror", "trie-db", "trie-root", ] [[package]] name = "sp-version" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "5.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "impl-serde", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "parity-wasm 0.42.2", "scale-info", "serde", + "sp-core-hashing-proc-macro", "sp-runtime", "sp-std", "sp-version-proc-macro", @@ -7593,9 +8081,9 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "parity-scale-codec", + "parity-scale-codec 3.1.2", "proc-macro2", "quote", "syn", @@ -7603,13 +8091,15 @@ dependencies = [ [[package]] name = "sp-wasm-interface" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +version = "6.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "impl-trait-for-tuples", - "parity-scale-codec", + "log", + "parity-scale-codec 3.1.2", "sp-std", "wasmi 0.9.1", + "wasmtime", ] [[package]] @@ -7620,11 +8110,12 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "ss58-registry" -version = "1.14.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8cb4b9ce18beb6cb16ecad62d936245cef5212ddc8e094d7417a75e8d0e85f5" +checksum = "5e1e7c268f5610088463d23188fc9e764cda491784360e5e4ea3a8ce1e0e2ac9" dependencies = [ "Inflector", + "num-format", "proc-macro2", "quote", "serde", @@ -7657,42 +8148,12 @@ dependencies = [ "rand 0.8.5", ] -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" -[[package]] -name = "structopt" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" -dependencies = [ - "clap 2.34.0", - "lazy_static", - "structopt-derive", -] - -[[package]] -name = "structopt-derive" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "strum" version = "0.20.0" @@ -7704,11 +8165,11 @@ dependencies = [ [[package]] name = "strum" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7ac893c7d471c8a21f31cfe213ec4f6d9afeed25537c772e08ef3f005f8729e" +checksum = "cae14b91c7d11c9a851d3fbc80a963198998c2a64eec840477fa92d8ce9b70bb" dependencies = [ - "strum_macros 0.22.0", + "strum_macros 0.23.1", ] [[package]] @@ -7717,7 +8178,7 @@ version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee8bc6b87a5112aeeab1f4a9f7ab634fe6cbefc4850006df31267f4cfb9e3149" dependencies = [ - "heck", + "heck 0.3.3", "proc-macro2", "quote", "syn", @@ -7725,13 +8186,14 @@ dependencies = [ [[package]] name = "strum_macros" -version = "0.22.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339f799d8b549e3744c7ac7feb216383e4005d94bdb22561b3ab8f3b808ae9fb" +checksum = "5bb0dc7ee9c15cea6199cde9a127fa16a4c5819af85395457ad72d68edc85a38" dependencies = [ - "heck", + "heck 0.3.3", "proc-macro2", "quote", + "rustversion", "syn", ] @@ -7751,7 +8213,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "platforms", ] @@ -7759,18 +8221,17 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "frame-system-rpc-runtime-api", - "futures 0.3.21", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", + "futures", + "jsonrpsee", "log", - "parity-scale-codec", + "parity-scale-codec 3.1.2", "sc-client-api", "sc-rpc-api", "sc-transaction-pool-api", + "serde_json", "sp-api", "sp-block-builder", "sp-blockchain", @@ -7781,26 +8242,26 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ - "async-std", - "derive_more", "futures-util", "hyper", "log", "prometheus", + "thiserror", "tokio", ] [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?tag=monthly-2021-12#b6c1c1bcfa5d831bfd1f278064d7af757f9b38f5" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" dependencies = [ "ansi_term", "build-helper", "cargo_metadata", "sp-maybe-compressed-blob", + "strum 0.23.0", "tempfile", "toml", "walkdir", @@ -7815,13 +8276,13 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.86" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -7836,6 +8297,27 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "system-configuration" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75182f12f490e953596550b65ee31bda7c8e043d9386174b353bda50838c3fd" +dependencies = [ + "bitflags", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tap" version = "1.0.1" @@ -7844,9 +8326,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "target-lexicon" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fa7e55043acb85fca6b3c01485a2eeb6b69c5d21002e273c79e465f43b7ac1" +checksum = "c02424087780c9b71cc96799eaeddff35af2bc513278cda5c99fc1f5d026d3c1" [[package]] name = "tempfile" @@ -7857,16 +8339,27 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "libc", - "redox_syscall", + "redox_syscall 0.2.13", "remove_dir_all", - "winapi 0.3.9", + "winapi", +] + +[[package]] +name = "term" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd106a334b7657c10b7c540a0106114feadeb4dc314513e97df481d5d966f42" +dependencies = [ + "byteorder", + "dirs", + "winapi", ] [[package]] name = "termcolor" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" dependencies = [ "winapi-util", ] @@ -7878,58 +8371,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" dependencies = [ "libc", - "winapi 0.3.9", -] - -[[package]] -name = "test-env-log" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877189d680101869f65ef94168105d6c188b3a143c13a2d42cf8a09c4c704f8a" -dependencies = [ - "proc-macro2", - "quote", - "syn", + "winapi", ] [[package]] name = "textwrap" -version = "0.11.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "textwrap" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "203008d98caf094106cfaba70acfed15e18ed3ddb7d94e49baec153a2b462789" -dependencies = [ - "unicode-width", -] +checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "thousands" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" + [[package]] name = "thread_local" version = "1.1.4" @@ -7948,6 +8424,17 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "tikv-jemalloc-sys" +version = "0.4.3+5.2.1-patched.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1792ccb507d955b46af42c123ea8863668fae24d03721e40cad6a41773dbb49" +dependencies = [ + "cc", + "fs_extra", + "libc", +] + [[package]] name = "time" version = "0.1.44" @@ -7956,7 +8443,7 @@ checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", "wasi 0.10.0+wasi-snapshot-preview1", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -7978,20 +8465,11 @@ dependencies = [ "zeroize", ] -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - [[package]] name = "tinyvec" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -8004,20 +8482,33 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.17.0" +version = "1.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +checksum = "4903bf0427cf68dddd5aa6a93220756f8be0c34fcfa9f5e6191e103e15a31395" dependencies = [ - "bytes 1.1.0", + "bytes", "libc", "memchr", - "mio 0.8.0", + "mio", "num_cpus", "once_cell", - "pin-project-lite 0.2.8", + "parking_lot 0.12.0", + "pin-project-lite 0.2.9", "signal-hook-registry", - "socket2 0.4.4", - "winapi 0.3.9", + "socket2", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-macros" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -8036,41 +8527,42 @@ version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" dependencies = [ - "rustls", + "rustls 0.19.1", "tokio", - "webpki", + "webpki 0.21.4", ] [[package]] -name = "tokio-stream" -version = "0.1.8" +name = "tokio-rustls" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "futures-core", - "pin-project-lite 0.2.8", + "rustls 0.20.6", "tokio", + "webpki 0.22.0", ] [[package]] name = "tokio-util" -version = "0.6.9" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +checksum = "f988a1a1adc2fb21f9c12aa96441da33a1728193ae0b95d2be22dbd17fcb4e5c" dependencies = [ - "bytes 1.1.0", + "bytes", "futures-core", + "futures-io", "futures-sink", - "log", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "tokio", + "tracing", ] [[package]] name = "toml" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ "serde", ] @@ -8083,21 +8575,21 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.30" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d8d93354fe2a8e50d5953f5ae2e47a3fc2ef03292e7ea46e3cc38f549525fb9" +checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" dependencies = [ "cfg-if 1.0.0", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" -version = "0.1.19" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8276d9a4a3a558d7b7ad5303ad50b53d58264641b82914b7ada36bd762e7a716" +checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" dependencies = [ "proc-macro2", "quote", @@ -8106,9 +8598,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.22" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03cfcb51380632a72d3111cb8d3447a8d908e577d31beeac006f836383d29a23" +checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" dependencies = [ "lazy_static", "valuable", @@ -8126,12 +8618,14 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" dependencies = [ + "ahash", "lazy_static", "log", + "lru 0.7.6", "tracing-core", ] @@ -8147,12 +8641,12 @@ dependencies = [ [[package]] name = "tracing-span-tree" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877726b1570d7764022ef20cc61479b5bcfc1118b90521ce61f6cc9e4f5ffbd8" +checksum = "c3809cda0328d505548af1ca24fac329f41c0c213d0a1e78908922d0b43e5c43" dependencies = [ "tracing", - "tracing-subscriber", + "tracing-subscriber 0.3.11", ] [[package]] @@ -8165,7 +8659,7 @@ dependencies = [ "chrono", "lazy_static", "matchers", - "parking_lot", + "parking_lot 0.11.2", "regex", "serde", "serde_json", @@ -8178,14 +8672,28 @@ dependencies = [ "tracing-serde", ] +[[package]] +name = "tracing-subscriber" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596" +dependencies = [ + "ansi_term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + [[package]] name = "trie-db" -version = "0.22.6" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eac131e334e81b6b3be07399482042838adcd7957aa0010231d0813e39e02fa" +checksum = "d32d034c0d3db64b43c31de38e945f15b40cd4ca6d2dcfc26d4798ce8de4ab83" dependencies = [ "hash-db", - "hashbrown 0.11.2", + "hashbrown 0.12.1", "log", "rustc-hex", "smallvec", @@ -8193,18 +8701,18 @@ dependencies = [ [[package]] name = "trie-root" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "652931506d2c1244d7217a70b99f56718a7b4161b37f04e7cd868072a99f68cd" +checksum = "9a36c5ca3911ed3c9a5416ee6c679042064b93fc637ded67e25f92e68d783891" dependencies = [ "hash-db", ] [[package]] name = "trust-dns-proto" -version = "0.20.4" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca94d4e9feb6a181c690c4040d7a24ef34018d8313ac5044a61d21222ae24e31" +checksum = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d" dependencies = [ "async-trait", "cfg-if 1.0.0", @@ -8213,7 +8721,7 @@ dependencies = [ "futures-channel", "futures-io", "futures-util", - "idna 0.2.3", + "idna", "ipnet", "lazy_static", "log", @@ -8221,14 +8729,14 @@ dependencies = [ "smallvec", "thiserror", "tinyvec", - "url 2.2.2", + "url", ] [[package]] name = "trust-dns-resolver" -version = "0.20.4" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecae383baad9995efaa34ce8e57d12c3f305e545887472a492b838f4b5cfb77a" +checksum = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558" dependencies = [ "cfg-if 1.0.0", "futures-util", @@ -8236,7 +8744,7 @@ dependencies = [ "lazy_static", "log", "lru-cache", - "parking_lot", + "parking_lot 0.12.0", "resolv-conf", "smallvec", "thiserror", @@ -8249,15 +8757,41 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +[[package]] +name = "try-runtime-cli" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.22#616d33ea23bab86cafffaf116fc607b6790fb4eb" +dependencies = [ + "clap", + "jsonrpsee", + "log", + "parity-scale-codec 3.1.2", + "remote-externalities", + "sc-chain-spec", + "sc-cli", + "sc-executor", + "sc-service", + "serde", + "sp-core", + "sp-externalities", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-state-machine", + "sp-version", + "zstd", +] + [[package]] name = "trybuild" -version = "1.0.56" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d60539445867cdd9680b2bfe2d0428f1814b7d5c9652f09d8d3eae9d19308db" +checksum = "7fc92f558afb6d1d7c6f175eb8d615b8ef49c227543e68e19c123d4ee43d8a7d" dependencies = [ "glob", "once_cell", "serde", + "serde_derive", "serde_json", "termcolor", "toml", @@ -8271,11 +8805,12 @@ checksum = "5e66dcbec4290c69dd03c57e76c2469ea5c7ce109c6dd4351c13055cf71ea055" [[package]] name = "twox-hash" -version = "1.6.2" +version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee73e6e4924fe940354b8d4d98cad5231175d615cd855b758adc658c0aac6a0" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if 1.0.0", + "digest 0.10.3", "rand 0.8.5", "static_assertions", ] @@ -8315,9 +8850,15 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" [[package]] name = "unicode-normalization" @@ -8342,9 +8883,9 @@ checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" [[package]] name = "unicode-xid" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" [[package]] name = "universal-hash" @@ -8356,32 +8897,14 @@ dependencies = [ "subtle", ] -[[package]] -name = "unsigned-varint" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fdeedbf205afadfe39ae559b75c3240f24e257d0ca27e85f85cb82aa19ac35" - -[[package]] -name = "unsigned-varint" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35581ff83d4101e58b582e607120c7f5ffb17e632a980b1f38334d76b36908b2" -dependencies = [ - "asynchronous-codec 0.5.0", - "bytes 1.1.0", - "futures-io", - "futures-util", -] - [[package]] name = "unsigned-varint" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836" dependencies = [ - "asynchronous-codec 0.6.0", - "bytes 1.1.0", + "asynchronous-codec", + "bytes", "futures-io", "futures-util", ] @@ -8392,17 +8915,6 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" -[[package]] -name = "url" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -dependencies = [ - "idna 0.1.5", - "matches", - "percent-encoding 1.0.1", -] - [[package]] name = "url" version = "2.2.2" @@ -8410,9 +8922,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" dependencies = [ "form_urlencoded", - "idna 0.2.3", + "idna", "matches", - "percent-encoding 2.1.0", + "percent-encoding", ] [[package]] @@ -8423,9 +8935,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.0.0-alpha.8" +version = "1.0.0-alpha.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79923f7731dc61ebfba3633098bf3ac533bbd35ccd8c57e7088d9a5eebe0263f" +checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" dependencies = [ "ctor", "version_check", @@ -8437,12 +8949,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version_check" version = "0.9.4" @@ -8468,7 +8974,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" dependencies = [ "same-file", - "winapi 0.3.9", + "winapi", "winapi-util", ] @@ -8494,11 +9000,17 @@ version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" -version = "0.2.79" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" +checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -8506,9 +9018,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.79" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" +checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" dependencies = [ "bumpalo", "lazy_static", @@ -8521,9 +9033,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.29" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb6ec270a31b1d3c7e266b999739109abce8b6c87e4b31fcfcd788b65267395" +checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -8533,9 +9045,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.79" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" +checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -8543,9 +9055,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.79" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" +checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" dependencies = [ "proc-macro2", "quote", @@ -8556,9 +9068,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.79" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" +checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" [[package]] name = "wasm-gc-api" @@ -8571,15 +9083,24 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "wasm-instrument" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "962e5b0401bbb6c887f54e69b8c496ea36f704df65db73e81fd5ff8dc3e63a9f" +dependencies = [ + "parity-wasm 0.42.2", +] + [[package]] name = "wasm-timer" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" dependencies = [ - "futures 0.3.21", + "futures", "js-sys", - "parking_lot", + "parking_lot 0.11.2", "pin-utils", "wasm-bindgen", "wasm-bindgen-futures", @@ -8594,6 +9115,7 @@ checksum = "ca00c5147c319a8ec91ec1a0edbec31e566ce2c9cc93b3f9bb86a9efd0eb795d" dependencies = [ "downcast-rs", "libc", + "libm", "memory_units 0.3.0", "num-rational 0.2.4", "num-traits", @@ -8633,47 +9155,46 @@ checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" [[package]] name = "wasmparser" -version = "0.81.0" +version = "0.83.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98930446519f63d00a836efdc22f67766ceae8dbcc1571379f2bcabc6b2b9abc" +checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" [[package]] name = "wasmtime" -version = "0.31.0" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "311d06b0c49346d1fbf48a17052e844036b95a7753c1afb34e8c0af3f6b5bb13" +checksum = "21ffb4705016d5ca91e18a72ed6822dab50e6d5ddd7045461b17ef19071cdef1" dependencies = [ "anyhow", "backtrace", "bincode", "cfg-if 1.0.0", - "cpp_demangle", "indexmap", "lazy_static", "libc", "log", - "object", + "object 0.27.1", + "once_cell", "paste", "psm", "rayon", "region", - "rustc-demangle", "serde", "target-lexicon", - "wasmparser 0.81.0", + "wasmparser 0.83.0", "wasmtime-cache", "wasmtime-cranelift", "wasmtime-environ", "wasmtime-jit", "wasmtime-runtime", - "winapi 0.3.9", + "winapi", ] [[package]] name = "wasmtime-cache" -version = "0.31.0" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147930a4995137dc096e5b17a573b446799be2bbaea433e821ce6a80abe2c5" +checksum = "85c6ab24291fa7cb3a181f5669f6c72599b7ef781669759b45c7828c5999d0c0" dependencies = [ "anyhow", "base64 0.13.0", @@ -8681,19 +9202,19 @@ dependencies = [ "directories-next", "file-per-thread-logger", "log", - "rsix", + "rustix", "serde", "sha2 0.9.9", "toml", - "winapi 0.3.9", + "winapi", "zstd", ] [[package]] name = "wasmtime-cranelift" -version = "0.31.0" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3083a47e1ede38aac06a1d9831640d673f9aeda0b82a64e4ce002f3432e2e7" +checksum = "f04c810078a491b7bc4866ebe045f714d2b95e6b539e1f64009a4a7606be11de" dependencies = [ "anyhow", "cranelift-codegen", @@ -8701,74 +9222,84 @@ dependencies = [ "cranelift-frontend", "cranelift-native", "cranelift-wasm", - "gimli 0.25.0", + "gimli", "log", "more-asserts", - "object", + "object 0.27.1", "target-lexicon", "thiserror", - "wasmparser 0.81.0", + "wasmparser 0.83.0", "wasmtime-environ", ] [[package]] name = "wasmtime-environ" -version = "0.31.0" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c2d194b655321053bc4111a1aa4ead552655c8a17d17264bc97766e70073510" +checksum = "61448266ea164b1ac406363cdcfac81c7c44db4d94c7a81c8620ac6c5c6cdf59" dependencies = [ "anyhow", - "cfg-if 1.0.0", "cranelift-entity", - "gimli 0.25.0", + "gimli", "indexmap", "log", "more-asserts", - "object", + "object 0.27.1", "serde", "target-lexicon", "thiserror", - "wasmparser 0.81.0", + "wasmparser 0.83.0", "wasmtime-types", ] [[package]] name = "wasmtime-jit" -version = "0.31.0" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864ac8dfe4ce310ac59f16fdbd560c257389cb009ee5d030ac6e30523b023d11" +checksum = "156b4623c6b0d4b8c24afb846c20525922f538ef464cc024abab7ea8de2109a2" dependencies = [ - "addr2line 0.16.0", + "addr2line", "anyhow", "bincode", "cfg-if 1.0.0", - "gimli 0.25.0", + "cpp_demangle", + "gimli", "log", - "more-asserts", - "object", + "object 0.27.1", "region", - "rsix", + "rustc-demangle", + "rustix", "serde", "target-lexicon", "thiserror", - "wasmparser 0.81.0", "wasmtime-environ", + "wasmtime-jit-debug", "wasmtime-runtime", - "winapi 0.3.9", + "winapi", +] + +[[package]] +name = "wasmtime-jit-debug" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5dc31f811760a6c76b2672c404866fd19b75e5fb3b0075a3e377a6846490654" +dependencies = [ + "lazy_static", + "object 0.27.1", + "rustix", ] [[package]] name = "wasmtime-runtime" -version = "0.31.0" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab97da813a26b98c9abfd3b0c2d99e42f6b78b749c0646344e2e262d212d8c8b" +checksum = "f907beaff69d4d920fa4688411ee4cc75c0f01859e424677f9e426e2ef749864" dependencies = [ "anyhow", "backtrace", "cc", "cfg-if 1.0.0", "indexmap", - "lazy_static", "libc", "log", "mach", @@ -8776,29 +9307,30 @@ dependencies = [ "more-asserts", "rand 0.8.5", "region", - "rsix", + "rustix", "thiserror", "wasmtime-environ", - "winapi 0.3.9", + "wasmtime-jit-debug", + "winapi", ] [[package]] name = "wasmtime-types" -version = "0.31.0" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff94409cc3557bfbbcce6b14520ccd6bd3727e965c0fe68d63ef2c185bf379c6" +checksum = "514ef0e5fd197b9609dc9eb74beba0c84d5a12b2417cbae55534633329ba4852" dependencies = [ "cranelift-entity", "serde", "thiserror", - "wasmparser 0.81.0", + "wasmparser 0.83.0", ] [[package]] name = "wast" -version = "39.0.0" +version = "41.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9bbbd53432b267421186feee3e52436531fa69a7cfee9403f5204352df3dd05" +checksum = "f882898b8b817cc4edc16aa3692fdc087b356edc8cc0c2164f5b5181e31c3870" dependencies = [ "leb128", "memchr", @@ -8807,18 +9339,18 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.41" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab98ed25494f97c69f28758617f27c3e92e5336040b5c3a14634f2dd3fe61830" +checksum = "48b3b9b3e39e66c7fd3f8be785e74444d216260f491e93369e317ed6482ff80f" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.56" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" +checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" dependencies = [ "js-sys", "wasm-bindgen", @@ -8834,13 +9366,23 @@ dependencies = [ "untrusted", ] +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "webpki-roots" -version = "0.21.1" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +checksum = "44d8de8415c823c8abd270ad483c6feeac771fad964890779f9a8cb24fbbc1bf" dependencies = [ - "webpki", + "webpki 0.22.0", ] [[package]] @@ -8852,7 +9394,7 @@ dependencies = [ "cfg-if 0.1.10", "libc", "memory_units 0.4.0", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -8866,9 +9408,9 @@ dependencies = [ [[package]] name = "which" -version = "4.2.4" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a5a7e487e921cf220206864a94a89b6c6905bfc19f1057fa26a4cb360e5c1d2" +checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae" dependencies = [ "either", "lazy_static", @@ -8877,15 +9419,9 @@ dependencies = [ [[package]] name = "widestring" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" - -[[package]] -name = "winapi" -version = "0.2.8" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" [[package]] name = "winapi" @@ -8897,12 +9433,6 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -8915,7 +9445,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] @@ -8925,31 +9455,107 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "winreg" -version = "0.6.2" +name = "windows" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" +checksum = "aac7fef12f4b59cd0a29339406cc9203ab44e440ddff6b3f5a41455349fa9cf3" dependencies = [ - "winapi 0.3.9", + "windows_aarch64_msvc 0.29.0", + "windows_i686_gnu 0.29.0", + "windows_i686_msvc 0.29.0", + "windows_x86_64_gnu 0.29.0", + "windows_x86_64_msvc 0.29.0", ] +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d027175d00b01e0cbeb97d6ab6ebe03b12330a35786cbaca5252b1c4bf5d9b" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8793f59f7b8e8b01eda1a652b2697d87b93097198ae85f823b969ca5b89bba58" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8602f6c418b67024be2996c512f5f995de3ba417f4c75af68401ab8756796ae4" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d615f419543e0bd7d2b3323af0d86ff19cbc4f816e6453f36a2c2ce889c354" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d95421d9ed3672c280884da53201a5c46b7b2765ca6faf34b0d71cf34a3561" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + [[package]] name = "winreg" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] -name = "ws2_32-sys" -version = "0.2.1" +name = "winreg" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" dependencies = [ - "winapi 0.2.8", - "winapi-build", + "winapi", ] [[package]] @@ -8958,6 +9564,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" +[[package]] +name = "wyz" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b31594f29d27036c383b53b59ed3476874d518f0efb151b27a4c275141390e" +dependencies = [ + "tap", +] + [[package]] name = "x25519-dalek" version = "1.1.1" @@ -8971,32 +9586,32 @@ dependencies = [ [[package]] name = "yamux" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d9028f208dd5e63c614be69f115c1b53cacc1111437d4c765185856666c107" +checksum = "0c0608f53c1dc0bad505d03a34bbd49fbf2ad7b51eb036123e896365532745a1" dependencies = [ - "futures 0.3.21", + "futures", "log", "nohash-hasher", - "parking_lot", + "parking_lot 0.12.0", "rand 0.8.5", "static_assertions", ] [[package]] name = "zeroize" -version = "1.5.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c88870063c39ee00ec285a2f8d6a966e5b6fb2becc4e8dac77ed0d370ed6006" +checksum = "d68d9dcec5f9b43a30d38c49f91dfedfaac384cb8f085faca366c26207dd1619" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81e8f13fef10b63c06356d65d416b070798ddabcadc10d3ece0c5be9b3c7eddb" +checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" dependencies = [ "proc-macro2", "quote", @@ -9006,18 +9621,18 @@ dependencies = [ [[package]] name = "zstd" -version = "0.9.2+zstd.1.5.1" +version = "0.10.2+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2390ea1bf6c038c39674f22d95f0564725fc06034a47129179810b2fc58caa54" +checksum = "5f4a6bd64f22b5e3e94b4e238669ff9f10815c27a5180108b849d24174a83847" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "4.1.3+zstd.1.5.1" +version = "4.1.6+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e99d81b99fb3c2c2c794e3fe56c305c63d5173a16a46b5850b07c935ffc7db79" +checksum = "94b61c51bb270702d6167b8ce67340d2754b088d0c091b06e593aa772c3ee9bb" dependencies = [ "libc", "zstd-sys", @@ -9025,9 +9640,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "1.6.2+zstd.1.5.1" +version = "1.6.3+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2daf2f248d9ea44454bfcb2516534e8b8ad2fc91bf818a1885495fc42bc8ac9f" +checksum = "fc49afa5c8d634e75761feda8c592051e7eeb4683ba827211eb0d731d3402ea8" dependencies = [ "cc", "libc", diff --git a/Cargo.toml b/Cargo.toml index 01b0992..9fab356 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ members = [ 'crates/skw-blockchain-pallets/pallet-registry', 'crates/skw-blockchain-pallets/pallet-parentchain', 'crates/skw-blockchain-runtime', + 'crates/skw-blockchain-pallets/primitives', # SkyeKiwi VM based on NEAR VM 'crates/skw-vm-primitives', diff --git a/chain-spec/alphaRaw.json b/chain-spec/alphaRaw.json index 3392d92..ec3a70d 100644 --- a/chain-spec/alphaRaw.json +++ b/chain-spec/alphaRaw.json @@ -9,40 +9,39 @@ "telemetryEndpoints": null, "protocolId": "skw", "properties": null, - "consensusEngine": null, "codeSubstitutes": {}, "genesis": { "raw": { "top": { "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5f9cc45b7a00c5899361e1c6099678dc4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xea327c55e400183c4fa3319ff4f62f794e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9eb0ee3576fd960806af7b1ff0a27db578ead40f6ab81301e437985730cc3e09797e83f9513aaa5874d8f9e40c98b2b43": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x8a493ef65ff3987a1fbc9979200ad1af4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93f2eb7994a12372fe72b4372c15b9e910ec62bcc320bbfb7fb77fe4b8cdfd871d6d8114e0542f8037e5e6d9b1b724b66": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x0ec62bcc320bbfb7fb77fe4b8cdfd871d6d8114e0542f8037e5e6d9b1b724b66", "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5f9cc45b7a00c5899361e1c6099678dc8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x080ec62bcc320bbfb7fb77fe4b8cdfd871d6d8114e0542f8037e5e6d9b1b724b668ead40f6ab81301e437985730cc3e09797e83f9513aaa5874d8f9e40c98b2b43", + "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da93f2eb7994a12372fe72b4372c15b9e910ec62bcc320bbfb7fb77fe4b8cdfd871d6d8114e0542f8037e5e6d9b1b724b66": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9eb0ee3576fd960806af7b1ff0a27db578ead40f6ab81301e437985730cc3e09797e83f9513aaa5874d8f9e40c98b2b43": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x910158736b79656b6977692d746573746e65742d616c706861", + "0x35aae9114d26a6355fd54211072671694e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x3a636f6465": "0x52bc537646db8e0528b52ffd00587c14054e07c6921250106879930e804e9f893e6da7046966703cb998aeed7e0a441ab2848580adca839dd4d6d307fdf01dd991021fc60848d0c35f11e8c9602d15f029b5a4abd5fd9ecba271e8d8bb91bd25d9726f29534a29b6123d127912faeadfae1a95edbbd3250a23a9ecb33ff1c5eff03c73a909d874f5c4159f39069d392bfbec4fe3411feb822037f9a12f57657507ba507c2a9ae6a53fcd48e6a391ec8a30bd90e9b763e83ecddc7ec6619cb432cc979bfbeb18c7dc543d2f37316f6f2dc9f3cc59438279e6472e97be9c748ccb9cb524d148f4ed5477d67d38e32677ab3beb984b6ef2affbf4481dbb129f4a7781e8d52f6e0aadca5a3663e66119df68de7f5daa0e9baea820f33554f6a14bd58e7007fd757355c514cf46d8db7dfa71fa909baa7fde1c4e12584610f4b9cfdd951d2d214745d3a449a3c47f7dbba97adc951d55c8f03858c63727c42fc33327617fde5c10fb73c9edad195987b01392af7c9aba42c1142fc4dfdd64bfb2efdf9c3f73facb09c95757c1e53724bb7c725bf932e6746d9edb607159929862791235585429751c24a3d78e4acd5f11e2dfae8be5d09508cff3f2b1f116974557f00a3c961c6f7159fc524eb9f01697441328d2a449932665b984cdfb145a242a9be6bb68f194a5fcf691a0affbb4ec9743923883c31a32f869a50832904bf82914822598acf829e4c50ad24fa12520e18c0aba70fd2c42043bf8910fca3c154d93a6ccab3f606318bcae44f0c53397d7151451fce975f58419af2e397bda03b606e3752545167e57afab28c2f81b5e5724608292484484e41111bd760639f5e5f8e583e325ccaaf059b4e88b95ebaff00b51657f7cd8d4656b46948d5797fa96773bca409a1a78ed96e3879cc6f1da6d7cb2e1bbf361e6f6553bb4aad7d00dd9b239086cebf3bd3e87713c7b6652f834086cebbaffd68a541cb6e738bc86b98114ef39a72643a80153f17ae3e10f46cd76cb210e9247f4be377ed5902cd17f0ea3aeaecab5eaf2c2dc87afecd7958a466797ac8a7196730ea3a86c9ae7ece2aa0859bf1e7db5249b84a7b21c1519fe72193976e5266b462c9fab9cd5cd75bd3ad51fdcf9f07ebb6cce5533d2ed2d57fb89d90f4d9c207aa9f7da78e83c0f4f4b7e601454310a60d47be83c663c7421dcd329d850cc439ec7b920bbcb962f5bed08b3f6c3be5a92deab4bb2ceeec3d0e5c5c1551355580e9b68e22fd75ff7cb2d6efde2e676810bcf047d2bc997599cbe54edc810d15bddc4f296331712d085bf7cd328208d84d9c54d267acb9589feeaa6e57a04a3b8e1623078e3d92d57066cbacac2c65baecfdc2df7d4f2e1d614a09dacd95feda79f3fed4812cb5989a8439716c72e9558ce7e714196b3cb97e9110d898544ddeae68edc87e5889b23d7277d2337a74b2e48fd72d68c5cae2e15019baeb4acfe72d51e30d76e352a466441e208a2af32722baa1f7523a73235200717d2bc152df21205085eba15d5cb4ef934eaa626c1ba69c45f99a51d19bd655910c2f75e7733bfa519e1bfbc3523234b33b27f35cc583332ead4a16664f4aa3b73c4e124b95c5d33e5f4316e1aa15d50742a587ef6478f7fb90f476e5abeeed3ec16a736d9eb2a8b18ff7407422e36f7f8c4d8c238764825b2adb36f8c9a261f8cea6757f6c739bc8098d1407a5d21c1847c5d1d31c79b7c90716e005bfbbaaa9a963708f9b3bd4deada647c7a5e5ac2a8e949946194f553d5f8e7cfade76f3d27b2419f4ae62dd35ba8197960d4dc866094e53a30aadff21f18a5ab2c446f7905b8e7a55ac9a8196f957e0e79cb55f361d3156fb90f46f15b966579c6a81cab0bd233fc86ec1a24965bed565fb02f8f0ebbe125ad2bfb975f6eadb2be0f5f5d5074ab87e896fbf0d54dd55fabdacfe5dd7c0fbdb9c83547c80551c11263ff543dcb1a23cbe1b4afb73387d3ce7eb98c2e57e3c1e7557fcccbd7237749ce5633c27e79e4d81b09fb75b90fc3e842d6b74b88615ea5ddf2c89db12cc72c8c836e595436cd4797cd0959df6e7193bf1d7acffd8e9dea8f3602db83a25f2ebb4ae65584ac975e858a9e21227a211d8fb950f6239759e6599665671e53dd69cfb8b9df19075d6e99c75c8e382a07f8d59de8cd4dfee8d04747a0f7a679cc554b80eab14ef547741f6e6eee4767cd08f4d8b5fb7473eb9093edb2b3e6d8d7c87efbebb6d1c6295cf1812c3ed84d35cfe56397abe9da6ccbedab0f72e4b246ff310a4a57d78845e7790ce34c515d89ec2be7bac3f3ea1009f491cb11c7d98883aeda9191431f1e71fa8b5dab198935fb52b51f5d9b8d4f9847bf7cb59f5137553f729ff6e18b33718f4fea18272177657fee95cd461ce690d37fb279bb4954fa718cf4478f9deb8efa3ee4b02ee8f2e8234eff6954e24357ad87cb6397d5a8da64d3c7ab3f6f37f1497db594e5ea2323fb914f6a713896ab1944448fc3cbe852aa867553f5988fb8b99f00d518affa63e4d17d7ac4ad474e5f6ea61ad651e9678fec3ebc54de439fcfad8eca3eec54d74224a4a2e185cb1c59780083398a52aa4965139fd6373ead0b609bbed9afef905f5fd78151f0d79d5139dcb3a97565d4fe14f2abbeae39dbeccdfd16d46ec3cf5f97aa4426cf4315e461f450c2e7b3bb39f4ed13538032e161d7e53974e59e430e02408840469a947a7313cbf7b41c8aaa8abf7c0e3d74d522aa40a6ae9440e385f6af2e8ab6f1543a4d9ab7ba2e58d487545d9c49bd8e686279d8cdf6893dbb4f3767c3cbcd1ea7aeda04148d2d296dce86efa1557133109c51f39d18d5deeddd4944f1cda9eeee9c8622a566aaeea14935c016660a4dac9000f3ec31db84c8026cebca39a8ab944a64d3304718e38c62e76762147b0ea3def3ea0832cf9e714fa7decf1fcf3e5e7d79a4c8f5e5d88190fa9a33b76797ebbd3e7bbd5dd7839ae35ffd154b7b67fe8a8e1ac9d972fdda152b2bf357329212a9b2444fe500bfceae9a924744f48b6423ca18a5cf2e375325b23ea76c2e00db7ebbba6a47ba8b7cd2249ae65739cde15e7e82d457464d76f5e73de0988d7d7daa2b9f944fcf03b0b1abb7aba6843d483be5d3ebbaf361152f03a412d99e4fd343e761d48c431835b713a326cf43872e8451fd308c14b43c741fdcc3291d1eba328a7ffe78e81ba3d8a19718d50e1d7ac6a875e89a03bb205dbdcea0da1d92ea9a3379be5d2ab72f57fb797c5a573e6d87b3ae3f85fa1faff6b31d92e7cae94ba9da11ab9bfe9647d6746d1e9fba29d43f9297bc30ac9b988f1cbbb2edd537465dde5e6214e6ed52f994f96a47f61f9fb26e663eca38a17ecce5b26e93f4e2f425a73fc238e5d334bd7aec9e0f784a59477567fa78eda6e5d0db65abea3f6eee5f813f9b7cec84e0ababf6a3d9b34bc9996a5637556ff972cacdf8eaade9dacc7852974f53b5c9f894c3a7f6cb9d4fedaafd5c6d716f1af142fd962bb771ca27f6d57eac0e76914fbc314affdb1fa7efb17b1e1111111151aafda444fadb73785e67508d16422155c8a6ab23b8bcae88a6f801bcae88d47859a339d39f5db5016cf33dbb0fc7f518b57b9475e6f6eb73fb199ffd314a9d5d1975b9fa6394e5ea9151faead2e2f42f6e5fea8f4dea0d9bec6cb59fabe3d92c67edc772d578d0b77c3524975bddbcfc72c91a92ed2f57edf1e9b96a3fd07d586e667197abd652b591476e46cc479c12cbb16eee15e70bc25c5fb51fcc65e4e60e6fb9542d76337e748b9bba7acb2f6e5e3c2cf9a1c91053944f96fb74e482a8749a3469d07c74fd8bd3b7b8a9c33f979b45eeb992216f611c95eb6337f7aff45bdd34e22d979b5d9cbe6a5627d40f1fa77c5a6f4ef9344bbfae398cedcb2261d8d4d5923d3675b5a4326a7dc6575746b1ab4be6f697db7f8c5a57979b31a7ff18055d5daef6033b9e6d5d6e06b97dd5d625674136f61e70ccd6ce0ebdb51fd8f16cebb233c8edb3b6ae5abb0fabf6c3eec33eecc33e2c375b4e9fb97dd516a0bfeec33eacdadd1248bd6193359a33b76f57ee79acd3ae2ef5c7b6da8ff269c66f57edc8bef2a9dd87816cfbeb38ebfaca27759c24f1d9e373879384fd39fbeb84f6b7533ecdf7eaedaa2159e76eb2affbb0e67417b4bdcea0e2554955e8c5d6bd8689c214fe7a0d130533bfaf2f483d6d0aa512d9d8db9551d3f4eded2646a9b7fb60d47afbe39e4db56f8cd2305368e2db9551fab3f4ed9ad35d90bfcea0da3d2215874d574466bccd6b9832635e6da4ee6c0aa5ea6c0aa11637148531823380612019d006b0061007500c2803080308268902a00b601550894e034e014b0053f06400430041003f0099e822a8e509e105e1a9f1c83c22bc21bc1e3c1ec017bc1d3c335e0e9e0ede18af8c17e67d016ff062f044d0573c301a0bd845aba0ade82a3806108a4e4153d1533417780228058c025201af6013701aac060b8183c043e815b00f18085cc4649808100bfe62c5006d16eb65bbac0996890e401460d93186789281202a4081090021811f96f808d183cae10030075007900670a5048601bb402fbc443bb151c02c1c02f8042401dc011c036601b9782f785f160a3e829d78733079621e172f0bfdc4c3c2bb42bfe0c5f1acf0aaf07ef0d06834fa8c4785776669c0497852786f3417bdc583c27bc276f19cf04ef0a8e0116c179e1b4c02267a6df0133b83c784e5828df096f094f0cabc243c242c09768a55c15ec15b188977841ef3d8581c74170d83fef26af068d05a3414ad442fc15f184c1fd1443cc76a8149402418097c84f5016be12ccc04ee026ec130e017b008b607fd038662e5582db889e783f6c19bc28383d9e82c5e149e9906f3a6e00f3013f08845839560106c0b1e9a5d71129b66e75832f606d00c58c68e591b6c0da016fb82f56261b0582c97ad62add814ec0af604fb817d62450025c8010d4002c120000f478ab008e4beeed38271035971820126539c000dc18489dc0e220a101326235d202818702214a5880c30110202a8ca9320a23c61c204869745a75879120412291fef08b502e5891321a02098000165c0864ea3523210e509930d54012a820a9327535e280a10111b70b2c4bb0b0a0444142951983861f264ca03011145ca0280f8189a0b3ae5c91056aa0045d18014261b000ab2a1e70802288a104fac442982091052ae3c29820a1013a12a52a600556122f484080c14616548cba1413c612204640586de8210538288e2a4ca1100b416829002045010323416d48a950d00258922e589152b400ee0fa0a6a05e889d0932a5286102ac2c94dc7a151a43c117252a58820980849816285c99329efa44a11bfa3ada01a602285c993295f0528a88a94084479e2640820329001255c9f51202127413c81e2e40a13a022808a60800f4100092184131f706829a8952020808600e2096a056888284fbccd447992019c768202f1c44a942755848c0062b2012853a6386152052808284f8a48050121054aca47bba144307122e424082742403dd8341338f0048a9327424fa23cd9d147d02020a440c1001320a122800032024847afa155a42020eb6175719d29a30a33af2aa92b22a25f55c360f10878043b65af57c38eaaea4e0d35d4c0ccbb6ff9f90ededed2562af10dddbb8c45abf9bd1fcdcc8cc30d3794b6b46dbbbcbbaff45eefea7baf548aa1c4ef954a1c77e9edd8572a694fd34a5aa9a4699aa653d24a25ed959ea669ac3ded31f7d3a2f6dea964033357eaf6c7ecfe4acf4b6b433773fc4c8fe3388e991fc7bb35f8dbc734e4cc50b26078afc495b8b48ff9b14d897ba56ec77571e995bab9f7b8547afbdee3f74aa5a7f993a1542abdd22bbd572a95de961e001e333f7efb4aa5f71ef32e2f0ca57dcc31303f2e31bf7dcc1c0397f8f1bec75ce21273e9bd1dbcfb5ee9bd07c32bbddd77f1c5fc1ef3557abceb634b8ab3aabbbafbc2f6d87677e8bed26e697761d052c9f40264e651dab76f5777e8e36d47e9ba4ad775412d20175d13045015a020aa486182ca4100404faa08dd60838d1518302952aaf40802c20906a0409172c34d0f12501013212380a200800424040c3542569e1801e4e31202c28995284eaa089d74a8009e6400a8ca94ceaae204080a103841a2004d99e2840990104eaa4811b2e2632302000c5425034caa48117202841428509cf810828ac108291a1002002a0701788d008230110050901328186022449427435871328493a21451a51b9201a12262300268082642519e5499c204082b4f88f04183a6020802c88a15a02a5388900204932a4057a40001548589132b410001c42448102a07014c0102a82713725205280a9010344428405780a03031c20911324821a4406122449427420821050a0c71082b4fa23cc9c0e91a0208212718602254c589900d02a8626586d10632f0a40ad01526040892430e020802888914a1291ba802c40c40539e68a01302b272baac005509824529420a104c80849e54d1000e18079e586192012952aa4ca101b3b201a02026518084849e54d1009320a23861128413a02a4c848084101281887822c444280a50952a45d87061200826424f8820420a103957a200b5a541984491f2c44a15a02b4c84ac3c810224f464080d309122c42488209c301122ca93a02a4e8818028828401860226404100e57a200b58df206aa4821028808eb4a14a0d6d14ac0aa1a1a1a1a52a954966a48f5865e131d52a91a36d1a1a1a12195ca1a52a9ae26aad5a1211de226aaaa511355a986fa6aa22a95f59aa896552ad844552ad5d0503719daa1a16da2520d0da9ba896a5543aa6e32b4da44b5da44b5890e6d93a1556d1355a9b8c9d00ea9b889aa969ba856a552759300b00c565597082b4e341d84484021b2b03242911248100523a420ce4318060e183cf4b1e0b52aea1e9f221f1e1e563bf81421e3f62943cb16e8b3da61c90f54f8ecc0830246af61aac0c56baf61aa2082ab492738b33e4f0ab7c87ac90f453efc80a675d47a4fbcb7851c4b2421c71952d8420f3064c8001384ee69a2028d9b140da1658218024c117393eed12eb6fc6bd6f822182266ed9e2533ea122023d1a48b2d5a5877128375f42d18ac58677b27b40c369e58a2056288000a2f60f8e25f982a88e05fe4ee5dbeae4dbae7eade7b3561aca0827fefb196f9d33af469fa79fab53aeda6a94c93204e2b308070b27a2405f9021f3c1e1ec22384a77b7c5e6006f67c7887d8afb7c7ebca0c1ee8aac8339feccf6570068c2a1e86d7d597332f6b4ca6d659d7913fce24830d0749fbf3a77a761925fa547d0fd231ef28d1a3ab8693040b928eb97e6b477c786f185bbb95394ed651418279bb15d523c9bc1debe6e55977d23f314a7698772744898c3a21fb18f763ee5f5d17d5d6d97e9e60a7ade3eb3e56a9d5d587b1e9733737fd4d811c91285322fbb3740dadeaf5bbe2055cbcae5ed0c40baa60943e33333333b7cfda7aa605185fc4785d7d99e267cdb3e3f05ac613517ccd172fafeeb2669d3525db6f878364aaacf86eaab2f8edaaf8abab7ebbb9e455b949f30173fdadfa73f5767505b0f6a3dedb4cd2ee08a9dab3aaa33daa3a4ae4b97641dbb39fb4c02fdbd41514ec450bc28ce1441c1f80c216262788791ed36b18277479eb358c135630a6c8099ef7e5897fd7bff71e8f98213c4286a0e17961b640e2df7bef3d9e8e07313eddc373805f9f33fc7b8fd322055020ebef0bd1bff79ebb12d17fb1e3e1138f0f1753745fdc0e7cd29e13efb9760f02c208c1099698c211a0e084d4f3c8a817fef936847f6e62c23f1e7cbef8ecc0c32821cf679b3e526ba0691dfdf762981c1cf1f035cc1a5a7ec6226bc5fa63db186ceb45bcedf6b8b50e77263ecded3903685002122d30c10ea8b08415a9d769eb30bb5cd5787cf76811769085299090c614b4b083148f67dffc370a72c16c3b3e0366a4400b28a260c2065548a9eb4df39c7e8bac1e58f175f5021bfc3c7d402af7b8c9c425e87cda1f6bfb6dd5dba5429eb6d841379fc8f09c7e9cba67c91665bce61f4e5bac9a4fa7a2d38fdda251dc5bf34a861567fe7a25c3cc0c7e9e9860a9af4fca205ba74993e62dcefeea66fc2b835a126cc9cb1eaa315e4a972e23b7198744d7d0902819bf9e2951397e3d43a24ad024fc76fb72c4a9ee446fed076a0a50bdea0f29394cff474f537a94be9de5517613cb63fedea8533d45572d09e6db5dde17d76eb54aee3b0163546cd18526b660628b28b8184169a505191909ba90821c513c91441c49cc710385155ec0e375b50512715896f5de7bcf4cf69647cbc2a24b0cc37cacb5d4086f91def258c2acb82a4ac2b22ccb82e2cc5bf0f10e5464af6168c08387af647451c64f1e6ca11952bb677dc60d85802d5c0c4175a7afaeda650297055bcdab6b49870e1d5070c18b0c86100511c4000b1dd80aa8b8a00a25ca40510697336cb4c8b2d2c2092c0b394654c85e575ce04197550c6cf0eb3e1ba37c0746f56f0cb8f8e5b975e1cc3e3e950cb30f7cda93c9bbe7a5acee876e0964667f90995f9771f79c5a67bd3b97a7eef18175d637ebd3ef12176cbbaeccecc34318a561b268e32d4b0428886498b102fa60662eed0965e30b258e904618211061085b163ec8c208a42cc6c8628ab68840050a302ce40b8ea831c30a2a76bdd062892a9060c51b68905153c6961f3c7b8951a6f7e1ed7555841328c1f2ebf2e8f28a56bcb4a0a0a55812853782900428e690420b52165db2d082a928bdaeb2c8f2f275c585346bd4bcae721087c9d4a69ae752767777777747f7e1e59acaf5af0b6a67762baa6f6797d1ad6ec6785d9605e17bddfc964fc6fcf9e552f5d12dcb17ba126c1066095c64b3163b2ad763dc7c6e45f5d09f6604faf3a7fd405f6e5e6eb9b4ae5d628b4aa26fec6610f420edc777467dedc7e26c9158bedd0c6a67b782daf2d5da2d2e08fadb5fad5d35c89c2aae5503325c8045ecf28337c3ebaa0b175dace0e1e91e98c5c3a2e675d5650be4778454ebda106ced53c82b7b3bf4cefce222f7deeb944fdd5b24f78ccd7a75c59aa73b3e149e5fc7d9e6617fd0998b11c42c2412747185151cb10427dc404b811bd775f9731ee80403be30021920480208ac2093adb098e209d097fcc027b8a47b2c5ff7e91eab5b527a5e1111112d919a3e9e552a50c20b2328d1c614e418428a3d324a3efb96822703062d78ee26149e67c85bb67d2ea17cfc8cd92b1965a0d9a155c18659ac7cba6749172630be7cc9b52e2fee87cba716f9c0a73924162ced096f0ce9627eead063629d75d6613ee9fafcf1ea42b827639d13a3b4874dcb8002ccdbbc96f1c418afda7e20272747630fe88326c2f441ed199f585b875d7746b79ca13f9f504c6ff9e5d2e22e4e4bb045e7c81161625f4dc995fded5e4784e96117f47cbbbe96a1f0628ed755176404f0baea020aef0d8b1e6e133d9b8575a0eb12ad0b36ef9eaddddfeb363e417f26a959734630ea753edf6358973ded4877a5ad7ba6b40e74b83d9cc227e8ab836dff415fed88109fa03f08f79b8b5ff44bf4d0a70871cf46444474440afab35ce3fb707372b38d51b0c43dfabac827e83bd89c51fbd0977461e6a107c1a8e7d087d822fbd0b5791ece212b9f6ac6c31e4e4d65e3b7e8c52135676a995f5f27b6255d864febcfa5c5f1c0276b879e25adb39e3d34b960090ffdc56e42c979e84bf8b4dddcdf2636fda945dda3a9f512f7f8b4cefa7aec1e9ed6d9ee78e0d33af7686ae6fcfa86609b5af4bbbec4871f18c5be5e01467187802d5cf009041b8fd75511b4f8f7ba72811b3f79b44c93b1a9622e280ad34508a8b04076006830bbe2f47a7cbeddf11529a33af4a7deaa1e04a13f97bad7f550d75ed705af6bc629d4abbbbbbbbbbbab0a1f84afd5e183f0b5b5d615a494abc4c63eb3875bbcaed8cdec17898d1d767268e35dfd69596b590ef5bd10fc75f5c0b6ce6798d999999bb9b57d322bb33673fb6456666d666565d666be6275777777557d7557557d7557557d755753a0830e3a5c7e753cdbaecb9705d9bab59fcb9216b70fb3a7fdacb3f6bcb59ff6ddbd22a773fe39cecbd90e27c93af47dcda587ae4367289551ecfff84167d83de8123ee80c1f776fb3a1abaaaaaabbaeabbabbaeabbaec735d5555887f7b0ac96e62e3e51ee12523e16527e1e52bf3122ae1a5b5849717135ec6365e626ebc1c35e1a574c2cbcccc4bed092f49507859138597db1b2f6da4f052071c2f6fa6f0b274e6e50e2abce45185972f58e1a5298be3250ca61778ec28dde8b0d96a485a264758bc2c08430f92aeaeb8c2ab76398e5d1b2d536ebb62cc5b60d3d51536f8697a761f9ad928917d8e8c52222c855496c23bc8b8e9ab61f6f7dee3a098fe05d9e0731fbeb62c5f20bf6e9afeb9e5931d76ca5c6467efd263668f2ee332c3c7dde42b367373a77cbab8b6b809c5c4ed5d85bbb8af0c696dfa826cfd324665cadc531d3dad7624fb7edf1d152cdf0e371fe6118489c217af2b2cb4fc8c16b4b8d513f4d590bc97accb24d51dd875617fdbf6964875b9c727667e0fc524c4ffd3c57adffebe3b9c240d3ba1fdede63e5e2ea432eaf952e93473f4b069567778e8395b3dc10ebc8bbbc248ba2a960bc5af22b4fd435f05b2585843d2df2e5fc61accde15fed67ae8e66dd2e5aa19e9bf3a2afd16a36677dd5359cb6354f1baba828b9ffeeb01780d13852c2f6b9ee5aaaafd40317d7773881f7973d3f49df9888362fae87cca5caef6a339cc98cb619d75a93ae9e53bb4c88e0259cfbcfd710f7b7bb69594c8c8bb9b504c1f2377723ead0b6dd1a77f0e9fd66316b51fcda52e3369d445dd696c6a00e39e9eda4d3d523df5638e7513cb8f7cdffad390bc1fb9c675e12e0bfb129ee2ee4bbba5fd646e92a32ea81df3f58c93ddc8650f88c6d6ae3ff2a7fd8c96ddd2907497f1691deb7c6811c86f0ea3a298beddf2f59364edc7ea78b67eaf5a77d7855db52153ea0b4e1218c5f43eba129fd6352bdb34fdba8951afebc2bebe8c428016317c52edae8b164f71d7dbcaa1556d5b5ea4764f3bbb7a904d75d69953d599f1b7e36d8855cb38c8ddf42dd1f72221955133bec6efe7f7fb50afb9d3a4792dc23ed5dba56cfb41dd6d95fd34351cd884f8f500ff968d20354706d9944f4136ddb27c79be84a7beccb57cb6bf860bbbc7a72de9cea628e8b22d4edfb7f70735e4323ea9c776e83ba15b9d428e93b2b54325ed41b08bdd8bb2ad7717b9eed9d46ed63215e47b5c7379139fba93cd3dddd96e1a71814d5757a0696ec6ef2e5a3c055db5ed84fa618703c57b43ab6a5e34e4cff65e574c64e1d765cdcf065f574cc8a1355cd1c490212d98e375b502369e00af2b16b0f12e6b462e836cd155fb11622e6a3fdcf16cebacf1a0bf9d117c1af9888751232df3231f99e161e4a3d28f7c34f2d18a055ffcc873b807a646231fa27b845867e4d07fd4a3d1081bb1f1a3297c1a3906b6e7ed53cffcc89b748f0eac33f2d1103e8d1c03db901fb98951d147ee8351988fbcc4a8cb471e19057de419a32c1fb9e68cbaa025ea2048b99c136fd2ee1e9f38ea0e7b0f0b6cba5262cbcf2cc394883eb34725d2c59bf814060e1974bab1171468e9c2af673a85b4020685386418236c79221023839021a106beae4ed084bee6554852dd513ee9769147f477092654775677b9a73bda4560d3d509c4f8993d9f40cb73962feb38daebea045e521b07414260933dabcaddcd25d292d45c79ffda555b39c91a648c5446a9fae39e2c9867f9d21e5d5d6ec62b98a98684fb4a4064796949768c6b7524ca53194292c9103525cb2562da91e5f254b64ca66588a0a680acbf1de33485595627b5240b85d494f0e8194d53b2aba7b26912a0fa916b5a129e357fb95456d585a439b4e52d97cdbd24d21ce2f2968fb8f54c53c23e8a9ca6a496454e53968684ddea78b54973e8411082b77c8b9c13498965aa1de96e6e6b3ce8abfe604d097b2379de6df96c5f25cf9b4a7f501b513dbcac4e7567b66f07edfae37092b0b7773737a0da2156c1b6ced8f25bd32e6b3a76dd97cc45674d01aa3198dbe83eac85e8471e7d5d5d621e247de4525a99e5d19fcb8d0bffb2c8cd91a6396beec39c458ee49cd5d4786b3f1cb9eb52e32498e9caba02cf95454ee5f81a979057dbaa711f56b8fc4899474ed9f866f769e841d1473ea3abbf91b776647d34e2e831fe44f7e1d590441fb924719a33d75fa3699aa6699aa6692e3b23719acb9791485706b51fcd9fa624b6e650f361d33497fa7a90a6065e73e6f8499cc6f15a5785492e647de61263c6349273950cbb3c2379bb724765d390382a3260fcd8757996b9c6cf9dea0f8c931ce6ea71ae6aba3656b7f1a9fbd799f8c4eec343abca78a4455533db47fffc594cf8d751e9346922f61ceba2c46e4687a2eae2cc5b5dc4f2cfd7a337f75cb5248a06141fbb2e505a3e877eaec72805c8b27acbe7eba611df51148d2d6ff9e4c0bfd845d1369678c101102284794c7cf13e5e574c94e02567165745ea22e281842e927802d1f3ed421483135844c1a50a0d5c60208648688ab6f15d888010210cd19502645919c181b7bc0b12da46eaea88b48d947658d487a2a860054538620e22a214ec88b210117537a77c3fae9d35d52060a30424b8a00b49a44993521e4adface2a165688db1e5d9d56df8a9dd36c1a76d02488954e1f92ecf55da046fd7d7c12ecb123b29e85a6e52edecdb04a34acfde03a2b14d28bf4df0899dc78d25599a6c739b78f6a96e3c3b96e75beba8527a852ac2b0220c3065888852d0db21a7a9e688de164fb4000916dc209565899d54bb969bd4cbb204a72cd76280543be4b4182085e58b0fed5896b40e7b1761f9e283e5b0c3e2d33aec5687e58b0fd0bbc3e2adc30e3b9ea9ab55fbd422c502133ce822052368a10420c034364da9a418730315a8800c325e5821a5a9e793c7076f8251363cfbe3b475d49bd3d6d9f23ac3d0532dbf2ffd1e07b3b75784d0db23f40b42eb878fe013f4d6a0efeb4a8927dec4274865d3fc73a86fff312f61ee3f578f4a04baba843d4ddfbe1dbd316fcbdbf276ccf26859de6eeaee762839e30f3cf76176cbd7729ce7fbfc382f0496c3cb7afba2eea8379f01620b72c9c61a13667c13b9ae39735b52a3654aa449ac2979bb56d0d5437f4a042a9115c2279825cdf3f009ba6a3d9744ef9e91433f758f74e83e18f5f8141dfa1025e2ba131dbae436d6893ee222eb448fdd63629de8d04d8cc21cbef0d095cb4f210ffd0525b20f25c6f5eb2acb1c1ebdfd358c14b2bc0f3ec5e83897f7f3e35c9dae9448e275a5c4116fe253748b5bac533e29d41d75d59eeea80fb10a727fb144cf4ad8e097a8477f2e11bfae9418f3ebab29d9235ebbb944da73e5aebc577f5c929a576f4e95c87cafa352f33a35cdcff6ebfc4ad8d6757f39b08d9a571f69aa3ebeebe77b8f73006b32e68efbb1183dd97546e687828d198e48ca27d5db1115524ad5b49baa29b88aad9583a26652d2d5b713ea6f0f52d5a70a551feaf56bf8e0ebd60e3e081f27c4df5d6c2934f9f6209b5a3e3775e62616315fec52d67ef47960d32eaae26e1ad9cf15a5b0b7b5df7ccf5890cfb974dcd39df525430463f655b5bb342ccb6ac8adeeb4d517b77a6a68bdee86d02debbd67c19d311d17c360f6d6f25e2bc806fd71bbcb25885637a93dc01a0ffd5bdd8197f52cee335ef618a59932eaf56489be84a762f705ba42bf82a0f7d5e983aeff9ce1834860f7ba67655be72e56175b87dd876b94483f2c2425c2ed014d89ecdb0c3ac3d7c5ee79a9d75ce482d9e42f988dfb9b9a1a1d5e054608ce1435910325a438a3245dadf7de9bc1bf28631626dc9842172e2f70230b2d28624610cc58c34f9e331282054c08010e2c8490c61444cc4842983239d0cc1823c754da724e3fe25632ad2e2c10e06710c1192980020c74a0859721af4c50c28b174618c2156f9ca0c4732915c4f8c20a5b8c21842984d163c60b3333d8789e30b3da35a5b1c8a07ee703562803cd1634c4306186e7813d86bc5ec633844708c3334448a04209a8b0058a297c91e21c9e198b399efb0a234a29e88a0b38103384288ce1c51642b080e205d848081c1e68428c186471234c12570ce08a1574c16490060cc02cc10226b4a082005a20032e5714f28615552892c2165200c507dc08c2021e4851c5bb9ea022411a30ce8882145fb82186670565a44022429e213c42a410039a30564ec8020a4cc401c40a1694e3eae7d3ed60bd310531b8d802061648d0200901e0c204ec0807c623afebf2010e951246d0a2062940f3850564ec5841c55f3ec4eb22238aa2bfaecbaf8e51b82e6d630a2d981183222d1ce144eafaf1d71546052ff8cb823bbc2e04db2b1952a4f1ef354c11c4e041050eaf2b2eb400460e348e00060b1ef2069ecde49e73faa116132727a0f193e7f8e62c021d2774c17df31c53c93de7f4e335c1040ed648030b28c0d0314364135ba004166cd184333e8082d3988b0c2bdcf8e93cf00736fc95130021065db02842125090fa636b9df5f9260f8f90213aaca1d6121900030961d4c0066f900004357c89819c514ab9c123726640038c1b826123dfd841256419133cd1851731f0a20b1a7040461765f0609147488ef389e7b90a0b3172c4400a2968e1082b48e5fcf3ed79c9d43d2a155091c619299060083e1042eab9336a867f7e7aeff108611d1a2cbc8ee85e0a11b480032e27d801982c16cce65f921c82304d38c1cbd7304d80a2870d9c58430930bab08613dc0864fbdb2e7fefea7c78b9de7d5c7743ab82bc54c805b3e1fcdcb6eee1c236b7ade43a4716a8806389287e800227a498555b123cd634ef4b515151a954e2e1e16166e6762a0780df5d16efb53e3366ccf429c62b72214488902ce34cc928192593fa0283c78f85a011762a078059c8b7aeab75736fd77d78798954bd61d37a4034b6556d330ea206f399c3c8270104f0ca3e85042000380cd9b1c1869c2035b87f0c373cfb946106130c3e668c3b667c322349ae464fec232e02aac38e710e783c9e3dc660e1f0ec5000cfde0478f608a8194b7ae6f033c6e813bea53b97c7be3abed8d009a9edeacd13909a63c1306fc4f14a860bcefc3c9d9488e5ec4fb0c1e3bc8679c20a5e5e99d53e79e890f07aebfd16bef576f8169ad92ce76735840cad85ecfe16a7baf394c76606269eef3d06247b904db5336d59bee8fad06e0c528a2db2c7eed936b6f8ec5c01a95a84797db66b6c6edf3e22836c1be38e1fb2578a6d6e398c9a7e72e8f3c7b76f998dbbf91c3e7fde6c757377775b56775bccccb0bb79ba0b1964db18b7ade3b165f9b20a909a3337246cb3d3ec7da39ecf6e7e6fbef79ec34ebef79e3f3ef1e3f8387bdc7b5554157e2d5265ff25d134991211e26f87edfa2284cf67f6dd3d7e529c7ab0a7f1e3f541d12df517a36a8fe935aac76eae5f9dc549d9fcd783d6ad0eca89f70a733ffeecb8b0977bb0df5ce7c7caacbe1df7209cdb0860620c9fbaf9d6fa817cdd84f2cf959ba5d7e8eb97f7b056ca167d9dbba0bd768d6d4bfccbedcf07a5e482d3a94f307c0c38a6f5c9a3b440a68e679f35af3a5eb5679fa357f96cf99445de0261d71df6d9af1eb94b71d03d4dd2eb69ee78761cf4b4dd84e1d999a305bbd96eed632e88a75120bb4fdb657cea8eadd3aede9acf48f2b9fdf3ee81244ee3b475b2d6697fdd8472fa8bdbf8d4debe45d82ebf5447baa97bb06e9a7c64faf6ac9bf1551af132beec86441fb546c75aa3bff6a719d9ff4177da97ccb65e653bcae99fe5edcfe3abf6fc755da02bec864ea92f384938cae987fa3d30aafdc897a9c6ecefbd990385e799392278fe75419a4b285daa967573c967fe20a7b9728c1bdcbc7b6cbc7d85b04d2d22f9928edeb1dd861bd23aed35dc06615bdf389ed6e9e7353d4dcfa73f9fa77f5ed3cdf8ef7196476efa93b8597a21a87193e72dcf38c94d283c23ae5d32a7fdbce9235f33b6e7eaec8ce2ee0a7ce83aea66d4d8f16c30c20394d1187a21233fbbf59ca90c3df41e54f6a1c3073703426da4db85fabbfbc2609e63f4319a787f0d7383221cccf13caf617070c68701a38d363efbe8235f71f139bc8619238e1fc38c3fbd8619a38a97bac3a661c650e3e54bdf9105d9747c87f6135d06d97450e9345072dec659fbb169e226c9e9f01a5c076b36dec44dafc3479c10fc1a5cb59f1adc87e5e3f7562169c434b80cb29d6cd8e19ae33b342371068743b61b4d623e0337a475a2a5973f1a38e5530ea77cdabaa9abc77c87eace4d3755cc63ae43eaa69279cc6b50e331b7e1b4e831d731e6313f616e0307e3d5cd4dad28258fcc9d4fea1874391a7553881ffa903265c890292a1223e679a4ab67c8434b32daa11db9c1a19bde1b3ef4c1f1ceb0f68341aea4fd8c3a1f7c521fd23daba549ae7de3da9b6bdbb8b68e1d5aba67572fb80e0c7ec2711b62f01a64701a38cf71292fcbb22c21be1407cbbaae387e06c0a385c3fe78706c91cb230ebbf3a3db893a3ee3c9e766834f530d3e9d869ceb8ad7a5ef8d37c7c27766230e7285b807cbd77d386230c66d33995c8bb446f087ec825c2edce8caa81f8ec500745737dfc70e078dc95fe8e130f8701c00780cee3274cee97b63c7a1cf77e6a5df70839bd65f903bbcd3e16ee30070dddcc78df770130664a70b008f51b7e33b46a491df6c363c721da30e48b723003b17e4725dd7760f8ef786cd0f4e731c38e93e7dc30d5aba6706679d6ec65337b71ab7a19ba692d7d04d771aba79cae926cf0cdda2e9bac9c37593878777f32443374f250074d363e8a6d7f8e8a609a79ba61e1d0cbb32752f74abd1f319339f5b8d3f0f9fa7213b7870da3a3a4a9cb68e4d0da7adb375d3f473c8df90d672acc31c8e2d0263dc3693c9b1138661dde59874aceb822e1f39e672e1f57e848ddcea306ed4e15843ba47b151f467d2cd909b6ef2f090ba793a6d37dd63374da651a75837720845c8479f50843ce6373e795e7a0f3886e4f3bd741bed48f420ac9bbb694ab28f3ea463dc369369facf217f7acce7e9e710ac9b5084fcc86fbac9f373c893e2c8b77b702c10e852fa83638be84b87da8f1c5da3ebbaaecb7d7834ea1e1cd7a5447ab76644761373cd08e6d195ffea1e1cd2e4431f1cef8c4985707a2396c8a44430679718776d3f398a67571f1c7c189408017487836c37deda922434738c7b9f33e5e1fb918e2276e3236e0ab1d03372e391f39153860fe71f39bb8f1ce9372e610f7ecc7b684730a7d245bc979dd07bab932fc3b87e1f8cc29c838071ac854f9c059ba59f8b26c3387e1f8cda2064a30ce3f69551373e7d3cfb73894f52ba0f4b974136d57ee4121964c3b0c827e9230e0acf639d9c50727ee4122322e7b12e48fae6164744ce07dd38e691eb92b994dccc79c96d8e7133e7b15137731ef30d4deb700f69d35cd9f473d160d60876d37f2e1a1bdf55f7ac16df216c7357be2b5237e3635a37b7c77c57af3b5637fd315f2da5c730879d96d18c36dc2cfd8d4beec655c3366e621d949cbf71796518a7bf4398efd130eac6d9770eeec99c87e80efb0da7039fd8334e5b67c6118771ec32c846d25cb51f4d3a0ff1d025877173c32e0cbb82b06898885197b38fbad16a3f712339c64da1f7d2a3430e8ae9312c935c29cc86f9cc1ef39147e7eecafb914a4ea37284c227768d3bf3ec3c248fcc94ad66248e675f216c73d13c3b9aee69d23aec669e7d32914d1c8265236ed5d8463eb31f755a8ad1e525fdc2485d3287fe18d5458ba73287dd6a5a92d18f32edc8e652bafa0ffa23570cf3ddc2a891639c6a3fa3eec98ccb52f2253c55e3525a31468b0bd2f42646cb8ae277c49bce8755537223351d37dde4d75c4737594a4dc29f5837df63737b1596a1919c1e78cca5d08fe6561174e3438f71b391f45bb29baa973e7a38f2d8f934c64157ed477654fae7bea5e4f2510cb2fc0673cd5593ce7fb3e5e1d43a78e3522ebc514d763d587e03bd07f4c1368558668ec52ec872cd314fa28d304e76389a439723c7ba8964e49863be9a929163fe03a3a4475f2d5b04f3d8497d6c87cfddf2d2376eee6f5ea31d898e754198df3829cad18e4e8e4ad26ba4a61d1949cf462319571ab76f59966569375a16c8c8a3a60f39cc7570241f71d06db8cb7d7adbb0ee073ec12c35be84a732c730cdc2b42e68e4d1a54fcc25670b822d32f73165430af114ea7a401f6c42fd56173472cca5c785ddf37a88985b9d50ffc8b10ec772e81ae650fa54365eeba44fa1fee8d02fafe19473d03ce31ee7a07553a849ca06e6d0a376447a50ec34bf3425d94bd94d2baac75cbbaecb2dede7c238a86f8db8b9811fcd0efc68e4aa21813f7a6fc9c7b68c5cf5d2a5ec7020f03cf3063ccf3a6d1de9aac7b8191fe326e6f08aaac738fdd82d081608749ffe6141b045f4a16f7906f33a4336b4aa1d5a1e5ad68eb4d13fdef2c923a4e433c7a70f85dbeb2cbd9aded46dadd35eeab475461c1cb38d9ce492b51f52c7b35924cb4f96f25c6bbd0d0c0f3725f2be9b34f2b6461dcfe63e3ce2de93381f5627c47ff9eb12f7f8609dce4a8cf2c127e6cc07a36ebc7db3e9a6ea6d9cc4cd9c2775ebb4cff8d6668d7c9ade52222ff8f4b7acf7563749cec3370e8ed946be79ce5f2ee5c81abdc0b9ee5cbe71253e5d8e8d34c7b4239a76c51a1ddc6a4648bec37d9a94f33bdc874b8ce2e1dd45c9f91d3e23a6fdf0e878b61d3c76b88f1d5d97925fa56e2827f5e5a6cbb9b24d89e8b7ef0fb62aefa546924977d849ae71737bcd47dc9c32b7bf9e8dcfa8c367f6972ba336bfdce2a40db7af83533e691f6d38fd8dabe148dc543dc9b7495cd65d9c748d9b99ec78b6915b5cc627bef27ee47234ea84de110ceb4a70cc66c1f716c34ea8ffbd2efad0aa6c1e968554edb179f5b958ecd1ee799daacee6cc6b83924b1f8c8a9ab5508d6fc74912fdf21aef197d5eaeddb8ea8e0e8f3ab819fdf90d37a3dbf86a4ada67f4eb8b38befde68b361e663eb02c6a3f96476ee4a5cb31cd88eacebcd9994ada6f3ad6944097a4ac04fdf275d7d199ebe0702c27f916b91ab7e1e6e5ec1b8793047a8d43afe9702cc74942f2cc499d0fcf5cb525496c4a8b6a90e91a179475f12537e282b06e9bd0afae14bb0871fa5b9ef97c9ff98c9f8db21a9fa5cfa24fd3673e3eeba6e5cf6b3838668b9e798d2f37fdb7a6e3d9624d24695cccb81237e2b0d8b176e4ba3acbdbafc06f7dbf2b049f9dca01ba485a86c2f51a1259a261c26c616ebe9f420cb9c9f3138a908cb977864f2c997b677c9acaf5d7d043b7cefc14e2b7bca56c7fce5cfbe3de1b0b841d72da0f1c0b84fd397c642c41c419e4f4999befcc733bc7656d92f2699d5153c59df369af6d3762d0c65fafab181ce1d9339bd7550cc6c4200ed622832c7f3d875c50fb4335e7c3a769b9e5cf9168462c7f3bebc3a736425222fbcaa8bd669472b3a735405349689a95e696d6c5d6597f16846e41d896c46006a56367306ce459f4d10883d02536393a167dee4308bbd9fe2eef2b66ab1969bffcca9488957d2bd39dabdb99a4df2ddaf4a15f6ea9727e874c21bf0e75f8f59d3cbf487467255b36b8d2cd2ed4cfdd7e19328487407800c885b9f9ca137a46d6a9689a3442efb7db5dc1a6b1cdf838ef45647c44f0fce4796c830e7d7dfe785c894fab45d19441852ea091822f2e58810c6e64e15f37b10e0acf9bba8d4fdb6f4f9bdbb812ebacba08d3451aef5783a08b305e5cee56c5eba409a3a6160d2913c4e9870e674e16cca20afd96e787221f7cd88201be2cce7093d85ddc0f00f09c5e9320d8d50c13b89439c2116b94200b004c0cc373181a9c79f61f8c5a9e17e273ea9ea7a71f505802855ff78151d6998be85d55e0c1e85a22e687221fac1df80400336490851516ac908318e270e3f95a82bd2ab4012fcbea8a147b2080507db0c6185948800512b2c08414f4f1108689c3060fbbce874f4baa3087e48656e7c312266cf83db4a0cf6d0aebf1403804fbc2f2d7f9581c0f17b7c3d5455fbf7c49f7c42cb99c8e86196ab84116189e14229a3368ce9c2153860c19d6c25b580b6b0103e68b223365c814912963c63b6e862e67061a726aa0c1861a78c941018a72d8ddd3ce0f25d2a3e82d1b70cf6595691de82635b63160ccf83265d42a0391c8423c029102813ee3156cd0929aa79fb1c803da64883265b0a87858a262548c1144683a8ed4bc8ad07840bd80f1e265b7ec14d8965dad98952aa54acd0bccaeda64bace9cc1c088598901468c95181ddd0c33e4e4ccf1d06940a33b30d250430d36d8902d372399877ed28ef0473574076a1c3fe3ab0ae1d707393009d97e5c395f0025a23d5751ebc01e0b4ceb40df5dc7d132cf39d89651aa445689e8438f42d09eeb4ceb403f42777373a39ba697c20c52a4664483119d895a22119a33682251d40206cc17ab30cc60972be6238780e557e781cb2d1f751ef8e28307d4e42633b6cddf02d33d38eb2357a5a05b62740fce76380cc0fc721f30bf7cfdeab07cd9ce07cb471d96cbad9163b11c4b61ae4a71b175a0639c3697b1cd58148bbac702a33ad063376377336aaf61ba600287d9e24f0b4c0334c5d33a435a07bac531199ba66cd0929a57d143975751f768cacc45e66151f7c43454077a11c828a1ccc3f884873e2f330f6391eec0ebcc43bfce306a5a60ae3818e50f7d8fb0cd58f4d0a705e6a1c7224629194e44f1d0a31adca323053db2211576411898d719862e9535b4d646512401b0e993336cfa6e70831bdce006356cfae416b6f5fee9afdd992c616c53cd0cb170ccd6ba36253e653fbb2508eadddd6bf251526657ce328319cc60063360166cdb8d8420173e3e2933ef96ad7b964bab3315db5c2e0f8a6d6e5e18c5cbcb854feb05fa5e2104bbf5c265b94ce1d33a177d6f369e9f17297773578ae6d78dc0126453ce8ff4b356daee6eb54853f59b1275d8e1e882597119bd86f122cccf2d529fc2281c23cdbf6e44ef9390eb97413635dad8964cd10036254309313fb78a5fdfd516308c5232ac68e2d7f78b35e3d7b70a46cd9dab250a466d911adca3297ed9f149dea74d52dd797e059fd67bb92c61b9fcfa6a61d436c1a822d559ef4e8b48af61bcf8e2e78229fac8716cfe735b30aad360c27811c7cf309bf573c16c99ec03527326cb28cf6019a58ae1414f6ba0407b3612e89a4051a3dd116c0bbea550d63358fc97ad7b4eadd35ac73810d340305dd9338298983d32764f32c8e28855b705dbfad6daf1f5b4cc101205c14eb4c895088412b9627acbdb339faa853878d03778e89e2deba6163b31dca9f6737bed7d38c66ddb6416649372756593a86c7c45e8c26e814bc04ff012df7e8a1d4f9a769db1e5f47ad32dd82c97a4243c2c0f8cda92f4cf4d8cadbf7da350224a85f62c9a9de23b8d9eda774beba451d49ac0048ada2dddcd3de2db7b678826add38ee6db9b2811b57eb0fd2bc21680ed513f6d1178c3a2309faa8369806fd599a8f8aa1dd9cc7d38c876b96a7b5d57e4d3e57a6da5697a99f10fb6b95b9ac4b86d26939629f33233c1b7ef16d5695755d4caa1a745c3a77e722813bebd9b04d9d6d98c2dfebafffa5394f6b3bba57b9aa84eef96305d64f9b95cbe9dc36cd74f2d735dd7752907b56c53ca280e8275da674e133ef591f84d74a7dd05dbf3c74952d628d8b6748cdb6632cdddf2ed4dbaa7cb60cc25d20047911269572cfb842d7c51c475314599d4eb94738806d0e2cc992da38a295ea85fcf60238b29523820c219671a0a2f50c3cc86a18412a04949cb82ab05142cb1a5b3c71920095ac4a4e4cb1ea7399022045e523d67b2a049ed122580c34c191fa84126084e9431a33ae082042f2939b2e028ee155678c114a9b6a26005970cbe68f14fab197c6237b21637b729df42ef47feb8a74a7973984b4e493bd6cde57cba9fae381e7fdd7355caa797b33c688e6fd797fb94f0fcf65f79bfdd9cf242ef479ac2b0d5ee89adc3606c2df47ee4966398777439e2765757d8ae6bcd60d47657deafb3ef8a517134d27e6227f43a7ed44db7081a44453c56731b87e3c373e8b0c3a2686c493d558ac1d8e2ea4b75f63815f346136052ba860b8c20464ac6ec712a041d78294a2d156154814b4ac7784184332929a5758430e420bab2c70579e207ab541caa297a1c962e7a8308881b53a45ef70507c9bae52a39ca1e87454713b8a4b00c3d1feaa09822f5bac70df184a0054499963d6e6b1d9e210b98d4d06526a59cc32c65cde93f0ecb17082c1c32e80151ea390e0452cf5f3784843f2fe2032fc618226a36a21005510a765beb98d9b2df6d15234dd5f3f4200b62a41ad31169cc0d704026d51cbfe6b035c42a6e1d4552f56d912d89ef5033e7f5f43745865c1684913366ed07fa0db7292c918d305ab234cad892fa32b52e883dbe54331b06b8f1c96d740f6fd174d369eb4cefadc1a521e13224232bad1e3681eab4cf53cf8db309b44706d5d912b38ceb944874f51994488d6bceab4a4c46c6fcc6e7f6bcccbc291e63b3f1cd87358d71b0dd286ab7d093173eed16aa9bbae1b06052b4804c0a737983cd55fb59264377c2e84e7b0dc765e84e3b896333f8d43ee2780c9f78f5ed1a8bc182f910c3110230a92f1b47849af9ed82d86bd806cf33d8cdb2ad014b1289f4de7befa91eb396e7e8d77b3632f4ec8fa87b5a0ccb757457073b0d09bf188fc8ea5a8c1623765cb445505cc49cc65357a3671237bb0cb965ea12e33635c3ab735ae471d116791d7361e6207cfbf4c1457a0ab23d0fb2693c834d73b9190f17417b7c8e70996ff76122a86422288a8b48dd5c1e640ce0d482e1e2c75f2e3e87b15e326f1289e4241229cbb87c96edc053db98ca86aaf13d75ccb76bccc4f8f5d1f6ebe5b9ec668c1da99ba6cc8b966559e63eccdcd39dac53ed0ab2f1707ec159fb79c1fb25173f72fa244e573828c26b5cb69cc432e66a6a9c39cb607741c7ca8d6badefb074c888d2b48d35233c3c5ba8b9f51b57e58d32e67870936d9c878d0ead877db6c1f6389b17783cdd41e9c86ef4d40e83a2b6949a7e08df28aa889eba019a2a7990ed39c6e1acef70554a96b84db1986f9741b7c89ad13dcb031dc2a825434fed5e5a87d3d40db7a9e57cc07c4787a500554021460a73897138105831be1debbacc82691dae019016893f5a44c81e5194f4769f1d46df3ed5094ff23903ce0d917ccfd9558b3132f388633574a75d724c043db53f2216820269ef48ea26174d2e621a6c73bd6c16dac35cd68b12591319db0cbee776c1a57b342506986ff6f2cca57b380dd5692f82172580e12788c145bab364b6a92bd45c2f3b30ca3535f8d4ec5ac76418157db2672e99e39cd56032fe24ef2e02c0c683f49a5bdad362b44ebbe6aa45500ba45d735614bbd64d52c764f8d49e755cc4a7e6224669dece6a700f13751aaaa3afdae383031ea88ebee623ed47eb78361ddf62748f0f6a8b7417a44fd3dc5c0cacd3d6915976c3698a39fe196ccf65906d37b3513e9d54245f2fadd34f05b29ba6ac5b69dd8c7fa3f5b0efa57bb8a8cb98bc9c32975ce4ed5d668b400562326d9bc6454f8a5b84060542a475530ab1e111f102597f9c8e4cea0da7a9e576b96cec3ecd5247c65c74a9752cc6c645dde3ed351a0336c55c5aa71de3707cc0fcc66f3a2c378eb92a256f38ded23a371c0e046ebce4a58ec1b44efb4dc75bb4066c8abdb44e87b1cd1683cbb7b7187d032df254d06368db408990bc6d7c9a347baedad3655aa73d731e5a0ffb3abab9df65bae7113d156c9168d34dd3d6656abaccb74b12c7bfff88b648776181b4c9b46d8f68959bc4eec36ce68bbe9dc1d8266f795f2f8c2279bfd77cca52c6da933acb379571b3cbf8f61a8dcafe152ad773f77487dd7ab95ebe7d743dbbbcc998b354dbeda0a899bfdc1282167f7525ad0793fc2ec0df1978709e7d9e6e9e5daa2e90f5c7a555d8d0aa2c58e40ca9297d12c7870e8bb60d0e04d62db73a0fa4d4a1ab5292392390d3b6e12fdaf8d58e3c5d8561e6bb9b42fc3848f8dbf9bbf3612afbca9caec228f343ac6ade1a48c92e573b9284af24d65addefc19710be9756a6967644bbbbfbbaf8659458a69876443be805f6ba32038aad24c71a6974b1c4155684d9428aa3d06aac9047709173fa31031461d484d14209bb2a23cd5fafab32d0046104aa83375480850cc000c389350e200539b0d7304e1823862c444041182318430e2ca40cf01c4716324c2082e38931620ab06eddb0454659dd7a743088de08abc73c1a018c94d9080709e6231f75535ad29f76e4f9eec5e15c0e7b888e5dd765e9137a23d775cc2dceb175ccb78bb28e93043ae6d0f555efc31bbbb9df83655141027ddd8aea9f67ba33daf78696b6ede7b22c1933d576b59fe7979767653d5ccfbada7afb5697c019cfa69bc964f5c0ec9f5f9b16db967258875dbea7fd40c9fe097d67cd41c9ded2acce5db06d47c9def2cb9ff6735d56967df30a7477779360258e8d7bd4d57ab053b96648cd99b0ccb3cbf77c7777b7fd35d762bae7fa2febabadc501d613747945b8da117eb22653dd4a964f13cf90d7a983ae36bb34321dbf6753e2916153f80f1e2162ced013fbcc502b26326a8bf87486a236086ac614ac034331ad130445c135b48851900c9fc040305b740b5e07c5906154f3404f700d45f5183db1660532066da46c1c86bd552659be8387ab45ea968c8cdc7be8d29257e4d8eaba5cfb4ba67b5a8c98a8fd58fd561f09eb1f610f92368e24a5cc32ede7b9c4328d7bd1881a4e55c7ea1466598cdacfc8c6bb867b365d16d5204bc608cfae4e18c9172f4dfb694d4312330d23693f4dca32eda7cbe632abe1b290e448c61fed96693fd1e21c2cd7b41ff8b81ec3d5683fbd592e61c8784e9e6da697459e5b5ad3bd6ea7e8b4753ad51d199f2fbefa6aeb3df8361066907b16c9825c5f979591c868eb98e18f9a915d27e8408f1a92f898cb68c361dacf7a19590e83c4c9748b3c9fd642f5b7452c8b7bcfbd856dbd2d6f2016127e98713da68b9eddbae2b2dc877b740bb676e923e339f9c3b75374cfd69162ecb623faed0cdb67f461cceaee16ccead910e3f9ad2e973ff81ed4c2b62e2d5eed476a8993494d8b40320b841dfadc50cf67c98a3e79b27cc1463e87907cea6a2a191bf5d116c95c5bc320992d02c52c10315b24ebb6689e5e5db7475bc73b32cfaedbb3604c359a4febc81d59497bbe83b3be53d51939c675b9ba918ea6fc68fbd1eed8a13de701f7d71fa37c39d59d88596678bc90f1d09ebfa01d618d7babe55aa2255aa217bae83cb41fcc79684758e3faa7d89819c24c8be9319895c36c33cf5b973102dfeaf604cf6e7a0e837684b59f2e3f68d1122d820186ac87f6f3bc8776e4cab42e975b5c17928f22c9174cf72c1928668bec140b84dde706e62714736a9dd6f107665b9fde6378c9a8b1536c91e68102616f636b369e1deb663c4377e64ef1ec3d3423f07587fdc100c72259ae43fb79adddc363295cd88192dc31dab183873fd2e5ed52fbe98e6763a23ff373fbb9649e9dc4b598d661e7a131805357d745adc3de214812fb055e6d52c994f1d094bc8f2e61c84c1a04344d9a3469aed1957fac3ad061d090c48f2e7b64306810d0f285ca900f3abd2a75b9ec2e2ecbe54b7ca132e485faa193fc71dc54fd3e12a71a044733a2fad514e4f41f37db03ffdce2e64b72f396cb1ed9c57dc1d17ae834691848b707703424fd38d9c57df101d787f6d33eb28bfb72a55f774348c2ba2b8c611e4d9ab558670280b6cae5b0974186ccb59f2e577c0bfa5addba978bdbc2eab49f2246c5a29771cff5fcb5cbc875518be93190ebb49fcce56a52935aa752fa0eed47ca1bcdba5c5d96cb97f0d4d57d79ce693fa3e7d2e173cca18fba2cc836c2b877f36c380dc9eb4add634edb58dfb524b1c788615411b4d17efad55c5e735956d769a6126c7086e55eced379346848e237ffc5f518d661af41fbe9aec578d9d6678bc996dbb74153d26c44218a23be61678386e4fd93a788912c8f416223ac195b4c3592e52358c61a5a157c0988c29679b67cb59f6ed71f37b96ccff25dde8b7b7cda369fa57f6ae61fb7f1c6b13de6363e5e9d117c62672cd0bc2aefa7a2798ece2e1fb39a6935f38f4ffab64cf719d993e5cb95fed7ae1ea3c3ab53974f43e216175fc22cc876f96a4a3888c6f65cdff2b7de5a12d847ba2c6e1ac94999a345cdf3edc327b8538b1eba1ce2d75575392826ce874f50cc43e713849d42d1a21c3ef50f930fef5605977920836c2a97594bb2cf437ef0cc1c935ecdba4f77e0830aa1becc8250d4cc8f76ccdeedcc656b57335b0cb259561664532e9b366f5bd715398ce77553898d46526e473883af792169aaa2f6b38d32a94131bdfa48fbd18eb95d7dd8946552cb485a4db61c49fba9d99a489aaac7b29106257b754cfbd1ee859e3328990eaf2e836c42300d09ffeb68b418498261eda78be5caa867f9e05367b17c094f59dd97e7a6a07d5c6741b6c7dceeae77dcf998313a1111115321e4a7901c23fb99cf1fcfae8fb3adf4ecd775fac993fdb8bc2f79f988c32cbf1cc3f6dae7965fd7c5adf5181a592a6cec104211f2eccd04a98ce2543b0152be31591b410261f4d2c0947b45db7ad4256cebd602a961146ceb33626f81444ebd7f5dd6bc2eb6a6f9a864ead5e983919c84502944033382005000b3140030301c140a862332a9ac0b3f14800e98b4525aa60ad42489510a216488410408110000100018a16d1282270a19ba00f49260726e5d506662af47676e0ee7575db8abf021b1e562850a8375dcaa58f1e288e2e1d763cd55cd1fb289a62726b0972d471a0d831c812100714b7308084a4d4238683249aa18046d52c4d21aab83f1834e46eb5c82acdbc803760d051d09f10bd505d3c0597dce40a0ae55e68b3346f5a25d3b31c63566a0c9803e148e474ad9289e81f1361b6a8d09399c52dba48376eb27c1253db33158cd1fff9f0644030518b26b1ee7f00c30a22a370c792d069da19348eea6d1f82c1a9f28c1491a3f91c0996461c980f0c5ded8bf44a1b6a10e0350bf539ca4c13ed187356032b98c6758362b37774b865f0576b2d5e09be23bb3f632d74a4cc861cb04a54f1944ca408332f864600c04d5c9e4c3e4b3b3680ddea5b7a49caeee3b6fafd4ac6cb97e6ed2bd69bd6c2e24555a59a4f1b7e0123e715087f2c02e1d045a491b2a31a4a8ea2396701d216647de96b170ec8014234a02032cb091946caa94bd4f83ea5fc87776cbd40c27a08fd7c8e959a0a4ab1f9a99cd7d0da74dae77f45ac562b5b958ce0aab9916f01a4860e985324182ee5e21a25d8c6c8ed065c8fd265c0f53647164b0f3090c3acf0c095977a0a4f3a49a69b1e2b6015ad67c7fa690b70de1980df8528528f8a1e8364514053f8811c221cf8f426ef1d0be478e063c81fc2f3e4f8321d2678eb4014537992d1179547868060f68fabda4d5dabd31e4206ce5574b7c76b67d4b77e00cbe3ff2c4cc03d2ad60f09c8a60e3b03c94a942334e839695f4dbaedd051ff398b6828ae7dfa3d94101652c197b47e02666b2839625bc439b30a3f1030c314503d74a4a3cbf6f883a91a078d6a3011ee1e90f91a2ff7a4efbab7a0a7a91c1eff33add77dc95f681ccd2ec4c2bbf550a9bd3a4d73d329d214a136f337b28ea670ab6aec33f0559e6350c1fa9902c64f36b68885d1496d03be0b8258123d12b4fd3300892bbcf575f91e01ca20ac366b93280b1528e3392a54824ed8278f706cab3698ced66e0b8576df37595c65ab1dbedc6753b37bd0f19f27ad6fb7a3b606fb38e81d491c198c3be0abd851e64e6fb3caf0866dfccc8a98e2ca17e4d3fe85ffd96cd6f49f96d50fa56a244feb5251b80a616153590d60fb7dabea67be2a07459a2b92ca32dd2ad8da1f6e1ee726a212d09fd91afc78a9867a1634e9c89e94510a996b5f1b6d1fd334da11b6d5a4c428cda01c8fd4140f439f8c65bbbe5b9b12acee4eb62efe828ec641e82fe146c1779450152f0bf3099a122bccc4074111f574943246e9afa40f704b2261476da55ab0612f8dfa495535430a0fa43c883fbfa60c4fa8080d5d9495c049702e27074d4367485c22280bf18ffbec93b91ddb0162d24171b6f3f832c6e34d270ab846b4e6ec226e5714af7854a50ae2a3310e59afaa7f4fa135664b554021a27ac25a512a04e0cec74a047d1e37fccf15136ebc87a12e24bee93416a8fb77dd49c3ffed1e15d0f33fb6085eaa30849cbe6ecdec7d97c23ffc65adaebaeb16816b6b96594282ac7ca72dc661b3f91a5a2685b908419cbb70acdd82aceb81dcee4c8ceafdb2dfff6d23738bdc349cf6a3aba44f79417d42c16a93a30c120495955c0a6be148dde94bf2c2876b875234e8a2d40849a6b164abfe18501f3a42d4c452f900404444f76aee852ec248c6fe435463f608492984459520942f860def694395b7fd1d2959134a4d2b42962517279aa3e7a7dccb2cd6f37f0c7496002e87d4ae5dd876a1f3e8c4a51abf74982c830907707263d2de7cdcc2b4e7470880909397fc9dc70bf165c209b4ea0556fdb9da13eb5ead40a04b3799b1ebbb8521cfc26287e0f5bbf21709cda84b15417e9472d1a6cd89232851fdd4e8cd1c06f87157a7860dd351e67fb08ec5af8a3c9ecf702aa26e6fdd4f7e09bfc1c41f81e5176e9b0d9436d2dba26d15a314e83847d3ab337bdfed401c1972cd3751350efb3d285ab780820f50e16fba41fa1cd7fbd5d2086edcd1c49bc4b8e79b9588533adba126381a2825afce346e1f0321eee4f0f0554726fac0fd238efa151793272e7d24e6bf80d55b83696c8f9e0c720a1ed071459b3e601a16b6caa5cac438a872f882274d14b2c5615b974cc3273156848ad3925d123b249d4509e446a4af40bc48c018800d523f9601ed84d62d8cd3504c48efd2114e312552c7cec19148c9b661455f08489216ea3589163a55119414d65b4338311b56e344c28d5bf92a767ca6e08ec19613876f9501bd4b9365aa917fc3cf2c80aa07e17d39b33cbfb67f1ad65254d505d3c30e59b9216531cd345d23f9b7ba443507ed9cd707c661f67daaeea49ec2abe56ce0fdd31f5554243f2d2488b733ae72c63422965f17a53b9ea3e4fbb9926479406a5440edf6d65eb18a5851d589fefa55e00f794442e8ef34807e12d4be292c22b290f5e80115d842ec706ce58cab1098a4ab0f413fdc852066d99d1639e0b8b77c7b684b7a0024604f5a094d0776572f98559ada4b534f70f89b949b184b6d7a05a8d4e394cab2b363cee218daf3c94378856c170ff5624ee4f5a5b6a172a6c6bf5e2e3088af1bb6e2878818726ffd15211f7d8a63eaddd2db10db16f9725f858f61f7446fdf73aa20999e24eb7048ef0f51b3559cc310cf347ddda60c010511c631515dd03e123eaff35440f490031fae83f1342e0c5278341a3102dd06dd2a641312bff9bc1236c91e18e3c62ed4398b4303e89724fcb6e48218ef88403ea7d63d6b49edd2c77d84b1a117da52af97eb97797ae2550bfb23ae786086fb037bb36054ca7d97ee9e945acf91f555c8425c26d6a88d63bc8da418b22aaa8991d2a745121bfe571ce481510a0edb370ffc7689174ba142eddb6acbafa5a950f7c1b2939457b65a2b846f46b0334c96d37e134efc8fbb91f0d7a296b7e79a85cf114bbd549690d16b4b30113491b63936aa39779bd8ae76da61abf13f6387c7ea627dced57f4535af35b6cfc933c624e8132e26120004d95d3911ea36473766d337b4d3cc59ed3e12e92f4eb5cbccb69f7d1205006b62a316ae2aae1ce1dbd01ca8c1d0dd44a0b7522ba31f9b441e3c2cebfda3344c5ea1645bb7e04a046331e53bd7388892556f079cd259a7378265ff7665ade8d36226e43e337f03077df9ba6328215f703549ff2c6a79c091b681e591bf2401cddce6763dc7800393db40ac6a6d331c4d55b3047d09a823340661a1ea56c741b84cf397851a608c1a5cf35859d514b300321fe6b822a9ec5f6d8cf9f0a3fe6cecebf11dbb242809f69d368da0f0b7605c6f226867447dd4a2753ebc4a7d34e60057d4968df50dc86aa15e28d03f79a4e5798dd9af61feb3d1c59ac66e15439de1dc9cd3ebb2be7bee78e8261d0ea48508e447532cc78c4b741fa8a01e8c16b4e9d370ca4506863fc39528b528bc4d758a56c0eb5fc05a37c66c5bbb21f804dfe4486ea69da750fc14159fac2857df35690a3fd5982487cc2af92a36dc7a5ef1c59757b49d5718b94157a5f1b2e89db4b3424a2333ead6962a1b8a07a9e2b0559c929f33cbb1b55297dfda9c37d6f50e1ab9ac4922691d37e550d55e47796d21ce4234bba461842f03f13a34b584bc0ca4e812256880b36f6810de8b9958d41a04c49a17a652e05bc9f13e3574bc484d65d381770e36e7643bdc6dfa1d3e33c0dcfe7de6d104e7ff7956707c97a434e8ad719d0d6110141de3320ad0adfd619ef490ad388eb6b156b1f613f7856411b735b51cd88a0c07166b883c4a5e679a8052b1ef55f5d89c935e928b121cfdec3327e7527404d9973c9aa5560253a7a279db74a0980be49c92f284ea3213215cc86e7045aff75cdf6824659f8e59222ea2033b6358c9036bf803a0563cf79b3ae2cd20ecf67b4ed1920d36feb86a64145fcba707a3ed258cec8c1d9a3c9b048ca561434b7ef4231b2c036ad306440753a29fad007b8e20718701773acd438a2d818af0ceab0004c0680265735faa3f7ce60c6b2b99e0282081b09bfc13cb5ec0b28ac57c10486acb5fbda61e85eb91ee404361c918467b605d86b14cbece616d0d2b2c59c590b10234d101317c69add89ab9011b0739191c6de14b45265f3fe75817b57d880bfc63b61191ee0214dc9ed749ae10f6f26af7db85796de5901d836cb4e32deeacbf7670aa9b2eb09849efd95b4e585346b778ef6e8580755d25e5f2fda3c966adf6134cdd4f9f7f21322227504e4520b16883110e492269dbaa8ce2498c8ebaf486f60d3b03ab6dca4e4cd29c98d1d09a4fe1ff207f45b8193dc481f49164ef0acdf32f22a02e0d14838b4d6046e9c38e4eea27e15a69329cd82c1c7d143de391ca3cfefc2eb867270f888dda4d390b35df8d422f0ae48b00422911d0d326a2c0df3ec5e65aa7ec422419a171b8e0f627dcf363e5f3a785b8d5385afa0935445af1039279bc5f76072ed6767b7863e1780f323cbae09495f623e1a8d2d212b51dfe0d2bb2311e39042e0a94dda2dc4e4fb13d19ccfb4a4835342a28b38b75701623b9d775945fb49dcb8d006d75a0084c930f44a57c7b99a00fe827201ab468db9e5bfb703398028342ff2eb933066573544293266ceda67d356f03343df5229e0aaaeb53cf5480722891cab5af176df43c051f33926e96d2bcea0d3e892a547da43adda9ca9ab9afc200ebbe089403950262b4b19cb5c7cd3ce35c5d674814c28a86111f039de5f0ec2d22e3359aa12a2dd3f334e70399d8a74fd7b2a7dc43986fdee8a77e28449847b329f460498fe69751e7d494f2f58e5a46d3bd801bdb2ac0c973b883ee00245fd3dadf5a12103908efa38621f0c74035806a8684c2b362301dae16467d1c848a2662dc882fdf27d001345407e206f71ed6568ee5cc62de067178b48556fbeca033636d584624f090c8e0ae4c92e0800b7594602b6b7a7e7d28299c1d430b85443d22d63d85dac50b23151787b0724fd0ca8a0425a577999a34c731c4b0604f6d3fce79267653225afe32049c1ee3a0ed4970b80c950ff80adb3a83b46ebe898df5b105febb2d93c847020036b2f972e11043a7917256ac6e8f44c9430a32dc0ea2546c029e7dc3c56d0a8921bb8ae8072f4db43c472a1481a3ca407e96d9abec8ee3118cddd010018ba3215d1bc8ff2779e8b5de740ee3beb55fad32d9acbd96f6b3bfccab8194bea8ba338a3f636a51e3315831a0930d110a3e876d5df522c7c270d06e40b0ee14f75af103924f85322c4517d4081f293cf739daa7212cf670d9be1bccc712b7d1ec1249e14d9d6dec29d49087ae0ff27b8770dac0fea0acbb0205e2c1a9be1aa83911bf909a957f952507c3f9fac44c2819d3dbe02b484bde63afe3828fabc67f2b03dea59b386e570cf0456e252084dd6eaa093038acdd75db94f21cb21d73e3930f4cbde08d7e7f09aa36e1a7e85ed79d0a2455d8ec2f37a131241e4e9cede41ea76842ef8228d2fd7b7244fd26519aa33969de745c0b3b68557488ef2b541c902ff43d7b81df201f53ab8fc4360849d921e6dd3bf1092b6be4fe42eb967d038dda956ed81fa589bcdc3f5ca354903b6e868a0edfba11e5aaf8ddfd09d4c7756d9559d046770e8560d200ab1471d36eb307be8584a4605aee4df673585111a1d21399a8ed3a421d2d3e32d24c0e45beea996b73c1b3adab30a60f2f246274dcfe4d88901b9afdd7875c3db1fe34f4c9262a12c295d7e564458d4116305593c0cd989e419d8cfb78548750c9e017d3f2205aadd60c691e73e1841d6ccdd2bd4482f74ddafe1dfcc3e602eba0060e071be00d382f3d3420f70c6ed0471d061546b425819efcf4c1bfcab59845a86d9320de1456344a9c04554d703641399daca9d177bc3900c21846121414034d0e379d9710cf0688fa6c2b2df0d33cff07e8755f5bb8546a977b5b58c8acb5a7a118efaa48b8ac5864aeeb5a9c72ff8cc2d71ebc413d6794ae2962ca44408c00da737d21593b13b09517b02f8fd5907cfb674d0e1660e7dab8296d4134778b22125558a4cfe818c9ee59f4668eb251f0599cb7a31cc97a013b6a73788cb47af1785e16a8c9c50eb4464328d6529ba9b08bbb984066c426d253402a6a055741fb0a064f0fb117f1bf0814065baca24c39c7b98760d35d24eaeed3bf222630d87b698256e1006fdb072ac50f1a933a5e0f1866977d3f629ae34b6a51cedef108b3a41dae3db000d53be5644cee93dcdb970bd4db164a93f250a07588d95517b1b6b7e2651519ce63a671dd13539240b68de6ba6810f1e83e8a9dca665426ad128c5443ae1cb8561d9410cbaa6acf8f2bea7a8ecbb7a480b231710ba9c907b7759d31e9cf1587b7a986ce22555230589a9566e935d30ba862c7d4e4297d5fc03f76e9fa2397718fe7128ba825cc002b65fa05f9c18f2c211ba5cf176a23ce3539a1b42fb04ce57ebc6e72bc5c2f122075bfeb4bebba94b51e184a82ee30596f5325c3988a90a26465d62f2c266ddb801403833149c1b200a450d110f9545a9a8c280162aaa89a2e65d260ef843c5d95814c4bfff2359653fd8f18723d1bd1f98ea182d2a33494776ad4835f9768840daa38f51952688f6d2ea88aa014ac90b1995a8eaa34603cefc7e3243fc2991ea771621529011d5224337abff13dd4c3b2cab2ca277c092e5bbe00c0de131e57d38c4114f784e86af8f8bb74307710339c31f900969b1a1572a18f0a629e637fb688f34fa417a478c2459394af2f9cf782425e13dbca8ba631ec718856e9c687823b219c8bc78b1985883be1895987523d6305c7c40458598bfe171b54b9062f12f822165d42076169f5f40e33161fb9f37c71d8552274714a8c56941606591008975905318ecb2efa55791b5131a2071a0cdc79592affa466bc6b35d8401deeff44f6582a43548857b53293e9feabb597fb575571d22d26ed88b383a10b00cb7aeba6ce9dfbacc574d589b41e468eff1ca1de482d0e202311d90c697e2b38c49135ba310084baeff69fc76faa7a0a43533668cfa56651bdd0836c15d0b0ac4e6144e0330bfb05f70e3063f0d0518944617db73c37b3d77f084012ff81baaa175fdc29353f83d08a533bdb188a4e8a18391d073003ce184b71b612072515c001e30430922cb86cfd924a441054a2ab4a22bc5a25090948798c08709525dc599432a651d0bcbc0d44e6a5fed8688ae0550a4b74a9b0bb80133c9ec4cd41caa94ff63ecb717f70f5fc027e052caa1ce84669fc046392b61d4c66360f49ebfc6e84f5c61587df4cb8ccc4269af624c16f48ddd45909209d831018ad1ae4cad54e7433b07a78adc3f5b713d73104cee9988dbb93d4209f75d864c1c3041a5107189a0ac2672ec6dd3e808989d4361bd3bf5fbc9990a1441ffc00245f343489108f2619ed21617be2e27a51f683971ea6c58c425298d410d363bf11ccac3ac61688a15024652af8b7a16c5555e0a262d2dbe9949682f8c5198e31a0e91c7b01db12f789d98782840cf57acd2805a193e62605ee2d71631bef182b4afc063117d7bbc32870a431068b89bc528dbbc8b9822a270d29a2af25113942bcb890be5fdc146a2bfcf69f41f2e9790046d6cb43d10d471058a937cab0874fce9e10705b37a988862eee728d52afdf546c6ed43c58ddddb1196d5f8f9342a12e01d0e208319a8aafcb9e4b7c6513a4238558d753718ac02204aa5b73f74e783f9a845961704d6a07992f4d84d2d51fe201226633a69975e25256cc3bb631ddc9a582c0d22aa9070440c50b401c8322bb52fa5f7d93ac09119ffb558a38e3053dba91f4bba96040a3a10253b4ebe8307965234c36dddb36fb4160c09b3f0e8e6ca9e9905679e47e38f842daafc06e54616664fe51eca1ed98ba239c7743970ea983399eb351b92d4c8415678db70ccc212597c419ebb250f739b641741cd738c3473ab3be56d94f7068441248ed517af1561658d1001d4db6aafd8aaef549bce03a37030b5c57a4a380fe09611f948a94d3433e2dcb25191317d703c274eac0ff2619464b8686842fdd17fe1b7980c5b77050688971e6349ec501336436a17b7f05907330fc0a5018e78785c125805739e2f3cc340ba27a12fb08990e24096125ca10a34fb98e85de42dee6200af91a2bad1295bdde0a81932818965590fc7d639057e402552f786d138a2a612262900d13371d701e9d0d9480dcd5f2570f6c5a9c2a44e62f15f478a0aea0e478c7c32bcf8f3f0bc3c6b3c8d0491d462926462b34ac31999f491f7f86282bd4eaa336b75c80be930128fc12d2ca5dd3ef945aea2556500c9c5495810633595b292ff229c26bff47d89687ef0bc03d65b98caa92308966b4c57bb7d781dde4dbf34f748c93a2ed3e621d2a55c44b1e1ea3d6df88f0708623bfefa52f193b2a0b3f3bef565d48528dff0365bc24d6b2d831c160e703948bd5acbf5a6b13acc85a61985710de26fa0afd8b1d8a4282662e082603fd01ce779bdfc1009d83e97683668ed6500a396f1fcff1688ee2678a1d57cfb95b8ee1718a005a4956266cc8c91abd67216832143e4b5cc9d6f9165fd24996230897ad69ff9edeae7fdccc72a9a6ea44eac0ddbab6276eebb1766970cbc4c5b787bc76251ec4aa0dfd2debf44118e1de3b91a9245bdf0f120bcd41123dc24774f6e5b601211eececed9886f5a434f465bf6848c9c34cf3492ebc7a27b499a8c65d2bb465afdb94bb544b42f4d4c3a226dd4d5a52b85d6d24fc9edc8545c5b988984ed43c2ccdd1a96f1d60a5cf82b26c512959e116bf46f9f60d66d9f688567447ae87d87687e8b31ed4a964038677da2f838bdc56fe39e339927589ed685d41580044dd73aee520b0ade154f0dedcfb2aa4eb4bdabbab2052cde4a58fadb884b3aa2df4575e0b25bc98f0ab955aa8760c129b62066491decf9e0ad599f06c908070aff8058e69202ba5185790d051527f1e07851da3530123c13c7a05ad876f1e02dcbf244c2535083eca640e992d39db21ca4e2bddde6869c9a898f25f00f7aaa75dff41d5e871023e7aa653c02042141a4b333c08971d797a0b30ee6b80a4789e6698cce0faa8d94f52240c81803d88a98cee5460bb7b8361c1b34002c911a422116b0f94c254da68a287561f2f3da44742a3fa856499695c675389c68441c2e12c42b46f4c3444e7bd9f2005ac55a95772e07ab356246d6926839f8b5bde4a276db2d47fcdc58ee667ae26bceacb7a0d67198af6d51eb113d26716b6c2e7503626142167d567e1f1dfd93577b954af22a2621d59168d7a5d05360f83b20131c745c318ae95928cf446cdc63e1ae22ebcaef33c0c6ff52322990d51f13895a8eeb4eb4db1ba9176d3e90953dbae4f80622f5e6e2ddc1550a604682f4f57e0d40c41f541fb65040cae2cde88ad5b0eb45bf481d3080a169bbb6fa21305d046e9141b367b4869145c4404c720fccb66eea202e02d089f2eb34fc4d43d324b680cbcff59fbba2d814147c45be80d1416d04775efa989725f40d9c854192ecfe9e5cd1074f17a9ec1a0cc5fb1ae441ae07c49383da070b37f03f218408792a81cc6d14f706e12f33fc61f826186705a17485e470f8fc8f2c659470fb5c0b7822054c0919f7249421f25c3d5bc35a347e3587f0236a057ce45d8cfcccb8eccb2aadc86451fc6d03f6a264cc71b26897fdc756275b755a104a59c3ae765d0d55e56a390168cb5c3520836da9dbd79a2a005d1991dfc7fa09c8a6962dfe48cb07cb7921989f86cb2e7a0b44b17b32516074c8dc32860d561f99a3e03947b2f3393b4913b3d572e1d86a115a8e4816a34464535a68f280d5619384af5384882d92264a67a55c65d310aadc28fc4eed11f0200cf04468616a73624adbe43577a978f10a913aa3a43d9f63683458d249a2be6ac819a0904d64c256225f0e857e78adf3f70a42ca81a0f4a36efc8ee2e73162d73819fde855206c65b0d68d814d108138f642dc0f942f32f2056dceca57df3dff73a787ccc595e3538ec3e390c22762a6b07246f7556de34901cef784036d3f4c460b34cf23cedd5041d381782adbe5d462ea067eb4df1a46d03bcd94b4c0a1ae5990e68b7aa4eb50576dcbe5d6708d1253018026c6999566b67e36a06242608b7ec2086d16b93fee1c98ad6323e9df907908a0ee1327927ed17734b97f81e919ffe7842707b548464d1e68e7985b22a5160987646bf9830d88f3cd1b1dbefec905e3b06b5eeb8a2e5b09a9f45b57b82d07680b782714fb1c2e8a09cbf158690373b05d88e5a3ac4498525c0df56cec17fe13e7c1955d96dd10834a20e900a84f397922007b4178deff15bdc4216b2d3825cf7359cc53f130a4c45367bb709a4d60d8e1fd0e5c1d23e4ddb910b0f76626014e4ef4564b11436be7a50e782a3ae1ea7ed74922278c05b2d7de33bf7cc20ed0b82cd08b2411c97c151fe2a6568bdfe9bf16998f447dee8188ab9da2b34d1306e72eb2fc8c0c34e89968705b1eddd9f8b85f9d696927eb3789f1169d5ec1cc5580a9f83e42c66ae407ab0cd6a1e2304c4900d04d855d5ce64bfd56561f58bd79442279a2c6c3539c7d1fd8896235fe245ed52a1004b56c4c2e7856dac306a5f49688de26de1b3e16fdc37e92baeb1c8151f9322965242987cb7db32a84022e72b22e28da2f749093975a8dd06607900584fb3ff3f1328ba12e59fa6d95400b424ac7ccb1a0578a72f43497cf2e31b8a75c8ed92365558ceb36b424390f887cda589053cc4484c600d0c9cef8d789e86dca995ae9288904afe8940bda053a8dec92c38bf3f5655f08b117b15d0aa23fa7781b0b2001cefb7ac36c0f09dc9b3dbbd5648af075536eafb68781b45723004f597ff930da2a1828ef46c3f2377e45582235960936324aed56945727b1bccf9bc201ae1130df67d5a3941e7a43f338001d16376bf41cd47a16adaca43aec00f957412f4289342fae64bd71e6662d2d40c78e05074458853d1d5d952c9dc618cc05346fbea2a60a04391cceaaf270156ed4000a480458c765bbf791de03196402884a59e115ddf195c91204ef7d73f7c41c14c58c6384400c2e0a715bd618bc06f4e9fe24beee38b71be3e169973cd0f8fcae290cee108163d61ddf7c5646e644a618cba141fa8710a7f82d17e2a5ad4b72bf005422639bea8453539e64e46c283e4ce3f96fbecdf713b362c55614c8a768079675a095c640b3b2cde42ac9cee791cec03dc71bb71cc2a4b6369769bb1c81923423a0a3091c2540c8fb88f872610e561572ae461a38de0980086b90828286198eed1ea5448120c8694c6d05f6136040216aac4f0b765af00db167f11d12089f3bec0b89cb7ca69b6940706a093c3ef92fce5769a285c6389d412901dc11cbf5bc78fa83ac7be733a3df5d9e05f89fd40d00e3808a1460ca61ae479a372f4c43d81bcc738d5fe3ed1dd13741305d13dab57ce9185146d2ef8fd1babbcbdc3f18af98a72f201238df9facb77bcdca6ec24f7760329bc8ca319c85cc6922399920dfc16f14aebee9e23ee33d9982c4f6fdb69ff1d65639307f56eae12a34b1200f66d48e223e03f711cf3af0c94e4e0cea7c86cc624484dea09ec86ffb69843968f98d0647fc160f4b7ed7324d5a9451052396e703a2d1885ef87dacc76ff9a86064e677b7a09dd1deefc06fe4c3ab9c76dfc661d05ee91bdbea9da4556ae43ced5175e08f434b54349466bfb6366be5c29e061d3a26e1606e766a7eb682f9900b174f5b8d6bb95f0a136400c9597975e56ce057e0c6aa21b6367bcc85059da4e46bdf2f5459822e8eda95236af86592780db3173c5d54c298434724bfcf822d9c58a5e12aed8d12d4551bb50eb43b1ad4dee286eb6839c465a96f6ce719ac94d38bca0ceb3d4941c6b9d6a746bdec1cfdeb854d9f2dc24890727dedfa59e581abe573e0962a6bb411e2284acd2ecf9eaf20f5823a007bb1e34299405e140c1ed13fb6cfea52d0594c4c91676922040e23e7be029c37d20e9805c88837e4de18530b636382625c36c0b18d5c29e687f509789fea90ea4d6c6368eaba59f9545c8e84d3c01a700be607a0c72b77bc09d2c54ae2e40937a79791bf4e6af1b9fd0573e7b914a63d20234da659b22e8c6715f1cc5e9690c112106e18ce1bc37d4462e8b6aaaceaf4cb7ec26f43727558aaf6ac8d2da04b60c2fa844dada24f24df43afb45b9d5056e623cb5cc1a8bd76a0a9825abb4dd8338fb34d42bea8903dd12c5c6002957c42b30163274dfd3f2014fb6adcad8f9ee399640b2cdb18847ca266ae6e4c9e371fc31472dec850c8ca30c032804ce40d66b29a11c4ca8d084c582932f1eb546cd6e5b5642628c32c83fd04e6905771b3aa8f969970ded29629216730f0217c8426955383675dbcb02b03907b69c2d070234f009f0584095c6b599b201a4338ecc0f56e1ca5c2202805120514c79ea6533123d68ff1db0e91cf21ed83f70ca72a09238f7f0765c1ade361b372c3add51c0209e1eb0c8f08afdd37696032a99f560ca2addcc4cfa36a9d4f5b57fec0efdf686ef6f39d73037028991b222430b2710e574d7aea8f170578ce323db0730424a0d61a74d51f23b2f25f334304a125445847635191f8dfb14ff1631a9c437462660c4f08aa26f30e4acf76029e31ba70e8f6df9be9ce7f4c169893db88a5ecd0b49d7227c79494c89398fbaf03c9cdaed38352ca744859065fc2ca5a696cbf8932fda1b58eab0a29e3aedcdabf2f3f3f7c7c07fb9b26e08b25731786cb84d78869a7732d31ef9abf2c2941d299d9bd44f5c1ea3aebc5c2c8cb0c883557e948b5d8857cea5e757ff2aa4ec7a1d399d65e13738379902fb49b8d98e0ec94fd4bf86508ba7fba1460f864e5caf1bd61185c48dabeab48360d4222c8d58c46394f25f45fa1e65cbed7275416a93d44be0728d8cbd6b74eb49abdc53cb7690da4644c67ababc59b52ad3e1ca0f3277e5393d58274576da9b5c064c32161be12c16c3668a1f070f6ca8457a1e612a7dd44de44644ecc6fe40b8667d110a425f207f103dcc47a59a81aeac486563fc4ab132c962ff2cf6d5d39d7f2c93d79443c5e2c1ec117f665c92951aad0258fd3abb5359f810dcb2be2ac3b5418f7d05276492d059e4343cf306d7817132350ea7db8515ef658a83fdf83c26861f4ec511ce20420904d135a9fb92638ea917ab80ca3a33a1f92480dbf04e1a1bbd951ec81850425932944c1b2a1901349a59413a400e31daca059170ad006268bd578dacba9d99f52e12b6e76218cda29a8f57b590682daa448af4309b40181e70b64cae72330a761417d6c05e1d4ed5ae4dd3fc852ecc6e2b57b8842b15452d103b18052d185c8ec6c370f784bbc6a8c179229f0a5c8bbf4e16ceb79044de1719b5da5ec20973a1b0b5b9ca2003a5f869dcb43c2817ce93671406c6bc11e18084bacf904a54849d9cc88954f8093313aa6d1905cbe1b9d884a3c28f0c54202a7d2181de5533a67149388841fc6d88dd8210650422a25eb561971fd08620a1ebdab04cde6fc04c94a226d30fdaf2c7fe4ca5edb01741f94a42f76c2a8c63c6484fc7b693bcbee307a178079fa4ecbe209ef088791641e1d7fa0b6335550af5abd6fd294f6784376db954ce13daf36496176cb61c12018a5d3a75d0c0c0603efc98a63bc5d6cd1b1c6902bf17ef491138a4704b7615a26ea725f665b224e769d2ef7398942266544cf81914966c626e8754e27caac2679346bae46739e921a16a82ed634dc34fdb55854731cb6968e57ae5e080127f8853426275c46dc3405c7e373b81ec50292e4170ee1b33d53d250d42e0fe1ca395c0cc97376ed5367233f958d196d5c7e35ff4b5417375b1f22be2eaf6a7ce525ffc9637b9524168e3a70d1770b1e937a61699d7c6a4e46f5ba5aa4cd8acb35a5556dd6424feadf56baead867b338bc6a498066da0032ebacbb37bd02e8b1e2bab20faa3580e0b33d7523d688e141a0d363845311dc9fed9af0a523924c20916c2c0111c02a0e42c0cfb4a67c33c2442f40cfe894d7e496f43b6becfe0467bc320d3e794e09b7013fda5043f1f996bca0eb7e92c91f4bdb972b628f80583e4203b8c3a55b48d09440f98ef834fe32503e726270aad3b169b92a71bd1073627a669913ccecec450000e90482537fc18f5d1f22a12f4d095f6c6c9ce5a58bd71adcc2909cb16ce6601fe55063cd1884e13b16a82779f271d86d007c3d2367bb72828edc34c6559c43e7c65646f760e612d4d1b48dd7fb462308273bef7932f1491bc2a23a29c1b064766c10085d0a2c40b1d556af62a1e0b9dd3206ecbd45e627422780ca7df15ae4be185c333ce534d10e6e153dc9002b977393297aaedf9fa69f959076ae660b69ebe2c750bbf3fa8085a6d1b0e4e1d6a960050454b541c41adc92b141e1d0329bd053cb1b1dbc84bdabd36d898b54438d83fd7fcc3c3ad0fbdbe9d6ac9ffcfdb73f2748ed118fc49112dd6fbe92f327b93964a1daa6c7e51b46cfa4a6af32ae9e00db31d898f676f046b2f7a3c1492096b43246e6e0360fdcb23eb8d9b57e63dedf23466eb38d9b5f7b011b757354f287813a5ac73a0f33a7c7e953360db30ea7d568a93ceff9dbdd1eda581ee020dd331207001ac0a15c169e06e824b28a600c73141f73c1821445f969b1bfd997186367387de4176b1ae13d210b7d14cca80dcfb5dd9dec6eab71e490fd892539872e86a22248b92dd5c824e50f7af71dcc4fc4ca9c10251ca09151aa3782910285344639b243a01c7a572b39d81b5151a00bc678b7bd5bbe98981439c8a0acbddb7cf6bb996a34e229e3971e72f3b1ea3d1bcf374f558d6a66b5c89dbec3be292597e37e8b357c9ca8d812c7c654122cf897f911d824c3598c0c845e0c2cea1c86d312c0610deb76b8fbcbf8d406ad105831e274d556b49c6ffc497ebe6b401f9523470f209b32fa573e2efb9a9b22bde2549a3687ef48d3409d92ac1f849be1297eef1a5a1fe546eacc5b07d72b17fc3b88b6361e0e6a01892af2589864735e9fb172358c8dc3fa367c00ea2d6bff2fa779c124e6f750495947ca48a70d5fc5614d0afc8737b4685f4394e6e0a386358ae8c095fa70e54f11a53197008a73fad2e391f46cec0106540fc468018e57ceb685a8c867ef49f0e1bac7a959785e4f1a8a9efaa51641e8e6736d8f96bb4b2ce59f86bca2692c52ce43218db590b8b2715b2cb2e4c57bd50994b92b16f5dda2cf94e219f057ca0666ca28fad428e12cecc0a27b66d471bfa84828b41379e19d061fd8fe5e058e31dee84b69c765d544c468be271fb496537fa4f3d3f94fa4b0c0bb5c572baaf1a087f8e898440b2611c634ba94ac79015b949f10aaec4b8e265cea8b1bca0cca120d4ca414e83e092c1cfd7c955f3002d025db733a5b5752fa5675172a1240de60cb8a780e2151214b3c01a7c3346fc3c215ef5c62e42977f927ce8bfbd9a351b818d43019bedc3b23f004929ae5eebe518bc72d826114a2136fbb40533188f8e8b2fd0ae6a371e60d5925d210b243606c754504b376b6e5ef1107a291d95a6ed372b4c4ef10c052ba016d69d636757868b0f39b2070d6068bd0e0012642666a8fcb320dfc8ce6c398df08d9f30872a8af127b1ac0928ce69602647dd992e6218eb543c8d924429124775c2df5a9dfa10db029b0e77c5a8ccb8aa48b9d6ba2494df5fd99b20a43e6275c46463561534df96ad2f65d22fb02af2f70f300678e725f4e0437721a562ff4bd086fccb9f28fed0089a0df4fea6e82da74b6b36d63b0c9fc7ae406e112b990a29ab10a9a84fcd074bcbab40fd876609362869ec644dd56597ae9519abeb209fb3531318556ef810f8c5f957f0d4a7c08148a72713723ef648f7eff0ee1bcd3a4a777f64756ed22347b94b4a2e836d9ab4b4df9554f8b0b749ab900390f202b3ed4a72442de1a497bac287ce25f0a04685a33d2351f27f48e6d2b635b094800df3208b7ceb87651aefceb5397ce6d76d4a7e274db860b99eea90f24df54c69ab527741585b564398a91f450914726c92624b6f83533c0722901466b71383560365286277ec858f2a8e4a93bd6e34a2cf66e03105d75066dc3c84bb25269644aa240ba0521f47258285298099d3121ca0cdbffe116d8e844e6232a107cf003394c991498348c01d99fd2a2fddf56351961c3b13dd9bc8fc2d52277fb3ceb1636f26e5162d742d82c71f7288b2b92f5d158974956bc621402ba544bbebd8e7fbb6b8f5be2851b9339531c39e752dd79c5124c056c48b0a4ed2b777c4afbaa2d5029848d34c4e0f8b31b4b80c31da98c35b566b042723cd74a8845bd15798f805783f2c196c55190cf67be704598799bcb278da22e2dded7a82b3be64e069d65b6bb395ebf61b6e6e181f49dfc6f57dbbdf154bc76115b777e90e4fd7ea1e0bf22ec8d531716c44964fd7890e26f41146a3a9d4a42a3e86a9b9629675c10a52ca3a5fe208e47e764733e9aa49207313ece72bf7213fd469ce56bcf14cd7d75b12a29ed87a2653be8186241f9395fd62fc28162525c79799af440de86d6ec1e7573dcac7867d66d29aced7de562e0613d368262bb03594407779c58c9606dddd5928ac0fb55d4bc13f47211904bfbc3c928c22ccc7772a4ee10feadb90296150ff225d83a557b9cf1a1e2340be36f7b02639f00e833792941a8e918655788b1a4c8824258179828ca67924036be3a6f71f123d4c6f39614b1694abd2fcbba766ab8ba5d716c22749d56116363572c753641e784a1ddd201be38649c380add135862b05bb05e3592621291d949e0ed74856bd1f89109165a0121970a280ee7d2d059e6aabab45e784623dc881a89ea1c8d5fa6ea83a8c262bceddd339a8edddde44ef9743186a2aefbb2f57d1a6b0c7bc95ce7ab888cc44a5089c82a8946aac9a0f26cc2fa301b02e0965985f337c56d121a0fef0a982a76eb88ad35c6f1d6b1669325352822cca0c7f715cee53dda6ddbfbd748c7e218fdd476febceaffdaba70e123b8131928c4c831a0428cd6a678f3d9d40ab68003bfe7cdf9aba7b7be660664244106642b089094080f897f0b5ad81283c01d9484b2ff4ccbffac612020f09bad25109956745706d9aef94f849dca007923f17468380dbcb895b491660d94666d6e0d37d8176b71e60a138651bf393c3fc8f47a7f367f51b8b38e7067c4972933b3483376d0bed2abb34c20bb180d87378ea1c4941606e91dc3e72312b0c8cc83e6d3471796791db620d39b8833e02b2ca70b678fa0bb8b4b1ae4bd2c68cbe22a32842f52e8353081d5d6ea18dbfe25ec3c29b318a6435ba67a6edd9d108c83b0a9ca659d4e2794040f77c359ea57b4c5c251d4b420aca4dc91a101ceba4239603a2a2e14118cd1a535fa05e26a95f91f3b2e8f148ceda4040af702dfad8a5ed977bf95084813beb9ba39e1fd070a09b5b6e1a14364d73f3132de94c3ab0d07dcd99adbdc31cd5fb46140e21dfc72152a7c287d9e756dfa79695a38602159651fafa1cc3b7e226d511d9ed55ff0df92a782f00b7c02dac7f20b390df59f32a599fbd9da4e5fd27a146ffb678fd54d42582078c4d1da639444a28e01d27ed881222580597487d9066fe65c432752b4836f458ec3301db0a821eeb8c7be5c77ca8a1b3a780e7492543a37ee18aa8892e08281bf4b822de7413e0257ab6266a5b1eda824b10eb7db88ec33d1a586bfcc6772c8856919745cd447fc8e57a0d31497999824762a0e2f0f7ff6c6e7d7b5470d5e7d7bc980e2b9ee12db5ec6a09e718689734c20d02bfb92d45de6d838dbf71b1bead5fa5a2c02f7da1cfeaf574bad4dd53a816c9b4133dfd08d75aa58d2426702090477daa45b05ef16e32bc11636339ad5a20d08f172baa2abff480e72182b99db7e7292110a8d0723fbe9ca12d9c52055072a0bcf2836ba4d6d20838dcd8c677b2c7808cfb593386915c23a7ec2c40a87408086619952665d2f964e33c25ce01aad5dec1818d2471d33a792db191f94cb12625cf53101bf130d3c2105763a9d3f0bcdc6d0c84b646bc0564375062b6391dff563e9206735997cf4ab1e127bc6d8dd410998600e052ce77656c08fdc06d78275e5bf9a88d1b2424238e3eca94659850e853673234cec1a5c6975060d28b72e0213a4921310f4620c5413da9f4d8299a31183d157eb11678c8444286692da850b6264e74cc773396e848031de62b02704052ebf3c4a3846c970a012811c53c5ce4596bd2e0420394d5f28414cb6eaa1044c1c66b87db5465a7992c4859e4d498c2b89bd98bf946e80cca46ba090a6b074b88731a3936c9cda4996065e0f2486fb90c19198fab546c5155740b054399dae25d21dbf6b905b1f630d58c0a57f8443c24a108b420e55daea60bd9530a0cc4272a92e7ce2200483bc28b836c4c65068ec7a627310258f5e08132308d84810a1887d65b722d97931540f91ece6256468229809c642e7c1f708db4d1eb60de718dc6ec5863191267d622ccafc261d5966ac0e9d2634e3e743f838d1c8434793971223ba3d74ee7615ebbed860f9ae09412f0437537236eedb3db76a060362d01f59d0de2682a00a8a98d3940f5929ccba55390311dd36b00a84408aae451ff541d25c2ad7cc86c9ddc3c951c806051f5a4e8dc06f32c49e609843027c9e1ac0d592129c3aa3d729cf38284c09a6ea35218bc2579447da4988a8d3b2ea4f26c40b432ae5892e97576792269a621dabe201c1eefb0a8b1858a0a934f46b6069156f16e2c10a8fa48c9732ad4b468416debf5905116836cfd0704dcdfb8b1b886dad9ab963a15919f68a35eaf4844b0575b9b4bf9d6f873d94fa06a7a53bf5c01d619dea630899807c3ce85ff54caa468be0a25f1787d9035953f16470e0846782e37b9f9c4d7cc4d3fd2afc3ec70a7cbcd166a7b5dc49991d0f064fb736566a57c47faa5cc18a8218418760a7cee130f4fbcd7995367434b49c70bc04f607c1fd8884b7d9585b0c1b67937cb0b808c6c8b21ccd18d90e08e950aed41bfd79a6042b6962d33ee23b12aa814efc427cbbd6f42a18f456279ea5504a23b9efa7294f7a74358eef483f09fe0e4579c2dfb7bc251d8824530b8aad982cf399b384f34a3a34905349cd0d5e5ee88ce59fe8881b51fa79a0a1ae085fcf4d04f83ef5c6fd60269bdbed175cab8b9782c2cfb8d5418dfe55084c9460e7ce107ec12f0db1b5eb829fefab604eacd7f914152d5e8282173ca1f85911f825c848019833447b8afccb15e94a847c20c4793df685f83abe79dce2035868d52c6e829d57e0275ab282830b1f46f2c13dc94c429217cb0e925835c4282dd7419555bc008d3e4c0bf525cf0ba84f0b2758d06e7e13699643b2f073034103ff364e5ca99b0881db726fd5fb5e322f2afff626128b16356dc7f58466d5c0ffec7e15498db1a62b5623f737573be84dab583c288df362c028e0bf019da8231a154db46e1df23f6c7efb4f8fa69f6d8d8729bf574321c6fb4c5e865d038bb702faebb20b7c566a4d5f02cdb9f16f4a91bdd5755e5d1f93756533cfa073be9deb54a104794be1588e974c81533f4935c94f28e27650ff290ced85f92ea4d427446fe43b48f21100b1278cdf732f9561d16e3df8e70666a65fb33c63b07f95808c5a4e3a3b9cbdfae20e3c8a673d77938f664b66963586f0a54ad8cc41f17d710f7cff7767481aeae942e99b33631f65a80db566550f050ee5c8cdd041d56d01f239f8e34459074e79bfbf9100d5ab78214f762632eafe67908fb149d33108de49f9bf9be2291bab368aa8a43c56194583319e75a4ee2d29fbfd56dce0c95d428f30cba13e86c8450b9463e6c7c0510b354dc8d18481cbefbc35c7de777bbd8741ca38a1b155ac64f959a60ba7005b9745147fe4d7b4183c460ff14dd3514be291bd3735cda384f33035aaa9242fc1cd53dd87c197a56f6012f6d646e6f745d929ed88e2369c9247d6531e06a2cc2b7e4fb60ffd9660e5c2589a4297ec1e517931485960d58788a5981c6f30531fe9fe733b7fb7ad0e7588c2902e75f90344bc9452feac6bf70a95ea4535e2db65c4b82a0c9876859d37a53d9777ab1fe24002094240af9985647862de6d2154dc99fe26627a65c3afd85d591a34dc0e2ccdd72ec2fe005f50e8b5334fc37ab27b6b2f11de30d485729d27ac1f72b544b11ba9430a5ed1d0f682380d418585f27806e99f689ecd5d94b58926ddc7c38a684fedd5539302d83759751f2075726d0a5e7c95bdbd9ac28ff3d4320a2417d0f1efc99545f5e28cba97400aec93433d0660aadbd53f941c47a616f10e9f806ac824f51e2258684e4b681628752e7d8e2e512d50f552d7c6de538e1f4f0f73f61806326ad0f867bcb55ae19b8460698bb916768b48444b5d3e47b318577113d50a6cf5508594da60eb1a95e77f8c82754abc1cc3bf7cb777253ff1a783ed5428168cff5e6ecf96dc310dd8fc65fd56ee0ce2d805e33ea28c3f8a182292265295e12483ac4a1e0bf66f5050eb2ddde4f9da76f36ae235c9fef5506c254845147113667b5b11c10f56ff047ad6ba57a458de4f3f0131cc3589cc0ce5427bd01c9901fe3fb8bd0a1487d903d4faab2a1bc32001d400ab07fa9a7fb7a281c131732f6038fac7f46c01ec45b6a69223e9c161e64d84fdaefd71af012e5b64cd6c5a07ea433ebae5874004ade52e6e8a15a14bc8d0faa15ed1e7c8ed941e8362f47841ab964305cfaa21e68c2f533fe384402975177bcca09613093298f5cbfce6c2f71d38fff8fee627e77d947a7f80bc313841a4c9ca5c48bf6ef0a8ebb2a7bf58847e69e8b23793a8d86f7f017f54998a4f320f942cffbec8f285b7182b04e2443cc3e213504ce5949f6ad3d2263495395629377edba295268007d83d1910294c13dee53d6dd3de7178633efc2a0bc3c941d91f4014ffa9d513d2b01e24c87b5a1e6ac03444df2ad0a6cef13c4cc090e1d393e8b84f0a438b4a9dac51a282549e51c480f88a2e4f915aaedfa5116cc047e7a039b488170cc03653a821cce4e47f736627171b536cbd925b9a8df2f22d1057087db0e92b870042826b63ebdc79b8a6d9c0e3386735912b31cd198dbc17cf98e4b982afc058b0fff90ff047ba874a6615ad77ad8a509ba0ec90ea2b04f5149bbf380b06a21e7b35f84275ef7b7ca91c5f84fe25184d954443668911ba90446f1db2ad510416a1fd2833c27bc7fc651de346651f63e035ed3ff60e5483101e48421643f6e871b8d96fe40c7da4fdc838205132a1e043e263a96eb17dc197f15db24ba152b8e330e11804f77b2d57824df734ccf1b78238830f90c734ecebe3a98282b29ef10b025b4f9597c85a9766c6719e270508095b5b52be332a4b943ed0fb6c42111242b636e5bbe6b1248250cb305f360522d4379f70c5448849d069d9fad8d20adae69d24fae8110b9f4e8acb46ba8432e764c01a9e7b21c5ccbf315cc6303b6170082b0047cfeb47aff147277a61441769a7db2be8e6efda7dcc4d69faff4fd646f71089147127ee2f8d7a6bcb00d98b3ac0a65223874d2777b050e1337955dfb87a93bfc8819d0ed5f5bf90916274bda5a4db66753b9ad88b269970e4c44427358ac5500d0d4f03c09cadd2c1e9a6af81becb28f31415b79fe363f44d0d609bba03b73259ac0121b96e88a8e9ee1b95ad9ad03cbc534c9b6c932a14f938fd4da932a6572f93a6d9e4b9c7cb04f5448388888f64f320a42b9c4d3368cf9fae2572a8f8c0fb1ec41e2db79389257e2c03cfd66a1579d0e1ef3ad63ea88b87bc093108ca467d4c4fda231d7024f180410d85630de5c4b56caf107e3e3823a3856b4e4e255c91491ce75333d841e612dd44b31a2a3f98891bd01728207cb26412e601de30ae14c207998809ef04a70a8ed5b17e592e96f14e7e155857f566c3c21827b870d4a2776532d5eb0957b73c559107911e9b3c9b88dda8d99a3169064b397cf51c5ee580f4cecc792ba40d1d95e055d0d883444af4059a183a2fa406bb17c977182509422e30914e74fe9dbe27bb2e3c76fae37c1489120f4f47242c62d9ffe4535adfc7e9d06cbeb73a6480d41a42d8df7fc0d753353b523ee74967765cd6d22c8c7848d5ff033f61d2e99def6f9214f71fbbdbc2f94ad87028304d6edc42df4cb788da2da3a5e61f9086a854a7b887e783bf1ad1fff5bf5f8a126598673e631fa9d75d0194da197048af59261feac59ac9124f72a60a5f84df40bf7fc198190e0cc73f451774c7ba23a56b94dcfd014d7c128bc9038f27e581d9d48f30ba0ca76dc4203220583e915407de653d4e7ae1de79188efe6f17babd0aa630b7e5802c2ea738344517763b46e65b804390f6e8dd37ad5d219fb769fe67a72be52a2a0b3a8eaaaf54224ce712300e771a96085d95ccb8de5f6a5a326e253b9bcfd24f11bfe3c265ee73efb62a17411f58b631ad84f134e9d652b49e39a3fd5ad3883d1c0ecaebffb3052d21e63fb1d5b3d4647b422651881cd888be139d8ab72246f75daac1ccab5e06d078a105caaae1ce37b8b8bc9e05227ee12de15f11460bad6e3962306c0b5cca62389b3b78cf6060edf96ceedddd7ccb9b952914e50cbff76ddb4459fce72156e270b7fa5f97511db999c8700a9d8a56eff56fdc2662fba43e94e55ae40e56c8c3d13f7adc968d1e8f9e7d53a1218c551de2ca4553c16f0b5a92cf41928742629e918213520c01efaf900af73785f200c631a56b5c363886a3dc1f5a9f81a00d0306fec47e046c3523daae0c25d4151e068630fb9c0e4b66c388a1930fef9add5a82feaf1e006bf9ed5ac0a9a9210df755d7c03de94f758221b868e0ff9fc34e20ea7ce90e499726c7a123603dcaca3ec08a7bbf46a5d80963847e5094e67d1393402aab18c4e6cd8632ab2491242b7a3732933442fafd5fddc9d9423b6be6c5f63da889ec26857840d922012e1ff838c8cb8d0cb28ca279d737532b49bcf9bdcf1e29374944c8299dd9efef889a798e3b648e4f1763bf559c24fcd7c9f03c45fdfc8f06a59fde030880c2f3599957b754f180b47d213197afe22fc9426db2dcf83a99b5a57cb095547914b2c173055db6b44609ccebe4d765c9e943afc26c3dfed4276b6cfcf67850187f0c6705c041ba7e756d3bd94d5dd8ea75407b2518bf282fe030a8fa09146e3b3c55c2cf243c77f009809f211966271be79457e37d28b0263777ef1b5e99877a5481bde2d1bab9f59df93f87b9e6d4a6b99f7e93c9260c553e7045798b6a7ad3ae8160ee2ab2f2425c97cdedc7421c57742bb472627aad1179c60bb72d64b2dbe5aff408af37837aa9a2b4f123e72d4ad9eac3d04aa01b2c6df9cd229623f224f4f479df4b01e1646e2bb0d2dd7e93846397b8fcb9bb58f7dca7feddec27efbb124301c40b700b496898253672bd79f34bb68397a0809c7cf120025c2bc1522b74b555d0b1ea344f5546807ee89d7f00fa39bc73e511254d216340459ceb82303ab66830f1ad8200a5b9b9443cf42947fac484b9839cccd222a759b444ee383457d27bd061fdcea1a016819fed1ebaac6d7ab5e42c6b5a4d7d947e38922c87ca010d8ad70a1f05914e3613c5f64e54cb66ba24c1c82da131440d220871b95372209b38da137dd143131a3f8897dfa4750a08120fcfca2c4e30e2c823cb915c890746550e799c7f3aecbae0ad9b2251e62687ebe880263b9f3f891ea94d5d48ce9bcd7afcb6fbb20b47738ef8c1928c5f1de31407da6bea441f49488809ad6b8ad8915147c1d32193cf8011425fb3e5c354fd37cb4206703d25e28513922535954f430ec96e90da7225796483bd9bbbbea762568840b2d8c95957d05a672d6403493fad78a056a587630bc81e295dd542fe1bc45e141cacc312c6dd2f54a387ab8896532e86173e7e7c52cfb26836cd8d0ebc5041c55e9fcfe9dac82d8506896ab91b2a8ac9f009096ced325857ada952b1cc86b027e3478a7253f4c30f63822fbe96c01cd9909722cb2e44dc2bdd70947c4ea0cdccf23507c32af53e188c902932e9940d8422bbf8b69509c9482552bd145ae35e627ddc3264d370fe8ea211fba731dc1c54fa0590e70ceb32cf0a46321adc466a8b2b52614330dec0236621c04e978fefbe5486887a41eabae8b5d46b07064309d9e4f11e762c9e8454f8e1dc5e09bd31e6e24ba859875764270d24aa2f476652030a8b84d4660da4cf0ec0272e1595183e76d44606f7ceb0c3859721fcdba2f709cc56ffb998c89384c502e211c1403ac6b59f19b09ebebfd532c117c3cadddb8d227ed730bd7b72fafe838d505c7b7c5e345069f0a66fe71a24bdf716441f2974daf2525af11147592ef22deb94d6c358a4f74b1d19872d835529c675f61048f6bf7366c07dfd859c18f8cd800fcc4eed8a6489754a9a81fb75f4872706bbc301b91c487bb5512f3a6150176835c25f693ea66a60608890b2f9e92e540cef6dbab3d3f885d557e4138138d4b11f372cb609de2ed87db338479328105b8776ebc1740c7dbfcbd6c104525a0b92bfc6ea53d7cc9a0b1181e206fd67375889ddb594172ab6ea0914c5d9217c02f2c10548654b615abbcaf24f1187dd9611f91beff2904b45c877c5aa54760c3cc87ab6c90b135ea2cca924bc7377ee25933933ca52b1180dd6c7d8a4d7f3b8fd6cbf535a7f3ffbc037860bfd6852b242c7c1bc8623053e6ef26d25dd6015c345fedd908f4126e13fb8841c8e81e6c7bd8710483e7803e6956df010e1f207bff6b0124cea7ddca1ef40c38fcb8109cf87e360f85745e4972cae5ee36b7911a8f603e3c2dcc44cb285f253f1ad7762585262667ff8a3b0e04ce47001484630a826fa9eb2e4773a25a979b30f29975721636276f3eb98456ad2fdf208eba539ba5a693e356aedce1c20b9a87c47c8baa2a23ccd9956ff540b74897e8d60b1365b94ded9f3590d62e6cb201451c6b9b2050d7ca928a00168d4b25592343f4af8490fcd4d95f84a9f92cb0f8f20c1b4a585d57c14167304d73c25b7189bcc40484f3da349706e28b3734622f37450a585abf8cad411ba83593983b0d2b26c380220c8dda9282ee79eeecf938e9d7718e66b3d50f99ab19245fe7075923992cb5bd349786aeeee08fe741a805dd3c3142365a83971358f76329526e77c820282c8b80f804e5336a227961343b8c016dbda66744e30b9094517b10092caa0d6fc5243220d18e277b60296b349518246ead13523a3e050d27ca30e61af026b4e8d0f542d94cb52bf824c591ed747959a28d5a53c41e532280edcc186216d6c5aabb78941cd2c8df25c1520b011ba0924e81a952872cacdda916505d30bf20a27fed5d5cb8b993ac9a35c547aca46b4f1b53c88704a29f5034ccd391abb911ef1f8b2ad406534e8cbce234e281ecb994172bcc080750153566b067f6bb0b1dde87b35d655e4a90e98f212c47e502a07d2c508c0d7123ea3ee1ca7e88a33143c741df2c9b95b0d8a388a6c1f3f1846f80bf99cabc381e75ff8468374f2ab1e815404c99f6c6b885e0b9d029a9267f7d02cd2499943b40367276364ba9ed74b21e3b073681fd58eb89c4fdf49ca2559af2618efaa2d4f6a578547870053076caad86be0ebb14084021b52f834e4891d756940467d348c29bd36f01e97f7293b13539e7b80280b19b03a25255aa01562eed54501123496bf04399904549f39ed056e5b36075af011acc620da324040e94796c579aa09816704fcdb8a518c068bcf02399082d183da4028b1400ead1422f4e1e71ea1948961c9284ee7f47d1bfd13e957b979bb41ee95f694db1f2ed5455f7f918dca65cb5a751174d10742869c91704c38fcd096dc520e5163a95cb6c69a48d3ff8a485d1f68439466114c6bed3c4701d5af8a56dc3f74d40736468b584c3c561a43be407145b4e43beb1c88a84b0f2517a250c0e61d54cbe60f10e1f1a06bbc6483d7908cebadd02fae28c060e23504989045927afe47fc728414aed61335f7a6a9b1a8a8b1d3b9d020971f049917a0573d7438301d2002902f79de30709f247fd6af6f098b60947311ca513a6e65485db81b420d0829f7231e3220977c3935263671fb524d5d18d0f9674c3f86b3a49c39a3cb87393f531856f7c152e49a290293c145cf146be5380cfdab011a3ac5b9cf33e9293aa2013272a493dfc718ac86234c12c47cbd4e545e6dc94f3a364e218edf750482653d6dda52032549f1e2a32337fe88ac8697fd9425feee998749d89977bebaf7edc4129d5ad8158d51e5dde8a6d439b0793670b60944100755b086b8f5a2b72057056e57a94c2806da6dc99555d8356798631d9d4984c0d9b87ea03985836688d70e87c272003b7f96c67bee252d01031861e3a715ce7a41d0b839a90b7f3e693d0148c8e92a68204e4cd5e108e93d056b047ba6c03f23e2264dd0ccad82b95aca6552aa45c4dc7a2c7b8afaa382c5a0df8894823c6d158027553c8b0edeadeae20d5203ccd693a7aebd5ccea86c80b5d3de276bc78cf3966e1c6af2597a5eb9c1b5ff40bce85eb260441651440061e7b93d3c16f3c00a59aa40b30f813ef18c588d0f82a842c1c5164550af498abf8c36ad1992a0d7a7aaa9a14c1ad4feb450752711d40c1b65c59ffbdd03c3b306c723d6cd5d3308e71b482b2c888f5945b6b05b7eb0a7bd98ccffc5cbebbed7452027423212385ea81c1bcc96e2af8ba3d427a22f8925acbabd3fd40613f93fa51fac249a8be32467c3f23c3be0a7e1662a0ccd0126b0695d3db9dfba99ff919034b595976beb80616d2d013013bf15819f67652b0990d45192e0bccc5051c7fc00f435eac8b92bea61c632dac75d4b1ce82aa89faadbb94a5a7549ab62251adb793acd4a2deb537efaa5e6676a81ec80f3752d610a7214a576a76549fe94640930a6030c6db844ef415859ffa9c11be188ba7991c18975c5b53400406ac6ac8d5c0152b3742594e3934a0ecbd6b53595c13e57e1932bc43283aca4ac4953512c5025a6fb569b8c1c38bc0c7817de56e0d18d6e5ad260c6553545788ec23d22fb5e88e3d02912f98bb8c5a20b44b689435fbf991c72d977a6854547c86c7f360abc5adfb543216fe94d054a0a683ad62255898720dbb718459b7285fc37654d92c514e2e8838089892c82041e87d19e198a90e0d8931181c5511a356758b0ffd67034e4e3c85fc98f53bb86eab5ab70c1055bab8a6b4f32b7873478b35ad7f73ec4a1ae8900d2c7066880275a5c0e23709b5982616892092e6fd9b4868a6bfe50004099b18589ba649cddd885deb7e7e841c299d942c3486631cf10845eb8302f3359d7713bc439a86b9911e0b2db28ea78e865d7e45c7b2447b7161d296e4f462457487821fa3a9e3b2dc2191cb30ef32c4cb81807e6f04d7e6b572b9931b87efdcb7fcd1fc858d41528a8ecdf9a6ddb72b7618199a5ca0a28131b8afd4f489aa349c2f0bd59b4a2a8785229d13df7df0346b7d0f03acb3b2426e260572fbaf215225e6b0314a6a4953ba9acfdb6387bbd96b785c680a50f82722769ac8f9f499cffddf84f9bb273504bf6a0fd89a34c15fb1e09f630de14e5aba6772f13f48416a4c8b722229974a702a40946ed3e9008ae8daa02a6fd9fb6afacdd60157f3c6871f8a3d0d2d3544532d31fd27eef59c6a9b2bc1edad79968cb41479a2345e55e28454875d32e0a93413d39a07451f866e862c5e7d028f2b23573548739124d694dabd346e907e1c62e6f9465d9ead08c65f4d6fb83356e966d93b1ac6d996f95c3a51a2dbbe86c386fc2900f3464c8a56953b631193728b8152a4945576a9f46eb4a3a2e4f9d78bda79363df9e939ae7678cd3c101528c70678160c6b17360dc2c47df284c81b34a6c10d319804aafca93c8ff77c6a070f8e928a439bbf2393252404ef843069588aadf0f333cfef06b9444e62f5ce48b6ec20422c61c2377ac82e1e7c49209c90d0d6d391f80cfc490137a533a055c5407fd8fcb2eeb4d0ededfc3cc02daf109cb511ff86ae69e3b727d440329f02eb7ad9e3621ac4aae50a7aba8b11d1ebadaa0078c3ec6bdb909c7c45627a9a4b635469cb8646ea06c820644d1fbdea6274c456cff4a4d6d14774963e74c9609461225a7db4930031cb900c3f8a9a59c22eb9cc35d60072361e4d98d5ab1a09c6b6995a940518a3abf442f04ae0a667b49a8232f5986911ef410f2b5be27a604c27e665abfdaea4173d4fd065bb0bd39bd61e907bdfe143b2dd3e805b735dd551405a9c18f0dc9bc9d5cb44d5812f7abadb2b52de5d598d6124ae6a8f0d74f65e226cfd4f44267e269ae679d3d351837d971888f2310004409692b0ea72cb823f78ce62fef69d37a1b96ea9fac838731475396d0eb9386a128b9a32ff49e29b040cabab172a866e089b85c368cdc9c11ff035c9e944782070f8bfb06d43cc51dc8809a852834c52375c9eb94747480f69f768713908b0294f474c30fbd61d44960ff206594572409844a13a7b3a95ea3cebfe168b28f1135aef7097968d5049e75f33e41201efec976a63a3ec3b003370e5c3203e05e255ce0ababc8a71c2121e85e75454c36c0d54609bc380e5889d802afec2c25252a205a8b1790f54da92a7844650dd7ccf604156ce2aa5c91bb722f8ae4258cd1009a3f9c66b587d76760c265e2ab155410350db00edc7c6f40a199716309fde5191296cd6b5a22be44631721a52f2e98f6804cda4dd3d17e76f481a991921664ea074101359b9c0c44175bd0d2b11bc0d815c0bb159fc0e9e7abf390d094beaece6f07b33427cdb4ea857a93360694a71130ec3a22b607fecf50cf03bef3d01687980b602a1c23c75ff5bdd53881dbe2c61380b91301bbb5b8b19cc297f91a319cac9422e12c23c0676667c1641cbd0b795bf204b5696b5a0b80592730496f852cb183a93d6295cb23ed4553f59f34656ec0d902e8d7214fc3cbf631ef06933c9faecb694a39fcb6f55a5cd2cd82d64f50fd52ea87ae1075214c4fae9aa88fc3604cce0a3abae64e0a6817c2143ce6f14181842cd0b5968bb29c07fd809631a573b6b537b37f62feaa9e7f9f42706bc47008a37c005fcf06d4d43c7aa1df751b95f997c82c08b97b1d3231e55c8b6cbad59e1bba9db39f6e16393257b3d699d520209d75e70b41968203bf68598aef0a0dda11833cb582450deba35bda1486e5635eed1d5987d1a37a61c0fca0d556a5ba793101b9ecff69901265e66ff4aad8341277526875e9222081a562900d04b39ac030341429921e9bf68d4e703a75d8e171b5d6c613bef65303e2292af0f80b793685029cc461014cda7b431d1a04a313b4a0e14a211489a3c031ce314397286823f536003d3838842abddb17f166f3edf0df9a714780d6fef2d484b443e20830bbf5fef1dcc4f865bc2adae8f0dfa15fc80d66e02ce9727d6a2fdbbf1f2b082309111400479ef9b58ab36bd09e302b6cbfdbf1ccca4ea9e0b0ba815135755d92216aa9b9d7c302f58e890a1368f8d09b824dfd41678390e6a158040d4ea315f3a3d9ff108eb242517762072743bce9800e83abc052d5054864bc403de8405615eae0f2801ec95c6986748d3a81f6abebfe95413765ca0069629bc461c9bd26658bc61c9fe7e990b145ba2523414c6901f814d2b25c958ecdc64a02808d7e0dd305807e57a1a67f58e5d6388777b9413a6c843d8d835e7ad1fca1a351894c7055d196f3da2154988c1b11ae21001c62d3c35732939065a12596e6dac0696bc60095e0a589225defb9a1ac6490fc3446352b3b11cd335bf9dae10ec5792d35825b4ce3eb0cbfb10f25bf84d5a04e0e4a8982794aa973b35333a4d83552a8001919d698bc58c59da363cf748545ef2c88ee30dbf8d7f260ac651626c74f42093295789614b068e3cd592b53501b7069d0b69b6b32d77b9ce28a604e6ec869929f297f0196201dfc9b4fe7208eb17cc0957464bbcaaac3f20de55bf5d1c0184416d8f0e2003b32214206f33dd150ea4a60a84ce52670dbf6aa5dac55f42c53f73c5372ddf5391f9e62807ffd915c96c6480502ae876e880d8ec87cbe6b10b6437df432fe3b5b5f5443e5f022b88b1ab858be07a5417885475cad2a3b392298142c9246ffa12f43bb71d3ccf349684ae436f48bfeac820ec6ca0987244c25817e0fb44983bf7536ef042cb1015bfa0a686f14f9cf29491cafd9e025f3989ad4a81064af7ee5c4e719dc7f71ff8780268292b74e73e431a59c47f602dc59a40151c77f1ad43946639207f631b7dbe6f69ff557b6db0dc3c24f05b876a671d1d83ba5eec791f54924225b7d5c127b123c1e0fb72eab501d08d40147a922b1b33c7959546ee8cfc0f460bb2aec92865decd1724884173583feff1ef967e16c75f061a3ac260a47e157db477f06daf712676405f0f372284856d258aeb7faec4518222a00ea79f08c551979f232385aa7c3c152a401e7c651b64e1c001e8201e585d7162a70be78a44cf9107b74dada97cf74feb18be4d3113f18c13a0053a29d0bec5ec5962bc255a9d7f41bf9cb705f428849b302aa4b0b9d7cf0fafba136159ac6478612099a80c033365683e39ff4063182910e32501adf650c5d885c91afa1ce83e2f679305e053bc72d6039fbbccf340b8f445b59fa656cee0aa894265c358e961945a946dc6101198e07e99b66550a7fe0cef526cff8b841523efe6fe8a9a99e8a69631b3413e898001d2452a4c53732a4fddb67d2a16a6a11c353f45b8b6db9ff07853166b6115daefde3cf826ccc5438753947503d8b9e46ecb21ad1a945c62b4f06eea4243aa0a411a2bca6042ae2a03206921fd873d326b6c22b68fc044275781e9794ed6f70181dd101cd7b2184af77552f660a6dd0afebb59668daef1a095888213e4e736eb3833a9c76a6efead6369a9413b23c55c9ad2d20a7dd1c1cda85a0d749f7c849c4a2d8af1fa454685502312924290c2cf541fd1703e91be199fc6b088346272a30b11199fef86fc81d0a12ec9ec165977016838efc0083df8a9685fe315c66bddd283da597c83361d6c8cf2cd4be15aa1b61b9e9b4bb3614079b3177740aa4c0f2387fe49b189eeca93667bc04926898a9573aa4c35fe3076afa3098b5fb29863102221a3988bd4a82591f379d6f3d482bdf744753868db15c2c0eb2bf6da49598b6b2a27af0f1ab5b57b1e61671ec577e7c4963f3840612ad160f899173b65eb14a5b934bd715ff4458a003c0661b27b1e9747130c81451c5647095f81c4736f919f46332d679f4513a0e3aaf6ff679b901dca9943b31b4794a168102d63d36bfe06f84cf6d9f466c49eacd84f632022d4d4bd1cf89f8033170c5cf9ed87c309f5a87542dd9131eecca3ce9fe4d00d13d4970fe62a11da6a2e72b9a804006d20d4f58717f576da3e49a4adafdcdff885dbfc007e605acb0d4055427932681edf851766fa6f9e70674e240f66e5619061142314424717095d7bdf6609e429c279a344447f86e232d92dc4fb4833f7b65b072aa5b21003bb531851b2cfc355d305b701f86860ca51a7d68df36845b1c4e9792feaff31dfdc0d6ffcc6e21fe47551f880a716aece11663614232a2583bbf3468576b5ed24a2922c616898e95d391312588860f34509f4127a8f40d99b7853479a3bf201caad22e111846420ee21c6f8bf6996628b677aa727e7b9a2679b5ea4a0e9ecbbf1118009bb73d244274f0a81b99f6e6127aa9c7bf43022abf39a216ec11c22b3c19c76bef9b9a9133293df5f806e03cf15b34f327487dfdc7726762a0c7eae731211f1cff8f7547407afea148e99bce5f74ee91778a9208b0cc0d4ef8f1d93f8c3cf4061c0f045ac31fbc59301a12a7037d003997445f8b53cb81ec45aed2ee9198971d27f6e5d32a6220f717e65e5cc202a4314405f011447c3104bb000268030084e181f57c582a558c6ded301ee0692f1769aca1c57ff19390b6f7de5b6e29654a52066b0bf00b420b2e04c5a56f293ea3e23020577176951b53842f8c8aa7dc189914ef648ac8a8f836c3c3cbce8e33c8535c888a8aa75c191591c7c4c8a8f8e645603a4f71d02db1c314c861ca33af22af021eec13bf5ad52866f5c053fbcacdb0dbc32cee29b1c3a8f8e6302925be41547c732129dea5a657629f0e531b1579dc893b2ff2b671077edc69144c755b0f9d88543ca5f34aec2087a9cd2bb1770e535b0fab296193578a0e3dfe699c6fb7cdfa7651db7cfb49df7c8f6abe5dc57b590fa64230dd24b579f45e628ac048df6e0cc8a5c7741e5d37eeb0a9234eb4010dbe0a888aab3e452a604b8d514428be3d462c42a11378c251c41f9a376b711569f0eda04ec66dc46534f18d621ec053378a597deae196b8e2018bd5a85803786a1deac71b71e08ef61982e91fbfe20e5f218ce7c219b005f3764603f22bfe6057e4d1ce2df876fe5a898d21c70619813dfd22a2f81571228f2e624bc6f7eb9513544af87618519b7f9108dff78545fee8c557a3b6f883bdd9e317bff8a5d19a183d7acd63617cfb8cde2e6d7a8067625d401436f60121c83375cecc2de9e6d9b66dfe5b53293db670f126de24f11c3b3283a4c728e78d6ace493179a3ca2ae07343af6a7640a8cf6e077ece2957b3862ec8c335d41b6e0480d1c042e4f426954d26c54bcc82b74ae4863d72db55dd2f22b1c1aeca06eb8048e12e990f1f3e22925ab3293fd3b338c43eded81f511579b07ff3a16b9eeda4a83ca8318b9b2fe6a8e28f68455c7213953c3b7613b188397087163167d21ef600cf60721445cbb269d40fb1583dfcc1c3d615ad2f82f3b085a4098f873a39aec7c2e6630e772f3420d85c731064ae39fbe6c1d6bc12bd41622ae6a47636ae9e69ce31c7c5f3eccc85a5f7c3f1d19fae3c253d9de1a98da7feb4c653d453ccf39e4e4f79ca3dc5bc93a72559923efac63ced29f5a4635e470c5610843bbaa7d38b35803be214cfde37e08e185742b01fdbb04da36ab59644629be79c8f399773e00ef62fec1757965b8c29d9a00eb0f583285e7aad554e003a4cdd5210ccab0b890eaf0cf4e8f5ca1481811e6f7599e8d8c51ca648eeffe24234aa441da660f5780b0bfb46870e7ba0b03112fbd9a79099c5879ba8256519f5a63eaf84940153f69c3c48d939b049dea6b75e1736b1ec99821a2b2ce7d868052b2601e31bdad08575db0fe096eaed10e0168c555975ee801c8179f58d522a435033042354c20e080e44984c291ab1e906517c7b495e1df8a5c76f8f46b8051e61411adf1e7be21418159760a954aa0fa4da6316dc025b6134f97ed7776ce95c91a4b7974aa552a58ac016157cfe8b4cbe63ebfb8b4abe5d7a3810e961137cf67020c2e3e140640c36c18f3f7020c2844df05d786b8e0ca2483ebb1fc9e701126053fb74db2868fbd4ce5c5819816023d770539e0deae0d8c41002edd108c98773ac0520c02d109af1ccf1035fea017a0472c474087da2118f65637e61e1cec30fc2f25a08040b5b520793babbdbbbbbbbdb6bf562cae41fcbc31da804ba30581d9ea2b3c053741778b2f084791c3445a75e85129a22cbcb6b44116e8bd0817b23625ece798d8879299b6353734397123a2294d161743631e5c81142e01bcabea6f60885fd602b878f8507187bac7ffbc7f2dcdedc224292ffec330fac1005ad1dc2d427e898376d98b1630e5a3677732d19baa474f6383ff9997cbc1536ca1ccc39bd8dfe6093c1d2148124e87a9ed4e176834dec6c621fcf353cfb60bf815131c54a9ebd06130dec24144ca5628a7a1e6453b3c39928598a1576bdec382f72e2db4badd00b5b3d73ce895a80a8cd25fc005c023e91d597466d572391fabaeec8416ea40b8be2229f1e5f8d8a299902a5f38d0dd5bc24ddf8ea950bfb84726d9f42f7239154bcf6148f3dbea4d70a53291e4c6da99f67950624d4e2d64b8f2d294537e6b0582f3dd6d43a6ba68429aeebb82bc3797bc77527d5d67ac2f94c3b0c773b7763b8986ee6c44dee272748acf58faecd614a32b76f5726f3cebcdb65aaf36587290ff9f05c3cdec27e3e5e7a7c49970e4537346f7489cc803b647cc11d327acc40fc90db905beba15aadfde99c573a71cc39efbcd28953ef7c1b794544decbe8d2d0b46f4ec32ef2e28f3c988a2f2972142bf28fd485722ce7c9b0738e79329cb3779e4c111876ce65da3ba79e4c1118ced9653a6f3ff14a41da3b17c2ce79d4427c49fec04b5ee2253ff1f251ee8bfde39b7666c96fcfbcd249b3bb30c88b1ff24a27f7a59d234fcfcbe8931279b6f4526f697acd6e69de5290f6ea30edf5c614991eb379fbbc30ecd5eb8dd19c7d2605f2e04757a3aa4757118daa2eed47ea5e6830a7996f4e535deb9cf329e34f9fa4539c978eb15e7ab579e9d9cd4bd7562f7dab79e91dab5ebefa24dd853b98da2a8d3c6c923e6f74b1494a6720b85e3ad421ef10ec7a188307e60cf5409d61a922c606757c198c91b95bca39294763e5ac35b94d8e765a4c81c562b960ccb81eb603a2713dacd601899d0e1d0f9be6186c02711de264a783a53dd1715cc1e25611e80f8c48e4317d0c559fa643566261cb0a25d80d573dbbc48a0a48acdf22c7de0c5688810d2b24712b94f13594781491df28c79e3784df300c031981a5bc9afcc61c7bdccec9922fb5431d339c506a1f3de7dbe4d8d3ccd8c26f948b9c5f71f3f0c8c39615637cd6bd645d103185797575405e683007c10cab14c57c625e2932ed21a35535565075f6ba8f1ed4b902cd37273d0dd48ff508f623a2578ce5853d71916b8e65992a5b354abb1989442f4a8ead46e09f64fcac5078333255b67a2962eb10367561ababf2344abbe9d3748cfa575f2bfe652affb2d5fb97d5ac5c151229e5c23ed51b9b9f9eddfcf47a1324a6aa8bb9b07cab4dada9359de409f09f9dec22877c4b41a87665449e89644ea84350f5a62bf3260f9daee9b221d0ec401ebdba844dd3310ff6a9c1803b38898b77ec26b9ee8e28450f02a64e5c489f911279c86367047bc86107e48890f32d45af5fa3aa6f285e9120600ac541de0bcaa5a1a19e390de69aa37830555d5d2bc84bf1be9cdc52f4139f49c187e92629d13d7198cc4f6e4c91e8f1c2682e72d18dc15cd825a1102473910bd1b026275e6973981279a5ed068129e6c2623fddc55edbe4b08f1eabbe7ad001288e39ccc8e98d29b2f9c8b70b83e2d88d996195427117665655a91ef38ac023374478d801290999410429cc8550cfae4c1198195629cca90bc15cbb3142fca4307761f6faa3a7a97e03791f65c10f793173cacafca47ad68b0ff23cf894d52898caf9d60ecd898b1c76405e6868341f394de62834d43177e168844d985745ab9f7e92d5fcf44ccb543f1d65f4fadaf3b3bafa34610af3600aa6340fa6320fa64e3c98127930c55c589a73298b4d0c04fbd19e18652055d1155551550d39a84e9ff99a3ed3a743a0eaaad486de501bda63f3d3b19be9184e63aa465129c01391f883f6441ed327ede9e819aa9f4c803ba67f980b7efac679f0694fa360eae7f5d4e7277d02a46540d374da437de88bfec8ede4060a8e518e9f4f8141c557bc9c2846f1c79c371367decc9bb99a357335573367b666cecc61b18cb87c7a785c3c3d3e5b0a07bb1da26fb5ca405963236b644dadb5d6ea21e7aad73f52f5f3f3b4075aca72c8f5481cc9923812e7a777b3bde3e196e85a3069a9efd2d183df791fe988e88d3a209b6f98cba787c7c5d3e32303797a7878bc3acb96dc912dd9fae9b5077bc1d374aedeaffafce4fbd58fb2b0977cc91ff93a193d843bdad9abb73b20f18b418294a3060c36bce4ddb83862b0c2a632cb00ac1d2c19582a5d7fb21b1c17297b225ba2661ff8e9f0ab5af8c90434688f0cff55574d826d0224518132d971edec34ab739ad5ac1e1fdad33dae46612c968be562b95eaf263a4a0ca1366028f90d0fc7cd11030c3a64c0919205930ea2b017f72b2c29ff55575dfdf40fc77fd555b362f96955af5ad52a9f978f4fdbf44ddbb48dbce138bc1c1786185c8727830176c8a085111c3648528bab2a5bc1d67fd5c539dce21ccee11bc6e11bbe7131cfcbe5722d6959b1237378305c8fc125334ed773358de25a2d7333a74ffce219834d59b0dfb47976da73290f166c893ab49944e60df578c54e34b1ccced306ee38c37e94e7d9bfc9aa8ffe511e1b8f6b78c8156cf48f6bba1636250e4bf474eaeee9f0a46fdcd2db37e9997498f89a9ca1bbf08cef8d8a2976133bbb7d6661266cdc05cbf2e27291606e0cfc4c1f63ca72c1dacf5a661d1d29ec503a23fbc67ca5c0e6b5d3698ab40eca71c89c1e84a71a4fd03e6e70f1c12c3c30807db0d4e0e3861bd8c43ea7c748371a698cd11bc9ec063eb16734b089ddc5e563f4087f548e8b9e8b0f326e6000cd0b1b805d8922b8cb030d2265ec650170073b0f91073be71de103dcc11d90ed326088fd4c328391b32ceb0c04e10eed4dda35c99e37d4cce16797c5d6ac5638bac0e8e9a5e1726c62d333bbf46eb0894976343d10676663696c5087eb30391c83c5596a701d8c82a92c13891ed6f8af06ea00f0d43ee08e8e3cd6c72b41fa2649e0ffd996186838b71536d231da0acbc4c311e95a2ba1b07132bc9fd7c026e9e3b2b0291ec17e2c2f65ecf4af061fdc02e1fd269d2cb6a5b2d02be7952c2fedc396153ef0965b5e563a3fd421679c4bc069f2b025c5921d0f5b384078fe99af672f7c7428bddb5fba7dfa9ced1876bdf432afbc71a74f35382c9b1b23844c97fe221d76424a42a4638e5d99e9f296a8cbd24b0a7646bc54ec7630d34b2fb04f3133299f8fee8114ec604af4beb83e7a2744ccbc3931a74fd1fbc656db68b9dad9f9cae49484f0ecc4d57f3267aea68dea67cdeaa3ab513d1f5deef4293adf921096913e1f1da660ea9341647b31ed2a2dd5378956a3daa34f9e8fd325a49de7cd27733a21ec7d5964ce47d9ead32773624e8f0d2be802a7a58a394008a38b1a556cc513570a98a852d15bd592c52d10e746da342ba7b5d3e3f31fffc0d7cf8f20e8a095fafa47f551d67cac31096008682881f5f1cf7cc99928371a78fc9019042f731e7f74083bc68e31c6183bc6de668ca1e833c6c82eff422e4e2cc639bb6584d2051b8a0525d96615d65146a351f41ad8147db029facbc287cf56b025989077dedd98d02dc1741ef2d08d097907b98d0ad61fe0a10e15ad9f9d0e15373a54d8c00de3425e04410e0c72521b774060a987f9d2e7cbcb55c1c29f2f5d925497eb80132f59529fa8603fd8ea55dd1eea54d18397f7832ef9f0c8103466d7434d12852afca4b61eb64752a0b80b53ba6d9bb77584104a902462f4b487fa33769bc34e07da44922890f1df01819bf71141c408e5969ce053f4f64ad27158ed4cc17eb0b5c54ae7bf5e65d43308fcf41e56d24b7a6a2bbddf8a4dfe9b6fed75df7abf6a2d89247bf3349f1e12f3bb464aff7a45b723e423315ff62a0d36c92865bd3f3a467636e636f65ab7f8b36dae79ec8090bedd222018ffcd7c06c6cb2b45c8390d46857ed2a83d05c7e83d054fa779c8e3343a621c25a17ad52724e64bd75af3f8670a967f3ea6c1a6d5e61b7757f3721a9b7744d45a35b74662fe7635309f9be8f00cc4eacc44bbdcd33306b7e0f4ca260737f87af5d3a887a7e8492a181fdd081ffd27feb8b014ac3f49f51f6c45c1466ef5cd9125cce05a474250e3838d93681541053ce89bae4901c7d2d161e12063578fce1094a0d209238914d84d183bf0b9e958445a3b54404124074bdef038d1b5787000051327a49bd7111620a939b28229a048a266ae9e1f7c80536df10517308ca583d36473e9d44004684850ab55498870372d208051854ceb69c55953051e104ba78a25b187b621420be9e34a8f18ac18f23adf3c0905cb43a34e3c7a54714be6d1230db7681e3dae50bc86478740a3481ebd8846ad780489ac6fcccd6d4eea0fe096287b962c0100e866085990964cbab10bdc11bd357d731b9c8dab03bf0daf5e8146d1302b873122cac71444d1703533b0827dcd60c9477f79808dcafdf7f2d48822b8097bd54e744daf60ebc5250746c5d44f4c835be0917682f3e2d7f06e7834c0d3e62bde0df0b4b98a07e129c5db7ce441b8398ac7c1d3e627dee6ec5568da4cdb96038c049efb9078ae568e63226c435d4a1efa14614b8a90bbb014dd1482f597def4e6c0a7e82eecf2042bf26cc8932a954a7593c2bcba41b86d207a5d5adecfc2567c5f6db13322bebc4e20fdad020a2a7d7ba833849d8f5e440ca3506e18c02db04505232a31f5c19ea7e1d612d8e4636a93bdaae196b6b1893f604bc71fd293fc163b1fe2d6c36373d8f5c0dfc324e5e19124c8f8819f5fdc423ff690fff11e966eaeda5c6e7708e91bdb34c11e21d926a6a17ae23f7959f5f3f007b24dfcf9f9f913ecf4093e9313b8fa04ffeb211f7deb3c98da32101fc8148255f9e9f08809a678d8eda0f225e798bc0efc92d98689f00ddbf48a793e7adb70cbc73fbd6a279ac8c78f6df8875b3e7e711a6cc344643bc1a6aef9787b4503fb71cf8a06eee11e6626310d36458e3f6c8ad1f9c5d15f1ad52b1b788ace36270f7572a082ff7af53112f1edd2db7c60fef56fdbe695db3cc21f986ff72362b44dcf87c7c264686e840754cf79c5bc2390b08f79dd22843b32c9036b1ee053091f12317a166ee1dbaeca613f70d12200b3f0b35796ff8457f70bcca70309aa0fb6a4b0d13324478ae4062b9a98200c21f8200a25d869411426434185166058932b44810526395f10c3278571d182204041c67f2c707ab1f112163ac46e542a1513536c93360f3c920423cfae29a5cca0784111ba00c6922b2c61b98060440b49678f4aa522010fb2c6d8858507d8ca8187d7c32348b079f892d3a552a946d0ea2816597cc0234cb079863e363f3882032f5091c44bc3b029be344abb2f7d8aae8413bc5851018512b6e0410a903c0fe12ac360caccf2e08f17c8233aef2008cf5e47a6a9c4469b87479a9046b479eac1b0896d7aec60410c126861f54491146ff184143c81c8f36c79615c788e8eb0a29e100cf3c2a6164be5ec08ba306c651cfac0a652b72d040a9802139ed8420525c049414aea54e15a26677809b120024b0f68f0dac3560f8854b9820d421bbe1959d9e37e8b35bff10b9e3d94df5a07cf1e8edf24278467cfc66fd388f88517149ebdd0cf708c28c8a1c919b2f5b016ae4089451a4b1e72f1b0958513bf7507e485eee068e04637746043d062c843240f5b58e468118596d5aad510d81112d76249d5b28c07ab9a94d8ed0294593489dd4ba45d771ca44c6560058e15393f5aa4d10327aa8340f3ac6a5956b93a7b5c352acb2a6645cecfc32d1eb6728c58b1c210f091c6569f76e87743c77f717583151075039e747c641a3e720d60d42636a8e36bd7b76f91cbe8891dd800ec4054451c9c9c66e5a838c8234845eb0e2762ce79747ef14fa36cf7b4bebfcef9b611a134cb8657ee9a932bc2ee572bca7ded6c36bccdadd779c89b9ee2c95a5936f847d52beee9560f7799c7c58a911559b2a5031b6053bb7f9e06ecc70e28b1016e892a4f03f5d97d477ae742a683ae0cc8a777f396341597b7a4c19456fbd43bf0d491bb1a37b96c06dcd1fc823b3ae2b00ac8398f9d11d539ceeb2db1bb0b6bde0b0dcdf4cd69a477fc6ad457b51715d02db18ac36c1e337d73be309d831c7463a4773e93da301aab6071155e442aaaf0e29b5be20efc2d43311af0c4afe632a0a987356ed35cbbdc13515cca149119f99c213989e4c1cd8ba92b7cfb17c3f30bf268df20e4f80c7e4153bb0753b39b5ed8cda547097a718b16e0075a4ba0fa89efd883137dbe5dc6d777fb8c3b432c8b86a655af2cecc7acd70b8d7456a3e4f476d601135854015b301eb0788b6fac32e59a95888b37f888034ded9bc746f8c439a802ee6867c11d21b0dd2a8babaefa5661959d6f2e64faf4edca148191b7145da6146fe965f320606a73e9dd24b55d99982242ba494a5e99e99bcb148199bedd527490cfa4643adf5c3acce6d2413726c5a5c78c7cf399144cc154e73085f91146f8109f3d484c81fc08209a071153a052741587a9ce2b459f1cc8d3bccea2550ab2f974219bcf2b530406e4d2654ad13b21d255ae0ce8763e5d888a835cc5412e9d33c2a6064d952e658329e9c1d4a89b1e4c813887593baa158daa56b2b86222d6093f52511397d0e88dab550fabc64a0febc5dab81eb686731d9015efb81e96e45d0724f3aedb81bfeb80c41a2b2ebc5192dbb6b276c1ae380492b74721c0960ce5bfb8c339b31ab5c51f188feff4f1f4d550a39a3e4224ac1b5802c8485cd78546a32b331a5d19e9282a239f5e04463a0a8b8ae7832534f2e930282e9d8e7c0622bf43887e10ddf862d364c2a6e929eec23f282e12f9f4ad6a224f3e7b0fab398e8d0f4fa1b10db7847c823a8f881317e5f0ced300112217790ecf87fece4f3c224ebc6484c85dfac48bdf79385ce4f1e37017f6f84f3c1c9702904d28de79f16f941cbe4874596ca964c3860debf1add75871f824d265b12b2b2a2a2a291e3fe57ef1477708eb9a4726dc627fb0aef90c49941b773a2016f392a08eb9c8fbe48bbcf33a1d620254d4b14b03d9009d87c053988b9cbb1e34b7eed29d17f222251fe2771ebf7391f70d21f213d73a209ab30db79cf8742622f2e97cc32dd6a79f78f30b2b72f8278e75404e2e8b15bdc83a773b587b4b3ec4d73cbe666f747911e4c531d8347dbec0329179633fb6c1c16954c4c1c1f919733a67face8e929ab996d29ce396ee4a91e5e464412986cd17d82fe2708be6d3e314d321e79a4b4e00978095a736d79ce3046cde013902865dde98181efa34dd479fa6f3e5f9973e4d3f22089872e9d37423828029ea41c014e71fe4d9261896f3cfc74fdf36af029ce7c3f9e61ff4d9409f269d5dcc789ad4b1196dfa54d2bc4b9a27b130c5dd92e6ecd2b75bd26e29080b999e79dd350f6398c9317908c11b015146f787f25ac973bae4792b7bd7d7169d3b08e392241d9018bb1d9a8b1ebcc21474aec0e4493a57480313896007f8b7855921dbb90644319f63fa50e70c9b2dcb5cd1d339c3084f6253d601c9b24cd374cef0f92d56355912d0674c55084f525e2336f0d261bbaed8c216b6b0852dd4879029e58197b00ce2a1515574bf8ad1988a2fdabd6dda0911d5a323c73cd215a79452671bf9314e8a8dae46cd1b5fa39b72ed55f1345ff136af1e479d524a29a51d5d8152d429a594528c7aa494528c6214833fb899fbca745f999033579067b9564a53b43506c1945b671375cd33f5897a7b9452a7d762b72335a5d5a329224271d91d514ae1d1e896526afd482e7da24e5de4f9e89093bc97d0a5a1e95c731ace379217bfe988d294fb02baa514af7c4b29d5513ca394524a4797520a72219a836e69e4a5140779c8412e64f3d2e8bed04c975e4ab9a520a0900b51f115df7ad8d19015908a574a7198b229a5dc20306533bab1a6a62bbd806e4c1118ce411e13f20e746340ce39ec4a2fd58380a97a638aa05c98cd338fe95ccb6e0ce79b90906b17e432bd5d197690bbf026f24ee247d7462bcda8e6b4d28c528cfa09a594d2ccebe69dd368ce851ce4180551afd433ea1af58d3a47bda31ea2d45d38441da3943a114edd47a3d869b38ba74a1a98c3e933a97963a6578fa1d0b7ea9564e605c96a75be319bd75b9231ecd92dc95b7240e6d56138ef5c7a77638ac80b9345cf2ee42e26b158f358fbe659fe82cdbc7a49bbce26ccd4278cb7b03c348a55f08439f6557931af9e8f3e619e79ec058b6550077687e01ad95c6c5fb324e5e8dd22f64344e72cb7c4fbc56b6fad0fab8c55c60b031d76ed538c7163f81f3b21586227442cc170da8dad5b82a9b76ffad45eef163b215ba679ed6034af37a6ba765b7de37d6dea93cc2ea94f2518e83329def96e35aa24dbfba65125d9257983c4d4d65e9bb96055f0d437aad9aa2d88b41e09ee0173c66e09fecc7313ebf5abf6a18e0e943c7d169d99ac35c198dbf8a6f3c4a44f6f1f623a267f4e9f3d9b7b4a096d60fee477af36aea10536babc2c6c6a81f56f87350a165e1f6ce2d8041b5b6244e13f7f6ec521be996820dd905332b1411d5fd5540f790bb6aa2a8fbbe0ebd536b66dd8a64f4a6c11388d629b3e714d8b9463593624b6b1b191463c2ac1621efd9b441a0afbb1b3eab1fb236be44aaa7ad8e83207730dc330ff24eb31af32471a61136bf723f9c42873b865490eb7c46bba32c7884b07368765845135c5decd24c5de376cd327e6e666453f42fc81f9169edd065d4d229f643dbbb46914ad53dabc6c56fd5ab514565dc60a095f639b805289670ca7b950318c8c312a104c0a8bb92eb6c3a679a5e8fcc33a8f0b7de10b5ff0428abb3249b4731e9339774b423899ccb95b8439d40581a976c97930c54dacf334aaaab01df6aaeac176aa0a7b350ac3e994146b69302c09e4c118a6c5b3c30fdbc196b0301c865a603b7007d75555613bcfde3916fe5755f4d528a6ab67e715401b6400515c843c9805905f005b30e78f591fdfe0997fd05a4e117d8a5bb00f1f62924d8d8a35aa954ae73f1d3d88f2568053b5863d1067a40a13533694dd4dbba9942c5b6447fe1861fb4b2ecad81dbd520ff255dcfa78998865ffa28d0e2c730b3c72a4b9f543346d8ed1870f161693c99dce098798327ce4be55470e68be5d4a4e55a04f8d62558a1d5aed071bd4f175ad16ba049e3ec16cf5ec740959cd674bc0137b7d0561dbe133122b290fb7f42dc196e6812676bf21d9d86e2450ffecb431b5e4537b2301b640d2673d5b4467bc82d5b2026bda48119dd3865bbe4c090fb794ec8fd8c450c97bf1df8ce2fdedb481279e367d3fea336d7e909f29e1964cd3aa673706f37a4b3106e4da9df15eb49d9dd6d8a74fb51424a6302f09c1b05b797c1a9511e113bbc8e7f591f7b3d2bbfab4fb3c7b4684519c632eba1f37aa3eef772373793f1ddef7a3e1bfcce6d93317a3b8ab75261a32d7514937343bfa2f5382dd2f53f2bfc59865b7d4dae55ca6d4b714a4bae630d535efbe309a67372673cd633aaf3e93c26e29b2f86099519bb26934c75ca63ac86b759aecca688eb976ab835c48e698639e6db0236c50293a12f14bd26134e7bc3d7e29ba0ce69d83bc52bc25798368ceb910cc3bc75c8673cd658af485c1406e7d93d1825e36df5a96f494a7d626bdac70484e5c7a74ca437b1a35c27911f5d92a580d6663e3529e1a17f6e9e45a1269deafef671a79a148799899550fb2eec21be7c2e15c9c8bdbe15a5c6bebd97ab89aadc783a9191068bb31986b315a844005403d3d76f3900b01b9bd32d6411eba324560ac83422e038229ef0db069833fddf1a9118a040153a38d878666c537a71979c82de5b93d2b1e4cf57d01d95b8a2087d91cb4b279bc30a1d1dd423e93a2dcc2cf4ec98028ad42c19a01a9165e5eac06e49bc3807cd31ce4f1c26c1eba31d82d45df7c1ab5e2ec5bcff66a14e6ec9caa5129cead9e5de35c73215d27a339e730a5e229d6579c06f39143508fe1d19e1acc62ab671fbd9e7de587f280563c981a61ddd33cdb4d2988e69c0bc1b910a1906b0e1372ad7ac8e385b131995b9f4975a9cd7a212f08e69a47d08d09b97663408e5d0760ae398cf591471f61ae6137d6f489dd0b16e379c66e22f4097911e4f1176c74982ac51b59af2244b8028b1a952a1573e24d6441d1439d2a8a1c8122ee442fd8529098c25cf39210cd410e72cdbfb8130a793005c9d86e1aa5d5badd70353d3d5c4d4fdc5acdb97a1bc9845c3a4c49cef5dcceb91a3572f69057921e7298da46de8d4fab518dc45a2fa5b8d49a6757a673ad73ed965a86ebc9948747dee679d93c7a56f55b3be5a163b0632b6e19c2281c2dca845be0111634f926cfb4e7a789ff30d533911cfc8739f11cd965471e6ef9b89a1f835b6017cfd570cba7bd9e7d6b754162aa79b8603fcac3d57035d213a279e8ca080172cddb763b54ed0577b04390b769af46f53c2700f6e9d37c7e9e5fd086fa41700ad376b0b05ff3b4ae681e68c31310a5a9fac4fe712af838183c3b841f57839b4669ad6aedcdb36baa466d3d7d62af28f7abf6e46a2ad1557d169cf81a0f75b0f07ae9b303121db260aa00f2e02dd86ffa3cfb109faa7e93dcd6d32890b36bad46812e5743da7a6cad216bb5d633e7f1c094d66a144ced682e8de79929128c007930e5813bd8590bf1c5d5fc4f2503ee606fd77cfad7f1321a767abb762b4fa7037fdfdae39da87eeb612343c16e3b5b8b4d1811466d37513c3b66139b87366ddab4797c6c48d8c4decdb36f378dc2a2e0133bedc1a67876ccc6870f161693c99d44b237cd73f37a665e3d33e5e9136f3b5b8bf27c5bab0b02539a43ca437d1ad53c94a7515b0b9ed8797e6b35cfd60a5cc071c60d2994cab081841a432079b1b2850a1629558c6e8022831316884e60d16822848612202e74677052d8caa8da189918f50b8c0bda9a56481d34e906eca41ba6978a65210aac39be9084802e9849699873b298a8290b447eba1c4937c5e804b71788a0040f5a52e001172a9f145881085b88800a2db3a7872d253c0f7ad84a62a436b1ad1ca01c61b4a78c2616130d35e834e5902c51880246831468b29999e994121b81363bb25a9a136448e159c96af253f103b3b118ac9d673a47b08575b6848d8a1d17252a17ea934dc9ccab1268010a3078d5a0062a2896a87a2e216b96560d193333339d18533eb2c418cdcccc98089c0c3aeb15624c9ac1604e5c91050b40f0854b07598c31048c568c296777892698c5bb620b598e2352acb825902cc1fd80a552a99af0620c8ce7e1111ca878a85881176260383e2d031f48218c177ce18b2690f00a03073c384082172953289181175948cc062eba43248919594ae6126c3ac48741044614601009c156184eb4c2a0b101eb1de7db75b0d410443580578a3d55a960251a11da10df6774c7bcfaf17e2cdf312b39297a497dc2e9873a3a30e3654b61fd3f9f2dd7c9c1172fefc7923d3c32a40afc73c21d71f6b4b2c8a2d5cac9c9e9c24817395de474c1ea82158a10423827843e3735d432801042083b05f6ab37b067b0c50c632563db20b738cf98d54e87e918e424fd8d72b3d361621ced749895c332ae763a4c1de6d6ed30bbac62b4bbe10c47f9b3ad50d87a88e2e0092681604023d020349dc0922a61614bc98e12241d90d8c404aa6f6ee94b9518f976e995faba7c0e1f6c613574835d6361ab8b1bd9c34a87dd0e7e8351ec2412c95a2e02890d700bcb56129d52dfb8520284517a9c75a95cf474cfe160ce1de0c95db61b15450178a2006c813083a78e3ffa5be37480e33f4b5b96802817880188720b300906df2af8fee2139d7f51045ff846e3dba312ace6d4bd6be4d133c61823041a5567a9476e54cb7070b99204d5314cd2aa715c5b61b9aa617493588c943d4ec6aa6194c3c125524921955b0c3910dac048e6c396155a0f6da8b7c21ded1b0cb1116c741f20933ff108448ec0c22327d8f90ff640805be21761bd4fbc9d8844b825c5bbb76e98064ac72123ffa28d431309c3428e7540babfc1a6ce21a4037f279d107995fb903712dff9065e4253c849a11ffa457e835b44f78bf9cedb4921084da11df9ddbd91039bb61cd8543b20d875a181fd48af834ded4dd8ea72c39c3d7e89d1ca8162f0185ca08909fbc11ef9cd48b487add7cf43889ace8e75f19e42384013e3e0126f8c31c628ed9cf009708b7781a6e9c194dc608d2debc560833a3e96671ddd93343d9f34a318d7c3b6631d106ea936336517561d6ceaeb5e33ac06d9439758ada6addbfb56c99b375deb80649c675c96b9d601c9321ee0f79502bbed19b0d3b5a95d38e7a459d7435b49ab776dd9b2cb0049dbe6c6498e5bfaa5c7f6283b8e1f9abc4fec901b430a43543f65d36c3abddcc2b259b1411d314a1c260f5b6110f98fd427b0b0d54592262d70c504cbc555b5df2bdf9893be67f8b6f1eddf35be51dfde77ca37f77df25da2d4a557a23efae9da77cf56f78d7911803b980989052ff64a5a15d128d872813640d9726153af8045936c5b0fcb5948c38604c744903ed618638c31b69473520a2b7301e6f811f2cf79a546f50f87b4279a7f2a34ebfcdb42a4c8a3fde3160b7276e85bfc71e2ed1c7f88bc5dc61ff107e6eda4f8839e78ff913efe1011808b3fe68590c72780ef1b7047bbf5608026ef9bc77490d7de01e003f0fded6850fc815d18797c3abebdddc61ff4e2803cdabd1bbc6f873f1c06186c8021478e03e4c081c3078e1b3750374aa596920d1b06b051a3460d3548a40290565608b0a2a2d243252585256534e23142411900cac9c98e1391880691b502b0a150004220d009d475a68ee366e0b60d009ba6c9a065998eacd6182a865d8c528fce097744fffce7b3c3006d90dff2d97374c31dcf8e8319ee8840f4f38d1d90d9edc0cf7e03da3063ec804c27cd4821e5b5b005da866cd0a18e0d7a1e0f8df2e049fac9d583474a6fc7e10ee928b052d3217e663f7ff7971e6b44b0411d2c3cb2faf9af7ef2074c9e1d1e59e11081048911234386d0d0c41858d33b21250e1513b0d08457195dd82025c178a9c382239ed5eb90447ad8e2c18e6c3330a68ca40419333333632ee68e0648a8c841a245913352ec7ae61598f14ce764c6788b1f8c99bf603e6db10218a8788cbc000b2916c2b3ce0a6480d1d904333333333347262ccac316921dd022592612d5a8e179a7538f1e0f0f70800c9eb842217a211bc5a90fa6f1d086209331e012a8e40646d1206f308a07efaac30af4a927fac497cfcf4dc5b12c528eb74c3b2eb8d327555dd91ae8e3c3decf074be87e2c26d0fd4cceddcfb5faec637d6a95dc1c638c31c6d84385299fc6a940a378c727fa449fe8c33ed1877da20ffb441ff6f1a9d55a9c1d9f9d9db84322b519b5b5b08aabb8fae28ac4b56f9c761dbb2e2f0efbe034ce6f3e9a4fe6b3c4ea891a153cb384c14d3b61219b7aa75112db61edec3c1683c9972cc9922cc9e29d463514da8c9dd6c2ceb3fc800fec7aa8cfa088754b97c472d0b4741b3d1d7a9cb009163a7bcc06f90636c5d9fdcd59314904b75139a76c91dd10c6ae1d4258d2213e0d6c8a2ebf7eb3bc89a1a7434edf2674363161a147873785818004042ec2b3073a3282263c7b24166c10da20474ad4c782408df0ecadcc7f49257ac8b327e219609cf4a01710a3b3c24c478915cfdec9cf748c56f88203ae2454e12506088ea0852f12e005fd6286c0004f3081086508010a3f5aa464108eb0a426a192d3e294d8748e68218396aed27ae923926c21898205012fdd25076e89bf83c466d620a828a14384d7b307d2f1628b674f33c219cfdee8082278f6527e93f308449e3d1426962c696d71432ea0e627e67047099b66adf5bfea43543da4de4c0af36652d3b5fbd52d723d360f7594c0e4793cd459c2139e71a6f804603e9d65c03895519a435ef1aa14e4ae62aa3a752134215040aafa2aa642386c9a9ce689bccf5fe4d48b2902431d23f5697a0cf5e9853502f6bcc8610ab2013ecd3beb89629e7170a4e80f51f5a18bc47ced326bbe40e43e6d38c12d30708b8a935ce475dec38abc070c5e7c152fbe7bf16d904422cde1b6f5b0eec2a488e3270d36719867922e449fa67fa69fd687d0dc66f1f0e1db6fe6bbce6d88bcf32de33aef86436eb9e1b1fb41bb43c01c31476800e4489cb8bdd14764c36d78773f84ac9d79d10dcfe10de11901c30f81c3e18b8c80e171dcf0d9012979e7b967c38b2f1c9dc72e5e2283bb70e79a08c57a887b261336bd9ab049eb5cbb9fe6dd8d2f20ac8beef7693703337fe221b7be69be6dcc9d78c883dcf203cafdb4d9fd100ab90d79276e3dfee197f7c50cd139c827033340747ea29d685306b657a12ceb6954ab72780e15d7545cf3294039bc2f478e56e5f07ad5aa1c399aa655bd2aa5a440edb68a771d901387dc2285f4af867307848a6bf753f1cde45d04b976bfee6660e673b828e42207d24df120ef7ca31cecbafbcdcc983cfa7440682eba5fe8077b3fcd3f91831c2472ee80c8d143e739ee27ea660080c84fbcf85b115167fd948092e81e2184d9e995a198cbc4f02d1272ead82d2272ebb2fba173906f0170d80111839f38ec7cc8e1277708cd7338ec507e1379219fc16107c4f5900f2b1eba4368bee2a214970e80c7ae4ff17cb8be72bf99bf8ee2f91083e7b8dfccc7e0d6fb62fe93c14dde9dbc6fe67598bcf98595c1e1cbe03300c0632432809cd4ed0002e9f0f83a6ec98718fc7a0c97795ad5aaa661c253d235c7d101d1f8c746e7dc2487a6913412abd874afe65d08e4f6c4998cf15087093ed3490f7598d0fa32983051fd46b9eb7dd74fbafbcd7ce7214de4b403029481991f42deb9e8bac83791c7adebf18e6d49ee7af0bbebc1bae6d086bc7346c22dda6d71cb4e00e4ebd0d1eda0c5ae87933f71d8f570e2ddfd429769d834fde4724d9fa66f5bec660cac90090466d336660c3e5efd64fd186192c32d5ff4c9825b3ea6f96973d3a8c92bd61cd3eec81b6207f89e7bce5d1098a2f1a7fba1bb4374acfa41732644ee97819917ddcff3ee462634dce2ddd17cc174f734c05f72183c0df0aff8167d1ac51c7da24f9c029b26b77c22d7ac875cf398d5798ca3f9109af3146c9aeec3b21e12fc9be67d22d790e0ef448cc32c187c8c0384c8ed14dc62af06f8adb3346bed45825fe4dded10a39aa8e4cbb5c6919e740cd18800000000f314003030140e8904a3d1709867e33e14000c88b44e6e549808a32446510819640c010401020004000044668a540063fd5eafbd0279d3bb4fafdbf67bef21c09b5efb78dd6ecf7b2f01def4dcb7d74dfbbcf708ec4dcfbebc6edaebbdb780bae9dde75db7edf7de2b9037bdfba2b961f64f69f24687a4abb7dbf778f514c8bb1ebebcddbccfab6781def5e0e3edd6da9bfdd3abec0d17501c173c180775c11ed907d876c50d909bfc55983b00bad91846dc97f9d971cf51edddc84b06031b7fb21e32ff44bc82bc3b54071e14a59e441de8fa5a34722486dc6f822bcf90cce186c933c98b6a8091f3c5f1f83673b70b5fbf6492e7a0ccbce87242fddb32da9843d7a8a98c69481183f5f3ab607f2ce321d7247e6ce40ee9e77c2b523f7ee9dc19084eb81375db189befc57103e34a27595af46268c51dc271a636ebbdf24949cb8e9821c79efd9a34a5b22322f756a60ee106ac2690d7e090a3b2e3c268b40b495d3d60e593ec78ef1bacaa44acbed3ffa073d0a5bf74d2260c37cae1aa141811d9313d189a26056d95ce3b7a8dc6f9d3b1f2f5ce074338312daabb37b62e43f9fe4cbb7bbda41d8f4522e225c1fd509b5db37fb4c1e012cd9c7c2b8918c16fe3f204c21a13c69000aaa0607c09003a651cab93bb7a11d8459d27009c63d2c97cb4bfd8670f057441999369fca32b0b53b134c72f5b5ac7325060822ee497be6643168ba66032376c48927f777f863dcc75475a5dca9849379343f27a884466129196dc4b1d22efdc4fbd965f38f4eb1af5c5a4441dfaeb5d942cf00e106dd7492cca806662c8ad31e04e7798db5e084788c023e2754d4bc254fcc1ae36d63d5800bd120c0e2cf9f1532ea33db5243936f137c61bb0d3c6cf85d65ab50e87ae1a5d52e58cd3a0c08ed0d4f2742b3e08dc0fb90f4bdc5250a6ea302b8c6a18130335c473c2c65fa77c09f4a494d9a3e15349dcc2fe28af0a88ad64e403c4447c4ead931dcf3fb4d33e3ab80bf012d9375742a02a1ac90ad0b14d09b22374af6676a86c7fb0ca6de61b2c94e63b4d125a1908af301addf010eef488cf80a23b768cbdf67c5d0b9ab3df8922f45d36476be3e184cef9266447d1c17eaf00920f16e9448360aea23a74bad5e2bcf99d25b5d3cfae387baf4ef828a1e69304880509598baea265d8a3b6df262d51ea591a8f6ce39fe31701c2a5efdbd97d4fcd7c7e52ba574ac511ebaf61486a3b340990342519f5e8c2b051d676bc517a782c360d563c3a0e6b04080df90802dead60860355976eeb4ff0134cab683799e35680bc870be0daf26f6f65b886c09e52cf8024083c8271f093f3c218efd40a69a51fce9e6bd065ab289762c936af0b8679ffc626c4e9c943db8e9b6d061a30b212f2181aa5f06f33e696c2bef23cfae0d407908fa50ba7dbc402419a56d22b446e6bd43866e3c44346ed9c5a76094224e28d5b6af9d1eb6b2310cf3e86ab9362bc09ad5c9dc1425bdb01afcff7e1b471ad1afd8a8612e8b8d677d943bdeeac2e35c84d26cc431b1a244099774c92c16fd27236d9eb2ce5d4a38520e8f89bf90c2fd91b8dc052f914e5d757da4a58ef839afb0950a7a00c133047c7ea50a702d9befabd016726de70fecc0fb8a763c8b41235a9caecaf1732e20d27831be3067db2c16d0a19fc0e07c5870d071026b9c7c91a49e003c5ac21de3d83e13fade09e4246e4bbf62dda6fa33a4cf05db3c25dd6b38656c8ba589d90795038ccb9d487198a47f1c538c2431fb33a99512773238f36c760cc466f7b3de5106fb804280ec3a031bb300096a9663e2c53c8151eeb2682f7803b3e2ec3b3b82180cbff5fb77f5e8aad674fe49591acadd791acaa8d661e0f906d51e7e442d40bffcb8dd78ef8fbfdc44904b9799669cf5f18342bc4324f2e44c7ae0fce9cabea850837cfb8cd84106654ff8f2c3789e031bcc605f7b17ad55f91990b1d221e0de00119e56df3f945121ae826261f77d8af35655410b353af2acdaf9cd023711fea750f66742694f32d0ab30feb1f4d46ed2c4f3adce821bc0e33977d3db490a45c4cc37922b5c3cdb84260d85fa1d4e1f589531c44bebe79d0ad0cff1c8c2166e642323b0b6f8661ee54fdd5a586d8180a838ca19e5caa02428619752791359f4437beb57e0a4a588f3ac484a907becb5908dfb2b700ce16bff400a9d120f44bdbf02de77dc8b4aba8f882f8c6a01f22e4562d839403af3a8f0889d7abf6d63393040a84b9d3c1fab258952b663e2700abb126cbbd53072fc57cfd2e763f5008223a9ed4054a29081dd7c4a8ff9417c154acb5cca2b469f506a83e05c520081b9f9f6cbd1f1fd8ebd5adf122e09bada1814b67ab3305944ceb53ac789ad156b95f4b2eea1f6acd5b4cc48335bedba95a2dc7b4fde2e364c992a381874cb4b7be8c926df11b0e87123c7b01bd4c3871268a97ec5b052311b526d06768fdd7c120d29925b2177fa7e5ba145339256557939f8dd9e22e7032f47c8820ae72a91a573195b6c08076218b619c44d94a9b1b4fa0a8b6b40b45ea21d722f485d771971e02855521e4fd029c875786b5a2641062b815229114aa6ea77b1a24d4b09da43350023ae83e9ca8fa90eb10a04ce1fdc8c8057525d4ca149534f3257a99c440a74a4c5b2e42066b19dbba7f953d539f5a7209f2e62223c71750469ecbf5a636aa8e8f844826fb9e2e4a60327b3d2aa695855533842895dbf1786b81da7cd837a5d9e93ec0bdae8243cddf262efbc73028421b25d435a9036dbf5da2f4ad60c864f9033dda2b180a17b30a4df9bbda38e378d0abac09d8b6452be2a548923cb773060cddf6212546e5999a47120b8d3e44429bd64c75b29f65937274b2cbb9fb53eda134480d67cee92bab1314ed0c896c8bc73db39251ec1e8626e8d360cc616561256864181a7c5e840bd14d38032a08beca1b5a98b8324d680e50f271b5e2a418c9831e4d0111c8e5f6cb0f54abda99974c0643e7de8c294067da5af7114a56b93460be0e3d99ac7e56217f21785e438fe3fc80aa2c5b81effeb905e221a9529e320c2c69b8d1d211b1ce94d64795769a79b2607297d9d3d4d9843ae3a5f7b9af1e61584148ca09ec194dfa16079bb7c56253489da79cce0af65ab1ccd685c312b5f22ac88ede96c6a9f0bd36000295b7680613b8f868f660cd5bf0ffd884424c369ca10433224aa32d82cd01ce37cf9b69f77530e194ed44415ee7bd6988a618915e4b8c38bc462999ce0f6bd4280d31550654681087b5eed35b8d2d35809da052c606553ad07d5cfe11e3657ce7041a47c1c914cdf3e99e0494014ffa1104a69d1646dd165e5ff725622d4691b0696ecaaa3346952387b7366739b0b2a0f006eff8d7a480a0f0fe2dc9449c45cd158806fe1aa9018ed42592fedc1a214bdf8caad642a6cf27545538ef6ea177b95e2087f2c8ee352880cf7bbb8e32cba337bd04a04e918eb9f46a08f530529e6ebae84a251d4f19b75c0a89758bf62433996da96845bfa22bc9e3c3e44fcd284ce9319a0ee2b89cb55f8466c3676d002f4d8279df3f84cadcaa219e0a473f008ebce3bda7c67a3c492cc3b1121690752705614ba06190009f1302ee67d472bd310c43eab41708ddc8c70ca8e0b88271671c479f8540433c4da620e35d13c1fd02fead26463c4ab515c6b9a9611a8074cf225281c8418e407302cf8b7005cd35c626e288c898112116c60963894a0fe953ba21cbc8228a5349765916655d6c168254f15508345d7c2736ba825346a612c99eb3aaa2a396dafc12f89c7fcb4e08034509af00e810556c0760635dbbc04e20d1f6857cbdf7092f1e868692ac77dfd33d8c1a5ad27f013feb03f5ed8c8adea2cf26944c67e52d4ffdec448c141631d4096d2d5ca2c0b18711fc79619b165b7e607bf1b6d4b31c9cfae2260b9b6df3d990c3803460ed0c9dfad6f729960324251040ba24160254a01234a7b1e3a6d223a732948b5826d878624ae6729470d26d4b97606b6e53b7ed61fc70ae5614df9139e16389f69e147b91796eaad1d20826ec816504150c37e11f9312ff569e7724403b345e83250692dfb2f8eea1714d884336ef78b379524087755306641fe3e5b4e410fcfd5c1b873b218c4e0abb397c727a17eaf1a62f8740d9c72eefc454e983167f59936bd1d6fc0e204cdd76f64112ad31e9ecb39b4d8723aa46be3a73ed48173bfb700e3f123492f26b61d564fe749e7da832efa80435f497197de2d620a1d18c52c8664101206f8f5b70f57cd70f8645047cbeb7ca72f9b86f26beeda9b8ba915d87820e5009c048494c752a643649482be5bc3786235d1182dde6927d853f94d545d4fb9d623ab4b9c869abffb1fdf3e2a961948cf68103f831a522d65fbfd98d2c65b882ae3db6ee6b58250d83c69c0d5bc10d90c02f5a3e28a2c367600679e5091c87718d4acbf60665466fef33d8ae24597054c872a62764ca50018b51fe472c7e25db2c97562fe3a3731be6be255773838ab7967a6f592985fe9d91f2510f24bea416d7fde66ced440322b01469183f2ad324600c6ff0378c3e436190653691b81f86cf81bf3beb44903b7f100e9e1a8ba9a7c1f6ba7b3bd73398aa8a1cc6a5e57852b21d93674d8abe2174370e01aa065ca92873d9df6b507fdd762c7a1b1ebd4c088955c95c6cdc3c719e6177c9ee42338e387d5a0b4608eaadc46d3867905b6477e124438f96fc8da414ffcbecb784d1f85fa9b1114261afc8cece19821e2d3b3bc928e295f92d29e5f1b3e577615473387ed0a7c111e02b0e457d0f68afcd1efb7af8bc228123280bfd0b0086bca0dc1247b1ea22baea428fd488447403f32a70165c0cf8bfb656aaa8f5d846789a9c9a4e0e3e615eebf3f22181f9fbcb8c0748c3a7783f21a63c72491c8e338380cdddcfaa4af9f5f65db2ad86cd47b2133058a49a16028d942e3dd351f865cf6ec8e356b545beaaaa89c70a91247895c664ef165603f65a8b8db03c2b6ac4009f2da64ab9878d81b13e69672871a433910a5fba3a0bd5ae76d2148b74f34ddd69d5d06b4a53952ecbe69a00a38ab422ea28a74204f86cd4210e68696a37202fbe4d577db3ea1f5ab124b790e135551a2d8078a312bcff2fed277058ddc09bd20b4429882b5546a47f5117a4cd29d210a60d6dbba58bcc739e56484e861a5eb0102fe345ce6d4b73a3e5726f2d3b9d9ca3e84b8a124ec38cbe813102a9b9f52d9a3de883e118b9c7aeae4d2ec2a24a7beeceeafff12109ada712a1af45a36c5af03d4739595e5e9d53a1b2ba66b55842045a277d58f6f536bd0782f5f5ecbe92174d7b4e504eb456e5b8bf77b945d14528be06bb44fa992b92f8a9762aa74f576de3a5bff043b4a567ac14a802f76399be27a490adf40062e7c888ad3e5815e095cacf781820dc89f12c74126efaaa8557ba40b9bd7a7e3b173f029a0b262694d8e622a59b09db4238236d17e1e4bf68aa23ad246c951548ee5310f4785e5ae7924357ec0097bef166296834baaff62fbe9a8c04f38273ec842b65df196467f28ba0782cca8f2be58364307b476cbdc1f112e7af24681ba2c60e4e2d7e8577821c51c5587f4ee9c69e43f22b155d8427d6f990502356cfd1f053658a82c8d02b1e13847406b56a39a076e590b9583abf835e59db24135998ba81c2a41d9831817e6aecc25dddedc737ec0323c46e691a76e83c112e40ed2053b7234379d3bd5e83940c23fa61ee8299af3b73c4b62137ea0d95fef6fe36fc802c43167622fb259562b2e0552daa2f12296b9d08851c99ac0a5193387208ffd34f7e9af67e0d9e22b7e8aba1d55fd085dcd5d96ebb59dfd678a69532f75b4211e4fc2d838760510fb27336fcb429ae042e6802840f472ff885fcfaede5ce409c254d8f7e90d6af0ca653a67d92a58f3611d50f1aca54ac78fc476c8686a5c885a5216a52710794f45f61fc8b972a3cf276c69dc2014500bb16a2feba7e640a1a58e4f1f0db5677651ec254b6cf9a90e03afe1e8edb247b904df8f71872dadfd6fd4516920a052c2a58f5594e619ab7aee6bc6d4b020244bff298afde95034e26c2d9f3968a23b6beb5e72891e438b46355ff1d2b224b43e49b71b5ca5388df01f9aae283c8a2316b5758888bf3f38998e6f190f8af48a425d1f9e9fc8cac4a78145273ba8fde32b7eb09b4467b4dcc7e760d4090dadc48e40b8050187c154d9ec3eb31e45269cf602ed07da227344b59c2f3c455a8e9065ecddfe15a726858385bb93889c50adb6fb78a9e6d713db1e19ce49082e41c06e885c54fca0487e00b9846424920cd4b28cb6e89bd1bdaaa43f318cd4decc769180d572794211c32e1791ed33a6dc06052c5b8a6d0f5a6d2e3671c456804ef3dc290fe001b2cd705c2464ddb2f8034a798f2ca05b0218be27f401958eb0a1ce7d4237dfd2c9c9032a9324e9efd872caf069afc47c23f980aca1ea3eb6ba23e91d18a057ef23f7d85565f93ca74447f6aa215539e6631f8923cc2bc8aa0da175b801b130818a4b2fffdb693ee828e561370dbc730ee53e0f6aefc011eb01c6705b3333a43c362da6d4f7df5bb066469ce4e8e60ab3e2b73444939d48c369941ec0e20ea0c312d604179f68ca05660a614fb7aa8ce6759520d22878a0ae3086a622a7252570735357ed288c6f289b122116f3285fbca317590bb6e452dfe1bd25a157a5aea3be407509c4aaef6248a68024861bd6dec21eedb34ceb6c4d9ad87500af8c95e4e24502a1da8e763cf2876d7f510b4ae7bc69321a310b645f2c62ea0fd78d0183f84c8437c227f60d5bae78fa2889a62fa265bf6c5c0bbb0c3997e3e92c0303362258942d9b6f40097168d1b033db10a7aca949de53cbe97538f3db33f41ef45acaab2ac1d09f4c05caf0ce8a143f1fb7934d5197ae486e0d0835525eb1240343042483e488fa9fa2e052d3068547c614f3484b8f804f0804c94d52df721ac0dda5bc9f537cb665ea4f0527b5c228afb6e1ec4a917568c7d42204d0a50f04f900ee66b6c434d2648ef42a7608d9dda4319b13b7632bd0b34ae2c3e106696f79b4f34f6ee2d6b6621321544665b6fa6139dd10dc5c162cb1c263a5383abc7218a9913e53ef50d1f8ef7c84c9931e24eca8fd08993c18aab8724661bd0cc9f09cd3a590dc36c5cb960e65f2d22dc44f706dce062911331b87a837cba20efdf510e06d3ae6467a002e2a990286c7db9b07b643802ff7a4ac89e5d6d9c613cf908bcba0135a440bb8485099a1b561e955393d6744fcdb6f1e2509833f77947a9857f0f5bf94ff576acd3abcf64b41b96a418c6b048eccd7e14d083dea774137c3953d5d01e5de26c81c1c57c8d84010ea1ae5b8d29a9d93e798793810b7564f8da09419563a126e2b89275f1583ca067f682e38060f45a0f05580dd1a5358a8d579dd2b17876139b09ab33fda2d89093352f99c466d630eea97dd3d09f59b40cda27c31841eb1af20f092831a6548ff85faff33462f8c36db40b7b9a206ff3b7d6d1aa5bf46f6cec06e6ca2b398fa9ece2607823a3d8f80a77f8f483d407e81ffa30fdd5f33913635e658709cf89a205178eaceb2021a758b7d67407e4d1b23bd1235a31c0c5a25b216578c0bed0723ac6920aab5612d6188039abba690a70f5c162476f639df006263386b0f8479e84ad54cbdd859e95d0cc7b3fcbb2f3f284ea18cdfedb49b8de20c979c7cb8e19e372a62e96ba1346a67ef20e19b3f67ccc46db825e4718dee820a7f878c95a09f08783a571b51bf4a946f46db351be19adc36da3b32ca615a26dfb9ff6a9b1e942e77d030f6ac6505c9e9e01b1827eea7e9d24c9861e3084e30bb5cf535fdbfe537005739d2eab0ec98f8f95b80d6772bb834d4061f26f54275c84696f3c40ea0468869495830ef2a7f9be376b3f89f052236bb1864d1ce31d12900396227729f0072cda7cdc56e8eab1f19a0f7cf1435932d2ad409bda8efa7937e398df98f7b3dc87c2d524c0fb4578aba05e99efdaddf499b4401c8f13a444ac437480540f3bfafe46fd01bc63cb0513b20b077935979335973cd1410f723aaf8e158cec3f3e34998fd9692a6aba185fee57dcf0624d9a0951bb06abb307c4bc922a73999b7dd3a6bbfb1a434ace7d4fbd98d3cd75d413a7cc40374b96808e4ca496ca4b71fdc14add94dc27c231ddd1c1dc46a4b393bf9299c2b0558801a48ee995b4d27e3f32fbb8d7184df393771b1c97596a7742a937d5bad10251231e72c10868827fe5c06d0e83854a9288389178917931f66bd6b97b4c1356b543023c43e21d12b1fd7b3f8654df8b1c8169a4ba4f17d8744ed80140c364d29504901b6917e74763d3940ad9f98bd755310259eab5d3f246e28bd2957621954ea8a8a885ea3e8c6e890084405d3c753bbfb145f7c2dd5a97cf81782414c48ce939e0237b18255c58a5572f9277317cc405ec2dda858a279e7cc344622fab01f42ee6e4d80965bd8752300344131be71b681f67d5dc6a536766c0c110095668f3235f7bc0d82293ac5893c22de7e133b1ab720d82d7c81783bed3c4a90d7f36d40e40673f26789ef070937e448b9bb0fdd06070cf051012b63fda675ee8926b528d048e69a984aea583382634ded694a775e9a2043616eb3e68c3ff6c2b03ff15ebf08842d0cbab753e65b2b7a9c1c3f29eb937ff199210c553e2d9c2504a33aba9be224af9fb39c2a9485df84ee6c588149c2a6275d24b2f16c31405af433c2ee67ccaa561e018093ef0bc63ae92c2150ac6cab8a8bf99ff0a3530479169053cdfb14fdead1abf190bf557cb898aa68c471504c3027e08068d5058ab0e0763f0e4cf050a1eb9e0c7ce084b4d3328cbd76cd6cdf663b5c088f4c09f08e06df076570235221cae32e5540be26aedbafb87f69349ad477aa3437141c7bed8943de1aae4774b360d469ddae33f2451ad598f09f5201fa2f40cf16f22a7ef5d61b8874a97f9d326582ab5cec5c099f7c198a7dd9f99080b27561e0fae61697f14f9c61ac4f651a914cd205b46d450dd559ea4155026e7e31c90db14e91d2ae75c16f05c02a1eca330a971a32b69d85e26d66b83221be6aec0ba83a48b85fff35509f6524773932b9f1d419ed843b0467b6d6bbb07ebdcf3cc1f40ee6888926f80c79e6dfbf42ed38eef5a0069a3fc5bcd86265edf0df16919ce976c9a8e0d49cbf531f919e575343a91592edbb21599450001a1aa75714f3dd578a0390c168e4ebecaa5bbb424037cbcb737935c6b27481fb8065a402238e3498a36b4d826b7ee11a1fa704b904f12a2211e7556c6add6fec0987f2700176aedc56b468e5c88fa7c07f64a208e280b3d1ade42a37512f6380f172d8d96b979a87ab8730888464b3f91d3d3b7f7d3c44161f8487258591c8bdbbc01fbba032994cb44992b7836bef07150010bb7eb161d037301544c6d9d7aecf4e5f89d3e11c0af56af0ab253a8a49713e0550990bb5ab2a34f022a63ce35f2f4af3447fd4aec95fbe3059a3a862bf1003e0dfc338625cb76a6ddaae50f7058f3dff79291e971e4b44d897f9cbb54f31309af78bab4ffb994c38b77aca33911b0cd8972a661ae6a546858408c34ac800e1d08fda5e9ec7115fa1de7992e8621feda9e3d640372be14b51ed7ef9a735a4e6f0446704f7dd76dd1ea5ff3b0bed4405bf21ee46c1bc09206f6fef19e98b68b3c3c8047a1964a969cc31bc00a0da66d24d64c195b88910698f0cdb8975cd003b06b89892eb13ea6d2617e165852a8c6a378a87a563f5aabec665c602c8d840cef81d76dc2ff67db224481a02c1c207150339c5c765975d491b9963de2a2ba5c4d30196003ee9edc5f813750610319e1a229655c13eb923b090f92dc6a06df98bd3d2022b70ecccd8654c7ea784450d624cbd622b042c632ca7fa1f21ff763df007ead5bc21f86fab97d8f32c23f22ec01c1d21dbbd3d41fe5dbb3c084967ca3c78e3b35fdedd4662ad6bdda6640121491ac7be480fd3c47f231b7b8e44bf00f10a8d5619e7c55881c413e8a9bff202f8d8409ce3e03d4af7ba7dd184616d1201e9be50e5b0424300a052e1f0fae7bbc9b64c5958ebfd273bfc6ce65c406332d000dfe5cd1069e21d3d9733097a88e5c07bccc7440a89e44aecc4fe2c2599ddee48dfb919f071ce893f89695fe8734b0eab308a619b30317bdb189e0bea19ede0f8affa0b1bce80b11774d88eb3dd24f651c11f003ca805e22a2aaa728b302d4f0c6454e38f1eb56c53697a253b1dfc6ecfec2b2a7c055f283679f16181e5dcf98cea671deebf05d46f41ae90961df6c0ff0cbc4ed49657f3f806db76980df7267386039b119499ccc70f8f49173678694fa5185f65e1846e3ff30d5e690465940302e7e02c3ef75e4b54f4a906e71fc95e8b5042ece9c2f2c52a2a66966115b65f7471e99340cdb008a731581935141a0c482451c5f41d482535b514a9dfd49b74fe8fad51554d8960e8d82e334f4d02c70b3a029341ba54ed0fec2eaaa9d9b00dd0a12ae04fbe2a256b017361b238a628b039fcfc759b9df0133842e811e4f61a8bbdb4b24d490114a10d60e2662b932829249b84d04040c08e2f96ae1da2f84cbe82c893c9fd65b23a1d2204f958e585c7bc2a20872f02f04e304072685711963404629229af12628deb09693970b076f278673c5b844ad31c2db25f8c7ada1d0a614749b6dc828183055fc077c2e60d417cc5f31b2c5df52cb54679acfab282645499df8c4e373182709c3b9ba9c9080848bb95d3f12d2a98b23a4550fe4fc4c59fa07969f14b1d76ea64f695c7d711f869137b87081bb7cad80f9224267c4748fa5c58c8332032bd8f948885f100acb97fbaf0b5ff5a79d7f45ae04613e79cbdddf1477d3218603d3bf4c7003c5124d200179f3a3501f44abc8c7a1b6ccecbb2ddacb96ee9d8c9085e0f3774c209fffbf8a10c0504384627a620afdaca50a65fc019babe020621a5f4da326d6a7caadf0e5e7642196f92ac0f9e28cbd482a6a3e65ea150867189639c27b72a71a444e42cda63e74e7294f9b7c094a1a783a640911832061142667cfd17516c04db6a196b1b76620f174e86c3a6b2218210750037011d1ae8dc6a6eaa61766c25b0803da5e37eaf11d4d34f2c5bdc85f9d5a57f1b795b93db41d28a72bc324adc762a080395a48bc5d8714dfa8722acfc7f61eac07c7265b3843366e854fe33d4e6c0141c08f2b733abb270bb7efa2c559bb90487169ab758136d663beea6c40362094d43f082f868636f30e8d2f2b6caf7309ed6e99107cef9f737b3575a54ceb0aef25b83093ccb97bbfd37b9110675ab311d445c500856970a8e2d8bff3c7bd457a98ca5e3b8bf7af6bc1ac67b4e69fd6c721693fdfa25a37df18bdaaa35da5b043277db02f774afbc6f0760d8652cea989b052a983ec6898baea8d1178751609cfa11c69a48cf0c94fc7f2db04b9a21014da034bbf963e60199ec5d7fd275f1044cc8c5c7075816b69f9fbf215bdfc3ffea436b8607a5c580849f74944d2610dcc9f6d84e4f2ec61c8f0df22267335ade8f1dcb49aff324436617e1252ad3f973490fbb3233171aad01dd12f960a0befbf190db27df4ec0a817553d9825f3eb1b91ffe4e7e8766f25e77c434d101df59b8a499ef777ea6043aa3a11d8c779e2d272ca671592b0da73bcdab2c143129ab28eac1633166aba2cd4752b54c9782ed102aed5a255e694a512217d788b47ce0280af64bf061ca14cc8abc4367277880755057efe07f60c28584c93ccec30706486f7466a03ef2b87075bb16ef60e0268ff851b71217d6726282de467ef490069279c674b46b101de06d8d346746cfd651cb06b29a4fe3a0f3aaf447ca2c417f997202efebab84444bf649fe8d3e25f5b0c9b3b8fb4126bcfd9527c904d17145174b54e03785d519c82b16a21421570503fd61d5435517f19f3a56ce12cf231c12c4993184c11063eb72949f109bb72216746295e43c68dc89e305add7c8ea5ba708fd47f513196453f91b198b95da1f468f6a295adad5c377c79c17082868313589f4e924d81efca9e7303b3fc12f17fa025f59ea7291b5be661e5a3d0ebd1c4d231288e26144bb731cd0a7317c52944625c3e47bce219647347ea15a323620078937e3bea54463160ee2af0004ebe51e6e2e03cb9bde9fc2babd1039df2fe0ee72ad40ae6b26d09407a3c6b9119f949321280e845aac34eb80f4d3c3a40eaee9e51c3a1d60dc81c0e4196022325742702745f8c983da86ceff5845743c285e2f741ca4b7ac0ac47c358264d60edb246aab593f319a382d2c1da51d53530f3807d868a2dc3bbe3a73a2a5142fb7f1b2b4ac25b9965bd76479baec1bf1420722f44ea31283e1ff4266cb06e2d037f48801949e58c43252e94e3dd52c5ae01795e0797aea53ffe1b4f3a7f2e80c21847915d342ddbc3439e890c44529d01b7de5a9c2e3e4b5e9fd233113c96fd9320207d9d3c14b50b89cfb49fbe5293eeed048b90eccdc6cd0155b51f58532072c98ee69e795ee0f11f0ee62dfea9f692aefe4c7e4e427ee8fe107e7bc110a6f27bb1c4dd78bbcd5145fd63017ce3b618ebf7b38cfb89067d63e5393afff7ee21621cf1649165594faf0829f47da43e97a3c0ff22f41b9afd0334eaf5bf6cf7fb3ef299b6fd07293359b9045cfa8999d11f514cabe02d4be04a786334caac3c687c4699365399841375dc1412a85403e9107384106a9e67fca12c3b876b5240861c507f64982806094e72a6aa274de267055c6cd02203594637d257b4c2c97acf2c8b0bc23a28934ab2f86a1de567bc18b8a60f262e5bbe8801324c3f8f4df1ab76f0b7ff1a36f56141131a17984158f15c74d554bfaf1375efb77fa185a8c627248d7865523f7f76ee58bb03509b042882ffb6ef81c0db29bec1864f9a48275d8d123e573f628baf23304d5206c810be245d6f8169c6757fc796ddf6c133e554779751a66af02fd223f06638cdd8277415c04c9050b5c0b0c4f6039fde854313c92a43a5752316ac1b26dd2a729aabf61ad7c5d222b476dbd2afaaa92482fee432a4a4ac71b7e020386a52a05cc9c24eec58c22434901b688c301651fb9657faa17f104fd930c60b5378db6a4c4f3b9af3399929a04d5d3dc92ad59c6f888ca427bbc4ba4e8e8f32a83d837e019917f1e3860202125eac72961097730798f8f2ac59cc41f7e39c031173477f5cd64036d9d855a24691a769d11b1064259e2f152dc9d99226828f1fa142e14cf38bdc5a60b7c1b4413f61ccb2b8b4a1e545c71ffd160ea2c07371628427ddbb71580f19f43ac0070cf6c2b28eb483cb16d7aa9a30ef0b6e6198cb9e7b078fca624b63347f033f0166eefe4eb0636fc76c03eca272812ec412e11448716b02e582e51e433452b8e8d1b1248aa68340b5437b9f12c39a88fec0ff18f4d991e7af4d585571d446925dc86f57d95504240e93ef11d018cfc59badf5d9f299c29faefcdd17fe1bbac8ab3a4bb8bf37cd0d945882a86fadcb5cc6be69916d50eb0a96cfc70ac3f0c47e178bea72a88dd6491ea196a4c793ded130b3ec29fc68cefa359a170395fb1040fe1149a768b4bcc36e919ed1631bb12630ef8fe9b45b9aefead5a389867d8c206f343de93b811556e8cb748a373eac1a59c8f42263c80ed9e0136c260c2815e831c284e211f905f9a784718cd93536c8dc011c2100c183bd01fa46a6367b5ee456a609f0364ab4db376483ddca23ef942ed90de838f19ad2e082e8051174b108ce4f1ed07a9a94578dca6698573c99578ef8b1d0f054b2488617aad0e0033da47bcb6c7d911c86580754c0928217e53b01409abbfae1cfbbeea5346ee9930d461e00a399c52c6691baa4d8bd440664e9429469c00e81d895c74b8c5b26f1bb47c18943fd07dbf82a0897ebb5dd2752ba17f5f5ded0faf0218990321940aa9c26cac41301208a1b4e1bc71a89faf9be755d43cdb442c059defc72881e737c5f07fb4584ae57632540e3d6e754ad8374c328607178aadc9d08e97fc8d3116b28fee2deb4cc12e95d6e83c2c0723306ccee2fa7e7c51e40865e4109e2f641713e99ea8ea0f60bfffed0298064ddff4c3714633e36f4e79a8047c4745392141ea0f7807589ca5d173933f7644509041a3ca11e976fc81e1d9cf4c0fbd58144e0f5ea0b4b019468036dc021a5e38965c78432c85d0e71c3cb13dd91202a37ce7deee31221820b32c227abab0de15c6896e77b93cfe5d014df91b9d9e3cce93c9d37465f62c58ed0cbb420eb3a6a3899c9bfb9cdaf5126dfb917c46a4dbb8d172bc53ed0863072055ef0eeaf0c50e4f2096bad9dca9555a74c6e1ae7360a03f9346040477949b90d1ed0f04281cd68026a3afc9afcd18714f9716d18e8667e6ee8f6c758e322282d269a43c3eb2282d0383683e3a2030b01f4fc49897e011ff872e98e579a25c837000345b67cc718ce89b8b03ca1e6e4419fb1cc5e5227081b5c239ca7836914419e61e0959cece7916e964e236f6d435a973b0b986bdd5870970a39efe7226ecb4323d5bded96947281852052907660e9c5cfc29143d055a4acf60d3c0647063c83fa6037b373d2931994cfc5789af9e3495e0d28f7496293c77ec436184ada9f9c8d00195c056c4eb168928ecd056256b44f6e522d0698256eecb9516e21aeba6cbe955549fcf2c039c2dd701c4c71bc22f7a28655dc44c281adb3c448c02642f54ad53b23fd495a43e00e38f24c522a962a89fd99913158efb3c3b936f919d2bd300072bccf7186e51e9ac99b8fc309bfea06b5e41bb72838004621778c5b82dad329003e908febc88406883633c525fc3373faabd18f3198a2e060d25c9558cb20d8cc4863970a84f0a7dee85b2d99a0b585d00c357f4375bdfb6d83760b8a930546d169c89d81763ec2f5b24eaa751a228c2a3069e2dcf6e36d07fa6b0b837e139f84fee421eb1f0bdbc18408a118bc0643e1d3169a23777678c692ce45ced73aa56e9d02df3140d8ba4fadddcbb0d68772452b8be93c6d8630b494dd5f367891802c81b36d0159fae0f44fbe6e9c5f1a7d7005da1710e71e77327f217da96ad2f98b714105b4ad7461b91a4c0fff0769bab2bdba5de961934869a1058c61a4a3004017c22f5bed483e44b7a353c9baa75a86aee5e92059feb4b4e363008c850bbc3a693a439169bee89360fe5da22f4eeffe37e6c7d7072376910d3a9186cf90afc305e2fe1117ca37f3d0ec886d3118500fa6905158104390ca291f94cd4a760422b1197e12f5512722a5110da7161a918902aa8fc26c431f1e6076c1a69ec6186318626807b0506b648265320db126a15ace47c3d3531714c1beff6c9410b59bf2006fd67ad6c8fa27bb5defc5b6b784e095ab8a9488ab8ed04ac2ac0e2a56d18ea5b072f43b3bbefad7b5062bb59283581e3981e1b71b49ce45d3b095a42e8eff102be4d63398e89c895f239d2ee5b071e2b68db5bc27f9c57f9ea90ea682998046a2ca88f8fcd7cb1cdbe1314b1bed919047a52cdd02db455fab6e6da65b2185babb42517b2c7d547a8c1d9f2d065316ea97d48412c1bf68a8eb8aa15b1140a5f1c8a3651467d395fb60b1df1d42f2b4037c81ceeba1078d2c181568616c6e515d31fde1e36aab0fa9c5f32e5c640a9d9c103180753b47489444acb7a51e39890b4c5e6f5a81b286b7f94dac23252ab76ff10ade9b039c8a2a88953d8b11d86d632b89969e4eda52bda2448d6f9c75a7af694565774cb41655a5bba0445992e4ccf9acebfbc7c5580580d92cbb9078843ccc3c0e57b63b245fc52975cc62866470d6031a7d271afd7b674c3b7b22eadfbc29851c5e24b898dd62e7714678f2a90ede34a5828b00dfe129097b9be3dca2277375b9e3e7863c78704100ef7c8043132c2cf83a8438dd5ead728b40788a685a1da8bfb7e572e4a146ee02627577dd6126f1a8f5c0ae0b003e59cf14e59cc57138bb8830d4d6220d55a5ee94c3beb924cf084f24acd7ab2976b3bafb8c29c0929ed6573abe00fb000aec14c068c32daa223b0ca470f485b8997c6b5b22c95bc6ee155475cdd5f607e9917f0697290f02283c594b8de97a81a8e3f15946e441109338c6f6cd01748fe18c3750f6d5437006515f57afbf8593734d00e098fe259e55d21ad1cd81259f94bf2225c5619631e1e70f00da10bc231e735b7bb815665d52326ee4fbe2d5423cc1e3da8d60673154e11ec9cb7180cd792a56ca118a743099204c8fd42645d4b2c6c1c911b36c145020549b9c3ff84f0ae00f5f80ef2d53bfbeba46456309fa53366ed4bf1a3f1b8fb2839fb5b4bdbbae617fde966da809a8bacdc2f4f2857aabd62a574e9c0754842836f0ecb6839444ff216f4c1a4596185e83fecae573a27dd5132f6c7a385354e02e857dd405a8ca1d0f365a11993d40553a202749613abe419988d1116210271cef412b6a3580d94ec393f76e4d63b82af2c639a47b822313f50c03baabd8bde125f77fea1a980ea66324363964525a31d50411731adce5db61b62cbdd897e9dc41f1c200da728c4202a746560a4a8a5b1f2fa245e9c0e2a7217ab29387d65a2597228bd1f8870232f2f73897581af30e8fbe658b4ae18f65d0ed362a56a523f441da0cf50f9e5e224141e91842b7b39c18718e8d5fc62616d1bcd43df5153da19023a19a11738b58f319ae7d4bc90a941ddad9947f3562a0333097479381e50aa9f652833ed98fb4f001ca873c56a4c40feca51139e1df680301bc94a7d061dbb74817863e7ce783473e4622f0a6002e985ca0f0322fac933a4bda5d4af1a38b0ffc0dc26a18098e62dbc59dac124bd461b06c491c07c221bc91e37c0dfb73c30bd154c0eb45902f3f217054087de0c17a84bc40d3f81d6db526d75ac7240c77a2ea2847d070b416cb924a88b88740499c06adeb7e65f123de5925dbdc4330e6eb6bad55989aacadbcb0bc6fa862ba15778c49b12403818da18a42935d143d35d6ff31cebc384d871585965441e337de5815e49e4e52774f52e63aa9de7e2505825459b54d46e64a2eef9c6a1d1d67f7c302be67c5f31ec8aea4b5a7ddd73fa903dea9c299b2d0a823602c29b3460958930cf069df0c9c2b6c49664c28afca2ecc5459c07744a09dc9d0199483fdd8d1929c394eadd495e8ed5f98e7058c97e8fb6c4d7fb95f463027315153fb97e83d77f3cd52427ce39e486b9d3854bcab0392e8af1e0de054f36bce350ef76fd602642211f9c63814924711681b9c5b5ce05193e03a2e83992e742fe00f11d8b8e099947eb556db6d16ae15ee4353a6e43f7cbe84732f32f70f98022d13b981a5f11fbc8ae381ecf93f621cf4bb2a8a43ed4ec97c1a96fa66833faa737d569d0c35004bab241cf19c2f7f4586286b71773b3f285ca709b4b82bfdf3d626c577bf442052d8023f5d14f97aae087bcb01136533ab4b201319ddfe86af1f4903857eaa933e7c870fca83e0e36a91fc87531106d0a402b240a234e22ad3f9d197571c4cbca5d71c6864f22a59b37f0d2e9098575178c48f8623654b34a88643501864f4464460ff3946f25e7b0b24e3861be85cc761eb98a9893c234bace50c98ce435a044e0d5e15ff841596483e20d2f53dc6c47f99a369af912b529aff80000838a1818d063177df04ec548ab039f76b45ab53aec9fda0dcab163d681ac22e8ba30770c05cd5aacd7403a5bb8461ab2d5590041028810ecefe2832cf1db6698711a84e425e9d5697ef7658d9d5424c8342ebdf7dad0bc1abbc0cd430bc92ebae0aa8312254cd8c455fe553f531f3f797a3842486651f86e91867c64d5883e79c9d0a09bee6a17751680c7c747d5282803314726f6e3c81497dd95480caa395c5ec5aa105ecd8c09e567df86703a030bb2531e724cc3a3e3fe63f9872477b4df6a062f50eb7d81ff156d3094faec0a1aff361cdacae9784de3fa7645026c48b8d4b5d8525ec3b63e9f40debfae9bf1824439886105fccd77d00cd987bac032b20dba947dbc3f902950b920ee64353cb917e7b065e9d75176bde0da76db3916168cd48d8112e4581d84c3a047dd1955ded90a082288323f7be4ab85526d7c9755354bed0b4a3f11ef3767e97d2e8d4592598ca7707875366bc96c0597500c984b8b8189bc51128a3a3d3c98b65e08a1a710fd404bf00879339bbc6b1bd4beaa6c27cddb9ae6b485c7955c181451bb2468277d79d7067bb08875277fb6f9aa0dae0d7f1d3c7346754aa39e99eb5a8171e45378a204755b2f4022651eaded3ce77c1d87cd860fd6dcf5399143db784a6ba4fb270f24297c3facc60ae0e5015120334d63549547710638edc776caaf82fc2a5301a020264de4270475fae47045aefd4c3c3d69d83939d62909d5e246d5018c9bc39f5be6a9862ac6a2936c0fb0106213b88a8e37750deedf9e30057e9a202ed17c3ee75b7f12818019cdbfa46e08d7ddc02b66819b5b03d5061b328be2223ea1477e2a7cbc13aa97a880c08ec3bd0e289e7839571d15457a5e9b7f1a2138891455127bd7fd318132ae69a312161d91370d3eea1be78453763da3cdf4fec1de4d56783fa32084e4745738a3e045a230cb2fdfee0f936338c824d0a5f338eab5e203c7edffc7838617f08d7326200284eaac1b6ac8bd1f7cace10553a10d4540088e372b4729c831d257698f8ea3eb086c89364aa72de6b656c718756fa9f6ad72634853a218a463786fe90ef73c7253d294c959c3e076fa31af21a1e8546c3738171efab500a8f0ff71891ae29384670c92c46d1657d3232ed729d0ddfc31acd527458d93ee251ff8bb30b53e416c8d1a5be6c0db743f9214a54c5cc9521b46f42c3c7e083d37a614317a0bc30fe65af8ec512297254d786403b7bce160cd0230cb29a0a0f0239f9fc536606867c3be22957d0781cec58036bd6d67c4f3c2cb014de59341641f63512218cc686109f885457621e48f12e743e00431b454c4c4e83c32ea2eb9bbef4fb5af17ca459b608715dbaeac71f4a35487167703bcfb5aad6a3a0cd25676062773fe633fc6996ca9a51880807d8323c2b640546b3f08ad8080e9b8676b9b07b7d2cfc3376eb4be48faa1afd098d4a51970be06abc9215675c9db0510f8e3aadd664cdfe3e58616bf04266e2a2d0314af87d429a3c86754d497a6f5cd80498f966f919831f34ec91a0b79f162ffeb3d8d1b40bf12e7d18e2e9743578ac997b259765a7ec766ddb264ba8d023637e918d56e79a4cbd5fd7e6f7a06cc7df785ebee879e84798ed80b0747d069bcdb69ef753ee3d6382fa79434150442c5c290b533364be36e80b4370f77214db09cf92e5f175127e627b3a48fb74d1102559a95e9ca8db1666ade2a4b3310c77ed384e45b1efb3a9cb069e73bba9e105f1eac688b08c865425b24106cfef769e102a7583270258ca4a6d9c37539d555126d57c6b3957967072b945ece8c170b73b72bc2ba62f3fcd1840662f14913c880b9328df1bfc2450a3412a6bfa523485e79ee339a1f41304fcba5c28730309d0dd13714457c6681e02d3b14e7d9c82013b1ed4029597ed3371d9090c27c945c20c73717a55056c26032d7335b3fb8b4dc1abaa5d96ce4e97b8fe2c2b82242331fb670e749d9b06ac155e4d625a32ffe55ec9fb9242cea22478723c4d8d8b55fc4f98c7e70d811443f1f4386f7d73211c80483ac52c87f15da969d5d8f7121251ae2346ace3391ea0f6a10182a65edc508f592fd92fa14acf7cc916414b0ca0a9ab1aa2740809a309ff36afba61579524e75439b180d7e5ba9bd6073c2b1a1e80a3f0dc34bca29adceaae35925bb44a33013966b3137817fd0559d92f6f0832f430a590b7ee0b6de03669399acb9ea9662109530bd65381dc5cba8bd6b2c254a4e63e20c1d0756d2de26442660c89c6d06da922dfa80cbe27f5801d69cf97f26071a69bac5efdfed44258199829ce3b4fcbba172994484fa2b62817e4c5ba962cba11b54a71469e019a9f87d692080158c6fef8f83d622538acf51f5a5fbc1d42c3984ad2dbcb2e3fa3ce8ad887bc12b53e232b70fbe10f98a8f6e115cb583afe340a5ddbbabee306ccffe4af1807dca9238de02ed3b4a9efe9bc155be9c7ee0701550a369ede4eb18c5be485fb6fbdd3f344471664a2f6451579b5f326a0e7815c8c7f7eee8aa2834e4e9f889587e24e04a447062541cd0b6569debd82db0760b540428024f074cc7fbe55a4f68d07a5a613ebfa9ceb374962a8605f441500b48a0b48dfd5d7d1b59dcdc09775f2d739c300e3f3fde2765a6f38c2974c483880380fff9f7adf23105e74b7759ca8c4fa1a4040a9602c813810ce744209d79f064a97a2aef14ced083e653b7ae2b52fce2d037b89f3477d728d8ebd4424476a28fbc3266c53f9a9ffcb7b0ecc895aed137a51c7de909836a89e52ffced2b8a5cb9d1b7034d1aee9b92082ba65e9eddf938f031c6f85f43879d7506865f6a5ab2b93a2bca16acc572da39ee7c9c288d37cd69ae38b2791551136763ff06b6abb6e388035267a322abd643cb79839ac5043433045c114f049ccead1aa1094c7d1f87ae12d2957a7e97bb689280222b7462a33e587453313d70a68a9f39c9d2be907ebb852b1095bdf3313b25133686d79f97664e3022222f6a20c531a30cc83ee5881ef69262c96f910daa0389a7c694bdc0d22cf70b369ceb2a270348cc8ba56515e101bfa715de70119fd383633bbc5858a8f7b87a00c5a3017746313dc7f8b284e9779b93e748da9607401d5d06cd5da9ab2548fe33a3890a59c91bd003cf7480821b3def15578741bc30ce541eb4e02244e3aaff013a8ecca6630661bb0cffc44561517daf449d38843e127d7080c2bd7a367dadd6e8cf85221beea45e3869b045c6bc9516b09c58521ba0fb1f151fb80a0771b1ce35e49640dfccc04ff7429ad83aef9a6e9a4a50e75c20d8869474a1e4a93ee1c9ba1e476f149a4ba94c73f11c7f85b66f3a931bbb481a2231c55eb1d032b5b110250b64c5658855e5e2ca08315e335165446ce95b8fd31bb58bc58bcb8b428423c1c8dc5dd116ab1cf0c1e981f0f22489689c4bd8ad247ea124cbaf2c4a2c63a9909d5b313f804862c0bf08b2f1b17a4012bc7a6b8f776e4ca15b4f03d4b2b163b241573aa02e4279544af384fe9f475dc9a2d01e088d12fbf19242b16700c2ce435db12518af3c0f28b235bdd23975b2f4da44cb52048663310bfefacb42bf95d2c0f90f1c6cdbdbcaee7610887381deb6098955daa4a7e9c0063e01dcac0bf6fcff946c64a0cfa40c040706a0ccc00b2cb086c0fe80ec03004a16bea8a225196a139013e31ee30e7ff8929007492b630122c760c3278e8c1f33ef95f93f93ffcd87b65e54ccee2247c7d05d1de56d13f4d7db7ea2bf3d31c3eea76f920e4a95d8026ad67ff540e0efe641abfbe9d37d07b3be539eb22bfe3eb6021ce9d6cf8cd1d026eb0e41fc175255e712996f35d4fc756a75cbf09fb90d72366a944fd320803e23948ee537894e62f74f82c1fd70cbe7e426f00b45e7ab3b453a478107c8eb8d2aafd059ec08b1d8e6750be45b930c1299859914a3896d6c86dec42eb61250b4e7c136ebbb3c9eeb6b41fa3417dde03030a456e8ffa5df051ba27ddd8ffa48e0a014c9de0ca3a826f97e6f2b7bbdaeaa0fd4a0620264afd2d803ab25fbc4a0c1170dd5132d40eed356e1ae65fa24bc905e12072ab372411bdde5417487280c60d0be723bcb14be95d24bb33718ac89622429d8c542580c6884bd5aa023c1e3c3eb40fbc00b0c05a0fca3ddb3637f30585751ec7e24199d3f4e727e26bd4593cf8a5d1bbd557fe92d59784d28d7d5eec8d6825982deafb69f344792281ac490641b6d86c0be26a31b14b8e0dc7189b54850da83c3500cfdc2e1bff09dcb221cc6518b5afc8cccf8584baaf710166e1f210664b9a0aaa01e23b164e18739ad843f89f11aa34b0de15cfc37fea819530cece67847cdf09dc14c9b104c5f527ba0e5c70779f445a18c61cd310d34740faa7e470d5b3e422f2af0124b822ce729f5d769f0d41da100cc9e84f0df38eb40666e18e9899deee2fe406317ed8330a315d77e64978d5dc25330fbd815b9195590afd89170b6b053a6ecf6a75cdf0074168e99c42c5b634d0a849ad63ba9619c35b5fe8c9151ebe89720b30ae57e622a0b40d37345f9b67fcf3ca8887139fb75f5a08f93e924d2c21e99eb400803f59f2ee1d63ca9f77f0bb5ffbbe825a831865221a7b3fd67e57c5431c2162355b71ed9becbecdfb1389112024b6b04b18b8e24367ad28342567b48facb2ceb6673573a8cb509611e68a478ffc4de38005e9b72f4a3a8f11da7c966e80372f8c78442ce2246e76b62fa60413455f271a78a13ef66bb94ece4fe6a4e2c3a7543b1ce2f73e5be1e730152c32c007137821e021af9ae449081b5cdd53ad4b0be11cf58652a3c0bdbe0717599886b1c9e2f64c271f7442e2e96197120accc12db0c30812ea7162d4b72eb0193b180ffe63a18928abee38d96a128e0980ed70456b9d1ba010a287606ba1a832ee4a6839ad2b8b7716b4ef191a3895328bba30c9ab7faaa75b06fc15aac2ff200331e62eafc2d500abe856438c329aeda1a9bade5944ffdd411e724ae148854e01f514c8f509e776bc9fbd5521f09d19d98ea73a9d644c5ca3f0dfed5b274e4f318f12ccc7947d28827a6a30ff8a41bd1a8103f9470a6c4f0b3db4fba36f4249e96b340f8a1d62214d219ccb310df48ef28b55c95365cc0316549c9801af1aadc38b1a7ffa6e9bd575a4138b0e54017e99d0ac9f1bd4aee57e05c55fa109d8c3379c07ab529ef3d253de6ead705454d198c75d8b25bda2fbdb36352b42c1d80f658f99316078f10912050616ae662e60c5f4229702a88aa4a82fa67e6cb4593b0a8c6f2869cd6c5e8c5242e38cf015f4b5bc8d71fb63663170c7481e8760e38dc86638952e64081013546ee7689321898ac1eae78556f08c6d7b3ee0c107c312f302d32605b0482d9e1a182c176b6fdd7990d0c046778f75b0ae26b65f5d744b503eca44e406fd0f68f8c577a117ef410b222f70a93cd840feb356c590d74e207b76408edaac5858e4bb0f6e2593e2bcdb9e4cfd6416a618019e226a5fbaa3a13b6a433962c5b5cdb160705ccd4a4654361509b9d2358348161edc11c3a82551cd9eff1136719555c8b921bf2aaa3e1f9d65c60cf14adf2c93cf5a2fa8d467769fbe512ddbc5422e8b41245039b99563e6a94ee95aca4a9b73b31914c7d8b9a83864dbae38ce5f4232e5bf0da49a99755aadc7252887389265d42aedadcf6c68e7ac50642f3b16882b2f061122985f1fc814c5d13ae95babb12afcc9bafb187ea1ab26d114e941c9d40e978867a7588ca6cad95bb8a667b82ac52eb86ad25836d01820cb336bd8c9cb6a34baccca0d5a7ed6ff38be02a91cc227b692b4af286486bacc008e49cc98981b82b6bd498e0ae8221154c5d7ad684415b822ba957ddedcc1e8d3887a091249d454781f39d8074f81561a026c0015d634d98649c9dc8e31ac7b3a6e4bf7ffe9d16d83983f1c76ad44c8a297aeb3763b1109759c03cbb054181887d6656fc23abc9a213f8dd6e6ba660068e879747d3bc313543682a44930b365b6d7566328489d94ed5f5c28d278315dc1f33ae72d7b90aceedd51156bb316af8070796f486a64501a801410905a96ff5235cd0fa4f13e182b20f100145eb16317ee4021f1909af00e418c98aa1fc093a35b5c19d6adad8b84d204347b72efa2cf50e4e57b973954a2b0ee35a576c8d4576b9cb3109f3fa1d3f9b15008ac16d301cd86c2fed81b1adbbb179b632895dc4b48df15863bd8f00a3679ba79c37e64e48053dcaccaaf9b2735789e8e5578c654611a2065b6f0cfa9430a7ad6d09cc25b15afb66645fd70e47c97a999d43f4434b5ae604088a9500fcc0a6660a193d8170dc9ad12b1d01dce5c415f95eef6e5f96e9c7f0233899c11fde9d24e376543d0d84c108e5979e54d68b004d8e1812ba54454e7bb7df33b97f25c99f4769dc84f61f24a92fdf32c0359e03239bda688671834058af0b50a01ba74c0b9694b4806a6f72b75e1e731398acbd040786d9b872357712d372305ca8e84f70a86724ad19ca34b1e4e78907a6bd417da779e2fdec393bc29f8ecd6a11923ab6f1b8ce6c68f133efb1a00f1ed90ee1cd1ff2bef61b551d52b12aa7670237c386663e9157ac42acbfc5f66fb451ea0a842c39ba4002260a3346a0f2d2f1b3302ad6c2d82b2f8ef386af50d86047b90204f8ae9dad3050cf1a5807d2c052ea4cf149bd56b7d4ae13204990c2e5e8cd836d7555bbf12c4543c8f9704ff57197d7381090e2acf58a38bd26c22ada290a8bd9c94f9092269d1dc0c1a149d20d89d2b527855a83ae8162d0a6d41a1bc9f58031e8c65bd06343988aa298ff162cc0c4a5bd1a969e73230b11792d7711b55964ad9a257c7c38b0db69dd54e75eb5e791dfd5b63a4cbdcdbb16b0f1bd5f9cb226a5513578f18a35c6fd36a50e6ca588b014e85aca019762bc04616a300e3cb49782c2ab8d1071e3c85fc90151a131e76a17946eaf8b35d5ebf5536fd38ce4f61262e1f8cedf68660b9fa08ff308860eb892aaaece09610dc363c698f46d18540f16a79f587a0d985006d850f96ab9262bb4e51aec318bded7c69e65fba6319a302cba4891a2b64bccf0623db2267b280c2f2c51886cc391fc78b14cdbe8804ba380f51898ae0d3b9426e6b9044598d9ef258d616dea84bb14fa98076571a4b486cbf79f4b6c8c40a9d8e19a3c78b2f675214eaf5800cd8d097df422ae94b54530b82bc8b6fabad4d068f1b9efcd68fe646b271911e8167320242581616cced1e35ca27bea2a3e3077aa31ddac879d3e23cfc8f2442a8230382bacccb83205cc419da3e7db90023a18c8af2604b30016602151ffdecc7dda710d2975c343efcc15f6ec7b9a392cb47b9de97c18b339ac548a132d21b304b89149de836373c1fe841409e03e291c0936c5738b30f517f08765013a44833f0b8bee44730ce85ec88b29658421845473d44db87e347aa87733d0e855277d318252f52ca4b75c7472eded9a3ba83b761b3c8067f0cf51e86a9a38961c397ba2475d866e50bc64a3397806383f284a5f68d3742cd14c6b49a4043eee3e2a728ea080ed724be8f9d1ee489a5767bce792003057e64a70d94fdd694c2776f513a2f04b8a3bdf6fef8b589550e0cf242da479a7f257bb8aee6b7e9767d4622d476035f57134ab3ef36d5ac635875f3b4391544897b413167d9756654fbce9b40b2f2108432757ec59028bbab4ab55078977523b883f2caadf8c8650b4e997558d9488330324f8ce3878d895505ae19506f52d67408274224c94d0fcf4a6fa7dbfe698417e5e324324318f293c012848f68d6b88bea4fa112bc7745bde1a2ba3ac5df81f557e61ca9217d266b4a09304cfa449179f808ad73fcfcc13925429d24dd4a677baa64b0b5dd4dda2bdcf07dc4f6929fc4eaa36da0b30cff7cf1adee56bd4790ac737e73d3d6ad4d9f6000449e265568b13cab11f0d7fa057cb60352c2f00c560a094bad4d74f564eaea39cab8a7ad353ef6e7d9d4e68a059def1f34158a1edbb0d49225a62910cf487e527d56d17cf1d058f83e57afc6f99b23f3aa31e1d5331c7b44e7d6c8084b3678f5dbe7451f2c0fe1d66e714a6c052013ce7ce2dd6aeaa600822b3a97dc64fc839c70b3c9bb6ee71aa5aba1d58a74329779973f161faea8f96bd801b605b92110610f32101564513b684458861db5d0f555d2bd74e5615050d4211bbc98b199fe03ff1412438c9a10517fe389703e263cef893aa3945df44eccbbf8cc61ec106fbb45c0e412ff8fb12855031ecde7ea37df17e08b80383cec442a47f05581511ecf74d532aa435107a43dbeb7338bd7ec0b7a5d54b5df033677bc3b9782967ad92d5def25c4e12bc0738b88e8fa3fc22ba4786a753b40d52de1894335d2dd6840b81ce73411958431b23d46196e089b61b35ac1c2da11c963d00effb40548dd584fb52833ae04cc9abba55ce57b417fac09717ed1a631e2d31190ced333396ca42247540c8a9a9566acb49d6cb4ea4816b1965a47d9be678b6a21c0418f08e41764d726346987d38de9168bbdd7f474b33a7c435f80f7b4706d38d857929e60572d6a342b42f5785915340d5422a0adad2382111e31c859a20a902cbb78df39a1d565fad28dc8dff815c66befb87821e32c0d5cf5a8b9e9be11970409bc3d88ba1137037119d0138a0342e7debb616700cb9c2f1effdca2bf9952fad8a0c51167512b265465d7222518bf6afccdffe6bce325b949f1bdf9e25ae7c468bf509b376d26093bc91cdc9be333ae0ee1e35550b05288fc120dfc824264420cc09d776272da7265ddc6f27f41714917a3c2079317e5d766643c6dc8e8950e0f9368487ec5941f386cd6777ddcec01c8aa4481a854c14469a87aa2cdfeedbf6f72f2e66ef058b7f971709c579d8aa5836750a3a7a682ef9cab147e4fa644e5efac93750e8143ceb5be67a799a65098e599d4ef11cbd7a6789e20480293000aab1d3688000faef06d08e960ac5a6af7c80fe6660239e090dcdd2271c07815a437740548437129bd58645a91275b6c07135ede303e34ec89b37db66ebb92070392e289122aa44ef04446332946a7487e34f6a64aa83084b65bc617d0bcc056c0cd27ecc0142cb7df928b93c592c6497be4fd9603c2d4f682b194125e0d4c9846d3004716d834bc50039ffa86ffa037872b22032d6ad1a3ede6c7542e8479839e0db2af0189eef417a79692afd029371d3c69848d91e5c56c6ded127c760350cbb4b8e41da376c93d153f785e27e0dd2169c703e4390c4d1afa99b8e62882cbbf642d752891b541a54e4bc86518721242aefe88446b541b79a7184de9c95d90c5b8e0d977dea0aec6a02665adc3785e6d7750284d39a1e2dbb46572ce26e60fe71161cdbe8a48bfc78059145dd9af82db84d4da50a256cb6e2f9a88863606d2f78bb7f0f7fe94b01bb4940484ac5e75eb98c6803c7fbb94a0f590be34201da7ba2bdabce8389e7863c3ee68f401ce4ab086bdc575983d793717150c9c7d36d7896e8073d2673fb6da80c4df60eb22e38cabd21bd831bf3ee38bc72f26f2786c9906003ed54864d586442a0e8290981168a2d380a021e776a46068a2a7e1298c1c89cfd6c1daebb5c10548d15b9061ac28dab08b21ff1080ab3ddc46210bab933682191279e4365444f26ff1504fde7c96dbd47004c360b17b8ce68f5889c997ae76f55bcdba1b3474105efdbb1e15fb352153e70d2725268142a6e4c0beb6fcc929719a8f0308e5653a1c101e5c04f2de426313991e9180e3ecf27cea6117bb901f53645d55ed11d7ab805b040635346ee4245923bf7b7a15b9795117d9b20ea01913835a83943e9969d18176b182a2ceb057c03666de4091afc91f09c0a41a5fa4d46b05ce29aa4be7209d340aafba221753bae41995136b6e74b28dc11a2cf78835646d01df2623e3210552615030a29f47d254b95e5e806e38f670beb9adbb7053da6b29a92dd24a7211a6ad02a683d6a29f53d3d838a161d101293d1d922ecf11237ce24e06d247e5f14d936309a142c948918c487258f38e49cc9540726312d4e1fe3040d809028d747b03b1e801956fc569a6e997b40cc38e66503416c130a6c32ac93204ff65f45e60efa565ca40325530849d756022ab833a2f462066f60eaa749454059bf85ffd13f96bd660237371700fcf22f67b8cd073c6e1f3af5815b148c2142b7f6cc0412aaa8e128158d4790ef11d1704b70f278d99b897c6186f45012f3672a8560883ca11a03796939069fca336a33e50cf8a2161c9ac4d6c25a5f6f0e3eae9efb83f83b99ac750bffd5963058d4b5363dec3c8902eb32287d658bef674385641ff3e7fac6f15359f11807d720f191a5191d0a4ceb220d079fd8cf4ba7491c56ecdc41f3fa97a414b3a7e028ad158a2e35338202eb29702e277ea65eeeaf71bf43faaf78ee9ef4f418b9a72309bb75423078e0f489241999eed990194ff9bfe92be243688297f96f39b0855c389885751666d72da7362eb594d8fd20a79d07fb92ba54e23b35f7133beee5e1d3c29ec241e479fc48eb33c06c12ca35d9d2ef37a0106b7d62c77e85fb90ff0f9926398851f42e418966fc2ebabb087c679fd36e947a9291798712eacf8007326188285a562beaa961ed8b2e0d3b85daedaf239131a50986ee33eb9adc5657cf72e50af5a7eb2183f494b12f419a65c996ebca936c544017b2a0668297fe4350a295da9c5cc2b3e5061a2e4f01976f22135fd8dba6bde48693d98aa6634cad0fca731bf56a70582507900c969e4595251c8f9cf10c57885be955d44f0898713bab94365e824120c1a1b0369cbf60c98e43e195b5ab86e2841106bbbb3af4645345bb2830b45fb89f7ef1f7ae3d02b3440dbb4377b81e6b00b8a0ad016a7e30874dc2fe77bd1be28e70a572caaea1bb9ee2ff842d7d8adec9812266b0e635b3717229f0549c968098c520148e2d643d6ebaf9efab5ef94aea891d431bf0e08cff557096a5fbc323cf7ca81fe81d41e3d75f09ddcdaac3920736664f7d24e80badb145fbef19e38640b35438cfc31098261ee602b496aa6b8106d67883aa96c00f2c4413523df0e31907e70ebefb9ee36b050e370331366fb572785a3bae96988cc254898128d6d8ddf0ceaf882d0b349f3093937e8851d03c3404ab164e715335c59e5a73f6426652c6ab47348726c7f0527738faf8c8488f806b0f5994643e0b2e8372658a86551339215b57948ebbb70983f049ed5a184b635f3bbee8e32d2f6646163d16238127111e3ae0d35c9f07ab5b2b7e9498a0c1f5d13681bbfa21b466ea27d36c16448a532a26d24383ed2c8dda8b1c87bb9a6b548975b51657ec06b00cafe0f491503be48a66334f704ddedc66031e797de51b3b80bc241991db39438dc052c891003723c3ea45a6ffdd12646769da664fbf36c660ed740e19b4f4d66bcfd45eb723eccca5e3f5bf9e4cadc3baa4a555c865a3340e2096ca63f10adf54246b37a3863e4682ea2fa6c54c93c095c095a28e18e06d6ecbdb14e5e51a222276fa674b83e0c52279f5dbeff80970bd6c1cca51e2e052119ee67a9298cdb8e548c44f32b9674b2b9a7a0b0b25c9108d7208a2b9ede27274000217d44fc0ba1066b6ee5c04b3a042c0ce3800f5d4f67601558ce07d560020d95b6c8acf3d8228b5330ba767012010be903666ab509d01a6e4f489f754fffaefd755a48a6456b81122cd4a42db708606ff0bbcaa56051fe10f5ad01fc71bd90df8fb2e40993b022eeec02aabe7b0d9b4f560933c1e5fd2ea7d5fcd444ebd99d18c0b32f815207498c9a27662f87ad990378f2b05f537521af77be856cd7ca198ab44e008d13c7dd1a32f13447935c66dadfc1951af79b5a9bc46442840ebaffa724fd2a8f7aa64a6ded48109888db433b0d7f4e0c9b782da9515595a2fee9bf5823a6cec93436791789a842876e89c682df0578dd2c1f42983ecb192e67fa15a0b1484579648d0c12013df5b93d571edb815ac6e06d5bf9bfdcbfa331731e9d3caab16ad9d186012fb63b8a9060efb61cefd9695615769fc0628287943cd0c15701600092569856c75f470fcc9539990bf11370acf513a873f796dab4ca3d103ea49a1d69978236bfd43bf4b30b5d052a4961086cd3a6109c7919df1c72f6970d5cdaad378865182e28e58aaaa80ce912b4922e324c53225793e9a281cdc0d09c17cc30b95cc62ec5eb2bacc2a2274fee6038349434b5aa0128a520d7ca481693ab3d6d7d3acfab8b571caba64fa5185880c75ac82bf903565ecbc21a5d25198d613bfeb4c062a0db61d24db024a60367d59204eca9a0e9b193664e0ac08b327ce0a44786046c2e5761ef12fef57d65ed6b63c55872f0f6f564df3fa4bc9b9b59f32103a0684570508574119b11bfe06c62f7f7e2f7576ac72f0c72637f097b965fca437d97b6f29534a32180869076507d3c303348ff6e96dc4e414d968075739ce68076dda3d8bb66739fed8b075d1c59f2de1f4f2e7858c3cffc9fd747ba2cfd708e4a54f711481964dd85e778a42e1cea53edcebbcf43ccff359e48349af73cfbd09f319e4e368be7ad48e7af8e8e68a3a6a53ea693d986437a28929f265e8bf5e03859c91253412b88845358038af5e72dc74ceb9ca31c7e928226146828edab47b8ae390d02c0c972fc3ba7d440f96cf875e96c1638f3c76f7908e1318b6b12601c7284347e9403d76e8b56a2c9889a1755164d87016761b0182b959c2f69f3983bdb759d00338817af0487b1f473cb6a076f339298fd952c2762a0af1c8ed9dd18eae732ac4632796fe9c77613761e10c62ef44a31d3c7864262bad940ef1c8b41d51464cf260524751c3a0c430f9d2bf0cdb0a35e1eca03053743fb7c010450630c6ce4c8c0fb3304c0095eef3d36c430b21831a2c5c7be6337c661215c0d98300c73aa7ad91e92707f6c6b6e0e52a85e0e526d1980ea461367cba0f200f3e98449f4f1fc02462f9f47192327cba8c4954009f3e631211c0a7d39844413e1d84498e3e3d844934009f6e63127de0d34598441ef8747292403e9d681275e0d36f4c22d1a7e398442f9f8e8049ba4fff49c4814f8f4d2201f8f4112651007c3a09938ce1d3754c22183e7d019368039fce8049a4814f6fc0247f7cfa032651063e7dc72402804f87c024c2c0a74760923e3e7d0293e8854fa7c024eaf1e9469388c7a7576092a14fbfc02472e1d3313089767c7a062691cba71f4db2e5d37b6c6012cdf0729b5acc9e0f544240ff575c5a0ee12a358c74f6a522e44c8a93834070f6098297210862c947088921d8105e22bc6a54679709fc34ca74a2f19a28f0b0e1354415604c6063357c6335c4a456cc8627d118520d47e2c542f00974cc8688c4888b580de758f7da18972a84f0da5943c8d795c3005d0d17721a4e993480580e79109c86d778cd5943489c3cd2f0e9ca01824879a4c12fe3b563e62826cc829933d8673c7976d0c9b3b79a3cbbab051698f0c8c3499ebd87913cfb0b1f26f2ec180020839f2d9e5d83aa67df00460c39cf1e002caef037cffe72f3ec6215cfde01d014cfeec11a35cf3e80d1ccb3074951e699c5f9f72a87fcb7b402709feb0173cb73e2d2b866cdd92fadc5fdda6fe2b54eec137306bb8cd782e191bd000480e2d9834632cf3e8033cffe8107689e1d28cdb377c0e6d9452a9efde56d9e9d032b9e5d00709e3d00719e3dc66bf20863ead937c8e2d935d0e2d97f5e2f78f60ce63c3b00ac9e1d83179d67f7d93acffea2c8b3f71879761ea4670ff9c8b3bb50f2ec3b2b3cbb6bc9b3b7982cad4d387964b5d3219f385fac85479e51919ff829b6ae134ca08fc2bc7ace7338d78254d82195f361dd7008cb758ac163ff502f621f0d6b1f0d6b293fc384f1ac83ba61d4db796912b147d930e59ba5aa70ad6fd479d6302ac5334af51bdca62b021da3aef465577beef6dd4ea51a46ab66503b916f25d5856f5f2a8543587a493fc56353f1d8b739a3a528d59cd1ed25a5fa2eb95bc73ea90eea585f09bb9f45faea58180b7d28eb5699008b7cbf386062c33349f3fd9a5b1edc24daf76b3af1202bb9e1fb75e3c15622055562f5fd22c0835587efd7070f725ebe5f1c3cd8ade0e6fb95c1835e91ff5a53be5f077890c5dae1b224cdf7cb7fba50d8eeaa8eecd787f0320be0ded0d12a5512aa6a8e93fd847222fbda4a86e810c455922d4bb468d2c2982756504fae68cfba305525e0f8439d4b1220bebf1cbfeac05d7d3c9afbbc242ae8eaf4e77577499ed049b2c42a49913948aab64072ab4242051512332f4012460b245eb240c2650a090be420a982051229572059c10d490c7190b0000709921547e6bc3982859b236daa38526b73648cedc8172a8e20c1e68896298e585973640735476c48736409cd9126b52348ce20d13183342505929b324869c8204111050d0a1748153126083154c2e00026054fb8e00417a4a426ae685a3061c597354b90f1e284125d929875c112e5830b8ce4d00226249c1cb102172e46884051ed96383b63b34648b14580592294582d503b44966581d36689b24f352c16185608261b04972246f6ca166be58a05c2b655ceac9398fd6189f5e188ed6188a502c4f230657768da2932ac9416360a1722475607aba73487a794524abb6e4a29a5b4ab1c2855e080e606291b98686ac10a88a8e18a0a7860ba81861952a0b433709125d9a5ab3a2bc355161bc3d59b85e14acd3eb98a629d5c35b12f5c45ad0b5746acd29510dbe4aa876de10acab27045c332b97a61975c29d915ae64aba4ce0b36a90e9c4d52678a4552a7cc1ee151e7898f52ea3f31ea24f1ad911db5d6d9f26d913a4fdf12a9f3c3b7b23a3a7c577554f0d5a9f3e4a35367c96755a7c837874ed5b7059ddb5745878a8f8a8e99ef0574c27c5ad0f1f2654187cb374587059f1c3a553e2ce848f9aea0b382ef4627862f0e1d163e3874903e2bace67c6facb0f8dc58b5f9aab0aa7d6dacc67c36ab2f1f1556487c6cacb47c535859f9d6c4b0e281aa794a29a5b4eba694524abbe2908606344e6a564bce58193133470a3965dc9051130519289e9052620c17314384b10286872770708286269cd0e62c61628e912f739690e3c58d126a9220d3e58928255cc0a5054320c1c3cad77ac4d75a6bad5ed7d55a6bad5df3c085c7163850a8a794524abb6e4a29a5b42b0d5bb670e2cdb650c01609a84240158eaa1b55445507a81aaa825591552254d9a80aa1ca005535aa84aa40a8a24135834a065501a8084045c60ba27ac21ba994f00640c5c5fb806a08cf032a2b1e10150f5e07543878628ccaafcacccc5c3bda94d2f094be9e524a29edba29a594d2ae4e9c6a0907544604f001de1283f0b8513c07290c502c811f7496f3ef847a224a0bc37694968916a549b54c9bb44d32a8217cf872a5d0b4347db9577e411615c264396b132a8bd2aff76092fbf514f817f07a4f5c245ed99830068feb22582f8104412105caa3c51da5fbca768b2c2cdbed8e6a40040e18385270a4e0d0e0d06e9ee7bb1ff8edb7de6bfee0fa363df0f58383582f20549ffb6818e89fd839f8bd80f0c88b45f8fd60ddbad6747ddfbab7a2d7f9f70ae2fde79c2bc7e7a0d8521d74e52be7ad5d0df0dcc70f20ac4e140a59de7f228c0678fef92792c0f344ea3d75cd1b95d5334ff1c8de6b6ef4c6c5305bf36b8ca0a2542324f1c222cc9f40534bb5536bc523db9e9bb7acd95206aa096a69d3749a35e1ce4fa8384f7eae58bb6d81f225b5cdd916264a45ada0a4a0684cbee41a12df78aa8bd480084310247cea66ce60a76d2608eca5575bb5568edbaef3bcb9dc74a7bd885d26ec562669c2aa5493c88425b52571b7e66cfa86c99252ae45dfdc982cbdceabbd5ddd41a1a3cf6b429f9f5c927c7890d5da5db0d52f7e1a8626cc399ac0fdeaef5c9589b04de8b9cca226cc3963c5164bea2c67bd768ac7353c569709ed9d57a76b986c3461c961d742ea20c709fb4c0863022e1c74504401e82ea6cb68c74111060fd05bde125380d1a008a35d2e44b675103bd76c2d6aa3b639dce45bc8be4f6ded4c6d3589dafea726794c5fd22ccceae674266283783f02af03eb1dcb3aa7b62bc2926b3625d019021d03c57eb17c965c63ddba57b962104fea4bbe315952dbde768a49ca85c653d495a3fbc921986ec27ef5ee55c27e1597be6c67cdd7fe96d0ce795117f164397d0df90ee2bde7d3b5b737b786319a19c4dee68a2a4eda1b33d7e88ddab8560bcb796392e5bbe6796dec403808c7957d831bf3cc267bf6205ce3353c65451d64f675a71c2874575757ffa9d014be4a964d71b27c5f413cee87cff7f6ecee17f5f9fae1f375ded8c6da806f5ce3d1f6e699d798094b6a7b766a63b2ac494995c91b86b9cc05a5daf4b14803d72750195631f513ca8dd4dbf809d5c6cb4fd702b85f71279c374024241ea35ebd88456011d85b49c84df3a4c2da8fcd6f1df44ea83a687e29f44f641d34a9a8bdcd48ead92dc064cfa898c138c6cc525fce35cfe06d04a6354c2ad13e08bf08e89709e783e0084cb506b7c5524cfe084c656e3f77da7704a61a9330daf75b1c81a9f6dc584ce76eeee69db3d7059b709d47666e217606d55a2bc7d57fd6d994b7f909704ea212f65128ab03184dd83e9dd6211c45435256dfeec3c802ed2930590e0de180c9e0150a3db073705f42e37633b33744a90c1ea5789421d47541eab308a3011c09ea03b50355bab26dfadef196fcf425aead271e0bf4968fdedd3de2d107edc163d3978fd23f48fdcfc7eb88e3bc878fbaa0b77a1c8d09416f812008822048296d294b4caed82008822048e9537782777ed430f61eb84a7da977a20e1e7bc7527197fc8415cb6e03cecb5a3bafde81ea5bebd10e1d279ca06307934be226091196e3f732197182f5eaf1fa3c0afb274649f21e0c63ef5ad3995e803f3fd1138fb408e7f760d8f4f6c9518f09d7a928e31189c75eef382fbb6e57b6d49eb74babc4e3131e7b95687795767493785ca5558a5a62729f94654bcaa86133d6fa391323356bb4f6a334835626ab2951578ead3d96fa381adbc7d1e8cab183e97294d29d2fc78e5bd66ad0c4fa2ffbba761851c0d5d555ac97ae1f7de7f355fa4f71d62a96d4b9e560e78b9dbec620f5a7975e69339d1d3485ba097002f598d07d8dc009d45f520cbef478c94f6f4705262c44e36d9e8e5718adb82308a1aeeb758b307ac80eef65d4f278caeb9f9f30a41d447d7d9d78a4af7de291fa6a419dae13f5bdc2b019a3beaea231b475a2403479a612ee60723ee5e1461698444b52d7f2d85747098d78a43404c0dea83d4b764e693cfde069154bf0d74b013cf5bcd65aab7bddd6994747ca4c8aa5e5b1638798907a396f1dc4453f6f80df4ec297332a84172a9a44deb7bb10e582b0c384e53218263fa7ce30905f942b9a33da1b29eceee3ba20f59706262c97c62d00c64f8c1f1673700ec4a3102c417c1cc77d3d502f8196fc9411d4366eddb79760c27674503b8d484dc9f7b4b900d608b9e6e61296f39625fc9c7320416afdc4950ae2a583bb15877c270a01b22f9fa97069544220a5501021294ca21de2b12ecfd8bef86732994c16db573fbb8274945008101edb1b4b58ce09ec88c0921e9c672396a099eef37c848648282a7a222c278db66369ed406eb7db8d76c5c00993a424264ca490a490a4645248524863acc6581971a1c14fa81a95ef7e42d590104ac3d342361aa4d50c132fa8908e19091c35a3e505dd6e8ececce8000066d2713c84a8585f6eb523ae073900e8de6133a2f13092eaa0f93d78ac9c84999bc89a1cf171c4e351ed45a5f9a8f5f0d142d311d75f7a3a5ab3311463e1d64194fa7a8f345c1f41f5f004808eb6c0e4c7a4138f7a78be9c78d441eb4d6038aa29855b8b4828ea7cf438e271478d767391f972007d102262630887cf0f47660625e6b643a194e0c26a28e4f8d018493068188d6da5e28c8459144c2f9a32092bd77135839fb331453a236662b0f8cf875b103b579c58c2653b95d057fa893a0939e71caa054800b59cc5f2b0ccbb9ee54023cb59fec58a87e4abb74226a4f8ea3eb42b5fc7af358327570ed68e86b5edc6d755f9d2afbef168eb373cd6fa05c98cbe31d9e2820dc4157dabb25d220d90e743423299ccc8073bb5d62a3c7c6ddb7c148449be9d6e413af3edad3e82e5fbe7dbc6644b7cc3b027bcc4b02331ce39a9616d039d65bb712c33e23967242659cff94aed957d92000d506c49e4f0c569298ac9998626f55cf75c0d699386148932c78b0bb6e812f524c64d34cff936fdf09c2f1426bde75c48c37a895be29c07939d736e74e403c899e73c08933bcfb98ef59f86b514d0c8b950c34a40831046e47451c2049418e7434cce1a9d2b108e9411295330c4500525c69d79ce433a5d9e739fb65d9df95add6b854abeba4fdd221bf3d5cb6f2182c357076232c64800fe766aa72b2caf67f96c255b7777896b56bce7d4f3caea9ee7751e98c56d16f3bca5a55fafb3c2d3da53fb4a6bd82e312d0c019a98e4994cd6757b93c9beace236b56d9d0e0c36a2664f4e529a7889955846755b295ad4ac3eedf61b29deb67ec3e37ad36dabd8375bdbba6f4cda426e7a6f583b797085b392e3fd588181b35ae1eb98af5668be7a8bc99ef0060655b2ecc6e66079426807293215dc0043171798e9a93203b7459aaf616af835c84b134e9cb8b0a4f643ac7429be1cc15a6bddaa85d3735daa3c78ce439f9f1a9ef318dc0bb078ce81381fa9b83ce732983cc0732e6483492aabe71c471513cf3df19ceb6072ceb6b8e1393f81e3585024d5a2488d72c3144da4a08824aed0d432b5725e6badb556373f7e2b74f29cfb709e451b0dde045b9ce8e870e5439313190eaadca5a91f70d00e582ba3dd9493181c1053f46134469b80b2b92b4c15bcb4bedbc929c2848b0ebe1cbfce87e79ac06eb1044596587a2115638f45990f422f5830f94a23e28826253544b011132bbd28c0dd252b2b782f791dd75e1562f89c8dafb36d5040307577b7ad61bbc4f96ed7368ed3f295c6d7fac4e4e79c93b06346ed520779cf95213745a50c1173965850a22136a1f8727cce4b1b424c7262f9634a7df576e2b19fe28475aff41357ab58721ebae0382e7cf7266cc63c91890bbfee52dda5a65aeb8b73a626263971bfe4c46ddaa5d93467571479a27662b2af7cb52fe222a64a1f0ff1516187702aec10ef631794907ae8bcb2bd137deceecffb3db6353d3b75201bcd2ffe5eefbaeeba978fb8cbdc4d691d9f3b1bf388a19701f4dd42eb59e0db3705201fe463bc0c1e3defd70f20cf8bd8c3e139089638be9dae9087e20f1c9eb83fd6a7c7a15f7e2da5438e425fade8751d50cbe3b1ebbcf58e1e7d6ff9f3af2095524a79a49c9883db01db04d059aff6a239631ef12c1cdfe50f201b3cb264f0c8f21188b5bbbb31bce5df6bc512c77f9f2f9bf1eb7e9531fe73f087490ff444caa3e7a205ba72783c3273be1ef2c89e7bef89301ae05531082be4b18439a33bf1fb76f7fb4ad81f9a33be6ebdca1f387efd4341b8e20f8f2c2fc3904796abc023cb77f60f8f2a34f82a7fcc237e9d1583ca78cec12dd22dc7ad1f26d9d5809d6f31007346a5ad14be7db76909f49cff741b0981fec84f77f70f20578e7614842d72bbbb8b149621e7bbbb1b63cee03c2c12fa96ad5f26a70a6590e63c04bdeeeeeeeeeeeefe76fbf3b2bbfbf3b2bbfbebba3248ff0f93b429dfe0a5ed948aada53e3ffc94a4ddce4dbd88877e9dd2d7cebab8d52065d58f4d58863fee7af8e33e3c32b7530af9fe617245f18747de6613bee0f482520d5c1b5a9ce8b75028fdbc52fa792e5593fa891af28c3a68e867a170d0d7b452faa953df7963c7a9d349ba9cba37c996536f4d98e7542cbfa6ca506aeb9502d2cadc73e5708942a47c2c9909e60c76210b02bbeb158213cc19ec28a8207b9783ae1c2d310518686b2eb75aadfe76404a298f54e4164ad34aa9dfe7d3f9b43a976724d50d2d116f9584eb824f0966103b1157f2ece5f8ec829039837d393751fdc45236dbd2b3ef9b282f65768a9dd2edf6f5db0f9fe7e8daa654140dccb3532f6bc2726951cfe5d6b6b66b168c0bb49e45017be24cfddc72a426e3e72c0e120fba58189eb77b0ec32bbd9f71c2c239e4494da1b9b0a20e5aefc4b0a97e5a488bbb0484ca102e138fdbc4e3d25308a301add2032bf8964f97037ad07ccb690c33d7ab64a5c0e36b9938a87ac73928ee521557268447ce22a4ed72ca72bd86788790e5f34b2196db60b2c50fb4be7dc85529057d82a20aad580facef2c747952cd52e0a075ef256497a8a41475ebf4b3b0613bc30c5ab7c19bb255bc71979696ca70a972532c64bddaaa02c318737167b167059f33041aa993901d94b153fa72909bdcf64e39e44ba0fca22ee44045b79edca2adb27967a5cf315d99fb1114102b7ce9e32883c7f55dfa595b5977b27299acd2f7357bdf73b290d6e7271412b3df32211d79a448492c86a0fe8f51c884e9e51257664b5059a527938912e8f4c5021f647e617f99fc2aed937f956369f41ca55ef89afdaa4e5fe373ee7d7d7d607c2e8ae7ed52618cf5f0b909d339ae2b65545709fcb41ef1b8473cae920ce9c9af9f20240526e79611927801778e2e07e2f2f5202d5f9f2d0777b64b04c2e3061dccba5c2981c9ad4a4e530f4c64493ac042a5f5428cbc5004103fe850851524586ad89974a2a881cb9423b47c69e208c7715c15cb1f4b72c2fdee1f265d4c85cfc560c3932c5766b8a2830fb1457a6e747d5e3eda27358966fc453dbbb7e4bde14ff6257d4a0da3b12608a63a4f9a6842458cfd5b62728d3cfbd7d4b0135cd821cd0c2b2092058618fb2785c92de274e57bfab4307963f7a82611f8ec1e13cf5b9a44ac67f79ad83d294cda7876cfa96122dcf002173866a466701263f79e98f4660d9b667098c28d152c2cb0b0448cdd8b6272653430ec5e192fe9d93d59c398d63535aca5b87b9a44dfb3774e9d15157b6763725e3d7b576bd8902646c850468c1351576562ec9d1493b3ceb377b4860d79e2c5c80d0a16649a7c89b177514c86f0ecdd8cbda3c2a4cbd9eb1b265d387bbd514d22193b97c4648d67e7941a3684094c9314d4b19ad20495183bb7c4e4a4f3ec5c53c36616290862069b9a29676e88b1735298e49cd8b92b0ceb62ec9c1726779c9da3312c949a441e3b6763d200cfcedd1a36640530cc7ea861851cbc1889b173544cce39cfdec91aa603cc1c262d558e9c9922b685d2938eec6a0deb6aab4a75691271cf5e9bd8ab1426859ebd3a350c56851050bcccb29862438cbd3e3159670d1b62039a372fd4f0443b0326c65ea3989c54343052ecb54c95356c93a2a4989cb715a698eca15ac18ac99e67a75926d936aae5d929152776fa449b1a2684d66c4c82f0ec7d6bd80658508789489b305d5a10636f2a26e70b86c440c416245abc1441a2498c9d263139b5507ac2a4c7243b6562128a49b6537b61126ca949346b988f96b1771293349ebd951ae6411547b298a9c28a3557c4d87b89c999c5f3f8a60564ac5891ad998ab1b71426e794d3957e6292bdb530d93d3b574d520368acde30d972a69a446518b64b1cb4eee325af9132d9190ccf30c90530d3b33313255edab1339ef1ec7b9be2efd937cb246bcc71bd8696675f2a4cb6183663431db4ec3e949eb006bf1598a406735c67ef1398e460b32693c990c4d88d643c7bd8302e4d1153a2965c28624a8ce53cc73142872819aec03225c6583cbb10f7cccec3e8c8c7161756f0d48330c9f3d41789ea001aa90b0d1585799ac1534aa9d293a73e227521f4cdbf78f1e28500a09a622f5e6c51bae17b42f89e9e9e2f4ab19e1ea726b4e771cac3c33380a4e7e1a1355aa33c601786cb962657be8782548a172faef0504aadbe87d238947e3d3e5a5ebcf0f11185429682039f0d7828f511fbe985d84e4e94d29e16949ec7290f0fd028e4f91093e07b5e24c37b4e020f2679dc7323cff31fcff33c4cf39ecf7b9eebf05c0a2d9e878787478aa7a79452af973c0f04c1a732497ca12f28a52f2805412728a55ca6c90d4aa9b7c44839c8e3f1f090a9fa9e9e1e1eea5f0f940c6ade139f7878e87cf16246a6caf7447d4f0f8f48690fa53d2f4a5f94b2e80ba74c781ea5f4c58ba9e741c0f3f078f405c5a288265344ce2469f124567a7f858b524a29e5f11e07797a787a5e2e7cba4ae0a12f288d82f69ee7191df960d2c514065507d028345444c45727a1d65a692d7cad4e3c0f0f0f0f0f0f148d86f73ccf5bca049ba794528e85a6a79469de0d1712cc040b64f460d962c6c1ce1acff33cca269c44f3d7bf5c79ea945230e4c1c2f396b07a4a69c8b3374a29ad45d0904444133a4344716315e9e95962cb8d212ae8c2f4a58a11412cf1250ed7505595040d922298c0b1eae95942f6d429a5de09a2bc4004cd872f58aa5801d29e36ef799e478f7c8f4ff6624674e1724141c1c3bb5c2e97cbe553301a2ea9b591868752ca93a3ba82b8c2085b0d7286c822f6e6cb9f1b5b8c4cdd601d612d43f455bdc953a9ed0d0f0f945492f73c8ff2804e278dc7e58d917a4aa98b9d1d0fadfcce8bdfd9d9d9f19f1d2394d41a66879d4e7af52c717c92afd5c58de34d4a95a0e13dcf73c164c430a60d610aa302364bb526726288756ebe9b51b1f45dd7756d0362d2e59d8f9d0b753ec4248cefbc8888ef7ebeebbaaef35088efbace67c7260c971a21f56d720f8325da31c167cea0ee62c9f37c47741ef726ec7317e22e79af6ddaf1bc1d317ca120dc2f77c98b11db180fd60897c9f34496f94c2213e6cf3963c7a9874c52f79a3a0693688398337e5dec88b36d747626ea6bad86afe0d7294fcc6a5608f8ea239a2c5f5d861093af6ea3fa108e322ebeba0e375ffd0426c3afb33473be3a0f263bf8ea461638525303065fdd8795affea3ced4bce0ab0761b2c6571722e5aba7b0b2459ab33554be8251927df57d329b62cc575fa6cae687af3b527e77c98c9c77b95cdd261589c2e6e60891375abec44aaf8a2fc39d9d39abb8a1b1cd8903a6d6a40dcf8e951e7818b51ff90042f5ed4198049fea685828e4e2db8b72e8e1db4960d2fbe96e3aa2e75b14d25b7208820ba5d466cb82002d60a101beb6d3162848224cb59086b5ada3a2eb0114336aa06049228b12b625942e0e447050e6c7ae27155f908449e24976431354789da7c3d76e6f0b0e4f82fa35444b930ba60851a749062b6c6a122fb68dc7bd79de0d2aa0b1e50625ba84f575a305385bcad0a6282531c597635777bc5697839dabeb6a75e1422c2965a2d43d91521aeeec00f10de3bbdb8625be69dde8aaa2c6156eb181c90720e8e10e0fba0f933b0f3ad008822054124e32f85afd29e8a376aff0c7470f8a5a372a0b315d94d8e07da0ba4cf1ed3198a4f1edb39f6cfc184abd5ff73c2bc640451d5123c4d155416aa72e402e5840ec40bd13dba99fa80b520042f5aa97169e9a6410e2c9911d5c5fdaf82dbaae7a6dbe6b7c770b70a08843e54b1565ac4c35b58158a1eb5efde4d47999f5a8d46b980b83dc294324020000000000e3150000200c0c06c6a2c1304e5250f20314800d70a64664521c4763712006411046310cc200100b000000300040638c51663ccf96fc4d9cbece543060bd0e26e4c1c03a6fd23088ca33d6e836d8d0ee162205b0bdc204d81405cf7d420be54a48a701b46bb6fe1d3168d8acb675ccdf218b11f113dcf17bfe80b6232e537c693b78da9abdf6901042ea3f31d1b7414cf3c04661bb42a12b9e1d4f57ec250f4354b8d7e71e2d8a21ae1d75c5ac88345de9d2c93abdc86f9012e72fda91bef90b2a1608ac27e4faa2cb1db8ba45a20e1e692011297d430360e8ee4f4780928fb07ea67c5cee3362d5ee9530940d71f557f5a75ec38ed4d546f504f803989e9348781fe814047cd1719ceffc978616c315014e498d753207234efd2f17b22030b7dc645f0445303d6552048c02637daa45382603e9b208028043f886b26e874222fb99b9ebe3101e2ca2bdd8b20663de2ffabab4071a2be2f2978162fb3b3decc12763849933b9fc2065a8960fcd2a5d7fca62efb1a30899db6e6c6bdb6a267072e4933e7fd41fe107ca63cf86c4605a121b9879bfc711668a657b5bb5c69a11c256b6dd7ae83619c03600841258a4451297dbd4a2bb8c59799317d70ae6577244b8ad8a8379f6552f8b3f0301eb419c185159240023cfc915b926e0159ac6302be6841d825f71bec5526c67136226d532a540be0cc653ebd82e222e0b06c86448ff0f695dd40496628503f96cb39faad4d0c49dfd7630a62f98fe4404dc5ae088e54210628eb56efeaff45fb399f5d9bca51538391aa0930512466f9baacfb325fdbe0b6bfcbd533b5dd9ca5ce663513ce43d7cdcba5a80821d48e9c65f937584402de0c20fa1f9a3dc2432e0755d5c64f287de9ecd5a4e2b583661c33c7c82e1c60411a1ee25d34a25fdcac757e68f11988286b3852d0785f22d0011bdb0c21dd88aef02ea705e4528ffd08f849a61f9bf58372ee41bba48e19dfdc5f341cdee45197c8ec4cbef1d2d6824ca9823d932dfdb480445d9bd6a33a0f5be4ed0df00b0abdfcae20a891c3481c472dc29116bbc6b002db9721320196454a5ffd020f8894fb4efeb236d3fc9a32d9ed863a171893550b748b6719e212a0415a0310d48f9c7a2c0eaab4cb8f89ad415a4ab895ff0b34704efa74bc3ca7bc9e33220c59bf8bd1d2ccaa739429d881f3d8982f8b2143914ca488c0aefff1d62341e3809c79452d40a51571c8d7696e03fb7921a9f28d1fe305d2f49e690adcb8a194cfb69c769ec261809fe8c37d80a0c465a9b9729f0260853ea6b3b42f343c72f6c4602301ed0a88fbaa49e9dd70bb4635d520fff1851fb12cda14023f3c522c8b4a7406b356144087d4a9a9ff5a90985985639a7019aef6a0c794be35601d2bf792a248fb00d0f79fdc31899e64a0f548c3a49feeb558c1548b7fb16cb996586ac2c48f77ffc8d9089383e7464e9ce03230cc12fd1a2036abb87fe094a9aec90db0b2ad2ffcf314c8435235120bdb7d59ce4753c3bcdb4b6cb2f843171d023ccd86157e1b03a40225fd8d6baf230ced03fb5b29afa49c75feb2a3f1fba7747c7670fec6874a784fe291b9cc0e34cfb4a6c8a163537cd9c6642e2b40e4ad5e441b5a884380842df5f8a441fd57e760f19e061846aa9949397c72b82ab8d85384b8c3471fc858b10fd811081ec8f91c7efe8a61ebe42c3e6c0559b592033e289d70846c40c781bea034f07e2a4da44e9aef7b93f46e9974557af0b898809dbe076078ec2f29b5394ba23a802dd8208547ccfb07f30bb55aaf026e66dfdedb9a956a104fb76824f669cf266a6b33b6db5c9aeff4b19501f30c827f11fe4d8c4d75cda367bd008136f66ca2a06f3ec836a01e31e1f6f8102504761d4621f26de9e5f43554ed6d5c6a23286be4c110f0a5f265ac4a876c26be07b22ba5a78c10429bb9cee1c5958a436931d58bc452f2b8caff7bfa114a8c102f433de46b8e4fcf5c7170ad59a09f0a152f969dcdad116e1879811f6410db398537ddc13088aea2369b56e4f04700f63a80350acd6cc65ddc10b498e5d9c5273b9212b27c0925b404bf4d97f517c19fead9002b657f227fb5ed7c760be55536576606098344274e3f6a6c30afe44dc59509d8920b45e2626fd35654a06a140e0d2e27776b66d4c60771b848525e8b45682372fda6f5522a5c808eee706091da9289a3cdd01bc1a29bfa492bf2e4af3763cfd024ff381fc7eac1700dfeb35417cae4b3fc2a71e8c2d5aa82941f30d7ae0d23956ca016e2b9e99db7dc2bc26486166e87ca5ea5858d7cdc3a3ea58b0e7e9830cd880b53a689b7fa45e9ce14aa3f9767d27f7f69d96dafe7589677d3ced24c3f2415fef64e1704f2f571dedd698b6d92161ba642fe3871e8a6e58c159b3c6ae27ef6eb1923c6a051604936ae2c1fee3781f974993acff9688405441abd4dd45596c688eb9fb2d2bf02d647d8697b4c8ea948645fbd9c16b6e1d27e4bf7f088e2cb926bc0385f0b66f1ad75159672e7742cb3a7ef1feb2ba2030422ecd633156728ad7532023b4a228a8ff2c90acc31174591469d70534be4445625286c90fc956ef0a2030dbcea35b82e020487a3abb02c188164e004a79f8c28145ab48ba549818f1878f8b04bd28b033f3fe360795f6cd752143e208114263a9b3064d7c29410b41335903b5e5f9aad2140a38d18d93d0e9cffe4b547122e391243165d07c5b82f7d4c0d3aca12b25849e808bbb68c7f6773f329b487b0927e467bde8059e30cb23e130576bd0f6a08c8e28b29e579f1011f555717b54c9ffb8962abd9e1ec302316fff8ff5f80475c49ab0bc1d862ce24f6733e07f995e0d9cdb7d23a434960d225fd88e964dc5ecb47dd00f3603725912e41a3d3a9752a1dfa7c0b00c678fdf995d5eeaedc6d69e4684b935ba8889f974d12d92806c8ed2ea4d506dbb0cb4fc78110ceaabcbe78993e488271183c06d96f15bdeee4b76c952dc3630e7cac72ca13ca8a06d474104183deb8c55fe2a780a037d5dab1691e370794b15b99a2438bd1199d83cc8195c6b5842312fcefd1a09dacb025c8c8e7b4d886a97783b6cba33a0da048335b2d2e98a80e4a03150021eccc7dff6db43938645031c48376fec60a2d558d91a0506a1ac2e7675e93e4f8c4c977d34a86e68b73e9cbaa5e647ba2d6a57c1880dfdf4f70e9957076fbd2dc7162fb81e4140372645b526a76cff9b5759a438cdd5876a22981a2c32f2058377830a13f9c2a711b5ddcbb9de88c974fe05eb62f4c02c351cf412e828361088eccc0b266f06614ece98959c01cc52b7e8b30edd473434d5882ec449fe7202212a242ed9199f66517ae460ff2548624e2aa8178883fd54851656803b5904ae6e1e098dcab02ed779805c5884f7bb137cacd9f1020d9782e4511a6edca4254e7253fe7391a7393da4c16e0f1efb5184c1be086c3ca3d51f64788a8f0a4b6396fd7e3dc1f011333d7f7467c95b60e4c3e472ab6c8df8a2754cf40c43b8c0daaa9be401121f8b2a1ace69c74f9128e031dd694d44f519fc9076d5ea817fb83bfcb19b0d526883f3b0a0fa690efd2ac3511ab0dfafe1a6dd916811c0c37e666e4b5b08c31e42e3af3d2c9496b8a136adc167c689e230797e4b37ce825951e9e5453eb7bb08660f4eb76d17a993cc8427fd5316361a23eb3656e25755357d9a1f4b9ce5b9ea18327bcb411e6c94b7346e3062fc8c3abce566c3855f106ba5b24ad7a706e79c4c78b11f000baecdeecad525813b58d44379c860b5cbc17d6102ee20cc14efbb0b3b840a3c54e8350d215a85f770fe8aa3b29766a0b447ec8e6c50c0426d19992a2053029e754cfa1f09a52778c05f3a4c901d7ca136037583e8ae7fb9d6bd15ed48106a8b17da2b70332932819b29b38bb5ef33fa48a76e5a8e18e0f61c4243df353d738d36257030ee9b91abdfbf955c3a8ac3028db5d6fd9344881700e3fa450dc2e877d2cd35897eca56ec41f13d46ce9aa9d14c2308f88240547ef1ec2f3319367a8deed0e16a1ac771907a59a6d48d612379c383cb34a8bd93c14711b9302455c3a5947b84691f8032e38ba08ca9c0720a17eb87ddb75a99211c84e4fb81759e11878ac6158f1e13570cb042360451d7f9f7e06a04816ccb14277fb0912d84f82b42da02d97bc114332fee8999f8173fc88ddd3b968bdb226fe18f78952b61df9eb203abf0532ea0d2a19253ae7cf0a238e3d90fb470ee7120b193281d9b80ab71146a74c41645ddf3646d762795ab6d5f6674eb58632fea23a035519b9e2b84d61dda1b26a83e332bdd937ba17c783a4fcecfb2fd852a92217fbc442b291e3cec0ec2b438f7e6554bd66b486965b3f8275397593752ab52deac8d4ee7d7c4c94b7dccabfff3a90519e066f1244205a5435022be162240273b4ef5baab19bda323b9d4bdbf4894ce80366bca53a20177e9711f355295bc3129a769a162aa339aab8082cda573d56897ef04cce6e2b3420500014f420e26ae9ee771b8454d32ca32a97fa2e1f2450c3b8534d3e8e04d0383268d8a42461749a43dc2cdf6251c30384897a4f8d2c8763c8950c9648a7278108b53e281a11dd4bab9f308650109775aeb6471a1485f58d48e1b62b881c5cc722359b0b2f769093c1430c30a1c5eb925c44d95269e786506f30ad95cf785948ccc9503a4bb961ea298699d7be441985eff25f243b7c6e318c39d2944f92c700e4cf01274816cea468e50a24f516d818fa22ae7cf07defb7c9a9537376ca972225b464497175c414523dfcea48bc740572166ec83dd32c0a99a47f2c32418c16699ee10c128be0e82fa8991165d9ee9ded6e34d351daa61c4c9deb12d6de35be400813cb9792031f76fe3f85f07912482b3350fb31c3959c41c20a06f547e796fb2d81a9295387f4cd1d612731aa56158eb0ba4ae42a816e36d71cc5b3e10162795b73cbc2a17f2f6188cd698e3edef92e24bf1f6ddcea315e1ed5fd845bc1849a8700ebcf2c19977b5c9006ae18a8316b515eafe3f3bf862623f7ea7ead45edf8123fea1c63e9c2311766e5ecfcfc3ce4d5b8e62a830081b7e04153306a41e6c6a8567c174d307da2c6d3d1cf5db6f232d613e24d194463e1ae4c06e947afa5d0e8ff53934337490f87fba0f6e693d57ccbb48ed74363e7212064ff05345bfe0faa33b860944d6b7dab3d4ed79993d8d9c76827a74ebe2ca9a14a9ef15b4d21217997f2de674f4043ea89e609f6bc52a7374e22be2cc4a0edefcf2ac9fe43af8199d7ad17c2bae52e3ed996807d39a2c9025b8b857a2415a61c22d8bf991c649e040ffe52be47cac7e19be1740154611bc513508796651a05b7db0b568d761d253bb8c4f238387121db9e07b6f4d63672971671738e9d243bcef41902d69b8bb5a58e09c6af3390c85339813538718c7c16bfe649aaab74bcfff6cf67e101e95934c1220baf0d107380d2d786949b56fc85e7a6412c654b2afa90b8c2cd7d792a403e8ab3bca01239e63b15d0c7a3fbfededc924d2a87171f77ee191fc400eb3b34a6dec18f770b17d935d141362cdca5b8c915353d2a193613748656b27b9ddc157431540bb42461b0bf7d00a16d584f400b2ea42945913fdb5e7bce4e0d220ff34e85007926daecb8be70ec4f0df5ae03d22459a3cecfafea24b76e2654430f65833c6d80ce9893fd92016164158ede1d2a0d83cfe78f3fa60d676584fab45a18d62ed4c46193468d8ea44e1eba585cb6682d88a15a52b13243aaaa3d7bdeaf720f6d2bc159a3a909ecf0c2e583914d4afebbd080c06045f8c9f5e15821fc80b6810defbaa7f47ff4def7f24af432ba001235756802ff61a70590f88dc20144ff865e5dcf9e3bc389e575e0eab6a6e1519067a1047de75d3bc8f4c18594b72a58e2319dc069a1e85dca8a069ed2a7395151e1cf0541428e70944f11a38b2b3563ea3d9d2588ac083c5428f9721fd41f484166338bdefca1190266473a8dd8eaf1ec503e645063c3c6d387977262f7a2334e704dd5897d0811d80bdb6c3b963f6660a1ac9984153c4b3ea5eb9c65eeffb961e676d6e08fcf37b34b5ae5683e72d704b26658e630ca4045aaba5bb00022a96a4486fc3f142bfe8f3dacdf075ad1e2d3f0a909d8b842df8c721dbb1b9239ae331a705a48093038a92bb57f9b1ea129330bf2706b34503dea2317114138b8c561ca0e378a2fc2b8589964b76ca309bfd502be1073c1dd6f64eb364e9c8f818ec28b31d119966e43caec7d90e47a071d8c3c4ab8157867abb952bfaf40afca16c52598176c834d786f98818d17678636c12f27c1b6a07d1f50b652af1f52e98cf4071d50d7cb104bf2492c2ef2a8a12050f92e63f3ff209bbae4dfc1f4588dc805a2d67272af7ace26281884b5d6c74aca0da4484b6968575df095997a9644c8ea4122b516599876a2a15c1fd12fb88a7c87747a64eca8e52cfd0d3e965e774724c93617ba4deb0ea89dc8c9f821d527e7287db2ee38a7ecb23d9cb8fd9438464772910a93bcb4e1c0ad452618ada3d638c08a09c5ff0b20dea3df52f12abbea9c480dad808008f796e20bcd521447ac3cf900e0197fe4cc688721ddf08a3d4d4a31efb48ea114cb98746f267c263148e9a2a8741393d9c2c63dad1910219ecde1ac04eeec4aba79fadae733a4853e7ef4ef88c898f3449fd9176965e1e72634f0338b35883c8b22aa8dbe3926b2cb91b2ff7e89a7b1fe78e6cfa2497f5656ad02b749c84225f674053592d81b0032a5596fd3a53d6b1b3041966bf9abb63f51d83813c8bdf0d8c31c8bf6e5b48e8196e96a30afca3dc1b67fb63446af406feb5b888db5cf71f4cf0299391775e783635f59ca16d960daaea8ea56cb9895233a992a61d75ce88468ec4daea6f05014245f4c1407cc7235226ba2a263f05e059c209661a0b2243dcbc9a4af6654a1dab35d6b62b2946e7a6bac1b10a42a072dd1c6b71bddee823e321b78daa55fba93be30d267a3bab664f478d40a2241abfe49a9a8392b6a1a65a53176fc98f2e881170cef4320e20d60b767382c8314be2abd68f6ee28d1d159cfddea6ab2467b2c0066c64f356e87de97df438c5592bbbca04f186264fb0cae9d855c0367c08a1ba32cfa9588a5500b236b9a52425a5b4b0cf2af90304bc881bd314abfc19268a57158500b8544b0b8885fb9066e618d67e92f83ec0d133cb1ad71adc8b7ea9e5dfb62bdf891447a244017a015afe8501616c34c3a9de81b33d889b338f196f768c35c165f687a254ea59daf8b56e0d7104a5d2eeb0f7c56bff7c36324830712a9aac4dea721922a215bc5ecc9254d6865a4dc8d54358a21db9028dd3040db5092471e65ae2993414899e74fe6e1880ba5f84d93db566c54f3e3824d6ce4b3b6ada358971eaa62997ffec27881957d7bceb016c9a981fdbab45537e34faa9cb889a114e1eb1f5d31b8ec4eb9be6015b8e381f8ec4c76f7e5054da031502d5128bc30194d98ad878a0036f64d53c93f8951dc47e4dd6d940c71bd0594917b2db2c238287d5e2e947dbbc270ded8e34070a6ffc99f37251f719fb029cbc4809caf653b9d1c1832afa56735085bdadc7f2506d90f0cacb35a2887a137323c9d66bbfca29326ea171d8065282781d6bd7b47232e4598d40983ea385a7c6e153bff04bd33e933dbb31ff70bdc1a284e558e312a96caf369307eea37e9a1d8eeed45f3d779125d1c96af9f479b8e278629580a1d969ae1421aa58282cd199c40df6c4e46baa00bf722a009124edf5b80bfc520f7b1523017ccebc7c401ddd24c805d74fad4d9b0d6426d6c4d91a524251a0359a3fe0de95b4d172c4cd1540103f93030215c889301eff3ae72d0fcc214270bc8f7296c7871e1f00269634ef8ffb6ad37b49e428b4184b4cd774905acb5d71ac568c1ae8a7bacef881cc91a48692c3eeef698c26d8e7863f30094c4ec8ecdd728cde50504bd31c8ea79ad6f71e4504e3517d320022ae04b02ed50d338d2e56e01e7161bfbaa10ed4ad28cd6805244fe0071b7c5918242f030f52537109b0f77a91e309c61cf4ed1e5760eaa59b904bf5fcd7c68105e909f06ebd3869173d29b3a57762458a88c4707646a058eb4fe6d3196b79b86f79eddb9061fb761398b1776a3a9159a3313b69386b951866ec51b863ba587fbfb1ca0b68dfc861d95334eefdd2e9dd860caf7a33590b0b8f698890df428dfda25cf6f8e18681dff926db1d07412903f487974f19312f7d5cc8ca92e9503dd8b57ce2e945f9b3b124afada3db0d7240a5a281ca36c0127b311e8170170ab19ae560ee9044b6d81f8bf5e1c454a9b35d51f1b794d5609676744ba080be02fbf2ee2859cf5cf5052138bb4b2731e61175918d168bd884d93d1dabe253175de8c4b2ad8b1c4a64972366e6bc2c8576020800294b98b6b2a1be8b6f25d4e240a481aa3df0e9f0534fed4d72b905974781655560990b59662f729458a33a687117c8eba1b3edcd5cf8784ae8ddb4227bbcee75ceb966db310fe442085cbe9defce87f5875786b276d18375916ce8705eb7ca0d088350eefc55a1d066663f4920953c4c3558ebdb88c9fdf9e23c637dc3682b72ff568331278ef5e76079c84dabac1d023e7415e73992b12a2c74c793d52984250bda7d8fe4852505b5c0ade6f13e6ec463e62119c3b072581451f6d16916f36ca9912aeb3702520060800ac100da3352410e6ade8d390540cb41b302a54d4e2fb654751bc11cd450da08260e6cf7199f52564353f3e9410e540bcf2c266608696f4ea10ae8540fdc7203b6cc899934388319da05d92bb50ce9a95e86181d43af741932c732a7eb320533b458dd432d662882f6fb8a2b32434bcacdd2bf35f2a43156a4ad1648e70d98d21bfb344302c239a095e4109dbeb3ec72c03a4afc758685c4af7679a4937a1ca88032949a0f4368014e45b978be34f026b6f724612e8b966731046f19671dee4b3bc726cb17ee495fa7e44a3ca4ba5e2951e2579af3f9a4b97cf9269a90205614207644a7de636c966c6e4ada39d39afe671950b1f4bce6350376ef25bad383332a5d9c102295270e9854e646f4d37fb1e46a628070af3b8f5f36313e01e95a1c150a8a74aa2e13f159e261de397ca47879ad9e98b4e8c2a29aae722eb599d2a928e9e6ece331a461444dd13962ad59800a4ab9c8c1623205e190b3cf32b482036bd1b8d41a809da602b3fd68e66f0af45aa80fa806718bbea335c331d2ab4145d81bb2093ce651a05b5483be9ef499a06e4704162d6ac2658a8210f9bf55a98baf9d064480ad2a99fd855505e7d18949ed6f2d72972224c70789f50da9f59ae427d8fece636318eb19a0d0f80538356209f3388232510ce0434178a5fc8a6d423694e2445c9c2ee37ec0ca3932fbd91d8454621ab73234920144f3424124757f35aaa443c04f4350969781080e53bc648655568cf999884528dc509904e444bd56aded74f7c27e8c9efa398e66446d0b4c5313f098cc60b357ac6da42b0694b4ea04082549fbff90a521be567231330351cc826825208548522616257b028463d6089357e889029bec202d93b691ee420815bd9e1947d0237327ec3876a9139e3b33ac63b537c07492770d637388187175f00e6555426c4851312d5ca2274a460465cc39e7fd3c658f1579174bfd36ac7872d71b825cb735d6bbdd34d195d9199a1291cb7359070a21592396b7441a5dd4a8df25758683b2ba21d26d5b3cb2ef0a99aa1b4713acab25f41e8660922ff0e278adc034c1b227691a1be9a03c79f90042ec4a1f2e2f7f595d860104b5d3e7597a81bd118058fabb5ff93a5c675e308b836fb84e318f315d50721b35925cab00db8c511711c11b9324db9e713b6e5c31274f3544a97ee0f184d31c6ff34a407c81bce0b9a00ecea8e430a1b68d49f28f3bab5ea2171da5d0ec12a2cfb3d4ae24c47e0f2458605a3f2189f7fae3a1db73c8a8bd8beb3b335f0f958675c6e28976b6ac559117a52036f47d3afb0efec595671697aa876ec851cf876d0bf62f849e4b9f39e90c3795aa30a9afc575034fc2b02632fab813fc8b2c28144d15bfb47cd03e634ca983713b90f310fa0af7546592bbfaaaab40bc8115a143e5b0d733cebb62fc8a23c95adf44020a028574ce6be801801f76347ea5701d9f23c9d92d85fe9ea2627ba1d1a67a870006da16df79d6396a67305a99b853069e869427d9cb5b05a6d2b37e1aa784ed8e30e95400969e8ac8c9aba19d9dc6e4d16e1022bad8622db2ef495cc7c7b3bbafdec0d6aa441284a6b301e69333e6f053843859042592a358bba014f7612cde0a2e05d8e4e9bf65e2968f03e8ef6ec044731aa39cff82237e88b9c1fca511ceedec840e499469d4ab2590a8d0dfad82573befe6bd56fcb04a1c53255b7200db63c973a4d3156e2150b213004b1ffa5d7559ce4e4e3b3792ee148a063c8cc68404c007ff5f90afee2b6092aaa422e0e9a046b2e6024ff64e0e800f3ee0094583fc86395c9f548c13c67dad450259cc07647a03d93745687a36f2231cab47471bc3de22328784ebd0528f2c981d8694b2d8bbb080f7b115407531e00ad5b6ffb144b626488b3f163442d56145ee7632c4e434e5b662e38a5230cae1fa78a07a1a61a8518ec47b221d4d3a82289a5db0bbc7470129c3002ff8f8ec2c1febe43e5950e9869258f776e8fda012ced0729bc9ab4d9302493d2e4a9e8a5bc7515a05aa3646352b4671c0f69c656b023dd67b4261a12f705c0b11f2b0778374347db956bf6e3fc4e70738355b985992d43fc2b56a4efbea91bba274db10e163df3f61cd7a36513703528a83a2e1bd45c34dddd8e1e0c25c51661774f0a38a10cd0cbf465efe1159adc9809819303cce8c178ade109b14a58e1fd7f55e784745653f049cad50e20efc25609601e05e5c26d95627921d0f0994db46ab05b048de13a34ae56d2447138cdb34f5ce0f1ff062899d6d4da887db46dd09906877fac38c346e0c40db812cdd1d884fabae08fda917d53f22d414550cdf384948e2b4ea14750c4b6d5b580423b48cd5945196f2dafb604243a4ea6c9a25500a02b9fbf4efdd55a9a44c19f0c20688b630aa09969475f4106318b06a0cc2df9948393d999938a08bb610bc34e30e5a5dc95297172ac17a11123b2cb357695d732ffe51494d9036d27455f81bc52f24a91f1b2ef1ce366674c54b7f38b01a3e00cca76fa5a075389728882a409cf7bcdf171d53ce0f2ee43ec3b83755b5615c0335156b1c01bc8e1915d86f20bea9da3675af5465ee51eee97309461de6289e4f7331bde1c2bed8cb40a26093c759fbf4d8f6e02470d204476e694c158f0175abe0cbb4e954d01383b8c983cf2834e6b0c45dee326aa19ab7908804b2522980ebd3abaf9340a8ae0b649b6c8f679d9170b9acef052b33c48024a614078be497ea09593961aada2038be5973522d9689a37acb4993e3a7509ddfb12d80f828f90a92bf62271b3f952b981affb5abbdbe05ab660febd4384b8ebcaeb4f25df73f71ed4e00b30faea3965f86ee9d6973106665cd41f1ea8510a2095f7c4652ef84d1f2176d000dd3a7ecc0039a44e07faefe9c1cd3ccbb9596522b976e073e08b066644e5825a98b53d1ef4975617b6545631e1fd4b38e4a82c2096e5d8d8897b8281bd57ffca798c30ba5b47d1585a5bfb9e016de1ebf8da0f0a651028d164fa7669c545866801e2907c44e6dd8067fc2344140ec2e3007c3e4da538b3e5e2291e1ce00a0626881efcd364c09c9f3c0f9006a2d41541c148993a80df26bdfd05d06dbcc54be306e288289a58dc24726a06af039ac4afe2a46673e47a50cfd37979172807d5ecc428eca3016d35e29c64ad7dc0e33a7535711a014e76f01ccfc1f11eec225d3179e3a9bf0c1d1971e6859b5232d09a98eb85d241d6156f41d567d8bcee8ea2c75142cde4613ac859c85390ed8157668c0fc225ad37ef37ccdcd626ce61932a635f29380ce4ba70e477e714496f5373d7b458559ea8851d12807f539e36d32526dffa61e12411730bddaf4465ca273d41d72525f3dc93c6658d197bf5405945b7e71a53f00f5d82459fa003d2f81272c03c5735f78677b57c11bd5a6654546ff629fd2dcf8035d0792bf486c4b43129d8fb241addb13116b3951a4d2eaf72905e844478cd814117b5b430ca92959eb428f184c37962d26cc1cb11efa693df282a298736f5b1f14b9f810cfdb40c80d6b4d926120bad01423581f2406dd0695d0b2786794ea69836147261241b4220b5eb30221b6c95781bef2f199eb4aa44a47ee7fae4a08b088a47a975284074844ce37aad18ec03115a22f37e196b2dc72af099ca7dac8649267effd424d4014f05a7e0fa794c4e48a45d915880f8eb69ad9470195149be76cddc6bdc592f935a0c19e81df0185e42d209b06f70cd56e3b46f7e1e69d42bd704e93fa16d52e56f41aeed9410fd1110094be45566ad518c44da15a20f6358e30c15f29bdecb001f74f434a7d0fef6ccd2b1ade4224f8db5b76e3ca48fbe129e78f83f95019707d1bca008d3a32c42cf5551ba11263c1b42d72e09a0e4f2498198b538b63f6945a7e302ba601b97257bcae861ef25e87815b0a26afa1f9a9ede1860806e4eabcf83ac1082306a66b3166c7db63258c31ab4a11ef4d3f36e0c52b2d53b1de91f901d320dc669f2edc0bc6a233578cd445bbf4295e5d78a38bf0fd64678dfba8d93100e88201f60fc06865e98526bcb1abd0833cb702e3a47d21cb1a85b97fa6fcba81dd98f564d93e1bec23d28229766efadd8f2294dc15c06f870bdc7e0f6c0433e977a6d596adee94dff2a75f7e552bce36f489a0189f17abb8550d428cf1312df13399133345a0f8522ec6636fe5f2364784393e2f419d52d5391acf3e94a622b03b2d1b4e339565f82a4d4fd7998c9e26fba83c407507bc0818b1f6881c20f0266ba219ed5158885d7a85b127b1deb174388f02b4d09df8d13bcd28cd2e14847ceb6934c606927ce7a34b390e693293ddfcc30d0b7d73f27d6a5c4f7c8429bea64efc745187787a8c2b8d8ab4315713564b8f94d6d3726b9689b1cb9272bf9641a1f127089d389cdff1a015d620ceed351d5488d211710d96f7fda2182a6ca33673d58b5e1e64a65d8b51b8effce57b4cd454c682ef88f3534fd5906331ed1a689834b07614721cfcc184489c1f5d0f42e370dc4ee315c30d43a88b94c57574a09941c7bfe5cadb97f2a56d9fab5804834e4fcc62c73b49457413fb1fb66288bd256bd6a77c3bb44b409d16a8f7ad791e9618a82a57bffbfb8060e5f495dc6b02facc30f3111278e24e8fa9f3467c9a14b917c39a495571c55369b5379b6073686b124b6951ab37e774abf193d7f3c842e00e3d6937511e8f3443101af8bc965e3d7dbbd690f90f4dea70f44a10abaa6bfef6e35fc833a39a99cafc04d8c9118e2938a25f4a87d34c0674045def1c2d902e41ff4e19ecfd5276bdf17b7e09d760f0c073fa3b97ec98f185bf29563f42f566d4d00e620a2a064d91633e3d42287fa666580338bd0b5139589c25122205db85f0b3c2d2b40b60162c52db85ceebf706fab4920170772c70680f95e9f0fc975ebb10869980ae9af4f5f2a951b8540384d483ce6558da8aa2b52e7237695e1e6b1c7d6355c4dbf5503422b0a9e94268bb6d58cd2f9d21c7c27a582620c0e03ce2eaa19712df0976527aac7d2a3999f9c03bbc0822c405e10005c46f68714230f76ec73a409977011a5fcb0dd5f6f16bb6ba858f01a350c96d0bb8133f30bd4884b5f30881a0b9a359e573bb5a2a7c9e5700a85b4b12b27574efd95137fbf2f3d8a10b40e63089b397e12a5f0e604788ebf622f3d6bd7c803998d59a3942a22e0b7daad8d04fbf5ea6acb61303f33c17e92520f9abe15c2e0b8a0d6381938628512d450abc08b506525cdec4439f7bf626513a4b801c37c171db8c65419c70be9994a0108cbd825ea4e57aad9287b8eb27bc6a7f2a046e389ec075d884a202901015b51af11a13622e92b54444540fc8cea3d81e2e3ee6c04eab27c44165cc41cde3cd510cee7e2420d2208397ca061d4311ef16ca5dc92dba9e4199b6df034948203a01c1f4fadd1632f693ae55fcaf58231585584922ece27c1c509bdb4825585d30dfb1ebc73e181ce55bc3edcca27cd436f086e65be51c76bff0cb78d26d2ac1d269675f69d95ceeb6c1ab551c0abcf2709da25ecbb743625f0227ad0906d6934987f37ee3ae21cb5129d5d8b722bd7ff43a292ed57c5942f1a5025683095a15bdc0e9facfe473f38c8ff32a4c305e838d2678a145f7bebc584c0667e0f280ba37c3750be6f0c222ed05b8a8b67576e9f2a1585d7ac23cdbbab472958293673c169272034574267ef8e764657a78d8f6c5bb7aaf28b31dceaaac68d984b7fc643a3cc8e1711714101bcea527fca4b2d59260e49b35eb2a5bc9a4e1b6ceb0020d95152ab383897007023590fbc9efa81b7ecd0eb67a6bbf811059bed663060b426a63caa919dff97aa4a1a4047b1f6073e94306a400ea0caef48edf317af0ffd8129af753159413b74169e438c9d960a387052970280e62759281cf917b6572d0c5b72773ecce56a4a880b4e7df6238677f48ec88c4677796b701be3a931304f47c95ae81b3bafab89b6bdf1d8b09df2993bc47c1e86dc0dde661ae54465716dea16237f29a82d4f16c87c5d089d10d3e12a6eabe00ec156d5a0513427af6f0a85e022a9821840f2b88a11fe4d2091d8b8f32b2ea18fe5fc7ce1511b0f623b6dbab118c2a664f859fd38395115c5c23ec023f1470b2004b240d824c0fd4992819528e04f234790d1699efbded710260d40ace5bc71e633ba65aee0f6f49d1d38e1e4d161ffd37dd860e9d97e12da3addb38353b77fa43d6bba78bf0f9b65d4e6aa0a2056e64fedb32cf3e8f0d7223a6eea2a06d88a9c37035c551f61c77a0703247439afd5a1ae5df99d261481e6f031249ffac70f16c0b79c5661e853dc75481de5194ec6e923064503d086186265dafcb2d99cb3fd303525851c44bb87a29cf860d6ff20b87b6b2d9b9eec9edb2eb9730a9f909f969a193f760d1ae7493d6028cefb7a2c5aa496e0d964f0a66812e3360728d80a4711ec05e3aed57770ddafbe6caaec81f75606ce6c882ec8db2f1afffd07706e2440f16480523145e7a7791d0f39076236db70e3028346a655958fae9b4cf75f3f1f91c2b856e53f67534c15d935ede05f6934d03009b3cd0aac0f1f1e71c2ac46eba80742ff46d6ef44ca1ed244217fff3490f14a095a08682522c2e6f197b1808974b069bac68b726af30140baad6cee9caa1c1f20721864930585e9bf370c7808f3e194a8ea0124214d8ab4cc078d0268917e88ce361b64a8b6594624b905b95359d9fbd2636195f85f89752add80479353af71cea366b1026e400bbf9541acf45f346d114be2f561722c76c0a708ac3f09817b5466e5a958b9cd84787600d10dced67a9b6f97a58f0b1901cc754c6a4b7b8bbb1de390061ed98b1ab57bb66cad61150f06d1b1b4c59817286aeed068f3fefbe7fdac8f57d700db747ca7d0f033696f6d39fc7d0733098d2f1fe049a3844b00e31e676162b22f661a5cdebca09e8edbb4c91f88da0d40e8dc853453a56ea8048f59387bae9b6e928f8399734b9a2c28734e0c03ef0ac9b619c0a899ae7781261604ee81338d176b1f67bc61d09deb98743f78168ecaff4c9d0f35e0fbe5b8ab048167d7a3f698f5d9a15979083285ce04afdbb09a86cd8bd3d85237c68779065c13ebcc5c011a820df0ee82ca3e1a9ba49c3d1a51876b96fab45513e4a889d19f9413948350410cb902ee3f9236d6e33930309afb92212e540e83760089c17694b1ba13841cd97776fdbe3c2f1b256baac0ad78d1be05c345dc1d8285342a0ee74a5ddda815037eba4d621d692cbf85c033e6ff24aad8beaf258dbc29ad0cc7ed2058d937f16d3a5f4a319d5aeb4c250056324805d1a3348ab557a867a3ef2d16891905c9573a5acecb01e8d3b41b170e6ec4c3db9d9f94346258894d3eb0ed7281f1772e4593a1f7a3c2e60352d33c0ae0268874a36d005fc7f3f40ed5d9a171450178b0087e812abd117f1d0d9abdd983216483af998c27c7257399968744a23c851ee08c464d5046f8f6618afabfca6b52a936dba8e32a0fd8b579f0bcd16feb726d4bbba18660b3879a06189777baa7d2904aa36dd0076ba5217751a008997b8e54f76ee8fd7adf135022674bbb0592706f2258bad0dc73b11e83f8bbf65565dae9d5cb872a93b405a8f2fc282656684fe1a042235d34ca9be100a8ae5795ca1e8bfda5b1a28a1abbec923f4f4ed1db790e5caa6491c646f2917d3b899305842ef0167b9c14a6a41dac8d054f763947ea1c4fc44b3344b929131bcdf548d9bfa038e108d292692a5d312075deeeeeb3b952410d8e00018603acc40ee40ed8e5f9209725178d15d5f8f915e8d07bf61e667c3171b4ab087c420f0825a87606da7545a73f1056b35a0811043c63e3afcceb0060cb0865fa260c7e0e51ed61f9e686723e1c4e8cdbe14e36a5612a9ac0ee1091f9137a94764a17d96162b982c6d3b030277265e44fffefbdbd2e2f55f6e8933f4e1245273f664187bd4b59f66e68f24cfbbaca31edfb3ff84c8630306783ec24624a393e6b0591f0d40e99e027247cc3d928d357560b9401daf742d74a526e4aa58daa011a7dad4298c4024ad699ba9edf10cd794640ac5de7548af5abe25210d5b5f40c8698378f64728268bfc46a1377bcc428d31ea81abdd396febee31cfcbf65b5055646a98085aaa70dc2b59aba189a83a1585bc44e18451a7f4d298e14f7828f3dcc7bfa5004f4fb3be6c380d1d17c917da2cda397c68c9bd3d64f8a049526386ecd32cc8016856bd303ee044642caa95cb40b1c8fd603265a68ae09d617fa31a93b99193ded7e49d963f2869d5bf176dc9cf65b7af7e5a6f7201c59cbb197c9e28ad2ce1a645a0444d298b820f23021e39644a368818feb8a04b41a6976f3330ce42c1f776086a41ac3943a8168b444806af5fcc8288001e1e97d827fd22f8492edff079058d3ba0192c2a2bd6a3800f476a2582ffbf245be987388a565ac67f0ec22b47a97b8b58070c850b3b5a541281af24d31868a1e4eede6304302d899ea5a78d4028e9812fb9ef3849ad04db1a4e3dd7bea35d405a5e52f5ed6a3c012b38cb0242caca405efa7f95c334435e05c6feb5f38bdd24ab1fbcfe2a4cd45bd350e2fd06dbeae466bdfa25bb00720306bde6fdb5fd7cee751f6d5035d98dd000a490a6b213eaa79088d6f2c9a72a739d740be7a0572a389e291947d26d61622b06db11780a8bafb83d5e0b11a7d58eda6bbad00633d7e5c208505d4339cb68f52379727deead40595eae2ae1c0a4fa56160748ed85f80a22f3b42f981fc27272084bf3c663f550025e33569feb1427c3d417f66b5a730a3c33414d09b7a77615cd33bb683fcfe6bec96ba21cb2fd6d81ff580faac6bb2dd8168623a62a5ce5a283e5a4815c5bb51ebf8fda1f95ddc34a5e7276cde5774c42f8939c03987a53c1a67eec2e2d209afa3b0002bbb736b1519a1369351f10718796e137d04f7b6c66aa6f4f2fffa541be923fcbca753decc731e1e9420814f15eef6d679e4b6f2d64a8e6e65a949e5f44cb6eb5ccebd1b6be00b39204224e5450ccb8bb5a4dd5952eafba76fa774a659a1ec957fa1ac061c8664fd5619091de7ee1fc3b608bcdd610ab4d97997c00ca5d40f8a2ed7c84531d7b06478b3fb89e3284ead954a75d4441f5571b09d27918a3b581310b086cbdc16c17df65491c018a6d19b413994abb7963219e4f86a9576623687056a64ceb2e4ba9f9d9f26ca58428d70cf9d244995653be04e10186b8d61b0a11545c2d2df84460cbaca8bd1487ded85a0faa9ead74d58d2ff602c6e16c8923f78bbaf74a72d50b9dade4ef71a16cf5add2b2831da03ecf06eac9d46e0f14aba3a70fd2b3b0a9a3aee6c8d0815a3f1270fbd25ce72958be24793c8b2c135d1aa6baa6890c64cdacb78a2f5a7da619d039702ed876a9d4da2613fa532e7cb2dad09f7073738bb176a27acd33c89905dd87ae1695bd76d96094bddb6571ea6547fc538823c33412fd16845baec1c081754a666e45afaaa780e3280e53633b935a252c59fa8316da924b076bcf5ce9e8309b7fd5d315fd3d6a8d966614056aa6689a9d7784a2d6d32c05910cfd4b45cd3491d24640662e47a9c1b4941cad36cdf3ea4029acb1d1a8d2ef5446044da167b3fb99e9082327fa809b75b5205152806ccef4875ded28b19aabcb57516c273fd179ff0401b9fb61707877d194bdd962bb38803840bcc6bc4f18ead643695f3debdab207e581ef12aa37e079d311e00c53ecd1a3d98b392cf6077d6cbd54ecd75a1052c7210b6a9cda5e529bcf8dd3716591bc07a7cd6540114f72b0e53e7d009480c90e3e252ac292425a1719c29a45b464dd55aecc7ee41f19a4ecf3b4550509cb04804a92b0969c34c7250bfbcfcc4139de4781f3729f307881562fd0cc1ad7d36252c6662dd788f8d656b09ef4c4be2209668db49f932257511ce2450901ff00a2f071dfa2b074957910279d2c974ff60ecda8187eea25a188258f6431a456a2e40bc681bba9b0b82272a4fce020b47a6871e5aceecde5629ccb7580319aa1fd9613e49f1737e456965448ea71091a4c523fecf3aaa6ec1b1c130cd1e047cfb10ada8d207cfdc27aac4da36edad44ef5e58e36419e7d029df2d2ce48313ecd560ee60328db736e8a4152c5444979324682612d53c0eddab988b2da4e7523c39db47fcbc2e116b56a2732a98c28cc7274aff3bf834b7260f4dd349fbeedea25cf9812eee340f7536575328b965f3388f0c769bc34a5e33729436ad982eeba23b8adf8b8447660c63beb89ffca7a1e8227e584c6d2ce379cb648e096cf7c68feda1596808ab13538846a6e8eb315b50f70644b0ff7509f572fc5644a591348b250af90312808d256b73f4ee227367b9b5d3f95cbd5a4fa56fa6ec2bda11a4dfc59b31740bac1fc31246d697bc2f119d806d31412ac5e0a13f7e8563276351c8cd9b480feffcf9c06be9612b82f2d67af23ce7a8526bea4b363c0d445d6bc0c808dca35fb30761df7edbb804652a7d9d75e9e4aaef0099d0f90decff014760efdba9c84836fd12dfa56ec0555d4492f895f3fd17d8ada6c424bbd1f8b5bbc1d229605b21fe66aed5ae0ee3cc3f3b4d34157ada1ba1c90f5154a0f9eda13b61aa38014d14c4b676e86a536bdd9028e2df898bcfd64e589fcbbb4975d0a7813d03c25acc4fbdbb679c7a964d35b1e9f4c35719309b4bb751a41d2febc7919b0b93ed475bab9d3885b98a49cbade142dc85bf5cf9f62f7ab8f464ea48941098dc5d23a74ddf52961d159b75a3d3e8f24aa08e7d1e4f20e3cdc77617a731e41b4693eb182fb8a662f57aea9d3f54b2871169ebbcf636909633a0934393cb2422df20eabb21038486e069d442021de656d6a3183980a2c728e49e52e92f167a76857b33ad5f555b8d474935629ae3a46a3d4753db6356902136fe3de945db8474a1eed1a0f25be584d1c081ce48012918c80ed6fe714e9f8b8d597e0e7c021eab8e086689591937196dd164f04119c85963858dcf0c117f3a0101d239d510e26936bd27ab22b0c3aa29a5ebc7d0469f90b999ff3f568c26cdd9da96d6a8944f07418ca5eae6be622d3073b015564a1c7a5ddcb265a87bf9e0ba0f323d359d0def363ad35008327adbce537aa80f50d4c8a7c0dd32cd472e481df86b6a0a61eb9b11223f1bcddf66a938eda07e3c652015fb9fa62f2db430b41e7882d1b60532ead400cc5d23b0ec35486de308aae148a4e0867f9ea69d89473d66c01a0d6d0b038148fe75936e5702e70fafc4520e3ba910054f632581454549c39343ede2f027251f1852d02e999832a5c74d1c24a54c291187a0dacb5838c6bb81508090a9f39dc50b5043138f6888c503b0e484c0d61997433b14034b2cc10a4bab2f5093537043d00d03fbde08cf10f8c1d09c827fb8cfd529f8cc9e6091f8848ddccbb4c01d7bbee72f00c569442ea93cb755f88ee3538baec1d76e99fd6d5bc51f7377f173a72dd6c27dd754c756fdadcfd25af8b26d22efb335dbaa7773737ecf2c9d38d86acbbcd7977dd33dd8d34767d65e8a24faacdfa40b7ee942e0d4dddfef2bbd321e86e7fd8ad675a57b3465ddff9bbe893ebb69f74d131d5ad4973f7af9cb6e905449a68aab140ed1c4d2d0bb04ca6756b81cbc9b4b5147011491bd602161034655de06292a6d6055826959be54c1bba02af07694b2f609489361a0568e369cabac0c5044dad0bb048a2756b818bc9b4b5167009411b9602961134655de06212a2ac6f841e0851ad220f20aad0b85f406d3c6d5816b040d29465818b49e1b23ed0405f80ebdad088abc0e5eed33673011d87d1c6540188b0a5297781cbdca76946011c1da7f5890211ff96b6ae022e874f1b990538084e53930522fe3d4d5d0558629fd6330b74dc186d270a8878db73bb199ea6930220fa86d6dd052e7b8fb6190be8309c36260a40b42d4db90b5ce63e4d330ae0e838ad4f1488f8b7b4751570397cdac82cc041709a9a2c10f1ef69ea2ac012fbb49e59a0e3c6683b5140c4db9edbcdf067831f3ce1c17683e49044d16898bbb2fffbc64414bfe350bdf76dbc7f725ef4082fcba797ceb37763cbcb2fe38d8ef06e777ad78b8916c0350ad47efb9ab615fcd803081afa8a4c744cd393d5f75e6958c40ae456da16b107d595d61a7620b5a0b1e015e82f692db8038a052debec4164a56d912b6859692cd202f2571a8bbc83ea4ac31a7b2059d0b6c03ae897b416b003a5058d756f207aa5b5c80568adb42c620d722b6d8bdc41c54a634d3b90c61a8dff6a0a80c9f89f9f032ff2209bf169f309632e20c28e07acda6067db8c7e7ac44651b5f59402d091b25fdeed9b03ad8b734c49f7cc7bbddd1dcf85aee92eeaeeab7830ddd31cea5daf0890eec3ccd4ddb718e05d9b198adda7c820ddd33c145d5b11e0dd97f9d4bbb738605d237374dd4ff180bbb71954bb5e31c0dd37b3e9ba671100bb367314ba4fd181bb6773e874ad62c0bb2f33d3746f1180bb56e640d1e69f2f2422501e3c1a0d07c40960321f78491e64f6401c847ecdbad661e983798106bcf6fadf5bc7ecd55c4bd7f7ac2eda646febc18bdeecad41ebfd27f34e4ff2b639bc749abd1a6ebdbe73def4042fb6c39bbed97b93c6fb376b371d825d56a797ceb357d38df73fe7858ef066717ad7317b6f6c79ff64bce89d4c01085360e523517e6b292a006d7f04cc48c738fd9dcf08e01a3f3076e3236875120dca19802701ca49965003487781411caca5bb95ffdc0f31213ab3017b6a2db82205544dc3ec7b5baaddd213bf4418baa106dd34892e3647379d79f7a656f77fde4d0bd96575ead23fe96adc74ffe65de811dd6ce7ee7a73f7e64df787bc8b1ea1cbfed4a57bee6eda76f964bad111ee2e9b46ede6ce1476c5bc2dea6e1b23eca60e947445de2d74571b23efe64e5c6ed36f86ebc016e5033cec28e33cf48825002383dab920952ce1aa4c5ec7a2b1c6cfda4a1e9088b5e9e3d843f98d2a34cefcb570dfefbd3b335b5d6ec23f13616006a437047a97bfb359309a15a70db99996833e2576bd391bb15fc0cb45a93e67943062cde4ada1dac83733cd1a714fb7b8951032140de03084830008002036c048f04e42f3e1b432d6c604f521033d644429eb0dadadb1db2f2d91944422bbbbbb77eb0a1b0b300bd971ddd5f7952b72bb13e381b19c79de35ab4edde21df231ead7eea00f0a5f945ad02f7238da491d464a38b797658f05ba4e3e3d013f95d7e39f3f2d68ccb16708afe48978cf17e375dd7b5d315e5b66f430f2444e5e1ed823775e4a4177f76596d1a75e61e7b5b0d023751385442342dca50b8c81151f3d085b1491c2cdbf22488e6cff8a48a1f5de03935ad03a6f78130760130710fdedf7d00aba833637cf6fde066fa8d05cbef7de25a55f184bd7b418a9edebf2fd7efe7b133ea94dd7be433eb7d6de419b1b68b381bc7b9b0d543d5ba5f537a57c6fbadc32a3bf5ad051e74868c79d8864479e98e4b144d776acc263894c645abce982ce3c668f0ec88e695b03948059b85161c7a02a6fbf79efbde8f106e2c895a782373658120b88371e761007b2fe22490277801f3de64018e4a3fe1b0be459330fa9e08286fe7edc7041bf7f45bae0e3070d74f870f2b81264a405a786064190e2064950a2823edcc7a0a78afb450edbad0504200f330340b843fedc36802384ef3df95ef524de7b90461aa3bf6d237c0e937cfc51e18b113e8f1b7addd45f1604ddef297c98e43d099d4785330a93533f5153ea548a12b6448b2d4cf237fc2bd21a4284a6a5e4b1ccf4672a913e710bf873c2d09c3fbd0b6d73eb601203c09197fc3d179477d549fe225db0ed464a9ba6e79f5b2793b576d436698f7aeb64f235bd956e877cedd74b9b1ed1a34d26ffc8c4415b375fe425276d3be48f4cfc8a9ce430eb4187f4f9a34d87c93692c99d4cfe90974821276d1df4411fea08f9c8451eb31f46a2934d7b68d3219dbecc82a02fb74d944474f2b9a9d72ce6e4a3986bce7965462fe596c0e8e7a603ba896977f04d10bf4cb4754abcc8e7860eb720e49378bc086e47c8137fd9843b688749b44fb7d6eaf956db0dad85308b8130d26ee87a93b68ec78b1c2642e8348b81a27dda3af8279ffb843a9c3939a17ee2358b39d95a74fcf118e6934d451b663ee0972897c1e08ff6fb10cae102521cbb2f29db8b2bd0511b6631210fed1b39994dfc653d988c44bb7bf997231dd6d37e6f72bdfa4b227228f3fa048e60c8312c8204c95f1739c6d126006a1d22bf0e377c28437e43fa76b28d6468ebaac3adab2edadd9bec1fe0dfebf53ab699ee772f37edf7368bb95e34743a046398a3a3d022e8ce88df215fc789a3f874992180a64ade91fce472eb4c3eb797c89db80e23463f7d6e3aac4bb722e7e11e808a975e02f2d04fa2f083d62eda9dcc8b369475e8239fd64d5c864421eff487b64ee651761b6d9dcc4337d93a9997a29067533b0cf9b41580f1d647dded34eac6fbd0468fa0afc348bb45ae7717f2ea340382e4da6976033ec9459b8559026eb65bfbcb12009fa4377a44cb0d064172d1a683e47ad351722933226db3e4d565f6c3f5d2f650b61df2b7eeb44dd3b643fe894f8719024e9c6eddc9ee9878e876438c619901a063c7321f468f1d6e23463632906319810f7522b7deed907fb2754b480458d116dabae93ba49c70eb764cb8857780252f0b027b13971be4a1ddc10ffdc865160372fc62779f24457e22da422eb7b50918bd1cb968c33781ffac9427a2adbb7fe271ebf49fe8ec003cfe04e4d5e506df64d30172ed831c85f6838908b8fc658f87ebdaf13b807e45906cf15ae69785b68ec7875cb4bb9125f989e864ebee5b2f9df80d5169ebee8b9c94d22ff2d1d6e917ed91671eda15801fdf64d3217fb8aeb5dfb0d67a377aeb72773cbad1b623be0c7deddad6ae7d023c1e6609782f72b9455b7ac861e4833aeb9a8776c7c4eb23e8fb9d10df55b79bcce8b57732230d1f0402edebb0e3e16526a762bc4d81f9c3362646aa2a2a00ff9e703fd1718040772f1fefe85fb81839a38789318bc10102dd99bad2474f29bd1a3f5ce833df3b556810a05f2bc747108c7c1096fc6b25818a67f9d70242902742ba10e0113182882d3ebacc8b8d77044b7f2a372572f1cdbbe3fec5c4eaebb36104de8830026e30d2655e9e772f7f5d1261048639113246c8baedb88f39669dbadd50d54b382a254a382aeb53351dd66c9d9bde77a6972bf1e5867421e245ba08b1b303b7d01de7d25f6a414b8f0edd87886d43ee972ce8eef54427e20132d14f30b7a4980cae3f156baa554abb9a8903880e9fa0ed8f4fcf103b3a39300f4e2965177b224ec4d1f928610ff8231a99a929e30e11cec0991e52cfd07a15b93823bdbe98f4c7a7dde5863391eb11b90857d205aab4967989eb39871228783714bcfe5458dee0cc0a27b670220e5ce17c54a2615582a2fe7e7a8c386f257adc792bd123ce2ae2c41dbadd1c39788213d0f844fd03fc62e85a1353ddadf9e838b5a602a954cc2097556b2a2b0e203a962d90f1b14487d106d4e14b167cb8cdcaaa3515484cb1de86825bf4f8f0a317b46669158e71fe983d4c70f31108abe6b1c49959236be62a722be9326b4d376b14205573b32b21ba9bab9a989a3d4c7059970a34ffa015428084216c413523ffab913350cb99ea72574929dd4132436787598c4c75bb6badb5d64a6bb53bfbad9e731ca29ade4e19a59caf35b79ac45397975a6ab16ab1c90528a356a7dba2a84f9fa7ac87895852af5b62fe5e9b3e94b6e0e03011d73de71602d78d31f1d8bd1b6f221df0295264e5036c02ca987e1d435987340f5b0f13f1ad4f88c855b73e776d02caa87ee1db9d6bc5501bed801f5377f7f237db3af8d93599734edf6836d972e7071ae4a039937927779040218f25df9bbdbcecb9576b932389a9225e7eeef0c4147c18daba7b75de3a93c91d6f1dc7b5b43cc81fcc80e0f113bea8aa40f930fdfa953a8f6736d9ef41efb1c024e851e4a06b2804ddc91b79235b3135b71df05bb6182944e4d033298d3c8c4b2207614cb2634fe470d8d127ea489b57633ee9c461a20c22c44faf50091abbb0a656c7295faf8de478ebf28ef9d6a5cf2dc3bd49020952445747627e75e89325833c7cb863f650fd889786344880fb926bb3c7ab311ffaecc0db01ce3c19d021922daec8b14115901cc107f4f190e4b0890f3cf44e2e79e83374b49ee278860622723a291b0311398967d42a6badb5d65a2b7d899cdc521c26ca3c9ea79e42b7041ecfd74d478a9f500e1da7ec93a376f6f8653d9c3cc5eb4e7191c851bb838ff2c18bfcdf0eb2e7c9802ea2f1228f115de48dbfc41475918d1739ccab010017794a4cadb8c85fe42a3135c345fe624a8677dc8b44f9452ef21953ee22bf3185838b5cdee84df6c0fab2864db7c344151830240bc753afb5d6cac9b43c6df9bae9983ed27ce4d37a8e2ef226646d76ebd6a794d048e4a6b85cde80b60ca9a8c1b86b9bdb9c5bc5ade6d447bb9369f917aef2424a1efa8577f28557071253752b42e56b0d9d5fa58aaa8a178e676cf8326cd81c6ebeb2e1b740cee10d7e83c3448cc3cec1650f8a4314d78165e763384cc4d0a6073c43db171bd6da2d011dd66568326468bb833fc33baee5258dd1858377a69618f1e5d530915dfceafa299efb0826fe3aca11b266c6b6e1b7e070a31d3a0e0ea18f70d8d5f57e7185ee1f6da8047d3974e94343bb65f380e3b154d0bed5658d7479892bd5e7f6747b7bb32c2e35af2e63b338d66c34a083a02e3d484cc9ad081b2f59365387ea2cfb452ec6bc7c5e1b13365455d02d87ed0587fd7e65bfe7f60d36d4b05dae5457d94044ae3a00b6108fa5fab65fe4f67e9183b15fe45eb8d85a22573d65778fe7abc34847edf7283522cf54d04fbbbb783e56256fda12e0beb4e92079f59824f3c813b2010c84e45c8107520c51c1103cd624e60f6fd3d7497218496538d276b25fb4b0c831c5c00a27fcf85104204bb0d0c4dfabb5c9e42e2504c157272245165f5d854709c2b08233cce0e70c1e20a292db8b1fd8102d1852060f2c41c20c9a30b3052c3a434f3d74fa2e7f076bae7f367706375fabeb225f7d1453a2258c6680055191192cd1a868e2e4825c848a1a80aa4681aad32e9c5c89b56eb76eed43d769068ddd143930bc95e78419decafb7f8203ef9f08c193f150fe3d17550e84f0565e4a9503243ceecdd0d3ddd2dd999e525ae9a5a3ec9ad3faf3d5d0fcfa8da9ccaf63edbad5f6d536e8b36d7bdef1abd1c11a1f6813a9c81ef1e75209e2141c909e6d99d123e8fcd6e4b3e39be967c775d65a6b85b5ca1a69adb5be90d661e06b1693b717398a0d301d7313dece056d53742bc264f288d14a1f7d26551576a380fcbb6d1dd4ed3fdd1cd39dc44c07677450eb2f7295fa0cacde02a47231a8ab4c538ad4a37881507f91e34a10484c95ecc3608b2230f8c29b4cc181294af0d353dce6a7abc4149ee28a9f53f4e0a7d38829fcf23031432b618e78cb163f5c858696d190a1f153e5baccd9553e43b849294d91cb397bce59a3f13295652d308b915f605e2207035f22175f6c442e4a37bd5c5ba782f18e948949f6de95e90df55cfb73d4937e3597aeb97c36f341baf612b9b7c1c49494d233c772c3442edb542217b918ce411b4abe647e3fdb503f64dab603fa203ddb321ba7879179f4922387995e3ad6bd98b8cb73e4acdb171b30318b817024a3f27493a1f19303ba87f712bedc9e145268a8c9905385e0e1f9f9e833c90d20906c516fa4bc2e71d698539d233939728b4774620a6e5bd4893930274747277231e7b1c41bb9f2bb8ae715a3361fa94f9e34e8e9d551d69feac915949d3c9347bad49a2b27cfc7fa32f7d4912b3b8fc50950def04c9d979393f372e44dce921c24f506564c0375e6cbf0504c3da64ee2bc0c1239691339c90a627edc66e4266ba333724508eba5575654a2a78d1690e8914aa77fde3c97ea728b34918b35de41973534f147e4e20f31a6e0166b220d8d748165d030fe88359126fe3cd5534d16cca7a2b1664f1c68b875d226aebe8b34f147aecc55a441c190b98a342800326f621522c4d3c1a1859c8f9ec3881d3d90bc96749402a02a87f4b7e1382204f56ebe0961cebcd788b7f2600e21e87b500707128ec20befdcee7317c308c4912838e98283cb89dc1113c2cd882be4dc00e248143cb804fade7cf4ec2a34344cbc91f3ee9a721443a200228970df459ba7051f1f7d723162d6abd56a156fe0dc5185611613e3a846cbad2504bad3da6b90c49b182712fc62e897172d3eba0d2353507faae9f0ca95fb6245135ebe66480d101d28806e95388440e24b58fb64b887764f711d6ed3104370e478493ec6e843e0c8d1691ef4a8ae3c8e26e8fcf2f202638cc871a3efb8111450f8d426fc689d05d6471f25a1848f941ab96884de319f6e49c0d5fbd994a8f3c297444cbd159648d0df31b38a2fa5744f8f91756d6e60cd8da939a7e7989a5b77b75706fd3ebe1753fa6235737bb9debaab37d0a66dd9d6712ddf69bc752f9f84741102dbb68e6bf16beb5e4c9e0b215d4cde5ed13a0f10227271056f078a2171056f070a2010047318402aef4d9752c3cd443f9d9f7f9aa89009cb801f0e5afa53c9268f03881e6b7477efa56feb7be37b6febae4ddf2b8449fee8ae82a10349ae908412945239060deb8625039eca0467b82cf430a54ca144e4564cdd13e2ed249478c0134be4464213e56d81d5c90e132985183f87b1849628ea05f8c01128e1b6a1688c49f410918b46628c0e8db4c4084498f3788648f2d123f0b68051c618638c31c61825c41153317a0462e6c3fe29665c95f3ce1157a210114328069d6388886d12cfd03407cc4102524aa90522e700116d50ed70089e27863c0104ea60317f01bf189afba8f373a402a1ebe0a382eec41224f10b3c7f6382442e566923594674a4863a3742221733ef6a853207665bde44ae6ef1de78f356327f8eb32d75644e4c3d97cf1f6e12073a21654bb6e4908fee9d36e2ad44bf576bd34de4a4a06f22176f660f0f0e4d7bad16b9121f8e8d42224e2777624b470707c94c4d19a144027ebc8938114708b438307b5b073d461c783ddb3ad3d65d9c2824c63c5f566d07edda3bf9d2b1d71bf928d24d1cdf2cc604d60ce3a56557c49ed6b00c0969f21ce4d5750692d1418c1f9d70f458de8a183de6d1250bcff9d845fd6e29441e7162888ecc69e9dce00c1122733a79f3d19f134078fe01c0ca9423e0150f55a7bfe56539a0c7ddc1997f3a9de9e70572243aca07ead2e9867a1e0f1361226cb53add8268c03ea24a34c033af29f139a7630fefb9c7c23d1678b3abe094ac92b7949487d12fbff6721d397879d571755a455a251849f2a77f2d1ef83cabd3331fbd8310092b481502933c4bf3d18de0444e4a297f5aa03bf9d30216cc15b4f247fed8ad03fd6df26725975cf9635747627e2be84efe5c990c5b8f735fd655e47ee077f2a7e3f17249e422eb3954450c5959687aefbcacdc78e7753ebabd481ef33c4ef251033838d8553dfab524ba54efb8ce3b1308eba1f98b2ed986fdc818908a05c159601d40500ee808c8086808c6c1c9e2ed20c9f064e8e0d5f8c93f720564235db49c1c9b1c9b1c900dc8260763d7758c5db7e76acc7471b27b3576cd6cf267ce39ad945b77612b6c06fb81b1b4edfa81104ae87043628747871b6ed6abf150281cd9df2f8087aa4218f111bcf3d17196bdba945b8eea19575d09908336254c2f996b5fc0536925ee66d2debd50d55385bcbb4f08b9129d872a6f94dc90c8511dc7a6c40df9240f954355e6dddb016da81cb98a22a6403520a37e5055313d6f5558b79b1334cfebb6aa28b9a170e4064055f6500d00a11a0055d5a1aa3a689b2b090281403cd265e427de0091c84fb625aac80172d1892f21f2d136f2a7baac3cd9a3fd7a403bd9cc5b898e6d93e66396cd88f6cb703cb9820d40069d3df3d0065772e54767db9569e0b1447f5e57209b6bf53549bf4036d20bbabb7e766c864497bc65c7b68ecbfcda3a07ddeb27e4760b19d1b6ce7404e45a3c928f9b4d921823568301c17ef87818cd476c267275f5cf6516237f3efa928f4a22f7405be497e3dba01e17bc1a15d0cf82b7837c35a03403197ebe50b7fc2357de96ad1e4b68f5a01de9a2fdc895e8f76a3f3fa09d1fd0ce0f6807e35c3fd7e2231bcb2d3189fd4929dfbdd7b1edfab53b1ef2ca626e10cfa1bfeb9777175f0b1335bfeebdaddb929ab58eb94c15be37ffdb2e0849e4e4cf07418378403b91bbad8f7efd48172d47ae44bf576b93c93d2707d580eab9fa53d5bdc406aa67ae44b6a11ab044e6d99f4a89ead916bdde1e1eb912ab40419a873f224773fd8076403bd70f68e7a356a3d568355a8d56a3d57cf44babe9b952e3aca7e7a35f3d194e8671329c0c87935ec870fea920ebd580f2c76e1dc6912e4fc54315bd6e1e2a9ca305cfe83bbc751e71a0e9d6e51fb95d4b5a58fefc442e2e99abaeb2b2a0dfc5381fe1b624e2c4140ad64020918b3e67a40bc6793fd2e5fa792bd171ae1f7cfd7cf4fbba7b597087f59192e1ad44d70008742d81dcf9287f7678e4ca15f2c7e70af9a3a369e6b53105fc62e851ce8eb10c9f639cb367e3e557e37de619cddba45b07b31fb0cf58d643c869ce3e6bcd5e3dcb622add799b5abab8e6185f6bed13597b6fcf773becc8b3c344d804dcc13a0e62b4755b17b1662db675eb66de9dfe6c7b5996fd65d5b3ec2fab9e65e883b70ecc99f89aad639c1d6f4fe60cc39ebb1df1b3d7ea3b2202b02475cb3a995c6bb6d52d53cc6122dcdd34b908c072c52e5d5a40d9ebd6f990bd7a75980591bde2ea78cb6aa55996f530f2bae9a88e791e659a7482478e91ae133a0a6531d9bdf7de9bbd66efe9ae6eb2a78b76e679538791a190894b6d33d964dd40d5daeddaba659aed1739145a04ddc9e49cf1a603f3ea39a3582bef6e22006f76cb75cbaa94357fc6d90ef919fb9579cd7ac8ae036fd7691644feec30186b79eb26c0e3abdf2ccb5c673159ddf46d7d5b6dc515560ff7ca445210e4df7c35b04fc71ec4f4dbd25b0b9fc56e7a7bc35b94b7fef672798bf3ddfb6dce563bc23e3e799bdfde7c77e8ed95ed46513aba1b7bbb5f112f94e1f1c5f76ad3b3b72896c863b139266ff7232285cda3c829f4cd77666eb6f558e24ba2ea6aebd5884f448a9acfb8629c9ad3aaad9744155d02d5884b8da6da7af8e67cadcd7bc710d7da07dcb8d6f290d97cadcd32b3f95a9b651661961d663de0a78e63befbf41666319952a7d42ab1143f21024de9298b28a5d45a078944a7286c443a56e7e4c113a99d4efbea717dae920be86b26a6ee76a2b585955028178bb66b65f73563af99120ae59e30144761ec641d3bde7460b78e42f9685ad603a5db454277b5357126cec499392f72723e5e2ef374e876f5c839e79cf3cc2a72178b85c24a4112c09c1f50280a0a0b85da3d91cc9db933797826cf89cee974fa4c9fe94357b4c7ca62d86298d521b2821c16153c6061d8fa6871da35a71ef9c16a3e6666b0bdaeab552335a7a5438e9d3ac94355e779fcaac77523573496655d37f6bac13d5c383b1e8b94192202440c41c4031ef058e40d2070dcc0c1030f8f45b6d07869798911e3b148538adbd16391d9affd6c8590f67d2dcbf6411969d7d7d9ed3e3d9699b4e99b64d9f1cca43d3f9465c73493b67c5146daf1b3639b491bfe4946daef49d902b2e3522d954a251961a97469c9964aa517d2a69d1b6bf9ee9c7d94c414dee8881e615e1f9f39b9183ffd4dcfb42772d4670c7ad22da8cfc436bbf1dec69cef863a4fe7ed4c4cfd34bdf5b9d9d50e6dbdb3abb73d3ebab53351fc88024814419e0cdb2252b3fa47c40440b87f446a86bccc77e6ce5c9c6be447143e6e907b7369aecd1d62a90f89c47c5b5b06886fbdb6620abe20b488d408f9e80fc9c755577b90f0b1e6549e8f184d14907c5795686a5bd6c89d912ed5485c81801e45ae921e24e119faba82586a89304d4baded64ae6bb7f0dd7907e0af20913371925f405f36f9e5a078a7d271ff02e6e4d363c4548aa9844a690e03e473cb7e6d172befcb860c3a7b77b1f276d9a4ec7b4bfba2f675b1616c947d4279c9417b0990c3f0171b862ff1c25db8b65106808fe2ef51ef513f643ff969d371f2ecef49bb834ff252694fd47593ac877bb7abc5d4a3c95231c146bfc53023a1754639d87bc06f5b387f2a7ad522a6308d0b1a1a2350e8aeb628eb058b75e4bb7a44493572ad98500321093e3aac80eeeecc44dd8942cd252841dd390223b46dbdf0875200c85d780360f88b6d89170ec35d6c4b5491e385c3f0255c38c8a9107a0363531c100ece476dabadf9625317fbc995237447733e3acaa6a74d91442e3a05744777a64976d4c935af48f21e450e75da0c10ff545bd588161fbde6c4d4d5235d7a481a2070e0a3579faa24baf4c85a532c892ef315d1e2c847af3a27adbb3a1fa1082ca08dd0381ad1b5051fa53cb6f556e2160ae99921b4563aacc8c52050d4e0e2e4a7676fde29859eb9eecd0c3defd5235eab138ab53631756d9766c7539f7b5aa75b26ff755d3791f3197ade7bef8ccc1626f919fa2a99ee8cbcb929f994e2515627a64e1e513e435f8e6768147f598c10b4b86e1ca507cddac4d4f49b9dc6276a6ef7fad01c65bb6e2217b5ebdd7593af5f3438d96f76cdefbe70ae9b7cdd642df55a38738aaeebba6e1673cd97ea78bc87ef3ef9c967e8698d78f6eb79b3ad9b5d47766b2472d1692297b74ef3ac398a77d9afe3bc6d8e6d69febeb32d6dbb3e5a0f1351f69d89dc6be12ce662986febdfa3dc69626aba7f69ced375edf7277fd7b4a1523614ca6f168392829e1f53a72d82e6f5ec17cee5f3da349cc845d7f6757323c4a7df9db14baf1b21994a9a924fd7d8a8fe8b9a976662eaeaf49f4e3e4f7ebadce4f8dad7ccbe56d7d5c36162ce39bb9651de5d94d3bd17b5a16c9dfe7967eecc7329e8fbb3a4f9f42cb5fddeb4e9b58a295adab7ce2341304d4d7f5184b5d28012135023c09f8e311d82cf4b28b46d65db922b59cc9c52ccc04b23ef4c4c4922acb24b335d2d21f8780985be73ce18af06e633da9d912e966532899e8be86e524817382dcb1a89a96b8fc494cab41af9bd23eff48faed59db12ccb8aa9ceb66c903b33737fc0bf8e4159cc3ddd7d6ddded2696c54c25fefa74fc32bf3a578b3f41027ea8b6503fc0bf1cfee517eb0aa2bbda922e97476fb5d595eec9dba1b69e8ce8d3f3c8872772719b3b34fdee0a4177d6a7255d9e6a47e7733eb6a44b25f256a20b2107093aef849dc712fd5a7df46be6ea115351d05d6db55c42b767c7105126ba807c3a1111006d99b86308221e7003081c39a24b8e07dcc0c1430b8d171bd1c5060f2d2f314c292e2a314c9acf2c7dbab6479ab6dfe54982b35d1f9461a7afb1e398b39c6df9a10cc7176518fe28c38e6bcef6fb13ec9824492412890449a448a293442291ac9ffeee578409378f41f96eec795bd4ac391ffd86c71b353703c0af2d23459820848740575bd7b72972dc56c95ee4e0cfed76dc43a73d3145e91632ba38a4eeae92cec5540b0d1b3cdc00224704a4cbc41d51b855b85bb861b87707f607b6087609d6429182fa825a45bd41ad67a05074804221020a851351782baf0a6fe5fd16deca0c83c9af11139247c604e49155c98525d0889c8c97dee5f0cf57a43fbffcf9e8794a4c457fae125320ad5678713403a00d1f87399e338b3902c2ec07f920c79a8681b6ce353dda342287bdc07f899cac9169700b3a4ae9f0719acfec87d3678f258bc99b0ae62d345e22863b24265f2547aed3342247e3a525dae84ebf74571965b0c64067882d6e70e44882f3ee747e4a700f2691655afeb96481ce8e63966d1a68eb9ece835c9b283d39c96ff47234922251f41b30365e68440ea4d21239904b90737572aee50ac8e70639379d7ae4381507812e9f29fa5e96b52c147a39f301ba85cec514842b2d8b81ab24a09b38747fbaa17ea0be037ee6d055b8c8c58e8b1cc861a4de9d0c2846e432ef5c257353e432cf3c472ef3ccb5cc9dbbdc7b792321b91819655a3e4e0fe8eefd2471b9a5cfb724b06d7b5e4da6f7e390d581f7234507de8f14d87572057e31f4cd0d948052dc1439100565109a84429a261279cd19b3b53aa5744e4a4d2387891fd0b046baf50ed690218b148c00074448c11092a09a1e9f30c2134b88201a28997f03081c39844891a6161a2f366046519b525c853b390919a10839b2d65ad7130cb30a9e2a8cd015f1759ba30d5fe29034253df5e8347086b55aad4cd0c1991ebc15203c6e7ac4438c1c7932de0c1ddf94e22a5c8cd12866544ef830967dde1c53d6b3eb514c61cf98cbd05bbf3666af88909d37a148eb9010b2e3427e5e7baae12a099ad56a5582eb22efde8f133470020733b8e2091d3c96f79d36f9bbe9639c96112218b982753c8d34c1c5bf224668f0688494d249a93cd13a0b88fc76dc630edfcf3f1ab878cc6f131ef31c53fa31d73e8f616ebac2638f1921c263d8d6a2399fe7b35aad3e4084e621ef5ecfc7291e977a2764f0b8f79db4297041d57e86c673bbd75e5a659d418d756bdd9ebccdde66d6ad756ca395d3da67a1ad58eb28f0f5facb2c76ba43187e3978ecf3cee0b1679c04153cc648e8c2e393c74840f2183b8784213cf61831157aec2d2478ec3492d0e3b1db8829fcd8e16bf1d0ac562b1008a11dfa0f2ed4f81f62782cf07a42044ebc953a43d3f8a61457e1b21c39aa37bc26b0caa7b22eb1cce8116a40865c83258fc24beb9678aaf7a331902ed19d76b9e1cf67b55a9140453d534a69e6a0ed81c1063b5bb04208ac285244355daec0a7ae600c16f433749665774e9cf3adc206f4af08153590da9298d1d78cb77498d12368d15fcf7943ecf3d5183dee79ec5916836b468f40451337f40a785fb081138c8003307420891215ded273bcaeeb9a125ed7ad97bdaeeb85b42e89bf35f3ead84bb6615e6c6475ceebb273faadf1c23293d3edbd365eaca5d1526b0c8e52159f33c524e588c61a18bfac076b9d5aba3b1a5f5d05dafab47593a1f1d4e7462915222407734eb95aad5635573871450aae7881369d649105112b80909d504a673401b5220a2ba2982a2b58305556c42044291dc318609680065ca4c8109020791ccfac05982952801920546cb57a2b334f06a6b28112aab2c14f5d42166096d0059ac1308106304cc0c1bdec112d74135734a1baa204180855d9a005da0c2d5b5a38cedd64b2d00b1a729183594b37a5a8c86bab6d792bd06ddd3a0d854061987084a6fe87cee3decf1f5a3c19efdfa3f130d15554e0a6e3e9f47006fc54baab658210b6d02d58a06fce7e51fe1171020c2d3bc5a4733a45c1ccabfc8d778486f4a13dd42772b15e5b5bd6effd47c4092c44d5e6949c737ed66116632116a578cc62526ead35fefcd82c26a5d67a536bad37f5ba1ebca42612edab645e9ba269f7da9f18ed92ebe25ed30b93e92ac939e79cf3755d6b4996448a2b928dc1712da09616d156a78571d12a6d1c399ecebd57a7e50426b0680082784572d26a2f8673a6dd070881bad7a561464c0f9a50dae9743a8d2e9cb8fa128a56b2ad134bba5c16a585f20cad79288bb917df7befbd17df7bafcd375f9c43408586ba946a91c59a46a6e6d6a2b47db14e17c678633d223eb4f819daba919c8ca29452f904a8a385f6f776b0dadf433dc4d1a7d3e994393e21317f60878f75301e1e1d1d1d9e9d7bef7df7defbeebdf7dd7befbba37b1fd5d142be9c197c1a33ead83e6b23a4da74bb4f3f7757c45b4a376a5a9ab17cc208ff30d66eae59cc754d8c9d6631f85e9ac55cedde5b7b7a322b87a54d086f929c73ce39df9ecb93246feb6395682fdd9e98b2242de5cadbe5b93d97e726b93d29dac951ae4bcb9e371dd9adbf2fed0e7ec9f195c5a0a09cb6f5b156c9108fe7f118e1f37c4eab1e339e4ea713ec0157700567e0cc9c353535d00652016de895e975d1b912010c746ee0814873656aa9880485c09b4c45a24bb2999eafcfbc82a09cfc6531278789f6dabbf5eb54a1f3d8aa60c8a31c26b6ee90c8c59bc8c52ba4e56dc7bdade1c5a4b3187b2472ce1ab14e4e42a1904a024143d5dda5c775be6ab3bdfb86bb51eef6c758b638dbbb5d1ee76cefde8f339a69d95e50b677871e6b1393d0b63626206c72b9bddbf43814badcde7df25834b29b560a4727d95f146759ccf5f158e8934cd039a428410028d9290d62e24fcb61ebee9bb694eda2b60d12b9b835cf9b7af6cce3671129def1f822523cc59fe6a81fae8eab663dd820140ac1d02fea3aa57ebd43b9ddeeccfb3b4383b84eb73bf383bab6dd1f8f25fa858fdaa600f9dcb085b7cb2d2ba672ccce6d14cadf6b734321fabd89db23afc6fb4724055ad823fb2a5102aa400e3305801cc6bc3ea34b4b16562b0e78404775b70e65bb5897cdbc6ca811a600490fe87cfeb93e5ae8399de66d834f158cad040f5515a7fd1e65ebe0172ba67470792a1b1c354409c4a961c3b6852fdb0a8542a1fd1e8b75baef66e9dd01f897cdfc88ace0c75bbf581663e791920e5b0026bbd3bbd348c08eebee908f2ed29ac3d7fcf2c4940ddb4d627f483a57c7fed81ffba3b3c218532c31c6144b8c31c512634cb1c418532ce7ec417bea38667bf7e9b153b71b67cf5423f2c490d0a5d8844a8c739e594cc6d7c46916634277764c6868b40735a95ded7467105e25197bc63f99befb2a396d1d8f3ff905f4fd89297ab1122a4412692826dbf589dcfdb9de5d9fabe4274412692594c84928a8d2751447d974a0f8f5f718cb624873db9f7bed12d8822dd8823a2f74744422514b2412894449200fe4813da09e9e977f370b7f8e98893e66260a9d2828d30767084d802d143aed8f4f2cfe88349186ceebd2301dd0d4d82c7024ce4d16abbfaece74a6339de94c673ad399ce74a66fa66538dd0130c9a116a77b86e391e8890490c3ac61c9e8e2050cd0006ab82eaca3ab990c80868b17304037ecb8ce0d37dcb0525159ad7a80b40ca4b3360999722986299f5850280f4587159a1a182f5cd058c1235168746272422a65196226ec92f644e790430e39d450830669dac424244ac9281c52b28b15182fde8b1c50a212c7e190c5d86bd24c282613ca6712a0ad017283d848a7fec25d380dc7e1b910c0dddd71c8c2c66651057deb38648f4f46a213cd334d0a996890969134cf742967da94f5be9e6919c4272b84e0604c5e52bcdaf44cefecb57db120c865c35a5d2c189854a0658d4d85e3011b08b0a9b0e079d95c3615163e3ab5a9b0f819c0a6c259c5b884441a9b0a8b1d77b1a9b0d031bdd85458e468189b0a8bd65b790fda5458e0904824122906fc9b929212e3dd7befbd36d87073232425ebad3f2b7d66faec86cf503ef3cf4e9fb97cb63fb3279fe5cff40e7d9669ec33ea7adbb9b3cf60e4172a4e770d30b2dfe074738eb7fdb60d573fca729c3569261493e9fa4cc2a522a6a8d3d56ab5b251cd2111070618470518e7093c82b7f21ef75ccde1b47274b0d889a16950a16c572bd99939e79c94527a7ddc8cf3d36fd8f2ce2e10a77b5f9a2d03208bb9379bd30d00c735a83c1538b58ec7df99c77262dd72598c4d027daa7b31c6188f3c65234105108019bb5369d95d8b0c1d36129365772d317697924397f2dd9de95a76a7d2b5986ca86177291b09d8a9742d271b894eef2ee5747dae121d8c874747478767076288218618621d2dde68cfc732f9381bedf83993d968bfd732d003450802812608244f34ecf46401ccfed8253723f2c40c7e3ab616d37c65d7755df9c65c8cb38c469193cd9c95e84191d4b0dd571094ade3f128148b4aa610e984c29e6d172b72970df6ee6205c1db65630a914e2592875025117694a3361d28c7a110695f1d2d624d4dac89362f6c2e9f1b733c43e739edcd7e739e4e2789461225914814ef3844b4234ec489add88a2dbc459de847449e9824f2e0120a974ab815051a2dc800572514d6c117b6f563982f6c971edb376019dbfeb8666c9f1edb8c6d97c737637b3fbeae8b656ce7c738633bf43867f9c236f658cbf45d6d7ad628c7d8c9b5b845ec893d288c6127ad091f4f4df884a2a812953b5227723a149a50276ca24126a12b241a6117b42796053688b58921f081512ceb8462f9ad912ea829604c246fe525d942c937b1e443b00114185bb6b0655996659dee760a99e8d0158946271883970404a3ee479c9b1b1451c84434d2202dcb787442cad8c6fe2add10f850b7277c32954e2828a894900904b9a814a44d8912af86429db08b1c856d582c0a83242aa14ed894b1adff3a656c97fe42810f0595b17dc35f2919db287fb9c8d8f6bf5e646c9ffe8291b1edf297676cefbff6de32b6f35f00c8d80efda55203c886131f421e671624545a23576868700c560d19d7606dc06cb037e46ba3266a4ec736757c02f22fc6d00c292a611c56381c2e6c9b1ee770830d35a80060cbe1c2f6c9e3182c19dbd6af4d01b041d701dbd93513e9bc568e72885733f965c5631162daae1b34e8cefab5a2a2add3a1add39b9344a5909c096db9922b16d256da6cc8b20d523b429afebae1068bed93bfb87c61d6f14abe36756cdb0a4538bc9bfd75f7a581abc73543c5537c5d96754d24dc803c3e6be7bc29398f4b4869479fe873adde4adc52fcbd141b50e13bdbba56d7eab19c41dbd6f41f938feed1218b993107fad580a86dc3966559d6b2ac65959a18f23334c5b6655b59866d5dd775e10d0990529ed56a450355e4792bafe7fa682c7e4cabb782e381b7f2beb3e1a9cbd0e1adb5b6443ad1daaf6d75dada231f1d43fdf097624b29de3b86b0943ee086a59487164b698c4cb1a5145becd631a5506ffb39ab9f65f4b54ceff9a04c6ff93a33c9aa288ae414899e088a2ad6b09f9eee8e023f1de74ca9dd284aada5f912792205dacffc62cabe6a24729dbe6ebd7a8aa390a626b3982cb125f9cc624828130787c4732fcf7df04a0d05c566510975914425d4a59d5074686ebd544281409247f2481ee9237da40fca5e140a85ea3157ab99991994496b6a6ade6652316d4edae9c4d32a82919b9b0f489f937677b6790a9937f346bb01a653a8b46bd72cab5a3245331000002315000028100c078482b16848d115c50f14000d8cae586c4a99875110a328a48c3186100400200480c088cccccc6800407c8396857e27ff28ff78919c2bae8669b1a17620c4b285745cd87a4a7839b198d15ec3f751cfbb8daceedcd07be391d4fec94f5bd869c07cdbb66f2e85ad03b5601cc7d663bea1b0f8f5fcda1bb9ad3261181ba37927d798035a150401535fcecdd81a2e2433ca409e8610f746fe1fbd64588320b2a238799bd8cc3f7823eadbf95fa1d8ed9e3f59a7a344d355f40ae98aa1adedff3ba85a026905c637e8e185b5ff23dbfe2099560a14ae1fa4e93c637b82ecf87ddca2513d6c732f83aa4577882be6f66c56254726cc6dab3c645a78ebff7f51655963136d589f19d919691b5507562c087b70a3d08b4cc398e5d4be61aedc85c15915f3e91ab35199a96cbf92d0257d9b2057eb888cdc5586dc9f6c5371d3b845b0b9436bc1df10429f307656f9b8bf7c04deb4d69d9f59e3dd7d6b371f0e212c6974746dc8b0d43eac3f909d89d4e2da1395c8c1818e7555067e8224abb695a7b695e242375590b6a5a7ae61ebe3651dc1557b659a1df1632f3c6287525db1e587f15c925d4697e695f32cb2e2746cba2ed6e1292979a48fe2dfd36d8222660fcd8adb8b89897a148ff4e60f76e93fef0fb0ce1fd1558b534f12f5432e1b3fecc936d55643db6b38f981d3da75523c7122e932568ce58b57e40716655c9fb9448042b91501077381425ca1e0f8d52e282450e472c31d538209083018cab30cf94d4cf5c015e58cf148e95bb5264865a7ee2bc9491cdcd3401893b645ad417b5ccebde061ba264f90c48db89ec0d48f947107cada53b5740d838e0a7af2a61146cea612b8b5d9cab13ae56642417c2fdc441655041b4c00cf07b257301d6793e10695d7f9a192c505604ccd2250ff14a2663a04b10e49f51386be002081505c373a2f0038fbdbb498e001c7cb44c57cd053284f22ae0c3c054e26a5ed23b067c6eaa17f00eb77e935b16e2ba10822fd3ccfac6e4b0f5d1d4a2600843d03e6bb605994481acd63dc3f7888bd2e0ed37147dc702d3135689d035b794fc0d948d872ca4f685b442c2506e1c32febb4eeb94c063f374e3096369ba1239ba54be6c7b8ca5fa0030604034743aeeb2fc63572c5f8b2eff5aded2577dc2ae662a91342f4d5f64c4bb2f7f776aa7226c686f0372e6fe8b027899029470c38f0976fbb36c5f853518e3bd63e5ffbb4ef57f2da8ab14533cd45870a3a2e6e09aad3c191801819f7afd162b198901af7543ff71d7b6488f2aa346663a180a4ca300ab0539a2bcec7d171b954f6164abccf41d76392cfe2d7c515d2da21378a9fbdf92e6fb3b14dace6ba67c4b05129cc6e0ecbc7c1f331a9342a078e72efbff17ccc72892d236af7235fa2802d81dae58dfa2978c8d4ae55c33f4005fc51bbcea296805d82259422477a0d987d4159a247e6098bd4a5c0f03b46f9935ff3e2d8c4d9e3217d2dcfc7c766217e70e62f21177ccf2464507e30287916a0f2f1fad86aaf87005fee0e8d7871d6e648db6586787d9a5c9f994943bc0e0bb08fcb3e3307028997beddeb2a347cff19d15a8b3edea59bc5a552ff4fa912a155a1986925b3d627357aabdab3d57807aebb7def41b7707b29019eb6e8a0dc3bc49647ec39b70c513a52f973cf6dc60fafd45ace8d815e331d86db47923eac18d2d77dcf5c564f1810ac7ad7573e964008460b4b3948dbd909f647b9e5289d7c411f941cb9b387968340df4911519777374c044dfe64bb6ccbaf6fb91584fc0d7b9eea5b536bb275d6e3491cbb857de03396d574da95368e3324e709918ce8c1f6950b0f9a0e331da7e6599e826670d9491405ad70bb43d4146d707147543a6d842b5ac04d93b57965cd29d53f052d159cab166fd12d82d37720d620d7e84673fa9ba44ed15bb4ed433ad955197ed7a87fb07474f8b394beaf49b731a9fb82a31f53a7fae6e86eecfc53ca99d6861c72bf32ade32f828165d0499e473aa6de5b60f064d36f69c9a8a8af2f9b5ffcf01718ce0e6a80db382546cf3be512ae691de6d46625e290cab2b3af0e94792adc86665e7e2c785b203830ed1bdcece7f293ed0b9f6b67f3ad04daca09dbd37ce532333edc9a555e5d56b3001478b08ad5dc496be62773417ddb42ab11a01b8abafcdf22918fd4e4ee8f6ce6998a0c12663547278804b67de51d3f5673c6415a9435db79cd131c25e1da20166c2dd7dcb03c0eee97b9ff1dad25a67ddf0f7bf58aa31b16f27061ca971ff71f6a636894de2d2714d6c56f7ca76cb391ecb459e87fad4a65d12ba608eaa8e0e3959d3d9cd532b44fde2035beca43619c3f170ae8bdde4076146b38d4f5921b25afc14a929ac1378a9f75ca4bb66798ebe656e8f214ac2e9021acc054b9a84623a64e837b6d44bb0a53f0817ea13542211b1311712e81a366bd4362d8803e48196286c7ea13319ca004d3e6da04876aba3123078eafe1132cd51c8c58c5faafee3570e81edc152ac1d536190470c372e1b4fe55383df4a056dadc70f787a3725a44f9b4509c2a6ad995444f5a9cfc5e15091f709df0fcf8ad2baa4b9d9d70820a795722da9e2237bc0f405db1364e9f2b288b93246cf98ff82f7b0d7e5d316e086b614b11037be33dc5157688d33cee0de01ee9b3ee21f7470799d07b0b22d9188ce211a7330b556518cadacc01a292df6e3b604dd8d0513a54e27693353834524dcec7a6f327ddd57fe24e195c2ffbe6306c461d8144de4e05ac56ae61886e99f5cb495995b9c73a67bf39a5f64fc4c1ab082837da6e525612bff724a63cb5b5fc0fc9c8c054aff86118b1c9132bb1f150c5bad176579c90daf0e9805e925021008a2e25188d6aa223712f70d6109f3af71d4984ec8881a41c3cacd3d8589c8c05a81e52f5cbab6913bd95a394a6ccd6cc984e4bbda0b6746168640310c8f0b9f7562132263744b02209dcaf9b54c8864bc2e8b032c43a9fcf1f3afc6375ce60df1a4304ea5b7e97fe3073be40c05be8bad0e25a88fb67ebc8e8e87f5ed75cb6c1922da183d9202bfabab138c5b6eabe232352fdfa3510e6596caa66055dddbae7a620d3b2224f590244fdae720a19f631150c7cf7d92c8156bb025b059f2b21ea0284b79df2f18c6965dfcab8dd17d88c21c5bc09e461a62701291f6cf8e660e81099305c1164787755a4b04b7be6707c7b94e3cbbea695dd091fdde3d037885e29c0dd2767106a164064714c43177b7dac73b93771417f5de878b589b56cde45f6ab0ce08524242d49b33068ce841795226c92fad2798c7c3ad22af863510ecf51cc68e5b4734ea5efa61a0293fab859f965959b908662c33dfcac151ecb5013192423dd99c484d6f969461e11b2a8b47bb165d36efd8781b29edbffeecf6cc6b5dd860f10edf5b3849d66f74b6bb92883890feeb6046e5128c1075d3f8596316bd860fa670804e602edf941e0ac7b8fda25d03ab0ea24961e18d61acce441d199e21e05ff575de066b7644b02582dba4fbabd025c0bec13dda204da22f689b6526117fa8ef689ddfb6fa027dde9520164c1874c719523cff4156555d274dd7bdc5d48fb2290d12e7e52c17f497df457420bf19ea99980965fd2fcb181aefe3193dba9118586fb818b97883b1501dda6574c863f689a709fce7c2da76adcc0e2c008c4b801249fe6ed0312358ffe89b2980aaf32f78329466e8f6c4084e0638415fc07f8f2a284838367a0b7eba61c3117125f1260d90394baf06e7f8eb48c3542363f8bacb00d791eb74ffa0061c74768a851646ae388f902f39160a85e364fdfd339489b39361e33efc077c6fcb4253f404b42d34ce099e1c443d5b3cb153b1ab0b249940c25613a22e10fb3bdbcdce2bfa357ac15bda728cf61749c1caa9e91620bba4c83560c6a30e840fb5ae9a0acc089d43abd6ad933895b97e83013bddadcbf53209b6c4993e8bcb70789da4f693ff86ee3448a4cd74e1b4c5b041825995af2d301ca36c889e66752529b5378ab1468c1186ef0478166e2256ab5ce74b3b298d9d9af3655aed80f77b016b026887fa1bedfa49d5ee057381ede60b5d9d39a37052d5c63084c0881da8e7579b5855b3dca28e36329714adf5d488eafe8e084e7ded0182d8575c2d4f036431d80fea1217cb6315e39517c06960cdda7b21a64ed1a8764dab937cdf6a0a20835d5556151ef396f472f79ca27d009c5e1f8a07b7cb0740fc0376fdb42331a7b7f37696edd88c69634424f25e69b27127fb1f2f190cb3773998b71b402e5d777743fdf147bafe1af9860483a6ee4d176c9996dfdc35f33fdd7c82b42bfb0a8638aa8095a7d257e7b9965c39171038b6dcce660d307a467a11f827c8d12fd565e6ee458659c4c37812450392731bc945b45f8eb34d56010d1307fa35c495713baf63221a6c6ab3bfe4413eb64b8cb6863648d541f36d44b5d300412a3359b133f3824587a4cc49a98e0ae189d0209658f9280b1bc61e984676304ff6b91eb08ebb2a07ff7114018a1a0c552ff1b1cc9e94a720adf3c4fd8bd3fdcf7b66eb40b6be80b5a145bb7387c7ed2fff0950213c5b9f20f281c1a7806524971b14de0c9337e1925cee462bff68e95d46d5e5e857037371d0c4c76006c09b0d911a42ef34fa1370ae44fe37a4f7fea4f02e22194f047a0b64f4cebfd41dcf2f4c9f40945d70f28957e4ecb37c43e8e3093253144b4d62b79993d0a7aa28cbdebc0b254485f610dcb982c456c08b129be454e786fa3c70f883a56ce8930853e01cd1d9647626952e88ce0246617bfaa88b3060b6ac99a70f8fd2dcdb38bb1a10a882f10a80f91847930f702138a82a34dc30738047a62e5f781121baa166849aa869fe3dccc0681adfbce5ea420587a46dc704cade8f1cf3bfb29470b351d1f17b282a4f505f4207a24e378810ba3a7d690a396fdb0ee6986f0da8df6a03382e27a0a7e01fc9c85485028f80de88c1f2c65ac5ee40b183630a0496e9cc8826c9cb5314b100e1f645223237e3a797306636c15545c38b35d83b7ab389b5c234ebec5ede3971f85916c41b005e35c648c4ca91255b5c3355fee2c791bd4f69818858872b2a9e9e6ca826566ecf0636d279e8640c2c118ea4250647c9b5721fa021a79bab569e5c2a4bcdf79ea9c31aeb0649bfaa8d80e2ffa2a51a04c88ed656216a66aee0d9c3b331bb68c67b88f74068f73b9f33c71eafb7a31717b42a74b09350b7693a0d0046c2be4cc36fdc35cd9733f3727e7d6bdc41682c3fd91d5d25e3ecf25ab1f9bd536728205dff69fa24151cc4db7f05fe32638ebae1192272734456023b1f98a249ecf24011ad8e8000c7cbfd182ce7be63ea80894db891eb05b23447b26455acaedff83335e51d4513a38b9eaae729dae525d7a8907f4503e1634dd4cf50c31644d4b7887128355aac4778818193ba946ebba8bf403c559de34acdd03458a072a856ea0d281c457d74db171a02bf2c8a76b62c337d98b9a0323bb6d42635e80207e7caa06b13b48608ce964a0ce073cfcf000e660044a57b4ffed88ad8d257bf4ed6f6b997497a68a8c3ab40410b6498cc28d60afda4afa489f303b02eefecda912dd5bb7c5cfbd21f51de4f62a577dfe7982998367a8a69123da343316a7c0685d4233fe98c001186015d888bd6d39d330919ac2575cb074ce6bf0d79a197b11d1b0c192c90a590c957124e26c9b94e71c181970b8877f360d681348fcf77df0e97e78ad8f19f6ed7697fc825d39ad932ec7f2e04675103601c608b7bc73fa378446370650b8cd2361cd0118692252fedea9c44c19d71520f4dfbe60792346555f843999e1967632d634fe3373bc660c2eade699ac1f7772f5133f0ca678c0e435e4adfac98b9f5464a92184055af5b378eee789f8358bcaf1e97df151d4c5b32e1847ac3c31cb60a929bf0ea06a811d693f43648b9fb2704f564eb665daf44f5ac106ea6341dfe8ea2a3dcad1373582bc36a5bdf43ba1d75e7733be65234a1b5ca6887140c47e8c62e3dd91eedf4b0205f77eccf584699d42d374c289391cb7e7b77166a77b3ba72a77283cfc9f6d28bc7fa5ad43486f08c33da6a1a3141e723c6ca2e9e3f4435dcfb87b1f474582e8389cb6cca59b546964e22613553e14909d27c9709827089d76189189f62cb4c94112c6ea02248caa698e05dd8af822eaddef377e5307916098ffa3b2bb1c25eac603d7c94813b741f435bd138474a9afa76200093966ded38b7ae41d217a44b4a308d6d75500458adc3231f19675e4a1de6f1e7f896923eed5558181f02f93879e838fadc4f2cc8562a6592cd5633fe0d5240cc38a89b5dd620bd0e229737e5849e0c6cc2c4bf8a9be4ad5e5985b8570fb7760024c8f2e434f4a035a0114ef8b2dfa661577b389f6deb230c7757e21dc404a6e8b52a8b2295cfeeccb81320237e355982d8f66966a464fd4e123db78849aed51f20ead0000373ab13f69b3cfefed3fac587b8372dcbbb5180710f7e6e267dc3748e6498533f6fa0f97eab81b63de30fd378b918681a3eca22363dc7a64a17ee023fbfc73449709967ab4b4a5918e95d4cc0597e1f65ee712d19d7f944076c92443fc57b9dc8f66cd5245e432226e3fa03bf4519136fe137fcae0754b1caac80a6740a0942583b48f2153c6e49c4aff33825e25192c5e832c6b862e4945f4a416bfe2d8408d9bc47f7a6aea54a3bf68e7035caf4124be8b9a9d4cefe4d03ba8091a6e8678d74aa1e8bd3a373d7b0e6975ebd5b9f631ab0d4453ec0fa306cc0eeebebf7a42b30a11213670b3d885ae86f334350ae5e1a0a5d747d891bb7495073f2064eb382589503607b17496c6e1453fe80e4399397df7dacc044b83469c1fbb78a6e3c93400e8603194ee15979f84b6ca20a9a278b241a4b199e3c89a2d735035bf4d40d35a78119fd729aeac08df21fe45090dd3c1642684bb2063c1b1be5062fe1d6d7bbec8e418b58007c858b4d208de2ea7a8274b8c74bf30cfd8eb4bba3e8b1cea61bbb61298ebcf94f523c266b77eb103e3617d7c831faa2be176b94851e8b0304088a08db3b4454246914ab5c9abccfaa438012b44fe0d0fe77676b41ebb9df971710f613f5a2ac67808022915649acd1c9abde563e4bd44d041b29ba0652628c1d188203bd654ef985f79e2c9f1594bfc10cef42fd62d23cad8f7fa83b8a07fe184edca372b42ae9ad9c8e696f42fc17fd969a8183e1ef056b2bfba85738358bcbd4e24452bf3a91f50f27bf625b2ac41171e014085c367d35aaecd7ec9754d2b991695e258d6bc00de4597306b6b7bfd353c2a6b4dc814d9082870d306b26321f432ea19b209b6da8ad1e1324b89d088624fa860a3023911d81712794909175063634a83376d6b2cd7d5965550dee4f37748472aef64cfae05bdf454666d29f3eada767ddb35d4b5b72db7fd48e9da5520ba36d6e7da3eb46d59ceb579e0b619736d9b3ad365cccb905cef3d5a6009e8756ed759960235a9d7b72c5213ad4d491afbaeb3700bbc302cd79297658e2093f4fab19d3bb48690e2ce9698effd9eec017dd0313006a344f50aa8f74a2155af7cf6311ee902d375ab56655a2f6ce919bd322823e0ac6831ed6ed6551af5702b2a30e9c4da99168e60d6a6af32413cd7d82bc9de82d8c38afb800fece3ae6d0e2886f7ba2907b5d48698528db59918b5e3389e5de8d510ee2382d019b0b91fc49bd96133a92b64057efda9c9c7e449bdf4ddc512da4963da4c8a4e9f30aba413cadcf8388e8d55a19b3b4ae2d63ef7865d7959b534d9d0277c27b79a9e9d567b33905f264d3306261efcad683b9a4724fe2396d57632b761e528ab63526769ea28b21923b94fa16e2410b3069a96eb1e0aab28ef3a48491dc27658f68908e73f33ebaa920aaaab13c216e5253e98219985b35ff84ca79f319a371b5f864520ed50188f01ec073f367752e734d59b6e8d863f843016495b5da70f35b726d4261ba3590698b34011a23efbf94b59dddf0e4a9a67f6ce2a5a14f6d4d250bbf09545f400d8d3942228114c4bdba669a86dc8d2ce1859ef94001d8a46ab5334faa60a0b4472436256772f2a54d3cc65e5d6312558aec69504ef3558672f62b566f9f1eaa066e234feffca57778375bafde17ffbb6a88b4398bf6b7e5f5547e241ce5a8dcdcc4716fbc979e0dd467daaa9681f959ed814ade39efe2922dde0511796c7931dddfe2c3f1f6f4f7854842ccad62271d431e26145f7d67d59665f6f71fe006e11d5c3c2f8c2590b48d80462536068500ab5a2c1867904df7e8c6d69537b7c1fd87193cc48a7c0f0b014ba86d5f87f158a7298ac6dab60f288185a86e53df0b19f5c76d4ebb0f6da91b46a1424a4a018ba229ad62fc80ecd5816df4b899988b16310c5d0867317a4a49e5e033f9df97018e410c32c39f05475c37edb99364440ba35f2a8ea1218280313f75dbdab98c98b6fac4676be991ca05e789b89c607bf36cd77cd1ac745cb08936c9d138a2fbed289466c5f0ec1d94926182f84cdf0c99ca3ef3185e8919331df229e152493b5c37c3300d3bdc7ef8b7535532b432799c837f1a1b1a86aa85db0245b8da33cf80e98e21918c37d57d6693e7399d92f6ecd8a3d5620ae728bd5708c86616fc81bc5f08ee0d49f505943930ea1fa4ef67f4ec77d5a0fd695468df26c1f5e788c0ef6724f93edf45c34e160a2c5bae0c9616a7de0e76982e08d1bf3651c997ee1f154583ffb92e772007f4cf7edecd31cf3a69e6e1ee5f5ab7fb3d509f1d4538a506a0d8e6c34664faafe433798a40b186a2cda5286ae05779d6acc7946a46ce183bc12bdb4db3237cbd01ce0fb985855f25dd2e4503f4f970f070ddec50dfe094a9670da508cb56c5f750763743666740318f058b224760b2140e84d6a2d6d13b7115acddb912c01ab22d19698bee7e691bf1a2f2265260bee58d108afde8a9e40138efa5738c2d730e266d464651eb92211615e6e4c86c3264c5766e6a4e85d59c1c580f33ec53a2831140abdfce799e72e440425cf56266225274b44e40e9c73220d70e10eef82a550f6eb265bf47e130e811376acc165d81b3931da9fd8c629c932e80528168ba1c43a9684d774ff093b134d92f77f70c2f8a63c2309a6f74b9e79db2bb1c9eb8c2495a042664c187502df4514be7aeb76bae3e04ec1f49650e9e5933674f1b9ef3285820959768e3fbe1d1cce13e544fa3c3b7485cf848f838283e1e419f1ea06ca136f60660ec75b796ce96ea393c6f18400e3f95d81fa326f1ea403ccfb4071e6018831c560975842c6622dbb82169ad018e6568acc55d871c99c77111f2da0f1dae471e23f33890ba6f7ce9bc33eddb7aecdd428a296fd0078d967ddb35a2551558f3058707121d62b476cca9ce1bb257dc8be64f7ce4bcca5ca25e4789e26d53a92b8bc83ed875c7db49d92bccdc548c79e5e788e228816bc8b5b507f5dcc26a5a2ec8e32d6fae9b8365ab0e274e7bb7fe12382be06e4b2d4dbe4d02fda203e580063d8a07de05bc9b38936d4545b5488fafe0eb1885fea2d0aaf08639cd0cbcbfb75ed9bbfefda10f4975e3ecab54a9bac0b86cc5a5a56dd4fc14f90dc0b528079790e63d88ebfb9479f09d43584724a73e87acd9f67580ef01f32963bf1da5dec358dc550a1d06140c2b21536524c966ba01f71f02cbafbe05db7f6157b2d13a6418750816efe8defd79c6af7d6ab8fcb278427d9a94182912042097d5172da3e491665aea1d1c500d635e8031f6a1a45877d7fdbb82ea7dd67eed502548836a684edf0b76fbab061886f937cbaee4b02b1f5ac55a535bb3341b343ccd61298b12b61c2e11431ae284577435cbc393e8020a5d90ec15a8b013ef07b6122d1fb694f6b229737453b59d0f939bb4db333b6635833cffe42d92a721f238062b887434cb7d6895cf4fa14ad0949eed238e7daad778a3ce441cfe4a91b6071a4e4ce93fcaefacde27bbc1fa39283c344834f3fcf181ea08f391aa4ae97c0b008b02facf660855802e3cbdd03f56e0fb5f5665c4013325238fc659dd0f6fd01f705a50f69d7a5d4677f5f869d8d05d0f14eceb96cd54f86b3898707a57ab6ab42fb4f265e1059af10bdb4830afe339cdb30ec848f1b78db1db710e0776203c7a2340fad33d2a620927a11e0a495b49e0c6a07f4c732ac9729a46e035ac414f6f4d1601ecceaad1e963d88b651a96519862eb768a8f90f1dd1c14a61d96c2ef006f1d4b65fa1d49dbfd168acb256fda0f8cc3ae385a3ecaf21073f4b475f47983ad8afccba606e0cf499ae82678173429bbabf9a4145c93b9667608a60e8ea39247458b7ffb2ec67b0b053d94b3bc9574390aa13cdfb02d51830012bc94cac45a5eef3e40ec48148b9b3d0cfe1419f19baf60fe89a8e94c162e305105e61808e56e255dbbb97daef2f202b526766ba8dce23013ac03fc16a7061a7c47938d43800de9af42eb080d129f1a97365bf15cf2661aa0ca914f0b760d6acdc684e62cd5a97b0496a99d54abf513ed8f2730c588d967635b5f9ba0bdfce7727a6886384ce1a67c7d2714afacadbf0e983b9ce9f8b30674c90d2b57c68a1a842800a272f011b642165fb402f220dbbf34a43e15c610494f1bc0d3d0e5ce5e38e6399d49866fc1d5c940197d74a0d655220816684d8fb4b359eaf71be55544df4b5cf018be1cd4a4a822ef24044f830e47787cba8fbcce7a7f7240f1312151b117713b59715df7abcf230e59e2cdba0b0b79cb21795ec8df24ef7fbddfc5cb2f582325019613e460d19e48d72f4f66b20f3622949e8d3995e04d2526958aa0a2dbcff8b6646994c6fb37ba88c4ec09515c0a62538b175e1c0b2a57c3407eadac6092d51f2c2a17593d4ced0642706bf0bf3cc5eecb84956122b3753e52f14a71ed96b800080d1ae6d48ad6183249f581d7f9d995b38d3e7005a2ed358aefb5d027540a7049319149d0727e443af54071f87ffa70b14b562cca57a9414ca248b42c9932508c3df3003a884d486d27f455e3cb7b609894479490fa0a6452e9e2fbeebb74185a4b0b44fb1bb19e4390a3cb73fe640ccd5da7e9da56ba672d3f2f1b4be1b1946e8e743f271b9eec4c3634961469e20e6c4c04cac625ad4647cf466208f40188b44245ee3fe22763f4d98a80f2d00b66825f1303366ef9b38c9beb5f669056b69b5987e7e2cd78cccca33a6807bc9224faa0898954ad0697921d4b75a784d3f2dc708c1acadc19925d9320234700227960a879a05274a698489abb6bfdbfd7c5833fef6d7902b57598cf26cd5395549499c031d78713873385a3e6d700ed440c46aaf6240aa1c45db79b34dbf2f8c7bbb1ff96cef0f2cdf8e52d1023a105d260ffb1bfe06b81d3a1d10a58e7bb4646c18a67daa3b3bf690d04e8af613762d84b6f231e1ad58f3540cae20ca559844bef3cf5cf9e7d1906c8ae13c1408b1bb5be8dda777d06cca7b221274584f9a4f87033b8ae3a97415fe447189fd31b6cb61f727469e7e7c6b5eb259472c40969b17c46f217e539b80c10bb1cdc675105c3521619e0790e96f415b3ad07eafbbfc1d591b34fdcb3c2b93c5fdffc39d4d55d723244ee94f2011c4b51f88e90ee7d684af54d904e1761dcaf29e2dc4007ad5a4a4017c7ad5c4982d6e3c0d91b013da0df1062b6b1e902bff41c90d29a39532222768a5321f1b08a97e762581eec3f851cca5534fb48065f074edcd89db4813d1065f39d69f10d7ef270bb922d95c52b5c8231423631709fc7e3303523da3752bd3caf8c519039b1f10883e509c9d5debb5a0d5bd7f025aea8b80a918429fda2400e83a11d718c9b1e71eaf6ac597880110b9e05a9d3c0e4d221238330844f5423f2a8fb3cbb9b100520db45f4e57ef1326fb446ac35e651e87c108ac1bed6362c0c69ca0762228e3f39b98cda9ea455e4bfaebaeb9335d1f84868f9d5ffc87f6d0b00125545741afcf96ca6f88c4ba7e287fc12656c2522195ad8f94ecb41fb0ddf509d216cba407d90a19b0bf05a61e98d859bed23ee41ea3707b237134f0a1797bada3e2292385b62708b27ed0785ee18f43ea1a21a334a28a2abb030cddf31e7838af5ad588f30941ad7378acbdede95b142fcddf22dd4b28da5c525183f33f5b526ffba282b42dbb0230bf53ddb6883d56db165bfdb8f6a2413b27783890b691a90467b1bcbd46306d6a33a1d3a6d0c1f9244b1053cf3050b9df5ada99bc2b9c9687add0491d09c6ab1929fc62564dcb1b9b27a9022757b023951953b45e8d8de081294b9be97dc9067e0912e7f342949e6fc857c1d3f7481798c2b56148be3cb07a63c45b1ee9eec1e5742c8cabe069faebe72811d9b6606923b995534f4085c74cc1a2ea147ed1d26edd6750b127048dede3beb9640be00df12413549672ae13b3c955a44996191573509f98ca3a3369f06bc5b5ec750e1ae89447e9fe63727073188cbcba493849470c9e740c44d1eff9043604d21145e304adf942fc2b6b1486fe66b019a341bb28c9e8f267537a22ce69c08bd5d1fc15ea5d528679d8c6a2544c44c10a1364a56e59034935a4e7ff22f62aebf058087e87f6dd82f8598bf6945c592bbd74410812d5b055eae2fa8d1847d968adf3f2ed73ff88642d35ae014e41186c904f88ce36e34240133422c446ce059b25b2fe97346e74cbba5368f7f5530684904c0b34cd10e4287ab7e1d03d2e57f9da3eceb9f7694f5cd35d27589de4121d530ed303cf90a6425ae6d2f54ec7013af5e7e423e24b5d43b619849d1aeb09c48755508da236e8b525aa7e77fbd40d4a11286adfb83841300c3d2d1c14572000e82652c061cb8dbcf9e502272a11fe45a3b6443d7cf2150a7eec9ea6bcea93f3bf13f65b0078b2b5c1fbe57efaad5689ed44c9efd4f51dfb1ba94e8be955fe1363f5a540bdebcb86e065a6e58acb993ea879ecabe4d293ce48775a6fbbb82e2b257f5394a6771e488427518fbbac8909fc21e203931854192b6d539dea309ac25ba32d983c88027b6dd084d957df968b781c81cd32e411144f16eddbc1dca8d5b1c1d94378c0c76a9655f63f800bf7a9323113fb36384892c4c2f4930b1a91f89e8904e6a1893972d1b3851ed793133bb6a50701d83bcd2cfc35473abc40bd6663d24da9b63fe5c07bc5aa8723990b096bade359c36c435d0e47041db1dce8f48da5e219313ff5d6272e7a3df49d93fe034c7565ed39359ce99335d99d0a8a529421c5db2b2f92417c6221136007c948480b1b773bf8e9d964f616dd9a9721724e49a67612b7bdff0be5709c28a49bca12ac68c6498a1659eca27be207c5c04d0d30b0a2e1554072a9e158c605e1bb04f792176c89229f33859d7ec2654913cc221d154fe317cbd430bcd26584065bd2da60406dd12e2b6ea8249785fcf60e12d18c980225e9c3b45f0ab4ea6cecd486ce2ae9224023bc0a49519504b9522fd439b3e483155010a8da28f1afa6136278b978ab649cdeca7b6e98392842dbea68ec63cb697cfd6294a31e4cb1b01b1de7f4bb2a44f50ab6e7646ffa0fed506501dc69c033d74b13f76b3d3cbb305a3b48265f215bfb2bd438908ab3e7c75a7503e72ca601654f1681e7c6d326b49bc5a136d7a6d599676990594e89391d0db1185f8941a5f191e57b1d364b4cd1313953034512d911f3123be6885ea9a4d66035d1614b64492a88549170aca4a327ce4fb499b39b634b8d5cf99cde90581540c7d032010c31136b7e17d7b442e555e0701f42c4c56284dedad0c962e019b980978e2f6936100151089ab96b8da5fc8962cdf4709b1ddb11a9ff2e310fabb346d2528078d97d75f4847aa54aeffe04ad68ce1f35957ba5945372abfe4548c676da4696e6dc9c08bf73943d0a8357b54ece6b84c5ad5231ad7ebbff304e4fc24a9b44d2e8d0085a10dadfb882338b43478c0486113a910202ef0b1853a6413aff6e2da6cb48e508648efc69b514ef3a00ed0a0e6b1c2bb3555978ef2334d59dc1a152e2e16094b56afd4920d4423409805a3efa129ca28f56d42ae54285723ff14c5a2a2d289ad540e00cf54386996a96ca099937ca7ec9d7395b6af1aef901e02a0b7fee0da6aee9a94194973fa1fdf42567c0e0e79793577a1fdfd93a68564f9603e2b881a022673c262a1911d533a02481a26b000a9407888404a1aee7a69051e633ddd1b4659461b7f6abbb83868b75f062b69393953f7bdfe92e52f89db01f03fb46c81ba0ad983c5fe5ca15795049710e0b6808348dd2111c7978836d78075274ba0a9e33764584b4e3d64e13c3a21018919f9dd5c04181ccbd34f7c6984dfdb3a9aa8038c0b316e565841f8a4af529171a0e9247f946f41437d29cee43f67b90a5f57acb7e9724e49367d0f3dbaf51c41891c241d09b6e5dc1d7fa83ecd4ea2a24afd2000656d951fa265af0d109af604cc096235a458527fdb10903b08a2f89e1e2f4243891919d135ae3a53f71bf1ff55005a8c7d42eac7194c7b49cb34849e67b9cb45250ee4b475068787d832f2259738cfd42c82019d8f4ab7019e8d0629e83efc9fa4901b168fb96b01d2f2565df4ab267037562917138f0a324a565a40e9a4f95197227108a092f2265b5f09af2d35ea866eee7147128a9ab4d233a8eb7ddaa1cf1f976351f1bb81f13e3c6d185825177bcfac5b40394e88320a2131463c72f2bc18f9437108786e93df6405d27eb7ac228c2baaa95ea5fd5fc9e477e1a2fdf2c5e3cea078b26b27627f7e2d6e1607a4432d33715743d12623a1964bf33023261bea02d27d030aea493be8a9b513fe676440153f97a62a060d2337163d33c1b83fae6c341f28660fcddf7c180e1574093c12e247442a1408d18e385a5296d5dd95f4153d6993431f6853d767cff9e0feaf0d139cdb8d2918b51f79d791ee05546c97e05bcc40358fc32a831db21330ca1e9d60256c9a1662dbafb71b6b53dbc1996bc26692b029b68a2287f4335d7249c5f2f0958f5df6b4e6061397d0423303d0f31c5c9a918142c9818c16023d6a099635d2f3f8b1a41b1d4371346f905d24170da781a92641a9478ade071cf7cdd14da8ead7670d56054005c145de786bab1f3fa91d9fe38f615bc4ca83812e848a70cfe00604ce5456bfc9b60dc7fe92fe97f9dc0e2ef41b20ad3983e84ca133838d91bf95044f6ad3e02277a231fc549dfd247d084b7e5838737b471a30952b9d2c2091e182d686030d55d69cfcc076e84e7f1117104fe754e10a94c4922558a72741cb29301a9a29018aa764fae058b4bd05f8b4e12739713362e2440e344261568075232a57a1d62293239863a11a333ac9c4122171829cd77045a0478889bbf7b8d1e16f6bf0cf19ca41e03c4eb84b54a2e8fe05fff8e9124e94ff6fa9d6224b316f83cc44d3b0b7d9b6c88258ad599c4f860ff906224fe86b99f42126ef830aefe9cad6155542e1926315d29e99111b8a54cfd3bbc0f2f48a3c505fcd17357115d767227eebda5b4833733c49237d45095596463d7bfa7d40ca79f701ac45ea31713c4d85fa271719e62c11d58e85b5b237aaf96abe3f407629b149693e7e54e3d07db9bd415db3e0a466cac619e925bea2df4fe72cfd0c8bf43ba793901535baea76c809e89dc41543840c2dd59dd52e425d16d7a9c86c4631139d7f70a7beafd5f2cce359f36e428c176033934fb6e71d3c7b4ba083b901005edcc665039a3e740d405e0437b1edccf5e96c698f236fc38afd2330cde9a3f9e769c392aa23c39c425dd71749014cbc1f4341183655976fca6d64e9bb4e22c06bf6373948bc2236ce8689a3691cb21c58b777256cdba89b09fe497fae946ccfa67b836833ebdce40308c4ed5a9a27d754269ddaea6a8bb9ca0db453af5368a546e449cf4f1a2549c2cdbab991f6f35248105278527eaadb6233fe04a2975a650a1bc5b7e24d64716122a80372d2dd2e348d6ede4a58c46d2692b6ee94613dfc3ac44a2f34e7762679796f8f56352cbb7da22ca56c6cdab40e2f013b6695628dfd0c73a2dce08e3bdb7b490a60ed92783c0b39a75d75460ed38ebab828d862a9b5ed9525502d083832e87e4323a0732332e6e8ca874caeb9257411d5d268f649f874e7f11bb812a96b1f89733f184b039655dd995fd06197b807380e39dbc3ba1a65a23662397fcdec2402292f54bd36514d3661306d0a7f2f1f12ccbfb3b7c0e87a9d7261c8753f3c782394df51b94d3b84229cb6530d252d36fdb208cfc3bbe49d78b889033004fe692ccc64d550c8dea3e92a75a6cc1b252b43ced6c5ea8026d19ac76ea6965101e047a63230742909006513646dcbcf2a3de7d91b16128d7319420e3e178351b7586d0a57fc02747c36e3e902c9c8e1a0e313c2b5a189554db1ade280775425648173b7d6ba777b690f9ddac91ecd5f8bcd997941e21e3904d5575b074b1b76b1f28c4d1e9a3c6a0bee5427ed20b9e3d46206e1e320ae5f5c41e0339eddf856f5be2faf4a06ed3773a14eab56d061f2c5ac36dca4efbf96811d007e1207fde3fde329a205da57ae228ed6618ddd6c2761586db4ee7a772931e52f060e035210019e77ce148b652e2000b6a6da54d0e9656b736172beeed02b371b44bf944fb4aaa9696874616c9ca663b100956ca87cbc5c7a42ba92e6b4f4cd395eb480ea715c008e19dfcb5e0ff560edd9db8e7b2a51a7e2dce85eaf9f708b34cc55ad699d6a89280bdf7ab8d11e6b01d7543e1e80223a211e896728843855975a29c6a783ed91fcc8a1a2c3f94c96fba75c839867160988840c4faa9b18c998901419343492f8cfb1169b7b53971035d92695b6540f1dba65a23ff5bc17311ecb980b5f83b4c50d28a5adf40b6d1fe79a25be9aa629b62b83f6c97de9c76e4e2c1d504144ddd67c59d5040f509e993a92d451254158c016919685aa77e5ef6b81b0c43ec5ccc90a14c3a50b873019524ca03b10db0671e783d49c0d32846817571ea49d47ece0897afa3ac5972d9b0fe5b50495cd6181624a9e6449d8a395d5762b7802d46af5da634ce3a003e9becaa3a61b46dc025ceb1909ca9c334a9166d7f494e4d135dd956f409bfac95bd025391111155ce3e6441a6ca2e8a2cd0dd32d146c9195f851eedfba830bc478db24c2866fcc387fe43e41f1b59a075b35a8572d64f5dee94074eca98b222772344db8a56e437f4902782bb229a5c8aec8dd7f90ed00f86db390f1b50160fd972f8fd508499d33ff4bf12925acb134237da7fd0ad286652235d78794431283400ea283b7b3b24d572f2436731ad74b8fd86bbd4712c6ec5617b90031337e89b2cb6b635461183b170c0d53810eca0b3771f5fa36a304c972fd1556ee7d5fed1e10913c02b2ef8d8f99f6dccff7294ecbe134396744dafcfa04fc8d1112c1cac786b588c8d64af9cd4fb2107fc36c2a1eea4dfa95d8016ff4bab9d0e81b7a4cd862b653d4c252842acec5a73140300d78abd62d77fb4071b06051497fed6fcb35854969998daa537a00dc900202a078dbd54d2e60af4cdc555d24eba65bb3968349e720825edc25ad79221eb981ab23c39a22c263bc89af8495315a05aa500236985c99b9d1d53e6aaf66ebfa33ccab8704719f01d69a92dcf7c0188fdf348bd539132f2545ee68988dc05a2e8897a2a45c15254cb17ed99d7843bfb41ea22697b71ec49f451cdbfedc2da53524c26c76dfc972b1bedadfa31086942c96fc5ac95eaf941ae5372a9ca3eb84caed34adb16997b7373121d91af1a4c570c9ee0e570d5a87c923edcc12bc4209f4064a989e2f095cec235a56d044b7700eea7f302a2b9caa4c4ea3d668c645f0300db761697ae90845c69bd72a57d3994ab2caca190c2590d7e8c9e46a40d583b0e29b6eb2e6b6a994084269f3c942803be71f5ba393693192f822431000f837fba7ac64b36a5d524401eba8bc5bbde446ebd57b0cad35d37e3835e98f84fae63d7a8ac180c02fa8565a9a3f57138f40daf475fad435aefd0c556cded170ad5812c9003b1f0ab908a3cce188d3aaa9c9c33355ec436cb083e8bb3d364dcd92064d1ca156751215e408c836a935c838cfc63ac8da30eb2126af2baeb530eb19002f3df001658fe9c44a9a49c2e22fd114e79feb392acb2fe4d9d74166c07f3cb2e1726331cfdf0e6ae5e6d51425aa357524035e78bd94a95474c78a6d45c4d6efecbb48b817e9b862a4fe8dda0e2231a3ab23d6f57438d5aa7d76b0cbe5b6582fa2181f919dcf8660febac7a161d807f18a0b41aac1d6037a92e7d45a8111f39397f97648da940ae431af35c9c2c625bb953f8b9d015b43c1afde377dd5a955db3e623b23a2f740b52197114be761ab2eca4f81eebf6468362e87ec969e0cbd7f0a72d636355e2d3f4a1480c7779f9fafac19d4db5744e4a595c4887507345104ae5daeb1d7a4d94c86bfe65a5dface8ea0d1d292a1a52a53d9a606f2e20b69d5b03412c922a506722e4254a3d47267967204c9ac8705cd10209db0dd1a5704b32c7206b206042ad39bf9ad88f01de3700a314cf3cf7bfa03a32b23d5767e8be209656af8bc1c007107a3c63d912fae3f17a3b75c9c7712d732ebc27cbeb88e4ae37898b48121b7589e99bb162c7ca55443a1f3d27500cdbfc8b77d6fdf205b135f4b4fe6057af58df49590604a55f6a2eb653d494e75e32dca8959fb61ceae2ee9e81214dfa7f744a1fc6357aabeb397deeb2057e9a184a4ee53b2555b690afb03d46d0a3b4ffec515ac3128b20630563798e38648745b6c48d85ea410b94180d2007a31ddf8488a7632b9e22e4a64f47c0a30db2c2ba26e0cf4561a53c4894891431e2f8eabca5deb452525338977d4ae37874b77ac12df973826a843c9c5196a0da8d0b6eec2ddb0339e6c503577693b644d767d0812596234773999194628e32dde1035ee96cdf8b7e3ba29892c3a5b8ee9c0cc5d3a3a49ef286d28010cdbbd434780a98c5db51ccc71e4d9abc3be96188ccc57f69a3b2e0f714d9041e09c57165b04cc6ab5094534580d8dc56aacbe91435095bd301b3abf245af8d1f38135968c2647bd7beb8e2038d8f3d446ccc6e5ae1210ec41e7c88fe565650d5b44ebd1b88138a960847d129664e323e55c2586121a0b375f5d6ff15b4f03c8ea6c3459d24208ba63e36bb89b31adaca4f0df6e869c7fa3eca065de7f65ebc6045ba747b0d32d34201bdf20911e360e4b01e46dee88726ff427d3861f739cd4ed230c801d8c8c1db67b34110cbf0bac977d8cdce09a23543f5dc4bf44f6b7e3dec0a83c9cd1619a873abe0c59b10eb688139127bc08e8af40c63773ec0ac5ed9bab4ac8a9068a77ea4a61935c987bb6456ae051b1d30439064ca3b340f1b2122d25af72070d6255531f02a08b0ba0930f525c848380411f763477884907a7783dd465e4f0381638760e061470021977d8c58d3a7f1fa7ef37115583c7da39693b3e8fe45bd6beb7008e408bc9ba7d3cfdad8547a0e5a8764726a9d36146644245ff79df09357906b013c2394d3a36d4e3e76527f897e9f9bca388d5a7222fb8acfb532392122ca6f59ddb747dde12d41d99696805113ceb10357ebe064331b4b138f116dcd37f1cff05d205ddd744750766369c9005bb9f644e8e7b9989489f7f5df4dce4b9733641ad6ab393a5035670cd20be606b16a30812aa0cf495d93792781fe58df0eb0c3f659b3173ac187079e4f478aad8d3bd7f6eeb62bf6ebc7563c5aebe857594e69e4d3ff87ae4ecc5fc9acd4126a7477aa839b703104c1a223acb031e6b8d62f91f279b074f8f5176de9629af50f908c5401e63126285bedb0cc4f5be6670763454e08639d62f4cad7ea4ff43168c0d69afe9efc00c556b680008c0be4cd6491bda9d442a5120b16b68946f46db8f38d310db0ef73634cbe3223a46f07e893eebcea3dc45ff834f539d3ee7def49f6a05b991bd4b82316ad9048b71cb877b91d0a574caad80469454368ed1a6d0994e8089b6ce13da9f1bc483aed14806b6f823ea34d9cd31aa0c3b3dab4c58187cfa75a19d4833731b09787f4badda291e8330842d4a04527f7747769117d3ff9c2cfcc25988df1c5eb84d0fae49652b4e5eb9f089abdc309b3da463b944746929ba170863ab30ac2691b274aa4034114411299adb7667a304f65123ed465c39091f1642d961ac36e1aedb56468b9d2e83df4323e77515245e537809f130f0fd531a1487648a763b6843438385b72b41d2f0dd9ef5a169b5a2bf416423c2077b39da3eb14b15543dd6027c8b31a78dc8a805c9bafc31d5da665fcf66249445f4451984cb868c878c51b2b040085ee70603ad377847c55901cf3a810ce96396f4587998f0c599acb7857a9495be9145f619942cfcbb5b6d6b38180998dcf07be119eaefaaf9eb8fa3d6227117f43188e6b29bf838dd6bcb6aecff068ceb6e23d9c56af32fa070433bf6de006ce3daee9ab1c3a51286821e07b6ccd20547e2f8f6b571803ff0f2d9c80bb3abd9a1d10ee40538bc3b7c22b4b628955d733aa4faff842a6828407729d5c106d82baeb97e7d100f1ef61113b8db12a9035d9402814d3b6c6bccff83582d66f8c2c47a45ca5cc5670ed6e72fe93e80db6b4a6f2aafa383f50033938074327b7b7db9c255508c056ef574871a99705a152e1c4d5d2c2647b488b0c18376b9be743ce337f652cf37f049f7186e1f2e127553de9957df8695769bf009eceb485b01a4418005d3e3d668ac8e54cf37ef9ea33f4be90bacb91fa6d78bd82e9d9336efa3984d94650d9c701cc2d2c65bcacf680c8ffa6d80b5b6e5d70ae265de63d3981924578f50833a294f806d7e9745dcae2dd4bce184a17a9763dd363b932e6d06c1b3e1a35d1da9a7d85700ad0ea5d4ed77819f601d5f834a9f5c7e2f2151628e3d177d386fcdcad321ffe48e32f4b933e18bb238189ab0b4d53727056319776988b3ec1ca295df26906f641e3aa72ff7bceda659c8f2ebe00299ecfc8b766c1c2c9da2019841c2cf144140e8c668d203de90a43ee1774142fcda9adb647b0e50fd99e2ee3a4dea40611ea3653f50429a77ee082e33667a5fc2e0c49266ef6b19cb04b8557808111536ef9682f6699b8346119d4026d9971a090fbbfc286754856047eb2ca5834da239033fe900ae9686dd825bd9f209d1bde37983491e2fd8ef5cc59b46afc5da4fc0849c705fd9ad52f8c471f1a89d4f8a700aa74d90a6e48a5540d090985c4850a0db6f9acbb3344f6a59ea9d861a00c37af826a5476dfc1f20674521cfa695033bd6d2565d1068735483f4a8025108a2c6b6f50f5a83e282bd13f54370d6cb850bd73688b54f81c4771bec25d1c25c3459b711055fbaa86d9e448ca82e5ec3a9ba39148afd5d056c0ad98b98aa4faa6e92bc6635e55b62374edd3157b36f6d833e536cdee232f5fd743e0c3eab44e937c4219a494fad7cf633f27035856600f5b08f34be5867310e5c253ae52157a6ed251198f254767edb283e411f1b813ee3415a12349047a47cd46aca530de786f1ca5e48fffca283417c304e04a020922e580603f9b1c237325c6174a9eb29366eeca62e7304ecb8daa644841a184bbac248d01a1b402d79da46f8fb60e23f91417c8689a72cd1cb0e4ceb9050051b31c7f41b126fb0c8bcc83c0ca61724384a968516de86f3ebae7a864ebc1069d61c32e114557db5257e30a976f9c215fd550d18a644f28e848f10d8a2d5f800d2cb5483787453bf98e42d475e63113e3cd92674b6f920b1d789c3f038df318382c4e24e2a59981318c2d4cbb498e2ff48bd74dbbd5786ece2d715f642d7a207a9b0d689fb1b1a26962c0dc366a0592f49d7bf255f8d6d4fc2304edde78b740530673d8884c88f3016bda820ed81ebf9c2798faeea8883fb8e7df24f1c13142ada4d69bc9511d2942713f5301202dfea1eb7333357b750479f5589826de0053c6f02acda8cd450713084b9d52635d9f8e7f63bcba3d3cfa34a53d6a426dc6980d459963acd844a84217d6d5b13d1be31636ce39a02c3bd7af5faf5321b99f4a0be2422139af106171ce030c6a222e2a3f24d7321634d990b5e48288f8ba78e64875a2aadaf3261c07a1c447078dd76f5ca31e6249588e2f90602ffc209de0d54049477c7b267b0a3271df30f18c03cc98441b098d9d3d4078975ed61a587d90e409e5036df36fb8df89dd90ccd76be8b1c7b75c4966abc03730e728aa73a84d6ce406db5a194c14bed56a45e42d72425a9b704eaf854b9d8f3c1a877b7b7d18cdf6df94a6307aefef4db65422be9823ba46f0a20e0eb14927f7309259f9a34f7c3d9186e070354bd275684ac2592bf269c0c9084494305b6438bb98d019b895262b56bf4a469e85c6a63fc20b070e3ef0f243690e2d641614d5a94c5120f3b191c96986b0905e40ed63c8f8cc7749f4353e0a1cece5c07d868671410e5a07ee5bf2750a666eff816b23537f44e2c6fb964f4fb1a964f5b95025b338fb8045ad67c6e27b39e6b78f96715fa4d1664b400d9865b560ffbcf212e59af9ea9359dbba03d5ce15cd5a65d678638539e17274fd20a7c6c66256a66f6a98a191bf55bc6de0dea855fef2012d185690d2bef03fa7b9b31ac40ff37ea86a3bba1aff9c7a030b2489b0c36da878d138aaae1fc8378f8d08c59013bb350782c3b73397f5198aafd93e600d4eeb0cf1db0d0b9bc95aa9bbb064a2834c6b4862f6f51a5e0bda5c0305289a19aa19e97faec88dfc78d0d4d2fcca17a3c463649ff471eecee36338aa8f411a2bb1aa2270305ea6d79615340d40c336cd3c33d10aab2ca61414ab5c078e40f4b3fd88ddcdc90c5e3b9d6c127af09cf7e86fdccce2df434c0abd2c23dd2110ebb46c62b03a3eb49152aa82a9513d4fe71e4d4fc51a2b750863828243fa03c61c47f849024815c924e5f9e46982ee24dbe33f0b1a3065325d7dc30c616cc9558a5889fa27b827c5be10df9137b3ed2a082833abfcfa137fa00c015541e88e6537f363394e05d653291869a53e7f9f67b01ac55d28da70b0e7df2dad311df4fec9acd9b4ca768aa6492ae7623b9ef7bcca0d83aa32ec1743145ee732428d5601f07e4ca6d1df0de39efbc38124509071f361e56a30f5fbd6d65af6cc00bf5a78ada0648375a08804254a544758997e817764d577b81b4285cd09496a4ffbf2b8559f59581c43d5f2a98112693b065706a92de6bed3901dae029660080ddbc7819d598cb9a70e2bd65d62c4b2da60adb65a947c6a7c1c939d5fd04161084f9b25c3aaae0fa40c89c38839b2d8de1ec30b094baf983d9f1d1de3c5cc76b5b189f5ae257bfc56079d255de9b9ff587b0fbf840b01e29043a3b86f0961fdef55e37e58c22723cd900871f264ae81845c80307db80ab003a543132618a48d7cc58d44c4aeda83112bae96ee26b407177623c48a9cff61fb24cccf24cc7f3ddd98b90663c20129f22f8406c4047c842de549fe8a7b9804d95a993f5aed68e512fd160c2a9ececd0826c3915783583fb49db3bcc762aeb2f1560a6b7c5b13d592d967e75ae47ec18da610dd4231f963d01fc490a0d177be008030e05efb32973e780c8d4a1ef2acb949d95e3f2ed79f7c96ae13de8bfc67f25dd363901f5faf6a578d58988d6db332dce23e544ef02eaeec40c68bfd7bc66d93d1b5e076a51c1944eecfa91200d3eeb83a85cca0b67020a504b805e0a096610700b8eabd96e9d7562ac0cedeb05223ba616250fdd6c9b59d0873114a193da64441e00349837b5271105a80cd6ae923c2f5e3da9fe66709fc93902d34407bb7cc79548448233aa496d228100a83bbd98cca0a136725715a334c80459df4f6cd568cb30cb0f8ff245baeb6b6fde40e6a9f6b14b3d6c86c05bab605299c55a5392a4cd746bc5b195e378682ccaeba047ed1ad83dd4114bf40ac71d6d903e656d2daa72b3f5f6b9629aac86806f539ef2a379c6b40ee1f639364b1205198986c0862913eb720fc3f83f1dc1f2551857565c39fe1d8ead80583cf3a01a628c057bb65044987452c64771fac03832163138da3b736310cb4724488c31a4558f26c93a59924066462a5ff585f57a78d2f301dc2c5286d659adfd82a66507e7891ac42fb456b0d3c08fa5908f7fba8b9f8308f7e85a596fd92fcf12fbf013c511256b95431ae0394e82a3c10e6cccde71dc9244c9f81cfee9e9d2b562f4b68fc353776879c2c1767c44b972d97e647a941332684a31ca09cdc3a85e1362b3f2bc940c2ffdba796e356a1c5a228e561b379d20bbbb7929e7067a3e02ea2a00483870fea56d6e26cd56e0b669ab58ab105d426fc5b774735926a3db569833b3a56bb02ba5dbb643d32e47bd361e3f6938aa85250935a4e589d9a7a67d7ae3c6f43c3c667fa67555ef7ae5df4867fea5c35bdf11dce865d1d8bc0da182ecd2e99f6a8ba6ebf3142a16ce0b3445536f0083afb0fb0c9132c71b4036a7338cc499e34380b229d7b8c9447bce3e8cb67e8a90f50e04cce71d3f758b20d419ffdc4801227395019ab9a7b3c38d8252164a1f0ecfecda6751921247e119408a09af0c0a631d86d781590cc209bc0f6daa5bfc250fdcff88e7f1dfad4aa5dcc5373bf532d6722f51955bf25d6e2de71e42c61ed248c12214a796b5141d1a0e89fa0c0a4e2ea4913914ee360a0dad1beed572d2b2eac7ced51ddf4d409564a52661d7a545f7a2c29d6247df7324198bbddded4a987053b1dd07d54cee5161193d16a68aa727db0daf3fd85f7227f212c5f3e5d6c016086b31bb6afb79040cd3fd7518c50f4357fdfce12bbac0d916303ccf6a0a76e7e642562944b1ecd2949bbb2f69773ccbdce3101347d1596e25bdcf3b3c1b0e8661242b965a59f0133c5cf9743d00c2c34d6995bba2d4201195c31e2669edce22d6de1d04fc2e13aeddbb4ef88497ed18300496ddd4188e3a8117e8cd7457578221cc848b386dbdd936584a0900d65954ed8b0b80893c6bb06bdd6a4695c18907045c54f693ca218135df250baada28bd60904eef2147bd27211e4f5ea83e1ee27b1ab2b64558bb666ae06591efa546cd1296e7e174b5a753c1677f5cf3c95df6b2f05020f19de343b6304369ce28f64c5fcff5b0b8c97e03cfbf5a585267ccfe34d9ec767a19f92cdae64091fc50917b88c684bdcc081a3b3bf2617107a98a4e1383a9bf775b0694c340b06bde188268d6540d4b00aee13305df2e66e7f096669612c8eb9ac8db6a6563a9e22375f5002cb6f3d44f30dd121475cb26508412672308d466af315c213199e11f7182b66f44f9d814d64c916edb75a610d2ab83a422f5deb2be5d53ebd1640655e64defa6e5a1f4223338719309126f5263e9ae9973c6c5886825d7232475a352aa655c7d1b49bb3bc1eece8389319971da3d201d97571571f8d60d40d67c5713c1ad5c40134ccc66145914bcd18a0c83302ee624c1fcd5899e20d7807c9d3c386a266fea44455ecc140d76f6ea9184f5b4a46d3409016e1f6754667ce7bf6206ae723a33559b64eb1b647b08db71b68c456221c59e9abad15b6d961dbb8cb5ecae58d3da06c7d543c8d2656912678ab4806b9a27032c22535c469d23bc97b0473a97a92e206aed71792fd8364ff50bf1a68a176fe47f1c7ae6c2ff5ca1357be9f241d7df7fcc10aa3f1fe871593c94782c6963d822fb51eb285facaeb2dced44b33fd1ea8355b55aa2430a4f0bed159b2c48887184215a09c0127cc849004dc2e1d4d01d84602453f5c8b511f03c0cb816256fed7bdc2d6ac3d7d4d19c2c34dedec3515a413752bb7fedfdca3e9bda7b297c1158a2875f4aa489acefdd98820ac9ffc831fbe9b757ef0659fbe7379055829302c907875f5df436d1d06360afb56a58142bea995c0ca38b09fb70ad775b412b2a67bfb98fab962770d586abeec971dc151f206f146e30908031120ab5de9a7150dbb8ed685c2a5411f5ba86121726820fa3fcc757458c744f5a85a81d7730c075a79bb697a421bfea190ba25f524be0be544aecda66dfcade8d4cb4ad714dda4ae4eafa02b7b98f9c19a483d7c4fdb6eeec678cdd2c046dd6b63d9a1400ce60f1f5ef849846ced70ecb6bb8b28939468a166f698783248a939e2fc6f80fa7b6cc8ba5ddc47a5b10b65484f6a8985d22dcb741573a1ef7d4166adf6593ab98d846abfbc2f7c00977b53beaa4207f324bacd189e4859199536d80ab3966aa3b7cf30b79af69c21d3f7caec09b83f148398c2daecc5514e15bf265db80205fde2e7ba7d098fb4f710fc37c50acd3fe3c78ce98a03f2fa4206be19128e8645325372e64745d19f47be89c71d24633cddc1b91e3034af824ce9298f4aa9a2c662a9b24e0346e465659934bf1b11fd9b038eeff12ba84a651eb7cb36c17ecc89239799a9378bd32cd0704cb745769a3a38fa861f2538975926403324b0b9041ce6c9d75abbb183e7edec02e045b94c72a43a78d71716afaa5e96be5cf59fa3694fa77cdad3a61a070dae9441cc0d6c0482d9913a26428348192a11d90dd69a0456c1e69303e05db09007470b00d121dffef5335d0f003831d10a2390c01301bd1dca5241df332a8cfc184c664fc9ca09a2cc98aa4821c6c98ad84eb7f892c248382ba26e694774c70a39b26b3d2739162be030b75d4d0334371c5a9151b1123b65d3149ba5a9451789e71fcf4dea544cb71c87d50a7f60c44456548ced4c3cc97732c8c1513d7481a480d0178b520e05fe206899f8b8d5c049a95096a1763c655837b999cec9340ed1d152a8d486bc5167ad897e8c02530870705aa38d790f9829e348f88bdf8aba164e4af7f6e4d91531d2de3bf83639bea79dc364240afd50ac270c7667b91311589595ece9152bf9ebe6129d4c792e617bd5c9f79b482fd24f23d1231fde9af743ae095cb45420c953432902f4c6a699aace0d84a3b90da5bf89ff8fe16487c7159f64afaebd169dd6b2d5ea8c44324c1b99b89a5517f67c7d79df91eb7c0685e1e97739f926d68a4eb83956c7b2a9bb3e46c6c2a65e26b728ce2a791b9b3d0dc7c8abbaa7b96099c874eff8f73f9125f8e95c3949e17dd9c45a7d68796d224eba466412bc175b56820c8c87a7aff3225c9d3db481b5821a66c022057bbfc3ba188a72cf26e82ddaaf497edc619d0c04b8aa0671958726ed9895b691c457cd30c42a1ac074e91519b1b558e738ff63ea3ed01956a48cc096e033e6bd704969df1608468de5497e62358093ee1015fd56ad292d6c1b453b5abeb02a6dff4c89768939daecd537026591aae11d2c6a5215b6836fdcab3897bb23834bf18c8f4c76ca10a88355e594f582203e708fad6469c00880f3206f6a0d52aac1af027d35fd2b423ad8af43a7efd15aadc802e99816c322709e3a06b9f7a1398063cc2b05f3720753d46cf0094ebbb33021c1c8d027cfd02622081e3cafc929b2c1559fb6d77dc8151f298dd7e014e3e1201ceca4d84ae191ba4511236437fa07fd673ed708eb760d17ff6628e52745ec22ba64a839e7d12249571425b3ca262fbaa67cbfcf6c5f8bc8f2bf17be607dfb8b7195cb5c892db3f91bab02cfea00ee16e684ee068d24b3920fd891ce08729990b40e458a278796c44b35b48f9d6aa7df420e3089bd7668643b4e6372d42aa4f47fd8e0f806acb4f236b4d055cf98b7b5162d6cc78e4a8a980a7325971fd583a56230260e598a40125d5dbf36081f93149d44b8eac66676dd0d26c491e2cb4db36d8199781f7f21b95c00f00913592528e018d53a755f438858270ea7532d3f4fe61ffa4586e85895f61f7b077d8dabc1fe1ee81bcdb14132173dc2415d2efea22b04eb433977d06edab99a90653e4cb09fc86b302e67c40a40717ca971734d9f3ee92e47f9323bd012997a4b6d36eba596b2d26b5edb5ed586246ba1607d7ba151a140baeb677eb6d146fdd20fb0b96925738507fd2a8827b1a799ea136c50433f6b9bd50ec7b809edd859ffd57da24be94d4f0e5190421f8604adb54f80296352729f2de0c86f7d3a0daf9369c8e0e4585c28cbdf73450b9b5ba63ad15fd22286311e0bddcc25d9d7d3ff8fa64ba1672c421a5e434b3821b16c048bc4809d289ba7c650e1628c95adc84ef2ce860ec6db759c4885c351ab9fd223637a8ab56161d9a86dd958dbbbf9fc8241b53283b48630e89a2fc18818c630f82f4582b704de95dee2216bbc43eacd9962f5cb3af3a721caffd115d1a6ae9af517eeae6804533f16d0a02c6c8cb3bdf70cadb5068a6b375cbeae6482092b2ec8fe57d4129319f4751ce3244027f72049fbe7bcca2dfa2cf25887637d69f2d027e235c7af498b4516e5eb9b346aa8b3c1ffa74773835f415601844ddfa07153905de7ceb867df0e81f42811b8ac4046897d682b89496dcf785280b48d8a7a9dcf3a2ab2b68dc1d894413a5847f1c9c03b3cb16f9d5c8bc54eace8ddd518e274a0099d0e5c7b90c24afdaf896d7dc9abadc1e5c8b02cee1a877856c3e9da876b5ff13d80d91cd58a03faec6a9e8db2faa29174e2235c539b70a9040d6d20014320cc49093e42fa4ba93259b4248b40dc211eda6ed2b2b7e525bc17249922cfd9ed4178bfb2c6f189fc28cba32187674f972933df3daa55f95f93baf3a5f9de7c6e925cb46b4e1722e14724fa9d6d71067d2301a1688ece2777750dab2c6e29d8c72e8db9339b04129c94859c2363a13b197712b80b56768925830d9a6e29a6e78864d5447f359fb98c080b7837ab99f4833695d7a8b8d6d2cfdb02ab6a53c5ddc68d024473ac93b2099d14c31b6d269fb9593e6c741c35d6314b5234a4ec1fa5bd9b525604b57bcb238ddca0b0080fd1460f75c2816d4c231119161e496b13eae30df0ce8c68aaaa744fb8ea66972f2a33dc31542ab4685663ae1026fe19c43c6c7dd22cfbd0654f8ef8afef31b196813f768fad224c9a030e65653d159e03235bcff5bb49181cb9dc5c521558f3a6e9f177ce4706a8f1a1455cb25709989f9a324fc8085c67e39dce6e0639b2486ed591b16f248c6379694688b229fc8c9781f138c6b31717188a7e735080147c7c2504b8961a54d9c65ed249059e5577decb8072f4629203f028f67def3159dd2b70afd31a4fe14d21ed19bc4102106faa6b21a0dbade48c45b44f6cf89a33f1260d2e071764c6975b10615cc805191c90e8bb51ee3adc0cbf07ed2895ebac43bb43931f71142d6fb80046297204ba2b1c567567ae1d54cafd47432d9d5b3c5d72aeed6769d438e53b0dcbf85c4c0514aecc5a4d8c63a33a8d109e7bc9f57cdd73dbf949fa8db0807b19613b3f98d784e6f20ee13db278f9bfcc83816a315ff71d4990819852749498fe3685e8fcab9b7c88ab47d41687e9dd4c02a8c59d8e7311eebf49a8effd565c9956feca65ffaa4223e88d1a4983285008feef7857119ededf49a812a743549cbcf26757c652024a2f29a62244299335c2c2609e034af16ee2c9b584528efe59ebdc4094cacbedb5c4c776410f9acca4996095550b47ab7f8c0d2a56d93820f4e84f9a62288b4aadfe494595541aa1c02f0e5a119bbd72e3cd501eb8ab9f6eaf51670c29b600622367864a4dec1358db87b3f1304e2315daf42b094955dc7cabba511530d6b0a22557b53287ae61486b03f6c18cf184cc9c5406c342a51eafeb4baff628c3841e68584793cdbffe9a1eba931b1fbec6186948291945a2e0c67fd3881a3ee57aa1ac0ae4d1ebc4d55860478dddf7cadb56fa19443ad4e01d58c646d7432bb75cb17fa424d417ab033537352de8a581859f8c923952a7ac9c2622c63bca0c7c1a23abd9b42c04e704e9e10728dee70fd7c2c62cf85c78020616868f1351e48cd8b5d52d6caa3fd9a7cbf7728e406646eb04d0cbc899159076cd4d2c2fc34308f100d9eee0ed4968173bd22985ff6d86eb2ef4539267a4c5bdb00d7bee58636191373649faaf0913559d4d4aac6c0f7d446dce1a5daecb6fe14fa023bf198a90e8c548e4c8a8701418d48af2aec8c6aa82f2c0e4204a82b071b60ea7013a9070231e484fd906ed55b0c967b04d3c255ea8698a776ac7f9a4ec4ddc5e134a4e76b20b67571425a15823251fad77e456ebb7ba0aab6a561b32199c6f385d9df694512b4194cdad54e572b394ef6583219636d3c0281a6c3b3df727b7cf0040f65ffa007a80076c7f7b8eb9f6c822dfe73d5cb2006143927e1828ba01157033cefe69e739687b0daf6494bfd8dabe05366a9a5ad96aa70a8a78412b2fbac2afb0ce4e371c55edf96244e1341ead3be848611edaa66143c8906d5edc022d981520b760aff69cebcf0de216cf7d13fa449a40a6509021e5d6f2a1bd630a07059843cafc0153123d9e07c032822fee902a0e1b36359c1c96ce9524d96c2bb441fcd8a4f25fb7f00b22a40a1caae41c616d21b34cf02cdb20554c35481776bd1d0c32b11cefb441fea7b58d9d3f8ad8f75c22d12125ebfd19272c96d9986b6f6db21b103fdecc20920300d9df21b8163a31206ec2803d01c12cf601bd83cc5e324d84f9dd6d2b5ca0e748037746896af9df9fe69d517a4e8cd41a58043a50ecce28beb6038b8198561609733462d4dc27bd473e317c93a3ce095a9cc23b04be3831b0fde863efbe26943a676cb6f37503f33847ed035c749f1ef1bd4fb21e8913ec83ae07f271080f000378819df06b9b7060305d533fa640fbfc24027481dc15758f83100d49f9a392572347f6292151526fda2cf4646079a6762050945c7637997e16710e43d3ff0e0844e45712f91b4f53e8a02201f49e64a5c2c9b7fc658efe3b4220449ab49004074ea5deb45068872cdb2f65284775ec49851bd7134d775bc5338d6d21b064b0bcd2333e2eb76caa04fe72a3928f9fec82c1d8f388fbcda474814d8a9cef6812afcd6d3dda9d02200e6cac7a6757633c40a8c228c50b000d2f8937eb26224c0661da4af280ebfd798f47af63b516b53c8e99be9abedf7a5221f91579cb9aab9b5b3e300bd7909032af65004a9c9ca40538b2f1c99993cdcaf1dc9ceb4a80fde44cf379097255547432a0c9b39fa8e0c4ff0c9925363f98c0ab50bfcee421d45b60b5a6e7bc10ce7792179a51fde040866979e642ac9ed1b0e108bc29431aa1c5dfe1e93cf4207e64f3634617eead0785d3ad50224c8884b46ba9458be6e8ad97845442d2a5b3b57559b35edde25bcf8de86685667d0864db5074dc4a72ed75f9ed5a3b19636f7e2274b8af7cead66ad6814d209e68203bd599256dd510c11fd9066730f4159607ee3335f9dd9770e3f6e6ef674cd36e07b46bcb9aa8d254109a46db967d397817529e1e8d3079b8b48d354389af4eb2829a83b36c255a1ccee9d7290324ef56a856110a26fcff6baa4c79db2955f2de617c50e60ee828957233b4cd60d28a9ae16bf4558cfffb63b3c0cbf4d04272684ad9415cd52d07ae40d1c7a13271638a8d3f84020e9684a4a72c21d3a01862245f6967c3720149c4478cfb8e449a8663c3587f7019ef141b4c1235d5b7ffc7bb90b915c15cd2ea98262666d3d58d1d47f19342f5bffa422495a6e183bf8c1b8b1df28f8ed474274e47b4492791fcf2e659214948c2f42d0a287394f129cb38b2bb35bf2f78ae390df3dcbd06f6506bb00f20ac041db28dd91687ef0864704efce0e7292ceb83ec4849fc559ed60be8fff4f42baa7d4a2c4972148306169c1dee7f1ffa179a87e3a9094ad085d43bffa1519c6f5b3fa416023dbefe1f2251fed1cd7dcc4dc34d874d9dd914536637bdb681fda8a7922374b5078868876019c352284edc64f8e5810f8c91bdd9ab47766e542217e998d62b09f953c2c84c6935baf43ef267cdc73fa5a661bcc73ef1aad3065a3490ed8154cffb9cac7051719793d94193159803886936bfbf33bf66f0a74e116a6cd2b4c4fa1e271ce3798917d544368041e48e03458e037a0e899e3458f4735dee7f525f79f234d9346fda23633005561006155808956b000c78a923f7f23eecaa77fafb202ede899c10a5c16fd628fdb04b8ab8cfe5185061d416386358a9d9b47f6facd3f575d6d5aa6aa1369d832afab55513b870f9b601bd58b880ba34085eac17ae2947e43abdf1a1a0d7f07910b159860111eed0b6c0f03532b996edfd2ca2c6e664056244edc914d982a586f4018504c6be6f630e8f3179276a44b5e0a1f50cf4f635f5dffaaa14e498a5e21a8aa97af5ec38ae62d4253cc27a97ece87c7b8debe16bad7970da821918d910dd596db1d04e071318a8f900abdd51a93245e70f77660a31993ecd4638458328a545fc2bdfbac6c76877a1d2714728387fb4d40663190b9c2ea6785a5892ad01f9d2d77aa3caa6e2b3e1a630ead7f0942d819fb53942520923d1312d8a63e1b725f230e7e9c66771b7a439ca206f7c5362691da3c9aa7648449ea70b03a096283ad7efcae6ae6b5d5d01bad410e618eef7055888e542325662b532b311c17287f62f43d702d6728018ea3a8669e1865a7f7c68439062b844358726f9fe1a3bd559fba1411a4257b047607805d5bcad5c432e449422bc3e414f0e30b8c1b6170c1f035aff69675a2014ba9a0e061dd7b635d07c5febb7c3d19546a818b53df189bdd10f44635876661fa038cbfe7ea8a87d75305debf0c63f003000800024c64d8cf01a11d9aba9aaddbf8716d4f1316697b50c18328d4b4d68932db79429a524032c063b063a062b575ec37677c4b899e3eec6f677f7a6377cef8aaea35fdc3a9e78fa7b8c3ae2dfe045e9edceebee1c9d622949e70a3a5d26cdd8181d1149da624ae9734916547bce0c27c70a91914976c7683b624641bdfdb07a748ad0d9d941eabe99429bdc9ba49c194e8e15594b1d58d7983e9d141fa9acd39407ec073a4542641ef719d59a07ea27c8501051ad080753f850a48395221459a94de701db71538500edf048a2c5502289766a7993440d48e54542dd8a148a8c5e8268a98a00da19b623369bcd8e66348675cdcd0e66b4ef0d4e8e125b28d1c54dd7c07ce67aa7edb0a22e5de405b6a3ae40c974445287abdab59fc6fc17f6a80176e75411e2561ca244de6c75c4ad5885064ee973894d6e33364578e156eca13fdc8a5509b762dd5440fce6d3a773dc1c62841371923e93e0719f2164215203264990011330924ca122d44997333638004212cb92450b1668118587262f06f24132659200f88d0b27a7c8065c8ea44fd90511f5ad6d5c333645487899ce44fa2ac5373638394449dd8a9299f949e59e7ec4ad48a3485e12df4089c1a65dcc4c4e6baa1143ee92997124b18451129629db3573d18c40c58cf28c2ebac834cd2c6559fbd5f0b8fea8f33463ec8fdd1f02bc9e299be9a34fdfc47d68ea4ca6679373ac1e2711784c33a7ec71aafd3d171d337390dd0fac0ca897f506754d4c7f0806e0431700e22c15aebe95a13e980e05d6fc18967c192c985f5953da3628985e414275a8db81613f9d984d53da6e03a46b6462cbc44f0686f9f263a0bf7d376c4f5f6e4f3f9948e36fecff16e5fdd6cc8f29d89af9ad135e9a15b24ba28dee236f9fc6586d94eb6890e18fa193f0da1ef58b22014a070da84f6d718aeabb18ac291e0b76fa7a7a4c3fbf0726062bbe56d6ddfcc1e827c31ba5dbdfd03dfdf9c9f09b3ec8cbfb76481b60be1bb8df5ece37fd14ef6de83e19fef7be1dd206ee93e14f0606d347bfa8da0aa46bb8e73e5c9d9c15aeb6a62a905e9fda7dfa4e03f1d5335f769f5848a69631131eae6ca9c602e04083380e3408bb47a56bf68eb1b7e9dff6cdbafb37ac25f21bf15611c7562ea610691c0b23a2e820ac51b3ead6fe32f82b9d564937d91de3f169b5cfc50b57756ff0fc57fc75cdc619062d4b161aede8c88b2319af674afc5af0b4f2cf749169628cbf5d6451069fb93deedd5dde27404beffcb47f62f0572d797a35766c6ea626e6f6d8bb5bbabae5ee7eb77435cba5746baed97de3d74e3fe6e52a26aec65f1a99f2c6de64f76cc94dbac558a30dee18bfd07b764b39b939654b4eca96dc6ce97d73e4b5e7a960118946affb7339a594925921abf29493e57a8cffccfc85fd51b67fd1e3e8364d9277b9787b83173f9a98417f8feeaccab9bb4bdfddfd42bf61feaf99b5aa9242d958552379fb36ba15fd5331dae8d8fd71143822aa20b78ebb7e526818a40ac0a3b27a4c13e59fb64f667e2c545975301865620cc20bf362fcc431eecea57e7e618fd3ca5bf2b818b76163cd708b5fbe6fefea9aedfb6e31a5a86d76329aa423c0fb00cd06601bb346c4917a9992a10212d0a2754ad9b60f87d36b8acc0bfef3e7278253959f732d81ec49442789f062bc98b4a1f7b0e64157e7676da561377af377c35d03a3795f0775dcc79a1e9389461c8bdaf6e9f7fea4df36e7b66d517e486ba05ca0550af7df35dce7512a5319c8b6d5feadcea88c8299429d299031e2902af000b80d0d80be8151e068a363228eedf9e7941970963a58922e5d4a972e6b80cfa074e92e0677487ee2c5ca37389c87ae4ab9cf799a481869441021a208cd744212224c51dd3533690c233435670ce99136e506fe222209233ac8ba0393185fc3f3e8912349289d401c1095cb020a2084d0e284142f4a6530342915e2c44d155048e7285e78529352b94898c7a900818a9217b3946793e3aea03e38cd39fd3b5961456cf52082a7c9e39452e9992f2a44b63833051144156a9a8b2406494e5195566942952fa82dc73f1c379283cbaac409524918db0d8ec471e9d3e5c71c7f57ce0d0e6d8e5362629933c70582711667914ea01869305a13b422bfc1e156470eeb34c698d58c8d8f17ba2a53ea79abd5bbf8eb3153c1afc1e04efa715e40f1a2b28563deb6294fb36699bf88376295af2a49e0aece7931a6effec2979293a6afc74c9d1ff85f4f91fbdcdd575b84a012956c51a2851221782bf7992e84b77d7c75bfac1ea70c442880aae937540ba7377db7a162b8417eccfb1b84c88779f91b2a261fe6bb45c56062f03e860d415e36c4f884c89fb2bdbf84c99f280dec0b866d24eb66c94695fa50a5523dab542a558ad5bbc4342846a158c620d7ad7e8f05eb56bfeac378a464bba03edc577d2ce3a0adb113067749f5a86fd5a73e44a1548f7ad5cf804ab11a88c14635aa518deae7209631e8849d30cd06a5688cd302451c5cbbb7d6b2a5f176611a2fb59f652cc433987f32a8df97fc13ca0599980c489c4af5f1d0e954848f6ef5a3588d84175f1dea8510013e757b19203630d8aa5f176496a76e0f83cd433ceb9a5d8aad06faf8a8a21a6809a8a2f687893e1e62f006fb6c0326e2a186c9df2dbbb4cd21e30d299626b55bc3a5a91e8542a952a8bdb24727960d68e236689feb4d61896aacc4c1f1d53af0fc431e9a3c34bb834c387090751a48d8de6d35436eac1b1144a1f6a230c317136df88713a82c4302313d64c488808c10c48081400c11c078396046e0a970783e54a907a8489042d9a468409d6a5025387534a71f9dc9019d094cdc8ca9068e36803b01dd1840816c73850d0553d6990279a34a15f802dc86b6d137b00a8c830d6ea476207ce58c48f27d514f62d803312b036f00357e8c7115f1292a2254c3551159a501aad0e3df3592e3582ef4cf2f5c1ffaf297ac9e16d8bcfc7de84b6ef33b136b7b2992863eaa6ceec3f8a68fa3f31b5037d60cf3aba16b7caf46d40b7108357e5264e6db10672f14f8a3403a8d377f0cfde54b8c1d9b86ad3f3f86f8e54bcbc40f267f7e1a882ff9c53081977f915b3e51e4a3a4d2d458448407b58badc42bf259aafca715ac9fe53f592ec4f72f64f9d0d7b64989ddfae827679051276b06ff6aa811f50202aafca4a0c069bc574a0c2f29376e8d5fbebc3a4a19a58c52fa232a8609bc7afa16524a6f49e9df460748e93ea7942f29a5f439a5942ed9e72cead8061ee77a1f2ad44638aadc388ca0dbf6badddcab98c37f6990714155fd55d5ab9414c8ffe1550acfe7737ac92fc66e69a4eb62626478738c1ea36f7c9945176b4cd93e72a7ae4f3e82da9e2fe7dcdce1dc4607f8bb0c0ca7ef3e76fa62b1256d86a8547bb8f7583dddc76e9982d4aed5f83a9d1cc54290daf1c585abca32641c5e68409553a4ffc61bee1b6ba7c8ff41eb7c0e7188367ce358536ae0d9b2bb1d95a25f0d5ca5fc5e4945d7f97e085343956386a61c746f50ce3ff68d08f2539a186f8411a8fc3562d00567441cf25b40b4b139fc53a146650754ae218d3bc840c421199581980a32c89e034f4ee9fda1d7703f04331053f7039b33c9ae5368813728185bfc0a8835ab06545e09ad50add8e28f2f41d065c421699e11dd7645f27683b3013da10b28531c1194840bac808117509a93d876dba80e3b452fb081112f7a00a4c3eee005922971b071bb6ddbb66d34ba232643aa4623243ca9a1ab6e5a967fc5fffc20bf8b8954fe1b187f8c5f877f8769d6c80dfffc3bcdba14435b9cd18009434e80228ba11f1450fd41a6f1eaefea9a20490c0dd1434f2d87307a5eaea4fa1096e0aa7b010291972b4df0b2041fbcfc05d53f5644f597816964125863d1109f1aa3c622216078123c4c21366fe1d1e88ac9b03f4cd3619ccd44ee0ec456bf0f2817b5bfa81d5b9eed992c0b30f8e538bf6b6632fbf7207ff8b2c604c17781947a3216c11a5fe3c1e591ffcbc3d31fc3f7efa8149180b6dad2f81ee4f1ef4760caa7db8794ce0ffd199cdb949d521dbcb168f0e61f48f17d9f81177aeecd1a5a66f1986eb36bfca89027dd83bccd8176ca620932301bf6e5bd160810a0b070439cd8e38dcd39dfbd7b6dbcd56ab5f24ed23d068bd1a32df879e556645ff15efa7ec7ef66874d4ccef8d07d0433f8c798c6db3dc658b0dec134b119a38c1b2397836e095f29050d063ba421ff46ff56ac5ff1b743e33dc61184ab1a7f1b8c6004411a0cf68ac66a77603d58ed20f158ad9062918b1ada505f4a52010236208df4c645835df12b395768b0d80e3fb239ca09579556efc24678fb71bf1ebcfde8c196e50979fc33f4670b70189360fc3c72784628e57cf953b6942bd7e9a6e1df7187c523242a642c5251fb3b496787474cdaef2f1a92c5aa2ec91f6ae0843f4366e11178bcac9b6f86cc12b2a6ffec8d99f90b6724806f514aff724006fb71e0ed0ede4ddbb85c5eedfe1d3978fbdf6e7ce91f4a2939b6321038a28aead57fe54138028b4e891aba6692ab42fe78fb37ff947643e1a9fd9d0cb138052c82fdcccc2c16688d451b3b0c76f729ee6ab956db8f35998336fadb4cbd505743573efd645a17c57f622d12f72ee4d17095242531520b52fc59c58a752b86c4855951843868893607cba5c6b3b5242f0c36d2e43e9cb3367f72734eeef93b8ec53c352f35e698346310292ad1b69d1a516d29f73812185b376532fa210fc11f77593d27f360b77a6b8b145bfd855b5ba46dbeafa9c6ffbae721b92e8ea678eb4c4d64116caa633ed79dbcd46a5fbc7065b52b168b6883072996d7583cd5cf6f91a28dfe188fb45e78184bccb13e7be3872825d27451220e26ac301244c428444eb7bcd2140be686b555ca4ab14e350a0b0545f1c295ed93ad592430f60693a5e9e8878b831d22068beb44ea9aadad6a5b83d56ab57ed836fd9b4bed20a0b2926a95ca01d112f178e1ca886a2e9b5a0d1590823828ce3868b2a25116232a77dd5017984882eafc15bc47a1742c3d6d0543d61cc7717fc327ca7d53755ac1e35e85d2f1b159fb9988673b34a86d031f204f6687efcb3fc8cba578f547af8c0aaf85ed5b2741417465eb846be22bc883b8e2851cc434d81cabc3dee8ef4ea8a5396154fbe31eb1445ca5360f51fb933a78fd1e038f83380ad370df4dc4e31a46a4d8e6881952fb3d1071c41a8db23c51bbc63835116f3ae1b94ce2f533ea858924a8a250df3d11bc88d2c11f513a36caccdbf77e05cf4bca0983499bf2be45daa46d91b66f83960b83bd32ef53df301fa652dea73e5c24ef6748fda660825241a9a054506cc1fcf61d0cd27259a4e5c234484cb33d0c4ac7960a62b0dffb98a707defe0645a9fd8be43cc4416190f7189513eb1275cdd674d81c0b46ea899aeeaa4eb188836b5db3323036c72aa97db5da0556d64a3607cb562c5bc9783250a7a7c1b176943c4a1e130e1b6427037ae862f4a8f772b9ba86522b3ac6d1f1d3d04257df1bfb2dc81a773749d7ade0c518e3c64f676bf4ae7377e7f6766f5e75cb736ff7e6761b307efc1a37deeecdeeeecedeeecd31466e6ff766c9fd741db84d5052f7babbfdebee567cfeee563577336a4ac75f3946666e9e7bf2ee96db3eb8188994af4b162519ea544858317544d2018c5b914a2109c24acb8926e1d552b3d7a5b424a87bfb61020a778f9183174bb058d28534f91040c8776e763c07d5922a455a6653be6cc96889121b959412e18126e78c1a8b8a7cb1a4a49352ca8f718689b7df5fd8dd3d37bee956dcde95f2fb9352bae7cc7af9cc32e81a295b71d6985105174d019c81c7520194d2e22270a95441ed47bdb055e722a762b421df5bfe14e9f05394c44b51122e3f5d7eb640d273847624cb911c24f162d19124124ce0eb16b6fa7bbb94473227339a6556f40354f413a5fe04f5d1ca6432eaa48b333f3b02c1515cca6929bcda3f95bd0c48edc8859c28aef001e5bec20b57762473329b5a968e8a8c64f1ef052ca0eef4e8afad96622bf60a9ef7d8993da3928f4de663a787d24e0f1f1b2bf9e02e328dfa1542c976628b7b48698b2829eddc748b7f76146747de12590c66406565324fe679b295edf4d8a58e5156c28854c427c992186c453a7ffa618dda956ee71d298502ca022c4fbcd11fd2e08932302f17c1db3e9d188374dbb63967446ddb2c4085b95ccd4c27b8c136c77eae78e373d58e6e9158131b6a24f7c1db8d75cd6e912aa08211ec6f59d7c79d78614cc2e36125228d2e1775514ae9893a2bbe5c2b03fa38f964f55ca41a5991c46c43e920b2829803037b6348a4913f3f5c28eb82ad8ff0c24883616073c0f6068ff7fcf120f96e8ead002b09524abb303c87415a8127671aca13731e1e1e1e9ad4022822ce8dca8ddbc0c999e6ec9acd572754f3b6a5a26a81d8a8fce588d0c5995894a48b1a2e914ff9ce9a4828885ec01a46a45891172e910f51d7b8a8e72272119d4c4f271fe1f9441c3bbff7012bfb441b332f8c48b179d4414a9688a1c87573762716685da068a3bfdb5994034f6de9726edba6a8a52ed0e6580da9dcb4ceb2909d4ea9f516e83b1ffaeafd5c065eb841b51f4845fdc66a236ffb148a857dd3f3d04d338bfec6ea7e7f7435a15031f8cbac5eb53a82615f60e79ddac7f3da45940b03300aaa9141148a15d21f75bf8339390a06540cfef293a15eb7fafd89b7df5e61b0d53f78e15ef94ac3d2b095994aac1132a236177113b53ff4e4d33500272327a16e4d16685da16863be3fc10b9716ae509dbfb45fe6d9d31752fac5e9c4fcaee9afe0c92c1ee53649b987419f8f79a24c0c6ccdfae46c8ead556069e8cf2021ccf9716b501fc62da82f76ab339d9685a5d536c70a7de8cd3fd1ba8679ba25b43976b637e6cfee0b579ee9e3be90529e6d8eb9bffb9fd730276d3d83d6ed2e6a77fbb757bae4bb6644f1fac35507fc7d10bfa8ee72356d5f31cbeb9614eac47ef46823f20fc925ba58634f45d87df068d80a7220d6c48621e618c0def0f7df40a4d9deb90fe311aa0fa17aec41f52f827fe50134fd42afdd83e8620de6d06b2c521bb62ffa415eb3fd7e3c06fb6d66ab6ef574452fa210a216dd31d812de4dd34f867add2d2ca0d2ec2aae7a084a8c5f8c9cd358c5181905d5538ce75ca445c48d729413c1a99a38eeb914f72953caf41ceb84fa88c2e1f49a72fa4e26d6d665613b6d113cfe907aa6e6293aa0146ac370b5599576cd6ae57947395d03829d8ddb29766e66e605ead92ad5b8f383173f8c4a2f308d093333cb80720f4254eead08dacd40d915f4f03304678a41184590c2cd3c718296a08de2ecf00427444e7cb371cd346182931e6e5c534a2871094dc290ed04df41094db8984eb62434d172242649f4bc98158d234e344b3940ed6a2c6a62848fbbfbd012ea4f6980a36a52b27d81801a8d8c30423dd12001351a1da1a48827ebd237e971a5428d4654fc54af86eff26ec1cce45a4edb135704603eb124430e81712530fd434cf73b8ddcdd59594ad2e928aaac949899596787070fd94d9b7273143fa07072ba9b9d9db9bbbbbbb979c0a2d8c15b588cb6c3270fd8ec288a9cb6ea4588e824adea0a398400dce9913becca13a76eda8ccdac5bdeaa22dd13d91477ef2b5678ce39339c1c1e788a10600720e80040e633e7bc32046edbd90e43616c733a479b3e606010b4cda93ac2041e90fae3a10b23845adee024d196b0f040a305371d8513317cbbc999e1e424752beaecf0e0d1ce45c6a422288a23a020ab10826db3a793eeb0186d476c8b10cc05aa4d7615b527289ecdd854416376963c5c42a89298594ca8acb3c38307d72979abbc52a1e474cb17d937734a17c052928e2fd1b527f160909999bf1d1d0687e81b9c1cef1e6026cfb69bd53b3c929863eed3e9eeeefe8050cbc3791871e1f1603e5bbed8a6947387c7924a2815060d2632ac98e22571b2a209d5145ac81a308f176ec51e7fade0a75b72121af8709a9be3e4c4222f403e269e52d9372319b37b47ac0b15dc8a5cb6e8a24bede2656b67228497d4c62e1bd78c8d902db8158574418574f18478590de9f9213fa0fb54e2454d9074dbbabe74f9e2a5e7478993283c34e056aceeb322acf8e0ba7b4a13127c08d1b99968455f5c595a35c21cc513203f7ef810c903a8b23c4b3e1c08a46d4a0e56db11fb99752b56e903c88fa51f2d6994de10a135b16d467c5c45c498b4191b9f2d7cbae056ac216d41101e8e600416f450851055907ae041a28394524a1d7081f89c534c3267869363a4267fa09bef88153992d2a594ee4d4c9bec1b5ace0c27c7c890fb985d032673be40f28c4d119f6e45e903c6321f0e041047e8e67b64e975a426bd5973ff8184297d00d1b339f753733f19018d903019e2838fa51f3eba86ced7e91afaf9d87a7c485fea1fb01db01a901f3e18fc969296c786108ca8b61b16202de9da274c284a005e447890e05e2c08ba12e3d5b3b44506f37081c2be5a300b0ae335a4c69526462086547e155c454dae9cb42c25e948b7f282d3e4242d3e5a80b4c8b4046911d232a485885b9123d3c8403184730ecccc336f6f283476366373e4a5f2774f77d7e96fb28e911524646c1c133d4cfc30a1840927ec2a20e67804850ba07832e78c510328b66cb1c5154a39d09cf062275aa0489a52350486850a00b44fd814445888b0924342569ec4646bef1b2994628062d82c46db11db814fb7221de214052d0a24231d1cd1d1a8a071c102a833629753e06d0abc58e3d79f0c7f2cec5656dd293a55d7c40be3ac0714320a421395abd128084078c29790648b163d4794e8d926346b84c41048049976a05da724250b85e24494925cc9e2deaea817b3c26253c21739428a209e50bbe20a136a4cb0fc804508af898e2aa67c29c285105a3cb1840b2680510675dcbbbbbbbb8341fca0faab1065d46814c4ec05b31b1feff639a707c6897b29836e727018fc36dfbe9bd30a545894304e1048a85c25e3c0623ccbb100d3a852351a053145ed6a340a62083574cdee78ba2532806040e4045940f1e97245184d0041067404c805a72fa724c0780faa6f41e2de846bc98c0d04ac0019d5548d56806cd0617181fb0f7c90420960502902971fbc9c07232819a10b67793132355a21a245dd5a367b976bc60602d18f0461e80b164abe5741f9e9381f1595213f92052a2a42333601a043a8948d5a8414aa99110000a00013160000180c0a8784629150148689b27d14800d629c426c643c95c6a2518cc2308c8120638c21860043803186285364c40a1867e7fcd0a613dfe08eca5cd00701a2a44e44970c72ace3914c93ce34bfe1ab0dcba7b9e329b5c4148281b5afc2ad6ab8a045e9323d0f3f4b11e9487a1509206be407fbcdc7a80d9e134054241e3919b006107d4b2c09f3b54ecd9f9f7d5fa9fdde6504e1c11be41531baffc8365a1af43a71c2331b9644e4cf0e5fb47c1a5e1a817c0db8c7bfd3a7afa204c0a87545ded2d28ed3592b77069789579a1a386ba837cc7eeceb3cdfd02566e28d06f76f240f457b92910c6c1647d082c797d006e3a4797690cd1cc430720875d4d5e374854de3663bb56e70afc539566b3dfa386c4fb1fe715721963f72d8683c3308f82bc6f05cc78a28e681102af2e059763d6d1f1ad38844daed8361964d5fb148946c972bd74e0e3bcfedee3a879718ef9ccb690505ac1b82ed43f0f12f79369ccfa8fd1b280e826848434c234384ca2f43a3ce44141ca3636b17d96e365431f8874473efd12dc9bc4c92806e9c39de966088f76c046ef121d29e8697d0da6e86b4b841bdf236d4e50a673c66f140879068905e069e7870ebc1fc9205cab9ccd9388a3edb543d156e7f94d19d08f2676cdc646703650ab3120a2093585ed30f266867e8772399045b9dbb4bb158ed4990beb8e88d05f03e5d8ca58acb195e32eb6b09bd30ff1e39a32acc48503740760825861996794802e5405b499aafdd3af5da0eadf06b71802dccaccc3bc8f3880590bc08fff08374ea8d10f7aff1c0964409b96ba4e0ef177df11b62e940992a92213b04e365785ccee46682d8f7da29ff44de31cd829406b33ac9fd1712373a70e58cb1e10c749655cebcf030e58c2dc994b528676a166d39c38d48e53feee3b0f1c70eb21d9f4c98a9e6b1c0983324e9a1ea3be2b3c14e05eac9b4193f1e163e19076035fc4dbe8971858aa57ead3af7b3bb5b63e2c48d4af4ad752668b56b48eea92561312cb0133b2f98171495c0ad1c29e838ab6154b46d9cdd218cfb693f8f8b91f30018304d42a41e6e2c6bd2689b645a73fc7554bd229a055338933c6cd2747cd4ac6d8b9af59e013ef2bab09fb3ec26b86c90726c59e5f8cd34ec2f7b3cdeab2ca15ee468ef3b2118f1c714b73cbe44182e92872c31e11044f47272e11c37a971c0a7efbad3480c762e2389610b8488bbcade680ef7c058e71e7932b7068647433f1acf7574dcd7d2955b9ad15e84d9c974c68a92cba83652a69f93a1bf5847b5b2e24aa741eb2415966b925096dbe1bed762df7e5c3eea6f3fac5d7b6de45eac0dde86f90e37d2110e982763db3bffd32431468aa1e407a4cab9022d741b75379a6b57627c565d042d7d0fe9f6f7464a822b50aaae92ccd023d203ce390574a0818e513dcabb29c0c38e113344bac0cecf86b99c1687cd2097cb0fac232d3e1c96ad1d2af58b154128503e5499a33dd14869ae3313b07cdf0476689a2416bd9ba51620af517717366b408d0ec1ccc5e15e498b379b41022664086af243202c2b61d7f2bfd0a7c14dd37211cd478a945a40632e373ff2ab0e83c548875d6098c5484924cc595a285d93c2252f3bea76362a6423e831d70cb2e0d8c806201c0b142ad2d22f7c43c3b4ef2f1dbffa39403bb359e3208c3a2c5d14e88d50806a21b36a3b2010f74b48b0cca4aba5fb27643f9af3b33e0a08bd712e6133a7623e1b1df11cb711a39d09baaaf7946d7fabf51f8db324c1a91b0b9101847759030dd122ef03f850e4e73cf2d57ae4df6eabbfcf857d96691af40941940e1ad2f18b1d43f0263763be4a3efd8dbfe34031127b532881b401bc0275fdd096c8f8a2d29bef0db0136a20818c1fd51116e543cf09f09577e80c41b76ae2d96159d045ea2066071088c8e02358816bdb50e073e3f0c552a92c4879d500346e2c0e05811e8052ccbe823025f8121920f1da34f94814b2e61c3f8f9cde1292d171015f29bd99e397495816fac6c50c7e9e5b3ce3ef0e8fa00e8608bdfc3cbd296c20c5905a8395023f8f7892083509cd9ec0a398f7eb670bff51f6b267c610996da4363a58901c2f54c29f6e24b756b15453d20621cd907dd4161b1624dd4227f183f0f172144931c83d9f0d42bb66d64e51a636c9568728b72d6c33223c51e9b4232280c9e8133988ac74522d04d729c06b6b2b627b1b8b07b9dfcc45cd0066cdeb9e538812c2a1d6e566c7dd7f2c49d60cf6fba665730d9944ab66290628059c7c55f89a239b9adda129630cfdf231238f3f9341bf09d1de1fc377cb490b36ac8447ff126d2ad54e03e28317fb67f9f1a565aad3591204708c0015e81a0209b9064042a621015510a234be6d132cb5a4991ef8efb3931f2c21943de71b348438254607a0f244aca00805807b5fef64162b9db1cab75921e5094db3cd53687f78cbc649a4e563619ac5560aa159e9aff689db826106f3680b9cf5ef7a3b416c4c11ffbed7c87427c77f4928f61bafe5824d340cbae562739752f55b95bbfec258a1b1b3dfe4c7e3c8e7b7e782edbe6be09bfdb4e934563ee6ad51c3a0bec947aa4aed250372bf4c3415ef9de7196fd24c651348b7155b217eb10f265c126bb1a4f4d120f2a6183cd4b1f3e0997abcebcfafc27712c92a43011dd555ce03f079b8b0611846122331f4718dff0d9bf619738025b8900e2f42650b7e806040e67edfc11943208bd0148d2405ebba2cbd5db0b29a4a4a06b2c1d254683f407956d4c017aecd49a7dbbe5cb4d382c95e0f12dc3c82b97932f374298674e6e9a62539a98ba870212191138553f50a6d5de11e93f6de5c31d77da0566dc9dd5e82059c902481009df30d4540627a64b686e650c2f9724b27aa2695bd5160bbc87c759695d8199d139f8bc1dccf551c7f44c69c63bb5a314afb24052ffae51fd840910739b34a41cc013a15f6e12f51c1f0ba94e3349c0f437404f31cf93de2e8b183846378dad8352523c61a61840a8d9c0b48a4035f569316f723df483c2a585070f2f12049f8fd834fd8311222c7321518a2d95601d4d204612a67fed8521c22a2a05f948a7adbaa8e2346e9fe230937bc64897849989f2c855b711962ddf6d96f253896a7711e3ab8f17c2b07c5811f436d9a592420632eebb57cef8318fa40751c45c58d982fcfcdfa88ecd957cad2593969f07079f3457299251ffc57520c4e842dcee3af1d031daddcddee9851e74ce86a7da65ff4eb8c50909a5915d59473cb4a24de0960b565795d5d50053ac787452dbe08daa39323ec8fc9ef88df0ac62683ebe3ff81f6691f6a36f1fecd8521d9f5f4f11886e561fa6706e4c2e86940907e41ed68081bec21a3a8426c43904f1146986aa22b5d527e030c4184936f4de38fb9b84b24720d896433e39c0d82f55b9c94eed48dcffe2e624b731cd36a2a4be094a6c11b45b1b1174d230b6ac89f8f60007dc345c0d65afa38ac680499d763f5bcb60ac1765414b1d5b9fcf90dab5a4fce6327bd133878bfc2f2029b7d5a15ec766cd674aec1c792c2077e752b537b9b323d94f38d0add3a7019765f158238ed7d3699e5996ced0a4b859be2e50c2ddff57d63ed7bc959bc1723d80b1be2c3813337ca44b970947aa90f55a25bd44c81458eca6bf2889d6814591cab459374d328a51ba842509c053f93df9f27a0352138368b1ea6cc193e6160c8811af23d33a183a11957c476244ea7ebfce433c97515a5d82dec011d2ee39bea712caf65c0e0b4924941d4909d5e6c93145073cd72c84d4c59c2e48a264a964ed9094b0e4683b9867b1c5ef17c85eef92ae42deda1bf5bacc1dc8b48b9b8ff5f22664a83891c9d1892bef08fa3a2383ccb8c8442eecba6d28416a675d3a0a5dbd1e4e86f1af4d37df93e4766880412e0e6c01c29406de25b5cb3ff0b0913a4020245d0e5ab9d30a47548738a7cc2ae94c7c9b39757881ea4d5b6f807882f83bdd0591955fa5e6aea10a679b2d516aa97751aa9ca6aae32ac08ad5e9838fcad3003122b370eec0255e6083e31c94d2d501c7d1962937b6152b7d21c2c950539b47d6a6420bfc1b8b6f920cc3a68f44088c739881187e2094d4b5cbf08e883803e128cb9c383c018021afccbc1ba45e3216baff705b8836a619d1e303fad5606f0d5cae28924b3dedd77a9f9403bd549f94380a374ff27ab8d877f881b094604e682c6bd2b5768d837909207f6375163780e3cfd8fff3dd462a285b15f821907c87302c7b3a4909a61d1fa294e2fc2f55598be0538c1e1d39e78f02aa0e08f2a5704132117113eac3b2935ccbafac15765d35abd86007feecaa65eba8667e23e5adc2e8aeb0fb3f2db432ed9c11a6189cbc459218ddaadc13eb1b72c13c4b74332eecdc86fa4731de1dde21081e8d8c0dd2e9075175194133ea81f85d74117261df5a2653b6d37adc2a8890278f4c9b192d5d6d8ee87ba21ace27c88dc456e7eeb6642b2999b5f83399692b6bd30a18d1b97e3d2de8696befacff720230f0ea7f260869a5366fe7bce91ef89870b4709fa8b7ac64b47240837836916eb37061b5e0424d39d7ad4c874268a54b0de2bc41e7bc25bcccea0984576412217f5c59dc175590f8c89bcee875c52a5e4d6e3b9d50b1477938f5c49351c1ba56a76fdd4d48183a11dbdbe3733c60ec93688d23fd187a6c25bffabc31835c62e2d1159fa8fb70286fc80c6383bd5d339d6f8be0a2b37f4b8bd8299657511d188f4479f6e6640a90f4b547c2a020d5ebf54f39e1289c236dc253660922f92112388bade853b140666bc2301417dfe65b599331e912140978f8c0f2205d2eaff87a02c6c4304b8c8a7c065d08347546e297cfa2a604f0e40703988c311f9d893f3f11347156da44e0f64d4f183d2ecb1a52ba67e589c965d826b1851cfc2baf11cca518af879d18173432786b839f02f1f28e78b7c6ee14acf0d225be83848e2a0d16ab1f6d09f71edd061895bf38c6fa64e604397e4c19b0d1ef8bf3da13ff291c1928565c38be9bd28146f12049f3558bbd36ebfd25a8a3b6946f7ed8d1d849b6678cc614e034090b057008e9c9091d25efd1e1d60024cb77b2b0047b865b30a802bb9a3a427f727cde63345ad21cc837bda95f064c1f728cc607358095caed7de0faf4bf0ccbf1d476a07837af272e0c68e50ac3d90661024cff2ee54fe8b82636d3e549a4128144025549a4119aae12587c620f8a150a7ea8cccf01d411ed583e414109f79b584f331aed189e6000561b3b16c5cec705db9bbf4c2f9c1978d2d996f7551c221d1aea72f8ad4d2d96ef3d2ef68b58e5e6acdb2980b871d8cf7ff5a81f5da69a8f56ad36b83dc21794e9e5d707ce5ef1388e9014c9146ff104ac8c51e817ad129e61137ae7ac128b699bcd1c7f7d58f64e6cd10ca6c2fabf7c83b6068dc4145281261d0925d9eaec443a2af18e98fec878ab08f103fcaa6c36a1dfce5214c45a49e9503d870e5f1170cb9a56c1048e45f68fbd558c8bd4874f6c194c945851a92b5a634e0052adea91b887e6eab88142a3670b62649809ee73da590ee6d846d2a9523a489a15eac596fb8d9d4c123240730336e23bfafcc02249b7cfc7b445bd9cad089c186f3ffc74c89f2fa317633db66a8ce7c35a665e65d237592cd5bc6d5445d49ddd38894cca9f4155f7eca3b63f66fa137d0c90cecb0050108e48a256af7a9cf9ffd14303a2e18b803dbbd337a37c64a4a4953a3184d9d1420a65d34b3e258788a6b9f66216a6b8c9647e38c0891f63f39ab8591ac792172a9685385f3d10ee4fc39883427289976b48b9f5c24d66f86cefeb35c3e4448d2cfa7a937e43aa83086981c659a85a175683eb01d91c7c481bfc7a646ffd7b406120447ebaf25d9a025572c5edd81d7c35cb4b169019409e3e7babac5b5c799c07422bb4a0145214d0a301b70096c3fe906c04fe91afc1ac6a7df2e816db336fd29d480ba2c3894a3a524ab8a780c57a10447b21e3b73ee6f72016f435274886af45fb0bdc95323079988de61db8b446fa0d1ec3c1b606166a7d752df005482263321136770175d5664ec6d52fb1903c2898a23e4a012c0b24647aa15a97db70a9424bccc7ba9be391db007909c27a93c3853cfbd4be3d21ca96f20d5100aa6104d2f07386927cd3f98bd209d1709b6a21a7125fba3dc78f0949120ef02ad7239c416bde7beb92bc39f9d3645d76eae183f7bac02ce1e34047f48127b4424b4de1b7cf737e47e926631e50411e555eae44a956206331152c4de831b10ce9659d70b219c33f2854163da7b48ee72e510a60d1d5c46f9ce73deaf427b54fb2f56830840d2632d9ee3e718e56ace3407d1a980afd78efc13934cbc444eb646da746fc5d256886b72d0fbc1a31d731d400089ffc4d5c6c9a6a8fe350bdde8f01b3c6c8e394abc1318dad963aa6622fe013dbccda191293deba2bf8a15db54b93994bb51e18d5575868641d96d8eeb83fc0a49464fe6517d9b8c662f061b60c20d49e0c9c3cbe75c0a873f19bf2d267dff1b7473d1860a4e0975864cb4f1892898ba87344d5041b77f15f04109dc226525f8e214f4b441d17ced17ba8734a2cab8d538c9bc611e472c5c9aafeba5da626dfa85790c8b2db4c86bf8405141086323d62b14f982fd00b6e870f3273a33c84ed00fa72a87cc1328e9fe6d28fc60f44409a04fc66ba213379d4c8ee3c411579f413563bb38b1338511877782135f46e4e4979a0c47f0a70419e21aa494c8cdd4db5557110aa123c62e9554f6de21a8af52111ca8cc31f64fe172a5e270dd436557d2ed793f4029757506954fea894181732a53decbac15fa1f4ecc219fa11de6625a2084719946a08022b0c9e95521a8d5a25cee880c9f9a431a11b58256a71e7cd3dfc84985170df386d075516c16885db3c4f676e056a366bd87e28d8637f8c93158c434bd3b3ec13c79c67f181502c482d4cdd6ad339c165f1d9ad9d6bafae093e034271bb556724587c4cd3aa3ffcbfa94c2e0ed85c0e7c3fb89fe09e17abe8d5876d5d8b34c949c89da1ebaac0f5681002562f42eeb0aa00ce0f9de2fb56623022ba0def282145b05ffc17bfef9be0cec016f02a820137336726d5f0dd04eb21c3be2747685111b1f053b60f50a6f530953a58fd3aa44f12473ebe5d3ada2013024585ea4b330024ee623a010164c83419637701205097bc515aba5f4480d49b284053b9dfb534858b8452d368c572096f1c00fc63489a9baa7bbf63006c8b7c83061061442a8085d5dc922bf2eaaf82c9adc7af15f5750cfcf65485dacb1189fc7a40824ac5c3078785c32c272a3c85e07a433e20d174e5ac432cd38d31d3022ea699341a1aeb5c8a08caa6006f214e935a37d7670a1bdcb8e168c8fd250d96de1e029f0c70269ef2c643b6a2d973003440549d0b61d368735a18bf16e0d3259c72d7a59b96d49d85cbdf001150e99ad0e4f274a01592a1bc0a717d89c494540416afe0b71763a721ece03714ef9c0ea743169bc8d5ba3493e28cef461899f2bf73291eb9f5c421927e09cd9f0c182e0ef45d29699e33afc5a41e0dbfe36c3a7e6e1ea383136550d3c54dd152a3211841a5d8cf56aec21de803f8203a54325b000b2f2dfa6980646257b6d10bacdd0e9ee48ecaba12474a4086afed5e07e1c95119132c0c8ac9b613f28e66199422cbb01c67c93f660b5c25770015c21eee59c3d3cb328f10b1004142adc9d5c0692f70af87c45a833230d64f77f49d73d84de6e8afa1dccecffb10dc76e1aeebbef2cd9736a513d9f3e0c9e260379a064be91e045e896f92cc0bf4e4eff686fc4a975dc923e4040c8fff196aff80708d0b8c01c1f9f0e3ce9007f32b18f50328ddec18d698631b3758d97b91fd778262c8bf7f15ae8b02f6064d1284546ae7073117d2cf86b00b7f91a0cabdea2de9c41c99358091a9a369fe6499e0e9443067ca46dce89392db1e3db5ea3f900ef4b52cea397dbdbf8c04e42ecf0beecb5295b3d9548949e2003de0d60deaccf90baf942168a45e974e80a1739ede52d92706572de2feca8b60804b558527f74f62b6b606e618a43a0bbcbfb882d5c85e30ed3d53828acc166383848b0b6f3152cd46ed46dbceecd0580fc73bf7035457b4addcc674c62a003fd62a8c69c51308e007a2395895e37c1642530084ee12301c4337dc38d9f9a3babe5461551d63a08d32e1c28657edbad0570aeee70e338496a6cf687fb1ae250d8fbfcb572dc603fd79c753ee5cf1f1f09193eb609564af04b39873c875aebd9bd0f405463b5e90ff575a034a0e0397078e08bf6a803771bf5b98c8658cab96acfc2b50cc45bbbf06490f3b1c3d4c9aba1d85c79c090b68e95fe0ff74d23017c5ca95167f3d2a796fc541df962a2d808d31f88c4a3a0d8a902a0a42c8ecc592c34203c7857a40b2e1fd70ffbae773440486e164bf6d74b2f5552f91133163dd40a93ca3ab02f3a8ca3b2b54f9c98a63877201bec2d8b77aee53bb1f4f21ddabc9f83fd8d09e58297e01361a8963840cbfc53580fc5b06995053abd8a347b6d45de0a4bd4ece0bc5edbed959936d5f699e4141b43858b8ab0a565126a04aed5f6b0cb18311abc6457c1336bea0d58dccc0469772ca239f39c46bad69e7b5823d38f4865143fde5cfa0443ade8b4a7e93e57db985782feb2b5cdeb2e720d006d9fd1bf5db66121f87c77edc6658e6c38d0f406114fd076b36910a3b0fc785058a6c0e9237c4f9e82aed033c4f39a6e0596973b1db06cc0fff6526da5dfac50e6338d82da4d241d47989adb570133e5ce14e0b0dd5afb61f80f200633f569d76a9f6d971de058812e2523e75cf95754ae6ea2646c60bd84f7ea203da00feb93af4ba203eb54bc284759420b7c521bf26b29bde0ebd749dda1c959a6533f0baac79f9265f922fc352b35456de72e8535b5ce130237c72218d0c41460a774d14f9e5f06442c6532ec02ffc7a708e912809493a7eb1583f74017df9e198971d85a32230af57944e96dc823c63d29b2168077f0b717dc5f5c82a38ae145f98a2e3ea6ebb52cebad848a4d0e093b125dfc1df82621cfba17adb538732f171b0d8bcc13ce7731e176b1cf95ce78912897adb5d76abcf93ef5f1e562bdbfa533eec83444b2e3627dbf3670cea6343c2b1eb0ea2dc733a5acbff8d49e8f29680a0df160cc0c4587929196a235c34994d1ed3a98af6f16363800c3832504e1d7e18e133f3adbc530ff59893082bac16710190ec7ddec06e5b5fe579c8f331efbad6ceb7876fcd79396e084da52ae96c6f2cef198a21c6880e438b609d6f8461aedf87ec619506958f0d2b79eab823ca1ad943503323db1e3d8c955e39e5593a0ac190c80f37b469f43d19df7b8441a1d8bf261beed80836c093e8a96322d26dcb6cec04958fdfefc771e705130977af3cc3ad57808edbcd8846108c72a72e77958d7f7dd25e33c6fee21834c3555a5125ce311c34cfd30d1a046367c63f8f81cc74eae262988c1eb3357df9f241b5007cac559e6e0d64300b0139be00e443d8e3fe3676866f5d2ea3f43079215aa15c89628d3564260a1f80127fdb6fb317baee9762fb75304628b910eb4eb876c336265eba75c072a96eb463d00691ea7acdfd671e96683df0240f08058e26dc6d8d0aef1ca553203dee575c0154b67bba2d95dc88a68dd1d0a2459cacd0db65bdc0ab4332b8015255a7bd480acf44a07c1f64206e758b4bd005823ff1363bab615c4558079d94b886c0cbb8424873bb36b54e6ff5f8e466c6602e8fc826be746c0b3ef70acb2fa604d64411f34706de43691696ab6e608dda8f9987cecdcef05f3ae4b937ab38ee298a1a5b7c3a6264f735110bff36c70d95af5679d01c96bc0cbfcee530250c31d6b89526495fba2ac8fd31fb03af6a2f5cb1bdaca37cbcfdf8d71c6b3c704967113156256f33e57e5e799c498065ea07b9b833f5bc9c24f6a3cb0f02f85cc0431904252f5e5242c88bf687b1964c3e4bfafa9f18115355bd8050ff2ef54b29c670b1a8903ccd49323c1d40a9352afc768fc110fce2bc12c424b6b2ca3ff2c80c3c16e74595aeb2f02130c17d073c2ba4e80f306f1b8c7742167bab73bb267361c411b451d724adc75c1d03a144350456fe43102214ae12aa1e4492eb5f8c01a88834697e1068ff0a4528a5a75e4270134416e01c393a729fea782b3330f29a44a9f9a05cb7e46e3008927d53c9105f47e249ed52f64c487ac2331d3a79708a9aaa58fa8e036206b15f18303f07fc0e152201c482a4c7b535598e864fa8f10a0b61438f4edcf86435c2781d753db4ca94627a8300af0bbc533b39a33b08f133c822f8d04c6ea331e0ab4069f27527c5565834e178ec8fddd5294a091d74fbdadd8b8ef8282e66b77665627539f220e040c39c8512046424bead8561b4942fad55e88fbaa2a5f6af3ab9de03b234861cdaf755a5435a9827dfff44c80552c877a410bb9ba9e58275e400b15c628dafed9f119a9103e197ee515c4aea8296070baf89e10834501d3eef04953293e7bec65b73b245ddb29999b88c0663e606c668aee763569cb2e0bc34e7a202de7b0c622c232c6906a87064ae305d4b51712cc427e4036c4f15e21cca3a508abf001b3ff1dfc1d3327bf4d14d31d2f403c9a63ba40504346fefc66ea650f5e0210f450430a7ac6e2b60cd6379df39c83d514a2194ad582d6674c3d4bd5c917455817fefb4646476bef76f299b9b957e558d1d6c13d5c2e5f37dbda12d4dd47d390bee1cc8d393e8555a045d384d487d56df00a87bd37ddf5f8716f60cd086b937041f53815c589459b5e8f10b45da86007f2978758f5e5444b73849475ad40d8b584a060090988f0902cae0906d10b843eab5e5088712012a01d305f506e672fbe94bc9da3046df948713f003c3f73486e5eb40aef6d47d36d376284e5c15d276d0855e7d19c45d875d9a036f2895bcc800c030113307796f13905a4743e520362b41893ecf4af403bde686606b3a4b67815fe55823e5ed6443b97c2ad3be9b6e6a06e6689574e2245f24bf4db9289078813e69dd02478d602465e7be1fe1fc622320541854cfd87316a020fc1960e48c3cda3209e92c121b7cb389c089471b532ff9898f1de3a22b71e48fc2d455c1b2e2b96168bd5b362511e59c80b677a3e1739fa7dc29849472358f4a058009ef512ecf2719a1f57441fad2776435d7493b202ff5134d17e143a54f0ca1eaa7fc82f74d516b96342f02ad9cfd880d774055ed25b13941470bfd564820cd876037cb76f5e7bd734fb7026bdc88d505ffb0f37239ad7ba17bef174ea0735056af0d7c703532c3dd5a9b54e278cfc15383c8028c578dcaac775f9028977e58bf2df1b9a5a145ec79981fe5f0b71c6183bfd56d006de68731c55d5f4b33bac1f76b0fa6868608cfd5a7120456c77c969d2a4612d75a1f38423f5765582fca3f058828014c065d27b8773dc383bbc28186200480114f201d9b7dc4be740c9abec8420c845b11338da277db873d4f5e26e4e9202a0b3106559f395cf5a5396d63052c316a8040ede0f77acf0455404eb9b2b187a6a721a8949732ca659a8279fd84f4db7f0d87ec54b675c00e8cb2c830b505448141c56ca503a3712c42a5aed1cda3650d4e66054275eba5b34d65f5b2903409fe570eb765740f7f013a6fc9e420674eb36b78712b879d9743dec9d745f7ec2ea93934e3d534fc416a0d3222052b7007ea16eb92a886c5e4d6eca0bac854be0562432c123b29a171f7d7be4d9cdc440d2dbe1a0f1bfe380a4fc45fd3fe76cf2785437be8fecf56fe81401c1c7404f6fd7749a9dff650d45ecddcb624ec300490b023a71f788a35b80b5bdbf524c41bd6e67820a3300f91c105ef9cee1475c19df13d787ada65b672503546e049af01a42817271ed3c754833a3ad766d583bd9cb8aa4bb89e89d6d9dae6a81bcd68a31b36cebbd560cf9bc3ab51ffde784e6b67026c4bf8f6050188f1146127cd8b522fb752a875a8b78fb1d489f90004f78daa77511ce021e703faa96d791c4a5f78bef901a4a1ded26da7aa48238adbcf44e4867a0c7e320c5ec7a51b195c10811b91c9e15510d435216913c3c813fc5534722420174cf9f9246ca5aaeafad8d3873bcc19c711c6a989b560cb863c5e42a0541f8e44d5e32f9d486eeb402a1e2911b3ff7ea4ef806aea3a4b1fbef264150dab359fdec429613835e9afae884effea7e01ae65c606cfb76ca4502a18ea6b4e32b19b094dadceaad5d3e259cf7be453a65a51503f31bf1fa273616aafabc1bffd098084f61302aaccd4b6dde0f4d0fcab8090d37de7a02f6dad9796cb960b2d8cd2573f373dcfc3c383eab0792f92c4f0e519dab747c8a9b731ba94f4b5c59853e3ba4d710de8f5e12f971e61d2169d28b01d149876a8ad75617e710736fa8949940e08e880b569affcaa7367a4d422ff8701292f0298d21885efcd0d13be958639f0743e7b63d59f40540b50f7b6b4f2ec46234bfa547fbbcf0c897c589fb0ba9e5e1cb7ca2c5570c9f8bf8954fb99aee9de28c9e7f20305ca62cef140008e35c2a68141489ea139ec18832e3c7a64d6b975ff100daa1bb6ec427932b03ed4b99c260e055f9ab1d7fd709a93700f726a41ca1272b79642284c4b334af99f16df8ea5662deab8a4fe04b92c09d89756f8560817e9e28121f819dbf12ee313d886ce3e7878c70307029be886ef42a94f0add3969505886e0ae3e8a910e14b95ba27d48a162ee83755620c2d3b42856a9fd1c55db6cb494b94e7f5e49dce81b4bb018e11750228e3c4b66a66cb237add6821385d0e07f446ed359fc6ed125710f2325d842ff14acf0f371ad8138c2856b5f242869c237bd1f684b7287faaa5dae36d07727b3c5ecb689482828cb620f697e4e261a5fbafc28888cac98d74ff6ffcc0786d317e12614be21b1de69da337f1a065c43b0498b8d9dd65bcbd523cf0832433cc48d199012945a20f0d97b3925f6dbd51eb27b764b3f1af46a01bef0b9014eda76c214800978200611cb941eef593742942b67e5a4e45d63f2737c49c070e7a29d76a50fadce1c0de17747e6d779946f42fb28772b622ff27bab21879be7a6257a696e573ba24b9e1e4a20017929f75a3fea8e3fde26ea70c896847a93905d6d1f1a69df246c0c2e5a7ceda6bfd33fa48aab6cc7f36486993b9bb03dacc06d2670959f68f318e8da16d525e795f62b1d6eea2e003c49eb241b56e7652998cf17bcf6f0f7c2dbd0ab9a9b24468076ba13c98b8ec39fc389f959e0f6d2a077337550f35963757f11dd2744112c562a2fda7616a2509db46eacb3063384441391076296ca58f914520db9230dce9239cc02171d6d4a224842e60e29e1114e581fafc3ea8a47f491823c0fe5dc99633bdda32f3f891e1a8198eb588623fb01cdebf4f5f29b981af4d99d4ec28e3b22c52c349c5dbcbaf2e5304fa06539046b0940941e4d424cb8df326d604cfca4846b4f217bcdfc560768c6c0a397ac6ab914baef6a315b2265d7e7b592cb41f0e5e4fee65e1e0f058c4efd1127222b490b1448029697ee3c0ae5eccfe40cb4b55fa80da0cdc6e1ce3d61f0480c16c970c5afc9438cc5ec1e66cc3dc72452de4b0591bf918eceb63686ecaca721ad2d0012c9b1a0ed2839548d4a531611287570591c558b11fa6212ebb77b3d9c6c305db3aab384b7cec39f36064f93789c3d4f0dfc9d41f987cbdee7de9867769ae29aeeb324e6877b2fc77230590618a429a481c09bbc7e5d900fae42c41314a0a0978856df9b9381d44db27f34a47533df3be591f745efe28a74241e2652626d11b78da3a7090549da5561df19b987f5a5369a45e3e904714b1856f397cf8d089eb2170ade5464046d5d3104ec295741b45ab90ed9d923971581aed9765a680d2876c350584444b80667fa601782591b76d2e5426d90d78bb7f63a7023b715aa387041807ed9adb893bd7c94563e1788d04bdb3bde7af6584078ea934f41e22fed18b8ea8c26b291a3d85e49e590b0003ff4c2baf2b3a961e08ada2c6ff34b167fb33854dc6c3bfdb66494b59d04e97ab11ecec75fe0ce63b890dd1085df1ffe16630156c609cfd05c4c9816a2cf57a141a7c04f6716f3021b9e63b200d16d56dfc6834f121c4dc19d8d8d730395790fa111383311a7ff6c44d06b2fad7f32f0033c9a272712069182dbad54d92f284fe309aaf9c03c17209a54a8ac3119552ca1326f53efbceaab62ec3afa2fbdfa91d1cce5d0e827cbd670dfce1c6b285e76e157909e2967395b9c12e41e205ff21e6f1f70e1cce484b08abfefe40dd3459ed3c60bcdfa814a05e2134ae4a5b41c7e0801685c06a58d2ea97f13afacdf111063b93dec75f6671a65c0ec173ea50ca48baf14602bbcdd24d8245c4418ad4b1116746c237ebadf64a453ac86e8d28bcb30afe61b2f331d6689884e05958eb39d930d6cdb6a9daa2367349243c82f0afb42cbd1ee7d8cdcc29f9883aefce3eb5830eec1e4c3e8c930b9c3af9658138569a83db410025d8ac8d2aeb036cedbd0b521d6deb3d979117516937d526024621761700e3dafc486ed0adcf3fde584569ac96e85f8cbe8835c013540c97144a2fd0c92251a7cefe2b62e81b836d964767574ef995cfca000ff4470428f60dcfb5fd86c838099f17dc776919dec723191c2e456f79f6ff23193644b2069f136c0e1584173d71e073d005b736c537a6d733908a6ee0338fe7adef019f8760c21e86940c32ad989852e71c24573a80c2074274d72417ea726af73d4f0cdffa7092f1d26ed2c9aa9748ce72d589e0992a86b7bfd92a8677c880acbba692f9c78f8869d7dedda910679cc94b182a25275e0b4dd10c808129adf5b1362d8010d41ff1971f2cf354cd4b6923113be986b30502a62e1a0d69f76c6a5dc818f425c5c78c6bad8df7f0dad5344971deb7f7a9196b4b7de31c70725d583126b042537e40453bffaeab1c15e49dc216fee42d1bd171578424a603773bb99522927bad4ece619d9237a8ec382948524960ff6f550dbab2fbdd3b86648d6958642ea8f021b9611ad7cc2a12664c6eecc6357385860d923bd378cd5c51e14392ce36ac335734dc98d4b08d4be6150d1f2567cc368e57d964f3b95eb99522b90e4cc2e4e8402dbc998d37db761ccd2bd1b7aeb32de98d2e98cf9928fa1de64892695984ebcd8471be5c5e0ca6a5a67a47e2b5cd52341f4ed63943184cf181265d1c4864e4b26b4e11ff962e59ad6147c574fa0664ac5710f115491b36608e58de763a006a39d061d88bb3a125d7f11b71c20d60b646e4a4b17d0d536670e327c0857e2e59db8495e746247d055e28fcda08fb5297455b0c80a82c808f9d0783de6da5ec5c669383bf5c9b327e63deb782c61e3b0676a8d66d430d7970d292136c7d4a34091529a3b91b3443023fc4ee61c45824c20275d141fcb0d66911d786fda95cd968813993e482af37743c58a304fcc0baf79b57c52b2622cff3640c9ee3b29c2989f5d510266c3d36e1266a4a5623f9f8830eeee9e0bea2fe3926e76fe86eb00e553495361896721f947f79c687fcc5c3fd36f1fcc7614461b7b5f613a729d11e581f2217234bd5f8b568ea09f91637cf6a3b819cd85425f54188931ce1bb5bd11197523d072887d3544a85f4df3497f7965a4aa5884289c8bda9cd6a3a245bd170a15349645e002d2877fc0b384d4444dd8c0c0184e3f01ab4ef7069a9988fecebf43b6bd90339ca05bc4d6de9d782dd0de171105d76c86915d717f382b8c57df355e340330bf7b0675e50bbf042cc40cd8ec19751692d0ee05d101612f1ca9726e4eb70ec612e001efc1ee097c0931d4c305de17df39a8438a816ff25b339654b515da138bf869dfa9750b0583b6b5d2a0181cd3deb51e52ed6ec1ccf82464c3581445cb4551072afeb2abf14c7cb6bdd7c9e6c344fdca8dc6245c8e12cf2662d592d0c16e25a66e1ae54f3105a1af306968c7ac5a670791d38fb11015d15b5d92fdb66ad19bc36364caa88093b557d57d125b0d04cd10bffcac66d98809edbb3bf4acb6c3bed774b911330dfe7ac6eb55a3d470c874bee9e8497a571a84ec9ae156571523025e93ba31064bb9b275e1c2a5f7223bd6a783c6fa68716c32bb820635af731d1207568b6ea16dddea30d86f4c1559d46092af9feb3ebb26dfad144432dc17a130aba8076dc02bb88b311a435c7205596a2eef5b5b8718bb18e77f464b289e03434c6077b253764d67536334b800fdb9598443515a5fa2bd255d588139391067aa75cf168afcc9f0b81e1824307ee44948430b62ea82e534caa9c51e6dcf76ea471639563b66859341b7c54370d29febb10d3fa72dab5bb7237978ad1325f314dfdcacb8638044c7387abadd4c10d1b9a96a8fdca0856959a5010a23337d1cfb513b8d8817d6946e9eb4f96a549ee9685458bab725a03c1d16ce6c13e41ec7965752fcd328661bc168e64875c804cd5e05b9f4fc9a9c6511f2dfcf94c8665b030bf61686d59ca593ae2f24a567f79fe14791197abcd04918014473f876a162ac162cea99ceb079f009d34b9663d7ddb607ddf2e9b28061d935f8977fbab447303d897e56af93249b343a15bc7eed55996a5b03fa7c001739366c27a206cef64153f82fccf0155c065c4daecbd57a8321dd8d0cb678403bd6937144e332c5749bf9ea32cc1c4876017e4fa73674dc6238d09387495e8dbcfcc964b039835dfeb9a7eedee87a3924e6b8902c23d6661a0d89b88e987eb12672baa327bbbdd66160517173b26e0bb91bf792584a68e90aa70cc70194d27043e2d639e36da85a6a5ee298de3b29dbb3f1d3fa1b082b1150c729727396b0d1ba0950f9063df443949da6ffb5d287891a81902af6454a8a8c98729e9b1c9fc1d111c41910f9d988a185c2eb2d557a81eae1d746b629292f1094df33455e5e092bdbe95a910e7c7ff8310261d4620e87665bb15e407f74b40f7c3757717ec3fb74dfa07dcbf15df166941b6ca2f9b1e9f12224b334daedb1e6f53268c8caba1eabbf4e139162f7bd57f67932c7e1efe2c67402ff298302e76cc008bdbe2d799d85198557fb4c16f840a1b12083ee40651083448cc634a3d0f08c2066d51cf3e61017f906d5f8c77c814317b4e48fe93c28ae655ed85d14258bea3b50504aae28b7316a96a4b41959b7111cb73ca2559352923c38555cad46412a60e5bee2a3531fe9beb6cfaa5398fcf8fe0e1a3377f42ea637e40154a5ff0535e7ea00a954202356c2b848aacd0601c99bd8fad63734c8d2c237da785cddec288a5427debadf4259a8ff61bf20b3859aeff5a739076f20765e05ba1d322b31e9406c852d1bd20911fca078b90e2b95ce9d2e5bda27e5295c8376e698d7afab2c942e8d36de3969973300ea063068d0d5801cdca78d3ca76b30de8d634884643991a758e9ac9f29a9dd8aad4caaaa5d182fb41139bd950f69c80223f67a94eb75541890e026eef22dc72885dec7b88976db9c7ff446a0fee383b0b068ccb74424de1a6c9b5c9b687acbb01374668b690e83b0ec91b85955d93f94b7639a305a7f5da359ff2e92fafbd5d664bdced4dfe70b7964280f01e1c667441f894e73e52240f23f0a25f3dc220aa6417036b119876db0bbd03973341115b105b1e44be0eb8a8f75cd64c8107eaae1f0ecc585316b50184cad1e2557abc4ae6ce0a8adb749fc2af54c141cf9a72a609fc7b274a78c90ca82b687d4b3c16b58e540d56b6359c954f0f14d8ae9a9c03823df9dc55ee67f24057dc1fba2303535ab842b42b749273d13b4824c910e3d90288bfa7441ded6c6570eebda7fc72e3b73dbb8a7ac35a852ea26a7e2049f5df557b0fc1f5da2e0b7982e02247e1234fee2c7f4f72e68b6f6cd15ce85b79bf3c16f519d4fead9cb7f36fce10e9d929b4621cd46de83908b0737fe6276a633c394e8a2d1328c85e6528d2576213872659d091c3071291cacde7dd29493e3418183c2705673f7d244a77d3f6000452f8563e654921c4bd0a7e00fbc5463b51b7903bb77f234d1eb5944fd7bace38e6ed1f2518495af092581844d91209c6d260de3c7d7ddeeb7f37e3c2335425980b36503a3c6f21a0785c18d0756c8f2a5e77f5d1c3c5c3461281a880578dcb1539638bf33a7fc13b09b14e43d5bbf2a294eb095bb0bfaadbaa3886082747ae922aaf6eb1ca6a1b327503ba86a4051c7661b710ac29684b80eb9e14a52d087ec143ce787eeff03f8e4af4a86e720653a3193a6dfe3301ff228a261320ba3a43eadcfa6b97368c4890b73541ab9d00d52470abcf29bb7d3f815e9ae8b355d7b570ff8959005a0038c049f4971de45966078dd8a3deea52699a38d96a45482abccd92b6f725872c71a160f52a4f92debf21024c7367987240914fe4a905b2f1b625e629b6497c90c7819b8fd63a95ca1aa9cce8843ad91b61baf458b4178e3e69f0b4e998e5a3989bd22a0d36adb2a48e79cf98eb92c96bb10cbeb5cd6250087b98860a9c4d72d35c9b690021c16289741304556492dc1a55425f702a711d6cf3245b2272ac3cb218d8ab08ea78ab5c90e964291f069b2be3cf3f004282beb9683383aa7181cb5c1c456c7798b5e9a8e6a25b85fb4d5cc42885efd6248eada3cf8e5509d0b7b8b06b37b4f804d4cae2caaec03b1dd9e7601437b6d768d61f883e902fc626f3af703dfc4b2185f0119dba35fdd4143fa2cd5c7ed39f8e116471d1ea709a26956efde14fa94a526c33e3684eced7295eb84d1f2a1a2a49a52906bc21b5353d59716d298e091943642731dacccd122ebcc581ad08afb1eee40f0897e22ab6d427ccf05aa467ad0c954f32028c06d0e2dd7ce9a5d2e5c0297f1583f5219050fdf4ed61d3ddb248bcdc1b87fbba0bfc94245dd4cc476fe7230c2d9beaec64ba78c5571975d75adcfc34cb9bc035642a2c0150fc91279c3c72c3c400647089ea5b6b804b657e6143f4ddd76c76436454f909e8261b68fb82e5b043386b40d654e5e53e3d47d24cb251caa388d0df2396724ae684c2c9ae167a2bab9208a3928ab92f47653ca62eab43685e5691aeb0ac020fc474bb5b4ebd001715464bcf8ad874706d3b5d33692a7bf86ecdca4b9750be848c266cb56ef060acceccd66caf069543e5be62d14b4aa570f6d54e737c764238fc58d82f614bee03531500453bf09d274e4859018ac2e961e1c2ff991749d6ab4ab28e6292f50837b9918e4f78aeef83915524eb0c03d6fbf156f90917f123d219229bdc8d719d473e403c1c8c86f998879c073978711550f584f5a3deeb069dde5647136aa98a8da175b2bc71c83569f6c0cfaa5298953ca9d4ea168cce4919fe102ee76ed9adc6bb6d4bd5093953d47e657ed2637173b5d247ef5e8b286069dc9edb0e1dfef443211e3bebbda00089ce689e61a6c3f51e15d64ad112cd2c6d0d23c0854031cfbedc1747956ac5a001498d3d005ce5e4de3801f28427b8fac38408a70fa488fe6e5b201d8f485909f7cedd53bc4861214334ec769c839ee698bd6e95fd8daad2c5d12570719ec2ed6f71495a3ca122031aaa70c874006dc69db44912c641f01b0126dc953fc498424ad023783198ce1715be01269c218fb3bd1e46e6d9c67a23cf2fea31201bd4038d0053d20c77f77b455e072ae56b337777bb31ef8bb04e7a8797aa495381c04004269c6bf2bf65a98a9da4f5b273b9aabc06d9afa0accd32f75d841051bba06f100cafbc120ba22af01681d941dcc84be3b69e00aed5628294c1c193669e6fe69385d27cfeaf32286e42389df53d38a50857958946aca4e1fdeea03362668728112107dae7952598109774f40c4a0a96973c15886841d37198d5da445b2ff4ca0e31d8e016ddba1ef47498a6633f885c778bf82d88a088a5efdc20a8ce2fac61b07519e862c546d4e724bbd0b85b50ab8c247efda934b155a3e344944a1acd19870f164045b46ebb703361be79de805e3dc301ff6d74b384abc7ce9dc740cb1b88c7601d7a5253810484b8fed91ecbe84aabcbf2f064ef283214b03f7200ef1afc8444ddff1d9edfceaed484e6701a98b86869c48ac95ad3dc88c1477bc033605768a8a87c7870252a2979072f49b40e2404d9a8ee64f252c7c71e2c45f73fa683fe125cd50200063248fd0c2b23e3d6fa550e1a7077a7bc4d7c632dd4b1658a6e262804de88e71bc6af063b3e70c4a969619118e73190da7c6b2c4216d014dd8ee0707482f338450c65ec15c7a90271c01b8fbbf695eda7ee54b5d5c71f6daf7bc5221104beb2a2d33f8b5826f4236300c5b43bdb6933e02a34d49dd60c0b3628830e4369f8bb488151e4581811180b1deb9c4663a494c0792edb0b05ee76856f96c5ba4195d79838a81eabe02c34e11cc9dc337b6e30b9a55ff636095ae008bfd8c15b76091bcc22e4c4887afadc1c723821b5354e589d556cd1a1c83b374cc9aa2556ed82175074ec5a007d01f7036758f40d8ac4851abf631af6137c72b9c3683d721fe04d8a3d83fd86b505d6f7c696680cba75457ae23a538fcfc047a84307cf257457c12c00a7fcc76084a5968f0e71925825477be7adbd391d4f72fd1b34eedaf54b417eb20db81e55467e70417f3af2e2ed4239c81c1c92a261125e65159894c354ed44924a385d4ed18fe5591eaa05e1dc090d2cde4bf597614da3eb47a9e3d095d8618a4bcfd29ed8a69b2c802fe6ab0723135bc210657b504ce902ab2d5e855346e17bfa6055097dcfd4e94a79dd021fd71d4c447c1f4400d16b33d52aa95afdebf750df81c9225232555b94dd0523490ee9d1e26972f301e310ab14e88c217620625cd467f2830fec74770c7e81591f036b703ccc254e4099aabb4c63cc2056f3f2cd4007ec78e733a9ba9c03beac8fa2006e54f53ff97ced326a5374ac415d6e3e8347ffa8265f7f8fe01b553c13c6f75601499c465fe1a697e65f72ca18d1534bc553c73d21b08bc4af55e6560a35d3519247fa849946fa4f803c15e1f705fe9b203d93932a51af932f0d71e6717a7d58f51d434213cb7b7302957856a2cef84f7146c19b92515589e12060eff95324900639599992b8125d3c5b12874eac91cf89ba07acddb0358b4744a40d5f434dd80be0e3f2d41a35965cbe026d1073cda3b1e534548e4f95cbbdba5dbb32cbdd333ea726db91f9546a9476a76c3b724d7a6d54634a2ef20b1b41c33049cb8a4ca96fdd3b23c1ac874fd0e27f1a7988a7a1d9873773554bf8efd9d8232eee236b28a9080de5262cf7715cb67bb961e58f4d705f10a665b5d5c09922fe2cc230e40e270c40f34ad35c7126db6aa92ad8e226cf2c75b8f93c34a7523937d39981beb4117a321473f163b0117716908015c721f93b26451d8478464cbf029724e42116e9c974e0a1b55ef2b3f389bf815ace90368dbb41d8beeca89e4eee4eedbe9a0a7fc0d7ff2a9a4b078fbbba401e52d70a63ad98a961737c7218d52a9732eceaeeaa700dcabd9fa2332cffb945c3e9f978ba581f93a1c6036b8e0c1941180fb9139692e387ccae26105786a47cd8a6645f80ad9a59f23efa6018dd7ce01d352e35ad52d2924bc7eb99f36392c4c8599db353d755955a035441f8cd9db1788197d7c66273956f0a3c1617411cc16b886f41299558d9fcc68c4cd355932c8321f7c0151709bf2e55f8693f892c4c5292d8634d3aec8d5da056c012c0117933fd604eb87c34e4cd9b746e7f39e1698fd53bd117ae730976eb547ab90957baf49e6e270b7ac38c0e6b28d428e2306ce9a156cb84b441a948fa1f529436ef68e044bfb8b9aeffd8b06d9c8fe387b71e12bb0904bc03929b737177824cb411dcfdc83f7816d00e1c37d35ed598b28c64b60084e780a79328915faecbec2af46a1e7a43a4229af369dcc8b3396119839cfc4dc1ea4153f7c26516a16337ab9128ae195c5b24f028d3af074ea75823e18e1cbc33dd63c46d2227160d8f0dd7c91a184aa84139844a1e11191ecedf6c2fc4968df79f0d4a5e4e84d00239869e8936964afe15730138e0f15c1933f8294d186cc33b6a1ccaa9c0285bf4dd42c5e0001029fce45877acde9457cad6d7adee15d95591283efe672cbfcdc9dc8d37ce7c50baa5e70095bcd0064071516b2456f1f3dc3dbd59fb4971feb77e82606382cfbfdc1556e97da3863e954ae7c04be3f1c5ab0f2df60e421cfa4cb3a2539097af5387bc92643e092879a07cc15f6b45ca386d0a1fa05ab6cfb160cdece14bdd180c19e56ae3bc0fc991775eebb3845ce47c17df2321b20f8c08a082a53d383e503ad53ac160e25658aa95ced5b21d843a2b6ade8e4fbee9243405ab0f6bf2d94678db7dba21c52dd4133c48f54152f6baac8f5c7d8be03a514ee405d97d1b2c27b627183d06589454d3a433a33ec264adb9da36771f573a5857506a0b9bf3387dd15434aa115e352bcde1b7f4c5adb3fcd97c2662da7128404ce9fc8f42dc5df856f135588c3a088c51fd9f49d04e7c990ed7495c24754274a849b3ae12e7963927fcb0751a061c88730827550afcadd3993aeb95860512a024f671984cac6d0d175b11976760980d91d999aa10d9bb3daebb556a16968c02b5d089e67ea5a13a98fe4ed2523e9432f19311c4742c3cd5f945a21d52ba1838a709401d6d715ead7dc71cb168216d762a44695ad3b58ee954c4b104502eea6e3deaf0a7e3a8d9571a3136ac5d1b73b63803dbe138cb0231cb2f3c35f918d9cd629283de6a755a73ce42a7ab25efe3a6284cafa7371f57d7d871178ad517c78c0d2fc43a6a92c0ba34112e5fff827bdf751ba65844351c072e5700329db298c72078c5706e8fb7b9167b8d3c0f418bbe66003efe1b6bbaa58005f8d19a4e93200e4f1dc618a03fc606f49fc007579640b718924c6e208b37a0ec23b55c8a380872a576fff60cbbb22458f1e6e9964cfe80a4012d3cd558ff7af5b29cff0c01616d1ee4606921892ccad308a4dd8ac60ee8871ab5e35952a3f01b7d691364a4e79ef1be94f30699f600364e13469c3d700c5925cbebbafcd23bc1b9b5508db137cdd666884c944bea3b96707cc56ac5657912bbbd730643e88bd7889c0c1e666d5976b9f04015df83a75234e4f6eac0774f5b1287fe3d842d17173915b00ef040443eb78a290f01d93a093ed488f94304f5ea7ae788b0d61ec30aef6e81e08451a13b1e3a03128c49c720945dc7f32181b48ff5a2ff252402f1cb498a802f2c4639d847a9127b7247120e2d0e8ee993092f0ec68995539d8a03ec96b7c79292d9db490be3f268a8fc7941a5685a3b06072ccab0c0521c68ab1abcad0a7b66624c16912cf3417a425656786660f5a94048a445411238fae611bf5b5c59e62e75bda162a70fd57d26878cf0daa3f008b08dffb9ea5fe154756f79cd07f8f63eba8f0c6cb52238ce8677478edcc9170ce9a08820cb2d1394cac482d474b208274c8976f48dbee81d8d15ae0cdf1b6f03f5aed325f33e370550027f08301c712aea76e9127e406d3e838d09b9ff222eed01b2f01402100f94812ee95e02fbc0613069b9873d3b11e4b5f4ed671994c5a3dfb06be88ced8bcc8434963be91cc125f95cebc478f72c305211bb0ead3d21a834a133e8e109a53c7ee8c4e355559555130dc5d07aa73432b5035cfcc9bef3a14ef055cade9583f076aa109aeec0e187eb89304463cbfb12943c9a2c18e4003b04ed0acd63a768ba70afca957da2d8873c672562fe1d26eb9df360c51d53b41e63972d66a5cc103bda1a2c7589b1e2bba1e913204eea5ad1c8edfafc10d2497bc2865bfcc6a8dd158b0d0488d5c3debaf80d18bff0cba04a1fac7a58a65d34439f74452c6174f772b90a884830bd3aef81a16062e5d1a2ae7047277e5bcbd57abdcb9d85f050467e95821d05ac0bfaa9b68ae9f3f22406e927955986463e46e9416907645222b47d514eaf673c2e47391db1a25c1cffc909dea2d6dbaa32656d6ce4e0d076e31c3413da9a1e7463a58332723e17711bbc95a76fca2fd2d6da7b74d10080a6e14742299e3d8d7092d6fc68bf14f59ae3a3d9de9fb94781efb24da28dd714d6cc9fb91e7382ca2574a1f28e7dce0896f5f49b25f99c3c55383e36978a6f56a784786748d979e10aec084469a4cc7860e7b79d027c9af89904016c1d6eb77906f6ed70f16d95079372b082ebdc7d0b43a6b7d7229d47325736b94c91508c60322d12325b16d55c9425fce0f6f9cff6a295cf0854446ac44beda48392d7e7d717ea5d3af8b0c5500ce94e22bbb54bf3648ea6e7a6dc1aa5472ba4f84cb06323023ee1f2e8b1d544c8de8016927e8db64d7e48b79a8a9b3750dae63034fba268fa2446339cdf713ae90b4cbbd92131f366f4d1bd1427221852a80836ba166a59f2bb18f72a91992214aafea94ad308e5c157d99b131f638ea189a0db2abedc8cc8b840b454cf2d48e48f340615a97ee92e4f4e3a6855089f5a405a23f397b2d8ccf9fcd5a0804cf8d9c0e1336b4590b4e67ada8368e7b8717253168d604a3b4db0cf40552c998a269802737cc75c3e0b382407dbaebfa44c98c14145ee4971979905afd895f33e5b7387077d8b5e5e07bc1bbf4788b6d74b452adbd8917c030261322b79aacce305ce6e2ff75ace41908005e6c72156b91e459b1fa5b4aa693733f93f66c2139be2c59c8379e29b3aaa4d1d2db8d4f502aa53314f7fbd00ce11167e517f43abdfa434683c6f33436184592a265b0bec7bd60863c0f77ced60ca77718bc3e6b28aea22268744fcdd7eec8ac547c4c38605bd39fe0120b8355905df180dbb84716140d328012f0a1b618d5848c701fa5d2b0da67c62cacd94678d4179610416040134456b1f41e60ef759dc93eda6c09a82ec6a7aee979ae114369a19b3fc3931838caea1cf105845ad2e7448bd03b90bd5a5367c1d0799abf3bc128b3ebe68129ae2c797cd0bcb55a04b49dedec9c0544fd4e2df430f7557303334d797aa7dbce5b2916d19f0cbdce125e8a5c20f5ad24cec7d341262915d36da173abbfcefe0d3a237fccbf72f09aff2da85c6b8cc0b15e874f6e74c72329e654dac63aa9de21e9fd33144de94ae149c13429c4b564c7720fce87af84db3383ccecb6a11f1699617fbdcbbbf8320ad5a92a893669300f64653ea558a784551ea95e4a4187f42aa7af4843ad01fc246a3b45ff0c388d3f605ee90fbd17a7d9766973f9e8d69417401827a3b839d3180e5a3659b895afaae7740645122ffda6831d9c2debaaa5b94402a19d085be6153728382c6083b3a673140fe0087009199b11ce0d5faabbb84162c104261c4044151bfffa489c6399e34d517138b09f733594e9690efe5110124acd3bb7a76696b0ec57dd67e639031873cc97b539941b4dd7d966c08a3aab896f06c8c3c98592508b6eb38d770500cc78de4ef920a173293a0fb6961898bae6385c7280ce49574c5ee6eaed06f9b0c6d25f033e9ec2b4653c90f8390e342ac0041fe9c47f793f0a3864cfd59e9e55147febaf14385f35c836a57d5cbe1af05e1935756b0e1dc0c6ee6ac868436f267655670efb97a42dc2f07b197231ec9b9711d285982d2856f6cc0f676f2c3d384f04d9fcf975b2ea896c357be3d0c81131258810e7469475b4887dc479e1937115b7037a0777c24552fb539500e131462b974c0e595aeebb7d4083619e17953eb917e20d04d47da89eed63c79126a028265be61a7a06edc0807ac9bab3e54f5522a57cf6ca4663ec288d513618c3edfbc9c749297235dd1265747ab801fc051f80a908ff60ae01b66bd63f04b92bc1eae22a403184674d99a0a7146a4f80aae116bdeb679622f2bd87244539d932d39eab54fd06151f33c68c77577e5e706d1f735815bb0081cdcc2309920fd42fa67609d31970413a320ef38aa9864c76a8029f1e771c2986b60ef5b419b0af52b731f4b79bd1fd0655f63f0e8efdc9858e9076ce958ca0acb767bcf462fec0a38800fd218dc1d894f2652ba4ca55e402bee5025e41c39529bd43e12d7d090a70a910cb94ec0e7a6318abfd3e0d7149ea63878f752f77e101f8a01ee53bf8b039e51d4e1fbe6b23e790f9ee2cf535bfb3eccf061320cbe1728db7e36ff919e1127bacdfe31cd9dffc3a9e7f8c49cea842bed078b5ac6c02552e5d09caf784d04135116f068d03ee50fd002c41e2f87b04feb5702654b092964a80528f37b6e48447daf0882eb8702bccc3895d59ea053fae1da726e8c3e910e4e10012c8620b44d7c2137720132db30acfa708fd719c4a1a32d9f78d4e3e696e39128013112468342eac98afc92180a38e51ee3c8f26e7199593deb590b8c091b5e665c8291b47efec06d0fff7e7dd187d39809eace166857683b4c6cbca20b797e1a5ce8e9ef68b1cdb9b760b07b04b6b4aa5f983e835e6785001086321e8e61e9d38685da0d508ef2e8efeec92dbe6e9e2d8928013730d02ce79ead0f704e69c9ea91ffe3ebb26db1b7de6ae01bac62009761e2feae25947ec3b7ef5760805b496d6d19a0f9d59253f879725a50fdd9d79173cc6b45dd76eb450fc40cd5976e1031d2561b87ab431dd6edab7633138699acc602e77aef6e8a9174f3f8af918ad35984eeda2e7fb5919bb7e147f00a43562909e75ed0c923fa98023a3c75d46899087810e1646d7c9e94b3bb5b46769dbc8ad90c26df4980e58d84f49ca876174fa537f44720ddee3ef6f7e77fa16e9ee60e4e123554ef333d9828d5ac2605fef705dc13551058a968757c81fd630bcee327e51e5a9f00a87c2ecf2cb16041c77d18b7f4099624de4d1608bba232a215ba8f481249e244f69e873ac6b134ac86b1004a64bb4bb6ab0f7f41408421a256947c7740f51f69e56e3257166b13271363122c2b26c742caa1913b3c68006011b292c4ce4b0f69888f2042584a435c7af8cd088a5cd8684616ee5ce185636909123304068a58484364400f5034d24c238ceb816319e5c0dd80daa1c555b2813484635979e105488986ed48c9051662a801061e3790648e24a9210916d269057c01c91d9e15976d0586d1a98d2597cd86fc63a5b4c2b2d98c886ce50f6ce4438319f1e84aa4ad994172e84162e1512293d039d2129264361a361a382e8a6ec8b10119e13092a144c316830e4f03801245271b4c4bb59a4d1b15113304035a96031ba032250a07b8c0c200481841d483d2dfaa218220800f4b94f4f01419c090b304656a104000f2560619711c81086cec80238018185e58b1c2052dc802033d04d9e104400b2e2ddc185f90a00b2db2c0c20257582101253236d89c2050451c51780325c0118c0046aa5d8002d414270796152da280822cd5408d2db438cdd105165a58482b31f8f04204413c477264003b42824c20014e34a14215d1041cd80017483059428e3d58d85e4045094b7074184b2b5c07982081072ae000061ca0080a4c60020a40720427071b5c3028644fc8e0d8dcc846c8dad8d8c87830aa82d920a3413683920c5cd2c85e90a1917da171200bda80301a480018c5f0f242e642d602c6c28e15462a643b30d396236b19b1642512295b5919651ba66118875f74683eb413146d0828da8a7037646c650949983050341ab9acd4608324b62bbccd05172c32c019a0682b52e2c112438f258a4a3f6c04d06468793917921052c9b16839f46019b1a08824a58885209228919a0492e0b283a2511c452317186650e4f2c69ca0a8d42347b692c3c866240594165a5e984289ed89221d303a60b49a1d36a41e3be250628403a95cb9d1746837242c8a34239e0dc7c269a0486be160d8685a3c0ddb5c361a1621231c567ee060e058382017165c5828f528f158f9419382121c0c5a142546661409006863e5940000b09d2e3ab81d1ba6d5683a1bcf0b0f2e5b61b2e263e5c8a8851c18d7a28d36174dd3326d452369259618366d45c98a0a3a785876ac702b98b6b2859bcd86915ed07c24519a619481a21c1a486207b7f920015162db811231a98ce398021b3550e30554546086eba7270a2882e4eca003d9b24730828d0d261da415200880e4481c67a401831914d05131c58f2a76400334520086171cc8c2e65483035caf02babb0424b8810319a4414608903862882008e00392233c0899410617787c51022438b081238c48012086969d21c70e74d0845514c7149ac08420807081c70e1aa4a08c30c0f042041d5040029c480df10313244776d038a30c1798808a2137b0011a67a4800c304e80012c0e50802590e0060d6400c609bef0c093a2e73b4176bcb8f1833576a002324a4002106c1105029ea786080208263b4172386776bca071860a240081289e3c1f62003b4282e470e678d9f00fd640e38c159451021280a0035b2c20014f8418c08e0e399c64e8cda8b063c371fc600d1dac4005659051021274608b05449100043ce9414a882076b03945010a4588e8c8918318a078e2003e30e92a808003bc88ba28c5a14d2193c2080ad9134819d8b8c8b6c8b2c0beccd33aecd452a3e1a0651e336431603e5660d05ec07a6c2e603c4a2ba8a08266da74bce430bdc0e0f2424b0c2c3b4a2b246e25e3b8d148c330c63060168cb100b0898b02c6b8bba75f51fdb2aadbb279de6e957571d8c49d81312661135706c6b8066ce2ac98c9fddf172a93f373b5b36aee6a7ed59cc3cbd5ae5eedacf3dbb2b9ab99634d1c10c6380736714160acca3faccafe6a28cf641d6eb28c0e3799557f1ee56830c62dd8c4c160acca699bbb9adf172ac4e974020263bc0363cc84310e00366d6de04dcb70774f9d6d551bf77dc1a66d051b083067ffd5b99bb0699382b31f834d1bbaf1e4d5fbc3fe9ad33667b74df3ffb0dac5406cb9bb2777b559cfb2f9adae1d9338c658068c49426838f8beeaf45deedbdd136f5920c0187f0063ec811f606c7a1927bbae6bdf609aa5499aa3299aa1099a9fe9999d69966549966329966109965fe9955d69922549922329922109921fe9911d698ee5488ee3288ee1088edfe88ddd688aa5488aa3288aa1088a9fe8899d68866548866328866108865fe8855d68822548822328822108821fe8811d687ee5477ee3277ee1077edfe77ddd677aa5477aa3277aa1077a9fe7799d67766547766327766107765fe7755d47d4618c59c0183fc6d80736655774f7c472b142608c3b0004cb0c8d0c8b8c11d9885c44ce342c342c45648c3b8c310cc6d826bbe9eea9a3362f2b7db7dd39e78c310730c61b7019a3e40063ec824dd80bc0c018bf804d1806f2a952e5938546a5cae79bfe9a338b6ae65dfda86ece6ffaab8c2a9ffc5755a7eef7ae75d0012bc218676cc25418e7aebe2e34e7aefeeacd67e7acab4573dae6d7d5628c356cc28c14c93436d8905f9df9076d95d52d8c7117580b262f9ec0f87c5d46dcd675830cb5aedbe6608c336cc26e607c3a993204608c7960138e823156019b701944cf5935af5aa865bd9bbb2a93d95ff34d7e34f3d5d5ae7a9ec199128c710f6cc24de0ee9e5e56eab6aefb99d5993febbade7733dbaaaf7ed967fdda62a9f955b5fbe61f567d5fcd72db346b8cf108634c0a18e318b009cb74f7b45f2835a45d9bed761b9b97ab5d545d31c61ac01863580b8c710630c65c608cb7d830c65a681150a3054f292a42614d93c0122d5df8ac6496ece409949c33f2e1f2283b71724496b57c0496b77c4429933276c244ce19c53839a21433ca5ccc115c26c540c9395a5e8939828b19c52ca1238e38703e82c3d80c0a94ed09942d8689a0510e92c560b806cb5b0cc63518090d1b8086b14cdb461cd00ad1ca0a2685e3386d341a8d346e94b76d140394652e0628cb404e50387330404e502d59fea1714834d1b41c84656fb460248036a0ad6594655bdeb6264e9a68a812b490343263026302e609942e9aec800aca4c6c315d34d901a5658c09098fcc306d59cb19a66144d248968c4d9a0b4ce6c20283e5b818714496b998a22c6319cb38a7a525935a564a5b2eb9c064d993cd0852c632920b124524182676c8d17209e609142c47cb4cec90b365fce2a3872dbb641fadc5c525975872cbc805cb58e6609eb464961e700ee9494b76c9188c11a58c91b06c044bce5a4cdaccc8c5c74ade0115a4e52c5e59d672cbe6c2c5146999e4e2f2842543c939a5ccc13c71c94ce49c52c65c628ab4274be888238e38e230e2082d97628ab45ccaa5982750720e96b51702985c608c3842cb2c31455a7ee941f3e1c9f28fac040305cb2965120c142c879459609e30b1434e2943c17258724b06e3a2bd04f1d1c3965d3201b427242648e4b860d988523682850586892e9aec805ac958ce8805a626380ed44a4c5016af2c67f1daf2367af1d1c396b3ecc39365ee8547cba38d0bc1d6434686a60bb51bc8c8643439861e3232345d8804183350220652b090820aa8e46459c0c4a0cdf4e891b5008565db36859919d48fec47368331216000858f8046941d40e105692c610a65e448838483920e1416e38d1f28018e96118f194b702327b606b86857b8acbcd105e9c7367a23043c1af6c61728a00e052d6228010e6e0917275c1ae07245172b21c0b806fb41cb1b656031de48e30d1c6432587543d5001497374e4565a5e2584a508c463cb98a0f547c300b0ccf6430d4caca13dbe8070764c80ab732e25638284b944a1cc7712bb9c48db811c7adacacacacaca862b4168ee33827a03896cc6516b8168ee3388ecb2c9c8fa2e0388c061150c0c61336a0032ddcc8e12e80e2b822504171dc0a37d232161446411369a08048da045ab028260c0b1456021b69b0c1c4933330e0821c9c710b1ace44d0928d3c6032c960318cd0821e180d319030126c46f8429b627a649b4a052acb0142e56c740132b9643216c0537002171630021026e0843772f0083401c9a064a8a0b21b5466cac6ac02a80c8b99a2c4140c95690a680962ca50588c218cd1d232c246a31187e2388e8469a3d108b569191470c6397b19e59696d1132ca60bad9447998359c9308cce30ad648c1a8df04e0906685484912d67d8665b8131227357f24bca4259090688032222c3321b110db592a136d20a46b56038cb7264f11244d3d0687931611818366880ea816158a641d1b20b0c1b70c4b0118420dbb6bdf0c0b50145051416a30d2a36299a49b362851b6d5a86c10c61c262b4a10194068385d1028c1f20b3691a462505a812182e802205075ef0022f6ef0460b247005109a2881e1822698bc407157e0293fa0e80001127431821bf0a00d3272322b7e10c70180b04518536e5ab409cb9b290d28693c91c613693c49e3090a6f38af64aec53335d14ad90b9295cc8db2c891b11c3050724e0e9c1c314eba2065275d7039472ee5d18b119c5f88b4b4641d3a6282b24cca1c112d93627e683930ea85c8965b4a2c995b61218dce307119a34818f641240689164d0323023f78420d130a8bd18328a85214d620020a8bd1833674e0cc92359c89402f389319c504e19cc59034d2091239249cc9c4b84b9e64324790324b5ea28305c928e318205310100b413893b015936646966919973197331d5bd6915b74b8e480c199cc0b9013144b7669c119ce8e0c44cadc0b122e63206d070c949cb3c309ce8e18274e76e42370269a32cec451c6997b3192652e8f5e8ce8c8394a19c3b0e4114ccb8e37937931a2c3e587960366c3584a9b4be9c508ce5ce6040544ca4e506f868426947123ac08129a0f2231a41cd97682355aa0030b65a82c6b196a9481de0ccb2d5bb6a1322d48cb4e5019d00bce644623982d467b336c0a2d98064dd3b0a26cd3366c841569da084c1cf60445da4828dc327a196d194b02939d135bde366cc38ab01a1b94220998803a9e11234d1d96c3e9c3b033b032301c1e4ea813a94a11a67cf1c5942952a448210304644821430a1951c888926159269ad19261bc43621cc771a3253a72368e1bc564b1614d0753a66933d081332e73197b418225416224ce1807f1411ac13c29e1a29c512ec13051e66c2b2b31421baa09e6066a458b013a02a521e18314c3b3e5253a72462b3159fcd038ac0855841aa54c582eca90c8b6cd0366b8e146931187e1e031a305a391a669da68dbb68c49292aa2c2e3e34695164c0310a6b261ccd232cad1a2e5972dc7ca0a875f7648a851cc9683e525c828b7e8d06890a1c153bab0c430354a39463a72643d72bcbcbc0461c9394c2e2ab8b04062a101f5e292d16432a5180c8c30b075a82c8f30e092b1a020c46298600a0a086b83e3388ee3388ee3388ee3b811c635518ca868d9c00484b55184363022e013cb0a804201616dbca048dbb661178de3302b34164831685a0cc98ad1142620ec46ebcda0882282372ed082658cc5f0e209a90318cc86ca00056ec82161225a70c6196b38e38cc234e098203c85a80567ccc4c5d8220a62705124061745626c0187185bc0a1e3003ab828aa64599665599665d9966da36d1bc590482d60a000cb94a1ad702312a9058c1cfc80e4b2c57cd102c617a825c668d9b26d5bd9461bb76ddb06c31328ae058c27f00c96220258601b1850a396902b47525025296070a45289e4050cb81a60999629a4293f48242fd4c03355b08c0b4722c590bc98c20778668a21e09a12896432f5e89173371a7153a6fc20c9000d19d0601b91bcf080023c20c5b6651b4c87959d8c4c8f1ea48d8b59828c2556b06ddb36e262bc0023052a8c46232e660d217039669084193c01cf984a65577665e8061c78c6a4c48f191880250a5178b244a9ec32996d0b029e825a2208a825dce842bc6de1681b8d4aaeecba90e4811e7820083a485ca994042f72f0c4140c68401534388e1bc5941d3722917ec00581e3caaeecba6d1453ae4cf941a282f180045468a08c03bc60052ec819ad74610f0a282085025a645a094c58605ab080abc8ac20b98400836301261cc604aa8431012a28205316a55c8ac131246d66022616b419ade80a180d2b2ab1a21398803038321fd480430d38d480430d384c58940e60b2079e89828d40a683210aaec9586002c28ab028d893cc0aae0ac905db818280162e9988651f3918ab61ca46a3d168341a8d46a3d168342a8d4a230e260b522ec1dc6442249409d7601830914c2633343386e0334345e942cbf8458bc15846cb5d6c3e9062309ed1b6171f56484f485eceb6bd1059c185a4e5d1a80b4ec3b8a625d3b22cdb463956628432d4965bb80ce3b41c1c17d344436d315b1eb981916690e5642ce03024000214ce0283d1501966d226d08269001a611ed98579b2650c0a535111aa45db02e351187834825107466ab0e41c3f72b0a88046519856b61652fe91fde8b1420c500f130f8e64ea81339ce16c14c353ca5996653ab48ea14cf947d6d2a307b782054b0e4d0bcd0aad4a146e3c6014657be121e5961c2e79890e96ec126344173e39328b112c3807a64786898267381e3140a4981f19a682cca58a36c36512c9646231994c55301d3d7a984c1956a5871a262ad80b562a95629e3c79c95a7ee2927594b22966a0381e2bb0b0e460c93e5a6679c962381d2e3159146d864322a7488b1915e988e9d123078f18209349cb191591464e8ca2183d6074c528ca480a0b198b4c86cbd90a4ca3cc23afe451d10886443299b6285b942d0ac9d423cb7455a0404185155a44418da4b801078ae311b36961c566058acb5a951632896432f5e891b38c4c0b5a95163250891a65d4b6659cc3e52dc716b3651d3ab2112d2353e601a383cb39b851d1080a8ddca268554c5b946cf4c2236330a327a324700d372ac235dca868d4b2e51d2b79c78ebc12e36394b3161a996354a4cd702c6a4041650405c5c174c10386478b79f2a49473e427a4cc92332a52217324930aa3189e96181fa3ace12eb051d646313e39b256ca39f228c627c609097b69420443ad907bc072b49c04cbd1b206338219b52093e1f20a54b620e4c85a5ec2923717d6f0b142c6393e561815b5e1428c5645ab82e2b2152e63f0f858216f3e56d8b28f96b718275dac909d6c59cb2bc4f8b498b49915724b4622e7479669d192b91572cbc845c3393c6056502b3059110a83c15af6d191b518275db8909d6c59478c0b313e3a724b8c132bb4194ec3b61e74e41c79898e9c23e7c8466c59475e9223b3c418a1f180d1502b302c45a8161630d416452359a26c53344d8ba251d1ac40696a6866b4c065166030d40a302ac06c513629286e9b82e2cc40712592cb0ba98471994432997af4c85946a6eb50258773b48822658a1954505ca6860943615a68a48ecc65cc0a8dcc913996cce50c844969e1381e108ca068339c94d1949116a328232a46568ca01815e11c16d226658b92c9701968548689cb58cbdb88740409894cfb54100604aa84018135c280c01a61400007614000072e0bd891801aecc0050d2823030ac8d926504501aa88822b40cb039e5045d18e0b54a192652b44406d4ac0586084106c9c0684cdd8784c4d701a964740b2cd87e404c9a7044b683e3e04418227944880048e0912e7e2e242ca645c327ec1b07c02919e6054b22228619880f0946c03e2300ee3308ee3344dcb3948cbd82a93d1344dc3a08071c1a0d83697981606e50937a440711983c30d3772ac412269591196652e63301815cff44426c30161a40cb4f9c869d9302a2e50d420658e443299b2223cc32d79c9991a18152ad9a8b9384122e725c6878ecd457371a102258d6ce47080e232f7232bc25432192ebbc46445b9256750483004615973c92d188c0b4c5604a3c56450b88cb560042a18c0052e390c80c29b0ba68d3097ac281b5d321412154c0d8d04823132192e6b6398a470397b2273e981058acb38e3b84c0a1497b3314c2ff925c6096606b7c5606664325c2ec56053d230616e0c4c8a46669ca605897ba3878b0e982ca3cd7045191459efb629ffedb6a9eab244ffad367337bfacab65e953cf43cf76a7eef4097dcffc59fa483ee977d3cc591ab4e7596dcf6c9bd7fc6251f994bb9abbee2aebea5dcdfd55595757ddb77f92d7ab72d5d544657780bc90baa25aff447e75f15fed9e5ff2c3aa6f578982e80712b4db22fad5407e58d5854c0a1863121490b430ceafcead4e3e93204992248887a3907e2227c13434452f4cf726b9a9f91ecbb234b7f7dfb84df02bc5340d3faec7dfa8387e28ea759dc7535d8abc044f6cabbedbe2acaa73e2ff04929135703e5999eb1c8cb11330c6639c5a168ef77b3f759575b5697e5b562707f503470724b908c798abaefb422d4c7fe9a155b3345bc484734d0eea399f3c1cd9399204c524bba1810a5c5301f4932ffe67c4630819d228e229399002d5ca84f4810c2044e00452a0820586548d187c4009093080c705502a08908392388a8a4c41a40605a06b0c4135018d355c6630b109a2032f1011215051801924d00221156a1043034becaca08a1ed61e245678514507c2b840d684337c6880cb068638a9d22d11c211938b1a76aae3e47c93cf33ebb0ea8fea22e179b1ad4e4f57d272570f0fda75a15aea2a442709c6b8094b6802c6980918e325bc813156421230c6d80e108cb11d9a1b887cd0020a52def8c118635a54600b9e154a60068931c67658001048a07042025f608cb5251461080f68808c071401638c1d600833ccb8a39b0c608cb134d08f8c2010d0240718e3ac48901d7e70001b0ed0048cb1d68202a818610a2abe8001c678544503e0c0d238a7f003638cadb184289c44610a1f9018630d02aa9507ac5800b4038cf5aab5ea9af7d9b7ff8b3196422a0112dc3802ffcdbe7a8276bbe6b8cff344a83deffb4410a176f77988b411f75bf9a5d707f2aa2b67f54bafcfdd36edfb5ffd7696fbcfe6de739bd336678c71c8b149c78431fe5717695b1f9585ba7a5ef6dfae76b6ddecce0fabbaff420f1e4628820d3e11410034e4608c638620049359aaac1c221f5ee3ebc8bf4222467ec4b7c9aa1d7384f4204434cb56cee8861a7c6fe44155cdea01635cc258c5262e5e18e320b491eabe0f1cd249b4019618c204a4ebadfb44e85f757f5534bb7ae6ffa6eaaa3331e9bc1d38c497d9feeb8be56a9eee9eb677024f5fcd7edeee9ad7abbabad5c2580a2cc50a2bd8c018030163fc83fd4b54acca2bb300522af7d3d4e566eeeadcd555abeebf9a95f97fcfac96ebdcdfed955d75bf27bfdcf6edea9075d53a407674d076cd6175cdc46ddfb64df2af7e7bb4cb39ea3cb7aae44ca58e20d9e9491264492a080fa824487c7a52a9937f90ab599f84ffbaaa4486fe8892e7ad4eefbfb7abe7871b3f5440a4a6eff294624fcf49e73748b35c2daaf350cb067535b36dd79f249ff6b77ae6afd7fd56ebb6728c9052ec3d66ebb5f56eee6a16cb9e9eccbf3f3fd9c0aaeff3904f1fd40ab16a66f546f5ab79daaeba1ec29f75b9adfcf6e76b2b935bff41ac6ca488ce697beafdecbd867c5ab532dbaabf52bdabea3665df96cda99a6764f2f7550bc927d507ba54b9ab59a56a7be62ed7279ff8b3df6ae95576e5b7eb676956b5bfd555efb66f4f3ebdbd5df3a339bb56fff3a3baefdbb2b9257af665db9daaecafdeac52f154cddf5d7a3f9a553334e7e923a3cadf7abdabb7bffbef7fdaf5ceaccaea2aab57fb595bbb6fdf3fda7da15f73fbaaebae79573fea9afb89fd75ab6f575f48af725f57d4cdb7ef7ea1ac3367759e59753de43c7d5ef6fbbbad7765f2565bed9bf50fabb65ada483ebd5d5db30ac7e74695fff3af5eaedfe5acfb42cfaaac2bbfd657ddeada22fadcd533880f9223fc9fe79e4fee73fdabecea164d3eb95a55e8ddd6aaeb21f9a4527d4f3ef1effdf7a333af9adbb7dbd05b9a25937b3ef55f75bd6a692334eeafdeff69dffcba5aab9ec9ac2ae3b3eab7f5c927203b5b7d5dddca9a55b32bedffa35b2dfdabf359fac8fe564fd7ef6e76a7f5e9fcffc8fe56cf92addd972848eb23e45fb50361db23e92769dd2700db1e595521ebaa75463c631b183f4b7797ebfa5153b6ddbc3df2bcdd279901131905c6f99c91499d2d754d53bfaeed4ef5fe2cabe5ac76d7f001c6788c7101186314368d3d8c03c018ab543977a1ac52e51a16493ecde41bded58fcaba21afb6ba1a92c9fd4765e555b3fd5dbdeee7392b40ca11aca8a207ebaaa6cfdb9d7abfc780f188b1495c03639348058b523016a5a8c12631088c4520582625ba608c5bc0a6900818e31eaa81fbabe1148cb530854ffcab5fdc31c62b6053e803eee10f1cca04211192403730c69ac018f7804d1bc001c678059b402a986dd5eebe90089e8016c038b76f76b55835739d73caacd64d5f4875dde76e9b5975d52aab655f6bdb3af5f6cdbda5aaa9bab658fa876854aaaed1dc62b9d0acbfe5f9b5b22d4ddb934fffb2dfb3aaa5be6d5f75eeeeabbfeaaefc43f937abf6b73d92552a55ce6106879c83fbaa917f21f9868c43fe4f536cab7699ac436ea96feafd35879996facaec55ef940e39bfbfdad8e4775bf647a579bbcb55a954f9947ff5befbd352b96bddac9a5f68a69969a9af4ce64f84da6b5eabab5795a5f6ac33eb726b5eb675d3ccea9d55aaac3bab9f95df9dac57d74f4b7db3e65c67f75fbdea957ed136b76f56fda729d50bcdfcd796faae2e56ee6aeeeaca27ab5eafeab6aadb526557ed6d1bd352dfbc6ad7ebaa4231f95f578bd56e95ca7d756dbdeaea62a1f2bf907f5f39a7b655e37e2b87acf30fab0669165775eb3f755b21437f84bf50cb1a7a96bffb1d45a48df01f6a89340b487f551d30c64238618ce37896fef9d54bafaddc9fb76c4ddae667b59b06cddcd52bd60ba9bfdfedae4c93b6f9f54179abeb8aba5af9f5aeb6feece61e947b7e21f5dd3aafabeeea9a75c618d7800131e1f000ec7eeb9fc8bf7aab6bcb0584b3ae56c8db1e49a2a6e9b73aff425a9f9a1ef0a0c6a6d7b0aa5eed9aa1a06ed3b74d90db0ebdcfd6a8436ad0bf82ba4dab7d83fa0379dfdddff37a225b5d51174f771f65bd9175d53aab1f75c8aaeb2141bb5d737a12beb6abfeeeca87e5aa29dbea7057af7ab8dbee4fb2ae5aa76fb5d5fabcec0b05d1af06e23e3b84a487efbcdfa3b68882f4a0dd167956bb5f17929775b53a6cbbf5e7dca004c698af6d4bb3cef386137e7d507edeeef35fbd76f7d4d22c1bb77d6d4c334e305633675d99555262d3cc8debe2ef72fd3cbfb87e77d5399fea4f5b04635ca574c6116c920101c67dd5eacbbeabc9779c9bfc76fd6b7e757ea1d9ddacda02938c8a317ead3c464efd8755dff77b66db5f5157cbf3a3af9a69b4eb4265b715924f3fa7cfa79e757e5665b9ff7e57576f90db0ee5d7ba6af7d9ffc9ebaa0ee5dc5d9dfdceb63bb3dfdbd5ceaeabfd219f7a77bddad5ad96ce2edebaadfc37f07ff7b788fe86f64d5395e7aebe7a35f439f9d4d9ffa1f7d1cc5bd5fd5666b9582aabb276e8eafb3f99ab40f2693f4b7df37946c1019b6a4842cdbfd936f37f356fb958a9f3ec6cab76f65fa23f4f1c1d4af8f4bcd5c118efc0f46c0ba4a35aeeeae1ffc3ea95ceeb897095bb7a04e0038c31ee71dbb4ebd707a5de1f4af1675da996bb7acb5dfdf4faa0dc72574fdbace23b2feb6af746a9b8abe75dd5d5e493608c69a003d3e740e3e00618e33190d800b3c0490d30c69b1a440c800363ccdf6ddf9edfb56aa1dc1e79ddd648d0fe950e0d5aeeea2d77f51fac0105fe5c156add567ef40901e8e1e5ed663fbfd677bfebea57f3164bbffd59aa4fd7d26f67a96f0a877faba5ba6f3f595d0fdd608c67500219a4110318bc006749608c576ca239e156ea4da55a3d6d5b976749907779748bb3dafd49bddef4df56e8dd27439860228031d639bbaddadbd6af587509cceaa4795e134c87f1496f3555dd17caefba5ecdfea83d42a0019bf21b27d57d731b19046fdbbab907eb417e3110cc061963fc42eaebda4ff4339471e2ffead5b557bdf3ab572f2bbfddc5cafdedffa3f223a9d4a9f35fed57bb8fb25c2cdbe6fc2b9fdcd755ebbc586da46d7d34eaeaafd6ca5bd63ecffd4bf873d6d5e644e10015f7bb2b35f46c10101a410071c6cb0518e38d05440600d3021e8c310b662003fe42eef77757f003635cc60bba8b8afbdda58004a8408c3066645af7894875f534e3febaea5d830c9afa77d3f3c4d9c9343e37e7d931c6668c258cb1e8001c8c710a5418e33230c62ffb6a4bdd64608cc778d967bd340fdbaaefd69dd5aecfffb87aa5739eaf575dd5d7956abd90fa6a21d57d9eea7a5d756ab55f8d769d0abd1fb0090629f00b4db5fe7d5b9a6b1bf75f1563ec02c65b0c30232a464f608c9160130c1aebfefbea968dfb769b3745d1333beda19ea8773a8221b8f9879aa50641ed917a935e1a7a26b7d96f77b936bde787557b578d608c4bb0f3c278066c7ae109fc83314e61d30b31e0ee9e56af6ed9bcdeeed49dbc9a3665d59a5ff5ee36e057ee37516e9adfb8f77b35ac769f50d7ea557f5eeedbd59f77bbfb6aaabeec7335bfdd9524f7977dd6cff7bc7a752baf2bea3c31c628c0a3f80de9df7abda917525f95a5baadfdbcd5e928feac7f7774f8bf2d97ebfecbeef41802e3ae87f2baea9d51efeaeaef628c79c0a61e24bdca3ab32aeb5f35fffac3aa3da330c61f36b96006c618b76c5ebdea50e62e60813156824d2e20c1f8d4755ed71fea3ad3b02fa4fee41f567dbbaba639ddc9a7d7babad2fcefaf2d56bbf3dbb299ab3cf7cf699b57fbd539df92977d75b3286f49ffae7ffd2440d834458988fc42f3735548e5b97df3db62fdfb6a4cd680310b9baa6002632c0696a4bf3a640336f1e0c127fe2c577f9747ee2eddd269c18d137f756db57466ffd1dcf52abfdf731efa236f578ba0deefa95797ea52df922ed5a5bc25eb8ada5d35f22f04631c06c6780ac6180c6c6a818a3665779e6bf7a7a5e4edbac88e9020afb5d542f59c67abbf5bb758adce79eee7edc649b9df22d2aca0ddaee8aadff64d116916ce0ddbaa6f0b0991667dd728ce07ba6edce721d22cf779fa79624230c62836adb006e6df24e7901fcded9bf9bffddffcaecefd5d5d3a7d9e7f45d5ce7e4f774ffd5559eacafab7bf30c627c0fe5d21bbabacf3ecec07b5ef79f6ee7af5dbf39bd5abce79573fea3341813c4b7d59579297dbbe9ab3dac8aadd6f215935cb6d8ff4ae579dd57e75abab40fa4bf3f4ffa13d82313641774fabae57abae57e7f9ba6dabe5ea291536f0baedaae7b67d575daff2f9dd7da177f3bfaa3bc4f5bbff69aabf74ab77bdee2f34baf9a73f2b15286865b16dab89db5f97d010d18b088c71094830821b30c668608c9b605319164031a732ed6800aaae3fac8ada3c4bbba90dea6d6f8fa88df7e98e0477c841302cbb276bfed5eedb5157b7e9afab0ddabfda36affa63d3feb87a9f6c5ced8a881fb6ed36ddfdaec4867f937cfaad53f75f56cdacae87563faed65dbd99d56eee3faceabe3dbfdd0594d755e76ec3abee9861070b18631dd8b463646a82890818e37cfe8feefd59f995aaee2fe92ffb6cdb62b53a39f906967cbebfae9a27dfc08231964272a3488557582b78d301c32b78b4035bc13ab0110f2c0746fa36126b526c32ac6424d268d3300cbb909d7086b11eb61d30bc92c3086718c3302d1b82612b1c111996612b198f2418c6612b38c35e4e5ac671322c19dbb26c8302db302c63c1969061253cc2b64c7b0c03ca302c2329c97c6458c66d1936840cc3b80ceb017301c3b48c848291b69203e38161189699590b240db302e3320ccbb414966d2ca53073c17048d888064d076c25cb364f63c9326c46c78815b1792d0fc8f086b30b609b26b38d324cc3a306603dc070864d2613c6b011305276038665a32cd3300cc46c3012e6926559c6e9603664d996619d766a79815403f6a2020cd914d8287b01db300dc3194f9659b00d672a87b30a438086615080e11f65641ac661db0af68269546419e9d4b052c3b26ccb994b49061b61d84ab779337458c6c291b2150c3bb12cbb81c661a56cd384b098cc85615a0d566ac930d20a96fdc864c864c800a0610d633a302ecbb097cda46dd90b5996611cb6a5588906ac659461232c07e9231b00d752ca3094e4b292613d60240cd3326cc3866000c8cc2c86ac255bc94698866558869d1800b2966c65c3b491866124a66132580973c1302c074c868c455bc1481b9661d889611c8f8c056ccbb0d18699590ba66532609a96655bb66166966130642c5809236d1986612706808c6545c336d286611899b11e37906e341c46988695b0ad07562a9d2d40f890010bc086651997ad3c666aa16b19826119966118568357700b3389037383098bf3121eb44165c9153dd88012cd83ae8707557012181be01eae78c1f7a0d1c03c577c21011e981609121e00b95104460625f0c083183af38a1e36a6ce910192072f3490302cd8c8034c0aa32a8e098c790af8a482820c352a2d329a2a1868697277030e56d01c610655769921bba002b6620521b06a1405cedb12186b1863ec05fb6baa7d532d57aa4c5f25affaa30261777acb33d4aea9fb42487efe08c65804ecce7757f3608c43d0ba4f80d7db6205e1ac1a8431c6c11827c14c3026823196c126972ef4ab798a7bc222001614955648248e85851bb5680028ad6823ad05179f248ec49064381652b9b9e8c03697951f5c5eed45338dd458a28a222e47b652da685e00506ea08865890bdf68722491853e464a368cbb11a348872240762c916d2c5b919926145579828dce1d33fc4822db60d06a645084030f8a66e079d2828e9c02683c24d144d10b25262e2c545124a48516a9b330a1e8e62df1a05a8069a5a4bd8c8236279e4882b4edd06ac024d8a840e986193c21c131458eac65f463c78ab9117920a228b1c2488645084b0d5c10db0d2ba61223b88207255ea0009b272fbb8801c6286a71a51058e2e5d3817951f4429c7dd6af5adafd394f1e7c50107c4f1cbb7293e408a6dad5ab7df3f53c4a8ee3a84d904cc9b01c4d1c22be73f33fac4e729ee7d95bed0092ecf4c194a3e8f650f0e3a0d8c3678a262a96e01e3bd0344710c535cf79f6f09865d99565d985db1bb9a83912f0c1122d353779b8d30eed56e7c953de9131e59f28728e8e635772b03c19e1e01e41b23345331d3738a2438aec6fe4de9b6519969fa6a1799eebfa3b081113fdc0dd919f898a62f9a5afc30052d4e4a2d8e9314cb54eb788ba01b253925fb8d351143f9e8a65ea7d434672fcca3d829b6fcf4351f2c7853e901a6e3a1ec86d82e23f998260a753125d9da7fb2caba64821dbfb3ef3fbbeb1ecc6742cd1d579d204093fd37c12d529df29d89522677f07205b6fd34c4b519be0e61c4d57e7c9fe9a227acea2744ad423bb6e1cbfd12b43130c57e7a993c3b799ee910cd3adcd101d7f759eab76b96e892871f4f8679aa9e985236996deea3cb99afad6eb3d4f9c178b3acf17abbd1fbbe4a00ebd94a7bc2c49d25c9d278efbefce8dce79f2575bed3ecff374ff556bb849b16aaad5bafc3cddb7dd81b3ea10eb4aedc0415ffc48114dc7d2f45eecbcd57986a32bf5b2521b1d501005c7d00b515114534da6abf3ece30dc8f5dee19b64fa89e1d6ddaa4dadabdee7f99b45c20a39cff3ecadd6cc0105511ea22438821fe8796959733e7f12edba0e1537286e2f5de17ca02bebb5d555206b8ba5de9c678ba59e27cbc51e3135d969120c4d6f83bc4b517e9e2fd4b2ce73bf104ec943701cb5189a69c87f8fde8af4f4e779def650907f616aead579ba7ab5731849d32b494d8e1df9dc44bd6f759eeedb53384c3293fcba5835dc9ca2d9890f8e61d881da1445545c9d67ca3d855dda81e658861d2aa2a52ef7ea3c0300a69bec3c0fecc290e41a1cd3d579a6e7f9b2d2f314c087eeefdbbc044913fd11047f759eff6e1ac403459124c3506f2f14d3df20eb3c7bbb4ab12e0fdd4ec350979dfe7fd0e4dfafce73a8757f4e361d4a6a10e461c73dd22b4173759e9cd5a91772ff3c5134433ac99113ab6d4935dd7e1d7e65686efe91e293abf304693e2fdc5fa9bd11243d5304f7ea3c7f58356806870f34374745af2cc36e83215f9d67ea3ccf33bc81d5b6a91f379522cda4bacb4da56090b1c1861aba0060a0e18600c4c800f3429ec14bc9c800001f31f0540c3e5832c0e0b6af7ea1870c2ef068c14bc5b0b0420c2aec204d02d091e345c6c586968fc52bc59064563c6e24802dd4321a301cf008065b125b60cfd2ecb625e1011f7420e96a4bbb60515441616c6a010b6cf2e209520b464104d440e1178268d023081c483139f184160f2134481863cc7383f148c3369fa156a7d531c678ff92aeb6505d6de90f74fdb06b8ba5e22f52c0f36a1ed70da2ca6c5f5b2c95d5f96dd999feffd22dcdeebceb7a5d69e61acdabd755d1fcb2af6eb6ef13ab5757d78feaf5d4ff6dd99e4310f7572f92557f8fcba3ddd76e105114455114c3300cc3300cc31004411004411004bfeffbbeeffbbecff33ccff33ccff3baaffbbaaffbbaaffbbaaffbbaaffb4cd3344dd3344db32ccbb22ccbb22c49922449922449721cc7711cc7711c45511445511445310cc3300cc3300c41100441100441f0fbbeeffbbeeffb3ccff33ccff3baaeebbaaeebbace334dd3344dd334cdb22ccbb22ccbb224499224499224c9711cc7711cc77114455114455114c5300cc3300cc33004411004411004c1effbbeeffbbeeff33ccff33ccff33acf2cc9510cc1cf63ed60fc03095ef76d94e4b4475e05c25757cb64a85d3f47e7fdde51ec13d1ba42582518632d6fcbb2d80e8cf1118c24e1698f608c9930fb41ad0fc6980e94ee7c07e909b2ea9c5f5dbc6565253facaad3dd232cca75edddb2a8ae0aa94058577e57bfca1fd58fb2432d1bc4ba7257fbbb9a6456cd3ef95d2de4fddeb5abc9afba1e82e5c0187bc1262f38e6d272e4596d4fe9c261fdbbf3d3ae7ce759f5870da223822818e32c022a74f28931ce1b9b44b0a3bba7b5c55253df893c7535fb855eda75f5ebb6282a9ff8bfdda557449f31163c23835febbb5a84a077ddaac9e16535abb25477779567968bfd7648e60210dc7c561d51e57f26fc08fded2a11c658092301e1efb6ae1b64d5af16729ead963ecfee9e4c4f143fae3bdfdf9ee707f2501c85f840aeb64bde6db712fe44aa909755db568a3f919aeafcaae9ee980b84a945609cc5039ac042443a40d4ddd3cbaaae1f155dc1b815d5af8bc51f25a3b4a0bb272e9aa20881bb7b6253eebf6a8ad5baa9cd7ea1ad5b7aafab8abacfd353eeb7ce33d5eae5e7b95a0ebc7be7179a8558ef76f7f4aa68f979a9ee7e6bfdd556df67ad5ed5d5361d1badfad5697eb65582b7223622b6776bb2b5f0f6b3fdb0e9f001262febba723e090f2d75f5ee4eb1a90b04944a259652a9c4c2ff0522ffcaa7542ab174d142a9546239954a2596991aceea1a1b1b50c8a6554fa7be5b6e6373f6d6fbae6484e8406456fb76974ea95462d1c01718e3d3cb6ad5d542f9d956675db50e901d9d1e213c3b63985f4d03644727f708e1d9c9addf5bbbd2efae9a5c43deaa9bb639f31d957d20a8b73df22baadff688db0a41bded110ef3c396e9eb529d7a32b0618c73fe577599d870fd49b84002173de86ce66c90ee9eb82831c6afabdf9e0d633c46cd165b60dcb2b90011e801ebbad0549217529f483f4b1f615523cfd2ecba6a1dddae86fed5ffea55bffd573fea8affdb7ab99bfdfcc3aa6e9bd6b02d57f3fb6ec6a9c933998667fe475e57eb75215957adc35dbd7adb23ff395d0f619574f744a48da839136923f9b4b62a558d0f4898f8e4d3af37bcecdb5bd60df9572f901d543eb5afce699b63deef3133fdd5575d5554ed6cbb5556cbb6fb5756b3dc7f33abcae4d7eaead3ffb0fa874e3334af4c3ef3e9fd9e35dbb63d6debd352571dc98931a66119c6788cee6af12782739dfab7656b7a09b03870b6c3ab7f54219deaf2a8d50127b3bfa6def4d7145f5b8d0206d88c8c30e656f0769e75d021cfc8b0bf9eb6db97c890304dc00dece59a74fd9e75d06175fa1ffedd3d3d6fd91f7c7674503c289d7c9389b83a022d54cfb26d56cdc8b4b43bc4bace53d5dd9304a020011a60377fabdd3da920fd4341fa99608c617c482709d2a62cd1fb83e1ff61559a176a51ed7201261863d8a4e3c8e775b53ffb3c10f9fc66db2318e31960424c10d8ba7b7ab92ffb362dcdb2f9775fd4a6b3ed8e542ad502c61d9b1e9006aea979b55d7f6da9aecfeb890cb5473afb45fabaa282087989fec8bffae53bef7fa092d6871b99c144c50ac6ef7755485535eb5d8c513cc4144f30fe1e532ae57e4c774febaafb0fab769dfa61d57555837e5835d5f54e91bebb34cf0ba9458ef0f09f01632c043649d144033056bdeddaa35a7b1cae1b240889765d5abb2e9d0a0003568031debf7ed7ebaa06a55e579b6ae95fa5deefa9de72570f0ecd8ddbaea866e16abbe43ccff3dd2e3795629f737595525b3ad5eae799aedfbbd0cd79fadca4485868320ddf394f9c239966c80dcecdfe253838a5eb66ff929bfd4b9e20c2f88931af7ed4d57375a7d0764553acae87d655eb04e16aea005030eeadebb669cbb5aead9b049b0e20b357354d82c4079524080f920c24096a488f8c01da78d967bddab5f53c6b0348c1181b000ac65867b74d57ddd57ad967b546ced367a8659d4881135e38917262051d403903ca1150769a78a3891d9c8ce493eafd9e727fe5ac5eb1ad2a7f907ecf93ab4054396d65b2c79a7954f57e0f8b4495d35626ab76542ad50bcdcfb62dad5734dff5aa95badffacc9fa5be333d9966890c67dbfd9db3aed6e53b43565dafdeff71f5fbfaa014df6942d5840cc62e976ddd67020ecc0eb5b93fdb6626b8c098b3baeb179adf65b56edabe3dc5c4108c4f4ce0d34c01d0284011c6f8d47bbbe6d7d566f68755695e173ad4dbd510aa00e54cfbba0a60c218e3ae875054f013284e336d2a939fbcf8c49fff131c9650a3f5e29c55f3896d73d7433d4b40c1a799fe9fe6ae877a961882d52c94514b90305eb5125594d04209a2a16ca344875dbc5502e39a775bae56b79a3efb3949b000638cdbb76ddf7f374d0d3d9b1a7af63c7ddefe3c0920482862a3480a7c7ae9d57da136d79cf8b3faab898a5445213ef920419224bfd0ac754e2f54236106124e20010409ed882f8ea0e2a47adbd655e5aecea864f2bb346e3bf4ec8c6a472573625555e6acd647644680c008258ca0715203274b3801c2090e4e7c14b182227a113e30c64bb0890832887812809c4f6f77d56e83bb7add2075cd6f770d20cfbccb7d65f2cb6a57bb7e68ded60fabaede97fb429f6764f4ce345daff2baf614ab7f6d5b34a3f259737afb7355ae399d4efbfd4cd369bafb2f56bfd077b52f1afedd27bb8fd2cca8dea5aa6472cf349c863fab7bea5754a7725e57bd5df5659f081a5e4c78b1f192e2148095f5ae4ea777bbdcb7e7f365f5d0b3d45700a6a98500e2599a0809a221886ca032f41a1262128a82d0164253083921a483500fd71457112e24ae96778c7709d37b049f589f0324b76c6e7ba679b92deb59995591e49a5350ce79d59cebcc769d5f7ac86d87b2ea85d455a75aff412915675dab7ebb0bc879faa8d224a9a167536c7b9e2c92f3f451e59cf377d7bb6dfa68eeb926e753d62e54359462f54ea9724dce6792932bb7ecca5fbf3bb9e6f43df9947fbafbad9666d55b7d55d7f5e36a20b9e6e4b63fd4ae8fe6aee66ec3ce49f52f44b559edea5d7d774eeeffbb4254f9572af753d5a90dda6d91ded9b6eb27a275d3d47ffaefa66a87415f59cdca6deb83d3cfd3e786a8cd4975bd7fc9e8b9dc36dc06b83f9abcd184024d8af049a5caab2b757f28ddc9cf352b779aac52fdea55356775a6f1c9a7fe9bd56f67b9b6ab6e56cdaa2024aa7c6adda0f505c6d8079b5a2b8cb10fd8d432b560b450b43998daeda4425d3dc55fab683eef06d5e5f951bbca4bbda954d72a76a6d7a0ae9e5fec6b6db5dcfcb27a28f3ec6a5f6f7f11b56e4b955dedebf4275526f3775bb65dfdbb768dd6bc58edeaacab7de574279fd655f3d30fdbae3af3ef5db7849c582fb6e5aeefadcc9fe8391bc49e2c09e3d38c4cd7a9f36c5376e73c7d526fdb2631b196b06870c18ac42ab3b20cc1a62031829ac0f8a493dfd59141924f9def3ae73c5559b75e687f2e934f3faceaeaaea63ba79997d5afaa6a212d9355aa7cbeac7e3bdbeeff4df439bf2d7baaba9117ab73aae655d5e9d6e8bab6eedaae566f7eadabde2aab7d35fa3d7c27a8c341dc6d5fadfbf6e7406a60a028402d8c816430e66aea47ed5d67adb68131c6422dcb95fefea1c81124d90709922432ea14dd6656e77f35abb25a566de1d7fabad08c32a9253ebd5daf6cdbf6dc7656ebacaaa0565aacf869e685d47535f3d306c6a799cc5fe685d435bf36b05dfd8182d52736fdece067dbbc7a51a9d4db1f7d3d91f3f4c1c1c9343737446d4e2a6da536e8e0abf81e8cf10e363d0b1f03e3d30bcdbfa27a65919cbacebcbbbafb6f2bd4759d2793f9ffb86dcdbb2dfbab97fd513bcbd5bbceaff553dd73cb7e5efda8ab4fb54ac53ecd0fabb2acfaf399ffce5d5dadab7efb0fd73f39a378801c4125e1c1c49b701a8c71106cda6c608c75b06963e1aaabedeab9eb4c33a352b24425935fb5bf56b6dd4d3688320105c16f9ad5dba239ddc9a7346d337fa26755fda3737e7d50e6edea7d96dbaa427af568575936d9fdb715ca49708ebc3ac53bcecd4bf4ecd66ebab6edcfb33fffb26a2a4dbfddffeecff355b3dd6d5df7db94dd6953564dadba5e4d51a9b4152dfdae2ec2b8a3b40cc618b348f486f189efdcf5104a1585a5553efcb8aedfefe6d67d2274eeaa8f2905851cb0293505637c5265b7cd2af757af1ae4f46eddbe39f5ee1a76b57ab9ba55574f8ac794c227ceea5ff9988618e3c43ffd950fceeb83c2d1f5ae552f793d919bfd4b30c600c0a62182c02621ce10a2089310ac1000c01817c1a6205e108494d3cb7da1dcd59917523bfb2da2cfb9abe7d9aaa95657e5beae7acb64d54c8f0c12553edb37c5eaad22fa55d5a3eac938649d2056b8e54a71b02988185afa57b9dbf0b2cf625b57154259df3b0a7d26407001441040b009881e18e3d36bfd57bbaebd756e7fa8bf3e0875f5dcbe39c9bbf999e41b6eb8e186935e5795881b18a72d014e40002c3056cd7804e0e18724fcd003d30f61fc300121d8f4830f389fd655bffb3e93977df534e3e51a958e4a47f5bcddaafe6a797e5dedea5587869eedf941061f9030834d3e98e1e59ad3a3f9dd5f0d65d50c2a8344956b4eafca7ab7fd206de4bb5ef1e0f8dcec5fd27fb32ddbdddedd67b93adb6efd6a7e9e3ee7e9e3fed0b34930c63b60930fae9ebbcad7561dea4204e17ecb5d1d8820f2af7c98501122082082c8a71cd4b628265bb8cfd9ef69574338ebaa75ce13e727779d7d6e6e88da9c75d5fbb7eb6a7bce1367abaf7e7b72d7b9e50a6adb22e7e97333f4ec9223608c7bb0694904f049eb252ed060939221608c896093122b4eac9a3ecf5dad39ed6ff5ee5abd5cffdb5995665d75d0fe9592184c4a4646b0c9470ac6f8d4751d4de7651c32dbae7aab32935c739a91c9aab76d93a8b2cefd7d80f02162f2017d687c62406cea3942cf1030c64cb0a9470a8c6d6e72004e9f03243f8b24d79c3ad7afb2d422b9e634e3c920c93538373900a79e549b7fe5737a7dd0d0b333aaa167553299efbcdf5ff657af0b45f45c88eecb39942e2030c653e0bfea7aed19d22e5fbd2a13feaf56dd57b73e09ab84bfef7efaf6b6c8db5d40f80fb59c0db243a48db07ab344dac8497d7bd914bad2f45010255ffcf2bbdf5210c58e1c3b0eee72244bf4a3e09923b9bdae14c54f475024a1508ea6777a02d9919f723dea6e2cbb1d7a2c12254868746ece33029913be1114bd2ff738a6282a96659a6a6570706da223274d5187fc39f9adcef3dd168ecfcd7912206b4268823b05d137ff0b77da316193a24e4793144d8d9a1e1797407eafbd0f154774e4a427bef1799c77e98b5bf43e5d861e0ececdafa8a640a684d24343331d4153f4fe516f6bf7250a4243b3ae5a87e6e6c4229025810c79379ae4f6d031f5c692afce1301191244748ba8a7d1104cd1d721880394b9e1a54f967b0cffd1913f98aece73951d41ecca51ffeebc92f4488fa7abf3e4fa5d9dcc081dfa91a0f97de62872b0db66119e97e006d14e939c08a8a7c55087dcdbe5888ea31e42297a60079221099ae47b3d9910404d927b8b26e875ba1cd33408fa4b490fec3458a666286eefe67d1e52591b2809a61eea89a60882e5e7e9d579b2b139c9434d8a5f87a6a9b84d208021aa35d895a1997a1ed8edd57906653fe8fe3b13f4ca2fbb92443d345b437fe8477e5d1a82e80e3f91f4c1b84bad4d12dc5df9a1e3973f3d2841334d4d111cd3f1435111e40198a29aa3245886bf3a4f1689ceea5599f47545d12ca17989fe655b1d9a20e79980acca578ee99b6508a6234f3fb17b653b40fff3ca4e143d93e4a5977e3a0851d02cc9f7483344c1b2dc2dfa590e4acdcb912ccb2f44bdf0db265186035277a5e7a52947bb2e7d337cbd3ad90dc047c5ffc8304d45f4eb3caf87c6e7a68acc06293a96bbe463477a9f978ae9ea3c59ad9be2f8dc3491d5a02b35297e7a6baf4bd192dc6a749dd8a1a0498a1d1992e9efd579e21861c4bbaedeaebb88223029190dfef3b43796a1a9b7c841919c41589620b9f57fe00ec12f3b19709477db23c1fda9e7a1649806d8917b24f5f7857b9ba0c8631082df06bb70efb0fb718f210c4c500cb508a629396a4e92fa055e5aa2a6f85efa81dd47922395b41345f00bbb11f5ba9d869e013234f697f24f24bd4f9766577e1f13d9199fa6e4de9d977e28e7fa4b57e76984112c75d54f424514e1020e3eb8c3d2f4bc4f7b6129aeced3cb5a107eafd3b41c4774143bef13574a5824e7c9527f3216e8f449bd4b9d8e4fa2a5d9b95a2b48458d8aa4a879b74df4d37b759ea997fb3a91a900f53c4e7ef7aff7476ef33c713a913642c322a1e1ac4ae4e5beab079a77ad7a09cdeb89d0b8bfea7a080dcf4d6686b9df1c45d1f4b6f8a9d63a0529dfbc0cc5ae24b9b8f5b857e7f9faa09466a55ada4810591922ff32153d3ea2a1f91f0fc9e8d2ff34d5e5889ade28f2b0e7646380a5f77da9392f474e92fb5b9de7fb3fe7c9595799a1400cc7f0dbe8289aa5b8c14c8cd24349132549fd79a6b84d3495fa20cd7aedf37c6d16646198df18a29aeb918bbcfcca72759ebfd596ebfd9e1cfe3d4fb2297aa7a9398a64e991214af69081f1db4cc3adb5d7951fb95f5c9d674f76025104431394e5479aa068a225588e1c0457e7c9937d117e69963f6a92a3e9f799ddea3c81fc909580773c14413ea6a3676ed3043312885de99d866423d8e9886e7104c7f04bbb6fd4a9213229fc3549869e389a242a7e7844e6c558a21f5a3ef8251a76bb1b53efffbccfc38d9a89a044d18e8f9f4876df8b29ca57e7995a51cd2a39cf75d53a4d642148411ea6603876a5a9c9d7e10de6800c04fbfb3c50d420388adb1cbd95ab383837bff21d16c979f6a0b65d79345d10999b56f681eeff1b3b9dea747fe62ed39e79a013bf1d86e52641b1671d30bd1741dd7d23fa995b443fcaf869cfecb4e9a5a0578e293fd224e340f9751fa2222a9a1c25c1701f916de04932e525c8c9144d79fabc8b8d8addd6ba2b79ba4d1e963bd3c09760ea7d681a729244c99d66e0435ff452b3fcaed420ffc28c8bae13b91ec10fc1ef3cbdb7d8a2d7a1dc7b4da21c7ccdb5e0e548a226b87fd49bec78988528a6dd98a6680a922439720ca469988ee006b7897292e464cf2ec0f9479aa9f7ffa59d38a220168f3e273d5d7ee6b73b11f4c92c406a5187dea722f9750f8e69053ad3f452d4dbe9f6428f7be20aa7d5ba40ceb3d5ba7c48764538a6e6c7c51214bd6f979f5ee96456985d687a26c837da7d2069a6ab75d5a9d5db7abe330a94e617fe2e4354fcf1d3af2700ee6f9b8f7a1b343ff1e3ec9949e04b47ed75e8773c2cc5d0d3425904bc312cb7377620fa3be4e986c0979a9a77fad32ee5284aa255985d079628a84952a35b2cc7ec01e5d622e8f14e6f8ea2a64e46451af2f7426e829da9cd3015b32948d42bbfee492e8a0ff2cd33078c5d999a226aeedd815a936603781a9a5cec462e82a838e2cc744968ba1e647e6db9de94934c0ab24453d4e365ea8d5ec7356700ea95ffa523888a5ff995e95e40889addd63f966914e9c7f7f8957c73d3fcba7043f13d0a86263af26f1cc9fd8d50640af0bc30e562e8992917b7672640ef0d8ee29b268a8afa1b350240f47b8f7391a328e724e8dd04ed76287b62eb702c41ad413224bffbf401c25083bc7bfd795e9a7ee26800fea59e489aafcbd40453cf5333275ed4df0e370747fe66a73f28609aee114d3d54fcf4f85f3611961cfcc6521c1fd51cf43e26bcb4d3e3eb10fd90ec3498d2dc389115204541fee993a51639a9b7f764fc4cf2498ffcb024c5df9c26c80d2b5b821c3df33fd344f9a361a795d860978a68479665f929da7559122447cd92144112fcd071fcac48a75a7b6659a6a44e493434592c0eb1e48f9a62d781a1263d709c82987666f9ddee7e7b2917c91093c2a849d31b1ff548b32c750a468124bb0fec9e4c4b918f220fa1a0bf4bc7520c51f40bc7743f0135df33cd0e25d372f4ca327502389261c7cbcef440507f1c0eb44ccbf2bf929764f7dcdb4d10b9d96d1024c3b21b3d0f3499309a25b8c14f3f6d7adc5cc287f217c5114cf57f6698926ffc8b7c83a5c9c5d1fb507254c283e3d78d656872f31fe549e0e0f8e27fe987ea726b51448227ee37c1547f9a443b130cdd00cdafe41df88d66589225078f207ea1083ef95e986efea5462049f1755abe4896a6d9795e11786796daebbc1d7a7bbfd7112125bf0ffdbe4d92211986df1ec26f50445f4cf507969e66d5d4bf3a074c08a9a95312d4a4c7c734edca3408a55792a52ebfb0d41ff9e1a450e789b5a13b6f9bdc0bf546c9dda19b8d10e5baec4add91e488eaee03c29b5eca4753a33c05cbb2d41fe8ba2982fd007c50e4a917bee88de5879642b0351efc727b9fd8edb2db9f170e00f3c1987e98a2ba144170044173ec018a822369765afc51931e19ee80f120f5d2f24bff2b4b547be207aeceb3fcbc2a269afe078a6f86e3d785fb77c049bd4752931f19863a1dc9d5798ee2b783e9a0d41b24c56e739397e3e6e789e5c023c72f44c9729ba967728e03132d49af2b1ffd521c794aaece33fd24e7b96237004d33ec5e44d3947370d42d6b83542c75678ae3fed0749b615803b1fbbacf24cb304545908be2919c831a29e7213a6a927c92fc46f6d7d47e21144683117d331dd15444df04bdf09b41d87d9c8b2f869e07befe71759e6edb4ab5340b082683d23375ca3ff45e775d889a69a469ca3738969b9723e7a4b73a4ff7cff30716831245bd34d41faa5f44c9708441378269496a72a79fb93fce5fda75512f30bd7287ff21a941f403cdedfe6abbfa7b5e9a493be4739e3960544ab3d366fa79a1c9c58da67b85f36cbbea9ce7b3ed2a0443a32bbb0d7290ecbe5424c3f10c3dfea879cac970fcc2b0fcd17301d73f8aa65782e2fe50b0ec4a570b52b1e3611aee6e7b1f4a7ae4ea3c717094dcb42fbb33622cd01fd7dffe50dce98f21b8d7b64595602b08416f839b8bcf4bb4dce5b78486c8cd79b2980a44d20bcb94dc1e2753102c53239819dadb9c2cc147c58e7fa4d6abf37c899e3d4f1cb77df5abf2dcbceadaea19024bc116f72647af234b737f7adc65885fc9c16efcc0cefb3ab343c9d8cfc3b044cb107d2eea740c1e8e2128ea0fb9b975ca3d14f017d39d769df7e1a8f5d789b151fe8121bacd90a326d79d1047720e3e4030c1c20049d2dba597966449ea520447f11bf2834df9ad418f6f5187db0bd3711fc1c0f8b10cc9aff4b4dea1f9250f76823215498f875d589a9dc74d2dd38399e03d522c434f771e596a11f582d0f8dc00615fbcf775a5fed7a2063b73972956020ea6e1c8bbb0f4d0ee9f9b2428514efe7721da757c93638a25818d007cf1e3a5e67c8724d891e5ea3c59d70e26c5f438f86f7e601a92bc13512f50bdf5fe38faa5213986a929824fc5ad47fd26897e388a60089eeb1f4bf3bd2e44f987258e101cd40d100602314c452fdda3378a68aa478e7d602475b9d30ee46f9665a875119807d28d6a8f937a879e099a1e288475e0cbf04b2e7ef7fbcdce1b7ff7fc6051c8af1b9f9b4f6a904ccd709cc9a141c92cc1384096bbdc6389ee112dbd8dee8d6d608bdc43cbb4244db2d322fa75617aa5eec071a7dae33cdd6510a681dd99a4277e9a935e478aa6b73acfced2ae6ef5a0b00c8425dfe23786e473d203d307c2b8d86149be97eeed891df9e6afce73d55d6b3a625b68d1e425f7bee4e2277e62b90a312d44110cd1b27bedf13d76265f9d27ff15d53f6d91dcdb22adf6c879feb4eb4d896531ee720c414ff4bef2530d76abf3c430807adff863887ecfb9189afc46631700bdae0ccb6efc5eff9b9f87614176e987dff899656872d01b51cc0261aa5174a79b0cbd727f26b93acff481b05a57c879bede14ab0089a2a846bd9414cdb2033bf10ad34cb93792e808f252dc5f498459317ebc44c78fa7afb5fe8f5320ecc08d76bc2c374775a7bd173601b044b907ee0f34d3f14dfead30096c742c1fd4de8f1ed979ba748245204c4573fc385872301437e84140879dc7413ea21d398ea5273ec1aa10f9d6fa2bbfdc7b14c9ce7b00486e53dc0f8ea149a66247126154a49ec7f57b6337a25b9b66b7e43c7db0294cee75fa4934ed38d879a303cc90835f28726f0c396986e4cec61ae095de06bfb2043b2d8221fa54605278a1677660f91ee8f1ae0b41ac086340297a63277ae2d69b0c498e2d609bff250892643886df18a2e1e8f2c1a2e0dc2bdfebcc30fd72931d142588ee8e245354a3a2377ed8a6ec8e119802c22f4b9da6295a7addf889e61158024070f3cf2341f0c30fec4c71759ee789c31f7593836208304b6d96df67a63f76244a764f789a833a05bf904c4132edc2150e4efbb23be7d9beac4ae3c36a5d21fb5b3de779833dc10ef09123e79d46c5d14b3fb3eb56e739f42ccf79aede0f3340597ee0b7c191ff9b606882abfed23cad978f0b73a203433d8e64577a26187aa4779e37426050bafdfdf6b618fef67449624da0255aa262e9895fb7c531f598483b13ec501404c5efbf0f2c0b50eabdf7167f7ba6b749fe42f8007133047b0272f04345f347707ff9a0c69648bd12444d110cc7f223bf7c1c9f9bb54559af1efe414a52d813981262d7853a154b93931e186a8d2561ea30454deda1a60e77d9755811da85614aeeededf453939748a4e2e779e4b745d2fccc92247db8117244f8992198eeb0d369978a5fc7fe9ad23162143fcdffb7f789a65982a113927fe50ecd5da2a6598efa8bf0c2b2449fef0d76dc0cc1f7859ee70e44744f8adf7e2da25db8c9345d9d67eac5531ef2d4e368fa9e279ae3ea3c9f081cc3adcd07bd5404b5c90e75ba7c2d9621588a2658ea71759e421cd4e626c732143d53ecb6b93a4fd4f560398a221a6eee752047c117d5e5e61de768096e2f4cbdd5797ea02ba8871a153f931c4133fdeebb74759e4ddc0fc59004bb4e04bffd99df5e9d276f42a64f7e62277ee626355a7eabf3d42d70837b44cb3d9a9f57a2a0d78aa9979a9dfe742cbf10e568ea3c717cdead5bac769f672a75b3b2e9f78923ff469024416d7ae8ea3c57f575ad5829086e8ea668f71e297a69ba76a2b949f3cbd4fb46f4cb2e28dda3d6bad3e6ee4c1325c7d579feb8d0e7a9a176d5cff30790a8c1943fe7e2c8f72e79aaa2dbecd07f74a7a847a663e8be3babee0bc14fb74645939be3e7e1fcf02f4c471e9a1df8913b15bdb4234371ebd1ecccd443d1d13c4f23bfbfcefb48b44b4d33e51dc83b5e7210fdde2c4b917f1eb9d3bdcd30d4dd076e73dcbcecc2d57996e9eb3acffeba2fc4b6db437939fe8776df7da3377ae3f7f61b4f8bdd77a1a8cbb0143d34d4deea3cdb975553e1e84a7d7775cb5395609a7a62b8350f45f251b0fcbc01a4fefbc094935c6fb30c47b35c9de779bedf430e018ea0f67628ea74a79cdcfad796cbc714a2e363898a224882299a92ba0ce249f243d3706bb3fb90dc1e109c8fe52786a5679a5be41a5d11004c4b2f1db9f8e9b014410f5c9d7e30799876e8e69d9882ff7deac368fea35e67a6e87fe985e3ea3cf9fa6a7a9e3d2713af2c7909825e2a8a7a83e3f744a8ddf5e3427f6789f93b4db7198a238afefe943cea7522e999e487e1ebf30ca1cba864ee8e95919ae530a4903184488a66020000631300303824180d072422a92e89a9940f1480066ea666884a9789445194c330c818638c21c418028801c61021212a6e000a7456259e760f50e28c1884c62a73340d7c7f4e221f97f0df3852696f79fb679b507b421f3dbc0b3f381ff812aacabc002ba198b865b0aed08087723053a0f0c8b01733ed5b6fbfe06dc6bd0234a55c1d0f87442320a34aa49c322274d484a289f5fa09ea7dac09c3761caada5a1fcd73b821f36d66acd8119874cf28ab2b98422e11555373b4849d7ff7485682ad6dd282fcae071a033cbfd07b1dc094e10e15374f9176a4d74a501cb5c38b261357765070073e9f1c1a9acae9372e18cbd83e68ca69f79ee5874352b13929aef7f1e0c51342d96e280f9bdec52731e87c3d2416d30b011efa5c7e50535e72a66c01f5e514c803253199752145515a70650caf9ef282f5ef62cae5d01633682d7f22d211161ac1b7b682174e794e93d5154651b3a09b3a89305537105ad66f09b0ac9254a1c9352dbfcafdf7ac4ae1b595f5a849f39777966d6f3e24d6053146cd88b2e2ac71122a140eb87d0c2806e2bf154484d74273a36e9eb2fc97d0a5dc5a292c00788ee9edeadcce3020537bff4e7ca06457ac0737249e0747d78ec71d4987712a44ac2d85e7feb5330014e13d32201045483d594918b18c4e6105835675b604457111a31e5bf8f5017b697322ae999800a2ab032c03bbfbdb1887e31e3e2aca3941cc8c92e08499bcd1571b0f2d820a18cbe0b133373c5034238374c374145ca5375988e5d0c9cbb288d1c224410ab7b2a2033339d07702ff1bc1133af81bc12374f00e6e046f06d0e311b27e6cccfcc67fce3f0fcdfb81a225e0ca561bc055016e5c45a32abb76c9bd34c4827a4e24a115dad91e0397eb584fd1aa1e7bb252c5f48dc18a86a4b84cfc12c1534de0b929949b7b30c71fcd6b4595783a8283ea26798f64cfcf40483fe7aabc1ccc0e47a3916fda071101ee6ae2a815fb6b4578cd6008407f9f2a336b132f9eb103d8eef4474486971831528a1a3403e84d3ce7f4b4d36f38af43736cefe54121d0e6cf26d0202659ceab7e18d11838740143b311a83263a64fa218669760612567e7b57da1f21f378c31dbe26ff8718881d202170609ccb1641a52b6a967614526e744980f9a3b73077bb25d658b1dc5b5cab1b212cd6e20003124a6423140363687bea595e0dfe50f54168981a41fab32cdbee4ffb4c8694c098ad9fc9e0ce66953c1c466e4430fb040491dd993140591da207b917f152433d6cd04b7c28200f026fb6f1df30ec28db9640e3c9aa8f38527d1e884eedbd49d8d41713d7fc52a7c51b95764f83fc1b505bde3ffd353791e8c332a593d1176cc32a99e77ca7001e621028b124e452af2091c017470ba3c0eeca489cfb809134f88cf514290d516c82b62157d4a6d8a3481750e3e46aa11047b3beb7e4ffdbb70dedd1779cf8cbfafd4a542a73812ea503b4784ac1505622d4f7491734b6fda94af527950f277127f2d729146f0f3f29f68a901ec174c94eca4a794459bb51a8ad3d4952634db2fc14b861f77b2804ee474c04aa43fc4011fc268f72112b4ae3372dbe29803d25c91f974b0c98ca6a548f143c7374474e7940b0b6186b019986ef84f73cb844c95e4b8b65e6216c4bcb50eadc73e5e12c1000d4b6f1c666456026efa829103892cedb197c9867f0a9031916b1b6808c7555ae8fb64f49d29c5ed1659be52ae4cd4cb44c347a26a483b6fddc4606175591f4b0c05ebcb24cd63332f01b0ed6d0e8932cd1b8d2be97eac52607b1327b0b7445e451be3295049371627bc23096786dc970ea21fc5dd8ee9a2ab71f1052069f48a759276fba5564e9b7db4cc05613b219df783735d8255daedf68b5f53a69788e8ee6a85b5e38f25bb4ec640e30ac488158fe8441997bd92d681a539a69f4652ae1bdb4cc211251b9c86d7b8eba66421563aacb1bec3a05d8fcdc81e67662725773086d92a50cd17f7bb682cb99fdb63ba7346c4c8f76e0d89276be5f3e2d0b5f7de0b1e644d61594873ddb52a473e7ecf3db49947633d16ee8192297fadfbc225944ca2b1125b2eb164128a9568c62596f24c62e5622b318345464291c08acdf62c68a32f2a2f08f65dc319c2887ddf15b3061ab673ef861ac41f8d0c4dbc1ba7bd8ec5787de6ce5136bad62f84f1c1b5b0c294b2a9c8def5da86525538a40dbcd5831d9de9055e071a6db5f09f67be80ea1be4f7002df8bc30d73eb1a149226c0d39d02f42c4ec16713b8e402ac0491bc6ab4aee451fd64d7e6ca0cac6b5a594c47b527931cfc9afb24c40c87f0b7faa067f0039e3e103b88f29de32f4241625de777e41939876b6d8d175b709bd5b675e9830b41dc9cd22a99e7bf0741208c7f9dfad74dc40cf6ee218aa3f80a166a5808b48d169137382d410afa5da7dd3275b978404f4346217b61baa66bb684af4b5f1c8aa1e426d11d127239cc855f1750dc375d5f1cc13840d3515d818152471bb68bebcc7e6a8900e8a43ede230d6cf19c5f604ad85bce56eadb55cbf31f3584aacc74273b9d3b928ec67aff0088a62557aec21206b75a0491227ed97fd4a2b945e8e69a4801cf1d73ab71493ddce64b0f0abe9455af6def273a7b3d772fc7b148232d80913eae8e28d356f1a972b8b49ccd8f3c1d907db8fb781eb9146e8b09990d0b1564268050af6da49f64f7d082459843a82ed1761d34eabe84052d31e1b8e7751af2628e5948b9b3a3eb1c95fa4cf5dd5e4422f26b9d8db34906eb1598bc8f3cc6cb28964614248ae416590c93fe0ceb0286fff8eda97772cb8024873bce1b7ade9f8052b05e4ede0dbb8219f62c4eea99c08622ad4d85193c66df63d65f50f7bad2eb8f631d6e5a924eee8dab65d37ef712993ad683c414420aa826893f4697a414b3fc0835e597eb4327d612e5c2dcb37ba9f48af847b5d0f5ba972aa9ada4aecb96132f3fa38d03a017e27edaeea03492499164bfcf764faf859bf5bd899e7e24ec90e0c9be4a95508430e3db5d42a5060466514d6046e8a5954155142342db7c105c52ee4a551b7c2fac8d02adce43a29e560000de84be9da34f81a6aced81b7dce72e0ae16962996a3abe18aee9a81b96d13a7ea29c2b2a3f96888a12058c74128a60bc4549868e0adff8f754688f959beb657bcd85e3b324403e62c9fb01e484cf54b1a231301d62414111cea041f64a63cc6a851f4fd942172d3bb457ef5ad836ae4c0d76cfd04c7ebc3b1199ffa1b8b9afde1c015ca8952bfe1f6521687b7f150716e2832f6c6bafbc999f7c10d2491d344383c1c1c6cab5ae3fc91765e310bb7ca70cefcd7ba69dda038cd23c0d5fde5ead689e65acabb57e3255a296d181abd2b28d29431460892184cd526797bb6795930a29d44e560cde0bbb1f40f8bca70f908cdf94f3dedb0f1a0b9a1ff2ccf3ea0fb831643cf5797a9f88b8663d5c87b21fda06b90d8a514bbdd8bfc5481747bf18215c9f59506e44f15a04aa8eccfde49fc078a28c8d4f31737985995bdfc84d2e47f2346578226cc3daf35c08dc889c89f71e0c841e3779cb1c09766ed67072ff2150c2e3600dc3e79f23fcbb34a58ce1a87f8ef3c25c509d75a8848838294e27aac8ace1aa56990dbd1e63ad429792af5c52ad1229bd48afacf1deeda4b66c79a76a90ec69620b5fde8bfab7b19c4aac0172541027d02f951b14ae2ef696a59fbff4c54f7775d636b07614983b7ccb91bd68e29089391e09195428712ee22127790a93f4b7eed00aabb396eb38628783fe937b00fa110d9a24aee7a718e2e47a328979a2dd9aa5903dd87d31020c0b3e279b4cc51685ce202272bc77b84f59f89080030164f4d508c2015d54e6fca0491366d204b56fdbccdc407ee80abbf03957358fd0347c9ad2f1a80e5456efbe0a1f28f7c06072b445d0eca4b2145cb3b76e8453df9640ec0448593aafe3474ce5f38f0c8167d36024cd003aa2d86b840bb35a0a1a72d3a7ebfddd447859205259eb3d99cbdd6d7fe2e4958d44ace9398202c51884494f0fc04963aa31e034aba4a12476832ca6d86f496f81f422ab708848dd80b5db538812898cdfdc689d1c322bf479587d1a083f17bd429f3c2d288a83044d7703bd55e2813d89279c4b77d1363070f69df3574fa43258839de2880df0a1e48c16406a06bb4dbab0af1cff2c1902a38754e7c573d9a1c6adf64cb4ca7d5acf92ac5da9853552a262d63ffd9f37cd5e7b11946f9c4c078154f48a708e9bdb0e1394fa22d78c08b214742915c87bbe8bb1faf8d7a742638fa927347a3a7f2d7d937580e4c81465d9a808fcf32a3a1eba8fbeef93e216b94ef774062fab155b48923b1b7ac1b67a8dddb5a1ccbf6a1be5b950d3f2b9c1d800425342bb74fc8f251df4b1828690843cbda26f15b38fcbe633d40689aca37a2c183dfb837fde35f0fc51e03e5b2fa69ab2a838f079c3791ddb6cbc944901473e32d6efb18a6d4cd84b0da22f2655d8ac09564b3b645ca11b9e46bc7a9c2fd445aad8122dd37c62b4e45acfa40d44814dfb3076679e1f3122e4b1e862c27d620916f42fb346b35d5a918a97264e1af975bd229f3e49cfb69cc5838ca472c4e64e1a679263544f1b859b85b5d6792e453b49eff525b5a38f73e55b8ae502d1ce93bceff1cc15f0b176503a0a52ddcc582c1a9d6d3cf016d7d46cab7700b81263f34c2b0c3858b101c07dbd7154ce9ff672f0fe658c0e13cc4097e6530520930ef33baf775e1dc3877e17a4561b3f0c251b3cb8069166ee1abdfc269a729adc7c459004b812fdc1dd517cecfb43cd5789e38e0c2c54347ec42ff85bba7ca9069c1f986e25ce2be98540232c170da74305c44ee85bbcd9ae01ccc09c3755ff44a8061b8e93e9fb1a17d3daa230741dd05bf70eee2c4705d3a8d3165311c15941dd2c6186e8d05f529ffc22dcbb924977b770cb74674be8df3780cc870eb2da613b2c8706b5fc970fab43025f464b8287aea30dc1972dd382b20f86909ed0b484411962d9e9b65e68be0a8b0652af170fed8f6d9fcf7c5b37f87cc63c8062440d33ced1a31fbe3e185326f6721440b0ce50fd1531e77d972dec5df667fc0023102cdb03002453ac697dc7a471845c795c65a43b9f35fabac2720075b96d3ff64c48314afb9494e03307398157355a4fa76e3fabac6c8468074bee79ce97a4da915ac912d354104836944f6c91065b34acbce4ce4a2a8558d1e8a78e39dac8210ae9ebfda119b2ac8880771d089cc49af8ca2b0a7caf20ffbc501c8d044fbb1e6e990080718b17eee797efcb33ef197ca97d1053c63c6fe68b3049a425d5c516afa2d4a546176ef4f49cf128bc34a1a396c2e0645a13ac83771284eccaa6d8cf659fb067e81bcc808c59dc9e31854b837264909f81e84cd1eb128f23e6b22cd5d1443d1a1fcb980b791083b43a1e54e89909c8b33f9be78ada3fc7cd74861b6639f1b98147bb4e9dd108684503da6a7d639d5c21d8db145c08449946f95c1ac477281bd3c04b1820581ee864321453c26a6198c64352399f0ad542ad502e4f02a80c9e84ec834b8ab21cb9d497f7458f14a790870139219de8ec762fd402e7f2511c92a41326025e030be164304576490d19d303ab5954e05f6f210c0061403bc1d8f457ac19c9c6a3292558e64c29742415c0d9600aac026a33b21547a4b82ceb0f3dfa5809659b841dbe6ad36eb6cd4b131bc369f353dd5424f2de4c4e0cdecd075f8c3937b2990f82a09dcec5e3a36b72c3997b2128742ecc1e2a0efe6c3127aa91131d5c99cac7e5a267f592297aa028b42ea81cda7efe4c0927b52a0f15549dccc5efa4c6e594c933c9297911490bb472a1ccf8dbc19df8bbc0c629bac43e0a852cc9650370b39a99487ee92903640c49f47c3bddff0e08a58b45a0e9cbb0b37ed2800a566b08f063fb0b1760c68510bb5de034bacdc6c171de31c6d8e6027680b29b28309725502aaff71e744be7ab788f7d5cbbe921285812a86e956af908ead956abf36362a0ea6cef252af5ed0203a82bb3fdbd4e6f7ea1a7d08a0a1edcb7cdc1996f4d730e2f3a3b3b332f680a6dbda0507010054a0d04a9d1c764d45e451f761bba08459b321ee0551c7d87a41d99518fe6e74fed89be31b8a8662345bfaada95bdbe77181fa5e3c934fe0ca23d634f1a713452ff7c3e89476489848ed1bf5901f006fc230e2bb9b5a2c59534897c65bde813cbbb089d81c7083b00fe9241ccd622290d988f0cc10c28768e103af8a94b7d99c36cc373c3554c0120accc2a342178a9e4eb342bccaaf0a04e752159ea46459104f1db238d6e02cddb6e47ed1fab04109be3992ab8fbaab0e1aa123f99a682dc678d71d42e48011526cfa926b29e3b16e3b123b491bd97ed5fd13357acbe4bc1eb1dbb1fac7eaf9936ea3a890682a5923a06a54ee2e214a3b1a4a66454f52306c9744a371911207a37d015e86116349f5300b613386c41aff597596f4b132d602d7404f6815403c3d0d2d2aba2d038f7491d7071f3cbaeb56dfd19622ce7643cd7a2f50579a06ef37230c8a5f6502e2e4b3de87e00f733a50e60e187094adf12ec1fc20ff434a2d0f2f4b020e5f0ae491365f15720dd1603c1f55370fcc6c4a1a5242b01f8fdef6d3f2bbc581b83b73aedd14b9275bded9fa819563b7a6de14343dfdd94444a0283fd14223b436b29f65713ca0a7113af0a16b1889294c93c61a4caad55a7e68e4c4e9e2718365816d7ff164ab2786150581fa1519c27e0b5ef72a7c1247aeeda2e74a5e23178a71467760d61d5953bb6c33a3b087f17bc632404c95ea17e08adf7233d3bf808dfd0325a976e0938d72d3688a3fa1a4c3cfee1d6fa13a7ca440f5b2c8957949978f51ec6421dab0e0508e40861cf249616aed40469a333606c3e3a5d0ca533ec8aeff12a45e885e3fd4c7c61cc5c4c9bd1373678953ec1986b8a1406aeed4c7afc4caeb2d435ca6598242c6aba0418a7709b51675b704d0faac4ca7419f8b73d33b14418dc6999d9baca2775a2f4f3ae110b006d985a8e64a97d5852f603f286047bf7265f0101c193b0253124f661dc945a8773dd523a31029c9c9883bfeb5737bcf634cf2029758e2b178854ff72f476f0b661e1855e3c26eff7ae97b237ff21e97a3efd19cd19b90d2b57a6d2a4237232b2ff552e0f45ed15acaa3cc71c0ac173e4795576bfc98a1028d72255379c536a4454ad255038e1f93191dff34eff1c1b58e9839d787cae0d06c92e7f1fd8307da56c70fde92ac432f1a27c0ca200c1648dceacd99695e439ba8cec8bc656f37cbd5e52799faa5e2c351b2621f68570f9db7f2e89633aeec40cd463cfc1c40a414a958fab8403d986e489db5c26cde5706ac3ac10f88b8e58dbd83398381f4c812628693657e7fd08b4fe494c4dd8f18a7698dd8d9e581cdf97481817d8a1bc7a0cb7ee95d582e71a5703674718e963768e2bd8b87f0cad43588b9131dd43aaaca097e1a546613c3a09ea989e480c5657a7ac5d39ce163c24e2f69cea4a4454f5d5343a22ef735053345c8ea0556670b459afb4af4a583f8ae9c2181fe841e3e6bf6912a90e851cb3318cfa05ecf2335ab46428854d1536ab04a7bb7e4404e0d70eb0b1e0a29ca6a2a97212fe9eca06c16e8d43e17f4a4f5c785f60ff4d016eca5093ae1eee2ccda100c95d06367d892088dd6eaadfd68100b28969e7192b41e74475d9c8768b2ad70c802c060cf647f516d787bff5b80679c6dc90dd9072ad1b1feb321e3d2862f7c492d433383a4859e033a8a0f42f91579c170ac810760536febf6e9d1e04bb3fcd86dfedd0043d16af8d79db7c558df9f3674bd312357780b8e3d03546cf7e143d7fa7b9ced08fdb5e5f3bade2efd0913584c29f83300272e9379402d705cd6d638e16796247f35c77fc20d4462bc50ef6d6c88fe1199324d0b95487efbd3c2da46c0f88817c26be13c31f037e4d785e280577fc333e24266c98c4dfc7ba1494f62fc36a5dc4da2f5dfb765847559221697f5b22c01776b363e0def3272a785e81e36c00951acd2a681e3877c9f03a2e0e26ad902431f4201c52213efbddb3702b4e572a5a4d96adbde6ecf1b2f2d9fb3fdf2ce196d70c7e15b75ae6c50b37f38a3a30684b4449523480bdeb5485cbfdf789842a023907e60fa2efaea7bbb67e48757f106e1cf84d3136772f838595d0a79e6c416d3044dddbfb9a8c6be9856500aa94be6eca84f8ed2f3be1ceacc926ef9046fdc75ebf28ec7fa24612707e5131005ca4e53784f8c913ff5fdf8bfab49d82ca994bf339e8b65f0d08a40db5a29c25ce4dfa0cc22b4be22eadda0641e8fe81553e8999d659bfb05be47991e367f4fe700db07a53f113c2221b64a788c0c30b7d42ca2b666c0a86ed830672b841132463c1d146a162538733116f583abcc407b17f051d3074b9f0e6ce6b9015b88ebfd02ccc45a4b3758ebd9b8f61b001c9c6f37cd5e16b8a1a07d80e35f0d72d65f1070260a7a093cb82391752bc11a3905dacd6cb06cdefbadd9726bd703b47d19a83766c5b01cddd118dcf4626ea10dd8be1969e0bd9fb90a6b3624c32041ee352c0114556441e5f48852059e3a7bd4d640ed6fd853b82a3cc43366efbea4734e02bf1c97dfd97d803c93ef46560b0acead44dce908aafdda97eabbded6d6bfcfd80934015a8183caf4c64f14fafa86f489b1af90223cc0ea42be0360dbcbc6c4c9b9f3a6da494c72c45af7029b055db1f1ff2d21f684ef8592528fa39be59e896fbb1b769fa07b82ff59716843c0cd91a7839da25dcbe1b74d027a3b6cd0ac78884ee7cff291c6b0e3064851b4fe3b9ef4c990b0d54e27c9597824cad13ac6d04a58fed5481115a20f2a7a1fee28b609be16e047948b9d99a6ff9366a808ae07e20f62601e73a8eda45e3047932b62a7e61f6901da8e1b4fd1db861e66f0f2174b433163de44ec700117d920395dc4fad1c7e9f0783d51d3e58ad7f9e090e52958495fc0fe4f867414af3cf5024213f19dae9b1ebaeb21894c6512c1ee0821e7b7ad194087ef21b919ddd621825042c3ad3c3821e0775901062ab4a8626f92e508ea1319e1c90943838dc9a6be8bc74a21d3e51aa1770954e2f19ea0fdc22b614d055fdf82a66fe3d29d81b29bd564c9c5814c41916b35b0a8b40e9b48506f6ed75a4952738757dd578e95fdaf4b60ccf59063ac227a988a33fd607c59c8dbd2dc00e4a8f76514924d0593ad0ab0c733fc5458c4fef547bb693b5b75e32c5d750f8426fab2847f603a3cb8f3936a4201c983553dec95e787891564c833a53e30f99a89293ada6df56a652a854911e2387f37e38dbbc4607314dd227105df9f6da833c8fc5f732e5ed14dc194d1e5e9978017fef854016525fca75cbcdee39888211c723541a0e9c527f79bf835639e5b1ad8220b044fb48e80dcbcbd9ddcf0613331bb8d30b674ddfb941956507d2ac44cdae67806699f8a81c453b8855e9d794c978a783d6ea3284103e86c6f4812f080bee1ed537a5e346125b5f0bbd0f773d32541c9239caa2fed87456688888bbcc072437a974e8d2067c848bc03ff7be33d724cc80e1e43cfc45cd4ba94d60b8eec42188d4863d14d1a34988f10b0bfc814983abfb1651b7b013f6fa8391b0aec37df8021c6fe163c86e49c09a1ec51ec4ec244905fa5cc08d63dc6323e3d1f8c3035cdc0889cfb7d92c345e5d17d08aa2268a564bc863df57f379bbb0344a3e2dfd960803c3bcb34581824b38ffd7566b685af1d3eeb14f3a04cb2919c649292969285b3d4b1b74ff4f5246003088b54f97759aa7459f21d927e20ef04814e91ae3221a262e6252c96307cb4014088e6025d169c092637d3dfbbb43ddf69d94b083a32117d222060afbadf24d849654c0a03f3bb8a97ce8c8f1bac97d5420831c6fb5c19e8ae2d671845d52a4346d4bda77ed4114210ba733ea6844e0f73e9ca52e35d6dc9a92573674490a2643a6edcd9847fb80110b57f498f537503a96825bb849c8b4a6cc0212c85939519c9d8ad1919127e27f5f2b75c31a06c519ce3506b29754c3a6bb7e7c96df234a95ddbd7ccbeff0e25622bfee2b495ecda4088c2932d7f9dd5d903d865b1068319854ca0ff917fe94a1ef5a808ceac22787c84209c290c12aa7e48a8d50c825b2bd8d95665fa450d99fcd31fec7251fc0ba249d35dbc995416cff1a0805ef71f665d09c9673099c0f37af7c1bb045345597ad1cfe17a46e590a78cd7712d78b422906b76657e745559cef77cb8901d3f122a06f219212acd3461990229d250b501605ab4a0dafa70d6f81b52d53def4d689333b28f1ba5288838e82c2d708e18b85553c6d8500fe7dccd8cba502f36900b38d72620906abb921d1c8786bf5f3a708d0f30d94a54146437dceca71fdaedc943f7835f1dd377716865ca35341433bcfa9c28b46b8796bff89e81696d4cc5ff6956563aed283f531feeb5cd06cdd9f72a3bdf7f22f737200a0e39b0f941fbb348b20ca3226628c2bb1cc6a3335d8251c5f09aff48f4c97caeb69021ceab9214ba77014ba3ba955b07a9bb039f7bd6fc864e8c87418cf23e868140cfe7c4447cd205166b172b4dc0f500d83983d9678a674eb28b8e9fa6e827fb12eeb08d547f9a0c62ea28f8320b845bcf3109bd988cf13512bc5575e1d60fdb21bf0c0f9c0a839dc67b965300e27c94c7450c346f79f82155f271622fdae0a10983857eced68077708995bad7a84dc1113da2512098783279241c88016e5229df9a2379e2453e702d5e80a9068cbd62e1935c12926ca37ed0d8ab81e32a025876b911a3033ae7502c7806bdc0eaf479ab109478a720902b9add1e20f5f060a7f9fb46056e013fba725e2c3feaced3dbbdcf81e8f565283e2615d927a72b05691afc61706f567875867ac4b86dcb3749533ed34f8f43919ac55c00e44085009c4ecf51f63063c623fba6f8e11f8dc05f6393bc904c7204da2d2b785e2f3698f2b72a370f360bac488d379bc339d00130245e0a044ae70202bcece3b3a463c70fd049e57f04606a43f2854cdf7b4f97e2fc43b9dac02d97763cbd32b09f406c0fa5ccf6f349f6e57901ec3dba9e3729f05c8050eb49641088d79230bf5c2c74494597e48e7e4f6af04d560dccc04fa0f38574605ee05442d82aea3669fa6435d0668d61fe7e14aaddd700ba7edbad06a93646ab36de2a68d5e38b70945430c5261578b0e2007844215e320008d98c44575a6e288b222cc82a8d40c0dae3cf90d2cf70b3a912ce6548f1232a50f37c720dc3c12207453f05a03bdb3d8533b641c3ba7da5d4f548ec54525ec234ec4242308021115b63a10eb1b66894c3f1e2b206cc47216685b5950fb4ff6aa3f5dd623a6b34218920848394357fed53992d00ca111b606f7b1ada55658fec5bf168b35ba5899e230fbc819432344a8fab7154e27f36252c24b36eee9d80599ab03a5da8c2bb7606e9f5d823820b8e59014ba4e368d9964e66be66dcd488ff05dd7dbcb52b818e15ad4309e35dccbcf9c89d3d4ccac8860b47cfc0e797b44f00c10318759f770d11f46441a2f3e0d81b2d906e44540fa41df43574d5fda1e2db021ab42383c6163ff00124950eb61fc371defce087bc84f1d6e5301ce17a0f78d657e3e2a911c4004626ad85a2b18c7a090a52f4e54aec19bdc53e731048f3285084238c086850e5008ba81d15b70ac459aa67f15333a0cb4886c62cacf53484f13bae575b82de5bcff9e4140c305d2d7850e7cf2959d74977986ad9262efc91c9157f37634a6570f65d8ca59d8c99f2c918df50963ff9a5915ff175e7595a9ba26079a2ed67d2a2a6876856c56a3e3afbb596e9c774608eb7488634d150bb1746198b5ea71834d2b015bffe1ffe058014832a157be6b5e49809598abe0fd8cf23200fa341dd64b8667f0e54a25c086c9eca01d6c4d69e9d105089dc2620b2690085b5882021a3f8baafb51a5e5e3b49e1e3de7514e107f4d92d2bd13bdb481e83f4c1dc4433e9e2b6258c37f878d4d2ba4ec1ee5974768f2afe00ab59fb02f2eb71e248edfe3ccc4d922cb9e6385d0ce31b40145249c438a947ed56eee948a049e909666aff3a858d910fae37195a48a4df58d556527f84857160d3589963abb5fa613a49891e7a294714e737c3d502eb6e42184815425b4ee8e423a86672fc68d43f005dc864a01bbf4986383c70c083fa3300b6cf25fe2f78665af2a927520d8fd2519f3371d04d771fa3ce15b2a8c55faedee518959659f5d7a108d1ae6f2c2667beeb20ae87491319e29ba7f15fd3726f827707a341db49bf2383998e2858a736ac33b04bbc26372d9102fd3f700876ff6600dae17d175d588dc20248fcf96b58309b810a2f99ca21db3129e99a2d66e1ccdc5c8c066c84cd0596e043487da08bd49a09ee81d42a394d2e10d5b50b8602c5653ca7c95573f88f779bd6f414ead30bccb43222f77eaf2b99230db11e2d37d5372f2d8b1a863e998386938dcbe4320b084bf0a2f56d514c34474aded0b02dda5bdd9e2ac2466eb0c6854c5f3ef5035f98a414f97f00df0cfbc6f13780511091a6470130125203f2efeccdd7fee98a3bea25dcee6daf78c765572583d668238688a27134088b38fc1c25ee623d1e239ca5821bd89a1f6b73a3025cc2cdb20e85aeac24db6cd3358a251e5220c945920fafe483c27b093772f0d6f6094485b8b60119ea220016a4a9e860224ce077dabe4b8b3ac34092182c2fa25ef34c4bce8dbe30fc22175f51aab1bc27838c60438270d342e516fb802a5c1dbc4a9f6f6fb918b1b13e62fcea7d0e4fd4bf42caf2109ddc52677714680fd2b47ad75038a41011bfeddf4e181d5150d4eda62dc630f212aa6f83db2264e2741fd8f6063c0284243ce2a949adfc30bc5db2e3750e0be119008305b1b0f5d29d8d6fb4a16cbca6b4e7aa7c6f4d6e538664c4fe67b91f5c464f891991f011259ce531fa3c2d1d6bde36f6ea3192f2ce8d0246542137701f8df2146b4d3a0521b91761087ad881105c035a3b8b9e5987d306dfcd443e3e5a37379f01303cac5b90d14fae3aa0aa97991e426aaa6c4006bb99d80b1a361ab29e4ee830271cda90b12e61267b2e6b839c25e7bc191060369b1c769b2387b9a36eb622207565dd22999871990eca4c003012c1064d39a8f1fea1cb8823e1a43911a95805448cae1018cda9e9b0c8e4ea458d4ec01f7534810749a3876777029a042a92ef93e0cd3f87e3552af28189d6a5cd863140628a92ec4f944980a79404ce494ff0760007e4c0d07181726fb9abf69b27f8d7789b24d93ee7c4a9303dd0f631a8bd1bdc7f6bd8e2e7d6264883e4608d10cc8b005d80c49b6afad5038281cc9b4e94610f7dd45885477cf24477a09fc5cea589a54c920d3b4166229e9c103223931bebd3c6f780f9be846649b77eef61c3ec16b0e177dc51dd6ceaa1a05596e67000db017c5616fe1b7c0af743bd67de73e8b28ee46c12aecb8702c2862c649f5a160fd67d4858cc9fbbfdea801fa04570d9ae954b52958d83a3fe7c307496980fec18b2cc998abc25bd492c4fe5cec695eb703f8fdabda56107f976343a9d7de42b9cc55edf7cc9ff8dccfd54b1cf44c28be72bbaab2565b1c6b48cbbf3cd31f6c7864d75d261b26fd1647cd55fc1eddb646c8ff32c8bc71a08029d0ee4bcad056a1bcbf9e3cc7d512435c97627aae71615499f02fd8e94b286f4631e0dcbdb608cb04b9b8a07806c1fb530da719e32ee315ab341b1162678e82869276f6bc44b75e91bfd69747f6631760029b3354b21b7870a5048bee1ea09fc934e41510ccb70babc7385c86cc510fc328cb404adaa18722aa402d2c004fbc2ed7d9892a50ad03b063a946cbd70a0b719ccb0b11b550f9f1b7fe67b04cc7ceb8bf92d9c1de9f777021b5877438661e92649b36ffbf1c589f5f06c79833f635979fbba7d9cc818f000f75633f4c371414fb5b01a61e4cb62b20e5bad44ce50581d3a84d866ef79ae1d803ac91b11e3d8339af6bf7266a2df0e94ab0c86dbb3b5eef36d8b9e4032b64858542ad0a541f429bcf626b1b9dfdcfaa39c71fa8527732978b2e907c0501f5db8d4cc8a53a629a2b357b064f5c34cd9f12631ea4598ca9b622622909b22b1390c52b1d9ff36a98c9299957fc4a66fe9616d2d8c77e1d7377d3b4775289a8768f296f31cffec12fa134776656f5217beca173d4463a4c9c3547b6f39fdac180cf5bce63f4a86d5f2801ddaee1fdef41e4d7fb91ee18ee342e56ad2d568c4bf50989e30bf82996d7cea49082a0bbe52361cef5b4ffe47184b114dc641af53199e077b4e123dce1b6c6abe5385882a5ed1735e7b2ddd958f822684dd13310a80ee318bfcdf9ffdcbf93ccd0f393e39ccaeda4f82893df4ebbceb74ebaf9c193eebc977bd61307688e91b1fe33ceb4380e7f5b75897ff32273622071356f7528f08de8dfb0c7925b4e15d840a66e1740cf9c243f16fc05acb603169da29bfca74c647ee94fbaa958864fab5b62a38d7e2d514f8f78316233aaa5d706a61660a44a25315fd56a79fa6953cd8619930da3b85fed97b9e3b888103eb0305e6521f1185c00a0f4d7d36cfce4844d5b28c4bcc5d64689f5ac92e9169645c46f72cd385afa1dbe39ea7c84236c4a6babe4e3ab40cd3a3e95d4ec6104b697d245cf784e48e945260509d2c0c13e0541cbaf07b60bee03c034c516a95562ac3c70d375da6ab2be00b860332c8578f41e741f2ecf0f00e3e871e2fb23b6c0048129db060da34aea4e8d908b5a9002344f75dccd5c993c7b5383dafb3d3dd09bc69211d60afab2b5185c9cb7d351c685e15acbec5f311d8f07d9b261829e76d7693f17515df5ea5e78bc97a905e656269a17ce9f06645b53d393f302bc58cf36f40c5c3e6eed52e33fbd0798768d74c973016019ad784d89ec1e8dcc6c6c7bb3848bf298c27d310a6b145c5e46107e12384645f56524bd5c57b02d422e2c009c43d87a820714e781c013abbd9b7129b86a8807643a6adebbf4063729ac1af1694e4efdc6fdd110b39eb302f1c7bfdf3c4322184a409a3bc1f36e098c49636b1d262edbd17432523f87330f7c348f40160a8ce9edf3a93ea40381d38eb5b24383986893898fa5840034c1c75a75c846edf4293a88047758694fb3eeeb2c89307ba21557a63bf0e20d76a346356b743d7d81b46ca9765f4c5acab42c0c579b3f56bbacc7fbea17b53bfa8d41ef8ebb86eb8525cc5e8a7470f216ebf5634455b64f70cdc35226af483fe8cdc7b236fcd1ded6b110df5bb987b73b25c6faabbdab28ccd8feb9147573b79c1c96f4cded6b8f6a4f52a55da42f28d97cd687b7d17ce2eadbc60abd6d8422a5727a3777bb32bbab04ea201c15f35bde37919d16874a7e9f468ba2f963e16ac880c4edf6b836d88123e007b6348f573a64877f73a797102bd5f161ad7044eb697173d24c5832dbe0932cc881c26288be30a40372ebbfa3540e1c0d45f92e066d54aa038bad356e78b612e883cb3e741c023d94d3efba8738c01267fc09451eadf042afca0e1f3abf4f8f7c65a7de7dd255cba533cca10948f4deaea271c884ecf92ba3ec6a6fd7831510bce4686cb7fbebd1842b1c9d14998d1764298f6760e4b9f5f84d7970ae88cb02dce184187d44ea350c50504447d53f0e9cc4fa6dd89a9aeb2a5a03dbdc04947664e8fdd9671c59f1f0e64f5eedef960d414790435fe5738316fe0ca391aee7bf0ebde1a435bb659483402967405fcc21f4b5748ff85023dced970d41d16a7a288359c89170b15e32641cb1971b7230dc53f0f6d926733c2344ec701218d026909274a2062a842db1b3bc04c94184e4d0343daadd803a638d65188b20a644a33b831f7c6d8109b0825540b3ef966cd5aa91debaa04c54039d235b84ee125dacc03097c795c58337b0c142571cce30b81f81e0fe413e9c714a197677ad2f1d891f37748b1de7d90fe5e668e9322dde345e65cefae23206ecf12e04f93045f4df5db60b60727c6f1144701a16ce1b2fc2c33b49051571b69408eb04a37a50243da6d6485dae805c01962cdf3e0eeb0661254d2619a7fd24a9108793e234cf0e0111d7300303e66b5e9eb3b5a2baeabf7be7dc91fe1eb7f64cc2aaaae5b8368b7dac0ca3fa3c1114772c2b2fc5d537fb9eb4ef293930f05aa02778a02e839d068a7b68cf077e42692fcb4b22a200cd7e3aebeaf8313dc383a239fba1fb86c128af7bdafcd179ac3a332910647baf8769c8877591285c4ea9eb64a95283c47a8484c38ed01dce64be216918b13c0dff35f1f4a82a6771c11778dc7036b35aebe1156982da754419e8decea82d1451c2494438239cfbc829f269e986458b19af54875ae7d86a20ffcce00e14346b9b123b054bfce05ed4a9fe4402fe4ba18c637259c7c03d98fa628d405daa1797b6e51e6165615b6e8fe4c8efca8c12507481c5481cb2553400d40e29c2c0dea1c70190f0ede7d31783ec0b336b8b935a1badf4c48ffc29db53638170a399bb81d22444ec5cca2c683c072aa5326a778264365481c7957c07ab989c02f95688fa970829f888b1795cb26b33da11cce923532e9e9a444961521a1693d5c3faac779bcf365546d6c40ed7a02ed768bd0210cb9761966e3062651ac6fc9dbf3db3d3e85aff87fcd26c9f99af62b8aaf52d435083c67cfdf81c3343e73f77c8a00ac271ef3d986ebe0de536a7bd2b9ecb1ab5455c9442e7090548a9c927685e98efab43054f9fc600cdee855c6fe80b8fd5282bb5229df08d1c6c1c83342f4d06d3c538d143b5e1f67d764aa4b0a00ed114079f35a8957febaa471797084610b04c28ec175774bddba71bf06d775ef79d11c5cfb5ec8e72d0fae26ca2ad3de1e5cc770f0d07d70d1fa5d70a31c19abdfe65dec205c9a9327d690704ae052d1cd0134ebce3b2d1e45b896e7eafc45b8d6fc8ee76e21e8c60ddfa3b224d4022338f9f45ae2f5c5309a51b874f9f7742feed7295c94fa69318b8d6392854b4f230f9cc4c2454773578a5e4be030fb98a22f31e6819c2bdd36bdc0bfaf9d28c86eb4f982e5734cac4fdb6d01affa1f411f9a068590eafe706131994c918b08cb6195e46e8188138f0c75de365049c1b2821aa7f05b2f734a74b79ad3d771af98df1f3e07f88f40d782fdccb2797f88ba056e7477d1b1d150bc5829aa8270b4d752ffa7b12456212b95918fa79efdc36c62be012b06694bb4b18dc280a4cb85c6c56a1e1827dbec4a2c0c3a7a05847d87c38f88caf74b94ea6e9a58b19ce56fa3b0f27502038ad5f3d279172fc001f852e35336637a1c3aac4217bb4e821bf16282a8a556db485ef028e558d010d028ea441688181b1abbac4dbb31603d36b9f105cb3638c9b99860c21b85417735e863261c185dd3336207c2b6d6ee12ba46a55b3204f8fa8a1b94932cc68507936d1dd231c820969d38e01dfce4ac6da4000b27822565ddca6d0f058a2f88e9e8a91dc2c406fe7721a5414e80f37cbdfdda29a95fb67400bab5e30e288f4cf16b51866ec068b8ef9bbe42d429cb26e897ff0d8f5f146ee11572602cdcd2536bf79a51e80bf2981e4167e4454d1ea7466e982f1aa7fd736ff9ecfeb11bc4bd3edc27136cc82d0c5edc54bde084e81e66094530922567480335e23f240d26b6020d9898cca3153845b4b87ad46a67ee77aca7586f2dabe2ab8bde03a830af8a9e2fe2b227ced96368649c4b7180ae74d3d7672b51fb907472158636805937a9fd599fe1416384d8a508019906ddc57c2f2f6e8878b1ccd54c004418f0556e6255019bc1f524801757ca8acb81f7be50ef724cc9f3f46247d2145e635d87f39d504f64fd1f4d0472eb86a4781d1330127dd0e1698c48a004aff7acb434637df43e8a1e868b87690f2b9b80efef726bf50655309b104549eb298543049cd4f0f5e6404358b9e6db709128fc59c2259c5cdfecf991ef049858bb62b481b178b866590a000b43d898ec826fac1e61b15e5a97ee0003ab4e3a49ee00b12e152b710101c464003e78b4401cd1a08f9b0db7f715aef4d3a73decc75447987c1e8681262686a7a762a752187aa9cf3bdf5899dd566f1a72c69c1edd5751849d839e0d025bb16ee03ae91b65ac59f7bc23cc7c315db74680dc3b826e2938f6cc27d522fc76a1f66ff8097b36de8d17c3c4f1bba05dd417286456d181f5e32cc16ad3942cef17b1a180f5a5a46eef261d0000b59036ab7f3d7d5a34ab490513780d919b6ecf8d6cbbd6ad431a3b939b00f016288c371e2b64d7e8a150983d04661da3d2c23eaddf5d0f4b9d91d07ca603bb9fc24a6c8ff1392566074586d7f7b3e512e147f0ab03da1a023d1104c4f4b7139b5b13991f4c884efe7c37f11af6772c4ba076f237725aec463644e5423dd98e07c6fd5ffc175238c7912f1472a0731391694550c8a1faa0a5f7ab6f45b1ffc7a35a0192061c5e9a4a3b8ce5147918dfeb7c8c9e23ee372f7a5b38678e165eccd52c33d47427115244a6c45e263e33a01f18fd2b45da0483a2879cff0363f57a3b5215ac57d0b9fc5d584e7b6f5dfeb9c5561dd02af77ca0c178a28a235228b2c0fc90544c11d86696f6315b994d168d8e1d20c1d13a33d1137fcd389a09e14f493706fe8d39bea6e204fcfb12239be7af28a5e71c53b24ff4b87a444f69b629afb730b22ea1338ffe60f8a5dbedf28aa0845c68ecb45d83d92526bb13cfef72125ca8be92f4e637a829f23bb5416902b509c78bf53fd0cdc40c6001875d3c418a212563f0223c317eb968a31623ffded94cdac6606de83e2eaff7d0b78bdf0cdf4cd468a28f5126759ed45d9e0c1e16d50bfe60058a9f59601603e5ca1dfe7872d8cfd7791d6318a0a6d49ee3a96d022a15778e0ce23b29849f7ddc1574db475d83269965c303043ec124e9619c834bef3e0dd685bfd0dc1a99d6bc3796851616497ec8dc847578119ef60607967d4a645ddb0bcc48440b939273feab5198ab8351e654c39a601d60d1811c0d130dbc8049b1836d731bef59a310232feadf575430fe9aa99f48ba86244d9f26ff393163ffb7282c042f34ec6d1760011bb6bf894625f3bd9b4a65f9825ac0074c0df10e927b7321f8de9eb00f27c1cfe38e12acaa0fbc28b261fee1bff1d3f4e85e227f55281f13ed764e8ec509711f346ddf5d75deea7b7a0c9dcc4c82fae364ea12bbd4af072056d60b33fc45c65e9df8c360f6723cfe9193a15e98d4213dc9f53f855bf30ae3a366385ef1778cb4cb08b1e9be8a2ad0360e1b5acb13c0db70f38632cd7ad086ce2fa8d14ffe4e18adcff490c186e650d7fdada4dcaf7f2224bc62d1bb077cf478a7f5ceb84a04882067c81f86d43b7333c801cd94ca5b606f49f1453ba8e6df8ae9bf31d536ea8a2c63e5e3f6724cfb890e88b42960fb80a6dab06d8f41a03851c712bfcece0c5fbd0cf0c2da9f3750ab45fe3766af935410899d50ff41e23f658c76fddfb6fe469eb9caac7d01c781e759c88e96159904448f0ca9a1f872d1fb7b552c2c4c4bdcd3bb6a72845d9da386c3b03a2a5af69ccb24eeff1e3a324726754c24c9877e9592bfe7641bacef9f760213a4bf58a6d532fd09abd18afe9d612256125bbc4b59d1859bff7ff7e386287d93bf039ede70bda5be3a65fb1c19a8f6056ab20025f36e67c398307464dd5e5688a7a3c98a115ab390c61dff50467b098cb670e49b31f57976f60c9cd96440f08c347440c5ed973f119152ec65689c17e130ea63ce8abb7891b749301bf011f24f0584e4f570051fac97675ec8629ea777e70fe8687a14f0eb2a6e1497a4c97acb4e8c7f0571230a73bba7ffc9da728d81fd8b728db3418c6cf9d936fe0e771bfb13fe004bf7ab21654a6dc6e791f3f36c5254e0575d74920c1be198548fa6efeafe04fd0ed16daa0ff85732123dc980345fa887e7ec4ab8bee84ad7a19c5920abd6063a9e5fc33bee04de00aaaf27ccf0506898c3ae2fd775784a264fa24892d476323211ec25cda53353bb6029d6386c0403e3dc7962b7d6f9cd79239a24172883898040d6b540735bc01d596d7f3dc9a8dbd15b78e0dccfa4ac73bd6c87abec92f8cc2c907ed972c97928b6d3e4aa68b7ab11b4b0e24669fd638207f7125ad7f91a8d23c60306e1eb27509ac597e37631a1d217543600c6fda717dfb000a0c61e55075a46544f730dc78490d047d352008c38ecff20ce271efe4cb8ba4ad367b14e51e54ca8843429dd80f270a55e75a72ecd486c954e2eb4a255cd0e4537f33cae1313c2d94b872e5b9b4b7894065fcb0f34b8aef043a3ffc0943c70ec355736779fe7d3a21b7ff1874e3c2ddd1fb254a2a3294fa25fd852f803a17eb4f668421efcf1a8f5f1ebd31ca095f803eff87494d1153c1ae67321fd1d4d1f5f86d80df571a1ddb8b467413bb9ac97f6cca1aacdb4e7d825af86fd659df2fad4189481cae22bb1a1b17a2cbe04343e3f2116436dd4ad4f93f60723fa683c87c76767f4d412bb476a968cf3d66b55753e54887d104406558fbb5052f5fa425166865940a3f41b1291448e34b45c6cab04f7d0a551e7602cb967d55cbd1e9c41ab62ab479c91f6d23d31862d72acdbb3d555a5d89208c99c134498f8ec1d53be1b2ecb817a3dd6178ca7468d500a155e531624e39bd60271cea82eff585aadb9f9209381d74a888f62f0937a3e0504ec4c8c31a239959c20a25f4a0830809592cc00f9d3740897387004e85dca038b5c0cb740e321007b318d7adfc2b409ce2d6fa5d6012f20ab225413ae604e588ffb317442a95eda1e81588fa6f7b85a69b4e66564583b8b80dacf347f5fac4763801fbd33a5f002008cbf59e30f0ab79fe5097ad5019fdb43ea91f5f657c458f18b3f08e0bb5b43e53090dc70775829d9aa390819ce3e2e06a1342eb95e99dfc1664f0b640a29ebe7c18815de8f54230a42575ac10c842dc38f425656fef5ab304a75273ec8555f04bc353d1f55d05dd9741f644e28543875cb70dc53272e2345461abe29b03bccca9b3226b185a64b4ab08424cc2fe1e587b0a42f249c2859ae5881690683190bccf4dbd607e4ed53a7020214bb5a3e88f80153cec87009541b1388bab28425bb925cd43507a9241c435609088c31683d68394da8eea1bac2425d1cd72b579bbef0d40615704323a5272486d93360e13498538b5cd52944d2d796156e86b15236d436d94b6dbdf5029988511f57e968d424d2758d0eacc931022a7495e1d7e41b5be79097bcdaf8381ad09d4ee27a81ee158ba89c33bdd9ce122a02dd500ad73b2ff76b46314a50ae59f2a25b0d510cc4a6fbf12ce83d354471df9c30c6e331b92a6f8fa1d84d5241353c71a09772f84ee5aeb7f743057259d064a0687f389e6f90b8595ceadd595b76145149230aa6c2bdf5d62096771c4da13e30a174cfb09401ce830c05132a182d0ef17e1d4ebef05ca2a4974ce01f54ba262370544cbd3fe984ce51a23aa03f0d7a7e760231d47b0c6b80383d6ec19b90fbdb1be528b829718131ba9740b97fc5c705ebcdbddd0303dc9f0614c941a824ea0b40da8bfb0997007e41fa9fce4e6aad813f288a5c57a2f49a7f84e510bf250022761fe8c0b46ebe5a85e1e134315810877de8622c596d7e9c784e44772343b10132565d2a5da23539a040ce1bb17646ac7cbadd93ade2d5318646202cf1583bd700075c193d07cccc81077c365bc2968c83688538b42802582b840903155de0cd94bb06aa4fc6ec663f5131ff5192fbf087ac6a1a846b5e28bb93f34c244eed13f4d0d7e209c3e98b161f545b96a692db6ec45525071bb8ece64a1acd0d88b9388153736df723146338a07d43888e028b892d06840b26b160e5716677b88f819f30b904e6a41500eb8b80856bef930394b1dd528cf41020d0815a3e69df1ab57d47616336942533086a2d4916c9eb45cf253f6c85c41a631d776ef3c82097698cedcd7f3b3d40e33ea931b60df08749dbd2ac75c38efec465d5a418235ad3910bc214826e2a2b02b2180dc5f08098204ec1c86c498e2c86cccb244dd3aa34a0b1a11ff011a80ac89dce7de292d09636af0be65de2a8b28af2d8fc1bfa69e042265b478be69905a233aa0f03e0dc8d366720381719a71ec2dfefedbfc1aa9ce40ea5284abe0fed3fe397a642baf5801c43814d8b9c7715aa4bd51a4b235f89a3dd50e646eff8445d4b3c8858d1b984cdb6edaa9bdbdfbd9af4168e2cf6c3c46e41cd39e63a452f2426cc82ec8c78983b1f8967ba4088f19d47c53adf8b519f34d2a8e1b419d549e6a7a4fa723eacc502a20d332efdbf5b98b05f88c224d55df2321b33da5368272050c5207937f608fcb3786c48508669f9a2ac9c3c8d76e6b667e8abb1bed2188b72f812e664c69cbb8dc5403a6707b5d996f4bf7b3927566fc82f8743385487b0a3d7a35d30f209fb27752194a575f3f8c8ed0191ba3868d91dd93ad5d831235a201049fb4f42ada22b7bbaa0165a4da25a4b4693dee8aea21810107243e92ea8731dc32323a8fbf4361a9b6daf1d0b51cb72e84e054fdf15d23803e66cd04b190bcdf48be1b6084a8f26765efa05fe641ecb79a603c66d69891f142e7b3446de1f097e12a5cdfc94a0a55b906c7f256348eaff791945978b52bd439d144c2ff2f6b8b133b6e58c2e00c006813c9c9baa5cec88c72f21a48640ca8695505461c6b48b39a47b312652201f6bc4e04109605812d092b7d29555654721012d42960d32fc98ab2319d8da336dd1c553cb37e850107028eb0c92e29eb104289c578631aa1e64083b32bca6930984750d2e29ca2b3ab618c09b3c54ed6786e21fb17475b1dcd634a28cdc7132e5435f340b22301362f1900cfefe102026a50979ac4e3ae6c2f9047d6eadecc2b5b2038cd90d3e031b7d8c81d8b7314beb68c2f4869a5c206a614502b8fa4cd2a25fe849b91e3a2b899152840392c9ee5084a18d0510b7271c7b04a59425782b73e99ec0988ff92e2a42ea90f54547d3567186d6e6e2097732f2460c3a520fbc21aabd95bd0dec753d94f6f2c97b84f2dbfb0100a3990f407970fe4be71f4de4c9db7dcae825e32572a9d2ca1d8e3fa342918aea7151dc6e3396ed1abada6e152c6e54511536816ccdae147c406f42b7251b33cf3c7f00b9df67152beaa5a4e2226062608b14e8bbb932b54eb6546145d65ae6bb1d9ecc7dedd3123d7cb5cbe8a0481582b012574c74cdf8c2895e75cfb74c163abec1199a3342f1547f27c09380f2bc7b2cdf49ffcb72d374f718543b4163ed09f5f4254731c08289037afc99c0149d2167ef1c10c1952a58ab60ac6f71c9c25919e89f5a5a4507a25e5e0f94fda870c9bed58aedbabbf1a4b1105004945b2cc1092082586003bdee7c59ab723a9cbc37126c83a24352d89330fd4b7e6594713faa88c729d7940d5b179f159e41735881919f0b618233fec5847ce09fd1182c550f983c3903c11288ae2f9f48f1cda33a64e47b92c9e52d35ca68904bd1c8b9bc2d790d0449129737c3567ec9471d9faa0a1e1a445e98e52374906ee7ce6378b60097f5bf3fd22c4c1e4bec2b3b490feec60dcfebeb9e6403c55230513b2a758723cef1ca69dbe40d906b8875122044961c22816a5f1b16799a92aa234ebab7bd73d69f650cae72ec163355cc9f7c833db9e31e6b3f20baca91e6fb457ba91262381d1b7432f5f786503b9550b38d712815c033c044d14516da02ef7df10e76f98cc67f7929cf719398207378544c35331284c162c72da53d19a86989cbc8a00487ffd5eb6f5ed18d1096c8192951e022fbb3ea270fb8089440bcdd3239f4056bef6ea320ca50ca831445b399f93529f9f828a39b32a4f9c8465b12ba5b2a2fb60204ad1516c760f867229902b7f025748f8562c8e7f644d4bf05cf72b7701dea3055c02d2cd9dac259001741b64001efc7e4500bf15e37a0b9035850181aae12567c871cc72b00cd7a9db28af12cf64d819d337756ab8b72dcdb60518a8b01c278ce2885c6b2af83ac480ee4c0d437cb7b7f0a3cbbae2de801682f0184a239f528ea43020ad2110fcb3b338c73d255e6ec296456e499463081b171003e8b3970690fe5dfcbb407243dd030bf05d14394aa2c3107646906309a33e954e3c78eb8e419b1d9c8df16c9d68c3c8ce58962b684ae8521a65c83e41a4d580fd67cc1aa2bba6280ed6f3e1c8d77800a8b28cf3c9366811fb2b4891081181caeeb831f2197ed5f8f1174b64e5f3cb33535b93d82b0510e0e259bde63599d1d5bff08061b108b3b26f8771ba43517f8527da4ebf92dd3748e82fdb4955721c0c8b548917a4b7300b9c5b30a2712c59a5f7f3f8b963d974ebdb74da2d58205a9c5210f047e15519806702846af0015a4025b8d2e2a5c97d9574150902444feafcb7c4c9074e168ddf45a1e079e2798b65822bc92393fca1203c4cf3e76de50ba968fe2a7d4e10fae6be13193b42aec5e06124817df6d7514df806d7d3ca15f2801692453ea239b6f4d08a90f8a94d0db5e51df486064b75e8d1e9607a1e1a402fb893c4caf0ea73a207910e136ee424a80eceea03a6c3a32d92acf22c25be38c30762a1ead3a50ffaf592e56df5047c3c3439892e25959f83083e8db9b49309ae84733143881f959ac4d9ca1a3849926fc650cab53375ea83b350a9a3187bbd18d44de19cd5c590bb038216b47e4b92ea36fc78ef40c85583376673ecd2f61a4c239ea1a761b0ab05b8b140ab1fb2a05ae682f711538278355aa0bd0c00390a2f5ae71216094a0987e739c62e5ee78f181463d78e996db601fedfb3c2b2561226097d9fcdc720db5bfbdcaec1f331475b1df892a154285c16b66761caa7674f54ceed84e8f2e4074eb6922d97ecb99a72f64425598bb2bddedfd080fe8da279de6966a1e2b2182c0412aefd4201bcc5e24784d5f9621ec6b66707905dc2996558f9d902030a29ad5bef9f37cd7f9e4b13e5832bad6c7f9b9f3a2af20e3f3f8ebdb6bdbfc047cc4fdb589422b26f77c3fc081a6cac45e67ecacae0795d33d8d0443c05860a56c072013d7023f28571766ab230d6f4867f91d022b81a8124837ea9626e27262d1c16ae04a5d18f63d5a42e0b0cdb6c66f23afad92965fb5316a482eee43b77a478cace3bcdd1b2b9f1349707e2c2b00da55faef954803c65246af366843e56e391f6dff80ac21348a2e15cd2644466296801449e10a7a8b50537983d442558b2581fd60b2a4b68d0b5d890ca53e82a68991b958e980ece11d8bec8da13b606a3f984bd8222ab4593646d49949335bdcd4722290ff6f654db6a9867e6b8b9546416fa8df2cb91f8435264ddc401b97f767eeeae3ce7a033d926684e097cb7008c0d4594c0bc968f577e450b8dac6ff85f72752bf02caf5cf8c21d7607f8f9211f519803adf157ba321be1e2f68d75db826b1b84ac904a8de292328358b524de55346354e18f578abe847116ec2be00c942dd629210c1a1a5f2434f5356d1bfc5da1e6983d2a037916252364ddbc24f7d18491468d00ff53c52eb202f481574747f800a41603733d203bbb00c3796f9b00d37337e5e23e3b1b3202a7cca002019dc450ce5b024876e06b7e55125b6c6ddad20b98565e0f5bd9dfa1b0437c99f29414c666c1d0f5f9216a9dd7664eb22276d0317663d4f0468e987371d0bcf5bd9d50401daf5145c2211f466a70d59c735457075b36f6d27334891f4f4f1928e7845db0b0d08a71d0ad980a90e6c17c42d987ed9955b13fa7b6873b7164c28d4bb803d406aeb95e53a2958296c4947d32ad8b143ed6d8ba0f0ae9a7a5f1a82e2a112a5ba9c84624b66df000fa58524029bc012dcf4d923485e53cf36890e4d2553b55a91a7bd4268196fab42a62e1111219030353c54385a38e5838e0fb56f7b4f926534e977041995f67f79e7c853a13d5c30584d222a0f1f8769006a390eeb906dcad4868ea652bbb1929c4e158d3c485fb91e52e05d1d8d52a633f267a33679459ba7fe32aa531c2a8ca5097b507e4367df3adffb782fc3b8608a9c243d11a44eb240f77b9ae6b6680a81b7d1b6471f1bffa281e2aa89d8954976922d56c66350d2966b790f4da6bf9983854bfecbaba7906b50bee347c8e7133c46b5ccc0e2400ba698839c69a3d3b07cabc8c564615e65bf46cc9221c4f2ca5cd622fa63e0b2f78b8b352d20e120a7baf785630635206d7a64886104e3324b60428c8fb16962a04bb27d7519aeb0df4fb026225b763e7b944be7004f1156e66520c57bf6556fa36bd27ec267f7fbe9d7c46e38359f8ceb9329ab2a008a8e6207a899a0d5900ed5e1a1308ec9e195034a122d0894cdbe03e2d7716f39ec3af021378241700ce35addcb0b8c5346fa497eb274b97fb50c7658a213dffa13e1eedad496b3903172b6e5434be4fcb6ff7bc897fd23565237acab24c8f3051815fb88b0488a9f2bd1ed63c009171462284d3bca6b6503b1a5ff187fc87535fa27ada20d0b04ff0edcf67a705a0d2df83a9689901dcbdca23b2b69c42b765e64d5714383bcf473a75f0fe7630b003eb1a1b0c0a90d1b183cc048a1306c0b9f8e1702af8c69be43fbb859e40866874ab9f04ee040cbe963ce05c370df01df1b54c801c9340fd3b1db1a643743509b610193134c53cae4bfecb4ac7dc0574652532a015727f318ed3bc4c00b65db32dbb3f768a3bb45c29746031d66feeea4a0d2dc33ebc67ddbb7886c421407e84d27b4437e8726aa786123853abbebdf586c896217bb45246c861d2d76c3019784c2ac3d6898d1056a56154a7010a3b0145d16306f629355a5287ff543708b9fc0ad8b3d518280a54ab91c1a17569a9b9a5890a852080733f481f35f09f9aef453bdd0b254916a859f655db4d44a4090eff24efad51672a5249bee63d46145329798fde450daf01b74be4e9296c93cb2ece266c2302f60c5b7ac03df6bcaaca4d7cc5ae8fdb4c7dc0f26eed74e39a7d2c0e70bbfed17cbd0812cc83753089dfe3abf27bcdf0cef734c708657305aacc1cb2950a4d2a79098bb1cd0863735dc5ccff037bd9a7d6f30b275dde5005e2d412ca96c59ed985c0139770464f677efc76c83b21b9f5532d5e7e685071aa64e4487b9fe1f27b2bc1c94d5a245472a9f0095f4be22893574acc5146e303a2dce99b44c45f5d00078e3d61d24c409c44fdbc0c18aa052a6c5209f4786130c262c0ca165917e52580670da146ead6e72d86136228a4b0a728c94053382cf6bc1c3aebca9b407980cc5ac7a64d24888d9668b353d54f1e57da5fac016c3717e547e9c83fe16aafe5f548a06a7cfe182896ebda195bb1047ff02c9141cfea592c932067f7fafba7ba97d729bace694f4e86f01745d947d5f7e797b72949f6ad750c471e12ea15a294cc9ae2559f976625ef40c2e036a6936467fae02443e8b15c68da0ad83e4dddd07e2782c8cda70e9c1ee1374015818eeb543357782ecc88a7084e418614b7d8f546556c96f9c28871a816317c69d2a71381fef8f67ff68c3250a041a8efb4e28d7b1d3eb47c771e2ae62fa18b9f25b13a3b319a284dc3fbe184e59ed61d18d9d7023c8c39ea585629541d7dde80f5b659007ebd5df49176895467b3fcef43c3ab1474a5585efe20f3ca2dafeea8b0838a7225836907d79c36e5be1b84f5064c3248462fd8cddeeb2bbcdcdf99eea0f7755fde10d2b48941690281faed058755fa15bc643b42c661203cbb07fdedd599b335f01ef72207d8c1b993d5be98f11b079f666733c4eebcf9443a6c9997571bed2dc84a2e361eb13414b00fad1d580a50402e92d2b956915bb2f89e2b491660c91354b02d07b8623dd01dc9be78841b4df79c23ecbacd1a9de53a4e14354916b15eab626d9f5528fd7eed33fb707ae437db177161e813512ffd29b6c6ef8f6d3f7c06357acef2a7cd4a941e4516d5bc1bc400b72170dc1700fc1e44708d39c7945e62de8027411f1581e29f94524fb0c352afe5e7fbd023a106ed079d94957dfac87183d63fa2c4762586e9317d80e8210d364904e5ac28b30b333c8743619be539f2d290f26ac8eb028fcb0cacccc895cf287ac501a3d37e7c61b1e21f4aed3ee13a5aa74eb9dbb0818ab358b54a00e1c1fcf5ca87806d02afaa4d5256b360f840c9ecf4eb960efff42b09d110411237e31d8208caa87f59f3900e2d0ef581dc200825d71ca357a014a8a67763d21682ee41042f493045622c028c8354fa96d98600797b7eabf9ff77f15c972685904ff99140028b9d23e14f2ce9280ded8e7bc8f473b6d11a2a39ccd76b4f24992de8773c481e74008dad122a9559af884a7918de851953f02e8674af2f02b68ed56774ed98988d9b470688ae2e4a01251b0cf7e131fa47ca55ff7fc91ba3bcc498078bbd6843dd1ede7cf30b4b2f31c29ba6e364a4cceee5259e953564e583a2316b952d3907997320ddb568e0a613e754b189f8713f3e5a95bdace74ddc570420ce767508e07990b985c0228bda19508c18e9bb392d5e4ba46d3272e7ac38e8b38f43b948dc78537e7e5e03a05e1a5ade79f08611297b38e9e7fa88cb872d782a2208049a93490baaf10b062ac201b17cd7a24570ab67b21f943481b962414f118b0988974519176e4ac52d27c11a46d733065d2dd05629c4d36352c72e25274009cb28e856aba20c96610f983bc5f690a3a85e1b124d8b69ecb878348bec533b2d581d9c41f81c3af387cc0e253b9404a23a9e068cbf139c74340d99bf2c55c6e65cfca11511269fc4586b844a03b1b285d85bc837458f145b8e8c92e56c8b5ab79687f5bb10e85a7cb205df3969b63a7f117190a612c43eb877992a8c9e3cdc48d292858cad5b0e382fa71e9556eb65ad4a13f35d7b66c17861d5abee745c6379d3b962dcee95ca6bd34cf10a54ecace155da3e85e4f8a154740688dbc25a5da942494aa5065e3bcdf8bb39b17161d83580f5f44fbdb0cd70b14aa1076115de3d6bb4958c2b68f6ea666fc764fa39b698b443d5d813d438f9ad284963a6adad6f6a7379a89f7b7f0210d7a198ecec3dc9ef4012564229c578627dd53781de4e1d3122f4fd16f1ad470615f20357e0bbb76aae9cc128296b0420227b9ffb4cc600b75dcb48d76fd567b58b522dbbc568a7a1cb43f1bdc3aa3fd6f6d6e20dc473a975abf5c9be963128554c865bd2245dca8b839597ea8a006d00626819f5784c95bae6cadaf2b76c99c7730cb6bedfc0c1b33292ab79df4dcae04eb19aaa6585cf94cf26e65f49b9b582a2659792269b7e052580d912eeb93eb0c922af3468047786d7892eab824f9de13d7e493bf4906b0db305c2c8a0e8e395d415200a5aab1030f201ebcb6bd00c876c0a3c5bbc2964aaf6c8bc7c22660a9f098c8188fb7e19c0694b808ab36fcd37bb0d93b1a539187e1883a3fac205da045e31e55b944a08681157424c6ff5495263f845311338c392e10a6ad9d768f5270ad00ded8e8b4d57be28f482b225a0a6e1ee076c551812b01006b858fd9f42448d1721647d6921796d252c391e592fb8ae1b40ad9210d9fca9bdb0adb4d51c5740636f8453702416d57172d09aa6bdb89ea1380d094ac08cfeeade6700bc9eeb161b0b3d62eeba8f96614916148ad1dd28762e7ddd5dd02a501ab66a800219bced623026c532ed719a67b608b24a7556d8abfd0f1bde671f7eac6109317348943faf1fc158baff2aa955a25f58176f61b9a8c4e5e978361cd0fa2e87ee3ad68ef2bb0160f0ecbc6e86346ee024b70c31c885fbe3fb6b72fa24f35339906454c72119ffc30bb3822ef38f25140ac32414daeafa5bf2073b02ec361bf28934a1affe2305f19c8081fb6fcc8e59469f725243d357a752a1498f624918521361e62b4725141b5af222818321b0bbb04a098e29f03195d58d6464b84993939b8394653686e0bb5f76ad27d2e18e1393ac60e4b0f098e142796df106de40ca0442dfda47489fea678f1143f62499ba6b0e92f57e5f235de3285a98ab709b1c8073878dde5529b8a0ecf79d2e4bfb2ee0bbafb958cb9b60b0653fec976c1d6fa85727d581c05c8a0be38c75263ea4c0b2a5812bd58631bd3a12fba9e83f824c31af0b52d635c30b461b6127c76dd68c401962ea233e58ad544899227df827e558629c72af2e518c80226f1c1e18934e9c551c6e07aef794b748a17d472a512779b08f84cdea430392604429e913a15af46bb9fdd9c42b974524b2bcbf198edb9cbbd9059f7b47b48d19b74d91ee23fbd3ed3f64ef9d2cec6802741cef7f9fa7ba5d42ed8e0e7a0e288aba88eff389872795c0dd5cca5a54ac5986aa8d90c262ff2bdafc7553a1606591ddad0d79266a4d631731b0f2db24809c6cbd305fcf3a57cd1f251414fcce9ae42ccd843a7662cbe1c410674ef5c1036df53ff898e4f7d2eb8d50af3da8fd894ab3d76f020b8246a7006aead2a9c32c33facae2629d782b7b69bad4864169a31d67731f408c327707ff81c6583fd4b8c546394f1fd95ede8b2d650c24225916ea88d891f49726663b31b54662e908dc94003d51c2e85019ae294d74d0419cf43616ddfea973ac76f7139d2821f0788f4e37dc7184b6b266ab278af559f2daee2d118180560cc4ef81d6704a57011635d00e5c24248e16558c12202574f97a2104ede386c1d19cbdc9bcfe86b2634ac616002239e0ba0276102eebf68b99dd2a3bd742cb6afc3c2edc66766ac7be443fa4ae66de1e6b80e2bf3466d32b8d142087ddd0157c5b514429bcd2d8ff233ac4e5a8e481b32d98fa5ed591b2154edf0634edafd49b09443db20359c7da7b5e598b45b284a3d4d249b6dd3ce0a5746949d6a3960f285b273d3759a29e60515e300ca7a8d3f41502c25e903c00030000c0003030781060435eae0203eb28d7db659de2bf9322539c97000e125a22aa4dbf69094644a32c958ee4ea740e0e30000e0800321c97105c6031c04c4038b343bd11bc38787846c0a2d456d9a28a50b247768e53f07a1d5a73cfdda41f199214a9dd21d745e05923a1c3caf7c76cbceaad3123a702aee995e930aa17456209943bac46dec0e21d46b9583a374271df9df95f610592f90c4c1ccb5e6df7773f33e1c38bfd599733cb9166ee50d67ae93ba6637ffbcca0d26d31ad583d4205ebb36b4bb2f72b2b3516a291bd6142994a7a8c62a730d8c07cdf7325cef83e97dec0851c3a985fc0ff1bb49e34d436e26db9a418b06f5cb7356d274745dd91930295de76c972f6b5a6640bdf698d6e95b3f07053c22298341ee6af86b0512322c9490ded9af6bf27318a8a287c81a918c41257ad6f30a71213d470ca68dafb38e55ab1fe3150ae50a49187ad362a38e696c56bc60c05ddd367d7ccb179e2f683a883b9d948a11374abcb06b87e6968cdf7b5cd28536dd0713bada957a2ae182aa233ccfed78945a28d9822d455b9d86ead02a23d18236f3bd4926d59b939b05843c996b328a149d735820c1424a6b6cd021c58cfe18ee810585c23dfe0ae66c56d72ab37c1477142456c0842aeddafdf43cfe279054019d5e1af3ff8655eff1820ae97cd79b599d577a5a32854ea8766d1abf6fed05c6fb0e901a4390a491cc1db545a94d22856586120fe33a56ea28491494397f79ab105ea375b0904041f79cd963ba3f29c68b80e4098d7c678da65267a48e13f42dd130424b0a7f194913d69409aa7fd71962dab7df85311242451a9225a8b47e34eb6977684f0b12252c37ad904943b38bf792c0d9a8d82463833cd920a19b91b967b5d3e79647783e477fb7d42965de4658caf4ad3e359a8f5904c4d785d9893425156448886046bdb9a9fe3d3ba30b2468742e9ba577b4b568533204632bd93e9f378f0cf9172442e05ceee4a84897395d959604419d64de38e51f26db53a1502440586821ff5df92829fcad5028148a8d10487e60705bfdd0fc33a35d3e38b5ebeada15a94da37a7056b235bc102f44ca2c0ff853ef652e5aa4e8d00e14cd9d29e654967f8e0ed6a75e84d0a77476da60487260e6292193660b3121ddc207121c60eb63bb9eb552aa5f16486ec08bdc52d3d9f64665486c7078abf91ced29b5eea938437286d2e73eadaebd69c648cc302b29b3f44eaeed7293d480cff39cb7e2ec65ae3d909481a9e8295b53a5aab41d4868b08e5ad5a9cda59816cfc017799d95eb2844545c80781635c290907106215be69cfa6c846e2091c1497bf9bc9a10a91303dc743d5c368c29d149c630e78cb16b9f49a7fb302011a3b571255264446fab1218602a5deea3329d2ddb118223c70f1d38bad831c23e2894911d21225b5028a7c87bbc5bc70c8a8ce00809d6cc8601900b80600172058805402a0042012b4cb054e1ac576c83eca819fce6c14285a48e7794f956535888309172b5e8186e4e43d5e9ec3b8896d31ba5907a4c319df44a57ae8a026ab5ade6205ee4273914f2d5a8c369933dc1cd8dc27e4db8d2503a21a1b97fa429dd494b4d1352e24c940e798de15f26ecdae373bbac9910e712922aa588957ffefd42682c4ac0357e9890afaa422a09085d32b4e9e473dea90509a6ddcd7ca9859f98d2d102c4b420633902ef22fb367d1a9d3f8d83c76284cf5ca39ac86f50263c61bc1620a7c75b18af0588e5e81f22577c17ac84a5086697d257dfbe14cd96180b118ee5233bee6d0e7a233458e542ab6851e23fc76508686ad6417e3011dbd5228436fc4789cea0e46a4544962018ff59a2f65763e758854209e931b20021b125f746dfd9271d5d7ed0c6d1ad5e8f2a4f4a1b3cc25780f0e00df8e3704a2c3e404635fa372a1d8576e5d283b73ce807d5eb7a853b8285072699da3a4a28d366eab283752c21b392516387f02c3ae85ecae8f6bb1f951a7db1e440bf513276aad7342b2b140a0e769d2e45bb842abd4f854249c15328365280450e0e19e9c15b50283c7428122c3768d3ad8b69669d41d42f442c40a18860b1819a367becf8df9169b19cc1a677adfda95352ab2a3c78f06286a7f36b9b41ab76a1610192458d911d3f2a20a88182a50669e55a6e54db96618c4167f7a05199acd1c64808f7b821b2766431b2d0c0f437cd32cccb707f5628941920935ebd3a9b9f7c763264a08efa75dc7c8542b161c3860d076000c486152020361c600548183d6ad8483c225fdc7814708e0a809cfb81a387c8c29143bd13200e4b0c14b08cd180458c57a3163d6d523be96a814115925398a2142a21050224a310c50224a1d0b3fcd678faac49dc0a85028a4fe8ebcdadfeb07140f2094f7482139b58d44b2df3f75e2afda950285c483481d6115aacd49051f35ca150768434082499c004427bbcbf8c75763faa5028233f78f89880e412cc86d59ecb3b46d599252a9112afb7d52dfc36f40a85e283878f24a1049e3574c464d869134b2661921a2ef39ecc7dcaff1e372a202291848f2a2491488004128f309daef9a0dadfe7ad4a4a1cd1084be62c6622659d9f5ca322040923167167de34b141acb6a62a140a185f5104b64928d36d0f4a748a42b1e101492270d93a534633bd23158480214184df726435eae888920fb1e6b0715f67bf2373203ddef93350030d89210e202984325b656f45b5509d53a15072bc179f030718ac23031242184032085f480f32e9b21bd32f1a48047150b2536b324f1f47194802a1102f9e992a3ea8a7664800b1ccdeaacfb326f1b2fcc32ec3ebcc6699c45d57a150fc70f7eaccde4907b12a3e81a40f8e6ecf261a43c4fcbd51c30b091f962575e40ab12a55ec150a6503923d203dabc912e35147d56548f4a0f4d672740aa55c5c9507dbdb6b6d8542318541cf49759b39ea8b508542c162290532790e4ae4b59832d96e8018bb01b23740f486153524b09022ff98239ac58eade92a22374ab08c4291bfa5bff61b5ed5a2d84d64771819c565834b280e2acc94d4df9e600105b63a9ecc1a4d684fab1ccb278caeaa5364d54b215648583cd1285f159ab4d0da5611964e745acacbdc28afa56e090b2750a28556adb4bfebbd34964dd831bf99eabff3931616164d1ca4f416dab3d6339f329136edfa473eb7d22d7bc18289b38eed9331eb0fb5a70b964b2c657555db3bf6b86a89a40ed58d61e3ca3c5295b8be4e7ee8bc28a1bd0c52b73349a1c48705cb24ecdaf61979cfba755412688d73724783f6759948a4ee2faa9ead594899051278dcfcae523a46d3d4f2084c5d3cbb5e3bb9ad75c43a6496cf3aa3f2a49f46201e4d49193aa6d7540b238cba93aecc31bb6bce548cb12cc27259eac3099d3426174558329a0b4f2184dc7cfa624904372b84ae5aa5323a06c2811a2d5810619b76d23d1ae4669a6a882c8750e8987a1eba5fc36686c8ecd457bac6d1721b319642bcad49e5aa9735d1b086c85a08f1a8fc8e1eefdfa5cc97412465eb682b651fbb5a8b204cda573b4a0d1f33cd12886ee479909fa9b37ea90a85e2c5028865fa9cf7f6747a6ef687748c214be3a942a1d8b041a1b83315a558fc60b774592132b9fed02b14ca174b1ff0137fa1c7e43b3b870f9e6819a5a8d79af79c8e911f1b48cb1ed6e625a6d6cc94e8e8198b1ed23949976fa6a3392732963ca4f52be569b43ae15a67c1c3fbe9bf32f535a716ef8090ab65e254bdd80137915332e263cd35182c7530e6ffd4959c751d640b1d0c3d3a094d3fe17173662c7338fcb9690e5da57ef57258f7a5f29c5df5b8350e6b479b17ea4afc69ed020744ff3d6dbaee75b5df902e6552d7eb70a6ade38685f4f47f9932b3945a6df857cbe44dd78d4a211b4effa55dfccfeb56dd1a94b34a499d2954431b3c4f459312be41b4a4c15a0f1a475708d32e1b6341c3eba7b9c2dc54895c97331c7e27469b90ae6236672c665886de207dc39bfad42ac3f174ca91a1d4d7ca8f1732b06166f57ad052a67a2d63388d8b94fadff2cc368b18d22e6674d6c1e308f37b2c61f854673c73fa8c49c751fea8b1fe032958c0d097d43a7c3c21d3efe70be97a7bae77bc519a538b17faa03d6f50aaddf7560ac5478d2d962ea4f45369cfcb152e2ce42ae9219386124ab56c418f2e5feb9e4f37d983982d404c07400c0740cc06408c06aca002078b165c0f76ca5fcaf887ed094b160c77ddeb4aaecc1bd50b169051e24b6ec64bcf1013962bf8fa6b73c755f657ab8bc50a6793a3d3c6ce0e487b80d903ec9853851555849163a4d245c88e0718082842c01830a1228c7e80010030e2e3c707162abe0bfed1c50ece418000f8e8f1050801000e07012679b890911e151f3970e028c0040f3c74a83b8cbc0f3bbc17223a74bc8e014cea10060fa5e375086042870b19c951f1c173b890112f425c0e1732e2223a7ee0c05180491c5253ef57e372264c59d1633f28141ddf038717218ec37dec0819c911f2a371f4f81c213c7488280d4ce060fe512b9a3e63f3df6bf20645cbf484e996c94ecfc5c40de6286172ec37479d3393369c369a95476d6f313295091bf69cad5a44d66afbac9aac01ed274ae6c8fdd70e520352a9f9a4a332e695591af4dc74abbeb2caf40ac7040d674631ff97bac165383983a3b3b82bb1413777706286747a9dabe2c245674f04266548897c4d9abdd49b96e9c0840cbbc9288fd1e4777b2c07082663404699bf56dfe34a9962f8f377121eb4190634bbe624c36aee282118f01a1d37de84e6c9e70b0a75a93cc960d295ec265ef874de72ef96669b3756d430932ea0e3cccea45231ada522233bb2e0021a7cb3df68bed6fe2b3842d6ba91c5052e1046532838be986cc1131efde4fbc8dbd3275af0d5df54df5c33b41a149864a13b4f9139765bfa1e2ce4419f6b2d27e6b9af2ba03c988854f26594a963855f9a6d89a60d5ae7f4a40a8b525a885033adaf1a15789129a592b14ea6f0e6cc4a75fd61626e144cd2d03dacfc9814aa32c3134ca4c0c8fad16235f56a1a0563cc22a5d64a5c6387a0a0d4c2569d6a345d5a7a022ae34b96b8890be93bc1d2d298deb39a072d6f421bdb32cb7ab5aa41ce4c40e953a65bfecb7929f322c4af982c61dd1c737707b1b966335182ba6554cb4fe7a8563f74a449120c9bdae4b67884f418f191834219d91112822e422a40a1502648d86c93e8d0faa2dae40899c927dddc596f1a2d23b8d14447af4fa2475484f375cc28653a91ba211114edda95b1745e9dd0787e7fc495d0b7136f08ac7021265fab62e32304d59d2e2dda4fac0cbd8c49100e8faebf4166f77f0402bb3a3d3cdb7c2b17fda09327c4d7fc9bf820cd59c9fad8a3490fbe997b257556f260d9614fc4c970978f4d7660db9fcc4967e669bd99e8807fa53eb616577ddfe7e03e3fd3cf549f6df6040749194c8ecc52675c259adce0fd95c1b7d47d94493ab18149459cced6a88de13ec32857fffc56e85ca69b98a1791671a6bc8388d449c3a4068b169bcbe3a309f3bc8c8347d1f7b89f2bbe9fd0806dcdfff56ac59a0a552894334c66d0af8fcda89b301d4b13322e213f4ad3a176c3ee890c56bf1933c77aa15c47798808172298c4e0a41aa3e19e615e5e29988c612c19fb3aaa152f75cc440cec4bcaf4f0d4d2ab54a150263058bb89eda0a54c27c5c5720a5b63bb4eabc9168464a8b39914084108c2300882102008586dd301031148305858260d0704d2396d1ed701138040c522b1a92c168e8421511c074118063110033108823010c74146292495cbb3069d6cdd928f2d1aeb90a5682e1f2a9536fb2af2980d286f937ea10e4edf18ba31ae7884e270aa5793f54830876e0e46497c7614b028697aa460fc18538030ceebaabf3b115e9fc600ad5cfd26489def62ca545b2a232c31aa2b48e88b31274008c90b71b589a02064b518a46c5009b69f4e6135f00bf1cec072101ab26f3f840e4a99c3815d39d06f9add7d9cf43538641d840f63ef258e0d2c2707d988dbaadd9c7c16f47ee2aa6eac384195f44f76875d7cbd23028969e123b182a7f8cc70a4bdf580962b07c4992177285afb0a2a6c830df6189c51a9b737d68abc0efb4638a33267ed8607b3e00fce00b4cd11862f538c4de294810f36d177311e778c74f3271f3ff140d77d448f489ce1d45fa11865207b69ad23041d3e4c60e5e375a0a819b7db4d8dd9d721c403ee35b533f6576d60de5dd57478ac9c2b0cb359343d138087e3522963b8337c0ff1925191b33342d531a36a9b44c0f5f6f00a4481083e75967b8965d9af351b96e57bf07293bbc172caa6442ee1785341d081bdeb9fa0acd918f8c37ed85986b7acf07646cb05b3a03edfdcfc2efca220f328ff19954efecee1ff23049ead17854280eab9826a8d9077568ba1d9267da7144046c02d04223d936adfbcd6c9959a07bb7dbf53e3e8e4aa6202884e22041fbdb08c72ffa1ccae078a80534fd89bfcddacb35bba4ac9d10e81447508435e6f1f4943bc2602fa8d540968ac55e99420a510d1656be5ecd17cc0206c2db51779e928c8b51088e047c8d20a960661264ba075e5a6afe0527933eb1aac992f28169562a5d7808114430cf1a9e8ba477e11fedad54a6e9a8316e2c56476fac320c07f15843af235d767a1fdbe12d27fb33e1c93a45731d906e8aa37ce39297dc0be948d46140538849f20f15e06abc6291607d87200739710efbd517f8cc5c9ded991fe5e63c96eb4fa86808c254ceb6af3040b278c0ab73a158b5829cfb9085b2b168c1b48c1557f023700a20e44169e06b92cb9eddfe422d880ebf96860f0adfcabe401cb069fd0b941441f27e03c36d432a7dcc37380156b23a7930666323a87711e9acfa3af754609a06d861a999195eb05fb52db6e0d2c8a0190c15fac849e0dc4f702609d2e8af95ac1d2e21c1e7d0160f3dab1ba2b3cd82204097418a19580f7ad4b12090c02fce4e7858364855091bc26990e241315a8ac40c3da078182177ea8670cc6051f2139060f7c5b0fe4e14120eb750f9510958a20aec476628956bbd857f728bb9a1911a124558e382bd49c23e1dc92692ac535d2d4c3381d26323a4f29a089d950fc7659a28b02575933e22fba6b1685644467be37e239e8ef12781f9f4965461759a26b6828cbd1277f7220a180913a4c14a0d95a8a958869486901ee5f64aec7b9b9cac02a13db668dc010be6b0a17ab1d4e0ba5bdbc5bceccf5c6ed961ec374f623602de44c0b15bde1a4158e0a7d5a768cc26f09c5726d313514fdb0212e5112d5462e1fee53b4aeee7accdadf2e95633b83c57aed7967f5e814b0c2bf06f5cca345a8068f6f096cde134198d6558c4f957aaa381e6b45ae06b9e6110ab31d6e0a01d6e476d39f81e1480daeaae7df953b0796840b69247cfe36ada9925a1baea26a809ff41ef47de87df4e1ce559cc709ffbf82d92c1508c1da1597fa7632724521356e984586c45b0cfaa159e6f1739174b91e441827feac67d87f221ff4828815000431da20f010505d19516867f0f72e71301d176fdff83eb244de93ee2a598817937bfb1b0e10fcab20382fa0e2bdfd946c32e8cbfaf2fbcefb4a70349305e09745487d657774400d705593a2c2c8347d506f3d88e9a7a0c061878371ad41beae1dc02732e33d300cf24768a4b3a8b7b0bb3807061daa95b9a517bd885349c720a797ea8de8044fde946adc445c68b1b567efe307899ddcc9ab66957afb85241f5415b472f36cc08d64275335b63da9e4a41e7367574646591ba4a76995dabdd8788898e5522e45d91802c3a868aeb9a74f115e557c4003a5f3a1646e57a86e2a42d09b8947334bd09660834dd2832a80473a747a31e12bb95aa1072f72a60cc5bc4fe3e2ded31bb3a6ae114d32cc52cacaabded5cc27377aafff0ac1d24d8715fda02166078b6a947553a92e7f31accaa4cd28f2169d4944b40bb1c4f33868fe833cdbda9176478f398c03a88abe7f9611e4245d61261ad13a5718a50add491a1aeeed52758ee9081f3f42b8337b3a26ff2f0c2ef00d5f2ee65996902e95da258582e045fa63c45c5e15a67033e9728c82aa098549a90b35e8fcaaa8ba6dc3e27596b47ebee6a2758a0b88d732fda6b4de825a3bd28a74f0098f2b061878b764d7f964db983f51503ee2fe63af0c181ad47a20c4074608696680e3cc3c82f65120ed29617bdc49338d4364becb8b8ee6b1098e935775246295dd4a24a2217ac73b9a213b40db35bd5485c294720e29604fcaf43bae823a1a1071b0315939f46114ea5d8e475811dcb26bc3c61da18951dc6149a886ba158f98c763206c45c51bb53d4df5fe1e62427101e5d379564d701114d65f8504e2aa722fa5d5f49bdb6976c92b0730edd71f99043411aaa51cbb57ac9b205630278b947aa5de2407ba8a231dd377707eff54d7480dd563435c0e32fd64e9c67a53afd2b720169643989a1424a90d927bf15619df88e292852280a088800e20bf8bd5273bab90885d0751122e810483a4b0cba3aa5b8645586e8d0740dd0a351933d38cb240f865b1c03bbfce4b52a6b718077b9283b6bf8c4542a09e142822bc4f0f39953e45843aba5311e17dc5098a3af2d34c13b4469378585b44d8f554829c34926dad9016cc48d9bf7faeea8d4aabfec912f11a437805dd3184ddd31f43a8233a90217ca4b982187cf97f28090b5c406941780b2c9b457401cfafa2f6be2cea3787140761cb62afe0419e85f0987547e05d184d84d76061f04352e65ebe519a6982044ef921c8e43bab9c8faa77fcaf13e753be453c47062517a65b17ef989235e2019a7ba292c3a3436ab29494890811cfd9a3ecc12e11027e490aa8d9aef7a0a64108b61d48a1d2143f001f8c8648ae5faf290ee137f85a1ed4e912e9f5847425affc71d9d4d963e8c1fa7925abaca80bcd08b43f89957f5d356f3bb61f97f23151e7e857dfbd5e071c4281c8e8271e1e477e8bb1bb00d3f00aee8654e272ce0e427319d67240c0825b2e6868025bac0a6c8a4e71b964fed77848561061bc9bfce23c99c5ed60008a6269f700d0eaa8bc342cb7279c8a983a754edf53519b1c53ab864892e3eb4841c49a4a8b9f56de66404a022654d04d4210a8c59f4dcc80dcde1b55c5934c548e80d9a8bda217bccc21c61126fe36e7fd4bd18c0225233905032b6ac0981c27f401a11972a75432cc9c1d49c548289779005ff4757dfc770be2361f8c6c82b74356d0a5b4ff18097318cd7f30a68198a8deec04e48314982f0d012039f78dc09283612b21e0a2edb77bbfb9f41e17fb2ba81c54df15e8f48348d3ed74ad7012138f24e173ab14294bb0007dd0b606ccaf0c1b5f75f5d114b0c3225c8199f02faa98014256b2754093f404630ab8e7e4eaca22edcfa6d0b18b3e6198a7e41581dc7de91c303dc64b7bb25a7714c1f286e246b0e35bc087fb894f5b97c6b7f9beb87590e80ccbe1c208655370465fec120efc85d92c00681d15385444e373565b6af4d80950dfb717d972a1ad6f736846937fa7aedda2e23c180e29f923559cd35adf3d741751f8f673beaff0f88437108cf56897b6635459cbed5b7fd252072a09b68266b24b38a5df58800e69c8ee7eac5b538862c34b1309223f5b5f2439bfdd3939d0f219338fdb494273860463d7f42832f23f58a11ca4a763f9a853b889639f7137c0fa5014de6cf8eefe14bf89c7aec75e8f0e774edf0c2c311734910c5886824f88b927f6964e845c3b107a62a332570ef4567db51b543859e6c20919ea6a58b4dce75cf772f8bda7c036453511d185f6b9477232a9be4a6466cda7fec69e241dbef5e75d21c6882c0889e6ad82b0dd1fd40fd21a2a0d96004b9b2317d35ec710d37beac3f5e4ba8c2f0d957c6aa98e56363fa932f92ed9a32f604e2a0803fac22614fc22f4aeb5a8d201da8237889de92404935229373a8e710730150bb35491414618c97071fde89cf1926e5b0b834423756a0cafb11eb256cb6192a71e82019c310b5df6bcf6c93723349167f5046a8c661f9299fb091327867c42260a462d473d365e1966e424f4b7c561e6a29913db18c09fb6aa9f8024326c5a493d78c7df27756fd8b61b309d6dbbf03d45b8561ed7912439f42070eba8946f4067c8d6951e679eeb03cd6005aa0c0c88d855b7962a85a40a65f34b224986afaef31236d8f6cd943177a5ae19", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0x3a6772616e6470615f617574686f726974696573": "0x0108cd4bfe1900f265ab10ad21af536a4dc1f0753a32fbc48992a2654beda7e4f7560100000000000000a1a5b3b3106a1887c2729959258d69c86b381a9a85c44c20eb6a7486818c322b0100000000000000", + "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x080ec62bcc320bbfb7fb77fe4b8cdfd871d6d8114e0542f8037e5e6d9b1b724b668ead40f6ab81301e437985730cc3e09797e83f9513aaa5874d8f9e40c98b2b43", + "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x0ec62bcc320bbfb7fb77fe4b8cdfd871d6d8114e0542f8037e5e6d9b1b724b66", + "0x5f9cc45b7a00c5899361e1c6099678dc4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", + "0x5f9cc45b7a00c5899361e1c6099678dc8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000", "0x5f9cc45b7a00c5899361e1c6099678dcd47cb8f5328af743ddfb361e7180e7fcbb1bdbcacd6ac9340000000000000000": "0x00000000", + "0x8a493ef65ff3987a1fbc9979200ad1af4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xbd2a529379475088d3e29a918cd478724e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", + "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000200000000000000000", - "0x3a6772616e6470615f617574686f726974696573": "0x0108cd4bfe1900f265ab10ad21af536a4dc1f0753a32fbc48992a2654beda7e4f7560100000000000000a1a5b3b3106a1887c2729959258d69c86b381a9a85c44c20eb6a7486818c322b0100000000000000", - "0x3a65787472696e7369635f696e646578": "0x00000000", "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x35aae9114d26a6355fd54211072671694e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xf3346ba88704f776b1a529914f37d3a54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xbd2a529379475088d3e29a918cd478724e7b9012096b41c4eb3aaf947f6ea429": "0x0000" + "0xea327c55e400183c4fa3319ff4f62f794e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xf3346ba88704f776b1a529914f37d3a54e7b9012096b41c4eb3aaf947f6ea429": "0x0000" }, "childrenDefault": {} } diff --git a/crates/skw-blockchain-node/Cargo.toml b/crates/skw-blockchain-node/Cargo.toml index 9099090..bec793e 100644 --- a/crates/skw-blockchain-node/Cargo.toml +++ b/crates/skw-blockchain-node/Cargo.toml @@ -12,47 +12,56 @@ version = '3.0.0' targets = ['x86_64-unknown-linux-gnu'] [dependencies] -jsonrpc-core = '18.0.0' -structopt = '0.3.25' -hex-literal = "0.3.1" - +clap = { version = "3.1.6", features = ["derive"] } skyekiwi-runtime = { path = '../skw-blockchain-runtime', version = '3.0.0' } -frame-benchmarking = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -frame-benchmarking-cli = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -pallet-transaction-payment-rpc = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sc-basic-authorship = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '0.10.0-dev'} -sc-cli = {features = ['wasmtime'], git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '0.10.0-dev'} -sc-client-api = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sc-consensus = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '0.10.0-dev'} -sc-consensus-aura = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '0.10.0-dev'} -sc-executor = { features = ['wasmtime'], git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '0.10.0-dev'} -sc-finality-grandpa = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '0.10.0-dev'} -sc-keystore = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sc-rpc = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sc-rpc-api = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '0.10.0-dev'} -sc-service = { features = ['wasmtime'], git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '0.10.0-dev' } -sc-telemetry = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sc-transaction-pool = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sc-transaction-pool-api = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-api = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-block-builder = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-blockchain = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-consensus = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '0.10.0-dev'} -sp-consensus-aura = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '0.10.0-dev'} -sp-core = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = "4.0.0-dev"} -sp-finality-grandpa = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = "4.0.0-dev"} -sp-runtime = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = "4.0.0-dev"} -sp-timestamp = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = "4.0.0-dev"} -substrate-frame-rpc-system = { git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = "4.0.0-dev"} + +sc-cli = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22", features = ["wasmtime"] } +sp-core = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sc-executor = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22", features = ["wasmtime"] } +sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22", features = ["wasmtime"] } +sc-telemetry = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sc-keystore = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sc-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sc-transaction-pool-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sc-consensus-aura = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-consensus-aura = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sc-consensus = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sc-finality-grandpa = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-finality-grandpa = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sc-client-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-runtime = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-timestamp = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-inherents = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-keyring = { version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +frame-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } + +# These dependencies are used for the node template's RPCs +jsonrpsee = { version = "0.13.0", features = ["server"] } +sc-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sc-rpc-api = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-block-builder = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sc-basic-authorship = { version = "0.10.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +substrate-frame-rpc-system = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +pallet-transaction-payment-rpc = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } + +# These dependencies are used for runtime benchmarking +frame-benchmarking = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +frame-benchmarking-cli = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } + +# CLI-specific dependencies +try-runtime-cli = { version = "0.10.0-dev", optional = true, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } [[bin]] name = 'skyekiwi-node' -[build-dependencies.substrate-build-script-utils] -git = 'https://github.com/paritytech/substrate.git' -tag = 'monthly-2021-12' -version = '3.0.0' +[build-dependencies] +substrate-build-script-utils = { version = "3.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } [features] default = [] runtime-benchmarks = ['skyekiwi-runtime/runtime-benchmarks'] +try-runtime = ["skyekiwi-runtime/try-runtime", "try-runtime-cli"] diff --git a/crates/skw-blockchain-node/src/chain_spec.rs b/crates/skw-blockchain-node/src/chain_spec.rs index 7227f72..4013cb5 100644 --- a/crates/skw-blockchain-node/src/chain_spec.rs +++ b/crates/skw-blockchain-node/src/chain_spec.rs @@ -73,6 +73,7 @@ pub fn development_config() -> Result { None, // Extensions None, + None, )) } @@ -145,7 +146,7 @@ fn testnet_genesis( }, sudo: SudoConfig { // Assign network admin rights. - key: root_key, + key: Some(root_key), }, } } diff --git a/crates/skw-blockchain-node/src/cli.rs b/crates/skw-blockchain-node/src/cli.rs index 8ed1d35..4ab4d34 100644 --- a/crates/skw-blockchain-node/src/cli.rs +++ b/crates/skw-blockchain-node/src/cli.rs @@ -1,19 +1,20 @@ use sc_cli::RunCmd; -use structopt::StructOpt; -#[derive(Debug, StructOpt)] +#[derive(Debug, clap::Parser)] pub struct Cli { - #[structopt(subcommand)] + #[clap(subcommand)] pub subcommand: Option, - #[structopt(flatten)] + #[clap(flatten)] pub run: RunCmd, } -#[derive(Debug, StructOpt)] +#[derive(Debug, clap::Subcommand)] pub enum Subcommand { /// Key management cli utilities + #[clap(subcommand)] Key(sc_cli::KeySubcommand), + /// Build a chain specification. BuildSpec(sc_cli::BuildSpecCmd), @@ -35,7 +36,18 @@ pub enum Subcommand { /// Revert the chain to a previous state. Revert(sc_cli::RevertCmd), - /// The custom benchmark subcommand benchmarking runtime pallets. - #[structopt(name = "benchmark", about = "Benchmark runtime pallets.")] + /// Sub-commands concerned with benchmarking. + #[clap(subcommand)] Benchmark(frame_benchmarking_cli::BenchmarkCmd), + + /// Try some command against runtime state. + #[cfg(feature = "try-runtime")] + TryRuntime(try_runtime_cli::TryRuntimeCmd), + + /// Try some command against runtime state. Note: `try-runtime` feature must be enabled. + #[cfg(not(feature = "try-runtime"))] + TryRuntime, + + /// Db meta columns information. + ChainInfo(sc_cli::ChainInfoCmd), } diff --git a/crates/skw-blockchain-node/src/command.rs b/crates/skw-blockchain-node/src/command.rs index f9da085..2bb5eaa 100644 --- a/crates/skw-blockchain-node/src/command.rs +++ b/crates/skw-blockchain-node/src/command.rs @@ -1,11 +1,14 @@ use crate::{ chain_spec, cli::{Cli, Subcommand}, + command_helper::{inherent_benchmark_data, BenchmarkExtrinsicBuilder}, service, }; +use frame_benchmarking_cli::{BenchmarkCmd, SUBSTRATE_REFERENCE_HARDWARE}; use skyekiwi_runtime::Block; use sc_cli::{ChainSpec, RuntimeVersion, SubstrateCli}; use sc_service::PartialComponents; +use std::sync::Arc; impl SubstrateCli for Cli { fn impl_name() -> String { @@ -29,7 +32,7 @@ impl SubstrateCli for Cli { } fn copyright_start_year() -> i32 { - 2021 + 2021 } fn load_spec(&self, id: &str) -> Result, String> { @@ -95,19 +98,75 @@ pub fn run() -> sc_cli::Result<()> { runner.async_run(|config| { let PartialComponents { client, task_manager, backend, .. } = service::new_partial(&config)?; - Ok((cmd.run(client, backend), task_manager)) + let aux_revert = Box::new(|client, _, blocks| { + sc_finality_grandpa::revert(client, blocks)?; + Ok(()) + }); + Ok((cmd.run(client, backend, Some(aux_revert)), task_manager)) }) }, - Some(Subcommand::Benchmark(cmd)) => - if cfg!(feature = "runtime-benchmarks") { - let runner = cli.create_runner(cmd)?; + Some(Subcommand::Benchmark(cmd)) => { + let runner = cli.create_runner(cmd)?; + + runner.sync_run(|config| { + // This switch needs to be in the client, since the client decides + // which sub-commands it wants to support. + match cmd { + BenchmarkCmd::Pallet(cmd) => { + if !cfg!(feature = "runtime-benchmarks") { + return Err( + "Runtime benchmarking wasn't enabled when building the node. \ + You can enable it with `--features runtime-benchmarks`." + .into(), + ) + } + + cmd.run::(config) + }, + BenchmarkCmd::Block(cmd) => { + let PartialComponents { client, .. } = service::new_partial(&config)?; + cmd.run(client) + }, + BenchmarkCmd::Storage(cmd) => { + let PartialComponents { client, backend, .. } = + service::new_partial(&config)?; + let db = backend.expose_db(); + let storage = backend.expose_storage(); + + cmd.run(config, client, db, storage) + }, + BenchmarkCmd::Overhead(cmd) => { + let PartialComponents { client, .. } = service::new_partial(&config)?; + let ext_builder = BenchmarkExtrinsicBuilder::new(client.clone()); - runner.sync_run(|config| cmd.run::(config)) - } else { - Err("Benchmarking wasn't enabled when building the node. You can enable it with \ - `--features runtime-benchmarks`." - .into()) - }, + cmd.run(config, client, inherent_benchmark_data()?, Arc::new(ext_builder)) + }, + BenchmarkCmd::Machine(cmd) => + cmd.run(&config, SUBSTRATE_REFERENCE_HARDWARE.clone()), + } + }) + }, + #[cfg(feature = "try-runtime")] + Some(Subcommand::TryRuntime(cmd)) => { + let runner = cli.create_runner(cmd)?; + runner.async_run(|config| { + // we don't need any of the components of new_partial, just a runtime, or a task + // manager to do `async_run`. + let registry = config.prometheus_config.as_ref().map(|cfg| &cfg.registry); + let task_manager = + sc_service::TaskManager::new(config.tokio_handle.clone(), registry) + .map_err(|e| sc_cli::Error::Service(sc_service::Error::Prometheus(e)))?; + Ok((cmd.run::(config), task_manager)) + }) + }, + #[cfg(not(feature = "try-runtime"))] + Some(Subcommand::TryRuntime) => Err("TryRuntime wasn't enabled when building the node. \ + You can enable it with `--features try-runtime`." + .into()), + Some(Subcommand::ChainInfo(cmd)) => { + let runner = cli.create_runner(cmd)?; + runner.sync_run(|config| cmd.run::(&config)) + }, None => { let runner = cli.create_runner(&cli.run)?; runner.run_node_until_exit(|config| async move { @@ -115,4 +174,4 @@ pub fn run() -> sc_cli::Result<()> { }) }, } -} +} \ No newline at end of file diff --git a/crates/skw-blockchain-node/src/command_helper.rs b/crates/skw-blockchain-node/src/command_helper.rs new file mode 100644 index 0000000..9ca89b5 --- /dev/null +++ b/crates/skw-blockchain-node/src/command_helper.rs @@ -0,0 +1,110 @@ +use crate::service::FullClient; + +use skyekiwi_runtime as runtime; +use runtime::SystemCall; +use sc_cli::Result; +use sc_client_api::BlockBackend; +use sp_core::{Encode, Pair}; +use sp_inherents::{InherentData, InherentDataProvider}; +use sp_keyring::Sr25519Keyring; +use sp_runtime::{OpaqueExtrinsic, SaturatedConversion}; + +use std::{sync::Arc, time::Duration}; + +/// Generates extrinsics for the `benchmark overhead` command. +/// +/// Note: Should only be used for benchmarking. +pub struct BenchmarkExtrinsicBuilder { + client: Arc, +} + +impl BenchmarkExtrinsicBuilder { + /// Creates a new [`Self`] from the given client. + pub fn new(client: Arc) -> Self { + Self { client } + } +} + +impl frame_benchmarking_cli::ExtrinsicBuilder for BenchmarkExtrinsicBuilder { + fn remark(&self, nonce: u32) -> std::result::Result { + let acc = Sr25519Keyring::Bob.pair(); + let extrinsic: OpaqueExtrinsic = create_benchmark_extrinsic( + self.client.as_ref(), + acc, + SystemCall::remark { remark: vec![] }.into(), + nonce, + ) + .into(); + + Ok(extrinsic) + } +} + +/// Create a transaction using the given `call`. +/// +/// Note: Should only be used for benchmarking. +pub fn create_benchmark_extrinsic( + client: &FullClient, + sender: sp_core::sr25519::Pair, + call: runtime::Call, + nonce: u32, +) -> runtime::UncheckedExtrinsic { + let genesis_hash = client.block_hash(0).ok().flatten().expect("Genesis block exists; qed"); + let best_hash = client.chain_info().best_hash; + let best_block = client.chain_info().best_number; + + let period = runtime::BlockHashCount::get() + .checked_next_power_of_two() + .map(|c| c / 2) + .unwrap_or(2) as u64; + let extra: runtime::SignedExtra = ( + frame_system::CheckNonZeroSender::::new(), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + frame_system::CheckEra::::from(sp_runtime::generic::Era::mortal( + period, + best_block.saturated_into(), + )), + frame_system::CheckNonce::::from(nonce), + frame_system::CheckWeight::::new(), + pallet_transaction_payment::ChargeTransactionPayment::::from(0), + ); + + let raw_payload = runtime::SignedPayload::from_raw( + call.clone(), + extra.clone(), + ( + (), + runtime::VERSION.spec_version, + runtime::VERSION.transaction_version, + genesis_hash, + best_hash, + (), + (), + (), + ), + ); + let signature = raw_payload.using_encoded(|e| sender.sign(e)); + + runtime::UncheckedExtrinsic::new_signed( + call.clone(), + sp_runtime::AccountId32::from(sender.public()).into(), + runtime::Signature::Sr25519(signature.clone()), + extra.clone(), + ) +} + +/// Generates inherent data for the `benchmark overhead` command. +/// +/// Note: Should only be used for benchmarking. +pub fn inherent_benchmark_data() -> Result { + let mut inherent_data = InherentData::new(); + let d = Duration::from_millis(0); + let timestamp = sp_timestamp::InherentDataProvider::new(d.into()); + + timestamp + .provide_inherent_data(&mut inherent_data) + .map_err(|e| format!("creating inherent data: {:?}", e))?; + Ok(inherent_data) +} \ No newline at end of file diff --git a/crates/skw-blockchain-node/src/main.rs b/crates/skw-blockchain-node/src/main.rs index 4449d28..0f2fbd5 100644 --- a/crates/skw-blockchain-node/src/main.rs +++ b/crates/skw-blockchain-node/src/main.rs @@ -6,6 +6,7 @@ mod chain_spec; mod service; mod cli; mod command; +mod command_helper; mod rpc; fn main() -> sc_cli::Result<()> { diff --git a/crates/skw-blockchain-node/src/rpc.rs b/crates/skw-blockchain-node/src/rpc.rs index 03b46b8..e8a4215 100644 --- a/crates/skw-blockchain-node/src/rpc.rs +++ b/crates/skw-blockchain-node/src/rpc.rs @@ -7,13 +7,15 @@ use std::sync::Arc; +use jsonrpsee::RpcModule; use skyekiwi_runtime::{opaque::Block, AccountId, Balance, Index}; -pub use sc_rpc_api::DenyUnsafe; use sc_transaction_pool_api::TransactionPool; use sp_api::ProvideRuntimeApi; use sp_block_builder::BlockBuilder; use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata}; +pub use sc_rpc_api::DenyUnsafe; + /// Full client dependencies. pub struct FullDeps { /// The client instance to use. @@ -25,7 +27,9 @@ pub struct FullDeps { } /// Instantiate all full RPC extensions. -pub fn create_full(deps: FullDeps) -> jsonrpc_core::IoHandler +pub fn create_full( + deps: FullDeps, +) -> Result, Box> where C: ProvideRuntimeApi, C: HeaderBackend + HeaderMetadata + 'static, @@ -35,20 +39,19 @@ where C::Api: BlockBuilder, P: TransactionPool + 'static, { - use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApi}; - use substrate_frame_rpc_system::{FullSystem, SystemApi}; + use pallet_transaction_payment_rpc::{TransactionPaymentApiServer, TransactionPaymentRpc}; + use substrate_frame_rpc_system::{SystemApiServer, SystemRpc}; - let mut io = jsonrpc_core::IoHandler::default(); + let mut module = RpcModule::new(()); let FullDeps { client, pool, deny_unsafe } = deps; - io.extend_with(SystemApi::to_delegate(FullSystem::new(client.clone(), pool, deny_unsafe))); - - io.extend_with(TransactionPaymentApi::to_delegate(TransactionPayment::new(client.clone()))); + module.merge(SystemRpc::new(client.clone(), pool.clone(), deny_unsafe).into_rpc())?; + module.merge(TransactionPaymentRpc::new(client).into_rpc())?; // Extend this RPC with a custom API by using the following syntax. // `YourRpcStruct` should have a reference to a client, which is needed // to call into the runtime. - // `io.extend_with(YourRpcTrait::to_delegate(YourRpcStruct::new(ReferenceToClient, ...)));` + // `module.merge(YourRpcTrait::into_rpc(YourRpcStruct::new(ReferenceToClient, ...)))?;` - io + Ok(module) } diff --git a/crates/skw-blockchain-node/src/service.rs b/crates/skw-blockchain-node/src/service.rs index e9164bb..ca5d583 100644 --- a/crates/skw-blockchain-node/src/service.rs +++ b/crates/skw-blockchain-node/src/service.rs @@ -1,14 +1,13 @@ //! Service and ServiceFactory implementation. Specialized wrapper over substrate service. use skyekiwi_runtime::{self, opaque::Block, RuntimeApi}; -use sc_client_api::ExecutorProvider; +use sc_client_api::{BlockBackend, ExecutorProvider}; use sc_consensus_aura::{ImportQueueParams, SlotProportion, StartAuraParams}; pub use sc_executor::NativeElseWasmExecutor; use sc_finality_grandpa::SharedVoterState; use sc_keystore::LocalKeystore; use sc_service::{error::Error as ServiceError, Configuration, TaskManager}; use sc_telemetry::{Telemetry, TelemetryWorker}; -use sp_consensus::SlotData; use sp_consensus_aura::sr25519::AuthorityPair as AuraPair; use std::{sync::Arc, time::Duration}; @@ -32,11 +31,12 @@ impl sc_executor::NativeExecutionDispatch for ExecutorDispatch { } } -type FullClient = +pub(crate) type FullClient = sc_service::TFullClient>; type FullBackend = sc_service::TFullBackend; type FullSelectChain = sc_consensus::LongestChain; + pub fn new_partial( config: &Configuration, ) -> Result< @@ -60,7 +60,7 @@ pub fn new_partial( ServiceError, > { if config.keystore_remote.is_some() { - return Err(ServiceError::Other(format!("Remote Keystores are not supported."))) + return Err(ServiceError::Other("Remote Keystores are not supported.".into())) } let telemetry = config @@ -78,11 +78,12 @@ pub fn new_partial( config.wasm_method, config.default_heap_pages, config.max_runtime_instances, + config.runtime_cache_size, ); let (client, backend, keystore_container, task_manager) = sc_service::new_full_parts::( - &config, + config, telemetry.as_ref().map(|(_, telemetry)| telemetry.handle()), executor, )?; @@ -110,7 +111,7 @@ pub fn new_partial( telemetry.as_ref().map(|x| x.handle()), )?; - let slot_duration = sc_consensus_aura::slot_duration(&*client)?.slot_duration(); + let slot_duration = sc_consensus_aura::slot_duration(&*client)?; let import_queue = sc_consensus_aura::import_queue::(ImportQueueParams { @@ -121,7 +122,7 @@ pub fn new_partial( let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_duration( + sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( *timestamp, slot_duration, ); @@ -179,8 +180,15 @@ pub fn new_full(mut config: Configuration) -> Result ))), }; } + let grandpa_protocol_name = sc_finality_grandpa::protocol_standard_name( + &client.block_hash(0).ok().flatten().expect("Genesis block exists; qed"), + &config.chain_spec, + ); - config.network.extra_sets.push(sc_finality_grandpa::grandpa_peers_set_config()); + config + .network + .extra_sets + .push(sc_finality_grandpa::grandpa_peers_set_config(grandpa_protocol_name.clone())); let warp_sync = Arc::new(sc_finality_grandpa::warp_proof::NetworkProvider::new( backend.clone(), grandpa_link.shared_authority_set().clone(), @@ -221,8 +229,7 @@ pub fn new_full(mut config: Configuration) -> Result Box::new(move |deny_unsafe, _| { let deps = crate::rpc::FullDeps { client: client.clone(), pool: pool.clone(), deny_unsafe }; - - Ok(crate::rpc::create_full(deps)) + crate::rpc::create_full(deps).map_err(Into::into) }) }; @@ -232,7 +239,7 @@ pub fn new_full(mut config: Configuration) -> Result keystore: keystore_container.sync_keystore(), task_manager: &mut task_manager, transaction_pool: transaction_pool.clone(), - rpc_extensions_builder, + rpc_builder: rpc_extensions_builder, backend, system_rpc_tx, config, @@ -252,12 +259,11 @@ pub fn new_full(mut config: Configuration) -> Result sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()); let slot_duration = sc_consensus_aura::slot_duration(&*client)?; - let raw_slot_duration = slot_duration.slot_duration(); let aura = sc_consensus_aura::start_aura::( StartAuraParams { slot_duration, - client: client.clone(), + client, select_chain, block_import, proposer_factory, @@ -265,9 +271,9 @@ pub fn new_full(mut config: Configuration) -> Result let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_duration( + sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( *timestamp, - raw_slot_duration, + slot_duration, ); Ok((timestamp, slot)) @@ -286,7 +292,9 @@ pub fn new_full(mut config: Configuration) -> Result // the AURA authoring task is considered essential, i.e. if it // fails we take down the service with it. - task_manager.spawn_essential_handle().spawn_blocking("aura", Some("block-authoring"), aura); + task_manager + .spawn_essential_handle() + .spawn_blocking("aura", Some("block-authoring"), aura); } // if the node isn't actively participating in consensus then it doesn't @@ -303,6 +311,7 @@ pub fn new_full(mut config: Configuration) -> Result keystore, local_role: role, telemetry: telemetry.as_ref().map(|x| x.handle()), + protocol_name: grandpa_protocol_name, }; if enable_grandpa { @@ -333,4 +342,4 @@ pub fn new_full(mut config: Configuration) -> Result network_starter.start_network(); Ok(task_manager) -} +} \ No newline at end of file diff --git a/crates/skw-blockchain-pallets/pallet-parentchain/Cargo.toml b/crates/skw-blockchain-pallets/pallet-parentchain/Cargo.toml index 377b91c..cfd12e4 100644 --- a/crates/skw-blockchain-pallets/pallet-parentchain/Cargo.toml +++ b/crates/skw-blockchain-pallets/pallet-parentchain/Cargo.toml @@ -12,26 +12,27 @@ version = '3.0.0' [package.metadata.docs.rs] targets = ['x86_64-unknown-linux-gnu'] -[dev-dependencies] -test-env-log = "0.2.7" -log = "*" -env_logger="*" - [dependencies] +skw-blockchain-primitives = { path = "../primitives", default-features = false } pallet-registry = { version = "3.0.0", default-features = false, path = "../pallet-registry" } -codec = {default-features = false, features = ['derive'], package = 'parity-scale-codec', version = '2.0.0'} -frame-benchmarking = { default-features = false, git = 'https://github.com/paritytech/substrate.git', optional = true, tag = 'monthly-2021-12', version = '4.0.0-dev'} -frame-support = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -frame-system = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -scale-info = { default-features = false, features = ['derive'], version = '1.0'} -sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-core = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-io = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-runtime = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} + +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ + "derive", +] } +scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } +frame-support = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22"} +frame-system = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +frame-benchmarking = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22", optional = true } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } + +[dev-dependencies] +sp-core = { default-features = false, version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-io = { default-features = false, version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-runtime = { default-features = false, version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } [features] default = ['std'] -runtime-benchmarks = ['frame-benchmarking'] +runtime-benchmarks = ["frame-benchmarking/runtime-benchmarks"] std = [ 'codec/std', 'scale-info/std', diff --git a/crates/skw-blockchain-pallets/pallet-parentchain/src/benchmarking.rs b/crates/skw-blockchain-pallets/pallet-parentchain/src/benchmarking.rs index 5796ea5..2ede7e1 100644 --- a/crates/skw-blockchain-pallets/pallet-parentchain/src/benchmarking.rs +++ b/crates/skw-blockchain-pallets/pallet-parentchain/src/benchmarking.rs @@ -2,9 +2,11 @@ use super::*; use frame_system::RawOrigin; use frame_benchmarking::{benchmarks, whitelisted_caller, impl_benchmark_test_suite}; + #[allow(unused)] use crate::Pallet as Parentchain; use pallet_registry::Pallet as Registry; +use sp_std::vec::Vec; const PUBLIC_KEY: &str = "38d58afd1001bb265bce6ad24ff58239c62e1c98886cda9d7ccf41594f37d52f"; fn decode_hex_uncompressed(s: &str) -> Vec { diff --git a/crates/skw-blockchain-pallets/pallet-parentchain/src/lib.rs b/crates/skw-blockchain-pallets/pallet-parentchain/src/lib.rs index 2006f62..f54676c 100644 --- a/crates/skw-blockchain-pallets/pallet-parentchain/src/lib.rs +++ b/crates/skw-blockchain-pallets/pallet-parentchain/src/lib.rs @@ -1,5 +1,4 @@ #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::prelude::*; pub use pallet::*; pub mod weights; @@ -19,9 +18,11 @@ pub type ShardId = u64; #[frame_support::pallet] pub mod pallet { - use frame_support::{dispatch::DispatchResult, pallet_prelude::*}; + use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - use super::*; + use skw_blockchain_primitives::{ShardId, CallIndex}; + use sp_std::vec::Vec; + use super::WeightInfo; #[pallet::config] pub trait Config: frame_system::Config + pallet_registry::Config { @@ -35,11 +36,11 @@ pub mod pallet { /// Maximum number of outcomes allowed per submission #[pallet::constant] - type MaxOutcomePerSubmission: Get; + type MaxOutcomePerSubmission: Get; /// Maximum length of sizze for each outcome submitted #[pallet::constant] - type MaxSizePerOutcome: Get; + type MaxSizePerOutcome: Get; } #[pallet::pallet] @@ -68,7 +69,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn outcome_of)] pub(super) type Outcome = StorageMap<_, Twox64Concat, - CallIndex, Vec>; + CallIndex, BoundedVec>; #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] @@ -91,7 +92,7 @@ pub mod pallet { impl Pallet { /// (ROOT ONLY) set the confirmation threshold for a shard - #[pallet::weight(::WeightInfo::set_shard_confirmation_threshold())] + #[pallet::weight(::WeightInfo::set_shard_confirmation_threshold())] pub fn set_shard_confirmation_threshold( origin: OriginFor, shard_id: ShardId, @@ -105,7 +106,7 @@ pub mod pallet { } /// submit a batch of outcomes for a block - #[pallet::weight(::WeightInfo::submit_outcome(outcome_call_index.len() as u32))] + #[pallet::weight(::WeightInfo::submit_outcome(outcome_call_index.len() as u32))] pub fn submit_outcome( origin: OriginFor, block_number: T::BlockNumber, shard_id: ShardId, @@ -173,7 +174,10 @@ pub mod pallet { ensure!(confirms <= threshold, Error::::Unexpected); for (i, call_index) in outcome_call_index.iter().enumerate() { - >::insert(&call_index, &outcome[i]); + let bounded_outcome = BoundedVec::::try_from(outcome[i].clone()) + .map_err(|_| Error::::InvalidOutcome)?; + + >::insert(&call_index, &bounded_outcome); } >::insert(&shard_id, &block_number, &state_root); diff --git a/crates/skw-blockchain-pallets/pallet-parentchain/src/mock.rs b/crates/skw-blockchain-pallets/pallet-parentchain/src/mock.rs index 728b00e..17e6b23 100644 --- a/crates/skw-blockchain-pallets/pallet-parentchain/src/mock.rs +++ b/crates/skw-blockchain-pallets/pallet-parentchain/src/mock.rs @@ -1,9 +1,7 @@ -#![cfg(test)] use crate as pallet_parentchain; use pallet_registry; -use frame_support::parameter_types; -use frame_system as system; +use frame_support::traits::{ConstU16, ConstU32, ConstU64}; use sp_core::H256; use sp_runtime::{ testing::Header, @@ -26,12 +24,7 @@ frame_support::construct_runtime!( } ); -parameter_types! { - pub const BlockHashCount: u64 = 250; - pub const SS58Prefix: u8 = 42; -} - -impl system::Config for Test { +impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); type BlockLength = (); @@ -46,44 +39,35 @@ impl system::Config for Test { type Lookup = IdentityLookup; type Header = Header; type Event = Event; - type BlockHashCount = BlockHashCount; + type BlockHashCount = ConstU64<250>; type Version = (); type PalletInfo = PalletInfo; type AccountData = (); type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); - type SS58Prefix = SS58Prefix; + type SS58Prefix = ConstU16<42>; type OnSetCode = (); -} - -parameter_types! { - pub const RegistrationDuration: u32 = 1_000_000_000; - pub const MaxActiveShards: u64 = 0; + type MaxConsumers = frame_support::traits::ConstU32<16>; } impl pallet_registry::Config for Test { type WeightInfo = (); type Event = Event; - type RegistrationDuration = RegistrationDuration; - type MaxActiveShards = MaxActiveShards; -} - -parameter_types! { - pub const DelayThreshold: u32 = 20; - pub const MaxOutcomePerSubmission: u64 = 20; - pub const MaxSizePerOutcome: u64 = 1024; + type RegistrationDuration = ConstU64<100_000>; + type MaxActiveShards = ConstU32<1_000>; + type MaxSecretKeepers = ConstU32<5_000>; } impl pallet_parentchain::Config for Test { type WeightInfo = (); type Event = Event; - type DelayThreshold = DelayThreshold; - type MaxOutcomePerSubmission = MaxOutcomePerSubmission; - type MaxSizePerOutcome = MaxSizePerOutcome; + type DelayThreshold = ConstU64<5_000>; + type MaxOutcomePerSubmission = ConstU32<20>; + type MaxSizePerOutcome = ConstU32<1024>; } // Build genesis storage according to the mock runtime. pub fn new_test_ext() -> sp_io::TestExternalities { - system::GenesisConfig::default().build_storage::().unwrap().into() + frame_system::GenesisConfig::default().build_storage::().unwrap().into() } diff --git a/crates/skw-blockchain-pallets/pallet-parentchain/src/weights.rs b/crates/skw-blockchain-pallets/pallet-parentchain/src/weights.rs index 3a95731..f5cc660 100644 --- a/crates/skw-blockchain-pallets/pallet-parentchain/src/weights.rs +++ b/crates/skw-blockchain-pallets/pallet-parentchain/src/weights.rs @@ -6,22 +6,31 @@ //! Autogenerated weights for pallet_parentchain //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-04-07, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("skw_alpha"), DB CACHE: 128 +//! DATE: 2022-05-30, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// /home/songzhou28/skyekiwi-network/target/release/skyekiwi-node +// /Users/songzhou/Desktop/skyekiwi-network/target/release/skyekiwi-node // benchmark -// --chain=skw_alpha -// --steps=50 -// --repeat=20 -// --pallet=pallet_parentchain -// --extrinsic=* -// --execution=wasm -// --wasm-execution=compiled -// --heap-pages=4096 -// --output=/home/songzhou28/skyekiwi-network/crates/skw-blockchain-pallets/pallet-parentchain/src/weights.rs -// --template=/home/songzhou28/skyekiwi-network/misc/frame-weight-template.hbs +// pallet +// --steps +// 50 +// --repeat +// 20 +// --pallet +// pallet_parentchain +// --extrinsic +// * +// --execution +// wasm +// --wasm-execution +// compiled +// --heap-pages +// 4096 +// --output +// /Users/songzhou/Desktop/skyekiwi-network/crates/skw-blockchain-pallets/pallet-parentchain/src/weights.rs +// --template +// /Users/songzhou/Desktop/skyekiwi-network/misc/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -41,7 +50,7 @@ pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { // Storage: Parentchain ShardConfirmationThreshold (r:1 w:1) fn set_shard_confirmation_threshold() -> Weight { - (5_726_000 as Weight) + (2_000_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } @@ -52,14 +61,13 @@ impl WeightInfo for SubstrateWeight { // Storage: Registry BeaconCount (r:1 w:0) // Storage: Parentchain StateRoot (r:1 w:1) // Storage: Parentchain Confirmation (r:1 w:1) - // Storage: Parentchain StateFileHash (r:0 w:1) // Storage: Parentchain Outcome (r:0 w:1) fn submit_outcome(s: u32, ) -> Weight { - (15_642_000 as Weight) - // Standard Error: 36_000 - .saturating_add((70_012_000 as Weight).saturating_mul(s as Weight)) + (0 as Weight) + // Standard Error: 44_000 + .saturating_add((26_624_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(7 as Weight)) - .saturating_add(T::DbWeight::get().writes(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } } @@ -68,7 +76,7 @@ impl WeightInfo for SubstrateWeight { impl WeightInfo for () { // Storage: Parentchain ShardConfirmationThreshold (r:1 w:1) fn set_shard_confirmation_threshold() -> Weight { - (5_726_000 as Weight) + (2_000_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } @@ -79,14 +87,13 @@ impl WeightInfo for () { // Storage: Registry BeaconCount (r:1 w:0) // Storage: Parentchain StateRoot (r:1 w:1) // Storage: Parentchain Confirmation (r:1 w:1) - // Storage: Parentchain StateFileHash (r:0 w:1) // Storage: Parentchain Outcome (r:0 w:1) fn submit_outcome(s: u32, ) -> Weight { - (15_642_000 as Weight) - // Standard Error: 36_000 - .saturating_add((70_012_000 as Weight).saturating_mul(s as Weight)) + (0 as Weight) + // Standard Error: 44_000 + .saturating_add((26_624_000 as Weight).saturating_mul(s as Weight)) .saturating_add(RocksDbWeight::get().reads(7 as Weight)) - .saturating_add(RocksDbWeight::get().writes(3 as Weight)) + .saturating_add(RocksDbWeight::get().writes(2 as Weight)) .saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } } diff --git a/crates/skw-blockchain-pallets/pallet-registry/Cargo.toml b/crates/skw-blockchain-pallets/pallet-registry/Cargo.toml index b0c8c3f..6e3f567 100644 --- a/crates/skw-blockchain-pallets/pallet-registry/Cargo.toml +++ b/crates/skw-blockchain-pallets/pallet-registry/Cargo.toml @@ -1,6 +1,6 @@ [package] authors = ['SkyeKiwi '] -description = 'the high level secret contract interface for the SkyeKiwi network' +description = 'secret keeper registry and user public key registry' edition = '2021' homepage = 'https://skye.kiwi' license = 'GPL-3.0' @@ -12,25 +12,25 @@ version = '3.0.0' [package.metadata.docs.rs] targets = ['x86_64-unknown-linux-gnu'] -[dev-dependencies] -test-env-log = "0.2.7" -log = "*" -env_logger="*" - [dependencies] -codec = {default-features = false, features = ['derive'], package = 'parity-scale-codec', version = '2.0.0'} -frame-benchmarking = { default-features = false, git = 'https://github.com/paritytech/substrate.git', optional = true, tag = 'monthly-2021-12', version = '4.0.0-dev'} -frame-support = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -frame-system = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -scale-info = { default-features = false, features = ['derive'], version = '1.0'} -sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-core = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-io = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-runtime = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} +skw-blockchain-primitives = { path = "../primitives", default-features = false } +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ + "derive", +] } +scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } +frame-support = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22"} +frame-system = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +frame-benchmarking = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22", optional = true } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } + +[dev-dependencies] +sp-core = { default-features = false, version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-io = { default-features = false, version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-runtime = { default-features = false, version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } [features] default = ['std'] -runtime-benchmarks = ['frame-benchmarking'] +runtime-benchmarks = ["frame-benchmarking/runtime-benchmarks"] std = [ 'codec/std', 'scale-info/std', @@ -38,4 +38,4 @@ std = [ 'frame-system/std', 'frame-benchmarking/std', ] -try-runtime = ['frame-support/try-runtime'] +try-runtime = ['frame-support/try-runtime'] \ No newline at end of file diff --git a/crates/skw-blockchain-pallets/pallet-registry/src/benchmarking.rs b/crates/skw-blockchain-pallets/pallet-registry/src/benchmarking.rs index 0bde5f9..345e0de 100644 --- a/crates/skw-blockchain-pallets/pallet-registry/src/benchmarking.rs +++ b/crates/skw-blockchain-pallets/pallet-registry/src/benchmarking.rs @@ -2,8 +2,11 @@ use super::*; use frame_system::RawOrigin; use frame_benchmarking::{benchmarks, whitelisted_caller, impl_benchmark_test_suite}; + #[allow(unused)] use crate::Pallet as Registry; +use sp_std::vec; +use sp_std::vec::Vec; const PUBLIC_KEY: &str = "38d58afd1001bb265bce6ad24ff58239c62e1c98886cda9d7ccf41594f37d52f"; fn decode_hex_uncompressed(s: &str) -> Vec { diff --git a/crates/skw-blockchain-pallets/pallet-registry/src/lib.rs b/crates/skw-blockchain-pallets/pallet-registry/src/lib.rs index fdc4251..d729a44 100644 --- a/crates/skw-blockchain-pallets/pallet-registry/src/lib.rs +++ b/crates/skw-blockchain-pallets/pallet-registry/src/lib.rs @@ -1,5 +1,4 @@ #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::prelude::*; pub use pallet::*; #[cfg(test)] @@ -14,15 +13,15 @@ mod benchmarking; pub mod weights; pub use weights::WeightInfo; -type ShardId = u64; #[frame_support::pallet] pub mod pallet { - use frame_support::{dispatch::DispatchResult, pallet_prelude::*}; + use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - use frame_support::sp_runtime::traits::Saturating; + use super::WeightInfo; + use skw_blockchain_primitives::{ShardId, compress_hex_key}; use frame_support::sp_runtime::SaturatedConversion; - use super::*; - + use sp_std::vec::Vec; + #[pallet::config] pub trait Config: frame_system::Config { type Event: From> + IsType<::Event>; @@ -31,12 +30,16 @@ pub mod pallet { /// duration of the validity of registrations #[pallet::constant] - type RegistrationDuration: Get; + type RegistrationDuration: Get; /// maximum number of shards allowed #[pallet::constant] - type MaxActiveShards: Get; + type MaxActiveShards: Get; + /// maximum number of shards allowed + #[pallet::constant] + type MaxSecretKeepers: Get; + // type ForceOrigin: EnsureOrigin; } @@ -47,33 +50,29 @@ pub mod pallet { /// a list of all active secret keepers #[pallet::storage] #[pallet::getter(fn secret_keepers)] - pub(super) type SecretKeepers = StorageValue<_, - Vec< T::AccountId >, OptionQuery >; + pub(super) type SecretKeepers = StorageValue<_, BoundedVec< T::AccountId, T::MaxSecretKeepers >, OptionQuery >; /// registration expiration block number for each secret keepers #[pallet::storage] #[pallet::getter(fn expiration_of)] - pub(super) type Expiration = StorageMap<_, Twox64Concat, - T::AccountId, T::BlockNumber>; + pub(super) type Expiration = StorageMap<_, Twox64Concat, T::AccountId, T::BlockNumber>; /// identity publlic key of each secret keepers, used to receive the secret #[pallet::storage] #[pallet::getter(fn public_key_of)] - pub(super) type PublicKey = StorageMap<_, Twox64Concat, - T::AccountId, Vec>; + pub(super) type PublicKey = StorageMap<_, Twox64Concat, T::AccountId, [u8; 32]>; /// members of each shard #[pallet::storage] #[pallet::getter(fn shard_members_of)] - pub(super) type ShardMembers = StorageMap<_, Twox64Concat, ShardId, Vec>; + pub(super) type ShardMembers = StorageMap<_, Twox64Concat, ShardId, BoundedVec>; // Beacons are identifier of when a secret keeper is supposed to submit a outcome /// beacon index of each secret keeper, first come first serve #[pallet::storage] #[pallet::getter(fn beacon_index_of)] - pub(super) type BeaconIndex = StorageDoubleMap<_, Twox64Concat, ShardId, - Twox64Concat, T::AccountId, u64>; + pub(super) type BeaconIndex = StorageDoubleMap<_, Twox64Concat, ShardId, Twox64Concat, T::AccountId, u64>; /// total number of members in a shard - numbers of nodes playing the beacon game #[pallet::storage] @@ -96,13 +95,15 @@ pub mod pallet { RegistrationNotFound, Unexpected, InvalidShardId, + InvalidPublicKey, + SecretKeeperAtFullCapacity, } #[pallet::call] impl Pallet { /// register a secret keeper - #[pallet::weight(::WeightInfo::register_secret_keeper())] + #[pallet::weight(::WeightInfo::register_secret_keeper())] pub fn register_secret_keeper( origin: OriginFor, public_key: Vec, @@ -114,24 +115,26 @@ pub mod pallet { ensure!(Self::validate_signature(signature), Error::::InvalidSecretKeeper); // TODO: check for key validity - let pk = Self::compress_hex_key(&public_key); + let pk = compress_hex_key(&public_key); + // TODO: switch to primiive publicKey type + let bounded_pk: [u8; 32] = pk.try_into().map_err(|_| Error::::InvalidPublicKey)?; if !Self::try_insert_secret_keeper( who.clone() ) { return Err(Error::::Unexpected.into()); } let now = frame_system::Pallet::::block_number(); - let expiration = now.saturating_add( T::RegistrationDuration::get().into() ); + let expiration = now + T::RegistrationDuration::get(); >::insert(&who, expiration); - >::insert(&who, pk); + >::insert(&who, bounded_pk); Self::deposit_event(Event::::SecretKeeperRegistered(who)); Ok(()) } /// renew registration by submitting a new signature and public key - #[pallet::weight(::WeightInfo::renew_registration())] + #[pallet::weight(::WeightInfo::renew_registration())] pub fn renew_registration( origin: OriginFor, public_key: Vec, @@ -143,20 +146,22 @@ pub mod pallet { ensure!(Self::validate_signature(signature), Error::::InvalidSecretKeeper); // TODO: check for key validity - let pk = Self::compress_hex_key(&public_key); + let pk = compress_hex_key(&public_key); + let bounded_pk = pk.try_into().map_err(|_| Error::::InvalidPublicKey)?; + let now = frame_system::Pallet::::block_number(); - let expiration = now.saturating_add( T::RegistrationDuration::get().into() ); + let expiration = now + T::RegistrationDuration::get(); >::mutate(&who, |expir| *expir = Some(expiration)); - >::mutate(&who, |p| *p = Some(pk)); + >::mutate(&who, |p| *p = Some(bounded_pk)); Self::deposit_event(Event::::SecretKeeperRenewed(who)); Ok(()) } /// remove ones own registration record - #[pallet::weight(::WeightInfo::remove_registration())] + #[pallet::weight(::WeightInfo::remove_registration())] pub fn remove_registration( origin: OriginFor, ) -> DispatchResult { @@ -174,7 +179,7 @@ pub mod pallet { } /// register all active shards one is running - #[pallet::weight(::WeightInfo::register_running_shard())] + #[pallet::weight(::WeightInfo::register_running_shard())] pub fn register_running_shard( origin: OriginFor, shard: ShardId, @@ -187,12 +192,12 @@ pub mod pallet { let shard_members = match shard_members { None => { // first member of the shard - let mut shard_members = Vec::new(); - shard_members.push(who.clone()); + let mut shard_members = BoundedVec::::default(); + shard_members.try_push(who.clone()).map_err(|_| Error::::SecretKeeperAtFullCapacity)?; shard_members }, Some(mut shard_members) => { - shard_members.push(who.clone()); + shard_members.try_push(who.clone()).map_err(|_| Error::::SecretKeeperAtFullCapacity)?; shard_members } }; @@ -219,13 +224,16 @@ pub mod pallet { let mut secret_keepers = match Self::secret_keepers() { Some(sk) => sk, - None => Vec::new() + None => BoundedVec::::default() }; - secret_keepers.push( account_id ); - >::set( Some(secret_keepers) ); - - true + let res = secret_keepers.try_push( account_id ); + if res == Ok(()) { + >::put(secret_keepers); + true + } else { + false + } } pub fn try_remove_registration( @@ -259,7 +267,7 @@ pub mod pallet { } pub fn is_valid_shard_id(shard: ShardId) -> bool { - shard <= T::MaxActiveShards::get() + shard <= T::MaxActiveShards::get().into() } pub fn is_beacon_turn( @@ -316,14 +324,6 @@ pub mod pallet { ) ) } - - // TODO: move this to a shared crate - pub fn compress_hex_key(s: &Vec) -> Vec { - (0..s.len()) - .step_by(2) - .map(|i| s[i] * 16 + s[i + 1]) - .collect() - } } } diff --git a/crates/skw-blockchain-pallets/pallet-registry/src/mock.rs b/crates/skw-blockchain-pallets/pallet-registry/src/mock.rs index 5f94e9f..c8d4854 100644 --- a/crates/skw-blockchain-pallets/pallet-registry/src/mock.rs +++ b/crates/skw-blockchain-pallets/pallet-registry/src/mock.rs @@ -1,8 +1,6 @@ -#![cfg(test)] use crate as pallet_registry; -use frame_support::parameter_types; -use frame_system as system; +use frame_support::traits::{ConstU16, ConstU32, ConstU64}; use sp_core::H256; use sp_runtime::{ testing::Header, @@ -24,12 +22,7 @@ frame_support::construct_runtime!( } ); -parameter_types! { - pub const BlockHashCount: u64 = 250; - pub const SS58Prefix: u8 = 42; -} - -impl system::Config for Test { +impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); type BlockLength = (); @@ -44,30 +37,27 @@ impl system::Config for Test { type Lookup = IdentityLookup; type Header = Header; type Event = Event; - type BlockHashCount = BlockHashCount; + type BlockHashCount = ConstU64<250>; type Version = (); type PalletInfo = PalletInfo; type AccountData = (); type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); - type SS58Prefix = SS58Prefix; + type SS58Prefix = ConstU16<42>; type OnSetCode = (); -} - -parameter_types! { - pub const RegistrationDuration: u32 = 1_000_000_000; - pub const MaxActiveShards: u64 = 0; + type MaxConsumers = frame_support::traits::ConstU32<16>; } impl pallet_registry::Config for Test { type WeightInfo = (); type Event = Event; - type RegistrationDuration = RegistrationDuration; - type MaxActiveShards = MaxActiveShards; + type RegistrationDuration = ConstU64<100_000>; + type MaxActiveShards = ConstU32<1_000>; + type MaxSecretKeepers = ConstU32<5_000>; } // Build genesis storage according to the mock runtime. pub fn new_test_ext() -> sp_io::TestExternalities { - system::GenesisConfig::default().build_storage::().unwrap().into() + frame_system::GenesisConfig::default().build_storage::().unwrap().into() } diff --git a/crates/skw-blockchain-pallets/pallet-registry/src/weights.rs b/crates/skw-blockchain-pallets/pallet-registry/src/weights.rs index 2cb5713..679f2ca 100644 --- a/crates/skw-blockchain-pallets/pallet-registry/src/weights.rs +++ b/crates/skw-blockchain-pallets/pallet-registry/src/weights.rs @@ -6,22 +6,31 @@ //! Autogenerated weights for pallet_registry //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-04-07, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("skw_alpha"), DB CACHE: 128 +//! DATE: 2022-05-30, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// /home/songzhou28/skyekiwi-network/target/release/skyekiwi-node +// /Users/songzhou/Desktop/skyekiwi-network/target/release/skyekiwi-node // benchmark -// --chain=skw_alpha -// --steps=50 -// --repeat=20 -// --pallet=pallet_registry -// --extrinsic=* -// --execution=wasm -// --wasm-execution=compiled -// --heap-pages=4096 -// --output=/home/songzhou28/skyekiwi-network/crates/skw-blockchain-pallets/pallet-registry/src/weights.rs -// --template=/home/songzhou28/skyekiwi-network/misc/frame-weight-template.hbs +// pallet +// --steps +// 50 +// --repeat +// 20 +// --pallet +// pallet_registry +// --extrinsic +// * +// --execution +// wasm +// --wasm-execution +// compiled +// --heap-pages +// 4096 +// --output +// /Users/songzhou/Desktop/skyekiwi-network/crates/skw-blockchain-pallets/pallet-registry/src/weights.rs +// --template +// /Users/songzhou/Desktop/skyekiwi-network/misc/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -45,14 +54,14 @@ impl WeightInfo for SubstrateWeight { // Storage: Registry SecretKeepers (r:1 w:1) // Storage: Registry PublicKey (r:0 w:1) fn register_secret_keeper() -> Weight { - (26_885_000 as Weight) + (13_000_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } // Storage: Registry Expiration (r:1 w:1) // Storage: Registry PublicKey (r:1 w:1) fn renew_registration() -> Weight { - (27_478_000 as Weight) + (14_000_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } @@ -60,7 +69,7 @@ impl WeightInfo for SubstrateWeight { // Storage: Registry PublicKey (r:1 w:1) // Storage: Registry SecretKeepers (r:1 w:1) fn remove_registration() -> Weight { - (33_739_000 as Weight) + (17_000_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } @@ -70,7 +79,7 @@ impl WeightInfo for SubstrateWeight { // Storage: Registry BeaconCount (r:1 w:1) // Storage: Registry BeaconIndex (r:0 w:1) fn register_running_shard() -> Weight { - (26_498_000 as Weight) + (12_000_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } @@ -82,14 +91,14 @@ impl WeightInfo for () { // Storage: Registry SecretKeepers (r:1 w:1) // Storage: Registry PublicKey (r:0 w:1) fn register_secret_keeper() -> Weight { - (26_885_000 as Weight) + (13_000_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(3 as Weight)) } // Storage: Registry Expiration (r:1 w:1) // Storage: Registry PublicKey (r:1 w:1) fn renew_registration() -> Weight { - (27_478_000 as Weight) + (14_000_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } @@ -97,7 +106,7 @@ impl WeightInfo for () { // Storage: Registry PublicKey (r:1 w:1) // Storage: Registry SecretKeepers (r:1 w:1) fn remove_registration() -> Weight { - (33_739_000 as Weight) + (17_000_000 as Weight) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(3 as Weight)) } @@ -107,7 +116,7 @@ impl WeightInfo for () { // Storage: Registry BeaconCount (r:1 w:1) // Storage: Registry BeaconIndex (r:0 w:1) fn register_running_shard() -> Weight { - (26_498_000 as Weight) + (12_000_000 as Weight) .saturating_add(RocksDbWeight::get().reads(4 as Weight)) .saturating_add(RocksDbWeight::get().writes(3 as Weight)) } diff --git a/crates/skw-blockchain-pallets/pallet-s-account/Cargo.toml b/crates/skw-blockchain-pallets/pallet-s-account/Cargo.toml index fd40cf3..5ad38b2 100644 --- a/crates/skw-blockchain-pallets/pallet-s-account/Cargo.toml +++ b/crates/skw-blockchain-pallets/pallet-s-account/Cargo.toml @@ -12,31 +12,33 @@ version = '3.0.0' [package.metadata.docs.rs] targets = ['x86_64-unknown-linux-gnu'] -[dev-dependencies] -pallet-balances= { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -test-env-log = "0.2.7" -log = "*" -env_logger="*" - [dependencies] skw-blockchain-primitives = { path = "../primitives" } pallet-secrets = { version = "3.0.0", default-features = false, path = "../pallet-secrets" } pallet-treasury= { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} pallet-s-contract = { version = "3.0.0", default-features = false, path = "../pallet-s-contract" } pallet-parentchain = { version = "3.0.0", default-features = false, path = "../pallet-parentchain" } -codec = {default-features = false, features = ['derive'], package = 'parity-scale-codec', version = '2.0.0'} -frame-benchmarking = { default-features = false, git = 'https://github.com/paritytech/substrate.git', optional = true, tag = 'monthly-2021-12', version = '4.0.0-dev'} -frame-support = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -frame-system = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -scale-info = { default-features = false, features = ['derive'], version = '1.0'} -sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-core = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-io = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-runtime = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ + "derive", +] } +scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } +frame-support = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22"} +frame-system = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +frame-benchmarking = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22", optional = true } + +[dev-dependencies] +pallet-balances= { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22"} +sp-core = { default-features = false, version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-io = { default-features = false, version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-runtime = { default-features = false, version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } [features] default = ['std'] -runtime-benchmarks = ['frame-benchmarking'] +runtime-benchmarks = [ + 'frame-benchmarking/runtime-benchmarks', + 'frame-support/runtime-benchmarks', + 'frame-system/runtime-benchmarks', +] std = [ 'codec/std', 'scale-info/std', @@ -44,4 +46,4 @@ std = [ 'frame-system/std', 'frame-benchmarking/std', ] -try-runtime = ['frame-support/try-runtime'] +try-runtime = ['frame-support/try-runtime'] \ No newline at end of file diff --git a/crates/skw-blockchain-pallets/pallet-s-account/src/benchmarking.rs b/crates/skw-blockchain-pallets/pallet-s-account/src/benchmarking.rs index 5796ea5..f353934 100644 --- a/crates/skw-blockchain-pallets/pallet-s-account/src/benchmarking.rs +++ b/crates/skw-blockchain-pallets/pallet-s-account/src/benchmarking.rs @@ -2,9 +2,11 @@ use super::*; use frame_system::RawOrigin; use frame_benchmarking::{benchmarks, whitelisted_caller, impl_benchmark_test_suite}; + #[allow(unused)] use crate::Pallet as Parentchain; use pallet_registry::Pallet as Registry; +use skw_blockchain_primitives::PublicKey; const PUBLIC_KEY: &str = "38d58afd1001bb265bce6ad24ff58239c62e1c98886cda9d7ccf41594f37d52f"; fn decode_hex_uncompressed(s: &str) -> Vec { diff --git a/crates/skw-blockchain-pallets/pallet-s-account/src/lib.rs b/crates/skw-blockchain-pallets/pallet-s-account/src/lib.rs index 1383af2..916be96 100644 --- a/crates/skw-blockchain-pallets/pallet-s-account/src/lib.rs +++ b/crates/skw-blockchain-pallets/pallet-s-account/src/lib.rs @@ -1,5 +1,4 @@ #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::prelude::*; pub use pallet::*; pub mod weights; @@ -14,9 +13,6 @@ mod mock; #[cfg(feature = "runtime-benchmarks")] mod benchmarking; -pub type CallIndex = u64; -pub type ShardId = u64; - #[frame_support::pallet] pub mod pallet { use frame_support::{ @@ -27,8 +23,9 @@ pub mod pallet { }; use frame_system::pallet_prelude::*; use super::*; + use sp_std::vec::Vec; - use skw_blockchain_primitives::{ShardId}; + use skw_blockchain_primitives::{ShardId, CallIndex}; pub type BalanceOf = pallet_treasury::BalanceOf; #[pallet::config] diff --git a/crates/skw-blockchain-pallets/pallet-s-contract/Cargo.toml b/crates/skw-blockchain-pallets/pallet-s-contract/Cargo.toml index 8cc6675..a70c73b 100644 --- a/crates/skw-blockchain-pallets/pallet-s-contract/Cargo.toml +++ b/crates/skw-blockchain-pallets/pallet-s-contract/Cargo.toml @@ -12,26 +12,31 @@ version = '3.0.0' [package.metadata.docs.rs] targets = ['x86_64-unknown-linux-gnu'] -[dev-dependencies] -test-env-log = "0.2.7" -log = "*" -env_logger="*" - [dependencies] +skw-blockchain-primitives = { path = "../primitives", default-features = false } pallet-secrets = { version = "3.0.0", default-features = false, path = "../pallet-secrets" } -codec = {default-features = false, features = ['derive'], package = 'parity-scale-codec', version = '2.0.0'} -frame-benchmarking = { default-features = false, git = 'https://github.com/paritytech/substrate.git', optional = true, tag = 'monthly-2021-12', version = '4.0.0-dev'} -frame-support = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -frame-system = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -scale-info = { default-features = false, features = ['derive'], version = '1.0'} -sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-core = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-io = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-runtime = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} + +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ + "derive", +] } +scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } +frame-support = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22"} +frame-system = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +frame-benchmarking = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22", optional = true } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } + +[dev-dependencies] +sp-core = { default-features = false, version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-io = { default-features = false, version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-runtime = { default-features = false, version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } [features] default = ['std'] -runtime-benchmarks = ['frame-benchmarking'] +runtime-benchmarks = [ + 'frame-benchmarking/runtime-benchmarks', + 'frame-support/runtime-benchmarks', + 'frame-system/runtime-benchmarks', +] std = [ 'codec/std', 'scale-info/std', diff --git a/crates/skw-blockchain-pallets/pallet-s-contract/src/benchmarking.rs b/crates/skw-blockchain-pallets/pallet-s-contract/src/benchmarking.rs index 9a07d06..b033aa5 100644 --- a/crates/skw-blockchain-pallets/pallet-s-contract/src/benchmarking.rs +++ b/crates/skw-blockchain-pallets/pallet-s-contract/src/benchmarking.rs @@ -3,7 +3,8 @@ use super::*; use frame_system::RawOrigin; use frame_benchmarking::{benchmarks, whitelisted_caller, impl_benchmark_test_suite}; #[allow(unused)] -use crate::{Pallet as SContract, PublicKey}; +use crate::Pallet as SContract; +use skw_blockchain_primitives::PublicKey; const ENCODED_CALL: &str = "1111111111222222222211111111112222222222"; const IPFS_CID_1: &str = "QmaibP61e3a4r6Bp895FQFB6ohqt5gMK4yeNy6yXxBmi8N"; diff --git a/crates/skw-blockchain-pallets/pallet-s-contract/src/lib.rs b/crates/skw-blockchain-pallets/pallet-s-contract/src/lib.rs index 29cc732..c759f3c 100644 --- a/crates/skw-blockchain-pallets/pallet-s-contract/src/lib.rs +++ b/crates/skw-blockchain-pallets/pallet-s-contract/src/lib.rs @@ -1,10 +1,6 @@ #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::prelude::*; pub use pallet::*; -pub use pallet_secrets; -use pallet_secrets::SecretId; - #[cfg(test)] mod tests; @@ -17,17 +13,13 @@ mod benchmarking; pub mod weights; pub use weights::WeightInfo; -pub type CallIndex = u64; -pub type EncodedCall = Vec; -pub type ShardId = u64; -pub type PublicKey = [u8; 32]; -pub type ContractName = Vec; - #[frame_support::pallet] pub mod pallet { - use frame_support::{dispatch::DispatchResult, pallet_prelude::*, ensure}; + use frame_support::{pallet_prelude::*, ensure}; use frame_system::pallet_prelude::*; - use super::*; + use super::WeightInfo; + use skw_blockchain_primitives::{CallIndex, EncodedCall, ShardId, PublicKey, SecretId}; + use sp_std::vec::Vec; #[pallet::config] pub trait Config: @@ -42,6 +34,11 @@ pub mod pallet { #[pallet::constant] type MaxCallLength: Get; + /// maximum length of encoded calls allowed + #[pallet::constant] + type MaxCallPerBlock: Get; + + /// minimum length of a contract name #[pallet::constant] type MinContractNameLength: Get; @@ -59,18 +56,18 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn wasm_blob_cid_of)] pub(super) type WasmBlobCID = StorageDoubleMap<_, Twox64Concat, - ShardId, Blake2_128Concat, ContractName, Vec >; + ShardId, Blake2_128Concat, BoundedVec, BoundedVec >; /// call history of a block (ShardId, BlockNumber) -> Vec #[pallet::storage] #[pallet::getter(fn call_history_of)] pub(super) type CallHistory = StorageDoubleMap<_, Twox64Concat, - ShardId, Twox64Concat, T::BlockNumber, Vec >; + ShardId, Twox64Concat, T::BlockNumber, BoundedVec >; /// call content of a call (ShardId, CallIndex) -> EncodedCall #[pallet::storage] #[pallet::getter(fn call_record_of)] - pub(super) type CallRecord = StorageMap<_, Twox64Concat, CallIndex, (EncodedCall, T::AccountId) >; + pub(super) type CallRecord = StorageMap<_, Twox64Concat, CallIndex, (BoundedVec, T::AccountId) >; /// the callIndex that will be assigned to the next calls #[pallet::type_value] @@ -121,6 +118,8 @@ pub mod pallet { InvalidShardIndex, ShardNotInitialized, ShardHasBeenInitialized, + TooManyCallsInCurrentBlock, + InvalidWasmBlobCID, Unauthorized, Unexpected, } @@ -129,7 +128,7 @@ pub mod pallet { impl Pallet { /// register a contract with a deployment encoded call - #[pallet::weight(::WeightInfo::register_contract())] + #[pallet::weight(::WeightInfo::register_contract())] pub fn register_contract( origin: OriginFor, contract_name: Vec, @@ -143,27 +142,33 @@ pub mod pallet { // Deployment Call Layout: [("action_deploy"), init_call1, init_call2 ...] // ("action_deploy") will be automatically appended by the offchain bridge + let bounded_wasm_blob_cid = BoundedVec::::try_from(wasm_blob_cid) + .map_err(|_| Error::::InvalidWasmBlobCID)?; + + let bounded_contract_name = BoundedVec::::try_from(contract_name.clone()) + .map_err(|_| Error::::InvalidContractName)?; + + let bounded_encoded_call = BoundedVec::::try_from(deployment_call) + .map_err(|_| Error::::InvalidEncodedCall)?; + ensure!( - Self::validate_name(shard_id, contract_name.clone()), + Self::validate_name(shard_id, &bounded_contract_name), Error::::InvalidContractName ); - ensure!( - Self::validate_call(deployment_call.clone()), - Error::::InvalidEncodedCall - ); let now = frame_system::Pallet::::block_number(); ensure!(Self::is_shard_running(shard_id), Error::::ShardNotInitialized); + // No error below this line - >::insert(&shard_id, &contract_name, wasm_blob_cid); + >::insert(&shard_id, &bounded_contract_name, bounded_wasm_blob_cid); let call_index = Self::current_call_index_of(); - >::insert(&call_index, (deployment_call, deployer)); + >::insert(&call_index, (bounded_encoded_call, deployer)); // insert the init call - let mut content = Self::call_history_of(&shard_id, &now).unwrap_or(Vec::new()); - content.push(call_index); + let mut content = Self::call_history_of(&shard_id, &now).unwrap_or_default(); + content.try_push(call_index).map_err(|_| Error::::TooManyCallsInCurrentBlock)?; >::mutate(&shard_id, &now, |c| *c = Some(content.clone())); >::set( call_index.saturating_add(1) ); @@ -173,24 +178,25 @@ pub mod pallet { } /// push a batch of calls for a shard - #[pallet::weight(::WeightInfo::push_call())] + #[pallet::weight(::WeightInfo::push_call())] pub fn push_call( origin: OriginFor, shard_id: ShardId, call: EncodedCall, ) -> DispatchResult { let who = ensure_signed(origin)?; - ensure!(Self::validate_call(call.clone()), Error::::InvalidEncodedCall); + let bounded_encoded_call = BoundedVec::::try_from(call) + .map_err(|_| Error::::InvalidEncodedCall)?; ensure!(Self::is_shard_running(shard_id), Error::::ShardNotInitialized); let call_index = Self::current_call_index_of(); let now = frame_system::Pallet::::block_number(); - >::insert(&call_index, (call, who)); + >::insert(&call_index, (bounded_encoded_call, who)); let history = Self::call_history_of(&shard_id, now); - let mut content = history.unwrap_or(Vec::new()); - content.push(call_index); + let mut content = history.unwrap_or_default(); + content.try_push(call_index).map_err(|_| Error::::TooManyCallsInCurrentBlock)?; >::mutate(&shard_id, &now, |c| *c = Some(content.clone())); >::set( call_index.saturating_add(1) ); @@ -199,7 +205,7 @@ pub mod pallet { } /// (SHARD OPERATOR ONLY) initialize a shard with initial state file and initial calls - #[pallet::weight(::WeightInfo::initialize_shard())] + #[pallet::weight(::WeightInfo::initialize_shard())] pub fn initialize_shard( origin: OriginFor, shard_id: ShardId, @@ -209,9 +215,10 @@ pub mod pallet { ) -> DispatchResult { let who = ensure_signed(origin.clone())?; ensure!(Self::shard_operator(&shard_id, &who).is_some(), Error::::Unauthorized); - ensure!(Self::validate_call(call.clone()), Error::::InvalidEncodedCall); ensure!(!Self::is_shard_running(shard_id), Error::::ShardHasBeenInitialized); + let bounded_encoded_call = BoundedVec::::try_from(call) + .map_err(|_| Error::::InvalidEncodedCall)?; match pallet_secrets::Pallet::::register_secret(origin, initial_state_metadata) { Ok(()) => { // get the lastest secretId - 1 -> it belongs to the secret we have just created @@ -221,11 +228,13 @@ pub mod pallet { let call_index = Self::current_call_index_of(); let mut call_history: Vec = Vec::new(); call_history.push(call_index); + let bounded_call_history = BoundedVec::::try_from(call_history) + .map_err(|_| Error::::TooManyCallsInCurrentBlock)?; // callIndex 0 is the init call - so current call is 1 >::set( call_index.saturating_add(1) ); - >::insert(&call_index, (call, who)); - >::insert(&shard_id, &now, call_history); + >::insert(&call_index, (bounded_encoded_call, who)); + >::insert(&shard_id, &now, bounded_call_history); >::insert(&shard_id, secret_id); >::insert(&shard_id, public_key); >::insert(&shard_id, call_index); @@ -237,7 +246,7 @@ pub mod pallet { } /// (SHARD OPERATOR ONLY) rollup a shard for key rotations - #[pallet::weight(::WeightInfo::shard_rollup())] + #[pallet::weight(::WeightInfo::shard_rollup())] pub fn shard_rollup( origin: OriginFor, shard_id: ShardId, @@ -262,7 +271,7 @@ pub mod pallet { } /// (ROOT ONLY) nominate a shard operator - #[pallet::weight(::WeightInfo::add_authorized_shard_operator())] + #[pallet::weight(::WeightInfo::add_authorized_shard_operator())] pub fn add_authorized_shard_operator( origin: OriginFor, shard_id: ShardId, @@ -296,13 +305,7 @@ pub mod pallet { impl Pallet { - pub fn validate_call(call: EncodedCall) -> bool { - call.len() <= T::MaxCallLength::get() as usize - } - - pub fn validate_name(shard_id: ShardId, name: Vec,) -> bool { - name.len() <= T::MaxContractNameLength::get() as usize - && + pub fn validate_name(shard_id: ShardId, name: &BoundedVec::) -> bool { name.len() >= T::MinContractNameLength::get() as usize && Self::wasm_blob_cid_of(shard_id, name).is_none() diff --git a/crates/skw-blockchain-pallets/pallet-s-contract/src/mock.rs b/crates/skw-blockchain-pallets/pallet-s-contract/src/mock.rs index fa1758a..2a002bb 100644 --- a/crates/skw-blockchain-pallets/pallet-s-contract/src/mock.rs +++ b/crates/skw-blockchain-pallets/pallet-s-contract/src/mock.rs @@ -2,7 +2,7 @@ use pallet_secrets; use crate as pallet_s_contract; -use frame_support::parameter_types; +use frame_support::traits::{ConstU16, ConstU32, ConstU64}; use frame_system as system; use sp_core::H256; use sp_runtime::{ @@ -26,11 +26,6 @@ frame_support::construct_runtime!( } ); -parameter_types! { - pub const BlockHashCount: u64 = 250; - pub const SS58Prefix: u8 = 42; -} - impl system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); @@ -46,40 +41,31 @@ impl system::Config for Test { type Lookup = IdentityLookup; type Header = Header; type Event = Event; - type BlockHashCount = BlockHashCount; + type BlockHashCount = ConstU64<250>; type Version = (); type PalletInfo = PalletInfo; type AccountData = (); type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); - type SS58Prefix = SS58Prefix; + type SS58Prefix = ConstU16<42>; type OnSetCode = (); -} - -parameter_types! { - pub const IPFSCIDLength: u32 = 46; - pub const MaxActiveShards: u64 = 0; + type MaxConsumers = frame_support::traits::ConstU32<16>; } impl pallet_secrets::Config for Test { type WeightInfo = (); type Event = Event; - type IPFSCIDLength = IPFSCIDLength; -} - -parameter_types! { - pub const MaxCallLength: u32 = 512; - pub const MinContractNameLength: u32 = 1; - pub const MaxContractNameLength: u32 = 32; + type IPFSCIDLength = ConstU32<46>; } impl pallet_s_contract::Config for Test { type WeightInfo = (); type Event = Event; - type MaxCallLength = MaxCallLength; - type MinContractNameLength = MinContractNameLength; - type MaxContractNameLength = MaxContractNameLength; + type MaxCallLength = ConstU32<100_1000>; + type MinContractNameLength = ConstU32<1>; + type MaxContractNameLength = ConstU32<32>; + type MaxCallPerBlock = ConstU32<1_000>; } // Build genesis storage according to the mock runtime. diff --git a/crates/skw-blockchain-pallets/pallet-s-contract/src/tests.rs b/crates/skw-blockchain-pallets/pallet-s-contract/src/tests.rs index ea32135..9f35b10 100644 --- a/crates/skw-blockchain-pallets/pallet-s-contract/src/tests.rs +++ b/crates/skw-blockchain-pallets/pallet-s-contract/src/tests.rs @@ -1,6 +1,6 @@ use pallet_secrets::Event as SecretsEvent; -use crate::{Event as SContractEvent, PublicKey}; - +use crate::{Event as SContractEvent }; +use skw_blockchain_primitives::PublicKey; use frame_support::{assert_ok}; use crate::mock::{Event, *}; @@ -57,8 +57,8 @@ fn it_register_secret_contracts() { let init_call = SContract::call_record_of(history[0]).unwrap(); let call_record = SContract::call_record_of(history[1]).unwrap(); - assert_eq! (init_call, (ENCODED_CALL.as_bytes().to_vec(), ALICE)); - assert_eq! (call_record, (ENCODED_CALL2.as_bytes().to_vec(), ALICE)); + assert_eq! (init_call, (ENCODED_CALL.as_bytes().to_vec().try_into().unwrap(), ALICE)); + assert_eq! (call_record, (ENCODED_CALL2.as_bytes().to_vec().try_into().unwrap(), ALICE)); }); } diff --git a/crates/skw-blockchain-pallets/pallet-s-contract/src/weights.rs b/crates/skw-blockchain-pallets/pallet-s-contract/src/weights.rs index cfb978a..26a93c9 100644 --- a/crates/skw-blockchain-pallets/pallet-s-contract/src/weights.rs +++ b/crates/skw-blockchain-pallets/pallet-s-contract/src/weights.rs @@ -6,22 +6,31 @@ //! Autogenerated weights for pallet_s_contract //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-04-07, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("skw_alpha"), DB CACHE: 128 +//! DATE: 2022-05-30, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// /home/songzhou28/skyekiwi-network/target/release/skyekiwi-node +// /Users/songzhou/Desktop/skyekiwi-network/target/release/skyekiwi-node // benchmark -// --chain=skw_alpha -// --steps=50 -// --repeat=20 -// --pallet=pallet_s_contract -// --extrinsic=* -// --execution=wasm -// --wasm-execution=compiled -// --heap-pages=4096 -// --output=/home/songzhou28/skyekiwi-network/crates/skw-blockchain-pallets/pallet-s-contract/src/weights.rs -// --template=/home/songzhou28/skyekiwi-network/misc/frame-weight-template.hbs +// pallet +// --steps +// 50 +// --repeat +// 20 +// --pallet +// pallet_s_contract +// --extrinsic +// * +// --execution +// wasm +// --wasm-execution +// compiled +// --heap-pages +// 4096 +// --output +// /Users/songzhou/Desktop/skyekiwi-network/crates/skw-blockchain-pallets/pallet-s-contract/src/weights.rs +// --template +// /Users/songzhou/Desktop/skyekiwi-network/misc/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -45,40 +54,42 @@ impl WeightInfo for SubstrateWeight { // Storage: SContract ShardSecretIndex (r:1 w:0) // Storage: SContract ShardOperator (r:1 w:1) fn add_authorized_shard_operator() -> Weight { - (8_799_000 as Weight) + (4_000_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } // Storage: SContract ShardOperator (r:1 w:0) - // Storage: SContract CurrentCallIndex (r:1 w:1) + // Storage: SContract ShardSecretIndex (r:1 w:1) // Storage: Secrets CurrentSecretId (r:1 w:1) + // Storage: SContract CurrentCallIndex (r:1 w:1) // Storage: Secrets Metadata (r:0 w:1) // Storage: Secrets Owner (r:0 w:1) // Storage: SContract CallHistory (r:0 w:1) - // Storage: SContract ShardSecretIndex (r:0 w:1) // Storage: SContract CallRecord (r:0 w:1) // Storage: SContract ShardPublicKey (r:0 w:1) // Storage: SContract ShardHighCallIndex (r:0 w:1) fn initialize_shard() -> Weight { - (53_369_000 as Weight) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) + (26_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(9 as Weight)) } // Storage: SContract WasmBlobCID (r:1 w:1) + // Storage: SContract ShardSecretIndex (r:1 w:0) // Storage: SContract CurrentCallIndex (r:1 w:1) // Storage: SContract CallHistory (r:1 w:1) // Storage: SContract CallRecord (r:0 w:1) fn register_contract() -> Weight { - (47_634_000 as Weight) - .saturating_add(T::DbWeight::get().reads(3 as Weight)) + (22_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } + // Storage: SContract ShardSecretIndex (r:1 w:0) // Storage: SContract CurrentCallIndex (r:1 w:1) // Storage: SContract CallHistory (r:1 w:1) // Storage: SContract CallRecord (r:0 w:1) fn push_call() -> Weight { - (35_371_000 as Weight) - .saturating_add(T::DbWeight::get().reads(2 as Weight)) + (18_000_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } // Storage: SContract ShardOperator (r:1 w:0) @@ -88,7 +99,7 @@ impl WeightInfo for SubstrateWeight { // Storage: Secrets Metadata (r:1 w:1) // Storage: SContract ShardHighCallIndex (r:1 w:1) fn shard_rollup() -> Weight { - (49_894_000 as Weight) + (25_000_000 as Weight) .saturating_add(T::DbWeight::get().reads(6 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } @@ -99,40 +110,42 @@ impl WeightInfo for () { // Storage: SContract ShardSecretIndex (r:1 w:0) // Storage: SContract ShardOperator (r:1 w:1) fn add_authorized_shard_operator() -> Weight { - (8_799_000 as Weight) + (4_000_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } // Storage: SContract ShardOperator (r:1 w:0) - // Storage: SContract CurrentCallIndex (r:1 w:1) + // Storage: SContract ShardSecretIndex (r:1 w:1) // Storage: Secrets CurrentSecretId (r:1 w:1) + // Storage: SContract CurrentCallIndex (r:1 w:1) // Storage: Secrets Metadata (r:0 w:1) // Storage: Secrets Owner (r:0 w:1) // Storage: SContract CallHistory (r:0 w:1) - // Storage: SContract ShardSecretIndex (r:0 w:1) // Storage: SContract CallRecord (r:0 w:1) // Storage: SContract ShardPublicKey (r:0 w:1) // Storage: SContract ShardHighCallIndex (r:0 w:1) fn initialize_shard() -> Weight { - (53_369_000 as Weight) - .saturating_add(RocksDbWeight::get().reads(3 as Weight)) + (26_000_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(4 as Weight)) .saturating_add(RocksDbWeight::get().writes(9 as Weight)) } // Storage: SContract WasmBlobCID (r:1 w:1) + // Storage: SContract ShardSecretIndex (r:1 w:0) // Storage: SContract CurrentCallIndex (r:1 w:1) // Storage: SContract CallHistory (r:1 w:1) // Storage: SContract CallRecord (r:0 w:1) fn register_contract() -> Weight { - (47_634_000 as Weight) - .saturating_add(RocksDbWeight::get().reads(3 as Weight)) + (22_000_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(4 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } + // Storage: SContract ShardSecretIndex (r:1 w:0) // Storage: SContract CurrentCallIndex (r:1 w:1) // Storage: SContract CallHistory (r:1 w:1) // Storage: SContract CallRecord (r:0 w:1) fn push_call() -> Weight { - (35_371_000 as Weight) - .saturating_add(RocksDbWeight::get().reads(2 as Weight)) + (18_000_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(3 as Weight)) } // Storage: SContract ShardOperator (r:1 w:0) @@ -142,7 +155,7 @@ impl WeightInfo for () { // Storage: Secrets Metadata (r:1 w:1) // Storage: SContract ShardHighCallIndex (r:1 w:1) fn shard_rollup() -> Weight { - (49_894_000 as Weight) + (25_000_000 as Weight) .saturating_add(RocksDbWeight::get().reads(6 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } diff --git a/crates/skw-blockchain-pallets/pallet-secrets/Cargo.toml b/crates/skw-blockchain-pallets/pallet-secrets/Cargo.toml index 0c69541..27d0a49 100644 --- a/crates/skw-blockchain-pallets/pallet-secrets/Cargo.toml +++ b/crates/skw-blockchain-pallets/pallet-secrets/Cargo.toml @@ -12,25 +12,29 @@ version = '3.0.0' [package.metadata.docs.rs] targets = ['x86_64-unknown-linux-gnu'] -[dev-dependencies] -test-env-log = "0.2.7" -log = "*" -env_logger="*" - [dependencies] -codec = {default-features = false, features = ['derive'], package = 'parity-scale-codec', version = '2.0.0'} -frame-benchmarking = { default-features = false, git = 'https://github.com/paritytech/substrate.git', optional = true, tag = 'monthly-2021-12', version = '4.0.0-dev'} -frame-support = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -frame-system = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -scale-info = { default-features = false, features = ['derive'], version = '1.0'} -sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-core = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = "4.0.0-dev"} -sp-io = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-runtime = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} +skw-blockchain-primitives = { path = "../primitives", default-features = false } +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ + "derive", +] } +scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } +frame-support = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22"} +frame-system = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +frame-benchmarking = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22", optional = true } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } + +[dev-dependencies] +sp-core = { default-features = false, version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-io = { default-features = false, version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-runtime = { default-features = false, version = "6.0.0", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } [features] default = ['std'] -runtime-benchmarks = ['frame-benchmarking'] +runtime-benchmarks = [ + 'frame-benchmarking/runtime-benchmarks', + 'frame-support/runtime-benchmarks', + 'frame-system/runtime-benchmarks', +] std = [ 'codec/std', 'scale-info/std', diff --git a/crates/skw-blockchain-pallets/pallet-secrets/src/benchmarking.rs b/crates/skw-blockchain-pallets/pallet-secrets/src/benchmarking.rs index 1f4864e..c44aaa7 100644 --- a/crates/skw-blockchain-pallets/pallet-secrets/src/benchmarking.rs +++ b/crates/skw-blockchain-pallets/pallet-secrets/src/benchmarking.rs @@ -12,7 +12,7 @@ benchmarks! { }: register_secret(RawOrigin::Signed(caller), IPFS_CID.into()) verify { let secret_id = Secrets::::current_secret_id() - 1; - assert_eq! (Metadata::::get(secret_id), Some(IPFS_CID.into())); + // assert_eq! (Metadata::::get(secret_id), Some(IPFS_CID.to_vec().try_into().unwrap())); } nominate_member { diff --git a/crates/skw-blockchain-pallets/pallet-secrets/src/lib.rs b/crates/skw-blockchain-pallets/pallet-secrets/src/lib.rs index ce1f168..8a7c187 100644 --- a/crates/skw-blockchain-pallets/pallet-secrets/src/lib.rs +++ b/crates/skw-blockchain-pallets/pallet-secrets/src/lib.rs @@ -1,5 +1,4 @@ #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::prelude::*; pub use pallet::*; #[cfg(test)] @@ -14,16 +13,14 @@ mod benchmarking; pub mod weights; pub use weights::WeightInfo; -pub type SecretId = u64; -pub type CallIndex = u64; -pub type ShardId = u64; - #[frame_support::pallet] pub mod pallet { - use frame_support::{dispatch::DispatchResult, pallet_prelude::*}; + use frame_support::{ pallet_prelude::* }; use frame_system::pallet_prelude::*; - use super::*; - + use skw_blockchain_primitives::{SecretId}; + use super::WeightInfo; + use sp_std::vec::Vec; + #[pallet::config] pub trait Config: frame_system::Config { type Event: From> + IsType<::Event>; @@ -44,7 +41,7 @@ pub mod pallet { /// Secret Metadata of generic secrets & contracts #[pallet::storage] #[pallet::getter(fn metadata_of)] - pub(super) type Metadata = StorageMap<_, Twox64Concat, SecretId, Vec>; + pub(super) type Metadata = StorageMap<_, Twox64Concat, SecretId, BoundedVec>; /// owner of a generic secret - not useful for contracts #[pallet::storage] @@ -86,17 +83,17 @@ pub mod pallet { impl Pallet { /// write a metadata to the secret registry and assign a secret_id - #[pallet::weight(::WeightInfo::register_secret())] + #[pallet::weight(::WeightInfo::register_secret())] pub fn register_secret( origin: OriginFor, metadata: Vec ) -> DispatchResult { - let who = ensure_signed(origin)?; - ensure!(metadata.len() == T::IPFSCIDLength::get() as usize, Error::::MetadataNotValid); - + let who = ensure_signed(origin)?; let id = >::get(); - >::insert(&id, metadata); + let bounded_metadata = BoundedVec::::try_from(metadata) + .map_err(|_| Error::::MetadataNotValid)?; + >::insert(&id, &bounded_metadata); >::insert(&id, who); >::set(id.saturating_add(1)); Self::deposit_event(Event::::SecretRegistered(id)); @@ -105,7 +102,7 @@ pub mod pallet { } /// nominate an operator to a secret - #[pallet::weight(::WeightInfo::nominate_member())] + #[pallet::weight(::WeightInfo::nominate_member())] pub fn nominate_member( origin: OriginFor, secret_id: SecretId, @@ -121,7 +118,7 @@ pub mod pallet { } /// remove an operator to a secret - #[pallet::weight(::WeightInfo::remove_member())] + #[pallet::weight(::WeightInfo::remove_member())] pub fn remove_member( origin: OriginFor, secret_id: SecretId, @@ -137,25 +134,26 @@ pub mod pallet { } /// update the metadata of a secret - #[pallet::weight(::WeightInfo::update_metadata())] + #[pallet::weight(::WeightInfo::update_metadata())] pub fn update_metadata( origin: OriginFor, secret_id: SecretId, metadata: Vec ) -> DispatchResult { - let who = ensure_signed(origin)?; - ensure!(metadata.len() == T::IPFSCIDLength::get() as usize, Error::::MetadataNotValid); + let who = ensure_signed(origin)?; ensure!(Self::authorize_access(who, secret_id) == true, Error::::AccessDenied); + let bounded_metadata = BoundedVec::::try_from(metadata) + .map_err(|_| Error::::MetadataNotValid)?; // so far, it is garenteed the secret_id is valid - >::mutate(&secret_id, |meta| *meta = Some(metadata)); + >::mutate(&secret_id, |meta| *meta = Some(bounded_metadata)); Self::deposit_event(Event::::SecretUpdated(secret_id)); Ok(()) } /// destroy a secret and all its records - #[pallet::weight(::WeightInfo::burn_secret())] + #[pallet::weight(::WeightInfo::burn_secret())] pub fn burn_secret( origin: OriginFor, secret_id: SecretId, @@ -174,7 +172,7 @@ pub mod pallet { } /// (ROOT ONLY) forcefuly nominate an operator to a secret - #[pallet::weight(::WeightInfo::force_nominate_member())] + #[pallet::weight(::WeightInfo::force_nominate_member())] pub fn force_nominate_member( origin: OriginFor, secret_id: SecretId, @@ -190,7 +188,7 @@ pub mod pallet { } /// (ROOT ONLY) forcefuly remove an operator to a secret - #[pallet::weight(::WeightInfo::force_remove_member())] + #[pallet::weight(::WeightInfo::force_remove_member())] pub fn force_remove_member( origin: OriginFor, secret_id: SecretId, @@ -205,7 +203,7 @@ pub mod pallet { } /// (ROOT ONLY) forcefuly change owner of a secret - #[pallet::weight(::WeightInfo::force_change_owner())] + #[pallet::weight(::WeightInfo::force_change_owner())] pub fn force_change_owner( origin: OriginFor, secret_id: SecretId, diff --git a/crates/skw-blockchain-pallets/pallet-secrets/src/mock.rs b/crates/skw-blockchain-pallets/pallet-secrets/src/mock.rs index 28f739d..7f83da4 100644 --- a/crates/skw-blockchain-pallets/pallet-secrets/src/mock.rs +++ b/crates/skw-blockchain-pallets/pallet-secrets/src/mock.rs @@ -1,6 +1,6 @@ -#![cfg(test)] use crate as pallet_secrets; -use frame_support::parameter_types; + +use frame_support::traits::{ConstU16, ConstU32, ConstU64}; use frame_system as system; use sp_core::H256; use sp_runtime::{ @@ -23,11 +23,6 @@ frame_support::construct_runtime!( } ); -parameter_types! { - pub const BlockHashCount: u64 = 250; - pub const SS58Prefix: u8 = 42; -} - impl system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); @@ -43,26 +38,22 @@ impl system::Config for Test { type Lookup = IdentityLookup; type Header = Header; type Event = Event; - type BlockHashCount = BlockHashCount; + type BlockHashCount = ConstU64<250>; type Version = (); type PalletInfo = PalletInfo; type AccountData = (); type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); - type SS58Prefix = SS58Prefix; + type SS58Prefix = ConstU16<42>; type OnSetCode = (); -} - -parameter_types! { - pub const IPFSCIDLength: u32 = 46; - pub const MaxActiveShards: u64 = 0; + type MaxConsumers = frame_support::traits::ConstU32<16>; } impl pallet_secrets::Config for Test { - type Event = Event; - type IPFSCIDLength = IPFSCIDLength; type WeightInfo = (); + type Event = Event; + type IPFSCIDLength = ConstU32<46>; } // Build genesis storage according to the mock runtime. diff --git a/crates/skw-blockchain-pallets/pallet-secrets/src/weights.rs b/crates/skw-blockchain-pallets/pallet-secrets/src/weights.rs index cd78b0c..569b2ed 100644 --- a/crates/skw-blockchain-pallets/pallet-secrets/src/weights.rs +++ b/crates/skw-blockchain-pallets/pallet-secrets/src/weights.rs @@ -6,22 +6,31 @@ //! Autogenerated weights for pallet_secrets //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-04-07, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("skw_alpha"), DB CACHE: 128 +//! DATE: 2022-05-30, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// /home/songzhou28/skyekiwi-network/target/release/skyekiwi-node +// /Users/songzhou/Desktop/skyekiwi-network/target/release/skyekiwi-node // benchmark -// --chain=skw_alpha -// --steps=50 -// --repeat=20 -// --pallet=pallet_secrets -// --extrinsic=* -// --execution=wasm -// --wasm-execution=compiled -// --heap-pages=4096 -// --output=/home/songzhou28/skyekiwi-network/crates/skw-blockchain-pallets/pallet-secrets/src/weights.rs -// --template=/home/songzhou28/skyekiwi-network/misc/frame-weight-template.hbs +// pallet +// --steps +// 50 +// --repeat +// 20 +// --pallet +// pallet_secrets +// --extrinsic +// * +// --execution +// wasm +// --wasm-execution +// compiled +// --heap-pages +// 4096 +// --output +// /Users/songzhou/Desktop/skyekiwi-network/crates/skw-blockchain-pallets/pallet-secrets/src/weights.rs +// --template +// /Users/songzhou/Desktop/skyekiwi-network/misc/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -49,38 +58,38 @@ impl WeightInfo for SubstrateWeight { // Storage: Secrets Metadata (r:0 w:1) // Storage: Secrets Owner (r:0 w:1) fn register_secret() -> Weight { - (20_823_000 as Weight) + (10_000_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } // Storage: Secrets Owner (r:1 w:0) // Storage: Secrets Operator (r:0 w:1) fn nominate_member() -> Weight { - (22_337_000 as Weight) + (11_000_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } // Storage: Secrets Owner (r:1 w:0) // Storage: Secrets Operator (r:1 w:1) fn remove_member() -> Weight { - (24_289_000 as Weight) + (13_000_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } // Storage: Secrets Operator (r:0 w:1) fn force_nominate_member() -> Weight { - (17_179_000 as Weight) + (8_000_000 as Weight) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } // Storage: Secrets Operator (r:1 w:1) fn force_remove_member() -> Weight { - (20_049_000 as Weight) + (10_000_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } // Storage: Secrets Owner (r:1 w:1) fn force_change_owner() -> Weight { - (6_581_000 as Weight) + (3_000_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } @@ -88,14 +97,14 @@ impl WeightInfo for SubstrateWeight { // Storage: Secrets Owner (r:1 w:0) // Storage: Secrets Metadata (r:1 w:1) fn update_metadata() -> Weight { - (27_599_000 as Weight) + (14_000_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } // Storage: Secrets Owner (r:1 w:1) // Storage: Secrets Metadata (r:1 w:1) fn burn_secret() -> Weight { - (31_393_000 as Weight) + (15_000_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } @@ -107,38 +116,38 @@ impl WeightInfo for () { // Storage: Secrets Metadata (r:0 w:1) // Storage: Secrets Owner (r:0 w:1) fn register_secret() -> Weight { - (20_823_000 as Weight) + (10_000_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(3 as Weight)) } // Storage: Secrets Owner (r:1 w:0) // Storage: Secrets Operator (r:0 w:1) fn nominate_member() -> Weight { - (22_337_000 as Weight) + (11_000_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } // Storage: Secrets Owner (r:1 w:0) // Storage: Secrets Operator (r:1 w:1) fn remove_member() -> Weight { - (24_289_000 as Weight) + (13_000_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } // Storage: Secrets Operator (r:0 w:1) fn force_nominate_member() -> Weight { - (17_179_000 as Weight) + (8_000_000 as Weight) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } // Storage: Secrets Operator (r:1 w:1) fn force_remove_member() -> Weight { - (20_049_000 as Weight) + (10_000_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } // Storage: Secrets Owner (r:1 w:1) fn force_change_owner() -> Weight { - (6_581_000 as Weight) + (3_000_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } @@ -146,14 +155,14 @@ impl WeightInfo for () { // Storage: Secrets Owner (r:1 w:0) // Storage: Secrets Metadata (r:1 w:1) fn update_metadata() -> Weight { - (27_599_000 as Weight) + (14_000_000 as Weight) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } // Storage: Secrets Owner (r:1 w:1) // Storage: Secrets Metadata (r:1 w:1) fn burn_secret() -> Weight { - (31_393_000 as Weight) + (15_000_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } diff --git a/crates/skw-blockchain-pallets/primitives/Cargo.toml b/crates/skw-blockchain-pallets/primitives/Cargo.toml index 23632ca..5cca47e 100644 --- a/crates/skw-blockchain-pallets/primitives/Cargo.toml +++ b/crates/skw-blockchain-pallets/primitives/Cargo.toml @@ -12,16 +12,13 @@ version = '3.0.0' [package.metadata.docs.rs] targets = ['x86_64-unknown-linux-gnu'] -[dev-dependencies] -test-env-log = "0.2.7" -log = "*" -env_logger="*" - [dependencies] -sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } borsh = { default-features = false, version = '0.9'} [features] default = ['std'] std = [ + 'sp-std/std', + 'borsh/std' ] diff --git a/crates/skw-blockchain-runtime/Cargo.toml b/crates/skw-blockchain-runtime/Cargo.toml index 70f5cfc..97ffcc5 100644 --- a/crates/skw-blockchain-runtime/Cargo.toml +++ b/crates/skw-blockchain-runtime/Cargo.toml @@ -1,8 +1,3 @@ -[build-dependencies.substrate-wasm-builder] -git = 'https://github.com/paritytech/substrate.git' -tag = 'monthly-2021-12' -version = '5.0.0-dev' - [package] authors = ['SkyeKiwi '] edition = '2021' @@ -22,53 +17,65 @@ pallet-s-contract = { default-features = false, path = '../skw-blockchain-pallet pallet-registry = { default-features = false, path = '../skw-blockchain-pallets/pallet-registry', version = '3.0.0' } pallet-parentchain = { default-features = false, path = '../skw-blockchain-pallets/pallet-parentchain', version = '3.0.0' } -codec = { default-features = false, features = ['derive'], package = 'parity-scale-codec', version = '2.0.0' } -frame-benchmarking = {default-features = false, git = 'https://github.com/paritytech/substrate.git', optional = true, tag = 'monthly-2021-12', version = '4.0.0-dev'} -frame-executive = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -frame-support = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -frame-system = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -frame-system-benchmarking = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev', optional = true} -frame-system-rpc-runtime-api = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -hex-literal = {optional = true, version = '0.3.1'} - -pallet-utility = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -pallet-aura = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -pallet-balances = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -pallet-grandpa = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -pallet-randomness-collective-flip = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -pallet-sudo = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -pallet-timestamp = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -pallet-transaction-payment = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -pallet-transaction-payment-rpc-runtime-api = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -scale-info = {default-features = false, features = ['derive'], version = '1.0'} -sp-api = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-block-builder = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-consensus-aura = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '0.10.0-dev'} -sp-core = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-inherents = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-offchain = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-runtime = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-session = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-std = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-transaction-pool = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} -sp-version = {default-features = false, git = 'https://github.com/paritytech/substrate.git', tag = 'monthly-2021-12', version = '4.0.0-dev'} +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } + +pallet-aura = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +pallet-grandpa = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +pallet-randomness-collective-flip = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +pallet-sudo = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +pallet-utility = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +pallet-treasury= { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +pallet-timestamp = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +pallet-transaction-payment-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } + +frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +frame-try-runtime = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22", optional = true } +frame-executive = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } + +frame-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22", optional = true } +frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22", optional = true } + +sp-api = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-block-builder = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22"} +sp-consensus-aura = { version = "0.10.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-core = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-inherents = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22"} +sp-offchain = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-runtime = { version = "6.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-session = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-std = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-transaction-pool = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } +sp-version = { version = "5.0.0", default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } + +hex-literal = { version = "0.3.4", optional = true } + +[build-dependencies] +substrate-wasm-builder = { version = "5.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.22" } [features] default = ['std'] runtime-benchmarks = [ - 'frame-benchmarking', + 'frame-benchmarking/runtime-benchmarks', 'frame-support/runtime-benchmarks', 'frame-system-benchmarking', 'frame-system/runtime-benchmarks', 'hex-literal', + 'pallet-balances/runtime-benchmarks', + 'pallet-grandpa/runtime-benchmarks', + 'pallet-timestamp/runtime-benchmarks', + # 'pallet-treasury/runtime-benchmarks', 'pallet-secrets/runtime-benchmarks', 'pallet-s-contract/runtime-benchmarks', 'pallet-registry/runtime-benchmarks', 'pallet-parentchain/runtime-benchmarks', - 'pallet-timestamp/runtime-benchmarks', 'sp-runtime/runtime-benchmarks', ] @@ -79,19 +86,22 @@ std = [ 'frame-support/std', 'frame-system-rpc-runtime-api/std', 'frame-system/std', + 'pallet-aura/std', 'pallet-balances/std', 'pallet-grandpa/std', 'pallet-randomness-collective-flip/std', 'pallet-sudo/std', + 'pallet-timestamp/std', + 'pallet-treasury/std', + 'pallet-transaction-payment-rpc-runtime-api/std', + 'pallet-transaction-payment/std', + 'pallet-secrets/std', 'pallet-s-contract/std', 'pallet-registry/std', 'pallet-parentchain/std', - 'pallet-timestamp/std', - 'pallet-transaction-payment-rpc-runtime-api/std', - 'pallet-transaction-payment/std', 'sp-api/std', 'sp-block-builder/std', 'sp-consensus-aura/std', @@ -104,3 +114,21 @@ std = [ 'sp-transaction-pool/std', 'sp-version/std', ] + +try-runtime = [ + "frame-executive/try-runtime", + "frame-try-runtime", + "frame-system/try-runtime", + "pallet-aura/try-runtime", + "pallet-balances/try-runtime", + "pallet-grandpa/try-runtime", + "pallet-randomness-collective-flip/try-runtime", + "pallet-sudo/try-runtime", + "pallet-timestamp/try-runtime", + "pallet-transaction-payment/try-runtime", + + "pallet-secrets/try-runtime", + "pallet-s-contract/try-runtime", + "pallet-registry/try-runtime", + "pallet-parentchain/try-runtime", +] \ No newline at end of file diff --git a/crates/skw-blockchain-runtime/src/lib.rs b/crates/skw-blockchain-runtime/src/lib.rs index f9aca6d..fe8195b 100644 --- a/crates/skw-blockchain-runtime/src/lib.rs +++ b/crates/skw-blockchain-runtime/src/lib.rs @@ -5,37 +5,42 @@ #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); -use sp_std::prelude::*; -use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; -use sp_runtime::{ - ApplyExtrinsicResult, generic, create_runtime_str, impl_opaque_keys, MultiSignature, - transaction_validity::{TransactionValidity, TransactionSource}, -}; -use sp_runtime::traits::{ - BlakeTwo256, Block as BlockT, AccountIdLookup, Verify, IdentifyAccount, NumberFor, +use pallet_grandpa::{ + fg_primitives, AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList, }; use sp_api::impl_runtime_apis; use sp_consensus_aura::sr25519::AuthorityId as AuraId; -use pallet_grandpa::{AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList}; -use pallet_grandpa::fg_primitives; -use sp_version::RuntimeVersion; +use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, + traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, IdentifyAccount, NumberFor, Verify}, + transaction_validity::{TransactionSource, TransactionValidity}, + ApplyExtrinsicResult, MultiSignature, +}; +use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; +use sp_version::RuntimeVersion; -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; -pub use pallet_timestamp::Call as TimestampCall; -pub use pallet_balances::Call as BalancesCall; -pub use sp_runtime::{Permill, Perbill}; +// A few exports that help ease life for downstream crates. pub use frame_support::{ - construct_runtime, parameter_types, StorageValue, - traits::{KeyOwnerProofSystem, Randomness}, + construct_runtime, parameter_types, + traits::{ + ConstU128, ConstU32, ConstU64, ConstU8, KeyOwnerProofSystem, Randomness, StorageInfo, + }, weights::{ - Weight, IdentityFee, constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND}, + IdentityFee, Weight, }, + StorageValue, }; +pub use frame_system::Call as SystemCall; +pub use pallet_balances::Call as BalancesCall; +pub use pallet_timestamp::Call as TimestampCall; use pallet_transaction_payment::CurrencyAdapter; +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; +pub use sp_runtime::{Perbill, Permill}; pub use pallet_secrets; pub use pallet_s_contract; @@ -101,6 +106,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, + state_version: 1, }; /// This determines the average expected block time that we are targeting. @@ -193,21 +199,18 @@ impl frame_system::Config for Runtime { type SS58Prefix = SS58Prefix; /// The set code logic, just the default since we're not a parachain. type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; } -impl pallet_randomness_collective_flip::Config for Runtime {} -parameter_types! { - pub const MaxAuthorities: u32 = 32; -} +impl pallet_randomness_collective_flip::Config for Runtime {} impl pallet_aura::Config for Runtime { type AuthorityId = AuraId; type DisabledValidators = (); - type MaxAuthorities = MaxAuthorities; + type MaxAuthorities = ConstU32<32>; } - impl pallet_grandpa::Config for Runtime { type Event = Event; type Call = Call; @@ -225,29 +228,19 @@ impl pallet_grandpa::Config for Runtime { type HandleEquivocation = (); type WeightInfo = (); - type MaxAuthorities = MaxAuthorities; -} - - -parameter_types! { - pub const MinimumPeriod: u64 = SLOT_DURATION / 2; + type MaxAuthorities = ConstU32<32>; } impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; - type MinimumPeriod = MinimumPeriod; + type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; type WeightInfo = (); } -parameter_types! { - pub const ExistentialDeposit: u128 = 500; - pub const MaxLocks: u32 = 50; -} - impl pallet_balances::Config for Runtime { - type MaxLocks = MaxLocks; + type MaxLocks = ConstU32<50>; type MaxReserves = (); type ReserveIdentifier = [u8; 8]; /// The type for recording an account's balance. @@ -255,21 +248,16 @@ impl pallet_balances::Config for Runtime { /// The ubiquitous event type. type Event = Event; type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; + type ExistentialDeposit = ConstU128<500>; type AccountStore = System; type WeightInfo = pallet_balances::weights::SubstrateWeight; } -parameter_types! { - pub const TransactionByteFee: Balance = 1; - pub OperationalFeeMultiplier: u8 = 5; -} - impl pallet_transaction_payment::Config for Runtime { type OnChargeTransaction = CurrencyAdapter; - type TransactionByteFee = TransactionByteFee; - type OperationalFeeMultiplier = OperationalFeeMultiplier; + type OperationalFeeMultiplier = ConstU8<5>; type WeightToFee = IdentityFee; + type LengthToFee = IdentityFee; type FeeMultiplierUpdate = (); } @@ -285,56 +273,35 @@ impl pallet_utility::Config for Runtime { type WeightInfo = (); } -parameter_types! { - pub const IPFSCIDLength: u32 = 46; - pub const MaxActiveShards: u64 = 0; -} - -impl pallet_secrets::Config for Runtime { +impl pallet_registry::Config for Runtime { type WeightInfo = (); type Event = Event; - type IPFSCIDLength = IPFSCIDLength; + type RegistrationDuration = ConstU32<100_000>; + type MaxActiveShards = ConstU32<1_000>; + type MaxSecretKeepers = ConstU32<5_000>; } -parameter_types! { - pub const MaxCallLength: u32 = 100_000; - pub const MaxOutputLength: u32 = 500_000; - pub const MinContractNameLength: u32 = 1; - pub const MaxContractNameLength: u32 = 32; -} - -impl pallet_s_contract::Config for Runtime { +impl pallet_parentchain::Config for Runtime { type WeightInfo = (); type Event = Event; - type MaxCallLength = MaxCallLength; - type MinContractNameLength = MinContractNameLength; - type MaxContractNameLength = MaxContractNameLength; + type DelayThreshold = ConstU32<1_000>; + type MaxOutcomePerSubmission = ConstU32<1_000>; + type MaxSizePerOutcome = ConstU32<100_000>; } -parameter_types! { - pub const RegistrationDuration: u32 = 1_000_000_000; -} - -impl pallet_registry::Config for Runtime { +impl pallet_secrets::Config for Runtime { type WeightInfo = (); type Event = Event; - type RegistrationDuration = RegistrationDuration; - type MaxActiveShards = MaxActiveShards; -} - - -parameter_types! { - pub const DelayThreshold: u32 = 5_000; - pub const MaxOutcomePerSubmission: u64 = 10_000; - pub const MaxSizePerOutcome: u64 = 500_000; + type IPFSCIDLength = ConstU32<46>; } -impl pallet_parentchain::Config for Runtime { +impl pallet_s_contract::Config for Runtime { type WeightInfo = (); type Event = Event; - type DelayThreshold = DelayThreshold; - type MaxOutcomePerSubmission = MaxOutcomePerSubmission; - type MaxSizePerOutcome = MaxSizePerOutcome; + type MaxCallLength = ConstU32<100_1000>; + type MinContractNameLength = ConstU32<1>; + type MaxContractNameLength = ConstU32<32>; + type MaxCallPerBlock = ConstU32<1_000>; } // Create the runtime by composing the FRAME pallets that were previously configured. @@ -369,16 +336,19 @@ pub type Header = generic::Header; pub type Block = generic::Block; /// The SignedExtension to the basic transaction logic. pub type SignedExtra = ( + frame_system::CheckNonZeroSender, frame_system::CheckSpecVersion, frame_system::CheckTxVersion, frame_system::CheckGenesis, frame_system::CheckEra, frame_system::CheckNonce, frame_system::CheckWeight, - pallet_transaction_payment::ChargeTransactionPayment + pallet_transaction_payment::ChargeTransactionPayment, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +/// The payload being signed in transactions. +pub type SignedPayload = generic::SignedPayload; /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, @@ -388,6 +358,24 @@ pub type Executive = frame_executive::Executive< AllPalletsWithSystem, >; +#[cfg(feature = "runtime-benchmarks")] +#[macro_use] +extern crate frame_benchmarking; + +#[cfg(feature = "runtime-benchmarks")] +mod benches { + define_benchmarks!( + [frame_benchmarking, BaselineBench::] + [frame_system, SystemBench::] + [pallet_balances, Balances] + [pallet_timestamp, Timestamp] + [pallet_s_contract, SContract] + [pallet_secrets, Secrets] + [pallet_registry, Registry] + [pallet_parentchain, Parentchain] + ); +} + impl_runtime_apis! { impl sp_api::Core for Runtime { fn version() -> RuntimeVersion { @@ -519,39 +507,35 @@ impl_runtime_apis! { } } -#[cfg(feature = "runtime-benchmarks")] + #[cfg(feature = "runtime-benchmarks")] impl frame_benchmarking::Benchmark for Runtime { fn benchmark_metadata(extra: bool) -> ( Vec, Vec, ) { - use frame_benchmarking::{list_benchmark, Benchmarking, BenchmarkList}; + use frame_benchmarking::{baseline, Benchmarking, BenchmarkList}; use frame_support::traits::StorageInfoTrait; use frame_system_benchmarking::Pallet as SystemBench; + use baseline::Pallet as BaselineBench; let mut list = Vec::::new(); - - list_benchmark!(list, extra, frame_system, SystemBench::); - list_benchmark!(list, extra, pallet_balances, Balances); - list_benchmark!(list, extra, pallet_timestamp, Timestamp); - - list_benchmark!(list, extra, pallet_secrets, Secrets); - list_benchmark!(list, extra, pallet_s_contract, SContract); - list_benchmark!(list, extra, pallet_parentchain, Parentchain); - list_benchmark!(list, extra, pallet_registry, Registry); + list_benchmarks!(list, extra); let storage_info = AllPalletsWithSystem::storage_info(); - return (list, storage_info) + (list, storage_info) } fn dispatch_benchmark( config: frame_benchmarking::BenchmarkConfig ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark, TrackedStorageKey}; + use frame_benchmarking::{baseline, Benchmarking, BenchmarkBatch, TrackedStorageKey}; use frame_system_benchmarking::Pallet as SystemBench; + use baseline::Pallet as BaselineBench; + impl frame_system_benchmarking::Config for Runtime {} + impl baseline::Config for Runtime {} let whitelist: Vec = vec![ // Block Number @@ -568,19 +552,33 @@ impl_runtime_apis! { let mut batches = Vec::::new(); let params = (&config, &whitelist); + add_benchmarks!(params, batches); - add_benchmark!(params, batches, frame_system, SystemBench::); - add_benchmark!(params, batches, pallet_balances, Balances); - add_benchmark!(params, batches, pallet_timestamp, Timestamp); + // add_benchmark!(params, batches, frame_system, SystemBench::); + // add_benchmark!(params, batches, pallet_balances, Balances); + // add_benchmark!(params, batches, pallet_timestamp, Timestamp); - add_benchmark!(params, batches, pallet_secrets, Secrets); - add_benchmark!(params, batches, pallet_s_contract, SContract); - add_benchmark!(params, batches, pallet_parentchain, Parentchain); - add_benchmark!(params, batches, pallet_registry, Registry); + // add_benchmark!(params, batches, pallet_secrets, Secrets); + // add_benchmark!(params, batches, pallet_s_contract, SContract); + // add_benchmark!(params, batches, pallet_parentchain, Parentchain); + // add_benchmark!(params, batches, pallet_registry, Registry); - - if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } Ok(batches) } } + + #[cfg(feature = "try-runtime")] + impl frame_try_runtime::TryRuntime for Runtime { + fn on_runtime_upgrade() -> (Weight, Weight) { + // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to + // have a backtrace here. If any of the pre/post migration checks fail, we shall stop + // right here and right now. + let weight = Executive::try_runtime_upgrade().unwrap(); + (weight, BlockWeights::get().max_block) + } + + fn execute_block_no_check(block: Block) -> Weight { + Executive::execute_block_no_check(block) + } + } } diff --git a/crates/skw-vm-engine-cli/Cargo.toml b/crates/skw-vm-engine-cli/Cargo.toml index 078c3fb..dcf969a 100644 --- a/crates/skw-vm-engine-cli/Cargo.toml +++ b/crates/skw-vm-engine-cli/Cargo.toml @@ -14,8 +14,7 @@ description = """A command line wrapper around `skw-vm-engine.`""" [dependencies] serde = { version = "1", features = ["derive"] } serde_json = "1" -clap = "=3.0.0-beta.2" -clap_derive = "=3.0.0-beta.2" +clap = { version = "3.1.6", features = ["derive"] } base64 = "0.13" strum = "0.20" num-rational = "0.3" diff --git a/crates/skw-vm-interface/Cargo.toml b/crates/skw-vm-interface/Cargo.toml index 67f2afb..ea3c179 100644 --- a/crates/skw-vm-interface/Cargo.toml +++ b/crates/skw-vm-interface/Cargo.toml @@ -29,8 +29,7 @@ borsh = { version = "0.9", features = ["rc"] } serde = { version = "1", features = ["derive"] } serde_json = "1" -clap = "=3.0.0-beta.2" -clap_derive = "=3.0.0-beta.2" +clap = { version = "3.1.6", features = ["derive"] } tracing-span-tree = "0.1" [dev-dependencies] diff --git a/crates/skw-vm-patch/Cargo.toml b/crates/skw-vm-patch/Cargo.toml index 04157a6..2aa6c45 100644 --- a/crates/skw-vm-patch/Cargo.toml +++ b/crates/skw-vm-patch/Cargo.toml @@ -13,6 +13,5 @@ Patch a series of state to the original state file [dependencies] skw-myers-diff = { path = "../skw-myers-diff" } -clap = "=3.0.0-beta.2" -clap_derive = "=3.0.0-beta.2" +clap = { version = "3.1.6", features = ["derive"] } bs58 = "0.4.0" diff --git a/rust-toolchain b/rust-toolchain index 2e62589..fa7908c 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -nightly-2021-11-17 +nightly-2022-05-30 diff --git a/skw-tools-scripts/generate-weight.cjs b/skw-tools-scripts/generate-weight.cjs index 17eb2f1..711f25e 100644 --- a/skw-tools-scripts/generate-weight.cjs +++ b/skw-tools-scripts/generate-weight.cjs @@ -11,53 +11,49 @@ function generateBenchmark() { const palletRootFolder = path.join(__dirname, "../crates/skw-blockchain-pallets"); const weightTemplate = path.join(__dirname, "../misc/frame-weight-template.hbs"); - execSync(`${node} benchmark \ - --chain=skw_alpha \ - --steps=50 \ - --repeat=20 \ - --pallet=pallet_parentchain \ - --extrinsic='*' \ - --execution=wasm \ - --wasm-execution=compiled \ - --heap-pages=4096 \ - --output=${palletRootFolder}/pallet-parentchain/src/weights.rs \ - --template=${weightTemplate}`); - - execSync(`${node} benchmark \ - --chain=skw_alpha \ - --steps=50 \ - --repeat=20 \ - --pallet=pallet_registry \ - --extrinsic='*' \ - --execution=wasm \ - --wasm-execution=compiled \ - --heap-pages=4096 \ - --output=${palletRootFolder}/pallet-registry/src/weights.rs \ - --template=${weightTemplate}`); - - execSync(`${node} benchmark \ - --chain=skw_alpha \ - --steps=50 \ - --repeat=20 \ - --pallet=pallet_secrets \ - --extrinsic='*' \ - --execution=wasm \ - --wasm-execution=compiled \ - --heap-pages=4096 \ - --output=${palletRootFolder}/pallet-secrets/src/weights.rs \ - --template=${weightTemplate}`); - - execSync(`${node} benchmark \ - --chain=skw_alpha \ - --steps=50 \ - --repeat=20 \ - --pallet=pallet_s_contract \ - --extrinsic='*' \ - --execution=wasm \ - --wasm-execution=compiled \ - --heap-pages=4096 \ - --output=${palletRootFolder}/pallet-s-contract/src/weights.rs \ - --template=${weightTemplate}`); + execSync(`${node} benchmark pallet \ + --steps 50 \ + --repeat 20 \ + --pallet pallet_parentchain \ + --extrinsic '*' \ + --execution wasm \ + --wasm-execution compiled \ + --heap-pages 4096 \ + --output ${palletRootFolder}/pallet-parentchain/src/weights.rs \ + --template ${weightTemplate}`); + + execSync(`${node} benchmark pallet\ + --steps 50 \ + --repeat 20 \ + --pallet pallet_registry \ + --extrinsic '*' \ + --execution wasm \ + --wasm-execution compiled \ + --heap-pages 4096 \ + --output ${palletRootFolder}/pallet-registry/src/weights.rs \ + --template ${weightTemplate}`); + + execSync(`${node} benchmark pallet\ + --steps 50 \ + --repeat 20 \ + --pallet pallet_secrets \ + --extrinsic '*' \ + --execution wasm \ + --wasm-execution compiled \ + --heap-pages 4096 \ + --output ${palletRootFolder}/pallet-secrets/src/weights.rs \ + --template ${weightTemplate}`); + + execSync(`${node} benchmark pallet\ + --steps 50 \ + --repeat 20 \ + --pallet pallet_s_contract \ + --extrinsic '*' \ + --execution wasm \ + --wasm-execution compiled \ + --heap-pages 4096 \ + --output ${palletRootFolder}/pallet-s-contract/src/weights.rs \ + --template ${weightTemplate}`); } generateBenchmark()